Merge branch 'develop' into features/JAL-1956_featureStyles
authorgmungoc <g.m.carstairs@dundee.ac.uk>
Tue, 10 May 2016 10:17:19 +0000 (11:17 +0100)
committergmungoc <g.m.carstairs@dundee.ac.uk>
Tue, 10 May 2016 10:17:19 +0000 (11:17 +0100)
Conflicts:
src/jalview/appletgui/FeatureRenderer.java
src/jalview/appletgui/FeatureSettings.java
src/jalview/gui/AnnotationExporter.java
src/jalview/gui/FeatureSettings.java
src/jalview/gui/Jalview2XML.java
src/jalview/io/FeaturesFile.java
src/jalview/io/SequenceAnnotationReport.java
src/jalview/schemes/FeatureColourScheme.java
src/jalview/viewmodel/seqfeatures/FeatureRendererModel.java
src/jalview/ws/jws2/AADisorderClient.java
test/jalview/io/FeaturesFileTest.java

329 files changed:
.classpath
.settings/org.eclipse.jdt.core.prefs
THIRDPARTYLIBS
appletlib/plugin.jar [deleted file]
build.xml
doc/AddingGroovySupport.html
examples/exampleFeatures.txt
examples/groovy/featureCounter.groovy [new file with mode: 0644]
examples/groovy/multipleFeatureAnnotations.groovy [new file with mode: 0644]
examples/testdata/1qcf.cif [new file with mode: 0644]
examples/testdata/exonerateoutput.gff
examples/testdata/simpleGff3.gff [new file with mode: 0644]
examples/testdata/simplegff3.gff [deleted file]
examples/testdata/test.cif [new file with mode: 0644]
examples/testdata/test_fts_data_columns.conf [new file with mode: 0644]
help/helpTOC.xml
help/html/calculations/quality.html
help/html/calculations/scorematrices.html
help/html/features/featuresFormat.html
help/html/features/featuresettings.html
help/html/features/groovy.html
help/html/menus/alwcalculate.html
help/html/menus/desktopMenu.html
help/html/releases.html
lib/biojava-core-4.1.0.jar [new file with mode: 0644]
lib/biojava-ontology-4.1.0.jar [new file with mode: 0644]
lib/castor-1.1-cycle-xml.jar
lib/groovy-all-1.8.2.jar [deleted file]
lib/groovy-all-2.4.6-indy.jar [new file with mode: 0644]
lib/htsjdk-1.133.jar [new file with mode: 0644]
lib/min-jabaws-client-2.1.0.jar
lib/quaqua-filechooser-only-8.0.jar
lib/xercesImpl.jar [changed mode: 0755->0644]
resources/fts/pdb_data_columns.txt [new file with mode: 0644]
resources/fts/uniprot_data_columns.txt [new file with mode: 0644]
resources/images/blank_16x16_placeholder.png [new file with mode: 0644]
resources/lang/Messages.properties
resources/lang/Messages_es.properties
resources/so-xp-simple.obo.zip [new file with mode: 0644]
src/MCview/AppletPDBCanvas.java
src/MCview/PDBCanvas.java
src/MCview/PDBChain.java
src/MCview/PDBViewer.java
src/MCview/PDBfile.java
src/MCview/Residue.java
src/ext/edu/ucsf/rbvi/strucviz2/ChimUtils.java
src/ext/edu/ucsf/rbvi/strucviz2/ChimeraManager.java
src/ext/edu/ucsf/rbvi/strucviz2/ChimeraModel.java
src/jalview/analysis/AAFrequency.java
src/jalview/analysis/AlignmentSorter.java
src/jalview/analysis/AlignmentUtils.java
src/jalview/analysis/CrossRef.java
src/jalview/analysis/Dna.java
src/jalview/analysis/SeqsetUtils.java
src/jalview/analysis/SequenceIdMatcher.java
src/jalview/analysis/scoremodels/FeatureScoreModel.java
src/jalview/api/AlignCalcWorkerI.java
src/jalview/api/AlignViewControllerI.java
src/jalview/api/AlignViewportI.java
src/jalview/api/DBRefEntryI.java
src/jalview/api/FeatureColourI.java
src/jalview/api/FeatureRenderer.java
src/jalview/api/FeatureSettingsI.java [deleted file]
src/jalview/api/FeatureSettingsModelI.java
src/jalview/api/FeaturesDisplayedI.java
src/jalview/api/FeaturesSourceI.java [new file with mode: 0644]
src/jalview/appletgui/AlignFrame.java
src/jalview/appletgui/AlignViewport.java
src/jalview/appletgui/AnnotationPanel.java
src/jalview/appletgui/AppletJmol.java
src/jalview/appletgui/CutAndPasteTransfer.java
src/jalview/appletgui/FeatureRenderer.java
src/jalview/appletgui/FeatureSettings.java
src/jalview/appletgui/IdCanvas.java
src/jalview/appletgui/ScalePanel.java
src/jalview/appletgui/SeqCanvas.java
src/jalview/bin/Cache.java
src/jalview/bin/Jalview.java
src/jalview/bin/JalviewLite.java
src/jalview/bin/JalviewLiteURLRetrieve.java
src/jalview/controller/AlignViewController.java
src/jalview/datamodel/AlignedCodon.java
src/jalview/datamodel/AlignedCodonFrame.java
src/jalview/datamodel/Alignment.java
src/jalview/datamodel/AlignmentI.java
src/jalview/datamodel/ColumnSelection.java
src/jalview/datamodel/DBRefEntry.java
src/jalview/datamodel/DBRefSource.java
src/jalview/datamodel/Mapping.java
src/jalview/datamodel/MappingType.java [new file with mode: 0644]
src/jalview/datamodel/PDBEntry.java
src/jalview/datamodel/SearchResults.java
src/jalview/datamodel/SeqCigar.java
src/jalview/datamodel/Sequence.java
src/jalview/datamodel/SequenceDummy.java
src/jalview/datamodel/SequenceFeature.java
src/jalview/datamodel/SequenceI.java
src/jalview/datamodel/xdb/embl/EmblEntry.java
src/jalview/datamodel/xdb/embl/EmblFeatureLocations.java
src/jalview/datamodel/xdb/embl/EmblFile.java
src/jalview/ext/ensembl/EnsemblCdna.java [new file with mode: 0644]
src/jalview/ext/ensembl/EnsemblCds.java [new file with mode: 0644]
src/jalview/ext/ensembl/EnsemblFeatures.java [new file with mode: 0644]
src/jalview/ext/ensembl/EnsemblGene.java [new file with mode: 0644]
src/jalview/ext/ensembl/EnsemblGenome.java [new file with mode: 0644]
src/jalview/ext/ensembl/EnsemblGenomes.java [new file with mode: 0644]
src/jalview/ext/ensembl/EnsemblLookup.java [new file with mode: 0644]
src/jalview/ext/ensembl/EnsemblProtein.java [new file with mode: 0644]
src/jalview/ext/ensembl/EnsemblRestClient.java [new file with mode: 0644]
src/jalview/ext/ensembl/EnsemblSeqProxy.java [new file with mode: 0644]
src/jalview/ext/ensembl/EnsemblSequenceFetcher.java [new file with mode: 0644]
src/jalview/ext/ensembl/EnsemblSymbol.java [new file with mode: 0644]
src/jalview/ext/ensembl/EnsemblXref.java [new file with mode: 0644]
src/jalview/ext/ensembl/Species.java [new file with mode: 0644]
src/jalview/ext/htsjdk/HtsContigDb.java [new file with mode: 0644]
src/jalview/ext/jmol/JalviewJmolBinding.java
src/jalview/ext/jmol/JmolParser.java [moved from src/jalview/ext/jmol/PDBFileWithJmol.java with 56% similarity]
src/jalview/ext/rbvi/chimera/JalviewChimeraBinding.java
src/jalview/ext/so/SequenceOntology.java [new file with mode: 0644]
src/jalview/fts/api/FTSData.java [new file with mode: 0644]
src/jalview/fts/api/FTSDataColumnI.java [new file with mode: 0644]
src/jalview/fts/api/FTSRestClientI.java [new file with mode: 0644]
src/jalview/fts/api/GFTSPanelI.java [new file with mode: 0644]
src/jalview/fts/core/FTSDataColumnPreferences.java [new file with mode: 0644]
src/jalview/fts/core/FTSRestClient.java [new file with mode: 0644]
src/jalview/fts/core/FTSRestRequest.java [moved from src/jalview/ws/uimodel/PDBRestRequest.java with 70% similarity]
src/jalview/fts/core/FTSRestResponse.java [new file with mode: 0644]
src/jalview/fts/core/GFTSPanel.java [new file with mode: 0644]
src/jalview/fts/service/pdb/PDBFTSPanel.java [new file with mode: 0644]
src/jalview/fts/service/pdb/PDBFTSRestClient.java [new file with mode: 0644]
src/jalview/fts/service/uniprot/UniProtFTSRestClient.java [new file with mode: 0644]
src/jalview/fts/service/uniprot/UniprotFTSPanel.java [new file with mode: 0644]
src/jalview/gui/AlignFrame.java
src/jalview/gui/AlignViewport.java
src/jalview/gui/AnnotationExporter.java
src/jalview/gui/AnnotationLabels.java
src/jalview/gui/AnnotationPanel.java
src/jalview/gui/AssociatePdbFileWithSeq.java
src/jalview/gui/ChimeraViewFrame.java
src/jalview/gui/CutAndPasteHtmlTransfer.java
src/jalview/gui/CutAndPasteTransfer.java
src/jalview/gui/DasSourceBrowser.java
src/jalview/gui/Desktop.java
src/jalview/gui/FeatureRenderer.java
src/jalview/gui/FeatureSettings.java
src/jalview/gui/IdCanvas.java
src/jalview/gui/IdPanel.java
src/jalview/gui/JDatabaseTree.java
src/jalview/gui/Jalview2XML.java
src/jalview/gui/OptsAndParamsPage.java
src/jalview/gui/PDBSearchPanel.java [deleted file]
src/jalview/gui/PopupMenu.java
src/jalview/gui/Preferences.java
src/jalview/gui/ScalePanel.java
src/jalview/gui/SeqCanvas.java
src/jalview/gui/SeqPanel.java
src/jalview/gui/SequenceFetcher.java
src/jalview/gui/SplitFrame.java
src/jalview/gui/StructureChooser.java
src/jalview/gui/TreeCanvas.java
src/jalview/io/AlignFile.java
src/jalview/io/AppletFormatAdapter.java
src/jalview/io/FeaturesFile.java
src/jalview/io/FileLoader.java
src/jalview/io/FileParse.java
src/jalview/io/Gff3File.java [deleted file]
src/jalview/io/HtmlFile.java
src/jalview/io/IdentifyFile.java
src/jalview/io/JSONFile.java
src/jalview/io/PDBFeatureSettings.java [new file with mode: 0644]
src/jalview/io/SequenceAnnotationReport.java
src/jalview/io/StructureFile.java [new file with mode: 0644]
src/jalview/io/VamsasAppDatastore.java
src/jalview/io/gff/ExonerateHelper.java [new file with mode: 0644]
src/jalview/io/gff/Gff2Helper.java [new file with mode: 0644]
src/jalview/io/gff/Gff3Helper.java [new file with mode: 0644]
src/jalview/io/gff/GffConstants.java [new file with mode: 0644]
src/jalview/io/gff/GffHelperBase.java [new file with mode: 0644]
src/jalview/io/gff/GffHelperFactory.java [new file with mode: 0644]
src/jalview/io/gff/GffHelperI.java [new file with mode: 0644]
src/jalview/io/gff/InterProScanHelper.java [new file with mode: 0644]
src/jalview/io/gff/SequenceOntologyFactory.java [new file with mode: 0644]
src/jalview/io/gff/SequenceOntologyI.java [new file with mode: 0644]
src/jalview/io/gff/SequenceOntologyLite.java [new file with mode: 0644]
src/jalview/io/packed/JalviewDataset.java
src/jalview/io/packed/ParsePackedSet.java
src/jalview/io/vamsas/Sequencefeature.java
src/jalview/jbgui/GAlignFrame.java
src/jalview/jbgui/GPDBSearchPanel.java [deleted file]
src/jalview/jbgui/GPreferences.java
src/jalview/jbgui/GStructureChooser.java
src/jalview/jbgui/GStructureViewer.java
src/jalview/jbgui/PDBDocFieldPreferences.java [deleted file]
src/jalview/renderer/AnnotationRenderer.java
src/jalview/renderer/ScaleRenderer.java [new file with mode: 0644]
src/jalview/renderer/seqfeatures/FeatureRenderer.java
src/jalview/schemes/FeatureColour.java
src/jalview/schemes/FeatureColourScheme.java [deleted file]
src/jalview/schemes/FeatureSettingsAdapter.java [new file with mode: 0644]
src/jalview/schemes/GraduatedColor.java [deleted file]
src/jalview/schemes/ResidueProperties.java
src/jalview/schemes/UserColourScheme.java
src/jalview/structure/StructureSelectionManager.java
src/jalview/structure/StructureViewSettings.java [new file with mode: 0644]
src/jalview/structures/models/AAStructureBindingModel.java
src/jalview/util/ArrayUtils.java [new file with mode: 0644]
src/jalview/util/ColorUtils.java
src/jalview/util/Comparison.java
src/jalview/util/DBRefUtils.java
src/jalview/util/MapList.java
src/jalview/util/MappingUtils.java
src/jalview/util/StringUtils.java
src/jalview/viewmodel/AlignmentViewport.java
src/jalview/viewmodel/seqfeatures/FeatureRendererModel.java
src/jalview/viewmodel/seqfeatures/FeaturesDisplayed.java
src/jalview/workers/AlignCalcWorker.java
src/jalview/workers/AlignmentAnnotationFactory.java [new file with mode: 0644]
src/jalview/workers/AnnotationProviderI.java [new file with mode: 0644]
src/jalview/workers/AnnotationWorker.java [new file with mode: 0644]
src/jalview/workers/ColumnCounterWorker.java [new file with mode: 0644]
src/jalview/workers/ConsensusThread.java
src/jalview/workers/ConservationThread.java
src/jalview/workers/FeatureCounterI.java [new file with mode: 0644]
src/jalview/workers/StrucConsensusThread.java
src/jalview/ws/AWSThread.java
src/jalview/ws/DBRefFetcher.java
src/jalview/ws/SequenceFetcher.java
src/jalview/ws/dbsources/EmblCdsSource.java [moved from src/jalview/ws/dbsources/EmblCdsSouce.java with 89% similarity]
src/jalview/ws/dbsources/EmblSource.java
src/jalview/ws/dbsources/EmblXmlSource.java
src/jalview/ws/dbsources/GeneDbSource.java
src/jalview/ws/dbsources/PDBRestClient.java [deleted file]
src/jalview/ws/dbsources/Pdb.java
src/jalview/ws/dbsources/Pfam.java
src/jalview/ws/dbsources/PfamFull.java
src/jalview/ws/dbsources/PfamSeed.java
src/jalview/ws/dbsources/Rfam.java
src/jalview/ws/dbsources/RfamFull.java
src/jalview/ws/dbsources/RfamSeed.java
src/jalview/ws/dbsources/Uniprot.java
src/jalview/ws/dbsources/UniprotName.java [moved from src/jalview/ws/dbsources/UnprotName.java with 88% similarity]
src/jalview/ws/dbsources/Xfam.java
src/jalview/ws/ebi/EBIFetchClient.java
src/jalview/ws/jws1/JPredThread.java
src/jalview/ws/jws1/SeqSearchWSThread.java
src/jalview/ws/jws2/AADisorderClient.java
src/jalview/ws/jws2/JPred301Client.java
src/jalview/ws/jws2/RNAalifoldClient.java
src/jalview/ws/seqfetcher/ASequenceFetcher.java
src/jalview/ws/seqfetcher/DbSourceProxy.java
src/jalview/ws/seqfetcher/DbSourceProxyImpl.java
src/jalview/ws/sifts/SiftsClient.java
src/jalview/ws/uimodel/PDBRestResponse.java [deleted file]
test/MCview/PDBChainTest.java
test/MCview/PDBfileTest.java
test/jalview/analysis/AlignmentUtilsTests.java
test/jalview/analysis/DnaTest.java
test/jalview/analysis/SeqsetUtilsTest.java [new file with mode: 0644]
test/jalview/analysis/SequenceIdMatcherTest.java [new file with mode: 0644]
test/jalview/analysis/TestAlignSeq.java
test/jalview/analysis/scoremodels/FeatureScoreModelTest.java
test/jalview/datamodel/AlignedCodonFrameTest.java
test/jalview/datamodel/AlignmentTest.java
test/jalview/datamodel/ColumnSelectionTest.java
test/jalview/datamodel/MappingTest.java
test/jalview/datamodel/MappingTypeTest.java [new file with mode: 0644]
test/jalview/datamodel/SearchResultsTest.java
test/jalview/datamodel/SeqCigarTest.java
test/jalview/datamodel/SequenceDummyTest.java
test/jalview/datamodel/SequenceFeatureTest.java [new file with mode: 0644]
test/jalview/datamodel/SequenceTest.java
test/jalview/datamodel/xdb/embl/EmblEntryTest.java [new file with mode: 0644]
test/jalview/datamodel/xdb/embl/EmblFileTest.java
test/jalview/ext/ensembl/ENSG00000157764.gff [new file with mode: 0644]
test/jalview/ext/ensembl/EnsemblCdnaTest.java [new file with mode: 0644]
test/jalview/ext/ensembl/EnsemblCdsTest.java [new file with mode: 0644]
test/jalview/ext/ensembl/EnsemblGeneTest.java [new file with mode: 0644]
test/jalview/ext/ensembl/EnsemblGenomeTest.java [new file with mode: 0644]
test/jalview/ext/ensembl/EnsemblProteinTest.java [new file with mode: 0644]
test/jalview/ext/ensembl/EnsemblRestClientTest.java [new file with mode: 0644]
test/jalview/ext/ensembl/EnsemblSeqProxyAdapter.java [new file with mode: 0644]
test/jalview/ext/ensembl/EnsemblSeqProxyTest.java [new file with mode: 0644]
test/jalview/ext/ensembl/EnsemblXrefTest.java [new file with mode: 0644]
test/jalview/ext/htsjdk/TestHtsContigDb.java [new file with mode: 0644]
test/jalview/ext/htsjdk/pgmB.fasta [new file with mode: 0644]
test/jalview/ext/htsjdk/pgmB.fasta.fai [new file with mode: 0644]
test/jalview/ext/jmol/1xyz.pdb [new file with mode: 0644]
test/jalview/ext/jmol/JmolCommandsTest.java [new file with mode: 0644]
test/jalview/ext/jmol/JmolParserTest.java [moved from test/jalview/ext/jmol/PDBFileWithJmolTest.java with 91% similarity]
test/jalview/ext/so/SequenceOntologyTest.java [new file with mode: 0644]
test/jalview/fts/core/FTSRestClientTest.java [new file with mode: 0644]
test/jalview/fts/service/pdb/PDBFTSPanelTest.java [moved from test/jalview/gui/PDBSearchPanelTest.java with 79% similarity]
test/jalview/fts/service/pdb/PDBFTSRestClientTest.java [moved from test/jalview/ws/dbsources/PDBRestClientTest.java with 59% similarity]
test/jalview/gui/AlignFrameTest.java [new file with mode: 0644]
test/jalview/gui/AlignViewportTest.java
test/jalview/gui/StructureChooserTest.java
test/jalview/io/AnnotatedPDBFileInputTest.java
test/jalview/io/AnnotationFileIOTest.java
test/jalview/io/FeaturesFileTest.java
test/jalview/io/FileIOTester.java
test/jalview/io/Gff3tests.java [deleted file]
test/jalview/io/HtmlFileTest.java
test/jalview/io/IdentifyFileTest.java
test/jalview/io/SequenceAnnotationReportTest.java [new file with mode: 0644]
test/jalview/io/StockholmFileTest.java
test/jalview/io/gff/ExonerateHelperTest.java [new file with mode: 0644]
test/jalview/io/gff/Gff3HelperTest.java [new file with mode: 0644]
test/jalview/io/gff/GffHelperBaseTest.java [new file with mode: 0644]
test/jalview/io/gff/GffHelperFactoryTest.java [new file with mode: 0644]
test/jalview/io/gff/GffTests.java [new file with mode: 0644]
test/jalview/io/gff/InterProScanHelperTest.java [new file with mode: 0644]
test/jalview/schemes/FeatureColourTest.java
test/jalview/structure/Mapping.java
test/jalview/structure/StructureSelectionManagerTest.java
test/jalview/util/ArrayUtilsTest.java [new file with mode: 0644]
test/jalview/util/ColorUtilsTest.java
test/jalview/util/ComparisonTest.java
test/jalview/util/DBRefUtilsTest.java
test/jalview/util/MapListTest.java
test/jalview/util/MappingUtilsTest.java
test/jalview/util/StringUtilsTest.java
test/jalview/ws/SequenceFetcherTest.java [new file with mode: 0644]
test/jalview/ws/dbsources/UniprotTest.java
test/jalview/ws/dbsources/XfamFetcherTest.java [new file with mode: 0644]
test/jalview/ws/jabaws/DisorderAnnotExportImport.java
test/jalview/ws/jabaws/JalviewJabawsTestUtils.java
test/jalview/ws/seqfetcher/DbRefFetcherTest.java
test/jalview/ws/sifts/SiftsClientTest.java
utils/InstallAnywhere/Jalview.iap_xml

index 473d937..6583992 100644 (file)
@@ -39,7 +39,6 @@
        <classpathentry kind="lib" path="lib/jdas-1.0.4.jar"/>
        <classpathentry kind="lib" path="lib/spring-core-3.0.5.RELEASE.jar"/>
        <classpathentry kind="lib" path="lib/spring-web-3.0.5.RELEASE.jar"/>
-       <classpathentry kind="lib" path="lib/groovy-all-1.8.2.jar"/>
        <classpathentry kind="lib" path="lib/min-jabaws-client-2.1.0.jar" sourcepath="/clustengine"/>
        <classpathentry kind="lib" path="lib/json_simple-1.1.jar" sourcepath="/Users/jimp/Downloads/json_simple-1.1-all.zip"/>
        <classpathentry kind="lib" path="lib/slf4j-api-1.7.7.jar"/>
@@ -49,6 +48,7 @@
        <classpathentry kind="lib" path="lib/VARNAv3-93.jar"/>
        <classpathentry kind="lib" path="lib/jfreesvg-2.1.jar"/>
        <classpathentry kind="lib" path="lib/quaqua-filechooser-only-8.0.jar"/>
+       <classpathentry kind="lib" path="lib/htsjdk-1.133.jar"/>
        <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/plugin"/>
        <classpathentry kind="lib" path="lib/xml-apis.jar"/>
        <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
@@ -66,5 +66,8 @@
        <classpathentry kind="lib" path="lib/java-json.jar"/>
        <classpathentry kind="lib" path="lib/Jmol-14.2.14_2015.06.11.jar"/>
        <classpathentry kind="con" path="org.testng.TESTNG_CONTAINER"/>
+       <classpathentry kind="lib" path="lib/biojava-core-4.1.0.jar"/>
+       <classpathentry kind="lib" path="lib/biojava-ontology-4.1.0.jar"/>
+       <classpathentry kind="lib" path="lib/groovy-all-2.4.6-indy.jar"/>
        <classpathentry kind="output" path="classes"/>
 </classpath>
index 3f8ca28..8a5e7a7 100644 (file)
@@ -21,7 +21,7 @@ org.eclipse.jdt.core.formatter.alignment_for_assignment=0
 org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
 org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
 org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
-org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16
 org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
 org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
 org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
@@ -60,7 +60,7 @@ org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line
 org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line
 org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
 org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
-org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
 org.eclipse.jdt.core.formatter.comment.format_header=false
 org.eclipse.jdt.core.formatter.comment.format_html=true
 org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
index 3094939..caaa7f9 100644 (file)
@@ -21,6 +21,7 @@ commons-discovery.jar
 commons-logging-1.1.1.jar
 commons-logging.jar
 commons-net-3.3.jar
+groovy-all-2.4.6-indy.jar      APL 2.0 License - downloaded and extracted from https://dl.bintray.com/groovy/maven/apache-groovy-binary-2.4.6.zip
 httpclient-4.0.3.jar
 httpcore-4.0.1.jar
 httpmime-4.0.3.jar
@@ -45,6 +46,9 @@ jfreesvg-2.1.jar : GPL v3 licensed library from the JFree suite: http://www.jfre
 
 quaqua: v.8.0 (latest stable) by Randel S Hofer. LGPL and BSD Modified license: downloaded from http://www.randelshofer.ch/quaqua/ 
 
+lib/htsjdk-1.120-SNAPSHOT.jar: built from maven master at https://github.com/samtools/htsjdk MIT License to Broad Institute
+
+
 Additional dependencies
 
 examples/javascript/deployJava.js : http://java.com/js/deployJava.js
diff --git a/appletlib/plugin.jar b/appletlib/plugin.jar
deleted file mode 100644 (file)
index d19dcc5..0000000
Binary files a/appletlib/plugin.jar and /dev/null differ
index 43bab6f..57cd9d2 100755 (executable)
--- a/build.xml
+++ b/build.xml
         </information>
         <resources>
           <j2se version="${j2sev}" initial_heap_size="${inih}" max_heap_size="${maxh}" />
+          <jar main="true" href="jalview.jar"/>
           <fileset dir="${packageDir}">
-            <include name="jalview.jar" />
-          </fileset>
-          <fileset dir="${packageDir}">
+            <exclude name="jalview.jar" />
             <include name="*.jar" />
             <include name="*_*.jar" />
-            <exclude name="jalview.jar" />
             <exclude name="*jnilib.jar" />
           </fileset>
           <property name="jalview.version" value="${JALVIEW_VERSION}" />
 
 <target name="compileApplet" depends="init,clean">
   <mkdir dir="${outputDir}" />
-  <javac source="${javac.source}" target="${javac.target}" srcdir="${sourceDir}" destdir="${outputDir}" debug="${javac.debug}" classpathref="jalviewlite.deps" includes="jalview/appletgui/**" excludes="ext/**,gui/**,jbgui/**,MCview/**,org/**,vamsas/**,jalview/ext/rbvi/**,jalview/ext/paradise/**" />
+  <javac source="${javac.source}" target="${javac.target}" srcdir="${sourceDir}" destdir="${outputDir}" debug="${javac.debug}" classpathref="jalviewlite.deps" includes="jalview/appletgui/**" excludes="ext/**,gui/**,jbgui/**,MCview/**,org/**,vamsas/**,jalview/ext/rbvi/**,jalview/ext/paradise/**,jalview/ext/ensembl/**,jalview/ext/so" />
 </target>
 
 <target name="packageApplet" depends="compileApplet, buildPropertiesFile">
     <pathelement location="appletlib/${jsoup}" />
     <pathelement location="appletlib/${jsonSimple}" />
     <pathelement location="appletlib/${javaJson}" />
-    <pathelement location="appletlib/plugin.jar" />
+       <fileset dir="${java.home}/lib">
+        <include name="plugin.jar" />
+    </fileset>
   </path>
   <taskdef resource="proguard/ant/task.properties" classpath="utils/proguard.jar" />
 
index 41e34ce..e3e453f 100644 (file)
 </title>
 <body>
 <h1>
-Adding Groovy Support to Jalview
+Groovy Support in Jalview
 </h1>
 <p>
-There is currently no scripting language 
-extension within Jalview, in part because a 
-scripting API has not yet been developed.
-</p>
-<p>It is, however, really easy to embed scripting
-engines like groovy. If groovy is detected on the 
-classpath, a new menu entry on the Desktop's Tools 
-menu will open the GroovyShell.
+  <a href="http://www.groovy-lang.org">Groovy</a> has been bundled with the Jalview desktop since circa 2012. The program supports interactive execution of groovy scripts via the Groovy Console, and command line execution via the '-groovy' option. The main source for documentation about Groovy in Jalview is the <a href="http://www.jalview.org/help/html/features/groovy.html">online help pages</a>.
 </p>
 <p>Here are some scripts to get you started:</p>
 <ul><li>Getting the title, alignment and first sequence from the current alignFrame<br>
 <pre>
-def alf = Jalview.getAlignframes();
+def alf = Jalview.getAlignFrames();
 print alf[0].getTitle();
 def alignment = alf[0].viewport.alignment;
 def seq = alignment.getSequenceAt(0);
 </pre>
 </li>
 </ul>
-<h1>Getting Groovy...</h1>
-<p>
-You need the core groovy jars which include the GroovyShell. The easiest way of doing
-this is to add the groovy-all-*.jar to the lib directory whose path is given in the java.ext.dirs property.</p>
-<p>The is obtained from the <em>embedded</em> directory within the <a 
-href="http://dist.codehaus.org/groovy/distributions"/>groovy distribution</a>).
-</p>
 <h2>TODO</h2>
 <p>
 Using Java class methods from Groovy is straightforward, but currently, there isn't a set of easy to use methods for the jalview objects. A Jalview Scripting API needs to be developed to make this easier.</p>
index 0bb8b7e..2dc4b6d 100755 (executable)
@@ -1,23 +1,5 @@
-#-------------------------------------------------------------------------------
-# 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 <http://www.gnu.org/licenses/>.
-# The Jalview Authors are detailed in the 'AUTHORS' file.
-#-------------------------------------------------------------------------------
-ST-TURN-IIL    705b23
-GAMMA-TURN-CLASSIC     788763
+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
 BETA-TURN-IR   9a6a94
 BETA-TURN-IL   d6a6ca
 BETA-BULGE     1dc451
diff --git a/examples/groovy/featureCounter.groovy b/examples/groovy/featureCounter.groovy
new file mode 100644 (file)
index 0000000..42d3187
--- /dev/null
@@ -0,0 +1,90 @@
+import jalview.workers.FeatureCounterI;
+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.
+ */
+
+/*
+ * A closure that returns true for any Charged residue
+ */
+def isCharged = { residue ->
+    switch(residue) {
+        case ['D', 'd', 'E', 'e', 'H', 'h', 'K', 'k', 'R', 'r']:
+            return true
+    }
+    false
+} 
+
+/*
+ * A closure that returns 1 if sequence features include type 'Pfam', else 0
+ * Argument should be a list of SequenceFeature 
+ */
+def hasPfam = { features -> 
+    for (sf in features)
+    {
+        /*
+         * Here we inspect the type of the sequence feature.
+         * You can also test sf.description, sf.score, sf.featureGroup,
+         * sf.strand, sf.phase, sf.begin, sf.end
+         * or sf.getValue(attributeName) for GFF 'column 9' properties
+         */
+        if ("Pfam".equals(sf.type))
+        {
+            return true
+        }
+    }
+    false
+}
+
+/*
+ * Closure that counts residues with a Pfam feature annotation
+ * Parameters are
+ * - the name (label) for the alignment annotation
+ * - the description (tooltip) for the annotation
+ * - 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, acceptResidue, acceptFeatures ->
+    [
+     getName: { name }, 
+     getDescription: { desc },
+     getMinColour: { [0, 255, 255] }, // cyan
+     getMaxColour: { [0, 0, 255] }, // blue
+     count: 
+         { res, feats -> 
+            def c = 0
+            if (acceptResidue.call(res))
+            {
+                if (acceptFeatures.call(feats))
+                {
+                    c++
+                }
+            }
+            c
+         }
+     ] as FeatureCounterI
+}
+
+/*
+ * 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 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)
+
+/*
+ * Register the annotations
+ */
+AlignmentAnnotationFactory.newCalculator(pfamAnnotation) 
+AlignmentAnnotationFactory.newCalculator(chargedPfamAnnotation)
diff --git a/examples/groovy/multipleFeatureAnnotations.groovy b/examples/groovy/multipleFeatureAnnotations.groovy
new file mode 100644 (file)
index 0000000..592c7f5
--- /dev/null
@@ -0,0 +1,110 @@
+import jalview.workers.AlignmentAnnotationFactory;
+import jalview.workers.AnnotationProviderI;
+import jalview.datamodel.AlignmentAnnotation;
+import jalview.datamodel.Annotation;
+import jalview.util.ColorUtils;
+import jalview.util.Comparison;
+import java.awt.Color;
+
+/*
+ * Example script to compute two alignment annotations
+ * - count of Phosphorylation features
+ * - count of Turn features
+ * To try this, first load example file uniref50.fa and load on features file
+ * exampleFeatures.txt, before running this script
+ *
+ * The script only needs to be run once - it will be registered by Jalview
+ * and recalculated automatically when the alignment changes.
+ */
+
+/*
+ * A closure that returns true if value includes "PHOSPHORYLATION"
+ */
+def phosCounter = { type ->    type.contains("PHOSPHORYLATION") }
+
+/*
+ * A closure that returns true if value includes "TURN"
+ */
+def turnCounter = { type ->    type.contains("TURN") }
+
+/*
+ * A closure that computes and returns an array of Annotation values,
+ * one for each column of the alignment
+ */
+def getAnnotations(al, fr, counter) 
+{
+    def width = al.width
+    def counts = new int[width] 
+    def max = 0
+    
+    /*
+     * count features in each column, record the maximum value
+     */
+    for (col = 0 ; col < width ; col++)
+    {
+        def count = 0
+        for (row = 0 ; row < al.height ; row++)
+        {
+            seq = al.getSequenceAt(row)
+            if (seq != null && col < seq.getLength())
+            {
+                def res = seq.getCharAt(col)
+                if (!Comparison.isGap(res))
+                {
+                    pos = seq.findPosition(col)
+                    features = fr.findFeaturesAtRes(seq, pos)
+                    for (feature in features)
+                    {
+                        if (counter.call(feature.type))
+                        {
+                            count++
+                        }
+                    }
+                }
+            }
+        }
+        counts[col] = count
+        if (count > max)
+        {
+            max = count
+        }
+    }
+    
+    /*
+     * make the Annotation objects, with a graduated colour scale 
+     * (from min value to max value) for the histogram bars 
+     */
+    def zero = '0' as char
+    def anns = new Annotation[width] 
+    for (col = 0 ; col < width ; col++)
+    {
+        def c = counts[col]
+        if (c > 0)
+        {
+            Color color = ColorUtils.getGraduatedColour(c, 0, Color.cyan,
+                max, Color.blue)
+            anns[col] = AlignmentAnnotationFactory.newAnnotation(String.valueOf(c),
+                String.valueOf(c), zero, c, color)
+        }
+    }
+    anns
+}
+
+/*
+ * Define the method that performs the calculations, and builds two
+ * AlignmentAnnotation objects
+ */
+def annotator = 
+    [ calculateAnnotation: { al, fr ->
+        def phosAnns = getAnnotations(al, fr, phosCounter)
+        def ann1 = AlignmentAnnotationFactory.newAlignmentAnnotation("Phosphorylation", "Count of Phosphorylation features", phosAnns)
+        def turnAnns = getAnnotations(al, fr, turnCounter)
+        def ann2 = AlignmentAnnotationFactory.newAlignmentAnnotation("Turn", "Count of Turn features", turnAnns)
+        return [ann1, ann2]
+      } 
+    ] as AnnotationProviderI
+    
+/*
+ * Register the annotation calculator with Jalview
+ */
+AlignmentAnnotationFactory.newCalculator(annotator) 
diff --git a/examples/testdata/1qcf.cif b/examples/testdata/1qcf.cif
new file mode 100644 (file)
index 0000000..23605a0
--- /dev/null
@@ -0,0 +1,6142 @@
+data_1QCF
+# 
+_entry.id   1QCF 
+# 
+_audit_conform.dict_name       mmcif_pdbx.dic 
+_audit_conform.dict_version    4.007 
+_audit_conform.dict_location   http://mmcif.pdb.org/dictionaries/ascii/mmcif_pdbx.dic 
+# 
+loop_
+_database_2.database_id 
+_database_2.database_code 
+PDB  1QCF       
+RCSB RCSB009070 
+# 
+loop_
+_database_PDB_rev.num 
+_database_PDB_rev.date 
+_database_PDB_rev.date_original 
+_database_PDB_rev.status 
+_database_PDB_rev.replaces 
+_database_PDB_rev.mod_type 
+1 1999-06-08 1999-05-04 ? 1QCF 0 
+2 2003-09-23 ?          ? 1QCF 1 
+3 2009-02-24 ?          ? 1QCF 1 
+# 
+loop_
+_database_PDB_rev_record.rev_num 
+_database_PDB_rev_record.type 
+_database_PDB_rev_record.details 
+2 JRNL  ? 
+2 DBREF ? 
+3 VERSN ? 
+# 
+_pdbx_database_related.db_name        PDB 
+_pdbx_database_related.db_id          1AD5 
+_pdbx_database_related.details        '1AD5 CONTAINS THE WILD-TYPE PROTEIN COMPLEXED WITH AMP-PNP' 
+_pdbx_database_related.content_type   unspecified 
+# 
+_pdbx_database_status.status_code    REL 
+_pdbx_database_status.entry_id       1QCF 
+_pdbx_database_status.deposit_site   RCSB 
+_pdbx_database_status.process_site   RCSB 
+_pdbx_database_status.SG_entry       . 
+# 
+loop_
+_audit_author.name 
+_audit_author.pdbx_ordinal 
+'Schindler, T.' 1 
+'Sicheri, F.'   2 
+'Pico, A.'      3 
+'Gazit, A.'     4 
+'Levitzki, A.'  5 
+'Kuriyan, J.'   6 
+# 
+_citation.id                        primary 
+_citation.title                     'Crystal structure of Hck in complex with a Src family-selective tyrosine kinase inhibitor.' 
+_citation.journal_abbrev            Mol.Cell 
+_citation.journal_volume            3 
+_citation.page_first                639 
+_citation.page_last                 648 
+_citation.year                      1999 
+_citation.journal_id_ASTM           MOCEFL 
+_citation.country                   US 
+_citation.journal_id_ISSN           1097-2765 
+_citation.journal_id_CSD            2168 
+_citation.book_publisher            ? 
+_citation.pdbx_database_id_PubMed   10360180 
+_citation.pdbx_database_id_DOI      '10.1016/S1097-2765(00)80357-3' 
+# 
+loop_
+_citation_author.citation_id 
+_citation_author.name 
+_citation_author.ordinal 
+primary 'Schindler, T.' 1 
+primary 'Sicheri, F.'   2 
+primary 'Pico, A.'      3 
+primary 'Gazit, A.'     4 
+primary 'Levitzki, A.'  5 
+primary 'Kuriyan, J.'   6 
+# 
+_cell.entry_id           1QCF 
+_cell.length_a           51.015 
+_cell.length_b           99.002 
+_cell.length_c           103.387 
+_cell.angle_alpha        90 
+_cell.angle_beta         90 
+_cell.angle_gamma        90 
+_cell.Z_PDB              4 
+_cell.pdbx_unique_axis   ? 
+# 
+_symmetry.entry_id                         1QCF 
+_symmetry.space_group_name_H-M             'P 21 21 21' 
+_symmetry.pdbx_full_space_group_name_H-M   ? 
+_symmetry.cell_setting                     ? 
+_symmetry.Int_Tables_number                ? 
+# 
+loop_
+_entity.id 
+_entity.type 
+_entity.src_method 
+_entity.pdbx_description 
+_entity.formula_weight 
+_entity.pdbx_number_of_molecules 
+_entity.details 
+_entity.pdbx_mutation 
+_entity.pdbx_fragment 
+_entity.pdbx_ec 
+1 polymer     man 'HAEMATOPOETIC CELL KINASE (HCK)'                             52000.762 1   ? 'Q528E, Q529E, Q530I' 
+'SH3-SH2-KINASE-HIGH AFFINITY TAIL' ? 
+2 non-polymer syn '1-TER-BUTYL-3-P-TOLYL-1H-PYRAZOLO[3,4-D]PYRIMIDIN-4-YLAMINE' 281.360   1   ? ?                     ? ? 
+3 water       nat water                                                         18.015    312 ? ?                     ? ? 
+# 
+loop_
+_entity_keywords.entity_id 
+_entity_keywords.text 
+1 ? 
+2 ? 
+3 ? 
+# 
+_entity_poly.entity_id                      1 
+_entity_poly.type                           'polypeptide(L)' 
+_entity_poly.nstd_linkage                   no 
+_entity_poly.nstd_monomer                   yes 
+_entity_poly.pdbx_seq_one_letter_code       
+;GAMGSGIRIIVVALYDYEAIHHEDLSFQKGDQMVVLEESGEWWKARSLATRKEGYIPSNYVARVDSLETEEWFFKGISRK
+DAERQLLAPGNMLGSFMIRDSETTKGSYSLSVRDYDPRQGDTVKHYKIRTLDNGGFYISPRSTFSTLQELVDHYKKGNDG
+LCQKLSVPCMSSKPQKPWEKDAWEIPRESLKLEKKLGAGQFGEVWMATYNKHTKVAVKTMKPGSMSVEAFLAEANVMKTL
+QHDKLVKLHAVVTKEPIYIITEFMAKGSLLDFLKSDEGSKQPLPKLIDFSAQIAEGMAFIEQRNYIHRDLRAANILVSAS
+LVCKIADFGLARVIEDNEYTAREGAKFPIKWTAPEAINFGSFTIKSDVWSFGILLMEIVTYGRIPYPGMSNPEVIRALER
+GYRMPRPENCPEELYNIMMRCWKNRPEERPTFEYIQSVLDDFYTATESQ(PTR)EEIP
+;
+_entity_poly.pdbx_seq_one_letter_code_can   
+;GAMGSGIRIIVVALYDYEAIHHEDLSFQKGDQMVVLEESGEWWKARSLATRKEGYIPSNYVARVDSLETEEWFFKGISRK
+DAERQLLAPGNMLGSFMIRDSETTKGSYSLSVRDYDPRQGDTVKHYKIRTLDNGGFYISPRSTFSTLQELVDHYKKGNDG
+LCQKLSVPCMSSKPQKPWEKDAWEIPRESLKLEKKLGAGQFGEVWMATYNKHTKVAVKTMKPGSMSVEAFLAEANVMKTL
+QHDKLVKLHAVVTKEPIYIITEFMAKGSLLDFLKSDEGSKQPLPKLIDFSAQIAEGMAFIEQRNYIHRDLRAANILVSAS
+LVCKIADFGLARVIEDNEYTAREGAKFPIKWTAPEAINFGSFTIKSDVWSFGILLMEIVTYGRIPYPGMSNPEVIRALER
+GYRMPRPENCPEELYNIMMRCWKNRPEERPTFEYIQSVLDDFYTATESQYEEIP
+;
+_entity_poly.pdbx_strand_id                 A 
+# 
+loop_
+_entity_poly_seq.entity_id 
+_entity_poly_seq.num 
+_entity_poly_seq.mon_id 
+_entity_poly_seq.hetero 
+1 1   GLY n 
+1 2   ALA n 
+1 3   MET n 
+1 4   GLY n 
+1 5   SER n 
+1 6   GLY n 
+1 7   ILE n 
+1 8   ARG n 
+1 9   ILE n 
+1 10  ILE n 
+1 11  VAL n 
+1 12  VAL n 
+1 13  ALA n 
+1 14  LEU n 
+1 15  TYR n 
+1 16  ASP n 
+1 17  TYR n 
+1 18  GLU n 
+1 19  ALA n 
+1 20  ILE n 
+1 21  HIS n 
+1 22  HIS n 
+1 23  GLU n 
+1 24  ASP n 
+1 25  LEU n 
+1 26  SER n 
+1 27  PHE n 
+1 28  GLN n 
+1 29  LYS n 
+1 30  GLY n 
+1 31  ASP n 
+1 32  GLN n 
+1 33  MET n 
+1 34  VAL n 
+1 35  VAL n 
+1 36  LEU n 
+1 37  GLU n 
+1 38  GLU n 
+1 39  SER n 
+1 40  GLY n 
+1 41  GLU n 
+1 42  TRP n 
+1 43  TRP n 
+1 44  LYS n 
+1 45  ALA n 
+1 46  ARG n 
+1 47  SER n 
+1 48  LEU n 
+1 49  ALA n 
+1 50  THR n 
+1 51  ARG n 
+1 52  LYS n 
+1 53  GLU n 
+1 54  GLY n 
+1 55  TYR n 
+1 56  ILE n 
+1 57  PRO n 
+1 58  SER n 
+1 59  ASN n 
+1 60  TYR n 
+1 61  VAL n 
+1 62  ALA n 
+1 63  ARG n 
+1 64  VAL n 
+1 65  ASP n 
+1 66  SER n 
+1 67  LEU n 
+1 68  GLU n 
+1 69  THR n 
+1 70  GLU n 
+1 71  GLU n 
+1 72  TRP n 
+1 73  PHE n 
+1 74  PHE n 
+1 75  LYS n 
+1 76  GLY n 
+1 77  ILE n 
+1 78  SER n 
+1 79  ARG n 
+1 80  LYS n 
+1 81  ASP n 
+1 82  ALA n 
+1 83  GLU n 
+1 84  ARG n 
+1 85  GLN n 
+1 86  LEU n 
+1 87  LEU n 
+1 88  ALA n 
+1 89  PRO n 
+1 90  GLY n 
+1 91  ASN n 
+1 92  MET n 
+1 93  LEU n 
+1 94  GLY n 
+1 95  SER n 
+1 96  PHE n 
+1 97  MET n 
+1 98  ILE n 
+1 99  ARG n 
+1 100 ASP n 
+1 101 SER n 
+1 102 GLU n 
+1 103 THR n 
+1 104 THR n 
+1 105 LYS n 
+1 106 GLY n 
+1 107 SER n 
+1 108 TYR n 
+1 109 SER n 
+1 110 LEU n 
+1 111 SER n 
+1 112 VAL n 
+1 113 ARG n 
+1 114 ASP n 
+1 115 TYR n 
+1 116 ASP n 
+1 117 PRO n 
+1 118 ARG n 
+1 119 GLN n 
+1 120 GLY n 
+1 121 ASP n 
+1 122 THR n 
+1 123 VAL n 
+1 124 LYS n 
+1 125 HIS n 
+1 126 TYR n 
+1 127 LYS n 
+1 128 ILE n 
+1 129 ARG n 
+1 130 THR n 
+1 131 LEU n 
+1 132 ASP n 
+1 133 ASN n 
+1 134 GLY n 
+1 135 GLY n 
+1 136 PHE n 
+1 137 TYR n 
+1 138 ILE n 
+1 139 SER n 
+1 140 PRO n 
+1 141 ARG n 
+1 142 SER n 
+1 143 THR n 
+1 144 PHE n 
+1 145 SER n 
+1 146 THR n 
+1 147 LEU n 
+1 148 GLN n 
+1 149 GLU n 
+1 150 LEU n 
+1 151 VAL n 
+1 152 ASP n 
+1 153 HIS n 
+1 154 TYR n 
+1 155 LYS n 
+1 156 LYS n 
+1 157 GLY n 
+1 158 ASN n 
+1 159 ASP n 
+1 160 GLY n 
+1 161 LEU n 
+1 162 CYS n 
+1 163 GLN n 
+1 164 LYS n 
+1 165 LEU n 
+1 166 SER n 
+1 167 VAL n 
+1 168 PRO n 
+1 169 CYS n 
+1 170 MET n 
+1 171 SER n 
+1 172 SER n 
+1 173 LYS n 
+1 174 PRO n 
+1 175 GLN n 
+1 176 LYS n 
+1 177 PRO n 
+1 178 TRP n 
+1 179 GLU n 
+1 180 LYS n 
+1 181 ASP n 
+1 182 ALA n 
+1 183 TRP n 
+1 184 GLU n 
+1 185 ILE n 
+1 186 PRO n 
+1 187 ARG n 
+1 188 GLU n 
+1 189 SER n 
+1 190 LEU n 
+1 191 LYS n 
+1 192 LEU n 
+1 193 GLU n 
+1 194 LYS n 
+1 195 LYS n 
+1 196 LEU n 
+1 197 GLY n 
+1 198 ALA n 
+1 199 GLY n 
+1 200 GLN n 
+1 201 PHE n 
+1 202 GLY n 
+1 203 GLU n 
+1 204 VAL n 
+1 205 TRP n 
+1 206 MET n 
+1 207 ALA n 
+1 208 THR n 
+1 209 TYR n 
+1 210 ASN n 
+1 211 LYS n 
+1 212 HIS n 
+1 213 THR n 
+1 214 LYS n 
+1 215 VAL n 
+1 216 ALA n 
+1 217 VAL n 
+1 218 LYS n 
+1 219 THR n 
+1 220 MET n 
+1 221 LYS n 
+1 222 PRO n 
+1 223 GLY n 
+1 224 SER n 
+1 225 MET n 
+1 226 SER n 
+1 227 VAL n 
+1 228 GLU n 
+1 229 ALA n 
+1 230 PHE n 
+1 231 LEU n 
+1 232 ALA n 
+1 233 GLU n 
+1 234 ALA n 
+1 235 ASN n 
+1 236 VAL n 
+1 237 MET n 
+1 238 LYS n 
+1 239 THR n 
+1 240 LEU n 
+1 241 GLN n 
+1 242 HIS n 
+1 243 ASP n 
+1 244 LYS n 
+1 245 LEU n 
+1 246 VAL n 
+1 247 LYS n 
+1 248 LEU n 
+1 249 HIS n 
+1 250 ALA n 
+1 251 VAL n 
+1 252 VAL n 
+1 253 THR n 
+1 254 LYS n 
+1 255 GLU n 
+1 256 PRO n 
+1 257 ILE n 
+1 258 TYR n 
+1 259 ILE n 
+1 260 ILE n 
+1 261 THR n 
+1 262 GLU n 
+1 263 PHE n 
+1 264 MET n 
+1 265 ALA n 
+1 266 LYS n 
+1 267 GLY n 
+1 268 SER n 
+1 269 LEU n 
+1 270 LEU n 
+1 271 ASP n 
+1 272 PHE n 
+1 273 LEU n 
+1 274 LYS n 
+1 275 SER n 
+1 276 ASP n 
+1 277 GLU n 
+1 278 GLY n 
+1 279 SER n 
+1 280 LYS n 
+1 281 GLN n 
+1 282 PRO n 
+1 283 LEU n 
+1 284 PRO n 
+1 285 LYS n 
+1 286 LEU n 
+1 287 ILE n 
+1 288 ASP n 
+1 289 PHE n 
+1 290 SER n 
+1 291 ALA n 
+1 292 GLN n 
+1 293 ILE n 
+1 294 ALA n 
+1 295 GLU n 
+1 296 GLY n 
+1 297 MET n 
+1 298 ALA n 
+1 299 PHE n 
+1 300 ILE n 
+1 301 GLU n 
+1 302 GLN n 
+1 303 ARG n 
+1 304 ASN n 
+1 305 TYR n 
+1 306 ILE n 
+1 307 HIS n 
+1 308 ARG n 
+1 309 ASP n 
+1 310 LEU n 
+1 311 ARG n 
+1 312 ALA n 
+1 313 ALA n 
+1 314 ASN n 
+1 315 ILE n 
+1 316 LEU n 
+1 317 VAL n 
+1 318 SER n 
+1 319 ALA n 
+1 320 SER n 
+1 321 LEU n 
+1 322 VAL n 
+1 323 CYS n 
+1 324 LYS n 
+1 325 ILE n 
+1 326 ALA n 
+1 327 ASP n 
+1 328 PHE n 
+1 329 GLY n 
+1 330 LEU n 
+1 331 ALA n 
+1 332 ARG n 
+1 333 VAL n 
+1 334 ILE n 
+1 335 GLU n 
+1 336 ASP n 
+1 337 ASN n 
+1 338 GLU n 
+1 339 TYR n 
+1 340 THR n 
+1 341 ALA n 
+1 342 ARG n 
+1 343 GLU n 
+1 344 GLY n 
+1 345 ALA n 
+1 346 LYS n 
+1 347 PHE n 
+1 348 PRO n 
+1 349 ILE n 
+1 350 LYS n 
+1 351 TRP n 
+1 352 THR n 
+1 353 ALA n 
+1 354 PRO n 
+1 355 GLU n 
+1 356 ALA n 
+1 357 ILE n 
+1 358 ASN n 
+1 359 PHE n 
+1 360 GLY n 
+1 361 SER n 
+1 362 PHE n 
+1 363 THR n 
+1 364 ILE n 
+1 365 LYS n 
+1 366 SER n 
+1 367 ASP n 
+1 368 VAL n 
+1 369 TRP n 
+1 370 SER n 
+1 371 PHE n 
+1 372 GLY n 
+1 373 ILE n 
+1 374 LEU n 
+1 375 LEU n 
+1 376 MET n 
+1 377 GLU n 
+1 378 ILE n 
+1 379 VAL n 
+1 380 THR n 
+1 381 TYR n 
+1 382 GLY n 
+1 383 ARG n 
+1 384 ILE n 
+1 385 PRO n 
+1 386 TYR n 
+1 387 PRO n 
+1 388 GLY n 
+1 389 MET n 
+1 390 SER n 
+1 391 ASN n 
+1 392 PRO n 
+1 393 GLU n 
+1 394 VAL n 
+1 395 ILE n 
+1 396 ARG n 
+1 397 ALA n 
+1 398 LEU n 
+1 399 GLU n 
+1 400 ARG n 
+1 401 GLY n 
+1 402 TYR n 
+1 403 ARG n 
+1 404 MET n 
+1 405 PRO n 
+1 406 ARG n 
+1 407 PRO n 
+1 408 GLU n 
+1 409 ASN n 
+1 410 CYS n 
+1 411 PRO n 
+1 412 GLU n 
+1 413 GLU n 
+1 414 LEU n 
+1 415 TYR n 
+1 416 ASN n 
+1 417 ILE n 
+1 418 MET n 
+1 419 MET n 
+1 420 ARG n 
+1 421 CYS n 
+1 422 TRP n 
+1 423 LYS n 
+1 424 ASN n 
+1 425 ARG n 
+1 426 PRO n 
+1 427 GLU n 
+1 428 GLU n 
+1 429 ARG n 
+1 430 PRO n 
+1 431 THR n 
+1 432 PHE n 
+1 433 GLU n 
+1 434 TYR n 
+1 435 ILE n 
+1 436 GLN n 
+1 437 SER n 
+1 438 VAL n 
+1 439 LEU n 
+1 440 ASP n 
+1 441 ASP n 
+1 442 PHE n 
+1 443 TYR n 
+1 444 THR n 
+1 445 ALA n 
+1 446 THR n 
+1 447 GLU n 
+1 448 SER n 
+1 449 GLN n 
+1 450 PTR n 
+1 451 GLU n 
+1 452 GLU n 
+1 453 ILE n 
+1 454 PRO n 
+# 
+_entity_src_gen.entity_id                          1 
+_entity_src_gen.gene_src_common_name               human 
+_entity_src_gen.gene_src_genus                     Homo 
+_entity_src_gen.pdbx_gene_src_gene                 ? 
+_entity_src_gen.gene_src_species                   ? 
+_entity_src_gen.gene_src_strain                    ? 
+_entity_src_gen.gene_src_tissue                    ? 
+_entity_src_gen.gene_src_tissue_fraction           ? 
+_entity_src_gen.gene_src_details                   ? 
+_entity_src_gen.pdbx_gene_src_fragment             ? 
+_entity_src_gen.pdbx_gene_src_scientific_name      'Homo sapiens' 
+_entity_src_gen.pdbx_gene_src_ncbi_taxonomy_id     9606 
+_entity_src_gen.pdbx_gene_src_variant              ? 
+_entity_src_gen.pdbx_gene_src_cell_line            ? 
+_entity_src_gen.pdbx_gene_src_atcc                 ? 
+_entity_src_gen.pdbx_gene_src_organ                ? 
+_entity_src_gen.pdbx_gene_src_organelle            ? 
+_entity_src_gen.pdbx_gene_src_cell                 ? 
+_entity_src_gen.pdbx_gene_src_cellular_location    ? 
+_entity_src_gen.host_org_common_name               'INSECT CELLS, BACULOVIRUS' 
+_entity_src_gen.pdbx_host_org_scientific_name      ? 
+_entity_src_gen.pdbx_host_org_ncbi_taxonomy_id     ? 
+_entity_src_gen.host_org_genus                     ? 
+_entity_src_gen.pdbx_host_org_gene                 ? 
+_entity_src_gen.pdbx_host_org_organ                ? 
+_entity_src_gen.host_org_species                   ? 
+_entity_src_gen.pdbx_host_org_tissue               ? 
+_entity_src_gen.pdbx_host_org_tissue_fraction      ? 
+_entity_src_gen.pdbx_host_org_strain               ? 
+_entity_src_gen.pdbx_host_org_variant              ? 
+_entity_src_gen.pdbx_host_org_cell_line            ? 
+_entity_src_gen.pdbx_host_org_atcc                 ? 
+_entity_src_gen.pdbx_host_org_culture_collection   ? 
+_entity_src_gen.pdbx_host_org_cell                 ? 
+_entity_src_gen.pdbx_host_org_organelle            ? 
+_entity_src_gen.pdbx_host_org_cellular_location    ? 
+_entity_src_gen.pdbx_host_org_vector_type          ? 
+_entity_src_gen.pdbx_host_org_vector               ? 
+_entity_src_gen.plasmid_name                       ? 
+_entity_src_gen.plasmid_details                    ? 
+_entity_src_gen.pdbx_description                   ? 
+# 
+_struct_ref.id                  1 
+_struct_ref.db_name             UNP 
+_struct_ref.db_code             HCK_HUMAN 
+_struct_ref.biol_id             . 
+_struct_ref.entity_id           1 
+_struct_ref.pdbx_db_accession   P08631 
+# 
+_struct_ref_seq.align_id                      1 
+_struct_ref_seq.ref_id                        1 
+_struct_ref_seq.pdbx_PDB_id_code              1QCF 
+_struct_ref_seq.pdbx_strand_id                A 
+_struct_ref_seq.seq_align_beg                 1 
+_struct_ref_seq.pdbx_seq_align_beg_ins_code   ? 
+_struct_ref_seq.seq_align_end                 454 
+_struct_ref_seq.pdbx_seq_align_end_ins_code   ? 
+_struct_ref_seq.pdbx_db_accession             P08631 
+_struct_ref_seq.db_align_beg                  74 
+_struct_ref_seq.pdbx_db_align_beg_ins_code    ? 
+_struct_ref_seq.db_align_end                  526 
+_struct_ref_seq.pdbx_db_align_end_ins_code    ? 
+_struct_ref_seq.pdbx_auth_seq_align_beg       76 
+_struct_ref_seq.pdbx_auth_seq_align_end       531 
+# 
+loop_
+_struct_ref_seq_dif.align_id 
+_struct_ref_seq_dif.pdbx_pdb_id_code 
+_struct_ref_seq_dif.mon_id 
+_struct_ref_seq_dif.pdbx_pdb_strand_id 
+_struct_ref_seq_dif.seq_num 
+_struct_ref_seq_dif.pdbx_pdb_ins_code 
+_struct_ref_seq_dif.pdbx_seq_db_name 
+_struct_ref_seq_dif.pdbx_seq_db_accession_code 
+_struct_ref_seq_dif.db_mon_id 
+_struct_ref_seq_dif.pdbx_seq_db_seq_num 
+_struct_ref_seq_dif.details 
+_struct_ref_seq_dif.pdbx_auth_seq_num 
+_struct_ref_seq_dif.pdbx_ordinal 
+1 1QCF GLU A 451 ? UNP P08631 GLN 523 ? 528 1 
+1 1QCF GLU A 452 ? UNP P08631 GLN 524 ? 529 2 
+1 1QCF ILE A 453 ? UNP P08631 GLU 525 ? 530 3 
+# 
+loop_
+_chem_comp.id 
+_chem_comp.type 
+_chem_comp.mon_nstd_flag 
+_chem_comp.name 
+_chem_comp.pdbx_synonyms 
+_chem_comp.formula 
+_chem_comp.formula_weight 
+SER 'L-peptide linking' y SERINE                                                        ?                 'C3 H7 N O3'     105.093 
+GLY 'PEPTIDE LINKING'   y GLYCINE                                                       ?                 'C2 H5 N O2'     75.067  
+ILE 'L-peptide linking' y ISOLEUCINE                                                    ?                 'C6 H13 N O2'    131.174 
+ARG 'L-peptide linking' y ARGININE                                                      ?                 'C6 H15 N4 O2 1' 175.210 
+VAL 'L-peptide linking' y VALINE                                                        ?                 'C5 H11 N O2'    117.147 
+ALA 'L-peptide linking' y ALANINE                                                       ?                 'C3 H7 N O2'     89.094  
+LEU 'L-peptide linking' y LEUCINE                                                       ?                 'C6 H13 N O2'    131.174 
+TYR 'L-peptide linking' y TYROSINE                                                      ?                 'C9 H11 N O3'    181.191 
+ASP 'L-peptide linking' y 'ASPARTIC ACID'                                               ?                 'C4 H7 N O4'     133.104 
+GLU 'L-peptide linking' y 'GLUTAMIC ACID'                                               ?                 'C5 H9 N O4'     147.130 
+HIS 'L-peptide linking' y HISTIDINE                                                     ?                 'C6 H10 N3 O2 1' 156.164 
+PHE 'L-peptide linking' y PHENYLALANINE                                                 ?                 'C9 H11 N O2'    165.191 
+GLN 'L-peptide linking' y GLUTAMINE                                                     ?                 'C5 H10 N2 O3'   146.146 
+LYS 'L-peptide linking' y LYSINE                                                        ?                 'C6 H15 N2 O2 1' 147.197 
+MET 'L-peptide linking' y METHIONINE                                                    ?                 'C5 H11 N O2 S'  149.207 
+TRP 'L-peptide linking' y TRYPTOPHAN                                                    ?                 'C11 H12 N2 O2'  204.228 
+THR 'L-peptide linking' y THREONINE                                                     ?                 'C4 H9 N O3'     119.120 
+PRO 'L-peptide linking' y PROLINE                                                       ?                 'C5 H9 N O2'     115.132 
+ASN 'L-peptide linking' y ASPARAGINE                                                    ?                 'C4 H8 N2 O3'    132.119 
+CYS 'L-peptide linking' y CYSTEINE                                                      ?                 'C3 H7 N O2 S'   121.154 
+PTR 'L-peptide linking' n O-PHOSPHOTYROSINE                                             PHOSPHONOTYROSINE 'C9 H12 N O6 P'  261.171 
+PP1 NON-POLYMER         . '1-TER-BUTYL-3-P-TOLYL-1H-PYRAZOLO[3,4-D]PYRIMIDIN-4-YLAMINE' ?                 'C16 H19 N5'     281.360 
+HOH NON-POLYMER         . WATER                                                         ?                 'H2 O'           18.015  
+# 
+_exptl.entry_id          1QCF 
+_exptl.method            'X-RAY DIFFRACTION' 
+_exptl.crystals_number   1 
+# 
+_exptl_crystal.id                    1 
+_exptl_crystal.density_meas          ? 
+_exptl_crystal.density_Matthews      2.51 
+_exptl_crystal.density_percent_sol   50.98 
+_exptl_crystal.description           ? 
+# 
+_exptl_crystal_grow.crystal_id      1 
+_exptl_crystal_grow.method          'VAPOR DIFFUSION, HANGING DROP' 
+_exptl_crystal_grow.temp            293 
+_exptl_crystal_grow.temp_details    ? 
+_exptl_crystal_grow.pH              7.0 
+_exptl_crystal_grow.pdbx_details    
+;PEG 10000, DIMETHYL SULFOXIDE, N-(2-HYDROXYETHYL)PIPERAZINE-N-(2- 
+ETHANESULFONIC ACID), pH 7.0, VAPOR DIFFUSION, HANGING DROP, temperature 293K
+;
+_exptl_crystal_grow.pdbx_pH_range   . 
+# 
+_diffrn.id                     1 
+_diffrn.ambient_temp           105 
+_diffrn.ambient_temp_details   ? 
+_diffrn.crystal_id             1 
+# 
+_diffrn_detector.diffrn_id              1 
+_diffrn_detector.detector               'IMAGE PLATE' 
+_diffrn_detector.type                   'RIGAKU RAXIS IIC' 
+_diffrn_detector.pdbx_collection_date   1999-10-22 
+_diffrn_detector.details                ? 
+# 
+_diffrn_radiation.diffrn_id                        1 
+_diffrn_radiation.wavelength_id                    1 
+_diffrn_radiation.pdbx_monochromatic_or_laue_m_l   M 
+_diffrn_radiation.monochromator                    ? 
+_diffrn_radiation.pdbx_diffrn_protocol             'SINGLE WAVELENGTH' 
+_diffrn_radiation.pdbx_scattering_type             x-ray 
+# 
+_diffrn_radiation_wavelength.id           1 
+_diffrn_radiation_wavelength.wavelength   1.5418 
+_diffrn_radiation_wavelength.wt           1.0 
+# 
+_diffrn_source.diffrn_id                   1 
+_diffrn_source.source                      'ROTATING ANODE' 
+_diffrn_source.type                        'RIGAKU RU200' 
+_diffrn_source.pdbx_synchrotron_site       ? 
+_diffrn_source.pdbx_synchrotron_beamline   ? 
+_diffrn_source.pdbx_wavelength             1.5418 
+_diffrn_source.pdbx_wavelength_list        ? 
+# 
+_reflns.entry_id                     1QCF 
+_reflns.observed_criterion_sigma_I   0 
+_reflns.observed_criterion_sigma_F   0 
+_reflns.d_resolution_low             99 
+_reflns.d_resolution_high            2.0 
+_reflns.number_obs                   35042 
+_reflns.number_all                   35649 
+_reflns.percent_possible_obs         98.3 
+_reflns.pdbx_Rmerge_I_obs            0.0860000 
+_reflns.pdbx_Rsym_value              ? 
+_reflns.pdbx_netI_over_sigmaI        28.2 
+_reflns.B_iso_Wilson_estimate        25.6 
+_reflns.pdbx_redundancy              6.4 
+_reflns.R_free_details               ? 
+_reflns.pdbx_ordinal                 1 
+_reflns.pdbx_diffrn_id               1 
+# 
+_reflns_shell.d_res_high             2.0 
+_reflns_shell.d_res_low              2.1 
+_reflns_shell.percent_possible_all   95.2 
+_reflns_shell.Rmerge_I_obs           0.2770000 
+_reflns_shell.pdbx_Rsym_value        ? 
+_reflns_shell.meanI_over_sigI_obs    ? 
+_reflns_shell.pdbx_redundancy        5.4 
+_reflns_shell.percent_possible_obs   ? 
+_reflns_shell.number_unique_all      ? 
+_reflns_shell.pdbx_ordinal           1 
+_reflns_shell.pdbx_diffrn_id         1 
+# 
+_computing.entry_id                           1QCF 
+_computing.pdbx_data_reduction_ii             R-AXIS 
+_computing.pdbx_data_reduction_ds             SCALEPACK 
+_computing.data_collection                    ? 
+_computing.structure_solution                 AMORE 
+_computing.structure_refinement               CNS 
+_computing.pdbx_structure_refinement_method   ? 
+# 
+_refine.entry_id                               1QCF 
+_refine.ls_number_reflns_obs                   35005 
+_refine.ls_number_reflns_all                   35649 
+_refine.pdbx_ls_sigma_I                        0 
+_refine.pdbx_ls_sigma_F                        0 
+_refine.pdbx_data_cutoff_high_absF             ? 
+_refine.pdbx_data_cutoff_low_absF              ? 
+_refine.pdbx_data_cutoff_high_rms_absF         ? 
+_refine.ls_d_res_low                           99 
+_refine.ls_d_res_high                          2.0 
+_refine.ls_percent_reflns_obs                  98.1 
+_refine.ls_R_factor_obs                        ? 
+_refine.ls_R_factor_all                        ? 
+_refine.ls_R_factor_R_work                     0.2150000 
+_refine.ls_R_factor_R_free                     0.2570000 
+_refine.ls_R_factor_R_free_error               ? 
+_refine.ls_R_factor_R_free_error_details       ? 
+_refine.ls_percent_reflns_R_free               ? 
+_refine.ls_number_reflns_R_free                3475 
+_refine.ls_number_parameters                   ? 
+_refine.ls_number_restraints                   ? 
+_refine.occupancy_min                          ? 
+_refine.occupancy_max                          ? 
+_refine.B_iso_mean                             ? 
+_refine.aniso_B[1][1]                          ? 
+_refine.aniso_B[2][2]                          ? 
+_refine.aniso_B[3][3]                          ? 
+_refine.aniso_B[1][2]                          ? 
+_refine.aniso_B[1][3]                          ? 
+_refine.aniso_B[2][3]                          ? 
+_refine.solvent_model_details                  ? 
+_refine.solvent_model_param_ksol               ? 
+_refine.solvent_model_param_bsol               ? 
+_refine.pdbx_ls_cross_valid_method             ? 
+_refine.details                                ? 
+_refine.pdbx_starting_model                    ? 
+_refine.pdbx_method_to_determine_struct        ? 
+_refine.pdbx_isotropic_thermal_model           ? 
+_refine.pdbx_stereochemistry_target_values     'ENGH & HUBER' 
+_refine.pdbx_stereochem_target_val_spec_case   ? 
+_refine.pdbx_R_Free_selection_details          ? 
+_refine.pdbx_overall_ESU_R                     ? 
+_refine.pdbx_overall_ESU_R_Free                ? 
+_refine.overall_SU_ML                          ? 
+_refine.overall_SU_B                           ? 
+_refine.ls_redundancy_reflns_obs               ? 
+_refine.pdbx_refine_id                         'X-RAY DIFFRACTION' 
+_refine.pdbx_diffrn_id                         1 
+# 
+_refine_hist.pdbx_refine_id                   'X-RAY DIFFRACTION' 
+_refine_hist.cycle_id                         LAST 
+_refine_hist.pdbx_number_atoms_protein        3626 
+_refine_hist.pdbx_number_atoms_nucleic_acid   0 
+_refine_hist.pdbx_number_atoms_ligand         21 
+_refine_hist.number_atoms_solvent             312 
+_refine_hist.number_atoms_total               3959 
+_refine_hist.d_res_high                       2.0 
+_refine_hist.d_res_low                        99 
+# 
+loop_
+_refine_ls_restr.type 
+_refine_ls_restr.dev_ideal 
+_refine_ls_restr.dev_ideal_target 
+_refine_ls_restr.weight 
+_refine_ls_restr.number 
+_refine_ls_restr.pdbx_refine_id 
+c_bond_d                0.007258 ? ? ? 'X-RAY DIFFRACTION' 
+c_bond_d_na             ?        ? ? ? 'X-RAY DIFFRACTION' 
+c_bond_d_prot           ?        ? ? ? 'X-RAY DIFFRACTION' 
+c_angle_d               ?        ? ? ? 'X-RAY DIFFRACTION' 
+c_angle_d_na            ?        ? ? ? 'X-RAY DIFFRACTION' 
+c_angle_d_prot          ?        ? ? ? 'X-RAY DIFFRACTION' 
+c_angle_deg             1.54111  ? ? ? 'X-RAY DIFFRACTION' 
+c_angle_deg_na          ?        ? ? ? 'X-RAY DIFFRACTION' 
+c_angle_deg_prot        ?        ? ? ? 'X-RAY DIFFRACTION' 
+c_dihedral_angle_d      ?        ? ? ? 'X-RAY DIFFRACTION' 
+c_dihedral_angle_d_na   ?        ? ? ? 'X-RAY DIFFRACTION' 
+c_dihedral_angle_d_prot ?        ? ? ? 'X-RAY DIFFRACTION' 
+c_improper_angle_d      ?        ? ? ? 'X-RAY DIFFRACTION' 
+c_improper_angle_d_na   ?        ? ? ? 'X-RAY DIFFRACTION' 
+c_improper_angle_d_prot ?        ? ? ? 'X-RAY DIFFRACTION' 
+c_mcbond_it             ?        ? ? ? 'X-RAY DIFFRACTION' 
+c_mcangle_it            ?        ? ? ? 'X-RAY DIFFRACTION' 
+c_scbond_it             ?        ? ? ? 'X-RAY DIFFRACTION' 
+c_scangle_it            ?        ? ? ? 'X-RAY DIFFRACTION' 
+# 
+_struct.entry_id                  1QCF 
+_struct.title                     'CRYSTAL STRUCTURE OF HCK IN COMPLEX WITH A SRC FAMILY-SELECTIVE TYROSINE KINASE INHIBITOR' 
+_struct.pdbx_descriptor           'CRYSTAL STRUCTURE OF HCK IN COMPLEX WITH A SRC FAMILY-SELECTIVE TYROSINE KINASE INHIBITOR' 
+_struct.pdbx_model_details        ? 
+_struct.pdbx_CASP_flag            ? 
+_struct.pdbx_model_type_details   ? 
+# 
+_struct_keywords.entry_id        1QCF 
+_struct_keywords.pdbx_keywords   'TYROSINE KINASE' 
+_struct_keywords.text            
+'TYROSINE KINASE-INHIBITOR COMPLEX, DOWN-REGULATED KINASE, ORDERED ACTIVATION LOOP, TYROSINE KINASE' 
+# 
+loop_
+_struct_asym.id 
+_struct_asym.pdbx_blank_PDB_chainid_flag 
+_struct_asym.pdbx_modified 
+_struct_asym.entity_id 
+_struct_asym.details 
+A N N 1 ? 
+B N N 2 ? 
+C N N 3 ? 
+# 
+_struct_biol.id   1 
+# 
+loop_
+_struct_conf.conf_type_id 
+_struct_conf.id 
+_struct_conf.pdbx_PDB_helix_id 
+_struct_conf.beg_label_comp_id 
+_struct_conf.beg_label_asym_id 
+_struct_conf.beg_label_seq_id 
+_struct_conf.pdbx_beg_PDB_ins_code 
+_struct_conf.end_label_comp_id 
+_struct_conf.end_label_asym_id 
+_struct_conf.end_label_seq_id 
+_struct_conf.pdbx_end_PDB_ins_code 
+_struct_conf.beg_auth_comp_id 
+_struct_conf.beg_auth_asym_id 
+_struct_conf.beg_auth_seq_id 
+_struct_conf.end_auth_comp_id 
+_struct_conf.end_auth_asym_id 
+_struct_conf.end_auth_seq_id 
+_struct_conf.pdbx_PDB_helix_class 
+_struct_conf.details 
+_struct_conf.pdbx_PDB_helix_length 
+HELX_P HELX_P1  1  SER A 66  ? GLU A 70  ? SER A 142 GLU A 146 5 ? 5  
+HELX_P HELX_P2  2  SER A 78  ? ALA A 88  ? SER A 154 ALA A 164 1 ? 11 
+HELX_P HELX_P3  3  THR A 146 ? LYS A 155 ? THR A 222 LYS A 231 1 ? 10 
+HELX_P HELX_P4  4  PRO A 186 ? GLU A 188 ? PRO A 263 GLU A 265 5 ? 3  
+HELX_P HELX_P5  5  SER A 226 ? LYS A 238 ? SER A 303 LYS A 315 1 ? 13 
+HELX_P HELX_P6  6  SER A 268 ? SER A 275 ? SER A 345 SER A 352 1 ? 8  
+HELX_P HELX_P7  7  SER A 275 ? LYS A 280 ? SER A 352 LYS A 357 1 ? 6  
+HELX_P HELX_P8  8  PRO A 282 ? ARG A 303 ? PRO A 359 ARG A 380 1 ? 22 
+HELX_P HELX_P9  9  ARG A 311 ? ALA A 313 ? ARG A 388 ALA A 390 5 ? 3  
+HELX_P HELX_P10 10 GLY A 329 ? VAL A 333 ? GLY A 406 VAL A 410 5 ? 5  
+HELX_P HELX_P11 11 ASP A 336 ? ALA A 341 ? ASP A 413 ALA A 418 1 ? 6  
+HELX_P HELX_P12 12 PRO A 348 ? THR A 352 ? PRO A 425 THR A 429 5 ? 5  
+HELX_P HELX_P13 13 ALA A 353 ? GLY A 360 ? ALA A 430 GLY A 437 1 ? 8  
+HELX_P HELX_P14 14 THR A 363 ? THR A 380 ? THR A 440 THR A 457 1 ? 18 
+HELX_P HELX_P15 15 SER A 390 ? GLY A 401 ? SER A 467 GLY A 478 1 ? 12 
+HELX_P HELX_P16 16 PRO A 411 ? TRP A 422 ? PRO A 488 TRP A 499 1 ? 12 
+HELX_P HELX_P17 17 ARG A 425 ? ARG A 429 ? ARG A 502 ARG A 506 5 ? 5  
+HELX_P HELX_P18 18 THR A 431 ? ASP A 441 ? THR A 508 ASP A 518 1 ? 11 
+# 
+_struct_conf_type.id          HELX_P 
+_struct_conf_type.criteria    ? 
+_struct_conf_type.reference   ? 
+# 
+loop_
+_struct_conn.id 
+_struct_conn.conn_type_id 
+_struct_conn.pdbx_PDB_id 
+_struct_conn.ptnr1_label_asym_id 
+_struct_conn.ptnr1_label_comp_id 
+_struct_conn.ptnr1_label_seq_id 
+_struct_conn.ptnr1_label_atom_id 
+_struct_conn.pdbx_ptnr1_label_alt_id 
+_struct_conn.pdbx_ptnr1_PDB_ins_code 
+_struct_conn.pdbx_ptnr1_standard_comp_id 
+_struct_conn.ptnr1_symmetry 
+_struct_conn.ptnr2_label_asym_id 
+_struct_conn.ptnr2_label_comp_id 
+_struct_conn.ptnr2_label_seq_id 
+_struct_conn.ptnr2_label_atom_id 
+_struct_conn.pdbx_ptnr2_label_alt_id 
+_struct_conn.pdbx_ptnr2_PDB_ins_code 
+_struct_conn.ptnr1_auth_asym_id 
+_struct_conn.ptnr1_auth_comp_id 
+_struct_conn.ptnr1_auth_seq_id 
+_struct_conn.ptnr2_auth_asym_id 
+_struct_conn.ptnr2_auth_comp_id 
+_struct_conn.ptnr2_auth_seq_id 
+_struct_conn.ptnr2_symmetry 
+_struct_conn.pdbx_ptnr3_label_atom_id 
+_struct_conn.pdbx_ptnr3_label_seq_id 
+_struct_conn.pdbx_ptnr3_label_comp_id 
+_struct_conn.pdbx_ptnr3_label_asym_id 
+_struct_conn.pdbx_ptnr3_label_alt_id 
+_struct_conn.pdbx_ptnr3_PDB_ins_code 
+_struct_conn.details 
+_struct_conn.pdbx_dist_value 
+_struct_conn.pdbx_value_order 
+covale1 covale ? A GLN 449 C ? ? ? 1_555 A PTR 450 N ? ? A GLN 526 A PTR 527 1_555 ? ? ? ? ? ? ? 1.321 ? 
+covale2 covale ? A PTR 450 C ? ? ? 1_555 A GLU 451 N ? ? A PTR 527 A GLU 528 1_555 ? ? ? ? ? ? ? 1.324 ? 
+# 
+_struct_conn_type.id          covale 
+_struct_conn_type.criteria    ? 
+_struct_conn_type.reference   ? 
+# 
+loop_
+_struct_mon_prot_cis.pdbx_id 
+_struct_mon_prot_cis.label_comp_id 
+_struct_mon_prot_cis.label_seq_id 
+_struct_mon_prot_cis.label_asym_id 
+_struct_mon_prot_cis.label_alt_id 
+_struct_mon_prot_cis.pdbx_PDB_ins_code 
+_struct_mon_prot_cis.auth_comp_id 
+_struct_mon_prot_cis.auth_seq_id 
+_struct_mon_prot_cis.auth_asym_id 
+_struct_mon_prot_cis.pdbx_label_comp_id_2 
+_struct_mon_prot_cis.pdbx_label_seq_id_2 
+_struct_mon_prot_cis.pdbx_label_asym_id_2 
+_struct_mon_prot_cis.pdbx_PDB_ins_code_2 
+_struct_mon_prot_cis.pdbx_auth_comp_id_2 
+_struct_mon_prot_cis.pdbx_auth_seq_id_2 
+_struct_mon_prot_cis.pdbx_auth_asym_id_2 
+_struct_mon_prot_cis.pdbx_PDB_model_num 
+_struct_mon_prot_cis.pdbx_omega_angle 
+1 GLU 255 A . ? GLU 332 A PRO 256 A ? PRO 333 A 1 -0.10 
+2 ILE 453 A . ? ILE 530 A PRO 454 A ? PRO 531 A 1 -1.93 
+# 
+loop_
+_struct_sheet.id 
+_struct_sheet.type 
+_struct_sheet.number_strands 
+_struct_sheet.details 
+A ? 5 ? 
+B ? 5 ? 
+C ? 5 ? 
+D ? 2 ? 
+# 
+loop_
+_struct_sheet_order.sheet_id 
+_struct_sheet_order.range_id_1 
+_struct_sheet_order.range_id_2 
+_struct_sheet_order.offset 
+_struct_sheet_order.sense 
+A 1 2 ? anti-parallel 
+A 2 3 ? anti-parallel 
+A 3 4 ? anti-parallel 
+A 4 5 ? anti-parallel 
+B 1 2 ? parallel      
+B 2 3 ? anti-parallel 
+B 3 4 ? anti-parallel 
+B 4 5 ? anti-parallel 
+C 1 2 ? anti-parallel 
+C 2 3 ? anti-parallel 
+C 3 4 ? anti-parallel 
+C 4 5 ? anti-parallel 
+D 1 2 ? anti-parallel 
+# 
+loop_
+_struct_sheet_range.sheet_id 
+_struct_sheet_range.id 
+_struct_sheet_range.beg_label_comp_id 
+_struct_sheet_range.beg_label_asym_id 
+_struct_sheet_range.beg_label_seq_id 
+_struct_sheet_range.pdbx_beg_PDB_ins_code 
+_struct_sheet_range.end_label_comp_id 
+_struct_sheet_range.end_label_asym_id 
+_struct_sheet_range.end_label_seq_id 
+_struct_sheet_range.pdbx_end_PDB_ins_code 
+_struct_sheet_range.symmetry 
+_struct_sheet_range.beg_auth_comp_id 
+_struct_sheet_range.beg_auth_asym_id 
+_struct_sheet_range.beg_auth_seq_id 
+_struct_sheet_range.end_auth_comp_id 
+_struct_sheet_range.end_auth_asym_id 
+_struct_sheet_range.end_auth_seq_id 
+A 1 GLU A 53  ? PRO A 57  ? ? GLU A 129 PRO A 133 
+A 2 TRP A 42  ? SER A 47  ? ? TRP A 118 SER A 123 
+A 3 GLN A 32  ? GLU A 37  ? ? GLN A 107 GLU A 112 
+A 4 ILE A 10  ? ALA A 13  ? ? ILE A 85  ALA A 88  
+A 5 VAL A 61  ? ARG A 63  ? ? VAL A 137 ARG A 139 
+B 1 PHE A 73  ? PHE A 74  ? ? PHE A 149 PHE A 150 
+B 2 PHE A 96  ? ASP A 100 ? ? PHE A 172 ASP A 176 
+B 3 TYR A 108 ? ASP A 116 ? ? TYR A 184 ASP A 192 
+B 4 GLY A 120 ? THR A 130 ? ? GLY A 196 THR A 206 
+B 5 PHE A 136 ? TYR A 137 ? ? PHE A 212 TYR A 213 
+C 1 LEU A 190 ? GLY A 197 ? ? LEU A 267 GLY A 274 
+C 2 GLY A 202 ? TYR A 209 ? ? GLY A 279 TYR A 286 
+C 3 THR A 213 ? MET A 220 ? ? THR A 290 MET A 297 
+C 4 TYR A 258 ? THR A 261 ? ? TYR A 335 THR A 338 
+C 5 LEU A 248 ? VAL A 252 ? ? LEU A 325 VAL A 329 
+D 1 ILE A 315 ? VAL A 317 ? ? ILE A 392 VAL A 394 
+D 2 CYS A 323 ? ILE A 325 ? ? CYS A 400 ILE A 402 
+# 
+loop_
+_pdbx_struct_sheet_hbond.sheet_id 
+_pdbx_struct_sheet_hbond.range_id_1 
+_pdbx_struct_sheet_hbond.range_id_2 
+_pdbx_struct_sheet_hbond.range_1_label_atom_id 
+_pdbx_struct_sheet_hbond.range_1_label_comp_id 
+_pdbx_struct_sheet_hbond.range_1_label_asym_id 
+_pdbx_struct_sheet_hbond.range_1_label_seq_id 
+_pdbx_struct_sheet_hbond.range_1_PDB_ins_code 
+_pdbx_struct_sheet_hbond.range_1_auth_atom_id 
+_pdbx_struct_sheet_hbond.range_1_auth_comp_id 
+_pdbx_struct_sheet_hbond.range_1_auth_asym_id 
+_pdbx_struct_sheet_hbond.range_1_auth_seq_id 
+_pdbx_struct_sheet_hbond.range_2_label_atom_id 
+_pdbx_struct_sheet_hbond.range_2_label_comp_id 
+_pdbx_struct_sheet_hbond.range_2_label_asym_id 
+_pdbx_struct_sheet_hbond.range_2_label_seq_id 
+_pdbx_struct_sheet_hbond.range_2_PDB_ins_code 
+_pdbx_struct_sheet_hbond.range_2_auth_atom_id 
+_pdbx_struct_sheet_hbond.range_2_auth_comp_id 
+_pdbx_struct_sheet_hbond.range_2_auth_asym_id 
+_pdbx_struct_sheet_hbond.range_2_auth_seq_id 
+A 1 2 N ILE A 56  ? N ILE A 132 O TRP A 43  ? O TRP A 119 
+A 2 3 O ARG A 46  ? O ARG A 122 N VAL A 34  ? N VAL A 109 
+A 3 4 N MET A 33  ? N MET A 108 O VAL A 11  ? O VAL A 86  
+A 4 5 N VAL A 12  ? N VAL A 87  O ALA A 62  ? O ALA A 138 
+B 1 2 N PHE A 74  ? N PHE A 150 O ILE A 98  ? O ILE A 174 
+B 2 3 N ARG A 99  ? N ARG A 175 O SER A 109 ? O SER A 185 
+B 3 4 O ASP A 116 ? O ASP A 192 N GLY A 120 ? N GLY A 196 
+B 4 5 N ARG A 129 ? N ARG A 205 O TYR A 137 ? O TYR A 213 
+C 1 2 O GLY A 197 ? O GLY A 274 N VAL A 204 ? N VAL A 281 
+C 2 3 N TYR A 209 ? N TYR A 286 O THR A 213 ? O THR A 290 
+C 3 4 N LYS A 218 ? N LYS A 295 O ILE A 259 ? O ILE A 336 
+C 4 5 O ILE A 260 ? O ILE A 337 N HIS A 249 ? N HIS A 326 
+D 1 2 N LEU A 316 ? N LEU A 393 O LYS A 324 ? O LYS A 401 
+# 
+_struct_site.id                   AC1 
+_struct_site.details              'BINDING SITE FOR RESIDUE PP1 A 532' 
+_struct_site.pdbx_evidence_code   SOFTWARE 
+# 
+loop_
+_struct_site_gen.id 
+_struct_site_gen.site_id 
+_struct_site_gen.pdbx_num_res 
+_struct_site_gen.label_comp_id 
+_struct_site_gen.label_asym_id 
+_struct_site_gen.label_seq_id 
+_struct_site_gen.pdbx_auth_ins_code 
+_struct_site_gen.auth_comp_id 
+_struct_site_gen.auth_asym_id 
+_struct_site_gen.auth_seq_id 
+_struct_site_gen.label_atom_id 
+_struct_site_gen.label_alt_id 
+_struct_site_gen.symmetry 
+_struct_site_gen.details 
+1  AC1 12 LEU A 196 ? LEU A 273 . . 1_555 ? 
+2  AC1 12 VAL A 204 ? VAL A 281 . . 1_555 ? 
+3  AC1 12 ALA A 216 ? ALA A 293 . . 1_555 ? 
+4  AC1 12 ILE A 259 ? ILE A 336 . . 1_555 ? 
+5  AC1 12 THR A 261 ? THR A 338 . . 1_555 ? 
+6  AC1 12 GLU A 262 ? GLU A 339 . . 1_555 ? 
+7  AC1 12 MET A 264 ? MET A 341 . . 1_555 ? 
+8  AC1 12 SER A 268 ? SER A 345 . . 1_555 ? 
+9  AC1 12 LEU A 316 ? LEU A 393 . . 1_555 ? 
+10 AC1 12 ASP A 327 ? ASP A 404 . . 1_555 ? 
+11 AC1 12 HOH C .   ? HOH A 582 . . 1_555 ? 
+12 AC1 12 HOH C .   ? HOH A 774 . . 1_555 ? 
+# 
+_database_PDB_matrix.entry_id          1QCF 
+_database_PDB_matrix.origx[1][1]       1.000000 
+_database_PDB_matrix.origx[1][2]       0.000000 
+_database_PDB_matrix.origx[1][3]       0.000000 
+_database_PDB_matrix.origx[2][1]       0.000000 
+_database_PDB_matrix.origx[2][2]       1.000000 
+_database_PDB_matrix.origx[2][3]       0.000000 
+_database_PDB_matrix.origx[3][1]       0.000000 
+_database_PDB_matrix.origx[3][2]       0.000000 
+_database_PDB_matrix.origx[3][3]       1.000000 
+_database_PDB_matrix.origx_vector[1]   0.00000 
+_database_PDB_matrix.origx_vector[2]   0.00000 
+_database_PDB_matrix.origx_vector[3]   0.00000 
+# 
+_atom_sites.entry_id                    1QCF 
+_atom_sites.Cartn_transform_axes        ? 
+_atom_sites.fract_transf_matrix[1][1]   0.019602 
+_atom_sites.fract_transf_matrix[1][2]   0.000000 
+_atom_sites.fract_transf_matrix[1][3]   0.000000 
+_atom_sites.fract_transf_matrix[2][1]   0.000000 
+_atom_sites.fract_transf_matrix[2][2]   0.010101 
+_atom_sites.fract_transf_matrix[2][3]   0.000000 
+_atom_sites.fract_transf_matrix[3][1]   0.000000 
+_atom_sites.fract_transf_matrix[3][2]   0.000000 
+_atom_sites.fract_transf_matrix[3][3]   0.009672 
+_atom_sites.fract_transf_vector[1]      0.00000 
+_atom_sites.fract_transf_vector[2]      0.00000 
+_atom_sites.fract_transf_vector[3]      0.00000 
+# 
+loop_
+_atom_type.symbol 
+N 
+C 
+O 
+S 
+P 
+# 
+loop_
+_atom_site.group_PDB 
+_atom_site.id 
+_atom_site.type_symbol 
+_atom_site.label_atom_id 
+_atom_site.label_alt_id 
+_atom_site.label_comp_id 
+_atom_site.label_asym_id 
+_atom_site.label_entity_id 
+_atom_site.label_seq_id 
+_atom_site.pdbx_PDB_ins_code 
+_atom_site.Cartn_x 
+_atom_site.Cartn_y 
+_atom_site.Cartn_z 
+_atom_site.occupancy 
+_atom_site.B_iso_or_equiv 
+_atom_site.Cartn_x_esd 
+_atom_site.Cartn_y_esd 
+_atom_site.Cartn_z_esd 
+_atom_site.occupancy_esd 
+_atom_site.B_iso_or_equiv_esd 
+_atom_site.pdbx_formal_charge 
+_atom_site.auth_seq_id 
+_atom_site.auth_comp_id 
+_atom_site.auth_asym_id 
+_atom_site.auth_atom_id 
+_atom_site.pdbx_PDB_model_num 
+ATOM   1    N N   . SER A 1 5   ? -12.315 3.135  35.123 1.00 58.24 ? ? ? ? ? ? 80  SER A N   1 
+ATOM   2    C CA  . SER A 1 5   ? -12.056 1.909  35.930 1.00 56.45 ? ? ? ? ? ? 80  SER A CA  1 
+ATOM   3    C C   . SER A 1 5   ? -10.561 1.626  35.997 1.00 54.76 ? ? ? ? ? ? 80  SER A C   1 
+ATOM   4    O O   . SER A 1 5   ? -9.758  2.328  35.378 1.00 55.95 ? ? ? ? ? ? 80  SER A O   1 
+ATOM   5    C CB  . SER A 1 5   ? -12.772 0.705  35.308 1.00 57.12 ? ? ? ? ? ? 80  SER A CB  1 
+ATOM   6    O OG  . SER A 1 5   ? -14.175 0.912  35.247 1.00 59.13 ? ? ? ? ? ? 80  SER A OG  1 
+ATOM   7    N N   . GLY A 1 6   ? -10.198 0.598  36.758 1.00 51.37 ? ? ? ? ? ? 81  GLY A N   1 
+ATOM   8    C CA  . GLY A 1 6   ? -8.804  0.220  36.882 1.00 44.34 ? ? ? ? ? ? 81  GLY A CA  1 
+ATOM   9    C C   . GLY A 1 6   ? -8.315  -0.399 35.586 1.00 39.98 ? ? ? ? ? ? 81  GLY A C   1 
+ATOM   10   O O   . GLY A 1 6   ? -8.076  -1.607 35.498 1.00 36.92 ? ? ? ? ? ? 81  GLY A O   1 
+ATOM   11   N N   . ILE A 1 7   ? -8.175  0.445  34.571 1.00 35.38 ? ? ? ? ? ? 82  ILE A N   1 
+ATOM   12   C CA  . ILE A 1 7   ? -7.713  0.023  33.258 1.00 33.74 ? ? ? ? ? ? 82  ILE A CA  1 
+ATOM   13   C C   . ILE A 1 7   ? -6.193  0.115  33.179 1.00 32.49 ? ? ? ? ? ? 82  ILE A C   1 
+ATOM   14   O O   . ILE A 1 7   ? -5.602  1.114  33.580 1.00 33.80 ? ? ? ? ? ? 82  ILE A O   1 
+ATOM   15   C CB  . ILE A 1 7   ? -8.356  0.905  32.167 1.00 33.93 ? ? ? ? ? ? 82  ILE A CB  1 
+ATOM   16   C CG1 . ILE A 1 7   ? -9.875  0.670  32.170 1.00 32.55 ? ? ? ? ? ? 82  ILE A CG1 1 
+ATOM   17   C CG2 . ILE A 1 7   ? -7.730  0.608  30.805 1.00 32.89 ? ? ? ? ? ? 82  ILE A CG2 1 
+ATOM   18   C CD1 . ILE A 1 7   ? -10.674 1.635  31.319 1.00 30.01 ? ? ? ? ? ? 82  ILE A CD1 1 
+ATOM   19   N N   . ARG A 1 8   ? -5.561  -0.930 32.660 1.00 30.03 ? ? ? ? ? ? 83  ARG A N   1 
+ATOM   20   C CA  . ARG A 1 8   ? -4.110  -0.946 32.548 1.00 29.23 ? ? ? ? ? ? 83  ARG A CA  1 
+ATOM   21   C C   . ARG A 1 8   ? -3.665  0.213  31.660 1.00 31.20 ? ? ? ? ? ? 83  ARG A C   1 
+ATOM   22   O O   . ARG A 1 8   ? -4.206  0.425  30.574 1.00 28.24 ? ? ? ? ? ? 83  ARG A O   1 
+ATOM   23   C CB  . ARG A 1 8   ? -3.638  -2.289 31.975 1.00 30.07 ? ? ? ? ? ? 83  ARG A CB  1 
+ATOM   24   C CG  . ARG A 1 8   ? -2.157  -2.540 32.170 1.00 30.09 ? ? ? ? ? ? 83  ARG A CG  1 
+ATOM   25   C CD  . ARG A 1 8   ? -1.725  -3.917 31.700 1.00 28.81 ? ? ? ? ? ? 83  ARG A CD  1 
+ATOM   26   N NE  . ARG A 1 8   ? -2.015  -4.114 30.287 1.00 28.47 ? ? ? ? ? ? 83  ARG A NE  1 
+ATOM   27   C CZ  . ARG A 1 8   ? -1.360  -4.964 29.509 1.00 29.57 ? ? ? ? ? ? 83  ARG A CZ  1 
+ATOM   28   N NH1 . ARG A 1 8   ? -0.371  -5.694 30.011 1.00 31.86 ? ? ? ? ? ? 83  ARG A NH1 1 
+ATOM   29   N NH2 . ARG A 1 8   ? -1.688  -5.078 28.229 1.00 32.35 ? ? ? ? ? ? 83  ARG A NH2 1 
+ATOM   30   N N   . ILE A 1 9   ? -2.685  0.975  32.132 1.00 32.14 ? ? ? ? ? ? 84  ILE A N   1 
+ATOM   31   C CA  . ILE A 1 9   ? -2.197  2.116  31.374 1.00 34.25 ? ? ? ? ? ? 84  ILE A CA  1 
+ATOM   32   C C   . ILE A 1 9   ? -0.855  1.789  30.728 1.00 34.69 ? ? ? ? ? ? 84  ILE A C   1 
+ATOM   33   O O   . ILE A 1 9   ? 0.091   1.363  31.398 1.00 31.70 ? ? ? ? ? ? 84  ILE A O   1 
+ATOM   34   C CB  . ILE A 1 9   ? -2.079  3.355  32.293 1.00 38.13 ? ? ? ? ? ? 84  ILE A CB  1 
+ATOM   35   C CG1 . ILE A 1 9   ? -1.720  4.610  31.486 1.00 40.14 ? ? ? ? ? ? 84  ILE A CG1 1 
+ATOM   36   C CG2 . ILE A 1 9   ? -1.055  3.087  33.371 1.00 39.84 ? ? ? ? ? ? 84  ILE A CG2 1 
+ATOM   37   C CD1 . ILE A 1 9   ? -0.316  4.642  30.930 1.00 43.16 ? ? ? ? ? ? 84  ILE A CD1 1 
+ATOM   38   N N   . ILE A 1 10  ? -0.786  1.991  29.415 1.00 35.19 ? ? ? ? ? ? 85  ILE A N   1 
+ATOM   39   C CA  . ILE A 1 10  ? 0.423   1.715  28.649 1.00 35.69 ? ? ? ? ? ? 85  ILE A CA  1 
+ATOM   40   C C   . ILE A 1 10  ? 1.006   2.998  28.062 1.00 36.73 ? ? ? ? ? ? 85  ILE A C   1 
+ATOM   41   O O   . ILE A 1 10  ? 0.277   3.949  27.768 1.00 36.76 ? ? ? ? ? ? 85  ILE A O   1 
+ATOM   42   C CB  . ILE A 1 10  ? 0.118   0.711  27.507 1.00 37.70 ? ? ? ? ? ? 85  ILE A CB  1 
+ATOM   43   C CG1 . ILE A 1 10  ? -0.348  -0.617 28.112 1.00 38.50 ? ? ? ? ? ? 85  ILE A CG1 1 
+ATOM   44   C CG2 . ILE A 1 10  ? 1.355   0.483  26.643 1.00 36.42 ? ? ? ? ? ? 85  ILE A CG2 1 
+ATOM   45   C CD1 . ILE A 1 10  ? -0.801  -1.634 27.093 1.00 42.64 ? ? ? ? ? ? 85  ILE A CD1 1 
+ATOM   46   N N   . VAL A 1 11  ? 2.329   3.019  27.911 1.00 34.69 ? ? ? ? ? ? 86  VAL A N   1 
+ATOM   47   C CA  . VAL A 1 11  ? 3.022   4.170  27.344 1.00 31.49 ? ? ? ? ? ? 86  VAL A CA  1 
+ATOM   48   C C   . VAL A 1 11  ? 4.164   3.694  26.461 1.00 31.07 ? ? ? ? ? ? 86  VAL A C   1 
+ATOM   49   O O   . VAL A 1 11  ? 4.579   2.534  26.530 1.00 27.78 ? ? ? ? ? ? 86  VAL A O   1 
+ATOM   50   C CB  . VAL A 1 11  ? 3.616   5.095  28.440 1.00 30.31 ? ? ? ? ? ? 86  VAL A CB  1 
+ATOM   51   C CG1 . VAL A 1 11  ? 2.510   5.682  29.289 1.00 27.82 ? ? ? ? ? ? 86  VAL A CG1 1 
+ATOM   52   C CG2 . VAL A 1 11  ? 4.595   4.316  29.304 1.00 28.63 ? ? ? ? ? ? 86  VAL A CG2 1 
+ATOM   53   N N   . VAL A 1 12  ? 4.668   4.597  25.629 1.00 30.20 ? ? ? ? ? ? 87  VAL A N   1 
+ATOM   54   C CA  . VAL A 1 12  ? 5.779   4.279  24.746 1.00 31.48 ? ? ? ? ? ? 87  VAL A CA  1 
+ATOM   55   C C   . VAL A 1 12  ? 6.949   5.211  25.054 1.00 29.88 ? ? ? ? ? ? 87  VAL A C   1 
+ATOM   56   O O   . VAL A 1 12  ? 6.750   6.390  25.329 1.00 28.48 ? ? ? ? ? ? 87  VAL A O   1 
+ATOM   57   C CB  . VAL A 1 12  ? 5.383   4.439  23.266 1.00 30.59 ? ? ? ? ? ? 87  VAL A CB  1 
+ATOM   58   C CG1 . VAL A 1 12  ? 4.841   5.835  23.020 1.00 33.37 ? ? ? ? ? ? 87  VAL A CG1 1 
+ATOM   59   C CG2 . VAL A 1 12  ? 6.590   4.171  22.379 1.00 32.04 ? ? ? ? ? ? 87  VAL A CG2 1 
+ATOM   60   N N   . ALA A 1 13  ? 8.162   4.669  25.010 1.00 31.06 ? ? ? ? ? ? 88  ALA A N   1 
+ATOM   61   C CA  . ALA A 1 13  ? 9.369   5.440  25.288 1.00 33.50 ? ? ? ? ? ? 88  ALA A CA  1 
+ATOM   62   C C   . ALA A 1 13  ? 9.725   6.397  24.151 1.00 34.65 ? ? ? ? ? ? 88  ALA A C   1 
+ATOM   63   O O   . ALA A 1 13  ? 9.947   5.971  23.016 1.00 35.81 ? ? ? ? ? ? 88  ALA A O   1 
+ATOM   64   C CB  . ALA A 1 13  ? 10.530  4.494  25.547 1.00 31.62 ? ? ? ? ? ? 88  ALA A CB  1 
+ATOM   65   N N   . LEU A 1 14  ? 9.791   7.687  24.473 1.00 34.33 ? ? ? ? ? ? 89  LEU A N   1 
+ATOM   66   C CA  . LEU A 1 14  ? 10.128  8.724  23.501 1.00 35.85 ? ? ? ? ? ? 89  LEU A CA  1 
+ATOM   67   C C   . LEU A 1 14  ? 11.635  8.848  23.262 1.00 35.36 ? ? ? ? ? ? 89  LEU A C   1 
+ATOM   68   O O   . LEU A 1 14  ? 12.059  9.477  22.292 1.00 36.91 ? ? ? ? ? ? 89  LEU A O   1 
+ATOM   69   C CB  . LEU A 1 14  ? 9.597   10.080 23.972 1.00 33.18 ? ? ? ? ? ? 89  LEU A CB  1 
+ATOM   70   C CG  . LEU A 1 14  ? 8.090   10.255 24.157 1.00 33.16 ? ? ? ? ? ? 89  LEU A CG  1 
+ATOM   71   C CD1 . LEU A 1 14  ? 7.828   11.619 24.770 1.00 30.41 ? ? ? ? ? ? 89  LEU A CD1 1 
+ATOM   72   C CD2 . LEU A 1 14  ? 7.362   10.103 22.820 1.00 33.68 ? ? ? ? ? ? 89  LEU A CD2 1 
+ATOM   73   N N   . TYR A 1 15  ? 12.435  8.263  24.150 1.00 34.87 ? ? ? ? ? ? 90  TYR A N   1 
+ATOM   74   C CA  . TYR A 1 15  ? 13.897  8.323  24.045 1.00 35.34 ? ? ? ? ? ? 90  TYR A CA  1 
+ATOM   75   C C   . TYR A 1 15  ? 14.479  7.079  24.698 1.00 34.67 ? ? ? ? ? ? 90  TYR A C   1 
+ATOM   76   O O   . TYR A 1 15  ? 13.766  6.325  25.362 1.00 35.13 ? ? ? ? ? ? 90  TYR A O   1 
+ATOM   77   C CB  . TYR A 1 15  ? 14.447  9.522  24.825 1.00 34.85 ? ? ? ? ? ? 90  TYR A CB  1 
+ATOM   78   C CG  . TYR A 1 15  ? 13.701  10.818 24.633 1.00 37.00 ? ? ? ? ? ? 90  TYR A CG  1 
+ATOM   79   C CD1 . TYR A 1 15  ? 13.845  11.573 23.471 1.00 37.27 ? ? ? ? ? ? 90  TYR A CD1 1 
+ATOM   80   C CD2 . TYR A 1 15  ? 12.838  11.285 25.621 1.00 36.75 ? ? ? ? ? ? 90  TYR A CD2 1 
+ATOM   81   C CE1 . TYR A 1 15  ? 13.144  12.766 23.302 1.00 37.86 ? ? ? ? ? ? 90  TYR A CE1 1 
+ATOM   82   C CE2 . TYR A 1 15  ? 12.135  12.469 25.461 1.00 39.51 ? ? ? ? ? ? 90  TYR A CE2 1 
+ATOM   83   C CZ  . TYR A 1 15  ? 12.291  13.205 24.302 1.00 38.69 ? ? ? ? ? ? 90  TYR A CZ  1 
+ATOM   84   O OH  . TYR A 1 15  ? 11.594  14.383 24.160 1.00 43.44 ? ? ? ? ? ? 90  TYR A OH  1 
+ATOM   85   N N   . ASP A 1 16  ? 15.780  6.873  24.517 1.00 35.19 ? ? ? ? ? ? 91  ASP A N   1 
+ATOM   86   C CA  . ASP A 1 16  ? 16.461  5.752  25.150 1.00 36.29 ? ? ? ? ? ? 91  ASP A CA  1 
+ATOM   87   C C   . ASP A 1 16  ? 16.757  6.233  26.568 1.00 36.32 ? ? ? ? ? ? 91  ASP A C   1 
+ATOM   88   O O   . ASP A 1 16  ? 16.833  7.433  26.810 1.00 35.87 ? ? ? ? ? ? 91  ASP A O   1 
+ATOM   89   C CB  . ASP A 1 16  ? 17.789  5.443  24.451 1.00 40.07 ? ? ? ? ? ? 91  ASP A CB  1 
+ATOM   90   C CG  . ASP A 1 16  ? 17.611  4.909  23.041 1.00 43.56 ? ? ? ? ? ? 91  ASP A CG  1 
+ATOM   91   O OD1 . ASP A 1 16  ? 18.639  4.672  22.375 1.00 46.78 ? ? ? ? ? ? 91  ASP A OD1 1 
+ATOM   92   O OD2 . ASP A 1 16  ? 16.460  4.720  22.597 1.00 46.84 ? ? ? ? ? ? 91  ASP A OD2 1 
+ATOM   93   N N   . TYR A 1 17  ? 16.915  5.312  27.508 1.00 36.46 ? ? ? ? ? ? 92  TYR A N   1 
+ATOM   94   C CA  . TYR A 1 17  ? 17.232  5.708  28.874 1.00 36.00 ? ? ? ? ? ? 92  TYR A CA  1 
+ATOM   95   C C   . TYR A 1 17  ? 18.064  4.631  29.541 1.00 37.61 ? ? ? ? ? ? 92  TYR A C   1 
+ATOM   96   O O   . TYR A 1 17  ? 17.676  3.465  29.558 1.00 36.97 ? ? ? ? ? ? 92  TYR A O   1 
+ATOM   97   C CB  . TYR A 1 17  ? 15.962  5.946  29.694 1.00 34.09 ? ? ? ? ? ? 92  TYR A CB  1 
+ATOM   98   C CG  . TYR A 1 17  ? 16.261  6.309  31.133 1.00 35.24 ? ? ? ? ? ? 92  TYR A CG  1 
+ATOM   99   C CD1 . TYR A 1 17  ? 16.926  7.492  31.448 1.00 37.65 ? ? ? ? ? ? 92  TYR A CD1 1 
+ATOM   100  C CD2 . TYR A 1 17  ? 15.941  5.440  32.173 1.00 35.48 ? ? ? ? ? ? 92  TYR A CD2 1 
+ATOM   101  C CE1 . TYR A 1 17  ? 17.269  7.798  32.765 1.00 38.85 ? ? ? ? ? ? 92  TYR A CE1 1 
+ATOM   102  C CE2 . TYR A 1 17  ? 16.280  5.737  33.492 1.00 36.72 ? ? ? ? ? ? 92  TYR A CE2 1 
+ATOM   103  C CZ  . TYR A 1 17  ? 16.944  6.915  33.779 1.00 37.60 ? ? ? ? ? ? 92  TYR A CZ  1 
+ATOM   104  O OH  . TYR A 1 17  ? 17.292  7.210  35.078 1.00 42.53 ? ? ? ? ? ? 92  TYR A OH  1 
+ATOM   105  N N   . GLU A 1 18  ? 19.215  5.018  30.079 1.00 38.99 ? ? ? ? ? ? 93  GLU A N   1 
+ATOM   106  C CA  . GLU A 1 18  ? 20.077  4.059  30.753 1.00 42.62 ? ? ? ? ? ? 93  GLU A CA  1 
+ATOM   107  C C   . GLU A 1 18  ? 19.948  4.232  32.256 1.00 42.67 ? ? ? ? ? ? 93  GLU A C   1 
+ATOM   108  O O   . GLU A 1 18  ? 20.068  5.339  32.776 1.00 41.84 ? ? ? ? ? ? 93  GLU A O   1 
+ATOM   109  C CB  . GLU A 1 18  ? 21.538  4.251  30.338 1.00 45.96 ? ? ? ? ? ? 93  GLU A CB  1 
+ATOM   110  C CG  . GLU A 1 18  ? 22.490  3.277  31.017 1.00 52.30 ? ? ? ? ? ? 93  GLU A CG  1 
+ATOM   111  C CD  . GLU A 1 18  ? 23.926  3.412  30.534 1.00 56.09 ? ? ? ? ? ? 93  GLU A CD  1 
+ATOM   112  O OE1 . GLU A 1 18  ? 24.531  4.489  30.722 1.00 58.01 ? ? ? ? ? ? 93  GLU A OE1 1 
+ATOM   113  O OE2 . GLU A 1 18  ? 24.448  2.432  29.963 1.00 58.62 ? ? ? ? ? ? 93  GLU A OE2 1 
+ATOM   114  N N   . ALA A 1 19  ? 19.693  3.130  32.948 1.00 43.87 ? ? ? ? ? ? 94  ALA A N   1 
+ATOM   115  C CA  . ALA A 1 19  ? 19.548  3.158  34.393 1.00 45.92 ? ? ? ? ? ? 94  ALA A CA  1 
+ATOM   116  C C   . ALA A 1 19  ? 20.853  3.582  35.057 1.00 47.69 ? ? ? ? ? ? 94  ALA A C   1 
+ATOM   117  O O   . ALA A 1 19  ? 21.910  3.014  34.788 1.00 44.95 ? ? ? ? ? ? 94  ALA A O   1 
+ATOM   118  C CB  . ALA A 1 19  ? 19.133  1.784  34.897 1.00 44.26 ? ? ? ? ? ? 94  ALA A CB  1 
+ATOM   119  N N   . ILE A 1 20  ? 20.772  4.592  35.915 1.00 50.71 ? ? ? ? ? ? 95  ILE A N   1 
+ATOM   120  C CA  . ILE A 1 20  ? 21.940  5.074  36.633 1.00 55.05 ? ? ? ? ? ? 95  ILE A CA  1 
+ATOM   121  C C   . ILE A 1 20  ? 21.695  4.866  38.122 1.00 57.48 ? ? ? ? ? ? 95  ILE A C   1 
+ATOM   122  O O   . ILE A 1 20  ? 22.635  4.790  38.911 1.00 58.53 ? ? ? ? ? ? 95  ILE A O   1 
+ATOM   123  C CB  . ILE A 1 20  ? 22.210  6.577  36.354 1.00 56.23 ? ? ? ? ? ? 95  ILE A CB  1 
+ATOM   124  C CG1 . ILE A 1 20  ? 21.017  7.428  36.790 1.00 56.58 ? ? ? ? ? ? 95  ILE A CG1 1 
+ATOM   125  C CG2 . ILE A 1 20  ? 22.480  6.790  34.873 1.00 56.24 ? ? ? ? ? ? 95  ILE A CG2 1 
+ATOM   126  C CD1 . ILE A 1 20  ? 21.224  8.923  36.574 1.00 56.85 ? ? ? ? ? ? 95  ILE A CD1 1 
+ATOM   127  N N   . HIS A 1 21  ? 20.421  4.760  38.493 1.00 60.30 ? ? ? ? ? ? 96  HIS A N   1 
+ATOM   128  C CA  . HIS A 1 21  ? 20.032  4.555  39.885 1.00 61.59 ? ? ? ? ? ? 96  HIS A CA  1 
+ATOM   129  C C   . HIS A 1 21  ? 19.652  3.094  40.130 1.00 63.02 ? ? ? ? ? ? 96  HIS A C   1 
+ATOM   130  O O   . HIS A 1 21  ? 19.282  2.371  39.202 1.00 63.01 ? ? ? ? ? ? 96  HIS A O   1 
+ATOM   131  C CB  . HIS A 1 21  ? 18.856  5.470  40.245 1.00 60.97 ? ? ? ? ? ? 96  HIS A CB  1 
+ATOM   132  C CG  . HIS A 1 21  ? 19.120  6.923  39.991 1.00 62.42 ? ? ? ? ? ? 96  HIS A CG  1 
+ATOM   133  N ND1 . HIS A 1 21  ? 20.134  7.616  40.619 1.00 62.32 ? ? ? ? ? ? 96  HIS A ND1 1 
+ATOM   134  C CD2 . HIS A 1 21  ? 18.518  7.808  39.163 1.00 62.31 ? ? ? ? ? ? 96  HIS A CD2 1 
+ATOM   135  C CE1 . HIS A 1 21  ? 20.144  8.865  40.186 1.00 63.13 ? ? ? ? ? ? 96  HIS A CE1 1 
+ATOM   136  N NE2 . HIS A 1 21  ? 19.173  9.008  39.302 1.00 61.82 ? ? ? ? ? ? 96  HIS A NE2 1 
+ATOM   137  N N   . HIS A 1 22  ? 19.745  2.677  41.389 1.00 63.58 ? ? ? ? ? ? 97  HIS A N   1 
+ATOM   138  C CA  . HIS A 1 22  ? 19.443  1.310  41.810 1.00 64.78 ? ? ? ? ? ? 97  HIS A CA  1 
+ATOM   139  C C   . HIS A 1 22  ? 18.144  0.693  41.275 1.00 64.19 ? ? ? ? ? ? 97  HIS A C   1 
+ATOM   140  O O   . HIS A 1 22  ? 18.165  -0.377 40.659 1.00 63.54 ? ? ? ? ? ? 97  HIS A O   1 
+ATOM   141  C CB  . HIS A 1 22  ? 19.435  1.242  43.340 1.00 66.65 ? ? ? ? ? ? 97  HIS A CB  1 
+ATOM   142  C CG  . HIS A 1 22  ? 19.091  -0.110 43.882 1.00 69.91 ? ? ? ? ? ? 97  HIS A CG  1 
+ATOM   143  N ND1 . HIS A 1 22  ? 19.840  -1.234 43.612 1.00 71.18 ? ? ? ? ? ? 97  HIS A ND1 1 
+ATOM   144  C CD2 . HIS A 1 22  ? 18.070  -0.520 44.674 1.00 70.93 ? ? ? ? ? ? 97  HIS A CD2 1 
+ATOM   145  C CE1 . HIS A 1 22  ? 19.298  -2.279 44.212 1.00 72.26 ? ? ? ? ? ? 97  HIS A CE1 1 
+ATOM   146  N NE2 . HIS A 1 22  ? 18.222  -1.872 44.863 1.00 72.48 ? ? ? ? ? ? 97  HIS A NE2 1 
+ATOM   147  N N   . GLU A 1 23  ? 17.020  1.356  41.521 1.00 63.07 ? ? ? ? ? ? 98  GLU A N   1 
+ATOM   148  C CA  . GLU A 1 23  ? 15.721  0.852  41.079 1.00 62.06 ? ? ? ? ? ? 98  GLU A CA  1 
+ATOM   149  C C   . GLU A 1 23  ? 15.320  1.309  39.674 1.00 59.39 ? ? ? ? ? ? 98  GLU A C   1 
+ATOM   150  O O   . GLU A 1 23  ? 14.177  1.124  39.253 1.00 57.96 ? ? ? ? ? ? 98  GLU A O   1 
+ATOM   151  C CB  . GLU A 1 23  ? 14.650  1.268  42.085 1.00 64.63 ? ? ? ? ? ? 98  GLU A CB  1 
+ATOM   152  C CG  . GLU A 1 23  ? 14.881  0.722  43.485 1.00 68.33 ? ? ? ? ? ? 98  GLU A CG  1 
+ATOM   153  C CD  . GLU A 1 23  ? 13.877  1.257  44.488 1.00 72.77 ? ? ? ? ? ? 98  GLU A CD  1 
+ATOM   154  O OE1 . GLU A 1 23  ? 13.899  2.479  44.764 1.00 72.46 ? ? ? ? ? ? 98  GLU A OE1 1 
+ATOM   155  O OE2 . GLU A 1 23  ? 13.060  0.457  44.994 1.00 74.85 ? ? ? ? ? ? 98  GLU A OE2 1 
+ATOM   156  N N   . ASP A 1 24  ? 16.263  1.904  38.952 1.00 56.28 ? ? ? ? ? ? 99  ASP A N   1 
+ATOM   157  C CA  . ASP A 1 24  ? 16.014  2.378  37.596 1.00 52.13 ? ? ? ? ? ? 99  ASP A CA  1 
+ATOM   158  C C   . ASP A 1 24  ? 15.701  1.255  36.622 1.00 50.96 ? ? ? ? ? ? 99  ASP A C   1 
+ATOM   159  O O   . ASP A 1 24  ? 16.193  0.134  36.760 1.00 52.38 ? ? ? ? ? ? 99  ASP A O   1 
+ATOM   160  C CB  . ASP A 1 24  ? 17.226  3.155  37.084 1.00 51.87 ? ? ? ? ? ? 99  ASP A CB  1 
+ATOM   161  C CG  . ASP A 1 24  ? 17.211  4.603  37.504 1.00 51.68 ? ? ? ? ? ? 99  ASP A CG  1 
+ATOM   162  O OD1 . ASP A 1 24  ? 16.583  4.910  38.538 1.00 52.27 ? ? ? ? ? ? 99  ASP A OD1 1 
+ATOM   163  O OD2 . ASP A 1 24  ? 17.845  5.428  36.807 1.00 48.20 ? ? ? ? ? ? 99  ASP A OD2 1 
+ATOM   164  N N   . LEU A 1 25  ? 14.878  1.569  35.631 1.00 48.34 ? ? ? ? ? ? 100 LEU A N   1 
+ATOM   165  C CA  . LEU A 1 25  ? 14.513  0.604  34.610 1.00 44.41 ? ? ? ? ? ? 100 LEU A CA  1 
+ATOM   166  C C   . LEU A 1 25  ? 15.020  1.208  33.307 1.00 43.33 ? ? ? ? ? ? 100 LEU A C   1 
+ATOM   167  O O   . LEU A 1 25  ? 14.627  2.313  32.933 1.00 40.90 ? ? ? ? ? ? 100 LEU A O   1 
+ATOM   168  C CB  . LEU A 1 25  ? 12.991  0.430  34.560 1.00 44.99 ? ? ? ? ? ? 100 LEU A CB  1 
+ATOM   169  C CG  . LEU A 1 25  ? 12.403  -0.751 33.778 1.00 42.66 ? ? ? ? ? ? 100 LEU A CG  1 
+ATOM   170  C CD1 . LEU A 1 25  ? 10.891  -0.683 33.832 1.00 44.47 ? ? ? ? ? ? 100 LEU A CD1 1 
+ATOM   171  C CD2 . LEU A 1 25  ? 12.870  -0.731 32.345 1.00 45.53 ? ? ? ? ? ? 100 LEU A CD2 1 
+ATOM   172  N N   . SER A 1 26  ? 15.914  0.497  32.628 1.00 43.53 ? ? ? ? ? ? 101 SER A N   1 
+ATOM   173  C CA  . SER A 1 26  ? 16.458  0.984  31.366 1.00 42.17 ? ? ? ? ? ? 101 SER A CA  1 
+ATOM   174  C C   . SER A 1 26  ? 15.539  0.577  30.224 1.00 40.58 ? ? ? ? ? ? 101 SER A C   1 
+ATOM   175  O O   . SER A 1 26  ? 14.941  -0.497 30.250 1.00 41.76 ? ? ? ? ? ? 101 SER A O   1 
+ATOM   176  C CB  . SER A 1 26  ? 17.856  0.408  31.123 1.00 42.86 ? ? ? ? ? ? 101 SER A CB  1 
+ATOM   177  O OG  . SER A 1 26  ? 18.747  0.762  32.166 1.00 44.85 ? ? ? ? ? ? 101 SER A OG  1 
+ATOM   178  N N   . PHE A 1 27  ? 15.425  1.444  29.226 1.00 37.21 ? ? ? ? ? ? 102 PHE A N   1 
+ATOM   179  C CA  . PHE A 1 27  ? 14.593  1.168  28.069 1.00 34.66 ? ? ? ? ? ? 102 PHE A CA  1 
+ATOM   180  C C   . PHE A 1 27  ? 15.129  1.914  26.858 1.00 37.23 ? ? ? ? ? ? 102 PHE A C   1 
+ATOM   181  O O   . PHE A 1 27  ? 15.856  2.896  26.990 1.00 35.65 ? ? ? ? ? ? 102 PHE A O   1 
+ATOM   182  C CB  . PHE A 1 27  ? 13.135  1.556  28.359 1.00 30.36 ? ? ? ? ? ? 102 PHE A CB  1 
+ATOM   183  C CG  . PHE A 1 27  ? 12.950  2.990  28.780 1.00 27.41 ? ? ? ? ? ? 102 PHE A CG  1 
+ATOM   184  C CD1 . PHE A 1 27  ? 12.989  4.021  27.848 1.00 28.02 ? ? ? ? ? ? 102 PHE A CD1 1 
+ATOM   185  C CD2 . PHE A 1 27  ? 12.727  3.305  30.119 1.00 26.95 ? ? ? ? ? ? 102 PHE A CD2 1 
+ATOM   186  C CE1 . PHE A 1 27  ? 12.804  5.353  28.243 1.00 26.97 ? ? ? ? ? ? 102 PHE A CE1 1 
+ATOM   187  C CE2 . PHE A 1 27  ? 12.542  4.630  30.527 1.00 22.91 ? ? ? ? ? ? 102 PHE A CE2 1 
+ATOM   188  C CZ  . PHE A 1 27  ? 12.579  5.654  29.588 1.00 24.41 ? ? ? ? ? ? 102 PHE A CZ  1 
+ATOM   189  N N   . GLN A 1 28  ? 14.790  1.430  25.672 1.00 40.15 ? ? ? ? ? ? 103 GLN A N   1 
+ATOM   190  C CA  . GLN A 1 28  ? 15.252  2.071  24.457 1.00 39.70 ? ? ? ? ? ? 103 GLN A CA  1 
+ATOM   191  C C   . GLN A 1 28  ? 14.021  2.665  23.779 1.00 39.87 ? ? ? ? ? ? 103 GLN A C   1 
+ATOM   192  O O   . GLN A 1 28  ? 12.912  2.154  23.943 1.00 36.73 ? ? ? ? ? ? 103 GLN A O   1 
+ATOM   193  C CB  . GLN A 1 28  ? 15.963  1.038  23.577 1.00 45.83 ? ? ? ? ? ? 103 GLN A CB  1 
+ATOM   194  C CG  . GLN A 1 28  ? 16.896  1.633  22.530 1.00 53.12 ? ? ? ? ? ? 103 GLN A CG  1 
+ATOM   195  C CD  . GLN A 1 28  ? 17.974  0.650  22.092 1.00 57.56 ? ? ? ? ? ? 103 GLN A CD  1 
+ATOM   196  O OE1 . GLN A 1 28  ? 17.677  -0.427 21.573 1.00 60.41 ? ? ? ? ? ? 103 GLN A OE1 1 
+ATOM   197  N NE2 . GLN A 1 28  ? 19.236  1.019  22.310 1.00 57.53 ? ? ? ? ? ? 103 GLN A NE2 1 
+ATOM   198  N N   . LYS A 1 29  ? 14.211  3.763  23.053 1.00 37.71 ? ? ? ? ? ? 104 LYS A N   1 
+ATOM   199  C CA  . LYS A 1 29  ? 13.108  4.440  22.381 1.00 40.24 ? ? ? ? ? ? 104 LYS A CA  1 
+ATOM   200  C C   . LYS A 1 29  ? 12.163  3.456  21.706 1.00 39.27 ? ? ? ? ? ? 104 LYS A C   1 
+ATOM   201  O O   . LYS A 1 29  ? 12.594  2.454  21.135 1.00 39.16 ? ? ? ? ? ? 104 LYS A O   1 
+ATOM   202  C CB  . LYS A 1 29  ? 13.647  5.436  21.350 1.00 40.10 ? ? ? ? ? ? 104 LYS A CB  1 
+ATOM   203  C CG  . LYS A 1 29  ? 12.571  6.248  20.659 1.00 41.56 ? ? ? ? ? ? 104 LYS A CG  1 
+ATOM   204  C CD  . LYS A 1 29  ? 13.176  7.284  19.731 1.00 44.35 ? ? ? ? ? ? 104 LYS A CD  1 
+ATOM   205  C CE  . LYS A 1 29  ? 12.098  8.137  19.081 1.00 45.99 ? ? ? ? ? ? 104 LYS A CE  1 
+ATOM   206  N NZ  . LYS A 1 29  ? 12.680  9.165  18.170 1.00 46.99 ? ? ? ? ? ? 104 LYS A NZ  1 
+ATOM   207  N N   . GLY A 1 30  ? 10.870  3.749  21.783 1.00 41.17 ? ? ? ? ? ? 105 GLY A N   1 
+ATOM   208  C CA  . GLY A 1 30  ? 9.879   2.882  21.179 1.00 42.10 ? ? ? ? ? ? 105 GLY A CA  1 
+ATOM   209  C C   . GLY A 1 30  ? 9.289   1.833  22.110 1.00 41.77 ? ? ? ? ? ? 105 GLY A C   1 
+ATOM   210  O O   . GLY A 1 30  ? 8.092   1.566  22.040 1.00 43.81 ? ? ? ? ? ? 105 GLY A O   1 
+ATOM   211  N N   . ASP A 1 31  ? 10.103  1.240  22.983 1.00 41.11 ? ? ? ? ? ? 106 ASP A N   1 
+ATOM   212  C CA  . ASP A 1 31  ? 9.600   0.207  23.892 1.00 41.68 ? ? ? ? ? ? 106 ASP A CA  1 
+ATOM   213  C C   . ASP A 1 31  ? 8.353   0.683  24.623 1.00 38.60 ? ? ? ? ? ? 106 ASP A C   1 
+ATOM   214  O O   . ASP A 1 31  ? 8.242   1.856  24.974 1.00 40.05 ? ? ? ? ? ? 106 ASP A O   1 
+ATOM   215  C CB  . ASP A 1 31  ? 10.643  -0.189 24.943 1.00 41.68 ? ? ? ? ? ? 106 ASP A CB  1 
+ATOM   216  C CG  . ASP A 1 31  ? 11.984  -0.550 24.343 1.00 47.29 ? ? ? ? ? ? 106 ASP A CG  1 
+ATOM   217  O OD1 . ASP A 1 31  ? 12.025  -1.122 23.232 1.00 46.79 ? ? ? ? ? ? 106 ASP A OD1 1 
+ATOM   218  O OD2 . ASP A 1 31  ? 13.006  -0.282 25.011 1.00 46.82 ? ? ? ? ? ? 106 ASP A OD2 1 
+ATOM   219  N N   . GLN A 1 32  ? 7.417   -0.232 24.856 1.00 38.75 ? ? ? ? ? ? 107 GLN A N   1 
+ATOM   220  C CA  . GLN A 1 32  ? 6.181   0.101  25.560 1.00 34.83 ? ? ? ? ? ? 107 GLN A CA  1 
+ATOM   221  C C   . GLN A 1 32  ? 6.196   -0.453 26.976 1.00 33.37 ? ? ? ? ? ? 107 GLN A C   1 
+ATOM   222  O O   . GLN A 1 32  ? 6.695   -1.555 27.216 1.00 32.05 ? ? ? ? ? ? 107 GLN A O   1 
+ATOM   223  C CB  . GLN A 1 32  ? 4.972   -0.433 24.796 1.00 36.28 ? ? ? ? ? ? 107 GLN A CB  1 
+ATOM   224  C CG  . GLN A 1 32  ? 4.716   0.315  23.498 1.00 37.97 ? ? ? ? ? ? 107 GLN A CG  1 
+ATOM   225  C CD  . GLN A 1 32  ? 3.521   -0.219 22.733 1.00 36.35 ? ? ? ? ? ? 107 GLN A CD  1 
+ATOM   226  O OE1 . GLN A 1 32  ? 2.404   -0.263 23.247 1.00 37.70 ? ? ? ? ? ? 107 GLN A OE1 1 
+ATOM   227  N NE2 . GLN A 1 32  ? 3.754   -0.622 21.491 1.00 38.28 ? ? ? ? ? ? 107 GLN A NE2 1 
+ATOM   228  N N   . MET A 1 33  ? 5.641   0.320  27.905 1.00 32.28 ? ? ? ? ? ? 108 MET A N   1 
+ATOM   229  C CA  . MET A 1 33  ? 5.608   -0.055 29.316 1.00 30.78 ? ? ? ? ? ? 108 MET A CA  1 
+ATOM   230  C C   . MET A 1 33  ? 4.265   0.193  29.986 1.00 26.76 ? ? ? ? ? ? 108 MET A C   1 
+ATOM   231  O O   . MET A 1 33  ? 3.483   1.032  29.547 1.00 29.95 ? ? ? ? ? ? 108 MET A O   1 
+ATOM   232  C CB  . MET A 1 33  ? 6.694   0.719  30.074 1.00 31.18 ? ? ? ? ? ? 108 MET A CB  1 
+ATOM   233  C CG  . MET A 1 33  ? 8.114   0.291  29.736 1.00 28.81 ? ? ? ? ? ? 108 MET A CG  1 
+ATOM   234  S SD  . MET A 1 33  ? 9.353   1.517  30.215 1.00 29.93 ? ? ? ? ? ? 108 MET A SD  1 
+ATOM   235  C CE  . MET A 1 33  ? 8.961   2.819  29.081 1.00 25.56 ? ? ? ? ? ? 108 MET A CE  1 
+ATOM   236  N N   . VAL A 1 34  ? 4.018   -0.548 31.061 1.00 28.08 ? ? ? ? ? ? 109 VAL A N   1 
+ATOM   237  C CA  . VAL A 1 34  ? 2.800   -0.421 31.854 1.00 26.73 ? ? ? ? ? ? 109 VAL A CA  1 
+ATOM   238  C C   . VAL A 1 34  ? 3.133   0.448  33.071 1.00 27.23 ? ? ? ? ? ? 109 VAL A C   1 
+ATOM   239  O O   . VAL A 1 34  ? 4.143   0.222  33.734 1.00 27.51 ? ? ? ? ? ? 109 VAL A O   1 
+ATOM   240  C CB  . VAL A 1 34  ? 2.322   -1.795 32.370 1.00 27.03 ? ? ? ? ? ? 109 VAL A CB  1 
+ATOM   241  C CG1 . VAL A 1 34  ? 1.071   -1.623 33.223 1.00 24.38 ? ? ? ? ? ? 109 VAL A CG1 1 
+ATOM   242  C CG2 . VAL A 1 34  ? 2.045   -2.731 31.195 1.00 34.35 ? ? ? ? ? ? 109 VAL A CG2 1 
+ATOM   243  N N   . VAL A 1 35  ? 2.289   1.431  33.368 1.00 28.59 ? ? ? ? ? ? 110 VAL A N   1 
+ATOM   244  C CA  . VAL A 1 35  ? 2.522   2.310  34.514 1.00 29.57 ? ? ? ? ? ? 110 VAL A CA  1 
+ATOM   245  C C   . VAL A 1 35  ? 1.962   1.724  35.815 1.00 29.27 ? ? ? ? ? ? 110 VAL A C   1 
+ATOM   246  O O   . VAL A 1 35  ? 0.766   1.440  35.910 1.00 30.35 ? ? ? ? ? ? 110 VAL A O   1 
+ATOM   247  C CB  . VAL A 1 35  ? 1.889   3.696  34.284 1.00 30.69 ? ? ? ? ? ? 110 VAL A CB  1 
+ATOM   248  C CG1 . VAL A 1 35  ? 2.107   4.571  35.505 1.00 27.01 ? ? ? ? ? ? 110 VAL A CG1 1 
+ATOM   249  C CG2 . VAL A 1 35  ? 2.491   4.343  33.041 1.00 31.83 ? ? ? ? ? ? 110 VAL A CG2 1 
+ATOM   250  N N   . LEU A 1 36  ? 2.826   1.550  36.815 1.00 28.85 ? ? ? ? ? ? 111 LEU A N   1 
+ATOM   251  C CA  . LEU A 1 36  ? 2.401   0.989  38.098 1.00 30.67 ? ? ? ? ? ? 111 LEU A CA  1 
+ATOM   252  C C   . LEU A 1 36  ? 2.126   2.060  39.150 1.00 33.88 ? ? ? ? ? ? 111 LEU A C   1 
+ATOM   253  O O   . LEU A 1 36  ? 1.167   1.955  39.910 1.00 32.75 ? ? ? ? ? ? 111 LEU A O   1 
+ATOM   254  C CB  . LEU A 1 36  ? 3.452   0.024  38.641 1.00 29.69 ? ? ? ? ? ? 111 LEU A CB  1 
+ATOM   255  C CG  . LEU A 1 36  ? 4.001   -1.058 37.711 1.00 28.40 ? ? ? ? ? ? 111 LEU A CG  1 
+ATOM   256  C CD1 . LEU A 1 36  ? 4.770   -2.068 38.569 1.00 27.76 ? ? ? ? ? ? 111 LEU A CD1 1 
+ATOM   257  C CD2 . LEU A 1 36  ? 2.876   -1.754 36.955 1.00 31.48 ? ? ? ? ? ? 111 LEU A CD2 1 
+ATOM   258  N N   . GLU A 1 37  ? 2.987   3.072  39.207 1.00 35.09 ? ? ? ? ? ? 112 GLU A N   1 
+ATOM   259  C CA  . GLU A 1 37  ? 2.831   4.179  40.149 1.00 36.06 ? ? ? ? ? ? 112 GLU A CA  1 
+ATOM   260  C C   . GLU A 1 37  ? 3.113   5.449  39.377 1.00 37.76 ? ? ? ? ? ? 112 GLU A C   1 
+ATOM   261  O O   . GLU A 1 37  ? 4.098   5.532  38.644 1.00 32.94 ? ? ? ? ? ? 112 GLU A O   1 
+ATOM   262  C CB  . GLU A 1 37  ? 3.815   4.080  41.317 1.00 37.39 ? ? ? ? ? ? 112 GLU A CB  1 
+ATOM   263  C CG  . GLU A 1 37  ? 3.629   2.872  42.217 1.00 43.66 ? ? ? ? ? ? 112 GLU A CG  1 
+ATOM   264  C CD  . GLU A 1 37  ? 4.670   2.807  43.329 1.00 48.09 ? ? ? ? ? ? 112 GLU A CD  1 
+ATOM   265  O OE1 . GLU A 1 37  ? 4.674   1.806  44.081 1.00 51.07 ? ? ? ? ? ? 112 GLU A OE1 1 
+ATOM   266  O OE2 . GLU A 1 37  ? 5.480   3.756  43.450 1.00 44.57 ? ? ? ? ? ? 112 GLU A OE2 1 
+ATOM   267  N N   . GLU A 1 38  ? 2.246   6.436  39.548 1.00 39.43 ? ? ? ? ? ? 113 GLU A N   1 
+ATOM   268  C CA  . GLU A 1 38  ? 2.387   7.703  38.853 1.00 44.22 ? ? ? ? ? ? 113 GLU A CA  1 
+ATOM   269  C C   . GLU A 1 38  ? 2.798   8.760  39.881 1.00 45.95 ? ? ? ? ? ? 113 GLU A C   1 
+ATOM   270  O O   . GLU A 1 38  ? 2.070   9.718  40.138 1.00 47.48 ? ? ? ? ? ? 113 GLU A O   1 
+ATOM   271  C CB  . GLU A 1 38  ? 1.050   8.037  38.188 1.00 46.63 ? ? ? ? ? ? 113 GLU A CB  1 
+ATOM   272  C CG  . GLU A 1 38  ? 1.101   9.108  37.125 1.00 52.38 ? ? ? ? ? ? 113 GLU A CG  1 
+ATOM   273  C CD  . GLU A 1 38  ? -0.187  9.176  36.325 1.00 55.07 ? ? ? ? ? ? 113 GLU A CD  1 
+ATOM   274  O OE1 . GLU A 1 38  ? -0.534  8.175  35.659 1.00 55.80 ? ? ? ? ? ? 113 GLU A OE1 1 
+ATOM   275  O OE2 . GLU A 1 38  ? -0.855  10.229 36.362 1.00 60.95 ? ? ? ? ? ? 113 GLU A OE2 1 
+ATOM   276  N N   . SER A 1 39  ? 3.986   8.567  40.452 1.00 47.39 ? ? ? ? ? ? 114 SER A N   1 
+ATOM   277  C CA  . SER A 1 39  ? 4.537   9.445  41.482 1.00 49.04 ? ? ? ? ? ? 114 SER A CA  1 
+ATOM   278  C C   . SER A 1 39  ? 5.346   10.656 40.999 1.00 48.27 ? ? ? ? ? ? 114 SER A C   1 
+ATOM   279  O O   . SER A 1 39  ? 6.543   10.759 41.273 1.00 51.26 ? ? ? ? ? ? 114 SER A O   1 
+ATOM   280  C CB  . SER A 1 39  ? 5.412   8.621  42.434 1.00 52.89 ? ? ? ? ? ? 114 SER A CB  1 
+ATOM   281  O OG  . SER A 1 39  ? 4.691   7.538  43.000 1.00 57.97 ? ? ? ? ? ? 114 SER A OG  1 
+ATOM   282  N N   . GLY A 1 40  ? 4.700   11.572 40.288 1.00 45.70 ? ? ? ? ? ? 116 GLY A N   1 
+ATOM   283  C CA  . GLY A 1 40  ? 5.391   12.765 39.827 1.00 42.46 ? ? ? ? ? ? 116 GLY A CA  1 
+ATOM   284  C C   . GLY A 1 40  ? 6.474   12.618 38.771 1.00 40.60 ? ? ? ? ? ? 116 GLY A C   1 
+ATOM   285  O O   . GLY A 1 40  ? 6.242   12.079 37.690 1.00 39.85 ? ? ? ? ? ? 116 GLY A O   1 
+ATOM   286  N N   . GLU A 1 41  ? 7.670   13.102 39.094 1.00 38.51 ? ? ? ? ? ? 117 GLU A N   1 
+ATOM   287  C CA  . GLU A 1 41  ? 8.800   13.077 38.166 1.00 35.67 ? ? ? ? ? ? 117 GLU A CA  1 
+ATOM   288  C C   . GLU A 1 41  ? 9.235   11.669 37.773 1.00 32.76 ? ? ? ? ? ? 117 GLU A C   1 
+ATOM   289  O O   . GLU A 1 41  ? 9.690   11.441 36.652 1.00 31.67 ? ? ? ? ? ? 117 GLU A O   1 
+ATOM   290  C CB  . GLU A 1 41  ? 9.970   13.850 38.776 1.00 41.01 ? ? ? ? ? ? 117 GLU A CB  1 
+ATOM   291  C CG  . GLU A 1 41  ? 11.043  14.255 37.786 1.00 44.24 ? ? ? ? ? ? 117 GLU A CG  1 
+ATOM   292  C CD  . GLU A 1 41  ? 11.948  15.339 38.347 1.00 47.88 ? ? ? ? ? ? 117 GLU A CD  1 
+ATOM   293  O OE1 . GLU A 1 41  ? 12.714  15.059 39.298 1.00 47.58 ? ? ? ? ? ? 117 GLU A OE1 1 
+ATOM   294  O OE2 . GLU A 1 41  ? 11.869  16.482 37.843 1.00 46.83 ? ? ? ? ? ? 117 GLU A OE2 1 
+ATOM   295  N N   . TRP A 1 42  ? 9.108   10.731 38.704 1.00 29.96 ? ? ? ? ? ? 118 TRP A N   1 
+ATOM   296  C CA  . TRP A 1 42  ? 9.447   9.342  38.435 1.00 29.82 ? ? ? ? ? ? 118 TRP A CA  1 
+ATOM   297  C C   . TRP A 1 42  ? 8.205   8.476  38.550 1.00 30.69 ? ? ? ? ? ? 118 TRP A C   1 
+ATOM   298  O O   . TRP A 1 42  ? 7.371   8.680  39.438 1.00 30.12 ? ? ? ? ? ? 118 TRP A O   1 
+ATOM   299  C CB  . TRP A 1 42  ? 10.498  8.809  39.416 1.00 29.55 ? ? ? ? ? ? 118 TRP A CB  1 
+ATOM   300  C CG  . TRP A 1 42  ? 11.822  9.459  39.292 1.00 27.62 ? ? ? ? ? ? 118 TRP A CG  1 
+ATOM   301  C CD1 . TRP A 1 42  ? 12.194  10.673 39.795 1.00 28.09 ? ? ? ? ? ? 118 TRP A CD1 1 
+ATOM   302  C CD2 . TRP A 1 42  ? 12.944  8.965  38.555 1.00 27.54 ? ? ? ? ? ? 118 TRP A CD2 1 
+ATOM   303  N NE1 . TRP A 1 42  ? 13.484  10.965 39.415 1.00 28.45 ? ? ? ? ? ? 118 TRP A NE1 1 
+ATOM   304  C CE2 . TRP A 1 42  ? 13.966  9.936  38.651 1.00 28.22 ? ? ? ? ? ? 118 TRP A CE2 1 
+ATOM   305  C CE3 . TRP A 1 42  ? 13.184  7.796  37.818 1.00 27.52 ? ? ? ? ? ? 118 TRP A CE3 1 
+ATOM   306  C CZ2 . TRP A 1 42  ? 15.217  9.771  38.038 1.00 28.75 ? ? ? ? ? ? 118 TRP A CZ2 1 
+ATOM   307  C CZ3 . TRP A 1 42  ? 14.428  7.633  37.205 1.00 28.79 ? ? ? ? ? ? 118 TRP A CZ3 1 
+ATOM   308  C CH2 . TRP A 1 42  ? 15.428  8.620  37.321 1.00 28.51 ? ? ? ? ? ? 118 TRP A CH2 1 
+ATOM   309  N N   . TRP A 1 43  ? 8.089   7.513  37.642 1.00 27.86 ? ? ? ? ? ? 119 TRP A N   1 
+ATOM   310  C CA  . TRP A 1 43  ? 6.974   6.579  37.642 1.00 29.23 ? ? ? ? ? ? 119 TRP A CA  1 
+ATOM   311  C C   . TRP A 1 43  ? 7.520   5.168  37.766 1.00 28.43 ? ? ? ? ? ? 119 TRP A C   1 
+ATOM   312  O O   . TRP A 1 43  ? 8.601   4.865  37.260 1.00 30.10 ? ? ? ? ? ? 119 TRP A O   1 
+ATOM   313  C CB  . TRP A 1 43  ? 6.174   6.678  36.341 1.00 27.68 ? ? ? ? ? ? 119 TRP A CB  1 
+ATOM   314  C CG  . TRP A 1 43  ? 5.389   7.934  36.172 1.00 31.57 ? ? ? ? ? ? 119 TRP A CG  1 
+ATOM   315  C CD1 . TRP A 1 43  ? 5.365   9.015  37.007 1.00 32.31 ? ? ? ? ? ? 119 TRP A CD1 1 
+ATOM   316  C CD2 . TRP A 1 43  ? 4.499   8.238  35.095 1.00 30.83 ? ? ? ? ? ? 119 TRP A CD2 1 
+ATOM   317  N NE1 . TRP A 1 43  ? 4.511   9.973  36.516 1.00 29.13 ? ? ? ? ? ? 119 TRP A NE1 1 
+ATOM   318  C CE2 . TRP A 1 43  ? 3.967   9.522  35.345 1.00 31.85 ? ? ? ? ? ? 119 TRP A CE2 1 
+ATOM   319  C CE3 . TRP A 1 43  ? 4.098   7.548  33.944 1.00 33.26 ? ? ? ? ? ? 119 TRP A CE3 1 
+ATOM   320  C CZ2 . TRP A 1 43  ? 3.051   10.131 34.481 1.00 32.84 ? ? ? ? ? ? 119 TRP A CZ2 1 
+ATOM   321  C CZ3 . TRP A 1 43  ? 3.190   8.155  33.086 1.00 34.38 ? ? ? ? ? ? 119 TRP A CZ3 1 
+ATOM   322  C CH2 . TRP A 1 43  ? 2.676   9.436  33.362 1.00 33.25 ? ? ? ? ? ? 119 TRP A CH2 1 
+ATOM   323  N N   . LYS A 1 44  ? 6.782   4.306  38.451 1.00 28.41 ? ? ? ? ? ? 120 LYS A N   1 
+ATOM   324  C CA  . LYS A 1 44  ? 7.199   2.924  38.582 1.00 29.98 ? ? ? ? ? ? 120 LYS A CA  1 
+ATOM   325  C C   . LYS A 1 44  ? 6.518   2.250  37.401 1.00 28.62 ? ? ? ? ? ? 120 LYS A C   1 
+ATOM   326  O O   . LYS A 1 44  ? 5.310   2.380  37.226 1.00 26.36 ? ? ? ? ? ? 120 LYS A O   1 
+ATOM   327  C CB  . LYS A 1 44  ? 6.712   2.321  39.904 1.00 32.23 ? ? ? ? ? ? 120 LYS A CB  1 
+ATOM   328  C CG  . LYS A 1 44  ? 7.267   0.921  40.157 1.00 36.61 ? ? ? ? ? ? 120 LYS A CG  1 
+ATOM   329  C CD  . LYS A 1 44  ? 6.930   0.399  41.547 1.00 38.85 ? ? ? ? ? ? 120 LYS A CD  1 
+ATOM   330  C CE  . LYS A 1 44  ? 7.595   -0.955 41.792 1.00 42.51 ? ? ? ? ? ? 120 LYS A CE  1 
+ATOM   331  N NZ  . LYS A 1 44  ? 7.334   -1.486 43.162 1.00 42.00 ? ? ? ? ? ? 120 LYS A NZ  1 
+ATOM   332  N N   . ALA A 1 45  ? 7.294   1.558  36.576 1.00 29.39 ? ? ? ? ? ? 121 ALA A N   1 
+ATOM   333  C CA  . ALA A 1 45  ? 6.735   0.902  35.402 1.00 30.73 ? ? ? ? ? ? 121 ALA A CA  1 
+ATOM   334  C C   . ALA A 1 45  ? 7.155   -0.550 35.276 1.00 32.55 ? ? ? ? ? ? 121 ALA A C   1 
+ATOM   335  O O   . ALA A 1 45  ? 7.969   -1.054 36.055 1.00 30.55 ? ? ? ? ? ? 121 ALA A O   1 
+ATOM   336  C CB  . ALA A 1 45  ? 7.135   1.661  34.142 1.00 30.38 ? ? ? ? ? ? 121 ALA A CB  1 
+ATOM   337  N N   . ARG A 1 46  ? 6.588   -1.207 34.272 1.00 32.21 ? ? ? ? ? ? 122 ARG A N   1 
+ATOM   338  C CA  . ARG A 1 46  ? 6.857   -2.608 33.998 1.00 34.01 ? ? ? ? ? ? 122 ARG A CA  1 
+ATOM   339  C C   . ARG A 1 46  ? 7.136   -2.775 32.512 1.00 33.47 ? ? ? ? ? ? 122 ARG A C   1 
+ATOM   340  O O   . ARG A 1 46  ? 6.379   -2.296 31.677 1.00 31.42 ? ? ? ? ? ? 122 ARG A O   1 
+ATOM   341  C CB  . ARG A 1 46  ? 5.642   -3.447 34.390 1.00 37.44 ? ? ? ? ? ? 122 ARG A CB  1 
+ATOM   342  C CG  . ARG A 1 46  ? 5.743   -4.916 34.026 1.00 43.03 ? ? ? ? ? ? 122 ARG A CG  1 
+ATOM   343  C CD  . ARG A 1 46  ? 4.461   -5.649 34.385 1.00 40.41 ? ? ? ? ? ? 122 ARG A CD  1 
+ATOM   344  N NE  . ARG A 1 46  ? 4.167   -5.550 35.812 1.00 45.50 ? ? ? ? ? ? 122 ARG A NE  1 
+ATOM   345  C CZ  . ARG A 1 46  ? 3.091   -4.957 36.313 1.00 46.83 ? ? ? ? ? ? 122 ARG A CZ  1 
+ATOM   346  N NH1 . ARG A 1 46  ? 2.198   -4.405 35.499 1.00 48.08 ? ? ? ? ? ? 122 ARG A NH1 1 
+ATOM   347  N NH2 . ARG A 1 46  ? 2.884   -4.943 37.626 1.00 47.66 ? ? ? ? ? ? 122 ARG A NH2 1 
+ATOM   348  N N   . SER A 1 47  ? 8.227   -3.454 32.185 1.00 37.44 ? ? ? ? ? ? 123 SER A N   1 
+ATOM   349  C CA  . SER A 1 47  ? 8.584   -3.679 30.790 1.00 42.30 ? ? ? ? ? ? 123 SER A CA  1 
+ATOM   350  C C   . SER A 1 47  ? 7.759   -4.808 30.183 1.00 44.87 ? ? ? ? ? ? 123 SER A C   1 
+ATOM   351  O O   . SER A 1 47  ? 7.747   -5.922 30.706 1.00 44.72 ? ? ? ? ? ? 123 SER A O   1 
+ATOM   352  C CB  . SER A 1 47  ? 10.072  -4.026 30.672 1.00 43.18 ? ? ? ? ? ? 123 SER A CB  1 
+ATOM   353  O OG  . SER A 1 47  ? 10.415  -4.351 29.334 1.00 44.42 ? ? ? ? ? ? 123 SER A OG  1 
+ATOM   354  N N   . LEU A 1 48  ? 7.066   -4.515 29.085 1.00 47.41 ? ? ? ? ? ? 124 LEU A N   1 
+ATOM   355  C CA  . LEU A 1 48  ? 6.266   -5.524 28.400 1.00 49.82 ? ? ? ? ? ? 124 LEU A CA  1 
+ATOM   356  C C   . LEU A 1 48  ? 7.193   -6.558 27.772 1.00 53.82 ? ? ? ? ? ? 124 LEU A C   1 
+ATOM   357  O O   . LEU A 1 48  ? 6.757   -7.626 27.348 1.00 54.71 ? ? ? ? ? ? 124 LEU A O   1 
+ATOM   358  C CB  . LEU A 1 48  ? 5.402   -4.887 27.307 1.00 48.16 ? ? ? ? ? ? 124 LEU A CB  1 
+ATOM   359  C CG  . LEU A 1 48  ? 4.156   -4.098 27.711 1.00 45.76 ? ? ? ? ? ? 124 LEU A CG  1 
+ATOM   360  C CD1 . LEU A 1 48  ? 4.519   -2.998 28.680 1.00 48.82 ? ? ? ? ? ? 124 LEU A CD1 1 
+ATOM   361  C CD2 . LEU A 1 48  ? 3.505   -3.526 26.468 1.00 43.90 ? ? ? ? ? ? 124 LEU A CD2 1 
+ATOM   362  N N   . ALA A 1 49  ? 8.478   -6.229 27.709 1.00 56.29 ? ? ? ? ? ? 125 ALA A N   1 
+ATOM   363  C CA  . ALA A 1 49  ? 9.463   -7.133 27.135 1.00 57.66 ? ? ? ? ? ? 125 ALA A CA  1 
+ATOM   364  C C   . ALA A 1 49  ? 9.987   -8.090 28.201 1.00 58.58 ? ? ? ? ? ? 125 ALA A C   1 
+ATOM   365  O O   . ALA A 1 49  ? 9.558   -9.241 28.286 1.00 59.91 ? ? ? ? ? ? 125 ALA A O   1 
+ATOM   366  C CB  . ALA A 1 49  ? 10.614  -6.334 26.534 1.00 58.46 ? ? ? ? ? ? 125 ALA A CB  1 
+ATOM   367  N N   . THR A 1 50  ? 10.907  -7.598 29.022 1.00 59.72 ? ? ? ? ? ? 126 THR A N   1 
+ATOM   368  C CA  . THR A 1 50  ? 11.515  -8.396 30.080 1.00 60.28 ? ? ? ? ? ? 126 THR A CA  1 
+ATOM   369  C C   . THR A 1 50  ? 10.619  -8.533 31.304 1.00 59.30 ? ? ? ? ? ? 126 THR A C   1 
+ATOM   370  O O   . THR A 1 50  ? 11.006  -9.154 32.295 1.00 57.97 ? ? ? ? ? ? 126 THR A O   1 
+ATOM   371  C CB  . THR A 1 50  ? 12.846  -7.770 30.537 1.00 61.26 ? ? ? ? ? ? 126 THR A CB  1 
+ATOM   372  O OG1 . THR A 1 50  ? 12.597  -6.473 31.095 1.00 61.67 ? ? ? ? ? ? 126 THR A OG1 1 
+ATOM   373  C CG2 . THR A 1 50  ? 13.796  -7.628 29.359 1.00 61.98 ? ? ? ? ? ? 126 THR A CG2 1 
+ATOM   374  N N   . ARG A 1 51  ? 9.424   -7.956 31.234 1.00 59.62 ? ? ? ? ? ? 127 ARG A N   1 
+ATOM   375  C CA  . ARG A 1 51  ? 8.493   -7.998 32.355 1.00 58.74 ? ? ? ? ? ? 127 ARG A CA  1 
+ATOM   376  C C   . ARG A 1 51  ? 9.112   -7.449 33.628 1.00 56.83 ? ? ? ? ? ? 127 ARG A C   1 
+ATOM   377  O O   . ARG A 1 51  ? 8.579   -7.649 34.720 1.00 56.32 ? ? ? ? ? ? 127 ARG A O   1 
+ATOM   378  C CB  . ARG A 1 51  ? 8.000   -9.425 32.603 1.00 62.05 ? ? ? ? ? ? 127 ARG A CB  1 
+ATOM   379  C CG  . ARG A 1 51  ? 6.875   -9.847 31.680 1.00 65.69 ? ? ? ? ? ? 127 ARG A CG  1 
+ATOM   380  C CD  . ARG A 1 51  ? 5.665   -8.936 31.875 1.00 70.08 ? ? ? ? ? ? 127 ARG A CD  1 
+ATOM   381  N NE  . ARG A 1 51  ? 4.530   -9.320 31.039 1.00 73.85 ? ? ? ? ? ? 127 ARG A NE  1 
+ATOM   382  C CZ  . ARG A 1 51  ? 4.564   -9.385 29.712 1.00 74.78 ? ? ? ? ? ? 127 ARG A CZ  1 
+ATOM   383  N NH1 . ARG A 1 51  ? 5.679   -9.088 29.061 1.00 75.74 ? ? ? ? ? ? 127 ARG A NH1 1 
+ATOM   384  N NH2 . ARG A 1 51  ? 3.482   -9.745 29.033 1.00 75.75 ? ? ? ? ? ? 127 ARG A NH2 1 
+ATOM   385  N N   . LYS A 1 52  ? 10.237  -6.755 33.492 1.00 53.42 ? ? ? ? ? ? 128 LYS A N   1 
+ATOM   386  C CA  . LYS A 1 52  ? 10.895  -6.189 34.659 1.00 51.16 ? ? ? ? ? ? 128 LYS A CA  1 
+ATOM   387  C C   . LYS A 1 52  ? 10.237  -4.886 35.095 1.00 47.04 ? ? ? ? ? ? 128 LYS A C   1 
+ATOM   388  O O   . LYS A 1 52  ? 9.660   -4.161 34.285 1.00 43.08 ? ? ? ? ? ? 128 LYS A O   1 
+ATOM   389  C CB  . LYS A 1 52  ? 12.386  -5.969 34.387 1.00 53.49 ? ? ? ? ? ? 128 LYS A CB  1 
+ATOM   390  C CG  . LYS A 1 52  ? 13.151  -5.392 35.580 1.00 57.21 ? ? ? ? ? ? 128 LYS A CG  1 
+ATOM   391  C CD  . LYS A 1 52  ? 12.784  -6.097 36.893 1.00 60.48 ? ? ? ? ? ? 128 LYS A CD  1 
+ATOM   392  C CE  . LYS A 1 52  ? 13.005  -7.604 36.830 1.00 62.93 ? ? ? ? ? ? 128 LYS A CE  1 
+ATOM   393  N NZ  . LYS A 1 52  ? 12.573  -8.274 38.090 1.00 63.07 ? ? ? ? ? ? 128 LYS A NZ  1 
+ATOM   394  N N   . GLU A 1 53  ? 10.328  -4.601 36.388 1.00 45.96 ? ? ? ? ? ? 129 GLU A N   1 
+ATOM   395  C CA  . GLU A 1 53  ? 9.730   -3.404 36.951 1.00 43.60 ? ? ? ? ? ? 129 GLU A CA  1 
+ATOM   396  C C   . GLU A 1 53  ? 10.797  -2.491 37.537 1.00 41.53 ? ? ? ? ? ? 129 GLU A C   1 
+ATOM   397  O O   . GLU A 1 53  ? 11.820  -2.955 38.043 1.00 41.05 ? ? ? ? ? ? 129 GLU A O   1 
+ATOM   398  C CB  . GLU A 1 53  ? 8.716   -3.800 38.025 1.00 44.33 ? ? ? ? ? ? 129 GLU A CB  1 
+ATOM   399  C CG  . GLU A 1 53  ? 7.702   -4.823 37.526 1.00 49.93 ? ? ? ? ? ? 129 GLU A CG  1 
+ATOM   400  C CD  . GLU A 1 53  ? 6.671   -5.207 38.568 1.00 52.79 ? ? ? ? ? ? 129 GLU A CD  1 
+ATOM   401  O OE1 . GLU A 1 53  ? 7.066   -5.602 39.683 1.00 57.09 ? ? ? ? ? ? 129 GLU A OE1 1 
+ATOM   402  O OE2 . GLU A 1 53  ? 5.463   -5.128 38.267 1.00 56.77 ? ? ? ? ? ? 129 GLU A OE2 1 
+ATOM   403  N N   . GLY A 1 54  ? 10.547  -1.188 37.454 1.00 37.50 ? ? ? ? ? ? 130 GLY A N   1 
+ATOM   404  C CA  . GLY A 1 54  ? 11.479  -0.204 37.972 1.00 34.21 ? ? ? ? ? ? 130 GLY A CA  1 
+ATOM   405  C C   . GLY A 1 54  ? 10.943  1.202  37.774 1.00 32.56 ? ? ? ? ? ? 130 GLY A C   1 
+ATOM   406  O O   . GLY A 1 54  ? 9.857   1.384  37.215 1.00 31.59 ? ? ? ? ? ? 130 GLY A O   1 
+ATOM   407  N N   . TYR A 1 55  ? 11.690  2.202  38.233 1.00 27.16 ? ? ? ? ? ? 131 TYR A N   1 
+ATOM   408  C CA  . TYR A 1 55  ? 11.262  3.588  38.087 1.00 29.35 ? ? ? ? ? ? 131 TYR A CA  1 
+ATOM   409  C C   . TYR A 1 55  ? 11.823  4.187  36.808 1.00 26.19 ? ? ? ? ? ? 131 TYR A C   1 
+ATOM   410  O O   . TYR A 1 55  ? 12.963  3.918  36.440 1.00 27.68 ? ? ? ? ? ? 131 TYR A O   1 
+ATOM   411  C CB  . TYR A 1 55  ? 11.712  4.404  39.299 1.00 33.03 ? ? ? ? ? ? 131 TYR A CB  1 
+ATOM   412  C CG  . TYR A 1 55  ? 11.035  3.974  40.580 1.00 36.29 ? ? ? ? ? ? 131 TYR A CG  1 
+ATOM   413  C CD1 . TYR A 1 55  ? 9.692   4.274  40.817 1.00 39.72 ? ? ? ? ? ? 131 TYR A CD1 1 
+ATOM   414  C CD2 . TYR A 1 55  ? 11.724  3.234  41.539 1.00 39.16 ? ? ? ? ? ? 131 TYR A CD2 1 
+ATOM   415  C CE1 . TYR A 1 55  ? 9.050   3.847  41.981 1.00 40.43 ? ? ? ? ? ? 131 TYR A CE1 1 
+ATOM   416  C CE2 . TYR A 1 55  ? 11.093  2.800  42.705 1.00 41.97 ? ? ? ? ? ? 131 TYR A CE2 1 
+ATOM   417  C CZ  . TYR A 1 55  ? 9.756   3.108  42.918 1.00 42.45 ? ? ? ? ? ? 131 TYR A CZ  1 
+ATOM   418  O OH  . TYR A 1 55  ? 9.119   2.658  44.056 1.00 45.56 ? ? ? ? ? ? 131 TYR A OH  1 
+ATOM   419  N N   . ILE A 1 56  ? 11.007  4.994  36.135 1.00 25.50 ? ? ? ? ? ? 132 ILE A N   1 
+ATOM   420  C CA  . ILE A 1 56  ? 11.395  5.641  34.884 1.00 22.51 ? ? ? ? ? ? 132 ILE A CA  1 
+ATOM   421  C C   . ILE A 1 56  ? 11.040  7.123  34.945 1.00 21.76 ? ? ? ? ? ? 132 ILE A C   1 
+ATOM   422  O O   . ILE A 1 56  ? 10.174  7.525  35.723 1.00 22.68 ? ? ? ? ? ? 132 ILE A O   1 
+ATOM   423  C CB  . ILE A 1 56  ? 10.638  5.042  33.688 1.00 24.59 ? ? ? ? ? ? 132 ILE A CB  1 
+ATOM   424  C CG1 . ILE A 1 56  ? 9.129   5.291  33.855 1.00 25.52 ? ? ? ? ? ? 132 ILE A CG1 1 
+ATOM   425  C CG2 . ILE A 1 56  ? 10.945  3.555  33.580 1.00 26.72 ? ? ? ? ? ? 132 ILE A CG2 1 
+ATOM   426  C CD1 . ILE A 1 56  ? 8.277   4.849  32.676 1.00 25.75 ? ? ? ? ? ? 132 ILE A CD1 1 
+ATOM   427  N N   . PRO A 1 57  ? 11.721  7.958  34.138 1.00 22.49 ? ? ? ? ? ? 133 PRO A N   1 
+ATOM   428  C CA  . PRO A 1 57  ? 11.486  9.405  34.076 1.00 20.96 ? ? ? ? ? ? 133 PRO A CA  1 
+ATOM   429  C C   . PRO A 1 57  ? 10.140  9.620  33.398 1.00 22.88 ? ? ? ? ? ? 133 PRO A C   1 
+ATOM   430  O O   . PRO A 1 57  ? 9.963   9.199  32.263 1.00 22.46 ? ? ? ? ? ? 133 PRO A O   1 
+ATOM   431  C CB  . PRO A 1 57  ? 12.632  9.894  33.189 1.00 22.15 ? ? ? ? ? ? 133 PRO A CB  1 
+ATOM   432  C CG  . PRO A 1 57  ? 13.689  8.812  33.361 1.00 24.09 ? ? ? ? ? ? 133 PRO A CG  1 
+ATOM   433  C CD  . PRO A 1 57  ? 12.819  7.604  33.225 1.00 21.64 ? ? ? ? ? ? 133 PRO A CD  1 
+ATOM   434  N N   . SER A 1 58  ? 9.199   10.280 34.068 1.00 24.77 ? ? ? ? ? ? 134 SER A N   1 
+ATOM   435  C CA  . SER A 1 58  ? 7.879   10.486 33.469 1.00 28.42 ? ? ? ? ? ? 134 SER A CA  1 
+ATOM   436  C C   . SER A 1 58  ? 7.885   11.311 32.180 1.00 30.00 ? ? ? ? ? ? 134 SER A C   1 
+ATOM   437  O O   . SER A 1 58  ? 6.984   11.175 31.352 1.00 29.76 ? ? ? ? ? ? 134 SER A O   1 
+ATOM   438  C CB  . SER A 1 58  ? 6.914   11.109 34.493 1.00 30.03 ? ? ? ? ? ? 134 SER A CB  1 
+ATOM   439  O OG  . SER A 1 58  ? 7.391   12.342 35.006 1.00 30.21 ? ? ? ? ? ? 134 SER A OG  1 
+ATOM   440  N N   . ASN A 1 59  ? 8.907   12.142 31.993 1.00 30.34 ? ? ? ? ? ? 135 ASN A N   1 
+ATOM   441  C CA  . ASN A 1 59  ? 8.989   12.985 30.799 1.00 31.08 ? ? ? ? ? ? 135 ASN A CA  1 
+ATOM   442  C C   . ASN A 1 59  ? 9.609   12.264 29.602 1.00 29.07 ? ? ? ? ? ? 135 ASN A C   1 
+ATOM   443  O O   . ASN A 1 59  ? 9.748   12.841 28.524 1.00 31.80 ? ? ? ? ? ? 135 ASN A O   1 
+ATOM   444  C CB  . ASN A 1 59  ? 9.799   14.250 31.105 1.00 36.49 ? ? ? ? ? ? 135 ASN A CB  1 
+ATOM   445  C CG  . ASN A 1 59  ? 11.276  13.968 31.254 1.00 37.56 ? ? ? ? ? ? 135 ASN A CG  1 
+ATOM   446  O OD1 . ASN A 1 59  ? 11.680  13.120 32.045 1.00 39.87 ? ? ? ? ? ? 135 ASN A OD1 1 
+ATOM   447  N ND2 . ASN A 1 59  ? 12.093  14.682 30.491 1.00 47.17 ? ? ? ? ? ? 135 ASN A ND2 1 
+ATOM   448  N N   . TYR A 1 60  ? 9.991   11.006 29.793 1.00 24.92 ? ? ? ? ? ? 136 TYR A N   1 
+ATOM   449  C CA  . TYR A 1 60  ? 10.580  10.213 28.719 1.00 26.53 ? ? ? ? ? ? 136 TYR A CA  1 
+ATOM   450  C C   . TYR A 1 60  ? 9.563   9.316  28.018 1.00 26.66 ? ? ? ? ? ? 136 TYR A C   1 
+ATOM   451  O O   . TYR A 1 60  ? 9.905   8.617  27.065 1.00 26.97 ? ? ? ? ? ? 136 TYR A O   1 
+ATOM   452  C CB  . TYR A 1 60  ? 11.704  9.331  29.264 1.00 25.28 ? ? ? ? ? ? 136 TYR A CB  1 
+ATOM   453  C CG  . TYR A 1 60  ? 13.055  9.999  29.351 1.00 25.33 ? ? ? ? ? ? 136 TYR A CG  1 
+ATOM   454  C CD1 . TYR A 1 60  ? 13.227  11.209 30.027 1.00 29.90 ? ? ? ? ? ? 136 TYR A CD1 1 
+ATOM   455  C CD2 . TYR A 1 60  ? 14.176  9.399  28.777 1.00 28.02 ? ? ? ? ? ? 136 TYR A CD2 1 
+ATOM   456  C CE1 . TYR A 1 60  ? 14.493  11.803 30.128 1.00 25.77 ? ? ? ? ? ? 136 TYR A CE1 1 
+ATOM   457  C CE2 . TYR A 1 60  ? 15.436  9.978  28.872 1.00 27.00 ? ? ? ? ? ? 136 TYR A CE2 1 
+ATOM   458  C CZ  . TYR A 1 60  ? 15.590  11.175 29.546 1.00 28.82 ? ? ? ? ? ? 136 TYR A CZ  1 
+ATOM   459  O OH  . TYR A 1 60  ? 16.846  11.727 29.640 1.00 30.24 ? ? ? ? ? ? 136 TYR A OH  1 
+ATOM   460  N N   . VAL A 1 61  ? 8.322   9.332  28.493 1.00 29.13 ? ? ? ? ? ? 137 VAL A N   1 
+ATOM   461  C CA  . VAL A 1 61  ? 7.280   8.491  27.915 1.00 30.53 ? ? ? ? ? ? 137 VAL A CA  1 
+ATOM   462  C C   . VAL A 1 61  ? 6.003   9.262  27.606 1.00 31.22 ? ? ? ? ? ? 137 VAL A C   1 
+ATOM   463  O O   . VAL A 1 61  ? 5.822   10.393 28.052 1.00 31.98 ? ? ? ? ? ? 137 VAL A O   1 
+ATOM   464  C CB  . VAL A 1 61  ? 6.922   7.323  28.868 1.00 28.48 ? ? ? ? ? ? 137 VAL A CB  1 
+ATOM   465  C CG1 . VAL A 1 61  ? 8.174   6.517  29.199 1.00 27.00 ? ? ? ? ? ? 137 VAL A CG1 1 
+ATOM   466  C CG2 . VAL A 1 61  ? 6.280   7.859  30.132 1.00 24.25 ? ? ? ? ? ? 137 VAL A CG2 1 
+ATOM   467  N N   . ALA A 1 62  ? 5.110   8.634  26.846 1.00 33.46 ? ? ? ? ? ? 138 ALA A N   1 
+ATOM   468  C CA  . ALA A 1 62  ? 3.844   9.260  26.489 1.00 35.07 ? ? ? ? ? ? 138 ALA A CA  1 
+ATOM   469  C C   . ALA A 1 62  ? 2.827   8.209  26.052 1.00 35.58 ? ? ? ? ? ? 138 ALA A C   1 
+ATOM   470  O O   . ALA A 1 62  ? 3.194   7.069  25.751 1.00 35.02 ? ? ? ? ? ? 138 ALA A O   1 
+ATOM   471  C CB  . ALA A 1 62  ? 4.064   10.277 25.369 1.00 35.23 ? ? ? ? ? ? 138 ALA A CB  1 
+ATOM   472  N N   . ARG A 1 63  ? 1.553   8.593  26.026 1.00 39.77 ? ? ? ? ? ? 139 ARG A N   1 
+ATOM   473  C CA  . ARG A 1 63  ? 0.497   7.676  25.603 1.00 43.18 ? ? ? ? ? ? 139 ARG A CA  1 
+ATOM   474  C C   . ARG A 1 63  ? 0.874   7.166  24.226 1.00 42.57 ? ? ? ? ? ? 139 ARG A C   1 
+ATOM   475  O O   . ARG A 1 63  ? 1.474   7.893  23.431 1.00 43.15 ? ? ? ? ? ? 139 ARG A O   1 
+ATOM   476  C CB  . ARG A 1 63  ? -0.857  8.393  25.518 1.00 47.51 ? ? ? ? ? ? 139 ARG A CB  1 
+ATOM   477  C CG  . ARG A 1 63  ? -2.029  7.477  25.124 1.00 54.90 ? ? ? ? ? ? 139 ARG A CG  1 
+ATOM   478  C CD  . ARG A 1 63  ? -2.763  7.976  23.875 1.00 59.83 ? ? ? ? ? ? 139 ARG A CD  1 
+ATOM   479  N NE  . ARG A 1 63  ? -3.327  9.316  24.041 1.00 63.21 ? ? ? ? ? ? 139 ARG A NE  1 
+ATOM   480  C CZ  . ARG A 1 63  ? -3.949  9.994  23.077 1.00 65.78 ? ? ? ? ? ? 139 ARG A CZ  1 
+ATOM   481  N NH1 . ARG A 1 63  ? -4.089  9.462  21.870 1.00 66.48 ? ? ? ? ? ? 139 ARG A NH1 1 
+ATOM   482  N NH2 . ARG A 1 63  ? -4.427  11.208 23.317 1.00 67.91 ? ? ? ? ? ? 139 ARG A NH2 1 
+ATOM   483  N N   . VAL A 1 64  ? 0.524   5.920  23.937 1.00 41.18 ? ? ? ? ? ? 140 VAL A N   1 
+ATOM   484  C CA  . VAL A 1 64  ? 0.845   5.338  22.642 1.00 42.23 ? ? ? ? ? ? 140 VAL A CA  1 
+ATOM   485  C C   . VAL A 1 64  ? 0.149   6.090  21.509 1.00 41.86 ? ? ? ? ? ? 140 VAL A C   1 
+ATOM   486  O O   . VAL A 1 64  ? -0.977  6.558  21.664 1.00 37.75 ? ? ? ? ? ? 140 VAL A O   1 
+ATOM   487  C CB  . VAL A 1 64  ? 0.432   3.856  22.582 1.00 43.21 ? ? ? ? ? ? 140 VAL A CB  1 
+ATOM   488  C CG1 . VAL A 1 64  ? 0.810   3.270  21.232 1.00 46.12 ? ? ? ? ? ? 140 VAL A CG1 1 
+ATOM   489  C CG2 . VAL A 1 64  ? 1.105   3.084  23.710 1.00 45.39 ? ? ? ? ? ? 140 VAL A CG2 1 
+ATOM   490  N N   . ASP A 1 65  ? 0.835   6.201  20.375 1.00 44.04 ? ? ? ? ? ? 141 ASP A N   1 
+ATOM   491  C CA  . ASP A 1 65  ? 0.307   6.893  19.199 1.00 46.01 ? ? ? ? ? ? 141 ASP A CA  1 
+ATOM   492  C C   . ASP A 1 65  ? -0.155  8.323  19.494 1.00 45.18 ? ? ? ? ? ? 141 ASP A C   1 
+ATOM   493  O O   . ASP A 1 65  ? -0.796  8.958  18.659 1.00 46.61 ? ? ? ? ? ? 141 ASP A O   1 
+ATOM   494  C CB  . ASP A 1 65  ? -0.846  6.087  18.586 1.00 47.67 ? ? ? ? ? ? 141 ASP A CB  1 
+ATOM   495  C CG  . ASP A 1 65  ? -1.453  6.766  17.368 1.00 53.70 ? ? ? ? ? ? 141 ASP A CG  1 
+ATOM   496  O OD1 . ASP A 1 65  ? -0.705  7.048  16.404 1.00 56.22 ? ? ? ? ? ? 141 ASP A OD1 1 
+ATOM   497  O OD2 . ASP A 1 65  ? -2.678  7.021  17.374 1.00 55.21 ? ? ? ? ? ? 141 ASP A OD2 1 
+ATOM   498  N N   . SER A 1 66  ? 0.175   8.836  20.676 1.00 44.75 ? ? ? ? ? ? 142 SER A N   1 
+ATOM   499  C CA  . SER A 1 66  ? -0.223  10.193 21.026 1.00 40.56 ? ? ? ? ? ? 142 SER A CA  1 
+ATOM   500  C C   . SER A 1 66  ? 0.496   11.171 20.108 1.00 40.45 ? ? ? ? ? ? 142 SER A C   1 
+ATOM   501  O O   . SER A 1 66  ? 1.394   10.794 19.355 1.00 38.84 ? ? ? ? ? ? 142 SER A O   1 
+ATOM   502  C CB  . SER A 1 66  ? 0.115   10.506 22.486 1.00 43.21 ? ? ? ? ? ? 142 SER A CB  1 
+ATOM   503  O OG  . SER A 1 66  ? 1.513   10.490 22.707 1.00 44.57 ? ? ? ? ? ? 142 SER A OG  1 
+ATOM   504  N N   . LEU A 1 67  ? 0.100   12.433 20.181 1.00 37.92 ? ? ? ? ? ? 143 LEU A N   1 
+ATOM   505  C CA  . LEU A 1 67  ? 0.682   13.459 19.341 1.00 38.43 ? ? ? ? ? ? 143 LEU A CA  1 
+ATOM   506  C C   . LEU A 1 67  ? 2.130   13.790 19.733 1.00 37.33 ? ? ? ? ? ? 143 LEU A C   1 
+ATOM   507  O O   . LEU A 1 67  ? 2.885   14.325 18.922 1.00 36.92 ? ? ? ? ? ? 143 LEU A O   1 
+ATOM   508  C CB  . LEU A 1 67  ? -0.209  14.698 19.406 1.00 42.86 ? ? ? ? ? ? 143 LEU A CB  1 
+ATOM   509  C CG  . LEU A 1 67  ? -0.103  15.747 18.306 1.00 42.60 ? ? ? ? ? ? 143 LEU A CG  1 
+ATOM   510  C CD1 . LEU A 1 67  ? -0.249  15.088 16.943 1.00 43.56 ? ? ? ? ? ? 143 LEU A CD1 1 
+ATOM   511  C CD2 . LEU A 1 67  ? -1.192  16.785 18.515 1.00 43.86 ? ? ? ? ? ? 143 LEU A CD2 1 
+ATOM   512  N N   . GLU A 1 68  ? 2.524   13.450 20.960 1.00 33.59 ? ? ? ? ? ? 144 GLU A N   1 
+ATOM   513  C CA  . GLU A 1 68  ? 3.885   13.721 21.423 1.00 33.90 ? ? ? ? ? ? 144 GLU A CA  1 
+ATOM   514  C C   . GLU A 1 68  ? 4.907   12.742 20.866 1.00 30.61 ? ? ? ? ? ? 144 GLU A C   1 
+ATOM   515  O O   . GLU A 1 68  ? 6.103   12.902 21.104 1.00 29.05 ? ? ? ? ? ? 144 GLU A O   1 
+ATOM   516  C CB  . GLU A 1 68  ? 3.986   13.681 22.955 1.00 36.54 ? ? ? ? ? ? 144 GLU A CB  1 
+ATOM   517  C CG  . GLU A 1 68  ? 3.033   14.592 23.692 1.00 43.36 ? ? ? ? ? ? 144 GLU A CG  1 
+ATOM   518  C CD  . GLU A 1 68  ? 1.662   13.977 23.860 1.00 47.09 ? ? ? ? ? ? 144 GLU A CD  1 
+ATOM   519  O OE1 . GLU A 1 68  ? 1.553   12.993 24.622 1.00 50.21 ? ? ? ? ? ? 144 GLU A OE1 1 
+ATOM   520  O OE2 . GLU A 1 68  ? 0.698   14.462 23.232 1.00 49.26 ? ? ? ? ? ? 144 GLU A OE2 1 
+ATOM   521  N N   . THR A 1 69  ? 4.446   11.727 20.141 1.00 27.90 ? ? ? ? ? ? 145 THR A N   1 
+ATOM   522  C CA  . THR A 1 69  ? 5.356   10.735 19.576 1.00 29.17 ? ? ? ? ? ? 145 THR A CA  1 
+ATOM   523  C C   . THR A 1 69  ? 5.897   11.148 18.209 1.00 31.65 ? ? ? ? ? ? 145 THR A C   1 
+ATOM   524  O O   . THR A 1 69  ? 6.795   10.496 17.669 1.00 34.12 ? ? ? ? ? ? 145 THR A O   1 
+ATOM   525  C CB  . THR A 1 69  ? 4.673   9.357  19.420 1.00 29.72 ? ? ? ? ? ? 145 THR A CB  1 
+ATOM   526  O OG1 . THR A 1 69  ? 3.556   9.474  18.529 1.00 25.91 ? ? ? ? ? ? 145 THR A OG1 1 
+ATOM   527  C CG2 . THR A 1 69  ? 4.186   8.843  20.768 1.00 28.80 ? ? ? ? ? ? 145 THR A CG2 1 
+ATOM   528  N N   . GLU A 1 70  ? 5.352   12.227 17.653 1.00 30.68 ? ? ? ? ? ? 146 GLU A N   1 
+ATOM   529  C CA  . GLU A 1 70  ? 5.781   12.712 16.341 1.00 33.04 ? ? ? ? ? ? 146 GLU A CA  1 
+ATOM   530  C C   . GLU A 1 70  ? 6.996   13.628 16.437 1.00 32.95 ? ? ? ? ? ? 146 GLU A C   1 
+ATOM   531  O O   . GLU A 1 70  ? 7.146   14.377 17.401 1.00 31.72 ? ? ? ? ? ? 146 GLU A O   1 
+ATOM   532  C CB  . GLU A 1 70  ? 4.640   13.462 15.653 1.00 36.81 ? ? ? ? ? ? 146 GLU A CB  1 
+ATOM   533  C CG  . GLU A 1 70  ? 3.381   12.637 15.415 1.00 39.10 ? ? ? ? ? ? 146 GLU A CG  1 
+ATOM   534  C CD  . GLU A 1 70  ? 3.588   11.490 14.437 1.00 43.96 ? ? ? ? ? ? 146 GLU A CD  1 
+ATOM   535  O OE1 . GLU A 1 70  ? 2.598   10.784 14.143 1.00 45.04 ? ? ? ? ? ? 146 GLU A OE1 1 
+ATOM   536  O OE2 . GLU A 1 70  ? 4.729   11.294 13.961 1.00 44.83 ? ? ? ? ? ? 146 GLU A OE2 1 
+ATOM   537  N N   . GLU A 1 71  ? 7.853   13.566 15.420 1.00 33.78 ? ? ? ? ? ? 147 GLU A N   1 
+ATOM   538  C CA  . GLU A 1 71  ? 9.068   14.370 15.364 1.00 35.16 ? ? ? ? ? ? 147 GLU A CA  1 
+ATOM   539  C C   . GLU A 1 71  ? 8.770   15.853 15.159 1.00 32.58 ? ? ? ? ? ? 147 GLU A C   1 
+ATOM   540  O O   . GLU A 1 71  ? 9.519   16.716 15.611 1.00 31.37 ? ? ? ? ? ? 147 GLU A O   1 
+ATOM   541  C CB  . GLU A 1 71  ? 9.966   13.871 14.225 1.00 40.20 ? ? ? ? ? ? 147 GLU A CB  1 
+ATOM   542  C CG  . GLU A 1 71  ? 9.300   13.944 12.843 1.00 48.61 ? ? ? ? ? ? 147 GLU A CG  1 
+ATOM   543  C CD  . GLU A 1 71  ? 10.202  13.469 11.708 1.00 50.30 ? ? ? ? ? ? 147 GLU A CD  1 
+ATOM   544  O OE1 . GLU A 1 71  ? 10.629  12.294 11.728 1.00 53.72 ? ? ? ? ? ? 147 GLU A OE1 1 
+ATOM   545  O OE2 . GLU A 1 71  ? 10.481  14.272 10.792 1.00 50.02 ? ? ? ? ? ? 147 GLU A OE2 1 
+ATOM   546  N N   . TRP A 1 72  ? 7.667   16.140 14.478 1.00 30.99 ? ? ? ? ? ? 148 TRP A N   1 
+ATOM   547  C CA  . TRP A 1 72  ? 7.278   17.513 14.188 1.00 29.81 ? ? ? ? ? ? 148 TRP A CA  1 
+ATOM   548  C C   . TRP A 1 72  ? 6.376   18.196 15.220 1.00 29.32 ? ? ? ? ? ? 148 TRP A C   1 
+ATOM   549  O O   . TRP A 1 72  ? 6.019   19.362 15.042 1.00 27.96 ? ? ? ? ? ? 148 TRP A O   1 
+ATOM   550  C CB  . TRP A 1 72  ? 6.612   17.580 12.804 1.00 27.93 ? ? ? ? ? ? 148 TRP A CB  1 
+ATOM   551  C CG  . TRP A 1 72  ? 5.597   16.496 12.555 1.00 28.85 ? ? ? ? ? ? 148 TRP A CG  1 
+ATOM   552  C CD1 . TRP A 1 72  ? 5.796   15.332 11.868 1.00 30.04 ? ? ? ? ? ? 148 TRP A CD1 1 
+ATOM   553  C CD2 . TRP A 1 72  ? 4.251   16.438 13.057 1.00 27.69 ? ? ? ? ? ? 148 TRP A CD2 1 
+ATOM   554  N NE1 . TRP A 1 72  ? 4.661   14.555 11.910 1.00 26.85 ? ? ? ? ? ? 148 TRP A NE1 1 
+ATOM   555  C CE2 . TRP A 1 72  ? 3.699   15.208 12.633 1.00 28.32 ? ? ? ? ? ? 148 TRP A CE2 1 
+ATOM   556  C CE3 . TRP A 1 72  ? 3.461   17.306 13.822 1.00 26.17 ? ? ? ? ? ? 148 TRP A CE3 1 
+ATOM   557  C CZ2 . TRP A 1 72  ? 2.386   14.821 12.950 1.00 27.06 ? ? ? ? ? ? 148 TRP A CZ2 1 
+ATOM   558  C CZ3 . TRP A 1 72  ? 2.157   16.921 14.140 1.00 29.62 ? ? ? ? ? ? 148 TRP A CZ3 1 
+ATOM   559  C CH2 . TRP A 1 72  ? 1.634   15.685 13.701 1.00 25.27 ? ? ? ? ? ? 148 TRP A CH2 1 
+ATOM   560  N N   . PHE A 1 73  ? 6.011   17.498 16.294 1.00 26.07 ? ? ? ? ? ? 149 PHE A N   1 
+ATOM   561  C CA  . PHE A 1 73  ? 5.147   18.110 17.305 1.00 26.00 ? ? ? ? ? ? 149 PHE A CA  1 
+ATOM   562  C C   . PHE A 1 73  ? 5.932   18.502 18.552 1.00 28.15 ? ? ? ? ? ? 149 PHE A C   1 
+ATOM   563  O O   . PHE A 1 73  ? 6.750   17.731 19.054 1.00 25.70 ? ? ? ? ? ? 149 PHE A O   1 
+ATOM   564  C CB  . PHE A 1 73  ? 4.018   17.158 17.717 1.00 22.29 ? ? ? ? ? ? 149 PHE A CB  1 
+ATOM   565  C CG  . PHE A 1 73  ? 2.939   17.821 18.540 1.00 27.23 ? ? ? ? ? ? 149 PHE A CG  1 
+ATOM   566  C CD1 . PHE A 1 73  ? 2.010   18.672 17.942 1.00 30.01 ? ? ? ? ? ? 149 PHE A CD1 1 
+ATOM   567  C CD2 . PHE A 1 73  ? 2.883   17.638 19.915 1.00 23.13 ? ? ? ? ? ? 149 PHE A CD2 1 
+ATOM   568  C CE1 . PHE A 1 73  ? 1.041   19.331 18.709 1.00 28.70 ? ? ? ? ? ? 149 PHE A CE1 1 
+ATOM   569  C CE2 . PHE A 1 73  ? 1.921   18.292 20.686 1.00 26.85 ? ? ? ? ? ? 149 PHE A CE2 1 
+ATOM   570  C CZ  . PHE A 1 73  ? 1.002   19.138 20.083 1.00 26.71 ? ? ? ? ? ? 149 PHE A CZ  1 
+ATOM   571  N N   . PHE A 1 74  ? 5.687   19.712 19.044 1.00 28.23 ? ? ? ? ? ? 150 PHE A N   1 
+ATOM   572  C CA  . PHE A 1 74  ? 6.354   20.189 20.248 1.00 31.12 ? ? ? ? ? ? 150 PHE A CA  1 
+ATOM   573  C C   . PHE A 1 74  ? 5.312   20.528 21.300 1.00 31.48 ? ? ? ? ? ? 150 PHE A C   1 
+ATOM   574  O O   . PHE A 1 74  ? 4.665   21.570 21.242 1.00 31.75 ? ? ? ? ? ? 150 PHE A O   1 
+ATOM   575  C CB  . PHE A 1 74  ? 7.222   21.413 19.941 1.00 31.13 ? ? ? ? ? ? 150 PHE A CB  1 
+ATOM   576  C CG  . PHE A 1 74  ? 8.474   21.084 19.184 1.00 30.73 ? ? ? ? ? ? 150 PHE A CG  1 
+ATOM   577  C CD1 . PHE A 1 74  ? 8.412   20.600 17.885 1.00 30.10 ? ? ? ? ? ? 150 PHE A CD1 1 
+ATOM   578  C CD2 . PHE A 1 74  ? 9.718   21.218 19.790 1.00 31.91 ? ? ? ? ? ? 150 PHE A CD2 1 
+ATOM   579  C CE1 . PHE A 1 74  ? 9.567   20.252 17.199 1.00 31.38 ? ? ? ? ? ? 150 PHE A CE1 1 
+ATOM   580  C CE2 . PHE A 1 74  ? 10.882  20.870 19.109 1.00 32.77 ? ? ? ? ? ? 150 PHE A CE2 1 
+ATOM   581  C CZ  . PHE A 1 74  ? 10.807  20.387 17.815 1.00 29.83 ? ? ? ? ? ? 150 PHE A CZ  1 
+ATOM   582  N N   . LYS A 1 75  ? 5.166   19.635 22.269 1.00 32.95 ? ? ? ? ? ? 151 LYS A N   1 
+ATOM   583  C CA  . LYS A 1 75  ? 4.184   19.796 23.330 1.00 34.22 ? ? ? ? ? ? 151 LYS A CA  1 
+ATOM   584  C C   . LYS A 1 75  ? 4.542   20.828 24.391 1.00 36.50 ? ? ? ? ? ? 151 LYS A C   1 
+ATOM   585  O O   . LYS A 1 75  ? 5.694   20.927 24.824 1.00 38.35 ? ? ? ? ? ? 151 LYS A O   1 
+ATOM   586  C CB  . LYS A 1 75  ? 3.948   18.449 24.010 1.00 36.11 ? ? ? ? ? ? 151 LYS A CB  1 
+ATOM   587  C CG  . LYS A 1 75  ? 2.898   18.468 25.107 1.00 37.44 ? ? ? ? ? ? 151 LYS A CG  1 
+ATOM   588  C CD  . LYS A 1 75  ? 2.807   17.098 25.748 1.00 42.34 ? ? ? ? ? ? 151 LYS A CD  1 
+ATOM   589  C CE  . LYS A 1 75  ? 1.685   17.017 26.762 1.00 45.51 ? ? ? ? ? ? 151 LYS A CE  1 
+ATOM   590  N NZ  . LYS A 1 75  ? 1.620   15.655 27.371 1.00 49.26 ? ? ? ? ? ? 151 LYS A NZ  1 
+ATOM   591  N N   . GLY A 1 76  ? 3.533   21.589 24.801 1.00 34.34 ? ? ? ? ? ? 152 GLY A N   1 
+ATOM   592  C CA  . GLY A 1 76  ? 3.700   22.594 25.835 1.00 37.16 ? ? ? ? ? ? 152 GLY A CA  1 
+ATOM   593  C C   . GLY A 1 76  ? 4.665   23.742 25.605 1.00 37.54 ? ? ? ? ? ? 152 GLY A C   1 
+ATOM   594  O O   . GLY A 1 76  ? 5.125   24.348 26.570 1.00 42.89 ? ? ? ? ? ? 152 GLY A O   1 
+ATOM   595  N N   . ILE A 1 77  ? 4.984   24.059 24.354 1.00 35.48 ? ? ? ? ? ? 153 ILE A N   1 
+ATOM   596  C CA  . ILE A 1 77  ? 5.904   25.165 24.094 1.00 31.70 ? ? ? ? ? ? 153 ILE A CA  1 
+ATOM   597  C C   . ILE A 1 77  ? 5.107   26.395 23.661 1.00 31.59 ? ? ? ? ? ? 153 ILE A C   1 
+ATOM   598  O O   . ILE A 1 77  ? 4.214   26.305 22.818 1.00 32.46 ? ? ? ? ? ? 153 ILE A O   1 
+ATOM   599  C CB  . ILE A 1 77  ? 6.937   24.797 22.999 1.00 29.71 ? ? ? ? ? ? 153 ILE A CB  1 
+ATOM   600  C CG1 . ILE A 1 77  ? 7.982   25.906 22.873 1.00 28.86 ? ? ? ? ? ? 153 ILE A CG1 1 
+ATOM   601  C CG2 . ILE A 1 77  ? 6.235   24.597 21.663 1.00 28.20 ? ? ? ? ? ? 153 ILE A CG2 1 
+ATOM   602  C CD1 . ILE A 1 77  ? 9.083   25.598 21.889 1.00 29.43 ? ? ? ? ? ? 153 ILE A CD1 1 
+ATOM   603  N N   . SER A 1 78  ? 5.418   27.542 24.251 1.00 27.09 ? ? ? ? ? ? 154 SER A N   1 
+ATOM   604  C CA  . SER A 1 78  ? 4.716   28.781 23.927 1.00 26.96 ? ? ? ? ? ? 154 SER A CA  1 
+ATOM   605  C C   . SER A 1 78  ? 5.199   29.353 22.600 1.00 26.46 ? ? ? ? ? ? 154 SER A C   1 
+ATOM   606  O O   . SER A 1 78  ? 6.224   28.928 22.064 1.00 27.25 ? ? ? ? ? ? 154 SER A O   1 
+ATOM   607  C CB  . SER A 1 78  ? 4.979   29.827 25.004 1.00 26.22 ? ? ? ? ? ? 154 SER A CB  1 
+ATOM   608  O OG  . SER A 1 78  ? 6.347   30.199 24.972 1.00 22.54 ? ? ? ? ? ? 154 SER A OG  1 
+ATOM   609  N N   . ARG A 1 79  ? 4.461   30.328 22.080 1.00 25.24 ? ? ? ? ? ? 155 ARG A N   1 
+ATOM   610  C CA  . ARG A 1 79  ? 4.845   30.988 20.839 1.00 25.60 ? ? ? ? ? ? 155 ARG A CA  1 
+ATOM   611  C C   . ARG A 1 79  ? 6.261   31.560 20.957 1.00 22.61 ? ? ? ? ? ? 155 ARG A C   1 
+ATOM   612  O O   . ARG A 1 79  ? 7.114   31.292 20.116 1.00 22.83 ? ? ? ? ? ? 155 ARG A O   1 
+ATOM   613  C CB  . ARG A 1 79  ? 3.877   32.129 20.524 1.00 29.33 ? ? ? ? ? ? 155 ARG A CB  1 
+ATOM   614  C CG  . ARG A 1 79  ? 4.426   33.144 19.518 1.00 31.78 ? ? ? ? ? ? 155 ARG A CG  1 
+ATOM   615  C CD  . ARG A 1 79  ? 3.545   34.377 19.479 1.00 37.38 ? ? ? ? ? ? 155 ARG A CD  1 
+ATOM   616  N NE  . ARG A 1 79  ? 2.299   34.106 18.786 1.00 42.94 ? ? ? ? ? ? 155 ARG A NE  1 
+ATOM   617  C CZ  . ARG A 1 79  ? 2.072   34.426 17.517 1.00 49.13 ? ? ? ? ? ? 155 ARG A CZ  1 
+ATOM   618  N NH1 . ARG A 1 79  ? 3.012   35.036 16.800 1.00 50.45 ? ? ? ? ? ? 155 ARG A NH1 1 
+ATOM   619  N NH2 . ARG A 1 79  ? 0.917   34.104 16.954 1.00 47.33 ? ? ? ? ? ? 155 ARG A NH2 1 
+ATOM   620  N N   . LYS A 1 80  ? 6.507   32.349 22.000 1.00 23.34 ? ? ? ? ? ? 156 LYS A N   1 
+ATOM   621  C CA  . LYS A 1 80  ? 7.822   32.958 22.186 1.00 21.61 ? ? ? ? ? ? 156 LYS A CA  1 
+ATOM   622  C C   . LYS A 1 80  ? 8.945   31.936 22.252 1.00 22.00 ? ? ? ? ? ? 156 LYS A C   1 
+ATOM   623  O O   . LYS A 1 80  ? 9.993   32.133 21.639 1.00 22.71 ? ? ? ? ? ? 156 LYS A O   1 
+ATOM   624  C CB  . LYS A 1 80  ? 7.853   33.827 23.453 1.00 26.67 ? ? ? ? ? ? 156 LYS A CB  1 
+ATOM   625  C CG  . LYS A 1 80  ? 6.870   34.992 23.445 1.00 30.17 ? ? ? ? ? ? 156 LYS A CG  1 
+ATOM   626  C CD  . LYS A 1 80  ? 7.119   35.954 22.291 1.00 29.17 ? ? ? ? ? ? 156 LYS A CD  1 
+ATOM   627  C CE  . LYS A 1 80  ? 8.498   36.576 22.358 1.00 32.79 ? ? ? ? ? ? 156 LYS A CE  1 
+ATOM   628  N NZ  . LYS A 1 80  ? 8.671   37.582 21.279 1.00 39.05 ? ? ? ? ? ? 156 LYS A NZ  1 
+ATOM   629  N N   . ASP A 1 81  ? 8.756   30.855 23.004 1.00 18.64 ? ? ? ? ? ? 157 ASP A N   1 
+ATOM   630  C CA  . ASP A 1 81  ? 9.811   29.853 23.074 1.00 19.52 ? ? ? ? ? ? 157 ASP A CA  1 
+ATOM   631  C C   . ASP A 1 81  ? 9.963   29.121 21.742 1.00 19.65 ? ? ? ? ? ? 157 ASP A C   1 
+ATOM   632  O O   . ASP A 1 81  ? 11.064  28.713 21.370 1.00 20.67 ? ? ? ? ? ? 157 ASP A O   1 
+ATOM   633  C CB  . ASP A 1 81  ? 9.573   28.851 24.212 1.00 21.10 ? ? ? ? ? ? 157 ASP A CB  1 
+ATOM   634  C CG  . ASP A 1 81  ? 9.858   29.449 25.588 1.00 24.07 ? ? ? ? ? ? 157 ASP A CG  1 
+ATOM   635  O OD1 . ASP A 1 81  ? 10.818  30.236 25.712 1.00 23.34 ? ? ? ? ? ? 157 ASP A OD1 1 
+ATOM   636  O OD2 . ASP A 1 81  ? 9.145   29.108 26.551 1.00 26.01 ? ? ? ? ? ? 157 ASP A OD2 1 
+ATOM   637  N N   . ALA A 1 82  ? 8.861   28.947 21.020 1.00 18.35 ? ? ? ? ? ? 158 ALA A N   1 
+ATOM   638  C CA  . ALA A 1 82  ? 8.940   28.305 19.712 1.00 21.49 ? ? ? ? ? ? 158 ALA A CA  1 
+ATOM   639  C C   . ALA A 1 82  ? 9.867   29.159 18.839 1.00 22.27 ? ? ? ? ? ? 158 ALA A C   1 
+ATOM   640  O O   . ALA A 1 82  ? 10.682  28.630 18.087 1.00 23.96 ? ? ? ? ? ? 158 ALA A O   1 
+ATOM   641  C CB  . ALA A 1 82  ? 7.555   28.219 19.080 1.00 22.26 ? ? ? ? ? ? 158 ALA A CB  1 
+ATOM   642  N N   . GLU A 1 83  ? 9.753   30.482 18.951 1.00 24.93 ? ? ? ? ? ? 159 GLU A N   1 
+ATOM   643  C CA  . GLU A 1 83  ? 10.597  31.371 18.149 1.00 24.98 ? ? ? ? ? ? 159 GLU A CA  1 
+ATOM   644  C C   . GLU A 1 83  ? 12.064  31.256 18.545 1.00 24.37 ? ? ? ? ? ? 159 GLU A C   1 
+ATOM   645  O O   . GLU A 1 83  ? 12.942  31.153 17.687 1.00 23.37 ? ? ? ? ? ? 159 GLU A O   1 
+ATOM   646  C CB  . GLU A 1 83  ? 10.176  32.837 18.301 1.00 23.58 ? ? ? ? ? ? 159 GLU A CB  1 
+ATOM   647  C CG  . GLU A 1 83  ? 8.683   33.090 18.234 1.00 31.01 ? ? ? ? ? ? 159 GLU A CG  1 
+ATOM   648  C CD  . GLU A 1 83  ? 8.341   34.574 18.234 1.00 32.24 ? ? ? ? ? ? 159 GLU A CD  1 
+ATOM   649  O OE1 . GLU A 1 83  ? 9.054   35.363 18.894 1.00 30.99 ? ? ? ? ? ? 159 GLU A OE1 1 
+ATOM   650  O OE2 . GLU A 1 83  ? 7.338   34.947 17.592 1.00 34.52 ? ? ? ? ? ? 159 GLU A OE2 1 
+ATOM   651  N N   . ARG A 1 84  ? 12.331  31.292 19.847 1.00 23.25 ? ? ? ? ? ? 160 ARG A N   1 
+ATOM   652  C CA  . ARG A 1 84  ? 13.703  31.203 20.341 1.00 24.41 ? ? ? ? ? ? 160 ARG A CA  1 
+ATOM   653  C C   . ARG A 1 84  ? 14.381  29.891 19.930 1.00 24.72 ? ? ? ? ? ? 160 ARG A C   1 
+ATOM   654  O O   . ARG A 1 84  ? 15.550  29.877 19.554 1.00 24.71 ? ? ? ? ? ? 160 ARG A O   1 
+ATOM   655  C CB  . ARG A 1 84  ? 13.717  31.356 21.875 1.00 24.73 ? ? ? ? ? ? 160 ARG A CB  1 
+ATOM   656  C CG  . ARG A 1 84  ? 13.167  32.703 22.353 1.00 22.51 ? ? ? ? ? ? 160 ARG A CG  1 
+ATOM   657  C CD  . ARG A 1 84  ? 12.850  32.739 23.854 1.00 20.93 ? ? ? ? ? ? 160 ARG A CD  1 
+ATOM   658  N NE  . ARG A 1 84  ? 12.272  34.032 24.225 1.00 17.83 ? ? ? ? ? ? 160 ARG A NE  1 
+ATOM   659  C CZ  . ARG A 1 84  ? 11.259  34.195 25.072 1.00 16.64 ? ? ? ? ? ? 160 ARG A CZ  1 
+ATOM   660  N NH1 . ARG A 1 84  ? 10.698  33.146 25.650 1.00 19.48 ? ? ? ? ? ? 160 ARG A NH1 1 
+ATOM   661  N NH2 . ARG A 1 84  ? 10.786  35.411 25.320 1.00 19.45 ? ? ? ? ? ? 160 ARG A NH2 1 
+ATOM   662  N N   . GLN A 1 85  ? 13.658  28.783 20.001 1.00 25.14 ? ? ? ? ? ? 161 GLN A N   1 
+ATOM   663  C CA  . GLN A 1 85  ? 14.257  27.507 19.632 1.00 26.24 ? ? ? ? ? ? 161 GLN A CA  1 
+ATOM   664  C C   . GLN A 1 85  ? 14.495  27.393 18.126 1.00 26.68 ? ? ? ? ? ? 161 GLN A C   1 
+ATOM   665  O O   . GLN A 1 85  ? 15.554  26.935 17.693 1.00 24.90 ? ? ? ? ? ? 161 GLN A O   1 
+ATOM   666  C CB  . GLN A 1 85  ? 13.395  26.361 20.168 1.00 27.88 ? ? ? ? ? ? 161 GLN A CB  1 
+ATOM   667  C CG  . GLN A 1 85  ? 13.525  26.235 21.689 1.00 32.29 ? ? ? ? ? ? 161 GLN A CG  1 
+ATOM   668  C CD  . GLN A 1 85  ? 12.566  25.236 22.310 1.00 35.38 ? ? ? ? ? ? 161 GLN A CD  1 
+ATOM   669  O OE1 . GLN A 1 85  ? 12.342  24.150 21.771 1.00 33.43 ? ? ? ? ? ? 161 GLN A OE1 1 
+ATOM   670  N NE2 . GLN A 1 85  ? 12.017  25.590 23.474 1.00 34.45 ? ? ? ? ? ? 161 GLN A NE2 1 
+ATOM   671  N N   . LEU A 1 86  ? 13.528  27.821 17.323 1.00 25.41 ? ? ? ? ? ? 162 LEU A N   1 
+ATOM   672  C CA  . LEU A 1 86  ? 13.697  27.769 15.871 1.00 26.57 ? ? ? ? ? ? 162 LEU A CA  1 
+ATOM   673  C C   . LEU A 1 86  ? 14.817  28.694 15.395 1.00 26.94 ? ? ? ? ? ? 162 LEU A C   1 
+ATOM   674  O O   . LEU A 1 86  ? 15.490  28.406 14.404 1.00 29.55 ? ? ? ? ? ? 162 LEU A O   1 
+ATOM   675  C CB  . LEU A 1 86  ? 12.389  28.140 15.165 1.00 22.12 ? ? ? ? ? ? 162 LEU A CB  1 
+ATOM   676  C CG  . LEU A 1 86  ? 11.361  27.017 15.053 1.00 25.00 ? ? ? ? ? ? 162 LEU A CG  1 
+ATOM   677  C CD1 . LEU A 1 86  ? 10.021  27.556 14.584 1.00 22.00 ? ? ? ? ? ? 162 LEU A CD1 1 
+ATOM   678  C CD2 . LEU A 1 86  ? 11.897  25.967 14.095 1.00 26.73 ? ? ? ? ? ? 162 LEU A CD2 1 
+ATOM   679  N N   . LEU A 1 87  ? 15.021  29.801 16.103 1.00 28.75 ? ? ? ? ? ? 163 LEU A N   1 
+ATOM   680  C CA  . LEU A 1 87  ? 16.057  30.758 15.727 1.00 31.72 ? ? ? ? ? ? 163 LEU A CA  1 
+ATOM   681  C C   . LEU A 1 87  ? 17.438  30.366 16.234 1.00 33.50 ? ? ? ? ? ? 163 LEU A C   1 
+ATOM   682  O O   . LEU A 1 87  ? 18.444  30.942 15.823 1.00 31.53 ? ? ? ? ? ? 163 LEU A O   1 
+ATOM   683  C CB  . LEU A 1 87  ? 15.695  32.156 16.236 1.00 30.22 ? ? ? ? ? ? 163 LEU A CB  1 
+ATOM   684  C CG  . LEU A 1 87  ? 14.481  32.837 15.595 1.00 28.90 ? ? ? ? ? ? 163 LEU A CG  1 
+ATOM   685  C CD1 . LEU A 1 87  ? 14.189  34.139 16.329 1.00 30.83 ? ? ? ? ? ? 163 LEU A CD1 1 
+ATOM   686  C CD2 . LEU A 1 87  ? 14.746  33.101 14.112 1.00 33.00 ? ? ? ? ? ? 163 LEU A CD2 1 
+ATOM   687  N N   . ALA A 1 88  ? 17.484  29.386 17.128 1.00 36.39 ? ? ? ? ? ? 164 ALA A N   1 
+ATOM   688  C CA  . ALA A 1 88  ? 18.752  28.925 17.679 1.00 39.13 ? ? ? ? ? ? 164 ALA A CA  1 
+ATOM   689  C C   . ALA A 1 88  ? 19.612  28.353 16.561 1.00 41.48 ? ? ? ? ? ? 164 ALA A C   1 
+ATOM   690  O O   . ALA A 1 88  ? 19.099  27.822 15.577 1.00 41.54 ? ? ? ? ? ? 164 ALA A O   1 
+ATOM   691  C CB  . ALA A 1 88  ? 18.509  27.862 18.743 1.00 38.23 ? ? ? ? ? ? 164 ALA A CB  1 
+ATOM   692  N N   . PRO A 1 89  ? 20.940  28.453 16.699 1.00 44.18 ? ? ? ? ? ? 165 PRO A N   1 
+ATOM   693  C CA  . PRO A 1 89  ? 21.845  27.931 15.676 1.00 46.13 ? ? ? ? ? ? 165 PRO A CA  1 
+ATOM   694  C C   . PRO A 1 89  ? 21.648  26.430 15.486 1.00 46.36 ? ? ? ? ? ? 165 PRO A C   1 
+ATOM   695  O O   . PRO A 1 89  ? 21.467  25.696 16.455 1.00 48.25 ? ? ? ? ? ? 165 PRO A O   1 
+ATOM   696  C CB  . PRO A 1 89  ? 23.222  28.276 16.246 1.00 47.44 ? ? ? ? ? ? 165 PRO A CB  1 
+ATOM   697  C CG  . PRO A 1 89  ? 22.925  29.543 17.057 1.00 47.17 ? ? ? ? ? ? 165 PRO A CG  1 
+ATOM   698  C CD  . PRO A 1 89  ? 21.717  29.043 17.800 1.00 45.55 ? ? ? ? ? ? 165 PRO A CD  1 
+ATOM   699  N N   . GLY A 1 90  ? 21.679  25.977 14.238 1.00 45.67 ? ? ? ? ? ? 166 GLY A N   1 
+ATOM   700  C CA  . GLY A 1 90  ? 21.506  24.561 13.976 1.00 44.65 ? ? ? ? ? ? 166 GLY A CA  1 
+ATOM   701  C C   . GLY A 1 90  ? 20.260  24.303 13.163 1.00 42.49 ? ? ? ? ? ? 166 GLY A C   1 
+ATOM   702  O O   . GLY A 1 90  ? 20.095  23.236 12.575 1.00 45.65 ? ? ? ? ? ? 166 GLY A O   1 
+ATOM   703  N N   . ASN A 1 91  ? 19.369  25.284 13.142 1.00 38.56 ? ? ? ? ? ? 167 ASN A N   1 
+ATOM   704  C CA  . ASN A 1 91  ? 18.138  25.165 12.382 1.00 34.97 ? ? ? ? ? ? 167 ASN A CA  1 
+ATOM   705  C C   . ASN A 1 91  ? 18.357  25.830 11.038 1.00 36.44 ? ? ? ? ? ? 167 ASN A C   1 
+ATOM   706  O O   . ASN A 1 91  ? 19.352  26.524 10.831 1.00 30.76 ? ? ? ? ? ? 167 ASN A O   1 
+ATOM   707  C CB  . ASN A 1 91  ? 16.989  25.839 13.128 1.00 33.59 ? ? ? ? ? ? 167 ASN A CB  1 
+ATOM   708  C CG  . ASN A 1 91  ? 16.651  25.129 14.422 1.00 33.28 ? ? ? ? ? ? 167 ASN A CG  1 
+ATOM   709  O OD1 . ASN A 1 91  ? 16.162  23.999 14.410 1.00 31.22 ? ? ? ? ? ? 167 ASN A OD1 1 
+ATOM   710  N ND2 . ASN A 1 91  ? 16.930  25.779 15.548 1.00 26.31 ? ? ? ? ? ? 167 ASN A ND2 1 
+ATOM   711  N N   . MET A 1 92  ? 17.423  25.625 10.124 1.00 36.40 ? ? ? ? ? ? 168 MET A N   1 
+ATOM   712  C CA  . MET A 1 92  ? 17.565  26.213 8.815  1.00 40.60 ? ? ? ? ? ? 168 MET A CA  1 
+ATOM   713  C C   . MET A 1 92  ? 16.271  26.772 8.270  1.00 38.86 ? ? ? ? ? ? 168 MET A C   1 
+ATOM   714  O O   . MET A 1 92  ? 15.203  26.658 8.873  1.00 35.45 ? ? ? ? ? ? 168 MET A O   1 
+ATOM   715  C CB  . MET A 1 92  ? 18.144  25.185 7.840  1.00 44.18 ? ? ? ? ? ? 168 MET A CB  1 
+ATOM   716  C CG  . MET A 1 92  ? 17.335  23.903 7.732  1.00 54.38 ? ? ? ? ? ? 168 MET A CG  1 
+ATOM   717  S SD  . MET A 1 92  ? 18.133  22.682 6.661  1.00 64.13 ? ? ? ? ? ? 168 MET A SD  1 
+ATOM   718  C CE  . MET A 1 92  ? 16.982  21.309 6.772  1.00 61.43 ? ? ? ? ? ? 168 MET A CE  1 
+ATOM   719  N N   . LEU A 1 93  ? 16.398  27.395 7.112  1.00 38.94 ? ? ? ? ? ? 169 LEU A N   1 
+ATOM   720  C CA  . LEU A 1 93  ? 15.282  27.996 6.428  1.00 38.06 ? ? ? ? ? ? 169 LEU A CA  1 
+ATOM   721  C C   . LEU A 1 93  ? 14.225  26.899 6.263  1.00 36.85 ? ? ? ? ? ? 169 LEU A C   1 
+ATOM   722  O O   . LEU A 1 93  ? 14.523  25.803 5.783  1.00 36.24 ? ? ? ? ? ? 169 LEU A O   1 
+ATOM   723  C CB  . LEU A 1 93  ? 15.793  28.542 5.086  1.00 40.10 ? ? ? ? ? ? 169 LEU A CB  1 
+ATOM   724  C CG  . LEU A 1 93  ? 14.947  29.495 4.248  1.00 43.17 ? ? ? ? ? ? 169 LEU A CG  1 
+ATOM   725  C CD1 . LEU A 1 93  ? 13.850  28.727 3.565  1.00 46.74 ? ? ? ? ? ? 169 LEU A CD1 1 
+ATOM   726  C CD2 . LEU A 1 93  ? 14.411  30.615 5.130  1.00 41.55 ? ? ? ? ? ? 169 LEU A CD2 1 
+ATOM   727  N N   . GLY A 1 94  ? 13.001  27.180 6.703  1.00 31.79 ? ? ? ? ? ? 170 GLY A N   1 
+ATOM   728  C CA  . GLY A 1 94  ? 11.940  26.197 6.594  1.00 30.88 ? ? ? ? ? ? 170 GLY A CA  1 
+ATOM   729  C C   . GLY A 1 94  ? 11.789  25.301 7.815  1.00 31.35 ? ? ? ? ? ? 170 GLY A C   1 
+ATOM   730  O O   . GLY A 1 94  ? 10.841  24.523 7.889  1.00 30.37 ? ? ? ? ? ? 170 GLY A O   1 
+ATOM   731  N N   . SER A 1 95  ? 12.719  25.384 8.767  1.00 31.56 ? ? ? ? ? ? 171 SER A N   1 
+ATOM   732  C CA  . SER A 1 95  ? 12.617  24.563 9.973  1.00 29.93 ? ? ? ? ? ? 171 SER A CA  1 
+ATOM   733  C C   . SER A 1 95  ? 11.302  24.917 10.655 1.00 29.06 ? ? ? ? ? ? 171 SER A C   1 
+ATOM   734  O O   . SER A 1 95  ? 10.928  26.091 10.731 1.00 28.62 ? ? ? ? ? ? 171 SER A O   1 
+ATOM   735  C CB  . SER A 1 95  ? 13.801  24.818 10.910 1.00 27.69 ? ? ? ? ? ? 171 SER A CB  1 
+ATOM   736  O OG  . SER A 1 95  ? 15.016  24.359 10.331 1.00 30.03 ? ? ? ? ? ? 171 SER A OG  1 
+ATOM   737  N N   . PHE A 1 96  ? 10.599  23.905 11.153 1.00 28.10 ? ? ? ? ? ? 172 PHE A N   1 
+ATOM   738  C CA  . PHE A 1 96  ? 9.305   24.147 11.769 1.00 29.23 ? ? ? ? ? ? 172 PHE A CA  1 
+ATOM   739  C C   . PHE A 1 96  ? 8.979   23.279 12.974 1.00 28.18 ? ? ? ? ? ? 172 PHE A C   1 
+ATOM   740  O O   . PHE A 1 96  ? 9.781   22.465 13.439 1.00 29.18 ? ? ? ? ? ? 172 PHE A O   1 
+ATOM   741  C CB  . PHE A 1 96  ? 8.204   23.901 10.747 1.00 30.17 ? ? ? ? ? ? 172 PHE A CB  1 
+ATOM   742  C CG  . PHE A 1 96  ? 8.053   22.449 10.379 1.00 33.63 ? ? ? ? ? ? 172 PHE A CG  1 
+ATOM   743  C CD1 . PHE A 1 96  ? 9.047   21.791 9.663  1.00 32.53 ? ? ? ? ? ? 172 PHE A CD1 1 
+ATOM   744  C CD2 . PHE A 1 96  ? 6.941   21.724 10.802 1.00 33.73 ? ? ? ? ? ? 172 PHE A CD2 1 
+ATOM   745  C CE1 . PHE A 1 96  ? 8.937   20.432 9.375  1.00 33.83 ? ? ? ? ? ? 172 PHE A CE1 1 
+ATOM   746  C CE2 . PHE A 1 96  ? 6.821   20.368 10.521 1.00 32.79 ? ? ? ? ? ? 172 PHE A CE2 1 
+ATOM   747  C CZ  . PHE A 1 96  ? 7.821   19.719 9.806  1.00 34.18 ? ? ? ? ? ? 172 PHE A CZ  1 
+ATOM   748  N N   . MET A 1 97  ? 7.762   23.479 13.462 1.00 27.66 ? ? ? ? ? ? 173 MET A N   1 
+ATOM   749  C CA  . MET A 1 97  ? 7.222   22.711 14.562 1.00 28.28 ? ? ? ? ? ? 173 MET A CA  1 
+ATOM   750  C C   . MET A 1 97  ? 5.732   22.983 14.598 1.00 27.87 ? ? ? ? ? ? 173 MET A C   1 
+ATOM   751  O O   . MET A 1 97  ? 5.272   24.069 14.235 1.00 28.27 ? ? ? ? ? ? 173 MET A O   1 
+ATOM   752  C CB  . MET A 1 97  ? 7.856   23.094 15.916 1.00 28.62 ? ? ? ? ? ? 173 MET A CB  1 
+ATOM   753  C CG  . MET A 1 97  ? 7.406   24.421 16.534 1.00 29.33 ? ? ? ? ? ? 173 MET A CG  1 
+ATOM   754  S SD  . MET A 1 97  ? 7.997   24.656 18.269 1.00 30.65 ? ? ? ? ? ? 173 MET A SD  1 
+ATOM   755  C CE  . MET A 1 97  ? 9.721   24.659 18.068 1.00 26.07 ? ? ? ? ? ? 173 MET A CE  1 
+ATOM   756  N N   . ILE A 1 98  ? 4.978   21.961 14.971 1.00 27.89 ? ? ? ? ? ? 174 ILE A N   1 
+ATOM   757  C CA  . ILE A 1 98  ? 3.543   22.082 15.130 1.00 28.48 ? ? ? ? ? ? 174 ILE A CA  1 
+ATOM   758  C C   . ILE A 1 98  ? 3.467   22.070 16.647 1.00 27.67 ? ? ? ? ? ? 174 ILE A C   1 
+ATOM   759  O O   . ILE A 1 98  ? 4.119   21.252 17.290 1.00 28.21 ? ? ? ? ? ? 174 ILE A O   1 
+ATOM   760  C CB  . ILE A 1 98  ? 2.781   20.854 14.588 1.00 32.07 ? ? ? ? ? ? 174 ILE A CB  1 
+ATOM   761  C CG1 . ILE A 1 98  ? 2.992   20.713 13.076 1.00 34.92 ? ? ? ? ? ? 174 ILE A CG1 1 
+ATOM   762  C CG2 . ILE A 1 98  ? 1.304   20.989 14.929 1.00 34.48 ? ? ? ? ? ? 174 ILE A CG2 1 
+ATOM   763  C CD1 . ILE A 1 98  ? 2.432   21.855 12.254 1.00 36.99 ? ? ? ? ? ? 174 ILE A CD1 1 
+ATOM   764  N N   . ARG A 1 99  ? 2.687   22.972 17.221 1.00 26.34 ? ? ? ? ? ? 175 ARG A N   1 
+ATOM   765  C CA  . ARG A 1 99  ? 2.581   23.063 18.669 1.00 26.31 ? ? ? ? ? ? 175 ARG A CA  1 
+ATOM   766  C C   . ARG A 1 99  ? 1.146   23.376 19.052 1.00 26.93 ? ? ? ? ? ? 175 ARG A C   1 
+ATOM   767  O O   . ARG A 1 99  ? 0.327   23.693 18.190 1.00 28.20 ? ? ? ? ? ? 175 ARG A O   1 
+ATOM   768  C CB  . ARG A 1 99  ? 3.510   24.175 19.165 1.00 23.78 ? ? ? ? ? ? 175 ARG A CB  1 
+ATOM   769  C CG  . ARG A 1 99  ? 3.224   25.521 18.508 1.00 24.41 ? ? ? ? ? ? 175 ARG A CG  1 
+ATOM   770  C CD  . ARG A 1 99  ? 4.268   26.584 18.839 1.00 22.57 ? ? ? ? ? ? 175 ARG A CD  1 
+ATOM   771  N NE  . ARG A 1 99  ? 4.005   27.829 18.116 1.00 22.86 ? ? ? ? ? ? 175 ARG A NE  1 
+ATOM   772  C CZ  . ARG A 1 99  ? 2.998   28.655 18.386 1.00 24.94 ? ? ? ? ? ? 175 ARG A CZ  1 
+ATOM   773  N NH1 . ARG A 1 99  ? 2.153   28.376 19.369 1.00 24.76 ? ? ? ? ? ? 175 ARG A NH1 1 
+ATOM   774  N NH2 . ARG A 1 99  ? 2.820   29.750 17.660 1.00 27.28 ? ? ? ? ? ? 175 ARG A NH2 1 
+ATOM   775  N N   . ASP A 1 100 ? 0.841   23.267 20.342 1.00 28.77 ? ? ? ? ? ? 176 ASP A N   1 
+ATOM   776  C CA  . ASP A 1 100 ? -0.496  23.576 20.835 1.00 31.99 ? ? ? ? ? ? 176 ASP A CA  1 
+ATOM   777  C C   . ASP A 1 100 ? -0.676  25.079 20.710 1.00 33.53 ? ? ? ? ? ? 176 ASP A C   1 
+ATOM   778  O O   . ASP A 1 100 ? 0.251   25.840 20.984 1.00 35.08 ? ? ? ? ? ? 176 ASP A O   1 
+ATOM   779  C CB  . ASP A 1 100 ? -0.644  23.171 22.303 1.00 34.60 ? ? ? ? ? ? 176 ASP A CB  1 
+ATOM   780  C CG  . ASP A 1 100 ? -0.625  21.670 22.502 1.00 39.04 ? ? ? ? ? ? 176 ASP A CG  1 
+ATOM   781  O OD1 . ASP A 1 100 ? -1.468  20.989 21.881 1.00 38.93 ? ? ? ? ? ? 176 ASP A OD1 1 
+ATOM   782  O OD2 . ASP A 1 100 ? 0.221   21.175 23.281 1.00 39.59 ? ? ? ? ? ? 176 ASP A OD2 1 
+ATOM   783  N N   . SER A 1 101 ? -1.857  25.512 20.291 1.00 35.06 ? ? ? ? ? ? 177 SER A N   1 
+ATOM   784  C CA  . SER A 1 101 ? -2.111  26.939 20.138 1.00 36.69 ? ? ? ? ? ? 177 SER A CA  1 
+ATOM   785  C C   . SER A 1 101 ? -2.382  27.591 21.491 1.00 37.30 ? ? ? ? ? ? 177 SER A C   1 
+ATOM   786  O O   . SER A 1 101 ? -3.133  27.051 22.301 1.00 35.13 ? ? ? ? ? ? 177 SER A O   1 
+ATOM   787  C CB  . SER A 1 101 ? -3.307  27.163 19.205 1.00 37.36 ? ? ? ? ? ? 177 SER A CB  1 
+ATOM   788  O OG  . SER A 1 101 ? -3.563  28.547 19.022 1.00 37.78 ? ? ? ? ? ? 177 SER A OG  1 
+ATOM   789  N N   . GLU A 1 102 ? -1.753  28.740 21.735 1.00 38.28 ? ? ? ? ? ? 178 GLU A N   1 
+ATOM   790  C CA  . GLU A 1 102 ? -1.952  29.479 22.980 1.00 40.38 ? ? ? ? ? ? 178 GLU A CA  1 
+ATOM   791  C C   . GLU A 1 102 ? -3.189  30.359 22.863 1.00 40.93 ? ? ? ? ? ? 178 GLU A C   1 
+ATOM   792  O O   . GLU A 1 102 ? -3.903  30.579 23.839 1.00 42.98 ? ? ? ? ? ? 178 GLU A O   1 
+ATOM   793  C CB  . GLU A 1 102 ? -0.746  30.373 23.306 1.00 40.11 ? ? ? ? ? ? 178 GLU A CB  1 
+ATOM   794  C CG  . GLU A 1 102 ? 0.476   29.652 23.866 1.00 41.21 ? ? ? ? ? ? 178 GLU A CG  1 
+ATOM   795  C CD  . GLU A 1 102 ? 1.562   30.619 24.338 1.00 43.00 ? ? ? ? ? ? 178 GLU A CD  1 
+ATOM   796  O OE1 . GLU A 1 102 ? 2.145   31.332 23.494 1.00 39.50 ? ? ? ? ? ? 178 GLU A OE1 1 
+ATOM   797  O OE2 . GLU A 1 102 ? 1.828   30.671 25.560 1.00 41.89 ? ? ? ? ? ? 178 GLU A OE2 1 
+ATOM   798  N N   . THR A 1 103 ? -3.439  30.851 21.656 1.00 43.53 ? ? ? ? ? ? 179 THR A N   1 
+ATOM   799  C CA  . THR A 1 103 ? -4.576  31.724 21.395 1.00 45.96 ? ? ? ? ? ? 179 THR A CA  1 
+ATOM   800  C C   . THR A 1 103 ? -5.905  30.983 21.323 1.00 46.67 ? ? ? ? ? ? 179 THR A C   1 
+ATOM   801  O O   . THR A 1 103 ? -6.906  31.426 21.888 1.00 47.49 ? ? ? ? ? ? 179 THR A O   1 
+ATOM   802  C CB  . THR A 1 103 ? -4.378  32.478 20.080 1.00 45.48 ? ? ? ? ? ? 179 THR A CB  1 
+ATOM   803  O OG1 . THR A 1 103 ? -3.151  33.210 20.142 1.00 49.05 ? ? ? ? ? ? 179 THR A OG1 1 
+ATOM   804  C CG2 . THR A 1 103 ? -5.525  33.447 19.840 1.00 49.87 ? ? ? ? ? ? 179 THR A CG2 1 
+ATOM   805  N N   . THR A 1 104 ? -5.913  29.864 20.608 1.00 46.55 ? ? ? ? ? ? 180 THR A N   1 
+ATOM   806  C CA  . THR A 1 104 ? -7.121  29.066 20.460 1.00 45.69 ? ? ? ? ? ? 180 THR A CA  1 
+ATOM   807  C C   . THR A 1 104 ? -6.900  27.720 21.140 1.00 46.34 ? ? ? ? ? ? 180 THR A C   1 
+ATOM   808  O O   . THR A 1 104 ? -6.446  26.766 20.509 1.00 44.66 ? ? ? ? ? ? 180 THR A O   1 
+ATOM   809  C CB  . THR A 1 104 ? -7.453  28.825 18.969 1.00 44.04 ? ? ? ? ? ? 180 THR A CB  1 
+ATOM   810  O OG1 . THR A 1 104 ? -7.483  30.077 18.272 1.00 43.33 ? ? ? ? ? ? 180 THR A OG1 1 
+ATOM   811  C CG2 . THR A 1 104 ? -8.808  28.148 18.831 1.00 42.29 ? ? ? ? ? ? 180 THR A CG2 1 
+ATOM   812  N N   . LYS A 1 105 ? -7.217  27.649 22.429 1.00 47.48 ? ? ? ? ? ? 181 LYS A N   1 
+ATOM   813  C CA  . LYS A 1 105 ? -7.042  26.416 23.191 1.00 50.48 ? ? ? ? ? ? 181 LYS A CA  1 
+ATOM   814  C C   . LYS A 1 105 ? -7.622  25.204 22.462 1.00 51.35 ? ? ? ? ? ? 181 LYS A C   1 
+ATOM   815  O O   . LYS A 1 105 ? -8.697  25.279 21.866 1.00 54.02 ? ? ? ? ? ? 181 LYS A O   1 
+ATOM   816  C CB  . LYS A 1 105 ? -7.704  26.550 24.565 1.00 50.87 ? ? ? ? ? ? 181 LYS A CB  1 
+ATOM   817  C CG  . LYS A 1 105 ? -7.103  27.626 25.461 1.00 52.66 ? ? ? ? ? ? 181 LYS A CG  1 
+ATOM   818  C CD  . LYS A 1 105 ? -5.673  27.300 25.867 1.00 53.35 ? ? ? ? ? ? 181 LYS A CD  1 
+ATOM   819  C CE  . LYS A 1 105 ? -5.122  28.359 26.815 1.00 54.97 ? ? ? ? ? ? 181 LYS A CE  1 
+ATOM   820  N NZ  . LYS A 1 105 ? -3.740  28.051 27.284 1.00 51.89 ? ? ? ? ? ? 181 LYS A NZ  1 
+ATOM   821  N N   . GLY A 1 106 ? -6.899  24.087 22.508 1.00 50.06 ? ? ? ? ? ? 182 GLY A N   1 
+ATOM   822  C CA  . GLY A 1 106 ? -7.370  22.878 21.857 1.00 47.63 ? ? ? ? ? ? 182 GLY A CA  1 
+ATOM   823  C C   . GLY A 1 106 ? -6.948  22.752 20.406 1.00 46.33 ? ? ? ? ? ? 182 GLY A C   1 
+ATOM   824  O O   . GLY A 1 106 ? -6.833  21.643 19.880 1.00 46.26 ? ? ? ? ? ? 182 GLY A O   1 
+ATOM   825  N N   . SER A 1 107 ? -6.721  23.884 19.750 1.00 43.99 ? ? ? ? ? ? 183 SER A N   1 
+ATOM   826  C CA  . SER A 1 107 ? -6.307  23.866 18.358 1.00 42.16 ? ? ? ? ? ? 183 SER A CA  1 
+ATOM   827  C C   . SER A 1 107 ? -4.790  23.843 18.254 1.00 39.55 ? ? ? ? ? ? 183 SER A C   1 
+ATOM   828  O O   . SER A 1 107 ? -4.094  23.719 19.261 1.00 41.11 ? ? ? ? ? ? 183 SER A O   1 
+ATOM   829  C CB  . SER A 1 107 ? -6.878  25.076 17.615 1.00 44.69 ? ? ? ? ? ? 183 SER A CB  1 
+ATOM   830  O OG  . SER A 1 107 ? -8.295  24.999 17.558 1.00 49.15 ? ? ? ? ? ? 183 SER A OG  1 
+ATOM   831  N N   . TYR A 1 108 ? -4.283  23.973 17.035 1.00 35.65 ? ? ? ? ? ? 184 TYR A N   1 
+ATOM   832  C CA  . TYR A 1 108 ? -2.848  23.934 16.804 1.00 36.02 ? ? ? ? ? ? 184 TYR A CA  1 
+ATOM   833  C C   . TYR A 1 108 ? -2.340  25.119 15.997 1.00 35.47 ? ? ? ? ? ? 184 TYR A C   1 
+ATOM   834  O O   . TYR A 1 108 ? -3.119  25.863 15.394 1.00 34.99 ? ? ? ? ? ? 184 TYR A O   1 
+ATOM   835  C CB  . TYR A 1 108 ? -2.502  22.630 16.088 1.00 35.07 ? ? ? ? ? ? 184 TYR A CB  1 
+ATOM   836  C CG  . TYR A 1 108 ? -2.923  21.420 16.882 1.00 40.13 ? ? ? ? ? ? 184 TYR A CG  1 
+ATOM   837  C CD1 . TYR A 1 108 ? -2.223  21.040 18.026 1.00 38.63 ? ? ? ? ? ? 184 TYR A CD1 1 
+ATOM   838  C CD2 . TYR A 1 108 ? -4.070  20.703 16.541 1.00 40.44 ? ? ? ? ? ? 184 TYR A CD2 1 
+ATOM   839  C CE1 . TYR A 1 108 ? -2.654  19.981 18.812 1.00 42.34 ? ? ? ? ? ? 184 TYR A CE1 1 
+ATOM   840  C CE2 . TYR A 1 108 ? -4.513  19.639 17.322 1.00 41.28 ? ? ? ? ? ? 184 TYR A CE2 1 
+ATOM   841  C CZ  . TYR A 1 108 ? -3.802  19.284 18.456 1.00 41.96 ? ? ? ? ? ? 184 TYR A CZ  1 
+ATOM   842  O OH  . TYR A 1 108 ? -4.240  18.244 19.239 1.00 39.03 ? ? ? ? ? ? 184 TYR A OH  1 
+ATOM   843  N N   . SER A 1 109 ? -1.020  25.282 16.002 1.00 32.59 ? ? ? ? ? ? 185 SER A N   1 
+ATOM   844  C CA  . SER A 1 109 ? -0.361  26.348 15.265 1.00 30.43 ? ? ? ? ? ? 185 SER A CA  1 
+ATOM   845  C C   . SER A 1 109 ? 0.922   25.823 14.641 1.00 30.08 ? ? ? ? ? ? 185 SER A C   1 
+ATOM   846  O O   . SER A 1 109 ? 1.560   24.904 15.165 1.00 30.57 ? ? ? ? ? ? 185 SER A O   1 
+ATOM   847  C CB  . SER A 1 109 ? -0.032  27.524 16.193 1.00 32.57 ? ? ? ? ? ? 185 SER A CB  1 
+ATOM   848  O OG  . SER A 1 109 ? -1.212  28.109 16.714 1.00 30.79 ? ? ? ? ? ? 185 SER A OG  1 
+ATOM   849  N N   . LEU A 1 110 ? 1.291   26.409 13.512 1.00 28.78 ? ? ? ? ? ? 186 LEU A N   1 
+ATOM   850  C CA  . LEU A 1 110 ? 2.505   26.027 12.819 1.00 29.75 ? ? ? ? ? ? 186 LEU A CA  1 
+ATOM   851  C C   . LEU A 1 110 ? 3.498   27.176 12.917 1.00 30.54 ? ? ? ? ? ? 186 LEU A C   1 
+ATOM   852  O O   . LEU A 1 110 ? 3.136   28.335 12.708 1.00 31.57 ? ? ? ? ? ? 186 LEU A O   1 
+ATOM   853  C CB  . LEU A 1 110 ? 2.204   25.722 11.347 1.00 30.68 ? ? ? ? ? ? 186 LEU A CB  1 
+ATOM   854  C CG  . LEU A 1 110 ? 3.403   25.483 10.422 1.00 33.05 ? ? ? ? ? ? 186 LEU A CG  1 
+ATOM   855  C CD1 . LEU A 1 110 ? 4.200   24.278 10.889 1.00 29.59 ? ? ? ? ? ? 186 LEU A CD1 1 
+ATOM   856  C CD2 . LEU A 1 110 ? 2.910   25.277 8.991  1.00 34.10 ? ? ? ? ? ? 186 LEU A CD2 1 
+ATOM   857  N N   . SER A 1 111 ? 4.739   26.855 13.264 1.00 28.82 ? ? ? ? ? ? 187 SER A N   1 
+ATOM   858  C CA  . SER A 1 111 ? 5.791   27.855 13.363 1.00 26.21 ? ? ? ? ? ? 187 SER A CA  1 
+ATOM   859  C C   . SER A 1 111 ? 6.855   27.479 12.350 1.00 28.42 ? ? ? ? ? ? 187 SER A C   1 
+ATOM   860  O O   . SER A 1 111 ? 7.332   26.339 12.326 1.00 26.61 ? ? ? ? ? ? 187 SER A O   1 
+ATOM   861  C CB  . SER A 1 111 ? 6.374   27.895 14.772 1.00 25.28 ? ? ? ? ? ? 187 SER A CB  1 
+ATOM   862  O OG  . SER A 1 111 ? 5.403   28.370 15.686 1.00 23.67 ? ? ? ? ? ? 187 SER A OG  1 
+ATOM   863  N N   . VAL A 1 112 ? 7.223   28.448 11.517 1.00 28.78 ? ? ? ? ? ? 188 VAL A N   1 
+ATOM   864  C CA  . VAL A 1 112 ? 8.190   28.220 10.453 1.00 26.90 ? ? ? ? ? ? 188 VAL A CA  1 
+ATOM   865  C C   . VAL A 1 112 ? 9.293   29.272 10.417 1.00 27.17 ? ? ? ? ? ? 188 VAL A C   1 
+ATOM   866  O O   . VAL A 1 112 ? 9.031   30.467 10.539 1.00 27.15 ? ? ? ? ? ? 188 VAL A O   1 
+ATOM   867  C CB  . VAL A 1 112 ? 7.468   28.224 9.088  1.00 29.40 ? ? ? ? ? ? 188 VAL A CB  1 
+ATOM   868  C CG1 . VAL A 1 112 ? 8.397   27.728 8.005  1.00 27.83 ? ? ? ? ? ? 188 VAL A CG1 1 
+ATOM   869  C CG2 . VAL A 1 112 ? 6.200   27.373 9.167  1.00 27.32 ? ? ? ? ? ? 188 VAL A CG2 1 
+ATOM   870  N N   . ARG A 1 113 ? 10.532  28.825 10.257 1.00 27.88 ? ? ? ? ? ? 189 ARG A N   1 
+ATOM   871  C CA  . ARG A 1 113 ? 11.641  29.757 10.187 1.00 31.21 ? ? ? ? ? ? 189 ARG A CA  1 
+ATOM   872  C C   . ARG A 1 113 ? 11.640  30.422 8.811  1.00 32.78 ? ? ? ? ? ? 189 ARG A C   1 
+ATOM   873  O O   . ARG A 1 113 ? 11.501  29.756 7.782  1.00 33.52 ? ? ? ? ? ? 189 ARG A O   1 
+ATOM   874  C CB  . ARG A 1 113 ? 12.967  29.038 10.445 1.00 31.32 ? ? ? ? ? ? 189 ARG A CB  1 
+ATOM   875  C CG  . ARG A 1 113 ? 14.156  29.976 10.408 1.00 34.10 ? ? ? ? ? ? 189 ARG A CG  1 
+ATOM   876  C CD  . ARG A 1 113 ? 15.349  29.402 11.129 1.00 37.67 ? ? ? ? ? ? 189 ARG A CD  1 
+ATOM   877  N NE  . ARG A 1 113 ? 16.489  30.308 11.070 1.00 34.86 ? ? ? ? ? ? 189 ARG A NE  1 
+ATOM   878  C CZ  . ARG A 1 113 ? 17.626  30.117 11.726 1.00 39.02 ? ? ? ? ? ? 189 ARG A CZ  1 
+ATOM   879  N NH1 . ARG A 1 113 ? 17.776  29.048 12.498 1.00 34.80 ? ? ? ? ? ? 189 ARG A NH1 1 
+ATOM   880  N NH2 . ARG A 1 113 ? 18.619  30.987 11.599 1.00 39.24 ? ? ? ? ? ? 189 ARG A NH2 1 
+ATOM   881  N N   . ASP A 1 114 ? 11.784  31.742 8.801  1.00 34.61 ? ? ? ? ? ? 190 ASP A N   1 
+ATOM   882  C CA  . ASP A 1 114 ? 11.774  32.505 7.561  1.00 37.59 ? ? ? ? ? ? 190 ASP A CA  1 
+ATOM   883  C C   . ASP A 1 114 ? 12.947  33.479 7.505  1.00 39.08 ? ? ? ? ? ? 190 ASP A C   1 
+ATOM   884  O O   . ASP A 1 114 ? 13.735  33.572 8.448  1.00 38.87 ? ? ? ? ? ? 190 ASP A O   1 
+ATOM   885  C CB  . ASP A 1 114 ? 10.441  33.250 7.456  1.00 40.35 ? ? ? ? ? ? 190 ASP A CB  1 
+ATOM   886  C CG  . ASP A 1 114 ? 10.327  34.078 6.199  1.00 40.90 ? ? ? ? ? ? 190 ASP A CG  1 
+ATOM   887  O OD1 . ASP A 1 114 ? 10.451  33.500 5.095  1.00 39.34 ? ? ? ? ? ? 190 ASP A OD1 1 
+ATOM   888  O OD2 . ASP A 1 114 ? 10.102  35.303 6.327  1.00 38.80 ? ? ? ? ? ? 190 ASP A OD2 1 
+ATOM   889  N N   . TYR A 1 115 ? 13.072  34.192 6.391  1.00 39.96 ? ? ? ? ? ? 191 TYR A N   1 
+ATOM   890  C CA  . TYR A 1 115 ? 14.148  35.158 6.224  1.00 37.67 ? ? ? ? ? ? 191 TYR A CA  1 
+ATOM   891  C C   . TYR A 1 115 ? 13.899  36.172 5.117  1.00 37.07 ? ? ? ? ? ? 191 TYR A C   1 
+ATOM   892  O O   . TYR A 1 115 ? 13.424  35.825 4.042  1.00 36.05 ? ? ? ? ? ? 191 TYR A O   1 
+ATOM   893  C CB  . TYR A 1 115 ? 15.480  34.440 5.951  1.00 38.35 ? ? ? ? ? ? 191 TYR A CB  1 
+ATOM   894  C CG  . TYR A 1 115 ? 16.595  35.380 5.523  1.00 39.72 ? ? ? ? ? ? 191 TYR A CG  1 
+ATOM   895  C CD1 . TYR A 1 115 ? 16.610  35.944 4.244  1.00 41.35 ? ? ? ? ? ? 191 TYR A CD1 1 
+ATOM   896  C CD2 . TYR A 1 115 ? 17.581  35.776 6.423  1.00 38.48 ? ? ? ? ? ? 191 TYR A CD2 1 
+ATOM   897  C CE1 . TYR A 1 115 ? 17.568  36.883 3.881  1.00 40.03 ? ? ? ? ? ? 191 TYR A CE1 1 
+ATOM   898  C CE2 . TYR A 1 115 ? 18.542  36.714 6.069  1.00 39.63 ? ? ? ? ? ? 191 TYR A CE2 1 
+ATOM   899  C CZ  . TYR A 1 115 ? 18.527  37.265 4.799  1.00 39.53 ? ? ? ? ? ? 191 TYR A CZ  1 
+ATOM   900  O OH  . TYR A 1 115 ? 19.455  38.217 4.458  1.00 39.04 ? ? ? ? ? ? 191 TYR A OH  1 
+ATOM   901  N N   . ASP A 1 116 ? 14.224  37.430 5.400  1.00 36.36 ? ? ? ? ? ? 192 ASP A N   1 
+ATOM   902  C CA  . ASP A 1 116 ? 14.108  38.509 4.422  1.00 36.35 ? ? ? ? ? ? 192 ASP A CA  1 
+ATOM   903  C C   . ASP A 1 116 ? 15.211  39.498 4.770  1.00 37.24 ? ? ? ? ? ? 192 ASP A C   1 
+ATOM   904  O O   . ASP A 1 116 ? 15.595  39.630 5.930  1.00 38.65 ? ? ? ? ? ? 192 ASP A O   1 
+ATOM   905  C CB  . ASP A 1 116 ? 12.717  39.170 4.453  1.00 36.77 ? ? ? ? ? ? 192 ASP A CB  1 
+ATOM   906  C CG  . ASP A 1 116 ? 12.421  39.880 5.758  1.00 37.97 ? ? ? ? ? ? 192 ASP A CG  1 
+ATOM   907  O OD1 . ASP A 1 116 ? 13.004  40.959 6.007  1.00 35.29 ? ? ? ? ? ? 192 ASP A OD1 1 
+ATOM   908  O OD2 . ASP A 1 116 ? 11.602  39.346 6.537  1.00 36.32 ? ? ? ? ? ? 192 ASP A OD2 1 
+ATOM   909  N N   . PRO A 1 117 ? 15.759  40.190 3.765  1.00 37.65 ? ? ? ? ? ? 193 PRO A N   1 
+ATOM   910  C CA  . PRO A 1 117 ? 16.831  41.155 4.015  1.00 36.04 ? ? ? ? ? ? 193 PRO A CA  1 
+ATOM   911  C C   . PRO A 1 117 ? 16.526  42.256 5.035  1.00 35.31 ? ? ? ? ? ? 193 PRO A C   1 
+ATOM   912  O O   . PRO A 1 117 ? 17.430  42.751 5.705  1.00 34.78 ? ? ? ? ? ? 193 PRO A O   1 
+ATOM   913  C CB  . PRO A 1 117 ? 17.116  41.700 2.613  1.00 37.72 ? ? ? ? ? ? 193 PRO A CB  1 
+ATOM   914  C CG  . PRO A 1 117 ? 15.751  41.556 1.925  1.00 38.41 ? ? ? ? ? ? 193 PRO A CG  1 
+ATOM   915  C CD  . PRO A 1 117 ? 15.443  40.144 2.328  1.00 35.92 ? ? ? ? ? ? 193 PRO A CD  1 
+ATOM   916  N N   . ARG A 1 118 ? 15.257  42.625 5.165  1.00 35.02 ? ? ? ? ? ? 194 ARG A N   1 
+ATOM   917  C CA  . ARG A 1 118 ? 14.870  43.688 6.092  1.00 36.77 ? ? ? ? ? ? 194 ARG A CA  1 
+ATOM   918  C C   . ARG A 1 118 ? 14.901  43.291 7.568  1.00 35.60 ? ? ? ? ? ? 194 ARG A C   1 
+ATOM   919  O O   . ARG A 1 118 ? 15.468  44.007 8.397  1.00 34.31 ? ? ? ? ? ? 194 ARG A O   1 
+ATOM   920  C CB  . ARG A 1 118 ? 13.477  44.219 5.732  1.00 38.29 ? ? ? ? ? ? 194 ARG A CB  1 
+ATOM   921  C CG  . ARG A 1 118 ? 13.015  45.360 6.622  1.00 41.44 ? ? ? ? ? ? 194 ARG A CG  1 
+ATOM   922  C CD  . ARG A 1 118 ? 11.718  45.982 6.132  1.00 44.79 ? ? ? ? ? ? 194 ARG A CD  1 
+ATOM   923  N NE  . ARG A 1 118 ? 11.355  47.134 6.955  1.00 48.55 ? ? ? ? ? ? 194 ARG A NE  1 
+ATOM   924  C CZ  . ARG A 1 118 ? 10.376  47.991 6.675  1.00 46.60 ? ? ? ? ? ? 194 ARG A CZ  1 
+ATOM   925  N NH1 . ARG A 1 118 ? 9.638   47.841 5.581  1.00 43.84 ? ? ? ? ? ? 194 ARG A NH1 1 
+ATOM   926  N NH2 . ARG A 1 118 ? 10.141  49.007 7.495  1.00 47.58 ? ? ? ? ? ? 194 ARG A NH2 1 
+ATOM   927  N N   . GLN A 1 119 ? 14.299  42.150 7.891  1.00 34.54 ? ? ? ? ? ? 195 GLN A N   1 
+ATOM   928  C CA  . GLN A 1 119 ? 14.245  41.671 9.269  1.00 36.07 ? ? ? ? ? ? 195 GLN A CA  1 
+ATOM   929  C C   . GLN A 1 119 ? 15.242  40.562 9.590  1.00 34.47 ? ? ? ? ? ? 195 GLN A C   1 
+ATOM   930  O O   . GLN A 1 119 ? 15.520  40.288 10.759 1.00 33.70 ? ? ? ? ? ? 195 GLN A O   1 
+ATOM   931  C CB  . GLN A 1 119 ? 12.828  41.189 9.591  1.00 40.07 ? ? ? ? ? ? 195 GLN A CB  1 
+ATOM   932  C CG  . GLN A 1 119 ? 11.775  42.271 9.422  1.00 46.80 ? ? ? ? ? ? 195 GLN A CG  1 
+ATOM   933  C CD  . GLN A 1 119 ? 10.403  41.840 9.892  1.00 53.51 ? ? ? ? ? ? 195 GLN A CD  1 
+ATOM   934  O OE1 . GLN A 1 119 ? 9.435   42.598 9.792  1.00 58.78 ? ? ? ? ? ? 195 GLN A OE1 1 
+ATOM   935  N NE2 . GLN A 1 119 ? 10.309  40.622 10.414 1.00 55.40 ? ? ? ? ? ? 195 GLN A NE2 1 
+ATOM   936  N N   . GLY A 1 120 ? 15.785  39.930 8.556  1.00 33.39 ? ? ? ? ? ? 196 GLY A N   1 
+ATOM   937  C CA  . GLY A 1 120 ? 16.730  38.852 8.773  1.00 30.80 ? ? ? ? ? ? 196 GLY A CA  1 
+ATOM   938  C C   . GLY A 1 120 ? 15.982  37.570 9.086  1.00 29.99 ? ? ? ? ? ? 196 GLY A C   1 
+ATOM   939  O O   . GLY A 1 120 ? 14.869  37.360 8.597  1.00 27.45 ? ? ? ? ? ? 196 GLY A O   1 
+ATOM   940  N N   . ASP A 1 121 ? 16.583  36.704 9.898  1.00 31.85 ? ? ? ? ? ? 197 ASP A N   1 
+ATOM   941  C CA  . ASP A 1 121 ? 15.932  35.451 10.263 1.00 29.51 ? ? ? ? ? ? 197 ASP A CA  1 
+ATOM   942  C C   . ASP A 1 121 ? 14.745  35.758 11.156 1.00 27.75 ? ? ? ? ? ? 197 ASP A C   1 
+ATOM   943  O O   . ASP A 1 121 ? 14.864  36.533 12.104 1.00 28.15 ? ? ? ? ? ? 197 ASP A O   1 
+ATOM   944  C CB  . ASP A 1 121 ? 16.890  34.535 11.024 1.00 30.49 ? ? ? ? ? ? 197 ASP A CB  1 
+ATOM   945  C CG  . ASP A 1 121 ? 18.103  34.171 10.219 1.00 32.78 ? ? ? ? ? ? 197 ASP A CG  1 
+ATOM   946  O OD1 . ASP A 1 121 ? 17.926  33.674 9.089  1.00 37.66 ? ? ? ? ? ? 197 ASP A OD1 1 
+ATOM   947  O OD2 . ASP A 1 121 ? 19.231  34.373 10.718 1.00 37.87 ? ? ? ? ? ? 197 ASP A OD2 1 
+ATOM   948  N N   . THR A 1 122 ? 13.601  35.161 10.849 1.00 27.74 ? ? ? ? ? ? 198 THR A N   1 
+ATOM   949  C CA  . THR A 1 122 ? 12.409  35.361 11.659 1.00 29.38 ? ? ? ? ? ? 198 THR A CA  1 
+ATOM   950  C C   . THR A 1 122 ? 11.631  34.062 11.726 1.00 28.29 ? ? ? ? ? ? 198 THR A C   1 
+ATOM   951  O O   . THR A 1 122 ? 11.946  33.090 11.036 1.00 31.97 ? ? ? ? ? ? 198 THR A O   1 
+ATOM   952  C CB  . THR A 1 122 ? 11.466  36.425 11.067 1.00 30.70 ? ? ? ? ? ? 198 THR A CB  1 
+ATOM   953  O OG1 . THR A 1 122 ? 10.897  35.931 9.847  1.00 31.46 ? ? ? ? ? ? 198 THR A OG1 1 
+ATOM   954  C CG2 . THR A 1 122 ? 12.226  37.726 10.798 1.00 29.96 ? ? ? ? ? ? 198 THR A CG2 1 
+ATOM   955  N N   . VAL A 1 123 ? 10.607  34.056 12.564 1.00 27.19 ? ? ? ? ? ? 199 VAL A N   1 
+ATOM   956  C CA  . VAL A 1 123 ? 9.758   32.894 12.708 1.00 26.67 ? ? ? ? ? ? 199 VAL A CA  1 
+ATOM   957  C C   . VAL A 1 123 ? 8.329   33.356 12.500 1.00 28.48 ? ? ? ? ? ? 199 VAL A C   1 
+ATOM   958  O O   . VAL A 1 123 ? 7.847   34.257 13.189 1.00 28.94 ? ? ? ? ? ? 199 VAL A O   1 
+ATOM   959  C CB  . VAL A 1 123 ? 9.912   32.254 14.104 1.00 26.01 ? ? ? ? ? ? 199 VAL A CB  1 
+ATOM   960  C CG1 . VAL A 1 123 ? 8.944   31.100 14.258 1.00 27.50 ? ? ? ? ? ? 199 VAL A CG1 1 
+ATOM   961  C CG2 . VAL A 1 123 ? 11.344  31.768 14.289 1.00 26.92 ? ? ? ? ? ? 199 VAL A CG2 1 
+ATOM   962  N N   . LYS A 1 124 ? 7.667   32.752 11.520 1.00 30.09 ? ? ? ? ? ? 200 LYS A N   1 
+ATOM   963  C CA  . LYS A 1 124 ? 6.286   33.084 11.208 1.00 29.07 ? ? ? ? ? ? 200 LYS A CA  1 
+ATOM   964  C C   . LYS A 1 124 ? 5.375   32.019 11.812 1.00 30.03 ? ? ? ? ? ? 200 LYS A C   1 
+ATOM   965  O O   . LYS A 1 124 ? 5.728   30.837 11.857 1.00 27.25 ? ? ? ? ? ? 200 LYS A O   1 
+ATOM   966  C CB  . LYS A 1 124 ? 6.085   33.151 9.688  1.00 34.02 ? ? ? ? ? ? 200 LYS A CB  1 
+ATOM   967  C CG  . LYS A 1 124 ? 6.838   34.284 8.966  1.00 32.88 ? ? ? ? ? ? 200 LYS A CG  1 
+ATOM   968  C CD  . LYS A 1 124 ? 6.383   35.662 9.431  1.00 35.05 ? ? ? ? ? ? 200 LYS A CD  1 
+ATOM   969  C CE  . LYS A 1 124 ? 6.901   36.780 8.521  1.00 36.46 ? ? ? ? ? ? 200 LYS A CE  1 
+ATOM   970  N NZ  . LYS A 1 124 ? 8.386   36.859 8.429  1.00 37.68 ? ? ? ? ? ? 200 LYS A NZ  1 
+ATOM   971  N N   . HIS A 1 125 ? 4.205   32.445 12.278 1.00 27.77 ? ? ? ? ? ? 201 HIS A N   1 
+ATOM   972  C CA  . HIS A 1 125 ? 3.246   31.541 12.900 1.00 29.90 ? ? ? ? ? ? 201 HIS A CA  1 
+ATOM   973  C C   . HIS A 1 125 ? 1.932   31.506 12.122 1.00 33.43 ? ? ? ? ? ? 201 HIS A C   1 
+ATOM   974  O O   . HIS A 1 125 ? 1.408   32.554 11.740 1.00 34.12 ? ? ? ? ? ? 201 HIS A O   1 
+ATOM   975  C CB  . HIS A 1 125 ? 2.962   32.002 14.331 1.00 28.13 ? ? ? ? ? ? 201 HIS A CB  1 
+ATOM   976  C CG  . HIS A 1 125 ? 4.183   32.093 15.195 1.00 29.35 ? ? ? ? ? ? 201 HIS A CG  1 
+ATOM   977  N ND1 . HIS A 1 125 ? 4.873   30.983 15.634 1.00 27.37 ? ? ? ? ? ? 201 HIS A ND1 1 
+ATOM   978  C CD2 . HIS A 1 125 ? 4.844   33.166 15.691 1.00 29.39 ? ? ? ? ? ? 201 HIS A CD2 1 
+ATOM   979  C CE1 . HIS A 1 125 ? 5.904   31.369 16.365 1.00 28.70 ? ? ? ? ? ? 201 HIS A CE1 1 
+ATOM   980  N NE2 . HIS A 1 125 ? 5.910   32.689 16.415 1.00 27.43 ? ? ? ? ? ? 201 HIS A NE2 1 
+ATOM   981  N N   . TYR A 1 126 ? 1.398   30.307 11.899 1.00 33.00 ? ? ? ? ? ? 202 TYR A N   1 
+ATOM   982  C CA  . TYR A 1 126 ? 0.133   30.160 11.183 1.00 33.65 ? ? ? ? ? ? 202 TYR A CA  1 
+ATOM   983  C C   . TYR A 1 126 ? -0.868  29.369 12.004 1.00 33.63 ? ? ? ? ? ? 202 TYR A C   1 
+ATOM   984  O O   . TYR A 1 126 ? -0.533  28.338 12.592 1.00 32.94 ? ? ? ? ? ? 202 TYR A O   1 
+ATOM   985  C CB  . TYR A 1 126 ? 0.320   29.439 9.846  1.00 34.31 ? ? ? ? ? ? 202 TYR A CB  1 
+ATOM   986  C CG  . TYR A 1 126 ? 1.267   30.111 8.889  1.00 35.82 ? ? ? ? ? ? 202 TYR A CG  1 
+ATOM   987  C CD1 . TYR A 1 126 ? 2.645   30.018 9.062  1.00 36.96 ? ? ? ? ? ? 202 TYR A CD1 1 
+ATOM   988  C CD2 . TYR A 1 126 ? 0.785   30.853 7.813  1.00 38.42 ? ? ? ? ? ? 202 TYR A CD2 1 
+ATOM   989  C CE1 . TYR A 1 126 ? 3.521   30.644 8.188  1.00 37.52 ? ? ? ? ? ? 202 TYR A CE1 1 
+ATOM   990  C CE2 . TYR A 1 126 ? 1.651   31.485 6.932  1.00 40.31 ? ? ? ? ? ? 202 TYR A CE2 1 
+ATOM   991  C CZ  . TYR A 1 126 ? 3.018   31.376 7.125  1.00 41.17 ? ? ? ? ? ? 202 TYR A CZ  1 
+ATOM   992  O OH  . TYR A 1 126 ? 3.884   31.989 6.250  1.00 44.01 ? ? ? ? ? ? 202 TYR A OH  1 
+ATOM   993  N N   . LYS A 1 127 ? -2.104  29.846 12.045 1.00 33.50 ? ? ? ? ? ? 203 LYS A N   1 
+ATOM   994  C CA  . LYS A 1 127 ? -3.131  29.136 12.785 1.00 36.84 ? ? ? ? ? ? 203 LYS A CA  1 
+ATOM   995  C C   . LYS A 1 127 ? -3.564  27.926 11.973 1.00 38.49 ? ? ? ? ? ? 203 LYS A C   1 
+ATOM   996  O O   . LYS A 1 127 ? -3.773  28.022 10.764 1.00 39.04 ? ? ? ? ? ? 203 LYS A O   1 
+ATOM   997  C CB  . LYS A 1 127 ? -4.348  30.028 13.031 1.00 38.99 ? ? ? ? ? ? 203 LYS A CB  1 
+ATOM   998  C CG  . LYS A 1 127 ? -4.050  31.284 13.821 1.00 43.25 ? ? ? ? ? ? 203 LYS A CG  1 
+ATOM   999  C CD  . LYS A 1 127 ? -5.326  32.041 14.169 1.00 48.65 ? ? ? ? ? ? 203 LYS A CD  1 
+ATOM   1000 C CE  . LYS A 1 127 ? -6.224  31.213 15.080 1.00 50.44 ? ? ? ? ? ? 203 LYS A CE  1 
+ATOM   1001 N NZ  . LYS A 1 127 ? -5.535  30.840 16.353 1.00 50.87 ? ? ? ? ? ? 203 LYS A NZ  1 
+ATOM   1002 N N   . ILE A 1 128 ? -3.667  26.781 12.638 1.00 38.60 ? ? ? ? ? ? 204 ILE A N   1 
+ATOM   1003 C CA  . ILE A 1 128 ? -4.123  25.563 11.988 1.00 41.36 ? ? ? ? ? ? 204 ILE A CA  1 
+ATOM   1004 C C   . ILE A 1 128 ? -5.515  25.391 12.572 1.00 44.11 ? ? ? ? ? ? 204 ILE A C   1 
+ATOM   1005 O O   . ILE A 1 128 ? -5.670  25.144 13.764 1.00 45.95 ? ? ? ? ? ? 204 ILE A O   1 
+ATOM   1006 C CB  . ILE A 1 128 ? -3.247  24.349 12.351 1.00 38.96 ? ? ? ? ? ? 204 ILE A CB  1 
+ATOM   1007 C CG1 . ILE A 1 128 ? -1.815  24.569 11.855 1.00 36.65 ? ? ? ? ? ? 204 ILE A CG1 1 
+ATOM   1008 C CG2 . ILE A 1 128 ? -3.821  23.094 11.722 1.00 41.66 ? ? ? ? ? ? 204 ILE A CG2 1 
+ATOM   1009 C CD1 . ILE A 1 128 ? -0.868  23.433 12.194 1.00 38.39 ? ? ? ? ? ? 204 ILE A CD1 1 
+ATOM   1010 N N   . ARG A 1 129 ? -6.531  25.553 11.735 1.00 47.12 ? ? ? ? ? ? 205 ARG A N   1 
+ATOM   1011 C CA  . ARG A 1 129 ? -7.905  25.457 12.199 1.00 49.17 ? ? ? ? ? ? 205 ARG A CA  1 
+ATOM   1012 C C   . ARG A 1 129 ? -8.403  24.023 12.217 1.00 48.51 ? ? ? ? ? ? 205 ARG A C   1 
+ATOM   1013 O O   . ARG A 1 129 ? -8.200  23.274 11.260 1.00 46.62 ? ? ? ? ? ? 205 ARG A O   1 
+ATOM   1014 C CB  . ARG A 1 129 ? -8.796  26.312 11.303 1.00 53.02 ? ? ? ? ? ? 205 ARG A CB  1 
+ATOM   1015 C CG  . ARG A 1 129 ? -9.856  27.100 12.041 1.00 58.13 ? ? ? ? ? ? 205 ARG A CG  1 
+ATOM   1016 C CD  . ARG A 1 129 ? -10.393 28.169 11.123 1.00 62.86 ? ? ? ? ? ? 205 ARG A CD  1 
+ATOM   1017 N NE  . ARG A 1 129 ? -9.287  28.849 10.452 1.00 65.94 ? ? ? ? ? ? 205 ARG A NE  1 
+ATOM   1018 C CZ  . ARG A 1 129 ? -9.402  29.975 9.757  1.00 66.93 ? ? ? ? ? ? 205 ARG A CZ  1 
+ATOM   1019 N NH1 . ARG A 1 129 ? -10.581 30.569 9.637  1.00 66.68 ? ? ? ? ? ? 205 ARG A NH1 1 
+ATOM   1020 N NH2 . ARG A 1 129 ? -8.335  30.507 9.177  1.00 65.77 ? ? ? ? ? ? 205 ARG A NH2 1 
+ATOM   1021 N N   . THR A 1 130 ? -9.050  23.647 13.316 1.00 49.04 ? ? ? ? ? ? 206 THR A N   1 
+ATOM   1022 C CA  . THR A 1 130 ? -9.595  22.305 13.461 1.00 52.07 ? ? ? ? ? ? 206 THR A CA  1 
+ATOM   1023 C C   . THR A 1 130 ? -11.055 22.328 13.035 1.00 55.26 ? ? ? ? ? ? 206 THR A C   1 
+ATOM   1024 O O   . THR A 1 130 ? -11.890 22.962 13.685 1.00 55.29 ? ? ? ? ? ? 206 THR A O   1 
+ATOM   1025 C CB  . THR A 1 130 ? -9.505  21.804 14.921 1.00 50.70 ? ? ? ? ? ? 206 THR A CB  1 
+ATOM   1026 O OG1 . THR A 1 130 ? -8.132  21.738 15.322 1.00 53.22 ? ? ? ? ? ? 206 THR A OG1 1 
+ATOM   1027 C CG2 . THR A 1 130 ? -10.126 20.417 15.052 1.00 49.00 ? ? ? ? ? ? 206 THR A CG2 1 
+ATOM   1028 N N   . LEU A 1 131 ? -11.351 21.640 11.935 1.00 57.57 ? ? ? ? ? ? 207 LEU A N   1 
+ATOM   1029 C CA  . LEU A 1 131 ? -12.708 21.575 11.405 1.00 60.16 ? ? ? ? ? ? 207 LEU A CA  1 
+ATOM   1030 C C   . LEU A 1 131 ? -13.527 20.537 12.134 1.00 60.90 ? ? ? ? ? ? 207 LEU A C   1 
+ATOM   1031 O O   . LEU A 1 131 ? -13.081 19.404 12.324 1.00 60.55 ? ? ? ? ? ? 207 LEU A O   1 
+ATOM   1032 C CB  . LEU A 1 131 ? -12.707 21.205 9.917  1.00 61.39 ? ? ? ? ? ? 207 LEU A CB  1 
+ATOM   1033 C CG  . LEU A 1 131 ? -12.009 22.117 8.913  1.00 62.55 ? ? ? ? ? ? 207 LEU A CG  1 
+ATOM   1034 C CD1 . LEU A 1 131 ? -12.615 23.511 8.997  1.00 63.41 ? ? ? ? ? ? 207 LEU A CD1 1 
+ATOM   1035 C CD2 . LEU A 1 131 ? -10.518 22.145 9.203  1.00 63.18 ? ? ? ? ? ? 207 LEU A CD2 1 
+ATOM   1036 N N   . ASP A 1 132 ? -14.725 20.923 12.553 1.00 62.47 ? ? ? ? ? ? 208 ASP A N   1 
+ATOM   1037 C CA  . ASP A 1 132 ? -15.602 19.975 13.212 1.00 64.08 ? ? ? ? ? ? 208 ASP A CA  1 
+ATOM   1038 C C   . ASP A 1 132 ? -15.853 18.929 12.132 1.00 62.20 ? ? ? ? ? ? 208 ASP A C   1 
+ATOM   1039 O O   . ASP A 1 132 ? -15.928 19.264 10.948 1.00 62.58 ? ? ? ? ? ? 208 ASP A O   1 
+ATOM   1040 C CB  . ASP A 1 132 ? -16.901 20.666 13.643 1.00 67.26 ? ? ? ? ? ? 208 ASP A CB  1 
+ATOM   1041 C CG  . ASP A 1 132 ? -17.546 21.453 12.519 1.00 69.12 ? ? ? ? ? ? 208 ASP A CG  1 
+ATOM   1042 O OD1 . ASP A 1 132 ? -17.975 20.832 11.524 1.00 71.09 ? ? ? ? ? ? 208 ASP A OD1 1 
+ATOM   1043 O OD2 . ASP A 1 132 ? -17.616 22.697 12.630 1.00 70.02 ? ? ? ? ? ? 208 ASP A OD2 1 
+ATOM   1044 N N   . ASN A 1 133 ? -15.950 17.667 12.532 1.00 60.49 ? ? ? ? ? ? 209 ASN A N   1 
+ATOM   1045 C CA  . ASN A 1 133 ? -16.161 16.571 11.589 1.00 59.46 ? ? ? ? ? ? 209 ASN A CA  1 
+ATOM   1046 C C   . ASN A 1 133 ? -14.867 16.249 10.842 1.00 59.03 ? ? ? ? ? ? 209 ASN A C   1 
+ATOM   1047 O O   . ASN A 1 133 ? -14.889 15.858 9.671  1.00 58.14 ? ? ? ? ? ? 209 ASN A O   1 
+ATOM   1048 C CB  . ASN A 1 133 ? -17.266 16.910 10.581 1.00 59.69 ? ? ? ? ? ? 209 ASN A CB  1 
+ATOM   1049 C CG  . ASN A 1 133 ? -18.611 17.136 11.243 1.00 59.65 ? ? ? ? ? ? 209 ASN A CG  1 
+ATOM   1050 O OD1 . ASN A 1 133 ? -19.094 16.290 11.997 1.00 60.68 ? ? ? ? ? ? 209 ASN A OD1 1 
+ATOM   1051 N ND2 . ASN A 1 133 ? -19.230 18.277 10.955 1.00 58.74 ? ? ? ? ? ? 209 ASN A ND2 1 
+ATOM   1052 N N   . GLY A 1 134 ? -13.743 16.424 11.533 1.00 58.21 ? ? ? ? ? ? 210 GLY A N   1 
+ATOM   1053 C CA  . GLY A 1 134 ? -12.445 16.133 10.950 1.00 56.12 ? ? ? ? ? ? 210 GLY A CA  1 
+ATOM   1054 C C   . GLY A 1 134 ? -11.934 17.126 9.923  1.00 55.04 ? ? ? ? ? ? 210 GLY A C   1 
+ATOM   1055 O O   . GLY A 1 134 ? -12.710 17.705 9.156  1.00 53.45 ? ? ? ? ? ? 210 GLY A O   1 
+ATOM   1056 N N   . GLY A 1 135 ? -10.615 17.317 9.910  1.00 52.70 ? ? ? ? ? ? 211 GLY A N   1 
+ATOM   1057 C CA  . GLY A 1 135 ? -10.005 18.234 8.964  1.00 51.64 ? ? ? ? ? ? 211 GLY A CA  1 
+ATOM   1058 C C   . GLY A 1 135 ? -9.080  19.262 9.590  1.00 49.38 ? ? ? ? ? ? 211 GLY A C   1 
+ATOM   1059 O O   . GLY A 1 135 ? -9.305  19.720 10.708 1.00 49.61 ? ? ? ? ? ? 211 GLY A O   1 
+ATOM   1060 N N   . PHE A 1 136 ? -8.038  19.630 8.854  1.00 47.21 ? ? ? ? ? ? 212 PHE A N   1 
+ATOM   1061 C CA  . PHE A 1 136 ? -7.064  20.611 9.316  1.00 46.41 ? ? ? ? ? ? 212 PHE A CA  1 
+ATOM   1062 C C   . PHE A 1 136 ? -6.623  21.477 8.150  1.00 46.81 ? ? ? ? ? ? 212 PHE A C   1 
+ATOM   1063 O O   . PHE A 1 136 ? -6.434  20.983 7.038  1.00 46.39 ? ? ? ? ? ? 212 PHE A O   1 
+ATOM   1064 C CB  . PHE A 1 136 ? -5.836  19.908 9.894  1.00 45.52 ? ? ? ? ? ? 212 PHE A CB  1 
+ATOM   1065 C CG  . PHE A 1 136 ? -6.109  19.133 11.147 1.00 43.30 ? ? ? ? ? ? 212 PHE A CG  1 
+ATOM   1066 C CD1 . PHE A 1 136 ? -6.431  19.790 12.331 1.00 42.11 ? ? ? ? ? ? 212 PHE A CD1 1 
+ATOM   1067 C CD2 . PHE A 1 136 ? -6.038  17.746 11.149 1.00 42.44 ? ? ? ? ? ? 212 PHE A CD2 1 
+ATOM   1068 C CE1 . PHE A 1 136 ? -6.676  19.077 13.501 1.00 38.18 ? ? ? ? ? ? 212 PHE A CE1 1 
+ATOM   1069 C CE2 . PHE A 1 136 ? -6.283  17.025 12.313 1.00 40.58 ? ? ? ? ? ? 212 PHE A CE2 1 
+ATOM   1070 C CZ  . PHE A 1 136 ? -6.602  17.693 13.492 1.00 40.29 ? ? ? ? ? ? 212 PHE A CZ  1 
+ATOM   1071 N N   . TYR A 1 137 ? -6.457  22.771 8.393  1.00 48.06 ? ? ? ? ? ? 213 TYR A N   1 
+ATOM   1072 C CA  . TYR A 1 137 ? -6.010  23.646 7.325  1.00 49.08 ? ? ? ? ? ? 213 TYR A CA  1 
+ATOM   1073 C C   . TYR A 1 137 ? -5.545  25.005 7.803  1.00 48.72 ? ? ? ? ? ? 213 TYR A C   1 
+ATOM   1074 O O   . TYR A 1 137 ? -5.969  25.507 8.842  1.00 47.63 ? ? ? ? ? ? 213 TYR A O   1 
+ATOM   1075 C CB  . TYR A 1 137 ? -7.120  23.876 6.299  1.00 51.11 ? ? ? ? ? ? 213 TYR A CB  1 
+ATOM   1076 C CG  . TYR A 1 137 ? -8.189  24.836 6.769  1.00 52.15 ? ? ? ? ? ? 213 TYR A CG  1 
+ATOM   1077 C CD1 . TYR A 1 137 ? -9.115  24.465 7.735  1.00 52.07 ? ? ? ? ? ? 213 TYR A CD1 1 
+ATOM   1078 C CD2 . TYR A 1 137 ? -8.248  26.134 6.269  1.00 54.02 ? ? ? ? ? ? 213 TYR A CD2 1 
+ATOM   1079 C CE1 . TYR A 1 137 ? -10.077 25.362 8.191  1.00 53.22 ? ? ? ? ? ? 213 TYR A CE1 1 
+ATOM   1080 C CE2 . TYR A 1 137 ? -9.203  27.040 6.716  1.00 54.20 ? ? ? ? ? ? 213 TYR A CE2 1 
+ATOM   1081 C CZ  . TYR A 1 137 ? -10.116 26.647 7.677  1.00 54.91 ? ? ? ? ? ? 213 TYR A CZ  1 
+ATOM   1082 O OH  . TYR A 1 137 ? -11.068 27.539 8.118  1.00 54.53 ? ? ? ? ? ? 213 TYR A OH  1 
+ATOM   1083 N N   . ILE A 1 138 ? -4.663  25.593 7.012  1.00 50.79 ? ? ? ? ? ? 214 ILE A N   1 
+ATOM   1084 C CA  . ILE A 1 138 ? -4.153  26.920 7.275  1.00 54.06 ? ? ? ? ? ? 214 ILE A CA  1 
+ATOM   1085 C C   . ILE A 1 138 ? -4.854  27.742 6.200  1.00 57.06 ? ? ? ? ? ? 214 ILE A C   1 
+ATOM   1086 O O   . ILE A 1 138 ? -5.220  28.894 6.418  1.00 57.10 ? ? ? ? ? ? 214 ILE A O   1 
+ATOM   1087 C CB  . ILE A 1 138 ? -2.621  26.974 7.092  1.00 53.19 ? ? ? ? ? ? 214 ILE A CB  1 
+ATOM   1088 C CG1 . ILE A 1 138 ? -1.956  26.029 8.100  1.00 53.14 ? ? ? ? ? ? 214 ILE A CG1 1 
+ATOM   1089 C CG2 . ILE A 1 138 ? -2.116  28.399 7.279  1.00 54.11 ? ? ? ? ? ? 214 ILE A CG2 1 
+ATOM   1090 C CD1 . ILE A 1 138 ? -0.449  25.967 7.999  1.00 51.61 ? ? ? ? ? ? 214 ILE A CD1 1 
+ATOM   1091 N N   . SER A 1 139 ? -5.066  27.098 5.050  1.00 59.99 ? ? ? ? ? ? 215 SER A N   1 
+ATOM   1092 C CA  . SER A 1 139 ? -5.723  27.689 3.884  1.00 62.59 ? ? ? ? ? ? 215 SER A CA  1 
+ATOM   1093 C C   . SER A 1 139 ? -7.022  26.919 3.627  1.00 63.58 ? ? ? ? ? ? 215 SER A C   1 
+ATOM   1094 O O   . SER A 1 139 ? -6.992  25.698 3.467  1.00 63.23 ? ? ? ? ? ? 215 SER A O   1 
+ATOM   1095 C CB  . SER A 1 139 ? -4.828  27.535 2.649  1.00 63.38 ? ? ? ? ? ? 215 SER A CB  1 
+ATOM   1096 O OG  . SER A 1 139 ? -3.487  27.904 2.922  1.00 65.21 ? ? ? ? ? ? 215 SER A OG  1 
+ATOM   1097 N N   . PRO A 1 140 ? -8.177  27.608 3.582  1.00 64.89 ? ? ? ? ? ? 216 PRO A N   1 
+ATOM   1098 C CA  . PRO A 1 140 ? -9.408  26.852 3.331  1.00 65.58 ? ? ? ? ? ? 216 PRO A CA  1 
+ATOM   1099 C C   . PRO A 1 140 ? -9.314  26.123 1.992  1.00 65.22 ? ? ? ? ? ? 216 PRO A C   1 
+ATOM   1100 O O   . PRO A 1 140 ? -10.178 25.325 1.633  1.00 66.63 ? ? ? ? ? ? 216 PRO A O   1 
+ATOM   1101 C CB  . PRO A 1 140 ? -10.481 27.940 3.351  1.00 65.32 ? ? ? ? ? ? 216 PRO A CB  1 
+ATOM   1102 C CG  . PRO A 1 140 ? -9.713  29.155 2.847  1.00 66.01 ? ? ? ? ? ? 216 PRO A CG  1 
+ATOM   1103 C CD  . PRO A 1 140 ? -8.492  29.038 3.733  1.00 65.01 ? ? ? ? ? ? 216 PRO A CD  1 
+ATOM   1104 N N   . ARG A 1 141 ? -8.235  26.409 1.271  1.00 64.85 ? ? ? ? ? ? 217 ARG A N   1 
+ATOM   1105 C CA  . ARG A 1 141 ? -7.958  25.811 -0.026 1.00 64.16 ? ? ? ? ? ? 217 ARG A CA  1 
+ATOM   1106 C C   . ARG A 1 141 ? -7.347  24.423 0.127  1.00 63.10 ? ? ? ? ? ? 217 ARG A C   1 
+ATOM   1107 O O   . ARG A 1 141 ? -7.889  23.437 -0.375 1.00 63.70 ? ? ? ? ? ? 217 ARG A O   1 
+ATOM   1108 C CB  . ARG A 1 141 ? -6.997  26.711 -0.797 1.00 65.52 ? ? ? ? ? ? 217 ARG A CB  1 
+ATOM   1109 C CG  . ARG A 1 141 ? -6.417  26.109 -2.062 1.00 67.58 ? ? ? ? ? ? 217 ARG A CG  1 
+ATOM   1110 C CD  . ARG A 1 141 ? -5.444  27.097 -2.672 1.00 70.20 ? ? ? ? ? ? 217 ARG A CD  1 
+ATOM   1111 N NE  . ARG A 1 141 ? -4.365  27.430 -1.743 1.00 72.36 ? ? ? ? ? ? 217 ARG A NE  1 
+ATOM   1112 C CZ  . ARG A 1 141 ? -3.512  28.435 -1.915 1.00 73.05 ? ? ? ? ? ? 217 ARG A CZ  1 
+ATOM   1113 N NH1 . ARG A 1 141 ? -3.609  29.215 -2.983 1.00 73.93 ? ? ? ? ? ? 217 ARG A NH1 1 
+ATOM   1114 N NH2 . ARG A 1 141 ? -2.558  28.661 -1.021 1.00 73.75 ? ? ? ? ? ? 217 ARG A NH2 1 
+ATOM   1115 N N   . SER A 1 142 ? -6.214  24.358 0.821  1.00 60.55 ? ? ? ? ? ? 218 SER A N   1 
+ATOM   1116 C CA  . SER A 1 142 ? -5.509  23.100 1.038  1.00 58.19 ? ? ? ? ? ? 218 SER A CA  1 
+ATOM   1117 C C   . SER A 1 142 ? -5.877  22.452 2.371  1.00 56.52 ? ? ? ? ? ? 218 SER A C   1 
+ATOM   1118 O O   . SER A 1 142 ? -5.163  22.611 3.360  1.00 56.19 ? ? ? ? ? ? 218 SER A O   1 
+ATOM   1119 C CB  . SER A 1 142 ? -3.996  23.338 0.989  1.00 59.02 ? ? ? ? ? ? 218 SER A CB  1 
+ATOM   1120 O OG  . SER A 1 142 ? -3.600  23.900 -0.252 1.00 60.63 ? ? ? ? ? ? 218 SER A OG  1 
+ATOM   1121 N N   . THR A 1 143 ? -6.986  21.720 2.396  1.00 54.12 ? ? ? ? ? ? 219 THR A N   1 
+ATOM   1122 C CA  . THR A 1 143 ? -7.421  21.056 3.621  1.00 53.36 ? ? ? ? ? ? 219 THR A CA  1 
+ATOM   1123 C C   . THR A 1 143 ? -6.836  19.648 3.704  1.00 51.74 ? ? ? ? ? ? 219 THR A C   1 
+ATOM   1124 O O   . THR A 1 143 ? -6.516  19.037 2.682  1.00 50.99 ? ? ? ? ? ? 219 THR A O   1 
+ATOM   1125 C CB  . THR A 1 143 ? -8.960  20.981 3.699  1.00 54.69 ? ? ? ? ? ? 219 THR A CB  1 
+ATOM   1126 O OG1 . THR A 1 143 ? -9.500  22.309 3.688  1.00 56.04 ? ? ? ? ? ? 219 THR A OG1 1 
+ATOM   1127 C CG2 . THR A 1 143 ? -9.399  20.275 4.976  1.00 54.89 ? ? ? ? ? ? 219 THR A CG2 1 
+ATOM   1128 N N   . PHE A 1 144 ? -6.702  19.139 4.926  1.00 49.35 ? ? ? ? ? ? 220 PHE A N   1 
+ATOM   1129 C CA  . PHE A 1 144 ? -6.128  17.816 5.147  1.00 47.85 ? ? ? ? ? ? 220 PHE A CA  1 
+ATOM   1130 C C   . PHE A 1 144 ? -6.885  17.040 6.216  1.00 44.57 ? ? ? ? ? ? 220 PHE A C   1 
+ATOM   1131 O O   . PHE A 1 144 ? -7.535  17.628 7.080  1.00 44.38 ? ? ? ? ? ? 220 PHE A O   1 
+ATOM   1132 C CB  . PHE A 1 144 ? -4.674  17.970 5.577  1.00 50.37 ? ? ? ? ? ? 220 PHE A CB  1 
+ATOM   1133 C CG  . PHE A 1 144 ? -3.882  18.867 4.682  1.00 52.72 ? ? ? ? ? ? 220 PHE A CG  1 
+ATOM   1134 C CD1 . PHE A 1 144 ? -3.574  18.482 3.381  1.00 52.84 ? ? ? ? ? ? 220 PHE A CD1 1 
+ATOM   1135 C CD2 . PHE A 1 144 ? -3.478  20.119 5.127  1.00 54.17 ? ? ? ? ? ? 220 PHE A CD2 1 
+ATOM   1136 C CE1 . PHE A 1 144 ? -2.875  19.336 2.537  1.00 54.98 ? ? ? ? ? ? 220 PHE A CE1 1 
+ATOM   1137 C CE2 . PHE A 1 144 ? -2.779  20.978 4.292  1.00 55.60 ? ? ? ? ? ? 220 PHE A CE2 1 
+ATOM   1138 C CZ  . PHE A 1 144 ? -2.478  20.587 2.998  1.00 54.40 ? ? ? ? ? ? 220 PHE A CZ  1 
+ATOM   1139 N N   . SER A 1 145 ? -6.786  15.718 6.168  1.00 40.55 ? ? ? ? ? ? 221 SER A N   1 
+ATOM   1140 C CA  . SER A 1 145 ? -7.474  14.896 7.150  1.00 39.31 ? ? ? ? ? ? 221 SER A CA  1 
+ATOM   1141 C C   . SER A 1 145 ? -6.658  14.767 8.432  1.00 37.09 ? ? ? ? ? ? 221 SER A C   1 
+ATOM   1142 O O   . SER A 1 145 ? -7.221  14.574 9.509  1.00 37.26 ? ? ? ? ? ? 221 SER A O   1 
+ATOM   1143 C CB  . SER A 1 145 ? -7.780  13.507 6.576  1.00 37.70 ? ? ? ? ? ? 221 SER A CB  1 
+ATOM   1144 O OG  . SER A 1 145 ? -6.595  12.817 6.228  1.00 36.97 ? ? ? ? ? ? 221 SER A OG  1 
+ATOM   1145 N N   . THR A 1 146 ? -5.337  14.883 8.321  1.00 36.62 ? ? ? ? ? ? 222 THR A N   1 
+ATOM   1146 C CA  . THR A 1 146 ? -4.474  14.777 9.497  1.00 37.16 ? ? ? ? ? ? 222 THR A CA  1 
+ATOM   1147 C C   . THR A 1 146 ? -3.317  15.771 9.456  1.00 36.26 ? ? ? ? ? ? 222 THR A C   1 
+ATOM   1148 O O   . THR A 1 146 ? -2.908  16.233 8.387  1.00 36.61 ? ? ? ? ? ? 222 THR A O   1 
+ATOM   1149 C CB  . THR A 1 146 ? -3.860  13.381 9.621  1.00 36.49 ? ? ? ? ? ? 222 THR A CB  1 
+ATOM   1150 O OG1 . THR A 1 146 ? -2.866  13.212 8.603  1.00 41.53 ? ? ? ? ? ? 222 THR A OG1 1 
+ATOM   1151 C CG2 . THR A 1 146 ? -4.933  12.316 9.455  1.00 39.17 ? ? ? ? ? ? 222 THR A CG2 1 
+ATOM   1152 N N   . LEU A 1 147 ? -2.786  16.092 10.630 1.00 34.37 ? ? ? ? ? ? 223 LEU A N   1 
+ATOM   1153 C CA  . LEU A 1 147 ? -1.671  17.022 10.719 1.00 33.04 ? ? ? ? ? ? 223 LEU A CA  1 
+ATOM   1154 C C   . LEU A 1 147 ? -0.485  16.507 9.905  1.00 31.98 ? ? ? ? ? ? 223 LEU A C   1 
+ATOM   1155 O O   . LEU A 1 147 ? 0.195   17.286 9.233  1.00 30.82 ? ? ? ? ? ? 223 LEU A O   1 
+ATOM   1156 C CB  . LEU A 1 147 ? -1.264  17.224 12.183 1.00 31.65 ? ? ? ? ? ? 223 LEU A CB  1 
+ATOM   1157 C CG  . LEU A 1 147 ? -2.285  17.933 13.083 1.00 34.62 ? ? ? ? ? ? 223 LEU A CG  1 
+ATOM   1158 C CD1 . LEU A 1 147 ? -1.798  17.921 14.519 1.00 33.35 ? ? ? ? ? ? 223 LEU A CD1 1 
+ATOM   1159 C CD2 . LEU A 1 147 ? -2.498  19.364 12.605 1.00 30.59 ? ? ? ? ? ? 223 LEU A CD2 1 
+ATOM   1160 N N   . GLN A 1 148 ? -0.249  15.196 9.952  1.00 32.02 ? ? ? ? ? ? 224 GLN A N   1 
+ATOM   1161 C CA  . GLN A 1 148 ? 0.861   14.603 9.210  1.00 35.23 ? ? ? ? ? ? 224 GLN A CA  1 
+ATOM   1162 C C   . GLN A 1 148 ? 0.765   14.927 7.720  1.00 36.35 ? ? ? ? ? ? 224 GLN A C   1 
+ATOM   1163 O O   . GLN A 1 148 ? 1.764   15.259 7.079  1.00 36.07 ? ? ? ? ? ? 224 GLN A O   1 
+ATOM   1164 C CB  . GLN A 1 148 ? 0.893   13.082 9.400  1.00 36.79 ? ? ? ? ? ? 224 GLN A CB  1 
+ATOM   1165 C CG  . GLN A 1 148 ? 2.048   12.399 8.662  1.00 37.91 ? ? ? ? ? ? 224 GLN A CG  1 
+ATOM   1166 C CD  . GLN A 1 148 ? 3.419   12.802 9.194  1.00 38.90 ? ? ? ? ? ? 224 GLN A CD  1 
+ATOM   1167 O OE1 . GLN A 1 148 ? 3.757   12.524 10.345 1.00 36.82 ? ? ? ? ? ? 224 GLN A OE1 1 
+ATOM   1168 N NE2 . GLN A 1 148 ? 4.213   13.459 8.356  1.00 33.61 ? ? ? ? ? ? 224 GLN A NE2 1 
+ATOM   1169 N N   . GLU A 1 149 ? -0.440  14.830 7.170  1.00 37.59 ? ? ? ? ? ? 225 GLU A N   1 
+ATOM   1170 C CA  . GLU A 1 149 ? -0.642  15.125 5.760  1.00 40.60 ? ? ? ? ? ? 225 GLU A CA  1 
+ATOM   1171 C C   . GLU A 1 149 ? -0.435  16.607 5.506  1.00 40.15 ? ? ? ? ? ? 225 GLU A C   1 
+ATOM   1172 O O   . GLU A 1 149 ? 0.052   17.005 4.445  1.00 39.95 ? ? ? ? ? ? 225 GLU A O   1 
+ATOM   1173 C CB  . GLU A 1 149 ? -2.044  14.711 5.332  1.00 43.22 ? ? ? ? ? ? 225 GLU A CB  1 
+ATOM   1174 C CG  . GLU A 1 149 ? -2.264  13.218 5.401  1.00 48.37 ? ? ? ? ? ? 225 GLU A CG  1 
+ATOM   1175 C CD  . GLU A 1 149 ? -3.676  12.830 5.048  1.00 51.20 ? ? ? ? ? ? 225 GLU A CD  1 
+ATOM   1176 O OE1 . GLU A 1 149 ? -4.140  13.212 3.953  1.00 53.95 ? ? ? ? ? ? 225 GLU A OE1 1 
+ATOM   1177 O OE2 . GLU A 1 149 ? -4.318  12.137 5.863  1.00 56.29 ? ? ? ? ? ? 225 GLU A OE2 1 
+ATOM   1178 N N   . LEU A 1 150 ? -0.809  17.419 6.489  1.00 39.35 ? ? ? ? ? ? 226 LEU A N   1 
+ATOM   1179 C CA  . LEU A 1 150 ? -0.646  18.861 6.383  1.00 39.28 ? ? ? ? ? ? 226 LEU A CA  1 
+ATOM   1180 C C   . LEU A 1 150 ? 0.844   19.126 6.232  1.00 37.48 ? ? ? ? ? ? 226 LEU A C   1 
+ATOM   1181 O O   . LEU A 1 150 ? 1.266   19.904 5.373  1.00 39.76 ? ? ? ? ? ? 226 LEU A O   1 
+ATOM   1182 C CB  . LEU A 1 150 ? -1.196  19.546 7.641  1.00 38.94 ? ? ? ? ? ? 226 LEU A CB  1 
+ATOM   1183 C CG  . LEU A 1 150 ? -1.169  21.077 7.722  1.00 43.26 ? ? ? ? ? ? 226 LEU A CG  1 
+ATOM   1184 C CD1 . LEU A 1 150 ? -1.975  21.528 8.927  1.00 43.10 ? ? ? ? ? ? 226 LEU A CD1 1 
+ATOM   1185 C CD2 . LEU A 1 150 ? 0.266   21.585 7.816  1.00 42.59 ? ? ? ? ? ? 226 LEU A CD2 1 
+ATOM   1186 N N   . VAL A 1 151 ? 1.637   18.457 7.063  1.00 37.35 ? ? ? ? ? ? 227 VAL A N   1 
+ATOM   1187 C CA  . VAL A 1 151 ? 3.083   18.606 7.031  1.00 37.21 ? ? ? ? ? ? 227 VAL A CA  1 
+ATOM   1188 C C   . VAL A 1 151 ? 3.655   18.131 5.699  1.00 40.80 ? ? ? ? ? ? 227 VAL A C   1 
+ATOM   1189 O O   . VAL A 1 151 ? 4.377   18.872 5.033  1.00 41.93 ? ? ? ? ? ? 227 VAL A O   1 
+ATOM   1190 C CB  . VAL A 1 151 ? 3.747   17.816 8.172  1.00 35.83 ? ? ? ? ? ? 227 VAL A CB  1 
+ATOM   1191 C CG1 . VAL A 1 151 ? 5.259   17.922 8.067  1.00 34.12 ? ? ? ? ? ? 227 VAL A CG1 1 
+ATOM   1192 C CG2 . VAL A 1 151 ? 3.272   18.357 9.520  1.00 39.16 ? ? ? ? ? ? 227 VAL A CG2 1 
+ATOM   1193 N N   . ASP A 1 152 ? 3.328   16.900 5.309  1.00 43.66 ? ? ? ? ? ? 228 ASP A N   1 
+ATOM   1194 C CA  . ASP A 1 152 ? 3.827   16.350 4.051  1.00 46.53 ? ? ? ? ? ? 228 ASP A CA  1 
+ATOM   1195 C C   . ASP A 1 152 ? 3.553   17.272 2.868  1.00 47.92 ? ? ? ? ? ? 228 ASP A C   1 
+ATOM   1196 O O   . ASP A 1 152 ? 4.398   17.419 1.986  1.00 48.00 ? ? ? ? ? ? 228 ASP A O   1 
+ATOM   1197 C CB  . ASP A 1 152 ? 3.221   14.968 3.779  1.00 47.31 ? ? ? ? ? ? 228 ASP A CB  1 
+ATOM   1198 C CG  . ASP A 1 152 ? 3.636   13.932 4.813  1.00 46.38 ? ? ? ? ? ? 228 ASP A CG  1 
+ATOM   1199 O OD1 . ASP A 1 152 ? 4.853   13.785 5.057  1.00 46.27 ? ? ? ? ? ? 228 ASP A OD1 1 
+ATOM   1200 O OD2 . ASP A 1 152 ? 2.749   13.255 5.369  1.00 48.25 ? ? ? ? ? ? 228 ASP A OD2 1 
+ATOM   1201 N N   . HIS A 1 153 ? 2.377   17.894 2.847  1.00 50.25 ? ? ? ? ? ? 229 HIS A N   1 
+ATOM   1202 C CA  . HIS A 1 153 ? 2.040   18.799 1.758  1.00 51.55 ? ? ? ? ? ? 229 HIS A CA  1 
+ATOM   1203 C C   . HIS A 1 153 ? 2.987   19.990 1.747  1.00 52.52 ? ? ? ? ? ? 229 HIS A C   1 
+ATOM   1204 O O   . HIS A 1 153 ? 3.818   20.122 0.849  1.00 52.51 ? ? ? ? ? ? 229 HIS A O   1 
+ATOM   1205 C CB  . HIS A 1 153 ? 0.602   19.308 1.883  1.00 53.63 ? ? ? ? ? ? 229 HIS A CB  1 
+ATOM   1206 C CG  . HIS A 1 153 ? 0.222   20.302 0.826  1.00 58.25 ? ? ? ? ? ? 229 HIS A CG  1 
+ATOM   1207 N ND1 . HIS A 1 153 ? -1.016  20.904 0.778  1.00 60.11 ? ? ? ? ? ? 229 HIS A ND1 1 
+ATOM   1208 C CD2 . HIS A 1 153 ? 0.924   20.809 -0.217 1.00 59.50 ? ? ? ? ? ? 229 HIS A CD2 1 
+ATOM   1209 C CE1 . HIS A 1 153 ? -1.062  21.738 -0.244 1.00 59.43 ? ? ? ? ? ? 229 HIS A CE1 1 
+ATOM   1210 N NE2 . HIS A 1 153 ? 0.102   21.700 -0.865 1.00 60.77 ? ? ? ? ? ? 229 HIS A NE2 1 
+ATOM   1211 N N   . TYR A 1 154 ? 2.853   20.857 2.747  1.00 51.82 ? ? ? ? ? ? 230 TYR A N   1 
+ATOM   1212 C CA  . TYR A 1 154 ? 3.691   22.046 2.852  1.00 51.07 ? ? ? ? ? ? 230 TYR A CA  1 
+ATOM   1213 C C   . TYR A 1 154 ? 5.169   21.693 2.898  1.00 51.47 ? ? ? ? ? ? 230 TYR A C   1 
+ATOM   1214 O O   . TYR A 1 154 ? 6.034   22.569 2.828  1.00 52.06 ? ? ? ? ? ? 230 TYR A O   1 
+ATOM   1215 C CB  . TYR A 1 154 ? 3.297   22.853 4.089  1.00 47.64 ? ? ? ? ? ? 230 TYR A CB  1 
+ATOM   1216 C CG  . TYR A 1 154 ? 1.924   23.468 3.980  1.00 44.91 ? ? ? ? ? ? 230 TYR A CG  1 
+ATOM   1217 C CD1 . TYR A 1 154 ? 1.669   24.490 3.066  1.00 44.77 ? ? ? ? ? ? 230 TYR A CD1 1 
+ATOM   1218 C CD2 . TYR A 1 154 ? 0.874   23.022 4.779  1.00 43.53 ? ? ? ? ? ? 230 TYR A CD2 1 
+ATOM   1219 C CE1 . TYR A 1 154 ? 0.404   25.053 2.953  1.00 44.08 ? ? ? ? ? ? 230 TYR A CE1 1 
+ATOM   1220 C CE2 . TYR A 1 154 ? -0.392  23.575 4.675  1.00 43.78 ? ? ? ? ? ? 230 TYR A CE2 1 
+ATOM   1221 C CZ  . TYR A 1 154 ? -0.620  24.592 3.760  1.00 45.11 ? ? ? ? ? ? 230 TYR A CZ  1 
+ATOM   1222 O OH  . TYR A 1 154 ? -1.870  25.154 3.662  1.00 46.09 ? ? ? ? ? ? 230 TYR A OH  1 
+ATOM   1223 N N   . LYS A 1 155 ? 5.451   20.402 3.014  1.00 52.47 ? ? ? ? ? ? 231 LYS A N   1 
+ATOM   1224 C CA  . LYS A 1 155 ? 6.821   19.925 3.049  1.00 53.67 ? ? ? ? ? ? 231 LYS A CA  1 
+ATOM   1225 C C   . LYS A 1 155 ? 7.252   19.813 1.585  1.00 56.46 ? ? ? ? ? ? 231 LYS A C   1 
+ATOM   1226 O O   . LYS A 1 155 ? 8.430   19.643 1.277  1.00 56.59 ? ? ? ? ? ? 231 LYS A O   1 
+ATOM   1227 C CB  . LYS A 1 155 ? 6.866   18.571 3.760  1.00 53.41 ? ? ? ? ? ? 231 LYS A CB  1 
+ATOM   1228 C CG  . LYS A 1 155 ? 8.225   18.160 4.295  1.00 52.49 ? ? ? ? ? ? 231 LYS A CG  1 
+ATOM   1229 C CD  . LYS A 1 155 ? 8.072   16.975 5.239  1.00 51.56 ? ? ? ? ? ? 231 LYS A CD  1 
+ATOM   1230 C CE  . LYS A 1 155 ? 9.405   16.525 5.808  1.00 51.37 ? ? ? ? ? ? 231 LYS A CE  1 
+ATOM   1231 N NZ  . LYS A 1 155 ? 10.325  16.047 4.741  1.00 50.67 ? ? ? ? ? ? 231 LYS A NZ  1 
+ATOM   1232 N N   . LYS A 1 156 ? 6.270   19.929 0.691  1.00 58.11 ? ? ? ? ? ? 232 LYS A N   1 
+ATOM   1233 C CA  . LYS A 1 156 ? 6.486   19.872 -0.756 1.00 59.89 ? ? ? ? ? ? 232 LYS A CA  1 
+ATOM   1234 C C   . LYS A 1 156 ? 6.000   21.190 -1.346 1.00 59.82 ? ? ? ? ? ? 232 LYS A C   1 
+ATOM   1235 O O   . LYS A 1 156 ? 4.873   21.275 -1.830 1.00 60.73 ? ? ? ? ? ? 232 LYS A O   1 
+ATOM   1236 C CB  . LYS A 1 156 ? 5.675   18.737 -1.395 1.00 60.27 ? ? ? ? ? ? 232 LYS A CB  1 
+ATOM   1237 C CG  . LYS A 1 156 ? 5.935   17.354 -0.837 1.00 61.52 ? ? ? ? ? ? 232 LYS A CG  1 
+ATOM   1238 C CD  . LYS A 1 156 ? 5.141   16.277 -1.584 1.00 63.06 ? ? ? ? ? ? 232 LYS A CD  1 
+ATOM   1239 C CE  . LYS A 1 156 ? 3.625   16.481 -1.510 1.00 63.03 ? ? ? ? ? ? 232 LYS A CE  1 
+ATOM   1240 N NZ  . LYS A 1 156 ? 3.133   17.671 -2.266 1.00 62.92 ? ? ? ? ? ? 232 LYS A NZ  1 
+ATOM   1241 N N   . GLY A 1 157 ? 6.843   22.215 -1.306 1.00 60.48 ? ? ? ? ? ? 233 GLY A N   1 
+ATOM   1242 C CA  . GLY A 1 157 ? 6.441   23.503 -1.840 1.00 61.23 ? ? ? ? ? ? 233 GLY A CA  1 
+ATOM   1243 C C   . GLY A 1 157 ? 5.639   24.282 -0.816 1.00 61.86 ? ? ? ? ? ? 233 GLY A C   1 
+ATOM   1244 O O   . GLY A 1 157 ? 4.679   23.765 -0.237 1.00 61.98 ? ? ? ? ? ? 233 GLY A O   1 
+ATOM   1245 N N   . ASN A 1 158 ? 6.030   25.534 -0.601 1.00 61.32 ? ? ? ? ? ? 234 ASN A N   1 
+ATOM   1246 C CA  . ASN A 1 158 ? 5.372   26.398 0.371  1.00 60.01 ? ? ? ? ? ? 234 ASN A CA  1 
+ATOM   1247 C C   . ASN A 1 158 ? 3.868   26.576 0.181  1.00 58.71 ? ? ? ? ? ? 234 ASN A C   1 
+ATOM   1248 O O   . ASN A 1 158 ? 3.156   26.880 1.139  1.00 59.06 ? ? ? ? ? ? 234 ASN A O   1 
+ATOM   1249 C CB  . ASN A 1 158 ? 6.053   27.771 0.389  1.00 62.46 ? ? ? ? ? ? 234 ASN A CB  1 
+ATOM   1250 C CG  . ASN A 1 158 ? 6.046   28.446 -0.968 1.00 62.90 ? ? ? ? ? ? 234 ASN A CG  1 
+ATOM   1251 O OD1 . ASN A 1 158 ? 4.987   28.711 -1.540 1.00 62.25 ? ? ? ? ? ? 234 ASN A OD1 1 
+ATOM   1252 N ND2 . ASN A 1 158 ? 7.232   28.731 -1.491 1.00 61.76 ? ? ? ? ? ? 234 ASN A ND2 1 
+ATOM   1253 N N   . ASP A 1 159 ? 3.382   26.383 -1.041 1.00 56.50 ? ? ? ? ? ? 235 ASP A N   1 
+ATOM   1254 C CA  . ASP A 1 159 ? 1.956   26.545 -1.330 1.00 55.39 ? ? ? ? ? ? 235 ASP A CA  1 
+ATOM   1255 C C   . ASP A 1 159 ? 1.352   27.700 -0.531 1.00 54.57 ? ? ? ? ? ? 235 ASP A C   1 
+ATOM   1256 O O   . ASP A 1 159 ? 0.360   27.529 0.178  1.00 54.88 ? ? ? ? ? ? 235 ASP A O   1 
+ATOM   1257 C CB  . ASP A 1 159 ? 1.184   25.255 -1.017 1.00 52.75 ? ? ? ? ? ? 235 ASP A CB  1 
+ATOM   1258 C CG  . ASP A 1 159 ? -0.306  25.370 -1.336 1.00 54.23 ? ? ? ? ? ? 235 ASP A CG  1 
+ATOM   1259 O OD1 . ASP A 1 159 ? -1.051  24.406 -1.069 1.00 52.92 ? ? ? ? ? ? 235 ASP A OD1 1 
+ATOM   1260 O OD2 . ASP A 1 159 ? -0.740  26.421 -1.858 1.00 52.56 ? ? ? ? ? ? 235 ASP A OD2 1 
+ATOM   1261 N N   . GLY A 1 160 ? 1.960   28.875 -0.640 1.00 55.21 ? ? ? ? ? ? 236 GLY A N   1 
+ATOM   1262 C CA  . GLY A 1 160 ? 1.443   30.025 0.076  1.00 57.27 ? ? ? ? ? ? 236 GLY A CA  1 
+ATOM   1263 C C   . GLY A 1 160 ? 2.206   30.381 1.337  1.00 58.00 ? ? ? ? ? ? 236 GLY A C   1 
+ATOM   1264 O O   . GLY A 1 160 ? 2.402   31.563 1.625  1.00 60.57 ? ? ? ? ? ? 236 GLY A O   1 
+ATOM   1265 N N   . LEU A 1 161 ? 2.629   29.375 2.098  1.00 56.48 ? ? ? ? ? ? 237 LEU A N   1 
+ATOM   1266 C CA  . LEU A 1 161 ? 3.372   29.634 3.326  1.00 55.72 ? ? ? ? ? ? 237 LEU A CA  1 
+ATOM   1267 C C   . LEU A 1 161 ? 4.612   30.453 3.018  1.00 54.44 ? ? ? ? ? ? 237 LEU A C   1 
+ATOM   1268 O O   . LEU A 1 161 ? 5.185   30.340 1.934  1.00 55.59 ? ? ? ? ? ? 237 LEU A O   1 
+ATOM   1269 C CB  . LEU A 1 161 ? 3.778   28.325 4.012  1.00 54.80 ? ? ? ? ? ? 237 LEU A CB  1 
+ATOM   1270 C CG  . LEU A 1 161 ? 2.665   27.451 4.594  1.00 54.35 ? ? ? ? ? ? 237 LEU A CG  1 
+ATOM   1271 C CD1 . LEU A 1 161 ? 3.288   26.255 5.300  1.00 54.40 ? ? ? ? ? ? 237 LEU A CD1 1 
+ATOM   1272 C CD2 . LEU A 1 161 ? 1.828   28.260 5.577  1.00 53.82 ? ? ? ? ? ? 237 LEU A CD2 1 
+ATOM   1273 N N   . CYS A 1 162 ? 5.024   31.277 3.976  1.00 52.26 ? ? ? ? ? ? 238 CYS A N   1 
+ATOM   1274 C CA  . CYS A 1 162 ? 6.194   32.125 3.799  1.00 50.38 ? ? ? ? ? ? 238 CYS A CA  1 
+ATOM   1275 C C   . CYS A 1 162 ? 7.374   31.289 3.348  1.00 48.27 ? ? ? ? ? ? 238 CYS A C   1 
+ATOM   1276 O O   . CYS A 1 162 ? 8.340   31.814 2.799  1.00 48.50 ? ? ? ? ? ? 238 CYS A O   1 
+ATOM   1277 C CB  . CYS A 1 162 ? 6.565   32.823 5.110  1.00 51.59 ? ? ? ? ? ? 238 CYS A CB  1 
+ATOM   1278 S SG  . CYS A 1 162 ? 7.276   31.720 6.359  1.00 50.45 ? ? ? ? ? ? 238 CYS A SG  1 
+ATOM   1279 N N   . GLN A 1 163 ? 7.296   29.982 3.573  1.00 49.00 ? ? ? ? ? ? 239 GLN A N   1 
+ATOM   1280 C CA  . GLN A 1 163 ? 8.398   29.115 3.197  1.00 48.97 ? ? ? ? ? ? 239 GLN A CA  1 
+ATOM   1281 C C   . GLN A 1 163 ? 8.002   27.652 3.047  1.00 47.61 ? ? ? ? ? ? 239 GLN A C   1 
+ATOM   1282 O O   . GLN A 1 163 ? 6.926   27.234 3.467  1.00 46.89 ? ? ? ? ? ? 239 GLN A O   1 
+ATOM   1283 C CB  . GLN A 1 163 ? 9.500   29.222 4.248  1.00 51.54 ? ? ? ? ? ? 239 GLN A CB  1 
+ATOM   1284 C CG  . GLN A 1 163 ? 10.883  29.158 3.677  1.00 55.86 ? ? ? ? ? ? 239 GLN A CG  1 
+ATOM   1285 C CD  . GLN A 1 163 ? 11.198  30.369 2.819  1.00 57.66 ? ? ? ? ? ? 239 GLN A CD  1 
+ATOM   1286 O OE1 . GLN A 1 163 ? 10.498  30.657 1.849  1.00 60.62 ? ? ? ? ? ? 239 GLN A OE1 1 
+ATOM   1287 N NE2 . GLN A 1 163 ? 12.254  31.088 3.176  1.00 59.22 ? ? ? ? ? ? 239 GLN A NE2 1 
+ATOM   1288 N N   . LYS A 1 164 ? 8.893   26.882 2.435  1.00 47.16 ? ? ? ? ? ? 240 LYS A N   1 
+ATOM   1289 C CA  . LYS A 1 164 ? 8.690   25.454 2.233  1.00 47.86 ? ? ? ? ? ? 240 LYS A CA  1 
+ATOM   1290 C C   . LYS A 1 164 ? 9.221   24.751 3.476  1.00 45.74 ? ? ? ? ? ? 240 LYS A C   1 
+ATOM   1291 O O   . LYS A 1 164 ? 10.380  24.944 3.843  1.00 45.47 ? ? ? ? ? ? 240 LYS A O   1 
+ATOM   1292 C CB  . LYS A 1 164 ? 9.480   24.989 1.011  1.00 51.04 ? ? ? ? ? ? 240 LYS A CB  1 
+ATOM   1293 C CG  . LYS A 1 164 ? 9.554   23.485 0.847  1.00 53.15 ? ? ? ? ? ? 240 LYS A CG  1 
+ATOM   1294 C CD  . LYS A 1 164 ? 10.496  23.113 -0.285 1.00 55.40 ? ? ? ? ? ? 240 LYS A CD  1 
+ATOM   1295 C CE  . LYS A 1 164 ? 10.644  21.608 -0.392 1.00 57.96 ? ? ? ? ? ? 240 LYS A CE  1 
+ATOM   1296 N NZ  . LYS A 1 164 ? 9.329   20.961 -0.630 1.00 60.86 ? ? ? ? ? ? 240 LYS A NZ  1 
+ATOM   1297 N N   . LEU A 1 165 ? 8.386   23.941 4.121  1.00 43.25 ? ? ? ? ? ? 241 LEU A N   1 
+ATOM   1298 C CA  . LEU A 1 165 ? 8.816   23.238 5.326  1.00 42.95 ? ? ? ? ? ? 241 LEU A CA  1 
+ATOM   1299 C C   . LEU A 1 165 ? 9.997   22.321 5.029  1.00 42.78 ? ? ? ? ? ? 241 LEU A C   1 
+ATOM   1300 O O   . LEU A 1 165 ? 9.955   21.538 4.080  1.00 44.52 ? ? ? ? ? ? 241 LEU A O   1 
+ATOM   1301 C CB  . LEU A 1 165 ? 7.672   22.401 5.909  1.00 38.01 ? ? ? ? ? ? 241 LEU A CB  1 
+ATOM   1302 C CG  . LEU A 1 165 ? 6.354   23.087 6.271  1.00 36.96 ? ? ? ? ? ? 241 LEU A CG  1 
+ATOM   1303 C CD1 . LEU A 1 165 ? 5.434   22.054 6.895  1.00 38.53 ? ? ? ? ? ? 241 LEU A CD1 1 
+ATOM   1304 C CD2 . LEU A 1 165 ? 6.585   24.239 7.241  1.00 38.51 ? ? ? ? ? ? 241 LEU A CD2 1 
+ATOM   1305 N N   . SER A 1 166 ? 11.051  22.427 5.833  1.00 42.48 ? ? ? ? ? ? 242 SER A N   1 
+ATOM   1306 C CA  . SER A 1 166 ? 12.226  21.581 5.655  1.00 40.84 ? ? ? ? ? ? 242 SER A CA  1 
+ATOM   1307 C C   . SER A 1 166 ? 12.225  20.458 6.693  1.00 40.23 ? ? ? ? ? ? 242 SER A C   1 
+ATOM   1308 O O   . SER A 1 166 ? 11.720  19.368 6.425  1.00 40.69 ? ? ? ? ? ? 242 SER A O   1 
+ATOM   1309 C CB  . SER A 1 166 ? 13.511  22.410 5.769  1.00 42.74 ? ? ? ? ? ? 242 SER A CB  1 
+ATOM   1310 O OG  . SER A 1 166 ? 13.596  23.078 7.016  1.00 45.46 ? ? ? ? ? ? 242 SER A OG  1 
+ATOM   1311 N N   . VAL A 1 167 ? 12.780  20.727 7.873  1.00 37.04 ? ? ? ? ? ? 243 VAL A N   1 
+ATOM   1312 C CA  . VAL A 1 167 ? 12.838  19.737 8.946  1.00 34.02 ? ? ? ? ? ? 243 VAL A CA  1 
+ATOM   1313 C C   . VAL A 1 167 ? 12.389  20.319 10.285 1.00 33.84 ? ? ? ? ? ? 243 VAL A C   1 
+ATOM   1314 O O   . VAL A 1 167 ? 12.412  21.536 10.488 1.00 29.41 ? ? ? ? ? ? 243 VAL A O   1 
+ATOM   1315 C CB  . VAL A 1 167 ? 14.269  19.171 9.128  1.00 33.00 ? ? ? ? ? ? 243 VAL A CB  1 
+ATOM   1316 C CG1 . VAL A 1 167 ? 14.724  18.467 7.853  1.00 36.56 ? ? ? ? ? ? 243 VAL A CG1 1 
+ATOM   1317 C CG2 . VAL A 1 167 ? 15.225  20.293 9.506  1.00 32.27 ? ? ? ? ? ? 243 VAL A CG2 1 
+ATOM   1318 N N   . PRO A 1 168 ? 11.984  19.447 11.224 1.00 32.48 ? ? ? ? ? ? 244 PRO A N   1 
+ATOM   1319 C CA  . PRO A 1 168 ? 11.527  19.852 12.554 1.00 29.31 ? ? ? ? ? ? 244 PRO A CA  1 
+ATOM   1320 C C   . PRO A 1 168 ? 12.607  20.631 13.291 1.00 28.34 ? ? ? ? ? ? 244 PRO A C   1 
+ATOM   1321 O O   . PRO A 1 168 ? 13.797  20.401 13.076 1.00 29.43 ? ? ? ? ? ? 244 PRO A O   1 
+ATOM   1322 C CB  . PRO A 1 168 ? 11.237  18.510 13.230 1.00 31.74 ? ? ? ? ? ? 244 PRO A CB  1 
+ATOM   1323 C CG  . PRO A 1 168 ? 10.822  17.636 12.053 1.00 34.45 ? ? ? ? ? ? 244 PRO A CG  1 
+ATOM   1324 C CD  . PRO A 1 168 ? 11.952  17.977 11.115 1.00 34.56 ? ? ? ? ? ? 244 PRO A CD  1 
+ATOM   1325 N N   . CYS A 1 169 ? 12.189  21.547 14.159 1.00 28.55 ? ? ? ? ? ? 245 CYS A N   1 
+ATOM   1326 C CA  . CYS A 1 169 ? 13.129  22.340 14.938 1.00 27.95 ? ? ? ? ? ? 245 CYS A CA  1 
+ATOM   1327 C C   . CYS A 1 169 ? 14.078  21.414 15.686 1.00 30.29 ? ? ? ? ? ? 245 CYS A C   1 
+ATOM   1328 O O   . CYS A 1 169 ? 13.684  20.328 16.117 1.00 25.53 ? ? ? ? ? ? 245 CYS A O   1 
+ATOM   1329 C CB  . CYS A 1 169 ? 12.384  23.211 15.950 1.00 25.75 ? ? ? ? ? ? 245 CYS A CB  1 
+ATOM   1330 S SG  . CYS A 1 169 ? 13.481  24.191 16.988 1.00 27.82 ? ? ? ? ? ? 245 CYS A SG  1 
+ATOM   1331 N N   . MET A 1 170 ? 15.328  21.837 15.832 1.00 32.93 ? ? ? ? ? ? 246 MET A N   1 
+ATOM   1332 C CA  . MET A 1 170 ? 16.307  21.032 16.547 1.00 39.36 ? ? ? ? ? ? 246 MET A CA  1 
+ATOM   1333 C C   . MET A 1 170 ? 15.956  20.996 18.029 1.00 42.45 ? ? ? ? ? ? 246 MET A C   1 
+ATOM   1334 O O   . MET A 1 170 ? 15.562  22.010 18.612 1.00 43.59 ? ? ? ? ? ? 246 MET A O   1 
+ATOM   1335 C CB  . MET A 1 170 ? 17.713  21.609 16.372 1.00 42.56 ? ? ? ? ? ? 246 MET A CB  1 
+ATOM   1336 C CG  . MET A 1 170 ? 18.238  21.598 14.943 1.00 49.98 ? ? ? ? ? ? 246 MET A CG  1 
+ATOM   1337 S SD  . MET A 1 170 ? 18.511  19.945 14.256 1.00 55.26 ? ? ? ? ? ? 246 MET A SD  1 
+ATOM   1338 C CE  . MET A 1 170 ? 16.840  19.296 14.099 1.00 53.10 ? ? ? ? ? ? 246 MET A CE  1 
+ATOM   1339 N N   . SER A 1 171 ? 16.090  19.822 18.631 1.00 44.50 ? ? ? ? ? ? 247 SER A N   1 
+ATOM   1340 C CA  . SER A 1 171 ? 15.804  19.658 20.049 1.00 47.23 ? ? ? ? ? ? 247 SER A CA  1 
+ATOM   1341 C C   . SER A 1 171 ? 16.765  18.624 20.615 1.00 49.46 ? ? ? ? ? ? 247 SER A C   1 
+ATOM   1342 O O   . SER A 1 171 ? 17.104  17.644 19.948 1.00 48.97 ? ? ? ? ? ? 247 SER A O   1 
+ATOM   1343 C CB  . SER A 1 171 ? 14.369  19.179 20.256 1.00 45.97 ? ? ? ? ? ? 247 SER A CB  1 
+ATOM   1344 O OG  . SER A 1 171 ? 14.205  17.881 19.719 1.00 48.40 ? ? ? ? ? ? 247 SER A OG  1 
+ATOM   1345 N N   . SER A 1 172 ? 17.211  18.849 21.843 1.00 52.14 ? ? ? ? ? ? 248 SER A N   1 
+ATOM   1346 C CA  . SER A 1 172 ? 18.126  17.921 22.486 1.00 54.27 ? ? ? ? ? ? 248 SER A CA  1 
+ATOM   1347 C C   . SER A 1 172 ? 17.354  17.064 23.480 1.00 52.91 ? ? ? ? ? ? 248 SER A C   1 
+ATOM   1348 O O   . SER A 1 172 ? 16.419  17.538 24.130 1.00 52.11 ? ? ? ? ? ? 248 SER A O   1 
+ATOM   1349 C CB  . SER A 1 172 ? 19.244  18.688 23.197 1.00 54.71 ? ? ? ? ? ? 248 SER A CB  1 
+ATOM   1350 O OG  . SER A 1 172 ? 18.717  19.586 24.160 1.00 61.09 ? ? ? ? ? ? 248 SER A OG  1 
+ATOM   1351 N N   . LYS A 1 173 ? 17.740  15.796 23.576 1.00 53.01 ? ? ? ? ? ? 249 LYS A N   1 
+ATOM   1352 C CA  . LYS A 1 173 ? 17.103  14.855 24.491 1.00 52.66 ? ? ? ? ? ? 249 LYS A CA  1 
+ATOM   1353 C C   . LYS A 1 173 ? 16.991  15.489 25.872 1.00 51.40 ? ? ? ? ? ? 249 LYS A C   1 
+ATOM   1354 O O   . LYS A 1 173 ? 17.965  16.036 26.386 1.00 51.72 ? ? ? ? ? ? 249 LYS A O   1 
+ATOM   1355 C CB  . LYS A 1 173 ? 17.940  13.579 24.571 1.00 52.77 ? ? ? ? ? ? 249 LYS A CB  1 
+ATOM   1356 C CG  . LYS A 1 173 ? 17.381  12.495 25.475 1.00 53.76 ? ? ? ? ? ? 249 LYS A CG  1 
+ATOM   1357 C CD  . LYS A 1 173 ? 18.292  11.279 25.425 1.00 54.78 ? ? ? ? ? ? 249 LYS A CD  1 
+ATOM   1358 C CE  . LYS A 1 173 ? 17.753  10.118 26.234 1.00 56.11 ? ? ? ? ? ? 249 LYS A CE  1 
+ATOM   1359 N NZ  . LYS A 1 173 ? 18.658  8.941  26.118 1.00 55.17 ? ? ? ? ? ? 249 LYS A NZ  1 
+ATOM   1360 N N   . PRO A 1 174 ? 15.800  15.422 26.492 1.00 50.80 ? ? ? ? ? ? 250 PRO A N   1 
+ATOM   1361 C CA  . PRO A 1 174 ? 15.592  16.005 27.820 1.00 50.11 ? ? ? ? ? ? 250 PRO A CA  1 
+ATOM   1362 C C   . PRO A 1 174 ? 16.567  15.424 28.830 1.00 47.53 ? ? ? ? ? ? 250 PRO A C   1 
+ATOM   1363 O O   . PRO A 1 174 ? 16.855  14.228 28.807 1.00 47.79 ? ? ? ? ? ? 250 PRO A O   1 
+ATOM   1364 C CB  . PRO A 1 174 ? 14.139  15.638 28.123 1.00 52.05 ? ? ? ? ? ? 250 PRO A CB  1 
+ATOM   1365 C CG  . PRO A 1 174 ? 13.520  15.635 26.735 1.00 52.20 ? ? ? ? ? ? 250 PRO A CG  1 
+ATOM   1366 C CD  . PRO A 1 174 ? 14.557  14.783 26.035 1.00 51.76 ? ? ? ? ? ? 250 PRO A CD  1 
+ATOM   1367 N N   . GLN A 1 175 ? 17.085  16.271 29.708 1.00 46.37 ? ? ? ? ? ? 251 GLN A N   1 
+ATOM   1368 C CA  . GLN A 1 175 ? 18.027  15.805 30.712 1.00 45.68 ? ? ? ? ? ? 251 GLN A CA  1 
+ATOM   1369 C C   . GLN A 1 175 ? 17.293  14.894 31.677 1.00 42.35 ? ? ? ? ? ? 251 GLN A C   1 
+ATOM   1370 O O   . GLN A 1 175 ? 16.097  15.068 31.918 1.00 37.76 ? ? ? ? ? ? 251 GLN A O   1 
+ATOM   1371 C CB  . GLN A 1 175 ? 18.631  16.985 31.473 1.00 50.50 ? ? ? ? ? ? 251 GLN A CB  1 
+ATOM   1372 C CG  . GLN A 1 175 ? 19.310  18.000 30.580 1.00 55.31 ? ? ? ? ? ? 251 GLN A CG  1 
+ATOM   1373 C CD  . GLN A 1 175 ? 19.962  19.111 31.369 1.00 59.71 ? ? ? ? ? ? 251 GLN A CD  1 
+ATOM   1374 O OE1 . GLN A 1 175 ? 20.955  18.895 32.066 1.00 63.09 ? ? ? ? ? ? 251 GLN A OE1 1 
+ATOM   1375 N NE2 . GLN A 1 175 ? 19.396  20.309 31.276 1.00 61.26 ? ? ? ? ? ? 251 GLN A NE2 1 
+ATOM   1376 N N   . LYS A 1 176 ? 18.009  13.911 32.209 1.00 41.57 ? ? ? ? ? ? 252 LYS A N   1 
+ATOM   1377 C CA  . LYS A 1 176 ? 17.425  12.979 33.157 1.00 42.57 ? ? ? ? ? ? 252 LYS A CA  1 
+ATOM   1378 C C   . LYS A 1 176 ? 16.960  13.774 34.363 1.00 40.21 ? ? ? ? ? ? 252 LYS A C   1 
+ATOM   1379 O O   . LYS A 1 176 ? 17.597  14.753 34.751 1.00 39.99 ? ? ? ? ? ? 252 LYS A O   1 
+ATOM   1380 C CB  . LYS A 1 176 ? 18.462  11.945 33.603 1.00 46.81 ? ? ? ? ? ? 252 LYS A CB  1 
+ATOM   1381 C CG  . LYS A 1 176 ? 19.026  11.100 32.473 1.00 51.59 ? ? ? ? ? ? 252 LYS A CG  1 
+ATOM   1382 C CD  . LYS A 1 176 ? 19.968  10.017 32.993 1.00 54.94 ? ? ? ? ? ? 252 LYS A CD  1 
+ATOM   1383 C CE  . LYS A 1 176 ? 20.473  9.136  31.857 1.00 56.53 ? ? ? ? ? ? 252 LYS A CE  1 
+ATOM   1384 N NZ  . LYS A 1 176 ? 21.363  8.038  32.336 1.00 59.73 ? ? ? ? ? ? 252 LYS A NZ  1 
+ATOM   1385 N N   . PRO A 1 177 ? 15.820  13.393 34.950 1.00 37.70 ? ? ? ? ? ? 253 PRO A N   1 
+ATOM   1386 C CA  . PRO A 1 177 ? 15.359  14.139 36.118 1.00 37.07 ? ? ? ? ? ? 253 PRO A CA  1 
+ATOM   1387 C C   . PRO A 1 177 ? 16.321  13.859 37.270 1.00 34.53 ? ? ? ? ? ? 253 PRO A C   1 
+ATOM   1388 O O   . PRO A 1 177 ? 17.158  12.955 37.189 1.00 34.20 ? ? ? ? ? ? 253 PRO A O   1 
+ATOM   1389 C CB  . PRO A 1 177 ? 13.971  13.556 36.354 1.00 39.54 ? ? ? ? ? ? 253 PRO A CB  1 
+ATOM   1390 C CG  . PRO A 1 177 ? 14.176  12.117 35.945 1.00 40.52 ? ? ? ? ? ? 253 PRO A CG  1 
+ATOM   1391 C CD  . PRO A 1 177 ? 14.853  12.337 34.610 1.00 39.72 ? ? ? ? ? ? 253 PRO A CD  1 
+ATOM   1392 N N   . TRP A 1 178 ? 16.210  14.641 38.333 1.00 31.40 ? ? ? ? ? ? 254 TRP A N   1 
+ATOM   1393 C CA  . TRP A 1 178 ? 17.073  14.455 39.486 1.00 27.94 ? ? ? ? ? ? 254 TRP A CA  1 
+ATOM   1394 C C   . TRP A 1 178 ? 16.656  13.155 40.169 1.00 28.57 ? ? ? ? ? ? 254 TRP A C   1 
+ATOM   1395 O O   . TRP A 1 178 ? 15.485  12.773 40.128 1.00 25.12 ? ? ? ? ? ? 254 TRP A O   1 
+ATOM   1396 C CB  . TRP A 1 178 ? 16.917  15.645 40.433 1.00 25.91 ? ? ? ? ? ? 254 TRP A CB  1 
+ATOM   1397 C CG  . TRP A 1 178 ? 17.856  15.638 41.585 1.00 26.14 ? ? ? ? ? ? 254 TRP A CG  1 
+ATOM   1398 C CD1 . TRP A 1 178 ? 17.571  15.317 42.880 1.00 24.52 ? ? ? ? ? ? 254 TRP A CD1 1 
+ATOM   1399 C CD2 . TRP A 1 178 ? 19.247  15.962 41.546 1.00 20.84 ? ? ? ? ? ? 254 TRP A CD2 1 
+ATOM   1400 N NE1 . TRP A 1 178 ? 18.702  15.424 43.653 1.00 24.50 ? ? ? ? ? ? 254 TRP A NE1 1 
+ATOM   1401 C CE2 . TRP A 1 178 ? 19.746  15.820 42.858 1.00 19.78 ? ? ? ? ? ? 254 TRP A CE2 1 
+ATOM   1402 C CE3 . TRP A 1 178 ? 20.122  16.362 40.527 1.00 19.86 ? ? ? ? ? ? 254 TRP A CE3 1 
+ATOM   1403 C CZ2 . TRP A 1 178 ? 21.079  16.061 43.181 1.00 21.84 ? ? ? ? ? ? 254 TRP A CZ2 1 
+ATOM   1404 C CZ3 . TRP A 1 178 ? 21.458  16.603 40.851 1.00 17.94 ? ? ? ? ? ? 254 TRP A CZ3 1 
+ATOM   1405 C CH2 . TRP A 1 178 ? 21.919  16.451 42.166 1.00 18.25 ? ? ? ? ? ? 254 TRP A CH2 1 
+ATOM   1406 N N   . GLU A 1 179 ? 17.621  12.467 40.770 1.00 28.53 ? ? ? ? ? ? 255 GLU A N   1 
+ATOM   1407 C CA  . GLU A 1 179 ? 17.359  11.211 41.470 1.00 26.90 ? ? ? ? ? ? 255 GLU A CA  1 
+ATOM   1408 C C   . GLU A 1 179 ? 16.109  11.287 42.340 1.00 27.77 ? ? ? ? ? ? 255 GLU A C   1 
+ATOM   1409 O O   . GLU A 1 179 ? 15.870  12.284 43.019 1.00 23.72 ? ? ? ? ? ? 255 GLU A O   1 
+ATOM   1410 C CB  . GLU A 1 179 ? 18.556  10.847 42.346 1.00 30.79 ? ? ? ? ? ? 255 GLU A CB  1 
+ATOM   1411 C CG  . GLU A 1 179 ? 18.400  9.542  43.104 1.00 34.55 ? ? ? ? ? ? 255 GLU A CG  1 
+ATOM   1412 C CD  . GLU A 1 179 ? 19.616  9.213  43.942 1.00 41.24 ? ? ? ? ? ? 255 GLU A CD  1 
+ATOM   1413 O OE1 . GLU A 1 179 ? 19.625  8.128  44.560 1.00 46.57 ? ? ? ? ? ? 255 GLU A OE1 1 
+ATOM   1414 O OE2 . GLU A 1 179 ? 20.560  10.036 43.984 1.00 40.18 ? ? ? ? ? ? 255 GLU A OE2 1 
+ATOM   1415 N N   . LYS A 1 180 ? 15.324  10.217 42.331 1.00 28.01 ? ? ? ? ? ? 257 LYS A N   1 
+ATOM   1416 C CA  . LYS A 1 180 ? 14.095  10.165 43.112 1.00 30.22 ? ? ? ? ? ? 257 LYS A CA  1 
+ATOM   1417 C C   . LYS A 1 180 ? 14.365  10.297 44.610 1.00 28.06 ? ? ? ? ? ? 257 LYS A C   1 
+ATOM   1418 O O   . LYS A 1 180 ? 15.308  9.710  45.131 1.00 25.31 ? ? ? ? ? ? 257 LYS A O   1 
+ATOM   1419 C CB  . LYS A 1 180 ? 13.356  8.848  42.860 1.00 35.46 ? ? ? ? ? ? 257 LYS A CB  1 
+ATOM   1420 C CG  . LYS A 1 180 ? 11.998  8.785  43.550 1.00 44.74 ? ? ? ? ? ? 257 LYS A CG  1 
+ATOM   1421 C CD  . LYS A 1 180 ? 11.384  7.387  43.554 1.00 51.67 ? ? ? ? ? ? 257 LYS A CD  1 
+ATOM   1422 C CE  . LYS A 1 180 ? 11.218  6.818  42.160 1.00 55.78 ? ? ? ? ? ? 257 LYS A CE  1 
+ATOM   1423 N NZ  . LYS A 1 180 ? 12.518  6.508  41.500 1.00 58.30 ? ? ? ? ? ? 257 LYS A NZ  1 
+ATOM   1424 N N   . ASP A 1 181 ? 13.516  11.064 45.289 1.00 29.07 ? ? ? ? ? ? 258 ASP A N   1 
+ATOM   1425 C CA  . ASP A 1 181 ? 13.619  11.288 46.730 1.00 32.27 ? ? ? ? ? ? 258 ASP A CA  1 
+ATOM   1426 C C   . ASP A 1 181 ? 15.009  11.714 47.193 1.00 31.41 ? ? ? ? ? ? 258 ASP A C   1 
+ATOM   1427 O O   . ASP A 1 181 ? 15.436  11.350 48.287 1.00 33.44 ? ? ? ? ? ? 258 ASP A O   1 
+ATOM   1428 C CB  . ASP A 1 181 ? 13.200  10.027 47.495 1.00 32.83 ? ? ? ? ? ? 258 ASP A CB  1 
+ATOM   1429 C CG  . ASP A 1 181 ? 11.816  9.537  47.102 1.00 37.59 ? ? ? ? ? ? 258 ASP A CG  1 
+ATOM   1430 O OD1 . ASP A 1 181 ? 10.864  10.348 47.133 1.00 38.05 ? ? ? ? ? ? 258 ASP A OD1 1 
+ATOM   1431 O OD2 . ASP A 1 181 ? 11.682  8.338  46.769 1.00 40.37 ? ? ? ? ? ? 258 ASP A OD2 1 
+ATOM   1432 N N   . ALA A 1 182 ? 15.711  12.486 46.370 1.00 28.54 ? ? ? ? ? ? 259 ALA A N   1 
+ATOM   1433 C CA  . ALA A 1 182 ? 17.047  12.953 46.726 1.00 27.48 ? ? ? ? ? ? 259 ALA A CA  1 
+ATOM   1434 C C   . ALA A 1 182 ? 17.029  14.459 46.979 1.00 25.31 ? ? ? ? ? ? 259 ALA A C   1 
+ATOM   1435 O O   . ALA A 1 182 ? 17.787  15.207 46.367 1.00 25.19 ? ? ? ? ? ? 259 ALA A O   1 
+ATOM   1436 C CB  . ALA A 1 182 ? 18.035  12.617 45.610 1.00 25.32 ? ? ? ? ? ? 259 ALA A CB  1 
+ATOM   1437 N N   . TRP A 1 183 ? 16.149  14.897 47.875 1.00 23.61 ? ? ? ? ? ? 260 TRP A N   1 
+ATOM   1438 C CA  . TRP A 1 183 ? 16.033  16.312 48.210 1.00 21.03 ? ? ? ? ? ? 260 TRP A CA  1 
+ATOM   1439 C C   . TRP A 1 183 ? 17.121  16.700 49.211 1.00 20.94 ? ? ? ? ? ? 260 TRP A C   1 
+ATOM   1440 O O   . TRP A 1 183 ? 17.917  17.601 48.957 1.00 19.84 ? ? ? ? ? ? 260 TRP A O   1 
+ATOM   1441 C CB  . TRP A 1 183 ? 14.648  16.595 48.794 1.00 20.11 ? ? ? ? ? ? 260 TRP A CB  1 
+ATOM   1442 C CG  . TRP A 1 183 ? 14.478  17.996 49.306 1.00 19.28 ? ? ? ? ? ? 260 TRP A CG  1 
+ATOM   1443 C CD1 . TRP A 1 183 ? 14.048  18.355 50.546 1.00 18.54 ? ? ? ? ? ? 260 TRP A CD1 1 
+ATOM   1444 C CD2 . TRP A 1 183 ? 14.751  19.217 48.606 1.00 15.81 ? ? ? ? ? ? 260 TRP A CD2 1 
+ATOM   1445 N NE1 . TRP A 1 183 ? 14.039  19.717 50.670 1.00 16.64 ? ? ? ? ? ? 260 TRP A NE1 1 
+ATOM   1446 C CE2 . TRP A 1 183 ? 14.467  20.276 49.493 1.00 15.54 ? ? ? ? ? ? 260 TRP A CE2 1 
+ATOM   1447 C CE3 . TRP A 1 183 ? 15.212  19.522 47.317 1.00 16.86 ? ? ? ? ? ? 260 TRP A CE3 1 
+ATOM   1448 C CZ2 . TRP A 1 183 ? 14.625  21.622 49.140 1.00 16.38 ? ? ? ? ? ? 260 TRP A CZ2 1 
+ATOM   1449 C CZ3 . TRP A 1 183 ? 15.371  20.865 46.961 1.00 17.40 ? ? ? ? ? ? 260 TRP A CZ3 1 
+ATOM   1450 C CH2 . TRP A 1 183 ? 15.078  21.897 47.875 1.00 13.59 ? ? ? ? ? ? 260 TRP A CH2 1 
+ATOM   1451 N N   . GLU A 1 184 ? 17.144  16.033 50.358 1.00 19.45 ? ? ? ? ? ? 261 GLU A N   1 
+ATOM   1452 C CA  . GLU A 1 184 ? 18.173  16.305 51.353 1.00 20.11 ? ? ? ? ? ? 261 GLU A CA  1 
+ATOM   1453 C C   . GLU A 1 184 ? 19.212  15.232 51.081 1.00 21.20 ? ? ? ? ? ? 261 GLU A C   1 
+ATOM   1454 O O   . GLU A 1 184 ? 18.934  14.043 51.252 1.00 22.36 ? ? ? ? ? ? 261 GLU A O   1 
+ATOM   1455 C CB  . GLU A 1 184 ? 17.630  16.155 52.771 1.00 20.94 ? ? ? ? ? ? 261 GLU A CB  1 
+ATOM   1456 C CG  . GLU A 1 184 ? 16.451  17.054 53.091 1.00 27.68 ? ? ? ? ? ? 261 GLU A CG  1 
+ATOM   1457 C CD  . GLU A 1 184 ? 16.050  16.974 54.556 1.00 30.79 ? ? ? ? ? ? 261 GLU A CD  1 
+ATOM   1458 O OE1 . GLU A 1 184 ? 14.990  17.522 54.909 1.00 31.60 ? ? ? ? ? ? 261 GLU A OE1 1 
+ATOM   1459 O OE2 . GLU A 1 184 ? 16.802  16.374 55.356 1.00 35.78 ? ? ? ? ? ? 261 GLU A OE2 1 
+ATOM   1460 N N   . ILE A 1 185 ? 20.394  15.651 50.640 1.00 19.78 ? ? ? ? ? ? 262 ILE A N   1 
+ATOM   1461 C CA  . ILE A 1 185 ? 21.458  14.719 50.302 1.00 15.57 ? ? ? ? ? ? 262 ILE A CA  1 
+ATOM   1462 C C   . ILE A 1 185 ? 22.695  14.851 51.178 1.00 16.43 ? ? ? ? ? ? 262 ILE A C   1 
+ATOM   1463 O O   . ILE A 1 185 ? 22.989  15.919 51.709 1.00 16.70 ? ? ? ? ? ? 262 ILE A O   1 
+ATOM   1464 C CB  . ILE A 1 185 ? 21.910  14.914 48.842 1.00 17.47 ? ? ? ? ? ? 262 ILE A CB  1 
+ATOM   1465 C CG1 . ILE A 1 185 ? 22.487  16.326 48.674 1.00 18.88 ? ? ? ? ? ? 262 ILE A CG1 1 
+ATOM   1466 C CG2 . ILE A 1 185 ? 20.730  14.684 47.893 1.00 14.05 ? ? ? ? ? ? 262 ILE A CG2 1 
+ATOM   1467 C CD1 . ILE A 1 185 ? 22.970  16.643 47.278 1.00 17.07 ? ? ? ? ? ? 262 ILE A CD1 1 
+ATOM   1468 N N   . PRO A 1 186 ? 23.451  13.756 51.321 1.00 15.11 ? ? ? ? ? ? 263 PRO A N   1 
+ATOM   1469 C CA  . PRO A 1 186 ? 24.667  13.754 52.132 1.00 16.94 ? ? ? ? ? ? 263 PRO A CA  1 
+ATOM   1470 C C   . PRO A 1 186 ? 25.689  14.685 51.485 1.00 15.79 ? ? ? ? ? ? 263 PRO A C   1 
+ATOM   1471 O O   . PRO A 1 186 ? 25.792  14.746 50.260 1.00 17.33 ? ? ? ? ? ? 263 PRO A O   1 
+ATOM   1472 C CB  . PRO A 1 186 ? 25.109  12.284 52.074 1.00 17.73 ? ? ? ? ? ? 263 PRO A CB  1 
+ATOM   1473 C CG  . PRO A 1 186 ? 23.789  11.532 51.822 1.00 18.76 ? ? ? ? ? ? 263 PRO A CG  1 
+ATOM   1474 C CD  . PRO A 1 186 ? 23.237  12.425 50.728 1.00 14.60 ? ? ? ? ? ? 263 PRO A CD  1 
+ATOM   1475 N N   . ARG A 1 187 ? 26.446  15.410 52.299 1.00 13.29 ? ? ? ? ? ? 264 ARG A N   1 
+ATOM   1476 C CA  . ARG A 1 187 ? 27.462  16.306 51.765 1.00 14.83 ? ? ? ? ? ? 264 ARG A CA  1 
+ATOM   1477 C C   . ARG A 1 187 ? 28.451  15.520 50.885 1.00 13.57 ? ? ? ? ? ? 264 ARG A C   1 
+ATOM   1478 O O   . ARG A 1 187 ? 28.885  16.003 49.833 1.00 11.65 ? ? ? ? ? ? 264 ARG A O   1 
+ATOM   1479 C CB  . ARG A 1 187 ? 28.220  16.987 52.916 1.00 14.81 ? ? ? ? ? ? 264 ARG A CB  1 
+ATOM   1480 C CG  . ARG A 1 187 ? 29.153  18.124 52.492 1.00 16.29 ? ? ? ? ? ? 264 ARG A CG  1 
+ATOM   1481 C CD  . ARG A 1 187 ? 29.955  18.615 53.691 1.00 20.65 ? ? ? ? ? ? 264 ARG A CD  1 
+ATOM   1482 N NE  . ARG A 1 187 ? 29.085  19.007 54.799 1.00 18.13 ? ? ? ? ? ? 264 ARG A NE  1 
+ATOM   1483 C CZ  . ARG A 1 187 ? 28.305  20.087 54.799 1.00 18.59 ? ? ? ? ? ? 264 ARG A CZ  1 
+ATOM   1484 N NH1 . ARG A 1 187 ? 28.274  20.900 53.752 1.00 18.53 ? ? ? ? ? ? 264 ARG A NH1 1 
+ATOM   1485 N NH2 . ARG A 1 187 ? 27.537  20.346 55.846 1.00 22.95 ? ? ? ? ? ? 264 ARG A NH2 1 
+ATOM   1486 N N   . GLU A 1 188 ? 28.802  14.304 51.300 1.00 16.78 ? ? ? ? ? ? 265 GLU A N   1 
+ATOM   1487 C CA  . GLU A 1 188 ? 29.764  13.512 50.528 1.00 15.97 ? ? ? ? ? ? 265 GLU A CA  1 
+ATOM   1488 C C   . GLU A 1 188 ? 29.312  13.099 49.121 1.00 14.55 ? ? ? ? ? ? 265 GLU A C   1 
+ATOM   1489 O O   . GLU A 1 188 ? 30.133  12.656 48.322 1.00 16.12 ? ? ? ? ? ? 265 GLU A O   1 
+ATOM   1490 C CB  . GLU A 1 188 ? 30.220  12.252 51.304 1.00 15.32 ? ? ? ? ? ? 265 GLU A CB  1 
+ATOM   1491 C CG  . GLU A 1 188 ? 29.113  11.266 51.663 1.00 14.95 ? ? ? ? ? ? 265 GLU A CG  1 
+ATOM   1492 C CD  . GLU A 1 188 ? 28.493  11.550 53.009 1.00 13.55 ? ? ? ? ? ? 265 GLU A CD  1 
+ATOM   1493 O OE1 . GLU A 1 188 ? 28.400  12.739 53.381 1.00 17.65 ? ? ? ? ? ? 265 GLU A OE1 1 
+ATOM   1494 O OE2 . GLU A 1 188 ? 28.076  10.583 53.683 1.00 16.72 ? ? ? ? ? ? 265 GLU A OE2 1 
+ATOM   1495 N N   . SER A 1 189 ? 28.023  13.231 48.810 1.00 14.81 ? ? ? ? ? ? 266 SER A N   1 
+ATOM   1496 C CA  . SER A 1 189 ? 27.533  12.861 47.481 1.00 15.35 ? ? ? ? ? ? 266 SER A CA  1 
+ATOM   1497 C C   . SER A 1 189 ? 28.021  13.850 46.431 1.00 15.51 ? ? ? ? ? ? 266 SER A C   1 
+ATOM   1498 O O   . SER A 1 189 ? 28.011  13.562 45.229 1.00 15.61 ? ? ? ? ? ? 266 SER A O   1 
+ATOM   1499 C CB  . SER A 1 189 ? 26.002  12.831 47.452 1.00 14.20 ? ? ? ? ? ? 266 SER A CB  1 
+ATOM   1500 O OG  . SER A 1 189 ? 25.476  14.125 47.679 1.00 13.59 ? ? ? ? ? ? 266 SER A OG  1 
+ATOM   1501 N N   . LEU A 1 190 ? 28.428  15.027 46.891 1.00 15.77 ? ? ? ? ? ? 267 LEU A N   1 
+ATOM   1502 C CA  . LEU A 1 190 ? 28.924  16.066 46.005 1.00 16.22 ? ? ? ? ? ? 267 LEU A CA  1 
+ATOM   1503 C C   . LEU A 1 190 ? 30.445  16.153 45.997 1.00 18.24 ? ? ? ? ? ? 267 LEU A C   1 
+ATOM   1504 O O   . LEU A 1 190 ? 31.084  16.042 47.039 1.00 18.76 ? ? ? ? ? ? 267 LEU A O   1 
+ATOM   1505 C CB  . LEU A 1 190 ? 28.365  17.424 46.432 1.00 18.89 ? ? ? ? ? ? 267 LEU A CB  1 
+ATOM   1506 C CG  . LEU A 1 190 ? 26.854  17.598 46.307 1.00 18.02 ? ? ? ? ? ? 267 LEU A CG  1 
+ATOM   1507 C CD1 . LEU A 1 190 ? 26.424  18.841 47.036 1.00 16.14 ? ? ? ? ? ? 267 LEU A CD1 1 
+ATOM   1508 C CD2 . LEU A 1 190 ? 26.482  17.670 44.825 1.00 17.76 ? ? ? ? ? ? 267 LEU A CD2 1 
+ATOM   1509 N N   . LYS A 1 191 ? 31.013  16.357 44.812 1.00 16.16 ? ? ? ? ? ? 268 LYS A N   1 
+ATOM   1510 C CA  . LYS A 1 191 ? 32.453  16.535 44.654 1.00 19.39 ? ? ? ? ? ? 268 LYS A CA  1 
+ATOM   1511 C C   . LYS A 1 191 ? 32.648  17.952 44.104 1.00 16.23 ? ? ? ? ? ? 268 LYS A C   1 
+ATOM   1512 O O   . LYS A 1 191 ? 32.431  18.184 42.911 1.00 18.30 ? ? ? ? ? ? 268 LYS A O   1 
+ATOM   1513 C CB  . LYS A 1 191 ? 33.021  15.513 43.662 1.00 20.21 ? ? ? ? ? ? 268 LYS A CB  1 
+ATOM   1514 C CG  . LYS A 1 191 ? 34.508  15.711 43.338 1.00 19.55 ? ? ? ? ? ? 268 LYS A CG  1 
+ATOM   1515 C CD  . LYS A 1 191 ? 35.369  15.539 44.573 1.00 25.85 ? ? ? ? ? ? 268 LYS A CD  1 
+ATOM   1516 C CE  . LYS A 1 191 ? 36.862  15.674 44.260 1.00 30.68 ? ? ? ? ? ? 268 LYS A CE  1 
+ATOM   1517 N NZ  . LYS A 1 191 ? 37.669  15.441 45.489 1.00 27.22 ? ? ? ? ? ? 268 LYS A NZ  1 
+ATOM   1518 N N   . LEU A 1 192 ? 33.032  18.899 44.967 1.00 17.89 ? ? ? ? ? ? 269 LEU A N   1 
+ATOM   1519 C CA  . LEU A 1 192 ? 33.245  20.288 44.541 1.00 17.75 ? ? ? ? ? ? 269 LEU A CA  1 
+ATOM   1520 C C   . LEU A 1 192 ? 34.570  20.389 43.796 1.00 22.11 ? ? ? ? ? ? 269 LEU A C   1 
+ATOM   1521 O O   . LEU A 1 192 ? 35.626  20.044 44.329 1.00 21.06 ? ? ? ? ? ? 269 LEU A O   1 
+ATOM   1522 C CB  . LEU A 1 192 ? 33.196  21.252 45.742 1.00 19.52 ? ? ? ? ? ? 269 LEU A CB  1 
+ATOM   1523 C CG  . LEU A 1 192 ? 31.778  21.664 46.193 1.00 19.50 ? ? ? ? ? ? 269 LEU A CG  1 
+ATOM   1524 C CD1 . LEU A 1 192 ? 30.961  20.436 46.535 1.00 20.13 ? ? ? ? ? ? 269 LEU A CD1 1 
+ATOM   1525 C CD2 . LEU A 1 192 ? 31.851  22.604 47.386 1.00 23.13 ? ? ? ? ? ? 269 LEU A CD2 1 
+ATOM   1526 N N   . GLU A 1 193 ? 34.500  20.885 42.563 1.00 22.96 ? ? ? ? ? ? 270 GLU A N   1 
+ATOM   1527 C CA  . GLU A 1 193 ? 35.660  20.951 41.681 1.00 26.05 ? ? ? ? ? ? 270 GLU A CA  1 
+ATOM   1528 C C   . GLU A 1 193 ? 36.372  22.292 41.495 1.00 27.96 ? ? ? ? ? ? 270 GLU A C   1 
+ATOM   1529 O O   . GLU A 1 193 ? 37.578  22.383 41.715 1.00 27.83 ? ? ? ? ? ? 270 GLU A O   1 
+ATOM   1530 C CB  . GLU A 1 193 ? 35.231  20.404 40.321 1.00 25.67 ? ? ? ? ? ? 270 GLU A CB  1 
+ATOM   1531 C CG  . GLU A 1 193 ? 34.460  19.099 40.455 1.00 30.03 ? ? ? ? ? ? 270 GLU A CG  1 
+ATOM   1532 C CD  . GLU A 1 193 ? 33.713  18.706 39.193 1.00 29.93 ? ? ? ? ? ? 270 GLU A CD  1 
+ATOM   1533 O OE1 . GLU A 1 193 ? 33.133  19.598 38.537 1.00 28.32 ? ? ? ? ? ? 270 GLU A OE1 1 
+ATOM   1534 O OE2 . GLU A 1 193 ? 33.674  17.500 38.878 1.00 33.98 ? ? ? ? ? ? 270 GLU A OE2 1 
+ATOM   1535 N N   . LYS A 1 194 ? 35.640  23.318 41.062 1.00 30.80 ? ? ? ? ? ? 271 LYS A N   1 
+ATOM   1536 C CA  . LYS A 1 194 ? 36.230  24.641 40.837 1.00 29.56 ? ? ? ? ? ? 271 LYS A CA  1 
+ATOM   1537 C C   . LYS A 1 194 ? 35.264  25.738 41.257 1.00 30.67 ? ? ? ? ? ? 271 LYS A C   1 
+ATOM   1538 O O   . LYS A 1 194 ? 34.049  25.580 41.159 1.00 26.47 ? ? ? ? ? ? 271 LYS A O   1 
+ATOM   1539 C CB  . LYS A 1 194 ? 36.587  24.834 39.361 1.00 33.28 ? ? ? ? ? ? 271 LYS A CB  1 
+ATOM   1540 C CG  . LYS A 1 194 ? 35.393  24.843 38.424 1.00 37.28 ? ? ? ? ? ? 271 LYS A CG  1 
+ATOM   1541 C CD  . LYS A 1 194 ? 35.795  25.116 36.974 1.00 42.29 ? ? ? ? ? ? 271 LYS A CD  1 
+ATOM   1542 C CE  . LYS A 1 194 ? 34.567  25.114 36.061 1.00 44.20 ? ? ? ? ? ? 271 LYS A CE  1 
+ATOM   1543 N NZ  . LYS A 1 194 ? 34.888  25.332 34.621 1.00 46.47 ? ? ? ? ? ? 271 LYS A NZ  1 
+ATOM   1544 N N   . LYS A 1 195 ? 35.813  26.855 41.718 1.00 27.86 ? ? ? ? ? ? 272 LYS A N   1 
+ATOM   1545 C CA  . LYS A 1 195 ? 35.006  27.977 42.171 1.00 28.05 ? ? ? ? ? ? 272 LYS A CA  1 
+ATOM   1546 C C   . LYS A 1 195 ? 34.495  28.782 40.980 1.00 26.73 ? ? ? ? ? ? 272 LYS A C   1 
+ATOM   1547 O O   . LYS A 1 195 ? 35.279  29.232 40.147 1.00 23.84 ? ? ? ? ? ? 272 LYS A O   1 
+ATOM   1548 C CB  . LYS A 1 195 ? 35.848  28.852 43.108 1.00 29.50 ? ? ? ? ? ? 272 LYS A CB  1 
+ATOM   1549 C CG  . LYS A 1 195 ? 35.107  29.997 43.763 1.00 34.51 ? ? ? ? ? ? 272 LYS A CG  1 
+ATOM   1550 C CD  . LYS A 1 195 ? 36.015  30.736 44.731 1.00 33.91 ? ? ? ? ? ? 272 LYS A CD  1 
+ATOM   1551 C CE  . LYS A 1 195 ? 35.330  31.955 45.319 1.00 34.28 ? ? ? ? ? ? 272 LYS A CE  1 
+ATOM   1552 N NZ  . LYS A 1 195 ? 36.233  32.680 46.258 1.00 42.03 ? ? ? ? ? ? 272 LYS A NZ  1 
+ATOM   1553 N N   . LEU A 1 196 ? 33.176  28.949 40.898 1.00 24.01 ? ? ? ? ? ? 273 LEU A N   1 
+ATOM   1554 C CA  . LEU A 1 196 ? 32.558  29.694 39.802 1.00 23.10 ? ? ? ? ? ? 273 LEU A CA  1 
+ATOM   1555 C C   . LEU A 1 196 ? 32.368  31.171 40.123 1.00 24.28 ? ? ? ? ? ? 273 LEU A C   1 
+ATOM   1556 O O   . LEU A 1 196 ? 32.458  32.015 39.239 1.00 27.10 ? ? ? ? ? ? 273 LEU A O   1 
+ATOM   1557 C CB  . LEU A 1 196 ? 31.196  29.085 39.441 1.00 21.71 ? ? ? ? ? ? 273 LEU A CB  1 
+ATOM   1558 C CG  . LEU A 1 196 ? 31.220  27.655 38.908 1.00 23.39 ? ? ? ? ? ? 273 LEU A CG  1 
+ATOM   1559 C CD1 . LEU A 1 196 ? 29.803  27.143 38.708 1.00 20.84 ? ? ? ? ? ? 273 LEU A CD1 1 
+ATOM   1560 C CD2 . LEU A 1 196 ? 31.995  27.625 37.595 1.00 26.77 ? ? ? ? ? ? 273 LEU A CD2 1 
+ATOM   1561 N N   . GLY A 1 197 ? 32.092  31.483 41.383 1.00 25.25 ? ? ? ? ? ? 274 GLY A N   1 
+ATOM   1562 C CA  . GLY A 1 197 ? 31.882  32.869 41.753 1.00 28.97 ? ? ? ? ? ? 274 GLY A CA  1 
+ATOM   1563 C C   . GLY A 1 197 ? 31.738  33.041 43.249 1.00 34.27 ? ? ? ? ? ? 274 GLY A C   1 
+ATOM   1564 O O   . GLY A 1 197 ? 31.606  32.064 43.987 1.00 30.90 ? ? ? ? ? ? 274 GLY A O   1 
+ATOM   1565 N N   . ALA A 1 198 ? 31.771  34.285 43.708 1.00 35.74 ? ? ? ? ? ? 275 ALA A N   1 
+ATOM   1566 C CA  . ALA A 1 198 ? 31.642  34.549 45.131 1.00 39.92 ? ? ? ? ? ? 275 ALA A CA  1 
+ATOM   1567 C C   . ALA A 1 198 ? 30.370  35.323 45.427 1.00 42.67 ? ? ? ? ? ? 275 ALA A C   1 
+ATOM   1568 O O   . ALA A 1 198 ? 29.594  35.641 44.527 1.00 46.66 ? ? ? ? ? ? 275 ALA A O   1 
+ATOM   1569 C CB  . ALA A 1 198 ? 32.851  35.319 45.631 1.00 40.80 ? ? ? ? ? ? 275 ALA A CB  1 
+ATOM   1570 N N   . GLY A 1 199 ? 30.164  35.615 46.704 1.00 44.32 ? ? ? ? ? ? 276 GLY A N   1 
+ATOM   1571 C CA  . GLY A 1 199 ? 28.991  36.353 47.129 1.00 45.46 ? ? ? ? ? ? 276 GLY A CA  1 
+ATOM   1572 C C   . GLY A 1 199 ? 29.203  36.804 48.558 1.00 45.72 ? ? ? ? ? ? 276 GLY A C   1 
+ATOM   1573 O O   . GLY A 1 199 ? 30.140  36.350 49.213 1.00 47.06 ? ? ? ? ? ? 276 GLY A O   1 
+ATOM   1574 N N   . GLN A 1 200 ? 28.340  37.683 49.053 1.00 47.71 ? ? ? ? ? ? 277 GLN A N   1 
+ATOM   1575 C CA  . GLN A 1 200 ? 28.481  38.179 50.414 1.00 47.23 ? ? ? ? ? ? 277 GLN A CA  1 
+ATOM   1576 C C   . GLN A 1 200 ? 28.039  37.198 51.492 1.00 43.90 ? ? ? ? ? ? 277 GLN A C   1 
+ATOM   1577 O O   . GLN A 1 200 ? 28.413  37.347 52.655 1.00 43.95 ? ? ? ? ? ? 277 GLN A O   1 
+ATOM   1578 C CB  . GLN A 1 200 ? 27.722  39.490 50.568 1.00 52.57 ? ? ? ? ? ? 277 GLN A CB  1 
+ATOM   1579 C CG  . GLN A 1 200 ? 28.331  40.634 49.783 1.00 60.66 ? ? ? ? ? ? 277 GLN A CG  1 
+ATOM   1580 C CD  . GLN A 1 200 ? 27.492  41.888 49.866 1.00 65.22 ? ? ? ? ? ? 277 GLN A CD  1 
+ATOM   1581 O OE1 . GLN A 1 200 ? 27.912  42.963 49.436 1.00 67.89 ? ? ? ? ? ? 277 GLN A OE1 1 
+ATOM   1582 N NE2 . GLN A 1 200 ? 26.288  41.753 50.411 1.00 67.38 ? ? ? ? ? ? 277 GLN A NE2 1 
+ATOM   1583 N N   . PHE A 1 201 ? 27.247  36.199 51.119 1.00 40.10 ? ? ? ? ? ? 278 PHE A N   1 
+ATOM   1584 C CA  . PHE A 1 201 ? 26.791  35.216 52.097 1.00 35.61 ? ? ? ? ? ? 278 PHE A CA  1 
+ATOM   1585 C C   . PHE A 1 201 ? 27.155  33.786 51.723 1.00 35.34 ? ? ? ? ? ? 278 PHE A C   1 
+ATOM   1586 O O   . PHE A 1 201 ? 26.760  32.842 52.402 1.00 34.32 ? ? ? ? ? ? 278 PHE A O   1 
+ATOM   1587 C CB  . PHE A 1 201 ? 25.279  35.319 52.302 1.00 33.89 ? ? ? ? ? ? 278 PHE A CB  1 
+ATOM   1588 C CG  . PHE A 1 201 ? 24.837  36.636 52.856 1.00 30.71 ? ? ? ? ? ? 278 PHE A CG  1 
+ATOM   1589 C CD1 . PHE A 1 201 ? 24.193  37.562 52.051 1.00 29.64 ? ? ? ? ? ? 278 PHE A CD1 1 
+ATOM   1590 C CD2 . PHE A 1 201 ? 25.107  36.968 54.176 1.00 33.59 ? ? ? ? ? ? 278 PHE A CD2 1 
+ATOM   1591 C CE1 . PHE A 1 201 ? 23.824  38.799 52.551 1.00 31.20 ? ? ? ? ? ? 278 PHE A CE1 1 
+ATOM   1592 C CE2 . PHE A 1 201 ? 24.743  38.207 54.689 1.00 31.15 ? ? ? ? ? ? 278 PHE A CE2 1 
+ATOM   1593 C CZ  . PHE A 1 201 ? 24.102  39.123 53.877 1.00 31.75 ? ? ? ? ? ? 278 PHE A CZ  1 
+ATOM   1594 N N   . GLY A 1 202 ? 27.916  33.630 50.650 1.00 35.45 ? ? ? ? ? ? 279 GLY A N   1 
+ATOM   1595 C CA  . GLY A 1 202 ? 28.304  32.301 50.220 1.00 36.35 ? ? ? ? ? ? 279 GLY A CA  1 
+ATOM   1596 C C   . GLY A 1 202 ? 28.969  32.308 48.861 1.00 34.23 ? ? ? ? ? ? 279 GLY A C   1 
+ATOM   1597 O O   . GLY A 1 202 ? 28.911  33.301 48.134 1.00 37.46 ? ? ? ? ? ? 279 GLY A O   1 
+ATOM   1598 N N   . GLU A 1 203 ? 29.610  31.199 48.516 1.00 28.03 ? ? ? ? ? ? 280 GLU A N   1 
+ATOM   1599 C CA  . GLU A 1 203 ? 30.287  31.089 47.235 1.00 24.95 ? ? ? ? ? ? 280 GLU A CA  1 
+ATOM   1600 C C   . GLU A 1 203 ? 29.544  30.091 46.354 1.00 21.60 ? ? ? ? ? ? 280 GLU A C   1 
+ATOM   1601 O O   . GLU A 1 203 ? 28.675  29.356 46.825 1.00 21.98 ? ? ? ? ? ? 280 GLU A O   1 
+ATOM   1602 C CB  . GLU A 1 203 ? 31.716  30.592 47.431 1.00 27.29 ? ? ? ? ? ? 280 GLU A CB  1 
+ATOM   1603 C CG  . GLU A 1 203 ? 32.529  31.331 48.475 1.00 33.13 ? ? ? ? ? ? 280 GLU A CG  1 
+ATOM   1604 C CD  . GLU A 1 203 ? 34.007  30.992 48.366 1.00 37.03 ? ? ? ? ? ? 280 GLU A CD  1 
+ATOM   1605 O OE1 . GLU A 1 203 ? 34.331  29.794 48.222 1.00 35.83 ? ? ? ? ? ? 280 GLU A OE1 1 
+ATOM   1606 O OE2 . GLU A 1 203 ? 34.844  31.918 48.426 1.00 41.20 ? ? ? ? ? ? 280 GLU A OE2 1 
+ATOM   1607 N N   . VAL A 1 204 ? 29.895  30.059 45.077 1.00 20.09 ? ? ? ? ? ? 281 VAL A N   1 
+ATOM   1608 C CA  . VAL A 1 204 ? 29.265  29.130 44.150 1.00 21.15 ? ? ? ? ? ? 281 VAL A CA  1 
+ATOM   1609 C C   . VAL A 1 204 ? 30.351  28.292 43.501 1.00 21.80 ? ? ? ? ? ? 281 VAL A C   1 
+ATOM   1610 O O   . VAL A 1 204 ? 31.351  28.828 43.015 1.00 20.72 ? ? ? ? ? ? 281 VAL A O   1 
+ATOM   1611 C CB  . VAL A 1 204 ? 28.455  29.876 43.071 1.00 20.56 ? ? ? ? ? ? 281 VAL A CB  1 
+ATOM   1612 C CG1 . VAL A 1 204 ? 27.849  28.880 42.090 1.00 19.19 ? ? ? ? ? ? 281 VAL A CG1 1 
+ATOM   1613 C CG2 . VAL A 1 204 ? 27.343  30.681 43.740 1.00 20.18 ? ? ? ? ? ? 281 VAL A CG2 1 
+ATOM   1614 N N   . TRP A 1 205 ? 30.143  26.977 43.505 1.00 16.61 ? ? ? ? ? ? 282 TRP A N   1 
+ATOM   1615 C CA  . TRP A 1 205 ? 31.099  26.027 42.949 1.00 18.89 ? ? ? ? ? ? 282 TRP A CA  1 
+ATOM   1616 C C   . TRP A 1 205 ? 30.508  25.075 41.922 1.00 20.29 ? ? ? ? ? ? 282 TRP A C   1 
+ATOM   1617 O O   . TRP A 1 205 ? 29.321  24.754 41.964 1.00 17.22 ? ? ? ? ? ? 282 TRP A O   1 
+ATOM   1618 C CB  . TRP A 1 205 ? 31.709  25.163 44.063 1.00 18.56 ? ? ? ? ? ? 282 TRP A CB  1 
+ATOM   1619 C CG  . TRP A 1 205 ? 32.612  25.894 44.986 1.00 26.18 ? ? ? ? ? ? 282 TRP A CG  1 
+ATOM   1620 C CD1 . TRP A 1 205 ? 32.258  26.788 45.953 1.00 28.48 ? ? ? ? ? ? 282 TRP A CD1 1 
+ATOM   1621 C CD2 . TRP A 1 205 ? 34.039  25.833 44.995 1.00 26.22 ? ? ? ? ? ? 282 TRP A CD2 1 
+ATOM   1622 N NE1 . TRP A 1 205 ? 33.381  27.293 46.563 1.00 29.55 ? ? ? ? ? ? 282 TRP A NE1 1 
+ATOM   1623 C CE2 . TRP A 1 205 ? 34.491  26.721 45.990 1.00 28.26 ? ? ? ? ? ? 282 TRP A CE2 1 
+ATOM   1624 C CE3 . TRP A 1 205 ? 34.988  25.114 44.250 1.00 33.53 ? ? ? ? ? ? 282 TRP A CE3 1 
+ATOM   1625 C CZ2 . TRP A 1 205 ? 35.844  26.911 46.267 1.00 24.43 ? ? ? ? ? ? 282 TRP A CZ2 1 
+ATOM   1626 C CZ3 . TRP A 1 205 ? 36.341  25.302 44.525 1.00 30.87 ? ? ? ? ? ? 282 TRP A CZ3 1 
+ATOM   1627 C CH2 . TRP A 1 205 ? 36.753  26.196 45.525 1.00 30.88 ? ? ? ? ? ? 282 TRP A CH2 1 
+ATOM   1628 N N   . MET A 1 206 ? 31.364  24.623 41.011 1.00 17.89 ? ? ? ? ? ? 283 MET A N   1 
+ATOM   1629 C CA  . MET A 1 206 ? 31.004  23.646 39.989 1.00 19.38 ? ? ? ? ? ? 283 MET A CA  1 
+ATOM   1630 C C   . MET A 1 206 ? 31.231  22.326 40.719 1.00 19.61 ? ? ? ? ? ? 283 MET A C   1 
+ATOM   1631 O O   . MET A 1 206 ? 32.210  22.208 41.459 1.00 19.82 ? ? ? ? ? ? 283 MET A O   1 
+ATOM   1632 C CB  . MET A 1 206 ? 31.981  23.729 38.814 1.00 24.49 ? ? ? ? ? ? 283 MET A CB  1 
+ATOM   1633 C CG  . MET A 1 206 ? 31.689  22.806 37.639 1.00 34.44 ? ? ? ? ? ? 283 MET A CG  1 
+ATOM   1634 S SD  . MET A 1 206 ? 30.316  23.395 36.627 1.00 47.43 ? ? ? ? ? ? 283 MET A SD  1 
+ATOM   1635 C CE  . MET A 1 206 ? 28.982  23.144 37.693 1.00 44.86 ? ? ? ? ? ? 283 MET A CE  1 
+ATOM   1636 N N   . ALA A 1 207 ? 30.354  21.342 40.526 1.00 15.62 ? ? ? ? ? ? 284 ALA A N   1 
+ATOM   1637 C CA  . ALA A 1 207 ? 30.523  20.056 41.201 1.00 16.55 ? ? ? ? ? ? 284 ALA A CA  1 
+ATOM   1638 C C   . ALA A 1 207 ? 29.831  18.914 40.476 1.00 15.37 ? ? ? ? ? ? 284 ALA A C   1 
+ATOM   1639 O O   . ALA A 1 207 ? 29.069  19.128 39.526 1.00 16.93 ? ? ? ? ? ? 284 ALA A O   1 
+ATOM   1640 C CB  . ALA A 1 207 ? 29.990  20.139 42.628 1.00 17.36 ? ? ? ? ? ? 284 ALA A CB  1 
+ATOM   1641 N N   . THR A 1 208 ? 30.111  17.700 40.937 1.00 15.46 ? ? ? ? ? ? 285 THR A N   1 
+ATOM   1642 C CA  . THR A 1 208 ? 29.501  16.505 40.383 1.00 17.26 ? ? ? ? ? ? 285 THR A CA  1 
+ATOM   1643 C C   . THR A 1 208 ? 28.832  15.725 41.506 1.00 19.09 ? ? ? ? ? ? 285 THR A C   1 
+ATOM   1644 O O   . THR A 1 208 ? 29.442  15.450 42.546 1.00 16.62 ? ? ? ? ? ? 285 THR A O   1 
+ATOM   1645 C CB  . THR A 1 208 ? 30.532  15.606 39.701 1.00 19.54 ? ? ? ? ? ? 285 THR A CB  1 
+ATOM   1646 O OG1 . THR A 1 208 ? 31.145  16.322 38.623 1.00 21.75 ? ? ? ? ? ? 285 THR A OG1 1 
+ATOM   1647 C CG2 . THR A 1 208 ? 29.866  14.353 39.163 1.00 21.75 ? ? ? ? ? ? 285 THR A CG2 1 
+ATOM   1648 N N   . TYR A 1 209 ? 27.564  15.397 41.286 1.00 15.80 ? ? ? ? ? ? 286 TYR A N   1 
+ATOM   1649 C CA  . TYR A 1 209 ? 26.756  14.638 42.230 1.00 17.32 ? ? ? ? ? ? 286 TYR A CA  1 
+ATOM   1650 C C   . TYR A 1 209 ? 26.873  13.146 41.912 1.00 20.10 ? ? ? ? ? ? 286 TYR A C   1 
+ATOM   1651 O O   . TYR A 1 209 ? 26.578  12.723 40.792 1.00 18.25 ? ? ? ? ? ? 286 TYR A O   1 
+ATOM   1652 C CB  . TYR A 1 209 ? 25.291  15.073 42.115 1.00 16.09 ? ? ? ? ? ? 286 TYR A CB  1 
+ATOM   1653 C CG  . TYR A 1 209 ? 24.333  14.251 42.941 1.00 16.93 ? ? ? ? ? ? 286 TYR A CG  1 
+ATOM   1654 C CD1 . TYR A 1 209 ? 24.341  14.316 44.333 1.00 17.13 ? ? ? ? ? ? 286 TYR A CD1 1 
+ATOM   1655 C CD2 . TYR A 1 209 ? 23.415  13.399 42.327 1.00 15.98 ? ? ? ? ? ? 286 TYR A CD2 1 
+ATOM   1656 C CE1 . TYR A 1 209 ? 23.450  13.555 45.093 1.00 20.89 ? ? ? ? ? ? 286 TYR A CE1 1 
+ATOM   1657 C CE2 . TYR A 1 209 ? 22.525  12.636 43.075 1.00 19.52 ? ? ? ? ? ? 286 TYR A CE2 1 
+ATOM   1658 C CZ  . TYR A 1 209 ? 22.546  12.718 44.453 1.00 20.36 ? ? ? ? ? ? 286 TYR A CZ  1 
+ATOM   1659 O OH  . TYR A 1 209 ? 21.665  11.960 45.187 1.00 20.35 ? ? ? ? ? ? 286 TYR A OH  1 
+ATOM   1660 N N   . ASN A 1 210 ? 27.282  12.362 42.909 1.00 20.84 ? ? ? ? ? ? 287 ASN A N   1 
+ATOM   1661 C CA  . ASN A 1 210 ? 27.462  10.915 42.780 1.00 19.92 ? ? ? ? ? ? 287 ASN A CA  1 
+ATOM   1662 C C   . ASN A 1 210 ? 28.086  10.449 41.473 1.00 21.39 ? ? ? ? ? ? 287 ASN A C   1 
+ATOM   1663 O O   . ASN A 1 210 ? 27.630  9.486  40.852 1.00 19.31 ? ? ? ? ? ? 287 ASN A O   1 
+ATOM   1664 C CB  . ASN A 1 210 ? 26.149  10.156 43.032 1.00 17.29 ? ? ? ? ? ? 287 ASN A CB  1 
+ATOM   1665 C CG  . ASN A 1 210 ? 25.775  10.111 44.510 1.00 21.43 ? ? ? ? ? ? 287 ASN A CG  1 
+ATOM   1666 O OD1 . ASN A 1 210 ? 26.646  10.137 45.380 1.00 19.80 ? ? ? ? ? ? 287 ASN A OD1 1 
+ATOM   1667 N ND2 . ASN A 1 210 ? 24.484  10.005 44.798 1.00 22.22 ? ? ? ? ? ? 287 ASN A ND2 1 
+ATOM   1668 N N   . LYS A 1 211 ? 29.137  11.152 41.073 1.00 21.94 ? ? ? ? ? ? 288 LYS A N   1 
+ATOM   1669 C CA  . LYS A 1 211 ? 29.891  10.837 39.871 1.00 24.12 ? ? ? ? ? ? 288 LYS A CA  1 
+ATOM   1670 C C   . LYS A 1 211 ? 29.096  10.749 38.571 1.00 26.01 ? ? ? ? ? ? 288 LYS A C   1 
+ATOM   1671 O O   . LYS A 1 211 ? 29.623  10.268 37.568 1.00 25.01 ? ? ? ? ? ? 288 LYS A O   1 
+ATOM   1672 C CB  . LYS A 1 211 ? 30.662  9.528  40.093 1.00 28.88 ? ? ? ? ? ? 288 LYS A CB  1 
+ATOM   1673 C CG  . LYS A 1 211 ? 31.693  9.611  41.226 1.00 33.29 ? ? ? ? ? ? 288 LYS A CG  1 
+ATOM   1674 C CD  . LYS A 1 211 ? 32.405  8.274  41.488 1.00 38.07 ? ? ? ? ? ? 288 LYS A CD  1 
+ATOM   1675 C CE  . LYS A 1 211 ? 31.457  7.234  42.084 1.00 43.57 ? ? ? ? ? ? 288 LYS A CE  1 
+ATOM   1676 N NZ  . LYS A 1 211 ? 32.132  5.926  42.376 1.00 47.13 ? ? ? ? ? ? 288 LYS A NZ  1 
+ATOM   1677 N N   . HIS A 1 212 ? 27.846  11.210 38.559 1.00 23.86 ? ? ? ? ? ? 289 HIS A N   1 
+ATOM   1678 C CA  . HIS A 1 212 ? 27.074  11.126 37.320 1.00 25.46 ? ? ? ? ? ? 289 HIS A CA  1 
+ATOM   1679 C C   . HIS A 1 212 ? 26.414  12.416 36.829 1.00 26.03 ? ? ? ? ? ? 289 HIS A C   1 
+ATOM   1680 O O   . HIS A 1 212 ? 26.077  12.528 35.648 1.00 23.25 ? ? ? ? ? ? 289 HIS A O   1 
+ATOM   1681 C CB  . HIS A 1 212 ? 26.023  10.002 37.412 1.00 23.38 ? ? ? ? ? ? 289 HIS A CB  1 
+ATOM   1682 C CG  . HIS A 1 212 ? 24.984  10.207 38.470 1.00 22.09 ? ? ? ? ? ? 289 HIS A CG  1 
+ATOM   1683 N ND1 . HIS A 1 212 ? 24.111  11.273 38.463 1.00 24.27 ? ? ? ? ? ? 289 HIS A ND1 1 
+ATOM   1684 C CD2 . HIS A 1 212 ? 24.666  9.470  39.561 1.00 23.52 ? ? ? ? ? ? 289 HIS A CD2 1 
+ATOM   1685 C CE1 . HIS A 1 212 ? 23.300  11.185 39.504 1.00 21.80 ? ? ? ? ? ? 289 HIS A CE1 1 
+ATOM   1686 N NE2 . HIS A 1 212 ? 23.618  10.100 40.186 1.00 22.01 ? ? ? ? ? ? 289 HIS A NE2 1 
+ATOM   1687 N N   . THR A 1 213 ? 26.239  13.396 37.709 1.00 21.29 ? ? ? ? ? ? 290 THR A N   1 
+ATOM   1688 C CA  . THR A 1 213 ? 25.600  14.639 37.291 1.00 19.67 ? ? ? ? ? ? 290 THR A CA  1 
+ATOM   1689 C C   . THR A 1 213 ? 26.317  15.926 37.682 1.00 21.48 ? ? ? ? ? ? 290 THR A C   1 
+ATOM   1690 O O   . THR A 1 213 ? 26.592  16.169 38.855 1.00 16.42 ? ? ? ? ? ? 290 THR A O   1 
+ATOM   1691 C CB  . THR A 1 213 ? 24.166  14.733 37.835 1.00 18.66 ? ? ? ? ? ? 290 THR A CB  1 
+ATOM   1692 O OG1 . THR A 1 213 ? 23.423  13.582 37.421 1.00 19.98 ? ? ? ? ? ? 290 THR A OG1 1 
+ATOM   1693 C CG2 . THR A 1 213 ? 23.478  15.997 37.313 1.00 21.70 ? ? ? ? ? ? 290 THR A CG2 1 
+ATOM   1694 N N   . LYS A 1 214 ? 26.583  16.756 36.677 1.00 21.81 ? ? ? ? ? ? 291 LYS A N   1 
+ATOM   1695 C CA  . LYS A 1 214 ? 27.230  18.052 36.859 1.00 23.05 ? ? ? ? ? ? 291 LYS A CA  1 
+ATOM   1696 C C   . LYS A 1 214 ? 26.191  19.055 37.381 1.00 22.70 ? ? ? ? ? ? 291 LYS A C   1 
+ATOM   1697 O O   . LYS A 1 214 ? 25.098  19.178 36.821 1.00 18.70 ? ? ? ? ? ? 291 LYS A O   1 
+ATOM   1698 C CB  . LYS A 1 214 ? 27.796  18.521 35.518 1.00 27.63 ? ? ? ? ? ? 291 LYS A CB  1 
+ATOM   1699 C CG  . LYS A 1 214 ? 28.440  19.894 35.521 1.00 36.74 ? ? ? ? ? ? 291 LYS A CG  1 
+ATOM   1700 C CD  . LYS A 1 214 ? 29.124  20.142 34.182 1.00 41.65 ? ? ? ? ? ? 291 LYS A CD  1 
+ATOM   1701 C CE  . LYS A 1 214 ? 29.847  21.473 34.142 1.00 41.56 ? ? ? ? ? ? 291 LYS A CE  1 
+ATOM   1702 N NZ  . LYS A 1 214 ? 30.616  21.637 32.872 1.00 45.80 ? ? ? ? ? ? 291 LYS A NZ  1 
+ATOM   1703 N N   . VAL A 1 215 ? 26.539  19.761 38.454 1.00 16.95 ? ? ? ? ? ? 292 VAL A N   1 
+ATOM   1704 C CA  . VAL A 1 215 ? 25.638  20.732 39.067 1.00 15.95 ? ? ? ? ? ? 292 VAL A CA  1 
+ATOM   1705 C C   . VAL A 1 215 ? 26.424  21.923 39.592 1.00 16.92 ? ? ? ? ? ? 292 VAL A C   1 
+ATOM   1706 O O   . VAL A 1 215 ? 27.656  21.915 39.601 1.00 16.75 ? ? ? ? ? ? 292 VAL A O   1 
+ATOM   1707 C CB  . VAL A 1 215 ? 24.892  20.105 40.273 1.00 17.22 ? ? ? ? ? ? 292 VAL A CB  1 
+ATOM   1708 C CG1 . VAL A 1 215 ? 24.088  18.892 39.826 1.00 12.92 ? ? ? ? ? ? 292 VAL A CG1 1 
+ATOM   1709 C CG2 . VAL A 1 215 ? 25.903  19.677 41.340 1.00 15.42 ? ? ? ? ? ? 292 VAL A CG2 1 
+ATOM   1710 N N   . ALA A 1 216 ? 25.704  22.959 40.003 1.00 16.84 ? ? ? ? ? ? 293 ALA A N   1 
+ATOM   1711 C CA  . ALA A 1 216 ? 26.329  24.131 40.595 1.00 15.61 ? ? ? ? ? ? 293 ALA A CA  1 
+ATOM   1712 C C   . ALA A 1 216 ? 25.932  23.999 42.060 1.00 17.91 ? ? ? ? ? ? 293 ALA A C   1 
+ATOM   1713 O O   . ALA A 1 216 ? 24.859  23.482 42.366 1.00 18.91 ? ? ? ? ? ? 293 ALA A O   1 
+ATOM   1714 C CB  . ALA A 1 216 ? 25.754  25.408 40.006 1.00 22.40 ? ? ? ? ? ? 293 ALA A CB  1 
+ATOM   1715 N N   . VAL A 1 217 ? 26.794  24.443 42.962 1.00 15.28 ? ? ? ? ? ? 294 VAL A N   1 
+ATOM   1716 C CA  . VAL A 1 217 ? 26.491  24.345 44.379 1.00 15.17 ? ? ? ? ? ? 294 VAL A CA  1 
+ATOM   1717 C C   . VAL A 1 217 ? 26.783  25.671 45.050 1.00 18.56 ? ? ? ? ? ? 294 VAL A C   1 
+ATOM   1718 O O   . VAL A 1 217 ? 27.906  26.178 44.972 1.00 19.42 ? ? ? ? ? ? 294 VAL A O   1 
+ATOM   1719 C CB  . VAL A 1 217 ? 27.353  23.256 45.080 1.00 19.83 ? ? ? ? ? ? 294 VAL A CB  1 
+ATOM   1720 C CG1 . VAL A 1 217 ? 26.989  23.171 46.570 1.00 10.68 ? ? ? ? ? ? 294 VAL A CG1 1 
+ATOM   1721 C CG2 . VAL A 1 217 ? 27.152  21.905 44.403 1.00 17.98 ? ? ? ? ? ? 294 VAL A CG2 1 
+ATOM   1722 N N   . LYS A 1 218 ? 25.770  26.247 45.687 1.00 16.57 ? ? ? ? ? ? 295 LYS A N   1 
+ATOM   1723 C CA  . LYS A 1 218 ? 25.976  27.482 46.410 1.00 14.09 ? ? ? ? ? ? 295 LYS A CA  1 
+ATOM   1724 C C   . LYS A 1 218 ? 26.196  27.074 47.855 1.00 16.40 ? ? ? ? ? ? 295 LYS A C   1 
+ATOM   1725 O O   . LYS A 1 218 ? 25.386  26.345 48.428 1.00 17.56 ? ? ? ? ? ? 295 LYS A O   1 
+ATOM   1726 C CB  . LYS A 1 218 ? 24.766  28.423 46.312 1.00 15.69 ? ? ? ? ? ? 295 LYS A CB  1 
+ATOM   1727 C CG  . LYS A 1 218 ? 24.929  29.650 47.214 1.00 15.70 ? ? ? ? ? ? 295 LYS A CG  1 
+ATOM   1728 C CD  . LYS A 1 218 ? 23.906  30.761 46.954 1.00 21.40 ? ? ? ? ? ? 295 LYS A CD  1 
+ATOM   1729 C CE  . LYS A 1 218 ? 24.187  31.474 45.642 1.00 19.58 ? ? ? ? ? ? 295 LYS A CE  1 
+ATOM   1730 N NZ  . LYS A 1 218 ? 23.423  32.757 45.496 1.00 21.14 ? ? ? ? ? ? 295 LYS A NZ  1 
+ATOM   1731 N N   . THR A 1 219 ? 27.309  27.523 48.425 1.00 16.56 ? ? ? ? ? ? 296 THR A N   1 
+ATOM   1732 C CA  . THR A 1 219 ? 27.661  27.224 49.811 1.00 17.12 ? ? ? ? ? ? 296 THR A CA  1 
+ATOM   1733 C C   . THR A 1 219 ? 27.437  28.495 50.633 1.00 19.27 ? ? ? ? ? ? 296 THR A C   1 
+ATOM   1734 O O   . THR A 1 219 ? 28.008  29.535 50.325 1.00 24.33 ? ? ? ? ? ? 296 THR A O   1 
+ATOM   1735 C CB  . THR A 1 219 ? 29.148  26.854 49.934 1.00 19.19 ? ? ? ? ? ? 296 THR A CB  1 
+ATOM   1736 O OG1 . THR A 1 219 ? 29.940  27.991 49.581 1.00 20.93 ? ? ? ? ? ? 296 THR A OG1 1 
+ATOM   1737 C CG2 . THR A 1 219 ? 29.504  25.711 48.993 1.00 18.01 ? ? ? ? ? ? 296 THR A CG2 1 
+ATOM   1738 N N   . MET A 1 220 ? 26.619  28.413 51.676 1.00 21.45 ? ? ? ? ? ? 297 MET A N   1 
+ATOM   1739 C CA  . MET A 1 220 ? 26.330  29.575 52.519 1.00 20.71 ? ? ? ? ? ? 297 MET A CA  1 
+ATOM   1740 C C   . MET A 1 220 ? 27.244  29.550 53.743 1.00 22.11 ? ? ? ? ? ? 297 MET A C   1 
+ATOM   1741 O O   . MET A 1 220 ? 27.444  28.496 54.342 1.00 17.88 ? ? ? ? ? ? 297 MET A O   1 
+ATOM   1742 C CB  . MET A 1 220 ? 24.872  29.526 52.975 1.00 22.26 ? ? ? ? ? ? 297 MET A CB  1 
+ATOM   1743 C CG  . MET A 1 220 ? 23.869  29.459 51.837 1.00 25.98 ? ? ? ? ? ? 297 MET A CG  1 
+ATOM   1744 S SD  . MET A 1 220 ? 23.930  30.915 50.811 1.00 27.90 ? ? ? ? ? ? 297 MET A SD  1 
+ATOM   1745 C CE  . MET A 1 220 ? 23.350  32.176 51.937 1.00 29.86 ? ? ? ? ? ? 297 MET A CE  1 
+ATOM   1746 N N   . LYS A 1 221 ? 27.796  30.697 54.123 1.00 23.01 ? ? ? ? ? ? 298 LYS A N   1 
+ATOM   1747 C CA  . LYS A 1 221 ? 28.672  30.734 55.290 1.00 25.03 ? ? ? ? ? ? 298 LYS A CA  1 
+ATOM   1748 C C   . LYS A 1 221 ? 27.878  30.422 56.552 1.00 23.38 ? ? ? ? ? ? 298 LYS A C   1 
+ATOM   1749 O O   . LYS A 1 221 ? 26.708  30.788 56.675 1.00 19.30 ? ? ? ? ? ? 298 LYS A O   1 
+ATOM   1750 C CB  . LYS A 1 221 ? 29.365  32.098 55.407 1.00 29.74 ? ? ? ? ? ? 298 LYS A CB  1 
+ATOM   1751 C CG  . LYS A 1 221 ? 30.232  32.429 54.186 1.00 38.20 ? ? ? ? ? ? 298 LYS A CG  1 
+ATOM   1752 C CD  . LYS A 1 221 ? 31.126  33.663 54.367 1.00 44.02 ? ? ? ? ? ? 298 LYS A CD  1 
+ATOM   1753 C CE  . LYS A 1 221 ? 30.350  34.927 54.715 1.00 46.23 ? ? ? ? ? ? 298 LYS A CE  1 
+ATOM   1754 N NZ  . LYS A 1 221 ? 29.801  34.895 56.103 1.00 48.02 ? ? ? ? ? ? 298 LYS A NZ  1 
+ATOM   1755 N N   . PRO A 1 222 ? 28.507  29.731 57.513 1.00 24.20 ? ? ? ? ? ? 299 PRO A N   1 
+ATOM   1756 C CA  . PRO A 1 222 ? 27.826  29.378 58.760 1.00 23.08 ? ? ? ? ? ? 299 PRO A CA  1 
+ATOM   1757 C C   . PRO A 1 222 ? 27.273  30.618 59.438 1.00 22.15 ? ? ? ? ? ? 299 PRO A C   1 
+ATOM   1758 O O   . PRO A 1 222 ? 27.930  31.658 59.459 1.00 18.21 ? ? ? ? ? ? 299 PRO A O   1 
+ATOM   1759 C CB  . PRO A 1 222 ? 28.938  28.711 59.568 1.00 26.84 ? ? ? ? ? ? 299 PRO A CB  1 
+ATOM   1760 C CG  . PRO A 1 222 ? 29.768  28.067 58.473 1.00 24.26 ? ? ? ? ? ? 299 PRO A CG  1 
+ATOM   1761 C CD  . PRO A 1 222 ? 29.899  29.255 57.553 1.00 24.19 ? ? ? ? ? ? 299 PRO A CD  1 
+ATOM   1762 N N   . GLY A 1 223 ? 26.064  30.504 59.979 1.00 21.02 ? ? ? ? ? ? 300 GLY A N   1 
+ATOM   1763 C CA  . GLY A 1 223 ? 25.441  31.631 60.651 1.00 26.81 ? ? ? ? ? ? 300 GLY A CA  1 
+ATOM   1764 C C   . GLY A 1 223 ? 24.791  32.647 59.723 1.00 27.28 ? ? ? ? ? ? 300 GLY A C   1 
+ATOM   1765 O O   . GLY A 1 223 ? 24.178  33.602 60.193 1.00 29.47 ? ? ? ? ? ? 300 GLY A O   1 
+ATOM   1766 N N   . SER A 1 224 ? 24.910  32.445 58.412 1.00 28.40 ? ? ? ? ? ? 301 SER A N   1 
+ATOM   1767 C CA  . SER A 1 224 ? 24.334  33.373 57.434 1.00 28.18 ? ? ? ? ? ? 301 SER A CA  1 
+ATOM   1768 C C   . SER A 1 224 ? 22.823  33.256 57.361 1.00 30.06 ? ? ? ? ? ? 301 SER A C   1 
+ATOM   1769 O O   . SER A 1 224 ? 22.147  34.151 56.857 1.00 28.89 ? ? ? ? ? ? 301 SER A O   1 
+ATOM   1770 C CB  . SER A 1 224 ? 24.900  33.112 56.042 1.00 27.74 ? ? ? ? ? ? 301 SER A CB  1 
+ATOM   1771 O OG  . SER A 1 224 ? 24.522  31.821 55.602 1.00 24.01 ? ? ? ? ? ? 301 SER A OG  1 
+ATOM   1772 N N   . MET A 1 225 ? 22.290  32.139 57.832 1.00 29.67 ? ? ? ? ? ? 302 MET A N   1 
+ATOM   1773 C CA  . MET A 1 225 ? 20.851  31.967 57.818 1.00 32.30 ? ? ? ? ? ? 302 MET A CA  1 
+ATOM   1774 C C   . MET A 1 225 ? 20.357  30.968 58.836 1.00 30.22 ? ? ? ? ? ? 302 MET A C   1 
+ATOM   1775 O O   . MET A 1 225 ? 21.128  30.156 59.340 1.00 26.15 ? ? ? ? ? ? 302 MET A O   1 
+ATOM   1776 C CB  . MET A 1 225 ? 20.355  31.597 56.403 1.00 35.66 ? ? ? ? ? ? 302 MET A CB  1 
+ATOM   1777 C CG  . MET A 1 225 ? 21.072  30.480 55.665 1.00 34.39 ? ? ? ? ? ? 302 MET A CG  1 
+ATOM   1778 S SD  . MET A 1 225 ? 20.332  30.204 53.995 1.00 30.34 ? ? ? ? ? ? 302 MET A SD  1 
+ATOM   1779 C CE  . MET A 1 225 ? 20.425  31.833 53.336 1.00 36.64 ? ? ? ? ? ? 302 MET A CE  1 
+ATOM   1780 N N   . SER A 1 226 ? 19.073  31.065 59.170 1.00 32.27 ? ? ? ? ? ? 303 SER A N   1 
+ATOM   1781 C CA  . SER A 1 226 ? 18.451  30.139 60.113 1.00 32.44 ? ? ? ? ? ? 303 SER A CA  1 
+ATOM   1782 C C   . SER A 1 226 ? 18.314  28.820 59.372 1.00 33.44 ? ? ? ? ? ? 303 SER A C   1 
+ATOM   1783 O O   . SER A 1 226 ? 17.629  28.750 58.351 1.00 34.50 ? ? ? ? ? ? 303 SER A O   1 
+ATOM   1784 C CB  . SER A 1 226 ? 17.058  30.630 60.534 1.00 35.82 ? ? ? ? ? ? 303 SER A CB  1 
+ATOM   1785 O OG  . SER A 1 226 ? 16.374  29.649 61.310 1.00 36.23 ? ? ? ? ? ? 303 SER A OG  1 
+ATOM   1786 N N   . VAL A 1 227 ? 18.960  27.778 59.878 1.00 29.97 ? ? ? ? ? ? 304 VAL A N   1 
+ATOM   1787 C CA  . VAL A 1 227 ? 18.898  26.483 59.223 1.00 30.05 ? ? ? ? ? ? 304 VAL A CA  1 
+ATOM   1788 C C   . VAL A 1 227 ? 17.470  25.967 59.092 1.00 31.04 ? ? ? ? ? ? 304 VAL A C   1 
+ATOM   1789 O O   . VAL A 1 227 ? 17.069  25.503 58.024 1.00 27.91 ? ? ? ? ? ? 304 VAL A O   1 
+ATOM   1790 C CB  . VAL A 1 227 ? 19.740  25.441 59.972 1.00 28.52 ? ? ? ? ? ? 304 VAL A CB  1 
+ATOM   1791 C CG1 . VAL A 1 227 ? 19.599  24.092 59.306 1.00 30.66 ? ? ? ? ? ? 304 VAL A CG1 1 
+ATOM   1792 C CG2 . VAL A 1 227 ? 21.198  25.872 59.986 1.00 33.44 ? ? ? ? ? ? 304 VAL A CG2 1 
+ATOM   1793 N N   . GLU A 1 228 ? 16.699  26.053 60.170 1.00 28.84 ? ? ? ? ? ? 305 GLU A N   1 
+ATOM   1794 C CA  . GLU A 1 228 ? 15.324  25.575 60.138 1.00 28.78 ? ? ? ? ? ? 305 GLU A CA  1 
+ATOM   1795 C C   . GLU A 1 228 ? 14.471  26.385 59.168 1.00 22.78 ? ? ? ? ? ? 305 GLU A C   1 
+ATOM   1796 O O   . GLU A 1 228 ? 13.735  25.821 58.362 1.00 23.91 ? ? ? ? ? ? 305 GLU A O   1 
+ATOM   1797 C CB  . GLU A 1 228 ? 14.704  25.641 61.535 1.00 36.24 ? ? ? ? ? ? 305 GLU A CB  1 
+ATOM   1798 C CG  . GLU A 1 228 ? 15.481  24.887 62.598 1.00 46.60 ? ? ? ? ? ? 305 GLU A CG  1 
+ATOM   1799 C CD  . GLU A 1 228 ? 14.789  24.921 63.949 1.00 53.26 ? ? ? ? ? ? 305 GLU A CD  1 
+ATOM   1800 O OE1 . GLU A 1 228 ? 14.510  26.032 64.456 1.00 57.10 ? ? ? ? ? ? 305 GLU A OE1 1 
+ATOM   1801 O OE2 . GLU A 1 228 ? 14.524  23.833 64.503 1.00 57.88 ? ? ? ? ? ? 305 GLU A OE2 1 
+ATOM   1802 N N   . ALA A 1 229 ? 14.576  27.707 59.242 1.00 18.60 ? ? ? ? ? ? 306 ALA A N   1 
+ATOM   1803 C CA  . ALA A 1 229 ? 13.794  28.572 58.374 1.00 18.36 ? ? ? ? ? ? 306 ALA A CA  1 
+ATOM   1804 C C   . ALA A 1 229 ? 14.191  28.385 56.913 1.00 19.43 ? ? ? ? ? ? 306 ALA A C   1 
+ATOM   1805 O O   . ALA A 1 229 ? 13.336  28.392 56.030 1.00 15.23 ? ? ? ? ? ? 306 ALA A O   1 
+ATOM   1806 C CB  . ALA A 1 229 ? 13.962  30.022 58.795 1.00 19.81 ? ? ? ? ? ? 306 ALA A CB  1 
+ATOM   1807 N N   . PHE A 1 230 ? 15.485  28.218 56.659 1.00 18.17 ? ? ? ? ? ? 307 PHE A N   1 
+ATOM   1808 C CA  . PHE A 1 230 ? 15.952  28.006 55.293 1.00 17.62 ? ? ? ? ? ? 307 PHE A CA  1 
+ATOM   1809 C C   . PHE A 1 230 ? 15.246  26.798 54.693 1.00 19.11 ? ? ? ? ? ? 307 PHE A C   1 
+ATOM   1810 O O   . PHE A 1 230 ? 14.660  26.885 53.619 1.00 19.63 ? ? ? ? ? ? 307 PHE A O   1 
+ATOM   1811 C CB  . PHE A 1 230 ? 17.462  27.751 55.250 1.00 17.22 ? ? ? ? ? ? 307 PHE A CB  1 
+ATOM   1812 C CG  . PHE A 1 230 ? 17.922  27.144 53.954 1.00 17.07 ? ? ? ? ? ? 307 PHE A CG  1 
+ATOM   1813 C CD1 . PHE A 1 230 ? 17.917  27.886 52.783 1.00 17.22 ? ? ? ? ? ? 307 PHE A CD1 1 
+ATOM   1814 C CD2 . PHE A 1 230 ? 18.274  25.800 53.893 1.00 18.01 ? ? ? ? ? ? 307 PHE A CD2 1 
+ATOM   1815 C CE1 . PHE A 1 230 ? 18.254  27.291 51.558 1.00 19.22 ? ? ? ? ? ? 307 PHE A CE1 1 
+ATOM   1816 C CE2 . PHE A 1 230 ? 18.610  25.195 52.683 1.00 14.62 ? ? ? ? ? ? 307 PHE A CE2 1 
+ATOM   1817 C CZ  . PHE A 1 230 ? 18.599  25.946 51.513 1.00 19.18 ? ? ? ? ? ? 307 PHE A CZ  1 
+ATOM   1818 N N   . LEU A 1 231 ? 15.303  25.673 55.400 1.00 17.92 ? ? ? ? ? ? 308 LEU A N   1 
+ATOM   1819 C CA  . LEU A 1 231 ? 14.686  24.435 54.928 1.00 19.22 ? ? ? ? ? ? 308 LEU A CA  1 
+ATOM   1820 C C   . LEU A 1 231 ? 13.220  24.603 54.554 1.00 20.42 ? ? ? ? ? ? 308 LEU A C   1 
+ATOM   1821 O O   . LEU A 1 231 ? 12.774  24.102 53.523 1.00 19.64 ? ? ? ? ? ? 308 LEU A O   1 
+ATOM   1822 C CB  . LEU A 1 231 ? 14.821  23.342 55.990 1.00 24.73 ? ? ? ? ? ? 308 LEU A CB  1 
+ATOM   1823 C CG  . LEU A 1 231 ? 16.264  22.992 56.383 1.00 32.54 ? ? ? ? ? ? 308 LEU A CG  1 
+ATOM   1824 C CD1 . LEU A 1 231 ? 16.269  22.001 57.548 1.00 32.15 ? ? ? ? ? ? 308 LEU A CD1 1 
+ATOM   1825 C CD2 . LEU A 1 231 ? 16.998  22.423 55.177 1.00 31.29 ? ? ? ? ? ? 308 LEU A CD2 1 
+ATOM   1826 N N   . ALA A 1 232 ? 12.471  25.302 55.396 1.00 18.53 ? ? ? ? ? ? 309 ALA A N   1 
+ATOM   1827 C CA  . ALA A 1 232 ? 11.055  25.529 55.132 1.00 20.29 ? ? ? ? ? ? 309 ALA A CA  1 
+ATOM   1828 C C   . ALA A 1 232 ? 10.871  26.314 53.831 1.00 19.53 ? ? ? ? ? ? 309 ALA A C   1 
+ATOM   1829 O O   . ALA A 1 232 ? 10.014  25.995 53.005 1.00 21.32 ? ? ? ? ? ? 309 ALA A O   1 
+ATOM   1830 C CB  . ALA A 1 232 ? 10.425  26.289 56.307 1.00 19.54 ? ? ? ? ? ? 309 ALA A CB  1 
+ATOM   1831 N N   . GLU A 1 233 ? 11.695  27.337 53.649 1.00 18.24 ? ? ? ? ? ? 310 GLU A N   1 
+ATOM   1832 C CA  . GLU A 1 233 ? 11.630  28.189 52.465 1.00 18.02 ? ? ? ? ? ? 310 GLU A CA  1 
+ATOM   1833 C C   . GLU A 1 233 ? 12.096  27.417 51.223 1.00 18.17 ? ? ? ? ? ? 310 GLU A C   1 
+ATOM   1834 O O   . GLU A 1 233 ? 11.519  27.538 50.139 1.00 15.81 ? ? ? ? ? ? 310 GLU A O   1 
+ATOM   1835 C CB  . GLU A 1 233 ? 12.511  29.415 52.697 1.00 24.52 ? ? ? ? ? ? 310 GLU A CB  1 
+ATOM   1836 C CG  . GLU A 1 233 ? 12.165  30.620 51.866 1.00 27.69 ? ? ? ? ? ? 310 GLU A CG  1 
+ATOM   1837 C CD  . GLU A 1 233 ? 10.782  31.153 52.188 1.00 27.72 ? ? ? ? ? ? 310 GLU A CD  1 
+ATOM   1838 O OE1 . GLU A 1 233 ? 10.435  31.199 53.386 1.00 30.28 ? ? ? ? ? ? 310 GLU A OE1 1 
+ATOM   1839 O OE2 . GLU A 1 233 ? 10.056  31.547 51.255 1.00 23.72 ? ? ? ? ? ? 310 GLU A OE2 1 
+ATOM   1840 N N   . ALA A 1 234 ? 13.148  26.620 51.382 1.00 16.54 ? ? ? ? ? ? 311 ALA A N   1 
+ATOM   1841 C CA  . ALA A 1 234 ? 13.649  25.817 50.272 1.00 18.36 ? ? ? ? ? ? 311 ALA A CA  1 
+ATOM   1842 C C   . ALA A 1 234 ? 12.563  24.834 49.811 1.00 18.05 ? ? ? ? ? ? 311 ALA A C   1 
+ATOM   1843 O O   . ALA A 1 234 ? 12.512  24.473 48.634 1.00 14.94 ? ? ? ? ? ? 311 ALA A O   1 
+ATOM   1844 C CB  . ALA A 1 234 ? 14.910  25.062 50.691 1.00 18.22 ? ? ? ? ? ? 311 ALA A CB  1 
+ATOM   1845 N N   . ASN A 1 235 ? 11.693  24.391 50.720 1.00 17.59 ? ? ? ? ? ? 312 ASN A N   1 
+ATOM   1846 C CA  . ASN A 1 235 ? 10.634  23.472 50.286 1.00 21.41 ? ? ? ? ? ? 312 ASN A CA  1 
+ATOM   1847 C C   . ASN A 1 235 ? 9.595   24.143 49.383 1.00 19.83 ? ? ? ? ? ? 312 ASN A C   1 
+ATOM   1848 O O   . ASN A 1 235 ? 8.833   23.463 48.692 1.00 21.12 ? ? ? ? ? ? 312 ASN A O   1 
+ATOM   1849 C CB  . ASN A 1 235 ? 9.935   22.806 51.471 1.00 25.12 ? ? ? ? ? ? 312 ASN A CB  1 
+ATOM   1850 C CG  . ASN A 1 235 ? 10.748  21.657 52.057 1.00 31.64 ? ? ? ? ? ? 312 ASN A CG  1 
+ATOM   1851 O OD1 . ASN A 1 235 ? 11.223  20.769 51.329 1.00 21.02 ? ? ? ? ? ? 312 ASN A OD1 1 
+ATOM   1852 N ND2 . ASN A 1 235 ? 10.890  21.653 53.376 1.00 28.64 ? ? ? ? ? ? 312 ASN A ND2 1 
+ATOM   1853 N N   . VAL A 1 236 ? 9.555   25.472 49.393 1.00 17.61 ? ? ? ? ? ? 313 VAL A N   1 
+ATOM   1854 C CA  . VAL A 1 236 ? 8.634   26.201 48.527 1.00 17.75 ? ? ? ? ? ? 313 VAL A CA  1 
+ATOM   1855 C C   . VAL A 1 236 ? 9.384   26.450 47.232 1.00 16.80 ? ? ? ? ? ? 313 VAL A C   1 
+ATOM   1856 O O   . VAL A 1 236 ? 8.874   26.195 46.141 1.00 17.19 ? ? ? ? ? ? 313 VAL A O   1 
+ATOM   1857 C CB  . VAL A 1 236 ? 8.205   27.560 49.143 1.00 21.55 ? ? ? ? ? ? 313 VAL A CB  1 
+ATOM   1858 C CG1 . VAL A 1 236 ? 7.275   28.306 48.189 1.00 17.70 ? ? ? ? ? ? 313 VAL A CG1 1 
+ATOM   1859 C CG2 . VAL A 1 236 ? 7.493   27.320 50.458 1.00 23.28 ? ? ? ? ? ? 313 VAL A CG2 1 
+ATOM   1860 N N   . MET A 1 237 ? 10.621  26.923 47.368 1.00 18.04 ? ? ? ? ? ? 314 MET A N   1 
+ATOM   1861 C CA  . MET A 1 237 ? 11.480  27.214 46.222 1.00 18.68 ? ? ? ? ? ? 314 MET A CA  1 
+ATOM   1862 C C   . MET A 1 237 ? 11.503  26.087 45.207 1.00 20.46 ? ? ? ? ? ? 314 MET A C   1 
+ATOM   1863 O O   . MET A 1 237 ? 11.305  26.310 44.010 1.00 20.56 ? ? ? ? ? ? 314 MET A O   1 
+ATOM   1864 C CB  . MET A 1 237 ? 12.930  27.457 46.672 1.00 15.46 ? ? ? ? ? ? 314 MET A CB  1 
+ATOM   1865 C CG  . MET A 1 237 ? 13.138  28.682 47.532 1.00 17.78 ? ? ? ? ? ? 314 MET A CG  1 
+ATOM   1866 S SD  . MET A 1 237 ? 14.850  28.795 48.104 1.00 18.85 ? ? ? ? ? ? 314 MET A SD  1 
+ATOM   1867 C CE  . MET A 1 237 ? 14.719  30.236 49.097 1.00 18.47 ? ? ? ? ? ? 314 MET A CE  1 
+ATOM   1868 N N   . LYS A 1 238 ? 11.762  24.878 45.700 1.00 18.47 ? ? ? ? ? ? 315 LYS A N   1 
+ATOM   1869 C CA  . LYS A 1 238 ? 11.873  23.715 44.836 1.00 16.63 ? ? ? ? ? ? 315 LYS A CA  1 
+ATOM   1870 C C   . LYS A 1 238 ? 10.637  23.450 43.982 1.00 17.57 ? ? ? ? ? ? 315 LYS A C   1 
+ATOM   1871 O O   . LYS A 1 238 ? 10.749  22.863 42.907 1.00 15.37 ? ? ? ? ? ? 315 LYS A O   1 
+ATOM   1872 C CB  . LYS A 1 238 ? 12.217  22.463 45.660 1.00 17.24 ? ? ? ? ? ? 315 LYS A CB  1 
+ATOM   1873 C CG  . LYS A 1 238 ? 11.118  21.964 46.604 1.00 13.83 ? ? ? ? ? ? 315 LYS A CG  1 
+ATOM   1874 C CD  . LYS A 1 238 ? 11.591  20.696 47.325 1.00 20.29 ? ? ? ? ? ? 315 LYS A CD  1 
+ATOM   1875 C CE  . LYS A 1 238 ? 10.528  20.120 48.254 1.00 20.68 ? ? ? ? ? ? 315 LYS A CE  1 
+ATOM   1876 N NZ  . LYS A 1 238 ? 11.002  18.902 48.975 1.00 21.23 ? ? ? ? ? ? 315 LYS A NZ  1 
+ATOM   1877 N N   . THR A 1 239 ? 9.471   23.897 44.443 1.00 15.07 ? ? ? ? ? ? 316 THR A N   1 
+ATOM   1878 C CA  . THR A 1 239 ? 8.230   23.669 43.704 1.00 14.10 ? ? ? ? ? ? 316 THR A CA  1 
+ATOM   1879 C C   . THR A 1 239 ? 7.994   24.686 42.595 1.00 16.62 ? ? ? ? ? ? 316 THR A C   1 
+ATOM   1880 O O   . THR A 1 239 ? 7.054   24.538 41.804 1.00 15.89 ? ? ? ? ? ? 316 THR A O   1 
+ATOM   1881 C CB  . THR A 1 239 ? 6.999   23.758 44.614 1.00 15.95 ? ? ? ? ? ? 316 THR A CB  1 
+ATOM   1882 O OG1 . THR A 1 239 ? 6.789   25.128 44.976 1.00 13.19 ? ? ? ? ? ? 316 THR A OG1 1 
+ATOM   1883 C CG2 . THR A 1 239 ? 7.190   22.918 45.878 1.00 16.07 ? ? ? ? ? ? 316 THR A CG2 1 
+ATOM   1884 N N   . LEU A 1 240 ? 8.824   25.724 42.543 1.00 13.11 ? ? ? ? ? ? 317 LEU A N   1 
+ATOM   1885 C CA  . LEU A 1 240 ? 8.653   26.766 41.539 1.00 15.78 ? ? ? ? ? ? 317 LEU A CA  1 
+ATOM   1886 C C   . LEU A 1 240 ? 9.430   26.387 40.292 1.00 16.96 ? ? ? ? ? ? 317 LEU A C   1 
+ATOM   1887 O O   . LEU A 1 240 ? 10.494  26.923 40.003 1.00 19.00 ? ? ? ? ? ? 317 LEU A O   1 
+ATOM   1888 C CB  . LEU A 1 240 ? 9.105   28.115 42.108 1.00 15.26 ? ? ? ? ? ? 317 LEU A CB  1 
+ATOM   1889 C CG  . LEU A 1 240 ? 8.276   28.559 43.323 1.00 17.24 ? ? ? ? ? ? 317 LEU A CG  1 
+ATOM   1890 C CD1 . LEU A 1 240 ? 8.942   29.722 44.036 1.00 17.59 ? ? ? ? ? ? 317 LEU A CD1 1 
+ATOM   1891 C CD2 . LEU A 1 240 ? 6.865   28.940 42.872 1.00 16.70 ? ? ? ? ? ? 317 LEU A CD2 1 
+ATOM   1892 N N   . GLN A 1 241 ? 8.871   25.429 39.566 1.00 16.55 ? ? ? ? ? ? 318 GLN A N   1 
+ATOM   1893 C CA  . GLN A 1 241 ? 9.475   24.913 38.355 1.00 16.18 ? ? ? ? ? ? 318 GLN A CA  1 
+ATOM   1894 C C   . GLN A 1 241 ? 8.886   25.577 37.128 1.00 18.61 ? ? ? ? ? ? 318 GLN A C   1 
+ATOM   1895 O O   . GLN A 1 241 ? 7.683   25.496 36.888 1.00 15.96 ? ? ? ? ? ? 318 GLN A O   1 
+ATOM   1896 C CB  . GLN A 1 241 ? 9.287   23.395 38.318 1.00 16.71 ? ? ? ? ? ? 318 GLN A CB  1 
+ATOM   1897 C CG  . GLN A 1 241 ? 10.088  22.708 39.418 1.00 20.71 ? ? ? ? ? ? 318 GLN A CG  1 
+ATOM   1898 C CD  . GLN A 1 241 ? 9.785   21.234 39.555 1.00 25.18 ? ? ? ? ? ? 318 GLN A CD  1 
+ATOM   1899 O OE1 . GLN A 1 241 ? 9.697   20.512 38.568 1.00 30.99 ? ? ? ? ? ? 318 GLN A OE1 1 
+ATOM   1900 N NE2 . GLN A 1 241 ? 9.654   20.776 40.788 1.00 27.99 ? ? ? ? ? ? 318 GLN A NE2 1 
+ATOM   1901 N N   . HIS A 1 242 ? 9.758   26.234 36.365 1.00 18.10 ? ? ? ? ? ? 319 HIS A N   1 
+ATOM   1902 C CA  . HIS A 1 242 ? 9.384   26.961 35.155 1.00 16.65 ? ? ? ? ? ? 319 HIS A CA  1 
+ATOM   1903 C C   . HIS A 1 242 ? 10.649  27.111 34.309 1.00 19.02 ? ? ? ? ? ? 319 HIS A C   1 
+ATOM   1904 O O   . HIS A 1 242 ? 11.763  27.132 34.841 1.00 15.68 ? ? ? ? ? ? 319 HIS A O   1 
+ATOM   1905 C CB  . HIS A 1 242 ? 8.813   28.330 35.551 1.00 16.05 ? ? ? ? ? ? 319 HIS A CB  1 
+ATOM   1906 C CG  . HIS A 1 242 ? 8.300   29.141 34.402 1.00 14.40 ? ? ? ? ? ? 319 HIS A CG  1 
+ATOM   1907 N ND1 . HIS A 1 242 ? 9.128   29.819 33.535 1.00 15.01 ? ? ? ? ? ? 319 HIS A ND1 1 
+ATOM   1908 C CD2 . HIS A 1 242 ? 7.036   29.359 33.964 1.00 15.99 ? ? ? ? ? ? 319 HIS A CD2 1 
+ATOM   1909 C CE1 . HIS A 1 242 ? 8.397   30.421 32.612 1.00 14.70 ? ? ? ? ? ? 319 HIS A CE1 1 
+ATOM   1910 N NE2 . HIS A 1 242 ? 7.125   30.158 32.850 1.00 14.71 ? ? ? ? ? ? 319 HIS A NE2 1 
+ATOM   1911 N N   . ASP A 1 243 ? 10.481  27.198 32.994 1.00 17.74 ? ? ? ? ? ? 320 ASP A N   1 
+ATOM   1912 C CA  . ASP A 1 243 ? 11.622  27.315 32.091 1.00 17.58 ? ? ? ? ? ? 320 ASP A CA  1 
+ATOM   1913 C C   . ASP A 1 243 ? 12.471  28.550 32.379 1.00 15.62 ? ? ? ? ? ? 320 ASP A C   1 
+ATOM   1914 O O   . ASP A 1 243 ? 13.663  28.570 32.080 1.00 14.58 ? ? ? ? ? ? 320 ASP A O   1 
+ATOM   1915 C CB  . ASP A 1 243 ? 11.143  27.360 30.637 1.00 18.00 ? ? ? ? ? ? 320 ASP A CB  1 
+ATOM   1916 C CG  . ASP A 1 243 ? 12.287  27.302 29.647 1.00 19.92 ? ? ? ? ? ? 320 ASP A CG  1 
+ATOM   1917 O OD1 . ASP A 1 243 ? 12.985  26.273 29.623 1.00 24.25 ? ? ? ? ? ? 320 ASP A OD1 1 
+ATOM   1918 O OD2 . ASP A 1 243 ? 12.505  28.281 28.903 1.00 20.55 ? ? ? ? ? ? 320 ASP A OD2 1 
+ATOM   1919 N N   . LYS A 1 244 ? 11.870  29.580 32.964 1.00 14.85 ? ? ? ? ? ? 321 LYS A N   1 
+ATOM   1920 C CA  . LYS A 1 244 ? 12.633  30.789 33.239 1.00 13.49 ? ? ? ? ? ? 321 LYS A CA  1 
+ATOM   1921 C C   . LYS A 1 244 ? 13.135  30.929 34.685 1.00 13.33 ? ? ? ? ? ? 321 LYS A C   1 
+ATOM   1922 O O   . LYS A 1 244 ? 13.540  32.013 35.106 1.00 11.88 ? ? ? ? ? ? 321 LYS A O   1 
+ATOM   1923 C CB  . LYS A 1 244 ? 11.821  32.019 32.811 1.00 17.25 ? ? ? ? ? ? 321 LYS A CB  1 
+ATOM   1924 C CG  . LYS A 1 244 ? 11.384  31.983 31.323 1.00 15.29 ? ? ? ? ? ? 321 LYS A CG  1 
+ATOM   1925 C CD  . LYS A 1 244 ? 12.585  31.725 30.394 1.00 18.62 ? ? ? ? ? ? 321 LYS A CD  1 
+ATOM   1926 C CE  . LYS A 1 244 ? 12.200  31.747 28.913 1.00 16.22 ? ? ? ? ? ? 321 LYS A CE  1 
+ATOM   1927 N NZ  . LYS A 1 244 ? 11.175  30.715 28.577 1.00 19.77 ? ? ? ? ? ? 321 LYS A NZ  1 
+ATOM   1928 N N   . LEU A 1 245 ? 13.107  29.831 35.438 1.00 13.13 ? ? ? ? ? ? 322 LEU A N   1 
+ATOM   1929 C CA  . LEU A 1 245 ? 13.611  29.811 36.817 1.00 13.45 ? ? ? ? ? ? 322 LEU A CA  1 
+ATOM   1930 C C   . LEU A 1 245 ? 14.647  28.691 36.920 1.00 12.10 ? ? ? ? ? ? 322 LEU A C   1 
+ATOM   1931 O O   . LEU A 1 245 ? 14.430  27.594 36.408 1.00 10.81 ? ? ? ? ? ? 322 LEU A O   1 
+ATOM   1932 C CB  . LEU A 1 245 ? 12.507  29.521 37.842 1.00 12.32 ? ? ? ? ? ? 322 LEU A CB  1 
+ATOM   1933 C CG  . LEU A 1 245 ? 11.250  30.385 37.994 1.00 23.08 ? ? ? ? ? ? 322 LEU A CG  1 
+ATOM   1934 C CD1 . LEU A 1 245 ? 10.857  30.386 39.477 1.00 15.28 ? ? ? ? ? ? 322 LEU A CD1 1 
+ATOM   1935 C CD2 . LEU A 1 245 ? 11.483  31.802 37.524 1.00 14.60 ? ? ? ? ? ? 322 LEU A CD2 1 
+ATOM   1936 N N   . VAL A 1 246 ? 15.768  28.949 37.583 1.00 14.70 ? ? ? ? ? ? 323 VAL A N   1 
+ATOM   1937 C CA  . VAL A 1 246 ? 16.778  27.908 37.706 1.00 14.93 ? ? ? ? ? ? 323 VAL A CA  1 
+ATOM   1938 C C   . VAL A 1 246 ? 16.204  26.788 38.562 1.00 13.52 ? ? ? ? ? ? 323 VAL A C   1 
+ATOM   1939 O O   . VAL A 1 246 ? 15.516  27.046 39.551 1.00 14.82 ? ? ? ? ? ? 323 VAL A O   1 
+ATOM   1940 C CB  . VAL A 1 246 ? 18.077  28.443 38.360 1.00 17.27 ? ? ? ? ? ? 323 VAL A CB  1 
+ATOM   1941 C CG1 . VAL A 1 246 ? 17.822  28.817 39.817 1.00 18.14 ? ? ? ? ? ? 323 VAL A CG1 1 
+ATOM   1942 C CG2 . VAL A 1 246 ? 19.185  27.387 38.253 1.00 20.32 ? ? ? ? ? ? 323 VAL A CG2 1 
+ATOM   1943 N N   . LYS A 1 247 ? 16.464  25.547 38.168 1.00 12.64 ? ? ? ? ? ? 324 LYS A N   1 
+ATOM   1944 C CA  . LYS A 1 247 ? 15.982  24.400 38.922 1.00 14.11 ? ? ? ? ? ? 324 LYS A CA  1 
+ATOM   1945 C C   . LYS A 1 247 ? 16.808  24.204 40.179 1.00 16.16 ? ? ? ? ? ? 324 LYS A C   1 
+ATOM   1946 O O   . LYS A 1 247 ? 18.038  24.276 40.142 1.00 14.98 ? ? ? ? ? ? 324 LYS A O   1 
+ATOM   1947 C CB  . LYS A 1 247 ? 16.072  23.113 38.101 1.00 21.41 ? ? ? ? ? ? 324 LYS A CB  1 
+ATOM   1948 C CG  . LYS A 1 247 ? 15.115  23.009 36.943 1.00 25.02 ? ? ? ? ? ? 324 LYS A CG  1 
+ATOM   1949 C CD  . LYS A 1 247 ? 15.326  21.677 36.241 1.00 32.39 ? ? ? ? ? ? 324 LYS A CD  1 
+ATOM   1950 C CE  . LYS A 1 247 ? 14.437  21.549 35.023 1.00 33.81 ? ? ? ? ? ? 324 LYS A CE  1 
+ATOM   1951 N NZ  . LYS A 1 247 ? 14.717  20.280 34.303 1.00 45.18 ? ? ? ? ? ? 324 LYS A NZ  1 
+ATOM   1952 N N   . LEU A 1 248 ? 16.114  23.937 41.279 1.00 16.03 ? ? ? ? ? ? 325 LEU A N   1 
+ATOM   1953 C CA  . LEU A 1 248 ? 16.736  23.686 42.571 1.00 19.27 ? ? ? ? ? ? 325 LEU A CA  1 
+ATOM   1954 C C   . LEU A 1 248 ? 16.613  22.177 42.830 1.00 23.60 ? ? ? ? ? ? 325 LEU A C   1 
+ATOM   1955 O O   . LEU A 1 248 ? 15.532  21.682 43.158 1.00 26.38 ? ? ? ? ? ? 325 LEU A O   1 
+ATOM   1956 C CB  . LEU A 1 248 ? 16.013  24.500 43.652 1.00 21.46 ? ? ? ? ? ? 325 LEU A CB  1 
+ATOM   1957 C CG  . LEU A 1 248 ? 16.439  24.321 45.108 1.00 28.39 ? ? ? ? ? ? 325 LEU A CG  1 
+ATOM   1958 C CD1 . LEU A 1 248 ? 17.948  24.305 45.210 1.00 31.26 ? ? ? ? ? ? 325 LEU A CD1 1 
+ATOM   1959 C CD2 . LEU A 1 248 ? 15.847  25.444 45.949 1.00 30.33 ? ? ? ? ? ? 325 LEU A CD2 1 
+ATOM   1960 N N   . HIS A 1 249 ? 17.721  21.453 42.671 1.00 17.38 ? ? ? ? ? ? 326 HIS A N   1 
+ATOM   1961 C CA  . HIS A 1 249 ? 17.740  19.996 42.843 1.00 18.99 ? ? ? ? ? ? 326 HIS A CA  1 
+ATOM   1962 C C   . HIS A 1 249 ? 17.739  19.438 44.265 1.00 19.18 ? ? ? ? ? ? 326 HIS A C   1 
+ATOM   1963 O O   . HIS A 1 249 ? 17.030  18.475 44.573 1.00 20.29 ? ? ? ? ? ? 326 HIS A O   1 
+ATOM   1964 C CB  . HIS A 1 249 ? 18.966  19.384 42.167 1.00 17.18 ? ? ? ? ? ? 326 HIS A CB  1 
+ATOM   1965 C CG  . HIS A 1 249 ? 19.064  19.640 40.699 1.00 18.26 ? ? ? ? ? ? 326 HIS A CG  1 
+ATOM   1966 N ND1 . HIS A 1 249 ? 18.037  19.369 39.819 1.00 20.27 ? ? ? ? ? ? 326 HIS A ND1 1 
+ATOM   1967 C CD2 . HIS A 1 249 ? 20.113  20.039 39.939 1.00 17.74 ? ? ? ? ? ? 326 HIS A CD2 1 
+ATOM   1968 C CE1 . HIS A 1 249 ? 18.451  19.586 38.584 1.00 21.97 ? ? ? ? ? ? 326 HIS A CE1 1 
+ATOM   1969 N NE2 . HIS A 1 249 ? 19.706  19.993 38.628 1.00 18.61 ? ? ? ? ? ? 326 HIS A NE2 1 
+ATOM   1970 N N   . ALA A 1 250 ? 18.561  20.017 45.129 1.00 14.51 ? ? ? ? ? ? 327 ALA A N   1 
+ATOM   1971 C CA  . ALA A 1 250 ? 18.678  19.481 46.473 1.00 14.10 ? ? ? ? ? ? 327 ALA A CA  1 
+ATOM   1972 C C   . ALA A 1 250 ? 19.393  20.444 47.400 1.00 9.97  ? ? ? ? ? ? 327 ALA A C   1 
+ATOM   1973 O O   . ALA A 1 250 ? 19.811  21.524 46.985 1.00 12.97 ? ? ? ? ? ? 327 ALA A O   1 
+ATOM   1974 C CB  . ALA A 1 250 ? 19.449  18.162 46.409 1.00 14.09 ? ? ? ? ? ? 327 ALA A CB  1 
+ATOM   1975 N N   . VAL A 1 251 ? 19.529  20.033 48.657 1.00 13.67 ? ? ? ? ? ? 328 VAL A N   1 
+ATOM   1976 C CA  . VAL A 1 251 ? 20.206  20.832 49.671 1.00 13.56 ? ? ? ? ? ? 328 VAL A CA  1 
+ATOM   1977 C C   . VAL A 1 251 ? 20.965  19.926 50.640 1.00 14.33 ? ? ? ? ? ? 328 VAL A C   1 
+ATOM   1978 O O   . VAL A 1 251 ? 20.641  18.750 50.777 1.00 15.51 ? ? ? ? ? ? 328 VAL A O   1 
+ATOM   1979 C CB  . VAL A 1 251 ? 19.194  21.653 50.521 1.00 14.43 ? ? ? ? ? ? 328 VAL A CB  1 
+ATOM   1980 C CG1 . VAL A 1 251 ? 18.439  22.638 49.650 1.00 15.37 ? ? ? ? ? ? 328 VAL A CG1 1 
+ATOM   1981 C CG2 . VAL A 1 251 ? 18.215  20.703 51.230 1.00 9.80  ? ? ? ? ? ? 328 VAL A CG2 1 
+ATOM   1982 N N   . VAL A 1 252 ? 21.992  20.474 51.285 1.00 16.08 ? ? ? ? ? ? 329 VAL A N   1 
+ATOM   1983 C CA  . VAL A 1 252 ? 22.726  19.748 52.320 1.00 14.33 ? ? ? ? ? ? 329 VAL A CA  1 
+ATOM   1984 C C   . VAL A 1 252 ? 22.300  20.587 53.508 1.00 14.35 ? ? ? ? ? ? 329 VAL A C   1 
+ATOM   1985 O O   . VAL A 1 252 ? 22.592  21.774 53.552 1.00 13.72 ? ? ? ? ? ? 329 VAL A O   1 
+ATOM   1986 C CB  . VAL A 1 252 ? 24.259  19.801 52.145 1.00 14.11 ? ? ? ? ? ? 329 VAL A CB  1 
+ATOM   1987 C CG1 . VAL A 1 252 ? 24.947  19.198 53.396 1.00 14.01 ? ? ? ? ? ? 329 VAL A CG1 1 
+ATOM   1988 C CG2 . VAL A 1 252 ? 24.660  18.999 50.928 1.00 12.76 ? ? ? ? ? ? 329 VAL A CG2 1 
+ATOM   1989 N N   . THR A 1 253 ? 21.586  19.965 54.447 1.00 16.89 ? ? ? ? ? ? 330 THR A N   1 
+ATOM   1990 C CA  . THR A 1 253 ? 21.005  20.639 55.617 1.00 21.91 ? ? ? ? ? ? 330 THR A CA  1 
+ATOM   1991 C C   . THR A 1 253 ? 21.876  21.059 56.809 1.00 25.35 ? ? ? ? ? ? 330 THR A C   1 
+ATOM   1992 O O   . THR A 1 253 ? 21.403  21.802 57.674 1.00 25.25 ? ? ? ? ? ? 330 THR A O   1 
+ATOM   1993 C CB  . THR A 1 253 ? 19.849  19.791 56.192 1.00 21.06 ? ? ? ? ? ? 330 THR A CB  1 
+ATOM   1994 O OG1 . THR A 1 253 ? 20.368  18.545 56.670 1.00 25.52 ? ? ? ? ? ? 330 THR A OG1 1 
+ATOM   1995 C CG2 . THR A 1 253 ? 18.822  19.489 55.125 1.00 23.97 ? ? ? ? ? ? 330 THR A CG2 1 
+ATOM   1996 N N   . LYS A 1 254 ? 23.121  20.594 56.876 1.00 20.91 ? ? ? ? ? ? 331 LYS A N   1 
+ATOM   1997 C CA  . LYS A 1 254 ? 24.000  20.955 57.998 1.00 20.86 ? ? ? ? ? ? 331 LYS A CA  1 
+ATOM   1998 C C   . LYS A 1 254 ? 24.982  22.042 57.569 1.00 21.05 ? ? ? ? ? ? 331 LYS A C   1 
+ATOM   1999 O O   . LYS A 1 254 ? 25.442  22.043 56.434 1.00 19.74 ? ? ? ? ? ? 331 LYS A O   1 
+ATOM   2000 C CB  . LYS A 1 254 ? 24.775  19.727 58.480 1.00 17.91 ? ? ? ? ? ? 331 LYS A CB  1 
+ATOM   2001 C CG  . LYS A 1 254 ? 23.899  18.553 58.897 1.00 20.30 ? ? ? ? ? ? 331 LYS A CG  1 
+ATOM   2002 C CD  . LYS A 1 254 ? 23.017  18.883 60.091 1.00 24.96 ? ? ? ? ? ? 331 LYS A CD  1 
+ATOM   2003 C CE  . LYS A 1 254 ? 22.121  17.699 60.417 1.00 30.86 ? ? ? ? ? ? 331 LYS A CE  1 
+ATOM   2004 N NZ  . LYS A 1 254 ? 21.263  17.936 61.609 1.00 38.75 ? ? ? ? ? ? 331 LYS A NZ  1 
+ATOM   2005 N N   . GLU A 1 255 ? 25.320  22.963 58.467 1.00 17.36 ? ? ? ? ? ? 332 GLU A N   1 
+ATOM   2006 C CA  . GLU A 1 255 ? 26.241  24.031 58.099 1.00 18.95 ? ? ? ? ? ? 332 GLU A CA  1 
+ATOM   2007 C C   . GLU A 1 255 ? 27.626  23.474 57.776 1.00 15.37 ? ? ? ? ? ? 332 GLU A C   1 
+ATOM   2008 O O   . GLU A 1 255 ? 28.109  22.562 58.436 1.00 16.86 ? ? ? ? ? ? 332 GLU A O   1 
+ATOM   2009 C CB  . GLU A 1 255 ? 26.336  25.085 59.214 1.00 20.65 ? ? ? ? ? ? 332 GLU A CB  1 
+ATOM   2010 C CG  . GLU A 1 255 ? 25.023  25.801 59.503 1.00 23.30 ? ? ? ? ? ? 332 GLU A CG  1 
+ATOM   2011 C CD  . GLU A 1 255 ? 25.179  26.955 60.483 1.00 29.74 ? ? ? ? ? ? 332 GLU A CD  1 
+ATOM   2012 O OE1 . GLU A 1 255 ? 25.741  26.737 61.577 1.00 29.11 ? ? ? ? ? ? 332 GLU A OE1 1 
+ATOM   2013 O OE2 . GLU A 1 255 ? 24.733  28.079 60.162 1.00 27.22 ? ? ? ? ? ? 332 GLU A OE2 1 
+ATOM   2014 N N   . PRO A 1 256 ? 28.274  24.010 56.736 1.00 16.32 ? ? ? ? ? ? 333 PRO A N   1 
+ATOM   2015 C CA  . PRO A 1 256 ? 27.774  25.084 55.875 1.00 15.48 ? ? ? ? ? ? 333 PRO A CA  1 
+ATOM   2016 C C   . PRO A 1 256 ? 26.707  24.546 54.909 1.00 16.58 ? ? ? ? ? ? 333 PRO A C   1 
+ATOM   2017 O O   . PRO A 1 256 ? 26.911  23.531 54.246 1.00 15.81 ? ? ? ? ? ? 333 PRO A O   1 
+ATOM   2018 C CB  . PRO A 1 256 ? 29.045  25.546 55.170 1.00 15.00 ? ? ? ? ? ? 333 PRO A CB  1 
+ATOM   2019 C CG  . PRO A 1 256 ? 29.733  24.233 54.938 1.00 13.90 ? ? ? ? ? ? 333 PRO A CG  1 
+ATOM   2020 C CD  . PRO A 1 256 ? 29.632  23.614 56.319 1.00 18.41 ? ? ? ? ? ? 333 PRO A CD  1 
+ATOM   2021 N N   . ILE A 1 257 ? 25.572  25.236 54.836 1.00 16.66 ? ? ? ? ? ? 334 ILE A N   1 
+ATOM   2022 C CA  . ILE A 1 257 ? 24.465  24.819 53.978 1.00 16.79 ? ? ? ? ? ? 334 ILE A CA  1 
+ATOM   2023 C C   . ILE A 1 257 ? 24.818  24.847 52.490 1.00 13.40 ? ? ? ? ? ? 334 ILE A C   1 
+ATOM   2024 O O   . ILE A 1 257 ? 25.486  25.761 52.030 1.00 17.71 ? ? ? ? ? ? 334 ILE A O   1 
+ATOM   2025 C CB  . ILE A 1 257 ? 23.212  25.721 54.212 1.00 18.98 ? ? ? ? ? ? 334 ILE A CB  1 
+ATOM   2026 C CG1 . ILE A 1 257 ? 22.719  25.579 55.658 1.00 20.00 ? ? ? ? ? ? 334 ILE A CG1 1 
+ATOM   2027 C CG2 . ILE A 1 257 ? 22.105  25.380 53.203 1.00 18.44 ? ? ? ? ? ? 334 ILE A CG2 1 
+ATOM   2028 C CD1 . ILE A 1 257 ? 22.442  24.177 56.085 1.00 24.45 ? ? ? ? ? ? 334 ILE A CD1 1 
+ATOM   2029 N N   . TYR A 1 258 ? 24.380  23.824 51.755 1.00 14.15 ? ? ? ? ? ? 335 TYR A N   1 
+ATOM   2030 C CA  . TYR A 1 258 ? 24.594  23.732 50.308 1.00 16.78 ? ? ? ? ? ? 335 TYR A CA  1 
+ATOM   2031 C C   . TYR A 1 258 ? 23.245  23.769 49.589 1.00 16.48 ? ? ? ? ? ? 335 TYR A C   1 
+ATOM   2032 O O   . TYR A 1 258 ? 22.311  23.075 49.994 1.00 14.65 ? ? ? ? ? ? 335 TYR A O   1 
+ATOM   2033 C CB  . TYR A 1 258 ? 25.283  22.414 49.917 1.00 17.87 ? ? ? ? ? ? 335 TYR A CB  1 
+ATOM   2034 C CG  . TYR A 1 258 ? 26.768  22.336 50.193 1.00 19.62 ? ? ? ? ? ? 335 TYR A CG  1 
+ATOM   2035 C CD1 . TYR A 1 258 ? 27.463  23.422 50.730 1.00 21.36 ? ? ? ? ? ? 335 TYR A CD1 1 
+ATOM   2036 C CD2 . TYR A 1 258 ? 27.490  21.182 49.882 1.00 23.68 ? ? ? ? ? ? 335 TYR A CD2 1 
+ATOM   2037 C CE1 . TYR A 1 258 ? 28.844  23.362 50.947 1.00 26.88 ? ? ? ? ? ? 335 TYR A CE1 1 
+ATOM   2038 C CE2 . TYR A 1 258 ? 28.877  21.113 50.096 1.00 26.23 ? ? ? ? ? ? 335 TYR A CE2 1 
+ATOM   2039 C CZ  . TYR A 1 258 ? 29.541  22.207 50.626 1.00 26.30 ? ? ? ? ? ? 335 TYR A CZ  1 
+ATOM   2040 O OH  . TYR A 1 258 ? 30.903  22.159 50.820 1.00 30.70 ? ? ? ? ? ? 335 TYR A OH  1 
+ATOM   2041 N N   . ILE A 1 259 ? 23.156  24.580 48.536 1.00 15.82 ? ? ? ? ? ? 336 ILE A N   1 
+ATOM   2042 C CA  . ILE A 1 259 ? 21.956  24.684 47.713 1.00 15.43 ? ? ? ? ? ? 336 ILE A CA  1 
+ATOM   2043 C C   . ILE A 1 259 ? 22.412  24.210 46.333 1.00 15.22 ? ? ? ? ? ? 336 ILE A C   1 
+ATOM   2044 O O   . ILE A 1 259 ? 23.196  24.898 45.662 1.00 14.91 ? ? ? ? ? ? 336 ILE A O   1 
+ATOM   2045 C CB  . ILE A 1 259 ? 21.462  26.136 47.589 1.00 18.57 ? ? ? ? ? ? 336 ILE A CB  1 
+ATOM   2046 C CG1 . ILE A 1 259 ? 21.295  26.756 48.975 1.00 21.01 ? ? ? ? ? ? 336 ILE A CG1 1 
+ATOM   2047 C CG2 . ILE A 1 259 ? 20.125  26.154 46.859 1.00 19.38 ? ? ? ? ? ? 336 ILE A CG2 1 
+ATOM   2048 C CD1 . ILE A 1 259 ? 20.873  28.225 48.956 1.00 21.72 ? ? ? ? ? ? 336 ILE A CD1 1 
+ATOM   2049 N N   . ILE A 1 260 ? 21.936  23.036 45.921 1.00 11.75 ? ? ? ? ? ? 337 ILE A N   1 
+ATOM   2050 C CA  . ILE A 1 260 ? 22.332  22.464 44.645 1.00 11.57 ? ? ? ? ? ? 337 ILE A CA  1 
+ATOM   2051 C C   . ILE A 1 260 ? 21.340  22.778 43.527 1.00 13.31 ? ? ? ? ? ? 337 ILE A C   1 
+ATOM   2052 O O   . ILE A 1 260 ? 20.151  22.481 43.639 1.00 12.17 ? ? ? ? ? ? 337 ILE A O   1 
+ATOM   2053 C CB  . ILE A 1 260 ? 22.512  20.919 44.741 1.00 11.70 ? ? ? ? ? ? 337 ILE A CB  1 
+ATOM   2054 C CG1 . ILE A 1 260 ? 23.574  20.555 45.799 1.00 11.90 ? ? ? ? ? ? 337 ILE A CG1 1 
+ATOM   2055 C CG2 . ILE A 1 260 ? 22.970  20.364 43.378 1.00 13.51 ? ? ? ? ? ? 337 ILE A CG2 1 
+ATOM   2056 C CD1 . ILE A 1 260 ? 23.040  20.495 47.246 1.00 13.64 ? ? ? ? ? ? 337 ILE A CD1 1 
+ATOM   2057 N N   . THR A 1 261 ? 21.833  23.380 42.450 1.00 12.31 ? ? ? ? ? ? 338 THR A N   1 
+ATOM   2058 C CA  . THR A 1 261 ? 20.973  23.725 41.324 1.00 13.77 ? ? ? ? ? ? 338 THR A CA  1 
+ATOM   2059 C C   . THR A 1 261 ? 21.597  23.262 40.025 1.00 16.68 ? ? ? ? ? ? 338 THR A C   1 
+ATOM   2060 O O   . THR A 1 261 ? 22.712  22.723 40.003 1.00 13.07 ? ? ? ? ? ? 338 THR A O   1 
+ATOM   2061 C CB  . THR A 1 261 ? 20.760  25.248 41.197 1.00 15.11 ? ? ? ? ? ? 338 THR A CB  1 
+ATOM   2062 O OG1 . THR A 1 261 ? 21.973  25.864 40.747 1.00 17.45 ? ? ? ? ? ? 338 THR A OG1 1 
+ATOM   2063 C CG2 . THR A 1 261 ? 20.365  25.852 42.540 1.00 16.61 ? ? ? ? ? ? 338 THR A CG2 1 
+ATOM   2064 N N   . GLU A 1 262 ? 20.873  23.472 38.934 1.00 17.77 ? ? ? ? ? ? 339 GLU A N   1 
+ATOM   2065 C CA  . GLU A 1 262 ? 21.397  23.102 37.633 1.00 16.28 ? ? ? ? ? ? 339 GLU A CA  1 
+ATOM   2066 C C   . GLU A 1 262 ? 22.510  24.107 37.329 1.00 17.39 ? ? ? ? ? ? 339 GLU A C   1 
+ATOM   2067 O O   . GLU A 1 262 ? 22.509  25.218 37.858 1.00 15.68 ? ? ? ? ? ? 339 GLU A O   1 
+ATOM   2068 C CB  . GLU A 1 262 ? 20.286  23.167 36.573 1.00 20.60 ? ? ? ? ? ? 339 GLU A CB  1 
+ATOM   2069 C CG  . GLU A 1 262 ? 19.679  24.546 36.348 1.00 19.80 ? ? ? ? ? ? 339 GLU A CG  1 
+ATOM   2070 C CD  . GLU A 1 262 ? 18.532  24.504 35.353 1.00 23.99 ? ? ? ? ? ? 339 GLU A CD  1 
+ATOM   2071 O OE1 . GLU A 1 262 ? 18.700  23.867 34.288 1.00 23.85 ? ? ? ? ? ? 339 GLU A OE1 1 
+ATOM   2072 O OE2 . GLU A 1 262 ? 17.475  25.112 35.630 1.00 16.41 ? ? ? ? ? ? 339 GLU A OE2 1 
+ATOM   2073 N N   . PHE A 1 263 ? 23.468  23.706 36.502 1.00 17.92 ? ? ? ? ? ? 340 PHE A N   1 
+ATOM   2074 C CA  . PHE A 1 263 ? 24.586  24.570 36.132 1.00 17.78 ? ? ? ? ? ? 340 PHE A CA  1 
+ATOM   2075 C C   . PHE A 1 263 ? 24.275  25.358 34.860 1.00 18.48 ? ? ? ? ? ? 340 PHE A C   1 
+ATOM   2076 O O   . PHE A 1 263 ? 23.824  24.791 33.869 1.00 17.53 ? ? ? ? ? ? 340 PHE A O   1 
+ATOM   2077 C CB  . PHE A 1 263 ? 25.834  23.717 35.912 1.00 17.42 ? ? ? ? ? ? 340 PHE A CB  1 
+ATOM   2078 C CG  . PHE A 1 263 ? 26.961  24.457 35.281 1.00 19.75 ? ? ? ? ? ? 340 PHE A CG  1 
+ATOM   2079 C CD1 . PHE A 1 263 ? 27.610  25.478 35.962 1.00 19.92 ? ? ? ? ? ? 340 PHE A CD1 1 
+ATOM   2080 C CD2 . PHE A 1 263 ? 27.346  24.167 33.979 1.00 18.46 ? ? ? ? ? ? 340 PHE A CD2 1 
+ATOM   2081 C CE1 . PHE A 1 263 ? 28.626  26.203 35.358 1.00 20.94 ? ? ? ? ? ? 340 PHE A CE1 1 
+ATOM   2082 C CE2 . PHE A 1 263 ? 28.366  24.890 33.361 1.00 23.96 ? ? ? ? ? ? 340 PHE A CE2 1 
+ATOM   2083 C CZ  . PHE A 1 263 ? 29.004  25.911 34.056 1.00 20.30 ? ? ? ? ? ? 340 PHE A CZ  1 
+ATOM   2084 N N   . MET A 1 264 ? 24.523  26.664 34.891 1.00 18.66 ? ? ? ? ? ? 341 MET A N   1 
+ATOM   2085 C CA  . MET A 1 264 ? 24.271  27.523 33.736 1.00 20.97 ? ? ? ? ? ? 341 MET A CA  1 
+ATOM   2086 C C   . MET A 1 264 ? 25.602  27.965 33.124 1.00 21.27 ? ? ? ? ? ? 341 MET A C   1 
+ATOM   2087 O O   . MET A 1 264 ? 26.352  28.750 33.709 1.00 19.04 ? ? ? ? ? ? 341 MET A O   1 
+ATOM   2088 C CB  . MET A 1 264 ? 23.418  28.720 34.162 1.00 21.30 ? ? ? ? ? ? 341 MET A CB  1 
+ATOM   2089 C CG  . MET A 1 264 ? 22.003  28.312 34.559 1.00 25.04 ? ? ? ? ? ? 341 MET A CG  1 
+ATOM   2090 S SD  . MET A 1 264 ? 21.047  27.703 33.147 1.00 29.08 ? ? ? ? ? ? 341 MET A SD  1 
+ATOM   2091 C CE  . MET A 1 264 ? 19.614  27.114 33.960 1.00 35.21 ? ? ? ? ? ? 341 MET A CE  1 
+ATOM   2092 N N   . ALA A 1 265 ? 25.879  27.435 31.937 1.00 20.33 ? ? ? ? ? ? 342 ALA A N   1 
+ATOM   2093 C CA  . ALA A 1 265 ? 27.125  27.675 31.219 1.00 22.34 ? ? ? ? ? ? 342 ALA A CA  1 
+ATOM   2094 C C   . ALA A 1 265 ? 27.597  29.113 31.063 1.00 22.58 ? ? ? ? ? ? 342 ALA A C   1 
+ATOM   2095 O O   . ALA A 1 265 ? 28.796  29.373 31.129 1.00 23.85 ? ? ? ? ? ? 342 ALA A O   1 
+ATOM   2096 C CB  . ALA A 1 265 ? 27.058  26.994 29.836 1.00 22.89 ? ? ? ? ? ? 342 ALA A CB  1 
+ATOM   2097 N N   . LYS A 1 266 ? 26.680  30.056 30.876 1.00 22.00 ? ? ? ? ? ? 343 LYS A N   1 
+ATOM   2098 C CA  . LYS A 1 266 ? 27.108  31.437 30.685 1.00 23.86 ? ? ? ? ? ? 343 LYS A CA  1 
+ATOM   2099 C C   . LYS A 1 266 ? 27.078  32.400 31.867 1.00 23.05 ? ? ? ? ? ? 343 LYS A C   1 
+ATOM   2100 O O   . LYS A 1 266 ? 27.114  33.609 31.674 1.00 23.00 ? ? ? ? ? ? 343 LYS A O   1 
+ATOM   2101 C CB  . LYS A 1 266 ? 26.362  32.041 29.498 1.00 26.46 ? ? ? ? ? ? 343 LYS A CB  1 
+ATOM   2102 C CG  . LYS A 1 266 ? 26.722  31.358 28.186 1.00 33.46 ? ? ? ? ? ? 343 LYS A CG  1 
+ATOM   2103 C CD  . LYS A 1 266 ? 26.003  31.979 27.009 1.00 36.60 ? ? ? ? ? ? 343 LYS A CD  1 
+ATOM   2104 C CE  . LYS A 1 266 ? 26.340  31.246 25.724 1.00 39.07 ? ? ? ? ? ? 343 LYS A CE  1 
+ATOM   2105 N NZ  . LYS A 1 266 ? 27.796  31.297 25.444 1.00 41.33 ? ? ? ? ? ? 343 LYS A NZ  1 
+ATOM   2106 N N   . GLY A 1 267 ? 27.021  31.866 33.083 1.00 23.98 ? ? ? ? ? ? 344 GLY A N   1 
+ATOM   2107 C CA  . GLY A 1 267 ? 27.037  32.706 34.270 1.00 19.79 ? ? ? ? ? ? 344 GLY A CA  1 
+ATOM   2108 C C   . GLY A 1 267 ? 25.865  33.643 34.478 1.00 16.74 ? ? ? ? ? ? 344 GLY A C   1 
+ATOM   2109 O O   . GLY A 1 267 ? 24.763  33.381 34.005 1.00 19.56 ? ? ? ? ? ? 344 GLY A O   1 
+ATOM   2110 N N   . SER A 1 268 ? 26.097  34.733 35.205 1.00 17.29 ? ? ? ? ? ? 345 SER A N   1 
+ATOM   2111 C CA  . SER A 1 268 ? 25.033  35.697 35.470 1.00 20.81 ? ? ? ? ? ? 345 SER A CA  1 
+ATOM   2112 C C   . SER A 1 268 ? 24.841  36.605 34.269 1.00 22.11 ? ? ? ? ? ? 345 SER A C   1 
+ATOM   2113 O O   . SER A 1 268 ? 25.773  36.842 33.492 1.00 21.87 ? ? ? ? ? ? 345 SER A O   1 
+ATOM   2114 C CB  . SER A 1 268 ? 25.357  36.558 36.690 1.00 18.24 ? ? ? ? ? ? 345 SER A CB  1 
+ATOM   2115 O OG  . SER A 1 268 ? 26.481  37.380 36.440 1.00 26.65 ? ? ? ? ? ? 345 SER A OG  1 
+ATOM   2116 N N   . LEU A 1 269 ? 23.624  37.111 34.122 1.00 21.12 ? ? ? ? ? ? 346 LEU A N   1 
+ATOM   2117 C CA  . LEU A 1 269 ? 23.298  38.006 33.022 1.00 18.63 ? ? ? ? ? ? 346 LEU A CA  1 
+ATOM   2118 C C   . LEU A 1 269 ? 24.206  39.221 33.124 1.00 19.00 ? ? ? ? ? ? 346 LEU A C   1 
+ATOM   2119 O O   . LEU A 1 269 ? 24.618  39.798 32.119 1.00 16.47 ? ? ? ? ? ? 346 LEU A O   1 
+ATOM   2120 C CB  . LEU A 1 269 ? 21.835  38.436 33.118 1.00 15.56 ? ? ? ? ? ? 346 LEU A CB  1 
+ATOM   2121 C CG  . LEU A 1 269 ? 21.323  39.424 32.068 1.00 15.10 ? ? ? ? ? ? 346 LEU A CG  1 
+ATOM   2122 C CD1 . LEU A 1 269 ? 21.512  38.843 30.688 1.00 13.80 ? ? ? ? ? ? 346 LEU A CD1 1 
+ATOM   2123 C CD2 . LEU A 1 269 ? 19.850  39.722 32.321 1.00 20.80 ? ? ? ? ? ? 346 LEU A CD2 1 
+ATOM   2124 N N   . LEU A 1 270 ? 24.521  39.601 34.353 1.00 19.15 ? ? ? ? ? ? 347 LEU A N   1 
+ATOM   2125 C CA  . LEU A 1 270 ? 25.383  40.743 34.581 1.00 25.59 ? ? ? ? ? ? 347 LEU A CA  1 
+ATOM   2126 C C   . LEU A 1 270 ? 26.747  40.512 33.923 1.00 27.21 ? ? ? ? ? ? 347 LEU A C   1 
+ATOM   2127 O O   . LEU A 1 270 ? 27.177  41.306 33.091 1.00 30.86 ? ? ? ? ? ? 347 LEU A O   1 
+ATOM   2128 C CB  . LEU A 1 270 ? 25.535  40.985 36.083 1.00 25.16 ? ? ? ? ? ? 347 LEU A CB  1 
+ATOM   2129 C CG  . LEU A 1 270 ? 26.338  42.224 36.468 1.00 29.44 ? ? ? ? ? ? 347 LEU A CG  1 
+ATOM   2130 C CD1 . LEU A 1 270 ? 25.701  43.460 35.837 1.00 25.05 ? ? ? ? ? ? 347 LEU A CD1 1 
+ATOM   2131 C CD2 . LEU A 1 270 ? 26.395  42.347 37.979 1.00 29.42 ? ? ? ? ? ? 347 LEU A CD2 1 
+ATOM   2132 N N   . ASP A 1 271 ? 27.422  39.421 34.271 1.00 30.77 ? ? ? ? ? ? 348 ASP A N   1 
+ATOM   2133 C CA  . ASP A 1 271 ? 28.725  39.146 33.670 1.00 31.67 ? ? ? ? ? ? 348 ASP A CA  1 
+ATOM   2134 C C   . ASP A 1 271 ? 28.598  38.970 32.163 1.00 31.26 ? ? ? ? ? ? 348 ASP A C   1 
+ATOM   2135 O O   . ASP A 1 271 ? 29.439  39.450 31.400 1.00 31.04 ? ? ? ? ? ? 348 ASP A O   1 
+ATOM   2136 C CB  . ASP A 1 271 ? 29.361  37.880 34.248 1.00 32.75 ? ? ? ? ? ? 348 ASP A CB  1 
+ATOM   2137 C CG  . ASP A 1 271 ? 29.588  37.964 35.740 1.00 35.56 ? ? ? ? ? ? 348 ASP A CG  1 
+ATOM   2138 O OD1 . ASP A 1 271 ? 29.991  39.039 36.246 1.00 36.10 ? ? ? ? ? ? 348 ASP A OD1 1 
+ATOM   2139 O OD2 . ASP A 1 271 ? 29.390  36.927 36.402 1.00 38.06 ? ? ? ? ? ? 348 ASP A OD2 1 
+ATOM   2140 N N   . PHE A 1 272 ? 27.547  38.274 31.738 1.00 26.76 ? ? ? ? ? ? 349 PHE A N   1 
+ATOM   2141 C CA  . PHE A 1 272 ? 27.320  38.036 30.318 1.00 26.10 ? ? ? ? ? ? 349 PHE A CA  1 
+ATOM   2142 C C   . PHE A 1 272 ? 27.177  39.330 29.524 1.00 26.54 ? ? ? ? ? ? 349 PHE A C   1 
+ATOM   2143 O O   . PHE A 1 272 ? 27.744  39.469 28.444 1.00 27.64 ? ? ? ? ? ? 349 PHE A O   1 
+ATOM   2144 C CB  . PHE A 1 272 ? 26.069  37.183 30.108 1.00 26.31 ? ? ? ? ? ? 349 PHE A CB  1 
+ATOM   2145 C CG  . PHE A 1 272 ? 25.718  36.979 28.665 1.00 27.32 ? ? ? ? ? ? 349 PHE A CG  1 
+ATOM   2146 C CD1 . PHE A 1 272 ? 26.569  36.273 27.823 1.00 27.28 ? ? ? ? ? ? 349 PHE A CD1 1 
+ATOM   2147 C CD2 . PHE A 1 272 ? 24.555  37.528 28.135 1.00 28.35 ? ? ? ? ? ? 349 PHE A CD2 1 
+ATOM   2148 C CE1 . PHE A 1 272 ? 26.268  36.118 26.474 1.00 30.42 ? ? ? ? ? ? 349 PHE A CE1 1 
+ATOM   2149 C CE2 . PHE A 1 272 ? 24.243  37.382 26.792 1.00 27.67 ? ? ? ? ? ? 349 PHE A CE2 1 
+ATOM   2150 C CZ  . PHE A 1 272 ? 25.101  36.675 25.956 1.00 32.35 ? ? ? ? ? ? 349 PHE A CZ  1 
+ATOM   2151 N N   . LEU A 1 273 ? 26.420  40.284 30.051 1.00 27.29 ? ? ? ? ? ? 350 LEU A N   1 
+ATOM   2152 C CA  . LEU A 1 273 ? 26.230  41.542 29.337 1.00 27.47 ? ? ? ? ? ? 350 LEU A CA  1 
+ATOM   2153 C C   . LEU A 1 273 ? 27.496  42.389 29.252 1.00 30.80 ? ? ? ? ? ? 350 LEU A C   1 
+ATOM   2154 O O   . LEU A 1 273 ? 27.680  43.143 28.295 1.00 25.94 ? ? ? ? ? ? 350 LEU A O   1 
+ATOM   2155 C CB  . LEU A 1 273 ? 25.109  42.357 29.982 1.00 25.12 ? ? ? ? ? ? 350 LEU A CB  1 
+ATOM   2156 C CG  . LEU A 1 273 ? 23.712  41.739 29.865 1.00 26.95 ? ? ? ? ? ? 350 LEU A CG  1 
+ATOM   2157 C CD1 . LEU A 1 273 ? 22.701  42.626 30.565 1.00 24.57 ? ? ? ? ? ? 350 LEU A CD1 1 
+ATOM   2158 C CD2 . LEU A 1 273 ? 23.352  41.567 28.399 1.00 24.89 ? ? ? ? ? ? 350 LEU A CD2 1 
+ATOM   2159 N N   . LYS A 1 274 ? 28.365  42.259 30.250 1.00 32.08 ? ? ? ? ? ? 351 LYS A N   1 
+ATOM   2160 C CA  . LYS A 1 274 ? 29.605  43.026 30.288 1.00 32.65 ? ? ? ? ? ? 351 LYS A CA  1 
+ATOM   2161 C C   . LYS A 1 274 ? 30.722  42.326 29.513 1.00 33.49 ? ? ? ? ? ? 351 LYS A C   1 
+ATOM   2162 O O   . LYS A 1 274 ? 31.806  42.884 29.332 1.00 33.40 ? ? ? ? ? ? 351 LYS A O   1 
+ATOM   2163 C CB  . LYS A 1 274 ? 30.028  43.255 31.747 1.00 33.97 ? ? ? ? ? ? 351 LYS A CB  1 
+ATOM   2164 C CG  . LYS A 1 274 ? 28.988  44.030 32.582 1.00 33.62 ? ? ? ? ? ? 351 LYS A CG  1 
+ATOM   2165 C CD  . LYS A 1 274 ? 29.295  44.027 34.088 1.00 32.98 ? ? ? ? ? ? 351 LYS A CD  1 
+ATOM   2166 C CE  . LYS A 1 274 ? 30.617  44.699 34.424 1.00 40.12 ? ? ? ? ? ? 351 LYS A CE  1 
+ATOM   2167 N NZ  . LYS A 1 274 ? 30.638  46.137 34.023 1.00 44.71 ? ? ? ? ? ? 351 LYS A NZ  1 
+ATOM   2168 N N   . SER A 1 275 ? 30.451  41.108 29.052 1.00 33.22 ? ? ? ? ? ? 352 SER A N   1 
+ATOM   2169 C CA  . SER A 1 275 ? 31.438  40.348 28.296 1.00 33.96 ? ? ? ? ? ? 352 SER A CA  1 
+ATOM   2170 C C   . SER A 1 275 ? 31.370  40.741 26.827 1.00 36.28 ? ? ? ? ? ? 352 SER A C   1 
+ATOM   2171 O O   . SER A 1 275 ? 30.516  41.532 26.424 1.00 34.02 ? ? ? ? ? ? 352 SER A O   1 
+ATOM   2172 C CB  . SER A 1 275 ? 31.178  38.849 28.411 1.00 33.05 ? ? ? ? ? ? 352 SER A CB  1 
+ATOM   2173 O OG  . SER A 1 275 ? 30.075  38.463 27.610 1.00 31.80 ? ? ? ? ? ? 352 SER A OG  1 
+ATOM   2174 N N   . ASP A 1 276 ? 32.258  40.157 26.028 1.00 37.43 ? ? ? ? ? ? 353 ASP A N   1 
+ATOM   2175 C CA  . ASP A 1 276 ? 32.322  40.452 24.600 1.00 38.14 ? ? ? ? ? ? 353 ASP A CA  1 
+ATOM   2176 C C   . ASP A 1 276 ? 31.059  40.007 23.862 1.00 36.66 ? ? ? ? ? ? 353 ASP A C   1 
+ATOM   2177 O O   . ASP A 1 276 ? 30.425  40.802 23.162 1.00 35.51 ? ? ? ? ? ? 353 ASP A O   1 
+ATOM   2178 C CB  . ASP A 1 276 ? 33.557  39.783 23.983 1.00 38.45 ? ? ? ? ? ? 353 ASP A CB  1 
+ATOM   2179 C CG  . ASP A 1 276 ? 33.795  40.211 22.546 1.00 41.95 ? ? ? ? ? ? 353 ASP A CG  1 
+ATOM   2180 O OD1 . ASP A 1 276 ? 33.969  41.426 22.310 1.00 37.79 ? ? ? ? ? ? 353 ASP A OD1 1 
+ATOM   2181 O OD2 . ASP A 1 276 ? 33.809  39.336 21.653 1.00 45.21 ? ? ? ? ? ? 353 ASP A OD2 1 
+ATOM   2182 N N   . GLU A 1 277 ? 30.694  38.738 24.011 1.00 35.14 ? ? ? ? ? ? 354 GLU A N   1 
+ATOM   2183 C CA  . GLU A 1 277 ? 29.497  38.228 23.352 1.00 35.63 ? ? ? ? ? ? 354 GLU A CA  1 
+ATOM   2184 C C   . GLU A 1 277 ? 28.272  39.015 23.798 1.00 34.76 ? ? ? ? ? ? 354 GLU A C   1 
+ATOM   2185 O O   . GLU A 1 277 ? 27.299  39.144 23.054 1.00 35.50 ? ? ? ? ? ? 354 GLU A O   1 
+ATOM   2186 C CB  . GLU A 1 277 ? 29.297  36.746 23.666 1.00 36.91 ? ? ? ? ? ? 354 GLU A CB  1 
+ATOM   2187 C CG  . GLU A 1 277 ? 27.926  36.221 23.275 1.00 40.58 ? ? ? ? ? ? 354 GLU A CG  1 
+ATOM   2188 C CD  . GLU A 1 277 ? 27.744  34.761 23.620 1.00 42.30 ? ? ? ? ? ? 354 GLU A CD  1 
+ATOM   2189 O OE1 . GLU A 1 277 ? 28.203  34.357 24.707 1.00 45.83 ? ? ? ? ? ? 354 GLU A OE1 1 
+ATOM   2190 O OE2 . GLU A 1 277 ? 27.124  34.023 22.826 1.00 43.84 ? ? ? ? ? ? 354 GLU A OE2 1 
+ATOM   2191 N N   . GLY A 1 278 ? 28.326  39.543 25.015 1.00 33.88 ? ? ? ? ? ? 355 GLY A N   1 
+ATOM   2192 C CA  . GLY A 1 278 ? 27.208  40.313 25.529 1.00 35.31 ? ? ? ? ? ? 355 GLY A CA  1 
+ATOM   2193 C C   . GLY A 1 278 ? 27.081  41.682 24.885 1.00 33.69 ? ? ? ? ? ? 355 GLY A C   1 
+ATOM   2194 O O   . GLY A 1 278 ? 25.974  42.148 24.610 1.00 33.05 ? ? ? ? ? ? 355 GLY A O   1 
+ATOM   2195 N N   . SER A 1 279 ? 28.215  42.332 24.640 1.00 33.69 ? ? ? ? ? ? 356 SER A N   1 
+ATOM   2196 C CA  . SER A 1 279 ? 28.210  43.656 24.030 1.00 34.85 ? ? ? ? ? ? 356 SER A CA  1 
+ATOM   2197 C C   . SER A 1 279 ? 27.623  43.596 22.622 1.00 34.90 ? ? ? ? ? ? 356 SER A C   1 
+ATOM   2198 O O   . SER A 1 279 ? 27.107  44.590 22.116 1.00 35.64 ? ? ? ? ? ? 356 SER A O   1 
+ATOM   2199 C CB  . SER A 1 279 ? 29.635  44.222 23.970 1.00 35.14 ? ? ? ? ? ? 356 SER A CB  1 
+ATOM   2200 O OG  . SER A 1 279 ? 30.459  43.436 23.124 1.00 37.58 ? ? ? ? ? ? 356 SER A OG  1 
+ATOM   2201 N N   . LYS A 1 280 ? 27.692  42.428 21.995 1.00 33.23 ? ? ? ? ? ? 357 LYS A N   1 
+ATOM   2202 C CA  . LYS A 1 280 ? 27.178  42.267 20.638 1.00 35.36 ? ? ? ? ? ? 357 LYS A CA  1 
+ATOM   2203 C C   . LYS A 1 280 ? 25.682  41.948 20.553 1.00 34.05 ? ? ? ? ? ? 357 LYS A C   1 
+ATOM   2204 O O   . LYS A 1 280 ? 25.147  41.766 19.457 1.00 32.78 ? ? ? ? ? ? 357 LYS A O   1 
+ATOM   2205 C CB  . LYS A 1 280 ? 27.966  41.180 19.906 1.00 36.98 ? ? ? ? ? ? 357 LYS A CB  1 
+ATOM   2206 C CG  . LYS A 1 280 ? 29.453  41.469 19.755 1.00 41.65 ? ? ? ? ? ? 357 LYS A CG  1 
+ATOM   2207 C CD  . LYS A 1 280 ? 30.141  40.330 19.014 1.00 45.86 ? ? ? ? ? ? 357 LYS A CD  1 
+ATOM   2208 C CE  . LYS A 1 280 ? 31.635  40.572 18.847 1.00 47.52 ? ? ? ? ? ? 357 LYS A CE  1 
+ATOM   2209 N NZ  . LYS A 1 280 ? 32.259  39.451 18.087 1.00 48.88 ? ? ? ? ? ? 357 LYS A NZ  1 
+ATOM   2210 N N   . GLN A 1 281 ? 25.012  41.867 21.696 1.00 31.52 ? ? ? ? ? ? 358 GLN A N   1 
+ATOM   2211 C CA  . GLN A 1 281 ? 23.581  41.577 21.701 1.00 31.01 ? ? ? ? ? ? 358 GLN A CA  1 
+ATOM   2212 C C   . GLN A 1 281 ? 22.817  42.855 21.362 1.00 30.49 ? ? ? ? ? ? 358 GLN A C   1 
+ATOM   2213 O O   . GLN A 1 281 ? 22.917  43.848 22.079 1.00 31.21 ? ? ? ? ? ? 358 GLN A O   1 
+ATOM   2214 C CB  . GLN A 1 281 ? 23.129  41.070 23.079 1.00 30.82 ? ? ? ? ? ? 358 GLN A CB  1 
+ATOM   2215 C CG  . GLN A 1 281 ? 23.859  39.832 23.581 1.00 29.67 ? ? ? ? ? ? 358 GLN A CG  1 
+ATOM   2216 C CD  . GLN A 1 281 ? 23.771  38.655 22.621 1.00 31.98 ? ? ? ? ? ? 358 GLN A CD  1 
+ATOM   2217 O OE1 . GLN A 1 281 ? 22.686  38.142 22.333 1.00 31.27 ? ? ? ? ? ? 358 GLN A OE1 1 
+ATOM   2218 N NE2 . GLN A 1 281 ? 24.922  38.221 22.121 1.00 31.56 ? ? ? ? ? ? 358 GLN A NE2 1 
+ATOM   2219 N N   . PRO A 1 282 ? 22.059  42.853 20.253 1.00 31.12 ? ? ? ? ? ? 359 PRO A N   1 
+ATOM   2220 C CA  . PRO A 1 282 ? 21.267  44.004 19.808 1.00 31.81 ? ? ? ? ? ? 359 PRO A CA  1 
+ATOM   2221 C C   . PRO A 1 282 ? 20.101  44.318 20.755 1.00 32.80 ? ? ? ? ? ? 359 PRO A C   1 
+ATOM   2222 O O   . PRO A 1 282 ? 19.622  43.441 21.475 1.00 30.98 ? ? ? ? ? ? 359 PRO A O   1 
+ATOM   2223 C CB  . PRO A 1 282 ? 20.790  43.560 18.428 1.00 33.21 ? ? ? ? ? ? 359 PRO A CB  1 
+ATOM   2224 C CG  . PRO A 1 282 ? 20.592  42.086 18.643 1.00 33.82 ? ? ? ? ? ? 359 PRO A CG  1 
+ATOM   2225 C CD  . PRO A 1 282 ? 21.926  41.756 19.281 1.00 30.97 ? ? ? ? ? ? 359 PRO A CD  1 
+ATOM   2226 N N   . LEU A 1 283 ? 19.642  45.566 20.740 1.00 31.85 ? ? ? ? ? ? 360 LEU A N   1 
+ATOM   2227 C CA  . LEU A 1 283 ? 18.544  45.997 21.604 1.00 31.30 ? ? ? ? ? ? 360 LEU A CA  1 
+ATOM   2228 C C   . LEU A 1 283 ? 17.344  45.043 21.610 1.00 28.87 ? ? ? ? ? ? 360 LEU A C   1 
+ATOM   2229 O O   . LEU A 1 283 ? 16.766  44.779 22.662 1.00 30.11 ? ? ? ? ? ? 360 LEU A O   1 
+ATOM   2230 C CB  . LEU A 1 283 ? 18.091  47.405 21.209 1.00 32.24 ? ? ? ? ? ? 360 LEU A CB  1 
+ATOM   2231 C CG  . LEU A 1 283 ? 16.956  48.034 22.021 1.00 34.57 ? ? ? ? ? ? 360 LEU A CG  1 
+ATOM   2232 C CD1 . LEU A 1 283 ? 17.328  48.103 23.500 1.00 33.69 ? ? ? ? ? ? 360 LEU A CD1 1 
+ATOM   2233 C CD2 . LEU A 1 283 ? 16.676  49.427 21.476 1.00 34.87 ? ? ? ? ? ? 360 LEU A CD2 1 
+ATOM   2234 N N   . PRO A 1 284 ? 16.929  44.545 20.432 1.00 26.37 ? ? ? ? ? ? 361 PRO A N   1 
+ATOM   2235 C CA  . PRO A 1 284 ? 15.792  43.621 20.376 1.00 26.15 ? ? ? ? ? ? 361 PRO A CA  1 
+ATOM   2236 C C   . PRO A 1 284 ? 16.066  42.360 21.206 1.00 25.71 ? ? ? ? ? ? 361 PRO A C   1 
+ATOM   2237 O O   . PRO A 1 284 ? 15.153  41.778 21.804 1.00 19.80 ? ? ? ? ? ? 361 PRO A O   1 
+ATOM   2238 C CB  . PRO A 1 284 ? 15.684  43.319 18.880 1.00 26.77 ? ? ? ? ? ? 361 PRO A CB  1 
+ATOM   2239 C CG  . PRO A 1 284 ? 16.149  44.621 18.262 1.00 25.09 ? ? ? ? ? ? 361 PRO A CG  1 
+ATOM   2240 C CD  . PRO A 1 284 ? 17.418  44.809 19.070 1.00 28.73 ? ? ? ? ? ? 361 PRO A CD  1 
+ATOM   2241 N N   . LYS A 1 285 ? 17.329  41.943 21.234 1.00 23.81 ? ? ? ? ? ? 362 LYS A N   1 
+ATOM   2242 C CA  . LYS A 1 285 ? 17.704  40.758 21.993 1.00 26.32 ? ? ? ? ? ? 362 LYS A CA  1 
+ATOM   2243 C C   . LYS A 1 285 ? 17.665  41.076 23.475 1.00 23.24 ? ? ? ? ? ? 362 LYS A C   1 
+ATOM   2244 O O   . LYS A 1 285 ? 17.257  40.244 24.277 1.00 24.59 ? ? ? ? ? ? 362 LYS A O   1 
+ATOM   2245 C CB  . LYS A 1 285 ? 19.104  40.277 21.619 1.00 28.79 ? ? ? ? ? ? 362 LYS A CB  1 
+ATOM   2246 C CG  . LYS A 1 285 ? 19.150  38.810 21.220 1.00 36.45 ? ? ? ? ? ? 362 LYS A CG  1 
+ATOM   2247 C CD  . LYS A 1 285 ? 18.507  37.908 22.259 1.00 36.15 ? ? ? ? ? ? 362 LYS A CD  1 
+ATOM   2248 C CE  . LYS A 1 285 ? 18.428  36.480 21.746 1.00 42.18 ? ? ? ? ? ? 362 LYS A CE  1 
+ATOM   2249 N NZ  . LYS A 1 285 ? 17.665  35.586 22.654 1.00 40.93 ? ? ? ? ? ? 362 LYS A NZ  1 
+ATOM   2250 N N   . LEU A 1 286 ? 18.101  42.277 23.841 1.00 19.76 ? ? ? ? ? ? 363 LEU A N   1 
+ATOM   2251 C CA  . LEU A 1 286 ? 18.082  42.680 25.243 1.00 19.85 ? ? ? ? ? ? 363 LEU A CA  1 
+ATOM   2252 C C   . LEU A 1 286 ? 16.631  42.748 25.720 1.00 20.85 ? ? ? ? ? ? 363 LEU A C   1 
+ATOM   2253 O O   . LEU A 1 286 ? 16.320  42.416 26.862 1.00 20.47 ? ? ? ? ? ? 363 LEU A O   1 
+ATOM   2254 C CB  . LEU A 1 286 ? 18.752  44.043 25.415 1.00 20.58 ? ? ? ? ? ? 363 LEU A CB  1 
+ATOM   2255 C CG  . LEU A 1 286 ? 20.228  44.145 25.014 1.00 21.75 ? ? ? ? ? ? 363 LEU A CG  1 
+ATOM   2256 C CD1 . LEU A 1 286 ? 20.690  45.584 25.188 1.00 22.46 ? ? ? ? ? ? 363 LEU A CD1 1 
+ATOM   2257 C CD2 . LEU A 1 286 ? 21.071  43.203 25.852 1.00 16.66 ? ? ? ? ? ? 363 LEU A CD2 1 
+ATOM   2258 N N   . ILE A 1 287 ? 15.741  43.186 24.836 1.00 19.92 ? ? ? ? ? ? 364 ILE A N   1 
+ATOM   2259 C CA  . ILE A 1 287 ? 14.333  43.264 25.175 1.00 21.25 ? ? ? ? ? ? 364 ILE A CA  1 
+ATOM   2260 C C   . ILE A 1 287 ? 13.800  41.848 25.366 1.00 20.67 ? ? ? ? ? ? 364 ILE A C   1 
+ATOM   2261 O O   . ILE A 1 287 ? 12.989  41.609 26.257 1.00 19.87 ? ? ? ? ? ? 364 ILE A O   1 
+ATOM   2262 C CB  . ILE A 1 287 ? 13.513  43.962 24.061 1.00 24.30 ? ? ? ? ? ? 364 ILE A CB  1 
+ATOM   2263 C CG1 . ILE A 1 287 ? 13.983  45.411 23.891 1.00 24.42 ? ? ? ? ? ? 364 ILE A CG1 1 
+ATOM   2264 C CG2 . ILE A 1 287 ? 12.036  43.913 24.395 1.00 21.93 ? ? ? ? ? ? 364 ILE A CG2 1 
+ATOM   2265 C CD1 . ILE A 1 287 ? 13.853  46.247 25.130 1.00 25.22 ? ? ? ? ? ? 364 ILE A CD1 1 
+ATOM   2266 N N   . ASP A 1 288 ? 14.252  40.907 24.535 1.00 18.64 ? ? ? ? ? ? 365 ASP A N   1 
+ATOM   2267 C CA  . ASP A 1 288 ? 13.774  39.538 24.672 1.00 16.40 ? ? ? ? ? ? 365 ASP A CA  1 
+ATOM   2268 C C   . ASP A 1 288 ? 14.245  38.955 26.000 1.00 16.52 ? ? ? ? ? ? 365 ASP A C   1 
+ATOM   2269 O O   . ASP A 1 288 ? 13.514  38.194 26.637 1.00 13.93 ? ? ? ? ? ? 365 ASP A O   1 
+ATOM   2270 C CB  . ASP A 1 288 ? 14.238  38.646 23.523 1.00 17.71 ? ? ? ? ? ? 365 ASP A CB  1 
+ATOM   2271 C CG  . ASP A 1 288 ? 13.586  37.276 23.573 1.00 18.82 ? ? ? ? ? ? 365 ASP A CG  1 
+ATOM   2272 O OD1 . ASP A 1 288 ? 12.342  37.215 23.542 1.00 20.31 ? ? ? ? ? ? 365 ASP A OD1 1 
+ATOM   2273 O OD2 . ASP A 1 288 ? 14.302  36.263 23.662 1.00 22.60 ? ? ? ? ? ? 365 ASP A OD2 1 
+ATOM   2274 N N   . PHE A 1 289 ? 15.463  39.300 26.414 1.00 15.95 ? ? ? ? ? ? 366 PHE A N   1 
+ATOM   2275 C CA  . PHE A 1 289 ? 15.963  38.835 27.706 1.00 18.95 ? ? ? ? ? ? 366 PHE A CA  1 
+ATOM   2276 C C   . PHE A 1 289 ? 15.025  39.382 28.790 1.00 17.56 ? ? ? ? ? ? 366 PHE A C   1 
+ATOM   2277 O O   . PHE A 1 289 ? 14.646  38.675 29.725 1.00 17.73 ? ? ? ? ? ? 366 PHE A O   1 
+ATOM   2278 C CB  . PHE A 1 289 ? 17.382  39.348 27.991 1.00 16.89 ? ? ? ? ? ? 366 PHE A CB  1 
+ATOM   2279 C CG  . PHE A 1 289 ? 18.453  38.751 27.114 1.00 18.95 ? ? ? ? ? ? 366 PHE A CG  1 
+ATOM   2280 C CD1 . PHE A 1 289 ? 18.434  37.405 26.780 1.00 20.19 ? ? ? ? ? ? 366 PHE A CD1 1 
+ATOM   2281 C CD2 . PHE A 1 289 ? 19.535  39.524 26.696 1.00 19.58 ? ? ? ? ? ? 366 PHE A CD2 1 
+ATOM   2282 C CE1 . PHE A 1 289 ? 19.481  36.832 26.043 1.00 24.03 ? ? ? ? ? ? 366 PHE A CE1 1 
+ATOM   2283 C CE2 . PHE A 1 289 ? 20.589  38.958 25.960 1.00 22.29 ? ? ? ? ? ? 366 PHE A CE2 1 
+ATOM   2284 C CZ  . PHE A 1 289 ? 20.559  37.611 25.635 1.00 23.27 ? ? ? ? ? ? 366 PHE A CZ  1 
+ATOM   2285 N N   . SER A 1 290 ? 14.658  40.653 28.663 1.00 18.26 ? ? ? ? ? ? 367 SER A N   1 
+ATOM   2286 C CA  . SER A 1 290 ? 13.759  41.282 29.629 1.00 17.05 ? ? ? ? ? ? 367 SER A CA  1 
+ATOM   2287 C C   . SER A 1 290 ? 12.401  40.590 29.657 1.00 15.36 ? ? ? ? ? ? 367 SER A C   1 
+ATOM   2288 O O   . SER A 1 290 ? 11.797  40.426 30.721 1.00 16.67 ? ? ? ? ? ? 367 SER A O   1 
+ATOM   2289 C CB  . SER A 1 290 ? 13.568  42.760 29.285 1.00 20.54 ? ? ? ? ? ? 367 SER A CB  1 
+ATOM   2290 O OG  . SER A 1 290 ? 14.791  43.455 29.410 1.00 22.25 ? ? ? ? ? ? 367 SER A OG  1 
+ATOM   2291 N N   . ALA A 1 291 ? 11.919  40.189 28.484 1.00 14.82 ? ? ? ? ? ? 368 ALA A N   1 
+ATOM   2292 C CA  . ALA A 1 291 ? 10.627  39.511 28.372 1.00 13.78 ? ? ? ? ? ? 368 ALA A CA  1 
+ATOM   2293 C C   . ALA A 1 291 ? 10.685  38.130 29.025 1.00 16.62 ? ? ? ? ? ? 368 ALA A C   1 
+ATOM   2294 O O   . ALA A 1 291 ? 9.718   37.675 29.648 1.00 14.75 ? ? ? ? ? ? 368 ALA A O   1 
+ATOM   2295 C CB  . ALA A 1 291 ? 10.223  39.379 26.893 1.00 15.33 ? ? ? ? ? ? 368 ALA A CB  1 
+ATOM   2296 N N   . GLN A 1 292 ? 11.817  37.451 28.870 1.00 16.05 ? ? ? ? ? ? 369 GLN A N   1 
+ATOM   2297 C CA  . GLN A 1 292 ? 11.978  36.130 29.478 1.00 15.17 ? ? ? ? ? ? 369 GLN A CA  1 
+ATOM   2298 C C   . GLN A 1 292 ? 11.916  36.224 30.997 1.00 15.20 ? ? ? ? ? ? 369 GLN A C   1 
+ATOM   2299 O O   . GLN A 1 292 ? 11.254  35.420 31.664 1.00 16.41 ? ? ? ? ? ? 369 GLN A O   1 
+ATOM   2300 C CB  . GLN A 1 292 ? 13.317  35.520 29.078 1.00 15.07 ? ? ? ? ? ? 369 GLN A CB  1 
+ATOM   2301 C CG  . GLN A 1 292 ? 13.385  35.023 27.658 1.00 17.98 ? ? ? ? ? ? 369 GLN A CG  1 
+ATOM   2302 C CD  . GLN A 1 292 ? 14.743  34.446 27.344 1.00 19.59 ? ? ? ? ? ? 369 GLN A CD  1 
+ATOM   2303 O OE1 . GLN A 1 292 ? 15.293  33.656 28.119 1.00 20.13 ? ? ? ? ? ? 369 GLN A OE1 1 
+ATOM   2304 N NE2 . GLN A 1 292 ? 15.291  34.821 26.200 1.00 18.20 ? ? ? ? ? ? 369 GLN A NE2 1 
+ATOM   2305 N N   . ILE A 1 293 ? 12.616  37.212 31.541 1.00 13.79 ? ? ? ? ? ? 370 ILE A N   1 
+ATOM   2306 C CA  . ILE A 1 293 ? 12.655  37.405 32.983 1.00 14.39 ? ? ? ? ? ? 370 ILE A CA  1 
+ATOM   2307 C C   . ILE A 1 293 ? 11.261  37.784 33.488 1.00 13.69 ? ? ? ? ? ? 370 ILE A C   1 
+ATOM   2308 O O   . ILE A 1 293 ? 10.794  37.277 34.511 1.00 16.05 ? ? ? ? ? ? 370 ILE A O   1 
+ATOM   2309 C CB  . ILE A 1 293 ? 13.687  38.497 33.335 1.00 11.90 ? ? ? ? ? ? 370 ILE A CB  1 
+ATOM   2310 C CG1 . ILE A 1 293 ? 15.078  38.044 32.851 1.00 13.41 ? ? ? ? ? ? 370 ILE A CG1 1 
+ATOM   2311 C CG2 . ILE A 1 293 ? 13.661  38.778 34.846 1.00 11.91 ? ? ? ? ? ? 370 ILE A CG2 1 
+ATOM   2312 C CD1 . ILE A 1 293 ? 16.179  39.093 32.952 1.00 12.55 ? ? ? ? ? ? 370 ILE A CD1 1 
+ATOM   2313 N N   . ALA A 1 294 ? 10.595  38.671 32.756 1.00 13.16 ? ? ? ? ? ? 371 ALA A N   1 
+ATOM   2314 C CA  . ALA A 1 294 ? 9.252   39.105 33.121 1.00 13.95 ? ? ? ? ? ? 371 ALA A CA  1 
+ATOM   2315 C C   . ALA A 1 294 ? 8.342   37.888 33.125 1.00 16.39 ? ? ? ? ? ? 371 ALA A C   1 
+ATOM   2316 O O   . ALA A 1 294 ? 7.434   37.778 33.952 1.00 16.80 ? ? ? ? ? ? 371 ALA A O   1 
+ATOM   2317 C CB  . ALA A 1 294 ? 8.736   40.152 32.117 1.00 15.39 ? ? ? ? ? ? 371 ALA A CB  1 
+ATOM   2318 N N   . GLU A 1 295 ? 8.600   36.969 32.200 1.00 16.29 ? ? ? ? ? ? 372 GLU A N   1 
+ATOM   2319 C CA  . GLU A 1 295 ? 7.809   35.750 32.093 1.00 16.17 ? ? ? ? ? ? 372 GLU A CA  1 
+ATOM   2320 C C   . GLU A 1 295 ? 8.023   34.904 33.346 1.00 16.52 ? ? ? ? ? ? 372 GLU A C   1 
+ATOM   2321 O O   . GLU A 1 295 ? 7.077   34.343 33.912 1.00 14.28 ? ? ? ? ? ? 372 GLU A O   1 
+ATOM   2322 C CB  . GLU A 1 295 ? 8.242   34.952 30.864 1.00 14.52 ? ? ? ? ? ? 372 GLU A CB  1 
+ATOM   2323 C CG  . GLU A 1 295 ? 7.388   33.743 30.592 1.00 18.99 ? ? ? ? ? ? 372 GLU A CG  1 
+ATOM   2324 C CD  . GLU A 1 295 ? 7.962   32.876 29.493 1.00 25.72 ? ? ? ? ? ? 372 GLU A CD  1 
+ATOM   2325 O OE1 . GLU A 1 295 ? 8.592   33.431 28.563 1.00 29.13 ? ? ? ? ? ? 372 GLU A OE1 1 
+ATOM   2326 O OE2 . GLU A 1 295 ? 7.759   31.648 29.548 1.00 23.99 ? ? ? ? ? ? 372 GLU A OE2 1 
+ATOM   2327 N N   . GLY A 1 296 ? 9.282   34.808 33.762 1.00 13.85 ? ? ? ? ? ? 373 GLY A N   1 
+ATOM   2328 C CA  . GLY A 1 296 ? 9.610   34.056 34.959 1.00 13.42 ? ? ? ? ? ? 373 GLY A CA  1 
+ATOM   2329 C C   . GLY A 1 296 ? 8.966   34.722 36.162 1.00 13.50 ? ? ? ? ? ? 373 GLY A C   1 
+ATOM   2330 O O   . GLY A 1 296 ? 8.442   34.041 37.040 1.00 14.72 ? ? ? ? ? ? 373 GLY A O   1 
+ATOM   2331 N N   . MET A 1 297 ? 9.004   36.053 36.211 1.00 13.49 ? ? ? ? ? ? 374 MET A N   1 
+ATOM   2332 C CA  . MET A 1 297 ? 8.397   36.769 37.333 1.00 13.38 ? ? ? ? ? ? 374 MET A CA  1 
+ATOM   2333 C C   . MET A 1 297 ? 6.872   36.678 37.319 1.00 12.31 ? ? ? ? ? ? 374 MET A C   1 
+ATOM   2334 O O   . MET A 1 297 ? 6.238   36.701 38.375 1.00 12.70 ? ? ? ? ? ? 374 MET A O   1 
+ATOM   2335 C CB  . MET A 1 297 ? 8.849   38.239 37.362 1.00 12.80 ? ? ? ? ? ? 374 MET A CB  1 
+ATOM   2336 C CG  . MET A 1 297 ? 10.338  38.439 37.711 1.00 12.11 ? ? ? ? ? ? 374 MET A CG  1 
+ATOM   2337 S SD  . MET A 1 297 ? 10.789  37.654 39.278 1.00 14.35 ? ? ? ? ? ? 374 MET A SD  1 
+ATOM   2338 C CE  . MET A 1 297 ? 9.528   38.434 40.393 1.00 9.47  ? ? ? ? ? ? 374 MET A CE  1 
+ATOM   2339 N N   . ALA A 1 298 ? 6.273   36.577 36.135 1.00 12.63 ? ? ? ? ? ? 375 ALA A N   1 
+ATOM   2340 C CA  . ALA A 1 298 ? 4.819   36.435 36.061 1.00 11.25 ? ? ? ? ? ? 375 ALA A CA  1 
+ATOM   2341 C C   . ALA A 1 298 ? 4.442   35.078 36.662 1.00 10.57 ? ? ? ? ? ? 375 ALA A C   1 
+ATOM   2342 O O   . ALA A 1 298 ? 3.392   34.933 37.286 1.00 13.22 ? ? ? ? ? ? 375 ALA A O   1 
+ATOM   2343 C CB  . ALA A 1 298 ? 4.341   36.528 34.609 1.00 11.31 ? ? ? ? ? ? 375 ALA A CB  1 
+ATOM   2344 N N   . PHE A 1 299 ? 5.299   34.080 36.468 1.00 10.92 ? ? ? ? ? ? 376 PHE A N   1 
+ATOM   2345 C CA  . PHE A 1 299 ? 5.060   32.747 37.036 1.00 11.52 ? ? ? ? ? ? 376 PHE A CA  1 
+ATOM   2346 C C   . PHE A 1 299 ? 5.121   32.853 38.572 1.00 14.01 ? ? ? ? ? ? 376 PHE A C   1 
+ATOM   2347 O O   . PHE A 1 299 ? 4.273   32.316 39.284 1.00 13.29 ? ? ? ? ? ? 376 PHE A O   1 
+ATOM   2348 C CB  . PHE A 1 299 ? 6.134   31.765 36.543 1.00 16.20 ? ? ? ? ? ? 376 PHE A CB  1 
+ATOM   2349 C CG  . PHE A 1 299 ? 6.113   30.431 37.240 1.00 14.99 ? ? ? ? ? ? 376 PHE A CG  1 
+ATOM   2350 C CD1 . PHE A 1 299 ? 5.070   29.534 37.038 1.00 14.80 ? ? ? ? ? ? 376 PHE A CD1 1 
+ATOM   2351 C CD2 . PHE A 1 299 ? 7.138   30.080 38.117 1.00 13.65 ? ? ? ? ? ? 376 PHE A CD2 1 
+ATOM   2352 C CE1 . PHE A 1 299 ? 5.042   28.297 37.700 1.00 14.65 ? ? ? ? ? ? 376 PHE A CE1 1 
+ATOM   2353 C CE2 . PHE A 1 299 ? 7.122   28.850 38.783 1.00 13.50 ? ? ? ? ? ? 376 PHE A CE2 1 
+ATOM   2354 C CZ  . PHE A 1 299 ? 6.074   27.958 38.574 1.00 15.54 ? ? ? ? ? ? 376 PHE A CZ  1 
+ATOM   2355 N N   . ILE A 1 300 ? 6.140   33.544 39.075 1.00 14.26 ? ? ? ? ? ? 377 ILE A N   1 
+ATOM   2356 C CA  . ILE A 1 300 ? 6.311   33.738 40.519 1.00 13.38 ? ? ? ? ? ? 377 ILE A CA  1 
+ATOM   2357 C C   . ILE A 1 300 ? 5.096   34.493 41.075 1.00 12.93 ? ? ? ? ? ? 377 ILE A C   1 
+ATOM   2358 O O   . ILE A 1 300 ? 4.583   34.178 42.154 1.00 13.57 ? ? ? ? ? ? 377 ILE A O   1 
+ATOM   2359 C CB  . ILE A 1 300 ? 7.635   34.505 40.795 1.00 12.29 ? ? ? ? ? ? 377 ILE A CB  1 
+ATOM   2360 C CG1 . ILE A 1 300 ? 8.815   33.576 40.462 1.00 12.23 ? ? ? ? ? ? 377 ILE A CG1 1 
+ATOM   2361 C CG2 . ILE A 1 300 ? 7.691   35.006 42.250 1.00 15.11 ? ? ? ? ? ? 377 ILE A CG2 1 
+ATOM   2362 C CD1 . ILE A 1 300 ? 10.191  34.211 40.577 1.00 9.13  ? ? ? ? ? ? 377 ILE A CD1 1 
+ATOM   2363 N N   . GLU A 1 301 ? 4.636   35.478 40.312 1.00 14.62 ? ? ? ? ? ? 378 GLU A N   1 
+ATOM   2364 C CA  . GLU A 1 301 ? 3.466   36.271 40.672 1.00 16.13 ? ? ? ? ? ? 378 GLU A CA  1 
+ATOM   2365 C C   . GLU A 1 301 ? 2.245   35.341 40.790 1.00 16.19 ? ? ? ? ? ? 378 GLU A C   1 
+ATOM   2366 O O   . GLU A 1 301 ? 1.488   35.403 41.767 1.00 14.64 ? ? ? ? ? ? 378 GLU A O   1 
+ATOM   2367 C CB  . GLU A 1 301 ? 3.237   37.332 39.586 1.00 15.81 ? ? ? ? ? ? 378 GLU A CB  1 
+ATOM   2368 C CG  . GLU A 1 301 ? 2.102   38.309 39.855 1.00 15.77 ? ? ? ? ? ? 378 GLU A CG  1 
+ATOM   2369 C CD  . GLU A 1 301 ? 2.001   39.372 38.783 1.00 15.89 ? ? ? ? ? ? 378 GLU A CD  1 
+ATOM   2370 O OE1 . GLU A 1 301 ? 1.483   39.081 37.678 1.00 13.44 ? ? ? ? ? ? 378 GLU A OE1 1 
+ATOM   2371 O OE2 . GLU A 1 301 ? 2.469   40.499 39.041 1.00 16.56 ? ? ? ? ? ? 378 GLU A OE2 1 
+ATOM   2372 N N   . GLN A 1 302 ? 2.058   34.473 39.797 1.00 14.95 ? ? ? ? ? ? 379 GLN A N   1 
+ATOM   2373 C CA  . GLN A 1 302 ? 0.931   33.538 39.807 1.00 16.33 ? ? ? ? ? ? 379 GLN A CA  1 
+ATOM   2374 C C   . GLN A 1 302 ? 0.954   32.564 40.965 1.00 17.32 ? ? ? ? ? ? 379 GLN A C   1 
+ATOM   2375 O O   . GLN A 1 302 ? -0.101  32.180 41.473 1.00 15.68 ? ? ? ? ? ? 379 GLN A O   1 
+ATOM   2376 C CB  . GLN A 1 302 ? 0.855   32.733 38.501 1.00 19.31 ? ? ? ? ? ? 379 GLN A CB  1 
+ATOM   2377 C CG  . GLN A 1 302 ? 0.359   33.552 37.345 1.00 27.32 ? ? ? ? ? ? 379 GLN A CG  1 
+ATOM   2378 C CD  . GLN A 1 302 ? -1.024  34.133 37.607 1.00 34.26 ? ? ? ? ? ? 379 GLN A CD  1 
+ATOM   2379 O OE1 . GLN A 1 302 ? -1.336  35.241 37.161 1.00 37.20 ? ? ? ? ? ? 379 GLN A OE1 1 
+ATOM   2380 N NE2 . GLN A 1 302 ? -1.865  33.380 38.316 1.00 30.52 ? ? ? ? ? ? 379 GLN A NE2 1 
+ATOM   2381 N N   . ARG A 1 303 ? 2.151   32.158 41.376 1.00 14.97 ? ? ? ? ? ? 380 ARG A N   1 
+ATOM   2382 C CA  . ARG A 1 303 ? 2.301   31.210 42.474 1.00 15.36 ? ? ? ? ? ? 380 ARG A CA  1 
+ATOM   2383 C C   . ARG A 1 303 ? 2.355   31.878 43.853 1.00 13.62 ? ? ? ? ? ? 380 ARG A C   1 
+ATOM   2384 O O   . ARG A 1 303 ? 2.548   31.209 44.862 1.00 14.41 ? ? ? ? ? ? 380 ARG A O   1 
+ATOM   2385 C CB  . ARG A 1 303 ? 3.555   30.348 42.245 1.00 19.87 ? ? ? ? ? ? 380 ARG A CB  1 
+ATOM   2386 C CG  . ARG A 1 303 ? 3.486   29.450 40.980 1.00 21.47 ? ? ? ? ? ? 380 ARG A CG  1 
+ATOM   2387 C CD  . ARG A 1 303 ? 2.501   28.291 41.167 1.00 20.19 ? ? ? ? ? ? 380 ARG A CD  1 
+ATOM   2388 N NE  . ARG A 1 303 ? 3.010   27.405 42.205 1.00 23.74 ? ? ? ? ? ? 380 ARG A NE  1 
+ATOM   2389 C CZ  . ARG A 1 303 ? 3.924   26.462 41.998 1.00 24.65 ? ? ? ? ? ? 380 ARG A CZ  1 
+ATOM   2390 N NH1 . ARG A 1 303 ? 4.427   26.264 40.786 1.00 20.41 ? ? ? ? ? ? 380 ARG A NH1 1 
+ATOM   2391 N NH2 . ARG A 1 303 ? 4.395   25.764 43.019 1.00 29.65 ? ? ? ? ? ? 380 ARG A NH2 1 
+ATOM   2392 N N   . ASN A 1 304 ? 2.156   33.191 43.899 1.00 12.05 ? ? ? ? ? ? 381 ASN A N   1 
+ATOM   2393 C CA  . ASN A 1 304 ? 2.196   33.939 45.165 1.00 17.55 ? ? ? ? ? ? 381 ASN A CA  1 
+ATOM   2394 C C   . ASN A 1 304 ? 3.528   33.783 45.897 1.00 15.93 ? ? ? ? ? ? 381 ASN A C   1 
+ATOM   2395 O O   . ASN A 1 304 ? 3.555   33.434 47.080 1.00 16.13 ? ? ? ? ? ? 381 ASN A O   1 
+ATOM   2396 C CB  . ASN A 1 304 ? 1.056   33.509 46.112 1.00 14.64 ? ? ? ? ? ? 381 ASN A CB  1 
+ATOM   2397 C CG  . ASN A 1 304 ? 0.953   34.386 47.384 1.00 19.79 ? ? ? ? ? ? 381 ASN A CG  1 
+ATOM   2398 O OD1 . ASN A 1 304 ? 0.258   34.022 48.339 1.00 19.13 ? ? ? ? ? ? 381 ASN A OD1 1 
+ATOM   2399 N ND2 . ASN A 1 304 ? 1.624   35.538 47.388 1.00 15.35 ? ? ? ? ? ? 381 ASN A ND2 1 
+ATOM   2400 N N   . TYR A 1 305 ? 4.635   33.992 45.192 1.00 16.03 ? ? ? ? ? ? 382 TYR A N   1 
+ATOM   2401 C CA  . TYR A 1 305 ? 5.935   33.954 45.853 1.00 12.73 ? ? ? ? ? ? 382 TYR A CA  1 
+ATOM   2402 C C   . TYR A 1 305 ? 6.541   35.328 45.595 1.00 11.71 ? ? ? ? ? ? 382 TYR A C   1 
+ATOM   2403 O O   . TYR A 1 305 ? 5.923   36.170 44.937 1.00 11.61 ? ? ? ? ? ? 382 TYR A O   1 
+ATOM   2404 C CB  . TYR A 1 305 ? 6.845   32.835 45.310 1.00 11.84 ? ? ? ? ? ? 382 TYR A CB  1 
+ATOM   2405 C CG  . TYR A 1 305 ? 7.960   32.467 46.282 1.00 14.16 ? ? ? ? ? ? 382 TYR A CG  1 
+ATOM   2406 C CD1 . TYR A 1 305 ? 7.661   32.077 47.595 1.00 14.96 ? ? ? ? ? ? 382 TYR A CD1 1 
+ATOM   2407 C CD2 . TYR A 1 305 ? 9.301   32.492 45.894 1.00 12.80 ? ? ? ? ? ? 382 TYR A CD2 1 
+ATOM   2408 C CE1 . TYR A 1 305 ? 8.673   31.718 48.497 1.00 14.14 ? ? ? ? ? ? 382 TYR A CE1 1 
+ATOM   2409 C CE2 . TYR A 1 305 ? 10.321  32.133 46.790 1.00 13.96 ? ? ? ? ? ? 382 TYR A CE2 1 
+ATOM   2410 C CZ  . TYR A 1 305 ? 9.996   31.745 48.086 1.00 14.40 ? ? ? ? ? ? 382 TYR A CZ  1 
+ATOM   2411 O OH  . TYR A 1 305 ? 10.988  31.367 48.968 1.00 16.69 ? ? ? ? ? ? 382 TYR A OH  1 
+ATOM   2412 N N   . ILE A 1 306 ? 7.732   35.574 46.126 1.00 10.35 ? ? ? ? ? ? 383 ILE A N   1 
+ATOM   2413 C CA  . ILE A 1 306 ? 8.377   36.867 45.952 1.00 9.38  ? ? ? ? ? ? 383 ILE A CA  1 
+ATOM   2414 C C   . ILE A 1 306 ? 9.864   36.604 45.791 1.00 10.29 ? ? ? ? ? ? 383 ILE A C   1 
+ATOM   2415 O O   . ILE A 1 306 ? 10.428  35.784 46.511 1.00 10.25 ? ? ? ? ? ? 383 ILE A O   1 
+ATOM   2416 C CB  . ILE A 1 306 ? 8.176   37.755 47.205 1.00 11.81 ? ? ? ? ? ? 383 ILE A CB  1 
+ATOM   2417 C CG1 . ILE A 1 306 ? 6.685   37.893 47.512 1.00 8.97  ? ? ? ? ? ? 383 ILE A CG1 1 
+ATOM   2418 C CG2 . ILE A 1 306 ? 8.786   39.140 46.978 1.00 12.52 ? ? ? ? ? ? 383 ILE A CG2 1 
+ATOM   2419 C CD1 . ILE A 1 306 ? 6.393   38.601 48.809 1.00 7.93  ? ? ? ? ? ? 383 ILE A CD1 1 
+ATOM   2420 N N   . HIS A 1 307 ? 10.504  37.288 44.854 1.00 10.25 ? ? ? ? ? ? 384 HIS A N   1 
+ATOM   2421 C CA  . HIS A 1 307 ? 11.937  37.082 44.667 1.00 13.95 ? ? ? ? ? ? 384 HIS A CA  1 
+ATOM   2422 C C   . HIS A 1 307 ? 12.730  37.683 45.830 1.00 13.59 ? ? ? ? ? ? 384 HIS A C   1 
+ATOM   2423 O O   . HIS A 1 307 ? 13.514  36.990 46.472 1.00 16.31 ? ? ? ? ? ? 384 HIS A O   1 
+ATOM   2424 C CB  . HIS A 1 307 ? 12.417  37.691 43.354 1.00 12.11 ? ? ? ? ? ? 384 HIS A CB  1 
+ATOM   2425 C CG  . HIS A 1 307 ? 13.816  37.294 43.010 1.00 9.86  ? ? ? ? ? ? 384 HIS A CG  1 
+ATOM   2426 N ND1 . HIS A 1 307 ? 14.895  37.640 43.792 1.00 13.78 ? ? ? ? ? ? 384 HIS A ND1 1 
+ATOM   2427 C CD2 . HIS A 1 307 ? 14.294  36.460 42.058 1.00 10.47 ? ? ? ? ? ? 384 HIS A CD2 1 
+ATOM   2428 C CE1 . HIS A 1 307 ? 15.978  37.031 43.343 1.00 12.35 ? ? ? ? ? ? 384 HIS A CE1 1 
+ATOM   2429 N NE2 . HIS A 1 307 ? 15.640  36.308 42.290 1.00 14.64 ? ? ? ? ? ? 384 HIS A NE2 1 
+ATOM   2430 N N   . ARG A 1 308 ? 12.515  38.975 46.076 1.00 12.61 ? ? ? ? ? ? 385 ARG A N   1 
+ATOM   2431 C CA  . ARG A 1 308 ? 13.147  39.728 47.162 1.00 11.92 ? ? ? ? ? ? 385 ARG A CA  1 
+ATOM   2432 C C   . ARG A 1 308 ? 14.540  40.277 46.874 1.00 14.06 ? ? ? ? ? ? 385 ARG A C   1 
+ATOM   2433 O O   . ARG A 1 308 ? 15.013  41.153 47.596 1.00 15.13 ? ? ? ? ? ? 385 ARG A O   1 
+ATOM   2434 C CB  . ARG A 1 308 ? 13.150  38.905 48.464 1.00 14.89 ? ? ? ? ? ? 385 ARG A CB  1 
+ATOM   2435 C CG  . ARG A 1 308 ? 11.734  38.620 49.007 1.00 13.17 ? ? ? ? ? ? 385 ARG A CG  1 
+ATOM   2436 C CD  . ARG A 1 308 ? 11.724  37.752 50.275 1.00 16.96 ? ? ? ? ? ? 385 ARG A CD  1 
+ATOM   2437 N NE  . ARG A 1 308 ? 10.360  37.377 50.664 1.00 16.67 ? ? ? ? ? ? 385 ARG A NE  1 
+ATOM   2438 C CZ  . ARG A 1 308 ? 9.683   37.899 51.684 1.00 17.13 ? ? ? ? ? ? 385 ARG A CZ  1 
+ATOM   2439 N NH1 . ARG A 1 308 ? 10.231  38.838 52.447 1.00 17.17 ? ? ? ? ? ? 385 ARG A NH1 1 
+ATOM   2440 N NH2 . ARG A 1 308 ? 8.458   37.465 51.956 1.00 16.35 ? ? ? ? ? ? 385 ARG A NH2 1 
+ATOM   2441 N N   . ASP A 1 309 ? 15.190  39.789 45.822 1.00 12.88 ? ? ? ? ? ? 386 ASP A N   1 
+ATOM   2442 C CA  . ASP A 1 309 ? 16.516  40.300 45.464 1.00 16.02 ? ? ? ? ? ? 386 ASP A CA  1 
+ATOM   2443 C C   . ASP A 1 309 ? 16.716  40.186 43.959 1.00 16.99 ? ? ? ? ? ? 386 ASP A C   1 
+ATOM   2444 O O   . ASP A 1 309 ? 17.702  39.625 43.477 1.00 17.13 ? ? ? ? ? ? 386 ASP A O   1 
+ATOM   2445 C CB  . ASP A 1 309 ? 17.603  39.541 46.247 1.00 17.00 ? ? ? ? ? ? 386 ASP A CB  1 
+ATOM   2446 C CG  . ASP A 1 309 ? 18.997  40.131 46.055 1.00 19.96 ? ? ? ? ? ? 386 ASP A CG  1 
+ATOM   2447 O OD1 . ASP A 1 309 ? 19.114  41.365 45.879 1.00 21.44 ? ? ? ? ? ? 386 ASP A OD1 1 
+ATOM   2448 O OD2 . ASP A 1 309 ? 19.979  39.358 46.116 1.00 20.68 ? ? ? ? ? ? 386 ASP A OD2 1 
+ATOM   2449 N N   . LEU A 1 310 ? 15.760  40.735 43.215 1.00 16.57 ? ? ? ? ? ? 387 LEU A N   1 
+ATOM   2450 C CA  . LEU A 1 310 ? 15.816  40.685 41.766 1.00 15.50 ? ? ? ? ? ? 387 LEU A CA  1 
+ATOM   2451 C C   . LEU A 1 310 ? 16.802  41.710 41.213 1.00 15.14 ? ? ? ? ? ? 387 LEU A C   1 
+ATOM   2452 O O   . LEU A 1 310 ? 16.697  42.893 41.495 1.00 17.19 ? ? ? ? ? ? 387 LEU A O   1 
+ATOM   2453 C CB  . LEU A 1 310 ? 14.418  40.926 41.183 1.00 16.94 ? ? ? ? ? ? 387 LEU A CB  1 
+ATOM   2454 C CG  . LEU A 1 310 ? 14.247  40.766 39.669 1.00 18.98 ? ? ? ? ? ? 387 LEU A CG  1 
+ATOM   2455 C CD1 . LEU A 1 310 ? 14.575  39.332 39.267 1.00 14.63 ? ? ? ? ? ? 387 LEU A CD1 1 
+ATOM   2456 C CD2 . LEU A 1 310 ? 12.794  41.112 39.282 1.00 16.73 ? ? ? ? ? ? 387 LEU A CD2 1 
+ATOM   2457 N N   . ARG A 1 311 ? 17.768  41.235 40.439 1.00 14.79 ? ? ? ? ? ? 388 ARG A N   1 
+ATOM   2458 C CA  . ARG A 1 311 ? 18.786  42.082 39.826 1.00 16.03 ? ? ? ? ? ? 388 ARG A CA  1 
+ATOM   2459 C C   . ARG A 1 311 ? 19.565  41.216 38.833 1.00 17.06 ? ? ? ? ? ? 388 ARG A C   1 
+ATOM   2460 O O   . ARG A 1 311 ? 19.514  39.978 38.911 1.00 11.95 ? ? ? ? ? ? 388 ARG A O   1 
+ATOM   2461 C CB  . ARG A 1 311 ? 19.698  42.734 40.907 1.00 16.39 ? ? ? ? ? ? 388 ARG A CB  1 
+ATOM   2462 C CG  . ARG A 1 311 ? 20.347  41.804 41.941 1.00 21.57 ? ? ? ? ? ? 388 ARG A CG  1 
+ATOM   2463 C CD  . ARG A 1 311 ? 21.095  42.592 43.067 1.00 16.56 ? ? ? ? ? ? 388 ARG A CD  1 
+ATOM   2464 N NE  . ARG A 1 311 ? 21.437  41.719 44.197 1.00 21.69 ? ? ? ? ? ? 388 ARG A NE  1 
+ATOM   2465 C CZ  . ARG A 1 311 ? 22.551  40.995 44.303 1.00 22.73 ? ? ? ? ? ? 388 ARG A CZ  1 
+ATOM   2466 N NH1 . ARG A 1 311 ? 23.471  41.030 43.349 1.00 24.89 ? ? ? ? ? ? 388 ARG A NH1 1 
+ATOM   2467 N NH2 . ARG A 1 311 ? 22.714  40.177 45.336 1.00 19.39 ? ? ? ? ? ? 388 ARG A NH2 1 
+ATOM   2468 N N   . ALA A 1 312 ? 20.265  41.854 37.892 1.00 15.85 ? ? ? ? ? ? 389 ALA A N   1 
+ATOM   2469 C CA  . ALA A 1 312 ? 21.005  41.123 36.861 1.00 17.36 ? ? ? ? ? ? 389 ALA A CA  1 
+ATOM   2470 C C   . ALA A 1 312 ? 21.995  40.095 37.402 1.00 17.79 ? ? ? ? ? ? 389 ALA A C   1 
+ATOM   2471 O O   . ALA A 1 312 ? 22.280  39.100 36.740 1.00 17.27 ? ? ? ? ? ? 389 ALA A O   1 
+ATOM   2472 C CB  . ALA A 1 312 ? 21.722  42.103 35.925 1.00 16.70 ? ? ? ? ? ? 389 ALA A CB  1 
+ATOM   2473 N N   . ALA A 1 313 ? 22.527  40.332 38.595 1.00 19.64 ? ? ? ? ? ? 390 ALA A N   1 
+ATOM   2474 C CA  . ALA A 1 313 ? 23.469  39.386 39.183 1.00 18.97 ? ? ? ? ? ? 390 ALA A CA  1 
+ATOM   2475 C C   . ALA A 1 313 ? 22.748  38.082 39.517 1.00 19.99 ? ? ? ? ? ? 390 ALA A C   1 
+ATOM   2476 O O   . ALA A 1 313 ? 23.371  37.019 39.574 1.00 16.95 ? ? ? ? ? ? 390 ALA A O   1 
+ATOM   2477 C CB  . ALA A 1 313 ? 24.090  39.972 40.446 1.00 20.67 ? ? ? ? ? ? 390 ALA A CB  1 
+ATOM   2478 N N   . ASN A 1 314 ? 21.435  38.170 39.739 1.00 18.17 ? ? ? ? ? ? 391 ASN A N   1 
+ATOM   2479 C CA  . ASN A 1 314 ? 20.646  36.992 40.081 1.00 17.78 ? ? ? ? ? ? 391 ASN A CA  1 
+ATOM   2480 C C   . ASN A 1 314 ? 19.850  36.382 38.940 1.00 17.24 ? ? ? ? ? ? 391 ASN A C   1 
+ATOM   2481 O O   . ASN A 1 314 ? 18.868  35.658 39.154 1.00 15.04 ? ? ? ? ? ? 391 ASN A O   1 
+ATOM   2482 C CB  . ASN A 1 314 ? 19.735  37.270 41.283 1.00 18.02 ? ? ? ? ? ? 391 ASN A CB  1 
+ATOM   2483 C CG  . ASN A 1 314 ? 20.528  37.472 42.576 1.00 22.85 ? ? ? ? ? ? 391 ASN A CG  1 
+ATOM   2484 O OD1 . ASN A 1 314 ? 21.618  36.918 42.737 1.00 21.93 ? ? ? ? ? ? 391 ASN A OD1 1 
+ATOM   2485 N ND2 . ASN A 1 314 ? 19.970  38.235 43.507 1.00 16.19 ? ? ? ? ? ? 391 ASN A ND2 1 
+ATOM   2486 N N   . ILE A 1 315 ? 20.274  36.691 37.722 1.00 16.53 ? ? ? ? ? ? 392 ILE A N   1 
+ATOM   2487 C CA  . ILE A 1 315 ? 19.666  36.103 36.542 1.00 14.82 ? ? ? ? ? ? 392 ILE A CA  1 
+ATOM   2488 C C   . ILE A 1 315 ? 20.817  35.294 35.929 1.00 11.41 ? ? ? ? ? ? 392 ILE A C   1 
+ATOM   2489 O O   . ILE A 1 315 ? 21.919  35.814 35.803 1.00 11.96 ? ? ? ? ? ? 392 ILE A O   1 
+ATOM   2490 C CB  . ILE A 1 315 ? 19.205  37.159 35.515 1.00 13.06 ? ? ? ? ? ? 392 ILE A CB  1 
+ATOM   2491 C CG1 . ILE A 1 315 ? 18.214  38.143 36.151 1.00 11.78 ? ? ? ? ? ? 392 ILE A CG1 1 
+ATOM   2492 C CG2 . ILE A 1 315 ? 18.532  36.447 34.342 1.00 13.93 ? ? ? ? ? ? 392 ILE A CG2 1 
+ATOM   2493 C CD1 . ILE A 1 315 ? 16.946  37.477 36.686 1.00 12.95 ? ? ? ? ? ? 392 ILE A CD1 1 
+ATOM   2494 N N   . LEU A 1 316 ? 20.580  34.029 35.586 1.00 15.22 ? ? ? ? ? ? 393 LEU A N   1 
+ATOM   2495 C CA  . LEU A 1 316 ? 21.621  33.198 34.987 1.00 14.11 ? ? ? ? ? ? 393 LEU A CA  1 
+ATOM   2496 C C   . LEU A 1 316 ? 21.311  33.010 33.509 1.00 18.43 ? ? ? ? ? ? 393 LEU A C   1 
+ATOM   2497 O O   . LEU A 1 316 ? 20.158  33.120 33.095 1.00 17.19 ? ? ? ? ? ? 393 LEU A O   1 
+ATOM   2498 C CB  . LEU A 1 316 ? 21.686  31.835 35.676 1.00 14.71 ? ? ? ? ? ? 393 LEU A CB  1 
+ATOM   2499 C CG  . LEU A 1 316 ? 21.955  31.885 37.186 1.00 18.10 ? ? ? ? ? ? 393 LEU A CG  1 
+ATOM   2500 C CD1 . LEU A 1 316 ? 21.960  30.471 37.742 1.00 17.40 ? ? ? ? ? ? 393 LEU A CD1 1 
+ATOM   2501 C CD2 . LEU A 1 316 ? 23.286  32.565 37.463 1.00 19.55 ? ? ? ? ? ? 393 LEU A CD2 1 
+ATOM   2502 N N   . VAL A 1 317 ? 22.339  32.704 32.724 1.00 18.42 ? ? ? ? ? ? 394 VAL A N   1 
+ATOM   2503 C CA  . VAL A 1 317 ? 22.182  32.525 31.281 1.00 17.15 ? ? ? ? ? ? 394 VAL A CA  1 
+ATOM   2504 C C   . VAL A 1 317 ? 22.680  31.162 30.841 1.00 17.05 ? ? ? ? ? ? 394 VAL A C   1 
+ATOM   2505 O O   . VAL A 1 317 ? 23.835  30.834 31.078 1.00 19.72 ? ? ? ? ? ? 394 VAL A O   1 
+ATOM   2506 C CB  . VAL A 1 317 ? 22.988  33.599 30.512 1.00 17.67 ? ? ? ? ? ? 394 VAL A CB  1 
+ATOM   2507 C CG1 . VAL A 1 317 ? 22.710  33.501 29.023 1.00 17.23 ? ? ? ? ? ? 394 VAL A CG1 1 
+ATOM   2508 C CG2 . VAL A 1 317 ? 22.654  34.978 31.048 1.00 17.35 ? ? ? ? ? ? 394 VAL A CG2 1 
+ATOM   2509 N N   . SER A 1 318 ? 21.821  30.376 30.194 1.00 17.31 ? ? ? ? ? ? 395 SER A N   1 
+ATOM   2510 C CA  . SER A 1 318 ? 22.209  29.043 29.726 1.00 22.88 ? ? ? ? ? ? 395 SER A CA  1 
+ATOM   2511 C C   . SER A 1 318 ? 23.064  29.145 28.464 1.00 21.22 ? ? ? ? ? ? 395 SER A C   1 
+ATOM   2512 O O   . SER A 1 318 ? 23.265  30.231 27.922 1.00 22.27 ? ? ? ? ? ? 395 SER A O   1 
+ATOM   2513 C CB  . SER A 1 318 ? 20.976  28.193 29.410 1.00 19.14 ? ? ? ? ? ? 395 SER A CB  1 
+ATOM   2514 O OG  . SER A 1 318 ? 20.342  28.655 28.230 1.00 25.24 ? ? ? ? ? ? 395 SER A OG  1 
+ATOM   2515 N N   . ALA A 1 319 ? 23.560  28.006 27.995 1.00 22.22 ? ? ? ? ? ? 396 ALA A N   1 
+ATOM   2516 C CA  . ALA A 1 319 ? 24.388  27.983 26.795 1.00 24.53 ? ? ? ? ? ? 396 ALA A CA  1 
+ATOM   2517 C C   . ALA A 1 319 ? 23.619  28.487 25.572 1.00 24.77 ? ? ? ? ? ? 396 ALA A C   1 
+ATOM   2518 O O   . ALA A 1 319 ? 24.213  29.040 24.652 1.00 24.40 ? ? ? ? ? ? 396 ALA A O   1 
+ATOM   2519 C CB  . ALA A 1 319 ? 24.912  26.573 26.545 1.00 24.39 ? ? ? ? ? ? 396 ALA A CB  1 
+ATOM   2520 N N   . SER A 1 320 ? 22.300  28.310 25.569 1.00 23.70 ? ? ? ? ? ? 397 SER A N   1 
+ATOM   2521 C CA  . SER A 1 320 ? 21.470  28.758 24.447 1.00 23.28 ? ? ? ? ? ? 397 SER A CA  1 
+ATOM   2522 C C   . SER A 1 320 ? 20.924  30.177 24.646 1.00 23.69 ? ? ? ? ? ? 397 SER A C   1 
+ATOM   2523 O O   . SER A 1 320 ? 20.033  30.623 23.916 1.00 24.71 ? ? ? ? ? ? 397 SER A O   1 
+ATOM   2524 C CB  . SER A 1 320 ? 20.311  27.782 24.238 1.00 26.09 ? ? ? ? ? ? 397 SER A CB  1 
+ATOM   2525 O OG  . SER A 1 320 ? 19.534  27.644 25.419 1.00 31.46 ? ? ? ? ? ? 397 SER A OG  1 
+ATOM   2526 N N   . LEU A 1 321 ? 21.463  30.874 25.642 1.00 21.31 ? ? ? ? ? ? 398 LEU A N   1 
+ATOM   2527 C CA  . LEU A 1 321 ? 21.066  32.242 25.966 1.00 24.23 ? ? ? ? ? ? 398 LEU A CA  1 
+ATOM   2528 C C   . LEU A 1 321 ? 19.680  32.391 26.594 1.00 22.19 ? ? ? ? ? ? 398 LEU A C   1 
+ATOM   2529 O O   . LEU A 1 321 ? 19.042  33.428 26.449 1.00 25.17 ? ? ? ? ? ? 398 LEU A O   1 
+ATOM   2530 C CB  . LEU A 1 321 ? 21.161  33.142 24.723 1.00 25.89 ? ? ? ? ? ? 398 LEU A CB  1 
+ATOM   2531 C CG  . LEU A 1 321 ? 22.546  33.242 24.074 1.00 29.74 ? ? ? ? ? ? 398 LEU A CG  1 
+ATOM   2532 C CD1 . LEU A 1 321 ? 22.503  34.240 22.920 1.00 31.29 ? ? ? ? ? ? 398 LEU A CD1 1 
+ATOM   2533 C CD2 . LEU A 1 321 ? 23.569  33.682 25.110 1.00 29.28 ? ? ? ? ? ? 398 LEU A CD2 1 
+ATOM   2534 N N   . VAL A 1 322 ? 19.207  31.361 27.285 1.00 22.88 ? ? ? ? ? ? 399 VAL A N   1 
+ATOM   2535 C CA  . VAL A 1 322 ? 17.910  31.449 27.949 1.00 20.20 ? ? ? ? ? ? 399 VAL A CA  1 
+ATOM   2536 C C   . VAL A 1 322 ? 18.130  31.955 29.377 1.00 22.58 ? ? ? ? ? ? 399 VAL A C   1 
+ATOM   2537 O O   . VAL A 1 322 ? 19.037  31.500 30.081 1.00 21.05 ? ? ? ? ? ? 399 VAL A O   1 
+ATOM   2538 C CB  . VAL A 1 322 ? 17.196  30.081 27.986 1.00 21.62 ? ? ? ? ? ? 399 VAL A CB  1 
+ATOM   2539 C CG1 . VAL A 1 322 ? 15.912  30.172 28.820 1.00 16.21 ? ? ? ? ? ? 399 VAL A CG1 1 
+ATOM   2540 C CG2 . VAL A 1 322 ? 16.855  29.645 26.562 1.00 21.47 ? ? ? ? ? ? 399 VAL A CG2 1 
+ATOM   2541 N N   . CYS A 1 323 ? 17.311  32.912 29.794 1.00 18.51 ? ? ? ? ? ? 400 CYS A N   1 
+ATOM   2542 C CA  . CYS A 1 323 ? 17.427  33.478 31.133 1.00 19.40 ? ? ? ? ? ? 400 CYS A CA  1 
+ATOM   2543 C C   . CYS A 1 323 ? 16.721  32.649 32.181 1.00 18.25 ? ? ? ? ? ? 400 CYS A C   1 
+ATOM   2544 O O   . CYS A 1 323 ? 15.593  32.204 31.983 1.00 18.34 ? ? ? ? ? ? 400 CYS A O   1 
+ATOM   2545 C CB  . CYS A 1 323 ? 16.872  34.898 31.161 1.00 18.41 ? ? ? ? ? ? 400 CYS A CB  1 
+ATOM   2546 S SG  . CYS A 1 323 ? 17.856  36.038 30.208 1.00 25.24 ? ? ? ? ? ? 400 CYS A SG  1 
+ATOM   2547 N N   . LYS A 1 324 ? 17.409  32.432 33.293 1.00 15.06 ? ? ? ? ? ? 401 LYS A N   1 
+ATOM   2548 C CA  . LYS A 1 324 ? 16.855  31.668 34.393 1.00 18.46 ? ? ? ? ? ? 401 LYS A CA  1 
+ATOM   2549 C C   . LYS A 1 324 ? 17.016  32.474 35.674 1.00 18.07 ? ? ? ? ? ? 401 LYS A C   1 
+ATOM   2550 O O   . LYS A 1 324 ? 18.134  32.770 36.104 1.00 17.56 ? ? ? ? ? ? 401 LYS A O   1 
+ATOM   2551 C CB  . LYS A 1 324 ? 17.564  30.315 34.559 1.00 22.38 ? ? ? ? ? ? 401 LYS A CB  1 
+ATOM   2552 C CG  . LYS A 1 324 ? 17.005  29.113 33.772 1.00 24.36 ? ? ? ? ? ? 401 LYS A CG  1 
+ATOM   2553 C CD  . LYS A 1 324 ? 17.198  29.218 32.280 1.00 28.23 ? ? ? ? ? ? 401 LYS A CD  1 
+ATOM   2554 C CE  . LYS A 1 324 ? 17.124  27.840 31.620 1.00 22.22 ? ? ? ? ? ? 401 LYS A CE  1 
+ATOM   2555 N NZ  . LYS A 1 324 ? 15.868  27.095 31.872 1.00 18.93 ? ? ? ? ? ? 401 LYS A NZ  1 
+ATOM   2556 N N   . ILE A 1 325 ? 15.889  32.823 36.277 1.00 15.12 ? ? ? ? ? ? 402 ILE A N   1 
+ATOM   2557 C CA  . ILE A 1 325 ? 15.887  33.581 37.516 1.00 14.49 ? ? ? ? ? ? 402 ILE A CA  1 
+ATOM   2558 C C   . ILE A 1 325 ? 16.415  32.690 38.643 1.00 13.53 ? ? ? ? ? ? 402 ILE A C   1 
+ATOM   2559 O O   . ILE A 1 325 ? 15.962  31.546 38.814 1.00 13.24 ? ? ? ? ? ? 402 ILE A O   1 
+ATOM   2560 C CB  . ILE A 1 325 ? 14.464  34.053 37.831 1.00 15.75 ? ? ? ? ? ? 402 ILE A CB  1 
+ATOM   2561 C CG1 . ILE A 1 325 ? 13.947  34.915 36.671 1.00 13.84 ? ? ? ? ? ? 402 ILE A CG1 1 
+ATOM   2562 C CG2 . ILE A 1 325 ? 14.448  34.838 39.120 1.00 12.38 ? ? ? ? ? ? 402 ILE A CG2 1 
+ATOM   2563 C CD1 . ILE A 1 325 ? 12.512  35.353 36.835 1.00 11.62 ? ? ? ? ? ? 402 ILE A CD1 1 
+ATOM   2564 N N   . ALA A 1 326 ? 17.378  33.217 39.399 1.00 13.65 ? ? ? ? ? ? 403 ALA A N   1 
+ATOM   2565 C CA  . ALA A 1 326 ? 17.994  32.499 40.510 1.00 12.46 ? ? ? ? ? ? 403 ALA A CA  1 
+ATOM   2566 C C   . ALA A 1 326 ? 17.867  33.235 41.841 1.00 15.27 ? ? ? ? ? ? 403 ALA A C   1 
+ATOM   2567 O O   . ALA A 1 326 ? 17.598  34.439 41.873 1.00 16.11 ? ? ? ? ? ? 403 ALA A O   1 
+ATOM   2568 C CB  . ALA A 1 326 ? 19.469  32.258 40.209 1.00 15.73 ? ? ? ? ? ? 403 ALA A CB  1 
+ATOM   2569 N N   . ASP A 1 327 ? 18.074  32.503 42.938 1.00 14.25 ? ? ? ? ? ? 404 ASP A N   1 
+ATOM   2570 C CA  . ASP A 1 327 ? 18.020  33.085 44.283 1.00 16.29 ? ? ? ? ? ? 404 ASP A CA  1 
+ATOM   2571 C C   . ASP A 1 327 ? 16.646  33.588 44.719 1.00 14.02 ? ? ? ? ? ? 404 ASP A C   1 
+ATOM   2572 O O   . ASP A 1 327 ? 16.548  34.324 45.692 1.00 13.60 ? ? ? ? ? ? 404 ASP A O   1 
+ATOM   2573 C CB  . ASP A 1 327 ? 19.030  34.243 44.388 1.00 14.64 ? ? ? ? ? ? 404 ASP A CB  1 
+ATOM   2574 C CG  . ASP A 1 327 ? 20.308  33.855 45.124 1.00 23.19 ? ? ? ? ? ? 404 ASP A CG  1 
+ATOM   2575 O OD1 . ASP A 1 327 ? 20.786  32.717 44.952 1.00 22.90 ? ? ? ? ? ? 404 ASP A OD1 1 
+ATOM   2576 O OD2 . ASP A 1 327 ? 20.848  34.708 45.863 1.00 26.78 ? ? ? ? ? ? 404 ASP A OD2 1 
+ATOM   2577 N N   . PHE A 1 328 ? 15.584  33.211 44.016 1.00 14.00 ? ? ? ? ? ? 405 PHE A N   1 
+ATOM   2578 C CA  . PHE A 1 328 ? 14.262  33.684 44.418 1.00 13.02 ? ? ? ? ? ? 405 PHE A CA  1 
+ATOM   2579 C C   . PHE A 1 328 ? 13.900  33.283 45.841 1.00 11.92 ? ? ? ? ? ? 405 PHE A C   1 
+ATOM   2580 O O   . PHE A 1 328 ? 13.974  32.108 46.199 1.00 13.04 ? ? ? ? ? ? 405 PHE A O   1 
+ATOM   2581 C CB  . PHE A 1 328 ? 13.164  33.190 43.453 1.00 12.37 ? ? ? ? ? ? 405 PHE A CB  1 
+ATOM   2582 C CG  . PHE A 1 328 ? 13.324  31.759 43.000 1.00 12.03 ? ? ? ? ? ? 405 PHE A CG  1 
+ATOM   2583 C CD1 . PHE A 1 328 ? 14.113  31.448 41.892 1.00 12.98 ? ? ? ? ? ? 405 PHE A CD1 1 
+ATOM   2584 C CD2 . PHE A 1 328 ? 12.671  30.728 43.662 1.00 12.16 ? ? ? ? ? ? 405 PHE A CD2 1 
+ATOM   2585 C CE1 . PHE A 1 328 ? 14.241  30.118 41.447 1.00 14.91 ? ? ? ? ? ? 405 PHE A CE1 1 
+ATOM   2586 C CE2 . PHE A 1 328 ? 12.792  29.410 43.233 1.00 14.16 ? ? ? ? ? ? 405 PHE A CE2 1 
+ATOM   2587 C CZ  . PHE A 1 328 ? 13.579  29.103 42.119 1.00 16.71 ? ? ? ? ? ? 405 PHE A CZ  1 
+ATOM   2588 N N   . GLY A 1 329 ? 13.532  34.285 46.640 1.00 13.40 ? ? ? ? ? ? 406 GLY A N   1 
+ATOM   2589 C CA  . GLY A 1 329 ? 13.126  34.085 48.023 1.00 14.03 ? ? ? ? ? ? 406 GLY A CA  1 
+ATOM   2590 C C   . GLY A 1 329 ? 14.210  33.874 49.071 1.00 16.48 ? ? ? ? ? ? 406 GLY A C   1 
+ATOM   2591 O O   . GLY A 1 329 ? 13.942  33.931 50.275 1.00 11.17 ? ? ? ? ? ? 406 GLY A O   1 
+ATOM   2592 N N   . LEU A 1 330 ? 15.438  33.646 48.629 1.00 16.79 ? ? ? ? ? ? 407 LEU A N   1 
+ATOM   2593 C CA  . LEU A 1 330 ? 16.528  33.381 49.561 1.00 17.97 ? ? ? ? ? ? 407 LEU A CA  1 
+ATOM   2594 C C   . LEU A 1 330 ? 16.790  34.483 50.590 1.00 17.49 ? ? ? ? ? ? 407 LEU A C   1 
+ATOM   2595 O O   . LEU A 1 330 ? 17.138  34.194 51.737 1.00 18.06 ? ? ? ? ? ? 407 LEU A O   1 
+ATOM   2596 C CB  . LEU A 1 330 ? 17.815  33.095 48.785 1.00 16.97 ? ? ? ? ? ? 407 LEU A CB  1 
+ATOM   2597 C CG  . LEU A 1 330 ? 19.000  32.625 49.629 1.00 20.18 ? ? ? ? ? ? 407 LEU A CG  1 
+ATOM   2598 C CD1 . LEU A 1 330 ? 18.649  31.282 50.261 1.00 21.40 ? ? ? ? ? ? 407 LEU A CD1 1 
+ATOM   2599 C CD2 . LEU A 1 330 ? 20.239  32.484 48.751 1.00 23.76 ? ? ? ? ? ? 407 LEU A CD2 1 
+ATOM   2600 N N   . ALA A 1 331 ? 16.623  35.738 50.181 1.00 16.43 ? ? ? ? ? ? 408 ALA A N   1 
+ATOM   2601 C CA  . ALA A 1 331 ? 16.871  36.873 51.067 1.00 16.32 ? ? ? ? ? ? 408 ALA A CA  1 
+ATOM   2602 C C   . ALA A 1 331 ? 16.074  36.838 52.354 1.00 19.31 ? ? ? ? ? ? 408 ALA A C   1 
+ATOM   2603 O O   . ALA A 1 331 ? 16.537  37.341 53.378 1.00 17.67 ? ? ? ? ? ? 408 ALA A O   1 
+ATOM   2604 C CB  . ALA A 1 331 ? 16.601  38.191 50.338 1.00 17.61 ? ? ? ? ? ? 408 ALA A CB  1 
+ATOM   2605 N N   . ARG A 1 332 ? 14.883  36.249 52.322 1.00 18.55 ? ? ? ? ? ? 409 ARG A N   1 
+ATOM   2606 C CA  . ARG A 1 332 ? 14.067  36.216 53.529 1.00 19.25 ? ? ? ? ? ? 409 ARG A CA  1 
+ATOM   2607 C C   . ARG A 1 332 ? 14.688  35.434 54.694 1.00 20.62 ? ? ? ? ? ? 409 ARG A C   1 
+ATOM   2608 O O   . ARG A 1 332 ? 14.365  35.691 55.855 1.00 19.33 ? ? ? ? ? ? 409 ARG A O   1 
+ATOM   2609 C CB  . ARG A 1 332 ? 12.676  35.656 53.237 1.00 19.41 ? ? ? ? ? ? 409 ARG A CB  1 
+ATOM   2610 C CG  . ARG A 1 332 ? 11.703  35.963 54.365 1.00 24.00 ? ? ? ? ? ? 409 ARG A CG  1 
+ATOM   2611 C CD  . ARG A 1 332 ? 10.318  35.402 54.128 1.00 24.74 ? ? ? ? ? ? 409 ARG A CD  1 
+ATOM   2612 N NE  . ARG A 1 332 ? 9.401   35.876 55.160 1.00 29.03 ? ? ? ? ? ? 409 ARG A NE  1 
+ATOM   2613 C CZ  . ARG A 1 332 ? 8.144   35.472 55.298 1.00 31.16 ? ? ? ? ? ? 409 ARG A CZ  1 
+ATOM   2614 N NH1 . ARG A 1 332 ? 7.633   34.578 54.466 1.00 27.98 ? ? ? ? ? ? 409 ARG A NH1 1 
+ATOM   2615 N NH2 . ARG A 1 332 ? 7.391   35.981 56.264 1.00 34.05 ? ? ? ? ? ? 409 ARG A NH2 1 
+ATOM   2616 N N   . VAL A 1 333 ? 15.571  34.483 54.408 1.00 18.62 ? ? ? ? ? ? 410 VAL A N   1 
+ATOM   2617 C CA  . VAL A 1 333 ? 16.169  33.733 55.506 1.00 18.07 ? ? ? ? ? ? 410 VAL A CA  1 
+ATOM   2618 C C   . VAL A 1 333 ? 17.604  34.122 55.903 1.00 20.76 ? ? ? ? ? ? 410 VAL A C   1 
+ATOM   2619 O O   . VAL A 1 333 ? 18.258  33.402 56.653 1.00 22.74 ? ? ? ? ? ? 410 VAL A O   1 
+ATOM   2620 C CB  . VAL A 1 333 ? 16.068  32.204 55.256 1.00 15.16 ? ? ? ? ? ? 410 VAL A CB  1 
+ATOM   2621 C CG1 . VAL A 1 333 ? 14.599  31.774 55.312 1.00 19.11 ? ? ? ? ? ? 410 VAL A CG1 1 
+ATOM   2622 C CG2 . VAL A 1 333 ? 16.656  31.845 53.897 1.00 20.45 ? ? ? ? ? ? 410 VAL A CG2 1 
+ATOM   2623 N N   . ILE A 1 334 ? 18.091  35.262 55.411 1.00 22.92 ? ? ? ? ? ? 411 ILE A N   1 
+ATOM   2624 C CA  . ILE A 1 334 ? 19.427  35.744 55.778 1.00 23.87 ? ? ? ? ? ? 411 ILE A CA  1 
+ATOM   2625 C C   . ILE A 1 334 ? 19.320  36.282 57.208 1.00 25.13 ? ? ? ? ? ? 411 ILE A C   1 
+ATOM   2626 O O   . ILE A 1 334 ? 18.374  36.993 57.527 1.00 24.11 ? ? ? ? ? ? 411 ILE A O   1 
+ATOM   2627 C CB  . ILE A 1 334 ? 19.887  36.900 54.865 1.00 25.85 ? ? ? ? ? ? 411 ILE A CB  1 
+ATOM   2628 C CG1 . ILE A 1 334 ? 20.095  36.400 53.432 1.00 23.36 ? ? ? ? ? ? 411 ILE A CG1 1 
+ATOM   2629 C CG2 . ILE A 1 334 ? 21.170  37.521 55.420 1.00 27.35 ? ? ? ? ? ? 411 ILE A CG2 1 
+ATOM   2630 C CD1 . ILE A 1 334 ? 21.220  35.389 53.281 1.00 25.33 ? ? ? ? ? ? 411 ILE A CD1 1 
+ATOM   2631 N N   . GLU A 1 335 ? 20.280  35.963 58.070 1.00 29.37 ? ? ? ? ? ? 412 GLU A N   1 
+ATOM   2632 C CA  . GLU A 1 335 ? 20.216  36.427 59.461 1.00 35.38 ? ? ? ? ? ? 412 GLU A CA  1 
+ATOM   2633 C C   . GLU A 1 335 ? 20.735  37.839 59.738 1.00 37.86 ? ? ? ? ? ? 412 GLU A C   1 
+ATOM   2634 O O   . GLU A 1 335 ? 20.116  38.601 60.481 1.00 42.03 ? ? ? ? ? ? 412 GLU A O   1 
+ATOM   2635 C CB  . GLU A 1 335 ? 20.940  35.434 60.371 1.00 38.97 ? ? ? ? ? ? 412 GLU A CB  1 
+ATOM   2636 C CG  . GLU A 1 335 ? 20.176  34.145 60.600 1.00 41.87 ? ? ? ? ? ? 412 GLU A CG  1 
+ATOM   2637 C CD  . GLU A 1 335 ? 18.910  34.372 61.408 1.00 46.16 ? ? ? ? ? ? 412 GLU A CD  1 
+ATOM   2638 O OE1 . GLU A 1 335 ? 19.025  34.838 62.559 1.00 48.75 ? ? ? ? ? ? 412 GLU A OE1 1 
+ATOM   2639 O OE2 . GLU A 1 335 ? 17.806  34.092 60.896 1.00 48.05 ? ? ? ? ? ? 412 GLU A OE2 1 
+ATOM   2640 N N   . ASP A 1 336 ? 21.876  38.169 59.143 1.00 40.07 ? ? ? ? ? ? 413 ASP A N   1 
+ATOM   2641 C CA  . ASP A 1 336 ? 22.529  39.468 59.296 1.00 41.13 ? ? ? ? ? ? 413 ASP A CA  1 
+ATOM   2642 C C   . ASP A 1 336 ? 21.628  40.616 59.784 1.00 42.17 ? ? ? ? ? ? 413 ASP A C   1 
+ATOM   2643 O O   . ASP A 1 336 ? 20.727  41.069 59.072 1.00 39.42 ? ? ? ? ? ? 413 ASP A O   1 
+ATOM   2644 C CB  . ASP A 1 336 ? 23.191  39.837 57.967 1.00 40.97 ? ? ? ? ? ? 413 ASP A CB  1 
+ATOM   2645 C CG  . ASP A 1 336 ? 23.976  41.125 58.042 1.00 43.94 ? ? ? ? ? ? 413 ASP A CG  1 
+ATOM   2646 O OD1 . ASP A 1 336 ? 23.363  42.187 58.280 1.00 39.53 ? ? ? ? ? ? 413 ASP A OD1 1 
+ATOM   2647 O OD2 . ASP A 1 336 ? 25.213  41.069 57.861 1.00 46.75 ? ? ? ? ? ? 413 ASP A OD2 1 
+ATOM   2648 N N   . ASN A 1 337 ? 21.892  41.085 61.003 1.00 42.32 ? ? ? ? ? ? 414 ASN A N   1 
+ATOM   2649 C CA  . ASN A 1 337 ? 21.122  42.170 61.613 1.00 44.01 ? ? ? ? ? ? 414 ASN A CA  1 
+ATOM   2650 C C   . ASN A 1 337 ? 20.919  43.391 60.712 1.00 40.94 ? ? ? ? ? ? 414 ASN A C   1 
+ATOM   2651 O O   . ASN A 1 337 ? 19.818  43.930 60.638 1.00 40.95 ? ? ? ? ? ? 414 ASN A O   1 
+ATOM   2652 C CB  . ASN A 1 337 ? 21.773  42.601 62.938 1.00 46.42 ? ? ? ? ? ? 414 ASN A CB  1 
+ATOM   2653 C CG  . ASN A 1 337 ? 21.588  41.572 64.052 1.00 51.39 ? ? ? ? ? ? 414 ASN A CG  1 
+ATOM   2654 O OD1 . ASN A 1 337 ? 22.131  41.722 65.150 1.00 54.20 ? ? ? ? ? ? 414 ASN A OD1 1 
+ATOM   2655 N ND2 . ASN A 1 337 ? 20.807  40.531 63.778 1.00 50.96 ? ? ? ? ? ? 414 ASN A ND2 1 
+ATOM   2656 N N   . GLU A 1 338 ? 21.971  43.832 60.030 1.00 38.83 ? ? ? ? ? ? 415 GLU A N   1 
+ATOM   2657 C CA  . GLU A 1 338 ? 21.855  44.987 59.144 1.00 36.62 ? ? ? ? ? ? 415 GLU A CA  1 
+ATOM   2658 C C   . GLU A 1 338 ? 20.979  44.659 57.937 1.00 36.39 ? ? ? ? ? ? 415 GLU A C   1 
+ATOM   2659 O O   . GLU A 1 338 ? 20.108  45.445 57.555 1.00 35.34 ? ? ? ? ? ? 415 GLU A O   1 
+ATOM   2660 C CB  . GLU A 1 338 ? 23.236  45.431 58.657 1.00 39.78 ? ? ? ? ? ? 415 GLU A CB  1 
+ATOM   2661 C CG  . GLU A 1 338 ? 24.186  45.865 59.762 1.00 42.87 ? ? ? ? ? ? 415 GLU A CG  1 
+ATOM   2662 C CD  . GLU A 1 338 ? 25.550  46.266 59.228 1.00 45.27 ? ? ? ? ? ? 415 GLU A CD  1 
+ATOM   2663 O OE1 . GLU A 1 338 ? 25.633  47.251 58.459 1.00 41.52 ? ? ? ? ? ? 415 GLU A OE1 1 
+ATOM   2664 O OE2 . GLU A 1 338 ? 26.539  45.586 59.576 1.00 48.31 ? ? ? ? ? ? 415 GLU A OE2 1 
+ATOM   2665 N N   . TYR A 1 339 ? 21.216  43.494 57.339 1.00 33.98 ? ? ? ? ? ? 416 TYR A N   1 
+ATOM   2666 C CA  . TYR A 1 339 ? 20.458  43.066 56.166 1.00 32.45 ? ? ? ? ? ? 416 TYR A CA  1 
+ATOM   2667 C C   . TYR A 1 339 ? 18.968  42.990 56.509 1.00 33.22 ? ? ? ? ? ? 416 TYR A C   1 
+ATOM   2668 O O   . TYR A 1 339 ? 18.114  43.421 55.725 1.00 31.71 ? ? ? ? ? ? 416 TYR A O   1 
+ATOM   2669 C CB  . TYR A 1 339 ? 20.937  41.692 55.692 1.00 30.75 ? ? ? ? ? ? 416 TYR A CB  1 
+ATOM   2670 C CG  . TYR A 1 339 ? 20.505  41.348 54.282 1.00 31.10 ? ? ? ? ? ? 416 TYR A CG  1 
+ATOM   2671 C CD1 . TYR A 1 339 ? 21.251  41.777 53.182 1.00 29.62 ? ? ? ? ? ? 416 TYR A CD1 1 
+ATOM   2672 C CD2 . TYR A 1 339 ? 19.332  40.635 54.044 1.00 29.81 ? ? ? ? ? ? 416 TYR A CD2 1 
+ATOM   2673 C CE1 . TYR A 1 339 ? 20.842  41.505 51.878 1.00 27.62 ? ? ? ? ? ? 416 TYR A CE1 1 
+ATOM   2674 C CE2 . TYR A 1 339 ? 18.909  40.358 52.739 1.00 29.02 ? ? ? ? ? ? 416 TYR A CE2 1 
+ATOM   2675 C CZ  . TYR A 1 339 ? 19.668  40.798 51.663 1.00 28.42 ? ? ? ? ? ? 416 TYR A CZ  1 
+ATOM   2676 O OH  . TYR A 1 339 ? 19.255  40.542 50.372 1.00 28.54 ? ? ? ? ? ? 416 TYR A OH  1 
+ATOM   2677 N N   . THR A 1 340 ? 18.655  42.443 57.681 1.00 32.73 ? ? ? ? ? ? 417 THR A N   1 
+ATOM   2678 C CA  . THR A 1 340 ? 17.264  42.327 58.105 1.00 39.13 ? ? ? ? ? ? 417 THR A CA  1 
+ATOM   2679 C C   . THR A 1 340 ? 16.600  43.698 58.206 1.00 38.25 ? ? ? ? ? ? 417 THR A C   1 
+ATOM   2680 O O   . THR A 1 340 ? 15.395  43.828 57.993 1.00 39.75 ? ? ? ? ? ? 417 THR A O   1 
+ATOM   2681 C CB  . THR A 1 340 ? 17.144  41.613 59.465 1.00 38.98 ? ? ? ? ? ? 417 THR A CB  1 
+ATOM   2682 O OG1 . THR A 1 340 ? 17.660  40.282 59.347 1.00 44.66 ? ? ? ? ? ? 417 THR A OG1 1 
+ATOM   2683 C CG2 . THR A 1 340 ? 15.681  41.542 59.905 1.00 42.32 ? ? ? ? ? ? 417 THR A CG2 1 
+ATOM   2684 N N   . ALA A 1 341 ? 17.388  44.720 58.523 1.00 37.24 ? ? ? ? ? ? 418 ALA A N   1 
+ATOM   2685 C CA  . ALA A 1 341 ? 16.857  46.075 58.636 1.00 38.66 ? ? ? ? ? ? 418 ALA A CA  1 
+ATOM   2686 C C   . ALA A 1 341 ? 17.033  46.856 57.335 1.00 37.08 ? ? ? ? ? ? 418 ALA A C   1 
+ATOM   2687 O O   . ALA A 1 341 ? 16.915  48.080 57.321 1.00 38.42 ? ? ? ? ? ? 418 ALA A O   1 
+ATOM   2688 C CB  . ALA A 1 341 ? 17.544  46.815 59.787 1.00 39.58 ? ? ? ? ? ? 418 ALA A CB  1 
+ATOM   2689 N N   . ARG A 1 342 ? 17.311  46.147 56.245 1.00 36.49 ? ? ? ? ? ? 419 ARG A N   1 
+ATOM   2690 C CA  . ARG A 1 342 ? 17.511  46.781 54.943 1.00 36.36 ? ? ? ? ? ? 419 ARG A CA  1 
+ATOM   2691 C C   . ARG A 1 342 ? 18.547  47.902 55.036 1.00 37.07 ? ? ? ? ? ? 419 ARG A C   1 
+ATOM   2692 O O   . ARG A 1 342 ? 18.342  48.990 54.500 1.00 34.75 ? ? ? ? ? ? 419 ARG A O   1 
+ATOM   2693 C CB  . ARG A 1 342 ? 16.190  47.361 54.400 1.00 36.99 ? ? ? ? ? ? 419 ARG A CB  1 
+ATOM   2694 C CG  . ARG A 1 342 ? 15.055  46.349 54.204 1.00 33.96 ? ? ? ? ? ? 419 ARG A CG  1 
+ATOM   2695 C CD  . ARG A 1 342 ? 14.420  45.941 55.523 1.00 34.55 ? ? ? ? ? ? 419 ARG A CD  1 
+ATOM   2696 N NE  . ARG A 1 342 ? 13.684  47.051 56.126 1.00 39.41 ? ? ? ? ? ? 419 ARG A NE  1 
+ATOM   2697 C CZ  . ARG A 1 342 ? 13.097  47.003 57.319 1.00 41.97 ? ? ? ? ? ? 419 ARG A CZ  1 
+ATOM   2698 N NH1 . ARG A 1 342 ? 13.156  45.898 58.051 1.00 44.12 ? ? ? ? ? ? 419 ARG A NH1 1 
+ATOM   2699 N NH2 . ARG A 1 342 ? 12.434  48.056 57.773 1.00 44.07 ? ? ? ? ? ? 419 ARG A NH2 1 
+ATOM   2700 N N   . GLU A 1 343 ? 19.655  47.633 55.723 1.00 39.82 ? ? ? ? ? ? 420 GLU A N   1 
+ATOM   2701 C CA  . GLU A 1 343 ? 20.725  48.622 55.889 1.00 41.39 ? ? ? ? ? ? 420 GLU A CA  1 
+ATOM   2702 C C   . GLU A 1 343 ? 22.084  47.958 55.678 1.00 41.06 ? ? ? ? ? ? 420 GLU A C   1 
+ATOM   2703 O O   . GLU A 1 343 ? 22.204  46.739 55.768 1.00 39.91 ? ? ? ? ? ? 420 GLU A O   1 
+ATOM   2704 C CB  . GLU A 1 343 ? 20.674  49.231 57.299 1.00 42.09 ? ? ? ? ? ? 420 GLU A CB  1 
+ATOM   2705 C CG  . GLU A 1 343 ? 19.337  49.867 57.656 1.00 47.68 ? ? ? ? ? ? 420 GLU A CG  1 
+ATOM   2706 C CD  . GLU A 1 343 ? 19.304  50.446 59.061 1.00 49.43 ? ? ? ? ? ? 420 GLU A CD  1 
+ATOM   2707 O OE1 . GLU A 1 343 ? 19.568  49.696 60.025 1.00 51.92 ? ? ? ? ? ? 420 GLU A OE1 1 
+ATOM   2708 O OE2 . GLU A 1 343 ? 19.002  51.652 59.202 1.00 50.28 ? ? ? ? ? ? 420 GLU A OE2 1 
+ATOM   2709 N N   . GLY A 1 344 ? 23.106  48.758 55.393 1.00 40.97 ? ? ? ? ? ? 421 GLY A N   1 
+ATOM   2710 C CA  . GLY A 1 344 ? 24.431  48.193 55.201 1.00 42.21 ? ? ? ? ? ? 421 GLY A CA  1 
+ATOM   2711 C C   . GLY A 1 344 ? 24.897  48.049 53.766 1.00 41.74 ? ? ? ? ? ? 421 GLY A C   1 
+ATOM   2712 O O   . GLY A 1 344 ? 24.118  48.196 52.824 1.00 43.72 ? ? ? ? ? ? 421 GLY A O   1 
+ATOM   2713 N N   . ALA A 1 345 ? 26.181  47.744 53.606 1.00 42.01 ? ? ? ? ? ? 422 ALA A N   1 
+ATOM   2714 C CA  . ALA A 1 345 ? 26.790  47.585 52.291 1.00 41.99 ? ? ? ? ? ? 422 ALA A CA  1 
+ATOM   2715 C C   . ALA A 1 345 ? 26.477  46.231 51.666 1.00 41.83 ? ? ? ? ? ? 422 ALA A C   1 
+ATOM   2716 O O   . ALA A 1 345 ? 26.884  45.950 50.538 1.00 43.67 ? ? ? ? ? ? 422 ALA A O   1 
+ATOM   2717 C CB  . ALA A 1 345 ? 28.305  47.771 52.396 1.00 43.63 ? ? ? ? ? ? 422 ALA A CB  1 
+ATOM   2718 N N   . LYS A 1 346 ? 25.765  45.386 52.400 1.00 40.18 ? ? ? ? ? ? 423 LYS A N   1 
+ATOM   2719 C CA  . LYS A 1 346 ? 25.416  44.078 51.874 1.00 39.16 ? ? ? ? ? ? 423 LYS A CA  1 
+ATOM   2720 C C   . LYS A 1 346 ? 24.013  44.082 51.268 1.00 36.80 ? ? ? ? ? ? 423 LYS A C   1 
+ATOM   2721 O O   . LYS A 1 346 ? 23.714  43.273 50.388 1.00 37.20 ? ? ? ? ? ? 423 LYS A O   1 
+ATOM   2722 C CB  . LYS A 1 346 ? 25.510  43.014 52.975 1.00 39.68 ? ? ? ? ? ? 423 LYS A CB  1 
+ATOM   2723 C CG  . LYS A 1 346 ? 26.896  42.886 53.594 1.00 44.53 ? ? ? ? ? ? 423 LYS A CG  1 
+ATOM   2724 C CD  . LYS A 1 346 ? 26.967  41.745 54.603 1.00 45.84 ? ? ? ? ? ? 423 LYS A CD  1 
+ATOM   2725 C CE  . LYS A 1 346 ? 28.372  41.608 55.186 1.00 46.02 ? ? ? ? ? ? 423 LYS A CE  1 
+ATOM   2726 N NZ  . LYS A 1 346 ? 28.479  40.474 56.151 1.00 47.25 ? ? ? ? ? ? 423 LYS A NZ  1 
+ATOM   2727 N N   . PHE A 1 347 ? 23.167  45.005 51.724 1.00 33.14 ? ? ? ? ? ? 424 PHE A N   1 
+ATOM   2728 C CA  . PHE A 1 347 ? 21.787  45.092 51.241 1.00 29.28 ? ? ? ? ? ? 424 PHE A CA  1 
+ATOM   2729 C C   . PHE A 1 347 ? 21.659  45.822 49.903 1.00 30.33 ? ? ? ? ? ? 424 PHE A C   1 
+ATOM   2730 O O   . PHE A 1 347 ? 22.255  46.885 49.709 1.00 28.30 ? ? ? ? ? ? 424 PHE A O   1 
+ATOM   2731 C CB  . PHE A 1 347 ? 20.905  45.800 52.269 1.00 31.31 ? ? ? ? ? ? 424 PHE A CB  1 
+ATOM   2732 C CG  . PHE A 1 347 ? 19.440  45.627 52.013 1.00 32.64 ? ? ? ? ? ? 424 PHE A CG  1 
+ATOM   2733 C CD1 . PHE A 1 347 ? 18.807  44.426 52.325 1.00 31.02 ? ? ? ? ? ? 424 PHE A CD1 1 
+ATOM   2734 C CD2 . PHE A 1 347 ? 18.704  46.633 51.395 1.00 33.26 ? ? ? ? ? ? 424 PHE A CD2 1 
+ATOM   2735 C CE1 . PHE A 1 347 ? 17.459  44.229 52.025 1.00 31.52 ? ? ? ? ? ? 424 PHE A CE1 1 
+ATOM   2736 C CE2 . PHE A 1 347 ? 17.357  46.446 51.088 1.00 35.85 ? ? ? ? ? ? 424 PHE A CE2 1 
+ATOM   2737 C CZ  . PHE A 1 347 ? 16.734  45.237 51.404 1.00 33.91 ? ? ? ? ? ? 424 PHE A CZ  1 
+ATOM   2738 N N   . PRO A 1 348 ? 20.864  45.260 48.968 1.00 26.93 ? ? ? ? ? ? 425 PRO A N   1 
+ATOM   2739 C CA  . PRO A 1 348 ? 20.600  45.780 47.621 1.00 25.89 ? ? ? ? ? ? 425 PRO A CA  1 
+ATOM   2740 C C   . PRO A 1 348 ? 19.698  47.015 47.563 1.00 26.00 ? ? ? ? ? ? 425 PRO A C   1 
+ATOM   2741 O O   . PRO A 1 348 ? 18.710  47.022 46.822 1.00 22.59 ? ? ? ? ? ? 425 PRO A O   1 
+ATOM   2742 C CB  . PRO A 1 348 ? 19.957  44.580 46.928 1.00 25.41 ? ? ? ? ? ? 425 PRO A CB  1 
+ATOM   2743 C CG  . PRO A 1 348 ? 19.107  44.030 48.048 1.00 27.80 ? ? ? ? ? ? 425 PRO A CG  1 
+ATOM   2744 C CD  . PRO A 1 348 ? 20.167  43.969 49.142 1.00 25.81 ? ? ? ? ? ? 425 PRO A CD  1 
+ATOM   2745 N N   . ILE A 1 349 ? 20.050  48.053 48.321 1.00 23.69 ? ? ? ? ? ? 426 ILE A N   1 
+ATOM   2746 C CA  . ILE A 1 349 ? 19.275  49.297 48.369 1.00 22.91 ? ? ? ? ? ? 426 ILE A CA  1 
+ATOM   2747 C C   . ILE A 1 349 ? 18.852  49.865 47.020 1.00 22.18 ? ? ? ? ? ? 426 ILE A C   1 
+ATOM   2748 O O   . ILE A 1 349 ? 17.694  50.227 46.822 1.00 22.87 ? ? ? ? ? ? 426 ILE A O   1 
+ATOM   2749 C CB  . ILE A 1 349 ? 20.054  50.424 49.112 1.00 25.41 ? ? ? ? ? ? 426 ILE A CB  1 
+ATOM   2750 C CG1 . ILE A 1 349 ? 20.181  50.082 50.596 1.00 23.08 ? ? ? ? ? ? 426 ILE A CG1 1 
+ATOM   2751 C CG2 . ILE A 1 349 ? 19.344  51.770 48.931 1.00 23.30 ? ? ? ? ? ? 426 ILE A CG2 1 
+ATOM   2752 C CD1 . ILE A 1 349 ? 18.851  50.009 51.328 1.00 26.69 ? ? ? ? ? ? 426 ILE A CD1 1 
+ATOM   2753 N N   . LYS A 1 350 ? 19.790  49.952 46.089 1.00 24.50 ? ? ? ? ? ? 427 LYS A N   1 
+ATOM   2754 C CA  . LYS A 1 350 ? 19.479  50.527 44.792 1.00 24.12 ? ? ? ? ? ? 427 LYS A CA  1 
+ATOM   2755 C C   . LYS A 1 350 ? 18.393  49.821 43.972 1.00 24.03 ? ? ? ? ? ? 427 LYS A C   1 
+ATOM   2756 O O   . LYS A 1 350 ? 17.799  50.434 43.089 1.00 23.50 ? ? ? ? ? ? 427 LYS A O   1 
+ATOM   2757 C CB  . LYS A 1 350 ? 20.770  50.666 43.979 1.00 25.80 ? ? ? ? ? ? 427 LYS A CB  1 
+ATOM   2758 C CG  . LYS A 1 350 ? 21.758  51.668 44.597 1.00 26.83 ? ? ? ? ? ? 427 LYS A CG  1 
+ATOM   2759 C CD  . LYS A 1 350 ? 22.967  51.877 43.700 1.00 26.42 ? ? ? ? ? ? 427 LYS A CD  1 
+ATOM   2760 C CE  . LYS A 1 350 ? 23.920  52.923 44.263 1.00 26.91 ? ? ? ? ? ? 427 LYS A CE  1 
+ATOM   2761 N NZ  . LYS A 1 350 ? 25.044  53.183 43.311 1.00 28.92 ? ? ? ? ? ? 427 LYS A NZ  1 
+ATOM   2762 N N   . TRP A 1 351 ? 18.125  48.552 44.277 1.00 25.59 ? ? ? ? ? ? 428 TRP A N   1 
+ATOM   2763 C CA  . TRP A 1 351 ? 17.112  47.751 43.565 1.00 21.07 ? ? ? ? ? ? 428 TRP A CA  1 
+ATOM   2764 C C   . TRP A 1 351 ? 15.832  47.570 44.374 1.00 21.51 ? ? ? ? ? ? 428 TRP A C   1 
+ATOM   2765 O O   . TRP A 1 351 ? 14.843  47.040 43.870 1.00 21.86 ? ? ? ? ? ? 428 TRP A O   1 
+ATOM   2766 C CB  . TRP A 1 351 ? 17.658  46.343 43.278 1.00 20.63 ? ? ? ? ? ? 428 TRP A CB  1 
+ATOM   2767 C CG  . TRP A 1 351 ? 18.713  46.245 42.225 1.00 21.62 ? ? ? ? ? ? 428 TRP A CG  1 
+ATOM   2768 C CD1 . TRP A 1 351 ? 18.524  45.976 40.897 1.00 22.18 ? ? ? ? ? ? 428 TRP A CD1 1 
+ATOM   2769 C CD2 . TRP A 1 351 ? 20.124  46.415 42.403 1.00 22.24 ? ? ? ? ? ? 428 TRP A CD2 1 
+ATOM   2770 N NE1 . TRP A 1 351 ? 19.729  45.965 40.239 1.00 22.45 ? ? ? ? ? ? 428 TRP A NE1 1 
+ATOM   2771 C CE2 . TRP A 1 351 ? 20.729  46.232 41.139 1.00 23.52 ? ? ? ? ? ? 428 TRP A CE2 1 
+ATOM   2772 C CE3 . TRP A 1 351 ? 20.937  46.703 43.507 1.00 21.30 ? ? ? ? ? ? 428 TRP A CE3 1 
+ATOM   2773 C CZ2 . TRP A 1 351 ? 22.115  46.327 40.948 1.00 21.03 ? ? ? ? ? ? 428 TRP A CZ2 1 
+ATOM   2774 C CZ3 . TRP A 1 351 ? 22.318  46.800 43.316 1.00 23.77 ? ? ? ? ? ? 428 TRP A CZ3 1 
+ATOM   2775 C CH2 . TRP A 1 351 ? 22.889  46.610 42.045 1.00 21.34 ? ? ? ? ? ? 428 TRP A CH2 1 
+ATOM   2776 N N   . THR A 1 352 ? 15.847  48.016 45.622 1.00 20.31 ? ? ? ? ? ? 429 THR A N   1 
+ATOM   2777 C CA  . THR A 1 352 ? 14.710  47.802 46.503 1.00 19.80 ? ? ? ? ? ? 429 THR A CA  1 
+ATOM   2778 C C   . THR A 1 352 ? 13.666  48.900 46.596 1.00 21.31 ? ? ? ? ? ? 429 THR A C   1 
+ATOM   2779 O O   . THR A 1 352 ? 13.993  50.076 46.702 1.00 22.72 ? ? ? ? ? ? 429 THR A O   1 
+ATOM   2780 C CB  . THR A 1 352 ? 15.224  47.474 47.903 1.00 20.16 ? ? ? ? ? ? 429 THR A CB  1 
+ATOM   2781 O OG1 . THR A 1 352 ? 16.147  46.381 47.808 1.00 17.74 ? ? ? ? ? ? 429 THR A OG1 1 
+ATOM   2782 C CG2 . THR A 1 352 ? 14.084  47.092 48.818 1.00 20.59 ? ? ? ? ? ? 429 THR A CG2 1 
+ATOM   2783 N N   . ALA A 1 353 ? 12.400  48.489 46.558 1.00 19.67 ? ? ? ? ? ? 430 ALA A N   1 
+ATOM   2784 C CA  . ALA A 1 353 ? 11.270  49.414 46.641 1.00 22.31 ? ? ? ? ? ? 430 ALA A CA  1 
+ATOM   2785 C C   . ALA A 1 353 ? 11.273  50.161 47.970 1.00 22.20 ? ? ? ? ? ? 430 ALA A C   1 
+ATOM   2786 O O   . ALA A 1 353 ? 11.544  49.577 49.022 1.00 21.16 ? ? ? ? ? ? 430 ALA A O   1 
+ATOM   2787 C CB  . ALA A 1 353 ? 9.960   48.651 46.489 1.00 17.38 ? ? ? ? ? ? 430 ALA A CB  1 
+ATOM   2788 N N   . PRO A 1 354 ? 10.937  51.458 47.943 1.00 22.73 ? ? ? ? ? ? 431 PRO A N   1 
+ATOM   2789 C CA  . PRO A 1 354 ? 10.904  52.283 49.150 1.00 22.67 ? ? ? ? ? ? 431 PRO A CA  1 
+ATOM   2790 C C   . PRO A 1 354 ? 10.149  51.677 50.332 1.00 25.28 ? ? ? ? ? ? 431 PRO A C   1 
+ATOM   2791 O O   . PRO A 1 354 ? 10.616  51.763 51.469 1.00 27.15 ? ? ? ? ? ? 431 PRO A O   1 
+ATOM   2792 C CB  . PRO A 1 354 ? 10.275  53.581 48.647 1.00 24.02 ? ? ? ? ? ? 431 PRO A CB  1 
+ATOM   2793 C CG  . PRO A 1 354 ? 10.847  53.676 47.259 1.00 25.48 ? ? ? ? ? ? 431 PRO A CG  1 
+ATOM   2794 C CD  . PRO A 1 354 ? 10.538  52.265 46.776 1.00 26.05 ? ? ? ? ? ? 431 PRO A CD  1 
+ATOM   2795 N N   . GLU A 1 355 ? 8.992   51.063 50.083 1.00 21.52 ? ? ? ? ? ? 432 GLU A N   1 
+ATOM   2796 C CA  . GLU A 1 355 ? 8.243   50.487 51.192 1.00 22.84 ? ? ? ? ? ? 432 GLU A CA  1 
+ATOM   2797 C C   . GLU A 1 355 ? 8.910   49.223 51.747 1.00 20.87 ? ? ? ? ? ? 432 GLU A C   1 
+ATOM   2798 O O   . GLU A 1 355 ? 8.698   48.862 52.903 1.00 21.85 ? ? ? ? ? ? 432 GLU A O   1 
+ATOM   2799 C CB  . GLU A 1 355 ? 6.786   50.174 50.797 1.00 23.61 ? ? ? ? ? ? 432 GLU A CB  1 
+ATOM   2800 C CG  . GLU A 1 355 ? 6.605   48.974 49.856 1.00 21.11 ? ? ? ? ? ? 432 GLU A CG  1 
+ATOM   2801 C CD  . GLU A 1 355 ? 6.879   49.293 48.392 1.00 17.79 ? ? ? ? ? ? 432 GLU A CD  1 
+ATOM   2802 O OE1 . GLU A 1 355 ? 7.406   50.384 48.089 1.00 16.50 ? ? ? ? ? ? 432 GLU A OE1 1 
+ATOM   2803 O OE2 . GLU A 1 355 ? 6.570   48.433 47.542 1.00 18.83 ? ? ? ? ? ? 432 GLU A OE2 1 
+ATOM   2804 N N   . ALA A 1 356 ? 9.716   48.551 50.932 1.00 20.31 ? ? ? ? ? ? 433 ALA A N   1 
+ATOM   2805 C CA  . ALA A 1 356 ? 10.392  47.344 51.394 1.00 20.87 ? ? ? ? ? ? 433 ALA A CA  1 
+ATOM   2806 C C   . ALA A 1 356 ? 11.569  47.755 52.264 1.00 22.06 ? ? ? ? ? ? 433 ALA A C   1 
+ATOM   2807 O O   . ALA A 1 356 ? 11.854  47.124 53.279 1.00 25.32 ? ? ? ? ? ? 433 ALA A O   1 
+ATOM   2808 C CB  . ALA A 1 356 ? 10.874  46.510 50.211 1.00 23.69 ? ? ? ? ? ? 433 ALA A CB  1 
+ATOM   2809 N N   . ILE A 1 357 ? 12.253  48.818 51.860 1.00 24.22 ? ? ? ? ? ? 434 ILE A N   1 
+ATOM   2810 C CA  . ILE A 1 357 ? 13.386  49.321 52.627 1.00 29.10 ? ? ? ? ? ? 434 ILE A CA  1 
+ATOM   2811 C C   . ILE A 1 357 ? 12.906  49.917 53.949 1.00 29.08 ? ? ? ? ? ? 434 ILE A C   1 
+ATOM   2812 O O   . ILE A 1 357 ? 13.468  49.633 55.005 1.00 32.09 ? ? ? ? ? ? 434 ILE A O   1 
+ATOM   2813 C CB  . ILE A 1 357 ? 14.144  50.434 51.871 1.00 28.04 ? ? ? ? ? ? 434 ILE A CB  1 
+ATOM   2814 C CG1 . ILE A 1 357 ? 14.793  49.874 50.609 1.00 29.51 ? ? ? ? ? ? 434 ILE A CG1 1 
+ATOM   2815 C CG2 . ILE A 1 357 ? 15.214  51.043 52.774 1.00 30.64 ? ? ? ? ? ? 434 ILE A CG2 1 
+ATOM   2816 C CD1 . ILE A 1 357 ? 15.513  50.931 49.786 1.00 29.19 ? ? ? ? ? ? 434 ILE A CD1 1 
+ATOM   2817 N N   . ASN A 1 358 ? 11.859  50.736 53.885 1.00 30.35 ? ? ? ? ? ? 435 ASN A N   1 
+ATOM   2818 C CA  . ASN A 1 358 ? 11.339  51.403 55.079 1.00 30.46 ? ? ? ? ? ? 435 ASN A CA  1 
+ATOM   2819 C C   . ASN A 1 358 ? 10.555  50.563 56.072 1.00 31.08 ? ? ? ? ? ? 435 ASN A C   1 
+ATOM   2820 O O   . ASN A 1 358 ? 10.710  50.741 57.280 1.00 28.38 ? ? ? ? ? ? 435 ASN A O   1 
+ATOM   2821 C CB  . ASN A 1 358 ? 10.493  52.621 54.689 1.00 28.53 ? ? ? ? ? ? 435 ASN A CB  1 
+ATOM   2822 C CG  . ASN A 1 358 ? 11.271  53.621 53.871 1.00 28.90 ? ? ? ? ? ? 435 ASN A CG  1 
+ATOM   2823 O OD1 . ASN A 1 358 ? 12.474  53.794 54.076 1.00 29.25 ? ? ? ? ? ? 435 ASN A OD1 1 
+ATOM   2824 N ND2 . ASN A 1 358 ? 10.589  54.308 52.954 1.00 24.14 ? ? ? ? ? ? 435 ASN A ND2 1 
+ATOM   2825 N N   . PHE A 1 359 ? 9.712   49.655 55.594 1.00 28.38 ? ? ? ? ? ? 436 PHE A N   1 
+ATOM   2826 C CA  . PHE A 1 359 ? 8.938   48.853 56.531 1.00 31.21 ? ? ? ? ? ? 436 PHE A CA  1 
+ATOM   2827 C C   . PHE A 1 359 ? 9.099   47.358 56.341 1.00 31.26 ? ? ? ? ? ? 436 PHE A C   1 
+ATOM   2828 O O   . PHE A 1 359 ? 8.407   46.571 56.993 1.00 30.57 ? ? ? ? ? ? 436 PHE A O   1 
+ATOM   2829 C CB  . PHE A 1 359 ? 7.450   49.209 56.440 1.00 33.86 ? ? ? ? ? ? 436 PHE A CB  1 
+ATOM   2830 C CG  . PHE A 1 359 ? 7.181   50.682 56.464 1.00 38.94 ? ? ? ? ? ? 436 PHE A CG  1 
+ATOM   2831 C CD1 . PHE A 1 359 ? 7.147   51.413 55.284 1.00 40.78 ? ? ? ? ? ? 436 PHE A CD1 1 
+ATOM   2832 C CD2 . PHE A 1 359 ? 7.016   51.353 57.671 1.00 40.53 ? ? ? ? ? ? 436 PHE A CD2 1 
+ATOM   2833 C CE1 . PHE A 1 359 ? 6.951   52.796 55.303 1.00 42.75 ? ? ? ? ? ? 436 PHE A CE1 1 
+ATOM   2834 C CE2 . PHE A 1 359 ? 6.822   52.735 57.699 1.00 39.71 ? ? ? ? ? ? 436 PHE A CE2 1 
+ATOM   2835 C CZ  . PHE A 1 359 ? 6.790   53.455 56.512 1.00 39.15 ? ? ? ? ? ? 436 PHE A CZ  1 
+ATOM   2836 N N   . GLY A 1 360 ? 10.013  46.963 55.463 1.00 27.70 ? ? ? ? ? ? 437 GLY A N   1 
+ATOM   2837 C CA  . GLY A 1 360 ? 10.197  45.547 55.214 1.00 26.94 ? ? ? ? ? ? 437 GLY A CA  1 
+ATOM   2838 C C   . GLY A 1 360 ? 8.934   44.970 54.591 1.00 25.34 ? ? ? ? ? ? 437 GLY A C   1 
+ATOM   2839 O O   . GLY A 1 360 ? 8.592   43.806 54.815 1.00 23.40 ? ? ? ? ? ? 437 GLY A O   1 
+ATOM   2840 N N   . SER A 1 361 ? 8.235   45.795 53.812 1.00 23.83 ? ? ? ? ? ? 438 SER A N   1 
+ATOM   2841 C CA  . SER A 1 361 ? 7.000   45.382 53.151 1.00 24.94 ? ? ? ? ? ? 438 SER A CA  1 
+ATOM   2842 C C   . SER A 1 361 ? 7.290   44.744 51.795 1.00 24.04 ? ? ? ? ? ? 438 SER A C   1 
+ATOM   2843 O O   . SER A 1 361 ? 7.081   45.366 50.749 1.00 23.49 ? ? ? ? ? ? 438 SER A O   1 
+ATOM   2844 C CB  . SER A 1 361 ? 6.084   46.589 52.944 1.00 24.53 ? ? ? ? ? ? 438 SER A CB  1 
+ATOM   2845 O OG  . SER A 1 361 ? 5.802   47.222 54.175 1.00 31.48 ? ? ? ? ? ? 438 SER A OG  1 
+ATOM   2846 N N   . PHE A 1 362 ? 7.786   43.512 51.814 1.00 22.25 ? ? ? ? ? ? 439 PHE A N   1 
+ATOM   2847 C CA  . PHE A 1 362 ? 8.086   42.813 50.573 1.00 21.56 ? ? ? ? ? ? 439 PHE A CA  1 
+ATOM   2848 C C   . PHE A 1 362 ? 6.832   42.166 49.998 1.00 18.23 ? ? ? ? ? ? 439 PHE A C   1 
+ATOM   2849 O O   . PHE A 1 362 ? 6.093   41.475 50.704 1.00 16.28 ? ? ? ? ? ? 439 PHE A O   1 
+ATOM   2850 C CB  . PHE A 1 362 ? 9.163   41.735 50.787 1.00 22.76 ? ? ? ? ? ? 439 PHE A CB  1 
+ATOM   2851 C CG  . PHE A 1 362 ? 10.516  42.284 51.177 1.00 22.60 ? ? ? ? ? ? 439 PHE A CG  1 
+ATOM   2852 C CD1 . PHE A 1 362 ? 10.862  42.454 52.514 1.00 21.51 ? ? ? ? ? ? 439 PHE A CD1 1 
+ATOM   2853 C CD2 . PHE A 1 362 ? 11.435  42.653 50.200 1.00 23.24 ? ? ? ? ? ? 439 PHE A CD2 1 
+ATOM   2854 C CE1 . PHE A 1 362 ? 12.101  42.982 52.871 1.00 19.05 ? ? ? ? ? ? 439 PHE A CE1 1 
+ATOM   2855 C CE2 . PHE A 1 362 ? 12.677  43.185 50.549 1.00 23.01 ? ? ? ? ? ? 439 PHE A CE2 1 
+ATOM   2856 C CZ  . PHE A 1 362 ? 13.009  43.349 51.886 1.00 19.04 ? ? ? ? ? ? 439 PHE A CZ  1 
+ATOM   2857 N N   . THR A 1 363 ? 6.579   42.419 48.717 1.00 18.69 ? ? ? ? ? ? 440 THR A N   1 
+ATOM   2858 C CA  . THR A 1 363 ? 5.431   41.835 48.026 1.00 15.30 ? ? ? ? ? ? 440 THR A CA  1 
+ATOM   2859 C C   . THR A 1 363 ? 5.829   41.706 46.566 1.00 16.33 ? ? ? ? ? ? 440 THR A C   1 
+ATOM   2860 O O   . THR A 1 363 ? 6.915   42.127 46.171 1.00 16.60 ? ? ? ? ? ? 440 THR A O   1 
+ATOM   2861 C CB  . THR A 1 363 ? 4.174   42.738 48.066 1.00 18.01 ? ? ? ? ? ? 440 THR A CB  1 
+ATOM   2862 O OG1 . THR A 1 363 ? 4.415   43.909 47.281 1.00 17.95 ? ? ? ? ? ? 440 THR A OG1 1 
+ATOM   2863 C CG2 . THR A 1 363 ? 3.825   43.149 49.504 1.00 18.60 ? ? ? ? ? ? 440 THR A CG2 1 
+ATOM   2864 N N   . ILE A 1 364 ? 4.952   41.134 45.754 1.00 14.76 ? ? ? ? ? ? 441 ILE A N   1 
+ATOM   2865 C CA  . ILE A 1 364 ? 5.274   41.011 44.347 1.00 14.26 ? ? ? ? ? ? 441 ILE A CA  1 
+ATOM   2866 C C   . ILE A 1 364 ? 5.433   42.421 43.750 1.00 14.48 ? ? ? ? ? ? 441 ILE A C   1 
+ATOM   2867 O O   . ILE A 1 364 ? 6.120   42.599 42.746 1.00 14.64 ? ? ? ? ? ? 441 ILE A O   1 
+ATOM   2868 C CB  . ILE A 1 364 ? 4.189   40.178 43.590 1.00 13.07 ? ? ? ? ? ? 441 ILE A CB  1 
+ATOM   2869 C CG1 . ILE A 1 364 ? 4.662   39.884 42.165 1.00 12.44 ? ? ? ? ? ? 441 ILE A CG1 1 
+ATOM   2870 C CG2 . ILE A 1 364 ? 2.851   40.892 43.600 1.00 14.53 ? ? ? ? ? ? 441 ILE A CG2 1 
+ATOM   2871 C CD1 . ILE A 1 364 ? 5.856   38.929 42.116 1.00 15.06 ? ? ? ? ? ? 441 ILE A CD1 1 
+ATOM   2872 N N   . LYS A 1 365 ? 4.827   43.431 44.380 1.00 12.33 ? ? ? ? ? ? 442 LYS A N   1 
+ATOM   2873 C CA  . LYS A 1 365 ? 4.961   44.797 43.879 1.00 14.56 ? ? ? ? ? ? 442 LYS A CA  1 
+ATOM   2874 C C   . LYS A 1 365 ? 6.343   45.398 44.144 1.00 15.80 ? ? ? ? ? ? 442 LYS A C   1 
+ATOM   2875 O O   . LYS A 1 365 ? 6.793   46.248 43.379 1.00 12.31 ? ? ? ? ? ? 442 LYS A O   1 
+ATOM   2876 C CB  . LYS A 1 365 ? 3.878   45.713 44.460 1.00 14.99 ? ? ? ? ? ? 442 LYS A CB  1 
+ATOM   2877 C CG  . LYS A 1 365 ? 2.465   45.391 43.965 1.00 17.40 ? ? ? ? ? ? 442 LYS A CG  1 
+ATOM   2878 C CD  . LYS A 1 365 ? 2.344   45.445 42.440 1.00 13.82 ? ? ? ? ? ? 442 LYS A CD  1 
+ATOM   2879 C CE  . LYS A 1 365 ? 0.888   45.242 42.003 1.00 18.53 ? ? ? ? ? ? 442 LYS A CE  1 
+ATOM   2880 N NZ  . LYS A 1 365 ? 0.717   45.115 40.523 1.00 17.10 ? ? ? ? ? ? 442 LYS A NZ  1 
+ATOM   2881 N N   . SER A 1 366 ? 7.006   44.993 45.230 1.00 12.78 ? ? ? ? ? ? 443 SER A N   1 
+ATOM   2882 C CA  . SER A 1 366 ? 8.346   45.510 45.479 1.00 14.07 ? ? ? ? ? ? 443 SER A CA  1 
+ATOM   2883 C C   . SER A 1 366 ? 9.282   44.875 44.443 1.00 11.28 ? ? ? ? ? ? 443 SER A C   1 
+ATOM   2884 O O   . SER A 1 366 ? 10.263  45.489 44.050 1.00 15.49 ? ? ? ? ? ? 443 SER A O   1 
+ATOM   2885 C CB  . SER A 1 366 ? 8.805   45.257 46.936 1.00 11.37 ? ? ? ? ? ? 443 SER A CB  1 
+ATOM   2886 O OG  . SER A 1 366 ? 8.705   43.906 47.353 1.00 15.99 ? ? ? ? ? ? 443 SER A OG  1 
+ATOM   2887 N N   . ASP A 1 367 ? 8.977   43.652 43.997 1.00 11.90 ? ? ? ? ? ? 444 ASP A N   1 
+ATOM   2888 C CA  . ASP A 1 367 ? 9.771   43.010 42.941 1.00 10.36 ? ? ? ? ? ? 444 ASP A CA  1 
+ATOM   2889 C C   . ASP A 1 367 ? 9.584   43.786 41.626 1.00 14.26 ? ? ? ? ? ? 444 ASP A C   1 
+ATOM   2890 O O   . ASP A 1 367 ? 10.524  43.936 40.846 1.00 12.13 ? ? ? ? ? ? 444 ASP A O   1 
+ATOM   2891 C CB  . ASP A 1 367 ? 9.347   41.553 42.682 1.00 11.64 ? ? ? ? ? ? 444 ASP A CB  1 
+ATOM   2892 C CG  . ASP A 1 367 ? 9.926   40.572 43.681 1.00 13.49 ? ? ? ? ? ? 444 ASP A CG  1 
+ATOM   2893 O OD1 . ASP A 1 367 ? 10.924  40.905 44.362 1.00 13.08 ? ? ? ? ? ? 444 ASP A OD1 1 
+ATOM   2894 O OD2 . ASP A 1 367 ? 9.398   39.443 43.753 1.00 15.37 ? ? ? ? ? ? 444 ASP A OD2 1 
+ATOM   2895 N N   . VAL A 1 368 ? 8.367   44.258 41.368 1.00 13.71 ? ? ? ? ? ? 445 VAL A N   1 
+ATOM   2896 C CA  . VAL A 1 368 ? 8.121   45.013 40.144 1.00 13.87 ? ? ? ? ? ? 445 VAL A CA  1 
+ATOM   2897 C C   . VAL A 1 368 ? 9.056   46.209 40.121 1.00 16.19 ? ? ? ? ? ? 445 VAL A C   1 
+ATOM   2898 O O   . VAL A 1 368 ? 9.655   46.509 39.091 1.00 15.78 ? ? ? ? ? ? 445 VAL A O   1 
+ATOM   2899 C CB  . VAL A 1 368 ? 6.665   45.502 40.044 1.00 16.53 ? ? ? ? ? ? 445 VAL A CB  1 
+ATOM   2900 C CG1 . VAL A 1 368 ? 6.533   46.486 38.882 1.00 15.96 ? ? ? ? ? ? 445 VAL A CG1 1 
+ATOM   2901 C CG2 . VAL A 1 368 ? 5.735   44.315 39.810 1.00 12.87 ? ? ? ? ? ? 445 VAL A CG2 1 
+ATOM   2902 N N   . TRP A 1 369 ? 9.180   46.899 41.252 1.00 17.86 ? ? ? ? ? ? 446 TRP A N   1 
+ATOM   2903 C CA  . TRP A 1 369 ? 10.103  48.026 41.320 1.00 19.73 ? ? ? ? ? ? 446 TRP A CA  1 
+ATOM   2904 C C   . TRP A 1 369 ? 11.496  47.522 40.923 1.00 20.03 ? ? ? ? ? ? 446 TRP A C   1 
+ATOM   2905 O O   . TRP A 1 369 ? 12.163  48.121 40.081 1.00 17.71 ? ? ? ? ? ? 446 TRP A O   1 
+ATOM   2906 C CB  . TRP A 1 369 ? 10.129  48.615 42.741 1.00 19.58 ? ? ? ? ? ? 446 TRP A CB  1 
+ATOM   2907 C CG  . TRP A 1 369 ? 11.129  49.725 42.937 1.00 20.31 ? ? ? ? ? ? 446 TRP A CG  1 
+ATOM   2908 C CD1 . TRP A 1 369 ? 12.492  49.617 42.922 1.00 18.89 ? ? ? ? ? ? 446 TRP A CD1 1 
+ATOM   2909 C CD2 . TRP A 1 369 ? 10.840  51.112 43.164 1.00 21.56 ? ? ? ? ? ? 446 TRP A CD2 1 
+ATOM   2910 N NE1 . TRP A 1 369 ? 13.069  50.849 43.123 1.00 19.88 ? ? ? ? ? ? 446 TRP A NE1 1 
+ATOM   2911 C CE2 . TRP A 1 369 ? 12.081  51.782 43.275 1.00 23.02 ? ? ? ? ? ? 446 TRP A CE2 1 
+ATOM   2912 C CE3 . TRP A 1 369 ? 9.657   51.853 43.282 1.00 22.75 ? ? ? ? ? ? 446 TRP A CE3 1 
+ATOM   2913 C CZ2 . TRP A 1 369 ? 12.169  53.163 43.499 1.00 22.56 ? ? ? ? ? ? 446 TRP A CZ2 1 
+ATOM   2914 C CZ3 . TRP A 1 369 ? 9.748   53.229 43.508 1.00 23.65 ? ? ? ? ? ? 446 TRP A CZ3 1 
+ATOM   2915 C CH2 . TRP A 1 369 ? 10.997  53.865 43.612 1.00 23.16 ? ? ? ? ? ? 446 TRP A CH2 1 
+ATOM   2916 N N   . SER A 1 370 ? 11.923  46.415 41.526 1.00 17.71 ? ? ? ? ? ? 447 SER A N   1 
+ATOM   2917 C CA  . SER A 1 370 ? 13.233  45.833 41.229 1.00 16.14 ? ? ? ? ? ? 447 SER A CA  1 
+ATOM   2918 C C   . SER A 1 370 ? 13.413  45.520 39.742 1.00 16.38 ? ? ? ? ? ? 447 SER A C   1 
+ATOM   2919 O O   . SER A 1 370 ? 14.482  45.755 39.178 1.00 16.10 ? ? ? ? ? ? 447 SER A O   1 
+ATOM   2920 C CB  . SER A 1 370 ? 13.446  44.549 42.040 1.00 16.45 ? ? ? ? ? ? 447 SER A CB  1 
+ATOM   2921 O OG  . SER A 1 370 ? 13.430  44.801 43.432 1.00 16.54 ? ? ? ? ? ? 447 SER A OG  1 
+ATOM   2922 N N   . PHE A 1 371 ? 12.368  44.989 39.111 1.00 15.72 ? ? ? ? ? ? 448 PHE A N   1 
+ATOM   2923 C CA  . PHE A 1 371 ? 12.428  44.653 37.689 1.00 15.55 ? ? ? ? ? ? 448 PHE A CA  1 
+ATOM   2924 C C   . PHE A 1 371 ? 12.729  45.910 36.867 1.00 17.05 ? ? ? ? ? ? 448 PHE A C   1 
+ATOM   2925 O O   . PHE A 1 371 ? 13.415  45.852 35.844 1.00 18.10 ? ? ? ? ? ? 448 PHE A O   1 
+ATOM   2926 C CB  . PHE A 1 371 ? 11.096  44.057 37.230 1.00 14.93 ? ? ? ? ? ? 448 PHE A CB  1 
+ATOM   2927 C CG  . PHE A 1 371 ? 11.095  43.624 35.794 1.00 14.38 ? ? ? ? ? ? 448 PHE A CG  1 
+ATOM   2928 C CD1 . PHE A 1 371 ? 11.678  42.420 35.416 1.00 18.31 ? ? ? ? ? ? 448 PHE A CD1 1 
+ATOM   2929 C CD2 . PHE A 1 371 ? 10.555  44.449 34.809 1.00 12.15 ? ? ? ? ? ? 448 PHE A CD2 1 
+ATOM   2930 C CE1 . PHE A 1 371 ? 11.728  42.035 34.075 1.00 17.49 ? ? ? ? ? ? 448 PHE A CE1 1 
+ATOM   2931 C CE2 . PHE A 1 371 ? 10.596  44.081 33.464 1.00 17.64 ? ? ? ? ? ? 448 PHE A CE2 1 
+ATOM   2932 C CZ  . PHE A 1 371 ? 11.183  42.871 33.092 1.00 16.35 ? ? ? ? ? ? 448 PHE A CZ  1 
+ATOM   2933 N N   . GLY A 1 372 ? 12.197  47.044 37.315 1.00 18.53 ? ? ? ? ? ? 449 GLY A N   1 
+ATOM   2934 C CA  . GLY A 1 372 ? 12.439  48.295 36.617 1.00 19.65 ? ? ? ? ? ? 449 GLY A CA  1 
+ATOM   2935 C C   . GLY A 1 372 ? 13.914  48.641 36.668 1.00 18.25 ? ? ? ? ? ? 449 GLY A C   1 
+ATOM   2936 O O   . GLY A 1 372 ? 14.498  49.051 35.673 1.00 18.33 ? ? ? ? ? ? 449 GLY A O   1 
+ATOM   2937 N N   . ILE A 1 373 ? 14.524  48.486 37.837 1.00 17.24 ? ? ? ? ? ? 450 ILE A N   1 
+ATOM   2938 C CA  . ILE A 1 373 ? 15.950  48.770 37.970 1.00 15.92 ? ? ? ? ? ? 450 ILE A CA  1 
+ATOM   2939 C C   . ILE A 1 373 ? 16.693  47.767 37.077 1.00 18.60 ? ? ? ? ? ? 450 ILE A C   1 
+ATOM   2940 O O   . ILE A 1 373 ? 17.633  48.129 36.373 1.00 21.10 ? ? ? ? ? ? 450 ILE A O   1 
+ATOM   2941 C CB  . ILE A 1 373 ? 16.413  48.632 39.453 1.00 16.33 ? ? ? ? ? ? 450 ILE A CB  1 
+ATOM   2942 C CG1 . ILE A 1 373 ? 15.558  49.534 40.355 1.00 15.37 ? ? ? ? ? ? 450 ILE A CG1 1 
+ATOM   2943 C CG2 . ILE A 1 373 ? 17.881  49.040 39.600 1.00 15.03 ? ? ? ? ? ? 450 ILE A CG2 1 
+ATOM   2944 C CD1 . ILE A 1 373 ? 15.702  51.047 40.084 1.00 16.18 ? ? ? ? ? ? 450 ILE A CD1 1 
+ATOM   2945 N N   . LEU A 1 374 ? 16.246  46.510 37.089 1.00 18.58 ? ? ? ? ? ? 451 LEU A N   1 
+ATOM   2946 C CA  . LEU A 1 374 ? 16.856  45.457 36.275 1.00 19.13 ? ? ? ? ? ? 451 LEU A CA  1 
+ATOM   2947 C C   . LEU A 1 374 ? 16.784  45.810 34.793 1.00 19.64 ? ? ? ? ? ? 451 LEU A C   1 
+ATOM   2948 O O   . LEU A 1 374 ? 17.728  45.550 34.040 1.00 18.43 ? ? ? ? ? ? 451 LEU A O   1 
+ATOM   2949 C CB  . LEU A 1 374 ? 16.155  44.108 36.514 1.00 14.91 ? ? ? ? ? ? 451 LEU A CB  1 
+ATOM   2950 C CG  . LEU A 1 374 ? 16.570  42.915 35.634 1.00 17.89 ? ? ? ? ? ? 451 LEU A CG  1 
+ATOM   2951 C CD1 . LEU A 1 374 ? 18.087  42.711 35.656 1.00 17.50 ? ? ? ? ? ? 451 LEU A CD1 1 
+ATOM   2952 C CD2 . LEU A 1 374 ? 15.850  41.656 36.131 1.00 19.89 ? ? ? ? ? ? 451 LEU A CD2 1 
+ATOM   2953 N N   . LEU A 1 375 ? 15.658  46.383 34.372 1.00 19.10 ? ? ? ? ? ? 452 LEU A N   1 
+ATOM   2954 C CA  . LEU A 1 375 ? 15.494  46.774 32.974 1.00 21.07 ? ? ? ? ? ? 452 LEU A CA  1 
+ATOM   2955 C C   . LEU A 1 375 ? 16.601  47.732 32.575 1.00 19.48 ? ? ? ? ? ? 452 LEU A C   1 
+ATOM   2956 O O   . LEU A 1 375 ? 17.168  47.613 31.489 1.00 22.06 ? ? ? ? ? ? 452 LEU A O   1 
+ATOM   2957 C CB  . LEU A 1 375 ? 14.138  47.451 32.737 1.00 20.73 ? ? ? ? ? ? 452 LEU A CB  1 
+ATOM   2958 C CG  . LEU A 1 375 ? 12.902  46.558 32.663 1.00 26.36 ? ? ? ? ? ? 452 LEU A CG  1 
+ATOM   2959 C CD1 . LEU A 1 375 ? 11.673  47.409 32.338 1.00 26.27 ? ? ? ? ? ? 452 LEU A CD1 1 
+ATOM   2960 C CD2 . LEU A 1 375 ? 13.110  45.504 31.572 1.00 29.02 ? ? ? ? ? ? 452 LEU A CD2 1 
+ATOM   2961 N N   . MET A 1 376 ? 16.902  48.676 33.465 1.00 20.04 ? ? ? ? ? ? 453 MET A N   1 
+ATOM   2962 C CA  . MET A 1 376 ? 17.944  49.666 33.218 1.00 22.89 ? ? ? ? ? ? 453 MET A CA  1 
+ATOM   2963 C C   . MET A 1 376 ? 19.310  48.991 33.173 1.00 22.51 ? ? ? ? ? ? 453 MET A C   1 
+ATOM   2964 O O   . MET A 1 376 ? 20.141  49.345 32.342 1.00 26.46 ? ? ? ? ? ? 453 MET A O   1 
+ATOM   2965 C CB  . MET A 1 376 ? 17.928  50.758 34.298 1.00 22.50 ? ? ? ? ? ? 453 MET A CB  1 
+ATOM   2966 C CG  . MET A 1 376 ? 18.936  51.884 34.046 1.00 25.83 ? ? ? ? ? ? 453 MET A CG  1 
+ATOM   2967 S SD  . MET A 1 376 ? 18.512  52.908 32.608 1.00 26.90 ? ? ? ? ? ? 453 MET A SD  1 
+ATOM   2968 C CE  . MET A 1 376 ? 17.117  53.775 33.285 1.00 27.04 ? ? ? ? ? ? 453 MET A CE  1 
+ATOM   2969 N N   . GLU A 1 377 ? 19.559  48.023 34.053 1.00 22.34 ? ? ? ? ? ? 454 GLU A N   1 
+ATOM   2970 C CA  . GLU A 1 377 ? 20.850  47.339 34.004 1.00 21.66 ? ? ? ? ? ? 454 GLU A CA  1 
+ATOM   2971 C C   . GLU A 1 377 ? 21.021  46.690 32.641 1.00 21.19 ? ? ? ? ? ? 454 GLU A C   1 
+ATOM   2972 O O   . GLU A 1 377 ? 22.086  46.764 32.034 1.00 24.50 ? ? ? ? ? ? 454 GLU A O   1 
+ATOM   2973 C CB  . GLU A 1 377 ? 20.965  46.208 35.029 1.00 22.27 ? ? ? ? ? ? 454 GLU A CB  1 
+ATOM   2974 C CG  . GLU A 1 377 ? 21.012  46.587 36.467 1.00 25.39 ? ? ? ? ? ? 454 GLU A CG  1 
+ATOM   2975 C CD  . GLU A 1 377 ? 21.270  45.368 37.342 1.00 24.68 ? ? ? ? ? ? 454 GLU A CD  1 
+ATOM   2976 O OE1 . GLU A 1 377 ? 22.447  45.000 37.565 1.00 23.93 ? ? ? ? ? ? 454 GLU A OE1 1 
+ATOM   2977 O OE2 . GLU A 1 377 ? 20.280  44.759 37.781 1.00 22.23 ? ? ? ? ? ? 454 GLU A OE2 1 
+ATOM   2978 N N   . ILE A 1 378 ? 19.967  46.025 32.180 1.00 20.14 ? ? ? ? ? ? 455 ILE A N   1 
+ATOM   2979 C CA  . ILE A 1 378 ? 20.004  45.328 30.903 1.00 19.71 ? ? ? ? ? ? 455 ILE A CA  1 
+ATOM   2980 C C   . ILE A 1 378 ? 20.234  46.241 29.701 1.00 22.93 ? ? ? ? ? ? 455 ILE A C   1 
+ATOM   2981 O O   . ILE A 1 378 ? 21.128  45.989 28.882 1.00 21.96 ? ? ? ? ? ? 455 ILE A O   1 
+ATOM   2982 C CB  . ILE A 1 378 ? 18.707  44.512 30.691 1.00 21.77 ? ? ? ? ? ? 455 ILE A CB  1 
+ATOM   2983 C CG1 . ILE A 1 378 ? 18.613  43.410 31.759 1.00 19.96 ? ? ? ? ? ? 455 ILE A CG1 1 
+ATOM   2984 C CG2 . ILE A 1 378 ? 18.678  43.932 29.289 1.00 19.38 ? ? ? ? ? ? 455 ILE A CG2 1 
+ATOM   2985 C CD1 . ILE A 1 378 ? 17.365  42.550 31.682 1.00 21.23 ? ? ? ? ? ? 455 ILE A CD1 1 
+ATOM   2986 N N   . VAL A 1 379 ? 19.439  47.302 29.598 1.00 19.10 ? ? ? ? ? ? 456 VAL A N   1 
+ATOM   2987 C CA  . VAL A 1 379 ? 19.563  48.223 28.474 1.00 22.08 ? ? ? ? ? ? 456 VAL A CA  1 
+ATOM   2988 C C   . VAL A 1 379 ? 20.890  48.984 28.496 1.00 24.41 ? ? ? ? ? ? 456 VAL A C   1 
+ATOM   2989 O O   . VAL A 1 379 ? 21.291  49.567 27.491 1.00 25.90 ? ? ? ? ? ? 456 VAL A O   1 
+ATOM   2990 C CB  . VAL A 1 379 ? 18.366  49.226 28.429 1.00 24.63 ? ? ? ? ? ? 456 VAL A CB  1 
+ATOM   2991 C CG1 . VAL A 1 379 ? 18.394  50.150 29.629 1.00 27.16 ? ? ? ? ? ? 456 VAL A CG1 1 
+ATOM   2992 C CG2 . VAL A 1 379 ? 18.395  50.019 27.138 1.00 31.09 ? ? ? ? ? ? 456 VAL A CG2 1 
+ATOM   2993 N N   . THR A 1 380 ? 21.581  48.965 29.632 1.00 26.20 ? ? ? ? ? ? 457 THR A N   1 
+ATOM   2994 C CA  . THR A 1 380 ? 22.868  49.648 29.732 1.00 29.03 ? ? ? ? ? ? 457 THR A CA  1 
+ATOM   2995 C C   . THR A 1 380 ? 24.024  48.656 29.793 1.00 27.81 ? ? ? ? ? ? 457 THR A C   1 
+ATOM   2996 O O   . THR A 1 380 ? 25.152  49.020 30.131 1.00 25.73 ? ? ? ? ? ? 457 THR A O   1 
+ATOM   2997 C CB  . THR A 1 380 ? 22.945  50.540 30.976 1.00 29.04 ? ? ? ? ? ? 457 THR A CB  1 
+ATOM   2998 O OG1 . THR A 1 380 ? 22.803  49.733 32.150 1.00 30.85 ? ? ? ? ? ? 457 THR A OG1 1 
+ATOM   2999 C CG2 . THR A 1 380 ? 21.852  51.595 30.940 1.00 26.78 ? ? ? ? ? ? 457 THR A CG2 1 
+ATOM   3000 N N   . TYR A 1 381 ? 23.735  47.399 29.479 1.00 25.59 ? ? ? ? ? ? 458 TYR A N   1 
+ATOM   3001 C CA  . TYR A 1 381 ? 24.758  46.362 29.481 1.00 26.23 ? ? ? ? ? ? 458 TYR A CA  1 
+ATOM   3002 C C   . TYR A 1 381 ? 25.435  46.095 30.832 1.00 25.04 ? ? ? ? ? ? 458 TYR A C   1 
+ATOM   3003 O O   . TYR A 1 381 ? 26.643  45.869 30.902 1.00 24.97 ? ? ? ? ? ? 458 TYR A O   1 
+ATOM   3004 C CB  . TYR A 1 381 ? 25.798  46.700 28.407 1.00 26.83 ? ? ? ? ? ? 458 TYR A CB  1 
+ATOM   3005 C CG  . TYR A 1 381 ? 25.247  46.574 27.002 1.00 26.82 ? ? ? ? ? ? 458 TYR A CG  1 
+ATOM   3006 C CD1 . TYR A 1 381 ? 25.244  45.343 26.345 1.00 25.82 ? ? ? ? ? ? 458 TYR A CD1 1 
+ATOM   3007 C CD2 . TYR A 1 381 ? 24.672  47.672 26.350 1.00 27.42 ? ? ? ? ? ? 458 TYR A CD2 1 
+ATOM   3008 C CE1 . TYR A 1 381 ? 24.687  45.201 25.076 1.00 25.54 ? ? ? ? ? ? 458 TYR A CE1 1 
+ATOM   3009 C CE2 . TYR A 1 381 ? 24.107  47.539 25.074 1.00 29.08 ? ? ? ? ? ? 458 TYR A CE2 1 
+ATOM   3010 C CZ  . TYR A 1 381 ? 24.118  46.300 24.446 1.00 27.66 ? ? ? ? ? ? 458 TYR A CZ  1 
+ATOM   3011 O OH  . TYR A 1 381 ? 23.565  46.154 23.192 1.00 31.80 ? ? ? ? ? ? 458 TYR A OH  1 
+ATOM   3012 N N   . GLY A 1 382 ? 24.654  46.123 31.905 1.00 25.10 ? ? ? ? ? ? 459 GLY A N   1 
+ATOM   3013 C CA  . GLY A 1 382 ? 25.207  45.841 33.219 1.00 26.23 ? ? ? ? ? ? 459 GLY A CA  1 
+ATOM   3014 C C   . GLY A 1 382 ? 25.737  47.001 34.036 1.00 27.75 ? ? ? ? ? ? 459 GLY A C   1 
+ATOM   3015 O O   . GLY A 1 382 ? 26.350  46.782 35.081 1.00 27.13 ? ? ? ? ? ? 459 GLY A O   1 
+ATOM   3016 N N   . ARG A 1 383 ? 25.518  48.231 33.581 1.00 29.79 ? ? ? ? ? ? 460 ARG A N   1 
+ATOM   3017 C CA  . ARG A 1 383 ? 25.999  49.387 34.332 1.00 31.34 ? ? ? ? ? ? 460 ARG A CA  1 
+ATOM   3018 C C   . ARG A 1 383 ? 25.339  49.390 35.700 1.00 31.24 ? ? ? ? ? ? 460 ARG A C   1 
+ATOM   3019 O O   . ARG A 1 383 ? 24.207  48.941 35.852 1.00 31.10 ? ? ? ? ? ? 460 ARG A O   1 
+ATOM   3020 C CB  . ARG A 1 383 ? 25.640  50.695 33.626 1.00 35.29 ? ? ? ? ? ? 460 ARG A CB  1 
+ATOM   3021 C CG  . ARG A 1 383 ? 26.153  51.944 34.352 1.00 41.46 ? ? ? ? ? ? 460 ARG A CG  1 
+ATOM   3022 C CD  . ARG A 1 383 ? 25.369  53.183 33.940 1.00 44.88 ? ? ? ? ? ? 460 ARG A CD  1 
+ATOM   3023 N NE  . ARG A 1 383 ? 23.980  53.085 34.385 1.00 49.46 ? ? ? ? ? ? 460 ARG A NE  1 
+ATOM   3024 C CZ  . ARG A 1 383 ? 23.029  53.964 34.088 1.00 52.12 ? ? ? ? ? ? 460 ARG A CZ  1 
+ATOM   3025 N NH1 . ARG A 1 383 ? 23.304  55.024 33.339 1.00 51.07 ? ? ? ? ? ? 460 ARG A NH1 1 
+ATOM   3026 N NH2 . ARG A 1 383 ? 21.796  53.780 34.542 1.00 52.21 ? ? ? ? ? ? 460 ARG A NH2 1 
+ATOM   3027 N N   . ILE A 1 384 ? 26.046  49.913 36.690 1.00 32.11 ? ? ? ? ? ? 461 ILE A N   1 
+ATOM   3028 C CA  . ILE A 1 384 ? 25.520  49.984 38.045 1.00 33.49 ? ? ? ? ? ? 461 ILE A CA  1 
+ATOM   3029 C C   . ILE A 1 384 ? 24.395  51.029 38.093 1.00 32.55 ? ? ? ? ? ? 461 ILE A C   1 
+ATOM   3030 O O   . ILE A 1 384 ? 24.449  52.031 37.382 1.00 30.83 ? ? ? ? ? ? 461 ILE A O   1 
+ATOM   3031 C CB  . ILE A 1 384 ? 26.627  50.423 39.029 1.00 36.39 ? ? ? ? ? ? 461 ILE A CB  1 
+ATOM   3032 C CG1 . ILE A 1 384 ? 27.870  49.539 38.866 1.00 36.98 ? ? ? ? ? ? 461 ILE A CG1 1 
+ATOM   3033 C CG2 . ILE A 1 384 ? 26.107  50.377 40.455 1.00 36.51 ? ? ? ? ? ? 461 ILE A CG2 1 
+ATOM   3034 C CD1 . ILE A 1 384 ? 27.643  48.074 39.128 1.00 40.95 ? ? ? ? ? ? 461 ILE A CD1 1 
+ATOM   3035 N N   . PRO A 1 385 ? 23.344  50.788 38.902 1.00 30.46 ? ? ? ? ? ? 462 PRO A N   1 
+ATOM   3036 C CA  . PRO A 1 385 ? 22.225  51.731 39.032 1.00 28.48 ? ? ? ? ? ? 462 PRO A CA  1 
+ATOM   3037 C C   . PRO A 1 385 ? 22.698  52.985 39.791 1.00 28.11 ? ? ? ? ? ? 462 PRO A C   1 
+ATOM   3038 O O   . PRO A 1 385 ? 23.634  52.910 40.582 1.00 24.43 ? ? ? ? ? ? 462 PRO A O   1 
+ATOM   3039 C CB  . PRO A 1 385 ? 21.204  50.931 39.842 1.00 28.65 ? ? ? ? ? ? 462 PRO A CB  1 
+ATOM   3040 C CG  . PRO A 1 385 ? 21.586  49.471 39.541 1.00 33.34 ? ? ? ? ? ? 462 PRO A CG  1 
+ATOM   3041 C CD  . PRO A 1 385 ? 23.072  49.595 39.718 1.00 32.01 ? ? ? ? ? ? 462 PRO A CD  1 
+ATOM   3042 N N   . TYR A 1 386 ? 22.035  54.118 39.572 1.00 29.61 ? ? ? ? ? ? 463 TYR A N   1 
+ATOM   3043 C CA  . TYR A 1 386 ? 22.404  55.378 40.224 1.00 28.23 ? ? ? ? ? ? 463 TYR A CA  1 
+ATOM   3044 C C   . TYR A 1 386 ? 23.923  55.525 40.332 1.00 31.07 ? ? ? ? ? ? 463 TYR A C   1 
+ATOM   3045 O O   . TYR A 1 386 ? 24.471  55.637 41.433 1.00 27.74 ? ? ? ? ? ? 463 TYR A O   1 
+ATOM   3046 C CB  . TYR A 1 386 ? 21.803  55.464 41.627 1.00 29.02 ? ? ? ? ? ? 463 TYR A CB  1 
+ATOM   3047 C CG  . TYR A 1 386 ? 20.333  55.141 41.682 1.00 29.15 ? ? ? ? ? ? 463 TYR A CG  1 
+ATOM   3048 C CD1 . TYR A 1 386 ? 19.897  53.823 41.800 1.00 27.04 ? ? ? ? ? ? 463 TYR A CD1 1 
+ATOM   3049 C CD2 . TYR A 1 386 ? 19.374  56.147 41.553 1.00 27.52 ? ? ? ? ? ? 463 TYR A CD2 1 
+ATOM   3050 C CE1 . TYR A 1 386 ? 18.542  53.512 41.789 1.00 27.03 ? ? ? ? ? ? 463 TYR A CE1 1 
+ATOM   3051 C CE2 . TYR A 1 386 ? 18.009  55.846 41.538 1.00 28.52 ? ? ? ? ? ? 463 TYR A CE2 1 
+ATOM   3052 C CZ  . TYR A 1 386 ? 17.603  54.528 41.657 1.00 26.91 ? ? ? ? ? ? 463 TYR A CZ  1 
+ATOM   3053 O OH  . TYR A 1 386 ? 16.265  54.221 41.660 1.00 23.35 ? ? ? ? ? ? 463 TYR A OH  1 
+ATOM   3054 N N   . PRO A 1 387 ? 24.617  55.545 39.187 1.00 32.79 ? ? ? ? ? ? 464 PRO A N   1 
+ATOM   3055 C CA  . PRO A 1 387 ? 26.076  55.673 39.137 1.00 36.62 ? ? ? ? ? ? 464 PRO A CA  1 
+ATOM   3056 C C   . PRO A 1 387 ? 26.618  56.885 39.885 1.00 39.25 ? ? ? ? ? ? 464 PRO A C   1 
+ATOM   3057 O O   . PRO A 1 387 ? 26.271  58.024 39.573 1.00 41.96 ? ? ? ? ? ? 464 PRO A O   1 
+ATOM   3058 C CB  . PRO A 1 387 ? 26.356  55.733 37.634 1.00 39.08 ? ? ? ? ? ? 464 PRO A CB  1 
+ATOM   3059 C CG  . PRO A 1 387 ? 25.064  56.350 37.081 1.00 39.06 ? ? ? ? ? ? 464 PRO A CG  1 
+ATOM   3060 C CD  . PRO A 1 387 ? 24.073  55.483 37.821 1.00 35.59 ? ? ? ? ? ? 464 PRO A CD  1 
+ATOM   3061 N N   . GLY A 1 388 ? 27.461  56.627 40.880 1.00 38.99 ? ? ? ? ? ? 465 GLY A N   1 
+ATOM   3062 C CA  . GLY A 1 388 ? 28.056  57.705 41.650 1.00 41.00 ? ? ? ? ? ? 465 GLY A CA  1 
+ATOM   3063 C C   . GLY A 1 388 ? 27.303  58.111 42.901 1.00 41.57 ? ? ? ? ? ? 465 GLY A C   1 
+ATOM   3064 O O   . GLY A 1 388 ? 27.826  58.863 43.722 1.00 41.21 ? ? ? ? ? ? 465 GLY A O   1 
+ATOM   3065 N N   . MET A 1 389 ? 26.079  57.623 43.057 1.00 41.31 ? ? ? ? ? ? 466 MET A N   1 
+ATOM   3066 C CA  . MET A 1 389 ? 25.279  57.966 44.229 1.00 41.51 ? ? ? ? ? ? 466 MET A CA  1 
+ATOM   3067 C C   . MET A 1 389 ? 25.439  56.934 45.333 1.00 42.25 ? ? ? ? ? ? 466 MET A C   1 
+ATOM   3068 O O   . MET A 1 389 ? 25.686  55.756 45.062 1.00 42.84 ? ? ? ? ? ? 466 MET A O   1 
+ATOM   3069 C CB  . MET A 1 389 ? 23.800  58.067 43.850 1.00 40.62 ? ? ? ? ? ? 466 MET A CB  1 
+ATOM   3070 C CG  . MET A 1 389 ? 23.512  59.071 42.750 1.00 38.99 ? ? ? ? ? ? 466 MET A CG  1 
+ATOM   3071 S SD  . MET A 1 389 ? 21.751  59.203 42.365 1.00 36.04 ? ? ? ? ? ? 466 MET A SD  1 
+ATOM   3072 C CE  . MET A 1 389 ? 21.098  59.755 43.904 1.00 33.29 ? ? ? ? ? ? 466 MET A CE  1 
+ATOM   3073 N N   . SER A 1 390 ? 25.299  57.378 46.579 1.00 42.53 ? ? ? ? ? ? 467 SER A N   1 
+ATOM   3074 C CA  . SER A 1 390 ? 25.413  56.466 47.709 1.00 43.45 ? ? ? ? ? ? 467 SER A CA  1 
+ATOM   3075 C C   . SER A 1 390 ? 24.009  56.038 48.111 1.00 42.81 ? ? ? ? ? ? 467 SER A C   1 
+ATOM   3076 O O   . SER A 1 390 ? 23.022  56.655 47.709 1.00 42.83 ? ? ? ? ? ? 467 SER A O   1 
+ATOM   3077 C CB  . SER A 1 390 ? 26.108  57.139 48.899 1.00 43.57 ? ? ? ? ? ? 467 SER A CB  1 
+ATOM   3078 O OG  . SER A 1 390 ? 25.283  58.124 49.500 1.00 46.68 ? ? ? ? ? ? 467 SER A OG  1 
+ATOM   3079 N N   . ASN A 1 391 ? 23.919  54.979 48.903 1.00 42.01 ? ? ? ? ? ? 468 ASN A N   1 
+ATOM   3080 C CA  . ASN A 1 391 ? 22.624  54.480 49.342 1.00 42.13 ? ? ? ? ? ? 468 ASN A CA  1 
+ATOM   3081 C C   . ASN A 1 391 ? 21.772  55.556 50.014 1.00 39.20 ? ? ? ? ? ? 468 ASN A C   1 
+ATOM   3082 O O   . ASN A 1 391 ? 20.579  55.667 49.746 1.00 35.85 ? ? ? ? ? ? 468 ASN A O   1 
+ATOM   3083 C CB  . ASN A 1 391 ? 22.817  53.290 50.286 1.00 40.67 ? ? ? ? ? ? 468 ASN A CB  1 
+ATOM   3084 C CG  . ASN A 1 391 ? 23.394  52.075 49.583 1.00 42.59 ? ? ? ? ? ? 468 ASN A CG  1 
+ATOM   3085 O OD1 . ASN A 1 391 ? 23.756  51.089 50.225 1.00 44.96 ? ? ? ? ? ? 468 ASN A OD1 1 
+ATOM   3086 N ND2 . ASN A 1 391 ? 23.467  52.134 48.256 1.00 39.82 ? ? ? ? ? ? 468 ASN A ND2 1 
+ATOM   3087 N N   . PRO A 1 392 ? 22.371  56.361 50.902 1.00 38.04 ? ? ? ? ? ? 469 PRO A N   1 
+ATOM   3088 C CA  . PRO A 1 392 ? 21.604  57.410 51.578 1.00 37.26 ? ? ? ? ? ? 469 PRO A CA  1 
+ATOM   3089 C C   . PRO A 1 392 ? 21.068  58.455 50.602 1.00 34.79 ? ? ? ? ? ? 469 PRO A C   1 
+ATOM   3090 O O   . PRO A 1 392 ? 19.955  58.957 50.761 1.00 35.50 ? ? ? ? ? ? 469 PRO A O   1 
+ATOM   3091 C CB  . PRO A 1 392 ? 22.628  57.990 52.556 1.00 38.86 ? ? ? ? ? ? 469 PRO A CB  1 
+ATOM   3092 C CG  . PRO A 1 392 ? 23.548  56.795 52.814 1.00 38.95 ? ? ? ? ? ? 469 PRO A CG  1 
+ATOM   3093 C CD  . PRO A 1 392 ? 23.759  56.377 51.387 1.00 39.03 ? ? ? ? ? ? 469 PRO A CD  1 
+ATOM   3094 N N   . GLU A 1 393 ? 21.870  58.774 49.592 1.00 29.96 ? ? ? ? ? ? 470 GLU A N   1 
+ATOM   3095 C CA  . GLU A 1 393 ? 21.492  59.758 48.590 1.00 31.75 ? ? ? ? ? ? 470 GLU A CA  1 
+ATOM   3096 C C   . GLU A 1 393 ? 20.380  59.242 47.685 1.00 30.49 ? ? ? ? ? ? 470 GLU A C   1 
+ATOM   3097 O O   . GLU A 1 393 ? 19.504  60.004 47.271 1.00 25.72 ? ? ? ? ? ? 470 GLU A O   1 
+ATOM   3098 C CB  . GLU A 1 393 ? 22.710  60.131 47.746 1.00 34.07 ? ? ? ? ? ? 470 GLU A CB  1 
+ATOM   3099 C CG  . GLU A 1 393 ? 23.871  60.661 48.564 1.00 36.61 ? ? ? ? ? ? 470 GLU A CG  1 
+ATOM   3100 C CD  . GLU A 1 393 ? 25.064  61.023 47.710 1.00 38.33 ? ? ? ? ? ? 470 GLU A CD  1 
+ATOM   3101 O OE1 . GLU A 1 393 ? 25.531  60.149 46.949 1.00 38.17 ? ? ? ? ? ? 470 GLU A OE1 1 
+ATOM   3102 O OE2 . GLU A 1 393 ? 25.537  62.178 47.804 1.00 39.96 ? ? ? ? ? ? 470 GLU A OE2 1 
+ATOM   3103 N N   . VAL A 1 394 ? 20.421  57.949 47.372 1.00 29.01 ? ? ? ? ? ? 471 VAL A N   1 
+ATOM   3104 C CA  . VAL A 1 394 ? 19.405  57.352 46.514 1.00 25.22 ? ? ? ? ? ? 471 VAL A CA  1 
+ATOM   3105 C C   . VAL A 1 394 ? 18.072  57.355 47.245 1.00 26.94 ? ? ? ? ? ? 471 VAL A C   1 
+ATOM   3106 O O   . VAL A 1 394 ? 17.045  57.752 46.684 1.00 25.08 ? ? ? ? ? ? 471 VAL A O   1 
+ATOM   3107 C CB  . VAL A 1 394 ? 19.773  55.897 46.124 1.00 27.10 ? ? ? ? ? ? 471 VAL A CB  1 
+ATOM   3108 C CG1 . VAL A 1 394 ? 18.682  55.291 45.249 1.00 23.32 ? ? ? ? ? ? 471 VAL A CG1 1 
+ATOM   3109 C CG2 . VAL A 1 394 ? 21.081  55.886 45.370 1.00 25.71 ? ? ? ? ? ? 471 VAL A CG2 1 
+ATOM   3110 N N   . ILE A 1 395 ? 18.097  56.922 48.504 1.00 25.02 ? ? ? ? ? ? 472 ILE A N   1 
+ATOM   3111 C CA  . ILE A 1 395 ? 16.892  56.868 49.320 1.00 27.85 ? ? ? ? ? ? 472 ILE A CA  1 
+ATOM   3112 C C   . ILE A 1 395 ? 16.264  58.255 49.428 1.00 30.73 ? ? ? ? ? ? 472 ILE A C   1 
+ATOM   3113 O O   . ILE A 1 395 ? 15.042  58.401 49.333 1.00 31.59 ? ? ? ? ? ? 472 ILE A O   1 
+ATOM   3114 C CB  . ILE A 1 395 ? 17.200  56.317 50.732 1.00 27.62 ? ? ? ? ? ? 472 ILE A CB  1 
+ATOM   3115 C CG1 . ILE A 1 395 ? 17.703  54.873 50.616 1.00 29.41 ? ? ? ? ? ? 472 ILE A CG1 1 
+ATOM   3116 C CG2 . ILE A 1 395 ? 15.953  56.388 51.608 1.00 31.42 ? ? ? ? ? ? 472 ILE A CG2 1 
+ATOM   3117 C CD1 . ILE A 1 395 ? 18.044  54.209 51.940 1.00 30.58 ? ? ? ? ? ? 472 ILE A CD1 1 
+ATOM   3118 N N   . ARG A 1 396 ? 17.108  59.268 49.616 1.00 30.36 ? ? ? ? ? ? 473 ARG A N   1 
+ATOM   3119 C CA  . ARG A 1 396 ? 16.647  60.649 49.717 1.00 31.50 ? ? ? ? ? ? 473 ARG A CA  1 
+ATOM   3120 C C   . ARG A 1 396 ? 16.104  61.195 48.404 1.00 29.87 ? ? ? ? ? ? 473 ARG A C   1 
+ATOM   3121 O O   . ARG A 1 396 ? 15.048  61.827 48.379 1.00 28.22 ? ? ? ? ? ? 473 ARG A O   1 
+ATOM   3122 C CB  . ARG A 1 396 ? 17.780  61.553 50.212 1.00 32.82 ? ? ? ? ? ? 473 ARG A CB  1 
+ATOM   3123 C CG  . ARG A 1 396 ? 17.770  61.731 51.707 1.00 42.81 ? ? ? ? ? ? 473 ARG A CG  1 
+ATOM   3124 C CD  . ARG A 1 396 ? 16.499  62.466 52.101 1.00 47.83 ? ? ? ? ? ? 473 ARG A CD  1 
+ATOM   3125 N NE  . ARG A 1 396 ? 16.312  62.522 53.544 1.00 53.65 ? ? ? ? ? ? 473 ARG A NE  1 
+ATOM   3126 C CZ  . ARG A 1 396 ? 15.294  63.134 54.139 1.00 53.53 ? ? ? ? ? ? 473 ARG A CZ  1 
+ATOM   3127 N NH1 . ARG A 1 396 ? 14.368  63.747 53.415 1.00 54.45 ? ? ? ? ? ? 473 ARG A NH1 1 
+ATOM   3128 N NH2 . ARG A 1 396 ? 15.195  63.119 55.459 1.00 54.57 ? ? ? ? ? ? 473 ARG A NH2 1 
+ATOM   3129 N N   . ALA A 1 397 ? 16.836  60.960 47.320 1.00 27.24 ? ? ? ? ? ? 474 ALA A N   1 
+ATOM   3130 C CA  . ALA A 1 397 ? 16.424  61.430 46.008 1.00 29.09 ? ? ? ? ? ? 474 ALA A CA  1 
+ATOM   3131 C C   . ALA A 1 397 ? 15.072  60.846 45.594 1.00 28.85 ? ? ? ? ? ? 474 ALA A C   1 
+ATOM   3132 O O   . ALA A 1 397 ? 14.204  61.571 45.116 1.00 28.15 ? ? ? ? ? ? 474 ALA A O   1 
+ATOM   3133 C CB  . ALA A 1 397 ? 17.488  61.079 44.975 1.00 27.64 ? ? ? ? ? ? 474 ALA A CB  1 
+ATOM   3134 N N   . LEU A 1 398 ? 14.895  59.539 45.780 1.00 29.49 ? ? ? ? ? ? 475 LEU A N   1 
+ATOM   3135 C CA  . LEU A 1 398 ? 13.643  58.876 45.415 1.00 27.57 ? ? ? ? ? ? 475 LEU A CA  1 
+ATOM   3136 C C   . LEU A 1 398 ? 12.464  59.468 46.177 1.00 29.89 ? ? ? ? ? ? 475 LEU A C   1 
+ATOM   3137 O O   . LEU A 1 398 ? 11.368  59.612 45.631 1.00 28.32 ? ? ? ? ? ? 475 LEU A O   1 
+ATOM   3138 C CB  . LEU A 1 398 ? 13.737  57.369 45.685 1.00 23.49 ? ? ? ? ? ? 475 LEU A CB  1 
+ATOM   3139 C CG  . LEU A 1 398 ? 14.756  56.590 44.839 1.00 22.50 ? ? ? ? ? ? 475 LEU A CG  1 
+ATOM   3140 C CD1 . LEU A 1 398 ? 14.879  55.133 45.336 1.00 19.28 ? ? ? ? ? ? 475 LEU A CD1 1 
+ATOM   3141 C CD2 . LEU A 1 398 ? 14.319  56.626 43.382 1.00 19.45 ? ? ? ? ? ? 475 LEU A CD2 1 
+ATOM   3142 N N   . GLU A 1 399 ? 12.691  59.804 47.444 1.00 29.44 ? ? ? ? ? ? 476 GLU A N   1 
+ATOM   3143 C CA  . GLU A 1 399 ? 11.648  60.401 48.267 1.00 31.06 ? ? ? ? ? ? 476 GLU A CA  1 
+ATOM   3144 C C   . GLU A 1 399 ? 11.302  61.783 47.712 1.00 28.79 ? ? ? ? ? ? 476 GLU A C   1 
+ATOM   3145 O O   . GLU A 1 399 ? 10.165  62.236 47.833 1.00 27.67 ? ? ? ? ? ? 476 GLU A O   1 
+ATOM   3146 C CB  . GLU A 1 399 ? 12.116  60.501 49.733 1.00 33.63 ? ? ? ? ? ? 476 GLU A CB  1 
+ATOM   3147 C CG  . GLU A 1 399 ? 12.211  59.143 50.440 1.00 38.16 ? ? ? ? ? ? 476 GLU A CG  1 
+ATOM   3148 C CD  . GLU A 1 399 ? 12.923  59.187 51.798 1.00 41.97 ? ? ? ? ? ? 476 GLU A CD  1 
+ATOM   3149 O OE1 . GLU A 1 399 ? 12.869  58.168 52.523 1.00 40.84 ? ? ? ? ? ? 476 GLU A OE1 1 
+ATOM   3150 O OE2 . GLU A 1 399 ? 13.547  60.217 52.138 1.00 39.13 ? ? ? ? ? ? 476 GLU A OE2 1 
+ATOM   3151 N N   . ARG A 1 400 ? 12.285  62.430 47.085 1.00 27.70 ? ? ? ? ? ? 477 ARG A N   1 
+ATOM   3152 C CA  . ARG A 1 400 ? 12.110  63.762 46.508 1.00 30.68 ? ? ? ? ? ? 477 ARG A CA  1 
+ATOM   3153 C C   . ARG A 1 400 ? 11.399  63.719 45.159 1.00 31.73 ? ? ? ? ? ? 477 ARG A C   1 
+ATOM   3154 O O   . ARG A 1 400 ? 10.817  64.710 44.727 1.00 31.88 ? ? ? ? ? ? 477 ARG A O   1 
+ATOM   3155 C CB  . ARG A 1 400 ? 13.461  64.442 46.353 1.00 33.75 ? ? ? ? ? ? 477 ARG A CB  1 
+ATOM   3156 N N   . GLY A 1 401 ? 11.452  62.570 44.495 1.00 31.20 ? ? ? ? ? ? 478 GLY A N   1 
+ATOM   3157 C CA  . GLY A 1 401 ? 10.794  62.436 43.208 1.00 28.77 ? ? ? ? ? ? 478 GLY A CA  1 
+ATOM   3158 C C   . GLY A 1 401 ? 11.764  62.095 42.096 1.00 27.78 ? ? ? ? ? ? 478 GLY A C   1 
+ATOM   3159 O O   . GLY A 1 401 ? 11.365  61.887 40.951 1.00 27.00 ? ? ? ? ? ? 478 GLY A O   1 
+ATOM   3160 N N   . TYR A 1 402 ? 13.047  62.050 42.433 1.00 23.87 ? ? ? ? ? ? 479 TYR A N   1 
+ATOM   3161 C CA  . TYR A 1 402 ? 14.077  61.720 41.461 1.00 24.61 ? ? ? ? ? ? 479 TYR A CA  1 
+ATOM   3162 C C   . TYR A 1 402 ? 13.920  60.295 40.941 1.00 26.17 ? ? ? ? ? ? 479 TYR A C   1 
+ATOM   3163 O O   . TYR A 1 402 ? 13.462  59.402 41.654 1.00 28.42 ? ? ? ? ? ? 479 TYR A O   1 
+ATOM   3164 C CB  . TYR A 1 402 ? 15.460  61.838 42.099 1.00 26.25 ? ? ? ? ? ? 479 TYR A CB  1 
+ATOM   3165 C CG  . TYR A 1 402 ? 16.598  61.453 41.178 1.00 24.44 ? ? ? ? ? ? 479 TYR A CG  1 
+ATOM   3166 C CD1 . TYR A 1 402 ? 17.013  62.301 40.153 1.00 28.10 ? ? ? ? ? ? 479 TYR A CD1 1 
+ATOM   3167 C CD2 . TYR A 1 402 ? 17.240  60.223 41.315 1.00 26.32 ? ? ? ? ? ? 479 TYR A CD2 1 
+ATOM   3168 C CE1 . TYR A 1 402 ? 18.042  61.932 39.286 1.00 27.67 ? ? ? ? ? ? 479 TYR A CE1 1 
+ATOM   3169 C CE2 . TYR A 1 402 ? 18.264  59.845 40.456 1.00 24.23 ? ? ? ? ? ? 479 TYR A CE2 1 
+ATOM   3170 C CZ  . TYR A 1 402 ? 18.660  60.702 39.445 1.00 25.73 ? ? ? ? ? ? 479 TYR A CZ  1 
+ATOM   3171 O OH  . TYR A 1 402 ? 19.667  60.320 38.594 1.00 27.67 ? ? ? ? ? ? 479 TYR A OH  1 
+ATOM   3172 N N   . ARG A 1 403 ? 14.321  60.096 39.693 1.00 26.79 ? ? ? ? ? ? 480 ARG A N   1 
+ATOM   3173 C CA  . ARG A 1 403 ? 14.293  58.791 39.048 1.00 28.17 ? ? ? ? ? ? 480 ARG A CA  1 
+ATOM   3174 C C   . ARG A 1 403 ? 15.425  58.830 38.032 1.00 29.15 ? ? ? ? ? ? 480 ARG A C   1 
+ATOM   3175 O O   . ARG A 1 403 ? 15.653  59.868 37.408 1.00 28.31 ? ? ? ? ? ? 480 ARG A O   1 
+ATOM   3176 C CB  . ARG A 1 403 ? 12.957  58.563 38.339 1.00 23.89 ? ? ? ? ? ? 480 ARG A CB  1 
+ATOM   3177 C CG  . ARG A 1 403 ? 11.759  58.439 39.280 1.00 28.89 ? ? ? ? ? ? 480 ARG A CG  1 
+ATOM   3178 C CD  . ARG A 1 403 ? 11.823  57.154 40.084 1.00 28.09 ? ? ? ? ? ? 480 ARG A CD  1 
+ATOM   3179 N NE  . ARG A 1 403 ? 10.638  56.937 40.915 1.00 28.31 ? ? ? ? ? ? 480 ARG A NE  1 
+ATOM   3180 C CZ  . ARG A 1 403 ? 10.379  57.573 42.054 1.00 29.91 ? ? ? ? ? ? 480 ARG A CZ  1 
+ATOM   3181 N NH1 . ARG A 1 403 ? 11.225  58.483 42.520 1.00 30.64 ? ? ? ? ? ? 480 ARG A NH1 1 
+ATOM   3182 N NH2 . ARG A 1 403 ? 9.274   57.287 42.733 1.00 26.68 ? ? ? ? ? ? 480 ARG A NH2 1 
+ATOM   3183 N N   . MET A 1 404 ? 16.157  57.729 37.883 1.00 28.37 ? ? ? ? ? ? 481 MET A N   1 
+ATOM   3184 C CA  . MET A 1 404 ? 17.246  57.708 36.913 1.00 29.52 ? ? ? ? ? ? 481 MET A CA  1 
+ATOM   3185 C C   . MET A 1 404 ? 16.718  58.132 35.553 1.00 29.34 ? ? ? ? ? ? 481 MET A C   1 
+ATOM   3186 O O   . MET A 1 404 ? 15.651  57.687 35.129 1.00 31.02 ? ? ? ? ? ? 481 MET A O   1 
+ATOM   3187 C CB  . MET A 1 404 ? 17.856  56.313 36.777 1.00 31.15 ? ? ? ? ? ? 481 MET A CB  1 
+ATOM   3188 C CG  . MET A 1 404 ? 18.677  55.835 37.962 1.00 31.92 ? ? ? ? ? ? 481 MET A CG  1 
+ATOM   3189 S SD  . MET A 1 404 ? 19.363  54.198 37.612 1.00 33.13 ? ? ? ? ? ? 481 MET A SD  1 
+ATOM   3190 C CE  . MET A 1 404 ? 17.848  53.223 37.505 1.00 28.87 ? ? ? ? ? ? 481 MET A CE  1 
+ATOM   3191 N N   . PRO A 1 405 ? 17.448  59.024 34.866 1.00 30.83 ? ? ? ? ? ? 482 PRO A N   1 
+ATOM   3192 C CA  . PRO A 1 405 ? 17.080  59.526 33.539 1.00 30.42 ? ? ? ? ? ? 482 PRO A CA  1 
+ATOM   3193 C C   . PRO A 1 405 ? 17.203  58.427 32.483 1.00 31.87 ? ? ? ? ? ? 482 PRO A C   1 
+ATOM   3194 O O   . PRO A 1 405 ? 17.863  57.413 32.711 1.00 31.44 ? ? ? ? ? ? 482 PRO A O   1 
+ATOM   3195 C CB  . PRO A 1 405 ? 18.091  60.650 33.322 1.00 32.23 ? ? ? ? ? ? 482 PRO A CB  1 
+ATOM   3196 C CG  . PRO A 1 405 ? 19.322  60.096 34.026 1.00 31.33 ? ? ? ? ? ? 482 PRO A CG  1 
+ATOM   3197 C CD  . PRO A 1 405 ? 18.673  59.698 35.336 1.00 27.89 ? ? ? ? ? ? 482 PRO A CD  1 
+ATOM   3198 N N   . ARG A 1 406 ? 16.571  58.631 31.331 1.00 31.14 ? ? ? ? ? ? 483 ARG A N   1 
+ATOM   3199 C CA  . ARG A 1 406 ? 16.622  57.656 30.246 1.00 31.28 ? ? ? ? ? ? 483 ARG A CA  1 
+ATOM   3200 C C   . ARG A 1 406 ? 17.925  57.729 29.456 1.00 33.21 ? ? ? ? ? ? 483 ARG A C   1 
+ATOM   3201 O O   . ARG A 1 406 ? 18.302  58.790 28.968 1.00 32.15 ? ? ? ? ? ? 483 ARG A O   1 
+ATOM   3202 C CB  . ARG A 1 406 ? 15.450  57.868 29.281 1.00 31.52 ? ? ? ? ? ? 483 ARG A CB  1 
+ATOM   3203 C CG  . ARG A 1 406 ? 15.455  56.910 28.081 1.00 31.95 ? ? ? ? ? ? 483 ARG A CG  1 
+ATOM   3204 C CD  . ARG A 1 406 ? 14.208  57.053 27.205 1.00 32.59 ? ? ? ? ? ? 483 ARG A CD  1 
+ATOM   3205 N NE  . ARG A 1 406 ? 14.135  58.322 26.484 1.00 36.70 ? ? ? ? ? ? 483 ARG A NE  1 
+ATOM   3206 C CZ  . ARG A 1 406 ? 14.919  58.657 25.463 1.00 37.29 ? ? ? ? ? ? 483 ARG A CZ  1 
+ATOM   3207 N NH1 . ARG A 1 406 ? 15.849  57.820 25.028 1.00 41.18 ? ? ? ? ? ? 483 ARG A NH1 1 
+ATOM   3208 N NH2 . ARG A 1 406 ? 14.779  59.838 24.878 1.00 38.85 ? ? ? ? ? ? 483 ARG A NH2 1 
+ATOM   3209 N N   . PRO A 1 407 ? 18.630  56.595 29.317 1.00 35.54 ? ? ? ? ? ? 484 PRO A N   1 
+ATOM   3210 C CA  . PRO A 1 407 ? 19.895  56.526 28.575 1.00 36.23 ? ? ? ? ? ? 484 PRO A CA  1 
+ATOM   3211 C C   . PRO A 1 407 ? 19.646  56.738 27.080 1.00 38.94 ? ? ? ? ? ? 484 PRO A C   1 
+ATOM   3212 O O   . PRO A 1 407 ? 18.535  56.521 26.598 1.00 38.73 ? ? ? ? ? ? 484 PRO A O   1 
+ATOM   3213 C CB  . PRO A 1 407 ? 20.388  55.109 28.880 1.00 37.04 ? ? ? ? ? ? 484 PRO A CB  1 
+ATOM   3214 C CG  . PRO A 1 407 ? 19.715  54.793 30.214 1.00 36.28 ? ? ? ? ? ? 484 PRO A CG  1 
+ATOM   3215 C CD  . PRO A 1 407 ? 18.323  55.273 29.882 1.00 34.21 ? ? ? ? ? ? 484 PRO A CD  1 
+ATOM   3216 N N   . GLU A 1 408 ? 20.680  57.146 26.351 1.00 42.50 ? ? ? ? ? ? 485 GLU A N   1 
+ATOM   3217 C CA  . GLU A 1 408 ? 20.562  57.397 24.912 1.00 45.38 ? ? ? ? ? ? 485 GLU A CA  1 
+ATOM   3218 C C   . GLU A 1 408 ? 20.060  56.212 24.088 1.00 45.15 ? ? ? ? ? ? 485 GLU A C   1 
+ATOM   3219 O O   . GLU A 1 408 ? 19.209  56.373 23.213 1.00 44.84 ? ? ? ? ? ? 485 GLU A O   1 
+ATOM   3220 C CB  . GLU A 1 408 ? 21.910  57.850 24.340 1.00 51.03 ? ? ? ? ? ? 485 GLU A CB  1 
+ATOM   3221 C CG  . GLU A 1 408 ? 21.906  58.044 22.820 1.00 56.34 ? ? ? ? ? ? 485 GLU A CG  1 
+ATOM   3222 C CD  . GLU A 1 408 ? 23.284  58.380 22.261 1.00 60.17 ? ? ? ? ? ? 485 GLU A CD  1 
+ATOM   3223 O OE1 . GLU A 1 408 ? 23.856  59.415 22.666 1.00 60.71 ? ? ? ? ? ? 485 GLU A OE1 1 
+ATOM   3224 O OE2 . GLU A 1 408 ? 23.793  57.607 21.417 1.00 61.52 ? ? ? ? ? ? 485 GLU A OE2 1 
+ATOM   3225 N N   . ASN A 1 409 ? 20.596  55.027 24.352 1.00 43.77 ? ? ? ? ? ? 486 ASN A N   1 
+ATOM   3226 C CA  . ASN A 1 409 ? 20.193  53.845 23.601 1.00 44.80 ? ? ? ? ? ? 486 ASN A CA  1 
+ATOM   3227 C C   . ASN A 1 409 ? 18.974  53.131 24.173 1.00 42.81 ? ? ? ? ? ? 486 ASN A C   1 
+ATOM   3228 O O   . ASN A 1 409 ? 18.763  51.946 23.919 1.00 43.81 ? ? ? ? ? ? 486 ASN A O   1 
+ATOM   3229 C CB  . ASN A 1 409 ? 21.363  52.867 23.499 1.00 46.89 ? ? ? ? ? ? 486 ASN A CB  1 
+ATOM   3230 C CG  . ASN A 1 409 ? 22.507  53.421 22.675 1.00 52.48 ? ? ? ? ? ? 486 ASN A CG  1 
+ATOM   3231 O OD1 . ASN A 1 409 ? 22.315  53.828 21.527 1.00 55.33 ? ? ? ? ? ? 486 ASN A OD1 1 
+ATOM   3232 N ND2 . ASN A 1 409 ? 23.706  53.436 23.252 1.00 52.18 ? ? ? ? ? ? 486 ASN A ND2 1 
+ATOM   3233 N N   . CYS A 1 410 ? 18.170  53.857 24.942 1.00 39.76 ? ? ? ? ? ? 487 CYS A N   1 
+ATOM   3234 C CA  . CYS A 1 410 ? 16.973  53.279 25.538 1.00 34.85 ? ? ? ? ? ? 487 CYS A CA  1 
+ATOM   3235 C C   . CYS A 1 410 ? 15.716  53.914 24.958 1.00 33.82 ? ? ? ? ? ? 487 CYS A C   1 
+ATOM   3236 O O   . CYS A 1 410 ? 15.435  55.086 25.196 1.00 32.07 ? ? ? ? ? ? 487 CYS A O   1 
+ATOM   3237 C CB  . CYS A 1 410 ? 16.986  53.471 27.055 1.00 33.25 ? ? ? ? ? ? 487 CYS A CB  1 
+ATOM   3238 S SG  . CYS A 1 410 ? 15.500  52.846 27.878 1.00 30.26 ? ? ? ? ? ? 487 CYS A SG  1 
+ATOM   3239 N N   . PRO A 1 411 ? 14.939  53.141 24.189 1.00 33.05 ? ? ? ? ? ? 488 PRO A N   1 
+ATOM   3240 C CA  . PRO A 1 411 ? 13.710  53.661 23.589 1.00 34.02 ? ? ? ? ? ? 488 PRO A CA  1 
+ATOM   3241 C C   . PRO A 1 411 ? 12.779  54.218 24.664 1.00 33.17 ? ? ? ? ? ? 488 PRO A C   1 
+ATOM   3242 O O   . PRO A 1 411 ? 12.735  53.704 25.788 1.00 30.98 ? ? ? ? ? ? 488 PRO A O   1 
+ATOM   3243 C CB  . PRO A 1 411 ? 13.137  52.430 22.881 1.00 33.67 ? ? ? ? ? ? 488 PRO A CB  1 
+ATOM   3244 C CG  . PRO A 1 411 ? 13.677  51.285 23.738 1.00 34.41 ? ? ? ? ? ? 488 PRO A CG  1 
+ATOM   3245 C CD  . PRO A 1 411 ? 15.111  51.724 23.836 1.00 31.59 ? ? ? ? ? ? 488 PRO A CD  1 
+ATOM   3246 N N   . GLU A 1 412 ? 12.048  55.274 24.322 1.00 28.83 ? ? ? ? ? ? 489 GLU A N   1 
+ATOM   3247 C CA  . GLU A 1 412 ? 11.120  55.893 25.264 1.00 31.07 ? ? ? ? ? ? 489 GLU A CA  1 
+ATOM   3248 C C   . GLU A 1 412 ? 10.076  54.920 25.784 1.00 26.34 ? ? ? ? ? ? 489 GLU A C   1 
+ATOM   3249 O O   . GLU A 1 412 ? 9.717   54.966 26.959 1.00 27.48 ? ? ? ? ? ? 489 GLU A O   1 
+ATOM   3250 C CB  . GLU A 1 412 ? 10.408  57.092 24.625 1.00 32.75 ? ? ? ? ? ? 489 GLU A CB  1 
+ATOM   3251 C CG  . GLU A 1 412 ? 11.300  58.291 24.378 1.00 43.54 ? ? ? ? ? ? 489 GLU A CG  1 
+ATOM   3252 C CD  . GLU A 1 412 ? 10.547  59.447 23.744 1.00 51.63 ? ? ? ? ? ? 489 GLU A CD  1 
+ATOM   3253 O OE1 . GLU A 1 412 ? 10.118  59.308 22.576 1.00 52.92 ? ? ? ? ? ? 489 GLU A OE1 1 
+ATOM   3254 O OE2 . GLU A 1 412 ? 10.374  60.488 24.418 1.00 54.00 ? ? ? ? ? ? 489 GLU A OE2 1 
+ATOM   3255 N N   . GLU A 1 413 ? 9.579   54.047 24.915 1.00 27.44 ? ? ? ? ? ? 490 GLU A N   1 
+ATOM   3256 C CA  . GLU A 1 413 ? 8.568   53.083 25.330 1.00 28.74 ? ? ? ? ? ? 490 GLU A CA  1 
+ATOM   3257 C C   . GLU A 1 413 ? 9.108   52.159 26.415 1.00 28.88 ? ? ? ? ? ? 490 GLU A C   1 
+ATOM   3258 O O   . GLU A 1 413 ? 8.378   51.775 27.326 1.00 28.60 ? ? ? ? ? ? 490 GLU A O   1 
+ATOM   3259 C CB  . GLU A 1 413 ? 8.090   52.233 24.148 1.00 31.96 ? ? ? ? ? ? 490 GLU A CB  1 
+ATOM   3260 C CG  . GLU A 1 413 ? 7.399   52.996 23.030 1.00 39.86 ? ? ? ? ? ? 490 GLU A CG  1 
+ATOM   3261 C CD  . GLU A 1 413 ? 8.333   53.936 22.297 1.00 44.73 ? ? ? ? ? ? 490 GLU A CD  1 
+ATOM   3262 O OE1 . GLU A 1 413 ? 9.383   53.469 21.807 1.00 45.96 ? ? ? ? ? ? 490 GLU A OE1 1 
+ATOM   3263 O OE2 . GLU A 1 413 ? 8.013   55.139 22.201 1.00 51.63 ? ? ? ? ? ? 490 GLU A OE2 1 
+ATOM   3264 N N   . LEU A 1 414 ? 10.383  51.794 26.317 1.00 27.16 ? ? ? ? ? ? 491 LEU A N   1 
+ATOM   3265 C CA  . LEU A 1 414 ? 10.974  50.910 27.311 1.00 26.59 ? ? ? ? ? ? 491 LEU A CA  1 
+ATOM   3266 C C   . LEU A 1 414 ? 11.162  51.689 28.607 1.00 26.78 ? ? ? ? ? ? 491 LEU A C   1 
+ATOM   3267 O O   . LEU A 1 414 ? 10.962  51.160 29.703 1.00 24.69 ? ? ? ? ? ? 491 LEU A O   1 
+ATOM   3268 C CB  . LEU A 1 414 ? 12.317  50.364 26.818 1.00 27.57 ? ? ? ? ? ? 491 LEU A CB  1 
+ATOM   3269 C CG  . LEU A 1 414 ? 12.990  49.374 27.775 1.00 31.18 ? ? ? ? ? ? 491 LEU A CG  1 
+ATOM   3270 C CD1 . LEU A 1 414 ? 12.088  48.161 27.973 1.00 28.40 ? ? ? ? ? ? 491 LEU A CD1 1 
+ATOM   3271 C CD2 . LEU A 1 414 ? 14.341  48.942 27.205 1.00 28.87 ? ? ? ? ? ? 491 LEU A CD2 1 
+ATOM   3272 N N   . TYR A 1 415 ? 11.535  52.956 28.476 1.00 25.28 ? ? ? ? ? ? 492 TYR A N   1 
+ATOM   3273 C CA  . TYR A 1 415 ? 11.727  53.809 29.638 1.00 22.47 ? ? ? ? ? ? 492 TYR A CA  1 
+ATOM   3274 C C   . TYR A 1 415 ? 10.383  54.028 30.341 1.00 23.62 ? ? ? ? ? ? 492 TYR A C   1 
+ATOM   3275 O O   . TYR A 1 415 ? 10.307  54.043 31.580 1.00 22.28 ? ? ? ? ? ? 492 TYR A O   1 
+ATOM   3276 C CB  . TYR A 1 415 ? 12.326  55.153 29.215 1.00 24.63 ? ? ? ? ? ? 492 TYR A CB  1 
+ATOM   3277 C CG  . TYR A 1 415 ? 12.676  56.059 30.377 1.00 25.60 ? ? ? ? ? ? 492 TYR A CG  1 
+ATOM   3278 C CD1 . TYR A 1 415 ? 13.656  55.696 31.301 1.00 27.79 ? ? ? ? ? ? 492 TYR A CD1 1 
+ATOM   3279 C CD2 . TYR A 1 415 ? 12.017  57.272 30.562 1.00 26.10 ? ? ? ? ? ? 492 TYR A CD2 1 
+ATOM   3280 C CE1 . TYR A 1 415 ? 13.968  56.516 32.376 1.00 23.59 ? ? ? ? ? ? 492 TYR A CE1 1 
+ATOM   3281 C CE2 . TYR A 1 415 ? 12.321  58.099 31.632 1.00 25.41 ? ? ? ? ? ? 492 TYR A CE2 1 
+ATOM   3282 C CZ  . TYR A 1 415 ? 13.296  57.717 32.534 1.00 26.95 ? ? ? ? ? ? 492 TYR A CZ  1 
+ATOM   3283 O OH  . TYR A 1 415 ? 13.601  58.542 33.586 1.00 26.10 ? ? ? ? ? ? 492 TYR A OH  1 
+ATOM   3284 N N   . ASN A 1 416 ? 9.318   54.186 29.557 1.00 20.75 ? ? ? ? ? ? 493 ASN A N   1 
+ATOM   3285 C CA  . ASN A 1 416 ? 8.000   54.392 30.147 1.00 22.36 ? ? ? ? ? ? 493 ASN A CA  1 
+ATOM   3286 C C   . ASN A 1 416 ? 7.622   53.238 31.065 1.00 20.69 ? ? ? ? ? ? 493 ASN A C   1 
+ATOM   3287 O O   . ASN A 1 416 ? 7.020   53.449 32.115 1.00 24.16 ? ? ? ? ? ? 493 ASN A O   1 
+ATOM   3288 C CB  . ASN A 1 416 ? 6.922   54.569 29.074 1.00 24.15 ? ? ? ? ? ? 493 ASN A CB  1 
+ATOM   3289 C CG  . ASN A 1 416 ? 7.032   55.900 28.354 1.00 32.80 ? ? ? ? ? ? 493 ASN A CG  1 
+ATOM   3290 O OD1 . ASN A 1 416 ? 7.342   56.924 28.969 1.00 34.75 ? ? ? ? ? ? 493 ASN A OD1 1 
+ATOM   3291 N ND2 . ASN A 1 416 ? 6.749   55.901 27.054 1.00 34.19 ? ? ? ? ? ? 493 ASN A ND2 1 
+ATOM   3292 N N   . ILE A 1 417 ? 7.973   52.021 30.669 1.00 20.38 ? ? ? ? ? ? 494 ILE A N   1 
+ATOM   3293 C CA  . ILE A 1 417 ? 7.675   50.856 31.494 1.00 22.01 ? ? ? ? ? ? 494 ILE A CA  1 
+ATOM   3294 C C   . ILE A 1 417 ? 8.461   50.959 32.801 1.00 21.18 ? ? ? ? ? ? 494 ILE A C   1 
+ATOM   3295 O O   . ILE A 1 417 ? 7.918   50.733 33.878 1.00 23.78 ? ? ? ? ? ? 494 ILE A O   1 
+ATOM   3296 C CB  . ILE A 1 417 ? 8.022   49.553 30.747 1.00 23.61 ? ? ? ? ? ? 494 ILE A CB  1 
+ATOM   3297 C CG1 . ILE A 1 417 ? 7.145   49.448 29.494 1.00 26.42 ? ? ? ? ? ? 494 ILE A CG1 1 
+ATOM   3298 C CG2 . ILE A 1 417 ? 7.810   48.345 31.657 1.00 25.67 ? ? ? ? ? ? 494 ILE A CG2 1 
+ATOM   3299 C CD1 . ILE A 1 417 ? 7.410   48.231 28.641 1.00 28.36 ? ? ? ? ? ? 494 ILE A CD1 1 
+ATOM   3300 N N   . MET A 1 418 ? 9.739   51.312 32.709 1.00 21.59 ? ? ? ? ? ? 495 MET A N   1 
+ATOM   3301 C CA  . MET A 1 418 ? 10.558  51.471 33.908 1.00 23.60 ? ? ? ? ? ? 495 MET A CA  1 
+ATOM   3302 C C   . MET A 1 418 ? 9.862   52.445 34.863 1.00 20.98 ? ? ? ? ? ? 495 MET A C   1 
+ATOM   3303 O O   . MET A 1 418 ? 9.679   52.153 36.047 1.00 19.81 ? ? ? ? ? ? 495 MET A O   1 
+ATOM   3304 C CB  . MET A 1 418 ? 11.937  52.041 33.559 1.00 20.97 ? ? ? ? ? ? 495 MET A CB  1 
+ATOM   3305 C CG  . MET A 1 418 ? 12.785  51.188 32.627 1.00 25.61 ? ? ? ? ? ? 495 MET A CG  1 
+ATOM   3306 S SD  . MET A 1 418 ? 14.400  51.963 32.345 1.00 22.34 ? ? ? ? ? ? 495 MET A SD  1 
+ATOM   3307 C CE  . MET A 1 418 ? 15.086  50.913 31.091 1.00 21.47 ? ? ? ? ? ? 495 MET A CE  1 
+ATOM   3308 N N   . MET A 1 419 ? 9.470   53.604 34.335 1.00 18.66 ? ? ? ? ? ? 496 MET A N   1 
+ATOM   3309 C CA  . MET A 1 419 ? 8.824   54.626 35.152 1.00 20.90 ? ? ? ? ? ? 496 MET A CA  1 
+ATOM   3310 C C   . MET A 1 419 ? 7.581   54.120 35.860 1.00 19.18 ? ? ? ? ? ? 496 MET A C   1 
+ATOM   3311 O O   . MET A 1 419 ? 7.307   54.522 36.986 1.00 20.91 ? ? ? ? ? ? 496 MET A O   1 
+ATOM   3312 C CB  . MET A 1 419 ? 8.498   55.874 34.312 1.00 20.32 ? ? ? ? ? ? 496 MET A CB  1 
+ATOM   3313 C CG  . MET A 1 419 ? 9.736   56.674 33.929 1.00 23.42 ? ? ? ? ? ? 496 MET A CG  1 
+ATOM   3314 S SD  . MET A 1 419 ? 10.586  57.431 35.367 1.00 27.24 ? ? ? ? ? ? 496 MET A SD  1 
+ATOM   3315 C CE  . MET A 1 419 ? 9.402   58.679 35.862 1.00 30.44 ? ? ? ? ? ? 496 MET A CE  1 
+ATOM   3316 N N   . ARG A 1 420 ? 6.830   53.234 35.212 1.00 19.91 ? ? ? ? ? ? 497 ARG A N   1 
+ATOM   3317 C CA  . ARG A 1 420 ? 5.636   52.691 35.843 1.00 22.22 ? ? ? ? ? ? 497 ARG A CA  1 
+ATOM   3318 C C   . ARG A 1 420 ? 6.035   51.733 36.961 1.00 23.43 ? ? ? ? ? ? 497 ARG A C   1 
+ATOM   3319 O O   . ARG A 1 420 ? 5.341   51.629 37.977 1.00 22.27 ? ? ? ? ? ? 497 ARG A O   1 
+ATOM   3320 C CB  . ARG A 1 420 ? 4.752   51.986 34.813 1.00 24.12 ? ? ? ? ? ? 497 ARG A CB  1 
+ATOM   3321 C CG  . ARG A 1 420 ? 4.137   52.927 33.769 1.00 26.85 ? ? ? ? ? ? 497 ARG A CG  1 
+ATOM   3322 C CD  . ARG A 1 420 ? 3.083   52.194 32.959 1.00 29.59 ? ? ? ? ? ? 497 ARG A CD  1 
+ATOM   3323 N NE  . ARG A 1 420 ? 2.048   51.671 33.848 1.00 37.25 ? ? ? ? ? ? 497 ARG A NE  1 
+ATOM   3324 C CZ  . ARG A 1 420 ? 1.034   50.904 33.465 1.00 40.41 ? ? ? ? ? ? 497 ARG A CZ  1 
+ATOM   3325 N NH1 . ARG A 1 420 ? 0.898   50.558 32.192 1.00 38.41 ? ? ? ? ? ? 497 ARG A NH1 1 
+ATOM   3326 N NH2 . ARG A 1 420 ? 0.157   50.473 34.364 1.00 41.82 ? ? ? ? ? ? 497 ARG A NH2 1 
+ATOM   3327 N N   . CYS A 1 421 ? 7.154   51.038 36.777 1.00 21.20 ? ? ? ? ? ? 498 CYS A N   1 
+ATOM   3328 C CA  . CYS A 1 421 ? 7.639   50.123 37.804 1.00 20.68 ? ? ? ? ? ? 498 CYS A CA  1 
+ATOM   3329 C C   . CYS A 1 421 ? 8.075   50.888 39.044 1.00 20.43 ? ? ? ? ? ? 498 CYS A C   1 
+ATOM   3330 O O   . CYS A 1 421 ? 7.969   50.376 40.161 1.00 20.84 ? ? ? ? ? ? 498 CYS A O   1 
+ATOM   3331 C CB  . CYS A 1 421 ? 8.828   49.304 37.299 1.00 19.75 ? ? ? ? ? ? 498 CYS A CB  1 
+ATOM   3332 S SG  . CYS A 1 421 ? 8.381   48.072 36.084 1.00 19.34 ? ? ? ? ? ? 498 CYS A SG  1 
+ATOM   3333 N N   . TRP A 1 422 ? 8.560   52.112 38.845 1.00 20.79 ? ? ? ? ? ? 499 TRP A N   1 
+ATOM   3334 C CA  . TRP A 1 422 ? 9.041   52.927 39.958 1.00 22.26 ? ? ? ? ? ? 499 TRP A CA  1 
+ATOM   3335 C C   . TRP A 1 422 ? 8.028   53.886 40.574 1.00 23.52 ? ? ? ? ? ? 499 TRP A C   1 
+ATOM   3336 O O   . TRP A 1 422 ? 8.403   54.964 41.039 1.00 25.98 ? ? ? ? ? ? 499 TRP A O   1 
+ATOM   3337 C CB  . TRP A 1 422 ? 10.280  53.732 39.551 1.00 21.99 ? ? ? ? ? ? 499 TRP A CB  1 
+ATOM   3338 C CG  . TRP A 1 422 ? 11.388  52.909 38.981 1.00 21.07 ? ? ? ? ? ? 499 TRP A CG  1 
+ATOM   3339 C CD1 . TRP A 1 422 ? 11.777  51.659 39.376 1.00 20.79 ? ? ? ? ? ? 499 TRP A CD1 1 
+ATOM   3340 C CD2 . TRP A 1 422 ? 12.293  53.303 37.946 1.00 20.27 ? ? ? ? ? ? 499 TRP A CD2 1 
+ATOM   3341 N NE1 . TRP A 1 422 ? 12.872  51.250 38.647 1.00 19.82 ? ? ? ? ? ? 499 TRP A NE1 1 
+ATOM   3342 C CE2 . TRP A 1 422 ? 13.208  52.242 37.762 1.00 19.99 ? ? ? ? ? ? 499 TRP A CE2 1 
+ATOM   3343 C CE3 . TRP A 1 422 ? 12.420  54.453 37.154 1.00 20.76 ? ? ? ? ? ? 499 TRP A CE3 1 
+ATOM   3344 C CZ2 . TRP A 1 422 ? 14.238  52.298 36.821 1.00 22.05 ? ? ? ? ? ? 499 TRP A CZ2 1 
+ATOM   3345 C CZ3 . TRP A 1 422 ? 13.440  54.509 36.219 1.00 19.77 ? ? ? ? ? ? 499 TRP A CZ3 1 
+ATOM   3346 C CH2 . TRP A 1 422 ? 14.338  53.437 36.060 1.00 23.72 ? ? ? ? ? ? 499 TRP A CH2 1 
+ATOM   3347 N N   . LYS A 1 423 ? 6.754   53.512 40.575 1.00 22.20 ? ? ? ? ? ? 500 LYS A N   1 
+ATOM   3348 C CA  . LYS A 1 423 ? 5.743   54.361 41.189 1.00 23.61 ? ? ? ? ? ? 500 LYS A CA  1 
+ATOM   3349 C C   . LYS A 1 423 ? 5.910   54.237 42.687 1.00 25.33 ? ? ? ? ? ? 500 LYS A C   1 
+ATOM   3350 O O   . LYS A 1 423 ? 6.157   53.144 43.203 1.00 20.53 ? ? ? ? ? ? 500 LYS A O   1 
+ATOM   3351 C CB  . LYS A 1 423 ? 4.330   53.922 40.797 1.00 24.99 ? ? ? ? ? ? 500 LYS A CB  1 
+ATOM   3352 C CG  . LYS A 1 423 ? 3.936   54.323 39.393 1.00 26.30 ? ? ? ? ? ? 500 LYS A CG  1 
+ATOM   3353 C CD  . LYS A 1 423 ? 4.028   55.841 39.240 1.00 30.76 ? ? ? ? ? ? 500 LYS A CD  1 
+ATOM   3354 C CE  . LYS A 1 423 ? 3.441   56.312 37.924 1.00 37.05 ? ? ? ? ? ? 500 LYS A CE  1 
+ATOM   3355 N NZ  . LYS A 1 423 ? 1.995   55.948 37.849 1.00 44.39 ? ? ? ? ? ? 500 LYS A NZ  1 
+ATOM   3356 N N   . ASN A 1 424 ? 5.780   55.354 43.387 1.00 23.08 ? ? ? ? ? ? 501 ASN A N   1 
+ATOM   3357 C CA  . ASN A 1 424 ? 5.923   55.333 44.827 1.00 25.92 ? ? ? ? ? ? 501 ASN A CA  1 
+ATOM   3358 C C   . ASN A 1 424 ? 4.854   54.448 45.454 1.00 26.50 ? ? ? ? ? ? 501 ASN A C   1 
+ATOM   3359 O O   . ASN A 1 424 ? 5.129   53.708 46.399 1.00 28.08 ? ? ? ? ? ? 501 ASN A O   1 
+ATOM   3360 C CB  . ASN A 1 424 ? 5.825   56.743 45.401 1.00 31.54 ? ? ? ? ? ? 501 ASN A CB  1 
+ATOM   3361 C CG  . ASN A 1 424 ? 6.041   56.763 46.886 1.00 37.29 ? ? ? ? ? ? 501 ASN A CG  1 
+ATOM   3362 O OD1 . ASN A 1 424 ? 7.114   56.397 47.368 1.00 41.79 ? ? ? ? ? ? 501 ASN A OD1 1 
+ATOM   3363 N ND2 . ASN A 1 424 ? 5.019   57.169 47.631 1.00 44.96 ? ? ? ? ? ? 501 ASN A ND2 1 
+ATOM   3364 N N   . ARG A 1 425 ? 3.632   54.519 44.939 1.00 26.56 ? ? ? ? ? ? 502 ARG A N   1 
+ATOM   3365 C CA  . ARG A 1 425 ? 2.559   53.690 45.487 1.00 28.34 ? ? ? ? ? ? 502 ARG A CA  1 
+ATOM   3366 C C   . ARG A 1 425 ? 2.618   52.302 44.852 1.00 26.80 ? ? ? ? ? ? 502 ARG A C   1 
+ATOM   3367 O O   . ARG A 1 425 ? 2.416   52.156 43.645 1.00 25.54 ? ? ? ? ? ? 502 ARG A O   1 
+ATOM   3368 C CB  . ARG A 1 425 ? 1.196   54.325 45.224 1.00 33.15 ? ? ? ? ? ? 502 ARG A CB  1 
+ATOM   3369 C CG  . ARG A 1 425 ? 1.087   55.757 45.714 1.00 40.31 ? ? ? ? ? ? 502 ARG A CG  1 
+ATOM   3370 C CD  . ARG A 1 425 ? -0.340  56.119 46.090 1.00 46.61 ? ? ? ? ? ? 502 ARG A CD  1 
+ATOM   3371 N NE  . ARG A 1 425 ? -0.788  55.332 47.239 1.00 52.18 ? ? ? ? ? ? 502 ARG A NE  1 
+ATOM   3372 C CZ  . ARG A 1 425 ? -1.881  55.590 47.952 1.00 54.72 ? ? ? ? ? ? 502 ARG A CZ  1 
+ATOM   3373 N NH1 . ARG A 1 425 ? -2.654  56.623 47.641 1.00 56.43 ? ? ? ? ? ? 502 ARG A NH1 1 
+ATOM   3374 N NH2 . ARG A 1 425 ? -2.195  54.824 48.988 1.00 56.63 ? ? ? ? ? ? 502 ARG A NH2 1 
+ATOM   3375 N N   . PRO A 1 426 ? 2.894   51.261 45.655 1.00 25.04 ? ? ? ? ? ? 503 PRO A N   1 
+ATOM   3376 C CA  . PRO A 1 426 ? 2.967   49.918 45.078 1.00 24.64 ? ? ? ? ? ? 503 PRO A CA  1 
+ATOM   3377 C C   . PRO A 1 426 ? 1.770   49.475 44.249 1.00 25.19 ? ? ? ? ? ? 503 PRO A C   1 
+ATOM   3378 O O   . PRO A 1 426 ? 1.954   48.836 43.213 1.00 21.04 ? ? ? ? ? ? 503 PRO A O   1 
+ATOM   3379 C CB  . PRO A 1 426 ? 3.225   49.031 46.305 1.00 27.14 ? ? ? ? ? ? 503 PRO A CB  1 
+ATOM   3380 C CG  . PRO A 1 426 ? 2.623   49.844 47.446 1.00 30.86 ? ? ? ? ? ? 503 PRO A CG  1 
+ATOM   3381 C CD  . PRO A 1 426 ? 3.175   51.203 47.098 1.00 28.00 ? ? ? ? ? ? 503 PRO A CD  1 
+ATOM   3382 N N   . GLU A 1 427 ? 0.553   49.819 44.670 1.00 23.56 ? ? ? ? ? ? 504 GLU A N   1 
+ATOM   3383 C CA  . GLU A 1 427 ? -0.615  49.394 43.907 1.00 25.01 ? ? ? ? ? ? 504 GLU A CA  1 
+ATOM   3384 C C   . GLU A 1 427 ? -0.719  50.044 42.538 1.00 25.45 ? ? ? ? ? ? 504 GLU A C   1 
+ATOM   3385 O O   . GLU A 1 427 ? -1.507  49.612 41.695 1.00 29.73 ? ? ? ? ? ? 504 GLU A O   1 
+ATOM   3386 C CB  . GLU A 1 427 ? -1.919  49.603 44.698 1.00 26.26 ? ? ? ? ? ? 504 GLU A CB  1 
+ATOM   3387 C CG  . GLU A 1 427 ? -2.335  51.027 45.048 1.00 28.24 ? ? ? ? ? ? 504 GLU A CG  1 
+ATOM   3388 C CD  . GLU A 1 427 ? -1.340  51.758 45.922 1.00 31.17 ? ? ? ? ? ? 504 GLU A CD  1 
+ATOM   3389 O OE1 . GLU A 1 427 ? -0.677  51.120 46.769 1.00 30.73 ? ? ? ? ? ? 504 GLU A OE1 1 
+ATOM   3390 O OE2 . GLU A 1 427 ? -1.245  52.991 45.776 1.00 37.76 ? ? ? ? ? ? 504 GLU A OE2 1 
+ATOM   3391 N N   . GLU A 1 428 ? 0.089   51.070 42.300 1.00 25.74 ? ? ? ? ? ? 505 GLU A N   1 
+ATOM   3392 C CA  . GLU A 1 428 ? 0.064   51.740 41.010 1.00 24.59 ? ? ? ? ? ? 505 GLU A CA  1 
+ATOM   3393 C C   . GLU A 1 428 ? 1.079   51.185 40.016 1.00 25.43 ? ? ? ? ? ? 505 GLU A C   1 
+ATOM   3394 O O   . GLU A 1 428 ? 1.144   51.636 38.872 1.00 22.81 ? ? ? ? ? ? 505 GLU A O   1 
+ATOM   3395 C CB  . GLU A 1 428 ? 0.252   53.244 41.192 1.00 27.30 ? ? ? ? ? ? 505 GLU A CB  1 
+ATOM   3396 C CG  . GLU A 1 428 ? -1.026  53.925 41.653 1.00 34.13 ? ? ? ? ? ? 505 GLU A CG  1 
+ATOM   3397 C CD  . GLU A 1 428 ? -0.848  55.400 41.912 1.00 37.07 ? ? ? ? ? ? 505 GLU A CD  1 
+ATOM   3398 O OE1 . GLU A 1 428 ? -0.309  56.102 41.029 1.00 40.66 ? ? ? ? ? ? 505 GLU A OE1 1 
+ATOM   3399 O OE2 . GLU A 1 428 ? -1.261  55.858 42.998 1.00 44.13 ? ? ? ? ? ? 505 GLU A OE2 1 
+ATOM   3400 N N   . ARG A 1 429 ? 1.869   50.209 40.456 1.00 21.14 ? ? ? ? ? ? 506 ARG A N   1 
+ATOM   3401 C CA  . ARG A 1 429 ? 2.849   49.558 39.583 1.00 20.17 ? ? ? ? ? ? 506 ARG A CA  1 
+ATOM   3402 C C   . ARG A 1 429 ? 2.101   48.441 38.837 1.00 18.37 ? ? ? ? ? ? 506 ARG A C   1 
+ATOM   3403 O O   . ARG A 1 429 ? 1.189   47.820 39.382 1.00 19.32 ? ? ? ? ? ? 506 ARG A O   1 
+ATOM   3404 C CB  . ARG A 1 429 ? 3.986   48.953 40.418 1.00 19.24 ? ? ? ? ? ? 506 ARG A CB  1 
+ATOM   3405 C CG  . ARG A 1 429 ? 4.749   49.977 41.247 1.00 20.70 ? ? ? ? ? ? 506 ARG A CG  1 
+ATOM   3406 C CD  . ARG A 1 429 ? 5.681   49.338 42.275 1.00 22.92 ? ? ? ? ? ? 506 ARG A CD  1 
+ATOM   3407 N NE  . ARG A 1 429 ? 6.139   50.352 43.224 1.00 19.81 ? ? ? ? ? ? 506 ARG A NE  1 
+ATOM   3408 C CZ  . ARG A 1 429 ? 6.626   50.088 44.429 1.00 19.17 ? ? ? ? ? ? 506 ARG A CZ  1 
+ATOM   3409 N NH1 . ARG A 1 429 ? 6.730   48.829 44.848 1.00 14.79 ? ? ? ? ? ? 506 ARG A NH1 1 
+ATOM   3410 N NH2 . ARG A 1 429 ? 6.960   51.087 45.235 1.00 16.78 ? ? ? ? ? ? 506 ARG A NH2 1 
+ATOM   3411 N N   . PRO A 1 430 ? 2.463   48.183 37.577 1.00 18.24 ? ? ? ? ? ? 507 PRO A N   1 
+ATOM   3412 C CA  . PRO A 1 430 ? 1.783   47.126 36.820 1.00 19.67 ? ? ? ? ? ? 507 PRO A CA  1 
+ATOM   3413 C C   . PRO A 1 430 ? 2.107   45.730 37.346 1.00 18.96 ? ? ? ? ? ? 507 PRO A C   1 
+ATOM   3414 O O   . PRO A 1 430 ? 3.012   45.556 38.162 1.00 19.78 ? ? ? ? ? ? 507 PRO A O   1 
+ATOM   3415 C CB  . PRO A 1 430 ? 2.314   47.341 35.409 1.00 20.23 ? ? ? ? ? ? 507 PRO A CB  1 
+ATOM   3416 C CG  . PRO A 1 430 ? 3.740   47.788 35.693 1.00 22.95 ? ? ? ? ? ? 507 PRO A CG  1 
+ATOM   3417 C CD  . PRO A 1 430 ? 3.474   48.847 36.736 1.00 19.14 ? ? ? ? ? ? 507 PRO A CD  1 
+ATOM   3418 N N   . THR A 1 431 ? 1.352   44.735 36.895 1.00 17.77 ? ? ? ? ? ? 508 THR A N   1 
+ATOM   3419 C CA  . THR A 1 431 ? 1.617   43.357 37.304 1.00 16.80 ? ? ? ? ? ? 508 THR A CA  1 
+ATOM   3420 C C   . THR A 1 431 ? 2.670   42.818 36.330 1.00 16.66 ? ? ? ? ? ? 508 THR A C   1 
+ATOM   3421 O O   . THR A 1 431 ? 2.890   43.403 35.262 1.00 13.81 ? ? ? ? ? ? 508 THR A O   1 
+ATOM   3422 C CB  . THR A 1 431 ? 0.369   42.487 37.167 1.00 16.28 ? ? ? ? ? ? 508 THR A CB  1 
+ATOM   3423 O OG1 . THR A 1 431 ? -0.025  42.466 35.790 1.00 19.56 ? ? ? ? ? ? 508 THR A OG1 1 
+ATOM   3424 C CG2 . THR A 1 431 ? -0.780  43.042 38.026 1.00 17.66 ? ? ? ? ? ? 508 THR A CG2 1 
+ATOM   3425 N N   . PHE A 1 432 ? 3.326   41.718 36.693 1.00 15.87 ? ? ? ? ? ? 509 PHE A N   1 
+ATOM   3426 C CA  . PHE A 1 432 ? 4.317   41.120 35.804 1.00 15.68 ? ? ? ? ? ? 509 PHE A CA  1 
+ATOM   3427 C C   . PHE A 1 432 ? 3.598   40.513 34.611 1.00 14.23 ? ? ? ? ? ? 509 PHE A C   1 
+ATOM   3428 O O   . PHE A 1 432 ? 4.161   40.410 33.517 1.00 15.95 ? ? ? ? ? ? 509 PHE A O   1 
+ATOM   3429 C CB  . PHE A 1 432 ? 5.135   40.051 36.531 1.00 13.92 ? ? ? ? ? ? 509 PHE A CB  1 
+ATOM   3430 C CG  . PHE A 1 432 ? 6.252   40.616 37.361 1.00 11.94 ? ? ? ? ? ? 509 PHE A CG  1 
+ATOM   3431 C CD1 . PHE A 1 432 ? 7.313   41.272 36.745 1.00 15.42 ? ? ? ? ? ? 509 PHE A CD1 1 
+ATOM   3432 C CD2 . PHE A 1 432 ? 6.246   40.507 38.747 1.00 13.14 ? ? ? ? ? ? 509 PHE A CD2 1 
+ATOM   3433 C CE1 . PHE A 1 432 ? 8.362   41.818 37.492 1.00 11.42 ? ? ? ? ? ? 509 PHE A CE1 1 
+ATOM   3434 C CE2 . PHE A 1 432 ? 7.295   41.052 39.504 1.00 12.08 ? ? ? ? ? ? 509 PHE A CE2 1 
+ATOM   3435 C CZ  . PHE A 1 432 ? 8.355   41.710 38.859 1.00 7.43  ? ? ? ? ? ? 509 PHE A CZ  1 
+ATOM   3436 N N   . GLU A 1 433 ? 2.348   40.108 34.821 1.00 16.01 ? ? ? ? ? ? 510 GLU A N   1 
+ATOM   3437 C CA  . GLU A 1 433 ? 1.565   39.553 33.723 1.00 19.09 ? ? ? ? ? ? 510 GLU A CA  1 
+ATOM   3438 C C   . GLU A 1 433 ? 1.459   40.614 32.626 1.00 16.88 ? ? ? ? ? ? 510 GLU A C   1 
+ATOM   3439 O O   . GLU A 1 433 ? 1.616   40.315 31.448 1.00 18.25 ? ? ? ? ? ? 510 GLU A O   1 
+ATOM   3440 C CB  . GLU A 1 433 ? 0.160   39.149 34.191 1.00 21.91 ? ? ? ? ? ? 510 GLU A CB  1 
+ATOM   3441 C CG  . GLU A 1 433 ? -0.791  38.878 33.022 1.00 27.70 ? ? ? ? ? ? 510 GLU A CG  1 
+ATOM   3442 C CD  . GLU A 1 433 ? -2.158  38.385 33.448 1.00 33.90 ? ? ? ? ? ? 510 GLU A CD  1 
+ATOM   3443 O OE1 . GLU A 1 433 ? -2.749  38.980 34.373 1.00 37.85 ? ? ? ? ? ? 510 GLU A OE1 1 
+ATOM   3444 O OE2 . GLU A 1 433 ? -2.651  37.411 32.841 1.00 38.39 ? ? ? ? ? ? 510 GLU A OE2 1 
+ATOM   3445 N N   . TYR A 1 434 ? 1.198   41.856 33.022 1.00 18.56 ? ? ? ? ? ? 511 TYR A N   1 
+ATOM   3446 C CA  . TYR A 1 434 ? 1.084   42.958 32.065 1.00 18.75 ? ? ? ? ? ? 511 TYR A CA  1 
+ATOM   3447 C C   . TYR A 1 434 ? 2.441   43.241 31.429 1.00 16.10 ? ? ? ? ? ? 511 TYR A C   1 
+ATOM   3448 O O   . TYR A 1 434 ? 2.565   43.321 30.211 1.00 17.03 ? ? ? ? ? ? 511 TYR A O   1 
+ATOM   3449 C CB  . TYR A 1 434 ? 0.603   44.231 32.763 1.00 21.50 ? ? ? ? ? ? 511 TYR A CB  1 
+ATOM   3450 C CG  . TYR A 1 434 ? 0.392   45.388 31.813 1.00 26.89 ? ? ? ? ? ? 511 TYR A CG  1 
+ATOM   3451 C CD1 . TYR A 1 434 ? -0.726  45.429 30.980 1.00 28.62 ? ? ? ? ? ? 511 TYR A CD1 1 
+ATOM   3452 C CD2 . TYR A 1 434 ? 1.320   46.426 31.727 1.00 27.38 ? ? ? ? ? ? 511 TYR A CD2 1 
+ATOM   3453 C CE1 . TYR A 1 434 ? -0.920  46.476 30.084 1.00 30.42 ? ? ? ? ? ? 511 TYR A CE1 1 
+ATOM   3454 C CE2 . TYR A 1 434 ? 1.136   47.482 30.829 1.00 30.15 ? ? ? ? ? ? 511 TYR A CE2 1 
+ATOM   3455 C CZ  . TYR A 1 434 ? 0.011   47.497 30.012 1.00 32.49 ? ? ? ? ? ? 511 TYR A CZ  1 
+ATOM   3456 O OH  . TYR A 1 434 ? -0.187  48.524 29.117 1.00 36.29 ? ? ? ? ? ? 511 TYR A OH  1 
+ATOM   3457 N N   . ILE A 1 435 ? 3.454   43.416 32.273 1.00 17.39 ? ? ? ? ? ? 512 ILE A N   1 
+ATOM   3458 C CA  . ILE A 1 435 ? 4.813   43.687 31.818 1.00 15.54 ? ? ? ? ? ? 512 ILE A CA  1 
+ATOM   3459 C C   . ILE A 1 435 ? 5.278   42.657 30.787 1.00 17.33 ? ? ? ? ? ? 512 ILE A C   1 
+ATOM   3460 O O   . ILE A 1 435 ? 5.886   43.004 29.768 1.00 19.34 ? ? ? ? ? ? 512 ILE A O   1 
+ATOM   3461 C CB  . ILE A 1 435 ? 5.792   43.707 33.031 1.00 17.60 ? ? ? ? ? ? 512 ILE A CB  1 
+ATOM   3462 C CG1 . ILE A 1 435 ? 5.518   44.952 33.880 1.00 16.09 ? ? ? ? ? ? 512 ILE A CG1 1 
+ATOM   3463 C CG2 . ILE A 1 435 ? 7.248   43.669 32.553 1.00 15.66 ? ? ? ? ? ? 512 ILE A CG2 1 
+ATOM   3464 C CD1 . ILE A 1 435 ? 6.199   44.966 35.243 1.00 15.70 ? ? ? ? ? ? 512 ILE A CD1 1 
+ATOM   3465 N N   . GLN A 1 436 ? 4.993   41.387 31.051 1.00 18.07 ? ? ? ? ? ? 513 GLN A N   1 
+ATOM   3466 C CA  . GLN A 1 436 ? 5.385   40.331 30.125 1.00 16.25 ? ? ? ? ? ? 513 GLN A CA  1 
+ATOM   3467 C C   . GLN A 1 436 ? 4.664   40.537 28.798 1.00 17.96 ? ? ? ? ? ? 513 GLN A C   1 
+ATOM   3468 O O   . GLN A 1 436 ? 5.271   40.435 27.735 1.00 20.35 ? ? ? ? ? ? 513 GLN A O   1 
+ATOM   3469 C CB  . GLN A 1 436 ? 5.005   38.955 30.656 1.00 14.36 ? ? ? ? ? ? 513 GLN A CB  1 
+ATOM   3470 C CG  . GLN A 1 436 ? 5.571   37.824 29.816 1.00 15.83 ? ? ? ? ? ? 513 GLN A CG  1 
+ATOM   3471 C CD  . GLN A 1 436 ? 4.857   36.517 30.039 1.00 18.51 ? ? ? ? ? ? 513 GLN A CD  1 
+ATOM   3472 O OE1 . GLN A 1 436 ? 4.501   36.175 31.163 1.00 21.39 ? ? ? ? ? ? 513 GLN A OE1 1 
+ATOM   3473 N NE2 . GLN A 1 436 ? 4.660   35.763 28.964 1.00 22.51 ? ? ? ? ? ? 513 GLN A NE2 1 
+ATOM   3474 N N   . SER A 1 437 ? 3.366   40.826 28.864 1.00 18.99 ? ? ? ? ? ? 514 SER A N   1 
+ATOM   3475 C CA  . SER A 1 437 ? 2.592   41.029 27.644 1.00 21.86 ? ? ? ? ? ? 514 SER A CA  1 
+ATOM   3476 C C   . SER A 1 437 ? 3.199   42.173 26.833 1.00 21.31 ? ? ? ? ? ? 514 SER A C   1 
+ATOM   3477 O O   . SER A 1 437 ? 3.396   42.046 25.630 1.00 24.36 ? ? ? ? ? ? 514 SER A O   1 
+ATOM   3478 C CB  . SER A 1 437 ? 1.125   41.349 27.961 1.00 21.27 ? ? ? ? ? ? 514 SER A CB  1 
+ATOM   3479 O OG  . SER A 1 437 ? 0.959   42.701 28.366 1.00 23.54 ? ? ? ? ? ? 514 SER A OG  1 
+ATOM   3480 N N   . VAL A 1 438 ? 3.512   43.289 27.484 1.00 21.41 ? ? ? ? ? ? 515 VAL A N   1 
+ATOM   3481 C CA  . VAL A 1 438 ? 4.090   44.417 26.756 1.00 24.31 ? ? ? ? ? ? 515 VAL A CA  1 
+ATOM   3482 C C   . VAL A 1 438 ? 5.469   44.111 26.162 1.00 24.63 ? ? ? ? ? ? 515 VAL A C   1 
+ATOM   3483 O O   . VAL A 1 438 ? 5.769   44.520 25.039 1.00 24.57 ? ? ? ? ? ? 515 VAL A O   1 
+ATOM   3484 C CB  . VAL A 1 438 ? 4.191   45.678 27.646 1.00 24.13 ? ? ? ? ? ? 515 VAL A CB  1 
+ATOM   3485 C CG1 . VAL A 1 438 ? 4.955   46.773 26.909 1.00 27.37 ? ? ? ? ? ? 515 VAL A CG1 1 
+ATOM   3486 C CG2 . VAL A 1 438 ? 2.790   46.185 27.986 1.00 29.28 ? ? ? ? ? ? 515 VAL A CG2 1 
+ATOM   3487 N N   . LEU A 1 439 ? 6.312   43.395 26.900 1.00 20.42 ? ? ? ? ? ? 516 LEU A N   1 
+ATOM   3488 C CA  . LEU A 1 439 ? 7.638   43.074 26.382 1.00 20.92 ? ? ? ? ? ? 516 LEU A CA  1 
+ATOM   3489 C C   . LEU A 1 439 ? 7.641   41.969 25.327 1.00 19.75 ? ? ? ? ? ? 516 LEU A C   1 
+ATOM   3490 O O   . LEU A 1 439 ? 8.419   42.041 24.381 1.00 19.83 ? ? ? ? ? ? 516 LEU A O   1 
+ATOM   3491 C CB  . LEU A 1 439 ? 8.596   42.708 27.520 1.00 19.70 ? ? ? ? ? ? 516 LEU A CB  1 
+ATOM   3492 C CG  . LEU A 1 439 ? 8.853   43.830 28.531 1.00 19.54 ? ? ? ? ? ? 516 LEU A CG  1 
+ATOM   3493 C CD1 . LEU A 1 439 ? 9.763   43.305 29.646 1.00 19.43 ? ? ? ? ? ? 516 LEU A CD1 1 
+ATOM   3494 C CD2 . LEU A 1 439 ? 9.481   45.033 27.835 1.00 20.18 ? ? ? ? ? ? 516 LEU A CD2 1 
+ATOM   3495 N N   . ASP A 1 440 ? 6.799   40.945 25.470 1.00 20.48 ? ? ? ? ? ? 517 ASP A N   1 
+ATOM   3496 C CA  . ASP A 1 440 ? 6.785   39.886 24.453 1.00 22.93 ? ? ? ? ? ? 517 ASP A CA  1 
+ATOM   3497 C C   . ASP A 1 440 ? 6.443   40.466 23.089 1.00 23.12 ? ? ? ? ? ? 517 ASP A C   1 
+ATOM   3498 O O   . ASP A 1 440 ? 7.003   40.055 22.075 1.00 22.50 ? ? ? ? ? ? 517 ASP A O   1 
+ATOM   3499 C CB  . ASP A 1 440 ? 5.755   38.782 24.745 1.00 19.36 ? ? ? ? ? ? 517 ASP A CB  1 
+ATOM   3500 C CG  . ASP A 1 440 ? 6.182   37.848 25.853 1.00 22.39 ? ? ? ? ? ? 517 ASP A CG  1 
+ATOM   3501 O OD1 . ASP A 1 440 ? 7.394   37.779 26.138 1.00 20.05 ? ? ? ? ? ? 517 ASP A OD1 1 
+ATOM   3502 O OD2 . ASP A 1 440 ? 5.301   37.154 26.410 1.00 19.89 ? ? ? ? ? ? 517 ASP A OD2 1 
+ATOM   3503 N N   . ASP A 1 441 ? 5.519   41.420 23.066 1.00 24.53 ? ? ? ? ? ? 518 ASP A N   1 
+ATOM   3504 C CA  . ASP A 1 441 ? 5.095   42.010 21.802 1.00 26.35 ? ? ? ? ? ? 518 ASP A CA  1 
+ATOM   3505 C C   . ASP A 1 441 ? 5.552   43.450 21.613 1.00 26.17 ? ? ? ? ? ? 518 ASP A C   1 
+ATOM   3506 O O   . ASP A 1 441 ? 4.895   44.237 20.932 1.00 24.80 ? ? ? ? ? ? 518 ASP A O   1 
+ATOM   3507 C CB  . ASP A 1 441 ? 3.568   41.930 21.674 1.00 26.18 ? ? ? ? ? ? 518 ASP A CB  1 
+ATOM   3508 C CG  . ASP A 1 441 ? 3.050   40.493 21.686 1.00 29.09 ? ? ? ? ? ? 518 ASP A CG  1 
+ATOM   3509 O OD1 . ASP A 1 441 ? 3.637   39.649 20.980 1.00 32.40 ? ? ? ? ? ? 518 ASP A OD1 1 
+ATOM   3510 O OD2 . ASP A 1 441 ? 2.048   40.214 22.382 1.00 29.76 ? ? ? ? ? ? 518 ASP A OD2 1 
+ATOM   3511 N N   . PHE A 1 442 ? 6.696   43.779 22.199 1.00 25.04 ? ? ? ? ? ? 519 PHE A N   1 
+ATOM   3512 C CA  . PHE A 1 442 ? 7.242   45.127 22.125 1.00 25.75 ? ? ? ? ? ? 519 PHE A CA  1 
+ATOM   3513 C C   . PHE A 1 442 ? 7.462   45.585 20.680 1.00 29.76 ? ? ? ? ? ? 519 PHE A C   1 
+ATOM   3514 O O   . PHE A 1 442 ? 7.297   46.769 20.374 1.00 26.90 ? ? ? ? ? ? 519 PHE A O   1 
+ATOM   3515 C CB  . PHE A 1 442 ? 8.569   45.177 22.888 1.00 24.73 ? ? ? ? ? ? 519 PHE A CB  1 
+ATOM   3516 C CG  . PHE A 1 442 ? 9.065   46.567 23.176 1.00 24.90 ? ? ? ? ? ? 519 PHE A CG  1 
+ATOM   3517 C CD1 . PHE A 1 442 ? 8.427   47.365 24.116 1.00 23.67 ? ? ? ? ? ? 519 PHE A CD1 1 
+ATOM   3518 C CD2 . PHE A 1 442 ? 10.185  47.068 22.525 1.00 25.57 ? ? ? ? ? ? 519 PHE A CD2 1 
+ATOM   3519 C CE1 . PHE A 1 442 ? 8.905   48.640 24.409 1.00 22.79 ? ? ? ? ? ? 519 PHE A CE1 1 
+ATOM   3520 C CE2 . PHE A 1 442 ? 10.668  48.343 22.811 1.00 28.42 ? ? ? ? ? ? 519 PHE A CE2 1 
+ATOM   3521 C CZ  . PHE A 1 442 ? 10.027  49.130 23.756 1.00 24.58 ? ? ? ? ? ? 519 PHE A CZ  1 
+ATOM   3522 N N   . TYR A 1 443 ? 7.830   44.649 19.804 1.00 30.82 ? ? ? ? ? ? 520 TYR A N   1 
+ATOM   3523 C CA  . TYR A 1 443 ? 8.095   44.959 18.398 1.00 38.37 ? ? ? ? ? ? 520 TYR A CA  1 
+ATOM   3524 C C   . TYR A 1 443 ? 7.106   44.464 17.356 1.00 43.79 ? ? ? ? ? ? 520 TYR A C   1 
+ATOM   3525 O O   . TYR A 1 443 ? 6.006   44.019 17.664 1.00 45.21 ? ? ? ? ? ? 520 TYR A O   1 
+ATOM   3526 C CB  . TYR A 1 443 ? 9.471   44.453 17.968 1.00 34.60 ? ? ? ? ? ? 520 TYR A CB  1 
+ATOM   3527 C CG  . TYR A 1 443 ? 10.636  45.155 18.606 1.00 35.96 ? ? ? ? ? ? 520 TYR A CG  1 
+ATOM   3528 C CD1 . TYR A 1 443 ? 11.266  44.624 19.726 1.00 33.58 ? ? ? ? ? ? 520 TYR A CD1 1 
+ATOM   3529 C CD2 . TYR A 1 443 ? 11.123  46.344 18.074 1.00 32.77 ? ? ? ? ? ? 520 TYR A CD2 1 
+ATOM   3530 C CE1 . TYR A 1 443 ? 12.360  45.256 20.298 1.00 30.98 ? ? ? ? ? ? 520 TYR A CE1 1 
+ATOM   3531 C CE2 . TYR A 1 443 ? 12.215  46.988 18.636 1.00 34.22 ? ? ? ? ? ? 520 TYR A CE2 1 
+ATOM   3532 C CZ  . TYR A 1 443 ? 12.832  46.434 19.748 1.00 32.73 ? ? ? ? ? ? 520 TYR A CZ  1 
+ATOM   3533 O OH  . TYR A 1 443 ? 13.934  47.040 20.297 1.00 31.24 ? ? ? ? ? ? 520 TYR A OH  1 
+ATOM   3534 N N   . THR A 1 444 ? 7.556   44.532 16.105 1.00 54.70 ? ? ? ? ? ? 521 THR A N   1 
+ATOM   3535 C CA  . THR A 1 444 ? 6.763   44.137 14.954 1.00 61.02 ? ? ? ? ? ? 521 THR A CA  1 
+ATOM   3536 C C   . THR A 1 444 ? 5.504   45.009 15.074 1.00 64.35 ? ? ? ? ? ? 521 THR A C   1 
+ATOM   3537 O O   . THR A 1 444 ? 4.384   44.512 15.056 1.00 64.43 ? ? ? ? ? ? 521 THR A O   1 
+ATOM   3538 C CB  . THR A 1 444 ? 6.424   42.618 15.001 1.00 63.98 ? ? ? ? ? ? 521 THR A CB  1 
+ATOM   3539 O OG1 . THR A 1 444 ? 7.420   41.925 15.768 1.00 66.95 ? ? ? ? ? ? 521 THR A OG1 1 
+ATOM   3540 C CG2 . THR A 1 444 ? 6.449   42.023 13.592 1.00 64.24 ? ? ? ? ? ? 521 THR A CG2 1 
+ATOM   3541 N N   . ALA A 1 445 ? 5.752   46.314 15.224 1.00 67.71 ? ? ? ? ? ? 522 ALA A N   1 
+ATOM   3542 C CA  . ALA A 1 445 ? 4.758   47.393 15.369 1.00 70.38 ? ? ? ? ? ? 522 ALA A CA  1 
+ATOM   3543 C C   . ALA A 1 445 ? 3.268   47.022 15.350 1.00 73.25 ? ? ? ? ? ? 522 ALA A C   1 
+ATOM   3544 O O   . ALA A 1 445 ? 2.718   46.565 16.357 1.00 74.15 ? ? ? ? ? ? 522 ALA A O   1 
+ATOM   3545 C CB  . ALA A 1 445 ? 5.036   48.459 14.316 1.00 70.79 ? ? ? ? ? ? 522 ALA A CB  1 
+ATOM   3546 N N   . THR A 1 446 ? 2.609   47.270 14.219 1.00 75.85 ? ? ? ? ? ? 523 THR A N   1 
+ATOM   3547 C CA  . THR A 1 446 ? 1.194   46.923 14.036 1.00 78.14 ? ? ? ? ? ? 523 THR A CA  1 
+ATOM   3548 C C   . THR A 1 446 ? 1.278   45.394 14.181 1.00 80.27 ? ? ? ? ? ? 523 THR A C   1 
+ATOM   3549 O O   . THR A 1 446 ? 2.326   44.915 14.585 1.00 82.13 ? ? ? ? ? ? 523 THR A O   1 
+ATOM   3550 C CB  . THR A 1 446 ? 0.726   47.333 12.612 1.00 78.07 ? ? ? ? ? ? 523 THR A CB  1 
+ATOM   3551 O OG1 . THR A 1 446 ? 1.116   48.691 12.361 1.00 77.25 ? ? ? ? ? ? 523 THR A OG1 1 
+ATOM   3552 C CG2 . THR A 1 446 ? -0.790  47.240 12.480 1.00 79.07 ? ? ? ? ? ? 523 THR A CG2 1 
+ATOM   3553 N N   . GLU A 1 447 ? 0.222   44.628 13.874 1.00 81.42 ? ? ? ? ? ? 524 GLU A N   1 
+ATOM   3554 C CA  . GLU A 1 447 ? 0.300   43.155 14.007 1.00 82.73 ? ? ? ? ? ? 524 GLU A CA  1 
+ATOM   3555 C C   . GLU A 1 447 ? -0.819  42.499 14.779 1.00 83.66 ? ? ? ? ? ? 524 GLU A C   1 
+ATOM   3556 O O   . GLU A 1 447 ? -1.396  43.085 15.675 1.00 85.56 ? ? ? ? ? ? 524 GLU A O   1 
+ATOM   3557 C CB  . GLU A 1 447 ? 1.544   42.691 14.759 1.00 82.14 ? ? ? ? ? ? 524 GLU A CB  1 
+ATOM   3558 C CG  . GLU A 1 447 ? 1.398   42.843 16.278 1.00 82.43 ? ? ? ? ? ? 524 GLU A CG  1 
+ATOM   3559 C CD  . GLU A 1 447 ? 2.516   42.197 17.051 1.00 83.12 ? ? ? ? ? ? 524 GLU A CD  1 
+ATOM   3560 O OE1 . GLU A 1 447 ? 3.618   42.771 17.069 1.00 83.34 ? ? ? ? ? ? 524 GLU A OE1 1 
+ATOM   3561 O OE2 . GLU A 1 447 ? 2.298   41.113 17.632 1.00 83.77 ? ? ? ? ? ? 524 GLU A OE2 1 
+ATOM   3562 N N   . SER A 1 448 ? -1.018  41.232 14.476 1.00 82.93 ? ? ? ? ? ? 525 SER A N   1 
+ATOM   3563 C CA  . SER A 1 448 ? -1.987  40.384 15.139 1.00 81.67 ? ? ? ? ? ? 525 SER A CA  1 
+ATOM   3564 C C   . SER A 1 448 ? -1.223  39.078 14.900 1.00 80.25 ? ? ? ? ? ? 525 SER A C   1 
+ATOM   3565 O O   . SER A 1 448 ? -1.775  38.086 14.428 1.00 80.93 ? ? ? ? ? ? 525 SER A O   1 
+ATOM   3566 C CB  . SER A 1 448 ? -3.322  40.418 14.383 1.00 82.54 ? ? ? ? ? ? 525 SER A CB  1 
+ATOM   3567 O OG  . SER A 1 448 ? -4.448  40.227 15.231 1.00 83.65 ? ? ? ? ? ? 525 SER A OG  1 
+ATOM   3568 N N   . GLN A 1 449 ? 0.079   39.144 15.185 1.00 76.67 ? ? ? ? ? ? 526 GLN A N   1 
+ATOM   3569 C CA  . GLN A 1 449 ? 1.029   38.042 15.039 1.00 72.79 ? ? ? ? ? ? 526 GLN A CA  1 
+ATOM   3570 C C   . GLN A 1 449 ? 0.384   36.698 14.751 1.00 70.74 ? ? ? ? ? ? 526 GLN A C   1 
+ATOM   3571 O O   . GLN A 1 449 ? 0.169   35.891 15.646 1.00 72.78 ? ? ? ? ? ? 526 GLN A O   1 
+ATOM   3572 C CB  . GLN A 1 449 ? 1.879   37.950 16.301 1.00 70.94 ? ? ? ? ? ? 526 GLN A CB  1 
+ATOM   3573 C CG  . GLN A 1 449 ? 1.030   37.824 17.545 1.00 66.13 ? ? ? ? ? ? 526 GLN A CG  1 
+ATOM   3574 C CD  . GLN A 1 449 ? 1.823   37.939 18.823 1.00 65.38 ? ? ? ? ? ? 526 GLN A CD  1 
+ATOM   3575 O OE1 . GLN A 1 449 ? 1.274   37.791 19.914 1.00 64.80 ? ? ? ? ? ? 526 GLN A OE1 1 
+ATOM   3576 N NE2 . GLN A 1 449 ? 3.118   38.212 18.702 1.00 64.22 ? ? ? ? ? ? 526 GLN A NE2 1 
+ATOM   3577 N N   . PTR A 1 450 ? 0.080   36.471 13.486 1.00 67.65 ? ? ? ? ? ? 527 PTR A N   1 
+ATOM   3578 C CA  . PTR A 1 450 ? -0.539  35.238 13.033 1.00 65.18 ? ? ? ? ? ? 527 PTR A CA  1 
+ATOM   3579 C C   . PTR A 1 450 ? -0.721  35.426 11.552 1.00 66.59 ? ? ? ? ? ? 527 PTR A C   1 
+ATOM   3580 O O   . PTR A 1 450 ? -1.790  35.835 11.100 1.00 66.62 ? ? ? ? ? ? 527 PTR A O   1 
+ATOM   3581 C CB  . PTR A 1 450 ? -1.899  35.015 13.707 1.00 60.91 ? ? ? ? ? ? 527 PTR A CB  1 
+ATOM   3582 C CG  . PTR A 1 450 ? -1.857  33.919 14.773 1.00 55.97 ? ? ? ? ? ? 527 PTR A CG  1 
+ATOM   3583 C CD1 . PTR A 1 450 ? -2.790  33.911 15.849 1.00 55.70 ? ? ? ? ? ? 527 PTR A CD1 1 
+ATOM   3584 C CD2 . PTR A 1 450 ? -0.881  32.884 14.695 1.00 52.68 ? ? ? ? ? ? 527 PTR A CD2 1 
+ATOM   3585 C CE1 . PTR A 1 450 ? -2.710  32.873 16.819 1.00 52.26 ? ? ? ? ? ? 527 PTR A CE1 1 
+ATOM   3586 C CE2 . PTR A 1 450 ? -0.791  31.850 15.648 1.00 47.70 ? ? ? ? ? ? 527 PTR A CE2 1 
+ATOM   3587 C CZ  . PTR A 1 450 ? -1.713  31.870 16.700 1.00 48.24 ? ? ? ? ? ? 527 PTR A CZ  1 
+ATOM   3588 O OH  . PTR A 1 450 ? -1.590  30.803 17.660 1.00 44.43 ? ? ? ? ? ? 527 PTR A OH  1 
+ATOM   3589 P P   . PTR A 1 450 ? -0.531  30.988 18.896 1.00 41.75 ? ? ? ? ? ? 527 PTR A P   1 
+ATOM   3590 O O1P . PTR A 1 450 ? -1.078  31.998 19.812 1.00 40.80 ? ? ? ? ? ? 527 PTR A O1P 1 
+ATOM   3591 O O2P . PTR A 1 450 ? 0.778   31.450 18.390 1.00 40.71 ? ? ? ? ? ? 527 PTR A O2P 1 
+ATOM   3592 O O3P . PTR A 1 450 ? -0.365  29.723 19.661 1.00 42.33 ? ? ? ? ? ? 527 PTR A O3P 1 
+ATOM   3593 N N   . GLU A 1 451 ? 0.351   35.181 10.815 1.00 68.30 ? ? ? ? ? ? 528 GLU A N   1 
+ATOM   3594 C CA  . GLU A 1 451 ? 0.317   35.312 9.367  1.00 70.89 ? ? ? ? ? ? 528 GLU A CA  1 
+ATOM   3595 C C   . GLU A 1 451 ? -0.980  34.660 8.939  1.00 72.96 ? ? ? ? ? ? 528 GLU A C   1 
+ATOM   3596 O O   . GLU A 1 451 ? -1.293  33.560 9.385  1.00 74.16 ? ? ? ? ? ? 528 GLU A O   1 
+ATOM   3597 C CB  . GLU A 1 451 ? 1.469   34.543 8.718  1.00 69.66 ? ? ? ? ? ? 528 GLU A CB  1 
+ATOM   3598 C CG  . GLU A 1 451 ? 2.831   34.803 9.312  1.00 71.00 ? ? ? ? ? ? 528 GLU A CG  1 
+ATOM   3599 C CD  . GLU A 1 451 ? 3.227   36.253 9.236  1.00 71.74 ? ? ? ? ? ? 528 GLU A CD  1 
+ATOM   3600 O OE1 . GLU A 1 451 ? 3.322   36.777 8.109  1.00 72.06 ? ? ? ? ? ? 528 GLU A OE1 1 
+ATOM   3601 O OE2 . GLU A 1 451 ? 3.442   36.868 10.301 1.00 71.33 ? ? ? ? ? ? 528 GLU A OE2 1 
+ATOM   3602 N N   . GLU A 1 452 ? -1.753  35.334 8.103  1.00 75.36 ? ? ? ? ? ? 529 GLU A N   1 
+ATOM   3603 C CA  . GLU A 1 452 ? -2.987  34.727 7.641  1.00 77.37 ? ? ? ? ? ? 529 GLU A CA  1 
+ATOM   3604 C C   . GLU A 1 452 ? -2.609  34.158 6.273  1.00 77.80 ? ? ? ? ? ? 529 GLU A C   1 
+ATOM   3605 O O   . GLU A 1 452 ? -1.786  34.751 5.559  1.00 76.93 ? ? ? ? ? ? 529 GLU A O   1 
+ATOM   3606 C CB  . GLU A 1 452 ? -4.100  35.773 7.524  1.00 78.67 ? ? ? ? ? ? 529 GLU A CB  1 
+ATOM   3607 C CG  . GLU A 1 452 ? -5.469  35.225 7.919  1.00 81.63 ? ? ? ? ? ? 529 GLU A CG  1 
+ATOM   3608 C CD  . GLU A 1 452 ? -5.935  35.703 9.291  1.00 83.95 ? ? ? ? ? ? 529 GLU A CD  1 
+ATOM   3609 O OE1 . GLU A 1 452 ? -5.173  35.592 10.279 1.00 85.36 ? ? ? ? ? ? 529 GLU A OE1 1 
+ATOM   3610 O OE2 . GLU A 1 452 ? -7.084  36.185 9.377  1.00 85.21 ? ? ? ? ? ? 529 GLU A OE2 1 
+ATOM   3611 N N   . ILE A 1 453 ? -3.167  33.004 5.908  1.00 78.47 ? ? ? ? ? ? 530 ILE A N   1 
+ATOM   3612 C CA  . ILE A 1 453 ? -2.808  32.420 4.619  1.00 78.94 ? ? ? ? ? ? 530 ILE A CA  1 
+ATOM   3613 C C   . ILE A 1 453 ? -3.930  32.437 3.593  1.00 80.35 ? ? ? ? ? ? 530 ILE A C   1 
+ATOM   3614 O O   . ILE A 1 453 ? -4.985  31.838 3.784  1.00 80.42 ? ? ? ? ? ? 530 ILE A O   1 
+ATOM   3615 C CB  . ILE A 1 453 ? -2.312  30.937 4.754  1.00 78.26 ? ? ? ? ? ? 530 ILE A CB  1 
+ATOM   3616 C CG1 . ILE A 1 453 ? -1.420  30.566 3.569  1.00 76.94 ? ? ? ? ? ? 530 ILE A CG1 1 
+ATOM   3617 C CG2 . ILE A 1 453 ? -3.470  29.981 4.813  1.00 77.33 ? ? ? ? ? ? 530 ILE A CG2 1 
+ATOM   3618 C CD1 . ILE A 1 453 ? -0.019  31.082 3.719  1.00 76.11 ? ? ? ? ? ? 530 ILE A CD1 1 
+ATOM   3619 N N   . PRO A 1 454 ? -3.715  33.115 2.467  1.00 81.09 ? ? ? ? ? ? 531 PRO A N   1 
+ATOM   3620 C CA  . PRO A 1 454 ? -2.869  33.964 1.624  1.00 81.63 ? ? ? ? ? ? 531 PRO A CA  1 
+ATOM   3621 C C   . PRO A 1 454 ? -3.550  35.248 1.131  1.00 82.32 ? ? ? ? ? ? 531 PRO A C   1 
+ATOM   3622 O O   . PRO A 1 454 ? -3.909  35.278 -0.063 1.00 82.96 ? ? ? ? ? ? 531 PRO A O   1 
+ATOM   3623 C CB  . PRO A 1 454 ? -2.532  33.025 0.449  1.00 80.93 ? ? ? ? ? ? 531 PRO A CB  1 
+ATOM   3624 C CG  . PRO A 1 454 ? -3.181  31.637 0.875  1.00 80.28 ? ? ? ? ? ? 531 PRO A CG  1 
+ATOM   3625 C CD  . PRO A 1 454 ? -4.391  32.182 1.571  1.00 81.00 ? ? ? ? ? ? 531 PRO A CD  1 
+ATOM   3626 O OXT . PRO A 1 454 ? -3.724  36.207 1.914  1.00 83.32 ? ? ? ? ? ? 531 PRO A OXT 1 
+HETATM 3627 N N1  . PP1 B 2 .   ? 26.428  31.461 39.668 1.00 16.92 ? ? ? ? ? ? 532 PP1 A N1  1 
+HETATM 3628 C C2  . PP1 B 2 .   ? 26.466  28.964 36.863 1.00 15.69 ? ? ? ? ? ? 532 PP1 A C2  1 
+HETATM 3629 N N3  . PP1 B 2 .   ? 26.860  30.084 37.584 1.00 14.95 ? ? ? ? ? ? 532 PP1 A N3  1 
+HETATM 3630 C C4  . PP1 B 2 .   ? 26.227  30.417 38.776 1.00 19.51 ? ? ? ? ? ? 532 PP1 A C4  1 
+HETATM 3631 C C5  . PP1 B 2 .   ? 25.186  29.632 39.257 1.00 18.34 ? ? ? ? ? ? 532 PP1 A C5  1 
+HETATM 3632 C C6  . PP1 B 2 .   ? 24.789  28.506 38.521 1.00 18.09 ? ? ? ? ? ? 532 PP1 A C6  1 
+HETATM 3633 N N7  . PP1 B 2 .   ? 25.428  28.183 37.336 1.00 16.77 ? ? ? ? ? ? 532 PP1 A N7  1 
+HETATM 3634 N N8  . PP1 B 2 .   ? 25.520  31.311 40.699 1.00 19.06 ? ? ? ? ? ? 532 PP1 A N8  1 
+HETATM 3635 C C9  . PP1 B 2 .   ? 24.754  30.187 40.454 1.00 16.67 ? ? ? ? ? ? 532 PP1 A C9  1 
+HETATM 3636 N N10 . PP1 B 2 .   ? 23.776  27.724 38.945 1.00 15.37 ? ? ? ? ? ? 532 PP1 A N10 1 
+HETATM 3637 C C11 . PP1 B 2 .   ? 23.750  29.898 41.485 1.00 16.81 ? ? ? ? ? ? 532 PP1 A C11 1 
+HETATM 3638 C C12 . PP1 B 2 .   ? 23.784  28.645 42.127 1.00 17.35 ? ? ? ? ? ? 532 PP1 A C12 1 
+HETATM 3639 C C13 . PP1 B 2 .   ? 22.852  28.331 43.124 1.00 19.29 ? ? ? ? ? ? 532 PP1 A C13 1 
+HETATM 3640 C C14 . PP1 B 2 .   ? 21.875  29.265 43.494 1.00 18.96 ? ? ? ? ? ? 532 PP1 A C14 1 
+HETATM 3641 C C15 . PP1 B 2 .   ? 21.827  30.527 42.857 1.00 17.02 ? ? ? ? ? ? 532 PP1 A C15 1 
+HETATM 3642 C C16 . PP1 B 2 .   ? 22.769  30.846 41.847 1.00 15.16 ? ? ? ? ? ? 532 PP1 A C16 1 
+HETATM 3643 C C24 . PP1 B 2 .   ? 20.882  28.910 44.572 1.00 16.99 ? ? ? ? ? ? 532 PP1 A C24 1 
+HETATM 3644 C C28 . PP1 B 2 .   ? 27.365  32.599 39.461 1.00 22.83 ? ? ? ? ? ? 532 PP1 A C28 1 
+HETATM 3645 C C29 . PP1 B 2 .   ? 27.189  33.701 40.509 1.00 25.14 ? ? ? ? ? ? 532 PP1 A C29 1 
+HETATM 3646 C C33 . PP1 B 2 .   ? 27.183  33.293 38.111 1.00 24.71 ? ? ? ? ? ? 532 PP1 A C33 1 
+HETATM 3647 C C37 . PP1 B 2 .   ? 28.837  32.170 39.535 1.00 27.58 ? ? ? ? ? ? 532 PP1 A C37 1 
+HETATM 3648 O O   . HOH C 3 .   ? 8.538   6.785  20.622 1.00 39.10 ? ? ? ? ? ? 533 HOH A O   1 
+HETATM 3649 O O   . HOH C 3 .   ? 20.508  13.121 40.419 1.00 18.50 ? ? ? ? ? ? 534 HOH A O   1 
+HETATM 3650 O O   . HOH C 3 .   ? 2.133   12.250 37.545 1.00 45.12 ? ? ? ? ? ? 535 HOH A O   1 
+HETATM 3651 O O   . HOH C 3 .   ? 7.164   27.373 26.428 1.00 21.01 ? ? ? ? ? ? 536 HOH A O   1 
+HETATM 3652 O O   . HOH C 3 .   ? 3.610   35.361 12.519 1.00 28.62 ? ? ? ? ? ? 537 HOH A O   1 
+HETATM 3653 O O   . HOH C 3 .   ? 17.195  31.681 20.260 1.00 28.18 ? ? ? ? ? ? 538 HOH A O   1 
+HETATM 3654 O O   . HOH C 3 .   ? 9.799   39.319 2.337  1.00 38.02 ? ? ? ? ? ? 539 HOH A O   1 
+HETATM 3655 O O   . HOH C 3 .   ? -3.822  14.608 12.815 1.00 28.95 ? ? ? ? ? ? 540 HOH A O   1 
+HETATM 3656 O O   . HOH C 3 .   ? 20.669  13.477 37.895 1.00 18.36 ? ? ? ? ? ? 541 HOH A O   1 
+HETATM 3657 O O   . HOH C 3 .   ? 26.903  8.837  51.932 1.00 23.15 ? ? ? ? ? ? 542 HOH A O   1 
+HETATM 3658 O O   . HOH C 3 .   ? 26.378  10.051 49.506 1.00 21.15 ? ? ? ? ? ? 543 HOH A O   1 
+HETATM 3659 O O   . HOH C 3 .   ? 30.668  13.118 42.446 1.00 19.59 ? ? ? ? ? ? 544 HOH A O   1 
+HETATM 3660 O O   . HOH C 3 .   ? 32.135  28.148 33.924 1.00 32.09 ? ? ? ? ? ? 545 HOH A O   1 
+HETATM 3661 O O   . HOH C 3 .   ? 7.455   25.098 52.971 1.00 28.40 ? ? ? ? ? ? 546 HOH A O   1 
+HETATM 3662 O O   . HOH C 3 .   ? 14.631  21.477 53.253 1.00 40.49 ? ? ? ? ? ? 547 HOH A O   1 
+HETATM 3663 O O   . HOH C 3 .   ? 11.220  33.940 50.906 1.00 18.11 ? ? ? ? ? ? 548 HOH A O   1 
+HETATM 3664 O O   . HOH C 3 .   ? 9.679   35.187 49.107 1.00 13.63 ? ? ? ? ? ? 549 HOH A O   1 
+HETATM 3665 O O   . HOH C 3 .   ? 12.978  23.656 41.467 1.00 19.13 ? ? ? ? ? ? 550 HOH A O   1 
+HETATM 3666 O O   . HOH C 3 .   ? 13.403  21.065 39.767 1.00 31.10 ? ? ? ? ? ? 551 HOH A O   1 
+HETATM 3667 O O   . HOH C 3 .   ? 13.137  20.226 42.769 1.00 36.77 ? ? ? ? ? ? 552 HOH A O   1 
+HETATM 3668 O O   . HOH C 3 .   ? 5.867   24.478 38.739 1.00 15.41 ? ? ? ? ? ? 553 HOH A O   1 
+HETATM 3669 O O   . HOH C 3 .   ? 12.686  25.631 37.215 1.00 14.46 ? ? ? ? ? ? 554 HOH A O   1 
+HETATM 3670 O O   . HOH C 3 .   ? 9.598   23.668 34.183 1.00 32.36 ? ? ? ? ? ? 555 HOH A O   1 
+HETATM 3671 O O   . HOH C 3 .   ? 15.329  25.647 29.196 1.00 27.97 ? ? ? ? ? ? 556 HOH A O   1 
+HETATM 3672 O O   . HOH C 3 .   ? 8.055   26.908 31.369 1.00 30.64 ? ? ? ? ? ? 557 HOH A O   1 
+HETATM 3673 O O   . HOH C 3 .   ? 15.265  18.981 40.138 1.00 21.83 ? ? ? ? ? ? 558 HOH A O   1 
+HETATM 3674 O O   . HOH C 3 .   ? 2.565   33.132 34.297 1.00 26.31 ? ? ? ? ? ? 559 HOH A O   1 
+HETATM 3675 O O   . HOH C 3 .   ? 0.680   35.457 34.317 1.00 26.09 ? ? ? ? ? ? 560 HOH A O   1 
+HETATM 3676 O O   . HOH C 3 .   ? 4.783   33.670 32.644 1.00 27.71 ? ? ? ? ? ? 561 HOH A O   1 
+HETATM 3677 O O   . HOH C 3 .   ? 2.981   39.407 47.063 1.00 12.85 ? ? ? ? ? ? 562 HOH A O   1 
+HETATM 3678 O O   . HOH C 3 .   ? 28.036  27.530 26.347 1.00 32.09 ? ? ? ? ? ? 563 HOH A O   1 
+HETATM 3679 O O   . HOH C 3 .   ? 5.595   45.931 48.723 1.00 15.38 ? ? ? ? ? ? 564 HOH A O   1 
+HETATM 3680 O O   . HOH C 3 .   ? 10.848  42.521 46.656 1.00 13.86 ? ? ? ? ? ? 565 HOH A O   1 
+HETATM 3681 O O   . HOH C 3 .   ? 11.959  56.210 51.149 1.00 30.46 ? ? ? ? ? ? 566 HOH A O   1 
+HETATM 3682 O O   . HOH C 3 .   ? 2.652   56.245 42.937 1.00 36.04 ? ? ? ? ? ? 567 HOH A O   1 
+HETATM 3683 O O   . HOH C 3 .   ? -2.637  47.161 41.999 1.00 24.95 ? ? ? ? ? ? 568 HOH A O   1 
+HETATM 3684 O O   . HOH C 3 .   ? -1.933  46.031 44.244 1.00 23.10 ? ? ? ? ? ? 569 HOH A O   1 
+HETATM 3685 O O   . HOH C 3 .   ? 0.108   47.071 46.158 1.00 33.24 ? ? ? ? ? ? 570 HOH A O   1 
+HETATM 3686 O O   . HOH C 3 .   ? -1.003  43.270 44.358 1.00 28.25 ? ? ? ? ? ? 571 HOH A O   1 
+HETATM 3687 O O   . HOH C 3 .   ? 1.008   43.132 45.997 1.00 28.96 ? ? ? ? ? ? 572 HOH A O   1 
+HETATM 3688 O O   . HOH C 3 .   ? -0.815  45.913 35.424 1.00 21.50 ? ? ? ? ? ? 573 HOH A O   1 
+HETATM 3689 O O   . HOH C 3 .   ? -2.409  46.586 37.542 1.00 26.75 ? ? ? ? ? ? 574 HOH A O   1 
+HETATM 3690 O O   . HOH C 3 .   ? 1.618   42.653 40.550 1.00 15.14 ? ? ? ? ? ? 575 HOH A O   1 
+HETATM 3691 O O   . HOH C 3 .   ? -0.543  41.646 42.136 1.00 27.59 ? ? ? ? ? ? 576 HOH A O   1 
+HETATM 3692 O O   . HOH C 3 .   ? -2.388  41.835 35.140 1.00 33.54 ? ? ? ? ? ? 577 HOH A O   1 
+HETATM 3693 O O   . HOH C 3 .   ? 12.445  42.135 21.189 1.00 28.92 ? ? ? ? ? ? 578 HOH A O   1 
+HETATM 3694 O O   . HOH C 3 .   ? -2.628  31.464 9.998  1.00 49.57 ? ? ? ? ? ? 579 HOH A O   1 
+HETATM 3695 O O   . HOH C 3 .   ? -3.562  51.223 39.974 1.00 43.26 ? ? ? ? ? ? 580 HOH A O   1 
+HETATM 3696 O O   . HOH C 3 .   ? -5.692  23.044 14.793 1.00 36.96 ? ? ? ? ? ? 581 HOH A O   1 
+HETATM 3697 O O   . HOH C 3 .   ? 24.713  33.372 42.779 1.00 13.92 ? ? ? ? ? ? 582 HOH A O   1 
+HETATM 3698 O O   . HOH C 3 .   ? 22.627  8.922  42.811 1.00 33.50 ? ? ? ? ? ? 583 HOH A O   1 
+HETATM 3699 O O   . HOH C 3 .   ? 15.355  25.604 34.286 1.00 16.83 ? ? ? ? ? ? 584 HOH A O   1 
+HETATM 3700 O O   . HOH C 3 .   ? 8.745   29.415 29.287 1.00 24.76 ? ? ? ? ? ? 585 HOH A O   1 
+HETATM 3701 O O   . HOH C 3 .   ? 5.660   34.155 26.053 1.00 25.20 ? ? ? ? ? ? 586 HOH A O   1 
+HETATM 3702 O O   . HOH C 3 .   ? 15.667  52.027 46.369 1.00 24.43 ? ? ? ? ? ? 587 HOH A O   1 
+HETATM 3703 O O   . HOH C 3 .   ? 3.397   37.125 45.563 1.00 9.67  ? ? ? ? ? ? 588 HOH A O   1 
+HETATM 3704 O O   . HOH C 3 .   ? 24.594  46.480 37.707 1.00 20.24 ? ? ? ? ? ? 589 HOH A O   1 
+HETATM 3705 O O   . HOH C 3 .   ? 16.619  41.647 49.954 1.00 22.16 ? ? ? ? ? ? 590 HOH A O   1 
+HETATM 3706 O O   . HOH C 3 .   ? -1.320  35.517 42.237 1.00 24.67 ? ? ? ? ? ? 591 HOH A O   1 
+HETATM 3707 O O   . HOH C 3 .   ? 1.668   37.402 43.531 1.00 15.49 ? ? ? ? ? ? 592 HOH A O   1 
+HETATM 3708 O O   . HOH C 3 .   ? 17.707  43.297 44.274 1.00 25.88 ? ? ? ? ? ? 593 HOH A O   1 
+HETATM 3709 O O   . HOH C 3 .   ? 15.604  52.058 43.372 1.00 17.35 ? ? ? ? ? ? 594 HOH A O   1 
+HETATM 3710 O O   . HOH C 3 .   ? 13.576  23.828 33.304 1.00 24.36 ? ? ? ? ? ? 595 HOH A O   1 
+HETATM 3711 O O   . HOH C 3 .   ? 13.402  42.111 44.341 1.00 14.72 ? ? ? ? ? ? 596 HOH A O   1 
+HETATM 3712 O O   . HOH C 3 .   ? 25.537  27.625 56.453 1.00 15.39 ? ? ? ? ? ? 597 HOH A O   1 
+HETATM 3713 O O   . HOH C 3 .   ? 21.081  25.340 26.683 1.00 29.13 ? ? ? ? ? ? 598 HOH A O   1 
+HETATM 3714 O O   . HOH C 3 .   ? 18.507  26.717 28.023 1.00 26.28 ? ? ? ? ? ? 599 HOH A O   1 
+HETATM 3715 O O   . HOH C 3 .   ? 15.233  44.228 45.753 1.00 22.02 ? ? ? ? ? ? 600 HOH A O   1 
+HETATM 3716 O O   . HOH C 3 .   ? 30.382  14.477 54.424 1.00 13.46 ? ? ? ? ? ? 601 HOH A O   1 
+HETATM 3717 O O   . HOH C 3 .   ? -1.917  32.631 47.501 1.00 17.89 ? ? ? ? ? ? 602 HOH A O   1 
+HETATM 3718 O O   . HOH C 3 .   ? 16.412  36.624 47.382 1.00 15.80 ? ? ? ? ? ? 603 HOH A O   1 
+HETATM 3719 O O   . HOH C 3 .   ? 10.572  57.082 47.743 1.00 27.85 ? ? ? ? ? ? 604 HOH A O   1 
+HETATM 3720 O O   . HOH C 3 .   ? 4.242   33.024 24.052 1.00 24.09 ? ? ? ? ? ? 605 HOH A O   1 
+HETATM 3721 O O   . HOH C 3 .   ? 32.177  19.908 50.320 1.00 30.81 ? ? ? ? ? ? 606 HOH A O   1 
+HETATM 3722 O O   . HOH C 3 .   ? 25.821  24.130 63.208 1.00 33.87 ? ? ? ? ? ? 607 HOH A O   1 
+HETATM 3723 O O   . HOH C 3 .   ? -0.384  39.362 43.833 1.00 19.16 ? ? ? ? ? ? 608 HOH A O   1 
+HETATM 3724 O O   . HOH C 3 .   ? 21.616  17.000 54.048 1.00 16.19 ? ? ? ? ? ? 609 HOH A O   1 
+HETATM 3725 O O   . HOH C 3 .   ? 1.213   36.688 36.689 1.00 12.15 ? ? ? ? ? ? 610 HOH A O   1 
+HETATM 3726 O O   . HOH C 3 .   ? 17.229  24.335 31.963 1.00 22.11 ? ? ? ? ? ? 611 HOH A O   1 
+HETATM 3727 O O   . HOH C 3 .   ? 17.107  33.368 24.123 1.00 26.67 ? ? ? ? ? ? 612 HOH A O   1 
+HETATM 3728 O O   . HOH C 3 .   ? 22.907  42.964 39.537 1.00 18.23 ? ? ? ? ? ? 613 HOH A O   1 
+HETATM 3729 O O   . HOH C 3 .   ? 33.701  18.019 47.667 1.00 22.44 ? ? ? ? ? ? 614 HOH A O   1 
+HETATM 3730 O O   . HOH C 3 .   ? 31.380  17.671 49.569 1.00 25.24 ? ? ? ? ? ? 615 HOH A O   1 
+HETATM 3731 O O   . HOH C 3 .   ? 11.899  23.525 35.715 1.00 21.98 ? ? ? ? ? ? 616 HOH A O   1 
+HETATM 3732 O O   . HOH C 3 .   ? 8.828   35.663 27.039 1.00 23.23 ? ? ? ? ? ? 617 HOH A O   1 
+HETATM 3733 O O   . HOH C 3 .   ? 0.602   40.204 46.308 1.00 27.66 ? ? ? ? ? ? 618 HOH A O   1 
+HETATM 3734 O O   . HOH C 3 .   ? 31.776  27.801 54.194 1.00 43.62 ? ? ? ? ? ? 619 HOH A O   1 
+HETATM 3735 O O   . HOH C 3 .   ? -1.869  45.484 40.096 1.00 21.04 ? ? ? ? ? ? 620 HOH A O   1 
+HETATM 3736 O O   . HOH C 3 .   ? 12.977  25.999 39.801 1.00 14.56 ? ? ? ? ? ? 621 HOH A O   1 
+HETATM 3737 O O   . HOH C 3 .   ? 7.329   35.033 50.247 1.00 11.88 ? ? ? ? ? ? 622 HOH A O   1 
+HETATM 3738 O O   . HOH C 3 .   ? 12.036  45.546 46.139 1.00 17.98 ? ? ? ? ? ? 623 HOH A O   1 
+HETATM 3739 O O   . HOH C 3 .   ? 16.026  30.409 45.404 1.00 17.74 ? ? ? ? ? ? 624 HOH A O   1 
+HETATM 3740 O O   . HOH C 3 .   ? 10.145  41.343 22.267 1.00 33.16 ? ? ? ? ? ? 625 HOH A O   1 
+HETATM 3741 O O   . HOH C 3 .   ? 12.895  39.404 53.100 1.00 23.25 ? ? ? ? ? ? 626 HOH A O   1 
+HETATM 3742 O O   . HOH C 3 .   ? 17.585  29.784 43.307 1.00 26.56 ? ? ? ? ? ? 627 HOH A O   1 
+HETATM 3743 O O   . HOH C 3 .   ? 25.093  43.462 41.252 1.00 20.06 ? ? ? ? ? ? 628 HOH A O   1 
+HETATM 3744 O O   . HOH C 3 .   ? 13.283  43.415 47.010 1.00 32.27 ? ? ? ? ? ? 629 HOH A O   1 
+HETATM 3745 O O   . HOH C 3 .   ? 15.201  40.978 52.357 1.00 23.06 ? ? ? ? ? ? 630 HOH A O   1 
+HETATM 3746 O O   . HOH C 3 .   ? 21.153  40.845 48.452 1.00 34.61 ? ? ? ? ? ? 631 HOH A O   1 
+HETATM 3747 O O   . HOH C 3 .   ? -1.323  39.103 37.705 1.00 25.81 ? ? ? ? ? ? 632 HOH A O   1 
+HETATM 3748 O O   . HOH C 3 .   ? 10.671  38.750 21.925 1.00 37.57 ? ? ? ? ? ? 633 HOH A O   1 
+HETATM 3749 O O   . HOH C 3 .   ? 7.741   33.012 52.174 1.00 20.89 ? ? ? ? ? ? 634 HOH A O   1 
+HETATM 3750 O O   . HOH C 3 .   ? 14.082  13.397 49.707 1.00 35.42 ? ? ? ? ? ? 635 HOH A O   1 
+HETATM 3751 O O   . HOH C 3 .   ? 5.807   22.276 41.683 1.00 26.93 ? ? ? ? ? ? 636 HOH A O   1 
+HETATM 3752 O O   . HOH C 3 .   ? 4.798   31.059 31.573 1.00 25.23 ? ? ? ? ? ? 637 HOH A O   1 
+HETATM 3753 O O   . HOH C 3 .   ? 4.429   52.010 29.571 1.00 42.43 ? ? ? ? ? ? 638 HOH A O   1 
+HETATM 3754 O O   . HOH C 3 .   ? 24.002  9.672  48.364 1.00 27.06 ? ? ? ? ? ? 639 HOH A O   1 
+HETATM 3755 O O   . HOH C 3 .   ? 15.004  61.143 31.528 1.00 33.22 ? ? ? ? ? ? 640 HOH A O   1 
+HETATM 3756 O O   . HOH C 3 .   ? 4.827   44.981 56.140 1.00 31.53 ? ? ? ? ? ? 641 HOH A O   1 
+HETATM 3757 O O   . HOH C 3 .   ? 13.335  56.332 48.810 1.00 27.49 ? ? ? ? ? ? 642 HOH A O   1 
+HETATM 3758 O O   . HOH C 3 .   ? 18.947  24.871 30.066 1.00 25.42 ? ? ? ? ? ? 643 HOH A O   1 
+HETATM 3759 O O   . HOH C 3 .   ? -3.548  22.339 21.403 1.00 38.66 ? ? ? ? ? ? 644 HOH A O   1 
+HETATM 3760 O O   . HOH C 3 .   ? 21.998  50.447 35.178 1.00 25.96 ? ? ? ? ? ? 645 HOH A O   1 
+HETATM 3761 O O   . HOH C 3 .   ? 15.157  55.429 39.317 1.00 24.42 ? ? ? ? ? ? 646 HOH A O   1 
+HETATM 3762 O O   . HOH C 3 .   ? -2.529  34.018 45.595 1.00 35.06 ? ? ? ? ? ? 647 HOH A O   1 
+HETATM 3763 O O   . HOH C 3 .   ? 22.093  11.286 47.780 1.00 26.18 ? ? ? ? ? ? 648 HOH A O   1 
+HETATM 3764 O O   . HOH C 3 .   ? 26.801  28.926 62.954 1.00 31.43 ? ? ? ? ? ? 649 HOH A O   1 
+HETATM 3765 O O   . HOH C 3 .   ? 22.581  49.509 46.504 1.00 27.21 ? ? ? ? ? ? 650 HOH A O   1 
+HETATM 3766 O O   . HOH C 3 .   ? 17.913  44.066 62.407 1.00 40.66 ? ? ? ? ? ? 651 HOH A O   1 
+HETATM 3767 O O   . HOH C 3 .   ? 23.454  21.101 35.626 1.00 33.39 ? ? ? ? ? ? 652 HOH A O   1 
+HETATM 3768 O O   . HOH C 3 .   ? 15.783  22.248 12.294 1.00 34.00 ? ? ? ? ? ? 653 HOH A O   1 
+HETATM 3769 O O   . HOH C 3 .   ? 17.460  31.013 23.014 1.00 26.56 ? ? ? ? ? ? 654 HOH A O   1 
+HETATM 3770 O O   . HOH C 3 .   ? -8.044  20.579 -0.110 1.00 35.01 ? ? ? ? ? ? 655 HOH A O   1 
+HETATM 3771 O O   . HOH C 3 .   ? 28.060  9.122  47.947 1.00 24.96 ? ? ? ? ? ? 656 HOH A O   1 
+HETATM 3772 O O   . HOH C 3 .   ? 26.576  47.333 42.162 1.00 31.02 ? ? ? ? ? ? 657 HOH A O   1 
+HETATM 3773 O O   . HOH C 3 .   ? 12.073  60.860 34.675 1.00 31.52 ? ? ? ? ? ? 658 HOH A O   1 
+HETATM 3774 O O   . HOH C 3 .   ? 6.528   0.992  20.098 1.00 36.25 ? ? ? ? ? ? 659 HOH A O   1 
+HETATM 3775 O O   . HOH C 3 .   ? 19.122  36.834 47.411 1.00 21.29 ? ? ? ? ? ? 660 HOH A O   1 
+HETATM 3776 O O   . HOH C 3 .   ? 6.846   19.834 42.404 1.00 32.91 ? ? ? ? ? ? 661 HOH A O   1 
+HETATM 3777 O O   . HOH C 3 .   ? 20.313  31.022 20.399 1.00 57.06 ? ? ? ? ? ? 662 HOH A O   1 
+HETATM 3778 O O   . HOH C 3 .   ? 28.861  50.781 36.179 1.00 34.96 ? ? ? ? ? ? 663 HOH A O   1 
+HETATM 3779 O O   . HOH C 3 .   ? 14.655  17.258 38.096 1.00 20.21 ? ? ? ? ? ? 664 HOH A O   1 
+HETATM 3780 O O   . HOH C 3 .   ? 8.599   24.824 26.837 1.00 33.63 ? ? ? ? ? ? 665 HOH A O   1 
+HETATM 3781 O O   . HOH C 3 .   ? 13.342  36.808 1.406  1.00 39.19 ? ? ? ? ? ? 666 HOH A O   1 
+HETATM 3782 O O   . HOH C 3 .   ? 19.557  50.397 36.953 1.00 28.09 ? ? ? ? ? ? 667 HOH A O   1 
+HETATM 3783 O O   . HOH C 3 .   ? 24.341  22.467 61.358 1.00 25.34 ? ? ? ? ? ? 668 HOH A O   1 
+HETATM 3784 O O   . HOH C 3 .   ? 8.486   20.269 44.415 1.00 32.07 ? ? ? ? ? ? 669 HOH A O   1 
+HETATM 3785 O O   . HOH C 3 .   ? -4.130  24.596 23.007 1.00 31.44 ? ? ? ? ? ? 670 HOH A O   1 
+HETATM 3786 O O   . HOH C 3 .   ? 4.087   49.247 53.736 1.00 34.04 ? ? ? ? ? ? 671 HOH A O   1 
+HETATM 3787 O O   . HOH C 3 .   ? 1.110   45.223 47.580 1.00 34.50 ? ? ? ? ? ? 672 HOH A O   1 
+HETATM 3788 O O   . HOH C 3 .   ? 19.758  11.043 49.038 1.00 29.26 ? ? ? ? ? ? 673 HOH A O   1 
+HETATM 3789 O O   . HOH C 3 .   ? -4.197  24.641 4.660  1.00 36.31 ? ? ? ? ? ? 674 HOH A O   1 
+HETATM 3790 O O   . HOH C 3 .   ? 5.119   27.093 28.220 1.00 43.37 ? ? ? ? ? ? 675 HOH A O   1 
+HETATM 3791 O O   . HOH C 3 .   ? 31.128  32.385 36.222 1.00 31.45 ? ? ? ? ? ? 676 HOH A O   1 
+HETATM 3792 O O   . HOH C 3 .   ? 1.160   38.035 30.077 1.00 24.74 ? ? ? ? ? ? 677 HOH A O   1 
+HETATM 3793 O O   . HOH C 3 .   ? -1.498  49.011 38.880 1.00 33.11 ? ? ? ? ? ? 678 HOH A O   1 
+HETATM 3794 O O   . HOH C 3 .   ? 16.018  12.909 55.048 1.00 46.02 ? ? ? ? ? ? 679 HOH A O   1 
+HETATM 3795 O O   . HOH C 3 .   ? 3.662   29.113 32.921 1.00 32.81 ? ? ? ? ? ? 680 HOH A O   1 
+HETATM 3796 O O   . HOH C 3 .   ? 17.268  26.958 24.113 1.00 28.83 ? ? ? ? ? ? 681 HOH A O   1 
+HETATM 3797 O O   . HOH C 3 .   ? 13.572  29.321 62.311 1.00 35.65 ? ? ? ? ? ? 682 HOH A O   1 
+HETATM 3798 O O   . HOH C 3 .   ? 23.904  58.996 39.091 1.00 25.06 ? ? ? ? ? ? 683 HOH A O   1 
+HETATM 3799 O O   . HOH C 3 .   ? 32.908  13.054 41.220 1.00 19.88 ? ? ? ? ? ? 684 HOH A O   1 
+HETATM 3800 O O   . HOH C 3 .   ? 3.012   46.706 49.668 1.00 25.61 ? ? ? ? ? ? 685 HOH A O   1 
+HETATM 3801 O O   . HOH C 3 .   ? -1.644  0.571  34.683 1.00 26.02 ? ? ? ? ? ? 686 HOH A O   1 
+HETATM 3802 O O   . HOH C 3 .   ? -1.056  48.307 33.534 1.00 30.78 ? ? ? ? ? ? 687 HOH A O   1 
+HETATM 3803 O O   . HOH C 3 .   ? 2.586   50.441 30.391 1.00 29.98 ? ? ? ? ? ? 688 HOH A O   1 
+HETATM 3804 O O   . HOH C 3 .   ? 3.733   49.895 25.854 1.00 27.71 ? ? ? ? ? ? 689 HOH A O   1 
+HETATM 3805 O O   . HOH C 3 .   ? 26.171  45.583 39.967 1.00 35.88 ? ? ? ? ? ? 690 HOH A O   1 
+HETATM 3806 O O   . HOH C 3 .   ? 19.124  21.337 33.925 1.00 39.28 ? ? ? ? ? ? 691 HOH A O   1 
+HETATM 3807 O O   . HOH C 3 .   ? 25.572  43.357 56.592 1.00 36.91 ? ? ? ? ? ? 692 HOH A O   1 
+HETATM 3808 O O   . HOH C 3 .   ? 5.315   51.733 27.091 1.00 31.86 ? ? ? ? ? ? 693 HOH A O   1 
+HETATM 3809 O O   . HOH C 3 .   ? 27.152  41.691 41.744 1.00 30.42 ? ? ? ? ? ? 694 HOH A O   1 
+HETATM 3810 O O   . HOH C 3 .   ? 1.961   36.086 31.859 1.00 33.10 ? ? ? ? ? ? 695 HOH A O   1 
+HETATM 3811 O O   . HOH C 3 .   ? 18.436  42.411 11.307 1.00 41.81 ? ? ? ? ? ? 696 HOH A O   1 
+HETATM 3812 O O   . HOH C 3 .   ? 32.199  44.371 26.404 1.00 40.93 ? ? ? ? ? ? 697 HOH A O   1 
+HETATM 3813 O O   . HOH C 3 .   ? 20.431  37.088 49.544 1.00 33.71 ? ? ? ? ? ? 698 HOH A O   1 
+HETATM 3814 O O   . HOH C 3 .   ? 8.847   46.028 3.578  1.00 32.97 ? ? ? ? ? ? 699 HOH A O   1 
+HETATM 3815 O O   . HOH C 3 .   ? 12.944  28.805 24.638 1.00 38.37 ? ? ? ? ? ? 700 HOH A O   1 
+HETATM 3816 O O   . HOH C 3 .   ? 5.908   57.891 42.240 1.00 26.17 ? ? ? ? ? ? 701 HOH A O   1 
+HETATM 3817 O O   . HOH C 3 .   ? 6.647   23.097 51.450 1.00 35.27 ? ? ? ? ? ? 702 HOH A O   1 
+HETATM 3818 O O   . HOH C 3 .   ? 5.598   56.222 21.969 1.00 36.08 ? ? ? ? ? ? 703 HOH A O   1 
+HETATM 3819 O O   . HOH C 3 .   ? 10.353  13.398 34.474 1.00 33.56 ? ? ? ? ? ? 704 HOH A O   1 
+HETATM 3820 O O   . HOH C 3 .   ? 14.521  53.787 48.819 1.00 29.29 ? ? ? ? ? ? 705 HOH A O   1 
+HETATM 3821 O O   . HOH C 3 .   ? -14.407 0.072  32.859 1.00 42.00 ? ? ? ? ? ? 706 HOH A O   1 
+HETATM 3822 O O   . HOH C 3 .   ? 14.790  16.948 44.236 1.00 31.76 ? ? ? ? ? ? 707 HOH A O   1 
+HETATM 3823 O O   . HOH C 3 .   ? 15.592  28.915 23.232 1.00 36.49 ? ? ? ? ? ? 708 HOH A O   1 
+HETATM 3824 O O   . HOH C 3 .   ? 7.140   38.375 54.236 1.00 35.85 ? ? ? ? ? ? 709 HOH A O   1 
+HETATM 3825 O O   . HOH C 3 .   ? 26.052  15.950 33.920 1.00 39.31 ? ? ? ? ? ? 710 HOH A O   1 
+HETATM 3826 O O   . HOH C 3 .   ? 14.276  14.128 44.555 1.00 40.73 ? ? ? ? ? ? 711 HOH A O   1 
+HETATM 3827 O O   . HOH C 3 .   ? 7.367   54.628 50.764 1.00 34.29 ? ? ? ? ? ? 712 HOH A O   1 
+HETATM 3828 O O   . HOH C 3 .   ? 0.616   58.938 41.965 1.00 39.15 ? ? ? ? ? ? 713 HOH A O   1 
+HETATM 3829 O O   . HOH C 3 .   ? 21.861  36.431 20.411 1.00 43.46 ? ? ? ? ? ? 714 HOH A O   1 
+HETATM 3830 O O   . HOH C 3 .   ? -3.368  2.240  28.249 1.00 40.81 ? ? ? ? ? ? 715 HOH A O   1 
+HETATM 3831 O O   . HOH C 3 .   ? 23.917  40.346 62.520 1.00 43.52 ? ? ? ? ? ? 716 HOH A O   1 
+HETATM 3832 O O   . HOH C 3 .   ? -3.112  44.585 33.954 1.00 35.89 ? ? ? ? ? ? 717 HOH A O   1 
+HETATM 3833 O O   . HOH C 3 .   ? 25.491  44.722 44.317 1.00 45.77 ? ? ? ? ? ? 718 HOH A O   1 
+HETATM 3834 O O   . HOH C 3 .   ? 24.278  45.080 54.544 1.00 42.84 ? ? ? ? ? ? 719 HOH A O   1 
+HETATM 3835 O O   . HOH C 3 .   ? 15.697  62.632 36.182 1.00 42.62 ? ? ? ? ? ? 720 HOH A O   1 
+HETATM 3836 O O   . HOH C 3 .   ? 15.432  42.651 54.676 1.00 33.95 ? ? ? ? ? ? 721 HOH A O   1 
+HETATM 3837 O O   . HOH C 3 .   ? 36.705  17.642 47.363 1.00 39.51 ? ? ? ? ? ? 722 HOH A O   1 
+HETATM 3838 O O   . HOH C 3 .   ? 14.375  62.256 33.752 1.00 33.89 ? ? ? ? ? ? 723 HOH A O   1 
+HETATM 3839 O O   . HOH C 3 .   ? 25.850  35.626 21.216 1.00 45.67 ? ? ? ? ? ? 724 HOH A O   1 
+HETATM 3840 O O   . HOH C 3 .   ? 12.135  59.827 27.536 1.00 41.89 ? ? ? ? ? ? 725 HOH A O   1 
+HETATM 3841 O O   . HOH C 3 .   ? 13.913  62.894 38.162 1.00 42.93 ? ? ? ? ? ? 726 HOH A O   1 
+HETATM 3842 O O   . HOH C 3 .   ? 7.803   18.625 51.210 1.00 34.42 ? ? ? ? ? ? 727 HOH A O   1 
+HETATM 3843 O O   . HOH C 3 .   ? 20.229  12.147 52.899 1.00 40.53 ? ? ? ? ? ? 728 HOH A O   1 
+HETATM 3844 O O   . HOH C 3 .   ? 6.177   21.540 38.552 1.00 41.02 ? ? ? ? ? ? 729 HOH A O   1 
+HETATM 3845 O O   . HOH C 3 .   ? 26.640  34.612 44.166 1.00 38.11 ? ? ? ? ? ? 730 HOH A O   1 
+HETATM 3846 O O   . HOH C 3 .   ? 18.674  51.686 54.639 1.00 38.60 ? ? ? ? ? ? 731 HOH A O   1 
+HETATM 3847 O O   . HOH C 3 .   ? 17.034  24.579 18.637 1.00 34.00 ? ? ? ? ? ? 732 HOH A O   1 
+HETATM 3848 O O   . HOH C 3 .   ? 5.299   55.660 32.246 1.00 27.21 ? ? ? ? ? ? 733 HOH A O   1 
+HETATM 3849 O O   . HOH C 3 .   ? 10.769  36.306 14.942 1.00 44.40 ? ? ? ? ? ? 734 HOH A O   1 
+HETATM 3850 O O   . HOH C 3 .   ? 13.424  39.512 55.608 1.00 42.03 ? ? ? ? ? ? 735 HOH A O   1 
+HETATM 3851 O O   . HOH C 3 .   ? -5.045  15.220 15.336 1.00 51.90 ? ? ? ? ? ? 736 HOH A O   1 
+HETATM 3852 O O   . HOH C 3 .   ? 28.618  7.391  43.699 1.00 43.86 ? ? ? ? ? ? 737 HOH A O   1 
+HETATM 3853 O O   . HOH C 3 .   ? 2.076   3.100  47.155 1.00 38.22 ? ? ? ? ? ? 738 HOH A O   1 
+HETATM 3854 O O   . HOH C 3 .   ? 13.620  27.240 26.596 1.00 33.48 ? ? ? ? ? ? 739 HOH A O   1 
+HETATM 3855 O O   . HOH C 3 .   ? 23.032  13.187 34.129 1.00 44.64 ? ? ? ? ? ? 740 HOH A O   1 
+HETATM 3856 O O   . HOH C 3 .   ? -2.384  40.368 39.677 1.00 41.85 ? ? ? ? ? ? 741 HOH A O   1 
+HETATM 3857 O O   . HOH C 3 .   ? 4.504   53.148 50.224 1.00 42.20 ? ? ? ? ? ? 742 HOH A O   1 
+HETATM 3858 O O   . HOH C 3 .   ? 10.048  61.312 32.810 1.00 37.44 ? ? ? ? ? ? 743 HOH A O   1 
+HETATM 3859 O O   . HOH C 3 .   ? -6.247  5.942  34.270 1.00 49.98 ? ? ? ? ? ? 744 HOH A O   1 
+HETATM 3860 O O   . HOH C 3 .   ? 34.513  39.617 27.581 1.00 43.68 ? ? ? ? ? ? 745 HOH A O   1 
+HETATM 3861 O O   . HOH C 3 .   ? 30.892  31.605 29.285 1.00 52.12 ? ? ? ? ? ? 746 HOH A O   1 
+HETATM 3862 O O   . HOH C 3 .   ? 22.996  50.959 52.839 1.00 43.52 ? ? ? ? ? ? 747 HOH A O   1 
+HETATM 3863 O O   . HOH C 3 .   ? -6.210  15.144 3.020  1.00 44.30 ? ? ? ? ? ? 748 HOH A O   1 
+HETATM 3864 O O   . HOH C 3 .   ? 7.737   32.127 26.532 1.00 43.55 ? ? ? ? ? ? 749 HOH A O   1 
+HETATM 3865 O O   . HOH C 3 .   ? 34.090  48.369 34.333 1.00 47.77 ? ? ? ? ? ? 750 HOH A O   1 
+HETATM 3866 O O   . HOH C 3 .   ? 23.093  34.772 48.707 1.00 34.63 ? ? ? ? ? ? 751 HOH A O   1 
+HETATM 3867 O O   . HOH C 3 .   ? 29.324  13.566 35.101 1.00 56.81 ? ? ? ? ? ? 752 HOH A O   1 
+HETATM 3868 O O   . HOH C 3 .   ? 2.781   10.569 11.433 1.00 31.41 ? ? ? ? ? ? 753 HOH A O   1 
+HETATM 3869 O O   . HOH C 3 .   ? 39.058  32.283 46.442 1.00 42.07 ? ? ? ? ? ? 754 HOH A O   1 
+HETATM 3870 O O   . HOH C 3 .   ? 27.393  38.611 38.510 1.00 41.75 ? ? ? ? ? ? 755 HOH A O   1 
+HETATM 3871 O O   . HOH C 3 .   ? 23.776  12.520 55.591 1.00 31.10 ? ? ? ? ? ? 756 HOH A O   1 
+HETATM 3872 O O   . HOH C 3 .   ? 23.261  36.351 57.952 1.00 53.24 ? ? ? ? ? ? 757 HOH A O   1 
+HETATM 3873 O O   . HOH C 3 .   ? 9.280   56.903 49.923 1.00 39.62 ? ? ? ? ? ? 758 HOH A O   1 
+HETATM 3874 O O   . HOH C 3 .   ? 6.542   17.218 21.802 1.00 38.78 ? ? ? ? ? ? 759 HOH A O   1 
+HETATM 3875 O O   . HOH C 3 .   ? -1.313  17.242 28.604 1.00 53.99 ? ? ? ? ? ? 760 HOH A O   1 
+HETATM 3876 O O   . HOH C 3 .   ? 3.056   33.145 29.301 1.00 43.60 ? ? ? ? ? ? 761 HOH A O   1 
+HETATM 3877 O O   . HOH C 3 .   ? 37.316  12.396 42.666 1.00 39.00 ? ? ? ? ? ? 762 HOH A O   1 
+HETATM 3878 O O   . HOH C 3 .   ? -0.942  13.086 12.056 1.00 37.42 ? ? ? ? ? ? 763 HOH A O   1 
+HETATM 3879 O O   . HOH C 3 .   ? 20.476  17.550 35.339 1.00 27.16 ? ? ? ? ? ? 764 HOH A O   1 
+HETATM 3880 O O   . HOH C 3 .   ? -8.132  17.961 16.818 1.00 37.13 ? ? ? ? ? ? 765 HOH A O   1 
+HETATM 3881 O O   . HOH C 3 .   ? 17.662  37.958 12.839 1.00 56.12 ? ? ? ? ? ? 766 HOH A O   1 
+HETATM 3882 O O   . HOH C 3 .   ? 8.893   15.841 9.655  1.00 35.94 ? ? ? ? ? ? 767 HOH A O   1 
+HETATM 3883 O O   . HOH C 3 .   ? 16.937  8.720  21.935 1.00 46.32 ? ? ? ? ? ? 768 HOH A O   1 
+HETATM 3884 O O   . HOH C 3 .   ? 14.629  44.554 61.958 1.00 57.08 ? ? ? ? ? ? 769 HOH A O   1 
+HETATM 3885 O O   . HOH C 3 .   ? 20.260  42.727 5.436  1.00 41.70 ? ? ? ? ? ? 770 HOH A O   1 
+HETATM 3886 O O   . HOH C 3 .   ? -4.475  1.425  36.545 1.00 51.90 ? ? ? ? ? ? 771 HOH A O   1 
+HETATM 3887 O O   . HOH C 3 .   ? 12.017  15.392 34.354 1.00 54.18 ? ? ? ? ? ? 772 HOH A O   1 
+HETATM 3888 O O   . HOH C 3 .   ? -4.889  33.583 37.222 1.00 52.47 ? ? ? ? ? ? 773 HOH A O   1 
+HETATM 3889 O O   . HOH C 3 .   ? 29.208  30.315 36.175 1.00 27.43 ? ? ? ? ? ? 774 HOH A O   1 
+HETATM 3890 O O   . HOH C 3 .   ? 10.291  42.109 56.286 1.00 30.42 ? ? ? ? ? ? 775 HOH A O   1 
+HETATM 3891 O O   . HOH C 3 .   ? 24.485  48.493 49.776 1.00 52.97 ? ? ? ? ? ? 776 HOH A O   1 
+HETATM 3892 O O   . HOH C 3 .   ? 16.725  15.091 20.214 1.00 55.30 ? ? ? ? ? ? 777 HOH A O   1 
+HETATM 3893 O O   . HOH C 3 .   ? 7.089   58.361 39.843 1.00 38.04 ? ? ? ? ? ? 778 HOH A O   1 
+HETATM 3894 O O   . HOH C 3 .   ? 2.068   52.703 36.797 1.00 42.49 ? ? ? ? ? ? 779 HOH A O   1 
+HETATM 3895 O O   . HOH C 3 .   ? 3.174   49.501 50.677 1.00 45.70 ? ? ? ? ? ? 780 HOH A O   1 
+HETATM 3896 O O   . HOH C 3 .   ? 16.826  18.566 58.409 1.00 48.87 ? ? ? ? ? ? 781 HOH A O   1 
+HETATM 3897 O O   . HOH C 3 .   ? 11.906  41.088 18.503 1.00 34.98 ? ? ? ? ? ? 782 HOH A O   1 
+HETATM 3898 O O   . HOH C 3 .   ? 23.055  36.354 44.925 1.00 31.75 ? ? ? ? ? ? 783 HOH A O   1 
+HETATM 3899 O O   . HOH C 3 .   ? 14.297  24.750 2.159  1.00 42.76 ? ? ? ? ? ? 784 HOH A O   1 
+HETATM 3900 O O   . HOH C 3 .   ? -11.182 24.647 3.892  1.00 52.94 ? ? ? ? ? ? 785 HOH A O   1 
+HETATM 3901 O O   . HOH C 3 .   ? -15.434 16.221 14.663 1.00 51.70 ? ? ? ? ? ? 786 HOH A O   1 
+HETATM 3902 O O   . HOH C 3 .   ? -10.669 26.264 23.480 1.00 46.53 ? ? ? ? ? ? 787 HOH A O   1 
+HETATM 3903 O O   . HOH C 3 .   ? 4.918   54.258 25.759 1.00 41.26 ? ? ? ? ? ? 788 HOH A O   1 
+HETATM 3904 O O   . HOH C 3 .   ? 20.700  32.042 9.279  1.00 44.20 ? ? ? ? ? ? 789 HOH A O   1 
+HETATM 3905 O O   . HOH C 3 .   ? 27.514  34.516 58.919 1.00 41.59 ? ? ? ? ? ? 790 HOH A O   1 
+HETATM 3906 O O   . HOH C 3 .   ? 22.478  24.660 24.422 1.00 34.19 ? ? ? ? ? ? 791 HOH A O   1 
+HETATM 3907 O O   . HOH C 3 .   ? 21.233  8.200  46.441 1.00 36.05 ? ? ? ? ? ? 792 HOH A O   1 
+HETATM 3908 O O   . HOH C 3 .   ? 35.913  32.234 40.913 1.00 39.06 ? ? ? ? ? ? 793 HOH A O   1 
+HETATM 3909 O O   . HOH C 3 .   ? 22.938  34.662 41.850 1.00 41.92 ? ? ? ? ? ? 794 HOH A O   1 
+HETATM 3910 O O   . HOH C 3 .   ? 5.765   25.584 34.918 1.00 41.27 ? ? ? ? ? ? 795 HOH A O   1 
+HETATM 3911 O O   . HOH C 3 .   ? 18.162  63.440 35.454 1.00 34.17 ? ? ? ? ? ? 796 HOH A O   1 
+HETATM 3912 O O   . HOH C 3 .   ? 6.615   14.881 25.048 1.00 44.10 ? ? ? ? ? ? 797 HOH A O   1 
+HETATM 3913 O O   . HOH C 3 .   ? 28.285  15.969 32.625 1.00 55.38 ? ? ? ? ? ? 798 HOH A O   1 
+HETATM 3914 O O   . HOH C 3 .   ? -3.305  5.072  22.803 1.00 43.26 ? ? ? ? ? ? 799 HOH A O   1 
+HETATM 3915 O O   . HOH C 3 .   ? 9.542   21.690 27.424 1.00 53.30 ? ? ? ? ? ? 800 HOH A O   1 
+HETATM 3916 O O   . HOH C 3 .   ? 11.403  -1.770 28.423 1.00 50.42 ? ? ? ? ? ? 801 HOH A O   1 
+HETATM 3917 O O   . HOH C 3 .   ? 9.665   38.895 55.851 1.00 38.71 ? ? ? ? ? ? 802 HOH A O   1 
+HETATM 3918 O O   . HOH C 3 .   ? 3.121   -2.282 19.447 1.00 56.50 ? ? ? ? ? ? 803 HOH A O   1 
+HETATM 3919 O O   . HOH C 3 .   ? 11.943  5.541  45.649 1.00 60.37 ? ? ? ? ? ? 804 HOH A O   1 
+HETATM 3920 O O   . HOH C 3 .   ? 0.520   38.070 25.139 1.00 40.62 ? ? ? ? ? ? 805 HOH A O   1 
+HETATM 3921 O O   . HOH C 3 .   ? 16.120  34.272 20.016 1.00 34.95 ? ? ? ? ? ? 806 HOH A O   1 
+HETATM 3922 O O   . HOH C 3 .   ? -7.210  40.419 41.636 1.00 49.81 ? ? ? ? ? ? 807 HOH A O   1 
+HETATM 3923 O O   . HOH C 3 .   ? 2.956   59.236 40.694 1.00 53.41 ? ? ? ? ? ? 808 HOH A O   1 
+HETATM 3924 O O   . HOH C 3 .   ? 24.019  50.079 58.629 1.00 42.95 ? ? ? ? ? ? 809 HOH A O   1 
+HETATM 3925 O O   . HOH C 3 .   ? 8.467   24.971 29.756 1.00 30.24 ? ? ? ? ? ? 810 HOH A O   1 
+HETATM 3926 O O   . HOH C 3 .   ? 8.901   41.258 4.699  1.00 43.21 ? ? ? ? ? ? 811 HOH A O   1 
+HETATM 3927 O O   . HOH C 3 .   ? 16.546  17.538 16.820 1.00 47.55 ? ? ? ? ? ? 812 HOH A O   1 
+HETATM 3928 O O   . HOH C 3 .   ? 9.399   40.813 17.522 1.00 31.20 ? ? ? ? ? ? 813 HOH A O   1 
+HETATM 3929 O O   . HOH C 3 .   ? 37.472  20.920 36.812 1.00 44.24 ? ? ? ? ? ? 814 HOH A O   1 
+HETATM 3930 O O   . HOH C 3 .   ? 19.514  20.018 59.682 1.00 48.20 ? ? ? ? ? ? 815 HOH A O   1 
+HETATM 3931 O O   . HOH C 3 .   ? 12.416  24.140 31.040 1.00 21.99 ? ? ? ? ? ? 816 HOH A O   1 
+HETATM 3932 O O   . HOH C 3 .   ? 28.984  47.254 30.890 1.00 53.94 ? ? ? ? ? ? 817 HOH A O   1 
+HETATM 3933 O O   . HOH C 3 .   ? 26.261  21.049 32.479 1.00 40.15 ? ? ? ? ? ? 818 HOH A O   1 
+HETATM 3934 O O   . HOH C 3 .   ? -1.160  4.529  38.052 1.00 52.63 ? ? ? ? ? ? 819 HOH A O   1 
+HETATM 3935 O O   . HOH C 3 .   ? 32.486  30.153 55.780 1.00 38.79 ? ? ? ? ? ? 820 HOH A O   1 
+HETATM 3936 O O   . HOH C 3 .   ? 6.621   7.205  45.903 1.00 40.63 ? ? ? ? ? ? 821 HOH A O   1 
+HETATM 3937 O O   . HOH C 3 .   ? 12.003  32.739 0.191  1.00 47.05 ? ? ? ? ? ? 822 HOH A O   1 
+HETATM 3938 O O   . HOH C 3 .   ? 29.652  9.414  34.130 1.00 55.26 ? ? ? ? ? ? 823 HOH A O   1 
+HETATM 3939 O O   . HOH C 3 .   ? 1.953   37.545 27.203 1.00 50.72 ? ? ? ? ? ? 824 HOH A O   1 
+HETATM 3940 O O   . HOH C 3 .   ? -3.539  36.988 36.532 1.00 44.59 ? ? ? ? ? ? 825 HOH A O   1 
+HETATM 3941 O O   . HOH C 3 .   ? 37.282  12.429 45.414 1.00 39.36 ? ? ? ? ? ? 826 HOH A O   1 
+HETATM 3942 O O   . HOH C 3 .   ? -7.366  40.298 7.981  1.00 49.91 ? ? ? ? ? ? 827 HOH A O   1 
+HETATM 3943 O O   . HOH C 3 .   ? 10.889  19.164 43.282 1.00 35.29 ? ? ? ? ? ? 828 HOH A O   1 
+HETATM 3944 O O   . HOH C 3 .   ? 8.996   32.523 -0.083 1.00 49.87 ? ? ? ? ? ? 829 HOH A O   1 
+HETATM 3945 O O   . HOH C 3 .   ? 28.258  42.343 58.771 1.00 45.18 ? ? ? ? ? ? 830 HOH A O   1 
+HETATM 3946 O O   . HOH C 3 .   ? 30.350  33.296 20.403 1.00 63.69 ? ? ? ? ? ? 831 HOH A O   1 
+HETATM 3947 O O   . HOH C 3 .   ? 3.755   14.001 36.126 1.00 63.63 ? ? ? ? ? ? 832 HOH A O   1 
+HETATM 3948 O O   . HOH C 3 .   ? 4.928   15.828 -5.356 1.00 46.39 ? ? ? ? ? ? 833 HOH A O   1 
+HETATM 3949 O O   . HOH C 3 .   ? 7.494   -4.251 24.019 1.00 50.04 ? ? ? ? ? ? 834 HOH A O   1 
+HETATM 3950 O O   . HOH C 3 .   ? 19.318  21.643 20.211 1.00 42.29 ? ? ? ? ? ? 835 HOH A O   1 
+HETATM 3951 O O   . HOH C 3 .   ? 8.136   20.658 35.398 1.00 50.22 ? ? ? ? ? ? 836 HOH A O   1 
+HETATM 3952 O O   . HOH C 3 .   ? -5.620  49.525 47.259 1.00 64.36 ? ? ? ? ? ? 837 HOH A O   1 
+HETATM 3953 O O   . HOH C 3 .   ? 12.458  61.822 25.714 1.00 51.75 ? ? ? ? ? ? 838 HOH A O   1 
+HETATM 3954 O O   . HOH C 3 .   ? -1.517  39.009 26.597 1.00 43.83 ? ? ? ? ? ? 839 HOH A O   1 
+HETATM 3955 O O   . HOH C 3 .   ? -2.836  9.430  6.110  1.00 34.54 ? ? ? ? ? ? 840 HOH A O   1 
+HETATM 3956 O O   . HOH C 3 .   ? 0.539   20.288 -4.532 1.00 39.94 ? ? ? ? ? ? 841 HOH A O   1 
+HETATM 3957 O O   . HOH C 3 .   ? 30.924  18.835 36.853 1.00 47.22 ? ? ? ? ? ? 842 HOH A O   1 
+HETATM 3958 O O   . HOH C 3 .   ? 30.580  48.798 37.028 1.00 52.91 ? ? ? ? ? ? 843 HOH A O   1 
+HETATM 3959 O O   . HOH C 3 .   ? -5.173  37.188 33.420 1.00 64.07 ? ? ? ? ? ? 844 HOH A O   1 
+# 
+loop_
+_pdbx_poly_seq_scheme.asym_id 
+_pdbx_poly_seq_scheme.entity_id 
+_pdbx_poly_seq_scheme.seq_id 
+_pdbx_poly_seq_scheme.mon_id 
+_pdbx_poly_seq_scheme.ndb_seq_num 
+_pdbx_poly_seq_scheme.pdb_seq_num 
+_pdbx_poly_seq_scheme.auth_seq_num 
+_pdbx_poly_seq_scheme.pdb_mon_id 
+_pdbx_poly_seq_scheme.auth_mon_id 
+_pdbx_poly_seq_scheme.pdb_strand_id 
+_pdbx_poly_seq_scheme.pdb_ins_code 
+_pdbx_poly_seq_scheme.hetero 
+A 1 1   GLY 1   76  ?   ?   ?   A . n 
+A 1 2   ALA 2   77  ?   ?   ?   A . n 
+A 1 3   MET 3   78  ?   ?   ?   A . n 
+A 1 4   GLY 4   79  ?   ?   ?   A . n 
+A 1 5   SER 5   80  80  SER SER A . n 
+A 1 6   GLY 6   81  81  GLY GLY A . n 
+A 1 7   ILE 7   82  82  ILE ILE A . n 
+A 1 8   ARG 8   83  83  ARG ARG A . n 
+A 1 9   ILE 9   84  84  ILE ILE A . n 
+A 1 10  ILE 10  85  85  ILE ILE A . n 
+A 1 11  VAL 11  86  86  VAL VAL A . n 
+A 1 12  VAL 12  87  87  VAL VAL A . n 
+A 1 13  ALA 13  88  88  ALA ALA A . n 
+A 1 14  LEU 14  89  89  LEU LEU A . n 
+A 1 15  TYR 15  90  90  TYR TYR A . n 
+A 1 16  ASP 16  91  91  ASP ASP A . n 
+A 1 17  TYR 17  92  92  TYR TYR A . n 
+A 1 18  GLU 18  93  93  GLU GLU A . n 
+A 1 19  ALA 19  94  94  ALA ALA A . n 
+A 1 20  ILE 20  95  95  ILE ILE A . n 
+A 1 21  HIS 21  96  96  HIS HIS A . n 
+A 1 22  HIS 22  97  97  HIS HIS A . n 
+A 1 23  GLU 23  98  98  GLU GLU A . n 
+A 1 24  ASP 24  99  99  ASP ASP A . n 
+A 1 25  LEU 25  100 100 LEU LEU A . n 
+A 1 26  SER 26  101 101 SER SER A . n 
+A 1 27  PHE 27  102 102 PHE PHE A . n 
+A 1 28  GLN 28  103 103 GLN GLN A . n 
+A 1 29  LYS 29  104 104 LYS LYS A . n 
+A 1 30  GLY 30  105 105 GLY GLY A . n 
+A 1 31  ASP 31  106 106 ASP ASP A . n 
+A 1 32  GLN 32  107 107 GLN GLN A . n 
+A 1 33  MET 33  108 108 MET MET A . n 
+A 1 34  VAL 34  109 109 VAL VAL A . n 
+A 1 35  VAL 35  110 110 VAL VAL A . n 
+A 1 36  LEU 36  111 111 LEU LEU A . n 
+A 1 37  GLU 37  112 112 GLU GLU A . n 
+A 1 38  GLU 38  113 113 GLU GLU A . n 
+A 1 39  SER 39  114 114 SER SER A . n 
+A 1 40  GLY 40  116 116 GLY GLY A . n 
+A 1 41  GLU 41  117 117 GLU GLU A . n 
+A 1 42  TRP 42  118 118 TRP TRP A . n 
+A 1 43  TRP 43  119 119 TRP TRP A . n 
+A 1 44  LYS 44  120 120 LYS LYS A . n 
+A 1 45  ALA 45  121 121 ALA ALA A . n 
+A 1 46  ARG 46  122 122 ARG ARG A . n 
+A 1 47  SER 47  123 123 SER SER A . n 
+A 1 48  LEU 48  124 124 LEU LEU A . n 
+A 1 49  ALA 49  125 125 ALA ALA A . n 
+A 1 50  THR 50  126 126 THR THR A . n 
+A 1 51  ARG 51  127 127 ARG ARG A . n 
+A 1 52  LYS 52  128 128 LYS LYS A . n 
+A 1 53  GLU 53  129 129 GLU GLU A . n 
+A 1 54  GLY 54  130 130 GLY GLY A . n 
+A 1 55  TYR 55  131 131 TYR TYR A . n 
+A 1 56  ILE 56  132 132 ILE ILE A . n 
+A 1 57  PRO 57  133 133 PRO PRO A . n 
+A 1 58  SER 58  134 134 SER SER A . n 
+A 1 59  ASN 59  135 135 ASN ASN A . n 
+A 1 60  TYR 60  136 136 TYR TYR A . n 
+A 1 61  VAL 61  137 137 VAL VAL A . n 
+A 1 62  ALA 62  138 138 ALA ALA A . n 
+A 1 63  ARG 63  139 139 ARG ARG A . n 
+A 1 64  VAL 64  140 140 VAL VAL A . n 
+A 1 65  ASP 65  141 141 ASP ASP A . n 
+A 1 66  SER 66  142 142 SER SER A . n 
+A 1 67  LEU 67  143 143 LEU LEU A . n 
+A 1 68  GLU 68  144 144 GLU GLU A . n 
+A 1 69  THR 69  145 145 THR THR A . n 
+A 1 70  GLU 70  146 146 GLU GLU A . n 
+A 1 71  GLU 71  147 147 GLU GLU A . n 
+A 1 72  TRP 72  148 148 TRP TRP A . n 
+A 1 73  PHE 73  149 149 PHE PHE A . n 
+A 1 74  PHE 74  150 150 PHE PHE A . n 
+A 1 75  LYS 75  151 151 LYS LYS A . n 
+A 1 76  GLY 76  152 152 GLY GLY A . n 
+A 1 77  ILE 77  153 153 ILE ILE A . n 
+A 1 78  SER 78  154 154 SER SER A . n 
+A 1 79  ARG 79  155 155 ARG ARG A . n 
+A 1 80  LYS 80  156 156 LYS LYS A . n 
+A 1 81  ASP 81  157 157 ASP ASP A . n 
+A 1 82  ALA 82  158 158 ALA ALA A . n 
+A 1 83  GLU 83  159 159 GLU GLU A . n 
+A 1 84  ARG 84  160 160 ARG ARG A . n 
+A 1 85  GLN 85  161 161 GLN GLN A . n 
+A 1 86  LEU 86  162 162 LEU LEU A . n 
+A 1 87  LEU 87  163 163 LEU LEU A . n 
+A 1 88  ALA 88  164 164 ALA ALA A . n 
+A 1 89  PRO 89  165 165 PRO PRO A . n 
+A 1 90  GLY 90  166 166 GLY GLY A . n 
+A 1 91  ASN 91  167 167 ASN ASN A . n 
+A 1 92  MET 92  168 168 MET MET A . n 
+A 1 93  LEU 93  169 169 LEU LEU A . n 
+A 1 94  GLY 94  170 170 GLY GLY A . n 
+A 1 95  SER 95  171 171 SER SER A . n 
+A 1 96  PHE 96  172 172 PHE PHE A . n 
+A 1 97  MET 97  173 173 MET MET A . n 
+A 1 98  ILE 98  174 174 ILE ILE A . n 
+A 1 99  ARG 99  175 175 ARG ARG A . n 
+A 1 100 ASP 100 176 176 ASP ASP A . n 
+A 1 101 SER 101 177 177 SER SER A . n 
+A 1 102 GLU 102 178 178 GLU GLU A . n 
+A 1 103 THR 103 179 179 THR THR A . n 
+A 1 104 THR 104 180 180 THR THR A . n 
+A 1 105 LYS 105 181 181 LYS LYS A . n 
+A 1 106 GLY 106 182 182 GLY GLY A . n 
+A 1 107 SER 107 183 183 SER SER A . n 
+A 1 108 TYR 108 184 184 TYR TYR A . n 
+A 1 109 SER 109 185 185 SER SER A . n 
+A 1 110 LEU 110 186 186 LEU LEU A . n 
+A 1 111 SER 111 187 187 SER SER A . n 
+A 1 112 VAL 112 188 188 VAL VAL A . n 
+A 1 113 ARG 113 189 189 ARG ARG A . n 
+A 1 114 ASP 114 190 190 ASP ASP A . n 
+A 1 115 TYR 115 191 191 TYR TYR A . n 
+A 1 116 ASP 116 192 192 ASP ASP A . n 
+A 1 117 PRO 117 193 193 PRO PRO A . n 
+A 1 118 ARG 118 194 194 ARG ARG A . n 
+A 1 119 GLN 119 195 195 GLN GLN A . n 
+A 1 120 GLY 120 196 196 GLY GLY A . n 
+A 1 121 ASP 121 197 197 ASP ASP A . n 
+A 1 122 THR 122 198 198 THR THR A . n 
+A 1 123 VAL 123 199 199 VAL VAL A . n 
+A 1 124 LYS 124 200 200 LYS LYS A . n 
+A 1 125 HIS 125 201 201 HIS HIS A . n 
+A 1 126 TYR 126 202 202 TYR TYR A . n 
+A 1 127 LYS 127 203 203 LYS LYS A . n 
+A 1 128 ILE 128 204 204 ILE ILE A . n 
+A 1 129 ARG 129 205 205 ARG ARG A . n 
+A 1 130 THR 130 206 206 THR THR A . n 
+A 1 131 LEU 131 207 207 LEU LEU A . n 
+A 1 132 ASP 132 208 208 ASP ASP A . n 
+A 1 133 ASN 133 209 209 ASN ASN A . n 
+A 1 134 GLY 134 210 210 GLY GLY A . n 
+A 1 135 GLY 135 211 211 GLY GLY A . n 
+A 1 136 PHE 136 212 212 PHE PHE A . n 
+A 1 137 TYR 137 213 213 TYR TYR A . n 
+A 1 138 ILE 138 214 214 ILE ILE A . n 
+A 1 139 SER 139 215 215 SER SER A . n 
+A 1 140 PRO 140 216 216 PRO PRO A . n 
+A 1 141 ARG 141 217 217 ARG ARG A . n 
+A 1 142 SER 142 218 218 SER SER A . n 
+A 1 143 THR 143 219 219 THR THR A . n 
+A 1 144 PHE 144 220 220 PHE PHE A . n 
+A 1 145 SER 145 221 221 SER SER A . n 
+A 1 146 THR 146 222 222 THR THR A . n 
+A 1 147 LEU 147 223 223 LEU LEU A . n 
+A 1 148 GLN 148 224 224 GLN GLN A . n 
+A 1 149 GLU 149 225 225 GLU GLU A . n 
+A 1 150 LEU 150 226 226 LEU LEU A . n 
+A 1 151 VAL 151 227 227 VAL VAL A . n 
+A 1 152 ASP 152 228 228 ASP ASP A . n 
+A 1 153 HIS 153 229 229 HIS HIS A . n 
+A 1 154 TYR 154 230 230 TYR TYR A . n 
+A 1 155 LYS 155 231 231 LYS LYS A . n 
+A 1 156 LYS 156 232 232 LYS LYS A . n 
+A 1 157 GLY 157 233 233 GLY GLY A . n 
+A 1 158 ASN 158 234 234 ASN ASN A . n 
+A 1 159 ASP 159 235 235 ASP ASP A . n 
+A 1 160 GLY 160 236 236 GLY GLY A . n 
+A 1 161 LEU 161 237 237 LEU LEU A . n 
+A 1 162 CYS 162 238 238 CYS CYS A . n 
+A 1 163 GLN 163 239 239 GLN GLN A . n 
+A 1 164 LYS 164 240 240 LYS LYS A . n 
+A 1 165 LEU 165 241 241 LEU LEU A . n 
+A 1 166 SER 166 242 242 SER SER A . n 
+A 1 167 VAL 167 243 243 VAL VAL A . n 
+A 1 168 PRO 168 244 244 PRO PRO A . n 
+A 1 169 CYS 169 245 245 CYS CYS A . n 
+A 1 170 MET 170 246 246 MET MET A . n 
+A 1 171 SER 171 247 247 SER SER A . n 
+A 1 172 SER 172 248 248 SER SER A . n 
+A 1 173 LYS 173 249 249 LYS LYS A . n 
+A 1 174 PRO 174 250 250 PRO PRO A . n 
+A 1 175 GLN 175 251 251 GLN GLN A . n 
+A 1 176 LYS 176 252 252 LYS LYS A . n 
+A 1 177 PRO 177 253 253 PRO PRO A . n 
+A 1 178 TRP 178 254 254 TRP TRP A . n 
+A 1 179 GLU 179 255 255 GLU GLU A . n 
+A 1 180 LYS 180 257 257 LYS LYS A . n 
+A 1 181 ASP 181 258 258 ASP ASP A . n 
+A 1 182 ALA 182 259 259 ALA ALA A . n 
+A 1 183 TRP 183 260 260 TRP TRP A . n 
+A 1 184 GLU 184 261 261 GLU GLU A . n 
+A 1 185 ILE 185 262 262 ILE ILE A . n 
+A 1 186 PRO 186 263 263 PRO PRO A . n 
+A 1 187 ARG 187 264 264 ARG ARG A . n 
+A 1 188 GLU 188 265 265 GLU GLU A . n 
+A 1 189 SER 189 266 266 SER SER A . n 
+A 1 190 LEU 190 267 267 LEU LEU A . n 
+A 1 191 LYS 191 268 268 LYS LYS A . n 
+A 1 192 LEU 192 269 269 LEU LEU A . n 
+A 1 193 GLU 193 270 270 GLU GLU A . n 
+A 1 194 LYS 194 271 271 LYS LYS A . n 
+A 1 195 LYS 195 272 272 LYS LYS A . n 
+A 1 196 LEU 196 273 273 LEU LEU A . n 
+A 1 197 GLY 197 274 274 GLY GLY A . n 
+A 1 198 ALA 198 275 275 ALA ALA A . n 
+A 1 199 GLY 199 276 276 GLY GLY A . n 
+A 1 200 GLN 200 277 277 GLN GLN A . n 
+A 1 201 PHE 201 278 278 PHE PHE A . n 
+A 1 202 GLY 202 279 279 GLY GLY A . n 
+A 1 203 GLU 203 280 280 GLU GLU A . n 
+A 1 204 VAL 204 281 281 VAL VAL A . n 
+A 1 205 TRP 205 282 282 TRP TRP A . n 
+A 1 206 MET 206 283 283 MET MET A . n 
+A 1 207 ALA 207 284 284 ALA ALA A . n 
+A 1 208 THR 208 285 285 THR THR A . n 
+A 1 209 TYR 209 286 286 TYR TYR A . n 
+A 1 210 ASN 210 287 287 ASN ASN A . n 
+A 1 211 LYS 211 288 288 LYS LYS A . n 
+A 1 212 HIS 212 289 289 HIS HIS A . n 
+A 1 213 THR 213 290 290 THR THR A . n 
+A 1 214 LYS 214 291 291 LYS LYS A . n 
+A 1 215 VAL 215 292 292 VAL VAL A . n 
+A 1 216 ALA 216 293 293 ALA ALA A . n 
+A 1 217 VAL 217 294 294 VAL VAL A . n 
+A 1 218 LYS 218 295 295 LYS LYS A . n 
+A 1 219 THR 219 296 296 THR THR A . n 
+A 1 220 MET 220 297 297 MET MET A . n 
+A 1 221 LYS 221 298 298 LYS LYS A . n 
+A 1 222 PRO 222 299 299 PRO PRO A . n 
+A 1 223 GLY 223 300 300 GLY GLY A . n 
+A 1 224 SER 224 301 301 SER SER A . n 
+A 1 225 MET 225 302 302 MET MET A . n 
+A 1 226 SER 226 303 303 SER SER A . n 
+A 1 227 VAL 227 304 304 VAL VAL A . n 
+A 1 228 GLU 228 305 305 GLU GLU A . n 
+A 1 229 ALA 229 306 306 ALA ALA A . n 
+A 1 230 PHE 230 307 307 PHE PHE A . n 
+A 1 231 LEU 231 308 308 LEU LEU A . n 
+A 1 232 ALA 232 309 309 ALA ALA A . n 
+A 1 233 GLU 233 310 310 GLU GLU A . n 
+A 1 234 ALA 234 311 311 ALA ALA A . n 
+A 1 235 ASN 235 312 312 ASN ASN A . n 
+A 1 236 VAL 236 313 313 VAL VAL A . n 
+A 1 237 MET 237 314 314 MET MET A . n 
+A 1 238 LYS 238 315 315 LYS LYS A . n 
+A 1 239 THR 239 316 316 THR THR A . n 
+A 1 240 LEU 240 317 317 LEU LEU A . n 
+A 1 241 GLN 241 318 318 GLN GLN A . n 
+A 1 242 HIS 242 319 319 HIS HIS A . n 
+A 1 243 ASP 243 320 320 ASP ASP A . n 
+A 1 244 LYS 244 321 321 LYS LYS A . n 
+A 1 245 LEU 245 322 322 LEU LEU A . n 
+A 1 246 VAL 246 323 323 VAL VAL A . n 
+A 1 247 LYS 247 324 324 LYS LYS A . n 
+A 1 248 LEU 248 325 325 LEU LEU A . n 
+A 1 249 HIS 249 326 326 HIS HIS A . n 
+A 1 250 ALA 250 327 327 ALA ALA A . n 
+A 1 251 VAL 251 328 328 VAL VAL A . n 
+A 1 252 VAL 252 329 329 VAL VAL A . n 
+A 1 253 THR 253 330 330 THR THR A . n 
+A 1 254 LYS 254 331 331 LYS LYS A . n 
+A 1 255 GLU 255 332 332 GLU GLU A . n 
+A 1 256 PRO 256 333 333 PRO PRO A . n 
+A 1 257 ILE 257 334 334 ILE ILE A . n 
+A 1 258 TYR 258 335 335 TYR TYR A . n 
+A 1 259 ILE 259 336 336 ILE ILE A . n 
+A 1 260 ILE 260 337 337 ILE ILE A . n 
+A 1 261 THR 261 338 338 THR THR A . n 
+A 1 262 GLU 262 339 339 GLU GLU A . n 
+A 1 263 PHE 263 340 340 PHE PHE A . n 
+A 1 264 MET 264 341 341 MET MET A . n 
+A 1 265 ALA 265 342 342 ALA ALA A . n 
+A 1 266 LYS 266 343 343 LYS LYS A . n 
+A 1 267 GLY 267 344 344 GLY GLY A . n 
+A 1 268 SER 268 345 345 SER SER A . n 
+A 1 269 LEU 269 346 346 LEU LEU A . n 
+A 1 270 LEU 270 347 347 LEU LEU A . n 
+A 1 271 ASP 271 348 348 ASP ASP A . n 
+A 1 272 PHE 272 349 349 PHE PHE A . n 
+A 1 273 LEU 273 350 350 LEU LEU A . n 
+A 1 274 LYS 274 351 351 LYS LYS A . n 
+A 1 275 SER 275 352 352 SER SER A . n 
+A 1 276 ASP 276 353 353 ASP ASP A . n 
+A 1 277 GLU 277 354 354 GLU GLU A . n 
+A 1 278 GLY 278 355 355 GLY GLY A . n 
+A 1 279 SER 279 356 356 SER SER A . n 
+A 1 280 LYS 280 357 357 LYS LYS A . n 
+A 1 281 GLN 281 358 358 GLN GLN A . n 
+A 1 282 PRO 282 359 359 PRO PRO A . n 
+A 1 283 LEU 283 360 360 LEU LEU A . n 
+A 1 284 PRO 284 361 361 PRO PRO A . n 
+A 1 285 LYS 285 362 362 LYS LYS A . n 
+A 1 286 LEU 286 363 363 LEU LEU A . n 
+A 1 287 ILE 287 364 364 ILE ILE A . n 
+A 1 288 ASP 288 365 365 ASP ASP A . n 
+A 1 289 PHE 289 366 366 PHE PHE A . n 
+A 1 290 SER 290 367 367 SER SER A . n 
+A 1 291 ALA 291 368 368 ALA ALA A . n 
+A 1 292 GLN 292 369 369 GLN GLN A . n 
+A 1 293 ILE 293 370 370 ILE ILE A . n 
+A 1 294 ALA 294 371 371 ALA ALA A . n 
+A 1 295 GLU 295 372 372 GLU GLU A . n 
+A 1 296 GLY 296 373 373 GLY GLY A . n 
+A 1 297 MET 297 374 374 MET MET A . n 
+A 1 298 ALA 298 375 375 ALA ALA A . n 
+A 1 299 PHE 299 376 376 PHE PHE A . n 
+A 1 300 ILE 300 377 377 ILE ILE A . n 
+A 1 301 GLU 301 378 378 GLU GLU A . n 
+A 1 302 GLN 302 379 379 GLN GLN A . n 
+A 1 303 ARG 303 380 380 ARG ARG A . n 
+A 1 304 ASN 304 381 381 ASN ASN A . n 
+A 1 305 TYR 305 382 382 TYR TYR A . n 
+A 1 306 ILE 306 383 383 ILE ILE A . n 
+A 1 307 HIS 307 384 384 HIS HIS A . n 
+A 1 308 ARG 308 385 385 ARG ARG A . n 
+A 1 309 ASP 309 386 386 ASP ASP A . n 
+A 1 310 LEU 310 387 387 LEU LEU A . n 
+A 1 311 ARG 311 388 388 ARG ARG A . n 
+A 1 312 ALA 312 389 389 ALA ALA A . n 
+A 1 313 ALA 313 390 390 ALA ALA A . n 
+A 1 314 ASN 314 391 391 ASN ASN A . n 
+A 1 315 ILE 315 392 392 ILE ILE A . n 
+A 1 316 LEU 316 393 393 LEU LEU A . n 
+A 1 317 VAL 317 394 394 VAL VAL A . n 
+A 1 318 SER 318 395 395 SER SER A . n 
+A 1 319 ALA 319 396 396 ALA ALA A . n 
+A 1 320 SER 320 397 397 SER SER A . n 
+A 1 321 LEU 321 398 398 LEU LEU A . n 
+A 1 322 VAL 322 399 399 VAL VAL A . n 
+A 1 323 CYS 323 400 400 CYS CYS A . n 
+A 1 324 LYS 324 401 401 LYS LYS A . n 
+A 1 325 ILE 325 402 402 ILE ILE A . n 
+A 1 326 ALA 326 403 403 ALA ALA A . n 
+A 1 327 ASP 327 404 404 ASP ASP A . n 
+A 1 328 PHE 328 405 405 PHE PHE A . n 
+A 1 329 GLY 329 406 406 GLY GLY A . n 
+A 1 330 LEU 330 407 407 LEU LEU A . n 
+A 1 331 ALA 331 408 408 ALA ALA A . n 
+A 1 332 ARG 332 409 409 ARG ARG A . n 
+A 1 333 VAL 333 410 410 VAL VAL A . n 
+A 1 334 ILE 334 411 411 ILE ILE A . n 
+A 1 335 GLU 335 412 412 GLU GLU A . n 
+A 1 336 ASP 336 413 413 ASP ASP A . n 
+A 1 337 ASN 337 414 414 ASN ASN A . n 
+A 1 338 GLU 338 415 415 GLU GLU A . n 
+A 1 339 TYR 339 416 416 TYR TYR A . n 
+A 1 340 THR 340 417 417 THR THR A . n 
+A 1 341 ALA 341 418 418 ALA ALA A . n 
+A 1 342 ARG 342 419 419 ARG ARG A . n 
+A 1 343 GLU 343 420 420 GLU GLU A . n 
+A 1 344 GLY 344 421 421 GLY GLY A . n 
+A 1 345 ALA 345 422 422 ALA ALA A . n 
+A 1 346 LYS 346 423 423 LYS LYS A . n 
+A 1 347 PHE 347 424 424 PHE PHE A . n 
+A 1 348 PRO 348 425 425 PRO PRO A . n 
+A 1 349 ILE 349 426 426 ILE ILE A . n 
+A 1 350 LYS 350 427 427 LYS LYS A . n 
+A 1 351 TRP 351 428 428 TRP TRP A . n 
+A 1 352 THR 352 429 429 THR THR A . n 
+A 1 353 ALA 353 430 430 ALA ALA A . n 
+A 1 354 PRO 354 431 431 PRO PRO A . n 
+A 1 355 GLU 355 432 432 GLU GLU A . n 
+A 1 356 ALA 356 433 433 ALA ALA A . n 
+A 1 357 ILE 357 434 434 ILE ILE A . n 
+A 1 358 ASN 358 435 435 ASN ASN A . n 
+A 1 359 PHE 359 436 436 PHE PHE A . n 
+A 1 360 GLY 360 437 437 GLY GLY A . n 
+A 1 361 SER 361 438 438 SER SER A . n 
+A 1 362 PHE 362 439 439 PHE PHE A . n 
+A 1 363 THR 363 440 440 THR THR A . n 
+A 1 364 ILE 364 441 441 ILE ILE A . n 
+A 1 365 LYS 365 442 442 LYS LYS A . n 
+A 1 366 SER 366 443 443 SER SER A . n 
+A 1 367 ASP 367 444 444 ASP ASP A . n 
+A 1 368 VAL 368 445 445 VAL VAL A . n 
+A 1 369 TRP 369 446 446 TRP TRP A . n 
+A 1 370 SER 370 447 447 SER SER A . n 
+A 1 371 PHE 371 448 448 PHE PHE A . n 
+A 1 372 GLY 372 449 449 GLY GLY A . n 
+A 1 373 ILE 373 450 450 ILE ILE A . n 
+A 1 374 LEU 374 451 451 LEU LEU A . n 
+A 1 375 LEU 375 452 452 LEU LEU A . n 
+A 1 376 MET 376 453 453 MET MET A . n 
+A 1 377 GLU 377 454 454 GLU GLU A . n 
+A 1 378 ILE 378 455 455 ILE ILE A . n 
+A 1 379 VAL 379 456 456 VAL VAL A . n 
+A 1 380 THR 380 457 457 THR THR A . n 
+A 1 381 TYR 381 458 458 TYR TYR A . n 
+A 1 382 GLY 382 459 459 GLY GLY A . n 
+A 1 383 ARG 383 460 460 ARG ARG A . n 
+A 1 384 ILE 384 461 461 ILE ILE A . n 
+A 1 385 PRO 385 462 462 PRO PRO A . n 
+A 1 386 TYR 386 463 463 TYR TYR A . n 
+A 1 387 PRO 387 464 464 PRO PRO A . n 
+A 1 388 GLY 388 465 465 GLY GLY A . n 
+A 1 389 MET 389 466 466 MET MET A . n 
+A 1 390 SER 390 467 467 SER SER A . n 
+A 1 391 ASN 391 468 468 ASN ASN A . n 
+A 1 392 PRO 392 469 469 PRO PRO A . n 
+A 1 393 GLU 393 470 470 GLU GLU A . n 
+A 1 394 VAL 394 471 471 VAL VAL A . n 
+A 1 395 ILE 395 472 472 ILE ILE A . n 
+A 1 396 ARG 396 473 473 ARG ARG A . n 
+A 1 397 ALA 397 474 474 ALA ALA A . n 
+A 1 398 LEU 398 475 475 LEU LEU A . n 
+A 1 399 GLU 399 476 476 GLU GLU A . n 
+A 1 400 ARG 400 477 477 ARG ALA A . n 
+A 1 401 GLY 401 478 478 GLY GLY A . n 
+A 1 402 TYR 402 479 479 TYR TYR A . n 
+A 1 403 ARG 403 480 480 ARG ARG A . n 
+A 1 404 MET 404 481 481 MET MET A . n 
+A 1 405 PRO 405 482 482 PRO PRO A . n 
+A 1 406 ARG 406 483 483 ARG ARG A . n 
+A 1 407 PRO 407 484 484 PRO PRO A . n 
+A 1 408 GLU 408 485 485 GLU GLU A . n 
+A 1 409 ASN 409 486 486 ASN ASN A . n 
+A 1 410 CYS 410 487 487 CYS CYS A . n 
+A 1 411 PRO 411 488 488 PRO PRO A . n 
+A 1 412 GLU 412 489 489 GLU GLU A . n 
+A 1 413 GLU 413 490 490 GLU GLU A . n 
+A 1 414 LEU 414 491 491 LEU LEU A . n 
+A 1 415 TYR 415 492 492 TYR TYR A . n 
+A 1 416 ASN 416 493 493 ASN ASN A . n 
+A 1 417 ILE 417 494 494 ILE ILE A . n 
+A 1 418 MET 418 495 495 MET MET A . n 
+A 1 419 MET 419 496 496 MET MET A . n 
+A 1 420 ARG 420 497 497 ARG ARG A . n 
+A 1 421 CYS 421 498 498 CYS CYS A . n 
+A 1 422 TRP 422 499 499 TRP TRP A . n 
+A 1 423 LYS 423 500 500 LYS LYS A . n 
+A 1 424 ASN 424 501 501 ASN ASN A . n 
+A 1 425 ARG 425 502 502 ARG ARG A . n 
+A 1 426 PRO 426 503 503 PRO PRO A . n 
+A 1 427 GLU 427 504 504 GLU GLU A . n 
+A 1 428 GLU 428 505 505 GLU GLU A . n 
+A 1 429 ARG 429 506 506 ARG ARG A . n 
+A 1 430 PRO 430 507 507 PRO PRO A . n 
+A 1 431 THR 431 508 508 THR THR A . n 
+A 1 432 PHE 432 509 509 PHE PHE A . n 
+A 1 433 GLU 433 510 510 GLU GLU A . n 
+A 1 434 TYR 434 511 511 TYR TYR A . n 
+A 1 435 ILE 435 512 512 ILE ILE A . n 
+A 1 436 GLN 436 513 513 GLN GLN A . n 
+A 1 437 SER 437 514 514 SER SER A . n 
+A 1 438 VAL 438 515 515 VAL VAL A . n 
+A 1 439 LEU 439 516 516 LEU LEU A . n 
+A 1 440 ASP 440 517 517 ASP ASP A . n 
+A 1 441 ASP 441 518 518 ASP ASP A . n 
+A 1 442 PHE 442 519 519 PHE PHE A . n 
+A 1 443 TYR 443 520 520 TYR TYR A . n 
+A 1 444 THR 444 521 521 THR THR A . n 
+A 1 445 ALA 445 522 522 ALA ALA A . n 
+A 1 446 THR 446 523 523 THR THR A . n 
+A 1 447 GLU 447 524 524 GLU GLU A . n 
+A 1 448 SER 448 525 525 SER SER A . n 
+A 1 449 GLN 449 526 526 GLN GLN A . n 
+A 1 450 PTR 450 527 527 PTR PTR A . n 
+A 1 451 GLU 451 528 528 GLU GLU A . n 
+A 1 452 GLU 452 529 529 GLU GLU A . n 
+A 1 453 ILE 453 530 530 ILE ILE A . n 
+A 1 454 PRO 454 531 531 PRO PRO A . n 
+# 
+loop_
+_software.name 
+_software.classification 
+_software.version 
+_software.citation_id 
+_software.pdbx_ordinal 
+AMORE 'model building' . ? 1 
+CNS   refinement       . ? 2 
+# 
+loop_
+_pdbx_version.entry_id 
+_pdbx_version.revision_date 
+_pdbx_version.major_version 
+_pdbx_version.minor_version 
+_pdbx_version.revision_type 
+_pdbx_version.details 
+1QCF 2008-04-27 3 2    'Version format compliance' 'compliance with PDB format V.3.15'          
+1QCF 2011-07-13 4 0000 'Version format compliance' 'compliance with PDB Exchange Dictionary V4' 
+# 
+loop_
+_pdbx_unobs_or_zero_occ_residues.id 
+_pdbx_unobs_or_zero_occ_residues.polymer_flag 
+_pdbx_unobs_or_zero_occ_residues.occupancy_flag 
+_pdbx_unobs_or_zero_occ_residues.PDB_model_num 
+_pdbx_unobs_or_zero_occ_residues.auth_asym_id 
+_pdbx_unobs_or_zero_occ_residues.auth_comp_id 
+_pdbx_unobs_or_zero_occ_residues.auth_seq_id 
+_pdbx_unobs_or_zero_occ_residues.PDB_ins_code 
+1 Y 1 1 A GLY 76 ? 
+2 Y 1 1 A ALA 77 ? 
+3 Y 1 1 A MET 78 ? 
+4 Y 1 1 A GLY 79 ? 
+# 
+loop_
+_pdbx_unobs_or_zero_occ_atoms.id 
+_pdbx_unobs_or_zero_occ_atoms.polymer_flag 
+_pdbx_unobs_or_zero_occ_atoms.occupancy_flag 
+_pdbx_unobs_or_zero_occ_atoms.PDB_model_num 
+_pdbx_unobs_or_zero_occ_atoms.auth_asym_id 
+_pdbx_unobs_or_zero_occ_atoms.auth_comp_id 
+_pdbx_unobs_or_zero_occ_atoms.auth_seq_id 
+_pdbx_unobs_or_zero_occ_atoms.PDB_ins_code 
+_pdbx_unobs_or_zero_occ_atoms.auth_atom_id 
+_pdbx_unobs_or_zero_occ_atoms.label_alt_id 
+1 Y 1 1 A ARG 477 ? CG  ? 
+2 Y 1 1 A ARG 477 ? CD  ? 
+3 Y 1 1 A ARG 477 ? NE  ? 
+4 Y 1 1 A ARG 477 ? CZ  ? 
+5 Y 1 1 A ARG 477 ? NH1 ? 
+6 Y 1 1 A ARG 477 ? NH2 ? 
+# 
+_pdbx_struct_assembly.id                   1 
+_pdbx_struct_assembly.details              author_defined_assembly 
+_pdbx_struct_assembly.method_details       ? 
+_pdbx_struct_assembly.oligomeric_details   monomeric 
+_pdbx_struct_assembly.oligomeric_count     1 
+# 
+_pdbx_struct_assembly_gen.assembly_id       1 
+_pdbx_struct_assembly_gen.oper_expression   1 
+_pdbx_struct_assembly_gen.asym_id_list      A,B,C 
+# 
+_pdbx_struct_oper_list.id                   1 
+_pdbx_struct_oper_list.type                 'identity operation' 
+_pdbx_struct_oper_list.name                 1_555 
+_pdbx_struct_oper_list.symmetry_operation   x,y,z 
+_pdbx_struct_oper_list.matrix[1][1]         1.0000000000 
+_pdbx_struct_oper_list.matrix[1][2]         0.0000000000 
+_pdbx_struct_oper_list.matrix[1][3]         0.0000000000 
+_pdbx_struct_oper_list.vector[1]            0.0000000000 
+_pdbx_struct_oper_list.matrix[2][1]         0.0000000000 
+_pdbx_struct_oper_list.matrix[2][2]         1.0000000000 
+_pdbx_struct_oper_list.matrix[2][3]         0.0000000000 
+_pdbx_struct_oper_list.vector[2]            0.0000000000 
+_pdbx_struct_oper_list.matrix[3][1]         0.0000000000 
+_pdbx_struct_oper_list.matrix[3][2]         0.0000000000 
+_pdbx_struct_oper_list.matrix[3][3]         1.0000000000 
+_pdbx_struct_oper_list.vector[3]            0.0000000000 
+# 
+loop_
+_pdbx_nonpoly_scheme.asym_id 
+_pdbx_nonpoly_scheme.entity_id 
+_pdbx_nonpoly_scheme.mon_id 
+_pdbx_nonpoly_scheme.ndb_seq_num 
+_pdbx_nonpoly_scheme.pdb_seq_num 
+_pdbx_nonpoly_scheme.auth_seq_num 
+_pdbx_nonpoly_scheme.pdb_mon_id 
+_pdbx_nonpoly_scheme.auth_mon_id 
+_pdbx_nonpoly_scheme.pdb_strand_id 
+_pdbx_nonpoly_scheme.pdb_ins_code 
+B 2 PP1 1   532 1   PP1 TS  A . 
+C 3 HOH 1   533 1   HOH HOH A . 
+C 3 HOH 2   534 2   HOH HOH A . 
+C 3 HOH 3   535 3   HOH HOH A . 
+C 3 HOH 4   536 4   HOH HOH A . 
+C 3 HOH 5   537 5   HOH HOH A . 
+C 3 HOH 6   538 6   HOH HOH A . 
+C 3 HOH 7   539 7   HOH HOH A . 
+C 3 HOH 8   540 8   HOH HOH A . 
+C 3 HOH 9   541 9   HOH HOH A . 
+C 3 HOH 10  542 10  HOH HOH A . 
+C 3 HOH 11  543 11  HOH HOH A . 
+C 3 HOH 12  544 12  HOH HOH A . 
+C 3 HOH 13  545 13  HOH HOH A . 
+C 3 HOH 14  546 14  HOH HOH A . 
+C 3 HOH 15  547 15  HOH HOH A . 
+C 3 HOH 16  548 16  HOH HOH A . 
+C 3 HOH 17  549 17  HOH HOH A . 
+C 3 HOH 18  550 18  HOH HOH A . 
+C 3 HOH 19  551 19  HOH HOH A . 
+C 3 HOH 20  552 20  HOH HOH A . 
+C 3 HOH 21  553 21  HOH HOH A . 
+C 3 HOH 22  554 22  HOH HOH A . 
+C 3 HOH 23  555 23  HOH HOH A . 
+C 3 HOH 24  556 24  HOH HOH A . 
+C 3 HOH 25  557 25  HOH HOH A . 
+C 3 HOH 26  558 26  HOH HOH A . 
+C 3 HOH 27  559 27  HOH HOH A . 
+C 3 HOH 28  560 28  HOH HOH A . 
+C 3 HOH 29  561 29  HOH HOH A . 
+C 3 HOH 30  562 30  HOH HOH A . 
+C 3 HOH 31  563 31  HOH HOH A . 
+C 3 HOH 32  564 32  HOH HOH A . 
+C 3 HOH 33  565 33  HOH HOH A . 
+C 3 HOH 34  566 34  HOH HOH A . 
+C 3 HOH 35  567 35  HOH HOH A . 
+C 3 HOH 36  568 36  HOH HOH A . 
+C 3 HOH 37  569 37  HOH HOH A . 
+C 3 HOH 38  570 38  HOH HOH A . 
+C 3 HOH 39  571 39  HOH HOH A . 
+C 3 HOH 40  572 40  HOH HOH A . 
+C 3 HOH 41  573 41  HOH HOH A . 
+C 3 HOH 42  574 42  HOH HOH A . 
+C 3 HOH 43  575 43  HOH HOH A . 
+C 3 HOH 44  576 44  HOH HOH A . 
+C 3 HOH 45  577 45  HOH HOH A . 
+C 3 HOH 46  578 46  HOH HOH A . 
+C 3 HOH 47  579 47  HOH HOH A . 
+C 3 HOH 48  580 48  HOH HOH A . 
+C 3 HOH 49  581 49  HOH HOH A . 
+C 3 HOH 50  582 50  HOH HOH A . 
+C 3 HOH 51  583 51  HOH HOH A . 
+C 3 HOH 52  584 52  HOH HOH A . 
+C 3 HOH 53  585 53  HOH HOH A . 
+C 3 HOH 54  586 54  HOH HOH A . 
+C 3 HOH 55  587 55  HOH HOH A . 
+C 3 HOH 56  588 56  HOH HOH A . 
+C 3 HOH 57  589 57  HOH HOH A . 
+C 3 HOH 58  590 58  HOH HOH A . 
+C 3 HOH 59  591 59  HOH HOH A . 
+C 3 HOH 60  592 60  HOH HOH A . 
+C 3 HOH 61  593 61  HOH HOH A . 
+C 3 HOH 62  594 62  HOH HOH A . 
+C 3 HOH 63  595 63  HOH HOH A . 
+C 3 HOH 64  596 64  HOH HOH A . 
+C 3 HOH 65  597 65  HOH HOH A . 
+C 3 HOH 66  598 66  HOH HOH A . 
+C 3 HOH 67  599 67  HOH HOH A . 
+C 3 HOH 68  600 68  HOH HOH A . 
+C 3 HOH 69  601 69  HOH HOH A . 
+C 3 HOH 70  602 70  HOH HOH A . 
+C 3 HOH 71  603 71  HOH HOH A . 
+C 3 HOH 72  604 72  HOH HOH A . 
+C 3 HOH 73  605 73  HOH HOH A . 
+C 3 HOH 74  606 74  HOH HOH A . 
+C 3 HOH 75  607 75  HOH HOH A . 
+C 3 HOH 76  608 76  HOH HOH A . 
+C 3 HOH 77  609 77  HOH HOH A . 
+C 3 HOH 78  610 78  HOH HOH A . 
+C 3 HOH 79  611 79  HOH HOH A . 
+C 3 HOH 80  612 80  HOH HOH A . 
+C 3 HOH 81  613 81  HOH HOH A . 
+C 3 HOH 82  614 82  HOH HOH A . 
+C 3 HOH 83  615 83  HOH HOH A . 
+C 3 HOH 84  616 84  HOH HOH A . 
+C 3 HOH 85  617 85  HOH HOH A . 
+C 3 HOH 86  618 86  HOH HOH A . 
+C 3 HOH 87  619 87  HOH HOH A . 
+C 3 HOH 88  620 88  HOH HOH A . 
+C 3 HOH 89  621 89  HOH HOH A . 
+C 3 HOH 90  622 90  HOH HOH A . 
+C 3 HOH 91  623 91  HOH HOH A . 
+C 3 HOH 92  624 92  HOH HOH A . 
+C 3 HOH 93  625 93  HOH HOH A . 
+C 3 HOH 94  626 94  HOH HOH A . 
+C 3 HOH 95  627 95  HOH HOH A . 
+C 3 HOH 96  628 96  HOH HOH A . 
+C 3 HOH 97  629 97  HOH HOH A . 
+C 3 HOH 98  630 98  HOH HOH A . 
+C 3 HOH 99  631 99  HOH HOH A . 
+C 3 HOH 100 632 100 HOH HOH A . 
+C 3 HOH 101 633 101 HOH HOH A . 
+C 3 HOH 102 634 102 HOH HOH A . 
+C 3 HOH 103 635 103 HOH HOH A . 
+C 3 HOH 104 636 104 HOH HOH A . 
+C 3 HOH 105 637 105 HOH HOH A . 
+C 3 HOH 106 638 106 HOH HOH A . 
+C 3 HOH 107 639 107 HOH HOH A . 
+C 3 HOH 108 640 108 HOH HOH A . 
+C 3 HOH 109 641 109 HOH HOH A . 
+C 3 HOH 110 642 110 HOH HOH A . 
+C 3 HOH 111 643 111 HOH HOH A . 
+C 3 HOH 112 644 112 HOH HOH A . 
+C 3 HOH 113 645 113 HOH HOH A . 
+C 3 HOH 114 646 114 HOH HOH A . 
+C 3 HOH 115 647 115 HOH HOH A . 
+C 3 HOH 116 648 116 HOH HOH A . 
+C 3 HOH 117 649 117 HOH HOH A . 
+C 3 HOH 118 650 118 HOH HOH A . 
+C 3 HOH 119 651 119 HOH HOH A . 
+C 3 HOH 120 652 120 HOH HOH A . 
+C 3 HOH 121 653 121 HOH HOH A . 
+C 3 HOH 122 654 122 HOH HOH A . 
+C 3 HOH 123 655 123 HOH HOH A . 
+C 3 HOH 124 656 124 HOH HOH A . 
+C 3 HOH 125 657 125 HOH HOH A . 
+C 3 HOH 126 658 126 HOH HOH A . 
+C 3 HOH 127 659 127 HOH HOH A . 
+C 3 HOH 128 660 128 HOH HOH A . 
+C 3 HOH 129 661 129 HOH HOH A . 
+C 3 HOH 130 662 130 HOH HOH A . 
+C 3 HOH 131 663 131 HOH HOH A . 
+C 3 HOH 132 664 132 HOH HOH A . 
+C 3 HOH 133 665 133 HOH HOH A . 
+C 3 HOH 134 666 134 HOH HOH A . 
+C 3 HOH 135 667 135 HOH HOH A . 
+C 3 HOH 136 668 136 HOH HOH A . 
+C 3 HOH 137 669 137 HOH HOH A . 
+C 3 HOH 138 670 138 HOH HOH A . 
+C 3 HOH 139 671 139 HOH HOH A . 
+C 3 HOH 140 672 140 HOH HOH A . 
+C 3 HOH 141 673 141 HOH HOH A . 
+C 3 HOH 142 674 142 HOH HOH A . 
+C 3 HOH 143 675 143 HOH HOH A . 
+C 3 HOH 144 676 144 HOH HOH A . 
+C 3 HOH 145 677 145 HOH HOH A . 
+C 3 HOH 146 678 146 HOH HOH A . 
+C 3 HOH 147 679 147 HOH HOH A . 
+C 3 HOH 148 680 148 HOH HOH A . 
+C 3 HOH 149 681 149 HOH HOH A . 
+C 3 HOH 150 682 150 HOH HOH A . 
+C 3 HOH 151 683 151 HOH HOH A . 
+C 3 HOH 152 684 152 HOH HOH A . 
+C 3 HOH 153 685 153 HOH HOH A . 
+C 3 HOH 154 686 154 HOH HOH A . 
+C 3 HOH 155 687 155 HOH HOH A . 
+C 3 HOH 156 688 156 HOH HOH A . 
+C 3 HOH 157 689 157 HOH HOH A . 
+C 3 HOH 158 690 158 HOH HOH A . 
+C 3 HOH 159 691 159 HOH HOH A . 
+C 3 HOH 160 692 160 HOH HOH A . 
+C 3 HOH 161 693 161 HOH HOH A . 
+C 3 HOH 162 694 162 HOH HOH A . 
+C 3 HOH 163 695 163 HOH HOH A . 
+C 3 HOH 164 696 164 HOH HOH A . 
+C 3 HOH 165 697 165 HOH HOH A . 
+C 3 HOH 166 698 166 HOH HOH A . 
+C 3 HOH 167 699 167 HOH HOH A . 
+C 3 HOH 168 700 168 HOH HOH A . 
+C 3 HOH 169 701 169 HOH HOH A . 
+C 3 HOH 170 702 170 HOH HOH A . 
+C 3 HOH 171 703 171 HOH HOH A . 
+C 3 HOH 172 704 172 HOH HOH A . 
+C 3 HOH 173 705 173 HOH HOH A . 
+C 3 HOH 174 706 174 HOH HOH A . 
+C 3 HOH 175 707 175 HOH HOH A . 
+C 3 HOH 176 708 176 HOH HOH A . 
+C 3 HOH 177 709 177 HOH HOH A . 
+C 3 HOH 178 710 178 HOH HOH A . 
+C 3 HOH 179 711 179 HOH HOH A . 
+C 3 HOH 180 712 180 HOH HOH A . 
+C 3 HOH 181 713 181 HOH HOH A . 
+C 3 HOH 182 714 182 HOH HOH A . 
+C 3 HOH 183 715 183 HOH HOH A . 
+C 3 HOH 184 716 184 HOH HOH A . 
+C 3 HOH 185 717 185 HOH HOH A . 
+C 3 HOH 186 718 186 HOH HOH A . 
+C 3 HOH 187 719 187 HOH HOH A . 
+C 3 HOH 188 720 188 HOH HOH A . 
+C 3 HOH 189 721 189 HOH HOH A . 
+C 3 HOH 190 722 190 HOH HOH A . 
+C 3 HOH 191 723 191 HOH HOH A . 
+C 3 HOH 192 724 192 HOH HOH A . 
+C 3 HOH 193 725 193 HOH HOH A . 
+C 3 HOH 194 726 194 HOH HOH A . 
+C 3 HOH 195 727 195 HOH HOH A . 
+C 3 HOH 196 728 196 HOH HOH A . 
+C 3 HOH 197 729 197 HOH HOH A . 
+C 3 HOH 198 730 198 HOH HOH A . 
+C 3 HOH 199 731 199 HOH HOH A . 
+C 3 HOH 200 732 200 HOH HOH A . 
+C 3 HOH 201 733 201 HOH HOH A . 
+C 3 HOH 202 734 202 HOH HOH A . 
+C 3 HOH 203 735 203 HOH HOH A . 
+C 3 HOH 204 736 204 HOH HOH A . 
+C 3 HOH 205 737 205 HOH HOH A . 
+C 3 HOH 206 738 206 HOH HOH A . 
+C 3 HOH 207 739 207 HOH HOH A . 
+C 3 HOH 208 740 208 HOH HOH A . 
+C 3 HOH 209 741 209 HOH HOH A . 
+C 3 HOH 210 742 210 HOH HOH A . 
+C 3 HOH 211 743 211 HOH HOH A . 
+C 3 HOH 212 744 212 HOH HOH A . 
+C 3 HOH 213 745 213 HOH HOH A . 
+C 3 HOH 214 746 214 HOH HOH A . 
+C 3 HOH 215 747 215 HOH HOH A . 
+C 3 HOH 216 748 216 HOH HOH A . 
+C 3 HOH 217 749 217 HOH HOH A . 
+C 3 HOH 218 750 218 HOH HOH A . 
+C 3 HOH 219 751 219 HOH HOH A . 
+C 3 HOH 220 752 220 HOH HOH A . 
+C 3 HOH 221 753 221 HOH HOH A . 
+C 3 HOH 222 754 222 HOH HOH A . 
+C 3 HOH 223 755 223 HOH HOH A . 
+C 3 HOH 224 756 224 HOH HOH A . 
+C 3 HOH 225 757 225 HOH HOH A . 
+C 3 HOH 226 758 226 HOH HOH A . 
+C 3 HOH 227 759 227 HOH HOH A . 
+C 3 HOH 228 760 228 HOH HOH A . 
+C 3 HOH 229 761 229 HOH HOH A . 
+C 3 HOH 230 762 230 HOH HOH A . 
+C 3 HOH 231 763 231 HOH HOH A . 
+C 3 HOH 232 764 232 HOH HOH A . 
+C 3 HOH 233 765 233 HOH HOH A . 
+C 3 HOH 234 766 234 HOH HOH A . 
+C 3 HOH 235 767 235 HOH HOH A . 
+C 3 HOH 236 768 236 HOH HOH A . 
+C 3 HOH 237 769 237 HOH HOH A . 
+C 3 HOH 238 770 238 HOH HOH A . 
+C 3 HOH 239 771 239 HOH HOH A . 
+C 3 HOH 240 772 240 HOH HOH A . 
+C 3 HOH 241 773 241 HOH HOH A . 
+C 3 HOH 242 774 242 HOH HOH A . 
+C 3 HOH 243 775 243 HOH HOH A . 
+C 3 HOH 244 776 244 HOH HOH A . 
+C 3 HOH 245 777 245 HOH HOH A . 
+C 3 HOH 246 778 246 HOH HOH A . 
+C 3 HOH 247 779 247 HOH HOH A . 
+C 3 HOH 248 780 248 HOH HOH A . 
+C 3 HOH 249 781 249 HOH HOH A . 
+C 3 HOH 250 782 250 HOH HOH A . 
+C 3 HOH 251 783 251 HOH HOH A . 
+C 3 HOH 252 784 252 HOH HOH A . 
+C 3 HOH 253 785 253 HOH HOH A . 
+C 3 HOH 254 786 254 HOH HOH A . 
+C 3 HOH 255 787 255 HOH HOH A . 
+C 3 HOH 256 788 256 HOH HOH A . 
+C 3 HOH 257 789 257 HOH HOH A . 
+C 3 HOH 258 790 258 HOH HOH A . 
+C 3 HOH 259 791 259 HOH HOH A . 
+C 3 HOH 260 792 260 HOH HOH A . 
+C 3 HOH 261 793 261 HOH HOH A . 
+C 3 HOH 262 794 262 HOH HOH A . 
+C 3 HOH 263 795 263 HOH HOH A . 
+C 3 HOH 264 796 264 HOH HOH A . 
+C 3 HOH 265 797 265 HOH HOH A . 
+C 3 HOH 266 798 266 HOH HOH A . 
+C 3 HOH 267 799 267 HOH HOH A . 
+C 3 HOH 268 800 268 HOH HOH A . 
+C 3 HOH 269 801 269 HOH HOH A . 
+C 3 HOH 270 802 270 HOH HOH A . 
+C 3 HOH 271 803 271 HOH HOH A . 
+C 3 HOH 272 804 272 HOH HOH A . 
+C 3 HOH 273 805 273 HOH HOH A . 
+C 3 HOH 274 806 274 HOH HOH A . 
+C 3 HOH 275 807 275 HOH HOH A . 
+C 3 HOH 276 808 276 HOH HOH A . 
+C 3 HOH 277 809 277 HOH HOH A . 
+C 3 HOH 278 810 278 HOH HOH A . 
+C 3 HOH 279 811 279 HOH HOH A . 
+C 3 HOH 280 812 280 HOH HOH A . 
+C 3 HOH 281 813 281 HOH HOH A . 
+C 3 HOH 282 814 282 HOH HOH A . 
+C 3 HOH 283 815 283 HOH HOH A . 
+C 3 HOH 284 816 284 HOH HOH A . 
+C 3 HOH 285 817 285 HOH HOH A . 
+C 3 HOH 286 818 286 HOH HOH A . 
+C 3 HOH 287 819 287 HOH HOH A . 
+C 3 HOH 288 820 288 HOH HOH A . 
+C 3 HOH 289 821 289 HOH HOH A . 
+C 3 HOH 290 822 290 HOH HOH A . 
+C 3 HOH 291 823 291 HOH HOH A . 
+C 3 HOH 292 824 292 HOH HOH A . 
+C 3 HOH 293 825 293 HOH HOH A . 
+C 3 HOH 294 826 294 HOH HOH A . 
+C 3 HOH 295 827 295 HOH HOH A . 
+C 3 HOH 296 828 296 HOH HOH A . 
+C 3 HOH 297 829 297 HOH HOH A . 
+C 3 HOH 298 830 298 HOH HOH A . 
+C 3 HOH 299 831 299 HOH HOH A . 
+C 3 HOH 300 832 300 HOH HOH A . 
+C 3 HOH 301 833 301 HOH HOH A . 
+C 3 HOH 302 834 302 HOH HOH A . 
+C 3 HOH 303 835 303 HOH HOH A . 
+C 3 HOH 304 836 304 HOH HOH A . 
+C 3 HOH 305 837 305 HOH HOH A . 
+C 3 HOH 306 838 306 HOH HOH A . 
+C 3 HOH 307 839 307 HOH HOH A . 
+C 3 HOH 308 840 308 HOH HOH A . 
+C 3 HOH 309 841 309 HOH HOH A . 
+C 3 HOH 310 842 310 HOH HOH A . 
+C 3 HOH 311 843 311 HOH HOH A . 
+C 3 HOH 312 844 312 HOH HOH A . 
+# 
+_pdbx_struct_mod_residue.id               1 
+_pdbx_struct_mod_residue.label_asym_id    A 
+_pdbx_struct_mod_residue.label_seq_id     450 
+_pdbx_struct_mod_residue.label_comp_id    PTR 
+_pdbx_struct_mod_residue.auth_asym_id     A 
+_pdbx_struct_mod_residue.auth_seq_id      527 
+_pdbx_struct_mod_residue.auth_comp_id     PTR 
+_pdbx_struct_mod_residue.PDB_ins_code     ? 
+_pdbx_struct_mod_residue.parent_comp_id   TYR 
+_pdbx_struct_mod_residue.details          O-PHOSPHOTYROSINE 
+# 
+_pdbx_validate_close_contact.id               1 
+_pdbx_validate_close_contact.PDB_model_num    1 
+_pdbx_validate_close_contact.auth_atom_id_1   O 
+_pdbx_validate_close_contact.auth_asym_id_1   A 
+_pdbx_validate_close_contact.auth_comp_id_1   THR 
+_pdbx_validate_close_contact.auth_seq_id_1    521 
+_pdbx_validate_close_contact.PDB_ins_code_1   ? 
+_pdbx_validate_close_contact.label_alt_id_1   ? 
+_pdbx_validate_close_contact.auth_atom_id_2   O 
+_pdbx_validate_close_contact.auth_asym_id_2   A 
+_pdbx_validate_close_contact.auth_comp_id_2   THR 
+_pdbx_validate_close_contact.auth_seq_id_2    523 
+_pdbx_validate_close_contact.PDB_ins_code_2   ? 
+_pdbx_validate_close_contact.label_alt_id_2   ? 
+_pdbx_validate_close_contact.dist             2.15 
+# 
+loop_
+_pdbx_validate_rmsd_angle.id 
+_pdbx_validate_rmsd_angle.PDB_model_num 
+_pdbx_validate_rmsd_angle.auth_atom_id_1 
+_pdbx_validate_rmsd_angle.auth_asym_id_1 
+_pdbx_validate_rmsd_angle.auth_comp_id_1 
+_pdbx_validate_rmsd_angle.auth_seq_id_1 
+_pdbx_validate_rmsd_angle.PDB_ins_code_1 
+_pdbx_validate_rmsd_angle.label_alt_id_1 
+_pdbx_validate_rmsd_angle.auth_atom_id_2 
+_pdbx_validate_rmsd_angle.auth_asym_id_2 
+_pdbx_validate_rmsd_angle.auth_comp_id_2 
+_pdbx_validate_rmsd_angle.auth_seq_id_2 
+_pdbx_validate_rmsd_angle.PDB_ins_code_2 
+_pdbx_validate_rmsd_angle.label_alt_id_2 
+_pdbx_validate_rmsd_angle.auth_atom_id_3 
+_pdbx_validate_rmsd_angle.auth_asym_id_3 
+_pdbx_validate_rmsd_angle.auth_comp_id_3 
+_pdbx_validate_rmsd_angle.auth_seq_id_3 
+_pdbx_validate_rmsd_angle.PDB_ins_code_3 
+_pdbx_validate_rmsd_angle.label_alt_id_3 
+_pdbx_validate_rmsd_angle.angle_deviation 
+1 1 C A ILE 530 ? ? N A PRO 531 ? ? CA A PRO 531 ? ? 24.0  
+2 1 C A ILE 530 ? ? N A PRO 531 ? ? CD A PRO 531 ? ? -23.8 
+# 
+loop_
+_pdbx_validate_torsion.id 
+_pdbx_validate_torsion.PDB_model_num 
+_pdbx_validate_torsion.auth_comp_id 
+_pdbx_validate_torsion.auth_asym_id 
+_pdbx_validate_torsion.auth_seq_id 
+_pdbx_validate_torsion.PDB_ins_code 
+_pdbx_validate_torsion.phi 
+_pdbx_validate_torsion.psi 
+1  1 GLU A 113 ? -109.04 64.07   
+2  1 ALA A 125 ? -87.40  -79.28  
+3  1 ARG A 127 ? 55.46   14.67   
+4  1 ASP A 141 ? 53.98   11.04   
+5  1 ASN A 209 ? 75.81   32.97   
+6  1 PRO A 216 ? -59.13  -6.39   
+7  1 TYR A 230 ? -57.61  -8.49   
+8  1 ASP A 235 ? 36.77   53.62   
+9  1 SER A 242 ? -102.49 -86.94  
+10 1 ALA A 259 ? -110.81 54.42   
+11 1 LYS A 288 ? 54.99   12.84   
+12 1 ARG A 385 ? 83.68   -15.14  
+13 1 ASP A 386 ? -150.15 53.00   
+14 1 ASP A 413 ? -20.16  112.28  
+15 1 TYR A 463 ? 38.29   60.93   
+16 1 TRP A 499 ? -93.55  32.13   
+17 1 TYR A 520 ? -109.43 -166.30 
+18 1 ALA A 522 ? -0.05   -102.78 
+19 1 THR A 523 ? -62.46  -169.49 
+20 1 GLU A 524 ? 129.52  155.80  
+21 1 SER A 525 ? -151.80 46.68   
+22 1 GLN A 526 ? -10.02  82.92   
+23 1 PTR A 527 ? 179.04  81.97   
+# 
+loop_
+_pdbx_entity_nonpoly.entity_id 
+_pdbx_entity_nonpoly.name 
+_pdbx_entity_nonpoly.comp_id 
+2 '1-TER-BUTYL-3-P-TOLYL-1H-PYRAZOLO[3,4-D]PYRIMIDIN-4-YLAMINE' PP1 
+3 water                                                         HOH 
+# 
index 3ea68dc..d3b5f9b 100644 (file)
@@ -1,3 +1,7 @@
+# (exonerate delimits GFF with [START|END] OF GFF DUMP)
+# --- START OF GFF DUMP ---
+#
+#
 ##gff-version 2
 ##source-version exonerate:protein2genome:local 2.2.0
 ##date 2015-01-16
@@ -9,5 +13,8 @@
 contig_1146    exonerate:protein2genome:local  gene    8534    11269   3652    -       .       gene_id 0 ; sequence DDB_G0269124 ; gene_orientation .
 contig_1146    exonerate:protein2genome:local  cds     8534    11269   .       -       .       
 contig_1146    exonerate:protein2genome:local  exon    8534    11269   .       -       .       insertions 3 ; deletions 6
+#TODO need to understand why GFF features is from 11269 but Align is from 11270
 contig_1146    exonerate:protein2genome:local  similarity      8534    11269   3652    -       .       alignment_id 0 ; Query DDB_G0269124 ; Align 11270 143 120 ; Align 11150 187 282 ; Align 10865 281 888 ; Align 9977 578 1068 ; Align 8909 935 375
+# and a made-up alignment to a sequence in exonerateseqs.fa
+contig_1146    exonerate:protein2genome:local  similarity      8534    11269   3652    -       .       alignment_id 0 ; Query DDB_G0280897 ; Align 11270 143 120 
 # --- END OF GFF DUMP ---
diff --git a/examples/testdata/simpleGff3.gff b/examples/testdata/simpleGff3.gff
new file mode 100644 (file)
index 0000000..614b440
--- /dev/null
@@ -0,0 +1,26 @@
+##gff-version 2
+# exonerate output in gff2 format; not gff3 because
+#   - 'similarity' is not a Sequence Ontology term
+#   - attributes' name/values are separated by space ' ' not equals '='
+##source-version exonerate:protein2genome:local 2.2.0
+##date 2015-01-16
+##type DNA
+#
+# exonerate run with --showtargetgff generates 'features on the target' i.e. mappings to the query
+# tab-delimited
+# seqname source feature start end score strand frame attributes
+#
+seq1   exonerate:protein2genome:local  gene    8       11      3652    -       .       gene_id 0 ; sequence seq2 ; gene_orientation .
+seq1   exonerate:protein2genome:local  cds     9       11      .       -       .       
+seq1   exonerate:protein2genome:local  exon    9       11      .       -       .       insertions 3 ; deletions 6
+#seq1  exonerate:protein2genome:local  similarity      8       11      3652    -       .       alignment_id 0 ; Query seq2 ; Align 11 1 3
+seq1   exonerate:protein2genome:local  similarity      9       11      3652    -       .       alignment_id 0 ; Query seq2 ; Align 11 1 3
+#
+# appending FASTA sequences is strictly a GFF3 format feature
+# but Jalview is able to handle this mixture of GFF2 / GFF3 :-)
+#
+##FASTA
+>seq1
+ACTACGACACGACGACGACGACG
+>seq2
+CDEQEATGTQDAQEQAQC
diff --git a/examples/testdata/simplegff3.gff b/examples/testdata/simplegff3.gff
deleted file mode 100644 (file)
index 2ac5421..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-##gff-version 2
-##source-version exonerate:protein2genome:local 2.2.0
-##date 2015-01-16
-##type DNA
-#
-#
-# seqname source feature start end score strand frame attributes
-#
-seq1   exonerate:protein2genome:local  gene    8       11      3652    -       .       gene_id 0 ; sequence seq2 ; gene_orientation .
-seq1   exonerate:protein2genome:local  cds     9       11      .       -       .       
-seq1   exonerate:protein2genome:local  exon    9       11      .       -       .       insertions 3 ; deletions 6
-seq1   exonerate:protein2genome:local  similarity      8       11      3652    -       .       alignment_id 0 ; Query seq2 ; Align 11 1 3
-##FASTA
->seq1
-ACTACGACACGACGACGACGACG
->seq2
-CDEQEATGTQDAQEQAQC
-
-
diff --git a/examples/testdata/test.cif b/examples/testdata/test.cif
new file mode 100644 (file)
index 0000000..02b6b9b
--- /dev/null
@@ -0,0 +1,8046 @@
+data_1XYZ
+# 
+_entry.id   1XYZ 
+# 
+_audit_conform.dict_name       mmcif_pdbx.dic 
+_audit_conform.dict_version    4.007 
+_audit_conform.dict_location   http://mmcif.pdb.org/dictionaries/ascii/mmcif_pdbx.dic 
+# 
+_database_2.database_id     PDB 
+_database_2.database_code   1XYZ 
+# 
+loop_
+_database_PDB_rev.num 
+_database_PDB_rev.date 
+_database_PDB_rev.date_original 
+_database_PDB_rev.status 
+_database_PDB_rev.replaces 
+_database_PDB_rev.mod_type 
+1 1996-01-29 1995-06-07 ? 1XYZ 0 
+2 2009-02-24 ?          ? 1XYZ 1 
+# 
+_database_PDB_rev_record.rev_num   2 
+_database_PDB_rev_record.type      VERSN 
+_database_PDB_rev_record.details   ? 
+# 
+_pdbx_database_status.status_code    REL 
+_pdbx_database_status.entry_id       1XYZ 
+_pdbx_database_status.deposit_site   ? 
+_pdbx_database_status.process_site   ? 
+_pdbx_database_status.SG_entry       . 
+# 
+loop_
+_audit_author.name 
+_audit_author.pdbx_ordinal 
+'Alzari, P.M.'  1 
+'Spinelli, S.'  2 
+'Dominguez, R.' 3 
+# 
+loop_
+_citation.id 
+_citation.title 
+_citation.journal_abbrev 
+_citation.journal_volume 
+_citation.page_first 
+_citation.page_last 
+_citation.year 
+_citation.journal_id_ASTM 
+_citation.country 
+_citation.journal_id_ISSN 
+_citation.journal_id_CSD 
+_citation.book_publisher 
+_citation.pdbx_database_id_PubMed 
+_citation.pdbx_database_id_DOI 
+primary 'A common protein fold and similar active site in two distinct families of beta-glycanases.'                               
+Nat.Struct.Biol. 2   569  576 1995 NSBIEW US 1072-8368 2024 ? 7664125 10.1038/nsb0795-569 
+1       'Crystallization and Preliminary Diffraction Analysis of the Catalytic Domain of Xylanase Z from Clostridium Thermocellum' 
+J.Mol.Biol.      235 1348 ?   1994 JMOBAK UK 0022-2836 0070 ? ?       ?                   
+# 
+loop_
+_citation_author.citation_id 
+_citation_author.name 
+_citation_author.ordinal 
+primary 'Dominguez, R.' 1  
+primary 'Souchon, H.'   2  
+primary 'Spinelli, S.'  3  
+primary 'Dauter, Z.'    4  
+primary 'Wilson, K.S.'  5  
+primary 'Chauvaux, S.'  6  
+primary 'Beguin, P.'    7  
+primary 'Alzari, P.M.'  8  
+1       'Souchon, H.'   9  
+1       'Spinelli, S.'  10 
+1       'Beguin, P.'    11 
+1       'Alzari, P.M.'  12 
+# 
+_cell.entry_id           1XYZ 
+_cell.length_a           47.100 
+_cell.length_b           51.100 
+_cell.length_c           70.740 
+_cell.angle_alpha        100.54 
+_cell.angle_beta         83.79 
+_cell.angle_gamma        101.64 
+_cell.Z_PDB              2 
+_cell.pdbx_unique_axis   ? 
+# 
+_symmetry.entry_id                         1XYZ 
+_symmetry.space_group_name_H-M             'P 1' 
+_symmetry.pdbx_full_space_group_name_H-M   ? 
+_symmetry.cell_setting                     ? 
+_symmetry.Int_Tables_number                ? 
+# 
+loop_
+_entity.id 
+_entity.type 
+_entity.src_method 
+_entity.pdbx_description 
+_entity.formula_weight 
+_entity.pdbx_number_of_molecules 
+_entity.details 
+_entity.pdbx_mutation 
+_entity.pdbx_fragment 
+_entity.pdbx_ec 
+1 polymer man 1,4-BETA-D-XYLAN-XYLANOHYDROLASE 39434.574 2   ? ? ? 3.2.1.8 
+2 water   nat water                            18.015    457 ? ? ? ?       
+# 
+loop_
+_entity_keywords.entity_id 
+_entity_keywords.text 
+1 ? 
+2 ? 
+# 
+loop_
+_entity_name_com.entity_id 
+_entity_name_com.name 
+1 'ENDO-1\,4-BETA-XYLANASE Z, XYLANASE XYNZ' 
+2 ?                                          
+# 
+_entity_poly.entity_id                      1 
+_entity_poly.type                           'polypeptide(L)' 
+_entity_poly.nstd_linkage                   no 
+_entity_poly.nstd_monomer                   no 
+_entity_poly.pdbx_seq_one_letter_code       
+;PGQGDVQTPNPSVTPTQTPIPTISGNALRDYAEARGIKIGTCVNYPFYNNSDPTYNSILQREFSMVVCENEMKFDALQPR
+QNVFDFSKGDQLLAFAERNGMQMRGHTLIWHNQNPSWLTNGNWNRDSLLAVMKNHITTVMTHYKGKIVEWDVANECMDDS
+GNGLRSSIWRNVIGQDYLDYAFRYAREADPDALLFYNDYNIEDLGPKSNAVFNMIKSMKERGVPIDGVGFQCHFINGMSP
+EYLASIDQNIKRYAEIGVIVSFTEIDIRIPQSENPATAFQVQANNYKELMKICLANPNCNTFVMWGFTDKYTWIPGTFPG
+YGNPLIYDSNYNPKPAYNAIKEALMGY
+;
+_entity_poly.pdbx_seq_one_letter_code_can   
+;PGQGDVQTPNPSVTPTQTPIPTISGNALRDYAEARGIKIGTCVNYPFYNNSDPTYNSILQREFSMVVCENEMKFDALQPR
+QNVFDFSKGDQLLAFAERNGMQMRGHTLIWHNQNPSWLTNGNWNRDSLLAVMKNHITTVMTHYKGKIVEWDVANECMDDS
+GNGLRSSIWRNVIGQDYLDYAFRYAREADPDALLFYNDYNIEDLGPKSNAVFNMIKSMKERGVPIDGVGFQCHFINGMSP
+EYLASIDQNIKRYAEIGVIVSFTEIDIRIPQSENPATAFQVQANNYKELMKICLANPNCNTFVMWGFTDKYTWIPGTFPG
+YGNPLIYDSNYNPKPAYNAIKEALMGY
+;
+_entity_poly.pdbx_strand_id                 A,B 
+# 
+loop_
+_entity_poly_seq.entity_id 
+_entity_poly_seq.num 
+_entity_poly_seq.mon_id 
+_entity_poly_seq.hetero 
+1 1   PRO n 
+1 2   GLY n 
+1 3   GLN n 
+1 4   GLY n 
+1 5   ASP n 
+1 6   VAL n 
+1 7   GLN n 
+1 8   THR n 
+1 9   PRO n 
+1 10  ASN n 
+1 11  PRO n 
+1 12  SER n 
+1 13  VAL n 
+1 14  THR n 
+1 15  PRO n 
+1 16  THR n 
+1 17  GLN n 
+1 18  THR n 
+1 19  PRO n 
+1 20  ILE n 
+1 21  PRO n 
+1 22  THR n 
+1 23  ILE n 
+1 24  SER n 
+1 25  GLY n 
+1 26  ASN n 
+1 27  ALA n 
+1 28  LEU n 
+1 29  ARG n 
+1 30  ASP n 
+1 31  TYR n 
+1 32  ALA n 
+1 33  GLU n 
+1 34  ALA n 
+1 35  ARG n 
+1 36  GLY n 
+1 37  ILE n 
+1 38  LYS n 
+1 39  ILE n 
+1 40  GLY n 
+1 41  THR n 
+1 42  CYS n 
+1 43  VAL n 
+1 44  ASN n 
+1 45  TYR n 
+1 46  PRO n 
+1 47  PHE n 
+1 48  TYR n 
+1 49  ASN n 
+1 50  ASN n 
+1 51  SER n 
+1 52  ASP n 
+1 53  PRO n 
+1 54  THR n 
+1 55  TYR n 
+1 56  ASN n 
+1 57  SER n 
+1 58  ILE n 
+1 59  LEU n 
+1 60  GLN n 
+1 61  ARG n 
+1 62  GLU n 
+1 63  PHE n 
+1 64  SER n 
+1 65  MET n 
+1 66  VAL n 
+1 67  VAL n 
+1 68  CYS n 
+1 69  GLU n 
+1 70  ASN n 
+1 71  GLU n 
+1 72  MET n 
+1 73  LYS n 
+1 74  PHE n 
+1 75  ASP n 
+1 76  ALA n 
+1 77  LEU n 
+1 78  GLN n 
+1 79  PRO n 
+1 80  ARG n 
+1 81  GLN n 
+1 82  ASN n 
+1 83  VAL n 
+1 84  PHE n 
+1 85  ASP n 
+1 86  PHE n 
+1 87  SER n 
+1 88  LYS n 
+1 89  GLY n 
+1 90  ASP n 
+1 91  GLN n 
+1 92  LEU n 
+1 93  LEU n 
+1 94  ALA n 
+1 95  PHE n 
+1 96  ALA n 
+1 97  GLU n 
+1 98  ARG n 
+1 99  ASN n 
+1 100 GLY n 
+1 101 MET n 
+1 102 GLN n 
+1 103 MET n 
+1 104 ARG n 
+1 105 GLY n 
+1 106 HIS n 
+1 107 THR n 
+1 108 LEU n 
+1 109 ILE n 
+1 110 TRP n 
+1 111 HIS n 
+1 112 ASN n 
+1 113 GLN n 
+1 114 ASN n 
+1 115 PRO n 
+1 116 SER n 
+1 117 TRP n 
+1 118 LEU n 
+1 119 THR n 
+1 120 ASN n 
+1 121 GLY n 
+1 122 ASN n 
+1 123 TRP n 
+1 124 ASN n 
+1 125 ARG n 
+1 126 ASP n 
+1 127 SER n 
+1 128 LEU n 
+1 129 LEU n 
+1 130 ALA n 
+1 131 VAL n 
+1 132 MET n 
+1 133 LYS n 
+1 134 ASN n 
+1 135 HIS n 
+1 136 ILE n 
+1 137 THR n 
+1 138 THR n 
+1 139 VAL n 
+1 140 MET n 
+1 141 THR n 
+1 142 HIS n 
+1 143 TYR n 
+1 144 LYS n 
+1 145 GLY n 
+1 146 LYS n 
+1 147 ILE n 
+1 148 VAL n 
+1 149 GLU n 
+1 150 TRP n 
+1 151 ASP n 
+1 152 VAL n 
+1 153 ALA n 
+1 154 ASN n 
+1 155 GLU n 
+1 156 CYS n 
+1 157 MET n 
+1 158 ASP n 
+1 159 ASP n 
+1 160 SER n 
+1 161 GLY n 
+1 162 ASN n 
+1 163 GLY n 
+1 164 LEU n 
+1 165 ARG n 
+1 166 SER n 
+1 167 SER n 
+1 168 ILE n 
+1 169 TRP n 
+1 170 ARG n 
+1 171 ASN n 
+1 172 VAL n 
+1 173 ILE n 
+1 174 GLY n 
+1 175 GLN n 
+1 176 ASP n 
+1 177 TYR n 
+1 178 LEU n 
+1 179 ASP n 
+1 180 TYR n 
+1 181 ALA n 
+1 182 PHE n 
+1 183 ARG n 
+1 184 TYR n 
+1 185 ALA n 
+1 186 ARG n 
+1 187 GLU n 
+1 188 ALA n 
+1 189 ASP n 
+1 190 PRO n 
+1 191 ASP n 
+1 192 ALA n 
+1 193 LEU n 
+1 194 LEU n 
+1 195 PHE n 
+1 196 TYR n 
+1 197 ASN n 
+1 198 ASP n 
+1 199 TYR n 
+1 200 ASN n 
+1 201 ILE n 
+1 202 GLU n 
+1 203 ASP n 
+1 204 LEU n 
+1 205 GLY n 
+1 206 PRO n 
+1 207 LYS n 
+1 208 SER n 
+1 209 ASN n 
+1 210 ALA n 
+1 211 VAL n 
+1 212 PHE n 
+1 213 ASN n 
+1 214 MET n 
+1 215 ILE n 
+1 216 LYS n 
+1 217 SER n 
+1 218 MET n 
+1 219 LYS n 
+1 220 GLU n 
+1 221 ARG n 
+1 222 GLY n 
+1 223 VAL n 
+1 224 PRO n 
+1 225 ILE n 
+1 226 ASP n 
+1 227 GLY n 
+1 228 VAL n 
+1 229 GLY n 
+1 230 PHE n 
+1 231 GLN n 
+1 232 CYS n 
+1 233 HIS n 
+1 234 PHE n 
+1 235 ILE n 
+1 236 ASN n 
+1 237 GLY n 
+1 238 MET n 
+1 239 SER n 
+1 240 PRO n 
+1 241 GLU n 
+1 242 TYR n 
+1 243 LEU n 
+1 244 ALA n 
+1 245 SER n 
+1 246 ILE n 
+1 247 ASP n 
+1 248 GLN n 
+1 249 ASN n 
+1 250 ILE n 
+1 251 LYS n 
+1 252 ARG n 
+1 253 TYR n 
+1 254 ALA n 
+1 255 GLU n 
+1 256 ILE n 
+1 257 GLY n 
+1 258 VAL n 
+1 259 ILE n 
+1 260 VAL n 
+1 261 SER n 
+1 262 PHE n 
+1 263 THR n 
+1 264 GLU n 
+1 265 ILE n 
+1 266 ASP n 
+1 267 ILE n 
+1 268 ARG n 
+1 269 ILE n 
+1 270 PRO n 
+1 271 GLN n 
+1 272 SER n 
+1 273 GLU n 
+1 274 ASN n 
+1 275 PRO n 
+1 276 ALA n 
+1 277 THR n 
+1 278 ALA n 
+1 279 PHE n 
+1 280 GLN n 
+1 281 VAL n 
+1 282 GLN n 
+1 283 ALA n 
+1 284 ASN n 
+1 285 ASN n 
+1 286 TYR n 
+1 287 LYS n 
+1 288 GLU n 
+1 289 LEU n 
+1 290 MET n 
+1 291 LYS n 
+1 292 ILE n 
+1 293 CYS n 
+1 294 LEU n 
+1 295 ALA n 
+1 296 ASN n 
+1 297 PRO n 
+1 298 ASN n 
+1 299 CYS n 
+1 300 ASN n 
+1 301 THR n 
+1 302 PHE n 
+1 303 VAL n 
+1 304 MET n 
+1 305 TRP n 
+1 306 GLY n 
+1 307 PHE n 
+1 308 THR n 
+1 309 ASP n 
+1 310 LYS n 
+1 311 TYR n 
+1 312 THR n 
+1 313 TRP n 
+1 314 ILE n 
+1 315 PRO n 
+1 316 GLY n 
+1 317 THR n 
+1 318 PHE n 
+1 319 PRO n 
+1 320 GLY n 
+1 321 TYR n 
+1 322 GLY n 
+1 323 ASN n 
+1 324 PRO n 
+1 325 LEU n 
+1 326 ILE n 
+1 327 TYR n 
+1 328 ASP n 
+1 329 SER n 
+1 330 ASN n 
+1 331 TYR n 
+1 332 ASN n 
+1 333 PRO n 
+1 334 LYS n 
+1 335 PRO n 
+1 336 ALA n 
+1 337 TYR n 
+1 338 ASN n 
+1 339 ALA n 
+1 340 ILE n 
+1 341 LYS n 
+1 342 GLU n 
+1 343 ALA n 
+1 344 LEU n 
+1 345 MET n 
+1 346 GLY n 
+1 347 TYR n 
+# 
+_entity_src_gen.entity_id                          1 
+_entity_src_gen.gene_src_common_name               ? 
+_entity_src_gen.gene_src_genus                     Clostridium 
+_entity_src_gen.pdbx_gene_src_gene                 ? 
+_entity_src_gen.gene_src_species                   ? 
+_entity_src_gen.gene_src_strain                    'NCIB 10682' 
+_entity_src_gen.gene_src_tissue                    ? 
+_entity_src_gen.gene_src_tissue_fraction           ? 
+_entity_src_gen.gene_src_details                   ? 
+_entity_src_gen.pdbx_gene_src_fragment             ? 
+_entity_src_gen.pdbx_gene_src_scientific_name      'Clostridium thermocellum' 
+_entity_src_gen.pdbx_gene_src_ncbi_taxonomy_id     1515 
+_entity_src_gen.pdbx_gene_src_variant              ? 
+_entity_src_gen.pdbx_gene_src_cell_line            ? 
+_entity_src_gen.pdbx_gene_src_atcc                 ? 
+_entity_src_gen.pdbx_gene_src_organ                ? 
+_entity_src_gen.pdbx_gene_src_organelle            ? 
+_entity_src_gen.pdbx_gene_src_cell                 ? 
+_entity_src_gen.pdbx_gene_src_cellular_location    ? 
+_entity_src_gen.host_org_common_name               ? 
+_entity_src_gen.pdbx_host_org_scientific_name      'Escherichia coli' 
+_entity_src_gen.pdbx_host_org_ncbi_taxonomy_id     562 
+_entity_src_gen.host_org_genus                     Escherichia 
+_entity_src_gen.pdbx_host_org_gene                 ? 
+_entity_src_gen.pdbx_host_org_organ                ? 
+_entity_src_gen.host_org_species                   ? 
+_entity_src_gen.pdbx_host_org_tissue               ? 
+_entity_src_gen.pdbx_host_org_tissue_fraction      ? 
+_entity_src_gen.pdbx_host_org_strain               ? 
+_entity_src_gen.pdbx_host_org_variant              ? 
+_entity_src_gen.pdbx_host_org_cell_line            ? 
+_entity_src_gen.pdbx_host_org_atcc                 ? 
+_entity_src_gen.pdbx_host_org_culture_collection   ? 
+_entity_src_gen.pdbx_host_org_cell                 ? 
+_entity_src_gen.pdbx_host_org_organelle            ? 
+_entity_src_gen.pdbx_host_org_cellular_location    ? 
+_entity_src_gen.pdbx_host_org_vector_type          ? 
+_entity_src_gen.pdbx_host_org_vector               ? 
+_entity_src_gen.plasmid_name                       'PCT1214 (PUC8)' 
+_entity_src_gen.plasmid_details                    ? 
+_entity_src_gen.pdbx_description                   ? 
+# 
+_struct_ref.id                         1 
+_struct_ref.db_name                    UNP 
+_struct_ref.db_code                    XYNZ_CLOTM 
+_struct_ref.entity_id                  1 
+_struct_ref.pdbx_db_accession          P10478 
+_struct_ref.pdbx_align_begin           1 
+_struct_ref.pdbx_seq_one_letter_code   
+;MSRKLFSVLLVGLMLMTSLLVTISSTSAASLPTMPPSGYDQVRNGVPRGQVVNISYFSTA
+TNSTRPARVYLPPGYSKDKKYSVLYLLHGIGGSENDWFEGGGRANVIADNLIAEGKIKPL
+IIVTPNTNAAGPGIADGYENFTKDLLNSLIPYIESNYSVYTDREHRAIAGLSMGGGQSFN
+IGLTNLDKFAYIGPISAAPNTYPNERLFPDGGKAAREKLKLLFIACGTNDSLIGFGQRVH
+EYCVANNINHVYWLIQGGGHDFNVWKPGLWNFLQMADEAGLTRDGNTPVPTPSPKPANTR
+IEAEDYDGINSSSIEIIGVPPEGGRGIGYITSGDYLVYKSIDFGNGATSFKAKVANANTS
+NIELRLNGPNGTLIGTLSVKSTGDWNTYEEQTCSISKVTGINDLYLVFKGPVNIDWFTFG
+VESSSTGLGDLNGDGNINSSDLQALKRHLLGISPLTGEALLRADVNRSGKVDSTDYSVLK
+RYILRIITEFPGQGDVQTPNPSVTPTQTPIPTISGNALRDYAEARGIKIGTCVNYPFYNN
+SDPTYNSILQREFSMVVCENEMKFDALQPRQNVFDFSKGDQLLAFAERNGMQMRGHTLIW
+HNQNPSWLTNGNWNRDSLLAVMKNHITTVMTHYKGKIVEWDVANECMDDSGNGLRSSIWR
+NVIGQDYLDYAFRYAREADPDALLFYNDYNIEDLGPKSNAVFNMIKSMKERGVPIDGVGF
+QCHFINGMSPEYLASIDQNIKRYAEIGVIVSFTEIDIRIPQSENPATAFQVQANNYKELM
+KICLANPNCNTFVMWGFTDKYTWIPGTFPGYGNPLIYDSNYNPKPAYNAIKEALMGY
+
+;
+_struct_ref.biol_id                    . 
+# 
+loop_
+_struct_ref_seq.align_id 
+_struct_ref_seq.ref_id 
+_struct_ref_seq.pdbx_PDB_id_code 
+_struct_ref_seq.pdbx_strand_id 
+_struct_ref_seq.seq_align_beg 
+_struct_ref_seq.pdbx_seq_align_beg_ins_code 
+_struct_ref_seq.seq_align_end 
+_struct_ref_seq.pdbx_seq_align_end_ins_code 
+_struct_ref_seq.pdbx_db_accession 
+_struct_ref_seq.db_align_beg 
+_struct_ref_seq.pdbx_db_align_beg_ins_code 
+_struct_ref_seq.db_align_end 
+_struct_ref_seq.pdbx_db_align_end_ins_code 
+_struct_ref_seq.pdbx_auth_seq_align_beg 
+_struct_ref_seq.pdbx_auth_seq_align_end 
+1 1 1XYZ A 1 ? 347 ? P10478 491 ? 837 ? 491 837 
+2 1 1XYZ B 1 ? 347 ? P10478 491 ? 837 ? 491 837 
+# 
+loop_
+_chem_comp.id 
+_chem_comp.type 
+_chem_comp.mon_nstd_flag 
+_chem_comp.name 
+_chem_comp.pdbx_synonyms 
+_chem_comp.formula 
+_chem_comp.formula_weight 
+ASN 'L-peptide linking' y ASPARAGINE      ? 'C4 H8 N2 O3'    132.119 
+ALA 'L-peptide linking' y ALANINE         ? 'C3 H7 N O2'     89.094  
+LEU 'L-peptide linking' y LEUCINE         ? 'C6 H13 N O2'    131.174 
+ARG 'L-peptide linking' y ARGININE        ? 'C6 H15 N4 O2 1' 175.210 
+ASP 'L-peptide linking' y 'ASPARTIC ACID' ? 'C4 H7 N O4'     133.104 
+TYR 'L-peptide linking' y TYROSINE        ? 'C9 H11 N O3'    181.191 
+GLU 'L-peptide linking' y 'GLUTAMIC ACID' ? 'C5 H9 N O4'     147.130 
+GLY 'PEPTIDE LINKING'   y GLYCINE         ? 'C2 H5 N O2'     75.067  
+ILE 'L-peptide linking' y ISOLEUCINE      ? 'C6 H13 N O2'    131.174 
+LYS 'L-peptide linking' y LYSINE          ? 'C6 H15 N2 O2 1' 147.197 
+THR 'L-peptide linking' y THREONINE       ? 'C4 H9 N O3'     119.120 
+CYS 'L-peptide linking' y CYSTEINE        ? 'C3 H7 N O2 S'   121.154 
+VAL 'L-peptide linking' y VALINE          ? 'C5 H11 N O2'    117.147 
+PRO 'L-peptide linking' y PROLINE         ? 'C5 H9 N O2'     115.132 
+PHE 'L-peptide linking' y PHENYLALANINE   ? 'C9 H11 N O2'    165.191 
+SER 'L-peptide linking' y SERINE          ? 'C3 H7 N O3'     105.093 
+GLN 'L-peptide linking' y GLUTAMINE       ? 'C5 H10 N2 O3'   146.146 
+MET 'L-peptide linking' y METHIONINE      ? 'C5 H11 N O2 S'  149.207 
+HIS 'L-peptide linking' y HISTIDINE       ? 'C6 H10 N3 O2 1' 156.164 
+TRP 'L-peptide linking' y TRYPTOPHAN      ? 'C11 H12 N2 O2'  204.228 
+HOH NON-POLYMER         . WATER           ? 'H2 O'           18.015  
+# 
+_exptl.entry_id          1XYZ 
+_exptl.method            'X-RAY DIFFRACTION' 
+_exptl.crystals_number   1 
+# 
+_exptl_crystal.id                    1 
+_exptl_crystal.density_meas          ? 
+_exptl_crystal.density_Matthews      2.07 
+_exptl_crystal.density_percent_sol   40.63 
+_exptl_crystal.description           ? 
+# 
+_diffrn.id                     1 
+_diffrn.ambient_temp           ? 
+_diffrn.ambient_temp_details   ? 
+_diffrn.crystal_id             1 
+# 
+_diffrn_detector.diffrn_id              1 
+_diffrn_detector.detector               'IMAGE PLATE' 
+_diffrn_detector.type                   MARRESEARCH 
+_diffrn_detector.pdbx_collection_date   1993-11 
+_diffrn_detector.details                ? 
+# 
+_diffrn_radiation.diffrn_id                        1 
+_diffrn_radiation.wavelength_id                    1 
+_diffrn_radiation.pdbx_monochromatic_or_laue_m_l   M 
+_diffrn_radiation.monochromator                    ? 
+_diffrn_radiation.pdbx_diffrn_protocol             ? 
+_diffrn_radiation.pdbx_scattering_type             x-ray 
+# 
+_diffrn_radiation_wavelength.id           1 
+_diffrn_radiation_wavelength.wavelength   0.92 
+_diffrn_radiation_wavelength.wt           1.0 
+# 
+_diffrn_source.diffrn_id                   1 
+_diffrn_source.source                      SYNCHROTRON 
+_diffrn_source.type                        'EMBL/DESY, HAMBURG BEAMLINE X31' 
+_diffrn_source.pdbx_synchrotron_site       'EMBL/DESY, HAMBURG' 
+_diffrn_source.pdbx_synchrotron_beamline   X31 
+_diffrn_source.pdbx_wavelength             ? 
+_diffrn_source.pdbx_wavelength_list        0.92 
+# 
+_reflns.entry_id                     1XYZ 
+_reflns.observed_criterion_sigma_I   ? 
+_reflns.observed_criterion_sigma_F   ? 
+_reflns.d_resolution_low             ? 
+_reflns.d_resolution_high            ? 
+_reflns.number_obs                   11704 
+_reflns.number_all                   ? 
+_reflns.percent_possible_obs         96.4 
+_reflns.pdbx_Rmerge_I_obs            0.083 
+_reflns.pdbx_Rsym_value              ? 
+_reflns.pdbx_netI_over_sigmaI        ? 
+_reflns.B_iso_Wilson_estimate        ? 
+_reflns.pdbx_redundancy              2.9 
+_reflns.pdbx_ordinal                 1 
+_reflns.pdbx_diffrn_id               1 
+# 
+_computing.entry_id                           1XYZ 
+_computing.pdbx_data_reduction_ii             DENZO 
+_computing.pdbx_data_reduction_ds             ? 
+_computing.data_collection                    ? 
+_computing.structure_solution                 'ARP/WARP, X-PLOR' 
+_computing.structure_refinement               'ARP/WARP, X-PLOR' 
+_computing.pdbx_structure_refinement_method   ? 
+# 
+_refine.entry_id                               1XYZ 
+_refine.ls_number_reflns_obs                   117046 
+_refine.ls_number_reflns_all                   ? 
+_refine.pdbx_ls_sigma_I                        ? 
+_refine.pdbx_ls_sigma_F                        0.0 
+_refine.pdbx_data_cutoff_high_absF             ? 
+_refine.pdbx_data_cutoff_low_absF              ? 
+_refine.pdbx_data_cutoff_high_rms_absF         ? 
+_refine.ls_d_res_low                           10.0 
+_refine.ls_d_res_high                          1.4 
+_refine.ls_percent_reflns_obs                  ? 
+_refine.ls_R_factor_obs                        0.183 
+_refine.ls_R_factor_all                        ? 
+_refine.ls_R_factor_R_work                     0.183 
+_refine.ls_R_factor_R_free                     0.221 
+_refine.ls_R_factor_R_free_error               ? 
+_refine.ls_R_factor_R_free_error_details       ? 
+_refine.ls_percent_reflns_R_free               ? 
+_refine.ls_number_reflns_R_free                ? 
+_refine.ls_number_parameters                   ? 
+_refine.ls_number_restraints                   ? 
+_refine.occupancy_min                          ? 
+_refine.occupancy_max                          ? 
+_refine.B_iso_mean                             ? 
+_refine.aniso_B[1][1]                          ? 
+_refine.aniso_B[2][2]                          ? 
+_refine.aniso_B[3][3]                          ? 
+_refine.aniso_B[1][2]                          ? 
+_refine.aniso_B[1][3]                          ? 
+_refine.aniso_B[2][3]                          ? 
+_refine.solvent_model_details                  ? 
+_refine.solvent_model_param_ksol               ? 
+_refine.solvent_model_param_bsol               ? 
+_refine.pdbx_ls_cross_valid_method             ? 
+_refine.details                                ? 
+_refine.pdbx_starting_model                    ? 
+_refine.pdbx_method_to_determine_struct        ? 
+_refine.pdbx_isotropic_thermal_model           ? 
+_refine.pdbx_stereochemistry_target_values     ? 
+_refine.pdbx_stereochem_target_val_spec_case   ? 
+_refine.pdbx_R_Free_selection_details          ? 
+_refine.pdbx_overall_ESU_R                     ? 
+_refine.pdbx_overall_ESU_R_Free                ? 
+_refine.overall_SU_ML                          ? 
+_refine.overall_SU_B                           ? 
+_refine.pdbx_refine_id                         'X-RAY DIFFRACTION' 
+_refine.pdbx_diffrn_id                         1 
+# 
+_refine_hist.pdbx_refine_id                   'X-RAY DIFFRACTION' 
+_refine_hist.cycle_id                         LAST 
+_refine_hist.pdbx_number_atoms_protein        5164 
+_refine_hist.pdbx_number_atoms_nucleic_acid   0 
+_refine_hist.pdbx_number_atoms_ligand         0 
+_refine_hist.number_atoms_solvent             457 
+_refine_hist.number_atoms_total               5621 
+_refine_hist.d_res_high                       1.4 
+_refine_hist.d_res_low                        10.0 
+# 
+loop_
+_refine_ls_restr.type 
+_refine_ls_restr.dev_ideal 
+_refine_ls_restr.dev_ideal_target 
+_refine_ls_restr.weight 
+_refine_ls_restr.number 
+_refine_ls_restr.pdbx_refine_id 
+x_bond_d                0.015 ? ? ? 'X-RAY DIFFRACTION' 
+x_bond_d_na             ?     ? ? ? 'X-RAY DIFFRACTION' 
+x_bond_d_prot           ?     ? ? ? 'X-RAY DIFFRACTION' 
+x_angle_d               ?     ? ? ? 'X-RAY DIFFRACTION' 
+x_angle_d_na            ?     ? ? ? 'X-RAY DIFFRACTION' 
+x_angle_d_prot          ?     ? ? ? 'X-RAY DIFFRACTION' 
+x_angle_deg             1.61  ? ? ? 'X-RAY DIFFRACTION' 
+x_angle_deg_na          ?     ? ? ? 'X-RAY DIFFRACTION' 
+x_angle_deg_prot        ?     ? ? ? 'X-RAY DIFFRACTION' 
+x_dihedral_angle_d      23.2  ? ? ? 'X-RAY DIFFRACTION' 
+x_dihedral_angle_d_na   ?     ? ? ? 'X-RAY DIFFRACTION' 
+x_dihedral_angle_d_prot ?     ? ? ? 'X-RAY DIFFRACTION' 
+x_improper_angle_d      1.58  ? ? ? 'X-RAY DIFFRACTION' 
+x_improper_angle_d_na   ?     ? ? ? 'X-RAY DIFFRACTION' 
+x_improper_angle_d_prot ?     ? ? ? 'X-RAY DIFFRACTION' 
+x_mcbond_it             ?     ? ? ? 'X-RAY DIFFRACTION' 
+x_mcangle_it            ?     ? ? ? 'X-RAY DIFFRACTION' 
+x_scbond_it             ?     ? ? ? 'X-RAY DIFFRACTION' 
+x_scangle_it            ?     ? ? ? 'X-RAY DIFFRACTION' 
+# 
+_struct_ncs_oper.id             1 
+_struct_ncs_oper.code           given 
+_struct_ncs_oper.details        ? 
+_struct_ncs_oper.matrix[1][1]   -0.999970 
+_struct_ncs_oper.matrix[1][2]   0.003570 
+_struct_ncs_oper.matrix[1][3]   0.006220 
+_struct_ncs_oper.matrix[2][1]   0.006340 
+_struct_ncs_oper.matrix[2][2]   0.034090 
+_struct_ncs_oper.matrix[2][3]   0.999400 
+_struct_ncs_oper.matrix[3][1]   0.003360 
+_struct_ncs_oper.matrix[3][2]   0.999410 
+_struct_ncs_oper.matrix[3][3]   -0.034110 
+_struct_ncs_oper.vector[1]      23.67979 
+_struct_ncs_oper.vector[2]      -4.45463 
+_struct_ncs_oper.vector[3]      56.27028 
+# 
+_struct.entry_id                  1XYZ 
+_struct.title                     'A COMMON PROTEIN FOLD AND SIMILAR ACTIVE SITE IN TWO DISTINCT FAMILIES OF BETA-GLYCANASES' 
+_struct.pdbx_descriptor           1,4-BETA-D-XYLAN-XYLANOHYDROLASE 
+_struct.pdbx_model_details        ? 
+_struct.pdbx_CASP_flag            ? 
+_struct.pdbx_model_type_details   ? 
+# 
+_struct_keywords.entry_id        1XYZ 
+_struct_keywords.pdbx_keywords   GLYCOSYLTRANSFERASE 
+_struct_keywords.text            
+'GLYCOSYL HYDROLASE, XYLANASE, FAMILY F/10 OF GLYCOSYL HYDROLASES, CLOSTRIDIUM THERMOCELLUM, GLYCOSYLTRANSFERASE' 
+# 
+loop_
+_struct_asym.id 
+_struct_asym.pdbx_blank_PDB_chainid_flag 
+_struct_asym.pdbx_modified 
+_struct_asym.entity_id 
+_struct_asym.details 
+A N N 1 ? 
+B N N 1 ? 
+C N N 2 ? 
+D N N 2 ? 
+# 
+loop_
+_struct_biol.id 
+_struct_biol.details 
+_struct_biol.pdbx_parent_biol_id 
+1 
+;MTRIX
+ THE TRANSFORMATIONS PRESENTED ON MTRIX RECORDS BELOW
+ DESCRIBE NON-CRYSTALLOGRAPHIC RELATIONSHIPS AMONG THE
+ VARIOUS DOMAINS IN THIS ENTRY.  APPLYING THE APPROPRIATE
+ MTRIX TRANSFORMATION TO THE RESIDUES LISTED FIRST WILL
+ YIELD APPROXIMATE COORDINATES FOR THE RESIDUES LISTED
+ SECOND.
+
+           APPLIED TO           TRANSFORMED TO
+ MTRIX      RESIDUES               RESIDUES         RMSD
+   M1   A  516  ..  A  835     B  516  ..  B  835   0.287
+;
+? 
+2 ? ? 
+# 
+loop_
+_struct_conf.conf_type_id 
+_struct_conf.id 
+_struct_conf.pdbx_PDB_helix_id 
+_struct_conf.beg_label_comp_id 
+_struct_conf.beg_label_asym_id 
+_struct_conf.beg_label_seq_id 
+_struct_conf.pdbx_beg_PDB_ins_code 
+_struct_conf.end_label_comp_id 
+_struct_conf.end_label_asym_id 
+_struct_conf.end_label_seq_id 
+_struct_conf.pdbx_end_PDB_ins_code 
+_struct_conf.beg_auth_comp_id 
+_struct_conf.beg_auth_asym_id 
+_struct_conf.beg_auth_seq_id 
+_struct_conf.end_auth_comp_id 
+_struct_conf.end_auth_asym_id 
+_struct_conf.end_auth_seq_id 
+_struct_conf.pdbx_PDB_helix_class 
+_struct_conf.details 
+_struct_conf.pdbx_PDB_helix_length 
+HELX_P HELX_P1  1  LEU A 28  ? ARG A 35  ? LEU A 518 ARG A 525 1 ? 8  
+HELX_P HELX_P2  2  TYR A 45  ? ASN A 49  ? TYR A 535 ASN A 539 5 ? 5  
+HELX_P HELX_P3  3  PRO A 53  ? GLU A 62  ? PRO A 543 GLU A 552 1 ? 10 
+HELX_P HELX_P4  4  PHE A 74  ? LEU A 77  ? PHE A 564 LEU A 567 1 ? 4  
+HELX_P HELX_P5  5  SER A 87  ? ASN A 99  ? SER A 577 ASN A 589 1 ? 13 
+HELX_P HELX_P6  6  SER A 116 ? THR A 119 ? SER A 606 THR A 609 1 ? 4  
+HELX_P HELX_P7  7  ARG A 125 ? HIS A 142 ? ARG A 615 HIS A 632 1 ? 18 
+HELX_P HELX_P8  8  ILE A 168 ? ILE A 173 ? ILE A 658 ILE A 663 1 ? 6  
+HELX_P HELX_P9  9  TYR A 177 ? ALA A 188 ? TYR A 667 ALA A 678 1 ? 12 
+HELX_P HELX_P10 10 PRO A 206 ? ARG A 221 ? PRO A 696 ARG A 711 1 ? 16 
+HELX_P HELX_P11 11 PRO A 240 ? ILE A 256 ? PRO A 730 ILE A 746 1 ? 17 
+HELX_P HELX_P12 12 PRO A 275 ? ALA A 295 ? PRO A 765 ALA A 785 1 ? 21 
+HELX_P HELX_P13 13 ILE A 314 ? THR A 317 ? ILE A 804 THR A 807 1 ? 4  
+HELX_P HELX_P14 14 PRO A 335 ? LEU A 344 ? PRO A 825 LEU A 834 1 ? 10 
+HELX_P HELX_P15 15 LEU B 28  ? ARG B 35  ? LEU B 518 ARG B 525 1 ? 8  
+HELX_P HELX_P16 16 TYR B 45  ? ASN B 49  ? TYR B 535 ASN B 539 5 ? 5  
+HELX_P HELX_P17 17 PRO B 53  ? GLU B 62  ? PRO B 543 GLU B 552 1 ? 10 
+HELX_P HELX_P18 18 PHE B 74  ? LEU B 77  ? PHE B 564 LEU B 567 1 ? 4  
+HELX_P HELX_P19 19 SER B 87  ? ASN B 99  ? SER B 577 ASN B 589 1 ? 13 
+HELX_P HELX_P20 20 SER B 116 ? THR B 119 ? SER B 606 THR B 609 1 ? 4  
+HELX_P HELX_P21 21 ARG B 125 ? HIS B 142 ? ARG B 615 HIS B 632 1 ? 18 
+HELX_P HELX_P22 22 ILE B 168 ? ILE B 173 ? ILE B 658 ILE B 663 1 ? 6  
+HELX_P HELX_P23 23 TYR B 177 ? ALA B 188 ? TYR B 667 ALA B 678 1 ? 12 
+HELX_P HELX_P24 24 PRO B 206 ? GLU B 220 ? PRO B 696 GLU B 710 1 ? 15 
+HELX_P HELX_P25 25 PRO B 240 ? ILE B 256 ? PRO B 730 ILE B 746 1 ? 17 
+HELX_P HELX_P26 26 PRO B 275 ? ALA B 295 ? PRO B 765 ALA B 785 1 ? 21 
+HELX_P HELX_P27 27 ILE B 314 ? THR B 317 ? ILE B 804 THR B 807 1 ? 4  
+HELX_P HELX_P28 28 PRO B 335 ? ALA B 343 ? PRO B 825 ALA B 833 1 ? 9  
+# 
+_struct_conf_type.id          HELX_P 
+_struct_conf_type.criteria    ? 
+_struct_conf_type.reference   ? 
+# 
+loop_
+_struct_mon_prot_cis.pdbx_id 
+_struct_mon_prot_cis.label_comp_id 
+_struct_mon_prot_cis.label_seq_id 
+_struct_mon_prot_cis.label_asym_id 
+_struct_mon_prot_cis.label_alt_id 
+_struct_mon_prot_cis.pdbx_PDB_ins_code 
+_struct_mon_prot_cis.auth_comp_id 
+_struct_mon_prot_cis.auth_seq_id 
+_struct_mon_prot_cis.auth_asym_id 
+_struct_mon_prot_cis.pdbx_label_comp_id_2 
+_struct_mon_prot_cis.pdbx_label_seq_id_2 
+_struct_mon_prot_cis.pdbx_label_asym_id_2 
+_struct_mon_prot_cis.pdbx_PDB_ins_code_2 
+_struct_mon_prot_cis.pdbx_auth_comp_id_2 
+_struct_mon_prot_cis.pdbx_auth_seq_id_2 
+_struct_mon_prot_cis.pdbx_auth_asym_id_2 
+_struct_mon_prot_cis.pdbx_PDB_model_num 
+_struct_mon_prot_cis.pdbx_omega_angle 
+1 HIS 106 A . ? HIS 596 A THR 107 A ? THR 597 A 1 0.11 
+2 HIS 106 B . ? HIS 596 B THR 107 B ? THR 597 B 1 0.29 
+# 
+loop_
+_struct_sheet.id 
+_struct_sheet.type 
+_struct_sheet.number_strands 
+_struct_sheet.details 
+A ? 8 ? 
+B ? 2 ? 
+C ? 8 ? 
+D ? 2 ? 
+# 
+loop_
+_struct_sheet_order.sheet_id 
+_struct_sheet_order.range_id_1 
+_struct_sheet_order.range_id_2 
+_struct_sheet_order.offset 
+_struct_sheet_order.sense 
+A 1 2 ? parallel 
+A 2 3 ? parallel 
+A 3 4 ? parallel 
+A 4 5 ? parallel 
+A 5 6 ? parallel 
+A 6 7 ? parallel 
+A 7 8 ? parallel 
+B 1 2 ? parallel 
+C 1 2 ? parallel 
+C 2 3 ? parallel 
+C 3 4 ? parallel 
+C 4 5 ? parallel 
+C 5 6 ? parallel 
+C 6 7 ? parallel 
+C 7 8 ? parallel 
+D 1 2 ? parallel 
+# 
+loop_
+_struct_sheet_range.sheet_id 
+_struct_sheet_range.id 
+_struct_sheet_range.beg_label_comp_id 
+_struct_sheet_range.beg_label_asym_id 
+_struct_sheet_range.beg_label_seq_id 
+_struct_sheet_range.pdbx_beg_PDB_ins_code 
+_struct_sheet_range.end_label_comp_id 
+_struct_sheet_range.end_label_asym_id 
+_struct_sheet_range.end_label_seq_id 
+_struct_sheet_range.pdbx_end_PDB_ins_code 
+_struct_sheet_range.symmetry 
+_struct_sheet_range.beg_auth_comp_id 
+_struct_sheet_range.beg_auth_asym_id 
+_struct_sheet_range.beg_auth_seq_id 
+_struct_sheet_range.end_auth_comp_id 
+_struct_sheet_range.end_auth_asym_id 
+_struct_sheet_range.end_auth_seq_id 
+A 1 GLN A 102 ? ARG A 104 ? ? GLN A 592 ARG A 594 
+A 2 MET A 65  ? CYS A 68  ? ? MET A 555 CYS A 558 
+A 3 LYS A 38  ? VAL A 43  ? ? LYS A 528 VAL A 533 
+A 4 CYS A 299 ? MET A 304 ? ? CYS A 789 MET A 794 
+A 5 ILE A 259 ? PHE A 262 ? ? ILE A 749 PHE A 752 
+A 6 GLY A 227 ? PHE A 230 ? ? GLY A 717 PHE A 720 
+A 7 LEU A 193 ? ASP A 198 ? ? LEU A 683 ASP A 688 
+A 8 GLU A 149 ? ASN A 154 ? ? GLU A 639 ASN A 644 
+B 1 HIS A 233 ? ILE A 235 ? ? HIS A 723 ILE A 725 
+B 2 ASP A 266 ? ARG A 268 ? ? ASP A 756 ARG A 758 
+C 1 GLN B 102 ? ARG B 104 ? ? GLN B 592 ARG B 594 
+C 2 MET B 65  ? CYS B 68  ? ? MET B 555 CYS B 558 
+C 3 LYS B 38  ? VAL B 43  ? ? LYS B 528 VAL B 533 
+C 4 CYS B 299 ? MET B 304 ? ? CYS B 789 MET B 794 
+C 5 ILE B 259 ? PHE B 262 ? ? ILE B 749 PHE B 752 
+C 6 GLY B 227 ? PHE B 230 ? ? GLY B 717 PHE B 720 
+C 7 LEU B 193 ? ASP B 198 ? ? LEU B 683 ASP B 688 
+C 8 GLU B 149 ? ASN B 154 ? ? GLU B 639 ASN B 644 
+D 1 HIS B 233 ? ILE B 235 ? ? HIS B 723 ILE B 725 
+D 2 ASP B 266 ? ARG B 268 ? ? ASP B 756 ARG B 758 
+# 
+loop_
+_pdbx_struct_sheet_hbond.sheet_id 
+_pdbx_struct_sheet_hbond.range_id_1 
+_pdbx_struct_sheet_hbond.range_id_2 
+_pdbx_struct_sheet_hbond.range_1_label_atom_id 
+_pdbx_struct_sheet_hbond.range_1_label_comp_id 
+_pdbx_struct_sheet_hbond.range_1_label_asym_id 
+_pdbx_struct_sheet_hbond.range_1_label_seq_id 
+_pdbx_struct_sheet_hbond.range_1_PDB_ins_code 
+_pdbx_struct_sheet_hbond.range_1_auth_atom_id 
+_pdbx_struct_sheet_hbond.range_1_auth_comp_id 
+_pdbx_struct_sheet_hbond.range_1_auth_asym_id 
+_pdbx_struct_sheet_hbond.range_1_auth_seq_id 
+_pdbx_struct_sheet_hbond.range_2_label_atom_id 
+_pdbx_struct_sheet_hbond.range_2_label_comp_id 
+_pdbx_struct_sheet_hbond.range_2_label_asym_id 
+_pdbx_struct_sheet_hbond.range_2_label_seq_id 
+_pdbx_struct_sheet_hbond.range_2_PDB_ins_code 
+_pdbx_struct_sheet_hbond.range_2_auth_atom_id 
+_pdbx_struct_sheet_hbond.range_2_auth_comp_id 
+_pdbx_struct_sheet_hbond.range_2_auth_asym_id 
+_pdbx_struct_sheet_hbond.range_2_auth_seq_id 
+A 1 2 O GLN A 102 ? O GLN A 592 N VAL A 66  ? N VAL A 556 
+A 2 3 O MET A 65  ? O MET A 555 N THR A 41  ? N THR A 531 
+A 3 4 O LYS A 38  ? O LYS A 528 N PHE A 302 ? N PHE A 792 
+A 4 5 O ASN A 300 ? O ASN A 790 N VAL A 260 ? N VAL A 750 
+A 5 6 O ILE A 259 ? O ILE A 749 N VAL A 228 ? N VAL A 718 
+A 6 7 O GLY A 227 ? O GLY A 717 N TYR A 196 ? N TYR A 686 
+A 7 8 O LEU A 193 ? O LEU A 683 N TRP A 150 ? N TRP A 640 
+B 1 2 O PHE A 234 ? O PHE A 724 N ASP A 266 ? N ASP A 756 
+C 1 2 O GLN B 102 ? O GLN B 592 N VAL B 66  ? N VAL B 556 
+C 2 3 O MET B 65  ? O MET B 555 N THR B 41  ? N THR B 531 
+C 3 4 O LYS B 38  ? O LYS B 528 N PHE B 302 ? N PHE B 792 
+C 4 5 O ASN B 300 ? O ASN B 790 N VAL B 260 ? N VAL B 750 
+C 5 6 O ILE B 259 ? O ILE B 749 N VAL B 228 ? N VAL B 718 
+C 6 7 O GLY B 227 ? O GLY B 717 N TYR B 196 ? N TYR B 686 
+C 7 8 O LEU B 193 ? O LEU B 683 N TRP B 150 ? N TRP B 640 
+D 1 2 O PHE B 234 ? O PHE B 724 N ASP B 266 ? N ASP B 756 
+# 
+_database_PDB_matrix.entry_id          1XYZ 
+_database_PDB_matrix.origx[1][1]       1.000000 
+_database_PDB_matrix.origx[1][2]       0.000000 
+_database_PDB_matrix.origx[1][3]       0.000000 
+_database_PDB_matrix.origx[2][1]       0.000000 
+_database_PDB_matrix.origx[2][2]       1.000000 
+_database_PDB_matrix.origx[2][3]       0.000000 
+_database_PDB_matrix.origx[3][1]       0.000000 
+_database_PDB_matrix.origx[3][2]       0.000000 
+_database_PDB_matrix.origx[3][3]       1.000000 
+_database_PDB_matrix.origx_vector[1]   0.00000 
+_database_PDB_matrix.origx_vector[2]   0.00000 
+_database_PDB_matrix.origx_vector[3]   0.00000 
+# 
+_atom_sites.entry_id                    1XYZ 
+_atom_sites.Cartn_transform_axes        ? 
+_atom_sites.fract_transf_matrix[1][1]   0.021231 
+_atom_sites.fract_transf_matrix[1][2]   0.004374 
+_atom_sites.fract_transf_matrix[1][3]   -0.001609 
+_atom_sites.fract_transf_matrix[2][1]   0.000000 
+_atom_sites.fract_transf_matrix[2][2]   0.019980 
+_atom_sites.fract_transf_matrix[2][3]   0.003352 
+_atom_sites.fract_transf_matrix[3][1]   0.000000 
+_atom_sites.fract_transf_matrix[3][2]   0.000000 
+_atom_sites.fract_transf_matrix[3][3]   0.014418 
+_atom_sites.fract_transf_vector[1]      0.00000 
+_atom_sites.fract_transf_vector[2]      0.00000 
+_atom_sites.fract_transf_vector[3]      0.00000 
+# 
+loop_
+_atom_sites_footnote.id 
+_atom_sites_footnote.text 
+1 'HIS A   596  - THR A   597               OMEGA =   0.11 PEPTIDE BOND DEVIATES SIGNIFICANTLY FROM TRANS CONFORMATION' 
+2 'HIS B   596  - THR B   597               OMEGA =   0.29 PEPTIDE BOND DEVIATES SIGNIFICANTLY FROM TRANS CONFORMATION' 
+# 
+loop_
+_atom_type.symbol 
+N 
+C 
+O 
+S 
+# 
+loop_
+_atom_site.group_PDB 
+_atom_site.id 
+_atom_site.type_symbol 
+_atom_site.label_atom_id 
+_atom_site.label_alt_id 
+_atom_site.label_comp_id 
+_atom_site.label_asym_id 
+_atom_site.label_entity_id 
+_atom_site.label_seq_id 
+_atom_site.pdbx_PDB_ins_code 
+_atom_site.Cartn_x 
+_atom_site.Cartn_y 
+_atom_site.Cartn_z 
+_atom_site.occupancy 
+_atom_site.B_iso_or_equiv 
+_atom_site.Cartn_x_esd 
+_atom_site.Cartn_y_esd 
+_atom_site.Cartn_z_esd 
+_atom_site.occupancy_esd 
+_atom_site.B_iso_or_equiv_esd 
+_atom_site.pdbx_formal_charge 
+_atom_site.auth_seq_id 
+_atom_site.auth_comp_id 
+_atom_site.auth_asym_id 
+_atom_site.auth_atom_id 
+_atom_site.pdbx_PDB_model_num 
+ATOM   1    N N   . ASN A 1 26  ? 41.511  25.152  36.876  1.00 22.29 ? ? ? ? ? ? 516 ASN A N   1 
+ATOM   2    C CA  . ASN A 1 26  ? 40.907  25.555  35.563  1.00 21.77 ? ? ? ? ? ? 516 ASN A CA  1 
+ATOM   3    C C   . ASN A 1 26  ? 39.684  24.707  35.106  1.00 19.45 ? ? ? ? ? ? 516 ASN A C   1 
+ATOM   4    O O   . ASN A 1 26  ? 39.191  24.916  34.001  1.00 18.37 ? ? ? ? ? ? 516 ASN A O   1 
+ATOM   5    C CB  . ASN A 1 26  ? 41.970  25.570  34.422  1.00 25.18 ? ? ? ? ? ? 516 ASN A CB  1 
+ATOM   6    C CG  . ASN A 1 26  ? 43.166  26.528  34.694  1.00 28.53 ? ? ? ? ? ? 516 ASN A CG  1 
+ATOM   7    O OD1 . ASN A 1 26  ? 43.247  27.183  35.761  1.00 31.23 ? ? ? ? ? ? 516 ASN A OD1 1 
+ATOM   8    N ND2 . ASN A 1 26  ? 44.122  26.565  33.756  1.00 28.63 ? ? ? ? ? ? 516 ASN A ND2 1 
+ATOM   9    N N   . ALA A 1 27  ? 39.186  23.778  35.939  1.00 15.70 ? ? ? ? ? ? 517 ALA A N   1 
+ATOM   10   C CA  . ALA A 1 27  ? 38.027  22.952  35.538  1.00 14.27 ? ? ? ? ? ? 517 ALA A CA  1 
+ATOM   11   C C   . ALA A 1 27  ? 36.730  23.719  35.746  1.00 12.59 ? ? ? ? ? ? 517 ALA A C   1 
+ATOM   12   O O   . ALA A 1 27  ? 36.707  24.699  36.480  1.00 12.14 ? ? ? ? ? ? 517 ALA A O   1 
+ATOM   13   C CB  . ALA A 1 27  ? 37.986  21.654  36.326  1.00 14.12 ? ? ? ? ? ? 517 ALA A CB  1 
+ATOM   14   N N   . LEU A 1 28  ? 35.647  23.273  35.115  1.00 11.39 ? ? ? ? ? ? 518 LEU A N   1 
+ATOM   15   C CA  . LEU A 1 28  ? 34.366  23.944  35.280  1.00 11.22 ? ? ? ? ? ? 518 LEU A CA  1 
+ATOM   16   C C   . LEU A 1 28  ? 33.984  24.033  36.768  1.00 10.88 ? ? ? ? ? ? 518 LEU A C   1 
+ATOM   17   O O   . LEU A 1 28  ? 33.537  25.080  37.228  1.00 11.47 ? ? ? ? ? ? 518 LEU A O   1 
+ATOM   18   C CB  . LEU A 1 28  ? 33.276  23.197  34.525  1.00 11.98 ? ? ? ? ? ? 518 LEU A CB  1 
+ATOM   19   C CG  . LEU A 1 28  ? 33.253  23.288  33.007  1.00 12.97 ? ? ? ? ? ? 518 LEU A CG  1 
+ATOM   20   C CD1 . LEU A 1 28  ? 32.199  22.294  32.471  1.00 13.61 ? ? ? ? ? ? 518 LEU A CD1 1 
+ATOM   21   C CD2 . LEU A 1 28  ? 32.943  24.720  32.590  1.00 13.01 ? ? ? ? ? ? 518 LEU A CD2 1 
+ATOM   22   N N   . ARG A 1 29  ? 34.201  22.959  37.533  1.00 10.76 ? ? ? ? ? ? 519 ARG A N   1 
+ATOM   23   C CA  . ARG A 1 29  ? 33.856  22.980  38.959  1.00 11.30 ? ? ? ? ? ? 519 ARG A CA  1 
+ATOM   24   C C   . ARG A 1 29  ? 34.623  24.033  39.770  1.00 13.05 ? ? ? ? ? ? 519 ARG A C   1 
+ATOM   25   O O   . ARG A 1 29  ? 34.129  24.518  40.770  1.00 13.26 ? ? ? ? ? ? 519 ARG A O   1 
+ATOM   26   C CB  . ARG A 1 29  ? 34.047  21.612  39.610  1.00 11.25 ? ? ? ? ? ? 519 ARG A CB  1 
+ATOM   27   C CG  . ARG A 1 29  ? 35.464  21.144  39.631  1.00 12.52 ? ? ? ? ? ? 519 ARG A CG  1 
+ATOM   28   C CD  . ARG A 1 29  ? 35.624  19.805  40.289  1.00 15.25 ? ? ? ? ? ? 519 ARG A CD  1 
+ATOM   29   N NE  . ARG A 1 29  ? 35.222  19.856  41.678  1.00 17.64 ? ? ? ? ? ? 519 ARG A NE  1 
+ATOM   30   C CZ  . ARG A 1 29  ? 35.125  18.774  42.447  1.00 19.57 ? ? ? ? ? ? 519 ARG A CZ  1 
+ATOM   31   N NH1 . ARG A 1 29  ? 35.403  17.566  41.943  1.00 20.77 ? ? ? ? ? ? 519 ARG A NH1 1 
+ATOM   32   N NH2 . ARG A 1 29  ? 34.757  18.903  43.707  1.00 20.67 ? ? ? ? ? ? 519 ARG A NH2 1 
+ATOM   33   N N   . ASP A 1 30  ? 35.818  24.409  39.330  1.00 13.66 ? ? ? ? ? ? 520 ASP A N   1 
+ATOM   34   C CA  . ASP A 1 30  ? 36.605  25.420  40.057  1.00 15.27 ? ? ? ? ? ? 520 ASP A CA  1 
+ATOM   35   C C   . ASP A 1 30  ? 35.994  26.819  39.900  1.00 15.32 ? ? ? ? ? ? 520 ASP A C   1 
+ATOM   36   O O   . ASP A 1 30  ? 35.875  27.572  40.864  1.00 16.59 ? ? ? ? ? ? 520 ASP A O   1 
+ATOM   37   C CB  . ASP A 1 30  ? 38.056  25.409  39.563  1.00 16.63 ? ? ? ? ? ? 520 ASP A CB  1 
+ATOM   38   C CG  . ASP A 1 30  ? 38.717  24.070  39.771  1.00 18.58 ? ? ? ? ? ? 520 ASP A CG  1 
+ATOM   39   O OD1 . ASP A 1 30  ? 38.507  23.499  40.860  1.00 20.36 ? ? ? ? ? ? 520 ASP A OD1 1 
+ATOM   40   O OD2 . ASP A 1 30  ? 39.409  23.562  38.864  1.00 18.95 ? ? ? ? ? ? 520 ASP A OD2 1 
+ATOM   41   N N   . TYR A 1 31  ? 35.607  27.159  38.680  1.00 14.43 ? ? ? ? ? ? 521 TYR A N   1 
+ATOM   42   C CA  . TYR A 1 31  ? 34.999  28.446  38.424  1.00 15.53 ? ? ? ? ? ? 521 TYR A CA  1 
+ATOM   43   C C   . TYR A 1 31  ? 33.606  28.496  39.035  1.00 15.66 ? ? ? ? ? ? 521 TYR A C   1 
+ATOM   44   O O   . TYR A 1 31  ? 33.161  29.542  39.518  1.00 15.87 ? ? ? ? ? ? 521 TYR A O   1 
+ATOM   45   C CB  . TYR A 1 31  ? 34.936  28.692  36.930  1.00 17.67 ? ? ? ? ? ? 521 TYR A CB  1 
+ATOM   46   C CG  . TYR A 1 31  ? 36.303  28.908  36.363  1.00 21.57 ? ? ? ? ? ? 521 TYR A CG  1 
+ATOM   47   C CD1 . TYR A 1 31  ? 37.054  30.035  36.730  1.00 23.83 ? ? ? ? ? ? 521 TYR A CD1 1 
+ATOM   48   C CD2 . TYR A 1 31  ? 36.873  27.984  35.504  1.00 22.47 ? ? ? ? ? ? 521 TYR A CD2 1 
+ATOM   49   C CE1 . TYR A 1 31  ? 38.347  30.235  36.255  1.00 24.99 ? ? ? ? ? ? 521 TYR A CE1 1 
+ATOM   50   C CE2 . TYR A 1 31  ? 38.169  28.171  35.016  1.00 24.67 ? ? ? ? ? ? 521 TYR A CE2 1 
+ATOM   51   C CZ  . TYR A 1 31  ? 38.896  29.302  35.398  1.00 25.79 ? ? ? ? ? ? 521 TYR A CZ  1 
+ATOM   52   O OH  . TYR A 1 31  ? 40.165  29.509  34.903  1.00 27.89 ? ? ? ? ? ? 521 TYR A OH  1 
+ATOM   53   N N   . ALA A 1 32  ? 32.906  27.366  38.988  1.00 13.96 ? ? ? ? ? ? 522 ALA A N   1 
+ATOM   54   C CA  . ALA A 1 32  ? 31.570  27.312  39.556  1.00 14.62 ? ? ? ? ? ? 522 ALA A CA  1 
+ATOM   55   C C   . ALA A 1 32  ? 31.654  27.491  41.058  1.00 14.50 ? ? ? ? ? ? 522 ALA A C   1 
+ATOM   56   O O   . ALA A 1 32  ? 30.933  28.297  41.615  1.00 15.27 ? ? ? ? ? ? 522 ALA A O   1 
+ATOM   57   C CB  . ALA A 1 32  ? 30.907  25.982  39.213  1.00 14.67 ? ? ? ? ? ? 522 ALA A CB  1 
+ATOM   58   N N   . GLU A 1 33  ? 32.534  26.739  41.706  1.00 15.66 ? ? ? ? ? ? 523 GLU A N   1 
+ATOM   59   C CA  . GLU A 1 33  ? 32.718  26.826  43.155  1.00 20.86 ? ? ? ? ? ? 523 GLU A CA  1 
+ATOM   60   C C   . GLU A 1 33  ? 32.995  28.282  43.575  1.00 20.93 ? ? ? ? ? ? 523 GLU A C   1 
+ATOM   61   O O   . GLU A 1 33  ? 32.429  28.775  44.549  1.00 20.13 ? ? ? ? ? ? 523 GLU A O   1 
+ATOM   62   C CB  . GLU A 1 33  ? 33.873  25.912  43.621  1.00 24.74 ? ? ? ? ? ? 523 GLU A CB  1 
+ATOM   63   C CG  . GLU A 1 33  ? 33.507  24.407  43.599  1.00 32.08 ? ? ? ? ? ? 523 GLU A CG  1 
+ATOM   64   C CD  . GLU A 1 33  ? 34.707  23.414  43.527  1.00 35.74 ? ? ? ? ? ? 523 GLU A CD  1 
+ATOM   65   O OE1 . GLU A 1 33  ? 35.852  23.761  43.957  1.00 38.51 ? ? ? ? ? ? 523 GLU A OE1 1 
+ATOM   66   O OE2 . GLU A 1 33  ? 34.482  22.266  43.040  1.00 36.79 ? ? ? ? ? ? 523 GLU A OE2 1 
+ATOM   67   N N   . ALA A 1 34  ? 33.810  28.981  42.794  1.00 20.38 ? ? ? ? ? ? 524 ALA A N   1 
+ATOM   68   C CA  . ALA A 1 34  ? 34.166  30.364  43.086  1.00 20.61 ? ? ? ? ? ? 524 ALA A CA  1 
+ATOM   69   C C   . ALA A 1 34  ? 32.939  31.280  43.078  1.00 20.43 ? ? ? ? ? ? 524 ALA A C   1 
+ATOM   70   O O   . ALA A 1 34  ? 32.920  32.354  43.707  1.00 21.31 ? ? ? ? ? ? 524 ALA A O   1 
+ATOM   71   C CB  . ALA A 1 34  ? 35.213  30.848  42.069  1.00 21.00 ? ? ? ? ? ? 524 ALA A CB  1 
+ATOM   72   N N   . ARG A 1 35  ? 31.911  30.857  42.361  1.00 18.97 ? ? ? ? ? ? 525 ARG A N   1 
+ATOM   73   C CA  . ARG A 1 35  ? 30.701  31.641  42.259  1.00 18.39 ? ? ? ? ? ? 525 ARG A CA  1 
+ATOM   74   C C   . ARG A 1 35  ? 29.567  31.127  43.152  1.00 17.82 ? ? ? ? ? ? 525 ARG A C   1 
+ATOM   75   O O   . ARG A 1 35  ? 28.486  31.697  43.136  1.00 18.38 ? ? ? ? ? ? 525 ARG A O   1 
+ATOM   76   C CB  . ARG A 1 35  ? 30.249  31.690  40.800  1.00 19.29 ? ? ? ? ? ? 525 ARG A CB  1 
+ATOM   77   C CG  . ARG A 1 35  ? 31.317  32.203  39.823  1.00 21.17 ? ? ? ? ? ? 525 ARG A CG  1 
+ATOM   78   C CD  . ARG A 1 35  ? 31.730  33.670  40.097  1.00 22.80 ? ? ? ? ? ? 525 ARG A CD  1 
+ATOM   79   N NE  . ARG A 1 35  ? 30.630  34.606  39.879  1.00 25.15 ? ? ? ? ? ? 525 ARG A NE  1 
+ATOM   80   C CZ  . ARG A 1 35  ? 30.277  35.123  38.699  1.00 26.64 ? ? ? ? ? ? 525 ARG A CZ  1 
+ATOM   81   N NH1 . ARG A 1 35  ? 30.939  34.819  37.588  1.00 27.98 ? ? ? ? ? ? 525 ARG A NH1 1 
+ATOM   82   N NH2 . ARG A 1 35  ? 29.212  35.914  38.623  1.00 27.62 ? ? ? ? ? ? 525 ARG A NH2 1 
+ATOM   83   N N   . GLY A 1 36  ? 29.815  30.071  43.932  1.00 17.65 ? ? ? ? ? ? 526 GLY A N   1 
+ATOM   84   C CA  . GLY A 1 36  ? 28.786  29.496  44.809  1.00 17.76 ? ? ? ? ? ? 526 GLY A CA  1 
+ATOM   85   C C   . GLY A 1 36  ? 27.692  28.668  44.122  1.00 17.76 ? ? ? ? ? ? 526 GLY A C   1 
+ATOM   86   O O   . GLY A 1 36  ? 26.561  28.562  44.629  1.00 18.64 ? ? ? ? ? ? 526 GLY A O   1 
+ATOM   87   N N   . ILE A 1 37  ? 28.044  28.082  42.977  1.00 16.77 ? ? ? ? ? ? 527 ILE A N   1 
+ATOM   88   C CA  . ILE A 1 37  ? 27.163  27.268  42.111  1.00 16.84 ? ? ? ? ? ? 527 ILE A CA  1 
+ATOM   89   C C   . ILE A 1 37  ? 27.736  25.832  42.085  1.00 15.99 ? ? ? ? ? ? 527 ILE A C   1 
+ATOM   90   O O   . ILE A 1 37  ? 28.970  25.640  42.148  1.00 17.08 ? ? ? ? ? ? 527 ILE A O   1 
+ATOM   91   C CB  . ILE A 1 37  ? 27.235  27.828  40.595  1.00 17.70 ? ? ? ? ? ? 527 ILE A CB  1 
+ATOM   92   C CG1 . ILE A 1 37  ? 26.668  29.250  40.491  1.00 19.09 ? ? ? ? ? ? 527 ILE A CG1 1 
+ATOM   93   C CG2 . ILE A 1 37  ? 26.559  26.927  39.590  1.00 18.76 ? ? ? ? ? ? 527 ILE A CG2 1 
+ATOM   94   C CD1 . ILE A 1 37  ? 25.392  29.465  41.200  1.00 19.73 ? ? ? ? ? ? 527 ILE A CD1 1 
+ATOM   95   N N   . LYS A 1 38  ? 26.858  24.832  42.063  1.00 13.16 ? ? ? ? ? ? 528 LYS A N   1 
+ATOM   96   C CA  . LYS A 1 38  ? 27.275  23.429  41.914  1.00 12.08 ? ? ? ? ? ? 528 LYS A CA  1 
+ATOM   97   C C   . LYS A 1 38  ? 26.965  23.107  40.441  1.00 11.04 ? ? ? ? ? ? 528 LYS A C   1 
+ATOM   98   O O   . LYS A 1 38  ? 25.882  23.449  39.946  1.00 10.17 ? ? ? ? ? ? 528 LYS A O   1 
+ATOM   99   C CB  . LYS A 1 38  ? 26.446  22.489  42.803  1.00 14.13 ? ? ? ? ? ? 528 LYS A CB  1 
+ATOM   100  C CG  . LYS A 1 38  ? 26.720  22.606  44.314  1.00 16.62 ? ? ? ? ? ? 528 LYS A CG  1 
+ATOM   101  C CD  . LYS A 1 38  ? 28.184  22.310  44.610  1.00 18.95 ? ? ? ? ? ? 528 LYS A CD  1 
+ATOM   102  C CE  . LYS A 1 38  ? 28.533  22.576  46.083  1.00 20.80 ? ? ? ? ? ? 528 LYS A CE  1 
+ATOM   103  N NZ  . LYS A 1 38  ? 29.986  22.331  46.352  1.00 22.40 ? ? ? ? ? ? 528 LYS A NZ  1 
+ATOM   104  N N   . ILE A 1 39  ? 27.922  22.502  39.741  1.00 9.53  ? ? ? ? ? ? 529 ILE A N   1 
+ATOM   105  C CA  . ILE A 1 39  ? 27.746  22.147  38.339  1.00 8.79  ? ? ? ? ? ? 529 ILE A CA  1 
+ATOM   106  C C   . ILE A 1 39  ? 27.829  20.640  38.243  1.00 8.34  ? ? ? ? ? ? 529 ILE A C   1 
+ATOM   107  O O   . ILE A 1 39  ? 28.763  20.039  38.759  1.00 9.37  ? ? ? ? ? ? 529 ILE A O   1 
+ATOM   108  C CB  . ILE A 1 39  ? 28.764  22.903  37.420  1.00 8.92  ? ? ? ? ? ? 529 ILE A CB  1 
+ATOM   109  C CG1 . ILE A 1 39  ? 28.477  22.605  35.948  1.00 10.81 ? ? ? ? ? ? 529 ILE A CG1 1 
+ATOM   110  C CG2 . ILE A 1 39  ? 30.192  22.593  37.789  1.00 10.32 ? ? ? ? ? ? 529 ILE A CG2 1 
+ATOM   111  C CD1 . ILE A 1 39  ? 28.954  23.747  34.990  1.00 10.65 ? ? ? ? ? ? 529 ILE A CD1 1 
+ATOM   112  N N   . GLY A 1 40  ? 26.832  20.017  37.624  1.00 7.55  ? ? ? ? ? ? 530 GLY A N   1 
+ATOM   113  C CA  . GLY A 1 40  ? 26.842  18.575  37.593  1.00 7.77  ? ? ? ? ? ? 530 GLY A CA  1 
+ATOM   114  C C   . GLY A 1 40  ? 26.306  17.919  36.347  1.00 8.70  ? ? ? ? ? ? 530 GLY A C   1 
+ATOM   115  O O   . GLY A 1 40  ? 25.993  18.600  35.347  1.00 8.22  ? ? ? ? ? ? 530 GLY A O   1 
+ATOM   116  N N   . THR A 1 41  ? 26.199  16.591  36.408  1.00 7.71  ? ? ? ? ? ? 531 THR A N   1 
+ATOM   117  C CA  . THR A 1 41  ? 25.701  15.803  35.293  1.00 7.60  ? ? ? ? ? ? 531 THR A CA  1 
+ATOM   118  C C   . THR A 1 41  ? 25.117  14.481  35.807  1.00 8.27  ? ? ? ? ? ? 531 THR A C   1 
+ATOM   119  O O   . THR A 1 41  ? 25.453  14.039  36.921  1.00 7.43  ? ? ? ? ? ? 531 THR A O   1 
+ATOM   120  C CB  . THR A 1 41  ? 26.891  15.442  34.308  1.00 8.06  ? ? ? ? ? ? 531 THR A CB  1 
+ATOM   121  O OG1 . THR A 1 41  ? 26.428  14.629  33.211  1.00 8.12  ? ? ? ? ? ? 531 THR A OG1 1 
+ATOM   122  C CG2 . THR A 1 41  ? 28.020  14.705  35.058  1.00 8.56  ? ? ? ? ? ? 531 THR A CG2 1 
+ATOM   123  N N   . CYS A 1 42  ? 24.221  13.880  35.022  1.00 8.23  ? ? ? ? ? ? 532 CYS A N   1 
+ATOM   124  C CA  . CYS A 1 42  ? 23.762  12.537  35.353  1.00 8.73  ? ? ? ? ? ? 532 CYS A CA  1 
+ATOM   125  C C   . CYS A 1 42  ? 24.913  11.621  34.905  1.00 10.18 ? ? ? ? ? ? 532 CYS A C   1 
+ATOM   126  O O   . CYS A 1 42  ? 25.752  11.977  34.032  1.00 9.35  ? ? ? ? ? ? 532 CYS A O   1 
+ATOM   127  C CB  . CYS A 1 42  ? 22.480  12.149  34.632  1.00 10.51 ? ? ? ? ? ? 532 CYS A CB  1 
+ATOM   128  S SG  . CYS A 1 42  ? 22.666  11.919  32.869  1.00 13.95 ? ? ? ? ? ? 532 CYS A SG  1 
+ATOM   129  N N   . VAL A 1 43  ? 25.010  10.461  35.547  1.00 9.17  ? ? ? ? ? ? 533 VAL A N   1 
+ATOM   130  C CA  . VAL A 1 43  ? 26.080  9.512   35.258  1.00 9.39  ? ? ? ? ? ? 533 VAL A CA  1 
+ATOM   131  C C   . VAL A 1 43  ? 25.530  8.375   34.410  1.00 10.48 ? ? ? ? ? ? 533 VAL A C   1 
+ATOM   132  O O   . VAL A 1 43  ? 24.571  7.708   34.807  1.00 11.48 ? ? ? ? ? ? 533 VAL A O   1 
+ATOM   133  C CB  . VAL A 1 43  ? 26.668  9.022   36.593  1.00 10.22 ? ? ? ? ? ? 533 VAL A CB  1 
+ATOM   134  C CG1 . VAL A 1 43  ? 27.668  7.870   36.385  1.00 10.75 ? ? ? ? ? ? 533 VAL A CG1 1 
+ATOM   135  C CG2 . VAL A 1 43  ? 27.340  10.205  37.316  1.00 10.21 ? ? ? ? ? ? 533 VAL A CG2 1 
+ATOM   136  N N   . ASN A 1 44  ? 26.061  8.234   33.198  1.00 10.57 ? ? ? ? ? ? 534 ASN A N   1 
+ATOM   137  C CA  . ASN A 1 44  ? 25.600  7.214   32.239  1.00 11.85 ? ? ? ? ? ? 534 ASN A CA  1 
+ATOM   138  C C   . ASN A 1 44  ? 26.157  5.835   32.584  1.00 12.89 ? ? ? ? ? ? 534 ASN A C   1 
+ATOM   139  O O   . ASN A 1 44  ? 27.197  5.714   33.260  1.00 12.77 ? ? ? ? ? ? 534 ASN A O   1 
+ATOM   140  C CB  . ASN A 1 44  ? 25.942  7.627   30.776  1.00 11.73 ? ? ? ? ? ? 534 ASN A CB  1 
+ATOM   141  C CG  . ASN A 1 44  ? 25.416  9.039   30.425  1.00 11.50 ? ? ? ? ? ? 534 ASN A CG  1 
+ATOM   142  O OD1 . ASN A 1 44  ? 24.198  9.256   30.321  1.00 13.65 ? ? ? ? ? ? 534 ASN A OD1 1 
+ATOM   143  N ND2 . ASN A 1 44  ? 26.317  10.010  30.361  1.00 9.07  ? ? ? ? ? ? 534 ASN A ND2 1 
+ATOM   144  N N   . TYR A 1 45  ? 25.544  4.808   32.020  1.00 14.86 ? ? ? ? ? ? 535 TYR A N   1 
+ATOM   145  C CA  . TYR A 1 45  ? 25.946  3.450   32.338  1.00 17.34 ? ? ? ? ? ? 535 TYR A CA  1 
+ATOM   146  C C   . TYR A 1 45  ? 27.413  2.986   32.289  1.00 17.31 ? ? ? ? ? ? 535 TYR A C   1 
+ATOM   147  O O   . TYR A 1 45  ? 27.845  2.227   33.169  1.00 16.66 ? ? ? ? ? ? 535 TYR A O   1 
+ATOM   148  C CB  . TYR A 1 45  ? 25.039  2.424   31.658  1.00 22.46 ? ? ? ? ? ? 535 TYR A CB  1 
+ATOM   149  C CG  . TYR A 1 45  ? 25.159  1.083   32.366  1.00 27.41 ? ? ? ? ? ? 535 TYR A CG  1 
+ATOM   150  C CD1 . TYR A 1 45  ? 24.839  0.963   33.729  1.00 28.84 ? ? ? ? ? ? 535 TYR A CD1 1 
+ATOM   151  C CD2 . TYR A 1 45  ? 25.721  -0.023  31.721  1.00 30.41 ? ? ? ? ? ? 535 TYR A CD2 1 
+ATOM   152  C CE1 . TYR A 1 45  ? 25.092  -0.212  34.425  1.00 31.23 ? ? ? ? ? ? 535 TYR A CE1 1 
+ATOM   153  C CE2 . TYR A 1 45  ? 25.974  -1.220  32.416  1.00 32.19 ? ? ? ? ? ? 535 TYR A CE2 1 
+ATOM   154  C CZ  . TYR A 1 45  ? 25.654  -1.302  33.772  1.00 32.33 ? ? ? ? ? ? 535 TYR A CZ  1 
+ATOM   155  O OH  . TYR A 1 45  ? 25.872  -2.491  34.453  1.00 34.01 ? ? ? ? ? ? 535 TYR A OH  1 
+ATOM   156  N N   . PRO A 1 46  ? 28.210  3.450   31.307  1.00 16.94 ? ? ? ? ? ? 536 PRO A N   1 
+ATOM   157  C CA  . PRO A 1 46  ? 29.611  3.020   31.238  1.00 16.86 ? ? ? ? ? ? 536 PRO A CA  1 
+ATOM   158  C C   . PRO A 1 46  ? 30.393  3.246   32.508  1.00 16.28 ? ? ? ? ? ? 536 PRO A C   1 
+ATOM   159  O O   . PRO A 1 46  ? 31.401  2.592   32.724  1.00 16.65 ? ? ? ? ? ? 536 PRO A O   1 
+ATOM   160  C CB  . PRO A 1 46  ? 30.171  3.865   30.092  1.00 18.10 ? ? ? ? ? ? 536 PRO A CB  1 
+ATOM   161  C CG  . PRO A 1 46  ? 28.981  3.989   29.178  1.00 18.10 ? ? ? ? ? ? 536 PRO A CG  1 
+ATOM   162  C CD  . PRO A 1 46  ? 27.894  4.346   30.178  1.00 17.57 ? ? ? ? ? ? 536 PRO A CD  1 
+ATOM   163  N N   . PHE A 1 47  ? 29.973  4.202   33.330  1.00 15.77 ? ? ? ? ? ? 537 PHE A N   1 
+ATOM   164  C CA  . PHE A 1 47  ? 30.667  4.473   34.593  1.00 15.60 ? ? ? ? ? ? 537 PHE A CA  1 
+ATOM   165  C C   . PHE A 1 47  ? 30.785  3.211   35.456  1.00 17.03 ? ? ? ? ? ? 537 PHE A C   1 
+ATOM   166  O O   . PHE A 1 47  ? 31.860  2.888   35.955  1.00 17.37 ? ? ? ? ? ? 537 PHE A O   1 
+ATOM   167  C CB  . PHE A 1 47  ? 29.919  5.546   35.402  1.00 14.84 ? ? ? ? ? ? 537 PHE A CB  1 
+ATOM   168  C CG  . PHE A 1 47  ? 30.336  5.630   36.854  1.00 15.54 ? ? ? ? ? ? 537 PHE A CG  1 
+ATOM   169  C CD1 . PHE A 1 47  ? 31.464  6.345   37.235  1.00 15.77 ? ? ? ? ? ? 537 PHE A CD1 1 
+ATOM   170  C CD2 . PHE A 1 47  ? 29.592  4.979   37.851  1.00 16.19 ? ? ? ? ? ? 537 PHE A CD2 1 
+ATOM   171  C CE1 . PHE A 1 47  ? 31.849  6.415   38.594  1.00 16.61 ? ? ? ? ? ? 537 PHE A CE1 1 
+ATOM   172  C CE2 . PHE A 1 47  ? 29.971  5.038   39.219  1.00 16.26 ? ? ? ? ? ? 537 PHE A CE2 1 
+ATOM   173  C CZ  . PHE A 1 47  ? 31.092  5.754   39.588  1.00 16.41 ? ? ? ? ? ? 537 PHE A CZ  1 
+ATOM   174  N N   . TYR A 1 48  ? 29.680  2.496   35.587  1.00 17.95 ? ? ? ? ? ? 538 TYR A N   1 
+ATOM   175  C CA  . TYR A 1 48  ? 29.633  1.314   36.426  1.00 21.33 ? ? ? ? ? ? 538 TYR A CA  1 
+ATOM   176  C C   . TYR A 1 48  ? 30.512  0.138   36.019  1.00 25.76 ? ? ? ? ? ? 538 TYR A C   1 
+ATOM   177  O O   . TYR A 1 48  ? 31.203  -0.436  36.869  1.00 28.22 ? ? ? ? ? ? 538 TYR A O   1 
+ATOM   178  C CB  . TYR A 1 48  ? 28.191  0.879   36.606  1.00 17.95 ? ? ? ? ? ? 538 TYR A CB  1 
+ATOM   179  C CG  . TYR A 1 48  ? 27.377  1.952   37.275  1.00 16.62 ? ? ? ? ? ? 538 TYR A CG  1 
+ATOM   180  C CD1 . TYR A 1 48  ? 27.425  2.128   38.667  1.00 15.56 ? ? ? ? ? ? 538 TYR A CD1 1 
+ATOM   181  C CD2 . TYR A 1 48  ? 26.607  2.830   36.521  1.00 16.28 ? ? ? ? ? ? 538 TYR A CD2 1 
+ATOM   182  C CE1 . TYR A 1 48  ? 26.734  3.152   39.283  1.00 15.35 ? ? ? ? ? ? 538 TYR A CE1 1 
+ATOM   183  C CE2 . TYR A 1 48  ? 25.913  3.858   37.124  1.00 15.96 ? ? ? ? ? ? 538 TYR A CE2 1 
+ATOM   184  C CZ  . TYR A 1 48  ? 25.979  4.015   38.513  1.00 15.58 ? ? ? ? ? ? 538 TYR A CZ  1 
+ATOM   185  O OH  . TYR A 1 48  ? 25.276  5.041   39.101  1.00 16.96 ? ? ? ? ? ? 538 TYR A OH  1 
+ATOM   186  N N   . ASN A 1 49  ? 30.517  -0.218  34.741  1.00 29.62 ? ? ? ? ? ? 539 ASN A N   1 
+ATOM   187  C CA  . ASN A 1 49  ? 31.343  -1.340  34.323  1.00 33.13 ? ? ? ? ? ? 539 ASN A CA  1 
+ATOM   188  C C   . ASN A 1 49  ? 32.742  -0.968  33.816  1.00 34.74 ? ? ? ? ? ? 539 ASN A C   1 
+ATOM   189  O O   . ASN A 1 49  ? 33.485  -1.836  33.344  1.00 35.85 ? ? ? ? ? ? 539 ASN A O   1 
+ATOM   190  C CB  . ASN A 1 49  ? 30.602  -2.215  33.319  1.00 34.61 ? ? ? ? ? ? 539 ASN A CB  1 
+ATOM   191  C CG  . ASN A 1 49  ? 30.452  -1.566  31.967  1.00 35.75 ? ? ? ? ? ? 539 ASN A CG  1 
+ATOM   192  O OD1 . ASN A 1 49  ? 31.045  -0.521  31.694  1.00 36.15 ? ? ? ? ? ? 539 ASN A OD1 1 
+ATOM   193  N ND2 . ASN A 1 49  ? 29.657  -2.190  31.099  1.00 36.19 ? ? ? ? ? ? 539 ASN A ND2 1 
+ATOM   194  N N   . ASN A 1 50  ? 33.102  0.312   33.916  1.00 35.84 ? ? ? ? ? ? 540 ASN A N   1 
+ATOM   195  C CA  . ASN A 1 50  ? 34.428  0.798   33.502  1.00 37.55 ? ? ? ? ? ? 540 ASN A CA  1 
+ATOM   196  C C   . ASN A 1 50  ? 34.806  0.597   32.037  1.00 36.41 ? ? ? ? ? ? 540 ASN A C   1 
+ATOM   197  O O   . ASN A 1 50  ? 35.994  0.528   31.695  1.00 36.29 ? ? ? ? ? ? 540 ASN A O   1 
+ATOM   198  C CB  . ASN A 1 50  ? 35.511  0.171   34.374  1.00 40.91 ? ? ? ? ? ? 540 ASN A CB  1 
+ATOM   199  C CG  . ASN A 1 50  ? 35.365  0.552   35.825  1.00 44.11 ? ? ? ? ? ? 540 ASN A CG  1 
+ATOM   200  O OD1 . ASN A 1 50  ? 35.737  1.671   36.230  1.00 45.52 ? ? ? ? ? ? 540 ASN A OD1 1 
+ATOM   201  N ND2 . ASN A 1 50  ? 34.790  -0.362  36.629  1.00 45.76 ? ? ? ? ? ? 540 ASN A ND2 1 
+ATOM   202  N N   . SER A 1 51  ? 33.802  0.550   31.171  1.00 34.36 ? ? ? ? ? ? 541 SER A N   1 
+ATOM   203  C CA  . SER A 1 51  ? 34.030  0.351   29.754  1.00 31.80 ? ? ? ? ? ? 541 SER A CA  1 
+ATOM   204  C C   . SER A 1 51  ? 34.543  1.595   29.027  1.00 29.83 ? ? ? ? ? ? 541 SER A C   1 
+ATOM   205  O O   . SER A 1 51  ? 34.963  1.496   27.870  1.00 30.50 ? ? ? ? ? ? 541 SER A O   1 
+ATOM   206  C CB  . SER A 1 51  ? 32.739  -0.130  29.077  1.00 33.07 ? ? ? ? ? ? 541 SER A CB  1 
+ATOM   207  O OG  . SER A 1 51  ? 31.694  0.833   29.179  1.00 34.29 ? ? ? ? ? ? 541 SER A OG  1 
+ATOM   208  N N   . ASP A 1 52  ? 34.488  2.762   29.668  1.00 26.01 ? ? ? ? ? ? 542 ASP A N   1 
+ATOM   209  C CA  . ASP A 1 52  ? 34.931  3.991   29.015  1.00 23.12 ? ? ? ? ? ? 542 ASP A CA  1 
+ATOM   210  C C   . ASP A 1 52  ? 35.764  4.833   29.994  1.00 22.05 ? ? ? ? ? ? 542 ASP A C   1 
+ATOM   211  O O   . ASP A 1 52  ? 35.234  5.671   30.724  1.00 20.76 ? ? ? ? ? ? 542 ASP A O   1 
+ATOM   212  C CB  . ASP A 1 52  ? 33.693  4.752   28.470  1.00 21.88 ? ? ? ? ? ? 542 ASP A CB  1 
+ATOM   213  C CG  . ASP A 1 52  ? 34.040  5.793   27.416  1.00 20.64 ? ? ? ? ? ? 542 ASP A CG  1 
+ATOM   214  O OD1 . ASP A 1 52  ? 35.203  6.238   27.350  1.00 21.37 ? ? ? ? ? ? 542 ASP A OD1 1 
+ATOM   215  O OD2 . ASP A 1 52  ? 33.132  6.203   26.659  1.00 19.67 ? ? ? ? ? ? 542 ASP A OD2 1 
+ATOM   216  N N   . PRO A 1 53  ? 37.096  4.580   30.043  1.00 22.07 ? ? ? ? ? ? 543 PRO A N   1 
+ATOM   217  C CA  . PRO A 1 53  ? 38.045  5.286   30.922  1.00 20.53 ? ? ? ? ? ? 543 PRO A CA  1 
+ATOM   218  C C   . PRO A 1 53  ? 38.063  6.795   30.726  1.00 19.04 ? ? ? ? ? ? 543 PRO A C   1 
+ATOM   219  O O   . PRO A 1 53  ? 38.220  7.541   31.696  1.00 18.90 ? ? ? ? ? ? 543 PRO A O   1 
+ATOM   220  C CB  . PRO A 1 53  ? 39.403  4.677   30.541  1.00 21.59 ? ? ? ? ? ? 543 PRO A CB  1 
+ATOM   221  C CG  . PRO A 1 53  ? 39.064  3.311   30.059  1.00 22.37 ? ? ? ? ? ? 543 PRO A CG  1 
+ATOM   222  C CD  . PRO A 1 53  ? 37.797  3.543   29.253  1.00 22.48 ? ? ? ? ? ? 543 PRO A CD  1 
+ATOM   223  N N   . THR A 1 54  ? 37.932  7.244   29.475  1.00 16.88 ? ? ? ? ? ? 544 THR A N   1 
+ATOM   224  C CA  . THR A 1 54  ? 37.937  8.680   29.187  1.00 16.62 ? ? ? ? ? ? 544 THR A CA  1 
+ATOM   225  C C   . THR A 1 54  ? 36.699  9.327   29.839  1.00 14.37 ? ? ? ? ? ? 544 THR A C   1 
+ATOM   226  O O   . THR A 1 54  ? 36.789  10.421  30.394  1.00 13.61 ? ? ? ? ? ? 544 THR A O   1 
+ATOM   227  C CB  . THR A 1 54  ? 37.933  8.970   27.657  1.00 16.62 ? ? ? ? ? ? 544 THR A CB  1 
+ATOM   228  O OG1 . THR A 1 54  ? 39.048  8.320   27.045  1.00 18.82 ? ? ? ? ? ? 544 THR A OG1 1 
+ATOM   229  C CG2 . THR A 1 54  ? 38.037  10.438  27.393  1.00 16.77 ? ? ? ? ? ? 544 THR A CG2 1 
+ATOM   230  N N   . TYR A 1 55  ? 35.560  8.631   29.778  1.00 13.73 ? ? ? ? ? ? 545 TYR A N   1 
+ATOM   231  C CA  . TYR A 1 55  ? 34.316  9.135   30.392  1.00 12.39 ? ? ? ? ? ? 545 TYR A CA  1 
+ATOM   232  C C   . TYR A 1 55  ? 34.578  9.414   31.874  1.00 12.05 ? ? ? ? ? ? 545 TYR A C   1 
+ATOM   233  O O   . TYR A 1 55  ? 34.347  10.531  32.366  1.00 11.61 ? ? ? ? ? ? 545 TYR A O   1 
+ATOM   234  C CB  . TYR A 1 55  ? 33.191  8.097   30.257  1.00 11.92 ? ? ? ? ? ? 545 TYR A CB  1 
+ATOM   235  C CG  . TYR A 1 55  ? 31.861  8.538   30.805  1.00 11.56 ? ? ? ? ? ? 545 TYR A CG  1 
+ATOM   236  C CD1 . TYR A 1 55  ? 31.536  8.341   32.146  1.00 12.07 ? ? ? ? ? ? 545 TYR A CD1 1 
+ATOM   237  C CD2 . TYR A 1 55  ? 30.932  9.177   29.997  1.00 11.46 ? ? ? ? ? ? 545 TYR A CD2 1 
+ATOM   238  C CE1 . TYR A 1 55  ? 30.333  8.771   32.649  1.00 11.58 ? ? ? ? ? ? 545 TYR A CE1 1 
+ATOM   239  C CE2 . TYR A 1 55  ? 29.733  9.607   30.494  1.00 10.57 ? ? ? ? ? ? 545 TYR A CE2 1 
+ATOM   240  C CZ  . TYR A 1 55  ? 29.441  9.402   31.828  1.00 10.93 ? ? ? ? ? ? 545 TYR A CZ  1 
+ATOM   241  O OH  . TYR A 1 55  ? 28.249  9.887   32.338  1.00 11.97 ? ? ? ? ? ? 545 TYR A OH  1 
+ATOM   242  N N   . ASN A 1 56  ? 35.089  8.397   32.571  1.00 13.21 ? ? ? ? ? ? 546 ASN A N   1 
+ATOM   243  C CA  . ASN A 1 56  ? 35.370  8.505   34.004  1.00 14.05 ? ? ? ? ? ? 546 ASN A CA  1 
+ATOM   244  C C   . ASN A 1 56  ? 36.404  9.572   34.355  1.00 13.17 ? ? ? ? ? ? 546 ASN A C   1 
+ATOM   245  O O   . ASN A 1 56  ? 36.268  10.254  35.376  1.00 12.33 ? ? ? ? ? ? 546 ASN A O   1 
+ATOM   246  C CB  . ASN A 1 56  ? 35.799  7.146   34.568  1.00 15.55 ? ? ? ? ? ? 546 ASN A CB  1 
+ATOM   247  C CG  . ASN A 1 56  ? 34.674  6.126   34.556  1.00 17.40 ? ? ? ? ? ? 546 ASN A CG  1 
+ATOM   248  O OD1 . ASN A 1 56  ? 33.706  6.261   33.818  1.00 19.28 ? ? ? ? ? ? 546 ASN A OD1 1 
+ATOM   249  N ND2 . ASN A 1 56  ? 34.798  5.097   35.381  1.00 19.39 ? ? ? ? ? ? 546 ASN A ND2 1 
+ATOM   250  N N   . SER A 1 57  ? 37.412  9.757   33.507  1.00 13.12 ? ? ? ? ? ? 547 SER A N   1 
+ATOM   251  C CA  . SER A 1 57  ? 38.427  10.757  33.806  1.00 14.48 ? ? ? ? ? ? 547 SER A CA  1 
+ATOM   252  C C   . SER A 1 57  ? 37.903  12.207  33.694  1.00 13.07 ? ? ? ? ? ? 547 SER A C   1 
+ATOM   253  O O   . SER A 1 57  ? 38.269  13.073  34.488  1.00 14.04 ? ? ? ? ? ? 547 SER A O   1 
+ATOM   254  C CB  . SER A 1 57  ? 39.680  10.528  32.979  1.00 16.98 ? ? ? ? ? ? 547 SER A CB  1 
+ATOM   255  O OG  . SER A 1 57  ? 39.406  10.728  31.622  1.00 23.00 ? ? ? ? ? ? 547 SER A OG  1 
+ATOM   256  N N   . ILE A 1 58  ? 37.018  12.464  32.732  1.00 12.03 ? ? ? ? ? ? 548 ILE A N   1 
+ATOM   257  C CA  . ILE A 1 58  ? 36.437  13.801  32.611  1.00 11.90 ? ? ? ? ? ? 548 ILE A CA  1 
+ATOM   258  C C   . ILE A 1 58  ? 35.424  14.000  33.755  1.00 10.12 ? ? ? ? ? ? 548 ILE A C   1 
+ATOM   259  O O   . ILE A 1 58  ? 35.368  15.070  34.354  1.00 9.55  ? ? ? ? ? ? 548 ILE A O   1 
+ATOM   260  C CB  . ILE A 1 58  ? 35.740  14.013  31.228  1.00 13.31 ? ? ? ? ? ? 548 ILE A CB  1 
+ATOM   261  C CG1 . ILE A 1 58  ? 36.811  14.026  30.132  1.00 14.52 ? ? ? ? ? ? 548 ILE A CG1 1 
+ATOM   262  C CG2 . ILE A 1 58  ? 34.891  15.310  31.215  1.00 12.01 ? ? ? ? ? ? 548 ILE A CG2 1 
+ATOM   263  C CD1 . ILE A 1 58  ? 36.241  13.934  28.751  1.00 17.19 ? ? ? ? ? ? 548 ILE A CD1 1 
+ATOM   264  N N   . LEU A 1 59  ? 34.614  12.973  34.025  1.00 10.09 ? ? ? ? ? ? 549 LEU A N   1 
+ATOM   265  C CA  . LEU A 1 59  ? 33.611  13.030  35.100  1.00 10.02 ? ? ? ? ? ? 549 LEU A CA  1 
+ATOM   266  C C   . LEU A 1 59  ? 34.207  13.450  36.454  1.00 10.24 ? ? ? ? ? ? 549 LEU A C   1 
+ATOM   267  O O   . LEU A 1 59  ? 33.718  14.398  37.071  1.00 10.79 ? ? ? ? ? ? 549 LEU A O   1 
+ATOM   268  C CB  . LEU A 1 59  ? 32.871  11.684  35.239  1.00 10.01 ? ? ? ? ? ? 549 LEU A CB  1 
+ATOM   269  C CG  . LEU A 1 59  ? 31.792  11.590  36.336  1.00 10.66 ? ? ? ? ? ? 549 LEU A CG  1 
+ATOM   270  C CD1 . LEU A 1 59  ? 30.634  12.512  36.049  1.00 11.62 ? ? ? ? ? ? 549 LEU A CD1 1 
+ATOM   271  C CD2 . LEU A 1 59  ? 31.319  10.172  36.478  1.00 11.31 ? ? ? ? ? ? 549 LEU A CD2 1 
+ATOM   272  N N   . GLN A 1 60  ? 35.270  12.773  36.892  1.00 10.53 ? ? ? ? ? ? 550 GLN A N   1 
+ATOM   273  C CA  . GLN A 1 60  ? 35.891  13.086  38.199  1.00 12.97 ? ? ? ? ? ? 550 GLN A CA  1 
+ATOM   274  C C   . GLN A 1 60  ? 36.646  14.442  38.266  1.00 12.79 ? ? ? ? ? ? 550 GLN A C   1 
+ATOM   275  O O   . GLN A 1 60  ? 36.896  14.981  39.351  1.00 14.16 ? ? ? ? ? ? 550 GLN A O   1 
+ATOM   276  C CB  . GLN A 1 60  ? 36.828  11.933  38.655  1.00 13.64 ? ? ? ? ? ? 550 GLN A CB  1 
+ATOM   277  C CG  . GLN A 1 60  ? 38.002  11.671  37.690  1.00 14.91 ? ? ? ? ? ? 550 GLN A CG  1 
+ATOM   278  C CD  . GLN A 1 60  ? 38.912  10.491  38.067  1.00 15.57 ? ? ? ? ? ? 550 GLN A CD  1 
+ATOM   279  O OE1 . GLN A 1 60  ? 40.030  10.389  37.562  1.00 16.54 ? ? ? ? ? ? 550 GLN A OE1 1 
+ATOM   280  N NE2 . GLN A 1 60  ? 38.413  9.576   38.871  1.00 13.98 ? ? ? ? ? ? 550 GLN A NE2 1 
+ATOM   281  N N   . ARG A 1 61  ? 36.967  14.994  37.097  1.00 12.31 ? ? ? ? ? ? 551 ARG A N   1 
+ATOM   282  C CA  . ARG A 1 61  ? 37.710  16.247  36.999  1.00 12.09 ? ? ? ? ? ? 551 ARG A CA  1 
+ATOM   283  C C   . ARG A 1 61  ? 36.885  17.548  36.907  1.00 10.73 ? ? ? ? ? ? 551 ARG A C   1 
+ATOM   284  O O   . ARG A 1 61  ? 37.173  18.522  37.583  1.00 11.07 ? ? ? ? ? ? 551 ARG A O   1 
+ATOM   285  C CB  . ARG A 1 61  ? 38.628  16.157  35.768  1.00 13.98 ? ? ? ? ? ? 551 ARG A CB  1 
+ATOM   286  C CG  . ARG A 1 61  ? 39.639  17.262  35.656  1.00 17.53 ? ? ? ? ? ? 551 ARG A CG  1 
+ATOM   287  C CD  . ARG A 1 61  ? 40.464  17.120  34.362  1.00 19.06 ? ? ? ? ? ? 551 ARG A CD  1 
+ATOM   288  N NE  . ARG A 1 61  ? 39.697  17.540  33.184  1.00 20.88 ? ? ? ? ? ? 551 ARG A NE  1 
+ATOM   289  C CZ  . ARG A 1 61  ? 39.705  16.902  32.017  1.00 21.80 ? ? ? ? ? ? 551 ARG A CZ  1 
+ATOM   290  N NH1 . ARG A 1 61  ? 40.437  15.805  31.864  1.00 21.59 ? ? ? ? ? ? 551 ARG A NH1 1 
+ATOM   291  N NH2 . ARG A 1 61  ? 38.974  17.359  31.002  1.00 22.47 ? ? ? ? ? ? 551 ARG A NH2 1 
+ATOM   292  N N   . GLU A 1 62  ? 35.838  17.539  36.090  1.00 9.49  ? ? ? ? ? ? 552 GLU A N   1 
+ATOM   293  C CA  . GLU A 1 62  ? 35.075  18.748  35.807  1.00 9.31  ? ? ? ? ? ? 552 GLU A CA  1 
+ATOM   294  C C   . GLU A 1 62  ? 33.845  19.080  36.637  1.00 8.60  ? ? ? ? ? ? 552 GLU A C   1 
+ATOM   295  O O   . GLU A 1 62  ? 33.454  20.230  36.697  1.00 9.32  ? ? ? ? ? ? 552 GLU A O   1 
+ATOM   296  C CB  . GLU A 1 62  ? 34.624  18.710  34.326  1.00 9.93  ? ? ? ? ? ? 552 GLU A CB  1 
+ATOM   297  C CG  . GLU A 1 62  ? 35.727  18.576  33.262  1.00 11.83 ? ? ? ? ? ? 552 GLU A CG  1 
+ATOM   298  C CD  . GLU A 1 62  ? 36.499  19.865  33.040  1.00 12.44 ? ? ? ? ? ? 552 GLU A CD  1 
+ATOM   299  O OE1 . GLU A 1 62  ? 36.002  20.950  33.359  1.00 12.96 ? ? ? ? ? ? 552 GLU A OE1 1 
+ATOM   300  O OE2 . GLU A 1 62  ? 37.630  19.793  32.551  1.00 16.81 ? ? ? ? ? ? 552 GLU A OE2 1 
+ATOM   301  N N   . PHE A 1 63  ? 33.242  18.088  37.283  1.00 8.90  ? ? ? ? ? ? 553 PHE A N   1 
+ATOM   302  C CA  . PHE A 1 63  ? 31.979  18.320  37.974  1.00 8.57  ? ? ? ? ? ? 553 PHE A CA  1 
+ATOM   303  C C   . PHE A 1 63  ? 32.023  18.289  39.476  1.00 8.77  ? ? ? ? ? ? 553 PHE A C   1 
+ATOM   304  O O   . PHE A 1 63  ? 32.858  17.590  40.060  1.00 10.39 ? ? ? ? ? ? 553 PHE A O   1 
+ATOM   305  C CB  . PHE A 1 63  ? 30.937  17.325  37.448  1.00 9.45  ? ? ? ? ? ? 553 PHE A CB  1 
+ATOM   306  C CG  . PHE A 1 63  ? 30.752  17.397  35.954  1.00 10.03 ? ? ? ? ? ? 553 PHE A CG  1 
+ATOM   307  C CD1 . PHE A 1 63  ? 30.083  18.485  35.380  1.00 11.05 ? ? ? ? ? ? 553 PHE A CD1 1 
+ATOM   308  C CD2 . PHE A 1 63  ? 31.328  16.441  35.109  1.00 10.75 ? ? ? ? ? ? 553 PHE A CD2 1 
+ATOM   309  C CE1 . PHE A 1 63  ? 30.002  18.619  33.953  1.00 12.27 ? ? ? ? ? ? 553 PHE A CE1 1 
+ATOM   310  C CE2 . PHE A 1 63  ? 31.250  16.570  33.697  1.00 10.90 ? ? ? ? ? ? 553 PHE A CE2 1 
+ATOM   311  C CZ  . PHE A 1 63  ? 30.590  17.655  33.137  1.00 10.88 ? ? ? ? ? ? 553 PHE A CZ  1 
+ATOM   312  N N   . SER A 1 64  ? 31.130  19.050  40.105  1.00 8.54  ? ? ? ? ? ? 554 SER A N   1 
+ATOM   313  C CA  . SER A 1 64  ? 31.039  19.070  41.570  1.00 9.08  ? ? ? ? ? ? 554 SER A CA  1 
+ATOM   314  C C   . SER A 1 64  ? 29.733  18.417  42.085  1.00 8.65  ? ? ? ? ? ? 554 SER A C   1 
+ATOM   315  O O   . SER A 1 64  ? 29.484  18.395  43.285  1.00 9.71  ? ? ? ? ? ? 554 SER A O   1 
+ATOM   316  C CB  . SER A 1 64  ? 31.189  20.489  42.106  1.00 9.55  ? ? ? ? ? ? 554 SER A CB  1 
+ATOM   317  O OG  . SER A 1 64  ? 30.243  21.362  41.524  1.00 10.33 ? ? ? ? ? ? 554 SER A OG  1 
+ATOM   318  N N   . MET A 1 65  ? 28.932  17.853  41.181  1.00 8.52  ? ? ? ? ? ? 555 MET A N   1 
+ATOM   319  C CA  . MET A 1 65  ? 27.663  17.207  41.528  1.00 8.20  ? ? ? ? ? ? 555 MET A CA  1 
+ATOM   320  C C   . MET A 1 65  ? 27.328  16.086  40.506  1.00 9.98  ? ? ? ? ? ? 555 MET A C   1 
+ATOM   321  O O   . MET A 1 65  ? 27.616  16.202  39.303  1.00 9.39  ? ? ? ? ? ? 555 MET A O   1 
+ATOM   322  C CB  . MET A 1 65  ? 26.541  18.271  41.580  1.00 8.93  ? ? ? ? ? ? 555 MET A CB  1 
+ATOM   323  C CG  . MET A 1 65  ? 25.157  17.749  41.903  1.00 10.17 ? ? ? ? ? ? 555 MET A CG  1 
+ATOM   324  S SD  . MET A 1 65  ? 23.988  19.061  42.174  1.00 12.03 ? ? ? ? ? ? 555 MET A SD  1 
+ATOM   325  C CE  . MET A 1 65  ? 24.160  19.365  43.943  1.00 11.88 ? ? ? ? ? ? 555 MET A CE  1 
+ATOM   326  N N   . VAL A 1 66  ? 26.771  14.975  41.002  1.00 8.37  ? ? ? ? ? ? 556 VAL A N   1 
+ATOM   327  C CA  . VAL A 1 66  ? 26.363  13.847  40.160  1.00 8.94  ? ? ? ? ? ? 556 VAL A CA  1 
+ATOM   328  C C   . VAL A 1 66  ? 24.917  13.399  40.532  1.00 9.51  ? ? ? ? ? ? 556 VAL A C   1 
+ATOM   329  O O   . VAL A 1 66  ? 24.407  13.709  41.636  1.00 8.72  ? ? ? ? ? ? 556 VAL A O   1 
+ATOM   330  C CB  . VAL A 1 66  ? 27.335  12.615  40.253  1.00 9.90  ? ? ? ? ? ? 556 VAL A CB  1 
+ATOM   331  C CG1 . VAL A 1 66  ? 28.651  12.901  39.530  1.00 11.18 ? ? ? ? ? ? 556 VAL A CG1 1 
+ATOM   332  C CG2 . VAL A 1 66  ? 27.584  12.188  41.741  1.00 9.70  ? ? ? ? ? ? 556 VAL A CG2 1 
+ATOM   333  N N   . VAL A 1 67  ? 24.247  12.754  39.576  1.00 8.11  ? ? ? ? ? ? 557 VAL A N   1 
+ATOM   334  C CA  . VAL A 1 67  ? 22.883  12.262  39.750  1.00 9.04  ? ? ? ? ? ? 557 VAL A CA  1 
+ATOM   335  C C   . VAL A 1 67  ? 22.835  10.937  38.996  1.00 8.99  ? ? ? ? ? ? 557 VAL A C   1 
+ATOM   336  O O   . VAL A 1 67  ? 23.484  10.787  37.965  1.00 9.56  ? ? ? ? ? ? 557 VAL A O   1 
+ATOM   337  C CB  . VAL A 1 67  ? 21.822  13.227  39.094  1.00 10.16 ? ? ? ? ? ? 557 VAL A CB  1 
+ATOM   338  C CG1 . VAL A 1 67  ? 20.390  12.873  39.539  1.00 10.54 ? ? ? ? ? ? 557 VAL A CG1 1 
+ATOM   339  C CG2 . VAL A 1 67  ? 22.111  14.637  39.425  1.00 13.14 ? ? ? ? ? ? 557 VAL A CG2 1 
+ATOM   340  N N   . CYS A 1 68  ? 22.082  9.968   39.514  1.00 9.81  ? ? ? ? ? ? 558 CYS A N   1 
+ATOM   341  C CA  . CYS A 1 68  ? 21.909  8.666   38.868  1.00 12.43 ? ? ? ? ? ? 558 CYS A CA  1 
+ATOM   342  C C   . CYS A 1 68  ? 20.946  8.793   37.693  1.00 12.01 ? ? ? ? ? ? 558 CYS A C   1 
+ATOM   343  O O   . CYS A 1 68  ? 19.841  9.283   37.855  1.00 12.77 ? ? ? ? ? ? 558 CYS A O   1 
+ATOM   344  C CB  . CYS A 1 68  ? 21.281  7.668   39.856  1.00 13.77 ? ? ? ? ? ? 558 CYS A CB  1 
+ATOM   345  S SG  . CYS A 1 68  ? 22.436  6.991   41.064  1.00 18.71 ? ? ? ? ? ? 558 CYS A SG  1 
+ATOM   346  N N   . GLU A 1 69  ? 21.329  8.326   36.517  1.00 12.71 ? ? ? ? ? ? 559 GLU A N   1 
+ATOM   347  C CA  . GLU A 1 69  ? 20.405  8.462   35.395  1.00 13.52 ? ? ? ? ? ? 559 GLU A CA  1 
+ATOM   348  C C   . GLU A 1 69  ? 19.197  7.547   35.561  1.00 13.28 ? ? ? ? ? ? 559 GLU A C   1 
+ATOM   349  O O   . GLU A 1 69  ? 18.062  7.989   35.407  1.00 13.92 ? ? ? ? ? ? 559 GLU A O   1 
+ATOM   350  C CB  . GLU A 1 69  ? 21.107  8.152   34.069  1.00 14.74 ? ? ? ? ? ? 559 GLU A CB  1 
+ATOM   351  C CG  . GLU A 1 69  ? 20.216  8.400   32.865  1.00 16.84 ? ? ? ? ? ? 559 GLU A CG  1 
+ATOM   352  C CD  . GLU A 1 69  ? 20.884  8.073   31.529  1.00 19.09 ? ? ? ? ? ? 559 GLU A CD  1 
+ATOM   353  O OE1 . GLU A 1 69  ? 22.051  7.611   31.523  1.00 19.16 ? ? ? ? ? ? 559 GLU A OE1 1 
+ATOM   354  O OE2 . GLU A 1 69  ? 20.229  8.295   30.478  1.00 21.50 ? ? ? ? ? ? 559 GLU A OE2 1 
+ATOM   355  N N   . ASN A 1 70  ? 19.445  6.292   35.930  1.00 12.97 ? ? ? ? ? ? 560 ASN A N   1 
+ATOM   356  C CA  . ASN A 1 70  ? 18.355  5.306   36.052  1.00 15.58 ? ? ? ? ? ? 560 ASN A CA  1 
+ATOM   357  C C   . ASN A 1 70  ? 18.400  4.427   37.280  1.00 15.17 ? ? ? ? ? ? 560 ASN A C   1 
+ATOM   358  O O   . ASN A 1 70  ? 17.418  3.778   37.599  1.00 15.41 ? ? ? ? ? ? 560 ASN A O   1 
+ATOM   359  C CB  . ASN A 1 70  ? 18.425  4.317   34.883  1.00 17.86 ? ? ? ? ? ? 560 ASN A CB  1 
+ATOM   360  C CG  . ASN A 1 70  ? 18.156  4.963   33.549  1.00 20.52 ? ? ? ? ? ? 560 ASN A CG  1 
+ATOM   361  O OD1 . ASN A 1 70  ? 17.068  5.493   33.305  1.00 23.03 ? ? ? ? ? ? 560 ASN A OD1 1 
+ATOM   362  N ND2 . ASN A 1 70  ? 19.144  4.923   32.668  1.00 21.96 ? ? ? ? ? ? 560 ASN A ND2 1 
+ATOM   363  N N   . GLU A 1 71  ? 19.540  4.415   37.958  1.00 14.85 ? ? ? ? ? ? 561 GLU A N   1 
+ATOM   364  C CA  . GLU A 1 71  ? 19.774  3.522   39.081  1.00 14.96 ? ? ? ? ? ? 561 GLU A CA  1 
+ATOM   365  C C   . GLU A 1 71  ? 19.067  3.784   40.417  1.00 15.00 ? ? ? ? ? ? 561 GLU A C   1 
+ATOM   366  O O   . GLU A 1 71  ? 19.187  2.967   41.354  1.00 14.61 ? ? ? ? ? ? 561 GLU A O   1 
+ATOM   367  C CB  . GLU A 1 71  ? 21.289  3.331   39.265  1.00 17.32 ? ? ? ? ? ? 561 GLU A CB  1 
+ATOM   368  C CG  . GLU A 1 71  ? 21.986  2.667   38.070  1.00 18.89 ? ? ? ? ? ? 561 GLU A CG  1 
+ATOM   369  C CD  . GLU A 1 71  ? 22.133  3.572   36.816  1.00 20.84 ? ? ? ? ? ? 561 GLU A CD  1 
+ATOM   370  O OE1 . GLU A 1 71  ? 21.933  4.827   36.888  1.00 20.56 ? ? ? ? ? ? 561 GLU A OE1 1 
+ATOM   371  O OE2 . GLU A 1 71  ? 22.467  3.007   35.742  1.00 22.23 ? ? ? ? ? ? 561 GLU A OE2 1 
+ATOM   372  N N   . MET A 1 72  ? 18.416  4.937   40.554  1.00 12.29 ? ? ? ? ? ? 562 MET A N   1 
+ATOM   373  C CA  . MET A 1 72  ? 17.674  5.220   41.773  1.00 12.08 ? ? ? ? ? ? 562 MET A CA  1 
+ATOM   374  C C   . MET A 1 72  ? 16.182  5.404   41.518  1.00 11.74 ? ? ? ? ? ? 562 MET A C   1 
+ATOM   375  O O   . MET A 1 72  ? 15.473  6.007   42.332  1.00 12.97 ? ? ? ? ? ? 562 MET A O   1 
+ATOM   376  C CB  . MET A 1 72  ? 18.286  6.356   42.593  1.00 13.30 ? ? ? ? ? ? 562 MET A CB  1 
+ATOM   377  C CG  . MET A 1 72  ? 19.599  5.949   43.212  1.00 15.93 ? ? ? ? ? ? 562 MET A CG  1 
+ATOM   378  S SD  . MET A 1 72  ? 20.297  7.204   44.328  1.00 19.08 ? ? ? ? ? ? 562 MET A SD  1 
+ATOM   379  C CE  . MET A 1 72  ? 19.130  7.075   45.652  1.00 19.63 ? ? ? ? ? ? 562 MET A CE  1 
+ATOM   380  N N   . LYS A 1 73  ? 15.718  4.910   40.367  1.00 10.88 ? ? ? ? ? ? 563 LYS A N   1 
+ATOM   381  C CA  . LYS A 1 73  ? 14.290  4.930   40.041  1.00 12.47 ? ? ? ? ? ? 563 LYS A CA  1 
+ATOM   382  C C   . LYS A 1 73  ? 13.635  3.736   40.799  1.00 12.55 ? ? ? ? ? ? 563 LYS A C   1 
+ATOM   383  O O   . LYS A 1 73  ? 14.332  2.804   41.194  1.00 11.94 ? ? ? ? ? ? 563 LYS A O   1 
+ATOM   384  C CB  . LYS A 1 73  ? 14.072  4.843   38.523  1.00 15.12 ? ? ? ? ? ? 563 LYS A CB  1 
+ATOM   385  C CG  . LYS A 1 73  ? 14.261  6.203   37.872  1.00 17.16 ? ? ? ? ? ? 563 LYS A CG  1 
+ATOM   386  C CD  . LYS A 1 73  ? 14.413  6.088   36.382  1.00 19.34 ? ? ? ? ? ? 563 LYS A CD  1 
+ATOM   387  C CE  . LYS A 1 73  ? 14.874  7.463   35.843  1.00 20.42 ? ? ? ? ? ? 563 LYS A CE  1 
+ATOM   388  N NZ  . LYS A 1 73  ? 15.271  7.408   34.412  1.00 21.61 ? ? ? ? ? ? 563 LYS A NZ  1 
+ATOM   389  N N   . PHE A 1 74  ? 12.320  3.768   40.989  1.00 12.42 ? ? ? ? ? ? 564 PHE A N   1 
+ATOM   390  C CA  . PHE A 1 74  ? 11.590  2.731   41.772  1.00 12.98 ? ? ? ? ? ? 564 PHE A CA  1 
+ATOM   391  C C   . PHE A 1 74  ? 11.858  1.266   41.385  1.00 13.21 ? ? ? ? ? ? 564 PHE A C   1 
+ATOM   392  O O   . PHE A 1 74  ? 12.119  0.429   42.264  1.00 12.63 ? ? ? ? ? ? 564 PHE A O   1 
+ATOM   393  C CB  . PHE A 1 74  ? 10.099  3.043   41.741  1.00 12.27 ? ? ? ? ? ? 564 PHE A CB  1 
+ATOM   394  C CG  . PHE A 1 74  ? 9.322   2.526   42.922  1.00 12.49 ? ? ? ? ? ? 564 PHE A CG  1 
+ATOM   395  C CD1 . PHE A 1 74  ? 9.065   1.154   43.070  1.00 13.09 ? ? ? ? ? ? 564 PHE A CD1 1 
+ATOM   396  C CD2 . PHE A 1 74  ? 8.727   3.421   43.816  1.00 12.05 ? ? ? ? ? ? 564 PHE A CD2 1 
+ATOM   397  C CE1 . PHE A 1 74  ? 8.205   0.694   44.097  1.00 12.00 ? ? ? ? ? ? 564 PHE A CE1 1 
+ATOM   398  C CE2 . PHE A 1 74  ? 7.874   2.962   44.838  1.00 12.16 ? ? ? ? ? ? 564 PHE A CE2 1 
+ATOM   399  C CZ  . PHE A 1 74  ? 7.621   1.600   44.964  1.00 11.41 ? ? ? ? ? ? 564 PHE A CZ  1 
+ATOM   400  N N   . ASP A 1 75  ? 11.848  0.971   40.092  1.00 13.79 ? ? ? ? ? ? 565 ASP A N   1 
+ATOM   401  C CA  . ASP A 1 75  ? 12.104  -0.389  39.618  1.00 16.20 ? ? ? ? ? ? 565 ASP A CA  1 
+ATOM   402  C C   . ASP A 1 75  ? 13.513  -0.883  39.912  1.00 14.58 ? ? ? ? ? ? 565 ASP A C   1 
+ATOM   403  O O   . ASP A 1 75  ? 13.713  -2.071  40.112  1.00 16.53 ? ? ? ? ? ? 565 ASP A O   1 
+ATOM   404  C CB  . ASP A 1 75  ? 11.759  -0.556  38.119  1.00 18.42 ? ? ? ? ? ? 565 ASP A CB  1 
+ATOM   405  C CG  . ASP A 1 75  ? 12.691  0.232   37.166  1.00 21.03 ? ? ? ? ? ? 565 ASP A CG  1 
+ATOM   406  O OD1 . ASP A 1 75  ? 13.301  1.279   37.510  1.00 21.94 ? ? ? ? ? ? 565 ASP A OD1 1 
+ATOM   407  O OD2 . ASP A 1 75  ? 12.773  -0.193  36.004  1.00 24.30 ? ? ? ? ? ? 565 ASP A OD2 1 
+ATOM   408  N N   . ALA A 1 76  ? 14.486  0.023   39.952  1.00 13.35 ? ? ? ? ? ? 566 ALA A N   1 
+ATOM   409  C CA  . ALA A 1 76  ? 15.872  -0.340  40.221  1.00 12.37 ? ? ? ? ? ? 566 ALA A CA  1 
+ATOM   410  C C   . ALA A 1 76  ? 16.132  -0.557  41.704  1.00 11.90 ? ? ? ? ? ? 566 ALA A C   1 
+ATOM   411  O O   . ALA A 1 76  ? 16.885  -1.460  42.086  1.00 12.98 ? ? ? ? ? ? 566 ALA A O   1 
+ATOM   412  C CB  . ALA A 1 76  ? 16.823  0.737   39.684  1.00 13.87 ? ? ? ? ? ? 566 ALA A CB  1 
+ATOM   413  N N   . LEU A 1 77  ? 15.549  0.302   42.525  1.00 10.41 ? ? ? ? ? ? 567 LEU A N   1 
+ATOM   414  C CA  . LEU A 1 77  ? 15.731  0.238   43.971  1.00 10.75 ? ? ? ? ? ? 567 LEU A CA  1 
+ATOM   415  C C   . LEU A 1 77  ? 14.910  -0.831  44.701  1.00 10.05 ? ? ? ? ? ? 567 LEU A C   1 
+ATOM   416  O O   . LEU A 1 77  ? 15.370  -1.365  45.702  1.00 9.00  ? ? ? ? ? ? 567 LEU A O   1 
+ATOM   417  C CB  . LEU A 1 77  ? 15.460  1.611   44.615  1.00 11.83 ? ? ? ? ? ? 567 LEU A CB  1 
+ATOM   418  C CG  . LEU A 1 77  ? 16.651  2.576   44.639  1.00 13.21 ? ? ? ? ? ? 567 LEU A CG  1 
+ATOM   419  C CD1 . LEU A 1 77  ? 16.195  3.948   45.141  1.00 13.06 ? ? ? ? ? ? 567 LEU A CD1 1 
+ATOM   420  C CD2 . LEU A 1 77  ? 17.759  2.009   45.534  1.00 14.86 ? ? ? ? ? ? 567 LEU A CD2 1 
+ATOM   421  N N   . GLN A 1 78  ? 13.682  -1.083  44.251  1.00 9.16  ? ? ? ? ? ? 568 GLN A N   1 
+ATOM   422  C CA  . GLN A 1 78  ? 12.821  -2.086  44.902  1.00 9.03  ? ? ? ? ? ? 568 GLN A CA  1 
+ATOM   423  C C   . GLN A 1 78  ? 12.257  -2.995  43.804  1.00 9.11  ? ? ? ? ? ? 568 GLN A C   1 
+ATOM   424  O O   . GLN A 1 78  ? 11.068  -2.958  43.506  1.00 9.32  ? ? ? ? ? ? 568 GLN A O   1 
+ATOM   425  C CB  . GLN A 1 78  ? 11.698  -1.388  45.681  1.00 9.34  ? ? ? ? ? ? 568 GLN A CB  1 
+ATOM   426  C CG  . GLN A 1 78  ? 11.042  -2.344  46.681  1.00 9.49  ? ? ? ? ? ? 568 GLN A CG  1 
+ATOM   427  C CD  . GLN A 1 78  ? 9.925   -1.770  47.515  1.00 9.83  ? ? ? ? ? ? 568 GLN A CD  1 
+ATOM   428  O OE1 . GLN A 1 78  ? 9.678   -0.549  47.579  1.00 10.82 ? ? ? ? ? ? 568 GLN A OE1 1 
+ATOM   429  N NE2 . GLN A 1 78  ? 9.243   -2.664  48.199  1.00 7.54  ? ? ? ? ? ? 568 GLN A NE2 1 
+ATOM   430  N N   . PRO A 1 79  ? 13.110  -3.869  43.229  1.00 9.77  ? ? ? ? ? ? 569 PRO A N   1 
+ATOM   431  C CA  . PRO A 1 79  ? 12.740  -4.788  42.150  1.00 10.77 ? ? ? ? ? ? 569 PRO A CA  1 
+ATOM   432  C C   . PRO A 1 79  ? 11.710  -5.848  42.482  1.00 11.54 ? ? ? ? ? ? 569 PRO A C   1 
+ATOM   433  O O   . PRO A 1 79  ? 11.013  -6.334  41.604  1.00 12.27 ? ? ? ? ? ? 569 PRO A O   1 
+ATOM   434  C CB  . PRO A 1 79  ? 14.089  -5.378  41.720  1.00 11.53 ? ? ? ? ? ? 569 PRO A CB  1 
+ATOM   435  C CG  . PRO A 1 79  ? 14.891  -5.362  42.988  1.00 11.37 ? ? ? ? ? ? 569 PRO A CG  1 
+ATOM   436  C CD  . PRO A 1 79  ? 14.536  -4.029  43.588  1.00 10.78 ? ? ? ? ? ? 569 PRO A CD  1 
+ATOM   437  N N   . ARG A 1 80  ? 11.645  -6.231  43.751  1.00 12.37 ? ? ? ? ? ? 570 ARG A N   1 
+ATOM   438  C CA  . ARG A 1 80  ? 10.665  -7.217  44.243  1.00 12.40 ? ? ? ? ? ? 570 ARG A CA  1 
+ATOM   439  C C   . ARG A 1 80  ? 10.108  -6.578  45.493  1.00 11.70 ? ? ? ? ? ? 570 ARG A C   1 
+ATOM   440  O O   . ARG A 1 80  ? 10.791  -5.753  46.109  1.00 11.68 ? ? ? ? ? ? 570 ARG A O   1 
+ATOM   441  C CB  . ARG A 1 80  ? 11.335  -8.558  44.581  1.00 15.41 ? ? ? ? ? ? 570 ARG A CB  1 
+ATOM   442  C CG  . ARG A 1 80  ? 11.819  -9.291  43.327  1.00 19.94 ? ? ? ? ? ? 570 ARG A CG  1 
+ATOM   443  C CD  . ARG A 1 80  ? 12.279  -10.747 43.584  1.00 23.04 ? ? ? ? ? ? 570 ARG A CD  1 
+ATOM   444  N NE  . ARG A 1 80  ? 13.616  -10.839 44.185  1.00 25.11 ? ? ? ? ? ? 570 ARG A NE  1 
+ATOM   445  C CZ  . ARG A 1 80  ? 13.853  -11.332 45.401  1.00 26.45 ? ? ? ? ? ? 570 ARG A CZ  1 
+ATOM   446  N NH1 . ARG A 1 80  ? 12.834  -11.768 46.145  1.00 27.52 ? ? ? ? ? ? 570 ARG A NH1 1 
+ATOM   447  N NH2 . ARG A 1 80  ? 15.101  -11.382 45.869  1.00 25.90 ? ? ? ? ? ? 570 ARG A NH2 1 
+ATOM   448  N N   . GLN A 1 81  ? 8.897   -6.930  45.899  1.00 12.35 ? ? ? ? ? ? 571 GLN A N   1 
+ATOM   449  C CA  . GLN A 1 81  ? 8.314   -6.292  47.075  1.00 12.44 ? ? ? ? ? ? 571 GLN A CA  1 
+ATOM   450  C C   . GLN A 1 81  ? 9.161   -6.529  48.336  1.00 12.10 ? ? ? ? ? ? 571 GLN A C   1 
+ATOM   451  O O   . GLN A 1 81  ? 9.433   -7.664  48.726  1.00 11.73 ? ? ? ? ? ? 571 GLN A O   1 
+ATOM   452  C CB  . GLN A 1 81  ? 6.857   -6.701  47.289  1.00 14.56 ? ? ? ? ? ? 571 GLN A CB  1 
+ATOM   453  C CG  . GLN A 1 81  ? 6.202   -5.788  48.306  1.00 18.17 ? ? ? ? ? ? 571 GLN A CG  1 
+ATOM   454  C CD  . GLN A 1 81  ? 4.692   -5.861  48.362  1.00 21.29 ? ? ? ? ? ? 571 GLN A CD  1 
+ATOM   455  O OE1 . GLN A 1 81  ? 4.060   -5.116  49.132  1.00 24.04 ? ? ? ? ? ? 571 GLN A OE1 1 
+ATOM   456  N NE2 . GLN A 1 81  ? 4.096   -6.733  47.552  1.00 21.88 ? ? ? ? ? ? 571 GLN A NE2 1 
+ATOM   457  N N   . ASN A 1 82  ? 9.522   -5.426  48.979  1.00 11.04 ? ? ? ? ? ? 572 ASN A N   1 
+ATOM   458  C CA  . ASN A 1 82  ? 10.381  -5.393  50.160  1.00 12.42 ? ? ? ? ? ? 572 ASN A CA  1 
+ATOM   459  C C   . ASN A 1 82  ? 11.790  -5.899  50.036  1.00 11.15 ? ? ? ? ? ? 572 ASN A C   1 
+ATOM   460  O O   . ASN A 1 82  ? 12.384  -6.311  51.033  1.00 11.60 ? ? ? ? ? ? 572 ASN A O   1 
+ATOM   461  C CB  . ASN A 1 82  ? 9.737   -5.964  51.407  1.00 15.04 ? ? ? ? ? ? 572 ASN A CB  1 
+ATOM   462  C CG  . ASN A 1 82  ? 9.221   -4.894  52.268  1.00 18.98 ? ? ? ? ? ? 572 ASN A CG  1 
+ATOM   463  O OD1 . ASN A 1 82  ? 9.995   -4.059  52.850  1.00 19.98 ? ? ? ? ? ? 572 ASN A OD1 1 
+ATOM   464  N ND2 . ASN A 1 82  ? 7.911   -4.742  52.212  1.00 20.80 ? ? ? ? ? ? 572 ASN A ND2 1 
+ATOM   465  N N   . VAL A 1 83  ? 12.309  -5.873  48.813  1.00 9.96  ? ? ? ? ? ? 573 VAL A N   1 
+ATOM   466  C CA  . VAL A 1 83  ? 13.685  -6.252  48.509  1.00 10.18 ? ? ? ? ? ? 573 VAL A CA  1 
+ATOM   467  C C   . VAL A 1 83  ? 14.304  -4.970  47.904  1.00 11.30 ? ? ? ? ? ? 573 VAL A C   1 
+ATOM   468  O O   . VAL A 1 83  ? 13.812  -4.470  46.875  1.00 11.52 ? ? ? ? ? ? 573 VAL A O   1 
+ATOM   469  C CB  . VAL A 1 83  ? 13.745  -7.391  47.506  1.00 10.03 ? ? ? ? ? ? 573 VAL A CB  1 
+ATOM   470  C CG1 . VAL A 1 83  ? 15.175  -7.687  47.151  1.00 10.66 ? ? ? ? ? ? 573 VAL A CG1 1 
+ATOM   471  C CG2 . VAL A 1 83  ? 13.023  -8.657  48.098  1.00 9.74  ? ? ? ? ? ? 573 VAL A CG2 1 
+ATOM   472  N N   . PHE A 1 84  ? 15.340  -4.434  48.553  1.00 9.70  ? ? ? ? ? ? 574 PHE A N   1 
+ATOM   473  C CA  . PHE A 1 84  ? 15.965  -3.163  48.128  1.00 9.11  ? ? ? ? ? ? 574 PHE A CA  1 
+ATOM   474  C C   . PHE A 1 84  ? 17.352  -3.410  47.617  1.00 9.74  ? ? ? ? ? ? 574 PHE A C   1 
+ATOM   475  O O   . PHE A 1 84  ? 18.152  -4.098  48.268  1.00 11.03 ? ? ? ? ? ? 574 PHE A O   1 
+ATOM   476  C CB  . PHE A 1 84  ? 15.989  -2.161  49.302  1.00 8.51  ? ? ? ? ? ? 574 PHE A CB  1 
+ATOM   477  C CG  . PHE A 1 84  ? 14.613  -1.678  49.710  1.00 9.17  ? ? ? ? ? ? 574 PHE A CG  1 
+ATOM   478  C CD1 . PHE A 1 84  ? 13.824  -2.414  50.605  1.00 9.18  ? ? ? ? ? ? 574 PHE A CD1 1 
+ATOM   479  C CD2 . PHE A 1 84  ? 14.054  -0.524  49.143  1.00 9.56  ? ? ? ? ? ? 574 PHE A CD2 1 
+ATOM   480  C CE1 . PHE A 1 84  ? 12.506  -2.021  50.922  1.00 8.61  ? ? ? ? ? ? 574 PHE A CE1 1 
+ATOM   481  C CE2 . PHE A 1 84  ? 12.729  -0.132  49.466  1.00 10.00 ? ? ? ? ? ? 574 PHE A CE2 1 
+ATOM   482  C CZ  . PHE A 1 84  ? 11.961  -0.897  50.358  1.00 9.53  ? ? ? ? ? ? 574 PHE A CZ  1 
+ATOM   483  N N   . ASP A 1 85  ? 17.660  -2.855  46.457  1.00 8.49  ? ? ? ? ? ? 575 ASP A N   1 
+ATOM   484  C CA  . ASP A 1 85  ? 18.969  -3.048  45.884  1.00 8.62  ? ? ? ? ? ? 575 ASP A CA  1 
+ATOM   485  C C   . ASP A 1 85  ? 19.692  -1.703  45.888  1.00 9.81  ? ? ? ? ? ? 575 ASP A C   1 
+ATOM   486  O O   . ASP A 1 85  ? 19.393  -0.837  45.040  1.00 10.34 ? ? ? ? ? ? 575 ASP A O   1 
+ATOM   487  C CB  . ASP A 1 85  ? 18.822  -3.593  44.471  1.00 9.82  ? ? ? ? ? ? 575 ASP A CB  1 
+ATOM   488  C CG  . ASP A 1 85  ? 20.161  -3.860  43.795  1.00 11.13 ? ? ? ? ? ? 575 ASP A CG  1 
+ATOM   489  O OD1 . ASP A 1 85  ? 21.230  -3.431  44.288  1.00 11.30 ? ? ? ? ? ? 575 ASP A OD1 1 
+ATOM   490  O OD2 . ASP A 1 85  ? 20.149  -4.529  42.744  1.00 14.44 ? ? ? ? ? ? 575 ASP A OD2 1 
+ATOM   491  N N   . PHE A 1 86  ? 20.655  -1.531  46.805  1.00 8.48  ? ? ? ? ? ? 576 PHE A N   1 
+ATOM   492  C CA  . PHE A 1 86  ? 21.387  -0.274  46.921  1.00 8.30  ? ? ? ? ? ? 576 PHE A CA  1 
+ATOM   493  C C   . PHE A 1 86  ? 22.769  -0.330  46.258  1.00 9.49  ? ? ? ? ? ? 576 PHE A C   1 
+ATOM   494  O O   . PHE A 1 86  ? 23.550  0.625   46.382  1.00 10.33 ? ? ? ? ? ? 576 PHE A O   1 
+ATOM   495  C CB  . PHE A 1 86  ? 21.615  0.064   48.405  1.00 8.54  ? ? ? ? ? ? 576 PHE A CB  1 
+ATOM   496  C CG  . PHE A 1 86  ? 20.352  0.324   49.200  1.00 10.29 ? ? ? ? ? ? 576 PHE A CG  1 
+ATOM   497  C CD1 . PHE A 1 86  ? 19.448  1.314   48.813  1.00 10.53 ? ? ? ? ? ? 576 PHE A CD1 1 
+ATOM   498  C CD2 . PHE A 1 86  ? 20.077  -0.416  50.362  1.00 10.46 ? ? ? ? ? ? 576 PHE A CD2 1 
+ATOM   499  C CE1 . PHE A 1 86  ? 18.284  1.570   49.558  1.00 12.42 ? ? ? ? ? ? 576 PHE A CE1 1 
+ATOM   500  C CE2 . PHE A 1 86  ? 18.907  -0.164  51.121  1.00 11.16 ? ? ? ? ? ? 576 PHE A CE2 1 
+ATOM   501  C CZ  . PHE A 1 86  ? 18.011  0.830   50.717  1.00 11.25 ? ? ? ? ? ? 576 PHE A CZ  1 
+ATOM   502  N N   . SER A 1 87  ? 23.093  -1.429  45.588  1.00 9.04  ? ? ? ? ? ? 577 SER A N   1 
+ATOM   503  C CA  . SER A 1 87  ? 24.419  -1.578  45.042  1.00 10.38 ? ? ? ? ? ? 577 SER A CA  1 
+ATOM   504  C C   . SER A 1 87  ? 24.963  -0.440  44.168  1.00 10.38 ? ? ? ? ? ? 577 SER A C   1 
+ATOM   505  O O   . SER A 1 87  ? 26.034  0.098   44.459  1.00 11.09 ? ? ? ? ? ? 577 SER A O   1 
+ATOM   506  C CB  . SER A 1 87  ? 24.581  -2.925  44.347  1.00 11.36 ? ? ? ? ? ? 577 SER A CB  1 
+ATOM   507  O OG  . SER A 1 87  ? 23.678  -3.038  43.273  1.00 15.81 ? ? ? ? ? ? 577 SER A OG  1 
+ATOM   508  N N   . LYS A 1 88  ? 24.228  -0.074  43.115  1.00 11.96 ? ? ? ? ? ? 578 LYS A N   1 
+ATOM   509  C CA  . LYS A 1 88  ? 24.687  0.990   42.200  1.00 11.14 ? ? ? ? ? ? 578 LYS A CA  1 
+ATOM   510  C C   . LYS A 1 88  ? 24.701  2.375   42.810  1.00 10.31 ? ? ? ? ? ? 578 LYS A C   1 
+ATOM   511  O O   . LYS A 1 88  ? 25.673  3.116   42.661  1.00 11.06 ? ? ? ? ? ? 578 LYS A O   1 
+ATOM   512  C CB  . LYS A 1 88  ? 23.902  0.935   40.892  1.00 11.44 ? ? ? ? ? ? 578 LYS A CB  1 
+ATOM   513  C CG  . LYS A 1 88  ? 24.284  -0.299  40.108  1.00 13.23 ? ? ? ? ? ? 578 LYS A CG  1 
+ATOM   514  C CD  . LYS A 1 88  ? 23.758  -0.276  38.712  1.00 15.30 ? ? ? ? ? ? 578 LYS A CD  1 
+ATOM   515  C CE  . LYS A 1 88  ? 24.309  -1.457  37.954  1.00 17.76 ? ? ? ? ? ? 578 LYS A CE  1 
+ATOM   516  N NZ  . LYS A 1 88  ? 23.869  -1.409  36.526  1.00 19.51 ? ? ? ? ? ? 578 LYS A NZ  1 
+ATOM   517  N N   . GLY A 1 89  ? 23.674  2.686   43.587  1.00 10.04 ? ? ? ? ? ? 579 GLY A N   1 
+ATOM   518  C CA  . GLY A 1 89  ? 23.612  3.973   44.240  1.00 10.33 ? ? ? ? ? ? 579 GLY A CA  1 
+ATOM   519  C C   . GLY A 1 89  ? 24.736  4.141   45.244  1.00 9.65  ? ? ? ? ? ? 579 GLY A C   1 
+ATOM   520  O O   . GLY A 1 89  ? 25.304  5.220   45.337  1.00 11.01 ? ? ? ? ? ? 579 GLY A O   1 
+ATOM   521  N N   . ASP A 1 90  ? 25.085  3.085   45.986  1.00 10.04 ? ? ? ? ? ? 580 ASP A N   1 
+ATOM   522  C CA  . ASP A 1 90  ? 26.172  3.174   46.983  1.00 10.22 ? ? ? ? ? ? 580 ASP A CA  1 
+ATOM   523  C C   . ASP A 1 90  ? 27.527  3.295   46.300  1.00 9.18  ? ? ? ? ? ? 580 ASP A C   1 
+ATOM   524  O O   . ASP A 1 90  ? 28.437  3.909   46.841  1.00 10.73 ? ? ? ? ? ? 580 ASP A O   1 
+ATOM   525  C CB  . ASP A 1 90  ? 26.168  1.976   47.972  1.00 12.50 ? ? ? ? ? ? 580 ASP A CB  1 
+ATOM   526  C CG  . ASP A 1 90  ? 25.057  2.072   49.055  1.00 14.21 ? ? ? ? ? ? 580 ASP A CG  1 
+ATOM   527  O OD1 . ASP A 1 90  ? 24.188  2.955   49.004  1.00 13.52 ? ? ? ? ? ? 580 ASP A OD1 1 
+ATOM   528  O OD2 . ASP A 1 90  ? 25.049  1.221   49.972  1.00 15.49 ? ? ? ? ? ? 580 ASP A OD2 1 
+ATOM   529  N N   . GLN A 1 91  ? 27.665  2.652   45.146  1.00 9.92  ? ? ? ? ? ? 581 GLN A N   1 
+ATOM   530  C CA  . GLN A 1 91  ? 28.883  2.735   44.350  1.00 11.72 ? ? ? ? ? ? 581 GLN A CA  1 
+ATOM   531  C C   . GLN A 1 91  ? 29.065  4.198   43.854  1.00 11.64 ? ? ? ? ? ? 581 GLN A C   1 
+ATOM   532  O O   . GLN A 1 91  ? 30.170  4.745   43.924  1.00 12.21 ? ? ? ? ? ? 581 GLN A O   1 
+ATOM   533  C CB  . GLN A 1 91  ? 28.800  1.804   43.151  1.00 13.55 ? ? ? ? ? ? 581 GLN A CB  1 
+ATOM   534  C CG  . GLN A 1 91  ? 30.123  1.640   42.471  1.00 18.11 ? ? ? ? ? ? 581 GLN A CG  1 
+ATOM   535  C CD  . GLN A 1 91  ? 30.041  0.850   41.168  1.00 21.45 ? ? ? ? ? ? 581 GLN A CD  1 
+ATOM   536  O OE1 . GLN A 1 91  ? 30.920  0.997   40.298  1.00 24.51 ? ? ? ? ? ? 581 GLN A OE1 1 
+ATOM   537  N NE2 . GLN A 1 91  ? 28.996  0.029   41.010  1.00 20.61 ? ? ? ? ? ? 581 GLN A NE2 1 
+ATOM   538  N N   . LEU A 1 92  ? 27.999  4.837   43.366  1.00 9.96  ? ? ? ? ? ? 582 LEU A N   1 
+ATOM   539  C CA  . LEU A 1 92  ? 28.132  6.234   42.936  1.00 10.73 ? ? ? ? ? ? 582 LEU A CA  1 
+ATOM   540  C C   . LEU A 1 92  ? 28.414  7.183   44.116  1.00 10.35 ? ? ? ? ? ? 582 LEU A C   1 
+ATOM   541  O O   . LEU A 1 92  ? 29.228  8.110   44.014  1.00 10.03 ? ? ? ? ? ? 582 LEU A O   1 
+ATOM   542  C CB  . LEU A 1 92  ? 26.905  6.695   42.141  1.00 10.29 ? ? ? ? ? ? 582 LEU A CB  1 
+ATOM   543  C CG  . LEU A 1 92  ? 27.036  8.125   41.589  1.00 10.67 ? ? ? ? ? ? 582 LEU A CG  1 
+ATOM   544  C CD1 . LEU A 1 92  ? 28.254  8.259   40.663  1.00 11.85 ? ? ? ? ? ? 582 LEU A CD1 1 
+ATOM   545  C CD2 . LEU A 1 92  ? 25.773  8.451   40.815  1.00 11.84 ? ? ? ? ? ? 582 LEU A CD2 1 
+ATOM   546  N N   . LEU A 1 93  ? 27.768  6.953   45.257  1.00 9.56  ? ? ? ? ? ? 583 LEU A N   1 
+ATOM   547  C CA  . LEU A 1 93  ? 28.001  7.818   46.403  1.00 9.90  ? ? ? ? ? ? 583 LEU A CA  1 
+ATOM   548  C C   . LEU A 1 93  ? 29.457  7.722   46.878  1.00 9.16  ? ? ? ? ? ? 583 LEU A C   1 
+ATOM   549  O O   . LEU A 1 93  ? 30.057  8.721   47.228  1.00 9.96  ? ? ? ? ? ? 583 LEU A O   1 
+ATOM   550  C CB  . LEU A 1 93  ? 27.023  7.499   47.537  1.00 11.71 ? ? ? ? ? ? 583 LEU A CB  1 
+ATOM   551  C CG  . LEU A 1 93  ? 27.173  8.321   48.825  1.00 13.57 ? ? ? ? ? ? 583 LEU A CG  1 
+ATOM   552  C CD1 . LEU A 1 93  ? 26.782  9.808   48.592  1.00 14.73 ? ? ? ? ? ? 583 LEU A CD1 1 
+ATOM   553  C CD2 . LEU A 1 93  ? 26.305  7.695   49.936  1.00 15.24 ? ? ? ? ? ? 583 LEU A CD2 1 
+ATOM   554  N N   . ALA A 1 94  ? 30.028  6.525   46.885  1.00 9.86  ? ? ? ? ? ? 584 ALA A N   1 
+ATOM   555  C CA  . ALA A 1 94  ? 31.421  6.362   47.320  1.00 10.89 ? ? ? ? ? ? 584 ALA A CA  1 
+ATOM   556  C C   . ALA A 1 94  ? 32.378  7.169   46.383  1.00 10.75 ? ? ? ? ? ? 584 ALA A C   1 
+ATOM   557  O O   . ALA A 1 94  ? 33.355  7.787   46.831  1.00 10.77 ? ? ? ? ? ? 584 ALA A O   1 
+ATOM   558  C CB  . ALA A 1 94  ? 31.796  4.873   47.341  1.00 10.98 ? ? ? ? ? ? 584 ALA A CB  1 
+ATOM   559  N N   . PHE A 1 95  ? 32.113  7.111   45.081  1.00 11.30 ? ? ? ? ? ? 585 PHE A N   1 
+ATOM   560  C CA  . PHE A 1 95  ? 32.899  7.851   44.092  1.00 10.70 ? ? ? ? ? ? 585 PHE A CA  1 
+ATOM   561  C C   . PHE A 1 95  ? 32.740  9.351   44.358  1.00 10.59 ? ? ? ? ? ? 585 PHE A C   1 
+ATOM   562  O O   . PHE A 1 95  ? 33.738  10.077  44.384  1.00 10.72 ? ? ? ? ? ? 585 PHE A O   1 
+ATOM   563  C CB  . PHE A 1 95  ? 32.395  7.487   42.685  1.00 12.01 ? ? ? ? ? ? 585 PHE A CB  1 
+ATOM   564  C CG  . PHE A 1 95  ? 32.891  8.401   41.579  1.00 13.07 ? ? ? ? ? ? 585 PHE A CG  1 
+ATOM   565  C CD1 . PHE A 1 95  ? 34.106  8.154   40.941  1.00 13.99 ? ? ? ? ? ? 585 PHE A CD1 1 
+ATOM   566  C CD2 . PHE A 1 95  ? 32.098  9.464   41.132  1.00 13.59 ? ? ? ? ? ? 585 PHE A CD2 1 
+ATOM   567  C CE1 . PHE A 1 95  ? 34.528  8.948   39.870  1.00 13.36 ? ? ? ? ? ? 585 PHE A CE1 1 
+ATOM   568  C CE2 . PHE A 1 95  ? 32.508  10.254  40.074  1.00 13.44 ? ? ? ? ? ? 585 PHE A CE2 1 
+ATOM   569  C CZ  . PHE A 1 95  ? 33.725  9.988   39.448  1.00 13.72 ? ? ? ? ? ? 585 PHE A CZ  1 
+ATOM   570  N N   . ALA A 1 96  ? 31.505  9.812   44.594  1.00 9.66  ? ? ? ? ? ? 586 ALA A N   1 
+ATOM   571  C CA  . ALA A 1 96  ? 31.236  11.240  44.851  1.00 9.63  ? ? ? ? ? ? 586 ALA A CA  1 
+ATOM   572  C C   . ALA A 1 96  ? 32.013  11.738  46.051  1.00 11.79 ? ? ? ? ? ? 586 ALA A C   1 
+ATOM   573  O O   . ALA A 1 96  ? 32.690  12.774  46.000  1.00 11.85 ? ? ? ? ? ? 586 ALA A O   1 
+ATOM   574  C CB  . ALA A 1 96  ? 29.759  11.485  45.059  1.00 10.04 ? ? ? ? ? ? 586 ALA A CB  1 
+ATOM   575  N N   . GLU A 1 97  ? 31.984  10.956  47.119  1.00 12.40 ? ? ? ? ? ? 587 GLU A N   1 
+ATOM   576  C CA  . GLU A 1 97  ? 32.678  11.341  48.335  1.00 15.08 ? ? ? ? ? ? 587 GLU A CA  1 
+ATOM   577  C C   . GLU A 1 97  ? 34.204  11.446  48.203  1.00 14.23 ? ? ? ? ? ? 587 GLU A C   1 
+ATOM   578  O O   . GLU A 1 97  ? 34.797  12.386  48.741  1.00 15.23 ? ? ? ? ? ? 587 GLU A O   1 
+ATOM   579  C CB  . GLU A 1 97  ? 32.265  10.423  49.494  1.00 19.00 ? ? ? ? ? ? 587 GLU A CB  1 
+ATOM   580  C CG  . GLU A 1 97  ? 30.790  10.633  49.872  1.00 24.24 ? ? ? ? ? ? 587 GLU A CG  1 
+ATOM   581  C CD  . GLU A 1 97  ? 30.352  9.857   51.101  1.00 27.57 ? ? ? ? ? ? 587 GLU A CD  1 
+ATOM   582  O OE1 . GLU A 1 97  ? 30.760  8.676   51.256  1.00 28.92 ? ? ? ? ? ? 587 GLU A OE1 1 
+ATOM   583  O OE2 . GLU A 1 97  ? 29.578  10.445  51.901  1.00 30.04 ? ? ? ? ? ? 587 GLU A OE2 1 
+ATOM   584  N N   . ARG A 1 98  ? 34.842  10.540  47.463  1.00 12.93 ? ? ? ? ? ? 588 ARG A N   1 
+ATOM   585  C CA  . ARG A 1 98  ? 36.294  10.654  47.341  1.00 13.31 ? ? ? ? ? ? 588 ARG A CA  1 
+ATOM   586  C C   . ARG A 1 98  ? 36.691  11.716  46.317  1.00 12.35 ? ? ? ? ? ? 588 ARG A C   1 
+ATOM   587  O O   . ARG A 1 98  ? 37.864  12.059  46.189  1.00 12.04 ? ? ? ? ? ? 588 ARG A O   1 
+ATOM   588  C CB  . ARG A 1 98  ? 36.983  9.310   47.104  1.00 14.50 ? ? ? ? ? ? 588 ARG A CB  1 
+ATOM   589  C CG  . ARG A 1 98  ? 36.752  8.664   45.801  1.00 16.91 ? ? ? ? ? ? 588 ARG A CG  1 
+ATOM   590  C CD  . ARG A 1 98  ? 37.369  7.266   45.836  1.00 19.74 ? ? ? ? ? ? 588 ARG A CD  1 
+ATOM   591  N NE  . ARG A 1 98  ? 37.339  6.626   44.519  1.00 20.85 ? ? ? ? ? ? 588 ARG A NE  1 
+ATOM   592  C CZ  . ARG A 1 98  ? 36.405  5.771   44.084  1.00 22.70 ? ? ? ? ? ? 588 ARG A CZ  1 
+ATOM   593  N NH1 . ARG A 1 98  ? 35.375  5.405   44.842  1.00 22.75 ? ? ? ? ? ? 588 ARG A NH1 1 
+ATOM   594  N NH2 . ARG A 1 98  ? 36.518  5.257   42.864  1.00 24.85 ? ? ? ? ? ? 588 ARG A NH2 1 
+ATOM   595  N N   . ASN A 1 99  ? 35.699  12.261  45.628  1.00 11.09 ? ? ? ? ? ? 589 ASN A N   1 
+ATOM   596  C CA  . ASN A 1 99  ? 35.956  13.318  44.652  1.00 11.19 ? ? ? ? ? ? 589 ASN A CA  1 
+ATOM   597  C C   . ASN A 1 99  ? 35.373  14.675  45.048  1.00 12.23 ? ? ? ? ? ? 589 ASN A C   1 
+ATOM   598  O O   . ASN A 1 99  ? 35.372  15.611  44.258  1.00 13.60 ? ? ? ? ? ? 589 ASN A O   1 
+ATOM   599  C CB  . ASN A 1 99  ? 35.512  12.893  43.266  1.00 10.52 ? ? ? ? ? ? 589 ASN A CB  1 
+ATOM   600  C CG  . ASN A 1 99  ? 36.448  11.891  42.671  1.00 11.20 ? ? ? ? ? ? 589 ASN A CG  1 
+ATOM   601  O OD1 . ASN A 1 99  ? 37.617  12.208  42.407  1.00 12.39 ? ? ? ? ? ? 589 ASN A OD1 1 
+ATOM   602  N ND2 . ASN A 1 99  ? 35.983  10.663  42.493  1.00 12.35 ? ? ? ? ? ? 589 ASN A ND2 1 
+ATOM   603  N N   . GLY A 1 100 ? 34.948  14.799  46.303  1.00 11.11 ? ? ? ? ? ? 590 GLY A N   1 
+ATOM   604  C CA  . GLY A 1 100 ? 34.409  16.046  46.802  1.00 12.54 ? ? ? ? ? ? 590 GLY A CA  1 
+ATOM   605  C C   . GLY A 1 100 ? 33.187  16.543  46.046  1.00 13.67 ? ? ? ? ? ? 590 GLY A C   1 
+ATOM   606  O O   . GLY A 1 100 ? 33.016  17.752  45.853  1.00 14.76 ? ? ? ? ? ? 590 GLY A O   1 
+ATOM   607  N N   . MET A 1 101 ? 32.322  15.611  45.659  1.00 11.86 ? ? ? ? ? ? 591 MET A N   1 
+ATOM   608  C CA  . MET A 1 101 ? 31.110  15.937  44.929  1.00 11.81 ? ? ? ? ? ? 591 MET A CA  1 
+ATOM   609  C C   . MET A 1 101 ? 29.856  15.722  45.774  1.00 12.73 ? ? ? ? ? ? 591 MET A C   1 
+ATOM   610  O O   . MET A 1 101 ? 29.828  14.854  46.660  1.00 13.18 ? ? ? ? ? ? 591 MET A O   1 
+ATOM   611  C CB  . MET A 1 101 ? 30.974  15.007  43.729  1.00 12.03 ? ? ? ? ? ? 591 MET A CB  1 
+ATOM   612  C CG  . MET A 1 101 ? 32.109  15.061  42.737  1.00 13.60 ? ? ? ? ? ? 591 MET A CG  1 
+ATOM   613  S SD  . MET A 1 101 ? 31.837  13.777  41.558  1.00 17.11 ? ? ? ? ? ? 591 MET A SD  1 
+ATOM   614  C CE  . MET A 1 101 ? 32.965  14.238  40.297  1.00 18.14 ? ? ? ? ? ? 591 MET A CE  1 
+ATOM   615  N N   . GLN A 1 102 ? 28.814  16.500  45.482  1.00 11.47 ? ? ? ? ? ? 592 GLN A N   1 
+ATOM   616  C CA  . GLN A 1 102 ? 27.510  16.321  46.126  1.00 11.95 ? ? ? ? ? ? 592 GLN A CA  1 
+ATOM   617  C C   . GLN A 1 102 ? 26.674  15.444  45.190  1.00 11.52 ? ? ? ? ? ? 592 GLN A C   1 
+ATOM   618  O O   . GLN A 1 102 ? 27.031  15.254  44.020  1.00 10.61 ? ? ? ? ? ? 592 GLN A O   1 
+ATOM   619  C CB  . GLN A 1 102 ? 26.801  17.655  46.371  1.00 14.73 ? ? ? ? ? ? 592 GLN A CB  1 
+ATOM   620  C CG  . GLN A 1 102 ? 27.451  18.487  47.472  1.00 19.63 ? ? ? ? ? ? 592 GLN A CG  1 
+ATOM   621  C CD  . GLN A 1 102 ? 26.701  19.777  47.758  1.00 23.71 ? ? ? ? ? ? 592 GLN A CD  1 
+ATOM   622  O OE1 . GLN A 1 102 ? 26.914  20.393  48.812  1.00 27.70 ? ? ? ? ? ? 592 GLN A OE1 1 
+ATOM   623  N NE2 . GLN A 1 102 ? 25.783  20.176  46.858  1.00 24.73 ? ? ? ? ? ? 592 GLN A NE2 1 
+ATOM   624  N N   . MET A 1 103 ? 25.549  14.932  45.676  1.00 10.95 ? ? ? ? ? ? 593 MET A N   1 
+ATOM   625  C CA  . MET A 1 103 ? 24.717  14.071  44.856  1.00 11.58 ? ? ? ? ? ? 593 MET A CA  1 
+ATOM   626  C C   . MET A 1 103 ? 23.246  14.468  44.999  1.00 10.01 ? ? ? ? ? ? 593 MET A C   1 
+ATOM   627  O O   . MET A 1 103 ? 22.849  14.991  46.052  1.00 12.78 ? ? ? ? ? ? 593 MET A O   1 
+ATOM   628  C CB  . MET A 1 103 ? 24.948  12.633  45.335  1.00 13.38 ? ? ? ? ? ? 593 MET A CB  1 
+ATOM   629  C CG  . MET A 1 103 ? 24.256  11.533  44.588  1.00 17.02 ? ? ? ? ? ? 593 MET A CG  1 
+ATOM   630  S SD  . MET A 1 103 ? 24.938  9.915   45.134  1.00 19.41 ? ? ? ? ? ? 593 MET A SD  1 
+ATOM   631  C CE  . MET A 1 103 ? 23.635  8.775   44.598  1.00 20.39 ? ? ? ? ? ? 593 MET A CE  1 
+ATOM   632  N N   . ARG A 1 104 ? 22.490  14.379  43.907  1.00 8.19  ? ? ? ? ? ? 594 ARG A N   1 
+ATOM   633  C CA  . ARG A 1 104 ? 21.038  14.611  43.945  1.00 8.93  ? ? ? ? ? ? 594 ARG A CA  1 
+ATOM   634  C C   . ARG A 1 104 ? 20.394  13.207  43.875  1.00 8.31  ? ? ? ? ? ? 594 ARG A C   1 
+ATOM   635  O O   . ARG A 1 104 ? 20.926  12.302  43.224  1.00 9.88  ? ? ? ? ? ? 594 ARG A O   1 
+ATOM   636  C CB  . ARG A 1 104 ? 20.502  15.429  42.738  1.00 9.04  ? ? ? ? ? ? 594 ARG A CB  1 
+ATOM   637  C CG  . ARG A 1 104 ? 21.149  16.806  42.508  1.00 9.14  ? ? ? ? ? ? 594 ARG A CG  1 
+ATOM   638  C CD  . ARG A 1 104 ? 20.365  17.594  41.462  1.00 7.96  ? ? ? ? ? ? 594 ARG A CD  1 
+ATOM   639  N NE  . ARG A 1 104 ? 19.123  18.140  42.007  1.00 8.48  ? ? ? ? ? ? 594 ARG A NE  1 
+ATOM   640  C CZ  . ARG A 1 104 ? 17.885  17.703  41.739  1.00 8.59  ? ? ? ? ? ? 594 ARG A CZ  1 
+ATOM   641  N NH1 . ARG A 1 104 ? 17.672  16.701  40.895  1.00 8.09  ? ? ? ? ? ? 594 ARG A NH1 1 
+ATOM   642  N NH2 . ARG A 1 104 ? 16.849  18.219  42.394  1.00 7.94  ? ? ? ? ? ? 594 ARG A NH2 1 
+ATOM   643  N N   . GLY A 1 105 ? 19.254  13.034  44.533  1.00 7.75  ? ? ? ? ? ? 595 GLY A N   1 
+ATOM   644  C CA  . GLY A 1 105 ? 18.558  11.753  44.490  1.00 8.52  ? ? ? ? ? ? 595 GLY A CA  1 
+ATOM   645  C C   . GLY A 1 105 ? 17.439  11.843  43.463  1.00 7.86  ? ? ? ? ? ? 595 GLY A C   1 
+ATOM   646  O O   . GLY A 1 105 ? 16.585  12.699  43.558  1.00 9.47  ? ? ? ? ? ? 595 GLY A O   1 
+ATOM   647  N N   . HIS A 1 106 ? 17.393  10.910  42.531  1.00 8.73  ? ? ? ? ? ? 596 HIS A N   1 
+ATOM   648  C CA  . HIS A 1 106 ? 16.406  10.953  41.482  1.00 7.94  ? ? ? ? ? ? 596 HIS A CA  1 
+ATOM   649  C C   . HIS A 1 106 ? 15.952  9.513   41.226  1.00 8.14  ? ? ? ? ? ? 596 HIS A C   1 
+ATOM   650  O O   . HIS A 1 106 ? 16.745  8.713   40.778  1.00 9.92  ? ? ? ? ? ? 596 HIS A O   1 
+ATOM   651  C CB  . HIS A 1 106 ? 17.124  11.553  40.248  1.00 9.36  ? ? ? ? ? ? 596 HIS A CB  1 
+ATOM   652  C CG  . HIS A 1 106 ? 16.291  11.591  39.006  1.00 10.80 ? ? ? ? ? ? 596 HIS A CG  1 
+ATOM   653  N ND1 . HIS A 1 106 ? 15.337  12.559  38.773  1.00 11.73 ? ? ? ? ? ? 596 HIS A ND1 1 
+ATOM   654  C CD2 . HIS A 1 106 ? 16.275  10.778  37.920  1.00 12.56 ? ? ? ? ? ? 596 HIS A CD2 1 
+ATOM   655  C CE1 . HIS A 1 106 ? 14.769  12.344  37.598  1.00 12.76 ? ? ? ? ? ? 596 HIS A CE1 1 
+ATOM   656  N NE2 . HIS A 1 106 ? 15.318  11.267  37.058  1.00 13.02 ? ? ? ? ? ? 596 HIS A NE2 1 
+ATOM   657  N N   . THR A 1 107 ? 14.684  9.162   41.427  1.00 8.09  ? ? ? ? ? ? 597 THR A N   1 
+ATOM   658  C CA  . THR A 1 107 ? 13.588  10.015  41.887  1.00 8.14  ? ? ? ? ? ? 597 THR A CA  1 
+ATOM   659  C C   . THR A 1 107 ? 12.621  9.019   42.554  1.00 8.44  ? ? ? ? ? ? 597 THR A C   1 
+ATOM   660  O O   . THR A 1 107 ? 12.537  7.863   42.132  1.00 9.27  ? ? ? ? ? ? 597 THR A O   1 
+ATOM   661  C CB  . THR A 1 107 ? 12.857  10.707  40.697  1.00 8.07  ? ? ? ? ? ? 597 THR A CB  1 
+ATOM   662  O OG1 . THR A 1 107 ? 11.738  11.439  41.182  1.00 9.27  ? ? ? ? ? ? 597 THR A OG1 1 
+ATOM   663  C CG2 . THR A 1 107 ? 12.392  9.693   39.651  1.00 9.25  ? ? ? ? ? ? 597 THR A CG2 1 
+ATOM   664  N N   . LEU A 1 108 ? 11.864  9.472   43.545  1.00 8.35  ? ? ? ? ? ? 598 LEU A N   1 
+ATOM   665  C CA  . LEU A 1 108 ? 10.989  8.568   44.286  1.00 9.50  ? ? ? ? ? ? 598 LEU A CA  1 
+ATOM   666  C C   . LEU A 1 108 ? 9.645   8.210   43.673  1.00 9.54  ? ? ? ? ? ? 598 LEU A C   1 
+ATOM   667  O O   . LEU A 1 108 ? 9.377   7.040   43.408  1.00 12.35 ? ? ? ? ? ? 598 LEU A O   1 
+ATOM   668  C CB  . LEU A 1 108 ? 10.838  9.074   45.734  1.00 9.29  ? ? ? ? ? ? 598 LEU A CB  1 
+ATOM   669  C CG  . LEU A 1 108 ? 12.154  9.258   46.501  1.00 9.29  ? ? ? ? ? ? 598 LEU A CG  1 
+ATOM   670  C CD1 . LEU A 1 108 ? 11.970  10.051  47.740  1.00 10.09 ? ? ? ? ? ? 598 LEU A CD1 1 
+ATOM   671  C CD2 . LEU A 1 108 ? 12.786  7.915   46.818  1.00 10.46 ? ? ? ? ? ? 598 LEU A CD2 1 
+ATOM   672  N N   . ILE A 1 109 ? 8.811   9.206   43.425  1.00 9.46  ? ? ? ? ? ? 599 ILE A N   1 
+ATOM   673  C CA  . ILE A 1 109 ? 7.468   8.979   42.900  1.00 10.99 ? ? ? ? ? ? 599 ILE A CA  1 
+ATOM   674  C C   . ILE A 1 109 ? 7.327   9.468   41.450  1.00 10.62 ? ? ? ? ? ? 599 ILE A C   1 
+ATOM   675  O O   . ILE A 1 109 ? 7.436   10.658  41.173  1.00 11.12 ? ? ? ? ? ? 599 ILE A O   1 
+ATOM   676  C CB  . ILE A 1 109 ? 6.430   9.675   43.824  1.00 11.60 ? ? ? ? ? ? 599 ILE A CB  1 
+ATOM   677  C CG1 . ILE A 1 109 ? 6.578   9.192   45.293  1.00 12.74 ? ? ? ? ? ? 599 ILE A CG1 1 
+ATOM   678  C CG2 . ILE A 1 109 ? 5.029   9.453   43.305  1.00 13.24 ? ? ? ? ? ? 599 ILE A CG2 1 
+ATOM   679  C CD1 . ILE A 1 109 ? 6.568   7.645   45.498  1.00 13.61 ? ? ? ? ? ? 599 ILE A CD1 1 
+ATOM   680  N N   . TRP A 1 110 ? 7.038   8.546   40.540  1.00 10.60 ? ? ? ? ? ? 600 TRP A N   1 
+ATOM   681  C CA  . TRP A 1 110 ? 6.928   8.863   39.113  1.00 12.78 ? ? ? ? ? ? 600 TRP A CA  1 
+ATOM   682  C C   . TRP A 1 110 ? 5.914   7.883   38.485  1.00 14.21 ? ? ? ? ? ? 600 TRP A C   1 
+ATOM   683  O O   . TRP A 1 110 ? 5.631   6.822   39.056  1.00 13.85 ? ? ? ? ? ? 600 TRP A O   1 
+ATOM   684  C CB  . TRP A 1 110 ? 8.323   8.688   38.493  1.00 12.55 ? ? ? ? ? ? 600 TRP A CB  1 
+ATOM   685  C CG  . TRP A 1 110 ? 8.523   9.123   37.052  1.00 14.25 ? ? ? ? ? ? 600 TRP A CG  1 
+ATOM   686  C CD1 . TRP A 1 110 ? 7.865   10.117  36.371  1.00 14.13 ? ? ? ? ? ? 600 TRP A CD1 1 
+ATOM   687  C CD2 . TRP A 1 110 ? 9.517   8.620   36.162  1.00 15.59 ? ? ? ? ? ? 600 TRP A CD2 1 
+ATOM   688  N NE1 . TRP A 1 110 ? 8.406   10.267  35.102  1.00 13.78 ? ? ? ? ? ? 600 TRP A NE1 1 
+ATOM   689  C CE2 . TRP A 1 110 ? 9.420   9.362   34.949  1.00 15.35 ? ? ? ? ? ? 600 TRP A CE2 1 
+ATOM   690  C CE3 . TRP A 1 110 ? 10.493  7.612   36.267  1.00 17.01 ? ? ? ? ? ? 600 TRP A CE3 1 
+ATOM   691  C CZ2 . TRP A 1 110 ? 10.270  9.124   33.849  1.00 16.96 ? ? ? ? ? ? 600 TRP A CZ2 1 
+ATOM   692  C CZ3 . TRP A 1 110 ? 11.334  7.376   35.175  1.00 17.84 ? ? ? ? ? ? 600 TRP A CZ3 1 
+ATOM   693  C CH2 . TRP A 1 110 ? 11.216  8.135   33.978  1.00 17.15 ? ? ? ? ? ? 600 TRP A CH2 1 
+ATOM   694  N N   . HIS A 1 111 ? 5.343   8.230   37.326  1.00 14.33 ? ? ? ? ? ? 601 HIS A N   1 
+ATOM   695  C CA  . HIS A 1 111 ? 4.372   7.335   36.675  1.00 15.58 ? ? ? ? ? ? 601 HIS A CA  1 
+ATOM   696  C C   . HIS A 1 111 ? 5.053   6.317   35.755  1.00 17.02 ? ? ? ? ? ? 601 HIS A C   1 
+ATOM   697  O O   . HIS A 1 111 ? 4.422   5.361   35.307  1.00 18.55 ? ? ? ? ? ? 601 HIS A O   1 
+ATOM   698  C CB  . HIS A 1 111 ? 3.323   8.140   35.903  1.00 16.18 ? ? ? ? ? ? 601 HIS A CB  1 
+ATOM   699  C CG  . HIS A 1 111 ? 3.912   9.001   34.841  1.00 16.40 ? ? ? ? ? ? 601 HIS A CG  1 
+ATOM   700  N ND1 . HIS A 1 111 ? 4.603   10.157  35.128  1.00 16.72 ? ? ? ? ? ? 601 HIS A ND1 1 
+ATOM   701  C CD2 . HIS A 1 111 ? 4.004   8.826   33.501  1.00 17.39 ? ? ? ? ? ? 601 HIS A CD2 1 
+ATOM   702  C CE1 . HIS A 1 111 ? 5.110   10.657  34.013  1.00 16.87 ? ? ? ? ? ? 601 HIS A CE1 1 
+ATOM   703  N NE2 . HIS A 1 111 ? 4.761   9.870   33.011  1.00 18.08 ? ? ? ? ? ? 601 HIS A NE2 1 
+ATOM   704  N N   . ASN A 1 112 ? 6.345   6.507   35.506  1.00 18.40 ? ? ? ? ? ? 602 ASN A N   1 
+ATOM   705  C CA  . ASN A 1 112 ? 7.113   5.610   34.658  1.00 21.87 ? ? ? ? ? ? 602 ASN A CA  1 
+ATOM   706  C C   . ASN A 1 112 ? 8.127   4.831   35.472  1.00 23.10 ? ? ? ? ? ? 602 ASN A C   1 
+ATOM   707  O O   . ASN A 1 112 ? 8.551   5.240   36.557  1.00 22.55 ? ? ? ? ? ? 602 ASN A O   1 
+ATOM   708  C CB  . ASN A 1 112 ? 7.922   6.380   33.613  1.00 24.59 ? ? ? ? ? ? 602 ASN A CB  1 
+ATOM   709  C CG  . ASN A 1 112 ? 7.121   6.744   32.368  1.00 28.41 ? ? ? ? ? ? 602 ASN A CG  1 
+ATOM   710  O OD1 . ASN A 1 112 ? 6.090   6.128   32.041  1.00 29.43 ? ? ? ? ? ? 602 ASN A OD1 1 
+ATOM   711  N ND2 . ASN A 1 112 ? 7.605   7.764   31.650  1.00 29.84 ? ? ? ? ? ? 602 ASN A ND2 1 
+ATOM   712  N N   . GLN A 1 113 ? 8.585   3.750   34.854  1.00 24.98 ? ? ? ? ? ? 603 GLN A N   1 
+ATOM   713  C CA  . GLN A 1 113 ? 9.599   2.878   35.419  1.00 25.68 ? ? ? ? ? ? 603 GLN A CA  1 
+ATOM   714  C C   . GLN A 1 113 ? 9.289   2.332   36.803  1.00 23.01 ? ? ? ? ? ? 603 GLN A C   1 
+ATOM   715  O O   . GLN A 1 113 ? 10.134  2.400   37.714  1.00 23.45 ? ? ? ? ? ? 603 GLN A O   1 
+ATOM   716  C CB  . GLN A 1 113 ? 10.972  3.562   35.353  1.00 27.56 ? ? ? ? ? ? 603 GLN A CB  1 
+ATOM   717  C CG  . GLN A 1 113 ? 11.443  3.709   33.899  1.00 30.86 ? ? ? ? ? ? 603 GLN A CG  1 
+ATOM   718  C CD  . GLN A 1 113 ? 12.862  4.225   33.797  1.00 32.75 ? ? ? ? ? ? 603 GLN A CD  1 
+ATOM   719  O OE1 . GLN A 1 113 ? 13.107  5.300   33.228  1.00 33.45 ? ? ? ? ? ? 603 GLN A OE1 1 
+ATOM   720  N NE2 . GLN A 1 113 ? 13.814  3.475   34.374  1.00 33.88 ? ? ? ? ? ? 603 GLN A NE2 1 
+ATOM   721  N N   . ASN A 1 114 ? 8.073   1.798   36.928  1.00 20.85 ? ? ? ? ? ? 604 ASN A N   1 
+ATOM   722  C CA  . ASN A 1 114 ? 7.592   1.161   38.162  1.00 19.41 ? ? ? ? ? ? 604 ASN A CA  1 
+ATOM   723  C C   . ASN A 1 114 ? 7.675   -0.357  37.950  1.00 18.99 ? ? ? ? ? ? 604 ASN A C   1 
+ATOM   724  O O   . ASN A 1 114 ? 7.438   -0.822  36.840  1.00 19.39 ? ? ? ? ? ? 604 ASN A O   1 
+ATOM   725  C CB  . ASN A 1 114 ? 6.183   1.634   38.504  1.00 18.42 ? ? ? ? ? ? 604 ASN A CB  1 
+ATOM   726  C CG  . ASN A 1 114 ? 6.193   3.041   39.070  1.00 18.72 ? ? ? ? ? ? 604 ASN A CG  1 
+ATOM   727  O OD1 . ASN A 1 114 ? 7.092   3.376   39.851  1.00 18.40 ? ? ? ? ? ? 604 ASN A OD1 1 
+ATOM   728  N ND2 . ASN A 1 114 ? 5.267   3.891   38.623  1.00 17.42 ? ? ? ? ? ? 604 ASN A ND2 1 
+ATOM   729  N N   . PRO A 1 115 ? 8.077   -1.136  38.990  1.00 17.69 ? ? ? ? ? ? 605 PRO A N   1 
+ATOM   730  C CA  . PRO A 1 115 ? 8.197   -2.601  38.854  1.00 17.36 ? ? ? ? ? ? 605 PRO A CA  1 
+ATOM   731  C C   . PRO A 1 115 ? 6.858   -3.303  38.643  1.00 17.68 ? ? ? ? ? ? 605 PRO A C   1 
+ATOM   732  O O   . PRO A 1 115 ? 5.821   -2.823  39.124  1.00 17.77 ? ? ? ? ? ? 605 PRO A O   1 
+ATOM   733  C CB  . PRO A 1 115 ? 8.899   -3.010  40.157  1.00 16.74 ? ? ? ? ? ? 605 PRO A CB  1 
+ATOM   734  C CG  . PRO A 1 115 ? 8.427   -2.003  41.135  1.00 16.28 ? ? ? ? ? ? 605 PRO A CG  1 
+ATOM   735  C CD  . PRO A 1 115 ? 8.381   -0.705  40.370  1.00 16.92 ? ? ? ? ? ? 605 PRO A CD  1 
+ATOM   736  N N   . SER A 1 116 ? 6.867   -4.445  37.955  1.00 17.92 ? ? ? ? ? ? 606 SER A N   1 
+ATOM   737  C CA  . SER A 1 116 ? 5.613   -5.143  37.691  1.00 19.48 ? ? ? ? ? ? 606 SER A CA  1 
+ATOM   738  C C   . SER A 1 116 ? 4.811   -5.506  38.942  1.00 18.07 ? ? ? ? ? ? 606 SER A C   1 
+ATOM   739  O O   . SER A 1 116 ? 3.588   -5.426  38.920  1.00 18.54 ? ? ? ? ? ? 606 SER A O   1 
+ATOM   740  C CB  . SER A 1 116 ? 5.811   -6.363  36.769  1.00 21.22 ? ? ? ? ? ? 606 SER A CB  1 
+ATOM   741  O OG  . SER A 1 116 ? 6.686   -7.328  37.334  1.00 25.84 ? ? ? ? ? ? 606 SER A OG  1 
+ATOM   742  N N   . TRP A 1 117 ? 5.473   -5.866  40.042  1.00 16.74 ? ? ? ? ? ? 607 TRP A N   1 
+ATOM   743  C CA  . TRP A 1 117 ? 4.715   -6.191  41.265  1.00 16.33 ? ? ? ? ? ? 607 TRP A CA  1 
+ATOM   744  C C   . TRP A 1 117 ? 3.825   -5.007  41.731  1.00 16.73 ? ? ? ? ? ? 607 TRP A C   1 
+ATOM   745  O O   . TRP A 1 117 ? 2.795   -5.204  42.367  1.00 16.73 ? ? ? ? ? ? 607 TRP A O   1 
+ATOM   746  C CB  . TRP A 1 117 ? 5.643   -6.659  42.420  1.00 15.22 ? ? ? ? ? ? 607 TRP A CB  1 
+ATOM   747  C CG  . TRP A 1 117 ? 6.618   -5.609  42.981  1.00 14.09 ? ? ? ? ? ? 607 TRP A CG  1 
+ATOM   748  C CD1 . TRP A 1 117 ? 7.930   -5.436  42.620  1.00 13.83 ? ? ? ? ? ? 607 TRP A CD1 1 
+ATOM   749  C CD2 . TRP A 1 117 ? 6.355   -4.629  43.994  1.00 12.86 ? ? ? ? ? ? 607 TRP A CD2 1 
+ATOM   750  N NE1 . TRP A 1 117 ? 8.486   -4.420  43.345  1.00 12.89 ? ? ? ? ? ? 607 TRP A NE1 1 
+ATOM   751  C CE2 . TRP A 1 117 ? 7.547   -3.902  44.193  1.00 12.33 ? ? ? ? ? ? 607 TRP A CE2 1 
+ATOM   752  C CE3 . TRP A 1 117 ? 5.226   -4.292  44.755  1.00 12.56 ? ? ? ? ? ? 607 TRP A CE3 1 
+ATOM   753  C CZ2 . TRP A 1 117 ? 7.644   -2.854  45.125  1.00 12.72 ? ? ? ? ? ? 607 TRP A CZ2 1 
+ATOM   754  C CZ3 . TRP A 1 117 ? 5.322   -3.258  45.682  1.00 12.84 ? ? ? ? ? ? 607 TRP A CZ3 1 
+ATOM   755  C CH2 . TRP A 1 117 ? 6.524   -2.550  45.859  1.00 12.54 ? ? ? ? ? ? 607 TRP A CH2 1 
+ATOM   756  N N   . LEU A 1 118 ? 4.234   -3.773  41.426  1.00 17.25 ? ? ? ? ? ? 608 LEU A N   1 
+ATOM   757  C CA  . LEU A 1 118 ? 3.468   -2.612  41.842  1.00 18.31 ? ? ? ? ? ? 608 LEU A CA  1 
+ATOM   758  C C   . LEU A 1 118 ? 2.344   -2.347  40.860  1.00 20.96 ? ? ? ? ? ? 608 LEU A C   1 
+ATOM   759  O O   . LEU A 1 118 ? 1.177   -2.344  41.243  1.00 20.05 ? ? ? ? ? ? 608 LEU A O   1 
+ATOM   760  C CB  . LEU A 1 118 ? 4.363   -1.370  41.947  1.00 17.68 ? ? ? ? ? ? 608 LEU A CB  1 
+ATOM   761  C CG  . LEU A 1 118 ? 3.726   -0.083  42.492  1.00 18.22 ? ? ? ? ? ? 608 LEU A CG  1 
+ATOM   762  C CD1 . LEU A 1 118 ? 3.524   -0.203  43.987  1.00 18.68 ? ? ? ? ? ? 608 LEU A CD1 1 
+ATOM   763  C CD2 . LEU A 1 118 ? 4.595   1.110   42.189  1.00 18.34 ? ? ? ? ? ? 608 LEU A CD2 1 
+ATOM   764  N N   . THR A 1 119 ? 2.691   -2.187  39.581  1.00 24.00 ? ? ? ? ? ? 609 THR A N   1 
+ATOM   765  C CA  . THR A 1 119 ? 1.673   -1.864  38.577  1.00 26.97 ? ? ? ? ? ? 609 THR A CA  1 
+ATOM   766  C C   . THR A 1 119 ? 0.589   -2.934  38.368  1.00 28.56 ? ? ? ? ? ? 609 THR A C   1 
+ATOM   767  O O   . THR A 1 119 ? -0.521  -2.610  37.943  1.00 29.27 ? ? ? ? ? ? 609 THR A O   1 
+ATOM   768  C CB  . THR A 1 119 ? 2.294   -1.445  37.231  1.00 27.45 ? ? ? ? ? ? 609 THR A CB  1 
+ATOM   769  O OG1 . THR A 1 119 ? 3.005   -2.548  36.659  1.00 28.41 ? ? ? ? ? ? 609 THR A OG1 1 
+ATOM   770  C CG2 . THR A 1 119 ? 3.253   -0.285  37.431  1.00 27.49 ? ? ? ? ? ? 609 THR A CG2 1 
+ATOM   771  N N   . ASN A 1 120 ? 0.901   -4.184  38.700  1.00 30.11 ? ? ? ? ? ? 610 ASN A N   1 
+ATOM   772  C CA  . ASN A 1 120 ? -0.052  -5.285  38.566  1.00 32.17 ? ? ? ? ? ? 610 ASN A CA  1 
+ATOM   773  C C   . ASN A 1 120 ? -0.599  -5.744  39.909  1.00 32.33 ? ? ? ? ? ? 610 ASN A C   1 
+ATOM   774  O O   . ASN A 1 120 ? -1.176  -6.829  39.985  1.00 33.65 ? ? ? ? ? ? 610 ASN A O   1 
+ATOM   775  C CB  . ASN A 1 120 ? 0.593   -6.510  37.906  1.00 34.50 ? ? ? ? ? ? 610 ASN A CB  1 
+ATOM   776  C CG  . ASN A 1 120 ? 0.848   -6.323  36.428  1.00 36.74 ? ? ? ? ? ? 610 ASN A CG  1 
+ATOM   777  O OD1 . ASN A 1 120 ? 1.843   -6.836  35.895  1.00 37.95 ? ? ? ? ? ? 610 ASN A OD1 1 
+ATOM   778  N ND2 . ASN A 1 120 ? -0.050  -5.607  35.744  1.00 37.38 ? ? ? ? ? ? 610 ASN A ND2 1 
+ATOM   779  N N   . GLY A 1 121 ? -0.369  -4.985  40.976  1.00 31.38 ? ? ? ? ? ? 611 GLY A N   1 
+ATOM   780  C CA  . GLY A 1 121 ? -0.869  -5.402  42.278  1.00 30.87 ? ? ? ? ? ? 611 GLY A CA  1 
+ATOM   781  C C   . GLY A 1 121 ? -2.325  -5.010  42.479  1.00 30.76 ? ? ? ? ? ? 611 GLY A C   1 
+ATOM   782  O O   . GLY A 1 121 ? -2.904  -4.360  41.602  1.00 30.48 ? ? ? ? ? ? 611 GLY A O   1 
+ATOM   783  N N   . ASN A 1 122 ? -2.928  -5.448  43.589  1.00 30.43 ? ? ? ? ? ? 612 ASN A N   1 
+ATOM   784  C CA  . ASN A 1 122 ? -4.315  -5.088  43.914  1.00 30.99 ? ? ? ? ? ? 612 ASN A CA  1 
+ATOM   785  C C   . ASN A 1 122 ? -4.220  -4.106  45.082  1.00 27.51 ? ? ? ? ? ? 612 ASN A C   1 
+ATOM   786  O O   . ASN A 1 122 ? -3.914  -4.484  46.216  1.00 27.46 ? ? ? ? ? ? 612 ASN A O   1 
+ATOM   787  C CB  . ASN A 1 122 ? -5.198  -6.327  44.268  1.00 35.14 ? ? ? ? ? ? 612 ASN A CB  1 
+ATOM   788  C CG  . ASN A 1 122 ? -4.897  -6.918  45.670  1.00 38.55 ? ? ? ? ? ? 612 ASN A CG  1 
+ATOM   789  O OD1 . ASN A 1 122 ? -3.799  -7.452  45.918  1.00 40.71 ? ? ? ? ? ? 612 ASN A OD1 1 
+ATOM   790  N ND2 . ASN A 1 122 ? -5.879  -6.826  46.586  1.00 39.60 ? ? ? ? ? ? 612 ASN A ND2 1 
+ATOM   791  N N   . TRP A 1 123 ? -4.403  -2.827  44.776  1.00 23.48 ? ? ? ? ? ? 613 TRP A N   1 
+ATOM   792  C CA  . TRP A 1 123 ? -4.283  -1.796  45.798  1.00 20.49 ? ? ? ? ? ? 613 TRP A CA  1 
+ATOM   793  C C   . TRP A 1 123 ? -5.533  -0.978  46.026  1.00 18.93 ? ? ? ? ? ? 613 TRP A C   1 
+ATOM   794  O O   . TRP A 1 123 ? -6.445  -0.929  45.197  1.00 20.20 ? ? ? ? ? ? 613 TRP A O   1 
+ATOM   795  C CB  . TRP A 1 123 ? -3.152  -0.794  45.438  1.00 19.01 ? ? ? ? ? ? 613 TRP A CB  1 
+ATOM   796  C CG  . TRP A 1 123 ? -1.865  -1.396  44.966  1.00 17.06 ? ? ? ? ? ? 613 TRP A CG  1 
+ATOM   797  C CD1 . TRP A 1 123 ? -1.404  -1.447  43.670  1.00 16.68 ? ? ? ? ? ? 613 TRP A CD1 1 
+ATOM   798  C CD2 . TRP A 1 123 ? -0.909  -2.107  45.764  1.00 16.08 ? ? ? ? ? ? 613 TRP A CD2 1 
+ATOM   799  N NE1 . TRP A 1 123 ? -0.231  -2.170  43.619  1.00 17.17 ? ? ? ? ? ? 613 TRP A NE1 1 
+ATOM   800  C CE2 . TRP A 1 123 ? 0.097   -2.586  44.886  1.00 16.28 ? ? ? ? ? ? 613 TRP A CE2 1 
+ATOM   801  C CE3 . TRP A 1 123 ? -0.807  -2.399  47.134  1.00 15.80 ? ? ? ? ? ? 613 TRP A CE3 1 
+ATOM   802  C CZ2 . TRP A 1 123 ? 1.194   -3.349  45.337  1.00 15.62 ? ? ? ? ? ? 613 TRP A CZ2 1 
+ATOM   803  C CZ3 . TRP A 1 123 ? 0.283   -3.157  47.578  1.00 15.59 ? ? ? ? ? ? 613 TRP A CZ3 1 
+ATOM   804  C CH2 . TRP A 1 123 ? 1.266   -3.621  46.674  1.00 14.65 ? ? ? ? ? ? 613 TRP A CH2 1 
+ATOM   805  N N   . ASN A 1 124 ? -5.552  -0.333  47.179  1.00 17.76 ? ? ? ? ? ? 614 ASN A N   1 
+ATOM   806  C CA  . ASN A 1 124 ? -6.587  0.616   47.534  1.00 17.17 ? ? ? ? ? ? 614 ASN A CA  1 
+ATOM   807  C C   . ASN A 1 124 ? -5.789  1.786   48.132  1.00 16.19 ? ? ? ? ? ? 614 ASN A C   1 
+ATOM   808  O O   . ASN A 1 124 ? -4.554  1.697   48.284  1.00 15.42 ? ? ? ? ? ? 614 ASN A O   1 
+ATOM   809  C CB  . ASN A 1 124 ? -7.633  0.044   48.514  1.00 19.14 ? ? ? ? ? ? 614 ASN A CB  1 
+ATOM   810  C CG  . ASN A 1 124 ? -7.017  -0.612  49.723  1.00 20.31 ? ? ? ? ? ? 614 ASN A CG  1 
+ATOM   811  O OD1 . ASN A 1 124 ? -6.364  0.024   50.535  1.00 20.35 ? ? ? ? ? ? 614 ASN A OD1 1 
+ATOM   812  N ND2 . ASN A 1 124 ? -7.219  -1.909  49.837  1.00 23.30 ? ? ? ? ? ? 614 ASN A ND2 1 
+ATOM   813  N N   . ARG A 1 125 ? -6.473  2.886   48.433  1.00 15.45 ? ? ? ? ? ? 615 ARG A N   1 
+ATOM   814  C CA  . ARG A 1 125 ? -5.807  4.059   48.967  1.00 15.10 ? ? ? ? ? ? 615 ARG A CA  1 
+ATOM   815  C C   . ARG A 1 125 ? -4.887  3.748   50.147  1.00 16.05 ? ? ? ? ? ? 615 ARG A C   1 
+ATOM   816  O O   . ARG A 1 125 ? -3.707  4.102   50.141  1.00 14.73 ? ? ? ? ? ? 615 ARG A O   1 
+ATOM   817  C CB  . ARG A 1 125 ? -6.832  5.118   49.351  1.00 14.82 ? ? ? ? ? ? 615 ARG A CB  1 
+ATOM   818  C CG  . ARG A 1 125 ? -6.241  6.298   50.074  1.00 14.60 ? ? ? ? ? ? 615 ARG A CG  1 
+ATOM   819  C CD  . ARG A 1 125 ? -7.312  7.302   50.370  1.00 15.50 ? ? ? ? ? ? 615 ARG A CD  1 
+ATOM   820  N NE  . ARG A 1 125 ? -6.854  8.349   51.277  1.00 16.81 ? ? ? ? ? ? 615 ARG A NE  1 
+ATOM   821  C CZ  . ARG A 1 125 ? -6.429  9.551   50.882  1.00 18.20 ? ? ? ? ? ? 615 ARG A CZ  1 
+ATOM   822  N NH1 . ARG A 1 125 ? -6.380  9.874   49.590  1.00 17.86 ? ? ? ? ? ? 615 ARG A NH1 1 
+ATOM   823  N NH2 . ARG A 1 125 ? -6.152  10.474  51.784  1.00 18.91 ? ? ? ? ? ? 615 ARG A NH2 1 
+ATOM   824  N N   . ASP A 1 126 ? -5.425  3.057   51.145  1.00 15.90 ? ? ? ? ? ? 616 ASP A N   1 
+ATOM   825  C CA  . ASP A 1 126 ? -4.655  2.713   52.328  1.00 17.46 ? ? ? ? ? ? 616 ASP A CA  1 
+ATOM   826  C C   . ASP A 1 126 ? -3.456  1.807   52.102  1.00 15.67 ? ? ? ? ? ? 616 ASP A C   1 
+ATOM   827  O O   . ASP A 1 126 ? -2.371  2.096   52.629  1.00 15.23 ? ? ? ? ? ? 616 ASP A O   1 
+ATOM   828  C CB  . ASP A 1 126 ? -5.580  2.127   53.389  1.00 21.46 ? ? ? ? ? ? 616 ASP A CB  1 
+ATOM   829  C CG  . ASP A 1 126 ? -6.650  3.110   53.802  1.00 25.12 ? ? ? ? ? ? 616 ASP A CG  1 
+ATOM   830  O OD1 . ASP A 1 126 ? -6.284  4.218   54.252  1.00 27.38 ? ? ? ? ? ? 616 ASP A OD1 1 
+ATOM   831  O OD2 . ASP A 1 126 ? -7.849  2.799   53.633  1.00 28.94 ? ? ? ? ? ? 616 ASP A OD2 1 
+ATOM   832  N N   . SER A 1 127 ? -3.607  0.752   51.305  1.00 14.18 ? ? ? ? ? ? 617 SER A N   1 
+ATOM   833  C CA  . SER A 1 127 ? -2.466  -0.129  51.084  1.00 14.14 ? ? ? ? ? ? 617 SER A CA  1 
+ATOM   834  C C   . SER A 1 127 ? -1.383  0.495   50.188  1.00 12.70 ? ? ? ? ? ? 617 SER A C   1 
+ATOM   835  O O   . SER A 1 127 ? -0.199  0.236   50.396  1.00 13.67 ? ? ? ? ? ? 617 SER A O   1 
+ATOM   836  C CB  . SER A 1 127 ? -2.869  -1.517  50.605  1.00 13.73 ? ? ? ? ? ? 617 SER A CB  1 
+ATOM   837  O OG  . SER A 1 127 ? -3.623  -1.462  49.423  1.00 15.18 ? ? ? ? ? ? 617 SER A OG  1 
+ATOM   838  N N   . LEU A 1 128 ? -1.774  1.353   49.248  1.00 12.05 ? ? ? ? ? ? 618 LEU A N   1 
+ATOM   839  C CA  . LEU A 1 128 ? -0.775  1.994   48.379  1.00 10.58 ? ? ? ? ? ? 618 LEU A CA  1 
+ATOM   840  C C   . LEU A 1 128 ? -0.023  3.086   49.136  1.00 9.82  ? ? ? ? ? ? 618 LEU A C   1 
+ATOM   841  O O   . LEU A 1 128 ? 1.161   3.272   48.906  1.00 10.65 ? ? ? ? ? ? 618 LEU A O   1 
+ATOM   842  C CB  . LEU A 1 128 ? -1.393  2.512   47.079  1.00 11.64 ? ? ? ? ? ? 618 LEU A CB  1 
+ATOM   843  C CG  . LEU A 1 128 ? -0.359  2.827   45.986  1.00 11.43 ? ? ? ? ? ? 618 LEU A CG  1 
+ATOM   844  C CD1 . LEU A 1 128 ? 0.495   1.568   45.651  1.00 11.33 ? ? ? ? ? ? 618 LEU A CD1 1 
+ATOM   845  C CD2 . LEU A 1 128 ? -1.068  3.369   44.750  1.00 10.85 ? ? ? ? ? ? 618 LEU A CD2 1 
+ATOM   846  N N   . LEU A 1 129 ? -0.685  3.792   50.056  1.00 9.97  ? ? ? ? ? ? 619 LEU A N   1 
+ATOM   847  C CA  . LEU A 1 129 ? -0.005  4.792   50.879  1.00 10.83 ? ? ? ? ? ? 619 LEU A CA  1 
+ATOM   848  C C   . LEU A 1 129 ? 1.065   4.109   51.735  1.00 10.94 ? ? ? ? ? ? 619 LEU A C   1 
+ATOM   849  O O   . LEU A 1 129 ? 2.139   4.665   51.971  1.00 11.62 ? ? ? ? ? ? 619 LEU A O   1 
+ATOM   850  C CB  . LEU A 1 129 ? -0.984  5.554   51.796  1.00 11.99 ? ? ? ? ? ? 619 LEU A CB  1 
+ATOM   851  C CG  . LEU A 1 129 ? -1.709  6.778   51.185  1.00 13.01 ? ? ? ? ? ? 619 LEU A CG  1 
+ATOM   852  C CD1 . LEU A 1 129 ? -2.746  7.313   52.179  1.00 13.81 ? ? ? ? ? ? 619 LEU A CD1 1 
+ATOM   853  C CD2 . LEU A 1 129 ? -0.688  7.902   50.822  1.00 12.30 ? ? ? ? ? ? 619 LEU A CD2 1 
+ATOM   854  N N   . ALA A 1 130 ? 0.774   2.892   52.201  1.00 10.98 ? ? ? ? ? ? 620 ALA A N   1 
+ATOM   855  C CA  . ALA A 1 130 ? 1.741   2.146   53.021  1.00 10.92 ? ? ? ? ? ? 620 ALA A CA  1 
+ATOM   856  C C   . ALA A 1 130 ? 2.967   1.773   52.195  1.00 9.46  ? ? ? ? ? ? 620 ALA A C   1 
+ATOM   857  O O   . ALA A 1 130 ? 4.088   1.827   52.704  1.00 10.27 ? ? ? ? ? ? 620 ALA A O   1 
+ATOM   858  C CB  . ALA A 1 130 ? 1.093   0.874   53.626  1.00 12.09 ? ? ? ? ? ? 620 ALA A CB  1 
+ATOM   859  N N   . VAL A 1 131 ? 2.751   1.347   50.949  1.00 10.05 ? ? ? ? ? ? 621 VAL A N   1 
+ATOM   860  C CA  . VAL A 1 131 ? 3.858   1.013   50.040  1.00 10.26 ? ? ? ? ? ? 621 VAL A CA  1 
+ATOM   861  C C   . VAL A 1 131 ? 4.702   2.284   49.769  1.00 10.57 ? ? ? ? ? ? 621 VAL A C   1 
+ATOM   862  O O   . VAL A 1 131 ? 5.945   2.240   49.782  1.00 10.12 ? ? ? ? ? ? 621 VAL A O   1 
+ATOM   863  C CB  . VAL A 1 131 ? 3.352   0.437   48.681  1.00 11.18 ? ? ? ? ? ? 621 VAL A CB  1 
+ATOM   864  C CG1 . VAL A 1 131 ? 4.512   0.327   47.670  1.00 11.63 ? ? ? ? ? ? 621 VAL A CG1 1 
+ATOM   865  C CG2 . VAL A 1 131 ? 2.735   -0.949  48.901  1.00 12.07 ? ? ? ? ? ? 621 VAL A CG2 1 
+ATOM   866  N N   . MET A 1 132 ? 4.021   3.408   49.538  1.00 10.55 ? ? ? ? ? ? 622 MET A N   1 
+ATOM   867  C CA  . MET A 1 132 ? 4.710   4.673   49.282  1.00 10.33 ? ? ? ? ? ? 622 MET A CA  1 
+ATOM   868  C C   . MET A 1 132 ? 5.591   5.048   50.473  1.00 9.76  ? ? ? ? ? ? 622 MET A C   1 
+ATOM   869  O O   . MET A 1 132 ? 6.758   5.392   50.327  1.00 9.72  ? ? ? ? ? ? 622 MET A O   1 
+ATOM   870  C CB  . MET A 1 132 ? 3.692   5.788   49.046  1.00 10.72 ? ? ? ? ? ? 622 MET A CB  1 
+ATOM   871  C CG  . MET A 1 132 ? 4.362   7.162   48.839  1.00 13.07 ? ? ? ? ? ? 622 MET A CG  1 
+ATOM   872  S SD  . MET A 1 132 ? 3.254   8.586   48.839  1.00 15.12 ? ? ? ? ? ? 622 MET A SD  1 
+ATOM   873  C CE  . MET A 1 132 ? 2.703   8.419   47.297  1.00 12.69 ? ? ? ? ? ? 622 MET A CE  1 
+ATOM   874  N N   . LYS A 1 133 ? 5.024   4.977   51.672  1.00 10.07 ? ? ? ? ? ? 623 LYS A N   1 
+ATOM   875  C CA  . LYS A 1 133 ? 5.759   5.315   52.890  1.00 10.43 ? ? ? ? ? ? 623 LYS A CA  1 
+ATOM   876  C C   . LYS A 1 133 ? 6.951   4.396   53.133  1.00 9.10  ? ? ? ? ? ? 623 LYS A C   1 
+ATOM   877  O O   . LYS A 1 133 ? 8.010   4.862   53.539  1.00 9.69  ? ? ? ? ? ? 623 LYS A O   1 
+ATOM   878  C CB  . LYS A 1 133 ? 4.825   5.289   54.112  1.00 12.96 ? ? ? ? ? ? 623 LYS A CB  1 
+ATOM   879  C CG  . LYS A 1 133 ? 5.464   5.848   55.382  1.00 16.43 ? ? ? ? ? ? 623 LYS A CG  1 
+ATOM   880  C CD  . LYS A 1 133 ? 4.515   5.738   56.577  1.00 20.46 ? ? ? ? ? ? 623 LYS A CD  1 
+ATOM   881  C CE  . LYS A 1 133 ? 5.240   5.954   57.939  1.00 24.16 ? ? ? ? ? ? 623 LYS A CE  1 
+ATOM   882  N NZ  . LYS A 1 133 ? 5.820   7.330   58.167  1.00 27.21 ? ? ? ? ? ? 623 LYS A NZ  1 
+ATOM   883  N N   . ASN A 1 134 ? 6.801   3.098   52.886  1.00 9.04  ? ? ? ? ? ? 624 ASN A N   1 
+ATOM   884  C CA  . ASN A 1 134 ? 7.911   2.167   53.097  1.00 9.13  ? ? ? ? ? ? 624 ASN A CA  1 
+ATOM   885  C C   . ASN A 1 134 ? 9.057   2.416   52.100  1.00 9.34  ? ? ? ? ? ? 624 ASN A C   1 
+ATOM   886  O O   . ASN A 1 134 ? 10.248  2.356   52.464  1.00 9.65  ? ? ? ? ? ? 624 ASN A O   1 
+ATOM   887  C CB  . ASN A 1 134 ? 7.456   0.716   52.955  1.00 9.98  ? ? ? ? ? ? 624 ASN A CB  1 
+ATOM   888  C CG  . ASN A 1 134 ? 8.564   -0.261  53.302  1.00 10.67 ? ? ? ? ? ? 624 ASN A CG  1 
+ATOM   889  O OD1 . ASN A 1 134 ? 9.196   -0.123  54.333  1.00 12.28 ? ? ? ? ? ? 624 ASN A OD1 1 
+ATOM   890  N ND2 . ASN A 1 134 ? 8.817   -1.222  52.438  1.00 12.13 ? ? ? ? ? ? 624 ASN A ND2 1 
+ATOM   891  N N   . HIS A 1 135 ? 8.696   2.709   50.847  1.00 8.84  ? ? ? ? ? ? 625 HIS A N   1 
+ATOM   892  C CA  . HIS A 1 135 ? 9.711   2.972   49.813  1.00 8.77  ? ? ? ? ? ? 625 HIS A CA  1 
+ATOM   893  C C   . HIS A 1 135 ? 10.495  4.245   50.131  1.00 8.46  ? ? ? ? ? ? 625 HIS A C   1 
+ATOM   894  O O   . HIS A 1 135 ? 11.738  4.238   50.176  1.00 8.85  ? ? ? ? ? ? 625 HIS A O   1 
+ATOM   895  C CB  . HIS A 1 135 ? 9.087   3.107   48.427  1.00 8.52  ? ? ? ? ? ? 625 HIS A CB  1 
+ATOM   896  C CG  . HIS A 1 135 ? 10.107  3.225   47.336  1.00 9.38  ? ? ? ? ? ? 625 HIS A CG  1 
+ATOM   897  N ND1 . HIS A 1 135 ? 10.784  2.136   46.830  1.00 8.97  ? ? ? ? ? ? 625 HIS A ND1 1 
+ATOM   898  C CD2 . HIS A 1 135 ? 10.620  4.313   46.709  1.00 8.92  ? ? ? ? ? ? 625 HIS A CD2 1 
+ATOM   899  C CE1 . HIS A 1 135 ? 11.671  2.545   45.939  1.00 10.05 ? ? ? ? ? ? 625 HIS A CE1 1 
+ATOM   900  N NE2 . HIS A 1 135 ? 11.588  3.862   45.848  1.00 9.43  ? ? ? ? ? ? 625 HIS A NE2 1 
+ATOM   901  N N   . ILE A 1 136 ? 9.767   5.331   50.359  1.00 8.47  ? ? ? ? ? ? 626 ILE A N   1 
+ATOM   902  C CA  . ILE A 1 136 ? 10.391  6.607   50.669  1.00 8.25  ? ? ? ? ? ? 626 ILE A CA  1 
+ATOM   903  C C   . ILE A 1 136 ? 11.262  6.554   51.939  1.00 8.45  ? ? ? ? ? ? 626 ILE A C   1 
+ATOM   904  O O   . ILE A 1 136 ? 12.402  7.007   51.934  1.00 9.43  ? ? ? ? ? ? 626 ILE A O   1 
+ATOM   905  C CB  . ILE A 1 136 ? 9.336   7.715   50.788  1.00 8.46  ? ? ? ? ? ? 626 ILE A CB  1 
+ATOM   906  C CG1 . ILE A 1 136 ? 8.700   7.983   49.408  1.00 7.70  ? ? ? ? ? ? 626 ILE A CG1 1 
+ATOM   907  C CG2 . ILE A 1 136 ? 9.939   8.990   51.394  1.00 8.27  ? ? ? ? ? ? 626 ILE A CG2 1 
+ATOM   908  C CD1 . ILE A 1 136 ? 7.628   9.109   49.417  1.00 7.92  ? ? ? ? ? ? 626 ILE A CD1 1 
+ATOM   909  N N   . THR A 1 137 ? 10.744  5.987   53.021  1.00 7.57  ? ? ? ? ? ? 627 THR A N   1 
+ATOM   910  C CA  . THR A 1 137 ? 11.483  5.928   54.281  1.00 8.15  ? ? ? ? ? ? 627 THR A CA  1 
+ATOM   911  C C   . THR A 1 137 ? 12.722  5.043   54.218  1.00 7.29  ? ? ? ? ? ? 627 THR A C   1 
+ATOM   912  O O   . THR A 1 137 ? 13.794  5.433   54.695  1.00 8.36  ? ? ? ? ? ? 627 THR A O   1 
+ATOM   913  C CB  . THR A 1 137 ? 10.571  5.431   55.438  1.00 9.80  ? ? ? ? ? ? 627 THR A CB  1 
+ATOM   914  O OG1 . THR A 1 137 ? 9.432   6.305   55.538  1.00 11.76 ? ? ? ? ? ? 627 THR A OG1 1 
+ATOM   915  C CG2 . THR A 1 137 ? 11.329  5.422   56.764  1.00 10.40 ? ? ? ? ? ? 627 THR A CG2 1 
+ATOM   916  N N   . THR A 1 138 ? 12.590  3.860   53.619  1.00 7.73  ? ? ? ? ? ? 628 THR A N   1 
+ATOM   917  C CA  . THR A 1 138 ? 13.726  2.926   53.512  1.00 8.21  ? ? ? ? ? ? 628 THR A CA  1 
+ATOM   918  C C   . THR A 1 138 ? 14.868  3.500   52.651  1.00 8.19  ? ? ? ? ? ? 628 THR A C   1 
+ATOM   919  O O   . THR A 1 138 ? 16.022  3.463   53.044  1.00 9.68  ? ? ? ? ? ? 628 THR A O   1 
+ATOM   920  C CB  . THR A 1 138 ? 13.274  1.517   52.973  1.00 8.77  ? ? ? ? ? ? 628 THR A CB  1 
+ATOM   921  O OG1 . THR A 1 138 ? 12.290  0.966   53.866  1.00 9.58  ? ? ? ? ? ? 628 THR A OG1 1 
+ATOM   922  C CG2 . THR A 1 138 ? 14.462  0.544   52.855  1.00 9.50  ? ? ? ? ? ? 628 THR A CG2 1 
+ATOM   923  N N   . VAL A 1 139 ? 14.537  4.083   51.503  1.00 8.25  ? ? ? ? ? ? 629 VAL A N   1 
+ATOM   924  C CA  . VAL A 1 139 ? 15.552  4.643   50.615  1.00 7.68  ? ? ? ? ? ? 629 VAL A CA  1 
+ATOM   925  C C   . VAL A 1 139 ? 16.220  5.899   51.214  1.00 7.02  ? ? ? ? ? ? 629 VAL A C   1 
+ATOM   926  O O   . VAL A 1 139 ? 17.450  5.990   51.301  1.00 7.73  ? ? ? ? ? ? 629 VAL A O   1 
+ATOM   927  C CB  . VAL A 1 139 ? 14.916  4.979   49.221  1.00 8.14  ? ? ? ? ? ? 629 VAL A CB  1 
+ATOM   928  C CG1 . VAL A 1 139 ? 15.951  5.696   48.345  1.00 8.60  ? ? ? ? ? ? 629 VAL A CG1 1 
+ATOM   929  C CG2 . VAL A 1 139 ? 14.451  3.707   48.524  1.00 8.99  ? ? ? ? ? ? 629 VAL A CG2 1 
+ATOM   930  N N   . MET A 1 140 ? 15.407  6.849   51.687  1.00 7.56  ? ? ? ? ? ? 630 MET A N   1 
+ATOM   931  C CA  . MET A 1 140 ? 15.976  8.065   52.251  1.00 7.96  ? ? ? ? ? ? 630 MET A CA  1 
+ATOM   932  C C   . MET A 1 140 ? 16.794  7.865   53.532  1.00 9.50  ? ? ? ? ? ? 630 MET A C   1 
+ATOM   933  O O   . MET A 1 140 ? 17.769  8.579   53.744  1.00 11.04 ? ? ? ? ? ? 630 MET A O   1 
+ATOM   934  C CB  . MET A 1 140 ? 14.914  9.151   52.425  1.00 8.46  ? ? ? ? ? ? 630 MET A CB  1 
+ATOM   935  C CG  . MET A 1 140 ? 14.424  9.705   51.072  1.00 9.69  ? ? ? ? ? ? 630 MET A CG  1 
+ATOM   936  S SD  . MET A 1 140 ? 13.266  11.064  51.234  1.00 10.77 ? ? ? ? ? ? 630 MET A SD  1 
+ATOM   937  C CE  . MET A 1 140 ? 14.304  12.370  51.922  1.00 10.43 ? ? ? ? ? ? 630 MET A CE  1 
+ATOM   938  N N   . THR A 1 141 ? 16.390  6.944   54.408  1.00 9.97  ? ? ? ? ? ? 631 THR A N   1 
+ATOM   939  C CA  . THR A 1 141 ? 17.172  6.728   55.644  1.00 10.56 ? ? ? ? ? ? 631 THR A CA  1 
+ATOM   940  C C   . THR A 1 141 ? 18.510  6.048   55.304  1.00 10.31 ? ? ? ? ? ? 631 THR A C   1 
+ATOM   941  O O   . THR A 1 141 ? 19.515  6.312   55.970  1.00 11.18 ? ? ? ? ? ? 631 THR A O   1 
+ATOM   942  C CB  . THR A 1 141 ? 16.406  5.899   56.723  1.00 12.53 ? ? ? ? ? ? 631 THR A CB  1 
+ATOM   943  O OG1 . THR A 1 141 ? 16.166  4.607   56.214  1.00 15.56 ? ? ? ? ? ? 631 THR A OG1 1 
+ATOM   944  C CG2 . THR A 1 141 ? 15.060  6.506   57.065  1.00 12.14 ? ? ? ? ? ? 631 THR A CG2 1 
+ATOM   945  N N   . HIS A 1 142 ? 18.554  5.221   54.250  1.00 9.45  ? ? ? ? ? ? 632 HIS A N   1 
+ATOM   946  C CA  . HIS A 1 142 ? 19.835  4.604   53.845  1.00 10.32 ? ? ? ? ? ? 632 HIS A CA  1 
+ATOM   947  C C   . HIS A 1 142 ? 20.846  5.692   53.435  1.00 10.36 ? ? ? ? ? ? 632 HIS A C   1 
+ATOM   948  O O   . HIS A 1 142 ? 22.060  5.537   53.611  1.00 11.83 ? ? ? ? ? ? 632 HIS A O   1 
+ATOM   949  C CB  . HIS A 1 142 ? 19.654  3.618   52.668  1.00 10.64 ? ? ? ? ? ? 632 HIS A CB  1 
+ATOM   950  C CG  . HIS A 1 142 ? 20.881  2.814   52.356  1.00 10.54 ? ? ? ? ? ? 632 HIS A CG  1 
+ATOM   951  N ND1 . HIS A 1 142 ? 21.407  1.890   53.232  1.00 10.21 ? ? ? ? ? ? 632 HIS A ND1 1 
+ATOM   952  C CD2 . HIS A 1 142 ? 21.707  2.820   51.279  1.00 10.86 ? ? ? ? ? ? 632 HIS A CD2 1 
+ATOM   953  C CE1 . HIS A 1 142 ? 22.504  1.363   52.717  1.00 11.14 ? ? ? ? ? ? 632 HIS A CE1 1 
+ATOM   954  N NE2 . HIS A 1 142 ? 22.708  1.911   51.530  1.00 11.38 ? ? ? ? ? ? 632 HIS A NE2 1 
+ATOM   955  N N   . TYR A 1 143 ? 20.343  6.775   52.844  1.00 11.07 ? ? ? ? ? ? 633 TYR A N   1 
+ATOM   956  C CA  . TYR A 1 143 ? 21.205  7.900   52.393  1.00 11.33 ? ? ? ? ? ? 633 TYR A CA  1 
+ATOM   957  C C   . TYR A 1 143 ? 21.062  9.158   53.264  1.00 12.02 ? ? ? ? ? ? 633 TYR A C   1 
+ATOM   958  O O   . TYR A 1 143 ? 21.485  10.254  52.867  1.00 11.76 ? ? ? ? ? ? 633 TYR A O   1 
+ATOM   959  C CB  . TYR A 1 143 ? 20.856  8.284   50.927  1.00 10.10 ? ? ? ? ? ? 633 TYR A CB  1 
+ATOM   960  C CG  . TYR A 1 143 ? 21.159  7.203   49.926  1.00 9.18  ? ? ? ? ? ? 633 TYR A CG  1 
+ATOM   961  C CD1 . TYR A 1 143 ? 22.477  6.931   49.559  1.00 9.96  ? ? ? ? ? ? 633 TYR A CD1 1 
+ATOM   962  C CD2 . TYR A 1 143 ? 20.147  6.389   49.409  1.00 8.30  ? ? ? ? ? ? 633 TYR A CD2 1 
+ATOM   963  C CE1 . TYR A 1 143 ? 22.783  5.867   48.713  1.00 9.63  ? ? ? ? ? ? 633 TYR A CE1 1 
+ATOM   964  C CE2 . TYR A 1 143 ? 20.451  5.322   48.559  1.00 8.42  ? ? ? ? ? ? 633 TYR A CE2 1 
+ATOM   965  C CZ  . TYR A 1 143 ? 21.781  5.062   48.217  1.00 8.06  ? ? ? ? ? ? 633 TYR A CZ  1 
+ATOM   966  O OH  . TYR A 1 143 ? 22.102  3.985   47.432  1.00 9.73  ? ? ? ? ? ? 633 TYR A OH  1 
+ATOM   967  N N   . LYS A 1 144 ? 20.561  8.991   54.479  1.00 12.16 ? ? ? ? ? ? 634 LYS A N   1 
+ATOM   968  C CA  . LYS A 1 144 ? 20.287  10.133  55.342  1.00 12.74 ? ? ? ? ? ? 634 LYS A CA  1 
+ATOM   969  C C   . LYS A 1 144 ? 21.496  11.034  55.540  1.00 13.36 ? ? ? ? ? ? 634 LYS A C   1 
+ATOM   970  O O   . LYS A 1 144 ? 22.575  10.566  55.904  1.00 13.93 ? ? ? ? ? ? 634 LYS A O   1 
+ATOM   971  C CB  . LYS A 1 144 ? 19.724  9.646   56.684  1.00 14.64 ? ? ? ? ? ? 634 LYS A CB  1 
+ATOM   972  C CG  . LYS A 1 144 ? 19.116  10.726  57.556  1.00 17.90 ? ? ? ? ? ? 634 LYS A CG  1 
+ATOM   973  C CD  . LYS A 1 144 ? 18.686  10.132  58.901  1.00 19.94 ? ? ? ? ? ? 634 LYS A CD  1 
+ATOM   974  C CE  . LYS A 1 144 ? 17.912  11.129  59.780  1.00 22.59 ? ? ? ? ? ? 634 LYS A CE  1 
+ATOM   975  N NZ  . LYS A 1 144 ? 18.737  12.274  60.284  1.00 24.99 ? ? ? ? ? ? 634 LYS A NZ  1 
+ATOM   976  N N   . GLY A 1 145 ? 21.310  12.328  55.266  1.00 12.79 ? ? ? ? ? ? 635 GLY A N   1 
+ATOM   977  C CA  . GLY A 1 145 ? 22.365  13.307  55.428  1.00 13.55 ? ? ? ? ? ? 635 GLY A CA  1 
+ATOM   978  C C   . GLY A 1 145 ? 23.446  13.242  54.364  1.00 15.28 ? ? ? ? ? ? 635 GLY A C   1 
+ATOM   979  O O   . GLY A 1 145 ? 24.376  14.023  54.404  1.00 17.72 ? ? ? ? ? ? 635 GLY A O   1 
+ATOM   980  N N   . LYS A 1 146 ? 23.330  12.357  53.387  1.00 15.95 ? ? ? ? ? ? 636 LYS A N   1 
+ATOM   981  C CA  . LYS A 1 146 ? 24.367  12.258  52.352  1.00 17.83 ? ? ? ? ? ? 636 LYS A CA  1 
+ATOM   982  C C   . LYS A 1 146 ? 23.952  12.805  50.971  1.00 16.79 ? ? ? ? ? ? 636 LYS A C   1 
+ATOM   983  O O   . LYS A 1 146 ? 24.806  12.982  50.103  1.00 16.05 ? ? ? ? ? ? 636 LYS A O   1 
+ATOM   984  C CB  . LYS A 1 146 ? 24.800  10.799  52.200  1.00 21.69 ? ? ? ? ? ? 636 LYS A CB  1 
+ATOM   985  C CG  . LYS A 1 146 ? 25.283  10.143  53.512  1.00 26.25 ? ? ? ? ? ? 636 LYS A CG  1 
+ATOM   986  C CD  . LYS A 1 146 ? 25.456  8.628   53.310  1.00 30.78 ? ? ? ? ? ? 636 LYS A CD  1 
+ATOM   987  C CE  . LYS A 1 146 ? 26.162  7.910   54.490  1.00 32.89 ? ? ? ? ? ? 636 LYS A CE  1 
+ATOM   988  N NZ  . LYS A 1 146 ? 26.576  6.515   54.054  1.00 34.45 ? ? ? ? ? ? 636 LYS A NZ  1 
+ATOM   989  N N   . ILE A 1 147 ? 22.645  12.974  50.750  1.00 15.11 ? ? ? ? ? ? 637 ILE A N   1 
+ATOM   990  C CA  . ILE A 1 147 ? 22.108  13.484  49.479  1.00 14.10 ? ? ? ? ? ? 637 ILE A CA  1 
+ATOM   991  C C   . ILE A 1 147 ? 21.426  14.839  49.746  1.00 14.57 ? ? ? ? ? ? 637 ILE A C   1 
+ATOM   992  O O   . ILE A 1 147 ? 20.469  14.934  50.507  1.00 16.15 ? ? ? ? ? ? 637 ILE A O   1 
+ATOM   993  C CB  . ILE A 1 147 ? 21.204  12.410  48.807  1.00 13.05 ? ? ? ? ? ? 637 ILE A CB  1 
+ATOM   994  C CG1 . ILE A 1 147 ? 22.114  11.270  48.326  1.00 12.55 ? ? ? ? ? ? 637 ILE A CG1 1 
+ATOM   995  C CG2 . ILE A 1 147 ? 20.310  13.030  47.717  1.00 11.31 ? ? ? ? ? ? 637 ILE A CG2 1 
+ATOM   996  C CD1 . ILE A 1 147 ? 21.413  10.105  47.691  1.00 14.16 ? ? ? ? ? ? 637 ILE A CD1 1 
+ATOM   997  N N   . VAL A 1 148 ? 21.953  15.894  49.122  1.00 14.36 ? ? ? ? ? ? 638 VAL A N   1 
+ATOM   998  C CA  . VAL A 1 148 ? 21.474  17.254  49.358  1.00 14.86 ? ? ? ? ? ? 638 VAL A CA  1 
+ATOM   999  C C   . VAL A 1 148 ? 20.144  17.688  48.766  1.00 12.58 ? ? ? ? ? ? 638 VAL A C   1 
+ATOM   1000 O O   . VAL A 1 148 ? 19.450  18.498  49.364  1.00 14.66 ? ? ? ? ? ? 638 VAL A O   1 
+ATOM   1001 C CB  . VAL A 1 148 ? 22.581  18.297  49.031  1.00 17.00 ? ? ? ? ? ? 638 VAL A CB  1 
+ATOM   1002 C CG1 . VAL A 1 148 ? 23.762  18.086  49.981  1.00 19.19 ? ? ? ? ? ? 638 VAL A CG1 1 
+ATOM   1003 C CG2 . VAL A 1 148 ? 23.038  18.178  47.553  1.00 17.19 ? ? ? ? ? ? 638 VAL A CG2 1 
+ATOM   1004 N N   . GLU A 1 149 ? 19.798  17.177  47.600  1.00 8.63  ? ? ? ? ? ? 639 GLU A N   1 
+ATOM   1005 C CA  . GLU A 1 149 ? 18.542  17.525  46.970  1.00 8.26  ? ? ? ? ? ? 639 GLU A CA  1 
+ATOM   1006 C C   . GLU A 1 149 ? 17.908  16.218  46.504  1.00 6.89  ? ? ? ? ? ? 639 GLU A C   1 
+ATOM   1007 O O   . GLU A 1 149 ? 18.586  15.381  45.914  1.00 7.18  ? ? ? ? ? ? 639 GLU A O   1 
+ATOM   1008 C CB  . GLU A 1 149 ? 18.788  18.410  45.728  1.00 8.85  ? ? ? ? ? ? 639 GLU A CB  1 
+ATOM   1009 C CG  . GLU A 1 149 ? 19.502  19.743  46.020  1.00 9.27  ? ? ? ? ? ? 639 GLU A CG  1 
+ATOM   1010 C CD  . GLU A 1 149 ? 19.635  20.649  44.793  1.00 9.86  ? ? ? ? ? ? 639 GLU A CD  1 
+ATOM   1011 O OE1 . GLU A 1 149 ? 19.007  20.376  43.745  1.00 10.05 ? ? ? ? ? ? 639 GLU A OE1 1 
+ATOM   1012 O OE2 . GLU A 1 149 ? 20.360  21.643  44.892  1.00 11.30 ? ? ? ? ? ? 639 GLU A OE2 1 
+ATOM   1013 N N   . TRP A 1 150 ? 16.612  16.067  46.762  1.00 6.79  ? ? ? ? ? ? 640 TRP A N   1 
+ATOM   1014 C CA  . TRP A 1 150 ? 15.852  14.892  46.353  1.00 6.60  ? ? ? ? ? ? 640 TRP A CA  1 
+ATOM   1015 C C   . TRP A 1 150 ? 14.703  15.271  45.443  1.00 5.08  ? ? ? ? ? ? 640 TRP A C   1 
+ATOM   1016 O O   . TRP A 1 150 ? 13.940  16.146  45.806  1.00 6.57  ? ? ? ? ? ? 640 TRP A O   1 
+ATOM   1017 C CB  . TRP A 1 150 ? 15.208  14.192  47.591  1.00 8.03  ? ? ? ? ? ? 640 TRP A CB  1 
+ATOM   1018 C CG  . TRP A 1 150 ? 16.067  13.127  48.235  1.00 9.68  ? ? ? ? ? ? 640 TRP A CG  1 
+ATOM   1019 C CD1 . TRP A 1 150 ? 16.858  13.255  49.352  1.00 11.36 ? ? ? ? ? ? 640 TRP A CD1 1 
+ATOM   1020 C CD2 . TRP A 1 150 ? 16.252  11.789  47.764  1.00 10.30 ? ? ? ? ? ? 640 TRP A CD2 1 
+ATOM   1021 N NE1 . TRP A 1 150 ? 17.516  12.076  49.588  1.00 11.42 ? ? ? ? ? ? 640 TRP A NE1 1 
+ATOM   1022 C CE2 . TRP A 1 150 ? 17.172  11.163  48.634  1.00 10.88 ? ? ? ? ? ? 640 TRP A CE2 1 
+ATOM   1023 C CE3 . TRP A 1 150 ? 15.739  11.064  46.675  1.00 11.57 ? ? ? ? ? ? 640 TRP A CE3 1 
+ATOM   1024 C CZ2 . TRP A 1 150 ? 17.597  9.836   48.450  1.00 12.43 ? ? ? ? ? ? 640 TRP A CZ2 1 
+ATOM   1025 C CZ3 . TRP A 1 150 ? 16.163  9.745   46.486  1.00 13.72 ? ? ? ? ? ? 640 TRP A CZ3 1 
+ATOM   1026 C CH2 . TRP A 1 150 ? 17.081  9.152   47.370  1.00 12.48 ? ? ? ? ? ? 640 TRP A CH2 1 
+ATOM   1027 N N   . ASP A 1 151 ? 14.581  14.603  44.296  1.00 6.32  ? ? ? ? ? ? 641 ASP A N   1 
+ATOM   1028 C CA  . ASP A 1 151 ? 13.427  14.793  43.413  1.00 5.74  ? ? ? ? ? ? 641 ASP A CA  1 
+ATOM   1029 C C   . ASP A 1 151 ? 12.404  13.791  44.017  1.00 6.88  ? ? ? ? ? ? 641 ASP A C   1 
+ATOM   1030 O O   . ASP A 1 151 ? 12.430  12.580  43.713  1.00 7.88  ? ? ? ? ? ? 641 ASP A O   1 
+ATOM   1031 C CB  . ASP A 1 151 ? 13.729  14.395  41.970  1.00 6.68  ? ? ? ? ? ? 641 ASP A CB  1 
+ATOM   1032 C CG  . ASP A 1 151 ? 14.609  15.410  41.234  1.00 8.43  ? ? ? ? ? ? 641 ASP A CG  1 
+ATOM   1033 O OD1 . ASP A 1 151 ? 14.662  16.582  41.626  1.00 9.60  ? ? ? ? ? ? 641 ASP A OD1 1 
+ATOM   1034 O OD2 . ASP A 1 151 ? 15.230  14.998  40.242  1.00 9.12  ? ? ? ? ? ? 641 ASP A OD2 1 
+ATOM   1035 N N   . VAL A 1 152 ? 11.570  14.298  44.913  1.00 6.28  ? ? ? ? ? ? 642 VAL A N   1 
+ATOM   1036 C CA  . VAL A 1 152 ? 10.558  13.467  45.560  1.00 6.92  ? ? ? ? ? ? 642 VAL A CA  1 
+ATOM   1037 C C   . VAL A 1 152 ? 9.502   12.991  44.579  1.00 8.31  ? ? ? ? ? ? 642 VAL A C   1 
+ATOM   1038 O O   . VAL A 1 152 ? 9.127   11.813  44.581  1.00 8.14  ? ? ? ? ? ? 642 VAL A O   1 
+ATOM   1039 C CB  . VAL A 1 152 ? 9.906   14.212  46.732  1.00 7.51  ? ? ? ? ? ? 642 VAL A CB  1 
+ATOM   1040 C CG1 . VAL A 1 152 ? 8.736   13.386  47.309  1.00 9.22  ? ? ? ? ? ? 642 VAL A CG1 1 
+ATOM   1041 C CG2 . VAL A 1 152 ? 10.958  14.475  47.801  1.00 7.87  ? ? ? ? ? ? 642 VAL A CG2 1 
+ATOM   1042 N N   . ALA A 1 153 ? 9.044   13.905  43.731  1.00 8.39  ? ? ? ? ? ? 643 ALA A N   1 
+ATOM   1043 C CA  . ALA A 1 153 ? 8.029   13.599  42.728  1.00 9.29  ? ? ? ? ? ? 643 ALA A CA  1 
+ATOM   1044 C C   . ALA A 1 153 ? 8.549   14.115  41.393  1.00 9.10  ? ? ? ? ? ? 643 ALA A C   1 
+ATOM   1045 O O   . ALA A 1 153 ? 9.203   15.156  41.349  1.00 9.25  ? ? ? ? ? ? 643 ALA A O   1 
+ATOM   1046 C CB  . ALA A 1 153 ? 6.699   14.253  43.081  1.00 10.98 ? ? ? ? ? ? 643 ALA A CB  1 
+ATOM   1047 N N   . ASN A 1 154 ? 8.216   13.417  40.320  1.00 8.51  ? ? ? ? ? ? 644 ASN A N   1 
+ATOM   1048 C CA  . ASN A 1 154 ? 8.710   13.747  38.978  1.00 8.61  ? ? ? ? ? ? 644 ASN A CA  1 
+ATOM   1049 C C   . ASN A 1 154 ? 7.612   13.687  37.913  1.00 10.26 ? ? ? ? ? ? 644 ASN A C   1 
+ATOM   1050 O O   . ASN A 1 154 ? 6.837   12.724  37.857  1.00 10.20 ? ? ? ? ? ? 644 ASN A O   1 
+ATOM   1051 C CB  . ASN A 1 154 ? 9.813   12.726  38.645  1.00 9.80  ? ? ? ? ? ? 644 ASN A CB  1 
+ATOM   1052 C CG  . ASN A 1 154 ? 10.684  13.127  37.456  1.00 11.91 ? ? ? ? ? ? 644 ASN A CG  1 
+ATOM   1053 O OD1 . ASN A 1 154 ? 11.150  14.266  37.345  1.00 14.46 ? ? ? ? ? ? 644 ASN A OD1 1 
+ATOM   1054 N ND2 . ASN A 1 154 ? 10.944  12.174  36.587  1.00 11.71 ? ? ? ? ? ? 644 ASN A ND2 1 
+ATOM   1055 N N   . GLU A 1 155 ? 7.487   14.753  37.124  1.00 10.35 ? ? ? ? ? ? 645 GLU A N   1 
+ATOM   1056 C CA  . GLU A 1 155 ? 6.528   14.812  36.008  1.00 10.79 ? ? ? ? ? ? 645 GLU A CA  1 
+ATOM   1057 C C   . GLU A 1 155 ? 5.106   14.379  36.329  1.00 10.69 ? ? ? ? ? ? 645 GLU A C   1 
+ATOM   1058 O O   . GLU A 1 155 ? 4.512   13.605  35.591  1.00 12.21 ? ? ? ? ? ? 645 GLU A O   1 
+ATOM   1059 C CB  . GLU A 1 155 ? 7.070   13.967  34.868  1.00 11.45 ? ? ? ? ? ? 645 GLU A CB  1 
+ATOM   1060 C CG  . GLU A 1 155 ? 8.515   14.289  34.543  1.00 12.47 ? ? ? ? ? ? 645 GLU A CG  1 
+ATOM   1061 C CD  . GLU A 1 155 ? 9.122   13.388  33.479  1.00 15.07 ? ? ? ? ? ? 645 GLU A CD  1 
+ATOM   1062 O OE1 . GLU A 1 155 ? 8.430   12.460  32.978  1.00 16.08 ? ? ? ? ? ? 645 GLU A OE1 1 
+ATOM   1063 O OE2 . GLU A 1 155 ? 10.323  13.594  33.157  1.00 15.18 ? ? ? ? ? ? 645 GLU A OE2 1 
+ATOM   1064 N N   . CYS A 1 156 ? 4.541   14.929  37.392  1.00 11.63 ? ? ? ? ? ? 646 CYS A N   1 
+ATOM   1065 C CA  . CYS A 1 156 ? 3.190   14.566  37.800  1.00 12.46 ? ? ? ? ? ? 646 CYS A CA  1 
+ATOM   1066 C C   . CYS A 1 156 ? 2.109   15.467  37.211  1.00 13.44 ? ? ? ? ? ? 646 CYS A C   1 
+ATOM   1067 O O   . CYS A 1 156 ? 0.919   15.167  37.363  1.00 12.98 ? ? ? ? ? ? 646 CYS A O   1 
+ATOM   1068 C CB  . CYS A 1 156 ? 3.052   14.628  39.322  1.00 14.16 ? ? ? ? ? ? 646 CYS A CB  1 
+ATOM   1069 S SG  . CYS A 1 156 ? 4.185   13.520  40.280  1.00 17.92 ? ? ? ? ? ? 646 CYS A SG  1 
+ATOM   1070 N N   . MET A 1 157 ? 2.489   16.591  36.599  1.00 12.91 ? ? ? ? ? ? 647 MET A N   1 
+ATOM   1071 C CA  . MET A 1 157 ? 1.483   17.510  36.051  1.00 12.39 ? ? ? ? ? ? 647 MET A CA  1 
+ATOM   1072 C C   . MET A 1 157 ? 1.198   17.166  34.612  1.00 12.89 ? ? ? ? ? ? 647 MET A C   1 
+ATOM   1073 O O   . MET A 1 157 ? 2.104   16.846  33.855  1.00 11.29 ? ? ? ? ? ? 647 MET A O   1 
+ATOM   1074 C CB  . MET A 1 157 ? 1.957   18.971  36.140  1.00 13.15 ? ? ? ? ? ? 647 MET A CB  1 
+ATOM   1075 C CG  . MET A 1 157 ? 0.914   20.014  35.716  1.00 13.35 ? ? ? ? ? ? 647 MET A CG  1 
+ATOM   1076 S SD  . MET A 1 157 ? -0.530  20.081  36.774  1.00 16.27 ? ? ? ? ? ? 647 MET A SD  1 
+ATOM   1077 C CE  . MET A 1 157 ? 0.143   20.858  38.208  1.00 15.68 ? ? ? ? ? ? 647 MET A CE  1 
+ATOM   1078 N N   . ASP A 1 158 ? -0.079  17.190  34.253  1.00 14.26 ? ? ? ? ? ? 648 ASP A N   1 
+ATOM   1079 C CA  . ASP A 1 158 ? -0.460  16.910  32.874  1.00 16.47 ? ? ? ? ? ? 648 ASP A CA  1 
+ATOM   1080 C C   . ASP A 1 158 ? 0.135   18.000  31.966  1.00 15.82 ? ? ? ? ? ? 648 ASP A C   1 
+ATOM   1081 O O   . ASP A 1 158 ? 0.278   19.140  32.375  1.00 14.43 ? ? ? ? ? ? 648 ASP A O   1 
+ATOM   1082 C CB  . ASP A 1 158 ? -1.976  16.896  32.728  1.00 19.03 ? ? ? ? ? ? 648 ASP A CB  1 
+ATOM   1083 C CG  . ASP A 1 158 ? -2.401  16.358  31.395  1.00 23.11 ? ? ? ? ? ? 648 ASP A CG  1 
+ATOM   1084 O OD1 . ASP A 1 158 ? -2.234  15.131  31.173  1.00 25.41 ? ? ? ? ? ? 648 ASP A OD1 1 
+ATOM   1085 O OD2 . ASP A 1 158 ? -2.864  17.145  30.535  1.00 24.25 ? ? ? ? ? ? 648 ASP A OD2 1 
+ATOM   1086 N N   . ASP A 1 159 ? 0.480   17.641  30.741  1.00 16.50 ? ? ? ? ? ? 649 ASP A N   1 
+ATOM   1087 C CA  . ASP A 1 159 ? 1.058   18.606  29.805  1.00 20.50 ? ? ? ? ? ? 649 ASP A CA  1 
+ATOM   1088 C C   . ASP A 1 159 ? 0.217   19.825  29.439  1.00 21.12 ? ? ? ? ? ? 649 ASP A C   1 
+ATOM   1089 O O   . ASP A 1 159 ? 0.746   20.875  29.033  1.00 21.52 ? ? ? ? ? ? 649 ASP A O   1 
+ATOM   1090 C CB  . ASP A 1 159 ? 1.545   17.893  28.565  1.00 22.57 ? ? ? ? ? ? 649 ASP A CB  1 
+ATOM   1091 C CG  . ASP A 1 159 ? 2.906   17.337  28.763  1.00 25.17 ? ? ? ? ? ? 649 ASP A CG  1 
+ATOM   1092 O OD1 . ASP A 1 159 ? 3.732   18.045  29.387  1.00 26.56 ? ? ? ? ? ? 649 ASP A OD1 1 
+ATOM   1093 O OD2 . ASP A 1 159 ? 3.140   16.200  28.329  1.00 27.90 ? ? ? ? ? ? 649 ASP A OD2 1 
+ATOM   1094 N N   . SER A 1 160 ? -1.090  19.683  29.621  1.00 21.45 ? ? ? ? ? ? 650 SER A N   1 
+ATOM   1095 C CA  . SER A 1 160 ? -2.040  20.762  29.363  1.00 21.67 ? ? ? ? ? ? 650 SER A CA  1 
+ATOM   1096 C C   . SER A 1 160 ? -1.963  21.808  30.491  1.00 21.48 ? ? ? ? ? ? 650 SER A C   1 
+ATOM   1097 O O   . SER A 1 160 ? -2.315  22.975  30.286  1.00 22.52 ? ? ? ? ? ? 650 SER A O   1 
+ATOM   1098 C CB  . SER A 1 160 ? -3.470  20.184  29.305  1.00 22.20 ? ? ? ? ? ? 650 SER A CB  1 
+ATOM   1099 O OG  . SER A 1 160 ? -3.899  19.603  30.554  1.00 24.05 ? ? ? ? ? ? 650 SER A OG  1 
+ATOM   1100 N N   . GLY A 1 161 ? -1.520  21.372  31.674  1.00 18.65 ? ? ? ? ? ? 651 GLY A N   1 
+ATOM   1101 C CA  . GLY A 1 161 ? -1.470  22.242  32.821  1.00 17.91 ? ? ? ? ? ? 651 GLY A CA  1 
+ATOM   1102 C C   . GLY A 1 161 ? -2.824  22.224  33.497  1.00 18.26 ? ? ? ? ? ? 651 GLY A C   1 
+ATOM   1103 O O   . GLY A 1 161 ? -3.047  22.963  34.438  1.00 19.45 ? ? ? ? ? ? 651 GLY A O   1 
+ATOM   1104 N N   . ASN A 1 162 ? -3.726  21.346  33.060  1.00 19.18 ? ? ? ? ? ? 652 ASN A N   1 
+ATOM   1105 C CA  . ASN A 1 162 ? -5.067  21.281  33.651  1.00 21.03 ? ? ? ? ? ? 652 ASN A CA  1 
+ATOM   1106 C C   . ASN A 1 162 ? -5.198  20.552  34.968  1.00 20.60 ? ? ? ? ? ? 652 ASN A C   1 
+ATOM   1107 O O   . ASN A 1 162 ? -6.191  20.683  35.646  1.00 23.64 ? ? ? ? ? ? 652 ASN A O   1 
+ATOM   1108 C CB  . ASN A 1 162 ? -6.096  20.742  32.651  1.00 22.76 ? ? ? ? ? ? 652 ASN A CB  1 
+ATOM   1109 C CG  . ASN A 1 162 ? -6.361  21.723  31.514  1.00 25.67 ? ? ? ? ? ? 652 ASN A CG  1 
+ATOM   1110 O OD1 . ASN A 1 162 ? -6.396  22.941  31.722  1.00 26.40 ? ? ? ? ? ? 652 ASN A OD1 1 
+ATOM   1111 N ND2 . ASN A 1 162 ? -6.487  21.206  30.305  1.00 26.40 ? ? ? ? ? ? 652 ASN A ND2 1 
+ATOM   1112 N N   . GLY A 1 163 ? -4.203  19.780  35.341  1.00 19.49 ? ? ? ? ? ? 653 GLY A N   1 
+ATOM   1113 C CA  . GLY A 1 163 ? -4.281  19.066  36.593  1.00 16.84 ? ? ? ? ? ? 653 GLY A CA  1 
+ATOM   1114 C C   . GLY A 1 163 ? -3.288  17.939  36.561  1.00 15.65 ? ? ? ? ? ? 653 GLY A C   1 
+ATOM   1115 O O   . GLY A 1 163 ? -2.541  17.769  35.604  1.00 15.47 ? ? ? ? ? ? 653 GLY A O   1 
+ATOM   1116 N N   . LEU A 1 164 ? -3.287  17.154  37.625  1.00 15.82 ? ? ? ? ? ? 654 LEU A N   1 
+ATOM   1117 C CA  . LEU A 1 164 ? -2.363  16.046  37.749  1.00 15.44 ? ? ? ? ? ? 654 LEU A CA  1 
+ATOM   1118 C C   . LEU A 1 164 ? -2.632  14.949  36.729  1.00 16.20 ? ? ? ? ? ? 654 LEU A C   1 
+ATOM   1119 O O   . LEU A 1 164 ? -3.781  14.672  36.349  1.00 17.76 ? ? ? ? ? ? 654 LEU A O   1 
+ATOM   1120 C CB  . LEU A 1 164 ? -2.404  15.485  39.190  1.00 16.82 ? ? ? ? ? ? 654 LEU A CB  1 
+ATOM   1121 C CG  . LEU A 1 164 ? -1.999  16.441  40.339  1.00 17.28 ? ? ? ? ? ? 654 LEU A CG  1 
+ATOM   1122 C CD1 . LEU A 1 164 ? -2.341  15.847  41.727  1.00 17.10 ? ? ? ? ? ? 654 LEU A CD1 1 
+ATOM   1123 C CD2 . LEU A 1 164 ? -0.529  16.707  40.232  1.00 17.49 ? ? ? ? ? ? 654 LEU A CD2 1 
+ATOM   1124 N N   . ARG A 1 165 ? -1.554  14.332  36.291  1.00 15.11 ? ? ? ? ? ? 655 ARG A N   1 
+ATOM   1125 C CA  . ARG A 1 165 ? -1.551  13.254  35.321  1.00 15.76 ? ? ? ? ? ? 655 ARG A CA  1 
+ATOM   1126 C C   . ARG A 1 165 ? -2.132  11.956  35.926  1.00 15.91 ? ? ? ? ? ? 655 ARG A C   1 
+ATOM   1127 O O   . ARG A 1 165 ? -1.944  11.673  37.124  1.00 15.50 ? ? ? ? ? ? 655 ARG A O   1 
+ATOM   1128 C CB  . ARG A 1 165 ? -0.080  13.073  34.942  1.00 18.24 ? ? ? ? ? ? 655 ARG A CB  1 
+ATOM   1129 C CG  . ARG A 1 165 ? 0.258   12.001  34.021  1.00 20.71 ? ? ? ? ? ? 655 ARG A CG  1 
+ATOM   1130 C CD  . ARG A 1 165 ? 1.743   11.779  34.062  1.00 21.00 ? ? ? ? ? ? 655 ARG A CD  1 
+ATOM   1131 N NE  . ARG A 1 165 ? 2.529   12.917  33.568  1.00 22.27 ? ? ? ? ? ? 655 ARG A NE  1 
+ATOM   1132 C CZ  . ARG A 1 165 ? 2.724   13.216  32.279  1.00 23.89 ? ? ? ? ? ? 655 ARG A CZ  1 
+ATOM   1133 N NH1 . ARG A 1 165 ? 2.157   12.478  31.324  1.00 24.61 ? ? ? ? ? ? 655 ARG A NH1 1 
+ATOM   1134 N NH2 . ARG A 1 165 ? 3.602   14.159  31.927  1.00 23.30 ? ? ? ? ? ? 655 ARG A NH2 1 
+ATOM   1135 N N   . SER A 1 166 ? -2.848  11.167  35.143  1.00 15.30 ? ? ? ? ? ? 656 SER A N   1 
+ATOM   1136 C CA  . SER A 1 166 ? -3.339  9.919   35.723  1.00 17.88 ? ? ? ? ? ? 656 SER A CA  1 
+ATOM   1137 C C   . SER A 1 166 ? -2.115  8.969   35.818  1.00 17.56 ? ? ? ? ? ? 656 SER A C   1 
+ATOM   1138 O O   . SER A 1 166 ? -1.179  9.044   35.004  1.00 17.81 ? ? ? ? ? ? 656 SER A O   1 
+ATOM   1139 C CB  . SER A 1 166 ? -4.535  9.341   34.935  1.00 20.25 ? ? ? ? ? ? 656 SER A CB  1 
+ATOM   1140 O OG  . SER A 1 166 ? -4.134  8.362   34.006  1.00 24.17 ? ? ? ? ? ? 656 SER A OG  1 
+ATOM   1141 N N   . SER A 1 167 ? -2.042  8.237   36.925  1.00 15.62 ? ? ? ? ? ? 657 SER A N   1 
+ATOM   1142 C CA  . SER A 1 167 ? -0.958  7.298   37.208  1.00 14.45 ? ? ? ? ? ? 657 SER A CA  1 
+ATOM   1143 C C   . SER A 1 167 ? -1.453  6.353   38.303  1.00 14.09 ? ? ? ? ? ? 657 SER A C   1 
+ATOM   1144 O O   . SER A 1 167 ? -2.510  6.607   38.915  1.00 13.28 ? ? ? ? ? ? 657 SER A O   1 
+ATOM   1145 C CB  . SER A 1 167 ? 0.287   8.049   37.709  1.00 13.71 ? ? ? ? ? ? 657 SER A CB  1 
+ATOM   1146 O OG  . SER A 1 167 ? 0.100   8.611   38.982  1.00 12.74 ? ? ? ? ? ? 657 SER A OG  1 
+ATOM   1147 N N   . ILE A 1 168 ? -0.703  5.286   38.586  1.00 13.44 ? ? ? ? ? ? 658 ILE A N   1 
+ATOM   1148 C CA  . ILE A 1 168 ? -1.144  4.377   39.644  1.00 13.09 ? ? ? ? ? ? 658 ILE A CA  1 
+ATOM   1149 C C   . ILE A 1 168 ? -1.325  5.135   40.977  1.00 12.37 ? ? ? ? ? ? 658 ILE A C   1 
+ATOM   1150 O O   . ILE A 1 168 ? -2.355  4.987   41.642  1.00 13.54 ? ? ? ? ? ? 658 ILE A O   1 
+ATOM   1151 C CB  . ILE A 1 168 ? -0.216  3.135   39.790  1.00 14.48 ? ? ? ? ? ? 658 ILE A CB  1 
+ATOM   1152 C CG1 . ILE A 1 168 ? -0.814  2.160   40.805  1.00 16.04 ? ? ? ? ? ? 658 ILE A CG1 1 
+ATOM   1153 C CG2 . ILE A 1 168 ? 1.204   3.534   40.192  1.00 15.18 ? ? ? ? ? ? 658 ILE A CG2 1 
+ATOM   1154 C CD1 . ILE A 1 168 ? -0.043  0.860   40.917  1.00 18.43 ? ? ? ? ? ? 658 ILE A CD1 1 
+ATOM   1155 N N   . TRP A 1 169 ? -0.403  6.044   41.307  1.00 11.81 ? ? ? ? ? ? 659 TRP A N   1 
+ATOM   1156 C CA  . TRP A 1 169 ? -0.477  6.812   42.572  1.00 11.45 ? ? ? ? ? ? 659 TRP A CA  1 
+ATOM   1157 C C   . TRP A 1 169 ? -1.685  7.733   42.593  1.00 10.79 ? ? ? ? ? ? 659 TRP A C   1 
+ATOM   1158 O O   . TRP A 1 169 ? -2.440  7.763   43.551  1.00 12.67 ? ? ? ? ? ? 659 TRP A O   1 
+ATOM   1159 C CB  . TRP A 1 169 ? 0.782   7.668   42.804  1.00 11.39 ? ? ? ? ? ? 659 TRP A CB  1 
+ATOM   1160 C CG  . TRP A 1 169 ? 2.058   6.924   42.617  1.00 12.46 ? ? ? ? ? ? 659 TRP A CG  1 
+ATOM   1161 C CD1 . TRP A 1 169 ? 2.896   6.974   41.529  1.00 12.48 ? ? ? ? ? ? 659 TRP A CD1 1 
+ATOM   1162 C CD2 . TRP A 1 169 ? 2.618   5.959   43.518  1.00 12.83 ? ? ? ? ? ? 659 TRP A CD2 1 
+ATOM   1163 N NE1 . TRP A 1 169 ? 3.936   6.084   41.700  1.00 14.54 ? ? ? ? ? ? 659 TRP A NE1 1 
+ATOM   1164 C CE2 . TRP A 1 169 ? 3.787   5.446   42.912  1.00 13.43 ? ? ? ? ? ? 659 TRP A CE2 1 
+ATOM   1165 C CE3 . TRP A 1 169 ? 2.238   5.476   44.777  1.00 12.60 ? ? ? ? ? ? 659 TRP A CE3 1 
+ATOM   1166 C CZ2 . TRP A 1 169 ? 4.587   4.459   43.533  1.00 14.15 ? ? ? ? ? ? 659 TRP A CZ2 1 
+ATOM   1167 C CZ3 . TRP A 1 169 ? 3.032   4.491   45.401  1.00 12.93 ? ? ? ? ? ? 659 TRP A CZ3 1 
+ATOM   1168 C CH2 . TRP A 1 169 ? 4.190   3.998   44.774  1.00 13.84 ? ? ? ? ? ? 659 TRP A CH2 1 
+ATOM   1169 N N   . ARG A 1 170 ? -1.869  8.482   41.523  1.00 10.87 ? ? ? ? ? ? 660 ARG A N   1 
+ATOM   1170 C CA  . ARG A 1 170 ? -2.980  9.421   41.439  1.00 10.84 ? ? ? ? ? ? 660 ARG A CA  1 
+ATOM   1171 C C   . ARG A 1 170 ? -4.355  8.767   41.432  1.00 10.26 ? ? ? ? ? ? 660 ARG A C   1 
+ATOM   1172 O O   . ARG A 1 170 ? -5.277  9.235   42.104  1.00 10.51 ? ? ? ? ? ? 660 ARG A O   1 
+ATOM   1173 C CB  . ARG A 1 170 ? -2.816  10.288  40.173  1.00 11.29 ? ? ? ? ? ? 660 ARG A CB  1 
+ATOM   1174 C CG  . ARG A 1 170 ? -4.019  11.178  39.823  1.00 12.05 ? ? ? ? ? ? 660 ARG A CG  1 
+ATOM   1175 C CD  . ARG A 1 170 ? -4.251  12.236  40.873  1.00 13.12 ? ? ? ? ? ? 660 ARG A CD  1 
+ATOM   1176 N NE  . ARG A 1 170 ? -5.450  13.049  40.577  1.00 13.70 ? ? ? ? ? ? 660 ARG A NE  1 
+ATOM   1177 C CZ  . ARG A 1 170 ? -6.699  12.721  40.913  1.00 12.68 ? ? ? ? ? ? 660 ARG A CZ  1 
+ATOM   1178 N NH1 . ARG A 1 170 ? -6.958  11.573  41.550  1.00 11.54 ? ? ? ? ? ? 660 ARG A NH1 1 
+ATOM   1179 N NH2 . ARG A 1 170 ? -7.671  13.607  40.725  1.00 11.79 ? ? ? ? ? ? 660 ARG A NH2 1 
+ATOM   1180 N N   . ASN A 1 171 ? -4.489  7.720   40.632  1.00 10.81 ? ? ? ? ? ? 661 ASN A N   1 
+ATOM   1181 C CA  . ASN A 1 171 ? -5.774  7.054   40.453  1.00 12.17 ? ? ? ? ? ? 661 ASN A CA  1 
+ATOM   1182 C C   . ASN A 1 171 ? -6.245  6.292   41.682  1.00 13.13 ? ? ? ? ? ? 661 ASN A C   1 
+ATOM   1183 O O   . ASN A 1 171 ? -7.432  6.375   42.050  1.00 14.25 ? ? ? ? ? ? 661 ASN A O   1 
+ATOM   1184 C CB  . ASN A 1 171 ? -5.735  6.111   39.249  1.00 13.42 ? ? ? ? ? ? 661 ASN A CB  1 
+ATOM   1185 C CG  . ASN A 1 171 ? -5.473  6.837   37.925  1.00 14.23 ? ? ? ? ? ? 661 ASN A CG  1 
+ATOM   1186 O OD1 . ASN A 1 171 ? -5.419  8.068   37.861  1.00 14.47 ? ? ? ? ? ? 661 ASN A OD1 1 
+ATOM   1187 N ND2 . ASN A 1 171 ? -5.275  6.057   36.862  1.00 15.94 ? ? ? ? ? ? 661 ASN A ND2 1 
+ATOM   1188 N N   . VAL A 1 172 ? -5.314  5.589   42.333  1.00 11.99 ? ? ? ? ? ? 662 VAL A N   1 
+ATOM   1189 C CA  . VAL A 1 172 ? -5.639  4.799   43.526  1.00 11.91 ? ? ? ? ? ? 662 VAL A CA  1 
+ATOM   1190 C C   . VAL A 1 172 ? -5.733  5.601   44.830  1.00 11.64 ? ? ? ? ? ? 662 VAL A C   1 
+ATOM   1191 O O   . VAL A 1 172 ? -6.685  5.430   45.606  1.00 12.84 ? ? ? ? ? ? 662 VAL A O   1 
+ATOM   1192 C CB  . VAL A 1 172 ? -4.619  3.610   43.687  1.00 11.78 ? ? ? ? ? ? 662 VAL A CB  1 
+ATOM   1193 C CG1 . VAL A 1 172 ? -4.857  2.863   44.987  1.00 12.44 ? ? ? ? ? ? 662 VAL A CG1 1 
+ATOM   1194 C CG2 . VAL A 1 172 ? -4.682  2.684   42.481  1.00 11.85 ? ? ? ? ? ? 662 VAL A CG2 1 
+ATOM   1195 N N   . ILE A 1 173 ? -4.759  6.471   45.086  1.00 9.92  ? ? ? ? ? ? 663 ILE A N   1 
+ATOM   1196 C CA  . ILE A 1 173 ? -4.764  7.249   46.312  1.00 10.42 ? ? ? ? ? ? 663 ILE A CA  1 
+ATOM   1197 C C   . ILE A 1 173 ? -5.719  8.432   46.260  1.00 11.77 ? ? ? ? ? ? 663 ILE A C   1 
+ATOM   1198 O O   . ILE A 1 173 ? -6.465  8.668   47.209  1.00 12.98 ? ? ? ? ? ? 663 ILE A O   1 
+ATOM   1199 C CB  . ILE A 1 173 ? -3.326  7.695   46.692  1.00 10.15 ? ? ? ? ? ? 663 ILE A CB  1 
+ATOM   1200 C CG1 . ILE A 1 173 ? -2.487  6.444   46.996  1.00 10.96 ? ? ? ? ? ? 663 ILE A CG1 1 
+ATOM   1201 C CG2 . ILE A 1 173 ? -3.325  8.642   47.852  1.00 9.34  ? ? ? ? ? ? 663 ILE A CG2 1 
+ATOM   1202 C CD1 . ILE A 1 173 ? -1.021  6.700   47.074  1.00 11.26 ? ? ? ? ? ? 663 ILE A CD1 1 
+ATOM   1203 N N   . GLY A 1 174 ? -5.692  9.191   45.163  1.00 12.24 ? ? ? ? ? ? 664 GLY A N   1 
+ATOM   1204 C CA  . GLY A 1 174 ? -6.573  10.339  45.076  1.00 12.01 ? ? ? ? ? ? 664 GLY A CA  1 
+ATOM   1205 C C   . GLY A 1 174 ? -5.814  11.621  44.833  1.00 12.95 ? ? ? ? ? ? 664 GLY A C   1 
+ATOM   1206 O O   . GLY A 1 174 ? -4.576  11.622  44.723  1.00 12.33 ? ? ? ? ? ? 664 GLY A O   1 
+ATOM   1207 N N   . GLN A 1 175 ? -6.541  12.734  44.871  1.00 13.82 ? ? ? ? ? ? 665 GLN A N   1 
+ATOM   1208 C CA  . GLN A 1 175 ? -5.946  14.027  44.547  1.00 15.58 ? ? ? ? ? ? 665 GLN A CA  1 
+ATOM   1209 C C   . GLN A 1 175 ? -4.881  14.577  45.491  1.00 15.36 ? ? ? ? ? ? 665 GLN A C   1 
+ATOM   1210 O O   . GLN A 1 175 ? -4.077  15.412  45.067  1.00 16.86 ? ? ? ? ? ? 665 GLN A O   1 
+ATOM   1211 C CB  . GLN A 1 175 ? -7.028  15.074  44.293  1.00 18.52 ? ? ? ? ? ? 665 GLN A CB  1 
+ATOM   1212 C CG  . GLN A 1 175 ? -7.746  15.528  45.540  1.00 24.51 ? ? ? ? ? ? 665 GLN A CG  1 
+ATOM   1213 C CD  . GLN A 1 175 ? -8.484  16.875  45.363  1.00 27.85 ? ? ? ? ? ? 665 GLN A CD  1 
+ATOM   1214 O OE1 . GLN A 1 175 ? -8.431  17.508  44.299  1.00 30.10 ? ? ? ? ? ? 665 GLN A OE1 1 
+ATOM   1215 N NE2 . GLN A 1 175 ? -9.150  17.318  46.422  1.00 29.11 ? ? ? ? ? ? 665 GLN A NE2 1 
+ATOM   1216 N N   . ASP A 1 176 ? -4.816  14.074  46.724  1.00 13.36 ? ? ? ? ? ? 666 ASP A N   1 
+ATOM   1217 C CA  . ASP A 1 176 ? -3.841  14.553  47.711  1.00 13.33 ? ? ? ? ? ? 666 ASP A CA  1 
+ATOM   1218 C C   . ASP A 1 176 ? -2.598  13.662  47.870  1.00 11.79 ? ? ? ? ? ? 666 ASP A C   1 
+ATOM   1219 O O   . ASP A 1 176 ? -1.857  13.802  48.861  1.00 12.33 ? ? ? ? ? ? 666 ASP A O   1 
+ATOM   1220 C CB  . ASP A 1 176 ? -4.525  14.684  49.078  1.00 14.83 ? ? ? ? ? ? 666 ASP A CB  1 
+ATOM   1221 C CG  . ASP A 1 176 ? -5.128  13.362  49.561  1.00 16.96 ? ? ? ? ? ? 666 ASP A CG  1 
+ATOM   1222 O OD1 . ASP A 1 176 ? -5.139  12.368  48.804  1.00 16.93 ? ? ? ? ? ? 666 ASP A OD1 1 
+ATOM   1223 O OD2 . ASP A 1 176 ? -5.602  13.312  50.715  1.00 18.91 ? ? ? ? ? ? 666 ASP A OD2 1 
+ATOM   1224 N N   . TYR A 1 177 ? -2.369  12.747  46.933  1.00 10.74 ? ? ? ? ? ? 667 TYR A N   1 
+ATOM   1225 C CA  . TYR A 1 177 ? -1.232  11.853  47.062  1.00 10.51 ? ? ? ? ? ? 667 TYR A CA  1 
+ATOM   1226 C C   . TYR A 1 177 ? 0.132   12.545  47.210  1.00 10.39 ? ? ? ? ? ? 667 TYR A C   1 
+ATOM   1227 O O   . TYR A 1 177 ? 0.994   12.022  47.909  1.00 10.92 ? ? ? ? ? ? 667 TYR A O   1 
+ATOM   1228 C CB  . TYR A 1 177 ? -1.208  10.808  45.947  1.00 11.00 ? ? ? ? ? ? 667 TYR A CB  1 
+ATOM   1229 C CG  . TYR A 1 177 ? -0.526  11.236  44.655  1.00 10.72 ? ? ? ? ? ? 667 TYR A CG  1 
+ATOM   1230 C CD1 . TYR A 1 177 ? -1.243  11.893  43.645  1.00 11.01 ? ? ? ? ? ? 667 TYR A CD1 1 
+ATOM   1231 C CD2 . TYR A 1 177 ? 0.808   10.899  44.406  1.00 11.43 ? ? ? ? ? ? 667 TYR A CD2 1 
+ATOM   1232 C CE1 . TYR A 1 177 ? -0.648  12.193  42.414  1.00 10.71 ? ? ? ? ? ? 667 TYR A CE1 1 
+ATOM   1233 C CE2 . TYR A 1 177 ? 1.410   11.193  43.171  1.00 11.53 ? ? ? ? ? ? 667 TYR A CE2 1 
+ATOM   1234 C CZ  . TYR A 1 177 ? 0.667   11.837  42.181  1.00 11.28 ? ? ? ? ? ? 667 TYR A CZ  1 
+ATOM   1235 O OH  . TYR A 1 177 ? 1.246   12.070  40.944  1.00 12.36 ? ? ? ? ? ? 667 TYR A OH  1 
+ATOM   1236 N N   . LEU A 1 178 ? 0.348   13.693  46.557  1.00 10.36 ? ? ? ? ? ? 668 LEU A N   1 
+ATOM   1237 C CA  . LEU A 1 178 ? 1.644   14.385  46.686  1.00 10.31 ? ? ? ? ? ? 668 LEU A CA  1 
+ATOM   1238 C C   . LEU A 1 178 ? 1.882   14.987  48.065  1.00 9.95  ? ? ? ? ? ? 668 LEU A C   1 
+ATOM   1239 O O   . LEU A 1 178 ? 3.028   15.071  48.522  1.00 10.72 ? ? ? ? ? ? 668 LEU A O   1 
+ATOM   1240 C CB  . LEU A 1 178 ? 1.843   15.449  45.600  1.00 12.04 ? ? ? ? ? ? 668 LEU A CB  1 
+ATOM   1241 C CG  . LEU A 1 178 ? 2.114   14.909  44.192  1.00 13.54 ? ? ? ? ? ? 668 LEU A CG  1 
+ATOM   1242 C CD1 . LEU A 1 178 ? 2.257   16.062  43.212  1.00 15.57 ? ? ? ? ? ? 668 LEU A CD1 1 
+ATOM   1243 C CD2 . LEU A 1 178 ? 3.375   14.054  44.139  1.00 14.87 ? ? ? ? ? ? 668 LEU A CD2 1 
+ATOM   1244 N N   . ASP A 1 179 ? 0.812   15.356  48.769  1.00 9.71  ? ? ? ? ? ? 669 ASP A N   1 
+ATOM   1245 C CA  . ASP A 1 179 ? 0.973   15.914  50.109  1.00 11.40 ? ? ? ? ? ? 669 ASP A CA  1 
+ATOM   1246 C C   . ASP A 1 179 ? 1.625   14.846  51.021  1.00 10.54 ? ? ? ? ? ? 669 ASP A C   1 
+ATOM   1247 O O   . ASP A 1 179 ? 2.482   15.158  51.854  1.00 10.79 ? ? ? ? ? ? 669 ASP A O   1 
+ATOM   1248 C CB  . ASP A 1 179 ? -0.367  16.318  50.711  1.00 12.86 ? ? ? ? ? ? 669 ASP A CB  1 
+ATOM   1249 C CG  . ASP A 1 179 ? -1.015  17.502  50.002  1.00 15.76 ? ? ? ? ? ? 669 ASP A CG  1 
+ATOM   1250 O OD1 . ASP A 1 179 ? -0.452  18.079  49.056  1.00 16.66 ? ? ? ? ? ? 669 ASP A OD1 1 
+ATOM   1251 O OD2 . ASP A 1 179 ? -2.120  17.874  50.434  1.00 18.14 ? ? ? ? ? ? 669 ASP A OD2 1 
+ATOM   1252 N N   . TYR A 1 180 ? 1.205   13.594  50.846  1.00 9.93  ? ? ? ? ? ? 670 TYR A N   1 
+ATOM   1253 C CA  . TYR A 1 180 ? 1.754   12.476  51.618  1.00 10.41 ? ? ? ? ? ? 670 TYR A CA  1 
+ATOM   1254 C C   . TYR A 1 180 ? 3.190   12.201  51.248  1.00 8.85  ? ? ? ? ? ? 670 TYR A C   1 
+ATOM   1255 O O   . TYR A 1 180 ? 4.010   12.033  52.124  1.00 9.28  ? ? ? ? ? ? 670 TYR A O   1 
+ATOM   1256 C CB  . TYR A 1 180 ? 0.922   11.200  51.415  1.00 11.99 ? ? ? ? ? ? 670 TYR A CB  1 
+ATOM   1257 C CG  . TYR A 1 180 ? -0.376  11.275  52.154  1.00 15.47 ? ? ? ? ? ? 670 TYR A CG  1 
+ATOM   1258 C CD1 . TYR A 1 180 ? -0.437  10.937  53.508  1.00 17.20 ? ? ? ? ? ? 670 TYR A CD1 1 
+ATOM   1259 C CD2 . TYR A 1 180 ? -1.530  11.744  51.528  1.00 17.38 ? ? ? ? ? ? 670 TYR A CD2 1 
+ATOM   1260 C CE1 . TYR A 1 180 ? -1.608  11.062  54.220  1.00 19.48 ? ? ? ? ? ? 670 TYR A CE1 1 
+ATOM   1261 C CE2 . TYR A 1 180 ? -2.709  11.884  52.223  1.00 19.68 ? ? ? ? ? ? 670 TYR A CE2 1 
+ATOM   1262 C CZ  . TYR A 1 180 ? -2.742  11.540  53.573  1.00 20.46 ? ? ? ? ? ? 670 TYR A CZ  1 
+ATOM   1263 O OH  . TYR A 1 180 ? -3.909  11.688  54.283  1.00 23.93 ? ? ? ? ? ? 670 TYR A OH  1 
+ATOM   1264 N N   . ALA A 1 181 ? 3.511   12.205  49.952  1.00 8.46  ? ? ? ? ? ? 671 ALA A N   1 
+ATOM   1265 C CA  . ALA A 1 181 ? 4.883   11.923  49.522  1.00 7.15  ? ? ? ? ? ? 671 ALA A CA  1 
+ATOM   1266 C C   . ALA A 1 181 ? 5.856   12.890  50.160  1.00 8.02  ? ? ? ? ? ? 671 ALA A C   1 
+ATOM   1267 O O   . ALA A 1 181 ? 6.886   12.470  50.708  1.00 8.12  ? ? ? ? ? ? 671 ALA A O   1 
+ATOM   1268 C CB  . ALA A 1 181 ? 5.012   11.945  48.002  1.00 8.36  ? ? ? ? ? ? 671 ALA A CB  1 
+ATOM   1269 N N   . PHE A 1 182 ? 5.531   14.186  50.117  1.00 7.83  ? ? ? ? ? ? 672 PHE A N   1 
+ATOM   1270 C CA  . PHE A 1 182 ? 6.405   15.212  50.717  1.00 8.55  ? ? ? ? ? ? 672 PHE A CA  1 
+ATOM   1271 C C   . PHE A 1 182 ? 6.507   15.114  52.255  1.00 8.76  ? ? ? ? ? ? 672 PHE A C   1 
+ATOM   1272 O O   . PHE A 1 182 ? 7.590   15.292  52.812  1.00 9.14  ? ? ? ? ? ? 672 PHE A O   1 
+ATOM   1273 C CB  . PHE A 1 182 ? 6.022   16.624  50.234  1.00 7.96  ? ? ? ? ? ? 672 PHE A CB  1 
+ATOM   1274 C CG  . PHE A 1 182 ? 6.538   16.924  48.830  1.00 8.17  ? ? ? ? ? ? 672 PHE A CG  1 
+ATOM   1275 C CD1 . PHE A 1 182 ? 7.818   17.444  48.642  1.00 8.70  ? ? ? ? ? ? 672 PHE A CD1 1 
+ATOM   1276 C CD2 . PHE A 1 182 ? 5.780   16.604  47.700  1.00 9.12  ? ? ? ? ? ? 672 PHE A CD2 1 
+ATOM   1277 C CE1 . PHE A 1 182 ? 8.344   17.629  47.343  1.00 8.63  ? ? ? ? ? ? 672 PHE A CE1 1 
+ATOM   1278 C CE2 . PHE A 1 182 ? 6.298   16.786  46.395  1.00 8.84  ? ? ? ? ? ? 672 PHE A CE2 1 
+ATOM   1279 C CZ  . PHE A 1 182 ? 7.584   17.295  46.231  1.00 8.72  ? ? ? ? ? ? 672 PHE A CZ  1 
+ATOM   1280 N N   . ARG A 1 183 ? 5.390   14.824  52.927  1.00 10.01 ? ? ? ? ? ? 673 ARG A N   1 
+ATOM   1281 C CA  . ARG A 1 183 ? 5.403   14.642  54.393  1.00 11.25 ? ? ? ? ? ? 673 ARG A CA  1 
+ATOM   1282 C C   . ARG A 1 183 ? 6.265   13.446  54.800  1.00 10.14 ? ? ? ? ? ? 673 ARG A C   1 
+ATOM   1283 O O   . ARG A 1 183 ? 7.131   13.577  55.673  1.00 11.12 ? ? ? ? ? ? 673 ARG A O   1 
+ATOM   1284 C CB  . ARG A 1 183 ? 3.989   14.462  54.922  1.00 15.64 ? ? ? ? ? ? 673 ARG A CB  1 
+ATOM   1285 C CG  . ARG A 1 183 ? 3.223   15.749  55.010  1.00 20.81 ? ? ? ? ? ? 673 ARG A CG  1 
+ATOM   1286 C CD  . ARG A 1 183 ? 1.981   15.528  55.843  1.00 25.86 ? ? ? ? ? ? 673 ARG A CD  1 
+ATOM   1287 N NE  . ARG A 1 183 ? 0.799   16.007  55.140  1.00 30.63 ? ? ? ? ? ? 673 ARG A NE  1 
+ATOM   1288 C CZ  . ARG A 1 183 ? 0.418   17.280  55.110  1.00 32.65 ? ? ? ? ? ? 673 ARG A CZ  1 
+ATOM   1289 N NH1 . ARG A 1 183 ? 1.138   18.205  55.756  1.00 33.81 ? ? ? ? ? ? 673 ARG A NH1 1 
+ATOM   1290 N NH2 . ARG A 1 183 ? -0.681  17.625  54.429  1.00 34.41 ? ? ? ? ? ? 673 ARG A NH2 1 
+ATOM   1291 N N   . TYR A 1 184 ? 6.108   12.318  54.095  1.00 9.91  ? ? ? ? ? ? 674 TYR A N   1 
+ATOM   1292 C CA  . TYR A 1 184 ? 6.900   11.109  54.379  1.00 10.14 ? ? ? ? ? ? 674 TYR A CA  1 
+ATOM   1293 C C   . TYR A 1 184 ? 8.390   11.389  54.172  1.00 9.98  ? ? ? ? ? ? 674 TYR A C   1 
+ATOM   1294 O O   . TYR A 1 184 ? 9.232   10.950  54.944  1.00 9.86  ? ? ? ? ? ? 674 TYR A O   1 
+ATOM   1295 C CB  . TYR A 1 184 ? 6.497   9.928   53.473  1.00 10.79 ? ? ? ? ? ? 674 TYR A CB  1 
+ATOM   1296 C CG  . TYR A 1 184 ? 5.101   9.408   53.667  1.00 11.54 ? ? ? ? ? ? 674 TYR A CG  1 
+ATOM   1297 C CD1 . TYR A 1 184 ? 4.442   9.582   54.876  1.00 13.46 ? ? ? ? ? ? 674 TYR A CD1 1 
+ATOM   1298 C CD2 . TYR A 1 184 ? 4.448   8.708   52.645  1.00 12.58 ? ? ? ? ? ? 674 TYR A CD2 1 
+ATOM   1299 C CE1 . TYR A 1 184 ? 3.151   9.066   55.071  1.00 13.55 ? ? ? ? ? ? 674 TYR A CE1 1 
+ATOM   1300 C CE2 . TYR A 1 184 ? 3.166   8.186   52.828  1.00 12.22 ? ? ? ? ? ? 674 TYR A CE2 1 
+ATOM   1301 C CZ  . TYR A 1 184 ? 2.536   8.371   54.043  1.00 13.30 ? ? ? ? ? ? 674 TYR A CZ  1 
+ATOM   1302 O OH  . TYR A 1 184 ? 1.288   7.838   54.271  1.00 15.76 ? ? ? ? ? ? 674 TYR A OH  1 
+ATOM   1303 N N   . ALA A 1 185 ? 8.709   12.141  53.118  1.00 8.57  ? ? ? ? ? ? 675 ALA A N   1 
+ATOM   1304 C CA  . ALA A 1 185 ? 10.098  12.455  52.803  1.00 9.05  ? ? ? ? ? ? 675 ALA A CA  1 
+ATOM   1305 C C   . ALA A 1 185 ? 10.729  13.338  53.863  1.00 7.95  ? ? ? ? ? ? 675 ALA A C   1 
+ATOM   1306 O O   . ALA A 1 185 ? 11.866  13.094  54.271  1.00 9.48  ? ? ? ? ? ? 675 ALA A O   1 
+ATOM   1307 C CB  . ALA A 1 185 ? 10.177  13.115  51.426  1.00 8.33  ? ? ? ? ? ? 675 ALA A CB  1 
+ATOM   1308 N N   . ARG A 1 186 ? 9.997   14.356  54.310  1.00 8.97  ? ? ? ? ? ? 676 ARG A N   1 
+ATOM   1309 C CA  . ARG A 1 186 ? 10.508  15.260  55.338  1.00 10.41 ? ? ? ? ? ? 676 ARG A CA  1 
+ATOM   1310 C C   . ARG A 1 186 ? 10.768  14.508  56.653  1.00 12.36 ? ? ? ? ? ? 676 ARG A C   1 
+ATOM   1311 O O   . ARG A 1 186 ? 11.764  14.769  57.328  1.00 13.32 ? ? ? ? ? ? 676 ARG A O   1 
+ATOM   1312 C CB  . ARG A 1 186 ? 9.548   16.412  55.569  1.00 11.14 ? ? ? ? ? ? 676 ARG A CB  1 
+ATOM   1313 C CG  . ARG A 1 186 ? 9.974   17.330  56.710  1.00 13.61 ? ? ? ? ? ? 676 ARG A CG  1 
+ATOM   1314 C CD  . ARG A 1 186 ? 11.221  18.203  56.350  1.00 15.19 ? ? ? ? ? ? 676 ARG A CD  1 
+ATOM   1315 N NE  . ARG A 1 186 ? 10.812  19.506  55.807  1.00 16.85 ? ? ? ? ? ? 676 ARG A NE  1 
+ATOM   1316 C CZ  . ARG A 1 186 ? 11.319  20.099  54.716  1.00 17.52 ? ? ? ? ? ? 676 ARG A CZ  1 
+ATOM   1317 N NH1 . ARG A 1 186 ? 12.286  19.525  54.017  1.00 15.32 ? ? ? ? ? ? 676 ARG A NH1 1 
+ATOM   1318 N NH2 . ARG A 1 186 ? 10.852  21.295  54.340  1.00 17.76 ? ? ? ? ? ? 676 ARG A NH2 1 
+ATOM   1319 N N   . GLU A 1 187 ? 9.919   13.539  56.979  1.00 13.53 ? ? ? ? ? ? 677 GLU A N   1 
+ATOM   1320 C CA  . GLU A 1 187 ? 10.125  12.759  58.201  1.00 16.22 ? ? ? ? ? ? 677 GLU A CA  1 
+ATOM   1321 C C   . GLU A 1 187 ? 11.380  11.872  58.070  1.00 16.73 ? ? ? ? ? ? 677 GLU A C   1 
+ATOM   1322 O O   . GLU A 1 187 ? 12.154  11.722  59.039  1.00 17.17 ? ? ? ? ? ? 677 GLU A O   1 
+ATOM   1323 C CB  . GLU A 1 187 ? 8.917   11.865  58.478  1.00 20.24 ? ? ? ? ? ? 677 GLU A CB  1 
+ATOM   1324 C CG  . GLU A 1 187 ? 7.720   12.553  59.115  1.00 27.80 ? ? ? ? ? ? 677 GLU A CG  1 
+ATOM   1325 C CD  . GLU A 1 187 ? 6.383   11.760  58.959  1.00 31.77 ? ? ? ? ? ? 677 GLU A CD  1 
+ATOM   1326 O OE1 . GLU A 1 187 ? 6.396   10.520  58.692  1.00 34.00 ? ? ? ? ? ? 677 GLU A OE1 1 
+ATOM   1327 O OE2 . GLU A 1 187 ? 5.300   12.405  59.089  1.00 34.87 ? ? ? ? ? ? 677 GLU A OE2 1 
+ATOM   1328 N N   . ALA A 1 188 ? 11.588  11.286  56.884  1.00 13.74 ? ? ? ? ? ? 678 ALA A N   1 
+ATOM   1329 C CA  . ALA A 1 188 ? 12.717  10.382  56.652  1.00 12.60 ? ? ? ? ? ? 678 ALA A CA  1 
+ATOM   1330 C C   . ALA A 1 188 ? 14.079  11.049  56.774  1.00 13.19 ? ? ? ? ? ? 678 ALA A C   1 
+ATOM   1331 O O   . ALA A 1 188 ? 15.025  10.460  57.331  1.00 13.81 ? ? ? ? ? ? 678 ALA A O   1 
+ATOM   1332 C CB  . ALA A 1 188 ? 12.572  9.676   55.294  1.00 11.91 ? ? ? ? ? ? 678 ALA A CB  1 
+ATOM   1333 N N   . ASP A 1 189 ? 14.211  12.248  56.208  1.00 12.01 ? ? ? ? ? ? 679 ASP A N   1 
+ATOM   1334 C CA  . ASP A 1 189 ? 15.480  12.969  56.279  1.00 12.89 ? ? ? ? ? ? 679 ASP A CA  1 
+ATOM   1335 C C   . ASP A 1 189 ? 15.165  14.463  56.360  1.00 14.91 ? ? ? ? ? ? 679 ASP A C   1 
+ATOM   1336 O O   . ASP A 1 189 ? 15.082  15.151  55.365  1.00 14.07 ? ? ? ? ? ? 679 ASP A O   1 
+ATOM   1337 C CB  . ASP A 1 189 ? 16.376  12.642  55.075  1.00 12.70 ? ? ? ? ? ? 679 ASP A CB  1 
+ATOM   1338 C CG  . ASP A 1 189 ? 17.734  13.333  55.151  1.00 12.64 ? ? ? ? ? ? 679 ASP A CG  1 
+ATOM   1339 O OD1 . ASP A 1 189 ? 17.984  14.083  56.108  1.00 13.80 ? ? ? ? ? ? 679 ASP A OD1 1 
+ATOM   1340 O OD2 . ASP A 1 189 ? 18.572  13.123  54.261  1.00 13.39 ? ? ? ? ? ? 679 ASP A OD2 1 
+ATOM   1341 N N   . PRO A 1 190 ? 15.033  14.985  57.576  1.00 16.78 ? ? ? ? ? ? 680 PRO A N   1 
+ATOM   1342 C CA  . PRO A 1 190 ? 14.720  16.401  57.769  1.00 17.32 ? ? ? ? ? ? 680 PRO A CA  1 
+ATOM   1343 C C   . PRO A 1 190 ? 15.746  17.403  57.238  1.00 17.31 ? ? ? ? ? ? 680 PRO A C   1 
+ATOM   1344 O O   . PRO A 1 190 ? 15.457  18.595  57.192  1.00 18.58 ? ? ? ? ? ? 680 PRO A O   1 
+ATOM   1345 C CB  . PRO A 1 190 ? 14.531  16.502  59.281  1.00 18.70 ? ? ? ? ? ? 680 PRO A CB  1 
+ATOM   1346 C CG  . PRO A 1 190 ? 15.420  15.418  59.820  1.00 18.51 ? ? ? ? ? ? 680 PRO A CG  1 
+ATOM   1347 C CD  . PRO A 1 190 ? 15.233  14.286  58.863  1.00 17.07 ? ? ? ? ? ? 680 PRO A CD  1 
+ATOM   1348 N N   . ASP A 1 191 ? 16.936  16.937  56.866  1.00 16.83 ? ? ? ? ? ? 681 ASP A N   1 
+ATOM   1349 C CA  . ASP A 1 191 ? 17.977  17.830  56.341  1.00 17.87 ? ? ? ? ? ? 681 ASP A CA  1 
+ATOM   1350 C C   . ASP A 1 191 ? 18.019  17.920  54.799  1.00 16.11 ? ? ? ? ? ? 681 ASP A C   1 
+ATOM   1351 O O   . ASP A 1 191 ? 18.700  18.788  54.237  1.00 16.81 ? ? ? ? ? ? 681 ASP A O   1 
+ATOM   1352 C CB  . ASP A 1 191 ? 19.359  17.445  56.891  1.00 20.24 ? ? ? ? ? ? 681 ASP A CB  1 
+ATOM   1353 C CG  . ASP A 1 191 ? 19.503  17.731  58.405  1.00 23.69 ? ? ? ? ? ? 681 ASP A CG  1 
+ATOM   1354 O OD1 . ASP A 1 191 ? 18.952  18.745  58.903  1.00 24.92 ? ? ? ? ? ? 681 ASP A OD1 1 
+ATOM   1355 O OD2 . ASP A 1 191 ? 20.169  16.925  59.093  1.00 25.53 ? ? ? ? ? ? 681 ASP A OD2 1 
+ATOM   1356 N N   . ALA A 1 192 ? 17.318  17.014  54.132  1.00 13.26 ? ? ? ? ? ? 682 ALA A N   1 
+ATOM   1357 C CA  . ALA A 1 192 ? 17.284  16.990  52.673  1.00 12.61 ? ? ? ? ? ? 682 ALA A CA  1 
+ATOM   1358 C C   . ALA A 1 192 ? 16.392  18.116  52.125  1.00 11.78 ? ? ? ? ? ? 682 ALA A C   1 
+ATOM   1359 O O   . ALA A 1 192 ? 15.383  18.461  52.740  1.00 11.51 ? ? ? ? ? ? 682 ALA A O   1 
+ATOM   1360 C CB  . ALA A 1 192 ? 16.737  15.648  52.196  1.00 12.16 ? ? ? ? ? ? 682 ALA A CB  1 
+ATOM   1361 N N   . LEU A 1 193 ? 16.783  18.710  50.994  1.00 10.35 ? ? ? ? ? ? 683 LEU A N   1 
+ATOM   1362 C CA  . LEU A 1 193 ? 15.939  19.714  50.349  1.00 9.46  ? ? ? ? ? ? 683 LEU A CA  1 
+ATOM   1363 C C   . LEU A 1 193 ? 15.056  18.890  49.415  1.00 8.12  ? ? ? ? ? ? 683 LEU A C   1 
+ATOM   1364 O O   . LEU A 1 193 ? 15.547  18.129  48.574  1.00 9.20  ? ? ? ? ? ? 683 LEU A O   1 
+ATOM   1365 C CB  . LEU A 1 193 ? 16.763  20.702  49.524  1.00 10.77 ? ? ? ? ? ? 683 LEU A CB  1 
+ATOM   1366 C CG  . LEU A 1 193 ? 17.612  21.595  50.414  1.00 13.17 ? ? ? ? ? ? 683 LEU A CG  1 
+ATOM   1367 C CD1 . LEU A 1 193 ? 18.590  22.420  49.536  1.00 13.48 ? ? ? ? ? ? 683 LEU A CD1 1 
+ATOM   1368 C CD2 . LEU A 1 193 ? 16.671  22.476  51.285  1.00 14.23 ? ? ? ? ? ? 683 LEU A CD2 1 
+ATOM   1369 N N   . LEU A 1 194 ? 13.756  19.083  49.534  1.00 6.84  ? ? ? ? ? ? 684 LEU A N   1 
+ATOM   1370 C CA  . LEU A 1 194 ? 12.775  18.312  48.781  1.00 6.89  ? ? ? ? ? ? 684 LEU A CA  1 
+ATOM   1371 C C   . LEU A 1 194 ? 12.281  19.076  47.556  1.00 5.32  ? ? ? ? ? ? 684 LEU A C   1 
+ATOM   1372 O O   . LEU A 1 194 ? 11.767  20.188  47.687  1.00 6.16  ? ? ? ? ? ? 684 LEU A O   1 
+ATOM   1373 C CB  . LEU A 1 194 ? 11.598  17.963  49.727  1.00 6.91  ? ? ? ? ? ? 684 LEU A CB  1 
+ATOM   1374 C CG  . LEU A 1 194 ? 12.010  17.349  51.079  1.00 7.28  ? ? ? ? ? ? 684 LEU A CG  1 
+ATOM   1375 C CD1 . LEU A 1 194 ? 10.785  17.062  51.844  1.00 8.29  ? ? ? ? ? ? 684 LEU A CD1 1 
+ATOM   1376 C CD2 . LEU A 1 194 ? 12.854  16.112  50.873  1.00 7.97  ? ? ? ? ? ? 684 LEU A CD2 1 
+ATOM   1377 N N   . PHE A 1 195 ? 12.378  18.433  46.400  1.00 5.53  ? ? ? ? ? ? 685 PHE A N   1 
+ATOM   1378 C CA  . PHE A 1 195 ? 11.986  19.027  45.111  1.00 5.54  ? ? ? ? ? ? 685 PHE A CA  1 
+ATOM   1379 C C   . PHE A 1 195 ? 10.870  18.310  44.356  1.00 5.42  ? ? ? ? ? ? 685 PHE A C   1 
+ATOM   1380 O O   . PHE A 1 195 ? 10.746  17.085  44.426  1.00 6.80  ? ? ? ? ? ? 685 PHE A O   1 
+ATOM   1381 C CB  . PHE A 1 195 ? 13.180  19.007  44.143  1.00 5.66  ? ? ? ? ? ? 685 PHE A CB  1 
+ATOM   1382 C CG  . PHE A 1 195 ? 14.223  20.039  44.434  1.00 6.45  ? ? ? ? ? ? 685 PHE A CG  1 
+ATOM   1383 C CD1 . PHE A 1 195 ? 15.020  19.953  45.571  1.00 7.50  ? ? ? ? ? ? 685 PHE A CD1 1 
+ATOM   1384 C CD2 . PHE A 1 195 ? 14.383  21.125  43.586  1.00 7.13  ? ? ? ? ? ? 685 PHE A CD2 1 
+ATOM   1385 C CE1 . PHE A 1 195 ? 15.956  20.930  45.876  1.00 8.44  ? ? ? ? ? ? 685 PHE A CE1 1 
+ATOM   1386 C CE2 . PHE A 1 195 ? 15.315  22.104  43.887  1.00 9.11  ? ? ? ? ? ? 685 PHE A CE2 1 
+ATOM   1387 C CZ  . PHE A 1 195 ? 16.104  22.005  45.043  1.00 9.15  ? ? ? ? ? ? 685 PHE A CZ  1 
+ATOM   1388 N N   . TYR A 1 196 ? 10.107  19.104  43.603  1.00 6.04  ? ? ? ? ? ? 686 TYR A N   1 
+ATOM   1389 C CA  . TYR A 1 196 ? 9.105   18.643  42.648  1.00 6.20  ? ? ? ? ? ? 686 TYR A CA  1 
+ATOM   1390 C C   . TYR A 1 196 ? 9.828   18.965  41.315  1.00 6.40  ? ? ? ? ? ? 686 TYR A C   1 
+ATOM   1391 O O   . TYR A 1 196 ? 10.163  20.125  41.076  1.00 7.61  ? ? ? ? ? ? 686 TYR A O   1 
+ATOM   1392 C CB  . TYR A 1 196 ? 7.807   19.436  42.729  1.00 6.67  ? ? ? ? ? ? 686 TYR A CB  1 
+ATOM   1393 C CG  . TYR A 1 196 ? 6.907   19.047  41.599  1.00 8.19  ? ? ? ? ? ? 686 TYR A CG  1 
+ATOM   1394 C CD1 . TYR A 1 196 ? 6.213   17.854  41.623  1.00 9.84  ? ? ? ? ? ? 686 TYR A CD1 1 
+ATOM   1395 C CD2 . TYR A 1 196 ? 6.846   19.826  40.440  1.00 9.73  ? ? ? ? ? ? 686 TYR A CD2 1 
+ATOM   1396 C CE1 . TYR A 1 196 ? 5.481   17.418  40.528  1.00 11.80 ? ? ? ? ? ? 686 TYR A CE1 1 
+ATOM   1397 C CE2 . TYR A 1 196 ? 6.116   19.414  39.324  1.00 10.10 ? ? ? ? ? ? 686 TYR A CE2 1 
+ATOM   1398 C CZ  . TYR A 1 196 ? 5.433   18.199  39.370  1.00 11.40 ? ? ? ? ? ? 686 TYR A CZ  1 
+ATOM   1399 O OH  . TYR A 1 196 ? 4.745   17.746  38.263  1.00 11.62 ? ? ? ? ? ? 686 TYR A OH  1 
+ATOM   1400 N N   . ASN A 1 197 ? 9.999   17.970  40.451  1.00 6.16  ? ? ? ? ? ? 687 ASN A N   1 
+ATOM   1401 C CA  . ASN A 1 197 ? 10.784  18.095  39.209  1.00 6.41  ? ? ? ? ? ? 687 ASN A CA  1 
+ATOM   1402 C C   . ASN A 1 197 ? 9.897   17.859  37.988  1.00 7.43  ? ? ? ? ? ? 687 ASN A C   1 
+ATOM   1403 O O   . ASN A 1 197 ? 9.096   16.917  37.981  1.00 8.20  ? ? ? ? ? ? 687 ASN A O   1 
+ATOM   1404 C CB  . ASN A 1 197 ? 11.911  17.055  39.263  1.00 6.42  ? ? ? ? ? ? 687 ASN A CB  1 
+ATOM   1405 C CG  . ASN A 1 197 ? 12.938  17.225  38.151  1.00 7.76  ? ? ? ? ? ? 687 ASN A CG  1 
+ATOM   1406 O OD1 . ASN A 1 197 ? 13.545  18.277  38.029  1.00 8.53  ? ? ? ? ? ? 687 ASN A OD1 1 
+ATOM   1407 N ND2 . ASN A 1 197 ? 13.186  16.165  37.393  1.00 7.31  ? ? ? ? ? ? 687 ASN A ND2 1 
+ATOM   1408 N N   . ASP A 1 198 ? 10.016  18.704  36.961  1.00 6.72  ? ? ? ? ? ? 688 ASP A N   1 
+ATOM   1409 C CA  . ASP A 1 198 ? 9.157   18.534  35.774  1.00 6.46  ? ? ? ? ? ? 688 ASP A CA  1 
+ATOM   1410 C C   . ASP A 1 198 ? 9.748   19.272  34.568  1.00 6.21  ? ? ? ? ? ? 688 ASP A C   1 
+ATOM   1411 O O   . ASP A 1 198 ? 10.699  20.038  34.716  1.00 6.93  ? ? ? ? ? ? 688 ASP A O   1 
+ATOM   1412 C CB  . ASP A 1 198 ? 7.750   19.082  36.080  1.00 7.72  ? ? ? ? ? ? 688 ASP A CB  1 
+ATOM   1413 C CG  . ASP A 1 198 ? 6.619   18.336  35.344  1.00 7.51  ? ? ? ? ? ? 688 ASP A CG  1 
+ATOM   1414 O OD1 . ASP A 1 198 ? 6.851   17.709  34.302  1.00 8.37  ? ? ? ? ? ? 688 ASP A OD1 1 
+ATOM   1415 O OD2 . ASP A 1 198 ? 5.464   18.379  35.832  1.00 10.71 ? ? ? ? ? ? 688 ASP A OD2 1 
+ATOM   1416 N N   . TYR A 1 199 ? 9.175   19.030  33.387  1.00 7.40  ? ? ? ? ? ? 689 TYR A N   1 
+ATOM   1417 C CA  . TYR A 1 199 ? 9.636   19.662  32.136  1.00 8.13  ? ? ? ? ? ? 689 TYR A CA  1 
+ATOM   1418 C C   . TYR A 1 199 ? 8.551   20.619  31.620  1.00 8.50  ? ? ? ? ? ? 689 TYR A C   1 
+ATOM   1419 O O   . TYR A 1 199 ? 7.375   20.481  31.967  1.00 8.49  ? ? ? ? ? ? 689 TYR A O   1 
+ATOM   1420 C CB  . TYR A 1 199 ? 9.998   18.590  31.083  1.00 8.55  ? ? ? ? ? ? 689 TYR A CB  1 
+ATOM   1421 C CG  . TYR A 1 199 ? 8.839   17.688  30.679  1.00 9.89  ? ? ? ? ? ? 689 TYR A CG  1 
+ATOM   1422 C CD1 . TYR A 1 199 ? 7.969   18.061  29.645  1.00 11.80 ? ? ? ? ? ? 689 TYR A CD1 1 
+ATOM   1423 C CD2 . TYR A 1 199 ? 8.589   16.478  31.340  1.00 10.35 ? ? ? ? ? ? 689 TYR A CD2 1 
+ATOM   1424 C CE1 . TYR A 1 199 ? 6.876   17.253  29.275  1.00 12.45 ? ? ? ? ? ? 689 TYR A CE1 1 
+ATOM   1425 C CE2 . TYR A 1 199 ? 7.502   15.672  30.990  1.00 11.81 ? ? ? ? ? ? 689 TYR A CE2 1 
+ATOM   1426 C CZ  . TYR A 1 199 ? 6.643   16.070  29.944  1.00 13.40 ? ? ? ? ? ? 689 TYR A CZ  1 
+ATOM   1427 O OH  . TYR A 1 199 ? 5.550   15.310  29.562  1.00 15.47 ? ? ? ? ? ? 689 TYR A OH  1 
+ATOM   1428 N N   . ASN A 1 200 ? 8.939   21.587  30.778  1.00 9.20  ? ? ? ? ? ? 690 ASN A N   1 
+ATOM   1429 C CA  . ASN A 1 200 ? 7.984   22.578  30.230  1.00 10.09 ? ? ? ? ? ? 690 ASN A CA  1 
+ATOM   1430 C C   . ASN A 1 200 ? 7.281   23.415  31.301  1.00 9.15  ? ? ? ? ? ? 690 ASN A C   1 
+ATOM   1431 O O   . ASN A 1 200 ? 6.119   23.775  31.142  1.00 10.51 ? ? ? ? ? ? 690 ASN A O   1 
+ATOM   1432 C CB  . ASN A 1 200 ? 6.921   21.943  29.307  1.00 13.59 ? ? ? ? ? ? 690 ASN A CB  1 
+ATOM   1433 C CG  . ASN A 1 200 ? 7.503   21.349  28.024  1.00 19.88 ? ? ? ? ? ? 690 ASN A CG  1 
+ATOM   1434 O OD1 . ASN A 1 200 ? 8.661   21.615  27.662  1.00 24.00 ? ? ? ? ? ? 690 ASN A OD1 1 
+ATOM   1435 N ND2 . ASN A 1 200 ? 6.709   20.505  27.331  1.00 21.71 ? ? ? ? ? ? 690 ASN A ND2 1 
+ATOM   1436 N N   . ILE A 1 201 ? 7.991   23.697  32.399  1.00 7.85  ? ? ? ? ? ? 691 ILE A N   1 
+ATOM   1437 C CA  . ILE A 1 201 ? 7.501   24.520  33.504  1.00 8.08  ? ? ? ? ? ? 691 ILE A CA  1 
+ATOM   1438 C C   . ILE A 1 201 ? 8.466   25.706  33.794  1.00 8.74  ? ? ? ? ? ? 691 ILE A C   1 
+ATOM   1439 O O   . ILE A 1 201 ? 8.333   26.421  34.818  1.00 9.11  ? ? ? ? ? ? 691 ILE A O   1 
+ATOM   1440 C CB  . ILE A 1 201 ? 7.344   23.698  34.824  1.00 7.49  ? ? ? ? ? ? 691 ILE A CB  1 
+ATOM   1441 C CG1 . ILE A 1 201 ? 8.690   23.112  35.262  1.00 7.88  ? ? ? ? ? ? 691 ILE A CG1 1 
+ATOM   1442 C CG2 . ILE A 1 201 ? 6.312   22.605  34.640  1.00 8.47  ? ? ? ? ? ? 691 ILE A CG2 1 
+ATOM   1443 C CD1 . ILE A 1 201 ? 8.745   22.706  36.749  1.00 9.41  ? ? ? ? ? ? 691 ILE A CD1 1 
+ATOM   1444 N N   . GLU A 1 202 ? 9.386   25.950  32.848  1.00 8.29  ? ? ? ? ? ? 692 GLU A N   1 
+ATOM   1445 C CA  . GLU A 1 202 ? 10.415  26.991  33.013  1.00 8.57  ? ? ? ? ? ? 692 GLU A CA  1 
+ATOM   1446 C C   . GLU A 1 202 ? 9.985   28.416  32.636  1.00 9.36  ? ? ? ? ? ? 692 GLU A C   1 
+ATOM   1447 O O   . GLU A 1 202 ? 10.504  29.387  33.185  1.00 9.96  ? ? ? ? ? ? 692 GLU A O   1 
+ATOM   1448 C CB  . GLU A 1 202 ? 11.672  26.632  32.209  1.00 8.11  ? ? ? ? ? ? 692 GLU A CB  1 
+ATOM   1449 C CG  . GLU A 1 202 ? 12.273  25.273  32.506  1.00 9.28  ? ? ? ? ? ? 692 GLU A CG  1 
+ATOM   1450 C CD  . GLU A 1 202 ? 11.681  24.106  31.702  1.00 10.09 ? ? ? ? ? ? 692 GLU A CD  1 
+ATOM   1451 O OE1 . GLU A 1 202 ? 10.704  24.272  30.918  1.00 9.96  ? ? ? ? ? ? 692 GLU A OE1 1 
+ATOM   1452 O OE2 . GLU A 1 202 ? 12.219  22.999  31.846  1.00 10.79 ? ? ? ? ? ? 692 GLU A OE2 1 
+ATOM   1453 N N   . ASP A 1 203 ? 9.034   28.519  31.699  1.00 10.25 ? ? ? ? ? ? 693 ASP A N   1 
+ATOM   1454 C CA  . ASP A 1 203 ? 8.544   29.818  31.221  1.00 10.88 ? ? ? ? ? ? 693 ASP A CA  1 
+ATOM   1455 C C   . ASP A 1 203 ? 7.335   30.306  32.025  1.00 11.44 ? ? ? ? ? ? 693 ASP A C   1 
+ATOM   1456 O O   . ASP A 1 203 ? 7.231   30.035  33.230  1.00 10.68 ? ? ? ? ? ? 693 ASP A O   1 
+ATOM   1457 C CB  . ASP A 1 203 ? 8.224   29.741  29.718  1.00 12.00 ? ? ? ? ? ? 693 ASP A CB  1 
+ATOM   1458 C CG  . ASP A 1 203 ? 7.124   28.713  29.379  1.00 13.76 ? ? ? ? ? ? 693 ASP A CG  1 
+ATOM   1459 O OD1 . ASP A 1 203 ? 6.433   28.182  30.277  1.00 13.16 ? ? ? ? ? ? 693 ASP A OD1 1 
+ATOM   1460 O OD2 . ASP A 1 203 ? 6.950   28.421  28.175  1.00 15.65 ? ? ? ? ? ? 693 ASP A OD2 1 
+ATOM   1461 N N   . LEU A 1 204 ? 6.462   31.100  31.392  1.00 11.18 ? ? ? ? ? ? 694 LEU A N   1 
+ATOM   1462 C CA  . LEU A 1 204 ? 5.266   31.590  32.086  1.00 11.21 ? ? ? ? ? ? 694 LEU A CA  1 
+ATOM   1463 C C   . LEU A 1 204 ? 4.001   31.085  31.388  1.00 10.70 ? ? ? ? ? ? 694 LEU A C   1 
+ATOM   1464 O O   . LEU A 1 204 ? 2.966   31.716  31.446  1.00 12.38 ? ? ? ? ? ? 694 LEU A O   1 
+ATOM   1465 C CB  . LEU A 1 204 ? 5.276   33.117  32.223  1.00 11.87 ? ? ? ? ? ? 694 LEU A CB  1 
+ATOM   1466 C CG  . LEU A 1 204 ? 6.448   33.728  33.031  1.00 13.21 ? ? ? ? ? ? 694 LEU A CG  1 
+ATOM   1467 C CD1 . LEU A 1 204 ? 6.543   35.255  32.797  1.00 13.01 ? ? ? ? ? ? 694 LEU A CD1 1 
+ATOM   1468 C CD2 . LEU A 1 204 ? 6.319   33.433  34.547  1.00 13.38 ? ? ? ? ? ? 694 LEU A CD2 1 
+ATOM   1469 N N   . GLY A 1 205 ? 4.108   29.932  30.742  1.00 11.36 ? ? ? ? ? ? 695 GLY A N   1 
+ATOM   1470 C CA  . GLY A 1 205 ? 2.988   29.301  30.055  1.00 11.97 ? ? ? ? ? ? 695 GLY A CA  1 
+ATOM   1471 C C   . GLY A 1 205 ? 2.007   28.563  30.976  1.00 11.95 ? ? ? ? ? ? 695 GLY A C   1 
+ATOM   1472 O O   . GLY A 1 205 ? 2.250   28.458  32.177  1.00 10.45 ? ? ? ? ? ? 695 GLY A O   1 
+ATOM   1473 N N   . PRO A 1 206 ? 0.934   27.964  30.427  1.00 12.59 ? ? ? ? ? ? 696 PRO A N   1 
+ATOM   1474 C CA  . PRO A 1 206 ? -0.049  27.256  31.267  1.00 12.44 ? ? ? ? ? ? 696 PRO A CA  1 
+ATOM   1475 C C   . PRO A 1 206 ? 0.463   26.147  32.191  1.00 12.07 ? ? ? ? ? ? 696 PRO A C   1 
+ATOM   1476 O O   . PRO A 1 206 ? 0.079   26.136  33.358  1.00 13.43 ? ? ? ? ? ? 696 PRO A O   1 
+ATOM   1477 C CB  . PRO A 1 206 ? -1.118  26.773  30.275  1.00 14.05 ? ? ? ? ? ? 696 PRO A CB  1 
+ATOM   1478 C CG  . PRO A 1 206 ? -0.543  26.986  28.910  1.00 15.40 ? ? ? ? ? ? 696 PRO A CG  1 
+ATOM   1479 C CD  . PRO A 1 206 ? 0.480   28.082  29.028  1.00 14.21 ? ? ? ? ? ? 696 PRO A CD  1 
+ATOM   1480 N N   . LYS A 1 207 ? 1.354   25.273  31.728  1.00 10.48 ? ? ? ? ? ? 697 LYS A N   1 
+ATOM   1481 C CA  . LYS A 1 207 ? 1.850   24.211  32.602  1.00 10.17 ? ? ? ? ? ? 697 LYS A CA  1 
+ATOM   1482 C C   . LYS A 1 207 ? 2.710   24.814  33.722  1.00 10.26 ? ? ? ? ? ? 697 LYS A C   1 
+ATOM   1483 O O   . LYS A 1 207 ? 2.646   24.369  34.871  1.00 9.04  ? ? ? ? ? ? 697 LYS A O   1 
+ATOM   1484 C CB  . LYS A 1 207 ? 2.647   23.189  31.810  1.00 9.61  ? ? ? ? ? ? 697 LYS A CB  1 
+ATOM   1485 C CG  . LYS A 1 207 ? 2.905   21.906  32.572  1.00 9.66  ? ? ? ? ? ? 697 LYS A CG  1 
+ATOM   1486 C CD  . LYS A 1 207 ? 3.831   21.005  31.787  1.00 8.50  ? ? ? ? ? ? 697 LYS A CD  1 
+ATOM   1487 C CE  . LYS A 1 207 ? 4.077   19.644  32.484  1.00 8.97  ? ? ? ? ? ? 697 LYS A CE  1 
+ATOM   1488 N NZ  . LYS A 1 207 ? 5.049   18.797  31.704  1.00 9.85  ? ? ? ? ? ? 697 LYS A NZ  1 
+ATOM   1489 N N   . SER A 1 208 ? 3.506   25.839  33.395  1.00 9.18  ? ? ? ? ? ? 698 SER A N   1 
+ATOM   1490 C CA  . SER A 1 208 ? 4.345   26.512  34.390  1.00 8.89  ? ? ? ? ? ? 698 SER A CA  1 
+ATOM   1491 C C   . SER A 1 208 ? 3.467   27.158  35.469  1.00 9.65  ? ? ? ? ? ? 698 SER A C   1 
+ATOM   1492 O O   . SER A 1 208 ? 3.768   27.100  36.676  1.00 9.22  ? ? ? ? ? ? 698 SER A O   1 
+ATOM   1493 C CB  . SER A 1 208 ? 5.183   27.608  33.731  1.00 9.19  ? ? ? ? ? ? 698 SER A CB  1 
+ATOM   1494 O OG  . SER A 1 208 ? 5.788   28.397  34.725  1.00 9.94  ? ? ? ? ? ? 698 SER A OG  1 
+ATOM   1495 N N   . ASN A 1 209 ? 2.399   27.811  35.027  1.00 9.47  ? ? ? ? ? ? 699 ASN A N   1 
+ATOM   1496 C CA  . ASN A 1 209 ? 1.480   28.458  35.957  1.00 10.75 ? ? ? ? ? ? 699 ASN A CA  1 
+ATOM   1497 C C   . ASN A 1 209 ? 0.766   27.420  36.847  1.00 10.84 ? ? ? ? ? ? 699 ASN A C   1 
+ATOM   1498 O O   . ASN A 1 209 ? 0.525   27.677  38.036  1.00 12.28 ? ? ? ? ? ? 699 ASN A O   1 
+ATOM   1499 C CB  . ASN A 1 209 ? 0.434   29.292  35.208  1.00 11.64 ? ? ? ? ? ? 699 ASN A CB  1 
+ATOM   1500 C CG  . ASN A 1 209 ? 1.020   30.526  34.549  1.00 13.16 ? ? ? ? ? ? 699 ASN A CG  1 
+ATOM   1501 O OD1 . ASN A 1 209 ? 2.094   31.014  34.912  1.00 14.22 ? ? ? ? ? ? 699 ASN A OD1 1 
+ATOM   1502 N ND2 . ASN A 1 209 ? 0.305   31.045  33.574  1.00 14.26 ? ? ? ? ? ? 699 ASN A ND2 1 
+ATOM   1503 N N   . ALA A 1 210 ? 0.418   26.268  36.277  1.00 10.94 ? ? ? ? ? ? 700 ALA A N   1 
+ATOM   1504 C CA  . ALA A 1 210 ? -0.248  25.201  37.052  1.00 11.45 ? ? ? ? ? ? 700 ALA A CA  1 
+ATOM   1505 C C   . ALA A 1 210 ? 0.699   24.681  38.147  1.00 10.06 ? ? ? ? ? ? 700 ALA A C   1 
+ATOM   1506 O O   . ALA A 1 210 ? 0.269   24.489  39.285  1.00 11.58 ? ? ? ? ? ? 700 ALA A O   1 
+ATOM   1507 C CB  . ALA A 1 210 ? -0.666  24.059  36.141  1.00 11.97 ? ? ? ? ? ? 700 ALA A CB  1 
+ATOM   1508 N N   . VAL A 1 211 ? 1.978   24.478  37.824  1.00 8.49  ? ? ? ? ? ? 701 VAL A N   1 
+ATOM   1509 C CA  . VAL A 1 211 ? 2.963   23.995  38.802  1.00 8.74  ? ? ? ? ? ? 701 VAL A CA  1 
+ATOM   1510 C C   . VAL A 1 211 ? 3.256   25.039  39.882  1.00 8.75  ? ? ? ? ? ? 701 VAL A C   1 
+ATOM   1511 O O   . VAL A 1 211 ? 3.299   24.709  41.055  1.00 10.08 ? ? ? ? ? ? 701 VAL A O   1 
+ATOM   1512 C CB  . VAL A 1 211 ? 4.258   23.489  38.132  1.00 7.81  ? ? ? ? ? ? 701 VAL A CB  1 
+ATOM   1513 C CG1 . VAL A 1 211 ? 5.328   23.205  39.150  1.00 8.09  ? ? ? ? ? ? 701 VAL A CG1 1 
+ATOM   1514 C CG2 . VAL A 1 211 ? 3.981   22.224  37.352  1.00 8.15  ? ? ? ? ? ? 701 VAL A CG2 1 
+ATOM   1515 N N   . PHE A 1 212 ? 3.402   26.311  39.510  1.00 8.03  ? ? ? ? ? ? 702 PHE A N   1 
+ATOM   1516 C CA  . PHE A 1 212 ? 3.640   27.371  40.488  1.00 8.25  ? ? ? ? ? ? 702 PHE A CA  1 
+ATOM   1517 C C   . PHE A 1 212 ? 2.477   27.469  41.499  1.00 8.70  ? ? ? ? ? ? 702 PHE A C   1 
+ATOM   1518 O O   . PHE A 1 212 ? 2.704   27.552  42.702  1.00 8.94  ? ? ? ? ? ? 702 PHE A O   1 
+ATOM   1519 C CB  . PHE A 1 212 ? 3.834   28.733  39.770  1.00 8.60  ? ? ? ? ? ? 702 PHE A CB  1 
+ATOM   1520 C CG  . PHE A 1 212 ? 3.889   29.901  40.702  1.00 9.98  ? ? ? ? ? ? 702 PHE A CG  1 
+ATOM   1521 C CD1 . PHE A 1 212 ? 5.054   30.194  41.388  1.00 10.08 ? ? ? ? ? ? 702 PHE A CD1 1 
+ATOM   1522 C CD2 . PHE A 1 212 ? 2.748   30.670  40.947  1.00 10.86 ? ? ? ? ? ? 702 PHE A CD2 1 
+ATOM   1523 C CE1 . PHE A 1 212 ? 5.077   31.235  42.317  1.00 11.76 ? ? ? ? ? ? 702 PHE A CE1 1 
+ATOM   1524 C CE2 . PHE A 1 212 ? 2.766   31.703  41.871  1.00 11.08 ? ? ? ? ? ? 702 PHE A CE2 1 
+ATOM   1525 C CZ  . PHE A 1 212 ? 3.935   31.983  42.558  1.00 10.61 ? ? ? ? ? ? 702 PHE A CZ  1 
+ATOM   1526 N N   . ASN A 1 213 ? 1.245   27.475  40.996  1.00 9.83  ? ? ? ? ? ? 703 ASN A N   1 
+ATOM   1527 C CA  . ASN A 1 213 ? 0.071   27.570  41.868  1.00 12.01 ? ? ? ? ? ? 703 ASN A CA  1 
+ATOM   1528 C C   . ASN A 1 213 ? -0.052  26.323  42.747  1.00 12.38 ? ? ? ? ? ? 703 ASN A C   1 
+ATOM   1529 O O   . ASN A 1 213 ? -0.417  26.445  43.915  1.00 13.72 ? ? ? ? ? ? 703 ASN A O   1 
+ATOM   1530 C CB  . ASN A 1 213 ? -1.204  27.840  41.077  1.00 14.33 ? ? ? ? ? ? 703 ASN A CB  1 
+ATOM   1531 C CG  . ASN A 1 213 ? -1.307  29.292  40.613  1.00 17.70 ? ? ? ? ? ? 703 ASN A CG  1 
+ATOM   1532 O OD1 . ASN A 1 213 ? -1.029  30.237  41.367  1.00 20.02 ? ? ? ? ? ? 703 ASN A OD1 1 
+ATOM   1533 N ND2 . ASN A 1 213 ? -1.710  29.476  39.376  1.00 20.46 ? ? ? ? ? ? 703 ASN A ND2 1 
+ATOM   1534 N N   . MET A 1 214 ? 0.317   25.151  42.212  1.00 11.57 ? ? ? ? ? ? 704 MET A N   1 
+ATOM   1535 C CA  . MET A 1 214 ? 0.288   23.918  42.988  1.00 11.79 ? ? ? ? ? ? 704 MET A CA  1 
+ATOM   1536 C C   . MET A 1 214 ? 1.266   24.019  44.172  1.00 10.63 ? ? ? ? ? ? 704 MET A C   1 
+ATOM   1537 O O   . MET A 1 214 ? 0.914   23.738  45.316  1.00 10.64 ? ? ? ? ? ? 704 MET A O   1 
+ATOM   1538 C CB  . MET A 1 214 ? 0.661   22.714  42.117  1.00 11.85 ? ? ? ? ? ? 704 MET A CB  1 
+ATOM   1539 C CG  . MET A 1 214 ? 0.756   21.410  42.921  1.00 14.76 ? ? ? ? ? ? 704 MET A CG  1 
+ATOM   1540 S SD  . MET A 1 214 ? 1.281   19.965  41.978  1.00 17.19 ? ? ? ? ? ? 704 MET A SD  1 
+ATOM   1541 C CE  . MET A 1 214 ? 2.907   20.349  41.684  1.00 17.42 ? ? ? ? ? ? 704 MET A CE  1 
+ATOM   1542 N N   . ILE A 1 215 ? 2.491   24.447  43.894  1.00 9.25  ? ? ? ? ? ? 705 ILE A N   1 
+ATOM   1543 C CA  . ILE A 1 215 ? 3.506   24.549  44.929  1.00 9.61  ? ? ? ? ? ? 705 ILE A CA  1 
+ATOM   1544 C C   . ILE A 1 215 ? 3.175   25.629  45.943  1.00 9.98  ? ? ? ? ? ? 705 ILE A C   1 
+ATOM   1545 O O   . ILE A 1 215 ? 3.331   25.437  47.144  1.00 10.55 ? ? ? ? ? ? 705 ILE A O   1 
+ATOM   1546 C CB  . ILE A 1 215 ? 4.878   24.757  44.286  1.00 9.69  ? ? ? ? ? ? 705 ILE A CB  1 
+ATOM   1547 C CG1 . ILE A 1 215 ? 5.251   23.481  43.525  1.00 9.53  ? ? ? ? ? ? 705 ILE A CG1 1 
+ATOM   1548 C CG2 . ILE A 1 215 ? 5.907   25.180  45.330  1.00 9.75  ? ? ? ? ? ? 705 ILE A CG2 1 
+ATOM   1549 C CD1 . ILE A 1 215 ? 6.561   23.582  42.784  1.00 9.63  ? ? ? ? ? ? 705 ILE A CD1 1 
+ATOM   1550 N N   . LYS A 1 216 ? 2.686   26.767  45.462  1.00 10.82 ? ? ? ? ? ? 706 LYS A N   1 
+ATOM   1551 C CA  . LYS A 1 216 ? 2.286   27.851  46.354  1.00 11.64 ? ? ? ? ? ? 706 LYS A CA  1 
+ATOM   1552 C C   . LYS A 1 216 ? 1.168   27.356  47.320  1.00 11.68 ? ? ? ? ? ? 706 LYS A C   1 
+ATOM   1553 O O   . LYS A 1 216 ? 1.230   27.593  48.514  1.00 12.32 ? ? ? ? ? ? 706 LYS A O   1 
+ATOM   1554 C CB  . LYS A 1 216 ? 1.803   29.026  45.516  1.00 11.74 ? ? ? ? ? ? 706 LYS A CB  1 
+ATOM   1555 C CG  . LYS A 1 216 ? 1.333   30.215  46.303  1.00 14.97 ? ? ? ? ? ? 706 LYS A CG  1 
+ATOM   1556 C CD  . LYS A 1 216 ? 0.878   31.242  45.282  1.00 18.19 ? ? ? ? ? ? 706 LYS A CD  1 
+ATOM   1557 C CE  . LYS A 1 216 ? -0.112  32.194  45.863  1.00 23.05 ? ? ? ? ? ? 706 LYS A CE  1 
+ATOM   1558 N NZ  . LYS A 1 216 ? 0.573   32.882  46.998  1.00 25.92 ? ? ? ? ? ? 706 LYS A NZ  1 
+ATOM   1559 N N   . SER A 1 217 ? 0.178   26.648  46.795  1.00 12.04 ? ? ? ? ? ? 707 SER A N   1 
+ATOM   1560 C CA  . SER A 1 217 ? -0.917  26.122  47.595  1.00 13.99 ? ? ? ? ? ? 707 SER A CA  1 
+ATOM   1561 C C   . SER A 1 217 ? -0.433  25.071  48.613  1.00 14.05 ? ? ? ? ? ? 707 SER A C   1 
+ATOM   1562 O O   . SER A 1 217 ? -0.876  25.081  49.771  1.00 14.01 ? ? ? ? ? ? 707 SER A O   1 
+ATOM   1563 C CB  . SER A 1 217 ? -1.968  25.517  46.679  1.00 16.30 ? ? ? ? ? ? 707 SER A CB  1 
+ATOM   1564 O OG  . SER A 1 217 ? -3.012  24.929  47.433  1.00 21.95 ? ? ? ? ? ? 707 SER A OG  1 
+ATOM   1565 N N   . MET A 1 218 ? 0.461   24.171  48.192  1.00 13.32 ? ? ? ? ? ? 708 MET A N   1 
+ATOM   1566 C CA  . MET A 1 218 ? 1.007   23.146  49.089  1.00 13.90 ? ? ? ? ? ? 708 MET A CA  1 
+ATOM   1567 C C   . MET A 1 218 ? 1.652   23.828  50.278  1.00 15.20 ? ? ? ? ? ? 708 MET A C   1 
+ATOM   1568 O O   . MET A 1 218 ? 1.387   23.458  51.427  1.00 15.09 ? ? ? ? ? ? 708 MET A O   1 
+ATOM   1569 C CB  . MET A 1 218 ? 2.046   22.270  48.385  1.00 15.29 ? ? ? ? ? ? 708 MET A CB  1 
+ATOM   1570 C CG  . MET A 1 218 ? 1.435   21.182  47.533  1.00 17.98 ? ? ? ? ? ? 708 MET A CG  1 
+ATOM   1571 S SD  . MET A 1 218 ? 2.658   20.366  46.455  1.00 21.36 ? ? ? ? ? ? 708 MET A SD  1 
+ATOM   1572 C CE  . MET A 1 218 ? 3.602   19.453  47.631  1.00 20.26 ? ? ? ? ? ? 708 MET A CE  1 
+ATOM   1573 N N   . LYS A 1 219 ? 2.472   24.849  50.022  1.00 15.53 ? ? ? ? ? ? 709 LYS A N   1 
+ATOM   1574 C CA  . LYS A 1 219 ? 3.114   25.568  51.122  1.00 17.48 ? ? ? ? ? ? 709 LYS A CA  1 
+ATOM   1575 C C   . LYS A 1 219 ? 2.109   26.272  52.032  1.00 17.94 ? ? ? ? ? ? 709 LYS A C   1 
+ATOM   1576 O O   . LYS A 1 219 ? 2.305   26.308  53.256  1.00 19.02 ? ? ? ? ? ? 709 LYS A O   1 
+ATOM   1577 C CB  . LYS A 1 219 ? 4.148   26.567  50.615  1.00 18.08 ? ? ? ? ? ? 709 LYS A CB  1 
+ATOM   1578 C CG  . LYS A 1 219 ? 5.314   25.903  49.972  1.00 19.52 ? ? ? ? ? ? 709 LYS A CG  1 
+ATOM   1579 C CD  . LYS A 1 219 ? 6.443   26.878  49.675  1.00 21.08 ? ? ? ? ? ? 709 LYS A CD  1 
+ATOM   1580 C CE  . LYS A 1 219 ? 7.261   27.264  50.912  1.00 22.26 ? ? ? ? ? ? 709 LYS A CE  1 
+ATOM   1581 N NZ  . LYS A 1 219 ? 8.206   26.178  51.397  1.00 22.53 ? ? ? ? ? ? 709 LYS A NZ  1 
+ATOM   1582 N N   . GLU A 1 220 ? 1.045   26.825  51.464  1.00 17.74 ? ? ? ? ? ? 710 GLU A N   1 
+ATOM   1583 C CA  . GLU A 1 220 ? 0.037   27.495  52.282  1.00 20.71 ? ? ? ? ? ? 710 GLU A CA  1 
+ATOM   1584 C C   . GLU A 1 220 ? -0.728  26.526  53.173  1.00 20.14 ? ? ? ? ? ? 710 GLU A C   1 
+ATOM   1585 O O   . GLU A 1 220 ? -1.434  26.958  54.073  1.00 20.13 ? ? ? ? ? ? 710 GLU A O   1 
+ATOM   1586 C CB  . GLU A 1 220 ? -0.984  28.224  51.432  1.00 22.49 ? ? ? ? ? ? 710 GLU A CB  1 
+ATOM   1587 C CG  . GLU A 1 220 ? -0.449  29.431  50.780  1.00 26.82 ? ? ? ? ? ? 710 GLU A CG  1 
+ATOM   1588 C CD  . GLU A 1 220 ? -1.500  30.127  49.937  1.00 29.66 ? ? ? ? ? ? 710 GLU A CD  1 
+ATOM   1589 O OE1 . GLU A 1 220 ? -2.505  29.496  49.509  1.00 30.93 ? ? ? ? ? ? 710 GLU A OE1 1 
+ATOM   1590 O OE2 . GLU A 1 220 ? -1.316  31.332  49.715  1.00 32.59 ? ? ? ? ? ? 710 GLU A OE2 1 
+ATOM   1591 N N   . ARG A 1 221 ? -0.649  25.236  52.861  1.00 19.44 ? ? ? ? ? ? 711 ARG A N   1 
+ATOM   1592 C CA  . ARG A 1 221 ? -1.330  24.206  53.632  1.00 20.20 ? ? ? ? ? ? 711 ARG A CA  1 
+ATOM   1593 C C   . ARG A 1 221 ? -0.358  23.443  54.524  1.00 19.06 ? ? ? ? ? ? 711 ARG A C   1 
+ATOM   1594 O O   . ARG A 1 221 ? -0.668  22.354  54.992  1.00 19.95 ? ? ? ? ? ? 711 ARG A O   1 
+ATOM   1595 C CB  . ARG A 1 221 ? -2.051  23.252  52.680  1.00 22.22 ? ? ? ? ? ? 711 ARG A CB  1 
+ATOM   1596 C CG  . ARG A 1 221 ? -2.986  23.996  51.742  1.00 25.57 ? ? ? ? ? ? 711 ARG A CG  1 
+ATOM   1597 C CD  . ARG A 1 221 ? -3.803  23.092  50.817  1.00 26.84 ? ? ? ? ? ? 711 ARG A CD  1 
+ATOM   1598 N NE  . ARG A 1 221 ? -3.072  22.501  49.675  1.00 27.16 ? ? ? ? ? ? 711 ARG A NE  1 
+ATOM   1599 C CZ  . ARG A 1 221 ? -2.594  21.262  49.684  1.00 26.18 ? ? ? ? ? ? 711 ARG A CZ  1 
+ATOM   1600 N NH1 . ARG A 1 221 ? -2.713  20.556  50.793  1.00 26.12 ? ? ? ? ? ? 711 ARG A NH1 1 
+ATOM   1601 N NH2 . ARG A 1 221 ? -1.963  20.754  48.629  1.00 25.60 ? ? ? ? ? ? 711 ARG A NH2 1 
+ATOM   1602 N N   . GLY A 1 222 ? 0.844   23.975  54.692  1.00 17.78 ? ? ? ? ? ? 712 GLY A N   1 
+ATOM   1603 C CA  . GLY A 1 222 ? 1.847   23.325  55.526  1.00 17.90 ? ? ? ? ? ? 712 GLY A CA  1 
+ATOM   1604 C C   . GLY A 1 222 ? 2.567   22.080  55.000  1.00 17.74 ? ? ? ? ? ? 712 GLY A C   1 
+ATOM   1605 O O   . GLY A 1 222 ? 3.190   21.354  55.780  1.00 18.91 ? ? ? ? ? ? 712 GLY A O   1 
+ATOM   1606 N N   . VAL A 1 223 ? 2.474   21.804  53.701  1.00 15.00 ? ? ? ? ? ? 713 VAL A N   1 
+ATOM   1607 C CA  . VAL A 1 223 ? 3.162   20.654  53.125  1.00 14.56 ? ? ? ? ? ? 713 VAL A CA  1 
+ATOM   1608 C C   . VAL A 1 223 ? 4.623   21.060  52.938  1.00 14.23 ? ? ? ? ? ? 713 VAL A C   1 
+ATOM   1609 O O   . VAL A 1 223 ? 4.912   22.100  52.332  1.00 14.84 ? ? ? ? ? ? 713 VAL A O   1 
+ATOM   1610 C CB  . VAL A 1 223 ? 2.567   20.271  51.748  1.00 13.68 ? ? ? ? ? ? 713 VAL A CB  1 
+ATOM   1611 C CG1 . VAL A 1 223 ? 3.349   19.121  51.117  1.00 14.30 ? ? ? ? ? ? 713 VAL A CG1 1 
+ATOM   1612 C CG2 . VAL A 1 223 ? 1.119   19.932  51.896  1.00 14.43 ? ? ? ? ? ? 713 VAL A CG2 1 
+ATOM   1613 N N   . PRO A 1 224 ? 5.568   20.229  53.408  1.00 14.38 ? ? ? ? ? ? 714 PRO A N   1 
+ATOM   1614 C CA  . PRO A 1 224 ? 7.002   20.553  53.271  1.00 14.68 ? ? ? ? ? ? 714 PRO A CA  1 
+ATOM   1615 C C   . PRO A 1 224 ? 7.576   20.378  51.865  1.00 15.27 ? ? ? ? ? ? 714 PRO A C   1 
+ATOM   1616 O O   . PRO A 1 224 ? 7.753   19.259  51.401  1.00 18.74 ? ? ? ? ? ? 714 PRO A O   1 
+ATOM   1617 C CB  . PRO A 1 224 ? 7.688   19.598  54.269  1.00 15.08 ? ? ? ? ? ? 714 PRO A CB  1 
+ATOM   1618 C CG  . PRO A 1 224 ? 6.744   18.384  54.259  1.00 14.97 ? ? ? ? ? ? 714 PRO A CG  1 
+ATOM   1619 C CD  . PRO A 1 224 ? 5.346   18.979  54.174  1.00 14.39 ? ? ? ? ? ? 714 PRO A CD  1 
+ATOM   1620 N N   . ILE A 1 225 ? 7.764   21.474  51.153  1.00 13.07 ? ? ? ? ? ? 715 ILE A N   1 
+ATOM   1621 C CA  . ILE A 1 225 ? 8.377   21.410  49.837  1.00 11.14 ? ? ? ? ? ? 715 ILE A CA  1 
+ATOM   1622 C C   . ILE A 1 225 ? 9.371   22.579  49.796  1.00 10.94 ? ? ? ? ? ? 715 ILE A C   1 
+ATOM   1623 O O   . ILE A 1 225 ? 9.046   23.710  50.203  1.00 11.71 ? ? ? ? ? ? 715 ILE A O   1 
+ATOM   1624 C CB  . ILE A 1 225 ? 7.348   21.415  48.674  1.00 11.59 ? ? ? ? ? ? 715 ILE A CB  1 
+ATOM   1625 C CG1 . ILE A 1 225 ? 8.103   21.491  47.339  1.00 12.65 ? ? ? ? ? ? 715 ILE A CG1 1 
+ATOM   1626 C CG2 . ILE A 1 225 ? 6.326   22.510  48.832  1.00 11.98 ? ? ? ? ? ? 715 ILE A CG2 1 
+ATOM   1627 C CD1 . ILE A 1 225 ? 7.287   21.084  46.141  1.00 14.79 ? ? ? ? ? ? 715 ILE A CD1 1 
+ATOM   1628 N N   . ASP A 1 226 ? 10.607  22.293  49.412  1.00 8.69  ? ? ? ? ? ? 716 ASP A N   1 
+ATOM   1629 C CA  . ASP A 1 226 ? 11.644  23.324  49.401  1.00 8.51  ? ? ? ? ? ? 716 ASP A CA  1 
+ATOM   1630 C C   . ASP A 1 226 ? 11.998  23.904  48.026  1.00 8.98  ? ? ? ? ? ? 716 ASP A C   1 
+ATOM   1631 O O   . ASP A 1 226 ? 12.384  25.075  47.932  1.00 9.98  ? ? ? ? ? ? 716 ASP A O   1 
+ATOM   1632 C CB  . ASP A 1 226 ? 12.947  22.778  50.008  1.00 8.70  ? ? ? ? ? ? 716 ASP A CB  1 
+ATOM   1633 C CG  . ASP A 1 226 ? 12.749  22.165  51.399  1.00 9.89  ? ? ? ? ? ? 716 ASP A CG  1 
+ATOM   1634 O OD1 . ASP A 1 226 ? 12.381  22.911  52.322  1.00 12.40 ? ? ? ? ? ? 716 ASP A OD1 1 
+ATOM   1635 O OD2 . ASP A 1 226 ? 12.971  20.959  51.564  1.00 9.71  ? ? ? ? ? ? 716 ASP A OD2 1 
+ATOM   1636 N N   . GLY A 1 227 ? 11.941  23.071  46.991  1.00 7.84  ? ? ? ? ? ? 717 GLY A N   1 
+ATOM   1637 C CA  . GLY A 1 227 ? 12.349  23.542  45.684  1.00 7.82  ? ? ? ? ? ? 717 GLY A CA  1 
+ATOM   1638 C C   . GLY A 1 227 ? 11.608  22.999  44.490  1.00 8.89  ? ? ? ? ? ? 717 GLY A C   1 
+ATOM   1639 O O   . GLY A 1 227 ? 10.743  22.106  44.608  1.00 7.90  ? ? ? ? ? ? 717 GLY A O   1 
+ATOM   1640 N N   . VAL A 1 228 ? 11.851  23.630  43.337  1.00 7.48  ? ? ? ? ? ? 718 VAL A N   1 
+ATOM   1641 C CA  . VAL A 1 228 ? 11.249  23.190  42.090  1.00 7.38  ? ? ? ? ? ? 718 VAL A CA  1 
+ATOM   1642 C C   . VAL A 1 228 ? 12.404  22.899  41.125  1.00 6.95  ? ? ? ? ? ? 718 VAL A C   1 
+ATOM   1643 O O   . VAL A 1 228 ? 13.389  23.641  41.087  1.00 6.87  ? ? ? ? ? ? 718 VAL A O   1 
+ATOM   1644 C CB  . VAL A 1 228 ? 10.248  24.250  41.482  1.00 8.29  ? ? ? ? ? ? 718 VAL A CB  1 
+ATOM   1645 C CG1 . VAL A 1 228 ? 10.941  25.558  41.143  1.00 8.18  ? ? ? ? ? ? 718 VAL A CG1 1 
+ATOM   1646 C CG2 . VAL A 1 228 ? 9.553   23.657  40.241  1.00 7.69  ? ? ? ? ? ? 718 VAL A CG2 1 
+ATOM   1647 N N   . GLY A 1 229 ? 12.335  21.759  40.463  1.00 5.91  ? ? ? ? ? ? 719 GLY A N   1 
+ATOM   1648 C CA  . GLY A 1 229 ? 13.366  21.375  39.524  1.00 5.41  ? ? ? ? ? ? 719 GLY A CA  1 
+ATOM   1649 C C   . GLY A 1 229 ? 12.921  21.629  38.101  1.00 5.85  ? ? ? ? ? ? 719 GLY A C   1 
+ATOM   1650 O O   . GLY A 1 229 ? 11.891  21.110  37.661  1.00 6.86  ? ? ? ? ? ? 719 GLY A O   1 
+ATOM   1651 N N   . PHE A 1 230 ? 13.635  22.524  37.422  1.00 6.00  ? ? ? ? ? ? 720 PHE A N   1 
+ATOM   1652 C CA  . PHE A 1 230 ? 13.355  22.836  36.001  1.00 6.51  ? ? ? ? ? ? 720 PHE A CA  1 
+ATOM   1653 C C   . PHE A 1 230 ? 14.225  21.848  35.184  1.00 5.39  ? ? ? ? ? ? 720 PHE A C   1 
+ATOM   1654 O O   . PHE A 1 230 ? 15.464  21.978  35.170  1.00 6.21  ? ? ? ? ? ? 720 PHE A O   1 
+ATOM   1655 C CB  . PHE A 1 230 ? 13.806  24.275  35.649  1.00 7.21  ? ? ? ? ? ? 720 PHE A CB  1 
+ATOM   1656 C CG  . PHE A 1 230 ? 12.917  25.392  36.162  1.00 7.00  ? ? ? ? ? ? 720 PHE A CG  1 
+ATOM   1657 C CD1 . PHE A 1 230 ? 11.830  25.166  37.016  1.00 6.87  ? ? ? ? ? ? 720 PHE A CD1 1 
+ATOM   1658 C CD2 . PHE A 1 230 ? 13.211  26.707  35.797  1.00 7.42  ? ? ? ? ? ? 720 PHE A CD2 1 
+ATOM   1659 C CE1 . PHE A 1 230 ? 11.071  26.216  37.481  1.00 7.71  ? ? ? ? ? ? 720 PHE A CE1 1 
+ATOM   1660 C CE2 . PHE A 1 230 ? 12.454  27.767  36.262  1.00 8.09  ? ? ? ? ? ? 720 PHE A CE2 1 
+ATOM   1661 C CZ  . PHE A 1 230 ? 11.380  27.532  37.104  1.00 8.65  ? ? ? ? ? ? 720 PHE A CZ  1 
+ATOM   1662 N N   . GLN A 1 231 ? 13.618  20.896  34.480  1.00 6.48  ? ? ? ? ? ? 721 GLN A N   1 
+ATOM   1663 C CA  . GLN A 1 231 ? 14.425  19.919  33.719  1.00 6.29  ? ? ? ? ? ? 721 GLN A CA  1 
+ATOM   1664 C C   . GLN A 1 231 ? 15.273  20.559  32.622  1.00 6.69  ? ? ? ? ? ? 721 GLN A C   1 
+ATOM   1665 O O   . GLN A 1 231 ? 16.376  20.105  32.364  1.00 7.22  ? ? ? ? ? ? 721 GLN A O   1 
+ATOM   1666 C CB  . GLN A 1 231 ? 13.573  18.806  33.140  1.00 6.47  ? ? ? ? ? ? 721 GLN A CB  1 
+ATOM   1667 C CG  . GLN A 1 231 ? 13.098  17.817  34.207  1.00 7.05  ? ? ? ? ? ? 721 GLN A CG  1 
+ATOM   1668 C CD  . GLN A 1 231 ? 12.237  16.706  33.603  1.00 9.40  ? ? ? ? ? ? 721 GLN A CD  1 
+ATOM   1669 O OE1 . GLN A 1 231 ? 12.263  16.467  32.382  1.00 9.61  ? ? ? ? ? ? 721 GLN A OE1 1 
+ATOM   1670 N NE2 . GLN A 1 231 ? 11.510  15.984  34.450  1.00 8.66  ? ? ? ? ? ? 721 GLN A NE2 1 
+ATOM   1671 N N   . CYS A 1 232 ? 14.752  21.614  32.001  1.00 6.63  ? ? ? ? ? ? 722 CYS A N   1 
+ATOM   1672 C CA  . CYS A 1 232 ? 15.479  22.324  30.946  1.00 7.18  ? ? ? ? ? ? 722 CYS A CA  1 
+ATOM   1673 C C   . CYS A 1 232 ? 15.826  21.490  29.697  1.00 7.03  ? ? ? ? ? ? 722 CYS A C   1 
+ATOM   1674 O O   . CYS A 1 232 ? 16.964  21.523  29.229  1.00 7.82  ? ? ? ? ? ? 722 CYS A O   1 
+ATOM   1675 C CB  . CYS A 1 232 ? 16.737  23.016  31.503  1.00 7.45  ? ? ? ? ? ? 722 CYS A CB  1 
+ATOM   1676 S SG  . CYS A 1 232 ? 16.407  24.311  32.709  1.00 9.11  ? ? ? ? ? ? 722 CYS A SG  1 
+ATOM   1677 N N   . HIS A 1 233 ? 14.857  20.733  29.186  1.00 6.91  ? ? ? ? ? ? 723 HIS A N   1 
+ATOM   1678 C CA  . HIS A 1 233 ? 15.068  19.963  27.945  1.00 7.96  ? ? ? ? ? ? 723 HIS A CA  1 
+ATOM   1679 C C   . HIS A 1 233 ? 14.607  20.926  26.842  1.00 9.02  ? ? ? ? ? ? 723 HIS A C   1 
+ATOM   1680 O O   . HIS A 1 233 ? 13.426  20.976  26.492  1.00 10.63 ? ? ? ? ? ? 723 HIS A O   1 
+ATOM   1681 C CB  . HIS A 1 233 ? 14.247  18.665  27.956  1.00 8.58  ? ? ? ? ? ? 723 HIS A CB  1 
+ATOM   1682 C CG  . HIS A 1 233 ? 14.747  17.659  28.951  1.00 7.86  ? ? ? ? ? ? 723 HIS A CG  1 
+ATOM   1683 N ND1 . HIS A 1 233 ? 16.022  17.139  28.910  1.00 7.88  ? ? ? ? ? ? 723 HIS A ND1 1 
+ATOM   1684 C CD2 . HIS A 1 233 ? 14.144  17.085  30.020  1.00 8.64  ? ? ? ? ? ? 723 HIS A CD2 1 
+ATOM   1685 C CE1 . HIS A 1 233 ? 16.187  16.286  29.910  1.00 8.80  ? ? ? ? ? ? 723 HIS A CE1 1 
+ATOM   1686 N NE2 . HIS A 1 233 ? 15.061  16.238  30.598  1.00 8.02  ? ? ? ? ? ? 723 HIS A NE2 1 
+ATOM   1687 N N   . PHE A 1 234 ? 15.555  21.739  26.377  1.00 9.16  ? ? ? ? ? ? 724 PHE A N   1 
+ATOM   1688 C CA  . PHE A 1 234 ? 15.308  22.800  25.394  1.00 9.17  ? ? ? ? ? ? 724 PHE A CA  1 
+ATOM   1689 C C   . PHE A 1 234 ? 15.734  22.499  23.973  1.00 10.13 ? ? ? ? ? ? 724 PHE A C   1 
+ATOM   1690 O O   . PHE A 1 234 ? 16.539  21.622  23.731  1.00 9.08  ? ? ? ? ? ? 724 PHE A O   1 
+ATOM   1691 C CB  . PHE A 1 234 ? 16.047  24.064  25.834  1.00 10.08 ? ? ? ? ? ? 724 PHE A CB  1 
+ATOM   1692 C CG  . PHE A 1 234 ? 15.597  24.621  27.170  1.00 10.27 ? ? ? ? ? ? 724 PHE A CG  1 
+ATOM   1693 C CD1 . PHE A 1 234 ? 14.243  24.799  27.461  1.00 10.77 ? ? ? ? ? ? 724 PHE A CD1 1 
+ATOM   1694 C CD2 . PHE A 1 234 ? 16.547  25.040  28.116  1.00 11.48 ? ? ? ? ? ? 724 PHE A CD2 1 
+ATOM   1695 C CE1 . PHE A 1 234 ? 13.846  25.395  28.673  1.00 10.84 ? ? ? ? ? ? 724 PHE A CE1 1 
+ATOM   1696 C CE2 . PHE A 1 234 ? 16.144  25.640  29.325  1.00 10.76 ? ? ? ? ? ? 724 PHE A CE2 1 
+ATOM   1697 C CZ  . PHE A 1 234 ? 14.793  25.809  29.587  1.00 10.35 ? ? ? ? ? ? 724 PHE A CZ  1 
+ATOM   1698 N N   . ILE A 1 235 ? 15.185  23.262  23.026  1.00 10.65 ? ? ? ? ? ? 725 ILE A N   1 
+ATOM   1699 C CA  . ILE A 1 235 ? 15.577  23.106  21.617  1.00 11.34 ? ? ? ? ? ? 725 ILE A CA  1 
+ATOM   1700 C C   . ILE A 1 235 ? 16.550  24.246  21.268  1.00 9.92  ? ? ? ? ? ? 725 ILE A C   1 
+ATOM   1701 O O   . ILE A 1 235 ? 16.368  25.377  21.709  1.00 11.49 ? ? ? ? ? ? 725 ILE A O   1 
+ATOM   1702 C CB  . ILE A 1 235 ? 14.363  23.170  20.682  1.00 12.48 ? ? ? ? ? ? 725 ILE A CB  1 
+ATOM   1703 C CG1 . ILE A 1 235 ? 13.355  22.092  21.084  1.00 12.82 ? ? ? ? ? ? 725 ILE A CG1 1 
+ATOM   1704 C CG2 . ILE A 1 235 ? 14.812  22.917  19.222  1.00 14.06 ? ? ? ? ? ? 725 ILE A CG2 1 
+ATOM   1705 C CD1 . ILE A 1 235 ? 12.065  22.164  20.322  1.00 15.03 ? ? ? ? ? ? 725 ILE A CD1 1 
+ATOM   1706 N N   . ASN A 1 236 ? 17.570  23.943  20.484  1.00 10.22 ? ? ? ? ? ? 726 ASN A N   1 
+ATOM   1707 C CA  . ASN A 1 236 ? 18.577  24.928  20.077  1.00 10.99 ? ? ? ? ? ? 726 ASN A CA  1 
+ATOM   1708 C C   . ASN A 1 236 ? 17.933  26.161  19.430  1.00 12.01 ? ? ? ? ? ? 726 ASN A C   1 
+ATOM   1709 O O   . ASN A 1 236 ? 16.992  26.033  18.636  1.00 11.87 ? ? ? ? ? ? 726 ASN A O   1 
+ATOM   1710 C CB  . ASN A 1 236 ? 19.500  24.282  19.050  1.00 12.13 ? ? ? ? ? ? 726 ASN A CB  1 
+ATOM   1711 C CG  . ASN A 1 236 ? 20.780  25.037  18.862  1.00 13.79 ? ? ? ? ? ? 726 ASN A CG  1 
+ATOM   1712 O OD1 . ASN A 1 236 ? 21.349  25.545  19.824  1.00 15.17 ? ? ? ? ? ? 726 ASN A OD1 1 
+ATOM   1713 N ND2 . ASN A 1 236 ? 21.281  25.074  17.634  1.00 14.93 ? ? ? ? ? ? 726 ASN A ND2 1 
+ATOM   1714 N N   . GLY A 1 237 ? 18.437  27.338  19.792  1.00 12.05 ? ? ? ? ? ? 727 GLY A N   1 
+ATOM   1715 C CA  . GLY A 1 237 ? 17.932  28.580  19.227  1.00 13.30 ? ? ? ? ? ? 727 GLY A CA  1 
+ATOM   1716 C C   . GLY A 1 237 ? 16.927  29.341  20.074  1.00 14.89 ? ? ? ? ? ? 727 GLY A C   1 
+ATOM   1717 O O   . GLY A 1 237 ? 16.031  30.033  19.555  1.00 14.54 ? ? ? ? ? ? 727 GLY A O   1 
+ATOM   1718 N N   . MET A 1 238 ? 17.073  29.223  21.390  1.00 14.42 ? ? ? ? ? ? 728 MET A N   1 
+ATOM   1719 C CA  . MET A 1 238 ? 16.201  29.913  22.331  1.00 15.58 ? ? ? ? ? ? 728 MET A CA  1 
+ATOM   1720 C C   . MET A 1 238 ? 16.256  31.426  22.104  1.00 15.24 ? ? ? ? ? ? 728 MET A C   1 
+ATOM   1721 O O   . MET A 1 238 ? 17.348  32.004  21.985  1.00 14.97 ? ? ? ? ? ? 728 MET A O   1 
+ATOM   1722 C CB  . MET A 1 238 ? 16.664  29.604  23.753  1.00 16.45 ? ? ? ? ? ? 728 MET A CB  1 
+ATOM   1723 C CG  . MET A 1 238 ? 16.601  28.107  24.080  1.00 18.91 ? ? ? ? ? ? 728 MET A CG  1 
+ATOM   1724 S SD  . MET A 1 238 ? 17.374  27.774  25.678  1.00 22.09 ? ? ? ? ? ? 728 MET A SD  1 
+ATOM   1725 C CE  . MET A 1 238 ? 16.084  28.274  26.690  1.00 20.27 ? ? ? ? ? ? 728 MET A CE  1 
+ATOM   1726 N N   . SER A 1 239 ? 15.088  32.061  22.096  1.00 14.74 ? ? ? ? ? ? 729 SER A N   1 
+ATOM   1727 C CA  . SER A 1 239 ? 14.999  33.503  21.905  1.00 14.15 ? ? ? ? ? ? 729 SER A CA  1 
+ATOM   1728 C C   . SER A 1 239 ? 15.254  34.291  23.205  1.00 15.12 ? ? ? ? ? ? 729 SER A C   1 
+ATOM   1729 O O   . SER A 1 239 ? 15.138  33.747  24.321  1.00 14.00 ? ? ? ? ? ? 729 SER A O   1 
+ATOM   1730 C CB  . SER A 1 239 ? 13.620  33.855  21.353  1.00 15.54 ? ? ? ? ? ? 729 SER A CB  1 
+ATOM   1731 O OG  . SER A 1 239 ? 12.604  33.702  22.338  1.00 16.55 ? ? ? ? ? ? 729 SER A OG  1 
+ATOM   1732 N N   . PRO A 1 240 ? 15.612  35.588  23.090  1.00 14.41 ? ? ? ? ? ? 730 PRO A N   1 
+ATOM   1733 C CA  . PRO A 1 240 ? 15.857  36.381  24.304  1.00 14.54 ? ? ? ? ? ? 730 PRO A CA  1 
+ATOM   1734 C C   . PRO A 1 240 ? 14.575  36.524  25.128  1.00 13.63 ? ? ? ? ? ? 730 PRO A C   1 
+ATOM   1735 O O   . PRO A 1 240 ? 14.626  36.617  26.343  1.00 14.91 ? ? ? ? ? ? 730 PRO A O   1 
+ATOM   1736 C CB  . PRO A 1 240 ? 16.294  37.744  23.753  1.00 14.78 ? ? ? ? ? ? 730 PRO A CB  1 
+ATOM   1737 C CG  . PRO A 1 240 ? 16.946  37.388  22.469  1.00 15.50 ? ? ? ? ? ? 730 PRO A CG  1 
+ATOM   1738 C CD  . PRO A 1 240 ? 16.029  36.333  21.885  1.00 15.01 ? ? ? ? ? ? 730 PRO A CD  1 
+ATOM   1739 N N   . GLU A 1 241 ? 13.424  36.550  24.460  1.00 12.95 ? ? ? ? ? ? 731 GLU A N   1 
+ATOM   1740 C CA  . GLU A 1 241 ? 12.166  36.704  25.163  1.00 13.41 ? ? ? ? ? ? 731 GLU A CA  1 
+ATOM   1741 C C   . GLU A 1 241 ? 11.867  35.449  25.969  1.00 13.56 ? ? ? ? ? ? 731 GLU A C   1 
+ATOM   1742 O O   . GLU A 1 241 ? 11.321  35.555  27.072  1.00 12.86 ? ? ? ? ? ? 731 GLU A O   1 
+ATOM   1743 C CB  . GLU A 1 241 ? 11.014  36.993  24.197  1.00 14.37 ? ? ? ? ? ? 731 GLU A CB  1 
+ATOM   1744 C CG  . GLU A 1 241 ? 11.112  38.340  23.514  1.00 16.83 ? ? ? ? ? ? 731 GLU A CG  1 
+ATOM   1745 C CD  . GLU A 1 241 ? 12.227  38.391  22.486  1.00 17.61 ? ? ? ? ? ? 731 GLU A CD  1 
+ATOM   1746 O OE1 . GLU A 1 241 ? 12.365  37.429  21.693  1.00 18.03 ? ? ? ? ? ? 731 GLU A OE1 1 
+ATOM   1747 O OE2 . GLU A 1 241 ? 12.977  39.391  22.480  1.00 20.27 ? ? ? ? ? ? 731 GLU A OE2 1 
+ATOM   1748 N N   . TYR A 1 242 ? 12.209  34.283  25.411  1.00 12.17 ? ? ? ? ? ? 732 TYR A N   1 
+ATOM   1749 C CA  . TYR A 1 242 ? 11.981  33.014  26.103  1.00 12.92 ? ? ? ? ? ? 732 TYR A CA  1 
+ATOM   1750 C C   . TYR A 1 242 ? 12.865  33.004  27.343  1.00 12.17 ? ? ? ? ? ? 732 TYR A C   1 
+ATOM   1751 O O   . TYR A 1 242 ? 12.381  32.765  28.462  1.00 11.37 ? ? ? ? ? ? 732 TYR A O   1 
+ATOM   1752 C CB  . TYR A 1 242 ? 12.324  31.833  25.209  1.00 14.49 ? ? ? ? ? ? 732 TYR A CB  1 
+ATOM   1753 C CG  . TYR A 1 242 ? 12.007  30.506  25.844  1.00 17.56 ? ? ? ? ? ? 732 TYR A CG  1 
+ATOM   1754 C CD1 . TYR A 1 242 ? 10.685  30.124  26.074  1.00 18.67 ? ? ? ? ? ? 732 TYR A CD1 1 
+ATOM   1755 C CD2 . TYR A 1 242 ? 13.014  29.615  26.170  1.00 19.20 ? ? ? ? ? ? 732 TYR A CD2 1 
+ATOM   1756 C CE1 . TYR A 1 242 ? 10.364  28.878  26.601  1.00 20.39 ? ? ? ? ? ? 732 TYR A CE1 1 
+ATOM   1757 C CE2 . TYR A 1 242 ? 12.706  28.351  26.700  1.00 20.78 ? ? ? ? ? ? 732 TYR A CE2 1 
+ATOM   1758 C CZ  . TYR A 1 242 ? 11.378  27.992  26.903  1.00 21.47 ? ? ? ? ? ? 732 TYR A CZ  1 
+ATOM   1759 O OH  . TYR A 1 242 ? 11.058  26.709  27.335  1.00 23.93 ? ? ? ? ? ? 732 TYR A OH  1 
+ATOM   1760 N N   . LEU A 1 243 ? 14.144  33.316  27.150  1.00 10.29 ? ? ? ? ? ? 733 LEU A N   1 
+ATOM   1761 C CA  . LEU A 1 243 ? 15.088  33.359  28.252  1.00 10.72 ? ? ? ? ? ? 733 LEU A CA  1 
+ATOM   1762 C C   . LEU A 1 243 ? 14.633  34.371  29.299  1.00 11.53 ? ? ? ? ? ? 733 LEU A C   1 
+ATOM   1763 O O   . LEU A 1 243 ? 14.713  34.125  30.501  1.00 10.74 ? ? ? ? ? ? 733 LEU A O   1 
+ATOM   1764 C CB  . LEU A 1 243 ? 16.506  33.642  27.732  1.00 11.69 ? ? ? ? ? ? 733 LEU A CB  1 
+ATOM   1765 C CG  . LEU A 1 243 ? 17.125  32.469  26.932  1.00 14.05 ? ? ? ? ? ? 733 LEU A CG  1 
+ATOM   1766 C CD1 . LEU A 1 243 ? 18.189  32.972  25.957  1.00 16.04 ? ? ? ? ? ? 733 LEU A CD1 1 
+ATOM   1767 C CD2 . LEU A 1 243 ? 17.747  31.412  27.856  1.00 14.26 ? ? ? ? ? ? 733 LEU A CD2 1 
+ATOM   1768 N N   . ALA A 1 244 ? 14.098  35.502  28.865  1.00 11.51 ? ? ? ? ? ? 734 ALA A N   1 
+ATOM   1769 C CA  . ALA A 1 244 ? 13.620  36.497  29.813  1.00 11.63 ? ? ? ? ? ? 734 ALA A CA  1 
+ATOM   1770 C C   . ALA A 1 244 ? 12.457  35.945  30.658  1.00 11.52 ? ? ? ? ? ? 734 ALA A C   1 
+ATOM   1771 O O   . ALA A 1 244 ? 12.327  36.296  31.846  1.00 12.87 ? ? ? ? ? ? 734 ALA A O   1 
+ATOM   1772 C CB  . ALA A 1 244 ? 13.171  37.789  29.070  1.00 11.61 ? ? ? ? ? ? 734 ALA A CB  1 
+ATOM   1773 N N   . SER A 1 245 ? 11.596  35.111  30.064  1.00 11.63 ? ? ? ? ? ? 735 SER A N   1 
+ATOM   1774 C CA  . SER A 1 245 ? 10.451  34.557  30.813  1.00 10.39 ? ? ? ? ? ? 735 SER A CA  1 
+ATOM   1775 C C   . SER A 1 245 ? 10.890  33.548  31.896  1.00 9.87  ? ? ? ? ? ? 735 SER A C   1 
+ATOM   1776 O O   . SER A 1 245 ? 10.290  33.487  32.963  1.00 10.17 ? ? ? ? ? ? 735 SER A O   1 
+ATOM   1777 C CB  . SER A 1 245 ? 9.376   33.993  29.877  1.00 11.08 ? ? ? ? ? ? 735 SER A CB  1 
+ATOM   1778 O OG  . SER A 1 245 ? 9.739   32.755  29.333  1.00 14.25 ? ? ? ? ? ? 735 SER A OG  1 
+ATOM   1779 N N   . ILE A 1 246 ? 11.975  32.833  31.641  1.00 9.66  ? ? ? ? ? ? 736 ILE A N   1 
+ATOM   1780 C CA  . ILE A 1 246 ? 12.531  31.879  32.616  1.00 9.50  ? ? ? ? ? ? 736 ILE A CA  1 
+ATOM   1781 C C   . ILE A 1 246 ? 13.033  32.674  33.826  1.00 9.64  ? ? ? ? ? ? 736 ILE A C   1 
+ATOM   1782 O O   . ILE A 1 246 ? 12.774  32.307  34.967  1.00 9.94  ? ? ? ? ? ? 736 ILE A O   1 
+ATOM   1783 C CB  . ILE A 1 246 ? 13.686  31.056  32.015  1.00 9.03  ? ? ? ? ? ? 736 ILE A CB  1 
+ATOM   1784 C CG1 . ILE A 1 246 ? 13.177  30.219  30.832  1.00 10.43 ? ? ? ? ? ? 736 ILE A CG1 1 
+ATOM   1785 C CG2 . ILE A 1 246 ? 14.319  30.135  33.090  1.00 10.72 ? ? ? ? ? ? 736 ILE A CG2 1 
+ATOM   1786 C CD1 . ILE A 1 246 ? 14.275  29.454  30.087  1.00 10.09 ? ? ? ? ? ? 736 ILE A CD1 1 
+ATOM   1787 N N   . ASP A 1 247 ? 13.739  33.780  33.583  1.00 9.65  ? ? ? ? ? ? 737 ASP A N   1 
+ATOM   1788 C CA  . ASP A 1 247 ? 14.243  34.625  34.685  1.00 10.27 ? ? ? ? ? ? 737 ASP A CA  1 
+ATOM   1789 C C   . ASP A 1 247 ? 13.081  35.164  35.560  1.00 10.28 ? ? ? ? ? ? 737 ASP A C   1 
+ATOM   1790 O O   . ASP A 1 247 ? 13.150  35.132  36.789  1.00 10.54 ? ? ? ? ? ? 737 ASP A O   1 
+ATOM   1791 C CB  . ASP A 1 247 ? 15.073  35.798  34.128  1.00 10.75 ? ? ? ? ? ? 737 ASP A CB  1 
+ATOM   1792 C CG  . ASP A 1 247 ? 15.670  36.652  35.224  1.00 10.69 ? ? ? ? ? ? 737 ASP A CG  1 
+ATOM   1793 O OD1 . ASP A 1 247 ? 16.738  36.291  35.738  1.00 12.30 ? ? ? ? ? ? 737 ASP A OD1 1 
+ATOM   1794 O OD2 . ASP A 1 247 ? 15.059  37.670  35.598  1.00 13.00 ? ? ? ? ? ? 737 ASP A OD2 1 
+ATOM   1795 N N   . GLN A 1 248 ? 12.012  35.650  34.934  1.00 9.97  ? ? ? ? ? ? 738 GLN A N   1 
+ATOM   1796 C CA  . GLN A 1 248 ? 10.874  36.163  35.677  1.00 11.34 ? ? ? ? ? ? 738 GLN A CA  1 
+ATOM   1797 C C   . GLN A 1 248 ? 10.212  35.022  36.483  1.00 10.08 ? ? ? ? ? ? 738 GLN A C   1 
+ATOM   1798 O O   . GLN A 1 248 ? 9.726   35.237  37.586  1.00 10.31 ? ? ? ? ? ? 738 GLN A O   1 
+ATOM   1799 C CB  . GLN A 1 248 ? 9.842   36.758  34.718  1.00 14.24 ? ? ? ? ? ? 738 GLN A CB  1 
+ATOM   1800 C CG  . GLN A 1 248 ? 10.231  38.127  34.181  1.00 20.66 ? ? ? ? ? ? 738 GLN A CG  1 
+ATOM   1801 C CD  . GLN A 1 248 ? 9.590   38.453  32.821  1.00 24.70 ? ? ? ? ? ? 738 GLN A CD  1 
+ATOM   1802 O OE1 . GLN A 1 248 ? 8.395   38.203  32.588  1.00 26.26 ? ? ? ? ? ? 738 GLN A OE1 1 
+ATOM   1803 N NE2 . GLN A 1 248 ? 10.398  39.024  31.909  1.00 27.40 ? ? ? ? ? ? 738 GLN A NE2 1 
+ATOM   1804 N N   . ASN A 1 249 ? 10.145  33.836  35.898  1.00 9.32  ? ? ? ? ? ? 739 ASN A N   1 
+ATOM   1805 C CA  . ASN A 1 249 ? 9.543   32.695  36.597  1.00 8.40  ? ? ? ? ? ? 739 ASN A CA  1 
+ATOM   1806 C C   . ASN A 1 249 ? 10.381  32.378  37.860  1.00 8.50  ? ? ? ? ? ? 739 ASN A C   1 
+ATOM   1807 O O   . ASN A 1 249 ? 9.824   32.153  38.945  1.00 9.11  ? ? ? ? ? ? 739 ASN A O   1 
+ATOM   1808 C CB  . ASN A 1 249 ? 9.478   31.493  35.653  1.00 8.44  ? ? ? ? ? ? 739 ASN A CB  1 
+ATOM   1809 C CG  . ASN A 1 249 ? 8.581   30.398  36.175  1.00 7.63  ? ? ? ? ? ? 739 ASN A CG  1 
+ATOM   1810 O OD1 . ASN A 1 249 ? 7.634   30.661  36.884  1.00 9.79  ? ? ? ? ? ? 739 ASN A OD1 1 
+ATOM   1811 N ND2 . ASN A 1 249 ? 8.875   29.165  35.808  1.00 9.40  ? ? ? ? ? ? 739 ASN A ND2 1 
+ATOM   1812 N N   . ILE A 1 250 ? 11.710  32.437  37.757  1.00 7.69  ? ? ? ? ? ? 740 ILE A N   1 
+ATOM   1813 C CA  . ILE A 1 250 ? 12.579  32.167  38.913  1.00 8.67  ? ? ? ? ? ? 740 ILE A CA  1 
+ATOM   1814 C C   . ILE A 1 250 ? 12.304  33.186  40.031  1.00 9.03  ? ? ? ? ? ? 740 ILE A C   1 
+ATOM   1815 O O   . ILE A 1 250 ? 12.253  32.840  41.224  1.00 8.32  ? ? ? ? ? ? 740 ILE A O   1 
+ATOM   1816 C CB  . ILE A 1 250 ? 14.093  32.142  38.509  1.00 8.06  ? ? ? ? ? ? 740 ILE A CB  1 
+ATOM   1817 C CG1 . ILE A 1 250 ? 14.366  30.959  37.577  1.00 8.35  ? ? ? ? ? ? 740 ILE A CG1 1 
+ATOM   1818 C CG2 . ILE A 1 250 ? 15.008  32.055  39.733  1.00 9.48  ? ? ? ? ? ? 740 ILE A CG2 1 
+ATOM   1819 C CD1 . ILE A 1 250 ? 15.774  30.946  37.015  1.00 9.87  ? ? ? ? ? ? 740 ILE A CD1 1 
+ATOM   1820 N N   . LYS A 1 251 ? 12.091  34.444  39.646  1.00 8.37  ? ? ? ? ? ? 741 LYS A N   1 
+ATOM   1821 C CA  . LYS A 1 251 ? 11.809  35.507  40.604  1.00 9.50  ? ? ? ? ? ? 741 LYS A CA  1 
+ATOM   1822 C C   . LYS A 1 251 ? 10.488  35.297  41.336  1.00 8.92  ? ? ? ? ? ? 741 LYS A C   1 
+ATOM   1823 O O   . LYS A 1 251 ? 10.428  35.558  42.540  1.00 9.78  ? ? ? ? ? ? 741 LYS A O   1 
+ATOM   1824 C CB  . LYS A 1 251 ? 11.887  36.907  39.926  1.00 9.95  ? ? ? ? ? ? 741 LYS A CB  1 
+ATOM   1825 C CG  . LYS A 1 251 ? 13.357  37.322  39.686  1.00 11.53 ? ? ? ? ? ? 741 LYS A CG  1 
+ATOM   1826 C CD  . LYS A 1 251 ? 13.500  38.544  38.802  1.00 12.32 ? ? ? ? ? ? 741 LYS A CD  1 
+ATOM   1827 C CE  . LYS A 1 251 ? 14.943  39.055  38.804  1.00 11.94 ? ? ? ? ? ? 741 LYS A CE  1 
+ATOM   1828 N NZ  . LYS A 1 251 ? 15.930  38.097  38.264  1.00 12.61 ? ? ? ? ? ? 741 LYS A NZ  1 
+ATOM   1829 N N   . ARG A 1 252 ? 9.443   34.812  40.656  1.00 9.44  ? ? ? ? ? ? 742 ARG A N   1 
+ATOM   1830 C CA  . ARG A 1 252 ? 8.182   34.571  41.363  1.00 10.41 ? ? ? ? ? ? 742 ARG A CA  1 
+ATOM   1831 C C   . ARG A 1 252 ? 8.317   33.402  42.359  1.00 9.74  ? ? ? ? ? ? 742 ARG A C   1 
+ATOM   1832 O O   . ARG A 1 252 ? 7.667   33.415  43.413  1.00 10.33 ? ? ? ? ? ? 742 ARG A O   1 
+ATOM   1833 C CB  . ARG A 1 252 ? 6.963   34.450  40.446  1.00 10.94 ? ? ? ? ? ? 742 ARG A CB  1 
+ATOM   1834 C CG  . ARG A 1 252 ? 6.922   33.285  39.555  1.00 11.90 ? ? ? ? ? ? 742 ARG A CG  1 
+ATOM   1835 C CD  . ARG A 1 252 ? 5.526   33.180  38.932  1.00 12.49 ? ? ? ? ? ? 742 ARG A CD  1 
+ATOM   1836 N NE  . ARG A 1 252 ? 5.488   32.060  37.992  1.00 12.11 ? ? ? ? ? ? 742 ARG A NE  1 
+ATOM   1837 C CZ  . ARG A 1 252 ? 4.447   31.706  37.250  1.00 10.78 ? ? ? ? ? ? 742 ARG A CZ  1 
+ATOM   1838 N NH1 . ARG A 1 252 ? 3.314   32.394  37.295  1.00 12.10 ? ? ? ? ? ? 742 ARG A NH1 1 
+ATOM   1839 N NH2 . ARG A 1 252 ? 4.559   30.663  36.453  1.00 10.93 ? ? ? ? ? ? 742 ARG A NH2 1 
+ATOM   1840 N N   . TYR A 1 253 ? 9.172   32.423  42.063  1.00 8.16  ? ? ? ? ? ? 743 TYR A N   1 
+ATOM   1841 C CA  . TYR A 1 253 ? 9.404   31.335  43.033  1.00 8.67  ? ? ? ? ? ? 743 TYR A CA  1 
+ATOM   1842 C C   . TYR A 1 253 ? 10.127  31.902  44.265  1.00 8.17  ? ? ? ? ? ? 743 TYR A C   1 
+ATOM   1843 O O   . TYR A 1 253 ? 9.817   31.545  45.394  1.00 8.53  ? ? ? ? ? ? 743 TYR A O   1 
+ATOM   1844 C CB  . TYR A 1 253 ? 10.184  30.159  42.409  1.00 7.56  ? ? ? ? ? ? 743 TYR A CB  1 
+ATOM   1845 C CG  . TYR A 1 253 ? 9.268   29.164  41.708  1.00 7.73  ? ? ? ? ? ? 743 TYR A CG  1 
+ATOM   1846 C CD1 . TYR A 1 253 ? 8.431   28.306  42.452  1.00 8.22  ? ? ? ? ? ? 743 TYR A CD1 1 
+ATOM   1847 C CD2 . TYR A 1 253 ? 9.228   29.065  40.309  1.00 7.98  ? ? ? ? ? ? 743 TYR A CD2 1 
+ATOM   1848 C CE1 . TYR A 1 253 ? 7.584   27.384  41.819  1.00 7.96  ? ? ? ? ? ? 743 TYR A CE1 1 
+ATOM   1849 C CE2 . TYR A 1 253 ? 8.388   28.143  39.657  1.00 7.98  ? ? ? ? ? ? 743 TYR A CE2 1 
+ATOM   1850 C CZ  . TYR A 1 253 ? 7.566   27.307  40.418  1.00 8.03  ? ? ? ? ? ? 743 TYR A CZ  1 
+ATOM   1851 O OH  . TYR A 1 253 ? 6.721   26.429  39.798  1.00 8.50  ? ? ? ? ? ? 743 TYR A OH  1 
+ATOM   1852 N N   . ALA A 1 254 ? 11.065  32.830  44.062  1.00 8.89  ? ? ? ? ? ? 744 ALA A N   1 
+ATOM   1853 C CA  . ALA A 1 254 ? 11.780  33.454  45.197  1.00 9.08  ? ? ? ? ? ? 744 ALA A CA  1 
+ATOM   1854 C C   . ALA A 1 254 ? 10.778  34.189  46.108  1.00 9.30  ? ? ? ? ? ? 744 ALA A C   1 
+ATOM   1855 O O   . ALA A 1 254 ? 10.910  34.163  47.335  1.00 10.34 ? ? ? ? ? ? 744 ALA A O   1 
+ATOM   1856 C CB  . ALA A 1 254 ? 12.856  34.443  44.692  1.00 9.52  ? ? ? ? ? ? 744 ALA A CB  1 
+ATOM   1857 N N   . GLU A 1 255 ? 9.750   34.795  45.512  1.00 9.74  ? ? ? ? ? ? 745 GLU A N   1 
+ATOM   1858 C CA  . GLU A 1 255 ? 8.760   35.514  46.313  1.00 12.57 ? ? ? ? ? ? 745 GLU A CA  1 
+ATOM   1859 C C   . GLU A 1 255 ? 7.935   34.624  47.237  1.00 12.31 ? ? ? ? ? ? 745 GLU A C   1 
+ATOM   1860 O O   . GLU A 1 255 ? 7.335   35.126  48.185  1.00 13.74 ? ? ? ? ? ? 745 GLU A O   1 
+ATOM   1861 C CB  . GLU A 1 255 ? 7.857   36.367  45.452  1.00 15.49 ? ? ? ? ? ? 745 GLU A CB  1 
+ATOM   1862 C CG  . GLU A 1 255 ? 8.595   37.519  44.878  1.00 19.73 ? ? ? ? ? ? 745 GLU A CG  1 
+ATOM   1863 C CD  . GLU A 1 255 ? 7.738   38.385  43.995  1.00 24.14 ? ? ? ? ? ? 745 GLU A CD  1 
+ATOM   1864 O OE1 . GLU A 1 255 ? 6.619   37.956  43.603  1.00 26.03 ? ? ? ? ? ? 745 GLU A OE1 1 
+ATOM   1865 O OE2 . GLU A 1 255 ? 8.211   39.497  43.668  1.00 27.16 ? ? ? ? ? ? 745 GLU A OE2 1 
+ATOM   1866 N N   . ILE A 1 256 ? 7.852   33.331  46.913  1.00 11.37 ? ? ? ? ? ? 746 ILE A N   1 
+ATOM   1867 C CA  . ILE A 1 256 ? 7.152   32.380  47.764  1.00 12.11 ? ? ? ? ? ? 746 ILE A CA  1 
+ATOM   1868 C C   . ILE A 1 256 ? 8.157   31.507  48.551  1.00 11.57 ? ? ? ? ? ? 746 ILE A C   1 
+ATOM   1869 O O   . ILE A 1 256 ? 7.788   30.484  49.128  1.00 12.25 ? ? ? ? ? ? 746 ILE A O   1 
+ATOM   1870 C CB  . ILE A 1 256 ? 6.091   31.519  47.000  1.00 11.99 ? ? ? ? ? ? 746 ILE A CB  1 
+ATOM   1871 C CG1 . ILE A 1 256 ? 6.704   30.659  45.881  1.00 11.66 ? ? ? ? ? ? 746 ILE A CG1 1 
+ATOM   1872 C CG2 . ILE A 1 256 ? 5.039   32.431  46.417  1.00 12.97 ? ? ? ? ? ? 746 ILE A CG2 1 
+ATOM   1873 C CD1 . ILE A 1 256 ? 5.783   29.522  45.413  1.00 12.87 ? ? ? ? ? ? 746 ILE A CD1 1 
+ATOM   1874 N N   . GLY A 1 257 ? 9.422   31.918  48.540  1.00 10.61 ? ? ? ? ? ? 747 GLY A N   1 
+ATOM   1875 C CA  . GLY A 1 257 ? 10.471  31.223  49.273  1.00 10.70 ? ? ? ? ? ? 747 GLY A CA  1 
+ATOM   1876 C C   . GLY A 1 257 ? 10.912  29.867  48.761  1.00 10.93 ? ? ? ? ? ? 747 GLY A C   1 
+ATOM   1877 O O   . GLY A 1 257 ? 11.399  29.056  49.533  1.00 12.96 ? ? ? ? ? ? 747 GLY A O   1 
+ATOM   1878 N N   . VAL A 1 258 ? 10.796  29.633  47.462  1.00 9.21  ? ? ? ? ? ? 748 VAL A N   1 
+ATOM   1879 C CA  . VAL A 1 258 ? 11.167  28.354  46.876  1.00 8.85  ? ? ? ? ? ? 748 VAL A CA  1 
+ATOM   1880 C C   . VAL A 1 258 ? 12.458  28.482  46.075  1.00 9.01  ? ? ? ? ? ? 748 VAL A C   1 
+ATOM   1881 O O   . VAL A 1 258 ? 12.658  29.465  45.373  1.00 10.42 ? ? ? ? ? ? 748 VAL A O   1 
+ATOM   1882 C CB  . VAL A 1 258 ? 9.987   27.831  45.994  1.00 8.85  ? ? ? ? ? ? 748 VAL A CB  1 
+ATOM   1883 C CG1 . VAL A 1 258 ? 10.383  26.626  45.188  1.00 8.99  ? ? ? ? ? ? 748 VAL A CG1 1 
+ATOM   1884 C CG2 . VAL A 1 258 ? 8.798   27.486  46.888  1.00 9.07  ? ? ? ? ? ? 748 VAL A CG2 1 
+ATOM   1885 N N   . ILE A 1 259 ? 13.357  27.520  46.222  1.00 8.82  ? ? ? ? ? ? 749 ILE A N   1 
+ATOM   1886 C CA  . ILE A 1 259 ? 14.599  27.534  45.471  1.00 9.05  ? ? ? ? ? ? 749 ILE A CA  1 
+ATOM   1887 C C   . ILE A 1 259 ? 14.389  26.756  44.165  1.00 8.37  ? ? ? ? ? ? 749 ILE A C   1 
+ATOM   1888 O O   . ILE A 1 259 ? 13.512  25.889  44.052  1.00 7.65  ? ? ? ? ? ? 749 ILE A O   1 
+ATOM   1889 C CB  . ILE A 1 259 ? 15.763  26.936  46.256  1.00 12.03 ? ? ? ? ? ? 749 ILE A CB  1 
+ATOM   1890 C CG1 . ILE A 1 259 ? 15.482  25.511  46.622  1.00 12.82 ? ? ? ? ? ? 749 ILE A CG1 1 
+ATOM   1891 C CG2 . ILE A 1 259 ? 16.044  27.765  47.505  1.00 11.65 ? ? ? ? ? ? 749 ILE A CG2 1 
+ATOM   1892 C CD1 . ILE A 1 259 ? 16.743  24.794  47.035  1.00 17.15 ? ? ? ? ? ? 749 ILE A CD1 1 
+ATOM   1893 N N   . VAL A 1 260 ? 15.176  27.114  43.160  1.00 7.77  ? ? ? ? ? ? 750 VAL A N   1 
+ATOM   1894 C CA  . VAL A 1 260 ? 15.078  26.510  41.841  1.00 7.23  ? ? ? ? ? ? 750 VAL A CA  1 
+ATOM   1895 C C   . VAL A 1 260 ? 16.383  25.831  41.467  1.00 6.52  ? ? ? ? ? ? 750 VAL A C   1 
+ATOM   1896 O O   . VAL A 1 260 ? 17.459  26.385  41.704  1.00 8.27  ? ? ? ? ? ? 750 VAL A O   1 
+ATOM   1897 C CB  . VAL A 1 260 ? 14.802  27.636  40.764  1.00 6.96  ? ? ? ? ? ? 750 VAL A CB  1 
+ATOM   1898 C CG1 . VAL A 1 260 ? 14.816  27.041  39.329  1.00 8.40  ? ? ? ? ? ? 750 VAL A CG1 1 
+ATOM   1899 C CG2 . VAL A 1 260 ? 13.488  28.351  41.048  1.00 6.84  ? ? ? ? ? ? 750 VAL A CG2 1 
+ATOM   1900 N N   . SER A 1 261 ? 16.293  24.615  40.930  1.00 6.22  ? ? ? ? ? ? 751 SER A N   1 
+ATOM   1901 C CA  . SER A 1 261 ? 17.477  23.917  40.406  1.00 5.59  ? ? ? ? ? ? 751 SER A CA  1 
+ATOM   1902 C C   . SER A 1 261 ? 17.241  23.594  38.934  1.00 6.21  ? ? ? ? ? ? 751 SER A C   1 
+ATOM   1903 O O   . SER A 1 261 ? 16.122  23.261  38.573  1.00 6.81  ? ? ? ? ? ? 751 SER A O   1 
+ATOM   1904 C CB  . SER A 1 261 ? 17.750  22.578  41.124  1.00 7.03  ? ? ? ? ? ? 751 SER A CB  1 
+ATOM   1905 O OG  . SER A 1 261 ? 18.212  22.811  42.441  1.00 7.94  ? ? ? ? ? ? 751 SER A OG  1 
+ATOM   1906 N N   . PHE A 1 262 ? 18.279  23.742  38.095  1.00 6.21  ? ? ? ? ? ? 752 PHE A N   1 
+ATOM   1907 C CA  . PHE A 1 262 ? 18.195  23.348  36.677  1.00 7.09  ? ? ? ? ? ? 752 PHE A CA  1 
+ATOM   1908 C C   . PHE A 1 262 ? 18.702  21.895  36.792  1.00 6.86  ? ? ? ? ? ? 752 PHE A C   1 
+ATOM   1909 O O   . PHE A 1 262 ? 19.855  21.659  37.111  1.00 6.50  ? ? ? ? ? ? 752 PHE A O   1 
+ATOM   1910 C CB  . PHE A 1 262 ? 19.137  24.203  35.792  1.00 7.61  ? ? ? ? ? ? 752 PHE A CB  1 
+ATOM   1911 C CG  . PHE A 1 262 ? 18.696  25.669  35.606  1.00 8.76  ? ? ? ? ? ? 752 PHE A CG  1 
+ATOM   1912 C CD1 . PHE A 1 262 ? 17.445  26.127  36.025  1.00 9.00  ? ? ? ? ? ? 752 PHE A CD1 1 
+ATOM   1913 C CD2 . PHE A 1 262 ? 19.561  26.581  34.997  1.00 9.90  ? ? ? ? ? ? 752 PHE A CD2 1 
+ATOM   1914 C CE1 . PHE A 1 262 ? 17.064  27.462  35.850  1.00 9.69  ? ? ? ? ? ? 752 PHE A CE1 1 
+ATOM   1915 C CE2 . PHE A 1 262 ? 19.181  27.929  34.818  1.00 10.82 ? ? ? ? ? ? 752 PHE A CE2 1 
+ATOM   1916 C CZ  . PHE A 1 262 ? 17.938  28.361  35.243  1.00 10.74 ? ? ? ? ? ? 752 PHE A CZ  1 
+ATOM   1917 N N   . THR A 1 263 ? 17.848  20.926  36.480  1.00 6.16  ? ? ? ? ? ? 753 THR A N   1 
+ATOM   1918 C CA  . THR A 1 263 ? 18.166  19.528  36.756  1.00 5.84  ? ? ? ? ? ? 753 THR A CA  1 
+ATOM   1919 C C   . THR A 1 263 ? 18.536  18.553  35.668  1.00 6.58  ? ? ? ? ? ? 753 THR A C   1 
+ATOM   1920 O O   . THR A 1 263 ? 19.174  17.548  35.962  1.00 7.31  ? ? ? ? ? ? 753 THR A O   1 
+ATOM   1921 C CB  . THR A 1 263 ? 16.964  18.878  37.536  1.00 6.41  ? ? ? ? ? ? 753 THR A CB  1 
+ATOM   1922 O OG1 . THR A 1 263 ? 15.771  19.004  36.746  1.00 7.44  ? ? ? ? ? ? 753 THR A OG1 1 
+ATOM   1923 C CG2 . THR A 1 263 ? 16.726  19.587  38.890  1.00 6.23  ? ? ? ? ? ? 753 THR A CG2 1 
+ATOM   1924 N N   . GLU A 1 264 ? 18.147  18.810  34.416  1.00 5.61  ? ? ? ? ? ? 754 GLU A N   1 
+ATOM   1925 C CA  . GLU A 1 264 ? 18.435  17.862  33.360  1.00 5.74  ? ? ? ? ? ? 754 GLU A CA  1 
+ATOM   1926 C C   . GLU A 1 264 ? 18.690  18.610  32.051  1.00 6.79  ? ? ? ? ? ? 754 GLU A C   1 
+ATOM   1927 O O   . GLU A 1 264 ? 18.256  18.154  30.979  1.00 7.27  ? ? ? ? ? ? 754 GLU A O   1 
+ATOM   1928 C CB  . GLU A 1 264 ? 17.229  16.915  33.166  1.00 6.30  ? ? ? ? ? ? 754 GLU A CB  1 
+ATOM   1929 C CG  . GLU A 1 264 ? 16.721  16.238  34.492  1.00 6.93  ? ? ? ? ? ? 754 GLU A CG  1 
+ATOM   1930 C CD  . GLU A 1 264 ? 15.569  15.281  34.278  1.00 8.49  ? ? ? ? ? ? 754 GLU A CD  1 
+ATOM   1931 O OE1 . GLU A 1 264 ? 15.212  14.988  33.108  1.00 7.83  ? ? ? ? ? ? 754 GLU A OE1 1 
+ATOM   1932 O OE2 . GLU A 1 264 ? 15.006  14.805  35.308  1.00 8.93  ? ? ? ? ? ? 754 GLU A OE2 1 
+ATOM   1933 N N   . ILE A 1 265 ? 19.488  19.664  32.126  1.00 6.12  ? ? ? ? ? ? 755 ILE A N   1 
+ATOM   1934 C CA  . ILE A 1 265 ? 19.721  20.492  30.942  1.00 6.47  ? ? ? ? ? ? 755 ILE A CA  1 
+ATOM   1935 C C   . ILE A 1 265 ? 20.317  19.793  29.738  1.00 6.37  ? ? ? ? ? ? 755 ILE A C   1 
+ATOM   1936 O O   . ILE A 1 265 ? 21.288  19.049  29.835  1.00 6.40  ? ? ? ? ? ? 755 ILE A O   1 
+ATOM   1937 C CB  . ILE A 1 265 ? 20.709  21.645  31.207  1.00 6.90  ? ? ? ? ? ? 755 ILE A CB  1 
+ATOM   1938 C CG1 . ILE A 1 265 ? 20.310  22.480  32.421  1.00 6.34  ? ? ? ? ? ? 755 ILE A CG1 1 
+ATOM   1939 C CG2 . ILE A 1 265 ? 20.781  22.545  29.944  1.00 7.30  ? ? ? ? ? ? 755 ILE A CG2 1 
+ATOM   1940 C CD1 . ILE A 1 265 ? 21.484  23.255  32.969  1.00 8.29  ? ? ? ? ? ? 755 ILE A CD1 1 
+ATOM   1941 N N   . ASP A 1 266 ? 19.664  19.993  28.599  1.00 6.80  ? ? ? ? ? ? 756 ASP A N   1 
+ATOM   1942 C CA  . ASP A 1 266 ? 20.233  19.558  27.313  1.00 7.73  ? ? ? ? ? ? 756 ASP A CA  1 
+ATOM   1943 C C   . ASP A 1 266 ? 19.607  20.463  26.250  1.00 7.57  ? ? ? ? ? ? 756 ASP A C   1 
+ATOM   1944 O O   . ASP A 1 266 ? 18.514  21.017  26.457  1.00 7.64  ? ? ? ? ? ? 756 ASP A O   1 
+ATOM   1945 C CB  . ASP A 1 266 ? 20.215  18.041  27.005  1.00 7.66  ? ? ? ? ? ? 756 ASP A CB  1 
+ATOM   1946 C CG  . ASP A 1 266 ? 18.854  17.378  27.214  1.00 8.26  ? ? ? ? ? ? 756 ASP A CG  1 
+ATOM   1947 O OD1 . ASP A 1 266 ? 17.811  18.006  27.042  1.00 9.13  ? ? ? ? ? ? 756 ASP A OD1 1 
+ATOM   1948 O OD2 . ASP A 1 266 ? 18.861  16.169  27.532  1.00 9.17  ? ? ? ? ? ? 756 ASP A OD2 1 
+ATOM   1949 N N   . ILE A 1 267 ? 20.365  20.735  25.188  1.00 8.31  ? ? ? ? ? ? 757 ILE A N   1 
+ATOM   1950 C CA  . ILE A 1 267 ? 19.891  21.674  24.130  1.00 9.29  ? ? ? ? ? ? 757 ILE A CA  1 
+ATOM   1951 C C   . ILE A 1 267 ? 20.022  20.959  22.781  1.00 8.29  ? ? ? ? ? ? 757 ILE A C   1 
+ATOM   1952 O O   . ILE A 1 267 ? 21.095  20.885  22.202  1.00 8.70  ? ? ? ? ? ? 757 ILE A O   1 
+ATOM   1953 C CB  . ILE A 1 267 ? 20.680  23.012  24.221  1.00 9.49  ? ? ? ? ? ? 757 ILE A CB  1 
+ATOM   1954 C CG1 . ILE A 1 267 ? 20.560  23.592  25.663  1.00 11.33 ? ? ? ? ? ? 757 ILE A CG1 1 
+ATOM   1955 C CG2 . ILE A 1 267 ? 20.160  24.006  23.169  1.00 10.97 ? ? ? ? ? ? 757 ILE A CG2 1 
+ATOM   1956 C CD1 . ILE A 1 267 ? 21.164  24.998  25.900  1.00 12.95 ? ? ? ? ? ? 757 ILE A CD1 1 
+ATOM   1957 N N   . ARG A 1 268 ? 18.906  20.384  22.349  1.00 9.24  ? ? ? ? ? ? 758 ARG A N   1 
+ATOM   1958 C CA  . ARG A 1 268 ? 18.882  19.552  21.174  1.00 9.77  ? ? ? ? ? ? 758 ARG A CA  1 
+ATOM   1959 C C   . ARG A 1 268 ? 18.886  20.275  19.826  1.00 9.82  ? ? ? ? ? ? 758 ARG A C   1 
+ATOM   1960 O O   . ARG A 1 268 ? 18.187  21.255  19.629  1.00 9.81  ? ? ? ? ? ? 758 ARG A O   1 
+ATOM   1961 C CB  . ARG A 1 268 ? 17.753  18.518  21.297  1.00 10.69 ? ? ? ? ? ? 758 ARG A CB  1 
+ATOM   1962 C CG  . ARG A 1 268 ? 16.328  19.072  21.302  1.00 10.83 ? ? ? ? ? ? 758 ARG A CG  1 
+ATOM   1963 C CD  . ARG A 1 268 ? 15.340  17.913  21.478  1.00 12.03 ? ? ? ? ? ? 758 ARG A CD  1 
+ATOM   1964 N NE  . ARG A 1 268 ? 13.947  18.317  21.460  1.00 12.50 ? ? ? ? ? ? 758 ARG A NE  1 
+ATOM   1965 C CZ  . ARG A 1 268 ? 13.278  18.779  22.503  1.00 13.50 ? ? ? ? ? ? 758 ARG A CZ  1 
+ATOM   1966 N NH1 . ARG A 1 268 ? 13.866  18.930  23.683  1.00 13.90 ? ? ? ? ? ? 758 ARG A NH1 1 
+ATOM   1967 N NH2 . ARG A 1 268 ? 12.003  19.109  22.361  1.00 15.64 ? ? ? ? ? ? 758 ARG A NH2 1 
+ATOM   1968 N N   . ILE A 1 269 ? 19.646  19.707  18.900  1.00 11.27 ? ? ? ? ? ? 759 ILE A N   1 
+ATOM   1969 C CA  . ILE A 1 269 ? 19.841  20.269  17.556  1.00 12.34 ? ? ? ? ? ? 759 ILE A CA  1 
+ATOM   1970 C C   . ILE A 1 269 ? 19.253  19.384  16.450  1.00 13.72 ? ? ? ? ? ? 759 ILE A C   1 
+ATOM   1971 O O   . ILE A 1 269 ? 19.518  18.166  16.408  1.00 13.26 ? ? ? ? ? ? 759 ILE A O   1 
+ATOM   1972 C CB  . ILE A 1 269 ? 21.348  20.432  17.278  1.00 11.56 ? ? ? ? ? ? 759 ILE A CB  1 
+ATOM   1973 C CG1 . ILE A 1 269 ? 21.963  21.382  18.305  1.00 11.50 ? ? ? ? ? ? 759 ILE A CG1 1 
+ATOM   1974 C CG2 . ILE A 1 269 ? 21.601  20.969  15.831  1.00 12.61 ? ? ? ? ? ? 759 ILE A CG2 1 
+ATOM   1975 C CD1 . ILE A 1 269 ? 23.461  21.443  18.265  1.00 11.85 ? ? ? ? ? ? 759 ILE A CD1 1 
+ATOM   1976 N N   . PRO A 1 270 ? 18.444  19.986  15.542  1.00 16.07 ? ? ? ? ? ? 760 PRO A N   1 
+ATOM   1977 C CA  . PRO A 1 270 ? 17.818  19.259  14.414  1.00 18.40 ? ? ? ? ? ? 760 PRO A CA  1 
+ATOM   1978 C C   . PRO A 1 270 ? 18.946  18.648  13.557  1.00 21.21 ? ? ? ? ? ? 760 PRO A C   1 
+ATOM   1979 O O   . PRO A 1 270 ? 19.933  19.325  13.254  1.00 20.98 ? ? ? ? ? ? 760 PRO A O   1 
+ATOM   1980 C CB  . PRO A 1 270 ? 17.083  20.367  13.653  1.00 18.23 ? ? ? ? ? ? 760 PRO A CB  1 
+ATOM   1981 C CG  . PRO A 1 270 ? 16.805  21.415  14.702  1.00 17.98 ? ? ? ? ? ? 760 PRO A CG  1 
+ATOM   1982 C CD  . PRO A 1 270 ? 18.044  21.409  15.565  1.00 16.19 ? ? ? ? ? ? 760 PRO A CD  1 
+ATOM   1983 N N   . GLN A 1 271 ? 18.813  17.369  13.212  1.00 24.60 ? ? ? ? ? ? 761 GLN A N   1 
+ATOM   1984 C CA  . GLN A 1 271 ? 19.809  16.612  12.453  1.00 29.69 ? ? ? ? ? ? 761 GLN A CA  1 
+ATOM   1985 C C   . GLN A 1 271 ? 20.197  17.247  11.123  1.00 31.87 ? ? ? ? ? ? 761 GLN A C   1 
+ATOM   1986 O O   . GLN A 1 271 ? 21.278  16.970  10.580  1.00 32.76 ? ? ? ? ? ? 761 GLN A O   1 
+ATOM   1987 C CB  . GLN A 1 271 ? 19.293  15.193  12.193  1.00 32.52 ? ? ? ? ? ? 761 GLN A CB  1 
+ATOM   1988 C CG  . GLN A 1 271 ? 20.344  14.090  12.372  1.00 36.55 ? ? ? ? ? ? 761 GLN A CG  1 
+ATOM   1989 C CD  . GLN A 1 271 ? 20.530  13.666  13.843  1.00 38.84 ? ? ? ? ? ? 761 GLN A CD  1 
+ATOM   1990 O OE1 . GLN A 1 271 ? 19.947  12.661  14.293  1.00 38.83 ? ? ? ? ? ? 761 GLN A OE1 1 
+ATOM   1991 N NE2 . GLN A 1 271 ? 21.343  14.432  14.596  1.00 39.70 ? ? ? ? ? ? 761 GLN A NE2 1 
+ATOM   1992 N N   . SER A 1 272 ? 19.289  18.060  10.596  1.00 33.48 ? ? ? ? ? ? 762 SER A N   1 
+ATOM   1993 C CA  . SER A 1 272 ? 19.478  18.755  9.329   1.00 36.66 ? ? ? ? ? ? 762 SER A CA  1 
+ATOM   1994 C C   . SER A 1 272 ? 20.221  20.107  9.375   1.00 37.70 ? ? ? ? ? ? 762 SER A C   1 
+ATOM   1995 O O   . SER A 1 272 ? 20.685  20.571  8.328   1.00 38.59 ? ? ? ? ? ? 762 SER A O   1 
+ATOM   1996 C CB  . SER A 1 272 ? 18.118  18.936  8.644   1.00 37.76 ? ? ? ? ? ? 762 SER A CB  1 
+ATOM   1997 O OG  . SER A 1 272 ? 17.144  19.512  9.524   1.00 40.20 ? ? ? ? ? ? 762 SER A OG  1 
+ATOM   1998 N N   . GLU A 1 273 ? 20.255  20.768  10.543  1.00 37.47 ? ? ? ? ? ? 763 GLU A N   1 
+ATOM   1999 C CA  . GLU A 1 273 ? 20.940  22.066  10.731  1.00 37.43 ? ? ? ? ? ? 763 GLU A CA  1 
+ATOM   2000 C C   . GLU A 1 273 ? 22.437  21.825  10.431  1.00 36.05 ? ? ? ? ? ? 763 GLU A C   1 
+ATOM   2001 O O   . GLU A 1 273 ? 22.909  20.686  10.557  1.00 36.12 ? ? ? ? ? ? 763 GLU A O   1 
+ATOM   2002 C CB  . GLU A 1 273 ? 20.793  22.558  12.203  1.00 39.14 ? ? ? ? ? ? 763 GLU A CB  1 
+ATOM   2003 C CG  . GLU A 1 273 ? 19.737  23.671  12.502  1.00 41.40 ? ? ? ? ? ? 763 GLU A CG  1 
+ATOM   2004 C CD  . GLU A 1 273 ? 19.650  24.099  14.020  1.00 43.76 ? ? ? ? ? ? 763 GLU A CD  1 
+ATOM   2005 O OE1 . GLU A 1 273 ? 20.602  23.877  14.808  1.00 44.89 ? ? ? ? ? ? 763 GLU A OE1 1 
+ATOM   2006 O OE2 . GLU A 1 273 ? 18.611  24.668  14.451  1.00 44.77 ? ? ? ? ? ? 763 GLU A OE2 1 
+ATOM   2007 N N   . ASN A 1 274 ? 23.169  22.857  9.982   1.00 34.17 ? ? ? ? ? ? 764 ASN A N   1 
+ATOM   2008 C CA  . ASN A 1 274 ? 24.617  22.700  9.720   1.00 31.78 ? ? ? ? ? ? 764 ASN A CA  1 
+ATOM   2009 C C   . ASN A 1 274 ? 25.263  22.665  11.114  1.00 29.18 ? ? ? ? ? ? 764 ASN A C   1 
+ATOM   2010 O O   . ASN A 1 274 ? 25.092  23.619  11.878  1.00 28.63 ? ? ? ? ? ? 764 ASN A O   1 
+ATOM   2011 C CB  . ASN A 1 274 ? 25.170  23.885  8.907   1.00 32.94 ? ? ? ? ? ? 764 ASN A CB  1 
+ATOM   2012 C CG  . ASN A 1 274 ? 26.709  23.948  8.919   1.00 33.58 ? ? ? ? ? ? 764 ASN A CG  1 
+ATOM   2013 O OD1 . ASN A 1 274 ? 27.400  22.994  8.539   1.00 34.94 ? ? ? ? ? ? 764 ASN A OD1 1 
+ATOM   2014 N ND2 . ASN A 1 274 ? 27.241  25.064  9.387   1.00 33.52 ? ? ? ? ? ? 764 ASN A ND2 1 
+ATOM   2015 N N   . PRO A 1 275 ? 26.036  21.593  11.441  1.00 26.45 ? ? ? ? ? ? 765 PRO A N   1 
+ATOM   2016 C CA  . PRO A 1 275 ? 26.706  21.401  12.733  1.00 24.23 ? ? ? ? ? ? 765 PRO A CA  1 
+ATOM   2017 C C   . PRO A 1 275 ? 27.561  22.541  13.233  1.00 21.88 ? ? ? ? ? ? 765 PRO A C   1 
+ATOM   2018 O O   . PRO A 1 275 ? 27.385  22.985  14.362  1.00 19.95 ? ? ? ? ? ? 765 PRO A O   1 
+ATOM   2019 C CB  . PRO A 1 275 ? 27.556  20.148  12.505  1.00 25.21 ? ? ? ? ? ? 765 PRO A CB  1 
+ATOM   2020 C CG  . PRO A 1 275 ? 26.804  19.404  11.497  1.00 25.28 ? ? ? ? ? ? 765 PRO A CG  1 
+ATOM   2021 C CD  . PRO A 1 275 ? 26.391  20.486  10.536  1.00 26.28 ? ? ? ? ? ? 765 PRO A CD  1 
+ATOM   2022 N N   . ALA A 1 276 ? 28.483  23.009  12.390  1.00 19.45 ? ? ? ? ? ? 766 ALA A N   1 
+ATOM   2023 C CA  . ALA A 1 276 ? 29.414  24.070  12.768  1.00 17.82 ? ? ? ? ? ? 766 ALA A CA  1 
+ATOM   2024 C C   . ALA A 1 276 ? 28.771  25.355  13.302  1.00 15.92 ? ? ? ? ? ? 766 ALA A C   1 
+ATOM   2025 O O   . ALA A 1 276 ? 29.150  25.851  14.368  1.00 16.01 ? ? ? ? ? ? 766 ALA A O   1 
+ATOM   2026 C CB  . ALA A 1 276 ? 30.382  24.357  11.620  1.00 18.46 ? ? ? ? ? ? 766 ALA A CB  1 
+ATOM   2027 N N   . THR A 1 277 ? 27.760  25.858  12.612  1.00 14.28 ? ? ? ? ? ? 767 THR A N   1 
+ATOM   2028 C CA  . THR A 1 277 ? 27.074  27.060  13.069  1.00 14.72 ? ? ? ? ? ? 767 THR A CA  1 
+ATOM   2029 C C   . THR A 1 277 ? 26.005  26.733  14.147  1.00 12.77 ? ? ? ? ? ? 767 THR A C   1 
+ATOM   2030 O O   . THR A 1 277 ? 25.768  27.537  15.027  1.00 13.61 ? ? ? ? ? ? 767 THR A O   1 
+ATOM   2031 C CB  . THR A 1 277 ? 26.466  27.874  11.874  1.00 17.10 ? ? ? ? ? ? 767 THR A CB  1 
+ATOM   2032 O OG1 . THR A 1 277 ? 25.641  27.013  11.073  1.00 19.71 ? ? ? ? ? ? 767 THR A OG1 1 
+ATOM   2033 C CG2 . THR A 1 277 ? 27.602  28.454  10.984  1.00 17.13 ? ? ? ? ? ? 767 THR A CG2 1 
+ATOM   2034 N N   . ALA A 1 278 ? 25.359  25.574  14.062  1.00 12.75 ? ? ? ? ? ? 768 ALA A N   1 
+ATOM   2035 C CA  . ALA A 1 278 ? 24.376  25.160  15.085  1.00 12.12 ? ? ? ? ? ? 768 ALA A CA  1 
+ATOM   2036 C C   . ALA A 1 278 ? 25.099  25.083  16.457  1.00 10.67 ? ? ? ? ? ? 768 ALA A C   1 
+ATOM   2037 O O   . ALA A 1 278 ? 24.532  25.487  17.464  1.00 11.15 ? ? ? ? ? ? 768 ALA A O   1 
+ATOM   2038 C CB  . ALA A 1 278 ? 23.778  23.818  14.728  1.00 12.11 ? ? ? ? ? ? 768 ALA A CB  1 
+ATOM   2039 N N   . PHE A 1 279 ? 26.351  24.631  16.475  1.00 10.85 ? ? ? ? ? ? 769 PHE A N   1 
+ATOM   2040 C CA  . PHE A 1 279 ? 27.145  24.543  17.725  1.00 11.87 ? ? ? ? ? ? 769 PHE A CA  1 
+ATOM   2041 C C   . PHE A 1 279 ? 27.425  25.913  18.353  1.00 12.79 ? ? ? ? ? ? 769 PHE A C   1 
+ATOM   2042 O O   . PHE A 1 279 ? 27.554  26.022  19.580  1.00 12.86 ? ? ? ? ? ? 769 PHE A O   1 
+ATOM   2043 C CB  . PHE A 1 279 ? 28.470  23.794  17.530  1.00 12.06 ? ? ? ? ? ? 769 PHE A CB  1 
+ATOM   2044 C CG  . PHE A 1 279 ? 28.319  22.291  17.371  1.00 13.63 ? ? ? ? ? ? 769 PHE A CG  1 
+ATOM   2045 C CD1 . PHE A 1 279 ? 27.063  21.690  17.308  1.00 14.14 ? ? ? ? ? ? 769 PHE A CD1 1 
+ATOM   2046 C CD2 . PHE A 1 279 ? 29.439  21.487  17.208  1.00 14.70 ? ? ? ? ? ? 769 PHE A CD2 1 
+ATOM   2047 C CE1 . PHE A 1 279 ? 26.920  20.310  17.074  1.00 15.21 ? ? ? ? ? ? 769 PHE A CE1 1 
+ATOM   2048 C CE2 . PHE A 1 279 ? 29.313  20.086  16.970  1.00 16.17 ? ? ? ? ? ? 769 PHE A CE2 1 
+ATOM   2049 C CZ  . PHE A 1 279 ? 28.047  19.501  16.902  1.00 14.88 ? ? ? ? ? ? 769 PHE A CZ  1 
+ATOM   2050 N N   . GLN A 1 280 ? 27.536  26.958  17.530  1.00 10.91 ? ? ? ? ? ? 770 GLN A N   1 
+ATOM   2051 C CA  . GLN A 1 280 ? 27.759  28.305  18.019  1.00 11.24 ? ? ? ? ? ? 770 GLN A CA  1 
+ATOM   2052 C C   . GLN A 1 280 ? 26.498  28.859  18.698  1.00 11.07 ? ? ? ? ? ? 770 GLN A C   1 
+ATOM   2053 O O   . GLN A 1 280 ? 26.572  29.516  19.744  1.00 12.05 ? ? ? ? ? ? 770 GLN A O   1 
+ATOM   2054 C CB  . GLN A 1 280 ? 28.172  29.214  16.872  1.00 12.81 ? ? ? ? ? ? 770 GLN A CB  1 
+ATOM   2055 C CG  . GLN A 1 280 ? 29.577  29.025  16.450  1.00 15.21 ? ? ? ? ? ? 770 GLN A CG  1 
+ATOM   2056 C CD  . GLN A 1 280 ? 29.963  30.063  15.400  1.00 18.23 ? ? ? ? ? ? 770 GLN A CD  1 
+ATOM   2057 O OE1 . GLN A 1 280 ? 29.245  30.243  14.395  1.00 19.22 ? ? ? ? ? ? 770 GLN A OE1 1 
+ATOM   2058 N NE2 . GLN A 1 280 ? 31.050  30.790  15.650  1.00 18.11 ? ? ? ? ? ? 770 GLN A NE2 1 
+ATOM   2059 N N   . VAL A 1 281 ? 25.339  28.595  18.099  1.00 10.67 ? ? ? ? ? ? 771 VAL A N   1 
+ATOM   2060 C CA  . VAL A 1 281 ? 24.056  29.019  18.670  1.00 11.00 ? ? ? ? ? ? 771 VAL A CA  1 
+ATOM   2061 C C   . VAL A 1 281 ? 23.861  28.281  20.028  1.00 11.27 ? ? ? ? ? ? 771 VAL A C   1 
+ATOM   2062 O O   . VAL A 1 281 ? 23.481  28.894  21.037  1.00 11.20 ? ? ? ? ? ? 771 VAL A O   1 
+ATOM   2063 C CB  . VAL A 1 281 ? 22.894  28.627  17.752  1.00 11.38 ? ? ? ? ? ? 771 VAL A CB  1 
+ATOM   2064 C CG1 . VAL A 1 281 ? 21.573  28.923  18.421  1.00 11.70 ? ? ? ? ? ? 771 VAL A CG1 1 
+ATOM   2065 C CG2 . VAL A 1 281 ? 23.002  29.394  16.405  1.00 13.00 ? ? ? ? ? ? 771 VAL A CG2 1 
+ATOM   2066 N N   . GLN A 1 282 ? 24.115  26.974  20.016  1.00 10.26 ? ? ? ? ? ? 772 GLN A N   1 
+ATOM   2067 C CA  . GLN A 1 282 ? 24.000  26.138  21.238  1.00 9.83  ? ? ? ? ? ? 772 GLN A CA  1 
+ATOM   2068 C C   . GLN A 1 282 ? 24.886  26.697  22.341  1.00 10.09 ? ? ? ? ? ? 772 GLN A C   1 
+ATOM   2069 O O   . GLN A 1 282 ? 24.445  26.783  23.494  1.00 10.98 ? ? ? ? ? ? 772 GLN A O   1 
+ATOM   2070 C CB  . GLN A 1 282 ? 24.400  24.697  20.928  1.00 9.45  ? ? ? ? ? ? 772 GLN A CB  1 
+ATOM   2071 C CG  . GLN A 1 282 ? 24.463  23.772  22.153  1.00 8.95  ? ? ? ? ? ? 772 GLN A CG  1 
+ATOM   2072 C CD  . GLN A 1 282 ? 24.854  22.368  21.750  1.00 9.15  ? ? ? ? ? ? 772 GLN A CD  1 
+ATOM   2073 O OE1 . GLN A 1 282 ? 26.011  22.105  21.399  1.00 9.98  ? ? ? ? ? ? 772 GLN A OE1 1 
+ATOM   2074 N NE2 . GLN A 1 282 ? 23.883  21.456  21.763  1.00 9.31  ? ? ? ? ? ? 772 GLN A NE2 1 
+ATOM   2075 N N   . ALA A 1 283 ? 26.119  27.091  22.003  1.00 9.30  ? ? ? ? ? ? 773 ALA A N   1 
+ATOM   2076 C CA  . ALA A 1 283 ? 27.046  27.675  22.977  1.00 10.09 ? ? ? ? ? ? 773 ALA A CA  1 
+ATOM   2077 C C   . ALA A 1 283 ? 26.479  28.953  23.603  1.00 10.89 ? ? ? ? ? ? 773 ALA A C   1 
+ATOM   2078 O O   . ALA A 1 283 ? 26.584  29.160  24.820  1.00 10.94 ? ? ? ? ? ? 773 ALA A O   1 
+ATOM   2079 C CB  . ALA A 1 283 ? 28.396  27.953  22.343  1.00 10.56 ? ? ? ? ? ? 773 ALA A CB  1 
+ATOM   2080 N N   . ASN A 1 284 ? 25.865  29.822  22.793  1.00 11.21 ? ? ? ? ? ? 774 ASN A N   1 
+ATOM   2081 C CA  . ASN A 1 284 ? 25.277  31.037  23.336  1.00 12.75 ? ? ? ? ? ? 774 ASN A CA  1 
+ATOM   2082 C C   . ASN A 1 284 ? 24.076  30.746  24.220  1.00 10.52 ? ? ? ? ? ? 774 ASN A C   1 
+ATOM   2083 O O   . ASN A 1 284 ? 23.840  31.467  25.187  1.00 10.75 ? ? ? ? ? ? 774 ASN A O   1 
+ATOM   2084 C CB  . ASN A 1 284 ? 24.861  32.005  22.229  1.00 16.52 ? ? ? ? ? ? 774 ASN A CB  1 
+ATOM   2085 C CG  . ASN A 1 284 ? 26.064  32.636  21.521  1.00 21.29 ? ? ? ? ? ? 774 ASN A CG  1 
+ATOM   2086 O OD1 . ASN A 1 284 ? 25.934  33.147  20.395  1.00 24.27 ? ? ? ? ? ? 774 ASN A OD1 1 
+ATOM   2087 N ND2 . ASN A 1 284 ? 27.242  32.608  22.175  1.00 23.11 ? ? ? ? ? ? 774 ASN A ND2 1 
+ATOM   2088 N N   . ASN A 1 285 ? 23.298  29.724  23.864  1.00 10.84 ? ? ? ? ? ? 775 ASN A N   1 
+ATOM   2089 C CA  . ASN A 1 285 ? 22.120  29.359  24.659  1.00 10.65 ? ? ? ? ? ? 775 ASN A CA  1 
+ATOM   2090 C C   . ASN A 1 285 ? 22.610  28.848  26.018  1.00 9.82  ? ? ? ? ? ? 775 ASN A C   1 
+ATOM   2091 O O   . ASN A 1 285 ? 22.058  29.231  27.046  1.00 10.74 ? ? ? ? ? ? 775 ASN A O   1 
+ATOM   2092 C CB  . ASN A 1 285 ? 21.281  28.281  23.958  1.00 10.95 ? ? ? ? ? ? 775 ASN A CB  1 
+ATOM   2093 C CG  . ASN A 1 285 ? 20.392  28.821  22.819  1.00 12.94 ? ? ? ? ? ? 775 ASN A CG  1 
+ATOM   2094 O OD1 . ASN A 1 285 ? 19.677  28.047  22.190  1.00 13.12 ? ? ? ? ? ? 775 ASN A OD1 1 
+ATOM   2095 N ND2 . ASN A 1 285 ? 20.407  30.135  22.578  1.00 14.23 ? ? ? ? ? ? 775 ASN A ND2 1 
+ATOM   2096 N N   . TYR A 1 286 ? 23.639  27.997  26.023  1.00 9.85  ? ? ? ? ? ? 776 TYR A N   1 
+ATOM   2097 C CA  . TYR A 1 286 ? 24.193  27.500  27.295  1.00 9.62  ? ? ? ? ? ? 776 TYR A CA  1 
+ATOM   2098 C C   . TYR A 1 286 ? 24.723  28.673  28.135  1.00 11.08 ? ? ? ? ? ? 776 TYR A C   1 
+ATOM   2099 O O   . TYR A 1 286 ? 24.512  28.734  29.352  1.00 10.65 ? ? ? ? ? ? 776 TYR A O   1 
+ATOM   2100 C CB  . TYR A 1 286 ? 25.315  26.481  27.059  1.00 8.96  ? ? ? ? ? ? 776 TYR A CB  1 
+ATOM   2101 C CG  . TYR A 1 286 ? 24.847  25.033  27.023  1.00 9.40  ? ? ? ? ? ? 776 TYR A CG  1 
+ATOM   2102 C CD1 . TYR A 1 286 ? 24.441  24.380  28.197  1.00 9.20  ? ? ? ? ? ? 776 TYR A CD1 1 
+ATOM   2103 C CD2 . TYR A 1 286 ? 24.837  24.299  25.831  1.00 8.96  ? ? ? ? ? ? 776 TYR A CD2 1 
+ATOM   2104 C CE1 . TYR A 1 286 ? 24.050  23.044  28.173  1.00 8.99  ? ? ? ? ? ? 776 TYR A CE1 1 
+ATOM   2105 C CE2 . TYR A 1 286 ? 24.444  22.956  25.797  1.00 8.99  ? ? ? ? ? ? 776 TYR A CE2 1 
+ATOM   2106 C CZ  . TYR A 1 286 ? 24.055  22.337  26.984  1.00 8.28  ? ? ? ? ? ? 776 TYR A CZ  1 
+ATOM   2107 O OH  . TYR A 1 286 ? 23.705  21.022  26.977  1.00 9.32  ? ? ? ? ? ? 776 TYR A OH  1 
+ATOM   2108 N N   . LYS A 1 287 ? 25.409  29.621  27.489  1.00 10.11 ? ? ? ? ? ? 777 LYS A N   1 
+ATOM   2109 C CA  . LYS A 1 287 ? 25.958  30.770  28.183  1.00 11.54 ? ? ? ? ? ? 777 LYS A CA  1 
+ATOM   2110 C C   . LYS A 1 287 ? 24.854  31.610  28.851  1.00 10.21 ? ? ? ? ? ? 777 LYS A C   1 
+ATOM   2111 O O   . LYS A 1 287 ? 24.984  32.031  30.009  1.00 10.63 ? ? ? ? ? ? 777 LYS A O   1 
+ATOM   2112 C CB  . LYS A 1 287 ? 26.743  31.614  27.170  1.00 13.73 ? ? ? ? ? ? 777 LYS A CB  1 
+ATOM   2113 C CG  . LYS A 1 287 ? 27.354  32.871  27.756  1.00 18.39 ? ? ? ? ? ? 777 LYS A CG  1 
+ATOM   2114 C CD  . LYS A 1 287 ? 28.413  33.408  26.800  1.00 22.43 ? ? ? ? ? ? 777 LYS A CD  1 
+ATOM   2115 C CE  . LYS A 1 287 ? 29.155  34.588  27.413  1.00 26.37 ? ? ? ? ? ? 777 LYS A CE  1 
+ATOM   2116 N NZ  . LYS A 1 287 ? 30.205  35.077  26.439  1.00 29.09 ? ? ? ? ? ? 777 LYS A NZ  1 
+ATOM   2117 N N   . GLU A 1 288 ? 23.786  31.888  28.114  1.00 9.53  ? ? ? ? ? ? 778 GLU A N   1 
+ATOM   2118 C CA  . GLU A 1 288 ? 22.670  32.662  28.645  1.00 11.49 ? ? ? ? ? ? 778 GLU A CA  1 
+ATOM   2119 C C   . GLU A 1 288 ? 21.989  31.949  29.823  1.00 11.02 ? ? ? ? ? ? 778 GLU A C   1 
+ATOM   2120 O O   . GLU A 1 288 ? 21.608  32.600  30.784  1.00 11.95 ? ? ? ? ? ? 778 GLU A O   1 
+ATOM   2121 C CB  . GLU A 1 288 ? 21.649  32.991  27.545  1.00 13.30 ? ? ? ? ? ? 778 GLU A CB  1 
+ATOM   2122 C CG  . GLU A 1 288 ? 22.182  33.976  26.523  1.00 16.77 ? ? ? ? ? ? 778 GLU A CG  1 
+ATOM   2123 C CD  . GLU A 1 288 ? 22.744  35.244  27.176  1.00 19.37 ? ? ? ? ? ? 778 GLU A CD  1 
+ATOM   2124 O OE1 . GLU A 1 288 ? 22.050  35.842  28.050  1.00 19.89 ? ? ? ? ? ? 778 GLU A OE1 1 
+ATOM   2125 O OE2 . GLU A 1 288 ? 23.896  35.632  26.835  1.00 21.64 ? ? ? ? ? ? 778 GLU A OE2 1 
+ATOM   2126 N N   . LEU A 1 289 ? 21.847  30.628  29.754  1.00 10.84 ? ? ? ? ? ? 779 LEU A N   1 
+ATOM   2127 C CA  . LEU A 1 289 ? 21.244  29.869  30.862  1.00 11.01 ? ? ? ? ? ? 779 LEU A CA  1 
+ATOM   2128 C C   . LEU A 1 289 ? 22.108  30.025  32.137  1.00 9.58  ? ? ? ? ? ? 779 LEU A C   1 
+ATOM   2129 O O   . LEU A 1 289 ? 21.591  30.239  33.256  1.00 9.63  ? ? ? ? ? ? 779 LEU A O   1 
+ATOM   2130 C CB  . LEU A 1 289 ? 21.142  28.388  30.498  1.00 13.34 ? ? ? ? ? ? 779 LEU A CB  1 
+ATOM   2131 C CG  . LEU A 1 289 ? 19.865  27.744  29.971  1.00 17.57 ? ? ? ? ? ? 779 LEU A CG  1 
+ATOM   2132 C CD1 . LEU A 1 289 ? 19.989  26.215  30.269  1.00 17.70 ? ? ? ? ? ? 779 LEU A CD1 1 
+ATOM   2133 C CD2 . LEU A 1 289 ? 18.611  28.281  30.681  1.00 18.13 ? ? ? ? ? ? 779 LEU A CD2 1 
+ATOM   2134 N N   . MET A 1 290 ? 23.416  29.900  31.982  1.00 9.14  ? ? ? ? ? ? 780 MET A N   1 
+ATOM   2135 C CA  . MET A 1 290 ? 24.325  30.090  33.122  1.00 9.68  ? ? ? ? ? ? 780 MET A CA  1 
+ATOM   2136 C C   . MET A 1 290 ? 24.221  31.505  33.690  1.00 10.14 ? ? ? ? ? ? 780 MET A C   1 
+ATOM   2137 O O   . MET A 1 290 ? 24.249  31.681  34.905  1.00 10.76 ? ? ? ? ? ? 780 MET A O   1 
+ATOM   2138 C CB  . MET A 1 290 ? 25.762  29.762  32.735  1.00 11.00 ? ? ? ? ? ? 780 MET A CB  1 
+ATOM   2139 C CG  . MET A 1 290 ? 26.753  29.893  33.884  1.00 12.59 ? ? ? ? ? ? 780 MET A CG  1 
+ATOM   2140 S SD  . MET A 1 290 ? 26.314  28.933  35.385  1.00 13.42 ? ? ? ? ? ? 780 MET A SD  1 
+ATOM   2141 C CE  . MET A 1 290 ? 26.988  27.360  34.936  1.00 12.56 ? ? ? ? ? ? 780 MET A CE  1 
+ATOM   2142 N N   . LYS A 1 291 ? 24.100  32.521  32.834  1.00 9.44  ? ? ? ? ? ? 781 LYS A N   1 
+ATOM   2143 C CA  . LYS A 1 291 ? 23.945  33.891  33.334  1.00 10.39 ? ? ? ? ? ? 781 LYS A CA  1 
+ATOM   2144 C C   . LYS A 1 291 ? 22.668  34.053  34.152  1.00 9.21  ? ? ? ? ? ? 781 LYS A C   1 
+ATOM   2145 O O   . LYS A 1 291 ? 22.643  34.824  35.112  1.00 9.91  ? ? ? ? ? ? 781 LYS A O   1 
+ATOM   2146 C CB  . LYS A 1 291 ? 23.946  34.907  32.191  1.00 12.88 ? ? ? ? ? ? 781 LYS A CB  1 
+ATOM   2147 C CG  . LYS A 1 291 ? 25.324  35.094  31.607  1.00 16.54 ? ? ? ? ? ? 781 LYS A CG  1 
+ATOM   2148 C CD  . LYS A 1 291 ? 25.254  35.743  30.233  1.00 19.89 ? ? ? ? ? ? 781 LYS A CD  1 
+ATOM   2149 C CE  . LYS A 1 291 ? 24.668  37.148  30.322  1.00 23.51 ? ? ? ? ? ? 781 LYS A CE  1 
+ATOM   2150 N NZ  . LYS A 1 291 ? 24.540  37.781  28.957  1.00 25.51 ? ? ? ? ? ? 781 LYS A NZ  1 
+ATOM   2151 N N   . ILE A 1 292 ? 21.606  33.350  33.775  1.00 9.21  ? ? ? ? ? ? 782 ILE A N   1 
+ATOM   2152 C CA  . ILE A 1 292 ? 20.366  33.425  34.540  1.00 9.91  ? ? ? ? ? ? 782 ILE A CA  1 
+ATOM   2153 C C   . ILE A 1 292 ? 20.588  32.769  35.919  1.00 10.45 ? ? ? ? ? ? 782 ILE A C   1 
+ATOM   2154 O O   . ILE A 1 292 ? 20.137  33.292  36.936  1.00 10.45 ? ? ? ? ? ? 782 ILE A O   1 
+ATOM   2155 C CB  . ILE A 1 292 ? 19.197  32.749  33.789  1.00 11.06 ? ? ? ? ? ? 782 ILE A CB  1 
+ATOM   2156 C CG1 . ILE A 1 292 ? 18.809  33.615  32.592  1.00 11.10 ? ? ? ? ? ? 782 ILE A CG1 1 
+ATOM   2157 C CG2 . ILE A 1 292 ? 17.965  32.535  34.734  1.00 10.92 ? ? ? ? ? ? 782 ILE A CG2 1 
+ATOM   2158 C CD1 . ILE A 1 292 ? 17.815  32.947  31.692  1.00 13.38 ? ? ? ? ? ? 782 ILE A CD1 1 
+ATOM   2159 N N   . CYS A 1 293 ? 21.317  31.660  35.949  1.00 9.61  ? ? ? ? ? ? 783 CYS A N   1 
+ATOM   2160 C CA  . CYS A 1 293 ? 21.614  30.994  37.200  1.00 11.23 ? ? ? ? ? ? 783 CYS A CA  1 
+ATOM   2161 C C   . CYS A 1 293 ? 22.439  31.948  38.107  1.00 12.01 ? ? ? ? ? ? 783 CYS A C   1 
+ATOM   2162 O O   . CYS A 1 293 ? 22.079  32.204  39.259  1.00 12.32 ? ? ? ? ? ? 783 CYS A O   1 
+ATOM   2163 C CB  . CYS A 1 293 ? 22.329  29.660  36.899  1.00 11.86 ? ? ? ? ? ? 783 CYS A CB  1 
+ATOM   2164 S SG  . CYS A 1 293 ? 22.967  28.762  38.349  1.00 16.76 ? ? ? ? ? ? 783 CYS A SG  1 
+ATOM   2165 N N   . LEU A 1 294 ? 23.471  32.578  37.557  1.00 12.25 ? ? ? ? ? ? 784 LEU A N   1 
+ATOM   2166 C CA  . LEU A 1 294 ? 24.298  33.497  38.329  1.00 13.07 ? ? ? ? ? ? 784 LEU A CA  1 
+ATOM   2167 C C   . LEU A 1 294 ? 23.569  34.744  38.847  1.00 13.37 ? ? ? ? ? ? 784 LEU A C   1 
+ATOM   2168 O O   . LEU A 1 294 ? 23.949  35.306  39.876  1.00 15.02 ? ? ? ? ? ? 784 LEU A O   1 
+ATOM   2169 C CB  . LEU A 1 294 ? 25.508  33.926  37.491  1.00 13.57 ? ? ? ? ? ? 784 LEU A CB  1 
+ATOM   2170 C CG  . LEU A 1 294 ? 26.463  32.802  37.101  1.00 13.28 ? ? ? ? ? ? 784 LEU A CG  1 
+ATOM   2171 C CD1 . LEU A 1 294 ? 27.409  33.307  36.056  1.00 14.57 ? ? ? ? ? ? 784 LEU A CD1 1 
+ATOM   2172 C CD2 . LEU A 1 294 ? 27.252  32.289  38.296  1.00 16.54 ? ? ? ? ? ? 784 LEU A CD2 1 
+ATOM   2173 N N   . ALA A 1 295 ? 22.522  35.181  38.160  1.00 12.60 ? ? ? ? ? ? 785 ALA A N   1 
+ATOM   2174 C CA  . ALA A 1 295 ? 21.802  36.392  38.560  1.00 13.07 ? ? ? ? ? ? 785 ALA A CA  1 
+ATOM   2175 C C   . ALA A 1 295 ? 20.714  36.221  39.611  1.00 13.35 ? ? ? ? ? ? 785 ALA A C   1 
+ATOM   2176 O O   . ALA A 1 295 ? 20.164  37.223  40.102  1.00 14.40 ? ? ? ? ? ? 785 ALA A O   1 
+ATOM   2177 C CB  . ALA A 1 295 ? 21.182  37.043  37.338  1.00 14.37 ? ? ? ? ? ? 785 ALA A CB  1 
+ATOM   2178 N N   . ASN A 1 296 ? 20.346  34.973  39.899  1.00 10.77 ? ? ? ? ? ? 786 ASN A N   1 
+ATOM   2179 C CA  . ASN A 1 296 ? 19.277  34.706  40.839  1.00 10.43 ? ? ? ? ? ? 786 ASN A CA  1 
+ATOM   2180 C C   . ASN A 1 296 ? 19.801  33.997  42.088  1.00 10.30 ? ? ? ? ? ? 786 ASN A C   1 
+ATOM   2181 O O   . ASN A 1 296 ? 20.245  32.853  42.012  1.00 10.02 ? ? ? ? ? ? 786 ASN A O   1 
+ATOM   2182 C CB  . ASN A 1 296 ? 18.191  33.894  40.144  1.00 10.13 ? ? ? ? ? ? 786 ASN A CB  1 
+ATOM   2183 C CG  . ASN A 1 296 ? 17.384  34.733  39.189  1.00 9.46  ? ? ? ? ? ? 786 ASN A CG  1 
+ATOM   2184 O OD1 . ASN A 1 296 ? 16.538  35.509  39.598  1.00 9.43  ? ? ? ? ? ? 786 ASN A OD1 1 
+ATOM   2185 N ND2 . ASN A 1 296 ? 17.674  34.599  37.903  1.00 11.23 ? ? ? ? ? ? 786 ASN A ND2 1 
+ATOM   2186 N N   . PRO A 1 297 ? 19.706  34.656  43.260  1.00 10.14 ? ? ? ? ? ? 787 PRO A N   1 
+ATOM   2187 C CA  . PRO A 1 297 ? 20.200  34.069  44.517  1.00 10.14 ? ? ? ? ? ? 787 PRO A CA  1 
+ATOM   2188 C C   . PRO A 1 297 ? 19.551  32.735  44.956  1.00 9.42  ? ? ? ? ? ? 787 PRO A C   1 
+ATOM   2189 O O   . PRO A 1 297 ? 20.155  32.025  45.745  1.00 10.32 ? ? ? ? ? ? 787 PRO A O   1 
+ATOM   2190 C CB  . PRO A 1 297 ? 19.954  35.183  45.556  1.00 10.71 ? ? ? ? ? ? 787 PRO A CB  1 
+ATOM   2191 C CG  . PRO A 1 297 ? 19.747  36.388  44.798  1.00 12.81 ? ? ? ? ? ? 787 PRO A CG  1 
+ATOM   2192 C CD  . PRO A 1 297 ? 19.105  35.982  43.491  1.00 10.78 ? ? ? ? ? ? 787 PRO A CD  1 
+ATOM   2193 N N   . ASN A 1 298 ? 18.313  32.454  44.520  1.00 8.67  ? ? ? ? ? ? 788 ASN A N   1 
+ATOM   2194 C CA  . ASN A 1 298 ? 17.608  31.198  44.851  1.00 8.43  ? ? ? ? ? ? 788 ASN A CA  1 
+ATOM   2195 C C   . ASN A 1 298 ? 17.802  30.072  43.817  1.00 9.09  ? ? ? ? ? ? 788 ASN A C   1 
+ATOM   2196 O O   . ASN A 1 298 ? 17.092  29.067  43.854  1.00 9.45  ? ? ? ? ? ? 788 ASN A O   1 
+ATOM   2197 C CB  . ASN A 1 298 ? 16.107  31.437  45.050  1.00 8.26  ? ? ? ? ? ? 788 ASN A CB  1 
+ATOM   2198 C CG  . ASN A 1 298 ? 15.388  31.843  43.753  1.00 9.04  ? ? ? ? ? ? 788 ASN A CG  1 
+ATOM   2199 O OD1 . ASN A 1 298 ? 15.906  32.642  42.970  1.00 9.96  ? ? ? ? ? ? 788 ASN A OD1 1 
+ATOM   2200 N ND2 . ASN A 1 298 ? 14.193  31.329  43.543  1.00 9.14  ? ? ? ? ? ? 788 ASN A ND2 1 
+ATOM   2201 N N   . CYS A 1 299 ? 18.758  30.230  42.895  1.00 8.95  ? ? ? ? ? ? 789 CYS A N   1 
+ATOM   2202 C CA  . CYS A 1 299 ? 19.009  29.200  41.863  1.00 10.21 ? ? ? ? ? ? 789 CYS A CA  1 
+ATOM   2203 C C   . CYS A 1 299 ? 20.520  28.959  41.830  1.00 12.08 ? ? ? ? ? ? 789 CYS A C   1 
+ATOM   2204 O O   . CYS A 1 299 ? 21.235  29.768  41.237  1.00 14.16 ? ? ? ? ? ? 789 CYS A O   1 
+ATOM   2205 C CB  . CYS A 1 299 ? 18.521  29.701  40.495  1.00 10.58 ? ? ? ? ? ? 789 CYS A CB  1 
+ATOM   2206 S SG  . CYS A 1 299 ? 18.843  28.534  39.168  1.00 14.93 ? ? ? ? ? ? 789 CYS A SG  1 
+ATOM   2207 N N   . ASN A 1 300 ? 21.012  27.868  42.433  1.00 10.86 ? ? ? ? ? ? 790 ASN A N   1 
+ATOM   2208 C CA  . ASN A 1 300 ? 22.458  27.624  42.486  1.00 12.32 ? ? ? ? ? ? 790 ASN A CA  1 
+ATOM   2209 C C   . ASN A 1 300 ? 22.927  26.220  42.100  1.00 11.09 ? ? ? ? ? ? 790 ASN A C   1 
+ATOM   2210 O O   . ASN A 1 300 ? 24.045  25.805  42.441  1.00 11.40 ? ? ? ? ? ? 790 ASN A O   1 
+ATOM   2211 C CB  . ASN A 1 300 ? 22.979  27.983  43.884  1.00 15.28 ? ? ? ? ? ? 790 ASN A CB  1 
+ATOM   2212 C CG  . ASN A 1 300 ? 22.597  29.427  44.308  1.00 18.96 ? ? ? ? ? ? 790 ASN A CG  1 
+ATOM   2213 O OD1 . ASN A 1 300 ? 23.163  30.423  43.813  1.00 21.05 ? ? ? ? ? ? 790 ASN A OD1 1 
+ATOM   2214 N ND2 . ASN A 1 300 ? 21.627  29.539  45.220  1.00 19.29 ? ? ? ? ? ? 790 ASN A ND2 1 
+ATOM   2215 N N   . THR A 1 301 ? 22.068  25.484  41.404  1.00 8.83  ? ? ? ? ? ? 791 THR A N   1 
+ATOM   2216 C CA  . THR A 1 301 ? 22.388  24.124  40.971  1.00 8.04  ? ? ? ? ? ? 791 THR A CA  1 
+ATOM   2217 C C   . THR A 1 301 ? 22.154  24.092  39.452  1.00 6.90  ? ? ? ? ? ? 791 THR A C   1 
+ATOM   2218 O O   . THR A 1 301 ? 21.069  24.406  38.979  1.00 7.37  ? ? ? ? ? ? 791 THR A O   1 
+ATOM   2219 C CB  . THR A 1 301 ? 21.458  23.110  41.681  1.00 9.09  ? ? ? ? ? ? 791 THR A CB  1 
+ATOM   2220 O OG1 . THR A 1 301 ? 21.666  23.196  43.091  1.00 10.63 ? ? ? ? ? ? 791 THR A OG1 1 
+ATOM   2221 C CG2 . THR A 1 301 ? 21.683  21.687  41.192  1.00 8.85  ? ? ? ? ? ? 791 THR A CG2 1 
+ATOM   2222 N N   . PHE A 1 302 ? 23.193  23.712  38.720  1.00 7.35  ? ? ? ? ? ? 792 PHE A N   1 
+ATOM   2223 C CA  . PHE A 1 302 ? 23.182  23.679  37.247  1.00 7.22  ? ? ? ? ? ? 792 PHE A CA  1 
+ATOM   2224 C C   . PHE A 1 302 ? 23.632  22.268  36.821  1.00 6.18  ? ? ? ? ? ? 792 PHE A C   1 
+ATOM   2225 O O   . PHE A 1 302 ? 24.831  21.980  36.743  1.00 7.60  ? ? ? ? ? ? 792 PHE A O   1 
+ATOM   2226 C CB  . PHE A 1 302 ? 24.184  24.752  36.763  1.00 7.55  ? ? ? ? ? ? 792 PHE A CB  1 
+ATOM   2227 C CG  . PHE A 1 302 ? 24.131  25.044  35.269  1.00 8.86  ? ? ? ? ? ? 792 PHE A CG  1 
+ATOM   2228 C CD1 . PHE A 1 302 ? 24.878  24.288  34.353  1.00 9.21  ? ? ? ? ? ? 792 PHE A CD1 1 
+ATOM   2229 C CD2 . PHE A 1 302 ? 23.392  26.123  34.795  1.00 9.60  ? ? ? ? ? ? 792 PHE A CD2 1 
+ATOM   2230 C CE1 . PHE A 1 302 ? 24.899  24.611  32.981  1.00 8.88  ? ? ? ? ? ? 792 PHE A CE1 1 
+ATOM   2231 C CE2 . PHE A 1 302 ? 23.409  26.451  33.404  1.00 9.33  ? ? ? ? ? ? 792 PHE A CE2 1 
+ATOM   2232 C CZ  . PHE A 1 302 ? 24.163  25.695  32.519  1.00 8.97  ? ? ? ? ? ? 792 PHE A CZ  1 
+ATOM   2233 N N   . VAL A 1 303 ? 22.672  21.380  36.583  1.00 5.49  ? ? ? ? ? ? 793 VAL A N   1 
+ATOM   2234 C CA  . VAL A 1 303 ? 22.973  20.006  36.194  1.00 5.94  ? ? ? ? ? ? 793 VAL A CA  1 
+ATOM   2235 C C   . VAL A 1 303 ? 22.515  19.733  34.768  1.00 6.07  ? ? ? ? ? ? 793 VAL A C   1 
+ATOM   2236 O O   . VAL A 1 303 ? 21.356  20.010  34.408  1.00 6.80  ? ? ? ? ? ? 793 VAL A O   1 
+ATOM   2237 C CB  . VAL A 1 303 ? 22.299  18.964  37.184  1.00 6.86  ? ? ? ? ? ? 793 VAL A CB  1 
+ATOM   2238 C CG1 . VAL A 1 303 ? 22.601  17.531  36.748  1.00 6.89  ? ? ? ? ? ? 793 VAL A CG1 1 
+ATOM   2239 C CG2 . VAL A 1 303 ? 22.796  19.194  38.629  1.00 8.58  ? ? ? ? ? ? 793 VAL A CG2 1 
+ATOM   2240 N N   . MET A 1 304 ? 23.417  19.174  33.978  1.00 6.34  ? ? ? ? ? ? 794 MET A N   1 
+ATOM   2241 C CA  . MET A 1 304 ? 23.140  18.811  32.572  1.00 7.49  ? ? ? ? ? ? 794 MET A CA  1 
+ATOM   2242 C C   . MET A 1 304 ? 22.860  17.301  32.491  1.00 7.70  ? ? ? ? ? ? 794 MET A C   1 
+ATOM   2243 O O   . MET A 1 304 ? 23.393  16.505  33.301  1.00 7.76  ? ? ? ? ? ? 794 MET A O   1 
+ATOM   2244 C CB  . MET A 1 304 ? 24.349  19.183  31.682  1.00 8.28  ? ? ? ? ? ? 794 MET A CB  1 
+ATOM   2245 C CG  . MET A 1 304 ? 24.561  20.683  31.633  1.00 9.87  ? ? ? ? ? ? 794 MET A CG  1 
+ATOM   2246 S SD  . MET A 1 304 ? 26.189  21.211  31.028  1.00 10.70 ? ? ? ? ? ? 794 MET A SD  1 
+ATOM   2247 C CE  . MET A 1 304 ? 27.231  20.747  32.296  1.00 13.21 ? ? ? ? ? ? 794 MET A CE  1 
+ATOM   2248 N N   . TRP A 1 305 ? 22.036  16.888  31.540  1.00 7.39  ? ? ? ? ? ? 795 TRP A N   1 
+ATOM   2249 C CA  . TRP A 1 305 ? 21.716  15.478  31.421  1.00 7.77  ? ? ? ? ? ? 795 TRP A CA  1 
+ATOM   2250 C C   . TRP A 1 305 ? 22.749  14.747  30.572  1.00 7.54  ? ? ? ? ? ? 795 TRP A C   1 
+ATOM   2251 O O   . TRP A 1 305 ? 22.438  14.182  29.511  1.00 8.84  ? ? ? ? ? ? 795 TRP A O   1 
+ATOM   2252 C CB  . TRP A 1 305 ? 20.294  15.266  30.899  1.00 9.56  ? ? ? ? ? ? 795 TRP A CB  1 
+ATOM   2253 C CG  . TRP A 1 305 ? 19.617  14.024  31.478  1.00 11.66 ? ? ? ? ? ? 795 TRP A CG  1 
+ATOM   2254 C CD1 . TRP A 1 305 ? 19.065  12.987  30.774  1.00 13.21 ? ? ? ? ? ? 795 TRP A CD1 1 
+ATOM   2255 C CD2 . TRP A 1 305 ? 19.411  13.716  32.885  1.00 12.73 ? ? ? ? ? ? 795 TRP A CD2 1 
+ATOM   2256 N NE1 . TRP A 1 305 ? 18.515  12.066  31.644  1.00 15.19 ? ? ? ? ? ? 795 TRP A NE1 1 
+ATOM   2257 C CE2 . TRP A 1 305 ? 18.713  12.484  32.941  1.00 13.84 ? ? ? ? ? ? 795 TRP A CE2 1 
+ATOM   2258 C CE3 . TRP A 1 305 ? 19.753  14.363  34.091  1.00 13.15 ? ? ? ? ? ? 795 TRP A CE3 1 
+ATOM   2259 C CZ2 . TRP A 1 305 ? 18.340  11.877  34.168  1.00 14.51 ? ? ? ? ? ? 795 TRP A CZ2 1 
+ATOM   2260 C CZ3 . TRP A 1 305 ? 19.380  13.756  35.335  1.00 13.66 ? ? ? ? ? ? 795 TRP A CZ3 1 
+ATOM   2261 C CH2 . TRP A 1 305 ? 18.684  12.530  35.348  1.00 14.18 ? ? ? ? ? ? 795 TRP A CH2 1 
+ATOM   2262 N N   . GLY A 1 306 ? 23.972  14.728  31.100  1.00 7.39  ? ? ? ? ? ? 796 GLY A N   1 
+ATOM   2263 C CA  . GLY A 1 306 ? 25.094  14.097  30.447  1.00 7.06  ? ? ? ? ? ? 796 GLY A CA  1 
+ATOM   2264 C C   . GLY A 1 306 ? 26.106  15.165  30.072  1.00 8.00  ? ? ? ? ? ? 796 GLY A C   1 
+ATOM   2265 O O   . GLY A 1 306 ? 25.860  16.352  30.299  1.00 8.37  ? ? ? ? ? ? 796 GLY A O   1 
+ATOM   2266 N N   . PHE A 1 307 ? 27.270  14.752  29.574  1.00 7.64  ? ? ? ? ? ? 797 PHE A N   1 
+ATOM   2267 C CA  . PHE A 1 307 ? 28.286  15.716  29.144  1.00 8.99  ? ? ? ? ? ? 797 PHE A CA  1 
+ATOM   2268 C C   . PHE A 1 307 ? 28.901  15.410  27.768  1.00 9.89  ? ? ? ? ? ? 797 PHE A C   1 
+ATOM   2269 O O   . PHE A 1 307 ? 29.568  16.269  27.202  1.00 10.65 ? ? ? ? ? ? 797 PHE A O   1 
+ATOM   2270 C CB  . PHE A 1 307 ? 29.373  15.947  30.209  1.00 9.28  ? ? ? ? ? ? 797 PHE A CB  1 
+ATOM   2271 C CG  . PHE A 1 307 ? 30.185  14.717  30.562  1.00 9.57  ? ? ? ? ? ? 797 PHE A CG  1 
+ATOM   2272 C CD1 . PHE A 1 307 ? 31.348  14.400  29.849  1.00 10.53 ? ? ? ? ? ? 797 PHE A CD1 1 
+ATOM   2273 C CD2 . PHE A 1 307 ? 29.796  13.890  31.616  1.00 10.81 ? ? ? ? ? ? 797 PHE A CD2 1 
+ATOM   2274 C CE1 . PHE A 1 307 ? 32.115  13.273  30.178  1.00 10.77 ? ? ? ? ? ? 797 PHE A CE1 1 
+ATOM   2275 C CE2 . PHE A 1 307 ? 30.549  12.761  31.961  1.00 11.04 ? ? ? ? ? ? 797 PHE A CE2 1 
+ATOM   2276 C CZ  . PHE A 1 307 ? 31.709  12.449  31.244  1.00 11.41 ? ? ? ? ? ? 797 PHE A CZ  1 
+ATOM   2277 N N   . THR A 1 308 ? 28.712  14.208  27.236  1.00 8.95  ? ? ? ? ? ? 798 THR A N   1 
+ATOM   2278 C CA  . THR A 1 308 ? 29.241  13.909  25.905  1.00 9.31  ? ? ? ? ? ? 798 THR A CA  1 
+ATOM   2279 C C   . THR A 1 308 ? 28.103  13.454  25.007  1.00 10.39 ? ? ? ? ? ? 798 THR A C   1 
+ATOM   2280 O O   . THR A 1 308 ? 27.234  12.674  25.413  1.00 9.19  ? ? ? ? ? ? 798 THR A O   1 
+ATOM   2281 C CB  . THR A 1 308 ? 30.376  12.848  25.901  1.00 9.26  ? ? ? ? ? ? 798 THR A CB  1 
+ATOM   2282 O OG1 . THR A 1 308 ? 30.632  12.447  24.554  1.00 10.64 ? ? ? ? ? ? 798 THR A OG1 1 
+ATOM   2283 C CG2 . THR A 1 308 ? 29.974  11.579  26.668  1.00 10.15 ? ? ? ? ? ? 798 THR A CG2 1 
+ATOM   2284 N N   . ASP A 1 309 ? 28.084  13.983  23.781  1.00 11.12 ? ? ? ? ? ? 799 ASP A N   1 
+ATOM   2285 C CA  . ASP A 1 309 ? 27.085  13.622  22.798  1.00 11.10 ? ? ? ? ? ? 799 ASP A CA  1 
+ATOM   2286 C C   . ASP A 1 309 ? 27.049  12.106  22.529  1.00 11.13 ? ? ? ? ? ? 799 ASP A C   1 
+ATOM   2287 O O   . ASP A 1 309 ? 26.093  11.601  21.910  1.00 12.20 ? ? ? ? ? ? 799 ASP A O   1 
+ATOM   2288 C CB  . ASP A 1 309 ? 27.385  14.346  21.487  1.00 11.83 ? ? ? ? ? ? 799 ASP A CB  1 
+ATOM   2289 C CG  . ASP A 1 309 ? 27.107  15.831  21.552  1.00 13.37 ? ? ? ? ? ? 799 ASP A CG  1 
+ATOM   2290 O OD1 . ASP A 1 309 ? 26.357  16.288  22.443  1.00 12.18 ? ? ? ? ? ? 799 ASP A OD1 1 
+ATOM   2291 O OD2 . ASP A 1 309 ? 27.618  16.552  20.665  1.00 13.71 ? ? ? ? ? ? 799 ASP A OD2 1 
+ATOM   2292 N N   . LYS A 1 310 ? 28.093  11.389  22.954  1.00 10.53 ? ? ? ? ? ? 800 LYS A N   1 
+ATOM   2293 C CA  . LYS A 1 310 ? 28.183  9.933   22.787  1.00 11.86 ? ? ? ? ? ? 800 LYS A CA  1 
+ATOM   2294 C C   . LYS A 1 310 ? 27.056  9.173   23.521  1.00 12.51 ? ? ? ? ? ? 800 LYS A C   1 
+ATOM   2295 O O   . LYS A 1 310 ? 26.574  8.134   23.048  1.00 12.74 ? ? ? ? ? ? 800 LYS A O   1 
+ATOM   2296 C CB  . LYS A 1 310 ? 29.541  9.450   23.312  1.00 13.34 ? ? ? ? ? ? 800 LYS A CB  1 
+ATOM   2297 C CG  . LYS A 1 310 ? 29.888  8.015   23.000  1.00 14.39 ? ? ? ? ? ? 800 LYS A CG  1 
+ATOM   2298 C CD  . LYS A 1 310 ? 31.345  7.718   23.383  1.00 14.66 ? ? ? ? ? ? 800 LYS A CD  1 
+ATOM   2299 C CE  . LYS A 1 310 ? 31.665  6.252   23.133  1.00 16.71 ? ? ? ? ? ? 800 LYS A CE  1 
+ATOM   2300 N NZ  . LYS A 1 310 ? 33.111  5.946   23.336  1.00 19.37 ? ? ? ? ? ? 800 LYS A NZ  1 
+ATOM   2301 N N   . TYR A 1 311 ? 26.656  9.693   24.686  1.00 11.82 ? ? ? ? ? ? 801 TYR A N   1 
+ATOM   2302 C CA  . TYR A 1 311 ? 25.624  9.068   25.527  1.00 11.92 ? ? ? ? ? ? 801 TYR A CA  1 
+ATOM   2303 C C   . TYR A 1 311 ? 24.503  10.062  25.838  1.00 10.53 ? ? ? ? ? ? 801 TYR A C   1 
+ATOM   2304 O O   . TYR A 1 311 ? 24.684  10.976  26.653  1.00 11.00 ? ? ? ? ? ? 801 TYR A O   1 
+ATOM   2305 C CB  . TYR A 1 311 ? 26.250  8.569   26.864  1.00 11.88 ? ? ? ? ? ? 801 TYR A CB  1 
+ATOM   2306 C CG  . TYR A 1 311 ? 27.460  7.665   26.703  1.00 12.43 ? ? ? ? ? ? 801 TYR A CG  1 
+ATOM   2307 C CD1 . TYR A 1 311 ? 27.371  6.447   26.003  1.00 13.47 ? ? ? ? ? ? 801 TYR A CD1 1 
+ATOM   2308 C CD2 . TYR A 1 311 ? 28.691  8.015   27.250  1.00 12.35 ? ? ? ? ? ? 801 TYR A CD2 1 
+ATOM   2309 C CE1 . TYR A 1 311 ? 28.475  5.604   25.851  1.00 13.61 ? ? ? ? ? ? 801 TYR A CE1 1 
+ATOM   2310 C CE2 . TYR A 1 311 ? 29.802  7.182   27.107  1.00 13.56 ? ? ? ? ? ? 801 TYR A CE2 1 
+ATOM   2311 C CZ  . TYR A 1 311 ? 29.683  5.977   26.403  1.00 14.17 ? ? ? ? ? ? 801 TYR A CZ  1 
+ATOM   2312 O OH  . TYR A 1 311 ? 30.767  5.161   26.257  1.00 14.68 ? ? ? ? ? ? 801 TYR A OH  1 
+ATOM   2313 N N   . THR A 1 312 ? 23.353  9.883   25.191  1.00 10.49 ? ? ? ? ? ? 802 THR A N   1 
+ATOM   2314 C CA  . THR A 1 312 ? 22.216  10.763  25.418  1.00 10.35 ? ? ? ? ? ? 802 THR A CA  1 
+ATOM   2315 C C   . THR A 1 312 ? 20.893  10.119  25.030  1.00 9.86  ? ? ? ? ? ? 802 THR A C   1 
+ATOM   2316 O O   . THR A 1 312 ? 20.807  9.411   24.034  1.00 10.95 ? ? ? ? ? ? 802 THR A O   1 
+ATOM   2317 C CB  . THR A 1 312 ? 22.375  12.131  24.677  1.00 10.50 ? ? ? ? ? ? 802 THR A CB  1 
+ATOM   2318 O OG1 . THR A 1 312 ? 21.154  12.890  24.786  1.00 10.71 ? ? ? ? ? ? 802 THR A OG1 1 
+ATOM   2319 C CG2 . THR A 1 312 ? 22.761  11.926  23.190  1.00 9.80  ? ? ? ? ? ? 802 THR A CG2 1 
+ATOM   2320 N N   . TRP A 1 313 ? 19.864  10.380  25.828  1.00 9.97  ? ? ? ? ? ? 803 TRP A N   1 
+ATOM   2321 C CA  . TRP A 1 313 ? 18.526  9.865   25.574  1.00 11.28 ? ? ? ? ? ? 803 TRP A CA  1 
+ATOM   2322 C C   . TRP A 1 313 ? 17.800  10.641  24.460  1.00 10.83 ? ? ? ? ? ? 803 TRP A C   1 
+ATOM   2323 O O   . TRP A 1 313 ? 16.716  10.221  24.013  1.00 12.09 ? ? ? ? ? ? 803 TRP A O   1 
+ATOM   2324 C CB  . TRP A 1 313 ? 17.663  10.000  26.854  1.00 11.75 ? ? ? ? ? ? 803 TRP A CB  1 
+ATOM   2325 C CG  . TRP A 1 313 ? 17.221  11.450  27.176  1.00 12.56 ? ? ? ? ? ? 803 TRP A CG  1 
+ATOM   2326 C CD1 . TRP A 1 313 ? 18.033  12.565  27.259  1.00 12.22 ? ? ? ? ? ? 803 TRP A CD1 1 
+ATOM   2327 C CD2 . TRP A 1 313 ? 15.885  11.921  27.412  1.00 13.47 ? ? ? ? ? ? 803 TRP A CD2 1 
+ATOM   2328 N NE1 . TRP A 1 313 ? 17.281  13.678  27.513  1.00 12.19 ? ? ? ? ? ? 803 TRP A NE1 1 
+ATOM   2329 C CE2 . TRP A 1 313 ? 15.961  13.323  27.609  1.00 13.80 ? ? ? ? ? ? 803 TRP A CE2 1 
+ATOM   2330 C CE3 . TRP A 1 313 ? 14.627  11.294  27.468  1.00 15.15 ? ? ? ? ? ? 803 TRP A CE3 1 
+ATOM   2331 C CZ2 . TRP A 1 313 ? 14.817  14.122  27.856  1.00 14.95 ? ? ? ? ? ? 803 TRP A CZ2 1 
+ATOM   2332 C CZ3 . TRP A 1 313 ? 13.491  12.080  27.715  1.00 16.35 ? ? ? ? ? ? 803 TRP A CZ3 1 
+ATOM   2333 C CH2 . TRP A 1 313 ? 13.599  13.490  27.905  1.00 16.48 ? ? ? ? ? ? 803 TRP A CH2 1 
+ATOM   2334 N N   . ILE A 1 314 ? 18.366  11.771  24.033  1.00 9.90  ? ? ? ? ? ? 804 ILE A N   1 
+ATOM   2335 C CA  . ILE A 1 314 ? 17.674  12.633  23.065  1.00 11.91 ? ? ? ? ? ? 804 ILE A CA  1 
+ATOM   2336 C C   . ILE A 1 314 ? 17.155  12.015  21.760  1.00 12.44 ? ? ? ? ? ? 804 ILE A C   1 
+ATOM   2337 O O   . ILE A 1 314 ? 15.965  12.137  21.465  1.00 13.19 ? ? ? ? ? ? 804 ILE A O   1 
+ATOM   2338 C CB  . ILE A 1 314 ? 18.445  13.979  22.817  1.00 11.48 ? ? ? ? ? ? 804 ILE A CB  1 
+ATOM   2339 C CG1 . ILE A 1 314 ? 18.355  14.855  24.073  1.00 10.60 ? ? ? ? ? ? 804 ILE A CG1 1 
+ATOM   2340 C CG2 . ILE A 1 314 ? 17.871  14.726  21.603  1.00 12.27 ? ? ? ? ? ? 804 ILE A CG2 1 
+ATOM   2341 C CD1 . ILE A 1 314 ? 16.946  15.332  24.401  1.00 11.47 ? ? ? ? ? ? 804 ILE A CD1 1 
+ATOM   2342 N N   . PRO A 1 315 ? 18.017  11.307  21.007  1.00 14.23 ? ? ? ? ? ? 805 PRO A N   1 
+ATOM   2343 C CA  . PRO A 1 315 ? 17.589  10.685  19.740  1.00 16.11 ? ? ? ? ? ? 805 PRO A CA  1 
+ATOM   2344 C C   . PRO A 1 315 ? 16.423  9.699   19.855  1.00 17.14 ? ? ? ? ? ? 805 PRO A C   1 
+ATOM   2345 O O   . PRO A 1 315 ? 15.598  9.584   18.948  1.00 18.92 ? ? ? ? ? ? 805 PRO A O   1 
+ATOM   2346 C CB  . PRO A 1 315 ? 18.863  9.991   19.260  1.00 16.16 ? ? ? ? ? ? 805 PRO A CB  1 
+ATOM   2347 C CG  . PRO A 1 315 ? 19.966  10.905  19.769  1.00 15.92 ? ? ? ? ? ? 805 PRO A CG  1 
+ATOM   2348 C CD  . PRO A 1 315 ? 19.480  11.182  21.185  1.00 14.19 ? ? ? ? ? ? 805 PRO A CD  1 
+ATOM   2349 N N   . GLY A 1 316 ? 16.338  9.007   20.979  1.00 18.02 ? ? ? ? ? ? 806 GLY A N   1 
+ATOM   2350 C CA  . GLY A 1 316 ? 15.274  8.040   21.177  1.00 19.00 ? ? ? ? ? ? 806 GLY A CA  1 
+ATOM   2351 C C   . GLY A 1 316 ? 13.931  8.660   21.504  1.00 20.58 ? ? ? ? ? ? 806 GLY A C   1 
+ATOM   2352 O O   . GLY A 1 316 ? 12.874  8.053   21.292  1.00 22.29 ? ? ? ? ? ? 806 GLY A O   1 
+ATOM   2353 N N   . THR A 1 317 ? 13.945  9.857   22.063  1.00 19.90 ? ? ? ? ? ? 807 THR A N   1 
+ATOM   2354 C CA  . THR A 1 317 ? 12.688  10.477  22.408  1.00 20.86 ? ? ? ? ? ? 807 THR A CA  1 
+ATOM   2355 C C   . THR A 1 317 ? 12.282  11.526  21.391  1.00 20.03 ? ? ? ? ? ? 807 THR A C   1 
+ATOM   2356 O O   . THR A 1 317 ? 11.091  11.746  21.139  1.00 20.37 ? ? ? ? ? ? 807 THR A O   1 
+ATOM   2357 C CB  . THR A 1 317 ? 12.754  11.060  23.818  1.00 23.13 ? ? ? ? ? ? 807 THR A CB  1 
+ATOM   2358 O OG1 . THR A 1 317 ? 12.976  9.990   24.753  1.00 26.29 ? ? ? ? ? ? 807 THR A OG1 1 
+ATOM   2359 C CG2 . THR A 1 317 ? 11.468  11.776  24.170  1.00 24.19 ? ? ? ? ? ? 807 THR A CG2 1 
+ATOM   2360 N N   . PHE A 1 318 ? 13.271  12.167  20.790  1.00 18.29 ? ? ? ? ? ? 808 PHE A N   1 
+ATOM   2361 C CA  . PHE A 1 318 ? 12.987  13.170  19.789  1.00 17.71 ? ? ? ? ? ? 808 PHE A CA  1 
+ATOM   2362 C C   . PHE A 1 318 ? 13.743  12.731  18.536  1.00 17.75 ? ? ? ? ? ? 808 PHE A C   1 
+ATOM   2363 O O   . PHE A 1 318 ? 14.864  13.194  18.294  1.00 17.78 ? ? ? ? ? ? 808 PHE A O   1 
+ATOM   2364 C CB  . PHE A 1 318 ? 13.477  14.550  20.263  1.00 17.58 ? ? ? ? ? ? 808 PHE A CB  1 
+ATOM   2365 C CG  . PHE A 1 318 ? 12.984  14.937  21.621  1.00 18.68 ? ? ? ? ? ? 808 PHE A CG  1 
+ATOM   2366 C CD1 . PHE A 1 318 ? 11.747  15.558  21.781  1.00 19.72 ? ? ? ? ? ? 808 PHE A CD1 1 
+ATOM   2367 C CD2 . PHE A 1 318 ? 13.738  14.651  22.756  1.00 19.53 ? ? ? ? ? ? 808 PHE A CD2 1 
+ATOM   2368 C CE1 . PHE A 1 318 ? 11.253  15.894  23.075  1.00 19.96 ? ? ? ? ? ? 808 PHE A CE1 1 
+ATOM   2369 C CE2 . PHE A 1 318 ? 13.255  14.981  24.061  1.00 21.13 ? ? ? ? ? ? 808 PHE A CE2 1 
+ATOM   2370 C CZ  . PHE A 1 318 ? 12.011  15.602  24.215  1.00 20.56 ? ? ? ? ? ? 808 PHE A CZ  1 
+ATOM   2371 N N   . PRO A 1 319 ? 13.202  11.756  17.776  1.00 18.08 ? ? ? ? ? ? 809 PRO A N   1 
+ATOM   2372 C CA  . PRO A 1 319 ? 13.927  11.336  16.566  1.00 19.03 ? ? ? ? ? ? 809 PRO A CA  1 
+ATOM   2373 C C   . PRO A 1 319 ? 14.093  12.542  15.617  1.00 19.40 ? ? ? ? ? ? 809 PRO A C   1 
+ATOM   2374 O O   . PRO A 1 319 ? 13.196  13.393  15.484  1.00 20.53 ? ? ? ? ? ? 809 PRO A O   1 
+ATOM   2375 C CB  . PRO A 1 319 ? 13.060  10.199  15.993  1.00 19.57 ? ? ? ? ? ? 809 PRO A CB  1 
+ATOM   2376 C CG  . PRO A 1 319 ? 11.709  10.448  16.576  1.00 19.39 ? ? ? ? ? ? 809 PRO A CG  1 
+ATOM   2377 C CD  . PRO A 1 319 ? 11.986  10.954  17.974  1.00 18.78 ? ? ? ? ? ? 809 PRO A CD  1 
+ATOM   2378 N N   . GLY A 1 320 ? 15.277  12.654  15.037  1.00 18.26 ? ? ? ? ? ? 810 GLY A N   1 
+ATOM   2379 C CA  . GLY A 1 320 ? 15.567  13.793  14.189  1.00 18.03 ? ? ? ? ? ? 810 GLY A CA  1 
+ATOM   2380 C C   . GLY A 1 320 ? 16.421  14.849  14.905  1.00 18.33 ? ? ? ? ? ? 810 GLY A C   1 
+ATOM   2381 O O   . GLY A 1 320 ? 16.886  15.780  14.250  1.00 19.07 ? ? ? ? ? ? 810 GLY A O   1 
+ATOM   2382 N N   . TYR A 1 321 ? 16.627  14.725  16.227  1.00 16.62 ? ? ? ? ? ? 811 TYR A N   1 
+ATOM   2383 C CA  . TYR A 1 321 ? 17.431  15.667  17.029  1.00 15.26 ? ? ? ? ? ? 811 TYR A CA  1 
+ATOM   2384 C C   . TYR A 1 321 ? 18.615  14.952  17.647  1.00 14.35 ? ? ? ? ? ? 811 TYR A C   1 
+ATOM   2385 O O   . TYR A 1 321 ? 18.583  13.744  17.807  1.00 14.62 ? ? ? ? ? ? 811 TYR A O   1 
+ATOM   2386 C CB  . TYR A 1 321 ? 16.583  16.278  18.147  1.00 15.39 ? ? ? ? ? ? 811 TYR A CB  1 
+ATOM   2387 C CG  . TYR A 1 321 ? 15.597  17.277  17.633  1.00 17.20 ? ? ? ? ? ? 811 TYR A CG  1 
+ATOM   2388 C CD1 . TYR A 1 321 ? 14.356  16.874  17.133  1.00 18.54 ? ? ? ? ? ? 811 TYR A CD1 1 
+ATOM   2389 C CD2 . TYR A 1 321 ? 15.917  18.630  17.602  1.00 17.75 ? ? ? ? ? ? 811 TYR A CD2 1 
+ATOM   2390 C CE1 . TYR A 1 321 ? 13.457  17.810  16.609  1.00 20.31 ? ? ? ? ? ? 811 TYR A CE1 1 
+ATOM   2391 C CE2 . TYR A 1 321 ? 15.046  19.561  17.095  1.00 19.62 ? ? ? ? ? ? 811 TYR A CE2 1 
+ATOM   2392 C CZ  . TYR A 1 321 ? 13.820  19.153  16.600  1.00 21.15 ? ? ? ? ? ? 811 TYR A CZ  1 
+ATOM   2393 O OH  . TYR A 1 321 ? 12.973  20.113  16.105  1.00 24.01 ? ? ? ? ? ? 811 TYR A OH  1 
+ATOM   2394 N N   . GLY A 1 322 ? 19.651  15.700  18.024  1.00 13.61 ? ? ? ? ? ? 812 GLY A N   1 
+ATOM   2395 C CA  . GLY A 1 322 ? 20.821  15.091  18.628  1.00 12.10 ? ? ? ? ? ? 812 GLY A CA  1 
+ATOM   2396 C C   . GLY A 1 322 ? 21.836  16.126  19.066  1.00 10.88 ? ? ? ? ? ? 812 GLY A C   1 
+ATOM   2397 O O   . GLY A 1 322 ? 21.477  17.297  19.255  1.00 11.82 ? ? ? ? ? ? 812 GLY A O   1 
+ATOM   2398 N N   . ASN A 1 323 ? 23.074  15.673  19.287  1.00 11.36 ? ? ? ? ? ? 813 ASN A N   1 
+ATOM   2399 C CA  . ASN A 1 323 ? 24.233  16.506  19.700  1.00 12.67 ? ? ? ? ? ? 813 ASN A CA  1 
+ATOM   2400 C C   . ASN A 1 323 ? 23.823  17.600  20.705  1.00 11.40 ? ? ? ? ? ? 813 ASN A C   1 
+ATOM   2401 O O   . ASN A 1 323 ? 24.161  18.779  20.534  1.00 10.15 ? ? ? ? ? ? 813 ASN A O   1 
+ATOM   2402 C CB  . ASN A 1 323 ? 24.856  17.148  18.437  1.00 15.20 ? ? ? ? ? ? 813 ASN A CB  1 
+ATOM   2403 C CG  . ASN A 1 323 ? 25.318  16.101  17.399  1.00 18.69 ? ? ? ? ? ? 813 ASN A CG  1 
+ATOM   2404 O OD1 . ASN A 1 323 ? 24.891  16.132  16.232  1.00 22.50 ? ? ? ? ? ? 813 ASN A OD1 1 
+ATOM   2405 N ND2 . ASN A 1 323 ? 26.166  15.165  17.824  1.00 19.74 ? ? ? ? ? ? 813 ASN A ND2 1 
+ATOM   2406 N N   . PRO A 1 324 ? 23.275  17.182  21.863  1.00 9.84  ? ? ? ? ? ? 814 PRO A N   1 
+ATOM   2407 C CA  . PRO A 1 324 ? 22.803  18.139  22.861  1.00 9.16  ? ? ? ? ? ? 814 PRO A CA  1 
+ATOM   2408 C C   . PRO A 1 324 ? 23.707  18.607  23.971  1.00 7.36  ? ? ? ? ? ? 814 PRO A C   1 
+ATOM   2409 O O   . PRO A 1 324 ? 23.285  19.485  24.727  1.00 8.08  ? ? ? ? ? ? 814 PRO A O   1 
+ATOM   2410 C CB  . PRO A 1 324 ? 21.614  17.368  23.516  1.00 8.69  ? ? ? ? ? ? 814 PRO A CB  1 
+ATOM   2411 C CG  . PRO A 1 324 ? 21.648  15.943  22.916  1.00 9.66  ? ? ? ? ? ? 814 PRO A CG  1 
+ATOM   2412 C CD  . PRO A 1 324 ? 23.039  15.809  22.346  1.00 10.13 ? ? ? ? ? ? 814 PRO A CD  1 
+ATOM   2413 N N   . LEU A 1 325 ? 24.928  18.080  24.020  1.00 8.09  ? ? ? ? ? ? 815 LEU A N   1 
+ATOM   2414 C CA  . LEU A 1 325 ? 25.825  18.289  25.163  1.00 9.26  ? ? ? ? ? ? 815 LEU A CA  1 
+ATOM   2415 C C   . LEU A 1 325 ? 27.119  19.089  24.945  1.00 9.98  ? ? ? ? ? ? 815 LEU A C   1 
+ATOM   2416 O O   . LEU A 1 325 ? 27.347  19.571  23.857  1.00 10.44 ? ? ? ? ? ? 815 LEU A O   1 
+ATOM   2417 C CB  . LEU A 1 325 ? 26.051  16.923  25.847  1.00 8.58  ? ? ? ? ? ? 815 LEU A CB  1 
+ATOM   2418 C CG  . LEU A 1 325 ? 24.724  16.170  26.141  1.00 9.21  ? ? ? ? ? ? 815 LEU A CG  1 
+ATOM   2419 C CD1 . LEU A 1 325 ? 24.955  14.714  26.526  1.00 9.54  ? ? ? ? ? ? 815 LEU A CD1 1 
+ATOM   2420 C CD2 . LEU A 1 325 ? 23.891  16.923  27.190  1.00 10.37 ? ? ? ? ? ? 815 LEU A CD2 1 
+ATOM   2421 N N   . ILE A 1 326 ? 27.980  19.197  25.955  1.00 9.94  ? ? ? ? ? ? 816 ILE A N   1 
+ATOM   2422 C CA  . ILE A 1 326 ? 29.161  20.059  25.845  1.00 10.42 ? ? ? ? ? ? 816 ILE A CA  1 
+ATOM   2423 C C   . ILE A 1 326 ? 30.452  19.489  25.311  1.00 11.62 ? ? ? ? ? ? 816 ILE A C   1 
+ATOM   2424 O O   . ILE A 1 326 ? 31.414  20.262  25.072  1.00 12.59 ? ? ? ? ? ? 816 ILE A O   1 
+ATOM   2425 C CB  . ILE A 1 326 ? 29.409  20.894  27.130  1.00 10.43 ? ? ? ? ? ? 816 ILE A CB  1 
+ATOM   2426 C CG1 . ILE A 1 326 ? 29.907  20.004  28.273  1.00 10.94 ? ? ? ? ? ? 816 ILE A CG1 1 
+ATOM   2427 C CG2 . ILE A 1 326 ? 28.127  21.700  27.517  1.00 10.20 ? ? ? ? ? ? 816 ILE A CG2 1 
+ATOM   2428 C CD1 . ILE A 1 326 ? 30.164  20.813  29.562  1.00 12.17 ? ? ? ? ? ? 816 ILE A CD1 1 
+ATOM   2429 N N   . TYR A 1 327 ? 30.515  18.160  25.194  1.00 10.91 ? ? ? ? ? ? 817 TYR A N   1 
+ATOM   2430 C CA  . TYR A 1 327 ? 31.657  17.467  24.584  1.00 11.73 ? ? ? ? ? ? 817 TYR A CA  1 
+ATOM   2431 C C   . TYR A 1 327 ? 31.057  16.658  23.438  1.00 13.04 ? ? ? ? ? ? 817 TYR A C   1 
+ATOM   2432 O O   . TYR A 1 327 ? 29.930  16.125  23.546  1.00 11.41 ? ? ? ? ? ? 817 TYR A O   1 
+ATOM   2433 C CB  . TYR A 1 327 ? 32.340  16.456  25.519  1.00 11.17 ? ? ? ? ? ? 817 TYR A CB  1 
+ATOM   2434 C CG  . TYR A 1 327 ? 33.184  17.068  26.592  1.00 11.22 ? ? ? ? ? ? 817 TYR A CG  1 
+ATOM   2435 C CD1 . TYR A 1 327 ? 32.616  17.477  27.793  1.00 10.70 ? ? ? ? ? ? 817 TYR A CD1 1 
+ATOM   2436 C CD2 . TYR A 1 327 ? 34.559  17.207  26.429  1.00 12.19 ? ? ? ? ? ? 817 TYR A CD2 1 
+ATOM   2437 C CE1 . TYR A 1 327 ? 33.380  17.999  28.807  1.00 12.01 ? ? ? ? ? ? 817 TYR A CE1 1 
+ATOM   2438 C CE2 . TYR A 1 327 ? 35.349  17.737  27.451  1.00 12.70 ? ? ? ? ? ? 817 TYR A CE2 1 
+ATOM   2439 C CZ  . TYR A 1 327 ? 34.741  18.127  28.644  1.00 13.25 ? ? ? ? ? ? 817 TYR A CZ  1 
+ATOM   2440 O OH  . TYR A 1 327 ? 35.498  18.620  29.690  1.00 15.87 ? ? ? ? ? ? 817 TYR A OH  1 
+ATOM   2441 N N   . ASP A 1 328 ? 31.819  16.542  22.349  1.00 13.44 ? ? ? ? ? ? 818 ASP A N   1 
+ATOM   2442 C CA  . ASP A 1 328 ? 31.338  15.771  21.236  1.00 14.99 ? ? ? ? ? ? 818 ASP A CA  1 
+ATOM   2443 C C   . ASP A 1 328 ? 31.576  14.300  21.542  1.00 15.86 ? ? ? ? ? ? 818 ASP A C   1 
+ATOM   2444 O O   . ASP A 1 328 ? 32.012  13.962  22.647  1.00 14.85 ? ? ? ? ? ? 818 ASP A O   1 
+ATOM   2445 C CB  . ASP A 1 328 ? 31.922  16.260  19.887  1.00 16.12 ? ? ? ? ? ? 818 ASP A CB  1 
+ATOM   2446 C CG  . ASP A 1 328 ? 33.417  15.981  19.714  1.00 17.99 ? ? ? ? ? ? 818 ASP A CG  1 
+ATOM   2447 O OD1 . ASP A 1 328 ? 34.032  15.182  20.450  1.00 16.77 ? ? ? ? ? ? 818 ASP A OD1 1 
+ATOM   2448 O OD2 . ASP A 1 328 ? 33.993  16.585  18.780  1.00 19.79 ? ? ? ? ? ? 818 ASP A OD2 1 
+ATOM   2449 N N   . SER A 1 329 ? 31.243  13.431  20.589  1.00 17.08 ? ? ? ? ? ? 819 SER A N   1 
+ATOM   2450 C CA  . SER A 1 329 ? 31.396  11.984  20.748  1.00 19.29 ? ? ? ? ? ? 819 SER A CA  1 
+ATOM   2451 C C   . SER A 1 329 ? 32.800  11.488  20.891  1.00 20.46 ? ? ? ? ? ? 819 SER A C   1 
+ATOM   2452 O O   . SER A 1 329 ? 32.987  10.334  21.280  1.00 21.54 ? ? ? ? ? ? 819 SER A O   1 
+ATOM   2453 C CB  . SER A 1 329 ? 30.744  11.235  19.598  1.00 21.26 ? ? ? ? ? ? 819 SER A CB  1 
+ATOM   2454 O OG  . SER A 1 329 ? 29.363  11.525  19.575  1.00 25.86 ? ? ? ? ? ? 819 SER A OG  1 
+ATOM   2455 N N   . ASN A 1 330 ? 33.780  12.318  20.525  1.00 21.11 ? ? ? ? ? ? 820 ASN A N   1 
+ATOM   2456 C CA  . ASN A 1 330 ? 35.206  11.968  20.642  1.00 22.86 ? ? ? ? ? ? 820 ASN A CA  1 
+ATOM   2457 C C   . ASN A 1 330 ? 35.869  12.641  21.825  1.00 21.96 ? ? ? ? ? ? 820 ASN A C   1 
+ATOM   2458 O O   . ASN A 1 330 ? 37.100  12.669  21.934  1.00 22.33 ? ? ? ? ? ? 820 ASN A O   1 
+ATOM   2459 C CB  . ASN A 1 330 ? 35.972  12.374  19.384  1.00 26.07 ? ? ? ? ? ? 820 ASN A CB  1 
+ATOM   2460 C CG  . ASN A 1 330 ? 35.385  11.767  18.155  1.00 29.63 ? ? ? ? ? ? 820 ASN A CG  1 
+ATOM   2461 O OD1 . ASN A 1 330 ? 34.908  12.482  17.258  1.00 32.36 ? ? ? ? ? ? 820 ASN A OD1 1 
+ATOM   2462 N ND2 . ASN A 1 330 ? 35.322  10.433  18.130  1.00 31.13 ? ? ? ? ? ? 820 ASN A ND2 1 
+ATOM   2463 N N   . TYR A 1 331 ? 35.041  13.214  22.694  1.00 19.84 ? ? ? ? ? ? 821 TYR A N   1 
+ATOM   2464 C CA  . TYR A 1 331 ? 35.495  13.919  23.881  1.00 18.97 ? ? ? ? ? ? 821 TYR A CA  1 
+ATOM   2465 C C   . TYR A 1 331 ? 36.243  15.233  23.622  1.00 18.33 ? ? ? ? ? ? 821 TYR A C   1 
+ATOM   2466 O O   . TYR A 1 331 ? 37.013  15.715  24.459  1.00 18.20 ? ? ? ? ? ? 821 TYR A O   1 
+ATOM   2467 C CB  . TYR A 1 331 ? 36.231  12.981  24.861  1.00 18.34 ? ? ? ? ? ? 821 TYR A CB  1 
+ATOM   2468 C CG  . TYR A 1 331 ? 35.330  11.886  25.421  1.00 17.65 ? ? ? ? ? ? 821 TYR A CG  1 
+ATOM   2469 C CD1 . TYR A 1 331 ? 34.399  12.168  26.423  1.00 16.97 ? ? ? ? ? ? 821 TYR A CD1 1 
+ATOM   2470 C CD2 . TYR A 1 331 ? 35.387  10.578  24.920  1.00 17.21 ? ? ? ? ? ? 821 TYR A CD2 1 
+ATOM   2471 C CE1 . TYR A 1 331 ? 33.546  11.174  26.919  1.00 16.81 ? ? ? ? ? ? 821 TYR A CE1 1 
+ATOM   2472 C CE2 . TYR A 1 331 ? 34.537  9.579   25.406  1.00 17.65 ? ? ? ? ? ? 821 TYR A CE2 1 
+ATOM   2473 C CZ  . TYR A 1 331 ? 33.619  9.891   26.414  1.00 17.12 ? ? ? ? ? ? 821 TYR A CZ  1 
+ATOM   2474 O OH  . TYR A 1 331 ? 32.809  8.913   26.946  1.00 15.77 ? ? ? ? ? ? 821 TYR A OH  1 
+ATOM   2475 N N   . ASN A 1 332 ? 35.971  15.840  22.473  1.00 18.49 ? ? ? ? ? ? 822 ASN A N   1 
+ATOM   2476 C CA  . ASN A 1 332 ? 36.562  17.139  22.189  1.00 18.20 ? ? ? ? ? ? 822 ASN A CA  1 
+ATOM   2477 C C   . ASN A 1 332 ? 35.553  18.103  22.727  1.00 16.51 ? ? ? ? ? ? 822 ASN A C   1 
+ATOM   2478 O O   . ASN A 1 332 ? 34.369  17.969  22.437  1.00 17.16 ? ? ? ? ? ? 822 ASN A O   1 
+ATOM   2479 C CB  . ASN A 1 332 ? 36.668  17.429  20.696  1.00 21.02 ? ? ? ? ? ? 822 ASN A CB  1 
+ATOM   2480 C CG  . ASN A 1 332 ? 37.546  16.452  19.969  1.00 23.10 ? ? ? ? ? ? 822 ASN A CG  1 
+ATOM   2481 O OD1 . ASN A 1 332 ? 38.703  16.259  20.326  1.00 25.21 ? ? ? ? ? ? 822 ASN A OD1 1 
+ATOM   2482 N ND2 . ASN A 1 332 ? 36.994  15.819  18.932  1.00 24.58 ? ? ? ? ? ? 822 ASN A ND2 1 
+ATOM   2483 N N   . PRO A 1 333 ? 35.995  19.099  23.496  1.00 16.71 ? ? ? ? ? ? 823 PRO A N   1 
+ATOM   2484 C CA  . PRO A 1 333 ? 35.042  20.082  24.040  1.00 16.17 ? ? ? ? ? ? 823 PRO A CA  1 
+ATOM   2485 C C   . PRO A 1 333 ? 34.444  20.875  22.865  1.00 15.63 ? ? ? ? ? ? 823 PRO A C   1 
+ATOM   2486 O O   . PRO A 1 333 ? 35.152  21.224  21.910  1.00 15.91 ? ? ? ? ? ? 823 PRO A O   1 
+ATOM   2487 C CB  . PRO A 1 333 ? 35.924  21.012  24.897  1.00 17.17 ? ? ? ? ? ? 823 PRO A CB  1 
+ATOM   2488 C CG  . PRO A 1 333 ? 37.258  20.275  25.053  1.00 17.76 ? ? ? ? ? ? 823 PRO A CG  1 
+ATOM   2489 C CD  . PRO A 1 333 ? 37.396  19.453  23.810  1.00 16.99 ? ? ? ? ? ? 823 PRO A CD  1 
+ATOM   2490 N N   . LYS A 1 334 ? 33.139  21.085  22.909  1.00 13.57 ? ? ? ? ? ? 824 LYS A N   1 
+ATOM   2491 C CA  . LYS A 1 334 ? 32.423  21.863  21.889  1.00 12.32 ? ? ? ? ? ? 824 LYS A CA  1 
+ATOM   2492 C C   . LYS A 1 334 ? 32.449  23.355  22.309  1.00 12.09 ? ? ? ? ? ? 824 LYS A C   1 
+ATOM   2493 O O   . LYS A 1 334 ? 32.884  23.693  23.427  1.00 12.30 ? ? ? ? ? ? 824 LYS A O   1 
+ATOM   2494 C CB  . LYS A 1 334 ? 30.979  21.342  21.770  1.00 11.52 ? ? ? ? ? ? 824 LYS A CB  1 
+ATOM   2495 C CG  . LYS A 1 334 ? 30.916  19.968  21.123  1.00 11.54 ? ? ? ? ? ? 824 LYS A CG  1 
+ATOM   2496 C CD  . LYS A 1 334 ? 29.569  19.254  21.306  1.00 11.61 ? ? ? ? ? ? 824 LYS A CD  1 
+ATOM   2497 C CE  . LYS A 1 334 ? 28.399  20.006  20.747  1.00 11.08 ? ? ? ? ? ? 824 LYS A CE  1 
+ATOM   2498 N NZ  . LYS A 1 334 ? 27.131  19.256  21.001  1.00 10.96 ? ? ? ? ? ? 824 LYS A NZ  1 
+ATOM   2499 N N   . PRO A 1 335 ? 31.969  24.270  21.444  1.00 11.81 ? ? ? ? ? ? 825 PRO A N   1 
+ATOM   2500 C CA  . PRO A 1 335 ? 31.984  25.692  21.821  1.00 11.31 ? ? ? ? ? ? 825 PRO A CA  1 
+ATOM   2501 C C   . PRO A 1 335 ? 31.261  25.964  23.155  1.00 10.16 ? ? ? ? ? ? 825 PRO A C   1 
+ATOM   2502 O O   . PRO A 1 335 ? 31.646  26.858  23.906  1.00 11.32 ? ? ? ? ? ? 825 PRO A O   1 
+ATOM   2503 C CB  . PRO A 1 335 ? 31.265  26.355  20.648  1.00 12.10 ? ? ? ? ? ? 825 PRO A CB  1 
+ATOM   2504 C CG  . PRO A 1 335 ? 31.716  25.493  19.463  1.00 12.71 ? ? ? ? ? ? 825 PRO A CG  1 
+ATOM   2505 C CD  . PRO A 1 335 ? 31.585  24.086  20.026  1.00 12.89 ? ? ? ? ? ? 825 PRO A CD  1 
+ATOM   2506 N N   . ALA A 1 336 ? 30.235  25.160  23.438  1.00 10.41 ? ? ? ? ? ? 826 ALA A N   1 
+ATOM   2507 C CA  . ALA A 1 336 ? 29.444  25.299  24.663  1.00 10.86 ? ? ? ? ? ? 826 ALA A CA  1 
+ATOM   2508 C C   . ALA A 1 336 ? 30.273  25.212  25.961  1.00 10.74 ? ? ? ? ? ? 826 ALA A C   1 
+ATOM   2509 O O   . ALA A 1 336 ? 30.002  25.940  26.927  1.00 11.82 ? ? ? ? ? ? 826 ALA A O   1 
+ATOM   2510 C CB  . ALA A 1 336 ? 28.311  24.265  24.656  1.00 11.12 ? ? ? ? ? ? 826 ALA A CB  1 
+ATOM   2511 N N   . TYR A 1 337 ? 31.287  24.357  25.968  1.00 10.86 ? ? ? ? ? ? 827 TYR A N   1 
+ATOM   2512 C CA  . TYR A 1 337 ? 32.144  24.207  27.139  1.00 12.08 ? ? ? ? ? ? 827 TYR A CA  1 
+ATOM   2513 C C   . TYR A 1 337 ? 32.858  25.519  27.469  1.00 12.40 ? ? ? ? ? ? 827 TYR A C   1 
+ATOM   2514 O O   . TYR A 1 337 ? 32.833  25.997  28.592  1.00 12.25 ? ? ? ? ? ? 827 TYR A O   1 
+ATOM   2515 C CB  . TYR A 1 337 ? 33.134  23.065  26.907  1.00 13.27 ? ? ? ? ? ? 827 TYR A CB  1 
+ATOM   2516 C CG  . TYR A 1 337 ? 34.136  22.880  28.009  1.00 14.69 ? ? ? ? ? ? 827 TYR A CG  1 
+ATOM   2517 C CD1 . TYR A 1 337 ? 35.315  23.617  28.011  1.00 14.93 ? ? ? ? ? ? 827 TYR A CD1 1 
+ATOM   2518 C CD2 . TYR A 1 337 ? 33.916  21.961  29.055  1.00 15.06 ? ? ? ? ? ? 827 TYR A CD2 1 
+ATOM   2519 C CE1 . TYR A 1 337 ? 36.276  23.464  29.019  1.00 16.48 ? ? ? ? ? ? 827 TYR A CE1 1 
+ATOM   2520 C CE2 . TYR A 1 337 ? 34.870  21.790  30.081  1.00 15.81 ? ? ? ? ? ? 827 TYR A CE2 1 
+ATOM   2521 C CZ  . TYR A 1 337 ? 36.060  22.556  30.059  1.00 16.30 ? ? ? ? ? ? 827 TYR A CZ  1 
+ATOM   2522 O OH  . TYR A 1 337 ? 37.025  22.471  31.056  1.00 16.23 ? ? ? ? ? ? 827 TYR A OH  1 
+ATOM   2523 N N   . ASN A 1 338 ? 33.457  26.145  26.470  1.00 13.95 ? ? ? ? ? ? 828 ASN A N   1 
+ATOM   2524 C CA  . ASN A 1 338 ? 34.135  27.419  26.727  1.00 15.71 ? ? ? ? ? ? 828 ASN A CA  1 
+ATOM   2525 C C   . ASN A 1 338 ? 33.162  28.523  27.054  1.00 13.12 ? ? ? ? ? ? 828 ASN A C   1 
+ATOM   2526 O O   . ASN A 1 338 ? 33.484  29.422  27.802  1.00 13.33 ? ? ? ? ? ? 828 ASN A O   1 
+ATOM   2527 C CB  . ASN A 1 338 ? 34.946  27.853  25.515  1.00 19.94 ? ? ? ? ? ? 828 ASN A CB  1 
+ATOM   2528 C CG  . ASN A 1 338 ? 36.112  26.926  25.242  1.00 24.62 ? ? ? ? ? ? 828 ASN A CG  1 
+ATOM   2529 O OD1 . ASN A 1 338 ? 36.814  26.484  26.176  1.00 26.55 ? ? ? ? ? ? 828 ASN A OD1 1 
+ATOM   2530 N ND2 . ASN A 1 338 ? 36.338  26.623  23.956  1.00 26.63 ? ? ? ? ? ? 828 ASN A ND2 1 
+ATOM   2531 N N   . ALA A 1 339 ? 31.987  28.482  26.436  1.00 12.35 ? ? ? ? ? ? 829 ALA A N   1 
+ATOM   2532 C CA  . ALA A 1 339 ? 30.975  29.497  26.676  1.00 12.74 ? ? ? ? ? ? 829 ALA A CA  1 
+ATOM   2533 C C   . ALA A 1 339 ? 30.515  29.486  28.143  1.00 12.84 ? ? ? ? ? ? 829 ALA A C   1 
+ATOM   2534 O O   . ALA A 1 339 ? 30.348  30.537  28.752  1.00 13.18 ? ? ? ? ? ? 829 ALA A O   1 
+ATOM   2535 C CB  . ALA A 1 339 ? 29.797  29.326  25.734  1.00 11.32 ? ? ? ? ? ? 829 ALA A CB  1 
+ATOM   2536 N N   . ILE A 1 340 ? 30.328  28.295  28.707  1.00 12.98 ? ? ? ? ? ? 830 ILE A N   1 
+ATOM   2537 C CA  . ILE A 1 340 ? 29.935  28.187  30.113  1.00 12.88 ? ? ? ? ? ? 830 ILE A CA  1 
+ATOM   2538 C C   . ILE A 1 340 ? 31.096  28.728  31.003  1.00 12.50 ? ? ? ? ? ? 830 ILE A C   1 
+ATOM   2539 O O   . ILE A 1 340 ? 30.866  29.487  31.954  1.00 11.19 ? ? ? ? ? ? 830 ILE A O   1 
+ATOM   2540 C CB  . ILE A 1 340 ? 29.587  26.694  30.459  1.00 12.33 ? ? ? ? ? ? 830 ILE A CB  1 
+ATOM   2541 C CG1 . ILE A 1 340 ? 28.313  26.272  29.725  1.00 12.18 ? ? ? ? ? ? 830 ILE A CG1 1 
+ATOM   2542 C CG2 . ILE A 1 340 ? 29.430  26.500  31.959  1.00 12.90 ? ? ? ? ? ? 830 ILE A CG2 1 
+ATOM   2543 C CD1 . ILE A 1 340 ? 27.983  24.836  29.935  1.00 12.56 ? ? ? ? ? ? 830 ILE A CD1 1 
+ATOM   2544 N N   . LYS A 1 341 ? 32.329  28.328  30.681  1.00 14.33 ? ? ? ? ? ? 831 LYS A N   1 
+ATOM   2545 C CA  . LYS A 1 341 ? 33.497  28.783  31.419  1.00 16.26 ? ? ? ? ? ? 831 LYS A CA  1 
+ATOM   2546 C C   . LYS A 1 341 ? 33.576  30.330  31.376  1.00 17.49 ? ? ? ? ? ? 831 LYS A C   1 
+ATOM   2547 O O   . LYS A 1 341 ? 33.779  30.972  32.416  1.00 18.07 ? ? ? ? ? ? 831 LYS A O   1 
+ATOM   2548 C CB  . LYS A 1 341 ? 34.765  28.111  30.886  1.00 17.18 ? ? ? ? ? ? 831 LYS A CB  1 
+ATOM   2549 C CG  . LYS A 1 341 ? 35.903  28.130  31.896  1.00 19.97 ? ? ? ? ? ? 831 LYS A CG  1 
+ATOM   2550 C CD  . LYS A 1 341 ? 37.109  27.261  31.499  1.00 20.31 ? ? ? ? ? ? 831 LYS A CD  1 
+ATOM   2551 C CE  . LYS A 1 341 ? 36.844  25.775  31.738  1.00 19.79 ? ? ? ? ? ? 831 LYS A CE  1 
+ATOM   2552 N NZ  . LYS A 1 341 ? 38.059  24.922  31.507  1.00 19.41 ? ? ? ? ? ? 831 LYS A NZ  1 
+ATOM   2553 N N   . GLU A 1 342 ? 33.303  30.938  30.222  1.00 17.44 ? ? ? ? ? ? 832 GLU A N   1 
+ATOM   2554 C CA  . GLU A 1 342 ? 33.295  32.405  30.127  1.00 18.98 ? ? ? ? ? ? 832 GLU A CA  1 
+ATOM   2555 C C   . GLU A 1 342 ? 32.231  33.087  30.986  1.00 17.60 ? ? ? ? ? ? 832 GLU A C   1 
+ATOM   2556 O O   . GLU A 1 342 ? 32.498  34.129  31.574  1.00 17.32 ? ? ? ? ? ? 832 GLU A O   1 
+ATOM   2557 C CB  . GLU A 1 342 ? 33.127  32.852  28.693  1.00 22.28 ? ? ? ? ? ? 832 GLU A CB  1 
+ATOM   2558 C CG  . GLU A 1 342 ? 34.407  32.709  27.894  1.00 27.15 ? ? ? ? ? ? 832 GLU A CG  1 
+ATOM   2559 C CD  . GLU A 1 342 ? 34.180  32.833  26.396  1.00 30.33 ? ? ? ? ? ? 832 GLU A CD  1 
+ATOM   2560 O OE1 . GLU A 1 342 ? 33.091  33.325  25.985  1.00 31.78 ? ? ? ? ? ? 832 GLU A OE1 1 
+ATOM   2561 O OE2 . GLU A 1 342 ? 35.075  32.397  25.624  1.00 32.82 ? ? ? ? ? ? 832 GLU A OE2 1 
+ATOM   2562 N N   . ALA A 1 343 ? 31.013  32.542  31.016  1.00 15.16 ? ? ? ? ? ? 833 ALA A N   1 
+ATOM   2563 C CA  . ALA A 1 343 ? 29.951  33.107  31.855  1.00 15.95 ? ? ? ? ? ? 833 ALA A CA  1 
+ATOM   2564 C C   . ALA A 1 343 ? 30.378  33.076  33.332  1.00 16.66 ? ? ? ? ? ? 833 ALA A C   1 
+ATOM   2565 O O   . ALA A 1 343 ? 30.089  34.016  34.063  1.00 17.35 ? ? ? ? ? ? 833 ALA A O   1 
+ATOM   2566 C CB  . ALA A 1 343 ? 28.649  32.343  31.684  1.00 14.48 ? ? ? ? ? ? 833 ALA A CB  1 
+ATOM   2567 N N   . LEU A 1 344 ? 31.038  31.990  33.754  1.00 17.48 ? ? ? ? ? ? 834 LEU A N   1 
+ATOM   2568 C CA  . LEU A 1 344 ? 31.506  31.815  35.139  1.00 18.98 ? ? ? ? ? ? 834 LEU A CA  1 
+ATOM   2569 C C   . LEU A 1 344 ? 32.620  32.783  35.520  1.00 22.12 ? ? ? ? ? ? 834 LEU A C   1 
+ATOM   2570 O O   . LEU A 1 344 ? 32.789  33.094  36.693  1.00 21.51 ? ? ? ? ? ? 834 LEU A O   1 
+ATOM   2571 C CB  . LEU A 1 344 ? 31.962  30.369  35.383  1.00 17.15 ? ? ? ? ? ? 834 LEU A CB  1 
+ATOM   2572 C CG  . LEU A 1 344 ? 30.825  29.329  35.442  1.00 16.47 ? ? ? ? ? ? 834 LEU A CG  1 
+ATOM   2573 C CD1 . LEU A 1 344 ? 31.362  27.896  35.381  1.00 14.97 ? ? ? ? ? ? 834 LEU A CD1 1 
+ATOM   2574 C CD2 . LEU A 1 344 ? 29.996  29.568  36.720  1.00 16.96 ? ? ? ? ? ? 834 LEU A CD2 1 
+ATOM   2575 N N   . MET A 1 345 ? 33.385  33.232  34.527  1.00 25.70 ? ? ? ? ? ? 835 MET A N   1 
+ATOM   2576 C CA  . MET A 1 345 ? 34.472  34.201  34.735  1.00 29.43 ? ? ? ? ? ? 835 MET A CA  1 
+ATOM   2577 C C   . MET A 1 345 ? 33.964  35.671  34.705  1.00 31.58 ? ? ? ? ? ? 835 MET A C   1 
+ATOM   2578 O O   . MET A 1 345 ? 34.552  36.495  35.446  1.00 33.91 ? ? ? ? ? ? 835 MET A O   1 
+ATOM   2579 C CB  . MET A 1 345 ? 35.604  34.002  33.705  1.00 30.09 ? ? ? ? ? ? 835 MET A CB  1 
+ATOM   2580 C CG  . MET A 1 345 ? 36.360  32.687  33.847  1.00 32.15 ? ? ? ? ? ? 835 MET A CG  1 
+ATOM   2581 S SD  . MET A 1 345 ? 37.580  32.273  32.506  1.00 36.39 ? ? ? ? ? ? 835 MET A SD  1 
+ATOM   2582 C CE  . MET A 1 345 ? 36.817  33.081  31.002  1.00 34.53 ? ? ? ? ? ? 835 MET A CE  1 
+ATOM   2583 N N   . ASN B 1 26  ? -17.198 33.606  80.565  1.00 24.19 ? ? ? ? ? ? 516 ASN B N   1 
+ATOM   2584 C CA  . ASN B 1 26  ? -16.794 32.177  80.713  1.00 23.59 ? ? ? ? ? ? 516 ASN B CA  1 
+ATOM   2585 C C   . ASN B 1 26  ? -15.613 31.709  79.850  1.00 21.65 ? ? ? ? ? ? 516 ASN B C   1 
+ATOM   2586 O O   . ASN B 1 26  ? -15.120 30.608  80.069  1.00 21.50 ? ? ? ? ? ? 516 ASN B O   1 
+ATOM   2587 C CB  . ASN B 1 26  ? -17.983 31.225  80.484  1.00 26.32 ? ? ? ? ? ? 516 ASN B CB  1 
+ATOM   2588 C CG  . ASN B 1 26  ? -19.046 31.318  81.581  1.00 28.84 ? ? ? ? ? ? 516 ASN B CG  1 
+ATOM   2589 O OD1 . ASN B 1 26  ? -18.869 32.032  82.589  1.00 30.47 ? ? ? ? ? ? 516 ASN B OD1 1 
+ATOM   2590 N ND2 . ASN B 1 26  ? -20.172 30.620  81.377  1.00 28.93 ? ? ? ? ? ? 516 ASN B ND2 1 
+ATOM   2591 N N   . ALA B 1 27  ? -15.194 32.482  78.843  1.00 18.62 ? ? ? ? ? ? 517 ALA B N   1 
+ATOM   2592 C CA  . ALA B 1 27  ? -14.041 32.076  78.017  1.00 17.01 ? ? ? ? ? ? 517 ALA B CA  1 
+ATOM   2593 C C   . ALA B 1 27  ? -12.742 32.290  78.814  1.00 16.34 ? ? ? ? ? ? 517 ALA B C   1 
+ATOM   2594 O O   . ALA B 1 27  ? -12.721 33.058  79.778  1.00 16.04 ? ? ? ? ? ? 517 ALA B O   1 
+ATOM   2595 C CB  . ALA B 1 27  ? -13.986 32.900  76.733  1.00 15.63 ? ? ? ? ? ? 517 ALA B CB  1 
+ATOM   2596 N N   . LEU B 1 28  ? -11.666 31.614  78.431  1.00 15.12 ? ? ? ? ? ? 518 LEU B N   1 
+ATOM   2597 C CA  . LEU B 1 28  ? -10.394 31.800  79.111  1.00 14.72 ? ? ? ? ? ? 518 LEU B CA  1 
+ATOM   2598 C C   . LEU B 1 28  ? -10.003 33.282  79.170  1.00 14.77 ? ? ? ? ? ? 518 LEU B C   1 
+ATOM   2599 O O   . LEU B 1 28  ? -9.486  33.756  80.210  1.00 14.43 ? ? ? ? ? ? 518 LEU B O   1 
+ATOM   2600 C CB  . LEU B 1 28  ? -9.284  31.034  78.384  1.00 15.61 ? ? ? ? ? ? 518 LEU B CB  1 
+ATOM   2601 C CG  . LEU B 1 28  ? -9.208  29.516  78.486  1.00 16.40 ? ? ? ? ? ? 518 LEU B CG  1 
+ATOM   2602 C CD1 . LEU B 1 28  ? -8.025  28.999  77.638  1.00 16.60 ? ? ? ? ? ? 518 LEU B CD1 1 
+ATOM   2603 C CD2 . LEU B 1 28  ? -9.044  29.134  79.964  1.00 16.46 ? ? ? ? ? ? 518 LEU B CD2 1 
+ATOM   2604 N N   . ARG B 1 29  ? -10.239 34.020  78.070  1.00 14.30 ? ? ? ? ? ? 519 ARG B N   1 
+ATOM   2605 C CA  . ARG B 1 29  ? -9.887  35.444  78.016  1.00 15.23 ? ? ? ? ? ? 519 ARG B CA  1 
+ATOM   2606 C C   . ARG B 1 29  ? -10.591 36.325  79.069  1.00 15.90 ? ? ? ? ? ? 519 ARG B C   1 
+ATOM   2607 O O   . ARG B 1 29  ? -10.002 37.305  79.554  1.00 15.46 ? ? ? ? ? ? 519 ARG B O   1 
+ATOM   2608 C CB  . ARG B 1 29  ? -10.104 36.032  76.612  1.00 15.27 ? ? ? ? ? ? 519 ARG B CB  1 
+ATOM   2609 C CG  . ARG B 1 29  ? -11.539 36.053  76.163  1.00 16.66 ? ? ? ? ? ? 519 ARG B CG  1 
+ATOM   2610 C CD  . ARG B 1 29  ? -11.648 36.598  74.766  1.00 19.19 ? ? ? ? ? ? 519 ARG B CD  1 
+ATOM   2611 N NE  . ARG B 1 29  ? -11.233 37.996  74.670  1.00 22.45 ? ? ? ? ? ? 519 ARG B NE  1 
+ATOM   2612 C CZ  . ARG B 1 29  ? -11.153 38.675  73.516  1.00 24.43 ? ? ? ? ? ? 519 ARG B CZ  1 
+ATOM   2613 N NH1 . ARG B 1 29  ? -11.454 38.088  72.337  1.00 25.11 ? ? ? ? ? ? 519 ARG B NH1 1 
+ATOM   2614 N NH2 . ARG B 1 29  ? -10.786 39.940  73.549  1.00 24.68 ? ? ? ? ? ? 519 ARG B NH2 1 
+ATOM   2615 N N   . ASP B 1 30  ? -11.829 35.965  79.433  1.00 16.87 ? ? ? ? ? ? 520 ASP B N   1 
+ATOM   2616 C CA  . ASP B 1 30  ? -12.589 36.726  80.454  1.00 18.63 ? ? ? ? ? ? 520 ASP B CA  1 
+ATOM   2617 C C   . ASP B 1 30  ? -11.969 36.598  81.863  1.00 19.37 ? ? ? ? ? ? 520 ASP B C   1 
+ATOM   2618 O O   . ASP B 1 30  ? -11.858 37.585  82.602  1.00 20.45 ? ? ? ? ? ? 520 ASP B O   1 
+ATOM   2619 C CB  . ASP B 1 30  ? -14.049 36.289  80.461  1.00 19.16 ? ? ? ? ? ? 520 ASP B CB  1 
+ATOM   2620 C CG  . ASP B 1 30  ? -14.698 36.424  79.090  1.00 20.40 ? ? ? ? ? ? 520 ASP B CG  1 
+ATOM   2621 O OD1 . ASP B 1 30  ? -14.551 37.491  78.455  1.00 21.51 ? ? ? ? ? ? 520 ASP B OD1 1 
+ATOM   2622 O OD2 . ASP B 1 30  ? -15.334 35.456  78.629  1.00 21.42 ? ? ? ? ? ? 520 ASP B OD2 1 
+ATOM   2623 N N   . TYR B 1 31  ? -11.549 35.393  82.225  1.00 19.60 ? ? ? ? ? ? 521 TYR B N   1 
+ATOM   2624 C CA  . TYR B 1 31  ? -10.895 35.196  83.521  1.00 21.30 ? ? ? ? ? ? 521 TYR B CA  1 
+ATOM   2625 C C   . TYR B 1 31  ? -9.501  35.805  83.525  1.00 21.32 ? ? ? ? ? ? 521 TYR B C   1 
+ATOM   2626 O O   . TYR B 1 31  ? -9.049  36.322  84.544  1.00 21.83 ? ? ? ? ? ? 521 TYR B O   1 
+ATOM   2627 C CB  . TYR B 1 31  ? -10.787 33.715  83.852  1.00 23.03 ? ? ? ? ? ? 521 TYR B CB  1 
+ATOM   2628 C CG  . TYR B 1 31  ? -12.125 33.102  84.122  1.00 26.74 ? ? ? ? ? ? 521 TYR B CG  1 
+ATOM   2629 C CD1 . TYR B 1 31  ? -12.868 33.476  85.259  1.00 28.38 ? ? ? ? ? ? 521 TYR B CD1 1 
+ATOM   2630 C CD2 . TYR B 1 31  ? -12.684 32.180  83.234  1.00 28.39 ? ? ? ? ? ? 521 TYR B CD2 1 
+ATOM   2631 C CE1 . TYR B 1 31  ? -14.142 32.948  85.499  1.00 29.52 ? ? ? ? ? ? 521 TYR B CE1 1 
+ATOM   2632 C CE2 . TYR B 1 31  ? -13.963 31.644  83.462  1.00 30.27 ? ? ? ? ? ? 521 TYR B CE2 1 
+ATOM   2633 C CZ  . TYR B 1 31  ? -14.682 32.038  84.596  1.00 30.65 ? ? ? ? ? ? 521 TYR B CZ  1 
+ATOM   2634 O OH  . TYR B 1 31  ? -15.951 31.538  84.797  1.00 32.07 ? ? ? ? ? ? 521 TYR B OH  1 
+ATOM   2635 N N   . ALA B 1 32  ? -8.816  35.726  82.380  1.00 19.75 ? ? ? ? ? ? 522 ALA B N   1 
+ATOM   2636 C CA  . ALA B 1 32  ? -7.463  36.263  82.250  1.00 18.98 ? ? ? ? ? ? 522 ALA B CA  1 
+ATOM   2637 C C   . ALA B 1 32  ? -7.493  37.764  82.397  1.00 18.24 ? ? ? ? ? ? 522 ALA B C   1 
+ATOM   2638 O O   . ALA B 1 32  ? -6.710  38.344  83.129  1.00 17.99 ? ? ? ? ? ? 522 ALA B O   1 
+ATOM   2639 C CB  . ALA B 1 32  ? -6.854  35.863  80.863  1.00 18.58 ? ? ? ? ? ? 522 ALA B CB  1 
+ATOM   2640 N N   . GLU B 1 33  ? -8.431  38.389  81.714  1.00 19.66 ? ? ? ? ? ? 523 GLU B N   1 
+ATOM   2641 C CA  . GLU B 1 33  ? -8.574  39.833  81.773  1.00 23.96 ? ? ? ? ? ? 523 GLU B CA  1 
+ATOM   2642 C C   . GLU B 1 33  ? -8.827  40.320  83.202  1.00 23.53 ? ? ? ? ? ? 523 GLU B C   1 
+ATOM   2643 O O   . GLU B 1 33  ? -8.287  41.351  83.625  1.00 22.86 ? ? ? ? ? ? 523 GLU B O   1 
+ATOM   2644 C CB  . GLU B 1 33  ? -9.728  40.285  80.877  1.00 27.38 ? ? ? ? ? ? 523 GLU B CB  1 
+ATOM   2645 C CG  . GLU B 1 33  ? -9.706  41.770  80.603  1.00 32.86 ? ? ? ? ? ? 523 GLU B CG  1 
+ATOM   2646 C CD  . GLU B 1 33  ? -8.328  42.238  80.121  1.00 36.70 ? ? ? ? ? ? 523 GLU B CD  1 
+ATOM   2647 O OE1 . GLU B 1 33  ? -7.908  41.815  79.003  1.00 37.99 ? ? ? ? ? ? 523 GLU B OE1 1 
+ATOM   2648 O OE2 . GLU B 1 33  ? -7.656  43.004  80.872  1.00 38.64 ? ? ? ? ? ? 523 GLU B OE2 1 
+ATOM   2649 N N   . ALA B 1 34  ? -9.657  39.570  83.924  1.00 23.28 ? ? ? ? ? ? 524 ALA B N   1 
+ATOM   2650 C CA  . ALA B 1 34  ? -10.023 39.869  85.314  1.00 23.19 ? ? ? ? ? ? 524 ALA B CA  1 
+ATOM   2651 C C   . ALA B 1 34  ? -8.781  39.888  86.211  1.00 22.77 ? ? ? ? ? ? 524 ALA B C   1 
+ATOM   2652 O O   . ALA B 1 34  ? -8.730  40.622  87.216  1.00 23.22 ? ? ? ? ? ? 524 ALA B O   1 
+ATOM   2653 C CB  . ALA B 1 34  ? -11.038 38.818  85.825  1.00 22.59 ? ? ? ? ? ? 524 ALA B CB  1 
+ATOM   2654 N N   . ARG B 1 35  ? -7.770  39.115  85.823  1.00 21.90 ? ? ? ? ? ? 525 ARG B N   1 
+ATOM   2655 C CA  . ARG B 1 35  ? -6.529  39.022  86.590  1.00 21.65 ? ? ? ? ? ? 525 ARG B CA  1 
+ATOM   2656 C C   . ARG B 1 35  ? -5.394  39.897  86.033  1.00 21.56 ? ? ? ? ? ? 525 ARG B C   1 
+ATOM   2657 O O   . ARG B 1 35  ? -4.266  39.838  86.524  1.00 22.44 ? ? ? ? ? ? 525 ARG B O   1 
+ATOM   2658 C CB  . ARG B 1 35  ? -6.087  37.558  86.673  1.00 23.09 ? ? ? ? ? ? 525 ARG B CB  1 
+ATOM   2659 C CG  . ARG B 1 35  ? -7.188  36.569  87.116  1.00 25.12 ? ? ? ? ? ? 525 ARG B CG  1 
+ATOM   2660 C CD  . ARG B 1 35  ? -7.754  36.897  88.502  1.00 27.14 ? ? ? ? ? ? 525 ARG B CD  1 
+ATOM   2661 N NE  . ARG B 1 35  ? -6.700  36.901  89.516  1.00 29.34 ? ? ? ? ? ? 525 ARG B NE  1 
+ATOM   2662 C CZ  . ARG B 1 35  ? -6.201  35.814  90.111  1.00 30.54 ? ? ? ? ? ? 525 ARG B CZ  1 
+ATOM   2663 N NH1 . ARG B 1 35  ? -6.666  34.605  89.819  1.00 31.71 ? ? ? ? ? ? 525 ARG B NH1 1 
+ATOM   2664 N NH2 . ARG B 1 35  ? -5.158  35.922  90.932  1.00 31.22 ? ? ? ? ? ? 525 ARG B NH2 1 
+ATOM   2665 N N   . GLY B 1 36  ? -5.689  40.689  85.002  1.00 20.68 ? ? ? ? ? ? 526 GLY B N   1 
+ATOM   2666 C CA  . GLY B 1 36  ? -4.689  41.565  84.402  1.00 21.01 ? ? ? ? ? ? 526 GLY B CA  1 
+ATOM   2667 C C   . GLY B 1 36  ? -3.658  40.900  83.487  1.00 21.39 ? ? ? ? ? ? 526 GLY B C   1 
+ATOM   2668 O O   . GLY B 1 36  ? -2.560  41.417  83.260  1.00 20.72 ? ? ? ? ? ? 526 GLY B O   1 
+ATOM   2669 N N   . ILE B 1 37  ? -3.996  39.745  82.945  1.00 20.68 ? ? ? ? ? ? 527 ILE B N   1 
+ATOM   2670 C CA  . ILE B 1 37  ? -3.049  39.085  82.075  1.00 20.61 ? ? ? ? ? ? 527 ILE B CA  1 
+ATOM   2671 C C   . ILE B 1 37  ? -3.669  38.813  80.691  1.00 18.91 ? ? ? ? ? ? 527 ILE B C   1 
+ATOM   2672 O O   . ILE B 1 37  ? -4.906  38.825  80.535  1.00 18.67 ? ? ? ? ? ? 527 ILE B O   1 
+ATOM   2673 C CB  . ILE B 1 37  ? -2.482  37.761  82.717  1.00 23.03 ? ? ? ? ? ? 527 ILE B CB  1 
+ATOM   2674 C CG1 . ILE B 1 37  ? -3.555  36.686  82.784  1.00 23.34 ? ? ? ? ? ? 527 ILE B CG1 1 
+ATOM   2675 C CG2 . ILE B 1 37  ? -1.876  38.002  84.142  1.00 22.85 ? ? ? ? ? ? 527 ILE B CG2 1 
+ATOM   2676 C CD1 . ILE B 1 37  ? -3.003  35.329  82.359  1.00 24.94 ? ? ? ? ? ? 527 ILE B CD1 1 
+ATOM   2677 N N   . LYS B 1 38  ? -2.793  38.662  79.692  1.00 15.53 ? ? ? ? ? ? 528 LYS B N   1 
+ATOM   2678 C CA  . LYS B 1 38  ? -3.181  38.384  78.312  1.00 14.72 ? ? ? ? ? ? 528 LYS B CA  1 
+ATOM   2679 C C   . LYS B 1 38  ? -2.870  36.926  78.056  1.00 13.09 ? ? ? ? ? ? 528 LYS B C   1 
+ATOM   2680 O O   . LYS B 1 38  ? -1.785  36.449  78.397  1.00 14.18 ? ? ? ? ? ? 528 LYS B O   1 
+ATOM   2681 C CB  . LYS B 1 38  ? -2.378  39.266  77.328  1.00 15.94 ? ? ? ? ? ? 528 LYS B CB  1 
+ATOM   2682 C CG  . LYS B 1 38  ? -2.692  40.775  77.453  1.00 17.24 ? ? ? ? ? ? 528 LYS B CG  1 
+ATOM   2683 C CD  . LYS B 1 38  ? -4.198  41.041  77.218  1.00 18.91 ? ? ? ? ? ? 528 LYS B CD  1 
+ATOM   2684 C CE  . LYS B 1 38  ? -4.576  42.501  77.532  1.00 20.63 ? ? ? ? ? ? 528 LYS B CE  1 
+ATOM   2685 N NZ  . LYS B 1 38  ? -5.935  42.849  77.028  1.00 21.53 ? ? ? ? ? ? 528 LYS B NZ  1 
+ATOM   2686 N N   . ILE B 1 39  ? -3.824  36.213  77.474  1.00 11.29 ? ? ? ? ? ? 529 ILE B N   1 
+ATOM   2687 C CA  . ILE B 1 39  ? -3.649  34.804  77.182  1.00 11.08 ? ? ? ? ? ? 529 ILE B CA  1 
+ATOM   2688 C C   . ILE B 1 39  ? -3.780  34.648  75.656  1.00 10.68 ? ? ? ? ? ? 529 ILE B C   1 
+ATOM   2689 O O   . ILE B 1 39  ? -4.732  35.152  75.041  1.00 12.67 ? ? ? ? ? ? 529 ILE B O   1 
+ATOM   2690 C CB  . ILE B 1 39  ? -4.659  33.903  78.025  1.00 12.21 ? ? ? ? ? ? 529 ILE B CB  1 
+ATOM   2691 C CG1 . ILE B 1 39  ? -4.401  32.421  77.740  1.00 14.10 ? ? ? ? ? ? 529 ILE B CG1 1 
+ATOM   2692 C CG2 . ILE B 1 39  ? -6.112  34.294  77.795  1.00 12.98 ? ? ? ? ? ? 529 ILE B CG2 1 
+ATOM   2693 C CD1 . ILE B 1 39  ? -4.851  31.482  78.882  1.00 15.18 ? ? ? ? ? ? 529 ILE B CD1 1 
+ATOM   2694 N N   . GLY B 1 40  ? -2.813  33.995  75.034  1.00 10.16 ? ? ? ? ? ? 530 GLY B N   1 
+ATOM   2695 C CA  . GLY B 1 40  ? -2.864  33.888  73.590  1.00 9.94  ? ? ? ? ? ? 530 GLY B CA  1 
+ATOM   2696 C C   . GLY B 1 40  ? -2.346  32.606  72.996  1.00 9.84  ? ? ? ? ? ? 530 GLY B C   1 
+ATOM   2697 O O   . GLY B 1 40  ? -2.031  31.631  73.689  1.00 9.14  ? ? ? ? ? ? 530 GLY B O   1 
+ATOM   2698 N N   . THR B 1 41  ? -2.215  32.636  71.673  1.00 9.09  ? ? ? ? ? ? 531 THR B N   1 
+ATOM   2699 C CA  . THR B 1 41  ? -1.760  31.497  70.920  1.00 8.33  ? ? ? ? ? ? 531 THR B CA  1 
+ATOM   2700 C C   . THR B 1 41  ? -1.186  31.951  69.571  1.00 8.59  ? ? ? ? ? ? 531 THR B C   1 
+ATOM   2701 O O   . THR B 1 41  ? -1.491  33.040  69.103  1.00 9.34  ? ? ? ? ? ? 531 THR B O   1 
+ATOM   2702 C CB  . THR B 1 41  ? -2.964  30.567  70.613  1.00 8.75  ? ? ? ? ? ? 531 THR B CB  1 
+ATOM   2703 O OG1 . THR B 1 41  ? -2.529  29.436  69.850  1.00 9.28  ? ? ? ? ? ? 531 THR B OG1 1 
+ATOM   2704 C CG2 . THR B 1 41  ? -4.066  31.336  69.841  1.00 9.03  ? ? ? ? ? ? 531 THR B CG2 1 
+ATOM   2705 N N   . CYS B 1 42  ? -0.325  31.134  68.988  1.00 8.86  ? ? ? ? ? ? 532 CYS B N   1 
+ATOM   2706 C CA  . CYS B 1 42  ? 0.166   31.443  67.652  1.00 10.06 ? ? ? ? ? ? 532 CYS B CA  1 
+ATOM   2707 C C   . CYS B 1 42  ? -0.975  30.982  66.730  1.00 11.85 ? ? ? ? ? ? 532 CYS B C   1 
+ATOM   2708 O O   . CYS B 1 42  ? -1.819  30.115  67.117  1.00 11.33 ? ? ? ? ? ? 532 CYS B O   1 
+ATOM   2709 C CB  . CYS B 1 42  ? 1.455   30.694  67.321  1.00 12.87 ? ? ? ? ? ? 532 CYS B CB  1 
+ATOM   2710 S SG  . CYS B 1 42  ? 1.297   28.919  67.163  1.00 15.38 ? ? ? ? ? ? 532 CYS B SG  1 
+ATOM   2711 N N   . VAL B 1 43  ? -1.043  31.573  65.538  1.00 9.92  ? ? ? ? ? ? 533 VAL B N   1 
+ATOM   2712 C CA  . VAL B 1 43  ? -2.088  31.249  64.568  1.00 10.61 ? ? ? ? ? ? 533 VAL B CA  1 
+ATOM   2713 C C   . VAL B 1 43  ? -1.512  30.355  63.453  1.00 12.36 ? ? ? ? ? ? 533 VAL B C   1 
+ATOM   2714 O O   . VAL B 1 43  ? -0.493  30.678  62.822  1.00 13.27 ? ? ? ? ? ? 533 VAL B O   1 
+ATOM   2715 C CB  . VAL B 1 43  ? -2.756  32.551  64.048  1.00 11.29 ? ? ? ? ? ? 533 VAL B CB  1 
+ATOM   2716 C CG1 . VAL B 1 43  ? -3.845  32.259  62.989  1.00 11.55 ? ? ? ? ? ? 533 VAL B CG1 1 
+ATOM   2717 C CG2 . VAL B 1 43  ? -3.362  33.303  65.241  1.00 11.30 ? ? ? ? ? ? 533 VAL B CG2 1 
+ATOM   2718 N N   . ASN B 1 44  ? -2.112  29.172  63.339  1.00 12.50 ? ? ? ? ? ? 534 ASN B N   1 
+ATOM   2719 C CA  . ASN B 1 44  ? -1.720  28.125  62.391  1.00 13.59 ? ? ? ? ? ? 534 ASN B CA  1 
+ATOM   2720 C C   . ASN B 1 44  ? -2.298  28.406  60.978  1.00 13.85 ? ? ? ? ? ? 534 ASN B C   1 
+ATOM   2721 O O   . ASN B 1 44  ? -3.255  29.187  60.815  1.00 13.79 ? ? ? ? ? ? 534 ASN B O   1 
+ATOM   2722 C CB  . ASN B 1 44  ? -2.159  26.726  62.940  1.00 13.37 ? ? ? ? ? ? 534 ASN B CB  1 
+ATOM   2723 C CG  . ASN B 1 44  ? -1.602  26.434  64.371  1.00 14.66 ? ? ? ? ? ? 534 ASN B CG  1 
+ATOM   2724 O OD1 . ASN B 1 44  ? -0.390  26.258  64.542  1.00 16.83 ? ? ? ? ? ? 534 ASN B OD1 1 
+ATOM   2725 N ND2 . ASN B 1 44  ? -2.472  26.456  65.393  1.00 11.93 ? ? ? ? ? ? 534 ASN B ND2 1 
+ATOM   2726 N N   . TYR B 1 45  ? -1.774  27.704  59.976  1.00 14.14 ? ? ? ? ? ? 535 TYR B N   1 
+ATOM   2727 C CA  . TYR B 1 45  ? -2.199  27.914  58.586  1.00 13.82 ? ? ? ? ? ? 535 TYR B CA  1 
+ATOM   2728 C C   . TYR B 1 45  ? -3.694  27.910  58.232  1.00 14.13 ? ? ? ? ? ? 535 TYR B C   1 
+ATOM   2729 O O   . TYR B 1 45  ? -4.100  28.646  57.326  1.00 14.06 ? ? ? ? ? ? 535 TYR B O   1 
+ATOM   2730 C CB  . TYR B 1 45  ? -1.420  26.969  57.635  1.00 16.23 ? ? ? ? ? ? 535 TYR B CB  1 
+ATOM   2731 C CG  . TYR B 1 45  ? -1.819  25.487  57.670  1.00 17.27 ? ? ? ? ? ? 535 TYR B CG  1 
+ATOM   2732 C CD1 . TYR B 1 45  ? -2.972  25.039  57.003  1.00 18.80 ? ? ? ? ? ? 535 TYR B CD1 1 
+ATOM   2733 C CD2 . TYR B 1 45  ? -1.082  24.556  58.410  1.00 18.96 ? ? ? ? ? ? 535 TYR B CD2 1 
+ATOM   2734 C CE1 . TYR B 1 45  ? -3.394  23.699  57.079  1.00 20.20 ? ? ? ? ? ? 535 TYR B CE1 1 
+ATOM   2735 C CE2 . TYR B 1 45  ? -1.491  23.209  58.502  1.00 19.71 ? ? ? ? ? ? 535 TYR B CE2 1 
+ATOM   2736 C CZ  . TYR B 1 45  ? -2.651  22.789  57.838  1.00 21.42 ? ? ? ? ? ? 535 TYR B CZ  1 
+ATOM   2737 O OH  . TYR B 1 45  ? -3.104  21.473  57.953  1.00 23.97 ? ? ? ? ? ? 535 TYR B OH  1 
+ATOM   2738 N N   . PRO B 1 46  ? -4.545  27.103  58.933  1.00 14.36 ? ? ? ? ? ? 536 PRO B N   1 
+ATOM   2739 C CA  . PRO B 1 46  ? -5.977  27.096  58.575  1.00 14.60 ? ? ? ? ? ? 536 PRO B CA  1 
+ATOM   2740 C C   . PRO B 1 46  ? -6.645  28.458  58.615  1.00 15.24 ? ? ? ? ? ? 536 PRO B C   1 
+ATOM   2741 O O   . PRO B 1 46  ? -7.628  28.691  57.902  1.00 15.74 ? ? ? ? ? ? 536 PRO B O   1 
+ATOM   2742 C CB  . PRO B 1 46  ? -6.603  26.178  59.635  1.00 15.96 ? ? ? ? ? ? 536 PRO B CB  1 
+ATOM   2743 C CG  . PRO B 1 46  ? -5.504  25.297  60.026  1.00 16.03 ? ? ? ? ? ? 536 PRO B CG  1 
+ATOM   2744 C CD  . PRO B 1 46  ? -4.304  26.202  60.083  1.00 14.64 ? ? ? ? ? ? 536 PRO B CD  1 
+ATOM   2745 N N   . PHE B 1 47  ? -6.157  29.339  59.490  1.00 14.57 ? ? ? ? ? ? 537 PHE B N   1 
+ATOM   2746 C CA  . PHE B 1 47  ? -6.708  30.682  59.591  1.00 16.35 ? ? ? ? ? ? 537 PHE B CA  1 
+ATOM   2747 C C   . PHE B 1 47  ? -6.652  31.442  58.241  1.00 18.09 ? ? ? ? ? ? 537 PHE B C   1 
+ATOM   2748 O O   . PHE B 1 47  ? -7.584  32.148  57.880  1.00 18.37 ? ? ? ? ? ? 537 PHE B O   1 
+ATOM   2749 C CB  . PHE B 1 47  ? -5.937  31.500  60.630  1.00 15.99 ? ? ? ? ? ? 537 PHE B CB  1 
+ATOM   2750 C CG  . PHE B 1 47  ? -6.288  32.961  60.618  1.00 16.06 ? ? ? ? ? ? 537 PHE B CG  1 
+ATOM   2751 C CD1 . PHE B 1 47  ? -7.435  33.424  61.273  1.00 16.49 ? ? ? ? ? ? 537 PHE B CD1 1 
+ATOM   2752 C CD2 . PHE B 1 47  ? -5.508  33.870  59.906  1.00 16.14 ? ? ? ? ? ? 537 PHE B CD2 1 
+ATOM   2753 C CE1 . PHE B 1 47  ? -7.791  34.780  61.208  1.00 17.50 ? ? ? ? ? ? 537 PHE B CE1 1 
+ATOM   2754 C CE2 . PHE B 1 47  ? -5.856  35.229  59.834  1.00 16.02 ? ? ? ? ? ? 537 PHE B CE2 1 
+ATOM   2755 C CZ  . PHE B 1 47  ? -6.987  35.684  60.477  1.00 16.62 ? ? ? ? ? ? 537 PHE B CZ  1 
+ATOM   2756 N N   . TYR B 1 48  ? -5.528  31.313  57.540  1.00 20.47 ? ? ? ? ? ? 538 TYR B N   1 
+ATOM   2757 C CA  . TYR B 1 48  ? -5.301  31.997  56.267  1.00 22.81 ? ? ? ? ? ? 538 TYR B CA  1 
+ATOM   2758 C C   . TYR B 1 48  ? -6.036  31.464  55.042  1.00 26.14 ? ? ? ? ? ? 538 TYR B C   1 
+ATOM   2759 O O   . TYR B 1 48  ? -6.329  32.233  54.140  1.00 27.49 ? ? ? ? ? ? 538 TYR B O   1 
+ATOM   2760 C CB  . TYR B 1 48  ? -3.809  32.080  55.999  1.00 20.96 ? ? ? ? ? ? 538 TYR B CB  1 
+ATOM   2761 C CG  . TYR B 1 48  ? -3.090  32.832  57.083  1.00 20.46 ? ? ? ? ? ? 538 TYR B CG  1 
+ATOM   2762 C CD1 . TYR B 1 48  ? -3.161  34.236  57.154  1.00 20.07 ? ? ? ? ? ? 538 TYR B CD1 1 
+ATOM   2763 C CD2 . TYR B 1 48  ? -2.356  32.148  58.058  1.00 20.31 ? ? ? ? ? ? 538 TYR B CD2 1 
+ATOM   2764 C CE1 . TYR B 1 48  ? -2.514  34.932  58.173  1.00 20.01 ? ? ? ? ? ? 538 TYR B CE1 1 
+ATOM   2765 C CE2 . TYR B 1 48  ? -1.711  32.827  59.076  1.00 20.38 ? ? ? ? ? ? 538 TYR B CE2 1 
+ATOM   2766 C CZ  . TYR B 1 48  ? -1.793  34.228  59.126  1.00 21.06 ? ? ? ? ? ? 538 TYR B CZ  1 
+ATOM   2767 O OH  . TYR B 1 48  ? -1.145  34.912  60.129  1.00 23.04 ? ? ? ? ? ? 538 TYR B OH  1 
+ATOM   2768 N N   . ASN B 1 49  ? -6.263  30.159  54.950  1.00 29.19 ? ? ? ? ? ? 539 ASN B N   1 
+ATOM   2769 C CA  . ASN B 1 49  ? -7.000  29.658  53.792  1.00 33.11 ? ? ? ? ? ? 539 ASN B CA  1 
+ATOM   2770 C C   . ASN B 1 49  ? -8.424  29.182  54.100  1.00 33.40 ? ? ? ? ? ? 539 ASN B C   1 
+ATOM   2771 O O   . ASN B 1 49  ? -9.110  28.625  53.243  1.00 33.76 ? ? ? ? ? ? 539 ASN B O   1 
+ATOM   2772 C CB  . ASN B 1 49  ? -6.193  28.622  53.001  1.00 35.99 ? ? ? ? ? ? 539 ASN B CB  1 
+ATOM   2773 C CG  . ASN B 1 49  ? -5.560  27.571  53.873  1.00 38.65 ? ? ? ? ? ? 539 ASN B CG  1 
+ATOM   2774 O OD1 . ASN B 1 49  ? -4.461  27.086  53.566  1.00 40.04 ? ? ? ? ? ? 539 ASN B OD1 1 
+ATOM   2775 N ND2 . ASN B 1 49  ? -6.246  27.190  54.963  1.00 39.00 ? ? ? ? ? ? 539 ASN B ND2 1 
+ATOM   2776 N N   . ASN B 1 50  ? -8.877  29.489  55.311  1.00 34.01 ? ? ? ? ? ? 540 ASN B N   1 
+ATOM   2777 C CA  . ASN B 1 50  ? -10.213 29.149  55.808  1.00 34.78 ? ? ? ? ? ? 540 ASN B CA  1 
+ATOM   2778 C C   . ASN B 1 50  ? -10.744 27.728  55.539  1.00 32.59 ? ? ? ? ? ? 540 ASN B C   1 
+ATOM   2779 O O   . ASN B 1 50  ? -11.890 27.533  55.146  1.00 33.15 ? ? ? ? ? ? 540 ASN B O   1 
+ATOM   2780 C CB  . ASN B 1 50  ? -11.235 30.225  55.394  1.00 38.41 ? ? ? ? ? ? 540 ASN B CB  1 
+ATOM   2781 C CG  . ASN B 1 50  ? -11.623 31.146  56.570  1.00 41.06 ? ? ? ? ? ? 540 ASN B CG  1 
+ATOM   2782 O OD1 . ASN B 1 50  ? -10.752 31.716  57.248  1.00 42.46 ? ? ? ? ? ? 540 ASN B OD1 1 
+ATOM   2783 N ND2 . ASN B 1 50  ? -12.931 31.263  56.837  1.00 42.07 ? ? ? ? ? ? 540 ASN B ND2 1 
+ATOM   2784 N N   . SER B 1 51  ? -9.934  26.741  55.884  1.00 29.11 ? ? ? ? ? ? 541 SER B N   1 
+ATOM   2785 C CA  . SER B 1 51  ? -10.267 25.349  55.676  1.00 26.26 ? ? ? ? ? ? 541 SER B CA  1 
+ATOM   2786 C C   . SER B 1 51  ? -10.792 24.648  56.919  1.00 24.42 ? ? ? ? ? ? 541 SER B C   1 
+ATOM   2787 O O   . SER B 1 51  ? -11.088 23.460  56.847  1.00 24.37 ? ? ? ? ? ? 541 SER B O   1 
+ATOM   2788 C CB  . SER B 1 51  ? -9.014  24.603  55.202  1.00 27.33 ? ? ? ? ? ? 541 SER B CB  1 
+ATOM   2789 O OG  . SER B 1 51  ? -7.904  24.819  56.084  1.00 28.76 ? ? ? ? ? ? 541 SER B OG  1 
+ATOM   2790 N N   . ASP B 1 52  ? -10.835 25.346  58.058  1.00 21.69 ? ? ? ? ? ? 542 ASP B N   1 
+ATOM   2791 C CA  . ASP B 1 52  ? -11.289 24.745  59.322  1.00 20.28 ? ? ? ? ? ? 542 ASP B CA  1 
+ATOM   2792 C C   . ASP B 1 52  ? -12.075 25.780  60.126  1.00 20.58 ? ? ? ? ? ? 542 ASP B C   1 
+ATOM   2793 O O   . ASP B 1 52  ? -11.529 26.487  60.997  1.00 20.10 ? ? ? ? ? ? 542 ASP B O   1 
+ATOM   2794 C CB  . ASP B 1 52  ? -10.085 24.238  60.155  1.00 19.19 ? ? ? ? ? ? 542 ASP B CB  1 
+ATOM   2795 C CG  . ASP B 1 52  ? -10.507 23.354  61.336  1.00 18.81 ? ? ? ? ? ? 542 ASP B CG  1 
+ATOM   2796 O OD1 . ASP B 1 52  ? -11.668 23.468  61.800  1.00 18.76 ? ? ? ? ? ? 542 ASP B OD1 1 
+ATOM   2797 O OD2 . ASP B 1 52  ? -9.677  22.541  61.799  1.00 17.51 ? ? ? ? ? ? 542 ASP B OD2 1 
+ATOM   2798 N N   . PRO B 1 53  ? -13.384 25.858  59.870  1.00 20.18 ? ? ? ? ? ? 543 PRO B N   1 
+ATOM   2799 C CA  . PRO B 1 53  ? -14.262 26.806  60.559  1.00 18.95 ? ? ? ? ? ? 543 PRO B CA  1 
+ATOM   2800 C C   . PRO B 1 53  ? -14.278 26.650  62.078  1.00 17.86 ? ? ? ? ? ? 543 PRO B C   1 
+ATOM   2801 O O   . PRO B 1 53  ? -14.426 27.643  62.796  1.00 17.77 ? ? ? ? ? ? 543 PRO B O   1 
+ATOM   2802 C CB  . PRO B 1 53  ? -15.630 26.563  59.907  1.00 20.68 ? ? ? ? ? ? 543 PRO B CB  1 
+ATOM   2803 C CG  . PRO B 1 53  ? -15.549 25.141  59.423  1.00 22.15 ? ? ? ? ? ? 543 PRO B CG  1 
+ATOM   2804 C CD  . PRO B 1 53  ? -14.126 24.992  58.930  1.00 21.42 ? ? ? ? ? ? 543 PRO B CD  1 
+ATOM   2805 N N   . THR B 1 54  ? -14.085 25.435  62.579  1.00 16.90 ? ? ? ? ? ? 544 THR B N   1 
+ATOM   2806 C CA  . THR B 1 54  ? -14.080 25.233  64.027  1.00 16.81 ? ? ? ? ? ? 544 THR B CA  1 
+ATOM   2807 C C   . THR B 1 54  ? -12.856 25.911  64.633  1.00 15.30 ? ? ? ? ? ? 544 THR B C   1 
+ATOM   2808 O O   . THR B 1 54  ? -12.952 26.539  65.686  1.00 14.64 ? ? ? ? ? ? 544 THR B O   1 
+ATOM   2809 C CB  . THR B 1 54  ? -14.055 23.764  64.395  1.00 18.44 ? ? ? ? ? ? 544 THR B CB  1 
+ATOM   2810 O OG1 . THR B 1 54  ? -15.117 23.094  63.710  1.00 21.32 ? ? ? ? ? ? 544 THR B OG1 1 
+ATOM   2811 C CG2 . THR B 1 54  ? -14.243 23.590  65.918  1.00 18.61 ? ? ? ? ? ? 544 THR B CG2 1 
+ATOM   2812 N N   . TYR B 1 55  ? -11.715 25.784  63.952  1.00 13.89 ? ? ? ? ? ? 545 TYR B N   1 
+ATOM   2813 C CA  . TYR B 1 55  ? -10.473 26.415  64.404  1.00 13.17 ? ? ? ? ? ? 545 TYR B CA  1 
+ATOM   2814 C C   . TYR B 1 55  ? -10.724 27.927  64.635  1.00 13.84 ? ? ? ? ? ? 545 TYR B C   1 
+ATOM   2815 O O   . TYR B 1 55  ? -10.448 28.464  65.715  1.00 13.05 ? ? ? ? ? ? 545 TYR B O   1 
+ATOM   2816 C CB  . TYR B 1 55  ? -9.374  26.207  63.354  1.00 12.36 ? ? ? ? ? ? 545 TYR B CB  1 
+ATOM   2817 C CG  . TYR B 1 55  ? -8.039  26.777  63.739  1.00 11.78 ? ? ? ? ? ? 545 TYR B CG  1 
+ATOM   2818 C CD1 . TYR B 1 55  ? -7.126  26.017  64.458  1.00 12.10 ? ? ? ? ? ? 545 TYR B CD1 1 
+ATOM   2819 C CD2 . TYR B 1 55  ? -7.700  28.078  63.407  1.00 11.46 ? ? ? ? ? ? 545 TYR B CD2 1 
+ATOM   2820 C CE1 . TYR B 1 55  ? -5.906  26.542  64.852  1.00 12.58 ? ? ? ? ? ? 545 TYR B CE1 1 
+ATOM   2821 C CE2 . TYR B 1 55  ? -6.488  28.612  63.782  1.00 12.30 ? ? ? ? ? ? 545 TYR B CE2 1 
+ATOM   2822 C CZ  . TYR B 1 55  ? -5.596  27.843  64.514  1.00 12.47 ? ? ? ? ? ? 545 TYR B CZ  1 
+ATOM   2823 O OH  . TYR B 1 55  ? -4.421  28.393  64.980  1.00 13.17 ? ? ? ? ? ? 545 TYR B OH  1 
+ATOM   2824 N N   . ASN B 1 56  ? -11.306 28.590  63.637  1.00 14.02 ? ? ? ? ? ? 546 ASN B N   1 
+ATOM   2825 C CA  . ASN B 1 56  ? -11.576 30.021  63.725  1.00 14.83 ? ? ? ? ? ? 546 ASN B CA  1 
+ATOM   2826 C C   . ASN B 1 56  ? -12.537 30.404  64.826  1.00 14.45 ? ? ? ? ? ? 546 ASN B C   1 
+ATOM   2827 O O   . ASN B 1 56  ? -12.362 31.448  65.475  1.00 14.54 ? ? ? ? ? ? 546 ASN B O   1 
+ATOM   2828 C CB  . ASN B 1 56  ? -12.152 30.556  62.413  1.00 16.88 ? ? ? ? ? ? 546 ASN B CB  1 
+ATOM   2829 C CG  . ASN B 1 56  ? -11.111 30.700  61.323  1.00 19.84 ? ? ? ? ? ? 546 ASN B CG  1 
+ATOM   2830 O OD1 . ASN B 1 56  ? -10.162 29.924  61.244  1.00 21.24 ? ? ? ? ? ? 546 ASN B OD1 1 
+ATOM   2831 N ND2 . ASN B 1 56  ? -11.298 31.691  60.455  1.00 21.17 ? ? ? ? ? ? 546 ASN B ND2 1 
+ATOM   2832 N N   . SER B 1 57  ? -13.576 29.609  65.038  1.00 14.71 ? ? ? ? ? ? 547 SER B N   1 
+ATOM   2833 C CA  . SER B 1 57  ? -14.528 30.017  66.070  1.00 16.25 ? ? ? ? ? ? 547 SER B CA  1 
+ATOM   2834 C C   . SER B 1 57  ? -13.994 29.936  67.504  1.00 14.53 ? ? ? ? ? ? 547 SER B C   1 
+ATOM   2835 O O   . SER B 1 57  ? -14.283 30.811  68.310  1.00 14.51 ? ? ? ? ? ? 547 SER B O   1 
+ATOM   2836 C CB  . SER B 1 57  ? -15.873 29.328  65.917  1.00 20.24 ? ? ? ? ? ? 547 SER B CB  1 
+ATOM   2837 O OG  . SER B 1 57  ? -15.771 27.954  66.169  1.00 25.46 ? ? ? ? ? ? 547 SER B OG  1 
+ATOM   2838 N N   . ILE B 1 58  ? -13.124 28.958  67.773  1.00 13.39 ? ? ? ? ? ? 548 ILE B N   1 
+ATOM   2839 C CA  . ILE B 1 58  ? -12.511 28.821  69.102  1.00 13.57 ? ? ? ? ? ? 548 ILE B CA  1 
+ATOM   2840 C C   . ILE B 1 58  ? -11.490 29.964  69.283  1.00 12.60 ? ? ? ? ? ? 548 ILE B C   1 
+ATOM   2841 O O   . ILE B 1 58  ? -11.486 30.649  70.299  1.00 12.28 ? ? ? ? ? ? 548 ILE B O   1 
+ATOM   2842 C CB  . ILE B 1 58  ? -11.860 27.419  69.269  1.00 14.10 ? ? ? ? ? ? 548 ILE B CB  1 
+ATOM   2843 C CG1 . ILE B 1 58  ? -12.949 26.354  69.360  1.00 16.45 ? ? ? ? ? ? 548 ILE B CG1 1 
+ATOM   2844 C CG2 . ILE B 1 58  ? -10.973 27.356  70.495  1.00 14.34 ? ? ? ? ? ? 548 ILE B CG2 1 
+ATOM   2845 C CD1 . ILE B 1 58  ? -12.404 24.942  69.294  1.00 18.07 ? ? ? ? ? ? 548 ILE B CD1 1 
+ATOM   2846 N N   . LEU B 1 59  ? -10.677 30.201  68.249  1.00 12.20 ? ? ? ? ? ? 549 LEU B N   1 
+ATOM   2847 C CA  . LEU B 1 59  ? -9.655  31.258  68.240  1.00 11.29 ? ? ? ? ? ? 549 LEU B CA  1 
+ATOM   2848 C C   . LEU B 1 59  ? -10.229 32.614  68.587  1.00 11.08 ? ? ? ? ? ? 549 LEU B C   1 
+ATOM   2849 O O   . LEU B 1 59  ? -9.733  33.275  69.499  1.00 12.34 ? ? ? ? ? ? 549 LEU B O   1 
+ATOM   2850 C CB  . LEU B 1 59  ? -8.969  31.340  66.847  1.00 11.37 ? ? ? ? ? ? 549 LEU B CB  1 
+ATOM   2851 C CG  . LEU B 1 59  ? -7.936  32.465  66.583  1.00 12.11 ? ? ? ? ? ? 549 LEU B CG  1 
+ATOM   2852 C CD1 . LEU B 1 59  ? -6.718  32.351  67.545  1.00 12.34 ? ? ? ? ? ? 549 LEU B CD1 1 
+ATOM   2853 C CD2 . LEU B 1 59  ? -7.472  32.403  65.127  1.00 10.94 ? ? ? ? ? ? 549 LEU B CD2 1 
+ATOM   2854 N N   . GLN B 1 60  ? -11.313 33.005  67.905  1.00 11.40 ? ? ? ? ? ? 550 GLN B N   1 
+ATOM   2855 C CA  . GLN B 1 60  ? -11.904 34.336  68.122  1.00 12.26 ? ? ? ? ? ? 550 GLN B CA  1 
+ATOM   2856 C C   . GLN B 1 60  ? -12.632 34.511  69.454  1.00 12.99 ? ? ? ? ? ? 550 GLN B C   1 
+ATOM   2857 O O   . GLN B 1 60  ? -12.853 35.624  69.928  1.00 13.63 ? ? ? ? ? ? 550 GLN B O   1 
+ATOM   2858 C CB  . GLN B 1 60  ? -12.830 34.721  66.950  1.00 11.53 ? ? ? ? ? ? 550 GLN B CB  1 
+ATOM   2859 C CG  . GLN B 1 60  ? -14.103 33.905  66.851  1.00 13.51 ? ? ? ? ? ? 550 GLN B CG  1 
+ATOM   2860 C CD  . GLN B 1 60  ? -14.877 34.133  65.538  1.00 14.34 ? ? ? ? ? ? 550 GLN B CD  1 
+ATOM   2861 O OE1 . GLN B 1 60  ? -14.377 34.741  64.598  1.00 14.73 ? ? ? ? ? ? 550 GLN B OE1 1 
+ATOM   2862 N NE2 . GLN B 1 60  ? -16.082 33.603  65.469  1.00 13.65 ? ? ? ? ? ? 550 GLN B NE2 1 
+ATOM   2863 N N   . ARG B 1 61  ? -12.946 33.384  70.066  1.00 14.27 ? ? ? ? ? ? 551 ARG B N   1 
+ATOM   2864 C CA  . ARG B 1 61  ? -13.673 33.355  71.317  1.00 15.63 ? ? ? ? ? ? 551 ARG B CA  1 
+ATOM   2865 C C   . ARG B 1 61  ? -12.839 33.276  72.615  1.00 13.74 ? ? ? ? ? ? 551 ARG B C   1 
+ATOM   2866 O O   . ARG B 1 61  ? -13.121 33.968  73.587  1.00 12.92 ? ? ? ? ? ? 551 ARG B O   1 
+ATOM   2867 C CB  . ARG B 1 61  ? -14.585 32.131  71.264  1.00 18.02 ? ? ? ? ? ? 551 ARG B CB  1 
+ATOM   2868 C CG  . ARG B 1 61  ? -15.848 32.272  72.048  1.00 23.47 ? ? ? ? ? ? 551 ARG B CG  1 
+ATOM   2869 C CD  . ARG B 1 61  ? -16.653 30.982  72.015  1.00 25.47 ? ? ? ? ? ? 551 ARG B CD  1 
+ATOM   2870 N NE  . ARG B 1 61  ? -15.916 29.913  72.676  1.00 27.78 ? ? ? ? ? ? 551 ARG B NE  1 
+ATOM   2871 C CZ  . ARG B 1 61  ? -15.831 28.679  72.202  1.00 28.83 ? ? ? ? ? ? 551 ARG B CZ  1 
+ATOM   2872 N NH1 . ARG B 1 61  ? -16.440 28.378  71.058  1.00 28.88 ? ? ? ? ? ? 551 ARG B NH1 1 
+ATOM   2873 N NH2 . ARG B 1 61  ? -15.180 27.741  72.883  1.00 29.71 ? ? ? ? ? ? 551 ARG B NH2 1 
+ATOM   2874 N N   . GLU B 1 62  ? -11.833 32.416  72.625  1.00 12.53 ? ? ? ? ? ? 552 GLU B N   1 
+ATOM   2875 C CA  . GLU B 1 62  ? -11.065 32.144  73.847  1.00 12.14 ? ? ? ? ? ? 552 GLU B CA  1 
+ATOM   2876 C C   . GLU B 1 62  ? -9.830  32.951  74.191  1.00 13.21 ? ? ? ? ? ? 552 GLU B C   1 
+ATOM   2877 O O   . GLU B 1 62  ? -9.421  32.979  75.362  1.00 13.19 ? ? ? ? ? ? 552 GLU B O   1 
+ATOM   2878 C CB  . GLU B 1 62  ? -10.662 30.665  73.888  1.00 13.36 ? ? ? ? ? ? 552 GLU B CB  1 
+ATOM   2879 C CG  . GLU B 1 62  ? -11.797 29.648  73.798  1.00 15.35 ? ? ? ? ? ? 552 GLU B CG  1 
+ATOM   2880 C CD  . GLU B 1 62  ? -12.562 29.482  75.111  1.00 17.31 ? ? ? ? ? ? 552 GLU B CD  1 
+ATOM   2881 O OE1 . GLU B 1 62  ? -11.996 29.771  76.196  1.00 16.92 ? ? ? ? ? ? 552 GLU B OE1 1 
+ATOM   2882 O OE2 . GLU B 1 62  ? -13.744 29.071  75.042  1.00 19.91 ? ? ? ? ? ? 552 GLU B OE2 1 
+ATOM   2883 N N   . PHE B 1 63  ? -9.232  33.608  73.195  1.00 12.38 ? ? ? ? ? ? 553 PHE B N   1 
+ATOM   2884 C CA  . PHE B 1 63  ? -7.974  34.337  73.414  1.00 11.49 ? ? ? ? ? ? 553 PHE B CA  1 
+ATOM   2885 C C   . PHE B 1 63  ? -7.987  35.856  73.301  1.00 11.64 ? ? ? ? ? ? 553 PHE B C   1 
+ATOM   2886 O O   . PHE B 1 63  ? -8.808  36.435  72.568  1.00 11.89 ? ? ? ? ? ? 553 PHE B O   1 
+ATOM   2887 C CB  . PHE B 1 63  ? -6.927  33.762  72.474  1.00 11.66 ? ? ? ? ? ? 553 PHE B CB  1 
+ATOM   2888 C CG  . PHE B 1 63  ? -6.784  32.283  72.597  1.00 11.81 ? ? ? ? ? ? 553 PHE B CG  1 
+ATOM   2889 C CD1 . PHE B 1 63  ? -6.033  31.741  73.638  1.00 11.96 ? ? ? ? ? ? 553 PHE B CD1 1 
+ATOM   2890 C CD2 . PHE B 1 63  ? -7.466  31.421  71.730  1.00 12.24 ? ? ? ? ? ? 553 PHE B CD2 1 
+ATOM   2891 C CE1 . PHE B 1 63  ? -5.960  30.352  73.827  1.00 12.42 ? ? ? ? ? ? 553 PHE B CE1 1 
+ATOM   2892 C CE2 . PHE B 1 63  ? -7.403  30.026  71.914  1.00 13.25 ? ? ? ? ? ? 553 PHE B CE2 1 
+ATOM   2893 C CZ  . PHE B 1 63  ? -6.644  29.497  72.971  1.00 12.69 ? ? ? ? ? ? 553 PHE B CZ  1 
+ATOM   2894 N N   . SER B 1 64  ? -7.073  36.497  74.023  1.00 10.11 ? ? ? ? ? ? 554 SER B N   1 
+ATOM   2895 C CA  . SER B 1 64  ? -6.981  37.943  73.970  1.00 10.94 ? ? ? ? ? ? 554 SER B CA  1 
+ATOM   2896 C C   . SER B 1 64  ? -5.690  38.406  73.288  1.00 10.22 ? ? ? ? ? ? 554 SER B C   1 
+ATOM   2897 O O   . SER B 1 64  ? -5.438  39.596  73.208  1.00 10.74 ? ? ? ? ? ? 554 SER B O   1 
+ATOM   2898 C CB  . SER B 1 64  ? -7.118  38.550  75.382  1.00 12.22 ? ? ? ? ? ? 554 SER B CB  1 
+ATOM   2899 O OG  . SER B 1 64  ? -6.208  37.951  76.292  1.00 13.10 ? ? ? ? ? ? 554 SER B OG  1 
+ATOM   2900 N N   . MET B 1 65  ? -4.909  37.467  72.764  1.00 10.01 ? ? ? ? ? ? 555 MET B N   1 
+ATOM   2901 C CA  . MET B 1 65  ? -3.636  37.804  72.113  1.00 10.06 ? ? ? ? ? ? 555 MET B CA  1 
+ATOM   2902 C C   . MET B 1 65  ? -3.291  36.748  71.063  1.00 9.95  ? ? ? ? ? ? 555 MET B C   1 
+ATOM   2903 O O   . MET B 1 65  ? -3.576  35.567  71.239  1.00 9.76  ? ? ? ? ? ? 555 MET B O   1 
+ATOM   2904 C CB  . MET B 1 65  ? -2.526  37.882  73.162  1.00 10.43 ? ? ? ? ? ? 555 MET B CB  1 
+ATOM   2905 C CG  . MET B 1 65  ? -1.166  38.266  72.622  1.00 11.85 ? ? ? ? ? ? 555 MET B CG  1 
+ATOM   2906 S SD  . MET B 1 65  ? 0.055   38.483  73.930  1.00 13.08 ? ? ? ? ? ? 555 MET B SD  1 
+ATOM   2907 C CE  . MET B 1 65  ? -0.013  40.126  74.164  1.00 12.92 ? ? ? ? ? ? 555 MET B CE  1 
+ATOM   2908 N N   . VAL B 1 66  ? -2.768  37.200  69.926  1.00 8.47  ? ? ? ? ? ? 556 VAL B N   1 
+ATOM   2909 C CA  . VAL B 1 66  ? -2.363  36.316  68.843  1.00 9.25  ? ? ? ? ? ? 556 VAL B CA  1 
+ATOM   2910 C C   . VAL B 1 66  ? -0.925  36.658  68.374  1.00 9.32  ? ? ? ? ? ? 556 VAL B C   1 
+ATOM   2911 O O   . VAL B 1 66  ? -0.420  37.768  68.612  1.00 9.93  ? ? ? ? ? ? 556 VAL B O   1 
+ATOM   2912 C CB  . VAL B 1 66  ? -3.314  36.399  67.600  1.00 10.90 ? ? ? ? ? ? 556 VAL B CB  1 
+ATOM   2913 C CG1 . VAL B 1 66  ? -4.637  35.710  67.890  1.00 12.49 ? ? ? ? ? ? 556 VAL B CG1 1 
+ATOM   2914 C CG2 . VAL B 1 66  ? -3.535  37.866  67.174  1.00 11.45 ? ? ? ? ? ? 556 VAL B CG2 1 
+ATOM   2915 N N   . VAL B 1 67  ? -0.285  35.691  67.722  1.00 9.40  ? ? ? ? ? ? 557 VAL B N   1 
+ATOM   2916 C CA  . VAL B 1 67  ? 1.076   35.821  67.204  1.00 10.46 ? ? ? ? ? ? 557 VAL B CA  1 
+ATOM   2917 C C   . VAL B 1 67  ? 1.117   35.026  65.891  1.00 10.79 ? ? ? ? ? ? 557 VAL B C   1 
+ATOM   2918 O O   . VAL B 1 67  ? 0.472   33.995  65.774  1.00 9.49  ? ? ? ? ? ? 557 VAL B O   1 
+ATOM   2919 C CB  . VAL B 1 67  ? 2.107   35.140  68.156  1.00 10.96 ? ? ? ? ? ? 557 VAL B CB  1 
+ATOM   2920 C CG1 . VAL B 1 67  ? 3.560   35.527  67.742  1.00 11.24 ? ? ? ? ? ? 557 VAL B CG1 1 
+ATOM   2921 C CG2 . VAL B 1 67  ? 1.824   35.487  69.575  1.00 13.25 ? ? ? ? ? ? 557 VAL B CG2 1 
+ATOM   2922 N N   . CYS B 1 68  ? 1.885   35.494  64.910  1.00 11.82 ? ? ? ? ? ? 558 CYS B N   1 
+ATOM   2923 C CA  . CYS B 1 68  ? 2.032   34.781  63.627  1.00 13.00 ? ? ? ? ? ? 558 CYS B CA  1 
+ATOM   2924 C C   . CYS B 1 68  ? 3.027   33.645  63.828  1.00 12.84 ? ? ? ? ? ? 558 CYS B C   1 
+ATOM   2925 O O   . CYS B 1 68  ? 4.154   33.871  64.251  1.00 13.31 ? ? ? ? ? ? 558 CYS B O   1 
+ATOM   2926 C CB  . CYS B 1 68  ? 2.636   35.705  62.560  1.00 14.60 ? ? ? ? ? ? 558 CYS B CB  1 
+ATOM   2927 S SG  . CYS B 1 68  ? 1.548   36.926  61.859  1.00 20.47 ? ? ? ? ? ? 558 CYS B SG  1 
+ATOM   2928 N N   . GLU B 1 69  ? 2.648   32.426  63.486  1.00 13.37 ? ? ? ? ? ? 559 GLU B N   1 
+ATOM   2929 C CA  . GLU B 1 69  ? 3.572   31.310  63.645  1.00 14.15 ? ? ? ? ? ? 559 GLU B CA  1 
+ATOM   2930 C C   . GLU B 1 69  ? 4.805   31.412  62.718  1.00 14.08 ? ? ? ? ? ? 559 GLU B C   1 
+ATOM   2931 O O   . GLU B 1 69  ? 5.940   31.205  63.160  1.00 14.45 ? ? ? ? ? ? 559 GLU B O   1 
+ATOM   2932 C CB  . GLU B 1 69  ? 2.845   29.973  63.388  1.00 16.24 ? ? ? ? ? ? 559 GLU B CB  1 
+ATOM   2933 C CG  . GLU B 1 69  ? 3.696   28.729  63.771  1.00 18.01 ? ? ? ? ? ? 559 GLU B CG  1 
+ATOM   2934 C CD  . GLU B 1 69  ? 3.053   27.406  63.371  1.00 19.86 ? ? ? ? ? ? 559 GLU B CD  1 
+ATOM   2935 O OE1 . GLU B 1 69  ? 1.914   27.422  62.847  1.00 20.95 ? ? ? ? ? ? 559 GLU B OE1 1 
+ATOM   2936 O OE2 . GLU B 1 69  ? 3.699   26.355  63.553  1.00 20.80 ? ? ? ? ? ? 559 GLU B OE2 1 
+ATOM   2937 N N   . ASN B 1 70  ? 4.577   31.821  61.467  1.00 14.12 ? ? ? ? ? ? 560 ASN B N   1 
+ATOM   2938 C CA  . ASN B 1 70  ? 5.644   31.880  60.458  1.00 14.73 ? ? ? ? ? ? 560 ASN B CA  1 
+ATOM   2939 C C   . ASN B 1 70  ? 5.604   33.063  59.516  1.00 15.16 ? ? ? ? ? ? 560 ASN B C   1 
+ATOM   2940 O O   . ASN B 1 70  ? 6.581   33.331  58.817  1.00 15.53 ? ? ? ? ? ? 560 ASN B O   1 
+ATOM   2941 C CB  . ASN B 1 70  ? 5.482   30.697  59.486  1.00 18.06 ? ? ? ? ? ? 560 ASN B CB  1 
+ATOM   2942 C CG  . ASN B 1 70  ? 5.708   29.359  60.128  1.00 20.15 ? ? ? ? ? ? 560 ASN B CG  1 
+ATOM   2943 O OD1 . ASN B 1 70  ? 6.808   29.066  60.594  1.00 22.68 ? ? ? ? ? ? 560 ASN B OD1 1 
+ATOM   2944 N ND2 . ASN B 1 70  ? 4.674   28.517  60.134  1.00 21.39 ? ? ? ? ? ? 560 ASN B ND2 1 
+ATOM   2945 N N   . GLU B 1 71  ? 4.460   33.720  59.436  1.00 14.16 ? ? ? ? ? ? 561 GLU B N   1 
+ATOM   2946 C CA  . GLU B 1 71  ? 4.251   34.790  58.472  1.00 15.25 ? ? ? ? ? ? 561 GLU B CA  1 
+ATOM   2947 C C   . GLU B 1 71  ? 4.968   36.116  58.669  1.00 14.54 ? ? ? ? ? ? 561 GLU B C   1 
+ATOM   2948 O O   . GLU B 1 71  ? 4.843   37.015  57.826  1.00 14.50 ? ? ? ? ? ? 561 GLU B O   1 
+ATOM   2949 C CB  . GLU B 1 71  ? 2.741   35.022  58.285  1.00 18.09 ? ? ? ? ? ? 561 GLU B CB  1 
+ATOM   2950 C CG  . GLU B 1 71  ? 1.944   33.776  57.826  1.00 22.17 ? ? ? ? ? ? 561 GLU B CG  1 
+ATOM   2951 C CD  . GLU B 1 71  ? 1.848   32.629  58.884  1.00 25.43 ? ? ? ? ? ? 561 GLU B CD  1 
+ATOM   2952 O OE1 . GLU B 1 71  ? 2.054   32.868  60.119  1.00 24.90 ? ? ? ? ? ? 561 GLU B OE1 1 
+ATOM   2953 O OE2 . GLU B 1 71  ? 1.552   31.469  58.455  1.00 27.43 ? ? ? ? ? ? 561 GLU B OE2 1 
+ATOM   2954 N N   . MET B 1 72  ? 5.605   36.295  59.823  1.00 13.22 ? ? ? ? ? ? 562 MET B N   1 
+ATOM   2955 C CA  . MET B 1 72  ? 6.331   37.531  60.099  1.00 12.76 ? ? ? ? ? ? 562 MET B CA  1 
+ATOM   2956 C C   . MET B 1 72  ? 7.826   37.273  60.310  1.00 12.32 ? ? ? ? ? ? 562 MET B C   1 
+ATOM   2957 O O   . MET B 1 72  ? 8.553   38.139  60.835  1.00 12.93 ? ? ? ? ? ? 562 MET B O   1 
+ATOM   2958 C CB  . MET B 1 72  ? 5.694   38.338  61.240  1.00 14.10 ? ? ? ? ? ? 562 MET B CB  1 
+ATOM   2959 C CG  . MET B 1 72  ? 4.468   39.090  60.774  1.00 16.38 ? ? ? ? ? ? 562 MET B CG  1 
+ATOM   2960 S SD  . MET B 1 72  ? 3.634   40.076  62.003  1.00 21.73 ? ? ? ? ? ? 562 MET B SD  1 
+ATOM   2961 C CE  . MET B 1 72  ? 4.774   40.161  63.216  1.00 21.55 ? ? ? ? ? ? 562 MET B CE  1 
+ATOM   2962 N N   . LYS B 1 73  ? 8.286   36.092  59.874  1.00 11.06 ? ? ? ? ? ? 563 LYS B N   1 
+ATOM   2963 C CA  . LYS B 1 73  ? 9.704   35.788  59.912  1.00 11.74 ? ? ? ? ? ? 563 LYS B CA  1 
+ATOM   2964 C C   . LYS B 1 73  ? 10.358  36.575  58.747  1.00 11.75 ? ? ? ? ? ? 563 LYS B C   1 
+ATOM   2965 O O   . LYS B 1 73  ? 9.656   37.021  57.842  1.00 11.81 ? ? ? ? ? ? 563 LYS B O   1 
+ATOM   2966 C CB  . LYS B 1 73  ? 9.935   34.291  59.791  1.00 13.77 ? ? ? ? ? ? 563 LYS B CB  1 
+ATOM   2967 C CG  . LYS B 1 73  ? 9.915   33.706  61.175  1.00 17.63 ? ? ? ? ? ? 563 LYS B CG  1 
+ATOM   2968 C CD  . LYS B 1 73  ? 9.609   32.258  61.163  1.00 20.97 ? ? ? ? ? ? 563 LYS B CD  1 
+ATOM   2969 C CE  . LYS B 1 73  ? 9.216   31.875  62.600  1.00 23.47 ? ? ? ? ? ? 563 LYS B CE  1 
+ATOM   2970 N NZ  . LYS B 1 73  ? 8.728   30.478  62.708  1.00 26.02 ? ? ? ? ? ? 563 LYS B NZ  1 
+ATOM   2971 N N   . PHE B 1 74  ? 11.679  36.700  58.755  1.00 11.12 ? ? ? ? ? ? 564 PHE B N   1 
+ATOM   2972 C CA  . PHE B 1 74  ? 12.421  37.472  57.747  1.00 11.52 ? ? ? ? ? ? 564 PHE B CA  1 
+ATOM   2973 C C   . PHE B 1 74  ? 12.156  37.049  56.297  1.00 11.68 ? ? ? ? ? ? 564 PHE B C   1 
+ATOM   2974 O O   . PHE B 1 74  ? 11.898  37.920  55.440  1.00 12.27 ? ? ? ? ? ? 564 PHE B O   1 
+ATOM   2975 C CB  . PHE B 1 74  ? 13.919  37.430  58.054  1.00 10.62 ? ? ? ? ? ? 564 PHE B CB  1 
+ATOM   2976 C CG  . PHE B 1 74  ? 14.709  38.570  57.454  1.00 10.64 ? ? ? ? ? ? 564 PHE B CG  1 
+ATOM   2977 C CD1 . PHE B 1 74  ? 14.909  38.655  56.069  1.00 11.39 ? ? ? ? ? ? 564 PHE B CD1 1 
+ATOM   2978 C CD2 . PHE B 1 74  ? 15.313  39.517  58.283  1.00 11.17 ? ? ? ? ? ? 564 PHE B CD2 1 
+ATOM   2979 C CE1 . PHE B 1 74  ? 15.702  39.656  55.529  1.00 11.38 ? ? ? ? ? ? 564 PHE B CE1 1 
+ATOM   2980 C CE2 . PHE B 1 74  ? 16.115  40.529  57.752  1.00 11.49 ? ? ? ? ? ? 564 PHE B CE2 1 
+ATOM   2981 C CZ  . PHE B 1 74  ? 16.311  40.598  56.366  1.00 11.33 ? ? ? ? ? ? 564 PHE B CZ  1 
+ATOM   2982 N N   . ASP B 1 75  ? 12.218  35.755  56.014  1.00 11.55 ? ? ? ? ? ? 565 ASP B N   1 
+ATOM   2983 C CA  . ASP B 1 75  ? 11.968  35.244  54.659  1.00 12.73 ? ? ? ? ? ? 565 ASP B CA  1 
+ATOM   2984 C C   . ASP B 1 75  ? 10.545  35.489  54.113  1.00 13.10 ? ? ? ? ? ? 565 ASP B C   1 
+ATOM   2985 O O   . ASP B 1 75  ? 10.365  35.649  52.913  1.00 15.50 ? ? ? ? ? ? 565 ASP B O   1 
+ATOM   2986 C CB  . ASP B 1 75  ? 12.366  33.753  54.538  1.00 14.97 ? ? ? ? ? ? 565 ASP B CB  1 
+ATOM   2987 C CG  . ASP B 1 75  ? 11.423  32.776  55.309  1.00 16.45 ? ? ? ? ? ? 565 ASP B CG  1 
+ATOM   2988 O OD1 . ASP B 1 75  ? 10.766  33.139  56.310  1.00 16.77 ? ? ? ? ? ? 565 ASP B OD1 1 
+ATOM   2989 O OD2 . ASP B 1 75  ? 11.370  31.604  54.897  1.00 19.43 ? ? ? ? ? ? 565 ASP B OD2 1 
+ATOM   2990 N N   . ALA B 1 76  ? 9.547   35.561  54.996  1.00 11.81 ? ? ? ? ? ? 566 ALA B N   1 
+ATOM   2991 C CA  . ALA B 1 76  ? 8.159   35.796  54.618  1.00 10.67 ? ? ? ? ? ? 566 ALA B CA  1 
+ATOM   2992 C C   . ALA B 1 76  ? 7.906   37.292  54.388  1.00 10.01 ? ? ? ? ? ? 566 ALA B C   1 
+ATOM   2993 O O   . ALA B 1 76  ? 7.121   37.668  53.512  1.00 10.90 ? ? ? ? ? ? 566 ALA B O   1 
+ATOM   2994 C CB  . ALA B 1 76  ? 7.213   35.268  55.752  1.00 10.89 ? ? ? ? ? ? 566 ALA B CB  1 
+ATOM   2995 N N   . LEU B 1 77  ? 8.529   38.140  55.208  1.00 8.45  ? ? ? ? ? ? 567 LEU B N   1 
+ATOM   2996 C CA  . LEU B 1 77  ? 8.330   39.591  55.111  1.00 9.12  ? ? ? ? ? ? 567 LEU B CA  1 
+ATOM   2997 C C   . LEU B 1 77  ? 9.139   40.304  54.028  1.00 8.52  ? ? ? ? ? ? 567 LEU B C   1 
+ATOM   2998 O O   . LEU B 1 77  ? 8.656   41.300  53.493  1.00 8.71  ? ? ? ? ? ? 567 LEU B O   1 
+ATOM   2999 C CB  . LEU B 1 77  ? 8.548   40.295  56.465  1.00 9.88  ? ? ? ? ? ? 567 LEU B CB  1 
+ATOM   3000 C CG  . LEU B 1 77  ? 7.349   40.360  57.410  1.00 12.51 ? ? ? ? ? ? 567 LEU B CG  1 
+ATOM   3001 C CD1 . LEU B 1 77  ? 7.834   40.833  58.777  1.00 13.75 ? ? ? ? ? ? 567 LEU B CD1 1 
+ATOM   3002 C CD2 . LEU B 1 77  ? 6.291   41.317  56.872  1.00 14.56 ? ? ? ? ? ? 567 LEU B CD2 1 
+ATOM   3003 N N   . GLN B 1 78  ? 10.368  39.859  53.777  1.00 7.45  ? ? ? ? ? ? 568 GLN B N   1 
+ATOM   3004 C CA  . GLN B 1 78  ? 11.220  40.479  52.735  1.00 7.04  ? ? ? ? ? ? 568 GLN B CA  1 
+ATOM   3005 C C   . GLN B 1 78  ? 11.800  39.332  51.909  1.00 6.71  ? ? ? ? ? ? 568 GLN B C   1 
+ATOM   3006 O O   . GLN B 1 78  ? 13.005  39.075  51.943  1.00 7.62  ? ? ? ? ? ? 568 GLN B O   1 
+ATOM   3007 C CB  . GLN B 1 78  ? 12.331  41.347  53.370  1.00 7.67  ? ? ? ? ? ? 568 GLN B CB  1 
+ATOM   3008 C CG  . GLN B 1 78  ? 12.966  42.303  52.347  1.00 7.80  ? ? ? ? ? ? 568 GLN B CG  1 
+ATOM   3009 C CD  . GLN B 1 78  ? 14.152  43.161  52.824  1.00 8.64  ? ? ? ? ? ? 568 GLN B CD  1 
+ATOM   3010 O OE1 . GLN B 1 78  ? 14.828  43.778  51.998  1.00 9.16  ? ? ? ? ? ? 568 GLN B OE1 1 
+ATOM   3011 N NE2 . GLN B 1 78  ? 14.400  43.217  54.130  1.00 8.06  ? ? ? ? ? ? 568 GLN B NE2 1 
+ATOM   3012 N N   . PRO B 1 79  ? 10.960  38.662  51.087  1.00 6.84  ? ? ? ? ? ? 569 PRO B N   1 
+ATOM   3013 C CA  . PRO B 1 79  ? 11.409  37.523  50.275  1.00 7.43  ? ? ? ? ? ? 569 PRO B CA  1 
+ATOM   3014 C C   . PRO B 1 79  ? 12.441  37.802  49.204  1.00 7.86  ? ? ? ? ? ? 569 PRO B C   1 
+ATOM   3015 O O   . PRO B 1 79  ? 13.167  36.915  48.783  1.00 9.41  ? ? ? ? ? ? 569 PRO B O   1 
+ATOM   3016 C CB  . PRO B 1 79  ? 10.110  36.933  49.742  1.00 8.23  ? ? ? ? ? ? 569 PRO B CB  1 
+ATOM   3017 C CG  . PRO B 1 79  ? 9.247   38.107  49.620  1.00 9.59  ? ? ? ? ? ? 569 PRO B CG  1 
+ATOM   3018 C CD  . PRO B 1 79  ? 9.541   38.964  50.846  1.00 7.95  ? ? ? ? ? ? 569 PRO B CD  1 
+ATOM   3019 N N   . ARG B 1 80  ? 12.468  39.040  48.737  1.00 8.43  ? ? ? ? ? ? 570 ARG B N   1 
+ATOM   3020 C CA  . ARG B 1 80  ? 13.453  39.494  47.755  1.00 8.17  ? ? ? ? ? ? 570 ARG B CA  1 
+ATOM   3021 C C   . ARG B 1 80  ? 13.958  40.818  48.329  1.00 6.99  ? ? ? ? ? ? 570 ARG B C   1 
+ATOM   3022 O O   . ARG B 1 80  ? 13.230  41.501  49.043  1.00 7.01  ? ? ? ? ? ? 570 ARG B O   1 
+ATOM   3023 C CB  . ARG B 1 80  ? 12.807  39.684  46.374  1.00 9.96  ? ? ? ? ? ? 570 ARG B CB  1 
+ATOM   3024 C CG  . ARG B 1 80  ? 12.437  38.338  45.710  1.00 12.31 ? ? ? ? ? ? 570 ARG B CG  1 
+ATOM   3025 C CD  . ARG B 1 80  ? 11.778  38.518  44.346  1.00 17.09 ? ? ? ? ? ? 570 ARG B CD  1 
+ATOM   3026 N NE  . ARG B 1 80  ? 12.655  39.227  43.423  1.00 20.57 ? ? ? ? ? ? 570 ARG B NE  1 
+ATOM   3027 C CZ  . ARG B 1 80  ? 12.301  40.311  42.736  1.00 21.54 ? ? ? ? ? ? 570 ARG B CZ  1 
+ATOM   3028 N NH1 . ARG B 1 80  ? 11.081  40.827  42.842  1.00 22.34 ? ? ? ? ? ? 570 ARG B NH1 1 
+ATOM   3029 N NH2 . ARG B 1 80  ? 13.190  40.872  41.952  1.00 23.62 ? ? ? ? ? ? 570 ARG B NH2 1 
+ATOM   3030 N N   . GLN B 1 81  ? 15.192  41.196  48.013  1.00 8.40  ? ? ? ? ? ? 571 GLN B N   1 
+ATOM   3031 C CA  . GLN B 1 81  ? 15.737  42.421  48.565  1.00 8.87  ? ? ? ? ? ? 571 GLN B CA  1 
+ATOM   3032 C C   . GLN B 1 81  ? 14.886  43.660  48.234  1.00 9.46  ? ? ? ? ? ? 571 GLN B C   1 
+ATOM   3033 O O   . GLN B 1 81  ? 14.588  43.945  47.082  1.00 9.78  ? ? ? ? ? ? 571 GLN B O   1 
+ATOM   3034 C CB  . GLN B 1 81  ? 17.213  42.610  48.190  1.00 10.77 ? ? ? ? ? ? 571 GLN B CB  1 
+ATOM   3035 C CG  . GLN B 1 81  ? 17.843  43.731  49.034  1.00 12.60 ? ? ? ? ? ? 571 GLN B CG  1 
+ATOM   3036 C CD  . GLN B 1 81  ? 19.333  43.820  48.908  1.00 14.97 ? ? ? ? ? ? 571 GLN B CD  1 
+ATOM   3037 O OE1 . GLN B 1 81  ? 19.949  43.108  48.114  1.00 16.06 ? ? ? ? ? ? 571 GLN B OE1 1 
+ATOM   3038 N NE2 . GLN B 1 81  ? 19.932  44.711  49.692  1.00 16.52 ? ? ? ? ? ? 571 GLN B NE2 1 
+ATOM   3039 N N   . ASN B 1 82  ? 14.463  44.349  49.282  1.00 8.71  ? ? ? ? ? ? 572 ASN B N   1 
+ATOM   3040 C CA  . ASN B 1 82  ? 13.599  45.517  49.214  1.00 10.61 ? ? ? ? ? ? 572 ASN B CA  1 
+ATOM   3041 C C   . ASN B 1 82  ? 12.204  45.345  48.679  1.00 10.21 ? ? ? ? ? ? 572 ASN B C   1 
+ATOM   3042 O O   . ASN B 1 82  ? 11.580  46.328  48.247  1.00 10.44 ? ? ? ? ? ? 572 ASN B O   1 
+ATOM   3043 C CB  . ASN B 1 82  ? 14.263  46.736  48.605  1.00 13.96 ? ? ? ? ? ? 572 ASN B CB  1 
+ATOM   3044 C CG  . ASN B 1 82  ? 14.777  47.635  49.666  1.00 18.48 ? ? ? ? ? ? 572 ASN B CG  1 
+ATOM   3045 O OD1 . ASN B 1 82  ? 13.999  48.267  50.476  1.00 17.05 ? ? ? ? ? ? 572 ASN B OD1 1 
+ATOM   3046 N ND2 . ASN B 1 82  ? 16.092  47.598  49.805  1.00 20.45 ? ? ? ? ? ? 572 ASN B ND2 1 
+ATOM   3047 N N   . VAL B 1 83  ? 11.710  44.103  48.733  1.00 8.14  ? ? ? ? ? ? 573 VAL B N   1 
+ATOM   3048 C CA  . VAL B 1 83  ? 10.345  43.789  48.355  1.00 8.34  ? ? ? ? ? ? 573 VAL B CA  1 
+ATOM   3049 C C   . VAL B 1 83  ? 9.712   43.275  49.674  1.00 8.90  ? ? ? ? ? ? 573 VAL B C   1 
+ATOM   3050 O O   . VAL B 1 83  ? 10.162  42.252  50.220  1.00 10.21 ? ? ? ? ? ? 573 VAL B O   1 
+ATOM   3051 C CB  . VAL B 1 83  ? 10.286  42.725  47.262  1.00 8.79  ? ? ? ? ? ? 573 VAL B CB  1 
+ATOM   3052 C CG1 . VAL B 1 83  ? 8.842   42.353  46.995  1.00 9.66  ? ? ? ? ? ? 573 VAL B CG1 1 
+ATOM   3053 C CG2 . VAL B 1 83  ? 10.942  43.267  45.982  1.00 9.16  ? ? ? ? ? ? 573 VAL B CG2 1 
+ATOM   3054 N N   . PHE B 1 84  ? 8.736   44.006  50.205  1.00 7.99  ? ? ? ? ? ? 574 PHE B N   1 
+ATOM   3055 C CA  . PHE B 1 84  ? 8.078   43.659  51.493  1.00 6.77  ? ? ? ? ? ? 574 PHE B CA  1 
+ATOM   3056 C C   . PHE B 1 84  ? 6.664   43.132  51.313  1.00 7.99  ? ? ? ? ? ? 574 PHE B C   1 
+ATOM   3057 O O   . PHE B 1 84  ? 5.846   43.745  50.636  1.00 10.09 ? ? ? ? ? ? 574 PHE B O   1 
+ATOM   3058 C CB  . PHE B 1 84  ? 8.070   44.878  52.422  1.00 7.32  ? ? ? ? ? ? 574 PHE B CB  1 
+ATOM   3059 C CG  . PHE B 1 84  ? 9.440   45.270  52.920  1.00 7.71  ? ? ? ? ? ? 574 PHE B CG  1 
+ATOM   3060 C CD1 . PHE B 1 84  ? 10.249  46.123  52.170  1.00 8.33  ? ? ? ? ? ? 574 PHE B CD1 1 
+ATOM   3061 C CD2 . PHE B 1 84  ? 9.933   44.754  54.126  1.00 8.83  ? ? ? ? ? ? 574 PHE B CD2 1 
+ATOM   3062 C CE1 . PHE B 1 84  ? 11.550  46.477  52.589  1.00 8.99  ? ? ? ? ? ? 574 PHE B CE1 1 
+ATOM   3063 C CE2 . PHE B 1 84  ? 11.232  45.083  54.579  1.00 9.25  ? ? ? ? ? ? 574 PHE B CE2 1 
+ATOM   3064 C CZ  . PHE B 1 84  ? 12.060  45.960  53.800  1.00 9.67  ? ? ? ? ? ? 574 PHE B CZ  1 
+ATOM   3065 N N   . ASP B 1 85  ? 6.364   41.984  51.898  1.00 7.27  ? ? ? ? ? ? 575 ASP B N   1 
+ATOM   3066 C CA  . ASP B 1 85  ? 5.046   41.391  51.762  1.00 7.41  ? ? ? ? ? ? 575 ASP B CA  1 
+ATOM   3067 C C   . ASP B 1 85  ? 4.323   41.467  53.118  1.00 8.04  ? ? ? ? ? ? 575 ASP B C   1 
+ATOM   3068 O O   . ASP B 1 85  ? 4.613   40.664  54.011  1.00 8.93  ? ? ? ? ? ? 575 ASP B O   1 
+ATOM   3069 C CB  . ASP B 1 85  ? 5.204   39.935  51.308  1.00 8.17  ? ? ? ? ? ? 575 ASP B CB  1 
+ATOM   3070 C CG  . ASP B 1 85  ? 3.875   39.256  51.045  1.00 8.54  ? ? ? ? ? ? 575 ASP B CG  1 
+ATOM   3071 O OD1 . ASP B 1 85  ? 2.824   39.801  51.413  1.00 9.09  ? ? ? ? ? ? 575 ASP B OD1 1 
+ATOM   3072 O OD2 . ASP B 1 85  ? 3.891   38.159  50.463  1.00 11.68 ? ? ? ? ? ? 575 ASP B OD2 1 
+ATOM   3073 N N   . PHE B 1 86  ? 3.390   42.406  53.259  1.00 7.44  ? ? ? ? ? ? 576 PHE B N   1 
+ATOM   3074 C CA  . PHE B 1 86  ? 2.646   42.581  54.501  1.00 7.81  ? ? ? ? ? ? 576 PHE B CA  1 
+ATOM   3075 C C   . PHE B 1 86  ? 1.264   41.928  54.434  1.00 9.90  ? ? ? ? ? ? 576 PHE B C   1 
+ATOM   3076 O O   . PHE B 1 86  ? 0.487   42.032  55.381  1.00 10.71 ? ? ? ? ? ? 576 PHE B O   1 
+ATOM   3077 C CB  . PHE B 1 86  ? 2.434   44.076  54.772  1.00 8.64  ? ? ? ? ? ? 576 PHE B CB  1 
+ATOM   3078 C CG  . PHE B 1 86  ? 3.718   44.856  54.952  1.00 10.17 ? ? ? ? ? ? 576 PHE B CG  1 
+ATOM   3079 C CD1 . PHE B 1 86  ? 4.638   44.507  55.958  1.00 11.36 ? ? ? ? ? ? 576 PHE B CD1 1 
+ATOM   3080 C CD2 . PHE B 1 86  ? 3.997   45.964  54.144  1.00 11.08 ? ? ? ? ? ? 576 PHE B CD2 1 
+ATOM   3081 C CE1 . PHE B 1 86  ? 5.829   45.259  56.155  1.00 12.42 ? ? ? ? ? ? 576 PHE B CE1 1 
+ATOM   3082 C CE2 . PHE B 1 86  ? 5.180   46.721  54.337  1.00 12.19 ? ? ? ? ? ? 576 PHE B CE2 1 
+ATOM   3083 C CZ  . PHE B 1 86  ? 6.095   46.364  55.343  1.00 11.83 ? ? ? ? ? ? 576 PHE B CZ  1 
+ATOM   3084 N N   . SER B 1 87  ? 0.969   41.214  53.359  1.00 9.74  ? ? ? ? ? ? 577 SER B N   1 
+ATOM   3085 C CA  . SER B 1 87  ? -0.359  40.662  53.194  1.00 10.63 ? ? ? ? ? ? 577 SER B CA  1 
+ATOM   3086 C C   . SER B 1 87  ? -0.943  39.814  54.338  1.00 11.47 ? ? ? ? ? ? 577 SER B C   1 
+ATOM   3087 O O   . SER B 1 87  ? -2.049  40.109  54.818  1.00 13.05 ? ? ? ? ? ? 577 SER B O   1 
+ATOM   3088 C CB  . SER B 1 87  ? -0.484  39.954  51.843  1.00 11.30 ? ? ? ? ? ? 577 SER B CB  1 
+ATOM   3089 O OG  . SER B 1 87  ? 0.321   38.793  51.767  1.00 14.01 ? ? ? ? ? ? 577 SER B OG  1 
+ATOM   3090 N N   . LYS B 1 88  ? -0.216  38.783  54.764  1.00 11.88 ? ? ? ? ? ? 578 LYS B N   1 
+ATOM   3091 C CA  . LYS B 1 88  ? -0.707  37.894  55.824  1.00 11.46 ? ? ? ? ? ? 578 LYS B CA  1 
+ATOM   3092 C C   . LYS B 1 88  ? -0.687  38.548  57.179  1.00 11.71 ? ? ? ? ? ? 578 LYS B C   1 
+ATOM   3093 O O   . LYS B 1 88  ? -1.656  38.438  57.940  1.00 11.54 ? ? ? ? ? ? 578 LYS B O   1 
+ATOM   3094 C CB  . LYS B 1 88  ? 0.067   36.588  55.810  1.00 14.38 ? ? ? ? ? ? 578 LYS B CB  1 
+ATOM   3095 C CG  . LYS B 1 88  ? -0.262  35.755  54.558  1.00 17.98 ? ? ? ? ? ? 578 LYS B CG  1 
+ATOM   3096 C CD  . LYS B 1 88  ? 0.303   34.338  54.636  1.00 22.93 ? ? ? ? ? ? 578 LYS B CD  1 
+ATOM   3097 C CE  . LYS B 1 88  ? 0.232   33.567  53.281  1.00 26.31 ? ? ? ? ? ? 578 LYS B CE  1 
+ATOM   3098 N NZ  . LYS B 1 88  ? 1.154   32.333  53.220  1.00 28.72 ? ? ? ? ? ? 578 LYS B NZ  1 
+ATOM   3099 N N   . GLY B 1 89  ? 0.365   39.309  57.469  1.00 9.63  ? ? ? ? ? ? 579 GLY B N   1 
+ATOM   3100 C CA  . GLY B 1 89  ? 0.427   39.986  58.751  1.00 10.41 ? ? ? ? ? ? 579 GLY B CA  1 
+ATOM   3101 C C   . GLY B 1 89  ? -0.703  40.993  58.913  1.00 10.41 ? ? ? ? ? ? 579 GLY B C   1 
+ATOM   3102 O O   . GLY B 1 89  ? -1.264  41.143  59.997  1.00 11.53 ? ? ? ? ? ? 579 GLY B O   1 
+ATOM   3103 N N   . ASP B 1 90  ? -1.014  41.738  57.851  1.00 9.62  ? ? ? ? ? ? 580 ASP B N   1 
+ATOM   3104 C CA  . ASP B 1 90  ? -2.084  42.742  57.908  1.00 9.52  ? ? ? ? ? ? 580 ASP B CA  1 
+ATOM   3105 C C   . ASP B 1 90  ? -3.462  42.061  58.028  1.00 8.94  ? ? ? ? ? ? 580 ASP B C   1 
+ATOM   3106 O O   . ASP B 1 90  ? -4.379  42.627  58.619  1.00 10.29 ? ? ? ? ? ? 580 ASP B O   1 
+ATOM   3107 C CB  . ASP B 1 90  ? -2.034  43.661  56.679  1.00 10.90 ? ? ? ? ? ? 580 ASP B CB  1 
+ATOM   3108 C CG  . ASP B 1 90  ? -0.930  44.722  56.760  1.00 12.19 ? ? ? ? ? ? 580 ASP B CG  1 
+ATOM   3109 O OD1 . ASP B 1 90  ? -0.092  44.715  57.671  1.00 12.06 ? ? ? ? ? ? 580 ASP B OD1 1 
+ATOM   3110 O OD2 . ASP B 1 90  ? -0.908  45.591  55.866  1.00 14.11 ? ? ? ? ? ? 580 ASP B OD2 1 
+ATOM   3111 N N   . GLN B 1 91  ? -3.583  40.858  57.469  1.00 9.79  ? ? ? ? ? ? 581 GLN B N   1 
+ATOM   3112 C CA  . GLN B 1 91  ? -4.826  40.093  57.558  1.00 11.60 ? ? ? ? ? ? 581 GLN B CA  1 
+ATOM   3113 C C   . GLN B 1 91  ? -5.055  39.674  59.029  1.00 10.85 ? ? ? ? ? ? 581 GLN B C   1 
+ATOM   3114 O O   . GLN B 1 91  ? -6.171  39.828  59.557  1.00 10.57 ? ? ? ? ? ? 581 GLN B O   1 
+ATOM   3115 C CB  . GLN B 1 91  ? -4.735  38.863  56.681  1.00 14.32 ? ? ? ? ? ? 581 GLN B CB  1 
+ATOM   3116 C CG  . GLN B 1 91  ? -5.973  38.027  56.774  1.00 20.03 ? ? ? ? ? ? 581 GLN B CG  1 
+ATOM   3117 C CD  . GLN B 1 91  ? -5.952  36.833  55.852  1.00 22.59 ? ? ? ? ? ? 581 GLN B CD  1 
+ATOM   3118 O OE1 . GLN B 1 91  ? -5.033  36.672  55.031  1.00 25.07 ? ? ? ? ? ? 581 GLN B OE1 1 
+ATOM   3119 N NE2 . GLN B 1 91  ? -6.973  35.971  55.979  1.00 24.78 ? ? ? ? ? ? 581 GLN B NE2 1 
+ATOM   3120 N N   . LEU B 1 92  ? -3.999  39.188  59.688  1.00 9.78  ? ? ? ? ? ? 582 LEU B N   1 
+ATOM   3121 C CA  . LEU B 1 92  ? -4.127  38.808  61.096  1.00 10.85 ? ? ? ? ? ? 582 LEU B CA  1 
+ATOM   3122 C C   . LEU B 1 92  ? -4.407  40.028  61.970  1.00 10.87 ? ? ? ? ? ? 582 LEU B C   1 
+ATOM   3123 O O   . LEU B 1 92  ? -5.257  39.979  62.868  1.00 10.16 ? ? ? ? ? ? 582 LEU B O   1 
+ATOM   3124 C CB  . LEU B 1 92  ? -2.906  38.030  61.611  1.00 11.35 ? ? ? ? ? ? 582 LEU B CB  1 
+ATOM   3125 C CG  . LEU B 1 92  ? -3.056  37.500  63.053  1.00 11.80 ? ? ? ? ? ? 582 LEU B CG  1 
+ATOM   3126 C CD1 . LEU B 1 92  ? -4.244  36.573  63.182  1.00 12.94 ? ? ? ? ? ? 582 LEU B CD1 1 
+ATOM   3127 C CD2 . LEU B 1 92  ? -1.809  36.733  63.432  1.00 13.21 ? ? ? ? ? ? 582 LEU B CD2 1 
+ATOM   3128 N N   . LEU B 1 93  ? -3.749  41.148  61.690  1.00 9.95  ? ? ? ? ? ? 583 LEU B N   1 
+ATOM   3129 C CA  . LEU B 1 93  ? -3.992  42.353  62.470  1.00 11.41 ? ? ? ? ? ? 583 LEU B CA  1 
+ATOM   3130 C C   . LEU B 1 93  ? -5.455  42.825  62.407  1.00 11.58 ? ? ? ? ? ? 583 LEU B C   1 
+ATOM   3131 O O   . LEU B 1 93  ? -6.012  43.218  63.422  1.00 12.02 ? ? ? ? ? ? 583 LEU B O   1 
+ATOM   3132 C CB  . LEU B 1 93  ? -3.036  43.488  62.065  1.00 12.50 ? ? ? ? ? ? 583 LEU B CB  1 
+ATOM   3133 C CG  . LEU B 1 93  ? -3.218  44.792  62.859  1.00 15.13 ? ? ? ? ? ? 583 LEU B CG  1 
+ATOM   3134 C CD1 . LEU B 1 93  ? -3.073  44.577  64.361  1.00 17.01 ? ? ? ? ? ? 583 LEU B CD1 1 
+ATOM   3135 C CD2 . LEU B 1 93  ? -2.199  45.836  62.404  1.00 16.30 ? ? ? ? ? ? 583 LEU B CD2 1 
+ATOM   3136 N N   . ALA B 1 94  ? -6.058  42.826  61.223  1.00 10.22 ? ? ? ? ? ? 584 ALA B N   1 
+ATOM   3137 C CA  . ALA B 1 94  ? -7.444  43.257  61.084  1.00 10.59 ? ? ? ? ? ? 584 ALA B CA  1 
+ATOM   3138 C C   . ALA B 1 94  ? -8.355  42.357  61.926  1.00 9.92  ? ? ? ? ? ? 584 ALA B C   1 
+ATOM   3139 O O   . ALA B 1 94  ? -9.291  42.849  62.563  1.00 10.24 ? ? ? ? ? ? 584 ALA B O   1 
+ATOM   3140 C CB  . ALA B 1 94  ? -7.879  43.213  59.633  1.00 10.82 ? ? ? ? ? ? 584 ALA B CB  1 
+ATOM   3141 N N   . PHE B 1 95  ? -8.091  41.049  61.886  1.00 9.55  ? ? ? ? ? ? 585 PHE B N   1 
+ATOM   3142 C CA  . PHE B 1 95  ? -8.855  40.065  62.666  1.00 10.43 ? ? ? ? ? ? 585 PHE B CA  1 
+ATOM   3143 C C   . PHE B 1 95  ? -8.709  40.367  64.174  1.00 10.92 ? ? ? ? ? ? 585 PHE B C   1 
+ATOM   3144 O O   . PHE B 1 95  ? -9.720  40.415  64.901  1.00 10.36 ? ? ? ? ? ? 585 PHE B O   1 
+ATOM   3145 C CB  . PHE B 1 95  ? -8.371  38.657  62.318  1.00 10.60 ? ? ? ? ? ? 585 PHE B CB  1 
+ATOM   3146 C CG  . PHE B 1 95  ? -8.915  37.569  63.208  1.00 11.63 ? ? ? ? ? ? 585 PHE B CG  1 
+ATOM   3147 C CD1 . PHE B 1 95  ? -10.128 36.952  62.926  1.00 12.20 ? ? ? ? ? ? 585 PHE B CD1 1 
+ATOM   3148 C CD2 . PHE B 1 95  ? -8.183  37.122  64.306  1.00 13.33 ? ? ? ? ? ? 585 PHE B CD2 1 
+ATOM   3149 C CE1 . PHE B 1 95  ? -10.609 35.897  63.733  1.00 12.06 ? ? ? ? ? ? 585 PHE B CE1 1 
+ATOM   3150 C CE2 . PHE B 1 95  ? -8.668  36.065  65.111  1.00 12.97 ? ? ? ? ? ? 585 PHE B CE2 1 
+ATOM   3151 C CZ  . PHE B 1 95  ? -9.874  35.473  64.810  1.00 11.81 ? ? ? ? ? ? 585 PHE B CZ  1 
+ATOM   3152 N N   . ALA B 1 96  ? -7.467  40.631  64.620  1.00 10.74 ? ? ? ? ? ? 586 ALA B N   1 
+ATOM   3153 C CA  . ALA B 1 96  ? -7.161  40.952  66.032  1.00 11.28 ? ? ? ? ? ? 586 ALA B CA  1 
+ATOM   3154 C C   . ALA B 1 96  ? -7.943  42.190  66.455  1.00 12.87 ? ? ? ? ? ? 586 ALA B C   1 
+ATOM   3155 O O   . ALA B 1 96  ? -8.618  42.198  67.494  1.00 12.68 ? ? ? ? ? ? 586 ALA B O   1 
+ATOM   3156 C CB  . ALA B 1 96  ? -5.675  41.195  66.227  1.00 10.15 ? ? ? ? ? ? 586 ALA B CB  1 
+ATOM   3157 N N   . GLU B 1 97  ? -7.955  43.193  65.588  1.00 13.10 ? ? ? ? ? ? 587 GLU B N   1 
+ATOM   3158 C CA  . GLU B 1 97  ? -8.655  44.411  65.884  1.00 15.27 ? ? ? ? ? ? 587 GLU B CA  1 
+ATOM   3159 C C   . GLU B 1 97  ? -10.167 44.269  66.008  1.00 14.49 ? ? ? ? ? ? 587 GLU B C   1 
+ATOM   3160 O O   . GLU B 1 97  ? -10.742 44.837  66.924  1.00 15.69 ? ? ? ? ? ? 587 GLU B O   1 
+ATOM   3161 C CB  . GLU B 1 97  ? -8.245  45.495  64.893  1.00 19.03 ? ? ? ? ? ? 587 GLU B CB  1 
+ATOM   3162 C CG  . GLU B 1 97  ? -6.757  45.847  65.079  1.00 24.09 ? ? ? ? ? ? 587 GLU B CG  1 
+ATOM   3163 C CD  . GLU B 1 97  ? -6.309  47.080  64.310  1.00 27.46 ? ? ? ? ? ? 587 GLU B CD  1 
+ATOM   3164 O OE1 . GLU B 1 97  ? -6.821  47.329  63.191  1.00 29.14 ? ? ? ? ? ? 587 GLU B OE1 1 
+ATOM   3165 O OE2 . GLU B 1 97  ? -5.407  47.781  64.827  1.00 30.35 ? ? ? ? ? ? 587 GLU B OE2 1 
+ATOM   3166 N N   . ARG B 1 98  ? -10.829 43.502  65.151  1.00 13.75 ? ? ? ? ? ? 588 ARG B N   1 
+ATOM   3167 C CA  . ARG B 1 98  ? -12.291 43.382  65.310  1.00 15.26 ? ? ? ? ? ? 588 ARG B CA  1 
+ATOM   3168 C C   . ARG B 1 98  ? -12.698 42.413  66.457  1.00 14.57 ? ? ? ? ? ? 588 ARG B C   1 
+ATOM   3169 O O   . ARG B 1 98  ? -13.887 42.309  66.814  1.00 13.80 ? ? ? ? ? ? 588 ARG B O   1 
+ATOM   3170 C CB  . ARG B 1 98  ? -12.978 43.011  63.975  1.00 17.60 ? ? ? ? ? ? 588 ARG B CB  1 
+ATOM   3171 C CG  . ARG B 1 98  ? -13.005 41.557  63.616  1.00 19.93 ? ? ? ? ? ? 588 ARG B CG  1 
+ATOM   3172 C CD  . ARG B 1 98  ? -13.743 41.335  62.278  1.00 23.51 ? ? ? ? ? ? 588 ARG B CD  1 
+ATOM   3173 N NE  . ARG B 1 98  ? -12.777 41.482  61.201  1.00 27.19 ? ? ? ? ? ? 588 ARG B NE  1 
+ATOM   3174 C CZ  . ARG B 1 98  ? -12.258 40.475  60.494  1.00 27.07 ? ? ? ? ? ? 588 ARG B CZ  1 
+ATOM   3175 N NH1 . ARG B 1 98  ? -12.650 39.225  60.691  1.00 27.91 ? ? ? ? ? ? 588 ARG B NH1 1 
+ATOM   3176 N NH2 . ARG B 1 98  ? -11.164 40.685  59.781  1.00 27.30 ? ? ? ? ? ? 588 ARG B NH2 1 
+ATOM   3177 N N   . ASN B 1 99  ? -11.705 41.730  67.042  1.00 13.38 ? ? ? ? ? ? 589 ASN B N   1 
+ATOM   3178 C CA  . ASN B 1 99  ? -11.946 40.795  68.147  1.00 12.25 ? ? ? ? ? ? 589 ASN B CA  1 
+ATOM   3179 C C   . ASN B 1 99  ? -11.363 41.226  69.480  1.00 12.64 ? ? ? ? ? ? 589 ASN B C   1 
+ATOM   3180 O O   . ASN B 1 99  ? -11.353 40.456  70.436  1.00 13.35 ? ? ? ? ? ? 589 ASN B O   1 
+ATOM   3181 C CB  . ASN B 1 99  ? -11.505 39.389  67.768  1.00 11.07 ? ? ? ? ? ? 589 ASN B CB  1 
+ATOM   3182 C CG  . ASN B 1 99  ? -12.458 38.761  66.796  1.00 12.80 ? ? ? ? ? ? 589 ASN B CG  1 
+ATOM   3183 O OD1 . ASN B 1 99  ? -13.597 38.486  67.156  1.00 14.86 ? ? ? ? ? ? 589 ASN B OD1 1 
+ATOM   3184 N ND2 . ASN B 1 99  ? -12.041 38.599  65.539  1.00 12.82 ? ? ? ? ? ? 589 ASN B ND2 1 
+ATOM   3185 N N   . GLY B 1 100 ? -10.959 42.489  69.552  1.00 12.24 ? ? ? ? ? ? 590 GLY B N   1 
+ATOM   3186 C CA  . GLY B 1 100 ? -10.402 43.037  70.769  1.00 13.06 ? ? ? ? ? ? 590 GLY B CA  1 
+ATOM   3187 C C   . GLY B 1 100 ? -9.165  42.323  71.280  1.00 14.24 ? ? ? ? ? ? 590 GLY B C   1 
+ATOM   3188 O O   . GLY B 1 100 ? -8.971  42.228  72.499  1.00 16.23 ? ? ? ? ? ? 590 GLY B O   1 
+ATOM   3189 N N   . MET B 1 101 ? -8.317  41.850  70.370  1.00 12.92 ? ? ? ? ? ? 591 MET B N   1 
+ATOM   3190 C CA  . MET B 1 101 ? -7.096  41.155  70.737  1.00 12.23 ? ? ? ? ? ? 591 MET B CA  1 
+ATOM   3191 C C   . MET B 1 101 ? -5.851  42.000  70.511  1.00 12.53 ? ? ? ? ? ? 591 MET B C   1 
+ATOM   3192 O O   . MET B 1 101 ? -5.845  42.905  69.680  1.00 13.18 ? ? ? ? ? ? 591 MET B O   1 
+ATOM   3193 C CB  . MET B 1 101 ? -6.951  39.900  69.896  1.00 13.10 ? ? ? ? ? ? 591 MET B CB  1 
+ATOM   3194 C CG  . MET B 1 101 ? -8.140  38.974  69.927  1.00 13.60 ? ? ? ? ? ? 591 MET B CG  1 
+ATOM   3195 S SD  . MET B 1 101 ? -7.858  37.701  68.741  1.00 17.58 ? ? ? ? ? ? 591 MET B SD  1 
+ATOM   3196 C CE  . MET B 1 101 ? -9.104  36.592  69.158  1.00 18.39 ? ? ? ? ? ? 591 MET B CE  1 
+ATOM   3197 N N   . GLN B 1 102 ? -4.795  41.684  71.251  1.00 12.34 ? ? ? ? ? ? 592 GLN B N   1 
+ATOM   3198 C CA  . GLN B 1 102 ? -3.506  42.340  71.095  1.00 13.25 ? ? ? ? ? ? 592 GLN B CA  1 
+ATOM   3199 C C   . GLN B 1 102 ? -2.660  41.381  70.277  1.00 12.33 ? ? ? ? ? ? 592 GLN B C   1 
+ATOM   3200 O O   . GLN B 1 102 ? -3.027  40.226  70.102  1.00 11.66 ? ? ? ? ? ? 592 GLN B O   1 
+ATOM   3201 C CB  . GLN B 1 102 ? -2.848  42.633  72.445  1.00 15.63 ? ? ? ? ? ? 592 GLN B CB  1 
+ATOM   3202 C CG  . GLN B 1 102 ? -3.569  43.731  73.231  1.00 19.61 ? ? ? ? ? ? 592 GLN B CG  1 
+ATOM   3203 C CD  . GLN B 1 102 ? -2.866  44.121  74.522  1.00 23.55 ? ? ? ? ? ? 592 GLN B CD  1 
+ATOM   3204 O OE1 . GLN B 1 102 ? -2.036  43.369  75.062  1.00 26.20 ? ? ? ? ? ? 592 GLN B OE1 1 
+ATOM   3205 N NE2 . GLN B 1 102 ? -3.182  45.312  75.021  1.00 25.51 ? ? ? ? ? ? 592 GLN B NE2 1 
+ATOM   3206 N N   . MET B 1 103 ? -1.548  41.879  69.743  1.00 12.73 ? ? ? ? ? ? 593 MET B N   1 
+ATOM   3207 C CA  . MET B 1 103 ? -0.678  41.082  68.892  1.00 13.26 ? ? ? ? ? ? 593 MET B CA  1 
+ATOM   3208 C C   . MET B 1 103 ? 0.787   41.200  69.262  1.00 11.84 ? ? ? ? ? ? 593 MET B C   1 
+ATOM   3209 O O   . MET B 1 103 ? 1.217   42.265  69.673  1.00 13.73 ? ? ? ? ? ? 593 MET B O   1 
+ATOM   3210 C CB  . MET B 1 103 ? -0.876  41.574  67.445  1.00 15.33 ? ? ? ? ? ? 593 MET B CB  1 
+ATOM   3211 C CG  . MET B 1 103 ? -0.193  40.760  66.367  1.00 18.86 ? ? ? ? ? ? 593 MET B CG  1 
+ATOM   3212 S SD  . MET B 1 103 ? -0.944  41.203  64.777  1.00 21.56 ? ? ? ? ? ? 593 MET B SD  1 
+ATOM   3213 C CE  . MET B 1 103 ? 0.054   40.297  63.672  1.00 23.32 ? ? ? ? ? ? 593 MET B CE  1 
+ATOM   3214 N N   . ARG B 1 104 ? 1.526   40.091  69.192  1.00 10.21 ? ? ? ? ? ? 594 ARG B N   1 
+ATOM   3215 C CA  . ARG B 1 104 ? 2.981   40.114  69.413  1.00 10.05 ? ? ? ? ? ? 594 ARG B CA  1 
+ATOM   3216 C C   . ARG B 1 104 ? 3.608   39.971  68.005  1.00 10.64 ? ? ? ? ? ? 594 ARG B C   1 
+ATOM   3217 O O   . ARG B 1 104 ? 3.061   39.263  67.153  1.00 11.00 ? ? ? ? ? ? 594 ARG B O   1 
+ATOM   3218 C CB  . ARG B 1 104 ? 3.468   38.924  70.269  1.00 10.64 ? ? ? ? ? ? 594 ARG B CB  1 
+ATOM   3219 C CG  . ARG B 1 104 ? 2.907   38.829  71.701  1.00 9.93  ? ? ? ? ? ? 594 ARG B CG  1 
+ATOM   3220 C CD  . ARG B 1 104 ? 3.654   37.749  72.492  1.00 9.45  ? ? ? ? ? ? 594 ARG B CD  1 
+ATOM   3221 N NE  . ARG B 1 104 ? 4.915   38.253  73.044  1.00 9.36  ? ? ? ? ? ? 594 ARG B NE  1 
+ATOM   3222 C CZ  . ARG B 1 104 ? 6.136   37.919  72.616  1.00 9.01  ? ? ? ? ? ? 594 ARG B CZ  1 
+ATOM   3223 N NH1 . ARG B 1 104 ? 6.313   37.046  71.612  1.00 8.26  ? ? ? ? ? ? 594 ARG B NH1 1 
+ATOM   3224 N NH2 . ARG B 1 104 ? 7.204   38.532  73.149  1.00 10.25 ? ? ? ? ? ? 594 ARG B NH2 1 
+ATOM   3225 N N   . GLY B 1 105 ? 4.760   40.610  67.784  1.00 8.77  ? ? ? ? ? ? 595 GLY B N   1 
+ATOM   3226 C CA  . GLY B 1 105 ? 5.445   40.517  66.503  1.00 8.49  ? ? ? ? ? ? 595 GLY B CA  1 
+ATOM   3227 C C   . GLY B 1 105 ? 6.554   39.488  66.648  1.00 8.79  ? ? ? ? ? ? 595 GLY B C   1 
+ATOM   3228 O O   . GLY B 1 105 ? 7.393   39.586  67.532  1.00 10.49 ? ? ? ? ? ? 595 GLY B O   1 
+ATOM   3229 N N   . HIS B 1 106 ? 6.600   38.516  65.762  1.00 9.22  ? ? ? ? ? ? 596 HIS B N   1 
+ATOM   3230 C CA  . HIS B 1 106 ? 7.590   37.453  65.843  1.00 9.60  ? ? ? ? ? ? 596 HIS B CA  1 
+ATOM   3231 C C   . HIS B 1 106 ? 8.020   37.154  64.396  1.00 9.76  ? ? ? ? ? ? 596 HIS B C   1 
+ATOM   3232 O O   . HIS B 1 106 ? 7.191   36.683  63.601  1.00 10.71 ? ? ? ? ? ? 596 HIS B O   1 
+ATOM   3233 C CB  . HIS B 1 106 ? 6.889   36.233  66.489  1.00 10.63 ? ? ? ? ? ? 596 HIS B CB  1 
+ATOM   3234 C CG  . HIS B 1 106 ? 7.743   35.013  66.588  1.00 11.00 ? ? ? ? ? ? 596 HIS B CG  1 
+ATOM   3235 N ND1 . HIS B 1 106 ? 8.725   34.866  67.545  1.00 12.07 ? ? ? ? ? ? 596 HIS B ND1 1 
+ATOM   3236 C CD2 . HIS B 1 106 ? 7.785   33.893  65.832  1.00 12.33 ? ? ? ? ? ? 596 HIS B CD2 1 
+ATOM   3237 C CE1 . HIS B 1 106 ? 9.340   33.712  67.370  1.00 11.28 ? ? ? ? ? ? 596 HIS B CE1 1 
+ATOM   3238 N NE2 . HIS B 1 106 ? 8.791   33.101  66.336  1.00 12.31 ? ? ? ? ? ? 596 HIS B NE2 1 
+ATOM   3239 N N   . THR B 1 107 ? 9.289   37.366  64.029  1.00 9.09  ? ? ? ? ? ? 597 THR B N   1 
+ATOM   3240 C CA  . THR B 1 107 ? 10.404  37.870  64.862  1.00 8.20  ? ? ? ? ? ? 597 THR B CA  1 
+ATOM   3241 C C   . THR B 1 107 ? 11.358  38.515  63.828  1.00 8.37  ? ? ? ? ? ? 597 THR B C   1 
+ATOM   3242 O O   . THR B 1 107 ? 11.420  38.064  62.681  1.00 8.84  ? ? ? ? ? ? 597 THR B O   1 
+ATOM   3243 C CB  . THR B 1 107 ? 11.150  36.695  65.612  1.00 8.91  ? ? ? ? ? ? 597 THR B CB  1 
+ATOM   3244 O OG1 . THR B 1 107 ? 12.288  37.196  66.322  1.00 8.90  ? ? ? ? ? ? 597 THR B OG1 1 
+ATOM   3245 C CG2 . THR B 1 107 ? 11.614  35.573  64.618  1.00 10.72 ? ? ? ? ? ? 597 THR B CG2 1 
+ATOM   3246 N N   . LEU B 1 108 ? 12.155  39.484  64.252  1.00 8.20  ? ? ? ? ? ? 598 LEU B N   1 
+ATOM   3247 C CA  . LEU B 1 108 ? 13.022  40.201  63.320  1.00 8.51  ? ? ? ? ? ? 598 LEU B CA  1 
+ATOM   3248 C C   . LEU B 1 108 ? 14.347  39.561  62.955  1.00 9.00  ? ? ? ? ? ? 598 LEU B C   1 
+ATOM   3249 O O   . LEU B 1 108 ? 14.584  39.230  61.790  1.00 11.01 ? ? ? ? ? ? 598 LEU B O   1 
+ATOM   3250 C CB  . LEU B 1 108 ? 13.205  41.658  63.808  1.00 8.63  ? ? ? ? ? ? 598 LEU B CB  1 
+ATOM   3251 C CG  . LEU B 1 108 ? 11.890  42.447  63.943  1.00 9.80  ? ? ? ? ? ? 598 LEU B CG  1 
+ATOM   3252 C CD1 . LEU B 1 108 ? 12.060  43.724  64.758  1.00 10.76 ? ? ? ? ? ? 598 LEU B CD1 1 
+ATOM   3253 C CD2 . LEU B 1 108 ? 11.312  42.770  62.537  1.00 11.66 ? ? ? ? ? ? 598 LEU B CD2 1 
+ATOM   3254 N N   . ILE B 1 109 ? 15.186  39.324  63.951  1.00 8.83  ? ? ? ? ? ? 599 ILE B N   1 
+ATOM   3255 C CA  . ILE B 1 109 ? 16.526  38.802  63.730  1.00 10.11 ? ? ? ? ? ? 599 ILE B CA  1 
+ATOM   3256 C C   . ILE B 1 109 ? 16.640  37.380  64.287  1.00 11.26 ? ? ? ? ? ? 599 ILE B C   1 
+ATOM   3257 O O   . ILE B 1 109 ? 16.536  37.181  65.510  1.00 11.64 ? ? ? ? ? ? 599 ILE B O   1 
+ATOM   3258 C CB  . ILE B 1 109 ? 17.560  39.752  64.443  1.00 11.43 ? ? ? ? ? ? 599 ILE B CB  1 
+ATOM   3259 C CG1 . ILE B 1 109 ? 17.374  41.210  63.985  1.00 12.37 ? ? ? ? ? ? 599 ILE B CG1 1 
+ATOM   3260 C CG2 . ILE B 1 109 ? 18.978  39.250  64.287  1.00 12.44 ? ? ? ? ? ? 599 ILE B CG2 1 
+ATOM   3261 C CD1 . ILE B 1 109 ? 17.391  41.424  62.477  1.00 14.29 ? ? ? ? ? ? 599 ILE B CD1 1 
+ATOM   3262 N N   . TRP B 1 110 ? 16.924  36.423  63.410  1.00 10.90 ? ? ? ? ? ? 600 TRP B N   1 
+ATOM   3263 C CA  . TRP B 1 110 ? 17.030  35.023  63.794  1.00 12.03 ? ? ? ? ? ? 600 TRP B CA  1 
+ATOM   3264 C C   . TRP B 1 110 ? 18.036  34.365  62.829  1.00 14.26 ? ? ? ? ? ? 600 TRP B C   1 
+ATOM   3265 O O   . TRP B 1 110 ? 18.325  34.905  61.741  1.00 13.38 ? ? ? ? ? ? 600 TRP B O   1 
+ATOM   3266 C CB  . TRP B 1 110 ? 15.651  34.422  63.642  1.00 12.38 ? ? ? ? ? ? 600 TRP B CB  1 
+ATOM   3267 C CG  . TRP B 1 110 ? 15.472  33.058  64.149  1.00 14.20 ? ? ? ? ? ? 600 TRP B CG  1 
+ATOM   3268 C CD1 . TRP B 1 110 ? 16.160  32.425  65.163  1.00 13.82 ? ? ? ? ? ? 600 TRP B CD1 1 
+ATOM   3269 C CD2 . TRP B 1 110 ? 14.463  32.156  63.721  1.00 14.94 ? ? ? ? ? ? 600 TRP B CD2 1 
+ATOM   3270 N NE1 . TRP B 1 110 ? 15.614  31.172  65.392  1.00 13.80 ? ? ? ? ? ? 600 TRP B NE1 1 
+ATOM   3271 C CE2 . TRP B 1 110 ? 14.572  30.985  64.519  1.00 14.98 ? ? ? ? ? ? 600 TRP B CE2 1 
+ATOM   3272 C CE3 . TRP B 1 110 ? 13.465  32.223  62.740  1.00 16.49 ? ? ? ? ? ? 600 TRP B CE3 1 
+ATOM   3273 C CZ2 . TRP B 1 110 ? 13.711  29.894  64.356  1.00 16.58 ? ? ? ? ? ? 600 TRP B CZ2 1 
+ATOM   3274 C CZ3 . TRP B 1 110 ? 12.611  31.142  62.581  1.00 17.30 ? ? ? ? ? ? 600 TRP B CZ3 1 
+ATOM   3275 C CH2 . TRP B 1 110 ? 12.738  29.989  63.387  1.00 17.23 ? ? ? ? ? ? 600 TRP B CH2 1 
+ATOM   3276 N N   . HIS B 1 111 ? 18.620  33.235  63.237  1.00 14.82 ? ? ? ? ? ? 601 HIS B N   1 
+ATOM   3277 C CA  . HIS B 1 111 ? 19.606  32.537  62.392  1.00 15.97 ? ? ? ? ? ? 601 HIS B CA  1 
+ATOM   3278 C C   . HIS B 1 111 ? 18.939  31.582  61.413  1.00 16.70 ? ? ? ? ? ? 601 HIS B C   1 
+ATOM   3279 O O   . HIS B 1 111 ? 19.577  31.100  60.485  1.00 18.39 ? ? ? ? ? ? 601 HIS B O   1 
+ATOM   3280 C CB  . HIS B 1 111 ? 20.634  31.790  63.260  1.00 16.03 ? ? ? ? ? ? 601 HIS B CB  1 
+ATOM   3281 C CG  . HIS B 1 111 ? 20.015  30.812  64.207  1.00 16.82 ? ? ? ? ? ? 601 HIS B CG  1 
+ATOM   3282 N ND1 . HIS B 1 111 ? 20.014  29.449  63.982  1.00 18.27 ? ? ? ? ? ? 601 HIS B ND1 1 
+ATOM   3283 C CD2 . HIS B 1 111 ? 19.322  31.006  65.358  1.00 16.42 ? ? ? ? ? ? 601 HIS B CD2 1 
+ATOM   3284 C CE1 . HIS B 1 111 ? 19.340  28.849  64.953  1.00 16.48 ? ? ? ? ? ? 601 HIS B CE1 1 
+ATOM   3285 N NE2 . HIS B 1 111 ? 18.913  29.770  65.799  1.00 17.05 ? ? ? ? ? ? 601 HIS B NE2 1 
+ATOM   3286 N N   . ASN B 1 112 ? 17.654  31.322  61.605  1.00 18.55 ? ? ? ? ? ? 602 ASN B N   1 
+ATOM   3287 C CA  . ASN B 1 112 ? 16.904  30.424  60.719  1.00 22.20 ? ? ? ? ? ? 602 ASN B CA  1 
+ATOM   3288 C C   . ASN B 1 112 ? 15.886  31.201  59.871  1.00 21.73 ? ? ? ? ? ? 602 ASN B C   1 
+ATOM   3289 O O   . ASN B 1 112 ? 15.471  32.314  60.226  1.00 20.04 ? ? ? ? ? ? 602 ASN B O   1 
+ATOM   3290 C CB  . ASN B 1 112 ? 16.079  29.421  61.532  1.00 25.77 ? ? ? ? ? ? 602 ASN B CB  1 
+ATOM   3291 C CG  . ASN B 1 112 ? 16.830  28.157  61.879  1.00 30.10 ? ? ? ? ? ? 602 ASN B CG  1 
+ATOM   3292 O OD1 . ASN B 1 112 ? 17.846  27.806  61.256  1.00 32.36 ? ? ? ? ? ? 602 ASN B OD1 1 
+ATOM   3293 N ND2 . ASN B 1 112 ? 16.314  27.437  62.890  1.00 31.87 ? ? ? ? ? ? 602 ASN B ND2 1 
+ATOM   3294 N N   . GLN B 1 113 ? 15.406  30.534  58.826  1.00 22.42 ? ? ? ? ? ? 603 GLN B N   1 
+ATOM   3295 C CA  . GLN B 1 113 ? 14.395  31.091  57.944  1.00 24.17 ? ? ? ? ? ? 603 GLN B CA  1 
+ATOM   3296 C C   . GLN B 1 113 ? 14.753  32.450  57.347  1.00 21.86 ? ? ? ? ? ? 603 GLN B C   1 
+ATOM   3297 O O   . GLN B 1 113 ? 13.963  33.410  57.412  1.00 23.34 ? ? ? ? ? ? 603 GLN B O   1 
+ATOM   3298 C CB  . GLN B 1 113 ? 13.018  31.109  58.659  1.00 28.06 ? ? ? ? ? ? 603 GLN B CB  1 
+ATOM   3299 C CG  . GLN B 1 113 ? 12.457  29.672  58.897  1.00 32.58 ? ? ? ? ? ? 603 GLN B CG  1 
+ATOM   3300 C CD  . GLN B 1 113 ? 11.058  29.628  59.532  1.00 35.43 ? ? ? ? ? ? 603 GLN B CD  1 
+ATOM   3301 O OE1 . GLN B 1 113 ? 10.906  29.290  60.723  1.00 36.62 ? ? ? ? ? ? 603 GLN B OE1 1 
+ATOM   3302 N NE2 . GLN B 1 113 ? 10.024  29.934  58.731  1.00 36.92 ? ? ? ? ? ? 603 GLN B NE2 1 
+ATOM   3303 N N   . ASN B 1 114 ? 15.982  32.544  56.846  1.00 18.56 ? ? ? ? ? ? 604 ASN B N   1 
+ATOM   3304 C CA  . ASN B 1 114 ? 16.452  33.767  56.189  1.00 16.23 ? ? ? ? ? ? 604 ASN B CA  1 
+ATOM   3305 C C   . ASN B 1 114 ? 16.356  33.489  54.692  1.00 14.27 ? ? ? ? ? ? 604 ASN B C   1 
+ATOM   3306 O O   . ASN B 1 114 ? 16.548  32.356  54.255  1.00 14.07 ? ? ? ? ? ? 604 ASN B O   1 
+ATOM   3307 C CB  . ASN B 1 114 ? 17.868  34.124  56.631  1.00 14.66 ? ? ? ? ? ? 604 ASN B CB  1 
+ATOM   3308 C CG  . ASN B 1 114 ? 17.877  34.696  58.022  1.00 14.54 ? ? ? ? ? ? 604 ASN B CG  1 
+ATOM   3309 O OD1 . ASN B 1 114 ? 16.996  35.459  58.373  1.00 15.26 ? ? ? ? ? ? 604 ASN B OD1 1 
+ATOM   3310 N ND2 . ASN B 1 114 ? 18.835  34.312  58.817  1.00 13.65 ? ? ? ? ? ? 604 ASN B ND2 1 
+ATOM   3311 N N   . PRO B 1 115 ? 15.978  34.498  53.902  1.00 12.62 ? ? ? ? ? ? 605 PRO B N   1 
+ATOM   3312 C CA  . PRO B 1 115 ? 15.847  34.294  52.449  1.00 12.43 ? ? ? ? ? ? 605 PRO B CA  1 
+ATOM   3313 C C   . PRO B 1 115 ? 17.184  34.127  51.686  1.00 11.59 ? ? ? ? ? ? 605 PRO B C   1 
+ATOM   3314 O O   . PRO B 1 115 ? 18.258  34.534  52.179  1.00 11.15 ? ? ? ? ? ? 605 PRO B O   1 
+ATOM   3315 C CB  . PRO B 1 115 ? 15.009  35.500  52.017  1.00 11.99 ? ? ? ? ? ? 605 PRO B CB  1 
+ATOM   3316 C CG  . PRO B 1 115 ? 15.452  36.579  52.968  1.00 12.18 ? ? ? ? ? ? 605 PRO B CG  1 
+ATOM   3317 C CD  . PRO B 1 115 ? 15.597  35.862  54.304  1.00 12.49 ? ? ? ? ? ? 605 PRO B CD  1 
+ATOM   3318 N N   . SER B 1 116 ? 17.127  33.458  50.529  1.00 11.63 ? ? ? ? ? ? 606 SER B N   1 
+ATOM   3319 C CA  . SER B 1 116 ? 18.337  33.195  49.724  1.00 13.09 ? ? ? ? ? ? 606 SER B CA  1 
+ATOM   3320 C C   . SER B 1 116 ? 19.207  34.435  49.438  1.00 11.53 ? ? ? ? ? ? 606 SER B C   1 
+ATOM   3321 O O   . SER B 1 116 ? 20.438  34.342  49.427  1.00 11.82 ? ? ? ? ? ? 606 SER B O   1 
+ATOM   3322 C CB  . SER B 1 116 ? 17.971  32.541  48.371  1.00 14.79 ? ? ? ? ? ? 606 SER B CB  1 
+ATOM   3323 O OG  . SER B 1 116 ? 17.408  31.259  48.555  1.00 19.63 ? ? ? ? ? ? 606 SER B OG  1 
+ATOM   3324 N N   . TRP B 1 117 ? 18.571  35.580  49.169  1.00 10.84 ? ? ? ? ? ? 607 TRP B N   1 
+ATOM   3325 C CA  . TRP B 1 117 ? 19.337  36.792  48.860  1.00 10.78 ? ? ? ? ? ? 607 TRP B CA  1 
+ATOM   3326 C C   . TRP B 1 117 ? 20.232  37.238  50.018  1.00 11.36 ? ? ? ? ? ? 607 TRP B C   1 
+ATOM   3327 O O   . TRP B 1 117 ? 21.290  37.820  49.807  1.00 11.47 ? ? ? ? ? ? 607 TRP B O   1 
+ATOM   3328 C CB  . TRP B 1 117 ? 18.422  37.947  48.393  1.00 10.08 ? ? ? ? ? ? 607 TRP B CB  1 
+ATOM   3329 C CG  . TRP B 1 117 ? 17.477  38.512  49.407  1.00 8.88  ? ? ? ? ? ? 607 TRP B CG  1 
+ATOM   3330 C CD1 . TRP B 1 117 ? 16.163  38.150  49.602  1.00 9.55  ? ? ? ? ? ? 607 TRP B CD1 1 
+ATOM   3331 C CD2 . TRP B 1 117 ? 17.740  39.576  50.337  1.00 8.90  ? ? ? ? ? ? 607 TRP B CD2 1 
+ATOM   3332 N NE1 . TRP B 1 117 ? 15.608  38.932  50.585  1.00 9.12  ? ? ? ? ? ? 607 TRP B NE1 1 
+ATOM   3333 C CE2 . TRP B 1 117 ? 16.547  39.810  51.054  1.00 8.32  ? ? ? ? ? ? 607 TRP B CE2 1 
+ATOM   3334 C CE3 . TRP B 1 117 ? 18.876  40.353  50.636  1.00 8.99  ? ? ? ? ? ? 607 TRP B CE3 1 
+ATOM   3335 C CZ2 . TRP B 1 117 ? 16.453  40.785  52.045  1.00 9.61  ? ? ? ? ? ? 607 TRP B CZ2 1 
+ATOM   3336 C CZ3 . TRP B 1 117 ? 18.784  41.323  51.624  1.00 9.37  ? ? ? ? ? ? 607 TRP B CZ3 1 
+ATOM   3337 C CH2 . TRP B 1 117 ? 17.579  41.532  52.316  1.00 9.92  ? ? ? ? ? ? 607 TRP B CH2 1 
+ATOM   3338 N N   . LEU B 1 118 ? 19.802  36.940  51.241  1.00 10.63 ? ? ? ? ? ? 608 LEU B N   1 
+ATOM   3339 C CA  . LEU B 1 118 ? 20.568  37.315  52.421  1.00 11.95 ? ? ? ? ? ? 608 LEU B CA  1 
+ATOM   3340 C C   . LEU B 1 118 ? 21.662  36.276  52.695  1.00 13.48 ? ? ? ? ? ? 608 LEU B C   1 
+ATOM   3341 O O   . LEU B 1 118 ? 22.845  36.608  52.782  1.00 14.42 ? ? ? ? ? ? 608 LEU B O   1 
+ATOM   3342 C CB  . LEU B 1 118 ? 19.651  37.405  53.645  1.00 13.18 ? ? ? ? ? ? 608 LEU B CB  1 
+ATOM   3343 C CG  . LEU B 1 118 ? 20.318  37.931  54.908  1.00 14.66 ? ? ? ? ? ? 608 LEU B CG  1 
+ATOM   3344 C CD1 . LEU B 1 118 ? 20.522  39.419  54.731  1.00 15.22 ? ? ? ? ? ? 608 LEU B CD1 1 
+ATOM   3345 C CD2 . LEU B 1 118 ? 19.417  37.670  56.097  1.00 15.06 ? ? ? ? ? ? 608 LEU B CD2 1 
+ATOM   3346 N N   . THR B 1 119 ? 21.281  35.012  52.809  1.00 14.31 ? ? ? ? ? ? 609 THR B N   1 
+ATOM   3347 C CA  . THR B 1 119 ? 22.273  33.999  53.110  1.00 16.90 ? ? ? ? ? ? 609 THR B CA  1 
+ATOM   3348 C C   . THR B 1 119 ? 23.336  33.796  52.003  1.00 18.62 ? ? ? ? ? ? 609 THR B C   1 
+ATOM   3349 O O   . THR B 1 119 ? 24.489  33.476  52.328  1.00 20.10 ? ? ? ? ? ? 609 THR B O   1 
+ATOM   3350 C CB  . THR B 1 119 ? 21.598  32.684  53.478  1.00 17.54 ? ? ? ? ? ? 609 THR B CB  1 
+ATOM   3351 O OG1 . THR B 1 119 ? 20.902  32.169  52.341  1.00 20.42 ? ? ? ? ? ? 609 THR B OG1 1 
+ATOM   3352 C CG2 . THR B 1 119 ? 20.595  32.916  54.564  1.00 17.40 ? ? ? ? ? ? 609 THR B CG2 1 
+ATOM   3353 N N   . ASN B 1 120 ? 22.956  33.995  50.728  1.00 19.14 ? ? ? ? ? ? 610 ASN B N   1 
+ATOM   3354 C CA  . ASN B 1 120 ? 23.870  33.844  49.586  1.00 20.57 ? ? ? ? ? ? 610 ASN B CA  1 
+ATOM   3355 C C   . ASN B 1 120 ? 24.534  35.168  49.153  1.00 21.37 ? ? ? ? ? ? 610 ASN B C   1 
+ATOM   3356 O O   . ASN B 1 120 ? 25.362  35.178  48.236  1.00 21.86 ? ? ? ? ? ? 610 ASN B O   1 
+ATOM   3357 C CB  . ASN B 1 120 ? 23.144  33.229  48.375  1.00 22.27 ? ? ? ? ? ? 610 ASN B CB  1 
+ATOM   3358 C CG  . ASN B 1 120 ? 22.830  31.750  48.562  1.00 24.14 ? ? ? ? ? ? 610 ASN B CG  1 
+ATOM   3359 O OD1 . ASN B 1 120 ? 23.452  31.068  49.365  1.00 27.27 ? ? ? ? ? ? 610 ASN B OD1 1 
+ATOM   3360 N ND2 . ASN B 1 120 ? 21.861  31.254  47.825  1.00 25.02 ? ? ? ? ? ? 610 ASN B ND2 1 
+ATOM   3361 N N   . GLY B 1 121 ? 24.217  36.259  49.850  1.00 20.88 ? ? ? ? ? ? 611 GLY B N   1 
+ATOM   3362 C CA  . GLY B 1 121 ? 24.757  37.566  49.522  1.00 21.33 ? ? ? ? ? ? 611 GLY B CA  1 
+ATOM   3363 C C   . GLY B 1 121 ? 26.205  37.781  49.886  1.00 22.66 ? ? ? ? ? ? 611 GLY B C   1 
+ATOM   3364 O O   . GLY B 1 121 ? 26.801  36.991  50.600  1.00 23.60 ? ? ? ? ? ? 611 GLY B O   1 
+ATOM   3365 N N   . ASN B 1 122 ? 26.759  38.889  49.417  1.00 24.10 ? ? ? ? ? ? 612 ASN B N   1 
+ATOM   3366 C CA  . ASN B 1 122 ? 28.155  39.252  49.663  1.00 26.44 ? ? ? ? ? ? 612 ASN B CA  1 
+ATOM   3367 C C   . ASN B 1 122 ? 28.138  40.470  50.617  1.00 23.91 ? ? ? ? ? ? 612 ASN B C   1 
+ATOM   3368 O O   . ASN B 1 122 ? 27.817  41.585  50.189  1.00 24.46 ? ? ? ? ? ? 612 ASN B O   1 
+ATOM   3369 C CB  . ASN B 1 122 ? 28.787  39.595  48.306  1.00 31.28 ? ? ? ? ? ? 612 ASN B CB  1 
+ATOM   3370 C CG  . ASN B 1 122 ? 30.264  39.882  48.408  1.00 35.70 ? ? ? ? ? ? 612 ASN B CG  1 
+ATOM   3371 O OD1 . ASN B 1 122 ? 30.945  39.434  49.353  1.00 37.71 ? ? ? ? ? ? 612 ASN B OD1 1 
+ATOM   3372 N ND2 . ASN B 1 122 ? 30.783  40.643  47.435  1.00 37.58 ? ? ? ? ? ? 612 ASN B ND2 1 
+ATOM   3373 N N   . TRP B 1 123 ? 28.448  40.246  51.902  1.00 20.26 ? ? ? ? ? ? 613 TRP B N   1 
+ATOM   3374 C CA  . TRP B 1 123 ? 28.356  41.304  52.911  1.00 17.27 ? ? ? ? ? ? 613 TRP B CA  1 
+ATOM   3375 C C   . TRP B 1 123 ? 29.598  41.588  53.751  1.00 17.04 ? ? ? ? ? ? 613 TRP B C   1 
+ATOM   3376 O O   . TRP B 1 123 ? 30.480  40.742  53.907  1.00 17.35 ? ? ? ? ? ? 613 TRP B O   1 
+ATOM   3377 C CB  . TRP B 1 123 ? 27.250  40.943  53.944  1.00 15.42 ? ? ? ? ? ? 613 TRP B CB  1 
+ATOM   3378 C CG  . TRP B 1 123 ? 25.958  40.450  53.374  1.00 13.60 ? ? ? ? ? ? 613 TRP B CG  1 
+ATOM   3379 C CD1 . TRP B 1 123 ? 25.508  39.167  53.381  1.00 13.57 ? ? ? ? ? ? 613 TRP B CD1 1 
+ATOM   3380 C CD2 . TRP B 1 123 ? 24.971  41.218  52.671  1.00 12.63 ? ? ? ? ? ? 613 TRP B CD2 1 
+ATOM   3381 N NE1 . TRP B 1 123 ? 24.310  39.079  52.720  1.00 13.40 ? ? ? ? ? ? 613 TRP B NE1 1 
+ATOM   3382 C CE2 . TRP B 1 123 ? 23.955  40.322  52.269  1.00 13.31 ? ? ? ? ? ? 613 TRP B CE2 1 
+ATOM   3383 C CE3 . TRP B 1 123 ? 24.850  42.564  52.341  1.00 12.34 ? ? ? ? ? ? 613 TRP B CE3 1 
+ATOM   3384 C CZ2 . TRP B 1 123 ? 22.833  40.730  51.549  1.00 12.48 ? ? ? ? ? ? 613 TRP B CZ2 1 
+ATOM   3385 C CZ3 . TRP B 1 123 ? 23.726  42.975  51.620  1.00 13.38 ? ? ? ? ? ? 613 TRP B CZ3 1 
+ATOM   3386 C CH2 . TRP B 1 123 ? 22.735  42.056  51.234  1.00 12.79 ? ? ? ? ? ? 613 TRP B CH2 1 
+ATOM   3387 N N   . ASN B 1 124 ? 29.600  42.777  54.346  1.00 15.75 ? ? ? ? ? ? 614 ASN B N   1 
+ATOM   3388 C CA  . ASN B 1 124 ? 30.625  43.164  55.306  1.00 15.68 ? ? ? ? ? ? 614 ASN B CA  1 
+ATOM   3389 C C   . ASN B 1 124 ? 29.832  43.798  56.451  1.00 14.27 ? ? ? ? ? ? 614 ASN B C   1 
+ATOM   3390 O O   . ASN B 1 124 ? 28.601  43.897  56.373  1.00 13.48 ? ? ? ? ? ? 614 ASN B O   1 
+ATOM   3391 C CB  . ASN B 1 124 ? 31.694  44.108  54.720  1.00 17.65 ? ? ? ? ? ? 614 ASN B CB  1 
+ATOM   3392 C CG  . ASN B 1 124 ? 31.102  45.367  54.114  1.00 19.42 ? ? ? ? ? ? 614 ASN B CG  1 
+ATOM   3393 O OD1 . ASN B 1 124 ? 30.322  46.077  54.731  1.00 19.22 ? ? ? ? ? ? 614 ASN B OD1 1 
+ATOM   3394 N ND2 . ASN B 1 124 ? 31.475  45.641  52.875  1.00 22.85 ? ? ? ? ? ? 614 ASN B ND2 1 
+ATOM   3395 N N   . ARG B 1 125 ? 30.510  44.167  57.531  1.00 13.37 ? ? ? ? ? ? 615 ARG B N   1 
+ATOM   3396 C CA  . ARG B 1 125 ? 29.841  44.752  58.691  1.00 13.48 ? ? ? ? ? ? 615 ARG B CA  1 
+ATOM   3397 C C   . ARG B 1 125 ? 28.903  45.944  58.381  1.00 13.87 ? ? ? ? ? ? 615 ARG B C   1 
+ATOM   3398 O O   . ARG B 1 125 ? 27.722  45.943  58.751  1.00 12.60 ? ? ? ? ? ? 615 ARG B O   1 
+ATOM   3399 C CB  . ARG B 1 125 ? 30.895  45.115  59.768  1.00 13.89 ? ? ? ? ? ? 615 ARG B CB  1 
+ATOM   3400 C CG  . ARG B 1 125 ? 30.379  45.998  60.894  1.00 14.47 ? ? ? ? ? ? 615 ARG B CG  1 
+ATOM   3401 C CD  . ARG B 1 125 ? 31.430  46.264  61.969  1.00 14.01 ? ? ? ? ? ? 615 ARG B CD  1 
+ATOM   3402 N NE  . ARG B 1 125 ? 30.941  47.232  62.945  1.00 15.48 ? ? ? ? ? ? 615 ARG B NE  1 
+ATOM   3403 C CZ  . ARG B 1 125 ? 30.514  46.915  64.168  1.00 17.02 ? ? ? ? ? ? 615 ARG B CZ  1 
+ATOM   3404 N NH1 . ARG B 1 125 ? 30.514  45.640  64.590  1.00 17.20 ? ? ? ? ? ? 615 ARG B NH1 1 
+ATOM   3405 N NH2 . ARG B 1 125 ? 30.081  47.868  64.976  1.00 18.41 ? ? ? ? ? ? 615 ARG B NH2 1 
+ATOM   3406 N N   . ASP B 1 126 ? 29.396  46.926  57.631  1.00 13.92 ? ? ? ? ? ? 616 ASP B N   1 
+ATOM   3407 C CA  . ASP B 1 126 ? 28.585  48.107  57.328  1.00 15.04 ? ? ? ? ? ? 616 ASP B CA  1 
+ATOM   3408 C C   . ASP B 1 126 ? 27.403  47.845  56.429  1.00 12.93 ? ? ? ? ? ? 616 ASP B C   1 
+ATOM   3409 O O   . ASP B 1 126 ? 26.339  48.419  56.655  1.00 13.21 ? ? ? ? ? ? 616 ASP B O   1 
+ATOM   3410 C CB  . ASP B 1 126 ? 29.436  49.209  56.704  1.00 19.09 ? ? ? ? ? ? 616 ASP B CB  1 
+ATOM   3411 C CG  . ASP B 1 126 ? 30.622  49.587  57.578  1.00 23.81 ? ? ? ? ? ? 616 ASP B CG  1 
+ATOM   3412 O OD1 . ASP B 1 126 ? 30.442  49.857  58.793  1.00 25.80 ? ? ? ? ? ? 616 ASP B OD1 1 
+ATOM   3413 O OD2 . ASP B 1 126 ? 31.753  49.576  57.048  1.00 27.22 ? ? ? ? ? ? 616 ASP B OD2 1 
+ATOM   3414 N N   . SER B 1 127 ? 27.583  46.993  55.423  1.00 11.41 ? ? ? ? ? ? 617 SER B N   1 
+ATOM   3415 C CA  . SER B 1 127 ? 26.497  46.723  54.507  1.00 11.55 ? ? ? ? ? ? 617 SER B CA  1 
+ATOM   3416 C C   . SER B 1 127 ? 25.436  45.844  55.151  1.00 10.98 ? ? ? ? ? ? 617 SER B C   1 
+ATOM   3417 O O   . SER B 1 127 ? 24.257  46.035  54.874  1.00 11.96 ? ? ? ? ? ? 617 SER B O   1 
+ATOM   3418 C CB  . SER B 1 127 ? 26.955  46.149  53.161  1.00 10.89 ? ? ? ? ? ? 617 SER B CB  1 
+ATOM   3419 O OG  . SER B 1 127 ? 27.612  44.905  53.274  1.00 12.49 ? ? ? ? ? ? 617 SER B OG  1 
+ATOM   3420 N N   . LEU B 1 128 ? 25.839  44.899  56.002  1.00 10.51 ? ? ? ? ? ? 618 LEU B N   1 
+ATOM   3421 C CA  . LEU B 1 128 ? 24.835  44.054  56.669  1.00 9.68  ? ? ? ? ? ? 618 LEU B CA  1 
+ATOM   3422 C C   . LEU B 1 128 ? 24.091  44.854  57.742  1.00 8.95  ? ? ? ? ? ? 618 LEU B C   1 
+ATOM   3423 O O   . LEU B 1 128 ? 22.899  44.644  57.934  1.00 9.53  ? ? ? ? ? ? 618 LEU B O   1 
+ATOM   3424 C CB  . LEU B 1 128 ? 25.422  42.745  57.199  1.00 10.44 ? ? ? ? ? ? 618 LEU B CB  1 
+ATOM   3425 C CG  . LEU B 1 128 ? 24.398  41.681  57.617  1.00 10.22 ? ? ? ? ? ? 618 LEU B CG  1 
+ATOM   3426 C CD1 . LEU B 1 128 ? 23.532  41.244  56.428  1.00 11.19 ? ? ? ? ? ? 618 LEU B CD1 1 
+ATOM   3427 C CD2 . LEU B 1 128 ? 25.167  40.501  58.111  1.00 10.39 ? ? ? ? ? ? 618 LEU B CD2 1 
+ATOM   3428 N N   . LEU B 1 129 ? 24.754  45.803  58.407  1.00 9.27  ? ? ? ? ? ? 619 LEU B N   1 
+ATOM   3429 C CA  . LEU B 1 129 ? 24.065  46.654  59.384  1.00 9.59  ? ? ? ? ? ? 619 LEU B CA  1 
+ATOM   3430 C C   . LEU B 1 129 ? 22.971  47.497  58.695  1.00 9.15  ? ? ? ? ? ? 619 LEU B C   1 
+ATOM   3431 O O   . LEU B 1 129 ? 21.900  47.715  59.254  1.00 9.16  ? ? ? ? ? ? 619 LEU B O   1 
+ATOM   3432 C CB  . LEU B 1 129 ? 25.054  47.576  60.132  1.00 11.47 ? ? ? ? ? ? 619 LEU B CB  1 
+ATOM   3433 C CG  . LEU B 1 129 ? 25.765  47.000  61.370  1.00 12.11 ? ? ? ? ? ? 619 LEU B CG  1 
+ATOM   3434 C CD1 . LEU B 1 129 ? 26.820  48.006  61.875  1.00 13.58 ? ? ? ? ? ? 619 LEU B CD1 1 
+ATOM   3435 C CD2 . LEU B 1 129 ? 24.754  46.731  62.471  1.00 11.52 ? ? ? ? ? ? 619 LEU B CD2 1 
+ATOM   3436 N N   . ALA B 1 130 ? 23.265  47.995  57.481  1.00 10.27 ? ? ? ? ? ? 620 ALA B N   1 
+ATOM   3437 C CA  . ALA B 1 130 ? 22.294  48.791  56.709  1.00 10.21 ? ? ? ? ? ? 620 ALA B CA  1 
+ATOM   3438 C C   . ALA B 1 130 ? 21.080  47.922  56.332  1.00 8.39  ? ? ? ? ? ? 620 ALA B C   1 
+ATOM   3439 O O   . ALA B 1 130 ? 19.964  48.397  56.343  1.00 9.50  ? ? ? ? ? ? 620 ALA B O   1 
+ATOM   3440 C CB  . ALA B 1 130 ? 22.945  49.357  55.454  1.00 10.01 ? ? ? ? ? ? 620 ALA B CB  1 
+ATOM   3441 N N   . VAL B 1 131 ? 21.303  46.665  55.959  1.00 8.16  ? ? ? ? ? ? 621 VAL B N   1 
+ATOM   3442 C CA  . VAL B 1 131 ? 20.194  45.733  55.662  1.00 8.80  ? ? ? ? ? ? 621 VAL B CA  1 
+ATOM   3443 C C   . VAL B 1 131 ? 19.343  45.512  56.946  1.00 9.06  ? ? ? ? ? ? 621 VAL B C   1 
+ATOM   3444 O O   . VAL B 1 131 ? 18.107  45.519  56.886  1.00 8.64  ? ? ? ? ? ? 621 VAL B O   1 
+ATOM   3445 C CB  . VAL B 1 131 ? 20.728  44.378  55.152  1.00 9.89  ? ? ? ? ? ? 621 VAL B CB  1 
+ATOM   3446 C CG1 . VAL B 1 131 ? 19.649  43.294  55.224  1.00 11.35 ? ? ? ? ? ? 621 VAL B CG1 1 
+ATOM   3447 C CG2 . VAL B 1 131 ? 21.225  44.536  53.712  1.00 11.09 ? ? ? ? ? ? 621 VAL B CG2 1 
+ATOM   3448 N N   . MET B 1 132 ? 20.017  45.330  58.090  1.00 8.81  ? ? ? ? ? ? 622 MET B N   1 
+ATOM   3449 C CA  . MET B 1 132 ? 19.328  45.132  59.363  1.00 9.41  ? ? ? ? ? ? 622 MET B CA  1 
+ATOM   3450 C C   . MET B 1 132 ? 18.439  46.329  59.694  1.00 9.19  ? ? ? ? ? ? 622 MET B C   1 
+ATOM   3451 O O   . MET B 1 132 ? 17.255  46.195  60.063  1.00 8.80  ? ? ? ? ? ? 622 MET B O   1 
+ATOM   3452 C CB  . MET B 1 132 ? 20.355  44.923  60.486  1.00 10.30 ? ? ? ? ? ? 622 MET B CB  1 
+ATOM   3453 C CG  . MET B 1 132 ? 19.699  44.714  61.863  1.00 12.65 ? ? ? ? ? ? 622 MET B CG  1 
+ATOM   3454 S SD  . MET B 1 132 ? 20.870  44.771  63.228  1.00 14.79 ? ? ? ? ? ? 622 MET B SD  1 
+ATOM   3455 C CE  . MET B 1 132 ? 21.458  43.241  63.000  1.00 11.02 ? ? ? ? ? ? 622 MET B CE  1 
+ATOM   3456 N N   . LYS B 1 133 ? 19.016  47.517  59.565  1.00 8.91  ? ? ? ? ? ? 623 LYS B N   1 
+ATOM   3457 C CA  . LYS B 1 133 ? 18.293  48.736  59.848  1.00 8.78  ? ? ? ? ? ? 623 LYS B CA  1 
+ATOM   3458 C C   . LYS B 1 133 ? 17.055  48.897  58.951  1.00 7.64  ? ? ? ? ? ? 623 LYS B C   1 
+ATOM   3459 O O   . LYS B 1 133 ? 15.992  49.272  59.414  1.00 9.24  ? ? ? ? ? ? 623 LYS B O   1 
+ATOM   3460 C CB  . LYS B 1 133 ? 19.221  49.939  59.680  1.00 11.10 ? ? ? ? ? ? 623 LYS B CB  1 
+ATOM   3461 C CG  . LYS B 1 133 ? 18.596  51.191  60.201  1.00 15.22 ? ? ? ? ? ? 623 LYS B CG  1 
+ATOM   3462 C CD  . LYS B 1 133 ? 19.573  52.344  60.182  1.00 20.02 ? ? ? ? ? ? 623 LYS B CD  1 
+ATOM   3463 C CE  . LYS B 1 133 ? 19.089  53.456  61.133  1.00 24.04 ? ? ? ? ? ? 623 LYS B CE  1 
+ATOM   3464 N NZ  . LYS B 1 133 ? 17.591  53.702  61.073  1.00 27.21 ? ? ? ? ? ? 623 LYS B NZ  1 
+ATOM   3465 N N   . ASN B 1 134 ? 17.220  48.659  57.659  1.00 7.98  ? ? ? ? ? ? 624 ASN B N   1 
+ATOM   3466 C CA  . ASN B 1 134 ? 16.105  48.809  56.705  1.00 8.10  ? ? ? ? ? ? 624 ASN B CA  1 
+ATOM   3467 C C   . ASN B 1 134 ? 14.957  47.813  57.004  1.00 7.59  ? ? ? ? ? ? 624 ASN B C   1 
+ATOM   3468 O O   . ASN B 1 134 ? 13.769  48.174  56.982  1.00 7.91  ? ? ? ? ? ? 624 ASN B O   1 
+ATOM   3469 C CB  . ASN B 1 134 ? 16.599  48.640  55.251  1.00 9.28  ? ? ? ? ? ? 624 ASN B CB  1 
+ATOM   3470 C CG  . ASN B 1 134 ? 15.500  48.920  54.234  1.00 9.66  ? ? ? ? ? ? 624 ASN B CG  1 
+ATOM   3471 O OD1 . ASN B 1 134 ? 14.875  49.978  54.290  1.00 12.84 ? ? ? ? ? ? 624 ASN B OD1 1 
+ATOM   3472 N ND2 . ASN B 1 134 ? 15.246  47.978  53.319  1.00 10.71 ? ? ? ? ? ? 624 ASN B ND2 1 
+ATOM   3473 N N   . HIS B 1 135 ? 15.317  46.565  57.307  1.00 7.44  ? ? ? ? ? ? 625 HIS B N   1 
+ATOM   3474 C CA  . HIS B 1 135 ? 14.289  45.579  57.609  1.00 7.09  ? ? ? ? ? ? 625 HIS B CA  1 
+ATOM   3475 C C   . HIS B 1 135 ? 13.530  45.945  58.884  1.00 7.40  ? ? ? ? ? ? 625 HIS B C   1 
+ATOM   3476 O O   . HIS B 1 135 ? 12.292  46.024  58.890  1.00 7.62  ? ? ? ? ? ? 625 HIS B O   1 
+ATOM   3477 C CB  . HIS B 1 135 ? 14.881  44.187  57.762  1.00 6.77  ? ? ? ? ? ? 625 HIS B CB  1 
+ATOM   3478 C CG  . HIS B 1 135 ? 13.843  43.125  57.935  1.00 7.67  ? ? ? ? ? ? 625 HIS B CG  1 
+ATOM   3479 N ND1 . HIS B 1 135 ? 13.170  42.557  56.875  1.00 7.14  ? ? ? ? ? ? 625 HIS B ND1 1 
+ATOM   3480 C CD2 . HIS B 1 135 ? 13.347  42.531  59.053  1.00 8.18  ? ? ? ? ? ? 625 HIS B CD2 1 
+ATOM   3481 C CE1 . HIS B 1 135 ? 12.321  41.650  57.325  1.00 7.89  ? ? ? ? ? ? 625 HIS B CE1 1 
+ATOM   3482 N NE2 . HIS B 1 135 ? 12.411  41.616  58.643  1.00 7.36  ? ? ? ? ? ? 625 HIS B NE2 1 
+ATOM   3483 N N   . ILE B 1 136 ? 14.272  46.208  59.951  1.00 7.76  ? ? ? ? ? ? 626 ILE B N   1 
+ATOM   3484 C CA  . ILE B 1 136 ? 13.629  46.529  61.223  1.00 8.23  ? ? ? ? ? ? 626 ILE B CA  1 
+ATOM   3485 C C   . ILE B 1 136 ? 12.755  47.793  61.122  1.00 8.20  ? ? ? ? ? ? 626 ILE B C   1 
+ATOM   3486 O O   . ILE B 1 136 ? 11.598  47.806  61.544  1.00 8.15  ? ? ? ? ? ? 626 ILE B O   1 
+ATOM   3487 C CB  . ILE B 1 136 ? 14.676  46.672  62.347  1.00 7.96  ? ? ? ? ? ? 626 ILE B CB  1 
+ATOM   3488 C CG1 . ILE B 1 136 ? 15.334  45.311  62.625  1.00 7.85  ? ? ? ? ? ? 626 ILE B CG1 1 
+ATOM   3489 C CG2 . ILE B 1 136 ? 14.020  47.292  63.613  1.00 7.56  ? ? ? ? ? ? 626 ILE B CG2 1 
+ATOM   3490 C CD1 . ILE B 1 136 ? 16.495  45.372  63.638  1.00 9.00  ? ? ? ? ? ? 626 ILE B CD1 1 
+ATOM   3491 N N   . THR B 1 137 ? 13.300  48.845  60.512  1.00 8.83  ? ? ? ? ? ? 627 THR B N   1 
+ATOM   3492 C CA  . THR B 1 137 ? 12.569  50.096  60.386  1.00 8.99  ? ? ? ? ? ? 627 THR B CA  1 
+ATOM   3493 C C   . THR B 1 137 ? 11.324  49.968  59.475  1.00 8.25  ? ? ? ? ? ? 627 THR B C   1 
+ATOM   3494 O O   . THR B 1 137 ? 10.229  50.445  59.838  1.00 9.27  ? ? ? ? ? ? 627 THR B O   1 
+ATOM   3495 C CB  . THR B 1 137 ? 13.517  51.253  59.886  1.00 10.23 ? ? ? ? ? ? 627 THR B CB  1 
+ATOM   3496 O OG1 . THR B 1 137 ? 14.685  51.314  60.737  1.00 11.95 ? ? ? ? ? ? 627 THR B OG1 1 
+ATOM   3497 C CG2 . THR B 1 137 ? 12.801  52.614  59.955  1.00 10.44 ? ? ? ? ? ? 627 THR B CG2 1 
+ATOM   3498 N N   . THR B 1 138 ? 11.476  49.343  58.307  1.00 7.56  ? ? ? ? ? ? 628 THR B N   1 
+ATOM   3499 C CA  . THR B 1 138 ? 10.338  49.226  57.385  1.00 7.60  ? ? ? ? ? ? 628 THR B CA  1 
+ATOM   3500 C C   . THR B 1 138 ? 9.200   48.401  57.996  1.00 8.35  ? ? ? ? ? ? 628 THR B C   1 
+ATOM   3501 O O   . THR B 1 138 ? 8.036   48.837  57.987  1.00 10.18 ? ? ? ? ? ? 628 THR B O   1 
+ATOM   3502 C CB  . THR B 1 138 ? 10.757  48.642  56.030  1.00 8.26  ? ? ? ? ? ? 628 THR B CB  1 
+ATOM   3503 O OG1 . THR B 1 138 ? 11.742  49.510  55.423  1.00 8.68  ? ? ? ? ? ? 628 THR B OG1 1 
+ATOM   3504 C CG2 . THR B 1 138 ? 9.549   48.530  55.110  1.00 9.08  ? ? ? ? ? ? 628 THR B CG2 1 
+ATOM   3505 N N   . VAL B 1 139 ? 9.546   47.266  58.605  1.00 7.12  ? ? ? ? ? ? 629 VAL B N   1 
+ATOM   3506 C CA  . VAL B 1 139 ? 8.541   46.404  59.222  1.00 7.87  ? ? ? ? ? ? 629 VAL B CA  1 
+ATOM   3507 C C   . VAL B 1 139 ? 7.859   47.062  60.441  1.00 7.48  ? ? ? ? ? ? 629 VAL B C   1 
+ATOM   3508 O O   . VAL B 1 139 ? 6.631   47.124  60.520  1.00 7.41  ? ? ? ? ? ? 629 VAL B O   1 
+ATOM   3509 C CB  . VAL B 1 139 ? 9.170   45.042  59.625  1.00 7.57  ? ? ? ? ? ? 629 VAL B CB  1 
+ATOM   3510 C CG1 . VAL B 1 139 ? 8.162   44.191  60.450  1.00 8.52  ? ? ? ? ? ? 629 VAL B CG1 1 
+ATOM   3511 C CG2 . VAL B 1 139 ? 9.588   44.281  58.365  1.00 8.60  ? ? ? ? ? ? 629 VAL B CG2 1 
+ATOM   3512 N N   . MET B 1 140 ? 8.647   47.576  61.386  1.00 8.63  ? ? ? ? ? ? 630 MET B N   1 
+ATOM   3513 C CA  . MET B 1 140 ? 8.055   48.171  62.587  1.00 8.49  ? ? ? ? ? ? 630 MET B CA  1 
+ATOM   3514 C C   . MET B 1 140 ? 7.254   49.442  62.338  1.00 9.67  ? ? ? ? ? ? 630 MET B C   1 
+ATOM   3515 O O   . MET B 1 140 ? 6.261   49.691  63.012  1.00 9.87  ? ? ? ? ? ? 630 MET B O   1 
+ATOM   3516 C CB  . MET B 1 140 ? 9.100   48.378  63.688  1.00 9.55  ? ? ? ? ? ? 630 MET B CB  1 
+ATOM   3517 C CG  . MET B 1 140 ? 9.647   47.053  64.236  1.00 9.29  ? ? ? ? ? ? 630 MET B CG  1 
+ATOM   3518 S SD  . MET B 1 140 ? 10.804  47.271  65.614  1.00 11.18 ? ? ? ? ? ? 630 MET B SD  1 
+ATOM   3519 C CE  . MET B 1 140 ? 9.753   47.851  66.974  1.00 9.23  ? ? ? ? ? ? 630 MET B CE  1 
+ATOM   3520 N N   . THR B 1 141 ? 7.665   50.248  61.362  1.00 9.87  ? ? ? ? ? ? 631 THR B N   1 
+ATOM   3521 C CA  . THR B 1 141 ? 6.895   51.458  61.078  1.00 11.08 ? ? ? ? ? ? 631 THR B CA  1 
+ATOM   3522 C C   . THR B 1 141 ? 5.546   51.109  60.434  1.00 9.97  ? ? ? ? ? ? 631 THR B C   1 
+ATOM   3523 O O   . THR B 1 141 ? 4.566   51.776  60.689  1.00 10.25 ? ? ? ? ? ? 631 THR B O   1 
+ATOM   3524 C CB  . THR B 1 141 ? 7.656   52.490  60.213  1.00 13.52 ? ? ? ? ? ? 631 THR B CB  1 
+ATOM   3525 O OG1 . THR B 1 141 ? 7.964   51.919  58.963  1.00 16.64 ? ? ? ? ? ? 631 THR B OG1 1 
+ATOM   3526 C CG2 . THR B 1 141 ? 8.941   52.908  60.873  1.00 13.66 ? ? ? ? ? ? 631 THR B CG2 1 
+ATOM   3527 N N   . HIS B 1 142 ? 5.477   50.042  59.643  1.00 9.98  ? ? ? ? ? ? 632 HIS B N   1 
+ATOM   3528 C CA  . HIS B 1 142 ? 4.197   49.631  59.046  1.00 9.75  ? ? ? ? ? ? 632 HIS B CA  1 
+ATOM   3529 C C   . HIS B 1 142 ? 3.209   49.237  60.158  1.00 10.02 ? ? ? ? ? ? 632 HIS B C   1 
+ATOM   3530 O O   . HIS B 1 142 ? 2.001   49.388  60.021  1.00 11.14 ? ? ? ? ? ? 632 HIS B O   1 
+ATOM   3531 C CB  . HIS B 1 142 ? 4.380   48.458  58.061  1.00 10.06 ? ? ? ? ? ? 632 HIS B CB  1 
+ATOM   3532 C CG  . HIS B 1 142 ? 3.132   48.085  57.313  1.00 10.10 ? ? ? ? ? ? 632 HIS B CG  1 
+ATOM   3533 N ND1 . HIS B 1 142 ? 2.594   48.874  56.313  1.00 9.73  ? ? ? ? ? ? 632 HIS B ND1 1 
+ATOM   3534 C CD2 . HIS B 1 142 ? 2.319   47.007  57.415  1.00 9.51  ? ? ? ? ? ? 632 HIS B CD2 1 
+ATOM   3535 C CE1 . HIS B 1 142 ? 1.507   48.296  55.835  1.00 10.02 ? ? ? ? ? ? 632 HIS B CE1 1 
+ATOM   3536 N NE2 . HIS B 1 142 ? 1.321   47.163  56.487  1.00 10.05 ? ? ? ? ? ? 632 HIS B NE2 1 
+ATOM   3537 N N   . TYR B 1 143 ? 3.722   48.716  61.264  1.00 11.46 ? ? ? ? ? ? 633 TYR B N   1 
+ATOM   3538 C CA  . TYR B 1 143 ? 2.846   48.310  62.383  1.00 11.94 ? ? ? ? ? ? 633 TYR B CA  1 
+ATOM   3539 C C   . TYR B 1 143 ? 2.988   49.243  63.585  1.00 12.64 ? ? ? ? ? ? 633 TYR B C   1 
+ATOM   3540 O O   . TYR B 1 143 ? 2.601   48.889  64.692  1.00 13.10 ? ? ? ? ? ? 633 TYR B O   1 
+ATOM   3541 C CB  . TYR B 1 143 ? 3.189   46.867  62.816  1.00 10.96 ? ? ? ? ? ? 633 TYR B CB  1 
+ATOM   3542 C CG  . TYR B 1 143 ? 2.867   45.831  61.756  1.00 10.54 ? ? ? ? ? ? 633 TYR B CG  1 
+ATOM   3543 C CD1 . TYR B 1 143 ? 1.532   45.483  61.481  1.00 10.96 ? ? ? ? ? ? 633 TYR B CD1 1 
+ATOM   3544 C CD2 . TYR B 1 143 ? 3.879   45.255  60.968  1.00 9.61  ? ? ? ? ? ? 633 TYR B CD2 1 
+ATOM   3545 C CE1 . TYR B 1 143 ? 1.220   44.606  60.440  1.00 9.87  ? ? ? ? ? ? 633 TYR B CE1 1 
+ATOM   3546 C CE2 . TYR B 1 143 ? 3.574   44.370  59.930  1.00 9.41  ? ? ? ? ? ? 633 TYR B CE2 1 
+ATOM   3547 C CZ  . TYR B 1 143 ? 2.237   44.056  59.669  1.00 9.18  ? ? ? ? ? ? 633 TYR B CZ  1 
+ATOM   3548 O OH  . TYR B 1 143 ? 1.940   43.208  58.628  1.00 11.15 ? ? ? ? ? ? 633 TYR B OH  1 
+ATOM   3549 N N   . LYS B 1 144 ? 3.487   50.447  63.360  1.00 12.54 ? ? ? ? ? ? 634 LYS B N   1 
+ATOM   3550 C CA  . LYS B 1 144 ? 3.720   51.370  64.455  1.00 13.74 ? ? ? ? ? ? 634 LYS B CA  1 
+ATOM   3551 C C   . LYS B 1 144 ? 2.498   51.586  65.358  1.00 14.58 ? ? ? ? ? ? 634 LYS B C   1 
+ATOM   3552 O O   . LYS B 1 144 ? 1.401   51.921  64.887  1.00 15.20 ? ? ? ? ? ? 634 LYS B O   1 
+ATOM   3553 C CB  . LYS B 1 144 ? 4.265   52.695  63.916  1.00 14.53 ? ? ? ? ? ? 634 LYS B CB  1 
+ATOM   3554 C CG  . LYS B 1 144 ? 4.770   53.594  65.021  1.00 17.70 ? ? ? ? ? ? 634 LYS B CG  1 
+ATOM   3555 C CD  . LYS B 1 144 ? 5.368   54.888  64.483  1.00 20.50 ? ? ? ? ? ? 634 LYS B CD  1 
+ATOM   3556 C CE  . LYS B 1 144 ? 5.751   55.821  65.628  1.00 22.65 ? ? ? ? ? ? 634 LYS B CE  1 
+ATOM   3557 N NZ  . LYS B 1 144 ? 6.239   57.119  65.113  1.00 25.30 ? ? ? ? ? ? 634 LYS B NZ  1 
+ATOM   3558 N N   . GLY B 1 145 ? 2.702   51.355  66.657  1.00 14.21 ? ? ? ? ? ? 635 GLY B N   1 
+ATOM   3559 C CA  . GLY B 1 145 ? 1.643   51.518  67.637  1.00 15.59 ? ? ? ? ? ? 635 GLY B CA  1 
+ATOM   3560 C C   . GLY B 1 145 ? 0.550   50.446  67.630  1.00 17.77 ? ? ? ? ? ? 635 GLY B C   1 
+ATOM   3561 O O   . GLY B 1 145 ? -0.410  50.565  68.394  1.00 18.94 ? ? ? ? ? ? 635 GLY B O   1 
+ATOM   3562 N N   . LYS B 1 146 ? 0.703   49.391  66.821  1.00 17.44 ? ? ? ? ? ? 636 LYS B N   1 
+ATOM   3563 C CA  . LYS B 1 146 ? -0.293  48.301  66.710  1.00 17.63 ? ? ? ? ? ? 636 LYS B CA  1 
+ATOM   3564 C C   . LYS B 1 146 ? 0.141   46.974  67.356  1.00 16.27 ? ? ? ? ? ? 636 LYS B C   1 
+ATOM   3565 O O   . LYS B 1 146 ? -0.689  46.104  67.568  1.00 15.91 ? ? ? ? ? ? 636 LYS B O   1 
+ATOM   3566 C CB  . LYS B 1 146 ? -0.566  47.979  65.238  1.00 20.09 ? ? ? ? ? ? 636 LYS B CB  1 
+ATOM   3567 C CG  . LYS B 1 146 ? -0.862  49.160  64.368  1.00 23.71 ? ? ? ? ? ? 636 LYS B CG  1 
+ATOM   3568 C CD  . LYS B 1 146 ? -2.204  49.747  64.676  1.00 26.97 ? ? ? ? ? ? 636 LYS B CD  1 
+ATOM   3569 C CE  . LYS B 1 146 ? -2.486  50.907  63.708  1.00 30.07 ? ? ? ? ? ? 636 LYS B CE  1 
+ATOM   3570 N NZ  . LYS B 1 146 ? -2.237  50.542  62.248  1.00 32.17 ? ? ? ? ? ? 636 LYS B NZ  1 
+ATOM   3571 N N   . ILE B 1 147 ? 1.443   46.796  67.575  1.00 15.08 ? ? ? ? ? ? 637 ILE B N   1 
+ATOM   3572 C CA  . ILE B 1 147 ? 1.994   45.569  68.137  1.00 14.58 ? ? ? ? ? ? 637 ILE B CA  1 
+ATOM   3573 C C   . ILE B 1 147 ? 2.654   45.873  69.471  1.00 15.23 ? ? ? ? ? ? 637 ILE B C   1 
+ATOM   3574 O O   . ILE B 1 147 ? 3.605   46.632  69.560  1.00 17.04 ? ? ? ? ? ? 637 ILE B O   1 
+ATOM   3575 C CB  . ILE B 1 147 ? 2.917   44.883  67.106  1.00 14.19 ? ? ? ? ? ? 637 ILE B CB  1 
+ATOM   3576 C CG1 . ILE B 1 147 ? 2.042   44.422  65.924  1.00 13.98 ? ? ? ? ? ? 637 ILE B CG1 1 
+ATOM   3577 C CG2 . ILE B 1 147 ? 3.725   43.744  67.753  1.00 13.23 ? ? ? ? ? ? 637 ILE B CG2 1 
+ATOM   3578 C CD1 . ILE B 1 147 ? 2.714   43.582  64.868  1.00 16.19 ? ? ? ? ? ? 637 ILE B CD1 1 
+ATOM   3579 N N   . VAL B 1 148 ? 2.068   45.318  70.523  1.00 14.15 ? ? ? ? ? ? 638 VAL B N   1 
+ATOM   3580 C CA  . VAL B 1 148 ? 2.503   45.574  71.879  1.00 15.59 ? ? ? ? ? ? 638 VAL B CA  1 
+ATOM   3581 C C   . VAL B 1 148 ? 3.874   45.019  72.298  1.00 13.94 ? ? ? ? ? ? 638 VAL B C   1 
+ATOM   3582 O O   . VAL B 1 148 ? 4.617   45.682  73.028  1.00 14.93 ? ? ? ? ? ? 638 VAL B O   1 
+ATOM   3583 C CB  . VAL B 1 148 ? 1.358   45.157  72.885  1.00 16.85 ? ? ? ? ? ? 638 VAL B CB  1 
+ATOM   3584 C CG1 . VAL B 1 148 ? 1.152   43.645  72.902  1.00 16.67 ? ? ? ? ? ? 638 VAL B CG1 1 
+ATOM   3585 C CG2 . VAL B 1 148 ? 1.615   45.719  74.271  1.00 20.26 ? ? ? ? ? ? 638 VAL B CG2 1 
+ATOM   3586 N N   . GLU B 1 149 ? 4.216   43.827  71.830  1.00 10.99 ? ? ? ? ? ? 639 GLU B N   1 
+ATOM   3587 C CA  . GLU B 1 149 ? 5.493   43.218  72.183  1.00 9.19  ? ? ? ? ? ? 639 GLU B CA  1 
+ATOM   3588 C C   . GLU B 1 149 ? 6.145   42.704  70.915  1.00 7.39  ? ? ? ? ? ? 639 GLU B C   1 
+ATOM   3589 O O   . GLU B 1 149 ? 5.485   42.046  70.125  1.00 8.96  ? ? ? ? ? ? 639 GLU B O   1 
+ATOM   3590 C CB  . GLU B 1 149 ? 5.270   42.005  73.127  1.00 10.04 ? ? ? ? ? ? 639 GLU B CB  1 
+ATOM   3591 C CG  . GLU B 1 149 ? 4.608   42.341  74.474  1.00 11.02 ? ? ? ? ? ? 639 GLU B CG  1 
+ATOM   3592 C CD  . GLU B 1 149 ? 4.485   41.144  75.435  1.00 11.32 ? ? ? ? ? ? 639 GLU B CD  1 
+ATOM   3593 O OE1 . GLU B 1 149 ? 5.109   40.077  75.221  1.00 10.22 ? ? ? ? ? ? 639 GLU B OE1 1 
+ATOM   3594 O OE2 . GLU B 1 149 ? 3.733   41.303  76.421  1.00 13.42 ? ? ? ? ? ? 639 GLU B OE2 1 
+ATOM   3595 N N   . TRP B 1 150 ? 7.433   42.958  70.761  1.00 7.03  ? ? ? ? ? ? 640 TRP B N   1 
+ATOM   3596 C CA  . TRP B 1 150 ? 8.187   42.512  69.602  1.00 6.78  ? ? ? ? ? ? 640 TRP B CA  1 
+ATOM   3597 C C   . TRP B 1 150 ? 9.332   41.607  69.998  1.00 6.26  ? ? ? ? ? ? 640 TRP B C   1 
+ATOM   3598 O O   . TRP B 1 150 ? 10.123  41.961  70.873  1.00 7.34  ? ? ? ? ? ? 640 TRP B O   1 
+ATOM   3599 C CB  . TRP B 1 150 ? 8.808   43.721  68.837  1.00 8.02  ? ? ? ? ? ? 640 TRP B CB  1 
+ATOM   3600 C CG  . TRP B 1 150 ? 7.951   44.265  67.716  1.00 9.48  ? ? ? ? ? ? 640 TRP B CG  1 
+ATOM   3601 C CD1 . TRP B 1 150 ? 7.138   45.365  67.747  1.00 11.27 ? ? ? ? ? ? 640 TRP B CD1 1 
+ATOM   3602 C CD2 . TRP B 1 150 ? 7.829   43.715  66.400  1.00 10.06 ? ? ? ? ? ? 640 TRP B CD2 1 
+ATOM   3603 N NE1 . TRP B 1 150 ? 6.517   45.527  66.525  1.00 11.62 ? ? ? ? ? ? 640 TRP B NE1 1 
+ATOM   3604 C CE2 . TRP B 1 150 ? 6.927   44.532  65.683  1.00 11.50 ? ? ? ? ? ? 640 TRP B CE2 1 
+ATOM   3605 C CE3 . TRP B 1 150 ? 8.394   42.598  65.755  1.00 11.75 ? ? ? ? ? ? 640 TRP B CE3 1 
+ATOM   3606 C CZ2 . TRP B 1 150 ? 6.580   44.268  64.344  1.00 12.19 ? ? ? ? ? ? 640 TRP B CZ2 1 
+ATOM   3607 C CZ3 . TRP B 1 150 ? 8.044   42.329  64.414  1.00 12.95 ? ? ? ? ? ? 640 TRP B CZ3 1 
+ATOM   3608 C CH2 . TRP B 1 150 ? 7.150   43.166  63.737  1.00 12.41 ? ? ? ? ? ? 640 TRP B CH2 1 
+ATOM   3609 N N   . ASP B 1 151 ? 9.424   40.444  69.366  1.00 5.84  ? ? ? ? ? ? 641 ASP B N   1 
+ATOM   3610 C CA  . ASP B 1 151 ? 10.581  39.593  69.569  1.00 6.75  ? ? ? ? ? ? 641 ASP B CA  1 
+ATOM   3611 C C   . ASP B 1 151 ? 11.604  40.154  68.555  1.00 7.38  ? ? ? ? ? ? 641 ASP B C   1 
+ATOM   3612 O O   . ASP B 1 151 ? 11.605  39.768  67.365  1.00 7.36  ? ? ? ? ? ? 641 ASP B O   1 
+ATOM   3613 C CB  . ASP B 1 151 ? 10.300  38.115  69.238  1.00 7.66  ? ? ? ? ? ? 641 ASP B CB  1 
+ATOM   3614 C CG  . ASP B 1 151 ? 9.412   37.430  70.286  1.00 9.03  ? ? ? ? ? ? 641 ASP B CG  1 
+ATOM   3615 O OD1 . ASP B 1 151 ? 9.347   37.899  71.436  1.00 8.74  ? ? ? ? ? ? 641 ASP B OD1 1 
+ATOM   3616 O OD2 . ASP B 1 151 ? 8.782   36.425  69.898  1.00 11.85 ? ? ? ? ? ? 641 ASP B OD2 1 
+ATOM   3617 N N   . VAL B 1 152 ? 12.431  41.083  69.021  1.00 6.96  ? ? ? ? ? ? 642 VAL B N   1 
+ATOM   3618 C CA  . VAL B 1 152 ? 13.455  41.679  68.165  1.00 7.28  ? ? ? ? ? ? 642 VAL B CA  1 
+ATOM   3619 C C   . VAL B 1 152 ? 14.501  40.657  67.739  1.00 8.76  ? ? ? ? ? ? 642 VAL B C   1 
+ATOM   3620 O O   . VAL B 1 152 ? 14.906  40.619  66.562  1.00 9.49  ? ? ? ? ? ? 642 VAL B O   1 
+ATOM   3621 C CB  . VAL B 1 152 ? 14.148  42.853  68.875  1.00 8.35  ? ? ? ? ? ? 642 VAL B CB  1 
+ATOM   3622 C CG1 . VAL B 1 152 ? 15.314  43.405  68.006  1.00 9.46  ? ? ? ? ? ? 642 VAL B CG1 1 
+ATOM   3623 C CG2 . VAL B 1 152 ? 13.129  43.942  69.196  1.00 8.98  ? ? ? ? ? ? 642 VAL B CG2 1 
+ATOM   3624 N N   . ALA B 1 153 ? 14.953  39.838  68.684  1.00 8.52  ? ? ? ? ? ? 643 ALA B N   1 
+ATOM   3625 C CA  . ALA B 1 153 ? 15.969  38.834  68.427  1.00 8.77  ? ? ? ? ? ? 643 ALA B CA  1 
+ATOM   3626 C C   . ALA B 1 153 ? 15.422  37.524  68.976  1.00 9.34  ? ? ? ? ? ? 643 ALA B C   1 
+ATOM   3627 O O   . ALA B 1 153 ? 14.751  37.516  70.019  1.00 9.96  ? ? ? ? ? ? 643 ALA B O   1 
+ATOM   3628 C CB  . ALA B 1 153 ? 17.257  39.205  69.133  1.00 10.13 ? ? ? ? ? ? 643 ALA B CB  1 
+ATOM   3629 N N   . ASN B 1 154 ? 15.791  36.429  68.320  1.00 8.94  ? ? ? ? ? ? 644 ASN B N   1 
+ATOM   3630 C CA  . ASN B 1 154 ? 15.297  35.085  68.653  1.00 10.05 ? ? ? ? ? ? 644 ASN B CA  1 
+ATOM   3631 C C   . ASN B 1 154 ? 16.406  34.034  68.604  1.00 11.74 ? ? ? ? ? ? 644 ASN B C   1 
+ATOM   3632 O O   . ASN B 1 154 ? 17.149  33.959  67.607  1.00 11.91 ? ? ? ? ? ? 644 ASN B O   1 
+ATOM   3633 C CB  . ASN B 1 154 ? 14.268  34.719  67.579  1.00 12.30 ? ? ? ? ? ? 644 ASN B CB  1 
+ATOM   3634 C CG  . ASN B 1 154 ? 13.331  33.618  67.992  1.00 13.65 ? ? ? ? ? ? 644 ASN B CG  1 
+ATOM   3635 O OD1 . ASN B 1 154 ? 13.058  32.697  67.217  1.00 15.12 ? ? ? ? ? ? 644 ASN B OD1 1 
+ATOM   3636 N ND2 . ASN B 1 154 ? 12.771  33.736  69.169  1.00 14.52 ? ? ? ? ? ? 644 ASN B ND2 1 
+ATOM   3637 N N   . GLU B 1 155 ? 16.598  33.305  69.711  1.00 10.75 ? ? ? ? ? ? 645 GLU B N   1 
+ATOM   3638 C CA  . GLU B 1 155 ? 17.563  32.187  69.752  1.00 12.26 ? ? ? ? ? ? 645 GLU B CA  1 
+ATOM   3639 C C   . GLU B 1 155 ? 19.009  32.502  69.352  1.00 11.99 ? ? ? ? ? ? 645 GLU B C   1 
+ATOM   3640 O O   . GLU B 1 155 ? 19.642  31.737  68.624  1.00 14.14 ? ? ? ? ? ? 645 GLU B O   1 
+ATOM   3641 C CB  . GLU B 1 155 ? 17.017  31.041  68.886  1.00 11.27 ? ? ? ? ? ? 645 GLU B CB  1 
+ATOM   3642 C CG  . GLU B 1 155 ? 15.603  30.637  69.311  1.00 11.77 ? ? ? ? ? ? 645 GLU B CG  1 
+ATOM   3643 C CD  . GLU B 1 155 ? 14.979  29.570  68.454  1.00 13.15 ? ? ? ? ? ? 645 GLU B CD  1 
+ATOM   3644 O OE1 . GLU B 1 155 ? 15.652  29.035  67.553  1.00 14.08 ? ? ? ? ? ? 645 GLU B OE1 1 
+ATOM   3645 O OE2 . GLU B 1 155 ? 13.787  29.264  68.664  1.00 14.59 ? ? ? ? ? ? 645 GLU B OE2 1 
+ATOM   3646 N N   . CYS B 1 156 ? 19.534  33.594  69.882  1.00 13.29 ? ? ? ? ? ? 646 CYS B N   1 
+ATOM   3647 C CA  . CYS B 1 156 ? 20.886  34.027  69.571  1.00 13.72 ? ? ? ? ? ? 646 CYS B CA  1 
+ATOM   3648 C C   . CYS B 1 156 ? 21.974  33.454  70.470  1.00 14.86 ? ? ? ? ? ? 646 CYS B C   1 
+ATOM   3649 O O   . CYS B 1 156 ? 23.148  33.580  70.144  1.00 15.20 ? ? ? ? ? ? 646 CYS B O   1 
+ATOM   3650 C CB  . CYS B 1 156 ? 20.955  35.555  69.630  1.00 14.57 ? ? ? ? ? ? 646 CYS B CB  1 
+ATOM   3651 S SG  . CYS B 1 156 ? 19.801  36.353  68.463  1.00 17.06 ? ? ? ? ? ? 646 CYS B SG  1 
+ATOM   3652 N N   . MET B 1 157 ? 21.612  32.890  71.625  1.00 14.53 ? ? ? ? ? ? 647 MET B N   1 
+ATOM   3653 C CA  . MET B 1 157 ? 22.622  32.331  72.553  1.00 14.16 ? ? ? ? ? ? 647 MET B CA  1 
+ATOM   3654 C C   . MET B 1 157 ? 22.906  30.869  72.217  1.00 14.56 ? ? ? ? ? ? 647 MET B C   1 
+ATOM   3655 O O   . MET B 1 157 ? 21.986  30.092  71.900  1.00 13.03 ? ? ? ? ? ? 647 MET B O   1 
+ATOM   3656 C CB  . MET B 1 157 ? 22.130  32.439  74.007  1.00 14.22 ? ? ? ? ? ? 647 MET B CB  1 
+ATOM   3657 C CG  . MET B 1 157 ? 23.179  32.072  75.069  1.00 14.45 ? ? ? ? ? ? 647 MET B CG  1 
+ATOM   3658 S SD  . MET B 1 157 ? 24.552  33.214  75.111  1.00 16.57 ? ? ? ? ? ? 647 MET B SD  1 
+ATOM   3659 C CE  . MET B 1 157 ? 23.781  34.619  75.913  1.00 15.93 ? ? ? ? ? ? 647 MET B CE  1 
+ATOM   3660 N N   . ASP B 1 158 ? 24.179  30.488  72.278  1.00 16.24 ? ? ? ? ? ? 648 ASP B N   1 
+ATOM   3661 C CA  . ASP B 1 158 ? 24.542  29.100  71.997  1.00 17.62 ? ? ? ? ? ? 648 ASP B CA  1 
+ATOM   3662 C C   . ASP B 1 158 ? 23.982  28.235  73.141  1.00 18.40 ? ? ? ? ? ? 648 ASP B C   1 
+ATOM   3663 O O   . ASP B 1 158 ? 23.885  28.701  74.267  1.00 17.29 ? ? ? ? ? ? 648 ASP B O   1 
+ATOM   3664 C CB  . ASP B 1 158 ? 26.062  28.949  71.916  1.00 19.79 ? ? ? ? ? ? 648 ASP B CB  1 
+ATOM   3665 C CG  . ASP B 1 158 ? 26.490  27.579  71.399  1.00 23.40 ? ? ? ? ? ? 648 ASP B CG  1 
+ATOM   3666 O OD1 . ASP B 1 158 ? 26.476  27.347  70.148  1.00 24.87 ? ? ? ? ? ? 648 ASP B OD1 1 
+ATOM   3667 O OD2 . ASP B 1 158 ? 26.843  26.722  72.250  1.00 24.88 ? ? ? ? ? ? 648 ASP B OD2 1 
+ATOM   3668 N N   . ASP B 1 159 ? 23.611  26.992  72.858  1.00 19.25 ? ? ? ? ? ? 649 ASP B N   1 
+ATOM   3669 C CA  . ASP B 1 159 ? 23.072  26.111  73.908  1.00 22.35 ? ? ? ? ? ? 649 ASP B CA  1 
+ATOM   3670 C C   . ASP B 1 159 ? 24.013  25.799  75.086  1.00 22.41 ? ? ? ? ? ? 649 ASP B C   1 
+ATOM   3671 O O   . ASP B 1 159 ? 23.561  25.446  76.183  1.00 22.93 ? ? ? ? ? ? 649 ASP B O   1 
+ATOM   3672 C CB  . ASP B 1 159 ? 22.516  24.842  73.288  1.00 24.41 ? ? ? ? ? ? 649 ASP B CB  1 
+ATOM   3673 C CG  . ASP B 1 159 ? 21.257  25.116  72.526  1.00 27.13 ? ? ? ? ? ? 649 ASP B CG  1 
+ATOM   3674 O OD1 . ASP B 1 159 ? 20.400  25.824  73.094  1.00 29.09 ? ? ? ? ? ? 649 ASP B OD1 1 
+ATOM   3675 O OD2 . ASP B 1 159 ? 21.134  24.678  71.367  1.00 28.55 ? ? ? ? ? ? 649 ASP B OD2 1 
+ATOM   3676 N N   . SER B 1 160 ? 25.311  25.949  74.839  1.00 21.60 ? ? ? ? ? ? 650 SER B N   1 
+ATOM   3677 C CA  . SER B 1 160 ? 26.330  25.748  75.856  1.00 22.16 ? ? ? ? ? ? 650 SER B CA  1 
+ATOM   3678 C C   . SER B 1 160 ? 26.197  26.838  76.924  1.00 22.12 ? ? ? ? ? ? 650 SER B C   1 
+ATOM   3679 O O   . SER B 1 160 ? 26.574  26.629  78.072  1.00 24.22 ? ? ? ? ? ? 650 SER B O   1 
+ATOM   3680 C CB  . SER B 1 160 ? 27.741  25.855  75.225  1.00 22.18 ? ? ? ? ? ? 650 SER B CB  1 
+ATOM   3681 O OG  . SER B 1 160 ? 28.036  27.181  74.743  1.00 22.55 ? ? ? ? ? ? 650 SER B OG  1 
+ATOM   3682 N N   . GLY B 1 161 ? 25.680  28.000  76.533  1.00 20.55 ? ? ? ? ? ? 651 GLY B N   1 
+ATOM   3683 C CA  . GLY B 1 161 ? 25.575  29.116  77.439  1.00 19.81 ? ? ? ? ? ? 651 GLY B CA  1 
+ATOM   3684 C C   . GLY B 1 161 ? 26.911  29.848  77.450  1.00 21.34 ? ? ? ? ? ? 651 GLY B C   1 
+ATOM   3685 O O   . GLY B 1 161 ? 27.095  30.797  78.216  1.00 21.10 ? ? ? ? ? ? 651 GLY B O   1 
+ATOM   3686 N N   . ASN B 1 162 ? 27.839  29.451  76.572  1.00 21.82 ? ? ? ? ? ? 652 ASN B N   1 
+ATOM   3687 C CA  . ASN B 1 162 ? 29.151  30.087  76.539  1.00 23.47 ? ? ? ? ? ? 652 ASN B CA  1 
+ATOM   3688 C C   . ASN B 1 162 ? 29.213  31.411  75.825  1.00 23.65 ? ? ? ? ? ? 652 ASN B C   1 
+ATOM   3689 O O   . ASN B 1 162 ? 30.099  32.216  76.089  1.00 25.89 ? ? ? ? ? ? 652 ASN B O   1 
+ATOM   3690 C CB  . ASN B 1 162 ? 30.218  29.151  75.970  1.00 24.73 ? ? ? ? ? ? 652 ASN B CB  1 
+ATOM   3691 C CG  . ASN B 1 162 ? 30.722  28.164  77.000  1.00 26.90 ? ? ? ? ? ? 652 ASN B CG  1 
+ATOM   3692 O OD1 . ASN B 1 162 ? 31.175  27.075  76.660  1.00 28.53 ? ? ? ? ? ? 652 ASN B OD1 1 
+ATOM   3693 N ND2 . ASN B 1 162 ? 30.626  28.532  78.269  1.00 26.97 ? ? ? ? ? ? 652 ASN B ND2 1 
+ATOM   3694 N N   . GLY B 1 163 ? 28.292  31.644  74.912  1.00 22.21 ? ? ? ? ? ? 653 GLY B N   1 
+ATOM   3695 C CA  . GLY B 1 163 ? 28.302  32.898  74.192  1.00 20.01 ? ? ? ? ? ? 653 GLY B CA  1 
+ATOM   3696 C C   . GLY B 1 163 ? 27.305  32.838  73.057  1.00 18.18 ? ? ? ? ? ? 653 GLY B C   1 
+ATOM   3697 O O   . GLY B 1 163 ? 26.560  31.869  72.918  1.00 17.45 ? ? ? ? ? ? 653 GLY B O   1 
+ATOM   3698 N N   . LEU B 1 164 ? 27.313  33.867  72.212  1.00 18.11 ? ? ? ? ? ? 654 LEU B N   1 
+ATOM   3699 C CA  . LEU B 1 164 ? 26.372  33.943  71.095  1.00 16.71 ? ? ? ? ? ? 654 LEU B CA  1 
+ATOM   3700 C C   . LEU B 1 164 ? 26.649  32.891  70.040  1.00 16.22 ? ? ? ? ? ? 654 LEU B C   1 
+ATOM   3701 O O   . LEU B 1 164 ? 27.809  32.553  69.755  1.00 16.77 ? ? ? ? ? ? 654 LEU B O   1 
+ATOM   3702 C CB  . LEU B 1 164 ? 26.395  35.343  70.470  1.00 17.30 ? ? ? ? ? ? 654 LEU B CB  1 
+ATOM   3703 C CG  . LEU B 1 164 ? 25.900  36.425  71.432  1.00 17.68 ? ? ? ? ? ? 654 LEU B CG  1 
+ATOM   3704 C CD1 . LEU B 1 164 ? 26.097  37.812  70.832  1.00 18.63 ? ? ? ? ? ? 654 LEU B CD1 1 
+ATOM   3705 C CD2 . LEU B 1 164 ? 24.447  36.163  71.737  1.00 17.10 ? ? ? ? ? ? 654 LEU B CD2 1 
+ATOM   3706 N N   . ARG B 1 165 ? 25.591  32.386  69.433  1.00 14.24 ? ? ? ? ? ? 655 ARG B N   1 
+ATOM   3707 C CA  . ARG B 1 165 ? 25.787  31.381  68.436  1.00 15.57 ? ? ? ? ? ? 655 ARG B CA  1 
+ATOM   3708 C C   . ARG B 1 165 ? 26.223  31.986  67.102  1.00 15.43 ? ? ? ? ? ? 655 ARG B C   1 
+ATOM   3709 O O   . ARG B 1 165 ? 25.984  33.165  66.795  1.00 15.03 ? ? ? ? ? ? 655 ARG B O   1 
+ATOM   3710 C CB  . ARG B 1 165 ? 24.529  30.531  68.275  1.00 18.23 ? ? ? ? ? ? 655 ARG B CB  1 
+ATOM   3711 C CG  . ARG B 1 165 ? 23.440  31.174  67.495  1.00 19.93 ? ? ? ? ? ? 655 ARG B CG  1 
+ATOM   3712 C CD  . ARG B 1 165 ? 22.447  30.101  67.039  1.00 20.87 ? ? ? ? ? ? 655 ARG B CD  1 
+ATOM   3713 N NE  . ARG B 1 165 ? 21.558  29.642  68.103  1.00 20.64 ? ? ? ? ? ? 655 ARG B NE  1 
+ATOM   3714 C CZ  . ARG B 1 165 ? 21.242  28.371  68.321  1.00 23.03 ? ? ? ? ? ? 655 ARG B CZ  1 
+ATOM   3715 N NH1 . ARG B 1 165 ? 21.768  27.413  67.561  1.00 23.81 ? ? ? ? ? ? 655 ARG B NH1 1 
+ATOM   3716 N NH2 . ARG B 1 165 ? 20.299  28.060  69.206  1.00 22.45 ? ? ? ? ? ? 655 ARG B NH2 1 
+ATOM   3717 N N   . SER B 1 166 ? 26.894  31.150  66.337  1.00 15.72 ? ? ? ? ? ? 656 SER B N   1 
+ATOM   3718 C CA  . SER B 1 166 ? 27.361  31.503  65.023  1.00 17.68 ? ? ? ? ? ? 656 SER B CA  1 
+ATOM   3719 C C   . SER B 1 166 ? 26.119  31.677  64.126  1.00 17.44 ? ? ? ? ? ? 656 SER B C   1 
+ATOM   3720 O O   . SER B 1 166 ? 25.168  30.895  64.211  1.00 18.38 ? ? ? ? ? ? 656 SER B O   1 
+ATOM   3721 C CB  . SER B 1 166 ? 28.254  30.349  64.532  1.00 20.26 ? ? ? ? ? ? 656 SER B CB  1 
+ATOM   3722 O OG  . SER B 1 166 ? 28.464  30.398  63.138  1.00 23.88 ? ? ? ? ? ? 656 SER B OG  1 
+ATOM   3723 N N   . SER B 1 167 ? 26.095  32.739  63.332  1.00 15.21 ? ? ? ? ? ? 657 SER B N   1 
+ATOM   3724 C CA  . SER B 1 167 ? 24.997  33.009  62.406  1.00 13.99 ? ? ? ? ? ? 657 SER B CA  1 
+ATOM   3725 C C   . SER B 1 167 ? 25.482  34.089  61.450  1.00 13.43 ? ? ? ? ? ? 657 SER B C   1 
+ATOM   3726 O O   . SER B 1 167 ? 26.530  34.680  61.676  1.00 13.32 ? ? ? ? ? ? 657 SER B O   1 
+ATOM   3727 C CB  . SER B 1 167 ? 23.740  33.482  63.123  1.00 13.24 ? ? ? ? ? ? 657 SER B CB  1 
+ATOM   3728 O OG  . SER B 1 167 ? 23.880  34.802  63.594  1.00 14.00 ? ? ? ? ? ? 657 SER B OG  1 
+ATOM   3729 N N   . ILE B 1 168 ? 24.719  34.373  60.399  1.00 13.79 ? ? ? ? ? ? 658 ILE B N   1 
+ATOM   3730 C CA  . ILE B 1 168 ? 25.143  35.386  59.434  1.00 13.30 ? ? ? ? ? ? 658 ILE B CA  1 
+ATOM   3731 C C   . ILE B 1 168 ? 25.302  36.752  60.092  1.00 12.53 ? ? ? ? ? ? 658 ILE B C   1 
+ATOM   3732 O O   . ILE B 1 168 ? 26.301  37.419  59.860  1.00 12.51 ? ? ? ? ? ? 658 ILE B O   1 
+ATOM   3733 C CB  . ILE B 1 168 ? 24.220  35.420  58.167  1.00 14.46 ? ? ? ? ? ? 658 ILE B CB  1 
+ATOM   3734 C CG1 . ILE B 1 168 ? 24.839  36.303  57.092  1.00 16.14 ? ? ? ? ? ? 658 ILE B CG1 1 
+ATOM   3735 C CG2 . ILE B 1 168 ? 22.797  35.874  58.500  1.00 14.70 ? ? ? ? ? ? 658 ILE B CG2 1 
+ATOM   3736 C CD1 . ILE B 1 168 ? 23.978  36.392  55.872  1.00 18.29 ? ? ? ? ? ? 658 ILE B CD1 1 
+ATOM   3737 N N   . TRP B 1 169 ? 24.402  37.105  61.013  1.00 10.81 ? ? ? ? ? ? 659 TRP B N   1 
+ATOM   3738 C CA  . TRP B 1 169 ? 24.474  38.393  61.717  1.00 11.08 ? ? ? ? ? ? 659 TRP B CA  1 
+ATOM   3739 C C   . TRP B 1 169 ? 25.700  38.487  62.653  1.00 11.08 ? ? ? ? ? ? 659 TRP B C   1 
+ATOM   3740 O O   . TRP B 1 169 ? 26.455  39.474  62.648  1.00 11.25 ? ? ? ? ? ? 659 TRP B O   1 
+ATOM   3741 C CB  . TRP B 1 169 ? 23.194  38.640  62.546  1.00 11.06 ? ? ? ? ? ? 659 TRP B CB  1 
+ATOM   3742 C CG  . TRP B 1 169 ? 21.916  38.444  61.783  1.00 10.91 ? ? ? ? ? ? 659 TRP B CG  1 
+ATOM   3743 C CD1 . TRP B 1 169 ? 21.052  37.388  61.874  1.00 10.47 ? ? ? ? ? ? 659 TRP B CD1 1 
+ATOM   3744 C CD2 . TRP B 1 169 ? 21.374  39.327  60.797  1.00 10.96 ? ? ? ? ? ? 659 TRP B CD2 1 
+ATOM   3745 N NE1 . TRP B 1 169 ? 20.002  37.559  61.007  1.00 11.17 ? ? ? ? ? ? 659 TRP B NE1 1 
+ATOM   3746 C CE2 . TRP B 1 169 ? 20.174  38.743  60.328  1.00 11.36 ? ? ? ? ? ? 659 TRP B CE2 1 
+ATOM   3747 C CE3 . TRP B 1 169 ? 21.787  40.554  60.261  1.00 11.25 ? ? ? ? ? ? 659 TRP B CE3 1 
+ATOM   3748 C CZ2 . TRP B 1 169 ? 19.378  39.360  59.332  1.00 11.65 ? ? ? ? ? ? 659 TRP B CZ2 1 
+ATOM   3749 C CZ3 . TRP B 1 169 ? 20.996  41.167  59.273  1.00 11.31 ? ? ? ? ? ? 659 TRP B CZ3 1 
+ATOM   3750 C CH2 . TRP B 1 169 ? 19.806  40.565  58.823  1.00 10.83 ? ? ? ? ? ? 659 TRP B CH2 1 
+ATOM   3751 N N   . ARG B 1 170 ? 25.889  37.445  63.456  1.00 11.66 ? ? ? ? ? ? 660 ARG B N   1 
+ATOM   3752 C CA  . ARG B 1 170 ? 26.990  37.408  64.418  1.00 11.69 ? ? ? ? ? ? 660 ARG B CA  1 
+ATOM   3753 C C   . ARG B 1 170 ? 28.372  37.384  63.748  1.00 11.69 ? ? ? ? ? ? 660 ARG B C   1 
+ATOM   3754 O O   . ARG B 1 170 ? 29.288  38.083  64.177  1.00 11.78 ? ? ? ? ? ? 660 ARG B O   1 
+ATOM   3755 C CB  . ARG B 1 170 ? 26.825  36.176  65.336  1.00 11.13 ? ? ? ? ? ? 660 ARG B CB  1 
+ATOM   3756 C CG  . ARG B 1 170 ? 28.048  35.879  66.226  1.00 11.48 ? ? ? ? ? ? 660 ARG B CG  1 
+ATOM   3757 C CD  . ARG B 1 170 ? 28.285  36.967  67.234  1.00 11.67 ? ? ? ? ? ? 660 ARG B CD  1 
+ATOM   3758 N NE  . ARG B 1 170 ? 29.482  36.710  68.068  1.00 13.33 ? ? ? ? ? ? 660 ARG B NE  1 
+ATOM   3759 C CZ  . ARG B 1 170 ? 30.735  37.084  67.763  1.00 12.99 ? ? ? ? ? ? 660 ARG B CZ  1 
+ATOM   3760 N NH1 . ARG B 1 170 ? 30.987  37.720  66.621  1.00 12.36 ? ? ? ? ? ? 660 ARG B NH1 1 
+ATOM   3761 N NH2 . ARG B 1 170 ? 31.718  36.930  68.642  1.00 11.79 ? ? ? ? ? ? 660 ARG B NH2 1 
+ATOM   3762 N N   . ASN B 1 171 ? 28.504  36.577  62.696  1.00 11.73 ? ? ? ? ? ? 661 ASN B N   1 
+ATOM   3763 C CA  . ASN B 1 171 ? 29.795  36.389  62.027  1.00 12.88 ? ? ? ? ? ? 661 ASN B CA  1 
+ATOM   3764 C C   . ASN B 1 171 ? 30.263  37.596  61.230  1.00 13.43 ? ? ? ? ? ? 661 ASN B C   1 
+ATOM   3765 O O   . ASN B 1 171 ? 31.425  38.015  61.338  1.00 13.79 ? ? ? ? ? ? 661 ASN B O   1 
+ATOM   3766 C CB  . ASN B 1 171 ? 29.781  35.146  61.119  1.00 14.10 ? ? ? ? ? ? 661 ASN B CB  1 
+ATOM   3767 C CG  . ASN B 1 171 ? 29.537  33.842  61.880  1.00 14.86 ? ? ? ? ? ? 661 ASN B CG  1 
+ATOM   3768 O OD1 . ASN B 1 171 ? 29.510  33.816  63.108  1.00 15.44 ? ? ? ? ? ? 661 ASN B OD1 1 
+ATOM   3769 N ND2 . ASN B 1 171 ? 29.315  32.761  61.139  1.00 17.33 ? ? ? ? ? ? 661 ASN B ND2 1 
+ATOM   3770 N N   . VAL B 1 172 ? 29.351  38.160  60.440  1.00 12.43 ? ? ? ? ? ? 662 VAL B N   1 
+ATOM   3771 C CA  . VAL B 1 172 ? 29.676  39.325  59.607  1.00 11.46 ? ? ? ? ? ? 662 VAL B CA  1 
+ATOM   3772 C C   . VAL B 1 172 ? 29.799  40.665  60.374  1.00 11.03 ? ? ? ? ? ? 662 VAL B C   1 
+ATOM   3773 O O   . VAL B 1 172 ? 30.749  41.419  60.178  1.00 12.14 ? ? ? ? ? ? 662 VAL B O   1 
+ATOM   3774 C CB  . VAL B 1 172 ? 28.634  39.432  58.447  1.00 11.68 ? ? ? ? ? ? 662 VAL B CB  1 
+ATOM   3775 C CG1 . VAL B 1 172 ? 28.854  40.710  57.624  1.00 12.45 ? ? ? ? ? ? 662 VAL B CG1 1 
+ATOM   3776 C CG2 . VAL B 1 172 ? 28.723  38.213  57.554  1.00 11.85 ? ? ? ? ? ? 662 VAL B CG2 1 
+ATOM   3777 N N   . ILE B 1 173 ? 28.838  40.966  61.243  1.00 10.07 ? ? ? ? ? ? 663 ILE B N   1 
+ATOM   3778 C CA  . ILE B 1 173 ? 28.844  42.214  61.984  1.00 9.48  ? ? ? ? ? ? 663 ILE B CA  1 
+ATOM   3779 C C   . ILE B 1 173 ? 29.800  42.201  63.167  1.00 11.93 ? ? ? ? ? ? 663 ILE B C   1 
+ATOM   3780 O O   . ILE B 1 173 ? 30.590  43.125  63.330  1.00 12.90 ? ? ? ? ? ? 663 ILE B O   1 
+ATOM   3781 C CB  . ILE B 1 173 ? 27.411  42.600  62.442  1.00 9.16  ? ? ? ? ? ? 663 ILE B CB  1 
+ATOM   3782 C CG1 . ILE B 1 173 ? 26.531  42.885  61.210  1.00 10.24 ? ? ? ? ? ? 663 ILE B CG1 1 
+ATOM   3783 C CG2 . ILE B 1 173 ? 27.436  43.793  63.339  1.00 8.82  ? ? ? ? ? ? 663 ILE B CG2 1 
+ATOM   3784 C CD1 . ILE B 1 173 ? 25.063  42.981  61.542  1.00 11.32 ? ? ? ? ? ? 663 ILE B CD1 1 
+ATOM   3785 N N   . GLY B 1 174 ? 29.708  41.177  64.018  1.00 11.83 ? ? ? ? ? ? 664 GLY B N   1 
+ATOM   3786 C CA  . GLY B 1 174 ? 30.593  41.127  65.164  1.00 11.31 ? ? ? ? ? ? 664 GLY B CA  1 
+ATOM   3787 C C   . GLY B 1 174 ? 29.832  40.877  66.436  1.00 12.32 ? ? ? ? ? ? 664 GLY B C   1 
+ATOM   3788 O O   . GLY B 1 174 ? 28.593  40.756  66.450  1.00 12.20 ? ? ? ? ? ? 664 GLY B O   1 
+ATOM   3789 N N   . GLN B 1 175 ? 30.567  40.944  67.534  1.00 12.40 ? ? ? ? ? ? 665 GLN B N   1 
+ATOM   3790 C CA  . GLN B 1 175 ? 29.965  40.643  68.816  1.00 14.96 ? ? ? ? ? ? 665 GLN B CA  1 
+ATOM   3791 C C   . GLN B 1 175 ? 28.862  41.572  69.319  1.00 13.96 ? ? ? ? ? ? 665 GLN B C   1 
+ATOM   3792 O O   . GLN B 1 175 ? 28.044  41.146  70.142  1.00 15.64 ? ? ? ? ? ? 665 GLN B O   1 
+ATOM   3793 C CB  . GLN B 1 175 ? 31.048  40.498  69.869  1.00 18.67 ? ? ? ? ? ? 665 GLN B CB  1 
+ATOM   3794 C CG  . GLN B 1 175 ? 31.843  41.760  70.044  1.00 24.40 ? ? ? ? ? ? 665 GLN B CG  1 
+ATOM   3795 C CD  . GLN B 1 175 ? 32.538  41.800  71.376  1.00 28.62 ? ? ? ? ? ? 665 GLN B CD  1 
+ATOM   3796 O OE1 . GLN B 1 175 ? 33.054  42.853  71.780  1.00 31.12 ? ? ? ? ? ? 665 GLN B OE1 1 
+ATOM   3797 N NE2 . GLN B 1 175 ? 32.555  40.654  72.086  1.00 30.07 ? ? ? ? ? ? 665 GLN B NE2 1 
+ATOM   3798 N N   . ASP B 1 176 ? 28.803  42.799  68.809  1.00 12.47 ? ? ? ? ? ? 666 ASP B N   1 
+ATOM   3799 C CA  . ASP B 1 176 ? 27.822  43.789  69.226  1.00 12.19 ? ? ? ? ? ? 666 ASP B CA  1 
+ATOM   3800 C C   . ASP B 1 176 ? 26.601  43.922  68.343  1.00 11.12 ? ? ? ? ? ? 666 ASP B C   1 
+ATOM   3801 O O   . ASP B 1 176 ? 25.861  44.892  68.485  1.00 12.04 ? ? ? ? ? ? 666 ASP B O   1 
+ATOM   3802 C CB  . ASP B 1 176 ? 28.480  45.176  69.299  1.00 14.72 ? ? ? ? ? ? 666 ASP B CB  1 
+ATOM   3803 C CG  . ASP B 1 176 ? 29.092  45.617  67.962  1.00 16.50 ? ? ? ? ? ? 666 ASP B CG  1 
+ATOM   3804 O OD1 . ASP B 1 176 ? 29.129  44.821  66.990  1.00 17.17 ? ? ? ? ? ? 666 ASP B OD1 1 
+ATOM   3805 O OD2 . ASP B 1 176 ? 29.551  46.783  67.890  1.00 18.36 ? ? ? ? ? ? 666 ASP B OD2 1 
+ATOM   3806 N N   . TYR B 1 177 ? 26.352  42.962  67.469  1.00 10.69 ? ? ? ? ? ? 667 TYR B N   1 
+ATOM   3807 C CA  . TYR B 1 177 ? 25.217  43.094  66.563  1.00 9.88  ? ? ? ? ? ? 667 TYR B CA  1 
+ATOM   3808 C C   . TYR B 1 177 ? 23.862  43.290  67.237  1.00 10.08 ? ? ? ? ? ? 667 TYR B C   1 
+ATOM   3809 O O   . TYR B 1 177 ? 23.039  44.043  66.735  1.00 10.33 ? ? ? ? ? ? 667 TYR B O   1 
+ATOM   3810 C CB  . TYR B 1 177 ? 25.203  41.945  65.560  1.00 10.20 ? ? ? ? ? ? 667 TYR B CB  1 
+ATOM   3811 C CG  . TYR B 1 177 ? 24.550  40.665  66.033  1.00 10.07 ? ? ? ? ? ? 667 TYR B CG  1 
+ATOM   3812 C CD1 . TYR B 1 177 ? 25.260  39.712  66.767  1.00 10.11 ? ? ? ? ? ? 667 TYR B CD1 1 
+ATOM   3813 C CD2 . TYR B 1 177 ? 23.229  40.375  65.676  1.00 10.82 ? ? ? ? ? ? 667 TYR B CD2 1 
+ATOM   3814 C CE1 . TYR B 1 177 ? 24.661  38.503  67.118  1.00 10.19 ? ? ? ? ? ? 667 TYR B CE1 1 
+ATOM   3815 C CE2 . TYR B 1 177 ? 22.634  39.174  66.015  1.00 10.04 ? ? ? ? ? ? 667 TYR B CE2 1 
+ATOM   3816 C CZ  . TYR B 1 177 ? 23.352  38.249  66.729  1.00 10.53 ? ? ? ? ? ? 667 TYR B CZ  1 
+ATOM   3817 O OH  . TYR B 1 177 ? 22.738  37.052  67.017  1.00 12.33 ? ? ? ? ? ? 667 TYR B OH  1 
+ATOM   3818 N N   . LEU B 1 178 ? 23.653  42.679  68.414  1.00 9.75  ? ? ? ? ? ? 668 LEU B N   1 
+ATOM   3819 C CA  . LEU B 1 178 ? 22.369  42.811  69.126  1.00 9.70  ? ? ? ? ? ? 668 LEU B CA  1 
+ATOM   3820 C C   . LEU B 1 178 ? 22.126  44.212  69.708  1.00 10.27 ? ? ? ? ? ? 668 LEU B C   1 
+ATOM   3821 O O   . LEU B 1 178 ? 20.966  44.675  69.781  1.00 10.06 ? ? ? ? ? ? 668 LEU B O   1 
+ATOM   3822 C CB  . LEU B 1 178 ? 22.178  41.711  70.208  1.00 12.22 ? ? ? ? ? ? 668 LEU B CB  1 
+ATOM   3823 C CG  . LEU B 1 178 ? 21.806  40.262  69.820  1.00 12.76 ? ? ? ? ? ? 668 LEU B CG  1 
+ATOM   3824 C CD1 . LEU B 1 178 ? 21.511  39.436  71.082  1.00 13.67 ? ? ? ? ? ? 668 LEU B CD1 1 
+ATOM   3825 C CD2 . LEU B 1 178 ? 20.573  40.239  68.953  1.00 13.16 ? ? ? ? ? ? 668 LEU B CD2 1 
+ATOM   3826 N N   . ASP B 1 179 ? 23.202  44.906  70.111  1.00 10.21 ? ? ? ? ? ? 669 ASP B N   1 
+ATOM   3827 C CA  . ASP B 1 179 ? 23.038  46.280  70.613  1.00 11.23 ? ? ? ? ? ? 669 ASP B CA  1 
+ATOM   3828 C C   . ASP B 1 179 ? 22.387  47.147  69.507  1.00 10.26 ? ? ? ? ? ? 669 ASP B C   1 
+ATOM   3829 O O   . ASP B 1 179 ? 21.503  47.953  69.782  1.00 10.52 ? ? ? ? ? ? 669 ASP B O   1 
+ATOM   3830 C CB  . ASP B 1 179 ? 24.379  46.906  71.018  1.00 13.16 ? ? ? ? ? ? 669 ASP B CB  1 
+ATOM   3831 C CG  . ASP B 1 179 ? 24.997  46.258  72.258  1.00 15.42 ? ? ? ? ? ? 669 ASP B CG  1 
+ATOM   3832 O OD1 . ASP B 1 179 ? 24.367  45.385  72.887  1.00 16.23 ? ? ? ? ? ? 669 ASP B OD1 1 
+ATOM   3833 O OD2 . ASP B 1 179 ? 26.144  46.616  72.574  1.00 17.42 ? ? ? ? ? ? 669 ASP B OD2 1 
+ATOM   3834 N N   . TYR B 1 180 ? 22.812  46.937  68.257  1.00 10.27 ? ? ? ? ? ? 670 TYR B N   1 
+ATOM   3835 C CA  . TYR B 1 180 ? 22.260  47.673  67.096  1.00 10.00 ? ? ? ? ? ? 670 TYR B CA  1 
+ATOM   3836 C C   . TYR B 1 180 ? 20.797  47.301  66.786  1.00 8.66  ? ? ? ? ? ? 670 TYR B C   1 
+ATOM   3837 O O   . TYR B 1 180 ? 19.973  48.169  66.555  1.00 9.29  ? ? ? ? ? ? 670 TYR B O   1 
+ATOM   3838 C CB  . TYR B 1 180 ? 23.111  47.429  65.850  1.00 11.85 ? ? ? ? ? ? 670 TYR B CB  1 
+ATOM   3839 C CG  . TYR B 1 180 ? 24.428  48.165  65.903  1.00 15.11 ? ? ? ? ? ? 670 TYR B CG  1 
+ATOM   3840 C CD1 . TYR B 1 180 ? 24.505  49.495  65.488  1.00 17.50 ? ? ? ? ? ? 670 TYR B CD1 1 
+ATOM   3841 C CD2 . TYR B 1 180 ? 25.576  47.560  66.425  1.00 16.66 ? ? ? ? ? ? 670 TYR B CD2 1 
+ATOM   3842 C CE1 . TYR B 1 180 ? 25.697  50.216  65.597  1.00 20.33 ? ? ? ? ? ? 670 TYR B CE1 1 
+ATOM   3843 C CE2 . TYR B 1 180 ? 26.779  48.276  66.541  1.00 19.78 ? ? ? ? ? ? 670 TYR B CE2 1 
+ATOM   3844 C CZ  . TYR B 1 180 ? 26.829  49.604  66.126  1.00 21.26 ? ? ? ? ? ? 670 TYR B CZ  1 
+ATOM   3845 O OH  . TYR B 1 180 ? 27.994  50.349  66.252  1.00 23.68 ? ? ? ? ? ? 670 TYR B OH  1 
+ATOM   3846 N N   . ALA B 1 181 ? 20.478  46.004  66.798  1.00 8.48  ? ? ? ? ? ? 671 ALA B N   1 
+ATOM   3847 C CA  . ALA B 1 181 ? 19.109  45.542  66.528  1.00 7.62  ? ? ? ? ? ? 671 ALA B CA  1 
+ATOM   3848 C C   . ALA B 1 181 ? 18.139  46.232  67.476  1.00 7.76  ? ? ? ? ? ? 671 ALA B C   1 
+ATOM   3849 O O   . ALA B 1 181 ? 17.111  46.742  67.057  1.00 8.09  ? ? ? ? ? ? 671 ALA B O   1 
+ATOM   3850 C CB  . ALA B 1 181 ? 19.019  44.032  66.671  1.00 7.55  ? ? ? ? ? ? 671 ALA B CB  1 
+ATOM   3851 N N   . PHE B 1 182 ? 18.462  46.228  68.775  1.00 7.93  ? ? ? ? ? ? 672 PHE B N   1 
+ATOM   3852 C CA  . PHE B 1 182 ? 17.602  46.860  69.762  1.00 8.10  ? ? ? ? ? ? 672 PHE B CA  1 
+ATOM   3853 C C   . PHE B 1 182 ? 17.533  48.389  69.640  1.00 8.52  ? ? ? ? ? ? 672 PHE B C   1 
+ATOM   3854 O O   . PHE B 1 182 ? 16.459  48.966  69.801  1.00 9.28  ? ? ? ? ? ? 672 PHE B O   1 
+ATOM   3855 C CB  . PHE B 1 182 ? 17.966  46.400  71.182  1.00 8.38  ? ? ? ? ? ? 672 PHE B CB  1 
+ATOM   3856 C CG  . PHE B 1 182 ? 17.426  45.022  71.517  1.00 8.10  ? ? ? ? ? ? 672 PHE B CG  1 
+ATOM   3857 C CD1 . PHE B 1 182 ? 16.140  44.868  72.047  1.00 8.55  ? ? ? ? ? ? 672 PHE B CD1 1 
+ATOM   3858 C CD2 . PHE B 1 182 ? 18.180  43.867  71.249  1.00 9.00  ? ? ? ? ? ? 672 PHE B CD2 1 
+ATOM   3859 C CE1 . PHE B 1 182 ? 15.616  43.580  72.298  1.00 8.19  ? ? ? ? ? ? 672 PHE B CE1 1 
+ATOM   3860 C CE2 . PHE B 1 182 ? 17.651  42.570  71.500  1.00 8.79  ? ? ? ? ? ? 672 PHE B CE2 1 
+ATOM   3861 C CZ  . PHE B 1 182 ? 16.366  42.449  72.021  1.00 8.26  ? ? ? ? ? ? 672 PHE B CZ  1 
+ATOM   3862 N N   . ARG B 1 183 ? 18.666  49.042  69.351  1.00 9.58  ? ? ? ? ? ? 673 ARG B N   1 
+ATOM   3863 C CA  . ARG B 1 183 ? 18.657  50.508  69.159  1.00 11.70 ? ? ? ? ? ? 673 ARG B CA  1 
+ATOM   3864 C C   . ARG B 1 183 ? 17.779  50.892  67.945  1.00 9.95  ? ? ? ? ? ? 673 ARG B C   1 
+ATOM   3865 O O   . ARG B 1 183 ? 16.962  51.812  68.027  1.00 11.11 ? ? ? ? ? ? 673 ARG B O   1 
+ATOM   3866 C CB  . ARG B 1 183 ? 20.077  51.067  68.987  1.00 13.66 ? ? ? ? ? ? 673 ARG B CB  1 
+ATOM   3867 C CG  . ARG B 1 183 ? 20.870  51.100  70.281  1.00 19.60 ? ? ? ? ? ? 673 ARG B CG  1 
+ATOM   3868 C CD  . ARG B 1 183 ? 22.151  51.928  70.161  1.00 23.96 ? ? ? ? ? ? 673 ARG B CD  1 
+ATOM   3869 N NE  . ARG B 1 183 ? 23.360  51.175  70.526  1.00 29.34 ? ? ? ? ? ? 673 ARG B NE  1 
+ATOM   3870 C CZ  . ARG B 1 183 ? 23.883  51.093  71.757  1.00 31.65 ? ? ? ? ? ? 673 ARG B CZ  1 
+ATOM   3871 N NH1 . ARG B 1 183 ? 23.300  51.712  72.796  1.00 33.06 ? ? ? ? ? ? 673 ARG B NH1 1 
+ATOM   3872 N NH2 . ARG B 1 183 ? 25.058  50.476  71.937  1.00 32.22 ? ? ? ? ? ? 673 ARG B NH2 1 
+ATOM   3873 N N   . TYR B 1 184 ? 17.911  50.144  66.849  1.00 9.56  ? ? ? ? ? ? 674 TYR B N   1 
+ATOM   3874 C CA  . TYR B 1 184 ? 17.117  50.401  65.636  1.00 10.17 ? ? ? ? ? ? 674 TYR B CA  1 
+ATOM   3875 C C   . TYR B 1 184 ? 15.637  50.216  65.910  1.00 10.03 ? ? ? ? ? ? 674 TYR B C   1 
+ATOM   3876 O O   . TYR B 1 184 ? 14.807  50.997  65.440  1.00 10.31 ? ? ? ? ? ? 674 TYR B O   1 
+ATOM   3877 C CB  . TYR B 1 184 ? 17.519  49.480  64.480  1.00 10.16 ? ? ? ? ? ? 674 TYR B CB  1 
+ATOM   3878 C CG  . TYR B 1 184 ? 18.921  49.672  63.980  1.00 10.56 ? ? ? ? ? ? 674 TYR B CG  1 
+ATOM   3879 C CD1 . TYR B 1 184 ? 19.576  50.889  64.126  1.00 11.90 ? ? ? ? ? ? 674 TYR B CD1 1 
+ATOM   3880 C CD2 . TYR B 1 184 ? 19.575  48.639  63.318  1.00 10.39 ? ? ? ? ? ? 674 TYR B CD2 1 
+ATOM   3881 C CE1 . TYR B 1 184 ? 20.874  51.071  63.609  1.00 12.59 ? ? ? ? ? ? 674 TYR B CE1 1 
+ATOM   3882 C CE2 . TYR B 1 184 ? 20.841  48.803  62.792  1.00 12.01 ? ? ? ? ? ? 674 TYR B CE2 1 
+ATOM   3883 C CZ  . TYR B 1 184 ? 21.493  50.022  62.935  1.00 12.37 ? ? ? ? ? ? 674 TYR B CZ  1 
+ATOM   3884 O OH  . TYR B 1 184 ? 22.745  50.188  62.363  1.00 13.88 ? ? ? ? ? ? 674 TYR B OH  1 
+ATOM   3885 N N   . ALA B 1 185 ? 15.303  49.178  66.680  1.00 9.09  ? ? ? ? ? ? 675 ALA B N   1 
+ATOM   3886 C CA  . ALA B 1 185 ? 13.903  48.911  67.009  1.00 8.90  ? ? ? ? ? ? 675 ALA B CA  1 
+ATOM   3887 C C   . ALA B 1 185 ? 13.275  49.994  67.871  1.00 8.27  ? ? ? ? ? ? 675 ALA B C   1 
+ATOM   3888 O O   . ALA B 1 185 ? 12.118  50.383  67.657  1.00 9.81  ? ? ? ? ? ? 675 ALA B O   1 
+ATOM   3889 C CB  . ALA B 1 185 ? 13.776  47.547  67.700  1.00 8.30  ? ? ? ? ? ? 675 ALA B CB  1 
+ATOM   3890 N N   . ARG B 1 186 ? 14.032  50.473  68.848  1.00 8.88  ? ? ? ? ? ? 676 ARG B N   1 
+ATOM   3891 C CA  . ARG B 1 186 ? 13.541  51.504  69.740  1.00 10.75 ? ? ? ? ? ? 676 ARG B CA  1 
+ATOM   3892 C C   . ARG B 1 186 ? 13.240  52.772  68.934  1.00 12.58 ? ? ? ? ? ? 676 ARG B C   1 
+ATOM   3893 O O   . ARG B 1 186 ? 12.203  53.409  69.145  1.00 13.93 ? ? ? ? ? ? 676 ARG B O   1 
+ATOM   3894 C CB  . ARG B 1 186 ? 14.544  51.796  70.874  1.00 10.88 ? ? ? ? ? ? 676 ARG B CB  1 
+ATOM   3895 C CG  . ARG B 1 186 ? 14.094  52.972  71.760  1.00 11.56 ? ? ? ? ? ? 676 ARG B CG  1 
+ATOM   3896 C CD  . ARG B 1 186 ? 12.809  52.660  72.561  1.00 13.67 ? ? ? ? ? ? 676 ARG B CD  1 
+ATOM   3897 N NE  . ARG B 1 186 ? 13.175  52.159  73.886  1.00 15.94 ? ? ? ? ? ? 676 ARG B NE  1 
+ATOM   3898 C CZ  . ARG B 1 186 ? 12.643  51.098  74.499  1.00 17.18 ? ? ? ? ? ? 676 ARG B CZ  1 
+ATOM   3899 N NH1 . ARG B 1 186 ? 11.669  50.379  73.929  1.00 15.82 ? ? ? ? ? ? 676 ARG B NH1 1 
+ATOM   3900 N NH2 . ARG B 1 186 ? 13.148  50.722  75.687  1.00 17.84 ? ? ? ? ? ? 676 ARG B NH2 1 
+ATOM   3901 N N   . GLU B 1 187 ? 14.098  53.098  67.974  1.00 14.35 ? ? ? ? ? ? 677 GLU B N   1 
+ATOM   3902 C CA  . GLU B 1 187 ? 13.864  54.303  67.154  1.00 17.65 ? ? ? ? ? ? 677 GLU B CA  1 
+ATOM   3903 C C   . GLU B 1 187 ? 12.631  54.157  66.237  1.00 16.14 ? ? ? ? ? ? 677 GLU B C   1 
+ATOM   3904 O O   . GLU B 1 187 ? 11.896  55.131  66.017  1.00 16.57 ? ? ? ? ? ? 677 GLU B O   1 
+ATOM   3905 C CB  . GLU B 1 187 ? 15.080  54.615  66.269  1.00 21.71 ? ? ? ? ? ? 677 GLU B CB  1 
+ATOM   3906 C CG  . GLU B 1 187 ? 16.348  55.060  66.984  1.00 28.77 ? ? ? ? ? ? 677 GLU B CG  1 
+ATOM   3907 C CD  . GLU B 1 187 ? 17.641  54.817  66.129  1.00 33.03 ? ? ? ? ? ? 677 GLU B CD  1 
+ATOM   3908 O OE1 . GLU B 1 187 ? 17.570  54.865  64.862  1.00 35.20 ? ? ? ? ? ? 677 GLU B OE1 1 
+ATOM   3909 O OE2 . GLU B 1 187 ? 18.724  54.551  66.732  1.00 35.50 ? ? ? ? ? ? 677 GLU B OE2 1 
+ATOM   3910 N N   . ALA B 1 188 ? 12.403  52.955  65.708  1.00 13.53 ? ? ? ? ? ? 678 ALA B N   1 
+ATOM   3911 C CA  . ALA B 1 188 ? 11.284  52.732  64.789  1.00 12.75 ? ? ? ? ? ? 678 ALA B CA  1 
+ATOM   3912 C C   . ALA B 1 188 ? 9.926   52.833  65.448  1.00 13.57 ? ? ? ? ? ? 678 ALA B C   1 
+ATOM   3913 O O   . ALA B 1 188 ? 8.974   53.340  64.846  1.00 13.94 ? ? ? ? ? ? 678 ALA B O   1 
+ATOM   3914 C CB  . ALA B 1 188 ? 11.430  51.394  64.071  1.00 12.51 ? ? ? ? ? ? 678 ALA B CB  1 
+ATOM   3915 N N   . ASP B 1 189 ? 9.803   52.288  66.652  1.00 12.44 ? ? ? ? ? ? 679 ASP B N   1 
+ATOM   3916 C CA  . ASP B 1 189 ? 8.544   52.375  67.349  1.00 12.87 ? ? ? ? ? ? 679 ASP B CA  1 
+ATOM   3917 C C   . ASP B 1 189 ? 8.856   52.459  68.831  1.00 15.16 ? ? ? ? ? ? 679 ASP B C   1 
+ATOM   3918 O O   . ASP B 1 189 ? 9.030   51.457  69.502  1.00 13.57 ? ? ? ? ? ? 679 ASP B O   1 
+ATOM   3919 C CB  . ASP B 1 189 ? 7.629   51.188  67.030  1.00 12.46 ? ? ? ? ? ? 679 ASP B CB  1 
+ATOM   3920 C CG  . ASP B 1 189 ? 6.274   51.280  67.730  1.00 12.88 ? ? ? ? ? ? 679 ASP B CG  1 
+ATOM   3921 O OD1 . ASP B 1 189 ? 6.028   52.240  68.509  1.00 13.38 ? ? ? ? ? ? 679 ASP B OD1 1 
+ATOM   3922 O OD2 . ASP B 1 189 ? 5.440   50.378  67.478  1.00 13.76 ? ? ? ? ? ? 679 ASP B OD2 1 
+ATOM   3923 N N   . PRO B 1 190 ? 8.880   53.680  69.365  1.00 17.05 ? ? ? ? ? ? 680 PRO B N   1 
+ATOM   3924 C CA  . PRO B 1 190 ? 9.165   53.962  70.776  1.00 17.95 ? ? ? ? ? ? 680 PRO B CA  1 
+ATOM   3925 C C   . PRO B 1 190 ? 8.141   53.373  71.753  1.00 17.24 ? ? ? ? ? ? 680 PRO B C   1 
+ATOM   3926 O O   . PRO B 1 190 ? 8.430   53.252  72.936  1.00 18.25 ? ? ? ? ? ? 680 PRO B O   1 
+ATOM   3927 C CB  . PRO B 1 190 ? 9.126   55.490  70.834  1.00 18.71 ? ? ? ? ? ? 680 PRO B CB  1 
+ATOM   3928 C CG  . PRO B 1 190 ? 9.440   55.913  69.428  1.00 20.37 ? ? ? ? ? ? 680 PRO B CG  1 
+ATOM   3929 C CD  . PRO B 1 190 ? 8.648   54.924  68.617  1.00 18.67 ? ? ? ? ? ? 680 PRO B CD  1 
+ATOM   3930 N N   . ASP B 1 191 ? 6.946   53.040  71.267  1.00 17.74 ? ? ? ? ? ? 681 ASP B N   1 
+ATOM   3931 C CA  . ASP B 1 191 ? 5.887   52.490  72.129  1.00 18.45 ? ? ? ? ? ? 681 ASP B CA  1 
+ATOM   3932 C C   . ASP B 1 191 ? 5.852   50.968  72.283  1.00 17.23 ? ? ? ? ? ? 681 ASP B C   1 
+ATOM   3933 O O   . ASP B 1 191 ? 5.142   50.464  73.158  1.00 16.95 ? ? ? ? ? ? 681 ASP B O   1 
+ATOM   3934 C CB  . ASP B 1 191 ? 4.513   52.997  71.687  1.00 21.21 ? ? ? ? ? ? 681 ASP B CB  1 
+ATOM   3935 C CG  . ASP B 1 191 ? 4.408   54.540  71.729  1.00 25.17 ? ? ? ? ? ? 681 ASP B CG  1 
+ATOM   3936 O OD1 . ASP B 1 191 ? 4.975   55.167  72.660  1.00 26.58 ? ? ? ? ? ? 681 ASP B OD1 1 
+ATOM   3937 O OD2 . ASP B 1 191 ? 3.762   55.125  70.824  1.00 27.13 ? ? ? ? ? ? 681 ASP B OD2 1 
+ATOM   3938 N N   . ALA B 1 192 ? 6.612   50.248  71.454  1.00 13.98 ? ? ? ? ? ? 682 ALA B N   1 
+ATOM   3939 C CA  . ALA B 1 192 ? 6.659   48.789  71.513  1.00 12.50 ? ? ? ? ? ? 682 ALA B CA  1 
+ATOM   3940 C C   . ALA B 1 192 ? 7.575   48.310  72.631  1.00 12.91 ? ? ? ? ? ? 682 ALA B C   1 
+ATOM   3941 O O   . ALA B 1 192 ? 8.613   48.941  72.910  1.00 12.82 ? ? ? ? ? ? 682 ALA B O   1 
+ATOM   3942 C CB  . ALA B 1 192 ? 7.158   48.228  70.204  1.00 12.34 ? ? ? ? ? ? 682 ALA B CB  1 
+ATOM   3943 N N   . LEU B 1 193 ? 7.199   47.204  73.283  1.00 11.28 ? ? ? ? ? ? 683 LEU B N   1 
+ATOM   3944 C CA  . LEU B 1 193 ? 8.067   46.610  74.314  1.00 10.10 ? ? ? ? ? ? 683 LEU B CA  1 
+ATOM   3945 C C   . LEU B 1 193 ? 8.967   45.681  73.511  1.00 9.22  ? ? ? ? ? ? 683 LEU B C   1 
+ATOM   3946 O O   . LEU B 1 193 ? 8.477   44.869  72.723  1.00 10.13 ? ? ? ? ? ? 683 LEU B O   1 
+ATOM   3947 C CB  . LEU B 1 193 ? 7.256   45.818  75.342  1.00 10.61 ? ? ? ? ? ? 683 LEU B CB  1 
+ATOM   3948 C CG  . LEU B 1 193 ? 6.375   46.738  76.175  1.00 12.04 ? ? ? ? ? ? 683 LEU B CG  1 
+ATOM   3949 C CD1 . LEU B 1 193 ? 5.394   45.872  76.989  1.00 13.23 ? ? ? ? ? ? 683 LEU B CD1 1 
+ATOM   3950 C CD2 . LEU B 1 193 ? 7.240   47.665  77.047  1.00 13.96 ? ? ? ? ? ? 683 LEU B CD2 1 
+ATOM   3951 N N   . LEU B 1 194 ? 10.274  45.798  73.700  1.00 8.11  ? ? ? ? ? ? 684 LEU B N   1 
+ATOM   3952 C CA  . LEU B 1 194 ? 11.256  45.028  72.945  1.00 7.87  ? ? ? ? ? ? 684 LEU B CA  1 
+ATOM   3953 C C   . LEU B 1 194 ? 11.744  43.823  73.730  1.00 7.93  ? ? ? ? ? ? 684 LEU B C   1 
+ATOM   3954 O O   . LEU B 1 194 ? 12.244  43.990  74.839  1.00 8.95  ? ? ? ? ? ? 684 LEU B O   1 
+ATOM   3955 C CB  . LEU B 1 194 ? 12.452  45.934  72.572  1.00 7.86  ? ? ? ? ? ? 684 LEU B CB  1 
+ATOM   3956 C CG  . LEU B 1 194 ? 12.090  47.261  71.873  1.00 8.50  ? ? ? ? ? ? 684 LEU B CG  1 
+ATOM   3957 C CD1 . LEU B 1 194 ? 13.356  47.992  71.512  1.00 9.99  ? ? ? ? ? ? 684 LEU B CD1 1 
+ATOM   3958 C CD2 . LEU B 1 194 ? 11.201  46.970  70.640  1.00 7.93  ? ? ? ? ? ? 684 LEU B CD2 1 
+ATOM   3959 N N   . PHE B 1 195 ? 11.701  42.645  73.105  1.00 7.56  ? ? ? ? ? ? 685 PHE B N   1 
+ATOM   3960 C CA  . PHE B 1 195 ? 12.086  41.366  73.746  1.00 7.46  ? ? ? ? ? ? 685 PHE B CA  1 
+ATOM   3961 C C   . PHE B 1 195 ? 13.190  40.579  73.066  1.00 8.44  ? ? ? ? ? ? 685 PHE B C   1 
+ATOM   3962 O O   . PHE B 1 195 ? 13.348  40.607  71.829  1.00 8.27  ? ? ? ? ? ? 685 PHE B O   1 
+ATOM   3963 C CB  . PHE B 1 195 ? 10.868  40.403  73.755  1.00 8.01  ? ? ? ? ? ? 685 PHE B CB  1 
+ATOM   3964 C CG  . PHE B 1 195 ? 9.815   40.730  74.786  1.00 8.44  ? ? ? ? ? ? 685 PHE B CG  1 
+ATOM   3965 C CD1 . PHE B 1 195 ? 8.981   41.839  74.637  1.00 9.16  ? ? ? ? ? ? 685 PHE B CD1 1 
+ATOM   3966 C CD2 . PHE B 1 195 ? 9.698   39.953  75.944  1.00 9.56  ? ? ? ? ? ? 685 PHE B CD2 1 
+ATOM   3967 C CE1 . PHE B 1 195 ? 8.057   42.188  75.619  1.00 10.18 ? ? ? ? ? ? 685 PHE B CE1 1 
+ATOM   3968 C CE2 . PHE B 1 195 ? 8.767   40.298  76.946  1.00 10.55 ? ? ? ? ? ? 685 PHE B CE2 1 
+ATOM   3969 C CZ  . PHE B 1 195 ? 7.952   41.416  76.787  1.00 10.25 ? ? ? ? ? ? 685 PHE B CZ  1 
+ATOM   3970 N N   . TYR B 1 196 ? 13.940  39.865  73.887  1.00 7.46  ? ? ? ? ? ? 686 TYR B N   1 
+ATOM   3971 C CA  . TYR B 1 196 ? 14.928  38.897  73.437  1.00 7.95  ? ? ? ? ? ? 686 TYR B CA  1 
+ATOM   3972 C C   . TYR B 1 196 ? 14.172  37.582  73.782  1.00 8.47  ? ? ? ? ? ? 686 TYR B C   1 
+ATOM   3973 O O   . TYR B 1 196 ? 13.762  37.401  74.939  1.00 9.09  ? ? ? ? ? ? 686 TYR B O   1 
+ATOM   3974 C CB  . TYR B 1 196 ? 16.220  38.986  74.236  1.00 7.80  ? ? ? ? ? ? 686 TYR B CB  1 
+ATOM   3975 C CG  . TYR B 1 196 ? 17.156  37.848  73.919  1.00 9.32  ? ? ? ? ? ? 686 TYR B CG  1 
+ATOM   3976 C CD1 . TYR B 1 196 ? 17.921  37.843  72.751  1.00 10.49 ? ? ? ? ? ? 686 TYR B CD1 1 
+ATOM   3977 C CD2 . TYR B 1 196 ? 17.181  36.696  74.722  1.00 9.33  ? ? ? ? ? ? 686 TYR B CD2 1 
+ATOM   3978 C CE1 . TYR B 1 196 ? 18.663  36.721  72.384  1.00 11.33 ? ? ? ? ? ? 686 TYR B CE1 1 
+ATOM   3979 C CE2 . TYR B 1 196 ? 17.920  35.587  74.365  1.00 9.79  ? ? ? ? ? ? 686 TYR B CE2 1 
+ATOM   3980 C CZ  . TYR B 1 196 ? 18.650  35.600  73.196  1.00 11.43 ? ? ? ? ? ? 686 TYR B CZ  1 
+ATOM   3981 O OH  . TYR B 1 196 ? 19.318  34.474  72.808  1.00 12.88 ? ? ? ? ? ? 686 TYR B OH  1 
+ATOM   3982 N N   . ASN B 1 197 ? 13.990  36.688  72.809  1.00 7.37  ? ? ? ? ? ? 687 ASN B N   1 
+ATOM   3983 C CA  . ASN B 1 197 ? 13.208  35.452  72.982  1.00 7.43  ? ? ? ? ? ? 687 ASN B CA  1 
+ATOM   3984 C C   . ASN B 1 197 ? 14.121  34.216  72.796  1.00 8.97  ? ? ? ? ? ? 687 ASN B C   1 
+ATOM   3985 O O   . ASN B 1 197 ? 14.928  34.173  71.854  1.00 9.40  ? ? ? ? ? ? 687 ASN B O   1 
+ATOM   3986 C CB  . ASN B 1 197 ? 12.056  35.478  71.936  1.00 7.96  ? ? ? ? ? ? 687 ASN B CB  1 
+ATOM   3987 C CG  . ASN B 1 197 ? 11.060  34.315  72.085  1.00 9.11  ? ? ? ? ? ? 687 ASN B CG  1 
+ATOM   3988 O OD1 . ASN B 1 197 ? 10.861  33.506  71.161  1.00 10.19 ? ? ? ? ? ? 687 ASN B OD1 1 
+ATOM   3989 N ND2 . ASN B 1 197 ? 10.405  34.260  73.220  1.00 8.05  ? ? ? ? ? ? 687 ASN B ND2 1 
+ATOM   3990 N N   . ASP B 1 198 ? 13.999  33.204  73.666  1.00 8.15  ? ? ? ? ? ? 688 ASP B N   1 
+ATOM   3991 C CA  . ASP B 1 198 ? 14.862  32.014  73.554  1.00 8.37  ? ? ? ? ? ? 688 ASP B CA  1 
+ATOM   3992 C C   . ASP B 1 198 ? 14.244  30.810  74.325  1.00 8.87  ? ? ? ? ? ? 688 ASP B C   1 
+ATOM   3993 O O   . ASP B 1 198 ? 13.250  30.964  75.056  1.00 8.64  ? ? ? ? ? ? 688 ASP B O   1 
+ATOM   3994 C CB  . ASP B 1 198 ? 16.275  32.319  74.126  1.00 8.61  ? ? ? ? ? ? 688 ASP B CB  1 
+ATOM   3995 C CG  . ASP B 1 198 ? 17.407  31.617  73.369  1.00 8.78  ? ? ? ? ? ? 688 ASP B CG  1 
+ATOM   3996 O OD1 . ASP B 1 198 ? 17.213  30.572  72.733  1.00 9.86  ? ? ? ? ? ? 688 ASP B OD1 1 
+ATOM   3997 O OD2 . ASP B 1 198 ? 18.541  32.124  73.395  1.00 11.65 ? ? ? ? ? ? 688 ASP B OD2 1 
+ATOM   3998 N N   . TYR B 1 199 ? 14.787  29.621  74.048  1.00 9.44  ? ? ? ? ? ? 689 TYR B N   1 
+ATOM   3999 C CA  . TYR B 1 199 ? 14.363  28.385  74.703  1.00 10.15 ? ? ? ? ? ? 689 TYR B CA  1 
+ATOM   4000 C C   . TYR B 1 199 ? 15.478  27.899  75.670  1.00 10.54 ? ? ? ? ? ? 689 TYR B C   1 
+ATOM   4001 O O   . TYR B 1 199 ? 16.660  28.237  75.537  1.00 9.98  ? ? ? ? ? ? 689 TYR B O   1 
+ATOM   4002 C CB  . TYR B 1 199 ? 14.011  27.298  73.686  1.00 10.64 ? ? ? ? ? ? 689 TYR B CB  1 
+ATOM   4003 C CG  . TYR B 1 199 ? 15.154  26.863  72.807  1.00 12.46 ? ? ? ? ? ? 689 TYR B CG  1 
+ATOM   4004 C CD1 . TYR B 1 199 ? 16.035  25.850  73.213  1.00 13.22 ? ? ? ? ? ? 689 TYR B CD1 1 
+ATOM   4005 C CD2 . TYR B 1 199 ? 15.402  27.498  71.582  1.00 13.29 ? ? ? ? ? ? 689 TYR B CD2 1 
+ATOM   4006 C CE1 . TYR B 1 199 ? 17.144  25.491  72.430  1.00 14.11 ? ? ? ? ? ? 689 TYR B CE1 1 
+ATOM   4007 C CE2 . TYR B 1 199 ? 16.491  27.145  70.796  1.00 14.28 ? ? ? ? ? ? 689 TYR B CE2 1 
+ATOM   4008 C CZ  . TYR B 1 199 ? 17.367  26.146  71.224  1.00 15.76 ? ? ? ? ? ? 689 TYR B CZ  1 
+ATOM   4009 O OH  . TYR B 1 199 ? 18.484  25.840  70.457  1.00 17.07 ? ? ? ? ? ? 689 TYR B OH  1 
+ATOM   4010 N N   . ASN B 1 200 ? 15.072  27.086  76.638  1.00 12.08 ? ? ? ? ? ? 690 ASN B N   1 
+ATOM   4011 C CA  . ASN B 1 200 ? 15.973  26.562  77.647  1.00 12.91 ? ? ? ? ? ? 690 ASN B CA  1 
+ATOM   4012 C C   . ASN B 1 200 ? 16.693  27.651  78.431  1.00 12.35 ? ? ? ? ? ? 690 ASN B C   1 
+ATOM   4013 O O   . ASN B 1 200 ? 17.846  27.479  78.828  1.00 12.87 ? ? ? ? ? ? 690 ASN B O   1 
+ATOM   4014 C CB  . ASN B 1 200 ? 16.957  25.543  77.075  1.00 16.85 ? ? ? ? ? ? 690 ASN B CB  1 
+ATOM   4015 C CG  . ASN B 1 200 ? 17.572  24.662  78.168  1.00 22.48 ? ? ? ? ? ? 690 ASN B CG  1 
+ATOM   4016 O OD1 . ASN B 1 200 ? 16.922  24.382  79.210  1.00 25.36 ? ? ? ? ? ? 690 ASN B OD1 1 
+ATOM   4017 N ND2 . ASN B 1 200 ? 18.827  24.240  77.964  1.00 24.04 ? ? ? ? ? ? 690 ASN B ND2 1 
+ATOM   4018 N N   . ILE B 1 201 ? 15.990  28.761  78.686  1.00 10.98 ? ? ? ? ? ? 691 ILE B N   1 
+ATOM   4019 C CA  . ILE B 1 201 ? 16.533  29.882  79.485  1.00 9.94  ? ? ? ? ? ? 691 ILE B CA  1 
+ATOM   4020 C C   . ILE B 1 201 ? 15.580  30.184  80.661  1.00 10.20 ? ? ? ? ? ? 691 ILE B C   1 
+ATOM   4021 O O   . ILE B 1 201 ? 15.709  31.199  81.332  1.00 11.07 ? ? ? ? ? ? 691 ILE B O   1 
+ATOM   4022 C CB  . ILE B 1 201 ? 16.708  31.182  78.638  1.00 9.80  ? ? ? ? ? ? 691 ILE B CB  1 
+ATOM   4023 C CG1 . ILE B 1 201 ? 15.350  31.632  78.076  1.00 9.14  ? ? ? ? ? ? 691 ILE B CG1 1 
+ATOM   4024 C CG2 . ILE B 1 201 ? 17.779  30.953  77.536  1.00 10.15 ? ? ? ? ? ? 691 ILE B CG2 1 
+ATOM   4025 C CD1 . ILE B 1 201 ? 15.337  33.064  77.621  1.00 10.14 ? ? ? ? ? ? 691 ILE B CD1 1 
+ATOM   4026 N N   . GLU B 1 202 ? 14.644  29.270  80.920  1.00 9.37  ? ? ? ? ? ? 692 GLU B N   1 
+ATOM   4027 C CA  . GLU B 1 202 ? 13.645  29.459  81.974  1.00 10.91 ? ? ? ? ? ? 692 GLU B CA  1 
+ATOM   4028 C C   . GLU B 1 202 ? 14.082  29.116  83.401  1.00 10.68 ? ? ? ? ? ? 692 GLU B C   1 
+ATOM   4029 O O   . GLU B 1 202 ? 13.560  29.692  84.352  1.00 11.85 ? ? ? ? ? ? 692 GLU B O   1 
+ATOM   4030 C CB  . GLU B 1 202 ? 12.388  28.646  81.657  1.00 11.61 ? ? ? ? ? ? 692 GLU B CB  1 
+ATOM   4031 C CG  . GLU B 1 202 ? 11.754  28.957  80.292  1.00 11.88 ? ? ? ? ? ? 692 GLU B CG  1 
+ATOM   4032 C CD  . GLU B 1 202 ? 12.297  28.116  79.150  1.00 12.28 ? ? ? ? ? ? 692 GLU B CD  1 
+ATOM   4033 O OE1 . GLU B 1 202 ? 13.223  27.287  79.338  1.00 12.71 ? ? ? ? ? ? 692 GLU B OE1 1 
+ATOM   4034 O OE2 . GLU B 1 202 ? 11.770  28.272  78.030  1.00 13.89 ? ? ? ? ? ? 692 GLU B OE2 1 
+ATOM   4035 N N   . ASP B 1 203 ? 15.022  28.189  83.531  1.00 11.68 ? ? ? ? ? ? 693 ASP B N   1 
+ATOM   4036 C CA  . ASP B 1 203 ? 15.489  27.731  84.863  1.00 12.97 ? ? ? ? ? ? 693 ASP B CA  1 
+ATOM   4037 C C   . ASP B 1 203 ? 16.680  28.550  85.359  1.00 12.88 ? ? ? ? ? ? 693 ASP B C   1 
+ATOM   4038 O O   . ASP B 1 203 ? 16.764  29.757  85.077  1.00 12.52 ? ? ? ? ? ? 693 ASP B O   1 
+ATOM   4039 C CB  . ASP B 1 203 ? 15.807  26.224  84.805  1.00 14.04 ? ? ? ? ? ? 693 ASP B CB  1 
+ATOM   4040 C CG  . ASP B 1 203 ? 16.938  25.870  83.809  1.00 15.65 ? ? ? ? ? ? 693 ASP B CG  1 
+ATOM   4041 O OD1 . ASP B 1 203 ? 17.634  26.765  83.283  1.00 15.60 ? ? ? ? ? ? 693 ASP B OD1 1 
+ATOM   4042 O OD2 . ASP B 1 203 ? 17.135  24.660  83.529  1.00 17.74 ? ? ? ? ? ? 693 ASP B OD2 1 
+ATOM   4043 N N   . LEU B 1 204 ? 17.552  27.929  86.159  1.00 12.21 ? ? ? ? ? ? 694 LEU B N   1 
+ATOM   4044 C CA  . LEU B 1 204 ? 18.758  28.618  86.636  1.00 12.19 ? ? ? ? ? ? 694 LEU B CA  1 
+ATOM   4045 C C   . LEU B 1 204 ? 20.037  27.912  86.112  1.00 12.27 ? ? ? ? ? ? 694 LEU B C   1 
+ATOM   4046 O O   . LEU B 1 204 ? 21.113  27.988  86.707  1.00 13.93 ? ? ? ? ? ? 694 LEU B O   1 
+ATOM   4047 C CB  . LEU B 1 204 ? 18.749  28.752  88.170  1.00 11.38 ? ? ? ? ? ? 694 LEU B CB  1 
+ATOM   4048 C CG  . LEU B 1 204 ? 17.626  29.604  88.766  1.00 12.07 ? ? ? ? ? ? 694 LEU B CG  1 
+ATOM   4049 C CD1 . LEU B 1 204 ? 17.505  29.368  90.298  1.00 13.14 ? ? ? ? ? ? 694 LEU B CD1 1 
+ATOM   4050 C CD2 . LEU B 1 204 ? 17.836  31.097  88.431  1.00 12.37 ? ? ? ? ? ? 694 LEU B CD2 1 
+ATOM   4051 N N   . GLY B 1 205 ? 19.920  27.255  84.968  1.00 12.16 ? ? ? ? ? ? 695 GLY B N   1 
+ATOM   4052 C CA  . GLY B 1 205 ? 21.049  26.557  84.380  1.00 12.78 ? ? ? ? ? ? 695 GLY B CA  1 
+ATOM   4053 C C   . GLY B 1 205 ? 22.040  27.450  83.626  1.00 13.66 ? ? ? ? ? ? 695 GLY B C   1 
+ATOM   4054 O O   . GLY B 1 205 ? 21.825  28.661  83.500  1.00 13.73 ? ? ? ? ? ? 695 GLY B O   1 
+ATOM   4055 N N   . PRO B 1 206 ? 23.069  26.857  82.998  1.00 14.68 ? ? ? ? ? ? 696 PRO B N   1 
+ATOM   4056 C CA  . PRO B 1 206 ? 24.088  27.627  82.249  1.00 15.00 ? ? ? ? ? ? 696 PRO B CA  1 
+ATOM   4057 C C   . PRO B 1 206 ? 23.554  28.590  81.163  1.00 13.65 ? ? ? ? ? ? 696 PRO B C   1 
+ATOM   4058 O O   . PRO B 1 206 ? 23.955  29.755  81.131  1.00 13.72 ? ? ? ? ? ? 696 PRO B O   1 
+ATOM   4059 C CB  . PRO B 1 206 ? 24.993  26.531  81.655  1.00 15.71 ? ? ? ? ? ? 696 PRO B CB  1 
+ATOM   4060 C CG  . PRO B 1 206 ? 24.823  25.369  82.628  1.00 17.35 ? ? ? ? ? ? 696 PRO B CG  1 
+ATOM   4061 C CD  . PRO B 1 206 ? 23.361  25.405  82.979  1.00 15.69 ? ? ? ? ? ? 696 PRO B CD  1 
+ATOM   4062 N N   . LYS B 1 207 ? 22.676  28.105  80.285  1.00 12.21 ? ? ? ? ? ? 697 LYS B N   1 
+ATOM   4063 C CA  . LYS B 1 207 ? 22.130  28.957  79.229  1.00 11.52 ? ? ? ? ? ? 697 LYS B CA  1 
+ATOM   4064 C C   . LYS B 1 207 ? 21.305  30.094  79.822  1.00 12.02 ? ? ? ? ? ? 697 LYS B C   1 
+ATOM   4065 O O   . LYS B 1 207 ? 21.386  31.229  79.353  1.00 12.65 ? ? ? ? ? ? 697 LYS B O   1 
+ATOM   4066 C CB  . LYS B 1 207 ? 21.280  28.157  78.257  1.00 10.45 ? ? ? ? ? ? 697 LYS B CB  1 
+ATOM   4067 C CG  . LYS B 1 207 ? 21.049  28.902  76.920  1.00 11.25 ? ? ? ? ? ? 697 LYS B CG  1 
+ATOM   4068 C CD  . LYS B 1 207 ? 20.106  28.129  76.033  1.00 10.63 ? ? ? ? ? ? 697 LYS B CD  1 
+ATOM   4069 C CE  . LYS B 1 207 ? 19.905  28.803  74.657  1.00 11.19 ? ? ? ? ? ? 697 LYS B CE  1 
+ATOM   4070 N NZ  . LYS B 1 207 ? 18.918  28.046  73.852  1.00 10.42 ? ? ? ? ? ? 697 LYS B NZ  1 
+ATOM   4071 N N   . SER B 1 208 ? 20.481  29.799  80.831  1.00 11.81 ? ? ? ? ? ? 698 SER B N   1 
+ATOM   4072 C CA  . SER B 1 208 ? 19.683  30.833  81.494  1.00 10.89 ? ? ? ? ? ? 698 SER B CA  1 
+ATOM   4073 C C   . SER B 1 208 ? 20.570  31.938  82.137  1.00 11.77 ? ? ? ? ? ? 698 SER B C   1 
+ATOM   4074 O O   . SER B 1 208 ? 20.271  33.152  82.040  1.00 11.16 ? ? ? ? ? ? 698 SER B O   1 
+ATOM   4075 C CB  . SER B 1 208 ? 18.777  30.216  82.574  1.00 10.87 ? ? ? ? ? ? 698 SER B CB  1 
+ATOM   4076 O OG  . SER B 1 208 ? 18.252  31.229  83.410  1.00 10.80 ? ? ? ? ? ? 698 SER B OG  1 
+ATOM   4077 N N   . ASN B 1 209 ? 21.647  31.522  82.810  1.00 11.27 ? ? ? ? ? ? 699 ASN B N   1 
+ATOM   4078 C CA  . ASN B 1 209 ? 22.543  32.500  83.440  1.00 12.24 ? ? ? ? ? ? 699 ASN B CA  1 
+ATOM   4079 C C   . ASN B 1 209 ? 23.243  33.368  82.400  1.00 12.28 ? ? ? ? ? ? 699 ASN B C   1 
+ATOM   4080 O O   . ASN B 1 209 ? 23.464  34.555  82.639  1.00 13.18 ? ? ? ? ? ? 699 ASN B O   1 
+ATOM   4081 C CB  . ASN B 1 209 ? 23.588  31.818  84.325  1.00 13.86 ? ? ? ? ? ? 699 ASN B CB  1 
+ATOM   4082 C CG  . ASN B 1 209 ? 22.960  31.051  85.484  1.00 15.00 ? ? ? ? ? ? 699 ASN B CG  1 
+ATOM   4083 O OD1 . ASN B 1 209 ? 21.883  31.399  85.979  1.00 14.79 ? ? ? ? ? ? 699 ASN B OD1 1 
+ATOM   4084 N ND2 . ASN B 1 209 ? 23.614  29.967  85.880  1.00 16.53 ? ? ? ? ? ? 699 ASN B ND2 1 
+ATOM   4085 N N   . ALA B 1 210 ? 23.632  32.761  81.276  1.00 12.63 ? ? ? ? ? ? 700 ALA B N   1 
+ATOM   4086 C CA  . ALA B 1 210 ? 24.295  33.498  80.165  1.00 13.10 ? ? ? ? ? ? 700 ALA B CA  1 
+ATOM   4087 C C   . ALA B 1 210 ? 23.346  34.582  79.607  1.00 12.50 ? ? ? ? ? ? 700 ALA B C   1 
+ATOM   4088 O O   . ALA B 1 210 ? 23.754  35.725  79.417  1.00 12.67 ? ? ? ? ? ? 700 ALA B O   1 
+ATOM   4089 C CB  . ALA B 1 210 ? 24.736  32.529  79.050  1.00 12.51 ? ? ? ? ? ? 700 ALA B CB  1 
+ATOM   4090 N N   . VAL B 1 211 ? 22.076  34.247  79.389  1.00 11.96 ? ? ? ? ? ? 701 VAL B N   1 
+ATOM   4091 C CA  . VAL B 1 211 ? 21.106  35.224  78.886  1.00 11.40 ? ? ? ? ? ? 701 VAL B CA  1 
+ATOM   4092 C C   . VAL B 1 211 ? 20.800  36.307  79.927  1.00 11.83 ? ? ? ? ? ? 701 VAL B C   1 
+ATOM   4093 O O   . VAL B 1 211 ? 20.739  37.499  79.604  1.00 12.54 ? ? ? ? ? ? 701 VAL B O   1 
+ATOM   4094 C CB  . VAL B 1 211 ? 19.824  34.532  78.356  1.00 11.59 ? ? ? ? ? ? 701 VAL B CB  1 
+ATOM   4095 C CG1 . VAL B 1 211 ? 18.707  35.541  78.109  1.00 10.70 ? ? ? ? ? ? 701 VAL B CG1 1 
+ATOM   4096 C CG2 . VAL B 1 211 ? 20.159  33.727  77.090  1.00 10.92 ? ? ? ? ? ? 701 VAL B CG2 1 
+ATOM   4097 N N   . PHE B 1 212 ? 20.667  35.921  81.195  1.00 10.74 ? ? ? ? ? ? 702 PHE B N   1 
+ATOM   4098 C CA  . PHE B 1 212 ? 20.424  36.914  82.233  1.00 11.38 ? ? ? ? ? ? 702 PHE B CA  1 
+ATOM   4099 C C   . PHE B 1 212 ? 21.606  37.927  82.291  1.00 11.37 ? ? ? ? ? ? 702 PHE B C   1 
+ATOM   4100 O O   . PHE B 1 212 ? 21.395  39.133  82.342  1.00 11.85 ? ? ? ? ? ? 702 PHE B O   1 
+ATOM   4101 C CB  . PHE B 1 212 ? 20.204  36.233  83.605  1.00 11.28 ? ? ? ? ? ? 702 PHE B CB  1 
+ATOM   4102 C CG  . PHE B 1 212 ? 20.147  37.200  84.744  1.00 10.78 ? ? ? ? ? ? 702 PHE B CG  1 
+ATOM   4103 C CD1 . PHE B 1 212 ? 18.998  37.917  85.000  1.00 11.62 ? ? ? ? ? ? 702 PHE B CD1 1 
+ATOM   4104 C CD2 . PHE B 1 212 ? 21.272  37.441  85.514  1.00 11.35 ? ? ? ? ? ? 702 PHE B CD2 1 
+ATOM   4105 C CE1 . PHE B 1 212 ? 18.957  38.877  86.013  1.00 12.29 ? ? ? ? ? ? 702 PHE B CE1 1 
+ATOM   4106 C CE2 . PHE B 1 212 ? 21.236  38.399  86.523  1.00 12.56 ? ? ? ? ? ? 702 PHE B CE2 1 
+ATOM   4107 C CZ  . PHE B 1 212 ? 20.076  39.115  86.769  1.00 12.23 ? ? ? ? ? ? 702 PHE B CZ  1 
+ATOM   4108 N N   . ASN B 1 213 ? 22.837  37.426  82.321  1.00 13.04 ? ? ? ? ? ? 703 ASN B N   1 
+ATOM   4109 C CA  . ASN B 1 213 ? 24.022  38.306  82.368  1.00 14.48 ? ? ? ? ? ? 703 ASN B CA  1 
+ATOM   4110 C C   . ASN B 1 213 ? 24.059  39.228  81.126  1.00 14.60 ? ? ? ? ? ? 703 ASN B C   1 
+ATOM   4111 O O   . ASN B 1 213 ? 24.353  40.416  81.250  1.00 14.54 ? ? ? ? ? ? 703 ASN B O   1 
+ATOM   4112 C CB  . ASN B 1 213 ? 25.334  37.494  82.476  1.00 17.09 ? ? ? ? ? ? 703 ASN B CB  1 
+ATOM   4113 C CG  . ASN B 1 213 ? 25.473  36.744  83.821  1.00 20.04 ? ? ? ? ? ? 703 ASN B CG  1 
+ATOM   4114 O OD1 . ASN B 1 213 ? 25.000  37.207  84.850  1.00 20.78 ? ? ? ? ? ? 703 ASN B OD1 1 
+ATOM   4115 N ND2 . ASN B 1 213 ? 26.149  35.587  83.797  1.00 22.33 ? ? ? ? ? ? 703 ASN B ND2 1 
+ATOM   4116 N N   . MET B 1 214 ? 23.767  38.673  79.944  1.00 14.23 ? ? ? ? ? ? 704 MET B N   1 
+ATOM   4117 C CA  . MET B 1 214 ? 23.755  39.457  78.710  1.00 14.02 ? ? ? ? ? ? 704 MET B CA  1 
+ATOM   4118 C C   . MET B 1 214 ? 22.765  40.604  78.831  1.00 13.16 ? ? ? ? ? ? 704 MET B C   1 
+ATOM   4119 O O   . MET B 1 214 ? 23.086  41.760  78.548  1.00 13.49 ? ? ? ? ? ? 704 MET B O   1 
+ATOM   4120 C CB  . MET B 1 214 ? 23.352  38.594  77.516  1.00 14.46 ? ? ? ? ? ? 704 MET B CB  1 
+ATOM   4121 C CG  . MET B 1 214 ? 23.258  39.411  76.217  1.00 15.96 ? ? ? ? ? ? 704 MET B CG  1 
+ATOM   4122 S SD  . MET B 1 214 ? 22.794  38.421  74.800  1.00 18.48 ? ? ? ? ? ? 704 MET B SD  1 
+ATOM   4123 C CE  . MET B 1 214 ? 21.079  38.288  75.044  1.00 17.01 ? ? ? ? ? ? 704 MET B CE  1 
+ATOM   4124 N N   . ILE B 1 215 ? 21.555  40.287  79.274  1.00 11.75 ? ? ? ? ? ? 705 ILE B N   1 
+ATOM   4125 C CA  . ILE B 1 215 ? 20.519  41.286  79.406  1.00 12.82 ? ? ? ? ? ? 705 ILE B CA  1 
+ATOM   4126 C C   . ILE B 1 215 ? 20.848  42.303  80.496  1.00 13.76 ? ? ? ? ? ? 705 ILE B C   1 
+ATOM   4127 O O   . ILE B 1 215 ? 20.622  43.502  80.325  1.00 14.33 ? ? ? ? ? ? 705 ILE B O   1 
+ATOM   4128 C CB  . ILE B 1 215 ? 19.129  40.630  79.599  1.00 11.77 ? ? ? ? ? ? 705 ILE B CB  1 
+ATOM   4129 C CG1 . ILE B 1 215 ? 18.767  39.854  78.317  1.00 11.57 ? ? ? ? ? ? 705 ILE B CG1 1 
+ATOM   4130 C CG2 . ILE B 1 215 ? 18.108  41.683  79.994  1.00 11.98 ? ? ? ? ? ? 705 ILE B CG2 1 
+ATOM   4131 C CD1 . ILE B 1 215 ? 17.448  39.162  78.358  1.00 12.17 ? ? ? ? ? ? 705 ILE B CD1 1 
+ATOM   4132 N N   . LYS B 1 216 ? 21.443  41.826  81.589  1.00 14.31 ? ? ? ? ? ? 706 LYS B N   1 
+ATOM   4133 C CA  . LYS B 1 216 ? 21.827  42.716  82.671  1.00 15.58 ? ? ? ? ? ? 706 LYS B CA  1 
+ATOM   4134 C C   . LYS B 1 216 ? 22.849  43.726  82.163  1.00 14.92 ? ? ? ? ? ? 706 LYS B C   1 
+ATOM   4135 O O   . LYS B 1 216 ? 22.726  44.905  82.414  1.00 15.58 ? ? ? ? ? ? 706 LYS B O   1 
+ATOM   4136 C CB  . LYS B 1 216 ? 22.422  41.918  83.821  1.00 16.08 ? ? ? ? ? ? 706 LYS B CB  1 
+ATOM   4137 C CG  . LYS B 1 216 ? 22.738  42.768  85.015  1.00 18.75 ? ? ? ? ? ? 706 LYS B CG  1 
+ATOM   4138 C CD  . LYS B 1 216 ? 23.272  41.889  86.122  1.00 22.23 ? ? ? ? ? ? 706 LYS B CD  1 
+ATOM   4139 C CE  . LYS B 1 216 ? 23.824  42.740  87.258  1.00 25.37 ? ? ? ? ? ? 706 LYS B CE  1 
+ATOM   4140 N NZ  . LYS B 1 216 ? 22.818  43.732  87.779  1.00 26.98 ? ? ? ? ? ? 706 LYS B NZ  1 
+ATOM   4141 N N   . SER B 1 217 ? 23.825  43.251  81.410  1.00 15.08 ? ? ? ? ? ? 707 SER B N   1 
+ATOM   4142 C CA  . SER B 1 217 ? 24.865  44.096  80.868  1.00 16.51 ? ? ? ? ? ? 707 SER B CA  1 
+ATOM   4143 C C   . SER B 1 217 ? 24.305  45.113  79.880  1.00 17.16 ? ? ? ? ? ? 707 SER B C   1 
+ATOM   4144 O O   . SER B 1 217 ? 24.687  46.289  79.918  1.00 17.21 ? ? ? ? ? ? 707 SER B O   1 
+ATOM   4145 C CB  . SER B 1 217 ? 25.924  43.239  80.195  1.00 17.56 ? ? ? ? ? ? 707 SER B CB  1 
+ATOM   4146 O OG  . SER B 1 217 ? 26.993  44.040  79.724  1.00 21.02 ? ? ? ? ? ? 707 SER B OG  1 
+ATOM   4147 N N   . MET B 1 218 ? 23.405  44.668  79.008  1.00 16.82 ? ? ? ? ? ? 708 MET B N   1 
+ATOM   4148 C CA  . MET B 1 218 ? 22.788  45.564  78.034  1.00 18.53 ? ? ? ? ? ? 708 MET B CA  1 
+ATOM   4149 C C   . MET B 1 218 ? 22.071  46.692  78.758  1.00 19.86 ? ? ? ? ? ? 708 MET B C   1 
+ATOM   4150 O O   . MET B 1 218 ? 22.191  47.859  78.371  1.00 20.74 ? ? ? ? ? ? 708 MET B O   1 
+ATOM   4151 C CB  . MET B 1 218 ? 21.798  44.816  77.146  1.00 18.75 ? ? ? ? ? ? 708 MET B CB  1 
+ATOM   4152 C CG  . MET B 1 218 ? 22.433  43.926  76.078  1.00 20.22 ? ? ? ? ? ? 708 MET B CG  1 
+ATOM   4153 S SD  . MET B 1 218 ? 21.141  42.885  75.241  1.00 22.08 ? ? ? ? ? ? 708 MET B SD  1 
+ATOM   4154 C CE  . MET B 1 218 ? 20.147  44.077  74.481  1.00 23.05 ? ? ? ? ? ? 708 MET B CE  1 
+ATOM   4155 N N   . LYS B 1 219 ? 21.321  46.356  79.805  1.00 20.98 ? ? ? ? ? ? 709 LYS B N   1 
+ATOM   4156 C CA  . LYS B 1 219 ? 20.605  47.359  80.601  1.00 23.83 ? ? ? ? ? ? 709 LYS B CA  1 
+ATOM   4157 C C   . LYS B 1 219 ? 21.615  48.358  81.215  1.00 24.74 ? ? ? ? ? ? 709 LYS B C   1 
+ATOM   4158 O O   . LYS B 1 219 ? 21.373  49.579  81.201  1.00 26.11 ? ? ? ? ? ? 709 LYS B O   1 
+ATOM   4159 C CB  . LYS B 1 219 ? 19.787  46.687  81.735  1.00 24.85 ? ? ? ? ? ? 709 LYS B CB  1 
+ATOM   4160 C CG  . LYS B 1 219 ? 18.375  46.248  81.389  1.00 24.93 ? ? ? ? ? ? 709 LYS B CG  1 
+ATOM   4161 C CD  . LYS B 1 219 ? 17.486  47.456  81.329  1.00 25.73 ? ? ? ? ? ? 709 LYS B CD  1 
+ATOM   4162 C CE  . LYS B 1 219 ? 16.055  47.090  81.096  1.00 26.19 ? ? ? ? ? ? 709 LYS B CE  1 
+ATOM   4163 N NZ  . LYS B 1 219 ? 15.243  48.254  80.665  1.00 27.07 ? ? ? ? ? ? 709 LYS B NZ  1 
+ATOM   4164 N N   . GLU B 1 220 ? 22.736  47.846  81.728  1.00 24.72 ? ? ? ? ? ? 710 GLU B N   1 
+ATOM   4165 C CA  . GLU B 1 220 ? 23.773  48.682  82.357  1.00 26.83 ? ? ? ? ? ? 710 GLU B CA  1 
+ATOM   4166 C C   . GLU B 1 220 ? 24.438  49.651  81.368  1.00 26.23 ? ? ? ? ? ? 710 GLU B C   1 
+ATOM   4167 O O   . GLU B 1 220 ? 24.886  50.728  81.773  1.00 26.73 ? ? ? ? ? ? 710 GLU B O   1 
+ATOM   4168 C CB  . GLU B 1 220 ? 24.881  47.828  82.994  1.00 28.59 ? ? ? ? ? ? 710 GLU B CB  1 
+ATOM   4169 C CG  . GLU B 1 220 ? 24.546  47.057  84.258  1.00 31.62 ? ? ? ? ? ? 710 GLU B CG  1 
+ATOM   4170 C CD  . GLU B 1 220 ? 25.799  46.373  84.825  1.00 34.03 ? ? ? ? ? ? 710 GLU B CD  1 
+ATOM   4171 O OE1 . GLU B 1 220 ? 26.276  45.376  84.226  1.00 34.95 ? ? ? ? ? ? 710 GLU B OE1 1 
+ATOM   4172 O OE2 . GLU B 1 220 ? 26.345  46.867  85.843  1.00 36.16 ? ? ? ? ? ? 710 GLU B OE2 1 
+ATOM   4173 N N   . ARG B 1 221 ? 24.577  49.225  80.108  1.00 24.14 ? ? ? ? ? ? 711 ARG B N   1 
+ATOM   4174 C CA  . ARG B 1 221 ? 25.176  50.036  79.043  1.00 22.55 ? ? ? ? ? ? 711 ARG B CA  1 
+ATOM   4175 C C   . ARG B 1 221 ? 24.196  50.922  78.262  1.00 21.80 ? ? ? ? ? ? 711 ARG B C   1 
+ATOM   4176 O O   . ARG B 1 221 ? 24.581  51.482  77.239  1.00 23.59 ? ? ? ? ? ? 711 ARG B O   1 
+ATOM   4177 C CB  . ARG B 1 221 ? 25.918  49.136  78.065  1.00 22.61 ? ? ? ? ? ? 711 ARG B CB  1 
+ATOM   4178 C CG  . ARG B 1 221 ? 26.950  48.323  78.775  1.00 23.96 ? ? ? ? ? ? 711 ARG B CG  1 
+ATOM   4179 C CD  . ARG B 1 221 ? 27.713  47.452  77.851  1.00 24.34 ? ? ? ? ? ? 711 ARG B CD  1 
+ATOM   4180 N NE  . ARG B 1 221 ? 26.933  46.313  77.378  1.00 24.68 ? ? ? ? ? ? 711 ARG B NE  1 
+ATOM   4181 C CZ  . ARG B 1 221 ? 26.481  46.218  76.140  1.00 23.77 ? ? ? ? ? ? 711 ARG B CZ  1 
+ATOM   4182 N NH1 . ARG B 1 221 ? 26.698  47.220  75.300  1.00 22.90 ? ? ? ? ? ? 711 ARG B NH1 1 
+ATOM   4183 N NH2 . ARG B 1 221 ? 25.794  45.150  75.760  1.00 23.53 ? ? ? ? ? ? 711 ARG B NH2 1 
+ATOM   4184 N N   . GLY B 1 222 ? 22.947  51.020  78.723  1.00 19.74 ? ? ? ? ? ? 712 GLY B N   1 
+ATOM   4185 C CA  . GLY B 1 222 ? 21.926  51.830  78.068  1.00 19.21 ? ? ? ? ? ? 712 GLY B CA  1 
+ATOM   4186 C C   . GLY B 1 222 ? 21.272  51.285  76.794  1.00 17.80 ? ? ? ? ? ? 712 GLY B C   1 
+ATOM   4187 O O   . GLY B 1 222 ? 20.629  52.036  76.066  1.00 19.05 ? ? ? ? ? ? 712 GLY B O   1 
+ATOM   4188 N N   . VAL B 1 223 ? 21.456  50.005  76.491  1.00 15.82 ? ? ? ? ? ? 713 VAL B N   1 
+ATOM   4189 C CA  . VAL B 1 223 ? 20.839  49.421  75.305  1.00 15.17 ? ? ? ? ? ? 713 VAL B CA  1 
+ATOM   4190 C C   . VAL B 1 223 ? 19.358  49.233  75.627  1.00 14.59 ? ? ? ? ? ? 713 VAL B C   1 
+ATOM   4191 O O   . VAL B 1 223 ? 19.023  48.677  76.670  1.00 14.63 ? ? ? ? ? ? 713 VAL B O   1 
+ATOM   4192 C CB  . VAL B 1 223 ? 21.474  48.081  74.950  1.00 14.56 ? ? ? ? ? ? 713 VAL B CB  1 
+ATOM   4193 C CG1 . VAL B 1 223 ? 20.737  47.441  73.782  1.00 15.20 ? ? ? ? ? ? 713 VAL B CG1 1 
+ATOM   4194 C CG2 . VAL B 1 223 ? 22.921  48.284  74.627  1.00 14.74 ? ? ? ? ? ? 713 VAL B CG2 1 
+ATOM   4195 N N   . PRO B 1 224 ? 18.452  49.700  74.747  1.00 14.03 ? ? ? ? ? ? 714 PRO B N   1 
+ATOM   4196 C CA  . PRO B 1 224 ? 17.018  49.563  74.999  1.00 14.49 ? ? ? ? ? ? 714 PRO B CA  1 
+ATOM   4197 C C   . PRO B 1 224 ? 16.390  48.170  74.854  1.00 15.74 ? ? ? ? ? ? 714 PRO B C   1 
+ATOM   4198 O O   . PRO B 1 224 ? 15.975  47.787  73.763  1.00 19.20 ? ? ? ? ? ? 714 PRO B O   1 
+ATOM   4199 C CB  . PRO B 1 224 ? 16.399  50.564  74.002  1.00 15.01 ? ? ? ? ? ? 714 PRO B CB  1 
+ATOM   4200 C CG  . PRO B 1 224 ? 17.340  50.505  72.858  1.00 13.42 ? ? ? ? ? ? 714 PRO B CG  1 
+ATOM   4201 C CD  . PRO B 1 224 ? 18.691  50.486  73.515  1.00 13.20 ? ? ? ? ? ? 714 PRO B CD  1 
+ATOM   4202 N N   . ILE B 1 225 ? 16.305  47.430  75.957  1.00 14.09 ? ? ? ? ? ? 715 ILE B N   1 
+ATOM   4203 C CA  . ILE B 1 225 ? 15.667  46.114  75.970  1.00 12.23 ? ? ? ? ? ? 715 ILE B CA  1 
+ATOM   4204 C C   . ILE B 1 225 ? 14.677  46.138  77.145  1.00 11.74 ? ? ? ? ? ? 715 ILE B C   1 
+ATOM   4205 O O   . ILE B 1 225 ? 15.018  46.584  78.249  1.00 13.13 ? ? ? ? ? ? 715 ILE B O   1 
+ATOM   4206 C CB  . ILE B 1 225 ? 16.690  44.954  76.058  1.00 12.79 ? ? ? ? ? ? 715 ILE B CB  1 
+ATOM   4207 C CG1 . ILE B 1 225 ? 15.952  43.623  76.070  1.00 13.06 ? ? ? ? ? ? 715 ILE B CG1 1 
+ATOM   4208 C CG2 . ILE B 1 225 ? 17.611  45.101  77.259  1.00 12.52 ? ? ? ? ? ? 715 ILE B CG2 1 
+ATOM   4209 C CD1 . ILE B 1 225 ? 16.844  42.447  75.886  1.00 14.53 ? ? ? ? ? ? 715 ILE B CD1 1 
+ATOM   4210 N N   . ASP B 1 226 ? 13.439  45.729  76.888  1.00 10.20 ? ? ? ? ? ? 716 ASP B N   1 
+ATOM   4211 C CA  . ASP B 1 226 ? 12.355  45.759  77.892  1.00 9.90  ? ? ? ? ? ? 716 ASP B CA  1 
+ATOM   4212 C C   . ASP B 1 226 ? 11.990  44.430  78.527  1.00 9.81  ? ? ? ? ? ? 716 ASP B C   1 
+ATOM   4213 O O   . ASP B 1 226 ? 11.608  44.385  79.697  1.00 10.42 ? ? ? ? ? ? 716 ASP B O   1 
+ATOM   4214 C CB  . ASP B 1 226 ? 11.058  46.338  77.283  1.00 9.93  ? ? ? ? ? ? 716 ASP B CB  1 
+ATOM   4215 C CG  . ASP B 1 226 ? 11.262  47.717  76.674  1.00 11.02 ? ? ? ? ? ? 716 ASP B CG  1 
+ATOM   4216 O OD1 . ASP B 1 226 ? 11.666  48.645  77.411  1.00 11.62 ? ? ? ? ? ? 716 ASP B OD1 1 
+ATOM   4217 O OD2 . ASP B 1 226 ? 11.041  47.866  75.463  1.00 10.52 ? ? ? ? ? ? 716 ASP B OD2 1 
+ATOM   4218 N N   . GLY B 1 227 ? 12.097  43.352  77.767  1.00 8.75  ? ? ? ? ? ? 717 GLY B N   1 
+ATOM   4219 C CA  . GLY B 1 227 ? 11.681  42.078  78.307  1.00 8.61  ? ? ? ? ? ? 717 GLY B CA  1 
+ATOM   4220 C C   . GLY B 1 227 ? 12.405  40.880  77.766  1.00 9.65  ? ? ? ? ? ? 717 GLY B C   1 
+ATOM   4221 O O   . GLY B 1 227 ? 13.219  40.971  76.817  1.00 8.64  ? ? ? ? ? ? 717 GLY B O   1 
+ATOM   4222 N N   . VAL B 1 228 ? 12.169  39.747  78.424  1.00 7.81  ? ? ? ? ? ? 718 VAL B N   1 
+ATOM   4223 C CA  . VAL B 1 228 ? 12.753  38.502  78.004  1.00 8.03  ? ? ? ? ? ? 718 VAL B CA  1 
+ATOM   4224 C C   . VAL B 1 228 ? 11.608  37.526  77.733  1.00 7.73  ? ? ? ? ? ? 718 VAL B C   1 
+ATOM   4225 O O   . VAL B 1 228 ? 10.618  37.491  78.469  1.00 8.36  ? ? ? ? ? ? 718 VAL B O   1 
+ATOM   4226 C CB  . VAL B 1 228 ? 13.781  37.948  79.060  1.00 9.61  ? ? ? ? ? ? 718 VAL B CB  1 
+ATOM   4227 C CG1 . VAL B 1 228 ? 13.081  37.695  80.435  1.00 10.03 ? ? ? ? ? ? 718 VAL B CG1 1 
+ATOM   4228 C CG2 . VAL B 1 228 ? 14.463  36.673  78.526  1.00 9.16  ? ? ? ? ? ? 718 VAL B CG2 1 
+ATOM   4229 N N   . GLY B 1 229 ? 11.709  36.824  76.615  1.00 7.49  ? ? ? ? ? ? 719 GLY B N   1 
+ATOM   4230 C CA  . GLY B 1 229 ? 10.699  35.862  76.238  1.00 7.79  ? ? ? ? ? ? 719 GLY B CA  1 
+ATOM   4231 C C   . GLY B 1 229 ? 11.161  34.430  76.516  1.00 8.67  ? ? ? ? ? ? 719 GLY B C   1 
+ATOM   4232 O O   . GLY B 1 229 ? 12.174  33.962  75.969  1.00 8.57  ? ? ? ? ? ? 719 GLY B O   1 
+ATOM   4233 N N   . PHE B 1 230 ? 10.403  33.750  77.400  1.00 8.62  ? ? ? ? ? ? 720 PHE B N   1 
+ATOM   4234 C CA  . PHE B 1 230 ? 10.666  32.349  77.769  1.00 8.70  ? ? ? ? ? ? 720 PHE B CA  1 
+ATOM   4235 C C   . PHE B 1 230 ? 9.768   31.521  76.839  1.00 8.33  ? ? ? ? ? ? 720 PHE B C   1 
+ATOM   4236 O O   . PHE B 1 230 ? 8.536   31.540  76.984  1.00 8.72  ? ? ? ? ? ? 720 PHE B O   1 
+ATOM   4237 C CB  . PHE B 1 230 ? 10.212  32.050  79.215  1.00 9.47  ? ? ? ? ? ? 720 PHE B CB  1 
+ATOM   4238 C CG  . PHE B 1 230 ? 11.107  32.617  80.327  1.00 10.07 ? ? ? ? ? ? 720 PHE B CG  1 
+ATOM   4239 C CD1 . PHE B 1 230 ? 12.230  33.403  80.069  1.00 9.90  ? ? ? ? ? ? 720 PHE B CD1 1 
+ATOM   4240 C CD2 . PHE B 1 230 ? 10.796  32.337  81.654  1.00 10.52 ? ? ? ? ? ? 720 PHE B CD2 1 
+ATOM   4241 C CE1 . PHE B 1 230 ? 13.007  33.886  81.091  1.00 10.06 ? ? ? ? ? ? 720 PHE B CE1 1 
+ATOM   4242 C CE2 . PHE B 1 230 ? 11.578  32.821  82.695  1.00 10.20 ? ? ? ? ? ? 720 PHE B CE2 1 
+ATOM   4243 C CZ  . PHE B 1 230 ? 12.683  33.598  82.411  1.00 10.50 ? ? ? ? ? ? 720 PHE B CZ  1 
+ATOM   4244 N N   . GLN B 1 231 ? 10.365  30.797  75.898  1.00 8.47  ? ? ? ? ? ? 721 GLN B N   1 
+ATOM   4245 C CA  . GLN B 1 231 ? 9.579   29.977  74.967  1.00 8.45  ? ? ? ? ? ? 721 GLN B CA  1 
+ATOM   4246 C C   . GLN B 1 231 ? 8.713   28.912  75.672  1.00 9.00  ? ? ? ? ? ? 721 GLN B C   1 
+ATOM   4247 O O   . GLN B 1 231 ? 7.574   28.717  75.302  1.00 10.44 ? ? ? ? ? ? 721 GLN B O   1 
+ATOM   4248 C CB  . GLN B 1 231 ? 10.465  29.337  73.904  1.00 8.10  ? ? ? ? ? ? 721 GLN B CB  1 
+ATOM   4249 C CG  . GLN B 1 231 ? 10.888  30.337  72.778  1.00 9.08  ? ? ? ? ? ? 721 GLN B CG  1 
+ATOM   4250 C CD  . GLN B 1 231 ? 11.731  29.676  71.711  1.00 10.02 ? ? ? ? ? ? 721 GLN B CD  1 
+ATOM   4251 O OE1 . GLN B 1 231 ? 11.681  28.459  71.519  1.00 10.19 ? ? ? ? ? ? 721 GLN B OE1 1 
+ATOM   4252 N NE2 . GLN B 1 231 ? 12.516  30.472  71.001  1.00 10.74 ? ? ? ? ? ? 721 GLN B NE2 1 
+ATOM   4253 N N   . CYS B 1 232 ? 9.242   28.268  76.708  1.00 9.73  ? ? ? ? ? ? 722 CYS B N   1 
+ATOM   4254 C CA  . CYS B 1 232 ? 8.506   27.254  77.465  1.00 10.36 ? ? ? ? ? ? 722 CYS B CA  1 
+ATOM   4255 C C   . CYS B 1 232 ? 8.119   25.989  76.688  1.00 9.67  ? ? ? ? ? ? 722 CYS B C   1 
+ATOM   4256 O O   . CYS B 1 232 ? 6.976   25.508  76.777  1.00 10.50 ? ? ? ? ? ? 722 CYS B O   1 
+ATOM   4257 C CB  . CYS B 1 232 ? 7.289   27.856  78.187  1.00 10.38 ? ? ? ? ? ? 722 CYS B CB  1 
+ATOM   4258 S SG  . CYS B 1 232 ? 7.655   29.113  79.456  1.00 11.84 ? ? ? ? ? ? 722 CYS B SG  1 
+ATOM   4259 N N   . HIS B 1 233 ? 9.059   25.465  75.900  1.00 10.10 ? ? ? ? ? ? 723 HIS B N   1 
+ATOM   4260 C CA  . HIS B 1 233 ? 8.835   24.201  75.172  1.00 11.99 ? ? ? ? ? ? 723 HIS B CA  1 
+ATOM   4261 C C   . HIS B 1 233 ? 9.298   23.099  76.157  1.00 12.75 ? ? ? ? ? ? 723 HIS B C   1 
+ATOM   4262 O O   . HIS B 1 233 ? 10.476  22.692  76.187  1.00 12.33 ? ? ? ? ? ? 723 HIS B O   1 
+ATOM   4263 C CB  . HIS B 1 233 ? 9.609   24.169  73.847  1.00 11.83 ? ? ? ? ? ? 723 HIS B CB  1 
+ATOM   4264 C CG  . HIS B 1 233 ? 9.084   25.147  72.838  1.00 11.48 ? ? ? ? ? ? 723 HIS B CG  1 
+ATOM   4265 N ND1 . HIS B 1 233 ? 7.805   25.076  72.312  1.00 11.45 ? ? ? ? ? ? 723 HIS B ND1 1 
+ATOM   4266 C CD2 . HIS B 1 233 ? 9.664   26.229  72.266  1.00 10.97 ? ? ? ? ? ? 723 HIS B CD2 1 
+ATOM   4267 C CE1 . HIS B 1 233 ? 7.622   26.070  71.462  1.00 10.99 ? ? ? ? ? ? 723 HIS B CE1 1 
+ATOM   4268 N NE2 . HIS B 1 233 ? 8.736   26.781  71.416  1.00 10.15 ? ? ? ? ? ? 723 HIS B NE2 1 
+ATOM   4269 N N   . PHE B 1 234 ? 8.351   22.728  77.027  1.00 12.96 ? ? ? ? ? ? 724 PHE B N   1 
+ATOM   4270 C CA  . PHE B 1 234 ? 8.580   21.774  78.120  1.00 13.75 ? ? ? ? ? ? 724 PHE B CA  1 
+ATOM   4271 C C   . PHE B 1 234 ? 8.136   20.327  77.857  1.00 15.38 ? ? ? ? ? ? 724 PHE B C   1 
+ATOM   4272 O O   . PHE B 1 234 ? 7.333   20.054  76.950  1.00 15.22 ? ? ? ? ? ? 724 PHE B O   1 
+ATOM   4273 C CB  . PHE B 1 234 ? 7.874   22.282  79.390  1.00 12.93 ? ? ? ? ? ? 724 PHE B CB  1 
+ATOM   4274 C CG  . PHE B 1 234 ? 8.346   23.645  79.875  1.00 12.99 ? ? ? ? ? ? 724 PHE B CG  1 
+ATOM   4275 C CD1 . PHE B 1 234 ? 9.706   23.920  80.042  1.00 13.45 ? ? ? ? ? ? 724 PHE B CD1 1 
+ATOM   4276 C CD2 . PHE B 1 234 ? 7.421   24.621  80.254  1.00 12.67 ? ? ? ? ? ? 724 PHE B CD2 1 
+ATOM   4277 C CE1 . PHE B 1 234 ? 10.121  25.139  80.591  1.00 12.89 ? ? ? ? ? ? 724 PHE B CE1 1 
+ATOM   4278 C CE2 . PHE B 1 234 ? 7.839   25.829  80.799  1.00 12.22 ? ? ? ? ? ? 724 PHE B CE2 1 
+ATOM   4279 C CZ  . PHE B 1 234 ? 9.193   26.077  80.968  1.00 12.61 ? ? ? ? ? ? 724 PHE B CZ  1 
+ATOM   4280 N N   . ILE B 1 235 ? 8.699   19.405  78.657  1.00 17.09 ? ? ? ? ? ? 725 ILE B N   1 
+ATOM   4281 C CA  . ILE B 1 235 ? 8.365   17.978  78.601  1.00 17.43 ? ? ? ? ? ? 725 ILE B CA  1 
+ATOM   4282 C C   . ILE B 1 235 ? 7.435   17.702  79.796  1.00 16.95 ? ? ? ? ? ? 725 ILE B C   1 
+ATOM   4283 O O   . ILE B 1 235 ? 7.683   18.179  80.913  1.00 17.04 ? ? ? ? ? ? 725 ILE B O   1 
+ATOM   4284 C CB  . ILE B 1 235 ? 9.626   17.069  78.716  1.00 18.98 ? ? ? ? ? ? 725 ILE B CB  1 
+ATOM   4285 C CG1 . ILE B 1 235 ? 10.620  17.371  77.581  1.00 20.07 ? ? ? ? ? ? 725 ILE B CG1 1 
+ATOM   4286 C CG2 . ILE B 1 235 ? 9.195   15.581  78.659  1.00 19.55 ? ? ? ? ? ? 725 ILE B CG2 1 
+ATOM   4287 C CD1 . ILE B 1 235 ? 11.921  16.514  77.605  1.00 21.31 ? ? ? ? ? ? 725 ILE B CD1 1 
+ATOM   4288 N N   . ASN B 1 236 ? 6.380   16.932  79.550  1.00 15.42 ? ? ? ? ? ? 726 ASN B N   1 
+ATOM   4289 C CA  . ASN B 1 236 ? 5.386   16.599  80.565  1.00 16.02 ? ? ? ? ? ? 726 ASN B CA  1 
+ATOM   4290 C C   . ASN B 1 236 ? 6.039   16.008  81.821  1.00 16.11 ? ? ? ? ? ? 726 ASN B C   1 
+ATOM   4291 O O   . ASN B 1 236 ? 7.022   15.290  81.729  1.00 16.34 ? ? ? ? ? ? 726 ASN B O   1 
+ATOM   4292 C CB  . ASN B 1 236 ? 4.418   15.581  79.962  1.00 17.03 ? ? ? ? ? ? 726 ASN B CB  1 
+ATOM   4293 C CG  . ASN B 1 236 ? 3.137   15.472  80.724  1.00 17.60 ? ? ? ? ? ? 726 ASN B CG  1 
+ATOM   4294 O OD1 . ASN B 1 236 ? 2.565   16.468  81.158  1.00 18.65 ? ? ? ? ? ? 726 ASN B OD1 1 
+ATOM   4295 N ND2 . ASN B 1 236 ? 2.644   14.255  80.852  1.00 18.82 ? ? ? ? ? ? 726 ASN B ND2 1 
+ATOM   4296 N N   . GLY B 1 237 ? 5.498   16.321  82.989  1.00 16.88 ? ? ? ? ? ? 727 GLY B N   1 
+ATOM   4297 C CA  . GLY B 1 237 ? 6.055   15.771  84.219  1.00 18.66 ? ? ? ? ? ? 727 GLY B CA  1 
+ATOM   4298 C C   . GLY B 1 237 ? 7.124   16.626  84.875  1.00 19.96 ? ? ? ? ? ? 727 GLY B C   1 
+ATOM   4299 O O   . GLY B 1 237 ? 8.087   16.116  85.462  1.00 19.43 ? ? ? ? ? ? 727 GLY B O   1 
+ATOM   4300 N N   . MET B 1 238 ? 6.951   17.939  84.769  1.00 20.59 ? ? ? ? ? ? 728 MET B N   1 
+ATOM   4301 C CA  . MET B 1 238 ? 7.889   18.902  85.339  1.00 21.97 ? ? ? ? ? ? 728 MET B CA  1 
+ATOM   4302 C C   . MET B 1 238 ? 7.908   18.768  86.859  1.00 21.72 ? ? ? ? ? ? 728 MET B C   1 
+ATOM   4303 O O   . MET B 1 238 ? 6.850   18.773  87.503  1.00 20.51 ? ? ? ? ? ? 728 MET B O   1 
+ATOM   4304 C CB  . MET B 1 238 ? 7.475   20.336  84.966  1.00 23.48 ? ? ? ? ? ? 728 MET B CB  1 
+ATOM   4305 C CG  . MET B 1 238 ? 7.326   20.587  83.466  1.00 25.37 ? ? ? ? ? ? 728 MET B CG  1 
+ATOM   4306 S SD  . MET B 1 238 ? 7.157   22.331  83.114  1.00 27.80 ? ? ? ? ? ? 728 MET B SD  1 
+ATOM   4307 C CE  . MET B 1 238 ? 5.541   22.633  83.391  1.00 26.98 ? ? ? ? ? ? 728 MET B CE  1 
+ATOM   4308 N N   . SER B 1 239 ? 9.112   18.706  87.417  1.00 22.11 ? ? ? ? ? ? 729 SER B N   1 
+ATOM   4309 C CA  . SER B 1 239 ? 9.307   18.570  88.858  1.00 22.52 ? ? ? ? ? ? 729 SER B CA  1 
+ATOM   4310 C C   . SER B 1 239 ? 9.060   19.887  89.612  1.00 23.65 ? ? ? ? ? ? 729 SER B C   1 
+ATOM   4311 O O   . SER B 1 239 ? 9.118   20.970  89.019  1.00 23.37 ? ? ? ? ? ? 729 SER B O   1 
+ATOM   4312 C CB  . SER B 1 239 ? 10.728  18.083  89.123  1.00 21.40 ? ? ? ? ? ? 729 SER B CB  1 
+ATOM   4313 O OG  . SER B 1 239 ? 11.654  19.140  88.973  1.00 22.89 ? ? ? ? ? ? 729 SER B OG  1 
+ATOM   4314 N N   . PRO B 1 240 ? 8.773   19.816  90.937  1.00 24.11 ? ? ? ? ? ? 730 PRO B N   1 
+ATOM   4315 C CA  . PRO B 1 240 ? 8.522   21.006  91.771  1.00 23.92 ? ? ? ? ? ? 730 PRO B CA  1 
+ATOM   4316 C C   . PRO B 1 240 ? 9.768   21.900  91.858  1.00 23.61 ? ? ? ? ? ? 730 PRO B C   1 
+ATOM   4317 O O   . PRO B 1 240 ? 9.670   23.116  92.015  1.00 23.74 ? ? ? ? ? ? 730 PRO B O   1 
+ATOM   4318 C CB  . PRO B 1 240 ? 8.206   20.399  93.147  1.00 24.83 ? ? ? ? ? ? 730 PRO B CB  1 
+ATOM   4319 C CG  . PRO B 1 240 ? 7.609   19.072  92.797  1.00 25.23 ? ? ? ? ? ? 730 PRO B CG  1 
+ATOM   4320 C CD  . PRO B 1 240 ? 8.511   18.579  91.708  1.00 24.67 ? ? ? ? ? ? 730 PRO B CD  1 
+ATOM   4321 N N   . GLU B 1 241 ? 10.931  21.266  91.802  1.00 23.67 ? ? ? ? ? ? 731 GLU B N   1 
+ATOM   4322 C CA  . GLU B 1 241 ? 12.207  21.960  91.860  1.00 24.84 ? ? ? ? ? ? 731 GLU B CA  1 
+ATOM   4323 C C   . GLU B 1 241 ? 12.417  22.715  90.556  1.00 22.71 ? ? ? ? ? ? 731 GLU B C   1 
+ATOM   4324 O O   . GLU B 1 241 ? 12.968  23.807  90.558  1.00 21.75 ? ? ? ? ? ? 731 GLU B O   1 
+ATOM   4325 C CB  . GLU B 1 241 ? 13.347  20.963  92.075  1.00 27.68 ? ? ? ? ? ? 731 GLU B CB  1 
+ATOM   4326 C CG  . GLU B 1 241 ? 13.350  20.313  93.474  1.00 32.72 ? ? ? ? ? ? 731 GLU B CG  1 
+ATOM   4327 C CD  . GLU B 1 241 ? 12.149  19.358  93.752  1.00 35.58 ? ? ? ? ? ? 731 GLU B CD  1 
+ATOM   4328 O OE1 . GLU B 1 241 ? 11.834  18.478  92.889  1.00 35.97 ? ? ? ? ? ? 731 GLU B OE1 1 
+ATOM   4329 O OE2 . GLU B 1 241 ? 11.534  19.491  94.858  1.00 38.04 ? ? ? ? ? ? 731 GLU B OE2 1 
+ATOM   4330 N N   . TYR B 1 242 ? 11.989  22.126  89.442  1.00 20.86 ? ? ? ? ? ? 732 TYR B N   1 
+ATOM   4331 C CA  . TYR B 1 242 ? 12.136  22.793  88.149  1.00 20.30 ? ? ? ? ? ? 732 TYR B CA  1 
+ATOM   4332 C C   . TYR B 1 242 ? 11.243  24.030  88.155  1.00 17.89 ? ? ? ? ? ? 732 TYR B C   1 
+ATOM   4333 O O   . TYR B 1 242 ? 11.718  25.125  87.896  1.00 16.35 ? ? ? ? ? ? 732 TYR B O   1 
+ATOM   4334 C CB  . TYR B 1 242 ? 11.768  21.861  86.995  1.00 22.05 ? ? ? ? ? ? 732 TYR B CB  1 
+ATOM   4335 C CG  . TYR B 1 242 ? 12.081  22.424  85.621  1.00 24.55 ? ? ? ? ? ? 732 TYR B CG  1 
+ATOM   4336 C CD1 . TYR B 1 242 ? 13.382  22.790  85.264  1.00 25.89 ? ? ? ? ? ? 732 TYR B CD1 1 
+ATOM   4337 C CD2 . TYR B 1 242 ? 11.086  22.531  84.651  1.00 26.21 ? ? ? ? ? ? 732 TYR B CD2 1 
+ATOM   4338 C CE1 . TYR B 1 242 ? 13.682  23.241  83.956  1.00 26.45 ? ? ? ? ? ? 732 TYR B CE1 1 
+ATOM   4339 C CE2 . TYR B 1 242 ? 11.377  22.974  83.350  1.00 26.88 ? ? ? ? ? ? 732 TYR B CE2 1 
+ATOM   4340 C CZ  . TYR B 1 242 ? 12.674  23.318  83.010  1.00 26.78 ? ? ? ? ? ? 732 TYR B CZ  1 
+ATOM   4341 O OH  . TYR B 1 242 ? 12.953  23.661  81.702  1.00 28.02 ? ? ? ? ? ? 732 TYR B OH  1 
+ATOM   4342 N N   . LEU B 1 243 ? 9.973   23.861  88.519  1.00 16.12 ? ? ? ? ? ? 733 LEU B N   1 
+ATOM   4343 C CA  . LEU B 1 243 ? 9.027   24.973  88.585  1.00 16.44 ? ? ? ? ? ? 733 LEU B CA  1 
+ATOM   4344 C C   . LEU B 1 243 ? 9.496   26.062  89.548  1.00 16.28 ? ? ? ? ? ? 733 LEU B C   1 
+ATOM   4345 O O   . LEU B 1 243 ? 9.299   27.260  89.303  1.00 16.59 ? ? ? ? ? ? 733 LEU B O   1 
+ATOM   4346 C CB  . LEU B 1 243 ? 7.626   24.488  88.974  1.00 17.11 ? ? ? ? ? ? 733 LEU B CB  1 
+ATOM   4347 C CG  . LEU B 1 243 ? 6.921   23.629  87.922  1.00 19.01 ? ? ? ? ? ? 733 LEU B CG  1 
+ATOM   4348 C CD1 . LEU B 1 243 ? 5.753   22.864  88.575  1.00 19.91 ? ? ? ? ? ? 733 LEU B CD1 1 
+ATOM   4349 C CD2 . LEU B 1 243 ? 6.416   24.510  86.779  1.00 19.38 ? ? ? ? ? ? 733 LEU B CD2 1 
+ATOM   4350 N N   . ALA B 1 244 ? 10.120  25.654  90.649  1.00 16.27 ? ? ? ? ? ? 734 ALA B N   1 
+ATOM   4351 C CA  . ALA B 1 244 ? 10.634  26.618  91.619  1.00 15.29 ? ? ? ? ? ? 734 ALA B CA  1 
+ATOM   4352 C C   . ALA B 1 244 ? 11.773  27.467  91.024  1.00 13.95 ? ? ? ? ? ? 734 ALA B C   1 
+ATOM   4353 O O   . ALA B 1 244 ? 11.872  28.661  91.313  1.00 14.58 ? ? ? ? ? ? 734 ALA B O   1 
+ATOM   4354 C CB  . ALA B 1 244 ? 11.142  25.891  92.851  1.00 15.36 ? ? ? ? ? ? 734 ALA B CB  1 
+ATOM   4355 N N   . SER B 1 245 ? 12.660  26.833  90.259  1.00 14.34 ? ? ? ? ? ? 735 SER B N   1 
+ATOM   4356 C CA  . SER B 1 245 ? 13.778  27.537  89.636  1.00 13.64 ? ? ? ? ? ? 735 SER B CA  1 
+ATOM   4357 C C   . SER B 1 245 ? 13.249  28.538  88.600  1.00 13.09 ? ? ? ? ? ? 735 SER B C   1 
+ATOM   4358 O O   . SER B 1 245 ? 13.823  29.605  88.423  1.00 13.53 ? ? ? ? ? ? 735 SER B O   1 
+ATOM   4359 C CB  . SER B 1 245 ? 14.760  26.576  88.999  1.00 14.48 ? ? ? ? ? ? 735 SER B CB  1 
+ATOM   4360 O OG  . SER B 1 245 ? 14.227  26.021  87.819  1.00 18.32 ? ? ? ? ? ? 735 SER B OG  1 
+ATOM   4361 N N   . ILE B 1 246 ? 12.149  28.206  87.938  1.00 11.82 ? ? ? ? ? ? 736 ILE B N   1 
+ATOM   4362 C CA  . ILE B 1 246 ? 11.559  29.146  86.983  1.00 12.18 ? ? ? ? ? ? 736 ILE B CA  1 
+ATOM   4363 C C   . ILE B 1 246 ? 11.088  30.397  87.728  1.00 12.46 ? ? ? ? ? ? 736 ILE B C   1 
+ATOM   4364 O O   . ILE B 1 246 ? 11.385  31.530  87.323  1.00 12.79 ? ? ? ? ? ? 736 ILE B O   1 
+ATOM   4365 C CB  . ILE B 1 246 ? 10.368  28.530  86.215  1.00 11.88 ? ? ? ? ? ? 736 ILE B CB  1 
+ATOM   4366 C CG1 . ILE B 1 246 ? 10.858  27.366  85.341  1.00 12.27 ? ? ? ? ? ? 736 ILE B CG1 1 
+ATOM   4367 C CG2 . ILE B 1 246 ? 9.678   29.612  85.373  1.00 12.60 ? ? ? ? ? ? 736 ILE B CG2 1 
+ATOM   4368 C CD1 . ILE B 1 246 ? 9.759   26.639  84.562  1.00 11.49 ? ? ? ? ? ? 736 ILE B CD1 1 
+ATOM   4369 N N   . ASP B 1 247 ? 10.357  30.208  88.831  1.00 12.55 ? ? ? ? ? ? 737 ASP B N   1 
+ATOM   4370 C CA  . ASP B 1 247 ? 9.858   31.334  89.601  1.00 12.73 ? ? ? ? ? ? 737 ASP B CA  1 
+ATOM   4371 C C   . ASP B 1 247 ? 11.013  32.197  90.123  1.00 12.95 ? ? ? ? ? ? 737 ASP B C   1 
+ATOM   4372 O O   . ASP B 1 247 ? 10.939  33.420  90.105  1.00 13.25 ? ? ? ? ? ? 737 ASP B O   1 
+ATOM   4373 C CB  . ASP B 1 247 ? 8.990   30.831  90.758  1.00 13.88 ? ? ? ? ? ? 737 ASP B CB  1 
+ATOM   4374 C CG  . ASP B 1 247 ? 8.468   31.945  91.599  1.00 14.78 ? ? ? ? ? ? 737 ASP B CG  1 
+ATOM   4375 O OD1 . ASP B 1 247 ? 7.429   32.537  91.254  1.00 15.90 ? ? ? ? ? ? 737 ASP B OD1 1 
+ATOM   4376 O OD2 . ASP B 1 247 ? 9.113   32.257  92.615  1.00 17.61 ? ? ? ? ? ? 737 ASP B OD2 1 
+ATOM   4377 N N   . GLN B 1 248 ? 12.088  31.567  90.564  1.00 13.12 ? ? ? ? ? ? 738 GLN B N   1 
+ATOM   4378 C CA  . GLN B 1 248 ? 13.221  32.326  91.066  1.00 16.23 ? ? ? ? ? ? 738 GLN B CA  1 
+ATOM   4379 C C   . GLN B 1 248 ? 13.880  33.104  89.930  1.00 13.76 ? ? ? ? ? ? 738 GLN B C   1 
+ATOM   4380 O O   . GLN B 1 248 ? 14.309  34.235  90.123  1.00 13.44 ? ? ? ? ? ? 738 GLN B O   1 
+ATOM   4381 C CB  . GLN B 1 248 ? 14.233  31.391  91.730  1.00 21.24 ? ? ? ? ? ? 738 GLN B CB  1 
+ATOM   4382 C CG  . GLN B 1 248 ? 14.024  31.223  93.239  1.00 29.40 ? ? ? ? ? ? 738 GLN B CG  1 
+ATOM   4383 C CD  . GLN B 1 248 ? 12.521  31.196  93.677  1.00 34.29 ? ? ? ? ? ? 738 GLN B CD  1 
+ATOM   4384 O OE1 . GLN B 1 248 ? 11.929  32.257  94.025  1.00 37.48 ? ? ? ? ? ? 738 GLN B OE1 1 
+ATOM   4385 N NE2 . GLN B 1 248 ? 11.920  29.983  93.711  1.00 35.58 ? ? ? ? ? ? 738 GLN B NE2 1 
+ATOM   4386 N N   . ASN B 1 249 ? 13.936  32.495  88.749  1.00 12.61 ? ? ? ? ? ? 739 ASN B N   1 
+ATOM   4387 C CA  . ASN B 1 249 ? 14.527  33.155  87.578  1.00 12.62 ? ? ? ? ? ? 739 ASN B CA  1 
+ATOM   4388 C C   . ASN B 1 249 ? 13.695  34.407  87.228  1.00 12.16 ? ? ? ? ? ? 739 ASN B C   1 
+ATOM   4389 O O   . ASN B 1 249 ? 14.252  35.490  87.001  1.00 12.27 ? ? ? ? ? ? 739 ASN B O   1 
+ATOM   4390 C CB  . ASN B 1 249 ? 14.602  32.181  86.392  1.00 12.27 ? ? ? ? ? ? 739 ASN B CB  1 
+ATOM   4391 C CG  . ASN B 1 249 ? 15.510  32.690  85.271  1.00 12.20 ? ? ? ? ? ? 739 ASN B CG  1 
+ATOM   4392 O OD1 . ASN B 1 249 ? 16.447  33.444  85.515  1.00 13.21 ? ? ? ? ? ? 739 ASN B OD1 1 
+ATOM   4393 N ND2 . ASN B 1 249 ? 15.237  32.270  84.048  1.00 11.53 ? ? ? ? ? ? 739 ASN B ND2 1 
+ATOM   4394 N N   . ILE B 1 250 ? 12.366  34.295  87.251  1.00 10.28 ? ? ? ? ? ? 740 ILE B N   1 
+ATOM   4395 C CA  . ILE B 1 250 ? 11.516  35.455  86.966  1.00 11.01 ? ? ? ? ? ? 740 ILE B CA  1 
+ATOM   4396 C C   . ILE B 1 250 ? 11.789  36.593  87.959  1.00 11.58 ? ? ? ? ? ? 740 ILE B C   1 
+ATOM   4397 O O   . ILE B 1 250 ? 11.835  37.764  87.565  1.00 11.38 ? ? ? ? ? ? 740 ILE B O   1 
+ATOM   4398 C CB  . ILE B 1 250 ? 10.002  35.074  86.977  1.00 10.74 ? ? ? ? ? ? 740 ILE B CB  1 
+ATOM   4399 C CG1 . ILE B 1 250 ? 9.718   34.091  85.837  1.00 11.67 ? ? ? ? ? ? 740 ILE B CG1 1 
+ATOM   4400 C CG2 . ILE B 1 250 ? 9.086   36.301  86.885  1.00 10.84 ? ? ? ? ? ? 740 ILE B CG2 1 
+ATOM   4401 C CD1 . ILE B 1 250 ? 8.283   33.560  85.831  1.00 12.09 ? ? ? ? ? ? 740 ILE B CD1 1 
+ATOM   4402 N N   . LYS B 1 251 ? 12.022  36.242  89.234  1.00 11.07 ? ? ? ? ? ? 741 LYS B N   1 
+ATOM   4403 C CA  . LYS B 1 251 ? 12.303  37.245  90.266  1.00 12.06 ? ? ? ? ? ? 741 LYS B CA  1 
+ATOM   4404 C C   . LYS B 1 251 ? 13.625  37.982  90.073  1.00 10.68 ? ? ? ? ? ? 741 LYS B C   1 
+ATOM   4405 O O   . LYS B 1 251 ? 13.700  39.169  90.314  1.00 11.90 ? ? ? ? ? ? 741 LYS B O   1 
+ATOM   4406 C CB  . LYS B 1 251 ? 12.199  36.615  91.658  1.00 12.80 ? ? ? ? ? ? 741 LYS B CB  1 
+ATOM   4407 C CG  . LYS B 1 251 ? 10.772  36.384  92.038  1.00 13.98 ? ? ? ? ? ? 741 LYS B CG  1 
+ATOM   4408 C CD  . LYS B 1 251 ? 10.651  35.683  93.363  1.00 15.71 ? ? ? ? ? ? 741 LYS B CD  1 
+ATOM   4409 C CE  . LYS B 1 251 ? 9.178   35.737  93.849  1.00 16.67 ? ? ? ? ? ? 741 LYS B CE  1 
+ATOM   4410 N NZ  . LYS B 1 251 ? 8.178   34.989  93.003  1.00 16.44 ? ? ? ? ? ? 741 LYS B NZ  1 
+ATOM   4411 N N   . ARG B 1 252 ? 14.659  37.301  89.597  1.00 11.44 ? ? ? ? ? ? 742 ARG B N   1 
+ATOM   4412 C CA  . ARG B 1 252 ? 15.914  38.011  89.370  1.00 12.02 ? ? ? ? ? ? 742 ARG B CA  1 
+ATOM   4413 C C   . ARG B 1 252 ? 15.772  38.991  88.193  1.00 11.76 ? ? ? ? ? ? 742 ARG B C   1 
+ATOM   4414 O O   . ARG B 1 252 ? 16.357  40.051  88.223  1.00 11.82 ? ? ? ? ? ? 742 ARG B O   1 
+ATOM   4415 C CB  . ARG B 1 252 ? 17.135  37.095  89.287  1.00 12.71 ? ? ? ? ? ? 742 ARG B CB  1 
+ATOM   4416 C CG  . ARG B 1 252 ? 17.246  36.196  88.085  1.00 13.57 ? ? ? ? ? ? 742 ARG B CG  1 
+ATOM   4417 C CD  . ARG B 1 252 ? 18.590  35.459  88.077  1.00 13.12 ? ? ? ? ? ? 742 ARG B CD  1 
+ATOM   4418 N NE  . ARG B 1 252 ? 18.631  34.540  86.952  1.00 12.95 ? ? ? ? ? ? 742 ARG B NE  1 
+ATOM   4419 C CZ  . ARG B 1 252 ? 19.688  33.843  86.566  1.00 13.35 ? ? ? ? ? ? 742 ARG B CZ  1 
+ATOM   4420 N NH1 . ARG B 1 252 ? 20.827  33.923  87.232  1.00 15.24 ? ? ? ? ? ? 742 ARG B NH1 1 
+ATOM   4421 N NH2 . ARG B 1 252 ? 19.607  33.040  85.517  1.00 13.30 ? ? ? ? ? ? 742 ARG B NH2 1 
+ATOM   4422 N N   . TYR B 1 253 ? 14.951  38.667  87.190  1.00 11.44 ? ? ? ? ? ? 743 TYR B N   1 
+ATOM   4423 C CA  . TYR B 1 253 ? 14.682  39.611  86.091  1.00 11.20 ? ? ? ? ? ? 743 TYR B CA  1 
+ATOM   4424 C C   . TYR B 1 253 ? 13.912  40.812  86.631  1.00 11.07 ? ? ? ? ? ? 743 TYR B C   1 
+ATOM   4425 O O   . TYR B 1 253 ? 14.167  41.942  86.235  1.00 10.84 ? ? ? ? ? ? 743 TYR B O   1 
+ATOM   4426 C CB  . TYR B 1 253 ? 13.891  38.953  84.951  1.00 9.15  ? ? ? ? ? ? 743 TYR B CB  1 
+ATOM   4427 C CG  . TYR B 1 253 ? 14.791  38.242  83.960  1.00 9.10  ? ? ? ? ? ? 743 TYR B CG  1 
+ATOM   4428 C CD1 . TYR B 1 253 ? 15.606  38.969  83.074  1.00 9.20  ? ? ? ? ? ? 743 TYR B CD1 1 
+ATOM   4429 C CD2 . TYR B 1 253 ? 14.866  36.843  83.923  1.00 9.34  ? ? ? ? ? ? 743 TYR B CD2 1 
+ATOM   4430 C CE1 . TYR B 1 253 ? 16.468  38.320  82.197  1.00 9.22  ? ? ? ? ? ? 743 TYR B CE1 1 
+ATOM   4431 C CE2 . TYR B 1 253 ? 15.719  36.180  83.041  1.00 8.94  ? ? ? ? ? ? 743 TYR B CE2 1 
+ATOM   4432 C CZ  . TYR B 1 253 ? 16.519  36.926  82.181  1.00 9.19  ? ? ? ? ? ? 743 TYR B CZ  1 
+ATOM   4433 O OH  . TYR B 1 253 ? 17.346  36.270  81.311  1.00 10.26 ? ? ? ? ? ? 743 TYR B OH  1 
+ATOM   4434 N N   . ALA B 1 254 ? 12.988  40.583  87.573  1.00 11.82 ? ? ? ? ? ? 744 ALA B N   1 
+ATOM   4435 C CA  . ALA B 1 254 ? 12.223  41.700  88.150  1.00 12.25 ? ? ? ? ? ? 744 ALA B CA  1 
+ATOM   4436 C C   . ALA B 1 254 ? 13.164  42.662  88.844  1.00 12.70 ? ? ? ? ? ? 744 ALA B C   1 
+ATOM   4437 O O   . ALA B 1 254 ? 12.972  43.870  88.760  1.00 13.31 ? ? ? ? ? ? 744 ALA B O   1 
+ATOM   4438 C CB  . ALA B 1 254 ? 11.134  41.214  89.127  1.00 11.58 ? ? ? ? ? ? 744 ALA B CB  1 
+ATOM   4439 N N   . GLU B 1 255 ? 14.222  42.136  89.462  1.00 13.93 ? ? ? ? ? ? 745 GLU B N   1 
+ATOM   4440 C CA  . GLU B 1 255 ? 15.184  42.992  90.172  1.00 17.54 ? ? ? ? ? ? 745 GLU B CA  1 
+ATOM   4441 C C   . GLU B 1 255 ? 15.967  43.942  89.249  1.00 17.48 ? ? ? ? ? ? 745 GLU B C   1 
+ATOM   4442 O O   . GLU B 1 255 ? 16.493  44.971  89.715  1.00 17.16 ? ? ? ? ? ? 745 GLU B O   1 
+ATOM   4443 C CB  . GLU B 1 255 ? 16.163  42.165  91.004  1.00 20.52 ? ? ? ? ? ? 745 GLU B CB  1 
+ATOM   4444 C CG  . GLU B 1 255 ? 15.561  41.537  92.240  1.00 26.59 ? ? ? ? ? ? 745 GLU B CG  1 
+ATOM   4445 C CD  . GLU B 1 255 ? 16.448  40.429  92.793  1.00 30.86 ? ? ? ? ? ? 745 GLU B CD  1 
+ATOM   4446 O OE1 . GLU B 1 255 ? 17.698  40.640  92.823  1.00 32.41 ? ? ? ? ? ? 745 GLU B OE1 1 
+ATOM   4447 O OE2 . GLU B 1 255 ? 15.898  39.337  93.155  1.00 34.10 ? ? ? ? ? ? 745 GLU B OE2 1 
+ATOM   4448 N N   . ILE B 1 256 ? 16.099  43.580  87.969  1.00 15.40 ? ? ? ? ? ? 746 ILE B N   1 
+ATOM   4449 C CA  . ILE B 1 256 ? 16.788  44.441  87.024  1.00 15.27 ? ? ? ? ? ? 746 ILE B CA  1 
+ATOM   4450 C C   . ILE B 1 256 ? 15.819  45.225  86.111  1.00 14.60 ? ? ? ? ? ? 746 ILE B C   1 
+ATOM   4451 O O   . ILE B 1 256 ? 16.255  45.848  85.151  1.00 15.33 ? ? ? ? ? ? 746 ILE B O   1 
+ATOM   4452 C CB  . ILE B 1 256 ? 17.884  43.703  86.198  1.00 14.95 ? ? ? ? ? ? 746 ILE B CB  1 
+ATOM   4453 C CG1 . ILE B 1 256 ? 17.284  42.583  85.358  1.00 14.09 ? ? ? ? ? ? 746 ILE B CG1 1 
+ATOM   4454 C CG2 . ILE B 1 256 ? 18.975  43.198  87.130  1.00 15.28 ? ? ? ? ? ? 746 ILE B CG2 1 
+ATOM   4455 C CD1 . ILE B 1 256 ? 18.214  42.087  84.270  1.00 14.48 ? ? ? ? ? ? 746 ILE B CD1 1 
+ATOM   4456 N N   . GLY B 1 257 ? 14.530  45.232  86.477  1.00 13.85 ? ? ? ? ? ? 747 GLY B N   1 
+ATOM   4457 C CA  . GLY B 1 257 ? 13.495  45.971  85.770  1.00 14.02 ? ? ? ? ? ? 747 GLY B CA  1 
+ATOM   4458 C C   . GLY B 1 257 ? 13.072  45.408  84.428  1.00 14.60 ? ? ? ? ? ? 747 GLY B C   1 
+ATOM   4459 O O   . GLY B 1 257 ? 12.550  46.144  83.601  1.00 16.93 ? ? ? ? ? ? 747 GLY B O   1 
+ATOM   4460 N N   . VAL B 1 258 ? 13.173  44.097  84.267  1.00 13.32 ? ? ? ? ? ? 748 VAL B N   1 
+ATOM   4461 C CA  . VAL B 1 258 ? 12.840  43.434  83.008  1.00 12.70 ? ? ? ? ? ? 748 VAL B CA  1 
+ATOM   4462 C C   . VAL B 1 258 ? 11.552  42.606  83.126  1.00 13.76 ? ? ? ? ? ? 748 VAL B C   1 
+ATOM   4463 O O   . VAL B 1 258 ? 11.341  41.888  84.111  1.00 13.51 ? ? ? ? ? ? 748 VAL B O   1 
+ATOM   4464 C CB  . VAL B 1 258 ? 14.035  42.538  82.567  1.00 12.42 ? ? ? ? ? ? 748 VAL B CB  1 
+ATOM   4465 C CG1 . VAL B 1 258 ? 13.669  41.653  81.392  1.00 13.27 ? ? ? ? ? ? 748 VAL B CG1 1 
+ATOM   4466 C CG2 . VAL B 1 258 ? 15.233  43.385  82.214  1.00 12.18 ? ? ? ? ? ? 748 VAL B CG2 1 
+ATOM   4467 N N   . ILE B 1 259 ? 10.677  42.754  82.137  1.00 12.55 ? ? ? ? ? ? 749 ILE B N   1 
+ATOM   4468 C CA  . ILE B 1 259 ? 9.418   42.030  82.044  1.00 12.80 ? ? ? ? ? ? 749 ILE B CA  1 
+ATOM   4469 C C   . ILE B 1 259 ? 9.704   40.608  81.503  1.00 11.83 ? ? ? ? ? ? 749 ILE B C   1 
+ATOM   4470 O O   . ILE B 1 259 ? 10.644  40.391  80.732  1.00 11.00 ? ? ? ? ? ? 749 ILE B O   1 
+ATOM   4471 C CB  . ILE B 1 259 ? 8.492   42.730  80.994  1.00 15.78 ? ? ? ? ? ? 749 ILE B CB  1 
+ATOM   4472 C CG1 . ILE B 1 259 ? 8.234   44.184  81.367  1.00 18.81 ? ? ? ? ? ? 749 ILE B CG1 1 
+ATOM   4473 C CG2 . ILE B 1 259 ? 7.179   41.992  80.819  1.00 17.05 ? ? ? ? ? ? 749 ILE B CG2 1 
+ATOM   4474 C CD1 . ILE B 1 259 ? 7.621   44.370  82.718  1.00 20.74 ? ? ? ? ? ? 749 ILE B CD1 1 
+ATOM   4475 N N   . VAL B 1 260 ? 8.855   39.654  81.867  1.00 10.40 ? ? ? ? ? ? 750 VAL B N   1 
+ATOM   4476 C CA  . VAL B 1 260 ? 8.974   38.284  81.378  1.00 10.33 ? ? ? ? ? ? 750 VAL B CA  1 
+ATOM   4477 C C   . VAL B 1 260 ? 7.656   37.861  80.707  1.00 9.86  ? ? ? ? ? ? 750 VAL B C   1 
+ATOM   4478 O O   . VAL B 1 260 ? 6.576   38.100  81.250  1.00 11.49 ? ? ? ? ? ? 750 VAL B O   1 
+ATOM   4479 C CB  . VAL B 1 260 ? 9.251   37.295  82.544  1.00 10.64 ? ? ? ? ? ? 750 VAL B CB  1 
+ATOM   4480 C CG1 . VAL B 1 260 ? 9.186   35.849  82.042  1.00 11.68 ? ? ? ? ? ? 750 VAL B CG1 1 
+ATOM   4481 C CG2 . VAL B 1 260 ? 10.601  37.614  83.180  1.00 10.22 ? ? ? ? ? ? 750 VAL B CG2 1 
+ATOM   4482 N N   . SER B 1 261 ? 7.738   37.325  79.497  1.00 8.47  ? ? ? ? ? ? 751 SER B N   1 
+ATOM   4483 C CA  . SER B 1 261 ? 6.548   36.805  78.828  1.00 8.18  ? ? ? ? ? ? 751 SER B CA  1 
+ATOM   4484 C C   . SER B 1 261 ? 6.761   35.318  78.537  1.00 8.82  ? ? ? ? ? ? 751 SER B C   1 
+ATOM   4485 O O   . SER B 1 261 ? 7.898   34.913  78.189  1.00 9.45  ? ? ? ? ? ? 751 SER B O   1 
+ATOM   4486 C CB  . SER B 1 261 ? 6.297   37.529  77.490  1.00 9.10  ? ? ? ? ? ? 751 SER B CB  1 
+ATOM   4487 O OG  . SER B 1 261 ? 5.838   38.839  77.714  1.00 9.79  ? ? ? ? ? ? 751 SER B OG  1 
+ATOM   4488 N N   . PHE B 1 262 ? 5.715   34.490  78.713  1.00 7.78  ? ? ? ? ? ? 752 PHE B N   1 
+ATOM   4489 C CA  . PHE B 1 262 ? 5.819   33.077  78.329  1.00 8.95  ? ? ? ? ? ? 752 PHE B CA  1 
+ATOM   4490 C C   . PHE B 1 262 ? 5.320   33.172  76.882  1.00 8.52  ? ? ? ? ? ? 752 PHE B C   1 
+ATOM   4491 O O   . PHE B 1 262 ? 4.166   33.485  76.649  1.00 8.94  ? ? ? ? ? ? 752 PHE B O   1 
+ATOM   4492 C CB  . PHE B 1 262 ? 4.905   32.170  79.190  1.00 11.03 ? ? ? ? ? ? 752 PHE B CB  1 
+ATOM   4493 C CG  . PHE B 1 262 ? 5.323   32.071  80.636  1.00 12.89 ? ? ? ? ? ? 752 PHE B CG  1 
+ATOM   4494 C CD1 . PHE B 1 262 ? 6.602   32.457  81.055  1.00 14.37 ? ? ? ? ? ? 752 PHE B CD1 1 
+ATOM   4495 C CD2 . PHE B 1 262 ? 4.422   31.585  81.591  1.00 15.38 ? ? ? ? ? ? 752 PHE B CD2 1 
+ATOM   4496 C CE1 . PHE B 1 262 ? 6.983   32.361  82.418  1.00 16.19 ? ? ? ? ? ? 752 PHE B CE1 1 
+ATOM   4497 C CE2 . PHE B 1 262 ? 4.783   31.483  82.966  1.00 15.58 ? ? ? ? ? ? 752 PHE B CE2 1 
+ATOM   4498 C CZ  . PHE B 1 262 ? 6.062   31.870  83.375  1.00 16.18 ? ? ? ? ? ? 752 PHE B CZ  1 
+ATOM   4499 N N   . THR B 1 263 ? 6.176   32.846  75.923  1.00 8.05  ? ? ? ? ? ? 753 THR B N   1 
+ATOM   4500 C CA  . THR B 1 263 ? 5.840   33.077  74.517  1.00 8.09  ? ? ? ? ? ? 753 THR B CA  1 
+ATOM   4501 C C   . THR B 1 263 ? 5.413   31.937  73.600  1.00 8.55  ? ? ? ? ? ? 753 THR B C   1 
+ATOM   4502 O O   . THR B 1 263 ? 4.706   32.188  72.606  1.00 9.14  ? ? ? ? ? ? 753 THR B O   1 
+ATOM   4503 C CB  . THR B 1 263 ? 7.048   33.766  73.794  1.00 8.43  ? ? ? ? ? ? 753 THR B CB  1 
+ATOM   4504 O OG1 . THR B 1 263 ? 8.201   32.923  73.925  1.00 9.37  ? ? ? ? ? ? 753 THR B OG1 1 
+ATOM   4505 C CG2 . THR B 1 263 ? 7.358   35.168  74.382  1.00 9.01  ? ? ? ? ? ? 753 THR B CG2 1 
+ATOM   4506 N N   . GLU B 1 264 ? 5.848   30.712  73.867  1.00 7.13  ? ? ? ? ? ? 754 GLU B N   1 
+ATOM   4507 C CA  . GLU B 1 264 ? 5.535   29.613  72.972  1.00 8.03  ? ? ? ? ? ? 754 GLU B CA  1 
+ATOM   4508 C C   . GLU B 1 264 ? 5.264   28.325  73.740  1.00 8.68  ? ? ? ? ? ? 754 GLU B C   1 
+ATOM   4509 O O   . GLU B 1 264 ? 5.714   27.248  73.314  1.00 8.71  ? ? ? ? ? ? 754 GLU B O   1 
+ATOM   4510 C CB  . GLU B 1 264 ? 6.744   29.367  72.041  1.00 9.32  ? ? ? ? ? ? 754 GLU B CB  1 
+ATOM   4511 C CG  . GLU B 1 264 ? 7.294   30.669  71.376  1.00 9.63  ? ? ? ? ? ? 754 GLU B CG  1 
+ATOM   4512 C CD  . GLU B 1 264 ? 8.411   30.421  70.386  1.00 9.79  ? ? ? ? ? ? 754 GLU B CD  1 
+ATOM   4513 O OE1 . GLU B 1 264 ? 8.742   29.250  70.094  1.00 9.53  ? ? ? ? ? ? 754 GLU B OE1 1 
+ATOM   4514 O OE2 . GLU B 1 264 ? 8.978   31.425  69.902  1.00 10.55 ? ? ? ? ? ? 754 GLU B OE2 1 
+ATOM   4515 N N   . ILE B 1 265 ? 4.452   28.423  74.787  1.00 9.06  ? ? ? ? ? ? 755 ILE B N   1 
+ATOM   4516 C CA  . ILE B 1 265 ? 4.211   27.256  75.638  1.00 9.77  ? ? ? ? ? ? 755 ILE B CA  1 
+ATOM   4517 C C   . ILE B 1 265 ? 3.594   26.046  74.981  1.00 9.16  ? ? ? ? ? ? 755 ILE B C   1 
+ATOM   4518 O O   . ILE B 1 265 ? 2.610   26.147  74.280  1.00 9.12  ? ? ? ? ? ? 755 ILE B O   1 
+ATOM   4519 C CB  . ILE B 1 265 ? 3.289   27.574  76.834  1.00 9.61  ? ? ? ? ? ? 755 ILE B CB  1 
+ATOM   4520 C CG1 . ILE B 1 265 ? 3.800   28.782  77.616  1.00 9.39  ? ? ? ? ? ? 755 ILE B CG1 1 
+ATOM   4521 C CG2 . ILE B 1 265 ? 3.171   26.329  77.763  1.00 10.33 ? ? ? ? ? ? 755 ILE B CG2 1 
+ATOM   4522 C CD1 . ILE B 1 265 ? 2.705   29.437  78.473  1.00 10.97 ? ? ? ? ? ? 755 ILE B CD1 1 
+ATOM   4523 N N   . ASP B 1 266 ? 4.226   24.902  75.226  1.00 11.27 ? ? ? ? ? ? 756 ASP B N   1 
+ATOM   4524 C CA  . ASP B 1 266 ? 3.693   23.583  74.867  1.00 11.75 ? ? ? ? ? ? 756 ASP B CA  1 
+ATOM   4525 C C   . ASP B 1 266 ? 4.331   22.530  75.815  1.00 12.16 ? ? ? ? ? ? 756 ASP B C   1 
+ATOM   4526 O O   . ASP B 1 266 ? 5.456   22.720  76.298  1.00 10.54 ? ? ? ? ? ? 756 ASP B O   1 
+ATOM   4527 C CB  . ASP B 1 266 ? 3.674   23.216  73.363  1.00 12.55 ? ? ? ? ? ? 756 ASP B CB  1 
+ATOM   4528 C CG  . ASP B 1 266 ? 4.978   23.436  72.667  1.00 13.13 ? ? ? ? ? ? 756 ASP B CG  1 
+ATOM   4529 O OD1 . ASP B 1 266 ? 6.040   23.308  73.286  1.00 12.24 ? ? ? ? ? ? 756 ASP B OD1 1 
+ATOM   4530 O OD2 . ASP B 1 266 ? 4.919   23.702  71.453  1.00 13.93 ? ? ? ? ? ? 756 ASP B OD2 1 
+ATOM   4531 N N   . ILE B 1 267 ? 3.527   21.534  76.211  1.00 12.16 ? ? ? ? ? ? 757 ILE B N   1 
+ATOM   4532 C CA  . ILE B 1 267 ? 3.987   20.499  77.156  1.00 12.97 ? ? ? ? ? ? 757 ILE B CA  1 
+ATOM   4533 C C   . ILE B 1 267 ? 3.793   19.129  76.482  1.00 12.86 ? ? ? ? ? ? 757 ILE B C   1 
+ATOM   4534 O O   . ILE B 1 267 ? 2.687   18.579  76.468  1.00 11.90 ? ? ? ? ? ? 757 ILE B O   1 
+ATOM   4535 C CB  . ILE B 1 267 ? 3.240   20.639  78.510  1.00 13.23 ? ? ? ? ? ? 757 ILE B CB  1 
+ATOM   4536 C CG1 . ILE B 1 267 ? 3.386   22.081  79.034  1.00 12.89 ? ? ? ? ? ? 757 ILE B CG1 1 
+ATOM   4537 C CG2 . ILE B 1 267 ? 3.799   19.621  79.528  1.00 13.62 ? ? ? ? ? ? 757 ILE B CG2 1 
+ATOM   4538 C CD1 . ILE B 1 267 ? 2.873   22.336  80.436  1.00 14.34 ? ? ? ? ? ? 757 ILE B CD1 1 
+ATOM   4539 N N   . ARG B 1 268 ? 4.875   18.646  75.863  1.00 13.17 ? ? ? ? ? ? 758 ARG B N   1 
+ATOM   4540 C CA  . ARG B 1 268 ? 4.859   17.413  75.080  1.00 14.61 ? ? ? ? ? ? 758 ARG B CA  1 
+ATOM   4541 C C   . ARG B 1 268 ? 4.885   16.126  75.885  1.00 14.48 ? ? ? ? ? ? 758 ARG B C   1 
+ATOM   4542 O O   . ARG B 1 268 ? 5.654   15.979  76.831  1.00 14.28 ? ? ? ? ? ? 758 ARG B O   1 
+ATOM   4543 C CB  . ARG B 1 268 ? 5.951   17.430  73.998  1.00 14.64 ? ? ? ? ? ? 758 ARG B CB  1 
+ATOM   4544 C CG  . ARG B 1 268 ? 7.386   17.421  74.482  1.00 16.53 ? ? ? ? ? ? 758 ARG B CG  1 
+ATOM   4545 C CD  . ARG B 1 268 ? 8.321   17.662  73.290  1.00 16.65 ? ? ? ? ? ? 758 ARG B CD  1 
+ATOM   4546 N NE  . ARG B 1 268 ? 9.726   17.572  73.651  1.00 18.67 ? ? ? ? ? ? 758 ARG B NE  1 
+ATOM   4547 C CZ  . ARG B 1 268 ? 10.480  18.602  74.031  1.00 19.31 ? ? ? ? ? ? 758 ARG B CZ  1 
+ATOM   4548 N NH1 . ARG B 1 268 ? 9.967   19.823  74.115  1.00 19.80 ? ? ? ? ? ? 758 ARG B NH1 1 
+ATOM   4549 N NH2 . ARG B 1 268 ? 11.757  18.409  74.336  1.00 20.42 ? ? ? ? ? ? 758 ARG B NH2 1 
+ATOM   4550 N N   . ILE B 1 269 ? 4.017   15.211  75.475  1.00 16.39 ? ? ? ? ? ? 759 ILE B N   1 
+ATOM   4551 C CA  . ILE B 1 269 ? 3.817   13.915  76.129  1.00 18.18 ? ? ? ? ? ? 759 ILE B CA  1 
+ATOM   4552 C C   . ILE B 1 269 ? 4.444   12.758  75.372  1.00 21.26 ? ? ? ? ? ? 759 ILE B C   1 
+ATOM   4553 O O   . ILE B 1 269 ? 4.183   12.570  74.184  1.00 20.83 ? ? ? ? ? ? 759 ILE B O   1 
+ATOM   4554 C CB  . ILE B 1 269 ? 2.309   13.616  76.264  1.00 17.34 ? ? ? ? ? ? 759 ILE B CB  1 
+ATOM   4555 C CG1 . ILE B 1 269 ? 1.641   14.677  77.125  1.00 16.21 ? ? ? ? ? ? 759 ILE B CG1 1 
+ATOM   4556 C CG2 . ILE B 1 269 ? 2.094   12.242  76.875  1.00 18.07 ? ? ? ? ? ? 759 ILE B CG2 1 
+ATOM   4557 C CD1 . ILE B 1 269 ? 0.192   14.502  77.226  1.00 15.54 ? ? ? ? ? ? 759 ILE B CD1 1 
+ATOM   4558 N N   . PRO B 1 270 ? 5.274   11.953  76.054  1.00 24.72 ? ? ? ? ? ? 760 PRO B N   1 
+ATOM   4559 C CA  . PRO B 1 270 ? 5.931   10.802  75.428  1.00 28.37 ? ? ? ? ? ? 760 PRO B CA  1 
+ATOM   4560 C C   . PRO B 1 270 ? 4.848   9.853   74.935  1.00 32.38 ? ? ? ? ? ? 760 PRO B C   1 
+ATOM   4561 O O   . PRO B 1 270 ? 3.864   9.603   75.626  1.00 31.63 ? ? ? ? ? ? 760 PRO B O   1 
+ATOM   4562 C CB  . PRO B 1 270 ? 6.726   10.204  76.584  1.00 27.79 ? ? ? ? ? ? 760 PRO B CB  1 
+ATOM   4563 C CG  . PRO B 1 270 ? 7.056   11.420  77.431  1.00 27.34 ? ? ? ? ? ? 760 PRO B CG  1 
+ATOM   4564 C CD  . PRO B 1 270 ? 5.717   12.115  77.448  1.00 25.62 ? ? ? ? ? ? 760 PRO B CD  1 
+ATOM   4565 N N   . GLN B 1 271 ? 5.030   9.354   73.726  1.00 38.35 ? ? ? ? ? ? 761 GLN B N   1 
+ATOM   4566 C CA  . GLN B 1 271 ? 4.074   8.468   73.067  1.00 45.19 ? ? ? ? ? ? 761 GLN B CA  1 
+ATOM   4567 C C   . GLN B 1 271 ? 3.734   7.138   73.763  1.00 47.15 ? ? ? ? ? ? 761 GLN B C   1 
+ATOM   4568 O O   . GLN B 1 271 ? 4.488   6.613   74.600  1.00 47.14 ? ? ? ? ? ? 761 GLN B O   1 
+ATOM   4569 C CB  . GLN B 1 271 ? 4.549   8.214   71.625  1.00 48.30 ? ? ? ? ? ? 761 GLN B CB  1 
+ATOM   4570 C CG  . GLN B 1 271 ? 3.638   7.354   70.757  1.00 52.30 ? ? ? ? ? ? 761 GLN B CG  1 
+ATOM   4571 C CD  . GLN B 1 271 ? 4.324   6.907   69.453  1.00 54.85 ? ? ? ? ? ? 761 GLN B CD  1 
+ATOM   4572 O OE1 . GLN B 1 271 ? 4.493   5.694   69.200  1.00 55.99 ? ? ? ? ? ? 761 GLN B OE1 1 
+ATOM   4573 N NE2 . GLN B 1 271 ? 4.727   7.885   68.621  1.00 55.44 ? ? ? ? ? ? 761 GLN B NE2 1 
+ATOM   4574 N N   . SER B 1 272 ? 2.570   6.610   73.394  1.00 49.80 ? ? ? ? ? ? 762 SER B N   1 
+ATOM   4575 C CA  . SER B 1 272 ? 2.056   5.354   73.926  1.00 52.87 ? ? ? ? ? ? 762 SER B CA  1 
+ATOM   4576 C C   . SER B 1 272 ? 2.028   5.194   75.454  1.00 54.47 ? ? ? ? ? ? 762 SER B C   1 
+ATOM   4577 O O   . SER B 1 272 ? 1.681   4.116   75.970  1.00 54.98 ? ? ? ? ? ? 762 SER B O   1 
+ATOM   4578 C CB  . SER B 1 272 ? 2.682   4.143   73.221  1.00 53.26 ? ? ? ? ? ? 762 SER B CB  1 
+ATOM   4579 O OG  . SER B 1 272 ? 1.813   3.671   72.190  1.00 54.16 ? ? ? ? ? ? 762 SER B OG  1 
+ATOM   4580 N N   . GLU B 1 273 ? 2.397   6.256   76.177  1.00 55.86 ? ? ? ? ? ? 763 GLU B N   1 
+ATOM   4581 C CA  . GLU B 1 273 ? 2.296   6.241   77.629  1.00 56.40 ? ? ? ? ? ? 763 GLU B CA  1 
+ATOM   4582 C C   . GLU B 1 273 ? 0.781   6.507   77.805  1.00 55.89 ? ? ? ? ? ? 763 GLU B C   1 
+ATOM   4583 O O   . GLU B 1 273 ? 0.125   7.082   76.908  1.00 55.54 ? ? ? ? ? ? 763 GLU B O   1 
+ATOM   4584 C CB  . GLU B 1 273 ? 3.137   7.352   78.288  1.00 57.68 ? ? ? ? ? ? 763 GLU B CB  1 
+ATOM   4585 C CG  . GLU B 1 273 ? 2.451   8.728   78.372  1.00 59.42 ? ? ? ? ? ? 763 GLU B CG  1 
+ATOM   4586 C CD  . GLU B 1 273 ? 3.033   9.632   79.454  1.00 60.72 ? ? ? ? ? ? 763 GLU B CD  1 
+ATOM   4587 O OE1 . GLU B 1 273 ? 3.672   9.119   80.404  1.00 61.37 ? ? ? ? ? ? 763 GLU B OE1 1 
+ATOM   4588 O OE2 . GLU B 1 273 ? 2.837   10.868  79.360  1.00 61.91 ? ? ? ? ? ? 763 GLU B OE2 1 
+ATOM   4589 N N   . ASN B 1 274 ? 0.224   6.058   78.925  1.00 55.04 ? ? ? ? ? ? 764 ASN B N   1 
+ATOM   4590 C CA  . ASN B 1 274 ? -1.203  6.212   79.197  1.00 53.96 ? ? ? ? ? ? 764 ASN B CA  1 
+ATOM   4591 C C   . ASN B 1 274 ? -1.719  7.648   79.052  1.00 52.97 ? ? ? ? ? ? 764 ASN B C   1 
+ATOM   4592 O O   . ASN B 1 274 ? -1.371  8.519   79.863  1.00 53.14 ? ? ? ? ? ? 764 ASN B O   1 
+ATOM   4593 C CB  . ASN B 1 274 ? -1.508  5.688   80.606  1.00 54.70 ? ? ? ? ? ? 764 ASN B CB  1 
+ATOM   4594 C CG  . ASN B 1 274 ? -2.999  5.633   80.902  1.00 55.04 ? ? ? ? ? ? 764 ASN B CG  1 
+ATOM   4595 O OD1 . ASN B 1 274 ? -3.810  5.341   80.014  1.00 55.45 ? ? ? ? ? ? 764 ASN B OD1 1 
+ATOM   4596 N ND2 . ASN B 1 274 ? -3.369  5.919   82.156  1.00 55.03 ? ? ? ? ? ? 764 ASN B ND2 1 
+ATOM   4597 N N   . PRO B 1 275 ? -2.556  7.913   78.021  1.00 51.91 ? ? ? ? ? ? 765 PRO B N   1 
+ATOM   4598 C CA  . PRO B 1 275 ? -3.135  9.245   77.763  1.00 50.40 ? ? ? ? ? ? 765 PRO B CA  1 
+ATOM   4599 C C   . PRO B 1 275 ? -3.956  9.737   78.954  1.00 49.00 ? ? ? ? ? ? 765 PRO B C   1 
+ATOM   4600 O O   . PRO B 1 275 ? -4.058  10.942  79.190  1.00 49.31 ? ? ? ? ? ? 765 PRO B O   1 
+ATOM   4601 C CB  . PRO B 1 275 ? -4.028  8.998   76.550  1.00 50.63 ? ? ? ? ? ? 765 PRO B CB  1 
+ATOM   4602 C CG  . PRO B 1 275 ? -3.266  7.936   75.804  1.00 51.31 ? ? ? ? ? ? 765 PRO B CG  1 
+ATOM   4603 C CD  . PRO B 1 275 ? -2.910  6.982   76.933  1.00 51.55 ? ? ? ? ? ? 765 PRO B CD  1 
+ATOM   4604 N N   . ALA B 1 276 ? -4.510  8.794   79.717  1.00 46.61 ? ? ? ? ? ? 766 ALA B N   1 
+ATOM   4605 C CA  . ALA B 1 276 ? -5.320  9.109   80.901  1.00 44.46 ? ? ? ? ? ? 766 ALA B CA  1 
+ATOM   4606 C C   . ALA B 1 276 ? -4.562  9.852   82.015  1.00 42.12 ? ? ? ? ? ? 766 ALA B C   1 
+ATOM   4607 O O   . ALA B 1 276 ? -4.892  11.008  82.307  1.00 42.15 ? ? ? ? ? ? 766 ALA B O   1 
+ATOM   4608 C CB  . ALA B 1 276 ? -5.943  7.843   81.455  1.00 45.41 ? ? ? ? ? ? 766 ALA B CB  1 
+ATOM   4609 N N   . THR B 1 277 ? -3.591  9.180   82.660  1.00 38.97 ? ? ? ? ? ? 767 THR B N   1 
+ATOM   4610 C CA  . THR B 1 277 ? -2.790  9.800   83.734  1.00 35.17 ? ? ? ? ? ? 767 THR B CA  1 
+ATOM   4611 C C   . THR B 1 277 ? -1.850  10.875  83.180  1.00 30.96 ? ? ? ? ? ? 767 THR B C   1 
+ATOM   4612 O O   . THR B 1 277 ? -1.616  11.878  83.844  1.00 28.79 ? ? ? ? ? ? 767 THR B O   1 
+ATOM   4613 C CB  . THR B 1 277 ? -2.002  8.766   84.608  1.00 35.84 ? ? ? ? ? ? 767 THR B CB  1 
+ATOM   4614 O OG1 . THR B 1 277 ? -1.064  8.031   83.810  1.00 36.68 ? ? ? ? ? ? 767 THR B OG1 1 
+ATOM   4615 C CG2 . THR B 1 277 ? -2.970  7.797   85.268  1.00 36.27 ? ? ? ? ? ? 767 THR B CG2 1 
+ATOM   4616 N N   . ALA B 1 278 ? -1.342  10.655  81.963  1.00 27.74 ? ? ? ? ? ? 768 ALA B N   1 
+ATOM   4617 C CA  . ALA B 1 278 ? -0.483  11.629  81.279  1.00 24.83 ? ? ? ? ? ? 768 ALA B CA  1 
+ATOM   4618 C C   . ALA B 1 278 ? -1.229  12.984  81.152  1.00 23.22 ? ? ? ? ? ? 768 ALA B C   1 
+ATOM   4619 O O   . ALA B 1 278 ? -0.654  14.026  81.471  1.00 22.86 ? ? ? ? ? ? 768 ALA B O   1 
+ATOM   4620 C CB  . ALA B 1 278 ? -0.092  11.116  79.913  1.00 24.23 ? ? ? ? ? ? 768 ALA B CB  1 
+ATOM   4621 N N   . PHE B 1 279 ? -2.493  12.975  80.713  1.00 20.89 ? ? ? ? ? ? 769 PHE B N   1 
+ATOM   4622 C CA  . PHE B 1 279 ? -3.283  14.211  80.600  1.00 19.93 ? ? ? ? ? ? 769 PHE B CA  1 
+ATOM   4623 C C   . PHE B 1 279 ? -3.511  14.913  81.935  1.00 18.70 ? ? ? ? ? ? 769 PHE B C   1 
+ATOM   4624 O O   . PHE B 1 279 ? -3.710  16.121  81.964  1.00 17.80 ? ? ? ? ? ? 769 PHE B O   1 
+ATOM   4625 C CB  . PHE B 1 279 ? -4.645  13.959  79.949  1.00 21.55 ? ? ? ? ? ? 769 PHE B CB  1 
+ATOM   4626 C CG  . PHE B 1 279 ? -4.586  13.753  78.466  1.00 22.97 ? ? ? ? ? ? 769 PHE B CG  1 
+ATOM   4627 C CD1 . PHE B 1 279 ? -3.371  13.691  77.801  1.00 23.39 ? ? ? ? ? ? 769 PHE B CD1 1 
+ATOM   4628 C CD2 . PHE B 1 279 ? -5.756  13.604  77.735  1.00 24.57 ? ? ? ? ? ? 769 PHE B CD2 1 
+ATOM   4629 C CE1 . PHE B 1 279 ? -3.301  13.481  76.429  1.00 24.28 ? ? ? ? ? ? 769 PHE B CE1 1 
+ATOM   4630 C CE2 . PHE B 1 279 ? -5.705  13.392  76.346  1.00 26.20 ? ? ? ? ? ? 769 PHE B CE2 1 
+ATOM   4631 C CZ  . PHE B 1 279 ? -4.461  13.330  75.697  1.00 25.58 ? ? ? ? ? ? 769 PHE B CZ  1 
+ATOM   4632 N N   . GLN B 1 280 ? -3.542  14.163  83.042  1.00 18.31 ? ? ? ? ? ? 770 GLN B N   1 
+ATOM   4633 C CA  . GLN B 1 280 ? -3.711  14.808  84.345  1.00 18.14 ? ? ? ? ? ? 770 GLN B CA  1 
+ATOM   4634 C C   . GLN B 1 280 ? -2.418  15.494  84.784  1.00 16.17 ? ? ? ? ? ? 770 GLN B C   1 
+ATOM   4635 O O   . GLN B 1 280 ? -2.445  16.564  85.351  1.00 16.35 ? ? ? ? ? ? 770 GLN B O   1 
+ATOM   4636 C CB  . GLN B 1 280 ? -4.135  13.818  85.431  1.00 19.86 ? ? ? ? ? ? 770 GLN B CB  1 
+ATOM   4637 C CG  . GLN B 1 280 ? -5.498  13.158  85.189  1.00 22.96 ? ? ? ? ? ? 770 GLN B CG  1 
+ATOM   4638 C CD  . GLN B 1 280 ? -6.679  14.133  85.178  1.00 23.79 ? ? ? ? ? ? 770 GLN B CD  1 
+ATOM   4639 O OE1 . GLN B 1 280 ? -6.592  15.292  85.660  1.00 24.20 ? ? ? ? ? ? 770 GLN B OE1 1 
+ATOM   4640 N NE2 . GLN B 1 280 ? -7.807  13.655  84.659  1.00 24.09 ? ? ? ? ? ? 770 GLN B NE2 1 
+ATOM   4641 N N   . VAL B 1 281 ? -1.283  14.861  84.558  1.00 15.93 ? ? ? ? ? ? 771 VAL B N   1 
+ATOM   4642 C CA  . VAL B 1 281 ? -0.002  15.461  84.942  1.00 16.39 ? ? ? ? ? ? 771 VAL B CA  1 
+ATOM   4643 C C   . VAL B 1 281 ? 0.194   16.752  84.117  1.00 16.18 ? ? ? ? ? ? 771 VAL B C   1 
+ATOM   4644 O O   . VAL B 1 281 ? 0.602   17.774  84.647  1.00 15.18 ? ? ? ? ? ? 771 VAL B O   1 
+ATOM   4645 C CB  . VAL B 1 281 ? 1.174   14.486  84.658  1.00 18.42 ? ? ? ? ? ? 771 VAL B CB  1 
+ATOM   4646 C CG1 . VAL B 1 281 ? 2.521   15.208  84.859  1.00 18.28 ? ? ? ? ? ? 771 VAL B CG1 1 
+ATOM   4647 C CG2 . VAL B 1 281 ? 1.072   13.234  85.564  1.00 18.63 ? ? ? ? ? ? 771 VAL B CG2 1 
+ATOM   4648 N N   . GLN B 1 282 ? -0.159  16.687  82.833  1.00 15.51 ? ? ? ? ? ? 772 GLN B N   1 
+ATOM   4649 C CA  . GLN B 1 282 ? -0.038  17.843  81.940  1.00 15.01 ? ? ? ? ? ? 772 GLN B CA  1 
+ATOM   4650 C C   . GLN B 1 282 ? -0.901  18.981  82.469  1.00 14.06 ? ? ? ? ? ? 772 GLN B C   1 
+ATOM   4651 O O   . GLN B 1 282 ? -0.460  20.137  82.508  1.00 14.18 ? ? ? ? ? ? 772 GLN B O   1 
+ATOM   4652 C CB  . GLN B 1 282 ? -0.442  17.445  80.515  1.00 13.63 ? ? ? ? ? ? 772 GLN B CB  1 
+ATOM   4653 C CG  . GLN B 1 282 ? -0.514  18.615  79.542  1.00 13.41 ? ? ? ? ? ? 772 GLN B CG  1 
+ATOM   4654 C CD  . GLN B 1 282 ? -0.966  18.177  78.169  1.00 13.57 ? ? ? ? ? ? 772 GLN B CD  1 
+ATOM   4655 O OE1 . GLN B 1 282 ? -2.134  17.838  77.973  1.00 13.87 ? ? ? ? ? ? 772 GLN B OE1 1 
+ATOM   4656 N NE2 . GLN B 1 282 ? -0.042  18.167  77.208  1.00 13.14 ? ? ? ? ? ? 772 GLN B NE2 1 
+ATOM   4657 N N   . ALA B 1 283 ? -2.121  18.660  82.910  1.00 13.77 ? ? ? ? ? ? 773 ALA B N   1 
+ATOM   4658 C CA  . ALA B 1 283 ? -3.019  19.673  83.470  1.00 12.95 ? ? ? ? ? ? 773 ALA B CA  1 
+ATOM   4659 C C   . ALA B 1 283 ? -2.393  20.344  84.688  1.00 13.59 ? ? ? ? ? ? 773 ALA B C   1 
+ATOM   4660 O O   . ALA B 1 283 ? -2.486  21.565  84.851  1.00 13.84 ? ? ? ? ? ? 773 ALA B O   1 
+ATOM   4661 C CB  . ALA B 1 283 ? -4.358  19.051  83.860  1.00 13.73 ? ? ? ? ? ? 773 ALA B CB  1 
+ATOM   4662 N N   . ASN B 1 284 ? -1.794  19.536  85.570  1.00 15.01 ? ? ? ? ? ? 774 ASN B N   1 
+ATOM   4663 C CA  . ASN B 1 284 ? -1.145  20.053  86.784  1.00 16.44 ? ? ? ? ? ? 774 ASN B CA  1 
+ATOM   4664 C C   . ASN B 1 284 ? 0.021   20.956  86.398  1.00 15.21 ? ? ? ? ? ? 774 ASN B C   1 
+ATOM   4665 O O   . ASN B 1 284 ? 0.223   22.001  87.019  1.00 14.48 ? ? ? ? ? ? 774 ASN B O   1 
+ATOM   4666 C CB  . ASN B 1 284 ? -0.611  18.929  87.680  1.00 19.87 ? ? ? ? ? ? 774 ASN B CB  1 
+ATOM   4667 C CG  . ASN B 1 284 ? -1.725  18.053  88.277  1.00 24.16 ? ? ? ? ? ? 774 ASN B CG  1 
+ATOM   4668 O OD1 . ASN B 1 284 ? -2.867  18.508  88.523  1.00 25.82 ? ? ? ? ? ? 774 ASN B OD1 1 
+ATOM   4669 N ND2 . ASN B 1 284 ? -1.388  16.782  88.528  1.00 25.88 ? ? ? ? ? ? 774 ASN B ND2 1 
+ATOM   4670 N N   . ASN B 1 285 ? 0.778   20.536  85.371  1.00 15.53 ? ? ? ? ? ? 775 ASN B N   1 
+ATOM   4671 C CA  . ASN B 1 285 ? 1.931   21.311  84.850  1.00 14.59 ? ? ? ? ? ? 775 ASN B CA  1 
+ATOM   4672 C C   . ASN B 1 285 ? 1.465   22.679  84.282  1.00 13.48 ? ? ? ? ? ? 775 ASN B C   1 
+ATOM   4673 O O   . ASN B 1 285 ? 2.056   23.706  84.611  1.00 13.68 ? ? ? ? ? ? 775 ASN B O   1 
+ATOM   4674 C CB  . ASN B 1 285 ? 2.706   20.498  83.797  1.00 14.91 ? ? ? ? ? ? 775 ASN B CB  1 
+ATOM   4675 C CG  . ASN B 1 285 ? 3.640   19.443  84.402  1.00 15.08 ? ? ? ? ? ? 775 ASN B CG  1 
+ATOM   4676 O OD1 . ASN B 1 285 ? 4.377   18.800  83.675  1.00 16.43 ? ? ? ? ? ? 775 ASN B OD1 1 
+ATOM   4677 N ND2 . ASN B 1 285 ? 3.637   19.288  85.723  1.00 16.45 ? ? ? ? ? ? 775 ASN B ND2 1 
+ATOM   4678 N N   . TYR B 1 286 ? 0.390   22.711  83.493  1.00 12.69 ? ? ? ? ? ? 776 TYR B N   1 
+ATOM   4679 C CA  . TYR B 1 286 ? -0.140  23.990  82.966  1.00 12.56 ? ? ? ? ? ? 776 TYR B CA  1 
+ATOM   4680 C C   . TYR B 1 286 ? -0.643  24.866  84.099  1.00 12.94 ? ? ? ? ? ? 776 TYR B C   1 
+ATOM   4681 O O   . TYR B 1 286 ? -0.454  26.078  84.095  1.00 12.66 ? ? ? ? ? ? 776 TYR B O   1 
+ATOM   4682 C CB  . TYR B 1 286 ? -1.299  23.768  81.973  1.00 12.26 ? ? ? ? ? ? 776 TYR B CB  1 
+ATOM   4683 C CG  . TYR B 1 286 ? -0.868  23.649  80.523  1.00 13.33 ? ? ? ? ? ? 776 TYR B CG  1 
+ATOM   4684 C CD1 . TYR B 1 286 ? -0.477  24.783  79.793  1.00 13.73 ? ? ? ? ? ? 776 TYR B CD1 1 
+ATOM   4685 C CD2 . TYR B 1 286 ? -0.861  22.408  79.871  1.00 12.42 ? ? ? ? ? ? 776 TYR B CD2 1 
+ATOM   4686 C CE1 . TYR B 1 286 ? -0.088  24.674  78.441  1.00 13.59 ? ? ? ? ? ? 776 TYR B CE1 1 
+ATOM   4687 C CE2 . TYR B 1 286 ? -0.479  22.282  78.515  1.00 13.95 ? ? ? ? ? ? 776 TYR B CE2 1 
+ATOM   4688 C CZ  . TYR B 1 286 ? -0.093  23.433  77.805  1.00 13.89 ? ? ? ? ? ? 776 TYR B CZ  1 
+ATOM   4689 O OH  . TYR B 1 286 ? 0.254   23.340  76.473  1.00 13.64 ? ? ? ? ? ? 776 TYR B OH  1 
+ATOM   4690 N N   . LYS B 1 287 ? -1.341  24.247  85.061  1.00 13.98 ? ? ? ? ? ? 777 LYS B N   1 
+ATOM   4691 C CA  . LYS B 1 287 ? -1.865  24.971  86.211  1.00 14.22 ? ? ? ? ? ? 777 LYS B CA  1 
+ATOM   4692 C C   . LYS B 1 287 ? -0.728  25.615  87.024  1.00 13.19 ? ? ? ? ? ? 777 LYS B C   1 
+ATOM   4693 O O   . LYS B 1 287 ? -0.839  26.763  87.402  1.00 13.79 ? ? ? ? ? ? 777 LYS B O   1 
+ATOM   4694 C CB  . LYS B 1 287 ? -2.699  24.035  87.101  1.00 15.67 ? ? ? ? ? ? 777 LYS B CB  1 
+ATOM   4695 C CG  . LYS B 1 287 ? -3.333  24.755  88.254  1.00 18.09 ? ? ? ? ? ? 777 LYS B CG  1 
+ATOM   4696 C CD  . LYS B 1 287 ? -4.344  23.878  88.932  1.00 20.55 ? ? ? ? ? ? 777 LYS B CD  1 
+ATOM   4697 C CE  . LYS B 1 287 ? -5.259  24.737  89.777  1.00 23.88 ? ? ? ? ? ? 777 LYS B CE  1 
+ATOM   4698 N NZ  . LYS B 1 287 ? -6.266  23.903  90.503  1.00 25.60 ? ? ? ? ? ? 777 LYS B NZ  1 
+ATOM   4699 N N   . GLU B 1 288 ? 0.371   24.899  87.262  1.00 14.09 ? ? ? ? ? ? 778 GLU B N   1 
+ATOM   4700 C CA  . GLU B 1 288 ? 1.480   25.468  88.036  1.00 16.38 ? ? ? ? ? ? 778 GLU B CA  1 
+ATOM   4701 C C   . GLU B 1 288 ? 2.127   26.642  87.278  1.00 16.22 ? ? ? ? ? ? 778 GLU B C   1 
+ATOM   4702 O O   . GLU B 1 288 ? 2.487   27.666  87.878  1.00 15.46 ? ? ? ? ? ? 778 GLU B O   1 
+ATOM   4703 C CB  . GLU B 1 288 ? 2.539   24.410  88.367  1.00 18.97 ? ? ? ? ? ? 778 GLU B CB  1 
+ATOM   4704 C CG  . GLU B 1 288 ? 2.114   23.359  89.398  1.00 22.95 ? ? ? ? ? ? 778 GLU B CG  1 
+ATOM   4705 C CD  . GLU B 1 288 ? 1.516   23.959  90.657  1.00 25.33 ? ? ? ? ? ? 778 GLU B CD  1 
+ATOM   4706 O OE1 . GLU B 1 288 ? 2.165   24.850  91.267  1.00 25.33 ? ? ? ? ? ? 778 GLU B OE1 1 
+ATOM   4707 O OE2 . GLU B 1 288 ? 0.375   23.553  91.020  1.00 28.22 ? ? ? ? ? ? 778 GLU B OE2 1 
+ATOM   4708 N N   . LEU B 1 289 ? 2.240   26.498  85.955  1.00 14.80 ? ? ? ? ? ? 779 LEU B N   1 
+ATOM   4709 C CA  . LEU B 1 289 ? 2.808   27.559  85.113  1.00 15.27 ? ? ? ? ? ? 779 LEU B CA  1 
+ATOM   4710 C C   . LEU B 1 289 ? 1.961   28.840  85.213  1.00 13.72 ? ? ? ? ? ? 779 LEU B C   1 
+ATOM   4711 O O   . LEU B 1 289 ? 2.506   29.945  85.360  1.00 13.17 ? ? ? ? ? ? 779 LEU B O   1 
+ATOM   4712 C CB  . LEU B 1 289 ? 2.859   27.054  83.672  1.00 17.27 ? ? ? ? ? ? 779 LEU B CB  1 
+ATOM   4713 C CG  . LEU B 1 289 ? 4.069   27.298  82.786  1.00 19.73 ? ? ? ? ? ? 779 LEU B CG  1 
+ATOM   4714 C CD1 . LEU B 1 289 ? 5.385   26.983  83.511  1.00 20.00 ? ? ? ? ? ? 779 LEU B CD1 1 
+ATOM   4715 C CD2 . LEU B 1 289 ? 3.884   26.430  81.564  1.00 20.09 ? ? ? ? ? ? 779 LEU B CD2 1 
+ATOM   4716 N N   . MET B 1 290 ? 0.633   28.702  85.131  1.00 12.38 ? ? ? ? ? ? 780 MET B N   1 
+ATOM   4717 C CA  . MET B 1 290 ? -0.266  29.853  85.258  1.00 13.07 ? ? ? ? ? ? 780 MET B CA  1 
+ATOM   4718 C C   . MET B 1 290 ? -0.180  30.489  86.663  1.00 14.32 ? ? ? ? ? ? 780 MET B C   1 
+ATOM   4719 O O   . MET B 1 290 ? -0.276  31.707  86.796  1.00 14.53 ? ? ? ? ? ? 780 MET B O   1 
+ATOM   4720 C CB  . MET B 1 290 ? -1.717  29.487  84.937  1.00 13.50 ? ? ? ? ? ? 780 MET B CB  1 
+ATOM   4721 C CG  . MET B 1 290 ? -2.683  30.659  85.072  1.00 13.47 ? ? ? ? ? ? 780 MET B CG  1 
+ATOM   4722 S SD  . MET B 1 290 ? -2.258  32.124  84.052  1.00 15.61 ? ? ? ? ? ? 780 MET B SD  1 
+ATOM   4723 C CE  . MET B 1 290 ? -2.951  31.613  82.548  1.00 14.16 ? ? ? ? ? ? 780 MET B CE  1 
+ATOM   4724 N N   . LYS B 1 291 ? -0.032  29.669  87.708  1.00 14.75 ? ? ? ? ? ? 781 LYS B N   1 
+ATOM   4725 C CA  . LYS B 1 291 ? 0.124   30.197  89.067  1.00 15.67 ? ? ? ? ? ? 781 LYS B CA  1 
+ATOM   4726 C C   . LYS B 1 291 ? 1.414   31.042  89.209  1.00 14.34 ? ? ? ? ? ? 781 LYS B C   1 
+ATOM   4727 O O   . LYS B 1 291 ? 1.419   32.091  89.868  1.00 14.63 ? ? ? ? ? ? 781 LYS B O   1 
+ATOM   4728 C CB  . LYS B 1 291 ? 0.058   29.049  90.087  1.00 18.22 ? ? ? ? ? ? 781 LYS B CB  1 
+ATOM   4729 C CG  . LYS B 1 291 ? -1.392  28.764  90.547  1.00 20.69 ? ? ? ? ? ? 781 LYS B CG  1 
+ATOM   4730 C CD  . LYS B 1 291 ? -1.642  27.309  90.944  1.00 24.31 ? ? ? ? ? ? 781 LYS B CD  1 
+ATOM   4731 C CE  . LYS B 1 291 ? -0.798  26.833  92.129  1.00 26.56 ? ? ? ? ? ? 781 LYS B CE  1 
+ATOM   4732 N NZ  . LYS B 1 291 ? -1.228  27.442  93.425  1.00 28.92 ? ? ? ? ? ? 781 LYS B NZ  1 
+ATOM   4733 N N   . ILE B 1 292 ? 2.490   30.602  88.564  1.00 14.47 ? ? ? ? ? ? 782 ILE B N   1 
+ATOM   4734 C CA  . ILE B 1 292 ? 3.763   31.342  88.569  1.00 14.49 ? ? ? ? ? ? 782 ILE B CA  1 
+ATOM   4735 C C   . ILE B 1 292 ? 3.540   32.706  87.871  1.00 14.67 ? ? ? ? ? ? 782 ILE B C   1 
+ATOM   4736 O O   . ILE B 1 292 ? 4.006   33.736  88.352  1.00 14.51 ? ? ? ? ? ? 782 ILE B O   1 
+ATOM   4737 C CB  . ILE B 1 292 ? 4.873   30.528  87.836  1.00 15.03 ? ? ? ? ? ? 782 ILE B CB  1 
+ATOM   4738 C CG1 . ILE B 1 292 ? 5.274   29.330  88.702  1.00 15.13 ? ? ? ? ? ? 782 ILE B CG1 1 
+ATOM   4739 C CG2 . ILE B 1 292 ? 6.083   31.412  87.513  1.00 14.48 ? ? ? ? ? ? 782 ILE B CG2 1 
+ATOM   4740 C CD1 . ILE B 1 292 ? 6.159   28.336  87.999  1.00 16.57 ? ? ? ? ? ? 782 ILE B CD1 1 
+ATOM   4741 N N   . CYS B 1 293 ? 2.822   32.701  86.747  1.00 14.34 ? ? ? ? ? ? 783 CYS B N   1 
+ATOM   4742 C CA  . CYS B 1 293 ? 2.509   33.931  86.019  1.00 15.33 ? ? ? ? ? ? 783 CYS B CA  1 
+ATOM   4743 C C   . CYS B 1 293 ? 1.722   34.895  86.913  1.00 16.01 ? ? ? ? ? ? 783 CYS B C   1 
+ATOM   4744 O O   . CYS B 1 293 ? 2.095   36.053  87.071  1.00 16.32 ? ? ? ? ? ? 783 CYS B O   1 
+ATOM   4745 C CB  . CYS B 1 293 ? 1.714   33.586  84.753  1.00 15.91 ? ? ? ? ? ? 783 CYS B CB  1 
+ATOM   4746 S SG  . CYS B 1 293 ? 1.194   34.967  83.726  1.00 20.16 ? ? ? ? ? ? 783 CYS B SG  1 
+ATOM   4747 N N   . LEU B 1 294 ? 0.706   34.374  87.594  1.00 16.28 ? ? ? ? ? ? 784 LEU B N   1 
+ATOM   4748 C CA  . LEU B 1 294 ? -0.127  35.183  88.482  1.00 17.40 ? ? ? ? ? ? 784 LEU B CA  1 
+ATOM   4749 C C   . LEU B 1 294 ? 0.607   35.727  89.700  1.00 17.91 ? ? ? ? ? ? 784 LEU B C   1 
+ATOM   4750 O O   . LEU B 1 294 ? 0.273   36.809  90.198  1.00 19.36 ? ? ? ? ? ? 784 LEU B O   1 
+ATOM   4751 C CB  . LEU B 1 294 ? -1.339  34.373  88.954  1.00 17.52 ? ? ? ? ? ? 784 LEU B CB  1 
+ATOM   4752 C CG  . LEU B 1 294 ? -2.382  34.063  87.874  1.00 17.20 ? ? ? ? ? ? 784 LEU B CG  1 
+ATOM   4753 C CD1 . LEU B 1 294 ? -3.386  33.093  88.432  1.00 18.30 ? ? ? ? ? ? 784 LEU B CD1 1 
+ATOM   4754 C CD2 . LEU B 1 294 ? -3.062  35.331  87.397  1.00 17.96 ? ? ? ? ? ? 784 LEU B CD2 1 
+ATOM   4755 N N   . ALA B 1 295 ? 1.584   34.969  90.192  1.00 18.24 ? ? ? ? ? ? 785 ALA B N   1 
+ATOM   4756 C CA  . ALA B 1 295 ? 2.361   35.352  91.372  1.00 17.84 ? ? ? ? ? ? 785 ALA B CA  1 
+ATOM   4757 C C   . ALA B 1 295 ? 3.404   36.442  91.155  1.00 19.56 ? ? ? ? ? ? 785 ALA B C   1 
+ATOM   4758 O O   . ALA B 1 295 ? 3.809   37.103  92.116  1.00 20.73 ? ? ? ? ? ? 785 ALA B O   1 
+ATOM   4759 C CB  . ALA B 1 295 ? 3.071   34.119  91.948  1.00 18.50 ? ? ? ? ? ? 785 ALA B CB  1 
+ATOM   4760 N N   . ASN B 1 296 ? 3.885   36.597  89.916  1.00 17.87 ? ? ? ? ? ? 786 ASN B N   1 
+ATOM   4761 C CA  . ASN B 1 296 ? 4.939   37.564  89.618  1.00 17.02 ? ? ? ? ? ? 786 ASN B CA  1 
+ATOM   4762 C C   . ASN B 1 296 ? 4.407   38.787  88.887  1.00 17.01 ? ? ? ? ? ? 786 ASN B C   1 
+ATOM   4763 O O   . ASN B 1 296 ? 3.885   38.692  87.772  1.00 18.13 ? ? ? ? ? ? 786 ASN B O   1 
+ATOM   4764 C CB  . ASN B 1 296 ? 6.060   36.869  88.840  1.00 15.09 ? ? ? ? ? ? 786 ASN B CB  1 
+ATOM   4765 C CG  . ASN B 1 296 ? 6.839   35.870  89.704  1.00 14.64 ? ? ? ? ? ? 786 ASN B CG  1 
+ATOM   4766 O OD1 . ASN B 1 296 ? 7.671   36.274  90.506  1.00 14.93 ? ? ? ? ? ? 786 ASN B OD1 1 
+ATOM   4767 N ND2 . ASN B 1 296 ? 6.571   34.577  89.536  1.00 13.68 ? ? ? ? ? ? 786 ASN B ND2 1 
+ATOM   4768 N N   . PRO B 1 297 ? 4.564   39.967  89.488  1.00 17.46 ? ? ? ? ? ? 787 PRO B N   1 
+ATOM   4769 C CA  . PRO B 1 297 ? 4.077   41.213  88.877  1.00 17.30 ? ? ? ? ? ? 787 PRO B CA  1 
+ATOM   4770 C C   . PRO B 1 297 ? 4.686   41.629  87.527  1.00 16.47 ? ? ? ? ? ? 787 PRO B C   1 
+ATOM   4771 O O   . PRO B 1 297 ? 4.074   42.400  86.808  1.00 16.34 ? ? ? ? ? ? 787 PRO B O   1 
+ATOM   4772 C CB  . PRO B 1 297 ? 4.312   42.259  89.971  1.00 18.37 ? ? ? ? ? ? 787 PRO B CB  1 
+ATOM   4773 C CG  . PRO B 1 297 ? 5.471   41.698  90.760  1.00 19.15 ? ? ? ? ? ? 787 PRO B CG  1 
+ATOM   4774 C CD  . PRO B 1 297 ? 5.183   40.214  90.809  1.00 18.17 ? ? ? ? ? ? 787 PRO B CD  1 
+ATOM   4775 N N   . ASN B 1 298 ? 5.884   41.134  87.213  1.00 15.02 ? ? ? ? ? ? 788 ASN B N   1 
+ATOM   4776 C CA  . ASN B 1 298 ? 6.555   41.449  85.943  1.00 14.29 ? ? ? ? ? ? 788 ASN B CA  1 
+ATOM   4777 C C   . ASN B 1 298 ? 6.289   40.392  84.867  1.00 14.27 ? ? ? ? ? ? 788 ASN B C   1 
+ATOM   4778 O O   . ASN B 1 298 ? 6.941   40.414  83.846  1.00 13.45 ? ? ? ? ? ? 788 ASN B O   1 
+ATOM   4779 C CB  . ASN B 1 298 ? 8.071   41.592  86.147  1.00 12.55 ? ? ? ? ? ? 788 ASN B CB  1 
+ATOM   4780 C CG  . ASN B 1 298 ? 8.729   40.298  86.555  1.00 12.66 ? ? ? ? ? ? 788 ASN B CG  1 
+ATOM   4781 O OD1 . ASN B 1 298 ? 8.180   39.549  87.361  1.00 13.26 ? ? ? ? ? ? 788 ASN B OD1 1 
+ATOM   4782 N ND2 . ASN B 1 298 ? 9.901   40.026  86.022  1.00 12.71 ? ? ? ? ? ? 788 ASN B ND2 1 
+ATOM   4783 N N   . CYS B 1 299 ? 5.326   39.494  85.075  1.00 15.09 ? ? ? ? ? ? 789 CYS B N   1 
+ATOM   4784 C CA  . CYS B 1 299 ? 5.045   38.444  84.104  1.00 16.88 ? ? ? ? ? ? 789 CYS B CA  1 
+ATOM   4785 C C   . CYS B 1 299 ? 3.561   38.501  83.863  1.00 18.35 ? ? ? ? ? ? 789 CYS B C   1 
+ATOM   4786 O O   . CYS B 1 299 ? 2.783   38.098  84.715  1.00 20.01 ? ? ? ? ? ? 789 CYS B O   1 
+ATOM   4787 C CB  . CYS B 1 299 ? 5.467   37.079  84.661  1.00 17.51 ? ? ? ? ? ? 789 CYS B CB  1 
+ATOM   4788 S SG  . CYS B 1 299 ? 5.184   35.693  83.514  1.00 22.69 ? ? ? ? ? ? 789 CYS B SG  1 
+ATOM   4789 N N   . ASN B 1 300 ? 3.155   39.013  82.707  1.00 18.24 ? ? ? ? ? ? 790 ASN B N   1 
+ATOM   4790 C CA  . ASN B 1 300 ? 1.736   39.164  82.417  1.00 19.40 ? ? ? ? ? ? 790 ASN B CA  1 
+ATOM   4791 C C   . ASN B 1 300 ? 1.251   38.738  81.029  1.00 16.05 ? ? ? ? ? ? 790 ASN B C   1 
+ATOM   4792 O O   . ASN B 1 300 ? 0.138   39.080  80.630  1.00 14.67 ? ? ? ? ? ? 790 ASN B O   1 
+ATOM   4793 C CB  . ASN B 1 300 ? 1.338   40.609  82.672  1.00 24.02 ? ? ? ? ? ? 790 ASN B CB  1 
+ATOM   4794 C CG  . ASN B 1 300 ? 1.751   41.085  84.074  1.00 28.09 ? ? ? ? ? ? 790 ASN B CG  1 
+ATOM   4795 O OD1 . ASN B 1 300 ? 2.754   41.800  84.220  1.00 30.79 ? ? ? ? ? ? 790 ASN B OD1 1 
+ATOM   4796 N ND2 . ASN B 1 300 ? 0.993   40.677  85.110  1.00 29.63 ? ? ? ? ? ? 790 ASN B ND2 1 
+ATOM   4797 N N   . THR B 1 301 ? 2.042   37.914  80.359  1.00 12.89 ? ? ? ? ? ? 791 THR B N   1 
+ATOM   4798 C CA  . THR B 1 301 ? 1.730   37.442  79.023  1.00 11.55 ? ? ? ? ? ? 791 THR B CA  1 
+ATOM   4799 C C   . THR B 1 301 ? 1.925   35.935  79.031  1.00 10.00 ? ? ? ? ? ? 791 THR B C   1 
+ATOM   4800 O O   . THR B 1 301 ? 3.018   35.451  79.343  1.00 10.08 ? ? ? ? ? ? 791 THR B O   1 
+ATOM   4801 C CB  . THR B 1 301 ? 2.699   38.112  78.054  1.00 12.18 ? ? ? ? ? ? 791 THR B CB  1 
+ATOM   4802 O OG1 . THR B 1 301 ? 2.437   39.513  78.077  1.00 14.27 ? ? ? ? ? ? 791 THR B OG1 1 
+ATOM   4803 C CG2 . THR B 1 301 ? 2.568   37.563  76.635  1.00 12.32 ? ? ? ? ? ? 791 THR B CG2 1 
+ATOM   4804 N N   . PHE B 1 302 ? 0.854   35.216  78.685  1.00 9.31  ? ? ? ? ? ? 792 PHE B N   1 
+ATOM   4805 C CA  . PHE B 1 302 ? 0.834   33.757  78.696  1.00 9.88  ? ? ? ? ? ? 792 PHE B CA  1 
+ATOM   4806 C C   . PHE B 1 302 ? 0.400   33.268  77.303  1.00 9.81  ? ? ? ? ? ? 792 PHE B C   1 
+ATOM   4807 O O   . PHE B 1 302 ? -0.806  33.196  77.009  1.00 10.08 ? ? ? ? ? ? 792 PHE B O   1 
+ATOM   4808 C CB  . PHE B 1 302 ? -0.182  33.314  79.781  1.00 10.18 ? ? ? ? ? ? 792 PHE B CB  1 
+ATOM   4809 C CG  . PHE B 1 302 ? -0.103  31.855  80.152  1.00 11.69 ? ? ? ? ? ? 792 PHE B CG  1 
+ATOM   4810 C CD1 . PHE B 1 302 ? 0.732   31.434  81.198  1.00 12.53 ? ? ? ? ? ? 792 PHE B CD1 1 
+ATOM   4811 C CD2 . PHE B 1 302 ? -0.904  30.900  79.495  1.00 12.16 ? ? ? ? ? ? 792 PHE B CD2 1 
+ATOM   4812 C CE1 . PHE B 1 302 ? 0.767   30.072  81.593  1.00 13.77 ? ? ? ? ? ? 792 PHE B CE1 1 
+ATOM   4813 C CE2 . PHE B 1 302 ? -0.883  29.538  79.873  1.00 13.10 ? ? ? ? ? ? 792 PHE B CE2 1 
+ATOM   4814 C CZ  . PHE B 1 302 ? -0.045  29.121  80.927  1.00 13.08 ? ? ? ? ? ? 792 PHE B CZ  1 
+ATOM   4815 N N   . VAL B 1 303 ? 1.367   32.961  76.437  1.00 9.05  ? ? ? ? ? ? 793 VAL B N   1 
+ATOM   4816 C CA  . VAL B 1 303 ? 1.070   32.516  75.061  1.00 9.67  ? ? ? ? ? ? 793 VAL B CA  1 
+ATOM   4817 C C   . VAL B 1 303 ? 1.502   31.066  74.783  1.00 8.71  ? ? ? ? ? ? 793 VAL B C   1 
+ATOM   4818 O O   . VAL B 1 303 ? 2.639   30.678  75.046  1.00 9.22  ? ? ? ? ? ? 793 VAL B O   1 
+ATOM   4819 C CB  . VAL B 1 303 ? 1.732   33.489  73.960  1.00 9.67  ? ? ? ? ? ? 793 VAL B CB  1 
+ATOM   4820 C CG1 . VAL B 1 303 ? 1.468   32.975  72.511  1.00 9.09  ? ? ? ? ? ? 793 VAL B CG1 1 
+ATOM   4821 C CG2 . VAL B 1 303 ? 1.180   34.905  74.121  1.00 10.35 ? ? ? ? ? ? 793 VAL B CG2 1 
+ATOM   4822 N N   . MET B 1 304 ? 0.567   30.274  74.293  1.00 8.06  ? ? ? ? ? ? 794 MET B N   1 
+ATOM   4823 C CA  . MET B 1 304 ? 0.821   28.882  73.971  1.00 9.34  ? ? ? ? ? ? 794 MET B CA  1 
+ATOM   4824 C C   . MET B 1 304 ? 1.089   28.759  72.463  1.00 9.84  ? ? ? ? ? ? 794 MET B C   1 
+ATOM   4825 O O   . MET B 1 304 ? 0.570   29.570  71.672  1.00 9.87  ? ? ? ? ? ? 794 MET B O   1 
+ATOM   4826 C CB  . MET B 1 304 ? -0.392  28.023  74.394  1.00 9.85  ? ? ? ? ? ? 794 MET B CB  1 
+ATOM   4827 C CG  . MET B 1 304 ? -0.589  28.029  75.939  1.00 12.49 ? ? ? ? ? ? 794 MET B CG  1 
+ATOM   4828 S SD  . MET B 1 304 ? -2.232  27.531  76.502  1.00 13.56 ? ? ? ? ? ? 794 MET B SD  1 
+ATOM   4829 C CE  . MET B 1 304 ? -3.162  28.921  75.976  1.00 14.10 ? ? ? ? ? ? 794 MET B CE  1 
+ATOM   4830 N N   . TRP B 1 305 ? 1.885   27.768  72.068  1.00 9.89  ? ? ? ? ? ? 795 TRP B N   1 
+ATOM   4831 C CA  . TRP B 1 305 ? 2.209   27.588  70.653  1.00 10.89 ? ? ? ? ? ? 795 TRP B CA  1 
+ATOM   4832 C C   . TRP B 1 305 ? 1.152   26.732  69.977  1.00 9.07  ? ? ? ? ? ? 795 TRP B C   1 
+ATOM   4833 O O   . TRP B 1 305 ? 1.444   25.661  69.459  1.00 11.22 ? ? ? ? ? ? 795 TRP B O   1 
+ATOM   4834 C CB  . TRP B 1 305 ? 3.620   27.004  70.465  1.00 12.28 ? ? ? ? ? ? 795 TRP B CB  1 
+ATOM   4835 C CG  . TRP B 1 305 ? 4.347   27.586  69.250  1.00 14.30 ? ? ? ? ? ? 795 TRP B CG  1 
+ATOM   4836 C CD1 . TRP B 1 305 ? 4.950   26.885  68.240  1.00 15.74 ? ? ? ? ? ? 795 TRP B CD1 1 
+ATOM   4837 C CD2 . TRP B 1 305 ? 4.512   28.994  68.922  1.00 14.78 ? ? ? ? ? ? 795 TRP B CD2 1 
+ATOM   4838 N NE1 . TRP B 1 305 ? 5.480   27.769  67.300  1.00 17.03 ? ? ? ? ? ? 795 TRP B NE1 1 
+ATOM   4839 C CE2 . TRP B 1 305 ? 5.230   29.060  67.699  1.00 16.49 ? ? ? ? ? ? 795 TRP B CE2 1 
+ATOM   4840 C CE3 . TRP B 1 305 ? 4.117   30.200  69.545  1.00 14.93 ? ? ? ? ? ? 795 TRP B CE3 1 
+ATOM   4841 C CZ2 . TRP B 1 305 ? 5.569   30.296  67.087  1.00 16.88 ? ? ? ? ? ? 795 TRP B CZ2 1 
+ATOM   4842 C CZ3 . TRP B 1 305 ? 4.450   31.428  68.936  1.00 16.14 ? ? ? ? ? ? 795 TRP B CZ3 1 
+ATOM   4843 C CH2 . TRP B 1 305 ? 5.170   31.461  67.723  1.00 16.14 ? ? ? ? ? ? 795 TRP B CH2 1 
+ATOM   4844 N N   . GLY B 1 306 ? -0.078  27.236  69.991  1.00 10.65 ? ? ? ? ? ? 796 GLY B N   1 
+ATOM   4845 C CA  . GLY B 1 306 ? -1.222  26.550  69.410  1.00 9.77  ? ? ? ? ? ? 796 GLY B CA  1 
+ATOM   4846 C C   . GLY B 1 306 ? -2.243  26.275  70.511  1.00 10.78 ? ? ? ? ? ? 796 GLY B C   1 
+ATOM   4847 O O   . GLY B 1 306 ? -1.986  26.544  71.688  1.00 11.56 ? ? ? ? ? ? 796 GLY B O   1 
+ATOM   4848 N N   . PHE B 1 307 ? -3.427  25.802  70.143  1.00 10.22 ? ? ? ? ? ? 797 PHE B N   1 
+ATOM   4849 C CA  . PHE B 1 307 ? -4.438  25.471  71.152  1.00 10.47 ? ? ? ? ? ? 797 PHE B CA  1 
+ATOM   4850 C C   . PHE B 1 307 ? -5.055  24.081  70.936  1.00 11.11 ? ? ? ? ? ? 797 PHE B C   1 
+ATOM   4851 O O   . PHE B 1 307 ? -5.619  23.506  71.865  1.00 12.17 ? ? ? ? ? ? 797 PHE B O   1 
+ATOM   4852 C CB  . PHE B 1 307 ? -5.500  26.558  71.296  1.00 10.07 ? ? ? ? ? ? 797 PHE B CB  1 
+ATOM   4853 C CG  . PHE B 1 307 ? -6.307  26.813  70.056  1.00 11.57 ? ? ? ? ? ? 797 PHE B CG  1 
+ATOM   4854 C CD1 . PHE B 1 307 ? -5.892  27.778  69.134  1.00 12.54 ? ? ? ? ? ? 797 PHE B CD1 1 
+ATOM   4855 C CD2 . PHE B 1 307 ? -7.500  26.127  69.824  1.00 12.64 ? ? ? ? ? ? 797 PHE B CD2 1 
+ATOM   4856 C CE1 . PHE B 1 307 ? -6.656  28.063  67.996  1.00 12.91 ? ? ? ? ? ? 797 PHE B CE1 1 
+ATOM   4857 C CE2 . PHE B 1 307 ? -8.278  26.405  68.677  1.00 13.41 ? ? ? ? ? ? 797 PHE B CE2 1 
+ATOM   4858 C CZ  . PHE B 1 307 ? -7.839  27.383  67.768  1.00 13.02 ? ? ? ? ? ? 797 PHE B CZ  1 
+ATOM   4859 N N   . THR B 1 308 ? -4.929  23.524  69.735  1.00 10.30 ? ? ? ? ? ? 798 THR B N   1 
+ATOM   4860 C CA  . THR B 1 308 ? -5.455  22.184  69.458  1.00 11.03 ? ? ? ? ? ? 798 THR B CA  1 
+ATOM   4861 C C   . THR B 1 308 ? -4.378  21.200  69.012  1.00 11.46 ? ? ? ? ? ? 798 THR B C   1 
+ATOM   4862 O O   . THR B 1 308 ? -3.500  21.535  68.210  1.00 11.08 ? ? ? ? ? ? 798 THR B O   1 
+ATOM   4863 C CB  . THR B 1 308 ? -6.627  22.199  68.425  1.00 10.50 ? ? ? ? ? ? 798 THR B CB  1 
+ATOM   4864 O OG1 . THR B 1 308 ? -6.972  20.858  68.104  1.00 11.94 ? ? ? ? ? ? 798 THR B OG1 1 
+ATOM   4865 C CG2 . THR B 1 308 ? -6.234  22.921  67.103  1.00 11.96 ? ? ? ? ? ? 798 THR B CG2 1 
+ATOM   4866 N N   . ASP B 1 309 ? -4.416  19.989  69.559  1.00 12.04 ? ? ? ? ? ? 799 ASP B N   1 
+ATOM   4867 C CA  . ASP B 1 309 ? -3.458  18.941  69.197  1.00 13.36 ? ? ? ? ? ? 799 ASP B CA  1 
+ATOM   4868 C C   . ASP B 1 309 ? -3.493  18.599  67.710  1.00 13.69 ? ? ? ? ? ? 799 ASP B C   1 
+ATOM   4869 O O   . ASP B 1 309 ? -2.619  17.874  67.223  1.00 14.84 ? ? ? ? ? ? 799 ASP B O   1 
+ATOM   4870 C CB  . ASP B 1 309 ? -3.707  17.653  70.003  1.00 13.03 ? ? ? ? ? ? 799 ASP B CB  1 
+ATOM   4871 C CG  . ASP B 1 309 ? -3.376  17.808  71.476  1.00 14.37 ? ? ? ? ? ? 799 ASP B CG  1 
+ATOM   4872 O OD1 . ASP B 1 309 ? -2.672  18.771  71.858  1.00 13.46 ? ? ? ? ? ? 799 ASP B OD1 1 
+ATOM   4873 O OD2 . ASP B 1 309 ? -3.821  16.937  72.258  1.00 15.05 ? ? ? ? ? ? 799 ASP B OD2 1 
+ATOM   4874 N N   . LYS B 1 310 ? -4.535  19.051  67.012  1.00 14.32 ? ? ? ? ? ? 800 LYS B N   1 
+ATOM   4875 C CA  . LYS B 1 310 ? -4.644  18.827  65.563  1.00 15.02 ? ? ? ? ? ? 800 LYS B CA  1 
+ATOM   4876 C C   . LYS B 1 310 ? -3.525  19.581  64.774  1.00 15.94 ? ? ? ? ? ? 800 LYS B C   1 
+ATOM   4877 O O   . LYS B 1 310 ? -3.046  19.098  63.744  1.00 16.72 ? ? ? ? ? ? 800 LYS B O   1 
+ATOM   4878 C CB  . LYS B 1 310 ? -6.006  19.305  65.085  1.00 16.19 ? ? ? ? ? ? 800 LYS B CB  1 
+ATOM   4879 C CG  . LYS B 1 310 ? -6.331  18.996  63.633  1.00 17.38 ? ? ? ? ? ? 800 LYS B CG  1 
+ATOM   4880 C CD  . LYS B 1 310 ? -7.754  19.402  63.360  1.00 18.95 ? ? ? ? ? ? 800 LYS B CD  1 
+ATOM   4881 C CE  . LYS B 1 310 ? -8.214  18.922  62.004  1.00 21.14 ? ? ? ? ? ? 800 LYS B CE  1 
+ATOM   4882 N NZ  . LYS B 1 310 ? -9.547  19.507  61.636  1.00 23.77 ? ? ? ? ? ? 800 LYS B NZ  1 
+ATOM   4883 N N   . TYR B 1 311 ? -3.087  20.737  65.274  1.00 15.47 ? ? ? ? ? ? 801 TYR B N   1 
+ATOM   4884 C CA  . TYR B 1 311 ? -2.051  21.529  64.590  1.00 14.06 ? ? ? ? ? ? 801 TYR B CA  1 
+ATOM   4885 C C   . TYR B 1 311 ? -0.923  21.860  65.546  1.00 14.12 ? ? ? ? ? ? 801 TYR B C   1 
+ATOM   4886 O O   . TYR B 1 311 ? -1.091  22.710  66.440  1.00 13.84 ? ? ? ? ? ? 801 TYR B O   1 
+ATOM   4887 C CB  . TYR B 1 311 ? -2.638  22.832  64.043  1.00 13.16 ? ? ? ? ? ? 801 TYR B CB  1 
+ATOM   4888 C CG  . TYR B 1 311 ? -3.825  22.640  63.127  1.00 12.66 ? ? ? ? ? ? 801 TYR B CG  1 
+ATOM   4889 C CD1 . TYR B 1 311 ? -3.677  22.070  61.858  1.00 13.56 ? ? ? ? ? ? 801 TYR B CD1 1 
+ATOM   4890 C CD2 . TYR B 1 311 ? -5.089  23.007  63.538  1.00 12.59 ? ? ? ? ? ? 801 TYR B CD2 1 
+ATOM   4891 C CE1 . TYR B 1 311 ? -4.797  21.872  61.019  1.00 13.37 ? ? ? ? ? ? 801 TYR B CE1 1 
+ATOM   4892 C CE2 . TYR B 1 311 ? -6.194  22.823  62.730  1.00 13.14 ? ? ? ? ? ? 801 TYR B CE2 1 
+ATOM   4893 C CZ  . TYR B 1 311 ? -6.052  22.256  61.471  1.00 12.89 ? ? ? ? ? ? 801 TYR B CZ  1 
+ATOM   4894 O OH  . TYR B 1 311 ? -7.176  22.107  60.697  1.00 13.83 ? ? ? ? ? ? 801 TYR B OH  1 
+ATOM   4895 N N   . THR B 1 312 ? 0.211   21.177  65.374  1.00 14.89 ? ? ? ? ? ? 802 THR B N   1 
+ATOM   4896 C CA  . THR B 1 312 ? 1.389   21.405  66.214  1.00 15.78 ? ? ? ? ? ? 802 THR B CA  1 
+ATOM   4897 C C   . THR B 1 312 ? 2.699   20.926  65.585  1.00 16.56 ? ? ? ? ? ? 802 THR B C   1 
+ATOM   4898 O O   . THR B 1 312 ? 2.750   19.895  64.927  1.00 16.66 ? ? ? ? ? ? 802 THR B O   1 
+ATOM   4899 C CB  . THR B 1 312 ? 1.233   20.786  67.650  1.00 15.47 ? ? ? ? ? ? 802 THR B CB  1 
+ATOM   4900 O OG1 . THR B 1 312 ? 2.484   20.925  68.351  1.00 15.40 ? ? ? ? ? ? 802 THR B OG1 1 
+ATOM   4901 C CG2 . THR B 1 312 ? 0.827   19.306  67.583  1.00 14.22 ? ? ? ? ? ? 802 THR B CG2 1 
+ATOM   4902 N N   . TRP B 1 313 ? 3.760   21.688  65.818  1.00 17.57 ? ? ? ? ? ? 803 TRP B N   1 
+ATOM   4903 C CA  . TRP B 1 313 ? 5.082   21.363  65.286  1.00 19.37 ? ? ? ? ? ? 803 TRP B CA  1 
+ATOM   4904 C C   . TRP B 1 313 ? 5.791   20.230  66.063  1.00 20.30 ? ? ? ? ? ? 803 TRP B C   1 
+ATOM   4905 O O   . TRP B 1 313 ? 6.753   19.645  65.565  1.00 20.42 ? ? ? ? ? ? 803 TRP B O   1 
+ATOM   4906 C CB  . TRP B 1 313 ? 5.982   22.614  65.333  1.00 19.81 ? ? ? ? ? ? 803 TRP B CB  1 
+ATOM   4907 C CG  . TRP B 1 313 ? 6.433   22.992  66.735  1.00 20.80 ? ? ? ? ? ? 803 TRP B CG  1 
+ATOM   4908 C CD1 . TRP B 1 313 ? 5.634   23.220  67.837  1.00 20.26 ? ? ? ? ? ? 803 TRP B CD1 1 
+ATOM   4909 C CD2 . TRP B 1 313 ? 7.782   23.167  67.183  1.00 22.32 ? ? ? ? ? ? 803 TRP B CD2 1 
+ATOM   4910 N NE1 . TRP B 1 313 ? 6.409   23.519  68.929  1.00 20.02 ? ? ? ? ? ? 803 TRP B NE1 1 
+ATOM   4911 C CE2 . TRP B 1 313 ? 7.728   23.494  68.564  1.00 22.08 ? ? ? ? ? ? 803 TRP B CE2 1 
+ATOM   4912 C CE3 . TRP B 1 313 ? 9.039   23.086  66.553  1.00 23.62 ? ? ? ? ? ? 803 TRP B CE3 1 
+ATOM   4913 C CZ2 . TRP B 1 313 ? 8.891   23.735  69.333  1.00 23.52 ? ? ? ? ? ? 803 TRP B CZ2 1 
+ATOM   4914 C CZ3 . TRP B 1 313 ? 10.195  23.333  67.316  1.00 24.55 ? ? ? ? ? ? 803 TRP B CZ3 1 
+ATOM   4915 C CH2 . TRP B 1 313 ? 10.108  23.652  68.697  1.00 24.30 ? ? ? ? ? ? 803 TRP B CH2 1 
+ATOM   4916 N N   . ILE B 1 314 ? 5.318   19.923  67.273  1.00 21.12 ? ? ? ? ? ? 804 ILE B N   1 
+ATOM   4917 C CA  . ILE B 1 314 ? 5.970   18.921  68.134  1.00 20.98 ? ? ? ? ? ? 804 ILE B CA  1 
+ATOM   4918 C C   . ILE B 1 314 ? 6.266   17.526  67.566  1.00 22.84 ? ? ? ? ? ? 804 ILE B C   1 
+ATOM   4919 O O   . ILE B 1 314 ? 7.415   17.116  67.555  1.00 23.13 ? ? ? ? ? ? 804 ILE B O   1 
+ATOM   4920 C CB  . ILE B 1 314 ? 5.247   18.809  69.507  1.00 19.92 ? ? ? ? ? ? 804 ILE B CB  1 
+ATOM   4921 C CG1 . ILE B 1 314 ? 5.380   20.128  70.275  1.00 18.56 ? ? ? ? ? ? 804 ILE B CG1 1 
+ATOM   4922 C CG2 . ILE B 1 314 ? 5.813   17.651  70.324  1.00 19.45 ? ? ? ? ? ? 804 ILE B CG2 1 
+ATOM   4923 C CD1 . ILE B 1 314 ? 6.790   20.518  70.613  1.00 18.51 ? ? ? ? ? ? 804 ILE B CD1 1 
+ATOM   4924 N N   . PRO B 1 315 ? 5.248   16.788  67.082  1.00 25.30 ? ? ? ? ? ? 805 PRO B N   1 
+ATOM   4925 C CA  . PRO B 1 315 ? 5.444   15.437  66.525  1.00 27.68 ? ? ? ? ? ? 805 PRO B CA  1 
+ATOM   4926 C C   . PRO B 1 315 ? 6.494   15.284  65.399  1.00 29.75 ? ? ? ? ? ? 805 PRO B C   1 
+ATOM   4927 O O   . PRO B 1 315 ? 7.156   14.236  65.288  1.00 30.66 ? ? ? ? ? ? 805 PRO B O   1 
+ATOM   4928 C CB  . PRO B 1 315 ? 4.046   15.080  65.997  1.00 27.28 ? ? ? ? ? ? 805 PRO B CB  1 
+ATOM   4929 C CG  . PRO B 1 315 ? 3.126   15.841  66.888  1.00 27.38 ? ? ? ? ? ? 805 PRO B CG  1 
+ATOM   4930 C CD  . PRO B 1 315 ? 3.822   17.171  67.012  1.00 26.60 ? ? ? ? ? ? 805 PRO B CD  1 
+ATOM   4931 N N   . GLY B 1 316 ? 6.596   16.306  64.548  1.00 31.03 ? ? ? ? ? ? 806 GLY B N   1 
+ATOM   4932 C CA  . GLY B 1 316 ? 7.527   16.275  63.434  1.00 32.01 ? ? ? ? ? ? 806 GLY B CA  1 
+ATOM   4933 C C   . GLY B 1 316 ? 8.925   16.603  63.871  1.00 32.94 ? ? ? ? ? ? 806 GLY B C   1 
+ATOM   4934 O O   . GLY B 1 316 ? 9.890   16.026  63.361  1.00 34.39 ? ? ? ? ? ? 806 GLY B O   1 
+ATOM   4935 N N   . THR B 1 317 ? 9.028   17.481  64.862  1.00 32.98 ? ? ? ? ? ? 807 THR B N   1 
+ATOM   4936 C CA  . THR B 1 317 ? 10.317  17.915  65.374  1.00 33.29 ? ? ? ? ? ? 807 THR B CA  1 
+ATOM   4937 C C   . THR B 1 317 ? 10.863  17.024  66.486  1.00 32.68 ? ? ? ? ? ? 807 THR B C   1 
+ATOM   4938 O O   . THR B 1 317 ? 12.078  16.842  66.573  1.00 32.75 ? ? ? ? ? ? 807 THR B O   1 
+ATOM   4939 C CB  . THR B 1 317 ? 10.235  19.380  65.855  1.00 34.33 ? ? ? ? ? ? 807 THR B CB  1 
+ATOM   4940 O OG1 . THR B 1 317 ? 9.711   20.191  64.794  1.00 35.43 ? ? ? ? ? ? 807 THR B OG1 1 
+ATOM   4941 C CG2 . THR B 1 317 ? 11.613  19.913  66.263  1.00 34.66 ? ? ? ? ? ? 807 THR B CG2 1 
+ATOM   4942 N N   . PHE B 1 318 ? 9.971   16.483  67.324  1.00 31.92 ? ? ? ? ? ? 808 PHE B N   1 
+ATOM   4943 C CA  . PHE B 1 318 ? 10.337  15.587  68.444  1.00 31.68 ? ? ? ? ? ? 808 PHE B CA  1 
+ATOM   4944 C C   . PHE B 1 318 ? 9.609   14.276  68.259  1.00 31.40 ? ? ? ? ? ? 808 PHE B C   1 
+ATOM   4945 O O   . PHE B 1 318 ? 8.563   14.043  68.865  1.00 30.57 ? ? ? ? ? ? 808 PHE B O   1 
+ATOM   4946 C CB  . PHE B 1 318 ? 9.911   16.149  69.811  1.00 31.77 ? ? ? ? ? ? 808 PHE B CB  1 
+ATOM   4947 C CG  . PHE B 1 318 ? 10.411  17.514  70.081  1.00 31.96 ? ? ? ? ? ? 808 PHE B CG  1 
+ATOM   4948 C CD1 . PHE B 1 318 ? 11.698  17.707  70.552  1.00 31.92 ? ? ? ? ? ? 808 PHE B CD1 1 
+ATOM   4949 C CD2 . PHE B 1 318 ? 9.605   18.621  69.827  1.00 32.32 ? ? ? ? ? ? 808 PHE B CD2 1 
+ATOM   4950 C CE1 . PHE B 1 318 ? 12.182  18.994  70.765  1.00 32.91 ? ? ? ? ? ? 808 PHE B CE1 1 
+ATOM   4951 C CE2 . PHE B 1 318 ? 10.077  19.905  70.037  1.00 32.92 ? ? ? ? ? ? 808 PHE B CE2 1 
+ATOM   4952 C CZ  . PHE B 1 318 ? 11.370  20.099  70.506  1.00 32.77 ? ? ? ? ? ? 808 PHE B CZ  1 
+ATOM   4953 N N   . PRO B 1 319 ? 10.136  13.403  67.398  1.00 32.31 ? ? ? ? ? ? 809 PRO B N   1 
+ATOM   4954 C CA  . PRO B 1 319 ? 9.504   12.104  67.148  1.00 32.09 ? ? ? ? ? ? 809 PRO B CA  1 
+ATOM   4955 C C   . PRO B 1 319 ? 9.267   11.323  68.451  1.00 31.24 ? ? ? ? ? ? 809 PRO B C   1 
+ATOM   4956 O O   . PRO B 1 319 ? 10.145  11.253  69.324  1.00 31.30 ? ? ? ? ? ? 809 PRO B O   1 
+ATOM   4957 C CB  . PRO B 1 319 ? 10.522  11.407  66.239  1.00 32.94 ? ? ? ? ? ? 809 PRO B CB  1 
+ATOM   4958 C CG  . PRO B 1 319 ? 11.161  12.560  65.492  1.00 33.18 ? ? ? ? ? ? 809 PRO B CG  1 
+ATOM   4959 C CD  . PRO B 1 319 ? 11.362  13.569  66.591  1.00 32.99 ? ? ? ? ? ? 809 PRO B CD  1 
+ATOM   4960 N N   . GLY B 1 320 ? 8.071   10.755  68.576  1.00 30.21 ? ? ? ? ? ? 810 GLY B N   1 
+ATOM   4961 C CA  . GLY B 1 320 ? 7.739   10.007  69.771  1.00 29.70 ? ? ? ? ? ? 810 GLY B CA  1 
+ATOM   4962 C C   . GLY B 1 320 ? 7.009   10.834  70.821  1.00 29.12 ? ? ? ? ? ? 810 GLY B C   1 
+ATOM   4963 O O   . GLY B 1 320 ? 6.656   10.304  71.874  1.00 29.39 ? ? ? ? ? ? 810 GLY B O   1 
+ATOM   4964 N N   . TYR B 1 321 ? 6.803   12.125  70.553  1.00 26.89 ? ? ? ? ? ? 811 TYR B N   1 
+ATOM   4965 C CA  . TYR B 1 321 ? 6.101   13.017  71.467  1.00 24.69 ? ? ? ? ? ? 811 TYR B CA  1 
+ATOM   4966 C C   . TYR B 1 321 ? 4.884   13.623  70.765  1.00 23.98 ? ? ? ? ? ? 811 TYR B C   1 
+ATOM   4967 O O   . TYR B 1 321 ? 4.852   13.732  69.541  1.00 24.55 ? ? ? ? ? ? 811 TYR B O   1 
+ATOM   4968 C CB  . TYR B 1 321 ? 7.022   14.139  71.912  1.00 24.94 ? ? ? ? ? ? 811 TYR B CB  1 
+ATOM   4969 C CG  . TYR B 1 321 ? 8.024   13.720  72.937  1.00 26.32 ? ? ? ? ? ? 811 TYR B CG  1 
+ATOM   4970 C CD1 . TYR B 1 321 ? 9.213   13.124  72.558  1.00 28.16 ? ? ? ? ? ? 811 TYR B CD1 1 
+ATOM   4971 C CD2 . TYR B 1 321 ? 7.788   13.912  74.287  1.00 26.95 ? ? ? ? ? ? 811 TYR B CD2 1 
+ATOM   4972 C CE1 . TYR B 1 321 ? 10.151  12.721  73.500  1.00 29.23 ? ? ? ? ? ? 811 TYR B CE1 1 
+ATOM   4973 C CE2 . TYR B 1 321 ? 8.716   13.515  75.237  1.00 28.37 ? ? ? ? ? ? 811 TYR B CE2 1 
+ATOM   4974 C CZ  . TYR B 1 321 ? 9.898   12.916  74.841  1.00 29.23 ? ? ? ? ? ? 811 TYR B CZ  1 
+ATOM   4975 O OH  . TYR B 1 321 ? 10.828  12.478  75.774  1.00 31.35 ? ? ? ? ? ? 811 TYR B OH  1 
+ATOM   4976 N N   . GLY B 1 322 ? 3.895   14.043  71.541  1.00 21.75 ? ? ? ? ? ? 812 GLY B N   1 
+ATOM   4977 C CA  . GLY B 1 322 ? 2.717   14.635  70.956  1.00 19.68 ? ? ? ? ? ? 812 GLY B CA  1 
+ATOM   4978 C C   . GLY B 1 322 ? 1.759   15.171  71.995  1.00 17.54 ? ? ? ? ? ? 812 GLY B C   1 
+ATOM   4979 O O   . GLY B 1 322 ? 2.151   15.426  73.141  1.00 16.68 ? ? ? ? ? ? 812 GLY B O   1 
+ATOM   4980 N N   . ASN B 1 323 ? 0.522   15.408  71.552  1.00 17.30 ? ? ? ? ? ? 813 ASN B N   1 
+ATOM   4981 C CA  . ASN B 1 323 ? -0.588  15.922  72.373  1.00 17.61 ? ? ? ? ? ? 813 ASN B CA  1 
+ATOM   4982 C C   . ASN B 1 323 ? -0.136  16.941  73.398  1.00 16.29 ? ? ? ? ? ? 813 ASN B C   1 
+ATOM   4983 O O   . ASN B 1 323 ? -0.463  16.823  74.577  1.00 15.44 ? ? ? ? ? ? 813 ASN B O   1 
+ATOM   4984 C CB  . ASN B 1 323 ? -1.273  14.747  73.061  1.00 20.42 ? ? ? ? ? ? 813 ASN B CB  1 
+ATOM   4985 C CG  . ASN B 1 323 ? -1.817  13.734  72.059  1.00 23.17 ? ? ? ? ? ? 813 ASN B CG  1 
+ATOM   4986 O OD1 . ASN B 1 323 ? -1.592  12.535  72.201  1.00 26.16 ? ? ? ? ? ? 813 ASN B OD1 1 
+ATOM   4987 N ND2 . ASN B 1 323 ? -2.488  14.218  71.012  1.00 24.03 ? ? ? ? ? ? 813 ASN B ND2 1 
+ATOM   4988 N N   . PRO B 1 324 ? 0.433   18.070  72.921  1.00 14.90 ? ? ? ? ? ? 814 PRO B N   1 
+ATOM   4989 C CA  . PRO B 1 324 ? 0.954   19.122  73.798  1.00 13.23 ? ? ? ? ? ? 814 PRO B CA  1 
+ATOM   4990 C C   . PRO B 1 324 ? 0.083   20.288  74.245  1.00 11.85 ? ? ? ? ? ? 814 PRO B C   1 
+ATOM   4991 O O   . PRO B 1 324 ? 0.526   21.079  75.081  1.00 11.52 ? ? ? ? ? ? 814 PRO B O   1 
+ATOM   4992 C CB  . PRO B 1 324 ? 2.133   19.685  72.965  1.00 13.04 ? ? ? ? ? ? 814 PRO B CB  1 
+ATOM   4993 C CG  . PRO B 1 324 ? 2.069   18.949  71.596  1.00 13.90 ? ? ? ? ? ? 814 PRO B CG  1 
+ATOM   4994 C CD  . PRO B 1 324 ? 0.665   18.434  71.511  1.00 14.00 ? ? ? ? ? ? 814 PRO B CD  1 
+ATOM   4995 N N   . LEU B 1 325 ? -1.148  20.360  73.735  1.00 11.48 ? ? ? ? ? ? 815 LEU B N   1 
+ATOM   4996 C CA  . LEU B 1 325 ? -2.004  21.525  73.935  1.00 11.95 ? ? ? ? ? ? 815 LEU B CA  1 
+ATOM   4997 C C   . LEU B 1 325 ? -3.287  21.353  74.752  1.00 12.39 ? ? ? ? ? ? 815 LEU B C   1 
+ATOM   4998 O O   . LEU B 1 325 ? -3.541  20.290  75.290  1.00 12.46 ? ? ? ? ? ? 815 LEU B O   1 
+ATOM   4999 C CB  . LEU B 1 325 ? -2.255  22.173  72.539  1.00 12.42 ? ? ? ? ? ? 815 LEU B CB  1 
+ATOM   5000 C CG  . LEU B 1 325 ? -0.948  22.398  71.733  1.00 12.81 ? ? ? ? ? ? 815 LEU B CG  1 
+ATOM   5001 C CD1 . LEU B 1 325 ? -1.218  22.657  70.227  1.00 12.19 ? ? ? ? ? ? 815 LEU B CD1 1 
+ATOM   5002 C CD2 . LEU B 1 325 ? -0.123  23.501  72.377  1.00 12.72 ? ? ? ? ? ? 815 LEU B CD2 1 
+ATOM   5003 N N   . ILE B 1 326 ? -4.102  22.399  74.830  1.00 12.45 ? ? ? ? ? ? 816 ILE B N   1 
+ATOM   5004 C CA  . ILE B 1 326 ? -5.288  22.344  75.700  1.00 12.32 ? ? ? ? ? ? 816 ILE B CA  1 
+ATOM   5005 C C   . ILE B 1 326 ? -6.593  21.766  75.170  1.00 13.12 ? ? ? ? ? ? 816 ILE B C   1 
+ATOM   5006 O O   . ILE B 1 326 ? -7.504  21.516  75.958  1.00 12.16 ? ? ? ? ? ? 816 ILE B O   1 
+ATOM   5007 C CB  . ILE B 1 326 ? -5.505  23.674  76.426  1.00 11.35 ? ? ? ? ? ? 816 ILE B CB  1 
+ATOM   5008 C CG1 . ILE B 1 326 ? -5.921  24.777  75.442  1.00 11.75 ? ? ? ? ? ? 816 ILE B CG1 1 
+ATOM   5009 C CG2 . ILE B 1 326 ? -4.204  24.049  77.156  1.00 11.91 ? ? ? ? ? ? 816 ILE B CG2 1 
+ATOM   5010 C CD1 . ILE B 1 326 ? -6.129  26.135  76.091  1.00 11.96 ? ? ? ? ? ? 816 ILE B CD1 1 
+ATOM   5011 N N   . TYR B 1 327 ? -6.705  21.629  73.845  1.00 12.59 ? ? ? ? ? ? 817 TYR B N   1 
+ATOM   5012 C CA  . TYR B 1 327 ? -7.879  21.021  73.200  1.00 13.02 ? ? ? ? ? ? 817 TYR B CA  1 
+ATOM   5013 C C   . TYR B 1 327 ? -7.342  19.823  72.445  1.00 13.70 ? ? ? ? ? ? 817 TYR B C   1 
+ATOM   5014 O O   . TYR B 1 327 ? -6.225  19.879  71.917  1.00 13.00 ? ? ? ? ? ? 817 TYR B O   1 
+ATOM   5015 C CB  . TYR B 1 327 ? -8.554  21.954  72.183  1.00 11.95 ? ? ? ? ? ? 817 TYR B CB  1 
+ATOM   5016 C CG  . TYR B 1 327 ? -9.378  23.065  72.777  1.00 12.46 ? ? ? ? ? ? 817 TYR B CG  1 
+ATOM   5017 C CD1 . TYR B 1 327 ? -8.806  24.283  73.106  1.00 12.87 ? ? ? ? ? ? 817 TYR B CD1 1 
+ATOM   5018 C CD2 . TYR B 1 327 ? -10.738 22.916  72.975  1.00 13.28 ? ? ? ? ? ? 817 TYR B CD2 1 
+ATOM   5019 C CE1 . TYR B 1 327 ? -9.566  25.330  73.613  1.00 14.08 ? ? ? ? ? ? 817 TYR B CE1 1 
+ATOM   5020 C CE2 . TYR B 1 327 ? -11.519 23.965  73.485  1.00 14.49 ? ? ? ? ? ? 817 TYR B CE2 1 
+ATOM   5021 C CZ  . TYR B 1 327 ? -10.922 25.169  73.800  1.00 14.41 ? ? ? ? ? ? 817 TYR B CZ  1 
+ATOM   5022 O OH  . TYR B 1 327 ? -11.678 26.214  74.293  1.00 17.30 ? ? ? ? ? ? 817 TYR B OH  1 
+ATOM   5023 N N   . ASP B 1 328 ? -8.104  18.728  72.381  1.00 14.85 ? ? ? ? ? ? 818 ASP B N   1 
+ATOM   5024 C CA  . ASP B 1 328 ? -7.616  17.563  71.643  1.00 16.43 ? ? ? ? ? ? 818 ASP B CA  1 
+ATOM   5025 C C   . ASP B 1 328 ? -7.846  17.760  70.130  1.00 16.31 ? ? ? ? ? ? 818 ASP B C   1 
+ATOM   5026 O O   . ASP B 1 328 ? -8.350  18.805  69.716  1.00 15.53 ? ? ? ? ? ? 818 ASP B O   1 
+ATOM   5027 C CB  . ASP B 1 328 ? -8.186  16.235  72.200  1.00 18.38 ? ? ? ? ? ? 818 ASP B CB  1 
+ATOM   5028 C CG  . ASP B 1 328 ? -9.694  16.070  71.981  1.00 21.65 ? ? ? ? ? ? 818 ASP B CG  1 
+ATOM   5029 O OD1 . ASP B 1 328 ? -10.273 16.729  71.090  1.00 21.34 ? ? ? ? ? ? 818 ASP B OD1 1 
+ATOM   5030 O OD2 . ASP B 1 328 ? -10.320 15.247  72.704  1.00 22.85 ? ? ? ? ? ? 818 ASP B OD2 1 
+ATOM   5031 N N   . SER B 1 329 ? -7.494  16.775  69.314  1.00 17.84 ? ? ? ? ? ? 819 SER B N   1 
+ATOM   5032 C CA  . SER B 1 329 ? -7.662  16.894  67.858  1.00 20.05 ? ? ? ? ? ? 819 SER B CA  1 
+ATOM   5033 C C   . SER B 1 329 ? -9.087  16.963  67.328  1.00 19.93 ? ? ? ? ? ? 819 SER B C   1 
+ATOM   5034 O O   . SER B 1 329 ? -9.294  17.194  66.153  1.00 20.99 ? ? ? ? ? ? 819 SER B O   1 
+ATOM   5035 C CB  . SER B 1 329 ? -6.882  15.795  67.147  1.00 21.39 ? ? ? ? ? ? 819 SER B CB  1 
+ATOM   5036 O OG  . SER B 1 329 ? -7.140  14.537  67.749  1.00 24.71 ? ? ? ? ? ? 819 SER B OG  1 
+ATOM   5037 N N   . ASN B 1 330 ? -10.069 16.758  68.197  1.00 21.12 ? ? ? ? ? ? 820 ASN B N   1 
+ATOM   5038 C CA  . ASN B 1 330 ? -11.488 16.839  67.829  1.00 22.22 ? ? ? ? ? ? 820 ASN B CA  1 
+ATOM   5039 C C   . ASN B 1 330 ? -12.129 18.084  68.452  1.00 21.08 ? ? ? ? ? ? 820 ASN B C   1 
+ATOM   5040 O O   . ASN B 1 330 ? -13.359 18.221  68.466  1.00 22.16 ? ? ? ? ? ? 820 ASN B O   1 
+ATOM   5041 C CB  . ASN B 1 330 ? -12.253 15.598  68.320  1.00 25.06 ? ? ? ? ? ? 820 ASN B CB  1 
+ATOM   5042 C CG  . ASN B 1 330 ? -11.766 14.302  67.670  1.00 27.40 ? ? ? ? ? ? 820 ASN B CG  1 
+ATOM   5043 O OD1 . ASN B 1 330 ? -11.707 14.190  66.445  1.00 29.11 ? ? ? ? ? ? 820 ASN B OD1 1 
+ATOM   5044 N ND2 . ASN B 1 330 ? -11.420 13.310  68.499  1.00 29.44 ? ? ? ? ? ? 820 ASN B ND2 1 
+ATOM   5045 N N   . TYR B 1 331 ? -11.291 18.988  68.967  1.00 19.08 ? ? ? ? ? ? 821 TYR B N   1 
+ATOM   5046 C CA  . TYR B 1 331 ? -11.729 20.226  69.622  1.00 18.23 ? ? ? ? ? ? 821 TYR B CA  1 
+ATOM   5047 C C   . TYR B 1 331 ? -12.476 20.047  70.959  1.00 18.48 ? ? ? ? ? ? 821 TYR B C   1 
+ATOM   5048 O O   . TYR B 1 331 ? -13.281 20.892  71.362  1.00 17.31 ? ? ? ? ? ? 821 TYR B O   1 
+ATOM   5049 C CB  . TYR B 1 331 ? -12.497 21.139  68.654  1.00 17.94 ? ? ? ? ? ? 821 TYR B CB  1 
+ATOM   5050 C CG  . TYR B 1 331 ? -11.631 21.643  67.517  1.00 18.24 ? ? ? ? ? ? 821 TYR B CG  1 
+ATOM   5051 C CD1 . TYR B 1 331 ? -10.721 22.692  67.716  1.00 17.86 ? ? ? ? ? ? 821 TYR B CD1 1 
+ATOM   5052 C CD2 . TYR B 1 331 ? -11.696 21.053  66.242  1.00 18.01 ? ? ? ? ? ? 821 TYR B CD2 1 
+ATOM   5053 C CE1 . TYR B 1 331 ? -9.897  23.143  66.667  1.00 17.54 ? ? ? ? ? ? 821 TYR B CE1 1 
+ATOM   5054 C CE2 . TYR B 1 331 ? -10.872 21.493  65.193  1.00 17.47 ? ? ? ? ? ? 821 TYR B CE2 1 
+ATOM   5055 C CZ  . TYR B 1 331 ? -9.982  22.540  65.427  1.00 17.99 ? ? ? ? ? ? 821 TYR B CZ  1 
+ATOM   5056 O OH  . TYR B 1 331 ? -9.181  22.995  64.420  1.00 18.19 ? ? ? ? ? ? 821 TYR B OH  1 
+ATOM   5057 N N   . ASN B 1 332 ? -12.185 18.943  71.650  1.00 18.75 ? ? ? ? ? ? 822 ASN B N   1 
+ATOM   5058 C CA  . ASN B 1 332 ? -12.779 18.709  72.975  1.00 19.28 ? ? ? ? ? ? 822 ASN B CA  1 
+ATOM   5059 C C   . ASN B 1 332 ? -11.754 19.255  73.981  1.00 17.43 ? ? ? ? ? ? 822 ASN B C   1 
+ATOM   5060 O O   . ASN B 1 332 ? -10.556 18.973  73.854  1.00 17.13 ? ? ? ? ? ? 822 ASN B O   1 
+ATOM   5061 C CB  . ASN B 1 332 ? -12.917 17.200  73.285  1.00 21.82 ? ? ? ? ? ? 822 ASN B CB  1 
+ATOM   5062 C CG  . ASN B 1 332 ? -13.819 16.452  72.315  1.00 24.37 ? ? ? ? ? ? 822 ASN B CG  1 
+ATOM   5063 O OD1 . ASN B 1 332 ? -14.943 16.859  72.065  1.00 25.89 ? ? ? ? ? ? 822 ASN B OD1 1 
+ATOM   5064 N ND2 . ASN B 1 332 ? -13.328 15.324  71.792  1.00 26.55 ? ? ? ? ? ? 822 ASN B ND2 1 
+ATOM   5065 N N   . PRO B 1 333 ? -12.198 20.026  74.996  1.00 17.57 ? ? ? ? ? ? 823 PRO B N   1 
+ATOM   5066 C CA  . PRO B 1 333 ? -11.224 20.539  75.982  1.00 17.11 ? ? ? ? ? ? 823 PRO B CA  1 
+ATOM   5067 C C   . PRO B 1 333 ? -10.587 19.365  76.757  1.00 17.01 ? ? ? ? ? ? 823 PRO B C   1 
+ATOM   5068 O O   . PRO B 1 333 ? -11.275 18.399  77.153  1.00 17.73 ? ? ? ? ? ? 823 PRO B O   1 
+ATOM   5069 C CB  . PRO B 1 333 ? -12.087 21.355  76.953  1.00 17.95 ? ? ? ? ? ? 823 PRO B CB  1 
+ATOM   5070 C CG  . PRO B 1 333 ? -13.306 21.729  76.149  1.00 19.34 ? ? ? ? ? ? 823 PRO B CG  1 
+ATOM   5071 C CD  . PRO B 1 333 ? -13.566 20.505  75.288  1.00 18.84 ? ? ? ? ? ? 823 PRO B CD  1 
+ATOM   5072 N N   . LYS B 1 334 ? -9.278  19.426  76.925  1.00 14.87 ? ? ? ? ? ? 824 LYS B N   1 
+ATOM   5073 C CA  . LYS B 1 334 ? -8.536  18.431  77.675  1.00 13.87 ? ? ? ? ? ? 824 LYS B CA  1 
+ATOM   5074 C C   . LYS B 1 334 ? -8.486  18.897  79.151  1.00 13.32 ? ? ? ? ? ? 824 LYS B C   1 
+ATOM   5075 O O   . LYS B 1 334 ? -8.876  20.028  79.486  1.00 12.53 ? ? ? ? ? ? 824 LYS B O   1 
+ATOM   5076 C CB  . LYS B 1 334 ? -7.120  18.347  77.084  1.00 13.22 ? ? ? ? ? ? 824 LYS B CB  1 
+ATOM   5077 C CG  . LYS B 1 334 ? -7.124  17.753  75.712  1.00 14.11 ? ? ? ? ? ? 824 LYS B CG  1 
+ATOM   5078 C CD  . LYS B 1 334 ? -5.809  17.909  74.982  1.00 14.34 ? ? ? ? ? ? 824 LYS B CD  1 
+ATOM   5079 C CE  . LYS B 1 334 ? -4.653  17.378  75.786  1.00 14.18 ? ? ? ? ? ? 824 LYS B CE  1 
+ATOM   5080 N NZ  . LYS B 1 334 ? -3.327  17.574  75.095  1.00 13.36 ? ? ? ? ? ? 824 LYS B NZ  1 
+ATOM   5081 N N   . PRO B 1 335 ? -8.014  18.030  80.058  1.00 13.35 ? ? ? ? ? ? 825 PRO B N   1 
+ATOM   5082 C CA  . PRO B 1 335 ? -7.949  18.467  81.461  1.00 13.21 ? ? ? ? ? ? 825 PRO B CA  1 
+ATOM   5083 C C   . PRO B 1 335 ? -7.157  19.795  81.597  1.00 13.10 ? ? ? ? ? ? 825 PRO B C   1 
+ATOM   5084 O O   . PRO B 1 335 ? -7.528  20.660  82.400  1.00 13.72 ? ? ? ? ? ? 825 PRO B O   1 
+ATOM   5085 C CB  . PRO B 1 335 ? -7.209  17.306  82.143  1.00 13.95 ? ? ? ? ? ? 825 PRO B CB  1 
+ATOM   5086 C CG  . PRO B 1 335 ? -7.699  16.129  81.392  1.00 14.41 ? ? ? ? ? ? 825 PRO B CG  1 
+ATOM   5087 C CD  . PRO B 1 335 ? -7.685  16.600  79.929  1.00 13.57 ? ? ? ? ? ? 825 PRO B CD  1 
+ATOM   5088 N N   . ALA B 1 336 ? -6.107  19.974  80.787  1.00 11.95 ? ? ? ? ? ? 826 ALA B N   1 
+ATOM   5089 C CA  . ALA B 1 336 ? -5.297  21.194  80.843  1.00 12.05 ? ? ? ? ? ? 826 ALA B CA  1 
+ATOM   5090 C C   . ALA B 1 336 ? -6.130  22.475  80.691  1.00 12.16 ? ? ? ? ? ? 826 ALA B C   1 
+ATOM   5091 O O   . ALA B 1 336 ? -5.827  23.490  81.340  1.00 12.66 ? ? ? ? ? ? 826 ALA B O   1 
+ATOM   5092 C CB  . ALA B 1 336 ? -4.196  21.147  79.793  1.00 10.96 ? ? ? ? ? ? 826 ALA B CB  1 
+ATOM   5093 N N   . TYR B 1 337 ? -7.173  22.434  79.847  1.00 11.91 ? ? ? ? ? ? 827 TYR B N   1 
+ATOM   5094 C CA  . TYR B 1 337 ? -8.040  23.605  79.645  1.00 12.80 ? ? ? ? ? ? 827 TYR B CA  1 
+ATOM   5095 C C   . TYR B 1 337 ? -8.729  24.038  80.954  1.00 13.40 ? ? ? ? ? ? 827 TYR B C   1 
+ATOM   5096 O O   . TYR B 1 337 ? -8.669  25.208  81.352  1.00 13.91 ? ? ? ? ? ? 827 TYR B O   1 
+ATOM   5097 C CB  . TYR B 1 337 ? -9.085  23.324  78.544  1.00 12.99 ? ? ? ? ? ? 827 TYR B CB  1 
+ATOM   5098 C CG  . TYR B 1 337 ? -10.097 24.434  78.341  1.00 13.59 ? ? ? ? ? ? 827 TYR B CG  1 
+ATOM   5099 C CD1 . TYR B 1 337 ? -11.264 24.495  79.111  1.00 13.68 ? ? ? ? ? ? 827 TYR B CD1 1 
+ATOM   5100 C CD2 . TYR B 1 337 ? -9.880  25.455  77.390  1.00 13.71 ? ? ? ? ? ? 827 TYR B CD2 1 
+ATOM   5101 C CE1 . TYR B 1 337 ? -12.182 25.538  78.953  1.00 14.46 ? ? ? ? ? ? 827 TYR B CE1 1 
+ATOM   5102 C CE2 . TYR B 1 337 ? -10.809 26.517  77.223  1.00 13.60 ? ? ? ? ? ? 827 TYR B CE2 1 
+ATOM   5103 C CZ  . TYR B 1 337 ? -11.953 26.557  78.005  1.00 14.52 ? ? ? ? ? ? 827 TYR B CZ  1 
+ATOM   5104 O OH  . TYR B 1 337 ? -12.855 27.601  77.862  1.00 14.77 ? ? ? ? ? ? 827 TYR B OH  1 
+ATOM   5105 N N   . ASN B 1 338 ? -9.349  23.065  81.633  1.00 14.50 ? ? ? ? ? ? 828 ASN B N   1 
+ATOM   5106 C CA  . ASN B 1 338 ? -10.047 23.304  82.893  1.00 15.11 ? ? ? ? ? ? 828 ASN B CA  1 
+ATOM   5107 C C   . ASN B 1 338 ? -9.089  23.745  83.996  1.00 13.45 ? ? ? ? ? ? 828 ASN B C   1 
+ATOM   5108 O O   . ASN B 1 338 ? -9.409  24.659  84.776  1.00 15.04 ? ? ? ? ? ? 828 ASN B O   1 
+ATOM   5109 C CB  . ASN B 1 338 ? -10.786 22.026  83.327  1.00 16.82 ? ? ? ? ? ? 828 ASN B CB  1 
+ATOM   5110 C CG  . ASN B 1 338 ? -11.837 21.582  82.301  1.00 18.57 ? ? ? ? ? ? 828 ASN B CG  1 
+ATOM   5111 O OD1 . ASN B 1 338 ? -12.602 22.410  81.802  1.00 20.27 ? ? ? ? ? ? 828 ASN B OD1 1 
+ATOM   5112 N ND2 . ASN B 1 338 ? -11.851 20.293  81.961  1.00 18.96 ? ? ? ? ? ? 828 ASN B ND2 1 
+ATOM   5113 N N   . ALA B 1 339 ? -7.907  23.126  84.028  1.00 13.06 ? ? ? ? ? ? 829 ALA B N   1 
+ATOM   5114 C CA  . ALA B 1 339 ? -6.880  23.438  85.023  1.00 13.63 ? ? ? ? ? ? 829 ALA B CA  1 
+ATOM   5115 C C   . ALA B 1 339 ? -6.400  24.920  84.955  1.00 15.02 ? ? ? ? ? ? 829 ALA B C   1 
+ATOM   5116 O O   . ALA B 1 339 ? -6.244  25.590  85.985  1.00 15.49 ? ? ? ? ? ? 829 ALA B O   1 
+ATOM   5117 C CB  . ALA B 1 339 ? -5.733  22.492  84.885  1.00 13.76 ? ? ? ? ? ? 829 ALA B CB  1 
+ATOM   5118 N N   . ILE B 1 340 ? -6.211  25.446  83.740  1.00 14.74 ? ? ? ? ? ? 830 ILE B N   1 
+ATOM   5119 C CA  . ILE B 1 340 ? -5.801  26.835  83.573  1.00 14.70 ? ? ? ? ? ? 830 ILE B CA  1 
+ATOM   5120 C C   . ILE B 1 340 ? -6.945  27.727  84.041  1.00 14.57 ? ? ? ? ? ? 830 ILE B C   1 
+ATOM   5121 O O   . ILE B 1 340 ? -6.729  28.709  84.761  1.00 15.31 ? ? ? ? ? ? 830 ILE B O   1 
+ATOM   5122 C CB  . ILE B 1 340 ? -5.508  27.167  82.097  1.00 14.89 ? ? ? ? ? ? 830 ILE B CB  1 
+ATOM   5123 C CG1 . ILE B 1 340 ? -4.290  26.391  81.605  1.00 15.56 ? ? ? ? ? ? 830 ILE B CG1 1 
+ATOM   5124 C CG2 . ILE B 1 340 ? -5.310  28.682  81.932  1.00 15.58 ? ? ? ? ? ? 830 ILE B CG2 1 
+ATOM   5125 C CD1 . ILE B 1 340 ? -4.022  26.563  80.130  1.00 14.61 ? ? ? ? ? ? 830 ILE B CD1 1 
+ATOM   5126 N N   . LYS B 1 341 ? -8.166  27.375  83.634  1.00 16.73 ? ? ? ? ? ? 831 LYS B N   1 
+ATOM   5127 C CA  . LYS B 1 341 ? -9.343  28.131  84.025  1.00 19.33 ? ? ? ? ? ? 831 LYS B CA  1 
+ATOM   5128 C C   . LYS B 1 341 ? -9.486  28.174  85.547  1.00 20.65 ? ? ? ? ? ? 831 LYS B C   1 
+ATOM   5129 O O   . LYS B 1 341 ? -9.744  29.232  86.119  1.00 20.20 ? ? ? ? ? ? 831 LYS B O   1 
+ATOM   5130 C CB  . LYS B 1 341 ? -10.602 27.569  83.374  1.00 20.56 ? ? ? ? ? ? 831 LYS B CB  1 
+ATOM   5131 C CG  . LYS B 1 341 ? -11.751 28.543  83.488  1.00 23.03 ? ? ? ? ? ? 831 LYS B CG  1 
+ATOM   5132 C CD  . LYS B 1 341 ? -12.956 28.188  82.609  1.00 24.21 ? ? ? ? ? ? 831 LYS B CD  1 
+ATOM   5133 C CE  . LYS B 1 341 ? -12.799 28.652  81.144  1.00 24.55 ? ? ? ? ? ? 831 LYS B CE  1 
+ATOM   5134 N NZ  . LYS B 1 341 ? -14.046 28.359  80.388  1.00 23.63 ? ? ? ? ? ? 831 LYS B NZ  1 
+ATOM   5135 N N   . GLU B 1 342 ? -9.266  27.049  86.220  1.00 22.27 ? ? ? ? ? ? 832 GLU B N   1 
+ATOM   5136 C CA  . GLU B 1 342 ? -9.357  27.087  87.670  1.00 25.20 ? ? ? ? ? ? 832 GLU B CA  1 
+ATOM   5137 C C   . GLU B 1 342 ? -8.202  27.859  88.319  1.00 24.81 ? ? ? ? ? ? 832 GLU B C   1 
+ATOM   5138 O O   . GLU B 1 342 ? -8.416  28.507  89.341  1.00 25.44 ? ? ? ? ? ? 832 GLU B O   1 
+ATOM   5139 C CB  . GLU B 1 342 ? -9.578  25.711  88.288  1.00 29.12 ? ? ? ? ? ? 832 GLU B CB  1 
+ATOM   5140 C CG  . GLU B 1 342 ? -8.550  24.666  87.997  1.00 33.16 ? ? ? ? ? ? 832 GLU B CG  1 
+ATOM   5141 C CD  . GLU B 1 342 ? -9.028  23.279  88.451  1.00 36.14 ? ? ? ? ? ? 832 GLU B CD  1 
+ATOM   5142 O OE1 . GLU B 1 342 ? -10.268 23.039  88.437  1.00 38.01 ? ? ? ? ? ? 832 GLU B OE1 1 
+ATOM   5143 O OE2 . GLU B 1 342 ? -8.171  22.431  88.805  1.00 36.98 ? ? ? ? ? ? 832 GLU B OE2 1 
+ATOM   5144 N N   . ALA B 1 343 ? -7.001  27.842  87.729  1.00 22.57 ? ? ? ? ? ? 833 ALA B N   1 
+ATOM   5145 C CA  . ALA B 1 343 ? -5.900  28.642  88.277  1.00 22.13 ? ? ? ? ? ? 833 ALA B CA  1 
+ATOM   5146 C C   . ALA B 1 343 ? -6.281  30.149  88.190  1.00 22.23 ? ? ? ? ? ? 833 ALA B C   1 
+ATOM   5147 O O   . ALA B 1 343 ? -5.885  30.949  89.044  1.00 22.19 ? ? ? ? ? ? 833 ALA B O   1 
+ATOM   5148 C CB  . ALA B 1 343 ? -4.587  28.366  87.522  1.00 21.19 ? ? ? ? ? ? 833 ALA B CB  1 
+ATOM   5149 N N   . LEU B 1 344 ? -7.082  30.520  87.192  1.00 22.57 ? ? ? ? ? ? 834 LEU B N   1 
+ATOM   5150 C CA  . LEU B 1 344 ? -7.511  31.913  87.012  1.00 24.54 ? ? ? ? ? ? 834 LEU B CA  1 
+ATOM   5151 C C   . LEU B 1 344 ? -8.666  32.376  87.908  1.00 27.15 ? ? ? ? ? ? 834 LEU B C   1 
+ATOM   5152 O O   . LEU B 1 344 ? -8.841  33.574  88.111  1.00 26.87 ? ? ? ? ? ? 834 LEU B O   1 
+ATOM   5153 C CB  . LEU B 1 344 ? -7.858  32.195  85.544  1.00 23.15 ? ? ? ? ? ? 834 LEU B CB  1 
+ATOM   5154 C CG  . LEU B 1 344 ? -6.680  32.214  84.554  1.00 22.56 ? ? ? ? ? ? 834 LEU B CG  1 
+ATOM   5155 C CD1 . LEU B 1 344 ? -7.187  32.233  83.106  1.00 22.53 ? ? ? ? ? ? 834 LEU B CD1 1 
+ATOM   5156 C CD2 . LEU B 1 344 ? -5.782  33.414  84.863  1.00 22.42 ? ? ? ? ? ? 834 LEU B CD2 1 
+ATOM   5157 N N   . MET B 1 345 ? -9.470  31.439  88.403  1.00 30.86 ? ? ? ? ? ? 835 MET B N   1 
+ATOM   5158 C CA  . MET B 1 345 ? -10.607 31.776  89.272  1.00 35.01 ? ? ? ? ? ? 835 MET B CA  1 
+ATOM   5159 C C   . MET B 1 345 ? -10.230 31.951  90.757  1.00 37.17 ? ? ? ? ? ? 835 MET B C   1 
+ATOM   5160 O O   . MET B 1 345 ? -10.838 32.844  91.390  1.00 40.31 ? ? ? ? ? ? 835 MET B O   1 
+ATOM   5161 C CB  . MET B 1 345 ? -11.737 30.736  89.140  1.00 35.66 ? ? ? ? ? ? 835 MET B CB  1 
+ATOM   5162 C CG  . MET B 1 345 ? -12.433 30.741  87.801  1.00 37.03 ? ? ? ? ? ? 835 MET B CG  1 
+ATOM   5163 S SD  . MET B 1 345 ? -13.730 29.495  87.637  1.00 40.25 ? ? ? ? ? ? 835 MET B SD  1 
+ATOM   5164 C CE  . MET B 1 345 ? -12.842 27.973  87.858  1.00 39.14 ? ? ? ? ? ? 835 MET B CE  1 
+HETATM 5165 O O   . HOH C 2 .   ? 19.092  16.066  38.353  1.00 8.41  ? ? ? ? ? ? 1   HOH A O   1 
+HETATM 5166 O O   . HOH C 2 .   ? 16.547  15.324  37.747  1.00 10.99 ? ? ? ? ? ? 2   HOH A O   1 
+HETATM 5167 O O   . HOH C 2 .   ? 6.695   26.587  37.079  1.00 10.88 ? ? ? ? ? ? 3   HOH A O   1 
+HETATM 5168 O O   . HOH C 2 .   ? 21.016  14.368  27.070  1.00 9.39  ? ? ? ? ? ? 4   HOH A O   1 
+HETATM 5169 O O   . HOH C 2 .   ? 26.848  12.043  28.407  1.00 11.87 ? ? ? ? ? ? 5   HOH A O   1 
+HETATM 5170 O O   . HOH C 2 .   ? 16.554  18.864  24.735  1.00 10.02 ? ? ? ? ? ? 6   HOH A O   1 
+HETATM 5171 O O   . HOH C 2 .   ? 17.849  7.210   38.783  1.00 11.25 ? ? ? ? ? ? 7   HOH A O   1 
+HETATM 5172 O O   . HOH C 2 .   ? 22.442  31.746  41.652  1.00 10.49 ? ? ? ? ? ? 8   HOH A O   1 
+HETATM 5173 O O   . HOH C 2 .   ? 12.873  5.300   43.714  1.00 13.36 ? ? ? ? ? ? 9   HOH A O   1 
+HETATM 5174 O O   . HOH C 2 .   ? 28.212  23.884  21.381  1.00 12.39 ? ? ? ? ? ? 10  HOH A O   1 
+HETATM 5175 O O   . HOH C 2 .   ? 26.566  18.819  28.818  1.00 12.51 ? ? ? ? ? ? 11  HOH A O   1 
+HETATM 5176 O O   . HOH C 2 .   ? 12.060  21.152  29.865  1.00 11.47 ? ? ? ? ? ? 12  HOH A O   1 
+HETATM 5177 O O   . HOH C 2 .   ? 23.092  11.560  28.962  1.00 11.17 ? ? ? ? ? ? 13  HOH A O   1 
+HETATM 5178 O O   . HOH C 2 .   ? 4.780   26.137  30.520  1.00 13.73 ? ? ? ? ? ? 14  HOH A O   1 
+HETATM 5179 O O   . HOH C 2 .   ? 20.446  10.150  41.932  1.00 12.80 ? ? ? ? ? ? 15  HOH A O   1 
+HETATM 5180 O O   . HOH C 2 .   ? 4.726   16.351  33.332  1.00 13.00 ? ? ? ? ? ? 16  HOH A O   1 
+HETATM 5181 O O   . HOH C 2 .   ? 4.136   11.222  37.765  1.00 16.90 ? ? ? ? ? ? 17  HOH A O   1 
+HETATM 5182 O O   . HOH C 2 .   ? 15.499  20.594  54.780  1.00 24.58 ? ? ? ? ? ? 18  HOH A O   1 
+HETATM 5183 O O   . HOH C 2 .   ? 7.268   -9.116  44.308  1.00 29.35 ? ? ? ? ? ? 19  HOH A O   1 
+HETATM 5184 O O   . HOH C 2 .   ? 7.544   5.719   41.181  1.00 15.25 ? ? ? ? ? ? 20  HOH A O   1 
+HETATM 5185 O O   . HOH C 2 .   ? 13.538  17.088  54.162  1.00 14.09 ? ? ? ? ? ? 21  HOH A O   1 
+HETATM 5186 O O   . HOH C 2 .   ? 13.111  12.935  34.616  1.00 14.25 ? ? ? ? ? ? 22  HOH A O   1 
+HETATM 5187 O O   . HOH C 2 .   ? 20.604  10.554  28.677  1.00 14.46 ? ? ? ? ? ? 23  HOH A O   1 
+HETATM 5188 O O   . HOH C 2 .   ? 19.507  25.637  43.636  1.00 15.05 ? ? ? ? ? ? 24  HOH A O   1 
+HETATM 5189 O O   . HOH C 2 .   ? 15.385  35.310  42.122  1.00 14.26 ? ? ? ? ? ? 25  HOH A O   1 
+HETATM 5190 O O   . HOH C 2 .   ? 2.601   10.075  39.424  1.00 21.42 ? ? ? ? ? ? 26  HOH A O   1 
+HETATM 5191 O O   . HOH C 2 .   ? -0.118  12.637  38.816  1.00 21.59 ? ? ? ? ? ? 27  HOH A O   1 
+HETATM 5192 O O   . HOH C 2 .   ? 15.716  -12.816 48.256  1.00 20.09 ? ? ? ? ? ? 28  HOH A O   1 
+HETATM 5193 O O   . HOH C 2 .   ? 10.776  6.101   39.875  1.00 23.05 ? ? ? ? ? ? 29  HOH A O   1 
+HETATM 5194 O O   . HOH C 2 .   ? 8.907   8.721   56.594  1.00 18.76 ? ? ? ? ? ? 30  HOH A O   1 
+HETATM 5195 O O   . HOH C 2 .   ? 23.742  6.677   37.172  1.00 18.33 ? ? ? ? ? ? 31  HOH A O   1 
+HETATM 5196 O O   . HOH C 2 .   ? 18.178  11.281  52.509  1.00 21.24 ? ? ? ? ? ? 32  HOH A O   1 
+HETATM 5197 O O   . HOH C 2 .   ? 25.243  15.395  48.630  1.00 18.18 ? ? ? ? ? ? 33  HOH A O   1 
+HETATM 5198 O O   . HOH C 2 .   ? 20.716  35.408  30.200  1.00 19.39 ? ? ? ? ? ? 34  HOH A O   1 
+HETATM 5199 O O   . HOH C 2 .   ? -1.257  17.902  46.345  1.00 38.64 ? ? ? ? ? ? 35  HOH A O   1 
+HETATM 5200 O O   . HOH C 2 .   ? -1.323  15.788  45.629  1.00 17.53 ? ? ? ? ? ? 36  HOH A O   1 
+HETATM 5201 O O   . HOH C 2 .   ? 38.194  8.865   41.568  1.00 19.01 ? ? ? ? ? ? 37  HOH A O   1 
+HETATM 5202 O O   . HOH C 2 .   ? 39.358  19.261  39.040  1.00 18.54 ? ? ? ? ? ? 38  HOH A O   1 
+HETATM 5203 O O   . HOH C 2 .   ? 8.252   -7.125  39.541  1.00 37.34 ? ? ? ? ? ? 39  HOH A O   1 
+HETATM 5204 O O   . HOH C 2 .   ? 0.596   -2.149  51.896  1.00 20.47 ? ? ? ? ? ? 40  HOH A O   1 
+HETATM 5205 O O   . HOH C 2 .   ? 5.058   35.215  43.457  1.00 19.05 ? ? ? ? ? ? 41  HOH A O   1 
+HETATM 5206 O O   . HOH C 2 .   ? 32.964  3.818   43.801  1.00 20.97 ? ? ? ? ? ? 42  HOH A O   1 
+HETATM 5207 O O   . HOH C 2 .   ? 13.187  26.786  50.046  1.00 22.21 ? ? ? ? ? ? 43  HOH A O   1 
+HETATM 5208 O O   . HOH C 2 .   ? 21.565  -1.196  42.342  1.00 37.73 ? ? ? ? ? ? 44  HOH A O   1 
+HETATM 5209 O O   . HOH C 2 .   ? 20.869  1.321   43.607  1.00 20.34 ? ? ? ? ? ? 45  HOH A O   1 
+HETATM 5210 O O   . HOH C 2 .   ? 19.833  2.013   55.684  1.00 22.80 ? ? ? ? ? ? 46  HOH A O   1 
+HETATM 5211 O O   . HOH C 2 .   ? 20.435  14.846  53.291  1.00 20.43 ? ? ? ? ? ? 47  HOH A O   1 
+HETATM 5212 O O   . HOH C 2 .   ? 17.879  -3.555  40.884  1.00 20.82 ? ? ? ? ? ? 48  HOH A O   1 
+HETATM 5213 O O   . HOH C 2 .   ? 20.177  -0.969  39.757  1.00 40.33 ? ? ? ? ? ? 49  HOH A O   1 
+HETATM 5214 O O   . HOH C 2 .   ? 40.921  12.713  36.021  1.00 22.72 ? ? ? ? ? ? 50  HOH A O   1 
+HETATM 5215 O O   . HOH C 2 .   ? -6.127  14.921  38.193  1.00 22.03 ? ? ? ? ? ? 51  HOH A O   1 
+HETATM 5216 O O   . HOH C 2 .   ? 5.904   32.134  28.591  1.00 20.98 ? ? ? ? ? ? 52  HOH A O   1 
+HETATM 5217 O O   . HOH C 2 .   ? 19.425  31.579  20.062  1.00 20.63 ? ? ? ? ? ? 53  HOH A O   1 
+HETATM 5218 O O   . HOH C 2 .   ? -2.387  29.470  46.859  1.00 46.67 ? ? ? ? ? ? 54  HOH A O   1 
+HETATM 5219 O O   . HOH C 2 .   ? 3.159   29.874  49.502  1.00 36.83 ? ? ? ? ? ? 55  HOH A O   1 
+HETATM 5220 O O   . HOH C 2 .   ? 27.217  12.578  17.477  1.00 54.14 ? ? ? ? ? ? 56  HOH A O   1 
+HETATM 5221 O O   . HOH C 2 .   ? 7.481   -0.149  49.531  1.00 24.25 ? ? ? ? ? ? 57  HOH A O   1 
+HETATM 5222 O O   . HOH C 2 .   ? 28.883  15.229  18.637  1.00 23.58 ? ? ? ? ? ? 58  HOH A O   1 
+HETATM 5223 O O   . HOH C 2 .   ? 14.787  10.400  34.262  1.00 30.92 ? ? ? ? ? ? 59  HOH A O   1 
+HETATM 5224 O O   . HOH C 2 .   ? 2.668   25.328  28.877  1.00 20.67 ? ? ? ? ? ? 60  HOH A O   1 
+HETATM 5225 O O   . HOH C 2 .   ? -1.920  3.649   55.031  1.00 29.89 ? ? ? ? ? ? 61  HOH A O   1 
+HETATM 5226 O O   . HOH C 2 .   ? 13.056  34.213  48.924  1.00 20.61 ? ? ? ? ? ? 62  HOH A O   1 
+HETATM 5227 O O   . HOH C 2 .   ? 30.555  19.691  45.878  1.00 23.31 ? ? ? ? ? ? 63  HOH A O   1 
+HETATM 5228 O O   . HOH C 2 .   ? 9.726   -12.345 45.837  1.00 52.60 ? ? ? ? ? ? 64  HOH A O   1 
+HETATM 5229 O O   . HOH C 2 .   ? 11.462  14.594  30.550  1.00 20.10 ? ? ? ? ? ? 65  HOH A O   1 
+HETATM 5230 O O   . HOH C 2 .   ? 31.017  23.755  42.397  1.00 20.53 ? ? ? ? ? ? 66  HOH A O   1 
+HETATM 5231 O O   . HOH C 2 .   ? 34.275  20.969  45.124  1.00 62.40 ? ? ? ? ? ? 67  HOH A O   1 
+HETATM 5232 O O   . HOH C 2 .   ? -3.557  12.117  32.379  1.00 26.80 ? ? ? ? ? ? 68  HOH A O   1 
+HETATM 5233 O O   . HOH C 2 .   ? 24.422  37.005  35.363  1.00 24.42 ? ? ? ? ? ? 69  HOH A O   1 
+HETATM 5234 O O   . HOH C 2 .   ? 19.422  14.148  58.502  1.00 24.64 ? ? ? ? ? ? 70  HOH A O   1 
+HETATM 5235 O O   . HOH C 2 .   ? 28.709  4.427   49.649  1.00 31.62 ? ? ? ? ? ? 71  HOH A O   1 
+HETATM 5236 O O   . HOH C 2 .   ? -8.556  3.438   45.752  1.00 26.90 ? ? ? ? ? ? 72  HOH A O   1 
+HETATM 5237 O O   . HOH C 2 .   ? 8.436   37.602  38.187  1.00 24.69 ? ? ? ? ? ? 73  HOH A O   1 
+HETATM 5238 O O   . HOH C 2 .   ? 14.202  22.999  54.415  1.00 27.61 ? ? ? ? ? ? 74  HOH A O   1 
+HETATM 5239 O O   . HOH C 2 .   ? 22.776  5.728   39.031  1.00 33.26 ? ? ? ? ? ? 75  HOH A O   1 
+HETATM 5240 O O   . HOH C 2 .   ? 1.523   4.744   36.455  1.00 23.96 ? ? ? ? ? ? 76  HOH A O   1 
+HETATM 5241 O O   . HOH C 2 .   ? -1.746  21.683  45.895  1.00 48.37 ? ? ? ? ? ? 77  HOH A O   1 
+HETATM 5242 O O   . HOH C 2 .   ? 23.407  5.406   30.290  1.00 25.76 ? ? ? ? ? ? 78  HOH A O   1 
+HETATM 5243 O O   . HOH C 2 .   ? 7.093   -2.281  50.146  1.00 32.64 ? ? ? ? ? ? 79  HOH A O   1 
+HETATM 5244 O O   . HOH C 2 .   ? 33.930  3.884   32.329  1.00 30.08 ? ? ? ? ? ? 80  HOH A O   1 
+HETATM 5245 O O   . HOH C 2 .   ? 2.010   33.839  34.492  1.00 34.48 ? ? ? ? ? ? 81  HOH A O   1 
+HETATM 5246 O O   . HOH C 2 .   ? 29.362  32.016  23.290  1.00 47.11 ? ? ? ? ? ? 82  HOH A O   1 
+HETATM 5247 O O   . HOH C 2 .   ? 23.676  24.045  45.153  1.00 27.85 ? ? ? ? ? ? 83  HOH A O   1 
+HETATM 5248 O O   . HOH C 2 .   ? 21.703  16.882  15.491  1.00 26.92 ? ? ? ? ? ? 84  HOH A O   1 
+HETATM 5249 O O   . HOH C 2 .   ? 9.152   -10.205 47.883  1.00 26.01 ? ? ? ? ? ? 85  HOH A O   1 
+HETATM 5250 O O   . HOH C 2 .   ? 15.592  -2.231  36.166  1.00 53.96 ? ? ? ? ? ? 86  HOH A O   1 
+HETATM 5251 O O   . HOH C 2 .   ? 15.498  1.987   36.271  1.00 23.00 ? ? ? ? ? ? 87  HOH A O   1 
+HETATM 5252 O O   . HOH C 2 .   ? 39.603  6.631   33.944  1.00 27.66 ? ? ? ? ? ? 88  HOH A O   1 
+HETATM 5253 O O   . HOH C 2 .   ? 40.914  21.324  38.776  1.00 27.64 ? ? ? ? ? ? 89  HOH A O   1 
+HETATM 5254 O O   . HOH C 2 .   ? 12.162  25.478  52.725  1.00 44.31 ? ? ? ? ? ? 90  HOH A O   1 
+HETATM 5255 O O   . HOH C 2 .   ? 19.220  34.017  22.750  1.00 27.31 ? ? ? ? ? ? 91  HOH A O   1 
+HETATM 5256 O O   . HOH C 2 .   ? 6.912   30.644  26.694  1.00 35.20 ? ? ? ? ? ? 92  HOH A O   1 
+HETATM 5257 O O   . HOH C 2 .   ? 18.358  39.492  38.732  1.00 34.32 ? ? ? ? ? ? 93  HOH A O   1 
+HETATM 5258 O O   . HOH C 2 .   ? 9.309   37.483  27.619  1.00 25.77 ? ? ? ? ? ? 94  HOH A O   1 
+HETATM 5259 O O   . HOH C 2 .   ? 21.599  32.959  23.298  1.00 30.21 ? ? ? ? ? ? 95  HOH A O   1 
+HETATM 5260 O O   . HOH C 2 .   ? 9.265   26.009  29.284  1.00 26.25 ? ? ? ? ? ? 96  HOH A O   1 
+HETATM 5261 O O   . HOH C 2 .   ? 6.409   24.377  53.507  1.00 27.94 ? ? ? ? ? ? 97  HOH A O   1 
+HETATM 5262 O O   . HOH C 2 .   ? 16.490  0.624   25.160  1.00 45.41 ? ? ? ? ? ? 98  HOH A O   1 
+HETATM 5263 O O   . HOH C 2 .   ? 12.294  24.586  24.024  1.00 31.39 ? ? ? ? ? ? 99  HOH A O   1 
+HETATM 5264 O O   . HOH C 2 .   ? -0.558  35.651  23.290  1.00 40.90 ? ? ? ? ? ? 100 HOH A O   1 
+HETATM 5265 O O   . HOH C 2 .   ? 10.378  36.004  20.806  1.00 29.72 ? ? ? ? ? ? 101 HOH A O   1 
+HETATM 5266 O O   . HOH C 2 .   ? 0.820   4.907   55.236  1.00 26.94 ? ? ? ? ? ? 102 HOH A O   1 
+HETATM 5267 O O   . HOH C 2 .   ? 10.929  23.202  27.909  1.00 29.96 ? ? ? ? ? ? 103 HOH A O   1 
+HETATM 5268 O O   . HOH C 2 .   ? 34.869  25.034  23.866  1.00 34.46 ? ? ? ? ? ? 104 HOH A O   1 
+HETATM 5269 O O   . HOH C 2 .   ? 29.015  31.319  20.245  1.00 27.16 ? ? ? ? ? ? 105 HOH A O   1 
+HETATM 5270 O O   . HOH C 2 .   ? -5.686  17.155  39.523  1.00 33.77 ? ? ? ? ? ? 106 HOH A O   1 
+HETATM 5271 O O   . HOH C 2 .   ? 32.869  28.993  22.367  1.00 36.40 ? ? ? ? ? ? 107 HOH A O   1 
+HETATM 5272 O O   . HOH C 2 .   ? 34.677  32.045  38.500  1.00 30.03 ? ? ? ? ? ? 108 HOH A O   1 
+HETATM 5273 O O   . HOH C 2 .   ? 13.198  -15.131 44.935  1.00 29.68 ? ? ? ? ? ? 109 HOH A O   1 
+HETATM 5274 O O   . HOH C 2 .   ? 12.591  29.994  21.864  1.00 33.35 ? ? ? ? ? ? 110 HOH A O   1 
+HETATM 5275 O O   . HOH C 2 .   ? 16.700  24.364  16.393  1.00 29.43 ? ? ? ? ? ? 111 HOH A O   1 
+HETATM 5276 O O   . HOH C 2 .   ? -8.993  0.342   53.572  1.00 32.01 ? ? ? ? ? ? 112 HOH A O   1 
+HETATM 5277 O O   . HOH C 2 .   ? 14.714  8.182   24.960  1.00 27.93 ? ? ? ? ? ? 113 HOH A O   1 
+HETATM 5278 O O   . HOH C 2 .   ? -6.406  -1.567  52.940  1.00 27.23 ? ? ? ? ? ? 114 HOH A O   1 
+HETATM 5279 O O   . HOH C 2 .   ? 11.896  -12.296 48.647  1.00 31.24 ? ? ? ? ? ? 115 HOH A O   1 
+HETATM 5280 O O   . HOH C 2 .   ? 16.646  37.574  27.637  1.00 30.21 ? ? ? ? ? ? 117 HOH A O   1 
+HETATM 5281 O O   . HOH C 2 .   ? 1.849   -7.405  43.658  1.00 41.55 ? ? ? ? ? ? 118 HOH A O   1 
+HETATM 5282 O O   . HOH C 2 .   ? 20.364  19.716  51.572  1.00 36.09 ? ? ? ? ? ? 119 HOH A O   1 
+HETATM 5283 O O   . HOH C 2 .   ? 34.702  7.045   49.332  1.00 34.10 ? ? ? ? ? ? 120 HOH A O   1 
+HETATM 5284 O O   . HOH C 2 .   ? 4.499   1.315   55.561  1.00 27.33 ? ? ? ? ? ? 121 HOH A O   1 
+HETATM 5285 O O   . HOH C 2 .   ? 23.272  7.551   23.076  1.00 36.91 ? ? ? ? ? ? 122 HOH A O   1 
+HETATM 5286 O O   . HOH C 2 .   ? 13.808  37.251  19.174  1.00 30.43 ? ? ? ? ? ? 123 HOH A O   1 
+HETATM 5287 O O   . HOH C 2 .   ? 6.198   1.801   34.892  1.00 41.36 ? ? ? ? ? ? 124 HOH A O   1 
+HETATM 5288 O O   . HOH C 2 .   ? 17.488  2.333   55.180  1.00 29.71 ? ? ? ? ? ? 125 HOH A O   1 
+HETATM 5289 O O   . HOH C 2 .   ? 10.819  16.363  28.058  1.00 26.83 ? ? ? ? ? ? 126 HOH A O   1 
+HETATM 5290 O O   . HOH C 2 .   ? 6.489   16.464  58.027  1.00 50.52 ? ? ? ? ? ? 127 HOH A O   1 
+HETATM 5291 O O   . HOH C 2 .   ? 0.685   14.739  29.910  1.00 34.22 ? ? ? ? ? ? 128 HOH A O   1 
+HETATM 5292 O O   . HOH C 2 .   ? 2.169   34.573  39.079  1.00 42.85 ? ? ? ? ? ? 129 HOH A O   1 
+HETATM 5293 O O   . HOH C 2 .   ? 22.765  -5.966  42.543  1.00 36.13 ? ? ? ? ? ? 130 HOH A O   1 
+HETATM 5294 O O   . HOH C 2 .   ? -0.127  8.255   56.541  1.00 26.47 ? ? ? ? ? ? 131 HOH A O   1 
+HETATM 5295 O O   . HOH C 2 .   ? 23.050  4.084   55.966  1.00 29.27 ? ? ? ? ? ? 132 HOH A O   1 
+HETATM 5296 O O   . HOH C 2 .   ? 20.862  3.875   57.453  1.00 34.13 ? ? ? ? ? ? 133 HOH A O   1 
+HETATM 5297 O O   . HOH C 2 .   ? 18.761  37.433  34.517  1.00 29.60 ? ? ? ? ? ? 134 HOH A O   1 
+HETATM 5298 O O   . HOH C 2 .   ? 23.871  18.365  14.972  1.00 32.09 ? ? ? ? ? ? 135 HOH A O   1 
+HETATM 5299 O O   . HOH C 2 .   ? 5.399   -3.221  51.305  1.00 39.04 ? ? ? ? ? ? 136 HOH A O   1 
+HETATM 5300 O O   . HOH C 2 .   ? 7.119   2.455   56.866  1.00 36.07 ? ? ? ? ? ? 137 HOH A O   1 
+HETATM 5301 O O   . HOH C 2 .   ? 27.506  0.575   51.281  1.00 36.84 ? ? ? ? ? ? 138 HOH A O   1 
+HETATM 5302 O O   . HOH C 2 .   ? -3.543  -4.594  48.767  1.00 36.17 ? ? ? ? ? ? 139 HOH A O   1 
+HETATM 5303 O O   . HOH C 2 .   ? 3.503   2.815   36.219  1.00 33.83 ? ? ? ? ? ? 140 HOH A O   1 
+HETATM 5304 O O   . HOH C 2 .   ? 23.587  12.725  19.741  1.00 37.32 ? ? ? ? ? ? 141 HOH A O   1 
+HETATM 5305 O O   . HOH C 2 .   ? 8.989   20.839  58.051  1.00 45.44 ? ? ? ? ? ? 142 HOH A O   1 
+HETATM 5306 O O   . HOH C 2 .   ? -2.534  29.744  33.113  1.00 32.75 ? ? ? ? ? ? 143 HOH A O   1 
+HETATM 5307 O O   . HOH C 2 .   ? 42.125  14.677  33.630  1.00 32.27 ? ? ? ? ? ? 144 HOH A O   1 
+HETATM 5308 O O   . HOH C 2 .   ? -4.053  24.702  31.413  1.00 35.35 ? ? ? ? ? ? 145 HOH A O   1 
+HETATM 5309 O O   . HOH C 2 .   ? 14.122  11.847  31.761  1.00 49.01 ? ? ? ? ? ? 146 HOH A O   1 
+HETATM 5310 O O   . HOH C 2 .   ? 38.926  20.684  41.620  1.00 35.01 ? ? ? ? ? ? 147 HOH A O   1 
+HETATM 5311 O O   . HOH C 2 .   ? -2.189  28.843  44.760  1.00 34.22 ? ? ? ? ? ? 148 HOH A O   1 
+HETATM 5312 O O   . HOH C 2 .   ? 11.249  -5.769  38.861  1.00 33.94 ? ? ? ? ? ? 149 HOH A O   1 
+HETATM 5313 O O   . HOH C 2 .   ? 5.649   32.761  53.301  1.00 58.68 ? ? ? ? ? ? 150 HOH A O   1 
+HETATM 5314 O O   . HOH C 2 .   ? 34.260  19.510  18.932  1.00 45.80 ? ? ? ? ? ? 151 HOH A O   1 
+HETATM 5315 O O   . HOH C 2 .   ? 14.769  17.390  12.522  1.00 43.82 ? ? ? ? ? ? 152 HOH A O   1 
+HETATM 5316 O O   . HOH C 2 .   ? 17.932  38.737  41.838  1.00 39.87 ? ? ? ? ? ? 153 HOH A O   1 
+HETATM 5317 O O   . HOH C 2 .   ? 25.739  26.223  45.840  1.00 37.55 ? ? ? ? ? ? 154 HOH A O   1 
+HETATM 5318 O O   . HOH C 2 .   ? -2.117  29.274  55.092  1.00 30.50 ? ? ? ? ? ? 155 HOH A O   1 
+HETATM 5319 O O   . HOH C 2 .   ? 20.094  27.178  46.240  1.00 36.06 ? ? ? ? ? ? 156 HOH A O   1 
+HETATM 5320 O O   . HOH C 2 .   ? 9.113   1.258   56.545  1.00 40.12 ? ? ? ? ? ? 157 HOH A O   1 
+HETATM 5321 O O   . HOH C 2 .   ? 6.571   -10.608 50.078  1.00 67.84 ? ? ? ? ? ? 158 HOH A O   1 
+HETATM 5322 O O   . HOH C 2 .   ? 21.958  17.171  53.835  1.00 43.16 ? ? ? ? ? ? 159 HOH A O   1 
+HETATM 5323 O O   . HOH C 2 .   ? 21.936  0.334   35.813  1.00 33.02 ? ? ? ? ? ? 160 HOH A O   1 
+HETATM 5324 O O   . HOH C 2 .   ? 30.796  2.327   26.399  1.00 40.57 ? ? ? ? ? ? 161 HOH A O   1 
+HETATM 5325 O O   . HOH C 2 .   ? 27.662  12.787  50.246  1.00 40.50 ? ? ? ? ? ? 162 HOH A O   1 
+HETATM 5326 O O   . HOH C 2 .   ? 24.545  4.927   51.745  1.00 33.99 ? ? ? ? ? ? 163 HOH A O   1 
+HETATM 5327 O O   . HOH C 2 .   ? 16.496  6.307   24.788  1.00 52.52 ? ? ? ? ? ? 164 HOH A O   1 
+HETATM 5328 O O   . HOH C 2 .   ? 10.587  5.893   19.970  1.00 62.37 ? ? ? ? ? ? 165 HOH A O   1 
+HETATM 5329 O O   . HOH C 2 .   ? -4.880  -1.513  41.940  1.00 31.35 ? ? ? ? ? ? 166 HOH A O   1 
+HETATM 5330 O O   . HOH C 2 .   ? 20.024  0.406   37.436  1.00 48.29 ? ? ? ? ? ? 167 HOH A O   1 
+HETATM 5331 O O   . HOH C 2 .   ? 39.002  12.977  48.816  1.00 49.88 ? ? ? ? ? ? 168 HOH A O   1 
+HETATM 5332 O O   . HOH C 2 .   ? 0.794   -5.344  50.407  1.00 58.54 ? ? ? ? ? ? 169 HOH A O   1 
+HETATM 5333 O O   . HOH C 2 .   ? 0.007   31.739  30.043  1.00 46.58 ? ? ? ? ? ? 170 HOH A O   1 
+HETATM 5334 O O   . HOH C 2 .   ? 3.209   -2.131  52.735  1.00 40.23 ? ? ? ? ? ? 172 HOH A O   1 
+HETATM 5335 O O   . HOH C 2 .   ? 0.772   18.965  45.987  1.00 39.51 ? ? ? ? ? ? 173 HOH A O   1 
+HETATM 5336 O O   . HOH C 2 .   ? 21.308  26.731  14.581  1.00 40.41 ? ? ? ? ? ? 174 HOH A O   1 
+HETATM 5337 O O   . HOH C 2 .   ? 13.671  31.289  51.094  1.00 62.43 ? ? ? ? ? ? 175 HOH A O   1 
+HETATM 5338 O O   . HOH C 2 .   ? 19.499  31.838  17.380  1.00 40.40 ? ? ? ? ? ? 176 HOH A O   1 
+HETATM 5339 O O   . HOH C 2 .   ? 11.886  2.295   56.480  1.00 50.97 ? ? ? ? ? ? 177 HOH A O   1 
+HETATM 5340 O O   . HOH C 2 .   ? -4.252  27.303  50.245  1.00 44.66 ? ? ? ? ? ? 178 HOH A O   1 
+HETATM 5341 O O   . HOH C 2 .   ? 33.747  2.693   38.480  1.00 56.68 ? ? ? ? ? ? 179 HOH A O   1 
+HETATM 5342 O O   . HOH C 2 .   ? 3.291   21.885  28.023  1.00 50.12 ? ? ? ? ? ? 180 HOH A O   1 
+HETATM 5343 O O   . HOH C 2 .   ? 3.541   17.959  57.150  1.00 44.20 ? ? ? ? ? ? 181 HOH A O   1 
+HETATM 5344 O O   . HOH C 2 .   ? 8.161   37.710  29.626  1.00 38.49 ? ? ? ? ? ? 182 HOH A O   1 
+HETATM 5345 O O   . HOH C 2 .   ? 36.581  4.951   39.491  1.00 57.60 ? ? ? ? ? ? 183 HOH A O   1 
+HETATM 5346 O O   . HOH C 2 .   ? 23.646  7.936   56.692  1.00 50.35 ? ? ? ? ? ? 184 HOH A O   1 
+HETATM 5347 O O   . HOH C 2 .   ? 20.888  5.996   58.401  1.00 49.14 ? ? ? ? ? ? 185 HOH A O   1 
+HETATM 5348 O O   . HOH C 2 .   ? 12.407  12.817  61.829  1.00 37.44 ? ? ? ? ? ? 186 HOH A O   1 
+HETATM 5349 O O   . HOH C 2 .   ? 10.633  7.767   59.564  1.00 57.80 ? ? ? ? ? ? 187 HOH A O   1 
+HETATM 5350 O O   . HOH C 2 .   ? 17.889  9.445   30.740  1.00 36.98 ? ? ? ? ? ? 188 HOH A O   1 
+HETATM 5351 O O   . HOH C 2 .   ? -0.529  19.933  56.089  1.00 45.89 ? ? ? ? ? ? 189 HOH A O   1 
+HETATM 5352 O O   . HOH C 2 .   ? -9.019  3.505   47.871  1.00 52.05 ? ? ? ? ? ? 190 HOH A O   1 
+HETATM 5353 O O   . HOH C 2 .   ? 11.262  10.043  62.269  1.00 59.72 ? ? ? ? ? ? 191 HOH A O   1 
+HETATM 5354 O O   . HOH C 2 .   ? 39.452  25.983  29.260  1.00 54.32 ? ? ? ? ? ? 192 HOH A O   1 
+HETATM 5355 O O   . HOH C 2 .   ? 19.149  8.933   43.975  1.00 38.24 ? ? ? ? ? ? 193 HOH A O   1 
+HETATM 5356 O O   . HOH C 2 .   ? 8.192   32.808  26.669  1.00 29.09 ? ? ? ? ? ? 194 HOH A O   1 
+HETATM 5357 O O   . HOH C 2 .   ? 37.946  19.507  28.973  1.00 32.28 ? ? ? ? ? ? 195 HOH A O   1 
+HETATM 5358 O O   . HOH C 2 .   ? 17.677  11.123  15.895  1.00 30.03 ? ? ? ? ? ? 196 HOH A O   1 
+HETATM 5359 O O   . HOH C 2 .   ? 11.649  18.259  19.548  1.00 29.78 ? ? ? ? ? ? 197 HOH A O   1 
+HETATM 5360 O O   . HOH C 2 .   ? 22.936  18.625  12.852  1.00 45.21 ? ? ? ? ? ? 198 HOH A O   1 
+HETATM 5361 O O   . HOH C 2 .   ? 4.925   27.501  26.975  1.00 40.52 ? ? ? ? ? ? 199 HOH A O   1 
+HETATM 5362 O O   . HOH C 2 .   ? 27.861  -0.948  46.279  1.00 39.96 ? ? ? ? ? ? 200 HOH A O   1 
+HETATM 5363 O O   . HOH C 2 .   ? 11.237  14.317  16.719  1.00 32.61 ? ? ? ? ? ? 201 HOH A O   1 
+HETATM 5364 O O   . HOH C 2 .   ? 14.389  27.100  17.986  1.00 41.75 ? ? ? ? ? ? 202 HOH A O   1 
+HETATM 5365 O O   . HOH C 2 .   ? 36.932  27.545  43.214  1.00 33.49 ? ? ? ? ? ? 203 HOH A O   1 
+HETATM 5366 O O   . HOH C 2 .   ? 23.782  33.225  42.152  1.00 29.05 ? ? ? ? ? ? 204 HOH A O   1 
+HETATM 5367 O O   . HOH C 2 .   ? -8.578  2.201   51.265  1.00 38.86 ? ? ? ? ? ? 205 HOH A O   1 
+HETATM 5368 O O   . HOH C 2 .   ? 25.560  30.029  46.884  1.00 38.81 ? ? ? ? ? ? 206 HOH A O   1 
+HETATM 5369 O O   . HOH C 2 .   ? 5.702   41.367  43.293  1.00 42.92 ? ? ? ? ? ? 207 HOH A O   1 
+HETATM 5370 O O   . HOH C 2 .   ? -0.142  33.950  43.771  1.00 53.04 ? ? ? ? ? ? 208 HOH A O   1 
+HETATM 5371 O O   . HOH C 2 .   ? 23.466  17.507  9.102   1.00 35.29 ? ? ? ? ? ? 209 HOH A O   1 
+HETATM 5372 O O   . HOH C 2 .   ? 9.336   -5.342  37.057  1.00 38.16 ? ? ? ? ? ? 210 HOH A O   1 
+HETATM 5373 O O   . HOH C 2 .   ? 19.208  35.232  20.240  1.00 42.67 ? ? ? ? ? ? 211 HOH A O   1 
+HETATM 5374 O O   . HOH C 2 .   ? 21.847  22.379  46.946  1.00 47.09 ? ? ? ? ? ? 212 HOH A O   1 
+HETATM 5375 O O   . HOH C 2 .   ? 9.829   6.136   29.064  1.00 65.53 ? ? ? ? ? ? 213 HOH A O   1 
+HETATM 5376 O O   . HOH C 2 .   ? 18.300  -6.924  42.238  1.00 37.37 ? ? ? ? ? ? 214 HOH A O   1 
+HETATM 5377 O O   . HOH C 2 .   ? 33.657  21.753  17.638  1.00 41.06 ? ? ? ? ? ? 215 HOH A O   1 
+HETATM 5378 O O   . HOH C 2 .   ? 24.615  22.655  47.482  1.00 49.77 ? ? ? ? ? ? 216 HOH A O   1 
+HETATM 5379 O O   . HOH C 2 .   ? 13.895  22.801  16.048  1.00 53.98 ? ? ? ? ? ? 218 HOH A O   1 
+HETATM 5380 O O   . HOH C 2 .   ? 39.088  15.547  25.983  1.00 43.98 ? ? ? ? ? ? 219 HOH A O   1 
+HETATM 5381 O O   . HOH C 2 .   ? -11.751 3.015   55.532  1.00 43.41 ? ? ? ? ? ? 220 HOH A O   1 
+HETATM 5382 O O   . HOH C 2 .   ? 22.192  13.305  58.897  1.00 47.00 ? ? ? ? ? ? 221 HOH A O   1 
+HETATM 5383 O O   . HOH C 2 .   ? 7.462   34.947  27.625  1.00 61.29 ? ? ? ? ? ? 222 HOH A O   1 
+HETATM 5384 O O   . HOH C 2 .   ? 18.127  36.940  30.127  1.00 67.74 ? ? ? ? ? ? 223 HOH A O   1 
+HETATM 5385 O O   . HOH C 2 .   ? -10.173 19.602  47.111  1.00 50.12 ? ? ? ? ? ? 224 HOH A O   1 
+HETATM 5386 O O   . HOH C 2 .   ? 4.064   36.393  29.795  1.00 46.94 ? ? ? ? ? ? 225 HOH A O   1 
+HETATM 5387 O O   . HOH C 2 .   ? 25.689  34.637  24.853  1.00 47.62 ? ? ? ? ? ? 226 HOH A O   1 
+HETATM 5388 O O   . HOH C 2 .   ? 0.721   23.404  27.132  1.00 54.99 ? ? ? ? ? ? 227 HOH A O   1 
+HETATM 5389 O O   . HOH C 2 .   ? 2.351   8.980   59.016  1.00 58.70 ? ? ? ? ? ? 228 HOH A O   1 
+HETATM 5390 O O   . HOH C 2 .   ? 31.985  15.324  49.189  1.00 47.31 ? ? ? ? ? ? 229 HOH A O   1 
+HETATM 5391 O O   . HOH C 2 .   ? -2.100  28.189  25.481  1.00 40.69 ? ? ? ? ? ? 230 HOH A O   1 
+HETATM 5392 O O   . HOH C 2 .   ? 32.843  18.552  17.241  1.00 52.37 ? ? ? ? ? ? 231 HOH A O   1 
+HETATM 5393 O O   . HOH C 2 .   ? 29.776  14.554  49.741  1.00 49.91 ? ? ? ? ? ? 233 HOH A O   1 
+HETATM 5394 O O   . HOH C 2 .   ? 7.680   33.949  50.969  1.00 35.24 ? ? ? ? ? ? 281 HOH A O   1 
+HETATM 5395 O O   . HOH C 2 .   ? 8.488   31.677  52.565  1.00 48.35 ? ? ? ? ? ? 320 HOH A O   1 
+HETATM 5396 O O   . HOH C 2 .   ? 11.970  40.004  36.107  1.00 63.40 ? ? ? ? ? ? 381 HOH A O   1 
+HETATM 5397 O O   . HOH C 2 .   ? 3.686   32.305  55.795  1.00 52.51 ? ? ? ? ? ? 393 HOH A O   1 
+HETATM 5398 O O   . HOH C 2 .   ? 8.329   15.693  60.042  1.00 40.55 ? ? ? ? ? ? 397 HOH A O   1 
+HETATM 5399 O O   . HOH D 2 .   ? 14.748  32.161  49.397  1.00 33.95 ? ? ? ? ? ? 116 HOH B O   1 
+HETATM 5400 O O   . HOH D 2 .   ? -13.355 33.644  62.184  1.00 36.78 ? ? ? ? ? ? 171 HOH B O   1 
+HETATM 5401 O O   . HOH D 2 .   ? 2.042   27.943  56.451  1.00 49.17 ? ? ? ? ? ? 217 HOH B O   1 
+HETATM 5402 O O   . HOH D 2 .   ? 23.316  37.776  44.397  1.00 54.35 ? ? ? ? ? ? 232 HOH B O   1 
+HETATM 5403 O O   . HOH D 2 .   ? 7.439   33.931  70.275  1.00 13.96 ? ? ? ? ? ? 234 HOH B O   1 
+HETATM 5404 O O   . HOH D 2 .   ? 4.950   34.580  70.985  1.00 9.48  ? ? ? ? ? ? 235 HOH B O   1 
+HETATM 5405 O O   . HOH D 2 .   ? 17.406  33.585  81.547  1.00 11.47 ? ? ? ? ? ? 236 HOH B O   1 
+HETATM 5406 O O   . HOH D 2 .   ? 2.790   23.259  69.848  1.00 13.63 ? ? ? ? ? ? 237 HOH B O   1 
+HETATM 5407 O O   . HOH D 2 .   ? -3.132  24.633  67.352  1.00 14.12 ? ? ? ? ? ? 238 HOH B O   1 
+HETATM 5408 O O   . HOH D 2 .   ? 7.256   20.906  74.244  1.00 12.97 ? ? ? ? ? ? 239 HOH B O   1 
+HETATM 5409 O O   . HOH D 2 .   ? 6.141   34.693  62.166  1.00 12.01 ? ? ? ? ? ? 240 HOH B O   1 
+HETATM 5410 O O   . HOH D 2 .   ? 1.520   38.468  86.779  1.00 18.06 ? ? ? ? ? ? 241 HOH B O   1 
+HETATM 5411 O O   . HOH D 2 .   ? 11.028  39.577  60.147  1.00 10.91 ? ? ? ? ? ? 242 HOH B O   1 
+HETATM 5412 O O   . HOH D 2 .   ? -4.432  17.839  79.654  1.00 16.15 ? ? ? ? ? ? 243 HOH B O   1 
+HETATM 5413 O O   . HOH D 2 .   ? -2.688  25.067  74.176  1.00 14.23 ? ? ? ? ? ? 244 HOH B O   1 
+HETATM 5414 O O   . HOH D 2 .   ? 11.975  26.111  76.290  1.00 14.46 ? ? ? ? ? ? 245 HOH B O   1 
+HETATM 5415 O O   . HOH D 2 .   ? 0.668   24.848  67.007  1.00 15.74 ? ? ? ? ? ? 246 HOH B O   1 
+HETATM 5416 O O   . HOH D 2 .   ? 19.334  26.853  81.210  1.00 14.18 ? ? ? ? ? ? 247 HOH B O   1 
+HETATM 5417 O O   . HOH D 2 .   ? 3.648   37.842  64.940  1.00 15.53 ? ? ? ? ? ? 248 HOH B O   1 
+HETATM 5418 O O   . HOH D 2 .   ? 19.295  29.547  71.414  1.00 13.45 ? ? ? ? ? ? 249 HOH B O   1 
+HETATM 5419 O O   . HOH D 2 .   ? 19.739  33.736  66.200  1.00 13.96 ? ? ? ? ? ? 250 HOH B O   1 
+HETATM 5420 O O   . HOH D 2 .   ? 10.409  50.429  71.603  1.00 12.57 ? ? ? ? ? ? 251 HOH B O   1 
+HETATM 5421 O O   . HOH D 2 .   ? 16.710  39.734  45.860  1.00 15.46 ? ? ? ? ? ? 252 HOH B O   1 
+HETATM 5422 O O   . HOH D 2 .   ? 16.553  37.176  60.564  1.00 13.25 ? ? ? ? ? ? 253 HOH B O   1 
+HETATM 5423 O O   . HOH D 2 .   ? 8.529   50.879  74.969  1.00 25.19 ? ? ? ? ? ? 254 HOH B O   1 
+HETATM 5424 O O   . HOH D 2 .   ? 10.888  30.771  67.958  1.00 13.04 ? ? ? ? ? ? 255 HOH B O   1 
+HETATM 5425 O O   . HOH D 2 .   ? 3.048   24.482  65.840  1.00 19.01 ? ? ? ? ? ? 256 HOH B O   1 
+HETATM 5426 O O   . HOH D 2 .   ? 4.569   40.198  80.273  1.00 17.08 ? ? ? ? ? ? 257 HOH B O   1 
+HETATM 5427 O O   . HOH D 2 .   ? 8.678   38.807  90.088  1.00 17.50 ? ? ? ? ? ? 258 HOH B O   1 
+HETATM 5428 O O   . HOH D 2 .   ? 21.484  35.524  64.927  1.00 16.89 ? ? ? ? ? ? 259 HOH B O   1 
+HETATM 5429 O O   . HOH D 2 .   ? 24.313  34.995  67.752  1.00 17.87 ? ? ? ? ? ? 260 HOH B O   1 
+HETATM 5430 O O   . HOH D 2 .   ? 16.140  46.312  92.123  1.00 17.48 ? ? ? ? ? ? 261 HOH B O   1 
+HETATM 5431 O O   . HOH D 2 .   ? 13.207  35.833  61.126  1.00 18.17 ? ? ? ? ? ? 262 HOH B O   1 
+HETATM 5432 O O   . HOH D 2 .   ? 15.243  52.558  63.195  1.00 17.75 ? ? ? ? ? ? 263 HOH B O   1 
+HETATM 5433 O O   . HOH D 2 .   ? 0.163   32.984  61.648  1.00 23.96 ? ? ? ? ? ? 264 HOH B O   1 
+HETATM 5434 O O   . HOH D 2 .   ? 5.728   48.294  65.677  1.00 18.54 ? ? ? ? ? ? 265 HOH B O   1 
+HETATM 5435 O O   . HOH D 2 .   ? -1.157  44.752  69.959  1.00 15.58 ? ? ? ? ? ? 266 HOH B O   1 
+HETATM 5436 O O   . HOH D 2 .   ? 3.724   26.851  90.744  1.00 34.21 ? ? ? ? ? ? 267 HOH B O   1 
+HETATM 5437 O O   . HOH D 2 .   ? 25.322  41.822  70.766  1.00 18.87 ? ? ? ? ? ? 268 HOH B O   1 
+HETATM 5438 O O   . HOH D 2 .   ? 22.368  28.479  89.791  1.00 42.69 ? ? ? ? ? ? 269 HOH B O   1 
+HETATM 5439 O O   . HOH D 2 .   ? 33.001  37.560  63.743  1.00 19.24 ? ? ? ? ? ? 270 HOH B O   1 
+HETATM 5440 O O   . HOH D 2 .   ? -15.598 35.487  74.136  1.00 24.16 ? ? ? ? ? ? 271 HOH B O   1 
+HETATM 5441 O O   . HOH D 2 .   ? 15.779  35.134  47.670  1.00 19.08 ? ? ? ? ? ? 272 HOH B O   1 
+HETATM 5442 O O   . HOH D 2 .   ? 23.387  47.303  52.383  1.00 20.94 ? ? ? ? ? ? 273 HOH B O   1 
+HETATM 5443 O O   . HOH D 2 .   ? 18.985  40.119  89.870  1.00 18.71 ? ? ? ? ? ? 274 HOH B O   1 
+HETATM 5444 O O   . HOH D 2 .   ? -8.927  39.704  58.662  1.00 20.35 ? ? ? ? ? ? 275 HOH B O   1 
+HETATM 5445 O O   . HOH D 2 .   ? 11.085  46.543  81.325  1.00 23.40 ? ? ? ? ? ? 276 HOH B O   1 
+HETATM 5446 O O   . HOH D 2 .   ? 3.054   39.302  56.021  1.00 17.08 ? ? ? ? ? ? 277 HOH B O   1 
+HETATM 5447 O O   . HOH D 2 .   ? 3.717   40.980  58.037  1.00 54.48 ? ? ? ? ? ? 278 HOH B O   1 
+HETATM 5448 O O   . HOH D 2 .   ? 4.414   51.406  56.325  1.00 20.95 ? ? ? ? ? ? 279 HOH B O   1 
+HETATM 5449 O O   . HOH D 2 .   ? 3.554   49.374  69.340  1.00 18.98 ? ? ? ? ? ? 280 HOH B O   1 
+HETATM 5450 O O   . HOH D 2 .   ? 5.964   36.269  51.647  1.00 24.09 ? ? ? ? ? ? 282 HOH B O   1 
+HETATM 5451 O O   . HOH D 2 .   ? -16.931 32.157  67.784  1.00 19.86 ? ? ? ? ? ? 283 HOH B O   1 
+HETATM 5452 O O   . HOH D 2 .   ? 30.273  34.109  69.896  1.00 27.55 ? ? ? ? ? ? 284 HOH B O   1 
+HETATM 5453 O O   . HOH D 2 .   ? 17.909  25.368  87.302  1.00 22.41 ? ? ? ? ? ? 285 HOH B O   1 
+HETATM 5454 O O   . HOH D 2 .   ? 4.627   16.633  87.139  1.00 25.53 ? ? ? ? ? ? 286 HOH B O   1 
+HETATM 5455 O O   . HOH D 2 .   ? 26.196  41.503  83.409  1.00 36.02 ? ? ? ? ? ? 287 HOH B O   1 
+HETATM 5456 O O   . HOH D 2 .   ? 21.155  45.378  84.765  1.00 58.15 ? ? ? ? ? ? 288 HOH B O   1 
+HETATM 5457 O O   . HOH D 2 .   ? -5.403  14.908  71.017  1.00 30.95 ? ? ? ? ? ? 289 HOH B O   1 
+HETATM 5458 O O   . HOH D 2 .   ? 16.644  45.051  54.435  1.00 23.77 ? ? ? ? ? ? 290 HOH B O   1 
+HETATM 5459 O O   . HOH D 2 .   ? -6.941  12.973  72.619  1.00 52.40 ? ? ? ? ? ? 291 HOH B O   1 
+HETATM 5460 O O   . HOH D 2 .   ? 9.060   30.383  65.526  1.00 22.62 ? ? ? ? ? ? 292 HOH B O   1 
+HETATM 5461 O O   . HOH D 2 .   ? 21.271  25.064  80.228  1.00 25.31 ? ? ? ? ? ? 293 HOH B O   1 
+HETATM 5462 O O   . HOH D 2 .   ? 25.858  50.682  57.897  1.00 22.54 ? ? ? ? ? ? 294 HOH B O   1 
+HETATM 5463 O O   . HOH D 2 .   ? 10.623  45.024  87.931  1.00 26.40 ? ? ? ? ? ? 295 HOH B O   1 
+HETATM 5464 O O   . HOH D 2 .   ? -6.774  42.107  74.510  1.00 24.24 ? ? ? ? ? ? 296 HOH B O   1 
+HETATM 5465 O O   . HOH D 2 .   ? 15.913  37.013  45.657  1.00 19.18 ? ? ? ? ? ? 297 HOH B O   1 
+HETATM 5466 O O   . HOH D 2 .   ? 12.296  26.556  69.298  1.00 33.13 ? ? ? ? ? ? 298 HOH B O   1 
+HETATM 5467 O O   . HOH D 2 .   ? -11.174 24.972  103.032 1.00 39.27 ? ? ? ? ? ? 299 HOH B O   1 
+HETATM 5468 O O   . HOH D 2 .   ? -6.979  38.806  78.745  1.00 22.20 ? ? ? ? ? ? 300 HOH B O   1 
+HETATM 5469 O O   . HOH D 2 .   ? 27.406  28.484  67.612  1.00 23.66 ? ? ? ? ? ? 301 HOH B O   1 
+HETATM 5470 O O   . HOH D 2 .   ? -0.194  32.304  92.017  1.00 25.56 ? ? ? ? ? ? 302 HOH B O   1 
+HETATM 5471 O O   . HOH D 2 .   ? 4.299   54.492  68.362  1.00 24.64 ? ? ? ? ? ? 303 HOH B O   1 
+HETATM 5472 O O   . HOH D 2 .   ? -4.671  45.393  58.631  1.00 30.42 ? ? ? ? ? ? 304 HOH B O   1 
+HETATM 5473 O O   . HOH D 2 .   ? 32.572  41.587  58.308  1.00 22.61 ? ? ? ? ? ? 305 HOH B O   1 
+HETATM 5474 O O   . HOH D 2 .   ? 15.746  35.199  92.710  1.00 39.94 ? ? ? ? ? ? 306 HOH B O   1 
+HETATM 5475 O O   . HOH D 2 .   ? 9.786   51.023  77.206  1.00 28.25 ? ? ? ? ? ? 307 HOH B O   1 
+HETATM 5476 O O   . HOH D 2 .   ? 1.198   34.868  60.798  1.00 27.56 ? ? ? ? ? ? 308 HOH B O   1 
+HETATM 5477 O O   . HOH D 2 .   ? 22.558  32.369  59.801  1.00 29.00 ? ? ? ? ? ? 309 HOH B O   1 
+HETATM 5478 O O   . HOH D 2 .   ? 25.400  42.476  76.931  1.00 25.48 ? ? ? ? ? ? 310 HOH B O   1 
+HETATM 5479 O O   . HOH D 2 .   ? 0.344   26.020  61.106  1.00 25.50 ? ? ? ? ? ? 311 HOH B O   1 
+HETATM 5480 O O   . HOH D 2 .   ? 16.934  45.332  52.204  1.00 29.10 ? ? ? ? ? ? 312 HOH B O   1 
+HETATM 5481 O O   . HOH D 2 .   ? -9.369  14.371  77.379  1.00 32.14 ? ? ? ? ? ? 313 HOH B O   1 
+HETATM 5482 O O   . HOH D 2 .   ? 22.064  31.046  89.021  1.00 24.06 ? ? ? ? ? ? 314 HOH B O   1 
+HETATM 5483 O O   . HOH D 2 .   ? -8.528  18.349  89.376  1.00 24.13 ? ? ? ? ? ? 315 HOH B O   1 
+HETATM 5484 O O   . HOH D 2 .   ? 0.435   41.693  78.630  1.00 30.11 ? ? ? ? ? ? 316 HOH B O   1 
+HETATM 5485 O O   . HOH D 2 .   ? 1.584   11.798  73.120  1.00 30.98 ? ? ? ? ? ? 317 HOH B O   1 
+HETATM 5486 O O   . HOH D 2 .   ? 15.362  43.173  44.621  1.00 29.60 ? ? ? ? ? ? 318 HOH B O   1 
+HETATM 5487 O O   . HOH D 2 .   ? 8.197   32.118  57.027  1.00 24.67 ? ? ? ? ? ? 319 HOH B O   1 
+HETATM 5488 O O   . HOH D 2 .   ? 31.199  30.185  61.722  1.00 27.44 ? ? ? ? ? ? 321 HOH B O   1 
+HETATM 5489 O O   . HOH D 2 .   ? -17.072 35.205  76.460  1.00 33.00 ? ? ? ? ? ? 322 HOH B O   1 
+HETATM 5490 O O   . HOH D 2 .   ? 12.274  49.073  80.223  1.00 24.99 ? ? ? ? ? ? 323 HOH B O   1 
+HETATM 5491 O O   . HOH D 2 .   ? 5.117   19.230  89.825  1.00 43.15 ? ? ? ? ? ? 324 HOH B O   1 
+HETATM 5492 O O   . HOH D 2 .   ? 15.811  23.228  87.244  1.00 54.03 ? ? ? ? ? ? 325 HOH B O   1 
+HETATM 5493 O O   . HOH D 2 .   ? 6.000   35.770  94.387  1.00 36.90 ? ? ? ? ? ? 326 HOH B O   1 
+HETATM 5494 O O   . HOH D 2 .   ? 15.101  24.717  92.228  1.00 29.30 ? ? ? ? ? ? 327 HOH B O   1 
+HETATM 5495 O O   . HOH D 2 .   ? 2.662   20.353  88.312  1.00 32.78 ? ? ? ? ? ? 328 HOH B O   1 
+HETATM 5496 O O   . HOH D 2 .   ? 14.429  25.585  80.968  1.00 32.30 ? ? ? ? ? ? 329 HOH B O   1 
+HETATM 5497 O O   . HOH D 2 .   ? 18.044  50.215  78.997  1.00 27.16 ? ? ? ? ? ? 330 HOH B O   1 
+HETATM 5498 O O   . HOH D 2 .   ? 19.334  45.805  90.182  1.00 32.88 ? ? ? ? ? ? 331 HOH B O   1 
+HETATM 5499 O O   . HOH D 2 .   ? 11.036  20.470  80.505  1.00 33.35 ? ? ? ? ? ? 332 HOH B O   1 
+HETATM 5500 O O   . HOH D 2 .   ? -19.123 34.039  78.213  1.00 32.04 ? ? ? ? ? ? 333 HOH B O   1 
+HETATM 5501 O O   . HOH D 2 .   ? 14.295  18.329  87.940  1.00 59.00 ? ? ? ? ? ? 334 HOH B O   1 
+HETATM 5502 O O   . HOH D 2 .   ? 23.125  51.158  59.146  1.00 31.00 ? ? ? ? ? ? 335 HOH B O   1 
+HETATM 5503 O O   . HOH D 2 .   ? 13.007  24.411  78.260  1.00 31.11 ? ? ? ? ? ? 336 HOH B O   1 
+HETATM 5504 O O   . HOH D 2 .   ? -15.858 22.514  82.572  1.00 52.70 ? ? ? ? ? ? 337 HOH B O   1 
+HETATM 5505 O O   . HOH D 2 .   ? -5.591  16.928  87.148  1.00 29.28 ? ? ? ? ? ? 338 HOH B O   1 
+HETATM 5506 O O   . HOH D 2 .   ? 29.824  35.939  71.739  1.00 27.30 ? ? ? ? ? ? 339 HOH B O   1 
+HETATM 5507 O O   . HOH D 2 .   ? -4.663  20.149  87.918  1.00 35.03 ? ? ? ? ? ? 340 HOH B O   1 
+HETATM 5508 O O   . HOH D 2 .   ? -10.607 35.253  86.978  1.00 34.60 ? ? ? ? ? ? 341 HOH B O   1 
+HETATM 5509 O O   . HOH D 2 .   ? 21.277  41.352  89.613  1.00 49.69 ? ? ? ? ? ? 342 HOH B O   1 
+HETATM 5510 O O   . HOH D 2 .   ? 11.461  18.437  85.397  1.00 26.10 ? ? ? ? ? ? 343 HOH B O   1 
+HETATM 5511 O O   . HOH D 2 .   ? 4.475   11.775  80.888  1.00 27.10 ? ? ? ? ? ? 344 HOH B O   1 
+HETATM 5512 O O   . HOH D 2 .   ? 32.910  48.668  54.258  1.00 28.47 ? ? ? ? ? ? 345 HOH B O   1 
+HETATM 5513 O O   . HOH D 2 .   ? 4.364   18.122  63.520  1.00 32.48 ? ? ? ? ? ? 346 HOH B O   1 
+HETATM 5514 O O   . HOH D 2 .   ? 32.630  46.727  56.890  1.00 33.74 ? ? ? ? ? ? 347 HOH B O   1 
+HETATM 5515 O O   . HOH D 2 .   ? 16.288  41.179  43.225  1.00 58.25 ? ? ? ? ? ? 348 HOH B O   1 
+HETATM 5516 O O   . HOH D 2 .   ? 9.666   45.043  85.325  1.00 30.90 ? ? ? ? ? ? 349 HOH B O   1 
+HETATM 5517 O O   . HOH D 2 .   ? 11.805  24.177  95.869  1.00 48.75 ? ? ? ? ? ? 350 HOH B O   1 
+HETATM 5518 O O   . HOH D 2 .   ? 22.242  38.779  47.166  1.00 29.13 ? ? ? ? ? ? 351 HOH B O   1 
+HETATM 5519 O O   . HOH D 2 .   ? 3.453   48.208  74.453  1.00 40.58 ? ? ? ? ? ? 352 HOH B O   1 
+HETATM 5520 O O   . HOH D 2 .   ? -11.224 45.171  61.549  1.00 55.91 ? ? ? ? ? ? 353 HOH B O   1 
+HETATM 5521 O O   . HOH D 2 .   ? 19.387  51.335  56.032  1.00 27.93 ? ? ? ? ? ? 354 HOH B O   1 
+HETATM 5522 O O   . HOH D 2 .   ? 2.032   23.410  62.979  1.00 46.81 ? ? ? ? ? ? 355 HOH B O   1 
+HETATM 5523 O O   . HOH D 2 .   ? 7.467   15.700  94.184  1.00 35.08 ? ? ? ? ? ? 356 HOH B O   1 
+HETATM 5524 O O   . HOH D 2 .   ? 18.756  30.581  52.741  1.00 31.41 ? ? ? ? ? ? 357 HOH B O   1 
+HETATM 5525 O O   . HOH D 2 .   ? 6.487   51.054  56.822  1.00 29.31 ? ? ? ? ? ? 358 HOH B O   1 
+HETATM 5526 O O   . HOH D 2 .   ? 13.121  24.203  71.251  1.00 46.50 ? ? ? ? ? ? 359 HOH B O   1 
+HETATM 5527 O O   . HOH D 2 .   ? 17.500  53.923  70.154  1.00 32.36 ? ? ? ? ? ? 360 HOH B O   1 
+HETATM 5528 O O   . HOH D 2 .   ? 23.444  25.786  69.799  1.00 38.24 ? ? ? ? ? ? 361 HOH B O   1 
+HETATM 5529 O O   . HOH D 2 .   ? 22.194  35.799  89.283  1.00 30.53 ? ? ? ? ? ? 362 HOH B O   1 
+HETATM 5530 O O   . HOH D 2 .   ? -1.186  36.601  50.287  1.00 48.92 ? ? ? ? ? ? 363 HOH B O   1 
+HETATM 5531 O O   . HOH D 2 .   ? 24.144  52.464  62.699  1.00 31.31 ? ? ? ? ? ? 364 HOH B O   1 
+HETATM 5532 O O   . HOH D 2 .   ? 2.291   53.667  59.537  1.00 40.22 ? ? ? ? ? ? 365 HOH B O   1 
+HETATM 5533 O O   . HOH D 2 .   ? 0.425   51.643  58.771  1.00 32.98 ? ? ? ? ? ? 366 HOH B O   1 
+HETATM 5534 O O   . HOH D 2 .   ? 5.091   31.699  92.420  1.00 35.57 ? ? ? ? ? ? 367 HOH B O   1 
+HETATM 5535 O O   . HOH D 2 .   ? 32.321  45.942  91.655  1.00 52.87 ? ? ? ? ? ? 368 HOH B O   1 
+HETATM 5536 O O   . HOH D 2 .   ? 18.563  46.577  51.453  1.00 27.08 ? ? ? ? ? ? 369 HOH B O   1 
+HETATM 5537 O O   . HOH D 2 .   ? 17.280  52.655  56.855  1.00 35.97 ? ? ? ? ? ? 370 HOH B O   1 
+HETATM 5538 O O   . HOH D 2 .   ? -3.601  46.622  54.884  1.00 40.65 ? ? ? ? ? ? 371 HOH B O   1 
+HETATM 5539 O O   . HOH D 2 .   ? 28.288  44.309  50.784  1.00 50.16 ? ? ? ? ? ? 372 HOH B O   1 
+HETATM 5540 O O   . HOH D 2 .   ? 21.146  32.821  57.676  1.00 39.27 ? ? ? ? ? ? 373 HOH B O   1 
+HETATM 5541 O O   . HOH D 2 .   ? 0.107   15.141  68.731  1.00 44.32 ? ? ? ? ? ? 374 HOH B O   1 
+HETATM 5542 O O   . HOH D 2 .   ? 15.916  52.384  77.418  1.00 38.73 ? ? ? ? ? ? 375 HOH B O   1 
+HETATM 5543 O O   . HOH D 2 .   ? 26.382  29.240  84.737  1.00 34.99 ? ? ? ? ? ? 376 HOH B O   1 
+HETATM 5544 O O   . HOH D 2 .   ? -18.219 29.808  69.614  1.00 32.85 ? ? ? ? ? ? 377 HOH B O   1 
+HETATM 5545 O O   . HOH D 2 .   ? 28.556  28.222  80.228  1.00 38.74 ? ? ? ? ? ? 378 HOH B O   1 
+HETATM 5546 O O   . HOH D 2 .   ? 9.034   28.051  67.305  1.00 32.99 ? ? ? ? ? ? 379 HOH B O   1 
+HETATM 5547 O O   . HOH D 2 .   ? 26.642  25.242  95.920  1.00 39.74 ? ? ? ? ? ? 380 HOH B O   1 
+HETATM 5548 O O   . HOH D 2 .   ? 10.488  33.782  51.265  1.00 34.16 ? ? ? ? ? ? 382 HOH B O   1 
+HETATM 5549 O O   . HOH D 2 .   ? 18.477  47.625  85.435  1.00 33.25 ? ? ? ? ? ? 383 HOH B O   1 
+HETATM 5550 O O   . HOH D 2 .   ? -10.288 15.489  75.489  1.00 43.76 ? ? ? ? ? ? 384 HOH B O   1 
+HETATM 5551 O O   . HOH D 2 .   ? 6.985   6.114   76.686  1.00 40.24 ? ? ? ? ? ? 385 HOH B O   1 
+HETATM 5552 O O   . HOH D 2 .   ? 9.284   40.209  92.226  1.00 26.97 ? ? ? ? ? ? 386 HOH B O   1 
+HETATM 5553 O O   . HOH D 2 .   ? 2.426   43.260  77.203  1.00 37.48 ? ? ? ? ? ? 387 HOH B O   1 
+HETATM 5554 O O   . HOH D 2 .   ? 21.594  49.319  85.641  1.00 63.27 ? ? ? ? ? ? 388 HOH B O   1 
+HETATM 5555 O O   . HOH D 2 .   ? 3.891   42.665  81.958  1.00 28.85 ? ? ? ? ? ? 389 HOH B O   1 
+HETATM 5556 O O   . HOH D 2 .   ? 14.554  52.382  55.766  1.00 33.31 ? ? ? ? ? ? 390 HOH B O   1 
+HETATM 5557 O O   . HOH D 2 .   ? 19.390  40.711  45.920  1.00 34.09 ? ? ? ? ? ? 391 HOH B O   1 
+HETATM 5558 O O   . HOH D 2 .   ? 1.779   49.905  71.347  1.00 43.27 ? ? ? ? ? ? 392 HOH B O   1 
+HETATM 5559 O O   . HOH D 2 .   ? -7.135  21.945  57.471  1.00 38.93 ? ? ? ? ? ? 394 HOH B O   1 
+HETATM 5560 O O   . HOH D 2 .   ? -4.084  46.475  67.409  1.00 35.80 ? ? ? ? ? ? 395 HOH B O   1 
+HETATM 5561 O O   . HOH D 2 .   ? -0.011  52.405  62.898  1.00 44.36 ? ? ? ? ? ? 396 HOH B O   1 
+HETATM 5562 O O   . HOH D 2 .   ? 11.370  15.515  60.542  1.00 46.65 ? ? ? ? ? ? 398 HOH B O   1 
+HETATM 5563 O O   . HOH D 2 .   ? 28.570  37.378  53.924  1.00 58.86 ? ? ? ? ? ? 399 HOH B O   1 
+HETATM 5564 O O   . HOH D 2 .   ? 0.768   30.031  56.195  1.00 48.36 ? ? ? ? ? ? 400 HOH B O   1 
+HETATM 5565 O O   . HOH D 2 .   ? -12.502 46.812  64.587  1.00 41.50 ? ? ? ? ? ? 401 HOH B O   1 
+HETATM 5566 O O   . HOH D 2 .   ? 25.213  40.882  48.238  1.00 46.86 ? ? ? ? ? ? 402 HOH B O   1 
+HETATM 5567 O O   . HOH D 2 .   ? 25.580  22.893  84.946  1.00 45.70 ? ? ? ? ? ? 403 HOH B O   1 
+HETATM 5568 O O   . HOH D 2 .   ? -2.249  11.540  87.002  1.00 31.82 ? ? ? ? ? ? 404 HOH B O   1 
+HETATM 5569 O O   . HOH D 2 .   ? 25.308  49.851  52.412  1.00 37.89 ? ? ? ? ? ? 405 HOH B O   1 
+HETATM 5570 O O   . HOH D 2 .   ? 24.661  42.533  73.312  1.00 42.30 ? ? ? ? ? ? 406 HOH B O   1 
+HETATM 5571 O O   . HOH D 2 .   ? 2.972   11.241  82.743  1.00 44.00 ? ? ? ? ? ? 407 HOH B O   1 
+HETATM 5572 O O   . HOH D 2 .   ? 13.602  48.749  82.587  1.00 35.11 ? ? ? ? ? ? 408 HOH B O   1 
+HETATM 5573 O O   . HOH D 2 .   ? 27.776  57.429  37.966  1.00 38.85 ? ? ? ? ? ? 409 HOH B O   1 
+HETATM 5574 O O   . HOH D 2 .   ? 12.082  51.920  56.347  1.00 40.47 ? ? ? ? ? ? 410 HOH B O   1 
+HETATM 5575 O O   . HOH D 2 .   ? 27.993  46.209  81.546  1.00 34.53 ? ? ? ? ? ? 411 HOH B O   1 
+HETATM 5576 O O   . HOH D 2 .   ? -12.836 35.702  59.217  1.00 56.62 ? ? ? ? ? ? 412 HOH B O   1 
+HETATM 5577 O O   . HOH D 2 .   ? 14.774  23.856  76.256  1.00 54.46 ? ? ? ? ? ? 413 HOH B O   1 
+HETATM 5578 O O   . HOH D 2 .   ? 17.265  54.862  74.559  1.00 41.62 ? ? ? ? ? ? 414 HOH B O   1 
+HETATM 5579 O O   . HOH D 2 .   ? 14.436  24.254  94.784  1.00 49.31 ? ? ? ? ? ? 415 HOH B O   1 
+HETATM 5580 O O   . HOH D 2 .   ? 31.277  34.474  57.710  1.00 48.63 ? ? ? ? ? ? 416 HOH B O   1 
+HETATM 5581 O O   . HOH D 2 .   ? 3.921   54.887  60.562  1.00 38.97 ? ? ? ? ? ? 417 HOH B O   1 
+HETATM 5582 O O   . HOH D 2 .   ? 7.279   57.053  60.698  1.00 42.99 ? ? ? ? ? ? 418 HOH B O   1 
+HETATM 5583 O O   . HOH D 2 .   ? 12.783  56.454  69.886  1.00 59.67 ? ? ? ? ? ? 419 HOH B O   1 
+HETATM 5584 O O   . HOH D 2 .   ? 9.287   54.924  62.562  1.00 55.31 ? ? ? ? ? ? 420 HOH B O   1 
+HETATM 5585 O O   . HOH D 2 .   ? 6.435   26.733  64.945  1.00 45.61 ? ? ? ? ? ? 421 HOH B O   1 
+HETATM 5586 O O   . HOH D 2 .   ? 27.163  48.475  71.511  1.00 36.69 ? ? ? ? ? ? 422 HOH B O   1 
+HETATM 5587 O O   . HOH D 2 .   ? 32.717  39.475  56.975  1.00 66.63 ? ? ? ? ? ? 423 HOH B O   1 
+HETATM 5588 O O   . HOH D 2 .   ? 13.945  54.932  62.936  1.00 44.37 ? ? ? ? ? ? 424 HOH B O   1 
+HETATM 5589 O O   . HOH D 2 .   ? -16.352 27.758  82.727  1.00 59.88 ? ? ? ? ? ? 425 HOH B O   1 
+HETATM 5590 O O   . HOH D 2 .   ? -10.226 28.273  58.851  1.00 22.92 ? ? ? ? ? ? 426 HOH B O   1 
+HETATM 5591 O O   . HOH D 2 .   ? 15.345  37.556  43.119  1.00 30.79 ? ? ? ? ? ? 427 HOH B O   1 
+HETATM 5592 O O   . HOH D 2 .   ? 14.902  34.782  60.183  1.00 29.59 ? ? ? ? ? ? 428 HOH B O   1 
+HETATM 5593 O O   . HOH D 2 .   ? 12.342  40.180  92.912  1.00 35.70 ? ? ? ? ? ? 429 HOH B O   1 
+HETATM 5594 O O   . HOH D 2 .   ? 18.635  30.601  57.111  1.00 30.88 ? ? ? ? ? ? 430 HOH B O   1 
+HETATM 5595 O O   . HOH D 2 .   ? -7.115  10.825  84.024  1.00 40.05 ? ? ? ? ? ? 431 HOH B O   1 
+HETATM 5596 O O   . HOH D 2 .   ? 22.562  46.248  86.460  1.00 37.42 ? ? ? ? ? ? 432 HOH B O   1 
+HETATM 5597 O O   . HOH D 2 .   ? 14.941  53.849  75.753  1.00 44.97 ? ? ? ? ? ? 433 HOH B O   1 
+HETATM 5598 O O   . HOH D 2 .   ? 6.418   51.509  76.317  1.00 42.82 ? ? ? ? ? ? 434 HOH B O   1 
+HETATM 5599 O O   . HOH D 2 .   ? -3.377  13.540  89.150  1.00 49.63 ? ? ? ? ? ? 435 HOH B O   1 
+HETATM 5600 O O   . HOH D 2 .   ? 17.524  26.763  66.833  1.00 45.16 ? ? ? ? ? ? 436 HOH B O   1 
+HETATM 5601 O O   . HOH D 2 .   ? 14.163  52.054  80.027  1.00 42.40 ? ? ? ? ? ? 437 HOH B O   1 
+HETATM 5602 O O   . HOH D 2 .   ? -14.268 19.606  63.930  1.00 53.29 ? ? ? ? ? ? 438 HOH B O   1 
+HETATM 5603 O O   . HOH D 2 .   ? 24.388  33.353  87.899  1.00 51.55 ? ? ? ? ? ? 439 HOH B O   1 
+HETATM 5604 O O   . HOH D 2 .   ? 26.499  35.132  53.196  1.00 50.30 ? ? ? ? ? ? 440 HOH B O   1 
+HETATM 5605 O O   . HOH D 2 .   ? 20.910  24.375  68.203  1.00 41.47 ? ? ? ? ? ? 441 HOH B O   1 
+HETATM 5606 O O   . HOH D 2 .   ? 12.592  22.023  74.150  1.00 48.62 ? ? ? ? ? ? 442 HOH B O   1 
+HETATM 5607 O O   . HOH D 2 .   ? 27.810  51.436  60.171  1.00 47.01 ? ? ? ? ? ? 443 HOH B O   1 
+HETATM 5608 O O   . HOH D 2 .   ? 20.572  32.850  90.940  1.00 39.22 ? ? ? ? ? ? 444 HOH B O   1 
+HETATM 5609 O O   . HOH D 2 .   ? 7.283   45.036  85.904  1.00 47.83 ? ? ? ? ? ? 445 HOH B O   1 
+HETATM 5610 O O   . HOH D 2 .   ? 19.416  49.282  52.360  1.00 62.10 ? ? ? ? ? ? 446 HOH B O   1 
+HETATM 5611 O O   . HOH D 2 .   ? -6.500  47.108  60.081  1.00 46.04 ? ? ? ? ? ? 447 HOH B O   1 
+HETATM 5612 O O   . HOH D 2 .   ? 29.110  49.027  69.273  1.00 40.84 ? ? ? ? ? ? 448 HOH B O   1 
+HETATM 5613 O O   . HOH D 2 .   ? 23.798  27.669  65.029  1.00 46.57 ? ? ? ? ? ? 449 HOH B O   1 
+HETATM 5614 O O   . HOH D 2 .   ? -15.229 44.157  67.678  1.00 50.74 ? ? ? ? ? ? 450 HOH B O   1 
+HETATM 5615 O O   . HOH D 2 .   ? 18.882  25.750  65.244  1.00 45.94 ? ? ? ? ? ? 451 HOH B O   1 
+HETATM 5616 O O   . HOH D 2 .   ? 16.513  52.748  52.843  1.00 51.82 ? ? ? ? ? ? 452 HOH B O   1 
+HETATM 5617 O O   . HOH D 2 .   ? 30.078  50.954  62.668  1.00 65.77 ? ? ? ? ? ? 453 HOH B O   1 
+HETATM 5618 O O   . HOH D 2 .   ? -13.923 24.553  83.514  1.00 42.38 ? ? ? ? ? ? 454 HOH B O   1 
+HETATM 5619 O O   . HOH D 2 .   ? 11.887  26.977  67.039  1.00 50.06 ? ? ? ? ? ? 455 HOH B O   1 
+HETATM 5620 O O   . HOH D 2 .   ? 4.457   32.773  95.166  1.00 54.07 ? ? ? ? ? ? 456 HOH B O   1 
+HETATM 5621 O O   . HOH D 2 .   ? 22.641  45.784  49.039  1.00 62.26 ? ? ? ? ? ? 457 HOH B O   1 
+# 
+loop_
+_pdbx_poly_seq_scheme.asym_id 
+_pdbx_poly_seq_scheme.entity_id 
+_pdbx_poly_seq_scheme.seq_id 
+_pdbx_poly_seq_scheme.mon_id 
+_pdbx_poly_seq_scheme.ndb_seq_num 
+_pdbx_poly_seq_scheme.pdb_seq_num 
+_pdbx_poly_seq_scheme.auth_seq_num 
+_pdbx_poly_seq_scheme.pdb_mon_id 
+_pdbx_poly_seq_scheme.auth_mon_id 
+_pdbx_poly_seq_scheme.pdb_strand_id 
+_pdbx_poly_seq_scheme.pdb_ins_code 
+_pdbx_poly_seq_scheme.hetero 
+A 1 1   PRO 1   491 ?   ?   ?   A . n 
+A 1 2   GLY 2   492 ?   ?   ?   A . n 
+A 1 3   GLN 3   493 ?   ?   ?   A . n 
+A 1 4   GLY 4   494 ?   ?   ?   A . n 
+A 1 5   ASP 5   495 ?   ?   ?   A . n 
+A 1 6   VAL 6   496 ?   ?   ?   A . n 
+A 1 7   GLN 7   497 ?   ?   ?   A . n 
+A 1 8   THR 8   498 ?   ?   ?   A . n 
+A 1 9   PRO 9   499 ?   ?   ?   A . n 
+A 1 10  ASN 10  500 ?   ?   ?   A . n 
+A 1 11  PRO 11  501 ?   ?   ?   A . n 
+A 1 12  SER 12  502 ?   ?   ?   A . n 
+A 1 13  VAL 13  503 ?   ?   ?   A . n 
+A 1 14  THR 14  504 ?   ?   ?   A . n 
+A 1 15  PRO 15  505 ?   ?   ?   A . n 
+A 1 16  THR 16  506 ?   ?   ?   A . n 
+A 1 17  GLN 17  507 ?   ?   ?   A . n 
+A 1 18  THR 18  508 ?   ?   ?   A . n 
+A 1 19  PRO 19  509 ?   ?   ?   A . n 
+A 1 20  ILE 20  510 ?   ?   ?   A . n 
+A 1 21  PRO 21  511 ?   ?   ?   A . n 
+A 1 22  THR 22  512 ?   ?   ?   A . n 
+A 1 23  ILE 23  513 ?   ?   ?   A . n 
+A 1 24  SER 24  514 ?   ?   ?   A . n 
+A 1 25  GLY 25  515 ?   ?   ?   A . n 
+A 1 26  ASN 26  516 516 ASN ASN A . n 
+A 1 27  ALA 27  517 517 ALA ALA A . n 
+A 1 28  LEU 28  518 518 LEU LEU A . n 
+A 1 29  ARG 29  519 519 ARG ARG A . n 
+A 1 30  ASP 30  520 520 ASP ASP A . n 
+A 1 31  TYR 31  521 521 TYR TYR A . n 
+A 1 32  ALA 32  522 522 ALA ALA A . n 
+A 1 33  GLU 33  523 523 GLU GLU A . n 
+A 1 34  ALA 34  524 524 ALA ALA A . n 
+A 1 35  ARG 35  525 525 ARG ARG A . n 
+A 1 36  GLY 36  526 526 GLY GLY A . n 
+A 1 37  ILE 37  527 527 ILE ILE A . n 
+A 1 38  LYS 38  528 528 LYS LYS A . n 
+A 1 39  ILE 39  529 529 ILE ILE A . n 
+A 1 40  GLY 40  530 530 GLY GLY A . n 
+A 1 41  THR 41  531 531 THR THR A . n 
+A 1 42  CYS 42  532 532 CYS CYS A . n 
+A 1 43  VAL 43  533 533 VAL VAL A . n 
+A 1 44  ASN 44  534 534 ASN ASN A . n 
+A 1 45  TYR 45  535 535 TYR TYR A . n 
+A 1 46  PRO 46  536 536 PRO PRO A . n 
+A 1 47  PHE 47  537 537 PHE PHE A . n 
+A 1 48  TYR 48  538 538 TYR TYR A . n 
+A 1 49  ASN 49  539 539 ASN ASN A . n 
+A 1 50  ASN 50  540 540 ASN ASN A . n 
+A 1 51  SER 51  541 541 SER SER A . n 
+A 1 52  ASP 52  542 542 ASP ASP A . n 
+A 1 53  PRO 53  543 543 PRO PRO A . n 
+A 1 54  THR 54  544 544 THR THR A . n 
+A 1 55  TYR 55  545 545 TYR TYR A . n 
+A 1 56  ASN 56  546 546 ASN ASN A . n 
+A 1 57  SER 57  547 547 SER SER A . n 
+A 1 58  ILE 58  548 548 ILE ILE A . n 
+A 1 59  LEU 59  549 549 LEU LEU A . n 
+A 1 60  GLN 60  550 550 GLN GLN A . n 
+A 1 61  ARG 61  551 551 ARG ARG A . n 
+A 1 62  GLU 62  552 552 GLU GLU A . n 
+A 1 63  PHE 63  553 553 PHE PHE A . n 
+A 1 64  SER 64  554 554 SER SER A . n 
+A 1 65  MET 65  555 555 MET MET A . n 
+A 1 66  VAL 66  556 556 VAL VAL A . n 
+A 1 67  VAL 67  557 557 VAL VAL A . n 
+A 1 68  CYS 68  558 558 CYS CYS A . n 
+A 1 69  GLU 69  559 559 GLU GLU A . n 
+A 1 70  ASN 70  560 560 ASN ASN A . n 
+A 1 71  GLU 71  561 561 GLU GLU A . n 
+A 1 72  MET 72  562 562 MET MET A . n 
+A 1 73  LYS 73  563 563 LYS LYS A . n 
+A 1 74  PHE 74  564 564 PHE PHE A . n 
+A 1 75  ASP 75  565 565 ASP ASP A . n 
+A 1 76  ALA 76  566 566 ALA ALA A . n 
+A 1 77  LEU 77  567 567 LEU LEU A . n 
+A 1 78  GLN 78  568 568 GLN GLN A . n 
+A 1 79  PRO 79  569 569 PRO PRO A . n 
+A 1 80  ARG 80  570 570 ARG ARG A . n 
+A 1 81  GLN 81  571 571 GLN GLN A . n 
+A 1 82  ASN 82  572 572 ASN ASN A . n 
+A 1 83  VAL 83  573 573 VAL VAL A . n 
+A 1 84  PHE 84  574 574 PHE PHE A . n 
+A 1 85  ASP 85  575 575 ASP ASP A . n 
+A 1 86  PHE 86  576 576 PHE PHE A . n 
+A 1 87  SER 87  577 577 SER SER A . n 
+A 1 88  LYS 88  578 578 LYS LYS A . n 
+A 1 89  GLY 89  579 579 GLY GLY A . n 
+A 1 90  ASP 90  580 580 ASP ASP A . n 
+A 1 91  GLN 91  581 581 GLN GLN A . n 
+A 1 92  LEU 92  582 582 LEU LEU A . n 
+A 1 93  LEU 93  583 583 LEU LEU A . n 
+A 1 94  ALA 94  584 584 ALA ALA A . n 
+A 1 95  PHE 95  585 585 PHE PHE A . n 
+A 1 96  ALA 96  586 586 ALA ALA A . n 
+A 1 97  GLU 97  587 587 GLU GLU A . n 
+A 1 98  ARG 98  588 588 ARG ARG A . n 
+A 1 99  ASN 99  589 589 ASN ASN A . n 
+A 1 100 GLY 100 590 590 GLY GLY A . n 
+A 1 101 MET 101 591 591 MET MET A . n 
+A 1 102 GLN 102 592 592 GLN GLN A . n 
+A 1 103 MET 103 593 593 MET MET A . n 
+A 1 104 ARG 104 594 594 ARG ARG A . n 
+A 1 105 GLY 105 595 595 GLY GLY A . n 
+A 1 106 HIS 106 596 596 HIS HIS A . n 
+A 1 107 THR 107 597 597 THR THR A . n 
+A 1 108 LEU 108 598 598 LEU LEU A . n 
+A 1 109 ILE 109 599 599 ILE ILE A . n 
+A 1 110 TRP 110 600 600 TRP TRP A . n 
+A 1 111 HIS 111 601 601 HIS HIS A . n 
+A 1 112 ASN 112 602 602 ASN ASN A . n 
+A 1 113 GLN 113 603 603 GLN GLN A . n 
+A 1 114 ASN 114 604 604 ASN ASN A . n 
+A 1 115 PRO 115 605 605 PRO PRO A . n 
+A 1 116 SER 116 606 606 SER SER A . n 
+A 1 117 TRP 117 607 607 TRP TRP A . n 
+A 1 118 LEU 118 608 608 LEU LEU A . n 
+A 1 119 THR 119 609 609 THR THR A . n 
+A 1 120 ASN 120 610 610 ASN ASN A . n 
+A 1 121 GLY 121 611 611 GLY GLY A . n 
+A 1 122 ASN 122 612 612 ASN ASN A . n 
+A 1 123 TRP 123 613 613 TRP TRP A . n 
+A 1 124 ASN 124 614 614 ASN ASN A . n 
+A 1 125 ARG 125 615 615 ARG ARG A . n 
+A 1 126 ASP 126 616 616 ASP ASP A . n 
+A 1 127 SER 127 617 617 SER SER A . n 
+A 1 128 LEU 128 618 618 LEU LEU A . n 
+A 1 129 LEU 129 619 619 LEU LEU A . n 
+A 1 130 ALA 130 620 620 ALA ALA A . n 
+A 1 131 VAL 131 621 621 VAL VAL A . n 
+A 1 132 MET 132 622 622 MET MET A . n 
+A 1 133 LYS 133 623 623 LYS LYS A . n 
+A 1 134 ASN 134 624 624 ASN ASN A . n 
+A 1 135 HIS 135 625 625 HIS HIS A . n 
+A 1 136 ILE 136 626 626 ILE ILE A . n 
+A 1 137 THR 137 627 627 THR THR A . n 
+A 1 138 THR 138 628 628 THR THR A . n 
+A 1 139 VAL 139 629 629 VAL VAL A . n 
+A 1 140 MET 140 630 630 MET MET A . n 
+A 1 141 THR 141 631 631 THR THR A . n 
+A 1 142 HIS 142 632 632 HIS HIS A . n 
+A 1 143 TYR 143 633 633 TYR TYR A . n 
+A 1 144 LYS 144 634 634 LYS LYS A . n 
+A 1 145 GLY 145 635 635 GLY GLY A . n 
+A 1 146 LYS 146 636 636 LYS LYS A . n 
+A 1 147 ILE 147 637 637 ILE ILE A . n 
+A 1 148 VAL 148 638 638 VAL VAL A . n 
+A 1 149 GLU 149 639 639 GLU GLU A . n 
+A 1 150 TRP 150 640 640 TRP TRP A . n 
+A 1 151 ASP 151 641 641 ASP ASP A . n 
+A 1 152 VAL 152 642 642 VAL VAL A . n 
+A 1 153 ALA 153 643 643 ALA ALA A . n 
+A 1 154 ASN 154 644 644 ASN ASN A . n 
+A 1 155 GLU 155 645 645 GLU GLU A . n 
+A 1 156 CYS 156 646 646 CYS CYS A . n 
+A 1 157 MET 157 647 647 MET MET A . n 
+A 1 158 ASP 158 648 648 ASP ASP A . n 
+A 1 159 ASP 159 649 649 ASP ASP A . n 
+A 1 160 SER 160 650 650 SER SER A . n 
+A 1 161 GLY 161 651 651 GLY GLY A . n 
+A 1 162 ASN 162 652 652 ASN ASN A . n 
+A 1 163 GLY 163 653 653 GLY GLY A . n 
+A 1 164 LEU 164 654 654 LEU LEU A . n 
+A 1 165 ARG 165 655 655 ARG ARG A . n 
+A 1 166 SER 166 656 656 SER SER A . n 
+A 1 167 SER 167 657 657 SER SER A . n 
+A 1 168 ILE 168 658 658 ILE ILE A . n 
+A 1 169 TRP 169 659 659 TRP TRP A . n 
+A 1 170 ARG 170 660 660 ARG ARG A . n 
+A 1 171 ASN 171 661 661 ASN ASN A . n 
+A 1 172 VAL 172 662 662 VAL VAL A . n 
+A 1 173 ILE 173 663 663 ILE ILE A . n 
+A 1 174 GLY 174 664 664 GLY GLY A . n 
+A 1 175 GLN 175 665 665 GLN GLN A . n 
+A 1 176 ASP 176 666 666 ASP ASP A . n 
+A 1 177 TYR 177 667 667 TYR TYR A . n 
+A 1 178 LEU 178 668 668 LEU LEU A . n 
+A 1 179 ASP 179 669 669 ASP ASP A . n 
+A 1 180 TYR 180 670 670 TYR TYR A . n 
+A 1 181 ALA 181 671 671 ALA ALA A . n 
+A 1 182 PHE 182 672 672 PHE PHE A . n 
+A 1 183 ARG 183 673 673 ARG ARG A . n 
+A 1 184 TYR 184 674 674 TYR TYR A . n 
+A 1 185 ALA 185 675 675 ALA ALA A . n 
+A 1 186 ARG 186 676 676 ARG ARG A . n 
+A 1 187 GLU 187 677 677 GLU GLU A . n 
+A 1 188 ALA 188 678 678 ALA ALA A . n 
+A 1 189 ASP 189 679 679 ASP ASP A . n 
+A 1 190 PRO 190 680 680 PRO PRO A . n 
+A 1 191 ASP 191 681 681 ASP ASP A . n 
+A 1 192 ALA 192 682 682 ALA ALA A . n 
+A 1 193 LEU 193 683 683 LEU LEU A . n 
+A 1 194 LEU 194 684 684 LEU LEU A . n 
+A 1 195 PHE 195 685 685 PHE PHE A . n 
+A 1 196 TYR 196 686 686 TYR TYR A . n 
+A 1 197 ASN 197 687 687 ASN ASN A . n 
+A 1 198 ASP 198 688 688 ASP ASP A . n 
+A 1 199 TYR 199 689 689 TYR TYR A . n 
+A 1 200 ASN 200 690 690 ASN ASN A . n 
+A 1 201 ILE 201 691 691 ILE ILE A . n 
+A 1 202 GLU 202 692 692 GLU GLU A . n 
+A 1 203 ASP 203 693 693 ASP ASP A . n 
+A 1 204 LEU 204 694 694 LEU LEU A . n 
+A 1 205 GLY 205 695 695 GLY GLY A . n 
+A 1 206 PRO 206 696 696 PRO PRO A . n 
+A 1 207 LYS 207 697 697 LYS LYS A . n 
+A 1 208 SER 208 698 698 SER SER A . n 
+A 1 209 ASN 209 699 699 ASN ASN A . n 
+A 1 210 ALA 210 700 700 ALA ALA A . n 
+A 1 211 VAL 211 701 701 VAL VAL A . n 
+A 1 212 PHE 212 702 702 PHE PHE A . n 
+A 1 213 ASN 213 703 703 ASN ASN A . n 
+A 1 214 MET 214 704 704 MET MET A . n 
+A 1 215 ILE 215 705 705 ILE ILE A . n 
+A 1 216 LYS 216 706 706 LYS LYS A . n 
+A 1 217 SER 217 707 707 SER SER A . n 
+A 1 218 MET 218 708 708 MET MET A . n 
+A 1 219 LYS 219 709 709 LYS LYS A . n 
+A 1 220 GLU 220 710 710 GLU GLU A . n 
+A 1 221 ARG 221 711 711 ARG ARG A . n 
+A 1 222 GLY 222 712 712 GLY GLY A . n 
+A 1 223 VAL 223 713 713 VAL VAL A . n 
+A 1 224 PRO 224 714 714 PRO PRO A . n 
+A 1 225 ILE 225 715 715 ILE ILE A . n 
+A 1 226 ASP 226 716 716 ASP ASP A . n 
+A 1 227 GLY 227 717 717 GLY GLY A . n 
+A 1 228 VAL 228 718 718 VAL VAL A . n 
+A 1 229 GLY 229 719 719 GLY GLY A . n 
+A 1 230 PHE 230 720 720 PHE PHE A . n 
+A 1 231 GLN 231 721 721 GLN GLN A . n 
+A 1 232 CYS 232 722 722 CYS CYS A . n 
+A 1 233 HIS 233 723 723 HIS HIS A . n 
+A 1 234 PHE 234 724 724 PHE PHE A . n 
+A 1 235 ILE 235 725 725 ILE ILE A . n 
+A 1 236 ASN 236 726 726 ASN ASN A . n 
+A 1 237 GLY 237 727 727 GLY GLY A . n 
+A 1 238 MET 238 728 728 MET MET A . n 
+A 1 239 SER 239 729 729 SER SER A . n 
+A 1 240 PRO 240 730 730 PRO PRO A . n 
+A 1 241 GLU 241 731 731 GLU GLU A . n 
+A 1 242 TYR 242 732 732 TYR TYR A . n 
+A 1 243 LEU 243 733 733 LEU LEU A . n 
+A 1 244 ALA 244 734 734 ALA ALA A . n 
+A 1 245 SER 245 735 735 SER SER A . n 
+A 1 246 ILE 246 736 736 ILE ILE A . n 
+A 1 247 ASP 247 737 737 ASP ASP A . n 
+A 1 248 GLN 248 738 738 GLN GLN A . n 
+A 1 249 ASN 249 739 739 ASN ASN A . n 
+A 1 250 ILE 250 740 740 ILE ILE A . n 
+A 1 251 LYS 251 741 741 LYS LYS A . n 
+A 1 252 ARG 252 742 742 ARG ARG A . n 
+A 1 253 TYR 253 743 743 TYR TYR A . n 
+A 1 254 ALA 254 744 744 ALA ALA A . n 
+A 1 255 GLU 255 745 745 GLU GLU A . n 
+A 1 256 ILE 256 746 746 ILE ILE A . n 
+A 1 257 GLY 257 747 747 GLY GLY A . n 
+A 1 258 VAL 258 748 748 VAL VAL A . n 
+A 1 259 ILE 259 749 749 ILE ILE A . n 
+A 1 260 VAL 260 750 750 VAL VAL A . n 
+A 1 261 SER 261 751 751 SER SER A . n 
+A 1 262 PHE 262 752 752 PHE PHE A . n 
+A 1 263 THR 263 753 753 THR THR A . n 
+A 1 264 GLU 264 754 754 GLU GLU A . n 
+A 1 265 ILE 265 755 755 ILE ILE A . n 
+A 1 266 ASP 266 756 756 ASP ASP A . n 
+A 1 267 ILE 267 757 757 ILE ILE A . n 
+A 1 268 ARG 268 758 758 ARG ARG A . n 
+A 1 269 ILE 269 759 759 ILE ILE A . n 
+A 1 270 PRO 270 760 760 PRO PRO A . n 
+A 1 271 GLN 271 761 761 GLN GLN A . n 
+A 1 272 SER 272 762 762 SER SER A . n 
+A 1 273 GLU 273 763 763 GLU GLU A . n 
+A 1 274 ASN 274 764 764 ASN ASN A . n 
+A 1 275 PRO 275 765 765 PRO PRO A . n 
+A 1 276 ALA 276 766 766 ALA ALA A . n 
+A 1 277 THR 277 767 767 THR THR A . n 
+A 1 278 ALA 278 768 768 ALA ALA A . n 
+A 1 279 PHE 279 769 769 PHE PHE A . n 
+A 1 280 GLN 280 770 770 GLN GLN A . n 
+A 1 281 VAL 281 771 771 VAL VAL A . n 
+A 1 282 GLN 282 772 772 GLN GLN A . n 
+A 1 283 ALA 283 773 773 ALA ALA A . n 
+A 1 284 ASN 284 774 774 ASN ASN A . n 
+A 1 285 ASN 285 775 775 ASN ASN A . n 
+A 1 286 TYR 286 776 776 TYR TYR A . n 
+A 1 287 LYS 287 777 777 LYS LYS A . n 
+A 1 288 GLU 288 778 778 GLU GLU A . n 
+A 1 289 LEU 289 779 779 LEU LEU A . n 
+A 1 290 MET 290 780 780 MET MET A . n 
+A 1 291 LYS 291 781 781 LYS LYS A . n 
+A 1 292 ILE 292 782 782 ILE ILE A . n 
+A 1 293 CYS 293 783 783 CYS CYS A . n 
+A 1 294 LEU 294 784 784 LEU LEU A . n 
+A 1 295 ALA 295 785 785 ALA ALA A . n 
+A 1 296 ASN 296 786 786 ASN ASN A . n 
+A 1 297 PRO 297 787 787 PRO PRO A . n 
+A 1 298 ASN 298 788 788 ASN ASN A . n 
+A 1 299 CYS 299 789 789 CYS CYS A . n 
+A 1 300 ASN 300 790 790 ASN ASN A . n 
+A 1 301 THR 301 791 791 THR THR A . n 
+A 1 302 PHE 302 792 792 PHE PHE A . n 
+A 1 303 VAL 303 793 793 VAL VAL A . n 
+A 1 304 MET 304 794 794 MET MET A . n 
+A 1 305 TRP 305 795 795 TRP TRP A . n 
+A 1 306 GLY 306 796 796 GLY GLY A . n 
+A 1 307 PHE 307 797 797 PHE PHE A . n 
+A 1 308 THR 308 798 798 THR THR A . n 
+A 1 309 ASP 309 799 799 ASP ASP A . n 
+A 1 310 LYS 310 800 800 LYS LYS A . n 
+A 1 311 TYR 311 801 801 TYR TYR A . n 
+A 1 312 THR 312 802 802 THR THR A . n 
+A 1 313 TRP 313 803 803 TRP TRP A . n 
+A 1 314 ILE 314 804 804 ILE ILE A . n 
+A 1 315 PRO 315 805 805 PRO PRO A . n 
+A 1 316 GLY 316 806 806 GLY GLY A . n 
+A 1 317 THR 317 807 807 THR THR A . n 
+A 1 318 PHE 318 808 808 PHE PHE A . n 
+A 1 319 PRO 319 809 809 PRO PRO A . n 
+A 1 320 GLY 320 810 810 GLY GLY A . n 
+A 1 321 TYR 321 811 811 TYR TYR A . n 
+A 1 322 GLY 322 812 812 GLY GLY A . n 
+A 1 323 ASN 323 813 813 ASN ASN A . n 
+A 1 324 PRO 324 814 814 PRO PRO A . n 
+A 1 325 LEU 325 815 815 LEU LEU A . n 
+A 1 326 ILE 326 816 816 ILE ILE A . n 
+A 1 327 TYR 327 817 817 TYR TYR A . n 
+A 1 328 ASP 328 818 818 ASP ASP A . n 
+A 1 329 SER 329 819 819 SER SER A . n 
+A 1 330 ASN 330 820 820 ASN ASN A . n 
+A 1 331 TYR 331 821 821 TYR TYR A . n 
+A 1 332 ASN 332 822 822 ASN ASN A . n 
+A 1 333 PRO 333 823 823 PRO PRO A . n 
+A 1 334 LYS 334 824 824 LYS LYS A . n 
+A 1 335 PRO 335 825 825 PRO PRO A . n 
+A 1 336 ALA 336 826 826 ALA ALA A . n 
+A 1 337 TYR 337 827 827 TYR TYR A . n 
+A 1 338 ASN 338 828 828 ASN ASN A . n 
+A 1 339 ALA 339 829 829 ALA ALA A . n 
+A 1 340 ILE 340 830 830 ILE ILE A . n 
+A 1 341 LYS 341 831 831 LYS LYS A . n 
+A 1 342 GLU 342 832 832 GLU GLU A . n 
+A 1 343 ALA 343 833 833 ALA ALA A . n 
+A 1 344 LEU 344 834 834 LEU LEU A . n 
+A 1 345 MET 345 835 835 MET MET A . n 
+A 1 346 GLY 346 836 ?   ?   ?   A . n 
+A 1 347 TYR 347 837 ?   ?   ?   A . n 
+B 1 1   PRO 1   491 ?   ?   ?   B . n 
+B 1 2   GLY 2   492 ?   ?   ?   B . n 
+B 1 3   GLN 3   493 ?   ?   ?   B . n 
+B 1 4   GLY 4   494 ?   ?   ?   B . n 
+B 1 5   ASP 5   495 ?   ?   ?   B . n 
+B 1 6   VAL 6   496 ?   ?   ?   B . n 
+B 1 7   GLN 7   497 ?   ?   ?   B . n 
+B 1 8   THR 8   498 ?   ?   ?   B . n 
+B 1 9   PRO 9   499 ?   ?   ?   B . n 
+B 1 10  ASN 10  500 ?   ?   ?   B . n 
+B 1 11  PRO 11  501 ?   ?   ?   B . n 
+B 1 12  SER 12  502 ?   ?   ?   B . n 
+B 1 13  VAL 13  503 ?   ?   ?   B . n 
+B 1 14  THR 14  504 ?   ?   ?   B . n 
+B 1 15  PRO 15  505 ?   ?   ?   B . n 
+B 1 16  THR 16  506 ?   ?   ?   B . n 
+B 1 17  GLN 17  507 ?   ?   ?   B . n 
+B 1 18  THR 18  508 ?   ?   ?   B . n 
+B 1 19  PRO 19  509 ?   ?   ?   B . n 
+B 1 20  ILE 20  510 ?   ?   ?   B . n 
+B 1 21  PRO 21  511 ?   ?   ?   B . n 
+B 1 22  THR 22  512 ?   ?   ?   B . n 
+B 1 23  ILE 23  513 ?   ?   ?   B . n 
+B 1 24  SER 24  514 ?   ?   ?   B . n 
+B 1 25  GLY 25  515 ?   ?   ?   B . n 
+B 1 26  ASN 26  516 516 ASN ASN B . n 
+B 1 27  ALA 27  517 517 ALA ALA B . n 
+B 1 28  LEU 28  518 518 LEU LEU B . n 
+B 1 29  ARG 29  519 519 ARG ARG B . n 
+B 1 30  ASP 30  520 520 ASP ASP B . n 
+B 1 31  TYR 31  521 521 TYR TYR B . n 
+B 1 32  ALA 32  522 522 ALA ALA B . n 
+B 1 33  GLU 33  523 523 GLU GLU B . n 
+B 1 34  ALA 34  524 524 ALA ALA B . n 
+B 1 35  ARG 35  525 525 ARG ARG B . n 
+B 1 36  GLY 36  526 526 GLY GLY B . n 
+B 1 37  ILE 37  527 527 ILE ILE B . n 
+B 1 38  LYS 38  528 528 LYS LYS B . n 
+B 1 39  ILE 39  529 529 ILE ILE B . n 
+B 1 40  GLY 40  530 530 GLY GLY B . n 
+B 1 41  THR 41  531 531 THR THR B . n 
+B 1 42  CYS 42  532 532 CYS CYS B . n 
+B 1 43  VAL 43  533 533 VAL VAL B . n 
+B 1 44  ASN 44  534 534 ASN ASN B . n 
+B 1 45  TYR 45  535 535 TYR TYR B . n 
+B 1 46  PRO 46  536 536 PRO PRO B . n 
+B 1 47  PHE 47  537 537 PHE PHE B . n 
+B 1 48  TYR 48  538 538 TYR TYR B . n 
+B 1 49  ASN 49  539 539 ASN ASN B . n 
+B 1 50  ASN 50  540 540 ASN ASN B . n 
+B 1 51  SER 51  541 541 SER SER B . n 
+B 1 52  ASP 52  542 542 ASP ASP B . n 
+B 1 53  PRO 53  543 543 PRO PRO B . n 
+B 1 54  THR 54  544 544 THR THR B . n 
+B 1 55  TYR 55  545 545 TYR TYR B . n 
+B 1 56  ASN 56  546 546 ASN ASN B . n 
+B 1 57  SER 57  547 547 SER SER B . n 
+B 1 58  ILE 58  548 548 ILE ILE B . n 
+B 1 59  LEU 59  549 549 LEU LEU B . n 
+B 1 60  GLN 60  550 550 GLN GLN B . n 
+B 1 61  ARG 61  551 551 ARG ARG B . n 
+B 1 62  GLU 62  552 552 GLU GLU B . n 
+B 1 63  PHE 63  553 553 PHE PHE B . n 
+B 1 64  SER 64  554 554 SER SER B . n 
+B 1 65  MET 65  555 555 MET MET B . n 
+B 1 66  VAL 66  556 556 VAL VAL B . n 
+B 1 67  VAL 67  557 557 VAL VAL B . n 
+B 1 68  CYS 68  558 558 CYS CYS B . n 
+B 1 69  GLU 69  559 559 GLU GLU B . n 
+B 1 70  ASN 70  560 560 ASN ASN B . n 
+B 1 71  GLU 71  561 561 GLU GLU B . n 
+B 1 72  MET 72  562 562 MET MET B . n 
+B 1 73  LYS 73  563 563 LYS LYS B . n 
+B 1 74  PHE 74  564 564 PHE PHE B . n 
+B 1 75  ASP 75  565 565 ASP ASP B . n 
+B 1 76  ALA 76  566 566 ALA ALA B . n 
+B 1 77  LEU 77  567 567 LEU LEU B . n 
+B 1 78  GLN 78  568 568 GLN GLN B . n 
+B 1 79  PRO 79  569 569 PRO PRO B . n 
+B 1 80  ARG 80  570 570 ARG ARG B . n 
+B 1 81  GLN 81  571 571 GLN GLN B . n 
+B 1 82  ASN 82  572 572 ASN ASN B . n 
+B 1 83  VAL 83  573 573 VAL VAL B . n 
+B 1 84  PHE 84  574 574 PHE PHE B . n 
+B 1 85  ASP 85  575 575 ASP ASP B . n 
+B 1 86  PHE 86  576 576 PHE PHE B . n 
+B 1 87  SER 87  577 577 SER SER B . n 
+B 1 88  LYS 88  578 578 LYS LYS B . n 
+B 1 89  GLY 89  579 579 GLY GLY B . n 
+B 1 90  ASP 90  580 580 ASP ASP B . n 
+B 1 91  GLN 91  581 581 GLN GLN B . n 
+B 1 92  LEU 92  582 582 LEU LEU B . n 
+B 1 93  LEU 93  583 583 LEU LEU B . n 
+B 1 94  ALA 94  584 584 ALA ALA B . n 
+B 1 95  PHE 95  585 585 PHE PHE B . n 
+B 1 96  ALA 96  586 586 ALA ALA B . n 
+B 1 97  GLU 97  587 587 GLU GLU B . n 
+B 1 98  ARG 98  588 588 ARG ARG B . n 
+B 1 99  ASN 99  589 589 ASN ASN B . n 
+B 1 100 GLY 100 590 590 GLY GLY B . n 
+B 1 101 MET 101 591 591 MET MET B . n 
+B 1 102 GLN 102 592 592 GLN GLN B . n 
+B 1 103 MET 103 593 593 MET MET B . n 
+B 1 104 ARG 104 594 594 ARG ARG B . n 
+B 1 105 GLY 105 595 595 GLY GLY B . n 
+B 1 106 HIS 106 596 596 HIS HIS B . n 
+B 1 107 THR 107 597 597 THR THR B . n 
+B 1 108 LEU 108 598 598 LEU LEU B . n 
+B 1 109 ILE 109 599 599 ILE ILE B . n 
+B 1 110 TRP 110 600 600 TRP TRP B . n 
+B 1 111 HIS 111 601 601 HIS HIS B . n 
+B 1 112 ASN 112 602 602 ASN ASN B . n 
+B 1 113 GLN 113 603 603 GLN GLN B . n 
+B 1 114 ASN 114 604 604 ASN ASN B . n 
+B 1 115 PRO 115 605 605 PRO PRO B . n 
+B 1 116 SER 116 606 606 SER SER B . n 
+B 1 117 TRP 117 607 607 TRP TRP B . n 
+B 1 118 LEU 118 608 608 LEU LEU B . n 
+B 1 119 THR 119 609 609 THR THR B . n 
+B 1 120 ASN 120 610 610 ASN ASN B . n 
+B 1 121 GLY 121 611 611 GLY GLY B . n 
+B 1 122 ASN 122 612 612 ASN ASN B . n 
+B 1 123 TRP 123 613 613 TRP TRP B . n 
+B 1 124 ASN 124 614 614 ASN ASN B . n 
+B 1 125 ARG 125 615 615 ARG ARG B . n 
+B 1 126 ASP 126 616 616 ASP ASP B . n 
+B 1 127 SER 127 617 617 SER SER B . n 
+B 1 128 LEU 128 618 618 LEU LEU B . n 
+B 1 129 LEU 129 619 619 LEU LEU B . n 
+B 1 130 ALA 130 620 620 ALA ALA B . n 
+B 1 131 VAL 131 621 621 VAL VAL B . n 
+B 1 132 MET 132 622 622 MET MET B . n 
+B 1 133 LYS 133 623 623 LYS LYS B . n 
+B 1 134 ASN 134 624 624 ASN ASN B . n 
+B 1 135 HIS 135 625 625 HIS HIS B . n 
+B 1 136 ILE 136 626 626 ILE ILE B . n 
+B 1 137 THR 137 627 627 THR THR B . n 
+B 1 138 THR 138 628 628 THR THR B . n 
+B 1 139 VAL 139 629 629 VAL VAL B . n 
+B 1 140 MET 140 630 630 MET MET B . n 
+B 1 141 THR 141 631 631 THR THR B . n 
+B 1 142 HIS 142 632 632 HIS HIS B . n 
+B 1 143 TYR 143 633 633 TYR TYR B . n 
+B 1 144 LYS 144 634 634 LYS LYS B . n 
+B 1 145 GLY 145 635 635 GLY GLY B . n 
+B 1 146 LYS 146 636 636 LYS LYS B . n 
+B 1 147 ILE 147 637 637 ILE ILE B . n 
+B 1 148 VAL 148 638 638 VAL VAL B . n 
+B 1 149 GLU 149 639 639 GLU GLU B . n 
+B 1 150 TRP 150 640 640 TRP TRP B . n 
+B 1 151 ASP 151 641 641 ASP ASP B . n 
+B 1 152 VAL 152 642 642 VAL VAL B . n 
+B 1 153 ALA 153 643 643 ALA ALA B . n 
+B 1 154 ASN 154 644 644 ASN ASN B . n 
+B 1 155 GLU 155 645 645 GLU GLU B . n 
+B 1 156 CYS 156 646 646 CYS CYS B . n 
+B 1 157 MET 157 647 647 MET MET B . n 
+B 1 158 ASP 158 648 648 ASP ASP B . n 
+B 1 159 ASP 159 649 649 ASP ASP B . n 
+B 1 160 SER 160 650 650 SER SER B . n 
+B 1 161 GLY 161 651 651 GLY GLY B . n 
+B 1 162 ASN 162 652 652 ASN ASN B . n 
+B 1 163 GLY 163 653 653 GLY GLY B . n 
+B 1 164 LEU 164 654 654 LEU LEU B . n 
+B 1 165 ARG 165 655 655 ARG ARG B . n 
+B 1 166 SER 166 656 656 SER SER B . n 
+B 1 167 SER 167 657 657 SER SER B . n 
+B 1 168 ILE 168 658 658 ILE ILE B . n 
+B 1 169 TRP 169 659 659 TRP TRP B . n 
+B 1 170 ARG 170 660 660 ARG ARG B . n 
+B 1 171 ASN 171 661 661 ASN ASN B . n 
+B 1 172 VAL 172 662 662 VAL VAL B . n 
+B 1 173 ILE 173 663 663 ILE ILE B . n 
+B 1 174 GLY 174 664 664 GLY GLY B . n 
+B 1 175 GLN 175 665 665 GLN GLN B . n 
+B 1 176 ASP 176 666 666 ASP ASP B . n 
+B 1 177 TYR 177 667 667 TYR TYR B . n 
+B 1 178 LEU 178 668 668 LEU LEU B . n 
+B 1 179 ASP 179 669 669 ASP ASP B . n 
+B 1 180 TYR 180 670 670 TYR TYR B . n 
+B 1 181 ALA 181 671 671 ALA ALA B . n 
+B 1 182 PHE 182 672 672 PHE PHE B . n 
+B 1 183 ARG 183 673 673 ARG ARG B . n 
+B 1 184 TYR 184 674 674 TYR TYR B . n 
+B 1 185 ALA 185 675 675 ALA ALA B . n 
+B 1 186 ARG 186 676 676 ARG ARG B . n 
+B 1 187 GLU 187 677 677 GLU GLU B . n 
+B 1 188 ALA 188 678 678 ALA ALA B . n 
+B 1 189 ASP 189 679 679 ASP ASP B . n 
+B 1 190 PRO 190 680 680 PRO PRO B . n 
+B 1 191 ASP 191 681 681 ASP ASP B . n 
+B 1 192 ALA 192 682 682 ALA ALA B . n 
+B 1 193 LEU 193 683 683 LEU LEU B . n 
+B 1 194 LEU 194 684 684 LEU LEU B . n 
+B 1 195 PHE 195 685 685 PHE PHE B . n 
+B 1 196 TYR 196 686 686 TYR TYR B . n 
+B 1 197 ASN 197 687 687 ASN ASN B . n 
+B 1 198 ASP 198 688 688 ASP ASP B . n 
+B 1 199 TYR 199 689 689 TYR TYR B . n 
+B 1 200 ASN 200 690 690 ASN ASN B . n 
+B 1 201 ILE 201 691 691 ILE ILE B . n 
+B 1 202 GLU 202 692 692 GLU GLU B . n 
+B 1 203 ASP 203 693 693 ASP ASP B . n 
+B 1 204 LEU 204 694 694 LEU LEU B . n 
+B 1 205 GLY 205 695 695 GLY GLY B . n 
+B 1 206 PRO 206 696 696 PRO PRO B . n 
+B 1 207 LYS 207 697 697 LYS LYS B . n 
+B 1 208 SER 208 698 698 SER SER B . n 
+B 1 209 ASN 209 699 699 ASN ASN B . n 
+B 1 210 ALA 210 700 700 ALA ALA B . n 
+B 1 211 VAL 211 701 701 VAL VAL B . n 
+B 1 212 PHE 212 702 702 PHE PHE B . n 
+B 1 213 ASN 213 703 703 ASN ASN B . n 
+B 1 214 MET 214 704 704 MET MET B . n 
+B 1 215 ILE 215 705 705 ILE ILE B . n 
+B 1 216 LYS 216 706 706 LYS LYS B . n 
+B 1 217 SER 217 707 707 SER SER B . n 
+B 1 218 MET 218 708 708 MET MET B . n 
+B 1 219 LYS 219 709 709 LYS LYS B . n 
+B 1 220 GLU 220 710 710 GLU GLU B . n 
+B 1 221 ARG 221 711 711 ARG ARG B . n 
+B 1 222 GLY 222 712 712 GLY GLY B . n 
+B 1 223 VAL 223 713 713 VAL VAL B . n 
+B 1 224 PRO 224 714 714 PRO PRO B . n 
+B 1 225 ILE 225 715 715 ILE ILE B . n 
+B 1 226 ASP 226 716 716 ASP ASP B . n 
+B 1 227 GLY 227 717 717 GLY GLY B . n 
+B 1 228 VAL 228 718 718 VAL VAL B . n 
+B 1 229 GLY 229 719 719 GLY GLY B . n 
+B 1 230 PHE 230 720 720 PHE PHE B . n 
+B 1 231 GLN 231 721 721 GLN GLN B . n 
+B 1 232 CYS 232 722 722 CYS CYS B . n 
+B 1 233 HIS 233 723 723 HIS HIS B . n 
+B 1 234 PHE 234 724 724 PHE PHE B . n 
+B 1 235 ILE 235 725 725 ILE ILE B . n 
+B 1 236 ASN 236 726 726 ASN ASN B . n 
+B 1 237 GLY 237 727 727 GLY GLY B . n 
+B 1 238 MET 238 728 728 MET MET B . n 
+B 1 239 SER 239 729 729 SER SER B . n 
+B 1 240 PRO 240 730 730 PRO PRO B . n 
+B 1 241 GLU 241 731 731 GLU GLU B . n 
+B 1 242 TYR 242 732 732 TYR TYR B . n 
+B 1 243 LEU 243 733 733 LEU LEU B . n 
+B 1 244 ALA 244 734 734 ALA ALA B . n 
+B 1 245 SER 245 735 735 SER SER B . n 
+B 1 246 ILE 246 736 736 ILE ILE B . n 
+B 1 247 ASP 247 737 737 ASP ASP B . n 
+B 1 248 GLN 248 738 738 GLN GLN B . n 
+B 1 249 ASN 249 739 739 ASN ASN B . n 
+B 1 250 ILE 250 740 740 ILE ILE B . n 
+B 1 251 LYS 251 741 741 LYS LYS B . n 
+B 1 252 ARG 252 742 742 ARG ARG B . n 
+B 1 253 TYR 253 743 743 TYR TYR B . n 
+B 1 254 ALA 254 744 744 ALA ALA B . n 
+B 1 255 GLU 255 745 745 GLU GLU B . n 
+B 1 256 ILE 256 746 746 ILE ILE B . n 
+B 1 257 GLY 257 747 747 GLY GLY B . n 
+B 1 258 VAL 258 748 748 VAL VAL B . n 
+B 1 259 ILE 259 749 749 ILE ILE B . n 
+B 1 260 VAL 260 750 750 VAL VAL B . n 
+B 1 261 SER 261 751 751 SER SER B . n 
+B 1 262 PHE 262 752 752 PHE PHE B . n 
+B 1 263 THR 263 753 753 THR THR B . n 
+B 1 264 GLU 264 754 754 GLU GLU B . n 
+B 1 265 ILE 265 755 755 ILE ILE B . n 
+B 1 266 ASP 266 756 756 ASP ASP B . n 
+B 1 267 ILE 267 757 757 ILE ILE B . n 
+B 1 268 ARG 268 758 758 ARG ARG B . n 
+B 1 269 ILE 269 759 759 ILE ILE B . n 
+B 1 270 PRO 270 760 760 PRO PRO B . n 
+B 1 271 GLN 271 761 761 GLN GLN B . n 
+B 1 272 SER 272 762 762 SER SER B . n 
+B 1 273 GLU 273 763 763 GLU GLU B . n 
+B 1 274 ASN 274 764 764 ASN ASN B . n 
+B 1 275 PRO 275 765 765 PRO PRO B . n 
+B 1 276 ALA 276 766 766 ALA ALA B . n 
+B 1 277 THR 277 767 767 THR THR B . n 
+B 1 278 ALA 278 768 768 ALA ALA B . n 
+B 1 279 PHE 279 769 769 PHE PHE B . n 
+B 1 280 GLN 280 770 770 GLN GLN B . n 
+B 1 281 VAL 281 771 771 VAL VAL B . n 
+B 1 282 GLN 282 772 772 GLN GLN B . n 
+B 1 283 ALA 283 773 773 ALA ALA B . n 
+B 1 284 ASN 284 774 774 ASN ASN B . n 
+B 1 285 ASN 285 775 775 ASN ASN B . n 
+B 1 286 TYR 286 776 776 TYR TYR B . n 
+B 1 287 LYS 287 777 777 LYS LYS B . n 
+B 1 288 GLU 288 778 778 GLU GLU B . n 
+B 1 289 LEU 289 779 779 LEU LEU B . n 
+B 1 290 MET 290 780 780 MET MET B . n 
+B 1 291 LYS 291 781 781 LYS LYS B . n 
+B 1 292 ILE 292 782 782 ILE ILE B . n 
+B 1 293 CYS 293 783 783 CYS CYS B . n 
+B 1 294 LEU 294 784 784 LEU LEU B . n 
+B 1 295 ALA 295 785 785 ALA ALA B . n 
+B 1 296 ASN 296 786 786 ASN ASN B . n 
+B 1 297 PRO 297 787 787 PRO PRO B . n 
+B 1 298 ASN 298 788 788 ASN ASN B . n 
+B 1 299 CYS 299 789 789 CYS CYS B . n 
+B 1 300 ASN 300 790 790 ASN ASN B . n 
+B 1 301 THR 301 791 791 THR THR B . n 
+B 1 302 PHE 302 792 792 PHE PHE B . n 
+B 1 303 VAL 303 793 793 VAL VAL B . n 
+B 1 304 MET 304 794 794 MET MET B . n 
+B 1 305 TRP 305 795 795 TRP TRP B . n 
+B 1 306 GLY 306 796 796 GLY GLY B . n 
+B 1 307 PHE 307 797 797 PHE PHE B . n 
+B 1 308 THR 308 798 798 THR THR B . n 
+B 1 309 ASP 309 799 799 ASP ASP B . n 
+B 1 310 LYS 310 800 800 LYS LYS B . n 
+B 1 311 TYR 311 801 801 TYR TYR B . n 
+B 1 312 THR 312 802 802 THR THR B . n 
+B 1 313 TRP 313 803 803 TRP TRP B . n 
+B 1 314 ILE 314 804 804 ILE ILE B . n 
+B 1 315 PRO 315 805 805 PRO PRO B . n 
+B 1 316 GLY 316 806 806 GLY GLY B . n 
+B 1 317 THR 317 807 807 THR THR B . n 
+B 1 318 PHE 318 808 808 PHE PHE B . n 
+B 1 319 PRO 319 809 809 PRO PRO B . n 
+B 1 320 GLY 320 810 810 GLY GLY B . n 
+B 1 321 TYR 321 811 811 TYR TYR B . n 
+B 1 322 GLY 322 812 812 GLY GLY B . n 
+B 1 323 ASN 323 813 813 ASN ASN B . n 
+B 1 324 PRO 324 814 814 PRO PRO B . n 
+B 1 325 LEU 325 815 815 LEU LEU B . n 
+B 1 326 ILE 326 816 816 ILE ILE B . n 
+B 1 327 TYR 327 817 817 TYR TYR B . n 
+B 1 328 ASP 328 818 818 ASP ASP B . n 
+B 1 329 SER 329 819 819 SER SER B . n 
+B 1 330 ASN 330 820 820 ASN ASN B . n 
+B 1 331 TYR 331 821 821 TYR TYR B . n 
+B 1 332 ASN 332 822 822 ASN ASN B . n 
+B 1 333 PRO 333 823 823 PRO PRO B . n 
+B 1 334 LYS 334 824 824 LYS LYS B . n 
+B 1 335 PRO 335 825 825 PRO PRO B . n 
+B 1 336 ALA 336 826 826 ALA ALA B . n 
+B 1 337 TYR 337 827 827 TYR TYR B . n 
+B 1 338 ASN 338 828 828 ASN ASN B . n 
+B 1 339 ALA 339 829 829 ALA ALA B . n 
+B 1 340 ILE 340 830 830 ILE ILE B . n 
+B 1 341 LYS 341 831 831 LYS LYS B . n 
+B 1 342 GLU 342 832 832 GLU GLU B . n 
+B 1 343 ALA 343 833 833 ALA ALA B . n 
+B 1 344 LEU 344 834 834 LEU LEU B . n 
+B 1 345 MET 345 835 835 MET MET B . n 
+B 1 346 GLY 346 836 ?   ?   ?   B . n 
+B 1 347 TYR 347 837 ?   ?   ?   B . n 
+# 
+loop_
+_pdbx_version.entry_id 
+_pdbx_version.revision_date 
+_pdbx_version.major_version 
+_pdbx_version.minor_version 
+_pdbx_version.revision_type 
+_pdbx_version.details 
+1XYZ 2008-03-24 3 2    'Version format compliance' 'compliance with PDB format V.3.15'          
+1XYZ 2011-07-13 4 0000 'Version format compliance' 'compliance with PDB Exchange Dictionary V4' 
+# 
+loop_
+_software.name 
+_software.classification 
+_software.version 
+_software.citation_id 
+_software.pdbx_ordinal 
+ARP/wARP 'model building' . ? 1 
+X-PLOR   'model building' . ? 2 
+ARP/wARP refinement       . ? 3 
+X-PLOR   refinement       . ? 4 
+# 
+loop_
+_pdbx_unobs_or_zero_occ_residues.id 
+_pdbx_unobs_or_zero_occ_residues.polymer_flag 
+_pdbx_unobs_or_zero_occ_residues.occupancy_flag 
+_pdbx_unobs_or_zero_occ_residues.PDB_model_num 
+_pdbx_unobs_or_zero_occ_residues.auth_asym_id 
+_pdbx_unobs_or_zero_occ_residues.auth_comp_id 
+_pdbx_unobs_or_zero_occ_residues.auth_seq_id 
+_pdbx_unobs_or_zero_occ_residues.PDB_ins_code 
+1  Y 1 1 A PRO 491 ? 
+2  Y 1 1 A GLY 492 ? 
+3  Y 1 1 A GLN 493 ? 
+4  Y 1 1 A GLY 494 ? 
+5  Y 1 1 A ASP 495 ? 
+6  Y 1 1 A VAL 496 ? 
+7  Y 1 1 A GLN 497 ? 
+8  Y 1 1 A THR 498 ? 
+9  Y 1 1 A PRO 499 ? 
+10 Y 1 1 A ASN 500 ? 
+11 Y 1 1 A PRO 501 ? 
+12 Y 1 1 A SER 502 ? 
+13 Y 1 1 A VAL 503 ? 
+14 Y 1 1 A THR 504 ? 
+15 Y 1 1 A PRO 505 ? 
+16 Y 1 1 A THR 506 ? 
+17 Y 1 1 A GLN 507 ? 
+18 Y 1 1 A THR 508 ? 
+19 Y 1 1 A PRO 509 ? 
+20 Y 1 1 A ILE 510 ? 
+21 Y 1 1 A PRO 511 ? 
+22 Y 1 1 A THR 512 ? 
+23 Y 1 1 A ILE 513 ? 
+24 Y 1 1 A SER 514 ? 
+25 Y 1 1 A GLY 515 ? 
+26 Y 1 1 A GLY 836 ? 
+27 Y 1 1 A TYR 837 ? 
+28 Y 1 1 B PRO 491 ? 
+29 Y 1 1 B GLY 492 ? 
+30 Y 1 1 B GLN 493 ? 
+31 Y 1 1 B GLY 494 ? 
+32 Y 1 1 B ASP 495 ? 
+33 Y 1 1 B VAL 496 ? 
+34 Y 1 1 B GLN 497 ? 
+35 Y 1 1 B THR 498 ? 
+36 Y 1 1 B PRO 499 ? 
+37 Y 1 1 B ASN 500 ? 
+38 Y 1 1 B PRO 501 ? 
+39 Y 1 1 B SER 502 ? 
+40 Y 1 1 B VAL 503 ? 
+41 Y 1 1 B THR 504 ? 
+42 Y 1 1 B PRO 505 ? 
+43 Y 1 1 B THR 506 ? 
+44 Y 1 1 B GLN 507 ? 
+45 Y 1 1 B THR 508 ? 
+46 Y 1 1 B PRO 509 ? 
+47 Y 1 1 B ILE 510 ? 
+48 Y 1 1 B PRO 511 ? 
+49 Y 1 1 B THR 512 ? 
+50 Y 1 1 B ILE 513 ? 
+51 Y 1 1 B SER 514 ? 
+52 Y 1 1 B GLY 515 ? 
+53 Y 1 1 B GLY 836 ? 
+54 Y 1 1 B TYR 837 ? 
+# 
+loop_
+_pdbx_struct_assembly.id 
+_pdbx_struct_assembly.details 
+_pdbx_struct_assembly.method_details 
+_pdbx_struct_assembly.oligomeric_details 
+_pdbx_struct_assembly.oligomeric_count 
+1 author_defined_assembly ? monomeric 1 
+2 author_defined_assembly ? monomeric 1 
+# 
+loop_
+_pdbx_struct_assembly_gen.assembly_id 
+_pdbx_struct_assembly_gen.oper_expression 
+_pdbx_struct_assembly_gen.asym_id_list 
+1 1 A,C 
+2 1 B,D 
+# 
+_pdbx_struct_oper_list.id                   1 
+_pdbx_struct_oper_list.type                 'identity operation' 
+_pdbx_struct_oper_list.name                 1_555 
+_pdbx_struct_oper_list.symmetry_operation   x,y,z 
+_pdbx_struct_oper_list.matrix[1][1]         1.0000000000 
+_pdbx_struct_oper_list.matrix[1][2]         0.0000000000 
+_pdbx_struct_oper_list.matrix[1][3]         0.0000000000 
+_pdbx_struct_oper_list.vector[1]            0.0000000000 
+_pdbx_struct_oper_list.matrix[2][1]         0.0000000000 
+_pdbx_struct_oper_list.matrix[2][2]         1.0000000000 
+_pdbx_struct_oper_list.matrix[2][3]         0.0000000000 
+_pdbx_struct_oper_list.vector[2]            0.0000000000 
+_pdbx_struct_oper_list.matrix[3][1]         0.0000000000 
+_pdbx_struct_oper_list.matrix[3][2]         0.0000000000 
+_pdbx_struct_oper_list.matrix[3][3]         1.0000000000 
+_pdbx_struct_oper_list.vector[3]            0.0000000000 
+# 
+loop_
+_pdbx_nonpoly_scheme.asym_id 
+_pdbx_nonpoly_scheme.entity_id 
+_pdbx_nonpoly_scheme.mon_id 
+_pdbx_nonpoly_scheme.ndb_seq_num 
+_pdbx_nonpoly_scheme.pdb_seq_num 
+_pdbx_nonpoly_scheme.auth_seq_num 
+_pdbx_nonpoly_scheme.pdb_mon_id 
+_pdbx_nonpoly_scheme.auth_mon_id 
+_pdbx_nonpoly_scheme.pdb_strand_id 
+_pdbx_nonpoly_scheme.pdb_ins_code 
+C 2 HOH 1   1   1   HOH HOH A . 
+C 2 HOH 2   2   2   HOH HOH A . 
+C 2 HOH 3   3   3   HOH HOH A . 
+C 2 HOH 4   4   4   HOH HOH A . 
+C 2 HOH 5   5   5   HOH HOH A . 
+C 2 HOH 6   6   6   HOH HOH A . 
+C 2 HOH 7   7   7   HOH HOH A . 
+C 2 HOH 8   8   8   HOH HOH A . 
+C 2 HOH 9   9   9   HOH HOH A . 
+C 2 HOH 10  10  10  HOH HOH A . 
+C 2 HOH 11  11  11  HOH HOH A . 
+C 2 HOH 12  12  12  HOH HOH A . 
+C 2 HOH 13  13  13  HOH HOH A . 
+C 2 HOH 14  14  14  HOH HOH A . 
+C 2 HOH 15  15  15  HOH HOH A . 
+C 2 HOH 16  16  16  HOH HOH A . 
+C 2 HOH 17  17  17  HOH HOH A . 
+C 2 HOH 18  18  18  HOH HOH A . 
+C 2 HOH 19  19  19  HOH HOH A . 
+C 2 HOH 20  20  20  HOH HOH A . 
+C 2 HOH 21  21  21  HOH HOH A . 
+C 2 HOH 22  22  22  HOH HOH A . 
+C 2 HOH 23  23  23  HOH HOH A . 
+C 2 HOH 24  24  24  HOH HOH A . 
+C 2 HOH 25  25  25  HOH HOH A . 
+C 2 HOH 26  26  26  HOH HOH A . 
+C 2 HOH 27  27  27  HOH HOH A . 
+C 2 HOH 28  28  28  HOH HOH A . 
+C 2 HOH 29  29  29  HOH HOH A . 
+C 2 HOH 30  30  30  HOH HOH A . 
+C 2 HOH 31  31  31  HOH HOH A . 
+C 2 HOH 32  32  32  HOH HOH A . 
+C 2 HOH 33  33  33  HOH HOH A . 
+C 2 HOH 34  34  34  HOH HOH A . 
+C 2 HOH 35  35  35  HOH HOH A . 
+C 2 HOH 36  36  36  HOH HOH A . 
+C 2 HOH 37  37  37  HOH HOH A . 
+C 2 HOH 38  38  38  HOH HOH A . 
+C 2 HOH 39  39  39  HOH HOH A . 
+C 2 HOH 40  40  40  HOH HOH A . 
+C 2 HOH 41  41  41  HOH HOH A . 
+C 2 HOH 42  42  42  HOH HOH A . 
+C 2 HOH 43  43  43  HOH HOH A . 
+C 2 HOH 44  44  44  HOH HOH A . 
+C 2 HOH 45  45  45  HOH HOH A . 
+C 2 HOH 46  46  46  HOH HOH A . 
+C 2 HOH 47  47  47  HOH HOH A . 
+C 2 HOH 48  48  48  HOH HOH A . 
+C 2 HOH 49  49  49  HOH HOH A . 
+C 2 HOH 50  50  50  HOH HOH A . 
+C 2 HOH 51  51  51  HOH HOH A . 
+C 2 HOH 52  52  52  HOH HOH A . 
+C 2 HOH 53  53  53  HOH HOH A . 
+C 2 HOH 54  54  54  HOH HOH A . 
+C 2 HOH 55  55  55  HOH HOH A . 
+C 2 HOH 56  56  56  HOH HOH A . 
+C 2 HOH 57  57  57  HOH HOH A . 
+C 2 HOH 58  58  58  HOH HOH A . 
+C 2 HOH 59  59  59  HOH HOH A . 
+C 2 HOH 60  60  60  HOH HOH A . 
+C 2 HOH 61  61  61  HOH HOH A . 
+C 2 HOH 62  62  62  HOH HOH A . 
+C 2 HOH 63  63  63  HOH HOH A . 
+C 2 HOH 64  64  64  HOH HOH A . 
+C 2 HOH 65  65  65  HOH HOH A . 
+C 2 HOH 66  66  66  HOH HOH A . 
+C 2 HOH 67  67  67  HOH HOH A . 
+C 2 HOH 68  68  68  HOH HOH A . 
+C 2 HOH 69  69  69  HOH HOH A . 
+C 2 HOH 70  70  70  HOH HOH A . 
+C 2 HOH 71  71  71  HOH HOH A . 
+C 2 HOH 72  72  72  HOH HOH A . 
+C 2 HOH 73  73  73  HOH HOH A . 
+C 2 HOH 74  74  74  HOH HOH A . 
+C 2 HOH 75  75  75  HOH HOH A . 
+C 2 HOH 76  76  76  HOH HOH A . 
+C 2 HOH 77  77  77  HOH HOH A . 
+C 2 HOH 78  78  78  HOH HOH A . 
+C 2 HOH 79  79  79  HOH HOH A . 
+C 2 HOH 80  80  80  HOH HOH A . 
+C 2 HOH 81  81  81  HOH HOH A . 
+C 2 HOH 82  82  82  HOH HOH A . 
+C 2 HOH 83  83  83  HOH HOH A . 
+C 2 HOH 84  84  84  HOH HOH A . 
+C 2 HOH 85  85  85  HOH HOH A . 
+C 2 HOH 86  86  86  HOH HOH A . 
+C 2 HOH 87  87  87  HOH HOH A . 
+C 2 HOH 88  88  88  HOH HOH A . 
+C 2 HOH 89  89  89  HOH HOH A . 
+C 2 HOH 90  90  90  HOH HOH A . 
+C 2 HOH 91  91  91  HOH HOH A . 
+C 2 HOH 92  92  92  HOH HOH A . 
+C 2 HOH 93  93  93  HOH HOH A . 
+C 2 HOH 94  94  94  HOH HOH A . 
+C 2 HOH 95  95  95  HOH HOH A . 
+C 2 HOH 96  96  96  HOH HOH A . 
+C 2 HOH 97  97  97  HOH HOH A . 
+C 2 HOH 98  98  98  HOH HOH A . 
+C 2 HOH 99  99  99  HOH HOH A . 
+C 2 HOH 100 100 100 HOH HOH A . 
+C 2 HOH 101 101 101 HOH HOH A . 
+C 2 HOH 102 102 102 HOH HOH A . 
+C 2 HOH 103 103 103 HOH HOH A . 
+C 2 HOH 104 104 104 HOH HOH A . 
+C 2 HOH 105 105 105 HOH HOH A . 
+C 2 HOH 106 106 106 HOH HOH A . 
+C 2 HOH 107 107 107 HOH HOH A . 
+C 2 HOH 108 108 108 HOH HOH A . 
+C 2 HOH 109 109 109 HOH HOH A . 
+C 2 HOH 110 110 110 HOH HOH A . 
+C 2 HOH 111 111 111 HOH HOH A . 
+C 2 HOH 112 112 112 HOH HOH A . 
+C 2 HOH 113 113 113 HOH HOH A . 
+C 2 HOH 114 114 114 HOH HOH A . 
+C 2 HOH 115 115 115 HOH HOH A . 
+C 2 HOH 116 117 117 HOH HOH A . 
+C 2 HOH 117 118 118 HOH HOH A . 
+C 2 HOH 118 119 119 HOH HOH A . 
+C 2 HOH 119 120 120 HOH HOH A . 
+C 2 HOH 120 121 121 HOH HOH A . 
+C 2 HOH 121 122 122 HOH HOH A . 
+C 2 HOH 122 123 123 HOH HOH A . 
+C 2 HOH 123 124 124 HOH HOH A . 
+C 2 HOH 124 125 125 HOH HOH A . 
+C 2 HOH 125 126 126 HOH HOH A . 
+C 2 HOH 126 127 127 HOH HOH A . 
+C 2 HOH 127 128 128 HOH HOH A . 
+C 2 HOH 128 129 129 HOH HOH A . 
+C 2 HOH 129 130 130 HOH HOH A . 
+C 2 HOH 130 131 131 HOH HOH A . 
+C 2 HOH 131 132 132 HOH HOH A . 
+C 2 HOH 132 133 133 HOH HOH A . 
+C 2 HOH 133 134 134 HOH HOH A . 
+C 2 HOH 134 135 135 HOH HOH A . 
+C 2 HOH 135 136 136 HOH HOH A . 
+C 2 HOH 136 137 137 HOH HOH A . 
+C 2 HOH 137 138 138 HOH HOH A . 
+C 2 HOH 138 139 139 HOH HOH A . 
+C 2 HOH 139 140 140 HOH HOH A . 
+C 2 HOH 140 141 141 HOH HOH A . 
+C 2 HOH 141 142 142 HOH HOH A . 
+C 2 HOH 142 143 143 HOH HOH A . 
+C 2 HOH 143 144 144 HOH HOH A . 
+C 2 HOH 144 145 145 HOH HOH A . 
+C 2 HOH 145 146 146 HOH HOH A . 
+C 2 HOH 146 147 147 HOH HOH A . 
+C 2 HOH 147 148 148 HOH HOH A . 
+C 2 HOH 148 149 149 HOH HOH A . 
+C 2 HOH 149 150 150 HOH HOH A . 
+C 2 HOH 150 151 151 HOH HOH A . 
+C 2 HOH 151 152 152 HOH HOH A . 
+C 2 HOH 152 153 153 HOH HOH A . 
+C 2 HOH 153 154 154 HOH HOH A . 
+C 2 HOH 154 155 155 HOH HOH A . 
+C 2 HOH 155 156 156 HOH HOH A . 
+C 2 HOH 156 157 157 HOH HOH A . 
+C 2 HOH 157 158 158 HOH HOH A . 
+C 2 HOH 158 159 159 HOH HOH A . 
+C 2 HOH 159 160 160 HOH HOH A . 
+C 2 HOH 160 161 161 HOH HOH A . 
+C 2 HOH 161 162 162 HOH HOH A . 
+C 2 HOH 162 163 163 HOH HOH A . 
+C 2 HOH 163 164 164 HOH HOH A . 
+C 2 HOH 164 165 165 HOH HOH A . 
+C 2 HOH 165 166 166 HOH HOH A . 
+C 2 HOH 166 167 167 HOH HOH A . 
+C 2 HOH 167 168 168 HOH HOH A . 
+C 2 HOH 168 169 169 HOH HOH A . 
+C 2 HOH 169 170 170 HOH HOH A . 
+C 2 HOH 170 172 172 HOH HOH A . 
+C 2 HOH 171 173 173 HOH HOH A . 
+C 2 HOH 172 174 174 HOH HOH A . 
+C 2 HOH 173 175 175 HOH HOH A . 
+C 2 HOH 174 176 176 HOH HOH A . 
+C 2 HOH 175 177 177 HOH HOH A . 
+C 2 HOH 176 178 178 HOH HOH A . 
+C 2 HOH 177 179 179 HOH HOH A . 
+C 2 HOH 178 180 180 HOH HOH A . 
+C 2 HOH 179 181 181 HOH HOH A . 
+C 2 HOH 180 182 182 HOH HOH A . 
+C 2 HOH 181 183 183 HOH HOH A . 
+C 2 HOH 182 184 184 HOH HOH A . 
+C 2 HOH 183 185 185 HOH HOH A . 
+C 2 HOH 184 186 186 HOH HOH A . 
+C 2 HOH 185 187 187 HOH HOH A . 
+C 2 HOH 186 188 188 HOH HOH A . 
+C 2 HOH 187 189 189 HOH HOH A . 
+C 2 HOH 188 190 190 HOH HOH A . 
+C 2 HOH 189 191 191 HOH HOH A . 
+C 2 HOH 190 192 192 HOH HOH A . 
+C 2 HOH 191 193 193 HOH HOH A . 
+C 2 HOH 192 194 194 HOH HOH A . 
+C 2 HOH 193 195 195 HOH HOH A . 
+C 2 HOH 194 196 196 HOH HOH A . 
+C 2 HOH 195 197 197 HOH HOH A . 
+C 2 HOH 196 198 198 HOH HOH A . 
+C 2 HOH 197 199 199 HOH HOH A . 
+C 2 HOH 198 200 200 HOH HOH A . 
+C 2 HOH 199 201 201 HOH HOH A . 
+C 2 HOH 200 202 202 HOH HOH A . 
+C 2 HOH 201 203 203 HOH HOH A . 
+C 2 HOH 202 204 204 HOH HOH A . 
+C 2 HOH 203 205 205 HOH HOH A . 
+C 2 HOH 204 206 206 HOH HOH A . 
+C 2 HOH 205 207 207 HOH HOH A . 
+C 2 HOH 206 208 208 HOH HOH A . 
+C 2 HOH 207 209 209 HOH HOH A . 
+C 2 HOH 208 210 210 HOH HOH A . 
+C 2 HOH 209 211 211 HOH HOH A . 
+C 2 HOH 210 212 212 HOH HOH A . 
+C 2 HOH 211 213 213 HOH HOH A . 
+C 2 HOH 212 214 214 HOH HOH A . 
+C 2 HOH 213 215 215 HOH HOH A . 
+C 2 HOH 214 216 216 HOH HOH A . 
+C 2 HOH 215 218 218 HOH HOH A . 
+C 2 HOH 216 219 219 HOH HOH A . 
+C 2 HOH 217 220 220 HOH HOH A . 
+C 2 HOH 218 221 221 HOH HOH A . 
+C 2 HOH 219 222 222 HOH HOH A . 
+C 2 HOH 220 223 223 HOH HOH A . 
+C 2 HOH 221 224 224 HOH HOH A . 
+C 2 HOH 222 225 225 HOH HOH A . 
+C 2 HOH 223 226 226 HOH HOH A . 
+C 2 HOH 224 227 227 HOH HOH A . 
+C 2 HOH 225 228 228 HOH HOH A . 
+C 2 HOH 226 229 229 HOH HOH A . 
+C 2 HOH 227 230 230 HOH HOH A . 
+C 2 HOH 228 231 231 HOH HOH A . 
+C 2 HOH 229 233 233 HOH HOH A . 
+C 2 HOH 230 281 48  HOH HOH A . 
+C 2 HOH 231 320 87  HOH HOH A . 
+C 2 HOH 232 381 148 HOH HOH A . 
+C 2 HOH 233 393 160 HOH HOH A . 
+C 2 HOH 234 397 164 HOH HOH A . 
+D 2 HOH 1   116 116 HOH HOH B . 
+D 2 HOH 2   171 171 HOH HOH B . 
+D 2 HOH 3   217 217 HOH HOH B . 
+D 2 HOH 4   232 232 HOH HOH B . 
+D 2 HOH 5   234 1   HOH HOH B . 
+D 2 HOH 6   235 2   HOH HOH B . 
+D 2 HOH 7   236 3   HOH HOH B . 
+D 2 HOH 8   237 4   HOH HOH B . 
+D 2 HOH 9   238 5   HOH HOH B . 
+D 2 HOH 10  239 6   HOH HOH B . 
+D 2 HOH 11  240 7   HOH HOH B . 
+D 2 HOH 12  241 8   HOH HOH B . 
+D 2 HOH 13  242 9   HOH HOH B . 
+D 2 HOH 14  243 10  HOH HOH B . 
+D 2 HOH 15  244 11  HOH HOH B . 
+D 2 HOH 16  245 12  HOH HOH B . 
+D 2 HOH 17  246 13  HOH HOH B . 
+D 2 HOH 18  247 14  HOH HOH B . 
+D 2 HOH 19  248 15  HOH HOH B . 
+D 2 HOH 20  249 16  HOH HOH B . 
+D 2 HOH 21  250 17  HOH HOH B . 
+D 2 HOH 22  251 18  HOH HOH B . 
+D 2 HOH 23  252 19  HOH HOH B . 
+D 2 HOH 24  253 20  HOH HOH B . 
+D 2 HOH 25  254 21  HOH HOH B . 
+D 2 HOH 26  255 22  HOH HOH B . 
+D 2 HOH 27  256 23  HOH HOH B . 
+D 2 HOH 28  257 24  HOH HOH B . 
+D 2 HOH 29  258 25  HOH HOH B . 
+D 2 HOH 30  259 26  HOH HOH B . 
+D 2 HOH 31  260 27  HOH HOH B . 
+D 2 HOH 32  261 28  HOH HOH B . 
+D 2 HOH 33  262 29  HOH HOH B . 
+D 2 HOH 34  263 30  HOH HOH B . 
+D 2 HOH 35  264 31  HOH HOH B . 
+D 2 HOH 36  265 32  HOH HOH B . 
+D 2 HOH 37  266 33  HOH HOH B . 
+D 2 HOH 38  267 34  HOH HOH B . 
+D 2 HOH 39  268 35  HOH HOH B . 
+D 2 HOH 40  269 36  HOH HOH B . 
+D 2 HOH 41  270 37  HOH HOH B . 
+D 2 HOH 42  271 38  HOH HOH B . 
+D 2 HOH 43  272 39  HOH HOH B . 
+D 2 HOH 44  273 40  HOH HOH B . 
+D 2 HOH 45  274 41  HOH HOH B . 
+D 2 HOH 46  275 42  HOH HOH B . 
+D 2 HOH 47  276 43  HOH HOH B . 
+D 2 HOH 48  277 44  HOH HOH B . 
+D 2 HOH 49  278 45  HOH HOH B . 
+D 2 HOH 50  279 46  HOH HOH B . 
+D 2 HOH 51  280 47  HOH HOH B . 
+D 2 HOH 52  282 49  HOH HOH B . 
+D 2 HOH 53  283 50  HOH HOH B . 
+D 2 HOH 54  284 51  HOH HOH B . 
+D 2 HOH 55  285 52  HOH HOH B . 
+D 2 HOH 56  286 53  HOH HOH B . 
+D 2 HOH 57  287 54  HOH HOH B . 
+D 2 HOH 58  288 55  HOH HOH B . 
+D 2 HOH 59  289 56  HOH HOH B . 
+D 2 HOH 60  290 57  HOH HOH B . 
+D 2 HOH 61  291 58  HOH HOH B . 
+D 2 HOH 62  292 59  HOH HOH B . 
+D 2 HOH 63  293 60  HOH HOH B . 
+D 2 HOH 64  294 61  HOH HOH B . 
+D 2 HOH 65  295 62  HOH HOH B . 
+D 2 HOH 66  296 63  HOH HOH B . 
+D 2 HOH 67  297 64  HOH HOH B . 
+D 2 HOH 68  298 65  HOH HOH B . 
+D 2 HOH 69  299 66  HOH HOH B . 
+D 2 HOH 70  300 67  HOH HOH B . 
+D 2 HOH 71  301 68  HOH HOH B . 
+D 2 HOH 72  302 69  HOH HOH B . 
+D 2 HOH 73  303 70  HOH HOH B . 
+D 2 HOH 74  304 71  HOH HOH B . 
+D 2 HOH 75  305 72  HOH HOH B . 
+D 2 HOH 76  306 73  HOH HOH B . 
+D 2 HOH 77  307 74  HOH HOH B . 
+D 2 HOH 78  308 75  HOH HOH B . 
+D 2 HOH 79  309 76  HOH HOH B . 
+D 2 HOH 80  310 77  HOH HOH B . 
+D 2 HOH 81  311 78  HOH HOH B . 
+D 2 HOH 82  312 79  HOH HOH B . 
+D 2 HOH 83  313 80  HOH HOH B . 
+D 2 HOH 84  314 81  HOH HOH B . 
+D 2 HOH 85  315 82  HOH HOH B . 
+D 2 HOH 86  316 83  HOH HOH B . 
+D 2 HOH 87  317 84  HOH HOH B . 
+D 2 HOH 88  318 85  HOH HOH B . 
+D 2 HOH 89  319 86  HOH HOH B . 
+D 2 HOH 90  321 88  HOH HOH B . 
+D 2 HOH 91  322 89  HOH HOH B . 
+D 2 HOH 92  323 90  HOH HOH B . 
+D 2 HOH 93  324 91  HOH HOH B . 
+D 2 HOH 94  325 92  HOH HOH B . 
+D 2 HOH 95  326 93  HOH HOH B . 
+D 2 HOH 96  327 94  HOH HOH B . 
+D 2 HOH 97  328 95  HOH HOH B . 
+D 2 HOH 98  329 96  HOH HOH B . 
+D 2 HOH 99  330 97  HOH HOH B . 
+D 2 HOH 100 331 98  HOH HOH B . 
+D 2 HOH 101 332 99  HOH HOH B . 
+D 2 HOH 102 333 100 HOH HOH B . 
+D 2 HOH 103 334 101 HOH HOH B . 
+D 2 HOH 104 335 102 HOH HOH B . 
+D 2 HOH 105 336 103 HOH HOH B . 
+D 2 HOH 106 337 104 HOH HOH B . 
+D 2 HOH 107 338 105 HOH HOH B . 
+D 2 HOH 108 339 106 HOH HOH B . 
+D 2 HOH 109 340 107 HOH HOH B . 
+D 2 HOH 110 341 108 HOH HOH B . 
+D 2 HOH 111 342 109 HOH HOH B . 
+D 2 HOH 112 343 110 HOH HOH B . 
+D 2 HOH 113 344 111 HOH HOH B . 
+D 2 HOH 114 345 112 HOH HOH B . 
+D 2 HOH 115 346 113 HOH HOH B . 
+D 2 HOH 116 347 114 HOH HOH B . 
+D 2 HOH 117 348 115 HOH HOH B . 
+D 2 HOH 118 349 116 HOH HOH B . 
+D 2 HOH 119 350 117 HOH HOH B . 
+D 2 HOH 120 351 118 HOH HOH B . 
+D 2 HOH 121 352 119 HOH HOH B . 
+D 2 HOH 122 353 120 HOH HOH B . 
+D 2 HOH 123 354 121 HOH HOH B . 
+D 2 HOH 124 355 122 HOH HOH B . 
+D 2 HOH 125 356 123 HOH HOH B . 
+D 2 HOH 126 357 124 HOH HOH B . 
+D 2 HOH 127 358 125 HOH HOH B . 
+D 2 HOH 128 359 126 HOH HOH B . 
+D 2 HOH 129 360 127 HOH HOH B . 
+D 2 HOH 130 361 128 HOH HOH B . 
+D 2 HOH 131 362 129 HOH HOH B . 
+D 2 HOH 132 363 130 HOH HOH B . 
+D 2 HOH 133 364 131 HOH HOH B . 
+D 2 HOH 134 365 132 HOH HOH B . 
+D 2 HOH 135 366 133 HOH HOH B . 
+D 2 HOH 136 367 134 HOH HOH B . 
+D 2 HOH 137 368 135 HOH HOH B . 
+D 2 HOH 138 369 136 HOH HOH B . 
+D 2 HOH 139 370 137 HOH HOH B . 
+D 2 HOH 140 371 138 HOH HOH B . 
+D 2 HOH 141 372 139 HOH HOH B . 
+D 2 HOH 142 373 140 HOH HOH B . 
+D 2 HOH 143 374 141 HOH HOH B . 
+D 2 HOH 144 375 142 HOH HOH B . 
+D 2 HOH 145 376 143 HOH HOH B . 
+D 2 HOH 146 377 144 HOH HOH B . 
+D 2 HOH 147 378 145 HOH HOH B . 
+D 2 HOH 148 379 146 HOH HOH B . 
+D 2 HOH 149 380 147 HOH HOH B . 
+D 2 HOH 150 382 149 HOH HOH B . 
+D 2 HOH 151 383 150 HOH HOH B . 
+D 2 HOH 152 384 151 HOH HOH B . 
+D 2 HOH 153 385 152 HOH HOH B . 
+D 2 HOH 154 386 153 HOH HOH B . 
+D 2 HOH 155 387 154 HOH HOH B . 
+D 2 HOH 156 388 155 HOH HOH B . 
+D 2 HOH 157 389 156 HOH HOH B . 
+D 2 HOH 158 390 157 HOH HOH B . 
+D 2 HOH 159 391 158 HOH HOH B . 
+D 2 HOH 160 392 159 HOH HOH B . 
+D 2 HOH 161 394 161 HOH HOH B . 
+D 2 HOH 162 395 162 HOH HOH B . 
+D 2 HOH 163 396 163 HOH HOH B . 
+D 2 HOH 164 398 165 HOH HOH B . 
+D 2 HOH 165 399 166 HOH HOH B . 
+D 2 HOH 166 400 167 HOH HOH B . 
+D 2 HOH 167 401 168 HOH HOH B . 
+D 2 HOH 168 402 169 HOH HOH B . 
+D 2 HOH 169 403 170 HOH HOH B . 
+D 2 HOH 170 404 171 HOH HOH B . 
+D 2 HOH 171 405 172 HOH HOH B . 
+D 2 HOH 172 406 173 HOH HOH B . 
+D 2 HOH 173 407 174 HOH HOH B . 
+D 2 HOH 174 408 175 HOH HOH B . 
+D 2 HOH 175 409 176 HOH HOH B . 
+D 2 HOH 176 410 177 HOH HOH B . 
+D 2 HOH 177 411 178 HOH HOH B . 
+D 2 HOH 178 412 179 HOH HOH B . 
+D 2 HOH 179 413 180 HOH HOH B . 
+D 2 HOH 180 414 181 HOH HOH B . 
+D 2 HOH 181 415 182 HOH HOH B . 
+D 2 HOH 182 416 183 HOH HOH B . 
+D 2 HOH 183 417 184 HOH HOH B . 
+D 2 HOH 184 418 185 HOH HOH B . 
+D 2 HOH 185 419 186 HOH HOH B . 
+D 2 HOH 186 420 187 HOH HOH B . 
+D 2 HOH 187 421 188 HOH HOH B . 
+D 2 HOH 188 422 189 HOH HOH B . 
+D 2 HOH 189 423 190 HOH HOH B . 
+D 2 HOH 190 424 191 HOH HOH B . 
+D 2 HOH 191 425 192 HOH HOH B . 
+D 2 HOH 192 426 193 HOH HOH B . 
+D 2 HOH 193 427 194 HOH HOH B . 
+D 2 HOH 194 428 195 HOH HOH B . 
+D 2 HOH 195 429 196 HOH HOH B . 
+D 2 HOH 196 430 197 HOH HOH B . 
+D 2 HOH 197 431 198 HOH HOH B . 
+D 2 HOH 198 432 199 HOH HOH B . 
+D 2 HOH 199 433 200 HOH HOH B . 
+D 2 HOH 200 434 201 HOH HOH B . 
+D 2 HOH 201 435 202 HOH HOH B . 
+D 2 HOH 202 436 203 HOH HOH B . 
+D 2 HOH 203 437 204 HOH HOH B . 
+D 2 HOH 204 438 205 HOH HOH B . 
+D 2 HOH 205 439 206 HOH HOH B . 
+D 2 HOH 206 440 207 HOH HOH B . 
+D 2 HOH 207 441 208 HOH HOH B . 
+D 2 HOH 208 442 209 HOH HOH B . 
+D 2 HOH 209 443 210 HOH HOH B . 
+D 2 HOH 210 444 211 HOH HOH B . 
+D 2 HOH 211 445 212 HOH HOH B . 
+D 2 HOH 212 446 213 HOH HOH B . 
+D 2 HOH 213 447 214 HOH HOH B . 
+D 2 HOH 214 448 215 HOH HOH B . 
+D 2 HOH 215 449 216 HOH HOH B . 
+D 2 HOH 216 450 217 HOH HOH B . 
+D 2 HOH 217 451 218 HOH HOH B . 
+D 2 HOH 218 452 219 HOH HOH B . 
+D 2 HOH 219 453 220 HOH HOH B . 
+D 2 HOH 220 454 221 HOH HOH B . 
+D 2 HOH 221 455 222 HOH HOH B . 
+D 2 HOH 222 456 223 HOH HOH B . 
+D 2 HOH 223 457 224 HOH HOH B . 
+# 
+loop_
+_pdbx_validate_close_contact.id 
+_pdbx_validate_close_contact.PDB_model_num 
+_pdbx_validate_close_contact.auth_atom_id_1 
+_pdbx_validate_close_contact.auth_asym_id_1 
+_pdbx_validate_close_contact.auth_comp_id_1 
+_pdbx_validate_close_contact.auth_seq_id_1 
+_pdbx_validate_close_contact.PDB_ins_code_1 
+_pdbx_validate_close_contact.label_alt_id_1 
+_pdbx_validate_close_contact.auth_atom_id_2 
+_pdbx_validate_close_contact.auth_asym_id_2 
+_pdbx_validate_close_contact.auth_comp_id_2 
+_pdbx_validate_close_contact.auth_seq_id_2 
+_pdbx_validate_close_contact.PDB_ins_code_2 
+_pdbx_validate_close_contact.label_alt_id_2 
+_pdbx_validate_close_contact.dist 
+1 1 O   A HOH 8   ? ? O A HOH 204 ? ? 2.06 
+2 1 SD  A MET 562 ? ? O A HOH 193 ? ? 2.11 
+3 1 O   B HOH 279 ? ? O B HOH 358 ? ? 2.16 
+4 1 ND2 A ASN 828 ? ? O A HOH 104 ? ? 2.17 
+5 1 O   A HOH 72  ? ? O A HOH 190 ? ? 2.17 
+6 1 O   B HOH 312 ? ? O B HOH 369 ? ? 2.18 
+7 1 O   A HOH 175 ? ? O B HOH 116 ? ? 2.19 
+# 
+loop_
+_pdbx_validate_torsion.id 
+_pdbx_validate_torsion.PDB_model_num 
+_pdbx_validate_torsion.auth_comp_id 
+_pdbx_validate_torsion.auth_asym_id 
+_pdbx_validate_torsion.auth_seq_id 
+_pdbx_validate_torsion.PDB_ins_code 
+_pdbx_validate_torsion.phi 
+_pdbx_validate_torsion.psi 
+1 1 ASP A 693 ? -91.34  -151.50 
+2 1 GLU A 754 ? -146.41 45.56   
+3 1 ASN A 813 ? 38.32   59.68   
+4 1 ASN B 560 ? -141.26 -17.68  
+5 1 ASP B 693 ? -91.02  -150.15 
+6 1 GLU B 754 ? -142.59 46.57   
+7 1 SER B 762 ? 50.65   4.24    
+8 1 ASN B 813 ? 36.76   61.25   
+# 
+loop_
+_pdbx_validate_chiral.id 
+_pdbx_validate_chiral.PDB_model_num 
+_pdbx_validate_chiral.auth_comp_id 
+_pdbx_validate_chiral.auth_asym_id 
+_pdbx_validate_chiral.auth_seq_id 
+_pdbx_validate_chiral.PDB_ins_code 
+_pdbx_validate_chiral.details 
+_pdbx_validate_chiral.omega 
+1 1 TYR A 535 ? 'Expecting L Found L OUTSIDE RANGE' 23.258 
+2 1 ILE A 816 ? 'Expecting L Found L OUTSIDE RANGE' 24.740 
+3 1 ASN B 572 ? 'Expecting L Found L OUTSIDE RANGE' 24.789 
+# 
+_pdbx_entity_nonpoly.entity_id   2 
+_pdbx_entity_nonpoly.name        water 
+_pdbx_entity_nonpoly.comp_id     HOH 
+# 
diff --git a/examples/testdata/test_fts_data_columns.conf b/examples/testdata/test_fts_data_columns.conf
new file mode 100644 (file)
index 0000000..10f5043
--- /dev/null
@@ -0,0 +1,153 @@
+uniprot_data_columns
+#
+_group.id
+_group.name
+_group.sort_order
+g1;Quality Measures;3
+g2;Cross References;2
+g3;Names & Taxonomy;1
+g4;Procedures & Softwares;4
+g5;Date Of;5
+g6;Miscellenous;6
+g7;Sequences;7
+g8;Function;8
+g9;Interaction;9
+g10;Expression;10
+g11;Gene Ontology;11
+g12;Pathology & Biotech;12
+g13;Subcellular location;13
+g14;PTM / Processing;14
+g15;Structure;15
+g16;Publications;16
+g17;Date of;17
+g18;Family & Domain;18
+#
+_data_column.primary_key;entry name
+_data_column.default_response_page_size;100
+#
+_data_column.name
+_data_column.code
+_data_column.group_id
+_data_column.data_type
+_data_column.min_col_width
+_data_column.max_col_width
+_data_column.preferred_col_width
+_data_column.is_shown_by_default
+_data_column.is_searchable
+Entry Name;entry name;String;g3;80;100;85;true;true
+Protein names;protein names;String;g3;300;1500;500;true;true
+Gene Names;genes;String;g3;50;1000;95;true;true
+Organism;organism;String;g3;50;1000;95;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
+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
+Erroneous translation;comment(ERRONEOUS TRANSLATION);String;g7;50;1000;95;false;false
+Frameshift;comment(FRAMESHIFT);String;g7;50;1000;95;false;false
+Mass spectrometry;comment(MASS SPECTROMETRY);String;g7;50;1000;95;false;false
+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
+Length;length;int;g7;50;100;95;false;true
+Mass;mass;String;g7;50;100;80;false;true
+Sequence;sequence;String;g7;50;1000;95;false;true
+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
+Non-standard residue;feature(NON STANDARD RESIDUE);String;g7;50;1000;95;false;false
+Non-terminal residue;feature(NON TERMINAL RESIDUE);String;g7;50;1000;95;false;false
+Sequence conflict;feature(SEQUENCE CONFLICT);String;g7;50;1000;95;false;false
+Sequence uncertainty;feature(SEQUENCE UNCERTAINTY);String;g7;50;1000;95;false;false
+Version (Sequence);version(sequence);String;g7;50;1000;95;false;false
+EC number;ec;String;g8;50;1000;95;false;true
+Absorption;comment(ABSORPTION);String;g8;50;1000;95;false;false
+Catalytic activity;comment(CATALYTIC ACTIVITY);String;g8;50;1000;95;false;false
+Cofactor;comment(COFACTOR);String;g8;50;1000;95;false;false
+Enzyme regulation;comment(ENZYME REGULATION);String;g8;50;1000;95;false;false
+Function [CC];comment(FUNCTION);String;g8;50;1000;95;false;false
+Kinetics;comment(KINETICS);String;g8;50;1000;95;false;false
+Pathway;comment(PATHWAY);String;g8;50;1000;95;false;false
+Redox potential;comment(REDOX POTENTIAL);String;g8;50;1000;95;false;false
+Temperature dependence;comment(TEMPERATURE DEPENDENCE);String;g8;50;1000;95;false;false
+pH dependence;comment(PH DEPENDENCE);String;g8;50;1000;95;false;false
+Active site;feature(ACTIVE SITE);String;g8;50;1000;95;false;false
+Binding site;feature(BINDING SITE);String;g8;50;1000;95;false;false
+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
+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
+Protein existence;existence;String;g6;50;1000;95;false;true
+Status;reviewed;String;g6;50;1000;95;false;true
+ALL;entry name;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
+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
+Gene ontology (GO);go;String;g11;50;1000;95;false;true
+Gene ontology (biological process);go(biological process);String;g11;50;1000;95;false;false
+Gene ontology (molecular function);go(molecular function);String;g11;50;1000;95;false;false
+Gene ontology (cellular component);go(cellular component);String;g11;50;1000;95;false;false
+Gene ontology IDs;go-id;String;g11;50;1000;95;false;true
+Allergenic properties;comment(ALLERGEN);String;g12;50;1000;95;false;false
+Biotechnological use;comment(BIOTECHNOLOGY);String;g12;50;1000;95;false;false
+Disruption phenotype;comment(DISRUPTION PHENOTYPE);String;g12;50;1000;95;false;false
+Involvement in disease;comment(DISEASE);String;g12;50;1000;95;false;false
+Pharmaceutical use;comment(PHARMACEUTICAL);String;g12;50;1000;95;false;false
+Toxic dose;comment(TOXIC DOSE);String;g12;50;1000;95;false;false
+Subcellular location [CC];comment(SUBCELLULAR LOCATION);String;g13;50;1000;95;false;false
+Intramembrane;feature(INTRAMEMBRANE);String;g13;50;1000;95;false;false
+Topological domain;feature(TOPOLOGICAL DOMAIN);String;g13;50;1000;95;false;false
+Transmembrane;feature(TRANSMEMBRANE);String;g13;50;1000;95;false;false
+Post-translational modification;comment(PTM);String;g14;50;1000;95;false;false
+Chain;feature(CHAIN);String;g14;50;1000;95;false;false
+Cross-link;feature(CROSS LINK);String;g14;50;1000;95;false;false
+Disulfide bond;feature(DISULFIDE BOND);String;g14;50;1000;95;false;false
+Glycosylation;feature(GLYCOSYLATION);String;g14;50;1000;95;false;false
+Initiator methionine;feature(INITIATOR METHIONINE);String;g14;50;1000;95;false;false
+Lipidation;feature(LIPIDATION);String;g14;50;1000;95;false;false
+Modified residue;feature(MODIFIED RESIDUE);String;g14;50;1000;95;false;false
+Peptide;feature(PEPTIDE);String;g14;50;1000;95;false;false
+Propeptide;feature(PROPEPTIDE);String;g14;50;1000;95;false;false
+Signal peptide;feature(SIGNAL);String;g14;50;1000;95;false;false
+Transit peptide;feature(TRANSIT);String;g14;50;1000;95;false;false
+3D;3d;String;g15;50;1000;95;false;false
+Beta strand;feature(BETA STRAND);String;g15;50;1000;95;false;false
+Helix;feature(HELIX);String;g15;50;1000;95;false;false
+Turn;feature(TURN);String;g15;50;1000;95;false;false
+PubMed ID;citation;String;g16;50;1000;95;false;true
+Date of creation;created;String;g17;80;150;100;true;true
+Date of last modification;last-modified;String;g17;80;150;100;true;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 [CC];comment(DOMAIN);String;g18;80;1000;95;false;false
+Sequence similarities;comment(SIMILARITY);String;g18;50;1000;95;false;false
+Protein families;families;String;g18;50;1000;95;false;true
+Coiled coil;feature(COILED COIL);String;g18;50;1000;95;false;false
+Compositional bias;feature(COMPOSITIONAL BIAS);String;g18;50;1000;95;false;false
+Domain [FT];feature(DOMAIN EXTENT);String;g18;50;1000;95;false;false
+Motif;feature(MOTIF);String;g18;50;1000;95;false;false
+Region;feature(REGION);String;g18;50;1000;95;false;false
+Repeat;feature(REPEAT);String;g18;50;1000;95;false;false
+Zinc finger;feature(ZINC FINGER);String;g18;50;1000;95;false;false
+Cross-reference (EMBL);database(EMBL);String;g2;50;1000;95;false;false
+Cross-reference (PDB);database(PDB);String;g2;50;1000;95;false;false
+Cross-reference (ENSEMBL);database(ENSEMBL);String;g2;50;1000;95;false;false
+Cross-reference (PFAM);database(PFAM);String;g2;50;1000;95;false;false
+Cross-reference (RFAM);database(RFAM);String;g2;50;1000;95;false;false
+Cross-reference (CATH);database(CATH);String;g2;50;1000;95;false;false
+Cross-reference (SCOPE);database(SCOPE);String;g2;50;1000;95;false;false
+Cross-reference (GO);database(GO);String;g2;50;1000;95;false;false
+Cross-reference (INTERPRO);database(INTERPRO);String;g2;50;1000;95;false;false
+Mapped PubMed ID;citationmapping;String;g16;50;1000;95;false;true
+#
index 9ae45b9..fe8e1a9 100755 (executable)
@@ -27,7 +27,7 @@
                                <tocitem text="PDB Sequence Fetcher" target="pdbfetcher" />
                                <tocitem text="PDB Structure Chooser" target="pdbchooser" />
                                <tocitem text="Chimera Viewer" target="chimera" />
-                               <tocitem text="Select columns by annotation" target="selectcolbyannot" />
+                               <tocitem text="Select Columns by Annotation" target="selectcolbyannot" />
                                <tocitem text="Latest Release Notes" target="release"/>
                </tocitem>
                
@@ -49,7 +49,7 @@
                <tocitem text="Viewing Trees" target="treeviewer" expand="false" />
                <tocitem text="Fetching Sequences" target="seqfetch" />         
                
-               <tocitem text="Select columns by annotation" target="selectcolbyannot" />
+               <tocitem text="Select Columns by Annotation" target="selectcolbyannot" />
                
                <tocitem text="Nucleic Acid Support" target="nucleicAcids" expand="false">
                        <tocitem text="Viewing RNA structure" target="varna" />
                        <tocitem text="Consensus" target="calcs.consensus" />
                        <tocitem text="RNA Structure Consensus" target="calcs.alstrconsensus" />
                        <tocitem text="Annotations File Format" target="annotations.fileformat" />
-                       <tocitem text="Select Column by Annotation" target="calcs.annotation" />
+                       <tocitem text="Select Columns by Annotation" target="selectcolbyannot" />
                </tocitem>
                <tocitem text="3D Structure Data" target="viewingpdbs" expand="false">
                        <tocitem text="PDB Sequence Fetcher" target="pdbfetcher" />
                                <tocitem text="Annotations Menu" target="alwAnnotations" />
                                <tocitem text="Format Menu" target="alwFormat" />
                                <tocitem text="Colour Menu" target="alwColour" />
-                               <tocitem text="Calculation Menu" target="alwCalc" />
+                               <tocitem text="Calculate Menu" target="alwCalc" />
                                <tocitem text="Web Service Menu" target="wsMenu" />
                                <tocitem text="Annotation Panel Menu" target="annotPanelMenu" />
                                <tocitem text="Popup Menu" target="popMenu" />
index 4f05b06..448efef 100755 (executable)
@@ -44,7 +44,7 @@
     conserved BLOSUM62 score (which is higher). This value is normalised
     for each column, and then plotted on a scale from 0 to 1.
   </p>
-  <p>Multiple alignment algorithms using the BLOSUM 62 substition
+  <p>Multiple alignment algorithms using the BLOSUM 62 substitution
     matrices should, in theory, maximise alignment quality for an
     un-gapped alignment, and locally maximise quality for gapped
     alignments.</p>
index 5fb900f..f6bffb0 100644 (file)
@@ -33,7 +33,7 @@
       matrix, and (since 2.8.1) is available for Tree and PCA
       calculations.</li>
     <li><a href="#simplenucleotide">Simple Nucleotide
-        Substition</a> is a (fairly) arbitrary DNA/RNA substitution matrix.</li>
+        Substitution</a> is a (fairly) arbitrary DNA/RNA substitution matrix.</li>
     <!--  <li><a href="#conservation">Conservation Matrices</a> A range of matrices for distinguishing amino-acids by physicochemical property conservation.
 </li> -->
   </ul>
index 84bc5d4..9f33b7b 100755 (executable)
@@ -83,7 +83,7 @@
         <li><em>label</em><br> Indicate that the feature
           description should be used to create a colour for features of
           this type.<br> <em>Note: if no threshold value is
-            needed then the final '|' may be ommitted.<br> This
+            needed then the final '|' may be omitted.<br> This
             keyword was added in Jalview 2.6
         </em></li>
 
 
   <p>
     If your sequence annotation is already available in GFF Format (see
-    <a href="http://www.sanger.ac.uk/resources/software/gff/spec.html">http://www.sanger.ac.uk/resources/software/gff/spec.html</a>),
+    <a href="http://gmod.org/wiki/GFF2">gmod.org/wiki/GFF2</a>),
     then you can leave it as is, after first adding a line containing
     only 'GFF' after any Jalview feature colour definitions (<em>this
       mixed format capability was added in Jalview 2.6</em>). Alternately,
 </pre>
 
   This format allows two alternate ways of referring to a sequence,
-  either by its text ID, or its index in an associated alignment.
+  either by its text ID, or its index (base 0) in an associated alignment.
   Normally, sequence features are associated with sequences rather than
   alignments, and the sequenceIndex field is given as &quot;-1&quot;. In
   order to specify a sequence by its index in a particular alignment,
index 849d7b1..9164afd 100755 (executable)
     ordering based on the average length of each feature type.
   </p>
   <p>
-    The <strong><em>transparency slider setting</em></strong> (currently
-    only available in the application version) controls the visibility
+    The <strong><em>transparency slider setting</em></strong> controls the visibility
     of features rendered below other features. Reducing the transparency
     will mean that features at the top of the list can obscure features
     lower down, and increasing it allows the user to 'see through' the
index adabdf1..9aa341b 100644 (file)
@@ -27,7 +27,7 @@
     <strong>The Groovy Shell</strong>
   </p>
   <p>
-    <a href="http://groovy.codehaus.org/">Groovy</a> is an &quot;<em>agile
+    <a href="http://www.groovy-lang.org/">Groovy</a> is an &quot;<em>agile
       and dynamic language for the Java platform</em>&quot;. The groovy
     scripting language makes it extremely easy to programmatically
     interact with Java programs, in much the same way that Javascript is
     page.
   </p>
   <p>
-    <strong><em>Getting Groovy...</em> </strong><br> Jalview Groovy
-    support is only possible if the core groovy jars which include the
-    GroovyShell are present on the CLASSPATH when Jalview is started.
-  </p>
-  <p>
-    The jars are obtained from the <em>embedded</em> directory within
-    the <a href="http://dist.codehaus.org/groovy/distributions">groovy
-      distribution</a>. The easiest way of adding them to the Jalview
-    classpath is to download and build Jalview from its source
-    distribution, and then add the groovy-all-*.jar to the lib directory
-    whose path is given in the java.ext.dirs property.
-  </p>
-  <p>
-    <strong>Opening Jalview's Groovy Console</strong><br>If groovy
-    is available, then the <strong>Tools&#8594;Groovy
-      Console...</strong> menu entry will be available from the Jalview Desktop's
-    drop-down menu. Selecting this will open the <a
-      href="http://groovy.codehaus.org/Groovy+Console"
-    >Groovy Console</a> which allows you to interactively execute Groovy
+    <strong><em>Getting Groovy...</em> </strong><br> Jalview comes with
+    an embedded installation of Groovy. All you need is to select <strong>Tools&#8594;Groovy
+      Console...</strong> menu option from the Jalview Desktop's
+    drop-down menu. After a short pause, you should then see the <a
+      href="http://groovy-lang.org/groovyconsole.html"
+    >Groovy Console</a> appear. This allows you to interactively execute Groovy
     scripts within the Jalview run-time environment.
   </p>
   <p>
index 2e9ea0c..34e8d75 100755 (executable)
         action on the whole alignment, or selected rows, columns, or
         regions.
     </em> <br></li>
+    <li><strong>Reverse, Reverse Complement</strong> (not applet)<br>
+    <em>These options are visible for nucleotide alignments. Selecting them adds the reverse (or reverse complement)
+    of the sequences (or selected region) as new sequences in the alignment. To try this out, add this sequence and
+    perform 'Reverse Complement' followed by 'Translate as cDNA':
+    <br><small>
+    Seq GTCATTTGCGCGTGTTGATTATTCGGACCGCTCCACTTCCCTTTACTCGTGCGTTCAATTGATTTAATCCTC
+    TGGGGGGGCTCTGGTTTACATAGCTTAAATCTATTCCATTCAAGGAAGCTCATG</small>
+    </em> <br></li>
     <li><strong>Get Cross-References</strong> (not applet)<br>
     <em>This option is visible where sequences have
         cross-references to other standard databases; for example, an
index 0d5b698..15c94ce 100755 (executable)
@@ -83,8 +83,8 @@
             dialog box.
         </em></li>
         <li><strong>Groovy Console...<em> (only
-              available if groovy is on the classpath)</em><br></strong> <em>Open's
-            the <a href="../groovy.html">Groovy Console</a> for
+              available if groovy is on the classpath)</em><br></strong> <em>Opens
+            the <a href="../features/groovy.html">Groovy Console</a> for
             interactive scripting.
         </em><strong><br></strong></li>
 
index 23e958c..0bb5fb7 100755 (executable)
     <tr>
       <td width="60" nowrap>
         <div align="center">
-          <strong><a name="Jalview.2.9.0b2">2.9.0b2</a><br />
-            <em>16/10/2015</em></strong>
+          <strong><a name="Jalview.2.9.1">2.9.1</a><br /> <em>1/6/2016</em></strong>
         </div>
       </td>
+      <td><em>General</em>
+        <ul>
+          <li></li>
+        </ul> <em>Application</em>
+        <ul>
+          <li></li>
+        </ul> <em>Applet</em>
+        <ul>
+          <li></li>
+        </ul></td>
       <td>
-      <em>General</em>
-      <ul>
-            <li>Time stamps for signed Jalview application and applet jars</li>
-      </ul>
+        <div align="left">
+          <em>General</em>
+          <ul>
+            <li></li>
+          </ul>
+          <em>Application</em>
+          <ul>
+            <li></li>
+          </ul>
+          <em>Applet</em>
+          <ul>
+            <li></li>
+          </ul>
+        </div>
+      </td>
+    </tr>
+    <tr>
+      <td width="60" nowrap>
+        <div align="center">
+          <strong><a name="Jalview.2.9.0b2">2.9.0b2</a><br />
+            <em>16/10/2015</em></strong>
+        </div>
       </td>
+      <td><em>General</em>
+        <ul>
+          <li>Time stamps for signed Jalview application and applet
+            jars</li>
+        </ul></td>
       <td>
         <div align="left">
-        <em>Application</em><ul>
-          <li>Duplicate group consensus and conservation rows shown when tree is partitioned</li>
-            <li>Erratic behaviour when tree partitions made with multiple cDNA/Protein split views</li>
-            </ul>
+          <em>Application</em>
+          <ul>
+            <li>Duplicate group consensus and conservation rows
+              shown when tree is partitioned</li>
+            <li>Erratic behaviour when tree partitions made with
+              multiple cDNA/Protein split views</li>
+          </ul>
         </div>
       </td>
     </tr>
             <em>8/10/2015</em></strong>
         </div>
       </td>
-      <td>
-      <em>General</em>
+      <td><em>General</em>
+        <ul>
+          <li>Updated Spanish translations of localized text for
+            2.9</li>
+        </ul> <em>Application</em>
       <ul>
-            <li>Updated Spanish translations of localized text for 2.9</li>
-      </ul>
-      <em>Application</em><ul>
-      <!-- <li>cDNA/Protein splitframe window geometry preserved in Jalview projects</li>-->
-      <li>Signed OSX InstallAnywhere installer<br></li>
-      <li>Support for per-sequence based annotations in BioJSON</li></ul>
-        <em>Applet</em>
-        <ul><li>Split frame example added to applet examples page</li>
-            </ul>
-      </td>
+          <!-- <li>cDNA/Protein splitframe window geometry preserved in Jalview projects</li>-->
+          <li>Signed OSX InstallAnywhere installer<br></li>
+          <li>Support for per-sequence based annotations in BioJSON</li>
+        </ul> <em>Applet</em>
+        <ul>
+          <li>Split frame example added to applet examples page</li>
+        </ul></td>
       <td>
         <div align="left">
-        <em>General</em>
+          <em>General</em>
           <ul>
-            <li>Mapping of cDNA to protein in split frames incorrect when sequence start > 1</li>
-            <li>Broken images in filter column by annotation dialog documentation</li>
+            <li>Mapping of cDNA to protein in split frames
+              incorrect when sequence start > 1</li>
+            <li>Broken images in filter column by annotation dialog
+              documentation</li>
             <li>Feature colours not parsed from features file</li>
-            <li>Exceptions and incomplete link URLs recovered when loading a features file containing HTML tags in feature description</li>
-            
+            <li>Exceptions and incomplete link URLs recovered when
+              loading a features file containing HTML tags in feature
+              description</li>
+
           </ul>
-      <em>Application</em><ul>
-            <li>Annotations corrupted after BioJS export and reimport</li>
-            <li>Incorrect sequence limits after Fetch DB References with 'trim retrieved sequences'</li>
-            <li>Incorrect warning about deleting all data when deleting selected columns</li>
-            <li>Patch to build system for shipping properly signed JNLP templates for webstart launch</li>
-            <li>EMBL-PDBe fetcher/viewer dialogs do not offer unreleased structures for download or viewing</li>
-            <li>Tab/space/return keystroke operation of EMBL-PDBe fetcher/viewer dialogs works correctly</li>
-            <li>Disabled 'minimise' button on Jalview windows running on OSX to workaround redraw hang bug</li>
-            <li>Split cDNA/Protein view position and geometry not recovered from jalview project</li>
-            <li>Initial enabled/disabled state of annotation menu sorter 'show autocalculated first/last' corresponds to alignment view</li>
-            <li>Restoring of Clustal, RNA Helices and T-Coffee color schemes from BioJSON</li>
-            </ul>
-      <em>Applet</em><ul>
-            <li>Reorder sequences mirrored in cDNA/Protein split frame</li>
+          <em>Application</em>
+          <ul>
+            <li>Annotations corrupted after BioJS export and
+              reimport</li>
+            <li>Incorrect sequence limits after Fetch DB References
+              with 'trim retrieved sequences'</li>
+            <li>Incorrect warning about deleting all data when
+              deleting selected columns</li>
+            <li>Patch to build system for shipping properly signed
+              JNLP templates for webstart launch</li>
+            <li>EMBL-PDBe fetcher/viewer dialogs do not offer
+              unreleased structures for download or viewing</li>
+            <li>Tab/space/return keystroke operation of EMBL-PDBe
+              fetcher/viewer dialogs works correctly</li>
+            <li>Disabled 'minimise' button on Jalview windows
+              running on OSX to workaround redraw hang bug</li>
+            <li>Split cDNA/Protein view position and geometry not
+              recovered from jalview project</li>
+            <li>Initial enabled/disabled state of annotation menu
+              sorter 'show autocalculated first/last' corresponds to
+              alignment view</li>
+            <li>Restoring of Clustal, RNA Helices and T-Coffee
+              color schemes from BioJSON</li>
+          </ul>
+          <em>Applet</em>
+          <ul>
+            <li>Reorder sequences mirrored in cDNA/Protein split
+              frame</li>
             <li>Applet with Jmol examples not loading correctly</li>
-            </ul>
+          </ul>
         </div>
       </td>
     </tr>
     <tr>
       <td><div align="center">
           <strong><a name="Jalview.2.8.0b1">2.8.0b1</a><br />
-          <em>30/1/2014</em></strong>
+            <em>30/1/2014</em></strong>
         </div></td>
       <td>
         <ul>
         <ul>
           <li>URL links generated from description line for
             regular-expression based URL links (applet and application)
+
           
           <li>Non-positional feature URL links are shown in link
             menu</li>
           <li>Cancel button for DAS Feature Fetching
           <li>PCA and PDB Viewers zoom via mouse roller
           <li>User-defined sub-tree colours and sub-tree selection
+
           
           <li>'New Window' button on the 'Output to Text box'
         </ul>
           <li>Fixed Remove Empty Columns Bug (empty columns at end
             of alignment)
           <li>Slowed DAS Feature Fetching for increased robustness.
+
           
           <li>Made angle brackets in ASCII feature descriptions
             display correctly
           <li>WsDbFetch query/result association resolved
           <li>Tree leaf to sequence mapping improved
           <li>Smooth fonts switch moved to FontChooser dialog box.
+
           
         </ul>
       </td>
diff --git a/lib/biojava-core-4.1.0.jar b/lib/biojava-core-4.1.0.jar
new file mode 100644 (file)
index 0000000..5a09c1f
Binary files /dev/null and b/lib/biojava-core-4.1.0.jar differ
diff --git a/lib/biojava-ontology-4.1.0.jar b/lib/biojava-ontology-4.1.0.jar
new file mode 100644 (file)
index 0000000..80737d5
Binary files /dev/null and b/lib/biojava-ontology-4.1.0.jar differ
index 1cfc700..5070435 100644 (file)
Binary files a/lib/castor-1.1-cycle-xml.jar and b/lib/castor-1.1-cycle-xml.jar differ
diff --git a/lib/groovy-all-1.8.2.jar b/lib/groovy-all-1.8.2.jar
deleted file mode 100644 (file)
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 (file)
index 0000000..5f3d51c
Binary files /dev/null and b/lib/groovy-all-2.4.6-indy.jar differ
diff --git a/lib/htsjdk-1.133.jar b/lib/htsjdk-1.133.jar
new file mode 100644 (file)
index 0000000..f084258
Binary files /dev/null and b/lib/htsjdk-1.133.jar differ
index 7ad030a..ea5a1f4 100644 (file)
Binary files a/lib/min-jabaws-client-2.1.0.jar and b/lib/min-jabaws-client-2.1.0.jar differ
index 429fe77..182e0da 100644 (file)
Binary files a/lib/quaqua-filechooser-only-8.0.jar and b/lib/quaqua-filechooser-only-8.0.jar differ
old mode 100755 (executable)
new mode 100644 (file)
diff --git a/resources/fts/pdb_data_columns.txt b/resources/fts/pdb_data_columns.txt
new file mode 100644 (file)
index 0000000..95f2dd1
--- /dev/null
@@ -0,0 +1,109 @@
+pdb_data_columns
+#
+_group.id
+_group.name
+_group.sort_order
+g1;Quality Measures;1
+g2;Cross References;2
+g3;Names & Taxonomy;3
+g4;Procedures & Softwares;4
+g5;Date Of;5
+g6;Miscellenous;6
+#
+_data_column.primary_key;pdb_id
+_data_column.default_response_page_size;100
+#
+_data_column.name
+_data_column.code
+_data_column.group_id
+_data_column.data_type
+_data_column.min_col_width
+_data_column.max_col_width
+_data_column.preferred_col_width
+_data_column.is_shown_by_default
+_data_column.is_searchable
+PDB Id;pdb_id;String;g2;40;60;45;true;true
+Title;title;String;g6;300;1500;400;true;false
+Molecule;molecule_name;String;g3;50;400;95;false;true
+Molecule Type;molecule_type;String;g3;50;400;95;false;true
+Sequence;molecule_sequence;String;g6;50;400;95;false;false
+PFAM Accession;pfam_accession;String;g2;50;400;95;false;true
+PFAM Name;pfam_name;String;g3;50;400;95;false;true
+InterPro Name;interpro_name;String;g3;50;400;95;false;false
+InterPro Accession;interpro_accession;String;g2;50;400;95;false;false
+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
+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
+Assembly Type;assembly_type;String;g6;50;400;95;false;false
+Space Group;spacegroup;String;g6;50;400;95;false;false
+Cath Code;cath_code;String;g2;50;400;95;false;false
+Tax Id;tax_id;String;g2;50;400;95;false;false
+Tax Query;tax_query;String;g2;50;400;95;false;false
+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
+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
+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
+Crystallisation Ph;crystallisation_ph;String;g6;50;400;95;false;false
+Biological Function;biological_function;String;g6;50;400;95;false;false
+Biological Process;biological_process;String;g6;50;400;95;false;false
+Biological Cell Component;biological_cell_component;String;g6;50;400;95;false;false
+Compound Name;compound_name;String;g3;50;400;95;false;false
+Compound Id;compound_id;String;g2;50;400;95;false;false
+Compound Weight;compound_weight;String;g6;50;400;95;false;false
+Compound Systematic Name;compound_systematic_name;String;g3;50;400;95;false;false
+Interacting Ligands;interacting_ligands;String;g6;50;400;95;false;false
+Journal;journal;String;g6;50;400;95;false;false
+All Authors;all_authors;String;g6;50;400;95;false;false
+Experiment Data Available;experiment_data_available;String;g6;50;400;95;false;false
+Diffraction Protocol;diffraction_protocol;String;g4;50;400;95;false;false
+Refinement Software;refinement_software;String;g4;50;400;95;false;false
+Structure Determination Method;structure_determination_method;String;g4;50;400;95;false;false
+Synchrotron Site;synchrotron_site;String;g6;50;400;95;false;false
+Sample Preparation Method;sample_preparation_method;String;g4;50;400;95;false;false
+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
+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
+Data Scalling Software;data_scaling_software;String;g4;50;400;95;false;false
+Detector;detector;String;g6;50;400;95;false;false
+Detector Type;detector_type;String;g6;50;400;95;false;false
+Modified Residue Flag;modified_residue_flag;String;g6;50;400;95;false;false
+Number of Copies;number_of_copies;int;g6;50;400;95;false;false
+Struc Asym Id;struct_asym_id;String;g2;50;400;95;false;false
+Homologus PDB Entity Id;homologus_pdb_entity_id;String;g2;50;400;95;false;false
+Molecule Synonym;molecule_synonym;String;g6;50;400;95;false;false
+Deposition Site;deposition_site;String;g6;50;400;95;false;false
+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
+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
new file mode 100644 (file)
index 0000000..6c78c16
--- /dev/null
@@ -0,0 +1,154 @@
+uniprot_data_columns
+#
+_group.id
+_group.name
+_group.sort_order
+g1;Quality Measures;3
+g2;Cross References;2
+g3;Names & Taxonomy;1
+g4;Procedures & Softwares;4
+g5;Date Of;5
+g6;Miscellenous;6
+g7;Sequences;7
+g8;Function;8
+g9;Interaction;9
+g10;Expression;10
+g11;Gene Ontology;11
+g12;Pathology & Biotech;12
+g13;Subcellular location;13
+g14;PTM / Processing;14
+g15;Structure;15
+g16;Publications;16
+g17;Date of;17
+g18;Family & Domain;18
+#
+_data_column.primary_key;id
+_data_column.default_response_page_size;500
+#
+_data_column.name
+_data_column.code|_data_column.alt_code (optional: used for specifying search code when different from original code)
+_data_column.group_id
+_data_column.data_type
+_data_column.min_col_width
+_data_column.max_col_width
+_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
+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
+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
+Erroneous translation;comment(ERRONEOUS TRANSLATION);String;g7;50;1000;95;false;false
+Frameshift;comment(FRAMESHIFT);String;g7;50;1000;95;false;false
+Mass spectrometry;comment(MASS SPECTROMETRY);String;g7;50;1000;95;false;false
+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
+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
+Non-standard residue;feature(NON STANDARD RESIDUE);String;g7;50;1000;95;false;false
+Non-terminal residue;feature(NON TERMINAL RESIDUE);String;g7;50;1000;95;false;false
+Sequence conflict;feature(SEQUENCE CONFLICT);String;g7;50;1000;95;false;false
+Sequence uncertainty;feature(SEQUENCE UNCERTAINTY);String;g7;50;1000;95;false;false
+Version (Sequence);version(sequence);String;g7;50;1000;95;false;false
+EC number;ec;String;g8;50;1000;95;false;true
+Absorption;comment(ABSORPTION);String;g8;50;1000;95;false;false
+Catalytic activity;comment(CATALYTIC ACTIVITY);String;g8;50;1000;95;false;false
+Cofactor;comment(COFACTOR);String;g8;50;1000;95;false;false
+Enzyme regulation;comment(ENZYME REGULATION);String;g8;50;1000;95;false;false
+Function [CC];comment(FUNCTION);String;g8;50;1000;95;false;false
+Kinetics;comment(KINETICS);String;g8;50;1000;95;false;false
+Pathway;comment(PATHWAY);String;g8;50;1000;95;false;false
+Redox potential;comment(REDOX POTENTIAL);String;g8;50;1000;95;false;false
+Temperature dependence;comment(TEMPERATURE DEPENDENCE);String;g8;50;1000;95;false;false
+pH dependence;comment(PH DEPENDENCE);String;g8;50;1000;95;false;false
+Active site;feature(ACTIVE SITE);String;g8;50;1000;95;false;false
+Binding site;feature(BINDING SITE);String;g8;50;1000;95;false;false
+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
+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
+Protein existence;existence;String;g6;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
+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
+Gene ontology (GO);go;String;g11;50;1000;95;false;true
+Gene ontology (biological process);go(biological process);String;g11;50;1000;95;false;false
+Gene ontology (molecular function);go(molecular function);String;g11;50;1000;95;false;false
+Gene ontology (cellular component);go(cellular component);String;g11;50;1000;95;false;false
+Gene ontology IDs;go-id;String;g11;50;1000;95;false;true
+Allergenic properties;comment(ALLERGEN);String;g12;50;1000;95;false;false
+Biotechnological use;comment(BIOTECHNOLOGY);String;g12;50;1000;95;false;false
+Disruption phenotype;comment(DISRUPTION PHENOTYPE);String;g12;50;1000;95;false;false
+Involvement in disease;comment(DISEASE);String;g12;50;1000;95;false;false
+Pharmaceutical use;comment(PHARMACEUTICAL);String;g12;50;1000;95;false;false
+Toxic dose;comment(TOXIC DOSE);String;g12;50;1000;95;false;false
+Subcellular location [CC];comment(SUBCELLULAR LOCATION);String;g13;50;1000;95;false;false
+Intramembrane;feature(INTRAMEMBRANE);String;g13;50;1000;95;false;false
+Topological domain;feature(TOPOLOGICAL DOMAIN);String;g13;50;1000;95;false;false
+Transmembrane;feature(TRANSMEMBRANE);String;g13;50;1000;95;false;false
+Post-translational modification;comment(PTM);String;g14;50;1000;95;false;false
+Chain;feature(CHAIN);String;g14;50;1000;95;false;false
+Cross-link;feature(CROSS LINK);String;g14;50;1000;95;false;false
+Disulfide bond;feature(DISULFIDE BOND);String;g14;50;1000;95;false;false
+Glycosylation;feature(GLYCOSYLATION);String;g14;50;1000;95;false;false
+Initiator methionine;feature(INITIATOR METHIONINE);String;g14;50;1000;95;false;false
+Lipidation;feature(LIPIDATION);String;g14;50;1000;95;false;false
+Modified residue;feature(MODIFIED RESIDUE);String;g14;50;1000;95;false;false
+Peptide;feature(PEPTIDE);String;g14;50;1000;95;false;false
+Propeptide;feature(PROPEPTIDE);String;g14;50;1000;95;false;false
+Signal peptide;feature(SIGNAL);String;g14;50;1000;95;false;false
+Transit peptide;feature(TRANSIT);String;g14;50;1000;95;false;false
+3D;3d;String;g15;50;1000;95;false;false
+Beta strand;feature(BETA STRAND);String;g15;50;1000;95;false;false
+Helix;feature(HELIX);String;g15;50;1000;95;false;false
+Turn;feature(TURN);String;g15;50;1000;95;false;false
+PubMed ID;citation;String;g16;50;1000;95;false;true
+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
+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
+Compositional bias;feature(COMPOSITIONAL BIAS);String;g18;50;1000;95;false;false
+Domain [FT];feature(DOMAIN EXTENT);String;g18;50;1000;95;false;false
+Motif;feature(MOTIF);String;g18;50;1000;95;false;false
+Region;feature(REGION);String;g18;50;1000;95;false;false
+Repeat;feature(REPEAT);String;g18;50;1000;95;false;false
+Zinc finger;feature(ZINC FINGER);String;g18;50;1000;95;false;false
+Cross-reference (EMBL);database(EMBL);String;g2;50;1000;95;false;false
+Cross-reference (PDB);database(PDB);String;g2;50;1000;95;false;false
+Cross-reference (ENSEMBL);database(ENSEMBL);String;g2;50;1000;95;false;false
+Cross-reference (PFAM);database(PFAM);String;g2;50;1000;95;false;false
+Cross-reference (RFAM);database(RFAM);String;g2;50;1000;95;false;false
+Cross-reference (CATH);database(CATH);String;g2;50;1000;95;false;false
+Cross-reference (SCOPE);database(SCOPE);String;g2;50;1000;95;false;false
+Cross-reference (GO);database(GO);String;g2;50;1000;95;false;false
+Cross-reference (INTERPRO);database(INTERPRO);String;g2;50;1000;95;false;false
+Mapped PubMed ID;citationmapping;String;g16;50;1000;95;false;true
+#
diff --git a/resources/images/blank_16x16_placeholder.png b/resources/images/blank_16x16_placeholder.png
new file mode 100644 (file)
index 0000000..885ad87
Binary files /dev/null and b/resources/images/blank_16x16_placeholder.png differ
index e428989..8dac5c6 100644 (file)
@@ -217,6 +217,8 @@ label.above_identity_threshold = Above Identity Threshold
 label.show_sequence_features = Show Sequence Features
 label.nucleotide = Nucleotide
 label.protein = Protein
+label.nucleotides = Nucleotides
+label.proteins = Proteins
 label.to_new_alignment = To New Alignment
 label.to_this_alignment = Add To This Alignment
 label.apply_colour_to_all_groups = Apply Colour To All Groups
@@ -704,7 +706,9 @@ label.load_tree_for_sequence_set = Load a tree for this sequence set
 label.export_image = Export Image
 label.vamsas_store = VAMSAS store
 label.translate_cDNA = Translate as cDNA
-label.linked_view_title = Linked cDNA and protein view
+label.reverse = Reverse
+label.reverse_complement = Reverse Complement
+label.linked_view_title = Linked CDS and protein view
 label.align = Align
 label.extract_scores = Extract Scores
 label.get_cross_refs = Get Cross-References
@@ -786,7 +790,7 @@ label.select_backgroud_colour = Select Background Colour
 label.invalid_font = Invalid Font
 label.separate_multiple_accession_ids = Enter one or more accession IDs separated by a semi-colon ";"
 label.separate_multiple_query_values = Enter one or more {0}s separated by a semi-colon ";"
-label.search_all = Enter one or more search values separated by a semi-colon ";" (Note: This Searches the entire PDB database)
+label.search_all = Enter one or more search values separated by a semi-colon ";" (Note: This Searches the entire database)
 label.replace_commas_semicolons = Replace commas with semi-colons
 label.parsing_failed_syntax_errors_shown_below_param = Parsing failed. Syntax errors shown below {0}
 label.parsing_failed_unrecoverable_exception_thrown_param = \nParsing failed. An unrecoverable exception was thrown\:\n {0}
@@ -797,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=/<regex>/=$
@@ -1023,7 +1029,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
@@ -1237,7 +1243,7 @@ label.hide_insertions = Hide Insertions
 label.mark_as_representative = Mark as representative
 label.open_jabaws_web_page = Open JABAWS web page
 label.opens_the_jabaws_server_homepage = Opens the JABAWS server's homepage in web browser
-label.pdb_sequence_getcher = PDB Sequence Fetcher
+label.pdb_sequence_fetcher = PDB Sequence Fetcher
 label.result = result
 label.results = results
 label.structure_chooser = Structure Chooser
@@ -1248,7 +1254,7 @@ info.select_filter_option = Select Filter Option/Manual Entry
 info.associate_wit_sequence = Associate with Sequence
 label.search_result = Search Result
 label.found_structures_summary = Found Structures Summary
-label.configure_displayed_columns = Configure Displayed Columns
+label.configure_displayed_columns = Customise Displayed Options
 label.start_jalview = Start Jalview
 label.biojs_html_export = BioJS
 label.scale_as_cdna = Scale protein residues to codons
@@ -1275,13 +1281,26 @@ label.structure_chooser_filter_time = Structure Chooser - Filter time ({0})
 label.structure_chooser_no_of_structures = Structure Chooser - {0} Found ({1})
 info.no_pdb_entry_found_for = No PDB entry found for {0}
 exception.unable_to_detect_internet_connection = Jalview is unable to detect an internet connection
-exception.pdb_rest_service_no_longer_available = PDB rest services no longer available!
+exception.fts_rest_service_no_longer_available = {0} rest services no longer available!
 exception.resource_not_be_found = The requested resource could not be found
-exception.pdb_server_error = There seems to be an error from the PDB server
-exception.pdb_server_unreachable = Jalview is unable to reach the PDBe Solr server. \nPlease ensure that you are connected to the internet and try again.
+exception.fts_server_error = There seems to be an error from the {0} server
+exception.fts_server_unreachable = Jalview is unable to reach the {0} server. \nPlease ensure that you are connected to the internet and try again.
 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.
\ No newline at end of file
+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
+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.
index 3535f4b..8943860 100644 (file)
@@ -962,7 +962,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
diff --git a/resources/so-xp-simple.obo.zip b/resources/so-xp-simple.obo.zip
new file mode 100644 (file)
index 0000000..d150da0
Binary files /dev/null and b/resources/so-xp-simple.obo.zip differ
index 7f87326..df98833 100644 (file)
@@ -26,6 +26,7 @@ import jalview.appletgui.FeatureRenderer;
 import jalview.appletgui.SequenceRenderer;
 import jalview.datamodel.PDBEntry;
 import jalview.datamodel.SequenceI;
+import jalview.io.StructureFile;
 import jalview.structure.AtomSpec;
 import jalview.structure.StructureListener;
 import jalview.structure.StructureMapping;
@@ -67,7 +68,7 @@ public class AppletPDBCanvas extends Panel implements MouseListener,
 
   int my = 0;
 
-  public PDBfile pdb;
+  public StructureFile pdb;
 
   PDBEntry pdbentry;
 
@@ -160,7 +161,7 @@ public class AppletPDBCanvas extends Panel implements MouseListener,
 
       if (protocol.equals(jalview.io.AppletFormatAdapter.PASTE))
       {
-        pdbentry.setFile("INLINE" + pdb.id);
+        pdbentry.setFile("INLINE" + pdb.getId());
       }
 
     } catch (Exception ex)
@@ -169,7 +170,7 @@ public class AppletPDBCanvas extends Panel implements MouseListener,
       return;
     }
 
-    pdbentry.setId(pdb.id);
+    pdbentry.setId(pdb.getId());
 
     ssm.addStructureViewerListener(this);
 
@@ -185,30 +186,32 @@ public class AppletPDBCanvas extends Panel implements MouseListener,
     // JUST DEAL WITH ONE SEQUENCE FOR NOW
     SequenceI sequence = seq[0];
 
-    for (int i = 0; i < pdb.chains.size(); i++)
+    for (int i = 0; i < pdb.getChains().size(); i++)
     {
 
       mappingDetails.append("\n\nPDB Sequence is :\nSequence = "
-              + pdb.chains.elementAt(i).sequence.getSequenceAsString());
+              + pdb.getChains().elementAt(i).sequence.getSequenceAsString());
       mappingDetails.append("\nNo of residues = "
-              + pdb.chains.elementAt(i).residues.size() + "\n\n");
+              + pdb.getChains().elementAt(i).residues.size() + "\n\n");
 
       // Now lets compare the sequences to get
       // the start and end points.
       // Align the sequence to the pdb
       // TODO: DNa/Pep switch
       AlignSeq as = new AlignSeq(sequence,
-              pdb.chains.elementAt(i).sequence,
-              pdb.chains.elementAt(i).isNa ? AlignSeq.DNA : AlignSeq.PEP);
+              pdb.getChains().elementAt(i).sequence,
+              pdb.getChains().elementAt(i).isNa ? AlignSeq.DNA : AlignSeq.PEP);
       as.calcScoreMatrix();
       as.traceAlignment();
       PrintStream ps = new PrintStream(System.out)
       {
+        @Override
         public void print(String x)
         {
           mappingDetails.append(x);
         }
 
+        @Override
         public void println()
         {
           mappingDetails.append("\n");
@@ -232,7 +235,7 @@ public class AppletPDBCanvas extends Panel implements MouseListener,
       mappingDetails.append("\nSEQ start/end " + seqstart + " " + seqend);
     }
 
-    mainchain = pdb.chains.elementAt(maxchain);
+    mainchain = pdb.getChains().elementAt(maxchain);
 
     mainchain.pdbstart = pdbstart;
     mainchain.pdbend = pdbend;
@@ -267,6 +270,7 @@ public class AppletPDBCanvas extends Panel implements MouseListener,
 
     addKeyListener(new KeyAdapter()
     {
+      @Override
       public void keyPressed(KeyEvent evt)
       {
         doKeyPressed(evt);
@@ -289,11 +293,11 @@ public class AppletPDBCanvas extends Panel implements MouseListener,
     // Sort the bonds by z coord
     visiblebonds = new Vector<Bond>();
 
-    for (int ii = 0; ii < pdb.chains.size(); ii++)
+    for (int ii = 0; ii < pdb.getChains().size(); ii++)
     {
-      if (pdb.chains.elementAt(ii).isVisible)
+      if (pdb.getChains().elementAt(ii).isVisible)
       {
-        Vector<Bond> tmp = pdb.chains.elementAt(ii).bonds;
+        Vector<Bond> tmp = pdb.getChains().elementAt(ii).bonds;
 
         for (int i = 0; i < tmp.size(); i++)
         {
@@ -320,11 +324,11 @@ public class AppletPDBCanvas extends Panel implements MouseListener,
     min[1] = (float) 1e30;
     min[2] = (float) 1e30;
 
-    for (int ii = 0; ii < pdb.chains.size(); ii++)
+    for (int ii = 0; ii < pdb.getChains().size(); ii++)
     {
-      if (pdb.chains.elementAt(ii).isVisible)
+      if (pdb.getChains().elementAt(ii).isVisible)
       {
-        Vector<Bond> bonds = pdb.chains.elementAt(ii).bonds;
+        Vector<Bond> bonds = pdb.getChains().elementAt(ii).bonds;
 
         for (Bond tmp : bonds)
         {
@@ -448,11 +452,11 @@ public class AppletPDBCanvas extends Panel implements MouseListener,
     int bsize = 0;
 
     // Find centre coordinate
-    for (int ii = 0; ii < pdb.chains.size(); ii++)
+    for (int ii = 0; ii < pdb.getChains().size(); ii++)
     {
-      if (pdb.chains.elementAt(ii).isVisible)
+      if (pdb.getChains().elementAt(ii).isVisible)
       {
-        Vector<Bond> bonds = pdb.chains.elementAt(ii).bonds;
+        Vector<Bond> bonds = pdb.getChains().elementAt(ii).bonds;
 
         bsize += bonds.size();
 
@@ -470,6 +474,7 @@ public class AppletPDBCanvas extends Panel implements MouseListener,
     centre[2] = ztot / (2 * (float) bsize);
   }
 
+  @Override
   public void paint(Graphics g)
   {
 
@@ -572,9 +577,9 @@ public class AppletPDBCanvas extends Panel implements MouseListener,
     PDBChain chain;
     if (bysequence && pdb != null)
     {
-      for (int ii = 0; ii < pdb.chains.size(); ii++)
+      for (int ii = 0; ii < pdb.getChains().size(); ii++)
       {
-        chain = pdb.chains.elementAt(ii);
+        chain = pdb.getChains().elementAt(ii);
 
         for (int i = 0; i < chain.bonds.size(); i++)
         {
@@ -774,6 +779,7 @@ public class AppletPDBCanvas extends Panel implements MouseListener,
     }
   }
 
+  @Override
   public void mousePressed(MouseEvent e)
   {
     pdbAction = true;
@@ -786,7 +792,7 @@ public class AppletPDBCanvas extends Panel implements MouseListener,
       repaint();
       if (foundchain != -1)
       {
-        PDBChain chain = pdb.chains.elementAt(foundchain);
+        PDBChain chain = pdb.getChains().elementAt(foundchain);
         if (chain == mainchain)
         {
           if (fatom.alignmentMapping != -1)
@@ -818,6 +824,7 @@ public class AppletPDBCanvas extends Panel implements MouseListener,
     dragging = false;
   }
 
+  @Override
   public void mouseMoved(MouseEvent e)
   {
     pdbAction = true;
@@ -834,7 +841,7 @@ public class AppletPDBCanvas extends Panel implements MouseListener,
     PDBChain chain = null;
     if (foundchain != -1)
     {
-      chain = pdb.chains.elementAt(foundchain);
+      chain = pdb.getChains().elementAt(foundchain);
       if (chain == mainchain)
       {
         mouseOverStructure(fatom.resNumber, chain.id);
@@ -860,18 +867,22 @@ public class AppletPDBCanvas extends Panel implements MouseListener,
     }
   }
 
+  @Override
   public void mouseClicked(MouseEvent e)
   {
   }
 
+  @Override
   public void mouseEntered(MouseEvent e)
   {
   }
 
+  @Override
   public void mouseExited(MouseEvent e)
   {
   }
 
+  @Override
   public void mouseDragged(MouseEvent evt)
   {
     int x = evt.getX();
@@ -893,7 +904,7 @@ public class AppletPDBCanvas extends Panel implements MouseListener,
     }
 
     // Alter the bonds
-    for (PDBChain chain : pdb.chains)
+    for (PDBChain chain : pdb.getChains())
     {
       for (Bond tmpBond : chain.bonds)
       {
@@ -921,6 +932,7 @@ public class AppletPDBCanvas extends Panel implements MouseListener,
     repaint();
   }
 
+  @Override
   public void mouseReleased(MouseEvent evt)
   {
     dragging = false;
@@ -930,7 +942,7 @@ public class AppletPDBCanvas extends Panel implements MouseListener,
   void drawLabels(Graphics g)
   {
 
-    for (PDBChain chain : pdb.chains)
+    for (PDBChain chain : pdb.getChains())
     {
       if (chain.isVisible)
       {
@@ -981,15 +993,15 @@ public class AppletPDBCanvas extends Panel implements MouseListener,
 
     foundchain = -1;
 
-    for (int ii = 0; ii < pdb.chains.size(); ii++)
+    for (int ii = 0; ii < pdb.getChains().size(); ii++)
     {
-      PDBChain chain = pdb.chains.elementAt(ii);
+      PDBChain chain = pdb.getChains().elementAt(ii);
       int truex;
       Bond tmpBond = null;
 
       if (chain.isVisible)
       {
-        Vector<Bond> bonds = pdb.chains.elementAt(ii).bonds;
+        Vector<Bond> bonds = pdb.getChains().elementAt(ii).bonds;
 
         for (int i = 0; i < bonds.size(); i++)
         {
@@ -1030,13 +1042,14 @@ public class AppletPDBCanvas extends Panel implements MouseListener,
 
       if (fatom != null) // )&& chain.ds != null)
       {
-        chain = pdb.chains.elementAt(foundchain);
+        chain = pdb.getChains().elementAt(foundchain);
       }
     }
 
     return fatom;
   }
 
+  @Override
   public void update(Graphics g)
   {
     paint(g);
@@ -1096,9 +1109,9 @@ public class AppletPDBCanvas extends Panel implements MouseListener,
 
   public void setAllchainsVisible(boolean b)
   {
-    for (int ii = 0; ii < pdb.chains.size(); ii++)
+    for (int ii = 0; ii < pdb.getChains().size(); ii++)
     {
-      PDBChain chain = pdb.chains.elementAt(ii);
+      PDBChain chain = pdb.getChains().elementAt(ii);
       chain.isVisible = b;
     }
     mainchain.isVisible = true;
@@ -1108,6 +1121,7 @@ public class AppletPDBCanvas extends Panel implements MouseListener,
 
   // ////////////////////////////////
   // /StructureListener
+  @Override
   public String[] getPdbFile()
   {
     return new String[] { pdbentry.getFile() };
@@ -1210,6 +1224,7 @@ public class AppletPDBCanvas extends Panel implements MouseListener,
     // return new Color(viewer.getAtomArgb(atomIndex));
   }
 
+  @Override
   public void updateColours(Object source)
   {
     colourBySequence();
index ac1ba06..1c7a1f7 100644 (file)
@@ -26,6 +26,7 @@ import jalview.datamodel.SequenceI;
 import jalview.gui.AlignmentPanel;
 import jalview.gui.FeatureRenderer;
 import jalview.gui.SequenceRenderer;
+import jalview.io.StructureFile;
 import jalview.structure.AtomSpec;
 import jalview.structure.StructureListener;
 import jalview.structure.StructureMapping;
@@ -65,7 +66,7 @@ public class PDBCanvas extends JPanel implements MouseListener,
 
   int my = 0;
 
-  public PDBfile pdb;
+  public StructureFile pdb;
 
   PDBEntry pdbentry;
 
@@ -154,7 +155,7 @@ public class PDBCanvas extends JPanel implements MouseListener,
 
       if (protocol.equals(jalview.io.AppletFormatAdapter.PASTE))
       {
-        pdbentry.setFile("INLINE" + pdb.id);
+        pdbentry.setFile("INLINE" + pdb.getId());
       }
 
     } catch (Exception ex)
@@ -168,7 +169,7 @@ public class PDBCanvas extends JPanel implements MouseListener,
       errorMessage = "Error loading file: " + pdbentry.getId();
       return;
     }
-    pdbentry.setId(pdb.id);
+    pdbentry.setId(pdb.getId());
 
     ssm.addStructureViewerListener(this);
 
@@ -184,28 +185,30 @@ public class PDBCanvas extends JPanel implements MouseListener,
     // JUST DEAL WITH ONE SEQUENCE FOR NOW
     SequenceI sequence = seq[0];
 
-    for (int i = 0; i < pdb.chains.size(); i++)
+    for (int i = 0; i < pdb.getChains().size(); i++)
     {
 
       mappingDetails.append("\n\nPDB Sequence is :\nSequence = "
-              + pdb.chains.elementAt(i).sequence.getSequenceAsString());
+              + pdb.getChains().elementAt(i).sequence.getSequenceAsString());
       mappingDetails.append("\nNo of residues = "
-              + pdb.chains.elementAt(i).residues.size() + "\n\n");
+              + pdb.getChains().elementAt(i).residues.size() + "\n\n");
 
       // Now lets compare the sequences to get
       // the start and end points.
       // Align the sequence to the pdb
       AlignSeq as = new AlignSeq(sequence,
-              pdb.chains.elementAt(i).sequence, "pep");
+              pdb.getChains().elementAt(i).sequence, "pep");
       as.calcScoreMatrix();
       as.traceAlignment();
       PrintStream ps = new PrintStream(System.out)
       {
+        @Override
         public void print(String x)
         {
           mappingDetails.append(x);
         }
 
+        @Override
         public void println()
         {
           mappingDetails.append("\n");
@@ -229,7 +232,7 @@ public class PDBCanvas extends JPanel implements MouseListener,
       mappingDetails.append("\nSEQ start/end " + seqstart + " " + seqend);
     }
 
-    mainchain = pdb.chains.elementAt(maxchain);
+    mainchain = pdb.getChains().elementAt(maxchain);
 
     mainchain.pdbstart = pdbstart;
     mainchain.pdbend = pdbend;
@@ -245,6 +248,7 @@ public class PDBCanvas extends JPanel implements MouseListener,
 
     addKeyListener(new KeyAdapter()
     {
+      @Override
       public void keyPressed(KeyEvent evt)
       {
         keyPressed(evt);
@@ -271,7 +275,7 @@ public class PDBCanvas extends JPanel implements MouseListener,
     // Sort the bonds by z coord
     visiblebonds = new Vector<Bond>();
 
-    for (PDBChain chain : pdb.chains)
+    for (PDBChain chain : pdb.getChains())
     {
       if (chain.isVisible)
       {
@@ -301,7 +305,7 @@ public class PDBCanvas extends JPanel implements MouseListener,
     min[1] = (float) 1e30;
     min[2] = (float) 1e30;
 
-    for (PDBChain chain : pdb.chains)
+    for (PDBChain chain : pdb.getChains())
     {
       if (chain.isVisible)
       {
@@ -432,7 +436,7 @@ public class PDBCanvas extends JPanel implements MouseListener,
     int bsize = 0;
 
     // Find centre coordinate
-    for (PDBChain chain : pdb.chains)
+    for (PDBChain chain : pdb.getChains())
     {
       if (chain.isVisible)
       {
@@ -452,6 +456,7 @@ public class PDBCanvas extends JPanel implements MouseListener,
     centre[2] = ztot / (2 * (float) bsize);
   }
 
+  @Override
   public void paintComponent(Graphics g)
   {
     super.paintComponent(g);
@@ -541,9 +546,9 @@ public class PDBCanvas extends JPanel implements MouseListener,
     PDBChain chain;
     if (bysequence && pdb != null)
     {
-      for (int ii = 0; ii < pdb.chains.size(); ii++)
+      for (int ii = 0; ii < pdb.getChains().size(); ii++)
       {
-        chain = pdb.chains.elementAt(ii);
+        chain = pdb.getChains().elementAt(ii);
 
         for (int i = 0; i < chain.bonds.size(); i++)
         {
@@ -745,6 +750,7 @@ public class PDBCanvas extends JPanel implements MouseListener,
     }
   }
 
+  @Override
   public void mousePressed(MouseEvent e)
   {
     pdbAction = true;
@@ -757,7 +763,7 @@ public class PDBCanvas extends JPanel implements MouseListener,
       repaint();
       if (foundchain != -1)
       {
-        PDBChain chain = pdb.chains.elementAt(foundchain);
+        PDBChain chain = pdb.getChains().elementAt(foundchain);
         if (chain == mainchain)
         {
           if (fatom.alignmentMapping != -1)
@@ -789,6 +795,7 @@ public class PDBCanvas extends JPanel implements MouseListener,
     dragging = false;
   }
 
+  @Override
   public void mouseMoved(MouseEvent e)
   {
     pdbAction = true;
@@ -805,7 +812,7 @@ public class PDBCanvas extends JPanel implements MouseListener,
     PDBChain chain = null;
     if (foundchain != -1)
     {
-      chain = pdb.chains.elementAt(foundchain);
+      chain = pdb.getChains().elementAt(foundchain);
       if (chain == mainchain)
       {
         mouseOverStructure(fatom.resNumber, chain.id);
@@ -824,18 +831,22 @@ public class PDBCanvas extends JPanel implements MouseListener,
     }
   }
 
+  @Override
   public void mouseClicked(MouseEvent e)
   {
   }
 
+  @Override
   public void mouseEntered(MouseEvent e)
   {
   }
 
+  @Override
   public void mouseExited(MouseEvent e)
   {
   }
 
+  @Override
   public void mouseDragged(MouseEvent evt)
   {
     int x = evt.getX();
@@ -857,7 +868,7 @@ public class PDBCanvas extends JPanel implements MouseListener,
     }
 
     // Alter the bonds
-    for (PDBChain chain : pdb.chains)
+    for (PDBChain chain : pdb.getChains())
     {
       for (Bond tmpBond : chain.bonds)
       {
@@ -885,6 +896,7 @@ public class PDBCanvas extends JPanel implements MouseListener,
     repaint();
   }
 
+  @Override
   public void mouseReleased(MouseEvent evt)
   {
     dragging = false;
@@ -894,7 +906,7 @@ public class PDBCanvas extends JPanel implements MouseListener,
   void drawLabels(Graphics g)
   {
 
-    for (PDBChain chain : pdb.chains)
+    for (PDBChain chain : pdb.getChains())
     {
       if (chain.isVisible)
       {
@@ -943,9 +955,9 @@ public class PDBCanvas extends JPanel implements MouseListener,
 
     foundchain = -1;
 
-    for (int ii = 0; ii < pdb.chains.size(); ii++)
+    for (int ii = 0; ii < pdb.getChains().size(); ii++)
     {
-      PDBChain chain = pdb.chains.elementAt(ii);
+      PDBChain chain = pdb.getChains().elementAt(ii);
       int truex;
       Bond tmpBond = null;
 
@@ -990,7 +1002,7 @@ public class PDBCanvas extends JPanel implements MouseListener,
 
       if (fatom != null) // )&& chain.ds != null)
       { // dead code? value of chain is either overwritten or discarded
-        chain = pdb.chains.elementAt(foundchain);
+        chain = pdb.getChains().elementAt(foundchain);
       }
     }
 
@@ -1053,9 +1065,9 @@ public class PDBCanvas extends JPanel implements MouseListener,
 
   public void setAllchainsVisible(boolean b)
   {
-    for (int ii = 0; ii < pdb.chains.size(); ii++)
+    for (int ii = 0; ii < pdb.getChains().size(); ii++)
     {
-      PDBChain chain = pdb.chains.elementAt(ii);
+      PDBChain chain = pdb.getChains().elementAt(ii);
       chain.isVisible = b;
     }
     mainchain.isVisible = true;
@@ -1065,6 +1077,7 @@ public class PDBCanvas extends JPanel implements MouseListener,
 
   // ////////////////////////////////
   // /StructureListener
+  @Override
   public String[] getPdbFile()
   {
     return new String[] { pdbentry.getFile() };
@@ -1169,6 +1182,7 @@ public class PDBCanvas extends JPanel implements MouseListener,
     // return new Color(viewer.getAtomArgb(atomIndex));
   }
 
+  @Override
   public void updateColours(Object source)
   {
     colourBySequence();
index e4e619c..3b84ee3 100755 (executable)
@@ -30,6 +30,7 @@ import jalview.datamodel.SequenceI;
 import jalview.schemes.ColourSchemeI;
 import jalview.schemes.ResidueProperties;
 import jalview.structure.StructureMapping;
+import jalview.structure.StructureViewSettings;
 
 import java.awt.Color;
 import java.util.List;
@@ -147,6 +148,10 @@ public class PDBChain
 
       if (as.astr1.charAt(i) == as.astr2.charAt(i))
       {
+        if (pdbpos >= residues.size())
+        {
+          continue;
+        }
         Residue res = residues.elementAt(pdbpos);
         for (Atom atom : res.atoms)
         {
@@ -188,6 +193,10 @@ public class PDBChain
       status = PDBChain.IEASTATUS;
     }
     SequenceFeature[] features = sequence.getSequenceFeatures();
+    if (features == null)
+    {
+      return null;
+    }
     for (int i = 0; i < features.length; i++)
     {
       if (features[i].getFeatureGroup().equals(pdbid))
@@ -335,6 +344,7 @@ public class PDBChain
       // Add inserted residues as features to the base residue
       Atom currAtom = resAtoms.get(0);
       if (currAtom.insCode != ' '
+              && !residues.isEmpty()
               && residues.lastElement().atoms.get(0).resNumber == currAtom.resNumber)
       {
         SequenceFeature sf = new SequenceFeature("INSERTION",
@@ -347,19 +357,32 @@ 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));
 
       Residue tmpres = residues.lastElement();
       Atom tmpat = tmpres.atoms.get(0);
       // Make A new SequenceFeature for the current residue numbering
-        SequenceFeature sf = new SequenceFeature("RES NUM", tmpat.resName
+        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
+
       if ((symbol = ResidueProperties.getAA3Hash().get(tmpat.resName)) == null)
       {
         String nucname = tmpat.resName.trim();
@@ -371,9 +394,12 @@ public class PDBChain
                 || ResidueProperties.nucleotideIndex[nucname
                         .charAt((deoxyn ? 1 : 0))] == -1)
         {
-          seq.append("X");
-          // System.err.println("PDBReader:Null aa3Hash for " +
-          // tmpat.resName);
+            char r = ResidueProperties
+                    .getSingleCharacterCode(ResidueProperties
+                            .getCanonicalAminoAcid(tmpat.resName));
+            seq.append(r == '0' ? 'X' : r);
+            // System.err.println("PDBReader:Null aa3Hash for " +
+            // tmpat.resName);
         }
         else
         {
@@ -409,11 +435,15 @@ public class PDBChain
 
     // System.out.println("PDB Sequence is :\nSequence = " + seq);
     // System.out.println("No of residues = " + residues.size());
+
+    if (StructureViewSettings.isShowSeqFeatures())
+    {
     for (i = 0, iSize = resFeatures.size(); i < iSize; i++)
     {
       sequence.addSequenceFeature(resFeatures.elementAt(i));
       resFeatures.setElementAt(null, i);
     }
+    }
     if (visibleChainAnnotation)
     {
       Annotation[] annots = new Annotation[resAnnotation.size()];
index 309a0e1..e032c7a 100755 (executable)
@@ -62,7 +62,6 @@ import javax.swing.JMenuBar;
 import javax.swing.JMenuItem;
 import javax.swing.JOptionPane;
 import javax.swing.JRadioButtonMenuItem;
-import javax.swing.SwingUtilities;
 
 public class PDBViewer extends JInternalFrame implements Runnable
 {
@@ -152,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")
+      pdbentry.setFile(ebi.fetchDataAsFile(query, "default", "raw", ".xml")
               .getAbsolutePath());
 
       if (pdbentry.getFile() != null)
@@ -416,8 +415,7 @@ public class PDBViewer extends JInternalFrame implements Runnable
           @Override
           public void mousePressed(MouseEvent evt)
           {
-            if (evt.isControlDown()
-                    || SwingUtilities.isRightMouseButton(evt))
+            if (evt.isPopupTrigger())
             {
               radioItem.removeActionListener(radioItem.getActionListeners()[0]);
 
index 58611e2..9a9b6f6 100755 (executable)
  */
 package MCview;
 
-import jalview.analysis.AlignSeq;
-import jalview.datamodel.Alignment;
 import jalview.datamodel.AlignmentAnnotation;
-import jalview.datamodel.AlignmentI;
-import jalview.datamodel.DBRefEntry;
 import jalview.datamodel.DBRefSource;
-import jalview.datamodel.PDBEntry;
 import jalview.datamodel.SequenceI;
 import jalview.io.FileParse;
+import jalview.io.StructureFile;
 import jalview.util.MessageManager;
 
-import java.awt.Color;
 import java.io.IOException;
-import java.lang.reflect.Constructor;
 import java.util.ArrayList;
 import java.util.Hashtable;
 import java.util.List;
 import java.util.Vector;
 
-public class PDBfile extends jalview.io.AlignFile
+public class PDBfile extends StructureFile
 {
   private static String CALC_ID_PREFIX = "JalviewPDB";
 
-  public Vector<PDBChain> chains;
-
-  public String id;
-
-  /**
-   * set to true to add derived sequence annotations (temp factor read from
-   * file, or computed secondary structure) to the alignment
-   */
-  private boolean visibleChainAnnotation = false;
-
-  /*
-   * Set true to predict secondary structure (using JMol for protein, Annotate3D
-   * for RNA)
-   */
-  private boolean predictSecondaryStructure = true;
-
-  /*
-   * Set true (with predictSecondaryStructure=true) to predict secondary
-   * structure using an external service (currently Annotate3D for RNA only)
-   */
-  private boolean externalSecondaryStructure = false;
-
   public PDBfile(boolean addAlignmentAnnotations,
           boolean predictSecondaryStructure, boolean externalSecStr)
   {
     super();
-    this.visibleChainAnnotation = addAlignmentAnnotations;
-    this.predictSecondaryStructure = predictSecondaryStructure;
-    this.externalSecondaryStructure = externalSecStr;
+    addSettings(addAlignmentAnnotations, predictSecondaryStructure,
+            externalSecStr);
   }
 
-  public PDBfile(boolean addAlignmentAnnotations,
-          boolean predictSecondaryStructure, boolean externalSecStr,
-          String file, String protocol) throws IOException
+  public PDBfile(boolean addAlignmentAnnotations, boolean predictSecStr,
+          boolean externalSecStr, String file, String protocol)
+          throws IOException
   {
     super(false, file, protocol);
-    this.visibleChainAnnotation = addAlignmentAnnotations;
-    this.predictSecondaryStructure = predictSecondaryStructure;
-    this.externalSecondaryStructure = externalSecStr;
+    addSettings(addAlignmentAnnotations, predictSecStr, externalSecStr);
     doParse();
   }
 
-  public PDBfile(boolean addAlignmentAnnotations,
-          boolean predictSecondaryStructure, boolean externalSecStr,
+  public PDBfile(boolean addAlignmentAnnotations, boolean predictSecStr,
+          boolean externalSecStr,
           FileParse source) throws IOException
   {
     super(false, source);
-    this.visibleChainAnnotation = addAlignmentAnnotations;
-    this.predictSecondaryStructure = predictSecondaryStructure;
-    this.externalSecondaryStructure = externalSecStr;
+    addSettings(addAlignmentAnnotations, predictSecStr, externalSecStr);
     doParse();
   }
 
@@ -105,10 +72,11 @@ public class PDBfile extends jalview.io.AlignFile
   @Override
   public void parse() throws IOException
   {
+    setDbRefType(DBRefSource.PDB);
     // TODO set the filename sensibly - try using data source name.
-    id = safeName(getDataName());
+    setId(safeName(getDataName()));
 
-    chains = new Vector<PDBChain>();
+    setChains(new Vector<PDBChain>());
     List<SequenceI> rna = new ArrayList<SequenceI>();
     List<SequenceI> prot = new ArrayList<SequenceI>();
     PDBChain tmpchain;
@@ -138,7 +106,7 @@ public class PDBfile extends jalview.io.AlignFile
             }
             if (tid.length() > 0)
             {
-              id = tid;
+              setId(tid);
             }
             continue;
           }
@@ -175,20 +143,19 @@ public class PDBfile extends jalview.io.AlignFile
           }
 
           Atom tmpatom = new Atom(line);
-          tmpchain = findChain(tmpatom.chain);
-          if (tmpchain != null)
+          try
           {
+          tmpchain = findChain(tmpatom.chain);
             if (tmpatom.resNumIns.trim().equals(lastID))
             {
               // phosphorylated protein - seen both CA and P..
               continue;
             }
             tmpchain.atoms.addElement(tmpatom);
-          }
-          else
+          } catch (Exception e)
           {
-            tmpchain = new PDBChain(id, tmpatom.chain);
-            chains.addElement(tmpchain);
+            tmpchain = new PDBChain(getId(), tmpatom.chain);
+            getChains().add(tmpchain);
             tmpchain.atoms.addElement(tmpatom);
           }
           lastID = tmpatom.resNumIns.trim();
@@ -199,11 +166,11 @@ public class PDBfile extends jalview.io.AlignFile
       makeResidueList();
       makeCaBondList();
 
-      if (id == null)
+      if (getId() == null)
       {
-        id = inFile.getName();
+        setId(inFile.getName());
       }
-      for (PDBChain chain : chains)
+      for (PDBChain chain : getChains())
       {
         SequenceI chainseq = postProcessChain(chain);
         if (isRNA(chainseq))
@@ -217,7 +184,7 @@ public class PDBfile extends jalview.io.AlignFile
       }
       if (predictSecondaryStructure)
       {
-        predictSecondaryStructure(rna, prot);
+        addSecondaryStructure(rna, prot);
       }
     } catch (OutOfMemoryError er)
     {
@@ -236,49 +203,7 @@ public class PDBfile extends jalview.io.AlignFile
     markCalcIds();
   }
 
-  /**
-   * Predict secondary structure for RNA and/or protein sequences and add as
-   * annotations
-   * 
-   * @param rnaSequences
-   * @param proteinSequences
-   */
-  protected void predictSecondaryStructure(List<SequenceI> rnaSequences,
-          List<SequenceI> proteinSequences)
-  {
-    /*
-     * Currently using Annotate3D for RNA, but only if the 'use external
-     * prediction' flag is set
-     */
-    if (externalSecondaryStructure && rnaSequences.size() > 0)
-    {
-      try
-      {
-        processPdbFileWithAnnotate3d(rnaSequences);
-      } catch (Exception x)
-      {
-        System.err.println("Exceptions when dealing with RNA in pdb file");
-        x.printStackTrace();
-
-      }
-    }
 
-    /*
-     * Currently using JMol PDB parser for peptide
-     */
-    if (proteinSequences.size() > 0)
-    {
-      try
-      {
-        processPdbFileWithJmol(proteinSequences);
-      } catch (Exception x)
-      {
-        System.err
-                .println("Exceptions from Jmol when processing data in pdb file");
-        x.printStackTrace();
-      }
-    }
-  }
 
   /**
    * Process a parsed chain to construct and return a Sequence, and add it to
@@ -287,52 +212,6 @@ public class PDBfile extends jalview.io.AlignFile
    * @param chain
    * @return
    */
-  protected SequenceI postProcessChain(PDBChain chain)
-  {
-    SequenceI pdbSequence = chain.sequence;
-    pdbSequence.setName(id + "|" + pdbSequence.getName());
-    PDBEntry entry = new PDBEntry();
-    entry.setId(id);
-    entry.setType(PDBEntry.Type.PDB);
-    entry.setProperty(new Hashtable());
-    if (chain.id != null)
-    {
-      // entry.getProperty().put("CHAIN", chains.elementAt(i).id);
-      entry.setChainCode(String.valueOf(chain.id));
-    }
-    if (inFile != null)
-    {
-      entry.setFile(inFile.getAbsolutePath());
-    }
-    else
-    {
-      // TODO: decide if we should dump the datasource to disk
-      entry.setFile(getDataName());
-    }
-    pdbSequence.addPDBId(entry);
-
-    DBRefEntry sourceDBRef = new DBRefEntry();
-    sourceDBRef.setAccessionId(id);
-    sourceDBRef.setSource(DBRefSource.PDB);
-    sourceDBRef.setStartRes(pdbSequence.getStart());
-    sourceDBRef.setEndRes(pdbSequence.getEnd());
-    pdbSequence.setSourceDBRef(sourceDBRef);
-    // PDBChain objects maintain reference to dataset
-    SequenceI chainseq = pdbSequence.deriveSequence();
-    seqs.addElement(chainseq);
-
-    AlignmentAnnotation[] chainannot = chainseq.getAnnotation();
-
-    if (chainannot != null && visibleChainAnnotation)
-    {
-      for (int ai = 0; ai < chainannot.length; ai++)
-      {
-        chainannot[ai].visible = visibleChainAnnotation;
-        annotations.addElement(chainannot[ai]);
-      }
-    }
-    return chainseq;
-  }
 
   public static boolean isCalcIdHandled(String calcId)
   {
@@ -371,204 +250,11 @@ public class PDBfile extends jalview.io.AlignFile
             oldId = "";
           }
           aa.setCalcId(CALC_ID_PREFIX);
-          aa.setProperty("PDBID", id);
+          aa.setProperty("PDBID", getId());
           aa.setProperty("oldCalcId", oldId);
         }
       }
     }
   }
 
-  private void processPdbFileWithJmol(List<SequenceI> prot)
-          throws Exception
-  {
-    try
-    {
-      Class cl = Class.forName("jalview.ext.jmol.PDBFileWithJmol");
-      if (cl != null)
-      {
-        final Constructor constructor = cl
-                .getConstructor(new Class[] { FileParse.class });
-        final Object[] args = new Object[] { new FileParse(getDataName(),
-                type) };
-        Object jmf = constructor.newInstance(args);
-        AlignmentI al = new Alignment((SequenceI[]) cl.getMethod(
-                "getSeqsAsArray", new Class[] {}).invoke(jmf));
-        cl.getMethod("addAnnotations", new Class[] { AlignmentI.class })
-                .invoke(jmf, al);
-        for (SequenceI sq : al.getSequences())
-        {
-          if (sq.getDatasetSequence() != null)
-          {
-            sq.getDatasetSequence().getAllPDBEntries().clear();
-          }
-          else
-          {
-            sq.getAllPDBEntries().clear();
-          }
-        }
-        replaceAndUpdateChains(prot, al, AlignSeq.PEP, false);
-      }
-    } catch (ClassNotFoundException q)
-    {
-    }
-  }
-
-  private void replaceAndUpdateChains(List<SequenceI> prot, AlignmentI al,
-          String pep, boolean b)
-  {
-    List<List<? extends Object>> replaced = AlignSeq
-            .replaceMatchingSeqsWith(seqs, annotations, prot, al, pep,
-                    false);
-    for (PDBChain ch : chains)
-    {
-      int p = 0;
-      for (SequenceI sq : (List<SequenceI>) replaced.get(0))
-      {
-        p++;
-        if (sq == ch.sequence || sq.getDatasetSequence() == ch.sequence)
-        {
-          p = -p;
-          break;
-        }
-      }
-      if (p < 0)
-      {
-        p = -p - 1;
-        // set shadow entry for chains
-        ch.shadow = (SequenceI) replaced.get(1).get(p);
-        ch.shadowMap = ((AlignSeq) replaced.get(2).get(p))
-                .getMappingFromS1(false);
-      }
-    }
-  }
-
-  private void processPdbFileWithAnnotate3d(List<SequenceI> rna)
-          throws Exception
-  {
-    // System.out.println("this is a PDB format and RNA sequence");
-    // note: we use reflection here so that the applet can compile and run
-    // without the HTTPClient bits and pieces needed for accessing Annotate3D
-    // web service
-    try
-    {
-      Class cl = Class.forName("jalview.ws.jws1.Annotate3D");
-      if (cl != null)
-      {
-        // TODO: use the PDB ID of the structure if one is available, to save
-        // bandwidth and avoid uploading the whole structure to the service
-        Object annotate3d = cl.getConstructor(new Class[] {}).newInstance(
-                new Object[] {});
-        AlignmentI al = ((AlignmentI) cl.getMethod("getRNAMLFor",
-                new Class[] { FileParse.class }).invoke(annotate3d,
-                new Object[] { new FileParse(getDataName(), type) }));
-        for (SequenceI sq : al.getSequences())
-        {
-          if (sq.getDatasetSequence() != null)
-          {
-            if (sq.getDatasetSequence().getAllPDBEntries() != null)
-            {
-              sq.getDatasetSequence().getAllPDBEntries().clear();
-            }
-          }
-          else
-          {
-            if (sq.getAllPDBEntries() != null)
-            {
-              sq.getAllPDBEntries().clear();
-            }
-          }
-        }
-        replaceAndUpdateChains(rna, al, AlignSeq.DNA, false);
-      }
-    } catch (ClassNotFoundException x)
-    {
-      // ignore classnotfounds - occurs in applet
-    }
-    ;
-  }
-
-  /**
-   * make a friendly ID string.
-   * 
-   * @param dataName
-   * @return truncated dataName to after last '/'
-   */
-  private String safeName(String dataName)
-  {
-    int p = 0;
-    while ((p = dataName.indexOf("/")) > -1 && p < dataName.length())
-    {
-      dataName = dataName.substring(p + 1);
-    }
-    return dataName;
-  }
-
-  public void makeResidueList()
-  {
-    for (int i = 0; i < chains.size(); i++)
-    {
-      chains.elementAt(i).makeResidueList(visibleChainAnnotation);
-    }
-  }
-
-  public void makeCaBondList()
-  {
-    for (int i = 0; i < chains.size(); i++)
-    {
-      chains.elementAt(i).makeCaBondList();
-    }
-  }
-
-  public PDBChain findChain(String id)
-  {
-    for (int i = 0; i < chains.size(); i++)
-    {
-      if (chains.elementAt(i).id.equals(id))
-      {
-        return chains.elementAt(i);
-      }
-    }
-
-    return null;
-  }
-
-  public void setChargeColours()
-  {
-    for (int i = 0; i < chains.size(); i++)
-    {
-      chains.elementAt(i).setChargeColours();
-    }
-  }
-
-  public void setColours(jalview.schemes.ColourSchemeI cs)
-  {
-    for (int i = 0; i < chains.size(); i++)
-    {
-      chains.elementAt(i).setChainColours(cs);
-    }
-  }
-
-  public void setChainColours()
-  {
-    for (int i = 0; i < chains.size(); i++)
-    {
-      // divide by zero --> infinity --> 255 ;-)
-      chains.elementAt(i).setChainColours(
-              Color.getHSBColor(1.0f / i, .4f, 1.0f));
-    }
-  }
-
-  public static boolean isRNA(SequenceI seq)
-  {
-    for (char c : seq.getSequence())
-    {
-      if ((c != 'A') && (c != 'C') && (c != 'G') && (c != 'U'))
-      {
-        return false;
-      }
-    }
-
-    return true;
-
-  }
 }
index abb29a8..edef5f1 100755 (executable)
@@ -49,4 +49,9 @@ public class Residue
 
     return null;
   }
+
+  public Vector<Atom> getAtoms()
+  {
+    return this.atoms;
+  }
 }
index 03f51f7..95221d2 100644 (file)
@@ -60,10 +60,25 @@ public abstract class ChimUtils
    */
   // invoked by openModel in ChimeraManager
   // line: #1, chain A: hiv-1 protease
+  // line: Model 0 (filename)
   public static int[] parseOpenedModelNumber(String inputLine)
   {
     int hash = inputLine.indexOf('#');
-    int space = inputLine.indexOf(',', hash);
+    int space = -1;
+    if (hash == (-1))
+    {
+      hash = inputLine.indexOf("Model");
+      if (hash >= 0)
+      {
+        hash = hash + 5;
+      }
+      space = inputLine.indexOf(' ', hash + 1);
+    }
+    else
+    {
+      space = inputLine.indexOf(',', hash);
+    }
+
     int decimal = inputLine.substring(hash + 1, space).indexOf('.');
     // model number is between hash+1 and space
     int modelNumber = -1;
@@ -93,7 +108,9 @@ public abstract class ChimUtils
   {
     int start = inputLine.indexOf("name ");
     if (start < 0)
+    {
       return null;
+    }
     // Might get a quoted string (don't understand why, but there you have it)
     if (inputLine.startsWith("\"", start + 5))
     {
@@ -104,7 +121,9 @@ public abstract class ChimUtils
         return inputLine.substring(start, end);
       }
       else
+      {
         return inputLine.substring(start);
+      }
     }
     else
     {
@@ -176,12 +195,18 @@ public abstract class ChimUtils
     {
       String[] subSplit = split[0].substring(1).split("\\.");
       if (subSplit.length > 0)
+      {
         model = Integer.parseInt(subSplit[0]);
+      }
       else
+      {
         model = Integer.parseInt(split[0].substring(1));
+      }
 
       if (subSplit.length > 1)
+      {
         submodel = Integer.parseInt(subSplit[1]);
+      }
     } catch (Exception e)
     {
       // ignore
@@ -258,7 +283,9 @@ public abstract class ChimUtils
   {
     if (atom.equals("C") || atom.equals("CA") || atom.equals("N")
             || atom.equals("O") || atom.equals("H"))
+    {
       return true;
+    }
     return false;
   }
 
@@ -449,7 +476,9 @@ public abstract class ChimUtils
       }
       else
       {
+        // length > 1, so we probably have a file name with "." in it
         logger.info("Could not parse model identifier: " + modelID);
+        resKeyParts[0] = modelID;
       }
     }
   }
@@ -547,8 +576,7 @@ public abstract class ChimUtils
       // }
 
       // System.out.println("model = " + model + " chain = " + chain +
-      // " residue = " +
-      // residue);
+      // " residue = " + residue);
       if (model != null)
       {
         List<ChimeraModel> models = chimeraManager.getChimeraModels(model,
@@ -594,13 +622,19 @@ public abstract class ChimUtils
       }
 
       if (chimeraResidue != null)
+      {
         return chimeraResidue;
+      }
 
       if (chimeraChain != null)
+      {
         return chimeraChain;
+      }
 
       if (chimeraModel != null)
+      {
         return chimeraModel;
+      }
 
     } catch (Exception ex)
     {
@@ -709,13 +743,19 @@ public abstract class ChimUtils
       }
 
       if (chimeraResidue != null)
+      {
         return chimeraResidue;
+      }
 
       if (chimeraChain != null)
+      {
         return chimeraChain;
+      }
 
       if (chimeraModel != null)
+      {
         return chimeraModel;
+      }
 
     } catch (Exception ex)
     {
@@ -736,7 +776,9 @@ public abstract class ChimUtils
   public static String findStructures(String residueList)
   {
     if (residueList == null)
+    {
       return null;
+    }
     String[] residues = residueList.split(",");
     Map<String, String> structureNameMap = new HashMap<String, String>();
     for (int i = 0; i < residues.length; i++)
@@ -748,15 +790,21 @@ public abstract class ChimUtils
       }
     }
     if (structureNameMap.isEmpty())
+    {
       return null;
+    }
 
     String structure = null;
     for (String struct : structureNameMap.keySet())
     {
       if (structure == null)
+      {
         structure = new String();
+      }
       else
+      {
         structure = structure.concat(",");
+      }
       structure = structure.concat(struct);
     }
     return structure;
@@ -798,7 +846,9 @@ public abstract class ChimUtils
         {
           resRange = resRange.concat("-");
           if (chain != null && range[res].indexOf('.') == -1)
+          {
             range[res] = range[res].concat("." + chain);
+          }
         }
 
         if (res == 0 && range.length >= 2 && range[res].indexOf('.') > 0)
@@ -887,8 +937,10 @@ public abstract class ChimUtils
   public static String toFullName(String aaType)
   {
     if (!aaNames.containsKey(aaType))
+    {
       return aaType;
-    String[] ids = ((String) aaNames.get(aaType)).split(" ");
+    }
+    String[] ids = aaNames.get(aaType).split(" ");
     return ids[2].replace('_', ' ');
   }
 
@@ -902,8 +954,10 @@ public abstract class ChimUtils
   public static String toSingleLetter(String aaType)
   {
     if (!aaNames.containsKey(aaType))
+    {
       return aaType;
-    String[] ids = ((String) aaNames.get(aaType)).split(" ");
+    }
+    String[] ids = aaNames.get(aaType).split(" ");
     return ids[0];
   }
 
@@ -917,8 +971,10 @@ public abstract class ChimUtils
   public static String toThreeLetter(String aaType)
   {
     if (!aaNames.containsKey(aaType))
+    {
       return aaType;
-    String[] ids = ((String) aaNames.get(aaType)).split(" ");
+    }
+    String[] ids = aaNames.get(aaType).split(" ");
     return ids[1];
   }
 
@@ -932,10 +988,14 @@ public abstract class ChimUtils
   public static String toSMILES(String aaType)
   {
     if (!aaNames.containsKey(aaType))
+    {
       return null;
-    String[] ids = ((String) aaNames.get(aaType)).split(" ");
+    }
+    String[] ids = aaNames.get(aaType).split(" ");
     if (ids.length < 4)
+    {
       return null;
+    }
     return ids[3];
   }
 
index 2de2829..4201f43 100644 (file)
@@ -178,6 +178,7 @@ public class ChimeraManager
   {
     logger.info("chimera open " + modelPath);
     // stopListening();
+    List<ChimeraModel> modelList = getModelList();
     List<String> response = null;
     // TODO: [Optional] Handle modbase models
     if (type == ModelType.MODBASE_MODEL)
@@ -197,76 +198,31 @@ public class ChimeraManager
       logger.warn("Could not open " + modelPath);
       return null;
     }
-    List<ChimeraModel> models = new ArrayList<ChimeraModel>();
-    int[] modelNumbers = null;
-    if (type == ModelType.PDB_MODEL)
-    {
-      for (String line : response)
-      {
-        if (line.startsWith("#"))
-        {
-          modelNumbers = ChimUtils.parseOpenedModelNumber(line);
-          if (modelNumbers != null)
-          {
-            int modelNumber = ChimUtils.makeModelKey(modelNumbers[0],
-                    modelNumbers[1]);
-            if (currentModelsMap.containsKey(modelNumber))
-            {
-              continue;
-            }
-            ChimeraModel newModel = new ChimeraModel(modelName, type,
-                    modelNumbers[0], modelNumbers[1]);
-            currentModelsMap.put(modelNumber, newModel);
-            models.add(newModel);
-
-            //
-            // patch for Jalview - set model name in Chimera
-            // TODO: find a variant that works for sub-models
-            sendChimeraCommand("setattr M name " + modelName + " #"
-                    + modelNumbers[0], false);
-            // end patch for Jalview
-
-            modelNumbers = null;
-          }
-        }
-      }
-    }
-    else
+
+    List<ChimeraModel> newModelList = getModelList();
+    for (ChimeraModel newModel : newModelList)
     {
-      // TODO: [Optional] Open smiles from file would fail. Do we need it?
-      // If parsing fails, iterate over all open models to get the right one
-      List<ChimeraModel> openModels = getModelList();
-      for (ChimeraModel openModel : openModels)
+      if (!modelList.contains(newModel))
       {
-        String openModelName = openModel.getModelName();
-        if (openModelName.endsWith("..."))
-        {
-          openModelName = openModelName.substring(0,
-                  openModelName.length() - 3);
-        }
-        if (modelPath.startsWith(openModelName))
-        {
-          openModel.setModelName(modelPath);
-          int modelNumber = ChimUtils
-                  .makeModelKey(openModel.getModelNumber(),
-                          openModel.getSubModelNumber());
-          if (!currentModelsMap.containsKey(modelNumber))
-          {
-            currentModelsMap.put(modelNumber, openModel);
-            models.add(openModel);
-          }
-        }
+        newModel.setModelName(modelName);
+        sendChimeraCommand(
+                "setattr M name " + modelName + " #"
+                        + newModel.getModelNumber(), false);
+        modelList.add(newModel);
+
       }
     }
 
     // assign color and residues to open models
-    for (ChimeraModel newModel : 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(newModel);
+      Color modelColor = getModelColor(chimeraModel);
       if (modelColor != null)
       {
-        newModel.setModelColor(modelColor);
+        chimeraModel.setModelColor(modelColor);
       }
 
       // Get our properties (default color scheme, etc.)
@@ -276,13 +232,13 @@ public class ChimeraManager
       // Create the information we need for the navigator
       if (type != ModelType.SMILES)
       {
-        addResidues(newModel);
+        addResidues(chimeraModel);
       }
     }
 
     sendChimeraCommand("focus", false);
     // startListening(); // see ChimeraListener
-    return models;
+    return modelList;
   }
 
   /**
index 0700565..7da7a48 100644 (file)
@@ -145,6 +145,7 @@ public class ChimeraModel implements ChimeraStructuralObject
    * 
    * @return ChimeraModel
    */
+  @Override
   public ChimeraModel getChimeraModel()
   {
     return this;
@@ -272,6 +273,7 @@ public class ChimeraModel implements ChimeraStructuralObject
    * 
    * @return user data
    */
+  @Override
   public Object getUserData()
   {
     return userData;
@@ -283,6 +285,7 @@ public class ChimeraModel implements ChimeraStructuralObject
    * @param data
    *          user data to associate with this model
    */
+  @Override
   public void setUserData(Object data)
   {
     this.userData = data;
@@ -293,6 +296,7 @@ public class ChimeraModel implements ChimeraStructuralObject
    * 
    * @return the selected state
    */
+  @Override
   public boolean isSelected()
   {
     return selected;
@@ -304,6 +308,7 @@ public class ChimeraModel implements ChimeraStructuralObject
    * @param selected
    *          a boolean to set the selected state to
    */
+  @Override
   public void setSelected(boolean selected)
   {
     this.selected = selected;
@@ -314,6 +319,7 @@ public class ChimeraModel implements ChimeraStructuralObject
    * 
    * @return the chains in this model as a list
    */
+  @Override
   public List<ChimeraStructuralObject> getChildren()
   {
     return new ArrayList<ChimeraStructuralObject>(chainMap.values());
@@ -414,6 +420,7 @@ public class ChimeraModel implements ChimeraStructuralObject
   /**
    * Checks if this model has selected children.
    */
+  @Override
   public boolean hasSelectedChildren()
   {
     if (selected)
@@ -458,10 +465,13 @@ public class ChimeraModel implements ChimeraStructuralObject
   /**
    * Return the Chimera specification for this model.
    */
+  @Override
   public String toSpec()
   {
     if (subModelNumber == 0)
+    {
       return ("#" + modelNumber);
+    }
     return ("#" + modelNumber + "." + subModelNumber);
   }
 
@@ -469,6 +479,7 @@ public class ChimeraModel implements ChimeraStructuralObject
    * Return a string representation for the model. Shorten if longer than 100
    * characters.
    */
+  @Override
   public String toString()
   {
     String modelName = "";
@@ -554,4 +565,27 @@ public class ChimeraModel implements ChimeraStructuralObject
     }
     return nodeName;
   }
+
+  @Override
+  public boolean equals(Object otherChimeraModel)
+  {
+    if (!(otherChimeraModel instanceof ChimeraModel))
+    {
+      return false;
+    }
+    ChimeraModel otherCM = ((ChimeraModel) otherChimeraModel);
+    return this.name.equals(otherCM.name)
+            && this.modelNumber == otherCM.modelNumber
+            && this.type == otherCM.type;
+  }
+
+  @Override
+  public int hashCode()
+  {
+    int hashCode = 1;
+    hashCode = hashCode * 37 + this.name.hashCode();
+    hashCode = hashCode * 37 + this.type.hashCode();
+    hashCode = (hashCode * 37) + modelNumber;
+    return hashCode;
+  }
 }
index 5227795..3d61b11 100755 (executable)
@@ -32,7 +32,6 @@ import jalview.util.QuickSort;
 import java.util.Arrays;
 import java.util.Hashtable;
 import java.util.List;
-import java.util.Set;
 
 /**
  * Takes in a vector or array of sequences and column start and column end and
@@ -520,7 +519,7 @@ public class AAFrequency
           Hashtable[] hconsensus)
   {
     final char gapCharacter = alignment.getGapCharacter();
-    Set<AlignedCodonFrame> mappings = alignment.getCodonFrames();
+    List<AlignedCodonFrame> mappings = alignment.getCodonFrames();
     if (mappings == null || mappings.isEmpty())
     {
       return;
@@ -541,12 +540,16 @@ public class AAFrequency
         {
           continue;
         }
-        char[] codon = MappingUtils.findCodonFor(seq, col, mappings);
-        int codonEncoded = CodingUtils.encodeCodon(codon);
-        if (codonEncoded >= 0)
+        List<char[]> codons = MappingUtils
+                .findCodonsFor(seq, col, mappings);
+        for (char[] codon : codons)
         {
-          codonCounts[codonEncoded + 2]++;
-          ungappedCount++;
+          int codonEncoded = CodingUtils.encodeCodon(codon);
+          if (codonEncoded >= 0)
+          {
+            codonCounts[codonEncoded + 2]++;
+            ungappedCount++;
+          }
         }
       }
       codonCounts[1] = ungappedCount;
index 007d538..5ee4bcb 100755 (executable)
@@ -32,6 +32,7 @@ import jalview.util.MessageManager;
 import jalview.util.QuickSort;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
 /**
@@ -719,12 +720,13 @@ public class AlignmentSorter
           int start, int stop, AlignmentI alignment, String method)
   {
     sortByFeature(featureLabel == null ? null
-            : new String[] { featureLabel }, groupLabel == null ? null
-            : new String[] { groupLabel }, start, stop, alignment, method);
+                    : Arrays.asList(new String[] { featureLabel }),
+            groupLabel == null ? null
+            : Arrays.asList(new String[]{ groupLabel }), start, stop, alignment, method);
   }
 
   private static boolean containsIgnoreCase(final String lab,
-          final String[] labs)
+          final List<String> labs)
   {
     if (labs == null)
     {
@@ -734,9 +736,9 @@ public class AlignmentSorter
     {
       return false;
     }
-    for (int q = 0; q < labs.length; q++)
+    for (String label : labs)
     {
-      if (labs[q] != null && lab.equalsIgnoreCase(labs[q]))
+      if (lab.equalsIgnoreCase(label))
       {
         return true;
       }
@@ -744,8 +746,8 @@ public class AlignmentSorter
     return false;
   }
 
-  public static void sortByFeature(String[] featureLabels,
-          String[] groupLabels, int start, int stop, AlignmentI alignment,
+  public static void sortByFeature(List<String> featureLabels,
+          List<String> groupLabels, int start, int stop, AlignmentI alignment,
           String method)
   {
     if (method != FEATURE_SCORE && method != FEATURE_LABEL
@@ -761,14 +763,19 @@ public class AlignmentSorter
     scoreLabel.append(start + stop + method);
     // This doesn't quite work yet - we'd like to have a canonical ordering that
     // can be preserved from call to call
-    for (int i = 0; featureLabels != null && i < featureLabels.length; i++)
+    if (featureLabels != null)
     {
-      scoreLabel.append(featureLabels[i] == null ? "null"
-              : featureLabels[i]);
+      for (String label : featureLabels)
+      {
+        scoreLabel.append(label);
+      }
     }
-    for (int i = 0; groupLabels != null && i < groupLabels.length; i++)
+    if (groupLabels != null)
     {
-      scoreLabel.append(groupLabels[i] == null ? "null" : groupLabels[i]);
+      for (String label : groupLabels)
+      {
+        scoreLabel.append(label);
+      }
     }
 
     /*
index da5bc2f..42a1201 100644 (file)
  */
 package jalview.analysis;
 
+import static jalview.io.gff.GffConstants.CLINICAL_SIGNIFICANCE;
+
 import jalview.datamodel.AlignedCodon;
 import jalview.datamodel.AlignedCodonFrame;
 import jalview.datamodel.Alignment;
 import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.DBRefEntry;
-import jalview.datamodel.DBRefSource;
-import jalview.datamodel.FeatureProperties;
+import jalview.datamodel.IncompleteCodonException;
 import jalview.datamodel.Mapping;
-import jalview.datamodel.SearchResults;
 import jalview.datamodel.Sequence;
+import jalview.datamodel.SequenceFeature;
 import jalview.datamodel.SequenceGroup;
 import jalview.datamodel.SequenceI;
+import jalview.io.gff.SequenceOntologyFactory;
+import jalview.io.gff.SequenceOntologyI;
 import jalview.schemes.ResidueProperties;
-import jalview.util.DBRefUtils;
+import jalview.util.Comparison;
 import jalview.util.MapList;
 import jalview.util.MappingUtils;
 
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.NoSuchElementException;
 import java.util.Set;
 import java.util.TreeMap;
 
@@ -62,6 +69,31 @@ import java.util.TreeMap;
 public class AlignmentUtils
 {
 
+  private static final String SEQUENCE_VARIANT = "sequence_variant:";
+  private static final String ID = "ID";
+
+  /**
+   * A data model to hold the 'normal' base value at a position, and an optional
+   * sequence variant feature
+   */
+  static class DnaVariant
+  {
+    String base;
+
+    SequenceFeature variant;
+
+    DnaVariant(String nuc)
+    {
+      base = nuc;
+    }
+
+    DnaVariant(String nuc, SequenceFeature var)
+    {
+      base = nuc;
+      variant = var;
+    }
+  }
+
   /**
    * given an existing alignment, create a new alignment including all, or up to
    * flankSize additional symbols from each sequence's dataset sequence
@@ -315,7 +347,7 @@ public class AlignmentUtils
         }
         else
         {
-          MapList map = mapProteinSequenceToCdna(aaSeq, cdnaSeq);
+          MapList map = mapCdnaToProtein(aaSeq, cdnaSeq);
           if (map != null)
           {
             acf.addMap(cdnaSeq, aaSeq, map);
@@ -338,12 +370,12 @@ public class AlignmentUtils
    * Answers true if the mappings include one between the given (dataset)
    * sequences.
    */
-  public static boolean mappingExists(Set<AlignedCodonFrame> set,
+  public static boolean mappingExists(List<AlignedCodonFrame> mappings,
           SequenceI aaSeq, SequenceI cdnaSeq)
   {
-    if (set != null)
+    if (mappings != null)
     {
-      for (AlignedCodonFrame acf : set)
+      for (AlignedCodonFrame acf : mappings)
       {
         if (cdnaSeq == acf.getDnaForAaSeq(aaSeq))
         {
@@ -355,16 +387,22 @@ public class AlignmentUtils
   }
 
   /**
-   * Build a mapping (if possible) of a protein to a cDNA sequence. The cDNA
-   * must be three times the length of the protein, possibly after ignoring
-   * start and/or stop codons, and must translate to the protein. Returns null
-   * if no mapping is determined.
+   * Builds a mapping (if possible) of a cDNA to a protein sequence.
+   * <ul>
+   * <li>first checks if the cdna translates exactly to the protein sequence</li>
+   * <li>else checks for translation after removing a STOP codon</li>
+   * <li>else checks for translation after removing a START codon</li>
+   * <li>if that fails, inspect CDS features on the cDNA sequence</li>
+   * </ul>
+   * Returns null if no mapping is determined.
    * 
-   * @param proteinSeqs
+   * @param proteinSeq
+   *          the aligned protein sequence
    * @param cdnaSeq
+   *          the aligned cdna sequence
    * @return
    */
-  public static MapList mapProteinSequenceToCdna(SequenceI proteinSeq,
+  public static MapList mapCdnaToProtein(SequenceI proteinSeq,
           SequenceI cdnaSeq)
   {
     /*
@@ -394,7 +432,7 @@ public class AlignmentUtils
     final int proteinEnd = proteinSeq.getEnd();
 
     /*
-     * If lengths don't match, try ignoring stop codon.
+     * If lengths don't match, try ignoring stop codon (if present)
      */
     if (cdnaLength != mappedLength && cdnaLength > 2)
     {
@@ -425,17 +463,20 @@ public class AlignmentUtils
       cdnaLength -= 3;
     }
 
-    if (cdnaLength != mappedLength)
-    {
-      return null;
-    }
-    if (!translatesAs(cdnaSeqChars, startOffset, aaSeqChars))
+    if (translatesAs(cdnaSeqChars, startOffset, aaSeqChars))
     {
-      return null;
+      /*
+       * protein is translation of dna (+/- start/stop codons)
+       */
+      MapList map = new MapList(new int[] { cdnaStart, cdnaEnd }, new int[]
+      { proteinStart, proteinEnd }, 3, 1);
+      return map;
     }
-    MapList map = new MapList(new int[] { cdnaStart, cdnaEnd }, new int[] {
-        proteinStart, proteinEnd }, 3, 1);
-    return map;
+
+    /*
+     * translation failed - try mapping CDS annotated regions of dna
+     */
+    return mapCdsToProtein(cdnaSeq, proteinSeq);
   }
 
   /**
@@ -456,16 +497,18 @@ public class AlignmentUtils
       return false;
     }
 
-    int aaResidue = 0;
-    for (int i = cdnaStart; i < cdnaSeqChars.length - 2
-            && aaResidue < aaSeqChars.length; i += 3, aaResidue++)
+    int aaPos = 0;
+    int dnaPos = cdnaStart;
+    for (; dnaPos < cdnaSeqChars.length - 2
+            && aaPos < aaSeqChars.length; dnaPos += 3, aaPos++)
     {
-      String codon = String.valueOf(cdnaSeqChars, i, 3);
+      String codon = String.valueOf(cdnaSeqChars, dnaPos, 3);
       final String translated = ResidueProperties.codonTranslate(codon);
+
       /*
        * allow * in protein to match untranslatable in dna
        */
-      final char aaRes = aaSeqChars[aaResidue];
+      final char aaRes = aaSeqChars[aaPos];
       if ((translated == null || "STOP".equals(translated)) && aaRes == '*')
       {
         continue;
@@ -478,8 +521,32 @@ public class AlignmentUtils
         return false;
       }
     }
-    // fail if we didn't match all of the aa sequence
-    return (aaResidue == aaSeqChars.length);
+
+    /*
+     * check we matched all of the protein sequence
+     */
+    if (aaPos != aaSeqChars.length)
+    {
+      return false;
+    }
+
+    /*
+     * check we matched all of the dna except
+     * for optional trailing STOP codon
+     */
+    if (dnaPos == cdnaSeqChars.length)
+    {
+      return true;
+    }
+    if (dnaPos == cdnaSeqChars.length - 3)
+    {
+      String codon = String.valueOf(cdnaSeqChars, dnaPos, 3);
+      if ("STOP".equals(ResidueProperties.codonTranslate(codon)))
+      {
+        return true;
+      }
+    }
+    return false;
   }
 
   /**
@@ -514,14 +581,14 @@ public class AlignmentUtils
 
     /*
      * Locate the aligned source sequence whose dataset sequence is mapped. We
-     * just take the first match here (as we can't align cDNA like more than one
-     * protein sequence).
+     * just take the first match here (as we can't align like more than one
+     * sequence).
      */
     SequenceI alignFrom = null;
     AlignedCodonFrame mapping = null;
     for (AlignedCodonFrame mp : mappings)
     {
-      alignFrom = mp.findAlignedSequence(seq.getDatasetSequence(), al);
+      alignFrom = mp.findAlignedSequence(seq, al);
       if (alignFrom != null)
       {
         mapping = mp;
@@ -541,8 +608,8 @@ public class AlignmentUtils
   /**
    * Align sequence 'alignTo' the same way as 'alignFrom', using the mapping to
    * match residues and codons. Flags control whether existing gaps in unmapped
-   * (intron) and mapped (exon) regions are preserved or not. Gaps linking intro
-   * and exon are only retained if both flags are set.
+   * (intron) and mapped (exon) regions are preserved or not. Gaps between
+   * intron and exon are only retained if both flags are set.
    * 
    * @param alignTo
    * @param alignFrom
@@ -558,9 +625,6 @@ public class AlignmentUtils
           boolean preserveUnmappedGaps)
   {
     // TODO generalise to work for Protein-Protein, dna-dna, dna-protein
-    final char[] thisSeq = alignTo.getSequence();
-    final char[] thatAligned = alignFrom.getSequence();
-    StringBuilder thisAligned = new StringBuilder(2 * thisSeq.length);
 
     // aligned and dataset sequence positions, all base zero
     int thisSeqPos = 0;
@@ -570,13 +634,17 @@ public class AlignmentUtils
     char myGapChar = myGap.charAt(0);
     int ratio = myGap.length();
 
-    /*
-     * Traverse the aligned protein sequence.
-     */
     int fromOffset = alignFrom.getStart() - 1;
     int toOffset = alignTo.getStart() - 1;
     int sourceGapMappedLength = 0;
     boolean inExon = false;
+    final char[] thisSeq = alignTo.getSequence();
+    final char[] thatAligned = alignFrom.getSequence();
+    StringBuilder thisAligned = new StringBuilder(2 * thisSeq.length);
+
+    /*
+     * Traverse the 'model' aligned sequence
+     */
     for (char sourceChar : thatAligned)
     {
       if (sourceChar == sourceGap)
@@ -586,7 +654,7 @@ public class AlignmentUtils
       }
 
       /*
-       * Found a residue. Locate its mapped codon (start) position.
+       * Found a non-gap character. Locate its mapped region if any.
        */
       sourceDsPos++;
       // Note mapping positions are base 1, our sequence positions base 0
@@ -595,11 +663,13 @@ public class AlignmentUtils
       if (mappedPos == null)
       {
         /*
-         * Abort realignment if unmapped protein. Or could ignore it??
+         * unmapped position; treat like a gap
          */
-        System.err.println("Can't align: no codon mapping to residue "
-                + sourceDsPos + "(" + sourceChar + ")");
-        return;
+        sourceGapMappedLength += ratio;
+        // System.err.println("Can't align: no codon mapping to residue "
+        // + sourceDsPos + "(" + sourceChar + ")");
+        // return;
+        continue;
       }
 
       int mappedCodonStart = mappedPos[0]; // position (1...) of codon start
@@ -669,8 +739,8 @@ public class AlignmentUtils
     }
 
     /*
-     * At end of protein sequence. Copy any remaining dna sequence, optionally
-     * including (intron) gaps. We do not copy trailing gaps in protein.
+     * At end of model aligned sequence. Copy any remaining target sequence, optionally
+     * including (intron) gaps.
      */
     while (thisSeqPos < thisSeq.length)
     {
@@ -679,6 +749,20 @@ public class AlignmentUtils
       {
         thisAligned.append(c);
       }
+      sourceGapMappedLength--;
+    }
+
+    /*
+     * finally add gaps to pad for any trailing source gaps or
+     * unmapped characters
+     */
+    if (preserveUnmappedGaps)
+    {
+      while (sourceGapMappedLength > 0)
+      {
+        thisAligned.append(myGapChar);
+        sourceGapMappedLength--;
+      }
     }
 
     /*
@@ -753,187 +837,164 @@ public class AlignmentUtils
   }
 
   /**
-   * Returns a list of sequences mapped from the given sequences and aligned
-   * (gapped) in the same way. For example, the cDNA for aligned protein, where
-   * a single gap in protein generates three gaps in cDNA.
+   * Realigns the given protein to match the alignment of the dna, using codon
+   * mappings to translate aligned codon positions to protein residues.
    * 
-   * @param sequences
-   * @param gapCharacter
-   * @param mappings
-   * @return
+   * @param protein
+   *          the alignment whose sequences are realigned by this method
+   * @param dna
+   *          the dna alignment whose alignment we are 'copying'
+   * @return the number of sequences that were realigned
    */
-  public static List<SequenceI> getAlignedTranslation(
-          List<SequenceI> sequences, char gapCharacter,
-          Set<AlignedCodonFrame> mappings)
+  public static int alignProteinAsDna(AlignmentI protein, AlignmentI dna)
   {
-    List<SequenceI> alignedSeqs = new ArrayList<SequenceI>();
-
-    for (SequenceI seq : sequences)
-    {
-      List<SequenceI> mapped = getAlignedTranslation(seq, gapCharacter,
-              mappings);
-      alignedSeqs.addAll(mapped);
-    }
-    return alignedSeqs;
+    List<SequenceI> unmappedProtein = new ArrayList<SequenceI>();
+    Map<AlignedCodon, Map<SequenceI, AlignedCodon>> alignedCodons = buildCodonColumnsMap(
+            protein, dna, unmappedProtein);
+    return alignProteinAs(protein, alignedCodons, unmappedProtein);
   }
 
   /**
-   * Returns sequences aligned 'like' the source sequence, as mapped by the
-   * given mappings. Normally we expect zero or one 'mapped' sequences, but this
-   * will support 1-to-many as well.
+   * 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
+   * the codons, and allows us to read off the peptides at each position in
+   * order to assemble 'aligned' protein sequences.
    * 
-   * @param seq
-   * @param gapCharacter
-   * @param mappings
+   * @param protein
+   *          the protein alignment
+   * @param dna
+   *          the coding dna alignment
+   * @param unmappedProtein
+   *          any unmapped proteins are added to this list
    * @return
    */
-  protected static List<SequenceI> getAlignedTranslation(SequenceI seq,
-          char gapCharacter, Set<AlignedCodonFrame> mappings)
+  protected static Map<AlignedCodon, Map<SequenceI, AlignedCodon>> buildCodonColumnsMap(
+          AlignmentI protein, AlignmentI dna,
+          List<SequenceI> unmappedProtein)
   {
-    List<SequenceI> result = new ArrayList<SequenceI>();
-    for (AlignedCodonFrame mapping : mappings)
+    /*
+     * maintain a list of any proteins with no mappings - these will be
+     * rendered 'as is' in the protein alignment as we can't align them
+     */
+    unmappedProtein.addAll(protein.getSequences());
+
+    List<AlignedCodonFrame> mappings = protein.getCodonFrames();
+
+    /*
+     * Map will hold, for each aligned codon position e.g. [3, 5, 6], a map of
+     * {dnaSequence, {proteinSequence, codonProduct}} at that position. The
+     * comparator keeps the codon positions ordered.
+     */
+    Map<AlignedCodon, Map<SequenceI, AlignedCodon>> alignedCodons = new TreeMap<AlignedCodon, Map<SequenceI, AlignedCodon>>(
+            new CodonComparator());
+
+    for (SequenceI dnaSeq : dna.getSequences())
     {
-      if (mapping.involvesSequence(seq))
+      for (AlignedCodonFrame mapping : mappings)
       {
-        SequenceI mapped = getAlignedTranslation(seq, gapCharacter, mapping);
-        if (mapped != null)
+        SequenceI prot = mapping.findAlignedSequence(dnaSeq, protein);
+        if (prot != null)
         {
-          result.add(mapped);
+          Mapping seqMap = mapping.getMappingForSequence(dnaSeq);
+          addCodonPositions(dnaSeq, prot, protein.getGapCharacter(),
+                  seqMap, alignedCodons);
+          unmappedProtein.remove(prot);
         }
       }
     }
-    return result;
+
+    /*
+     * Finally add any unmapped peptide start residues (e.g. for incomplete
+     * codons) as if at the codon position before the second residue
+     */
+    // TODO resolve JAL-2022 so this fudge can be removed
+    int mappedSequenceCount = protein.getHeight() - unmappedProtein.size();
+    addUnmappedPeptideStarts(alignedCodons, mappedSequenceCount);
+    
+    return alignedCodons;
   }
 
   /**
-   * Returns the translation of 'seq' (as held in the mapping) with
-   * corresponding alignment (gaps).
+   * Scans for any protein mapped from position 2 (meaning unmapped start
+   * position e.g. an incomplete codon), and synthesizes a 'codon' for it at the
+   * preceding position in the alignment
    * 
-   * @param seq
-   * @param gapCharacter
-   * @param mapping
-   * @return
+   * @param alignedCodons
+   *          the codon-to-peptide map
+   * @param mappedSequenceCount
+   *          the number of distinct sequences in the map
    */
-  protected static SequenceI getAlignedTranslation(SequenceI seq,
-          char gapCharacter, AlignedCodonFrame mapping)
+  protected static void addUnmappedPeptideStarts(
+          Map<AlignedCodon, Map<SequenceI, AlignedCodon>> alignedCodons,
+          int mappedSequenceCount)
   {
-    String gap = String.valueOf(gapCharacter);
-    boolean toDna = false;
-    int fromRatio = 1;
-    SequenceI mapTo = mapping.getDnaForAaSeq(seq);
-    if (mapTo != null)
-    {
-      // mapping is from protein to nucleotide
-      toDna = true;
-      // should ideally get gap count ratio from mapping
-      gap = String.valueOf(new char[] { gapCharacter, gapCharacter,
-          gapCharacter });
-    }
-    else
-    {
-      // mapping is from nucleotide to protein
-      mapTo = mapping.getAaForDnaSeq(seq);
-      fromRatio = 3;
-    }
-    StringBuilder newseq = new StringBuilder(seq.getLength()
-            * (toDna ? 3 : 1));
+    // TODO delete this ugly hack once JAL-2022 is resolved
+    // i.e. we can model startPhase > 0 (incomplete start codon)
 
-    int residueNo = 0; // in seq, base 1
-    int[] phrase = new int[fromRatio];
-    int phraseOffset = 0;
-    int gapWidth = 0;
-    boolean first = true;
-    final Sequence alignedSeq = new Sequence("", "");
+    List<SequenceI> sequencesChecked = new ArrayList<SequenceI>();
+    AlignedCodon lastCodon = null;
+    Map<SequenceI, AlignedCodon> toAdd = new HashMap<SequenceI, AlignedCodon>();
 
-    for (char c : seq.getSequence())
+    for (Entry<AlignedCodon, Map<SequenceI, AlignedCodon>> entry : alignedCodons
+            .entrySet())
     {
-      if (c == gapCharacter)
+      for (Entry<SequenceI, AlignedCodon> sequenceCodon : entry.getValue()
+              .entrySet())
       {
-        gapWidth++;
-        if (gapWidth >= fromRatio)
+        SequenceI seq = sequenceCodon.getKey();
+        if (sequencesChecked.contains(seq))
         {
-          newseq.append(gap);
-          gapWidth = 0;
+          continue;
         }
-      }
-      else
-      {
-        phrase[phraseOffset++] = residueNo + 1;
-        if (phraseOffset == fromRatio)
+        sequencesChecked.add(seq);
+        AlignedCodon codon = sequenceCodon.getValue();
+        if (codon.peptideCol > 1)
+        {
+          System.err
+                  .println("Problem mapping protein with >1 unmapped start positions: "
+                          + seq.getName());
+        }
+        else if (codon.peptideCol == 1)
         {
           /*
-           * Have read a whole codon (or protein residue), now translate: map
-           * source phrase to positions in target sequence add characters at
-           * these positions to newseq Note mapping positions are base 1, our
-           * sequence positions base 0.
+           * first position (peptideCol == 0) was unmapped - add it
            */
-          SearchResults sr = new SearchResults();
-          for (int pos : phrase)
+          if (lastCodon != null)
           {
-            mapping.markMappedRegion(seq, pos, sr);
+            AlignedCodon firstPeptide = new AlignedCodon(lastCodon.pos1,
+                    lastCodon.pos2, lastCodon.pos3, String.valueOf(seq
+                            .getCharAt(0)), 0);
+            toAdd.put(seq, firstPeptide);
           }
-          newseq.append(sr.getCharacters());
-          if (first)
+          else
           {
-            first = false;
-            // Hack: Copy sequence dataset, name and description from
-            // SearchResults.match[0].sequence
-            // TODO? carry over sequence names from original 'complement'
-            // alignment
-            SequenceI mappedTo = sr.getResultSequence(0);
-            alignedSeq.setName(mappedTo.getName());
-            alignedSeq.setDescription(mappedTo.getDescription());
-            alignedSeq.setDatasetSequence(mappedTo);
+            /*
+             * unmapped residue at start of alignment (no prior column) -
+             * 'insert' at nominal codon [0, 0, 0]
+             */
+            AlignedCodon firstPeptide = new AlignedCodon(0, 0, 0,
+                    String.valueOf(seq.getCharAt(0)), 0);
+            toAdd.put(seq, firstPeptide);
           }
-          phraseOffset = 0;
         }
-        residueNo++;
+        if (sequencesChecked.size() == mappedSequenceCount)
+        {
+          // no need to check past first mapped position in all sequences
+          break;
+        }
       }
+      lastCodon = entry.getKey();
     }
-    alignedSeq.setSequence(newseq.toString());
-    return alignedSeq;
-  }
-
-  /**
-   * Realigns the given protein to match the alignment of the dna, using codon
-   * mappings to translate aligned codon positions to protein residues.
-   * 
-   * @param protein
-   *          the alignment whose sequences are realigned by this method
-   * @param dna
-   *          the dna alignment whose alignment we are 'copying'
-   * @return the number of sequences that were realigned
-   */
-  public static int alignProteinAsDna(AlignmentI protein, AlignmentI dna)
-  {
-    List<SequenceI> unmappedProtein = new ArrayList<SequenceI>();
-    unmappedProtein.addAll(protein.getSequences());
-
-    Set<AlignedCodonFrame> mappings = protein.getCodonFrames();
 
     /*
-     * Map will hold, for each aligned codon position e.g. [3, 5, 6], a map of
-     * {dnaSequence, {proteinSequence, codonProduct}} at that position. The
-     * comparator keeps the codon positions ordered.
+     * add any new codons safely after iterating over the map
      */
-    Map<AlignedCodon, Map<SequenceI, String>> alignedCodons = new TreeMap<AlignedCodon, Map<SequenceI, String>>(
-            new CodonComparator());
-    for (SequenceI dnaSeq : dna.getSequences())
+    for (Entry<SequenceI, AlignedCodon> startCodon : toAdd.entrySet())
     {
-      for (AlignedCodonFrame mapping : mappings)
-      {
-        Mapping seqMap = mapping.getMappingForSequence(dnaSeq);
-        SequenceI prot = mapping.findAlignedSequence(
-                dnaSeq.getDatasetSequence(), protein);
-        if (prot != null)
-        {
-          addCodonPositions(dnaSeq, prot, protein.getGapCharacter(),
-                  seqMap, alignedCodons);
-          unmappedProtein.remove(prot);
-        }
-      }
+      addCodonToMap(alignedCodons, startCodon.getValue(),
+              startCodon.getKey());
     }
-    return alignProteinAs(protein, alignedCodons, unmappedProtein);
   }
 
   /**
@@ -948,7 +1009,7 @@ public class AlignmentUtils
    * @return
    */
   protected static int alignProteinAs(AlignmentI protein,
-          Map<AlignedCodon, Map<SequenceI, String>> alignedCodons,
+          Map<AlignedCodon, Map<SequenceI, AlignedCodon>> alignedCodons,
           List<SequenceI> unmappedProtein)
   {
     /*
@@ -970,12 +1031,13 @@ public class AlignmentUtils
     int column = 0;
     for (AlignedCodon codon : alignedCodons.keySet())
     {
-      final Map<SequenceI, String> columnResidues = alignedCodons
+      final Map<SequenceI, AlignedCodon> columnResidues = alignedCodons
               .get(codon);
-      for (Entry<SequenceI, String> entry : columnResidues.entrySet())
+      for (Entry<SequenceI, AlignedCodon> entry : columnResidues.entrySet())
       {
         // place translated codon at its column position in sequence
-        entry.getKey().getSequence()[column] = entry.getValue().charAt(0);
+        entry.getKey().getSequence()[column] = entry.getValue().product
+                .charAt(0);
       }
       column++;
     }
@@ -1000,23 +1062,51 @@ public class AlignmentUtils
    */
   static void addCodonPositions(SequenceI dna, SequenceI protein,
           char gapChar, Mapping seqMap,
-          Map<AlignedCodon, Map<SequenceI, String>> alignedCodons)
+          Map<AlignedCodon, Map<SequenceI, AlignedCodon>> alignedCodons)
   {
     Iterator<AlignedCodon> codons = seqMap.getCodonIterator(dna, gapChar);
+
+    /*
+     * add codon positions, and their peptide translations, to the alignment
+     * map, while remembering the first codon mapped
+     */
     while (codons.hasNext())
     {
-      AlignedCodon codon = codons.next();
-      Map<SequenceI, String> seqProduct = alignedCodons.get(codon);
-      if (seqProduct == null)
+      try
       {
-        seqProduct = new HashMap<SequenceI, String>();
-        alignedCodons.put(codon, seqProduct);
+        AlignedCodon codon = codons.next();
+        addCodonToMap(alignedCodons, codon, protein);
+      } catch (IncompleteCodonException e)
+      {
+        // possible incomplete trailing codon - ignore
+      } catch (NoSuchElementException e)
+      {
+        // possibly peptide lacking STOP
       }
-      seqProduct.put(protein, codon.product);
     }
   }
 
   /**
+   * Helper method to add a codon-to-peptide entry to the aligned codons map
+   * 
+   * @param alignedCodons
+   * @param codon
+   * @param protein
+   */
+  protected static void addCodonToMap(
+          Map<AlignedCodon, Map<SequenceI, AlignedCodon>> alignedCodons,
+          AlignedCodon codon, SequenceI protein)
+  {
+    Map<SequenceI, AlignedCodon> seqProduct = alignedCodons.get(codon);
+    if (seqProduct == null)
+    {
+      seqProduct = new HashMap<SequenceI, AlignedCodon>();
+      alignedCodons.put(codon, seqProduct);
+    }
+    seqProduct.put(protein, codon);
+  }
+
+  /**
    * Returns true if a cDNA/Protein mapping either exists, or could be made,
    * between at least one pair of sequences in the two alignments. Currently,
    * the logic is:
@@ -1048,7 +1138,7 @@ public class AlignmentUtils
     }
     AlignmentI dna = al1.isNucleotide() ? al1 : al2;
     AlignmentI protein = dna == al1 ? al2 : al1;
-    Set<AlignedCodonFrame> mappings = protein.getCodonFrames();
+    List<AlignedCodonFrame> mappings = protein.getCodonFrames();
     for (SequenceI dnaSeq : dna.getSequences())
     {
       for (SequenceI proteinSeq : protein.getSequences())
@@ -1072,7 +1162,7 @@ public class AlignmentUtils
    * @return
    */
   protected static boolean isMappable(SequenceI dnaSeq,
-          SequenceI proteinSeq, Set<AlignedCodonFrame> mappings)
+          SequenceI proteinSeq, List<AlignedCodonFrame> mappings)
   {
     if (dnaSeq == null || proteinSeq == null)
     {
@@ -1084,13 +1174,13 @@ public class AlignmentUtils
     SequenceI proteinDs = proteinSeq.getDatasetSequence() == null ? proteinSeq
             : proteinSeq.getDatasetSequence();
 
-    /*
-     * Already mapped?
-     */
     for (AlignedCodonFrame mapping : mappings)
     {
       if (proteinDs == mapping.getAaForDnaSeq(dnaDs))
       {
+        /*
+         * already mapped
+         */
         return true;
       }
     }
@@ -1099,7 +1189,7 @@ public class AlignmentUtils
      * Just try to make a mapping (it is not yet stored), test whether
      * successful.
      */
-    return mapProteinSequenceToCdna(proteinDs, dnaDs) != null;
+    return mapCdnaToProtein(proteinDs, dnaDs) != null;
   }
 
   /**
@@ -1301,133 +1391,957 @@ public class AlignmentUtils
   }
 
   /**
-   * Constructs an alignment consisting of the mapped exon regions in the given
-   * nucleotide sequences, and updates mappings to match.
+   * Constructs an alignment consisting of the mapped (CDS) regions in the given
+   * nucleotide sequences, and updates mappings to match. The CDS sequences are
+   * added to the original alignment's dataset, which is shared by the new
+   * alignment. Mappings from nucleotide to CDS, and from CDS to protein, are
+   * added to the alignment dataset.
    * 
    * @param dna
    *          aligned dna sequences
    * @param mappings
-   *          from dna to protein; these are replaced with new mappings
-   * @return an alignment whose sequences are the exon-only parts of the dna
-   *         sequences (or null if no exons are found)
+   *          from dna to protein
+   * @param al
+   * @return an alignment whose sequences are the cds-only parts of the dna
+   *         sequences (or null if no mappings are found)
    */
-  public static AlignmentI makeExonAlignment(SequenceI[] dna,
-          Set<AlignedCodonFrame> mappings)
+  public static AlignmentI makeCdsAlignment(SequenceI[] dna,
+          List<AlignedCodonFrame> mappings, AlignmentI al)
   {
-    Set<AlignedCodonFrame> newMappings = new LinkedHashSet<AlignedCodonFrame>();
-    List<SequenceI> exonSequences = new ArrayList<SequenceI>();
-
-    for (SequenceI dnaSeq : dna)
+    List<SequenceI> cdsSeqs = new ArrayList<SequenceI>();
+    
+    for (SequenceI seq : dna)
     {
-      final SequenceI ds = dnaSeq.getDatasetSequence();
+      AlignedCodonFrame cdsMappings = new AlignedCodonFrame();
       List<AlignedCodonFrame> seqMappings = MappingUtils
-              .findMappingsForSequence(ds, mappings);
-      for (AlignedCodonFrame acf : seqMappings)
+              .findMappingsForSequence(seq, mappings);
+      List<AlignedCodonFrame> alignmentMappings = al.getCodonFrames();
+      for (AlignedCodonFrame mapping : seqMappings)
       {
-        AlignedCodonFrame newMapping = new AlignedCodonFrame();
-        final List<SequenceI> mappedExons = makeExonSequences(ds, acf,
-                newMapping);
-        if (!mappedExons.isEmpty())
+        for (Mapping aMapping : mapping.getMappingsFromSequence(seq))
         {
-          exonSequences.addAll(mappedExons);
-          newMappings.add(newMapping);
+          SequenceI cdsSeq = makeCdsSequence(seq.getDatasetSequence(),
+                  aMapping);
+          cdsSeqs.add(cdsSeq);
+    
+          /*
+           * add a mapping from CDS to the (unchanged) mapped to range
+           */
+          List<int[]> 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);
+
+          /*
+           * add another mapping from original 'from' range to CDS
+           */
+          map = new MapList(aMapping.getMap().getFromRanges(), cdsRange, 1,
+                  1);
+          cdsMappings.addMap(seq.getDatasetSequence(), cdsSeq, map);
+
+          alignmentMappings.add(cdsMappings);
+
+          /*
+           * transfer any features on dna that overlap the CDS
+           */
+          transferFeatures(seq, cdsSeq, map, null, SequenceOntologyI.CDS);
         }
       }
     }
-    AlignmentI al = new Alignment(
-            exonSequences.toArray(new SequenceI[exonSequences.size()]));
-    al.setDataset(null);
 
     /*
-     * Replace the old mappings with the new ones
+     * add CDS seqs to shared dataset
      */
-    mappings.clear();
-    mappings.addAll(newMappings);
+    Alignment dataset = al.getDataset();
+    for (SequenceI seq : cdsSeqs)
+    {
+      if (!dataset.getSequences().contains(seq.getDatasetSequence()))
+      {
+        dataset.addSequence(seq.getDatasetSequence());
+      }
+    }
+    AlignmentI cds = new Alignment(cdsSeqs.toArray(new SequenceI[cdsSeqs
+            .size()]));
+    cds.setDataset(dataset);
 
-    return al;
+    return cds;
   }
 
   /**
-   * Helper method to make exon-only sequences and populate their mappings to
-   * protein products
-   * <p>
-   * For example, if ggCCaTTcGAg has mappings [3, 4, 6, 7, 9, 10] to protein
-   * then generate a sequence CCTTGA with mapping [1, 6] to the same protein
-   * residues
-   * <p>
-   * Typically eukaryotic dna will include exons encoding for a single peptide
-   * sequence i.e. return a single result. Bacterial dna may have overlapping
-   * exon mappings coding for multiple peptides so return multiple results
-   * (example EMBL KF591215).
+   * Helper method that makes a CDS sequence as defined by the mappings from the
+   * given sequence i.e. extracts the 'mapped from' ranges (which may be on
+   * forward or reverse strand).
    * 
-   * @param dnaSeq
-   *          a dna dataset sequence
+   * @param seq
    * @param mapping
-   *          containing one or more mappings of the sequence to protein
-   * @param newMapping
-   *          the new mapping to populate, from the exon-only sequences to their
-   *          mapped protein sequences
    * @return
    */
-  protected static List<SequenceI> makeExonSequences(SequenceI dnaSeq,
-          AlignedCodonFrame mapping, AlignedCodonFrame newMapping)
+  static SequenceI makeCdsSequence(SequenceI seq, Mapping mapping)
   {
-    List<SequenceI> exonSequences = new ArrayList<SequenceI>();
-    List<Mapping> seqMappings = mapping.getMappingsForSequence(dnaSeq);
-    final char[] dna = dnaSeq.getSequence();
-    for (Mapping seqMapping : seqMappings)
-    {
-      StringBuilder newSequence = new StringBuilder(dnaSeq.getLength());
+    char[] seqChars = seq.getSequence();
+    List<int[]> fromRanges = mapping.getMap().getFromRanges();
+    int cdsWidth = MappingUtils.getLength(fromRanges);
+    char[] newSeqChars = new char[cdsWidth];
 
-      /*
-       * Get the codon regions as { [2, 5], [7, 12], [14, 14] etc }
-       */
-      final List<int[]> dnaExonRanges = seqMapping.getMap().getFromRanges();
-      for (int[] range : dnaExonRanges)
+    int newPos = 0;
+    for (int[] range : fromRanges)
+    {
+      if (range[0] <= range[1])
+      {
+        // forward strand mapping - just copy the range
+        int length = range[1] - range[0] + 1;
+        System.arraycopy(seqChars, range[0] - 1, newSeqChars, newPos,
+                length);
+        newPos += length;
+      }
+      else
       {
-        for (int pos = range[0]; pos <= range[1]; pos++)
+        // reverse strand mapping - copy and complement one by one
+        for (int i = range[0]; i >= range[1]; i--)
         {
-          newSequence.append(dna[pos - 1]);
+          newSeqChars[newPos++] = Dna.getComplement(seqChars[i - 1]);
         }
       }
+    }
 
-      SequenceI exon = new Sequence(dnaSeq.getName(),
-              newSequence.toString());
+    SequenceI newSeq = new Sequence(seq.getName() + "|"
+            + mapping.getTo().getName(), newSeqChars, 1, newPos);
+    newSeq.createDatasetSequence();
+    return newSeq;
+  }
 
-      /*
-       * Locate any xrefs to CDS database on the protein product and attach to
-       * the CDS sequence. Also add as a sub-token of the sequence name.
-       */
-      // default to "CDS" if we can't locate an actual gene id
-      String cdsAccId = FeatureProperties
-              .getCodingFeature(DBRefSource.EMBL);
-      DBRefEntry[] cdsRefs = DBRefUtils.selectRefs(seqMapping.getTo()
-              .getDBRefs(), DBRefSource.CODINGDBS);
-      if (cdsRefs != null)
+  /**
+   * Transfers co-located features on 'fromSeq' to 'toSeq', adjusting the
+   * feature start/end ranges, optionally omitting specified feature types.
+   * Returns the number of features copied.
+   * 
+   * @param fromSeq
+   * @param toSeq
+   * @param select
+   *          if not null, only features of this type are copied (including
+   *          subtypes in the Sequence Ontology)
+   * @param mapping
+   *          the mapping from 'fromSeq' to 'toSeq'
+   * @param omitting
+   */
+  public static int transferFeatures(SequenceI fromSeq, SequenceI toSeq,
+          MapList mapping, String select, String... omitting)
+  {
+    SequenceI copyTo = toSeq;
+    while (copyTo.getDatasetSequence() != null)
+    {
+      copyTo = copyTo.getDatasetSequence();
+    }
+
+    SequenceOntologyI so = SequenceOntologyFactory.getInstance();
+    int count = 0;
+    SequenceFeature[] sfs = fromSeq.getSequenceFeatures();
+    if (sfs != null)
+    {
+      for (SequenceFeature sf : sfs)
       {
-        for (DBRefEntry cdsRef : cdsRefs)
+        String type = sf.getType();
+        if (select != null && !so.isA(type, select))
+        {
+          continue;
+        }
+        boolean omit = false;
+        for (String toOmit : omitting)
+        {
+          if (type.equals(toOmit))
+          {
+            omit = true;
+          }
+        }
+        if (omit)
         {
-          exon.addDBRef(new DBRefEntry(cdsRef));
-          cdsAccId = cdsRef.getAccessionId();
+          continue;
+        }
+
+        /*
+         * locate the mapped range - null if either start or end is
+         * not mapped (no partial overlaps are calculated)
+         */
+        int start = sf.getBegin();
+        int end = sf.getEnd();
+        int[] mappedTo = mapping.locateInTo(start, end);
+        /*
+         * if whole exon range doesn't map, try interpreting it
+         * as 5' or 3' exon overlapping the CDS range
+         */
+        if (mappedTo == null)
+        {
+          mappedTo = mapping.locateInTo(end, end);
+          if (mappedTo != null)
+          {
+            /*
+             * end of exon is in CDS range - 5' overlap
+             * to a range from the start of the peptide
+             */
+            mappedTo[0] = 1;
+          }
+        }
+        if (mappedTo == null)
+        {
+          mappedTo = mapping.locateInTo(start, start);
+          if (mappedTo != null)
+          {
+            /*
+             * start of exon is in CDS range - 3' overlap
+             * to a range up to the end of the peptide
+             */
+            mappedTo[1] = toSeq.getLength();
+          }
+        }
+        if (mappedTo != null)
+        {
+          SequenceFeature copy = new SequenceFeature(sf);
+          copy.setBegin(Math.min(mappedTo[0], mappedTo[1]));
+          copy.setEnd(Math.max(mappedTo[0], mappedTo[1]));
+          copyTo.addSequenceFeature(copy);
+          count++;
         }
       }
-      exon.setName(exon.getName() + "|" + cdsAccId);
-      exon.createDatasetSequence();
+    }
+    return count;
+  }
 
-      /*
-       * Build new mappings - from the same protein regions, but now to
-       * contiguous exons
-       */
-      List<int[]> exonRange = new ArrayList<int[]>();
-      exonRange.add(new int[] { 1, newSequence.length() });
-      MapList map = new MapList(exonRange, seqMapping.getMap()
-              .getToRanges(), 3, 1);
-      newMapping.addMap(exon.getDatasetSequence(), seqMapping.getTo(), map);
-      MapList cdsToDnaMap = new MapList(dnaExonRanges, exonRange, 1, 1);
-      newMapping.addMap(dnaSeq, exon.getDatasetSequence(), cdsToDnaMap);
+  /**
+   * Returns a mapping from dna to protein by inspecting sequence features of
+   * type "CDS" on the dna.
+   * 
+   * @param dnaSeq
+   * @param proteinSeq
+   * @return
+   */
+  public static MapList mapCdsToProtein(SequenceI dnaSeq,
+          SequenceI proteinSeq)
+  {
+    List<int[]> ranges = findCdsPositions(dnaSeq);
+    int mappedDnaLength = MappingUtils.getLength(ranges);
 
-      exonSequences.add(exon);
-    }
-    return exonSequences;
+    int proteinLength = proteinSeq.getLength();
+    int proteinStart = proteinSeq.getStart();
+    int proteinEnd = proteinSeq.getEnd();
+
+    /*
+     * incomplete start codon may mean X at start of peptide
+     * we ignore both for mapping purposes
+     */
+    if (proteinSeq.getCharAt(0) == 'X')
+    {
+      // todo JAL-2022 support startPhase > 0
+      proteinStart++;
+      proteinLength--;
+    }
+    List<int[]> proteinRange = new ArrayList<int[]>();
+
+    /*
+     * dna length should map to protein (or protein plus stop codon)
+     */
+    int codesForResidues = mappedDnaLength / 3;
+    if (codesForResidues == (proteinLength + 1))
+    {
+      // assuming extra codon is for STOP and not in peptide
+      codesForResidues--;
+    }
+    if (codesForResidues == proteinLength)
+    {
+      proteinRange.add(new int[] { proteinStart, proteinEnd });
+      return new MapList(ranges, proteinRange, 3, 1);
+    }
+    return null;
+  }
+
+  /**
+   * Returns a list of CDS ranges found (as sequence positions base 1), i.e. of
+   * start/end positions of sequence features of type "CDS" (or a sub-type of
+   * CDS in the Sequence Ontology). The ranges are sorted into ascending start
+   * position order, so this method is only valid for linear CDS in the same
+   * sense as the protein product.
+   * 
+   * @param dnaSeq
+   * @return
+   */
+  public static List<int[]> findCdsPositions(SequenceI dnaSeq)
+  {
+    List<int[]> result = new ArrayList<int[]>();
+    SequenceFeature[] sfs = dnaSeq.getSequenceFeatures();
+    if (sfs == null)
+    {
+      return result;
+    }
+
+    SequenceOntologyI so = SequenceOntologyFactory.getInstance();
+    int startPhase = 0;
+
+    for (SequenceFeature sf : sfs)
+    {
+      /*
+       * process a CDS feature (or a sub-type of CDS)
+       */
+      if (so.isA(sf.getType(), SequenceOntologyI.CDS))
+      {
+        int phase = 0;
+        try
+        {
+          phase = Integer.parseInt(sf.getPhase());
+        } catch (NumberFormatException e)
+        {
+          // ignore
+        }
+        /*
+         * phase > 0 on first codon means 5' incomplete - skip to the start
+         * of the next codon; example ENST00000496384
+         */
+        int begin = sf.getBegin();
+        int end = sf.getEnd();
+        if (result.isEmpty())
+        {
+          begin += phase;
+          if (begin > end)
+          {
+            // shouldn't happen!
+            System.err
+                    .println("Error: start phase extends beyond start CDS in "
+                            + dnaSeq.getName());
+          }
+        }
+        result.add(new int[] { begin, end });
+      }
+    }
+
+    /*
+     * remove 'startPhase' positions (usually 0) from the first range 
+     * so we begin at the start of a complete codon
+     */
+    if (!result.isEmpty())
+    {
+      // TODO JAL-2022 correctly model start phase > 0
+      result.get(0)[0] += startPhase;
+    }
+
+    /*
+     * Finally sort ranges by start position. This avoids a dependency on 
+     * keeping features in order on the sequence (if they are in order anyway,
+     * the sort will have almost no work to do). The implicit assumption is CDS
+     * ranges are assembled in order. Other cases should not use this method,
+     * but instead construct an explicit mapping for CDS (e.g. EMBL parsing).
+     */
+    Collections.sort(result, new Comparator<int[]>()
+    {
+      @Override
+      public int compare(int[] o1, int[] o2)
+      {
+        return Integer.compare(o1[0], o2[0]);
+      }
+    });
+    return result;
+  }
+
+  /**
+   * Maps exon features from dna to protein, and computes variants in peptide
+   * product generated by variants in dna, and adds them as sequence_variant
+   * features on the protein sequence. Returns the number of variant features
+   * added.
+   * 
+   * @param dnaSeq
+   * @param peptide
+   * @param dnaToProtein
+   */
+  public static int computeProteinFeatures(SequenceI dnaSeq,
+          SequenceI peptide, MapList dnaToProtein)
+  {
+    while (dnaSeq.getDatasetSequence() != null)
+    {
+      dnaSeq = dnaSeq.getDatasetSequence();
+    }
+    while (peptide.getDatasetSequence() != null)
+    {
+      peptide = peptide.getDatasetSequence();
+    }
+
+    transferFeatures(dnaSeq, peptide, dnaToProtein, SequenceOntologyI.EXON);
+
+    /*
+     * compute protein variants from dna variants and codon mappings;
+     * NB - alternatively we could retrieve this using the REST service e.g.
+     * http://rest.ensembl.org/overlap/translation
+     * /ENSP00000288602?feature=transcript_variation;content-type=text/xml
+     * which would be a bit slower but possibly more reliable
+     */
+
+    /*
+     * build a map with codon variations for each potentially varying peptide
+     */
+    LinkedHashMap<Integer, List<DnaVariant>[]> variants = buildDnaVariantsMap(
+            dnaSeq, dnaToProtein);
+
+    /*
+     * scan codon variations, compute peptide variants and add to peptide sequence
+     */
+    int count = 0;
+    for (Entry<Integer, List<DnaVariant>[]> variant : variants.entrySet())
+    {
+      int peptidePos = variant.getKey();
+      List<DnaVariant>[] codonVariants = variant.getValue();
+      count += computePeptideVariants(peptide, peptidePos, codonVariants);
+    }
+
+    /*
+     * 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<SequenceFeature>()
+            {
+              @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;
+  }
+
+  /**
+   * Computes non-synonymous peptide variants from codon variants and adds them
+   * as sequence_variant features on the protein sequence (one feature per
+   * allele variant). Selected attributes (variant id, clinical significance)
+   * are copied over to the new features.
+   * 
+   * @param peptide
+   *          the protein sequence
+   * @param peptidePos
+   *          the position to compute peptide variants for
+   * @param codonVariants
+   *          a list of dna variants per codon position
+   * @return the number of features added
+   */
+  static int computePeptideVariants(SequenceI peptide, int peptidePos,
+          List<DnaVariant>[] codonVariants)
+  {
+    String residue = String.valueOf(peptide.getCharAt(peptidePos - 1));
+    int count = 0;
+    String base1 = codonVariants[0].get(0).base;
+    String base2 = codonVariants[1].get(0).base;
+    String base3 = codonVariants[2].get(0).base;
+
+    /*
+     * variants in first codon base
+     */
+    for (DnaVariant var : codonVariants[0])
+    {
+      if (var.variant != null)
+      {
+        String alleles = (String) var.variant.getValue("alleles");
+        if (alleles != null)
+        {
+          for (String base : alleles.split(","))
+          {
+            String codon = base + base2 + base3;
+            if (addPeptideVariant(peptide, peptidePos, residue, var, codon))
+            {
+              count++;
+            }
+          }
+        }
+      }
+    }
+
+    /*
+     * variants in second codon base
+     */
+    for (DnaVariant var : codonVariants[1])
+    {
+      if (var.variant != null)
+      {
+        String alleles = (String) var.variant.getValue("alleles");
+        if (alleles != null)
+        {
+          for (String base : alleles.split(","))
+          {
+            String codon = base1 + base + base3;
+            if (addPeptideVariant(peptide, peptidePos, residue, var, codon))
+            {
+              count++;
+            }
+          }
+        }
+      }
+    }
+
+    /*
+     * variants in third codon base
+     */
+    for (DnaVariant var : codonVariants[2])
+    {
+      if (var.variant != null)
+      {
+        String alleles = (String) var.variant.getValue("alleles");
+        if (alleles != null)
+        {
+          for (String base : alleles.split(","))
+          {
+            String codon = base1 + base2 + base;
+            if (addPeptideVariant(peptide, peptidePos, residue, var, codon))
+            {
+              count++;
+            }
+          }
+        }
+      }
+    }
+
+    return count;
+  }
+
+  /**
+   * Helper method that adds a peptide variant feature, provided the given codon
+   * translates to a value different to the current residue (is a non-synonymous
+   * variant). ID and clinical_significance attributes of the dna variant (if
+   * present) are copied to the new feature.
+   * 
+   * @param peptide
+   * @param peptidePos
+   * @param residue
+   * @param var
+   * @param codon
+   * @return true if a feature was added, else false
+   */
+  static boolean addPeptideVariant(SequenceI peptide, int peptidePos,
+          String residue, DnaVariant var, String codon)
+  {
+    /*
+     * get peptide translation of codon e.g. GAT -> D
+     * note that variants which are not single alleles,
+     * e.g. multibase variants or HGMD_MUTATION etc
+     * are currently ignored here
+     */
+    String trans = codon.contains("-") ? "-"
+            : (codon.length() > 3 ? null : ResidueProperties
+                    .codonTranslate(codon));
+    if (trans != null && !trans.equals(residue))
+    {
+      String desc = residue + "->" + trans;
+      // set score to 0f so 'graduated colour' option is offered! JAL-2060
+      SequenceFeature sf = new SequenceFeature(
+              SequenceOntologyI.SEQUENCE_VARIANT, desc, peptidePos,
+              peptidePos, 0f, null);
+      StringBuilder attributes = new StringBuilder(32);
+      String id = (String) var.variant.getValue(ID);
+      if (id != null)
+      {
+        if (id.startsWith(SEQUENCE_VARIANT))
+        {
+          id = id.substring(SEQUENCE_VARIANT.length());
+        }
+        sf.setValue(ID, id);
+        attributes.append(ID).append("=").append(id);
+        // TODO handle other species variants
+        StringBuilder link = new StringBuilder(32);
+        try
+        {
+          link.append(desc).append(" ").append(id)
+                  .append("|http://www.ensembl.org/Homo_sapiens/Variation/Summary?v=")
+                  .append(URLEncoder.encode(id, "UTF-8"));
+          sf.addLink(link.toString());
+        } catch (UnsupportedEncodingException e)
+        {
+          // as if
+        }
+      }
+      String clinSig = (String) var.variant
+              .getValue(CLINICAL_SIGNIFICANCE);
+      if (clinSig != null)
+      {
+        sf.setValue(CLINICAL_SIGNIFICANCE, clinSig);
+        attributes.append(";").append(CLINICAL_SIGNIFICANCE).append("=")
+                .append(clinSig);
+      }
+      peptide.addSequenceFeature(sf);
+      if (attributes.length() > 0)
+      {
+        sf.setAttributes(attributes.toString());
+      }
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Builds a map whose key is position in the protein sequence, and value is a
+   * list of the base and all variants for each corresponding codon position
+   * 
+   * @param dnaSeq
+   * @param dnaToProtein
+   * @return
+   */
+  static LinkedHashMap<Integer, List<DnaVariant>[]> buildDnaVariantsMap(
+          SequenceI dnaSeq, MapList dnaToProtein)
+  {
+    /*
+     * map from peptide position to all variants of the codon which codes for it
+     * LinkedHashMap ensures we keep the peptide features in sequence order
+     */
+    LinkedHashMap<Integer, List<DnaVariant>[]> variants = new LinkedHashMap<Integer, List<DnaVariant>[]>();
+    SequenceOntologyI so = SequenceOntologyFactory.getInstance();
+
+    SequenceFeature[] dnaFeatures = dnaSeq.getSequenceFeatures();
+    if (dnaFeatures == null)
+    {
+      return variants;
+    }
+
+    int dnaStart = dnaSeq.getStart();
+    int[] lastCodon = null;
+    int lastPeptidePostion = 0;
+
+    /*
+     * build a map of codon variations for peptides
+     */
+    for (SequenceFeature sf : dnaFeatures)
+    {
+      int dnaCol = sf.getBegin();
+      if (dnaCol != sf.getEnd())
+      {
+        // not handling multi-locus variant features
+        continue;
+      }
+      if (so.isA(sf.getType(), SequenceOntologyI.SEQUENCE_VARIANT))
+      {
+        int[] mapsTo = dnaToProtein.locateInTo(dnaCol, dnaCol);
+        if (mapsTo == null)
+        {
+          // feature doesn't lie within coding region
+          continue;
+        }
+        int peptidePosition = mapsTo[0];
+        List<DnaVariant>[] codonVariants = variants.get(peptidePosition);
+        if (codonVariants == null)
+        {
+          codonVariants = new ArrayList[3];
+          codonVariants[0] = new ArrayList<DnaVariant>();
+          codonVariants[1] = new ArrayList<DnaVariant>();
+          codonVariants[2] = new ArrayList<DnaVariant>();
+          variants.put(peptidePosition, codonVariants);
+        }
+
+        /*
+         * extract dna variants to a string array
+         */
+        String alls = (String) sf.getValue("alleles");
+        if (alls == null)
+        {
+          continue;
+        }
+        String[] alleles = alls.toUpperCase().split(",");
+        int i = 0;
+        for (String allele : alleles)
+        {
+          alleles[i++] = allele.trim(); // lose any space characters "A, G"
+        }
+
+        /*
+         * get this peptide's codon positions e.g. [3, 4, 5] or [4, 7, 10]
+         */
+        int[] codon = peptidePosition == lastPeptidePostion ? lastCodon
+                : MappingUtils.flattenRanges(dnaToProtein.locateInFrom(
+                        peptidePosition, peptidePosition));
+        lastPeptidePostion = peptidePosition;
+        lastCodon = codon;
+
+        /*
+         * save nucleotide (and any variant) for each codon position
+         */
+        for (int codonPos = 0; codonPos < 3; codonPos++)
+        {
+          String nucleotide = String.valueOf(
+                  dnaSeq.getCharAt(codon[codonPos] - dnaStart))
+                  .toUpperCase();
+          List<DnaVariant> codonVariant = codonVariants[codonPos];
+          if (codon[codonPos] == dnaCol)
+          {
+            if (!codonVariant.isEmpty()
+                    && codonVariant.get(0).variant == null)
+            {
+              /*
+               * already recorded base value, add this variant
+               */
+              codonVariant.get(0).variant = sf;
+            }
+            else
+            {
+              /*
+               * add variant with base value
+               */
+              codonVariant.add(new DnaVariant(nucleotide, sf));
+            }
+          }
+          else if (codonVariant.isEmpty())
+          {
+            /*
+             * record (possibly non-varying) base value
+             */
+            codonVariant.add(new DnaVariant(nucleotide));
+          }
+        }
+      }
+    }
+    return variants;
+  }
+
+  /**
+   * Makes an alignment with a copy of the given sequences, adding in any
+   * non-redundant sequences which are mapped to by the cross-referenced
+   * sequences.
+   * 
+   * @param seqs
+   * @param xrefs
+   * @return
+   */
+  public static AlignmentI makeCopyAlignment(SequenceI[] seqs,
+          SequenceI[] xrefs)
+  {
+    AlignmentI copy = new Alignment(new Alignment(seqs));
+
+    SequenceIdMatcher matcher = new SequenceIdMatcher(seqs);
+    if (xrefs != null)
+    {
+      for (SequenceI xref : xrefs)
+      {
+        DBRefEntry[] dbrefs = xref.getDBRefs();
+        if (dbrefs != null)
+        {
+          for (DBRefEntry dbref : dbrefs)
+          {
+            if (dbref.getMap() == null || dbref.getMap().getTo() == null)
+            {
+              continue;
+            }
+            SequenceI mappedTo = dbref.getMap().getTo();
+            SequenceI match = matcher.findIdMatch(mappedTo);
+            if (match == null)
+            {
+              matcher.add(mappedTo);
+              copy.addSequence(mappedTo);
+            }
+          }
+        }
+      }
+    }
+    return copy;
+  }
+
+  /**
+   * Try to align sequences in 'unaligned' to match the alignment of their
+   * mapped regions in 'aligned'. For example, could use this to align CDS
+   * sequences which are mapped to their parent cDNA sequences.
+   * 
+   * This method handles 1:1 mappings (dna-to-dna or protein-to-protein). For
+   * dna-to-protein or protein-to-dna use alternative methods.
+   * 
+   * @param unaligned
+   *          sequences to be aligned
+   * @param aligned
+   *          holds aligned sequences and their mappings
+   * @return
+   */
+  public static int alignAs(AlignmentI unaligned, AlignmentI aligned)
+  {
+    List<SequenceI> unmapped = new ArrayList<SequenceI>();
+    Map<Integer, Map<SequenceI, Character>> columnMap = buildMappedColumnsMap(
+            unaligned, aligned, unmapped);
+    int width = columnMap.size();
+    char gap = unaligned.getGapCharacter();
+    int realignedCount = 0;
+
+    for (SequenceI seq : unaligned.getSequences())
+    {
+      if (!unmapped.contains(seq))
+      {
+        char[] newSeq = new char[width];
+        Arrays.fill(newSeq, gap);
+        int newCol = 0;
+        int lastCol = 0;
+
+        /*
+         * traverse the map to find columns populated
+         * by our sequence
+         */
+        for (Integer column : columnMap.keySet())
+        {
+          Character c = columnMap.get(column).get(seq);
+          if (c != null)
+          {
+            /*
+             * sequence has a character at this position
+             * 
+             */
+            newSeq[newCol] = c;
+            lastCol = newCol;
+          }
+          newCol++;
+        }
+        
+        /*
+         * trim trailing gaps
+         */
+        if (lastCol < width)
+        {
+          char[] tmp = new char[lastCol + 1];
+          System.arraycopy(newSeq, 0, tmp, 0, lastCol + 1);
+          newSeq = tmp;
+        }
+        seq.setSequence(String.valueOf(newSeq));
+        realignedCount++;
+      }
+    }
+    return realignedCount;
+  }
+
+  /**
+   * Returns a map whose key is alignment column number (base 1), and whose
+   * values are a map of sequence characters in that column.
+   * 
+   * @param unaligned
+   * @param aligned
+   * @param unmapped
+   * @return
+   */
+  static Map<Integer, Map<SequenceI, Character>> buildMappedColumnsMap(
+          AlignmentI unaligned, AlignmentI aligned, List<SequenceI> unmapped)
+  {
+    /*
+     * Map will hold, for each aligned column position, a map of
+     * {unalignedSequence, sequenceCharacter} at that position.
+     * TreeMap keeps the entries in ascending column order. 
+     */
+    Map<Integer, Map<SequenceI, Character>> map = new TreeMap<Integer, Map<SequenceI, Character>>();
+
+    /*
+     * r any sequences that have no mapping so can't be realigned
+     */
+    unmapped.addAll(unaligned.getSequences());
+
+    List<AlignedCodonFrame> mappings = aligned.getCodonFrames();
+
+    for (SequenceI seq : unaligned.getSequences())
+    {
+      for (AlignedCodonFrame mapping : mappings)
+      {
+        SequenceI fromSeq = mapping.findAlignedSequence(seq, aligned);
+        if (fromSeq != null)
+        {
+          Mapping seqMap = mapping.getMappingBetween(fromSeq, seq);
+          if (addMappedPositions(seq, fromSeq, seqMap, map))
+          {
+            unmapped.remove(seq);
+          }
+        }
+      }
+    }
+    return map;
+  }
+
+  /**
+   * Helper method that adds to a map the mapped column positions of a sequence. <br>
+   * For example if aaTT-Tg-gAAA is mapped to TTTAAA then the map should record
+   * that columns 3,4,6,10,11,12 map to characters T,T,T,A,A,A of the mapped to
+   * sequence.
+   * 
+   * @param seq
+   *          the sequence whose column positions we are recording
+   * @param fromSeq
+   *          a sequence that is mapped to the first sequence
+   * @param seqMap
+   *          the mapping from 'fromSeq' to 'seq'
+   * @param map
+   *          a map to add the column positions (in fromSeq) of the mapped
+   *          positions of seq
+   * @return
+   */
+  static boolean addMappedPositions(SequenceI seq, SequenceI fromSeq,
+          Mapping seqMap, Map<Integer, Map<SequenceI, Character>> map)
+  {
+    if (seqMap == null)
+    {
+      return false;
+    }
+
+    char[] fromChars = fromSeq.getSequence();
+    int toStart = seq.getStart();
+    char[] toChars = seq.getSequence();
+
+    /*
+     * traverse [start, end, start, end...] ranges in fromSeq
+     */
+    for (int[] fromRange : seqMap.getMap().getFromRanges())
+    {
+      for (int i = 0; i < fromRange.length - 1; i += 2)
+      {
+        boolean forward = fromRange[i + 1] >= fromRange[i];
+
+        /*
+         * find the range mapped to (sequence positions base 1)
+         */
+        int[] range = seqMap.locateMappedRange(fromRange[i],
+                fromRange[i + 1]);
+        if (range == null)
+        {
+          System.err.println("Error in mapping " + seqMap + " from "
+                  + fromSeq.getName());
+          return false;
+        }
+        int fromCol = fromSeq.findIndex(fromRange[i]);
+        int mappedCharPos = range[0];
+
+        /*
+         * walk over the 'from' aligned sequence in forward or reverse
+         * direction; when a non-gap is found, record the column position
+         * of the next character of the mapped-to sequence; stop when all
+         * the characters of the range have been counted
+         */
+        while (mappedCharPos <= range[1])
+        {
+          if (!Comparison.isGap(fromChars[fromCol - 1]))
+          {
+            /*
+             * mapped from sequence has a character in this column
+             * record the column position for the mapped to character
+             */
+            Map<SequenceI, Character> seqsMap = map.get(fromCol);
+            if (seqsMap == null)
+            {
+              seqsMap = new HashMap<SequenceI, Character>();
+              map.put(fromCol, seqsMap);
+            }
+            seqsMap.put(seq, toChars[mappedCharPos - toStart]);
+            mappedCharPos++;
+          }
+          fromCol += (forward ? 1 : -1);
+        }
+      }
+    }
+    return true;
+  }
+
+  // strictly temporary hack until proper criteria for aligning protein to cds
+  // are in place; this is so Ensembl -> fetch xrefs Uniprot aligns the Uniprot
+  public static boolean looksLikeEnsembl(AlignmentI alignment)
+  {
+    for (SequenceI seq : alignment.getSequences())
+    {
+      String name = seq.getName();
+      if (!name.startsWith("ENSG") && !name.startsWith("ENST"))
+      {
+        return false;
+      }
+    }
+    return true;
   }
 }
index a71e614..7e77fc1 100644 (file)
@@ -25,9 +25,12 @@ 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.seqfetcher.ASequenceFetcher;
 
@@ -44,6 +47,27 @@ 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.
+   */
+  class MySequenceFeature extends SequenceFeature
+  {
+    private SequenceFeature feat;
+
+    MySequenceFeature(SequenceFeature sf)
+    {
+      this.feat = sf;
+    }
+
+    @Override
+    public boolean equals(Object o)
+    {
+      return feat.equals(o, true);
+    }
+  }
+
   /**
    * Select just the DNA or protein references for a protein or dna sequence
    * 
@@ -88,41 +112,54 @@ public class CrossRef
   {
     String[] dbrefs = null;
     List<String> refs = new ArrayList<String>();
-    for (int s = 0; s < seqs.length; s++)
+    for (SequenceI seq : seqs)
     {
-      if (seqs[s] != null)
+      if (seq != null)
       {
-        SequenceI dss = seqs[s];
+        SequenceI dss = seq;
         while (dss.getDatasetSequence() != null)
         {
           dss = dss.getDatasetSequence();
         }
         DBRefEntry[] rfs = findXDbRefs(dna, dss.getDBRefs());
-        for (int r = 0; rfs != null && r < rfs.length; r++)
+        if (rfs != null)
         {
-          if (!refs.contains(rfs[r].getSource()))
+          for (DBRefEntry ref : rfs)
           {
-            refs.add(rfs[r].getSource());
+            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, seqs[s].getDBRefs());
+          DBRefEntry[] lrfs = CrossRef.findXDbRefs(!dna, seq.getDBRefs());
           List<SequenceI> rseqs = new ArrayList<SequenceI>();
-          CrossRef.searchDatasetXrefs(seqs[s], !dna, lrfs, dataset, rseqs,
+          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()); // not used??
-            for (int r = 0; rfs != null && r < rfs.length; r++)
+            DBRefEntry[] xrs = findXDbRefs(dna, rs.getDBRefs());
+            if (xrs != null)
             {
-              if (!refs.contains(rfs[r].getSource()))
+              for (DBRefEntry ref : xrs)
               {
-                refs.add(rfs[r].getSource());
+                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());
+            // }
+            // }
           }
         }
       }
@@ -135,13 +172,9 @@ public class CrossRef
     return dbrefs;
   }
 
-  /*
-   * if (dna) { if (rfs[r].hasMap()) { // most likely this is a protein cross
-   * reference if (!refs.contains(rfs[r].getSource())) {
-   * refs.addElement(rfs[r].getSource()); } } }
-   */
   public static boolean hasCdnaMap(SequenceI[] seqs)
   {
+    // TODO unused - remove?
     String[] reftypes = findSequenceXrefTypes(false, seqs);
     for (int s = 0; s < reftypes.length; s++)
     {
@@ -156,6 +189,7 @@ public class CrossRef
 
   public static SequenceI[] getCdnaMap(SequenceI[] seqs)
   {
+    // TODO unused - remove?
     Vector cseqs = new Vector();
     for (int s = 0; s < seqs.length; s++)
     {
@@ -186,34 +220,25 @@ public class CrossRef
 
   /**
    * 
-   * @param dna
-   * @param seqs
-   * @return
-   */
-  public static Alignment findXrefSequences(SequenceI[] seqs, boolean dna,
-          String source)
-  {
-    return findXrefSequences(seqs, dna, source, null);
-  }
-
-  /**
-   * 
    * @param seqs
+   *          sequences whose xrefs are being retrieved
    * @param dna
+   *          true if sequences are nucleotide
    * @param source
-   * @param dataset
-   *          alignment to search for product sequences.
+   * @param al
+   *          alignment to search for cross-referenced sequences (and possibly
+   *          add to)
    * @return products (as dataset sequences)
    */
-  public static Alignment findXrefSequences(SequenceI[] seqs, boolean dna,
-          String source, AlignmentI dataset)
+  public static Alignment findXrefSequences(SequenceI[] seqs,
+          final boolean dna, final String source, AlignmentI al)
   {
+    AlignmentI dataset = al.getDataset() == null ? al : al.getDataset();
     List<SequenceI> rseqs = new ArrayList<SequenceI>();
-    Alignment ral = null;
-    AlignedCodonFrame cf = new AlignedCodonFrame(); // nominal width
-    for (int s = 0; s < seqs.length; s++)
+    AlignedCodonFrame cf = new AlignedCodonFrame();
+    for (SequenceI seq : seqs)
     {
-      SequenceI dss = seqs[s];
+      SequenceI dss = seq;
       while (dss.getDatasetSequence() != null)
       {
         dss = dss.getDatasetSequence();
@@ -223,7 +248,8 @@ public class CrossRef
       if ((xrfs == null || xrfs.length == 0) && dataset != null)
       {
         System.out.println("Attempting to find ds Xrefs refs.");
-        DBRefEntry[] lrfs = CrossRef.findXDbRefs(!dna, seqs[s].getDBRefs());
+        // 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,
@@ -231,29 +257,30 @@ public class CrossRef
       }
       for (int r = 0; xrfs != null && r < xrfs.length; r++)
       {
-        if (source != null && !source.equals(xrfs[r].getSource()))
+        DBRefEntry xref = xrfs[r];
+        if (source != null && !source.equals(xref.getSource()))
         {
           continue;
         }
-        if (xrfs[r].hasMap())
+        if (xref.hasMap())
         {
-          if (xrfs[r].getMap().getTo() != null)
+          if (xref.getMap().getTo() != null)
           {
-            SequenceI rsq = new Sequence(xrfs[r].getMap().getTo());
+            SequenceI rsq = new Sequence(xref.getMap().getTo());
             rseqs.add(rsq);
-            if (xrfs[r].getMap().getMap().getFromRatio() != xrfs[r]
+            if (xref.getMap().getMap().getFromRatio() != xref
                     .getMap().getMap().getToRatio())
             {
               // get sense of map correct for adding to product alignment.
               if (dna)
               {
                 // map is from dna seq to a protein product
-                cf.addMap(dss, rsq, xrfs[r].getMap().getMap());
+                cf.addMap(dss, rsq, xref.getMap().getMap());
               }
               else
               {
                 // map should be from protein seq to its coding dna
-                cf.addMap(rsq, dss, xrfs[r].getMap().getMap().getInverse());
+                cf.addMap(rsq, dss, xref.getMap().getMap().getInverse());
               }
             }
             found = true;
@@ -265,7 +292,8 @@ public class CrossRef
           // xrefs on this sequence.
           if (dataset != null)
           {
-            found |= searchDataset(dss, xrfs[r], dataset, rseqs, cf); // ,false,!dna);
+            found |= searchDataset(dss, xref, dataset, rseqs, cf, false,
+                    !dna);
             if (found)
             {
               xrfs[r] = null; // we've recovered seqs for this one.
@@ -299,8 +327,8 @@ public class CrossRef
           }
           if (l > 0)
           {
-            System.out
-                    .println("Attempting to retrieve cross referenced sequences.");
+            // System.out
+            // .println("Attempting to retrieve cross referenced sequences.");
             DBRefEntry[] t = new DBRefEntry[l];
             l = 0;
             for (int r = 0; r < xrfs.length; r++)
@@ -313,37 +341,59 @@ public class CrossRef
             xrfs = t;
             try
             {
-              retrieved = sftch.getSequences(xrfs); // problem here is we don't
-              // know which of xrfs
-              // resulted in which
+              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 : "
-                              + seqs[s].getName());
+                              + seq.getName());
               e.printStackTrace();
             }
+
             if (retrieved != null)
             {
+              updateDbrefMappings(dna, seq, xrfs, retrieved, cf);
+
+              SequenceIdMatcher matcher = new SequenceIdMatcher(
+                      dataset.getSequences());
+              List<SequenceFeature> copiedFeatures = new ArrayList<SequenceFeature>();
+              CrossRef me = new CrossRef();
               for (int rs = 0; rs < retrieved.length; rs++)
               {
                 // TODO: examine each sequence for 'redundancy'
-                jalview.datamodel.DBRefEntry[] dbr = retrieved[rs]
-                        .getDBRefs();
+                DBRefEntry[] dbr = retrieved[rs].getDBRefs();
                 if (dbr != null && dbr.length > 0)
                 {
                   for (int di = 0; di < dbr.length; di++)
                   {
                     // find any entry where we should put in the sequence being
                     // cross-referenced into the map
-                    jalview.datamodel.Mapping map = dbr[di].getMap();
+                    Mapping map = dbr[di].getMap();
                     if (map != null)
                     {
                       if (map.getTo() != null && map.getMap() != null)
                       {
-                        // should search the local dataset to find any existing
-                        // candidates for To !
+                        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
+                        {
+                          matcher.add(map.getTo());
+                        }
                         try
                         {
                           // compare ms with dss and replace with dss in mapping
@@ -352,17 +402,54 @@ public class CrossRef
                           int sf = map.getMap().getToLowest();
                           int st = map.getMap().getToHighest();
                           SequenceI mappedrg = ms.getSubSequence(sf, st);
-                          SequenceI loc = dss.getSubSequence(sf, st);
+                          // SequenceI loc = dss.getSubSequence(sf, st);
                           if (mappedrg.getLength() > 0
-                                  && mappedrg.getSequenceAsString().equals(
-                                          loc.getSequenceAsString()))
+                                  && ms.getSequenceAsString().equals(
+                                          dss.getSequenceAsString()))
+                          // && mappedrg.getSequenceAsString().equals(
+                          // loc.getSequenceAsString()))
                           {
-                            System.err
-                                    .println("Mapping updated for retrieved crossreference");
+                            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
+                          {
+                            cf.addMap(retrieved[rs].getDatasetSequence(),
+                                    map.getTo(), map.getMap());
                           }
                         } catch (Exception e)
                         {
@@ -382,12 +469,12 @@ public class CrossRef
         }
       }
     }
+
+    Alignment ral = null;
     if (rseqs.size() > 0)
     {
-      SequenceI[] rsqs = new SequenceI[rseqs.size()];
-      rseqs.toArray(rsqs);
-      ral = new Alignment(rsqs);
-      if (cf != null && cf.getProtMappings() != null)
+      ral = new Alignment(rseqs.toArray(new SequenceI[rseqs.size()]));
+      if (cf != null && !cf.isEmpty())
       {
         ral.addCodonFrame(cf);
       }
@@ -396,6 +483,69 @@ public class CrossRef
   }
 
   /**
+   * Updates any empty mappings in the cross-references with one to a compatible
+   * 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)
+  {
+    SequenceIdMatcher matcher = new SequenceIdMatcher(retrieved);
+    for (DBRefEntry xref : xrefs)
+    {
+      if (!xref.hasMap())
+      {
+        String targetSeqName = xref.getSource() + "|"
+                + xref.getAccessionId();
+        SequenceI[] matches = matcher.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;
+          }
+        }
+      }
+    }
+  }
+
+  /**
    * find references to lrfs in the cross-reference set of each sequence in
    * dataset (that is not equal to sequenceI) Identifies matching DBRefEntry
    * based on source and accession string only - Map and Version are nulled.
index 2939e3c..be138f3 100644 (file)
@@ -806,4 +806,154 @@ public class Dna
       }
     }
   }
+
+  /**
+   * Returns an alignment consisting of the reversed (and optionally
+   * complemented) sequences set in this object's constructor
+   * 
+   * @param complement
+   * @return
+   */
+  public AlignmentI reverseCdna(boolean complement)
+  {
+    int sSize = selection.size();
+    List<SequenceI> reversed = new ArrayList<SequenceI>();
+    for (int s = 0; s < sSize; s++)
+    {
+      SequenceI newseq = reverseSequence(selection.get(s).getName(),
+              seqstring[s], complement);
+
+      if (newseq != null)
+      {
+        reversed.add(newseq);
+      }
+    }
+
+    SequenceI[] newseqs = reversed.toArray(new SequenceI[reversed.size()]);
+    AlignmentI al = new Alignment(newseqs);
+    ((Alignment) al).createDatasetAlignment();
+    return al;
+  }
+
+  /**
+   * Returns a reversed, and optionally complemented, sequence. The new
+   * sequence's name is the original name with "|rev" or "|revcomp" appended.
+   * aAcCgGtT and DNA ambiguity codes are complemented, any other characters are
+   * left unchanged.
+   * 
+   * @param seq
+   * @param complement
+   * @return
+   */
+  public static SequenceI reverseSequence(String seqName, String sequence,
+          boolean complement)
+  {
+    String newName = seqName + "|rev" + (complement ? "comp" : "");
+    char[] originalSequence = sequence.toCharArray();
+    int length = originalSequence.length;
+    char[] reversedSequence = new char[length];
+
+    for (int i = 0; i < length; i++)
+    {
+      reversedSequence[length - i - 1] = complement ? getComplement(originalSequence[i])
+              : originalSequence[i];
+    }
+    SequenceI reversed = new Sequence(newName, reversedSequence, 1, length);
+    return reversed;
+  }
+
+  /**
+   * Returns dna complement (preserving case) for aAcCgGtTuU. Ambiguity codes
+   * are treated as on http://reverse-complement.com/. Anything else is left
+   * unchanged.
+   * 
+   * @param c
+   * @return
+   */
+  public static char getComplement(char c)
+  {
+    char result = c;
+    switch (c) {
+    case 'a':
+      result = 't';
+      break;
+    case 'A':
+      result = 'T';
+      break;
+    case 'c':
+      result = 'g';
+      break;
+    case 'C':
+      result = 'G';
+      break;
+    case 'g':
+      result = 'c';
+      break;
+    case 'G':
+      result = 'C';
+      break;
+    case 't':
+      result = 'a';
+      break;
+    case 'T':
+      result = 'A';
+      break;
+    case 'u':
+      result = 'a';
+      break;
+    case 'U':
+      result = 'A';
+      break;
+    case 'r':
+      result = 'y';
+      break;
+    case 'R':
+      result = 'Y';
+      break;
+    case 'y':
+      result = 'r';
+      break;
+    case 'Y':
+      result = 'R';
+      break;
+    case 'k':
+      result = 'm';
+      break;
+    case 'K':
+      result = 'M';
+      break;
+    case 'm':
+      result = 'k';
+      break;
+    case 'M':
+      result = 'K';
+      break;
+    case 'b':
+      result = 'v';
+      break;
+    case 'B':
+      result = 'V';
+      break;
+    case 'v':
+      result = 'b';
+      break;
+    case 'V':
+      result = 'B';
+      break;
+    case 'd':
+      result = 'h';
+      break;
+    case 'D':
+      result = 'H';
+      break;
+    case 'h':
+      result = 'd';
+      break;
+    case 'H':
+      result = 'D';
+      break;
+    }
+
+    return result;
+  }
 }
index 40bedad..b0ecfde 100755 (executable)
@@ -59,13 +59,19 @@ public class SeqsetUtils
         sfeat.addElement(sfarray[i]);
       }
     }
-    sqinfo.put("SeqFeatures", sfeat);
-    sqinfo.put("PdbId",
+    if (seq.getDatasetSequence() == null)
+    {
+      sqinfo.put("SeqFeatures", sfeat);
+      sqinfo.put("PdbId",
             (seq.getAllPDBEntries() != null) ? seq.getAllPDBEntries()
                     : new Vector<PDBEntry>());
-    sqinfo.put("datasetSequence",
+    }
+    else
+    {
+      sqinfo.put("datasetSequence",
             (seq.getDatasetSequence() != null) ? seq.getDatasetSequence()
                     : new Sequence("THISISAPLACEHOLDER", ""));
+    }
     return sqinfo;
   }
 
@@ -129,6 +135,11 @@ public class SeqsetUtils
             && !(seqds.getName().equals("THISISAPLACEHOLDER") && seqds
                     .getLength() == 0))
     {
+      if (sfeatures!=null)
+      {
+        System.err
+                .println("Implementation error: setting dataset sequence for a sequence which has sequence features.\n\tDataset sequence features will not be visible.");
+      }
       sq.setDatasetSequence(seqds);
     }
 
index 454bc09..70defb0 100755 (executable)
@@ -46,7 +46,7 @@ public class SequenceIdMatcher
   }
 
   /**
-   * add more sequences to this matcher - also used by the constructor
+   * Adds sequences to this matcher
    * 
    * @param seqs
    */
@@ -54,26 +54,36 @@ public class SequenceIdMatcher
   {
     for (SequenceI seq : seqs)
     {
-      // TODO: deal with ID collisions - SequenceI should be appended to list
-      // associated with this key.
-      names.put(new SeqIdName(seq.getDisplayId(true)), seq);
-      SequenceI dbseq = seq;
-      while (dbseq.getDatasetSequence() != null)
-      {
-        dbseq = dbseq.getDatasetSequence();
-      }
-      // add in any interesting identifiers
-      if (dbseq.getDBRefs() != null)
+      add(seq);
+    }
+  }
+
+  /**
+   * Adds one sequence to this matcher
+   * 
+   * @param seq
+   */
+  public void add(SequenceI seq)
+  {
+    // TODO: deal with ID collisions - SequenceI should be appended to list
+    // associated with this key.
+    names.put(new SeqIdName(seq.getDisplayId(true)), seq);
+    SequenceI dbseq = seq;
+    while (dbseq.getDatasetSequence() != null)
+    {
+      dbseq = dbseq.getDatasetSequence();
+    }
+    // add in any interesting identifiers
+    if (dbseq.getDBRefs() != null)
+    {
+      DBRefEntry dbr[] = dbseq.getDBRefs();
+      SeqIdName sid = null;
+      for (int r = 0; r < dbr.length; r++)
       {
-        DBRefEntry dbr[] = dbseq.getDBRefs();
-        SeqIdName sid = null;
-        for (int r = 0; r < dbr.length; r++)
+        sid = new SeqIdName(dbr[r].getAccessionId());
+        if (!names.containsKey(sid))
         {
-          sid = new SeqIdName(dbr[r].getAccessionId());
-          if (!names.containsKey(sid))
-          {
-            names.put(sid, seq);
-          }
+          names.put(sid, seq);
         }
       }
     }
@@ -272,7 +282,7 @@ public class SequenceIdMatcher
     return r;
   }
 
-  private class SeqIdName
+  class SeqIdName
   {
     String id;
 
@@ -304,7 +314,7 @@ public class SequenceIdMatcher
       }
       if (s instanceof SeqIdName)
       {
-        return this.equals((SeqIdName) s);
+        return this.equals(((SeqIdName) s).id);
       }
       else
       {
@@ -332,25 +342,8 @@ public class SequenceIdMatcher
      * todo: (JBPNote) Set separator characters appropriately
      * 
      * @param s
-     *          SeqIdName
      * @return boolean
      */
-    public boolean equals(SeqIdName s)
-    {
-      // TODO: JAL-732 patch for cases when name includes a list of IDs, and the
-      // match contains one ID flanked
-      if (id.length() > s.id.length())
-      {
-        return id.startsWith(s.id) ? (WORD_SEP.indexOf(id.charAt(s.id
-                .length())) > -1) : false;
-      }
-      else
-      {
-        return s.id.startsWith(id) ? (s.id.equals(id) ? true : (WORD_SEP
-                .indexOf(s.id.charAt(id.length())) > -1)) : false;
-      }
-    }
-
     public boolean equals(String s)
     {
       if (id.length() > s.length())
index 69538d5..7c81912 100644 (file)
@@ -23,12 +23,10 @@ package jalview.analysis.scoremodels;
 import jalview.api.analysis.ScoreModelI;
 import jalview.api.analysis.ViewBasedAnalysisI;
 import jalview.datamodel.AlignmentView;
+import jalview.datamodel.SeqCigar;
 import jalview.datamodel.SequenceFeature;
-import jalview.datamodel.SequenceI;
-import jalview.util.Comparison;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Hashtable;
 import java.util.List;
 
@@ -48,17 +46,11 @@ public class FeatureScoreModel implements ScoreModelI, ViewBasedAnalysisI
   public float[][] findDistances(AlignmentView seqData)
   {
     int nofeats = 0;
-    List<String> dft = Arrays.asList(fr.getDisplayedFeatureTypes());
-
-    if (dft != null)
-    {
-      nofeats = dft.size();
-    }
-
-    SequenceI[] sequenceString = seqData.getVisibleAlignment(
-            Comparison.GapChars.charAt(0)).getSequencesArray();
-    int noseqs = sequenceString.length;
-    int cpwidth = seqData.getWidth();
+    List<String> dft = fr.getDisplayedFeatureTypes();
+    nofeats = dft.size();
+    SeqCigar[] seqs = seqData.getSequences();
+    int noseqs = seqs.length;
+    int cpwidth = 0;// = seqData.getWidth();
     float[][] distance = new float[noseqs][noseqs];
     if (nofeats == 0)
     {
@@ -71,54 +63,64 @@ public class FeatureScoreModel implements ScoreModelI, ViewBasedAnalysisI
       }
       return distance;
     }
-    float max = 0;
-    for (int cpos = 0; cpos < cpwidth; cpos++)
+    // need to get real position for view position
+    int[] viscont = seqData.getVisibleContigs();
+    for (int vc = 0; vc < viscont.length; vc += 2)
     {
-      // get visible features at cpos under view's display settings and compare
-      // them
-      List<Hashtable<String, SequenceFeature>> sfap = new ArrayList<Hashtable<String, SequenceFeature>>();
-      for (int i = 0; i < noseqs; i++)
-      {
-        Hashtable<String, SequenceFeature> types = new Hashtable<String, SequenceFeature>();
-        List<SequenceFeature> sfs = fr.findFeaturesAtRes(sequenceString[i],
-                sequenceString[i].findPosition(cpos));
-        for (SequenceFeature sf : sfs)
-        {
-          types.put(sf.getType(), sf);
-        }
-        sfap.add(types);
-      }
-      for (int i = 0; i < (noseqs - 1); i++)
+
+      for (int cpos = viscont[vc]; cpos <= viscont[vc + 1]; cpos++)
       {
-        if (cpos == 0)
-        {
-          distance[i][i] = 0f;
-        }
-        for (int j = i + 1; j < noseqs; j++)
+        cpwidth++;
+        // get visible features at cpos under view's display settings and
+        // compare them
+        List<Hashtable<String, SequenceFeature>> sfap = new ArrayList<Hashtable<String, SequenceFeature>>();
+        for (int i = 0; i < noseqs; i++)
         {
-          int sfcommon = 0;
-          // compare the two lists of features...
-          Hashtable<String, SequenceFeature> fi = sfap.get(i), fk, fj = sfap
-                  .get(j);
-          if (fi.size() > fj.size())
+          Hashtable<String, SequenceFeature> types = new Hashtable<String, SequenceFeature>();
+          int spos = seqs[i].findPosition(cpos);
+          if (spos != -1)
           {
-            fk = fj;
+            List<SequenceFeature> sfs = fr.findFeaturesAtRes(
+                    seqs[i].getRefSeq(), spos);
+            for (SequenceFeature sf : sfs)
+            {
+              types.put(sf.getType(), sf);
+            }
           }
-          else
+          sfap.add(types);
+        }
+        for (int i = 0; i < (noseqs - 1); i++)
+        {
+          if (cpos == 0)
           {
-            fk = fi;
-            fi = fj;
+            distance[i][i] = 0f;
           }
-          for (String k : fi.keySet())
+          for (int j = i + 1; j < noseqs; j++)
           {
-            SequenceFeature sfj = fk.get(k);
-            if (sfj != null)
+            int sfcommon = 0;
+            // compare the two lists of features...
+            Hashtable<String, SequenceFeature> fi = sfap.get(i), fk, fj = sfap
+                    .get(j);
+            if (fi.size() > fj.size())
             {
-              sfcommon++;
+              fk = fj;
             }
+            else
+            {
+              fk = fi;
+              fi = fj;
+            }
+            for (String k : fi.keySet())
+            {
+              SequenceFeature sfj = fk.get(k);
+              if (sfj != null)
+              {
+                sfcommon++;
+              }
+            }
+            distance[i][j] += (fi.size() + fk.size() - 2f * sfcommon);
+            distance[j][i] += distance[i][j];
           }
-          distance[i][j] += (fi.size() + fk.size() - 2f * sfcommon);
-          distance[j][i] += distance[i][j];
         }
       }
     }
@@ -151,6 +153,7 @@ public class FeatureScoreModel implements ScoreModelI, ViewBasedAnalysisI
     return true;
   }
 
+  @Override
   public String toString()
   {
     return "Score between sequences based on hamming distance between binary vectors marking features displayed at each column";
index 872528b..06dc054 100644 (file)
@@ -22,12 +22,30 @@ package jalview.api;
 
 import jalview.datamodel.AlignmentAnnotation;
 
+/**
+ * Interface describing a worker that calculates alignment annotation(s). The
+ * main (re-)calculation should be performed by the inherited run() method.
+ */
 public interface AlignCalcWorkerI extends Runnable
 {
-
+  /**
+   * Answers true if this worker updates the given annotation (regardless of its
+   * current state)
+   * 
+   * @param annot
+   * @return
+   */
   public boolean involves(AlignmentAnnotation annot);
 
+  /**
+   * Updates the display of calculated annotation values (does not recalculate
+   * the values). This allows for quick redraw of annotations when display
+   * settings are changed.
+   */
   public void updateAnnotation();
 
-  void removeOurAnnotation();
+  /**
+   * Removes any annotation managed by this worker from the alignment
+   */
+  void removeAnnotation();
 }
index a2f2204..26966ba 100644 (file)
@@ -20,6 +20,8 @@
  */
 package jalview.api;
 
+import java.util.List;
+
 /**
  * prototype abstract controller for a Jalview alignment view
  * 
@@ -62,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
@@ -71,7 +73,7 @@ public interface AlignViewControllerI
    * @param typ
    *          list of feature names or null to use currently displayed features
    */
-  void sortAlignmentByFeatureScore(String[] typ);
+  void sortAlignmentByFeatureScore(List<String> typ);
 
   /**
    * sort the alignment or current selection by distribution of the given set of
@@ -80,7 +82,7 @@ public interface AlignViewControllerI
    * @param typ
    *          list of feature names or null to use currently displayed features
    */
-  void sortAlignmentByFeatureDensity(String[] typ);
+  void sortAlignmentByFeatureDensity(List<String> typ);
 
   /**
    * add a features file of some kind to the current view
index 5df38d6..45e77ba 100644 (file)
@@ -375,4 +375,6 @@ public interface AlignViewportI extends ViewStyleI
    * Set whether view should scroll to show the highlighted region of a sequence
    */
   void setFollowHighlight(boolean b);
+
+  public void applyFeaturesStyle(FeatureSettingsModelI featureSettings);
 }
index b927fa5..9415745 100644 (file)
@@ -1,5 +1,7 @@
 package jalview.api;
 
+import jalview.datamodel.Mapping;
+
 
 public interface DBRefEntryI
 {
@@ -69,4 +71,6 @@ public interface DBRefEntryI
    * @return index of end residue in the source DB
    */
   public int getEndRes();
+
+  public Mapping getMap();
 }
index 2e82afd..1fcbfd0 100644 (file)
@@ -14,8 +14,6 @@ public interface FeatureColourI
    */
   boolean isGraduatedColour();
 
-  void setGraduatedColour(boolean b);
-
   /**
    * Returns the feature colour (when isGraduatedColour answers false)
    * 
@@ -95,6 +93,13 @@ public interface FeatureColourI
 
   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);
index 21319fd..dbc9880 100644 (file)
@@ -141,25 +141,19 @@ public interface FeatureRenderer
   List<SequenceFeature> findFeaturesAtRes(SequenceI sequence, int res);
 
   /**
+   * get current displayed types, in ordering of rendering (on top last)
    * 
-   * @return true if the rendering platform supports transparency
+   * @return a (possibly empty) list of feature types
    */
-  boolean isTransparencyAvailable();
 
-  /**
-   * get current displayed types
-   * 
-   * @return
-   */
-
-  String[] getDisplayedFeatureTypes();
+  List<String> getDisplayedFeatureTypes();
 
   /**
    * get current displayed groups
    * 
-   * @return
+   * @return a (possibly empty) list of feature groups
    */
-  String[] getDisplayedFeatureGroups();
+  List<String> getDisplayedFeatureGroups();
 
   /**
    * display all features of these types
diff --git a/src/jalview/api/FeatureSettingsI.java b/src/jalview/api/FeatureSettingsI.java
deleted file mode 100644 (file)
index 55f52d2..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-package jalview.api;
-
-/**
- * An interface that describes the settings configurable in the Feature Settings
- * dialog.
- * 
- * @author gmcarstairs
- *
- */
-public interface FeatureSettingsI
-{
-  // note Java 8 will allow default implementations of these methods in the
-  // interface, simplifying instantiating classes
-
-  /**
-   * Answers true if the specified feature type is displayed
-   * 
-   * @param type
-   * @return
-   */
-  boolean isFeatureDisplayed(String type);
-
-  /**
-   * Answers true if the specified feature group is displayed
-   * 
-   * @param group
-   * @return
-   */
-  boolean isGroupDisplayed(String group);
-
-  /**
-   * Returns the colour (or graduated colour) for the feature type, or null if
-   * not known
-   * 
-   * @param type
-   * @return
-   */
-  FeatureColourI getFeatureColour(String type);
-
-  /**
-   * Returns the transparency value, from 0 (fully transparent) to 1 (fully
-   * opaque)
-   * 
-   * @return
-   */
-  float getTransparency();
-
-  /**
-   * Returns -1 if feature1 'precedes' (is displayed on top of) feature 2, +1 if
-   * feature2 is on top of feature1, or 0 if we don't care
-   * 
-   * @param feature1
-   * @param feature2
-   * @return
-   */
-  int compareTo(String feature1, String feature2);
-
-  /**
-   * Answers true if features should be initially sorted so that features with a
-   * shorter average length are displayed on top of those with a longer average
-   * length
-   * 
-   * @return
-   */
-  boolean optimiseOrder();
-}
index 5474f4e..c0fc523 100644 (file)
  */
 package jalview.api;
 
-public interface FeatureSettingsModelI
+import java.util.Comparator;
+
+/**
+ * An interface that describes the settings configurable in the Feature Settings
+ * dialog.
+ * 
+ * @author gmcarstairs
+ */
+public interface FeatureSettingsModelI extends Comparator<String>
 {
 
+  // note Java 8 will allow default implementations of these methods in the
+  // interface, simplifying instantiating classes
+
+  /**
+   * Answers true if the specified feature type is displayed
+   * 
+   * @param type
+   * @return
+   */
+  boolean isFeatureDisplayed(String type);
+
+  /**
+   * Answers true if the specified feature group is displayed
+   * 
+   * @param group
+   * @return
+   */
+  boolean isGroupDisplayed(String group);
+
+  /**
+   * Returns the colour (or graduated colour) for the feature type, or null if
+   * not known
+   * 
+   * @param type
+   * @return
+   */
+  FeatureColourI getFeatureColour(String type);
+
+  /**
+   * Returns the transparency value, from 0 (fully transparent) to 1 (fully
+   * opaque)
+   * 
+   * @return
+   */
+  float getTransparency();
+
+  /**
+   * Returns -1 if feature1 is displayed before (below) feature 2, +1 if
+   * feature2 is displayed after (on top of) feature1, or 0 if we don't care.
+   * 
+   * <br>
+   * Note that this is the opposite ordering to how features are displayed in
+   * the feature settings dialogue. FeatureRendererModel.setFeaturePriority
+   * takes care of converting between the two.
+   * 
+   * @param feature1
+   * @param feature2
+   * @return
+   */
+  @Override
+  int compare(String feature1, String feature2);
+
+  /**
+   * Answers true if features should be initially sorted so that features with a
+   * shorter average length are displayed on top of those with a longer average
+   * length
+   * 
+   * @return
+   */
+  boolean optimiseOrder();
+
 }
index bda1360..32b0565 100644 (file)
@@ -44,6 +44,6 @@ public interface FeaturesDisplayedI
 
   int getVisibleFeatureCount();
 
-  int getRegisterdFeaturesCount();
+  int getRegisteredFeaturesCount();
 
 }
diff --git a/src/jalview/api/FeaturesSourceI.java b/src/jalview/api/FeaturesSourceI.java
new file mode 100644 (file)
index 0000000..8f8d8c1
--- /dev/null
@@ -0,0 +1,8 @@
+package jalview.api;
+
+/**
+ * A tagging interface to mark a source of sequence features
+ */
+public interface FeaturesSourceI
+{
+}
index 40fbd6d..8f1f2fd 100644 (file)
@@ -365,18 +365,15 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
   public boolean parseFeaturesFile(String file, String type,
           boolean autoenabledisplay)
   {
-    // TODO: test if importing a features file onto an alignment which already
-    // has features with links overwrites the original links.
-
-    Hashtable featureLinks = new Hashtable();
     boolean featuresFile = false;
     try
     {
-      featuresFile = new jalview.io.FeaturesFile(file, type).parse(viewport
-              .getAlignment(), alignPanel.seqPanel.seqCanvas
-              .getFeatureRenderer().getFeatureColours(), featureLinks,
-              true, viewport.applet.getDefaultParameter("relaxedidmatch",
-                      false));
+      Map<String, FeatureColourI> colours = alignPanel.seqPanel.seqCanvas
+              .getFeatureRenderer().getFeatureColours();
+      boolean relaxedIdMatching = viewport.applet.getDefaultParameter(
+              "relaxedidmatch", false);
+      featuresFile = new FeaturesFile(file, type).parse(
+              viewport.getAlignment(), colours, true, relaxedIdMatching);
     } catch (Exception ex)
     {
       ex.printStackTrace();
@@ -384,10 +381,6 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
 
     if (featuresFile)
     {
-      if (featureLinks.size() > 0)
-      {
-        alignPanel.seqPanel.seqCanvas.getFeatureRenderer().featureLinks = featureLinks;
-      }
       if (autoenabledisplay)
       {
         viewport.setShowSequenceFeatures(true);
@@ -1421,15 +1414,16 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
   public String outputFeatures(boolean displayTextbox, String format)
   {
     String features;
+    FeaturesFile formatter = new FeaturesFile();
     if (format.equalsIgnoreCase("Jalview"))
     {
-      features = new FeaturesFile().printJalviewFormat(viewport
+      features = formatter.printJalviewFormat(viewport
               .getAlignment().getSequencesArray(),
               getDisplayedFeatureCols());
     }
     else
     {
-      features = new FeaturesFile().printGFFFormat(viewport.getAlignment()
+      features = formatter.printGffFormat(viewport.getAlignment()
               .getSequencesArray(), getDisplayedFeatureCols());
     }
 
index 7ef2d59..e5178cb 100644 (file)
@@ -22,6 +22,7 @@ package jalview.appletgui;
 
 import jalview.analysis.NJTree;
 import jalview.api.AlignViewportI;
+import jalview.api.FeatureSettingsModelI;
 import jalview.bin.JalviewLite;
 import jalview.commands.CommandI;
 import jalview.datamodel.AlignmentI;
@@ -57,6 +58,7 @@ public class AlignViewport extends AlignmentViewport implements
 
   private AnnotationColumnChooser annotationColumnSelectionState;
 
+  @Override
   public void finalize()
   {
     applet = null;
@@ -325,6 +327,7 @@ public class AlignViewport extends AlignmentViewport implements
     return followSelection;
   }
 
+  @Override
   public void sendSelection()
   {
     getStructureSelectionManager().sendSelection(
@@ -345,39 +348,7 @@ public class AlignViewport extends AlignmentViewport implements
             .getStructureSelectionManager(applet);
   }
 
-  /**
-   * synthesize a column selection if none exists so it covers the given
-   * selection group. if wholewidth is false, no column selection is made if the
-   * selection group covers the whole alignment width.
-   * 
-   * @param sg
-   * @param wholewidth
-   */
-  public void expandColSelection(SequenceGroup sg, boolean wholewidth)
-  {
-    int sgs, sge;
-    if (sg != null
-            && (sgs = sg.getStartRes()) >= 0
-            && sg.getStartRes() <= (sge = sg.getEndRes())
-            && (colSel == null || colSel.getSelected() == null || colSel
-                    .getSelected().size() == 0))
-    {
-      if (!wholewidth && alignment.getWidth() == (1 + sge - sgs))
-      {
-        // do nothing
-        return;
-      }
-      if (colSel == null)
-      {
-        colSel = new ColumnSelection();
-      }
-      for (int cspos = sg.getStartRes(); cspos <= sg.getEndRes(); cspos++)
-      {
-        colSel.addElement(cspos);
-      }
-    }
-  }
-
+  @Override
   public boolean isNormaliseSequenceLogo()
   {
     return normaliseSequenceLogo;
@@ -392,6 +363,7 @@ public class AlignViewport extends AlignmentViewport implements
    * 
    * @return true if alignment characters should be displayed
    */
+  @Override
   public boolean isValidCharWidth()
   {
     return validCharWidth;
@@ -470,4 +442,18 @@ public class AlignViewport extends AlignmentViewport implements
     }
   }
 
+  /**
+   * Applies the supplied feature settings descriptor to currently known
+   * features. This supports an 'initial configuration' of feature colouring
+   * based on a preset or user favourite. This may then be modified in the usual
+   * way using the Feature Settings dialogue.
+   * 
+   * @param featureSettings
+   */
+  @Override
+  public void applyFeaturesStyle(FeatureSettingsModelI featureSettings)
+  {
+    // TODO implement for applet
+  }
+
 }
index d642c14..77700d0 100755 (executable)
@@ -160,6 +160,9 @@ public class AnnotationPanel extends Panel implements AwtRenderPanelI,
     {
       for (int sel : av.getColumnSelection().getSelected())
       {
+        // TODO: JAL-2001 check if applet has faulty 'REMOVE' selected columns
+        // of
+        // annotation if selection includes hidden columns
         anot[sel] = null;
       }
     }
@@ -179,6 +182,8 @@ public class AnnotationPanel extends Panel implements AwtRenderPanelI,
 
       for (int index : av.getColumnSelection().getSelected())
       {
+        // TODO: JAL-2001 - provide a fast method to list visible selected
+        // columns
         if (!av.getColumnSelection().isVisible(index))
         {
           continue;
index b9acac0..8374721 100644 (file)
@@ -25,6 +25,7 @@ import jalview.datamodel.PDBEntry;
 import jalview.datamodel.SequenceI;
 import jalview.io.AppletFormatAdapter;
 import jalview.io.FileParse;
+import jalview.io.StructureFile;
 import jalview.schemes.BuriedColourScheme;
 import jalview.schemes.HelixColourScheme;
 import jalview.schemes.HydrophobicColourScheme;
@@ -204,7 +205,7 @@ public class AppletJmol extends EmbmenuFrame implements
     String alreadyMapped = StructureSelectionManager
             .getStructureSelectionManager(ap.av.applet)
             .alreadyMappedToFile(pdbentry.getId());
-    MCview.PDBfile reader = null;
+    StructureFile reader = null;
     if (alreadyMapped != null)
     {
       reader = StructureSelectionManager.getStructureSelectionManager(
@@ -283,6 +284,7 @@ public class AppletJmol extends EmbmenuFrame implements
 
     this.addWindowListener(new WindowAdapter()
     {
+      @Override
       public void windowClosing(WindowEvent evt)
       {
         closeViewer();
@@ -415,6 +417,7 @@ public class AppletJmol extends EmbmenuFrame implements
     this.setVisible(false);
   }
 
+  @Override
   public void actionPerformed(ActionEvent evt)
   {
     if (evt.getSource() == mappingMenuItem)
@@ -535,6 +538,7 @@ public class AppletJmol extends EmbmenuFrame implements
     jmb.setColourBySequence(itm == seqColour);
   }
 
+  @Override
   public void itemStateChanged(ItemEvent evt)
   {
     if (evt.getSource() == jmolColour)
@@ -553,6 +557,7 @@ public class AppletJmol extends EmbmenuFrame implements
     }
   }
 
+  @Override
   public void keyPressed(KeyEvent evt)
   {
     if (evt.getKeyCode() == KeyEvent.VK_ENTER && scriptWindow.isVisible())
@@ -564,10 +569,12 @@ public class AppletJmol extends EmbmenuFrame implements
 
   }
 
+  @Override
   public void keyTyped(KeyEvent evt)
   {
   }
 
+  @Override
   public void keyReleased(KeyEvent evt)
   {
   }
@@ -641,11 +648,13 @@ public class AppletJmol extends EmbmenuFrame implements
   {
     Dimension currentSize = new Dimension();
 
+    @Override
     public void update(Graphics g)
     {
       paint(g);
     }
 
+    @Override
     public void paint(Graphics g)
     {
       currentSize = this.getSize();
index 70a7319..bbaeb68 100644 (file)
@@ -22,6 +22,7 @@ package jalview.appletgui;
 
 import jalview.analysis.AlignmentUtils;
 import jalview.api.ComplexAlignFile;
+import jalview.api.FeaturesSourceI;
 import jalview.bin.JalviewLite;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.ColumnSelection;
@@ -116,6 +117,7 @@ public class CutAndPasteTransfer extends Panel implements ActionListener,
     addSequences.setVisible(false);
   }
 
+  @Override
   public void actionPerformed(ActionEvent evt)
   {
     if (evt.getSource() == accept)
@@ -223,7 +225,7 @@ public class CutAndPasteTransfer extends Panel implements ActionListener,
   {
     AlignmentI al = null;
 
-    String format = new IdentifyFile().Identify(text,
+    String format = new IdentifyFile().identify(text,
             AppletFormatAdapter.PASTE);
     AppletFormatAdapter afa = new AppletFormatAdapter(alignFrame.alignPanel);
     try
@@ -277,6 +279,10 @@ public class CutAndPasteTransfer extends Panel implements ActionListener,
         {
           af = new AlignFrame(al, alignFrame.viewport.applet,
                   "Cut & Paste input - " + format, false);
+          if (source instanceof FeaturesSourceI)
+          {
+            af.getAlignViewport().setShowSequenceFeatures(true);
+          }
         }
 
         af.statusBar
@@ -490,6 +496,7 @@ public class CutAndPasteTransfer extends Panel implements ActionListener,
     this.add(textarea, java.awt.BorderLayout.CENTER);
   }
 
+  @Override
   public void mousePressed(MouseEvent evt)
   {
     if (textarea.getText().startsWith(
@@ -499,18 +506,22 @@ public class CutAndPasteTransfer extends Panel implements ActionListener,
     }
   }
 
+  @Override
   public void mouseReleased(MouseEvent evt)
   {
   }
 
+  @Override
   public void mouseClicked(MouseEvent evt)
   {
   }
 
+  @Override
   public void mouseEntered(MouseEvent evt)
   {
   }
 
+  @Override
   public void mouseExited(MouseEvent evt)
   {
   }
index b90b8d3..3f87549 100644 (file)
@@ -72,9 +72,6 @@ public class FeatureRenderer extends
   {
     super();
     this.av = av;
-
-    setTransparencyAvailable(!System.getProperty("java.version")
-            .startsWith("1.1"));
   }
 
   static String lastFeatureAdded;
index 203605b..bfac241 100755 (executable)
@@ -56,6 +56,7 @@ import java.awt.event.MouseListener;
 import java.awt.event.MouseMotionListener;
 import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
+import java.util.Arrays;
 import java.util.Enumeration;
 import java.util.List;
 import java.util.Map;
@@ -93,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)
@@ -132,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);
 
@@ -207,7 +192,7 @@ public class FeatureSettings extends Panel implements ItemListener,
     final FeatureColourI typeCol = fr.getFeatureStyle(type);
     PopupMenu men = new PopupMenu(MessageManager.formatMessage(
             "label.settings_for_type", new String[] { type }));
-    MenuItem scr = new MenuItem(
+    java.awt.MenuItem scr = new MenuItem(
             MessageManager.getString("label.sort_by_score"));
     men.add(scr);
     final FeatureSettings me = this;
@@ -217,8 +202,8 @@ public class FeatureSettings extends Panel implements ItemListener,
       @Override
       public void actionPerformed(ActionEvent e)
       {
-        me.ap.alignFrame.avc
-                .sortAlignmentByFeatureScore(new String[] { type });
+        me.ap.alignFrame.avc.sortAlignmentByFeatureScore(Arrays
+                .asList(new String[] { type }));
       }
 
     });
@@ -230,12 +215,13 @@ public class FeatureSettings extends Panel implements ItemListener,
       @Override
       public void actionPerformed(ActionEvent e)
       {
-        me.ap.alignFrame.avc
-                .sortAlignmentByFeatureDensity(new String[] { type });
+        me.ap.alignFrame.avc.sortAlignmentByFeatureDensity(Arrays
+                .asList(new String[] { type }));
       }
 
     });
     men.add(dens);
+
     if (minmax != null)
     {
       final float[][] typeMinMax = minmax.get(type);
@@ -280,6 +266,57 @@ public class FeatureSettings extends Panel implements ItemListener,
         });
       }
     }
+
+    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);
   }
@@ -316,9 +353,7 @@ public class FeatureSettings extends Panel implements ItemListener,
     for (String group : fr.getFeatureGroups())
     {
       boolean vis = fr.checkGroupVisibility(group, false);
-      Checkbox check = new MyCheckbox(group, vis,
-              (fr.featureLinks != null && fr.featureLinks
-                      .containsKey(group)));
+      Checkbox check = new MyCheckbox(group, vis, false);
       check.addMouseListener(this);
       check.setFont(new Font("Serif", Font.BOLD, 12));
       check.addItemListener(groupItemListener);
@@ -456,10 +491,7 @@ public class FeatureSettings extends Panel implements ItemListener,
         selected = true;
       }
 
-      check = new MyCheckbox(
-              type,
-              selected,
-              (fr.featureLinks != null && fr.featureLinks.containsKey(type)),
+      check = new MyCheckbox(type, selected, false,
               fr.getFeatureStyle(type));
 
       check.addMouseListener(this);
@@ -541,23 +573,6 @@ public class FeatureSettings extends Panel implements ItemListener,
   boolean dragging = false;
 
   @Override
-  public void mousePressed(MouseEvent evt)
-  {
-
-    selectedCheck = (MyCheckbox) evt.getSource();
-
-    if (fr.featureLinks != null
-            && fr.featureLinks.containsKey(selectedCheck.type))
-    {
-      if (evt.getX() > selectedCheck.stringWidth + 20)
-      {
-        evt.consume();
-      }
-    }
-
-  }
-
-  @Override
   public void mouseDragged(MouseEvent evt)
   {
     if (((Component) evt.getSource()).getParent() != featurePanel)
@@ -651,16 +666,6 @@ public class FeatureSettings extends Panel implements ItemListener,
     {
       this.popupSort(check, fr.getMinMax(), evt.getX(), evt.getY());
     }
-    if (fr.featureLinks != null && fr.featureLinks.containsKey(check.type))
-    {
-      if (evt.getX() > check.stringWidth + 20)
-      {
-        evt.consume();
-        String link = fr.featureLinks.get(check.type).toString();
-        ap.alignFrame.showURL(link.substring(link.indexOf("|") + 1),
-                link.substring(0, link.indexOf("|")));
-      }
-    }
 
     if (check.getParent() != featurePanel)
     {
@@ -790,4 +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
+
+  }
+
 }
index 16bba0b..d72e91f 100755 (executable)
@@ -138,11 +138,13 @@ public class IdCanvas extends Panel
     repaint();
   }
 
+  @Override
   public void update(Graphics g)
   {
     paint(g);
   }
 
+  @Override
   public void paint(Graphics g)
   {
     if (getSize().height < 0 || getSize().width < 0)
@@ -378,7 +380,7 @@ public class IdCanvas extends Panel
     Font bold = new Font(av.getFont().getName(), Font.BOLD, av.getFont()
             .getSize());
 
-    if (av.isHiddenRepSequence(seq))
+    if (av.isReferenceSeq(seq) || av.isHiddenRepSequence(seq))
     {
       gg.setFont(bold);
       return true;
index 3c6a4f1..71ecb13 100755 (executable)
@@ -410,6 +410,8 @@ public class ScalePanel extends Panel implements MouseMotionListener,
     int avcharWidth = av.getCharWidth(), avcharHeight = av.getCharHeight();
     for (int sel : cs.getSelected())
     {
+      // TODO: JAL-2001 - provide a fast method to list visible selected in a
+      // given range
       if (av.hasHiddenColumns())
       {
         sel = av.getColumnSelection().findColumnPosition(sel);
@@ -426,6 +428,7 @@ public class ScalePanel extends Panel implements MouseMotionListener,
     gg.setColor(Color.black);
 
     int scalestartx = (startx / 10) * 10;
+    int widthx = 1 + endx - startx;
 
     FontMetrics fm = gg.getFontMetrics(av.getFont());
     int y = avcharHeight - fm.getDescent();
@@ -477,7 +480,7 @@ public class ScalePanel extends Panel implements MouseMotionListener,
           res = av.getColumnSelection().findHiddenRegionPosition(i)
                   - startx;
 
-          if (res < 0 || res > endx - scalestartx)
+          if (res < 0 || res > widthx)
           {
             continue;
           }
index ce70597..024fdc7 100755 (executable)
@@ -276,6 +276,7 @@ public class SeqCanvas extends Panel
    * at 0). NOTE 1: The av limits are set in setFont in this class and in the
    * adjustment listener in SeqPanel when the scrollbars move.
    */
+  @Override
   public void update(Graphics g)
   {
     paint(g);
@@ -573,10 +574,17 @@ public class SeqCanvas extends Panel
           g1.translate(-screenY * avcharWidth, 0);
           screenY += blockEnd - blockStart + 1;
           blockStart = hideEnd + 1;
+
+          if (screenY > (endRes - startRes))
+          {
+            // already rendered last block
+            return;
+          }
         }
       }
       if (screenY <= (endRes - startRes))
       {
+        // remaining visible region to render
         blockEnd = blockStart + (endRes - startRes) - screenY;
         g1.translate(screenY * avcharWidth, 0);
         draw(g1, blockStart, blockEnd, startSeq, endSeq, offset);
index f9480ab..7911cd5 100755 (executable)
@@ -20,6 +20,8 @@
  */
 package jalview.bin;
 
+import jalview.datamodel.DBRefSource;
+import jalview.ws.dbsources.Pdb;
 import jalview.ws.dbsources.das.api.DasSourceRegistryI;
 import jalview.ws.dbsources.das.datamodel.DasSourceRegistry;
 import jalview.ws.sifts.SiftsSettings;
@@ -226,6 +228,8 @@ public class Cache
 
   private final static String DEFAULT_FAIL_SAFE_PID_THRESHOLD = "30";
 
+  private final static String DEFAULT_STRUCTURE_FORMAT = DBRefSource.PDB;
+
   /**
    * Initialises the Jalview Application Log
    */
@@ -422,6 +426,8 @@ public class Cache
     System.out
             .println("Jalview Version: " + codeVersion + codeInstallation);
 
+    Pdb.setCurrentDefaultFomart(jalview.bin.Cache.getDefault(
+            "DEFAULT_STRUCTURE_FORMAT", DEFAULT_STRUCTURE_FORMAT));
     // jnlpVersion will be null if we're using InstallAnywhere
     // Dont do this check if running in headless mode
     if (jnlpVersion == null
index 462f5a7..d0b3232 100755 (executable)
@@ -51,7 +51,6 @@ import java.util.Map;
 import java.util.Vector;
 
 import javax.swing.UIManager;
-import javax.swing.UnsupportedLookAndFeelException;
 
 /**
  * Main class for Jalview Application <br>
@@ -68,6 +67,7 @@ public class Jalview
     // grab all the rights we can the JVM
     Policy.setPolicy(new Policy()
     {
+      @Override
       public PermissionCollection getPermissions(CodeSource codesource)
       {
         Permissions perms = new Permissions();
@@ -75,6 +75,7 @@ public class Jalview
         return (perms);
       }
 
+      @Override
       public void refresh()
       {
       }
@@ -89,6 +90,7 @@ public class Jalview
    */
   public static void main(String[] args)
   {
+    System.setSecurityManager(null);
     System.out.println("Java version: "
             + System.getProperty("java.version"));
     System.out.println(System.getProperty("os.arch") + " "
@@ -178,7 +180,7 @@ public class Jalview
     } catch (Exception ex)
     {
     }
-    if (new Platform().isAMac())
+    if (Platform.isAMac())
     {
       System.setProperty("com.apple.mrj.application.apple.menu.about.name",
               "Jalview");
@@ -187,10 +189,10 @@ public class Jalview
       {
         UIManager.setLookAndFeel(ch.randelshofer.quaqua.QuaquaManager
                 .getLookAndFeel());
-      } catch (UnsupportedLookAndFeelException e)
+      } catch (Throwable e)
       {
-        // TODO Auto-generated catch block
-        e.printStackTrace();
+        System.err.println("Failed to set QuaQua look and feel: "
+                + e.toString());
       }
     }
 
@@ -377,7 +379,7 @@ public class Jalview
 
       protocol = jalview.io.AppletFormatAdapter.checkProtocol(file);
 
-      format = new jalview.io.IdentifyFile().Identify(file, protocol);
+      format = new jalview.io.IdentifyFile().identify(file, protocol);
 
       AlignFrame af = fileLoader.LoadFileWaitTillLoaded(file, protocol,
               format);
@@ -514,20 +516,10 @@ public class Jalview
         {
           // Execute the groovy script after we've done all the rendering stuff
           // and before any images or figures are generated.
-          if (jalview.bin.Cache.groovyJarsPresent())
-          {
-            System.out.println("Executing script " + groovyscript);
-            executeGroovyScript(groovyscript, new Object[] { desktop, af });
-
-            System.out.println("CMD groovy[" + groovyscript
-                    + "] executed successfully!");
-          }
-          else
-          {
-            System.err
-                    .println("Sorry. Groovy Support is not available, so ignoring the provided groovy script "
-                            + groovyscript);
-          }
+          System.out.println("Executing script " + groovyscript);
+          executeGroovyScript(groovyscript, new Object[] { desktop, af });
+          System.out.println("CMD groovy[" + groovyscript
+                  + "] executed successfully!");
           groovyscript = null;
         }
         String imageName = "unnamed.png";
@@ -627,7 +619,7 @@ public class Jalview
       }
       else
       {
-        format = new jalview.io.IdentifyFile().Identify(file, protocol);
+        format = new jalview.io.IdentifyFile().identify(file, protocol);
       }
 
       startUpAlframe = fileLoader.LoadFileWaitTillLoaded(file, protocol,
@@ -729,6 +721,7 @@ public class Jalview
                     + "\n\n(you can enable or disable usage tracking in the preferences)",
             new Runnable()
             {
+              @Override
               public void run()
               {
                 Cache.log
@@ -738,6 +731,7 @@ public class Jalview
               }
             }, new Runnable()
             {
+              @Override
               public void run()
               {
                 Cache.log.debug("Not enabling Google Tracking.");
@@ -1040,6 +1034,7 @@ public class Jalview
 
 class rnabuttonlistener implements ActionListener
 {
+  @Override
   public void actionPerformed(ActionEvent arg0)
   {
     System.out.println("Good idea ! ");
@@ -1049,6 +1044,7 @@ class rnabuttonlistener implements ActionListener
 
 class pbuttonlistener implements ActionListener
 {
+  @Override
   public void actionPerformed(ActionEvent arg0)
   {
 
@@ -1169,6 +1165,7 @@ class FeatureFetcher
     new Thread(new Runnable()
     {
 
+      @Override
       public void run()
       {
         synchronized (us)
index 36a7cff..13e4b7e 100644 (file)
@@ -100,6 +100,7 @@ public class JalviewLite extends Applet implements
    * 
    * @see jalview.bin.JalviewLiteJsApi#getSelectedSequences()
    */
+  @Override
   public String getSelectedSequences()
   {
     return getSelectedSequencesFrom(getDefaultTargetFrame());
@@ -110,6 +111,7 @@ public class JalviewLite extends Applet implements
    * 
    * @see jalview.bin.JalviewLiteJsApi#getSelectedSequences(java.lang.String)
    */
+  @Override
   public String getSelectedSequences(String sep)
   {
     return getSelectedSequencesFrom(getDefaultTargetFrame(), sep);
@@ -122,6 +124,7 @@ public class JalviewLite extends Applet implements
    * jalview.bin.JalviewLiteJsApi#getSelectedSequencesFrom(jalview.appletgui
    * .AlignFrame)
    */
+  @Override
   public String getSelectedSequencesFrom(AlignFrame alf)
   {
     return getSelectedSequencesFrom(alf, separator); // ""+0x00AC);
@@ -134,6 +137,7 @@ public class JalviewLite extends Applet implements
    * jalview.bin.JalviewLiteJsApi#getSelectedSequencesFrom(jalview.appletgui
    * .AlignFrame, java.lang.String)
    */
+  @Override
   public String getSelectedSequencesFrom(AlignFrame alf, String sep)
   {
     StringBuffer result = new StringBuffer("");
@@ -162,6 +166,7 @@ public class JalviewLite extends Applet implements
    * @see jalview.bin.JalviewLiteJsApi#highlight(java.lang.String,
    * java.lang.String, java.lang.String)
    */
+  @Override
   public void highlight(String sequenceId, String position,
           String alignedPosition)
   {
@@ -175,6 +180,7 @@ public class JalviewLite extends Applet implements
    * @see jalview.bin.JalviewLiteJsApi#highlightIn(jalview.appletgui.AlignFrame,
    * java.lang.String, java.lang.String, java.lang.String)
    */
+  @Override
   public void highlightIn(final AlignFrame alf, final String sequenceId,
           final String position, final String alignedPosition)
   {
@@ -231,6 +237,7 @@ public class JalviewLite extends Applet implements
    * @see jalview.bin.JalviewLiteJsApi#select(java.lang.String,
    * java.lang.String)
    */
+  @Override
   public void select(String sequenceIds, String columns)
   {
     selectIn(getDefaultTargetFrame(), sequenceIds, columns, separator);
@@ -242,6 +249,7 @@ public class JalviewLite extends Applet implements
    * @see jalview.bin.JalviewLiteJsApi#select(java.lang.String,
    * java.lang.String, java.lang.String)
    */
+  @Override
   public void select(String sequenceIds, String columns, String sep)
   {
     selectIn(getDefaultTargetFrame(), sequenceIds, columns, sep);
@@ -253,6 +261,7 @@ public class JalviewLite extends Applet implements
    * @see jalview.bin.JalviewLiteJsApi#selectIn(jalview.appletgui.AlignFrame,
    * java.lang.String, java.lang.String)
    */
+  @Override
   public void selectIn(AlignFrame alf, String sequenceIds, String columns)
   {
     selectIn(alf, sequenceIds, columns, separator);
@@ -264,6 +273,7 @@ public class JalviewLite extends Applet implements
    * @see jalview.bin.JalviewLiteJsApi#selectIn(jalview.appletgui.AlignFrame,
    * java.lang.String, java.lang.String, java.lang.String)
    */
+  @Override
   public void selectIn(final AlignFrame alf, String sequenceIds,
           String columns, String sep)
   {
@@ -459,6 +469,9 @@ public class JalviewLite extends Applet implements
         if (csel != null)
         {
           List<Integer> cs = csel.getSelected();
+          // note - the following actually clears cs as well, since
+          // csel.getSelected returns a reference. Need to check if we need to
+          // have a concurrentModification exception thrown here
           csel.clear();
           for (Integer selectedCol : cs)
           {
@@ -486,6 +499,7 @@ public class JalviewLite extends Applet implements
    * jalview.bin.JalviewLiteJsApi#getSelectedSequencesAsAlignment(java.lang.
    * String, java.lang.String)
    */
+  @Override
   public String getSelectedSequencesAsAlignment(String format, String suffix)
   {
     return getSelectedSequencesAsAlignmentFrom(getDefaultTargetFrame(),
@@ -499,6 +513,7 @@ public class JalviewLite extends Applet implements
    * jalview.bin.JalviewLiteJsApi#getSelectedSequencesAsAlignmentFrom(jalview
    * .appletgui.AlignFrame, java.lang.String, java.lang.String)
    */
+  @Override
   public String getSelectedSequencesAsAlignmentFrom(AlignFrame alf,
           String format, String suffix)
   {
@@ -528,6 +543,7 @@ public class JalviewLite extends Applet implements
    * 
    * @see jalview.bin.JalviewLiteJsApi#getAlignmentOrder()
    */
+  @Override
   public String getAlignmentOrder()
   {
     return getAlignmentOrderFrom(getDefaultTargetFrame());
@@ -540,6 +556,7 @@ public class JalviewLite extends Applet implements
    * jalview.bin.JalviewLiteJsApi#getAlignmentOrderFrom(jalview.appletgui.AlignFrame
    * )
    */
+  @Override
   public String getAlignmentOrderFrom(AlignFrame alf)
   {
     return getAlignmentOrderFrom(alf, separator);
@@ -552,6 +569,7 @@ public class JalviewLite extends Applet implements
    * jalview.bin.JalviewLiteJsApi#getAlignmentOrderFrom(jalview.appletgui.AlignFrame
    * , java.lang.String)
    */
+  @Override
   public String getAlignmentOrderFrom(AlignFrame alf, String sep)
   {
     AlignmentI alorder = alf.getAlignViewport().getAlignment();
@@ -569,6 +587,7 @@ public class JalviewLite extends Applet implements
    * @see jalview.bin.JalviewLiteJsApi#orderBy(java.lang.String,
    * java.lang.String)
    */
+  @Override
   public String orderBy(String order, String undoName)
   {
     return orderBy(order, undoName, separator);
@@ -580,6 +599,7 @@ public class JalviewLite extends Applet implements
    * @see jalview.bin.JalviewLiteJsApi#orderBy(java.lang.String,
    * java.lang.String, java.lang.String)
    */
+  @Override
   public String orderBy(String order, String undoName, String sep)
   {
     return orderAlignmentBy(getDefaultTargetFrame(), order, undoName, sep);
@@ -592,6 +612,7 @@ public class JalviewLite extends Applet implements
    * jalview.bin.JalviewLiteJsApi#orderAlignmentBy(jalview.appletgui.AlignFrame,
    * java.lang.String, java.lang.String, java.lang.String)
    */
+  @Override
   public String orderAlignmentBy(AlignFrame alf, String order,
           String undoName, String sep)
   {
@@ -648,6 +669,7 @@ public class JalviewLite extends Applet implements
    * 
    * @see jalview.bin.JalviewLiteJsApi#getAlignment(java.lang.String)
    */
+  @Override
   public String getAlignment(String format)
   {
     return getAlignmentFrom(getDefaultTargetFrame(), format, TRUE);
@@ -660,6 +682,7 @@ public class JalviewLite extends Applet implements
    * jalview.bin.JalviewLiteJsApi#getAlignmentFrom(jalview.appletgui.AlignFrame,
    * java.lang.String)
    */
+  @Override
   public String getAlignmentFrom(AlignFrame alf, String format)
   {
     return getAlignmentFrom(alf, format, TRUE);
@@ -671,6 +694,7 @@ public class JalviewLite extends Applet implements
    * @see jalview.bin.JalviewLiteJsApi#getAlignment(java.lang.String,
    * java.lang.String)
    */
+  @Override
   public String getAlignment(String format, String suffix)
   {
     return getAlignmentFrom(getDefaultTargetFrame(), format, suffix);
@@ -683,6 +707,7 @@ public class JalviewLite extends Applet implements
    * jalview.bin.JalviewLiteJsApi#getAlignmentFrom(jalview.appletgui.AlignFrame,
    * java.lang.String, java.lang.String)
    */
+  @Override
   public String getAlignmentFrom(AlignFrame alf, String format,
           String suffix)
   {
@@ -705,6 +730,7 @@ public class JalviewLite extends Applet implements
    * 
    * @see jalview.bin.JalviewLiteJsApi#loadAnnotation(java.lang.String)
    */
+  @Override
   public void loadAnnotation(String annotation)
   {
     loadAnnotationFrom(getDefaultTargetFrame(), annotation);
@@ -717,6 +743,7 @@ public class JalviewLite extends Applet implements
    * jalview.bin.JalviewLiteJsApi#loadAnnotationFrom(jalview.appletgui.AlignFrame
    * , java.lang.String)
    */
+  @Override
   public void loadAnnotationFrom(AlignFrame alf, String annotation)
   {
     if (new AnnotationFile().annotateAlignmentView(alf.getAlignViewport(),
@@ -736,6 +763,7 @@ public class JalviewLite extends Applet implements
    * 
    * @see jalview.bin.JalviewLiteJsApi#loadAnnotation(java.lang.String)
    */
+  @Override
   public void loadFeatures(String features, boolean autoenabledisplay)
   {
     loadFeaturesFrom(getDefaultTargetFrame(), features, autoenabledisplay);
@@ -748,6 +776,7 @@ public class JalviewLite extends Applet implements
    * jalview.bin.JalviewLiteJsApi#loadAnnotationFrom(jalview.appletgui.AlignFrame
    * , java.lang.String)
    */
+  @Override
   public boolean loadFeaturesFrom(AlignFrame alf, String features,
           boolean autoenabledisplay)
   {
@@ -760,6 +789,7 @@ public class JalviewLite extends Applet implements
    * 
    * @see jalview.bin.JalviewLiteJsApi#getFeatures(java.lang.String)
    */
+  @Override
   public String getFeatures(String format)
   {
     return getFeaturesFrom(getDefaultTargetFrame(), format);
@@ -772,6 +802,7 @@ public class JalviewLite extends Applet implements
    * jalview.bin.JalviewLiteJsApi#getFeaturesFrom(jalview.appletgui.AlignFrame,
    * java.lang.String)
    */
+  @Override
   public String getFeaturesFrom(AlignFrame alf, String format)
   {
     return alf.outputFeatures(false, format);
@@ -782,6 +813,7 @@ public class JalviewLite extends Applet implements
    * 
    * @see jalview.bin.JalviewLiteJsApi#getAnnotation()
    */
+  @Override
   public String getAnnotation()
   {
     return getAnnotationFrom(getDefaultTargetFrame());
@@ -794,6 +826,7 @@ public class JalviewLite extends Applet implements
    * jalview.bin.JalviewLiteJsApi#getAnnotationFrom(jalview.appletgui.AlignFrame
    * )
    */
+  @Override
   public String getAnnotationFrom(AlignFrame alf)
   {
     return alf.outputAnnotations(false);
@@ -804,6 +837,7 @@ public class JalviewLite extends Applet implements
    * 
    * @see jalview.bin.JalviewLiteJsApi#newView()
    */
+  @Override
   public AlignFrame newView()
   {
     return newViewFrom(getDefaultTargetFrame());
@@ -814,6 +848,7 @@ public class JalviewLite extends Applet implements
    * 
    * @see jalview.bin.JalviewLiteJsApi#newView(java.lang.String)
    */
+  @Override
   public AlignFrame newView(String name)
   {
     return newViewFrom(getDefaultTargetFrame(), name);
@@ -824,6 +859,7 @@ public class JalviewLite extends Applet implements
    * 
    * @see jalview.bin.JalviewLiteJsApi#newViewFrom(jalview.appletgui.AlignFrame)
    */
+  @Override
   public AlignFrame newViewFrom(AlignFrame alf)
   {
     return alf.newView(null);
@@ -835,6 +871,7 @@ public class JalviewLite extends Applet implements
    * @see jalview.bin.JalviewLiteJsApi#newViewFrom(jalview.appletgui.AlignFrame,
    * java.lang.String)
    */
+  @Override
   public AlignFrame newViewFrom(AlignFrame alf, String name)
   {
     return alf.newView(name);
@@ -846,11 +883,12 @@ public class JalviewLite extends Applet implements
    * @see jalview.bin.JalviewLiteJsApi#loadAlignment(java.lang.String,
    * java.lang.String)
    */
+  @Override
   public AlignFrame loadAlignment(String text, String title)
   {
     AlignmentI al = null;
 
-    String format = new IdentifyFile().Identify(text,
+    String format = new IdentifyFile().identify(text,
             AppletFormatAdapter.PASTE);
     try
     {
@@ -872,6 +910,7 @@ public class JalviewLite extends Applet implements
    * 
    * @see jalview.bin.JalviewLiteJsApi#setMouseoverListener(java.lang.String)
    */
+  @Override
   public void setMouseoverListener(String listener)
   {
     setMouseoverListener(currentAlignFrame, listener);
@@ -886,6 +925,7 @@ public class JalviewLite extends Applet implements
    * jalview.bin.JalviewLiteJsApi#setMouseoverListener(jalview.appletgui.AlignFrame
    * , java.lang.String)
    */
+  @Override
   public void setMouseoverListener(AlignFrame af, String listener)
   {
     if (listener != null)
@@ -918,6 +958,7 @@ public class JalviewLite extends Applet implements
    * 
    * @see jalview.bin.JalviewLiteJsApi#setSelectionListener(java.lang.String)
    */
+  @Override
   public void setSelectionListener(String listener)
   {
     setSelectionListener(null, listener);
@@ -930,6 +971,7 @@ public class JalviewLite extends Applet implements
    * jalview.bin.JalviewLiteJsApi#setSelectionListener(jalview.appletgui.AlignFrame
    * , java.lang.String)
    */
+  @Override
   public void setSelectionListener(AlignFrame af, String listener)
   {
     if (listener != null)
@@ -968,6 +1010,7 @@ public class JalviewLite extends Applet implements
    * @see jalview.bin.JalviewLiteJsApi#setStructureListener(java.lang.String,
    *      java.lang.String)
    */
+  @Override
   public void setStructureListener(String listener, String modelSet)
   {
     if (listener != null)
@@ -1001,6 +1044,7 @@ public class JalviewLite extends Applet implements
    * jalview.bin.JalviewLiteJsApi#removeJavascriptListener(jalview.appletgui
    * .AlignFrame, java.lang.String)
    */
+  @Override
   public void removeJavascriptListener(AlignFrame af, String listener)
   {
     if (listener != null)
@@ -1050,12 +1094,14 @@ public class JalviewLite extends Applet implements
     }
   }
 
+  @Override
   public void stop()
   {
     System.err.println("Applet " + getName() + " stop().");
     tidyUp();
   }
 
+  @Override
   public void destroy()
   {
     System.err.println("Applet " + getName() + " destroy().");
@@ -1112,6 +1158,7 @@ public class JalviewLite extends Applet implements
    * @see jalview.bin.JalviewLiteJsApi#mouseOverStructure(java.lang.String,
    * java.lang.String, java.lang.String)
    */
+  @Override
   public void mouseOverStructure(final String pdbResNum,
           final String chain, final String pdbfile)
   {
@@ -1149,6 +1196,7 @@ public class JalviewLite extends Applet implements
    * jalview.bin.JalviewLiteJsApi#scrollViewToIn(jalview.appletgui.AlignFrame,
    * java.lang.String, java.lang.String)
    */
+  @Override
   public void scrollViewToIn(final AlignFrame alf, final String topRow,
           final String leftHandColumn)
   {
@@ -1488,6 +1536,7 @@ public class JalviewLite extends Applet implements
         add(launcher);
         launcher.addActionListener(new java.awt.event.ActionListener()
         {
+          @Override
           public void actionPerformed(ActionEvent e)
           {
             LoadingThread loader = new LoadingThread(file, file2,
@@ -1610,6 +1659,7 @@ public class JalviewLite extends Applet implements
     frame.setTitle(title);
     frame.addWindowListener(new WindowAdapter()
     {
+      @Override
       public void windowClosing(WindowEvent e)
       {
         if (frame instanceof AlignFrame)
@@ -1634,6 +1684,7 @@ public class JalviewLite extends Applet implements
         frame.dispose();
       }
 
+      @Override
       public void windowActivated(WindowEvent e)
       {
         if (frame instanceof AlignFrame)
@@ -1671,6 +1722,7 @@ public class JalviewLite extends Applet implements
    * @param g
    *          graphics context
    */
+  @Override
   public void paint(Graphics g)
   {
     if (!fileFound)
@@ -1722,6 +1774,7 @@ public class JalviewLite extends Applet implements
   {
     private boolean running = false;
 
+    @Override
     public void run()
     {
       if (running || checkedForJmol)
@@ -1866,6 +1919,7 @@ public class JalviewLite extends Applet implements
       applet = _applet;
     }
 
+    @Override
     public void run()
     {
       LoadJmolThread jmolchecker = new LoadJmolThread();
@@ -1967,7 +2021,7 @@ public class JalviewLite extends Applet implements
         return null;
       }
       String resolvedFile = resolveFileProtocol(fileParam);
-      String format = new IdentifyFile().Identify(resolvedFile, protocol);
+      String format = new IdentifyFile().identify(resolvedFile, protocol);
       dbgMsg("File identified as '" + format + "'");
       AlignmentI al = null;
       try
@@ -2566,6 +2620,7 @@ public class JalviewLite extends Applet implements
    * 
    * @see jalview.bin.JalviewLiteJsApi#getFeatureGroups()
    */
+  @Override
   public String getFeatureGroups()
   {
     String lst = arrayToSeparatorList(getDefaultTargetFrame()
@@ -2580,6 +2635,7 @@ public class JalviewLite extends Applet implements
    * jalview.bin.JalviewLiteJsApi#getFeatureGroupsOn(jalview.appletgui.AlignFrame
    * )
    */
+  @Override
   public String getFeatureGroupsOn(AlignFrame alf)
   {
     String lst = arrayToSeparatorList(alf.getFeatureGroups());
@@ -2591,6 +2647,7 @@ public class JalviewLite extends Applet implements
    * 
    * @see jalview.bin.JalviewLiteJsApi#getFeatureGroupsOfState(boolean)
    */
+  @Override
   public String getFeatureGroupsOfState(boolean visible)
   {
     return arrayToSeparatorList(getDefaultTargetFrame()
@@ -2604,6 +2661,7 @@ public class JalviewLite extends Applet implements
    * jalview.bin.JalviewLiteJsApi#getFeatureGroupsOfStateOn(jalview.appletgui
    * .AlignFrame, boolean)
    */
+  @Override
   public String getFeatureGroupsOfStateOn(AlignFrame alf, boolean visible)
   {
     return arrayToSeparatorList(alf.getFeatureGroupsOfState(visible));
@@ -2615,6 +2673,7 @@ public class JalviewLite extends Applet implements
    * @see jalview.bin.JalviewLiteJsApi#setFeatureGroupStateOn(jalview.appletgui.
    * AlignFrame, java.lang.String, boolean)
    */
+  @Override
   public void setFeatureGroupStateOn(final AlignFrame alf,
           final String groups, boolean state)
   {
@@ -2636,6 +2695,7 @@ public class JalviewLite extends Applet implements
    * @see jalview.bin.JalviewLiteJsApi#setFeatureGroupState(java.lang.String,
    * boolean)
    */
+  @Override
   public void setFeatureGroupState(String groups, boolean state)
   {
     setFeatureGroupStateOn(getDefaultTargetFrame(), groups, state);
@@ -2646,6 +2706,7 @@ public class JalviewLite extends Applet implements
    * 
    * @see jalview.bin.JalviewLiteJsApi#getSeparator()
    */
+  @Override
   public String getSeparator()
   {
     return separator;
@@ -2656,6 +2717,7 @@ public class JalviewLite extends Applet implements
    * 
    * @see jalview.bin.JalviewLiteJsApi#setSeparator(java.lang.String)
    */
+  @Override
   public void setSeparator(String separator)
   {
     if (separator == null || separator.length() < 1)
@@ -2700,6 +2762,7 @@ public class JalviewLite extends Applet implements
    * @see jalview.bin.JalviewLiteJsApi#addPdbFile(jalview.appletgui.AlignFrame,
    * java.lang.String, java.lang.String, java.lang.String)
    */
+  @Override
   public boolean addPdbFile(AlignFrame alFrame, String sequenceId,
           String pdbEntryString, String pdbFile)
   {
@@ -2716,6 +2779,7 @@ public class JalviewLite extends Applet implements
     return alignPdbStructures;
   }
 
+  @Override
   public void start()
   {
     // callInitCallback();
@@ -2749,6 +2813,7 @@ public class JalviewLite extends Applet implements
    * @see jalview.bin.JalviewLiteJsApi#getJsMessage(java.lang.String,
    * java.lang.String)
    */
+  @Override
   public String getJsMessage(String messageclass, String viewId)
   {
     Hashtable<String, String[]> msgset = jsmessages.get(messageclass);
index 6be1016..fd88028 100644 (file)
@@ -113,7 +113,7 @@ public class JalviewLiteURLRetrieve extends Applet
       String format = getParameter("format");
       if (format == null || format.length() == 0)
       {
-        format = new jalview.io.IdentifyFile().Identify(file, protocol);
+        format = new jalview.io.IdentifyFile().identify(file, protocol);
         System.out.println("Format is " + format);
       }
       else
index 6a7e222..24439ca 100644 (file)
@@ -37,7 +37,6 @@ import jalview.io.FeaturesFile;
 import jalview.util.MessageManager;
 
 import java.awt.Color;
-import java.util.ArrayList;
 import java.util.BitSet;
 import java.util.List;
 
@@ -239,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();
@@ -247,6 +247,7 @@ public class AlignViewController implements AlignViewControllerI
       {
         if (!extendCurrent)
         {
+          changed = !cs.isEmpty();
           cs.clear();
         }
       }
@@ -258,6 +259,7 @@ public class AlignViewController implements AlignViewControllerI
         {
           if (ibs < 0 || i < ibs)
           {
+            changed = true;
             if (toggle && cs.contains(i))
             {
               cs.removeElement(i++);
@@ -279,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);
@@ -289,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
     {
@@ -312,51 +318,28 @@ public class AlignViewController implements AlignViewControllerI
         cs.clear();
         alignPanel.paintAlignment(true);
       }
-      return false;
     }
+    return false;
   }
 
   @Override
-  public void sortAlignmentByFeatureDensity(String[] typ)
+  public void sortAlignmentByFeatureDensity(List<String> typ)
   {
     sortBy(typ, "Sort by Density", AlignmentSorter.FEATURE_DENSITY);
   }
 
-  protected void sortBy(String[] typ, String methodText, final String method)
+  protected void sortBy(List<String> typ, String methodText,
+          final String method)
   {
     FeatureRenderer fr = alignPanel.getFeatureRenderer();
-    if (typ == null)
+    if (typ == null && fr != null)
     {
-      typ = fr == null ? null : fr.getDisplayedFeatureTypes();
+      typ = fr.getDisplayedFeatureTypes();
     }
-    String gps[] = null;
-    gps = fr == null ? null : fr.getDisplayedFeatureGroups();
-    if (typ != null)
+    List<String> gps = null;
+    if (fr != null)
     {
-      List<String> types = new ArrayList<String>();
-      for (String displayed : typ)
-      {
-        if (displayed != null)
-        {
-          types.add(displayed);
-        }
-      }
-      typ = new String[types.size()];
-      types.toArray(typ);
-    }
-    if (gps != null)
-    {
-      List<String> grps = new ArrayList<String>();
-
-      for (int i = 0; i < gps.length; i++)
-      {
-        if (gps[i] != null)
-        {
-          grps.add(gps[i]);
-        }
-      }
-      gps = new String[grps.size()];
-      grps.toArray(gps);
+      gps = fr.getDisplayedFeatureGroups();
     }
     AlignmentI al = viewport.getAlignment();
 
@@ -381,7 +364,7 @@ public class AlignViewController implements AlignViewControllerI
   }
 
   @Override
-  public void sortAlignmentByFeatureScore(String[] typ)
+  public void sortAlignmentByFeatureScore(List<String> typ)
   {
     sortBy(typ, "Sort by Feature Score", AlignmentSorter.FEATURE_SCORE);
   }
@@ -393,7 +376,7 @@ public class AlignViewController implements AlignViewControllerI
     boolean featuresFile = false;
     try
     {
-      featuresFile = new FeaturesFile(file, protocol).parse(viewport
+      featuresFile = new FeaturesFile(false, file, protocol).parse(viewport
               .getAlignment().getDataset(), alignPanel.getFeatureRenderer()
               .getFeatureColours(), false, relaxedIdMatching);
     } catch (Exception ex)
index 6179831..39a1853 100644 (file)
@@ -27,32 +27,38 @@ package jalview.datamodel;
  * 
  * Example: in "G-AT-C-GA" the aligned codons are (0, 2, 3) and (5, 7, 8).
  * 
- * JBPComment: Is this useful anywhere other than jalview.analysis.Dna ?
- * 
  * @author gmcarstairs
  *
  */
 public final class AlignedCodon
 {
+  // base 1 aligned sequence position (base 0)
   public final int pos1;
 
+  // base 2 aligned sequence position (base 0)
   public final int pos2;
 
+  // base 3 aligned sequence position (base 0)
   public final int pos3;
 
+  // peptide aligned sequence position (base 0)
+  public final int peptideCol;
+
+  // peptide coded for by this codon
   public final String product;
 
   public AlignedCodon(int i, int j, int k)
   {
-    this(i, j, k, null);
+    this(i, j, k, null, 0);
   }
 
-  public AlignedCodon(int i, int j, int k, String prod)
+  public AlignedCodon(int i, int j, int k, String prod, int prodCol)
   {
     pos1 = i;
     pos2 = j;
     pos3 = k;
     product = prod;
+    peptideCol = prodCol;
   }
 
   /**
index 9c642cf..6d6cdb5 100644 (file)
@@ -33,23 +33,40 @@ import java.util.List;
 public class AlignedCodonFrame
 {
 
-  /**
-   * tied array of na Sequence objects.
+  /*
+   * Data bean to hold mappings from one sequence to another
    */
-  private SequenceI[] dnaSeqs = null;
+  private class SequenceToSequenceMapping
+  {
+    private SequenceI fromSeq;
 
-  /**
-   * tied array of Mappings to protein sequence Objects and SequenceI[]
-   * aaSeqs=null; MapLists where each maps from the corresponding dnaSeqs
-   * element to corresponding aaSeqs element
-   */
-  private Mapping[] dnaToProt = null;
+    private Mapping mapping;
+
+    SequenceToSequenceMapping(SequenceI from, Mapping map)
+    {
+      this.fromSeq = from;
+      this.mapping = map;
+    }
+
+    /**
+     * Readable representation for debugging only, not guaranteed not to change
+     */
+    @Override
+    public String toString()
+    {
+      return String.format("From %s %s", fromSeq.getName(),
+              mapping.toString());
+    }
+  }
+
+  private List<SequenceToSequenceMapping> mappings;
 
   /**
    * Constructor
    */
   public AlignedCodonFrame()
   {
+    mappings = new ArrayList<SequenceToSequenceMapping>();
   }
 
   /**
@@ -62,68 +79,75 @@ public class AlignedCodonFrame
    */
   public void addMap(SequenceI dnaseq, SequenceI aaseq, MapList map)
   {
-    int nlen = 1;
-    if (dnaSeqs != null)
-    {
-      nlen = dnaSeqs.length + 1;
-    }
-    SequenceI[] ndna = new SequenceI[nlen];
-    Mapping[] ndtp = new Mapping[nlen];
-    if (dnaSeqs != null)
-    {
-      System.arraycopy(dnaSeqs, 0, ndna, 0, dnaSeqs.length);
-      System.arraycopy(dnaToProt, 0, ndtp, 0, dnaSeqs.length);
-    }
-    dnaSeqs = ndna;
-    dnaToProt = ndtp;
-    nlen--;
-    dnaSeqs[nlen] = (dnaseq.getDatasetSequence() == null) ? dnaseq : dnaseq
-            .getDatasetSequence();
-    Mapping mp = new Mapping(map);
     // JBPNote DEBUG! THIS !
     // dnaseq.transferAnnotation(aaseq, mp);
     // aaseq.transferAnnotation(dnaseq, new Mapping(map.getInverse()));
-    mp.to = (aaseq.getDatasetSequence() == null) ? aaseq : aaseq
+
+    SequenceI fromSeq = (dnaseq.getDatasetSequence() == null) ? dnaseq
+            : dnaseq.getDatasetSequence();
+    SequenceI toSeq = (aaseq.getDatasetSequence() == null) ? aaseq : aaseq
             .getDatasetSequence();
-    dnaToProt[nlen] = mp;
+
+    /*
+     * if we already hold a mapping between these sequences, just add to it 
+     */
+    for (SequenceToSequenceMapping ssm : mappings)
+    {
+      if (ssm.fromSeq == fromSeq && ssm.mapping.to == toSeq)
+      {
+        ssm.mapping.map.addMapList(map);
+        return;
+      }
+    }
+
+    /*
+     * otherwise, add a new sequence mapping
+     */
+    Mapping mp = new Mapping(toSeq, map);
+    mappings.add(new SequenceToSequenceMapping(fromSeq, mp));
   }
 
   public SequenceI[] getdnaSeqs()
   {
-    return dnaSeqs;
+    // TODO return a list instead?
+    // return dnaSeqs;
+    List<SequenceI> seqs = new ArrayList<SequenceI>();
+    for (SequenceToSequenceMapping ssm : mappings)
+    {
+      seqs.add(ssm.fromSeq);
+    }
+    return seqs.toArray(new SequenceI[seqs.size()]);
   }
 
   public SequenceI[] getAaSeqs()
   {
-    if (dnaToProt == null)
-    {
-      return null;
-    }
-    SequenceI[] sqs = new SequenceI[dnaToProt.length];
-    for (int sz = 0; sz < dnaToProt.length; sz++)
+    // TODO not used - remove?
+    List<SequenceI> seqs = new ArrayList<SequenceI>();
+    for (SequenceToSequenceMapping ssm : mappings)
     {
-      sqs[sz] = dnaToProt[sz].to;
+      seqs.add(ssm.mapping.to);
     }
-    return sqs;
+    return seqs.toArray(new SequenceI[seqs.size()]);
   }
 
   public MapList[] getdnaToProt()
   {
-    if (dnaToProt == null)
+    List<MapList> maps = new ArrayList<MapList>();
+    for (SequenceToSequenceMapping ssm : mappings)
     {
-      return null;
-    }
-    MapList[] sqs = new MapList[dnaToProt.length];
-    for (int sz = 0; sz < dnaToProt.length; sz++)
-    {
-      sqs[sz] = dnaToProt[sz].map;
+      maps.add(ssm.mapping.map);
     }
-    return sqs;
+    return maps.toArray(new MapList[maps.size()]);
   }
 
   public Mapping[] getProtMappings()
   {
-    return dnaToProt;
+    List<Mapping> maps = new ArrayList<Mapping>();
+    for (SequenceToSequenceMapping ssm : mappings)
+    {
+      maps.add(ssm.mapping);
+    }
+    return maps.toArray(new Mapping[maps.size()]);
   }
 
   /**
@@ -135,18 +159,14 @@ public class AlignedCodonFrame
    */
   public Mapping getMappingForSequence(SequenceI seq)
   {
-    if (dnaSeqs == null)
-    {
-      return null;
-    }
     SequenceI seqDs = seq.getDatasetSequence();
     seqDs = seqDs != null ? seqDs : seq;
 
-    for (int ds = 0; ds < dnaSeqs.length; ds++)
+    for (SequenceToSequenceMapping ssm : mappings)
     {
-      if (dnaSeqs[ds] == seqDs || dnaToProt[ds].to == seqDs)
+      if (ssm.fromSeq == seqDs || ssm.mapping.to == seqDs)
       {
-        return dnaToProt[ds];
+        return ssm.mapping;
       }
     }
     return null;
@@ -161,16 +181,12 @@ public class AlignedCodonFrame
    */
   public SequenceI getAaForDnaSeq(SequenceI dnaSeqRef)
   {
-    if (dnaSeqs == null)
-    {
-      return null;
-    }
     SequenceI dnads = dnaSeqRef.getDatasetSequence();
-    for (int ds = 0; ds < dnaSeqs.length; ds++)
+    for (SequenceToSequenceMapping ssm : mappings)
     {
-      if (dnaSeqs[ds] == dnaSeqRef || dnaSeqs[ds] == dnads)
+      if (ssm.fromSeq == dnaSeqRef || ssm.fromSeq == dnads)
       {
-        return dnaToProt[ds].to;
+        return ssm.mapping.to;
       }
     }
     return null;
@@ -183,16 +199,12 @@ public class AlignedCodonFrame
    */
   public SequenceI getDnaForAaSeq(SequenceI aaSeqRef)
   {
-    if (dnaToProt == null)
-    {
-      return null;
-    }
     SequenceI aads = aaSeqRef.getDatasetSequence();
-    for (int as = 0; as < dnaToProt.length; as++)
+    for (SequenceToSequenceMapping ssm : mappings)
     {
-      if (dnaToProt[as].to == aaSeqRef || dnaToProt[as].to == aads)
+      if (ssm.mapping.to == aaSeqRef || ssm.mapping.to == aads)
       {
-        return dnaSeqs[as];
+        return ssm.fromSeq;
       }
     }
     return null;
@@ -224,36 +236,30 @@ public class AlignedCodonFrame
   public void markMappedRegion(SequenceI seq, int index,
           SearchResults results)
   {
-    if (dnaToProt == null)
-    {
-      return;
-    }
     int[] codon;
     SequenceI ds = seq.getDatasetSequence();
-    for (int mi = 0; mi < dnaToProt.length; mi++)
+    for (SequenceToSequenceMapping ssm : mappings)
     {
-      if (dnaSeqs[mi] == seq || dnaSeqs[mi] == ds)
+      if (ssm.fromSeq == seq || ssm.fromSeq == ds)
       {
-        // DEBUG System.err.println("dna pos "+index);
-        codon = dnaToProt[mi].map.locateInTo(index, index);
+        codon = ssm.mapping.map.locateInTo(index, index);
         if (codon != null)
         {
           for (int i = 0; i < codon.length; i += 2)
           {
-            results.addResult(dnaToProt[mi].to, codon[i], codon[i + 1]);
+            results.addResult(ssm.mapping.to, codon[i], codon[i + 1]);
           }
         }
       }
-      else if (dnaToProt[mi].to == seq || dnaToProt[mi].to == ds)
+      else if (ssm.mapping.to == seq || ssm.mapping.to == ds)
       {
-        // DEBUG System.err.println("aa pos "+index);
         {
-          codon = dnaToProt[mi].map.locateInFrom(index, index);
+          codon = ssm.mapping.map.locateInFrom(index, index);
           if (codon != null)
           {
             for (int i = 0; i < codon.length; i += 2)
             {
-              results.addResult(dnaSeqs[mi], codon[i], codon[i + 1]);
+              results.addResult(ssm.fromSeq, codon[i], codon[i + 1]);
             }
           }
         }
@@ -282,20 +288,23 @@ public class AlignedCodonFrame
      * Adapted from markMappedRegion().
      */
     MapList ml = null;
-    for (int i = 0; i < dnaToProt.length; i++)
+    int i = 0;
+    for (SequenceToSequenceMapping ssm : mappings)
     {
-      if (dnaSeqs[i] == seq)
+      if (ssm.fromSeq == seq)
       {
         ml = getdnaToProt()[i];
         break;
       }
+      i++;
     }
     return ml == null ? null : ml.locateInFrom(aaPos, aaPos);
   }
 
   /**
    * Convenience method to return the first aligned sequence in the given
-   * alignment whose dataset has a mapping with the given dataset sequence.
+   * alignment whose dataset has a mapping with the given (aligned or dataset)
+   * sequence.
    * 
    * @param seq
    * 
@@ -307,18 +316,16 @@ public class AlignedCodonFrame
     /*
      * Search mapped protein ('to') sequences first.
      */
-    if (this.dnaToProt != null)
+    for (SequenceToSequenceMapping ssm : mappings)
     {
-      for (int i = 0; i < dnaToProt.length; i++)
+      if (ssm.fromSeq == seq || ssm.fromSeq == seq.getDatasetSequence())
       {
-        if (this.dnaSeqs[i] == seq)
+        for (SequenceI sourceAligned : al.getSequences())
         {
-          for (SequenceI sourceAligned : al.getSequences())
+          if (ssm.mapping.to == sourceAligned.getDatasetSequence()
+                  || ssm.mapping.to == sourceAligned)
           {
-            if (this.dnaToProt[i].to == sourceAligned.getDatasetSequence())
-            {
-              return sourceAligned;
-            }
+            return sourceAligned;
           }
         }
       }
@@ -327,18 +334,16 @@ public class AlignedCodonFrame
     /*
      * Then try mapped dna sequences.
      */
-    if (this.dnaToProt != null)
+    for (SequenceToSequenceMapping ssm : mappings)
     {
-      for (int i = 0; i < dnaToProt.length; i++)
+      if (ssm.mapping.to == seq
+              || ssm.mapping.to == seq.getDatasetSequence())
       {
-        if (this.dnaToProt[i].to == seq)
+        for (SequenceI sourceAligned : al.getSequences())
         {
-          for (SequenceI sourceAligned : al.getSequences())
+          if (ssm.fromSeq == sourceAligned.getDatasetSequence())
           {
-            if (this.dnaSeqs[i] == sourceAligned.getDatasetSequence())
-            {
-              return sourceAligned;
-            }
+            return sourceAligned;
           }
         }
       }
@@ -348,31 +353,45 @@ public class AlignedCodonFrame
   }
 
   /**
-   * Returns the region in the 'mappedFrom' sequence's dataset that is mapped to
-   * position 'pos' (base 1) in the 'mappedTo' sequence's dataset. The region is
-   * a set of start/end position pairs.
+   * Returns the region in the target sequence's dataset that is mapped to the
+   * given position (base 1) in the query sequence's dataset. The region is a
+   * set of start/end position pairs.
    * 
-   * @param mappedFrom
-   * @param mappedTo
-   * @param pos
+   * @param target
+   * @param query
+   * @param queryPos
    * @return
    */
-  public int[] getMappedRegion(SequenceI mappedFrom, SequenceI mappedTo,
-          int pos)
+  public int[] getMappedRegion(SequenceI target, SequenceI query,
+          int queryPos)
   {
-    SequenceI targetDs = mappedFrom.getDatasetSequence() == null ? mappedFrom
-            : mappedFrom.getDatasetSequence();
-    SequenceI sourceDs = mappedTo.getDatasetSequence() == null ? mappedTo
-            : mappedTo.getDatasetSequence();
-    if (targetDs == null || sourceDs == null || dnaToProt == null)
+    SequenceI targetDs = target.getDatasetSequence() == null ? target
+            : target.getDatasetSequence();
+    SequenceI queryDs = query.getDatasetSequence() == null ? query : query
+            .getDatasetSequence();
+    if (targetDs == null || queryDs == null /*|| dnaToProt == null*/)
     {
       return null;
     }
-    for (int mi = 0; mi < dnaToProt.length; mi++)
+    for (SequenceToSequenceMapping ssm : mappings)
     {
-      if (dnaSeqs[mi] == targetDs && dnaToProt[mi].to == sourceDs)
+      /*
+       * try mapping from target to query
+       */
+      if (ssm.fromSeq == targetDs && ssm.mapping.to == queryDs)
       {
-        int[] codon = dnaToProt[mi].map.locateInFrom(pos, pos);
+        int[] codon = ssm.mapping.map.locateInFrom(queryPos, queryPos);
+        if (codon != null)
+        {
+          return codon;
+        }
+      }
+      /*
+       * else try mapping from query to target
+       */
+      else if (ssm.fromSeq == queryDs && ssm.mapping.to == targetDs)
+      {
+        int[] codon = ssm.mapping.map.locateInTo(queryPos, queryPos);
         if (codon != null)
         {
           return codon;
@@ -383,8 +402,10 @@ public class AlignedCodonFrame
   }
 
   /**
-   * Returns the DNA codon for the given position (base 1) in a mapped protein
-   * sequence, or null if no mapping is found.
+   * Returns the mapped DNA codons for the given position in a protein sequence,
+   * or null if no mapping is found. Returns a list of (e.g.) ['g', 'c', 't']
+   * codons. There may be more than one codon mapped to the protein if (for
+   * example), there are mappings to cDNA variants.
    * 
    * @param protein
    *          the peptide dataset sequence
@@ -392,65 +413,56 @@ public class AlignedCodonFrame
    *          residue position (base 1) in the peptide sequence
    * @return
    */
-  public char[] getMappedCodon(SequenceI protein, int aaPos)
+  public List<char[]> getMappedCodons(SequenceI protein, int aaPos)
   {
-    if (dnaToProt == null)
-    {
-      return null;
-    }
     MapList ml = null;
     SequenceI dnaSeq = null;
-    for (int i = 0; i < dnaToProt.length; i++)
+    List<char[]> result = new ArrayList<char[]>();
+
+    for (SequenceToSequenceMapping ssm : mappings)
     {
-      if (dnaToProt[i].to == protein)
+      if (ssm.mapping.to == protein)
       {
-        ml = getdnaToProt()[i];
-        dnaSeq = dnaSeqs[i];
-        break;
+        ml = ssm.mapping.map;
+        dnaSeq = ssm.fromSeq;
+
+        int[] codonPos = ml.locateInFrom(aaPos, aaPos);
+        if (codonPos == null)
+        {
+          return null;
+        }
+
+        /*
+         * Read off the mapped nucleotides (converting to position base 0)
+         */
+        codonPos = MappingUtils.flattenRanges(codonPos);
+        char[] dna = dnaSeq.getSequence();
+        int start = dnaSeq.getStart();
+        result.add(new char[] { dna[codonPos[0] - start],
+            dna[codonPos[1] - start], dna[codonPos[2] - start] });
       }
     }
-    if (ml == null)
-    {
-      return null;
-    }
-    int[] codonPos = ml.locateInFrom(aaPos, aaPos);
-    if (codonPos == null)
-    {
-      return null;
-    }
-
-    /*
-     * Read off the mapped nucleotides (converting to position base 0)
-     */
-    codonPos = MappingUtils.flattenRanges(codonPos);
-    char[] dna = dnaSeq.getSequence();
-    int start = dnaSeq.getStart();
-    return new char[] { dna[codonPos[0] - start], dna[codonPos[1] - start],
-        dna[codonPos[2] - start] };
+    return result.isEmpty() ? null : result;
   }
 
   /**
-   * Returns any mappings found which are to (or from) the given sequence, and
-   * to distinct sequences.
+   * Returns any mappings found which are from the given sequence, and to
+   * distinct sequences.
    * 
    * @param seq
    * @return
    */
-  public List<Mapping> getMappingsForSequence(SequenceI seq)
+  public List<Mapping> getMappingsFromSequence(SequenceI seq)
   {
     List<Mapping> result = new ArrayList<Mapping>();
-    if (dnaSeqs == null)
-    {
-      return result;
-    }
     List<SequenceI> related = new ArrayList<SequenceI>();
     SequenceI seqDs = seq.getDatasetSequence();
     seqDs = seqDs != null ? seqDs : seq;
 
-    for (int ds = 0; ds < dnaSeqs.length; ds++)
+    for (SequenceToSequenceMapping ssm : mappings)
     {
-      final Mapping mapping = dnaToProt[ds];
-      if (dnaSeqs[ds] == seqDs || mapping.to == seqDs)
+      final Mapping mapping = ssm.mapping;
+      if (ssm.fromSeq == seqDs)
       {
         if (!related.contains(mapping.to))
         {
@@ -461,4 +473,205 @@ public class AlignedCodonFrame
     }
     return result;
   }
+
+  /**
+   * Test whether the given sequence is substitutable for one or more dummy
+   * sequences in this mapping
+   * 
+   * @param map
+   * @param seq
+   * @return
+   */
+  public boolean isRealisableWith(SequenceI seq)
+  {
+    return realiseWith(seq, false) > 0;
+  }
+
+  /**
+   * Replace any matchable mapped dummy sequences with the given real one.
+   * Returns the count of sequence mappings instantiated.
+   * 
+   * @param seq
+   * @return
+   */
+  public int realiseWith(SequenceI seq)
+  {
+    return realiseWith(seq, true);
+  }
+
+  /**
+   * Returns the number of mapped dummy sequences that could be replaced with
+   * the given real sequence.
+   * 
+   * @param seq
+   *          a dataset sequence
+   * @param doUpdate
+   *          if true, performs replacements, else only counts
+   * @return
+   */
+  protected int realiseWith(SequenceI seq, boolean doUpdate)
+  {
+    SequenceI ds = seq.getDatasetSequence() != null ? seq
+            .getDatasetSequence() : seq;
+    int count = 0;
+
+    /*
+     * check for replaceable DNA ('map from') sequences
+     */
+    for (SequenceToSequenceMapping ssm : mappings)
+    {
+      SequenceI dna = ssm.fromSeq;
+      if (dna instanceof SequenceDummy
+              && dna.getName().equals(ds.getName()))
+      {
+        Mapping mapping = ssm.mapping;
+        int mapStart = mapping.getMap().getFromLowest();
+        int mapEnd = mapping.getMap().getFromHighest();
+        boolean mappable = couldRealiseSequence(dna, ds, mapStart, mapEnd);
+        if (mappable)
+        {
+          count++;
+          if (doUpdate)
+          {
+            // TODO: new method ? ds.realise(dna);
+            // might want to copy database refs as well
+            ds.setSequenceFeatures(dna.getSequenceFeatures());
+            // dnaSeqs[i] = ds;
+            ssm.fromSeq = ds;
+            System.out.println("Realised mapped sequence " + ds.getName());
+          }
+        }
+      }
+
+      /*
+       * check for replaceable protein ('map to') sequences
+       */
+      Mapping mapping = ssm.mapping;
+      SequenceI prot = mapping.getTo();
+      int mapStart = mapping.getMap().getToLowest();
+      int mapEnd = mapping.getMap().getToHighest();
+      boolean mappable = couldRealiseSequence(prot, ds, mapStart, mapEnd);
+      if (mappable)
+      {
+        count++;
+        if (doUpdate)
+        {
+          // TODO: new method ? ds.realise(dna);
+          // might want to copy database refs as well
+          ds.setSequenceFeatures(dna.getSequenceFeatures());
+          ssm.mapping.setTo(ds);
+        }
+      }
+    }
+    return count;
+  }
+
+  /**
+   * Helper method to test whether a 'real' sequence could replace a 'dummy'
+   * sequence in the map. The criteria are that they have the same name, and
+   * that the mapped region overlaps the candidate sequence.
+   * 
+   * @param existing
+   * @param replacement
+   * @param mapStart
+   * @param mapEnd
+   * @return
+   */
+  protected static boolean couldRealiseSequence(SequenceI existing,
+          SequenceI replacement, int mapStart, int mapEnd)
+  {
+    if (existing instanceof SequenceDummy
+            && !(replacement instanceof SequenceDummy)
+            && existing.getName().equals(replacement.getName()))
+    {
+      int start = replacement.getStart();
+      int end = replacement.getEnd();
+      boolean mappingOverlapsSequence = (mapStart >= start && mapStart <= end)
+              || (mapEnd >= start && mapEnd <= end);
+      if (mappingOverlapsSequence)
+      {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Change any mapping to the given sequence to be to its dataset sequence
+   * instead. For use when mappings are created before their referenced
+   * sequences are instantiated, for example when parsing GFF data.
+   * 
+   * @param seq
+   */
+  public void updateToDataset(SequenceI seq)
+  {
+    if (seq == null || seq.getDatasetSequence() == null)
+    {
+      return;
+    }
+    SequenceI ds = seq.getDatasetSequence();
+
+    for (SequenceToSequenceMapping ssm : mappings)
+    /*
+     * 'from' sequences
+     */
+    {
+      if (ssm.fromSeq == seq)
+      {
+        ssm.fromSeq = ds;
+      }
+
+      /*
+       * 'to' sequences
+       */
+      if (ssm.mapping.to == seq)
+      {
+        ssm.mapping.to = ds;
+      }
+    }
+  }
+
+  /**
+   * Answers true if this object contains no mappings
+   * 
+   * @return
+   */
+  public boolean isEmpty()
+  {
+    return mappings.isEmpty();
+  }
+
+  /**
+   * Method for debug / inspection purposes only, may change in future
+   */
+  @Override
+  public String toString()
+  {
+    return mappings == null ? "null" : mappings.toString();
+  }
+
+  /**
+   * Returns the first mapping found that is from 'fromSeq' to 'toSeq', or null
+   * if none found
+   * 
+   * @param fromSeq
+   *          aligned or dataset sequence
+   * @param toSeq
+   *          aligned or dataset sequence
+   * @return
+   */
+  public Mapping getMappingBetween(SequenceI fromSeq, SequenceI toSeq)
+  {
+    for (SequenceToSequenceMapping mapping : mappings)
+    {
+      SequenceI from = mapping.fromSeq;
+      SequenceI to = mapping.mapping.to;
+      if ((from == fromSeq || from == fromSeq.getDatasetSequence())
+              && (to == toSeq || to == toSeq.getDatasetSequence()))
+      {
+        return mapping.mapping;
+      }
+    }
+    return null;
+  }
 }
index 7ea9985..a9b0d53 100755 (executable)
@@ -22,13 +22,14 @@ package jalview.datamodel;
 
 import jalview.analysis.AlignmentUtils;
 import jalview.io.FastaFile;
+import jalview.util.Comparison;
 import jalview.util.MessageManager;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.Enumeration;
 import java.util.HashSet;
 import java.util.Hashtable;
-import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -47,8 +48,7 @@ public class Alignment implements AlignmentI
 
   protected List<SequenceI> sequences;
 
-  protected List<SequenceGroup> groups = java.util.Collections
-          .synchronizedList(new ArrayList<SequenceGroup>());
+  protected List<SequenceGroup> groups;
 
   protected char gapCharacter = '-';
 
@@ -60,20 +60,21 @@ public class Alignment implements AlignmentI
 
   public boolean hasRNAStructure = false;
 
-  /** DOCUMENT ME!! */
   public AlignmentAnnotation[] annotations;
 
-  HiddenSequences hiddenSequences = new HiddenSequences(this);
+  HiddenSequences hiddenSequences;
 
   public Hashtable alignmentProperties;
 
-  private Set<AlignedCodonFrame> codonFrameList = new LinkedHashSet<AlignedCodonFrame>();
+  private List<AlignedCodonFrame> codonFrameList;
 
   private void initAlignment(SequenceI[] seqs)
   {
-    int i = 0;
+    groups = Collections.synchronizedList(new ArrayList<SequenceGroup>());
+    hiddenSequences = new HiddenSequences(this);
+    codonFrameList = new ArrayList<AlignedCodonFrame>();
 
-    if (jalview.util.Comparison.isNucleotide(seqs))
+    if (Comparison.isNucleotide(seqs))
     {
       type = NUCLEOTIDE;
     }
@@ -82,10 +83,9 @@ public class Alignment implements AlignmentI
       type = PROTEIN;
     }
 
-    sequences = java.util.Collections
-            .synchronizedList(new ArrayList<SequenceI>());
+    sequences = Collections.synchronizedList(new ArrayList<SequenceI>());
 
-    for (i = 0; i < seqs.length; i++)
+    for (int i = 0; i < seqs.length; i++)
     {
       sequences.add(seqs[i]);
     }
@@ -104,13 +104,12 @@ public class Alignment implements AlignmentI
       seqs[i] = new Sequence(seqs[i]);
     }
 
+    initAlignment(seqs);
+
     /*
-     * Share the same dataset sequence mappings (if any). TODO: find a better
-     * place for these to live (alignment dataset?).
+     * Share the same dataset sequence mappings (if any). 
      */
-    this.codonFrameList = ((Alignment) al).codonFrameList;
-
-    initAlignment(seqs);
+    this.setCodonFrames(al.getCodonFrames());
   }
 
   /**
@@ -991,25 +990,7 @@ public class Alignment implements AlignmentI
   {
     if (dataset == null && data == null)
     {
-      // Create a new dataset for this alignment.
-      // Can only be done once, if dataset is not null
-      // This will not be performed
-      SequenceI[] seqs = new SequenceI[getHeight()];
-      SequenceI currentSeq;
-      for (int i = 0; i < getHeight(); i++)
-      {
-        currentSeq = getSequenceAt(i);
-        if (currentSeq.getDatasetSequence() != null)
-        {
-          seqs[i] = currentSeq.getDatasetSequence();
-        }
-        else
-        {
-          seqs[i] = currentSeq.createDatasetSequence();
-        }
-      }
-
-      dataset = new Alignment(seqs);
+      createDatasetAlignment();
     }
     else if (dataset == null && data != null)
     {
@@ -1040,6 +1021,37 @@ public class Alignment implements AlignmentI
   }
 
   /**
+   * Creates a new dataset for this alignment. Can only be done once - if
+   * dataset is not null this will not be performed.
+   */
+  public void createDatasetAlignment()
+  {
+    if (dataset != null)
+    {
+      return;
+    }
+    SequenceI[] seqs = new SequenceI[getHeight()];
+    SequenceI currentSeq;
+    for (int i = 0; i < getHeight(); i++)
+    {
+      currentSeq = getSequenceAt(i);
+      if (currentSeq.getDatasetSequence() != null)
+      {
+        seqs[i] = currentSeq.getDatasetSequence();
+      }
+      else
+      {
+        seqs[i] = currentSeq.createDatasetSequence();
+      }
+    }
+
+    dataset = new Alignment(seqs);
+    // move mappings to the dataset alignment
+    dataset.codonFrameList = this.codonFrameList;
+    this.codonFrameList = null;
+  }
+
+  /**
    * reference count for number of alignments referencing this one.
    */
   int alignmentRefs = 0;
@@ -1261,19 +1273,17 @@ public class Alignment implements AlignmentI
     return alignmentProperties;
   }
 
-  /*
-   * (non-Javadoc)
-   * 
-   * @see
-   * jalview.datamodel.AlignmentI#addCodonFrame(jalview.datamodel.AlignedCodonFrame
-   * )
+  /**
+   * Adds the given mapping to the stored set. Note this may be held on the
+   * dataset alignment.
    */
   @Override
   public void addCodonFrame(AlignedCodonFrame codons)
   {
-    if (codons != null)
+    List<AlignedCodonFrame> acfs = getCodonFrames();
+    if (codons != null && acfs != null && !acfs.contains(codons))
     {
-      codonFrameList.add(codons);
+      acfs.add(codons);
     }
   }
 
@@ -1291,7 +1301,7 @@ public class Alignment implements AlignmentI
       return null;
     }
     List<AlignedCodonFrame> cframes = new ArrayList<AlignedCodonFrame>();
-    for (AlignedCodonFrame acf : codonFrameList)
+    for (AlignedCodonFrame acf : getCodonFrames())
     {
       if (acf.involvesSequence(seq))
       {
@@ -1302,42 +1312,50 @@ public class Alignment implements AlignmentI
   }
 
   /**
-   * Sets the codon frame mappings (replacing any existing mappings).
+   * Sets the codon frame mappings (replacing any existing mappings). Note the
+   * mappings are set on the dataset alignment instead if there is one.
    * 
    * @see jalview.datamodel.AlignmentI#setCodonFrames()
    */
   @Override
-  public void setCodonFrames(Set<AlignedCodonFrame> acfs)
+  public void setCodonFrames(List<AlignedCodonFrame> acfs)
   {
-    this.codonFrameList = acfs;
+    if (dataset != null)
+    {
+      dataset.setCodonFrames(acfs);
+    }
+    else
+    {
+      this.codonFrameList = acfs;
+    }
   }
 
   /**
    * Returns the set of codon frame mappings. Any changes to the returned set
-   * will affect the alignment.
+   * will affect the alignment. The mappings are held on (and read from) the
+   * dataset alignment if there is one.
    * 
    * @see jalview.datamodel.AlignmentI#getCodonFrames()
    */
   @Override
-  public Set<AlignedCodonFrame> getCodonFrames()
+  public List<AlignedCodonFrame> getCodonFrames()
   {
-    return codonFrameList;
+    return dataset != null ? dataset.getCodonFrames() : codonFrameList;
   }
 
-  /*
-   * (non-Javadoc)
-   * 
-   * @seejalview.datamodel.AlignmentI#removeCodonFrame(jalview.datamodel.
-   * AlignedCodonFrame)
+  /**
+   * Removes the given mapping from the stored set. Note that the mappings are
+   * held on the dataset alignment if there is one.
    */
   @Override
   public boolean removeCodonFrame(AlignedCodonFrame codons)
   {
-    if (codons == null || codonFrameList == null)
+    List<AlignedCodonFrame> acfs = getCodonFrames();
+    if (codons == null || acfs == null)
     {
       return false;
     }
-    return codonFrameList.remove(codons);
+    return acfs.remove(codons);
   }
 
   @Override
@@ -1383,7 +1401,7 @@ public class Alignment implements AlignmentI
       addAnnotation(alan[a]);
     }
 
-    this.codonFrameList.addAll(toappend.getCodonFrames());
+    getCodonFrames().addAll(toappend.getCodonFrames());
 
     List<SequenceGroup> sg = toappend.getGroups();
     if (sg != null)
@@ -1595,6 +1613,7 @@ public class Alignment implements AlignmentI
    * 
    * @return the representative sequence for this group
    */
+  @Override
   public SequenceI getSeqrep()
   {
     return seqrep;
@@ -1607,6 +1626,7 @@ public class Alignment implements AlignmentI
    * @param seqrep
    *          the seqrep to set (null means no sequence representative)
    */
+  @Override
   public void setSeqrep(SequenceI seqrep)
   {
     this.seqrep = seqrep;
@@ -1616,6 +1636,7 @@ public class Alignment implements AlignmentI
    * 
    * @return true if group has a sequence representative
    */
+  @Override
   public boolean hasSeqrep()
   {
     return seqrep != null;
@@ -1683,31 +1704,13 @@ public class Alignment implements AlignmentI
           boolean preserveUnmappedGaps)
   {
     // TODO should this method signature be the one in the interface?
-    int count = 0;
     boolean thisIsNucleotide = this.isNucleotide();
     boolean thatIsProtein = !al.isNucleotide();
     if (!thatIsProtein && !thisIsNucleotide)
     {
       return AlignmentUtils.alignProteinAsDna(this, al);
     }
-
-    char thisGapChar = this.getGapCharacter();
-    String gap = thisIsNucleotide && thatIsProtein ? String
-            .valueOf(new char[] { thisGapChar, thisGapChar, thisGapChar })
-            : String.valueOf(thisGapChar);
-
-    // TODO handle intron regions? Needs a 'holistic' alignment of dna,
-    // not just sequence by sequence. But how to 'gap' intron regions?
-
-    /*
-     * Get mappings from 'that' alignment's sequences to this.
-     */
-    for (SequenceI alignTo : getSequences())
-    {
-      count += AlignmentUtils.alignSequenceAs(alignTo, al, gap,
-              preserveMappedGaps, preserveUnmappedGaps) ? 1 : 0;
-    }
-    return count;
+    return AlignmentUtils.alignAs(this, al);
   }
 
   /**
@@ -1748,4 +1751,82 @@ public class Alignment implements AlignmentI
     }
     return hasValidSeq;
   }
+
+  /**
+   * Update any mappings to 'virtual' sequences to compatible real ones, if
+   * present in the added sequences. Returns a count of mappings updated.
+   * 
+   * @param seqs
+   * @return
+   */
+  @Override
+  public int realiseMappings(List<SequenceI> seqs)
+  {
+    int count = 0;
+    for (SequenceI seq : seqs)
+    {
+      for (AlignedCodonFrame mapping : getCodonFrames())
+      {
+        count += mapping.realiseWith(seq);
+      }
+    }
+    return count;
+  }
+
+  /**
+   * Returns the first AlignedCodonFrame that has a mapping between the given
+   * dataset sequences
+   * 
+   * @param mapFrom
+   * @param mapTo
+   * @return
+   */
+  @Override
+  public AlignedCodonFrame getMapping(SequenceI mapFrom, SequenceI mapTo)
+  {
+    for (AlignedCodonFrame acf : getCodonFrames())
+    {
+      if (acf.getAaForDnaSeq(mapFrom) == mapTo)
+      {
+        return acf;
+      }
+    }
+    return null;
+  }
+
+  @Override
+  public int[] getVisibleStartAndEndIndex(List<int[]> hiddenCols)
+  {
+    int[] alignmentStartEnd = new int[] { 0, getWidth() - 1 };
+    int startPos = alignmentStartEnd[0];
+    int endPos = alignmentStartEnd[1];
+
+    int[] lowestRange = new int[] { -1, -1 };
+    int[] higestRange = new int[] { -1, -1 };
+
+    for (int[] hiddenCol : hiddenCols)
+    {
+      lowestRange = (hiddenCol[0] <= startPos) ? hiddenCol : lowestRange;
+      higestRange = (hiddenCol[1] >= endPos) ? hiddenCol : higestRange;
+    }
+
+    if (lowestRange[0] == -1 && lowestRange[1] == -1)
+    {
+      startPos = alignmentStartEnd[0];
+    }
+    else
+    {
+      startPos = lowestRange[1] + 1;
+    }
+
+    if (higestRange[0] == -1 && higestRange[1] == -1)
+    {
+      endPos = alignmentStartEnd[1];
+    }
+    else
+    {
+      endPos = higestRange[0] - 1;
+    }
+    return new int[] { startPos, endPos };
+  }
 }
index de79488..76d1a48 100755 (executable)
@@ -375,12 +375,12 @@ public interface AlignmentI extends AnnotatedCollectionI
    * 
    * @return
    */
-  Set<AlignedCodonFrame> getCodonFrames();
+  List<AlignedCodonFrame> getCodonFrames();
 
   /**
-   * Set the codon frame mappings (replacing any existing set).
+   * Set the codon frame mappings (replacing any existing list).
    */
-  void setCodonFrames(Set<AlignedCodonFrame> acfs);
+  void setCodonFrames(List<AlignedCodonFrame> acfs);
 
   /**
    * get codon frames involving sequenceI
@@ -524,4 +524,32 @@ public interface AlignmentI extends AnnotatedCollectionI
    * @return
    */
   public boolean hasValidSequence();
+
+  /**
+   * Update any mappings to 'virtual' sequences to compatible real ones, if
+   * present in the added sequences. Returns a count of mappings updated.
+   * 
+   * @param seqs
+   * @return
+   */
+  int realiseMappings(List<SequenceI> seqs);
+
+  /**
+   * Returns the first AlignedCodonFrame that has a mapping between the given
+   * dataset sequences
+   * 
+   * @param mapFrom
+   * @param mapTo
+   * @return
+   */
+  AlignedCodonFrame getMapping(SequenceI mapFrom, SequenceI mapTo);
+
+  /**
+   * Calculate the visible start and end index of an alignment. The result is
+   * returned an int array where: int[0] = startIndex, and int[1] = endIndex.
+   * 
+   * @param hiddenCols
+   * @return
+   */
+  public int[] getVisibleStartAndEndIndex(List<int[]> hiddenCols);
 }
index 6fb584c..6fd76b2 100644 (file)
  */
 package jalview.datamodel;
 
+import jalview.util.Comparison;
 import jalview.util.ShiftList;
 import jalview.viewmodel.annotationfilter.AnnotationFilterParameter;
 import jalview.viewmodel.annotationfilter.AnnotationFilterParameter.SearchableAnnotationField;
 
 import java.util.ArrayList;
+import java.util.BitSet;
 import java.util.Collections;
 import java.util.List;
 import java.util.Vector;
@@ -34,10 +36,178 @@ import java.util.Vector;
  */
 public class ColumnSelection
 {
-  /*
-   * list of selected columns (not ordered)
-   */
-  Vector<Integer> selected = new Vector<Integer>();
+  private class IntList
+  {
+    /*
+     * list of selected columns (ordered by selection order, not column order)
+     */
+    private List<Integer> order = new ArrayList<Integer>();
+
+    /**
+     * bitfield for column selection - allows quick lookup
+     */
+    private BitSet selected = new BitSet();
+
+    /**
+     * adds a new column i to the selection - only if i is not already selected
+     * 
+     * @param i
+     */
+    public void add(int i)
+    {
+      if (!selected.get(i))
+      {
+        order.add(Integer.valueOf(i));
+        selected.set(i);
+      }
+    }
+
+    public void clear()
+    {
+      order.clear();
+      selected.clear();
+    }
+
+    public void remove(int col)
+    {
+
+      Integer colInt = new Integer(col);
+
+      if (selected.get(col))
+      {
+        // if this ever changes to List.remove(), ensure Integer not int
+        // argument
+        // as List.remove(int i) removes the i'th item which is wrong
+        order.remove(colInt);
+        selected.clear(col);
+      }
+    }
+
+    public boolean contains(Integer colInt)
+    {
+      return selected.get(colInt);
+    }
+
+    public boolean isEmpty()
+    {
+      return order.isEmpty();
+    }
+
+    public List<Integer> getList()
+    {
+      return order;
+    }
+
+    public int size()
+    {
+      return order.size();
+    }
+
+    /**
+     * gets the column that was selected first, second or i'th
+     * 
+     * @param i
+     * @return
+     */
+    public int elementAt(int i)
+    {
+      return order.get(i);
+    }
+
+    protected boolean pruneColumnList(final List<int[]> shifts)
+    {
+      int s = 0, t = shifts.size();
+      int[] sr = shifts.get(s++);
+      boolean pruned = false;
+      int i = 0, j = order.size();
+      while (i < j && s <= t)
+      {
+        int c = order.get(i++).intValue();
+        if (sr[0] <= c)
+        {
+          if (sr[1] + sr[0] >= c)
+          { // sr[1] -ve means inseriton.
+            order.remove(--i);
+            selected.clear(c);
+            j--;
+          }
+          else
+          {
+            if (s < t)
+            {
+              sr = shifts.get(s);
+            }
+            s++;
+          }
+        }
+      }
+      return pruned;
+    }
+
+    /**
+     * shift every selected column at or above start by change
+     * 
+     * @param start
+     *          - leftmost column to be shifted
+     * @param change
+     *          - delta for shift
+     */
+    public void compensateForEdits(int start, int change)
+    {
+      BitSet mask = new BitSet();
+      for (int i = 0; i < order.size(); i++)
+      {
+        int temp = order.get(i);
+
+        if (temp >= start)
+        {
+          // clear shifted bits and update List of selected columns
+          selected.clear(temp);
+          mask.set(temp - change);
+          order.set(i, new Integer(temp - change));
+        }
+      }
+      // lastly update the bitfield all at once
+      selected.or(mask);
+    }
+
+    public boolean isSelected(int column)
+    {
+      return selected.get(column);
+    }
+
+    public int getMaxColumn()
+    {
+      return selected.length() - 1;
+    }
+
+    public int getMinColumn()
+    {
+      return selected.get(0) ? 0 : selected.nextSetBit(0);
+    }
+
+    /**
+     * @return a series of selection intervals along the range
+     */
+    public List<int[]> getRanges()
+    {
+      List<int[]> rlist = new ArrayList<int[]>();
+      if (selected.isEmpty())
+      {
+        return rlist;
+      }
+      int next = selected.nextSetBit(0), clear = -1;
+      while (next != -1)
+      {
+        clear = selected.nextClearBit(next);
+        rlist.add(new int[] { next, clear - 1 });
+        next = selected.nextSetBit(clear);
+      }
+      return rlist;
+    }
+  }
+
+  IntList selected = new IntList();
 
   /*
    * list of hidden column [start, end] ranges; the list is maintained in
@@ -53,11 +223,7 @@ public class ColumnSelection
    */
   public void addElement(int col)
   {
-    Integer column = new Integer(col);
-    if (!selected.contains(column))
-    {
-      selected.addElement(column);
-    }
+    selected.add(col);
   }
 
   /**
@@ -65,7 +231,7 @@ public class ColumnSelection
    */
   public void clear()
   {
-    selected.removeAllElements();
+    selected.clear();
   }
 
   /**
@@ -76,14 +242,7 @@ public class ColumnSelection
    */
   public void removeElement(int col)
   {
-    Integer colInt = new Integer(col);
-
-    if (selected.contains(colInt))
-    {
-      // if this ever changes to List.remove(), ensure Integer not int argument
-      // as List.remove(int i) removes the i'th item which is wrong
-      selected.removeElement(colInt);
-    }
+    selected.remove(col);
   }
 
   /**
@@ -102,18 +261,28 @@ public class ColumnSelection
       colInt = new Integer(i);
       if (selected.contains(colInt))
       {
-        selected.removeElement(colInt);
+        selected.remove(colInt);
       }
     }
   }
 
   /**
    * Returns a list of selected columns. The list contains no duplicates but is
-   * not necessarily ordered.
+   * not necessarily ordered. It also may include columns hidden from the
+   * current view
    */
   public List<Integer> getSelected()
   {
-    return selected;
+    return selected.getList();
+  }
+
+  /**
+   * @return list of int arrays containing start and end column position for
+   *         runs of selected columns ordered from right to left.
+   */
+  public List<int[]> getSelectedRanges()
+  {
+    return selected.getRanges();
   }
 
   /**
@@ -121,11 +290,11 @@ public class ColumnSelection
    * @param col
    *          index to search for in column selection
    * 
-   * @return true if Integer(col) is in selection.
+   * @return true if col is selected
    */
   public boolean contains(int col)
   {
-    return selected.contains(new Integer(col));
+    return (col > -1) ? selected.isSelected(col) : false;
   }
 
   /**
@@ -143,17 +312,11 @@ public class ColumnSelection
    */
   public int getMax()
   {
-    int max = -1;
-
-    for (int sel : getSelected())
+    if (selected.isEmpty())
     {
-      if (sel > max)
-      {
-        max = sel;
-      }
+      return -1;
     }
-
-    return max;
+    return selected.getMaxColumn();
   }
 
   /**
@@ -163,17 +326,11 @@ public class ColumnSelection
    */
   public int getMin()
   {
-    int min = 1000000000;
-
-    for (int sel : getSelected())
+    if (selected.isEmpty())
     {
-      if (sel < min)
-      {
-        min = sel;
-      }
+      return 1000000000;
     }
-
-    return min;
+    return selected.getMinColumn();
   }
 
   /**
@@ -187,16 +344,7 @@ public class ColumnSelection
   public List<int[]> compensateForEdit(int start, int change)
   {
     List<int[]> deletedHiddenColumns = null;
-    for (int i = 0; i < selected.size(); i++)
-    {
-      int temp = selected.get(i);
-
-      if (temp >= start)
-      {
-        // if this ever changes to List.set(), swap parameter order!!
-        selected.setElementAt(new Integer(temp - change), i);
-      }
-    }
+    selected.compensateForEdits(start, change);
 
     if (hiddenColumns != null)
     {
@@ -245,16 +393,8 @@ public class ColumnSelection
    */
   private void compensateForDelEdits(int start, int change)
   {
-    for (int i = 0; i < selected.size(); i++)
-    {
-      int temp = selected.get(i);
 
-      if (temp >= start)
-      {
-        // if this ever changes to List.set(), must swap parameter order!!!
-        selected.setElementAt(new Integer(temp - change), i);
-      }
-    }
+    selected.compensateForEdits(start, change);
 
     if (hiddenColumns != null)
     {
@@ -409,36 +549,6 @@ public class ColumnSelection
     // operations.
   }
 
-  private boolean pruneColumnList(final List<int[]> shifts,
-          Vector<Integer> list)
-  {
-    int s = 0, t = shifts.size();
-    int[] sr = shifts.get(s++);
-    boolean pruned = false;
-    int i = 0, j = list.size();
-    while (i < j && s <= t)
-    {
-      int c = list.elementAt(i++).intValue();
-      if (sr[0] <= c)
-      {
-        if (sr[1] + sr[0] >= c)
-        { // sr[1] -ve means inseriton.
-          list.removeElementAt(--i);
-          j--;
-        }
-        else
-        {
-          if (s < t)
-          {
-            sr = shifts.get(s);
-          }
-          s++;
-        }
-      }
-    }
-    return pruned;
-  }
-
   /**
    * remove any hiddenColumns or selected columns and shift remaining based on a
    * series of position, range deletions.
@@ -463,7 +573,7 @@ public class ColumnSelection
         }
         if (selected != null && selected.size() > 0)
         {
-          pruneColumnList(shifts, selected);
+          selected.pruneColumnList(shifts);
           if (selected != null && selected.size() == 0)
           {
             selected = null;
@@ -490,7 +600,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)
@@ -544,6 +654,10 @@ public class ColumnSelection
 
   /**
    * Use this method to determine where the next hiddenRegion starts
+   * 
+   * @param hiddenRegion
+   *          index of hidden region (counts from 0)
+   * @return column number in visible view
    */
   public int findHiddenRegionPosition(int hiddenRegion)
   {
@@ -563,7 +677,7 @@ public class ColumnSelection
         gaps += region[1] + 1 - region[0];
         result = region[1] + 1;
         index++;
-      } while (index < hiddenRegion + 1);
+      } while (index <= hiddenRegion);
 
       result -= gaps;
     }
@@ -629,10 +743,13 @@ public class ColumnSelection
 
   public void hideSelectedColumns()
   {
-    while (!selected.isEmpty())
+    synchronized (selected)
     {
-      int column = selected.get(0).intValue();
-      hideColumns(column);
+      for (int[] selregions : selected.getRanges())
+      {
+        hideColumns(selregions[0], selregions[1]);
+      }
+      selected.clear();
     }
 
   }
@@ -692,7 +809,7 @@ public class ColumnSelection
     /*
      * remaining case is that the new range follows everything else
      */
-      hiddenColumns.addElement(new int[] { start, end });
+    hiddenColumns.addElement(new int[] { start, end });
   }
 
   /**
@@ -812,10 +929,10 @@ public class ColumnSelection
     {
       if (copy.selected != null)
       {
-        selected = new Vector<Integer>();
+        selected = new IntList();
         for (int i = 0, j = copy.selected.size(); i < j; i++)
         {
-          selected.addElement(copy.selected.elementAt(i));
+          selected.add(copy.selected.elementAt(i));
         }
       }
       if (copy.hiddenColumns != null)
@@ -963,6 +1080,84 @@ public class ColumnSelection
   }
 
   /**
+   * Locate the first and last position visible for this sequence. if seq isn't
+   * visible then return the position of the left and right of the hidden
+   * boundary region, and the corresponding alignment column indices for the
+   * extent of the sequence
+   * 
+   * @param seq
+   * @return int[] { visible start, visible end, first seqpos, last seqpos,
+   *         alignment index for seq start, alignment index for seq end }
+   */
+  public int[] locateVisibleBoundsOfSequence(SequenceI seq)
+  {
+    int fpos=seq.getStart(),lpos= seq.getEnd();
+    int start = 0;
+    
+    if (hiddenColumns == null || hiddenColumns.size() == 0)
+    {
+      int ifpos = seq.findIndex(fpos) - 1, ilpos = seq.findIndex(lpos) - 1;
+      return new int[] { ifpos, ilpos, fpos, lpos, ifpos, ilpos };
+    }
+
+    // Simply walk along the sequence whilst watching for hidden column
+    // boundaries
+    List<int[]> regions = getHiddenColumns();
+    int spos = fpos, lastvispos = -1, rcount = 0, hideStart = seq
+            .getLength(), hideEnd = -1;
+    int visPrev = 0, visNext = 0, firstP = -1, lastP = -1;
+    boolean foundStart = false;
+    for (int p = 0, pLen = seq.getLength(); spos <= seq.getEnd()
+            && p < pLen; p++)
+    {
+      if (!Comparison.isGap(seq.getCharAt(p)))
+      {
+        // keep track of first/last column
+        // containing sequence data regardless of visibility
+        if (firstP == -1)
+        {
+          firstP = p;
+        }
+        lastP = p;
+        // update hidden region start/end
+        while (hideEnd < p && rcount < regions.size())
+        {
+          int[] region = regions.get(rcount++);
+          visPrev = visNext;
+          visNext += region[0] - visPrev;
+          hideStart = region[0];
+          hideEnd = region[1];
+        }
+        if (hideEnd < p)
+        {
+          hideStart = seq.getLength();
+        }
+        // update visible boundary for sequence
+        if (p < hideStart)
+        {
+          if (!foundStart)
+          {
+            fpos = spos;
+            start = p;
+            foundStart = true;
+          }
+          lastvispos = p;
+          lpos = spos;
+        }
+        // look for next sequence position
+        spos++;
+      }
+    }
+    if (foundStart)
+    {
+      return new int[] { findColumnPosition(start),
+          findColumnPosition(lastvispos), fpos, lpos, firstP, lastP };
+    }
+    // otherwise, sequence was completely hidden
+    return new int[] { visPrev, visNext, 0, 0, firstP, lastP };
+  }
+
+  /**
    * delete any columns in alignmentAnnotation that are hidden (including
    * sequence associated annotation).
    * 
@@ -1112,10 +1307,7 @@ public class ColumnSelection
       {
         if (hiddenColumns != null && isVisible(col.intValue()))
         {
-          if (!selected.contains(col))
-          {
-            selected.addElement(col);
-          }
+          selected.add(col);
         }
       }
     }
@@ -1129,7 +1321,7 @@ public class ColumnSelection
    */
   public void setElementsFrom(ColumnSelection colsel)
   {
-    selected = new Vector<Integer>();
+    selected = new IntList();
     if (colsel.selected != null && colsel.selected.size() > 0)
     {
       if (hiddenColumns != null && hiddenColumns.size() > 0)
@@ -1336,6 +1528,8 @@ public class ColumnSelection
   public boolean filterAnnotations(Annotation[] annotations,
           AnnotationFilterParameter filterParams)
   {
+    // JBPNote - this method needs to be refactored to become independent of
+    // viewmodel package
     this.revealAllHiddenColumns();
     this.clear();
     int count = 0;
@@ -1417,4 +1611,5 @@ public class ColumnSelection
     } while (count < annotations.length);
     return false;
   }
+
 }
index 0b1fb6d..53642b5 100755 (executable)
@@ -37,6 +37,7 @@ public class DBRefEntry implements DBRefEntryI
 
   }
 
+
   public DBRefEntry(String source, String version, String accessionId)
   {
     this(source, version, accessionId, null);
@@ -63,13 +64,14 @@ public class DBRefEntry implements DBRefEntryI
     this.map = map;
   }
 
-  public DBRefEntry(DBRefEntry entry)
+  public DBRefEntry(DBRefEntryI entry)
   {
-    this(
-            (entry.source == null ? "" : new String(entry.source)),
-            (entry.version == null ? "" : new String(entry.version)),
-            (entry.accessionId == null ? "" : new String(entry.accessionId)),
-            (entry.map == null ? null : new Mapping(entry.map)));
+    this((entry.getSource() == null ? "" : new String(entry.getSource())),
+            (entry.getVersion() == null ? "" : new String(
+                    entry.getVersion())),
+            (entry.getAccessionId() == null ? "" : new String(
+                    entry.getAccessionId())),
+            (entry.getMap() == null ? null : new Mapping(entry.getMap())));
   }
 
   @Override
@@ -165,6 +167,7 @@ public class DBRefEntry implements DBRefEntryI
   }
 
 
+  @Override
   public Mapping getMap()
   {
     return map;
index 6a676cf..91b49eb 100755 (executable)
@@ -54,6 +54,11 @@ public class DBRefSource
   public static String PDB = "PDB";
 
   /**
+   * mmCIF Entry Code
+   */
+  public static String MMCIF = "mmCIF";
+
+  /**
    * EMBL ID
    */
   public static String EMBL = "EMBL";
@@ -79,62 +84,18 @@ public class DBRefSource
   public static final String GENEDB = "GeneDB".toUpperCase();
 
   /**
-   * List of databases whose sequences might have coding regions annotated
-   */
-  public static final String[] DNACODINGDBS = { EMBL, EMBLCDS, GENEDB };
-
-  public static final String[] CODINGDBS = { EMBLCDS, GENEDB };
-
-  public static final String[] PROTEINDBS = { UNIPROT, PDB, UNIPROTKB,
-      EMBLCDSProduct };
-
-  public static final String[] PROTEINSEQ = { UNIPROT, UNIPROTKB,
-      EMBLCDSProduct };
-
-  public static final String[] PROTEINSTR = { PDB };
-
-  public static final String[] DOMAINDBS = { PFAM, RFAM };
-
-  /**
-   * set of unique DBRefSource property constants. These could be used to
-   * reconstruct the above groupings
-   */
-  public static final Object SEQDB = "SQ";
-
-  /**
-   * database of nucleic acid sequences
+   * Ensembl
    */
-  public static final Object DNASEQDB = "NASQ";
+  public static final String ENSEMBL = "ENSEMBL";
 
   /**
-   * database of amino acid sequences
-   */
-  public static final Object PROTSEQDB = "PROTSQ";
-
-  /**
-   * database of cDNA sequences
-   */
-  public static final Object CODINGSEQDB = "CODING";
-
-  /**
-   * database of na sequences with exon annotation
-   */
-  public static final Object DNACODINGSEQDB = "XONCODING";
-
-  /**
-   * DB returns several sequences associated with a protein/nucleotide domain
+   * List of databases whose sequences might have coding regions annotated
    */
-  public static final Object DOMAINDB = "DOMAIN";
+  public static final String[] DNACODINGDBS = { EMBL, EMBLCDS, GENEDB,
+      ENSEMBL };
 
-  /**
-   * DB query can take multiple accession codes concatenated by a separator.
-   * Value of property indicates maximum number of accession codes to send at a
-   * time.
-   */
-  public static final Object MULTIACC = "MULTIACC";
+  public static final String[] CODINGDBS = { EMBLCDS, GENEDB, ENSEMBL };
 
-  /**
-   * DB query returns an alignment for each accession provided.
-   */
-  public static final Object ALIGNMENTDB = "ALIGNMENTS";
+  public static final String[] PROTEINDBS = { UNIPROT, PDB, UNIPROTKB,
+      EMBLCDSProduct, ENSEMBL }; // Ensembl ENSP* entries are protein
 }
index 6c619ce..bd83fe9 100644 (file)
@@ -155,8 +155,9 @@ public class Mapping
       int[] alignedCodon = getAlignedCodon(codon);
 
       String peptide = getPeptide();
+      int peptideCol = toPosition - 1 - Mapping.this.to.getStart();
       return new AlignedCodon(alignedCodon[0], alignedCodon[1],
-              alignedCodon[2], peptide);
+              alignedCodon[2], peptide, peptideCol);
     }
 
     /**
@@ -164,6 +165,8 @@ public class Mapping
      * sequence.
      * 
      * @return
+     * @throws NoSuchElementException
+     *           if the 'toRange' is exhausted (nothing to map to)
      */
     private String getPeptide()
     {
@@ -693,6 +696,7 @@ public class Mapping
    * 
    * @see java.lang.Object#finalize()
    */
+  @Override
   protected void finalize() throws Throwable
   {
     map = null;
@@ -700,9 +704,28 @@ public class Mapping
     super.finalize();
   }
 
+  /**
+   * Returns an iterator which can serve up the aligned codon column positions
+   * and their corresponding peptide products
+   * 
+   * @param seq
+   *          an aligned (i.e. possibly gapped) sequence
+   * @param gapChar
+   * @return
+   */
   public Iterator<AlignedCodon> getCodonIterator(SequenceI seq, char gapChar)
   {
     return new AlignedCodonIterator(seq, gapChar);
   }
 
+  /**
+   * Readable representation for debugging only, not guaranteed not to change
+   */
+  @Override
+  public String toString()
+  {
+    return String.format("%s %s", this.map.toString(), this.to == null ? ""
+            : this.to.getName());
+  }
+
 }
diff --git a/src/jalview/datamodel/MappingType.java b/src/jalview/datamodel/MappingType.java
new file mode 100644 (file)
index 0000000..c0c69aa
--- /dev/null
@@ -0,0 +1,63 @@
+package jalview.datamodel;
+
+/**
+ * An enumeration of the kinds of mapping (from nucleotide or peptide, to
+ * nucleotide or peptide), and the corresponding word lengths
+ */
+public enum MappingType
+{
+  NucleotideToPeptide(3, 1)
+  {
+    @Override
+    public MappingType getInverse()
+    {
+      return PeptideToNucleotide;
+    }
+  },
+  PeptideToNucleotide(1, 3)
+  {
+    @Override
+    public MappingType getInverse()
+    {
+      return NucleotideToPeptide;
+    }
+  },
+  NucleotideToNucleotide(1, 1)
+  {
+    @Override
+    public MappingType getInverse()
+    {
+      return NucleotideToNucleotide;
+    }
+  },
+  PeptideToPeptide(1, 1)
+  {
+    @Override
+    public MappingType getInverse()
+    {
+      return PeptideToPeptide;
+    }
+  };
+
+  private int fromRatio;
+
+  private int toRatio;
+
+  private MappingType(int fromSize, int toSize)
+  {
+    fromRatio = fromSize;
+    toRatio = toSize;
+  }
+
+  public abstract MappingType getInverse();
+
+  public int getFromRatio()
+  {
+    return fromRatio;
+  }
+
+  public int getToRatio()
+  {
+    return toRatio;
+  }
+}
index 589bc7b..1c7df49 100755 (executable)
@@ -34,7 +34,7 @@ public class PDBEntry
 
   public enum Type
   {
-    PDB, FILE
+    PDB, MMCIF, FILE
   }
 
   Hashtable properties;
@@ -168,6 +168,7 @@ public class PDBEntry
     this.chainCode = chainCode;
   }
 
+  @Override
   public String toString()
   {
     return id;
index ad0e472..b9db461 100755 (executable)
@@ -67,8 +67,22 @@ public class SearchResults
     public Match(SequenceI seq, int start, int end)
     {
       sequence = seq;
-      this.start = start;
-      this.end = end;
+
+      /*
+       * always hold in forwards order, even if given in reverse order
+       * (such as from a mapping to a reverse strand); this avoids
+       * trouble for routines that highlight search results etc
+       */
+      if (start <= end)
+      {
+        this.start = start;
+        this.end = end;
+      }
+      else
+      {
+        this.start = end;
+        this.end = start;
+      }
     }
 
     public SequenceI getSequence()
index d279a26..98b0de5 100644 (file)
@@ -68,10 +68,49 @@ public class SeqCigar extends CigarSimple
   }
 
   /**
+   * 
+   * @param column
+   * @return position in sequence for column (or -1 if no match state exists)
+   */
+  public int findPosition(int column)
+  {
+    int w = 0, ew, p = refseq.findPosition(start);
+    if (column < 0)
+    {
+      return -1;
+    }
+    if (range != null)
+    {
+      for (int i = 0; i < length; i++)
+      {
+        if (operation[i] == M || operation[i] == D)
+        {
+          p += range[i];
+        }
+        if (operation[i] == M || operation[i] == I)
+        {
+          ew = w + range[i];
+          if (column < ew)
+          {
+            if (operation[i] == I)
+            {
+              return -1;
+            }
+            return p - (ew - column);
+          }
+          w = ew;
+        }
+      }
+    }
+    return -1;
+  }
+
+  /**
    * Returns sequence as a string with cigar operations applied to it
    * 
    * @return String
    */
+  @Override
   public String getSequenceString(char GapChar)
   {
     return (length == 0) ? "" : (String) getSequenceAndDeletions(
index ac2f9c1..a61f093 100755 (executable)
@@ -25,6 +25,7 @@ import jalview.api.DBRefEntryI;
 import jalview.util.StringUtils;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Enumeration;
 import java.util.List;
 import java.util.Vector;
@@ -185,12 +186,13 @@ public class Sequence extends ASequence implements SequenceI
   }
 
   /**
-   * Creates a new Sequence object with new features, DBRefEntries,
-   * AlignmentAnnotations, and PDBIds but inherits any existing dataset sequence
-   * reference.
+   * Creates a new Sequence object with new AlignmentAnnotations but inherits
+   * any existing dataset sequence reference. If non exists, everything is
+   * copied.
    * 
    * @param seq
-   *          DOCUMENT ME!
+   *          if seq is a dataset sequence, behaves like a plain old copy
+   *          constructor
    */
   public Sequence(SequenceI seq)
   {
@@ -213,30 +215,48 @@ public class Sequence extends ASequence implements SequenceI
 
   }
 
+  /**
+   * does the heavy lifting when cloning a dataset sequence, or coping data from
+   * dataset to a new derived sequence.
+   * 
+   * @param seq
+   *          - source of attributes.
+   * @param alAnnotation
+   *          - alignment annotation present on seq that should be copied onto
+   *          this sequence
+   */
   protected void initSeqFrom(SequenceI seq,
           AlignmentAnnotation[] alAnnotation)
   {
-    initSeqAndName(seq.getName(), seq.getSequence(), seq.getStart(),
+    {
+      char[] oseq = seq.getSequence();
+      initSeqAndName(seq.getName(), Arrays.copyOf(oseq, oseq.length),
+              seq.getStart(),
             seq.getEnd());
+    }
     description = seq.getDescription();
-    sourceDBRef = seq.getSourceDBRef();
-    if (seq.getSequenceFeatures() != null)
+    sourceDBRef = seq.getSourceDBRef() == null ? null : new DBRefEntry(
+            seq.getSourceDBRef());
+    if (seq != datasetSequence)
     {
-      SequenceFeature[] sf = seq.getSequenceFeatures();
-      for (int i = 0; i < sf.length; i++)
-      {
-        addSequenceFeature(new SequenceFeature(sf[i]));
-      }
+      setDatasetSequence(seq.getDatasetSequence());
     }
-    setDatasetSequence(seq.getDatasetSequence());
     if (datasetSequence == null && seq.getDBRefs() != null)
     {
-      // only copy DBRefs if we really are a dataset sequence
+      // only copy DBRefs and seqfeatures if we really are a dataset sequence
       DBRefEntry[] dbr = seq.getDBRefs();
       for (int i = 0; i < dbr.length; i++)
       {
         addDBRef(new DBRefEntry(dbr[i]));
       }
+      if (seq.getSequenceFeatures() != null)
+      {
+        SequenceFeature[] sf = seq.getSequenceFeatures();
+        for (int i = 0; i < sf.length; i++)
+        {
+          addSequenceFeature(new SequenceFeature(sf[i]));
+        }
+      }
     }
     if (seq.getAnnotation() != null)
     {
@@ -265,30 +285,38 @@ public class Sequence extends ASequence implements SequenceI
     }
     if (seq.getAllPDBEntries() != null)
     {
-      Vector ids = seq.getAllPDBEntries();
-      Enumeration e = ids.elements();
-      while (e.hasMoreElements())
+      Vector<PDBEntry> ids = seq.getAllPDBEntries();
+      for (PDBEntry pdb : ids)
       {
-        this.addPDBId(new PDBEntry((PDBEntry) e.nextElement()));
+        this.addPDBId(new PDBEntry(pdb));
       }
     }
   }
 
-  /**
-   * DOCUMENT ME!
-   * 
-   * @param v
-   *          DOCUMENT ME!
-   */
+
   @Override
   public void setSequenceFeatures(SequenceFeature[] features)
   {
-    sequenceFeatures = features;
+    if (datasetSequence == null)
+    {
+      sequenceFeatures = features;
+    }
+    else
+    {
+      System.err
+              .println("Warning: JAL-2046 side effect ? Possible implementation error: overwriting dataset sequence features by setting sequence features on alignment");
+      datasetSequence.setSequenceFeatures(features);
+    }
   }
 
   @Override
   public synchronized void addSequenceFeature(SequenceFeature sf)
   {
+    if (sequenceFeatures==null && datasetSequence != null)
+    {
+      datasetSequence.addSequenceFeature(sf);
+      return;
+    }
     if (sequenceFeatures == null)
     {
       sequenceFeatures = new SequenceFeature[0];
@@ -314,6 +342,9 @@ public class Sequence extends ASequence implements SequenceI
   {
     if (sequenceFeatures == null)
     {
+      if (datasetSequence!=null) {
+         datasetSequence.deleteFeature(sf);
+      }
       return;
     }
 
@@ -420,7 +451,7 @@ public class Sequence extends ASequence implements SequenceI
   @Override
   public Vector<PDBEntry> getAllPDBEntries()
   {
-    return pdbIds;
+    return pdbIds == null ? new Vector<PDBEntry>() : pdbIds;
   }
 
   /**
@@ -611,17 +642,15 @@ public class Sequence extends ASequence implements SequenceI
   }
 
   /**
-   * DOCUMENT ME!
+   * Returns the character of the aligned sequence at the given position (base
+   * zero), or space if the position is not within the sequence's bounds
    * 
-   * @param i
-   *          DOCUMENT ME!
-   * 
-   * @return DOCUMENT ME!
+   * @return
    */
   @Override
   public char getCharAt(int i)
   {
-    if (i < sequence.length)
+    if (i >= 0 && i < sequence.length)
     {
       return sequence[i];
     }
@@ -931,6 +960,7 @@ public class Sequence extends ASequence implements SequenceI
   @Override
   public void addDBRef(DBRefEntry entry)
   {
+    // TODO add to dataset sequence instead if there is one?
     if (dbrefs == null)
     {
       dbrefs = new DBRefEntry[0];
@@ -964,6 +994,7 @@ public class Sequence extends ASequence implements SequenceI
   @Override
   public void setDatasetSequence(SequenceI seq)
   {
+    // TODO check for circular reference before setting?
     datasetSequence = seq;
   }
 
@@ -1036,31 +1067,24 @@ public class Sequence extends ASequence implements SequenceI
   @Override
   public SequenceI deriveSequence()
   {
-    SequenceI seq = new Sequence(this);
-    if (datasetSequence != null)
-    {
-      // duplicate current sequence with same dataset
-      seq.setDatasetSequence(datasetSequence);
-    }
-    else
+    Sequence seq=null;
+    if (datasetSequence == null)
     {
       if (isValidDatasetSequence())
       {
         // Use this as dataset sequence
+        seq = new Sequence(getName(), "", 1, -1);
         seq.setDatasetSequence(this);
+        seq.initSeqFrom(this, getAnnotation());
+        return seq;
       }
       else
       {
         // Create a new, valid dataset sequence
-        SequenceI ds = seq;
-        ds.setSequence(AlignSeq.extractGaps(
-                jalview.util.Comparison.GapChars, new String(sequence)));
-        setDatasetSequence(ds);
-        ds.setSequenceFeatures(getSequenceFeatures());
-        seq = this; // and return this sequence as the derived sequence.
+       createDatasetSequence();
       }
     }
-    return seq;
+    return new Sequence(this);
   }
 
   /*
@@ -1073,20 +1097,27 @@ public class Sequence extends ASequence implements SequenceI
   {
     if (datasetSequence == null)
     {
-      datasetSequence = new Sequence(getName(), AlignSeq.extractGaps(
+      Sequence dsseq = new Sequence(getName(), AlignSeq.extractGaps(
               jalview.util.Comparison.GapChars, getSequenceAsString()),
               getStart(), getEnd());
-      datasetSequence.setSequenceFeatures(getSequenceFeatures());
-      datasetSequence.setDescription(getDescription());
-      setSequenceFeatures(null);
-      // move database references onto dataset sequence
-      datasetSequence.setDBRefs(getDBRefs());
-      setDBRefs(null);
-      datasetSequence.setPDBId(getAllPDBEntries());
-      setPDBId(null);
+
+      datasetSequence = dsseq;
+
+      dsseq.setDescription(description);
+      // move features and database references onto dataset sequence
+      dsseq.sequenceFeatures = sequenceFeatures;
+      sequenceFeatures=null;
+      dsseq.dbrefs = dbrefs;
+      dbrefs=null;
+      // TODO: search and replace any references to this sequence with
+      // references to the dataset sequence in Mappings on dbref
+      dsseq.pdbIds = pdbIds;
+      pdbIds = null;
       datasetSequence.updatePDBIds();
       if (annotation != null)
       {
+        // annotation is cloned rather than moved, to preserve what's currently
+        // on the alignment
         for (AlignmentAnnotation aa : annotation)
         {
           AlignmentAnnotation _aa = new AlignmentAnnotation(aa);
index 7e3c187..172c25f 100644 (file)
@@ -20,7 +20,7 @@
  */
 package jalview.datamodel;
 
-public class SequenceDummy extends Sequence implements SequenceI
+public class SequenceDummy extends Sequence
 {
   public SequenceDummy(String sequenceId)
   {
@@ -50,4 +50,14 @@ public class SequenceDummy extends Sequence implements SequenceI
   {
     return dummy;
   }
+
+  /**
+   * Always suppress /start-end for display name as we don't know it
+   */
+  @Override
+  public String getDisplayId(boolean jvsuffix)
+  {
+    // required for correct behaviour of SequenceIdMatcher
+    return super.getDisplayId(false);
+  }
 }
index 1b6498f..f2eb8ac 100755 (executable)
@@ -20,7 +20,8 @@
  */
 package jalview.datamodel;
 
-import java.util.Hashtable;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.Vector;
 
 /**
@@ -31,6 +32,19 @@ import java.util.Vector;
  */
 public class SequenceFeature
 {
+  private static final String STATUS = "status";
+
+  private static final String STRAND = "STRAND";
+
+  // private key for Phase designed not to conflict with real GFF data
+  private static final String PHASE = "!Phase";
+
+  /*
+   * ATTRIBUTES is reserved for the GFF 'column 9' data, formatted as
+   * name1=value1;name2=value2,value3;...etc
+   */
+  private static final String ATTRIBUTES = "ATTRIBUTES";
+
   public int begin;
 
   public int end;
@@ -41,7 +55,7 @@ public class SequenceFeature
 
   public String description;
 
-  public Hashtable otherDetails;
+  public Map<String, Object> otherDetails;
 
   public Vector<String> links;
 
@@ -54,9 +68,9 @@ public class SequenceFeature
   }
 
   /**
-   * Constructs a duplicate feature. Note: Uses clone on the otherDetails so
-   * only shallow copies are made of additional properties and method will
-   * silently fail if unclonable objects are found in the hash.
+   * Constructs a duplicate feature. Note: Uses makes a shallow copy of the
+   * otherDetails map, so the new and original SequenceFeature may reference the
+   * same objects in the map.
    * 
    * @param cpy
    */
@@ -83,10 +97,11 @@ public class SequenceFeature
       {
         try
         {
-          otherDetails = (Hashtable) cpy.otherDetails.clone();
+          otherDetails = (Map<String, Object>) ((HashMap<String, Object>) cpy.otherDetails)
+                  .clone();
         } catch (Exception e)
         {
-          // Uncloneable objects in the otherDetails - don't complain
+          // ignore
         }
       }
       if (cpy.links != null && cpy.links.size() > 0)
@@ -100,45 +115,146 @@ public class SequenceFeature
     }
   }
 
+  /**
+   * Constructor including a Status value
+   * 
+   * @param type
+   * @param desc
+   * @param status
+   * @param begin
+   * @param end
+   * @param featureGroup
+   */
   public SequenceFeature(String type, String desc, String status,
           int begin, int end, String featureGroup)
   {
+    this(type, desc, begin, end, featureGroup);
+    setStatus(status);
+  }
+
+  /**
+   * Constructor
+   * 
+   * @param type
+   * @param desc
+   * @param begin
+   * @param end
+   * @param featureGroup
+   */
+  SequenceFeature(String type, String desc, int begin, int end,
+          String featureGroup)
+  {
     this.type = type;
     this.description = desc;
-    setValue("status", status);
     this.begin = begin;
     this.end = end;
     this.featureGroup = featureGroup;
   }
 
+  /**
+   * Constructor including a score value
+   * 
+   * @param type
+   * @param desc
+   * @param begin
+   * @param end
+   * @param score
+   * @param featureGroup
+   */
   public SequenceFeature(String type, String desc, int begin, int end,
           float score, String featureGroup)
   {
-    this.type = type;
-    this.description = desc;
-    this.begin = begin;
-    this.end = end;
+    this(type, desc, begin, end, featureGroup);
     this.score = score;
-    this.featureGroup = featureGroup;
   }
 
-  public boolean equals(SequenceFeature sf)
+  /**
+   * Two features are considered equal if they have the same type, group,
+   * description, start, end, phase, strand, and (if present) 'Name', ID' and
+   * 'Parent' attributes.
+   * 
+   * Note we need to check Parent to distinguish the same exon occurring in
+   * different transcripts (in Ensembl GFF). This allows assembly of transcript
+   * sequences from their component exon regions.
+   */
+  @Override
+  public boolean equals(Object o)
   {
+    return equals(o, false);
+  }
+
+  /**
+   * Overloaded method allows the equality test to optionally ignore the
+   * 'Parent' attribute of a feature. This supports avoiding adding many
+   * superficially duplicate 'exon' or CDS features to genomic or protein
+   * sequence.
+   * 
+   * @param o
+   * @param ignoreParent
+   * @return
+   */
+  public boolean equals(Object o, boolean ignoreParent)
+  {
+    if (o == null || !(o instanceof SequenceFeature))
+    {
+      return false;
+    }
+
+    SequenceFeature sf = (SequenceFeature) o;
     if (begin != sf.begin || end != sf.end || score != sf.score)
     {
       return false;
     }
 
-    if (!(type + description + featureGroup).equals(sf.type
-            + sf.description + sf.featureGroup))
+    if (getStrand() != sf.getStrand())
     {
       return false;
     }
 
+    if (!(type + description + featureGroup + getPhase()).equals(sf.type
+            + sf.description + sf.featureGroup + sf.getPhase()))
+    {
+      return false;
+    }
+    if (!equalAttribute(getValue("ID"), sf.getValue("ID")))
+    {
+      return false;
+    }
+    if (!equalAttribute(getValue("Name"), sf.getValue("Name")))
+    {
+      return false;
+    }
+    if (!ignoreParent)
+    {
+      if (!equalAttribute(getValue("Parent"), sf.getValue("Parent")))
+      {
+        return false;
+      }
+    }
     return true;
   }
 
   /**
+   * Returns true if both values are null, are both non-null and equal
+   * 
+   * @param att1
+   * @param att2
+   * @return
+   */
+  protected static boolean equalAttribute(Object att1, Object att2)
+  {
+    if (att1 == null && att2 == null)
+    {
+      return true;
+    }
+    if (att1 != null)
+    {
+      return att1.equals(att2);
+    }
+    return att2.equals(att1);
+  }
+
+  /**
    * DOCUMENT ME!
    * 
    * @return DOCUMENT ME!
@@ -229,7 +345,7 @@ public class SequenceFeature
   }
 
   /**
-   * Used for getting values which are not in the basic set. eg STRAND, FRAME
+   * Used for getting values which are not in the basic set. eg STRAND, PHASE
    * for GFF file
    * 
    * @param key
@@ -248,6 +364,20 @@ public class SequenceFeature
   }
 
   /**
+   * Returns a property value for the given key if known, else the specified
+   * default value
+   * 
+   * @param key
+   * @param defaultValue
+   * @return
+   */
+  public Object getValue(String key, Object defaultValue)
+  {
+    Object value = getValue(key);
+    return value == null ? defaultValue : value;
+  }
+
+  /**
    * Used for setting values which are not in the basic set. eg STRAND, FRAME
    * for GFF file
    * 
@@ -262,7 +392,7 @@ public class SequenceFeature
     {
       if (otherDetails == null)
       {
-        otherDetails = new Hashtable();
+        otherDetails = new HashMap<String, Object>();
       }
 
       otherDetails.put(key, value);
@@ -275,20 +405,22 @@ public class SequenceFeature
    */
   public void setStatus(String status)
   {
-    setValue("status", status);
+    setValue(STATUS, status);
   }
 
   public String getStatus()
   {
-    if (otherDetails != null)
-    {
-      String stat = (String) otherDetails.get("status");
-      if (stat != null)
-      {
-        return new String(stat);
-      }
-    }
-    return null;
+    return (String) getValue(STATUS);
+  }
+
+  public void setAttributes(String attr)
+  {
+    setValue(ATTRIBUTES, attr);
+  }
+
+  public String getAttributes()
+  {
+    return (String) getValue(ATTRIBUTES);
   }
 
   public void setPosition(int pos)
@@ -302,23 +434,73 @@ public class SequenceFeature
     return begin;
   }
 
+  /**
+   * Return 1 for forward strand ('+' in GFF), -1 for reverse strand ('-' in
+   * GFF), and 0 for unknown or not (validly) specified
+   * 
+   * @return
+   */
   public int getStrand()
   {
-    String str;
-    if (otherDetails == null
-            || (str = otherDetails.get("STRAND").toString()) == null)
-    {
-      return 0;
-    }
-    if (str.equals("-"))
-    {
-      return -1;
-    }
-    if (str.equals("+"))
+    int strand = 0;
+    if (otherDetails != null)
     {
-      return 1;
+      Object str = otherDetails.get(STRAND);
+      if ("-".equals(str))
+      {
+        strand = -1;
+      }
+      else if ("+".equals(str))
+      {
+        strand = 1;
+      }
     }
-    return 0;
+    return strand;
+  }
+
+  /**
+   * Set the value of strand
+   * 
+   * @param strand
+   *          should be "+" for forward, or "-" for reverse
+   */
+  public void setStrand(String strand)
+  {
+    setValue(STRAND, strand);
   }
 
+  public void setPhase(String phase)
+  {
+    setValue(PHASE, phase);
+  }
+
+  public String getPhase()
+  {
+    return (String) getValue(PHASE);
+  }
+
+  /**
+   * Readable representation, for debug only, not guaranteed not to change
+   * between versions
+   */
+  @Override
+  public String toString()
+  {
+    return String.format("%d %d %s %s", getBegin(), getEnd(), getType(),
+            getDescription());
+  }
+
+  /**
+   * Overridden to ensure that whenever two objects are equal, they have the
+   * same hashCode
+   */
+  @Override
+  public int hashCode()
+  {
+    String s = getType() + getDescription() + getFeatureGroup()
+            + getValue("ID") + getValue("Name") + getValue("Parent")
+            + getPhase();
+    return s.hashCode() + getBegin() + getEnd() + (int) getScore()
+            + getStrand();
+  }
 }
index f1cba43..60040d8 100755 (executable)
@@ -250,17 +250,20 @@ public interface SequenceI extends ASequenceI
   public void insertCharAt(int position, int count, char ch);
 
   /**
-   * DOCUMENT ME!
+   * Gets array holding sequence features associated with this sequence. The
+   * array may be held by the sequence's dataset sequence if that is defined.
    * 
-   * @return DOCUMENT ME!
+   * @return hard reference to array
    */
   public SequenceFeature[] getSequenceFeatures();
 
   /**
-   * DOCUMENT ME!
+   * Replaces the array of sequence features associated with this sequence with
+   * a new array reference. If this sequence has a dataset sequence, then this
+   * method will update the dataset sequence's feature array
    * 
-   * @param v
-   *          DOCUMENT ME!
+   * @param features
+   *          New array of sequence features
    */
   public void setSequenceFeatures(SequenceFeature[] features);
 
index 87e2789..691a4c9 100644 (file)
@@ -20,6 +20,7 @@
  */
 package jalview.datamodel.xdb.embl;
 
+import jalview.analysis.SequenceIdMatcher;
 import jalview.datamodel.DBRefEntry;
 import jalview.datamodel.DBRefSource;
 import jalview.datamodel.FeatureProperties;
@@ -27,21 +28,33 @@ 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.util.MappingUtils;
+import jalview.util.StringUtils;
 
+import java.util.Arrays;
 import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Vector;
+import java.util.regex.Pattern;
 
 /**
  * Data model for one entry returned from an EMBL query, as marshalled by a
  * Castor binding file
  * 
- * For example: http://www.ebi.ac.uk/Tools/dbfetch/dbfetch/embl/x53828/emblxml
+ * For example:
+ * http://www.ebi.ac.uk/Tools/dbfetch/dbfetch?db=ena_sequence&id=J03321
+ * &format=emblxml
  * 
  * @see embl_mapping.xml
  */
 public class EmblEntry
 {
+  private static final Pattern SPACE_PATTERN = Pattern.compile(" ");
+
   String accession;
 
   String version;
@@ -251,207 +264,48 @@ public class EmblEntry
     this.version = version;
   }
 
-  /*
-   * EMBL Feature support is limited. The text below is included for the benefit
-   * of any developer working on improving EMBL feature import in Jalview.
-   * Extract from EMBL feature specification see
-   * http://www.embl-ebi.ac.uk/embl/Documentation
-   * /FT_definitions/feature_table.html 3.5 Location 3.5.1 Purpose
-   * 
-   * The location indicates the region of the presented sequence which
-   * corresponds to a feature.
-   * 
-   * 3.5.2 Format and conventions The location contains at least one sequence
-   * location descriptor and may contain one or more operators with one or more
-   * sequence location descriptors. Base numbers refer to the numbering in the
-   * entry. This numbering designates the first base (5' end) of the presented
-   * sequence as base 1. Base locations beyond the range of the presented
-   * sequence may not be used in location descriptors, the only exception being
-   * location in a remote entry (see 3.5.2.1, e).
-   * 
-   * Location operators and descriptors are discussed in more detail below.
-   * 
-   * 3.5.2.1 Location descriptors
-   * 
-   * The location descriptor can be one of the following: (a) a single base
-   * number (b) a site between two indicated adjoining bases (c) a single base
-   * chosen from within a specified range of bases (not allowed for new entries)
-   * (d) the base numbers delimiting a sequence span (e) a remote entry
-   * identifier followed by a local location descriptor (i.e., a-d)
-   * 
-   * A site between two adjoining nucleotides, such as endonucleolytic cleavage
-   * site, is indicated by listing the two points separated by a carat (^). The
-   * permitted formats for this descriptor are n^n+1 (for example 55^56), or,
-   * for circular molecules, n^1, where "n" is the full length of the molecule,
-   * ie 1000^1 for circular molecule with length 1000.
-   * 
-   * A single base chosen from a range of bases is indicated by the first base
-   * number and the last base number of the range separated by a single period
-   * (e.g., '12.21' indicates a single base taken from between the indicated
-   * points). From October 2006 the usage of this descriptor is restricted : it
-   * is illegal to use "a single base from a range" (c) either on its own or in
-   * combination with the "sequence span" (d) descriptor for newly created
-   * entries. The existing entries where such descriptors exist are going to be
-   * retrofitted.
-   * 
-   * Sequence spans are indicated by the starting base number and the ending
-   * base number separated by two periods (e.g., '34..456'). The '<' and '>'
-   * symbols may be used with the starting and ending base numbers to indicate
-   * that an end point is beyond the specified base number. The starting and
-   * ending base positions can be represented as distinct base numbers
-   * ('34..456') or a site between two indicated adjoining bases.
-   * 
-   * A location in a remote entry (not the entry to which the feature table
-   * belongs) can be specified by giving the accession-number and sequence
-   * version of the remote entry, followed by a colon ":", followed by a
-   * location descriptor which applies to that entry's sequence (i.e.
-   * J12345.1:1..15, see also examples below)
-   * 
-   * 3.5.2.2 Operators
-   * 
-   * The location operator is a prefix that specifies what must be done to the
-   * indicated sequence to find or construct the location corresponding to the
-   * feature. A list of operators is given below with their definitions and most
-   * common format.
-   * 
-   * complement(location) Find the complement of the presented sequence in the
-   * span specified by " location" (i.e., read the complement of the presented
-   * strand in its 5'-to-3' direction)
-   * 
-   * join(location,location, ... location) The indicated elements should be
-   * joined (placed end-to-end) to form one contiguous sequence
-   * 
-   * order(location,location, ... location) The elements can be found in the
-   * specified order (5' to 3' direction), but nothing is implied about the
-   * reasonableness about joining them
-   * 
-   * Note : location operator "complement" can be used in combination with
-   * either " join" or "order" within the same location; combinations of "join"
-   * and "order" within the same location (nested operators) are illegal.
-   * 
-   * 
-   * 
-   * 3.5.3 Location examples
-   * 
-   * The following is a list of common location descriptors with their meanings:
-   * 
-   * Location Description
-   * 
-   * 467 Points to a single base in the presented sequence
-   * 
-   * 340..565 Points to a continuous range of bases bounded by and including the
-   * starting and ending bases
-   * 
-   * <345..500 Indicates that the exact lower boundary point of a feature is
-   * unknown. The location begins at some base previous to the first base
-   * specified (which need not be contained in the presented sequence) and
-   * continues to and includes the ending base
-   * 
-   * <1..888 The feature starts before the first sequenced base and continues to
-   * and includes base 888
-   * 
-   * 1..>888 The feature starts at the first sequenced base and continues beyond
-   * base 888
-   * 
-   * 102.110 Indicates that the exact location is unknown but that it is one of
-   * the bases between bases 102 and 110, inclusive
-   * 
-   * 123^124 Points to a site between bases 123 and 124
-   * 
-   * join(12..78,134..202) Regions 12 to 78 and 134 to 202 should be joined to
-   * form one contiguous sequence
-   * 
-   * 
-   * complement(34..126) Start at the base complementary to 126 and finish at
-   * the base complementary to base 34 (the feature is on the strand
-   * complementary to the presented strand)
-   * 
-   * 
-   * complement(join(2691..4571,4918..5163)) Joins regions 2691 to 4571 and 4918
-   * to 5163, then complements the joined segments (the feature is on the strand
-   * complementary to the presented strand)
-   * 
-   * join(complement(4918..5163),complement(2691..4571)) Complements regions
-   * 4918 to 5163 and 2691 to 4571, then joins the complemented segments (the
-   * feature is on the strand complementary to the presented strand)
-   * 
-   * J00194.1:100..202 Points to bases 100 to 202, inclusive, in the entry (in
-   * this database) with primary accession number 'J00194'
-   * 
-   * join(1..100,J00194.1:100..202) Joins region 1..100 of the existing entry
-   * with the region 100..202 of remote entry J00194
-   */
   /**
    * Recover annotated sequences from EMBL file
    * 
-   * @param noNa
-   *          don't return nucleic acid sequences
    * @param sourceDb
-   *          TODO
-   * @param noProtein
-   *          don't return any translated protein sequences marked in features
-   * @return dataset sequences with DBRefs and features - DNA always comes first
+   * @param peptides
+   *          a list of protein products found so far (to add to)
+   * @return dna dataset sequence with DBRefs and features
    */
-  public jalview.datamodel.SequenceI[] getSequences(boolean noNa,
-          boolean noPeptide, String sourceDb)
-  { // TODO: ensure emblEntry.getSequences behaves correctly for returning all
-    // cases of noNa and noPeptide
-    Vector<SequenceI> seqs = new Vector<SequenceI>();
-    Sequence dna = null;
-    if (!noNa)
+  public SequenceI getSequence(String sourceDb, List<SequenceI> peptides)
+  {
+    SequenceI dna = new Sequence(sourceDb + "|" + accession,
+            sequence.getSequence());
+    dna.setDescription(desc);
+    DBRefEntry retrievedref = new DBRefEntry(sourceDb, version, accession);
+    dna.addDBRef(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
+    if (dbRefs != null)
     {
-      // In theory we still need to create this if noNa is set to avoid a null
-      // pointer exception
-      dna = new Sequence(sourceDb + "|" + accession, sequence.getSequence());
-      dna.setDescription(desc);
-      DBRefEntry retrievedref = new DBRefEntry(sourceDb, version, accession);
-      dna.addDBRef(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
-      if (dbRefs != null)
+      for (DBRefEntry dbref : dbRefs)
       {
-        for (DBRefEntry dbref : dbRefs)
-        {
-          dna.addDBRef(dbref);
-        }
+        dna.addDBRef(dbref);
       }
     }
+
     try
     {
       for (EmblFeature feature : features)
       {
-        if (!noNa)
+        if (feature.dbRefs != null)
         {
-          if (feature.dbRefs != null)
+          for (DBRefEntry dbref : feature.dbRefs)
           {
-            for (DBRefEntry dbref : feature.dbRefs)
-            {
-              dna.addDBRef(dbref);
-            }
+            dna.addDBRef(dbref);
           }
         }
         if (FeatureProperties.isCodingFeature(sourceDb, feature.getName()))
         {
-          parseCodingFeature(feature, sourceDb, seqs, dna, noPeptide);
-        }
-        else
-        {
-          // General feature type.
-          // TODO this is just duplicated code ??
-          if (!noNa)
-          {
-            if (feature.dbRefs != null)
-            {
-              for (DBRefEntry dbref : feature.dbRefs)
-              {
-                dna.addDBRef(dbref);
-              }
-            }
-          }
+          parseCodingFeature(feature, sourceDb, dna, peptides);
         }
       }
     } catch (Exception e)
@@ -463,65 +317,46 @@ public class EmblEntry
       System.err.println("Resulted in exception: " + e.getMessage());
       e.printStackTrace(System.err);
     }
-    if (!noNa && dna != null)
-    {
-      seqs.add(dna);
-    }
-    SequenceI[] sqs = new SequenceI[seqs.size()];
-    for (int i = 0, j = seqs.size(); i < j; i++)
-    {
-      sqs[i] = seqs.elementAt(i);
-      seqs.set(i, null);
-    }
-    return sqs;
+
+    return dna;
   }
 
   /**
-   * attempt to extract coding region and product from a feature and properly
-   * decorate it with annotations.
+   * Extracts coding region and product from a CDS feature and properly decorate
+   * it with annotations.
    * 
    * @param feature
    *          coding feature
    * @param sourceDb
    *          source database for the EMBLXML
-   * @param seqs
-   *          place where sequences go
    * @param dna
    *          parent dna sequence for this record
-   * @param noPeptide
-   *          flag for generation of Peptide sequence objects
+   * @param peptides
+   *          list of protein product sequences for Embl entry
    */
-  private void parseCodingFeature(EmblFeature feature, String sourceDb,
-          Vector<SequenceI> seqs, Sequence dna, boolean noPeptide)
+  void parseCodingFeature(EmblFeature feature, String sourceDb,
+          SequenceI dna, List<SequenceI> peptides)
   {
     boolean isEmblCdna = sourceDb.equals(DBRefSource.EMBLCDS);
-    // extract coding region(s)
-    jalview.datamodel.Mapping map = null;
-    int[] exon = null;
-    if (feature.locations != null)
-    {
-      for (EmblFeatureLocations loc : feature.locations)
-      {
-        int[] se = loc.getElementRanges(accession);
-        if (exon == null)
-        {
-          exon = se;
-        }
-        else
-        {
-          int[] t = new int[exon.length + se.length];
-          System.arraycopy(exon, 0, t, 0, exon.length);
-          System.arraycopy(se, 0, t, exon.length, se.length);
-          exon = t;
-        }
-      }
-    }
+
+    int[] exon = getCdsRanges(feature);
+
     String prseq = null;
-    String prname = new String();
+    String prname = "";
     String prid = null;
-    Hashtable<String, String> vals = new Hashtable<String, String>();
-    int prstart = 1;
-    // get qualifiers
+    Map<String, String> vals = new Hashtable<String, String>();
+    SequenceIdMatcher matcher = new SequenceIdMatcher(peptides);
+
+    /*
+     * codon_start 1/2/3 in EMBL corresponds to phase 0/1/2 in CDS
+     * (phase is required for CDS features in GFF3 format)
+     */
+    int codonStart = 1;
+
+    /*
+     * parse qualifiers, saving protein translation, protein id,
+     * codon start position, product (name), and 'other values'
+     */
     if (feature.getQualifiers() != null)
     {
       for (Qualifier q : feature.getQualifiers())
@@ -529,16 +364,8 @@ public class EmblEntry
         String qname = q.getName();
         if (qname.equals("translation"))
         {
-          StringBuilder prsq = new StringBuilder(q.getValues()[0]);
-          int p = prsq.indexOf(" ");
-          while (p > -1)
-          {
-            prsq.deleteCharAt(p);
-            p = prsq.indexOf(" ", p);
-          }
-          prseq = prsq.toString();
-          prsq = null;
-
+          // remove all spaces (precompiled String.replaceAll(" ", ""))
+          prseq = SPACE_PATTERN.matcher(q.getValues()[0]).replaceAll("");
         }
         else if (qname.equals("protein_id"))
         {
@@ -546,46 +373,56 @@ public class EmblEntry
         }
         else if (qname.equals("codon_start"))
         {
-          prstart = Integer.parseInt(q.getValues()[0]);
+          try
+          {
+            codonStart = Integer.parseInt(q.getValues()[0]);
+          } catch (NumberFormatException e)
+          {
+            System.err.println("Invalid codon_start in XML for "
+                    + accession + ": " + e.getMessage());
+          }
         }
         else if (qname.equals("product"))
         {
+          // sometimes name is returned e.g. for V00488
           prname = q.getValues()[0];
         }
         else
         {
           // throw anything else into the additional properties hash
-          String[] s = q.getValues();
-          StringBuilder sb = new StringBuilder();
-          if (s != null)
+          String[] qvals = q.getValues();
+          if (qvals != null)
           {
-            for (int i = 0; i < s.length; i++)
-            {
-              sb.append(s[i]);
-              sb.append("\n");
-            }
+            String commaSeparated = StringUtils.arrayToSeparatorList(qvals,
+                    ",");
+            vals.put(qname, commaSeparated);
           }
-          vals.put(qname, sb.toString());
         }
       }
     }
-    Sequence product = null;
+
     DBRefEntry protEMBLCDS = null;
-    exon = adjustForPrStart(prstart, exon);
+    exon = MappingUtils.removeStartPositions(codonStart - 1, exon);
     boolean noProteinDbref = true;
 
+    SequenceI product = null;
+    Mapping map = null;
     if (prseq != null && prname != null && prid != null)
     {
-      // extract proteins.
-      product = new Sequence(prid, prseq, 1, prseq.length());
-      product.setDescription(((prname.length() == 0) ? "Protein Product from "
-              + sourceDb
-              : prname));
-      if (!noPeptide)
+      /*
+       * look for product in peptides list, if not found, add it
+       */
+      product = matcher.findIdMatch(prid);
+      if (product == null)
       {
-        // Protein is also added to vector of sequences returned
-        seqs.add(product);
+        product = new Sequence(prid, prseq, 1, prseq.length());
+        product.setDescription(((prname.length() == 0) ? "Protein Product from "
+                + sourceDb
+                : prname));
+        peptides.add(product);
+        matcher.add(product);
       }
+
       // we have everything - create the mapping and perhaps the protein
       // sequence
       if (exon == null || exon.length == 0)
@@ -593,24 +430,25 @@ public class EmblEntry
         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 - prstart + dna.getSequence().length))
+        if (prseq.length() * 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() + (prstart - 1), dna.getEnd() };
-          map = new jalview.datamodel.Mapping(product, exon, new int[] { 1,
-              prseq.length() }, 3, 1);
+          exon = new int[] { dna.getStart() + (codonStart - 1),
+              dna.getEnd() };
+          map = new Mapping(product, exon, new int[] { 1, prseq.length() },
+                  3, 1);
         }
-        if ((prseq.length() + 1) * 3 == (1 - prstart + dna.getSequence().length))
+        if ((prseq.length() + 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() + (prstart - 1),
+          exon = new int[] { dna.getStart() + (codonStart - 1),
               dna.getEnd() - 3 };
-          map = new jalview.datamodel.Mapping(product, exon, new int[] { 1,
-              prseq.length() }, 3, 1);
+          map = new Mapping(product, exon, new int[] { 1, prseq.length() },
+                  3, 1);
         }
       }
       else
@@ -628,11 +466,13 @@ public class EmblEntry
         }
         else
         {
-          // final product length trunctation check
-
-          map = new jalview.datamodel.Mapping(product,
-                  adjustForProteinLength(prseq.length(), exon), new int[] {
-                      1, prseq.length() }, 3, 1);
+          // 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)
@@ -640,12 +480,9 @@ public class EmblEntry
           pcdnaref.setAccessionId(prid);
           pcdnaref.setSource(DBRefSource.EMBLCDS);
           pcdnaref.setVersion(getVersion()); // same as parent EMBL version.
-          jalview.util.MapList mp = new jalview.util.MapList(new int[] { 1,
-              prseq.length() }, new int[] { 1 + (prstart - 1),
-              (prstart - 1) + 3 * prseq.length() }, 1, 3);
-          // { 1 + (prstart - 1) * 3,
-          // 1 + (prstart - 1) * 3 + prseq.length() * 3 - 1 }, new int[]
-          // { 1prstart, prstart + prseq.length() - 1 }, 3, 1);
+          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));
           if (product != null)
           {
@@ -653,55 +490,62 @@ public class EmblEntry
             protEMBLCDS = new DBRefEntry(pcdnaref);
             protEMBLCDS.setSource(DBRefSource.EMBLCDSProduct);
             product.addDBRef(protEMBLCDS);
-
           }
-
         }
       }
       // add cds feature to dna seq - this may include the stop codon
       for (int xint = 0; exon != null && xint < exon.length; xint += 2)
       {
-        SequenceFeature sf = new SequenceFeature();
-        sf.setBegin(exon[xint]);
-        sf.setEnd(exon[xint + 1]);
-        sf.setType(feature.getName());
+        SequenceFeature sf = makeCdsFeature(exon, xint, prname, prid, vals,
+                codonStart);
+        sf.setType(feature.getName()); // "CDS"
         sf.setFeatureGroup(sourceDb);
-        sf.setDescription("Exon " + (1 + xint / 2) + " for protein '"
-                + prname + "' EMBLCDS:" + prid);
-        sf.setValue(FeatureProperties.EXONPOS, new Integer(1 + xint));
-        sf.setValue(FeatureProperties.EXONPRODUCT, prname);
-        if (vals != null)
-        {
-          for (Entry<String, String> val : vals.entrySet())
-          {
-            sf.setValue(val.getKey(), val.getValue());
-          }
-        }
         dna.addSequenceFeature(sf);
       }
     }
-    // add dbRefs to sequence
+
+    /*
+     * add dbRefs to sequence, and mappings for Uniprot xrefs
+     */
     if (feature.dbRefs != null)
     {
+      boolean mappingUsed = false;
       for (DBRefEntry ref : feature.dbRefs)
       {
-        ref.setSource(jalview.util.DBRefUtils.getCanonicalName(ref
-                .getSource()));
-        // Hard code the kind of protein product accessions that EMBL cite
-        if (ref.getSource().equals(jalview.datamodel.DBRefSource.UNIPROT))
+        ref.setSource(DBRefUtils.getCanonicalName(ref.getSource()));
+        if (ref.getSource().equals(DBRefSource.UNIPROT))
         {
-          ref.setMap(map);
+          String proteinSeqName = DBRefSource.UNIPROT + "|"
+                  + ref.getAccessionId();
           if (map != null && map.getTo() != null)
           {
-            map.getTo().addDBRef(
-                    new DBRefEntry(ref.getSource(), ref.getVersion(), ref
-                            .getAccessionId())); // don't copy map over.
-            if (map.getTo().getName().indexOf(prid) == 0)
+            if (mappingUsed)
+            {
+              /*
+               * two or more Uniprot xrefs for the same CDS - 
+               * each needs a distinct Mapping (as to a different sequence)
+               */
+              map = new Mapping(map);
+            }
+            mappingUsed = true;
+
+            /*
+             * try to locate the protein mapped to (possibly by a 
+             * previous CDS feature)
+             */
+            SequenceI proteinSeq = matcher.findIdMatch(proteinSeqName);
+            if (proteinSeq == null)
             {
-              map.getTo().setName(
-                      jalview.datamodel.DBRefSource.UNIPROT + "|"
-                              + ref.getAccessionId());
+              proteinSeq = new Sequence(proteinSeqName,
+                      product.getSequenceAsString());
+              matcher.add(proteinSeq);
+              peptides.add(proteinSeq);
             }
+            map.setTo(proteinSeq);
+            map.getTo().addDBRef(
+                    new DBRefEntry(ref.getSource(), ref.getVersion(), ref
+                            .getAccessionId()));
+            ref.setMap(map);
           }
           noProteinDbref = false;
         }
@@ -756,39 +600,86 @@ public class EmblEntry
     }
   }
 
-  private int[] adjustForPrStart(int prstart, int[] exon)
+  /**
+   * Helper method to construct a SequenceFeature for one cds range
+   * 
+   * @param exons
+   *          array of cds [start, end, ...] positions
+   * @param exonStartIndex
+   *          offset into the exons array
+   * @param proteinName
+   * @param proteinAccessionId
+   * @param vals
+   *          map of 'miscellaneous values' for feature
+   * @param codonStart
+   *          codon start position for CDS (1/2/3, normally 1)
+   * @return
+   */
+  protected SequenceFeature makeCdsFeature(int[] exons, int exonStartIndex,
+          String proteinName, String proteinAccessionId,
+          Map<String, String> vals, int codonStart)
   {
-
-    int origxon[], sxpos = -1;
-    int sxstart, sxstop; // unnecessary variables used for debugging
-    // first adjust range for codon start attribute
-    if (prstart > 1)
+    int exonNumber = exonStartIndex / 2 + 1;
+    SequenceFeature sf = new SequenceFeature();
+    sf.setBegin(Math.min(exons[exonStartIndex], exons[exonStartIndex + 1]));
+    sf.setEnd(Math.max(exons[exonStartIndex], exons[exonStartIndex + 1]));
+    sf.setDescription(String.format("Exon %d for protein '%s' EMBLCDS:%s",
+            exonNumber, proteinName, proteinAccessionId));
+    sf.setPhase(String.valueOf(codonStart - 1));
+    sf.setStrand(exons[exonStartIndex] <= exons[exonStartIndex + 1] ? "+"
+            : "-");
+    sf.setValue(FeatureProperties.EXONPOS, exonNumber);
+    sf.setValue(FeatureProperties.EXONPRODUCT, proteinName);
+    if (!vals.isEmpty())
     {
-      origxon = new int[exon.length];
-      System.arraycopy(exon, 0, origxon, 0, exon.length);
-      int cdspos = 0;
-      for (int x = 0; x < exon.length && sxpos == -1; x += 2)
+      StringBuilder sb = new StringBuilder();
+      boolean first = true;
+      for (Entry<String, String> val : vals.entrySet())
       {
-        cdspos += exon[x + 1] - exon[x] + 1;
-        if (prstart <= cdspos)
+        if (!first)
         {
-          sxpos = x;
-          sxstart = exon[x];
-          sxstop = exon[x + 1];
-          // and adjust start boundary of first exon.
-          exon[x] = exon[x + 1] - cdspos + prstart;
-          break;
+          sb.append(";");
         }
+        sb.append(val.getKey()).append("=").append(val.getValue());
+        first = false;
+        sf.setValue(val.getKey(), val.getValue());
       }
+      sf.setAttributes(sb.toString());
+    }
+    return sf;
+  }
 
-      if (sxpos > 0)
-      {
-        int[] nxon = new int[exon.length - sxpos];
-        System.arraycopy(exon, sxpos, nxon, 0, exon.length - sxpos);
-        exon = nxon;
-      }
+  /**
+   * Returns the CDS positions as a list of [start, end, start, end...]
+   * positions. If on the reverse strand, these will be in descending order.
+   * 
+   * @param feature
+   * @return
+   */
+  protected int[] getCdsRanges(EmblFeature feature)
+  {
+    if (feature.locations == null)
+    {
+      return new int[] {};
     }
-    return exon;
+    int cdsBoundaryCount = 0; // count of all start/stop locations
+    int[][] cdsLocations = new int[feature.locations.size()][];
+    int locationNumber = 0;
+    for (EmblFeatureLocations loc : feature.locations)
+    {
+      int[] locationRanges = loc.getElementRanges(accession);
+      cdsLocations[locationNumber++] = locationRanges;
+      cdsBoundaryCount += locationRanges.length;
+    }
+    int[] cdsRanges = new int[cdsBoundaryCount];
+    int copyTo = 0;
+    for (int[] ranges : cdsLocations)
+    {
+      System.arraycopy(ranges, 0, cdsRanges, copyTo, ranges.length);
+      copyTo += ranges.length;
+    }
+    return cdsRanges;
+
   }
 
   /**
@@ -798,48 +689,69 @@ public class EmblEntry
    * @param exon
    * @return new exon
    */
-  private int[] adjustForProteinLength(int prlength, int[] exon)
+  static int[] adjustForProteinLength(int prlength, int[] exon)
   {
+    if (prlength <= 0 || exon == null)
+    {
+      return exon;
+    }
+    int desiredCdsLength = prlength * 3;
+    int exonLength = MappingUtils.getLength(Arrays.asList(exon));
+
+    /*
+     * assuming here exon might include stop codon in addition to protein codons
+     */
+    if (desiredCdsLength == exonLength
+            || desiredCdsLength == exonLength - 3)
+    {
+      return exon;
+    }
 
-    int origxon[], sxpos = -1, endxon = 0, cdslength = prlength * 3;
-    int sxstart, sxstop; // unnecessary variables used for debugging
-    // first adjust range for codon start attribute
-    if (prlength >= 1 && exon != null)
+    int origxon[];
+    int sxpos = -1;
+    int endxon = 0;
+    origxon = new int[exon.length];
+    System.arraycopy(exon, 0, origxon, 0, exon.length);
+    int cdspos = 0;
+    for (int x = 0; x < exon.length; x += 2)
     {
-      origxon = new int[exon.length];
-      System.arraycopy(exon, 0, origxon, 0, exon.length);
-      int cdspos = 0;
-      for (int x = 0; x < exon.length && sxpos == -1; x += 2)
+      cdspos += Math.abs(exon[x + 1] - exon[x]) + 1;
+      if (desiredCdsLength <= cdspos)
       {
-        cdspos += exon[x + 1] - exon[x] + 1;
-        if (cdslength <= cdspos)
+        // advanced beyond last codon.
+        sxpos = x;
+        if (desiredCdsLength != cdspos)
         {
-          // advanced beyond last codon.
-          sxpos = x;
-          sxstart = exon[x];
-          sxstop = exon[x + 1];
-          if (cdslength != cdspos)
-          {
-            System.err
-                    .println("Truncating final exon interval on region by "
-                            + (cdspos - cdslength));
-          }
-          // locate the new end boundary of final exon as endxon
-          endxon = exon[x + 1] - cdspos + cdslength;
-          break;
+          // System.err
+          // .println("Truncating final exon interval on region by "
+          // + (cdspos - cdslength));
         }
-      }
 
-      if (sxpos != -1)
-      {
-        // and trim the exon interval set if necessary
-        int[] nxon = new int[sxpos + 2];
-        System.arraycopy(exon, 0, nxon, 0, sxpos + 2);
-        nxon[sxpos + 1] = endxon; // update the end boundary for the new exon
-                                  // set
-        exon = nxon;
+        /*
+         * shrink the final exon - reduce end position if forward
+         * strand, increase it if reverse
+         */
+        if (exon[x + 1] >= exon[x])
+        {
+          endxon = exon[x + 1] - cdspos + desiredCdsLength;
+        }
+        else
+        {
+          endxon = exon[x + 1] + cdspos - desiredCdsLength;
+        }
+        break;
       }
     }
+
+    if (sxpos != -1)
+    {
+      // and trim the exon interval set if necessary
+      int[] nxon = new int[sxpos + 2];
+      System.arraycopy(exon, 0, nxon, 0, sxpos + 2);
+      nxon[sxpos + 1] = endxon; // update the end boundary for the new exon
+                                // set
+      exon = nxon;
+    }
     return exon;
   }
 }
index eb0bee7..9774004 100644 (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 &lt;loctaion&gt; child element of a &lt;feature&gt; read
+ * Data model for a &lt;location&gt; child element of a &lt;feature&gt; 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
 {
@@ -101,21 +106,21 @@ public class EmblFeatureLocations
   }
 
   /**
-   * Return all location elements concerning given accession as start-end pairs
-   * TODO: pass back complement and 'less than or more than' range information
-   * TODO: deal with multiple accessions
+   * 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 null or int[] { start1, end1, ... }
+   * @return int[] { start1, end1, ... }
    */
-
-  public int[] getElementRanges(String accession)
+  int[] getElementRanges(String accession)
   {
     int sepos = 0;
     int[] se = new int[locElements.size() * 2];
-    if (locationType.equalsIgnoreCase("single")) // TODO: or "simple" ?
+    if ("single".equalsIgnoreCase(locationType)
+            || "join".equalsIgnoreCase(locationType))
     {
       for (EmblFeatureLocElement loce : locElements)
       {
@@ -125,50 +130,61 @@ public class EmblFeatureLocations
           BasePosition bp[] = loce.getBasePositions();
           if (bp.length == 2)
           {
-            se[sepos++] = Integer.parseInt(bp[0].getPos());
-            se[sepos++] = Integer.parseInt(bp[1].getPos());
+            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 if (locationType.equalsIgnoreCase("join"))
-    {
-      for (EmblFeatureLocElement loce : locElements)
-      {
-        if (accession == null || loce.accession != null
-                && accession.equals(loce.accession))
-        {
-          BasePosition bp[] = loce.getBasePositions();
-          if (bp.length == 2)
+          else
           {
-            se[sepos++] = Integer.parseInt(bp[0].getPos());
-            se[sepos++] = Integer.parseInt(bp[1].getPos());
+            System.err
+                    .println("format error in EMBL CDS location, basePosition count = "
+                            + bp.length);
           }
         }
       }
-      return se;
     }
     else if (locationType != null)
     {
-      if (jalview.bin.Cache.log != null)
+      if (Cache.log != null)
       {
-        jalview.bin.Cache.log
-                .error("EmbleFeatureLocations.getElementRanges cannot deal with locationType=='"
+        Cache.log
+                .error("EmblFeatureLocations.getElementRanges cannot deal with locationType=='"
                         + locationType + "'");
       }
       else
       {
         System.err
-                .println("EmbleFeatureLocations.getElementRanges cannot deal with locationType=='"
+                .println("EmblFeatureLocations.getElementRanges cannot deal with locationType=='"
                         + locationType + "'");
       }
     }
-    // trim range if necessary.
-    if (se != null && sepos != se.length)
+
+    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)
     {
-      int[] trimmed = new int[sepos];
-      System.arraycopy(se, 0, trimmed, 0, sepos);
-      se = trimmed;
+      ArrayUtils.reverseIntArray(se);
     }
     return se;
   }
index e0b5ede..69870b6 100644 (file)
@@ -20,6 +20,9 @@
  */
 package jalview.datamodel.xdb.embl;
 
+import jalview.datamodel.DBRefEntry;
+import jalview.ws.dbsources.Uniprot;
+
 import java.io.File;
 import java.io.FileReader;
 import java.io.PrintWriter;
@@ -129,6 +132,8 @@ public class EmblFile
       unmar.setMapping(map);
       unmar.setLogWriter(new PrintWriter(System.out));
       record = (EmblFile) unmar.unmarshal(file);
+
+      canonicaliseDbRefs(record);
     } catch (Exception e)
     {
       e.printStackTrace(System.err);
@@ -137,4 +142,45 @@ public class EmblFile
 
     return record;
   }
+
+  /**
+   * Change blank version to "0" in any DBRefEntry, to ensure consistent
+   * comparison with other DBRefEntry in Jalview
+   * 
+   * @param record
+   * @see Uniprot#getDbVersion
+   */
+  static void canonicaliseDbRefs(EmblFile record)
+  {
+    for (EmblEntry entry : record.getEntries())
+    {
+      if (entry.getDbRefs() != null)
+      {
+        for (DBRefEntry dbref : entry.getDbRefs())
+        {
+          if ("".equals(dbref.getVersion()))
+          {
+            dbref.setVersion("0");
+          }
+        }
+      }
+
+      if (entry.getFeatures() != null)
+      {
+        for (EmblFeature feature : entry.getFeatures())
+        {
+          if (feature.getDbRefs() != null)
+          {
+            for (DBRefEntry dbref : feature.getDbRefs())
+            {
+              if ("".equals(dbref.getVersion()))
+              {
+                dbref.setVersion("0");
+              }
+            }
+          }
+        }
+      }
+    }
+  }
 }
diff --git a/src/jalview/ext/ensembl/EnsemblCdna.java b/src/jalview/ext/ensembl/EnsemblCdna.java
new file mode 100644 (file)
index 0000000..e141db4
--- /dev/null
@@ -0,0 +1,111 @@
+package jalview.ext.ensembl;
+
+import jalview.datamodel.SequenceFeature;
+import jalview.io.gff.SequenceOntologyFactory;
+import jalview.io.gff.SequenceOntologyI;
+
+import com.stevesoft.pat.Regex;
+
+/**
+ * A client to fetch CDNA sequence from Ensembl (i.e. that part of the genomic
+ * sequence that is transcribed to RNA, but not necessarily translated to
+ * protein)
+ * 
+ * @author gmcarstairs
+ *
+ */
+public class EnsemblCdna extends EnsemblSeqProxy
+{
+  /*
+   * accepts ENST or ENSTG with 11 digits
+   * or ENSMUST or similar for other species
+   * or CCDSnnnnn.nn with at least 3 digits
+   */
+  private static final Regex ACCESSION_REGEX = new Regex(
+          "(ENS([A-Z]{3}|)[TG][0-9]{11}$)" + "|" + "(CCDS[0-9.]{3,}$)");
+  
+  /*
+   * fetch exon features on genomic sequence (to identify the cdna regions)
+   * and cds and variation features (to retain)
+   */
+  private static final EnsemblFeatureType[] FEATURES_TO_FETCH = {
+      EnsemblFeatureType.exon, EnsemblFeatureType.cds,
+      EnsemblFeatureType.variation };
+
+  /**
+   * Default constructor (to use rest.ensembl.org)
+   */
+  public EnsemblCdna()
+  {
+    super();
+  }
+
+  /**
+   * Constructor given the target domain to fetch data from
+   * 
+   * @param d
+   */
+  public EnsemblCdna(String d)
+  {
+    super(d);
+  }
+
+  @Override
+  public String getDbName()
+  {
+    return "ENSEMBL (CDNA)";
+  }
+
+  @Override
+  protected EnsemblSeqType getSourceEnsemblType()
+  {
+    return EnsemblSeqType.CDNA;
+  }
+
+  @Override
+  public Regex getAccessionValidator()
+  {
+    return ACCESSION_REGEX;
+  }
+
+  @Override
+  protected EnsemblFeatureType[] getFeaturesToFetch()
+  {
+    return FEATURES_TO_FETCH;
+  }
+
+  /**
+   * Answers true unless the feature type is 'transcript' (or a sub-type in the
+   * Sequence Ontology).
+   */
+  @Override
+  protected boolean retainFeature(SequenceFeature sf, String accessionId)
+  {
+    if (isTranscript(sf.getType()))
+    {
+      return false;
+    }
+    return featureMayBelong(sf, accessionId);
+  }
+
+  /**
+   * Answers true if the sequence feature type is 'exon' (or a subtype of exon
+   * in the Sequence Ontology), and the Parent of the feature is the transcript
+   * we are retrieving
+   */
+  @Override
+  protected boolean identifiesSequence(SequenceFeature sf, String accId)
+  {
+    if (SequenceOntologyFactory.getInstance().isA(sf.getType(),
+            SequenceOntologyI.EXON))
+    {
+      String parentFeature = (String) sf.getValue(PARENT);
+      if (("transcript:" + accId).equals(parentFeature))
+      {
+        return true;
+      }
+    }
+    return false;
+  }
+
+}
diff --git a/src/jalview/ext/ensembl/EnsemblCds.java b/src/jalview/ext/ensembl/EnsemblCds.java
new file mode 100644 (file)
index 0000000..2086eba
--- /dev/null
@@ -0,0 +1,118 @@
+package jalview.ext.ensembl;
+
+import jalview.datamodel.SequenceFeature;
+import jalview.datamodel.SequenceI;
+import jalview.io.gff.SequenceOntologyFactory;
+import jalview.io.gff.SequenceOntologyI;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * A client for direct fetching of CDS sequences from Ensembl (i.e. that part of
+ * the genomic sequence that is translated to protein)
+ * 
+ * TODO: not currently used as CDS sequences are computed from CDS features on
+ * transcripts - delete this class?
+ * 
+ * @author gmcarstairs
+ *
+ */
+public class EnsemblCds extends EnsemblSeqProxy
+{
+  /*
+   * fetch cds features on genomic sequence (to identify the CDS regions)
+   * and exon and variation features (to retain for display)
+   */
+  private static final EnsemblFeatureType[] FEATURES_TO_FETCH = {
+      EnsemblFeatureType.cds, EnsemblFeatureType.exon,
+      EnsemblFeatureType.variation };
+
+  /**
+   * Default constructor (to use rest.ensembl.org)
+   */
+  public EnsemblCds()
+  {
+    super();
+  }
+
+  /**
+   * Constructor given the target domain to fetch data from
+   * 
+   * @param d
+   */
+  public EnsemblCds(String d)
+  {
+    super(d);
+  }
+
+  @Override
+  public String getDbName()
+  {
+    return "ENSEMBL (CDS)";
+  }
+
+  @Override
+  protected EnsemblSeqType getSourceEnsemblType()
+  {
+    return EnsemblSeqType.CDS;
+  }
+
+  @Override
+  protected EnsemblFeatureType[] getFeaturesToFetch()
+  {
+    return FEATURES_TO_FETCH;
+  }
+
+  /**
+   * Answers true unless the feature type is 'CDS' (or a sub-type of CDS in the
+   * Sequence Ontology). CDS features are only retrieved in order to identify
+   * the cds sequence range, and are redundant information on the cds sequence
+   * itself.
+   */
+  @Override
+  protected boolean retainFeature(SequenceFeature sf, String accessionId)
+  {
+    if (SequenceOntologyFactory.getInstance().isA(sf.getType(),
+            SequenceOntologyI.CDS))
+    {
+      return false;
+    }
+    return featureMayBelong(sf, accessionId);
+  }
+
+  /**
+   * Answers true if the sequence feature type is 'CDS' (or a subtype of CDS in
+   * the Sequence Ontology), and the Parent of the feature is the transcript we
+   * are retrieving
+   */
+  @Override
+  protected boolean identifiesSequence(SequenceFeature sf, String accId)
+  {
+    if (SequenceOntologyFactory.getInstance().isA(sf.getType(),
+            SequenceOntologyI.CDS))
+    {
+      String parentFeature = (String) sf.getValue(PARENT);
+      if (("transcript:" + accId).equals(parentFeature))
+      {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Overrides this method to trivially return a range which is the whole of the
+   * nucleotide sequence. This is both faster than scanning for CDS features,
+   * and also means we don't need to keep CDS features on CDS sequence (where
+   * they are redundant information).
+   */
+  protected List<int[]> getCdsRanges(SequenceI dnaSeq)
+  {
+    int len = dnaSeq.getLength();
+    List<int[]> ranges = new ArrayList<int[]>();
+    ranges.add(new int[] { 1, len });
+    return ranges;
+  }
+
+}
diff --git a/src/jalview/ext/ensembl/EnsemblFeatures.java b/src/jalview/ext/ensembl/EnsemblFeatures.java
new file mode 100644 (file)
index 0000000..0547433
--- /dev/null
@@ -0,0 +1,141 @@
+package jalview.ext.ensembl;
+
+import jalview.datamodel.Alignment;
+import jalview.datamodel.AlignmentI;
+import jalview.io.FeaturesFile;
+import jalview.io.FileParse;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * A client for fetching and processing Ensembl feature data in GFF format by
+ * calling the overlap REST service
+ * 
+ * @author gmcarstairs
+ * @see http://rest.ensembl.org/documentation/info/overlap_id
+ */
+class EnsemblFeatures extends EnsemblRestClient
+{
+  /*
+   * The default features to retrieve from Ensembl
+   * can override in getSequenceRecords parameter
+   */
+  private EnsemblFeatureType[] featuresWanted = { EnsemblFeatureType.cds,
+      EnsemblFeatureType.exon, EnsemblFeatureType.variation };
+
+  /**
+   * Default constructor (to use rest.ensembl.org)
+   */
+  public EnsemblFeatures()
+  {
+    super();
+  }
+
+  /**
+   * Constructor given the target domain to fetch data from
+   * 
+   * @param d
+   */
+  public EnsemblFeatures(String d)
+  {
+    super(d);
+  }
+
+  @Override
+  public String getDbName()
+  {
+    return "ENSEMBL (features)";
+  }
+
+  /**
+   * Makes a query to the REST overlap endpoint for the given sequence
+   * identifier. This returns an 'alignment' consisting of one 'dummy sequence'
+   * (the genomic sequence for which overlap features are returned by the
+   * service). This sequence will have on it sequence features which are the
+   * real information of interest, such as CDS regions or sequence variations.
+   */
+  @Override
+  public AlignmentI getSequenceRecords(String query) throws IOException
+  {
+    // TODO: use a vararg String... for getSequenceRecords instead?
+    List<String> queries = new ArrayList<String>();
+    queries.add(query);
+    FileParse fp = getSequenceReader(queries);
+    FeaturesFile fr = new FeaturesFile(fp);
+    return new Alignment(fr.getSeqsAsArray());
+  }
+
+  /**
+   * Returns a URL for the REST overlap endpoint
+   * 
+   * @param ids
+   * @return
+   */
+  @Override
+  protected URL getUrl(List<String> ids) throws MalformedURLException
+  {
+    StringBuffer urlstring = new StringBuffer(128);
+    urlstring.append(getDomain()).append("/overlap/id/")
+            .append(ids.get(0));
+
+    // @see https://github.com/Ensembl/ensembl-rest/wiki/Output-formats
+    urlstring.append("?content-type=text/x-gff3");
+
+    /*
+     * specify  features to retrieve
+     * @see http://rest.ensembl.org/documentation/info/overlap_id
+     * could make the list a configurable entry in jalview.properties
+     */
+    for (EnsemblFeatureType feature : featuresWanted)
+    {
+      urlstring.append("&feature=").append(feature.name());
+    }
+
+    return new URL(urlstring.toString());
+  }
+
+  @Override
+  protected boolean useGetRequest()
+  {
+    return true;
+  }
+
+  /**
+   * Returns the MIME type for GFF3. For GET requests the Content-type header
+   * describes the required encoding of the response.
+   */
+  @Override
+  protected String getRequestMimeType(boolean multipleIds)
+  {
+    return "text/x-gff3";
+  }
+
+  /**
+   * Returns the MIME type for GFF3.
+   */
+  @Override
+  protected String getResponseMimeType()
+  {
+    return "text/x-gff3";
+  }
+
+  /**
+   * Overloaded method that allows a list of features to retrieve to be
+   * specified
+   * 
+   * @param accId
+   * @param features
+   * @return
+   * @throws IOException
+   */
+  protected AlignmentI getSequenceRecords(String accId,
+          EnsemblFeatureType[] features) throws IOException
+  {
+    featuresWanted = features;
+    return getSequenceRecords(accId);
+  }
+}
diff --git a/src/jalview/ext/ensembl/EnsemblGene.java b/src/jalview/ext/ensembl/EnsemblGene.java
new file mode 100644 (file)
index 0000000..b4d2783
--- /dev/null
@@ -0,0 +1,590 @@
+package jalview.ext.ensembl;
+
+import jalview.api.FeatureColourI;
+import jalview.api.FeatureSettingsModelI;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.Sequence;
+import jalview.datamodel.SequenceFeature;
+import jalview.datamodel.SequenceI;
+import jalview.io.gff.SequenceOntologyFactory;
+import jalview.io.gff.SequenceOntologyI;
+import jalview.schemes.FeatureColour;
+import jalview.schemes.FeatureSettingsAdapter;
+import jalview.util.MapList;
+
+import java.awt.Color;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import com.stevesoft.pat.Regex;
+
+/**
+ * A class that fetches genomic sequence and all transcripts for an Ensembl gene
+ * 
+ * @author gmcarstairs
+ */
+public class EnsemblGene extends EnsemblSeqProxy
+{
+  private static final String GENE_PREFIX = "gene:";
+
+  /*
+   * accepts anything as we will attempt lookup of gene or 
+   * transcript id or gene name
+   */
+  private static final Regex ACCESSION_REGEX = new Regex(".*");
+
+  private static final EnsemblFeatureType[] FEATURES_TO_FETCH = {
+      EnsemblFeatureType.gene, EnsemblFeatureType.transcript,
+      EnsemblFeatureType.exon, EnsemblFeatureType.cds,
+      EnsemblFeatureType.variation };
+
+  /**
+   * Default constructor (to use rest.ensembl.org)
+   */
+  public EnsemblGene()
+  {
+    super();
+  }
+
+  /**
+   * Constructor given the target domain to fetch data from
+   * 
+   * @param d
+   */
+  public EnsemblGene(String d)
+  {
+    super(d);
+  }
+
+  @Override
+  public String getDbName()
+  {
+    return "ENSEMBL";
+  }
+
+  @Override
+  protected EnsemblFeatureType[] getFeaturesToFetch()
+  {
+    return FEATURES_TO_FETCH;
+  }
+
+  @Override
+  protected EnsemblSeqType getSourceEnsemblType()
+  {
+    return EnsemblSeqType.GENOMIC;
+  }
+
+  /**
+   * Returns an alignment containing the gene(s) for the given gene or
+   * transcript identifier, or external identifier (e.g. Uniprot id). If given a
+   * gene name or external identifier, returns any related gene sequences found
+   * for model organisms. If only a single gene is queried for, then its
+   * transcripts are also retrieved and added to the alignment. <br>
+   * Method:
+   * <ul>
+   * <li>resolves a transcript identifier by looking up its parent gene id</li>
+   * <li>resolves an external identifier by looking up xref-ed gene ids</li>
+   * <li>fetches the gene sequence</li>
+   * <li>fetches features on the sequence</li>
+   * <li>identifies "transcript" features whose Parent is the requested gene</li>
+   * <li>fetches the transcript sequence for each transcript</li>
+   * <li>makes a mapping from the gene to each transcript</li>
+   * <li>copies features from gene to transcript sequences</li>
+   * <li>fetches the protein sequence for each transcript, maps and saves it as
+   * a cross-reference</li>
+   * <li>aligns each transcript against the gene sequence based on the position
+   * mappings</li>
+   * </ul>
+   * 
+   * @param query
+   *          a single gene or transcript identifier or gene name
+   * @return an alignment containing a gene, and possibly transcripts, or null
+   */
+  @Override
+  public AlignmentI getSequenceRecords(String query) throws Exception
+  {
+    /*
+     * convert to a non-duplicated list of gene identifiers
+     */
+    List<String> geneIds = getGeneIds(query);
+
+    AlignmentI al = null;
+    for (String geneId : geneIds)
+    {
+      /*
+       * fetch the gene sequence(s) with features and xrefs
+       */
+      AlignmentI geneAlignment = super.getSequenceRecords(geneId);
+
+      if (geneAlignment.getHeight() == 1)
+      {
+        getTranscripts(geneAlignment, geneId);
+      }
+      if (al == null)
+      {
+        al = geneAlignment;
+      }
+      else
+      {
+        al.append(geneAlignment);
+      }
+    }
+    return al;
+  }
+
+  /**
+   * Converts a query, which may contain one or more gene or transcript
+   * identifiers, into a non-redundant list of gene identifiers.
+   * 
+   * @param accessions
+   * @return
+   */
+  List<String> getGeneIds(String accessions)
+  {
+    List<String> geneIds = new ArrayList<String>();
+
+    for (String acc : accessions.split(getAccessionSeparator()))
+    {
+      if (isGeneIdentifier(acc))
+      {
+        if (!geneIds.contains(acc))
+        {
+          geneIds.add(acc);
+        }
+      }
+
+      /*
+       * if given a transcript id, look up its gene parent
+       */
+      else if (isTranscriptIdentifier(acc))
+      {
+        String geneId = new EnsemblLookup(getDomain()).getParent(acc);
+        if (geneId != null && !geneIds.contains(geneId))
+        {
+          geneIds.add(geneId);
+        }
+      }
+
+      /*
+       * if given a gene or other external name, lookup and fetch 
+       * the corresponding gene for all model organisms 
+       */
+      else
+      {
+        List<String> ids = new EnsemblSymbol(getDomain()).getIds(acc);
+        for (String geneId : ids)
+        {
+          if (!geneIds.contains(geneId))
+          {
+            geneIds.add(geneId);
+          }
+        }
+      }
+    }
+    return geneIds;
+  }
+
+  /**
+   * Attempts to get Ensembl stable identifiers for model organisms for a gene
+   * name by calling the xrefs symbol REST service to resolve the gene name.
+   * 
+   * @param query
+   * @return
+   */
+  protected String getGeneIdentifiersForName(String query)
+  {
+    List<String> ids = new EnsemblSymbol(getDomain()).getIds(query);
+    if (ids != null)
+    {
+      for (String id : ids)
+      {
+        if (isGeneIdentifier(id))
+        {
+          return id;
+        }
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Constructs all transcripts for the gene, as identified by "transcript"
+   * features whose Parent is the requested gene. The coding transcript
+   * sequences (i.e. with introns omitted) are added to the alignment.
+   * 
+   * @param al
+   * @param accId
+   * @throws Exception
+   */
+  protected void getTranscripts(AlignmentI al, String accId)
+          throws Exception
+  {
+    SequenceI gene = al.getSequenceAt(0);
+    List<SequenceFeature> transcriptFeatures = getTranscriptFeatures(accId,
+            gene);
+
+    for (SequenceFeature transcriptFeature : transcriptFeatures)
+    {
+      makeTranscript(transcriptFeature, al, gene);
+    }
+
+    clearGeneFeatures(gene);
+  }
+
+  /**
+   * Remove unwanted features (transcript, exon, CDS) from the gene sequence
+   * after we have used them to derive transcripts and transfer features
+   * 
+   * @param gene
+   */
+  protected void clearGeneFeatures(SequenceI gene)
+  {
+    SequenceFeature[] sfs = gene.getSequenceFeatures();
+    if (sfs != null)
+    {
+      SequenceOntologyI so = SequenceOntologyFactory.getInstance();
+      List<SequenceFeature> filtered = new ArrayList<SequenceFeature>();
+      for (SequenceFeature sf : sfs)
+      {
+        String type = sf.getType();
+        if (!isTranscript(type) && !so.isA(type, SequenceOntologyI.EXON)
+                && !so.isA(type, SequenceOntologyI.CDS))
+        {
+          filtered.add(sf);
+        }
+      }
+      gene.setSequenceFeatures(filtered
+              .toArray(new SequenceFeature[filtered
+              .size()]));
+    }
+  }
+
+  /**
+   * Constructs a spliced transcript sequence by finding 'exon' features for the
+   * given id (or failing that 'CDS'). Copies features on to the new sequence.
+   * 'Aligns' the new sequence against the gene sequence by padding with gaps,
+   * and adds it to the alignment.
+   * 
+   * @param transcriptFeature
+   * @param al
+   *          the alignment to which to add the new sequence
+   * @param gene
+   *          the parent gene sequence, with features
+   * @return
+   */
+  SequenceI makeTranscript(SequenceFeature transcriptFeature,
+          AlignmentI al, SequenceI gene)
+  {
+    String accId = getTranscriptId(transcriptFeature);
+    if (accId == null)
+    {
+      return null;
+    }
+
+    /*
+     * NB we are mapping from gene sequence (not genome), so do not
+     * need to check for reverse strand (gene and transcript sequences 
+     * are in forward sense)
+     */
+
+    /*
+     * make a gene-length sequence filled with gaps
+     * we will fill in the bases for transcript regions
+     */
+    char[] seqChars = new char[gene.getLength()];
+    Arrays.fill(seqChars, al.getGapCharacter());
+
+    /*
+     * look for exon features of the transcript, failing that for CDS
+     * (for example ENSG00000124610 has 1 CDS but no exon features)
+     */
+    String parentId = "transcript:" + accId;
+    List<SequenceFeature> splices = findFeatures(gene,
+            SequenceOntologyI.EXON, parentId);
+    if (splices.isEmpty())
+    {
+      splices = findFeatures(gene, SequenceOntologyI.CDS, parentId);
+    }
+
+    int transcriptLength = 0;
+    final char[] geneChars = gene.getSequence();
+    int offset = gene.getStart(); // to convert to 0-based positions
+    List<int[]> mappedFrom = new ArrayList<int[]>();
+
+    for (SequenceFeature sf : splices)
+    {
+      int start = sf.getBegin() - offset;
+      int end = sf.getEnd() - offset;
+      int spliceLength = end - start + 1;
+      System.arraycopy(geneChars, start, seqChars, start, spliceLength);
+      transcriptLength += spliceLength;
+      mappedFrom.add(new int[] { sf.getBegin(), sf.getEnd() });
+    }
+
+    Sequence transcript = new Sequence(accId, seqChars, 1, transcriptLength);
+
+    /*
+     * Ensembl has gene name as transcript Name
+     * EnsemblGenomes doesn't, but has a url-encoded description field
+     */
+    String description = (String) transcriptFeature.getValue(NAME);
+    if (description == null)
+    {
+      description = (String) transcriptFeature.getValue(DESCRIPTION);
+    }
+    if (description != null)
+    {
+      try
+      {
+        transcript.setDescription(URLDecoder.decode(description, "UTF-8"));
+      } catch (UnsupportedEncodingException e)
+      {
+        e.printStackTrace(); // as if
+      }
+    }
+    transcript.createDatasetSequence();
+
+    al.addSequence(transcript);
+
+    /*
+     * transfer features to the new sequence; we use EnsemblCdna to do this,
+     * to filter out unwanted features types (see method retainFeature)
+     */
+    List<int[]> mapTo = new ArrayList<int[]>();
+    mapTo.add(new int[] { 1, transcriptLength });
+    MapList mapping = new MapList(mappedFrom, mapTo, 1, 1);
+    EnsemblCdna cdna = new EnsemblCdna(getDomain());
+    cdna.transferFeatures(gene.getSequenceFeatures(),
+            transcript.getDatasetSequence(), mapping, parentId);
+
+    /*
+     * fetch and save cross-references
+     */
+    cdna.getCrossReferences(transcript);
+
+    /*
+     * and finally fetch the protein product and save as a cross-reference
+     */
+    cdna.addProteinProduct(transcript);
+
+    return transcript;
+  }
+
+  /**
+   * Returns the 'transcript_id' property of the sequence feature (or null)
+   * 
+   * @param feature
+   * @return
+   */
+  protected String getTranscriptId(SequenceFeature feature)
+  {
+    return (String) feature.getValue("transcript_id");
+  }
+
+  /**
+   * Returns a list of the transcript features on the sequence whose Parent is
+   * the gene for the accession id.
+   * 
+   * @param accId
+   * @param geneSequence
+   * @return
+   */
+  protected List<SequenceFeature> getTranscriptFeatures(String accId,
+          SequenceI geneSequence)
+  {
+    List<SequenceFeature> transcriptFeatures = new ArrayList<SequenceFeature>();
+
+    String parentIdentifier = GENE_PREFIX + accId;
+    SequenceFeature[] sfs = geneSequence.getSequenceFeatures();
+
+    if (sfs != null)
+    {
+      for (SequenceFeature sf : sfs)
+      {
+        if (isTranscript(sf.getType()))
+        {
+          String parent = (String) sf.getValue(PARENT);
+          if (parentIdentifier.equals(parent))
+          {
+            transcriptFeatures.add(sf);
+          }
+        }
+      }
+    }
+
+    return transcriptFeatures;
+  }
+
+  @Override
+  public String getDescription()
+  {
+    return "Fetches all transcripts and variant features for a gene or transcript";
+  }
+
+  /**
+   * Default test query is a gene id (can also enter a transcript id)
+   */
+  @Override
+  public String getTestQuery()
+  {
+    return "ENSG00000157764"; // BRAF, 5 transcripts, reverse strand
+    // ENSG00000090266 // NDUFB2, 15 transcripts, forward strand
+    // ENSG00000101812 // H2BFM histone, 3 transcripts, forward strand
+    // ENSG00000123569 // H2BFWT histone, 2 transcripts, reverse strand
+  }
+
+  /**
+   * Answers true for a feature of type 'gene' (or a sub-type of gene in the
+   * Sequence Ontology), whose ID is the accession we are retrieving
+   */
+  @Override
+  protected boolean identifiesSequence(SequenceFeature sf, String accId)
+  {
+    if (SequenceOntologyFactory.getInstance().isA(sf.getType(),
+            SequenceOntologyI.GENE))
+    {
+      String id = (String) sf.getValue(ID);
+      if ((GENE_PREFIX + accId).equals(id))
+      {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Answers true unless feature type is 'gene', or 'transcript' with a parent
+   * which is a different gene. We need the gene features to identify the range,
+   * but it is redundant information on the gene sequence. Checking the parent
+   * allows us to drop transcript features which belong to different
+   * (overlapping) genes.
+   */
+  @Override
+  protected boolean retainFeature(SequenceFeature sf, String accessionId)
+  {
+    SequenceOntologyI so = SequenceOntologyFactory.getInstance();
+    String type = sf.getType();
+    if (so.isA(type, SequenceOntologyI.GENE))
+    {
+      return false;
+    }
+    if (isTranscript(type))
+    {
+      String parent = (String) sf.getValue(PARENT);
+      if (!(GENE_PREFIX + accessionId).equals(parent))
+      {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  /**
+   * Answers false. This allows an optimisation - a single 'gene' feature is all
+   * that is needed to identify the positions of the gene on the genomic
+   * sequence.
+   */
+  @Override
+  protected boolean isSpliceable()
+  {
+    return false;
+  }
+
+  /**
+   * Override to do nothing as Ensembl doesn't return a protein sequence for a
+   * gene identifier
+   */
+  @Override
+  protected void addProteinProduct(SequenceI querySeq)
+  {
+  }
+
+  @Override
+  public Regex getAccessionValidator()
+  {
+    return ACCESSION_REGEX;
+  }
+
+  /**
+   * Returns a descriptor for suitable feature display settings with
+   * <ul>
+   * <li>only exon or sequence_variant features (or their subtypes in the
+   * Sequence Ontology) visible</li>
+   * <li>variant features coloured red</li>
+   * <li>exon features coloured by label (exon name)</li>
+   * <li>variants displayed above (on top of) exons</li>
+   * </ul>
+   */
+  @Override
+  public FeatureSettingsModelI getFeatureColourScheme()
+  {
+    return new FeatureSettingsAdapter()
+    {
+      SequenceOntologyI so = SequenceOntologyFactory.getInstance();
+      @Override
+      public boolean isFeatureDisplayed(String type)
+      {
+        return (so.isA(type, SequenceOntologyI.EXON) || so.isA(type,
+                SequenceOntologyI.SEQUENCE_VARIANT));
+      }
+
+      @Override
+      public FeatureColourI getFeatureColour(String type)
+      {
+        if (so.isA(type, SequenceOntologyI.EXON))
+        {
+          return new FeatureColour()
+          {
+            @Override
+            public boolean isColourByLabel()
+            {
+              return true;
+            }
+          };
+        }
+        if (so.isA(type, SequenceOntologyI.SEQUENCE_VARIANT))
+        {
+          return new FeatureColour()
+          {
+
+            @Override
+            public Color getColour()
+            {
+              return Color.RED;
+            }
+          };
+        }
+        return null;
+      }
+
+      /**
+       * order to render sequence_variant after exon after the rest
+       */
+      @Override
+      public int compare(String feature1, String feature2)
+      {
+        if (so.isA(feature1, SequenceOntologyI.SEQUENCE_VARIANT))
+        {
+          return +1;
+        }
+        if (so.isA(feature2, SequenceOntologyI.SEQUENCE_VARIANT))
+        {
+          return -1;
+        }
+        if (so.isA(feature1, SequenceOntologyI.EXON))
+        {
+          return +1;
+        }
+        if (so.isA(feature2, SequenceOntologyI.EXON))
+        {
+          return -1;
+        }
+        return 0;
+      }
+    };
+  }
+
+}
diff --git a/src/jalview/ext/ensembl/EnsemblGenome.java b/src/jalview/ext/ensembl/EnsemblGenome.java
new file mode 100644 (file)
index 0000000..20987e1
--- /dev/null
@@ -0,0 +1,95 @@
+package jalview.ext.ensembl;
+
+import jalview.datamodel.SequenceFeature;
+
+/**
+ * A client to fetch genomic sequence from Ensembl
+ * 
+ * TODO: not currently used - delete?
+ * 
+ * @author gmcarstairs
+ *
+ */
+public class EnsemblGenome extends EnsemblSeqProxy
+{
+  /*
+   * fetch transcript features on genomic sequence (to identify the transcript 
+   * regions) and cds, exon and variation features (to retain)
+   */
+  private static final EnsemblFeatureType[] FEATURES_TO_FETCH = {
+      EnsemblFeatureType.transcript, EnsemblFeatureType.exon,
+      EnsemblFeatureType.cds, EnsemblFeatureType.variation };
+
+  /**
+   * Default constructor (to use rest.ensembl.org)
+   */
+  public EnsemblGenome()
+  {
+    super();
+  }
+
+  /**
+   * Constructor given the target domain to fetch data from
+   * 
+   * @param d
+   */
+  public EnsemblGenome(String d)
+  {
+    super(d);
+  }
+
+  @Override
+  public String getDbName()
+  {
+    return "ENSEMBL (Genomic)";
+  }
+
+  @Override
+  protected EnsemblSeqType getSourceEnsemblType()
+  {
+    return EnsemblSeqType.GENOMIC;
+  }
+
+  @Override
+  protected EnsemblFeatureType[] getFeaturesToFetch()
+  {
+    return FEATURES_TO_FETCH;
+  }
+
+  /**
+   * Answers true unless the feature type is 'transcript' (or a sub-type of
+   * transcript in the Sequence Ontology), or has a parent other than the given
+   * accession id. Transcript features are only retrieved in order to identify
+   * the transcript sequence range, and are redundant information on the
+   * transcript sequence itself.
+   */
+  @Override
+  protected boolean retainFeature(SequenceFeature sf, String accessionId)
+  {
+    if (isTranscript(sf.getType()))
+    {
+      return false;
+    }
+    return featureMayBelong(sf, accessionId);
+  }
+
+  /**
+   * Answers true if the sequence feature type is 'transcript' (or a subtype of
+   * transcript in the Sequence Ontology), and the ID of the feature is the
+   * transcript we are retrieving
+   */
+  @Override
+  protected boolean identifiesSequence(SequenceFeature sf, String accId)
+  {
+    if (isTranscript(sf.getType()))
+    {
+      String id = (String) sf.getValue(ID);
+      if (("transcript:" + accId).equals(id))
+      {
+        return true;
+      }
+    }
+    return false;
+  }
+
+}
diff --git a/src/jalview/ext/ensembl/EnsemblGenomes.java b/src/jalview/ext/ensembl/EnsemblGenomes.java
new file mode 100644 (file)
index 0000000..9ba2e1c
--- /dev/null
@@ -0,0 +1,46 @@
+package jalview.ext.ensembl;
+
+
+/**
+ * A class to behave much like EnsemblGene but referencing the ensemblgenomes
+ * domain and data
+ * 
+ * @author gmcarstairs
+ *
+ */
+public class EnsemblGenomes extends EnsemblGene
+{
+  /**
+   * Constructor sets domain to rest.ensemblgenomes.org instead of the 'usual'
+   * rest.ensembl.org
+   */
+  public EnsemblGenomes()
+  {
+    super(ENSEMBL_GENOMES_REST);
+  }
+
+  @Override
+  public boolean isGeneIdentifier(String query)
+  {
+    return true;
+  }
+
+  @Override
+  public String getDbName()
+  {
+    return "EnsemblGenomes";
+  }
+
+  @Override
+  public String getTestQuery()
+  {
+    return "DDB_G0283883";
+  }
+
+  @Override
+  public String getDbSource()
+  {
+    return "EnsemblGenomes";
+  }
+
+}
diff --git a/src/jalview/ext/ensembl/EnsemblLookup.java b/src/jalview/ext/ensembl/EnsemblLookup.java
new file mode 100644 (file)
index 0000000..c5945ae
--- /dev/null
@@ -0,0 +1,160 @@
+package jalview.ext.ensembl;
+
+import jalview.datamodel.AlignmentI;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Arrays;
+import java.util.List;
+
+import org.json.simple.JSONObject;
+import org.json.simple.parser.JSONParser;
+import org.json.simple.parser.ParseException;
+
+/**
+ * A client for the Ensembl lookup REST endpoint; used to find the Parent gene
+ * identifier given a transcript identifier.
+ * 
+ * @author gmcarstairs
+ *
+ */
+public class EnsemblLookup extends EnsemblRestClient
+{
+
+  /**
+   * Default constructor (to use rest.ensembl.org)
+   */
+  public EnsemblLookup()
+  {
+    super();
+  }
+
+  /**
+   * Constructor given the target domain to fetch data from
+   * 
+   * @param
+   */
+  public EnsemblLookup(String d)
+  {
+    super(d);
+  }
+
+  @Override
+  public String getDbName()
+  {
+    return "ENSEMBL";
+  }
+
+  @Override
+  public AlignmentI getSequenceRecords(String queries) throws Exception
+  {
+    return null;
+  }
+
+  @Override
+  protected URL getUrl(List<String> ids) throws MalformedURLException
+  {
+    String identifier = ids.get(0);
+    return getUrl(identifier);
+  }
+
+  /**
+   * @param identifier
+   * @return
+   */
+  protected URL getUrl(String identifier)
+  {
+    String url = getDomain() + "/lookup/id/" + identifier
+            + "?content-type=application/json";
+    try
+    {
+      return new URL(url);
+    } catch (MalformedURLException e)
+    {
+      return null;
+    }
+  }
+
+  @Override
+  protected boolean useGetRequest()
+  {
+    return true;
+  }
+
+  @Override
+  protected String getRequestMimeType(boolean multipleIds)
+  {
+    return "application/json";
+  }
+
+  @Override
+  protected String getResponseMimeType()
+  {
+    return "application/json";
+  }
+
+  /**
+   * Calls the Ensembl lookup REST endpoint and retrieves the 'Parent' for the
+   * given identifier, or null if not found
+   * 
+   * @param identifier
+   * @return
+   */
+  public String getParent(String identifier)
+  {
+    List<String> ids = Arrays.asList(new String[] { identifier });
+  
+    BufferedReader br = null;
+    try
+    {
+      URL url = getUrl(identifier);
+      if (url != null)
+      {
+        br = getHttpResponse(url, ids);
+      }
+      return (parseResponse(br));
+    } catch (IOException e)
+    {
+      // ignore
+      return null;
+    } finally
+    {
+      if (br != null)
+      {
+        try
+        {
+          br.close();
+        } catch (IOException e)
+        {
+          // ignore
+        }
+      }
+    }
+  }
+
+  /**
+   * Parses "Parent" from the JSON response and returns the value, or null if
+   * not found
+   * 
+   * @param br
+   * @return
+   * @throws IOException
+   */
+  protected String parseResponse(BufferedReader br) throws IOException
+  {
+    String parent = null;
+    JSONParser jp = new JSONParser();
+    try
+    {
+      JSONObject val = (JSONObject) jp.parse(br);
+      parent = val.get("Parent").toString();
+    } catch (ParseException e)
+    {
+      // ignore
+    }
+    return parent;
+  }
+
+}
diff --git a/src/jalview/ext/ensembl/EnsemblProtein.java b/src/jalview/ext/ensembl/EnsemblProtein.java
new file mode 100644 (file)
index 0000000..0facbb5
--- /dev/null
@@ -0,0 +1,127 @@
+package jalview.ext.ensembl;
+
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.SequenceFeature;
+
+import java.util.List;
+
+import com.stevesoft.pat.Regex;
+
+/**
+ * A client to fetch protein translated sequence for an Ensembl identifier
+ * 
+ * @author gmcarstairs
+ *
+ */
+public class EnsemblProtein extends EnsemblSeqProxy
+{
+  /*
+   * accepts ENSP with 11 digits
+   * or ENSMUSP or similar for other species
+   * or CCDSnnnnn.nn with at least 3 digits
+   */
+  private static final Regex ACCESSION_REGEX = new Regex(
+          "(ENS([A-Z]{3}|)P[0-9]{11}$)" + "|" + "(CCDS[0-9.]{3,}$)");
+
+  /**
+   * Default constructor (to use rest.ensembl.org)
+   */
+  public EnsemblProtein()
+  {
+    super();
+  }
+
+  /**
+   * Constructor given the target domain to fetch data from
+   * 
+   * @param d
+   */
+  public EnsemblProtein(String d)
+  {
+    super(d);
+  }
+
+  @Override
+  public String getDbName()
+  {
+    return "ENSEMBL (Protein)";
+  }
+
+  @Override
+  protected EnsemblSeqType getSourceEnsemblType()
+  {
+    return EnsemblSeqType.PROTEIN;
+  }
+
+  /**
+   * Returns false, as this fetcher does not retrieve DNA sequences.
+   */
+  @Override
+  public boolean isDnaCoding()
+  {
+    return false;
+  }
+
+  /**
+   * Test query is to the protein translation of transcript ENST00000288602
+   */
+  @Override
+  public String getTestQuery()
+  {
+    return "ENSP00000288602";
+  }
+
+  /**
+   * Overrides base class method to do nothing - genomic features are not
+   * applicable to the protein product sequence
+   */
+  @Override
+  protected void addFeaturesAndProduct(String accId, AlignmentI alignment)
+  {
+  }
+
+  @Override
+  protected EnsemblFeatureType[] getFeaturesToFetch()
+  {
+    // not applicable - can't fetch genomic features for a protein sequence
+    return null;
+  }
+
+  @Override
+  protected boolean identifiesSequence(SequenceFeature sf, String accId)
+  {
+    // not applicable - protein sequence is not a 'subset' of genomic sequence
+    return false;
+  }
+
+  @Override
+  public Regex getAccessionValidator()
+  {
+    return ACCESSION_REGEX;
+  }
+
+  /**
+   * Returns an accession id for a query, including conversion of ENST* to
+   * ENSP*. This supports querying for the protein sequence for a transcript
+   * (ENST identifier) and returning the ENSP identifier.
+   */
+  @Override
+  public String getAccessionIdFromQuery(String query)
+  {
+    String accId = super.getAccessionIdFromQuery(query);
+
+    /*
+     * ensure last character before (11) digits is P
+     * ENST00000288602 -> ENSP00000288602
+     * ENSMUST00000288602 -> ENSMUSP00000288602
+     */
+    if (accId != null && accId.length() >= 12)
+    {
+      char[] chars = accId.toCharArray();
+      chars[chars.length - 12] = 'P';
+      accId = new String(chars);
+    }
+    return accId;
+  }
+
+}
diff --git a/src/jalview/ext/ensembl/EnsemblRestClient.java b/src/jalview/ext/ensembl/EnsemblRestClient.java
new file mode 100644 (file)
index 0000000..6a564f1
--- /dev/null
@@ -0,0 +1,381 @@
+package jalview.ext.ensembl;
+
+import jalview.io.FileParse;
+
+import java.io.BufferedReader;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.List;
+
+import javax.ws.rs.HttpMethod;
+
+import com.stevesoft.pat.Regex;
+
+/**
+ * Base class for Ensembl REST service clients
+ * 
+ * @author gmcarstairs
+ */
+abstract class EnsemblRestClient extends EnsemblSequenceFetcher
+{
+  private final static String ENSEMBL_REST = "http://rest.ensembl.org";
+
+  protected final static String ENSEMBL_GENOMES_REST = "http://rest.ensemblgenomes.org";
+
+  // @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 static final Regex TRANSCRIPT_REGEX = new Regex(
+            "(ENS)([A-Z]{3}|)T[0-9]{11}$");
+
+  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;
+
+  protected volatile boolean inProgress = false;
+
+  /**
+   * Default constructor to use rest.ensembl.org
+   */
+  public EnsemblRestClient()
+  {
+    this(ENSEMBL_REST);
+  }
+
+  /**
+   * Constructor given the target domain to fetch data from
+   * 
+   * @param d
+   */
+  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;
+  }
+
+  /**
+   * Answers true if the query matches the regular expression pattern for an
+   * Ensembl transcript stable identifier
+   * 
+   * @param query
+   * @return
+   */
+  public boolean isTranscriptIdentifier(String query)
+  {
+    return query == null ? false : TRANSCRIPT_REGEX.search(query);
+  }
+
+  /**
+   * Answers true if the query matches the regular expression pattern for an
+   * Ensembl gene stable identifier
+   * 
+   * @param query
+   * @return
+   */
+  public boolean isGeneIdentifier(String query)
+  {
+    return query == null ? false : GENE_REGEX.search(query);
+  }
+
+  @Override
+  public boolean queryInProgress()
+  {
+    return inProgress;
+  }
+
+  @Override
+  public StringBuffer getRawRecords()
+  {
+    return null;
+  }
+
+  /**
+   * Returns the URL for the client http request
+   * 
+   * @param ids
+   * @return
+   * @throws MalformedURLException
+   */
+  protected abstract URL getUrl(List<String> ids)
+          throws MalformedURLException;
+
+  /**
+   * Returns true if client uses GET method, false if it uses POST
+   * 
+   * @return
+   */
+  protected abstract boolean useGetRequest();
+
+  /**
+   * Return the desired value for the Content-Type request header
+   * 
+   * @param multipleIds
+   * 
+   * @return
+   * @see https://github.com/Ensembl/ensembl-rest/wiki/HTTP-Headers
+   */
+  protected abstract String getRequestMimeType(boolean multipleIds);
+
+  /**
+   * Return the desired value for the Accept request header
+   * 
+   * @return
+   * @see https://github.com/Ensembl/ensembl-rest/wiki/HTTP-Headers
+   */
+  protected abstract String getResponseMimeType();
+
+  /**
+   * Tries to connect to Ensembl's REST 'ping' endpoint, and returns true if
+   * successful, else false
+   * 
+   * @return
+   */
+  private boolean checkEnsembl()
+  {
+    try
+    {
+      // note this format works for both ensembl and ensemblgenomes
+      // info/ping.json works for ensembl only (March 2016)
+      URL ping = new URL(getDomain()
+              + "/info/ping?content-type=application/json");
+      HttpURLConnection conn = (HttpURLConnection) ping.openConnection();
+      int rc = conn.getResponseCode();
+      conn.disconnect();
+      if (rc >= 200 && rc < 300)
+      {
+        return true;
+      }
+    } catch (Throwable t)
+    {
+      System.err.println("Error connecting to " + PING_URL + ": "
+              + t.getMessage());
+    }
+    return false;
+  }
+
+  /**
+   * returns a reader to a Fasta response from the Ensembl sequence endpoint
+   * 
+   * @param ids
+   * @return
+   * @throws IOException
+   */
+  protected FileParse getSequenceReader(List<String> ids)
+          throws IOException
+  {
+    URL url = getUrl(ids);
+  
+    BufferedReader reader = getHttpResponse(url, ids);
+    FileParse fp = new FileParse(reader, url.toString(), "HTTP_POST");
+    return fp;
+  }
+
+  /**
+   * Writes the HTTP request and gets the response as a reader.
+   * 
+   * @param url
+   * @param ids
+   *          written as Json POST body if more than one
+   * @return
+   * @throws IOException
+   *           if response code was not 200, or other I/O error
+   */
+  protected BufferedReader getHttpResponse(URL url, List<String> ids)
+          throws IOException
+  {
+    // long now = System.currentTimeMillis();
+    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+  
+    /*
+     * POST method allows multiple queries in one request; it is supported for
+     * sequence queries, but not for overlap
+     */
+    boolean multipleIds = ids.size() > 1;// useGetRequest();
+    connection.setRequestMethod(multipleIds ? HttpMethod.POST
+            : HttpMethod.GET);
+    connection.setRequestProperty("Content-Type",
+            getRequestMimeType(multipleIds));
+    connection.setRequestProperty("Accept", getResponseMimeType());
+
+    connection.setUseCaches(false);
+    connection.setDoInput(true);
+    connection.setDoOutput(multipleIds);
+
+    if (multipleIds)
+    {
+      writePostBody(connection, ids);
+    }
+  
+    InputStream response = connection.getInputStream();
+    int responseCode = connection.getResponseCode();
+  
+    if (responseCode != 200)
+    {
+      /*
+       * note: a GET request for an invalid id returns an error code e.g. 415
+       * but POST request returns 200 and an empty Fasta response 
+       */
+      throw new IOException(
+              "Response code was not 200. Detected response was "
+                      + responseCode);
+    }
+    // System.out.println(getClass().getName() + " took "
+    // + (System.currentTimeMillis() - now) + "ms to fetch");
+
+    checkRateLimits(connection);
+  
+    BufferedReader reader = null;
+    reader = new BufferedReader(new InputStreamReader(response, "UTF-8"));
+    return reader;
+  }
+
+  /**
+   * Inspect response headers for any sign of server overload and respect any
+   * 'retry-after' directive
+   * 
+   * @see https://github.com/Ensembl/ensembl-rest/wiki/Rate-Limits
+   * @param connection
+   */
+  void checkRateLimits(HttpURLConnection connection)
+  {
+    // number of requests allowed per time interval:
+    String limit = connection.getHeaderField("X-RateLimit-Limit");
+    // length of quota time interval in seconds:
+    // String period = connection.getHeaderField("X-RateLimit-Period");
+    // seconds remaining until usage quota is reset:
+    String reset = connection.getHeaderField("X-RateLimit-Reset");
+    // number of requests remaining from quota for current period:
+    String remaining = connection.getHeaderField("X-RateLimit-Remaining");
+    // number of seconds to wait before retrying (if remaining == 0)
+    String retryDelay = connection.getHeaderField("Retry-After");
+
+    // to test:
+    // retryDelay = "5";
+
+    if (retryDelay != null)
+    {
+      System.err.println("Ensembl REST service rate limit exceeded, wait "
+              + retryDelay + " seconds before retrying");
+      try
+      {
+        retryAfter = System.currentTimeMillis()
+                + (1000 * Integer.valueOf(retryDelay));
+      } catch (NumberFormatException e)
+      {
+        System.err.println("Unexpected value for Retry-After: "
+                + retryDelay);
+      }
+    }
+    else
+    {
+      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.
+   * 
+   * @return
+   */
+  protected boolean isEnsemblAvailable()
+  {
+    long now = System.currentTimeMillis();
+
+    /*
+     * check if we are waiting for 'Retry-After' to expire
+     */
+    if (retryAfter > now)
+    {
+      System.err.println("Still " + (1 + (retryAfter - now) / 1000)
+              + " secs to wait before retrying Ensembl");
+      return false;
+    }
+    else
+    {
+      retryAfter = 0;
+    }
+
+    boolean retest = now - lastCheck > RETEST_INTERVAL;
+    if (ensemblRestAvailable && !retest)
+    {
+      return true;
+    }
+    ensemblRestAvailable = checkEnsembl();
+    lastCheck = now;
+    return ensemblRestAvailable;
+  }
+
+  /**
+   * Constructs, writes and flushes the POST body of the request, containing the
+   * query ids in JSON format
+   * 
+   * @param connection
+   * @param ids
+   * @throws IOException
+   */
+  protected void writePostBody(HttpURLConnection connection,
+          List<String> ids) throws IOException
+  {
+    boolean first;
+    StringBuilder postBody = new StringBuilder(64);
+    postBody.append("{\"ids\":[");
+    first = true;
+    for (String id : ids)
+    {
+      if (!first)
+      {
+        postBody.append(",");
+      }
+      first = false;
+      postBody.append("\"");
+      postBody.append(id.trim());
+      postBody.append("\"");
+    }
+    postBody.append("]}");
+    byte[] thepostbody = postBody.toString().getBytes();
+    connection.setRequestProperty("Content-Length",
+            Integer.toString(thepostbody.length));
+    DataOutputStream wr = new DataOutputStream(connection.getOutputStream());
+    wr.write(thepostbody);
+    wr.flush();
+    wr.close();
+  }
+
+}
diff --git a/src/jalview/ext/ensembl/EnsemblSeqProxy.java b/src/jalview/ext/ensembl/EnsemblSeqProxy.java
new file mode 100644 (file)
index 0000000..fb81e66
--- /dev/null
@@ -0,0 +1,886 @@
+package jalview.ext.ensembl;
+
+import jalview.analysis.AlignmentUtils;
+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;
+import jalview.exceptions.JalviewException;
+import jalview.io.FastaFile;
+import jalview.io.FileParse;
+import jalview.io.gff.SequenceOntologyFactory;
+import jalview.io.gff.SequenceOntologyI;
+import jalview.util.Comparison;
+import jalview.util.DBRefUtils;
+import jalview.util.MapList;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+/**
+ * Base class for Ensembl sequence fetchers
+ * 
+ * @see http://rest.ensembl.org/documentation/info/sequence_id
+ * @author gmcarstairs
+ */
+public abstract class EnsemblSeqProxy extends EnsemblRestClient
+{
+  private static final String ALLELES = "alleles";
+
+  protected static final String PARENT = "Parent";
+
+  protected static final String ID = "ID";
+
+  protected static final String NAME = "Name";
+
+  protected static final String DESCRIPTION = "description";
+
+  /*
+   * enum for 'type' parameter to the /sequence REST service
+   */
+  public enum EnsemblSeqType
+  {
+    /**
+     * type=genomic to fetch full dna including introns
+     */
+    GENOMIC("genomic"),
+
+    /**
+     * type=cdna to fetch coding dna including UTRs
+     */
+    CDNA("cdna"),
+
+    /**
+     * type=cds to fetch coding dna excluding UTRs
+     */
+    CDS("cds"),
+
+    /**
+     * type=protein to fetch peptide product sequence
+     */
+    PROTEIN("protein");
+
+    /*
+     * the value of the 'type' parameter to fetch this version of 
+     * an Ensembl sequence
+     */
+    private String type;
+
+    EnsemblSeqType(String t)
+    {
+      type = t;
+    }
+
+    public String getType()
+    {
+      return type;
+    }
+
+  }
+
+  /**
+   * A comparator to sort ranges into ascending start position order
+   */
+  private class RangeSorter implements Comparator<int[]>
+  {
+    boolean forwards;
+
+    RangeSorter(boolean forward)
+    {
+      forwards = forward;
+    }
+
+    @Override
+    public int compare(int[] o1, int[] o2)
+    {
+      return (forwards ? 1 : -1) * Integer.compare(o1[0], o2[0]);
+    }
+
+  }
+
+  /**
+   * Default constructor (to use rest.ensembl.org)
+   */
+  public EnsemblSeqProxy()
+  {
+    super();
+  }
+
+  /**
+   * Constructor given the target domain to fetch data from
+   */
+  public EnsemblSeqProxy(String d)
+  {
+    super(d);
+  }
+
+  /**
+   * Makes the sequence queries to Ensembl's REST service and returns an
+   * alignment consisting of the returned sequences.
+   */
+  @Override
+  public AlignmentI getSequenceRecords(String query) throws Exception
+  {
+    // TODO use a String... query vararg instead?
+
+    // danger: accession separator used as a regex here, a string elsewhere
+    // in this case it is ok (it is just a space), but (e.g.) '\' would not be
+    List<String> allIds = Arrays.asList(query
+            .split(getAccessionSeparator()));
+    AlignmentI alignment = null;
+    inProgress = true;
+
+    /*
+     * execute queries, if necessary in batches of the
+     * maximum allowed number of ids
+     */
+    int maxQueryCount = getMaximumQueryCount();
+    for (int v = 0, vSize = allIds.size(); v < vSize; v += maxQueryCount)
+    {
+      int p = Math.min(vSize, v + maxQueryCount);
+      List<String> ids = allIds.subList(v, p);
+      try
+      {
+        alignment = fetchSequences(ids, alignment);
+      } catch (Throwable r)
+      {
+        inProgress = false;
+        String msg = "Aborting ID retrieval after " + v
+                + " chunks. Unexpected problem (" + r.getLocalizedMessage()
+                + ")";
+        System.err.println(msg);
+        break;
+      }
+    }
+
+    if (alignment == null)
+    {
+      return null;
+    }
+
+    /*
+     * fetch and transfer genomic sequence features,
+     * fetch protein product and add as cross-reference
+     */
+    for (String accId : allIds)
+    {
+      addFeaturesAndProduct(accId, alignment);
+    }
+
+    for (SequenceI seq : alignment.getSequences())
+    {
+      getCrossReferences(seq);
+    }
+
+    return alignment;
+  }
+
+  /**
+   * Fetches Ensembl features using the /overlap REST endpoint, and adds them to
+   * the sequence in the alignment. Also fetches the protein product, maps it
+   * from the CDS features of the sequence, and saves it as a cross-reference of
+   * the dna sequence.
+   * 
+   * @param accId
+   * @param alignment
+   */
+  protected void addFeaturesAndProduct(String accId, AlignmentI alignment)
+  {
+    if (alignment == null)
+    {
+      return;
+    }
+
+    try
+    {
+      /*
+       * get 'dummy' genomic sequence with exon, cds and variation features
+       */
+      SequenceI genomicSequence = null;
+      EnsemblFeatures gffFetcher = new EnsemblFeatures(getDomain());
+      EnsemblFeatureType[] features = getFeaturesToFetch();
+      AlignmentI geneFeatures = gffFetcher.getSequenceRecords(accId,
+              features);
+      if (geneFeatures.getHeight() > 0)
+      {
+        genomicSequence = geneFeatures.getSequenceAt(0);
+      }
+      if (genomicSequence != null)
+      {
+        /*
+         * transfer features to the query sequence
+         */
+        SequenceI querySeq = alignment.findName(accId);
+        if (transferFeatures(accId, genomicSequence, querySeq))
+        {
+
+          /*
+           * fetch and map protein product, and add it as a cross-reference
+           * of the retrieved sequence
+           */
+          addProteinProduct(querySeq);
+        }
+      }
+    } catch (IOException e)
+    {
+      System.err.println("Error transferring Ensembl features: "
+              + e.getMessage());
+    }
+  }
+
+  /**
+   * Returns those sequence feature types to fetch from Ensembl. We may want
+   * features either because they are of interest to the user, or as means to
+   * identify the locations of the sequence on the genomic sequence (CDS
+   * features identify CDS, exon features identify cDNA etc).
+   * 
+   * @return
+   */
+  protected abstract EnsemblFeatureType[] getFeaturesToFetch();
+
+  /**
+   * Fetches and maps the protein product, and adds it as a cross-reference of
+   * the retrieved sequence
+   */
+  protected void addProteinProduct(SequenceI querySeq)
+  {
+    String accId = querySeq.getName();
+    try
+    {
+      AlignmentI protein = new EnsemblProtein(getDomain())
+              .getSequenceRecords(accId);
+      if (protein == null || protein.getHeight() == 0)
+      {
+        System.out.println("No protein product found for " + accId);
+        return;
+      }
+      SequenceI proteinSeq = protein.getSequenceAt(0);
+
+      /*
+       * need dataset sequences (to be the subject of mappings)
+       */
+      proteinSeq.createDatasetSequence();
+      querySeq.createDatasetSequence();
+
+      MapList mapList = AlignmentUtils.mapCdsToProtein(querySeq, proteinSeq);
+      if (mapList != null)
+      {
+        // clunky: ensure Uniprot xref if we have one is on mapped sequence
+        SequenceI ds = proteinSeq.getDatasetSequence();
+        ds.setSourceDBRef(proteinSeq.getSourceDBRef());
+
+        Mapping map = new Mapping(ds, mapList);
+        DBRefEntry dbr = new DBRefEntry(getDbSource(), getDbVersion(),
+                proteinSeq.getName(), map);
+        querySeq.getDatasetSequence().addDBRef(dbr);
+        
+        /*
+         * copy exon features to protein, compute peptide variants from dna 
+         * variants and add as features on the protein sequence ta-da
+         */
+        AlignmentUtils.computeProteinFeatures(querySeq, proteinSeq, mapList);
+      }
+    } catch (Exception e)
+    {
+      System.err
+              .println(String.format("Error retrieving protein for %s: %s",
+                      accId, e.getMessage()));
+    }
+  }
+
+  /**
+   * Get database xrefs from Ensembl, and attach them to the sequence
+   * 
+   * @param seq
+   */
+  protected void getCrossReferences(SequenceI seq)
+  {
+    while (seq.getDatasetSequence() != null)
+    {
+      seq = seq.getDatasetSequence();
+    }
+
+    EnsemblXref xrefFetcher = new EnsemblXref(getDomain());
+    List<DBRefEntry> xrefs = xrefFetcher.getCrossReferences(seq.getName());
+    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());
+    seq.addDBRef(self);
+  }
+
+  /**
+   * Fetches sequences for the list of accession ids and adds them to the
+   * alignment. Returns the extended (or created) alignment.
+   * 
+   * @param ids
+   * @param alignment
+   * @return
+   * @throws JalviewException
+   * @throws IOException
+   */
+  protected AlignmentI fetchSequences(List<String> ids, AlignmentI alignment)
+          throws JalviewException, IOException
+  {
+    if (!isEnsemblAvailable())
+    {
+      inProgress = false;
+      throw new JalviewException("ENSEMBL Rest API not available.");
+    }
+    FileParse fp = getSequenceReader(ids);
+    FastaFile fr = new FastaFile(fp);
+    if (fr.hasWarningMessage())
+    {
+      System.out.println(String.format(
+              "Warning when retrieving %d ids %s\n%s", ids.size(),
+              ids.toString(), fr.getWarningMessage()));
+    }
+    else if (fr.getSeqs().size() != ids.size())
+    {
+      System.out.println(String.format(
+              "Only retrieved %d sequences for %d query strings", fr
+                      .getSeqs().size(), ids.size()));
+    }
+
+    if (fr.getSeqs().size() == 1 && fr.getSeqs().get(0).getLength() == 0)
+    {
+      /*
+       * POST request has returned an empty FASTA file e.g. for invalid id
+       */
+      throw new IOException("No data returned for " + ids);
+    }
+
+    if (fr.getSeqs().size() > 0)
+    {
+      AlignmentI seqal = new Alignment(
+              fr.getSeqsAsArray());
+      for (SequenceI sq:seqal.getSequences())
+      {
+        if (sq.getDescription() == null)
+        {
+          sq.setDescription(getDbName());
+        }
+        String name = sq.getName();
+        if (ids.contains(name)
+                || ids.contains(name.replace("ENSP", "ENST")))
+        {
+          DBRefUtils.parseToDbRef(sq, DBRefSource.ENSEMBL, "0", name);
+        }
+      }
+      if (alignment == null)
+      {
+        alignment = seqal;
+      }
+      else
+      {
+        alignment.append(seqal);
+      }
+    }
+    return alignment;
+  }
+
+  /**
+   * Returns the URL for the REST call
+   * 
+   * @return
+   * @throws MalformedURLException
+   */
+  @Override
+  protected URL getUrl(List<String> ids) throws MalformedURLException
+  {
+    /*
+     * a single id is included in the URL path
+     * multiple ids go in the POST body instead
+     */
+    StringBuffer urlstring = new StringBuffer(128);
+    urlstring.append(getDomain() + "/sequence/id");
+    if (ids.size() == 1)
+    {
+      urlstring.append("/").append(ids.get(0));
+    }
+    // @see https://github.com/Ensembl/ensembl-rest/wiki/Output-formats
+    urlstring.append("?type=").append(getSourceEnsemblType().getType());
+    urlstring.append(("&Accept=text/x-fasta"));
+
+    URL url = new URL(urlstring.toString());
+    return url;
+  }
+
+  /**
+   * A sequence/id POST request currently allows up to 50 queries
+   * 
+   * @see http://rest.ensembl.org/documentation/info/sequence_id_post
+   */
+  @Override
+  public int getMaximumQueryCount()
+  {
+    return 50;
+  }
+
+  @Override
+  protected boolean useGetRequest()
+  {
+    return false;
+  }
+
+  @Override
+  protected String getRequestMimeType(boolean multipleIds)
+  {
+    return multipleIds ? "application/json" : "text/x-fasta";
+  }
+
+  @Override
+  protected String getResponseMimeType()
+  {
+    return "text/x-fasta";
+  }
+
+  /**
+   * 
+   * @return the configured sequence return type for this source
+   */
+  protected abstract EnsemblSeqType getSourceEnsemblType();
+
+  /**
+   * Returns a list of [start, end] genomic ranges corresponding to the sequence
+   * being retrieved.
+   * 
+   * The correspondence between the frames of reference is made by locating
+   * those features on the genomic sequence which identify the retrieved
+   * sequence. Specifically
+   * <ul>
+   * <li>genomic sequence is identified by "transcript" features with
+   * ID=transcript:transcriptId</li>
+   * <li>cdna sequence is identified by "exon" features with
+   * Parent=transcript:transcriptId</li>
+   * <li>cds sequence is identified by "CDS" features with
+   * Parent=transcript:transcriptId</li>
+   * </ul>
+   * 
+   * The returned ranges are sorted to run forwards (for positive strand) or
+   * backwards (for negative strand). Aborts and returns null if both positive
+   * and negative strand are found (this should not normally happen).
+   * 
+   * @param sourceSequence
+   * @param accId
+   * @param start
+   *          the start position of the sequence we are mapping to
+   * @return
+   */
+  protected MapList getGenomicRangesFromFeatures(SequenceI sourceSequence,
+          String accId, int start)
+  {
+    SequenceFeature[] sfs = sourceSequence.getSequenceFeatures();
+    if (sfs == null)
+    {
+      return null;
+    }
+
+    /*
+     * generously initial size for number of cds regions
+     * (worst case titin Q8WZ42 has c. 313 exons)
+     */
+    List<int[]> regions = new ArrayList<int[]>(100);
+    int mappedLength = 0;
+    int direction = 1; // forward
+    boolean directionSet = false;
+  
+    for (SequenceFeature sf : sfs)
+    {
+      /*
+       * accept the target feature type or a specialisation of it
+       * (e.g. coding_exon for exon)
+       */
+      if (identifiesSequence(sf, accId))
+      {
+        int strand = sf.getStrand();
+        strand = strand == 0 ? 1 : strand; // treat unknown as forward
+
+        if (directionSet && strand != direction)
+        {
+          // abort - mix of forward and backward
+          System.err.println("Error: forward and backward strand for "
+                  + accId);
+            return null;
+          }
+          direction = strand;
+          directionSet = true;
+  
+          /*
+           * add to CDS ranges, semi-sorted forwards/backwards
+           */
+          if (strand < 0)
+          {
+            regions.add(0, new int[] { sf.getEnd(), sf.getBegin() });
+          }
+          else
+          {
+          regions.add(new int[] { sf.getBegin(), sf.getEnd() });
+        }
+        mappedLength += Math.abs(sf.getEnd() - sf.getBegin() + 1);
+
+        if (!isSpliceable())
+        {
+          /*
+           * 'gene' sequence is contiguous so we can stop as soon as its
+           * identifying feature has been found
+           */
+          break;
+        }
+      }
+    }
+  
+    if (regions.isEmpty())
+    {
+      System.out.println("Failed to identify target sequence for " + accId
+              + " from genomic features");
+      return null;
+    }
+
+    /*
+     * a final sort is needed since Ensembl returns CDS sorted within source
+     * (havana / ensembl_havana)
+     */
+    Collections.sort(regions, new RangeSorter(direction == 1));
+  
+    List<int[]> to = Arrays.asList(new int[] { start,
+        start + mappedLength - 1 });
+  
+    return new MapList(regions, to, 1, 1);
+  }
+
+  /**
+   * Answers true if the sequence being retrieved may occupy discontiguous
+   * regions on the genomic sequence.
+   */
+  protected boolean isSpliceable()
+  {
+    return true;
+  }
+
+  /**
+   * Returns true if the sequence feature marks positions of the genomic
+   * sequence feature which are within the sequence being retrieved. For
+   * example, an 'exon' feature whose parent is the target transcript marks the
+   * cdna positions of the transcript.
+   * 
+   * @param sf
+   * @param accId
+   * @return
+   */
+  protected abstract boolean identifiesSequence(SequenceFeature sf,
+          String accId);
+
+  /**
+   * Transfers the sequence feature to the target sequence, locating its start
+   * and end range based on the mapping. Features which do not overlap the
+   * target sequence are ignored.
+   * 
+   * @param sf
+   * @param targetSequence
+   * @param mapping
+   *          mapping from the sequence feature's coordinates to the target
+   *          sequence
+   * @param forwardStrand
+   */
+  protected void transferFeature(SequenceFeature sf,
+          SequenceI targetSequence, MapList mapping, boolean forwardStrand)
+  {
+    int start = sf.getBegin();
+    int end = sf.getEnd();
+    int[] mappedRange = mapping.locateInTo(start, end);
+  
+    if (mappedRange != null)
+    {
+      SequenceFeature copy = new SequenceFeature(sf);
+      copy.setBegin(Math.min(mappedRange[0], mappedRange[1]));
+      copy.setEnd(Math.max(mappedRange[0], mappedRange[1]));
+      targetSequence.addSequenceFeature(copy);
+
+      /*
+       * for sequence_variant on reverse strand, have to convert the allele
+       * values to their complements
+       */
+      if (!forwardStrand
+              && SequenceOntologyFactory.getInstance().isA(sf.getType(),
+                      SequenceOntologyI.SEQUENCE_VARIANT))
+      {
+        reverseComplementAlleles(copy);
+      }
+    }
+  }
+
+  /**
+   * Change the 'alleles' value of a feature by converting to complementary
+   * bases, and also update the feature description to match
+   * 
+   * @param sf
+   */
+  static void reverseComplementAlleles(SequenceFeature sf)
+  {
+    final String alleles = (String) sf.getValue(ALLELES);
+    if (alleles == null)
+    {
+      return;
+    }
+    StringBuilder complement = new StringBuilder(alleles.length());
+    for (String allele : alleles.split(","))
+    {
+      reverseComplementAllele(complement, allele);
+    }
+    String comp = complement.toString();
+    sf.setValue(ALLELES, comp);
+    sf.setDescription(comp);
+
+    /*
+     * replace value of "alleles=" in sf.ATTRIBUTES as well
+     * so 'output as GFF' shows reverse complement alleles
+     */
+    String atts = sf.getAttributes();
+    if (atts != null)
+    {
+      atts = atts.replace(ALLELES + "=" + alleles, ALLELES + "=" + comp);
+      sf.setAttributes(atts);
+    }
+  }
+
+  /**
+   * Makes the 'reverse complement' of the given allele and appends it to the
+   * buffer, after a comma separator if not the first
+   * 
+   * @param complement
+   * @param allele
+   */
+  static void reverseComplementAllele(StringBuilder complement,
+          String allele)
+  {
+    if (complement.length() > 0)
+    {
+      complement.append(",");
+    }
+
+    /*
+     * some 'alleles' are actually descriptive terms 
+     * e.g. HGMD_MUTATION, PhenCode_variation
+     * - we don't want to 'reverse complement' these
+     */
+    if (!Comparison.isNucleotideSequence(allele, true))
+    {
+      complement.append(allele);
+    }
+    else
+    {
+      for (int i = allele.length() - 1; i >= 0; i--)
+      {
+        complement.append(Dna.getComplement(allele.charAt(i)));
+      }
+    }
+  }
+
+  /**
+   * Transfers features from sourceSequence to targetSequence
+   * 
+   * @param accessionId
+   * @param sourceSequence
+   * @param targetSequence
+   * @return true if any features were transferred, else false
+   */
+  protected boolean transferFeatures(String accessionId,
+          SequenceI sourceSequence, SequenceI targetSequence)
+  {
+    if (sourceSequence == null || targetSequence == null)
+    {
+      return false;
+    }
+
+    // long start = System.currentTimeMillis();
+    SequenceFeature[] sfs = sourceSequence.getSequenceFeatures();
+    MapList mapping = getGenomicRangesFromFeatures(sourceSequence, accessionId,
+            targetSequence.getStart());
+    if (mapping == null)
+    {
+      return false;
+    }
+
+    boolean result = transferFeatures(sfs, targetSequence, mapping,
+            accessionId);
+    // System.out.println("transferFeatures (" + (sfs.length) + " --> "
+    // + targetSequence.getSequenceFeatures().length + ") to "
+    // + targetSequence.getName()
+    // + " took " + (System.currentTimeMillis() - start) + "ms");
+    return result;
+  }
+
+  /**
+   * Transfer features to the target sequence. The start/end positions are
+   * converted using the mapping. Features which do not overlap are ignored.
+   * Features whose parent is not the specified identifier are also ignored.
+   * 
+   * @param features
+   * @param targetSequence
+   * @param mapping
+   * @param parentId
+   * @return
+   */
+  protected boolean transferFeatures(SequenceFeature[] features,
+          SequenceI targetSequence, MapList mapping, String parentId)
+  {
+    final boolean forwardStrand = mapping.isFromForwardStrand();
+
+    /*
+     * sort features by start position (which corresponds to end
+     * position descending if reverse strand) so as to add them in
+     * 'forwards' order to the target sequence
+     */
+    sortFeatures(features, forwardStrand);
+
+    boolean transferred = false;
+    for (SequenceFeature sf : features)
+    {
+      if (retainFeature(sf, parentId))
+      {
+        transferFeature(sf, targetSequence, mapping, forwardStrand);
+        transferred = true;
+      }
+    }
+    return transferred;
+  }
+
+  /**
+   * Sort features by start position ascending (if on forward strand), or end
+   * position descending (if on reverse strand)
+   * 
+   * @param features
+   * @param forwardStrand
+   */
+  protected static void sortFeatures(SequenceFeature[] features,
+          final boolean forwardStrand)
+  {
+    Arrays.sort(features, new Comparator<SequenceFeature>()
+    {
+      @Override
+      public int compare(SequenceFeature o1, SequenceFeature o2)
+      {
+        if (forwardStrand)
+        {
+          return Integer.compare(o1.getBegin(), o2.getBegin());
+        }
+        else
+        {
+          return Integer.compare(o2.getEnd(), o1.getEnd());
+        }
+      }
+    });
+  }
+
+  /**
+   * Answers true if the feature type is one we want to keep for the sequence.
+   * Some features are only retrieved in order to identify the sequence range,
+   * and may then be discarded as redundant information (e.g. "CDS" feature for
+   * a CDS sequence).
+   */
+  @SuppressWarnings("unused")
+  protected boolean retainFeature(SequenceFeature sf, String accessionId)
+  {
+    return true; // override as required
+  }
+
+  /**
+   * Answers true if the feature has a Parent which refers to the given
+   * accession id, or if the feature has no parent. Answers false if the
+   * feature's Parent is for a different accession id.
+   * 
+   * @param sf
+   * @param identifier
+   * @return
+   */
+  protected boolean featureMayBelong(SequenceFeature sf, String identifier)
+  {
+    String parent = (String) sf.getValue(PARENT);
+    // using contains to allow for prefix "gene:", "transcript:" etc
+    if (parent != null && !parent.contains(identifier))
+    {
+      // this genomic feature belongs to a different transcript
+      return false;
+    }
+    return true;
+  }
+
+  @Override
+  public String getDescription()
+  {
+    return "Ensembl " + getSourceEnsemblType().getType()
+            + " sequence with variant features";
+  }
+
+  /**
+   * Returns a (possibly empty) list of features on the sequence which have the
+   * specified sequence ontology type (or a sub-type of it), and the given
+   * identifier as parent
+   * 
+   * @param sequence
+   * @param type
+   * @param parentId
+   * @return
+   */
+  protected List<SequenceFeature> findFeatures(SequenceI sequence,
+          String type, String parentId)
+  {
+    List<SequenceFeature> result = new ArrayList<SequenceFeature>();
+    
+    SequenceFeature[] sfs = sequence.getSequenceFeatures();
+    if (sfs != null) {
+      SequenceOntologyI so = SequenceOntologyFactory.getInstance();
+      for (SequenceFeature sf :sfs) {
+        if (so.isA(sf.getType(), type))
+        {
+          String parent = (String) sf.getValue(PARENT);
+          if (parent.equals(parentId))
+          {
+            result.add(sf);
+          }
+        }
+      }
+    }
+    return result;
+  }
+
+  /**
+   * Answers true if the feature type is either 'NMD_transcript_variant' or
+   * 'transcript' or one of its sub-types in the Sequence Ontology. This is
+   * needed because NMD_transcript_variant behaves like 'transcript' in Ensembl
+   * although strictly speaking it is not (it is a sub-type of
+   * sequence_variant).
+   * 
+   * @param featureType
+   * @return
+   */
+  public static boolean isTranscript(String featureType)
+  {
+    return SequenceOntologyI.NMD_TRANSCRIPT_VARIANT.equals(featureType)
+            || SequenceOntologyFactory.getInstance().isA(featureType,
+                    SequenceOntologyI.TRANSCRIPT);
+  }
+}
diff --git a/src/jalview/ext/ensembl/EnsemblSequenceFetcher.java b/src/jalview/ext/ensembl/EnsemblSequenceFetcher.java
new file mode 100644 (file)
index 0000000..9a4952e
--- /dev/null
@@ -0,0 +1,93 @@
+package jalview.ext.ensembl;
+
+import jalview.datamodel.DBRefSource;
+import jalview.ws.seqfetcher.DbSourceProxyImpl;
+
+import com.stevesoft.pat.Regex;
+
+/**
+ * A base class for Ensembl sequence fetchers
+ * 
+ * @author gmcarstairs
+ */
+abstract class EnsemblSequenceFetcher extends DbSourceProxyImpl
+{
+  /*
+   * accepts ENSG/T/E/P with 11 digits
+   * or ENSMUSP or similar for other species
+   * or CCDSnnnnn.nn with at least 3 digits
+   */
+  private static final Regex ACCESSION_REGEX = new Regex(
+          "(ENS([A-Z]{3}|)[GTEP]{1}[0-9]{11}$)" + "|" + "(CCDS[0-9.]{3,}$)");
+
+  /*
+   * possible values for the 'feature' parameter of the /overlap REST service
+   * @see http://rest.ensembl.org/documentation/info/overlap_id
+   */
+  protected enum EnsemblFeatureType
+  {
+    gene, transcript, cds, exon, repeat, simple, misc, variation,
+    somatic_variation, structural_variation, somatic_structural_variation,
+    constrained, regulatory
+  }
+
+  @Override
+  public String getDbSource()
+  {
+    // NB ensure Uniprot xrefs are canonicalised from "Ensembl" to "ENSEMBL"
+    return DBRefSource.ENSEMBL; // "ENSEMBL"
+  }
+
+  @Override
+  public String getDbVersion()
+  {
+    return "0";
+  }
+
+  @Override
+  public String getAccessionSeparator()
+  {
+    return " ";
+  }
+
+  /**
+   * Ensembl accession are ENST + 11 digits for human transcript, ENSG for human
+   * gene. Other species insert 3 letters e.g. ENSMUST..., ENSMUSG...
+   * 
+   * @see http://www.ensembl.org/Help/View?id=151
+   */
+  @Override
+  public Regex getAccessionValidator()
+  {
+    return ACCESSION_REGEX;
+  }
+
+  @Override
+  public boolean isValidReference(String accession)
+  {
+    return getAccessionValidator().search(accession);
+  }
+
+  @Override
+  public int getTier()
+  {
+    return 0;
+  }
+
+  /**
+   * Default test query is a transcript
+   */
+  @Override
+  public String getTestQuery()
+  {
+    // has CDS on reverse strand:
+    return "ENST00000288602";
+    // ENST00000461457 // forward strand
+  }
+
+  @Override
+  public boolean isDnaCoding()
+  {
+    return true;
+  }
+}
diff --git a/src/jalview/ext/ensembl/EnsemblSymbol.java b/src/jalview/ext/ensembl/EnsemblSymbol.java
new file mode 100644 (file)
index 0000000..1c47f11
--- /dev/null
@@ -0,0 +1,138 @@
+package jalview.ext.ensembl;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.json.simple.JSONArray;
+import org.json.simple.JSONObject;
+import org.json.simple.parser.JSONParser;
+import org.json.simple.parser.ParseException;
+
+/**
+ * A client for the Ensembl xrefs/symbol REST service;
+ * 
+ * @see http://rest.ensembl.org/documentation/info/xref_external
+ * @author gmcarstairs
+ *
+ */
+public class EnsemblSymbol extends EnsemblXref
+{
+  /**
+   * Constructor given the target domain to fetch data from
+   * 
+   * @param d
+   */
+  public EnsemblSymbol(String d)
+  {
+    super(d);
+  }
+
+  /**
+   * Returns the first "id" value in gene identifier format from the JSON
+   * response, or null if none found
+   * 
+   * @param br
+   * @return
+   * @throws IOException
+   */
+  protected String parseSymbolResponse(BufferedReader br)
+          throws IOException
+  {
+    JSONParser jp = new JSONParser();
+    String result = null;
+    try
+    {
+      JSONArray responses = (JSONArray) jp.parse(br);
+      Iterator rvals = responses.iterator();
+      while (rvals.hasNext())
+      {
+        JSONObject val = (JSONObject) rvals.next();
+        String id = val.get("id").toString();
+        if (id != null && isGeneIdentifier(id))
+        {
+          result = id;
+          break;
+        }
+      }
+    } catch (ParseException e)
+    {
+      // ignore
+    }
+    return result;
+  }
+
+  protected URL getUrl(String id, Species species)
+  {
+    String url = getDomain() + "/xrefs/symbol/" + species.toString() + "/"
+            + id
+            + "?content-type=application/json";
+    try
+    {
+      return new URL(url);
+    } catch (MalformedURLException e)
+    {
+      return null;
+    }
+  }
+
+  /**
+   * Calls the Ensembl xrefs REST 'symbol' endpoint and retrieves any gene ids
+   * for the given identifier, for any known model organisms
+   * 
+   * @param identifier
+   * @return
+   */
+  public List<String> getIds(String identifier)
+  {
+    List<String> result = new ArrayList<String>();
+    List<String> ids = new ArrayList<String>();
+    ids.add(identifier);
+  
+    String[] queries = identifier.split(getAccessionSeparator());
+    BufferedReader br = null;
+    try
+    {
+      for (String query : queries)
+      {
+        for (Species taxon : Species.values())
+        {
+          if (taxon.isModelOrganism())
+          {
+            URL url = getUrl(query, taxon);
+            if (url != null)
+            {
+              br = getHttpResponse(url, ids);
+            }
+            String geneId = parseSymbolResponse(br);
+            if (geneId != null)
+            {
+              result.add(geneId);
+            }
+          }
+        }
+      }
+    } catch (IOException e)
+    {
+      // ignore
+    } finally
+    {
+      if (br != null)
+      {
+        try
+        {
+          br.close();
+        } catch (IOException e)
+        {
+          // ignore
+        }
+      }
+    }
+    return result;
+  }
+
+}
diff --git a/src/jalview/ext/ensembl/EnsemblXref.java b/src/jalview/ext/ensembl/EnsemblXref.java
new file mode 100644 (file)
index 0000000..fa86865
--- /dev/null
@@ -0,0 +1,187 @@
+package jalview.ext.ensembl;
+
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.DBRefEntry;
+import jalview.util.DBRefUtils;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.json.simple.JSONArray;
+import org.json.simple.JSONObject;
+import org.json.simple.parser.JSONParser;
+import org.json.simple.parser.ParseException;
+
+/**
+ * A class to fetch cross-references from Ensembl by calling the /xrefs REST
+ * service
+ * 
+ * @author gmcarstairs
+ * @see http://rest.ensembl.org/documentation/info/xref_id
+ */
+class EnsemblXref extends EnsemblRestClient
+{
+
+  private static final String GO_GENE_ONTOLOGY = "GO";
+
+  /**
+   * Constructor given the target domain to fetch data from
+   * 
+   * @param d
+   */
+  public EnsemblXref(String d)
+  {
+    super(d);
+  }
+
+  @Override
+  public String getDbName()
+  {
+    return "ENSEMBL (xref)";
+  }
+
+  @Override
+  public AlignmentI getSequenceRecords(String queries) throws Exception
+  {
+    return null;
+  }
+
+  @Override
+  protected URL getUrl(List<String> ids) throws MalformedURLException
+  {
+    return getUrl(ids.get(0));
+  }
+
+  @Override
+  protected boolean useGetRequest()
+  {
+    return true;
+  }
+
+  @Override
+  protected String getRequestMimeType(boolean multipleIds)
+  {
+    return "application/json";
+  }
+
+  @Override
+  protected String getResponseMimeType()
+  {
+    return "application/json";
+  }
+
+  /**
+   * Calls the Ensembl xrefs REST endpoint and retrieves any cross-references
+   * ("primary_id") for the given identifier (Ensembl accession id) and database
+   * names. The "dbname" returned by Ensembl is canonicalised to Jalview's
+   * standard version, and a DBRefEntry constructed. Currently takes all
+   * identifiers apart from GO terms and synonyms.
+   * 
+   * @param identifier
+   *          an Ensembl stable identifier
+   * @return
+   */
+  public List<DBRefEntry> getCrossReferences(String identifier)
+  {
+    List<DBRefEntry> result = new ArrayList<DBRefEntry>();
+    List<String> ids = new ArrayList<String>();
+    ids.add(identifier);
+
+    BufferedReader br = null;
+    try
+    {
+      URL url = getUrl(identifier);
+      if (url != null)
+      {
+        br = getHttpResponse(url, ids);
+      }
+      return (parseResponse(br));
+    } catch (IOException e)
+    {
+      // ignore
+    } finally
+    {
+      if (br != null)
+      {
+        try
+        {
+          br.close();
+        } catch (IOException e)
+        {
+          // ignore
+        }
+      }
+    }
+
+    return result;
+  }
+
+  /**
+   * Parses "primary_id" and "dbname" values from the JSON response and
+   * constructs a DBRefEntry. Returns a list of the DBRefEntry created. Note we
+   * don't parse "synonyms" as they appear to be either redirected or obsolete
+   * in Uniprot.
+   * 
+   * @param br
+   * @return
+   * @throws IOException
+   */
+  protected List<DBRefEntry> parseResponse(BufferedReader br)
+          throws IOException
+  {
+    JSONParser jp = new JSONParser();
+    List<DBRefEntry> result = new ArrayList<DBRefEntry>();
+    try
+    {
+      JSONArray responses = (JSONArray) jp.parse(br);
+      Iterator rvals = responses.iterator();
+      while (rvals.hasNext())
+      {
+        JSONObject val = (JSONObject) rvals.next();
+        String dbName = val.get("dbname").toString();
+        if (dbName.equals(GO_GENE_ONTOLOGY))
+        {
+          continue;
+        }
+        String id = val.get("primary_id").toString();
+        if (dbName != null && id != null)
+        {
+          dbName = DBRefUtils.getCanonicalName(dbName);
+          DBRefEntry dbref = new DBRefEntry(dbName, "0", id);
+          result.add(dbref);
+        }
+      }
+    } catch (ParseException e)
+    {
+      // ignore
+    }
+    return result;
+  }
+
+  /**
+   * Returns the URL for the REST endpoint to fetch all cross-references for an
+   * identifier. Note this may return protein cross-references for nucleotide.
+   * Filter the returned list as required.
+   * 
+   * @param identifier
+   * @return
+   */
+  protected URL getUrl(String identifier)
+  {
+    String url = getDomain() + "/xrefs/id/" + identifier
+            + "?content-type=application/json&all_levels=1";
+    try
+    {
+      return new URL(url);
+    } catch (MalformedURLException e)
+    {
+      return null;
+    }
+  }
+
+}
diff --git a/src/jalview/ext/ensembl/Species.java b/src/jalview/ext/ensembl/Species.java
new file mode 100644 (file)
index 0000000..d8a00a5
--- /dev/null
@@ -0,0 +1,32 @@
+package jalview.ext.ensembl;
+
+/**
+ * Selected species identifiers used by Ensembl
+ * 
+ * @author gmcarstairs
+ * @see http://rest.ensembl.org/info/species?content-type=text/xml
+ */
+enum Species
+{
+  /*
+   * using any suitably readable alias as the enum name; these are all
+   * valid species parameters to Ensembl REST services where applicable
+   */
+  human(true), mouse(true), s_cerevisiae(true), cow(false), pig(false),
+  rat(true), celegans(true), sheep(false), horse(false), gorilla(false),
+  rabbit(false), gibbon(false), dog(false), orangutan(false),
+  xenopus(true), chimpanzee(false), cat(false), zebrafish(true), chicken(
+          true), dmelanogaster(true);
+
+  boolean modelOrganism;
+
+  private Species(boolean model)
+  {
+    this.modelOrganism = model;
+  }
+
+  boolean isModelOrganism()
+  {
+    return modelOrganism;
+  }
+}
diff --git a/src/jalview/ext/htsjdk/HtsContigDb.java b/src/jalview/ext/htsjdk/HtsContigDb.java
new file mode 100644 (file)
index 0000000..f3b5098
--- /dev/null
@@ -0,0 +1,210 @@
+package jalview.ext.htsjdk;
+
+import htsjdk.samtools.SAMSequenceDictionary;
+import htsjdk.samtools.SAMSequenceRecord;
+import htsjdk.samtools.reference.ReferenceSequence;
+import htsjdk.samtools.reference.ReferenceSequenceFile;
+import htsjdk.samtools.reference.ReferenceSequenceFileFactory;
+import htsjdk.samtools.util.StringUtil;
+import jalview.datamodel.Sequence;
+import jalview.datamodel.SequenceI;
+
+import java.io.File;
+import java.math.BigInteger;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * a source of sequence data accessed via the HTSJDK
+ * 
+ * @author jprocter
+ *
+ */
+public class HtsContigDb
+{
+
+  private String name;
+
+  private File dbLocation;
+
+  private htsjdk.samtools.reference.ReferenceSequenceFile refFile = null;
+
+  public HtsContigDb(String name, File descriptor) throws Exception
+  {
+    if (descriptor.isFile())
+    {
+      this.name = name;
+      dbLocation = descriptor;
+    }
+    initSource();
+  }
+
+  private void initSource() throws Exception
+  {
+    if (refFile != null)
+    {
+      return;
+    }
+
+    refFile = ReferenceSequenceFileFactory.getReferenceSequenceFile(
+            dbLocation, true);
+    if (refFile == null || refFile.getSequenceDictionary() == null)
+    {
+      // refFile = initSequenceDictionaryFor(dbLocation);
+    }
+
+  }
+
+
+  SAMSequenceDictionary rrefDict = null;
+  private ReferenceSequenceFile initSequenceDictionaryFor(File dbLocation2) throws Exception
+  {
+    rrefDict = getDictionary(dbLocation2, true);
+    if (rrefDict != null)
+    {
+      ReferenceSequenceFile rrefFile = ReferenceSequenceFileFactory.getReferenceSequenceFile(dbLocation2, true);
+      return rrefFile;
+    }
+    return null;
+  }
+  /**
+   * code below hacked out from picard ----
+   * 
+   * picard/src/java/picard/sam/CreateSequenceDictionary.java
+   * https://github.com/
+   * broadinstitute/picard/commit/270580d3e28123496576f0b91b3433179bb5d876
+   */
+
+
+  /*
+   * The MIT License
+   * 
+   * Copyright (c) 2009 The Broad Institute
+   * 
+   * Permission is hereby granted, free of charge, to any person obtaining a
+   * copy of this software and associated documentation files (the "Software"),
+   * to deal in the Software without restriction, including without limitation
+   * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+   * and/or sell copies of the Software, and to permit persons to whom the
+   * Software is furnished to do so, subject to the following conditions:
+   * 
+   * The above copyright notice and this permission notice shall be included in
+   * all copies or substantial portions of the Software.
+   * 
+   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+   * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+   * DEALINGS IN THE SOFTWARE.
+   */
+  /**
+   * 
+   * @param f
+   * @param truncate
+   * @return
+   * @throws Exception
+   */
+  SAMSequenceDictionary getDictionary(File f, boolean truncate)
+          throws Exception
+  {
+    if (md5 == null)
+    {
+      initCreateSequenceDictionary();
+    }
+    final ReferenceSequenceFile refSeqFile = ReferenceSequenceFileFactory
+            .getReferenceSequenceFile(f, truncate);
+    ReferenceSequence refSeq;
+    List<SAMSequenceRecord> ret = new ArrayList<SAMSequenceRecord>();
+    Set<String> sequenceNames = new HashSet<String>();
+    for (int numSequences = 0; (refSeq = refSeqFile.nextSequence()) != null; ++numSequences)
+    {
+      if (sequenceNames.contains(refSeq.getName()))
+      {
+        throw new Exception(
+                "Sequence name appears more than once in reference: "
+                        + refSeq.getName());
+      }
+      sequenceNames.add(refSeq.getName());
+      ret.add(makeSequenceRecord(refSeq));
+    }
+    return new SAMSequenceDictionary(ret);
+  }
+
+  public boolean isValid()
+  {
+    return dbLocation != null && refFile != null;
+  }
+
+  /**
+   * Create one SAMSequenceRecord from a single fasta sequence
+   */
+  private SAMSequenceRecord makeSequenceRecord(
+          final ReferenceSequence refSeq)
+  {
+
+    final SAMSequenceRecord ret = new SAMSequenceRecord(refSeq.getName(),
+            refSeq.length());
+
+    // Compute MD5 of upcased bases
+    final byte[] bases = refSeq.getBases();
+    for (int i = 0; i < bases.length; ++i)
+    {
+      bases[i] = StringUtil.toUpperCase(bases[i]);
+    }
+
+    ret.setAttribute(SAMSequenceRecord.MD5_TAG, md5Hash(bases));
+    // if (GENOME_ASSEMBLY != null) {
+    // ret.setAttribute(SAMSequenceRecord.ASSEMBLY_TAG, GENOME_ASSEMBLY);
+    // }
+    // ret.setAttribute(SAMSequenceRecord.URI_TAG, URI);
+    // if (SPECIES != null) {
+    // ret.setAttribute(SAMSequenceRecord.SPECIES_TAG, SPECIES);
+    // }
+    return ret;
+  }
+
+  private MessageDigest md5;
+
+  public void initCreateSequenceDictionary() throws Exception
+  {
+    try
+    {
+      md5 = MessageDigest.getInstance("MD5");
+    } catch (NoSuchAlgorithmException e)
+    {
+      throw new Exception("MD5 algorithm not found", e);
+    }
+  }
+
+  private String md5Hash(final byte[] bytes)
+  {
+    md5.reset();
+    md5.update(bytes);
+    String s = new BigInteger(1, md5.digest()).toString(16);
+    if (s.length() != 32)
+    {
+      final String zeros = "00000000000000000000000000000000";
+      s = zeros.substring(0, 32 - s.length()) + s;
+    }
+    return s;
+  }
+
+  // ///// end of hts bits.
+
+  SequenceI getSequenceProxy(String id)
+  {
+    if (!isValid())
+    {
+      return null;
+    }
+
+    ReferenceSequence sseq = refFile.getSequence(id);
+    return new Sequence(sseq.getName(), new String(sseq.getBases()));
+  }
+}
index a1b6917..3f0847b 100644 (file)
@@ -28,6 +28,7 @@ import jalview.datamodel.ColumnSelection;
 import jalview.datamodel.PDBEntry;
 import jalview.datamodel.SequenceI;
 import jalview.io.AppletFormatAdapter;
+import jalview.io.StructureFile;
 import jalview.schemes.ColourSchemeI;
 import jalview.schemes.ResidueProperties;
 import jalview.structure.AtomSpec;
@@ -1121,7 +1122,7 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
     {
       String fileName = modelfilenames[modelnum];
       boolean foundEntry = false;
-      MCview.PDBfile pdb = null;
+      StructureFile pdb = null;
       String pdbfile = null;
       // model was probably loaded inline - so check the pdb file hashcode
       if (loadedInline)
@@ -1144,7 +1145,7 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
           {
             pdb = getSsm().setMapping(getSequence()[pe], getChains()[pe],
                     pdbfile, AppletFormatAdapter.PASTE);
-            getPdbEntry(modelnum).setFile("INLINE" + pdb.id);
+            getPdbEntry(modelnum).setFile("INLINE" + pdb.getId());
             matches = true;
             foundEntry = true;
           }
@@ -1183,10 +1184,10 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
         if (matches)
         {
           // add an entry for every chain in the model
-          for (int i = 0; i < pdb.chains.size(); i++)
+          for (int i = 0; i < pdb.getChains().size(); i++)
           {
-            String chid = new String(pdb.id + ":"
-                    + pdb.chains.elementAt(i).id);
+            String chid = new String(pdb.getId() + ":"
+                    + pdb.getChains().elementAt(i).id);
             chainFile.put(chid, fileName);
             chainNames.addElement(chid);
           }
similarity index 56%
rename from src/jalview/ext/jmol/PDBFileWithJmol.java
rename to src/jalview/ext/jmol/JmolParser.java
index d32a10d..0cbd620 100644 (file)
@@ -22,20 +22,19 @@ package jalview.ext.jmol;
 
 import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.Annotation;
-import jalview.datamodel.PDBEntry;
-import jalview.datamodel.Sequence;
+import jalview.datamodel.DBRefSource;
 import jalview.datamodel.SequenceI;
-import jalview.io.AlignFile;
 import jalview.io.FileParse;
+import jalview.io.StructureFile;
 import jalview.schemes.ResidueProperties;
-import jalview.util.Comparison;
+import jalview.structure.StructureViewSettings;
 import jalview.util.MessageManager;
 
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Hashtable;
 import java.util.List;
 import java.util.Map;
+import java.util.Vector;
 
 import javajs.awt.Dimension;
 
@@ -43,40 +42,75 @@ import org.jmol.api.JmolStatusListener;
 import org.jmol.api.JmolViewer;
 import org.jmol.c.CBK;
 import org.jmol.c.STR;
-import org.jmol.modelset.Group;
-import org.jmol.modelset.Model;
 import org.jmol.modelset.ModelSet;
-import org.jmol.modelsetbio.BioModel;
-import org.jmol.modelsetbio.BioPolymer;
-import org.jmol.modelsetbio.Monomer;
 import org.jmol.viewer.Viewer;
 
+import MCview.Atom;
+import MCview.PDBChain;
+import MCview.Residue;
+
 /**
- * Import and process PDB files with Jmol
+ * Import and process files with Jmol for file like PDB, mmCIF
  * 
  * @author jprocter
  * 
  */
-public class PDBFileWithJmol extends AlignFile implements
-        JmolStatusListener
+public class JmolParser extends StructureFile implements JmolStatusListener
 {
   Viewer viewer = null;
 
-  public PDBFileWithJmol(String inFile, String type) throws IOException
+  public JmolParser(boolean addAlignmentAnnotations, boolean predictSecStr,
+          boolean externalSecStr, String inFile, String type)
+          throws IOException
   {
     super(inFile, type);
   }
 
-  public PDBFileWithJmol(FileParse fp) throws IOException
+  public JmolParser(boolean addAlignmentAnnotations, boolean predictSecStr,
+          boolean externalSecStr, FileParse fp) throws IOException
   {
     super(fp);
   }
 
-  public PDBFileWithJmol()
+  public JmolParser()
   {
   }
 
   /**
+   * Calls the Jmol library to parse the PDB/mmCIF file, and then inspects the
+   * resulting object model to generate Jalview-style sequences, with secondary
+   * structure annotation added where available (i.e. where it has been computed
+   * by Jmol using DSSP).
+   * 
+   * @see jalview.io.AlignFile#parse()
+   */
+  @Override
+  public void parse() throws IOException
+  {
+    String dataName = getDataName();
+    if (dataName.endsWith(".cif"))
+    {
+      setDbRefType(DBRefSource.MMCIF);
+    }
+    else
+    {
+      setDbRefType(DBRefSource.PDB);
+    }
+    setChains(new Vector<PDBChain>());
+    Viewer jmolModel = getJmolData();
+    jmolModel.openReader(getDataName(), getDataName(), getReader());
+    waitForScript(jmolModel);
+
+    /*
+     * Convert one or more Jmol Model objects to Jalview sequences
+     */
+    if (jmolModel.ms.mc > 0)
+    {
+      transformJmolModelToJalview(jmolModel.ms);
+    }
+  }
+
+  /**
    * create a headless jmol instance for dataprocessing
    * 
    * @return
@@ -101,6 +135,178 @@ public class PDBFileWithJmol extends AlignFile implements
     return viewer;
   }
 
+  public void transformJmolModelToJalview(ModelSet ms) throws IOException
+  {
+    try
+    {
+      String lastID = "";
+      List<SequenceI> rna = new ArrayList<SequenceI>();
+      List<SequenceI> prot = new ArrayList<SequenceI>();
+      PDBChain tmpchain;
+      String pdbId = (String) ms.getInfo(0, "title");
+      setId(pdbId);
+      List<Atom> significantAtoms = convertSignificantAtoms(ms);
+      for (Atom tmpatom : significantAtoms)
+      {
+        try
+        {
+          tmpchain = findChain(tmpatom.chain);
+          if (tmpatom.resNumIns.trim().equals(lastID))
+          {
+            // phosphorylated protein - seen both CA and P..
+            continue;
+          }
+          tmpchain.atoms.addElement(tmpatom);
+        } catch (Exception e)
+        {
+          tmpchain = new PDBChain(pdbId, tmpatom.chain);
+          getChains().add(tmpchain);
+          tmpchain.atoms.addElement(tmpatom);
+        }
+        lastID = tmpatom.resNumIns.trim();
+      }
+      xferSettings();
+
+      makeResidueList();
+      makeCaBondList();
+
+      if (getId() == null)
+      {
+        setId(inFile.getName());
+      }
+      for (PDBChain chain : getChains())
+      {
+        SequenceI chainseq = postProcessChain(chain);
+        if (isRNA(chainseq))
+        {
+          rna.add(chainseq);
+        }
+        else
+        {
+          prot.add(chainseq);
+        }
+
+        if (StructureViewSettings.isPredictSecondaryStructure())
+        {
+          createAnnotation(chainseq, chain, ms.at);
+        }
+      }
+    } catch (OutOfMemoryError er)
+    {
+      System.out
+              .println("OUT OF MEMORY LOADING TRANSFORMING JMOL MODEL TO JALVIEW MODEL");
+      throw new IOException(
+              MessageManager
+                      .getString("exception.outofmemory_loading_mmcif_file"));
+    }
+  }
+
+  private List<Atom> convertSignificantAtoms(ModelSet ms)
+  {
+    List<Atom> significantAtoms = new ArrayList<Atom>();
+    for (org.jmol.modelset.Atom atom : ms.at)
+    {
+      if (atom.getAtomName().equalsIgnoreCase("CA")
+              || atom.getAtomName().equalsIgnoreCase("P"))
+      {
+        Atom curAtom = new Atom(atom.x, atom.y, atom.z);
+        curAtom.atomIndex = atom.getIndex();
+        curAtom.chain = atom.getChainIDStr();
+        curAtom.insCode = atom.group.getInsertionCode();
+        curAtom.name = atom.getAtomName();
+        curAtom.number = atom.getAtomNumber();
+        curAtom.resName = atom.getGroup3(true);
+        curAtom.resNumber = atom.getResno();
+        curAtom.occupancy = ms.occupancies != null ? ms.occupancies[atom
+                .getIndex()] : Float.valueOf(atom.getOccupancy100());
+        curAtom.resNumIns = "" + curAtom.resNumber + curAtom.insCode;
+        curAtom.tfactor = atom.getBfactor100() / 100f;
+        curAtom.type = 0;
+        significantAtoms.add(curAtom);
+      }
+    }
+    return significantAtoms;
+  }
+
+  private void createAnnotation(SequenceI sequence, PDBChain chain,
+          org.jmol.modelset.Atom[] jmolAtoms)
+  {
+    char[] secstr = new char[sequence.getLength()];
+    char[] secstrcode = new char[sequence.getLength()];
+
+    // Ensure Residue size equals Seq size
+    if (chain.residues.size() != sequence.getLength())
+    {
+      return;
+    }
+    int annotIndex = 0;
+    for (Residue residue : chain.residues)
+    {
+      Atom repAtom = residue.getAtoms().get(0);
+      STR proteinStructureSubType = jmolAtoms[repAtom.atomIndex].group
+              .getProteinStructureSubType();
+      setSecondaryStructure(proteinStructureSubType, annotIndex, secstr,
+              secstrcode);
+      ++annotIndex;
+    }
+    addSecondaryStructureAnnotation(chain.pdbid, sequence, secstr,
+            secstrcode, chain.id, sequence.getStart());
+  }
+
+  /**
+   * Helper method that adds an AlignmentAnnotation for secondary structure to
+   * the sequence, provided at least one secondary structure prediction has been
+   * made
+   * 
+   * @param modelTitle
+   * @param seq
+   * @param secstr
+   * @param secstrcode
+   * @param chainId
+   * @param firstResNum
+   * @return
+   */
+  protected void addSecondaryStructureAnnotation(String modelTitle,
+          SequenceI sq, char[] secstr, char[] secstrcode, String chainId,
+          int firstResNum)
+  {
+    char[] seq = sq.getSequence();
+    boolean ssFound = false;
+    Annotation asecstr[] = new Annotation[seq.length + firstResNum - 1];
+    for (int p = 0; p < seq.length; p++)
+    {
+      if (secstr[p] >= 'A' && secstr[p] <= 'z')
+      {
+        try
+        {
+        asecstr[p] = new Annotation(String.valueOf(secstr[p]), null,
+                secstrcode[p], Float.NaN);
+        ssFound = true;
+        } catch (Exception e)
+        {
+          // e.printStackTrace();
+        }
+      }
+    }
+
+    if (ssFound)
+    {
+      String mt = modelTitle == null ? getDataName() : modelTitle;
+      mt += chainId;
+      AlignmentAnnotation ann = new AlignmentAnnotation(
+              "Secondary Structure", "Secondary Structure for " + mt,
+              asecstr);
+      ann.belowAlignment = true;
+      ann.visible = true;
+      ann.autoCalculated = false;
+      ann.setCalcId(getClass().getName());
+      ann.adjustForAlignment();
+      ann.validateRangeAndDisplay();
+      annotations.add(ann);
+      sq.addAlignmentAnnotation(ann);
+    }
+  }
+
   private void waitForScript(Viewer jmd)
   {
     while (jmd.isScriptExecuting())
@@ -350,322 +556,24 @@ public class PDBFileWithJmol extends AlignFile implements
     return null;
   }
 
-  /**
-   * Calls the Jmol library to parse the PDB file, and then inspects the
-   * resulting object model to generate Jalview-style sequences, with secondary
-   * structure annotation added where available (i.e. where it has been computed
-   * by Jmol using DSSP).
-   * 
-   * @see jalview.io.AlignFile#parse()
-   */
-  @Override
-  public void parse() throws IOException
-  {
-    Viewer jmolModel = getJmolData();
-    jmolModel.openReader(getDataName(), getDataName(), getReader());
-    waitForScript(jmolModel);
-
-    /*
-     * Convert one or more Jmol Model objects to Jalview sequences
-     */
-    if (jmolModel.ms.mc > 0)
-    {
-      parseBiopolymers(jmolModel.ms);
-    }
-  }
-
-  /**
-   * Process the Jmol BioPolymer array and generate a Jalview sequence for each
-   * chain found (including any secondary structure annotation from DSSP)
-   * 
-   * @param ms
-   * @throws IOException
-   */
-  public void parseBiopolymers(ModelSet ms) throws IOException
-  {
-    int modelIndex = -1;
-    for (Model model : ms.am)
-    {
-      modelIndex++;
-      String modelTitle = (String) ms.getInfo(modelIndex, "title");
-
-      /*
-       * Chains can span BioPolymers, so first make a flattened list, 
-       * and then work out the lengths of chains present
-       */
-      List<Monomer> monomers = getMonomers(ms, (BioModel) model);
-      List<Integer> chainLengths = getChainLengths(monomers);
-
-      /*
-       * now chop up the Monomer list to make Jalview Sequences
-       */
-      int from = 0;
-      for (int length : chainLengths)
-      {
-        buildSequenceFromChain(monomers.subList(from, from + length), modelTitle);
-        from += length;
-      }
-    }
-  }
-
-  /**
-   * Helper method to construct a sequence for one chain and add it to the seqs
-   * list
-   * 
-   * @param monomers
-   *          a list of all monomers in the chain
-   * @param modelTitle
-   */
-  protected void buildSequenceFromChain(List<Monomer> monomers, String modelTitle)
-  {
-    final int length = monomers.size();
-
-    /*
-     * arrays to hold sequence and secondary structure
-     */
-    char[] seq = new char[length];
-    char[] secstr = new char[length];
-    char[] secstrcode = new char[length];
-
-    /*
-     * populate the sequence and secondary structure arrays
-     */
-    extractJmolChainData(monomers, seq, secstr, secstrcode);
-
-    /*
-     * grab chain code and start position from first residue;
-     */
-    String chainId = monomers.get(0).chain.getIDStr();
-    int firstResNum = monomers.get(0).getResno();
-    if (firstResNum < 1)
-    {
-      // Jalview doesn't like residue < 1, so force this to 1
-      System.err.println("Converting chain " + chainId + " first RESNUM ("
-              + firstResNum + ") to 1");
-      firstResNum = 1;
-    }
-
-    /*
-     * convert any non-gap unknown residues to 'X'
-     */
-    convertNonGapCharacters(seq);
-
-    /*
-     * construct and add the Jalview sequence
-     */
-    String seqName = "" + getDataName() + "|" + modelTitle + "|"
-            + chainId;
-    SequenceI sq = new Sequence(seqName, seq, firstResNum, firstResNum + length - 1);
-    seqs.add(sq);
-
-    /*
-     * add secondary structure predictions (if any)
-     */
-    addSecondaryStructureAnnotation(modelTitle, sq, secstr, secstrcode,
-            chainId, firstResNum);
-
-    /*
-     * record the PDB id for the sequence
-     */
-    addPdbid(sq, chainId);
-  }
-
-  /**
-   * Scans the list of (Jmol) Monomer objects, and adds the residue for each to
-   * the sequence array, and any converted secondary structure prediction to the
-   * secondary structure arrays
-   * 
-   * @param monomers
-   * @param seq
-   * @param secstr
-   * @param secstrcode
-   */
-  protected void extractJmolChainData(List<Monomer> monomers, char[] seq,
-          char[] secstr, char[] secstrcode)
-  {
-    int pos = 0;
-    for (Monomer monomer : monomers)
-    {
-      seq[pos] = monomer.getGroup1();
-
-      /*
-       * JAL-1828 replace a modified amino acid with its standard
-       * equivalent (e.g. MSE with MET->M) to maximise sequence matching
-       */
-      replaceNonCanonicalResidue(monomer.getGroup3(), seq, pos);
-
-      /*
-       * if Jmol has derived a secondary structure prediction for
-       * this position, convert it to Jalview equivalent and save it
-       */
-      setSecondaryStructure(monomer.getProteinStructureSubType(), pos,
-              secstr, secstrcode);
-      pos++;
-    }
-  }
-
-  /**
-   * Helper method that adds an AlignmentAnnotation for secondary structure to
-   * the sequence, provided at least one secondary structure prediction has been
-   * made
-   * 
-   * @param modelTitle
-   * @param seq
-   * @param secstr
-   * @param secstrcode
-   * @param chainId
-   * @param firstResNum
-   * @return
-   */
-  protected void addSecondaryStructureAnnotation(String modelTitle,
-          SequenceI sq, char[] secstr, char[] secstrcode,
-          String chainId, int firstResNum)
-  {
-    char[] seq = sq.getSequence();
-    boolean ssFound = false;
-    Annotation asecstr[] = new Annotation[seq.length + firstResNum - 1];
-    for (int p = 0; p < seq.length; p++)
-    {
-      if (secstr[p] >= 'A' && secstr[p] <= 'z')
-      {
-        asecstr[p] = new Annotation(String.valueOf(secstr[p]), null,
-                secstrcode[p], Float.NaN);
-        ssFound = true;
-      }
-    }
-
-    if (ssFound)
-    {
-      String mt = modelTitle == null ? getDataName() : modelTitle;
-      mt += chainId;
-      AlignmentAnnotation ann = new AlignmentAnnotation(
-              "Secondary Structure", "Secondary Structure for " + mt,
-              asecstr);
-      ann.belowAlignment = true;
-      ann.visible = true;
-      ann.autoCalculated = false;
-      ann.setCalcId(getClass().getName());
-      ann.adjustForAlignment();
-      ann.validateRangeAndDisplay();
-      annotations.add(ann);
-      sq.addAlignmentAnnotation(ann);
-    }
-  }
-
-  /**
-   * Replace any non-gap miscellaneous characters with 'X'
-   * 
-   * @param seq
-   * @return
-   */
-  protected void convertNonGapCharacters(char[] seq)
+  public boolean isPredictSecondaryStructure()
   {
-    boolean isNa = Comparison.areNucleotide(new char[][] { seq });
-    int[] cinds = isNa ? ResidueProperties.nucleotideIndex
-            : ResidueProperties.aaIndex;
-    int nonGap = isNa ? ResidueProperties.maxNucleotideIndex
-            : ResidueProperties.maxProteinIndex;
-
-    for (int p = 0; p < seq.length; p++)
-    {
-      if (cinds[seq[p]] == nonGap)
-      {
-        seq[p] = 'X';
-      }
-    }
+    return predictSecondaryStructure;
   }
 
-  /**
-   * Add a PDBEntry giving the source of PDB data to the sequence
-   * 
-   * @param sq
-   * @param chainId
-   */
-  protected void addPdbid(SequenceI sq, String chainId)
+  public void setPredictSecondaryStructure(boolean predictSecondaryStructure)
   {
-    PDBEntry pdbe = new PDBEntry();
-    pdbe.setFile(getDataName());
-    pdbe.setId(getDataName());
-    pdbe.setProperty(new Hashtable());
-    pdbe.setChainCode(chainId);
-    sq.addPDBId(pdbe);
+    this.predictSecondaryStructure = predictSecondaryStructure;
   }
 
-  /**
-   * Scans the list of Monomers (residue models), inspecting the chain id for
-   * each, and returns an array whose length is the number of chains, and values
-   * the length of each chain
-   * 
-   * @param monomers
-   * @return
-   */
-  protected List<Integer> getChainLengths(List<Monomer> monomers)
+  public boolean isVisibleChainAnnotation()
   {
-    List<Integer> chainLengths = new ArrayList<Integer>();
-    int lastChainId = -1;
-    int length = 0;
-
-    for (Monomer monomer : monomers)
-    {
-      int chainId = monomer.chain.chainID;
-      if (chainId != lastChainId && length > 0)
-      {
-        /*
-         * change of chain - record the length of the last one
-         */
-        chainLengths.add(length);
-        length = 0;
-      }
-      lastChainId = chainId;
-      length++;
-    }
-    if (length > 0)
-    {
-      /*
-       * record the length of the final chain
-       */
-      chainLengths.add(length);
-    }
-
-    return chainLengths;
+    return visibleChainAnnotation;
   }
 
-  /**
-   * Returns a flattened list of Monomer (residues) in order, across all
-   * BioPolymers in the model. This simplifies assembling chains which span
-   * BioPolymers. The result omits any alternate residues reported for the same
-   * sequence position (RESNUM value).
-   * 
-   * @param ms
-   * @param model
-   * @return
-   */
-  protected List<Monomer> getMonomers(ModelSet ms, BioModel model)
+  public void setVisibleChainAnnotation(boolean visibleChainAnnotation)
   {
-    List<Monomer> result = new ArrayList<Monomer>();
-    int lastResNo = Integer.MIN_VALUE;
-
-    for (BioPolymer bp : model.bioPolymers)
-    {
-      for (int groupLeadAtoms : bp.getLeadAtomIndices())
-      {
-        Group group = ms.at[groupLeadAtoms].group;
-        if (group instanceof Monomer)
-        {
-          /*
-           * ignore alternate residue at same position
-           * example: 1ejg has residues A:LEU, B:ILE at RESNUM=25
-           */
-          int resNo = group.getResno();
-          if (lastResNo != resNo)
-          {
-            result.add((Monomer) group);
-          }
-          lastResNo = resNo;
-        }
-      }
-    }
-    return result;
+    this.visibleChainAnnotation = visibleChainAnnotation;
   }
 
 }
index eee8bca..1ce0d2b 100644 (file)
@@ -108,7 +108,7 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel
    */
   String[] modelFileNames = null;
 
-  String lastMousedOverAtomSpec;
+  String lastHighlightCommand;
 
   private List<String> lastReply;
 
@@ -818,8 +818,8 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel
    * Construct and send a command to highlight zero, one or more atoms.
    * 
    * <pre>
-   * Done by generating a command like (to 'highlight' position 44)
-   *   show #0:44.C
+   * Done by generating a command like (to 'highlight' positions 44 and 46)
+   *   show #0:44,46.C
    * </pre>
    */
   @Override
@@ -829,8 +829,9 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel
     {
       return;
     }
-    StringBuilder atomSpecs = new StringBuilder();
+    StringBuilder cmd = new StringBuilder(128);
     boolean first = true;
+    boolean found = false;
 
     for (AtomSpec atom : atoms)
     {
@@ -840,35 +841,42 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel
       List<ChimeraModel> cms = chimeraMaps.get(pdbfile);
       if (cms != null && !cms.isEmpty())
       {
-        atomSpecs.append(first ? "" : ",");
+        if (first)
+        {
+          cmd.append("show #").append(cms.get(0).getModelNumber())
+                  .append(":");
+        }
+        else
+        {
+          cmd.append(",");
+        }
         first = false;
-        atomSpecs.append(cms.get(0).getModelNumber());
-        atomSpecs.append(":" + pdbResNum);
+        cmd.append(cms.get(0).getModelNumber()).append(":");
+        cmd.append(pdbResNum);
         if (!chain.equals(" "))
         {
-          atomSpecs.append("." + chain);
+          cmd.append(".").append(chain);
         }
+        found = true;
       }
     }
-    String atomSpec = atomSpecs.toString();
+    String command = cmd.toString();
 
     /*
      * Avoid repeated commands for the same residue
      */
-    if (atomSpec.equals(lastMousedOverAtomSpec))
+    if (command.equals(lastHighlightCommand))
     {
       return;
     }
 
-    StringBuilder command = new StringBuilder(32);
     viewerCommandHistory(false);
-    if (atomSpec.length() > 0)
+    if (found)
     {
-      command.append("show #").append(atomSpec);
       viewer.sendChimeraCommand(command.toString(), false);
     }
     viewerCommandHistory(true);
-    this.lastMousedOverAtomSpec = atomSpec;
+    this.lastHighlightCommand = command;
   }
 
   /**
@@ -1115,4 +1123,32 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel
   {
     sendChimeraCommand("focus", false);
   }
+
+  /**
+   * Send a 'show' command for all atoms in the currently selected columns
+   * 
+   * TODO: pull up to abstract structure viewer interface
+   * 
+   * @param vp
+   */
+  public void highlightSelection(AlignmentViewPanel vp)
+  {
+    List<Integer> cols = vp.getAlignViewport().getColumnSelection()
+            .getSelected();
+    AlignmentI alignment = vp.getAlignment();
+    StructureSelectionManager sm = getSsm();
+    for (SequenceI seq : alignment.getSequences())
+    {
+      /*
+       * convert selected columns into sequence positions
+       */
+      int[] positions = new int[cols.size()];
+      int i = 0;
+      for (Integer col : cols)
+      {
+        positions[i++] = seq.findPosition(col);
+      }
+      sm.highlightStructure(this, seq, positions);
+    }
+  }
 }
diff --git a/src/jalview/ext/so/SequenceOntology.java b/src/jalview/ext/so/SequenceOntology.java
new file mode 100644 (file)
index 0000000..af80b7a
--- /dev/null
@@ -0,0 +1,451 @@
+package jalview.ext.so;
+
+import jalview.io.gff.SequenceOntologyI;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+
+import org.biojava.nbio.ontology.Ontology;
+import org.biojava.nbio.ontology.Term;
+import org.biojava.nbio.ontology.Term.Impl;
+import org.biojava.nbio.ontology.Triple;
+import org.biojava.nbio.ontology.io.OboParser;
+import org.biojava.nbio.ontology.utils.Annotation;
+
+/**
+ * A wrapper class that parses the Sequence Ontology and exposes useful access
+ * methods. This version uses the BioJava parser.
+ */
+public class SequenceOntology implements SequenceOntologyI
+{
+  /*
+   * the parsed Ontology data as modelled by BioJava
+   */
+  private Ontology ontology;
+
+  /*
+   * the ontology term for the isA relationship
+   */
+  private Term isA;
+
+  /*
+   * lookup of terms by user readable name (NB not guaranteed unique)
+   */
+  private Map<String, Term> termsByDescription;
+
+  /*
+   * Map where key is a Term and value is a (possibly empty) list of 
+   * all Terms to which the key has an 'isA' relationship, either
+   * directly or indirectly (A isA B isA C)
+   */
+  private Map<Term, List<Term>> termIsA;
+
+  private List<String> termsFound;
+
+  private List<String> termsNotFound;
+
+  /**
+   * Package private constructor to enforce use of singleton. Parses and caches
+   * the SO OBO data file.
+   */
+  public SequenceOntology()
+  {
+    termsFound = new ArrayList<String>();
+    termsNotFound = new ArrayList<String>();
+    termsByDescription = new HashMap<String, Term>();
+    termIsA = new HashMap<Term, List<Term>>();
+
+    loadOntologyZipFile("so-xp-simple.obo");
+  }
+
+  /**
+   * Loads the given ontology file from a zip file with ".zip" appended
+   * 
+   * @param ontologyFile
+   */
+  protected void loadOntologyZipFile(String ontologyFile)
+  {
+    ZipInputStream zipStream = null;
+    try
+    {
+      String zipFile = ontologyFile + ".zip";
+      System.out.println("Loading Sequence Ontology from " + zipFile);
+      InputStream inStream = this.getClass().getResourceAsStream(
+              "/" + zipFile);
+      zipStream = new ZipInputStream(new BufferedInputStream(inStream));
+      ZipEntry entry;
+      while ((entry = zipStream.getNextEntry()) != null)
+      {
+        if (entry.getName().equals(ontologyFile))
+        {
+          loadOboFile(zipStream);
+        }
+      }
+    } catch (Exception e)
+    {
+      e.printStackTrace();
+    } finally
+    {
+      closeStream(zipStream);
+    }
+  }
+
+  /**
+   * Closes the input stream, swallowing all exceptions
+   * 
+   * @param is
+   */
+  protected void closeStream(InputStream is)
+  {
+    if (is != null)
+    {
+      try
+      {
+        is.close();
+      } catch (IOException e)
+      {
+        // ignore
+      }
+    }
+  }
+
+  /**
+   * Reads, parses and stores the OBO file data
+   * 
+   * @param is
+   * @throws ParseException
+   * @throws IOException
+   */
+  protected void loadOboFile(InputStream is) throws ParseException,
+          IOException
+  {
+    BufferedReader oboFile = new BufferedReader(new InputStreamReader(is));
+    OboParser parser = new OboParser();
+    ontology = parser.parseOBO(oboFile, "SO", "the SO ontology");
+    isA = ontology.getTerm("is_a");
+    storeTermNames();
+  }
+
+  /**
+   * Stores a lookup table of terms by description. Note that description is not
+   * guaranteed unique. Where duplicate descriptions are found, try to discard
+   * the term that is flagged as obsolete. However we do store obsolete terms
+   * where there is no duplication of description.
+   */
+  protected void storeTermNames()
+  {
+    for (Term term : ontology.getTerms())
+    {
+      if (term instanceof Impl)
+      {
+        String description = term.getDescription();
+        if (description != null)
+        {
+          Term replaced = termsByDescription.get(description);
+          if (replaced != null)
+          {
+            boolean newTermIsObsolete = isObsolete(term);
+            boolean oldTermIsObsolete = isObsolete(replaced);
+            if (newTermIsObsolete && !oldTermIsObsolete)
+            {
+              System.err.println("Ignoring " + term.getName()
+                      + " as obsolete and duplicated by "
+                      + replaced.getName());
+              term = replaced;
+            }
+            else if (!newTermIsObsolete && oldTermIsObsolete)
+            {
+              System.err.println("Ignoring " + replaced.getName()
+                      + " as obsolete and duplicated by " + term.getName());
+            }
+            else
+            {
+            System.err.println("Warning: " + term.getName()
+                    + " has replaced " + replaced.getName()
+                    + " for lookup of '" + description + "'");
+            }
+          }
+          termsByDescription.put(description, term);
+        }
+      }
+    }
+  }
+
+  /**
+   * Answers true if the term has property "is_obsolete" with value true, else
+   * false
+   * 
+   * @param term
+   * @return
+   */
+  public static boolean isObsolete(Term term)
+  {
+    Annotation ann = term.getAnnotation();
+    if (ann != null)
+    {
+      try
+      {
+      if (Boolean.TRUE.equals(ann.getProperty("is_obsolete")))
+      {
+          return true;
+        }
+      } catch (NoSuchElementException e)
+      {
+        // fall through to false
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Test whether the given Sequence Ontology term is nucleotide_match (either
+   * directly or via is_a relationship)
+   * 
+   * @param soTerm
+   *          SO name or description
+   * @return
+   */
+  public boolean isNucleotideMatch(String soTerm)
+  {
+    return isA(soTerm, NUCLEOTIDE_MATCH);
+  }
+
+  /**
+   * Test whether the given Sequence Ontology term is protein_match (either
+   * directly or via is_a relationship)
+   * 
+   * @param soTerm
+   *          SO name or description
+   * @return
+   */
+  public boolean isProteinMatch(String soTerm)
+  {
+    return isA(soTerm, PROTEIN_MATCH);
+  }
+
+  /**
+   * Test whether the given Sequence Ontology term is polypeptide (either
+   * directly or via is_a relationship)
+   * 
+   * @param soTerm
+   *          SO name or description
+   * @return
+   */
+  public boolean isPolypeptide(String soTerm)
+  {
+    return isA(soTerm, POLYPEPTIDE);
+  }
+
+  /**
+   * Returns true if the given term has a (direct or indirect) 'isA'
+   * relationship with the parent
+   * 
+   * @param child
+   * @param parent
+   * @return
+   */
+  @Override
+  public boolean isA(String child, String parent)
+  {
+    if (child == null || parent == null)
+    {
+      return false;
+    }
+    /*
+     * optimise trivial checks like isA("CDS", "CDS")
+     */
+    if (child.equals(parent))
+    {
+      termFound(child);
+      return true;
+    }
+
+    Term childTerm = getTerm(child);
+    if (childTerm != null)
+    {
+      termFound(child);
+    }
+    else
+    {
+      termNotFound(child);
+    }
+    Term parentTerm = getTerm(parent);
+
+    return termIsA(childTerm, parentTerm);
+  }
+
+  /**
+   * Records a valid term queried for, for reporting purposes
+   * 
+   * @param term
+   */
+  private void termFound(String term)
+  {
+    synchronized (termsFound)
+    {
+      if (!termsFound.contains(term))
+      {
+        termsFound.add(term);
+      }
+    }
+  }
+
+  /**
+   * Records an invalid term queried for, for reporting purposes
+   * 
+   * @param term
+   */
+  private void termNotFound(String term)
+  {
+    synchronized (termsNotFound)
+    {
+      if (!termsNotFound.contains(term))
+      {
+        System.err.println("SO term " + term + " invalid");
+        termsNotFound.add(term);
+      }
+    }
+  }
+
+  /**
+   * Returns true if the childTerm 'isA' parentTerm (directly or indirectly).
+   * 
+   * @param childTerm
+   * @param parentTerm
+   * @return
+   */
+  protected synchronized boolean termIsA(Term childTerm, Term parentTerm)
+  {
+    /*
+     * null term could arise from a misspelled SO description
+     */
+    if (childTerm == null || parentTerm == null)
+    {
+      return false;
+    }
+
+    /*
+     * recursive search endpoint:
+     */
+    if (childTerm == parentTerm)
+    {
+      return true;
+    }
+
+    /*
+     * lazy initialisation - find all of a term's parents (recursively) 
+     * the first time this is called, and save them in a map.
+     */
+    if (!termIsA.containsKey(childTerm))
+    {
+      findParents(childTerm);
+    }
+
+    List<Term> parents = termIsA.get(childTerm);
+    for (Term parent : parents)
+    {
+      if (termIsA(parent, parentTerm))
+      {
+        /*
+         * add (great-)grandparents to parents list as they are discovered,
+         * for faster lookup next time
+         */
+        if (!parents.contains(parentTerm))
+        {
+          parents.add(parentTerm);
+        }
+        return true;
+      }
+    }
+
+    return false;
+  }
+
+  /**
+   * Finds all the 'isA' parents of the childTerm and stores them as a (possibly
+   * empty) list.
+   * 
+   * @param childTerm
+   */
+  protected synchronized void findParents(Term childTerm)
+  {
+    List<Term> result = new ArrayList<Term>();
+    for (Triple triple : ontology.getTriples(childTerm, null, isA))
+    {
+      Term parent = triple.getObject();
+      result.add(parent);
+
+      /*
+       * and search for the parent's parents recursively
+       */
+      findParents(parent);
+    }
+    termIsA.put(childTerm, result);
+  }
+
+  /**
+   * Returns the Term for a given name (e.g. "SO:0000735") or description (e.g.
+   * "sequence_location"), or null if not found.
+   * 
+   * @param child
+   * @return
+   */
+  protected Term getTerm(String nameOrDescription)
+  {
+    Term t = termsByDescription.get(nameOrDescription);
+    if (t == null)
+    {
+      try
+      {
+        t = ontology.getTerm(nameOrDescription);
+      } catch (NoSuchElementException e)
+      {
+        // not found
+      }
+    }
+    return t;
+  }
+
+  public boolean isSequenceVariant(String soTerm)
+  {
+    return isA(soTerm, SEQUENCE_VARIANT);
+  }
+
+  /**
+   * Sorts (case-insensitive) and returns the list of valid terms queried for
+   */
+  @Override
+  public List<String> termsFound()
+  {
+    synchronized (termsFound)
+    {
+      Collections.sort(termsFound, String.CASE_INSENSITIVE_ORDER);
+      return termsFound;
+    }
+  }
+
+  /**
+   * Sorts (case-insensitive) and returns the list of invalid terms queried for
+   */
+  @Override
+  public List<String> termsNotFound()
+  {
+    synchronized (termsNotFound)
+    {
+      Collections.sort(termsNotFound, String.CASE_INSENSITIVE_ORDER);
+      return termsNotFound;
+    }
+  }
+}
diff --git a/src/jalview/fts/api/FTSData.java b/src/jalview/fts/api/FTSData.java
new file mode 100644 (file)
index 0000000..9e9d62c
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * 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 <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
+
+package jalview.fts.api;
+
+/**
+ * This interface provides a model for the summary data;
+ * 
+ * @author tcnofoegbu
+ *
+ */
+public interface FTSData
+{
+
+  /**
+   * Return an array of Objects representing the retrieved FTS data
+   * 
+   * @return
+   */
+  public Object[] getSummaryData();
+
+  /**
+   * The primary key object for the retrieved FTS data
+   * 
+   * @return
+   */
+  public Object getPrimaryKey();
+}
diff --git a/src/jalview/fts/api/FTSDataColumnI.java b/src/jalview/fts/api/FTSDataColumnI.java
new file mode 100644 (file)
index 0000000..7741d73
--- /dev/null
@@ -0,0 +1,136 @@
+/*
+ * 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 <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
+
+package jalview.fts.api;
+
+/**
+ * This interface provides a model for the dynamic data column configuration
+ * 
+ * @author tcnofoegbu
+ *
+ */
+public interface FTSDataColumnI
+{
+  /**
+   * Returns the name of the data column
+   * 
+   * @return the data column's name
+   */
+  public String getName();
+
+  /**
+   * Returns the code of the data column
+   * 
+   * @return the data column's code
+   */
+  public String getCode();
+
+  /**
+   * Returns the alternative code value for the data column
+   * 
+   * @return the data column's code
+   */
+  public String getAltCode();
+
+  /**
+   * Returns the minimum width of the data column
+   * 
+   * @return the data column's minimum width
+   */
+  public int getMinWidth();
+
+  /**
+   * Returns the maximum width of the data column
+   * 
+   * @return the data column's maximum width
+   */
+  public int getMaxWidth();
+
+  /**
+   * Returns the preferred width of the data column
+   * 
+   * @return the data column's preferred width
+   */
+  public int getPreferredWidth();
+
+  /**
+   * Determines if the data column is the primary key column
+   * 
+   * @return true if data column is the primary key column, otherwise false
+   */
+  public boolean isPrimaryKeyColumn();
+
+  /**
+   * Checks if the data column field can be used to perform a search query
+   * 
+   * @return true means the data column is searchable
+   */
+  public boolean isSearchable();
+
+  /**
+   * Checks if the data column is displayed by default
+   * 
+   * @return true means the data column is shown by default
+   */
+  public boolean isVisibleByDefault();
+
+  /**
+   * Returns the data column's data type class
+   * 
+   * @return the Class for the data column's data type
+   */
+  public Class getDataColumnClass();
+
+  /**
+   * Returns the data colum's FTS data column group
+   * 
+   * @return the FTSDataColumnGroupI for the column
+   */
+  public FTSDataColumnGroupI getGroup();
+
+  /**
+   * This interface provides a model for the dynamic data column group
+   * 
+   */
+  public interface FTSDataColumnGroupI
+  {
+    /**
+     * Returns the Id of the data column's group
+     * 
+     * @return the data column's group Id
+     */
+    public String getID();
+
+    /**
+     * Returns the name of the group
+     * 
+     * @return the group's name
+     */
+    public String getName();
+
+    /**
+     * Returns the sort order of the group
+     * 
+     * @return the group's sort order
+     */
+    public int getSortOrder();
+  }
+}
diff --git a/src/jalview/fts/api/FTSRestClientI.java b/src/jalview/fts/api/FTSRestClientI.java
new file mode 100644 (file)
index 0000000..2266ca0
--- /dev/null
@@ -0,0 +1,142 @@
+/*
+ * 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 <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
+
+package jalview.fts.api;
+
+import jalview.fts.api.FTSDataColumnI.FTSDataColumnGroupI;
+import jalview.fts.core.FTSRestRequest;
+import jalview.fts.core.FTSRestResponse;
+
+import java.util.Collection;
+
+/**
+ * Methods for FTS Rest client.
+ * 
+ * @author tcnofoegbu
+ */
+public interface FTSRestClientI
+{
+
+  /**
+   * Execute a given FTS request, process the response and return it as an
+   * FTSRestResponse object
+   * 
+   * @param ftsRestRequest
+   *          the FTS request to execute
+   * @return FTSRestResponse - the response after executing an FTS request
+   * @throws Exception
+   */
+  public FTSRestResponse executeRequest(FTSRestRequest ftsRequest)
+          throws Exception;
+
+  /**
+   * Return the resource file path for the data columns configuration file
+   * 
+   * @return
+   */
+  public String getColumnDataConfigFileName();
+
+  /**
+   * Fetch FTSDataColumnGroupI by the group's Id
+   * 
+   * @param groupId
+   * @return FTSDataColumnGroupI
+   * @throws Exception
+   */
+  public FTSDataColumnGroupI getDataColumnGroupById(String groupId)
+          throws Exception;
+
+  /**
+   * Fetch FTSDataColumnI by name or code
+   * 
+   * @param nameOrCode
+   * @return FTSDataColumnI
+   * @throws Exception
+   */
+  public FTSDataColumnI getDataColumnByNameOrCode(String nameOrCode)
+          throws Exception;
+
+
+  /**
+   * Convert collection of FTSDataColumnI objects to a comma delimited string of
+   * the 'code' values
+   * 
+   * @param wantedFields
+   *          the collection of FTSDataColumnI to process
+   * @return the generated comma delimited string from the supplied
+   *         FTSDataColumnI collection
+   */
+  public String getDataColumnsFieldsAsCommaDelimitedString(
+          Collection<FTSDataColumnI> wantedFields);
+
+
+  /**
+   * Fetch index of the primary key column for the dynamic table
+   * 
+   * @param wantedFields
+   *          the available table columns
+   * @param hasRefSeq
+   *          true if the data columns has an additional column for reference
+   *          sequence
+   * @return index of the primary key column
+   * @throws Exception
+   */
+  public int getPrimaryKeyColumIndex(
+          Collection<FTSDataColumnI> wantedFields, boolean hasRefSeq)
+          throws Exception;
+          
+  /**
+   * Fetch the primary key data column object
+   * 
+   * @return the FTSDataColumnI object for the primary key column
+   */
+  public FTSDataColumnI getPrimaryKeyColumn();
+
+  /**
+   * Returns list of FTSDataColumnI objects to be displayed by default
+   * 
+   * @return list of columns to display by default
+   */
+  public Collection<FTSDataColumnI> getAllDefaulDisplayedDataColumns();
+
+  /**
+   * Return list of FTSDataColumnI objects that can be used to perform a search
+   * query
+   * 
+   * @return list of searchable FTSDataColumnI object
+   */
+  public Collection<FTSDataColumnI> getSearchableDataColumns();
+
+  /**
+   * Return list of all available FTSDataColumnI object
+   * 
+   * @return list of all FTSColumnI objcet
+   */
+  public Collection<FTSDataColumnI> getAllFTSDataColumns();
+
+  /**
+   * Return the default response page limit
+   * 
+   * @return the default response page size
+   */
+  public int getDefaultResponsePageSize();
+}
+
diff --git a/src/jalview/fts/api/GFTSPanelI.java b/src/jalview/fts/api/GFTSPanelI.java
new file mode 100644 (file)
index 0000000..ce63576
--- /dev/null
@@ -0,0 +1,130 @@
+/*
+ * 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 <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
+
+package jalview.fts.api;
+
+import javax.swing.JTable;
+
+/**
+ * 
+ * @author tcnofoegbu
+ *
+ */
+public interface GFTSPanelI
+{
+
+  /**
+   * Action performed when a text is entered in the search field.
+   * 
+   * @param isFreshSearch
+   *          if true a fresh search is executed else a pagination search is
+   *          executed
+   */
+  public void searchAction(boolean isFreshSearch);
+
+  /**
+   * Action performed when search results are selected and the 'ok' button is
+   * pressed.
+   */
+  public void okAction();
+
+  /**
+   * Return the entered text
+   * 
+   * @return the entered text
+   */
+  public String getTypedText();
+
+  /**
+   * The JTable for presenting the query result
+   * 
+   * @return JTable
+   */
+  public JTable getResultTable();
+
+  /**
+   * Return the title to display on the search interface main panel
+   * 
+   * @return String - the title
+   */
+  public String getFTSFrameTitle();
+
+  /**
+   * Return a singleton instance of FTSRestClientI
+   * 
+   * @return FTSRestClientI
+   */
+  public FTSRestClientI getFTSRestClient();
+
+  /**
+   * Set error message when one occurs
+   * 
+   * @param message
+   *          the error message to set
+   */
+  public void setErrorMessage(String message);
+
+  /**
+   * Updates the title displayed on the search interface's main panel
+   * 
+   * @param newTitle
+   */
+  public void updateSearchFrameTitle(String newTitle);
+
+  /**
+   * Controls the progress spinner, set to 'true' while search operation is in
+   * progress and 'false' after it completes
+   * 
+   * @param isSearchInProgress
+   */
+  public void setSearchInProgress(Boolean isSearchInProgress);
+
+  /**
+   * Action performed when previous page (<<) button is pressed pressed.
+   */
+  public void prevPageAction();
+
+  /**
+   * Action performed when next page (>>) button is pressed pressed.
+   */
+  public void nextPageAction();
+
+  /**
+   * Checks if the current service's search result is paginate-able
+   * 
+   * @return true means the service provides paginated results
+   */
+  public boolean isPaginationEnabled();
+
+  /**
+   * Updates the 'enabled' state for the previous page button
+   * 
+   * @param isEnabled
+   */
+  public void setPrevPageButtonEnabled(boolean isEnabled);
+
+  /**
+   * Updates the 'enabled' state for the next page button
+   * 
+   * @param isEnabled
+   */
+  public void setNextPageButtonEnabled(boolean isEnabled);
+}
diff --git a/src/jalview/fts/core/FTSDataColumnPreferences.java b/src/jalview/fts/core/FTSDataColumnPreferences.java
new file mode 100644 (file)
index 0000000..cddcc8e
--- /dev/null
@@ -0,0 +1,341 @@
+/*
+ * 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 <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
+package jalview.fts.core;
+
+import jalview.fts.api.FTSDataColumnI;
+import jalview.fts.api.FTSDataColumnI.FTSDataColumnGroupI;
+import jalview.fts.api.FTSRestClientI;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+
+import javax.swing.JScrollPane;
+import javax.swing.JTable;
+import javax.swing.RowSorter;
+import javax.swing.SortOrder;
+import javax.swing.table.AbstractTableModel;
+import javax.swing.table.TableModel;
+import javax.swing.table.TableRowSorter;
+
+
+@SuppressWarnings("serial")
+public class FTSDataColumnPreferences extends JScrollPane
+{
+  protected JTable tbl_FTSDataColumnPrefs = new JTable();
+
+  protected JScrollPane scrl_pdbDocFieldConfig = new JScrollPane(
+          tbl_FTSDataColumnPrefs);
+
+  private HashMap<String, FTSDataColumnI> map = new HashMap<String, FTSDataColumnI>();
+
+  private Collection<FTSDataColumnI> structSummaryColumns = new LinkedHashSet<FTSDataColumnI>();
+
+  private Collection<FTSDataColumnI> allFTSDataColumns = new LinkedHashSet<FTSDataColumnI>();
+
+  public enum PreferenceSource
+  {
+    SEARCH_SUMMARY, STRUCTURE_CHOOSER, PREFERENCES;
+  }
+
+  private PreferenceSource currentSource;
+
+  private FTSRestClientI ftsRestClient;
+
+  public FTSDataColumnPreferences(PreferenceSource source,
+          FTSRestClientI ftsRestClient)
+  {
+    this.ftsRestClient = ftsRestClient;
+    Collection<FTSDataColumnI> defaultCols = ftsRestClient
+            .getAllDefaulDisplayedDataColumns();
+
+    structSummaryColumns.addAll(defaultCols);
+
+    allFTSDataColumns.addAll(ftsRestClient.getAllFTSDataColumns());
+
+    tbl_FTSDataColumnPrefs.setAutoCreateRowSorter(true);
+    this.getViewport().add(tbl_FTSDataColumnPrefs);
+    this.currentSource = source;
+
+    String[] columnNames = null;
+    switch (source)
+    {
+    case SEARCH_SUMMARY:
+      columnNames = new String[] { "", "Display", "Group" };
+      break;
+    case STRUCTURE_CHOOSER:
+      columnNames = new String[] { "", "Display", "Group" };
+      break;
+    case PREFERENCES:
+      columnNames = new String[] { "PDB Field", "Show in search summary",
+          "Show in structure summary" };
+      break;
+    default:
+      break;
+    }
+
+    Object[][] data = new Object[allFTSDataColumns.size() - 1][3];
+
+    int x = 0;
+    for (FTSDataColumnI field : allFTSDataColumns)
+    {
+      if (field.getName().equalsIgnoreCase("all"))
+      {
+        continue;
+      }
+
+      switch (source)
+      {
+      case SEARCH_SUMMARY:
+        data[x++] = new Object[] {
+            ftsRestClient.getAllDefaulDisplayedDataColumns()
+                    .contains(field),
+            field.getName(), field.getGroup() };
+        break;
+      case STRUCTURE_CHOOSER:
+        data[x++] = new Object[] { structSummaryColumns.contains(field),
+            field.getName(), field.getGroup() };
+        break;
+      case PREFERENCES:
+        data[x++] = new Object[] { field.getName(),
+            ftsRestClient.getAllDefaulDisplayedDataColumns()
+                    .contains(field),
+            structSummaryColumns.contains(field) };
+        break;
+      default:
+        break;
+      }
+      map.put(field.getName(), field);
+    }
+
+    FTSDataColumnPrefsTableModel model = new FTSDataColumnPrefsTableModel(columnNames, data);
+    tbl_FTSDataColumnPrefs.setModel(model);
+
+    switch (source)
+    {
+    case SEARCH_SUMMARY:
+    case STRUCTURE_CHOOSER:
+      tbl_FTSDataColumnPrefs.getColumnModel().getColumn(0)
+              .setPreferredWidth(30);
+      tbl_FTSDataColumnPrefs.getColumnModel().getColumn(0).setMinWidth(20);
+      tbl_FTSDataColumnPrefs.getColumnModel().getColumn(0).setMaxWidth(40);
+      tbl_FTSDataColumnPrefs.getColumnModel().getColumn(1)
+              .setPreferredWidth(150);
+      tbl_FTSDataColumnPrefs.getColumnModel().getColumn(1).setMinWidth(150);
+      tbl_FTSDataColumnPrefs.getColumnModel().getColumn(2)
+              .setPreferredWidth(150);
+      tbl_FTSDataColumnPrefs.getColumnModel().getColumn(2)
+.setMinWidth(150);
+
+      TableRowSorter<TableModel> sorter = new TableRowSorter<>(
+              tbl_FTSDataColumnPrefs.getModel());
+      tbl_FTSDataColumnPrefs.setRowSorter(sorter);
+      List<RowSorter.SortKey> sortKeys = new ArrayList<>();
+      int columnIndexToSort = 2;
+      sortKeys.add(new RowSorter.SortKey(columnIndexToSort,
+              SortOrder.ASCENDING));
+      sorter.setSortKeys(sortKeys);
+      sorter.setComparator(
+              columnIndexToSort,
+              new Comparator<FTSDataColumnGroupI>()
+              {
+                @Override
+                public int compare(FTSDataColumnGroupI o1,
+                        FTSDataColumnGroupI o2)
+                {
+                  return o1.getSortOrder() - o2.getSortOrder();
+                }
+              });
+      sorter.sort();
+
+      tbl_FTSDataColumnPrefs
+              .setAutoResizeMode(JTable.AUTO_RESIZE_NEXT_COLUMN);
+      break;
+    case PREFERENCES:
+    default:
+      break;
+    }
+
+  }
+
+  public Collection<FTSDataColumnI> getStructureSummaryFields()
+  {
+    return structSummaryColumns;
+  }
+
+  class FTSDataColumnPrefsTableModel extends AbstractTableModel
+  {
+
+    public FTSDataColumnPrefsTableModel(String[] columnNames, Object[][] data)
+    {
+      this.data = data;
+      this.columnNames = columnNames;
+    }
+
+    private Object[][] data;
+
+    private String[] columnNames;
+
+    @Override
+    public int getColumnCount()
+    {
+      return columnNames.length;
+    }
+
+    @Override
+    public int getRowCount()
+    {
+      return data.length;
+    }
+
+    @Override
+    public String getColumnName(int col)
+    {
+      return columnNames[col];
+    }
+
+    @Override
+    public Object getValueAt(int row, int col)
+    {
+      return data[row][col];
+    }
+
+    /*
+     * JTable uses this method to determine the default renderer/ editor for
+     * each cell. If we didn't implement this method, then the last column would
+     * contain text ("true"/"false"), rather than a check box.
+     */
+    @Override
+    public Class getColumnClass(int c)
+    {
+      return getValueAt(0, c).getClass();
+    }
+
+    /*
+     * Don't need to implement this method unless your table's editable.
+     */
+    @Override
+    public boolean isCellEditable(int row, int col)
+    {
+      // Note that the data/cell address is constant,
+      // no matter where the cell appears onscreen.
+      // !isPDBID(row, col) ensures the PDB_Id cell is never editable as it
+      // serves as a unique id for each row.
+      // return (col == 1 || col == 2) && !isPDBID(row, col);
+      switch (currentSource)
+      {
+      case SEARCH_SUMMARY:
+      case STRUCTURE_CHOOSER:
+        return (col == 0) && !isPrimaryKeyCell(row, 1);
+      case PREFERENCES:
+        return (col == 1 || col == 2) && !isPrimaryKeyCell(row, 0);
+      default:
+        return false;
+      }
+
+    }
+
+    /**
+     * Determines whether the data in a given cell is a PDB ID.
+     * 
+     * @param row
+     * @param col
+     * @return
+     */
+
+    public boolean isPrimaryKeyCell(int row, int col)
+    {
+      String name = getValueAt(row, col).toString();
+      FTSDataColumnI pdbField = map.get(name);
+      return pdbField.isPrimaryKeyColumn();
+    }
+
+    /*
+     * Don't need to implement this method unless your table's data can change.
+     */
+    @Override
+    public void setValueAt(Object value, int row, int col)
+    {
+      data[row][col] = value;
+      fireTableCellUpdated(row, col);
+
+      String name = null;
+      switch (currentSource)
+      {
+      case SEARCH_SUMMARY:
+      case STRUCTURE_CHOOSER:
+        name = getValueAt(row, 1).toString();
+        break;
+      case PREFERENCES:
+        name = getValueAt(row, 0).toString();
+        break;
+      default:
+        break;
+      }
+      boolean selected = ((Boolean) value).booleanValue();
+
+      FTSDataColumnI ftsDataColumn = map.get(name);
+
+      if (currentSource == PreferenceSource.SEARCH_SUMMARY)
+      {
+        updatePrefs(ftsRestClient
+                .getAllDefaulDisplayedDataColumns(), ftsDataColumn,
+                selected);
+      }
+      else if (currentSource == PreferenceSource.STRUCTURE_CHOOSER)
+      {
+        updatePrefs(structSummaryColumns, ftsDataColumn, selected);
+      }
+      else if (currentSource == PreferenceSource.PREFERENCES)
+      {
+        if (col == 1)
+        {
+          updatePrefs(ftsRestClient
+                  .getAllDefaulDisplayedDataColumns(), ftsDataColumn,
+                  selected);
+        }
+        else if (col == 2)
+        {
+          updatePrefs(structSummaryColumns, ftsDataColumn, selected);
+        }
+      }
+    }
+
+    private void updatePrefs(
+            Collection<FTSDataColumnI> prefConfig,
+            FTSDataColumnI dataColumn, boolean selected)
+    {
+      if (prefConfig.contains(dataColumn) && !selected)
+      {
+        prefConfig.remove(dataColumn);
+      }
+
+      if (!prefConfig.contains(dataColumn) && selected)
+      {
+        prefConfig.add(dataColumn);
+      }
+    }
+
+  }
+}
diff --git a/src/jalview/fts/core/FTSRestClient.java b/src/jalview/fts/core/FTSRestClient.java
new file mode 100644 (file)
index 0000000..2f24a01
--- /dev/null
@@ -0,0 +1,447 @@
+package jalview.fts.core;
+
+import jalview.fts.api.FTSDataColumnI;
+import jalview.fts.api.FTSDataColumnI.FTSDataColumnGroupI;
+import jalview.fts.api.FTSRestClientI;
+import jalview.util.MessageManager;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Objects;
+
+/**
+ * Base class providing implementation for common methods defined in
+ * FTSRestClientI
+ * 
+ * @author tcnofoegbu
+ * 
+ * @note implementations MUST be accessed as a singleton.
+ */
+public abstract class FTSRestClient implements FTSRestClientI
+{
+  protected Collection<FTSDataColumnI> dataColumns = new ArrayList<FTSDataColumnI>();
+
+  protected Collection<FTSDataColumnGroupI> dataColumnGroups = new ArrayList<FTSDataColumnGroupI>();
+
+  protected Collection<FTSDataColumnI> searchableDataColumns = new ArrayList<FTSDataColumnI>();
+
+  protected Collection<FTSDataColumnI> defaulDisplayedDataColumns = new ArrayList<FTSDataColumnI>();
+
+  protected FTSDataColumnI primaryKeyColumn;
+
+  private String primaryKeyColumnCode = null;
+
+  private int defaultResponsePageSize = 100;
+
+  protected FTSRestClient()
+  {
+
+  }
+
+  public void parseDataColumnsConfigFile()
+  {
+    String fileName = getColumnDataConfigFileName();
+    
+    InputStream in = getClass().getResourceAsStream(fileName); 
+    
+    try (BufferedReader br = new BufferedReader(new InputStreamReader(in)))
+    {
+      String line;
+      while ((line = br.readLine()) != null)
+      {
+        final String[] lineData = line.split(";");
+        try
+        {
+          if (lineData.length == 2)
+          {
+            if (lineData[0].equalsIgnoreCase("_data_column.primary_key"))
+            {
+              primaryKeyColumnCode = lineData[1];
+            }
+            if (lineData[0]
+                    .equalsIgnoreCase("_data_column.default_response_page_size"))
+            {
+              defaultResponsePageSize = Integer.valueOf(lineData[1]);
+            }
+          }
+          else if (lineData.length == 3)
+          {
+            dataColumnGroups.add(new FTSDataColumnGroupI()
+            {
+              @Override
+              public String getID()
+              {
+                return lineData[0];
+              }
+
+              @Override
+              public String getName()
+              {
+                return lineData[1];
+              }
+
+              @Override
+              public int getSortOrder()
+              {
+                return Integer.valueOf(lineData[2]);
+              }
+
+              @Override
+              public String toString()
+              {
+                return lineData[1];
+              }
+
+              @Override
+              public int hashCode()
+              {
+                return Objects.hash(this.getID(), this.getName(),
+                        this.getSortOrder());
+              }
+
+              @Override
+              public boolean equals(Object otherObject)
+              {
+                FTSDataColumnGroupI that = (FTSDataColumnGroupI) otherObject;
+                return this.getID().equals(that.getID())
+                        && this.getName().equals(that.getName())
+                        && this.getSortOrder() == that.getSortOrder();
+              }
+            });
+          }
+          else if (lineData.length > 6)
+          {
+            FTSDataColumnI dataCol = new FTSDataColumnI()
+            {
+              @Override
+              public String toString()
+              {
+                return lineData[0];
+              }
+
+              @Override
+              public String getName()
+              {
+                return lineData[0];
+              }
+
+              @Override
+              public String getCode()
+              {
+                return lineData[1].split("\\|")[0];
+              }
+
+              @Override
+              public String getAltCode()
+              {
+                return lineData[1].split("\\|").length > 1 ? lineData[1]
+                        .split("\\|")[1] : getCode();
+              }
+
+              @Override
+              public Class<?> getDataColumnClass()
+              {
+                String classString = lineData[2];
+                classString = classString.toUpperCase();
+                switch (classString)
+                {
+                case "INT":
+                case "INTEGER":
+                  return Integer.class;
+                case "DOUBLE":
+                  return Double.class;
+                case "STRING":
+                default:
+                  return String.class;
+                }
+              }
+
+              @Override
+              public FTSDataColumnGroupI getGroup()
+              {
+                FTSDataColumnGroupI group = null;
+                try
+                {
+                  group = getDataColumnGroupById(lineData[3]);
+                } catch (Exception e)
+                {
+                  e.printStackTrace();
+                }
+                return group;
+              }
+
+              @Override
+              public int getMinWidth()
+              {
+                return Integer.valueOf(lineData[4]);
+              }
+
+              @Override
+              public int getMaxWidth()
+              {
+                return Integer.valueOf(lineData[5]);
+              }
+
+              @Override
+              public int getPreferredWidth()
+              {
+                return Integer.valueOf(lineData[6]);
+              }
+
+              @Override
+              public boolean isPrimaryKeyColumn()
+              {
+                return getName().equalsIgnoreCase(primaryKeyColumnCode)
+                        || getCode().equalsIgnoreCase(primaryKeyColumnCode);
+              }
+
+              @Override
+              public boolean isVisibleByDefault()
+              {
+                return Boolean.valueOf(lineData[7]);
+              }
+
+              @Override
+              public boolean isSearchable()
+              {
+                return Boolean.valueOf(lineData[8]);
+              }
+
+              @Override
+              public int hashCode()
+              {
+                return Objects.hash(this.getName(), this.getCode(),
+                        this.getGroup());
+              }
+
+
+              @Override
+              public boolean equals(Object otherObject)
+              {
+                FTSDataColumnI that = (FTSDataColumnI) otherObject;
+                return this.getCode().equals(that.getCode())
+                        && this.getName().equals(that.getName())
+                        && this.getGroup().equals(that.getGroup());
+              }
+
+            };
+            dataColumns.add(dataCol);
+
+            if (dataCol.isSearchable())
+            {
+              searchableDataColumns.add(dataCol);
+            }
+
+            if (dataCol.isVisibleByDefault())
+            {
+              defaulDisplayedDataColumns.add(dataCol);
+            }
+
+          }
+          else
+          {
+            continue;
+          }
+        } catch (Exception e)
+        {
+          e.printStackTrace();
+        }
+      }
+      try
+      {
+        this.primaryKeyColumn = getDataColumnByNameOrCode(primaryKeyColumnCode);
+      } catch (Exception e)
+      {
+        e.printStackTrace();
+      }
+    } catch (IOException e)
+    {
+      e.printStackTrace();
+    }
+  }
+
+  @Override
+  public int getPrimaryKeyColumIndex(
+          Collection<FTSDataColumnI> wantedFields, boolean hasRefSeq)
+          throws Exception
+  {
+
+    // If a reference sequence is attached then start counting from 1 else
+    // start from zero
+    int pdbFieldIndexCounter = hasRefSeq ? 1 : 0;
+
+    for (FTSDataColumnI field : wantedFields)
+    {
+      if (field.isPrimaryKeyColumn())
+      {
+        break; // Once PDB Id index is determined exit iteration
+      }
+      ++pdbFieldIndexCounter;
+    }
+    return pdbFieldIndexCounter;
+  }
+
+  @Override
+  public String getDataColumnsFieldsAsCommaDelimitedString(
+          Collection<FTSDataColumnI> dataColumnFields)
+  {
+    String result = "";
+    if (dataColumnFields != null && !dataColumnFields.isEmpty())
+    {
+      StringBuilder returnedFields = new StringBuilder();
+      for (FTSDataColumnI field : dataColumnFields)
+      {
+        returnedFields.append(",").append(field.getCode());
+      }
+      returnedFields.deleteCharAt(0);
+      result = returnedFields.toString();
+    }
+    return result;
+  }
+
+
+  @Override
+  public Collection<FTSDataColumnI> getAllFTSDataColumns()
+  {
+    if (dataColumns == null || dataColumns.isEmpty())
+    {
+      parseDataColumnsConfigFile();
+    }
+    return dataColumns;
+  }
+
+  @Override
+  public Collection<FTSDataColumnI> getSearchableDataColumns()
+  {
+    if (searchableDataColumns == null || searchableDataColumns.isEmpty())
+    {
+      parseDataColumnsConfigFile();
+    }
+    return searchableDataColumns;
+  }
+
+  @Override
+  public Collection<FTSDataColumnI> getAllDefaulDisplayedDataColumns()
+  {
+    if (defaulDisplayedDataColumns == null
+            || defaulDisplayedDataColumns.isEmpty())
+    {
+      parseDataColumnsConfigFile();
+    }
+    return defaulDisplayedDataColumns;
+  }
+
+  @Override
+  public FTSDataColumnI getPrimaryKeyColumn()
+  {
+    if (defaulDisplayedDataColumns == null
+            || defaulDisplayedDataColumns.isEmpty())
+    {
+      parseDataColumnsConfigFile();
+    }
+    return primaryKeyColumn;
+  }
+
+  @Override
+  public FTSDataColumnI getDataColumnByNameOrCode(String nameOrCode)
+          throws Exception
+  {
+    if (dataColumns == null || dataColumns.isEmpty())
+    {
+      parseDataColumnsConfigFile();
+    }
+    for (FTSDataColumnI column : dataColumns)
+    {
+      if (column.getName().equalsIgnoreCase(nameOrCode)
+              || column.getCode().equalsIgnoreCase(nameOrCode))
+      {
+        return column;
+      }
+    }
+    throw new Exception("Couldn't find data column with name : "
+            + nameOrCode);
+  }
+
+  @Override
+  public FTSDataColumnGroupI getDataColumnGroupById(String id)
+          throws Exception
+  {
+    if (dataColumns == null || dataColumns.isEmpty())
+    {
+      parseDataColumnsConfigFile();
+    }
+    for (FTSDataColumnGroupI columnGroup : dataColumnGroups)
+    {
+      if (columnGroup.getID().equalsIgnoreCase(id))
+      {
+        return columnGroup;
+      }
+    }
+    throw new Exception("Couldn't find data column group with id : " + id);
+  }
+
+  public String getMessageByHTTPStatusCode(int code, String service)
+  {
+    String message = "";
+    switch (code)
+    {
+    case 400:
+      message = MessageManager
+              .getString("exception.bad_request");
+      break;
+      
+    case 410:
+      message = MessageManager.formatMessage(
+              "exception.fts_rest_service_no_longer_available", service);
+      break;
+    case 403:
+    case 404:
+      message = MessageManager.getString("exception.resource_not_be_found");
+      break;
+    case 408:
+    case 409:
+    case 500:
+    case 501:
+    case 502:
+    case 504:
+    case 505:
+      message = MessageManager.getString("exception.fts_server_error");
+      break;
+    case 503:
+      message = MessageManager.getString("exception.service_not_available");
+      break;
+    default:
+      break;
+    }
+    return message;
+  }
+
+  protected String getResourceFile(String fileName)
+  {
+    String result = "";
+    try
+    {
+      result = getClass().getResource(fileName).getFile();
+    } catch (Exception e)
+    {
+      e.printStackTrace();
+    }
+    return result;
+
+  }
+
+  @Override
+  public int getDefaultResponsePageSize()
+  {
+    if (dataColumns == null || dataColumns.isEmpty())
+    {
+      parseDataColumnsConfigFile();
+    }
+    return defaultResponsePageSize;
+  }
+
+}
similarity index 70%
rename from src/jalview/ws/uimodel/PDBRestRequest.java
rename to src/jalview/fts/core/FTSRestRequest.java
index 24f38d1..164b102 100644 (file)
@@ -1,6 +1,6 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2)
- * Copyright (C) 2014 The Jalview Authors
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
  * 
  * This file is part of Jalview.
  * 
  * The Jalview Authors are detailed in the 'AUTHORS' file.
  */
 
-package jalview.ws.uimodel;
+package jalview.fts.core;
 
 import jalview.bin.Cache;
 import jalview.datamodel.SequenceI;
-import jalview.ws.dbsources.PDBRestClient.PDBDocField;
+import jalview.fts.api.FTSDataColumnI;
 
 import java.util.Collection;
 
 /**
- * Represents the PDB request to be consumed by the PDBRestClient
+ * Represents the FTS request to be consumed by the FTSRestClient
  * 
  * @author tcnofoegbu
  *
  */
-public class PDBRestRequest
+public class FTSRestRequest
 {
   private String fieldToSearchBy;
 
@@ -48,11 +48,19 @@ public class PDBRestRequest
   private boolean allowUnpublishedEntries = Cache.getDefault(
           "ALLOW_UNPUBLISHED_PDB_QUERYING", false);
 
+  private boolean facet;
+
+  private String facetPivot;
+
+  private int facetPivotMinCount;
+
   private int responseSize;
 
+  private int offSet;
+
   private boolean isSortAscending;
 
-  private Collection<PDBDocField> wantedFields;
+  private Collection<FTSDataColumnI> wantedFields;
 
   public String getFieldToSearchBy()
   {
@@ -94,12 +102,13 @@ public class PDBRestRequest
     this.responseSize = responseSize;
   }
 
-  public Collection<PDBDocField> getWantedFields()
+  public Collection<FTSDataColumnI> getWantedFields()
   {
     return wantedFields;
   }
 
-  public void setWantedFields(Collection<PDBDocField> wantedFields)
+  public void setWantedFields(
+          Collection<FTSDataColumnI> wantedFields)
   {
     this.wantedFields = wantedFields;
   }
@@ -130,27 +139,53 @@ public class PDBRestRequest
     this.associatedSequence = associatedSequence;
   }
 
-  public String getQuery()
+  public boolean isAllowUnpublishedEntries()
   {
-    return fieldToSearchBy + searchTerm
-            + (isAllowEmptySeq() ? "" : " AND molecule_sequence:['' TO *]")
-            + (isAllowUnpublishedEntries() ? "" : " AND status:REL");
+    return allowUnpublishedEntries;
   }
 
-  public String toString()
+  public void setAllowUnpublishedEntries(boolean allowUnpublishedEntries)
   {
-    return "Query : " + getQuery() + " sort field: " + fieldToSortBy
-            + " isAsc: " + isAscending() + " Associated Seq : "
-            + associatedSequence;
+    this.allowUnpublishedEntries = allowUnpublishedEntries;
   }
 
-  public boolean isAllowUnpublishedEntries()
+  public boolean isFacet()
   {
-    return allowUnpublishedEntries;
+    return facet;
   }
 
-  public void setAllowUnpublishedEntries(boolean allowUnpublishedEntries)
+  public void setFacet(boolean facet)
   {
-    this.allowUnpublishedEntries = allowUnpublishedEntries;
+    this.facet = facet;
+  }
+
+  public String getFacetPivot()
+  {
+    return facetPivot;
+  }
+
+  public void setFacetPivot(String facetPivot)
+  {
+    this.facetPivot = facetPivot;
+  }
+
+  public int getFacetPivotMinCount()
+  {
+    return facetPivotMinCount;
+  }
+
+  public void setFacetPivotMinCount(int facetPivotMinCount)
+  {
+    this.facetPivotMinCount = facetPivotMinCount;
+  }
+
+  public int getOffSet()
+  {
+    return offSet;
+  }
+
+  public void setOffSet(int offSet)
+  {
+    this.offSet = offSet;
   }
 }
diff --git a/src/jalview/fts/core/FTSRestResponse.java b/src/jalview/fts/core/FTSRestResponse.java
new file mode 100644 (file)
index 0000000..6cce2c4
--- /dev/null
@@ -0,0 +1,156 @@
+/*
+ * 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 <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
+
+package jalview.fts.core;
+
+import jalview.fts.api.FTSData;
+import jalview.fts.api.FTSDataColumnI;
+
+import java.util.Collection;
+
+import javax.swing.JTable;
+import javax.swing.table.DefaultTableModel;
+
+/**
+ * Represents the response model generated by the FTSRestClient upon successful
+ * execution of a given FTS request
+ * 
+ * @author tcnofoegbu
+ *
+ */
+public class FTSRestResponse
+{
+  private int numberOfItemsFound;
+
+  private String responseTime;
+
+  private Collection<FTSData> searchSummary;
+
+  public int getNumberOfItemsFound()
+  {
+    return numberOfItemsFound;
+  }
+
+  public void setNumberOfItemsFound(int itemFound)
+  {
+    this.numberOfItemsFound = itemFound;
+  }
+
+  public String getResponseTime()
+  {
+    return responseTime;
+  }
+
+  public void setResponseTime(String responseTime)
+  {
+    this.responseTime = responseTime;
+  }
+
+  public Collection<FTSData> getSearchSummary()
+  {
+    return searchSummary;
+  }
+
+  public void setSearchSummary(Collection<FTSData> searchSummary)
+  {
+    this.searchSummary = searchSummary;
+  }
+
+  /**
+   * Convenience method to obtain a Table model for a given summary List based
+   * on the request parameters
+   * 
+   * @param request
+   *          the FTSRestRequest object which holds useful information for
+   *          creating a table model
+   * @param summariesList
+   *          the summary list which contains the data for populating the
+   *          table's rows
+   * @return the table model which was dynamically generated
+   */
+  public static DefaultTableModel getTableModel(FTSRestRequest request,
+          Collection<FTSData> summariesList)
+  {
+    final FTSDataColumnI[] cols = request.getWantedFields()
+            .toArray(new FTSDataColumnI[0]);
+    final int colOffset = request.getAssociatedSequence() == null ? 0 : 1;
+    DefaultTableModel tableModel = new DefaultTableModel()
+    {
+      @Override
+      public boolean isCellEditable(int row, int column)
+      {
+        return false;
+      }
+
+      @Override
+      public Class<?> getColumnClass(int columnIndex)
+      {
+        if (colOffset == 1 && columnIndex == 0)
+        {
+          return String.class;
+        }
+        return cols[columnIndex - colOffset].getDataColumnClass();
+      }
+
+    };
+    if (request.getAssociatedSequence() != null)
+    {
+      tableModel.addColumn("Ref Sequence"); // Create sequence column header if
+      // exists in the request
+    }
+    for (FTSDataColumnI field : request
+            .getWantedFields())
+    {
+      tableModel.addColumn(field.getName()); // Create sequence column header if
+                                             // exists in the request
+    }
+
+    for (FTSData res : summariesList)
+    {
+      tableModel.addRow(res.getSummaryData()); // Populate table rows with
+                                               // summary list
+    }
+
+    return tableModel;
+  }
+
+  public static void configureTableColumn(JTable tbl_summary,
+          Collection<FTSDataColumnI> wantedFields)
+  {
+    for (FTSDataColumnI wantedField : wantedFields)
+    {
+      try
+      {
+        tbl_summary.getColumn(wantedField.getName()).setMinWidth(
+                wantedField.getMinWidth());
+        tbl_summary.getColumn(wantedField.getName()).setMaxWidth(
+                wantedField.getMaxWidth());
+        tbl_summary.getColumn(wantedField.getName()).setPreferredWidth(
+                wantedField.getPreferredWidth());
+      } catch (Exception e)
+      {
+        e.printStackTrace();
+      }
+    }
+  }
+
+
+}
diff --git a/src/jalview/fts/core/GFTSPanel.java b/src/jalview/fts/core/GFTSPanel.java
new file mode 100644 (file)
index 0000000..3e4a1cd
--- /dev/null
@@ -0,0 +1,940 @@
+/*
+ * 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 <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
+
+package jalview.fts.core;
+
+import jalview.fts.api.FTSDataColumnI;
+import jalview.fts.api.GFTSPanelI;
+import jalview.fts.core.FTSDataColumnPreferences.PreferenceSource;
+import jalview.gui.Desktop;
+import jalview.gui.IProgressIndicator;
+import jalview.gui.JvSwingUtils;
+import jalview.gui.SequenceFetcher;
+import jalview.util.MessageManager;
+
+import java.awt.BorderLayout;
+import java.awt.CardLayout;
+import java.awt.Dimension;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
+import java.awt.event.KeyAdapter;
+import java.awt.event.KeyEvent;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+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;
+import javax.swing.JButton;
+import javax.swing.JComboBox;
+import javax.swing.JFrame;
+import javax.swing.JInternalFrame;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTabbedPane;
+import javax.swing.JTable;
+import javax.swing.JTextField;
+import javax.swing.Timer;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+import javax.swing.table.DefaultTableModel;
+import javax.swing.table.TableColumn;
+
+/**
+ * This class provides the swing GUI layout for FTS Panel and implements most of
+ * the contracts defined in GFSPanelI
+ * 
+ * @author tcnofoegbu
+ *
+ */
+
+@SuppressWarnings("serial")
+public abstract class GFTSPanel extends JPanel implements GFTSPanelI
+{
+  protected JInternalFrame mainFrame = new JInternalFrame(
+          getFTSFrameTitle());
+
+  protected IProgressIndicator progressIdicator;
+
+  protected JComboBox<FTSDataColumnI> cmb_searchTarget = new JComboBox<FTSDataColumnI>();
+
+  protected JButton btn_ok = new JButton();
+
+  protected JButton btn_back = new JButton();
+
+  protected JButton btn_cancel = new JButton();
+
+  protected JTextField txt_search = new JTextField(30);
+
+  protected SequenceFetcher seqFetcher;
+
+  protected Collection<FTSDataColumnI> wantedFields;
+
+  private String lastSearchTerm = "";
+
+  protected JButton btn_next_page = new JButton();
+
+  protected JButton btn_prev_page = new JButton();
+
+  protected StringBuilder errorWarning = new StringBuilder();
+
+  protected ImageIcon warningImage = new ImageIcon(getClass().getResource(
+          "/images/warning.gif"));
+
+  protected ImageIcon loadingImage = new ImageIcon(getClass().getResource(
+          "/images/loading.gif"));
+
+  protected ImageIcon balnkPlaceholderImage = new ImageIcon(getClass()
+          .getResource("/images/blank_16x16_placeholder.png"));
+
+  protected JLabel lbl_warning = new JLabel(warningImage);
+
+  protected JLabel lbl_loading = new JLabel(loadingImage);
+
+  protected JLabel lbl_blank = new JLabel(balnkPlaceholderImage);
+
+  private JTabbedPane tabbedPane = new JTabbedPane();
+
+  private JPanel pnl_actions = new JPanel();
+
+  private JPanel pnl_results = new JPanel(new CardLayout());
+
+  private JPanel pnl_inputs = new JPanel();
+
+  private BorderLayout mainLayout = new BorderLayout();
+
+  protected Object[] previousWantedFields;
+
+  protected int resultSetCount;
+
+  protected int totalResultSetCount;
+
+  protected int offSet;
+
+  protected int pageLimit;
+
+  protected HashSet<String> paginatorCart = new HashSet<String>();
+
+  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());
+      }
+      resizeAndRepaint();
+    }
+
+    @Override
+    public String getToolTipText(MouseEvent evt)
+    {
+      String toolTipText = null;
+      java.awt.Point pnt = evt.getPoint();
+      int rowIndex = rowAtPoint(pnt);
+      int colIndex = columnAtPoint(pnt);
+
+      try
+      {
+        if (getValueAt(rowIndex, colIndex) == null)
+        {
+          return null;
+        }
+        toolTipText = getValueAt(rowIndex, colIndex).toString();
+
+      } catch (Exception e)
+      {
+        e.printStackTrace();
+      }
+      toolTipText = (toolTipText == null ? null
+              : (toolTipText.length() > 500 ? JvSwingUtils.wrapTooltip(
+                      true, toolTipText.subSequence(0, 500) + "...")
+                      : JvSwingUtils.wrapTooltip(true, toolTipText)));
+
+      return toolTipText;
+    }
+  };
+  protected JScrollPane scrl_searchResult = new JScrollPane(tbl_summary);
+
+  public GFTSPanel()
+  {
+    try
+    {
+      jbInit();
+      mainFrame.invalidate();
+      mainFrame.pack();
+    } catch (Exception e)
+    {
+      e.printStackTrace();
+    }
+  }
+
+  /**
+   * Initializes the GUI default properties
+   * 
+   * @throws Exception
+   */
+  private void jbInit() throws Exception
+  {
+    lbl_warning.setVisible(false);
+    lbl_warning.setFont(new java.awt.Font("Verdana", 0, 12));
+    lbl_loading.setVisible(false);
+    lbl_loading.setFont(new java.awt.Font("Verdana", 0, 12));
+    lbl_blank.setVisible(true);
+    lbl_blank.setFont(new java.awt.Font("Verdana", 0, 12));
+
+    tbl_summary.setAutoCreateRowSorter(true);
+    tbl_summary.getTableHeader().setReorderingAllowed(false);
+    tbl_summary.addMouseListener(new MouseAdapter()
+    {
+      @Override
+      public void mouseClicked(MouseEvent e)
+      {
+        validateSelection();
+      }
+
+      @Override
+      public void mouseReleased(MouseEvent e)
+      {
+        validateSelection();
+      }
+    });
+    tbl_summary.addKeyListener(new KeyAdapter()
+    {
+      @Override
+      public void keyPressed(KeyEvent evt)
+      {
+        validateSelection();
+        switch (evt.getKeyCode())
+        {
+        case KeyEvent.VK_ESCAPE: // escape key
+          btn_back_ActionPerformed();
+          break;
+        case KeyEvent.VK_ENTER: // enter key
+          if (btn_ok.isEnabled())
+          {
+            okAction();
+          }
+          evt.consume();
+          break;
+        case KeyEvent.VK_TAB: // tab key
+          if (evt.isShiftDown())
+          {
+            tabbedPane.requestFocus();
+          }
+          else
+          {
+            btn_back.requestFocus();
+          }
+          evt.consume();
+          break;
+        default:
+          return;
+        }
+      }
+    });
+
+    btn_back.setFont(new java.awt.Font("Verdana", 0, 12));
+    btn_back.setText(MessageManager.getString("action.back"));
+    btn_back.addActionListener(new java.awt.event.ActionListener()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        btn_back_ActionPerformed();
+      }
+    });
+    btn_back.addKeyListener(new KeyAdapter()
+    {
+      @Override
+      public void keyPressed(KeyEvent evt)
+      {
+        if (evt.getKeyCode() == KeyEvent.VK_ENTER)
+        {
+          btn_back_ActionPerformed();
+        }
+      }
+    });
+
+    btn_ok.setEnabled(false);
+    btn_ok.setFont(new java.awt.Font("Verdana", 0, 12));
+    btn_ok.setText(MessageManager.getString("action.ok"));
+    btn_ok.addActionListener(new java.awt.event.ActionListener()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        okAction();
+      }
+    });
+    btn_ok.addKeyListener(new KeyAdapter()
+    {
+      @Override
+      public void keyPressed(KeyEvent evt)
+      {
+        if (evt.getKeyCode() == KeyEvent.VK_ENTER)
+        {
+          okAction();
+        }
+      }
+    });
+    btn_next_page.setEnabled(false);
+    btn_next_page.setToolTipText(MessageManager
+            .getString("label.next_page_tooltop"));
+    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()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        nextPageAction();
+      }
+    });
+    btn_next_page.addKeyListener(new KeyAdapter()
+    {
+      @Override
+      public void keyPressed(KeyEvent evt)
+      {
+        if (evt.getKeyCode() == KeyEvent.VK_ENTER)
+        {
+          nextPageAction();
+        }
+      }
+    });
+
+    btn_prev_page.setEnabled(false);
+    btn_prev_page.setToolTipText(MessageManager
+            .getString("label.prev_page_tooltop"));
+    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()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        prevPageAction();
+      }
+    });
+    btn_prev_page.addKeyListener(new KeyAdapter()
+    {
+      @Override
+      public void keyPressed(KeyEvent evt)
+      {
+        if (evt.getKeyCode() == KeyEvent.VK_ENTER)
+        {
+          prevPageAction();
+        }
+      }
+    });
+
+    if (isPaginationEnabled())
+    {
+      btn_prev_page.setVisible(true);
+      btn_next_page.setVisible(true);
+    }
+    else
+    {
+      btn_prev_page.setVisible(false);
+      btn_next_page.setVisible(false);
+    }
+
+    btn_cancel.setFont(new java.awt.Font("Verdana", 0, 12));
+    btn_cancel.setText(MessageManager.getString("action.cancel"));
+    btn_cancel.addActionListener(new java.awt.event.ActionListener()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        btn_cancel_ActionPerformed();
+      }
+    });
+    btn_cancel.addKeyListener(new KeyAdapter()
+    {
+      @Override
+      public void keyPressed(KeyEvent evt)
+      {
+        if (evt.getKeyCode() == KeyEvent.VK_ENTER)
+        {
+          btn_cancel_ActionPerformed();
+        }
+      }
+    });
+    scrl_searchResult.setPreferredSize(new Dimension(800, 400));
+
+    cmb_searchTarget.setFont(new java.awt.Font("Verdana", 0, 12));
+    cmb_searchTarget.addActionListener(new ActionListener()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        String tooltipText;
+        if ("all".equalsIgnoreCase(getCmbSearchTarget().getSelectedItem()
+                .toString()))
+        {
+          tooltipText = MessageManager.getString("label.search_all");
+        }
+        else if ("pdb id".equalsIgnoreCase(getCmbSearchTarget()
+                .getSelectedItem().toString()))
+        {
+          tooltipText = MessageManager
+                  .getString("label.separate_multiple_accession_ids");
+        }
+        else
+        {
+          tooltipText = MessageManager.formatMessage(
+                  "label.separate_multiple_query_values",
+                  new Object[] { getCmbSearchTarget().getSelectedItem()
+                          .toString() });
+        }
+        txt_search.setToolTipText(JvSwingUtils.wrapTooltip(true,
+                tooltipText));
+        searchAction(true);
+      }
+    });
+
+    populateCmbSearchTargetOptions();
+
+    txt_search.setFont(new java.awt.Font("Verdana", 0, 12));
+
+    txt_search.addKeyListener(new KeyAdapter()
+    {
+      @Override
+      public void keyPressed(KeyEvent e)
+      {
+        if (e.getKeyCode() == KeyEvent.VK_ENTER)
+        {
+          if (txt_search.getText() == null
+                  || txt_search.getText().isEmpty())
+          {
+            return;
+          }
+          String primaryKeyName = getFTSRestClient().getPrimaryKeyColumn()
+                  .getName();
+          if (primaryKeyName.equalsIgnoreCase(getCmbSearchTarget()
+                  .getSelectedItem().toString()))
+          {
+            transferToSequenceFetcher(txt_search.getText());
+          }
+        }
+      }
+    });
+
+    final DeferredTextInputListener listener = new DeferredTextInputListener(
+            1500,
+            new ActionListener()
+            {
+              @Override
+              public void actionPerformed(ActionEvent e)
+              {
+                if (!getTypedText().equalsIgnoreCase(lastSearchTerm))
+                {
+                  searchAction(true);
+                  paginatorCart.clear();
+                  lastSearchTerm = getTypedText();
+                }
+              }
+            }, false);
+    txt_search.getDocument().addDocumentListener(listener);
+    txt_search.addFocusListener(new FocusListener()
+    {
+      @Override
+      public void focusGained(FocusEvent e)
+      {
+        listener.start();
+      }
+
+      @Override
+      public void focusLost(FocusEvent e)
+      {
+//        listener.stop();
+      }
+    });
+
+    final String searchTabTitle = MessageManager
+            .getString("label.search_result");
+    final String configureCols = MessageManager
+            .getString("label.configure_displayed_columns");
+    ChangeListener changeListener = new ChangeListener()
+    {
+      @Override
+      public void stateChanged(ChangeEvent changeEvent)
+      {
+        JTabbedPane sourceTabbedPane = (JTabbedPane) changeEvent
+                .getSource();
+        int index = sourceTabbedPane.getSelectedIndex();
+
+        btn_back.setVisible(true);
+        btn_cancel.setVisible(true);
+        btn_ok.setVisible(true);
+        if (sourceTabbedPane.getTitleAt(index).equals(configureCols))
+        {
+          btn_back.setVisible(false);
+          btn_cancel.setVisible(false);
+          btn_ok.setVisible(false);
+          btn_back.setEnabled(false);
+          btn_cancel.setEnabled(false);
+          btn_ok.setEnabled(false);
+          btn_next_page.setEnabled(false);
+          btn_prev_page.setEnabled(false);
+          txt_search.setEnabled(false);
+          cmb_searchTarget.setEnabled(false);
+          previousWantedFields = getFTSRestClient()
+                  .getAllDefaulDisplayedDataColumns()
+                  .toArray(new Object[0]);
+        }
+        if (sourceTabbedPane.getTitleAt(index).equals(searchTabTitle))
+        {
+          btn_back.setEnabled(true);
+          btn_cancel.setEnabled(true);
+          refreshPaginatorState();
+          txt_search.setEnabled(true);
+          cmb_searchTarget.setEnabled(true);
+          if (wantedFieldsUpdated())
+          {
+            searchAction(true);
+            paginatorCart.clear();
+          }
+          else
+          {
+            validateSelection();
+          }
+        }
+      }
+    };
+    tabbedPane.addChangeListener(changeListener);
+    tabbedPane.setPreferredSize(new Dimension(800, 400));
+    tabbedPane.add(searchTabTitle, scrl_searchResult);
+    tabbedPane.add(configureCols, new FTSDataColumnPreferences(
+            PreferenceSource.SEARCH_SUMMARY, getFTSRestClient()));
+
+    pnl_actions.add(btn_back);
+    pnl_actions.add(btn_ok);
+    pnl_actions.add(btn_cancel);
+
+    pnl_results.add(tabbedPane);
+    pnl_inputs.add(cmb_searchTarget);
+    pnl_inputs.add(txt_search);
+    pnl_inputs.add(lbl_loading);
+    pnl_inputs.add(lbl_warning);
+    pnl_inputs.add(lbl_blank);
+    pnl_inputs.add(btn_prev_page);
+    pnl_inputs.add(btn_next_page);
+
+    this.setLayout(mainLayout);
+    this.add(pnl_inputs, java.awt.BorderLayout.NORTH);
+    this.add(pnl_results, java.awt.BorderLayout.CENTER);
+    this.add(pnl_actions, java.awt.BorderLayout.SOUTH);
+    mainFrame.setVisible(true);
+    mainFrame.setContentPane(this);
+    mainFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
+    Desktop.addInternalFrame(mainFrame, getFTSFrameTitle(), 900, 500);
+  }
+
+  public class DeferredTextInputListener implements DocumentListener
+  {
+    private final Timer swingTimer;
+
+    public DeferredTextInputListener(int timeOut, ActionListener listener,
+            boolean repeats)
+    {
+      swingTimer = new Timer(timeOut, listener);
+      swingTimer.setRepeats(repeats);
+    }
+
+    public void start()
+    {
+      swingTimer.start();
+    }
+
+    public void stop()
+    {
+      swingTimer.stop();
+    }
+
+    @Override
+    public void insertUpdate(DocumentEvent e)
+    {
+      swingTimer.restart();
+    }
+
+    @Override
+    public void removeUpdate(DocumentEvent e)
+    {
+      swingTimer.restart();
+    }
+
+    @Override
+    public void changedUpdate(DocumentEvent e)
+    {
+      swingTimer.restart();
+    }
+
+  }
+
+  public boolean wantedFieldsUpdated()
+  {
+    if (previousWantedFields == null)
+    {
+      return true;
+    }
+
+    return Arrays.equals(getFTSRestClient()
+            .getAllDefaulDisplayedDataColumns()
+            .toArray(new Object[0]), previousWantedFields) ? false
+            : true;
+
+  }
+
+  public void validateSelection()
+  {
+    if (tbl_summary.getSelectedRows().length > 0
+            || !paginatorCart.isEmpty())
+    {
+      btn_ok.setEnabled(true);
+    }
+    else
+    {
+      btn_ok.setEnabled(false);
+    }
+  }
+
+  public JComboBox<FTSDataColumnI> getCmbSearchTarget()
+  {
+    return cmb_searchTarget;
+  }
+
+  public JTextField getTxtSearch()
+  {
+    return txt_search;
+  }
+
+  public JInternalFrame getMainFrame()
+  {
+    return mainFrame;
+  }
+
+  protected void delayAndEnableActionButtons()
+  {
+    new Thread()
+    {
+      @Override
+      public void run()
+      {
+        try
+        {
+          Thread.sleep(1500);
+        } catch (InterruptedException e)
+        {
+          e.printStackTrace();
+        }
+        btn_ok.setEnabled(true);
+        btn_back.setEnabled(true);
+        btn_cancel.setEnabled(true);
+      }
+    }.start();
+  }
+
+  protected void checkForErrors()
+  {
+    lbl_warning.setVisible(false);
+    lbl_blank.setVisible(true);
+    if (errorWarning.length() > 0)
+    {
+      lbl_loading.setVisible(false);
+      lbl_blank.setVisible(false);
+      lbl_warning.setToolTipText(JvSwingUtils.wrapTooltip(true,
+              errorWarning.toString()));
+      lbl_warning.setVisible(true);
+    }
+  }
+
+  protected void btn_back_ActionPerformed()
+  {
+    mainFrame.dispose();
+    new SequenceFetcher(progressIdicator);
+  }
+
+  protected void disableActionButtons()
+  {
+    btn_ok.setEnabled(false);
+    btn_back.setEnabled(false);
+    btn_cancel.setEnabled(false);
+  }
+
+  protected void btn_cancel_ActionPerformed()
+  {
+    mainFrame.dispose();
+  }
+
+  /**
+   * Populates search target combo-box options
+   */
+  public void populateCmbSearchTargetOptions()
+  {
+    List<FTSDataColumnI> searchableTargets = new ArrayList<FTSDataColumnI>();
+    try
+    {
+      Collection<FTSDataColumnI> foundFTSTargets = getFTSRestClient()
+              .getSearchableDataColumns();
+      searchableTargets.addAll(foundFTSTargets);
+    } catch (Exception e)
+    {
+      e.printStackTrace();
+    }
+
+    Collections.sort(searchableTargets, new Comparator<FTSDataColumnI>()
+    {
+      @Override
+      public int compare(FTSDataColumnI o1, FTSDataColumnI o2)
+      {
+        return o1.getName().compareTo(o2.getName());
+      }
+    });
+
+    for (FTSDataColumnI searchTarget : searchableTargets)
+    {
+      cmb_searchTarget.addItem(searchTarget);
+    }
+  }
+
+
+  public void transferToSequenceFetcher(String ids)
+  {
+    // mainFrame.dispose();
+    seqFetcher.getTextArea().setText(ids);
+    Thread worker = new Thread(seqFetcher);
+    worker.start();
+  }
+
+  @Override
+  public String getTypedText()
+  {
+    return txt_search.getText().trim();
+  }
+
+  @Override
+  public JTable getResultTable()
+  {
+    return tbl_summary;
+  }
+
+  public void reset()
+  {
+    lbl_loading.setVisible(false);
+    errorWarning.setLength(0);
+    lbl_warning.setVisible(false);
+    lbl_blank.setVisible(true);
+    btn_ok.setEnabled(false);
+    mainFrame.setTitle(getFTSFrameTitle());
+    referesh();
+    tbl_summary.setModel(new DefaultTableModel());
+    tbl_summary.setVisible(false);
+  }
+
+  @Override
+  public void setPrevPageButtonEnabled(boolean isEnabled)
+  {
+    btn_prev_page.setEnabled(isEnabled);
+  }
+
+  @Override
+  public void setNextPageButtonEnabled(boolean isEnabled)
+  {
+    btn_next_page.setEnabled(isEnabled);
+  }
+
+  @Override
+  public void setErrorMessage(String message)
+  {
+    errorWarning.append(message);
+  }
+
+  @Override
+  public void updateSearchFrameTitle(String title)
+  {
+    mainFrame.setTitle(title);
+  }
+
+  @Override
+  public void setSearchInProgress(Boolean isSearchInProgress)
+  {
+    lbl_blank.setVisible(!isSearchInProgress);
+    lbl_loading.setVisible(isSearchInProgress);
+  }
+
+  @Override
+  public void prevPageAction()
+  {
+    updatePaginatorCart();
+    if (offSet >= pageLimit)
+    {
+      offSet = offSet - pageLimit;
+      searchAction(false);
+    }
+    else
+    {
+      refreshPaginatorState();
+    }
+  }
+
+  @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);
+    // System.out.println("offSet : " + offSet);
+    // System.out.println("page limit : " + pageLimit);
+    setPrevPageButtonEnabled(false);
+    setNextPageButtonEnabled(false);
+    if (resultSetCount == 0 && pageLimit == 0)
+    {
+      return;
+    }
+    if (resultSetCount >= pageLimit)
+    {
+      setNextPageButtonEnabled(true);
+    }
+    if (offSet >= pageLimit)
+    {
+      setPrevPageButtonEnabled(true);
+    }
+  }
+  public void referesh()
+  {
+    mainFrame.setTitle(getFTSFrameTitle());
+  }
+
+}
diff --git a/src/jalview/fts/service/pdb/PDBFTSPanel.java b/src/jalview/fts/service/pdb/PDBFTSPanel.java
new file mode 100644 (file)
index 0000000..74b7853
--- /dev/null
@@ -0,0 +1,265 @@
+/*
+ * 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 <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
+
+package jalview.fts.service.pdb;
+
+import jalview.fts.api.FTSDataColumnI;
+import jalview.fts.api.FTSRestClientI;
+import jalview.fts.core.FTSRestRequest;
+import jalview.fts.core.FTSRestResponse;
+import jalview.fts.core.GFTSPanel;
+import jalview.gui.SequenceFetcher;
+import jalview.util.MessageManager;
+
+import java.util.HashSet;
+
+@SuppressWarnings("serial")
+public class PDBFTSPanel extends GFTSPanel
+{
+  private static String defaultFTSFrameTitle = MessageManager
+          .getString("label.pdb_sequence_fetcher");
+
+  private String ftsFrameTitle = defaultFTSFrameTitle;
+
+  public PDBFTSPanel(SequenceFetcher seqFetcher)
+  {
+    pageLimit = PDBFTSRestClient.getInstance().getDefaultResponsePageSize();
+    this.seqFetcher = seqFetcher;
+    this.progressIdicator = (seqFetcher == null) ? null : seqFetcher
+            .getProgressIndicator();
+  }
+
+
+  @Override
+  public void searchAction(boolean isFreshSearch)
+  {
+    if (isFreshSearch)
+    {
+      offSet = 0;
+    }
+    new Thread()
+    {
+      @Override
+      public void run()
+      {
+        ftsFrameTitle = defaultFTSFrameTitle;
+        reset();
+        boolean allowEmptySequence = false;
+        if (getTypedText().length() > 0)
+        {
+          setSearchInProgress(true);
+          long startTime = System.currentTimeMillis();
+
+          String searchTarget = ((FTSDataColumnI) cmb_searchTarget
+                  .getSelectedItem()).getCode();
+          wantedFields = PDBFTSRestClient.getInstance()
+                  .getAllDefaulDisplayedDataColumns();
+          String searchTerm = decodeSearchTerm(txt_search.getText(),
+                  searchTarget);
+
+          FTSRestRequest request = new FTSRestRequest();
+          request.setAllowEmptySeq(allowEmptySequence);
+          request.setResponseSize(100);
+          request.setFieldToSearchBy("(" + searchTarget + ":");
+          request.setSearchTerm(searchTerm + ")");
+          request.setOffSet(offSet);
+          request.setWantedFields(wantedFields);
+          FTSRestClientI pdbRestCleint = PDBFTSRestClient.getInstance();
+          FTSRestResponse resultList;
+          try
+          {
+            resultList = pdbRestCleint.executeRequest(request);
+          } catch (Exception e)
+          {
+            setErrorMessage(e.getMessage());
+            checkForErrors();
+            return;
+          }
+
+          if (resultList.getSearchSummary() != null
+                  && resultList.getSearchSummary().size() > 0)
+          {
+            getResultTable().setModel(
+                    FTSRestResponse.getTableModel(request,
+                    resultList.getSearchSummary()));
+            FTSRestResponse.configureTableColumn(getResultTable(),
+                    wantedFields);
+            getResultTable().setVisible(true);
+          }
+
+          long endTime = System.currentTimeMillis();
+          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) + " of "
+                    + totalResultSetCount
+                    + " " + " (" + (endTime - startTime) + " milli secs)");
+          }
+          else
+          {
+            updateSearchFrameTitle(defaultFTSFrameTitle + " - "
+                    + resultSetCount + " " + result + " ("
+                    + (endTime - startTime) + " milli secs)");
+          }
+          
+          setSearchInProgress(false);
+          refreshPaginatorState();
+          updateSummaryTableSelections();
+        }
+      }
+    }.start();
+  }
+
+  public static String decodeSearchTerm(String enteredText,
+          String targetField)
+  {
+    String foundSearchTerms = enteredText;
+    StringBuilder foundSearchTermsBuilder = new StringBuilder();
+    if (enteredText.contains(";"))
+    {
+      String[] searchTerms = enteredText.split(";");
+      for (String searchTerm : searchTerms)
+      {
+        if (searchTerm.contains(":"))
+        {
+          foundSearchTermsBuilder.append(targetField).append(":")
+                  .append(searchTerm.split(":")[0]).append(" OR ");
+        }
+        else
+        {
+          foundSearchTermsBuilder.append(targetField).append(":")
+                  .append(searchTerm).append(" OR ");
+        }
+      }
+      int endIndex = foundSearchTermsBuilder.lastIndexOf(" OR ");
+      foundSearchTerms = foundSearchTermsBuilder.toString();
+      if (foundSearchTerms.contains(" OR "))
+      {
+        foundSearchTerms = foundSearchTerms.substring(
+                targetField.length() + 1, endIndex);
+      }
+    }
+    else if (enteredText.contains(":"))
+    {
+      foundSearchTerms = foundSearchTerms.split(":")[0];
+    }
+    return foundSearchTerms;
+  }
+
+  @Override
+  public void okAction()
+  {
+    // mainFrame.dispose();
+    disableActionButtons();
+    StringBuilder selectedIds = new StringBuilder();
+    HashSet<String> selectedIdsSet = new HashSet<String>();
+    int primaryKeyColIndex = 0;
+    try
+    {
+      primaryKeyColIndex = getFTSRestClient().getPrimaryKeyColumIndex(
+              wantedFields,
+              false);
+    } catch (Exception e)
+    {
+      e.printStackTrace();
+    }
+    int[] selectedRows = getResultTable().getSelectedRows();
+    String searchTerm = txt_search.getText();
+    for (int summaryRow : selectedRows)
+    {
+      String idStr = getResultTable().getValueAt(summaryRow,
+              primaryKeyColIndex)
+              .toString();
+      selectedIdsSet.add(getPDBIdwithSpecifiedChain(idStr, searchTerm));
+    }
+
+    for (String idStr : paginatorCart)
+    {
+      selectedIdsSet.add(getPDBIdwithSpecifiedChain(idStr, searchTerm));
+    }
+
+    for (String selectedId : selectedIdsSet)
+    {
+      selectedIds.append(selectedId).append(";");
+    }
+
+    String ids = selectedIds.toString();
+    // System.out.println(">>>>>>>>>>>>>>>> selected Ids: " + ids);
+    seqFetcher.getTextArea().setText(ids);
+    Thread worker = new Thread(seqFetcher);
+    worker.start();
+    delayAndEnableActionButtons();
+  }
+
+
+  public static String getPDBIdwithSpecifiedChain(String pdbId,
+          String searchTerm)
+  {
+    String pdbIdWithChainCode = "";
+    if (searchTerm.contains(";"))
+    {
+      String[] foundTerms = searchTerm.split(";");
+      for (String foundTerm : foundTerms)
+      {
+        if (foundTerm.contains(pdbId))
+        {
+          pdbIdWithChainCode = foundTerm;
+        }
+      }
+    }
+    else if (searchTerm.contains(pdbId))
+    {
+      pdbIdWithChainCode = searchTerm;
+    }
+    else
+    {
+      pdbIdWithChainCode = pdbId;
+    }
+    return pdbIdWithChainCode;
+  }
+
+  @Override
+  public FTSRestClientI getFTSRestClient()
+  {
+    return PDBFTSRestClient.getInstance();
+  }
+
+  @Override
+  public String getFTSFrameTitle()
+  {
+    return ftsFrameTitle;
+  }
+
+  @Override
+  public boolean isPaginationEnabled()
+  {
+    return true;
+  }
+
+}
diff --git a/src/jalview/fts/service/pdb/PDBFTSRestClient.java b/src/jalview/fts/service/pdb/PDBFTSRestClient.java
new file mode 100644 (file)
index 0000000..29450e8
--- /dev/null
@@ -0,0 +1,407 @@
+/*
+ * 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 <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
+package jalview.fts.service.pdb;
+
+import jalview.datamodel.SequenceI;
+import jalview.fts.api.FTSData;
+import jalview.fts.api.FTSDataColumnI;
+import jalview.fts.api.FTSRestClientI;
+import jalview.fts.core.FTSRestClient;
+import jalview.fts.core.FTSRestRequest;
+import jalview.fts.core.FTSRestResponse;
+import jalview.util.MessageManager;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Objects;
+
+import javax.ws.rs.core.MediaType;
+
+import org.json.simple.JSONArray;
+import org.json.simple.JSONObject;
+import org.json.simple.parser.JSONParser;
+import org.json.simple.parser.ParseException;
+
+import com.sun.jersey.api.client.Client;
+import com.sun.jersey.api.client.ClientResponse;
+import com.sun.jersey.api.client.WebResource;
+import com.sun.jersey.api.client.config.ClientConfig;
+import com.sun.jersey.api.client.config.DefaultClientConfig;
+
+/**
+ * A rest client for querying the Search endpoint of the PDB API
+ * 
+ * @author tcnofoegbu
+ *
+ */
+public class PDBFTSRestClient extends FTSRestClient
+{
+
+  private static FTSRestClientI instance = null;
+
+  public static final String PDB_SEARCH_ENDPOINT = "http://www.ebi.ac.uk/pdbe/search/pdb/select?";
+
+  protected PDBFTSRestClient()
+  {
+  }
+
+  /**
+   * Takes a PDBRestRequest object and returns a response upon execution
+   * 
+   * @param pdbRestRequest
+   *          the PDBRestRequest instance to be processed
+   * @return the pdbResponse object for the given request
+   * @throws Exception
+   */
+  @Override
+  public FTSRestResponse executeRequest(FTSRestRequest pdbRestRequest)
+          throws Exception
+  {
+    try
+    {
+      ClientConfig clientConfig = new DefaultClientConfig();
+      Client client = Client.create(clientConfig);
+
+      String wantedFields = getDataColumnsFieldsAsCommaDelimitedString(pdbRestRequest
+              .getWantedFields());
+      int responseSize = (pdbRestRequest.getResponseSize() == 0) ? getDefaultResponsePageSize()
+              : pdbRestRequest.getResponseSize();
+      int offSet = pdbRestRequest.getOffSet();
+      String sortParam = null;
+      if (pdbRestRequest.getFieldToSortBy() == null
+              || pdbRestRequest.getFieldToSortBy().trim().isEmpty())
+      {
+        sortParam = "";
+      }
+      else
+      {
+        if (pdbRestRequest.getFieldToSortBy()
+                .equalsIgnoreCase("Resolution"))
+        {
+          sortParam = pdbRestRequest.getFieldToSortBy()
+                  + (pdbRestRequest.isAscending() ? " asc" : " desc");
+        }
+        else
+        {
+          sortParam = pdbRestRequest.getFieldToSortBy()
+                  + (pdbRestRequest.isAscending() ? " desc" : " asc");
+        }
+      }
+
+      String facetPivot = (pdbRestRequest.getFacetPivot() == null || pdbRestRequest
+              .getFacetPivot().isEmpty()) ? "" : pdbRestRequest
+              .getFacetPivot();
+      String facetPivotMinCount = String.valueOf(pdbRestRequest
+              .getFacetPivotMinCount());
+
+      String query = pdbRestRequest.getFieldToSearchBy()
+              + pdbRestRequest.getSearchTerm()
+              + (pdbRestRequest.isAllowEmptySeq() ? ""
+                      : " AND molecule_sequence:['' TO *]")
+              + (pdbRestRequest.isAllowUnpublishedEntries() ? ""
+                      : " AND status:REL");
+
+      // Build request parameters for the REST Request
+      WebResource webResource = null;
+      if (pdbRestRequest.isFacet())
+      {
+        webResource = client.resource(PDB_SEARCH_ENDPOINT)
+                .queryParam("wt", "json").queryParam("fl", wantedFields)
+                .queryParam("rows", String.valueOf(responseSize))
+                .queryParam("q", query)
+                .queryParam("start", String.valueOf(offSet))
+                .queryParam("sort", sortParam).queryParam("facet", "true")
+                .queryParam("facet.pivot", facetPivot)
+                .queryParam("facet.pivot.mincount", facetPivotMinCount);
+      }
+      else
+      {
+        webResource = client.resource(PDB_SEARCH_ENDPOINT)
+                .queryParam("wt", "json").queryParam("fl", wantedFields)
+                .queryParam("rows", String.valueOf(responseSize))
+                .queryParam("start", String.valueOf(offSet))
+                .queryParam("q", query)
+                .queryParam("sort", sortParam);
+      }
+      // Execute the REST request
+      ClientResponse clientResponse = webResource.accept(
+              MediaType.APPLICATION_JSON).get(ClientResponse.class);
+
+      // Get the JSON string from the response object
+      String responseString = clientResponse.getEntity(String.class);
+      // System.out.println("query >>>>>>> " + pdbRestRequest.toString());
+
+      // Check the response status and report exception if one occurs
+      if (clientResponse.getStatus() != 200)
+      {
+        String errorMessage = "";
+        if (clientResponse.getStatus() == 400)
+        {
+          errorMessage = parseJsonExceptionString(responseString);
+          throw new Exception(errorMessage);
+        }
+        else
+        {
+          errorMessage = getMessageByHTTPStatusCode(clientResponse
+.getStatus(), "PDB");
+          throw new Exception(errorMessage);
+        }
+      }
+
+      // Make redundant objects eligible for garbage collection to conserve
+      // memory
+      clientResponse = null;
+      client = null;
+
+      // Process the response and return the result to the caller.
+      return parsePDBJsonResponse(responseString, pdbRestRequest);
+    } catch (Exception e)
+    {
+      String exceptionMsg = e.getMessage();
+      if (exceptionMsg.contains("SocketException"))
+      {
+        // No internet connection
+        throw new Exception(
+                MessageManager
+                        .getString("exception.unable_to_detect_internet_connection"));
+      }
+      else if (exceptionMsg.contains("UnknownHostException"))
+      {
+        // The server 'www.ebi.ac.uk' is unreachable
+        throw new Exception(MessageManager.formatMessage(
+                "exception.fts_server_unreachable", "PDB Solr"));
+      }
+      else
+      {
+        throw e;
+      }
+    }
+  }
+
+
+  /**
+   * Process error response from PDB server if/when one occurs.
+   * 
+   * @param jsonResponse
+   *          the JSON string containing error message from the server
+   * @return the processed error message from the JSON string
+   */
+  public static String parseJsonExceptionString(String jsonErrorResponse)
+  {
+    StringBuilder errorMessage = new StringBuilder(
+            "\n============= PDB Rest Client RunTime error =============\n");
+
+    try
+    {
+      JSONParser jsonParser = new JSONParser();
+      JSONObject jsonObj = (JSONObject) jsonParser.parse(jsonErrorResponse);
+      JSONObject errorResponse = (JSONObject) jsonObj.get("error");
+
+      JSONObject responseHeader = (JSONObject) jsonObj
+              .get("responseHeader");
+      JSONObject paramsObj = (JSONObject) responseHeader.get("params");
+      String status = responseHeader.get("status").toString();
+      String message = errorResponse.get("msg").toString();
+      String query = paramsObj.get("q").toString();
+      String fl = paramsObj.get("fl").toString();
+
+      errorMessage.append("Status: ").append(status).append("\n");
+      errorMessage.append("Message: ").append(message).append("\n");
+      errorMessage.append("query: ").append(query).append("\n");
+      errorMessage.append("fl: ").append(fl).append("\n");
+
+    } catch (ParseException e)
+    {
+      e.printStackTrace();
+    }
+    return errorMessage.toString();
+  }
+
+  /**
+   * Parses the JSON response string from PDB REST API. The response is dynamic
+   * hence, only fields specifically requested for in the 'wantedFields'
+   * parameter is fetched/processed
+   * 
+   * @param pdbJsonResponseString
+   *          the JSON string to be parsed
+   * @param pdbRestRequest
+   *          the request object which contains parameters used to process the
+   *          JSON string
+   * @return
+   */
+  @SuppressWarnings("unchecked")
+  public static FTSRestResponse parsePDBJsonResponse(
+          String pdbJsonResponseString, FTSRestRequest pdbRestRequest)
+  {
+    FTSRestResponse searchResult = new FTSRestResponse();
+    List<FTSData> result = null;
+    try
+    {
+      JSONParser jsonParser = new JSONParser();
+      JSONObject jsonObj = (JSONObject) jsonParser
+              .parse(pdbJsonResponseString);
+
+      JSONObject pdbResponse = (JSONObject) jsonObj.get("response");
+      String queryTime = ((JSONObject) jsonObj.get("responseHeader")).get(
+              "QTime").toString();
+      int numFound = Integer
+              .valueOf(pdbResponse.get("numFound").toString());
+      if (numFound > 0)
+      {
+        result = new ArrayList<FTSData>();
+        JSONArray docs = (JSONArray) pdbResponse.get("docs");
+        for (Iterator<JSONObject> docIter = docs.iterator(); docIter
+                .hasNext();)
+        {
+          JSONObject doc = docIter.next();
+          result.add(getFTSData(doc, pdbRestRequest));
+        }
+        searchResult.setNumberOfItemsFound(numFound);
+        searchResult.setResponseTime(queryTime);
+        searchResult.setSearchSummary(result);
+      }
+    } catch (ParseException e)
+    {
+      e.printStackTrace();
+    }
+    return searchResult;
+  }
+
+  public static FTSData getFTSData(JSONObject pdbJsonDoc,
+          FTSRestRequest request)
+  {
+
+    String primaryKey = null;
+
+    Object[] summaryRowData;
+
+    SequenceI associatedSequence;
+
+    Collection<FTSDataColumnI> diplayFields = request.getWantedFields();
+    SequenceI associatedSeq = request.getAssociatedSequence();
+    int colCounter = 0;
+    summaryRowData = new Object[(associatedSeq != null) ? diplayFields
+            .size() + 1 : diplayFields.size()];
+    if (associatedSeq != null)
+    {
+      associatedSequence = associatedSeq;
+      summaryRowData[0] = associatedSequence;
+      colCounter = 1;
+    }
+
+    for (FTSDataColumnI field : diplayFields)
+    {
+      String fieldData = (pdbJsonDoc.get(field.getCode()) == null) ? ""
+              : pdbJsonDoc.get(field.getCode()).toString();
+      if (field.isPrimaryKeyColumn())
+      {
+        primaryKey = fieldData;
+        summaryRowData[colCounter++] = primaryKey;
+      }
+      else if (fieldData == null || fieldData.isEmpty())
+      {
+        summaryRowData[colCounter++] = null;
+      }
+      else
+      {
+        try
+        {
+          summaryRowData[colCounter++] = (field.getDataColumnClass() == Integer.class) ? Integer
+                  .valueOf(fieldData)
+                  : (field.getDataColumnClass() == Double.class) ? Double
+                          .valueOf(fieldData)
+                          : fieldData;
+        } catch (Exception e)
+        {
+          e.printStackTrace();
+            System.out.println("offending value:" + fieldData);
+        }
+      }
+    }
+
+    final String primaryKey1 = primaryKey;
+
+    final Object[] summaryRowData1 = summaryRowData;
+    return new FTSData()
+    {
+      @Override
+      public Object[] getSummaryData()
+      {
+        return summaryRowData1;
+      }
+
+      @Override
+      public Object getPrimaryKey()
+      {
+        return primaryKey1;
+      }
+
+      /**
+       * Returns a string representation of this object;
+       */
+      @Override
+      public String toString()
+      {
+        StringBuilder summaryFieldValues = new StringBuilder();
+        for (Object summaryField : summaryRowData1)
+        {
+          summaryFieldValues.append(
+                  summaryField == null ? " " : summaryField.toString())
+                  .append("\t");
+        }
+        return summaryFieldValues.toString();
+      }
+
+      /**
+       * Returns hash code value for this object
+       */
+      @Override
+      public int hashCode()
+      {
+        return Objects.hash(primaryKey1, this.toString());
+      }
+
+      @Override
+      public boolean equals(Object that)
+      {
+        return this.toString().equals(that.toString());
+      }
+    };
+  }
+
+  @Override
+  public String getColumnDataConfigFileName()
+  {
+    return "/fts/pdb_data_columns.txt";
+  }
+
+
+  public static FTSRestClientI getInstance()
+  {
+    if (instance == null)
+    {
+      instance = new PDBFTSRestClient();
+    }
+    return instance;
+  }
+}
diff --git a/src/jalview/fts/service/uniprot/UniProtFTSRestClient.java b/src/jalview/fts/service/uniprot/UniProtFTSRestClient.java
new file mode 100644 (file)
index 0000000..0447715
--- /dev/null
@@ -0,0 +1,311 @@
+/*
+ * 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 <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
+
+package jalview.fts.service.uniprot;
+
+import jalview.fts.api.FTSData;
+import jalview.fts.api.FTSDataColumnI;
+import jalview.fts.api.FTSRestClientI;
+import jalview.fts.core.FTSRestClient;
+import jalview.fts.core.FTSRestRequest;
+import jalview.fts.core.FTSRestResponse;
+import jalview.util.MessageManager;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Objects;
+
+import javax.ws.rs.core.MediaType;
+
+import com.sun.jersey.api.client.Client;
+import com.sun.jersey.api.client.ClientResponse;
+import com.sun.jersey.api.client.WebResource;
+import com.sun.jersey.api.client.config.ClientConfig;
+import com.sun.jersey.api.client.config.DefaultClientConfig;
+
+public class UniProtFTSRestClient extends FTSRestClient
+{
+  private static FTSRestClientI instance = null;
+
+  public static final String UNIPROT_SEARCH_ENDPOINT = "http://www.uniprot.org/uniprot/?";
+
+  @Override
+  public FTSRestResponse executeRequest(FTSRestRequest uniportRestRequest)
+          throws Exception
+  {
+    try
+    {
+      ClientConfig clientConfig = new DefaultClientConfig();
+      Client client = Client.create(clientConfig);
+
+      String wantedFields = getDataColumnsFieldsAsCommaDelimitedString(uniportRestRequest
+              .getWantedFields());
+      int responseSize = (uniportRestRequest.getResponseSize() == 0) ? getDefaultResponsePageSize()
+              : uniportRestRequest.getResponseSize();
+
+      int offSet = uniportRestRequest.getOffSet();
+
+      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")
+              .queryParam("columns", wantedFields)
+              .queryParam("limit", String.valueOf(responseSize))
+              .queryParam("offset", String.valueOf(offSet))
+              .queryParam("sort", "score").queryParam("query", query);
+      // Execute the REST request
+      ClientResponse clientResponse = webResource.accept(
+              MediaType.TEXT_PLAIN).get(ClientResponse.class);
+      String uniProtTabDelimittedResponseString = clientResponse
+              .getEntity(String.class);
+      // Make redundant objects eligible for garbage collection to conserve
+      // memory
+      // System.out.println(">>>>> response : "
+      // + uniProtTabDelimittedResponseString);
+      if (clientResponse.getStatus() != 200)
+      {
+        String errorMessage = getMessageByHTTPStatusCode(
+                clientResponse.getStatus(), "Uniprot");
+        throw new Exception(errorMessage);
+
+      }
+      int xTotalResults = Integer.valueOf(clientResponse.getHeaders()
+              .get("X-Total-Results").get(0));
+      clientResponse = null;
+      client = null;
+      return parseUniprotResponse(uniProtTabDelimittedResponseString,
+              uniportRestRequest, xTotalResults);
+    } catch (Exception e)
+    {
+      String exceptionMsg = e.getMessage();
+      if (exceptionMsg.contains("SocketException"))
+      {
+        // No internet connection
+        throw new Exception(
+                MessageManager
+                        .getString("exception.unable_to_detect_internet_connection"));
+      }
+      else if (exceptionMsg.contains("UnknownHostException"))
+      {
+        // The server 'http://www.uniprot.org' is unreachable
+        throw new Exception(MessageManager.formatMessage(
+                "exception.fts_server_unreachable", "Uniprot"));
+      }
+      else
+      {
+        throw e;
+      }
+    }
+  }
+
+
+  public FTSRestResponse parseUniprotResponse(
+          String uniProtTabDelimittedResponseString,
+          FTSRestRequest uniprotRestRequest, int xTotalResults)
+  {
+    FTSRestResponse searchResult = new FTSRestResponse();
+    List<FTSData> result = null;
+    if (uniProtTabDelimittedResponseString == null
+            || uniProtTabDelimittedResponseString.trim().isEmpty())
+    {
+      searchResult.setNumberOfItemsFound(0);
+      return searchResult;
+    }
+    String[] foundDataRow = uniProtTabDelimittedResponseString.split("\n");
+    if (foundDataRow != null && foundDataRow.length > 0)
+    {
+      result = new ArrayList<FTSData>();
+      String titleRow = getDataColumnsFieldsAsTabDelimitedString(uniprotRestRequest
+              .getWantedFields());
+      // System.out.println(">>>>Title row : " + titleRow);
+      for (String dataRow : foundDataRow)
+      {
+        if (dataRow.equalsIgnoreCase(titleRow))
+        {
+          // System.out.println(">>>>>>>>>> matched!!!");
+          continue;
+        }
+        // System.out.println(dataRow);
+        result.add(getFTSData(dataRow, uniprotRestRequest));
+      }
+      searchResult.setNumberOfItemsFound(xTotalResults);
+      searchResult.setSearchSummary(result);
+    }
+    return searchResult;
+  }
+
+  /**
+   * Takes a collection of FTSDataColumnI and converts its 'code' values into a
+   * tab delimited string.
+   * 
+   * @param dataColumnFields
+   *          the collection of FTSDataColumnI to process
+   * @return the generated comma delimited string from the supplied
+   *         FTSDataColumnI collection
+   */
+  private String getDataColumnsFieldsAsTabDelimitedString(
+          Collection<FTSDataColumnI> dataColumnFields)
+  {
+    String result = "";
+    if (dataColumnFields != null && !dataColumnFields.isEmpty())
+    {
+      StringBuilder returnedFields = new StringBuilder();
+      for (FTSDataColumnI field : dataColumnFields)
+      {
+        if (field.getName().equalsIgnoreCase("Uniprot Id"))
+        {
+          returnedFields.append("\t").append("Entry");
+        }
+        else
+        {
+          returnedFields.append("\t").append(field.getName());
+        }
+      }
+      returnedFields.deleteCharAt(0);
+      result = returnedFields.toString();
+    }
+    return result;
+  }
+
+  public static FTSData getFTSData(String tabDelimittedDataStr,
+          FTSRestRequest request)
+  {
+    String primaryKey = null;
+
+    Object[] summaryRowData;
+
+    Collection<FTSDataColumnI> diplayFields = request.getWantedFields();
+    int colCounter = 0;
+    summaryRowData = new Object[diplayFields.size()];
+    String[] columns = tabDelimittedDataStr.split("\t");
+    for (FTSDataColumnI field : diplayFields)
+    {
+      try
+      {
+        String fieldData = columns[colCounter];
+        if (field.isPrimaryKeyColumn())
+        {
+          primaryKey = fieldData;
+          summaryRowData[colCounter++] = primaryKey;
+        }
+        else if (fieldData == null || fieldData.isEmpty())
+        {
+          summaryRowData[colCounter++] = null;
+        }
+        else
+        {
+          try
+          {
+            summaryRowData[colCounter++] = (field.getDataColumnClass() == Integer.class) ? Integer
+                    .valueOf(fieldData)
+                    : (field.getDataColumnClass() == Double.class) ? Double
+                            .valueOf(fieldData) : fieldData;
+          } catch (Exception e)
+          {
+            e.printStackTrace();
+              System.out.println("offending value:" + fieldData);
+          }
+        }
+      } catch (Exception e)
+      {
+        // e.printStackTrace();
+      }
+    }
+
+    final String primaryKey1 = primaryKey;
+
+    final Object[] summaryRowData1 = summaryRowData;
+    return new FTSData()
+    {
+      @Override
+      public Object[] getSummaryData()
+      {
+        return summaryRowData1;
+      }
+
+      @Override
+      public Object getPrimaryKey()
+      {
+        return primaryKey1;
+      }
+
+      /**
+       * Returns a string representation of this object;
+       */
+      @Override
+      public String toString()
+      {
+        StringBuilder summaryFieldValues = new StringBuilder();
+        for (Object summaryField : summaryRowData1)
+        {
+          summaryFieldValues.append(
+                  summaryField == null ? " " : summaryField.toString())
+                  .append("\t");
+        }
+        return summaryFieldValues.toString();
+      }
+
+      /**
+       * Returns hash code value for this object
+       */
+      @Override
+      public int hashCode()
+      {
+        return Objects.hash(primaryKey1, this.toString());
+      }
+
+      @Override
+      public boolean equals(Object that)
+      {
+        return this.toString().equals(that.toString());
+      }
+    };
+  }
+
+
+  public static FTSRestClientI getInstance()
+  {
+    if (instance == null)
+    {
+      instance = new UniProtFTSRestClient();
+    }
+    return instance;
+  }
+
+  @Override
+  public String getColumnDataConfigFileName()
+  {
+    return "/fts/uniprot_data_columns.txt";
+  }
+
+}
diff --git a/src/jalview/fts/service/uniprot/UniprotFTSPanel.java b/src/jalview/fts/service/uniprot/UniprotFTSPanel.java
new file mode 100644 (file)
index 0000000..6c28ee5
--- /dev/null
@@ -0,0 +1,223 @@
+/*
+ * 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 <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
+
+package jalview.fts.service.uniprot;
+
+import jalview.fts.api.FTSDataColumnI;
+import jalview.fts.api.FTSRestClientI;
+import jalview.fts.core.FTSRestRequest;
+import jalview.fts.core.FTSRestResponse;
+import jalview.fts.core.GFTSPanel;
+import jalview.gui.SequenceFetcher;
+import jalview.util.MessageManager;
+
+import java.util.HashSet;
+
+@SuppressWarnings("serial")
+public class UniprotFTSPanel extends GFTSPanel
+{
+
+  private static String defaultFTSFrameTitle = MessageManager
+          .getString("label.uniprot_sequence_fetcher");
+
+  private String ftsFrameTitle = defaultFTSFrameTitle;
+
+
+
+  public UniprotFTSPanel(SequenceFetcher seqFetcher)
+  {
+    pageLimit = UniProtFTSRestClient.getInstance()
+            .getDefaultResponsePageSize();
+    this.seqFetcher = seqFetcher;
+    this.progressIdicator = (seqFetcher == null) ? null : seqFetcher
+            .getProgressIndicator();
+  }
+
+  @Override
+  public void searchAction(boolean isFreshSearch)
+  {
+    if (isFreshSearch)
+    {
+      offSet = 0;
+    }
+    new Thread()
+  {
+      @Override
+      public void run()
+      {
+        ftsFrameTitle = defaultFTSFrameTitle;
+        reset();
+        if (getTypedText().length() > 0)
+        {
+          setSearchInProgress(true);
+          long startTime = System.currentTimeMillis();
+
+          String searchTarget = ((FTSDataColumnI) cmb_searchTarget
+                  .getSelectedItem()).getAltCode();
+
+          wantedFields = UniProtFTSRestClient.getInstance()
+                  .getAllDefaulDisplayedDataColumns();
+          String searchTerm = decodeSearchTerm(txt_search.getText(),
+                  searchTarget);
+
+          FTSRestRequest request = new FTSRestRequest();
+          request.setFieldToSearchBy(searchTarget);
+          request.setSearchTerm(searchTerm);
+          request.setOffSet(offSet);
+          request.setWantedFields(wantedFields);
+          FTSRestClientI uniProtRestCleint = UniProtFTSRestClient
+                  .getInstance();
+          FTSRestResponse resultList;
+          try
+          {
+            resultList = uniProtRestCleint.executeRequest(request);
+          } catch (Exception e)
+          {
+            e.printStackTrace();
+            setErrorMessage(e.getMessage());
+            checkForErrors();
+            return;
+          }
+
+          if (resultList.getSearchSummary() != null
+                  && resultList.getSearchSummary().size() > 0)
+          {
+            getResultTable().setModel(
+                    FTSRestResponse.getTableModel(request,
+                            resultList.getSearchSummary()));
+            FTSRestResponse.configureTableColumn(getResultTable(),
+                    wantedFields);
+            getResultTable().setVisible(true);
+          }
+
+          long endTime = System.currentTimeMillis();
+          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) + " of "
+                    + totalResultSetCount
+                    + " " + " (" + (endTime - startTime) + " milli secs)");
+          }
+          else
+          {
+            updateSearchFrameTitle(defaultFTSFrameTitle + " - "
+                    + resultSetCount + " " + result + " ("
+                    + (endTime - startTime) + " milli secs)");
+          }
+          setSearchInProgress(false);
+          refreshPaginatorState();
+          updateSummaryTableSelections();
+        }
+      }
+    }.start();
+
+  }
+
+  public String decodeSearchTerm(String enteredText, String targetField)
+  {
+    int searchTargetLength = targetField.equalsIgnoreCase("Search All") ? 0
+            : targetField.length() + 1;
+    String searchTarget = targetField.equalsIgnoreCase("Search All") ? ""
+            : targetField + ":";
+    String foundSearchTerms = enteredText;
+    StringBuilder foundSearchTermsBuilder = new StringBuilder();
+    if (enteredText.contains(";"))
+    {
+      String[] searchTerms = enteredText.split(";");
+      for (String searchTerm : searchTerms)
+      {
+        foundSearchTermsBuilder.append(searchTarget).append(searchTerm)
+                .append(" OR ");
+      }
+      int endIndex = foundSearchTermsBuilder.lastIndexOf(" OR ");
+      foundSearchTerms = foundSearchTermsBuilder.toString();
+      if (foundSearchTerms.contains(" OR "))
+      {
+        foundSearchTerms = foundSearchTerms.substring(searchTargetLength,
+                endIndex);
+      }
+    }
+    return foundSearchTerms;
+  }
+
+
+  @Override
+  public boolean isPaginationEnabled()
+  {
+    return true;
+  }
+
+  @Override
+  public void okAction()
+  {
+    disableActionButtons();
+    StringBuilder selectedIds = new StringBuilder();
+    HashSet<String> selectedIdsSet = new HashSet<String>();
+    int primaryKeyColIndex = 0;
+    try
+    {
+      primaryKeyColIndex = getFTSRestClient().getPrimaryKeyColumIndex(
+              wantedFields, false);
+    } catch (Exception e)
+    {
+      e.printStackTrace();
+    }
+    int[] selectedRows = getResultTable().getSelectedRows();
+    for (int summaryRow : selectedRows)
+    {
+      String idStr = getResultTable().getValueAt(summaryRow,
+              primaryKeyColIndex).toString();
+      selectedIdsSet.add(idStr);
+    }
+    selectedIdsSet.addAll(paginatorCart);
+    for (String selectedId : selectedIdsSet)
+    {
+      selectedIds.append(selectedId).append(";");
+    }
+
+    String ids = selectedIds.toString();
+    // System.out.println(">>>>>>>>>>>>>>>> selected Ids: " + ids);
+    seqFetcher.getTextArea().setText(ids);
+    Thread worker = new Thread(seqFetcher);
+    worker.start();
+    delayAndEnableActionButtons();
+  }
+
+  @Override
+  public FTSRestClientI getFTSRestClient()
+  {
+    return UniProtFTSRestClient.getInstance();
+  }
+
+  @Override
+  public String getFTSFrameTitle()
+  {
+    return ftsFrameTitle;
+  }
+
+}
index a616dc0..7e7bdd3 100644 (file)
@@ -32,6 +32,7 @@ import jalview.api.AlignViewControllerI;
 import jalview.api.AlignViewportI;
 import jalview.api.AlignmentViewPanel;
 import jalview.api.FeatureSettingsControllerI;
+import jalview.api.FeatureSettingsModelI;
 import jalview.api.SplitContainerI;
 import jalview.api.ViewStyleI;
 import jalview.api.analysis.ScoreModelI;
@@ -53,6 +54,7 @@ import jalview.datamodel.AlignmentI;
 import jalview.datamodel.AlignmentOrder;
 import jalview.datamodel.AlignmentView;
 import jalview.datamodel.ColumnSelection;
+import jalview.datamodel.DBRefSource;
 import jalview.datamodel.HiddenSequences;
 import jalview.datamodel.PDBEntry;
 import jalview.datamodel.SeqCigar;
@@ -72,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;
@@ -94,6 +97,9 @@ import jalview.schemes.ZappoColourScheme;
 import jalview.structure.StructureSelectionManager;
 import jalview.util.MessageManager;
 import jalview.viewmodel.AlignmentViewport;
+import jalview.ws.DBRefFetcher;
+import jalview.ws.DBRefFetcher.FetchFinishedListenerI;
+import jalview.ws.SequenceFetcher;
 import jalview.ws.jws1.Discoverer;
 import jalview.ws.jws2.Jws2Discoverer;
 import jalview.ws.jws2.jabaws2.Jws2Instance;
@@ -114,6 +120,8 @@ import java.awt.dnd.DropTargetEvent;
 import java.awt.dnd.DropTargetListener;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
+import java.awt.event.FocusAdapter;
+import java.awt.event.FocusEvent;
 import java.awt.event.ItemEvent;
 import java.awt.event.ItemListener;
 import java.awt.event.KeyAdapter;
@@ -131,7 +139,6 @@ import java.util.Deque;
 import java.util.Enumeration;
 import java.util.Hashtable;
 import java.util.List;
-import java.util.Set;
 import java.util.Vector;
 
 import javax.swing.JCheckBoxMenuItem;
@@ -462,6 +469,14 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     {
       formatMenu.add(vsel);
     }
+    addFocusListener(new FocusAdapter()
+    {
+      @Override
+      public void focusGained(FocusEvent e)
+      {
+        Desktop.setCurrentAlignFrame(AlignFrame.this);
+      }
+    });
 
   }
 
@@ -828,6 +843,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   public void setGUINucleotide(boolean nucleotide)
   {
     showTranslation.setVisible(nucleotide);
+    showReverse.setVisible(nucleotide);
+    showReverseComplement.setVisible(nucleotide);
     conservationMenuItem.setEnabled(!nucleotide);
     modifyConservation.setEnabled(!nucleotide);
     showGroupConservation.setEnabled(!nucleotide);
@@ -903,10 +920,23 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     rnahelicesColour.setEnabled(av.getAlignment().hasRNAStructure());
     rnahelicesColour
             .setSelected(av.getGlobalColourScheme() instanceof jalview.schemes.RNAHelicesColour);
-    setShowProductsEnabled();
+
+    showProducts.setEnabled(canShowProducts());
+    setGroovyEnabled(Desktop.getGroovyConsole() != null);
+
     updateEditMenuBar();
   }
 
+  /**
+   * Set the enabled state of the 'Run Groovy' option in the Calculate menu
+   * 
+   * @param b
+   */
+  public void setGroovyEnabled(boolean b)
+  {
+    runGroovy.setEnabled(b);
+  }
+
   private IProgressIndicator progressBar;
 
   /*
@@ -959,7 +989,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   @Override
   public void fetchSequence_actionPerformed(ActionEvent e)
   {
-    new SequenceFetcher(this);
+    new jalview.gui.SequenceFetcher(this);
   }
 
   @Override
@@ -1268,13 +1298,11 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     AlignmentI alignmentToExport = null;
     AlignExportSettingI settings = exportSettings;
     String[] omitHidden = null;
-    int[] alignmentStartEnd = new int[2];
 
     HiddenSequences hiddenSeqs = viewport.getAlignment()
             .getHiddenSequences();
 
     alignmentToExport = viewport.getAlignment();
-    alignmentStartEnd = new int[] { 0, alignmentToExport.getWidth() - 1 };
 
     boolean hasHiddenSeqs = hiddenSeqs.getSize() > 0;
     if (settings == null)
@@ -1289,6 +1317,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       omitHidden = viewport.getViewAsString(false);
     }
 
+    int[] alignmentStartEnd = new int[2];
     if (hasHiddenSeqs && settings.isExportHiddenSequences())
     {
       alignmentToExport = hiddenSeqs.getFullAlignment();
@@ -1296,7 +1325,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     else
     {
       alignmentToExport = viewport.getAlignment();
-      alignmentStartEnd = getStartEnd(alignmentStartEnd, viewport
+      alignmentStartEnd = viewport.getAlignment()
+              .getVisibleStartAndEndIndex(
+                      viewport
               .getColumnSelection().getHiddenColumns());
     }
     AlignmentExportData ed = new AlignmentExportData(alignmentToExport,
@@ -1304,55 +1335,6 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     return ed;
   }
 
-  public static int[] getStartEnd(int[] aligmentStartEnd,
-          List<int[]> hiddenCols)
-  {
-    int startPos = aligmentStartEnd[0];
-    int endPos = aligmentStartEnd[1];
-
-    int[] lowestRange = new int[] { -1, -1 };
-    int[] higestRange = new int[] { -1, -1 };
-
-    for (int[] hiddenCol : hiddenCols)
-    {
-      lowestRange = (hiddenCol[0] <= startPos) ? hiddenCol : lowestRange;
-      higestRange = (hiddenCol[1] >= endPos) ? hiddenCol : higestRange;
-    }
-
-    if (lowestRange[0] == -1 && lowestRange[1] == -1)
-    {
-      startPos = aligmentStartEnd[0];
-    }
-    else
-    {
-      startPos = lowestRange[1] + 1;
-    }
-
-    if (higestRange[0] == -1 && higestRange[1] == -1)
-    {
-      endPos = aligmentStartEnd[1];
-    }
-    else
-    {
-      endPos = higestRange[0] - 1;
-    }
-
-    // System.out.println("Export range : " + startPos + " - " + endPos);
-    return new int[] { startPos, endPos };
-  }
-
-  public static void main(String[] args)
-  {
-    ArrayList<int[]> hiddenCols = new ArrayList<int[]>();
-    hiddenCols.add(new int[] { 0, 0 });
-    hiddenCols.add(new int[] { 6, 9 });
-    hiddenCols.add(new int[] { 11, 12 });
-    hiddenCols.add(new int[] { 33, 33 });
-    hiddenCols.add(new int[] { 50, 50 });
-
-    int[] x = getStartEnd(new int[] { 0, 50 }, hiddenCols);
-    // System.out.println("Export range : " + x[0] + " - " + x[1]);
-  }
 
   /**
    * DOCUMENT ME!
@@ -1980,7 +1962,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
           return;
         }
 
-        format = new IdentifyFile().Identify(str, "Paste");
+        format = new IdentifyFile().identify(str, "Paste");
 
       } catch (OutOfMemoryError er)
       {
@@ -3659,8 +3641,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
           @Override
           public void mousePressed(MouseEvent evt)
           {
-            if (evt.isControlDown()
-                    || SwingUtilities.isRightMouseButton(evt))
+            if (evt.isPopupTrigger())
             {
               radioItem.removeActionListener(radioItem.getActionListeners()[0]);
 
@@ -4164,7 +4145,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       {
         JMenuItem tm = new JMenuItem();
         ScoreModelI sm = ResidueProperties.scoreMatrices.get(pwtype);
-        if (sm.isProtein() == !viewport.getAlignment().isNucleotide())
+        if (sm.isDNA() == viewport.getAlignment().isNucleotide()
+                || sm.isProtein() == !viewport.getAlignment()
+                        .isNucleotide())
         {
           String smn = MessageManager.getStringOrReturn(
                   "label.score_model_", sm.getName());
@@ -4651,67 +4634,27 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     }
   }
 
-  /*
-   * public void vamsasStore_actionPerformed(ActionEvent e) { JalviewFileChooser
-   * chooser = new JalviewFileChooser(jalview.bin.Cache.
-   * getProperty("LAST_DIRECTORY"));
-   * 
-   * chooser.setFileView(new JalviewFileView()); chooser.setDialogTitle("Export
-   * to Vamsas file"); chooser.setToolTipText("Export");
-   * 
-   * int value = chooser.showSaveDialog(this);
-   * 
-   * if (value == JalviewFileChooser.APPROVE_OPTION) {
-   * jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(viewport);
-   * //vs.store(chooser.getSelectedFile().getAbsolutePath() ); vs.storeJalview(
-   * chooser.getSelectedFile().getAbsolutePath(), this); } }
-   */
   /**
-   * prototype of an automatically enabled/disabled analysis function
+   * Searches selected sequences for xRef products and builds the Show
+   * Cross-References menu (formerly called Show Products)
    * 
+   * @return true if Show Cross-references menu should be enabled.
    */
-  protected void setShowProductsEnabled()
+  public boolean canShowProducts()
   {
     SequenceI[] selection = viewport.getSequenceSelection();
-    if (canShowProducts(selection, viewport.getSelectionGroup() != null,
-            viewport.getAlignment().getDataset()))
-    {
-      showProducts.setEnabled(true);
-
-    }
-    else
-    {
-      showProducts.setEnabled(false);
-    }
-  }
-
-  /**
-   * search selection for sequence xRef products and build the show products
-   * menu.
-   * 
-   * @param selection
-   * @param dataset
-   * @return true if showProducts menu should be enabled.
-   */
-  public boolean canShowProducts(SequenceI[] selection,
-          boolean isRegionSelection, Alignment dataset)
-  {
+    AlignmentI dataset = viewport.getAlignment().getDataset();
     boolean showp = false;
     try
     {
       showProducts.removeAll();
       final boolean dna = viewport.getAlignment().isNucleotide();
-      final Alignment ds = dataset;
       String[] ptypes = (selection == null || selection.length == 0) ? null
               : CrossRef.findSequenceXrefTypes(dna, selection, dataset);
-      // Object[] prods =
-      // CrossRef.buildXProductsList(viewport.getAlignment().isNucleotide(),
-      // selection, dataset, true);
-      final SequenceI[] sel = selection;
+
       for (int t = 0; ptypes != null && t < ptypes.length; t++)
       {
         showp = true;
-        final boolean isRegSel = isRegionSelection;
         final AlignFrame af = this;
         final String source = ptypes[t];
         JMenuItem xtype = new JMenuItem(ptypes[t]);
@@ -4721,9 +4664,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
           @Override
           public void actionPerformed(ActionEvent e)
           {
-            // TODO: new thread for this call with vis-delay
-            af.showProductsFor(af.viewport.getSequenceSelection(),
-                    isRegSel, dna, source);
+            showProductsFor(af.viewport.getSequenceSelection(), dna, source);
           }
 
         });
@@ -4734,15 +4675,15 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     } catch (Exception e)
     {
       jalview.bin.Cache.log
-              .warn("canTranslate threw an exception - please report to help@jalview.org",
+              .warn("canShowProducts threw an exception - please report to help@jalview.org",
                       e);
       return false;
     }
     return showp;
   }
 
-  protected void showProductsFor(final SequenceI[] sel,
-          final boolean isRegSel, final boolean dna, final String source)
+  protected void showProductsFor(final SequenceI[] sel, final boolean dna,
+          final String source)
   {
     Runnable foo = new Runnable()
     {
@@ -4756,111 +4697,212 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
                 new Object[] { source }), sttime);
         try
         {
-          // update our local dataset reference
-          Alignment ds = AlignFrame.this.getViewport().getAlignment()
-                  .getDataset();
-          Alignment prods = CrossRef
-                  .findXrefSequences(sel, dna, source, ds);
-          if (prods != null)
+          AlignmentI alignment = AlignFrame.this.getViewport()
+                  .getAlignment();
+          AlignmentI xrefs = CrossRef.findXrefSequences(sel, dna, source,
+                  alignment);
+          if (xrefs != null)
           {
-            SequenceI[] sprods = new SequenceI[prods.getHeight()];
-            for (int s = 0; s < sprods.length; s++)
-            {
-              sprods[s] = (prods.getSequenceAt(s)).deriveSequence();
-              if (ds.getSequences() == null
-                      || !ds.getSequences().contains(
-                              sprods[s].getDatasetSequence()))
-              {
-                ds.addSequence(sprods[s].getDatasetSequence());
-              }
-              sprods[s].updatePDBIds();
-            }
-            Alignment al = new Alignment(sprods);
-            al.setDataset(ds);
-
             /*
-             * Copy dna-to-protein mappings to new alignment
+             * get display scheme (if any) to apply to features
              */
-            // TODO 1: no mappings are set up for EMBL product
-            // TODO 2: if they were, should add them to protein alignment, not
-            // dna
-            Set<AlignedCodonFrame> cf = prods.getCodonFrames();
-            for (AlignedCodonFrame acf : cf)
+            FeatureSettingsModelI featureColourScheme = new SequenceFetcher()
+                    .getFeatureColourScheme(source);
+
+            AlignmentI al = makeCrossReferencesAlignment(
+                    alignment.getDataset(), xrefs);
+
+            AlignFrame newFrame = new AlignFrame(al, DEFAULT_WIDTH,
+                    DEFAULT_HEIGHT);
+            if (Cache.getDefault("HIDE_INTRONS", true))
             {
-              al.addCodonFrame(acf);
+              newFrame.hideFeatureColumns(SequenceOntologyI.EXON, false);
             }
-            AlignFrame naf = new AlignFrame(al, DEFAULT_WIDTH,
-                    DEFAULT_HEIGHT);
-            String newtitle = "" + ((dna) ? "Proteins" : "Nucleotides")
-                    + " for " + ((isRegSel) ? "selected region of " : "")
-                    + getTitle();
-            naf.setTitle(newtitle);
-
-            // temporary flag until SplitFrame is released
-            boolean asSplitFrame = Cache.getDefault(
-                    Preferences.ENABLE_SPLIT_FRAME, true);
-            if (asSplitFrame)
+            String newtitle = String.format("%s %s %s",
+                    MessageManager.getString(dna ? "label.proteins"
+                            : "label.nucleotides"), MessageManager
+                            .getString("label.for"), getTitle());
+            newFrame.setTitle(newtitle);
+
+            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
+               * split frame display is turned off in preferences file
                */
-              AlignmentI copyAlignment = null;
-              final SequenceI[] sequenceSelection = AlignFrame.this.viewport
-                      .getSequenceSelection();
-              if (dna)
+              Desktop.addInternalFrame(newFrame, newtitle, DEFAULT_WIDTH,
+                      DEFAULT_HEIGHT);
+              return; // via finally clause
+            }
+
+            /*
+             * Make a copy of this alignment (sharing the same dataset
+             * sequences). If we are DNA, drop introns and update mappings
+             */
+            AlignmentI copyAlignment = null;
+            final SequenceI[] sequenceSelection = AlignFrame.this.viewport
+                    .getSequenceSelection();
+            List<AlignedCodonFrame> cf = xrefs.getCodonFrames();
+            boolean copyAlignmentIsAligned = false;
+            if (dna)
+            {
+              copyAlignment = AlignmentUtils.makeCdsAlignment(
+                      sequenceSelection, cf, alignment);
+              if (copyAlignment.getHeight() == 0)
               {
-                copyAlignment = AlignmentUtils.makeExonAlignment(
-                        sequenceSelection, cf);
-                al.getCodonFrames().clear();
-                al.getCodonFrames().addAll(cf);
-                final StructureSelectionManager ssm = StructureSelectionManager
-                        .getStructureSelectionManager(Desktop.instance);
-                ssm.registerMappings(cf);
+                System.err.println("Failed to make CDS alignment");
               }
-              else
+              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 = new Alignment(new Alignment(
-                        sequenceSelection));
+                copyAlignment.alignAs(alignment);
+                copyAlignmentIsAligned = true;
               }
-              AlignFrame copyThis = new AlignFrame(copyAlignment,
-                      AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT);
-              copyThis.setTitle(AlignFrame.this.getTitle());
-              // SplitFrame with dna above, protein below
-              SplitFrame sf = new SplitFrame(dna ? copyThis : naf,
-                      dna ? naf : copyThis);
-              naf.setVisible(true);
-              copyThis.setVisible(true);
-              String linkedTitle = MessageManager
-                      .getString("label.linked_view_title");
-              Desktop.addInternalFrame(sf, linkedTitle, -1, -1);
             }
             else
             {
-              Desktop.addInternalFrame(naf, newtitle, DEFAULT_WIDTH,
-                      DEFAULT_HEIGHT);
+              copyAlignment = AlignmentUtils.makeCopyAlignment(
+                      sequenceSelection, xrefs.getSequencesArray());
+              copyAlignment.getCodonFrames().addAll(cf);
             }
-          }
-          else
-          {
-            System.err.println("No Sequences generated for xRef type "
-                    + source);
+            copyAlignment.setGapCharacter(AlignFrame.this.viewport
+                    .getGapCharacter());
+
+            StructureSelectionManager ssm = StructureSelectionManager
+                    .getStructureSelectionManager(Desktop.instance);
+            ssm.registerMappings(cf);
+
+            if (copyAlignment.getHeight() <= 0)
+            {
+              System.err.println("No Sequences generated for xRef type "
+                      + source);
+              return;
+            }
+            /*
+             * align protein to dna
+             */
+            if (dna && copyAlignmentIsAligned)
+            {
+              al.alignAs(copyAlignment);
+            }
+            else
+            {
+              /*
+               * align cdna to protein - currently only if 
+               * fetching and aligning Ensembl transcripts!
+               */
+              if (DBRefSource.ENSEMBL.equalsIgnoreCase(source))
+              {
+                copyAlignment.alignAs(al);
+              }
+            }
+
+            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();
+
+            /*
+             * 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)
         {
-          jalview.bin.Cache.log.error(
+          Cache.log.error(
                   "Exception when finding crossreferences", e);
         } catch (OutOfMemoryError e)
         {
           new OOMWarning("whilst fetching crossreferences", e);
-        } catch (Error e)
+        } catch (Throwable e)
         {
-          jalview.bin.Cache.log.error("Error when finding crossreferences",
+          Cache.log.error("Error when finding crossreferences",
                   e);
+        } finally
+        {
+          AlignFrame.this.setProgressBar(MessageManager.formatMessage(
+                  "status.finished_searching_for_sequences_from",
+                  new Object[] { source }), sttime);
         }
-        AlignFrame.this.setProgressBar(MessageManager.formatMessage(
-                "status.finished_searching_for_sequences_from",
-                new Object[] { source }), sttime);
+      }
+
+      /**
+       * 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.
+       * 
+       * @param dataset
+       * @param seqs
+       * @return
+       */
+      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()))
+            {
+              dataset.addSequence(sprods[s].getDatasetSequence());
+            }
+          }
+          sprods[s].updatePDBIds();
+        }
+        Alignment al = new Alignment(sprods);
+        if (sameType)
+        {
+          al.setDataset((Alignment) dataset);
+        }
+        else
+        {
+          al.createDatasetAlignment();
+        }
+        return al;
       }
 
     };
@@ -4868,23 +4910,6 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     frunner.start();
   }
 
-  public boolean canShowTranslationProducts(SequenceI[] selection,
-          AlignmentI alignment)
-  {
-    // old way
-    try
-    {
-      return (jalview.analysis.Dna.canTranslate(selection,
-              viewport.getViewAsVisibleContigs(true)));
-    } catch (Exception e)
-    {
-      jalview.bin.Cache.log
-              .warn("canTranslate threw an exception - please report to help@jalview.org",
-                      e);
-      return false;
-    }
-  }
-
   /**
    * Construct and display a new frame containing the translation of this
    * frame's DNA sequences to their aligned protein (amino acid) equivalents.
@@ -5102,7 +5127,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
               String type = null;
               try
               {
-                type = new IdentifyFile().Identify(file, protocol);
+                type = new IdentifyFile().identify(file, protocol);
               } catch (Exception ex)
               {
                 type = null;
@@ -5201,7 +5226,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
 
   /**
    * Attempt to load a "dropped" file or URL string: First by testing whether
-   * it's and Annotation file, then a JNet file, and finally a features file. If
+   * it's an Annotation file, then a JNet file, and finally a features file. If
    * all are false then the user may have dropped an alignment file onto this
    * AlignFrame.
    * 
@@ -5215,7 +5240,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     {
       if (protocol == null)
       {
-        protocol = jalview.io.FormatAdapter.checkProtocol(file);
+        protocol = FormatAdapter.checkProtocol(file);
       }
       // if the file isn't identified, or not positively identified as some
       // other filetype (PFAM is default unidentified alignment file type) then
@@ -5276,7 +5301,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
           // try to parse it as a features file
           if (format == null)
           {
-            format = new IdentifyFile().Identify(file, protocol);
+            format = new IdentifyFile().identify(file, protocol);
           }
           if (format.equalsIgnoreCase("JnetFile"))
           {
@@ -5292,42 +5317,17 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
             viewport.setColumnSelection(cs);
             isAnnotation = true;
           }
-          else
+          else if (IdentifyFile.FeaturesFile.equals(format))
           {
-            /*
-             * if (format.equalsIgnoreCase("PDB")) {
-             * 
-             * String pdbfn = ""; // try to match up filename with sequence id
-             * try { if (protocol == jalview.io.FormatAdapter.FILE) { File fl =
-             * new File(file); pdbfn = fl.getName(); } else if (protocol ==
-             * jalview.io.FormatAdapter.URL) { URL url = new URL(file); pdbfn =
-             * url.getFile(); } } catch (Exception e) { } ; if (assocSeq ==
-             * null) { SequenceIdMatcher idm = new SequenceIdMatcher(viewport
-             * .getAlignment().getSequencesArray()); if (pdbfn.length() > 0) {
-             * // attempt to find a match in the alignment SequenceI mtch =
-             * idm.findIdMatch(pdbfn); int l = 0, c = pdbfn.indexOf("."); while
-             * (mtch == null && c != -1) { while ((c = pdbfn.indexOf(".", l)) >
-             * l) { l = c; } if (l > -1) { pdbfn = pdbfn.substring(0, l); } mtch
-             * = idm.findIdMatch(pdbfn); } if (mtch != null) { // try and
-             * associate // prompt ? PDBEntry pe = new AssociatePdbFileWithSeq()
-             * .associatePdbWithSeq(file, protocol, mtch, true); if (pe != null)
-             * { System.err.println("Associated file : " + file + " with " +
-             * mtch.getDisplayId(true)); alignPanel.paintAlignment(true); } } //
-             * TODO: maybe need to load as normal otherwise return; } }
-             */
-            // try to parse it as a features file
-            boolean isGroupsFile = parseFeaturesFile(file, protocol);
-            // if it wasn't a features file then we just treat it as a general
-            // alignment file to load into the current view.
-            if (!isGroupsFile)
-            {
-              new FileLoader().LoadFile(viewport, file, protocol, format);
-            }
-            else
+            if (parseFeaturesFile(file, protocol))
             {
               alignPanel.paintAlignment(true);
             }
           }
+          else
+          {
+            new FileLoader().LoadFile(viewport, file, protocol, format);
+          }
         }
       }
       if (isAnnotation)
@@ -5349,7 +5349,6 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       } catch (Exception x)
       {
       }
-      ;
       new OOMWarning(
               "loading data "
                       + (protocol != null ? (protocol.equals(FormatAdapter.PASTE) ? "from clipboard."
@@ -5399,7 +5398,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   @Override
   public void tabbedPane_mousePressed(MouseEvent e)
   {
-    if (SwingUtilities.isRightMouseButton(e))
+    if (e.isPopupTrigger())
     {
       String msg = MessageManager.getString("label.enter_view_name");
       String reply = JOptionPane.showInternalInputDialog(this, msg, msg,
@@ -5532,18 +5531,23 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       {
         new Thread(new Runnable()
         {
-
           @Override
           public void run()
           {
-            boolean isNuclueotide = alignPanel.alignFrame
-                    .getViewport().getAlignment()
-                    .isNucleotide();
-            new jalview.ws.DBRefFetcher(alignPanel.av
-                    .getSequenceSelection(),
-                    alignPanel.alignFrame, null,
-                    alignPanel.alignFrame.featureSettings,
-                    isNuclueotide)
+            boolean isNucleotide = alignPanel.alignFrame.getViewport()
+                    .getAlignment().isNucleotide();
+            DBRefFetcher dbRefFetcher = new DBRefFetcher(alignPanel.av
+                    .getSequenceSelection(), alignPanel.alignFrame, null,
+                    alignPanel.alignFrame.featureSettings, isNucleotide);
+            dbRefFetcher.addListener(new FetchFinishedListenerI()
+            {
+              @Override
+              public void finished()
+              {
+                AlignFrame.this.setMenusForViewport();
+              }
+            });
+            dbRefFetcher
                     .fetchDBRefs(false);
           }
         }).start();
@@ -5558,7 +5562,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       @Override
       public void run()
       {
-        final jalview.ws.SequenceFetcher sf = SequenceFetcher
+        final jalview.ws.SequenceFetcher sf = jalview.gui.SequenceFetcher
                 .getSequenceFetcherSingleton(me);
         javax.swing.SwingUtilities.invokeLater(new Runnable()
         {
@@ -5612,15 +5616,24 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
                       @Override
                       public void run()
                       {
-                        boolean isNuclueotide = alignPanel.alignFrame
+                        boolean isNucleotide = alignPanel.alignFrame
                                 .getViewport().getAlignment()
                                 .isNucleotide();
-                        new jalview.ws.DBRefFetcher(alignPanel.av
-                                .getSequenceSelection(),
+                        DBRefFetcher dbRefFetcher = new DBRefFetcher(
+                                alignPanel.av.getSequenceSelection(),
                                 alignPanel.alignFrame, dassource,
                                 alignPanel.alignFrame.featureSettings,
-                                isNuclueotide)
-                                .fetchDBRefs(false);
+                                isNucleotide);
+                        dbRefFetcher
+                                .addListener(new FetchFinishedListenerI()
+                                {
+                                  @Override
+                                  public void finished()
+                                  {
+                                    AlignFrame.this.setMenusForViewport();
+                                  }
+                                });
+                        dbRefFetcher.fetchDBRefs(false);
                       }
                     }).start();
                   }
@@ -5653,15 +5666,24 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
                       @Override
                       public void run()
                       {
-                        boolean isNuclueotide = alignPanel.alignFrame
+                        boolean isNucleotide = alignPanel.alignFrame
                                 .getViewport().getAlignment()
                                 .isNucleotide();
-                        new jalview.ws.DBRefFetcher(alignPanel.av
-                                .getSequenceSelection(),
+                        DBRefFetcher dbRefFetcher = new DBRefFetcher(
+                                alignPanel.av.getSequenceSelection(),
                                 alignPanel.alignFrame, dassource,
                                 alignPanel.alignFrame.featureSettings,
-                                isNuclueotide)
-                                .fetchDBRefs(false);
+                                isNucleotide);
+                        dbRefFetcher
+                                .addListener(new FetchFinishedListenerI()
+                                {
+                                  @Override
+                                  public void finished()
+                                  {
+                                    AlignFrame.this.setMenusForViewport();
+                                  }
+                                });
+                        dbRefFetcher.fetchDBRefs(false);
                       }
                     }).start();
                   }
@@ -5709,15 +5731,24 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
                         @Override
                         public void run()
                         {
-                          boolean isNuclueotide = alignPanel.alignFrame
+                          boolean isNucleotide = alignPanel.alignFrame
                                   .getViewport().getAlignment()
                                   .isNucleotide();
-                          new jalview.ws.DBRefFetcher(alignPanel.av
-                                  .getSequenceSelection(),
+                          DBRefFetcher dbRefFetcher = new DBRefFetcher(
+                                  alignPanel.av.getSequenceSelection(),
                                   alignPanel.alignFrame, dassrc,
                                   alignPanel.alignFrame.featureSettings,
-                                  isNuclueotide)
-                                  .fetchDBRefs(false);
+                                  isNucleotide);
+                          dbRefFetcher
+                                  .addListener(new FetchFinishedListenerI()
+                                  {
+                                    @Override
+                                    public void finished()
+                                    {
+                                      AlignFrame.this.setMenusForViewport();
+                                    }
+                                  });
+                          dbRefFetcher.fetchDBRefs(false);
                         }
                       }).start();
                     }
@@ -6008,7 +6039,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   {
     // TODO no longer a menu action - refactor as required
     final AlignmentI alignment = getViewport().getAlignment();
-    Set<AlignedCodonFrame> mappings = alignment.getCodonFrames();
+    List<AlignedCodonFrame> mappings = alignment.getCodonFrames();
     if (mappings == null)
     {
       return;
@@ -6063,6 +6094,84 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       sf.setComplementVisible(this, show);
     }
   }
+
+  /**
+   * Generate the reverse (optionally complemented) of the selected sequences,
+   * and add them to the alignment
+   */
+  @Override
+  protected void showReverse_actionPerformed(boolean complement)
+  {
+    AlignmentI al = null;
+    try
+    {
+      Dna dna = new Dna(viewport, viewport.getViewAsVisibleContigs(true));
+
+      al = dna.reverseCdna(complement);
+      viewport.addAlignment(al, "");
+    } catch (Exception ex)
+    {
+      System.err.println(ex.getMessage());
+      return;
+    }
+  }
+
+  /**
+   * Try to run a script in the Groovy console, having first ensured that this
+   * AlignFrame is set as currentAlignFrame in Desktop, to allow the script to
+   * be targeted at this alignment.
+   */
+  @Override
+  protected void runGroovy_actionPerformed()
+  {
+    Desktop.setCurrentAlignFrame(this);
+    groovy.ui.Console console = Desktop.getGroovyConsole();
+    if (console != null)
+    {
+      try
+      {
+        console.runScript();
+      } catch (Exception ex)
+      {
+        System.err.println((ex.toString()));
+        JOptionPane
+                .showInternalMessageDialog(Desktop.desktop, MessageManager
+                        .getString("label.couldnt_run_groovy_script"),
+                        MessageManager
+                                .getString("label.groovy_support_failed"),
+                        JOptionPane.ERROR_MESSAGE);
+      }
+    }
+    else
+    {
+      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
index 92c6355..692cd18 100644 (file)
@@ -43,6 +43,9 @@ import jalview.analysis.AnnotationSorter.SequenceAnnotationOrder;
 import jalview.analysis.NJTree;
 import jalview.api.AlignViewportI;
 import jalview.api.AlignmentViewPanel;
+import jalview.api.FeatureColourI;
+import jalview.api.FeatureSettingsModelI;
+import jalview.api.FeaturesDisplayedI;
 import jalview.api.ViewStyleI;
 import jalview.bin.Cache;
 import jalview.commands.CommandI;
@@ -72,7 +75,6 @@ import java.awt.Rectangle;
 import java.util.ArrayList;
 import java.util.Hashtable;
 import java.util.List;
-import java.util.Set;
 import java.util.Vector;
 
 import javax.swing.JInternalFrame;
@@ -461,7 +463,7 @@ public class AlignViewport extends AlignmentViewport implements
     AlignmentI al = getAlignment();
     if (al != null)
     {
-      Set<AlignedCodonFrame> mappings = al.getCodonFrames();
+      List<AlignedCodonFrame> mappings = al.getCodonFrames();
       if (mappings != null)
       {
         StructureSelectionManager ssm = StructureSelectionManager
@@ -482,6 +484,7 @@ public class AlignViewport extends AlignmentViewport implements
    * 
    * @return DOCUMENT ME!
    */
+  @Override
   public char getGapCharacter()
   {
     return getAlignment().getGapCharacter();
@@ -506,6 +509,7 @@ public class AlignViewport extends AlignmentViewport implements
    * 
    * @return DOCUMENT ME!
    */
+  @Override
   public ColumnSelection getColumnSelection()
   {
     return colSel;
@@ -617,6 +621,7 @@ public class AlignViewport extends AlignmentViewport implements
   /**
    * Send the current selection to be broadcast to any selection listeners.
    */
+  @Override
   public void sendSelection()
   {
     jalview.structure.StructureSelectionManager
@@ -658,39 +663,6 @@ public class AlignViewport extends AlignmentViewport implements
   }
 
   /**
-   * synthesize a column selection if none exists so it covers the given
-   * selection group. if wholewidth is false, no column selection is made if the
-   * selection group covers the whole alignment width.
-   * 
-   * @param sg
-   * @param wholewidth
-   */
-  public void expandColSelection(SequenceGroup sg, boolean wholewidth)
-  {
-    int sgs, sge;
-    if (sg != null
-            && (sgs = sg.getStartRes()) >= 0
-            && sg.getStartRes() <= (sge = sg.getEndRes())
-            && (colSel == null || colSel.getSelected() == null || colSel
-                    .getSelected().size() == 0))
-    {
-      if (!wholewidth && alignment.getWidth() == (1 + sge - sgs))
-      {
-        // do nothing
-        return;
-      }
-      if (colSel == null)
-      {
-        colSel = new ColumnSelection();
-      }
-      for (int cspos = sg.getStartRes(); cspos <= sg.getEndRes(); cspos++)
-      {
-        colSel.addElement(cspos);
-      }
-    }
-  }
-
-  /**
    * Returns the (Desktop) instance of the StructureSelectionManager
    */
   @Override
@@ -736,6 +708,7 @@ public class AlignViewport extends AlignmentViewport implements
     return seqvectors.toArray(new SequenceI[seqvectors.size()][]);
   }
 
+  @Override
   public boolean isNormaliseSequenceLogo()
   {
     return normaliseSequenceLogo;
@@ -750,6 +723,7 @@ public class AlignViewport extends AlignmentViewport implements
    * 
    * @return true if alignment characters should be displayed
    */
+  @Override
   public boolean isValidCharWidth()
   {
     return validCharWidth;
@@ -825,10 +799,10 @@ public class AlignViewport extends AlignmentViewport implements
    * may give the user the option to open a new frame, or split panel, with cDNA
    * and protein linked.
    * 
-   * @param al
+   * @param toAdd
    * @param title
    */
-  public void addAlignment(AlignmentI al, String title)
+  public void addAlignment(AlignmentI toAdd, String title)
   {
     // TODO: promote to AlignViewportI? applet CutAndPasteTransfer is different
 
@@ -841,25 +815,26 @@ public class AlignViewport extends AlignmentViewport implements
     // TODO: create undo object for this JAL-1101
 
     /*
-     * If any cDNA/protein mappings can be made between the alignments, offer to
-     * open a linked alignment with split frame option.
+     * Ensure datasets are created for the new alignment as
+     * mappings operate on dataset sequences
+     */
+    toAdd.setDataset(null);
+
+    /*
+     * Check if any added sequence could be the object of a mapping or
+     * cross-reference; if so, make the mapping explicit 
+     */
+    getAlignment().realiseMappings(toAdd.getSequences());
+
+    /*
+     * If any cDNA/protein mappings exist or can be made between the alignments, 
+     * offer to open a split frame with linked alignments
      */
     if (Cache.getDefault(Preferences.ENABLE_SPLIT_FRAME, true))
     {
-      if (al.getDataset() == null)
+      if (AlignmentUtils.isMappable(toAdd, getAlignment()))
       {
-        // need to create ds seqs
-        for (SequenceI sq : al.getSequences())
-        {
-          if (sq.getDatasetSequence() == null)
-          {
-            sq.createDatasetSequence();
-          }
-        }
-      }
-      if (AlignmentUtils.isMappable(al, getAlignment()))
-      {
-        if (openLinkedAlignment(al, title))
+        if (openLinkedAlignment(toAdd, title))
         {
           return;
         }
@@ -872,9 +847,22 @@ public class AlignViewport extends AlignmentViewport implements
     // TODO: JAL-407 regardless of above - identical sequences (based on ID and
     // provenance) should share the same dataset sequence
 
-    for (int i = 0; i < al.getHeight(); i++)
+    AlignmentI al = getAlignment();
+    String gap = String.valueOf(al.getGapCharacter());
+    for (int i = 0; i < toAdd.getHeight(); i++)
     {
-      getAlignment().addSequence(al.getSequenceAt(i));
+      SequenceI seq = toAdd.getSequenceAt(i);
+      /*
+       * experimental!
+       * - 'align' any mapped sequences as per existing 
+       *    e.g. cdna to genome, domain hit to protein sequence
+       * very experimental! (need a separate menu option for this)
+       * - only add mapped sequences ('select targets from a dataset')
+       */
+      if (true /*AlignmentUtils.alignSequenceAs(seq, al, gap, true, true)*/)
+      {
+        al.addSequence(seq);
+      }
     }
 
     setEndSeq(getAlignment().getHeight());
@@ -1107,4 +1095,67 @@ public class AlignViewport extends AlignmentViewport implements
     return true;
   }
 
+  /**
+   * Applies the supplied feature settings descriptor to currently known
+   * features. This supports an 'initial configuration' of feature colouring
+   * based on a preset or user favourite. This may then be modified in the usual
+   * way using the Feature Settings dialogue.
+   * 
+   * @param featureSettings
+   */
+  public void applyFeaturesStyle(FeatureSettingsModelI featureSettings)
+  {
+    if (featureSettings == null)
+    {
+      return;
+    }
+
+    FeatureRenderer fr = getAlignPanel().getSeqPanel().seqCanvas
+            .getFeatureRenderer();
+    fr.findAllFeatures(true);
+    List<String> renderOrder = fr.getRenderOrder();
+    FeaturesDisplayedI displayed = fr.getFeaturesDisplayed();
+    displayed.clear();
+    // TODO this clears displayed.featuresRegistered - do we care?
+
+    /*
+     * set feature colour if specified by feature settings
+     * set visibility of all features
+     */
+    for (String type : renderOrder)
+    {
+      FeatureColourI preferredColour = featureSettings
+              .getFeatureColour(type);
+      if (preferredColour != null)
+      {
+        fr.setColour(type, preferredColour);
+      }
+      if (featureSettings.isFeatureDisplayed(type))
+      {
+        displayed.setVisible(type);
+      }
+    }
+
+    /*
+     * set visibility of feature groups
+     */
+    for (String group : fr.getFeatureGroups())
+    {
+      fr.setGroupVisibility(group, featureSettings.isGroupDisplayed(group));
+    }
+
+    /*
+     * order the features
+     */
+    if (featureSettings.optimiseOrder())
+    {
+      // TODO not supported (yet?)
+    }
+    else
+    {
+      fr.orderFeatures(featureSettings);
+    }
+    fr.setTransparency(featureSettings.getTransparency());
+  }
+
 }
index 383dd1b..469e495 100644 (file)
@@ -22,6 +22,7 @@ package jalview.gui;
 
 import jalview.api.FeatureColourI;
 import jalview.datamodel.AlignmentAnnotation;
+import jalview.datamodel.SequenceI;
 import jalview.io.AnnotationFile;
 import jalview.io.FeaturesFile;
 import jalview.io.JalviewFileChooser;
@@ -157,15 +158,25 @@ public class AnnotationExporter extends JPanel
     {
       Map<String, FeatureColourI> displayedFeatureColours = ap
               .getFeatureRenderer().getDisplayedFeatureCols();
+      FeaturesFile formatter = new FeaturesFile();
+      SequenceI[] sequences = ap.av.getAlignment().getSequencesArray();
+      Map<String, FeatureColourI> 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());// ap.av.featuresDisplayed//);
+        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);
       }
     }
     else
index d4300e4..68df498 100755 (executable)
@@ -213,6 +213,7 @@ public class AnnotationLabels extends JPanel implements MouseListener,
    * @param evt
    *          DOCUMENT ME!
    */
+  @Override
   public void actionPerformed(ActionEvent evt)
   {
     AlignmentAnnotation[] aa = ap.av.getAlignment()
@@ -325,16 +326,275 @@ public class AnnotationLabels extends JPanel implements MouseListener,
     return true;
   }
 
-  /**
-   * DOCUMENT ME!
-   * 
-   * @param evt
-   *          DOCUMENT ME!
-   */
+  @Override
   public void mousePressed(MouseEvent evt)
   {
     getSelectedRow(evt.getY() - getScrollOffset());
     oldY = evt.getY();
+    if (!evt.isPopupTrigger())
+    {
+      return;
+    }
+    evt.consume();
+    // handle popup menu event
+    final AlignmentAnnotation[] aa = ap.av.getAlignment()
+            .getAlignmentAnnotation();
+
+    JPopupMenu pop = new JPopupMenu(
+            MessageManager.getString("label.annotations"));
+    JMenuItem item = new JMenuItem(ADDNEW);
+    item.addActionListener(this);
+    pop.add(item);
+    if (selectedRow < 0)
+    {
+      if (hasHiddenRows)
+      { // let the user make everything visible again
+        item = new JMenuItem(SHOWALL);
+        item.addActionListener(this);
+        pop.add(item);
+      }
+      pop.show(this, evt.getX(), evt.getY());
+      return;
+    }
+    item = new JMenuItem(EDITNAME);
+    item.addActionListener(this);
+    pop.add(item);
+    item = new JMenuItem(HIDE);
+    item.addActionListener(this);
+    pop.add(item);
+    // JAL-1264 hide all sequence-specific annotations of this type
+    if (selectedRow < aa.length)
+    {
+      if (aa[selectedRow].sequenceRef != null)
+      {
+        final String label = aa[selectedRow].label;
+        JMenuItem hideType = new JMenuItem();
+        String text = MessageManager.getString("label.hide_all") + " "
+                + label;
+        hideType.setText(text);
+        hideType.addActionListener(new ActionListener()
+        {
+          @Override
+          public void actionPerformed(ActionEvent e)
+          {
+            AlignmentUtils.showOrHideSequenceAnnotations(
+                    ap.av.getAlignment(), Collections.singleton(label),
+                    null, false, false);
+            // for (AlignmentAnnotation ann : ap.av.getAlignment()
+            // .getAlignmentAnnotation())
+            // {
+            // if (ann.sequenceRef != null && ann.label != null
+            // && ann.label.equals(label))
+            // {
+            // ann.visible = false;
+            // }
+            // }
+            refresh();
+          }
+        });
+        pop.add(hideType);
+      }
+    }
+    item = new JMenuItem(DELETE);
+    item.addActionListener(this);
+    pop.add(item);
+    if (hasHiddenRows)
+    {
+      item = new JMenuItem(SHOWALL);
+      item.addActionListener(this);
+      pop.add(item);
+    }
+    item = new JMenuItem(OUTPUT_TEXT);
+    item.addActionListener(this);
+    pop.add(item);
+    // TODO: annotation object should be typed for autocalculated/derived
+    // property methods
+    if (selectedRow < aa.length)
+    {
+      final String label = aa[selectedRow].label;
+      if (!aa[selectedRow].autoCalculated)
+      {
+        if (aa[selectedRow].graph == AlignmentAnnotation.NO_GRAPH)
+        {
+          // display formatting settings for this row.
+          pop.addSeparator();
+          // av and sequencegroup need to implement same interface for
+          item = new JCheckBoxMenuItem(TOGGLE_LABELSCALE,
+                  aa[selectedRow].scaleColLabel);
+          item.addActionListener(this);
+          pop.add(item);
+        }
+      }
+      else if (label.indexOf("Consensus") > -1)
+      {
+        pop.addSeparator();
+        // av and sequencegroup need to implement same interface for
+        final JCheckBoxMenuItem cbmi = new JCheckBoxMenuItem(
+                MessageManager.getString("label.ignore_gaps_consensus"),
+                (aa[selectedRow].groupRef != null) ? aa[selectedRow].groupRef
+                        .getIgnoreGapsConsensus() : ap.av
+                        .isIgnoreGapsConsensus());
+        final AlignmentAnnotation aaa = aa[selectedRow];
+        cbmi.addActionListener(new ActionListener()
+        {
+          @Override
+          public void actionPerformed(ActionEvent e)
+          {
+            if (aaa.groupRef != null)
+            {
+              // TODO: pass on reference to ap so the view can be updated.
+              aaa.groupRef.setIgnoreGapsConsensus(cbmi.getState());
+              ap.getAnnotationPanel().paint(
+                      ap.getAnnotationPanel().getGraphics());
+            }
+            else
+            {
+              ap.av.setIgnoreGapsConsensus(cbmi.getState(), ap);
+            }
+          }
+        });
+        pop.add(cbmi);
+        // av and sequencegroup need to implement same interface for
+        if (aaa.groupRef != null)
+        {
+          final JCheckBoxMenuItem chist = new JCheckBoxMenuItem(
+                  MessageManager.getString("label.show_group_histogram"),
+                  aa[selectedRow].groupRef.isShowConsensusHistogram());
+          chist.addActionListener(new ActionListener()
+          {
+            @Override
+            public void actionPerformed(ActionEvent e)
+            {
+              // TODO: pass on reference
+              // to ap
+              // so the
+              // view
+              // can be
+              // updated.
+              aaa.groupRef.setShowConsensusHistogram(chist.getState());
+              ap.repaint();
+              // ap.annotationPanel.paint(ap.annotationPanel.getGraphics());
+            }
+          });
+          pop.add(chist);
+          final JCheckBoxMenuItem cprofl = new JCheckBoxMenuItem(
+                  MessageManager.getString("label.show_group_logo"),
+                  aa[selectedRow].groupRef.isShowSequenceLogo());
+          cprofl.addActionListener(new ActionListener()
+          {
+            @Override
+            public void actionPerformed(ActionEvent e)
+            {
+              // TODO: pass on reference
+              // to ap
+              // so the
+              // view
+              // can be
+              // updated.
+              aaa.groupRef.setshowSequenceLogo(cprofl.getState());
+              ap.repaint();
+              // ap.annotationPanel.paint(ap.annotationPanel.getGraphics());
+            }
+          });
+          pop.add(cprofl);
+          final JCheckBoxMenuItem cproflnorm = new JCheckBoxMenuItem(
+                  MessageManager.getString("label.normalise_group_logo"),
+                  aa[selectedRow].groupRef.isNormaliseSequenceLogo());
+          cproflnorm.addActionListener(new ActionListener()
+          {
+            @Override
+            public void actionPerformed(ActionEvent e)
+            {
+
+              // TODO: pass on reference
+              // to ap
+              // so the
+              // view
+              // can be
+              // updated.
+              aaa.groupRef.setNormaliseSequenceLogo(cproflnorm.getState());
+              // automatically enable logo display if we're clicked
+              aaa.groupRef.setshowSequenceLogo(true);
+              ap.repaint();
+              // ap.annotationPanel.paint(ap.annotationPanel.getGraphics());
+            }
+          });
+          pop.add(cproflnorm);
+        }
+        else
+        {
+          final JCheckBoxMenuItem chist = new JCheckBoxMenuItem(
+                  MessageManager.getString("label.show_histogram"),
+                  av.isShowConsensusHistogram());
+          chist.addActionListener(new ActionListener()
+          {
+            @Override
+            public void actionPerformed(ActionEvent e)
+            {
+              // TODO: pass on reference
+              // to ap
+              // so the
+              // view
+              // can be
+              // updated.
+              av.setShowConsensusHistogram(chist.getState());
+              ap.alignFrame.setMenusForViewport();
+              ap.repaint();
+              // ap.annotationPanel.paint(ap.annotationPanel.getGraphics());
+            }
+          });
+          pop.add(chist);
+          final JCheckBoxMenuItem cprof = new JCheckBoxMenuItem(
+                  MessageManager.getString("label.show_logo"),
+                  av.isShowSequenceLogo());
+          cprof.addActionListener(new ActionListener()
+          {
+            @Override
+            public void actionPerformed(ActionEvent e)
+            {
+              // TODO: pass on reference
+              // to ap
+              // so the
+              // view
+              // can be
+              // updated.
+              av.setShowSequenceLogo(cprof.getState());
+              ap.alignFrame.setMenusForViewport();
+              ap.repaint();
+              // ap.annotationPanel.paint(ap.annotationPanel.getGraphics());
+            }
+          });
+          pop.add(cprof);
+          final JCheckBoxMenuItem cprofnorm = new JCheckBoxMenuItem(
+                  MessageManager.getString("label.normalise_logo"),
+                  av.isNormaliseSequenceLogo());
+          cprofnorm.addActionListener(new ActionListener()
+          {
+            @Override
+            public void actionPerformed(ActionEvent e)
+            {
+              // TODO: pass on reference
+              // to ap
+              // so the
+              // view
+              // can be
+              // updated.
+              av.setShowSequenceLogo(true);
+              av.setNormaliseSequenceLogo(cprofnorm.getState());
+              ap.alignFrame.setMenusForViewport();
+              ap.repaint();
+              // ap.annotationPanel.paint(ap.annotationPanel.getGraphics());
+            }
+          });
+          pop.add(cprofnorm);
+        }
+        final JMenuItem consclipbrd = new JMenuItem(COPYCONS_SEQ);
+        consclipbrd.addActionListener(this);
+        pop.add(consclipbrd);
+      }
+    }
+    pop.show(this, evt.getX(), evt.getY());
+
   }
 
   /**
@@ -343,6 +603,7 @@ public class AnnotationLabels extends JPanel implements MouseListener,
    * @param evt
    *          DOCUMENT ME!
    */
+  @Override
   public void mouseReleased(MouseEvent evt)
   {
     int start = selectedRow;
@@ -377,6 +638,7 @@ public class AnnotationLabels extends JPanel implements MouseListener,
    * @param evt
    *          DOCUMENT ME!
    */
+  @Override
   public void mouseEntered(MouseEvent evt)
   {
     if (evt.getY() < 10)
@@ -392,6 +654,7 @@ public class AnnotationLabels extends JPanel implements MouseListener,
    * @param evt
    *          DOCUMENT ME!
    */
+  @Override
   public void mouseExited(MouseEvent evt)
   {
     if (dragEvent == null)
@@ -407,6 +670,7 @@ public class AnnotationLabels extends JPanel implements MouseListener,
    * @param evt
    *          DOCUMENT ME!
    */
+  @Override
   public void mouseDragged(MouseEvent evt)
   {
     dragEvent = evt;
@@ -443,6 +707,7 @@ public class AnnotationLabels extends JPanel implements MouseListener,
    * @param evt
    *          DOCUMENT ME!
    */
+  @Override
   public void mouseMoved(MouseEvent evt)
   {
     resizePanel = evt.getY() < 10;
@@ -521,17 +786,12 @@ public class AnnotationLabels extends JPanel implements MouseListener,
     }
   }
 
-  /**
-   * DOCUMENT ME!
-   * 
-   * @param evt
-   *          DOCUMENT ME!
-   */
+  @Override
   public void mouseClicked(MouseEvent evt)
   {
     final AlignmentAnnotation[] aa = ap.av.getAlignment()
             .getAlignmentAnnotation();
-    if (SwingUtilities.isLeftMouseButton(evt))
+    if (!evt.isPopupTrigger() && SwingUtilities.isLeftMouseButton(evt))
     {
       if (selectedRow > -1 && selectedRow < aa.length)
       {
@@ -608,259 +868,8 @@ public class AnnotationLabels extends JPanel implements MouseListener,
 
         }
       }
-    }
-    if (!SwingUtilities.isRightMouseButton(evt))
-    {
-      return;
-    }
-
-    JPopupMenu pop = new JPopupMenu(
-            MessageManager.getString("label.annotations"));
-    JMenuItem item = new JMenuItem(ADDNEW);
-    item.addActionListener(this);
-    pop.add(item);
-    if (selectedRow < 0)
-    {
-      if (hasHiddenRows)
-      { // let the user make everything visible again
-        item = new JMenuItem(SHOWALL);
-        item.addActionListener(this);
-        pop.add(item);
-      }
-      pop.show(this, evt.getX(), evt.getY());
       return;
     }
-    item = new JMenuItem(EDITNAME);
-    item.addActionListener(this);
-    pop.add(item);
-    item = new JMenuItem(HIDE);
-    item.addActionListener(this);
-    pop.add(item);
-    // JAL-1264 hide all sequence-specific annotations of this type
-    if (selectedRow < aa.length)
-    {
-      if (aa[selectedRow].sequenceRef != null)
-      {
-        final String label = aa[selectedRow].label;
-        JMenuItem hideType = new JMenuItem();
-        String text = MessageManager.getString("label.hide_all") + " "
-                + label;
-        hideType.setText(text);
-        hideType.addActionListener(new ActionListener()
-        {
-          @Override
-          public void actionPerformed(ActionEvent e)
-          {
-            AlignmentUtils.showOrHideSequenceAnnotations(
-                    ap.av.getAlignment(), Collections.singleton(label),
-                    null, false, false);
-            // for (AlignmentAnnotation ann : ap.av.getAlignment()
-            // .getAlignmentAnnotation())
-            // {
-            // if (ann.sequenceRef != null && ann.label != null
-            // && ann.label.equals(label))
-            // {
-            // ann.visible = false;
-            // }
-            // }
-            refresh();
-          }
-        });
-        pop.add(hideType);
-      }
-    }
-    item = new JMenuItem(DELETE);
-    item.addActionListener(this);
-    pop.add(item);
-    if (hasHiddenRows)
-    {
-      item = new JMenuItem(SHOWALL);
-      item.addActionListener(this);
-      pop.add(item);
-    }
-    item = new JMenuItem(OUTPUT_TEXT);
-    item.addActionListener(this);
-    pop.add(item);
-    // TODO: annotation object should be typed for autocalculated/derived
-    // property methods
-    if (selectedRow < aa.length)
-    {
-      final String label = aa[selectedRow].label;
-      if (!aa[selectedRow].autoCalculated)
-      {
-        if (aa[selectedRow].graph == AlignmentAnnotation.NO_GRAPH)
-        {
-          // display formatting settings for this row.
-          pop.addSeparator();
-          // av and sequencegroup need to implement same interface for
-          item = new JCheckBoxMenuItem(TOGGLE_LABELSCALE,
-                  aa[selectedRow].scaleColLabel);
-          item.addActionListener(this);
-          pop.add(item);
-        }
-      }
-      else if (label.indexOf("Consensus") > -1)
-      {
-        pop.addSeparator();
-        // av and sequencegroup need to implement same interface for
-        final JCheckBoxMenuItem cbmi = new JCheckBoxMenuItem(
-                MessageManager.getString("label.ignore_gaps_consensus"),
-                (aa[selectedRow].groupRef != null) ? aa[selectedRow].groupRef
-                        .getIgnoreGapsConsensus() : ap.av
-                        .isIgnoreGapsConsensus());
-        final AlignmentAnnotation aaa = aa[selectedRow];
-        cbmi.addActionListener(new ActionListener()
-        {
-          public void actionPerformed(ActionEvent e)
-          {
-            if (aaa.groupRef != null)
-            {
-              // TODO: pass on reference to ap so the view can be updated.
-              aaa.groupRef.setIgnoreGapsConsensus(cbmi.getState());
-              ap.getAnnotationPanel().paint(
-                      ap.getAnnotationPanel().getGraphics());
-            }
-            else
-            {
-              ap.av.setIgnoreGapsConsensus(cbmi.getState(), ap);
-            }
-          }
-        });
-        pop.add(cbmi);
-        // av and sequencegroup need to implement same interface for
-        if (aaa.groupRef != null)
-        {
-          final JCheckBoxMenuItem chist = new JCheckBoxMenuItem(
-                  MessageManager.getString("label.show_group_histogram"),
-                  aa[selectedRow].groupRef.isShowConsensusHistogram());
-          chist.addActionListener(new ActionListener()
-          {
-            public void actionPerformed(ActionEvent e)
-            {
-              // TODO: pass on reference
-              // to ap
-              // so the
-              // view
-              // can be
-              // updated.
-              aaa.groupRef.setShowConsensusHistogram(chist.getState());
-              ap.repaint();
-              // ap.annotationPanel.paint(ap.annotationPanel.getGraphics());
-            }
-          });
-          pop.add(chist);
-          final JCheckBoxMenuItem cprofl = new JCheckBoxMenuItem(
-                  MessageManager.getString("label.show_group_logo"),
-                  aa[selectedRow].groupRef.isShowSequenceLogo());
-          cprofl.addActionListener(new ActionListener()
-          {
-            public void actionPerformed(ActionEvent e)
-            {
-              // TODO: pass on reference
-              // to ap
-              // so the
-              // view
-              // can be
-              // updated.
-              aaa.groupRef.setshowSequenceLogo(cprofl.getState());
-              ap.repaint();
-              // ap.annotationPanel.paint(ap.annotationPanel.getGraphics());
-            }
-          });
-          pop.add(cprofl);
-          final JCheckBoxMenuItem cproflnorm = new JCheckBoxMenuItem(
-                  MessageManager.getString("label.normalise_group_logo"),
-                  aa[selectedRow].groupRef.isNormaliseSequenceLogo());
-          cproflnorm.addActionListener(new ActionListener()
-          {
-            public void actionPerformed(ActionEvent e)
-            {
-
-              // TODO: pass on reference
-              // to ap
-              // so the
-              // view
-              // can be
-              // updated.
-              aaa.groupRef.setNormaliseSequenceLogo(cproflnorm.getState());
-              // automatically enable logo display if we're clicked
-              aaa.groupRef.setshowSequenceLogo(true);
-              ap.repaint();
-              // ap.annotationPanel.paint(ap.annotationPanel.getGraphics());
-            }
-          });
-          pop.add(cproflnorm);
-        }
-        else
-        {
-          final JCheckBoxMenuItem chist = new JCheckBoxMenuItem(
-                  MessageManager.getString("label.show_histogram"),
-                  av.isShowConsensusHistogram());
-          chist.addActionListener(new ActionListener()
-          {
-            public void actionPerformed(ActionEvent e)
-            {
-              // TODO: pass on reference
-              // to ap
-              // so the
-              // view
-              // can be
-              // updated.
-              av.setShowConsensusHistogram(chist.getState());
-              ap.alignFrame.setMenusForViewport();
-              ap.repaint();
-              // ap.annotationPanel.paint(ap.annotationPanel.getGraphics());
-            }
-          });
-          pop.add(chist);
-          final JCheckBoxMenuItem cprof = new JCheckBoxMenuItem(
-                  MessageManager.getString("label.show_logo"),
-                  av.isShowSequenceLogo());
-          cprof.addActionListener(new ActionListener()
-          {
-            public void actionPerformed(ActionEvent e)
-            {
-              // TODO: pass on reference
-              // to ap
-              // so the
-              // view
-              // can be
-              // updated.
-              av.setShowSequenceLogo(cprof.getState());
-              ap.alignFrame.setMenusForViewport();
-              ap.repaint();
-              // ap.annotationPanel.paint(ap.annotationPanel.getGraphics());
-            }
-          });
-          pop.add(cprof);
-          final JCheckBoxMenuItem cprofnorm = new JCheckBoxMenuItem(
-                  MessageManager.getString("label.normalise_logo"),
-                  av.isNormaliseSequenceLogo());
-          cprofnorm.addActionListener(new ActionListener()
-          {
-            public void actionPerformed(ActionEvent e)
-            {
-              // TODO: pass on reference
-              // to ap
-              // so the
-              // view
-              // can be
-              // updated.
-              av.setShowSequenceLogo(true);
-              av.setNormaliseSequenceLogo(cprofnorm.getState());
-              ap.alignFrame.setMenusForViewport();
-              ap.repaint();
-              // ap.annotationPanel.paint(ap.annotationPanel.getGraphics());
-            }
-          });
-          pop.add(cprofnorm);
-        }
-        final JMenuItem consclipbrd = new JMenuItem(COPYCONS_SEQ);
-        consclipbrd.addActionListener(this);
-        pop.add(consclipbrd);
-      }
-    }
-    pop.show(this, evt.getX(), evt.getY());
   }
 
   /**
@@ -893,7 +902,7 @@ public class AnnotationLabels extends JPanel implements MouseListener,
     List<int[]> hiddenCols = av.getColumnSelection().getHiddenColumns();
     if (hiddenCols != null)
     {
-      alignmentStartEnd = AlignFrame.getStartEnd(alignmentStartEnd,
+      alignmentStartEnd = av.getAlignment().getVisibleStartAndEndIndex(
               hiddenCols);
     }
     String output = new FormatAdapter().formatSequences("Fasta", seqs,
@@ -926,6 +935,7 @@ public class AnnotationLabels extends JPanel implements MouseListener,
    * @param g1
    *          DOCUMENT ME!
    */
+  @Override
   public void paintComponent(Graphics g)
   {
 
index a70d4b9..bb311ef 100755 (executable)
@@ -54,7 +54,6 @@ import javax.swing.JOptionPane;
 import javax.swing.JPanel;
 import javax.swing.JPopupMenu;
 import javax.swing.Scrollable;
-import javax.swing.SwingUtilities;
 import javax.swing.ToolTipManager;
 
 /**
@@ -511,7 +510,7 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
       }
     }
 
-    if (SwingUtilities.isRightMouseButton(evt) && activeRow != -1)
+    if (evt.isPopupTrigger() && activeRow != -1)
     {
       if (av.getColumnSelection() == null)
       {
index 861fe56..e2637a9 100644 (file)
@@ -23,6 +23,7 @@ package jalview.gui;
 import jalview.api.StructureSelectionManagerProvider;
 import jalview.datamodel.PDBEntry;
 import jalview.datamodel.SequenceI;
+import jalview.io.StructureFile;
 import jalview.structure.StructureSelectionManager;
 import jalview.util.MessageManager;
 
@@ -48,7 +49,7 @@ public class AssociatePdbFileWithSeq
           StructureSelectionManagerProvider ssmp)
   {
     PDBEntry entry = new PDBEntry();
-    MCview.PDBfile pdbfile = null;
+    StructureFile pdbfile = null;
     pdbfile = StructureSelectionManager.getStructureSelectionManager(ssmp)
             .setMapping(false, new SequenceI[] { sequence }, null, choice,
                     protocol);
@@ -57,7 +58,7 @@ public class AssociatePdbFileWithSeq
       // stacktrace already thrown so just return
       return null;
     }
-    if (pdbfile.id == null)
+    if (pdbfile.getId() == null)
     {
       String reply = null;
 
@@ -78,7 +79,7 @@ public class AssociatePdbFileWithSeq
     }
     else
     {
-      entry.setId(pdbfile.id);
+      entry.setId(pdbfile.getId());
     }
     entry.setType(PDBEntry.Type.FILE);
 
index 09451dc..f2244d5 100644 (file)
@@ -270,6 +270,7 @@ public class ChimeraViewFrame extends StructureViewerBase
 
     this.addInternalFrameListener(new InternalFrameAdapter()
     {
+      @Override
       public void internalFrameClosing(InternalFrameEvent internalFrameEvent)
       {
         closeViewer(false);
@@ -460,6 +461,7 @@ public class ChimeraViewFrame extends StructureViewerBase
             MessageManager.getString("label.all"));
     menuItem.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent evt)
       {
         allChainsSelected = true;
@@ -482,6 +484,7 @@ public class ChimeraViewFrame extends StructureViewerBase
       menuItem = new JCheckBoxMenuItem(chainName, true);
       menuItem.addItemListener(new ItemListener()
       {
+        @Override
         public void itemStateChanged(ItemEvent evt)
         {
           if (!allChainsSelected)
@@ -523,6 +526,7 @@ public class ChimeraViewFrame extends StructureViewerBase
    * @param closeChimera
    *          if true, close any linked Chimera process; if false, prompt first
    */
+  @Override
   public void closeViewer(boolean closeChimera)
   {
     if (jmb != null && jmb.isChimeraRunning())
@@ -553,6 +557,7 @@ public class ChimeraViewFrame extends StructureViewerBase
    * Open any newly added PDB structures in Chimera, having first fetched data
    * from PDB (if not already saved).
    */
+  @Override
   public void run()
   {
     _started = true;
@@ -699,6 +704,7 @@ public class ChimeraViewFrame extends StructureViewerBase
       {
         new Thread(new Runnable()
         {
+          @Override
           public void run()
           {
             alignStructs_withAllAlignPanels();
@@ -1091,6 +1097,7 @@ public class ChimeraViewFrame extends StructureViewerBase
     }
   }
 
+  @Override
   public void setJalviewColourScheme(ColourSchemeI ucs)
   {
     jmb.setJalviewColourScheme(ucs);
index 7d5d8d7..65d8670 100644 (file)
@@ -100,6 +100,7 @@ public class CutAndPasteHtmlTransfer extends GCutAndPasteHtmlTransfer
     });
     SwingUtilities.invokeLater(new Runnable()
     {
+      @Override
       public void run()
       {
         textarea.requestFocus();
@@ -143,6 +144,7 @@ public class CutAndPasteHtmlTransfer extends GCutAndPasteHtmlTransfer
     textarea.setText(text);
   }
 
+  @Override
   public void save_actionPerformed(ActionEvent e)
   {
     JalviewFileChooser chooser = new JalviewFileChooser(
@@ -173,6 +175,7 @@ public class CutAndPasteHtmlTransfer extends GCutAndPasteHtmlTransfer
     }
   }
 
+  @Override
   public void toggleHtml_actionPerformed(ActionEvent e)
   {
     String txt = textarea.getText();
@@ -187,6 +190,7 @@ public class CutAndPasteHtmlTransfer extends GCutAndPasteHtmlTransfer
    * @param e
    *          DOCUMENT ME!
    */
+  @Override
   public void copyItem_actionPerformed(ActionEvent e)
   {
     Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
@@ -210,6 +214,7 @@ public class CutAndPasteHtmlTransfer extends GCutAndPasteHtmlTransfer
    * @param e
    *          DOCUMENT ME!
    */
+  @Override
   public void cancel_actionPerformed(ActionEvent e)
   {
     try
@@ -220,9 +225,10 @@ public class CutAndPasteHtmlTransfer extends GCutAndPasteHtmlTransfer
     }
   }
 
+  @Override
   public void textarea_mousePressed(MouseEvent e)
   {
-    if (SwingUtilities.isRightMouseButton(e))
+    if (e.isPopupTrigger())
     {
       JPopupMenu popup = new JPopupMenu(
               MessageManager.getString("action.edit"));
@@ -230,6 +236,7 @@ public class CutAndPasteHtmlTransfer extends GCutAndPasteHtmlTransfer
               MessageManager.getString("action.copy"));
       item.addActionListener(new ActionListener()
       {
+        @Override
         public void actionPerformed(ActionEvent e)
         {
           copyItem_actionPerformed(e);
index 4541fc2..1161340 100644 (file)
@@ -23,7 +23,9 @@ package jalview.gui;
 import jalview.api.AlignViewportI;
 import jalview.api.AlignmentViewPanel;
 import jalview.api.ComplexAlignFile;
+import jalview.api.FeatureSettingsModelI;
 import jalview.api.FeaturesDisplayedI;
+import jalview.api.FeaturesSourceI;
 import jalview.bin.Jalview;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.ColumnSelection;
@@ -72,6 +74,7 @@ public class CutAndPasteTransfer extends GCutAndPasteTransfer
   {
     SwingUtilities.invokeLater(new Runnable()
     {
+      @Override
       public void run()
       {
         textarea.requestFocus();
@@ -124,6 +127,7 @@ public class CutAndPasteTransfer extends GCutAndPasteTransfer
     textarea.append(text);
   }
 
+  @Override
   public void save_actionPerformed(ActionEvent e)
   {
     JalviewFileChooser chooser = new JalviewFileChooser(
@@ -160,6 +164,7 @@ public class CutAndPasteTransfer extends GCutAndPasteTransfer
    * @param e
    *          DOCUMENT ME!
    */
+  @Override
   public void copyItem_actionPerformed(ActionEvent e)
   {
     textarea.getSelectedText();
@@ -173,6 +178,7 @@ public class CutAndPasteTransfer extends GCutAndPasteTransfer
    * @param e
    *          DOCUMENT ME!
    */
+  @Override
   public void pasteMenu_actionPerformed(ActionEvent e)
   {
     Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
@@ -198,6 +204,7 @@ public class CutAndPasteTransfer extends GCutAndPasteTransfer
    * @param e
    *          DOCUMENT ME!
    */
+  @Override
   public void ok_actionPerformed(ActionEvent e)
   {
     String text = getText();
@@ -206,7 +213,7 @@ public class CutAndPasteTransfer extends GCutAndPasteTransfer
       return;
     }
 
-    String format = new IdentifyFile().Identify(text, "Paste");
+    String format = new IdentifyFile().identify(text, "Paste");
     if (format == null || format.equalsIgnoreCase("EMPTY DATA FILE"))
     {
       System.err.println(MessageManager
@@ -247,8 +254,19 @@ public class CutAndPasteTransfer extends GCutAndPasteTransfer
     {
       String title = MessageManager.formatMessage(
               "label.input_cut_paste_params", new String[] { format });
-      if (viewport != null)
+      FeatureSettingsModelI proxyColourScheme = source
+              .getFeatureColourScheme();
+
+      /*
+       * if the view panel was closed its alignment is nulled
+       * and this is an orphaned cut and paste window
+       */
+      if (viewport != null && viewport.getAlignment() != null)
       {
+        if (proxyColourScheme != null)
+        {
+          viewport.applyFeaturesStyle(proxyColourScheme);
+        }
         ((AlignViewport) viewport).addAlignment(al, title);
       }
       else
@@ -282,8 +300,15 @@ public class CutAndPasteTransfer extends GCutAndPasteTransfer
         {
           af = new AlignFrame(al, AlignFrame.DEFAULT_WIDTH,
                   AlignFrame.DEFAULT_HEIGHT);
+          if (source instanceof FeaturesSourceI)
+          {
+            af.getViewport().setShowSequenceFeatures(true);
+          }
+        }
+        if (proxyColourScheme != null)
+        {
+          af.getViewport().applyFeaturesStyle(proxyColourScheme);
         }
-
         af.currentFileFormat = format;
         Desktop.addInternalFrame(af, title, AlignFrame.DEFAULT_WIDTH,
                 AlignFrame.DEFAULT_HEIGHT);
@@ -319,6 +344,7 @@ public class CutAndPasteTransfer extends GCutAndPasteTransfer
    * @param e
    *          DOCUMENT ME!
    */
+  @Override
   public void cancel_actionPerformed(ActionEvent e)
   {
     try
@@ -329,9 +355,10 @@ public class CutAndPasteTransfer extends GCutAndPasteTransfer
     }
   }
 
+  @Override
   public void textarea_mousePressed(MouseEvent e)
   {
-    if (SwingUtilities.isRightMouseButton(e))
+    if (e.isPopupTrigger())
     {
       JPopupMenu popup = new JPopupMenu(
               MessageManager.getString("action.edit"));
@@ -339,6 +366,7 @@ public class CutAndPasteTransfer extends GCutAndPasteTransfer
               MessageManager.getString("action.copy"));
       item.addActionListener(new ActionListener()
       {
+        @Override
         public void actionPerformed(ActionEvent e)
         {
           copyItem_actionPerformed(e);
@@ -348,6 +376,7 @@ public class CutAndPasteTransfer extends GCutAndPasteTransfer
       item = new JMenuItem(MessageManager.getString("action.paste"));
       item.addActionListener(new ActionListener()
       {
+        @Override
         public void actionPerformed(ActionEvent e)
         {
           pasteMenu_actionPerformed(e);
index 53e3c8d..b176672 100644 (file)
@@ -81,6 +81,7 @@ public class DasSourceBrowser extends GDasSourceBrowser implements
     ListSelectionModel rowSM = table.getSelectionModel();
     rowSM.addListSelectionListener(new ListSelectionListener()
     {
+      @Override
       public void valueChanged(ListSelectionEvent e)
       {
         ListSelectionModel lsm = (ListSelectionModel) e.getSource();
@@ -94,10 +95,10 @@ public class DasSourceBrowser extends GDasSourceBrowser implements
 
     table.addMouseListener(new MouseAdapter()
     {
+      @Override
       public void mouseClicked(MouseEvent evt)
       {
-        if (evt.getClickCount() == 2
-                || SwingUtilities.isRightMouseButton(evt))
+        if (evt.getClickCount() == 2 || evt.isPopupTrigger())
         {
           editRemoveLocalSource(evt);
         }
@@ -119,6 +120,7 @@ public class DasSourceBrowser extends GDasSourceBrowser implements
     this(null);
   }
 
+  @Override
   public void paintComponent(java.awt.Graphics g)
   {
     if (sourceRegistry == null)
@@ -145,6 +147,7 @@ public class DasSourceBrowser extends GDasSourceBrowser implements
 
     javax.swing.SwingUtilities.invokeLater(new Runnable()
     {
+      @Override
       public void run()
       {
         TableSorter sorter = (TableSorter) table.getModel();
@@ -282,6 +285,7 @@ public class DasSourceBrowser extends GDasSourceBrowser implements
     fullDetails.setText(text.toString());
     javax.swing.SwingUtilities.invokeLater(new Runnable()
     {
+      @Override
       public void run()
       {
         fullDetailsScrollpane.getVerticalScrollBar().setValue(0);
@@ -289,6 +293,7 @@ public class DasSourceBrowser extends GDasSourceBrowser implements
     });
   }
 
+  @Override
   public void run()
   {
     loadingDasSources = true;
@@ -358,6 +363,7 @@ public class DasSourceBrowser extends GDasSourceBrowser implements
     return selected;
   }
 
+  @Override
   public void refresh_actionPerformed(ActionEvent e)
   {
     saveProperties(jalview.bin.Cache.applicationProperties);
@@ -411,6 +417,7 @@ public class DasSourceBrowser extends GDasSourceBrowser implements
 
     javax.swing.SwingUtilities.invokeLater(new Runnable()
     {
+      @Override
       public void run()
       {
         filter1.setSelectedIndex(0);
@@ -420,6 +427,7 @@ public class DasSourceBrowser extends GDasSourceBrowser implements
     });
   }
 
+  @Override
   public void amendLocal(boolean newSource)
   {
     String url = "http://localhost:8080/", nickname = "";
@@ -503,6 +511,7 @@ public class DasSourceBrowser extends GDasSourceBrowser implements
 
     SwingUtilities.invokeLater(new Runnable()
     {
+      @Override
       public void run()
       {
         scrollPane.getVerticalScrollBar().setValue(
@@ -571,6 +580,7 @@ public class DasSourceBrowser extends GDasSourceBrowser implements
       refreshTableData(data);
       SwingUtilities.invokeLater(new Runnable()
       {
+        @Override
         public void run()
         {
           scrollPane.getVerticalScrollBar().setValue(
@@ -582,6 +592,7 @@ public class DasSourceBrowser extends GDasSourceBrowser implements
     }
   }
 
+  @Override
   public void valueChanged(ListSelectionEvent evt)
   {
     // Called when the MainTable selection changes
@@ -691,6 +702,7 @@ public class DasSourceBrowser extends GDasSourceBrowser implements
     }
   }
 
+  @Override
   public void reset_actionPerformed(ActionEvent e)
   {
     registryURL.setText(sourceRegistry.getDasRegistryURL());
@@ -743,21 +755,25 @@ public class DasSourceBrowser extends GDasSourceBrowser implements
 
     private Object[][] data;
 
+    @Override
     public int getColumnCount()
     {
       return columnNames.length;
     }
 
+    @Override
     public int getRowCount()
     {
       return data.length;
     }
 
+    @Override
     public String getColumnName(int col)
     {
       return columnNames[col];
     }
 
+    @Override
     public Object getValueAt(int row, int col)
     {
       return data[row][col];
@@ -768,6 +784,7 @@ public class DasSourceBrowser extends GDasSourceBrowser implements
      * each cell. If we didn't implement this method, then the last column would
      * contain text ("true"/"false"), rather than a check box.
      */
+    @Override
     public Class getColumnClass(int c)
     {
       return getValueAt(0, c).getClass();
@@ -776,6 +793,7 @@ public class DasSourceBrowser extends GDasSourceBrowser implements
     /*
      * Don't need to implement this method unless your table's editable.
      */
+    @Override
     public boolean isCellEditable(int row, int col)
     {
       // Note that the data/cell address is constant,
@@ -787,6 +805,7 @@ public class DasSourceBrowser extends GDasSourceBrowser implements
     /*
      * Don't need to implement this method unless your table's data can change.
      */
+    @Override
     public void setValueAt(Object value, int row, int col)
     {
       data[row][col] = value;
@@ -812,6 +831,7 @@ public class DasSourceBrowser extends GDasSourceBrowser implements
 
     Thread thr = new Thread(new Runnable()
     {
+      @Override
       public void run()
       {
         // this actually initialises the das source list
index 8ba21e5..7f36f7f 100644 (file)
@@ -47,6 +47,7 @@ import java.awt.GridLayout;
 import java.awt.Point;
 import java.awt.Rectangle;
 import java.awt.Toolkit;
+import java.awt.Window;
 import java.awt.datatransfer.Clipboard;
 import java.awt.datatransfer.ClipboardOwner;
 import java.awt.datatransfer.DataFlavor;
@@ -71,7 +72,6 @@ import java.beans.PropertyVetoException;
 import java.io.BufferedInputStream;
 import java.io.File;
 import java.io.FileOutputStream;
-import java.lang.reflect.Constructor;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Hashtable;
@@ -312,7 +312,20 @@ public class Desktop extends jalview.jbgui.GDesktop implements
      */
     instance = this;
     doVamsasClientCheck();
-    doGroovyCheck();
+
+    groovyShell = new JMenuItem();
+    groovyShell.setText(MessageManager.getString("label.groovy_console"));
+    groovyShell.addActionListener(new ActionListener()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        groovyShell_actionPerformed();
+      }
+    });
+    toolsMenu.add(groovyShell);
+    groovyShell.setVisible(true);
+
     doConfigureStructurePrefs();
     setTitle("Jalview " + jalview.bin.Cache.getProperty("VERSION"));
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
@@ -383,7 +396,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements
       @Override
       public void mousePressed(MouseEvent evt)
       {
-        if (SwingUtilities.isRightMouseButton(evt))
+        if (evt.isPopupTrigger())
         {
           showPasteMenu(evt.getX(), evt.getY());
         }
@@ -653,7 +666,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements
         String file = (String) contents
                 .getTransferData(DataFlavor.stringFlavor);
 
-        String format = new IdentifyFile().Identify(file,
+        String format = new IdentifyFile().identify(file,
                 FormatAdapter.PASTE);
 
         new FileLoader().LoadFile(file, FormatAdapter.PASTE, format);
@@ -1007,7 +1020,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements
           }
           else
           {
-            format = new IdentifyFile().Identify(file, protocol);
+            format = new IdentifyFile().identify(file, protocol);
           }
 
           new FileLoader().LoadFile(file, protocol, format);
@@ -1058,20 +1071,13 @@ public class Desktop extends jalview.jbgui.GDesktop implements
       }
       else
       {
-        format = new IdentifyFile().Identify(choice, FormatAdapter.FILE);
+        format = new IdentifyFile().identify(choice, FormatAdapter.FILE);
       }
 
       if (viewport != null)
       {
         new FileLoader().LoadFile(viewport, choice, FormatAdapter.FILE,
                 format);
-        // viewport.setShowSequenceFeatures(JSONFile.isSeqFeaturesEnabled());
-        // AlignFrame af = viewport.getAlignPanel().alignFrame;
-        // if (af != null)
-        // {
-        // af.changeColour(JSONFile.getColourScheme());
-        // af.setMenusForViewport();
-        // }
       }
       else
       {
@@ -1141,7 +1147,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements
     }
     else
     {
-      String format = new IdentifyFile().Identify(url, FormatAdapter.URL);
+      String format = new IdentifyFile().identify(url, FormatAdapter.URL);
 
       if (format.equals("URL NOT FOUND"))
       {
@@ -2393,25 +2399,6 @@ public class Desktop extends jalview.jbgui.GDesktop implements
 
   protected JMenuItem groovyShell;
 
-  public void doGroovyCheck()
-  {
-    if (jalview.bin.Cache.groovyJarsPresent())
-    {
-      groovyShell = new JMenuItem();
-      groovyShell.setText(MessageManager.getString("label.groovy_console"));
-      groovyShell.addActionListener(new ActionListener()
-      {
-        @Override
-        public void actionPerformed(ActionEvent e)
-        {
-          groovyShell_actionPerformed();
-        }
-      });
-      toolsMenu.add(groovyShell);
-      groovyShell.setVisible(true);
-    }
-  }
-
   /**
    * Accessor method to quickly get all the AlignmentFrames loaded.
    * 
@@ -2499,24 +2486,9 @@ public class Desktop extends jalview.jbgui.GDesktop implements
    */
   public void groovyShell_actionPerformed()
   {
-    // use reflection to avoid creating compilation dependency.
-    if (!jalview.bin.Cache.groovyJarsPresent())
-    {
-      throw new Error(
-              MessageManager
-                      .getString("error.implementation_error_cannot_create_groovyshell"));
-    }
     try
     {
-      Class<?> gcClass = Desktop.class.getClassLoader().loadClass(
-              "groovy.ui.Console");
-      Constructor<?> gccons = gcClass.getConstructor();
-      java.lang.reflect.Method setvar = gcClass.getMethod("setVariable",
-              new Class[] { String.class, Object.class });
-      java.lang.reflect.Method run = gcClass.getMethod("run");
-      Object gc = gccons.newInstance();
-      setvar.invoke(gc, new Object[] { "Jalview", this });
-      run.invoke(gc);
+      openGroovyConsole();
     } catch (Exception ex)
     {
       jalview.bin.Cache.log.error("Groovy Shell Creation failed.", ex);
@@ -2529,6 +2501,65 @@ public class Desktop extends jalview.jbgui.GDesktop implements
   }
 
   /**
+   * Open the Groovy console
+   */
+  void openGroovyConsole()
+  {
+    groovyConsole = new groovy.ui.Console();
+
+    /*
+     * bind groovy variable 'Jalview' to the Desktop object
+     */
+    groovyConsole.setVariable("Jalview", this);
+
+    /*
+     * start the console
+     */
+    groovyConsole.run();
+
+    /*
+     * 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
+     */
+    Window window = (Window) groovyConsole.getFrame();
+    window.addWindowListener(new WindowAdapter()
+    {
+      @Override
+      public void windowClosed(WindowEvent e)
+      {
+        groovyShell.setEnabled(true);
+        enableExecuteGroovy(false);
+      }
+    });
+
+    /*
+     * 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
+   */
+  public void enableExecuteGroovy(boolean enabled)
+  {
+    AlignFrame[] alignFrames = getAlignFrames();
+    if (alignFrames != null)
+    {
+      for (AlignFrame af : alignFrames)
+      {
+        af.setGroovyEnabled(enabled);
+      }
+    }
+  }
+
+  /**
    * Progress bars managed by the IProgressIndicator method.
    */
   private Hashtable<Long, JPanel> progressBars;
@@ -2924,6 +2955,8 @@ public class Desktop extends jalview.jbgui.GDesktop implements
    */
   private java.util.concurrent.Semaphore block = new Semaphore(0);
 
+  private static groovy.ui.Console groovyConsole;
+
   /**
    * add another dialog thread to the queue
    * 
@@ -3152,4 +3185,9 @@ public class Desktop extends jalview.jbgui.GDesktop implements
     Desktop.currentAlignFrame = currentAlignFrame;
   }
 
+  public static groovy.ui.Console getGroovyConsole()
+  {
+    return groovyConsole;
+  }
+
 }
index 46bcdab..1bf7453 100644 (file)
@@ -39,6 +39,8 @@ import java.awt.event.ItemEvent;
 import java.awt.event.ItemListener;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
+import java.util.Arrays;
+import java.util.Comparator;
 
 import javax.swing.JColorChooser;
 import javax.swing.JComboBox;
@@ -441,4 +443,15 @@ public class FeatureRenderer extends
       FeatureSettings.renderGraduatedColor(colour, col);
     }
   }
+
+  /**
+   * Orders features in render precedence (last in order is last to render, so
+   * displayed on top of other features)
+   * 
+   * @param order
+   */
+  public void orderFeatures(Comparator<String> order)
+  {
+    Arrays.sort(renderOrder, order);
+  }
 }
index cf7bdb3..bfc14b5 100644 (file)
@@ -58,6 +58,7 @@ import java.io.FileOutputStream;
 import java.io.InputStreamReader;
 import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
+import java.util.Arrays;
 import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.List;
@@ -210,19 +211,13 @@ public class FeatureSettings extends JPanel implements
         int newRow = table.rowAtPoint(evt.getPoint());
         if (newRow != selectedRow && selectedRow != -1 && newRow != -1)
         {
-          Object[] temp = new Object[3];
-          temp[0] = table.getValueAt(selectedRow, 0);
-          temp[1] = table.getValueAt(selectedRow, 1);
-          temp[2] = table.getValueAt(selectedRow, 2);
-
-          table.setValueAt(table.getValueAt(newRow, 0), selectedRow, 0);
-          table.setValueAt(table.getValueAt(newRow, 1), selectedRow, 1);
-          table.setValueAt(table.getValueAt(newRow, 2), selectedRow, 2);
-
-          table.setValueAt(temp[0], newRow, 0);
-          table.setValueAt(temp[1], newRow, 1);
-          table.setValueAt(temp[2], newRow, 2);
-
+          Object[][] data = ((FeatureTableModel) table.getModel())
+                  .getData();
+          Object[] temp = data[selectedRow];
+          data[selectedRow] = data[newRow];
+          data[newRow] = temp;
+          updateFeatureRenderer(data);
+          table.repaint();
           selectedRow = newRow;
         }
       }
@@ -286,7 +281,7 @@ public class FeatureSettings extends JPanel implements
     frame.setLayer(JLayeredPane.PALETTE_LAYER);
   }
 
-  protected void popupSort(final int row, final String type,
+  protected void popupSort(final int selectedRow, final String type,
           final Object typeCol, final Map<String, float[][]> minmax, int x,
           int y)
   {
@@ -304,7 +299,8 @@ public class FeatureSettings extends JPanel implements
       @Override
       public void actionPerformed(ActionEvent e)
       {
-        me.af.avc.sortAlignmentByFeatureScore(new String[] { type });
+        me.af.avc.sortAlignmentByFeatureScore(Arrays
+                .asList(new String[] { type }));
       }
 
     });
@@ -316,7 +312,8 @@ public class FeatureSettings extends JPanel implements
       @Override
       public void actionPerformed(ActionEvent e)
       {
-        me.af.avc.sortAlignmentByFeatureDensity(new String[] { type });
+        me.af.avc.sortAlignmentByFeatureDensity(Arrays
+                .asList(new String[] { type }));
       }
 
     });
@@ -380,13 +377,13 @@ public class FeatureSettings extends JPanel implements
               {
                 FeatureColourChooser fc = (FeatureColourChooser) e
                         .getSource();
-                table.setValueAt(fc.getLastColour(), row, 1);
+                table.setValueAt(fc.getLastColour(), selectedRow, 1);
                 table.validate();
               }
               else
               {
                 // probably the color chooser!
-                table.setValueAt(colorChooser.getColor(), row, 1);
+                table.setValueAt(colorChooser.getColor(), selectedRow, 1);
                 table.validate();
                 me.updateFeatureRenderer(
                         ((FeatureTableModel) table.getModel()).getData(),
@@ -402,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)
       {
@@ -414,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)
       {
@@ -422,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);
   }
 
@@ -814,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");
@@ -970,10 +987,19 @@ public class FeatureSettings extends JPanel implements
     updateFeatureRenderer(data, true);
   }
 
+  /**
+   * Update the priority order of features; only repaint if this changed the
+   * order of visible features
+   * 
+   * @param data
+   * @param visibleNew
+   */
   private void updateFeatureRenderer(Object[][] data, boolean visibleNew)
   {
-    fr.setFeaturePriority(data, visibleNew);
-    af.alignPanel.paintAlignment(true);
+    if (fr.setFeaturePriority(data, visibleNew))
+    {
+      af.alignPanel.paintAlignment(true);
+    }
   }
 
   int selectedRow = -1;
index c89a9d5..37be8bc 100755 (executable)
@@ -204,6 +204,7 @@ public class IdCanvas extends JPanel
    * @param g
    *          DOCUMENT ME!
    */
+  @Override
   public void paintComponent(Graphics g)
   {
     g.setColor(Color.white);
@@ -479,7 +480,7 @@ public class IdCanvas extends JPanel
     Font bold = new Font(av.getFont().getName(), Font.BOLD, av.getFont()
             .getSize());
 
-    if (av.isHiddenRepSequence(seq))
+    if (av.isReferenceSeq(seq) || av.isHiddenRepSequence(seq))
     {
       gg.setFont(bold);
     }
index 5dfe581..c84505b 100755 (executable)
@@ -112,8 +112,8 @@ public class IdPanel extends JPanel implements MouseListener,
       seqAnnotReport.createSequenceAnnotationReport(tip, sequence,
               av.isShowDBRefs(), av.isShowNPFeats(),
               sp.seqCanvas.fr.getMinMax());
-      setToolTipText("<html>" + sequence.getDisplayId(true) + " "
-              + tip.toString() + "</html>");
+      setToolTipText(JvSwingUtils.wrapTooltip(true,
+              sequence.getDisplayId(true) + " " + tip.toString()));
     }
   }
 
@@ -193,6 +193,8 @@ public class IdPanel extends JPanel implements MouseListener,
      */
     if (e.getClickCount() < 2 || SwingUtilities.isRightMouseButton(e))
     {
+      // reinstate isRightMouseButton check to ignore mouse-related popup events
+      // note - this does nothing on default MacBookPro force-trackpad config!
       return;
     }
 
@@ -316,29 +318,33 @@ public class IdPanel extends JPanel implements MouseListener,
 
     int seq = alignPanel.getSeqPanel().findSeq(e);
 
-    if (SwingUtilities.isRightMouseButton(e))
+    if (e.isPopupTrigger())
     {
       Sequence sq = (Sequence) av.getAlignment().getSequenceAt(seq);
       // build a new links menu based on the current links + any non-positional
       // features
-      Vector nlinks = new Vector(Preferences.sequenceURLLinks);
-      SequenceFeature sf[] = sq == null ? null : sq.getSequenceFeatures();
-      for (int sl = 0; sf != null && sl < sf.length; sl++)
+      Vector<String> nlinks = new Vector<String>(
+              Preferences.sequenceURLLinks);
+      SequenceFeature sfs[] = sq == null ? null : sq.getSequenceFeatures();
+      if (sfs != null)
       {
-        if (sf[sl].begin == sf[sl].end && sf[sl].begin == 0)
+        for (SequenceFeature sf : sfs)
         {
-          if (sf[sl].links != null && sf[sl].links.size() > 0)
+          if (sf.begin == sf.end && sf.begin == 0)
           {
-            for (int l = 0, lSize = sf[sl].links.size(); l < lSize; l++)
+            if (sf.links != null && sf.links.size() > 0)
             {
-              nlinks.addElement(sf[sl].links.elementAt(l));
+              for (int l = 0, lSize = sf.links.size(); l < lSize; l++)
+              {
+                nlinks.addElement(sf.links.elementAt(l));
+              }
             }
           }
         }
       }
 
-      jalview.gui.PopupMenu pop = new jalview.gui.PopupMenu(alignPanel, sq,
-              nlinks, new Vector(Preferences.getGroupURLLinks()));
+      PopupMenu pop = new PopupMenu(alignPanel, sq, nlinks,
+              Preferences.getGroupURLLinks());
       pop.show(this, e.getX(), e.getY());
 
       return;
index a886723..6f602ad 100644 (file)
@@ -46,6 +46,7 @@ import javax.swing.JLabel;
 import javax.swing.JPanel;
 import javax.swing.JScrollPane;
 import javax.swing.JTree;
+import javax.swing.ToolTipManager;
 import javax.swing.event.TreeSelectionEvent;
 import javax.swing.event.TreeSelectionListener;
 import javax.swing.tree.DefaultMutableTreeNode;
@@ -244,6 +245,7 @@ public class JDatabaseTree extends JalviewDialog implements KeyListener
     public DbTreeRenderer(JDatabaseTree me)
     {
       us = me;
+      ToolTipManager.sharedInstance().registerComponent(dbviews);
     }
 
     private Component returnLabel(String txt)
@@ -265,19 +267,23 @@ public class JDatabaseTree extends JalviewDialog implements KeyListener
         value = vl.getUserObject();
         if (value instanceof DbSourceProxy)
         {
-          val = (((DbSourceProxy) value).getDbName());
+          val = ((DbSourceProxy) value).getDbName();
+          if (((DbSourceProxy) value).getDescription() != null)
+          { // getName()
+            this.setToolTipText(((DbSourceProxy) value).getDescription());
+          }
         }
         else
         {
           if (value instanceof String)
           {
-            val = ((String) value);
+            val = (String) value;
           }
         }
       }
       if (value == null)
       {
-        val = ("");
+        val = "";
       }
       return super.getTreeCellRendererComponent(tree, val, selected,
               expanded, leaf, row, hasFocus);
index 9a9c7b3..3a16bb8 100644 (file)
@@ -165,7 +165,7 @@ public class Jalview2XML
    */
   Map<String, SequenceI> seqRefIds = null;
 
-  Vector frefedSequence = null;
+  Vector<Object[]> frefedSequence = null;
 
   boolean raiseGUI = true; // whether errors are raised in dialog boxes or not
 
@@ -260,7 +260,7 @@ public class Jalview2XML
       int r = 0, rSize = frefedSequence.size();
       while (r < rSize)
       {
-        Object[] ref = (Object[]) frefedSequence.elementAt(r);
+        Object[] ref = frefedSequence.elementAt(r);
         if (ref != null)
         {
           String sref = (String) ref[0];
@@ -763,10 +763,11 @@ public class Jalview2XML
           if (sf[index].otherDetails != null)
           {
             String key;
-            Enumeration keys = sf[index].otherDetails.keys();
-            while (keys.hasMoreElements())
+            Iterator<String> keys = sf[index].otherDetails.keySet()
+                    .iterator();
+            while (keys.hasNext())
             {
-              key = keys.nextElement().toString();
+              key = keys.next();
               OtherData keyValue = new OtherData();
               keyValue.setKey(key);
               keyValue.setValue(sf[index].otherDetails.get(key).toString());
@@ -881,7 +882,7 @@ public class Jalview2XML
     // SAVE MAPPINGS
     if (jal.getCodonFrames() != null)
     {
-      Set<AlignedCodonFrame> jac = jal.getCodonFrames();
+      List<AlignedCodonFrame> jac = jal.getCodonFrames();
       for (AlignedCodonFrame acf : jac)
       {
         AlcodonFrame alc = new AlcodonFrame();
@@ -1198,41 +1199,41 @@ public class Jalview2XML
         Vector<String> settingsAdded = new Vector<String>();
         if (renderOrder != null)
         {
-          for (int ro = 0; ro < renderOrder.length; ro++)
+          for (String featureType : renderOrder)
           {
-            FeatureColourI gstyle = ap.getSeqPanel().seqCanvas
+            FeatureColourI fcol = ap.getSeqPanel().seqCanvas
                     .getFeatureRenderer()
-                    .getFeatureStyle(renderOrder[ro]);
+                    .getFeatureStyle(featureType);
             Setting setting = new Setting();
-            setting.setType(renderOrder[ro]);
-            if (!gstyle.isSimpleColour())
+            setting.setType(featureType);
+            if (!fcol.isSimpleColour())
             {
-              setting.setColour(gstyle.getMaxColour().getRGB());
-              setting.setMincolour(gstyle.getMinColour().getRGB());
-              setting.setMin(gstyle.getMin());
-              setting.setMax(gstyle.getMax());
-              setting.setColourByLabel(gstyle.isColourByLabel());
-              setting.setAutoScale(gstyle.isAutoScaled());
-              setting.setThreshold(gstyle.getThreshold());
+              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(gstyle.isAboveThreshold() ? 1
-                      : (gstyle.isBelowThreshold() ? 0 : -1));
+              setting.setThreshstate(fcol.isAboveThreshold() ? 1
+                      : (fcol.isBelowThreshold() ? 0 : -1));
             }
             else
             {
-              setting.setColour(gstyle.getColour().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);
           }
         }
 
@@ -1243,7 +1244,7 @@ public class Jalview2XML
         Vector<String> groupsAdded = new Vector<String>();
         while (en.hasNext())
         {
-          String grp = en.next().toString();
+          String grp = en.next();
           if (groupsAdded.contains(grp))
           {
             continue;
@@ -2227,7 +2228,7 @@ public class Jalview2XML
     }
     if (frefedSequence == null)
     {
-      frefedSequence = new Vector();
+      frefedSequence = new Vector<Object[]>();
     }
 
     AlignFrame af = null, _af = null;
@@ -2823,7 +2824,7 @@ public class Jalview2XML
             {
               mapping = addMapping(maps[m].getMapping());
             }
-            if (dnaseq != null)
+            if (dnaseq != null && mapping.getTo() != null)
             {
               cf.addMap(dnaseq, mapping.getTo(), mapping.getMap());
             }
index 8a0fe77..801cb1f 100644 (file)
@@ -130,9 +130,9 @@ public class OptsAndParamsPage
       add(enabled, BorderLayout.NORTH);
       for (Object str : opt.getPossibleValues())
       {
-        val.addItem((String) str);
+        val.addItem(str);
       }
-      val.setSelectedItem((String) opt.getValue());
+      val.setSelectedItem(opt.getValue());
       if (opt.getPossibleValues().size() > 1)
       {
         setLayout(new GridLayout(1, 2));
@@ -145,6 +145,7 @@ public class OptsAndParamsPage
       setInitialValue();
     }
 
+    @Override
     public void actionPerformed(ActionEvent e)
     {
       if (e.getSource() != enabled)
@@ -206,32 +207,37 @@ public class OptsAndParamsPage
       return opt;
     }
 
+    @Override
     public void mouseClicked(MouseEvent e)
     {
-      if (javax.swing.SwingUtilities.isRightMouseButton(e))
+      if (e.isPopupTrigger())
       {
         showUrlPopUp(this, finfo.toString(), e.getX(), e.getY());
       }
     }
 
+    @Override
     public void mouseEntered(MouseEvent e)
     {
       // TODO Auto-generated method stub
 
     }
 
+    @Override
     public void mouseExited(MouseEvent e)
     {
       // TODO Auto-generated method stub
 
     }
 
+    @Override
     public void mousePressed(MouseEvent e)
     {
       // TODO Auto-generated method stub
 
     }
 
+    @Override
     public void mouseReleased(MouseEvent e)
     {
       // TODO Auto-generated method stub
@@ -412,6 +418,7 @@ public class OptsAndParamsPage
         showDesc.addActionListener(new ActionListener()
         {
 
+          @Override
           public void actionPerformed(ActionEvent e)
           {
             descisvisible = !descisvisible;
@@ -451,6 +458,7 @@ public class OptsAndParamsPage
       validate();
     }
 
+    @Override
     public void actionPerformed(ActionEvent e)
     {
       if (adjusting)
@@ -526,45 +534,51 @@ public class OptsAndParamsPage
       lastVal = null;
     }
 
+    @Override
     public void mouseClicked(MouseEvent e)
     {
-      if (javax.swing.SwingUtilities.isRightMouseButton(e))
+      if (e.isPopupTrigger())
       {
         showUrlPopUp(this, finfo.toString(), e.getX(), e.getY());
       }
     }
 
+    @Override
     public void mouseEntered(MouseEvent e)
     {
       // TODO Auto-generated method stub
 
     }
 
+    @Override
     public void mouseExited(MouseEvent e)
     {
       // TODO Auto-generated method stub
 
     }
 
+    @Override
     public void mousePressed(MouseEvent e)
     {
       // TODO Auto-generated method stub
 
     }
 
+    @Override
     public void mouseReleased(MouseEvent e)
     {
       // TODO Auto-generated method stub
 
     }
 
+    @Override
     public void stateChanged(ChangeEvent e)
     {
       if (!adjusting)
       {
         valueField.setText(""
-                + ((integ) ? ("" + (int) slider.getValue())
-                        : ("" + (float) (slider.getValue() / 1000f))));
+                + ((integ) ? ("" + slider.getValue())
+                        : ("" + slider.getValue() / 1000f)));
         checkIfModified();
       }
 
diff --git a/src/jalview/gui/PDBSearchPanel.java b/src/jalview/gui/PDBSearchPanel.java
deleted file mode 100644 (file)
index cef9ddd..0000000
+++ /dev/null
@@ -1,317 +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 <http://www.gnu.org/licenses/>.
- * The Jalview Authors are detailed in the 'AUTHORS' file.
- */
-
-package jalview.gui;
-
-import jalview.jbgui.GPDBSearchPanel;
-import jalview.jbgui.PDBDocFieldPreferences;
-import jalview.util.MessageManager;
-import jalview.ws.dbsources.PDBRestClient;
-import jalview.ws.dbsources.PDBRestClient.PDBDocField;
-import jalview.ws.uimodel.PDBRestRequest;
-import jalview.ws.uimodel.PDBRestResponse;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashSet;
-import java.util.List;
-
-import javax.swing.table.DefaultTableModel;
-
-@SuppressWarnings("serial")
-public class PDBSearchPanel extends GPDBSearchPanel
-{
-  private SequenceFetcher seqFetcher;
-
-  private IProgressIndicator progressIdicator;
-
-  private Collection<PDBDocField> wantedFields;
-
-  public PDBSearchPanel(SequenceFetcher seqFetcher)
-  {
-    this.seqFetcher = seqFetcher;
-    this.progressIdicator = (seqFetcher == null) ? null : seqFetcher
-            .getProgressIndicator();
-  }
-
-  /**
-   * Action performed when an input is detected on txt_search field.
-   */
-  @Override
-  public void txt_search_ActionPerformed()
-  {
-    new Thread()
-    {
-      public void run()
-      {
-        lbl_loading.setVisible(false);
-        errorWarning.setLength(0);
-        lbl_warning.setVisible(false);
-        btn_ok.setEnabled(false);
-        boolean allowEmptySequence = false;
-        mainFrame.setTitle(MessageManager
-                .getString("label.pdb_sequence_getcher"));
-        tbl_summary.setModel(new DefaultTableModel());
-        if (txt_search.getText().trim().length() > 0)
-        {
-          lbl_loading.setVisible(true);
-          long startTime = System.currentTimeMillis();
-
-          String searchTarget = ((PDBDocField) cmb_searchTarget
-                  .getSelectedItem()).getCode();
-
-          wantedFields = PDBDocFieldPreferences.getSearchSummaryFields();
-
-          String searchTerm = decodeSearchTerm(txt_search.getText(),
-                  searchTarget);
-
-          PDBRestRequest request = new PDBRestRequest();
-          request.setAllowEmptySeq(allowEmptySequence);
-          request.setResponseSize(100);
-          request.setFieldToSearchBy("(" + searchTarget + ":");
-          request.setSearchTerm(searchTerm + ")");
-          request.setWantedFields(wantedFields);
-          // System.out.println(">>>>>>>>>>>>>> " + request.getQuery());
-          PDBRestClient pdbRestCleint = new PDBRestClient();
-          PDBRestResponse resultList;
-          try
-          {
-            resultList = pdbRestCleint.executeRequest(request);
-          } catch (Exception e)
-          {
-            // e.printStackTrace();
-            errorWarning.append(e.getMessage());
-            checkForErrors();
-            return;
-          }
-
-          if (resultList.getSearchSummary() != null)
-          {
-            tbl_summary.setModel(PDBRestResponse.getTableModel(request,
-                    resultList.getSearchSummary()));
-          }
-
-          long endTime = System.currentTimeMillis();
-          int resultSetCount = resultList.getNumberOfItemsFound();
-          String result = (resultSetCount > 1) ? MessageManager
-                  .getString("label.results") : MessageManager
-                  .getString("label.result");
-          mainFrame.setTitle(frameTitle + " - " + resultSetCount + " "
-                  + result + " (" + (endTime - startTime) + " milli secs)");
-          lbl_loading.setVisible(false);
-        }
-      }
-    }.start();
-  }
-
-  public static String decodeSearchTerm(String enteredText,
-          String targetField)
-  {
-    String foundSearchTerms = enteredText;
-    StringBuilder foundSearchTermsBuilder = new StringBuilder();
-    if (enteredText.contains(";"))
-    {
-      String[] searchTerms = enteredText.split(";");
-      for (String searchTerm : searchTerms)
-      {
-        if (searchTerm.contains(":"))
-        {
-          foundSearchTermsBuilder.append(targetField).append(":")
-                  .append(searchTerm.split(":")[0]).append(" OR ");
-        }
-        else
-        {
-          foundSearchTermsBuilder.append(targetField).append(":")
-                  .append(searchTerm).append(" OR ");
-        }
-      }
-      int endIndex = foundSearchTermsBuilder.lastIndexOf(" OR ");
-      foundSearchTerms = foundSearchTermsBuilder.toString();
-      if (foundSearchTerms.contains(" OR "))
-      {
-        foundSearchTerms = foundSearchTerms.substring(
-                targetField.length() + 1, endIndex);
-      }
-    }
-    else if (enteredText.contains(":"))
-    {
-      foundSearchTerms = foundSearchTerms.split(":")[0];
-    }
-    return foundSearchTerms;
-  }
-
-  @Override
-  public void btn_ok_ActionPerformed()
-  {
-    loadSelectedPDBSequencesToAlignment();
-  }
-
-  @Override
-  public void btn_back_ActionPerformed()
-  {
-    mainFrame.dispose();
-    new SequenceFetcher(progressIdicator);
-  }
-
-  @Override
-  public void btn_cancel_ActionPerformed()
-  {
-    mainFrame.dispose();
-  }
-
-  public void transferToSequenceFetcher(String ids)
-  {
-    // mainFrame.dispose();
-    seqFetcher.textArea.setText(ids);
-    Thread worker = new Thread(seqFetcher);
-    worker.start();
-  }
-
-  /**
-   * Add the discovered/selected sequences to a target alignment window
-   */
-  public void loadSelectedPDBSequencesToAlignment()
-  {
-    // mainFrame.dispose();
-    disableActionButtons();
-    StringBuilder selectedIds = new StringBuilder();
-    HashSet<String> selectedIdsSet = new HashSet<String>();
-    int pdbIdCol = PDBRestClient.getPDBIdColumIndex(wantedFields, false);
-    int[] selectedRows = tbl_summary.getSelectedRows();
-    for (int summaryRow : selectedRows)
-    {
-      String pdbIdStr = tbl_summary.getValueAt(summaryRow, pdbIdCol)
-              .toString();
-      String searchTerm = txt_search.getText();
-      selectedIdsSet.add(getPDBIdwithSpecifiedChain(pdbIdStr, searchTerm));
-    }
-
-    for (String selectedId : selectedIdsSet)
-    {
-      selectedIds.append(selectedId).append(";");
-    }
-
-    String ids = selectedIds.toString();
-    // System.out.println(">>>>>>>>>>>>>>>> selected Ids: " + ids);
-    seqFetcher.textArea.setText(ids);
-    Thread worker = new Thread(seqFetcher);
-    worker.start();
-    delayAndEnableActionButtons();
-
-  }
-
-  private void disableActionButtons()
-  {
-    btn_ok.setEnabled(false);
-    btn_back.setEnabled(false);
-    btn_cancel.setEnabled(false);
-  }
-
-  private void delayAndEnableActionButtons()
-  {
-    new Thread()
-    {
-      public void run()
-      {
-        try
-        {
-          Thread.sleep(1500);
-        } catch (InterruptedException e)
-        {
-          e.printStackTrace();
-        }
-        btn_ok.setEnabled(true);
-        btn_back.setEnabled(true);
-        btn_cancel.setEnabled(true);
-      }
-    }.start();
-  }
-
-  public static String getPDBIdwithSpecifiedChain(String pdbId,
-          String searchTerm)
-  {
-    String pdbIdWithChainCode = "";
-    if (searchTerm.contains(";"))
-    {
-      String[] foundTerms = searchTerm.split(";");
-      for (String foundTerm : foundTerms)
-      {
-        if (foundTerm.contains(pdbId))
-        {
-          pdbIdWithChainCode = foundTerm;
-        }
-      }
-    }
-    else if (searchTerm.contains(pdbId))
-    {
-      pdbIdWithChainCode = searchTerm;
-    }
-    else
-    {
-      pdbIdWithChainCode = pdbId;
-    }
-    return pdbIdWithChainCode;
-  }
-
-  /**
-   * Populates search target combo-box options
-   */
-  public void populateCmbSearchTargetOptions()
-  {
-    List<PDBDocField> searchableTargets = new ArrayList<PDBDocField>();
-    searchableTargets.add(PDBDocField.PDB_ID);
-    searchableTargets.add(PDBDocField.PFAM_ACCESSION);
-    searchableTargets.add(PDBDocField.MOLECULE_TYPE);
-    searchableTargets.add(PDBDocField.MOLECULE_NAME);
-    searchableTargets.add(PDBDocField.UNIPROT_ACCESSION);
-    searchableTargets.add(PDBDocField.GENE_NAME);
-    searchableTargets.add(PDBDocField.GENUS);
-    searchableTargets.add(PDBDocField.ALL);
-
-    Collections.sort(searchableTargets, new Comparator<PDBDocField>()
-    {
-      @Override
-      public int compare(PDBDocField o1, PDBDocField o2)
-      {
-        return o1.getName().compareTo(o2.getName());
-      }
-    });
-
-    for (PDBDocField searchTarget : searchableTargets)
-    {
-      cmb_searchTarget.addItem(searchTarget);
-    }
-  }
-
-  public void checkForErrors()
-  {
-    lbl_warning.setVisible(false);
-    if (errorWarning.length() > 0)
-    {
-      lbl_loading.setVisible(false);
-      lbl_warning.setToolTipText(JvSwingUtils.wrapTooltip(true,
-              errorWarning.toString()));
-      lbl_warning.setVisible(true);
-    }
-  }
-}
index e86b2c5..1e0772a 100644 (file)
@@ -24,6 +24,7 @@ import jalview.analysis.AAFrequency;
 import jalview.analysis.AlignmentAnnotationUtils;
 import jalview.analysis.AlignmentUtils;
 import jalview.analysis.Conservation;
+import jalview.bin.Cache;
 import jalview.commands.ChangeCaseCommand;
 import jalview.commands.EditCommand;
 import jalview.commands.EditCommand.Action;
@@ -54,6 +55,7 @@ import jalview.schemes.TaylorColourScheme;
 import jalview.schemes.TurnColourScheme;
 import jalview.schemes.UserColourScheme;
 import jalview.schemes.ZappoColourScheme;
+import jalview.util.DBRefUtils;
 import jalview.util.GroupUrlLink;
 import jalview.util.GroupUrlLink.UrlStringTooLongException;
 import jalview.util.MessageManager;
@@ -62,6 +64,7 @@ import jalview.util.UrlLink;
 import java.awt.Color;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.Hashtable;
@@ -90,8 +93,6 @@ public class PopupMenu extends JPopupMenu
 {
   private static final String ALL_ANNOTATIONS = "All";
 
-  private static final String COMMA = ",";
-
   JMenu groupMenu = new JMenu();
 
   JMenuItem groupName = new JMenuItem();
@@ -176,12 +177,6 @@ public class PopupMenu extends JPopupMenu
 
   JMenu pdbMenu = new JMenu();
 
-  JMenuItem pdbFromFile = new JMenuItem();
-
-  JMenuItem enterPDB = new JMenuItem();
-
-  JMenuItem discoverPDB = new JMenuItem();
-
   JMenu outputMenu = new JMenu();
 
   JMenu seqShowAnnotationsMenu = new JMenu();
@@ -222,7 +217,7 @@ public class PopupMenu extends JPopupMenu
    * @param seq
    *          DOCUMENT ME!
    */
-  public PopupMenu(final AlignmentPanel ap, Sequence seq, Vector links)
+  public PopupMenu(final AlignmentPanel ap, Sequence seq, List<String> links)
   {
     this(ap, seq, links, null);
   }
@@ -235,7 +230,7 @@ public class PopupMenu extends JPopupMenu
    * @param groupLinks
    */
   public PopupMenu(final AlignmentPanel ap, final SequenceI seq,
-          Vector links, Vector groupLinks)
+          List<String> links, List<String> groupLinks)
   {
     // /////////////////////////////////////////////////////////
     // If this is activated from the sequence panel, the user may want to
@@ -614,124 +609,130 @@ public class PopupMenu extends JPopupMenu
 
     if (links != null && links.size() > 0)
     {
+      addFeatureLinks(seq, links);
+    }
+  }
 
-      JMenu linkMenu = new JMenu(MessageManager.getString("action.link"));
-      Vector linkset = new Vector();
-      for (int i = 0; i < links.size(); i++)
+  /**
+   * Adds a 'Link' menu item with a sub-menu item for each hyperlink provided.
+   * 
+   * @param seq
+   * @param links
+   */
+  void addFeatureLinks(final SequenceI seq, List<String> links)
+  {
+    JMenu linkMenu = new JMenu(MessageManager.getString("action.link"));
+    List<String> linkset = new ArrayList<String>();
+    for (String link : links)
+    {
+      UrlLink urlLink = null;
+      try
       {
-        String link = links.elementAt(i).toString();
-        UrlLink urlLink = null;
-        try
-        {
-          urlLink = new UrlLink(link);
-        } catch (Exception foo)
-        {
-          jalview.bin.Cache.log.error("Exception for URLLink '" + link
-                  + "'", foo);
-          continue;
-        }
-        ;
-        if (!urlLink.isValid())
+        urlLink = new UrlLink(link);
+      } catch (Exception foo)
+      {
+        Cache.log.error("Exception for URLLink '" + link + "'", foo);
+        continue;
+      }
+      ;
+      if (!urlLink.isValid())
+      {
+        Cache.log.error(urlLink.getInvalidMessage());
+        continue;
+      }
+      final String label = urlLink.getLabel();
+      if (seq != null && urlLink.isDynamic())
+      {
+
+        // collect matching db-refs
+        DBRefEntry[] dbr = DBRefUtils.selectRefs(seq.getDBRefs(),
+                new String[] { urlLink.getTarget() });
+        // collect id string too
+        String id = seq.getName();
+        String descr = seq.getDescription();
+        if (descr != null && descr.length() < 1)
         {
-          jalview.bin.Cache.log.error(urlLink.getInvalidMessage());
-          continue;
+          descr = null;
         }
-        final String label = urlLink.getLabel();
-        if (seq != null && urlLink.isDynamic())
-        {
 
-          // collect matching db-refs
-          DBRefEntry[] dbr = jalview.util.DBRefUtils.selectRefs(
-                  seq.getDBRefs(), new String[] { urlLink.getTarget() });
-          // collect id string too
-          String id = seq.getName();
-          String descr = seq.getDescription();
-          if (descr != null && descr.length() < 1)
-          {
-            descr = null;
-          }
-
-          if (dbr != null)
+        if (dbr != null)
+        {
+          for (int r = 0; r < dbr.length; r++)
           {
-            for (int r = 0; r < dbr.length; r++)
+            if (id != null && dbr[r].getAccessionId().equals(id))
             {
-              if (id != null && dbr[r].getAccessionId().equals(id))
-              {
-                // suppress duplicate link creation for the bare sequence ID
-                // string with this link
-                id = null;
-              }
-              // create Bare ID link for this RUL
-              String[] urls = urlLink.makeUrls(dbr[r].getAccessionId(),
-                      true);
-              if (urls != null)
-              {
-                for (int u = 0; u < urls.length; u += 2)
-                {
-                  if (!linkset.contains(urls[u] + "|" + urls[u + 1]))
-                  {
-                    linkset.addElement(urls[u] + "|" + urls[u + 1]);
-                    addshowLink(linkMenu, label + "|" + urls[u],
-                            urls[u + 1]);
-                  }
-                }
-              }
+              // suppress duplicate link creation for the bare sequence ID
+              // string with this link
+              id = null;
             }
-          }
-          if (id != null)
-          {
-            // create Bare ID link for this RUL
-            String[] urls = urlLink.makeUrls(id, true);
+            // create Bare ID link for this URL
+            String[] urls = urlLink.makeUrls(dbr[r].getAccessionId(), true);
             if (urls != null)
             {
               for (int u = 0; u < urls.length; u += 2)
               {
                 if (!linkset.contains(urls[u] + "|" + urls[u + 1]))
                 {
-                  linkset.addElement(urls[u] + "|" + urls[u + 1]);
-                  addshowLink(linkMenu, label, urls[u + 1]);
+                  linkset.add(urls[u] + "|" + urls[u + 1]);
+                  addshowLink(linkMenu, label + "|" + urls[u], urls[u + 1]);
                 }
               }
             }
           }
-          // Create urls from description but only for URL links which are regex
-          // links
-          if (descr != null && urlLink.getRegexReplace() != null)
+        }
+        if (id != null)
+        {
+          // create Bare ID link for this URL
+          String[] urls = urlLink.makeUrls(id, true);
+          if (urls != null)
           {
-            // create link for this URL from description where regex matches
-            String[] urls = urlLink.makeUrls(descr, true);
-            if (urls != null)
+            for (int u = 0; u < urls.length; u += 2)
             {
-              for (int u = 0; u < urls.length; u += 2)
+              if (!linkset.contains(urls[u] + "|" + urls[u + 1]))
               {
-                if (!linkset.contains(urls[u] + "|" + urls[u + 1]))
-                {
-                  linkset.addElement(urls[u] + "|" + urls[u + 1]);
-                  addshowLink(linkMenu, label, urls[u + 1]);
-                }
+                linkset.add(urls[u] + "|" + urls[u + 1]);
+                addshowLink(linkMenu, label, urls[u + 1]);
               }
             }
           }
         }
-        else
+        // Create urls from description but only for URL links which are regex
+        // links
+        if (descr != null && urlLink.getRegexReplace() != null)
         {
-          if (!linkset.contains(label + "|" + urlLink.getUrl_prefix()))
+          // create link for this URL from description where regex matches
+          String[] urls = urlLink.makeUrls(descr, true);
+          if (urls != null)
           {
-            linkset.addElement(label + "|" + urlLink.getUrl_prefix());
-            // Add a non-dynamic link
-            addshowLink(linkMenu, label, urlLink.getUrl_prefix());
+            for (int u = 0; u < urls.length; u += 2)
+            {
+              if (!linkset.contains(urls[u] + "|" + urls[u + 1]))
+              {
+                linkset.add(urls[u] + "|" + urls[u + 1]);
+                addshowLink(linkMenu, label, urls[u + 1]);
+              }
+            }
           }
         }
       }
-      if (sequence != null)
-      {
-        sequenceMenu.add(linkMenu);
-      }
       else
       {
-        add(linkMenu);
+        if (!linkset.contains(label + "|" + urlLink.getUrl_prefix()))
+        {
+          linkset.add(label + "|" + urlLink.getUrl_prefix());
+          // Add a non-dynamic link
+          addshowLink(linkMenu, label, urlLink.getUrl_prefix());
+        }
       }
     }
+    if (sequence != null)
+    {
+      sequenceMenu.add(linkMenu);
+    }
+    else
+    {
+      add(linkMenu);
+    }
   }
 
   /**
@@ -861,7 +862,7 @@ public class PopupMenu extends JPopupMenu
     showOrHideMenu.add(item);
   }
 
-  private void buildGroupURLMenu(SequenceGroup sg, Vector groupLinks)
+  private void buildGroupURLMenu(SequenceGroup sg, List<String> groupLinks)
   {
 
     // TODO: usability: thread off the generation of group url content so root
@@ -870,19 +871,15 @@ public class PopupMenu extends JPopupMenu
     // ID/regex match URLs
     groupLinksMenu = new JMenu(
             MessageManager.getString("action.group_link"));
+    // three types of url that might be created.
     JMenu[] linkMenus = new JMenu[] { null,
         new JMenu(MessageManager.getString("action.ids")),
         new JMenu(MessageManager.getString("action.sequences")),
-        new JMenu(MessageManager.getString("action.ids_sequences")) }; // three
-                                                                       // types
-                                                                       // of url
-                                                                       // that
-                                                                       // might
-                                                                       // be
-    // created.
+        new JMenu(MessageManager.getString("action.ids_sequences")) };
+
     SequenceI[] seqs = ap.av.getSelectionAsNewSequence();
     String[][] idandseqs = GroupUrlLink.formStrings(seqs);
-    Hashtable commonDbrefs = new Hashtable();
+    Hashtable<String, Object[]> commonDbrefs = new Hashtable<String, Object[]>();
     for (int sq = 0; sq < seqs.length; sq++)
     {
 
@@ -902,7 +899,7 @@ public class PopupMenu extends JPopupMenu
         for (int d = 0; d < dbr.length; d++)
         {
           String src = dbr[d].getSource(); // jalview.util.DBRefUtils.getCanonicalName(dbr[d].getSource()).toUpperCase();
-          Object[] sarray = (Object[]) commonDbrefs.get(src);
+          Object[] sarray = commonDbrefs.get(src);
           if (sarray == null)
           {
             sarray = new Object[2];
@@ -927,30 +924,29 @@ public class PopupMenu extends JPopupMenu
     // now create group links for all distinct ID/sequence sets.
     boolean addMenu = false; // indicates if there are any group links to give
                              // to user
-    for (int i = 0; i < groupLinks.size(); i++)
+    for (String link : groupLinks)
     {
-      String link = groupLinks.elementAt(i).toString();
       GroupUrlLink urlLink = null;
       try
       {
         urlLink = new GroupUrlLink(link);
       } catch (Exception foo)
       {
-        jalview.bin.Cache.log.error("Exception for GroupURLLink '" + link
+        Cache.log.error("Exception for GroupURLLink '" + link
                 + "'", foo);
         continue;
       }
       ;
       if (!urlLink.isValid())
       {
-        jalview.bin.Cache.log.error(urlLink.getInvalidMessage());
+        Cache.log.error(urlLink.getInvalidMessage());
         continue;
       }
       final String label = urlLink.getLabel();
       boolean usingNames = false;
       // Now see which parts of the group apply for this URL
       String ltarget = urlLink.getTarget(); // jalview.util.DBRefUtils.getCanonicalName(urlLink.getTarget());
-      Object[] idset = (Object[]) commonDbrefs.get(ltarget.toUpperCase());
+      Object[] idset = commonDbrefs.get(ltarget.toUpperCase());
       String[] seqstr, ids; // input to makeUrl
       if (idset != null)
       {
@@ -1068,7 +1064,7 @@ public class PopupMenu extends JPopupMenu
             new Object[] { urlgenerator.getUrl_prefix(),
                 urlgenerator.getNumberInvolved(urlstub) }));
     // TODO: put in info about what is being sent.
-    item.addActionListener(new java.awt.event.ActionListener()
+    item.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
@@ -1082,7 +1078,7 @@ public class PopupMenu extends JPopupMenu
             try
             {
               showLink(urlgenerator.constructFrom(urlstub));
-            } catch (UrlStringTooLongException e)
+            } catch (UrlStringTooLongException e2)
             {
             }
           }
@@ -1284,36 +1280,6 @@ public class PopupMenu extends JPopupMenu
         changeCase(e);
       }
     });
-    pdbMenu.setText(MessageManager
-            .getString("label.associate_structure_with_sequence"));
-    pdbFromFile.setText(MessageManager.getString("label.from_file"));
-    pdbFromFile.addActionListener(new ActionListener()
-    {
-      @Override
-      public void actionPerformed(ActionEvent e)
-      {
-        pdbFromFile_actionPerformed();
-      }
-    });
-
-    enterPDB.setText(MessageManager.getString("label.enter_pdb_id"));
-    enterPDB.addActionListener(new ActionListener()
-    {
-      @Override
-      public void actionPerformed(ActionEvent e)
-      {
-        enterPDB_actionPerformed();
-      }
-    });
-    discoverPDB.setText(MessageManager.getString("label.discover_pdb_ids"));
-    discoverPDB.addActionListener(new ActionListener()
-    {
-      @Override
-      public void actionPerformed(ActionEvent e)
-      {
-        discoverPDB_actionPerformed();
-      }
-    });
     outputMenu.setText(MessageManager.getString("label.out_to_textbox")
             + "...");
     seqShowAnnotationsMenu.setText(MessageManager
@@ -1483,13 +1449,10 @@ public class PopupMenu extends JPopupMenu
     editMenu.add(upperCase);
     editMenu.add(lowerCase);
     editMenu.add(toggle);
-    pdbMenu.add(pdbFromFile);
     // JBPNote: These shouldn't be added here - should appear in a generic
     // 'apply web service to this sequence menu'
     // pdbMenu.add(RNAFold);
     // pdbMenu.add(ContraFold);
-    pdbMenu.add(enterPDB);
-    pdbMenu.add(discoverPDB);
     jMenu1.add(groupName);
     jMenu1.add(colourMenu);
     jMenu1.add(showBoxes);
@@ -2400,31 +2363,6 @@ public class PopupMenu extends JPopupMenu
             ap, true));
   }
 
-  public void pdbFromFile_actionPerformed()
-  {
-    jalview.io.JalviewFileChooser chooser = new jalview.io.JalviewFileChooser(
-            jalview.bin.Cache.getProperty("LAST_DIRECTORY"));
-    chooser.setFileView(new jalview.io.JalviewFileView());
-    chooser.setDialogTitle(MessageManager.formatMessage(
-            "label.select_pdb_file_for",
-            new Object[] { sequence.getDisplayId(false) }));
-    chooser.setToolTipText(MessageManager.formatMessage(
-            "label.load_pdb_file_associate_with_sequence",
-            new Object[] { sequence.getDisplayId(false) }));
-
-    int value = chooser.showOpenDialog(null);
-
-    if (value == jalview.io.JalviewFileChooser.APPROVE_OPTION)
-    {
-      String choice = chooser.getSelectedFile().getPath();
-      jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
-      new AssociatePdbFileWithSeq().associatePdbWithSeq(choice,
-              jalview.io.AppletFormatAdapter.FILE, sequence, true,
-              Desktop.instance);
-    }
-
-  }
-
   public void enterPDB_actionPerformed()
   {
     String id = JOptionPane.showInternalInputDialog(Desktop.desktop,
index c7e1332..6b2d3c4 100755 (executable)
@@ -30,6 +30,7 @@ import jalview.jbgui.GPreferences;
 import jalview.jbgui.GSequenceLink;
 import jalview.schemes.ColourSchemeProperty;
 import jalview.util.MessageManager;
+import jalview.util.Platform;
 import jalview.ws.sifts.SiftsSettings;
 
 import java.awt.BorderLayout;
@@ -40,7 +41,7 @@ import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.MouseEvent;
 import java.io.File;
-import java.util.Collection;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.StringTokenizer;
 import java.util.Vector;
@@ -96,7 +97,7 @@ public class Preferences extends GPreferences
    * Holds name and link separated with | character. Sequence ID must be
    * $SEQUENCE_ID$ or $SEQUENCE_ID=/.possible | chars ./=$
    */
-  public static Vector sequenceURLLinks;
+  public static Vector<String> sequenceURLLinks;
 
   /**
    * Holds name and link separated with | character. Sequence IDS and Sequences
@@ -106,14 +107,14 @@ public class Preferences extends GPreferences
    * (TODO: proper escape for using | to separate ids or sequences
    */
 
-  public static Vector groupURLLinks;
+  public static List<String> groupURLLinks;
   static
   {
     String string = Cache
             .getDefault(
                     "SEQUENCE_LINKS",
                     "EMBL-EBI Search|http://www.ebi.ac.uk/ebisearch/search.ebi?db=allebi&query=$SEQUENCE_ID$");
-    sequenceURLLinks = new Vector();
+    sequenceURLLinks = new Vector<String>();
 
     try
     {
@@ -152,10 +153,10 @@ public class Preferences extends GPreferences
      * .properties file as '|' separated strings
      */
 
-    groupURLLinks = new Vector();
+    groupURLLinks = new ArrayList<String>();
   }
 
-  Vector nameLinks, urlLinks;
+  Vector<String> nameLinks, urlLinks;
 
   JInternalFrame frame;
 
@@ -176,7 +177,8 @@ public class Preferences extends GPreferences
     wsPrefs = new WsPreferences();
     wsTab.add(wsPrefs, BorderLayout.CENTER);
     int width = 500, height = 450;
-    if (new jalview.util.Platform().isAMac())
+    new jalview.util.Platform();
+    if (Platform.isAMac())
     {
       width = 570;
       height = 480;
@@ -329,8 +331,8 @@ public class Preferences extends GPreferences
     /*
      * Set Connections tab defaults
      */
-    nameLinks = new Vector();
-    urlLinks = new Vector();
+    nameLinks = new Vector<String>();
+    urlLinks = new Vector<String>();
     for (int i = 0; i < sequenceURLLinks.size(); i++)
     {
       String link = sequenceURLLinks.elementAt(i).toString();
@@ -533,7 +535,7 @@ public class Preferences extends GPreferences
     if (nameLinks.size() > 0)
     {
       StringBuffer links = new StringBuffer();
-      sequenceURLLinks = new Vector();
+      sequenceURLLinks = new Vector<String>();
       for (int i = 0; i < nameLinks.size(); i++)
       {
         sequenceURLLinks.addElement(nameLinks.elementAt(i) + "|"
@@ -849,7 +851,7 @@ public class Preferences extends GPreferences
     super.showunconserved_actionPerformed(e);
   }
 
-  public static Collection getGroupURLLinks()
+  public static List<String> getGroupURLLinks()
   {
     return groupURLLinks;
   }
index b2c9a12..f2cbf33 100755 (executable)
@@ -35,11 +35,11 @@ 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;
 import javax.swing.JPopupMenu;
-import javax.swing.SwingUtilities;
 import javax.swing.ToolTipManager;
 
 /**
@@ -107,7 +107,7 @@ public class ScalePanel extends JPanel implements MouseMotionListener,
     min = res;
     max = res;
 
-    if (SwingUtilities.isRightMouseButton(evt))
+    if (evt.isPopupTrigger())
     {
       rightMouseButtonPressed(evt, res);
     }
@@ -460,13 +460,15 @@ 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));
 
       for (int sel : cs.getSelected())
       {
+        // TODO: JAL-2001 - provide a fast method to list visible selected in a
+        // given range
+
         if (av.hasHiddenColumns())
         {
           if (cs.isVisible(sel))
@@ -486,49 +488,15 @@ public class ScalePanel extends JPanel implements MouseMotionListener,
         }
       }
     }
-    // Draw the scale numbers
-    gg.setColor(Color.black);
 
-    int scalestartx = (startx / 10) * 10;
+    int widthx = 1 + endx - startx;
 
     FontMetrics fm = gg.getFontMetrics(av.getFont());
-    int y = avCharHeight - fm.getDescent();
-
-    if ((scalestartx % 10) == 0)
-    {
-      scalestartx += 5;
-    }
-
-    String string;
-    int maxX = 0;
-
-    for (int i = scalestartx; i < endx; i += 5)
-    {
-      if ((i % 10) == 0)
-      {
-        string = String.valueOf(av.getColumnSelection()
-                .adjustForHiddenColumns(i));
-        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()
@@ -537,23 +505,55 @@ public class ScalePanel extends JPanel implements MouseMotionListener,
         for (int i = 0; i < av.getColumnSelection().getHiddenColumns()
                 .size(); i++)
         {
-
           res = av.getColumnSelection().findHiddenRegionPosition(i)
                   - startx;
 
-          if (res < 0 || res > endx - scalestartx)
+          if (res < 0 || res > widthx)
           {
             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<Object[]> 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"),
@@ -562,4 +562,5 @@ public class ScalePanel extends JPanel implements MouseMotionListener,
     }
 
   }
+
 }
index 5706fe7..2f7cd76 100755 (executable)
@@ -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);
+      }
     }
   }
 
@@ -335,6 +337,7 @@ public class SeqCanvas extends JComponent
    */
 
   // Set this to false to force a full panel paint
+  @Override
   public void paintComponent(Graphics g)
   {
     updateViewport();
@@ -682,10 +685,17 @@ public class SeqCanvas extends JComponent
         g1.translate(-screenY * charWidth, 0);
         screenY += blockEnd - blockStart + 1;
         blockStart = hideEnd + 1;
+
+        if (screenY > (endRes - startRes))
+        {
+          // already rendered last block
+          return;
+        }
       }
 
       if (screenY <= (endRes - startRes))
       {
+        // remaining visible region to render
         blockEnd = blockStart + (endRes - startRes) - screenY;
         g1.translate(screenY * charWidth, 0);
         draw(g1, blockStart, blockEnd, startSeq, endSeq, offset);
index cce2ee0..3fbb809 100644 (file)
@@ -21,6 +21,7 @@
 package jalview.gui;
 
 import jalview.api.AlignViewportI;
+import jalview.bin.Cache;
 import jalview.commands.EditCommand;
 import jalview.commands.EditCommand.Action;
 import jalview.commands.EditCommand.Edit;
@@ -54,11 +55,12 @@ import java.awt.event.MouseListener;
 import java.awt.event.MouseMotionListener;
 import java.awt.event.MouseWheelEvent;
 import java.awt.event.MouseWheelListener;
+import java.util.ArrayList;
 import java.util.List;
-import java.util.Vector;
 
 import javax.swing.JOptionPane;
 import javax.swing.JPanel;
+import javax.swing.SwingUtilities;
 import javax.swing.ToolTipManager;
 
 /**
@@ -509,6 +511,7 @@ public class SeqPanel extends JPanel implements MouseListener,
 
   void insertNucAtCursor(boolean group, String nuc)
   {
+    // TODO not called - delete?
     groupEditing = group;
     startseq = seqCanvas.cursorY;
     lastres = seqCanvas.cursorX;
@@ -599,7 +602,7 @@ public class SeqPanel extends JPanel implements MouseListener,
   {
     lastMousePress = evt.getPoint();
 
-    if (javax.swing.SwingUtilities.isMiddleMouseButton(evt))
+    if (SwingUtilities.isMiddleMouseButton(evt))
     {
       mouseWheelPressed = true;
       return;
@@ -1171,8 +1174,7 @@ public class SeqPanel extends JPanel implements MouseListener,
           {
             for (int j = 0; j < startres - lastres; j++)
             {
-              if (!jalview.util.Comparison.isGap(groupSeqs[g]
-                      .getCharAt(fixedRight - j)))
+              if (!Comparison.isGap(groupSeqs[g].getCharAt(fixedRight - j)))
               {
                 blank = false;
                 break;
@@ -1234,7 +1236,7 @@ public class SeqPanel extends JPanel implements MouseListener,
               continue;
             }
 
-            if (!jalview.util.Comparison.isGap(groupSeqs[g].getCharAt(j)))
+            if (!Comparison.isGap(groupSeqs[g].getCharAt(j)))
             {
               // Not a gap, block edit not valid
               endEditing();
@@ -1366,7 +1368,7 @@ public class SeqPanel extends JPanel implements MouseListener,
 
       for (blankColumn = fixedColumn; blankColumn > j; blankColumn--)
       {
-        if (jalview.util.Comparison.isGap(seq[s].getCharAt(blankColumn)))
+        if (Comparison.isGap(seq[s].getCharAt(blankColumn)))
         {
           // Theres a space, so break and insert the gap
           break;
@@ -1597,24 +1599,24 @@ public class SeqPanel extends JPanel implements MouseListener,
 
     }
 
-    if (javax.swing.SwingUtilities.isRightMouseButton(evt))
+    if (evt.isPopupTrigger())
     {
       List<SequenceFeature> allFeatures = ap.getFeatureRenderer()
               .findFeaturesAtRes(sequence.getDatasetSequence(),
                       sequence.findPosition(res));
-      Vector links = new Vector();
+      List<String> links = new ArrayList<String>();
       for (SequenceFeature sf : allFeatures)
       {
         if (sf.links != null)
         {
-          for (int j = 0; j < sf.links.size(); j++)
+          for (String link : sf.links)
           {
-            links.addElement(sf.links.elementAt(j));
+            links.add(link);
           }
         }
       }
 
-      jalview.gui.PopupMenu pop = new jalview.gui.PopupMenu(ap, null, links);
+      PopupMenu pop = new PopupMenu(ap, null, links);
       pop.show(this, evt.getX(), evt.getY());
       return;
     }
@@ -1955,7 +1957,7 @@ public class SeqPanel extends JPanel implements MouseListener,
     {
       if (av.getAlignment() == null)
       {
-        jalview.bin.Cache.log.warn("alignviewport av SeqSetId="
+        Cache.log.warn("alignviewport av SeqSetId="
                 + av.getSequenceSetId() + " ViewId=" + av.getViewId()
                 + " 's alignment is NULL! returning immediately.");
         return;
index 191e8fe..e567d20 100755 (executable)
  */
 package jalview.gui;
 
+import jalview.api.FeatureSettingsModelI;
+import jalview.bin.Cache;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.DBRefEntry;
-import jalview.datamodel.DBRefSource;
 import jalview.datamodel.SequenceFeature;
 import jalview.datamodel.SequenceI;
-import jalview.io.FormatAdapter;
-import jalview.io.IdentifyFile;
+import jalview.fts.service.pdb.PDBFTSPanel;
+import jalview.fts.service.uniprot.UniprotFTSPanel;
+import jalview.io.gff.SequenceOntologyI;
 import jalview.util.DBRefUtils;
 import jalview.util.MessageManager;
 import jalview.ws.dbsources.das.api.DasSourceRegistryI;
@@ -54,8 +56,6 @@ import javax.swing.JTextArea;
 import javax.swing.SwingConstants;
 import javax.swing.tree.DefaultMutableTreeNode;
 
-import com.stevesoft.pat.Regex;
-
 public class SequenceFetcher extends JPanel implements Runnable
 {
   JLabel dbeg = new JLabel();
@@ -116,6 +116,11 @@ public class SequenceFetcher extends JPanel implements Runnable
 
   int debounceTrap = 0;
 
+  public JTextArea getTextArea()
+  {
+    return textArea;
+  }
+
   /**
    * Blocking method that initialises and returns the shared instance of the
    * SequenceFetcher client
@@ -160,9 +165,9 @@ public class SequenceFetcher extends JPanel implements Runnable
       }
     }
     if (sfetch == null
-            || dasRegistry != jalview.bin.Cache.getDasSourceRegistry()
-            || lastDasSourceRegistry != (jalview.bin.Cache
-                    .getDasSourceRegistry().getDasRegistryURL() + jalview.bin.Cache
+            || dasRegistry != Cache.getDasSourceRegistry()
+            || lastDasSourceRegistry != (Cache.getDasSourceRegistry()
+                    .getDasRegistryURL() + Cache
                     .getDasSourceRegistry().getLocalSourceString())
                     .hashCode())
     {
@@ -177,7 +182,7 @@ public class SequenceFetcher extends JPanel implements Runnable
                 .getString("status.init_sequence_database_fetchers"),
                 Thread.currentThread().hashCode());
       }
-      dasRegistry = jalview.bin.Cache.getDasSourceRegistry();
+      dasRegistry = Cache.getDasSourceRegistry();
       dasRegistry.refreshSources();
 
       jalview.ws.SequenceFetcher sf = new jalview.ws.SequenceFetcher();
@@ -369,15 +374,21 @@ public class SequenceFetcher extends JPanel implements Runnable
       {
         debounceTrap++;
         String currentSelection = database.getSelectedItem();
-        if (!currentSelection.equalsIgnoreCase("pdb"))
-        {
-          otherSourceAction();
-        }
+
         if (currentSelection.equalsIgnoreCase("pdb")
                 && (database.action == KeyEvent.VK_ENTER || ((debounceTrap % 2) == 0)))
         {
           pdbSourceAction();
         }
+        else if (currentSelection.equalsIgnoreCase("uniprot")
+                && (database.action == KeyEvent.VK_ENTER || ((debounceTrap % 2) == 0)))
+        {
+          uniprotSourceAction();
+        }
+        else
+        {
+          otherSourceAction();
+        }
         database.action = -1;
       }
     });
@@ -401,10 +412,16 @@ public class SequenceFetcher extends JPanel implements Runnable
   private void pdbSourceAction()
   {
     databaseButt.setText(database.getSelectedItem());
-    new PDBSearchPanel(this);
+    new PDBFTSPanel(this);
     frame.dispose();
   }
 
+  private void uniprotSourceAction()
+  {
+    databaseButt.setText(database.getSelectedItem());
+    new UniprotFTSPanel(this);
+    frame.dispose();
+  }
   private void otherSourceAction()
   {
     try
@@ -518,30 +535,34 @@ public class SequenceFetcher extends JPanel implements Runnable
       resetDialog();
       return;
     }
+    // TODO: Refactor to GUI independent code and write tests.
     // indicate if successive sources should be merged into one alignment.
     boolean addToLast = false;
-    ArrayList<String> aresultq = new ArrayList<String>(), presultTitle = new ArrayList<String>();
-    ArrayList<AlignmentI> presult = new ArrayList<AlignmentI>(), aresult = new ArrayList<AlignmentI>();
+    List<String> aresultq = new ArrayList<String>();
+    List<String> presultTitle = new ArrayList<String>();
+    List<AlignmentI> presult = new ArrayList<AlignmentI>();
+    List<AlignmentI> aresult = new ArrayList<AlignmentI>();
     Iterator<DbSourceProxy> proxies = database.getSelectedSources()
             .iterator();
     String[] qries;
-    List<String> nextfetch = Arrays.asList(qries = textArea.getText()
+    List<String> nextFetch = Arrays.asList(qries = textArea.getText()
             .split(";"));
     Iterator<String> en = Arrays.asList(new String[0]).iterator();
     int nqueries = qries.length;
-    while (proxies.hasNext() && (en.hasNext() || nextfetch.size() > 0))
+
+    FeatureSettingsModelI preferredFeatureColours = null;
+    while (proxies.hasNext() && (en.hasNext() || nextFetch.size() > 0))
     {
-      if (!en.hasNext() && nextfetch.size() > 0)
+      if (!en.hasNext() && nextFetch.size() > 0)
       {
-        en = nextfetch.iterator();
-        nqueries = nextfetch.size();
+        en = nextFetch.iterator();
+        nqueries = nextFetch.size();
         // save the remaining queries in the original array
-        qries = nextfetch.toArray(new String[nqueries]);
-        nextfetch = new ArrayList<String>();
+        qries = nextFetch.toArray(new String[nqueries]);
+        nextFetch = new ArrayList<String>();
       }
 
       DbSourceProxy proxy = proxies.next();
-      boolean isAliSource = false;
       try
       {
         // update status
@@ -552,136 +573,27 @@ public class SequenceFetcher extends JPanel implements Runnable
                             Integer.valueOf(nqueries).toString(),
                             proxy.getDbName() }), Thread.currentThread()
                         .hashCode());
-        isAliSource = proxy.isA(DBRefSource.ALIGNMENTDB);
-        if (proxy.getAccessionSeparator() == null)
+        if (proxy.getMaximumQueryCount() == 1)
         {
+          /*
+           * proxy only handles one accession id at a time
+           */
           while (en.hasNext())
           {
-            String item = en.next();
-            try
+            String acc = en.next();
+            if (!fetchSingleAccession(proxy, acc, aresultq, aresult))
             {
-              if (aresult != null)
-              {
-                try
-                {
-                  // give the server a chance to breathe
-                  Thread.sleep(5);
-                } catch (Exception e)
-                {
-                  //
-                }
-
-              }
-
-              AlignmentI indres = null;
-              try
-              {
-                indres = proxy.getSequenceRecords(item);
-              } catch (OutOfMemoryError oome)
-              {
-                new OOMWarning("fetching " + item + " from "
-                        + proxy.getDbName(), oome, this);
-              }
-              if (indres != null)
-              {
-                aresultq.add(item);
-                aresult.add(indres);
-              }
-              else
-              {
-                nextfetch.add(item);
-              }
-            } catch (Exception e)
-            {
-              jalview.bin.Cache.log.info("Error retrieving " + item
-                      + " from " + proxy.getDbName(), e);
-              nextfetch.add(item);
+              nextFetch.add(acc);
             }
           }
         }
         else
         {
-          StringBuffer multiacc = new StringBuffer();
-          ArrayList<String> tosend = new ArrayList<String>();
-          while (en.hasNext())
-          {
-            String nel = en.next();
-            tosend.add(nel);
-            multiacc.append(nel);
-            if (en.hasNext())
-            {
-              multiacc.append(proxy.getAccessionSeparator());
-            }
-          }
-          try
-          {
-            AlignmentI rslt;
-            SequenceI[] rs;
-            List<String> nores = new ArrayList<String>();
-            rslt = proxy.getSequenceRecords(multiacc.toString());
-            if (rslt == null || rslt.getHeight() == 0)
-            {
-              // no results - pass on all queries to next source
-              nextfetch.addAll(tosend);
-            }
-            else
-            {
-              aresultq.add(multiacc.toString());
-              aresult.add(rslt);
-
-              rs = rslt.getSequencesArray();
-              // search for each query in the dbrefs associated with each
-              // sequence
-              // returned.
-              // ones we do not find will be used to query next source (if any)
-              for (String q : tosend)
-              {
-                DBRefEntry dbr = new DBRefEntry(), found[] = null;
-                dbr.setSource(proxy.getDbSource());
-                dbr.setVersion(null);
-                if (proxy.getAccessionValidator() != null)
-                {
-                  Regex vgr = proxy.getAccessionValidator();
-                  vgr.search(q);
-                  if (vgr.numSubs() > 0)
-                  {
-                    dbr.setAccessionId(vgr.stringMatched(1));
-                  }
-                  else
-                  {
-                    dbr.setAccessionId(vgr.stringMatched());
-                  }
-                }
-                else
-                {
-                  dbr.setAccessionId(q);
-                }
-                boolean rfound = false;
-                for (int r = 0; r < rs.length; r++)
-                {
-                  if (rs[r] != null
-                          && (found = DBRefUtils.searchRefs(
-                                  rs[r].getDBRefs(), dbr)) != null
-                          && found.length > 0)
-                  {
-                    rfound = true;
-                    rs[r] = null;
-                    continue;
-                  }
-                }
-                if (!rfound)
-                {
-                  nextfetch.add(q);
-                }
-              }
-            }
-          } catch (OutOfMemoryError oome)
-          {
-            new OOMWarning("fetching " + multiacc + " from "
-                    + database.getSelectedItem(), oome, this);
-          }
+          /*
+           * proxy can fetch multiple accessions at one time
+           */
+          fetchMultipleAccessions(proxy, en, aresultq, aresult, nextFetch);
         }
-
       } catch (Exception e)
       {
         showErrorMessage("Error retrieving " + textArea.getText()
@@ -694,7 +606,6 @@ public class SequenceFetcher extends JPanel implements Runnable
         e.printStackTrace();
       } catch (OutOfMemoryError e)
       {
-        // resets dialog box - so we don't use OOMwarning here.
         showErrorMessage("Out of Memory when retrieving "
                 + textArea.getText()
                 + " from "
@@ -707,11 +618,19 @@ public class SequenceFetcher extends JPanel implements Runnable
                 + " from " + database.getSelectedItem());
         e.printStackTrace();
       }
+
       // Stack results ready for opening in alignment windows
       if (aresult != null && aresult.size() > 0)
       {
+        FeatureSettingsModelI proxyColourScheme = proxy
+                .getFeatureColourScheme();
+        if (proxyColourScheme != null)
+        {
+          preferredFeatureColours = proxyColourScheme;
+        }
+
         AlignmentI ar = null;
-        if (isAliSource)
+        if (proxy.isAlignmentSource())
         {
           addToLast = false;
           // new window for each result
@@ -741,7 +660,6 @@ public class SequenceFetcher extends JPanel implements Runnable
             {
               ar.append(aresult.remove(0));
             }
-            ;
           }
           addToLast = true;
           presult.add(ar);
@@ -760,18 +678,19 @@ public class SequenceFetcher extends JPanel implements Runnable
     // process results
     while (presult.size() > 0)
     {
-      parseResult(presult.remove(0), presultTitle.remove(0), null);
+      parseResult(presult.remove(0), presultTitle.remove(0), null,
+              preferredFeatureColours);
     }
     // only remove visual delay after we finished parsing.
     guiWindow.setProgressBar(null, Thread.currentThread().hashCode());
-    if (nextfetch.size() > 0)
+    if (nextFetch.size() > 0)
     {
       StringBuffer sb = new StringBuffer();
       sb.append("Didn't retrieve the following "
-              + (nextfetch.size() == 1 ? "query" : nextfetch.size()
+              + (nextFetch.size() == 1 ? "query" : nextFetch.size()
                       + " queries") + ": \n");
       int l = sb.length(), lr = 0;
-      for (String s : nextfetch)
+      for (String s : nextFetch)
       {
         if (l != sb.length())
         {
@@ -788,33 +707,159 @@ public class SequenceFetcher extends JPanel implements Runnable
     resetDialog();
   }
 
-  AlignmentI parseResult(String result, String title)
+  /**
+   * Tries to fetch one or more accession ids from the database proxy
+   * 
+   * @param proxy
+   * @param accessions
+   *          the queries to fetch
+   * @param aresultq
+   *          a successful queries list to add to
+   * @param aresult
+   *          a list of retrieved alignments to add to
+   * @param nextFetch
+   *          failed queries are added to this list
+   * @throws Exception
+   */
+  void fetchMultipleAccessions(DbSourceProxy proxy,
+          Iterator<String> accessions, List<String> aresultq,
+          List<AlignmentI> aresult, List<String> nextFetch)
+          throws Exception
   {
-    String format = new IdentifyFile().Identify(result, "Paste");
-    AlignmentI sequences = null;
-    if (FormatAdapter.isValidFormat(format))
+    StringBuilder multiacc = new StringBuilder();
+    List<String> tosend = new ArrayList<String>();
+    while (accessions.hasNext())
+    {
+      String nel = accessions.next();
+      tosend.add(nel);
+      multiacc.append(nel);
+      if (accessions.hasNext())
+      {
+        multiacc.append(proxy.getAccessionSeparator());
+      }
+    }
+
+    try
     {
-      sequences = null;
-      try
+      String query = multiacc.toString();
+      AlignmentI rslt = proxy.getSequenceRecords(query);
+      if (rslt == null || rslt.getHeight() == 0)
       {
-        sequences = new FormatAdapter().readFile(result.toString(),
-                "Paste", format);
-      } catch (Exception ex)
+        // no results - pass on all queries to next source
+        nextFetch.addAll(tosend);
+      }
+      else
       {
+        aresultq.add(query);
+        aresult.add(rslt);
+        if (tosend.size() > 1)
+        {
+          checkResultForQueries(rslt, tosend, nextFetch, proxy);
+        }
       }
+    } catch (OutOfMemoryError oome)
+    {
+      new OOMWarning("fetching " + multiacc + " from "
+              + database.getSelectedItem(), oome, this);
+    }
+  }
 
-      if (sequences != null)
+  /**
+   * Query for a single accession id via the database proxy
+   * 
+   * @param proxy
+   * @param accession
+   * @param aresultq
+   *          a list of successful queries to add to
+   * @param aresult
+   *          a list of retrieved alignments to add to
+   * @return true if the fetch was successful, else false
+   */
+  boolean fetchSingleAccession(DbSourceProxy proxy, String accession,
+          List<String> aresultq, List<AlignmentI> aresult)
+  {
+    boolean success = false;
+    try
+    {
+      if (aresult != null)
       {
-        return parseResult(sequences, title, format);
+        try
+        {
+          // give the server a chance to breathe
+          Thread.sleep(5);
+        } catch (Exception e)
+        {
+          //
+        }
       }
-    }
-    else
+
+      AlignmentI indres = null;
+      try
+      {
+        indres = proxy.getSequenceRecords(accession);
+      } catch (OutOfMemoryError oome)
+      {
+        new OOMWarning("fetching " + accession + " from "
+                + proxy.getDbName(), oome, this);
+      }
+      if (indres != null)
+      {
+        aresultq.add(accession);
+        aresult.add(indres);
+        success = true;
+      }
+    } catch (Exception e)
+    {
+      Cache.log.info(
+              "Error retrieving " + accession
+              + " from " + proxy.getDbName(), e);
+    } finally
     {
-      showErrorMessage("Error retrieving " + textArea.getText() + " from "
-              + database.getSelectedItem());
+      return success;
     }
+  }
 
-    return null;
+  /**
+   * Checks which of the queries were successfully retrieved by searching the
+   * DBRefs of the retrieved sequences for a match. Any not found are added to
+   * the 'nextFetch' list.
+   * 
+   * @param rslt
+   * @param queries
+   * @param nextFetch
+   * @param proxy
+   */
+  void checkResultForQueries(AlignmentI rslt, List<String> queries,
+          List<String> nextFetch, DbSourceProxy proxy)
+  {
+    SequenceI[] rs = rslt.getSequencesArray();
+
+    for (String q : queries)
+    {
+      DBRefEntry[] found = null;
+      DBRefEntry dbr = new DBRefEntry();
+      dbr.setSource(proxy.getDbSource());
+      dbr.setVersion(null);
+      String accId = proxy.getAccessionIdFromQuery(q);
+      dbr.setAccessionId(accId);
+      boolean rfound = false;
+      for (int r = 0; r < rs.length; r++)
+      {
+        if (rs[r] != null)
+        {
+          found = DBRefUtils.searchRefs(rs[r].getDBRefs(), accId);
+          if (found != null && found.length > 0)
+          {
+            rfound = true;
+            break;
+          }
+        }
+      }
+      if (!rfound)
+      {
+        nextFetch.add(q);
+      }
+    }
   }
 
   /**
@@ -828,7 +873,8 @@ public class SequenceFetcher extends JPanel implements Runnable
   }
 
   AlignmentI parseResult(AlignmentI al, String title,
-          String currentFileFormat)
+          String currentFileFormat,
+          FeatureSettingsModelI preferredFeatureColours)
   {
 
     if (al != null && al.getHeight() > 0)
@@ -866,6 +912,16 @@ public class SequenceFetcher extends JPanel implements Runnable
 
           }
         }
+
+        if (preferredFeatureColours != null)
+        {
+          af.getViewport().applyFeaturesStyle(preferredFeatureColours);
+        }
+        if (Cache.getDefault("HIDE_INTRONS", true))
+        {
+          af.hideFeatureColumns(SequenceOntologyI.EXON, false);
+        }
+
         Desktop.addInternalFrame(af, title, AlignFrame.DEFAULT_WIDTH,
                 AlignFrame.DEFAULT_HEIGHT);
 
@@ -874,7 +930,7 @@ public class SequenceFetcher extends JPanel implements Runnable
 
         try
         {
-          af.setMaximum(jalview.bin.Cache.getDefault("SHOW_FULLSCREEN",
+          af.setMaximum(Cache.getDefault("SHOW_FULLSCREEN",
                   false));
         } catch (Exception ex)
         {
index 3a6d266..617224f 100644 (file)
@@ -38,15 +38,12 @@ import java.awt.event.KeyEvent;
 import java.awt.event.KeyListener;
 import java.beans.PropertyVetoException;
 import java.util.Map.Entry;
-import java.util.Set;
 
 import javax.swing.AbstractAction;
 import javax.swing.InputMap;
 import javax.swing.JComponent;
 import javax.swing.JMenuItem;
 import javax.swing.KeyStroke;
-import javax.swing.UIDefaults;
-import javax.swing.UIManager;
 import javax.swing.event.InternalFrameAdapter;
 import javax.swing.event.InternalFrameEvent;
 
@@ -64,6 +61,14 @@ import javax.swing.event.InternalFrameEvent;
  */
 public class SplitFrame extends GSplitFrame implements SplitContainerI
 {
+  private static final int WINDOWS_INSETS_WIDTH = 28; // tbc
+
+  private static final int MAC_INSETS_WIDTH = 28;
+
+  private static final int WINDOWS_INSETS_HEIGHT = 50; // tbc
+
+  private static final int MAC_INSETS_HEIGHT = 50;
+  private static final int DESKTOP_DECORATORS_HEIGHT = 65;
   private static final long serialVersionUID = 1L;
 
   public SplitFrame(GAlignFrame top, GAlignFrame bottom)
@@ -89,15 +94,10 @@ public class SplitFrame extends GSplitFrame implements SplitContainerI
      * estimate width and height of SplitFrame; this.getInsets() doesn't seem to
      * give the full additional size (a few pixels short)
      */
-    UIDefaults defaults = UIManager.getDefaults();
-    Set<Object> keySet = defaults.keySet();
-    for (Object key : keySet)
-    {
-      System.out.println(key.toString() + " = "
-              + UIManager.get(key).toString());
-    }
-    int widthFudge = Platform.isAMac() ? 28 : 28; // Windows tbc
-    int heightFudge = Platform.isAMac() ? 50 : 50; // tbc
+    int widthFudge = Platform.isAMac() ? MAC_INSETS_WIDTH
+            : WINDOWS_INSETS_WIDTH;
+    int heightFudge = Platform.isAMac() ? MAC_INSETS_HEIGHT
+            : WINDOWS_INSETS_HEIGHT;
     int width = ((AlignFrame) getTopFrame()).getWidth() + widthFudge;
     int height = ((AlignFrame) getTopFrame()).getHeight()
             + ((AlignFrame) getBottomFrame()).getHeight() + DIVIDER_SIZE
@@ -128,7 +128,8 @@ public class SplitFrame extends GSplitFrame implements SplitContainerI
   {
     // allow about 65 pixels for Desktop decorators on Windows
 
-    int newHeight = Math.min(height, Desktop.instance.getHeight() - 65);
+    int newHeight = Math.min(height, Desktop.instance.getHeight()
+            - DESKTOP_DECORATORS_HEIGHT);
     if (newHeight != height)
     {
       int oldDividerLocation = getDividerLocation();
@@ -192,6 +193,40 @@ public class SplitFrame extends GSplitFrame implements SplitContainerI
   }
 
   /**
+   * Adjust the divider for a sensible split of the real estate (for example,
+   * when many transcripts are shown with a single protein). This should only be
+   * called after the split pane has been laid out (made visible) so it has a
+   * height.
+   */
+  protected void adjustDivider()
+  {
+    final AlignViewport topViewport = ((AlignFrame) getTopFrame()).viewport;
+    final AlignViewport bottomViewport = ((AlignFrame) getBottomFrame()).viewport;
+    final AlignmentI topAlignment = topViewport.getAlignment();
+    final AlignmentI bottomAlignment = bottomViewport.getAlignment();
+    boolean topAnnotations = topViewport.isShowAnnotation();
+    boolean bottomAnnotations = bottomViewport.isShowAnnotation();
+    int topCount = topAlignment.getHeight();
+    int bottomCount = bottomAlignment.getHeight();
+    int topCharHeight = topViewport.getViewStyle().getCharHeight();
+    int bottomCharHeight = bottomViewport.getViewStyle().getCharHeight();
+
+    /*
+     * estimate ratio of (topFrameContent / bottomFrameContent)
+     */
+    int insets = Platform.isAMac() ? MAC_INSETS_HEIGHT
+            : WINDOWS_INSETS_HEIGHT;
+    // allow 3 'rows' for scale, scrollbar, status bar
+    int topHeight = insets + (3 + topCount) * topCharHeight
+            + (topAnnotations ? topViewport.calcPanelHeight() : 0);
+    int bottomHeight = insets + (3 + bottomCount) * bottomCharHeight
+            + (bottomAnnotations ? bottomViewport.calcPanelHeight() : 0);
+    double ratio = ((double) topHeight) / (topHeight + bottomHeight);
+
+    setRelativeDividerLocation(ratio);
+  }
+
+  /**
    * Add a listener to tidy up when the frame is closed.
    */
   protected void addCloseFrameListener()
index cf58322..d924e73 100644 (file)
@@ -26,16 +26,16 @@ import jalview.datamodel.DBRefEntry;
 import jalview.datamodel.DBRefSource;
 import jalview.datamodel.PDBEntry;
 import jalview.datamodel.SequenceI;
+import jalview.fts.api.FTSData;
+import jalview.fts.api.FTSDataColumnI;
+import jalview.fts.api.FTSRestClientI;
+import jalview.fts.core.FTSRestRequest;
+import jalview.fts.core.FTSRestResponse;
+import jalview.fts.service.pdb.PDBFTSRestClient;
 import jalview.jbgui.GStructureChooser;
-import jalview.jbgui.PDBDocFieldPreferences;
 import jalview.structure.StructureSelectionManager;
 import jalview.util.MessageManager;
-import jalview.ws.dbsources.PDBRestClient;
-import jalview.ws.dbsources.PDBRestClient.PDBDocField;
 import jalview.ws.sifts.SiftsSettings;
-import jalview.ws.uimodel.PDBRestRequest;
-import jalview.ws.uimodel.PDBRestResponse;
-import jalview.ws.uimodel.PDBRestResponse.PDBResponseSummary;
 
 import java.awt.event.ItemEvent;
 import java.util.ArrayList;
@@ -43,6 +43,8 @@ import java.util.Collection;
 import java.util.HashSet;
 import java.util.LinkedHashSet;
 import java.util.List;
+import java.util.Objects;
+import java.util.Vector;
 
 import javax.swing.JCheckBox;
 import javax.swing.JComboBox;
@@ -68,11 +70,11 @@ public class StructureChooser extends GStructureChooser implements
 
   private IProgressIndicator progressIndicator;
 
-  private Collection<PDBResponseSummary> discoveredStructuresSet;
+  private Collection<FTSData> discoveredStructuresSet;
 
-  private PDBRestRequest lastPdbRequest;
+  private FTSRestRequest lastPdbRequest;
 
-  private PDBRestClient pdbRestCleint;
+  private FTSRestClientI pdbRestCleint;
 
   private String selectedPdbFileName;
 
@@ -144,22 +146,22 @@ public class StructureChooser extends GStructureChooser implements
   public void fetchStructuresMetaData()
   {
     long startTime = System.currentTimeMillis();
-    Collection<PDBDocField> wantedFields = PDBDocFieldPreferences
-            .getStructureSummaryFields();
+    pdbRestCleint = PDBFTSRestClient.getInstance();
+    Collection<FTSDataColumnI> wantedFields = pdbRestCleint
+            .getAllDefaulDisplayedDataColumns();
 
-    discoveredStructuresSet = new LinkedHashSet<PDBResponseSummary>();
+    discoveredStructuresSet = new LinkedHashSet<FTSData>();
     HashSet<String> errors = new HashSet<String>();
     for (SequenceI seq : selectedSequences)
     {
-      PDBRestRequest pdbRequest = new PDBRestRequest();
+      FTSRestRequest pdbRequest = new FTSRestRequest();
       pdbRequest.setAllowEmptySeq(false);
       pdbRequest.setResponseSize(500);
       pdbRequest.setFieldToSearchBy("(");
       pdbRequest.setWantedFields(wantedFields);
       pdbRequest.setSearchTerm(buildQuery(seq) + ")");
       pdbRequest.setAssociatedSequence(seq);
-      pdbRestCleint = new PDBRestClient();
-      PDBRestResponse resultList;
+      FTSRestResponse resultList;
       try
       {
         resultList = pdbRestCleint.executeRequest(pdbRequest);
@@ -183,7 +185,7 @@ public class StructureChooser extends GStructureChooser implements
     if (discoveredStructuresSet != null
             && !discoveredStructuresSet.isEmpty())
     {
-      tbl_summary.setModel(PDBRestResponse.getTableModel(lastPdbRequest,
+      tbl_summary.setModel(FTSRestResponse.getTableModel(lastPdbRequest,
               discoveredStructuresSet));
       structuresDiscovered = true;
       noOfStructuresFound = discoveredStructuresSet.size();
@@ -253,7 +255,7 @@ public class StructureChooser extends GStructureChooser implements
       {
         if (isValidSeqName(entry.getId()))
         {
-          queryBuilder.append(PDBRestClient.PDBDocField.PDB_ID.getCode())
+          queryBuilder.append("pdb_id")
                   .append(":")
 .append(entry.getId().toLowerCase())
                   .append(" OR ");
@@ -272,12 +274,11 @@ public class StructureChooser extends GStructureChooser implements
           if (dbRef.getSource().equalsIgnoreCase(DBRefSource.UNIPROT))
           {
             queryBuilder
-                    .append(PDBRestClient.PDBDocField.UNIPROT_ACCESSION
-                            .getCode()).append(":")
+.append("uniprot_accession").append(":")
                     .append(getDBRefId(dbRef))
                     .append(" OR ");
             queryBuilder
-                    .append(PDBRestClient.PDBDocField.UNIPROT_ID.getCode())
+.append("uniprot_id")
                     .append(":")
                     .append(getDBRefId(dbRef)).append(" OR ");
             isUniProtRefsFound = true;
@@ -285,7 +286,7 @@ public class StructureChooser extends GStructureChooser implements
           else if (dbRef.getSource().equalsIgnoreCase(DBRefSource.PDB))
           {
 
-            queryBuilder.append(PDBRestClient.PDBDocField.PDB_ID.getCode())
+            queryBuilder.append("pdb_id")
                     .append(":").append(getDBRefId(dbRef).toLowerCase())
                     .append(" OR ");
             isPDBRefsFound = true;
@@ -301,6 +302,7 @@ public class StructureChooser extends GStructureChooser implements
     if (!isPDBRefsFound && !isUniProtRefsFound)
     {
       String seqName = seq.getName();
+      seqName = sanitizeSeqName(seqName);
       String[] names = seqName.toLowerCase().split("\\|");
       for (String name : names)
       {
@@ -328,6 +330,21 @@ public class StructureChooser extends GStructureChooser implements
   }
 
   /**
+   * Remove the following special characters from input string +, -, &, |, !, (,
+   * ), {, }, [, ], ^, ", ~, *, ?, :, \
+   * 
+   * @param seqName
+   * @return
+   */
+  private static String sanitizeSeqName(String seqName)
+  {
+    Objects.requireNonNull(seqName);
+    return seqName.replaceAll("\\[\\d*\\]", "")
+            .replaceAll("[^\\dA-Za-z|]", "").replaceAll("\\s+", "+");
+  }
+
+
+  /**
    * Ensures sequence ref names are not less than 3 characters and does not
    * contain a database name
    * 
@@ -377,24 +394,41 @@ public class StructureChooser extends GStructureChooser implements
       public void run()
       {
         long startTime = System.currentTimeMillis();
+        pdbRestCleint = PDBFTSRestClient.getInstance();
         lbl_loading.setVisible(true);
-        Collection<PDBDocField> wantedFields = PDBDocFieldPreferences
-                .getStructureSummaryFields();
-        Collection<PDBResponseSummary> filteredResponse = new HashSet<PDBResponseSummary>();
+        Collection<FTSDataColumnI> wantedFields = pdbRestCleint
+                .getAllDefaulDisplayedDataColumns();
+        Collection<FTSData> filteredResponse = new HashSet<FTSData>();
         HashSet<String> errors = new HashSet<String>();
+
         for (SequenceI seq : selectedSequences)
         {
-          PDBRestRequest pdbRequest = new PDBRestRequest();
-          pdbRequest.setAllowEmptySeq(false);
-          pdbRequest.setResponseSize(1);
-          pdbRequest.setFieldToSearchBy("(");
-          pdbRequest.setFieldToSortBy(fieldToFilterBy,
-                  !chk_invertFilter.isSelected());
-          pdbRequest.setSearchTerm(buildQuery(seq) + ")");
-          pdbRequest.setWantedFields(wantedFields);
-          pdbRequest.setAssociatedSequence(seq);
-          pdbRestCleint = new PDBRestClient();
-          PDBRestResponse resultList;
+          FTSRestRequest pdbRequest = new FTSRestRequest();
+          if (fieldToFilterBy.equalsIgnoreCase("uniprot_coverage"))
+          {
+            System.out.println(">>>>>> Filtering with uniprot coverate");
+            pdbRequest.setAllowEmptySeq(false);
+            pdbRequest.setResponseSize(1);
+            pdbRequest.setFieldToSearchBy("(");
+            pdbRequest.setSearchTerm(buildQuery(seq) + ")");
+            pdbRequest.setWantedFields(wantedFields);
+            pdbRequest.setAssociatedSequence(seq);
+            pdbRequest.setFacet(true);
+            pdbRequest.setFacetPivot(fieldToFilterBy + ",entry_entity");
+            pdbRequest.setFacetPivotMinCount(1);
+          }
+          else
+          {
+            pdbRequest.setAllowEmptySeq(false);
+            pdbRequest.setResponseSize(1);
+            pdbRequest.setFieldToSearchBy("(");
+            pdbRequest.setFieldToSortBy(fieldToFilterBy,
+                    !chk_invertFilter.isSelected());
+            pdbRequest.setSearchTerm(buildQuery(seq) + ")");
+            pdbRequest.setWantedFields(wantedFields);
+            pdbRequest.setAssociatedSequence(seq);
+          }
+          FTSRestResponse resultList;
           try
           {
             resultList = pdbRestCleint.executeRequest(pdbRequest);
@@ -417,12 +451,16 @@ public class StructureChooser extends GStructureChooser implements
         if (!filteredResponse.isEmpty())
         {
           final int filterResponseCount = filteredResponse.size();
-          Collection<PDBResponseSummary> reorderedStructuresSet = new LinkedHashSet<PDBResponseSummary>();
+          Collection<FTSData> reorderedStructuresSet = new LinkedHashSet<FTSData>();
           reorderedStructuresSet.addAll(filteredResponse);
           reorderedStructuresSet.addAll(discoveredStructuresSet);
-          tbl_summary.setModel(PDBRestResponse.getTableModel(
+          tbl_summary.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);
           // Update table selection model here
           tbl_summary.addRowSelectionInterval(0, filterResponseCount - 1);
           mainFrame.setTitle(MessageManager.formatMessage(
@@ -490,17 +528,17 @@ public class StructureChooser extends GStructureChooser implements
     if (isStructuresDiscovered())
     {
       cmb_filterOption.addItem(new FilterOption("Best Quality",
-              PDBDocField.OVERALL_QUALITY.getCode(), VIEWS_FILTER));
-      cmb_filterOption.addItem(new FilterOption("Best UniProt Coverage",
-              PDBDocField.UNIPROT_COVERAGE.getCode(), VIEWS_FILTER));
-      cmb_filterOption.addItem(new FilterOption("Highest Resolution",
-              PDBDocField.RESOLUTION.getCode(), VIEWS_FILTER));
-      cmb_filterOption.addItem(new FilterOption("Highest Protein Chain",
-              PDBDocField.PROTEIN_CHAIN_COUNT.getCode(), VIEWS_FILTER));
-      cmb_filterOption.addItem(new FilterOption("Highest Bound Molecules",
-              PDBDocField.BOUND_MOLECULE_COUNT.getCode(), VIEWS_FILTER));
-      cmb_filterOption.addItem(new FilterOption("Highest Polymer Residues",
-              PDBDocField.POLYMER_RESIDUE_COUNT.getCode(), VIEWS_FILTER));
+              "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",
+              "number_of_protein_chains", VIEWS_FILTER));
+      cmb_filterOption.addItem(new FilterOption("Most Bound Molecules",
+              "number_of_bound_molecules", VIEWS_FILTER));
+      cmb_filterOption.addItem(new FilterOption("Most Polymer Residues",
+              "number_of_polymer_residues", VIEWS_FILTER));
     }
     cmb_filterOption.addItem(new FilterOption("Enter PDB Id", "-",
             VIEWS_ENTER_ID));
@@ -691,8 +729,8 @@ public class StructureChooser extends GStructureChooser implements
     String currentView = selectedFilterOpt.getView();
     if (currentView == VIEWS_FILTER)
     {
-      int pdbIdColIndex = tbl_summary.getColumn(
-              PDBRestClient.PDBDocField.PDB_ID.getName()).getModelIndex();
+          int pdbIdColIndex = tbl_summary.getColumn("PDB Id")
+                  .getModelIndex();
       int refSeqColIndex = tbl_summary.getColumn("Ref Sequence")
               .getModelIndex();
       int[] selectedRows = tbl_summary.getSelectedRows();
@@ -706,7 +744,12 @@ public class StructureChooser extends GStructureChooser implements
         SequenceI selectedSeq = (SequenceI) tbl_summary.getValueAt(row,
                 refSeqColIndex);
         selectedSeqsToView.add(selectedSeq);
-        PDBEntry pdbEntry = selectedSeq.getPDBEntry(pdbIdStr);
+            PDBEntry pdbEntry = selectedSeq.getPDBEntry(pdbIdStr);
+            if (pdbEntry == null)
+            {
+              pdbEntry = getFindEntry(pdbIdStr,
+                      selectedSeq.getAllPDBEntries());
+            }
         if (pdbEntry == null)
         {
           pdbEntry = new PDBEntry();
@@ -725,8 +768,8 @@ public class StructureChooser extends GStructureChooser implements
       int[] selectedRows = tbl_local_pdb.getSelectedRows();
       PDBEntry[] pdbEntriesToView = new PDBEntry[selectedRows.length];
       int count = 0;
-      int pdbIdColIndex = tbl_local_pdb.getColumn(
-              PDBRestClient.PDBDocField.PDB_ID.getName()).getModelIndex();
+          int pdbIdColIndex = tbl_local_pdb.getColumn("PDB Id")
+                  .getModelIndex();
       int refSeqColIndex = tbl_local_pdb.getColumn("Ref Sequence")
               .getModelIndex();
       ArrayList<SequenceI> selectedSeqsToView = new ArrayList<SequenceI>();
@@ -787,6 +830,21 @@ public class StructureChooser extends GStructureChooser implements
     }).start();
   }
 
+  private PDBEntry getFindEntry(String id, Vector<PDBEntry> pdbEntries)
+  {
+    Objects.requireNonNull(id);
+    Objects.requireNonNull(pdbEntries);
+    PDBEntry foundEntry = null;
+    for (PDBEntry entry : pdbEntries)
+    {
+      if (entry.getId().equalsIgnoreCase(id))
+      {
+        return entry;
+      }
+    }
+    return foundEntry;
+  }
+
   private void launchStructureViewer(StructureSelectionManager ssm,
           final PDBEntry[] pdbEntriesToView,
           final AlignmentPanel alignPanel, SequenceI[] sequences)
@@ -868,7 +926,7 @@ public class StructureChooser extends GStructureChooser implements
     this.structuresDiscovered = structuresDiscovered;
   }
 
-  public Collection<PDBResponseSummary> getDiscoveredStructuresSet()
+  public Collection<FTSData> getDiscoveredStructuresSet()
   {
     return discoveredStructuresSet;
   }
@@ -885,17 +943,18 @@ public class StructureChooser extends GStructureChooser implements
         isValidPBDEntry = false;
         if (txt_search.getText().length() > 0)
         {
-          List<PDBDocField> wantedFields = new ArrayList<PDBDocField>();
-          wantedFields.add(PDBDocField.PDB_ID);
-          PDBRestRequest pdbRequest = new PDBRestRequest();
+          List<FTSDataColumnI> wantedFields = new ArrayList<FTSDataColumnI>();
+          FTSRestRequest pdbRequest = new FTSRestRequest();
           pdbRequest.setAllowEmptySeq(false);
           pdbRequest.setResponseSize(1);
           pdbRequest.setFieldToSearchBy("(pdb_id:");
           pdbRequest.setWantedFields(wantedFields);
-          pdbRequest.setSearchTerm(txt_search.getText() + ")");
+          pdbRequest
+                  .setSearchTerm(txt_search.getText().toLowerCase() + ")");
           pdbRequest.setAssociatedSequence(selectedSequence);
-          pdbRestCleint = new PDBRestClient();
-          PDBRestResponse resultList;
+          pdbRestCleint = PDBFTSRestClient.getInstance();
+          wantedFields.add(pdbRestCleint.getPrimaryKeyColumn());
+          FTSRestResponse resultList;
           try
           {
             resultList = pdbRestCleint.executeRequest(pdbRequest);
index 90c74be..f21c5e7 100755 (executable)
@@ -59,7 +59,6 @@ import java.util.Vector;
 import javax.swing.JColorChooser;
 import javax.swing.JPanel;
 import javax.swing.JScrollPane;
-import javax.swing.SwingUtilities;
 import javax.swing.ToolTipManager;
 
 /**
@@ -791,7 +790,7 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
   {
     if (highlightNode != null)
     {
-      if (SwingUtilities.isRightMouseButton(evt))
+      if (evt.isPopupTrigger())
       {
         Color col = JColorChooser.showDialog(this,
                 MessageManager.getString("label.select_subtree_colour"),
index 7e0cabd..984eff6 100755 (executable)
@@ -47,7 +47,8 @@ public abstract class AlignFile extends FileParse
   int maxLength = 0;
 
   /**
-   * Sequences to be added to form a new alignment.
+   * Sequences to be added to form a new alignment. TODO: remove vector in this
+   * class
    */
   protected Vector<SequenceI> seqs;
 
@@ -351,7 +352,15 @@ public abstract class AlignFile extends FileParse
     if (space > -1)
     {
       seq = new Sequence(id.substring(0, space), "");
-      seq.setDescription(id.substring(space + 1));
+      String desc = id.substring(space + 1);
+      seq.setDescription(desc);
+
+      /*
+       * it is tempting to parse Ensembl style gene description e.g.
+       * chromosome:GRCh38:7:140696688:140721955:1 and set the
+       * start position of the sequence, but this causes much confusion
+       * for reverse strand feature locations
+       */
     }
     else
     {
index 239c531..1a639f1 100755 (executable)
@@ -26,6 +26,7 @@ import jalview.datamodel.Alignment;
 import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.AlignmentView;
+import jalview.structure.StructureViewSettings;
 import jalview.util.MessageManager;
 
 import java.io.File;
@@ -86,7 +87,7 @@ public class AppletFormatAdapter
   public static final String[] READABLE_FORMATS = new String[] { "BLC",
       "CLUSTAL", "FASTA", "MSF", "PileUp", "PIR", "PFAM", "STH", "PDB",
       "JnetFile", "RNAML", PhylipFile.FILE_DESC, JSONFile.FILE_DESC,
-      IdentifyFile.GFF3File, "HTML" };
+      IdentifyFile.FeaturesFile, "HTML", "mmCIF" };
 
   /**
    * List of readable format file extensions by application in order
@@ -95,7 +96,7 @@ public class AppletFormatAdapter
   public static final String[] READABLE_EXTENSIONS = new String[] {
       "fa, fasta, mfa, fastq", "aln", "pfam", "msf", "pir", "blc", "amsa",
       "sto,stk", "xml,rnaml", PhylipFile.FILE_EXT, JSONFile.FILE_EXT,
-      ".gff2,gff3", "jar,jvp", HtmlFile.FILE_EXT };
+      ".gff2,gff3", "jar,jvp", HtmlFile.FILE_EXT, "cif" };
 
   /**
    * List of readable formats by application in order corresponding to
@@ -103,8 +104,8 @@ public class AppletFormatAdapter
    */
   public static final String[] READABLE_FNAMES = new String[] { "Fasta",
       "Clustal", "PFAM", "MSF", "PIR", "BLC", "AMSA", "Stockholm", "RNAML",
-      PhylipFile.FILE_DESC, JSONFile.FILE_DESC, IdentifyFile.GFF3File,
-      "Jalview", HtmlFile.FILE_DESC };
+      PhylipFile.FILE_DESC, JSONFile.FILE_DESC, IdentifyFile.FeaturesFile,
+      "Jalview", HtmlFile.FILE_DESC, "mmCIF" };
 
   /**
    * List of valid format strings for use by callers of the formatSequences
@@ -277,10 +278,31 @@ public class AppletFormatAdapter
       }
       else if (format.equals("PDB"))
       {
-        alignFile = new MCview.PDBfile(annotFromStructure,
+        // TODO obtain config value from preference settings.
+        // Set value to 'true' to test PDB processing with Jmol: JAL-1213
+        boolean isParseWithJMOL = false;
+        if (isParseWithJMOL)
+        {
+          StructureViewSettings.addSettings(annotFromStructure,
+                  localSecondaryStruct, serviceSecondaryStruct);
+          alignFile = new jalview.ext.jmol.JmolParser(annotFromStructure,
+                  localSecondaryStruct, serviceSecondaryStruct, inFile,
+                  type);
+        }
+        else
+        {
+          StructureViewSettings.setShowSeqFeatures(true);
+          alignFile = new MCview.PDBfile(annotFromStructure,
+                  localSecondaryStruct, serviceSecondaryStruct, inFile,
+                  type);
+        }
+      }
+      else if (format.equals("mmCIF"))
+      {
+        StructureViewSettings.addSettings(annotFromStructure,
+                localSecondaryStruct, serviceSecondaryStruct);
+        alignFile = new jalview.ext.jmol.JmolParser(annotFromStructure,
                 localSecondaryStruct, serviceSecondaryStruct, inFile, type);
-        // Uncomment to test Jmol data based PDB processing: JAL-1213
-        // afile = new jalview.ext.jmol.PDBFileWithJmol(inFile, type);
       }
       else if (format.equals("STH"))
       {
@@ -306,9 +328,9 @@ public class AppletFormatAdapter
       {
         alignFile = new RnamlFile(inFile, type);
       }
-      else if (format.equals(IdentifyFile.GFF3File))
+      else if (format.equals(IdentifyFile.FeaturesFile))
       {
-        alignFile = new Gff3File(inFile, type);
+        alignFile = new FeaturesFile(true, inFile, type);
       }
       return buildAlignmentFrom(alignFile);
     } catch (Exception e)
@@ -407,7 +429,27 @@ public class AppletFormatAdapter
       }
       else if (format.equals("PDB"))
       {
-        alignFile = new MCview.PDBfile(annotFromStructure,
+        // TODO obtain config value from preference settings
+        boolean isParseWithJMOL = false;
+        if (isParseWithJMOL)
+        {
+          StructureViewSettings.addSettings(annotFromStructure,
+                  localSecondaryStruct, serviceSecondaryStruct);
+          alignFile = new jalview.ext.jmol.JmolParser(annotFromStructure,
+                  localSecondaryStruct, serviceSecondaryStruct, source);
+        }
+        else
+        {
+          StructureViewSettings.setShowSeqFeatures(true);
+          alignFile = new MCview.PDBfile(annotFromStructure,
+                  localSecondaryStruct, serviceSecondaryStruct, source);
+        }
+      }
+      else if (format.equals("mmCIF"))
+      {
+        StructureViewSettings.addSettings(annotFromStructure,
+                localSecondaryStruct, serviceSecondaryStruct);
+        alignFile = new jalview.ext.jmol.JmolParser(annotFromStructure,
                 localSecondaryStruct, serviceSecondaryStruct, source);
       }
       else if (format.equals("STH"))
@@ -426,9 +468,9 @@ public class AppletFormatAdapter
       {
         alignFile = new PhylipFile(source);
       }
-      else if (format.equals(IdentifyFile.GFF3File))
+      else if (format.equals(IdentifyFile.FeaturesFile))
       {
-        alignFile = new Gff3File(inFile, type);
+        alignFile = new FeaturesFile(inFile, type);
       }
       else if (format.equals(JSONFile.FILE_DESC))
       {
@@ -669,7 +711,7 @@ public class AppletFormatAdapter
           long memf = -r.totalMemory() + r.freeMemory();
           long t1 = -System.currentTimeMillis();
           AlignmentI al = afa.readFile(args[i], FILE,
-                  new IdentifyFile().Identify(args[i], FILE));
+                  new IdentifyFile().identify(args[i], FILE));
           t1 += System.currentTimeMillis();
           System.gc();
           memf += r.totalMemory() - r.freeMemory();
@@ -835,7 +877,7 @@ public class AppletFormatAdapter
     {
       try
       {
-        String idformat = new jalview.io.IdentifyFile().Identify(file,
+        String idformat = new jalview.io.IdentifyFile().identify(file,
                 protocol);
         if (idformat == null)
         {
index d1c33ce..aa38540 100755 (executable)
  */
 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;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.SequenceDummy;
 import jalview.datamodel.SequenceFeature;
 import jalview.datamodel.SequenceI;
+import jalview.io.gff.GffHelperBase;
+import jalview.io.gff.GffHelperFactory;
+import jalview.io.gff.GffHelperI;
 import jalview.schemes.FeatureColour;
 import jalview.schemes.UserColourScheme;
 import jalview.util.MapList;
+import jalview.util.ParseHtmlBodyAndLinks;
+import jalview.util.StringUtils;
 
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
-import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.util.StringTokenizer;
-import java.util.Vector;
+import java.util.Map.Entry;
 
 /**
- * Parse and create Jalview Features files Detects GFF format features files and
- * parses. Does not implement standard print() - call specific printFeatures or
- * printGFF. Uses AlignmentI.findSequence(String id) to find the sequence object
- * for the features annotation - this normally works on an exact match.
+ * Parses and writes features files, which may be in Jalview, GFF2 or GFF3
+ * format. These are tab-delimited formats but with differences in the use of
+ * columns.
+ * 
+ * A Jalview feature file may define feature colours and then declare that the
+ * remainder of the file is in GFF format with the line 'GFF'.
+ * 
+ * GFF3 files may include alignment mappings for features, which Jalview will
+ * attempt to model, and may include sequence data following a ##FASTA line.
+ * 
  * 
  * @author AMW
- * @version $Revision$
+ * @author jbprocter
+ * @author gmcarstairs
  */
-public class FeaturesFile extends AlignFile
+public class FeaturesFile extends AlignFile implements FeaturesSourceI
 {
-  /**
-   * work around for GFF interpretation bug where source string becomes
-   * description rather than a group
-   */
-  private boolean doGffSource = true;
+  private static final String ID_NOT_SPECIFIED = "ID_NOT_SPECIFIED";
+
+  private static final String NOTE = "Note";
+
+  protected static final String TAB = "\t";
+
+  protected static final String GFF_VERSION = "##gff-version";
 
-  private int gffversion;
+  private AlignmentI lastmatchedAl = null;
+
+  private SequenceIdMatcher matcher = null;
+
+  protected AlignmentI dataset;
+
+  protected int gffVersion;
 
   /**
    * Creates a new FeaturesFile object.
@@ -69,13 +91,15 @@ public class FeaturesFile extends AlignFile
   }
 
   /**
+   * Constructor which does not parse the file immediately
+   * 
    * @param inFile
    * @param type
    * @throws IOException
    */
   public FeaturesFile(String inFile, String type) throws IOException
   {
-    super(inFile, type);
+    super(false, inFile, type);
   }
 
   /**
@@ -88,17 +112,8 @@ public class FeaturesFile extends AlignFile
   }
 
   /**
-   * @param parseImmediately
-   * @param source
-   * @throws IOException
-   */
-  public FeaturesFile(boolean parseImmediately, FileParse source)
-          throws IOException
-  {
-    super(parseImmediately, source);
-  }
-
-  /**
+   * Constructor that optionally parses the file immediately
+   * 
    * @param parseImmediately
    * @param inFile
    * @param type
@@ -122,384 +137,129 @@ public class FeaturesFile extends AlignFile
    *          - process html strings into plain text
    * @return true if features were added
    */
-  public boolean parse(AlignmentI align, Map colours, boolean removeHTML)
-  {
-    return parse(align, colours, null, removeHTML, false);
-  }
-
-  /**
-   * Parse GFF or sequence features file optionally using case-independent
-   * matching, discarding URLs
-   * 
-   * @param align
-   *          - alignment/dataset containing sequences that are to be annotated
-   * @param colours
-   *          - hashtable to store feature colour definitions
-   * @param removeHTML
-   *          - process html strings into plain text
-   * @param relaxedIdmatching
-   *          - when true, ID matches to compound sequence IDs are allowed
-   * @return true if features were added
-   */
-  public boolean parse(AlignmentI align, Map colours, boolean removeHTML,
-          boolean relaxedIdMatching)
+  public boolean parse(AlignmentI align,
+          Map<String, FeatureColourI> colours,
+          boolean removeHTML)
   {
-    return parse(align, colours, null, removeHTML, relaxedIdMatching);
+    return parse(align, colours, removeHTML, false);
   }
 
   /**
-   * Parse GFF or sequence features file optionally using case-independent
-   * matching
-   * 
-   * @param align
-   *          - alignment/dataset containing sequences that are to be annotated
-   * @param colours
-   *          - hashtable to store feature colour definitions
-   * @param featureLink
-   *          - hashtable to store associated URLs
-   * @param removeHTML
-   *          - process html strings into plain text
-   * @return true if features were added
+   * Extends the default addProperties by also adding peptide-to-cDNA mappings
+   * (if any) derived while parsing a GFF file
    */
-  public boolean parse(AlignmentI align, Map colours, Map featureLink,
-          boolean removeHTML)
-  {
-    return parse(align, colours, featureLink, removeHTML, false);
-  }
-
-  @Override
-  public void addAnnotations(AlignmentI al)
-  {
-    // TODO Auto-generated method stub
-    super.addAnnotations(al);
-  }
-
   @Override
   public void addProperties(AlignmentI al)
   {
-    // TODO Auto-generated method stub
     super.addProperties(al);
-  }
-
-  @Override
-  public void addSeqGroups(AlignmentI al)
-  {
-    // TODO Auto-generated method stub
-    super.addSeqGroups(al);
+    if (dataset != null && dataset.getCodonFrames() != null)
+    {
+      AlignmentI ds = (al.getDataset() == null) ? al : al.getDataset();
+      for (AlignedCodonFrame codons : dataset.getCodonFrames())
+      {
+        ds.addCodonFrame(codons);
+      }
+    }
   }
 
   /**
-   * Parse GFF or sequence features file
+   * Parse GFF or Jalview format sequence features file
    * 
    * @param align
    *          - alignment/dataset containing sequences that are to be annotated
    * @param colours
    *          - hashtable to store feature colour definitions
-   * @param featureLink
-   *          - hashtable to store associated URLs
    * @param removeHTML
    *          - process html strings into plain text
    * @param relaxedIdmatching
    *          - when true, ID matches to compound sequence IDs are allowed
    * @return true if features were added
    */
-  public boolean parse(AlignmentI align, Map colours, Map featureLink,
+  public boolean parse(AlignmentI align,
+          Map<String, FeatureColourI> colours,
           boolean removeHTML, boolean relaxedIdmatching)
   {
+    Map<String, String> gffProps = new HashMap<String, String>();
+    /*
+     * keep track of any sequences we try to create from the data
+     */
+    List<SequenceI> newseqs = new ArrayList<SequenceI>();
 
     String line = null;
     try
     {
-      SequenceI seq = null;
-      /**
-       * keep track of any sequences we try to create from the data if it is a
-       * GFF3 file
-       */
-      ArrayList<SequenceI> newseqs = new ArrayList<SequenceI>();
-      String theType, desc, token = null;
-
-      StringTokenizer st;
-      SequenceFeature sf;
-      String featureGroup = null, groupLink = null;
-      Map<String, String> typeLink = new Hashtable<String, String>();
-      /**
-       * when true, assume GFF style features rather than Jalview style.
-       */
-      boolean GFFFile = true;
-      Map<String, String> gffProps = new HashMap<String, String>();
+      String[] gffColumns;
+      String featureGroup = null;
+
       while ((line = nextLine()) != null)
       {
-        int featureStart, featureEnd;
         // skip comments/process pragmas
-        if (line.startsWith("#"))
+        if (line.length() == 0 || line.startsWith("#"))
         {
-          if (line.startsWith("##"))
+          if (line.toLowerCase().startsWith("##"))
           {
-            // possibly GFF2/3 version and metadata header
             processGffPragma(line, gffProps, align, newseqs);
-            line = "";
           }
           continue;
         }
 
-        st = new StringTokenizer(line, "\t");
-        if (st.countTokens() == 1)
+        gffColumns = line.split("\\t"); // tab as regex
+        if (gffColumns.length == 1)
         {
           if (line.trim().equalsIgnoreCase("GFF"))
           {
-            // Start parsing file as if it might be GFF again.
-            GFFFile = true;
+            /*
+             * Jalview features file with appended GFF
+             * assume GFF2 (though it may declare ##gff-version 3)
+             */
+            gffVersion = 2;
             continue;
           }
         }
-        if (st.countTokens() > 1 && st.countTokens() < 4)
+
+        if (gffColumns.length > 1 && gffColumns.length < 4)
         {
-          GFFFile = false;
-          theType = st.nextToken();
-          if (theType.equalsIgnoreCase("startgroup"))
+          /*
+           * if 2 or 3 tokens, we anticipate either 'startgroup', 'endgroup' or
+           * a feature type colour specification
+           */
+          String ft = gffColumns[0];
+          if (ft.equalsIgnoreCase("startgroup"))
           {
-            featureGroup = st.nextToken();
-            if (st.hasMoreElements())
-            {
-              groupLink = st.nextToken();
-              featureLink.put(featureGroup, groupLink);
-            }
+            featureGroup = gffColumns[1];
           }
-          else if (theType.equalsIgnoreCase("endgroup"))
+          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
-            st.nextToken();
+            // but at present there's no way of showing more than 1 group
             featureGroup = null;
-            groupLink = null;
           }
           else
           {
-            String colscheme = st.nextToken();
-            try
-            {
-              FeatureColourI colour = FeatureColour
-                      .parseJalviewFeatureColour(colscheme);
-              if (colour != null)
-              {
-                colours.put(theType, colour);
-              }
-              if (st.hasMoreElements())
-              {
-                String link = st.nextToken();
-                typeLink.put(theType, link);
-                if (featureLink == null)
-                {
-                  featureLink = new Hashtable();
-                }
-                featureLink.put(theType, link);
-              }
-            } catch (IllegalArgumentException e)
+            String colscheme = gffColumns[1];
+            FeatureColourI colour = FeatureColour
+                    .parseJalviewFeatureColour(colscheme);
+            if (colour != null)
             {
-              System.err.println("Error parsing feature colour scheme "
-                      + colscheme + " : " + e.getMessage());
+              colours.put(ft, colour);
             }
           }
           continue;
         }
-        String seqId = "";
-        while (st.hasMoreElements())
-        {
-
-          if (GFFFile)
-          {
-            // Still possible this is an old Jalview file,
-            // which does not have type colours at the beginning
-            seqId = token = st.nextToken();
-            seq = findName(align, seqId, relaxedIdmatching, newseqs);
-            if (seq != null)
-            {
-              desc = st.nextToken();
-              String group = null;
-              if (doGffSource && desc.indexOf(' ') == -1)
-              {
-                // could also be a source term rather than description line
-                group = new String(desc);
-              }
-              theType = st.nextToken();
-              try
-              {
-                String stt = st.nextToken();
-                if (stt.length() == 0 || stt.equals("-"))
-                {
-                  featureStart = 0;
-                }
-                else
-                {
-                  featureStart = Integer.parseInt(stt);
-                }
-              } catch (NumberFormatException ex)
-              {
-                featureStart = 0;
-              }
-              try
-              {
-                String stt = st.nextToken();
-                if (stt.length() == 0 || stt.equals("-"))
-                {
-                  featureEnd = 0;
-                }
-                else
-                {
-                  featureEnd = Integer.parseInt(stt);
-                }
-              } catch (NumberFormatException ex)
-              {
-                featureEnd = 0;
-              }
-              // TODO: decide if non positional feature assertion for input data
-              // where end==0 is generally valid
-              if (featureEnd == 0)
-              {
-                // treat as non-positional feature, regardless.
-                featureStart = 0;
-              }
-              float score = 0f;
-              try
-              {
-                score = new Float(st.nextToken()).floatValue();
-              } catch (NumberFormatException ex)
-              {
-                // ignore
-              }
-
-              sf = new SequenceFeature(theType, desc, featureStart, featureEnd, score, group);
-
-              try
-              {
-                sf.setValue("STRAND", st.nextToken());
-                sf.setValue("FRAME", st.nextToken());
-              } catch (Exception ex)
-              {
-              }
-
-              if (st.hasMoreTokens())
-              {
-                StringBuilder attributes = new StringBuilder();
-                boolean sep = false;
-                while (st.hasMoreTokens())
-                {
-                  attributes.append(sep ? "\t" : "").append(
-                          st.nextElement());
-                  sep = true;
-                }
-                // TODO validate and split GFF2 attributes field ? parse out
-                // ([A-Za-z][A-Za-z0-9_]*) <value> ; and add as
-                // sf.setValue(attrib, val);
-                sf.setValue("ATTRIBUTES", attributes.toString());
-              }
-
-              if (processOrAddSeqFeature(align, newseqs, seq, sf, GFFFile,
-                      relaxedIdmatching))
-              {
-                // check whether we should add the sequence feature to any other
-                // sequences in the alignment with the same or similar
-                while ((seq = align.findName(seq, seqId, true)) != null)
-                {
-                  seq.addSequenceFeature(new SequenceFeature(sf));
-                }
-              }
-              break;
-            }
-          }
-
-          if (GFFFile && seq == null)
-          {
-            desc = token;
-          }
-          else
-          {
-            desc = st.nextToken();
-          }
-          if (!st.hasMoreTokens())
-          {
-            System.err
-                    .println("DEBUG: Run out of tokens when trying to identify the destination for the feature.. giving up.");
-            // in all probability, this isn't a file we understand, so bail
-            // quietly.
-            return false;
-          }
-
-          token = st.nextToken();
 
-          if (!token.equals("ID_NOT_SPECIFIED"))
-          {
-            seq = findName(align, seqId = token, relaxedIdmatching, null);
-            st.nextToken();
-          }
-          else
-          {
-            seqId = null;
-            try
-            {
-              int idx = Integer.parseInt(st.nextToken());
-              seq = align.getSequenceAt(idx);
-            } catch (NumberFormatException ex)
-            {
-              seq = null;
-            }
-          }
-
-          if (seq == null)
-          {
-            System.out.println("Sequence not found: " + line);
-            break;
-          }
-
-          featureStart = Integer.parseInt(st.nextToken());
-          featureEnd = Integer.parseInt(st.nextToken());
-
-          theType = st.nextToken();
-
-          if (!colours.containsKey(theType))
-          {
-            // Probably the old style groups file
-            colours.put(
-                    theType,
-                    new FeatureColour(UserColourScheme
-                            .getColourFromString(theType)));
-          }
-          sf = new SequenceFeature(theType, desc, "", featureStart, featureEnd, featureGroup);
-          if (st.hasMoreTokens())
-          {
-            float score = 0f;
-            try
-            {
-              score = new Float(st.nextToken()).floatValue();
-              // update colourgradient bounds if allowed to
-            } catch (NumberFormatException ex)
-            {
-              // ignore
-            }
-            sf.setScore(score);
-          }
-          if (groupLink != null && removeHTML)
-          {
-            sf.addLink(groupLink);
-            sf.description += "%LINK%";
-          }
-          if (typeLink.containsKey(theType) && removeHTML)
-          {
-            sf.addLink(typeLink.get(theType));
-            sf.description += "%LINK%";
-          }
-
-          parseDescriptionHTML(sf, removeHTML);
-
-          seq.addSequenceFeature(sf);
-
-          while (seqId != null
-                  && (seq = align.findName(seq, seqId, false)) != null)
-          {
-            seq.addSequenceFeature(new SequenceFeature(sf));
-          }
-          // If we got here, its not a GFFFile
-          GFFFile = false;
+        /*
+         * if not a comment, GFF pragma, startgroup, endgroup or feature
+         * colour specification, that just leaves a feature details line
+         * in either Jalview or GFF format
+         */
+        if (gffVersion == 0)
+        {
+          parseJalviewFeature(line, gffColumns, align, colours, removeHTML,
+                  relaxedIdmatching, featureGroup);
+        }
+        else
+        {
+          parseGff(gffColumns, align, relaxedIdmatching, newseqs);
         }
       }
       resetMatcher();
@@ -514,428 +274,158 @@ public class FeaturesFile extends AlignFile
       return false;
     }
 
-    return true;
-  }
-
-  private enum GffPragmas
-  {
-    gff_version, sequence_region, feature_ontology, attribute_ontology, source_ontology, species_build, fasta, hash
-  };
-
-  private static Map<String, GffPragmas> GFFPRAGMA;
-  static
-  {
-    GFFPRAGMA = new HashMap<String, GffPragmas>();
-    GFFPRAGMA.put("sequence-region", GffPragmas.sequence_region);
-    GFFPRAGMA.put("feature-ontology", GffPragmas.feature_ontology);
-    GFFPRAGMA.put("#", GffPragmas.hash);
-    GFFPRAGMA.put("fasta", GffPragmas.fasta);
-    GFFPRAGMA.put("species-build", GffPragmas.species_build);
-    GFFPRAGMA.put("source-ontology", GffPragmas.source_ontology);
-    GFFPRAGMA.put("attribute-ontology", GffPragmas.attribute_ontology);
-  }
-
-  private void processGffPragma(String line, Map<String, String> gffProps,
-          AlignmentI align, ArrayList<SequenceI> newseqs)
-          throws IOException
-  {
-    // line starts with ##
-    int spacepos = line.indexOf(' ');
-    String pragma = spacepos == -1 ? line.substring(2).trim() : line
-            .substring(2, spacepos);
-    GffPragmas gffpragma = GFFPRAGMA.get(pragma.toLowerCase());
-    if (gffpragma == null)
-    {
-      return;
-    }
-    switch (gffpragma)
+    /*
+     * experimental - add any dummy sequences with features to the alignment
+     * - we need them for Ensembl feature extraction - though maybe not otherwise
+     */
+    for (SequenceI newseq : newseqs)
     {
-    case gff_version:
-      try
-      {
-        gffversion = Integer.parseInt(line.substring(spacepos + 1));
-      } finally
+      if (newseq.getSequenceFeatures() != null)
       {
-
+        align.addSequence(newseq);
       }
-      break;
-    case feature_ontology:
-      // resolve against specific feature ontology
-      break;
-    case attribute_ontology:
-      // resolve against specific attribute ontology
-      break;
-    case source_ontology:
-      // resolve against specific source ontology
-      break;
-    case species_build:
-      // resolve against specific NCBI taxon version
-      break;
-    case hash:
-      // close off any open feature hierarchies
-      break;
-    case fasta:
-      // process the rest of the file as a fasta file and replace any dummy
-      // sequence IDs
-      process_as_fasta(align, newseqs);
-      break;
-    default:
-      // we do nothing ?
-      System.err.println("Ignoring unknown pragma:\n" + line);
-    }
-  }
-
-  private void process_as_fasta(AlignmentI align, List<SequenceI> newseqs)
-          throws IOException
-  {
-    try
-    {
-      mark();
-    } catch (IOException q)
-    {
-    }
-    FastaFile parser = new FastaFile(this);
-    List<SequenceI> includedseqs = parser.getSeqs();
-    SequenceIdMatcher smatcher = new SequenceIdMatcher(newseqs);
-    // iterate over includedseqs, and replacing matching ones with newseqs
-    // sequences. Generic iterator not used here because we modify includedseqs
-    // as we go
-    for (int p = 0, pSize = includedseqs.size(); p < pSize; p++)
-    {
-      // search for any dummy seqs that this sequence can be used to update
-      SequenceI dummyseq = smatcher.findIdMatch(includedseqs.get(p));
-      if (dummyseq != null)
-      {
-        // dummyseq was created so it could be annotated and referred to in
-        // alignments/codon mappings
-
-        SequenceI mseq = includedseqs.get(p);
-        // mseq is the 'template' imported from the FASTA file which we'll use
-        // to coomplete dummyseq
-        if (dummyseq instanceof SequenceDummy)
-        {
-          // probably have the pattern wrong
-          // idea is that a flyweight proxy for a sequence ID can be created for
-          // 1. stable reference creation
-          // 2. addition of annotation
-          // 3. future replacement by a real sequence
-          // current pattern is to create SequenceDummy objects - a convenience
-          // constructor for a Sequence.
-          // problem is that when promoted to a real sequence, all references
-          // need
-          // to be updated somehow.
-          ((SequenceDummy) dummyseq).become(mseq);
-          includedseqs.set(p, dummyseq); // template is no longer needed
-        }
-      }
-    }
-    // finally add sequences to the dataset
-    for (SequenceI seq : includedseqs)
-    {
-      align.addSequence(seq);
     }
+    return true;
   }
 
   /**
-   * take a sequence feature and examine its attributes to decide how it should
-   * be added to a sequence
+   * Try to parse a Jalview format feature specification and add it as a
+   * sequence feature to any matching sequences in the alignment. Returns true
+   * if successful (a feature was added), or false if not.
    * 
-   * @param seq
-   *          - the destination sequence constructed or discovered in the
-   *          current context
-   * @param sf
-   *          - the base feature with ATTRIBUTES property containing any
-   *          additional attributes
-   * @param gFFFile
-   *          - true if we are processing a GFF annotation file
-   * @return true if sf was actually added to the sequence, false if it was
-   *         processed in another way
+   * @param line
+   * @param gffColumns
+   * @param alignment
+   * @param featureColours
+   * @param removeHTML
+   * @param relaxedIdmatching
+   * @param featureGroup
    */
-  public boolean processOrAddSeqFeature(AlignmentI align,
-          List<SequenceI> newseqs, SequenceI seq, SequenceFeature sf,
-          boolean gFFFile, boolean relaxedIdMatching)
+  protected boolean parseJalviewFeature(String line, String[] gffColumns,
+          AlignmentI alignment, Map<String, FeatureColourI> featureColours,
+          boolean removeHTML, boolean relaxedIdMatching, String featureGroup)
   {
-    String attr = (String) sf.getValue("ATTRIBUTES");
-    boolean add = true;
-    if (gFFFile && attr != null)
+    /*
+     * tokens: description seqid seqIndex start end type [score]
+     */
+    if (gffColumns.length < 6)
     {
-      int nattr = 8;
-
-      for (String attset : attr.split("\t"))
-      {
-        if (attset == null || attset.trim().length() == 0)
-        {
-          continue;
-        }
-        nattr++;
-        Map<String, List<String>> set = new HashMap<String, List<String>>();
-        // normally, only expect one column - 9 - in this field
-        // the attributes (Gff3) or groups (gff2) field
-        for (String pair : attset.trim().split(";"))
-        {
-          pair = pair.trim();
-          if (pair.length() == 0)
-          {
-            continue;
-          }
-
-          // expect either space seperated (gff2) or '=' separated (gff3)
-          // key/value pairs here
-
-          int eqpos = pair.indexOf('='), sppos = pair.indexOf(' ');
-          String key = null, value = null;
-
-          if (sppos > -1 && (eqpos == -1 || sppos < eqpos))
-          {
-            key = pair.substring(0, sppos);
-            value = pair.substring(sppos + 1);
-          }
-          else
-          {
-            if (eqpos > -1 && (sppos == -1 || eqpos < sppos))
-            {
-              key = pair.substring(0, eqpos);
-              value = pair.substring(eqpos + 1);
-            }
-            else
-            {
-              key = pair;
-            }
-          }
-          if (key != null)
-          {
-            List<String> vals = set.get(key);
-            if (vals == null)
-            {
-              vals = new ArrayList<String>();
-              set.put(key, vals);
-            }
-            if (value != null)
-            {
-              vals.add(value.trim());
-            }
-          }
-        }
-        try
-        {
-          add &= processGffKey(set, nattr, seq, sf, align, newseqs,
-                  relaxedIdMatching); // process decides if
-                                      // feature is actually
-                                      // added
-        } catch (InvalidGFF3FieldException ivfe)
-        {
-          System.err.println(ivfe);
-        }
-      }
-    }
-    if (add)
-    {
-      seq.addSequenceFeature(sf);
+      System.err.println("Ignoring feature line '" + line
+              + "' with too few columns (" + gffColumns.length + ")");
+      return false;
     }
-    return add;
-  }
-
-  public class InvalidGFF3FieldException extends Exception
-  {
-    String field, value;
+    String desc = gffColumns[0];
+    String seqId = gffColumns[1];
+    SequenceI seq = findSequence(seqId, alignment, null, relaxedIdMatching);
 
-    public InvalidGFF3FieldException(String field,
-            Map<String, List<String>> set, String message)
+    if (!ID_NOT_SPECIFIED.equals(seqId))
     {
-      super(message + " (Field was " + field + " and value was "
-              + set.get(field).toString());
-      this.field = field;
-      this.value = set.get(field).toString();
+      seq = findSequence(seqId, alignment, null, relaxedIdMatching);
     }
-
-  }
-
-  /**
-   * take a set of keys for a feature and interpret them
-   * 
-   * @param set
-   * @param nattr
-   * @param seq
-   * @param sf
-   * @return
-   */
-  public boolean processGffKey(Map<String, List<String>> set, int nattr,
-          SequenceI seq, SequenceFeature sf, AlignmentI align,
-          List<SequenceI> newseqs, boolean relaxedIdMatching)
-          throws InvalidGFF3FieldException
-  {
-    String attr;
-    // decide how to interpret according to type
-    if (sf.getType().equals("similarity"))
+    else
     {
-      int strand = sf.getStrand();
-      // exonerate cdna/protein map
-      // look for fields
-      List<SequenceI> querySeq = findNames(align, newseqs,
-              relaxedIdMatching, set.get(attr = "Query"));
-      if (querySeq == null || querySeq.size() != 1)
+      seqId = null;
+      seq = null;
+      String seqIndex = gffColumns[2];
+      try
       {
-        throw new InvalidGFF3FieldException(attr, set,
-                "Expecting exactly one sequence in Query field (got "
-                        + set.get(attr) + ")");
-      }
-      if (set.containsKey(attr = "Align"))
+        int idx = Integer.parseInt(seqIndex);
+        seq = alignment.getSequenceAt(idx);
+      } catch (NumberFormatException ex)
       {
-        // process the align maps and create cdna/protein maps
-        // ideally, the query sequences are in the alignment, but maybe not...
-
-        AlignedCodonFrame alco = new AlignedCodonFrame();
-        MapList codonmapping = constructCodonMappingFromAlign(set, attr,
-                strand);
-
-        // add codon mapping, and hope!
-        alco.addMap(seq, querySeq.get(0), codonmapping);
-        align.addCodonFrame(alco);
-        // everything that's needed to be done is done
-        // no features to create here !
-        return false;
+        System.err.println("Invalid sequence index: " + seqIndex);
       }
+    }
 
+    if (seq == null)
+    {
+      System.out.println("Sequence not found: " + line);
+      return false;
     }
-    return true;
-  }
 
-  private MapList constructCodonMappingFromAlign(
-          Map<String, List<String>> set, String attr, int strand)
-          throws InvalidGFF3FieldException
-  {
-    if (strand == 0)
+    int startPos = Integer.parseInt(gffColumns[3]);
+    int endPos = Integer.parseInt(gffColumns[4]);
+
+    String ft = gffColumns[5];
+
+    if (!featureColours.containsKey(ft))
     {
-      throw new InvalidGFF3FieldException(attr, set,
-              "Invalid strand for a codon mapping (cannot be 0)");
+      /* 
+       * Perhaps an old style groups file with no colours -
+       * synthesize a colour from the feature type
+       */
+      UserColourScheme ucs = new UserColourScheme(ft);
+      featureColours.put(ft, new FeatureColour(ucs.findColour('A')));
     }
-    List<Integer> fromrange = new ArrayList<Integer>(), torange = new ArrayList<Integer>();
-    int lastppos = 0, lastpframe = 0;
-    for (String range : set.get(attr))
+    SequenceFeature sf = new SequenceFeature(ft, desc, "", startPos,
+            endPos, featureGroup);
+    if (gffColumns.length > 6)
     {
-      List<Integer> ints = new ArrayList<Integer>();
-      StringTokenizer st = new StringTokenizer(range, " ");
-      while (st.hasMoreTokens())
-      {
-        String num = st.nextToken();
-        try
-        {
-          ints.add(new Integer(num));
-        } catch (NumberFormatException nfe)
-        {
-          throw new InvalidGFF3FieldException(attr, set,
-                  "Invalid number in field " + num);
-        }
-      }
-      // Align positionInRef positionInQuery LengthInRef
-      // contig_1146 exonerate:protein2genome:local similarity 8534 11269
-      // 3652 - . alignment_id 0 ;
-      // Query DDB_G0269124
-      // Align 11270 143 120
-      // corresponds to : 120 bases align at pos 143 in protein to 11270 on
-      // dna in strand direction
-      // Align 11150 187 282
-      // corresponds to : 282 bases align at pos 187 in protein to 11150 on
-      // dna in strand direction
-      //
-      // Align 10865 281 888
-      // Align 9977 578 1068
-      // Align 8909 935 375
-      //
-      if (ints.size() != 3)
-      {
-        throw new InvalidGFF3FieldException(attr, set,
-                "Invalid number of fields for this attribute ("
-                        + ints.size() + ")");
-      }
-      fromrange.add(new Integer(ints.get(0).intValue()));
-      fromrange.add(new Integer(ints.get(0).intValue() + strand
-              * ints.get(2).intValue()));
-      // how are intron/exon boundaries that do not align in codons
-      // represented
-      if (ints.get(1).equals(lastppos) && lastpframe > 0)
+      float score = Float.NaN;
+      try
       {
-        // extend existing to map
-        lastppos += ints.get(2) / 3;
-        lastpframe = ints.get(2) % 3;
-        torange.set(torange.size() - 1, new Integer(lastppos));
-      }
-      else
+        score = new Float(gffColumns[6]).floatValue();
+        // update colourgradient bounds if allowed to
+      } catch (NumberFormatException ex)
       {
-        // new to map range
-        torange.add(ints.get(1));
-        lastppos = ints.get(1) + ints.get(2) / 3;
-        lastpframe = ints.get(2) % 3;
-        torange.add(new Integer(lastppos));
+        // leave as NaN
       }
-    }
-    // from and to ranges must end up being a series of start/end intervals
-    if (fromrange.size() % 2 == 1)
-    {
-      throw new InvalidGFF3FieldException(attr, set,
-              "Couldn't parse the DNA alignment range correctly");
-    }
-    if (torange.size() % 2 == 1)
-    {
-      throw new InvalidGFF3FieldException(attr, set,
-              "Couldn't parse the protein alignment range correctly");
-    }
-    // finally, build the map
-    int[] frommap = new int[fromrange.size()], tomap = new int[torange
-            .size()];
-    int p = 0;
-    for (Integer ip : fromrange)
-    {
-      frommap[p++] = ip.intValue();
-    }
-    p = 0;
-    for (Integer ip : torange)
-    {
-      tomap[p++] = ip.intValue();
+      sf.setScore(score);
     }
 
-    return new MapList(frommap, tomap, 3, 1);
-  }
+    parseDescriptionHTML(sf, removeHTML);
 
-  private List<SequenceI> findNames(AlignmentI align,
-          List<SequenceI> newseqs, boolean relaxedIdMatching,
-          List<String> list)
-  {
-    List<SequenceI> found = new ArrayList<SequenceI>();
-    for (String seqId : list)
+    seq.addSequenceFeature(sf);
+
+    while (seqId != null
+            && (seq = alignment.findName(seq, seqId, false)) != null)
     {
-      SequenceI seq = findName(align, seqId, relaxedIdMatching, newseqs);
-      if (seq != null)
-      {
-        found.add(seq);
-      }
+      seq.addSequenceFeature(new SequenceFeature(sf));
     }
-    return found;
+    return true;
   }
 
-  private AlignmentI lastmatchedAl = null;
-
-  private SequenceIdMatcher matcher = null;
-
   /**
    * clear any temporary handles used to speed up ID matching
    */
-  private void resetMatcher()
+  protected void resetMatcher()
   {
     lastmatchedAl = null;
     matcher = null;
   }
 
-  private SequenceI findName(AlignmentI align, String seqId,
-          boolean relaxedIdMatching, List<SequenceI> newseqs)
+  /**
+   * Returns a sequence matching the given id, as follows
+   * <ul>
+   * <li>strict matching is on exact sequence name</li>
+   * <li>relaxed matching allows matching on a token within the sequence name,
+   * or a dbxref</li>
+   * <li>first tries to find a match in the alignment sequences</li>
+   * <li>else tries to find a match in the new sequences already generated while
+   * parsing the features file</li>
+   * <li>else creates a new placeholder sequence, adds it to the new sequences
+   * list, and returns it</li>
+   * </ul>
+   * 
+   * @param seqId
+   * @param align
+   * @param newseqs
+   * @param relaxedIdMatching
+   * 
+   * @return
+   */
+  protected SequenceI findSequence(String seqId, AlignmentI align,
+          List<SequenceI> newseqs, boolean relaxedIdMatching)
   {
+    // TODO encapsulate in SequenceIdMatcher, share the matcher
+    // with the GffHelper (removing code duplication)
     SequenceI match = null;
     if (relaxedIdMatching)
     {
       if (lastmatchedAl != align)
       {
-        matcher = new SequenceIdMatcher(
-                (lastmatchedAl = align).getSequencesArray());
+        lastmatchedAl = align;
+        matcher = new SequenceIdMatcher(align.getSequencesArray());
         if (newseqs != null)
         {
           matcher.addAll(newseqs);
@@ -977,7 +467,7 @@ public class FeaturesFile extends AlignFile
     {
       return;
     }
-    jalview.util.ParseHtmlBodyAndLinks parsed = new jalview.util.ParseHtmlBodyAndLinks(
+    ParseHtmlBodyAndLinks parsed = new ParseHtmlBodyAndLinks(
             sf.getDescription(), removeHTML, newline);
 
     sf.description = (removeHTML) ? parsed.getNonHtmlContent()
@@ -992,16 +482,16 @@ public class FeaturesFile extends AlignFile
   /**
    * generate a features file for seqs includes non-pos features by default.
    * 
-   * @param seqs
+   * @param sequences
    *          source of sequence features
-   * @param map
+   * @param visible
    *          hash of feature types and colours
    * @return features file contents
    */
-  public String printJalviewFormat(SequenceI[] seqs,
-          Map<String, FeatureColourI> map)
+  public String printJalviewFormat(SequenceI[] sequences,
+          Map<String, FeatureColourI> visible)
   {
-    return printJalviewFormat(seqs, map, true, true);
+    return printJalviewFormat(sequences, visible, true, true);
   }
 
   /**
@@ -1019,17 +509,16 @@ public class FeaturesFile extends AlignFile
    * @return features file contents
    */
   public String printJalviewFormat(SequenceI[] sequences,
-          Map<String, FeatureColourI> visible,
-          boolean visOnly, boolean nonpos)
+          Map<String, FeatureColourI> visible, boolean visOnly,
+          boolean nonpos)
   {
+    StringBuilder out = new StringBuilder(256);
+    boolean featuresGen = false;
     if (visOnly && !nonpos && (visible == null || visible.size() < 1))
     {
       // no point continuing.
       return "No Features Visible";
     }
-    StringBuilder out = new StringBuilder(128);
-    SequenceFeature[] next;
-    boolean featuresGen = false;
 
     if (visible != null && visOnly)
     {
@@ -1039,35 +528,37 @@ public class FeaturesFile extends AlignFile
       Iterator<String> en = visible.keySet().iterator();
       while (en.hasNext())
       {
-        String featureType = en.next();
+        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
-    Vector groups = new Vector();
+    List<String> groups = new ArrayList<String>();
     int groupIndex = 0;
     boolean isnonpos = false;
 
+    SequenceFeature[] features;
     for (int i = 0; i < sequences.length; i++)
     {
-      next = sequences[i].getSequenceFeatures();
-      if (next != null)
+      features = sequences[i].getSequenceFeatures();
+      if (features != null)
       {
-        for (int j = 0; j < next.length; j++)
+        for (int j = 0; j < features.length; j++)
         {
-          isnonpos = next[j].begin == 0 && next[j].end == 0;
+          isnonpos = features[j].begin == 0 && features[j].end == 0;
           if ((!nonpos && isnonpos)
                   || (!isnonpos && visOnly && !visible
-                          .containsKey(next[j].type)))
+                          .containsKey(features[j].type)))
           {
             continue;
           }
 
-          if (next[j].featureGroup != null
-                  && !groups.contains(next[j].featureGroup))
+          if (features[j].featureGroup != null
+                  && !groups.contains(features[j].featureGroup))
           {
-            groups.addElement(next[j].featureGroup);
+            groups.add(features[j].featureGroup);
           }
         }
       }
@@ -1076,12 +567,11 @@ public class FeaturesFile extends AlignFile
     String group = null;
     do
     {
-
       if (groups.size() > 0 && groupIndex < groups.size())
       {
-        group = groups.elementAt(groupIndex).toString();
+        group = groups.get(groupIndex);
         out.append(newline);
-        out.append("STARTGROUP\t");
+        out.append("STARTGROUP").append(TAB);
         out.append(group);
         out.append(newline);
       }
@@ -1092,15 +582,15 @@ public class FeaturesFile extends AlignFile
 
       for (int i = 0; i < sequences.length; i++)
       {
-        next = sequences[i].getSequenceFeatures();
-        if (next != null)
+        features = sequences[i].getSequenceFeatures();
+        if (features != null)
         {
-          for (int j = 0; j < next.length; j++)
+          for (SequenceFeature sequenceFeature : features)
           {
-            isnonpos = next[j].begin == 0 && next[j].end == 0;
+            isnonpos = sequenceFeature.begin == 0 && sequenceFeature.end == 0;
             if ((!nonpos && isnonpos)
                     || (!isnonpos && visOnly && !visible
-                            .containsKey(next[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
@@ -1108,65 +598,66 @@ public class FeaturesFile extends AlignFile
             }
 
             if (group != null
-                    && (next[j].featureGroup == null || !next[j].featureGroup
+                    && (sequenceFeature.featureGroup == null || !sequenceFeature.featureGroup
                             .equals(group)))
             {
               continue;
             }
 
-            if (group == null && next[j].featureGroup != null)
+            if (group == null && sequenceFeature.featureGroup != null)
             {
               continue;
             }
             // we have features to output
             featuresGen = true;
-            if (next[j].description == null
-                    || next[j].description.equals(""))
+            if (sequenceFeature.description == null
+                    || sequenceFeature.description.equals(""))
             {
-              out.append(next[j].type + "\t");
+              out.append(sequenceFeature.type).append(TAB);
             }
             else
             {
-              if (next[j].links != null
-                      && next[j].getDescription().indexOf("<html>") == -1)
+              if (sequenceFeature.links != null
+                      && sequenceFeature.getDescription().indexOf("<html>") == -1)
               {
                 out.append("<html>");
               }
 
-              out.append(next[j].description + " ");
-              if (next[j].links != null)
+              out.append(sequenceFeature.description);
+              if (sequenceFeature.links != null)
               {
-                for (int l = 0; l < next[j].links.size(); l++)
+                for (int l = 0; l < sequenceFeature.links.size(); l++)
                 {
-                  String label = next[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 (next[j].description.indexOf(href) == -1)
+                  if (sequenceFeature.description.indexOf(href) == -1)
                   {
-                    out.append("<a href=\"" + href + "\">" + label + "</a>");
+                    out.append(" <a href=\"" + href + "\">" + label
+                            + "</a>");
                   }
                 }
 
-                if (next[j].getDescription().indexOf("</html>") == -1)
+                if (sequenceFeature.getDescription().indexOf("</html>") == -1)
                 {
                   out.append("</html>");
                 }
               }
 
-              out.append("\t");
+              out.append(TAB);
             }
             out.append(sequences[i].getName());
             out.append("\t-1\t");
-            out.append(next[j].begin);
-            out.append("\t");
-            out.append(next[j].end);
-            out.append("\t");
-            out.append(next[j].type);
-            if (!Float.isNaN(next[j].score))
+            out.append(sequenceFeature.begin);
+            out.append(TAB);
+            out.append(sequenceFeature.end);
+            out.append(TAB);
+            out.append(sequenceFeature.type);
+            if (!Float.isNaN(sequenceFeature.score))
             {
-              out.append("\t");
-              out.append(next[j].score);
+              out.append(TAB);
+              out.append(sequenceFeature.score);
             }
             out.append(newline);
           }
@@ -1175,7 +666,7 @@ public class FeaturesFile extends AlignFile
 
       if (group != null)
       {
-        out.append("ENDGROUP\t");
+        out.append("ENDGROUP").append(TAB);
         out.append(group);
         out.append(newline);
         groupIndex++;
@@ -1196,113 +687,493 @@ public class FeaturesFile extends AlignFile
   }
 
   /**
-   * generate a gff file for sequence features includes non-pos features by
-   * default.
+   * Parse method that is called when a GFF file is dragged to the desktop
+   */
+  @Override
+  public void parse()
+  {
+    AlignViewportI av = getViewport();
+    if (av != null)
+    {
+      if (av.getAlignment() != null)
+      {
+        dataset = av.getAlignment().getDataset();
+      }
+      if (dataset == null)
+      {
+        // working in the applet context ?
+        dataset = av.getAlignment();
+      }
+    }
+    else
+    {
+      dataset = new Alignment(new SequenceI[] {});
+    }
+
+    boolean parseResult = parse(dataset, null, false, true);
+    if (!parseResult)
+    {
+      // pass error up somehow
+    }
+    if (av != null)
+    {
+      // update viewport with the dataset data ?
+    }
+    else
+    {
+      setSeqs(dataset.getSequencesArray());
+    }
+  }
+
+  /**
+   * Implementation of unused abstract method
    * 
-   * @param seqs
-   * @param map
+   * @return error message
+   */
+  @Override
+  public String print()
+  {
+    return "Use printGffFormat() or printJalviewFormat()";
+  }
+
+  /**
+   * Returns features output in GFF2 format, including hidden and non-positional
+   * features
+   * 
+   * @param sequences
+   *          the sequences whose features are to be output
+   * @param visible
+   *          a map whose keys are the type names of visible features
    * @return
    */
-  public String printGFFFormat(SequenceI[] seqs,
-          Map<String, FeatureColourI> map)
+  public String printGffFormat(SequenceI[] sequences,
+          Map<String, FeatureColourI> visible)
   {
-    return printGFFFormat(seqs, map, true, true);
+    return printGffFormat(sequences, visible, true, true);
   }
 
-  public String printGFFFormat(SequenceI[] seqs,
-          Map<String, FeatureColourI> map, boolean visOnly, boolean nonpos)
+  /**
+   * Returns features output in GFF2 format
+   * 
+   * @param sequences
+   *          the sequences whose features are to be output
+   * @param visible
+   *          a map whose keys are the type names of visible features
+   * @param outputVisibleOnly
+   * @param includeNonPositionalFeatures
+   * @return
+   */
+  public String printGffFormat(SequenceI[] sequences,
+          Map<String, FeatureColourI> visible, boolean outputVisibleOnly,
+          boolean includeNonPositionalFeatures)
   {
-    StringBuffer out = new StringBuffer();
-    SequenceFeature[] next;
+    StringBuilder out = new StringBuilder(256);
+    int version = gffVersion == 0 ? 2 : gffVersion;
+    out.append(String.format("%s %d\n", GFF_VERSION, version));
     String source;
     boolean isnonpos;
-    for (int i = 0; i < seqs.length; i++)
+    for (SequenceI seq : sequences)
     {
-      if (seqs[i].getSequenceFeatures() != null)
+      SequenceFeature[] features = seq.getSequenceFeatures();
+      if (features != null)
       {
-        next = seqs[i].getSequenceFeatures();
-        for (int j = 0; j < next.length; j++)
+        for (SequenceFeature sf : features)
         {
-          isnonpos = next[j].begin == 0 && next[j].end == 0;
-          if ((!nonpos && isnonpos)
-                  || (!isnonpos && visOnly && !map
-                          .containsKey(next[j].type)))
+          isnonpos = sf.begin == 0 && sf.end == 0;
+          if (!includeNonPositionalFeatures && isnonpos)
+          {
+            /*
+             * ignore non-positional features if not wanted
+             */
+            continue;
+          }
+          // TODO why the test !isnonpos here?
+          // what about not visible non-positional features?
+          if (!isnonpos && outputVisibleOnly
+                  && !visible.containsKey(sf.type))
           {
+            /*
+             * ignore not visible features if not wanted
+             */
             continue;
           }
 
-          source = next[j].featureGroup;
+          source = sf.featureGroup;
           if (source == null)
           {
-            source = next[j].getDescription();
+            source = sf.getDescription();
           }
 
-          out.append(seqs[i].getName());
-          out.append("\t");
+          out.append(seq.getName());
+          out.append(TAB);
           out.append(source);
-          out.append("\t");
-          out.append(next[j].type);
-          out.append("\t");
-          out.append(next[j].begin);
-          out.append("\t");
-          out.append(next[j].end);
-          out.append("\t");
-          out.append(next[j].score);
-          out.append("\t");
-
-          if (next[j].getValue("STRAND") != null)
-          {
-            out.append(next[j].getValue("STRAND"));
-            out.append("\t");
-          }
-          else
+          out.append(TAB);
+          out.append(sf.type);
+          out.append(TAB);
+          out.append(sf.begin);
+          out.append(TAB);
+          out.append(sf.end);
+          out.append(TAB);
+          out.append(sf.score);
+          out.append(TAB);
+
+          int strand = sf.getStrand();
+          out.append(strand == 1 ? "+" : (strand == -1 ? "-" : "."));
+          out.append(TAB);
+
+          String phase = sf.getPhase();
+          out.append(phase == null ? "." : phase);
+
+          // miscellaneous key-values (GFF column 9)
+          String attributes = sf.getAttributes();
+          if (attributes != null)
           {
-            out.append(".\t");
+            out.append(TAB).append(attributes);
           }
 
-          if (next[j].getValue("FRAME") != null)
-          {
-            out.append(next[j].getValue("FRAME"));
-          }
-          else
-          {
-            out.append(".");
-          }
-          // TODO: verify/check GFF - should there be a /t here before attribute
-          // output ?
+          out.append(newline);
+        }
+      }
+    }
 
-          if (next[j].getValue("ATTRIBUTES") != null)
-          {
-            out.append(next[j].getValue("ATTRIBUTES"));
-          }
+    return out.toString();
+  }
 
-          out.append(newline);
+  /**
+   * Returns a mapping given list of one or more Align descriptors (exonerate
+   * format)
+   * 
+   * @param alignedRegions
+   *          a list of "Align fromStart toStart fromCount"
+   * @param mapIsFromCdna
+   *          if true, 'from' is dna, else 'from' is protein
+   * @param strand
+   *          either 1 (forward) or -1 (reverse)
+   * @return
+   * @throws IOException
+   */
+  protected MapList constructCodonMappingFromAlign(
+          List<String> alignedRegions, boolean mapIsFromCdna, int strand)
+          throws IOException
+  {
+    if (strand == 0)
+    {
+      throw new IOException(
+              "Invalid strand for a codon mapping (cannot be 0)");
+    }
+    int regions = alignedRegions.size();
+    // arrays to hold [start, end] for each aligned region
+    int[] fromRanges = new int[regions * 2]; // from dna
+    int[] toRanges = new int[regions * 2]; // to protein
+    int fromRangesIndex = 0;
+    int toRangesIndex = 0;
+
+    for (String range : alignedRegions)
+    {
+      /* 
+       * Align mapFromStart mapToStart mapFromCount
+       * e.g. if mapIsFromCdna
+       *     Align 11270 143 120
+       * means:
+       *     120 bases from pos 11270 align to pos 143 in peptide
+       * if !mapIsFromCdna this would instead be
+       *     Align 143 11270 40 
+       */
+      String[] tokens = range.split(" ");
+      if (tokens.length != 3)
+      {
+        throw new IOException("Wrong number of fields for Align");
+      }
+      int fromStart = 0;
+      int toStart = 0;
+      int fromCount = 0;
+      try
+      {
+        fromStart = Integer.parseInt(tokens[0]);
+        toStart = Integer.parseInt(tokens[1]);
+        fromCount = Integer.parseInt(tokens[2]);
+      } catch (NumberFormatException nfe)
+      {
+        throw new IOException("Invalid number in Align field: "
+                + nfe.getMessage());
+      }
+
+      /*
+       * Jalview always models from dna to protein, so adjust values if the
+       * GFF mapping is from protein to dna
+       */
+      if (!mapIsFromCdna)
+      {
+        fromCount *= 3;
+        int temp = fromStart;
+        fromStart = toStart;
+        toStart = temp;
+      }
+      fromRanges[fromRangesIndex++] = fromStart;
+      fromRanges[fromRangesIndex++] = fromStart + strand * (fromCount - 1);
+
+      /*
+       * If a codon has an intron gap, there will be contiguous 'toRanges';
+       * this is handled for us by the MapList constructor. 
+       * (It is not clear that exonerate ever generates this case)  
+       */
+      toRanges[toRangesIndex++] = toStart;
+      toRanges[toRangesIndex++] = toStart + (fromCount - 1) / 3;
+    }
+
+    return new MapList(fromRanges, toRanges, 3, 1);
+  }
+
+  /**
+   * Parse a GFF format feature. This may include creating a 'dummy' sequence to
+   * hold the feature, or for its mapped sequence, or both, to be resolved
+   * either later in the GFF file (##FASTA section), or when the user loads
+   * additional sequences.
+   * 
+   * @param gffColumns
+   * @param alignment
+   * @param relaxedIdMatching
+   * @param newseqs
+   * @return
+   */
+  protected SequenceI parseGff(String[] gffColumns, AlignmentI alignment,
+          boolean relaxedIdMatching, List<SequenceI> newseqs)
+  {
+    /*
+     * GFF: seqid source type start end score strand phase [attributes]
+     */
+    if (gffColumns.length < 5)
+    {
+      System.err.println("Ignoring GFF feature line with too few columns ("
+              + gffColumns.length + ")");
+      return null;
+    }
 
+    /*
+     * locate referenced sequence in alignment _or_ 
+     * as a forward or external reference (SequenceDummy)
+     */
+    String seqId = gffColumns[0];
+    SequenceI seq = findSequence(seqId, alignment, newseqs,
+            relaxedIdMatching);
+
+    SequenceFeature sf = null;
+    GffHelperI helper = GffHelperFactory.getHelper(gffColumns);
+    if (helper != null)
+    {
+      try
+      {
+        sf = helper.processGff(seq, gffColumns, alignment, newseqs,
+                relaxedIdMatching);
+        if (sf != null)
+        {
+          seq.addSequenceFeature(sf);
+          while ((seq = alignment.findName(seq, seqId, true)) != null)
+          {
+            seq.addSequenceFeature(new SequenceFeature(sf));
+          }
         }
+      } catch (IOException e)
+      {
+        System.err.println("GFF parsing failed with: " + e.getMessage());
+        return null;
       }
     }
 
-    return out.toString();
+    return seq;
   }
 
   /**
-   * this is only for the benefit of object polymorphism - method does nothing.
+   * Process the 'column 9' data of the GFF file. This is less formally defined,
+   * and its interpretation will vary depending on the tool that has generated
+   * it.
+   * 
+   * @param attributes
+   * @param sf
    */
-  @Override
-  public void parse()
+  protected void processGffColumnNine(String attributes, SequenceFeature sf)
   {
-    // IGNORED
+    sf.setAttributes(attributes);
+
+    /*
+     * Parse attributes in column 9 and add them to the sequence feature's 
+     * 'otherData' table; use Note as a best proxy for description
+     */
+    char nameValueSeparator = gffVersion == 3 ? '=' : ' ';
+    // TODO check we don't break GFF2 values which include commas here
+    Map<String, List<String>> nameValues = GffHelperBase
+            .parseNameValuePairs(attributes, ";", nameValueSeparator, ",");
+    for (Entry<String, List<String>> attr : nameValues.entrySet())
+    {
+      String values = StringUtils.listToDelimitedString(attr.getValue(),
+              "; ");
+      sf.setValue(attr.getKey(), values);
+      if (NOTE.equals(attr.getKey()))
+      {
+        sf.setDescription(values);
+      }
+    }
   }
 
   /**
-   * this is only for the benefit of object polymorphism - method does nothing.
+   * After encountering ##fasta in a GFF3 file, process the remainder of the
+   * file as FAST sequence data. Any placeholder sequences created during
+   * feature parsing are updated with the actual sequences.
    * 
-   * @return error message
+   * @param align
+   * @param newseqs
+   * @throws IOException
    */
-  @Override
-  public String print()
+  protected void processAsFasta(AlignmentI align, List<SequenceI> newseqs)
+          throws IOException
   {
-    return "USE printGFFFormat() or printJalviewFormat()";
+    try
+    {
+      mark();
+    } catch (IOException q)
+    {
+    }
+    FastaFile parser = new FastaFile(this);
+    List<SequenceI> includedseqs = parser.getSeqs();
+
+    SequenceIdMatcher smatcher = new SequenceIdMatcher(newseqs);
+
+    /*
+     * iterate over includedseqs, and replacing matching ones with newseqs
+     * sequences. Generic iterator not used here because we modify
+     * includedseqs as we go
+     */
+    for (int p = 0, pSize = includedseqs.size(); p < pSize; p++)
+    {
+      // search for any dummy seqs that this sequence can be used to update
+      SequenceI includedSeq = includedseqs.get(p);
+      SequenceI dummyseq = smatcher.findIdMatch(includedSeq);
+      if (dummyseq != null && dummyseq instanceof SequenceDummy)
+      {
+        // probably have the pattern wrong
+        // idea is that a flyweight proxy for a sequence ID can be created for
+        // 1. stable reference creation
+        // 2. addition of annotation
+        // 3. future replacement by a real sequence
+        // current pattern is to create SequenceDummy objects - a convenience
+        // constructor for a Sequence.
+        // problem is that when promoted to a real sequence, all references
+        // need to be updated somehow. We avoid that by keeping the same object.
+        ((SequenceDummy) dummyseq).become(includedSeq);
+        dummyseq.createDatasetSequence();
+
+        /*
+         * Update mappings so they are now to the dataset sequence
+         */
+        for (AlignedCodonFrame mapping : align.getCodonFrames())
+        {
+          mapping.updateToDataset(dummyseq);
+        }
+
+        /*
+         * replace parsed sequence with the realised forward reference
+         */
+        includedseqs.set(p, dummyseq);
+
+        /*
+         * and remove from the newseqs list
+         */
+        newseqs.remove(dummyseq);
+      }
+    }
+
+    /*
+     * finally add sequences to the dataset
+     */
+    for (SequenceI seq : includedseqs)
+    {
+      // experimental: mapping-based 'alignment' to query sequence
+      AlignmentUtils.alignSequenceAs(seq, align,
+              String.valueOf(align.getGapCharacter()), false, true);
+
+      // rename sequences if GFF handler requested this
+      // TODO a more elegant way e.g. gffHelper.postProcess(newseqs) ?
+      SequenceFeature[] sfs = seq.getSequenceFeatures();
+      if (sfs != null)
+      {
+        String newName = (String) sfs[0].getValue(GffHelperI.RENAME_TOKEN);
+        if (newName != null)
+        {
+          seq.setName(newName);
+        }
+      }
+      align.addSequence(seq);
+    }
   }
 
+  /**
+   * Process a ## directive
+   * 
+   * @param line
+   * @param gffProps
+   * @param align
+   * @param newseqs
+   * @throws IOException
+   */
+  protected void processGffPragma(String line,
+          Map<String, String> gffProps, AlignmentI align,
+          List<SequenceI> newseqs) throws IOException
+  {
+    line = line.trim();
+    if ("###".equals(line))
+    {
+      // close off any open 'forward references'
+      return;
+    }
+
+    String[] tokens = line.substring(2).split(" ");
+    String pragma = tokens[0];
+    String value = tokens.length == 1 ? null : tokens[1];
+
+    if ("gff-version".equalsIgnoreCase(pragma))
+    {
+      if (value != null)
+      {
+        try
+        {
+          // value may be e.g. "3.1.2"
+          gffVersion = Integer.parseInt(value.split("\\.")[0]);
+        } catch (NumberFormatException e)
+        {
+          // ignore
+        }
+      }
+    }
+    else if ("sequence-region".equalsIgnoreCase(pragma))
+    {
+      // could capture <seqid start end> if wanted here
+    }
+    else if ("feature-ontology".equalsIgnoreCase(pragma))
+    {
+      // should resolve against the specified feature ontology URI
+    }
+    else if ("attribute-ontology".equalsIgnoreCase(pragma))
+    {
+      // URI of attribute ontology - not currently used in GFF3
+    }
+    else if ("source-ontology".equalsIgnoreCase(pragma))
+    {
+      // URI of source ontology - not currently used in GFF3
+    }
+    else if ("species-build".equalsIgnoreCase(pragma))
+    {
+      // save URI of specific NCBI taxon version of annotations
+      gffProps.put("species-build", value);
+    }
+    else if ("fasta".equalsIgnoreCase(pragma))
+    {
+      // process the rest of the file as a fasta file and replace any dummy
+      // sequence IDs
+      processAsFasta(align, newseqs);
+    }
+    else
+    {
+      System.err.println("Ignoring unknown pragma: " + line);
+    }
+  }
 }
index 11c40c3..b449d19 100755 (executable)
@@ -21,7 +21,9 @@
 package jalview.io;
 
 import jalview.api.ComplexAlignFile;
+import jalview.api.FeatureSettingsModelI;
 import jalview.api.FeaturesDisplayedI;
+import jalview.api.FeaturesSourceI;
 import jalview.bin.Jalview;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.ColumnSelection;
@@ -100,6 +102,7 @@ public class FileLoader implements Runnable
 
     SwingUtilities.invokeLater(new Runnable()
     {
+      @Override
       public void run()
       {
         loader.start();
@@ -234,6 +237,7 @@ public class FileLoader implements Runnable
     }
   }
 
+  @Override
   public void run()
   {
     String title = protocol.equals(AppletFormatAdapter.PASTE) ? "Copied From Clipboard"
@@ -250,14 +254,14 @@ public class FileLoader implements Runnable
         // just in case the caller didn't identify the file for us
         if (source != null)
         {
-          format = new IdentifyFile().Identify(source, false); // identify
+          format = new IdentifyFile().identify(source, false); // identify
           // stream and
           // rewind rather
           // than close
         }
         else
         {
-          format = new IdentifyFile().Identify(file, protocol);
+          format = new IdentifyFile().identify(file, protocol);
         }
 
       }
@@ -359,8 +363,14 @@ public class FileLoader implements Runnable
             }
           }
 
+          FeatureSettingsModelI proxyColourScheme = source
+                  .getFeatureColourScheme();
           if (viewport != null)
           {
+            if (proxyColourScheme != null)
+            {
+              viewport.applyFeaturesStyle(proxyColourScheme);
+            }
             // append to existing alignment
             viewport.addAlignment(al, title);
           }
@@ -374,18 +384,15 @@ public class FileLoader implements Runnable
                       .getColumnSelection();
               SequenceI[] hiddenSeqs = ((ComplexAlignFile) source)
                       .getHiddenSequences();
-              boolean showSeqFeatures = ((ComplexAlignFile) source)
-                      .isShowSeqFeatures();
               String colourSchemeName = ((ComplexAlignFile) source)
                       .getGlobalColourScheme();
               FeaturesDisplayedI fd = ((ComplexAlignFile) source)
                       .getDisplayedFeatures();
               alignFrame = new AlignFrame(al, hiddenSeqs, colSel,
                       AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT);
-
-              alignFrame.getViewport().setShowSequenceFeatures(
-                      showSeqFeatures);
               alignFrame.getViewport().setFeaturesDisplayed(fd);
+              alignFrame.getViewport().setShowSequenceFeatures(
+                      ((ComplexAlignFile) source).isShowSeqFeatures());
               ColourSchemeI cs = ColourSchemeMapper.getJalviewColourScheme(
                       colourSchemeName, al);
               if (cs != null)
@@ -397,13 +404,21 @@ public class FileLoader implements Runnable
             {
               alignFrame = new AlignFrame(al, AlignFrame.DEFAULT_WIDTH,
                       AlignFrame.DEFAULT_HEIGHT);
+              if (source instanceof FeaturesSourceI)
+              {
+                alignFrame.getViewport().setShowSequenceFeatures(true);
+              }
             }
             // add metadata and update ui
             if (!protocol.equals(AppletFormatAdapter.PASTE))
             {
               alignFrame.setFileName(file, format);
             }
-
+            if (proxyColourScheme != null)
+            {
+              alignFrame.getViewport()
+                      .applyFeaturesStyle(proxyColourScheme);
+            }
             alignFrame.statusBar.setText(MessageManager.formatMessage(
                     "label.successfully_loaded_file",
                     new String[] { title }));
@@ -446,6 +461,7 @@ public class FileLoader implements Runnable
           {
             javax.swing.SwingUtilities.invokeLater(new Runnable()
             {
+              @Override
               public void run()
               {
                 JOptionPane.showInternalMessageDialog(Desktop.desktop,
@@ -472,6 +488,7 @@ public class FileLoader implements Runnable
       {
         javax.swing.SwingUtilities.invokeLater(new Runnable()
         {
+          @Override
           public void run()
           {
             javax.swing.JOptionPane.showInternalMessageDialog(
@@ -493,6 +510,7 @@ public class FileLoader implements Runnable
       {
         javax.swing.SwingUtilities.invokeLater(new Runnable()
         {
+          @Override
           public void run()
           {
             javax.swing.JOptionPane.showInternalMessageDialog(
@@ -551,6 +569,7 @@ public class FileLoader implements Runnable
    * 
    * @see java.lang.Object#finalize()
    */
+  @Override
   protected void finalize() throws Throwable
   {
     source = null;
index 405363d..fddb565 100755 (executable)
@@ -23,6 +23,7 @@ package jalview.io;
 import jalview.api.AlignExportSettingI;
 import jalview.api.AlignViewportI;
 import jalview.api.AlignmentViewPanel;
+import jalview.api.FeatureSettingsModelI;
 import jalview.util.MessageManager;
 
 import java.io.BufferedReader;
@@ -274,6 +275,30 @@ public class FileParse
   }
 
   /**
+   * not for general use, creates a fileParse object for an existing reader with
+   * configurable values for the origin and the type of the source
+   */
+  public FileParse(BufferedReader source, String originString,
+          String typeString)
+  {
+    type = typeString;
+    error = false;
+    inFile = null;
+    dataName = originString;
+    dataIn = source;
+    try
+    {
+      if (dataIn.markSupported())
+      {
+        dataIn.mark(READAHEAD_LIMIT);
+      }
+    } catch (IOException q)
+    {
+
+    }
+  }
+
+  /**
    * Create a datasource for input to Jalview. See AppletFormatAdapter for the
    * types of sources that are handled.
    * 
@@ -457,11 +482,19 @@ public class FileParse
   }
 
   /**
-   * rewinds the datasource the beginning.
+   * Rewinds the datasource to the marked point if possible
+   * 
+   * @param bytesRead
    * 
    */
-  public void reset() throws IOException
+  public void reset(int bytesRead) throws IOException
   {
+    if (bytesRead >= READAHEAD_LIMIT)
+    {
+      System.err.println(String.format(
+              "File reset error: read %d bytes but reset limit is %d",
+              bytesRead, READAHEAD_LIMIT));
+    }
     if (dataIn != null && !error)
     {
       dataIn.reset();
@@ -581,4 +614,15 @@ public class FileParse
     }
     // could also set export/import settings
   }
+
+  /**
+   * Returns the preferred feature colour configuration if there is one, else
+   * null
+   * 
+   * @return
+   */
+  public FeatureSettingsModelI getFeatureColourScheme()
+  {
+    return null;
+  }
 }
diff --git a/src/jalview/io/Gff3File.java b/src/jalview/io/Gff3File.java
deleted file mode 100644 (file)
index 248fa09..0000000
+++ /dev/null
@@ -1,174 +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 <http://www.gnu.org/licenses/>.
- * The Jalview Authors are detailed in the 'AUTHORS' file.
- */
-package jalview.io;
-
-import jalview.api.AlignViewportI;
-import jalview.datamodel.AlignedCodonFrame;
-import jalview.datamodel.Alignment;
-import jalview.datamodel.AlignmentI;
-import jalview.datamodel.SequenceI;
-
-import java.io.IOException;
-import java.util.List;
-
-/**
- * A GFF3 File parsing wrapper for the tangled mess that is FeaturesFile.
- * 
- * This class implements the methods relied on by FileLoader/FormatAdapter in
- * order to allow them to load alignments directly from GFF2 and GFF3 files that
- * contain sequence data and alignment information.
- * 
- * Major issues:
- * 
- * 1. GFF3 files commonly include mappings between DNA, RNA and Protein - so
- * this class needs a dataset AlignmentI context to create alignment codon
- * mappings.
- * 
- * 2. A single GFF3 file can generate many distinct alignments. Support will be
- * needed to allow several AlignmentI instances to be generated from a single
- * file.
- * 
- * 
- * @author jprocter
- *
- */
-public class Gff3File extends FeaturesFile
-{
-
-  /**
-   * 
-   */
-  public Gff3File()
-  {
-    super();
-  }
-
-  /**
-   * @param source
-   * @throws IOException
-   */
-  public Gff3File(FileParse source) throws IOException
-  {
-    super(source);
-  }
-
-  /**
-   * @param inFile
-   * @param type
-   * @throws IOException
-   */
-  public Gff3File(String inFile, String type) throws IOException
-  {
-    super(inFile, type);
-  }
-
-  /**
-   * @param parseImmediately
-   * @param source
-   * @throws IOException
-   */
-  public Gff3File(boolean parseImmediately, FileParse source)
-          throws IOException
-  {
-    super(parseImmediately, source);
-  }
-
-  /**
-   * @param parseImmediately
-   * @param inFile
-   * @param type
-   * @throws IOException
-   */
-  public Gff3File(boolean parseImmediately, String inFile, String type)
-          throws IOException
-  {
-    super(parseImmediately, inFile, type);
-  }
-
-  /*
-   * (non-Javadoc)
-   * 
-   * @see jalview.io.FeaturesFile#print()
-   */
-  @Override
-  public String print()
-  {
-    // TODO GFF3 writer with sensible defaults for writing alignment data
-
-    // return super.printGFFFormat(seqs, visible);
-    return ("Not yet implemented.");
-  }
-
-  AlignmentI dataset;
-
-  List<AlignmentI> alignments;
-
-  @Override
-  public void parse()
-  {
-    AlignViewportI av = getViewport();
-    if (av != null)
-    {
-      if (av.getAlignment() != null)
-      {
-        dataset = av.getAlignment().getDataset();
-      }
-      if (dataset == null)
-      {
-        // working in the applet context ?
-        dataset = av.getAlignment();
-      }
-    }
-    else
-    {
-      dataset = new Alignment(new SequenceI[] {});
-    }
-
-    boolean parseResult = parse(dataset, null, null, false, true);
-    if (!parseResult)
-    {
-      // pass error up somehow
-    }
-    if (av != null)
-    {
-      // update viewport with the dataset data ?
-    }
-    else
-    {
-      setSeqs(dataset.getSequencesArray());
-    }
-
-  }
-
-  @Override
-  public void addProperties(AlignmentI al)
-  {
-    super.addProperties(al);
-    if (dataset.getCodonFrames() != null)
-    {
-      AlignmentI ds = (al.getDataset() == null) ? al : al.getDataset();
-      for (AlignedCodonFrame codons : dataset.getCodonFrames())
-      {
-        ds.addCodonFrame(codons);
-      }
-    }
-  }
-}
index 954d12e..e31e78d 100644 (file)
@@ -22,6 +22,7 @@
 package jalview.io;
 
 import jalview.api.ComplexAlignFile;
+import jalview.api.FeatureSettingsModelI;
 import jalview.api.FeaturesDisplayedI;
 import jalview.datamodel.ColumnSelection;
 import jalview.datamodel.SequenceI;
@@ -124,6 +125,7 @@ public class HtmlFile extends AlignFile implements ComplexAlignFile
             "Print method of HtmlFile is not supported!");
   }
 
+  @Override
   public boolean isShowSeqFeatures()
   {
     return showSeqFeatures;
@@ -134,6 +136,7 @@ public class HtmlFile extends AlignFile implements ComplexAlignFile
     this.showSeqFeatures = showSeqFeatures;
   }
 
+  @Override
   public String getGlobalColourScheme()
   {
     return globalColourScheme;
@@ -144,6 +147,7 @@ public class HtmlFile extends AlignFile implements ComplexAlignFile
     this.globalColourScheme = globalColourScheme;
   }
 
+  @Override
   public ColumnSelection getColumnSelection()
   {
     return columnSelection;
@@ -154,6 +158,7 @@ public class HtmlFile extends AlignFile implements ComplexAlignFile
     this.columnSelection = columnSelection;
   }
 
+  @Override
   public SequenceI[] getHiddenSequences()
   {
     return hiddenSequences;
@@ -170,4 +175,19 @@ public class HtmlFile extends AlignFile implements ComplexAlignFile
     return displayedFeatures;
   }
 
+  /**
+   * Returns a descriptor for suitable feature display settings with
+   * <ul>
+   * <li>ResNums or insertions features visible</li>
+   * <li>insertions features coloured red</li>
+   * <li>ResNum features coloured by label</li>
+   * <li>Insertions displayed above (on top of) ResNums</li>
+   * </ul>
+   */
+  @Override
+  public FeatureSettingsModelI getFeatureColourScheme()
+  {
+    return new PDBFeatureSettings();
+  }
+
 }
index aec0540..889359f 100755 (executable)
@@ -30,7 +30,7 @@ import java.io.IOException;
  */
 public class IdentifyFile
 {
-  public static final String GFF3File = "GFF v2 or v3";
+  public static final String FeaturesFile = "GFF or Jalview features";
 
   /**
    * Identify a datasource's file content.
@@ -44,7 +44,7 @@ public class IdentifyFile
    *          DOCUMENT ME!
    * @return ID String
    */
-  public String Identify(String file, String protocol)
+  public String identify(String file, String protocol)
   {
     String emessage = "UNIDENTIFIED FILE PARSING ERROR";
     FileParse parser = null;
@@ -53,7 +53,7 @@ public class IdentifyFile
       parser = new FileParse(file, protocol);
       if (parser.isValid())
       {
-        return Identify(parser);
+        return identify(parser);
       }
     } catch (Exception e)
     {
@@ -68,9 +68,9 @@ public class IdentifyFile
     return emessage;
   }
 
-  public String Identify(FileParse source)
+  public String identify(FileParse source)
   {
-    return Identify(source, true); // preserves original behaviour prior to
+    return identify(source, true); // preserves original behaviour prior to
     // version 2.3
   }
 
@@ -82,11 +82,12 @@ public class IdentifyFile
    * @param closeSource
    * @return filetype string
    */
-  public String Identify(FileParse source, boolean closeSource)
+  public String identify(FileParse source, boolean closeSource)
   {
     String reply = "PFAM";
     String data;
-    int length = 0;
+    int bytesRead = 0;
+    int trimmedLength = 0;
     boolean lineswereskipped = false;
     boolean isBinary = false; // true if length is non-zero and non-printable
     // characters are encountered
@@ -98,7 +99,8 @@ public class IdentifyFile
       }
       while ((data = source.nextLine()) != null)
       {
-        length += data.trim().length();
+        bytesRead += data.length();
+        trimmedLength += data.trim().length();
         if (!lineswereskipped)
         {
           for (int i = 0; !isBinary && i < data.length(); i++)
@@ -134,7 +136,13 @@ public class IdentifyFile
 
         if (data.startsWith("##GFF-VERSION"))
         {
-          reply = GFF3File;
+          // GFF - possibly embedded in a Jalview features file!
+          reply = FeaturesFile;
+          break;
+        }
+        if (looksLikeFeatureData(data))
+        {
+          reply = FeaturesFile;
           break;
         }
         if (data.indexOf("# STOCKHOLM") > -1)
@@ -142,6 +150,13 @@ public class IdentifyFile
           reply = "STH";
           break;
         }
+        if (data.indexOf("_ENTRY.ID") > -1
+                || data.indexOf("_AUDIT_AUTHOR.NAME") > -1
+                || data.indexOf("_ATOM_SITE.") > -1)
+        {
+          reply = "mmCIF";
+          break;
+        }
         // if (data.indexOf(">") > -1)
         if (data.startsWith(">"))
         {
@@ -215,7 +230,6 @@ public class IdentifyFile
                 } catch (IOException ex)
                 {
                 }
-                ;
                 if (dta != null && dta.indexOf("*") > -1)
                 {
                   starterm = true;
@@ -235,33 +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
         {
-          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("<HTML"))
           {
+            reply = HtmlFile.FILE_DESC;
             break;
           }
-          if (data == null)
+          if (upper.substring(lessThan).startsWith("<RNAML"))
           {
+            reply = "RNAML";
             break;
           }
         }
@@ -309,23 +309,13 @@ public class IdentifyFile
           reply = PhylipFile.FILE_DESC;
           break;
         }
-
-        /*
-         * // TODO comment out SimpleBLAST identification for Jalview 2.4.1 else
-         * if (!lineswereskipped && data.indexOf("BLAST")<4) { reply =
-         * "SimpleBLAST"; break;
-         * 
-         * } // end comments for Jalview 2.4.1
-         */
-        else if (!lineswereskipped && data.charAt(0) != '*'
-                && data.charAt(0) != ' '
-                && data.indexOf(":") < data.indexOf(",")) // &&
-        // data.indexOf(",")<data.indexOf(",",
-        // data.indexOf(",")))
+        else
         {
-          // file looks like a concise JNet file
-          reply = "JnetFile";
-          break;
+          if (!lineswereskipped && looksLikeJnetData(data))
+          {
+            reply = "JnetFile";
+            break;
+          }
         }
 
         lineswereskipped = true; // this means there was some junk before any
@@ -337,14 +327,14 @@ public class IdentifyFile
       }
       else
       {
-        source.reset(); // so the file can be parsed from the beginning again.
+        source.reset(bytesRead); // so the file can be parsed from the mark
       }
     } catch (Exception ex)
     {
       System.err.println("File Identification failed!\n" + ex);
       return source.errormessage;
     }
-    if (length == 0)
+    if (trimmedLength == 0)
     {
       System.err
               .println("File Identification failed! - Empty file was read.");
@@ -353,13 +343,57 @@ public class IdentifyFile
     return reply;
   }
 
+  /**
+   * Returns true if the data appears to be Jnet concise annotation format
+   * 
+   * @param data
+   * @return
+   */
+  protected boolean looksLikeJnetData(String data)
+  {
+    char firstChar = data.charAt(0);
+    int colonPos = data.indexOf(":");
+    int commaPos = data.indexOf(",");
+    boolean isJnet = firstChar != '*' && firstChar != ' ' && colonPos > -1
+            && commaPos > -1 && colonPos < commaPos;
+    // && data.indexOf(",")<data.indexOf(",", data.indexOf(","))) / ??
+    return isJnet;
+  }
+
+  /**
+   * Returns true if the data has at least 6 tab-delimited fields _and_ 
+   * fields 4 and 5 are integer (start/end) 
+   * @param data
+   * @return
+   */
+  protected boolean looksLikeFeatureData(String data)
+  {
+    if (data == null)
+    {
+      return false;
+    }
+    String[] columns = data.split("\t");
+    if (columns.length < 6) {
+      return false;
+    }
+    for (int col = 3; col < 5; col++)
+    {
+      try {
+        Integer.parseInt(columns[col]);
+      } catch (NumberFormatException e) {
+        return false;
+      }
+    }
+    return true;
+  }
+
   public static void main(String[] args)
   {
 
     for (int i = 0; args != null && i < args.length; i++)
     {
       IdentifyFile ider = new IdentifyFile();
-      String type = ider.Identify(args[i], AppletFormatAdapter.FILE);
+      String type = ider.identify(args[i], AppletFormatAdapter.FILE);
       System.out.println("Type of " + args[i] + " is " + type);
     }
     if (args == null || args.length == 0)
index 1038925..36980f8 100644 (file)
@@ -26,6 +26,7 @@ import jalview.api.AlignViewportI;
 import jalview.api.AlignmentViewPanel;
 import jalview.api.ComplexAlignFile;
 import jalview.api.FeatureRenderer;
+import jalview.api.FeatureSettingsModelI;
 import jalview.api.FeaturesDisplayedI;
 import jalview.bin.BuildDetails;
 import jalview.datamodel.AlignmentAnnotation;
@@ -709,6 +710,7 @@ public class JSONFile extends AlignFile implements ComplexAlignFile
     }
   }
 
+  @Override
   public String getGlobalColourScheme()
   {
     return globalColourScheme;
@@ -730,6 +732,7 @@ public class JSONFile extends AlignFile implements ComplexAlignFile
     this.displayedFeatures = displayedFeatures;
   }
 
+  @Override
   public void configureForView(AlignmentViewPanel avpanel)
   {
     super.configureForView(avpanel);
@@ -755,6 +758,7 @@ public class JSONFile extends AlignFile implements ComplexAlignFile
 
   }
 
+  @Override
   public boolean isShowSeqFeatures()
   {
     return showSeqFeatures;
@@ -775,6 +779,7 @@ public class JSONFile extends AlignFile implements ComplexAlignFile
     return hiddenColumns;
   }
 
+  @Override
   public ColumnSelection getColumnSelection()
   {
     return columnSelection;
@@ -785,6 +790,7 @@ public class JSONFile extends AlignFile implements ComplexAlignFile
     this.columnSelection = columnSelection;
   }
 
+  @Override
   public SequenceI[] getHiddenSequences()
   {
     if (hiddenSequences == null || hiddenSequences.isEmpty())
@@ -864,4 +870,19 @@ public class JSONFile extends AlignFile implements ComplexAlignFile
       this.exportJalviewSettings = exportJalviewSettings;
     }
   }
+
+  /**
+   * Returns a descriptor for suitable feature display settings with
+   * <ul>
+   * <li>ResNums or insertions features visible</li>
+   * <li>insertions features coloured red</li>
+   * <li>ResNum features coloured by label</li>
+   * <li>Insertions displayed above (on top of) ResNums</li>
+   * </ul>
+   */
+  @Override
+  public FeatureSettingsModelI getFeatureColourScheme()
+  {
+    return new PDBFeatureSettings();
+  }
 }
diff --git a/src/jalview/io/PDBFeatureSettings.java b/src/jalview/io/PDBFeatureSettings.java
new file mode 100644 (file)
index 0000000..ecce1a3
--- /dev/null
@@ -0,0 +1,66 @@
+package jalview.io;
+
+import jalview.api.FeatureColourI;
+import jalview.schemes.FeatureColour;
+import jalview.schemes.FeatureSettingsAdapter;
+
+import java.awt.Color;
+
+public class PDBFeatureSettings extends FeatureSettingsAdapter
+{
+
+  public static final String FEATURE_INSERTION = "INSERTION";
+
+  public static final String FEATURE_RES_NUM = "RESNUM";
+
+  @Override
+  public boolean isFeatureDisplayed(String type)
+  {
+    return type.equalsIgnoreCase(FEATURE_INSERTION)
+            || type.equalsIgnoreCase(FEATURE_RES_NUM);
+  }
+
+  @Override
+  public FeatureColourI getFeatureColour(String type)
+  {
+    if (type.equalsIgnoreCase(FEATURE_INSERTION))
+    {
+      return new FeatureColour()
+      {
+
+        @Override
+        public Color getColour()
+        {
+          return Color.RED;
+        }
+      };
+    }
+    return null;
+  }
+
+  /**
+   * Order to render insertion after ResNum
+   */
+  @Override
+  public int compare(String feature1, String feature2)
+  {
+    if (feature1.equalsIgnoreCase(FEATURE_INSERTION))
+    {
+      return +1;
+    }
+    if (feature2.equalsIgnoreCase(FEATURE_INSERTION))
+    {
+      return -1;
+    }
+    if (feature1.equalsIgnoreCase(FEATURE_RES_NUM))
+    {
+      return +1;
+    }
+    if (feature2.equalsIgnoreCase(FEATURE_RES_NUM))
+    {
+      return -1;
+    }
+    return 0;
+  }
+}
+
index 6573a7f..2d76d6b 100644 (file)
@@ -23,6 +23,8 @@ package jalview.io;
 import jalview.datamodel.DBRefEntry;
 import jalview.datamodel.SequenceFeature;
 import jalview.datamodel.SequenceI;
+import jalview.io.gff.GffConstants;
+import jalview.util.DBRefUtils;
 import jalview.util.UrlLink;
 
 import java.util.ArrayList;
@@ -44,165 +46,189 @@ public class SequenceAnnotationReport
   }
 
   /**
-   * appends the features at rpos to the given stringbuffer ready for display in
-   * a tooltip
+   * Append text for the list of features to the tooltip
    * 
    * @param tooltipText2
-   * @param linkImageURL
    * @param rpos
    * @param features
-   *          TODO refactor to Jalview 'utilities' somehow.
+   * @param minmax
    */
   public void appendFeatures(final StringBuffer tooltipText2, int rpos,
-          List<SequenceFeature> features)
+          List<SequenceFeature> features, Map<String, float[][]> minmax)
   {
-    appendFeatures(tooltipText2, rpos, features, null);
+    if (features != null)
+    {
+      for (SequenceFeature feature : features)
+      {
+        appendFeature(tooltipText2, rpos, minmax, feature);
+      }
+    }
   }
 
-  public void appendFeatures(final StringBuffer tooltipText2, int rpos,
-          List<SequenceFeature> features, Map<String, float[][]> map)
+  /**
+   * Appends text for one sequence feature to the string buffer
+   * 
+   * @param sb
+   * @param rpos
+   * @param minmax
+   *          {{min, max}, {min, max}} positional and non-positional feature
+   *          scores for this type
+   * @param feature
+   */
+  void appendFeature(final StringBuffer sb, int rpos,
+          Map<String, float[][]> minmax, SequenceFeature feature)
   {
-    String tmpString;
-    if (features != null)
+    if ("disulfide bond".equals(feature.getType()))
     {
-      for (SequenceFeature feature : features)
+      if (feature.getBegin() == rpos || feature.getEnd() == rpos)
       {
-        if (feature.getType().equals("disulfide bond"))
+        if (sb.length() > 6)
         {
-          if (feature.getBegin() == rpos || feature.getEnd() == rpos)
-          {
-            if (tooltipText2.length() > 6)
-            {
-              tooltipText2.append("<br>");
-            }
-            tooltipText2.append("disulfide bond " + feature.getBegin()
-                    + ":" + feature.getEnd());
-          }
+          sb.append("<br>");
         }
-        else
+        sb.append("disulfide bond ").append(feature.getBegin()).append(":")
+                .append(feature.getEnd());
+      }
+    }
+    else
+    {
+      if (sb.length() > 6)
+      {
+        sb.append("<br>");
+      }
+      // TODO: remove this hack to display link only features
+      boolean linkOnly = feature.getValue("linkonly") != null;
+      if (!linkOnly)
+      {
+        sb.append(feature.getType()).append(" ");
+        if (rpos != 0)
         {
-          if (tooltipText2.length() > 6)
+          // we are marking a positional feature
+          sb.append(feature.begin);
+        }
+        if (feature.begin != feature.end)
+        {
+          sb.append(" " + feature.end);
+        }
+
+        if (feature.getDescription() != null
+                && !feature.description.equals(feature.getType()))
+        {
+          String tmpString = feature.getDescription();
+          String tmp2up = tmpString.toUpperCase();
+          final int startTag = tmp2up.indexOf("<HTML>");
+          if (startTag > -1)
           {
-            tooltipText2.append("<br>");
+            tmpString = tmpString.substring(startTag + 6);
+            tmp2up = tmp2up.substring(startTag + 6);
           }
-          // TODO: remove this hack to display link only features
-          boolean linkOnly = feature.getValue("linkonly") != null;
-          if (!linkOnly)
+          // TODO strips off </body> but not <body> - is that intended?
+          int endTag = tmp2up.indexOf("</BODY>");
+          if (endTag > -1)
           {
-            tooltipText2.append(feature.getType() + " ");
-            if (rpos != 0)
-            {
-              // we are marking a positional feature
-              tooltipText2.append(feature.begin);
-            }
-            if (feature.begin != feature.end)
-            {
-              tooltipText2.append(" " + feature.end);
-            }
-
-            if (feature.getDescription() != null
-                    && !feature.description.equals(feature.getType()))
-            {
-              tmpString = feature.getDescription();
-              String tmp2up = tmpString.toUpperCase();
-              int startTag = tmp2up.indexOf("<HTML>");
-              if (startTag > -1)
-              {
-                tmpString = tmpString.substring(startTag + 6);
-                tmp2up = tmp2up.substring(startTag + 6);
-              }
-              int endTag = tmp2up.indexOf("</BODY>");
-              if (endTag > -1)
-              {
-                tmpString = tmpString.substring(0, endTag);
-                tmp2up = tmp2up.substring(0, endTag);
-              }
-              endTag = tmp2up.indexOf("</HTML>");
-              if (endTag > -1)
-              {
-                tmpString = tmpString.substring(0, endTag);
-              }
-
-              if (startTag > -1)
-              {
-                tooltipText2.append("; " + tmpString);
-              }
-              else
-              {
-                if (tmpString.indexOf("<") > -1
-                        || tmpString.indexOf(">") > -1)
-                {
-                  // The description does not specify html is to
-                  // be used, so we must remove < > symbols
-                  tmpString = tmpString.replaceAll("<", "&lt;");
-                  tmpString = tmpString.replaceAll(">", "&gt;");
-
-                  tooltipText2.append("; ");
-                  tooltipText2.append(tmpString);
+            tmpString = tmpString.substring(0, endTag);
+            tmp2up = tmp2up.substring(0, endTag);
+          }
+          endTag = tmp2up.indexOf("</HTML>");
+          if (endTag > -1)
+          {
+            tmpString = tmpString.substring(0, endTag);
+          }
 
-                }
-                else
-                {
-                  tooltipText2.append("; " + tmpString);
-                }
-              }
-            }
-            // check score should be shown
-            if (!Float.isNaN(feature.getScore()))
+          if (startTag > -1)
+          {
+            sb.append("; ").append(tmpString);
+          }
+          else
+          {
+            if (tmpString.indexOf("<") > -1
+                    || tmpString.indexOf(">") > -1)
             {
-              float[][] rng = (map == null) ? null : (map.get(feature
-                      .getType()));
-              if (rng != null && rng[0] != null && rng[0][0] != rng[0][1])
-              {
-                tooltipText2.append(" Score=" + feature.getScore());
-              }
+              // The description does not specify html is to
+              // be used, so we must remove < > symbols
+              tmpString = tmpString.replaceAll("<", "&lt;");
+              tmpString = tmpString.replaceAll(">", "&gt;");
+              sb.append("; ").append(tmpString);
             }
-            if (feature.getValue("status") != null)
+            else
             {
-              String status = feature.getValue("status").toString();
-              if (status.length() > 0)
-              {
-                tooltipText2.append("; (" + feature.getValue("status")
-                        + ")");
-              }
+              sb.append("; ").append(tmpString);
             }
           }
         }
-        if (feature.links != null)
+
+        /*
+         * score should be shown if there is one, and min != max
+         * for this feature type (e.g. not all 0)
+         */
+        if (!Float.isNaN(feature.getScore()))
         {
-          if (linkImageURL != null)
+          float[][] rng = (minmax == null) ? null : minmax.get(feature
+                  .getType());
+          if (rng != null && rng[0] != null && rng[0][0] != rng[0][1])
           {
-            tooltipText2.append(" <img src=\"" + linkImageURL + "\">");
+            sb.append(" Score=").append(
+                    String.valueOf(feature.getScore()));
           }
-          else
+        }
+        String status = (String) feature.getValue("status");
+        if (status != null && status.length() > 0)
+        {
+          sb.append("; (").append(status).append(")");
+        }
+        String clinSig = (String) feature
+                .getValue(GffConstants.CLINICAL_SIGNIFICANCE);
+        if (clinSig != null)
+        {
+          sb.append("; ").append(clinSig);
+        }
+      }
+    }
+    appendLinks(sb, feature);
+  }
+
+  /**
+   * Format and appends any hyperlinks for the sequence feature to the string
+   * buffer
+   * 
+   * @param sb
+   * @param feature
+   */
+  void appendLinks(final StringBuffer sb, SequenceFeature feature)
+  {
+    if (feature.links != null)
+    {
+      if (linkImageURL != null)
+      {
+        sb.append(" <img src=\"" + linkImageURL + "\">");
+      }
+      else
+      {
+        for (String urlstring : feature.links)
+        {
+          try
           {
-            for (String urlstring : feature.links)
+            for (String[] urllink : createLinksFrom(null, urlstring))
             {
-              try
-              {
-                for (String[] urllink : createLinksFrom(null, urlstring))
-                {
-                  tooltipText2.append("<br/> <a href=\""
-                          + urllink[3]
-                          + "\" target=\""
-                          + urllink[0]
-                          + "\">"
-                          + (urllink[0].toLowerCase().equals(
-                                  urllink[1].toLowerCase()) ? urllink[0]
-                                  : (urllink[0] + ":" + urllink[1]))
-                          + "</a></br>");
-                }
-              } catch (Exception x)
-              {
-                System.err.println("problem when creating links from "
-                        + urlstring);
-                x.printStackTrace();
-              }
+              sb.append("<br/> <a href=\""
+                      + urllink[3]
+                      + "\" target=\""
+                      + urllink[0]
+                      + "\">"
+                      + (urllink[0].toLowerCase().equals(
+                              urllink[1].toLowerCase()) ? urllink[0]
+                              : (urllink[0] + ":" + urllink[1]))
+                      + "</a></br>");
             }
+          } catch (Exception x)
+          {
+            System.err.println("problem when creating links from "
+                    + urlstring);
+            x.printStackTrace();
           }
-
         }
       }
+
     }
   }
 
@@ -213,63 +239,72 @@ public class SequenceAnnotationReport
    * @return String[][] { String[] { link target, link label, dynamic component
    *         inserted (if any), url }}
    */
-  public String[][] createLinksFrom(SequenceI seq, String link)
+  String[][] createLinksFrom(SequenceI seq, String link)
   {
-    ArrayList<String[]> urlSets = new ArrayList<String[]>();
-    ArrayList<String> uniques = new ArrayList<String>();
+    List<String[]> urlSets = new ArrayList<String[]>();
+    List<String> uniques = new ArrayList<String>();
     UrlLink urlLink = new UrlLink(link);
     if (!urlLink.isValid())
     {
       System.err.println(urlLink.getInvalidMessage());
       return null;
     }
-    final String target = urlLink.getTarget(); // link.substring(0,
-    // link.indexOf("|"));
-    final String label = urlLink.getLabel();
     if (seq != null && urlLink.isDynamic())
     {
-
-      // collect matching db-refs
-      DBRefEntry[] dbr = jalview.util.DBRefUtils.selectRefs(seq.getDBRefs(),
-              new String[] { target });
-      // collect id string too
-      String id = seq.getName();
-      String descr = seq.getDescription();
-      if (descr != null && descr.length() < 1)
+      urlSets.addAll(createDynamicLinks(seq, urlLink, uniques));
+    }
+    else
+    {
+      String target = urlLink.getTarget();
+      String label = urlLink.getLabel();
+      String unq = label + "|" + urlLink.getUrl_prefix();
+      if (!uniques.contains(unq))
       {
-        descr = null;
+        uniques.add(unq);
+        urlSets.add(new String[] { target, label, null,
+            urlLink.getUrl_prefix() });
       }
-      if (dbr != null)
+    }
+
+    return urlSets.toArray(new String[][] {});
+  }
+
+  /**
+   * Formats and returns a list of dynamic href links
+   * 
+   * @param seq
+   * @param urlLink
+   * @param uniques
+   */
+  List<String[]> createDynamicLinks(SequenceI seq, UrlLink urlLink,
+          List<String> uniques)
+  {
+    List<String[]> result = new ArrayList<String[]>();
+    final String target = urlLink.getTarget();
+    final String label = urlLink.getLabel();
+
+    // collect matching db-refs
+    DBRefEntry[] dbr = DBRefUtils.selectRefs(seq.getDBRefs(),
+            new String[] { target });
+    // collect id string too
+    String id = seq.getName();
+    String descr = seq.getDescription();
+    if (descr != null && descr.length() < 1)
+    {
+      descr = null;
+    }
+    if (dbr != null)
+    {
+      for (int r = 0; r < dbr.length; r++)
       {
-        for (int r = 0; r < dbr.length; r++)
+        if (id != null && dbr[r].getAccessionId().equals(id))
         {
-          if (id != null && dbr[r].getAccessionId().equals(id))
-          {
-            // suppress duplicate link creation for the bare sequence ID
-            // string with this link
-            id = null;
-          }
-          // create Bare ID link for this RUL
-          String[] urls = urlLink.makeUrls(dbr[r].getAccessionId(), true);
-          if (urls != null)
-          {
-            for (int u = 0; u < urls.length; u += 2)
-            {
-              String unq = urls[u] + "|" + urls[u + 1];
-              if (!uniques.contains(unq))
-              {
-                urlSets.add(new String[] { target, label, urls[u],
-                    urls[u + 1] });
-                uniques.add(unq);
-              }
-            }
-          }
+          // suppress duplicate link creation for the bare sequence ID
+          // string with this link
+          id = null;
         }
-      }
-      if (id != null)
-      {
-        // create Bare ID link for this RUL
-        String[] urls = urlLink.makeUrls(id, true);
+        // create Bare ID link for this URL
+        String[] urls = urlLink.makeUrls(dbr[r].getAccessionId(), true);
         if (urls != null)
         {
           for (int u = 0; u < urls.length; u += 2)
@@ -277,46 +312,51 @@ public class SequenceAnnotationReport
             String unq = urls[u] + "|" + urls[u + 1];
             if (!uniques.contains(unq))
             {
-              urlSets.add(new String[] { target, label, urls[u],
+              result.add(new String[] { target, label, urls[u],
                   urls[u + 1] });
               uniques.add(unq);
             }
           }
         }
       }
-      if (descr != null && urlLink.getRegexReplace() != null)
+    }
+    if (id != null)
+    {
+      // create Bare ID link for this URL
+      String[] urls = urlLink.makeUrls(id, true);
+      if (urls != null)
       {
-        // create link for this URL from description only if regex matches
-        String[] urls = urlLink.makeUrls(descr, true);
-        if (urls != null)
+        for (int u = 0; u < urls.length; u += 2)
         {
-          for (int u = 0; u < urls.length; u += 2)
+          String unq = urls[u] + "|" + urls[u + 1];
+          if (!uniques.contains(unq))
           {
-            String unq = urls[u] + "|" + urls[u + 1];
-            if (!uniques.contains(unq))
-            {
-              urlSets.add(new String[] { target, label, urls[u],
-                  urls[u + 1] });
-              uniques.add(unq);
-            }
+            result.add(new String[] { target, label, urls[u],
+                urls[u + 1] });
+            uniques.add(unq);
           }
         }
       }
-
     }
-    else
+    if (descr != null && urlLink.getRegexReplace() != null)
     {
-      String unq = label + "|" + urlLink.getUrl_prefix();
-      if (!uniques.contains(unq))
+      // create link for this URL from description only if regex matches
+      String[] urls = urlLink.makeUrls(descr, true);
+      if (urls != null)
       {
-        uniques.add(unq);
-        // Add a non-dynamic link
-        urlSets.add(new String[] { target, label, null,
-            urlLink.getUrl_prefix() });
+        for (int u = 0; u < urls.length; u += 2)
+        {
+          String unq = urls[u] + "|" + urls[u + 1];
+          if (!uniques.contains(unq))
+          {
+            result.add(new String[] { target, label, urls[u],
+                urls[u + 1] });
+            uniques.add(unq);
+          }
+        }
       }
     }
-
-    return urlSets.toArray(new String[][] {});
+    return result;
   }
 
   public void createSequenceAnnotationReport(final StringBuffer tip,
@@ -329,7 +369,7 @@ public class SequenceAnnotationReport
 
   public void createSequenceAnnotationReport(final StringBuffer tip,
           SequenceI sequence, boolean showDbRefs, boolean showNpFeats,
-          boolean tableWrap, Map<String, float[][]> map)
+          boolean tableWrap, Map<String, float[][]> minmax)
   {
     String tmp;
     tip.append("<i>");
@@ -369,7 +409,7 @@ public class SequenceAnnotationReport
           int sz = -tip.length();
           List<SequenceFeature> tfeat = new ArrayList<SequenceFeature>();
           tfeat.add(features[i]);
-          appendFeatures(tip, 0, tfeat, map);
+          appendFeatures(tip, 0, tfeat, minmax);
           sz += tip.length();
           maxWidth = Math.max(maxWidth, sz);
         }
diff --git a/src/jalview/io/StructureFile.java b/src/jalview/io/StructureFile.java
new file mode 100644 (file)
index 0000000..3a7419c
--- /dev/null
@@ -0,0 +1,433 @@
+package jalview.io;
+
+import jalview.analysis.AlignSeq;
+import jalview.api.FeatureSettingsModelI;
+import jalview.datamodel.Alignment;
+import jalview.datamodel.AlignmentAnnotation;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.DBRefEntry;
+import jalview.datamodel.DBRefSource;
+import jalview.datamodel.PDBEntry;
+import jalview.datamodel.SequenceI;
+import jalview.structure.StructureViewSettings;
+
+import java.awt.Color;
+import java.io.IOException;
+import java.lang.reflect.Constructor;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Vector;
+
+import MCview.PDBChain;
+
+public abstract class StructureFile extends AlignFile
+{
+
+  private String id;
+
+  private String dbRefType;
+  /**
+   * set to true to add derived sequence annotations (temp factor read from
+   * file, or computed secondary structure) to the alignment
+   */
+  protected boolean visibleChainAnnotation = false;
+
+  /**
+   * Set true to predict secondary structure (using JMol for protein, Annotate3D
+   * for RNA)
+   */
+  protected boolean predictSecondaryStructure = false;
+
+  /**
+   * Set true (with predictSecondaryStructure=true) to predict secondary
+   * structure using an external service (currently Annotate3D for RNA only)
+   */
+  protected boolean externalSecondaryStructure = false;
+
+  private Vector<PDBChain> chains;
+
+  public StructureFile(String inFile, String type) throws IOException
+  {
+    super(inFile, type);
+  }
+
+  public StructureFile(FileParse fp) throws IOException
+  {
+    super(fp);
+  }
+
+  public void addSettings(boolean addAlignmentAnnotations,
+          boolean predictSecondaryStructure, boolean externalSecStr)
+  {
+    this.visibleChainAnnotation = addAlignmentAnnotations;
+    this.predictSecondaryStructure = predictSecondaryStructure;
+    this.externalSecondaryStructure = externalSecStr;
+  }
+
+  public void xferSettings()
+  {
+    this.visibleChainAnnotation = StructureViewSettings
+            .isVisibleChainAnnotation();
+    this.predictSecondaryStructure = StructureViewSettings
+            .isPredictSecondaryStructure();
+    this.externalSecondaryStructure = StructureViewSettings
+            .isExternalSecondaryStructure();
+
+  }
+
+  public StructureFile(boolean parseImmediately, String inFile, String type)
+          throws IOException
+  {
+    super(parseImmediately, inFile, type);
+  }
+
+  public StructureFile(boolean a, FileParse fp) throws IOException
+  {
+    super(a, fp);
+  }
+
+  public StructureFile()
+  {
+  }
+
+  @SuppressWarnings("rawtypes")
+  protected SequenceI postProcessChain(PDBChain chain)
+  {
+    SequenceI pdbSequence = chain.sequence;
+    pdbSequence.setName(getId() + "|" + pdbSequence.getName());
+    PDBEntry entry = new PDBEntry();
+    entry.setId(getId());
+    entry.setType(this.dbRefType);
+    entry.setProperty(new Hashtable());
+    if (chain.id != null)
+    {
+      entry.setChainCode(String.valueOf(chain.id));
+    }
+    if (inFile != null)
+    {
+      entry.setFile(inFile.getAbsolutePath());
+    }
+    else
+    {
+      entry.setFile(getDataName());
+    }
+
+    DBRefEntry sourceDBRef = new DBRefEntry();
+    sourceDBRef.setAccessionId(getId());
+    sourceDBRef.setSource(DBRefSource.PDB);
+    sourceDBRef.setStartRes(pdbSequence.getStart());
+    sourceDBRef.setEndRes(pdbSequence.getEnd());
+
+    SequenceI chainseq = pdbSequence.deriveSequence();
+    chainseq.setSourceDBRef(sourceDBRef);
+    chainseq.addPDBId(entry);
+    chainseq.addDBRef(sourceDBRef);
+
+    seqs.addElement(chainseq);
+
+    AlignmentAnnotation[] chainannot = chainseq.getAnnotation();
+
+    if (chainannot != null && visibleChainAnnotation)
+    {
+      for (int ai = 0; ai < chainannot.length; ai++)
+      {
+        chainannot[ai].visible = visibleChainAnnotation;
+        annotations.addElement(chainannot[ai]);
+      }
+    }
+    return chainseq;
+  }
+
+  @SuppressWarnings({ "unchecked", "rawtypes" })
+  protected void processPdbFileWithAnnotate3d(List<SequenceI> rna)
+          throws Exception
+  {
+    // System.out.println("this is a PDB format and RNA sequence");
+    // note: we use reflection here so that the applet can compile and run
+    // without the HTTPClient bits and pieces needed for accessing Annotate3D
+    // web service
+    try
+    {
+      Class cl = Class.forName("jalview.ws.jws1.Annotate3D");
+      if (cl != null)
+      {
+        // TODO: use the PDB ID of the structure if one is available, to save
+        // bandwidth and avoid uploading the whole structure to the service
+        Object annotate3d = cl.getConstructor(new Class[] {}).newInstance(
+                new Object[] {});
+        AlignmentI al = ((AlignmentI) cl.getMethod("getRNAMLFor",
+                new Class[] { FileParse.class }).invoke(annotate3d,
+                new Object[] { new FileParse(getDataName(), type) }));
+        for (SequenceI sq : al.getSequences())
+        {
+          if (sq.getDatasetSequence() != null)
+          {
+            if (sq.getDatasetSequence().getAllPDBEntries() != null)
+            {
+              sq.getDatasetSequence().getAllPDBEntries().clear();
+            }
+          }
+          else
+          {
+            if (sq.getAllPDBEntries() != null)
+            {
+              sq.getAllPDBEntries().clear();
+            }
+          }
+        }
+        replaceAndUpdateChains(rna, al, AlignSeq.DNA, false);
+      }
+    } catch (ClassNotFoundException x)
+    {
+      // ignore classnotfounds - occurs in applet
+    }
+  }
+
+  @SuppressWarnings("unchecked")
+  protected void replaceAndUpdateChains(List<SequenceI> prot,
+          AlignmentI al,
+          String pep, boolean b)
+  {
+    List<List<? extends Object>> replaced = AlignSeq
+            .replaceMatchingSeqsWith(seqs, annotations, prot, al, pep,
+                    false);
+    for (PDBChain ch : getChains())
+    {
+      int p = 0;
+      for (SequenceI sq : (List<SequenceI>) replaced.get(0))
+      {
+        p++;
+        if (sq == ch.sequence || sq.getDatasetSequence() == ch.sequence)
+        {
+          p = -p;
+          break;
+        }
+      }
+      if (p < 0)
+      {
+        p = -p - 1;
+        // set shadow entry for chains
+        ch.shadow = (SequenceI) replaced.get(1).get(p);
+        ch.shadowMap = ((AlignSeq) replaced.get(2).get(p))
+                .getMappingFromS1(false);
+      }
+    }
+  }
+
+  /**
+   * Predict secondary structure for RNA and/or protein sequences and add as
+   * annotations
+   * 
+   * @param rnaSequences
+   * @param proteinSequences
+   */
+  protected void addSecondaryStructure(List<SequenceI> rnaSequences,
+          List<SequenceI> proteinSequences)
+  {
+    /*
+     * Currently using Annotate3D for RNA, but only if the 'use external
+     * prediction' flag is set
+     */
+    if (externalSecondaryStructure && rnaSequences.size() > 0)
+    {
+      try
+      {
+        processPdbFileWithAnnotate3d(rnaSequences);
+      } catch (Exception x)
+      {
+        System.err.println("Exceptions when dealing with RNA in pdb file");
+        x.printStackTrace();
+
+      }
+    }
+
+    /*
+     * Currently using JMol PDB parser for peptide
+     */
+    if (proteinSequences.size() > 0)
+    {
+      try
+      {
+        processWithJmolParser(proteinSequences);
+      } catch (Exception x)
+      {
+        System.err
+                .println("Exceptions from Jmol when processing data in pdb file");
+        x.printStackTrace();
+      }
+    }
+  }
+
+  @SuppressWarnings({ "unchecked", "rawtypes" })
+  private void processWithJmolParser(List<SequenceI> prot)
+          throws Exception
+  {
+    try
+    {
+
+      Class cl = Class.forName("jalview.ext.jmol.JmolParser");
+      if (cl != null)
+      {
+        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) };
+
+        StructureViewSettings.setShowSeqFeatures(false);
+        StructureViewSettings.setVisibleChainAnnotation(false);
+        StructureViewSettings
+                .setPredictSecondaryStructure(predictSecondaryStructure);
+        StructureViewSettings
+                .setExternalSecondaryStructure(externalSecondaryStructure);
+        Object jmf = constructor.newInstance(args);
+        AlignmentI al = new Alignment((SequenceI[]) cl.getMethod(
+                "getSeqsAsArray", new Class[] {}).invoke(jmf));
+        cl.getMethod("addAnnotations", new Class[] { AlignmentI.class })
+                .invoke(jmf, al);
+        for (SequenceI sq : al.getSequences())
+        {
+          if (sq.getDatasetSequence() != null)
+          {
+            sq.getDatasetSequence().getAllPDBEntries().clear();
+          }
+          else
+          {
+            sq.getAllPDBEntries().clear();
+          }
+        }
+        replaceAndUpdateChains(prot, al, AlignSeq.PEP, false);
+      }
+    } catch (ClassNotFoundException q)
+    {
+    }
+  }
+
+  public PDBChain findChain(String id) throws Exception
+  {
+    for (PDBChain chain : getChains())
+    {
+      if (chain.id.equalsIgnoreCase(id))
+      {
+        return chain;
+      }
+    }
+    throw new Exception("PDB chain not Found!");
+  }
+
+  public void makeResidueList()
+  {
+    for (PDBChain chain : getChains())
+    {
+      chain.makeResidueList(visibleChainAnnotation);
+    }
+  }
+
+  public void makeCaBondList()
+  {
+    for (PDBChain chain : getChains())
+    {
+      chain.makeCaBondList();
+    }
+  }
+
+  public void setChargeColours()
+  {
+    for (PDBChain chain : getChains())
+    {
+      chain.setChargeColours();
+    }
+  }
+
+  public void setColours(jalview.schemes.ColourSchemeI cs)
+  {
+    for (PDBChain chain : getChains())
+    {
+      chain.setChainColours(cs);
+    }
+  }
+
+  public void setChainColours()
+  {
+    int i = 0;
+    for (PDBChain chain : getChains())
+    {
+      chain.setChainColours(Color.getHSBColor(1.0f / i++, .4f, 1.0f));
+    }
+  }
+
+  public static boolean isRNA(SequenceI seq)
+  {
+    for (char c : seq.getSequence())
+    {
+      if ((c != 'A') && (c != 'C') && (c != 'G') && (c != 'U'))
+      {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  /**
+   * make a friendly ID string.
+   * 
+   * @param dataName
+   * @return truncated dataName to after last '/'
+   */
+  protected String safeName(String dataName)
+  {
+    int p = 0;
+    while ((p = dataName.indexOf("/")) > -1 && p < dataName.length())
+    {
+      dataName = dataName.substring(p + 1);
+    }
+    return dataName;
+  }
+
+  public String getId()
+  {
+    return id;
+  }
+
+  public void setId(String id)
+  {
+    this.id = id;
+  }
+
+  public Vector<PDBChain> getChains()
+  {
+    return chains;
+  }
+
+  public void setChains(Vector<PDBChain> chains)
+  {
+    this.chains = chains;
+  }
+
+  public String getDbRefType()
+  {
+    return dbRefType;
+  }
+
+  public void setDbRefType(String dbRefType)
+  {
+    this.dbRefType = dbRefType;
+  }
+
+  /**
+   * Returns a descriptor for suitable feature display settings with
+   * <ul>
+   * <li>ResNums or insertions features visible</li>
+   * <li>insertions features coloured red</li>
+   * <li>ResNum features coloured by label</li>
+   * <li>Insertions displayed above (on top of) ResNums</li>
+   * </ul>
+   */
+  @Override
+  public FeatureSettingsModelI getFeatureColourScheme()
+  {
+    return new PDBFeatureSettings();
+  }
+}
index a093ebe..2c35547 100644 (file)
@@ -43,7 +43,6 @@ import java.util.Hashtable;
 import java.util.IdentityHashMap;
 import java.util.Iterator;
 import java.util.List;
-import java.util.Set;
 import java.util.Vector;
 import java.util.jar.JarInputStream;
 import java.util.jar.JarOutputStream;
@@ -1433,7 +1432,7 @@ public class VamsasAppDatastore
         // to the align frames.
         boolean gathered = false;
         String newviewid = null;
-        Set<AlignedCodonFrame> mappings = av.getAlignment()
+        List<AlignedCodonFrame> mappings = av.getAlignment()
                 .getCodonFrames();
         for (int i = 0; i < views.length; i++)
         {
@@ -2732,7 +2731,7 @@ public class VamsasAppDatastore
 
       }
       // Store any sequence mappings.
-      Set<AlignedCodonFrame> cframes = av.getAlignment().getCodonFrames();
+      List<AlignedCodonFrame> cframes = av.getAlignment().getCodonFrames();
       if (cframes != null)
       {
         for (AlignedCodonFrame acf : cframes)
diff --git a/src/jalview/io/gff/ExonerateHelper.java b/src/jalview/io/gff/ExonerateHelper.java
new file mode 100644 (file)
index 0000000..f7805fd
--- /dev/null
@@ -0,0 +1,348 @@
+package jalview.io.gff;
+
+import jalview.datamodel.AlignedCodonFrame;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.MappingType;
+import jalview.datamodel.SequenceFeature;
+import jalview.datamodel.SequenceI;
+import jalview.util.MapList;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * A handler to parse GFF in the format generated by the exonerate tool
+ */
+public class ExonerateHelper extends Gff2Helper
+{
+  private static final String SIMILARITY = "similarity";
+
+  private static final String GENOME2GENOME = "genome2genome";
+
+  private static final String CDNA2GENOME = "cdna2genome";
+
+  private static final String CODING2GENOME = "coding2genome";
+
+  private static final String CODING2CODING = "coding2coding";
+
+  private static final String PROTEIN2GENOME = "protein2genome";
+
+  private static final String PROTEIN2DNA = "protein2dna";
+
+  private static final String ALIGN = "Align";
+
+  private static final String QUERY = "Query";
+
+  private static final String TARGET = "Target";
+
+  /**
+   * Process one GFF feature line (as modelled by SequenceFeature)
+   * 
+   * @param seq
+   *          the sequence with which this feature is associated
+   * @param gffColumns
+   *          the sequence feature with ATTRIBUTES property containing any
+   *          additional attributes
+   * @param align
+   *          the alignment we are adding GFF to
+   * @param newseqs
+   *          any new sequences referenced by the GFF
+   * @param relaxedIdMatching
+   *          if true, match word tokens in sequence names
+   * @return true if the sequence feature should be added to the sequence, else
+   *         false (i.e. it has been processed in another way e.g. to generate a
+   *         mapping)
+   */
+  @Override
+  public SequenceFeature processGff(SequenceI seq, String[] gffColumns,
+          AlignmentI align, List<SequenceI> newseqs,
+          boolean relaxedIdMatching)
+  {
+    String attr = gffColumns[ATTRIBUTES_COL];
+    Map<String, List<String>> set = parseNameValuePairs(attr);
+
+    try
+    {
+      processGffSimilarity(set, seq, gffColumns,
+              align, newseqs, relaxedIdMatching);
+    } catch (IOException ivfe)
+    {
+      System.err.println(ivfe);
+    }
+
+    /*
+     * return null to indicate we don't want to add a sequence feature for
+     * similarity (only process it to create mappings)
+     */
+    return null;
+  }
+
+  /**
+   * Processes the 'Query' (or 'Target') and 'Align' properties associated with
+   * an exonerate GFF similarity feature; these properties define the mapping of
+   * the annotated range to a related sequence.
+   * 
+   * @param set
+   *          parsed GFF column 9 key/value(s)
+   * @param seq
+   *          the sequence the GFF feature is on
+   * @param gff
+   *          the GFF column data
+   * @param align
+   *          the alignment the sequence belongs to, where any new mappings
+   *          should be added
+   * @param newseqs
+   *          a list of new 'virtual sequences' generated while parsing GFF
+   * @param relaxedIdMatching
+   *          if true allow fuzzy search for a matching target sequence
+   * @throws IOException
+   */
+  protected void processGffSimilarity(
+          Map<String, List<String>> set,
+          SequenceI seq, String[] gff, AlignmentI align,
+          List<SequenceI> newseqs, boolean relaxedIdMatching)
+          throws IOException
+  {
+    /*
+     * exonerate may be run with
+     * --showquerygff - outputs 'features on the query' e.g. (protein2genome)  
+     *     Target <dnaseqid> ; Align proteinStartPos dnaStartPos proteinCount  
+     * --showtargetgff - outputs 'features on the target' e.g. (protein2genome)
+     *     Query <proteinseqid> ; Align dnaStartPos proteinStartPos nucleotideCount
+     * where the Align spec may repeat 
+     */
+    // TODO handle coding2coding and similar as well
+    boolean featureIsOnTarget = true;
+    List<String> mapTo = set.get(QUERY);
+    if (mapTo == null)
+    {
+      mapTo = set.get(TARGET);
+      featureIsOnTarget = false;
+    }
+    MappingType type = getMappingType(gff[SOURCE_COL]);
+
+    if (type == null)
+    {
+      throw new IOException("Sorry, I don't handle " + gff[SOURCE_COL]);
+    }
+
+    if (mapTo == null || mapTo.size() != 1)
+    {
+      throw new IOException(
+              "Expecting exactly one sequence in Query or Target field (got "
+                      + mapTo + ")");
+    }
+
+    /*
+     * locate the mapped sequence in the alignment or 'new' (GFF file) sequences; 
+     */
+    SequenceI mappedSequence = findSequence(mapTo.get(0), align, newseqs,
+            relaxedIdMatching);
+
+    /*
+     * If mapping is from protein to dna, we store it as dna to protein instead
+     */
+    SequenceI mapFromSequence = seq;
+    SequenceI mapToSequence = mappedSequence;
+    if ((type == MappingType.NucleotideToPeptide && featureIsOnTarget)
+            || (type == MappingType.PeptideToNucleotide && !featureIsOnTarget))
+    {
+      mapFromSequence = mappedSequence;
+      mapToSequence = seq;
+    }
+
+    /*
+     * Process the Align maps and create mappings.
+     * These may be cdna-genome, cdna-protein, genome-protein.
+     * The mapped sequences may or may not be in the alignment
+     * (they may be included later in the GFF file).
+     */
+
+    /*
+     * get any existing mapping for these sequences (or start one),
+     * and add this mapped range
+     */
+    AlignedCodonFrame acf = getMapping(align, mapFromSequence,
+            mapToSequence);
+
+    /*
+     * exonerate GFF has the strand of the target in column 7
+     * (differs from GFF3 which has it in the Target descriptor)
+     */
+    String strand = gff[STRAND_COL];
+    boolean forwardStrand = true;
+    if ("-".equals(strand))
+    {
+      forwardStrand = false;
+    }
+    else if (!"+".equals(strand))
+    {
+      System.err.println("Strand must be specified for alignment");
+      return;
+    }
+
+    List<String> alignedRegions = set.get(ALIGN);
+    for (String region : alignedRegions)
+    {
+      MapList mapping = buildMapping(region, type, forwardStrand,
+              featureIsOnTarget, gff);
+
+      if (mapping == null)
+      {
+        continue;
+      }
+
+      acf.addMap(mapFromSequence, mapToSequence, mapping);
+    }
+    align.addCodonFrame(acf);
+  }
+
+  /**
+   * Construct the mapping
+   * 
+   * @param region
+   * @param type
+   * @param forwardStrand
+   * @param featureIsOnTarget
+   * @param gff
+   * @return
+   */
+  protected MapList buildMapping(String region, MappingType type,
+          boolean forwardStrand, boolean featureIsOnTarget, String[] gff)
+  {
+    /*
+     * process one "fromStart toStart fromCount" descriptor
+     */
+    String[] tokens = region.split(" ");
+    if (tokens.length != 3)
+    {
+      System.err.println("Malformed Align descriptor: " + region);
+      return null;
+    }
+
+    /*
+     * get start/end of from/to mappings
+     * if feature is on the target sequence we have to invert the sense
+     */
+    int alignFromStart;
+    int alignToStart;
+    int alignCount;
+    try {
+      alignFromStart = Integer.parseInt(tokens[0]);
+      alignToStart = Integer.parseInt(tokens[1]);
+      alignCount = Integer.parseInt(tokens[2]);
+    } catch (NumberFormatException nfe) {
+      System.err.println(nfe.toString());
+      return null;
+    }
+    
+    int fromStart;
+    int fromEnd;
+    int toStart;
+    int toEnd;
+
+    if (featureIsOnTarget)
+    {
+      fromStart = alignToStart;
+      toStart = alignFromStart;
+      toEnd = forwardStrand ? toStart + alignCount - 1 : toStart
+              - (alignCount - 1);
+      int toLength = Math.abs(toEnd - toStart) + 1;
+      int fromLength = toLength * type.getFromRatio() / type.getToRatio();
+      fromEnd = fromStart + fromLength - 1;
+    }
+    else
+    {
+      // we use the 'Align' values here not the feature start/end
+      // not clear why they may differ but it seems they can
+      fromStart = alignFromStart;
+      fromEnd = alignFromStart + alignCount - 1;
+      int fromLength = fromEnd - fromStart + 1;
+      int toLength = fromLength * type.getToRatio() / type.getFromRatio();
+      toStart = alignToStart;
+      if (forwardStrand)
+      {
+        toEnd = toStart + toLength - 1;
+      }
+      else
+      {
+        toEnd = toStart - (toLength - 1);
+      }
+    }
+
+    MapList codonmapping = constructMappingFromAlign(fromStart, fromEnd,
+            toStart, toEnd, type);
+    return codonmapping;
+  }
+
+  /**
+   * Returns a MappingType depending on the exonerate 'model' value.
+   * 
+   * @param model
+   * @return
+   */
+  protected static MappingType getMappingType(String model)
+  {
+    MappingType result = null;
+
+    if (model.contains(PROTEIN2DNA) || model.contains(PROTEIN2GENOME))
+    {
+      result = MappingType.PeptideToNucleotide;
+    }
+    else if (model.contains(CODING2CODING)
+            || model.contains(CODING2GENOME)
+            || model.contains(CDNA2GENOME)
+            || model.contains(GENOME2GENOME))
+    {
+      result = MappingType.NucleotideToNucleotide;
+    }
+    return result;
+  }
+
+  /**
+   * Tests whether the GFF data looks like it was generated by exonerate, and is
+   * a format we are willing to handle
+   * 
+   * @param columns
+   * @return
+   */
+  public static boolean recognises(String[] columns)
+  {
+    if (!SIMILARITY.equalsIgnoreCase(columns[TYPE_COL]))
+    {
+      return false;
+    }
+
+    /*
+     * inspect alignment model
+     */
+    String model = columns[SOURCE_COL];
+    // e.g. exonerate:protein2genome:local
+    if (model != null)
+    {
+      String mdl = model.toLowerCase();
+      if (mdl.contains(PROTEIN2DNA) || mdl.contains(PROTEIN2GENOME)
+              || mdl.contains(CODING2CODING)
+              || mdl.contains(CODING2GENOME)
+              || mdl.contains(CDNA2GENOME)
+              || mdl.contains(GENOME2GENOME))
+      {
+        return true;
+      }
+    }
+    System.err.println("Sorry, I don't handle exonerate model " + model);
+    return false;
+  }
+
+  @Override
+  protected SequenceFeature buildSequenceFeature(String[] gff,
+          Map<String, List<String>> set)
+  {
+    SequenceFeature sf = super.buildSequenceFeature(gff, set);
+    sf.setFeatureGroup("exonerate");
+
+    return sf;
+  }
+
+}
diff --git a/src/jalview/io/gff/Gff2Helper.java b/src/jalview/io/gff/Gff2Helper.java
new file mode 100644 (file)
index 0000000..31303b1
--- /dev/null
@@ -0,0 +1,51 @@
+package jalview.io.gff;
+
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.SequenceFeature;
+import jalview.datamodel.SequenceI;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+public class Gff2Helper extends GffHelperBase
+{
+  /**
+   * GFF2 uses space character to delimit name/value pairs on column 9
+   * 
+   * @param text
+   * @return
+   */
+  public static Map<String, List<String>> parseNameValuePairs(String text)
+  {
+    // TODO: can a value include a comma? if so it will be broken by this
+    return parseNameValuePairs(text, ";", ' ', ",");
+  }
+
+  /**
+   * Return ' ' as the name-value separator used in column 9 attributes.
+   */
+  @Override
+  protected char getNameValueSeparator()
+  {
+    return ' ';
+  }
+
+  /**
+   * Default processing if not overridden is just to construct a sequence
+   * feature
+   */
+  @Override
+  public SequenceFeature processGff(SequenceI seq, String[] gff,
+          AlignmentI align, List<SequenceI> newseqs,
+          boolean relaxedIdMatching) throws IOException
+  {
+    Map<String, List<String>> attributes = null;
+    if (gff.length > ATTRIBUTES_COL)
+    {
+      attributes = parseNameValuePairs(gff[ATTRIBUTES_COL]);
+    }
+    return buildSequenceFeature(gff, attributes);
+  }
+
+}
diff --git a/src/jalview/io/gff/Gff3Helper.java b/src/jalview/io/gff/Gff3Helper.java
new file mode 100644 (file)
index 0000000..031900d
--- /dev/null
@@ -0,0 +1,407 @@
+package jalview.io.gff;
+
+import jalview.datamodel.AlignedCodonFrame;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.MappingType;
+import jalview.datamodel.SequenceFeature;
+import jalview.datamodel.SequenceI;
+import jalview.util.MapList;
+import jalview.util.StringUtils;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Base class with generic / common functionality for processing GFF3 data.
+ * Override this as required for any specialisations resulting from
+ * peculiarities of GFF3 generated by particular tools.
+ */
+public class Gff3Helper extends GffHelperBase
+{
+  protected static final String TARGET = "Target";
+
+  protected static final String ID = "ID";
+
+  private static final String NAME = "Name";
+
+  /**
+   * GFF3 uses '=' to delimit name/value pairs in column 9, and comma to
+   * separate multiple values for a name
+   * 
+   * @param text
+   * @return
+   */
+  public static Map<String, List<String>> parseNameValuePairs(String text)
+  {
+    return parseNameValuePairs(text, ";", '=', ",");
+  }
+
+  /**
+   * Process one GFF feature line (as modelled by SequenceFeature)
+   * 
+   * @param seq
+   *          the sequence with which this feature is associated
+   * @param sf
+   *          the sequence feature with ATTRIBUTES property containing any
+   *          additional attributes
+   * @param align
+   *          the alignment we are adding GFF to
+   * @param newseqs
+   *          any new sequences referenced by the GFF
+   * @param relaxedIdMatching
+   *          if true, match word tokens in sequence names
+   * @return true if the sequence feature should be added to the sequence, else
+   *         false (i.e. it has been processed in another way e.g. to generate a
+   *         mapping)
+   * @throws IOException
+   */
+  @Override
+  public SequenceFeature processGff(SequenceI seq, String[] gff,
+          AlignmentI align, List<SequenceI> newseqs,
+          boolean relaxedIdMatching) throws IOException
+  {
+    SequenceFeature sf = null;
+
+    if (gff.length == 9)
+    {
+      String soTerm = gff[TYPE_COL];
+      String atts = gff[ATTRIBUTES_COL];
+      Map<String, List<String>> attributes = parseNameValuePairs(atts);
+
+      SequenceOntologyI so = SequenceOntologyFactory.getInstance();
+      if (so.isA(soTerm, SequenceOntologyI.PROTEIN_MATCH))
+      {
+        sf = processProteinMatch(attributes, seq, gff, align, newseqs,
+                relaxedIdMatching);
+      }
+      else if (so.isA(soTerm, SequenceOntologyI.NUCLEOTIDE_MATCH))
+      {
+        sf = processNucleotideMatch(attributes, seq, gff, align,
+                newseqs, relaxedIdMatching);
+      }
+      else
+      {
+        sf = buildSequenceFeature(gff, attributes);
+      }
+    }
+    else
+    {
+      /*
+       * fall back on generating a sequence feature with no special processing
+       */
+      sf = buildSequenceFeature(gff, null);
+    }
+  
+    return sf;
+  }
+
+  /**
+   * Processes one GFF3 nucleotide (e.g. cDNA to genome) match.
+   * 
+   * @param attributes
+   *          parsed GFF column 9 key/value(s)
+   * @param seq
+   *          the sequence the GFF feature is on
+   * @param gffColumns
+   *          the GFF column data
+   * @param align
+   *          the alignment the sequence belongs to, where any new mappings
+   *          should be added
+   * @param newseqs
+   *          a list of new 'virtual sequences' generated while parsing GFF
+   * @param relaxedIdMatching
+   *          if true allow fuzzy search for a matching target sequence
+   * @return a sequence feature, if one should be added to the sequence, else
+   *         null
+   * @throws IOException
+   */
+  protected SequenceFeature processNucleotideMatch(
+          Map<String, List<String>> attributes, SequenceI seq,
+          String[] gffColumns, AlignmentI align, List<SequenceI> newseqs,
+          boolean relaxedIdMatching)
+          throws IOException
+  {
+    String strand = gffColumns[STRAND_COL];
+
+    /*
+     * (For now) we don't process mappings from reverse complement ; to do
+     * this would require (a) creating a virtual sequence placeholder for
+     * the reverse complement (b) resolving the sequence by its id from some
+     * source (GFF ##FASTA or other) (c) creating the reverse complement
+     * sequence (d) updating the mapping to be to the reverse complement
+     */
+    if ("-".equals(strand))
+    {
+      System.err
+              .println("Skipping mapping from reverse complement as not yet supported");
+      return null;
+    }
+
+    List<String> targets = attributes.get(TARGET);
+    if (targets == null)
+    {
+      System.err.println("'Target' missing in GFF");
+      return null;
+    }
+
+    /*
+     * Typically we only expect one Target per GFF line, but this can handle
+     * multiple matches, to the same or different sequences (e.g. dna variants)
+     */
+    for (String target : targets)
+    {
+      /*
+       * Process "seqid start end [strand]"
+       */
+      String[] tokens = target.split(" ");
+      if (tokens.length < 3)
+      {
+        System.err.println("Incomplete Target: " + target);
+        continue;
+      }
+
+      /*
+       * Locate the mapped sequence in the alignment, or as a 
+       * (new or existing) virtual sequence in the newseqs list 
+       */
+      String targetId = findTargetId(tokens[0], attributes);
+      SequenceI mappedSequence1 = findSequence(targetId, align,
+      newseqs, relaxedIdMatching);
+      SequenceI mappedSequence = mappedSequence1;
+      if (mappedSequence == null)
+      {
+        continue;
+      }
+
+      /*
+       * get any existing mapping for these sequences (or start one),
+       * and add this mapped range
+       */
+      AlignedCodonFrame acf = getMapping(align, seq, mappedSequence);
+
+      try
+      {
+        int toStart = Integer.parseInt(tokens[1]);
+        int toEnd = Integer.parseInt(tokens[2]);
+        if (tokens.length > 3 && "-".equals(tokens[3]))
+        {
+          // mapping to reverse strand - swap start/end
+          int temp = toStart;
+          toStart = toEnd;
+          toEnd = temp;
+        }
+
+        int fromStart = Integer.parseInt(gffColumns[START_COL]);
+        int fromEnd = Integer.parseInt(gffColumns[END_COL]);
+        MapList mapping = constructMappingFromAlign(fromStart, fromEnd,
+                toStart, toEnd,
+                MappingType.NucleotideToNucleotide);
+
+        if (mapping != null)
+        {
+          acf.addMap(seq, mappedSequence, mapping);
+          align.addCodonFrame(acf);
+        }
+      } catch (NumberFormatException nfe)
+      {
+        System.err.println("Invalid start or end in Target " + target);
+      }
+    }
+
+    SequenceFeature sf = buildSequenceFeature(gffColumns, attributes);
+    return sf;
+  }
+
+  /**
+   * Returns the target sequence id extracted from the GFF name/value pairs.
+   * Default (standard behaviour) is the first token for "Target". This may be
+   * overridden where tools report this in a non-standard way.
+   * 
+   * @param target
+   *          first token of a "Target" value from GFF column 9, typically
+   *          "seqid start end"
+   * @param set
+   *          a map with all parsed column 9 attributes
+   * @return
+   */
+  @SuppressWarnings("unused")
+  protected String findTargetId(String target, Map<String, List<String>> set)
+  {
+    return target;
+  }
+
+  /**
+   * Processes one GFF 'protein_match'; fields of interest are
+   * <ul>
+   * <li>feature group - the database reporting a match e.g. Pfam</li>
+   * <li>Name - the matched entry's accession id in the database</li>
+   * <li>ID - a sequence identifier for the matched region (which may be
+   * appended as FASTA in the GFF file)</li>
+   * </ul>
+   * 
+   * @param set
+   *          parsed GFF column 9 key/value(s)
+   * @param seq
+   *          the sequence the GFF feature is on
+   * @param gffColumns
+   *          the sequence feature holding GFF data
+   * @param align
+   *          the alignment the sequence belongs to, where any new mappings
+   *          should be added
+   * @param newseqs
+   *          a list of new 'virtual sequences' generated while parsing GFF
+   * @param relaxedIdMatching
+   *          if true allow fuzzy search for a matching target sequence
+   * @return the (real or virtual) sequence(s) mapped to by this match
+   * @throws IOException
+   */
+  protected SequenceFeature processProteinMatch(
+          Map<String, List<String>> set, SequenceI seq,
+          String[] gffColumns, AlignmentI align, List<SequenceI> newseqs,
+          boolean relaxedIdMatching)
+  {
+    // This is currently tailored to InterProScan GFF output:
+    // ID holds the ID of the matched sequence, Target references the
+    // query sequence; this looks wrong, as ID should just be the GFF internal
+    // ID of the GFF feature, while Target would normally reference the matched
+    // sequence.
+    // TODO refactor as needed if other protein-protein GFF varies
+
+    SequenceFeature sf = buildSequenceFeature(gffColumns, set);
+
+    /*
+     * locate the mapped sequence in the alignment, or as a 
+     * (new or existing) virtual sequence in the newseqs list 
+     */
+    List<String> targets = set.get(TARGET);
+    if (targets != null)
+    {
+      for (String target : targets)
+      {
+
+        SequenceI mappedSequence1 = findSequence(findTargetId(target, set), align,
+        newseqs, relaxedIdMatching);
+        SequenceI mappedSequence = mappedSequence1;
+        if (mappedSequence == null)
+        {
+          continue;
+        }
+
+        /*
+         * give the mapped sequence a copy of the sequence feature, with 
+         * start/end range adjusted 
+         */
+        SequenceFeature sf2 = new SequenceFeature(sf);
+        sf2.setBegin(1);
+        int sequenceFeatureLength = 1 + sf.getEnd() - sf.getBegin();
+        sf2.setEnd(sequenceFeatureLength);
+        mappedSequence.addSequenceFeature(sf2);
+
+        /*
+         * add a property to the mapped sequence so that it can eventually be
+         * renamed with its qualified accession id; renaming has to wait until
+         * all sequence reference resolution is complete
+         */
+        String accessionId = StringUtils.listToDelimitedString(
+                set.get(NAME), ",");
+        if (accessionId.length() > 0)
+        {
+          String database = sf.getType(); // TODO InterProScan only??
+          String qualifiedAccId = database + "|" + accessionId;
+          sf2.setValue(RENAME_TOKEN, qualifiedAccId);
+        }
+
+        /*
+         * get any existing mapping for these sequences (or start one),
+         * and add this mapped range
+         */
+        AlignedCodonFrame alco = getMapping(align, seq, mappedSequence);
+        int[] from = new int[] { sf.getBegin(), sf.getEnd() };
+        int[] to = new int[] { 1, sequenceFeatureLength };
+        MapList mapping = new MapList(from, to, 1, 1);
+
+        alco.addMap(seq, mappedSequence, mapping);
+        align.addCodonFrame(alco);
+      }
+    }
+
+    return sf;
+  }
+
+  /**
+   * Return '=' as the name-value separator used in column 9 attributes.
+   */
+  @Override
+  protected char getNameValueSeparator()
+  {
+    return '=';
+  }
+
+  /**
+   * Modifies the default SequenceFeature in order to set the Target sequence id
+   * as the description
+   */
+  @Override
+  protected SequenceFeature buildSequenceFeature(String[] gff,
+          Map<String, List<String>> attributes)
+  {
+    SequenceFeature sf = super.buildSequenceFeature(gff, attributes);
+    String desc = getDescription(sf, attributes);
+    if (desc != null)
+    {
+      sf.setDescription(desc);
+    }
+    return sf;
+  }
+
+  /**
+   * Apply heuristic rules to try to get the most useful feature description
+   * 
+   * @param sf
+   * @param attributes
+   * @return
+   */
+  protected String getDescription(SequenceFeature sf,
+          Map<String, List<String>> attributes)
+  {
+    String desc = null;
+    String target = (String) sf.getValue(TARGET);
+    if (target != null)
+    {
+      desc = target.split(" ")[0];
+    }
+
+    SequenceOntologyI so = SequenceOntologyFactory.getInstance();
+    String type = sf.getType();
+    if (so.isA(type, SequenceOntologyI.SEQUENCE_VARIANT))
+    {
+      /*
+       * Ensembl returns dna variants as 'alleles'
+       */
+      desc = StringUtils.listToDelimitedString(
+              attributes.get("alleles"), ",");
+    }
+
+    /*
+     * extract 'Name' for a transcript (to show gene name)
+     * or an exon (so 'colour by label' shows exon boundaries) 
+     */
+    if (SequenceOntologyI.NMD_TRANSCRIPT_VARIANT.equals(type)
+            || so.isA(type, SequenceOntologyI.TRANSCRIPT)
+            || so.isA(type, SequenceOntologyI.EXON))
+    {
+      desc = StringUtils.listToDelimitedString(attributes.get("Name"), ",");
+    }
+
+    /*
+     * if the above fails, try ID
+     */
+    if (desc == null)
+    {
+      desc = (String) sf.getValue(ID);
+    }
+
+    return desc;
+  }
+}
diff --git a/src/jalview/io/gff/GffConstants.java b/src/jalview/io/gff/GffConstants.java
new file mode 100644 (file)
index 0000000..545c6e3
--- /dev/null
@@ -0,0 +1,23 @@
+package jalview.io.gff;
+
+/**
+ * A class to hold constants shared by creators and consumers of GFF or feature
+ * data
+ */
+public class GffConstants
+{
+  // SequenceOntology terms are to be found in SequenceOntologyI
+
+  /*
+   * clinical_significance may be an attribute of 
+   * sequence_variant data from Ensembl
+   */
+  public static final String CLINICAL_SIGNIFICANCE = "clinical_significance";
+
+  /*
+   * not instantiable
+   */
+  private GffConstants()
+  {
+  }
+}
diff --git a/src/jalview/io/gff/GffHelperBase.java b/src/jalview/io/gff/GffHelperBase.java
new file mode 100644 (file)
index 0000000..feeec1d
--- /dev/null
@@ -0,0 +1,405 @@
+package jalview.io.gff;
+
+import jalview.analysis.SequenceIdMatcher;
+import jalview.datamodel.AlignedCodonFrame;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.MappingType;
+import jalview.datamodel.SequenceDummy;
+import jalview.datamodel.SequenceFeature;
+import jalview.datamodel.SequenceI;
+import jalview.util.MapList;
+import jalview.util.StringUtils;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+/**
+ * Base class with common functionality for flavours of GFF handler (GFF2 or
+ * GFF3)
+ */
+public abstract class GffHelperBase implements GffHelperI
+{
+  private static final String NOTE = "Note";
+
+  /*
+   * GFF columns 1-9 (zero-indexed):
+   */
+  protected static final int SEQID_COL = 0;
+
+  protected static final int SOURCE_COL = 1;
+
+  protected static final int TYPE_COL = 2;
+
+  protected static final int START_COL = 3;
+
+  protected static final int END_COL = 4;
+
+  protected static final int SCORE_COL = 5;
+
+  protected static final int STRAND_COL = 6;
+
+  protected static final int PHASE_COL = 7;
+
+  protected static final int ATTRIBUTES_COL = 8;
+
+  private AlignmentI lastmatchedAl = null;
+
+  private SequenceIdMatcher matcher = null;
+
+  /**
+   * Constructs and returns a mapping, or null if data appear invalid
+   * 
+   * @param fromStart
+   * @param fromEnd
+   * @param toStart
+   * @param toEnd
+   * @param mappingType
+   *          type of mapping (e.g. protein to nucleotide)
+   * @return
+   */
+  protected MapList constructMappingFromAlign(int fromStart, int fromEnd,
+          int toStart, int toEnd, MappingType mappingType)
+  {
+    int[] from = new int[] { fromStart, fromEnd };
+    int[] to = new int[] { toStart, toEnd };
+
+    /*
+     * Jalview always models from dna to protein, so switch values if the
+     * GFF mapping is from protein to dna
+     */
+    if (mappingType == MappingType.PeptideToNucleotide)
+    {
+      int[] temp = from;
+      from = to;
+      to = temp;
+      mappingType = mappingType.getInverse();
+    }
+
+    int fromRatio = mappingType.getFromRatio();
+    int toRatio = mappingType.getToRatio();
+
+    /*
+     * sanity check that mapped residue counts match
+     * TODO understand why PASA generates such cases...
+     */
+    if (!trimMapping(from, to, fromRatio, toRatio))
+    {
+      System.err.println("Ignoring mapping from " + Arrays.toString(from)
+              + " to " + Arrays.toString(to) + " as counts don't match!");
+      return null;
+    }
+
+    /*
+     * If a codon has an intron gap, there will be contiguous 'toRanges';
+     * this is handled for us by the MapList constructor. 
+     * (It is not clear that exonerate ever generates this case)  
+     */
+
+    return new MapList(from, to, fromRatio, toRatio);
+  }
+
+  /**
+   * Checks that the 'from' and 'to' ranges have equivalent lengths. If not,
+   * tries to trim the end of the longer so they do. Returns true if the
+   * mappings could be made equivalent, else false. Note the range array values
+   * may be modified by this method.
+   * 
+   * @param from
+   * @param to
+   * @param fromRatio
+   * @param toRatio
+   * @return
+   */
+  protected static boolean trimMapping(int[] from, int[] to, int fromRatio,
+          int toRatio)
+  {
+    int fromLength = Math.abs(from[1] - from[0]) + 1;
+    int toLength = Math.abs(to[1] - to[0]) + 1;
+    int fromOverlap = fromLength * toRatio - toLength * fromRatio;
+    if (fromOverlap == 0)
+    {
+      return true;
+    }
+    if (fromOverlap > 0 && fromOverlap % toRatio == 0)
+    {
+      /*
+       * restrict from range to make them match up
+       * it's kind of arbitrary which end we truncate - here it is the end
+       */
+      System.err.print("Truncating mapping from " + Arrays.toString(from)
+              + " to ");
+      if (from[1] > from[0])
+      {
+        from[1] -= fromOverlap / toRatio;
+      }
+      else
+      {
+        from[1] += fromOverlap / toRatio;
+      }
+      System.err.println(Arrays.toString(from));
+      return true;
+    }
+    else if (fromOverlap < 0 && fromOverlap % fromRatio == 0)
+    {
+      fromOverlap = -fromOverlap; // > 0
+      /*
+       * restrict to range to make them match up
+       */
+      System.err.print("Truncating mapping to " + Arrays.toString(to)
+              + " to ");
+      if (to[1] > to[0])
+      {
+        to[1] -= fromOverlap / fromRatio;
+      }
+      else
+      {
+        to[1] += fromOverlap / fromRatio;
+      }
+      System.err.println(Arrays.toString(to));
+      return true;
+    }
+
+    /*
+     * Couldn't truncate to an exact match..
+     */
+    return false;
+  }
+
+  /**
+   * Returns a sequence matching the given id, as follows
+   * <ul>
+   * <li>strict matching is on exact sequence name</li>
+   * <li>relaxed matching allows matching on a token within the sequence name,
+   * or a dbxref</li>
+   * <li>first tries to find a match in the alignment sequences</li>
+   * <li>else tries to find a match in the new sequences already generated while
+   * parsing the features file</li>
+   * <li>else creates a new placeholder sequence, adds it to the new sequences
+   * list, and returns it</li>
+   * </ul>
+   * 
+   * @param seqId
+   * @param align
+   * @param newseqs
+   * @param relaxedIdMatching
+   * 
+   * @return
+   */
+  protected SequenceI findSequence(String seqId, AlignmentI align,
+          List<SequenceI> newseqs, boolean relaxedIdMatching)
+  {
+    if (seqId == null)
+    {
+      return null;
+    }
+    SequenceI match = null;
+    if (relaxedIdMatching)
+    {
+      if (lastmatchedAl != align)
+      {
+        lastmatchedAl = align;
+        matcher = new SequenceIdMatcher(align.getSequencesArray());
+        if (newseqs != null)
+        {
+          matcher.addAll(newseqs);
+        }
+      }
+      match = matcher.findIdMatch(seqId);
+    }
+    else
+    {
+      match = align.findName(seqId, true);
+      if (match == null && newseqs != null)
+      {
+        for (SequenceI m : newseqs)
+        {
+          if (seqId.equals(m.getName()))
+          {
+            return m;
+          }
+        }
+      }
+
+    }
+    if (match == null && newseqs != null)
+    {
+      match = new SequenceDummy(seqId);
+      if (relaxedIdMatching)
+      {
+        matcher.addAll(Arrays.asList(new SequenceI[] { match }));
+      }
+      // add dummy sequence to the newseqs list
+      newseqs.add(match);
+    }
+    return match;
+  }
+
+  /**
+   * Parses the input line to a map of name / value(s) pairs. For example the
+   * line <br>
+   * Notes=Fe-S;Method=manual curation, prediction; source = Pfam; Notes = Metal <br>
+   * if parsed with delimiter=";" and separators {' ', '='} <br>
+   * would return a map with { Notes={Fe=S, Metal}, Method={manual curation,
+   * prediction}, source={Pfam}} <br>
+   * 
+   * This method supports parsing of either GFF2 format (which uses space ' ' as
+   * the name/value delimiter, and allows multiple occurrences of the same
+   * name), or GFF3 format (which uses '=' as the name/value delimiter, and
+   * strictly does not allow repeat occurrences of the same name - but does
+   * allow a comma-separated list of values).
+   * 
+   * @param text
+   * @param namesDelimiter
+   *          the major delimiter between name-value pairs
+   * @param nameValueSeparator
+   *          one or more separators used between name and value
+   * @param valuesDelimiter
+   *          delimits a list of more than one value
+   * @return the name-values map (which may be empty but never null)
+   */
+  public static Map<String, List<String>> parseNameValuePairs(String text,
+          String namesDelimiter, char nameValueSeparator,
+          String valuesDelimiter)
+  {
+    Map<String, List<String>> map = new HashMap<String, List<String>>();
+    if (text == null || text.trim().length() == 0)
+    {
+      return map;
+    }
+
+    for (String pair : text.trim().split(namesDelimiter))
+    {
+      pair = pair.trim();
+      if (pair.length() == 0)
+      {
+        continue;
+      }
+
+      int sepPos = pair.indexOf(nameValueSeparator);
+      if (sepPos == -1)
+      {
+        // no name=value present
+        continue;
+      }
+
+      String key = pair.substring(0, sepPos).trim();
+      String values = pair.substring(sepPos + 1).trim();
+      if (values.length() > 0)
+      {
+        List<String> vals = map.get(key);
+        if (vals == null)
+        {
+          vals = new ArrayList<String>();
+          map.put(key, vals);
+        }
+        for (String val : values.split(valuesDelimiter))
+        {
+          vals.add(val);
+        }
+      }
+    }
+    return map;
+  }
+
+  /**
+   * Constructs a SequenceFeature from the GFF column data. Subclasses may wish
+   * to call this method then adjust the SequenceFeature depending on the
+   * particular usage of different tools that generate GFF.
+   * 
+   * @param gff
+   * @param attributes
+   * @return
+   */
+  protected SequenceFeature buildSequenceFeature(String[] gff,
+          Map<String, List<String>> attributes)
+  {
+    try
+    {
+      int start = Integer.parseInt(gff[START_COL]);
+      int end = Integer.parseInt(gff[END_COL]);
+
+      /*
+       * default 'score' is 0 rather than Float.NaN as the latter currently
+       * disables the 'graduated colour => colour by label' option
+       */
+      float score = 0f;
+      try
+      {
+        score = Float.parseFloat(gff[SCORE_COL]);
+      } catch (NumberFormatException nfe)
+      {
+        // e.g. '.' - leave as zero
+      }
+
+      SequenceFeature sf = new SequenceFeature(gff[TYPE_COL],
+              gff[SOURCE_COL], start, end, score, gff[SOURCE_COL]);
+
+      sf.setStrand(gff[STRAND_COL]);
+
+      sf.setPhase(gff[PHASE_COL]);
+
+      if (attributes != null)
+      {
+        /*
+         * save 'raw' column 9 to allow roundtrip output as input
+         */
+        sf.setAttributes(gff[ATTRIBUTES_COL]);
+
+        /*
+         * Add attributes in column 9 to the sequence feature's 
+         * 'otherData' table; use Note as a best proxy for description
+         */
+        for (Entry<String, List<String>> attr : attributes.entrySet())
+        {
+          String values = StringUtils.listToDelimitedString(
+                  attr.getValue(), ",");
+          sf.setValue(attr.getKey(), values);
+          if (NOTE.equals(attr.getKey()))
+          {
+            sf.setDescription(values);
+          }
+        }
+      }
+
+      return sf;
+    } catch (NumberFormatException nfe)
+    {
+      System.err.println("Invalid number in gff: " + nfe.getMessage());
+      return null;
+    }
+  }
+
+  /**
+   * Returns the character used to separate attributes names from values in GFF
+   * column 9. This is space for GFF2, '=' for GFF3.
+   * 
+   * @return
+   */
+  protected abstract char getNameValueSeparator();
+
+  /**
+   * Returns any existing mapping held on the alignment between the given
+   * dataset sequences, or a new one if none found. This is a convenience method
+   * to facilitate processing multiple GFF lines that make up a single 'spliced'
+   * mapping, by extending the first mapping as the others are read.
+   * 
+   * @param align
+   * @param fromSeq
+   * @param toSeq
+   * @return
+   */
+  protected AlignedCodonFrame getMapping(AlignmentI align, SequenceI fromSeq, SequenceI toSeq)
+  {
+    AlignedCodonFrame acf = align.getMapping(fromSeq, toSeq);
+    if (acf == null)
+    {
+      acf = new AlignedCodonFrame();
+    }
+    return acf;
+  }
+
+}
diff --git a/src/jalview/io/gff/GffHelperFactory.java b/src/jalview/io/gff/GffHelperFactory.java
new file mode 100644 (file)
index 0000000..8bd5115
--- /dev/null
@@ -0,0 +1,70 @@
+package jalview.io.gff;
+
+
+/**
+ * A factory to serve instances of GFF helper classes
+ */
+public class GffHelperFactory
+{
+
+  /**
+   * Returns a class to process the GFF line based on inspecting its column
+   * data. This may return a general-purpose GFF2 or GFF3 helper, or a
+   * specialisation for a flavour of GFF generated by a particular tool.
+   * 
+   * @param gff
+   * @return
+   */
+  public static GffHelperI getHelper(String[] gff)
+  {
+    if (gff == null || gff.length < 6)
+    {
+      return null;
+    }
+
+    GffHelperI result = null;
+    if (ExonerateHelper.recognises(gff))
+    {
+      result = new ExonerateHelper();
+    }
+    else if (InterProScanHelper.recognises(gff))
+    {
+      result = new InterProScanHelper();
+    }
+    else if (looksLikeGff3(gff))
+    {
+      result = new Gff3Helper();
+    }
+    else
+    {
+      result = new Gff2Helper();
+    }
+
+    return result;
+  }
+
+  /**
+   * Heuristic rule: if column 9 seems to have Name=Value entries, assume this
+   * is GFF3. GFF3 uses '=' as name-value separator, GFF2 uses space ' '.
+   * 
+   * @param gff
+   * @return
+   */
+  protected static boolean looksLikeGff3(String[] gff)
+  {
+    if (gff.length >= 9)
+    {
+      String attributes = gff[8].trim();
+      int pos1 = attributes.indexOf(';');
+      int pos2 = attributes.indexOf('=');
+      if (pos2 != -1 && (pos1 == -1 || pos2 < pos1))
+      {
+        // there is an '=' before the first ';' (if any)
+        // not foolproof as theoretically GFF2 could be like "Name Value=123;"
+        return true;
+      }
+    }
+    return false;
+  }
+
+}
diff --git a/src/jalview/io/gff/GffHelperI.java b/src/jalview/io/gff/GffHelperI.java
new file mode 100644 (file)
index 0000000..3d9dc6f
--- /dev/null
@@ -0,0 +1,44 @@
+package jalview.io.gff;
+
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.SequenceFeature;
+import jalview.datamodel.SequenceI;
+
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * An interface to described common functionality of different flavours of GFF
+ * 
+ * @author gmcarstairs
+ *
+ */
+public interface GffHelperI
+{
+
+  final String RENAME_TOKEN = "$RENAME_TO$";
+
+  /**
+   * Process one GFF feature line
+   * 
+   * @param seq
+   *          the sequence with which this feature is associated
+   * @param gffColumns
+   *          the GFF column data
+   * @param align
+   *          the alignment we are adding GFF to
+   * @param newseqs
+   *          any new sequences referenced by the GFF
+   * @param relaxedIdMatching
+   *          if true, match word tokens in sequence names
+   * @return a SequenceFeature if one should be created, else null
+   * @throws IOException
+   */
+  SequenceFeature processGff(SequenceI seq, String[] gffColumns,
+          AlignmentI align,
+          List<SequenceI> newseqs, boolean relaxedIdMatching)
+          throws IOException;
+
+  // java 8 will allow static methods in interfaces:
+  // static boolean recognises(String [] columns);
+}
diff --git a/src/jalview/io/gff/InterProScanHelper.java b/src/jalview/io/gff/InterProScanHelper.java
new file mode 100644 (file)
index 0000000..68d5d4f
--- /dev/null
@@ -0,0 +1,118 @@
+package jalview.io.gff;
+
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.SequenceFeature;
+import jalview.datamodel.SequenceI;
+import jalview.util.StringUtils;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * A handler to parse GFF in the format generated by InterProScan
+ */
+public class InterProScanHelper extends Gff3Helper
+{
+  private static final String INTER_PRO_SCAN = "InterProScan";
+
+  private static final String SIGNATURE_DESC = "signature_desc";
+
+  /**
+   * Process one GFF feature line (as modelled by SequenceFeature)
+   * 
+   * @param seq
+   *          the sequence with which this feature is associated
+   * @param gff
+   *          the gff column data
+   * @param align
+   *          the alignment we are adding GFF to
+   * @param newseqs
+   *          any new sequences referenced by the GFF
+   * @param relaxedIdMatching
+   *          if true, match word tokens in sequence names
+   * @return a sequence feature if one should be added to the sequence, else
+   *         null (i.e. it has been processed in another way e.g. to generate a
+   *         mapping)
+   * @throws IOException
+   */
+  @Override
+  public SequenceFeature processGff(SequenceI seq, String[] gff,
+          AlignmentI align, List<SequenceI> newseqs,
+          boolean relaxedIdMatching) throws IOException
+  {
+    /*
+     * ignore the 'polypeptide' match of the whole sequence
+     */
+    if (".".equals(gff[SOURCE_COL]))
+    {
+      return null;
+    }
+
+    return super.processGff(seq, gff, align, newseqs, relaxedIdMatching);
+  }
+
+  /**
+ * 
+ */
+  @Override
+  protected SequenceFeature buildSequenceFeature(String[] gff,
+          Map<String, List<String>> attributes)
+  {
+    SequenceFeature sf = super.buildSequenceFeature(gff, attributes);
+
+    /*
+     * signature_desc is a more informative source of description
+     */
+    List<String> desc = attributes.get(SIGNATURE_DESC);
+    String description = StringUtils.listToDelimitedString(desc, ", ");
+    if (description.length() > 0)
+    {
+      sf.setDescription(description);
+    }
+
+    /*
+     * Set sequence feature group as 'InterProScan', and type as the source
+     * database for this match (e.g. 'Pfam')
+     */
+    sf.setType(gff[SOURCE_COL]);
+    sf.setFeatureGroup(INTER_PRO_SCAN);
+
+    return sf;
+  }
+
+  /**
+   * Tests whether the GFF data looks like it was generated by InterProScan
+   * 
+   * @param columns
+   * @return
+   */
+  public static boolean recognises(String[] columns)
+  {
+    SequenceOntologyI so = SequenceOntologyFactory.getInstance();
+    String type = columns[TYPE_COL];
+    if (so.isA(type, SequenceOntologyI.PROTEIN_MATCH)
+            || (".".equals(columns[SOURCE_COL]) && so.isA(type,
+                    SequenceOntologyI.POLYPEPTIDE)))
+    {
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Overriden method, because InterProScan GFF has the target sequence id in
+   * GFF field 'ID' rather than the usual 'Target' :-O
+   */
+  @Override
+  protected String findTargetId(String target, Map<String, List<String>> set)
+  {
+    List<String> ids = set.get(ID);
+    if (ids == null || ids.size() != 1)
+    {
+      return null;
+    }
+    return ids.get(0);
+  }
+
+}
diff --git a/src/jalview/io/gff/SequenceOntologyFactory.java b/src/jalview/io/gff/SequenceOntologyFactory.java
new file mode 100644 (file)
index 0000000..3eaa5d1
--- /dev/null
@@ -0,0 +1,21 @@
+package jalview.io.gff;
+
+public class SequenceOntologyFactory
+{
+  private static SequenceOntologyI instance;
+
+  public static synchronized SequenceOntologyI getInstance()
+  {
+    if (instance == null)
+    {
+      // instance = new SequenceOntology();
+      instance = new SequenceOntologyLite();
+    }
+    return instance;
+  }
+
+  public static void setInstance(SequenceOntologyI so)
+  {
+    instance = so;
+  }
+}
diff --git a/src/jalview/io/gff/SequenceOntologyI.java b/src/jalview/io/gff/SequenceOntologyI.java
new file mode 100644 (file)
index 0000000..c7a5baa
--- /dev/null
@@ -0,0 +1,60 @@
+package jalview.io.gff;
+
+import java.util.List;
+
+public interface SequenceOntologyI
+{
+  /*
+   * selected commonly used values for quick reference
+   */
+  // SO:0000104
+  public static final String POLYPEPTIDE = "polypeptide";
+
+  // SO:0000349
+  public static final String PROTEIN_MATCH = "protein_match";
+
+  // SO:0000347
+  public static final String NUCLEOTIDE_MATCH = "nucleotide_match";
+
+  // SO:0000316
+  public static final String CDS = "CDS";
+
+  // SO:0001060
+  public static final String SEQUENCE_VARIANT = "sequence_variant";
+
+  // SO:0000147
+  public static final String EXON = "exon";
+
+  // SO:0000673
+  public static final String TRANSCRIPT = "transcript";
+
+  // SO:0001621 isA sequence_variant but used in Ensembl as a transcript
+  public static final String NMD_TRANSCRIPT_VARIANT = "NMD_transcript_variant";
+
+  // SO:0000704
+  public static final String GENE = "gene";
+
+  public boolean isA(String childTerm, String parentTerm);
+
+  /**
+   * Returns a sorted list of all valid terms queried for (i.e. terms processed
+   * which were valid in the SO), using the friendly description.
+   * 
+   * This can be used to check that any hard-coded stand-in for the full SO
+   * includes all the terms needed for correct processing.
+   * 
+   * @return
+   */
+  public List<String> termsFound();
+
+  /**
+   * Returns a sorted list of all invalid terms queried for (i.e. terms
+   * processed which were not found in the SO), using the friendly description.
+   * 
+   * This can be used to report any 'non-compliance' in data, and/or to report
+   * valid terms missing from any hard-coded stand-in for the full SO.
+   * 
+   * @return
+   */
+  public List<String> termsNotFound();
+}
diff --git a/src/jalview/io/gff/SequenceOntologyLite.java b/src/jalview/io/gff/SequenceOntologyLite.java
new file mode 100644 (file)
index 0000000..b3f8161
--- /dev/null
@@ -0,0 +1,216 @@
+package jalview.io.gff;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * An implementation of SequenceOntologyI that hard codes terms of interest.
+ *
+ * Use this in unit testing by calling SequenceOntology.setInstance(new
+ * SequenceOntologyLite()).
+ * 
+ * May also become a stand-in for SequenceOntology in the applet if we want to
+ * avoid the additional jars needed for parsing the full SO.
+ * 
+ * @author gmcarstairs
+ *
+ */
+public class SequenceOntologyLite implements SequenceOntologyI
+{
+  /*
+   * initial selection of types of interest when processing Ensembl features
+   * NB unlike the full SequenceOntology we don't traverse indirect
+   * child-parent relationships here so e.g. need to list every sub-type
+   * of gene (direct or indirect) that is of interest
+   */
+  // @formatter:off
+  private final String[][] TERMS = new String[][] {
+
+    /*
+     * gene sub-types:
+     */
+    { "gene", "gene" }, 
+    { "ncRNA_gene", "gene" }, 
+    { "snRNA_gene", "gene" },
+    { "miRNA_gene", "gene" },
+    { "lincRNA_gene", "gene" },
+    { "rRNA_gene", "gene" },
+    
+    /*
+     * transcript sub-types:
+     */
+    { "transcript", "transcript" }, 
+    { "mature_transcript", "transcript" }, 
+    { "processed_transcript", "transcript" }, 
+    { "aberrant_processed_transcript", "transcript" },
+    { "ncRNA", "transcript" },
+    { "snRNA", "transcript" },
+    { "miRNA", "transcript" },
+    { "lincRNA", "transcript" },
+    { "rRNA", "transcript" },
+    // there are many more sub-types of ncRNA...
+    
+    /*
+     * sequence_variant sub-types:
+     */
+    { "sequence_variant", "sequence_variant" },
+    { "feature_variant", "sequence_variant" },
+    { "gene_variant", "sequence_variant" },
+    // NB Ensembl uses NMD_transcript_variant as if a 'transcript'
+    // but we model it here correctly as per the SO
+    { "NMD_transcript_variant", "sequence_variant" },
+    { "transcript_variant", "sequence_variant" },
+    { "structural_variant", "sequence_variant" },
+    
+    /*
+     * no sub-types of exon or CDS yet seen in Ensembl
+     * some added here for testing purposes
+     */
+    { "exon", "exon" },
+    { "coding_exon", "exon" },
+    { "CDS", "CDS" },
+    { "CDS_predicted", "CDS" },
+    
+    /*
+     * terms used in exonerate or PASA GFF
+     */
+    { "protein_match", "protein_match"},
+    { "nucleotide_match", "nucleotide_match"},
+    { "cDNA_match", "nucleotide_match"},
+    
+    /*
+     * used in InterProScan GFF
+     */
+    { "polypeptide", "polypeptide" }
+  };
+  // @formatter:on
+
+  /*
+   * hard-coded list of any parents (direct or indirect) 
+   * that we care about for a term
+   */
+  private Map<String, List<String>> parents;
+
+  private List<String> termsFound;
+
+  private List<String> termsNotFound;
+
+  public SequenceOntologyLite()
+  {
+    termsFound = new ArrayList<String>();
+    termsNotFound = new ArrayList<String>();
+    loadStaticData();
+  }
+
+  /**
+   * Loads hard-coded data into a lookup table of {term, {list_of_parents}}
+   */
+  private void loadStaticData()
+  {
+    parents = new HashMap<String, List<String>>();
+    for (String [] pair : TERMS) {
+      List<String> p = parents.get(pair[0]);
+      if (p == null)
+      {
+        p = new ArrayList<String>();
+        parents.put(pair[0], p);
+      }
+      p.add(pair[1]);
+    }
+  }
+
+  /**
+   * Answers true if 'child' isA 'parent' (including equality). In this
+   * implementation, based only on hard-coded values.
+   */
+  @Override
+  public boolean isA(String child, String parent)
+  {
+    if (child == null || parent == null)
+    {
+      return false;
+    }
+    if (child.equals(parent))
+    {
+      termFound(child);
+      return true;
+    }
+
+    List<String> p = parents.get(child);
+    if (p == null)
+    {
+      termNotFound(child);
+      return false;
+    }
+    termFound(child);
+    if (p.contains(parent))
+    {
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Records a valid term queried for, for reporting purposes
+   * 
+   * @param term
+   */
+  private void termFound(String term)
+  {
+    if (!termsFound.contains(term))
+    {
+      synchronized (termsFound)
+      {
+        termsFound.add(term);
+      }
+    }
+  }
+
+  /**
+   * Records an invalid term queried for, for reporting purposes
+   * 
+   * @param term
+   */
+  private void termNotFound(String term)
+  {
+    synchronized (termsNotFound)
+    {
+      if (!termsNotFound.contains(term))
+      {
+        System.out.println("SO term " + term
+                + " not known - may be invalid, or model if needed in "
+                + getClass().getName());
+        termsNotFound.add(term);
+      }
+    }
+  }
+
+  /**
+   * Sorts (case-insensitive) and returns the list of valid terms queried for
+   */
+  @Override
+  public List<String> termsFound()
+  {
+    synchronized (termsFound)
+    {
+      Collections.sort(termsFound, String.CASE_INSENSITIVE_ORDER);
+      return termsFound;
+    }
+  }
+
+  /**
+   * Sorts (case-insensitive) and returns the list of invalid terms queried for
+   */
+  @Override
+  public List<String> termsNotFound()
+  {
+    synchronized (termsNotFound)
+    {
+      Collections.sort(termsNotFound, String.CASE_INSENSITIVE_ORDER);
+      return termsNotFound;
+    }
+  }
+}
index d613796..63263d2 100644 (file)
  */
 package jalview.io.packed;
 
+import jalview.api.FeatureColourI;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.SequenceI;
 import jalview.io.NewickFile;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.Hashtable;
 import java.util.List;
+import java.util.Map;
 
 public class JalviewDataset
 {
@@ -55,7 +58,7 @@ public class JalviewDataset
   /**
    * @return the featureColours
    */
-  public Hashtable getFeatureColours()
+  public Map<String, FeatureColourI> getFeatureColours()
   {
     return featureColours;
   }
@@ -64,7 +67,7 @@ public class JalviewDataset
    * @param featureColours
    *          the featureColours to set
    */
-  public void setFeatureColours(Hashtable featureColours)
+  public void setFeatureColours(Map<String, FeatureColourI> featureColours)
   {
     this.featureColours = featureColours;
   }
@@ -185,7 +188,7 @@ public class JalviewDataset
   /**
    * current set of feature colours
    */
-  Hashtable featureColours;
+  Map<String, FeatureColourI> featureColours;
 
   /**
    * original identity of each sequence in results
@@ -199,7 +202,7 @@ public class JalviewDataset
     seqDetails = new Hashtable();
     al = new ArrayList<AlignmentSet>();
     parentDataset = null;
-    featureColours = new Hashtable();
+    featureColours = new HashMap<String, FeatureColourI>();
   }
 
   /**
@@ -207,9 +210,11 @@ public class JalviewDataset
    * 
    * @param parentAlignment
    */
-  public JalviewDataset(AlignmentI aldataset, Hashtable fc,
+  public JalviewDataset(AlignmentI aldataset,
+          Map<String, FeatureColourI> fc,
           Hashtable seqDets)
   {
+    // TODO not used - remove?
     this(aldataset, fc, seqDets, null);
   }
 
@@ -228,7 +233,8 @@ public class JalviewDataset
    *          (may be null) alignment to associate new annotation and trees
    *          with.
    */
-  public JalviewDataset(AlignmentI aldataset, Hashtable fc,
+  public JalviewDataset(AlignmentI aldataset,
+          Map<String, FeatureColourI> fc,
           Hashtable seqDets, AlignmentI parentAlignment)
   {
     this();
index a4ef77e..71999f0 100644 (file)
@@ -20,6 +20,7 @@
  */
 package jalview.io.packed;
 
+import jalview.api.FeatureColourI;
 import jalview.datamodel.AlignmentI;
 import jalview.io.AppletFormatAdapter;
 import jalview.io.FileParse;
@@ -30,7 +31,7 @@ import jalview.io.packed.DataProvider.JvDataType;
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Hashtable;
+import java.util.HashMap;
 import java.util.List;
 
 public class ParsePackedSet
@@ -66,7 +67,7 @@ public class ParsePackedSet
         String fmt = null;
         try
         {
-          fmt = new IdentifyFile().Identify(src, false);
+          fmt = new IdentifyFile().identify(src, false);
         } catch (Exception ex)
         {
           exerror = ex;
@@ -157,7 +158,7 @@ public class ParsePackedSet
         // if not, create one.
         if (context.featureColours == null)
         {
-          context.featureColours = new Hashtable();
+          context.featureColours = new HashMap<String, FeatureColourI>();
         }
         try
         {
index 6e93f45..61491b2 100644 (file)
@@ -27,6 +27,7 @@ import jalview.io.VamsasAppDatastore;
 import jalview.util.UrlLink;
 
 import java.util.Enumeration;
+import java.util.Iterator;
 import java.util.Vector;
 
 import uk.ac.vamsas.objects.core.DataSetAnnotations;
@@ -71,6 +72,7 @@ public class Sequencefeature extends Rangetype
     doJvUpdate();
   }
 
+  @Override
   public void addToDocument()
   {
     DataSetAnnotations dsa = (DataSetAnnotations) vobj;
@@ -89,6 +91,7 @@ public class Sequencefeature extends Rangetype
     dataset.addDataSetAnnotations(dsa);
   }
 
+  @Override
   public void addFromDocument()
   {
     DataSetAnnotations dsa = (DataSetAnnotations) vobj;
@@ -106,6 +109,7 @@ public class Sequencefeature extends Rangetype
     bindjvvobj(sf, dsa);
   }
 
+  @Override
   public void conflict()
   {
     log.warn("Untested sequencefeature conflict code");
@@ -118,6 +122,7 @@ public class Sequencefeature extends Rangetype
     addToDocument(); // and create a new feature in the document
   }
 
+  @Override
   public void updateToDoc()
   {
     DataSetAnnotations dsa = (DataSetAnnotations) vobj;
@@ -144,6 +149,7 @@ public class Sequencefeature extends Rangetype
 
   }
 
+  @Override
   public void updateFromDoc()
   {
     DataSetAnnotations dsa = (DataSetAnnotations) vobj;
@@ -229,11 +235,11 @@ public class Sequencefeature extends Rangetype
     }
     if (feature.otherDetails != null)
     {
-      Enumeration iter = feature.otherDetails.keys();
+      Iterator<String> iter = feature.otherDetails.keySet().iterator();
       Vector props = dsa.getPropertyAsReference();
-      while (iter.hasMoreElements())
+      while (iter.hasNext())
       {
-        String key = (String) iter.nextElement();
+        String key = iter.next();
         if (!key.equalsIgnoreCase("score")
                 && !key.equalsIgnoreCase("status"))
         {
index 73d34c2..b2eb094 100755 (executable)
@@ -55,7 +55,6 @@ import javax.swing.JPanel;
 import javax.swing.JRadioButtonMenuItem;
 import javax.swing.JTabbedPane;
 import javax.swing.KeyStroke;
-import javax.swing.SwingUtilities;
 import javax.swing.event.ChangeEvent;
 import javax.swing.event.MenuEvent;
 import javax.swing.event.MenuListener;
@@ -173,8 +172,14 @@ public class GAlignFrame extends JInternalFrame
 
   protected JMenuItem showTranslation = new JMenuItem();
 
+  protected JMenuItem showReverse = new JMenuItem();
+
+  protected JMenuItem showReverseComplement = new JMenuItem();
+
   protected JMenu showProducts = new JMenu();
 
+  protected JMenuItem runGroovy = new JMenuItem();
+
   protected JMenuItem rnahelicesColour = new JMenuItem();
 
   protected JCheckBoxMenuItem autoCalculate = new JCheckBoxMenuItem();
@@ -289,8 +294,7 @@ public class GAlignFrame extends JInternalFrame
           @Override
           public void mousePressed(MouseEvent evt)
           {
-            if (evt.isControlDown()
-                    || SwingUtilities.isRightMouseButton(evt))
+            if (evt.isPopupTrigger())
             {
               radioItem.removeActionListener(radioItem.getActionListeners()[0]);
 
@@ -1686,6 +1690,25 @@ public class GAlignFrame extends JInternalFrame
         showTranslation_actionPerformed(e);
       }
     });
+    showReverse.setText(MessageManager.getString("label.reverse"));
+    showReverse.addActionListener(new ActionListener()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        showReverse_actionPerformed(false);
+      }
+    });
+    showReverseComplement.setText(MessageManager
+            .getString("label.reverse_complement"));
+    showReverseComplement.addActionListener(new ActionListener()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        showReverse_actionPerformed(true);
+      }
+    });
 
     JMenuItem extractScores = new JMenuItem(
             MessageManager.getString("label.extract_scores"));
@@ -1703,6 +1726,17 @@ public class GAlignFrame extends JInternalFrame
     // for show products actions see AlignFrame.canShowProducts
     showProducts.setText(MessageManager.getString("label.get_cross_refs"));
 
+    runGroovy.setText(MessageManager.getString("label.run_groovy"));
+    runGroovy.setToolTipText(MessageManager.getString("label.run_groovy_tip"));
+    runGroovy.addActionListener(new ActionListener()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        runGroovy_actionPerformed();
+      }
+    });
+
     JMenuItem openFeatureSettings = new JMenuItem(
             MessageManager.getString("action.feature_settings"));
     openFeatureSettings.addActionListener(new ActionListener()
@@ -2137,6 +2171,7 @@ public class GAlignFrame extends JInternalFrame
     alignFrameMenuBar.add(colourMenu);
     alignFrameMenuBar.add(calculateMenu);
     alignFrameMenuBar.add(webService);
+
     fileMenu.add(fetchSequence);
     fileMenu.add(addSequenceMenu);
     fileMenu.add(reload);
@@ -2155,6 +2190,9 @@ public class GAlignFrame extends JInternalFrame
     fileMenu.add(associatedData);
     fileMenu.addSeparator();
     fileMenu.add(closeMenuItem);
+
+    pasteMenu.add(pasteNew);
+    pasteMenu.add(pasteThis);
     editMenu.add(undoMenuItem);
     editMenu.add(redoMenuItem);
     editMenu.add(cut);
@@ -2175,6 +2213,13 @@ public class GAlignFrame extends JInternalFrame
     // editMenu.addSeparator();
     editMenu.add(padGapsMenuitem);
 
+    showMenu.add(showAllColumns);
+    showMenu.add(showAllSeqs);
+    showMenu.add(showAllhidden);
+    hideMenu.add(hideSelColumns);
+    hideMenu.add(hideSelSequences);
+    hideMenu.add(hideAllSelection);
+    hideMenu.add(hideAllButSelection);
     viewMenu.add(newView);
     viewMenu.add(expandViews);
     viewMenu.add(gatherViews);
@@ -2245,6 +2290,12 @@ public class GAlignFrame extends JInternalFrame
     colourMenu.add(modifyPID);
     colourMenu.add(annotationColour);
     colourMenu.add(rnahelicesColour);
+
+    sort.add(sortIDMenuItem);
+    sort.add(sortLengthMenuItem);
+    sort.add(sortGroupMenuItem);
+    sort.add(sortPairwiseMenuItem);
+    sort.add(sortByTreeMenu);
     calculateMenu.add(sort);
     calculateMenu.add(calculateTree);
     calculateMenu.addSeparator();
@@ -2252,21 +2303,20 @@ public class GAlignFrame extends JInternalFrame
     calculateMenu.add(PCAMenuItem);
     calculateMenu.addSeparator();
     calculateMenu.add(showTranslation);
+    calculateMenu.add(showReverse);
+    calculateMenu.add(showReverseComplement);
     calculateMenu.add(showProducts);
     calculateMenu.add(autoCalculate);
     calculateMenu.add(sortByTree);
     calculateMenu.addSeparator();
+    calculateMenu.add(expandAlignment);
     calculateMenu.add(extractScores);
+    calculateMenu.addSeparator();
+    calculateMenu.add(runGroovy);
+
     webServiceNoServices = new JMenuItem(
             MessageManager.getString("label.no_services"));
     webService.add(webServiceNoServices);
-    pasteMenu.add(pasteNew);
-    pasteMenu.add(pasteThis);
-    sort.add(sortIDMenuItem);
-    sort.add(sortLengthMenuItem);
-    sort.add(sortGroupMenuItem);
-    sort.add(sortPairwiseMenuItem);
-    sort.add(sortByTreeMenu);
     exportImageMenu.add(htmlMenuItem);
     exportImageMenu.add(epsFile);
     exportImageMenu.add(createPNG);
@@ -2278,13 +2328,6 @@ public class GAlignFrame extends JInternalFrame
     this.getContentPane().add(statusPanel, java.awt.BorderLayout.SOUTH);
     statusPanel.add(statusBar, null);
     this.getContentPane().add(tabbedPane, java.awt.BorderLayout.CENTER);
-    showMenu.add(showAllColumns);
-    showMenu.add(showAllSeqs);
-    showMenu.add(showAllhidden);
-    hideMenu.add(hideSelColumns);
-    hideMenu.add(hideSelSequences);
-    hideMenu.add(hideAllSelection);
-    hideMenu.add(hideAllButSelection);
 
     formatMenu.add(font);
     formatMenu.addSeparator();
@@ -2312,7 +2355,6 @@ public class GAlignFrame extends JInternalFrame
     selectMenu.add(grpsFromSelection);
     selectMenu.add(deleteGroups);
     selectMenu.add(annotationColumn);
-    calculateMenu.add(expandAlignment);
     // TODO - determine if the listenToViewSelections button is needed : see bug
     // JAL-574
     // selectMenu.addSeparator();
@@ -2320,6 +2362,24 @@ public class GAlignFrame extends JInternalFrame
   }
 
   /**
+   * Generate the reverse sequence (or reverse complement if the flag is true)
+   * and add it to the alignment
+   * 
+   * @param complement
+   */
+  protected void showReverse_actionPerformed(boolean complement)
+  {
+  }
+
+  /**
+   * Try to run script in a Groovy console, having first ensured that this
+   * alignframe is set as currentAlignFrame in Desktop
+   */
+  protected void runGroovy_actionPerformed()
+  {
+
+  }
+  /**
    * Adds the given action listener and key accelerator to the given menu item.
    * Also saves in a lookup table to support lookup of action by key stroke.
    * 
@@ -3107,7 +3167,7 @@ public class GAlignFrame extends JInternalFrame
     return this.splitFrame;
   }
 
-  protected void showComplement_actionPerformed(boolean state)
+  protected void showComplement_actionPerformed(boolean complement)
   {
   }
 }
diff --git a/src/jalview/jbgui/GPDBSearchPanel.java b/src/jalview/jbgui/GPDBSearchPanel.java
deleted file mode 100644 (file)
index a105999..0000000
+++ /dev/null
@@ -1,464 +0,0 @@
-/*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2)
- * Copyright (C) 2014 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 <http://www.gnu.org/licenses/>.
- * The Jalview Authors are detailed in the 'AUTHORS' file.
- */
-
-package jalview.jbgui;
-
-import jalview.gui.Desktop;
-import jalview.gui.JvSwingUtils;
-import jalview.jbgui.PDBDocFieldPreferences.PreferenceSource;
-import jalview.util.MessageManager;
-import jalview.ws.dbsources.PDBRestClient.PDBDocField;
-
-import java.awt.BorderLayout;
-import java.awt.Dimension;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.KeyAdapter;
-import java.awt.event.KeyEvent;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-import java.util.Arrays;
-
-import javax.swing.ImageIcon;
-import javax.swing.JButton;
-import javax.swing.JComboBox;
-import javax.swing.JFrame;
-import javax.swing.JInternalFrame;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JTabbedPane;
-import javax.swing.JTable;
-import javax.swing.JTextField;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
-import javax.swing.event.DocumentEvent;
-import javax.swing.event.DocumentListener;
-
-/**
- * GUI layout for PDB Fetch Panel
- * 
- * @author tcnofoegbu
- *
- */
-@SuppressWarnings("serial")
-public abstract class GPDBSearchPanel extends JPanel
-{
-  protected String frameTitle = MessageManager
-          .getString("label.pdb_sequence_getcher");
-
-  protected JInternalFrame mainFrame = new JInternalFrame(frameTitle);
-
-  protected JComboBox<PDBDocField> cmb_searchTarget = new JComboBox<PDBDocField>();
-
-  protected JButton btn_ok = new JButton();
-
-  protected JButton btn_back = new JButton();
-
-  protected JButton btn_cancel = new JButton();
-
-  protected JTextField txt_search = new JTextField(20);
-
-  protected JTable tbl_summary = new JTable()
-  {
-    public String getToolTipText(MouseEvent evt)
-    {
-      String toolTipText = null;
-      java.awt.Point pnt = evt.getPoint();
-      int rowIndex = rowAtPoint(pnt);
-      int colIndex = columnAtPoint(pnt);
-
-      try
-      {
-        toolTipText = getValueAt(rowIndex, colIndex).toString();
-      } catch (Exception e)
-      {
-        e.printStackTrace();
-      }
-      toolTipText = (toolTipText == null ? null
-              : (toolTipText.length() > 500 ? JvSwingUtils.wrapTooltip(
-                      true, toolTipText.subSequence(0, 500) + "...")
-                      : JvSwingUtils.wrapTooltip(true, toolTipText)));
-
-      return toolTipText;
-    }
-  };
-
-  protected StringBuilder errorWarning = new StringBuilder();
-
-  protected JScrollPane scrl_searchResult = new JScrollPane(tbl_summary);
-
-  protected ImageIcon warningImage = new ImageIcon(getClass().getResource(
-          "/images/warning.gif"));
-
-  protected ImageIcon loadingImage = new ImageIcon(getClass().getResource(
-          "/images/loading.gif"));
-
-  protected JLabel lbl_warning = new JLabel(warningImage);
-
-  protected JLabel lbl_loading = new JLabel(loadingImage);
-
-  private JTabbedPane tabbedPane = new JTabbedPane();
-
-  private PDBDocFieldPreferences pdbDocFieldPrefs = new PDBDocFieldPreferences(
-          PreferenceSource.SEARCH_SUMMARY);
-
-  private JPanel pnl_actions = new JPanel();
-
-  private JPanel pnl_results = new JPanel();
-
-  private JPanel pnl_inputs = new JPanel();
-
-  private BorderLayout mainLayout = new BorderLayout();
-
-  protected PDBDocField[] previousWantedFields;
-
-  public GPDBSearchPanel()
-  {
-    try
-    {
-      jbInit();
-      mainFrame.invalidate();
-      mainFrame.pack();
-    } catch (Exception e)
-    {
-      e.printStackTrace();
-    }
-  }
-
-  /**
-   * Initializes the GUI default properties
-   * 
-   * @throws Exception
-   */
-  private void jbInit() throws Exception
-  {
-    lbl_warning.setVisible(false);
-    lbl_warning.setFont(new java.awt.Font("Verdana", 0, 12));
-    lbl_loading.setVisible(false);
-    lbl_loading.setFont(new java.awt.Font("Verdana", 0, 12));
-
-    tbl_summary.setAutoCreateRowSorter(true);
-    tbl_summary.getTableHeader().setReorderingAllowed(false);
-    tbl_summary.addMouseListener(new MouseAdapter()
-    {
-      public void mouseClicked(MouseEvent e)
-      {
-        validateSelection();
-      }
-
-      public void mouseReleased(MouseEvent e)
-      {
-        validateSelection();
-      }
-    });
-    tbl_summary.addKeyListener(new KeyAdapter()
-    {
-      @Override
-      public void keyPressed(KeyEvent evt)
-      {
-        validateSelection();
-        switch (evt.getKeyCode())
-        {
-        case KeyEvent.VK_ESCAPE: // escape key
-          btn_back_ActionPerformed();
-          break;
-        case KeyEvent.VK_ENTER: // enter key
-          if (btn_ok.isEnabled())
-          {
-            btn_ok_ActionPerformed();
-          }
-          evt.consume();
-          break;
-        case KeyEvent.VK_TAB: // tab key
-          if (evt.isShiftDown())
-          {
-            tabbedPane.requestFocus();
-          }
-          else
-          {
-            btn_back.requestFocus();
-          }
-          evt.consume();
-          break;
-        default:
-          return;
-        }
-      }
-    });
-
-    btn_back.setFont(new java.awt.Font("Verdana", 0, 12));
-    btn_back.setText(MessageManager.getString("action.back"));
-    btn_back.addActionListener(new java.awt.event.ActionListener()
-    {
-      public void actionPerformed(ActionEvent e)
-      {
-        btn_back_ActionPerformed();
-      }
-    });
-    btn_back.addKeyListener(new KeyAdapter()
-    {
-      @Override
-      public void keyPressed(KeyEvent evt)
-      {
-        if (evt.getKeyCode() == KeyEvent.VK_ENTER)
-        {
-          btn_back_ActionPerformed();
-        }
-      }
-    });
-
-    btn_ok.setEnabled(false);
-    btn_ok.setFont(new java.awt.Font("Verdana", 0, 12));
-    btn_ok.setText(MessageManager.getString("action.ok"));
-    btn_ok.addActionListener(new java.awt.event.ActionListener()
-    {
-      public void actionPerformed(ActionEvent e)
-      {
-        btn_ok_ActionPerformed();
-      }
-    });
-    btn_ok.addKeyListener(new KeyAdapter()
-    {
-      @Override
-      public void keyPressed(KeyEvent evt)
-      {
-        if (evt.getKeyCode() == KeyEvent.VK_ENTER)
-        {
-          btn_ok_ActionPerformed();
-        }
-      }
-    });
-
-    btn_cancel.setFont(new java.awt.Font("Verdana", 0, 12));
-    btn_cancel.setText(MessageManager.getString("action.cancel"));
-    btn_cancel.addActionListener(new java.awt.event.ActionListener()
-    {
-      public void actionPerformed(ActionEvent e)
-      {
-        btn_cancel_ActionPerformed();
-      }
-    });
-    btn_cancel.addKeyListener(new KeyAdapter()
-    {
-      @Override
-      public void keyPressed(KeyEvent evt)
-      {
-        if (evt.getKeyCode() == KeyEvent.VK_ENTER)
-        {
-          btn_cancel_ActionPerformed();
-        }
-      }
-    });
-
-    scrl_searchResult.setPreferredSize(new Dimension(500, 300));
-    scrl_searchResult
-            .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
-
-    cmb_searchTarget.setFont(new java.awt.Font("Verdana", 0, 12));
-    cmb_searchTarget.addActionListener(new ActionListener()
-    {
-      @Override
-      public void actionPerformed(ActionEvent e)
-      {
-        String tooltipText;
-        if ("all".equalsIgnoreCase(getCmbSearchTarget().getSelectedItem()
-                .toString()))
-        {
-          tooltipText = MessageManager.getString("label.search_all");
-        }
-        else if ("pdb id".equalsIgnoreCase(getCmbSearchTarget()
-                .getSelectedItem().toString()))
-        {
-          tooltipText = MessageManager
-                  .getString("label.separate_multiple_accession_ids");
-        }
-        else
-        {
-          tooltipText = MessageManager.formatMessage(
-                  "label.separate_multiple_query_values",
-                  new Object[] { getCmbSearchTarget().getSelectedItem()
-                          .toString() });
-        }
-        txt_search.setToolTipText(JvSwingUtils.wrapTooltip(true,
-                tooltipText));
-        txt_search_ActionPerformed();
-      }
-    });
-
-    populateCmbSearchTargetOptions();
-
-    txt_search.setFont(new java.awt.Font("Verdana", 0, 12));
-
-    txt_search.addKeyListener(new KeyAdapter()
-    {
-      @Override
-      public void keyPressed(KeyEvent e)
-      {
-        if (e.getKeyCode() == KeyEvent.VK_ENTER)
-        {
-          if (txt_search.getText() == null
-                  || txt_search.getText().isEmpty())
-          {
-            return;
-          }
-          if ("pdb id".equalsIgnoreCase(getCmbSearchTarget()
-                  .getSelectedItem().toString()))
-          {
-            transferToSequenceFetcher(txt_search.getText());
-          }
-        }
-      }
-    });
-
-    txt_search.getDocument().addDocumentListener(new DocumentListener()
-    {
-      @Override
-      public void insertUpdate(DocumentEvent e)
-      {
-        txt_search_ActionPerformed();
-      }
-
-      @Override
-      public void removeUpdate(DocumentEvent e)
-      {
-        txt_search_ActionPerformed();
-      }
-
-      @Override
-      public void changedUpdate(DocumentEvent e)
-      {
-        txt_search_ActionPerformed();
-      }
-    });
-
-    final String searchTabTitle = MessageManager
-            .getString("label.search_result");
-    final String configureCols = MessageManager
-            .getString("label.configure_displayed_columns");
-    ChangeListener changeListener = new ChangeListener()
-    {
-      public void stateChanged(ChangeEvent changeEvent)
-      {
-        JTabbedPane sourceTabbedPane = (JTabbedPane) changeEvent
-                .getSource();
-        int index = sourceTabbedPane.getSelectedIndex();
-        if (sourceTabbedPane.getTitleAt(index).equals(configureCols))
-        {
-          btn_back.setEnabled(false);
-          btn_cancel.setEnabled(false);
-          btn_ok.setEnabled(false);
-          previousWantedFields = PDBDocFieldPreferences
-                  .getSearchSummaryFields().toArray(new PDBDocField[0]);
-        }
-        if (sourceTabbedPane.getTitleAt(index).equals(searchTabTitle))
-        {
-          btn_back.setEnabled(true);
-          btn_cancel.setEnabled(true);
-          if (wantedFieldsUpdated())
-          {
-            txt_search_ActionPerformed();
-          }
-          else
-          {
-            validateSelection();
-          }
-        }
-      }
-    };
-    tabbedPane.addChangeListener(changeListener);
-    tabbedPane.setPreferredSize(new Dimension(500, 300));
-    tabbedPane.add(searchTabTitle, scrl_searchResult);
-    tabbedPane.add(configureCols, pdbDocFieldPrefs);
-
-    pnl_actions.add(btn_back);
-    pnl_actions.add(btn_ok);
-    pnl_actions.add(btn_cancel);
-
-    pnl_results.add(tabbedPane);
-    pnl_inputs.add(cmb_searchTarget);
-    pnl_inputs.add(txt_search);
-    pnl_inputs.add(lbl_loading);
-    pnl_inputs.add(lbl_warning);
-
-    this.setLayout(mainLayout);
-    this.add(pnl_inputs, java.awt.BorderLayout.NORTH);
-    this.add(pnl_results, java.awt.BorderLayout.CENTER);
-    this.add(pnl_actions, java.awt.BorderLayout.SOUTH);
-    mainFrame.setVisible(true);
-    mainFrame.setContentPane(this);
-    mainFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
-    Desktop.addInternalFrame(mainFrame, frameTitle, 800, 400);
-  }
-
-  public boolean wantedFieldsUpdated()
-  {
-    if (previousWantedFields == null)
-    {
-      return true;
-    }
-
-    return Arrays.equals(PDBDocFieldPreferences.getSearchSummaryFields()
-            .toArray(new PDBDocField[0]), previousWantedFields) ? false
-            : true;
-
-  }
-
-  public void validateSelection()
-  {
-    if (tbl_summary.getSelectedRows().length > 0)
-    {
-      btn_ok.setEnabled(true);
-    }
-    else
-    {
-      btn_ok.setEnabled(false);
-    }
-  }
-
-  public JComboBox<PDBDocField> getCmbSearchTarget()
-  {
-    return cmb_searchTarget;
-  }
-
-  public JTextField getTxtSearch()
-  {
-    return txt_search;
-  }
-
-  public JInternalFrame getMainFrame()
-  {
-    return mainFrame;
-  }
-
-  public abstract void transferToSequenceFetcher(String ids);
-
-  public abstract void txt_search_ActionPerformed();
-
-  public abstract void btn_ok_ActionPerformed();
-
-  public abstract void btn_back_ActionPerformed();
-
-  public abstract void btn_cancel_ActionPerformed();
-
-  public abstract void populateCmbSearchTargetOptions();
-
-}
index b5c1804..c4c737c 100755 (executable)
  */
 package jalview.jbgui;
 
+import jalview.fts.core.FTSDataColumnPreferences;
+import jalview.fts.core.FTSDataColumnPreferences.PreferenceSource;
+import jalview.fts.service.pdb.PDBFTSRestClient;
 import jalview.gui.JvSwingUtils;
 import jalview.gui.StructureViewer.ViewerType;
-import jalview.jbgui.PDBDocFieldPreferences.PreferenceSource;
 import jalview.util.MessageManager;
 
 import java.awt.BorderLayout;
@@ -899,8 +901,8 @@ public class GPreferences extends JPanel
 
     ypos += lineSpacing;
     ypos += lineSpacing;
-    PDBDocFieldPreferences docFieldPref = new PDBDocFieldPreferences(
-            PreferenceSource.PREFERENCES);
+    FTSDataColumnPreferences docFieldPref = new FTSDataColumnPreferences(
+            PreferenceSource.PREFERENCES, PDBFTSRestClient.getInstance());
     docFieldPref.setBounds(new Rectangle(10, ypos, 450, 120));
     structureTab.add(docFieldPref);
 
index d8cff06..a1aa0d3 100644 (file)
 package jalview.jbgui;
 
 import jalview.datamodel.SequenceI;
+import jalview.fts.api.FTSDataColumnI;
+import jalview.fts.core.FTSDataColumnPreferences;
+import jalview.fts.core.FTSDataColumnPreferences.PreferenceSource;
+import jalview.fts.service.pdb.PDBFTSRestClient;
 import jalview.gui.AlignmentPanel;
 import jalview.gui.Desktop;
 import jalview.gui.JvSwingUtils;
-import jalview.jbgui.PDBDocFieldPreferences.PreferenceSource;
 import jalview.util.MessageManager;
-import jalview.ws.dbsources.PDBRestClient;
-import jalview.ws.dbsources.PDBRestClient.PDBDocField;
 
 import java.awt.BorderLayout;
 import java.awt.CardLayout;
@@ -60,6 +61,7 @@ import javax.swing.event.ChangeEvent;
 import javax.swing.event.ChangeListener;
 import javax.swing.event.DocumentEvent;
 import javax.swing.event.DocumentListener;
+import javax.swing.table.TableColumn;
 
 @SuppressWarnings("serial")
 /**
@@ -157,8 +159,65 @@ public abstract class GStructureChooser extends JPanel implements
 
   protected static final String VIEWS_LOCAL_PDB = "VIEWS_LOCAL_PDB";
 
+  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;
+
   protected 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());
+      }
+      resizeAndRepaint();
+    }
+
     @Override
     public String getToolTipText(MouseEvent evt)
     {
@@ -169,6 +228,10 @@ public abstract class GStructureChooser extends JPanel implements
 
       try
       {
+        if (getValueAt(rowIndex, colIndex) == null)
+        {
+          return null;
+        }
         toolTipText = getValueAt(rowIndex, colIndex).toString();
       } catch (Exception e)
       {
@@ -185,17 +248,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 PDBDocFieldPreferences pdbDocFieldPrefs = new PDBDocFieldPreferences(
-          PreferenceSource.STRUCTURE_CHOOSER);
-
-  protected PDBDocField[] previousWantedFields;
-
   public GStructureChooser()
   {
     try
@@ -461,13 +513,17 @@ public abstract class GStructureChooser extends JPanel implements
         JTabbedPane sourceTabbedPane = (JTabbedPane) changeEvent
                 .getSource();
         int index = sourceTabbedPane.getSelectedIndex();
+        btn_view.setVisible(true);
+        btn_cancel.setVisible(true);
         if (sourceTabbedPane.getTitleAt(index).equals(configureCols))
         {
           btn_view.setEnabled(false);
           btn_cancel.setEnabled(false);
-          previousWantedFields = PDBDocFieldPreferences
-                  .getStructureSummaryFields().toArray(
-                          new PDBRestClient.PDBDocField[0]);
+          btn_view.setVisible(false);
+          btn_cancel.setVisible(false);
+          previousWantedFields = PDBFTSRestClient.getInstance()
+                  .getAllDefaulDisplayedDataColumns()
+                  .toArray(new FTSDataColumnI[0]);
         }
         if (sourceTabbedPane.getTitleAt(index)
                 .equals(foundStructureSummary))
@@ -519,8 +575,10 @@ public abstract class GStructureChooser extends JPanel implements
       return true;
     }
 
-    return Arrays.equals(PDBDocFieldPreferences.getStructureSummaryFields()
-            .toArray(new PDBRestClient.PDBDocField[0]),
+    return Arrays.equals(
+            PDBFTSRestClient.getInstance()
+                    .getAllDefaulDisplayedDataColumns()
+            .toArray(new FTSDataColumnI[0]),
             previousWantedFields) ? false : true;
 
   }
index 943aa8c..bd0f1de 100644 (file)
@@ -114,6 +114,7 @@ public abstract class GStructureViewer extends JInternalFrame implements
     pdbFile.setText(MessageManager.getString("label.pdb_file"));
     pdbFile.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent actionEvent)
       {
         pdbFile_actionPerformed(actionEvent);
@@ -124,6 +125,7 @@ public abstract class GStructureViewer extends JInternalFrame implements
     png.setText("PNG");
     png.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent actionEvent)
       {
         png_actionPerformed(actionEvent);
@@ -134,6 +136,7 @@ public abstract class GStructureViewer extends JInternalFrame implements
     eps.setText("EPS");
     eps.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent actionEvent)
       {
         eps_actionPerformed(actionEvent);
@@ -144,6 +147,7 @@ public abstract class GStructureViewer extends JInternalFrame implements
     viewMapping.setText(MessageManager.getString("label.view_mapping"));
     viewMapping.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent actionEvent)
       {
         viewMapping_actionPerformed(actionEvent);
@@ -156,6 +160,7 @@ public abstract class GStructureViewer extends JInternalFrame implements
     fitToWindow.setText(MessageManager.getString("label.fit_to_window"));
     fitToWindow.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent actionEvent)
       {
         fitToWindow_actionPerformed();
@@ -170,6 +175,7 @@ public abstract class GStructureViewer extends JInternalFrame implements
             .setText(MessageManager.getString("action.background_colour"));
     backGround.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent actionEvent)
       {
         backGround_actionPerformed(actionEvent);
@@ -179,6 +185,7 @@ public abstract class GStructureViewer extends JInternalFrame implements
     seqColour.setText(MessageManager.getString("action.by_sequence"));
     seqColour.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent actionEvent)
       {
         seqColour_actionPerformed(actionEvent);
@@ -187,6 +194,7 @@ public abstract class GStructureViewer extends JInternalFrame implements
     chainColour.setText(MessageManager.getString("action.by_chain"));
     chainColour.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent actionEvent)
       {
         chainColour_actionPerformed(actionEvent);
@@ -195,6 +203,7 @@ public abstract class GStructureViewer extends JInternalFrame implements
     chargeColour.setText(MessageManager.getString("label.charge_cysteine"));
     chargeColour.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent actionEvent)
       {
         chargeColour_actionPerformed(actionEvent);
@@ -203,6 +212,7 @@ public abstract class GStructureViewer extends JInternalFrame implements
     zappoColour.setText(MessageManager.getString("label.zappo"));
     zappoColour.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent actionEvent)
       {
         zappoColour_actionPerformed(actionEvent);
@@ -211,6 +221,7 @@ public abstract class GStructureViewer extends JInternalFrame implements
     taylorColour.setText(MessageManager.getString("label.taylor"));
     taylorColour.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent actionEvent)
       {
         taylorColour_actionPerformed(actionEvent);
@@ -219,6 +230,7 @@ public abstract class GStructureViewer extends JInternalFrame implements
     hydroColour.setText(MessageManager.getString("label.hydrophobicity"));
     hydroColour.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent actionEvent)
       {
         hydroColour_actionPerformed(actionEvent);
@@ -228,6 +240,7 @@ public abstract class GStructureViewer extends JInternalFrame implements
             .getString("label.strand_propensity"));
     strandColour.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent actionEvent)
       {
         strandColour_actionPerformed(actionEvent);
@@ -236,6 +249,7 @@ public abstract class GStructureViewer extends JInternalFrame implements
     helixColour.setText(MessageManager.getString("label.helix_propensity"));
     helixColour.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent actionEvent)
       {
         helixColour_actionPerformed(actionEvent);
@@ -244,6 +258,7 @@ public abstract class GStructureViewer extends JInternalFrame implements
     turnColour.setText(MessageManager.getString("label.turn_propensity"));
     turnColour.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent actionEvent)
       {
         turnColour_actionPerformed(actionEvent);
@@ -252,6 +267,7 @@ public abstract class GStructureViewer extends JInternalFrame implements
     buriedColour.setText(MessageManager.getString("label.buried_index"));
     buriedColour.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent actionEvent)
       {
         buriedColour_actionPerformed(actionEvent);
@@ -261,6 +277,7 @@ public abstract class GStructureViewer extends JInternalFrame implements
             .getString("label.purine_pyrimidine"));
     purinePyrimidineColour.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent actionEvent)
       {
         purinePyrimidineColour_actionPerformed(actionEvent);
@@ -270,6 +287,7 @@ public abstract class GStructureViewer extends JInternalFrame implements
     userColour.setText(MessageManager.getString("action.user_defined"));
     userColour.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent actionEvent)
       {
         userColour_actionPerformed(actionEvent);
@@ -282,6 +300,7 @@ public abstract class GStructureViewer extends JInternalFrame implements
             .getString("label.let_jmol_manage_structure_colours"));
     viewerColour.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent actionEvent)
       {
         viewerColour_actionPerformed(actionEvent);
@@ -293,6 +312,7 @@ public abstract class GStructureViewer extends JInternalFrame implements
     helpItem.setText(MessageManager.getString("label.jmol_help"));
     helpItem.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent actionEvent)
       {
         showHelp_actionPerformed(actionEvent);
@@ -302,6 +322,7 @@ public abstract class GStructureViewer extends JInternalFrame implements
             .setText(MessageManager.getString("label.align_structures"));
     alignStructs.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent actionEvent)
       {
         alignStructs_actionPerformed(actionEvent);
@@ -364,6 +385,10 @@ public abstract class GStructureViewer extends JInternalFrame implements
   {
   }
 
+  protected void highlightSelection_actionPerformed()
+  {
+  }
+
   protected void viewerColour_actionPerformed(ActionEvent actionEvent)
   {
   }
diff --git a/src/jalview/jbgui/PDBDocFieldPreferences.java b/src/jalview/jbgui/PDBDocFieldPreferences.java
deleted file mode 100644 (file)
index e9fc4fc..0000000
+++ /dev/null
@@ -1,267 +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 <http://www.gnu.org/licenses/>.
- * The Jalview Authors are detailed in the 'AUTHORS' file.
- */
-package jalview.jbgui;
-
-import jalview.ws.dbsources.PDBRestClient.PDBDocField;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.LinkedHashSet;
-
-import javax.swing.JScrollPane;
-import javax.swing.JTable;
-import javax.swing.table.AbstractTableModel;
-
-@SuppressWarnings("serial")
-public class PDBDocFieldPreferences extends JScrollPane
-{
-  protected JTable tbl_pdbDocFieldConfig = new JTable();
-
-  protected JScrollPane scrl_pdbDocFieldConfig = new JScrollPane(
-          tbl_pdbDocFieldConfig);
-
-  private HashMap<String, PDBDocField> map = new HashMap<String, PDBDocField>();
-
-  private static Collection<PDBDocField> searchSummaryFields = new LinkedHashSet<PDBDocField>();
-
-  private static Collection<PDBDocField> structureSummaryFields = new LinkedHashSet<PDBDocField>();
-
-  public enum PreferenceSource
-  {
-    SEARCH_SUMMARY, STRUCTURE_CHOOSER, PREFERENCES;
-  }
-
-  private PreferenceSource currentSource;
-
-  static
-  {
-    searchSummaryFields.add(PDBDocField.PDB_ID);
-    searchSummaryFields.add(PDBDocField.TITLE);
-
-    structureSummaryFields.add(PDBDocField.PDB_ID);
-    structureSummaryFields.add(PDBDocField.TITLE);
-  }
-
-  public PDBDocFieldPreferences(PreferenceSource source)
-  {
-    tbl_pdbDocFieldConfig.setAutoCreateRowSorter(true);
-    this.getViewport().add(tbl_pdbDocFieldConfig);
-    this.currentSource = source;
-
-    String[] columnNames = null;
-    switch (source)
-    {
-    case SEARCH_SUMMARY:
-      columnNames = new String[] { "PDB Field", "Show in search summary" };
-      break;
-    case STRUCTURE_CHOOSER:
-      columnNames = new String[] { "PDB Field", "Show in structure summary" };
-      break;
-    case PREFERENCES:
-      columnNames = new String[] { "PDB Field", "Show in search summary",
-          "Show in structure summary" };
-      break;
-    default:
-      break;
-    }
-
-    Object[][] data = new Object[PDBDocField.values().length - 1][3];
-    int x = 0;
-    for (PDBDocField field : PDBDocField.values())
-    {
-      if (field.getName().equalsIgnoreCase("all"))
-      {
-        continue;
-      }
-
-      switch (source)
-      {
-      case SEARCH_SUMMARY:
-        data[x++] = new Object[] { field.getName(),
-            searchSummaryFields.contains(field) };
-        break;
-      case STRUCTURE_CHOOSER:
-        data[x++] = new Object[] { field.getName(),
-            structureSummaryFields.contains(field) };
-        break;
-      case PREFERENCES:
-        data[x++] = new Object[] { field.getName(),
-            searchSummaryFields.contains(field),
-            structureSummaryFields.contains(field) };
-        break;
-      default:
-        break;
-      }
-      map.put(field.getName(), field);
-    }
-
-    PDBFieldTableModel model = new PDBFieldTableModel(columnNames, data);
-    tbl_pdbDocFieldConfig.setModel(model);
-  }
-
-  public static Collection<PDBDocField> getSearchSummaryFields()
-  {
-    return searchSummaryFields;
-  }
-
-  public static void setSearchSummaryFields(
-          Collection<PDBDocField> searchSummaryFields)
-  {
-    PDBDocFieldPreferences.searchSummaryFields = searchSummaryFields;
-  }
-
-  public static Collection<PDBDocField> getStructureSummaryFields()
-  {
-    return structureSummaryFields;
-  }
-
-  public static void setStructureSummaryFields(
-          Collection<PDBDocField> structureSummaryFields)
-  {
-    PDBDocFieldPreferences.structureSummaryFields = structureSummaryFields;
-  }
-
-  class PDBFieldTableModel extends AbstractTableModel
-  {
-
-    public PDBFieldTableModel(String[] columnNames, Object[][] data)
-    {
-      this.data = data;
-      this.columnNames = columnNames;
-    }
-
-    private Object[][] data;
-
-    private String[] columnNames;
-
-    public int getColumnCount()
-    {
-      return columnNames.length;
-    }
-
-    public int getRowCount()
-    {
-      return data.length;
-    }
-
-    public String getColumnName(int col)
-    {
-      return columnNames[col];
-    }
-
-    public Object getValueAt(int row, int col)
-    {
-      return data[row][col];
-    }
-
-    /*
-     * JTable uses this method to determine the default renderer/ editor for
-     * each cell. If we didn't implement this method, then the last column would
-     * contain text ("true"/"false"), rather than a check box.
-     */
-    public Class getColumnClass(int c)
-    {
-      return getValueAt(0, c).getClass();
-    }
-
-    /*
-     * Don't need to implement this method unless your table's editable.
-     */
-    public boolean isCellEditable(int row, int col)
-    {
-      // Note that the data/cell address is constant,
-      // no matter where the cell appears onscreen.
-      // !isPDBID(row, col) ensures the PDB_Id cell is never editable as it
-      // serves as a unique id for each row.
-      return (col == 1 || col == 2) && !isPDBID(row, col);
-
-    }
-
-    /**
-     * Determines whether the data in a given cell is a PDB ID.
-     * 
-     * @param row
-     * @param col
-     * @return
-     */
-
-    public boolean isPDBID(int row, int col)
-    {
-      boolean matched = false;
-      String name = getValueAt(row, 0).toString();
-      PDBDocField pdbField = map.get(name);
-      if (pdbField == PDBDocField.PDB_ID)
-      {
-        matched = true;
-      }
-      return matched;
-    }
-
-    /*
-     * Don't need to implement this method unless your table's data can change.
-     */
-    public void setValueAt(Object value, int row, int col)
-    {
-      data[row][col] = value;
-      fireTableCellUpdated(row, col);
-
-      String name = getValueAt(row, 0).toString();
-      boolean selected = ((Boolean) value).booleanValue();
-
-      PDBDocField pdbField = map.get(name);
-
-      if (currentSource == PreferenceSource.SEARCH_SUMMARY)
-      {
-        updatePrefs(searchSummaryFields, pdbField, selected);
-      }
-      else if (currentSource == PreferenceSource.STRUCTURE_CHOOSER)
-      {
-        updatePrefs(structureSummaryFields, pdbField, selected);
-      }
-      else if (currentSource == PreferenceSource.PREFERENCES)
-      {
-        if (col == 1)
-        {
-          updatePrefs(searchSummaryFields, pdbField, selected);
-        }
-        else if (col == 2)
-        {
-          updatePrefs(structureSummaryFields, pdbField, selected);
-        }
-      }
-    }
-
-    private void updatePrefs(Collection<PDBDocField> prefConfig,
-            PDBDocField pdbField, boolean selected)
-    {
-      if (prefConfig.contains(pdbField) && !selected)
-      {
-        prefConfig.remove(pdbField);
-      }
-
-      if (!prefConfig.contains(pdbField) && selected)
-      {
-        prefConfig.add(pdbField);
-      }
-    }
-
-  }
-}
index 007df3e..75099c2 100644 (file)
@@ -598,12 +598,9 @@ public class AnnotationRenderer
 
               if (columnSelection != null)
               {
-                for (int v : columnSelection.getSelected())
+                if (columnSelection.contains(column))
                 {
-                  if (v == column)
-                  {
-                    g.fillRect(x * charWidth, y, charWidth, charHeight);
-                  }
+                  g.fillRect(x * charWidth, y, charWidth, charHeight);
                 }
               }
             }
diff --git a/src/jalview/renderer/ScaleRenderer.java b/src/jalview/renderer/ScaleRenderer.java
new file mode 100644 (file)
index 0000000..7f1e074
--- /dev/null
@@ -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 <http://www.gnu.org/licenses/>.
+ * 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<Object[]> calculateMarks(AlignViewportI av,
+          int startx, int endx)
+  {
+    new ArrayList<Object[]>();
+
+    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<Object[]> marks = new ArrayList<Object[]>();
+    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;
+  }
+
+}
index bc00cc4..5d3aa2d 100644 (file)
@@ -22,6 +22,7 @@ package jalview.renderer.seqfeatures;
 
 import jalview.datamodel.SequenceFeature;
 import jalview.datamodel.SequenceI;
+import jalview.viewmodel.seqfeatures.FeatureRendererModel;
 
 import java.awt.AlphaComposite;
 import java.awt.Color;
@@ -30,8 +31,7 @@ import java.awt.Graphics;
 import java.awt.Graphics2D;
 import java.awt.image.BufferedImage;
 
-public class FeatureRenderer extends
-        jalview.viewmodel.seqfeatures.FeatureRendererModel
+public class FeatureRenderer extends FeatureRendererModel
 {
 
   FontMetrics fm;
@@ -392,7 +392,7 @@ public class FeatureRenderer extends
 
     }
 
-    if (transparency != 1.0f && g != null && transparencyAvailable)
+    if (transparency != 1.0f && g != null)
     {
       Graphics2D g2 = (Graphics2D) g;
       g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,
@@ -400,19 +400,6 @@ public class FeatureRenderer extends
     }
   }
 
-  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.
index bd58273..213868b 100644 (file)
@@ -111,10 +111,10 @@ public class FeatureColour implements FeatureColourI
     }
 
     /*
-     * autoScaled == true: colours range over actual score range; autoScaled ==
-     * false ('abso'): colours range over min/max range
+     * autoScaled == true: colours range over actual score range
+     * autoScaled == false ('abso'): colours range over min/max range
      */
-    boolean autoScaled = false;
+    boolean autoScaled = true;
     String tok = null, minval, maxval;
     if (mincol != null)
     {
@@ -138,15 +138,15 @@ public class FeatureColour implements FeatureColourI
       }
       tok = gcol.nextToken();
       gcol.nextToken(); // skip next '|'
-      if (tok.toLowerCase().indexOf("abso") != 0)
+      if (tok.toLowerCase().startsWith("abso"))
       {
-        minval = tok;
-        autoScaled = true;
+        minval = gcol.nextToken();
+        gcol.nextToken(); // skip next '|'
+        autoScaled = false;
       }
       else
       {
-        minval = gcol.nextToken();
-        gcol.nextToken(); // skip next '|'
+        minval = tok;
       }
       maxval = gcol.nextToken();
       if (gcol.hasMoreTokens())
@@ -359,8 +359,7 @@ public class FeatureColour implements FeatureColourI
    * Sets the 'graduated colour' flag. If true, also sets 'colour by label' to
    * false.
    */
-  @Override
-  public void setGraduatedColour(boolean b)
+  void setGraduatedColour(boolean b)
   {
     graduatedColour = b;
     if (b)
@@ -643,7 +642,7 @@ public class FeatureColour implements FeatureColourI
       {
         sb.append(Format.getHexString(getMinColour())).append(BAR);
         sb.append(Format.getHexString(getMaxColour())).append(BAR);
-        if (isAutoScaled())
+        if (!isAutoScaled())
         {
           sb.append("abso").append(BAR);
         }
diff --git a/src/jalview/schemes/FeatureColourScheme.java b/src/jalview/schemes/FeatureColourScheme.java
deleted file mode 100644 (file)
index 628b514..0000000
+++ /dev/null
@@ -1,101 +0,0 @@
-package jalview.schemes;
-
-import jalview.api.FeatureColourI;
-import jalview.api.FeatureSettingsI;
-
-import java.awt.Color;
-
-/**
- * Pre-set configurations for feature settings
- * 
- * @author gmcarstairs
- *
- */
-public enum FeatureColourScheme implements FeatureSettingsI
-{
-  /**
-   * Show sequence variants in red, on top of exons coloured by label
-   */
-  EnsemblVariants
-  {
-
-    @Override
-    public boolean isFeatureDisplayed(String type)
-    {
-      // TODO accept SO sub-types of these features
-      // if (SequenceOntologyFactory.getInstance().isA(SequenceOntologyI.EXON...
-      return (EXON.equals(type) || SEQUENCE_VARIANT.equals(type));
-    }
-
-    @Override
-    public boolean isGroupDisplayed(String group)
-    {
-      return true;
-    }
-
-    @Override
-    public FeatureColourI getFeatureColour(String type)
-    {
-      if (EXON.equals(type))
-      {
-        return new FeatureColour()
-        {
-          @Override
-          public boolean isColourByLabel()
-          {
-            return true;
-          }
-        };
-      }
-      if (SEQUENCE_VARIANT.equals(type))
-      {
-        return new FeatureColour(Color.RED);
-      }
-      return null;
-    }
-
-    @Override
-    public float getTransparency()
-    {
-      return 1f;
-    }
-
-    /**
-     * Order sequence_variant above exon above the rest
-     */
-    @Override
-    public int compareTo(String feature1, String feature2)
-    {
-      if (SEQUENCE_VARIANT.equals(feature1))
-      {
-        return -1;
-      }
-      if (SEQUENCE_VARIANT.equals(feature2))
-      {
-        return +1;
-      }
-      if (EXON.equals(feature1))
-      {
-        return -1;
-      }
-      if (EXON.equals(feature2))
-      {
-        return +1;
-      }
-      return 0;
-    }
-
-    @Override
-    public boolean optimiseOrder()
-    {
-      return false;
-    };
-
-  };
-
-  // SequenceOntologyI.SEQUENCE_VARIANT
-  private static final String SEQUENCE_VARIANT = "sequence_variant";
-
-  // SequenceOntologyI.EXON
-  private static final String EXON = "exon";
-}
diff --git a/src/jalview/schemes/FeatureSettingsAdapter.java b/src/jalview/schemes/FeatureSettingsAdapter.java
new file mode 100644 (file)
index 0000000..699d954
--- /dev/null
@@ -0,0 +1,48 @@
+package jalview.schemes;
+
+import jalview.api.FeatureColourI;
+import jalview.api.FeatureSettingsModelI;
+
+/**
+ * An adapter class that may be extended to instantiate feature colour schemes
+ */
+public class FeatureSettingsAdapter implements FeatureSettingsModelI
+{
+
+  @Override
+  public boolean isFeatureDisplayed(String type)
+  {
+    return false;
+  }
+
+  @Override
+  public boolean isGroupDisplayed(String group)
+  {
+    return true;
+  }
+
+  @Override
+  public FeatureColourI getFeatureColour(String type)
+  {
+    return null;
+  }
+
+  @Override
+  public float getTransparency()
+  {
+    return 1f;
+  }
+
+  @Override
+  public int compare(String feature1, String feature2)
+  {
+    return 0;
+  }
+
+  @Override
+  public boolean optimiseOrder()
+  {
+    return false;
+  }
+
+}
diff --git a/src/jalview/schemes/GraduatedColor.java b/src/jalview/schemes/GraduatedColor.java
deleted file mode 100644 (file)
index 8a55f79..0000000
+++ /dev/null
@@ -1,298 +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 <http://www.gnu.org/licenses/>.
- * The Jalview Authors are detailed in the 'AUTHORS' file.
- */
-package jalview.schemes;
-
-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 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;
-    }
-  }
-}
index ad68b8a..2aa24a1 100755 (executable)
@@ -35,7 +35,7 @@ import java.util.Vector;
 
 public class ResidueProperties
 {
-  public static Hashtable<String, ScoreModelI> scoreMatrices = new Hashtable();
+  public static Hashtable<String, ScoreModelI> scoreMatrices = new Hashtable<String, ScoreModelI>();
 
   // Stores residue codes/names and colours and other things
   public static final int[] aaIndex; // aaHash version 2.1.1 and below
index 1a2e417..9ae14ca 100755 (executable)
@@ -67,7 +67,7 @@ public class UserColourScheme extends ResidueColourScheme
 
     if (col == null)
     {
-      System.out.println("Unknown colour!! " + colour);
+      System.out.println("Making colour from name: " + colour);
       col = createColourFromName(colour);
     }
 
index 9d06aef..a5d9736 100644 (file)
@@ -34,6 +34,7 @@ import jalview.datamodel.SearchResults;
 import jalview.datamodel.SequenceI;
 import jalview.gui.IProgressIndicator;
 import jalview.io.AppletFormatAdapter;
+import jalview.io.StructureFile;
 import jalview.util.MappingUtils;
 import jalview.util.MessageManager;
 import jalview.ws.sifts.SiftsClient;
@@ -47,10 +48,8 @@ import java.util.Collections;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.IdentityHashMap;
-import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 import java.util.Vector;
 
 import MCview.Atom;
@@ -80,7 +79,7 @@ public class StructureSelectionManager
   /*
    * Set of any registered mappings between (dataset) sequences.
    */
-  public Set<AlignedCodonFrame> seqmappings = new LinkedHashSet<AlignedCodonFrame>();
+  private List<AlignedCodonFrame> seqmappings = new ArrayList<AlignedCodonFrame>();
 
   private List<CommandListener> commandListeners = new ArrayList<CommandListener>();
 
@@ -321,12 +320,13 @@ public class StructureSelectionManager
    *          - how to resolve data from resource
    * @return null or the structure data parsed as a pdb file
    */
-  synchronized public PDBfile setMapping(SequenceI[] sequence,
+  synchronized public StructureFile setMapping(SequenceI[] sequence,
           String[] targetChains, String pdbFile, String protocol)
   {
     return setMapping(true, sequence, targetChains, pdbFile, protocol);
   }
 
+
   /**
    * create sequence structure mappings between each sequence and the given
    * pdbFile (retrieved via the given protocol).
@@ -345,7 +345,7 @@ public class StructureSelectionManager
    *          - how to resolve data from resource
    * @return null or the structure data parsed as a pdb file
    */
-  synchronized public PDBfile setMapping(boolean forStructureView,
+  synchronized public StructureFile setMapping(boolean forStructureView,
           SequenceI[] sequenceArray, String[] targetChainIds,
           String pdbFile,
           String protocol)
@@ -380,17 +380,26 @@ public class StructureSelectionManager
         }
       }
     }
-    PDBfile pdb = null;
+    StructureFile pdb = null;
     boolean isMapUsingSIFTs = SiftsSettings.isMapWithSifts();
     try
     {
-      pdb = new PDBfile(addTempFacAnnot, parseSecStr, secStructServices,
-              pdbFile, protocol);
 
-      if (pdb.id != null && pdb.id.trim().length() > 0
+      if (pdbFile != null && isCIFFile(pdbFile))
+      {
+        pdb = new jalview.ext.jmol.JmolParser(addTempFacAnnot, parseSecStr,
+                secStructServices, pdbFile, protocol);
+      }
+      else
+      {
+        pdb = new PDBfile(addTempFacAnnot, parseSecStr, secStructServices,
+                pdbFile, protocol);
+      }
+
+      if (pdb.getId() != null && pdb.getId().trim().length() > 0
               && AppletFormatAdapter.FILE.equals(protocol))
       {
-        registerPDBFile(pdb.id.trim(), pdbFile);
+        registerPDBFile(pdb.getId().trim(), pdbFile);
       }
     } catch (Exception ex)
     {
@@ -451,7 +460,7 @@ public class StructureSelectionManager
       String maxChainId = " ";
       PDBChain maxChain = null;
       boolean first = true;
-      for (PDBChain chain : pdb.chains)
+      for (PDBChain chain : pdb.getChains())
       {
         if (targetChainId.length() > 0 && !targetChainId.equals(chain.id)
                 && !infChain)
@@ -485,7 +494,7 @@ public class StructureSelectionManager
 
       if (protocol.equals(jalview.io.AppletFormatAdapter.PASTE))
       {
-        pdbFile = "INLINE" + pdb.id;
+        pdbFile = "INLINE" + pdb.getId();
       }
 
       ArrayList<StructureMapping> seqToStrucMapping = new ArrayList<StructureMapping>();
@@ -503,7 +512,7 @@ public class StructureSelectionManager
         }
         else
         {
-          for (PDBChain chain : pdb.chains)
+          for (PDBChain chain : pdb.getChains())
           {
             StructureMapping mapping = getStructureMapping(seq, pdbFile,
                     chain.id, pdb, chain, sqmpping, maxAlignseq);
@@ -527,8 +536,15 @@ public class StructureSelectionManager
     return pdb;
   }
 
+  private boolean isCIFFile(String filename)
+  {
+    String fileExt = filename.substring(filename.lastIndexOf(".") + 1,
+            filename.length());
+    return "cif".equalsIgnoreCase(fileExt);
+  }
+
   private StructureMapping getStructureMapping(SequenceI seq,
-          String pdbFile, String targetChainId, PDBfile pdb,
+          String pdbFile, String targetChainId, StructureFile pdb,
           PDBChain maxChain, jalview.datamodel.Mapping sqmpping,
           AlignSeq maxAlignseq)
   {
@@ -537,11 +553,17 @@ public class StructureSelectionManager
     {
       StructureMapping curChainMapping = siftsClient
               .getSiftsStructureMapping(seq, pdbFile, targetChainId);
+      try
+      {
       PDBChain chain = pdb.findChain(targetChainId);
       if (chain != null)
       {
         chain.transferResidueAnnotation(curChainMapping, sqmpping);
       }
+      } catch (Exception e)
+      {
+        e.printStackTrace();
+      }
       return curChainMapping;
     } catch (SiftsException e)
     {
@@ -556,7 +578,7 @@ public class StructureSelectionManager
 
   private StructureMapping getNWMappings(SequenceI seq,
           String pdbFile,
-          String maxChainId, PDBChain maxChain, PDBfile pdb,
+          String maxChainId, PDBChain maxChain, StructureFile pdb,
           AlignSeq maxAlignseq)
   {
     final StringBuilder mappingDetails = new StringBuilder(128);
@@ -628,7 +650,7 @@ public class StructureSelectionManager
     } while (index < maxChain.atoms.size());
 
     StructureMapping nwMapping = new StructureMapping(seq, pdbFile,
-            pdb.id, maxChainId, mapping, mappingDetails.toString());
+            pdb.getId(), maxChainId, mapping, mappingDetails.toString());
     maxChain.transferResidueAnnotation(nwMapping, sqmpping);
     return nwMapping;
   }
@@ -771,19 +793,19 @@ public class StructureSelectionManager
    *          the sequence that the mouse over occurred on
    * @param indexpos
    *          the absolute position being mouseovered in seq (0 to seq.length())
-   * @param index
+   * @param seqPos
    *          the sequence position (if -1, seq.findPosition is called to
    *          resolve the residue number)
    */
-  public void mouseOverSequence(SequenceI seq, int indexpos, int index,
+  public void mouseOverSequence(SequenceI seq, int indexpos, int seqPos,
           VamsasSource source)
   {
     boolean hasSequenceListeners = handlingVamsasMo
             || !seqmappings.isEmpty();
     SearchResults results = null;
-    if (index == -1)
+    if (seqPos == -1)
     {
-      index = seq.findPosition(indexpos);
+      seqPos = seq.findPosition(indexpos);
     }
     for (int i = 0; i < listeners.size(); i++)
     {
@@ -796,7 +818,7 @@ public class StructureSelectionManager
       }
       if (listener instanceof StructureListener)
       {
-        highlightStructure((StructureListener) listener, seq, index);
+        highlightStructure((StructureListener) listener, seq, seqPos);
       }
       else
       {
@@ -810,12 +832,12 @@ public class StructureSelectionManager
             {
               if (results == null)
               {
-                results = MappingUtils.buildSearchResults(seq, index,
+                results = MappingUtils.buildSearchResults(seq, seqPos,
                         seqmappings);
               }
               if (handlingVamsasMo)
               {
-                results.addResult(seq, index, index);
+                results.addResult(seq, seqPos, seqPos);
 
               }
               if (!results.isEmpty())
@@ -833,7 +855,7 @@ public class StructureSelectionManager
         else if (listener instanceof SecondaryStructureListener)
         {
           ((SecondaryStructureListener) listener).mouseOverSequence(seq,
-                  indexpos, index);
+                  indexpos, seqPos);
         }
       }
     }
@@ -841,14 +863,14 @@ public class StructureSelectionManager
 
   /**
    * Send suitable messages to a StructureListener to highlight atoms
-   * corresponding to the given sequence position.
+   * corresponding to the given sequence position(s)
    * 
    * @param sl
    * @param seq
-   * @param index
+   * @param positions
    */
-  protected void highlightStructure(StructureListener sl, SequenceI seq,
-          int index)
+  public void highlightStructure(StructureListener sl, SequenceI seq,
+          int... positions)
   {
     if (!sl.isListeningFor(seq))
     {
@@ -858,14 +880,20 @@ public class StructureSelectionManager
     List<AtomSpec> atoms = new ArrayList<AtomSpec>();
     for (StructureMapping sm : mappings)
     {
-      if (sm.sequence == seq || sm.sequence == seq.getDatasetSequence())
+      if (sm.sequence == seq
+              || sm.sequence == seq.getDatasetSequence()
+              || (sm.sequence.getDatasetSequence() != null && sm.sequence
+                      .getDatasetSequence() == seq.getDatasetSequence()))
       {
-        atomNo = sm.getAtomNum(index);
-
-        if (atomNo > 0)
+        for (int index : positions)
         {
-          atoms.add(new AtomSpec(sm.pdbfile, sm.pdbchain, sm
-                  .getPDBResNum(index), atomNo));
+          atomNo = sm.getAtomNum(index);
+
+          if (atomNo > 0)
+          {
+            atoms.add(new AtomSpec(sm.pdbfile, sm.pdbchain, sm
+                    .getPDBResNum(index), atomNo));
+          }
         }
       }
     }
@@ -1021,13 +1049,13 @@ public class StructureSelectionManager
   /**
    * Add each of the given codonFrames to the stored set, if not aready present.
    * 
-   * @param set
+   * @param mappings
    */
-  public void registerMappings(Set<AlignedCodonFrame> set)
+  public void registerMappings(List<AlignedCodonFrame> mappings)
   {
-    if (set != null)
+    if (mappings != null)
     {
-      for (AlignedCodonFrame acf : set)
+      for (AlignedCodonFrame acf : mappings)
       {
         registerMapping(acf);
       }
@@ -1262,7 +1290,16 @@ public class StructureSelectionManager
 
   public void setProgressBar(String message)
   {
+    if (progressIndicator == null)
+    {
+      return;
+    }
     progressIndicator.setProgressBar(message, progressSessionId);
   }
 
+  public List<AlignedCodonFrame> getSequenceMappings()
+  {
+    return seqmappings;
+  }
+
 }
diff --git a/src/jalview/structure/StructureViewSettings.java b/src/jalview/structure/StructureViewSettings.java
new file mode 100644 (file)
index 0000000..2fcb3e5
--- /dev/null
@@ -0,0 +1,79 @@
+package jalview.structure;
+
+public class StructureViewSettings
+{
+  private String dbRefType;
+
+  /**
+   * set to true to add derived sequence annotations (temp factor read from
+   * file, or computed secondary structure) to the alignment
+   */
+  private static boolean visibleChainAnnotation = false;
+
+  /**
+   * Set true to predict secondary structure (using JMol for protein, Annotate3D
+   * for RNA)
+   */
+  private static boolean predictSecStr = false;
+
+  /**
+   * Set true (with predictSecondaryStructure=true) to predict secondary
+   * structure using an external service (currently Annotate3D for RNA only)
+   */
+  private static boolean externalSecondaryStructure = false;
+
+  private static boolean showSeqFeatures = true;
+
+  public static void addSettings(boolean addAlignmentAnnotations,
+          boolean predictSecStr, boolean externalSecStr)
+  {
+    StructureViewSettings.visibleChainAnnotation = addAlignmentAnnotations;
+    StructureViewSettings.predictSecStr = predictSecStr;
+    StructureViewSettings.externalSecondaryStructure = externalSecStr;
+    StructureViewSettings.showSeqFeatures = true;
+  }
+
+  public static boolean isVisibleChainAnnotation()
+  {
+    return visibleChainAnnotation;
+  }
+
+  public static void setVisibleChainAnnotation(
+          boolean visibleChainAnnotation)
+  {
+    StructureViewSettings.visibleChainAnnotation = visibleChainAnnotation;
+  }
+
+  public static boolean isPredictSecondaryStructure()
+  {
+    return predictSecStr;
+  }
+
+  public static void setPredictSecondaryStructure(
+          boolean predictSecondaryStructure)
+  {
+    StructureViewSettings.predictSecStr = predictSecondaryStructure;
+  }
+
+  public static boolean isExternalSecondaryStructure()
+  {
+    return externalSecondaryStructure;
+  }
+
+  public static void setExternalSecondaryStructure(
+          boolean externalSecondaryStructure)
+  {
+    StructureViewSettings.externalSecondaryStructure = externalSecondaryStructure;
+  }
+
+  public static boolean isShowSeqFeatures()
+  {
+    return showSeqFeatures;
+  }
+
+  public static void setShowSeqFeatures(boolean showSeqFeatures)
+  {
+    StructureViewSettings.showSeqFeatures = showSeqFeatures;
+  }
+
+}
index 2ed59ae..42fbfa9 100644 (file)
@@ -633,7 +633,10 @@ public abstract class AAStructureBindingModel extends
         {
           for (SequenceI s : seqs)
           {
-            if (s == seq)
+            if (s == seq
+                    || (s.getDatasetSequence() != null && s
+                            .getDatasetSequence() == seq
+                            .getDatasetSequence()))
             {
               return true;
             }
diff --git a/src/jalview/util/ArrayUtils.java b/src/jalview/util/ArrayUtils.java
new file mode 100644 (file)
index 0000000..92085c3
--- /dev/null
@@ -0,0 +1,27 @@
+package jalview.util;
+
+public class ArrayUtils
+{
+  /**
+   * Reverse the given array 'in situ'
+   * 
+   * @param arr
+   */
+  public static void reverseIntArray(int[] arr)
+  {
+    if (arr != null)
+    {
+      /*
+       * swap [k] with [end-k] up to the half way point in the array
+       * if length is odd, the middle entry is left untouched by the excitement
+       */
+      int last = arr.length - 1;
+      for (int k = 0; k < arr.length / 2; k++)
+      {
+        int temp = arr[k];
+        arr[k] = arr[last - k];
+        arr[last - k] = temp;
+      }
+    }
+  }
+}
index b8cd563..31d1ded 100644 (file)
@@ -103,4 +103,43 @@ public class ColorUtils
     return col == null ? null : col.brighter().brighter().brighter();
   }
 
+  /**
+   * Returns a color between minColour and maxColour; the RGB values are in
+   * proportion to where 'value' lies between minValue and maxValue
+   * 
+   * @param value
+   * @param minValue
+   * @param minColour
+   * @param maxValue
+   * @param maxColour
+   * @return
+   */
+  public static Color getGraduatedColour(float value, float minValue,
+          Color minColour, float maxValue, Color maxColour)
+  {
+    if (minValue == maxValue)
+    {
+      return minColour;
+    }
+    if (value < minValue)
+    {
+      value = minValue;
+    }
+    if (value > maxValue)
+    {
+      value = maxValue;
+    }
+
+    /*
+     * prop = proportion of the way value is from minValue to maxValue
+     */
+    float prop = (value - minValue) / (maxValue - minValue);
+    float r = minColour.getRed() + prop
+            * (maxColour.getRed() - minColour.getRed());
+    float g = minColour.getGreen() + prop
+            * (maxColour.getGreen() - minColour.getGreen());
+    float b = minColour.getBlue() + prop
+            * (maxColour.getBlue() - minColour.getBlue());
+    return new Color(r / 255, g / 255, b / 255);
+  }
 }
index 8902e2c..5605a53 100644 (file)
@@ -286,7 +286,7 @@ public class Comparison
    * @param letters
    * @return
    */
-  public static final boolean areNucleotide(char[][] letters)
+  static final boolean areNucleotide(char[][] letters)
   {
     int ntCount = 0;
     int aaCount = 0;
@@ -300,16 +300,11 @@ public class Comparison
       // to save a lengthy calculation
       for (char c : seq)
       {
-        if ('a' <= c && c <= 'z')
-        {
-          c -= TO_UPPER_CASE;
-        }
-
-        if (c == 'A' || c == 'G' || c == 'C' || c == 'T' || c == 'U')
+        if (isNucleotide(c))
         {
           ntCount++;
         }
-        else if (!Comparison.isGap(c))
+        else if (!isGap(c))
         {
           aaCount++;
         }
@@ -332,6 +327,59 @@ public class Comparison
   }
 
   /**
+   * Answers true if the character is one of aAcCgGtTuU
+   * 
+   * @param c
+   * @return
+   */
+  public static boolean isNucleotide(char c)
+  {
+    if ('a' <= c && c <= 'z')
+    {
+      c -= TO_UPPER_CASE;
+    }
+
+    switch (c)
+    {
+    case 'A':
+    case 'C':
+    case 'G':
+    case 'T':
+    case 'U':
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Answers true if every character in the string is one of aAcCgGtTuU, or
+   * (optionally) a gap character (dot, dash, space), else false
+   * 
+   * @param s
+   * @param allowGaps
+   * @return
+   */
+  public static boolean isNucleotideSequence(String s, boolean allowGaps)
+  {
+    if (s == null)
+    {
+      return false;
+    }
+    for (int i = 0; i < s.length(); i++)
+    {
+      char c = s.charAt(i);
+      if (!isNucleotide(c))
+      {
+        if (!allowGaps || !isGap(c))
+        {
+          return false;
+        }
+      }
+    }
+    return true;
+  }
+
+  /**
    * Convenience overload of isNucleotide
    * 
    * @param seqs
index 518c310..424d40b 100755 (executable)
@@ -27,14 +27,21 @@ import jalview.datamodel.SequenceI;
 
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Hashtable;
 import java.util.List;
 import java.util.Map;
 
 import com.stevesoft.pat.Regex;
 
+/**
+ * Utilities for handling DBRef objects and their collections.
+ */
 public class DBRefUtils
 {
+  /*
+   * lookup from lower-case form of a name to its canonical (standardised) form
+   */
   private static Map<String, String> canonicalSourceNameLookup = new HashMap<String, String>();
 
   private static Map<String, String> dasCoordinateSystemsLookup = new HashMap<String, String>();
@@ -45,7 +52,13 @@ public class DBRefUtils
     canonicalSourceNameLookup.put("uniprotkb/swiss-prot",
             DBRefSource.UNIPROT);
     canonicalSourceNameLookup.put("uniprotkb/trembl", DBRefSource.UNIPROT);
+
+    // Ensembl values for dbname in xref REST service:
+    canonicalSourceNameLookup.put("uniprot/sptrembl", DBRefSource.UNIPROT);
+    canonicalSourceNameLookup.put("uniprot/swissprot", DBRefSource.UNIPROT);
+
     canonicalSourceNameLookup.put("pdb", DBRefSource.PDB);
+    canonicalSourceNameLookup.put("ensembl", DBRefSource.ENSEMBL);
 
     dasCoordinateSystemsLookup.put("pdbresnum", DBRefSource.PDB);
     dasCoordinateSystemsLookup.put("uniprot", DBRefSource.UNIPROT);
@@ -54,39 +67,33 @@ public class DBRefUtils
   }
 
   /**
-   * Utilities for handling DBRef objects and their collections.
-   */
-  /**
    * 
    * @param dbrefs
-   *          Vector of DBRef objects to search
+   *          array of DBRef objects to search
    * @param sources
    *          String[] array of source DBRef IDs to retrieve
-   * @return Vector
+   * @return
    */
   public static DBRefEntry[] selectRefs(DBRefEntry[] dbrefs,
           String[] sources)
   {
-    if (dbrefs == null)
-    {
-      return null;
-    }
-    if (sources == null)
+    if (dbrefs == null || sources == null)
     {
       return dbrefs;
     }
-    Map<String, Integer> srcs = new HashMap<String, Integer>();
-    ArrayList<DBRefEntry> res = new ArrayList<DBRefEntry>();
-
-    for (int i = 0; i < sources.length; i++)
+    HashSet<String> srcs = new HashSet<String>();
+    for (String src : sources)
     {
-      srcs.put(new String(sources[i]), new Integer(i));
+      srcs.add(src);
     }
-    for (int i = 0, j = dbrefs.length; i < j; i++)
+
+    List<DBRefEntry> res = new ArrayList<DBRefEntry>();
+    for (DBRefEntry dbr : dbrefs)
     {
-      if (srcs.containsKey(dbrefs[i].getSource()))
+      String source = getCanonicalName(dbr.getSource());
+      if (srcs.contains(source))
       {
-        res.add(dbrefs[i]);
+        res.add(dbr);
       }
     }
 
@@ -95,8 +102,6 @@ public class DBRefUtils
       DBRefEntry[] reply = new DBRefEntry[res.size()];
       return res.toArray(reply);
     }
-    res = null;
-    // there are probable memory leaks in the hashtable!
     return null;
   }
 
@@ -164,6 +169,25 @@ public class DBRefUtils
   }
 
   /**
+   * Returns an array of those references that match the given accession id
+   * <ul>
+   * <li>database sources are the same</li>
+   * <li>accession ids are the same</li>
+   * <li>both have no mapping, or the mappings are the same</li>
+   * </ul>
+   * 
+   * @param ref
+   *          Set of references to search
+   * @param entry
+   *          pattern to match
+   * @return
+   */
+  public static DBRefEntry[] searchRefs(DBRefEntry[] ref, String accId)
+  {
+    return searchRefs(ref, 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.
    * 
@@ -200,8 +224,10 @@ public class DBRefUtils
   /**
    * match on all non-null fields in refa
    */
+  // TODO unused - remove?
   public static DbRefComp matchNonNullonA = new DbRefComp()
   {
+    @Override
     public boolean matches(DBRefEntry refa, DBRefEntry refb)
     {
       if (refa.getSource() == null
@@ -230,27 +256,18 @@ public class DBRefUtils
    * either field is null or field matches for all of source, version, accession
    * id and map.
    */
+  // TODO unused - remove?
   public static DbRefComp matchEitherNonNull = new DbRefComp()
   {
+    @Override
     public boolean matches(DBRefEntry refa, DBRefEntry refb)
     {
-      if ((refa.getSource() == null || refb.getSource() == null)
-              || refb.getSource().equals(refa.getSource()))
+      if (nullOrEqual(refa.getSource(), refb.getSource())
+              && nullOrEqual(refa.getVersion(), refb.getVersion())
+              && nullOrEqual(refa.getAccessionId(), refb.getAccessionId())
+              && nullOrEqual(refa.getMap(), refb.getMap()))
       {
-        if ((refa.getVersion() == null || refb.getVersion() == null)
-                || refb.getVersion().equals(refa.getVersion()))
-        {
-          if ((refa.getAccessionId() == null || refb.getAccessionId() == null)
-                  || refb.getAccessionId().equals(refa.getAccessionId()))
-          {
-            if ((refa.getMap() == null || refb.getMap() == null)
-                    || (refb.getMap() != null && refb.getMap().equals(
-                            refa.getMap())))
-            {
-              return true;
-            }
-          }
-        }
+        return true;
       }
       return false;
     }
@@ -260,18 +277,18 @@ public class DBRefUtils
    * accession ID and DB must be identical. Version is ignored. Map is either
    * not defined or is a match (or is compatible?)
    */
+  // TODO unused - remove?
   public static DbRefComp matchDbAndIdAndEitherMap = new DbRefComp()
   {
+    @Override
     public boolean matches(DBRefEntry refa, DBRefEntry refb)
     {
       if (refa.getSource() != null && refb.getSource() != null
               && refb.getSource().equals(refa.getSource()))
       {
         // We dont care about version
-        // if ((refa.getVersion()==null || refb.getVersion()==null)
-        // || refb.getVersion().equals(refa.getVersion()))
-        // {
         if (refa.getAccessionId() != null && refb.getAccessionId() != null
+        // FIXME should be && not || here?
                 || refb.getAccessionId().equals(refa.getAccessionId()))
         {
           if ((refa.getMap() == null || refb.getMap() == null)
@@ -291,17 +308,16 @@ public class DBRefUtils
    * or map but no maplist on either or maplist of map on a is the complement of
    * maplist of map on b.
    */
+  // TODO unused - remove?
   public static DbRefComp matchDbAndIdAndComplementaryMapList = new DbRefComp()
   {
+    @Override
     public boolean matches(DBRefEntry refa, DBRefEntry refb)
     {
       if (refa.getSource() != null && refb.getSource() != null
               && refb.getSource().equals(refa.getSource()))
       {
         // We dont care about version
-        // if ((refa.getVersion()==null || refb.getVersion()==null)
-        // || refb.getVersion().equals(refa.getVersion()))
-        // {
         if (refa.getAccessionId() != null && refb.getAccessionId() != null
                 || refb.getAccessionId().equals(refa.getAccessionId()))
         {
@@ -328,8 +344,10 @@ public class DBRefUtils
    * or or map but no maplist on either or maplist of map on a is equivalent to
    * the maplist of map on b.
    */
+  // TODO unused - remove?
   public static DbRefComp matchDbAndIdAndEquivalentMapList = new DbRefComp()
   {
+    @Override
     public boolean matches(DBRefEntry refa, DBRefEntry refb)
     {
       if (refa.getSource() != null && refb.getSource() != null
@@ -368,17 +386,13 @@ public class DBRefUtils
    */
   public static DbRefComp matchDbAndIdAndEitherMapOrEquivalentMapList = new DbRefComp()
   {
+    @Override
     public boolean matches(DBRefEntry refa, DBRefEntry refb)
     {
-      // System.err.println("Comparing A: "+refa.getSrcAccString()+(refa.hasMap()?" has map.":"."));
-      // System.err.println("Comparing B: "+refb.getSrcAccString()+(refb.hasMap()?" has map.":"."));
       if (refa.getSource() != null && refb.getSource() != null
               && refb.getSource().equals(refa.getSource()))
       {
         // We dont care about version
-        // if ((refa.getVersion()==null || refb.getVersion()==null)
-        // || refb.getVersion().equals(refa.getVersion()))
-        // {
         if (refa.getAccessionId() != null && refb.getAccessionId() != null
                 && refb.getAccessionId().equals(refa.getAccessionId()))
         {
@@ -402,6 +416,23 @@ public class DBRefUtils
   };
 
   /**
+   * accession ID only must be identical.
+   */
+  public static DbRefComp matchId = new DbRefComp()
+  {
+    @Override
+    public boolean matches(DBRefEntry refa, DBRefEntry refb)
+    {
+      if (refa.getAccessionId() != null && refb.getAccessionId() != null
+              && refb.getAccessionId().equals(refa.getAccessionId()))
+      {
+        return true;
+      }
+      return false;
+    }
+  };
+
+  /**
    * Parses a DBRefEntry and adds it to the sequence, also a PDBEntry if the
    * database is PDB.
    * <p>
@@ -472,4 +503,20 @@ public class DBRefUtils
     return ref;
   }
 
+  /**
+   * Returns true if either object is null, or they are equal
+   * 
+   * @param o1
+   * @param o2
+   * @return
+   */
+  public static boolean nullOrEqual(Object o1, Object o2)
+  {
+    if (o1 == null || o2 == null)
+    {
+      return true;
+    }
+    return (o1 == null ? o2.equals(o1) : o1.equals(o2));
+  }
+
 }
index e456dab..e51442c 100644 (file)
@@ -41,12 +41,12 @@ public class MapList
   /*
    * Subregions (base 1) described as { [start1, end1], [start2, end2], ...}
    */
-  private List<int[]> fromShifts = new ArrayList<int[]>();
+  private List<int[]> fromShifts;
 
   /*
    * Same format as fromShifts, for the 'mapped to' sequence
    */
-  private List<int[]> toShifts = new ArrayList<int[]>();
+  private List<int[]> toShifts;
 
   /*
    * number of steps in fromShifts to one toRatio unit
@@ -73,6 +73,15 @@ public class MapList
   private int toHighest;
 
   /**
+   * Constructor
+   */
+  public MapList()
+  {
+    fromShifts = new ArrayList<int[]>();
+    toShifts = new ArrayList<int[]>();
+  }
+
+  /**
    * Two MapList objects are equal if they are the same object, or they both
    * have populated shift ranges and all values are the same.
    */
@@ -180,7 +189,9 @@ public class MapList
   }
 
   /**
-   * Constructor.
+   * Constructor given from and to ranges as [start1, end1, start2, end2,...].
+   * If any end is equal to the next start, the ranges will be merged. There is
+   * no validation check that the ranges do not overlap each other.
    * 
    * @param from
    *          contiguous regions as [start1, end1, start2, end2, ...]
@@ -193,25 +204,51 @@ public class MapList
    */
   public MapList(int from[], int to[], int fromRatio, int toRatio)
   {
+    this();
     this.fromRatio = fromRatio;
     this.toRatio = toRatio;
-    fromLowest = from[0];
-    fromHighest = from[1];
+    fromLowest = Integer.MAX_VALUE;
+    fromHighest = Integer.MIN_VALUE;
+    int added = 0;
+
     for (int i = 0; i < from.length; i += 2)
     {
-      fromLowest = Math.min(fromLowest, from[i]);
-      fromHighest = Math.max(fromHighest, from[i + 1]);
-
-      fromShifts.add(new int[] { from[i], from[i + 1] });
+      /*
+       * note lowest and highest values - bearing in mind the
+       * direction may be revesed
+       */
+      fromLowest = Math.min(fromLowest, Math.min(from[i], from[i + 1]));
+      fromHighest = Math.max(fromHighest, Math.max(from[i], from[i + 1]));
+      if (added > 0 && from[i] == fromShifts.get(added - 1)[1])
+      {
+        /*
+         * this range starts where the last ended - just extend it
+         */
+        fromShifts.get(added - 1)[1] = from[i + 1];
+      }
+      else
+      {
+        fromShifts.add(new int[] { from[i], from[i + 1] });
+        added++;
+      }
     }
 
-    toLowest = to[0];
-    toHighest = to[1];
+    toLowest = Integer.MAX_VALUE;
+    toHighest = Integer.MIN_VALUE;
+    added = 0;
     for (int i = 0; i < to.length; i += 2)
     {
-      toLowest = Math.min(toLowest, to[i]);
-      toHighest = Math.max(toHighest, to[i + 1]);
-      toShifts.add(new int[] { to[i], to[i + 1] });
+      toLowest = Math.min(toLowest, Math.min(to[i], to[i + 1]));
+      toHighest = Math.max(toHighest, Math.max(to[i], to[i + 1]));
+      if (added > 0 && to[i] == toShifts.get(added - 1)[1])
+      {
+        toShifts.get(added - 1)[1] = to[i + 1];
+      }
+      else
+      {
+        toShifts.add(new int[] { to[i], to[i + 1] });
+        added++;
+      }
     }
   }
 
@@ -222,6 +259,7 @@ public class MapList
    */
   public MapList(MapList map)
   {
+    this();
     // TODO not used - remove?
     this.fromLowest = map.fromLowest;
     this.fromHighest = map.fromHighest;
@@ -247,7 +285,8 @@ public class MapList
   }
 
   /**
-   * Constructor given ranges as lists of [start, end] positions
+   * Constructor given ranges as lists of [start, end] positions. There is no
+   * validation check that the ranges do not overlap each other.
    * 
    * @param fromRange
    * @param toRange
@@ -257,26 +296,105 @@ public class MapList
   public MapList(List<int[]> fromRange, List<int[]> toRange, int fromRatio,
           int toRatio)
   {
+    this();
+    fromRange = coalesceRanges(fromRange);
+    toRange = coalesceRanges(toRange);
     this.fromShifts = fromRange;
     this.toShifts = toRange;
     this.fromRatio = fromRatio;
     this.toRatio = toRatio;
 
     fromLowest = Integer.MAX_VALUE;
-    fromHighest = 0;
+    fromHighest = Integer.MIN_VALUE;
     for (int[] range : fromRange)
     {
-      fromLowest = Math.min(fromLowest, range[0]);
-      fromHighest = Math.max(fromHighest, range[1]);
+      fromLowest = Math.min(fromLowest, Math.min(range[0], range[1]));
+      fromHighest = Math.max(fromHighest, Math.max(range[0], range[1]));
     }
 
     toLowest = Integer.MAX_VALUE;
-    toHighest = 0;
+    toHighest = Integer.MIN_VALUE;
     for (int[] range : toRange)
     {
-      toLowest = Math.min(toLowest, range[0]);
-      toHighest = Math.max(toHighest, range[1]);
+      toLowest = Math.min(toLowest, Math.min(range[0], range[1]));
+      toHighest = Math.max(toHighest, Math.max(range[0], range[1]));
+    }
+  }
+
+  /**
+   * Consolidates a list of ranges so that any contiguous ranges are merged.
+   * This assumes the ranges are already in start order (does not sort them).
+   * 
+   * @param ranges
+   * @return the same list (if unchanged), else a new merged list, leaving the
+   *         input list unchanged
+   */
+  public static List<int[]> coalesceRanges(final List<int[]> ranges)
+  {
+    if (ranges == null || ranges.size() < 2) {
+      return ranges;
+    }
+
+    boolean changed = false;
+    List<int[]> merged = new ArrayList<int[]>();
+    int[] lastRange = ranges.get(0);
+    int lastDirection = lastRange[1] >= lastRange[0] ? 1 : -1;
+    lastRange = new int[] { lastRange[0], lastRange[1] };
+    merged.add(lastRange);
+    boolean first = true;
+    
+    for (final int[] range : ranges)
+    {
+      if (first)
+      {
+        first = false;
+        continue;
+      }
+      if (range[0] == lastRange[0] && range[1] == lastRange[1])
+      {
+        // drop duplicate range
+        changed = true;
+        continue;
+      }
+
+      /*
+       * drop this range if it lies within the last range
+       */
+      if ((lastDirection == 1 && range[0] >= lastRange[0]
+              && range[0] <= lastRange[1] && range[1] >= lastRange[0] && range[1] <= lastRange[1])
+              || (lastDirection == -1 && range[0] <= lastRange[0]
+                      && range[0] >= lastRange[1]
+                      && range[1] <= lastRange[0] && range[1] >= lastRange[1]))
+      {
+        changed = true;
+        continue;
+      }
+
+      int direction = range[1] >= range[0] ? 1 : -1;
+
+      /*
+       * if next range is in the same direction as last and contiguous,
+       * just update the end position of the last range
+       */
+      boolean sameDirection = range[1] == range[0] || direction == lastDirection;
+      boolean extending = range[0] == lastRange[1] + lastDirection;
+      boolean overlapping = (lastDirection == 1 && range[0] >= lastRange[0] && range[0] <= lastRange[1])
+              || (lastDirection == -1 && range[0] <= lastRange[0] && range[0] >= lastRange[1]);
+      if (sameDirection && (overlapping || extending))
+      {
+        lastRange[1] = range[1];
+        changed = true;
+      }
+      else
+      {
+        lastRange = new int[] { range[0], range[1] };
+        merged.add(lastRange);
+        // careful: merging [5, 5] after [7, 6] should keep negative direction
+        lastDirection = (range[1] == range[0]) ? lastDirection : direction;
+      }
     }
+    
+    return changed ? merged : ranges;
   }
 
   /**
@@ -849,13 +967,14 @@ public class MapList
   public String toString()
   {
     StringBuilder sb = new StringBuilder(64);
-    sb.append("From (").append(fromRatio).append(":").append(toRatio)
-            .append(") [");
+    sb.append("[");
     for (int[] shift : fromShifts)
     {
       sb.append(" ").append(Arrays.toString(shift));
     }
-    sb.append(" ] To [");
+    sb.append(" ] ");
+    sb.append(fromRatio).append(":").append(toRatio);
+    sb.append(" to [");
     for (int[] shift : toShifts)
     {
       sb.append(" ").append(Arrays.toString(shift));
@@ -863,4 +982,109 @@ public class MapList
     sb.append(" ]");
     return sb.toString();
   }
+
+  /**
+   * Extend this map list by adding the given map's ranges. There is no
+   * validation check that the ranges do not overlap existing ranges (or each
+   * other), but contiguous ranges are merged.
+   * 
+   * @param map
+   */
+  public void addMapList(MapList map)
+  {
+    this.fromLowest = Math.min(fromLowest, map.fromLowest);
+    this.toLowest = Math.min(toLowest, map.toLowest);
+    this.fromHighest = Math.max(fromHighest, map.fromHighest);
+    this.toHighest = Math.max(toHighest, map.toHighest);
+
+    for (int[] range : map.getFromRanges())
+    {
+      addRange(range, fromShifts);
+    }
+    for (int[] range : map.getToRanges())
+    {
+      addRange(range, toShifts);
+    }
+  }
+
+  /**
+   * Adds the given range to a list of ranges. If the new range just extends
+   * existing ranges, the current endpoint is updated instead.
+   * 
+   * @param range
+   * @param addTo
+   */
+  static void addRange(int[] range, List<int[]> addTo)
+  {
+    /*
+     * list is empty - add to it!
+     */
+    if (addTo.size() == 0)
+    {
+      addTo.add(range);
+      return;
+    }
+
+    int[] last = addTo.get(addTo.size() - 1);
+    boolean lastForward = last[1] >= last[0];
+    boolean newForward = range[1] >= range[0];
+
+    /*
+     * contiguous range in the same direction - just update endpoint
+     */
+    if (lastForward == newForward && last[1] == range[0])
+    {
+      last[1] = range[1];
+      return;
+    }
+
+    /*
+     * next range starts at +1 in forward sense - update endpoint
+     */
+    if (lastForward && newForward && range[0] == last[1] + 1)
+    {
+      last[1] = range[1];
+      return;
+    }
+
+    /*
+     * next range starts at -1 in reverse sense - update endpoint
+     */
+    if (!lastForward && !newForward && range[0] == last[1] - 1)
+    {
+      last[1] = range[1];
+      return;
+    }
+
+    /*
+     * just add the new range
+     */
+    addTo.add(range);
+  }
+
+  /**
+   * Returns true if mapping is from forward strand, false if from reverse
+   * strand. Result is just based on the first 'from' range that is not a single
+   * position. Default is true unless proven to be false. Behaviour is not well
+   * defined if the mapping has a mixture of forward and reverse ranges.
+   * 
+   * @return
+   */
+  public boolean isFromForwardStrand()
+  {
+    boolean forwardStrand = true;
+    for (int[] range : getFromRanges())
+    {
+      if (range[1] > range[0])
+      {
+        break; // forward strand confirmed
+      }
+      else if (range[1] < range[0])
+      {
+        forwardStrand = false;
+        break; // reverse strand confirmed
+      }
+    }
+    return forwardStrand;
+  }
 }
index 45d166d..ae4e55d 100644 (file)
@@ -38,12 +38,11 @@ import jalview.datamodel.SequenceGroup;
 import jalview.datamodel.SequenceI;
 
 import java.util.ArrayList;
-import java.util.Collections;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 /**
  * Helper methods for manipulations involving sequence mappings.
@@ -69,7 +68,7 @@ public final class MappingUtils
    */
   protected static void mapCutOrPaste(Edit edit, boolean undo,
           List<SequenceI> targetSeqs, EditCommand result,
-          Set<AlignedCodonFrame> mappings)
+          List<AlignedCodonFrame> mappings)
   {
     Action action = edit.getAction();
     if (undo)
@@ -93,7 +92,7 @@ public final class MappingUtils
    */
   public static EditCommand mapEditCommand(EditCommand command,
           boolean undo, final AlignmentI mapTo, char gapChar,
-          Set<AlignedCodonFrame> mappings)
+          List<AlignedCodonFrame> mappings)
   {
     /*
      * For now, only support mapping from protein edits to cDna
@@ -165,7 +164,7 @@ public final class MappingUtils
           Map<SequenceI, SequenceI> originalSequences,
           final List<SequenceI> targetSeqs,
           Map<SequenceI, SequenceI> targetCopies, char gapChar,
-          EditCommand result, Set<AlignedCodonFrame> mappings)
+          EditCommand result, List<AlignedCodonFrame> mappings)
   {
     Action action = edit.getAction();
 
@@ -268,7 +267,7 @@ public final class MappingUtils
    * @return
    */
   public static SearchResults buildSearchResults(SequenceI seq, int index,
-          Set<AlignedCodonFrame> seqmappings)
+          List<AlignedCodonFrame> seqmappings)
   {
     SearchResults results = new SearchResults();
     addSearchResults(results, seq, index, seqmappings);
@@ -285,7 +284,7 @@ public final class MappingUtils
    * @param seqmappings
    */
   public static void addSearchResults(SearchResults results, SequenceI seq,
-          int index, Set<AlignedCodonFrame> seqmappings)
+          int index, List<AlignedCodonFrame> seqmappings)
   {
     if (index >= seq.getStart() && index <= seq.getEnd())
     {
@@ -314,7 +313,7 @@ public final class MappingUtils
      */
     boolean targetIsNucleotide = mapTo.isNucleotide();
     AlignViewportI protein = targetIsNucleotide ? mapFrom : mapTo;
-    Set<AlignedCodonFrame> codonFrames = protein.getAlignment()
+    List<AlignedCodonFrame> codonFrames = protein.getAlignment()
             .getCodonFrames();
     /*
      * Copy group name, colours etc, but not sequences or sequence colour scheme
@@ -375,15 +374,15 @@ public final class MappingUtils
               /*
                * Found a sequence mapping. Locate the start/end mapped residues.
                */
+              List<AlignedCodonFrame> mapping = Arrays.asList(new AlignedCodonFrame[] { acf });
               SearchResults sr = buildSearchResults(selected,
-                      startResiduePos, Collections.singleton(acf));
+                      startResiduePos, mapping);
               for (Match m : sr.getResults())
               {
                 mappedStartResidue = m.getStart();
                 mappedEndResidue = m.getEnd();
               }
-              sr = buildSearchResults(selected, endResiduePos,
-                      Collections.singleton(acf));
+              sr = buildSearchResults(selected, endResiduePos, mapping);
               for (Match m : sr.getResults())
               {
                 mappedStartResidue = Math.min(mappedStartResidue,
@@ -428,7 +427,7 @@ public final class MappingUtils
    * @return
    */
   public static CommandI mapOrderCommand(OrderCommand command,
-          boolean undo, AlignmentI mapTo, Set<AlignedCodonFrame> mappings)
+          boolean undo, AlignmentI mapTo, List<AlignedCodonFrame> mappings)
   {
     SequenceI[] sortOrder = command.getSequenceOrder(undo);
     List<SequenceI> mappedOrder = new ArrayList<SequenceI>();
@@ -512,7 +511,7 @@ public final class MappingUtils
   {
     boolean targetIsNucleotide = mapTo.isNucleotide();
     AlignViewportI protein = targetIsNucleotide ? mapFrom : mapTo;
-    Set<AlignedCodonFrame> codonFrames = protein.getAlignment()
+    List<AlignedCodonFrame> codonFrames = protein.getAlignment()
             .getCodonFrames();
     ColumnSelection mappedColumns = new ColumnSelection();
 
@@ -523,8 +522,6 @@ public final class MappingUtils
 
     char fromGapChar = mapFrom.getAlignment().getGapCharacter();
 
-    // FIXME allow for hidden columns
-
     /*
      * For each mapped column, find the range of columns that residues in that
      * column map to.
@@ -558,7 +555,7 @@ public final class MappingUtils
    * @param fromGapChar
    */
   protected static void mapHiddenColumns(int[] hidden,
-          Set<AlignedCodonFrame> mappings,
+          List<AlignedCodonFrame> mappings,
           ColumnSelection mappedColumns, List<SequenceI> fromSequences,
           List<SequenceI> toSequences, char fromGapChar)
   {
@@ -591,7 +588,8 @@ public final class MappingUtils
    * @param toSequences
    * @param fromGapChar
    */
-  protected static void mapColumn(int col, Set<AlignedCodonFrame> mappings,
+  protected static void mapColumn(int col,
+          List<AlignedCodonFrame> mappings,
           ColumnSelection mappedColumns, List<SequenceI> fromSequences,
           List<SequenceI> toSequences, char fromGapChar)
   {
@@ -625,7 +623,7 @@ public final class MappingUtils
    * @return
    */
   protected static int[] findMappedColumns(int col,
-          Set<AlignedCodonFrame> mappings, List<SequenceI> fromSequences,
+          List<AlignedCodonFrame> mappings, List<SequenceI> fromSequences,
           List<SequenceI> toSequences, char fromGapChar)
   {
     int[] mappedTo = new int[] { Integer.MAX_VALUE, Integer.MIN_VALUE };
@@ -679,8 +677,8 @@ public final class MappingUtils
   }
 
   /**
-   * Returns the mapped codon for a given aligned sequence column position (base
-   * 0).
+   * Returns the mapped codon or codons for a given aligned sequence column
+   * position (base 0).
    * 
    * @param seq
    *          an aligned peptide sequence
@@ -688,26 +686,32 @@ public final class MappingUtils
    *          an aligned column position (base 0)
    * @param mappings
    *          a set of codon mappings
-   * @return the bases of the mapped codon in the cDNA dataset sequence, or null
-   *         if not found
+   * @return the bases of the mapped codon(s) in the cDNA dataset sequence(s),
+   *         or an empty list if none found
    */
-  public static char[] findCodonFor(SequenceI seq, int col,
-          Set<AlignedCodonFrame> mappings)
+  public static List<char[]> findCodonsFor(SequenceI seq, int col,
+          List<AlignedCodonFrame> mappings)
   {
+    List<char[]> result = new ArrayList<char[]>();
     int dsPos = seq.findPosition(col);
     for (AlignedCodonFrame mapping : mappings)
     {
       if (mapping.involvesSequence(seq))
       {
-        return mapping.getMappedCodon(seq.getDatasetSequence(), dsPos);
+        List<char[]> codons = mapping.getMappedCodons(
+                seq.getDatasetSequence(), dsPos);
+        if (codons != null)
+        {
+          result.addAll(codons);
+        }
       }
     }
-    return null;
+    return result;
   }
 
   /**
-   * Converts a series of [start, end] ranges into an array of individual
-   * positions.
+   * Converts a series of [start, end] range pairs into an array of individual
+   * positions. This also caters for 'reverse strand' (start > end) cases.
    * 
    * @param ranges
    * @return
@@ -720,17 +724,21 @@ public final class MappingUtils
     int count = 0;
     for (int i = 0; i < ranges.length - 1; i += 2)
     {
-      count += ranges[i + 1] - ranges[i] + 1;
+      count += Math.abs(ranges[i + 1] - ranges[i]) + 1;
     }
 
     int[] result = new int[count];
     int k = 0;
     for (int i = 0; i < ranges.length - 1; i += 2)
     {
-      for (int j = ranges[i]; j <= ranges[i + 1]; j++)
+      int from = ranges[i];
+      final int to = ranges[i + 1];
+      int step = from <= to ? 1 : -1;
+      do
       {
-        result[k++] = j;
-      }
+        result[k++] = from;
+        from += step;
+      } while (from != to + step);
     }
     return result;
   }
@@ -744,7 +752,7 @@ public final class MappingUtils
    * @return
    */
   public static List<AlignedCodonFrame> findMappingsForSequence(
-          SequenceI sequence, Set<AlignedCodonFrame> mappings)
+          SequenceI sequence, List<AlignedCodonFrame> mappings)
   {
     List<AlignedCodonFrame> result = new ArrayList<AlignedCodonFrame>();
     if (sequence == null || mappings == null)
@@ -760,4 +768,128 @@ public final class MappingUtils
     }
     return result;
   }
+
+  /**
+   * Returns the total length of the supplied ranges, which may be as single
+   * [start, end] or multiple [start, end, start, end ...]
+   * 
+   * @param ranges
+   * @return
+   */
+  public static int getLength(List<int[]> ranges)
+  {
+    if (ranges == null)
+    {
+      return 0;
+    }
+    int length = 0;
+    for (int[] range : ranges)
+    {
+      if (range.length % 2 != 0)
+      {
+        System.err.println("Error unbalance start/end ranges: "
+                + ranges.toString());
+        return 0;
+      }
+      for (int i = 0; i < range.length - 1; i += 2)
+      {
+        length += Math.abs(range[i + 1] - range[i]) + 1;
+      }
+    }
+    return length;
+  }
+
+  /**
+   * Answers true if any range includes the given value
+   * 
+   * @param ranges
+   * @param value
+   * @return
+   */
+  public static boolean contains(List<int[]> ranges, int value)
+  {
+    if (ranges == null)
+    {
+      return false;
+    }
+    for (int[] range : ranges)
+    {
+      if (range[1] >= range[0] && value >= range[0] && value <= range[1])
+      {
+        /*
+         * value within ascending range
+         */
+        return true;
+      }
+      if (range[1] < range[0] && value <= range[0] && value >= range[1])
+      {
+        /*
+         * value within descending range
+         */
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Removes a specified number of positions from the start of a ranges list.
+   * For example, could be used to adjust cds ranges to allow for an incomplete
+   * start codon. Subranges are removed completely, or their start positions
+   * adjusted, until the required number of positions has been removed from the
+   * range. Reverse strand ranges are supported. The input array is not
+   * modified.
+   * 
+   * @param removeCount
+   * @param ranges
+   *          an array of [start, end, start, end...] positions
+   * @return a new array with the first removeCount positions removed
+   */
+  public static int[] removeStartPositions(int removeCount,
+          final int[] ranges)
+  {
+    if (removeCount <= 0)
+    {
+      return ranges;
+    }
+  
+    int[] copy = Arrays.copyOf(ranges, ranges.length);
+    int sxpos = -1;
+    int cdspos = 0;
+    for (int x = 0; x < copy.length && sxpos == -1; x += 2)
+    {
+      cdspos += Math.abs(copy[x + 1] - copy[x]) + 1;
+      if (removeCount < cdspos)
+      {
+        /*
+         * we have removed enough, time to finish
+         */
+        sxpos = x;
+
+        /*
+         * increment start of first exon, or decrement if reverse strand
+         */
+        if (copy[x] <= copy[x + 1])
+        {
+          copy[x] = copy[x + 1] - cdspos + removeCount + 1;
+        }
+        else
+        {
+          copy[x] = copy[x + 1] + cdspos - removeCount - 1;
+        }
+        break;
+      }
+    }
+  
+    if (sxpos > 0)
+    {
+      /*
+       * we dropped at least one entire sub-range - compact the array
+       */
+      int[] nxon = new int[copy.length - sxpos];
+      System.arraycopy(copy, sxpos, nxon, 0, copy.length - sxpos);
+      return nxon;
+    }
+    return copy;
+  }
 }
index 533e98b..6044655 100644 (file)
@@ -248,4 +248,55 @@ public class StringUtils
     }
     return "" + separator;
   }
+  
+  /**
+   * Converts a list to a string with a delimiter before each term except the
+   * first. Returns an empty string given a null or zero-length argument. This
+   * can be replaced with StringJoiner in Java 8.
+   * 
+   * @param terms
+   * @param delim
+   * @return
+   */
+  public static String listToDelimitedString(List<String> terms,
+          String delim)
+  {
+    StringBuilder sb = new StringBuilder(32);
+    if (terms != null && !terms.isEmpty())
+    {
+      boolean appended = false;
+      for (String term : terms)
+      {
+        if (appended)
+        {
+          sb.append(delim);
+        }
+        appended = true;
+        sb.append(term);
+      }
+    }
+    return sb.toString();
+  }
+
+  /**
+   * Convenience method to parse a string to an integer, returning 0 if the
+   * input is null or not a valid integer
+   * 
+   * @param s
+   * @return
+   */
+  public static int parseInt(String s)
+  {
+    int result = 0;
+    if (s != null && s.length() > 0)
+    {
+      try
+      {
+        result = Integer.parseInt(s);
+      } catch (NumberFormatException ex)
+      {
+      }
+    }
+    return result;
+  }
 }
index c4ae76d..fbd1622 100644 (file)
@@ -49,6 +49,7 @@ import jalview.structure.CommandListener;
 import jalview.structure.StructureSelectionManager;
 import jalview.structure.VamsasSource;
 import jalview.util.Comparison;
+import jalview.util.MapList;
 import jalview.util.MappingUtils;
 import jalview.viewmodel.styles.ViewStyle;
 import jalview.workers.AlignCalcManager;
@@ -65,7 +66,6 @@ import java.util.HashMap;
 import java.util.Hashtable;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 /**
  * base class holding visualization and analysis attributes and common logic for
@@ -837,15 +837,28 @@ public abstract class AlignmentViewport implements AlignViewportI,
 
     /*
      * A separate thread to compute cDNA consensus for a protein alignment
+     * which has mapping to cDNA
      */
     final AlignmentI al = this.getAlignment();
     if (!al.isNucleotide() && al.getCodonFrames() != null
             && !al.getCodonFrames().isEmpty())
     {
-      if (calculator
-              .getRegisteredWorkersOfClass(ComplementConsensusThread.class) == null)
+      /*
+       * fudge - check first mapping is protein-to-nucleotide
+       * (we don't want to do this for protein-to-protein)
+       */
+      AlignedCodonFrame mapping = al.getCodonFrames().iterator().next();
+      // TODO hold mapping type e.g. dna-to-protein in AlignedCodonFrame?
+      MapList[] mapLists = mapping.getdnaToProt();
+      // mapLists can be empty if project load has not finished resolving seqs
+      if (mapLists.length > 0 && mapLists[0].getFromRatio() == 3)
       {
-        calculator.registerWorker(new ComplementConsensusThread(this, ap));
+        if (calculator
+                .getRegisteredWorkersOfClass(ComplementConsensusThread.class) == null)
+        {
+          calculator
+                  .registerWorker(new ComplementConsensusThread(this, ap));
+        }
       }
     }
   }
@@ -1424,7 +1437,7 @@ public abstract class AlignmentViewport implements AlignViewportI,
 
     if (hiddenRepSequences == null)
     {
-      hiddenRepSequences = new Hashtable();
+      hiddenRepSequences = new Hashtable<SequenceI, SequenceCollectionI>();
     }
 
     hiddenRepSequences.put(repSequence, sg);
@@ -1450,13 +1463,42 @@ public abstract class AlignmentViewport implements AlignViewportI,
 
   }
 
+  /**
+   * 
+   * @return null or the current reference sequence
+   */
+  public SequenceI getReferenceSeq()
+  {
+    return alignment.getSeqrep();
+  }
+
+  /**
+   * @param seq
+   * @return true iff seq is the reference for the alignment
+   */
+  public boolean isReferenceSeq(SequenceI seq)
+  {
+    return alignment.getSeqrep() == seq;
+  }
+
+  /**
+   * 
+   * @param seq
+   * @return true if there are sequences represented by this sequence that are
+   *         currently hidden
+   */
   public boolean isHiddenRepSequence(SequenceI seq)
   {
-    return alignment.getSeqrep() == seq
-            || (hiddenRepSequences != null && hiddenRepSequences
+    return (hiddenRepSequences != null && hiddenRepSequences
                     .containsKey(seq));
   }
 
+  /**
+   * 
+   * @param seq
+   * @return null or a sequence group containing the sequences that seq
+   *         represents
+   */
   public SequenceGroup getRepresentedSequences(SequenceI seq)
   {
     return (SequenceGroup) (hiddenRepSequences == null ? null
@@ -1557,9 +1599,20 @@ public abstract class AlignmentViewport implements AlignViewportI,
     }
     else
     {
-      iSize = alignment.getHeight();
-      seqs = alignment.getSequencesArray();
-      end = alignment.getWidth();
+      if (hasHiddenRows())
+      {
+        iSize = alignment.getHiddenSequences().getFullAlignment()
+                .getHeight();
+        seqs = alignment.getHiddenSequences().getFullAlignment()
+                .getSequencesArray();
+        end = alignment.getHiddenSequences().getFullAlignment().getWidth();
+      }
+      else
+      {
+        iSize = alignment.getHeight();
+        seqs = alignment.getSequencesArray();
+        end = alignment.getWidth();
+      }
     }
 
     selection = new String[iSize];
@@ -1769,14 +1822,22 @@ public abstract class AlignmentViewport implements AlignViewportI,
   {
     if (!alignment.isNucleotide())
     {
-      final Set<AlignedCodonFrame> codonMappings = alignment
+      final List<AlignedCodonFrame> codonMappings = alignment
               .getCodonFrames();
       if (codonMappings != null && !codonMappings.isEmpty())
       {
-        complementConsensus = new AlignmentAnnotation("cDNA Consensus",
-                "PID for cDNA", new Annotation[1], 0f, 100f,
-                AlignmentAnnotation.BAR_GRAPH);
-        initConsensus(complementConsensus);
+        // fudge: check mappings are not protein-to-protein
+        // TODO: nicer
+        AlignedCodonFrame mapping = codonMappings.iterator().next();
+        MapList[] mapLists = mapping.getdnaToProt();
+        // mapLists can be empty if project load has not finished resolving seqs
+        if (mapLists.length > 0 && mapLists[0].getFromRatio() == 3)
+        {
+          complementConsensus = new AlignmentAnnotation("cDNA Consensus",
+                  "PID for cDNA", new Annotation[1], 0f, 100f,
+                  AlignmentAnnotation.BAR_GRAPH);
+          initConsensus(complementConsensus);
+        }
       }
     }
   }
@@ -2088,7 +2149,7 @@ public abstract class AlignmentViewport implements AlignViewportI,
   public boolean areFeaturesDisplayed()
   {
     return featuresDisplayed != null
-            && featuresDisplayed.getRegisterdFeaturesCount() > 0;
+            && featuresDisplayed.getRegisteredFeaturesCount() > 0;
   }
 
   /**
@@ -2569,7 +2630,7 @@ public abstract class AlignmentViewport implements AlignViewportI,
     {
       return 0;
     }
-    final Set<AlignedCodonFrame> mappings = proteinAlignment
+    final List<AlignedCodonFrame> mappings = proteinAlignment
             .getCodonFrames();
 
     /*
@@ -2623,4 +2684,37 @@ public abstract class AlignmentViewport implements AlignViewportI,
             sequence.findPosition(middleColumn), mappings);
     return seqOffset;
   }
+
+  /**
+   * synthesize a column selection if none exists so it covers the given
+   * selection group. if wholewidth is false, no column selection is made if the
+   * selection group covers the whole alignment width.
+   * 
+   * @param sg
+   * @param wholewidth
+   */
+  public void expandColSelection(SequenceGroup sg, boolean wholewidth)
+  {
+    int sgs, sge;
+    if (sg != null
+            && (sgs = sg.getStartRes()) >= 0
+            && sg.getStartRes() <= (sge = sg.getEndRes())
+            && (colSel == null || colSel.getSelected() == null || colSel
+                    .getSelected().size() == 0))
+    {
+      if (!wholewidth && alignment.getWidth() == (1 + sge - sgs))
+      {
+        // do nothing
+        return;
+      }
+      if (colSel == null)
+      {
+        colSel = new ColumnSelection();
+      }
+      for (int cspos = sg.getStartRes(); cspos <= sg.getEndRes(); cspos++)
+      {
+        colSel.addElement(cspos);
+      }
+    }
+  }
 }
index b299624..a4e4348 100644 (file)
@@ -36,6 +36,7 @@ import java.beans.PropertyChangeListener;
 import java.beans.PropertyChangeSupport;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.List;
@@ -572,9 +573,7 @@ public abstract class FeatureRendererModel implements
   @Override
   public void setColour(String featureType, FeatureColourI col)
   {
-    {
-      featureColours.put(featureType, col);
-    }
+     featureColours.put(featureType, col);
   }
 
   public void setTransparency(float value)
@@ -636,21 +635,32 @@ public abstract class FeatureRendererModel implements
    * 
    * @param data
    *          { String(Type), Colour(Type), Boolean(Displayed) }
+   * @return true if any visible features have been reordered, else false
    */
-  public void setFeaturePriority(Object[][] data)
+  public boolean setFeaturePriority(Object[][] data)
   {
-    setFeaturePriority(data, true);
+    return setFeaturePriority(data, true);
   }
 
   /**
+   * Sets the priority order for features
    * 
    * @param data
    *          { String(Type), Colour(Type), Boolean(Displayed) }
    * @param visibleNew
    *          when true current featureDisplay list will be cleared
+   * @return true if any visible features have been reordered or recoloured,
+   *         else false (i.e. no need to repaint)
    */
-  public void setFeaturePriority(Object[][] data, boolean visibleNew)
+  public boolean setFeaturePriority(Object[][] data, boolean visibleNew)
   {
+    /*
+     * note visible feature ordering and colours before update
+     */
+    List<String> visibleFeatures = getDisplayedFeatureTypes();
+    Map<String, FeatureColourI> visibleColours = new HashMap<String, FeatureColourI>(
+            getFeatureColours());
+
     FeaturesDisplayedI av_featuresdisplayed = null;
     if (visibleNew)
     {
@@ -669,10 +679,10 @@ public abstract class FeatureRendererModel implements
     }
     if (data == null)
     {
-      return;
+      return false;
     }
     // The feature table will display high priority
-    // features at the top, but theses are the ones
+    // features at the top, but these are the ones
     // we need to render last, so invert the data
     renderOrder = new String[data.length];
 
@@ -691,6 +701,30 @@ public abstract class FeatureRendererModel implements
       }
     }
 
+    /*
+     * get the new visible ordering and return true if it has changed
+     * order or any colour has changed
+     */
+    List<String> reorderedVisibleFeatures = getDisplayedFeatureTypes();
+    if (!visibleFeatures.equals(reorderedVisibleFeatures))
+    {
+      /*
+       * the list of ordered visible features has changed
+       */
+      return true;
+    }
+
+    /*
+     * return true if any feature colour has changed
+     */
+    for (String feature : visibleFeatures)
+    {
+      if (visibleColours.get(feature) != getFeatureStyle(feature))
+      {
+        return true;
+      }
+    }
+    return false;
   }
 
   /**
@@ -726,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<String> getRenderOrder()
   {
     if (renderOrder == null)
@@ -775,7 +812,7 @@ public abstract class FeatureRendererModel implements
    * @return list of groups
    */
   @Override
-  public List<String> getGroups(boolean visible)
+  public List getGroups(boolean visible)
   {
     if (featureGroups != null)
     {
@@ -846,39 +883,39 @@ public abstract class FeatureRendererModel implements
     return av.getFeaturesDisplayed();
   }
 
+  /**
+   * Returns a (possibly empty) list of visible feature types, in render order
+   * (last is on top)
+   */
   @Override
-  public String[] getDisplayedFeatureTypes()
+  public List<String> getDisplayedFeatureTypes()
   {
-    String[] typ = null;
-    typ = getRenderOrder().toArray(new String[0]);
+    List<String> typ = getRenderOrder();
+    List<String> displayed = new ArrayList<String>();
     FeaturesDisplayedI feature_disp = av.getFeaturesDisplayed();
     if (feature_disp != null)
     {
       synchronized (feature_disp)
       {
-        for (int i = 0; i < typ.length; i++)
+        for (String type : typ)
         {
-          if (!feature_disp.isVisible(typ[i]))
+          if (feature_disp.isVisible(type))
           {
-            typ[i] = null;
+            displayed.add(type);
           }
         }
       }
     }
-    return typ;
+    return displayed;
   }
 
   @Override
-  public String[] getDisplayedFeatureGroups()
+  public List<String> getDisplayedFeatureGroups()
   {
-    String[] gps = null;
-    ArrayList<String> _gps = new ArrayList<String>();
-    Iterator en = getFeatureGroups().iterator();
-    int g = 0;
+    List<String> _gps = new ArrayList<String>();
     boolean valid = false;
-    while (en.hasNext())
+    for (String gp : getFeatureGroups())
     {
-      String gp = (String) en.next();
       if (checkGroupVisibility(gp, false))
       {
         valid = true;
@@ -890,11 +927,11 @@ public abstract class FeatureRendererModel implements
       }
       else
       {
-        gps = new String[_gps.size()];
-        _gps.toArray(gps);
+        // gps = new String[_gps.size()];
+        // _gps.toArray(gps);
       }
     }
-    return gps;
+    return _gps;
   }
 
 }
index 3f9e3d8..4c7e3c4 100644 (file)
@@ -62,7 +62,7 @@ public class FeaturesDisplayed implements FeaturesDisplayedI
   }
 
   @Override
-  public boolean areVisible(Collection featureTypes)
+  public boolean areVisible(Collection<String> featureTypes)
   {
     return featuresDisplayed.containsAll(featureTypes);
   }
@@ -75,7 +75,7 @@ public class FeaturesDisplayed implements FeaturesDisplayedI
   }
 
   @Override
-  public void setAllVisible(Collection makeVisible)
+  public void setAllVisible(Collection<String> makeVisible)
   {
     featuresDisplayed.addAll(makeVisible);
     featuresRegistered.addAll(makeVisible);
@@ -107,7 +107,7 @@ public class FeaturesDisplayed implements FeaturesDisplayedI
   }
 
   @Override
-  public int getRegisterdFeaturesCount()
+  public int getRegisteredFeaturesCount()
   {
     return featuresRegistered.size();
   }
index bca3145..48e3604 100644 (file)
@@ -46,7 +46,7 @@ public abstract class AlignCalcWorker implements AlignCalcWorkerI
 
   protected AlignmentViewPanel ap;
 
-  protected List<AlignmentAnnotation> ourAnnots = null;
+  protected List<AlignmentAnnotation> ourAnnots;
 
   public AlignCalcWorker(AlignViewportI alignViewport,
           AlignmentViewPanel alignPanel)
@@ -68,17 +68,18 @@ public abstract class AlignCalcWorker implements AlignCalcWorkerI
 
   }
 
+  @Override
   public boolean involves(AlignmentAnnotation i)
   {
     return ourAnnots != null && ourAnnots.contains(i);
   }
 
   /**
-   * permanently remove from the alignment all annotation rows managed by this
+   * Permanently removes from the alignment all annotation rows managed by this
    * worker
    */
   @Override
-  public void removeOurAnnotation()
+  public void removeAnnotation()
   {
     if (ourAnnots != null && alignViewport != null)
     {
@@ -90,6 +91,7 @@ public abstract class AlignCalcWorker implements AlignCalcWorkerI
           alignment.deleteAnnotation(aa, true);
         }
       }
+      ourAnnots.clear();
     }
   }
   // TODO: allow GUI to query workers associated with annotation to add items to
diff --git a/src/jalview/workers/AlignmentAnnotationFactory.java b/src/jalview/workers/AlignmentAnnotationFactory.java
new file mode 100644 (file)
index 0000000..37f3ca5
--- /dev/null
@@ -0,0 +1,117 @@
+package jalview.workers;
+
+import jalview.datamodel.AlignmentAnnotation;
+import jalview.datamodel.Annotation;
+import jalview.gui.AlignFrame;
+import jalview.gui.Desktop;
+
+import java.awt.Color;
+
+/**
+ * Factory class with methods which allow clients (including external scripts
+ * such as Groovy) to 'register and forget' an alignment annotation calculator. <br>
+ * Currently supports two flavours of calculator:
+ * <ul>
+ * <li>a 'feature counter' which can count any desired property derivable from
+ * residue value and any sequence features at each position of the alignment</li>
+ * <li>a 'general purpose' calculator which computes one more complete
+ * AlignmentAnnotation objects</li>
+ * </ul>
+ */
+public class AlignmentAnnotationFactory
+{
+  /**
+   * Constructs and registers a new alignment annotation worker
+   * 
+   * @param counter
+   *          provider of feature counts per alignment position
+   */
+  public static void newCalculator(FeatureCounterI counter)
+  {
+    if (Desktop.getCurrentAlignFrame() != null)
+    {
+      newCalculator(Desktop.getCurrentAlignFrame(), counter);
+    }
+    else
+    {
+      System.err
+              .println("Can't register calculator as no alignment window has focus");
+    }
+  }
+
+  /**
+   * Constructs and registers a new alignment annotation worker
+   * 
+   * @param af
+   *          the AlignFrame for which the annotation is to be calculated
+   * @param counter
+   *          provider of feature counts per alignment position
+   */
+  public static void newCalculator(AlignFrame af, FeatureCounterI counter)
+  {
+    new ColumnCounterWorker(af, counter);
+  }
+
+  /**
+   * Constructs and registers a new alignment annotation worker
+   * 
+   * @param calculator
+   *          provider of AlignmentAnnotation for the alignment
+   */
+  public static void newCalculator(AnnotationProviderI calculator)
+  {
+    if (Desktop.getCurrentAlignFrame() != null)
+    {
+      newCalculator(Desktop.getCurrentAlignFrame(), calculator);
+    }
+    else
+    {
+      System.err
+              .println("Can't register calculator as no alignment window has focus");
+    }
+  }
+
+  /**
+   * Constructs and registers a new alignment annotation worker
+   * 
+   * @param af
+   *          the AlignFrame for which the annotation is to be calculated
+   * @param calculator
+   *          provider of AlignmentAnnotation for the alignment
+   */
+  public static void newCalculator(AlignFrame af,
+          AnnotationProviderI calculator)
+  {
+    new AnnotationWorker(af, calculator);
+  }
+
+  /**
+   * Factory method to construct an Annotation object
+   * 
+   * @param displayChar
+   * @param desc
+   * @param secondaryStructure
+   * @param val
+   * @param color
+   * @return
+   */
+  public static Annotation newAnnotation(String displayChar, String desc,
+          char secondaryStructure, float val, Color color)
+  {
+    return new Annotation(displayChar, desc, secondaryStructure, val, color);
+  }
+
+  /**
+   * Factory method to construct an AlignmentAnnotation object
+   * 
+   * @param name
+   * @param desc
+   * @param anns
+   * @return
+   */
+  public static AlignmentAnnotation newAlignmentAnnotation(String name,
+          String desc, Annotation[] anns)
+  {
+    return new AlignmentAnnotation(name, desc, anns);
+  }
+}
diff --git a/src/jalview/workers/AnnotationProviderI.java b/src/jalview/workers/AnnotationProviderI.java
new file mode 100644 (file)
index 0000000..653ff04
--- /dev/null
@@ -0,0 +1,17 @@
+package jalview.workers;
+
+import jalview.datamodel.AlignmentAnnotation;
+import jalview.datamodel.AlignmentI;
+import jalview.gui.FeatureRenderer;
+
+import java.util.List;
+
+/**
+ * Interface to be satisfied by any class which computes one or more alignment
+ * annotations
+ */
+public interface AnnotationProviderI
+{
+  List<AlignmentAnnotation> calculateAnnotation(AlignmentI al,
+          FeatureRenderer fr);
+}
diff --git a/src/jalview/workers/AnnotationWorker.java b/src/jalview/workers/AnnotationWorker.java
new file mode 100644 (file)
index 0000000..fbf7531
--- /dev/null
@@ -0,0 +1,136 @@
+/*
+ * 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 <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
+package jalview.workers;
+
+import jalview.datamodel.AlignmentAnnotation;
+import jalview.datamodel.AlignmentI;
+import jalview.gui.AlignFrame;
+import jalview.gui.AlignmentPanel;
+import jalview.gui.FeatureRenderer;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * A class to create and update one or more alignment annotations, given a
+ * 'calculator'.
+ * 
+ */
+class AnnotationWorker extends AlignCalcWorker
+{
+  /*
+   * the provider of the annotation calculations
+   */
+  AnnotationProviderI counter;
+
+  /**
+   * Constructor
+   * 
+   * @param af
+   * @param counter
+   */
+  public AnnotationWorker(AlignFrame af, AnnotationProviderI counter)
+  {
+    super(af.getViewport(), af.alignPanel);
+    ourAnnots = new ArrayList<AlignmentAnnotation>();
+    this.counter = counter;
+    calcMan.registerWorker(this);
+  }
+
+  @Override
+  public void run()
+  {
+    try
+    {
+      calcMan.notifyStart(this);
+
+      while (!calcMan.notifyWorking(this))
+      {
+        try
+        {
+          Thread.sleep(200);
+        } catch (InterruptedException ex)
+        {
+          ex.printStackTrace();
+        }
+      }
+      if (alignViewport.isClosed())
+      {
+        abortAndDestroy();
+        return;
+      }
+
+      removeAnnotations();
+      AlignmentI alignment = alignViewport.getAlignment();
+      if (alignment != null)
+      {
+        try
+        {
+          List<AlignmentAnnotation> anns = counter.calculateAnnotation(
+                  alignment, new FeatureRenderer((AlignmentPanel) ap));
+          for (AlignmentAnnotation ann : anns)
+          {
+            ann.showAllColLabels = true;
+            ann.graph = AlignmentAnnotation.BAR_GRAPH;
+            ourAnnots.add(ann);
+            alignment.addAnnotation(ann);
+          }
+        } catch (IndexOutOfBoundsException x)
+        {
+          // probable race condition. just finish and return without any fuss.
+          return;
+        }
+      }
+    } catch (OutOfMemoryError error)
+    {
+      ap.raiseOOMWarning("calculating annotations", error);
+      calcMan.workerCannotRun(this);
+    } finally
+    {
+      calcMan.workerComplete(this);
+    }
+
+    if (ap != null)
+    {
+      ap.adjustAnnotationHeight();
+      ap.paintAlignment(true);
+    }
+
+  }
+
+  /**
+   * Remove all our annotations before re-calculating them
+   */
+  void removeAnnotations()
+  {
+    for (AlignmentAnnotation ann : ourAnnots)
+    {
+      alignViewport.getAlignment().deleteAnnotation(ann);
+    }
+    ourAnnots.clear();
+  }
+
+  @Override
+  public void updateAnnotation()
+  {
+    // do nothing
+  }
+}
diff --git a/src/jalview/workers/ColumnCounterWorker.java b/src/jalview/workers/ColumnCounterWorker.java
new file mode 100644 (file)
index 0000000..6f4a4f3
--- /dev/null
@@ -0,0 +1,225 @@
+/*
+ * 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 <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
+package jalview.workers;
+
+import jalview.datamodel.AlignmentAnnotation;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.Annotation;
+import jalview.datamodel.SequenceFeature;
+import jalview.datamodel.SequenceI;
+import jalview.gui.AlignFrame;
+import jalview.gui.AlignmentPanel;
+import jalview.gui.FeatureRenderer;
+import jalview.util.ColorUtils;
+import jalview.util.Comparison;
+
+import java.awt.Color;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * A class to compute an alignment annotation with column counts of any
+ * properties of interest of positions in an alignment. <br>
+ * This is designed to be extensible, by supplying to the constructor an object
+ * that computes a count for each residue position, based on the residue value
+ * and any sequence features at that position.
+ * 
+ */
+class ColumnCounterWorker extends AlignCalcWorker
+{
+  FeatureCounterI counter;
+
+  /**
+   * Constructor registers the annotation for the given alignment frame
+   * 
+   * @param af
+   * @param counter
+   */
+  public ColumnCounterWorker(AlignFrame af, FeatureCounterI counter)
+  {
+    super(af.getViewport(), af.alignPanel);
+    ourAnnots = new ArrayList<AlignmentAnnotation>();
+    this.counter = counter;
+    calcMan.registerWorker(this);
+  }
+
+  /**
+   * method called under control of AlignCalcManager to recompute the annotation
+   * when the alignment changes
+   */
+  @Override
+  public void run()
+  {
+    try
+    {
+      calcMan.notifyStart(this);
+
+      while (!calcMan.notifyWorking(this))
+      {
+        try
+        {
+          Thread.sleep(200);
+        } catch (InterruptedException ex)
+        {
+          ex.printStackTrace();
+        }
+      }
+      if (alignViewport.isClosed())
+      {
+        abortAndDestroy();
+        return;
+      }
+
+      removeAnnotation();
+      if (alignViewport.getAlignment() != null)
+      {
+        try
+        {
+          computeAnnotations();
+        } catch (IndexOutOfBoundsException x)
+        {
+          // probable race condition. just finish and return without any fuss.
+          return;
+        }
+      }
+    } catch (OutOfMemoryError error)
+    {
+      ap.raiseOOMWarning("calculating feature counts", error);
+      calcMan.workerCannotRun(this);
+    } finally
+    {
+      calcMan.workerComplete(this);
+    }
+
+    if (ap != null)
+    {
+      ap.adjustAnnotationHeight();
+      ap.paintAlignment(true);
+    }
+
+  }
+
+  /**
+   * Scan each column of the alignment to calculate a count by feature type. Set
+   * the count as the value of the alignment annotation for that feature type.
+   */
+  void computeAnnotations()
+  {
+    FeatureRenderer fr = new FeatureRenderer((AlignmentPanel) ap);
+    // TODO use the commented out code once JAL-2075 is fixed
+    // to get adequate performance on genomic length sequence
+    AlignmentI alignment = alignViewport.getAlignment();
+    // AlignmentView alignmentView = alignViewport.getAlignmentView(false);
+    // AlignmentI alignment = alignmentView.getVisibleAlignment(' ');
+
+    // int width = alignmentView.getWidth();
+    int width = alignment.getWidth();
+    int height = alignment.getHeight();
+    int[] counts = new int[width];
+    int max = 0;
+
+    for (int col = 0; col < width; col++)
+    {
+      int count = 0;
+      for (int row = 0; row < height; row++)
+      {
+        count += countFeaturesAt(alignment, col, row, fr);
+      }
+      counts[col] = count;
+      max = Math.max(count, max);
+    }
+
+    Annotation[] anns = new Annotation[width];
+    /*
+     * add non-zero counts as annotations
+     */
+    for (int i = 0; i < counts.length; i++)
+    {
+      int count = counts[i];
+      if (count > 0)
+      {
+        Color color = ColorUtils.getGraduatedColour(count, 0, Color.cyan,
+                max, Color.blue);
+        anns[i] = new Annotation(String.valueOf(count),
+                String.valueOf(count), '0', count, color);
+      }
+    }
+
+    /*
+     * construct the annotation, save it and add it to the displayed alignment
+     */
+    AlignmentAnnotation ann = new AlignmentAnnotation(counter.getName(),
+            counter.getDescription(), anns);
+    ann.showAllColLabels = true;
+    ann.graph = AlignmentAnnotation.BAR_GRAPH;
+    ourAnnots.add(ann);
+    alignViewport.getAlignment().addAnnotation(ann);
+  }
+
+  /**
+   * Returns a count of any feature types present at the specified position of
+   * the alignment
+   * 
+   * @param alignment
+   * @param col
+   * @param row
+   * @param fr
+   */
+  int countFeaturesAt(AlignmentI alignment, int col, int row,
+          FeatureRenderer fr)
+  {
+    SequenceI seq = alignment.getSequenceAt(row);
+    if (seq == null)
+    {
+      return 0;
+    }
+    if (col >= seq.getLength())
+    {
+      return 0;// sequence doesn't extend this far
+    }
+    char res = seq.getCharAt(col);
+    if (Comparison.isGap(res))
+    {
+      return 0;
+    }
+    int pos = seq.findPosition(col);
+
+    /*
+     * compute a count for any displayed features at residue
+     */
+    // NB have to adjust pos if using AlignmentView.getVisibleAlignment
+    // see JAL-2075
+    List<SequenceFeature> features = fr.findFeaturesAtRes(seq, pos);
+    int count = this.counter.count(String.valueOf(res), features);
+    return count;
+  }
+
+  /**
+   * Method called when the user changes display options that may affect how the
+   * annotation is rendered, but do not change its values. Currently no such
+   * options affect user-defined annotation, so this method does nothing.
+   */
+  @Override
+  public void updateAnnotation()
+  {
+    // do nothing
+  }
+}
index a8698e6..14e2a31 100644 (file)
@@ -21,7 +21,6 @@
 package jalview.workers;
 
 import jalview.analysis.AAFrequency;
-import jalview.api.AlignCalcWorkerI;
 import jalview.api.AlignViewportI;
 import jalview.api.AlignmentViewPanel;
 import jalview.datamodel.AlignmentAnnotation;
@@ -32,8 +31,7 @@ import jalview.schemes.ColourSchemeI;
 
 import java.util.Hashtable;
 
-public class ConsensusThread extends AlignCalcWorker implements
-        AlignCalcWorkerI
+public class ConsensusThread extends AlignCalcWorker
 {
   public ConsensusThread(AlignViewportI alignViewport,
           AlignmentViewPanel alignPanel)
index 236bccf..1075e4d 100644 (file)
@@ -21,7 +21,6 @@
 package jalview.workers;
 
 import jalview.analysis.Conservation;
-import jalview.api.AlignCalcWorkerI;
 import jalview.api.AlignViewportI;
 import jalview.api.AlignmentViewPanel;
 import jalview.datamodel.AlignmentAnnotation;
@@ -30,8 +29,7 @@ import jalview.datamodel.AlignmentI;
 import java.util.ArrayList;
 import java.util.List;
 
-public class ConservationThread extends AlignCalcWorker implements
-        AlignCalcWorkerI
+public class ConservationThread extends AlignCalcWorker
 {
 
   private int ConsPercGaps = 25; // JBPNote : This should be a configurable
diff --git a/src/jalview/workers/FeatureCounterI.java b/src/jalview/workers/FeatureCounterI.java
new file mode 100644 (file)
index 0000000..aa4a283
--- /dev/null
@@ -0,0 +1,63 @@
+package jalview.workers;
+
+import jalview.datamodel.SequenceFeature;
+
+import java.util.List;
+
+/**
+ * An interface for a type that returns counts of any value of interest at a
+ * sequence position that can be determined from the sequence character and any
+ * features present at that position
+ * 
+ */
+public interface FeatureCounterI
+{
+  /**
+   * Returns a count of some property of interest, for example
+   * <ul>
+   * <li>the number of variant features at the position</li>
+   * <li>the number of Cath features of status 'True Positive'</li>
+   * <li>1 if the residue is hydrophobic, else 0</li>
+   * <li>etc</li>
+   * </ul>
+   * 
+   * @param residue
+   *          the residue (or gap) at the position
+   * @param a
+   *          list of any sequence features which include the position
+   */
+  int count(String residue, List<SequenceFeature> features);
+
+  /**
+   * Returns a name for the annotation that this is counting, for use as the
+   * displayed label
+   * 
+   * @return
+   */
+  String getName();
+
+  /**
+   * Returns a description for the annotation, for display as a tooltip
+   * 
+   * @return
+   */
+  String getDescription();
+
+  /**
+   * Returns the colour (as [red, green, blue] values in the range 0-255) to use
+   * for the minimum value on histogram bars. If this is different to
+   * getMaxColour(), then bars will have a graduated colour.
+   * 
+   * @return
+   */
+  int[] getMinColour();
+
+  /**
+   * Returns the colour (as [red, green, blue] values in the range 0-255) to use
+   * for the maximum value on histogram bars. If this is the same as
+   * getMinColour(), then bars will have a single colour (not graduated).
+   * 
+   * @return
+   */
+  int[] getMaxColour();
+}
index e0b3833..3483dac 100644 (file)
@@ -21,7 +21,6 @@
 package jalview.workers;
 
 import jalview.analysis.StructureFrequency;
-import jalview.api.AlignCalcWorkerI;
 import jalview.api.AlignViewportI;
 import jalview.api.AlignmentViewPanel;
 import jalview.datamodel.AlignmentAnnotation;
@@ -31,8 +30,7 @@ import jalview.datamodel.SequenceI;
 
 import java.util.Hashtable;
 
-public class StrucConsensusThread extends AlignCalcWorker implements
-        AlignCalcWorkerI
+public class StrucConsensusThread extends AlignCalcWorker
 {
   public StrucConsensusThread(AlignViewportI alignViewport,
           AlignmentViewPanel alignPanel)
index fe28d6c..b158448 100644 (file)
@@ -32,6 +32,7 @@ import jalview.util.MessageManager;
 import jalview.viewmodel.seqfeatures.FeatureRendererSettings;
 
 import java.util.LinkedHashSet;
+import java.util.List;
 import java.util.Set;
 
 public abstract class AWSThread extends Thread
@@ -98,6 +99,7 @@ public abstract class AWSThread extends Thread
   /**
    * generic web service job/subjob poll loop
    */
+  @Override
   public void run()
   {
     JobStateSummary jstate = null;
@@ -378,7 +380,7 @@ public abstract class AWSThread extends Thread
     WsUrl = wsurl2;
     if (alframe != null)
     {
-      Set<AlignedCodonFrame> cf = alframe.getViewport().getAlignment()
+      List<AlignedCodonFrame> cf = alframe.getViewport().getAlignment()
               .getCodonFrames();
       if (cf != null)
       {
index 473d54f..40c88c1 100644 (file)
@@ -55,6 +55,13 @@ import uk.ac.ebi.picr.model.UPEntry;
  */
 public class DBRefFetcher implements Runnable
 {
+  public interface FetchFinishedListenerI
+  {
+    void finished();
+  }
+
+  private List<FetchFinishedListenerI> listeners;
+
   SequenceI[] dataset;
 
   IProgressIndicator progressWindow;
@@ -86,10 +93,6 @@ public class DBRefFetcher implements Runnable
    */
   private boolean trimDsSeqs = true;
 
-  public DBRefFetcher()
-  {
-  }
-
   /**
    * Creates a new DBRefFetcher object and fetches from the currently selected
    * set of databases, if this is null then it fetches based on feature settings
@@ -109,6 +112,7 @@ public class DBRefFetcher implements Runnable
           IProgressIndicator progressIndicatorFrame,
           DbSourceProxy[] sources, FeatureSettings featureSettings, boolean isNucleotide)
   {
+    listeners = new ArrayList<FetchFinishedListenerI>();
     this.progressWindow = progressIndicatorFrame;
     alseqs = new SequenceI[seqs.length];
     SequenceI[] ds = new SequenceI[seqs.length];
@@ -186,6 +190,16 @@ public class DBRefFetcher implements Runnable
   }
 
   /**
+   * Add a listener to be notified when sequence fetching is complete
+   * 
+   * @param l
+   */
+  public void addListener(FetchFinishedListenerI l)
+  {
+    listeners.add(l);
+  }
+
+  /**
    * retrieve all the das sequence sources and add them to the list of db
    * sources to retrieve from
    */
@@ -332,16 +346,8 @@ public class DBRefFetcher implements Runnable
         // TODO: introduce multithread multisource queries and logic to remove a
         // query from other sources if any source for a database returns a
         // record
-        if (dbsource.getDbSourceProperties().containsKey(
-                DBRefSource.MULTIACC))
-        {
-          maxqlen = ((Integer) dbsource.getDbSourceProperties().get(
-                  DBRefSource.MULTIACC)).intValue();
-        }
-        else
-        {
-          maxqlen = 1;
-        }
+        maxqlen = dbsource.getMaximumQueryCount();
+
         while (queries.size() > 0 || seqIndex < currSeqs.length)
         {
           if (queries.size() > 0)
@@ -481,12 +487,13 @@ public class DBRefFetcher implements Runnable
       progressWindow.setProgressBar(
               MessageManager.getString("label.dbref_search_completed"),
               startTime);
-      // promptBeforeBlast();
-
     }
 
+    for (FetchFinishedListenerI listener : listeners)
+    {
+      listener.finished();
+    }
     running = false;
-
   }
 
   /**
index 6a612a0..65179a2 100644 (file)
  */
 package jalview.ws;
 
-import jalview.datamodel.Alignment;
-import jalview.datamodel.AlignmentI;
-import jalview.datamodel.DBRefSource;
-import jalview.datamodel.SequenceI;
+import jalview.ext.ensembl.EnsemblGene;
+import jalview.ext.ensembl.EnsemblGenomes;
+import jalview.ws.dbsources.EmblCdsSource;
+import jalview.ws.dbsources.EmblSource;
+import jalview.ws.dbsources.Pdb;
+import jalview.ws.dbsources.PfamFull;
+import jalview.ws.dbsources.PfamSeed;
+import jalview.ws.dbsources.RfamFull;
+import jalview.ws.dbsources.RfamSeed;
+import jalview.ws.dbsources.Uniprot;
+import jalview.ws.dbsources.UniprotName;
 import jalview.ws.dbsources.das.api.jalviewSourceI;
 import jalview.ws.seqfetcher.ASequenceFetcher;
 import jalview.ws.seqfetcher.DbSourceProxy;
 
 import java.util.ArrayList;
-import java.util.Enumeration;
 import java.util.List;
-import java.util.Vector;
 
 /**
- * This is the the concrete implementation of the sequence retrieval interface
- * and abstract class in jalview.ws.seqfetcher. This implements the run-time
- * discovery of sequence database clients, and provides a hardwired main for
- * testing all registered handlers.
+ * This implements the run-time discovery of sequence database clients.
  * 
  */
 public class SequenceFetcher extends ASequenceFetcher
@@ -55,16 +57,16 @@ public class SequenceFetcher extends ASequenceFetcher
 
   public SequenceFetcher(boolean addDas)
   {
-    addDBRefSourceImpl(jalview.ws.dbsources.EmblSource.class);
-    addDBRefSourceImpl(jalview.ws.dbsources.EmblCdsSouce.class);
-    addDBRefSourceImpl(jalview.ws.dbsources.Uniprot.class);
-    addDBRefSourceImpl(jalview.ws.dbsources.UnprotName.class);
-    addDBRefSourceImpl(jalview.ws.dbsources.Pdb.class);
-    addDBRefSourceImpl(jalview.ws.dbsources.PfamFull.class);
-    addDBRefSourceImpl(jalview.ws.dbsources.PfamSeed.class);
-    // ensures Seed alignment is 'default' for PFAM
-    addDBRefSourceImpl(jalview.ws.dbsources.RfamFull.class);
-    addDBRefSourceImpl(jalview.ws.dbsources.RfamSeed.class);
+    addDBRefSourceImpl(EnsemblGene.class);
+    addDBRefSourceImpl(EnsemblGenomes.class);
+    addDBRefSourceImpl(EmblSource.class);
+    addDBRefSourceImpl(EmblCdsSource.class);
+    addDBRefSourceImpl(Uniprot.class);
+    addDBRefSourceImpl(UniprotName.class);
+    addDBRefSourceImpl(Pdb.class);
+    addDBRefSourceImpl(PfamFull.class);
+    addDBRefSourceImpl(PfamSeed.class);
+    addDBRefSourceImpl(RfamSeed.class);
     if (addDas)
     {
       registerDasSequenceSources();
@@ -87,7 +89,7 @@ public class SequenceFetcher extends ASequenceFetcher
       {
         // Skip the alignment databases for the moment - they're not useful for
         // verifying a single sequence against its reference source
-        if (dbs.isA(DBRefSource.ALIGNMENTDB))
+        if (dbs.isAlignmentSource())
         {
           skip = true;
         }
@@ -150,283 +152,6 @@ public class SequenceFetcher extends ASequenceFetcher
   }
 
   /**
-   * return plaintext databse list suitable for using in a GUI element
-   */
-  public String[] _getOrderedSupportedSources()
-  {
-    String[] srcs = this.getSupportedDb();
-    ArrayList dassrc = new ArrayList(), nondas = new ArrayList();
-    for (int i = 0; i < srcs.length; i++)
-    {
-      for (DbSourceProxy dbs : getSourceProxy(srcs[i]))
-      {
-        String nm = dbs.getDbName();
-        if (getSourceProxy(srcs[i]) instanceof jalview.ws.dbsources.das.datamodel.DasSequenceSource)
-        {
-          if (nm.startsWith("das:"))
-          {
-            nm = nm.substring(4);
-          }
-          dassrc.add(new String[] { srcs[i], nm.toUpperCase() });
-        }
-        else
-        {
-          nondas.add(new String[] { srcs[i], nm.toUpperCase() });
-        }
-      }
-    }
-    Object[] sorted = nondas.toArray();
-    String[] tosort = new String[sorted.length];
-    nondas.clear();
-    for (int j = 0; j < sorted.length; j++)
-    {
-      tosort[j] = ((String[]) sorted[j])[1];
-    }
-    jalview.util.QuickSort.sort(tosort, sorted);
-    int i = 0;
-    // construct array with all sources listed
-    srcs = new String[sorted.length + dassrc.size()];
-    for (int j = sorted.length - 1; j >= 0; j--, i++)
-    {
-      srcs[i] = ((String[]) sorted[j])[0];
-      sorted[j] = null;
-    }
-
-    sorted = dassrc.toArray();
-    tosort = new String[sorted.length];
-    dassrc.clear();
-    for (int j = 0; j < sorted.length; j++)
-    {
-      tosort[j] = ((String[]) sorted[j])[1];
-    }
-    jalview.util.QuickSort.sort(tosort, sorted);
-    for (int j = sorted.length - 1; j >= 0; j--, i++)
-    {
-      srcs[i] = ((String[]) sorted[j])[0];
-      sorted[j] = null;
-    }
-    return srcs;
-  }
-
-  /**
-   * simple run method to test dbsources.
-   * 
-   * @param argv
-   */
-  public static void main(String[] argv)
-  {
-    AlignmentI ds = null;
-    Vector noProds = new Vector();
-    String usage = "SequenceFetcher.main [-nodas] [<DBNAME> [<ACCNO>]]\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"
-            + "If given two arguments, SequenceFetcher will try to find the DbFetcher corresponding to <DBNAME> and retrieve <ACCNO> from it.\n"
-            + "The -nodas option will exclude DAS sources from the database fetchers Jalview will try to use.";
-    boolean withDas = true;
-    if (argv != null && argv.length > 0
-            && argv[0].toLowerCase().startsWith("-nodas"))
-    {
-      withDas = false;
-      String targs[] = new String[argv.length - 1];
-      System.arraycopy(argv, 1, targs, 0, targs.length);
-      argv = targs;
-    }
-    if (argv != null && argv.length > 0)
-    {
-      List<DbSourceProxy> sps = new SequenceFetcher(withDas)
-              .getSourceProxy(argv[0]);
-
-      if (sps != null)
-      {
-        for (DbSourceProxy sp : sps)
-        {
-          AlignmentI al = null;
-          try
-          {
-            al = sp.getSequenceRecords(argv.length > 1 ? argv[1] : sp
-                    .getTestQuery());
-          } catch (Exception e)
-          {
-            e.printStackTrace();
-            System.err.println("Error when retrieving "
-                    + (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;
-      }
-      else
-      {
-        System.err.println("Can't resolve " + argv[0]
-                + " as a database name. Allowed values are :\n"
-                + new SequenceFetcher().getSupportedDb());
-      }
-      System.out.println(usage);
-      return;
-    }
-    ASequenceFetcher sfetcher = new SequenceFetcher(withDas);
-    String[] dbSources = sfetcher.getSupportedDb();
-    for (int dbsource = 0; dbsource < dbSources.length; dbsource++)
-    {
-      String db = dbSources[dbsource];
-      // skip me
-      if (db.equals(DBRefSource.PDB))
-      {
-        continue;
-      }
-      for (DbSourceProxy sp : sfetcher.getSourceProxy(db))
-      {
-        System.out.println("Source: " + sp.getDbName() + " (" + db
-                + "): retrieving test:" + sp.getTestQuery());
-        AlignmentI al = null;
-        try
-        {
-          al = sp.getSequenceRecords(sp.getTestQuery());
-          if (al != null && al.getHeight() > 0
-                  && sp.getDbSourceProperties() != null)
-          {
-            boolean dna = sp.getDbSourceProperties().containsKey(
-                    DBRefSource.DNACODINGSEQDB)
-                    || sp.getDbSourceProperties().containsKey(
-                            DBRefSource.DNASEQDB)
-                    || sp.getDbSourceProperties().containsKey(
-                            DBRefSource.CODINGSEQDB);
-            // 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 (int t = 0; t < types.length; t++)
-              {
-                System.out.println("Type: " + types[t]);
-                SequenceI[] prod = jalview.analysis.CrossRef
-                        .findXrefSequences(al.getSequencesArray(), dna,
-                                types[t]).getSequencesArray();
-                System.out.println("Found "
-                        + ((prod == null) ? "no" : "" + prod.length)
-                        + " products");
-                if (prod != null)
-                {
-                  for (int p = 0; p < prod.length; p++)
-                  {
-                    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.");
-          }
-        }
-        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.flush();
-        System.err.flush();
-
-      }
-      if (noProds.size() > 0)
-      {
-        Enumeration ts = noProds.elements();
-        while (ts.hasMoreElements())
-
-        {
-          Object[] typeSq = (Object[]) 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++)
-            {
-              System.out.println("Prod " + p + ": "
-                      + prod[p].getDisplayId(true));
-            }
-          }
-        }
-
-      }
-
-    }
-  }
-
-  /**
    * query the currently defined DAS source registry for sequence sources and
    * add a DasSequenceSource instance for each source to the SequenceFetcher
    * source list.
similarity index 89%
rename from src/jalview/ws/dbsources/EmblCdsSouce.java
rename to src/jalview/ws/dbsources/EmblCdsSource.java
index e5fbd6c..a73af61 100644 (file)
@@ -22,40 +22,43 @@ package jalview.ws.dbsources;
 
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.DBRefSource;
-import jalview.ws.seqfetcher.DbSourceProxy;
 
 import com.stevesoft.pat.Regex;
 
-public class EmblCdsSouce extends EmblXmlSource implements DbSourceProxy
+public class EmblCdsSource extends EmblXmlSource
 {
 
-  public EmblCdsSouce()
+  public EmblCdsSource()
   {
     super();
-    addDbSourceProperty(DBRefSource.CODINGSEQDB);
   }
 
+  @Override
   public String getAccessionSeparator()
   {
     return null;
   }
 
+  @Override
   public Regex getAccessionValidator()
   {
-    return new com.stevesoft.pat.Regex("^[A-Z]+[0-9]+");
+    return new Regex("^[A-Z]+[0-9]+");
   }
 
+  @Override
   public String getDbSource()
   {
     return DBRefSource.EMBLCDS;
   }
 
+  @Override
   public String getDbVersion()
   {
     return "0"; // TODO : this is dynamically set for a returned record - not
     // tied to proxy
   }
 
+  @Override
   public AlignmentI getSequenceRecords(String queries) throws Exception
   {
     if (queries.indexOf(".") > -1)
@@ -65,6 +68,7 @@ public class EmblCdsSouce extends EmblXmlSource implements DbSourceProxy
     return getEmblSequenceRecords(DBRefSource.EMBLCDS, queries);
   }
 
+  @Override
   public boolean isValidReference(String accession)
   {
     // most embl CDS refs look like ..
@@ -76,11 +80,13 @@ public class EmblCdsSouce extends EmblXmlSource implements DbSourceProxy
   /**
    * cDNA for LDHA_CHICK swissprot sequence
    */
+  @Override
   public String getTestQuery()
   {
     return "CAA37824";
   }
 
+  @Override
   public String getDbName()
   {
     return "EMBL (CDS)";
index 893ab41..6bbe2e1 100644 (file)
@@ -22,7 +22,6 @@ package jalview.ws.dbsources;
 
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.DBRefSource;
-import jalview.ws.seqfetcher.DbSourceProxy;
 
 import com.stevesoft.pat.Regex;
 
@@ -30,13 +29,12 @@ import com.stevesoft.pat.Regex;
  * @author JimP
  * 
  */
-public class EmblSource extends EmblXmlSource implements DbSourceProxy
+public class EmblSource extends EmblXmlSource
 {
 
   public EmblSource()
   {
-    addDbSourceProperty(DBRefSource.DNASEQDB);
-    addDbSourceProperty(DBRefSource.CODINGSEQDB);
+    super();
   }
 
   /*
@@ -44,6 +42,7 @@ public class EmblSource extends EmblXmlSource implements DbSourceProxy
    * 
    * @see jalview.ws.DbSourceProxy#getAccessionSeparator()
    */
+  @Override
   public String getAccessionSeparator()
   {
     // TODO Auto-generated method stub
@@ -55,9 +54,10 @@ public class EmblSource extends EmblXmlSource implements DbSourceProxy
    * 
    * @see jalview.ws.DbSourceProxy#getAccessionValidator()
    */
+  @Override
   public Regex getAccessionValidator()
   {
-    return new com.stevesoft.pat.Regex("^[A-Z]+[0-9]+");
+    return new Regex("^[A-Z]+[0-9]+");
   }
 
   /*
@@ -65,6 +65,7 @@ public class EmblSource extends EmblXmlSource implements DbSourceProxy
    * 
    * @see jalview.ws.DbSourceProxy#getDbSource()
    */
+  @Override
   public String getDbSource()
   {
     return DBRefSource.EMBL;
@@ -75,6 +76,7 @@ public class EmblSource extends EmblXmlSource implements DbSourceProxy
    * 
    * @see jalview.ws.DbSourceProxy#getDbVersion()
    */
+  @Override
   public String getDbVersion()
   {
     // TODO Auto-generated method stub
@@ -86,6 +88,7 @@ public class EmblSource extends EmblXmlSource implements DbSourceProxy
    * 
    * @see jalview.ws.DbSourceProxy#getSequenceRecords(java.lang.String[])
    */
+  @Override
   public AlignmentI getSequenceRecords(String queries) throws Exception
   {
     return getEmblSequenceRecords(DBRefSource.EMBL, queries);
@@ -96,6 +99,7 @@ public class EmblSource extends EmblXmlSource implements DbSourceProxy
    * 
    * @see jalview.ws.DbSourceProxy#isValidReference(java.lang.String)
    */
+  @Override
   public boolean isValidReference(String accession)
   {
     // most embl refs look like ..
@@ -108,11 +112,13 @@ public class EmblSource extends EmblXmlSource implements DbSourceProxy
   /**
    * return LHD_CHICK coding gene
    */
+  @Override
   public String getTestQuery()
   {
     return "X53828";
   }
 
+  @Override
   public String getDbName()
   {
     return "EMBL"; // getDbSource();
index 20da45c..0085221 100644 (file)
@@ -29,14 +29,15 @@ import jalview.util.MessageManager;
 import jalview.ws.ebi.EBIFetchClient;
 
 import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
 
 public abstract class EmblXmlSource extends EbiFileRetrievedProxy
 {
-
-  /**
-   * Last properly parsed embl file.
+  /*
+   * JAL-1856 Embl returns this text for query not found
    */
-  public EmblFile efile = null;
+  private static final String EMBL_NOT_FOUND_REPLY = "ERROR 12 No entries found.";
 
   public EmblXmlSource()
   {
@@ -62,7 +63,8 @@ public abstract class EmblXmlSource extends EbiFileRetrievedProxy
     try
     {
       reply = dbFetch.fetchDataAsFile(
-              emprefx.toLowerCase() + ":" + query.trim(), "emblxml", null);
+              emprefx.toLowerCase() + ":" + query.trim(), "emblxml", null,
+              ".xml");
     } catch (Exception e)
     {
       stopQuery();
@@ -88,71 +90,45 @@ public abstract class EmblXmlSource extends EbiFileRetrievedProxy
   public AlignmentI getEmblSequenceRecords(String emprefx, String query,
           File reply) throws Exception
   {
-    SequenceI seqs[] = null;
-    StringBuffer result = new StringBuffer();
+    EmblFile efile = null;
+    List<SequenceI> seqs = new ArrayList<SequenceI>();
+
     if (reply != null && reply.exists())
     {
-      efile = null;
       file = reply.getAbsolutePath();
-      if (reply.length() > 25)
+      if (reply.length() > EMBL_NOT_FOUND_REPLY.length())
       {
         efile = EmblFile.getEmblFile(reply);
       }
-      else
-      {
-        result.append(MessageManager.formatMessage(
-                "label.no_embl_record_found",
-                new String[] { emprefx.toLowerCase(), query.trim() }));
-      }
     }
+
+    List<SequenceI> peptides = new ArrayList<SequenceI>();
     if (efile != null)
     {
       for (EmblEntry entry : efile.getEntries())
       {
-        SequenceI[] seqparts = entry.getSequences(false, true, emprefx);
-        // TODO: use !fetchNa,!fetchPeptide here instead - see todo in EmblEntry
-        if (seqparts != null)
+        SequenceI seq = entry.getSequence(emprefx, peptides);
+        if (seq != null)
         {
-          SequenceI[] newseqs = null;
-          int si = 0;
-          if (seqs == null)
-          {
-            newseqs = new SequenceI[seqparts.length];
-          }
-          else
-          {
-            newseqs = new SequenceI[seqs.length + seqparts.length];
-
-            for (; si < seqs.length; si++)
-            {
-              newseqs[si] = seqs[si];
-              seqs[si] = null;
-            }
-          }
-          for (int j = 0; j < seqparts.length; si++, j++)
-          {
-            newseqs[si] = seqparts[j].deriveSequence();
-            // place DBReferences on dataset and refer
-          }
-          seqs = newseqs;
-
+          seqs.add(seq.deriveSequence());
+          // place DBReferences on dataset and refer
         }
       }
     }
-    else
-    {
-      result = null;
-    }
+
     AlignmentI al = null;
-    if (seqs != null && seqs.length > 0)
+    if (!seqs.isEmpty())
     {
-      al = new Alignment(seqs);
-      result.append(MessageManager.formatMessage(
-              "label.embl_successfully_parsed", new String[] { emprefx }));
-      results = result;
+      al = new Alignment(seqs.toArray(new SequenceI[seqs.size()]));
     }
     stopQuery();
     return al;
   }
 
+  @Override
+  public boolean isDnaCoding()
+  {
+    return true;
+  }
+
 }
index 116962b..ce21ad0 100644 (file)
@@ -22,7 +22,6 @@ package jalview.ws.dbsources;
 
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.DBRefSource;
-import jalview.ws.seqfetcher.DbSourceProxy;
 
 import com.stevesoft.pat.Regex;
 
@@ -32,13 +31,12 @@ import com.stevesoft.pat.Regex;
  * @author JimP
  * 
  */
-public class GeneDbSource extends EmblXmlSource implements DbSourceProxy
+public class GeneDbSource extends EmblXmlSource
 {
 
   public GeneDbSource()
   {
-    addDbSourceProperty(DBRefSource.DNASEQDB);
-    addDbSourceProperty(DBRefSource.CODINGSEQDB);
+    super();
   }
 
   /*
@@ -46,6 +44,7 @@ public class GeneDbSource extends EmblXmlSource implements DbSourceProxy
    * 
    * @see jalview.ws.DbSourceProxy#getAccessionSeparator()
    */
+  @Override
   public String getAccessionSeparator()
   {
     // TODO Auto-generated method stub
@@ -57,6 +56,7 @@ public class GeneDbSource extends EmblXmlSource implements DbSourceProxy
    * 
    * @see jalview.ws.DbSourceProxy#getAccessionValidator()
    */
+  @Override
   public Regex getAccessionValidator()
   {
     // TODO Auto-generated method stub
@@ -68,6 +68,7 @@ public class GeneDbSource extends EmblXmlSource implements DbSourceProxy
    * 
    * @see jalview.ws.DbSourceProxy#getDbSource()
    */
+  @Override
   public String getDbSource()
   {
     return DBRefSource.GENEDB;
@@ -78,6 +79,7 @@ public class GeneDbSource extends EmblXmlSource implements DbSourceProxy
    * 
    * @see jalview.ws.DbSourceProxy#getDbVersion()
    */
+  @Override
   public String getDbVersion()
   {
     // TODO Auto-generated method stub
@@ -89,6 +91,7 @@ public class GeneDbSource extends EmblXmlSource implements DbSourceProxy
    * 
    * @see jalview.ws.DbSourceProxy#getSequenceRecords(java.lang.String[])
    */
+  @Override
   public AlignmentI getSequenceRecords(String queries) throws Exception
   {
     // query of form
@@ -102,6 +105,7 @@ public class GeneDbSource extends EmblXmlSource implements DbSourceProxy
    * 
    * @see jalview.ws.DbSourceProxy#isValidReference(java.lang.String)
    */
+  @Override
   public boolean isValidReference(String accession)
   {
     // TODO Auto-generated method stub
@@ -111,11 +115,13 @@ public class GeneDbSource extends EmblXmlSource implements DbSourceProxy
   /**
    * return T.Brucei Mannosyl-Transferase TbPIG-M
    */
+  @Override
   public String getTestQuery()
   {
     return "Tb927.6.3300";
   }
 
+  @Override
   public String getDbName()
   {
     return "GeneDB"; // getDbSource();
diff --git a/src/jalview/ws/dbsources/PDBRestClient.java b/src/jalview/ws/dbsources/PDBRestClient.java
deleted file mode 100644 (file)
index c6251a6..0000000
+++ /dev/null
@@ -1,422 +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 <http://www.gnu.org/licenses/>.
- * The Jalview Authors are detailed in the 'AUTHORS' file.
- */
-package jalview.ws.dbsources;
-
-import jalview.util.MessageManager;
-import jalview.ws.uimodel.PDBRestRequest;
-import jalview.ws.uimodel.PDBRestResponse;
-import jalview.ws.uimodel.PDBRestResponse.PDBResponseSummary;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import javax.ws.rs.core.MediaType;
-
-import org.json.simple.JSONArray;
-import org.json.simple.JSONObject;
-import org.json.simple.parser.JSONParser;
-import org.json.simple.parser.ParseException;
-
-import com.sun.jersey.api.client.Client;
-import com.sun.jersey.api.client.ClientResponse;
-import com.sun.jersey.api.client.WebResource;
-import com.sun.jersey.api.client.config.ClientConfig;
-import com.sun.jersey.api.client.config.DefaultClientConfig;
-
-/**
- * A rest client for querying the Search endpoing of the PDB REST API
- * 
- * @author tcnofoegbu
- *
- */
-public class PDBRestClient
-{
-  public static final String PDB_SEARCH_ENDPOINT = "http://www.ebi.ac.uk/pdbe/search/pdb/select?";
-
-  private static int DEFAULT_RESPONSE_SIZE = 200;
-
-  /**
-   * Takes a PDBRestRequest object and returns a response upon execution
-   * 
-   * @param pdbRestRequest
-   *          the PDBRestRequest instance to be processed
-   * @return the pdbResponse object for the given request
-   * @throws Exception
-   */
-  public PDBRestResponse executeRequest(PDBRestRequest pdbRestRequest)
-          throws Exception
-  {
-    try
-    {
-      ClientConfig clientConfig = new DefaultClientConfig();
-      Client client = Client.create(clientConfig);
-
-      String wantedFields = getPDBDocFieldsAsCommaDelimitedString(pdbRestRequest
-              .getWantedFields());
-      int responseSize = (pdbRestRequest.getResponseSize() == 0) ? DEFAULT_RESPONSE_SIZE
-              : pdbRestRequest.getResponseSize();
-      String sortParam = (pdbRestRequest.getFieldToSortBy() == null || pdbRestRequest
-              .getFieldToSortBy().trim().isEmpty()) ? "" : (pdbRestRequest
-              .getFieldToSortBy() + (pdbRestRequest.isAscending() ? " asc"
-              : " desc"));
-      // Build request parameters for the REST Request
-      WebResource webResource = client.resource(PDB_SEARCH_ENDPOINT)
-              .queryParam("wt", "json").queryParam("fl", wantedFields)
-              .queryParam("rows", String.valueOf(responseSize))
-              .queryParam("q", pdbRestRequest.getQuery())
-              .queryParam("sort", sortParam);
-
-      // Execute the REST request
-      ClientResponse clientResponse = webResource.accept(
-              MediaType.APPLICATION_JSON).get(ClientResponse.class);
-
-      // Get the JSON string from the response object
-      String responseString = clientResponse.getEntity(String.class);
-
-      // Check the response status and report exception if one occurs
-      if (clientResponse.getStatus() != 200)
-      {
-        String errorMessage = "";
-        if (clientResponse.getStatus() == 400)
-        {
-          errorMessage = parseJsonExceptionString(responseString);
-          throw new Exception(errorMessage);
-        }
-        else
-        {
-          errorMessage = getMessageByHTTPStatusCode(clientResponse
-                  .getStatus());
-          throw new Exception(errorMessage);
-        }
-      }
-
-      // Make redundant objects eligible for garbage collection to conserve
-      // memory
-      clientResponse = null;
-      client = null;
-
-      // Process the response and return the result to the caller.
-      return parsePDBJsonResponse(responseString, pdbRestRequest);
-    } catch (Exception e)
-    {
-      String exceptionMsg = e.getMessage();
-      if (exceptionMsg.contains("SocketException"))
-      {
-        // No internet connection
-        throw new Exception(
-                MessageManager
-                        .getString("exception.unable_to_detect_internet_connection"));
-      }
-      else if (exceptionMsg.contains("UnknownHostException"))
-      {
-        // The server 'www.ebi.ac.uk' is unreachable
-        throw new Exception(
-                MessageManager
-                        .getString("exception.pdb_server_unreachable"));
-      }
-      else
-      {
-        throw e;
-      }
-    }
-  }
-
-  public String getMessageByHTTPStatusCode(int code)
-  {
-    String message = "";
-    switch (code)
-    {
-    case 410:
-      message = MessageManager
-              .getString("exception.pdb_rest_service_no_longer_available");
-      break;
-    case 403:
-    case 404:
-      message = MessageManager.getString("exception.resource_not_be_found");
-      break;
-    case 408:
-    case 409:
-    case 500:
-    case 501:
-    case 502:
-    case 503:
-    case 504:
-    case 505:
-      message = MessageManager.getString("exception.pdb_server_error");
-      break;
-
-    default:
-      break;
-    }
-    return message;
-  }
-
-  /**
-   * Process error response from PDB server if/when one occurs.
-   * 
-   * @param jsonResponse
-   *          the JSON string containing error message from the server
-   * @return the processed error message from the JSON string
-   */
-  public static String parseJsonExceptionString(String jsonErrorResponse)
-  {
-    StringBuilder errorMessage = new StringBuilder(
-            "\n============= PDB Rest Client RunTime error =============\n");
-
-    try
-    {
-      JSONParser jsonParser = new JSONParser();
-      JSONObject jsonObj = (JSONObject) jsonParser.parse(jsonErrorResponse);
-      JSONObject errorResponse = (JSONObject) jsonObj.get("error");
-
-      JSONObject responseHeader = (JSONObject) jsonObj
-              .get("responseHeader");
-      JSONObject paramsObj = (JSONObject) responseHeader.get("params");
-      String status = responseHeader.get("status").toString();
-      String message = errorResponse.get("msg").toString();
-      String query = paramsObj.get("q").toString();
-      String fl = paramsObj.get("fl").toString();
-
-      errorMessage.append("Status: ").append(status).append("\n");
-      errorMessage.append("Message: ").append(message).append("\n");
-      errorMessage.append("query: ").append(query).append("\n");
-      errorMessage.append("fl: ").append(fl).append("\n");
-
-    } catch (ParseException e)
-    {
-      e.printStackTrace();
-    }
-    return errorMessage.toString();
-  }
-
-  /**
-   * Parses the JSON response string from PDB REST API. The response is dynamic
-   * hence, only fields specifically requested for in the 'wantedFields'
-   * parameter is fetched/processed
-   * 
-   * @param pdbJsonResponseString
-   *          the JSON string to be parsed
-   * @param pdbRestRequest
-   *          the request object which contains parameters used to process the
-   *          JSON string
-   * @return
-   */
-  @SuppressWarnings("unchecked")
-  public static PDBRestResponse parsePDBJsonResponse(
-          String pdbJsonResponseString, PDBRestRequest pdbRestRequest)
-  {
-    PDBRestResponse searchResult = new PDBRestResponse();
-    List<PDBResponseSummary> result = null;
-    try
-    {
-      JSONParser jsonParser = new JSONParser();
-      JSONObject jsonObj = (JSONObject) jsonParser
-              .parse(pdbJsonResponseString);
-
-      JSONObject pdbResponse = (JSONObject) jsonObj.get("response");
-      String queryTime = ((JSONObject) jsonObj.get("responseHeader")).get(
-              "QTime").toString();
-      int numFound = Integer
-              .valueOf(pdbResponse.get("numFound").toString());
-      if (numFound > 0)
-      {
-        result = new ArrayList<PDBResponseSummary>();
-        JSONArray docs = (JSONArray) pdbResponse.get("docs");
-        for (Iterator<JSONObject> docIter = docs.iterator(); docIter
-                .hasNext();)
-        {
-          JSONObject doc = docIter.next();
-          result.add(searchResult.new PDBResponseSummary(doc,
-                  pdbRestRequest));
-        }
-        searchResult.setNumberOfItemsFound(numFound);
-        searchResult.setResponseTime(queryTime);
-        searchResult.setSearchSummary(result);
-      }
-    } catch (ParseException e)
-    {
-      e.printStackTrace();
-    }
-    return searchResult;
-  }
-
-  /**
-   * Takes a collection of PDBDocField and converts its 'code' Field values into
-   * a comma delimited string.
-   * 
-   * @param pdbDocfields
-   *          the collection of PDBDocField to process
-   * @return the comma delimited string from the pdbDocFields collection
-   */
-  public static String getPDBDocFieldsAsCommaDelimitedString(
-          Collection<PDBDocField> pdbDocfields)
-  {
-    String result = "";
-    if (pdbDocfields != null && !pdbDocfields.isEmpty())
-    {
-      StringBuilder returnedFields = new StringBuilder();
-      for (PDBDocField field : pdbDocfields)
-      {
-        returnedFields.append(",").append(field.getCode());
-      }
-      returnedFields.deleteCharAt(0);
-      result = returnedFields.toString();
-    }
-    return result;
-  }
-
-  /**
-   * Determines the column index for 'PDB Id' Fields in the dynamic summary
-   * table. The PDB Id serves as a unique identifier for a given row in the
-   * summary table
-   * 
-   * @param wantedFields
-   *          the available table columns in no particular order
-   * @return the pdb id field column index
-   */
-  public static int getPDBIdColumIndex(
-          Collection<PDBDocField> wantedFields, boolean hasRefSeq)
-  {
-
-    // If a reference sequence is attached then start counting from 1 else
-    // start from zero
-    int pdbFieldIndexCounter = hasRefSeq ? 1 : 0;
-
-    for (PDBDocField field : wantedFields)
-    {
-      if (field.equals(PDBDocField.PDB_ID))
-      {
-        break; // Once PDB Id index is determined exit iteration
-      }
-      ++pdbFieldIndexCounter;
-    }
-    return pdbFieldIndexCounter;
-  }
-
-  /**
-   * This enum represents the fields available in the PDB JSON response
-   *
-   */
-  public enum PDBDocField
-  {
-    PDB_ID("PDB Id", "pdb_id"), TITLE("Title", "title"), MOLECULE_NAME(
-            "Molecule", "molecule_name"), MOLECULE_TYPE("Molecule Type",
-            "molecule_type"), MOLECULE_SEQUENCE("Sequence",
-            "molecule_sequence"), PFAM_ACCESSION("PFAM Accession",
-            "pfam_accession"), PFAM_NAME("PFAM Name", "pfam_name"), INTERPRO_NAME(
-            "InterPro Name", "interpro_name"), INTERPRO_ACCESSION(
-            "InterPro Accession", "interpro_accession"), UNIPROT_ID(
-            "UniProt Id", "uniprot_id"), UNIPROT_ACCESSION(
-            "UniProt Accession", "uniprot_accession"), UNIPROT_COVERAGE(
-            "UniProt Coverage", "uniprot_coverage"), UNIPROT_FEATURES(
-            "Uniprot Features", "uniprot_features"), R_FACTOR("R Factor",
-            "r_factor"), RESOLUTION("Resolution", "resolution"), DATA_QUALITY(
-            "Data Quality", "data_quality"), OVERALL_QUALITY(
-            "Overall Quality", "overall_quality"), POLYMER_COUNT(
-            "Number of Polymers", "number_of_polymers"), PROTEIN_CHAIN_COUNT(
-            "Number of Protein Chains", "number_of_protein_chains"), BOUND_MOLECULE_COUNT(
-            "Number of Bound Molecule", "number_of_bound_molecules"), POLYMER_RESIDUE_COUNT(
-            "Number of Polymer Residue", "number_of_polymer_residues"), GENUS(
-            "GENUS", "genus"), GENE_NAME("Gene Name", "gene_name"), EXPERIMENTAL_METHOD(
-            "Experimental Method", "experimental_method"), GO_ID("GO Id",
-            "go_id"), ASSEMBLY_ID("Assembly Id", "assembly_form"), ASSEMBLY_FORM(
-            "Assembly Form", "assembly_id"), ASSEMBLY_TYPE("Assembly Type",
-            "assembly_type"), SPACE_GROUP("Space Group", "spacegroup"), CATH_CODE(
-            "Cath Code", "cath_code"), TAX_ID("Tax Id", "tax_id"), TAX_QUERY(
-            "Tax Query", "tax_query"), INTERACTING_ENTRY_ID(
-            "Interacting Entry Id", "interacting_entry_id"), INTERACTING_ENTITY_ID(
-            "Interacting Entity Id", "interacting_entity_id"), INTERACTING_MOLECULES(
-            "Interacting Molecules", "interacting_molecules"), PUBMED_ID(
-            "Pubmed Id", "pubmed_id"), STATUS("Status", "status"), MODEL_QUALITY(
-            "Model Quality", "model_quality"), PIVOT_RESOLUTION(
-            "Pivot Resolution", "pivot_resolution"), DATA_REDUCTION_SOFTWARE(
-            "Data reduction software", "data_reduction_software"), MAX_OBSERVED_RES(
-            "Max observed residues", "max_observed_residues"), ORG_SCI_NAME(
-            "Organism scientific name", "organism_scientific_name"), SUPER_KINGDOM(
-            "Super kingdom", "superkingdom"), RANK("Rank", "rank"), CRYSTALLISATION_PH(
-            "Crystallisation Ph", "crystallisation_ph"), BIOLOGICAL_FUNCTION(
-            "Biological Function", "biological_function"), BIOLOGICAL_PROCESS(
-            "Biological Process", "biological_process"), BIOLOGICAL_CELL_COMPONENT(
-            "Biological Cell Component", "biological_cell_component"), COMPOUND_NAME(
-            "Compound Name", "compound_name"), COMPOUND_ID("Compound Id",
-            "compound_id"), COMPOUND_WEIGHT("Compound Weight",
-            "compound_weight"), COMPOUND_SYSTEMATIC_NAME(
-            "Compound Systematic Name", "compound_systematic_name"), INTERACTING_LIG(
-            "Interacting Ligands", "interacting_ligands"), JOURNAL(
-            "Journal", "journal"), ALL_AUTHORS("All Authors", "all_authors"), EXPERIMENTAL_DATA_AVAILABLE(
-            "Experiment Data Available", "experiment_data_available"), DIFFRACTION_PROTOCOL(
-            "Diffraction Protocol", "diffraction_protocol"), REFINEMENT_SOFTWARE(
-            "Refinement Software", "refinement_software"), STRUCTURE_DETERMINATION_METHOD(
-            "Structure Determination Method",
-            "structure_determination_method"), SYNCHROTON_SITE(
-            "Synchrotron Site", "synchrotron_site"), SAMPLE_PREP_METHOD(
-            "Sample Preparation Method", "sample_preparation_method"), ENTRY_AUTHORS(
-            "Entry Authors", "entry_authors"), CITATION_TITLE(
-            "Citation Title", "citation_title"), STRUCTURE_SOLUTION_SOFTWARE(
-            "Structure Solution Software", "structure_solution_software"), ENTRY_ENTITY(
-            "Entry Entity", "entry_entity"), R_FREE("R Free", "r_free"), NO_OF_POLYMER_ENTITIES(
-            "Number of Polymer Entities", "number_of_polymer_entities"), NO_OF_BOUND_ENTITIES(
-            "Number of Bound Entities", "number_of_bound_entities"), CRYSTALLISATION_RESERVOIR(
-            "Crystallisation Reservoir", "crystallisation_reservoir"), DATA_SCALING_SW(
-            "Data Scalling Software", "data_scaling_software"), DETECTOR(
-            "Detector", "detector"), DETECTOR_TYPE("Detector Type",
-            "detector_type"), MODIFIED_RESIDUE_FLAG(
-            "Modified Residue Flag", "modified_residue_flag"), NUMBER_OF_COPIES(
-            "Number of Copies", "number_of_copies"), STRUCT_ASYM_ID(
-            "Struc Asym Id", "struct_asym_id"), HOMOLOGUS_PDB_ENTITY_ID(
-            "Homologus PDB Entity Id", "homologus_pdb_entity_id"), MOLECULE_SYNONYM(
-            "Molecule Synonym", "molecule_synonym"), DEPOSITION_SITE(
-            "Deposition Site", "deposition_site"), SYNCHROTRON_BEAMLINE(
-            "Synchrotron Beamline", "synchrotron_beamline"), ENTITY_ID(
-            "Entity Id", "entity_id"), BEAM_SOURCE_NAME("Beam Source Name",
-            "beam_source_name"), PROCESSING_SITE("Processing Site",
-            "processing_site"), ENTITY_WEIGHT("Entity Weight",
-            "entity_weight"), VERSION("Version", "_version_"), ALL("ALL",
-            "text");
-
-    private String name;
-
-    private String code;
-
-    PDBDocField(String name, String code)
-    {
-      this.name = name;
-      this.code = code;
-    }
-
-    public String getName()
-    {
-      return name;
-    }
-
-    public String getCode()
-    {
-      return code;
-    }
-
-    public String toString()
-    {
-      return name;
-    }
-  }
-}
index 7f8c76c..4a089f7 100644 (file)
@@ -20,6 +20,7 @@
  */
 package jalview.ws.dbsources;
 
+import jalview.api.FeatureSettingsModelI;
 import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.DBRefEntry;
@@ -27,9 +28,9 @@ import jalview.datamodel.DBRefSource;
 import jalview.datamodel.PDBEntry;
 import jalview.datamodel.SequenceI;
 import jalview.io.FormatAdapter;
+import jalview.io.PDBFeatureSettings;
 import jalview.util.MessageManager;
 import jalview.ws.ebi.EBIFetchClient;
-import jalview.ws.seqfetcher.DbSourceProxy;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -41,19 +42,25 @@ import com.stevesoft.pat.Regex;
  * @author JimP
  * 
  */
-public class Pdb extends EbiFileRetrievedProxy implements DbSourceProxy
+public class Pdb extends EbiFileRetrievedProxy
 {
   public Pdb()
   {
     super();
-    addDbSourceProperty(DBRefSource.PROTSEQDB);
   }
 
+  public static final String FEATURE_INSERTION = "INSERTION";
+
+  public static final String FEATURE_RES_NUM = "RESNUM";
+
+  private static String currentDefaultFomart = DBRefSource.PDB;
+
   /*
    * (non-Javadoc)
    * 
    * @see jalview.ws.DbSourceProxy#getAccessionSeparator()
    */
+  @Override
   public String getAccessionSeparator()
   {
     // TODO Auto-generated method stub
@@ -65,6 +72,7 @@ public class Pdb extends EbiFileRetrievedProxy implements DbSourceProxy
    * 
    * @see jalview.ws.DbSourceProxy#getAccessionValidator()
    */
+  @Override
   public Regex getAccessionValidator()
   {
     return new Regex("([1-9][0-9A-Za-z]{3}):?([ _A-Za-z0-9]?)");
@@ -75,6 +83,7 @@ public class Pdb extends EbiFileRetrievedProxy implements DbSourceProxy
    * 
    * @see jalview.ws.DbSourceProxy#getDbSource()
    */
+  @Override
   public String getDbSource()
   {
     return DBRefSource.PDB;
@@ -85,6 +94,7 @@ public class Pdb extends EbiFileRetrievedProxy implements DbSourceProxy
    * 
    * @see jalview.ws.DbSourceProxy#getDbVersion()
    */
+  @Override
   public String getDbVersion()
   {
     return "0";
@@ -95,6 +105,7 @@ public class Pdb extends EbiFileRetrievedProxy implements DbSourceProxy
    * 
    * @see jalview.ws.DbSourceProxy#getSequenceRecords(java.lang.String[])
    */
+  @Override
   public AlignmentI getSequenceRecords(String queries) throws Exception
   {
     AlignmentI pdbAlignment = null;
@@ -121,8 +132,12 @@ public class Pdb extends EbiFileRetrievedProxy implements DbSourceProxy
       stopQuery();
       return null;
     }
+    String ext = getCurrentDefaultFomart().equalsIgnoreCase("mmcif") ? ".cif"
+            : ".xml";
     EBIFetchClient ebi = new EBIFetchClient();
-    file = ebi.fetchDataAsFile("pdb:" + id, "pdb", "raw").getAbsolutePath();
+    file = ebi.fetchDataAsFile("pdb:" + id,
+            getCurrentDefaultFomart().toLowerCase(), "raw", ext)
+            .getAbsolutePath();
     stopQuery();
     if (file == null)
     {
@@ -132,7 +147,8 @@ public class Pdb extends EbiFileRetrievedProxy implements DbSourceProxy
     {
 
       pdbAlignment = new FormatAdapter().readFile(file,
-              jalview.io.AppletFormatAdapter.FILE, "PDB");
+              jalview.io.AppletFormatAdapter.FILE,
+              getCurrentDefaultFomart());
       if (pdbAlignment != null)
       {
         List<SequenceI> toremove = new ArrayList<SequenceI>();
@@ -219,6 +235,7 @@ public class Pdb extends EbiFileRetrievedProxy implements DbSourceProxy
    * 
    * @see jalview.ws.DbSourceProxy#isValidReference(java.lang.String)
    */
+  @Override
   public boolean isValidReference(String accession)
   {
     Regex r = getAccessionValidator();
@@ -228,11 +245,13 @@ public class Pdb extends EbiFileRetrievedProxy implements DbSourceProxy
   /**
    * obtain human glyoxalase chain A sequence
    */
+  @Override
   public String getTestQuery()
   {
     return "1QIPA";
   }
 
+  @Override
   public String getDbName()
   {
     return "PDB"; // getDbSource();
@@ -243,4 +262,29 @@ public class Pdb extends EbiFileRetrievedProxy implements DbSourceProxy
   {
     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
+   * <ul>
+   * <li>ResNums or insertions features visible</li>
+   * <li>insertions features coloured red</li>
+   * <li>ResNum features coloured by label</li>
+   * <li>Insertions displayed above (on top of) ResNums</li>
+   * </ul>
+   */
+  @Override
+  public FeatureSettingsModelI getFeatureColourScheme()
+  {
+    return new PDBFeatureSettings();
+  }
 }
index 0211bb1..4f081ee 100644 (file)
@@ -22,7 +22,8 @@ package jalview.ws.dbsources;
 
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.DBRefEntry;
-import jalview.ws.seqfetcher.DbSourceProxy;
+import jalview.datamodel.DBRefSource;
+import jalview.io.FormatAdapter;
 
 import com.stevesoft.pat.Regex;
 
@@ -34,15 +35,12 @@ import com.stevesoft.pat.Regex;
  * @author JimP
  * 
  */
-abstract public class Pfam extends Xfam implements DbSourceProxy
+abstract public class Pfam extends Xfam
 {
 
   public Pfam()
   {
     super();
-    // all extensions of this PFAM source base class are DOMAINDB sources
-    addDbSourceProperty(jalview.datamodel.DBRefSource.DOMAINDB);
-    addDbSourceProperty(jalview.datamodel.DBRefSource.ALIGNMENTDB);
   }
 
   /*
@@ -50,6 +48,7 @@ abstract public class Pfam extends Xfam implements DbSourceProxy
    * 
    * @see jalview.ws.DbSourceProxy#getAccessionSeparator()
    */
+  @Override
   public String getAccessionSeparator()
   {
     // TODO Auto-generated method stub
@@ -61,6 +60,7 @@ abstract public class Pfam extends Xfam implements DbSourceProxy
    * 
    * @see jalview.ws.DbSourceProxy#getAccessionValidator()
    */
+  @Override
   public Regex getAccessionValidator()
   {
     // TODO Auto-generated method stub
@@ -111,22 +111,23 @@ abstract public class Pfam extends Xfam implements DbSourceProxy
    * 
    * @see jalview.ws.DbSourceProxy#getSequenceRecords(java.lang.String[])
    */
+  @Override
   public AlignmentI getSequenceRecords(String queries) throws Exception
   {
     // TODO: this is not a perfect implementation. We need to be able to add
     // individual references to each sequence in each family alignment that's
     // retrieved.
     startQuery();
-    AlignmentI rcds = new jalview.io.FormatAdapter().readFile(getXFAMURL()
+    AlignmentI rcds = new FormatAdapter().readFile(getXFAMURL()
             + queries.trim().toUpperCase(), jalview.io.FormatAdapter.URL,
             "STH");
     for (int s = 0, sNum = rcds.getHeight(); s < sNum; s++)
     {
       rcds.getSequenceAt(s).addDBRef(
-              new DBRefEntry(jalview.datamodel.DBRefSource.PFAM,
+new DBRefEntry(DBRefSource.PFAM,
               // getDbSource(),
                       getDbVersion(), queries.trim().toUpperCase()));
-      if (!getDbSource().equals(jalview.datamodel.DBRefSource.PFAM))
+      if (!getDbSource().equals(DBRefSource.PFAM))
       { // add the specific ref too
         rcds.getSequenceAt(s).addDBRef(
                 new DBRefEntry(getDbSource(), getDbVersion(), queries
@@ -142,6 +143,7 @@ abstract public class Pfam extends Xfam implements DbSourceProxy
    * 
    * @see jalview.ws.DbSourceProxy#isValidReference(java.lang.String)
    */
+  @Override
   public boolean isValidReference(String accession)
   {
     return accession.indexOf("PF") == 0;
@@ -151,9 +153,10 @@ abstract public class Pfam extends Xfam implements DbSourceProxy
    * public String getDbName() { return "PFAM"; // getDbSource(); }
    */
 
+  @Override
   public String getXfamSource()
   {
-    return jalview.datamodel.DBRefSource.PFAM;
+    return DBRefSource.PFAM;
   }
 
 }
index 0490291..62b9686 100644 (file)
  */
 package jalview.ws.dbsources;
 
-import jalview.ws.seqfetcher.DbSourceProxy;
 
 /**
  * flyweight class specifying retrieval of Full family alignments from PFAM
  * 
  */
-public class PfamFull extends Pfam implements DbSourceProxy
+public class PfamFull extends Pfam
 {
   public PfamFull()
   {
@@ -38,9 +37,10 @@ public class PfamFull extends Pfam implements DbSourceProxy
    * 
    * @see jalview.ws.dbsources.Pfam#getPFAMURL()
    */
+  @Override
   protected String getXFAMURL()
   {
-    return "http://pfam.sanger.ac.uk/family/alignment/download/format?alnType=full&format=stockholm&order=t&case=l&gaps=default&entry=";
+    return "http://pfam.xfam.org/family/alignment/download/format?alnType=full&format=stockholm&order=t&case=l&gaps=default&entry=";
   }
 
   /*
@@ -48,21 +48,25 @@ public class PfamFull extends Pfam implements DbSourceProxy
    * 
    * @see jalview.ws.seqfetcher.DbSourceProxy#getDbName()
    */
+  @Override
   public String getDbName()
   {
     return "PFAM (Full)";
   }
 
+  @Override
   public String getDbSource()
   {
     return getDbName(); // so we have unique DbSource string.
   }
 
+  @Override
   public String getTestQuery()
   {
     return "PF03760";
   }
 
+  @Override
   public String getDbVersion()
   {
     return null;
index 2ea75af..053953c 100644 (file)
@@ -20,7 +20,6 @@
  */
 package jalview.ws.dbsources;
 
-import jalview.ws.seqfetcher.DbSourceProxy;
 
 /**
  * flyweight class specifying retrieval of Seed alignments from PFAM
@@ -28,7 +27,7 @@ import jalview.ws.seqfetcher.DbSourceProxy;
  * @author JimP
  * 
  */
-public class PfamSeed extends Pfam implements DbSourceProxy
+public class PfamSeed extends Pfam
 {
   public PfamSeed()
   {
@@ -40,9 +39,10 @@ public class PfamSeed extends Pfam implements DbSourceProxy
    * 
    * @see jalview.ws.dbsources.Pfam#getPFAMURL()
    */
+  @Override
   protected String getXFAMURL()
   {
-    return "http://pfam.sanger.ac.uk/family/alignment/download/format?alnType=seed&format=stockholm&order=t&case=l&gaps=default&entry=";
+    return "http://pfam.xfam.org/family/alignment/download/format?alnType=seed&format=stockholm&order=t&case=l&gaps=default&entry=";
   }
 
   /*
@@ -50,16 +50,19 @@ public class PfamSeed extends Pfam implements DbSourceProxy
    * 
    * @see jalview.ws.seqfetcher.DbSourceProxy#getDbName()
    */
+  @Override
   public String getDbName()
   {
     return "PFAM (Seed)";
   }
 
+  @Override
   public String getDbSource()
   {
     return jalview.datamodel.DBRefSource.PFAM; // archetype source
   }
 
+  @Override
   public String getTestQuery()
   {
     return "PF03760";
index b07b8ea..97f73d0 100644 (file)
@@ -20,7 +20,7 @@
  */
 package jalview.ws.dbsources;
 
-import jalview.ws.seqfetcher.DbSourceProxy;
+import jalview.datamodel.DBRefSource;
 
 import com.stevesoft.pat.Regex;
 
@@ -29,15 +29,12 @@ import com.stevesoft.pat.Regex;
  * 
  * @author Lauren Michelle Lui
  */
-abstract public class Rfam extends Xfam implements DbSourceProxy
+abstract public class Rfam extends Xfam
 {
 
   public Rfam()
   {
     super();
-    // all extensions of this RFAM source base class are DOMAINDB sources
-    addDbSourceProperty(jalview.datamodel.DBRefSource.DOMAINDB);
-    addDbSourceProperty(jalview.datamodel.DBRefSource.ALIGNMENTDB);
   }
 
   /*
@@ -46,6 +43,7 @@ abstract public class Rfam extends Xfam implements DbSourceProxy
    * @see jalview.ws.DbSourceProxy#getAccessionSeparator() Left here for
    * consistency with Pfam class
    */
+  @Override
   public String getAccessionSeparator()
   {
     // TODO Auto-generated method stub
@@ -57,6 +55,7 @@ abstract public class Rfam extends Xfam implements DbSourceProxy
    * 
    * @see jalview.ws.DbSourceProxy#getAccessionValidator() * Left here for
    */
+  @Override
   public Regex getAccessionValidator()
   {
     // TODO Auto-generated method stub
@@ -100,6 +99,7 @@ abstract public class Rfam extends Xfam implements DbSourceProxy
    * 
    * @see jalview.ws.DbSourceProxy#isValidReference(java.lang.String)
    */
+  @Override
   public boolean isValidReference(String accession)
   {
     return accession.indexOf("RF") == 0;
@@ -110,9 +110,10 @@ abstract public class Rfam extends Xfam implements DbSourceProxy
    * 
    * @see jalview.ws.dbsources.Xfam#getXfamSource()
    */
+  @Override
   public String getXfamSource()
   {
-    return jalview.datamodel.DBRefSource.RFAM;
+    return DBRefSource.RFAM;
   }
 
 }
index 74f4ec6..3053363 100644 (file)
@@ -20,7 +20,6 @@
  */
 package jalview.ws.dbsources;
 
-import jalview.ws.seqfetcher.DbSourceProxy;
 
 /**
  * Flyweight class specifying retrieval of Full family alignments from RFAM
@@ -28,7 +27,7 @@ import jalview.ws.seqfetcher.DbSourceProxy;
  * @author Lauren Michelle Lui
  * 
  */
-public class RfamFull extends Rfam implements DbSourceProxy
+public class RfamFull extends Rfam
 {
   public RfamFull()
   {
@@ -40,9 +39,11 @@ public class RfamFull extends Rfam implements DbSourceProxy
    * 
    * @see jalview.ws.dbsources.Rfam#getXFAMURL()
    */
+  @Override
   protected String getXFAMURL()
   {
-    return "http://rfam.sanger.ac.uk/family/alignment/download/format?alnType=full&nseLabels=0&format=stockholm&acc=";
+    return "http://rfam.xfam.org/family/alignment/download/format?alnType=full&nseLabels=0&format=stockholm&acc=";
+
   }
 
   /*
@@ -50,16 +51,19 @@ public class RfamFull extends Rfam implements DbSourceProxy
    * 
    * @see jalview.ws.seqfetcher.DbSourceProxy#getDbName()
    */
+  @Override
   public String getDbName()
   {
     return "RFAM (Full)";
   }
 
+  @Override
   public String getDbSource()
   {
     return getDbName(); // so we have unique DbSource string.
   }
 
+  @Override
   public String getTestQuery()
   {
     // Can be retrieved from http://rfam.janelia.org/cgi-bin/getdesc?acc=RF00014
@@ -68,6 +72,7 @@ public class RfamFull extends Rfam implements DbSourceProxy
     return "RF00014";
   }
 
+  @Override
   public String getDbVersion()
   {
     return null;
index dd2b12f..77fb841 100644 (file)
@@ -20,7 +20,6 @@
  */
 package jalview.ws.dbsources;
 
-import jalview.ws.seqfetcher.DbSourceProxy;
 
 /**
  * Flyweight class specifying retrieval of Seed family alignments from RFAM
@@ -28,7 +27,7 @@ import jalview.ws.seqfetcher.DbSourceProxy;
  * @author Lauren Michelle Lui
  * 
  */
-public class RfamSeed extends Rfam implements DbSourceProxy
+public class RfamSeed extends Rfam
 {
   public RfamSeed()
   {
@@ -40,33 +39,43 @@ public class RfamSeed extends Rfam implements DbSourceProxy
    * 
    * @see jalview.ws.dbsources.Rfam#getRFAMURL()
    */
+  @Override
   protected String getXFAMURL()
   {
-    return "http://rfam.sanger.ac.uk/family/alignment/download/format?alnType=seed&nseLabels=0&format=stockholm&acc=";
+    return "http://rfam.xfam.org/family/";
     // Janelia Farms url
     // "http://rfam.janelia.org/cgi-bin/getalignment?type=seed&fmt=stockholm&acc=";
   }
 
+  @Override
+  public String getXFAMURLSUFFIX()
+  {
+    return "/alignment";
+  }
   /*
    * (non-Javadoc)
    * 
    * @see jalview.ws.seqfetcher.DbSourceProxy#getDbName()
    */
+  @Override
   public String getDbName()
   {
     return "RFAM (Seed)";
   }
 
+  @Override
   public String getDbSource()
   {
     return getDbName(); // so we have unique DbSource string.
   }
 
+  @Override
   public String getTestQuery()
   {
     return "RF00014";
   } // http://rfam.janelia.org/cgi-bin/getdesc?acc=RF00014
 
+  @Override
   public String getDbVersion()
   {
     return null;
index 843828b..17f1842 100644 (file)
@@ -31,15 +31,16 @@ import jalview.datamodel.SequenceI;
 import jalview.datamodel.UniprotEntry;
 import jalview.datamodel.UniprotFile;
 import jalview.ws.ebi.EBIFetchClient;
-import jalview.ws.seqfetcher.DbSourceProxy;
 import jalview.ws.seqfetcher.DbSourceProxyImpl;
 
 import java.io.File;
 import java.io.FileReader;
 import java.io.Reader;
+import java.net.URL;
 import java.util.ArrayList;
 import java.util.Vector;
 
+import org.exolab.castor.mapping.Mapping;
 import org.exolab.castor.xml.Unmarshaller;
 
 import com.stevesoft.pat.Regex;
@@ -48,12 +49,14 @@ import com.stevesoft.pat.Regex;
  * @author JimP
  * 
  */
-public class Uniprot extends DbSourceProxyImpl implements DbSourceProxy
+public class Uniprot extends DbSourceProxyImpl
 {
-
   private static final String BAR_DELIMITER = "|";
 
-  private static org.exolab.castor.mapping.Mapping map;
+  /*
+   * Castor mapping loaded from uniprot_mapping.xml
+   */
+  private static Mapping map;
 
   /**
    * Constructor
@@ -61,8 +64,6 @@ public class Uniprot extends DbSourceProxyImpl implements DbSourceProxy
   public Uniprot()
   {
     super();
-    addDbSourceProperty(DBRefSource.SEQDB, DBRefSource.SEQDB);
-    addDbSourceProperty(DBRefSource.PROTSEQDB);
   }
 
   /*
@@ -125,9 +126,8 @@ public class Uniprot extends DbSourceProxyImpl implements DbSourceProxy
       if (map == null)
       {
         // 1. Load the mapping information from the file
-        map = new org.exolab.castor.mapping.Mapping(uni.getClass()
-                .getClassLoader());
-        java.net.URL url = getClass().getResource("/uniprot_mapping.xml");
+        map = new Mapping(uni.getClass().getClassLoader());
+        URL url = getClass().getResource("/uniprot_mapping.xml");
         map.loadMapping(url);
       }
 
@@ -165,7 +165,7 @@ public class Uniprot extends DbSourceProxyImpl implements DbSourceProxy
       // uniprotxml parameter required since december 2007
       // uniprotkb dbname changed introduced december 2008
       File file = ebi.fetchDataAsFile("uniprotkb:" + queries, "uniprotxml",
-              null);
+              null, ".xml");
       Vector<UniprotEntry> entries = getUniprotEntries(new FileReader(file));
 
       if (entries != null)
@@ -248,9 +248,15 @@ public class Uniprot extends DbSourceProxyImpl implements DbSourceProxy
     StringBuilder desc = new StringBuilder(32);
     if (entry.getProtein() != null && entry.getProtein().getName() != null)
     {
+      boolean first = true;
       for (String nm : entry.getProtein().getName())
       {
-        desc.append(nm).append(" ");
+        if (!first)
+        {
+          desc.append(" ");
+        }
+        first = false;
+        desc.append(nm);
       }
     }
     return desc.toString();
@@ -265,7 +271,9 @@ public class Uniprot extends DbSourceProxyImpl implements DbSourceProxy
   public static String getUniprotEntryId(UniprotEntry entry)
   {
     StringBuilder name = new StringBuilder(32);
-    name.append("UniProt/Swiss-Prot");
+    // name.append("UniProt/Swiss-Prot");
+    // use 'canonicalised' name for optimal id matching
+    name.append(DBRefSource.UNIPROT);
     for (String accessionId : entry.getAccession())
     {
       name.append(BAR_DELIMITER);
similarity index 88%
rename from src/jalview/ws/dbsources/UnprotName.java
rename to src/jalview/ws/dbsources/UniprotName.java
index 5dbc960..fa693c0 100644 (file)
@@ -20,6 +20,8 @@
  */
 package jalview.ws.dbsources;
 
+import jalview.datamodel.DBRefSource;
+
 /**
  * Canonical Uniprot fetcher instance specifically retrieving UP_NAME
  * references.
@@ -27,8 +29,7 @@ package jalview.ws.dbsources;
  * @author JimP
  * 
  */
-public class UnprotName extends Uniprot implements
-        jalview.ws.seqfetcher.DbSourceProxy
+public class UniprotName extends Uniprot
 {
 
   /*
@@ -36,9 +37,10 @@ public class UnprotName extends Uniprot implements
    * 
    * @see jalview.ws.dbsources.Uniprot#getDbSource()
    */
+  @Override
   public String getDbSource()
   {
-    return jalview.datamodel.DBRefSource.UP_NAME;
+    return DBRefSource.UP_NAME;
   }
 
 }
index c392ce6..508047d 100644 (file)
@@ -22,6 +22,7 @@ package jalview.ws.dbsources;
 
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.DBRefEntry;
+import jalview.io.FormatAdapter;
 import jalview.ws.seqfetcher.DbSourceProxyImpl;
 
 /**
@@ -40,10 +41,12 @@ public abstract class Xfam extends DbSourceProxyImpl
 
   protected abstract String getXFAMURL();
 
+  @Override
   public abstract String getDbVersion();
 
   abstract String getXfamSource();
 
+  @Override
   public AlignmentI getSequenceRecords(String queries) throws Exception
   {
     // TODO: this is not a perfect implementation. We need to be able to add
@@ -51,8 +54,9 @@ public abstract class Xfam extends DbSourceProxyImpl
     // retrieved.
     startQuery();
     // TODO: trap HTTP 404 exceptions and return null
-    AlignmentI rcds = new jalview.io.FormatAdapter().readFile(getXFAMURL()
-            + queries.trim().toUpperCase(), jalview.io.FormatAdapter.URL,
+    AlignmentI rcds = new FormatAdapter().readFile(getXFAMURL()
+            + queries.trim().toUpperCase() + getXFAMURLSUFFIX(),
+            jalview.io.FormatAdapter.URL,
             "STH");
     for (int s = 0, sNum = rcds.getHeight(); s < sNum; s++)
     {
@@ -70,4 +74,23 @@ public abstract class Xfam extends DbSourceProxyImpl
     return rcds;
   }
 
+  /**
+   * Pfam and Rfam provide alignments
+   */
+  @Override
+  public boolean isAlignmentSource()
+  {
+    return true;
+  }
+
+  /**
+   * default suffix to append the retrieval URL for this source.
+   * 
+   * @return "" for most Xfam sources
+   */
+  public String getXFAMURLSUFFIX()
+  {
+    return "";
+  }
+
 }
index c33871d..9f6bc65 100644 (file)
@@ -20,6 +20,7 @@
  */
 package jalview.ws.ebi;
 
+import jalview.datamodel.DBRefSource;
 import jalview.util.MessageManager;
 
 import java.io.BufferedInputStream;
@@ -90,22 +91,24 @@ public class EBIFetchClient
    * 
    * @param ids
    *          the query formatted as db:query1;query2;query3
-   * @param f
+   * @param format
    *          the format wanted
    * @param s
    *          - unused parameter
    * @return the file holding the response
    * @throws OutOfMemoryError
    */
-  public File fetchDataAsFile(String ids, String f, String s)
+
+  public File fetchDataAsFile(String ids, String format, String s,
+          String ext)
           throws OutOfMemoryError
   {
     File outFile = null;
     try
     {
-      outFile = File.createTempFile("jalview", ".xml");
+      outFile = File.createTempFile("jalview", ext);
       outFile.deleteOnExit();
-      fetchData(ids, f, s, outFile);
+      fetchData(ids, format, s, outFile);
       if (outFile.length() == 0)
       {
         outFile.delete();
@@ -122,20 +125,20 @@ public class EBIFetchClient
    * 
    * @param ids
    *          db:query1;query2;query3
-   * @param f
+   * @param format
    *          raw/xml
    * @param s
    *          not used - remove?
    * 
    * @return Raw string array result of query set
    */
-  public String[] fetchData(String ids, String f, String s)
+  public String[] fetchData(String ids, String format, String s)
           throws OutOfMemoryError
   {
-    return fetchData(ids, f, s, null);
+    return fetchData(ids, format, s, null);
   }
 
-  public String[] fetchData(String ids, String f, String s, File outFile)
+  String[] fetchData(String ids, String f, String s, File outFile)
           throws OutOfMemoryError
   {
     // Need to split
@@ -183,16 +186,27 @@ public class EBIFetchClient
     return (rslts.length == 0 ? null : rslts);
   }
 
-  public String[] fetchBatch(String ids, String db, String f, String s,
+  public String[] fetchBatch(String ids, String dbPath, String format, String s,
           File outFile) throws OutOfMemoryError
   {
-    long time = System.currentTimeMillis();
-    // max 200 ids can be added at one time
+    // 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";
+    }
+
     try
     {
       URL rcall = new URL("http://www.ebi.ac.uk/Tools/dbfetch/dbfetch/"
-              + db.toLowerCase() + "/" + ids.toLowerCase()
-              + (f != null ? "/" + f : ""));
+              + dbPath.toLowerCase() + "/" + ids.toLowerCase()
+              + (format != null ? "/" + format : ""));
 
       InputStream is = new BufferedInputStream(rcall.openStream());
       if (outFile != null)
@@ -221,7 +235,7 @@ public class EBIFetchClient
     } catch (OutOfMemoryError er)
     {
 
-      System.out.println("OUT OF MEMORY DOWNLOADING QUERY FROM " + db
+      System.out.println("OUT OF MEMORY DOWNLOADING QUERY FROM " + dbPath
               + ":\n" + ids);
       throw er;
     } catch (Exception ex)
@@ -231,14 +245,15 @@ public class EBIFetchClient
       {
         return null;
       }
-      System.err.println("Unexpected exception when retrieving from " + db
+      System.err.println("Unexpected exception when retrieving from "
+              + dbPath
               + "\nQuery was : '" + ids + "'");
       ex.printStackTrace(System.err);
       return null;
     } finally
     {
-      // System.err.println("Took " + (System.currentTimeMillis() - time)
-      // / 1000 + " secs for one call.");
+      // System.err.println("EBIFetch took " + (System.currentTimeMillis() -
+      // time) + " ms");
     }
     return null;
   }
index 8c7768d..8299e3c 100644 (file)
@@ -123,7 +123,7 @@ class JPredThread extends JWS1Thread implements WSClientI
         jalview.bin.Cache.log.debug("Getting associated alignment.");
         // we ignore the returned alignment if we only predicted on a single
         // sequence
-        String format = new jalview.io.IdentifyFile().Identify(
+        String format = new jalview.io.IdentifyFile().identify(
                 result.getAligfile(), "Paste");
 
         if (jalview.io.FormatAdapter.isValidFormat(format))
index a28494c..66fddd1 100644 (file)
@@ -21,6 +21,7 @@
 package jalview.ws.jws1;
 
 import jalview.analysis.AlignSeq;
+import jalview.api.FeatureColourI;
 import jalview.bin.Cache;
 import jalview.datamodel.Alignment;
 import jalview.datamodel.AlignmentView;
@@ -152,6 +153,7 @@ class SeqSearchWSThread extends JWS1Thread implements WSClientI
      * 
      * @return true if getAlignment will return a valid alignment result.
      */
+    @Override
     public boolean hasResults()
     {
       if (subjobComplete
@@ -170,7 +172,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(Alignment dataset,
+            Map<String, FeatureColourI> featureColours)
     {
 
       if (result != null && result.isFinished())
@@ -287,6 +290,7 @@ class SeqSearchWSThread extends JWS1Thread implements WSClientI
      * 
      * @return boolean true if job can be submitted.
      */
+    @Override
     public boolean hasValidInput()
     {
       if (seqs.getSeqs() != null)
@@ -373,11 +377,13 @@ class SeqSearchWSThread extends JWS1Thread implements WSClientI
     }
   }
 
+  @Override
   public boolean isCancellable()
   {
     return true;
   }
 
+  @Override
   public void cancelJob()
   {
     if (!jobComplete && jobs != null)
@@ -444,12 +450,14 @@ class SeqSearchWSThread extends JWS1Thread implements WSClientI
     }
   }
 
+  @Override
   public void pollJob(AWsJob job) throws Exception
   {
     ((SeqSearchWSJob) job).result = server.getResult(((SeqSearchWSJob) job)
             .getJobId());
   }
 
+  @Override
   public void StartJob(AWsJob job)
   {
     if (!(job instanceof SeqSearchWSJob))
@@ -536,6 +544,7 @@ class SeqSearchWSThread extends JWS1Thread implements WSClientI
     return msa;
   }
 
+  @Override
   public void parseResult()
   {
     int results = 0; // number of result sets received
@@ -579,6 +588,7 @@ class SeqSearchWSThread extends JWS1Thread implements WSClientI
       wsInfo.showResultsNewFrame
               .addActionListener(new java.awt.event.ActionListener()
               {
+                @Override
                 public void actionPerformed(java.awt.event.ActionEvent evt)
                 {
                   displayResults(true);
@@ -587,6 +597,7 @@ class SeqSearchWSThread extends JWS1Thread implements WSClientI
       wsInfo.mergeResults
               .addActionListener(new java.awt.event.ActionListener()
               {
+                @Override
                 public void actionPerformed(java.awt.event.ActionEvent evt)
                 {
                   displayResults(false);
@@ -612,7 +623,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<String, FeatureColourI> featureColours = new HashMap<String, FeatureColourI>();
       Alignment al = null;
       NewickFile nf = null;
       if (jobs[j].hasResults())
@@ -664,6 +675,7 @@ class SeqSearchWSThread extends JWS1Thread implements WSClientI
     }
   }
 
+  @Override
   public boolean canMergeResults()
   {
     return false;
index 71b6c91..0cf76e0 100644 (file)
@@ -47,8 +47,7 @@ import compbio.data.sequence.Score;
 import compbio.data.sequence.ScoreManager.ScoreHolder;
 import compbio.metadata.Argument;
 
-public class AADisorderClient extends JabawsCalcWorker implements
-        AlignCalcWorkerI
+public class AADisorderClient extends JabawsCalcWorker
 {
 
   private static final String THRESHOLD = "THRESHOLD";
index e4d6329..c15f256 100644 (file)
@@ -20,7 +20,6 @@
  */
 package jalview.ws.jws2;
 
-import jalview.api.AlignCalcWorkerI;
 import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.Annotation;
 import jalview.gui.AlignFrame;
@@ -43,9 +42,7 @@ import compbio.data.sequence.JpredAlignment;
 import compbio.metadata.Argument;
 
 public class JPred301Client extends JabawsMsaInterfaceAlignCalcWorker
-        implements AlignCalcWorkerI
 {
-
   /**
    * 
    * @return default args for this service when run as dynamic web service
@@ -87,6 +84,7 @@ public class JPred301Client extends JabawsMsaInterfaceAlignCalcWorker
     return (seqs.size() > 1);
   }
 
+  @Override
   public String getServiceActionText()
   {
     return "calculating consensus secondary structure prediction using JPred service";
@@ -112,6 +110,7 @@ public class JPred301Client extends JabawsMsaInterfaceAlignCalcWorker
    * update the consensus annotation from the sequence profile data using
    * current visualization settings.
    */
+  @Override
   public void updateResultAnnotation(boolean immediate)
   {
     if (immediate || !calcMan.isWorking(this) && msascoreset != null)
index 41aa223..9ca6d2e 100644 (file)
@@ -20,7 +20,6 @@
  */
 package jalview.ws.jws2;
 
-import jalview.api.AlignCalcWorkerI;
 import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.Annotation;
 import jalview.gui.AlignFrame;
@@ -50,8 +49,7 @@ import compbio.metadata.Argument;
  * 
  */
 
-public class RNAalifoldClient extends JabawsCalcWorker implements
-        AlignCalcWorkerI
+public class RNAalifoldClient extends JabawsCalcWorker
 {
 
   String methodName;
@@ -75,6 +73,7 @@ public class RNAalifoldClient extends JabawsCalcWorker implements
     initViewportParams();
   }
 
+  @Override
   public String getCalcId()
   {
     return CALC_ID;
index 0fe7275..2392476 100644 (file)
@@ -20,6 +20,8 @@
  */
 package jalview.ws.seqfetcher;
 
+import jalview.api.FeatureSettingsModelI;
+import jalview.bin.Cache;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.DBRefEntry;
 import jalview.datamodel.SequenceI;
@@ -27,10 +29,11 @@ import jalview.util.DBRefUtils;
 import jalview.util.MessageManager;
 
 import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.Enumeration;
 import java.util.HashSet;
 import java.util.Hashtable;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Stack;
@@ -39,60 +42,93 @@ import java.util.Vector;
 public class ASequenceFetcher
 {
 
-  /**
+  /*
    * set of databases we can retrieve entries from
    */
-  protected Hashtable<String, Map<String, DbSourceProxy>> FETCHABLEDBS;
+  protected Hashtable<String, Map<String, DbSourceProxy>> fetchableDbs;
+
+  /*
+   * comparator to sort by tier (0/1/2) and name
+   */
+  private Comparator<DbSourceProxy> proxyComparator;
 
+  /**
+   * Constructor
+   */
   public ASequenceFetcher()
   {
     super();
+
+    /*
+     * comparator to sort proxies by tier and name
+     */
+    proxyComparator = new Comparator<DbSourceProxy>()
+    {
+      @Override
+      public int compare(DbSourceProxy o1, DbSourceProxy o2)
+      {
+        /*
+         * Tier 0 precedes 1 precedes 2
+         */
+        int compared = Integer.compare(o1.getTier(), o2.getTier());
+        if (compared == 0)
+        {
+          // defend against NullPointer - should never happen
+          String o1Name = o1.getDbName();
+          String o2Name = o2.getDbName();
+          if (o1Name != null && o2Name != null)
+          {
+            compared = o1Name.compareToIgnoreCase(o2Name);
+          }
+        }
+        return compared;
+      }
+    };
   }
 
   /**
-   * get list of supported Databases
+   * get array of supported Databases
    * 
    * @return database source string for each database - only the latest version
    *         of a source db is bound to each source.
    */
   public String[] getSupportedDb()
   {
-    if (FETCHABLEDBS == null)
+    if (fetchableDbs == null)
     {
       return null;
     }
-    String[] sf = new String[FETCHABLEDBS.size()];
-    Enumeration e = FETCHABLEDBS.keys();
-    int i = 0;
-    while (e.hasMoreElements())
-    {
-      sf[i++] = (String) e.nextElement();
-    }
-    ;
+    String[] sf = fetchableDbs.keySet().toArray(
+            new String[fetchableDbs.size()]);
     return sf;
   }
 
   public boolean isFetchable(String source)
   {
-    Enumeration e = FETCHABLEDBS.keys();
-    while (e.hasMoreElements())
+    for (String db : fetchableDbs.keySet())
     {
-      String db = (String) e.nextElement();
-      if (source.compareToIgnoreCase(db) == 0)
+      if (source.equalsIgnoreCase(db))
       {
         return true;
       }
     }
-    jalview.bin.Cache.log.warn("isFetchable doesn't know about '" + source
+    Cache.log.warn("isFetchable doesn't know about '" + source
             + "'");
     return false;
   }
 
-  public SequenceI[] getSequences(jalview.datamodel.DBRefEntry[] refs)
+  /**
+   * Fetch sequences for the given cross-references
+   * 
+   * @param refs
+   * @param dna
+   *          if true, only fetch from nucleotide data sources, else peptide
+   * @return
+   */
+  public SequenceI[] getSequences(DBRefEntry[] refs, boolean dna)
   {
-    SequenceI[] ret = null;
-    Vector<SequenceI> rseqs = new Vector();
-    Hashtable<String, List<String>> queries = new Hashtable();
+    Vector<SequenceI> rseqs = new Vector<SequenceI>();
+    Hashtable<String, List<String>> queries = new Hashtable<String, List<String>>();
     for (int r = 0; r < refs.length; r++)
     {
       if (!queries.containsKey(refs[r].getSource()))
@@ -118,22 +154,22 @@ public class ASequenceFetcher
                 "Don't know how to fetch from this database :" + db));
         continue;
       }
-      Iterator<DbSourceProxy> fetchers = getSourceProxy(db).iterator();
+
       Stack<String> queriesLeft = new Stack<String>();
-      // List<String> queriesFailed = new ArrayList<String>();
       queriesLeft.addAll(query);
-      while (fetchers.hasNext())
+
+      List<DbSourceProxy> proxies = getSourceProxy(db);
+      for (DbSourceProxy fetcher : proxies)
       {
         List<String> queriesMade = new ArrayList<String>();
-        HashSet queriesFound = new HashSet<String>();
+        HashSet<String> queriesFound = new HashSet<String>();
         try
         {
-          DbSourceProxy fetcher = fetchers.next();
-          boolean doMultiple = fetcher.getAccessionSeparator() != null; // No
-          // separator
-          // - no
-          // Multiple
-          // Queries
+          if (fetcher.isDnaCoding() != dna)
+          {
+            continue; // wrong sort of data
+          }
+          boolean doMultiple = fetcher.getMaximumQueryCount() > 1;
           while (!queriesLeft.isEmpty())
           {
             StringBuffer qsb = new StringBuffer();
@@ -152,8 +188,7 @@ public class ASequenceFetcher
             try
             {
               // create a fetcher and go to it
-              seqset = fetcher.getSequenceRecords(qsb.toString()); // ,
-              // queriesFailed);
+              seqset = fetcher.getSequenceRecords(qsb.toString());
             } catch (Exception ex)
             {
               System.err.println("Failed to retrieve the following from "
@@ -220,24 +255,24 @@ public class ASequenceFetcher
         {
           System.out.println("# Adding " + queriesMade.size()
                   + " ids back to queries list for searching again (" + db
-                  + ".");
+                  + ")");
           queriesLeft.addAll(queriesMade);
         }
       }
     }
+
+    SequenceI[] result = null;
     if (rseqs.size() > 0)
     {
-      ret = new SequenceI[rseqs.size()];
-      Enumeration sqs = rseqs.elements();
+      result = new SequenceI[rseqs.size()];
       int si = 0;
-      while (sqs.hasMoreElements())
+      for (SequenceI s : rseqs)
       {
-        SequenceI s = (SequenceI) sqs.nextElement();
-        ret[si++] = s;
+        result[si++] = s;
         s.updatePDBIds();
       }
     }
-    return ret;
+    return result;
   }
 
   public void reportStdError(String db, List<String> queriesMade,
@@ -261,50 +296,32 @@ public class ASequenceFetcher
   }
 
   /**
-   * Retrieve an instance of the proxy for the given source
+   * Returns a list of proxies for the given source
    * 
    * @param db
    *          database source string TODO: add version string/wildcard for
    *          retrieval of specific DB source/version combinations.
-   * @return an instance of DbSourceProxy for that db.
+   * @return a list of DbSourceProxy for the db
    */
   public List<DbSourceProxy> getSourceProxy(String db)
   {
-    List<DbSourceProxy> dbs;
-    Map<String, DbSourceProxy> dblist = FETCHABLEDBS.get(db);
+    db = DBRefUtils.getCanonicalName(db);
+    Map<String, DbSourceProxy> dblist = fetchableDbs.get(db);
     if (dblist == null)
     {
       return new ArrayList<DbSourceProxy>();
     }
-    ;
-    if (dblist.size() > 1)
-    {
-      DbSourceProxy[] l = dblist.values().toArray(new DbSourceProxy[0]);
-      int i = 0;
-      String[] nm = new String[l.length];
-      // make sure standard dbs appear first, followed by reference das sources,
-      // followed by anything else.
-      for (DbSourceProxy s : l)
-      {
-        nm[i++] = "" + s.getTier() + s.getDbName().toLowerCase();
-      }
-      jalview.util.QuickSort.sort(nm, l);
-      dbs = new ArrayList<DbSourceProxy>();
-      for (i = l.length - 1; i >= 0; i--)
-      {
-        dbs.add(l[i]);
-      }
-    }
-    else
-    {
-      dbs = new ArrayList<DbSourceProxy>(dblist.values());
-    }
+
+    /*
+     * sort so that primary sources precede secondary
+     */
+    List<DbSourceProxy> dbs = new ArrayList<DbSourceProxy>(dblist.values());
+    Collections.sort(dbs, proxyComparator);
     return dbs;
   }
 
   /**
-   * constructs and instance of the proxy and registers it as a valid
-   * dbrefsource
+   * constructs an instance of the proxy and registers it as a valid dbrefsource
    * 
    * @param dbSourceProxy
    *          reference for class implementing
@@ -312,7 +329,7 @@ public class ASequenceFetcher
    */
   protected void addDBRefSourceImpl(
           Class<? extends DbSourceProxy> dbSourceProxy)
-          throws java.lang.IllegalArgumentException
+          throws IllegalArgumentException
   {
     DbSourceProxy proxy = null;
     try
@@ -343,15 +360,15 @@ public class ASequenceFetcher
   {
     if (proxy != null)
     {
-      if (FETCHABLEDBS == null)
+      if (fetchableDbs == null)
       {
-        FETCHABLEDBS = new Hashtable<String, Map<String, DbSourceProxy>>();
+        fetchableDbs = new Hashtable<String, Map<String, DbSourceProxy>>();
       }
-      Map<String, DbSourceProxy> slist = FETCHABLEDBS.get(proxy
+      Map<String, DbSourceProxy> slist = fetchableDbs.get(proxy
               .getDbSource());
       if (slist == null)
       {
-        FETCHABLEDBS.put(proxy.getDbSource(),
+        fetchableDbs.put(proxy.getDbSource(),
                 slist = new Hashtable<String, DbSourceProxy>());
       }
       slist.put(proxy.getDbName(), proxy);
@@ -359,34 +376,6 @@ public class ASequenceFetcher
   }
 
   /**
-   * test if the database handler for dbName contains the given dbProperty when
-   * a dbName resolves to a set of proxies - this method will return the result
-   * of the test for the first instance. TODO implement additional method to
-   * query all sources for a db to find one with a particular property
-   * 
-   * @param dbName
-   * @param dbProperty
-   * @return true if proxy has the given property
-   */
-  public boolean hasDbSourceProperty(String dbName, String dbProperty)
-  {
-    // TODO: decide if invalidDbName exception is thrown here.
-
-    List<DbSourceProxy> proxies = getSourceProxy(dbName);
-    if (proxies != null)
-    {
-      for (DbSourceProxy proxy : proxies)
-      {
-        if (proxy.getDbSourceProperties() != null)
-        {
-          return proxy.getDbSourceProperties().containsKey(dbProperty);
-        }
-      }
-    }
-    return false;
-  }
-
-  /**
    * select sources which are implemented by instances of the given class
    * 
    * @param class that implements DbSourceProxy
@@ -394,7 +383,7 @@ public class ASequenceFetcher
    */
   public String[] getDbInstances(Class class1)
   {
-    if (!jalview.ws.seqfetcher.DbSourceProxy.class.isAssignableFrom(class1))
+    if (!DbSourceProxy.class.isAssignableFrom(class1))
     {
       throw new Error(
               MessageManager
@@ -402,17 +391,17 @@ public class ASequenceFetcher
                               "error.implementation_error_dbinstance_must_implement_interface",
                               new String[] { class1.toString() }));
     }
-    if (FETCHABLEDBS == null)
+    if (fetchableDbs == null)
     {
       return null;
     }
     String[] sources = null;
-    Vector src = new Vector();
-    Enumeration dbs = FETCHABLEDBS.keys();
+    Vector<String> src = new Vector<String>();
+    Enumeration<String> dbs = fetchableDbs.keys();
     while (dbs.hasMoreElements())
     {
-      String dbn = (String) dbs.nextElement();
-      for (DbSourceProxy dbp : FETCHABLEDBS.get(dbn).values())
+      String dbn = dbs.nextElement();
+      for (DbSourceProxy dbp : fetchableDbs.get(dbn).values())
       {
         if (class1.isAssignableFrom(dbp.getClass()))
         {
@@ -429,7 +418,7 @@ public class ASequenceFetcher
 
   public DbSourceProxy[] getDbSourceProxyInstances(Class class1)
   {
-    ArrayList<DbSourceProxy> prlist = new ArrayList<DbSourceProxy>();
+    List<DbSourceProxy> prlist = new ArrayList<DbSourceProxy>();
     for (String fetchable : getSupportedDb())
     {
       for (DbSourceProxy pr : getSourceProxy(fetchable))
@@ -447,4 +436,28 @@ public class ASequenceFetcher
     return prlist.toArray(new DbSourceProxy[0]);
   }
 
+  /**
+   * Returns a preferred feature colouring scheme for the given source, or null
+   * if none is defined.
+   * 
+   * @param source
+   * @return
+   */
+  public FeatureSettingsModelI getFeatureColourScheme(String source)
+  {
+    /*
+     * return the first non-null colour scheme for any proxy for
+     * this database source
+     */
+    for (DbSourceProxy proxy : getSourceProxy(source))
+    {
+      FeatureSettingsModelI preferredColours = proxy
+              .getFeatureColourScheme();
+      if (preferredColours != null)
+      {
+        return preferredColours;
+      }
+    }
+    return null;
+  }
 }
index 556df1f..a02ffc9 100644 (file)
  */
 package jalview.ws.seqfetcher;
 
+import jalview.api.FeatureSettingsModelI;
 import jalview.datamodel.AlignmentI;
 
-import java.util.Hashtable;
-
 import com.stevesoft.pat.Regex;
 
 /**
  * generic Reference Retrieval interface for a particular database
- * source/version as cited in DBRefEntry. TODO: add/define property to describe
- * max number of queries that this source can cope with at once. TODO:
- * add/define mechanism for retrieval of Trees and distance matrices from a
- * database (unify with io)
+ * source/version as cited in DBRefEntry.
+ * 
+ * TODO: add/define mechanism for retrieval of Trees and distance matrices from
+ * a database (unify with io)
  * 
- * @author JimP TODO: promote to API
+ * @author JimP
  */
 public interface DbSourceProxy
 {
@@ -41,7 +40,7 @@ public interface DbSourceProxy
    * 
    * @return source string constant used for this DB source
    */
-  public String getDbSource();
+  String getDbSource();
 
   /**
    * Short meaningful name for this data source for display in menus or
@@ -49,13 +48,13 @@ public interface DbSourceProxy
    * 
    * @return String
    */
-  public String getDbName();
+  String getDbName();
 
   /**
    * 
    * @return version string for this database.
    */
-  public String getDbVersion();
+  String getDbVersion();
 
   /**
    * Separator between individual accession queries for a database that allows
@@ -65,7 +64,7 @@ public interface DbSourceProxy
    * @return string for separating concatenated queries (as individually
    *         validated by the accession validator)
    */
-  public String getAccessionSeparator();
+  String getAccessionSeparator();
 
   /**
    * Regular expression for checking form of query string understood by this
@@ -75,31 +74,24 @@ public interface DbSourceProxy
    * 
    * @return null or a validation regex
    */
-  public Regex getAccessionValidator();
-
-  /**
-   * DbSource properties hash - define the capabilities of this source Property
-   * hash methods defined in DbSourceProxyImpl. See constants in
-   * jalview.datamodel.DBRefSource for definition of properties.
-   * 
-   * @return
-   */
-  public Hashtable getDbSourceProperties();
+  Regex getAccessionValidator();
 
   /**
    * 
    * @return a test/example query that can be used to validate retrieval and
    *         parsing mechanisms
    */
-  public String getTestQuery();
+  String getTestQuery();
 
   /**
-   * optionally implemented
+   * Required for sources supporting multiple query retrieval for use with the
+   * DBRefFetcher, which attempts to limit its queries with putative accession
+   * strings for a source to only those that are likely to be valid.
    * 
    * @param accession
    * @return
    */
-  public boolean isValidReference(String accession);
+  boolean isValidReference(String accession);
 
   /**
    * make one or more queries to the database and attempt to parse the response
@@ -107,41 +99,83 @@ public interface DbSourceProxy
    * 
    * @param queries
    *          - one or more queries for database in expected form
-   * @return null if queries were successful but result was not parsable
+   * @return null if queries were successful but result was not parsable.
+   *         Otherwise, an AlignmentI object containing properly annotated data
+   *         (e.g. sequences with accessions for this datasource)
    * @throws Exception
    *           - propagated from underlying transport to database (note -
    *           exceptions are not raised if query not found in database)
    * 
    */
-  public AlignmentI getSequenceRecords(String queries) throws Exception;
+  AlignmentI getSequenceRecords(String queries) throws Exception;
 
   /**
    * 
    * @return true if a query is currently being made
    */
-  public boolean queryInProgress();
+  boolean queryInProgress();
 
   /**
    * get the raw reponse from the last set of queries
    * 
    * @return one or more string buffers for each individual query
    */
-  public StringBuffer getRawRecords();
+  StringBuffer getRawRecords();
 
   /**
-   * Find out more info about the source.
+   * Tier for this data source
    * 
-   * @param dbsourceproperty
-   *          - one of the database reference source properties in
-   *          jalview.datamodel.DBRefSource
-   * @return true if the source has this property
+   * @return 0 - primary datasource, 1 - das primary source, 2 - secondary
    */
-  public boolean isA(Object dbsourceproperty);
+  int getTier();
 
   /**
-   * Tier for this data source
+   * Extracts valid accession strings from a query string. If there is an
+   * accession id validator, returns the the matched region or the first
+   * subgroup match from the matched region; else just returns the whole query.
    * 
-   * @return 0 - primary datasource, 1 - das primary source, 2 - secondary
+   * @param query
+   * @return
+   */
+  String getAccessionIdFromQuery(String query);
+
+  /**
+   * Returns the maximum number of accession ids that can be queried in one
+   * request.
+   * 
+   * @return
+   */
+  int getMaximumQueryCount();
+
+  /**
+   * Returns true if the source may provide coding DNA i.e. sequences with
+   * implicit peptide products
+   * 
+   * @return
+   */
+  boolean isDnaCoding();
+
+  /**
+   * Answers true if the database is a source of alignments (for example, domain
+   * families)
+   * 
+   * @return
+   */
+  boolean isAlignmentSource();
+
+  /**
+   * Returns an (optional) description of the source, suitable for display as a
+   * tooltip, or null
+   * 
+   * @return
+   */
+  String getDescription();
+
+  /**
+   * Returns the preferred feature colour configuration if there is one, else
+   * null
+   * 
+   * @return
    */
-  public int getTier();
-}
+  FeatureSettingsModelI getFeatureColourScheme();
+}
\ No newline at end of file
index 0785dfa..5bed720 100644 (file)
  */
 package jalview.ws.seqfetcher;
 
+import jalview.api.FeatureSettingsModelI;
 import jalview.datamodel.AlignmentI;
 import jalview.io.FormatAdapter;
 import jalview.io.IdentifyFile;
 
-import java.util.Hashtable;
-
 /**
  * common methods for implementations of the DbSourceProxy interface.
  * 
@@ -34,50 +33,21 @@ import java.util.Hashtable;
  */
 public abstract class DbSourceProxyImpl implements DbSourceProxy
 {
-  public DbSourceProxyImpl()
-  {
-    // default constructor - do nothing probably.
-  }
 
-  private Hashtable props = null;
-
-  /*
-   * (non-Javadoc)
-   * 
-   * @see jalview.ws.DbSourceProxy#getDbSourceProperties()
-   */
-  public Hashtable getDbSourceProperties()
-  {
-    if (props == null)
-    {
-      props = new Hashtable();
-    }
-    return props;
-  }
+  boolean queryInProgress = false;
 
-  protected void addDbSourceProperty(Object propname)
-  {
-    addDbSourceProperty(propname, propname);
-  }
+  protected StringBuffer results = null;
 
-  protected void addDbSourceProperty(Object propname, Object propvalue)
+  public DbSourceProxyImpl()
   {
-    if (props == null)
-    {
-      props = new Hashtable();
-    }
-    props.put(propname, propvalue);
   }
 
-  boolean queryInProgress = false;
-
-  protected StringBuffer results = null;
-
   /*
    * (non-Javadoc)
    * 
    * @see jalview.ws.DbSourceProxy#getRawRecords()
    */
+  @Override
   public StringBuffer getRawRecords()
   {
     return results;
@@ -88,6 +58,7 @@ public abstract class DbSourceProxyImpl implements DbSourceProxy
    * 
    * @see jalview.ws.DbSourceProxy#queryInProgress()
    */
+  @Override
   public boolean queryInProgress()
   {
     return queryInProgress;
@@ -121,7 +92,7 @@ public abstract class DbSourceProxyImpl implements DbSourceProxy
   protected AlignmentI parseResult(String result) throws Exception
   {
     AlignmentI sequences = null;
-    String format = new IdentifyFile().Identify(result, "Paste");
+    String format = new IdentifyFile().identify(result, "Paste");
     if (FormatAdapter.isValidFormat(format))
     {
       sequences = new FormatAdapter().readFile(result.toString(), "Paste",
@@ -130,11 +101,58 @@ public abstract class DbSourceProxyImpl implements DbSourceProxy
     return sequences;
   }
 
+  /**
+   * Returns the first accession id in the query (up to the first accession id
+   * separator), or the whole query if there is no separator or it is not found
+   */
   @Override
-  public boolean isA(Object dbsourceproperty)
+  public String getAccessionIdFromQuery(String query)
   {
-    assert (dbsourceproperty != null);
-    return (props == null) ? false : props.containsKey(dbsourceproperty);
+    String sep = getAccessionSeparator();
+    if (sep == null)
+    {
+      return query;
+    }
+    int sepPos = query.indexOf(sep);
+    return sepPos == -1 ? query : query.substring(0, sepPos);
+  }
+
+  /**
+   * Default is only one accession id per query - override if more are allowed.
+   */
+  @Override
+  public int getMaximumQueryCount()
+  {
+    return 1;
+  }
+
+  /**
+   * Returns false - override to return true for DNA coding data sources
+   */
+  @Override
+  public boolean isDnaCoding()
+  {
+    return false;
   }
 
+  /**
+   * Answers false - override as required in subclasses
+   */
+  @Override
+  public boolean isAlignmentSource()
+  {
+    return false;
+  }
+
+  @Override
+  public String getDescription()
+  {
+    return "";
+  }
+
+  @Override
+  public FeatureSettingsModelI getFeatureColourScheme()
+  {
+    return null;
+  }
 }
index f25c1cf..e04bbb7 100644 (file)
@@ -26,6 +26,7 @@ import jalview.api.SiftsClientI;
 import jalview.datamodel.DBRefEntry;
 import jalview.datamodel.DBRefSource;
 import jalview.datamodel.SequenceI;
+import jalview.io.StructureFile;
 import jalview.schemes.ResidueProperties;
 import jalview.structure.StructureMapping;
 import jalview.util.Format;
@@ -77,7 +78,7 @@ public class SiftsClient implements SiftsClientI
 {
   private Entry siftsEntry;
 
-  private PDBfile pdb;
+  private StructureFile pdb;
 
   private String pdbId;
 
@@ -147,10 +148,10 @@ public class SiftsClient implements SiftsClientI
    * @param pdbId
    * @throws SiftsException
    */
-  public SiftsClient(PDBfile pdb) throws SiftsException
+  public SiftsClient(StructureFile pdb) throws SiftsException
   {
     this.pdb = pdb;
-    this.pdbId = pdb.id;
+    this.pdbId = pdb.getId();
     File siftsFile = getSiftsFile(pdbId);
     siftsEntry = parseSIFTs(siftsFile);
   }
@@ -167,7 +168,7 @@ public class SiftsClient implements SiftsClientI
   public SiftsClient(PDBfile pdb, File siftsFile) throws SiftsException
   {
     this.pdb = pdb;
-    this.pdbId = pdb.id;
+    this.pdbId = pdb.getId();
     siftsEntry = parseSIFTs(siftsFile);
   }
 
@@ -456,7 +457,7 @@ public class SiftsClient implements SiftsClientI
   {
     ArrayList<Integer> omitNonObserved = new ArrayList<Integer>();
     int nonObservedShiftIndex = 0;
-    System.out.println("Generating mappings for : " + entityId);
+    // System.out.println("Generating mappings for : " + entityId);
     Entity entity = null;
     entity = getEntityById(entityId);
     String originalSeq = AlignSeq.extractGaps(
@@ -491,8 +492,8 @@ public class SiftsClient implements SiftsClientI
     for (Segment segment : segments)
     {
       segStartEnd = segment.getStart() + " - " + segment.getEnd();
-      System.out.println("Mappging segments : " + segment.getSegId() + "\\"
-              + segStartEnd);
+      // System.out.println("Mapping segments : " + segment.getSegId() + "\\"
+      // + segStartEnd);
       List<Residue> residues = segment.getListResidue().getResidue();
       for (Residue residue : residues)
       {
@@ -519,6 +520,7 @@ public class SiftsClient implements SiftsClientI
             {
               currSeqIndex = Integer.valueOf(resNumIndexString
                       .split("[a-zA-Z]")[0]);
+              continue;
             }
             if (pdbRefDb != null)
             {
@@ -647,18 +649,25 @@ public class SiftsClient implements SiftsClientI
   void populateAtomPositions(String chainId,
           HashMap<Integer, int[]> mapping) throws IllegalArgumentException
   {
-    PDBChain chain = pdb.findChain(chainId);
-    if (chain == null || mapping == null)
-    {
-      throw new IllegalArgumentException(
-              "Chain id or mapping must not be null.");
-    }
-    for (int[] map : mapping.values())
+    try
     {
-      if (map[PDB_RES_POS] != UNASSIGNED)
+      PDBChain chain = pdb.findChain(chainId);
+
+      if (chain == null || mapping == null)
+      {
+        throw new IllegalArgumentException(
+                "Chain id or mapping must not be null.");
+      }
+      for (int[] map : mapping.values())
       {
-        map[PDB_ATOM_POS] = getAtomIndex(map[PDB_RES_POS], chain.atoms);
+        if (map[PDB_RES_POS] != UNASSIGNED)
+        {
+          map[PDB_ATOM_POS] = getAtomIndex(map[PDB_RES_POS], chain.atoms);
+        }
       }
+    } catch (Exception e)
+    {
+      e.printStackTrace();
     }
   }
 
@@ -763,8 +772,8 @@ public class SiftsClient implements SiftsClientI
     Arrays.sort(keys);
     int firstIndex = keys[0];
     int lastIndex = keys[keys.length - 1];
-    System.out.println("Min value " + firstIndex);
-    System.out.println("Max value " + lastIndex);
+    // System.out.println("Min value " + firstIndex);
+    // System.out.println("Max value " + lastIndex);
     for (int x = firstIndex; x <= lastIndex; x++)
     {
       if (!resNumMap.containsKey(x) && !omitNonObserved.contains(x))
@@ -853,8 +862,8 @@ public class SiftsClient implements SiftsClientI
       ++count;
     }
     Arrays.sort(sPojo, Collections.reverseOrder());
-    System.out.println("highest matched entity : " + sPojo[0].entityId);
-    System.out.println("highest matched pid : " + sPojo[0].pid);
+    // System.out.println("highest matched entity : " + sPojo[0].entityId);
+    // System.out.println("highest matched pid : " + sPojo[0].pid);
 
     if (sPojo[0].entityId != null)
     {
@@ -927,7 +936,8 @@ public class SiftsClient implements SiftsClientI
     // output mappings
     StringBuffer output = new StringBuffer();
     output.append(NEWLINE);
-    output.append("Sequence âŸ· Structure mapping details").append(NEWLINE);
+    output.append("Sequence \u27f7 Structure mapping details").append(
+            NEWLINE);
     output.append("Method: SIFTS");
     output.append(NEWLINE).append(NEWLINE);
 
diff --git a/src/jalview/ws/uimodel/PDBRestResponse.java b/src/jalview/ws/uimodel/PDBRestResponse.java
deleted file mode 100644 (file)
index bbd5e84..0000000
+++ /dev/null
@@ -1,223 +0,0 @@
-/*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2)
- * Copyright (C) 2014 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 <http://www.gnu.org/licenses/>.
- * The Jalview Authors are detailed in the 'AUTHORS' file.
- */
-
-package jalview.ws.uimodel;
-
-import jalview.datamodel.SequenceI;
-import jalview.ws.dbsources.PDBRestClient.PDBDocField;
-
-import java.util.Collection;
-import java.util.Objects;
-
-import javax.swing.table.DefaultTableModel;
-
-import org.json.simple.JSONObject;
-
-/**
- * Represents the response model produced by the PDBRestClient upon successful
- * execution of a given request
- * 
- * @author tcnofoegbu
- *
- */
-public class PDBRestResponse
-{
-  private int numberOfItemsFound;
-
-  private String responseTime;
-
-  private Collection<PDBResponseSummary> searchSummary;
-
-  public int getNumberOfItemsFound()
-  {
-    return numberOfItemsFound;
-  }
-
-  public void setNumberOfItemsFound(int itemFound)
-  {
-    this.numberOfItemsFound = itemFound;
-  }
-
-  public String getResponseTime()
-  {
-    return responseTime;
-  }
-
-  public void setResponseTime(String responseTime)
-  {
-    this.responseTime = responseTime;
-  }
-
-  public Collection<PDBResponseSummary> getSearchSummary()
-  {
-    return searchSummary;
-  }
-
-  public void setSearchSummary(Collection<PDBResponseSummary> searchSummary)
-  {
-    this.searchSummary = searchSummary;
-  }
-
-  /**
-   * Convenience method to obtain a Table model for a given summary List based
-   * on the request parameters
-   * 
-   * @param request
-   *          the PDBRestRequest object which holds useful information for
-   *          creating a table model
-   * @param summariesList
-   *          the summary list which contains the data for populating the
-   *          table's rows
-   * @return the table model which was dynamically generated
-   */
-  public static DefaultTableModel getTableModel(PDBRestRequest request,
-          Collection<PDBResponseSummary> summariesList)
-  {
-    DefaultTableModel tableModel = new DefaultTableModel()
-    {
-      @Override
-      public boolean isCellEditable(int row, int column)
-      {
-        return false;
-      }
-    };
-    if (request.getAssociatedSequence() != null)
-    {
-      tableModel.addColumn("Ref Sequence"); // Create sequence column header if
-      // exists in the request
-    }
-    for (PDBDocField field : request.getWantedFields())
-    {
-      tableModel.addColumn(field.getName()); // Create sequence column header if
-                                             // exists in the request
-    }
-
-    for (PDBResponseSummary res : summariesList)
-    {
-      tableModel.addRow(res.getSummaryData()); // Populate table rows with
-                                               // summary list
-    }
-
-    return tableModel;
-  }
-
-  /**
-   * Model for a unique response summary
-   * 
-   */
-  public class PDBResponseSummary
-  {
-    private String pdbId;
-
-    private Object[] summaryRowData;
-
-    private SequenceI associatedSequence;
-
-    public PDBResponseSummary(JSONObject pdbJsonDoc, PDBRestRequest request)
-    {
-      Collection<PDBDocField> diplayFields = request.getWantedFields();
-      SequenceI associatedSeq = request.getAssociatedSequence();
-      int colCounter = 0;
-      summaryRowData = new Object[(associatedSeq != null) ? diplayFields
-              .size() + 1 : diplayFields.size()];
-      if (associatedSeq != null)
-      {
-        this.associatedSequence = associatedSeq;
-        summaryRowData[0] = associatedSequence;
-        colCounter = 1;
-      }
-
-      for (PDBDocField field : diplayFields)
-      {
-        String fieldData = (pdbJsonDoc.get(field.getCode()) == null) ? ""
-                : pdbJsonDoc.get(field.getCode()).toString();
-        if (field.equals(PDBDocField.PDB_ID))
-        {
-          this.pdbId = fieldData;
-          summaryRowData[colCounter++] = this.pdbId;
-        }
-        else
-        {
-          summaryRowData[colCounter++] = fieldData;
-        }
-      }
-    }
-
-    public String getPdbId()
-    {
-      return pdbId;
-    }
-
-    public void setPdbId(String pdbId)
-    {
-      this.pdbId = pdbId;
-    }
-
-    public Object[] getSummaryData()
-    {
-      return summaryRowData;
-    }
-
-    public void setSummaryData(String[] summaryData)
-    {
-      this.summaryRowData = summaryData;
-    }
-
-    /**
-     * Returns a string representation of this object;
-     */
-    @Override
-    public String toString()
-    {
-      StringBuilder summaryFieldValues = new StringBuilder();
-      for (Object summaryField : summaryRowData)
-      {
-        summaryFieldValues.append(summaryField.toString()).append("\t");
-      }
-      return summaryFieldValues.toString();
-    }
-
-    /**
-     * Returns hash code value for this object
-     */
-    @Override
-    public int hashCode()
-    {
-      return Objects.hash(this.pdbId, this.toString());
-    }
-
-    /**
-     * Indicates whether some object is equal to this one
-     */
-    @Override
-    public boolean equals(Object that)
-    {
-      if (!(that instanceof PDBResponseSummary))
-      {
-        return false;
-      }
-      PDBResponseSummary another = (PDBResponseSummary) that;
-      return this.toString().equals(another.toString());
-    }
-
-  }
-
-}
index 9255e5a..ff745ac 100644 (file)
@@ -32,6 +32,7 @@ import jalview.datamodel.SequenceFeature;
 import jalview.datamodel.SequenceI;
 import jalview.schemes.ColourSchemeI;
 import jalview.schemes.TaylorColourScheme;
+import jalview.structure.StructureViewSettings;
 
 import java.awt.Color;
 import java.util.Vector;
@@ -55,6 +56,7 @@ public class PDBChainTest
   public void setUp()
   {
     System.out.println("setup");
+    StructureViewSettings.setShowSeqFeatures(true);
     c = new PDBChain("1GAQ", "A");
   }
 
index 82f5c83..a6a1de4 100644 (file)
@@ -72,17 +72,19 @@ public class PDBfileTest
     PDBfile pf = new PDBfile(false, false, false, "examples/3W5V.pdb",
             AppletFormatAdapter.FILE);
 
-    assertEquals("3W5V", pf.id);
+    assertEquals("3W5V", pf.getId());
     // verify no alignment annotations created
     assertNull(getAlignmentAnnotations(pf));
 
-    assertEquals(4, pf.chains.size());
-    assertEquals("A", pf.chains.get(0).id);
-    assertEquals("B", pf.chains.get(1).id);
-    assertEquals("C", pf.chains.get(2).id);
-    assertEquals("D", pf.chains.get(3).id);
+    assertEquals(4, pf.getChains().size());
+    assertEquals("A", pf.getChains().get(0).id);
+    assertEquals("B", pf.getChains().get(1).id);
+    assertEquals("C", pf.getChains().get(2).id);
+    assertEquals("D", pf.getChains().get(3).id);
+
+    PDBChain chainA = pf.getChains().get(0);
+    SequenceI seqA = pf.getSeqs().get(0);
 
-    PDBChain chainA = pf.chains.get(0);
     assertEquals(0, chainA.seqstart); // not set
     assertEquals(0, chainA.seqend); // not set
     assertEquals(18, chainA.sequence.getStart());
@@ -91,27 +93,27 @@ public class PDBfileTest
     assertTrue(chainA.sequence.getSequenceAsString().endsWith("WNVEVY"));
     assertEquals("3W5V|A", chainA.sequence.getName());
     assertNull(chainA.sequence.getAnnotation());
-    assertEquals(1, chainA.sequence.getAllPDBEntries().size());
-    PDBEntry pdb = chainA.sequence.getAllPDBEntries().get(0);
+    assertEquals(1, seqA.getAllPDBEntries().size());
+    PDBEntry pdb = seqA.getAllPDBEntries().get(0);
     assertEquals("A", pdb.getChainCode());
     assertEquals("PDB", pdb.getType());
     assertEquals("3W5V", pdb.getId());
 
-    PDBChain chainB = pf.chains.get(1);
+    PDBChain chainB = pf.getChains().get(1);
     assertEquals(1, chainB.sequence.getStart());
     assertEquals(96, chainB.sequence.getEnd());
     assertTrue(chainB.sequence.getSequenceAsString().startsWith("ATYNVK"));
     assertTrue(chainB.sequence.getSequenceAsString().endsWith("KEEELT"));
     assertEquals("3W5V|B", chainB.sequence.getName());
 
-    PDBChain chainC = pf.chains.get(2);
+    PDBChain chainC = pf.getChains().get(2);
     assertEquals(18, chainC.sequence.getStart());
     assertEquals(314, chainC.sequence.getEnd());
     assertTrue(chainC.sequence.getSequenceAsString().startsWith("KCSKKQEE"));
     assertTrue(chainC.sequence.getSequenceAsString().endsWith("WNVEVY"));
     assertEquals("3W5V|C", chainC.sequence.getName());
 
-    PDBChain chainD = pf.chains.get(3);
+    PDBChain chainD = pf.getChains().get(3);
     assertEquals(1, chainD.sequence.getStart());
     assertEquals(96, chainD.sequence.getEnd());
     assertTrue(chainD.sequence.getSequenceAsString().startsWith("ATYNVK"));
@@ -215,7 +217,7 @@ public class PDBfileTest
      * no sequence annotations created - tempFactor annotation is not added
      * unless the flag to 'addAlignmentAnnotations' is set true
      */
-    for (PDBChain c : pf.chains)
+    for (PDBChain c : pf.getChains())
     {
       assertNull(c.sequence.getAnnotation());
     }
@@ -251,10 +253,10 @@ public class PDBfileTest
     /*
      * PDBFileWithJmol (unlike PDBChain!) leaves PDB id upper case
      */
-    assertEquals("Secondary Structure for 3W5VA", anns[0].description);
-    assertEquals("Secondary Structure for 3W5VB", anns[2].description);
-    assertEquals("Secondary Structure for 3W5VC", anns[4].description);
-    assertEquals("Secondary Structure for 3W5VD", anns[6].description);
+    assertEquals("Secondary Structure for 3w5vA", anns[0].description);
+    assertEquals("Secondary Structure for 3w5vB", anns[2].description);
+    assertEquals("Secondary Structure for 3w5vC", anns[4].description);
+    assertEquals("Secondary Structure for 3w5vD", anns[6].description);
 
     /*
      * Verify SS annotations are linked to respective sequences (chains)
index 74e4940..860d979 100644 (file)
@@ -26,6 +26,7 @@ import static org.testng.AssertJUnit.assertNull;
 import static org.testng.AssertJUnit.assertSame;
 import static org.testng.AssertJUnit.assertTrue;
 
+import jalview.analysis.AlignmentUtils.DnaVariant;
 import jalview.datamodel.AlignedCodonFrame;
 import jalview.datamodel.Alignment;
 import jalview.datamodel.AlignmentAnnotation;
@@ -36,6 +37,7 @@ import jalview.datamodel.Mapping;
 import jalview.datamodel.SearchResults;
 import jalview.datamodel.SearchResults.Match;
 import jalview.datamodel.Sequence;
+import jalview.datamodel.SequenceFeature;
 import jalview.datamodel.SequenceI;
 import jalview.io.AppletFormatAdapter;
 import jalview.io.FormatAdapter;
@@ -45,53 +47,16 @@ import jalview.util.MappingUtils;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
 import java.util.Iterator;
-import java.util.LinkedHashSet;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
+import java.util.TreeMap;
 
 import org.testng.annotations.Test;
 
 public class AlignmentUtilsTests
 {
-  // @formatter:off
-  private static final String TEST_DATA = 
-          "# STOCKHOLM 1.0\n" +
-          "#=GS D.melanogaster.1 AC AY119185.1/838-902\n" +
-          "#=GS D.melanogaster.2 AC AC092237.1/57223-57161\n" +
-          "#=GS D.melanogaster.3 AC AY060611.1/560-627\n" +
-          "D.melanogaster.1          G.AGCC.CU...AUGAUCGA\n" +
-          "#=GR D.melanogaster.1 SS  ................((((\n" +
-          "D.melanogaster.2          C.AUUCAACU.UAUGAGGAU\n" +
-          "#=GR D.melanogaster.2 SS  ................((((\n" +
-          "D.melanogaster.3          G.UGGCGCU..UAUGACGCA\n" +
-          "#=GR D.melanogaster.3 SS  (.(((...(....(((((((\n" +
-          "//";
-
-  private static final String AA_SEQS_1 = 
-          ">Seq1Name\n" +
-          "K-QY--L\n" +
-          ">Seq2Name\n" +
-          "-R-FP-W-\n";
-
-  private static final String CDNA_SEQS_1 = 
-          ">Seq1Name\n" +
-          "AC-GG--CUC-CAA-CT\n" +
-          ">Seq2Name\n" +
-          "-CG-TTA--ACG---AAGT\n";
-
-  private static final String CDNA_SEQS_2 = 
-          ">Seq1Name\n" +
-          "GCTCGUCGTACT\n" +
-          ">Seq2Name\n" +
-          "GGGTCAGGCAGT\n";
-  // @formatter:on
-
-  // public static Sequence ts=new
-  // Sequence("short","ASDASDASDASDASDASDASDASDASDASDASDASDASD");
   public static Sequence ts = new Sequence("short",
           "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklm");
 
@@ -372,8 +337,8 @@ public class AlignmentUtilsTests
      * region). The leading gap, and the gaps between codons, are subsumed by
      * the protein alignment gap.
      */
-    checkAlignSequenceAs("-G-GG--AA-A-", "-A-L-", true, true, map,
-            "---G-GG---AA-A-");
+    checkAlignSequenceAs("-G-GG--AA-A---", "-A-L-", true, true, map,
+            "---G-GG---AA-A---");
 
     /*
      * Include only unmapped gaps in dna when realigning (outside the exon
@@ -381,7 +346,7 @@ public class AlignmentUtilsTests
      * the protein alignment gap.
      */
     checkAlignSequenceAs("-G-GG--AA-A-", "-A-L-", false, true, map,
-            "---GGG---AAA-");
+            "---GGG---AAA---");
   }
 
   /**
@@ -439,7 +404,6 @@ public class AlignmentUtilsTests
   @Test(groups = { "Functional" })
   public void testAlignSequenceAs_withMapping_withUnmappedProtein()
   {
-
     /*
      * Exons at codon 2 (AAA) and 4 (TTT) mapped to A and P
      */
@@ -447,38 +411,39 @@ public class AlignmentUtilsTests
         1, 1, 3, 3 }, 3, 1);
 
     /*
-     * Expect alignment does nothing (aborts realignment). Change this test
-     * first if different behaviour wanted.
+     * -L- 'aligns' ccc------
      */
-    checkAlignSequenceAs("GGGAAACCCTTTGGG", "-A-L-P-", false, false, map,
-            "GGGAAACCCTTTGGG");
+    checkAlignSequenceAs("gggAAAcccTTTggg", "-A-L-P-", false, false, map,
+            "gggAAAccc------TTTggg");
   }
 
   /**
    * Helper method that performs and verifies the method under test.
    * 
-   * @param dnaSeq
-   * @param proteinSeq
+   * @param alignee
+   *          the sequence to be realigned
+   * @param alignModel
+   *          the sequence whose alignment is to be copied
    * @param preserveMappedGaps
    * @param preserveUnmappedGaps
    * @param map
    * @param expected
    */
-  protected void checkAlignSequenceAs(final String dnaSeq,
-          final String proteinSeq, final boolean preserveMappedGaps,
+  protected void checkAlignSequenceAs(final String alignee,
+          final String alignModel, final boolean preserveMappedGaps,
           final boolean preserveUnmappedGaps, MapList map,
           final String expected)
   {
-    SequenceI dna = new Sequence("Seq1", dnaSeq);
-    dna.createDatasetSequence();
-    SequenceI protein = new Sequence("Seq1", proteinSeq);
-    protein.createDatasetSequence();
+    SequenceI alignMe = new Sequence("Seq1", alignee);
+    alignMe.createDatasetSequence();
+    SequenceI alignFrom = new Sequence("Seq2", alignModel);
+    alignFrom.createDatasetSequence();
     AlignedCodonFrame acf = new AlignedCodonFrame();
-    acf.addMap(dna.getDatasetSequence(), protein.getDatasetSequence(), map);
+    acf.addMap(alignMe.getDatasetSequence(), alignFrom.getDatasetSequence(), map);
 
-    AlignmentUtils.alignSequenceAs(dna, protein, acf, "---", '-',
+    AlignmentUtils.alignSequenceAs(alignMe, alignFrom, acf, "---", '-',
             preserveMappedGaps, preserveUnmappedGaps);
-    assertEquals(expected, dna.getSequenceAsString());
+    assertEquals(expected, alignMe.getSequenceAsString());
   }
 
   /**
@@ -498,30 +463,6 @@ public class AlignmentUtilsTests
   }
 
   /**
-   * Test for the method that generates an aligned translated sequence from one
-   * mapping.
-   */
-  @Test(groups = { "Functional" })
-  public void testGetAlignedTranslation_dnaLikeProtein()
-  {
-    // dna alignment will be replaced
-    SequenceI dna = new Sequence("Seq1", "T-G-CC-A--T-TAC-CAG-");
-    dna.createDatasetSequence();
-    // protein alignment will be 'applied' to dna
-    SequenceI protein = new Sequence("Seq1", "-CH-Y--Q-");
-    protein.createDatasetSequence();
-    MapList map = new MapList(new int[] { 1, 12 }, new int[] { 1, 4 }, 3, 1);
-    AlignedCodonFrame acf = new AlignedCodonFrame();
-    acf.addMap(dna.getDatasetSequence(), protein.getDatasetSequence(), map);
-
-    final SequenceI aligned = AlignmentUtils.getAlignedTranslation(protein,
-            '-', acf);
-    assertEquals("---TGCCAT---TAC------CAG---",
-            aligned.getSequenceAsString());
-    assertSame(aligned.getDatasetSequence(), dna.getDatasetSequence());
-  }
-
-  /**
    * Test the method that realigns protein to match mapped codon alignment.
    */
   @Test(groups = { "Functional" })
@@ -550,7 +491,9 @@ public class AlignmentUtilsTests
     acf.addMap(dna1.getDatasetSequence(), prot1.getDatasetSequence(), map);
     acf.addMap(dna2.getDatasetSequence(), prot2.getDatasetSequence(), map);
     acf.addMap(dna3.getDatasetSequence(), prot3.getDatasetSequence(), map);
-    protein.setCodonFrames(Collections.singleton(acf));
+    ArrayList<AlignedCodonFrame> acfs = new ArrayList<AlignedCodonFrame>();
+    acfs.add(acf);
+    protein.setCodonFrames(acfs);
 
     /*
      * Translated codon order is [1,2,3] [1,3,4] [4,5,6] [4,5,7] [5,6,7] [7,8,9]
@@ -570,9 +513,15 @@ public class AlignmentUtilsTests
   @Test(groups = { "Functional" })
   public void testTranslatesAs()
   {
+    // null arguments check
+    assertFalse(AlignmentUtils.translatesAs(null, 0, null));
+    assertFalse(AlignmentUtils.translatesAs(new char[] { 't' }, 0, null));
+    assertFalse(AlignmentUtils.translatesAs(null, 0, new char[] { 'a' }));
+
+    // straight translation
     assertTrue(AlignmentUtils.translatesAs("tttcccaaaggg".toCharArray(), 0,
             "FPKG".toCharArray()));
-    // with start codon (not in protein)
+    // with extra start codon (not in protein)
     assertTrue(AlignmentUtils.translatesAs("atgtttcccaaaggg".toCharArray(),
             3, "FPKG".toCharArray()));
     // with stop codon1 (not in protein)
@@ -600,7 +549,7 @@ public class AlignmentUtilsTests
     assertTrue(AlignmentUtils.translatesAs(
             "atgtttcccaaagggtga".toCharArray(), 3, "FPKG".toCharArray()));
 
-    // with embedded stop codon
+    // with embedded stop codons
     assertTrue(AlignmentUtils.translatesAs(
             "atgtttTAGcccaaaTAAgggtga".toCharArray(), 3,
             "F*PK*G".toCharArray()));
@@ -608,6 +557,26 @@ public class AlignmentUtilsTests
     // wrong protein
     assertFalse(AlignmentUtils.translatesAs("tttcccaaaggg".toCharArray(),
             0, "FPMG".toCharArray()));
+
+    // truncated dna
+    assertFalse(AlignmentUtils.translatesAs("tttcccaaagg".toCharArray(), 0,
+            "FPKG".toCharArray()));
+
+    // truncated protein
+    assertFalse(AlignmentUtils.translatesAs("tttcccaaaggg".toCharArray(),
+            0, "FPK".toCharArray()));
+
+    // overlong dna (doesn't end in stop codon)
+    assertFalse(AlignmentUtils.translatesAs(
+            "tttcccaaagggttt".toCharArray(), 0, "FPKG".toCharArray()));
+
+    // dna + stop codon + more
+    assertFalse(AlignmentUtils.translatesAs(
+            "tttcccaaagggttaga".toCharArray(), 0, "FPKG".toCharArray()));
+
+    // overlong protein
+    assertFalse(AlignmentUtils.translatesAs("tttcccaaaggg".toCharArray(),
+            0, "FPKGQ".toCharArray()));
   }
 
   /**
@@ -1000,10 +969,10 @@ public class AlignmentUtilsTests
   }
 
   /**
-   * Test the method that extracts the exon-only part of a dna alignment.
+   * Test the method that extracts the cds-only part of a dna alignment.
    */
   @Test(groups = { "Functional" })
-  public void testMakeExonAlignment()
+  public void testMakeCdsAlignment()
   {
     SequenceI dna1 = new Sequence("dna1", "aaaGGGcccTTTaaa");
     SequenceI dna2 = new Sequence("dna2", "GGGcccTTTaaaCCC");
@@ -1013,8 +982,20 @@ public class AlignmentUtilsTests
     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);
 
-    Set<AlignedCodonFrame> mappings = new HashSet<AlignedCodonFrame>();
+    List<AlignedCodonFrame> mappings = new ArrayList<AlignedCodonFrame>();
     MapList map = new MapList(new int[] { 4, 6, 10, 12 },
             new int[] { 1, 2 }, 3, 1);
     AlignedCodonFrame acf = new AlignedCodonFrame();
@@ -1026,35 +1007,54 @@ public class AlignmentUtilsTests
     acf.addMap(dna2.getDatasetSequence(), pep2.getDatasetSequence(), map);
     mappings.add(acf);
 
-    AlignmentI exons = AlignmentUtils.makeExonAlignment(new SequenceI[] {
-        dna1, dna2 }, mappings);
-    assertEquals(2, exons.getSequences().size());
-    assertEquals("GGGTTT", exons.getSequenceAt(0).getSequenceAsString());
-    assertEquals("GGGTTTCCC", exons.getSequenceAt(1).getSequenceAsString());
+    /*
+     * execute method under test:
+     */
+    AlignmentI cds = AlignmentUtils.makeCdsAlignment(new SequenceI[] {
+        dna1, dna2 }, mappings, dna);
+
+    assertEquals(2, cds.getSequences().size());
+    assertEquals("GGGTTT", cds.getSequenceAt(0)
+            .getSequenceAsString());
+    assertEquals("GGGTTTCCC", cds.getSequenceAt(1)
+            .getSequenceAsString());
 
     /*
-     * Verify updated mappings
+     * verify shared, extended alignment dataset
      */
-    assertEquals(2, mappings.size());
+    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 and cDNA to CDS
+     * the mappings are on the shared alignment dataset
+     */
+    assertSame(dna.getCodonFrames(), cds.getCodonFrames());
+    List<AlignedCodonFrame> cdsMappings = cds.getCodonFrames();
+    assertEquals(2, cdsMappings.size());
+    
+    /*
      * Mapping from pep1 to GGGTTT in first new exon sequence
      */
     List<AlignedCodonFrame> pep1Mapping = MappingUtils
-            .findMappingsForSequence(pep1, mappings);
+            .findMappingsForSequence(pep1, cdsMappings);
     assertEquals(1, pep1Mapping.size());
     // map G to GGG
-    SearchResults sr = MappingUtils.buildSearchResults(pep1, 1, mappings);
+    SearchResults sr = MappingUtils
+            .buildSearchResults(pep1, 1, cdsMappings);
     assertEquals(1, sr.getResults().size());
     Match m = sr.getResults().get(0);
-    assertEquals(exons.getSequenceAt(0).getDatasetSequence(),
+    assertSame(cds.getSequenceAt(0).getDatasetSequence(),
             m.getSequence());
     assertEquals(1, m.getStart());
     assertEquals(3, m.getEnd());
     // map F to TTT
-    sr = MappingUtils.buildSearchResults(pep1, 2, mappings);
+    sr = MappingUtils.buildSearchResults(pep1, 2, cdsMappings);
     m = sr.getResults().get(0);
-    assertEquals(exons.getSequenceAt(0).getDatasetSequence(),
+    assertSame(cds.getSequenceAt(0).getDatasetSequence(),
             m.getSequence());
     assertEquals(4, m.getStart());
     assertEquals(6, m.getEnd());
@@ -1063,81 +1063,39 @@ public class AlignmentUtilsTests
      * Mapping from pep2 to GGGTTTCCC in second new exon sequence
      */
     List<AlignedCodonFrame> pep2Mapping = MappingUtils
-            .findMappingsForSequence(pep2, mappings);
+            .findMappingsForSequence(pep2, cdsMappings);
     assertEquals(1, pep2Mapping.size());
     // map G to GGG
-    sr = MappingUtils.buildSearchResults(pep2, 1, mappings);
+    sr = MappingUtils.buildSearchResults(pep2, 1, cdsMappings);
     assertEquals(1, sr.getResults().size());
     m = sr.getResults().get(0);
-    assertEquals(exons.getSequenceAt(1).getDatasetSequence(),
+    assertSame(cds.getSequenceAt(1).getDatasetSequence(),
             m.getSequence());
     assertEquals(1, m.getStart());
     assertEquals(3, m.getEnd());
     // map F to TTT
-    sr = MappingUtils.buildSearchResults(pep2, 2, mappings);
+    sr = MappingUtils.buildSearchResults(pep2, 2, cdsMappings);
     m = sr.getResults().get(0);
-    assertEquals(exons.getSequenceAt(1).getDatasetSequence(),
+    assertSame(cds.getSequenceAt(1).getDatasetSequence(),
             m.getSequence());
     assertEquals(4, m.getStart());
     assertEquals(6, m.getEnd());
     // map P to CCC
-    sr = MappingUtils.buildSearchResults(pep2, 3, mappings);
+    sr = MappingUtils.buildSearchResults(pep2, 3, cdsMappings);
     m = sr.getResults().get(0);
-    assertEquals(exons.getSequenceAt(1).getDatasetSequence(),
+    assertSame(cds.getSequenceAt(1).getDatasetSequence(),
             m.getSequence());
     assertEquals(7, m.getStart());
     assertEquals(9, m.getEnd());
   }
 
   /**
-   * Test the method that makes an exon-only sequence from a DNA sequence and
-   * its product mapping. Test includes the expected case that the DNA sequence
-   * already has a protein product (Uniprot translation) which in turn has an
-   * x-ref to the EMBLCDS record.
+   * Test the method that makes a cds-only alignment from a DNA sequence and its
+   * product mappings, for the case where there are multiple exon mappings to
+   * different protein products.
    */
   @Test(groups = { "Functional" })
-  public void testMakeExonSequences()
-  {
-    SequenceI dna1 = new Sequence("dna1", "aaaGGGcccTTTaaa");
-    SequenceI pep1 = new Sequence("pep1", "GF");
-    dna1.createDatasetSequence();
-    pep1.createDatasetSequence();
-    pep1.getDatasetSequence().addDBRef(
-            new DBRefEntry("EMBLCDS", "2", "A12345"));
-
-    /*
-     * Make the mapping from dna to protein. The protein sequence has a DBRef to
-     * EMBLCDS|A12345.
-     */
-    Set<AlignedCodonFrame> mappings = new HashSet<AlignedCodonFrame>();
-    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);
-
-    AlignedCodonFrame newMapping = new AlignedCodonFrame();
-    List<SequenceI> exons = AlignmentUtils.makeExonSequences(dna1, acf,
-            newMapping);
-    assertEquals(1, exons.size());
-    SequenceI exon = exons.get(0);
-
-    assertEquals("GGGTTT", exon.getSequenceAsString());
-    assertEquals("dna1|A12345", exon.getName());
-    assertEquals(1, exon.getDBRefs().length);
-    DBRefEntry cdsRef = exon.getDBRefs()[0];
-    assertEquals("EMBLCDS", cdsRef.getSource());
-    assertEquals("2", cdsRef.getVersion());
-    assertEquals("A12345", cdsRef.getAccessionId());
-  }
-
-  /**
-   * Test the method that makes an exon-only alignment from a DNA sequence and
-   * its product mappings, for the case where there are multiple exon mappings
-   * to different protein products.
-   */
-  @Test(groups = { "Functional" })
-  public void testMakeExonAlignment_multipleProteins()
+  public void testMakeCdsAlignment_multipleProteins()
   {
     SequenceI dna1 = new Sequence("dna1", "aaaGGGcccTTTaaa");
     SequenceI pep1 = new Sequence("pep1", "GF"); // GGGTTT
@@ -1147,6 +1105,18 @@ 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(
@@ -1155,11 +1125,9 @@ public class AlignmentUtilsTests
             new DBRefEntry("EMBLCDS", "4", "A12347"));
 
     /*
-     * Make the mappings from dna to protein. Using LinkedHashset is a
-     * convenience so results are in the input order. There is no assertion that
-     * the generated exon sequences are in any particular order.
+     * Make the mappings from dna to protein
      */
-    Set<AlignedCodonFrame> mappings = new LinkedHashSet<AlignedCodonFrame>();
+    List<AlignedCodonFrame> mappings = new ArrayList<AlignedCodonFrame>();
     // map ...GGG...TTT to GF
     MapList map = new MapList(new int[] { 4, 6, 10, 12 },
             new int[] { 1, 2 }, 3, 1);
@@ -1180,85 +1148,105 @@ public class AlignmentUtilsTests
     mappings.add(acf);
 
     /*
-     * Create the Exon alignment; also replaces the dna-to-protein mappings with
+     * Create the CDS alignment; also augments the dna-to-protein mappings with
      * exon-to-protein and exon-to-dna mappings
      */
-    AlignmentI exal = AlignmentUtils.makeExonAlignment(
-            new SequenceI[] { dna1 }, mappings);
+    AlignmentI dna = new Alignment(new SequenceI[] { dna1 });
+    dna.setDataset(null);
 
     /*
-     * Verify we have 3 exon sequences, mapped to pep1/2/3 respectively
+     * execute method under test
      */
-    List<SequenceI> exons = exal.getSequences();
-    assertEquals(3, exons.size());
+    AlignmentI cdsal = AlignmentUtils.makeCdsAlignment(
+            new SequenceI[] { dna1 }, mappings, dna);
 
-    SequenceI exon = exons.get(0);
-    assertEquals("GGGTTT", exon.getSequenceAsString());
-    assertEquals("dna1|A12345", exon.getName());
-    assertEquals(1, exon.getDBRefs().length);
-    DBRefEntry cdsRef = exon.getDBRefs()[0];
-    assertEquals("EMBLCDS", cdsRef.getSource());
-    assertEquals("2", cdsRef.getVersion());
-    assertEquals("A12345", cdsRef.getAccessionId());
+    /*
+     * Verify we have 3 cds sequences, mapped to pep1/2/3 respectively
+     */
+    List<SequenceI> cds = cdsal.getSequences();
+    assertEquals(3, cds.size());
 
-    exon = exons.get(1);
-    assertEquals("aaaccc", exon.getSequenceAsString());
-    assertEquals("dna1|A12346", exon.getName());
-    assertEquals(1, exon.getDBRefs().length);
-    cdsRef = exon.getDBRefs()[0];
-    assertEquals("EMBLCDS", cdsRef.getSource());
-    assertEquals("3", cdsRef.getVersion());
-    assertEquals("A12346", cdsRef.getAccessionId());
+    /*
+     * verify shared, extended alignment dataset
+     */
+    assertSame(cdsal.getDataset(), dna.getDataset());
+    assertTrue(dna.getDataset().getSequences()
+            .contains(cds.get(0).getDatasetSequence()));
+    assertTrue(dna.getDataset().getSequences()
+            .contains(cds.get(1).getDatasetSequence()));
+    assertTrue(dna.getDataset().getSequences()
+            .contains(cds.get(2).getDatasetSequence()));
 
-    exon = exons.get(2);
-    assertEquals("aaaTTT", exon.getSequenceAsString());
-    assertEquals("dna1|A12347", exon.getName());
-    assertEquals(1, exon.getDBRefs().length);
-    cdsRef = exon.getDBRefs()[0];
-    assertEquals("EMBLCDS", cdsRef.getSource());
-    assertEquals("4", cdsRef.getVersion());
-    assertEquals("A12347", cdsRef.getAccessionId());
+    /*
+     * verify aligned cds sequences and their xrefs
+     */
+    SequenceI cdsSeq = cds.get(0);
+    assertEquals("GGGTTT", cdsSeq.getSequenceAsString());
+    // assertEquals("dna1|A12345", cdsSeq.getName());
+    assertEquals("dna1|pep1", cdsSeq.getName());
+    // assertEquals(1, cdsSeq.getDBRefs().length);
+    // DBRefEntry cdsRef = cdsSeq.getDBRefs()[0];
+    // assertEquals("EMBLCDS", cdsRef.getSource());
+    // assertEquals("2", cdsRef.getVersion());
+    // assertEquals("A12345", cdsRef.getAccessionId());
+
+    cdsSeq = cds.get(1);
+    assertEquals("aaaccc", cdsSeq.getSequenceAsString());
+    // assertEquals("dna1|A12346", cdsSeq.getName());
+    assertEquals("dna1|pep2", cdsSeq.getName());
+    // assertEquals(1, cdsSeq.getDBRefs().length);
+    // cdsRef = cdsSeq.getDBRefs()[0];
+    // assertEquals("EMBLCDS", cdsRef.getSource());
+    // assertEquals("3", cdsRef.getVersion());
+    // assertEquals("A12346", cdsRef.getAccessionId());
+
+    cdsSeq = cds.get(2);
+    assertEquals("aaaTTT", cdsSeq.getSequenceAsString());
+    // assertEquals("dna1|A12347", cdsSeq.getName());
+    assertEquals("dna1|pep3", cdsSeq.getName());
+    // assertEquals(1, cdsSeq.getDBRefs().length);
+    // cdsRef = cdsSeq.getDBRefs()[0];
+    // assertEquals("EMBLCDS", cdsRef.getSource());
+    // assertEquals("4", cdsRef.getVersion());
+    // assertEquals("A12347", cdsRef.getAccessionId());
 
     /*
-     * Verify there are mappings from each exon sequence to its protein product
+     * Verify there are mappings from each cds sequence to its protein product
      * and also to its dna source
      */
-    Iterator<AlignedCodonFrame> newMappingsIterator = mappings.iterator();
+    Iterator<AlignedCodonFrame> newMappingsIterator = cdsal
+            .getCodonFrames().iterator();
 
     // mappings for dna1 - exon1 - pep1
-    AlignedCodonFrame exonMapping = newMappingsIterator.next();
-    List<Mapping> dnaMappings = exonMapping.getMappingsForSequence(dna1);
-    assertEquals(1, dnaMappings.size());
-    assertSame(exons.get(0).getDatasetSequence(), dnaMappings.get(0)
+    AlignedCodonFrame cdsMapping = newMappingsIterator.next();
+    List<Mapping> 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<Mapping> peptideMappings = exonMapping
-            .getMappingsForSequence(pep1);
+    List<Mapping> peptideMappings = cdsMapping.getMappingsFromSequence(cds
+            .get(0).getDatasetSequence());
     assertEquals(1, peptideMappings.size());
     assertSame(pep1.getDatasetSequence(), peptideMappings.get(0).getTo());
 
-    // mappings for dna1 - exon2 - pep2
-    exonMapping = newMappingsIterator.next();
-    dnaMappings = exonMapping.getMappingsForSequence(dna1);
-    assertEquals(1, dnaMappings.size());
-    assertSame(exons.get(1).getDatasetSequence(), dnaMappings.get(0)
+    // 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(0).getMap().getToPosition(4));
-    peptideMappings = exonMapping.getMappingsForSequence(pep2);
+            .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 - exon3 - pep3
-    exonMapping = newMappingsIterator.next();
-    dnaMappings = exonMapping.getMappingsForSequence(dna1);
-    assertEquals(1, dnaMappings.size());
-    assertSame(exons.get(2).getDatasetSequence(), dnaMappings.get(0)
+    // mappings for dna1 - cds3 - pep3
+    assertSame(cds.get(2).getDatasetSequence(), dnaMappings.get(2)
             .getTo());
     assertEquals("T(4) in CDS should map to T(10) in DNA", 10, dnaMappings
-            .get(0).getMap().getToPosition(4));
-    peptideMappings = exonMapping.getMappingsForSequence(pep3);
+            .get(2).getMap().getToPosition(4));
+    peptideMappings = cdsMapping.getMappingsFromSequence(cds.get(2)
+            .getDatasetSequence());
     assertEquals(1, peptideMappings.size());
     assertSame(pep3.getDatasetSequence(), peptideMappings.get(0).getTo());
   }
@@ -1288,7 +1276,7 @@ public class AlignmentUtilsTests
    * @throws IOException
    */
   @Test(groups = { "Functional" })
-  public void testMapProteinSequenceToCdna_forSubsequence()
+  public void testMapCdnaToProtein_forSubsequence()
           throws IOException
   {
     SequenceI prot = new Sequence("UNIPROT|V12345", "E-I--Q", 10, 12);
@@ -1297,10 +1285,907 @@ public class AlignmentUtilsTests
     SequenceI dna = new Sequence("EMBL|A33333", "GAA--AT-C-CAG", 40, 48);
     dna.createDatasetSequence();
 
-    MapList map = AlignmentUtils.mapProteinSequenceToCdna(prot, dna);
+    MapList map = AlignmentUtils.mapCdnaToProtein(prot, dna);
     assertEquals(10, map.getToLowest());
     assertEquals(12, map.getToHighest());
     assertEquals(40, map.getFromLowest());
     assertEquals(48, map.getFromHighest());
   }
+
+  /**
+   * Test for the alignSequenceAs method where we have protein mapped to protein
+   */
+  @Test(groups = { "Functional" })
+  public void testAlignSequenceAs_mappedProteinProtein()
+  {
+  
+    SequenceI alignMe = new Sequence("Match", "MGAASEV");
+    alignMe.createDatasetSequence();
+    SequenceI alignFrom = new Sequence("Query", "LQTGYMGAASEVMFSPTRR");
+    alignFrom.createDatasetSequence();
+
+    AlignedCodonFrame acf = new AlignedCodonFrame();
+    // this is like a domain or motif match of part of a peptide sequence
+    MapList map = new MapList(new int[] { 6, 12 }, new int[] { 1, 7 }, 1, 1);
+    acf.addMap(alignFrom.getDatasetSequence(),
+            alignMe.getDatasetSequence(), map);
+    
+    AlignmentUtils.alignSequenceAs(alignMe, alignFrom, acf, "-", '-', true,
+            true);
+    assertEquals("-----MGAASEV-------", alignMe.getSequenceAsString());
+  }
+
+  /**
+   * Test for the alignSequenceAs method where there are trailing unmapped
+   * residues in the model sequence
+   */
+  @Test(groups = { "Functional" })
+  public void testAlignSequenceAs_withTrailingPeptide()
+  {
+    // map first 3 codons to KPF; G is a trailing unmapped residue
+    MapList map = new MapList(new int[] { 1, 9 }, new int[] { 1, 3 }, 3, 1);
+  
+    checkAlignSequenceAs("AAACCCTTT", "K-PFG", true, true, map,
+            "AAA---CCCTTT---");
+  }
+
+  /**
+   * Tests for transferring features between mapped sequences
+   */
+  @Test(groups = { "Functional" })
+  public void testTransferFeatures()
+  {
+    SequenceI dna = new Sequence("dna/20-34", "acgTAGcaaGCCcgt");
+    SequenceI cds = new Sequence("cds/10-15", "TAGGCC");
+
+    // no overlap
+    dna.addSequenceFeature(new SequenceFeature("type1", "desc1", 1, 2, 1f,
+            null));
+    // partial overlap - to [1, 1]
+    dna.addSequenceFeature(new SequenceFeature("type2", "desc2", 3, 4, 2f,
+            null));
+    // exact overlap - to [1, 3]
+    dna.addSequenceFeature(new SequenceFeature("type3", "desc3", 4, 6, 3f,
+            null));
+    // spanning overlap - to [2, 5]
+    dna.addSequenceFeature(new SequenceFeature("type4", "desc4", 5, 11, 4f,
+            null));
+    // exactly overlaps whole mapped range [1, 6]
+    dna.addSequenceFeature(new SequenceFeature("type5", "desc5", 4, 12, 5f,
+            null));
+    // no overlap (internal)
+    dna.addSequenceFeature(new SequenceFeature("type6", "desc6", 7, 9, 6f,
+            null));
+    // no overlap (3' end)
+    dna.addSequenceFeature(new SequenceFeature("type7", "desc7", 13, 15,
+            7f, null));
+    // overlap (3' end) - to [6, 6]
+    dna.addSequenceFeature(new SequenceFeature("type8", "desc8", 12, 12,
+            8f, null));
+    // extended overlap - to [6, +]
+    dna.addSequenceFeature(new SequenceFeature("type9", "desc9", 12, 13,
+            9f, null));
+
+    MapList map = new MapList(new int[] { 4, 6, 10, 12 },
+            new int[] { 1, 6 }, 1, 1);
+
+    /*
+     * transferFeatures() will build 'partial overlap' for regions
+     * that partially overlap 5' or 3' (start or end) of target sequence
+     */
+    AlignmentUtils.transferFeatures(dna, cds, map, null);
+    SequenceFeature[] sfs = cds.getSequenceFeatures();
+    assertEquals(6, sfs.length);
+
+    SequenceFeature sf = sfs[0];
+    assertEquals("type2", sf.getType());
+    assertEquals("desc2", sf.getDescription());
+    assertEquals(2f, sf.getScore());
+    assertEquals(1, sf.getBegin());
+    assertEquals(1, sf.getEnd());
+
+    sf = sfs[1];
+    assertEquals("type3", sf.getType());
+    assertEquals("desc3", sf.getDescription());
+    assertEquals(3f, sf.getScore());
+    assertEquals(1, sf.getBegin());
+    assertEquals(3, sf.getEnd());
+
+    sf = sfs[2];
+    assertEquals("type4", sf.getType());
+    assertEquals(2, sf.getBegin());
+    assertEquals(5, sf.getEnd());
+
+    sf = sfs[3];
+    assertEquals("type5", sf.getType());
+    assertEquals(1, sf.getBegin());
+    assertEquals(6, sf.getEnd());
+
+    sf = sfs[4];
+    assertEquals("type8", sf.getType());
+    assertEquals(6, sf.getBegin());
+    assertEquals(6, sf.getEnd());
+
+    sf = sfs[5];
+    assertEquals("type9", sf.getType());
+    assertEquals(6, sf.getBegin());
+    assertEquals(6, sf.getEnd());
+  }
+
+  /**
+   * Tests for transferring features between mapped sequences
+   */
+  @Test(groups = { "Functional" })
+  public void testTransferFeatures_withOmit()
+  {
+    SequenceI dna = new Sequence("dna/20-34", "acgTAGcaaGCCcgt");
+    SequenceI cds = new Sequence("cds/10-15", "TAGGCC");
+
+    MapList map = new MapList(new int[] { 4, 6, 10, 12 },
+            new int[] { 1, 6 }, 1, 1);
+  
+    // [5, 11] maps to [2, 5]
+    dna.addSequenceFeature(new SequenceFeature("type4", "desc4", 5, 11, 4f,
+            null));
+    // [4, 12] maps to [1, 6]
+    dna.addSequenceFeature(new SequenceFeature("type5", "desc5", 4, 12, 5f,
+            null));
+    // [12, 12] maps to [6, 6]
+    dna.addSequenceFeature(new SequenceFeature("type8", "desc8", 12, 12,
+            8f, null));
+  
+    // desc4 and desc8 are the 'omit these' varargs
+    AlignmentUtils.transferFeatures(dna, cds, map, null, "type4", "type8");
+    SequenceFeature[] sfs = cds.getSequenceFeatures();
+    assertEquals(1, sfs.length);
+  
+    SequenceFeature sf = sfs[0];
+    assertEquals("type5", sf.getType());
+    assertEquals(1, sf.getBegin());
+    assertEquals(6, sf.getEnd());
+  }
+
+  /**
+   * Tests for transferring features between mapped sequences
+   */
+  @Test(groups = { "Functional" })
+  public void testTransferFeatures_withSelect()
+  {
+    SequenceI dna = new Sequence("dna/20-34", "acgTAGcaaGCCcgt");
+    SequenceI cds = new Sequence("cds/10-15", "TAGGCC");
+  
+    MapList map = new MapList(new int[] { 4, 6, 10, 12 },
+            new int[] { 1, 6 }, 1, 1);
+  
+    // [5, 11] maps to [2, 5]
+    dna.addSequenceFeature(new SequenceFeature("type4", "desc4", 5, 11, 4f,
+            null));
+    // [4, 12] maps to [1, 6]
+    dna.addSequenceFeature(new SequenceFeature("type5", "desc5", 4, 12, 5f,
+            null));
+    // [12, 12] maps to [6, 6]
+    dna.addSequenceFeature(new SequenceFeature("type8", "desc8", 12, 12,
+            8f, null));
+  
+    // "type5" is the 'select this type' argument
+    AlignmentUtils.transferFeatures(dna, cds, map, "type5");
+    SequenceFeature[] sfs = cds.getSequenceFeatures();
+    assertEquals(1, sfs.length);
+  
+    SequenceFeature sf = sfs[0];
+    assertEquals("type5", sf.getType());
+    assertEquals(1, sf.getBegin());
+    assertEquals(6, sf.getEnd());
+  }
+
+  /**
+   * Test the method that extracts the cds-only part of a dna alignment, for the
+   * case where the cds should be aligned to match its nucleotide sequence.
+   */
+  @Test(groups = { "Functional" })
+  public void testMakeCdsAlignment_alternativeTranscripts()
+  {
+    SequenceI dna1 = new Sequence("dna1", "aaaGGGCC-----CTTTaaaGGG");
+    // alternative transcript of same dna skips CCC codon
+    SequenceI dna2 = new Sequence("dna2", "aaaGGGCC-----cttTaaaGGG");
+    // dna3 has no mapping (protein product) so should be ignored here
+    SequenceI dna3 = new Sequence("dna3", "aaaGGGCCCCCGGGcttTaaaGGG");
+    SequenceI pep1 = new Sequence("pep1", "GPFG");
+    SequenceI pep2 = new Sequence("pep2", "GPG");
+    dna1.createDatasetSequence();
+    dna2.createDatasetSequence();
+    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));
+  
+    List<AlignedCodonFrame> mappings = new ArrayList<AlignedCodonFrame>();
+    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);
+    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);
+  
+    AlignmentI dna = new Alignment(new SequenceI[] { dna1, dna2, dna3 });
+    dna.setDataset(null);
+    AlignmentI cds = AlignmentUtils.makeCdsAlignment(new SequenceI[] {
+        dna1, dna2, dna3 }, mappings, dna);
+    List<SequenceI> cdsSeqs = cds.getSequences();
+    assertEquals(2, cdsSeqs.size());
+    assertEquals("GGGCCCTTTGGG", cdsSeqs.get(0).getSequenceAsString());
+    assertEquals("GGGCCTGGG", cdsSeqs.get(1).getSequenceAsString());
+  
+    /*
+     * verify shared, extended alignment dataset
+     */
+    assertSame(dna.getDataset(), cds.getDataset());
+    assertTrue(dna.getDataset().getSequences()
+            .contains(cdsSeqs.get(0).getDatasetSequence()));
+    assertTrue(dna.getDataset().getSequences()
+            .contains(cdsSeqs.get(1).getDatasetSequence()));
+
+    /*
+     * Verify updated mappings
+     */
+    List<AlignedCodonFrame> cdsMappings = cds.getCodonFrames();
+    assertEquals(2, cdsMappings.size());
+  
+    /*
+     * Mapping from pep1 to GGGTTT in first new CDS sequence
+     */
+    List<AlignedCodonFrame> pep1Mapping = MappingUtils
+            .findMappingsForSequence(pep1, cdsMappings);
+    assertEquals(1, pep1Mapping.size());
+    /*
+     * maps GPFG to 1-3,4-6,7-9,10-12
+     */
+    SearchResults sr = MappingUtils
+            .buildSearchResults(pep1, 1, cdsMappings);
+    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);
+    m = sr.getResults().get(0);
+    assertEquals(4, m.getStart());
+    assertEquals(6, m.getEnd());
+    sr = MappingUtils.buildSearchResults(pep1, 3, cdsMappings);
+    m = sr.getResults().get(0);
+    assertEquals(7, m.getStart());
+    assertEquals(9, m.getEnd());
+    sr = MappingUtils.buildSearchResults(pep1, 4, cdsMappings);
+    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
+     */
+    List<AlignedCodonFrame> pep2Mapping = MappingUtils
+            .findMappingsForSequence(pep2, cdsMappings);
+    assertEquals(1, pep2Mapping.size());
+    sr = MappingUtils.buildSearchResults(pep2, 1, cdsMappings);
+    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);
+    m = sr.getResults().get(0);
+    assertEquals(4, m.getStart());
+    assertEquals(6, m.getEnd());
+    sr = MappingUtils.buildSearchResults(pep2, 3, cdsMappings);
+    m = sr.getResults().get(0);
+    assertEquals(7, m.getStart());
+    assertEquals(9, m.getEnd());
+  }
+
+  /**
+   * Test the method that realigns protein to match mapped codon alignment.
+   */
+  @Test(groups = { "Functional" })
+  public void testAlignProteinAsDna_incompleteStartCodon()
+  {
+    // seq1: incomplete start codon (not mapped), then [3, 11]
+    SequenceI dna1 = new Sequence("Seq1", "ccAAA-TTT-GGG-");
+    // seq2 codons are [4, 5], [8, 11]
+    SequenceI dna2 = new Sequence("Seq2", "ccaAA-ttT-GGG-");
+    // seq3 incomplete start codon at 'tt'
+    SequenceI dna3 = new Sequence("Seq3", "ccaaa-ttt-GGG-");
+    AlignmentI dna = new Alignment(new SequenceI[] { dna1, dna2, dna3 });
+    dna.setDataset(null);
+  
+    // prot1 has 'X' for incomplete start codon (not mapped)
+    SequenceI prot1 = new Sequence("Seq1", "XKFG"); // X for incomplete start
+    SequenceI prot2 = new Sequence("Seq2", "NG");
+    SequenceI prot3 = new Sequence("Seq3", "XG"); // X for incomplete start
+    AlignmentI protein = new Alignment(new SequenceI[] { prot1, prot2,
+        prot3 });
+    protein.setDataset(null);
+  
+    // map dna1 [3, 11] to prot1 [2, 4] KFG
+    MapList map = new MapList(new int[] { 3, 11 }, new int[] { 2, 4 }, 3, 1);
+    AlignedCodonFrame acf = new AlignedCodonFrame();
+    acf.addMap(dna1.getDatasetSequence(), prot1.getDatasetSequence(), map);
+
+    // map dna2 [4, 5] [8, 11] to prot2 [1, 2] NG
+    map = new MapList(new int[] { 4, 5, 8, 11 }, new int[] { 1, 2 }, 3, 1);
+    acf.addMap(dna2.getDatasetSequence(), prot2.getDatasetSequence(), map);
+
+    // map dna3 [9, 11] to prot3 [2, 2] G
+    map = new MapList(new int[] { 9, 11 }, new int[] { 2, 2 }, 3, 1);
+    acf.addMap(dna3.getDatasetSequence(), prot3.getDatasetSequence(), map);
+
+    ArrayList<AlignedCodonFrame> acfs = new ArrayList<AlignedCodonFrame>();
+    acfs.add(acf);
+    protein.setCodonFrames(acfs);
+
+    /*
+     * verify X is included in the aligned proteins, and placed just
+     * before the first mapped residue 
+     * CCT is between CCC and TTT
+     */
+    AlignmentUtils.alignProteinAsDna(protein, dna);
+    assertEquals("XK-FG", prot1.getSequenceAsString());
+    assertEquals("--N-G", prot2.getSequenceAsString());
+    assertEquals("---XG", prot3.getSequenceAsString());
+  }
+
+  /**
+   * Tests for the method that maps the subset of a dna sequence that has CDS
+   * (or subtype) feature - case where the start codon is incomplete.
+   */
+  @Test(groups = "Functional")
+  public void testFindCdsPositions_fivePrimeIncomplete()
+  {
+    SequenceI dnaSeq = new Sequence("dna", "aaagGGCCCaaaTTTttt");
+    dnaSeq.createDatasetSequence();
+    SequenceI ds = dnaSeq.getDatasetSequence();
+  
+    // CDS for dna 5-6 (incomplete codon), 7-9
+    SequenceFeature sf = new SequenceFeature("CDS", "", 5, 9, 0f, null);
+    sf.setPhase("2"); // skip 2 bases to start of next codon
+    ds.addSequenceFeature(sf);
+    // CDS for dna 13-15
+    sf = new SequenceFeature("CDS_predicted", "", 13, 15, 0f, null);
+    ds.addSequenceFeature(sf);
+  
+    List<int[]> ranges = AlignmentUtils.findCdsPositions(dnaSeq);
+  
+    /*
+     * check the mapping starts with the first complete codon
+     */
+    assertEquals(6, MappingUtils.getLength(ranges));
+    assertEquals(2, ranges.size());
+    assertEquals(7, ranges.get(0)[0]);
+    assertEquals(9, ranges.get(0)[1]);
+    assertEquals(13, ranges.get(1)[0]);
+    assertEquals(15, ranges.get(1)[1]);
+  }
+
+  /**
+   * Tests for the method that maps the subset of a dna sequence that has CDS
+   * (or subtype) feature.
+   */
+  @Test(groups = "Functional")
+  public void testFindCdsPositions()
+  {
+    SequenceI dnaSeq = new Sequence("dna", "aaaGGGcccAAATTTttt");
+    dnaSeq.createDatasetSequence();
+    SequenceI ds = dnaSeq.getDatasetSequence();
+  
+    // CDS for dna 10-12
+    SequenceFeature sf = new SequenceFeature("CDS_predicted", "", 10, 12,
+            0f, null);
+    sf.setStrand("+");
+    ds.addSequenceFeature(sf);
+    // CDS for dna 4-6
+    sf = new SequenceFeature("CDS", "", 4, 6, 0f, null);
+    sf.setStrand("+");
+    ds.addSequenceFeature(sf);
+    // exon feature should be ignored here
+    sf = new SequenceFeature("exon", "", 7, 9, 0f, null);
+    ds.addSequenceFeature(sf);
+  
+    List<int[]> ranges = AlignmentUtils.findCdsPositions(dnaSeq);
+    /*
+     * verify ranges { [4-6], [12-10] }
+     * note CDS ranges are ordered ascending even if the CDS
+     * features are not
+     */
+    assertEquals(6, MappingUtils.getLength(ranges));
+    assertEquals(2, ranges.size());
+    assertEquals(4, ranges.get(0)[0]);
+    assertEquals(6, ranges.get(0)[1]);
+    assertEquals(10, ranges.get(1)[0]);
+    assertEquals(12, ranges.get(1)[1]);
+  }
+
+  /**
+   * Test the method that computes a map of codon variants for each protein
+   * position from "sequence_variant" features on dna
+   */
+  @Test(groups = "Functional")
+  public void testBuildDnaVariantsMap()
+  {
+    SequenceI dna = new Sequence("dna", "atgAAATTTGGGCCCtag");
+    MapList map = new MapList(new int[] { 1, 18 }, new int[] { 1, 5 }, 3, 1);
+
+    /*
+     * first with no variants on dna
+     */
+    LinkedHashMap<Integer, List<DnaVariant>[]> variantsMap = AlignmentUtils
+            .buildDnaVariantsMap(dna, map);
+    assertTrue(variantsMap.isEmpty());
+
+    /*
+     * single allele codon 1, on base 1
+     */
+    SequenceFeature sf1 = new SequenceFeature("sequence_variant", "", 1, 1,
+            0f, null);
+    sf1.setValue("alleles", "T");
+    sf1.setValue("ID", "sequence_variant:rs758803211");
+    dna.addSequenceFeature(sf1);
+
+    /*
+     * two alleles codon 2, on bases 2 and 3 (distinct variants)
+     */
+    SequenceFeature sf2 = new SequenceFeature("sequence_variant", "", 5, 5,
+            0f, null);
+    sf2.setValue("alleles", "T");
+    sf2.setValue("ID", "sequence_variant:rs758803212");
+    dna.addSequenceFeature(sf2);
+    SequenceFeature sf3 = new SequenceFeature("sequence_variant", "", 6, 6,
+            0f, null);
+    sf3.setValue("alleles", "G");
+    sf3.setValue("ID", "sequence_variant:rs758803213");
+    dna.addSequenceFeature(sf3);
+
+    /*
+     * two alleles codon 3, both on base 2 (one variant)
+     */
+    SequenceFeature sf4 = new SequenceFeature("sequence_variant", "", 8, 8,
+            0f, null);
+    sf4.setValue("alleles", "C, G");
+    sf4.setValue("ID", "sequence_variant:rs758803214");
+    dna.addSequenceFeature(sf4);
+
+    // no alleles on codon 4
+
+    /*
+     * alleles on codon 5 on all 3 bases (distinct variants)
+     */
+    SequenceFeature sf5 = new SequenceFeature("sequence_variant", "", 13,
+            13, 0f, null);
+    sf5.setValue("alleles", "C, G"); // (C duplicates given base value)
+    sf5.setValue("ID", "sequence_variant:rs758803215");
+    dna.addSequenceFeature(sf5);
+    SequenceFeature sf6 = new SequenceFeature("sequence_variant", "", 14,
+            14, 0f, null);
+    sf6.setValue("alleles", "g, a"); // should force to upper-case
+    sf6.setValue("ID", "sequence_variant:rs758803216");
+    dna.addSequenceFeature(sf6);
+    SequenceFeature sf7 = new SequenceFeature("sequence_variant", "", 15,
+            15, 0f, null);
+    sf7.setValue("alleles", "A, T");
+    sf7.setValue("ID", "sequence_variant:rs758803217");
+    dna.addSequenceFeature(sf7);
+
+    /*
+     * build map - expect variants on positions 1, 2, 3, 5
+     */
+    variantsMap = AlignmentUtils.buildDnaVariantsMap(dna, map);
+    assertEquals(4, variantsMap.size());
+
+    /*
+     * protein residue 1: variant on codon (ATG) base 1, not on 2 or 3
+     */
+    List<DnaVariant>[] pep1Variants = variantsMap.get(1);
+    assertEquals(3, pep1Variants.length);
+    assertEquals(1, pep1Variants[0].size());
+    assertEquals("A", pep1Variants[0].get(0).base); // codon[1] base
+    assertSame(sf1, pep1Variants[0].get(0).variant); // codon[1] variant
+    assertEquals(1, pep1Variants[1].size());
+    assertEquals("T", pep1Variants[1].get(0).base); // codon[2] base
+    assertNull(pep1Variants[1].get(0).variant); // no variant here
+    assertEquals(1, pep1Variants[2].size());
+    assertEquals("G", pep1Variants[2].get(0).base); // codon[3] base
+    assertNull(pep1Variants[2].get(0).variant); // no variant here
+
+    /*
+     * protein residue 2: variants on codon (AAA) bases 2 and 3
+     */
+    List<DnaVariant>[] pep2Variants = variantsMap.get(2);
+    assertEquals(3, pep2Variants.length);
+    assertEquals(1, pep2Variants[0].size());
+    // codon[1] base recorded while processing variant on codon[2]
+    assertEquals("A", pep2Variants[0].get(0).base);
+    assertNull(pep2Variants[0].get(0).variant); // no variant here
+    // codon[2] base and variant:
+    assertEquals(1, pep2Variants[1].size());
+    assertEquals("A", pep2Variants[1].get(0).base);
+    assertSame(sf2, pep2Variants[1].get(0).variant);
+    // codon[3] base was recorded when processing codon[2] variant
+    // and then the variant for codon[3] added to it
+    assertEquals(1, pep2Variants[2].size());
+    assertEquals("A", pep2Variants[2].get(0).base);
+    assertSame(sf3, pep2Variants[2].get(0).variant);
+
+    /*
+     * protein residue 3: variants on codon (TTT) base 2 only
+     */
+    List<DnaVariant>[] pep3Variants = variantsMap.get(3);
+    assertEquals(3, pep3Variants.length);
+    assertEquals(1, pep3Variants[0].size());
+    assertEquals("T", pep3Variants[0].get(0).base); // codon[1] base
+    assertNull(pep3Variants[0].get(0).variant); // no variant here
+    assertEquals(1, pep3Variants[1].size());
+    assertEquals("T", pep3Variants[1].get(0).base); // codon[2] base
+    assertSame(sf4, pep3Variants[1].get(0).variant); // codon[2] variant
+    assertEquals(1, pep3Variants[2].size());
+    assertEquals("T", pep3Variants[2].get(0).base); // codon[3] base
+    assertNull(pep3Variants[2].get(0).variant); // no variant here
+
+    /*
+     * three variants on protein position 5
+     */
+    List<DnaVariant>[] pep5Variants = variantsMap.get(5);
+    assertEquals(3, pep5Variants.length);
+    assertEquals(1, pep5Variants[0].size());
+    assertEquals("C", pep5Variants[0].get(0).base); // codon[1] base
+    assertSame(sf5, pep5Variants[0].get(0).variant); // codon[1] variant
+    assertEquals(1, pep5Variants[1].size());
+    assertEquals("C", pep5Variants[1].get(0).base); // codon[2] base
+    assertSame(sf6, pep5Variants[1].get(0).variant); // codon[2] variant
+    assertEquals(1, pep5Variants[2].size());
+    assertEquals("C", pep5Variants[2].get(0).base); // codon[3] base
+    assertSame(sf7, pep5Variants[2].get(0).variant); // codon[3] variant
+  }
+
+  /**
+   * Tests for the method that computes all peptide variants given codon
+   * variants
+   */
+  @Test(groups = "Functional")
+  public void testComputePeptideVariants()
+  {
+    /*
+     * scenario: AAATTTCCC codes for KFP, with variants
+     *           GAA -> E
+     *           CAA -> Q
+     *           AAG synonymous
+     *           AAT -> N
+     *              TTC synonymous
+     *                 CAC,CGC -> H,R (as one variant)
+     */
+    SequenceI peptide = new Sequence("pep/10-12", "KFP");
+
+    /*
+     * two distinct variants for codon 1 position 1
+     * second one has clinical significance
+     */
+    SequenceFeature sf1 = new SequenceFeature("sequence_variant", "", 1, 1,
+            0f, null);
+    sf1.setValue("alleles", "A,G"); // GAA -> E
+    sf1.setValue("ID", "var1.125A>G");
+    SequenceFeature sf2 = new SequenceFeature("sequence_variant", "", 1, 1,
+            0f, null);
+    sf2.setValue("alleles", "A,C"); // CAA -> Q
+    sf2.setValue("ID", "var2");
+    sf2.setValue("clinical_significance", "Dodgy");
+    SequenceFeature sf3 = new SequenceFeature("sequence_variant", "", 3, 3,
+            0f, null);
+    sf3.setValue("alleles", "A,G"); // synonymous
+    sf3.setValue("ID", "var3");
+    sf3.setValue("clinical_significance", "None");
+    SequenceFeature sf4 = new SequenceFeature("sequence_variant", "", 3, 3,
+            0f, null);
+    sf4.setValue("alleles", "A,T"); // AAT -> N
+    sf4.setValue("ID", "sequence_variant:var4"); // prefix gets stripped off
+    sf4.setValue("clinical_significance", "Benign");
+    SequenceFeature sf5 = new SequenceFeature("sequence_variant", "", 6, 6,
+            0f, null);
+    sf5.setValue("alleles", "T,C"); // synonymous
+    sf5.setValue("ID", "var5");
+    sf5.setValue("clinical_significance", "Bad");
+    SequenceFeature sf6 = new SequenceFeature("sequence_variant", "", 8, 8,
+            0f, null);
+    sf6.setValue("alleles", "C,A,G"); // CAC,CGC -> H,R
+    sf6.setValue("ID", "var6");
+    sf6.setValue("clinical_significance", "Good");
+
+    List<DnaVariant> codon1Variants = new ArrayList<DnaVariant>();
+    List<DnaVariant> codon2Variants = new ArrayList<DnaVariant>();
+    List<DnaVariant> codon3Variants = new ArrayList<DnaVariant>();
+    List<DnaVariant> codonVariants[] = new ArrayList[3];
+    codonVariants[0] = codon1Variants;
+    codonVariants[1] = codon2Variants;
+    codonVariants[2] = codon3Variants;
+
+    /*
+     * compute variants for protein position 1
+     */
+    codon1Variants.add(new DnaVariant("A", sf1));
+    codon1Variants.add(new DnaVariant("A", sf2));
+    codon2Variants.add(new DnaVariant("A"));
+    codon2Variants.add(new DnaVariant("A"));
+    codon3Variants.add(new DnaVariant("A", sf3));
+    codon3Variants.add(new DnaVariant("A", sf4));
+    AlignmentUtils.computePeptideVariants(peptide, 1, codonVariants);
+
+    /*
+     * compute variants for protein position 2
+     */
+    codon1Variants.clear();
+    codon2Variants.clear();
+    codon3Variants.clear();
+    codon1Variants.add(new DnaVariant("T"));
+    codon2Variants.add(new DnaVariant("T"));
+    codon3Variants.add(new DnaVariant("T", sf5));
+    AlignmentUtils.computePeptideVariants(peptide, 2, codonVariants);
+
+    /*
+     * compute variants for protein position 3
+     */
+    codon1Variants.clear();
+    codon2Variants.clear();
+    codon3Variants.clear();
+    codon1Variants.add(new DnaVariant("C"));
+    codon2Variants.add(new DnaVariant("C", sf6));
+    codon3Variants.add(new DnaVariant("C"));
+    AlignmentUtils.computePeptideVariants(peptide, 3, codonVariants);
+
+    /*
+     * verify added sequence features for
+     * var1 K -> E
+     * var2 K -> Q
+     * var4 K -> N
+     * var6 P -> H
+     * var6 P -> R
+     */
+    SequenceFeature[] sfs = peptide.getSequenceFeatures();
+    assertEquals(5, sfs.length);
+    SequenceFeature sf = sfs[0];
+    assertEquals(1, sf.getBegin());
+    assertEquals(1, sf.getEnd());
+    assertEquals("K->E", 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",
+            sf.links.get(0));
+    sf = sfs[1];
+    assertEquals(1, sf.getBegin());
+    assertEquals(1, sf.getEnd());
+    assertEquals("K->Q", 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",
+            sf.links.get(0));
+    sf = sfs[2];
+    assertEquals(1, sf.getBegin());
+    assertEquals(1, sf.getEnd());
+    assertEquals("K->N", 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",
+            sf.links.get(0));
+    sf = sfs[3];
+    assertEquals(3, sf.getBegin());
+    assertEquals(3, sf.getEnd());
+    assertEquals("P->H", 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",
+            sf.links.get(0));
+    // var5 generates two distinct protein variant features
+    sf = sfs[4];
+    assertEquals(3, sf.getBegin());
+    assertEquals(3, sf.getEnd());
+    assertEquals("P->R", 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",
+            sf.links.get(0));
+  }
+
+  /**
+   * Tests for the method that maps the subset of a dna sequence that has CDS
+   * (or subtype) feature, with CDS strand = '-' (reverse)
+   */
+  // test turned off as currently findCdsPositions is not strand-dependent
+  // left in case it comes around again...
+  @Test(groups = "Functional", enabled = false)
+  public void testFindCdsPositions_reverseStrand()
+  {
+    SequenceI dnaSeq = new Sequence("dna", "aaaGGGcccAAATTTttt");
+    dnaSeq.createDatasetSequence();
+    SequenceI ds = dnaSeq.getDatasetSequence();
+  
+    // CDS for dna 4-6
+    SequenceFeature sf = new SequenceFeature("CDS", "", 4, 6, 0f, null);
+    sf.setStrand("-");
+    ds.addSequenceFeature(sf);
+    // exon feature should be ignored here
+    sf = new SequenceFeature("exon", "", 7, 9, 0f, null);
+    ds.addSequenceFeature(sf);
+    // CDS for dna 10-12
+    sf = new SequenceFeature("CDS_predicted", "", 10, 12, 0f, null);
+    sf.setStrand("-");
+    ds.addSequenceFeature(sf);
+  
+    List<int[]> ranges = AlignmentUtils.findCdsPositions(dnaSeq);
+    /*
+     * verify ranges { [12-10], [6-4] }
+     */
+    assertEquals(6, MappingUtils.getLength(ranges));
+    assertEquals(2, ranges.size());
+    assertEquals(12, ranges.get(0)[0]);
+    assertEquals(10, ranges.get(0)[1]);
+    assertEquals(6, ranges.get(1)[0]);
+    assertEquals(4, ranges.get(1)[1]);
+  }
+
+  /**
+   * Tests for the method that maps the subset of a dna sequence that has CDS
+   * (or subtype) feature - reverse strand case where the start codon is
+   * incomplete.
+   */
+  @Test(groups = "Functional", enabled = false)
+  // test turned off as currently findCdsPositions is not strand-dependent
+  // left in case it comes around again...
+  public void testFindCdsPositions_reverseStrandThreePrimeIncomplete()
+  {
+    SequenceI dnaSeq = new Sequence("dna", "aaagGGCCCaaaTTTttt");
+    dnaSeq.createDatasetSequence();
+    SequenceI ds = dnaSeq.getDatasetSequence();
+  
+    // CDS for dna 5-9
+    SequenceFeature sf = new SequenceFeature("CDS", "", 5, 9, 0f, null);
+    sf.setStrand("-");
+    ds.addSequenceFeature(sf);
+    // CDS for dna 13-15
+    sf = new SequenceFeature("CDS_predicted", "", 13, 15, 0f, null);
+    sf.setStrand("-");
+    sf.setPhase("2"); // skip 2 bases to start of next codon
+    ds.addSequenceFeature(sf);
+  
+    List<int[]> ranges = AlignmentUtils.findCdsPositions(dnaSeq);
+  
+    /*
+     * check the mapping starts with the first complete codon
+     * expect ranges [13, 13], [9, 5]
+     */
+    assertEquals(6, MappingUtils.getLength(ranges));
+    assertEquals(2, ranges.size());
+    assertEquals(13, ranges.get(0)[0]);
+    assertEquals(13, ranges.get(0)[1]);
+    assertEquals(9, ranges.get(1)[0]);
+    assertEquals(5, ranges.get(1)[1]);
+  }
+
+  @Test(groups = "Functional")
+  public void testAlignAs_alternateTranscriptsUngapped()
+  {
+    SequenceI dna1 = new Sequence("dna1", "cccGGGTTTaaa");
+    SequenceI dna2 = new Sequence("dna2", "CCCgggtttAAA");
+    AlignmentI dna = new Alignment(new SequenceI[] { dna1, dna2 });
+    ((Alignment) dna).createDatasetAlignment();
+    SequenceI cds1 = new Sequence("cds1", "GGGTTT");
+    SequenceI cds2 = new Sequence("cds2", "CCCAAA");
+    AlignmentI cds = new Alignment(new SequenceI[] { cds1, cds2 });
+    ((Alignment) cds).createDatasetAlignment();
+
+    AlignedCodonFrame acf = new AlignedCodonFrame();
+    MapList map = new MapList(new int[] { 4, 9 }, new int[] { 1, 6 }, 1, 1);
+    acf.addMap(dna1.getDatasetSequence(), cds1.getDatasetSequence(), map);
+    map = new MapList(new int[] { 1, 3, 10, 12 }, new int[] { 1, 6 }, 1, 1);
+    acf.addMap(dna2.getDatasetSequence(), cds2.getDatasetSequence(), map);
+
+    /*
+     * verify CDS alignment is as:
+     *   cccGGGTTTaaa (cdna)
+     *   CCCgggtttAAA (cdna)
+     *   
+     *   ---GGGTTT--- (cds)
+     *   CCC------AAA (cds)
+     */
+    dna.addCodonFrame(acf);
+    AlignmentUtils.alignAs(cds, dna);
+    assertEquals("---GGGTTT", cds.getSequenceAt(0).getSequenceAsString());
+    assertEquals("CCC------AAA", cds.getSequenceAt(1).getSequenceAsString());
+  }
+
+  @Test(groups = { "Functional" })
+  public void testAddMappedPositions()
+  {
+    SequenceI from = new Sequence("dna", "ggAA-ATcc-TT-g");
+    SequenceI seq1 = new Sequence("cds", "AAATTT");
+    from.createDatasetSequence();
+    seq1.createDatasetSequence();
+    Mapping mapping = new Mapping(seq1, new MapList(
+            new int[] { 3, 6, 9, 10 },
+            new int[] { 1, 6 }, 1, 1));
+    Map<Integer, Map<SequenceI, Character>> map = new TreeMap<Integer, Map<SequenceI, Character>>();
+    AlignmentUtils.addMappedPositions(seq1, from, mapping, map);
+
+    /*
+     * verify map has seq1 residues in columns 3,4,6,7,11,12
+     */
+    assertEquals(6, map.size());
+    assertEquals('A', map.get(3).get(seq1).charValue());
+    assertEquals('A', map.get(4).get(seq1).charValue());
+    assertEquals('A', map.get(6).get(seq1).charValue());
+    assertEquals('T', map.get(7).get(seq1).charValue());
+    assertEquals('T', map.get(11).get(seq1).charValue());
+    assertEquals('T', map.get(12).get(seq1).charValue());
+
+    /*
+     * 
+     */
+  }
+
+  /**
+   * Test case where the mapping 'from' range includes a stop codon which is
+   * absent in the 'to' range
+   */
+  @Test(groups = { "Functional" })
+  public void testAddMappedPositions_withStopCodon()
+  {
+    SequenceI from = new Sequence("dna", "ggAA-ATcc-TT-g");
+    SequenceI seq1 = new Sequence("cds", "AAATTT");
+    from.createDatasetSequence();
+    seq1.createDatasetSequence();
+    Mapping mapping = new Mapping(seq1, new MapList(
+            new int[] { 3, 6, 9, 10 },
+            new int[] { 1, 6 }, 1, 1));
+    Map<Integer, Map<SequenceI, Character>> map = new TreeMap<Integer, Map<SequenceI, Character>>();
+    AlignmentUtils.addMappedPositions(seq1, from, mapping, map);
+  
+    /*
+     * verify map has seq1 residues in columns 3,4,6,7,11,12
+     */
+    assertEquals(6, map.size());
+    assertEquals('A', map.get(3).get(seq1).charValue());
+    assertEquals('A', map.get(4).get(seq1).charValue());
+    assertEquals('A', map.get(6).get(seq1).charValue());
+    assertEquals('T', map.get(7).get(seq1).charValue());
+    assertEquals('T', map.get(11).get(seq1).charValue());
+    assertEquals('T', map.get(12).get(seq1).charValue());
+  }
 }
index 8f878f0..9a4c357 100644 (file)
@@ -457,4 +457,58 @@ public class DnaTest
     assertEquals("[0, 2, 5]", convertCodon("A-A--A").toString());
     assertEquals("[1, 3, 4]", convertCodon("-A-AA-").toString());
   }
+
+  /**
+   * Test dna complementing
+   */
+  @Test(groups = "Functional")
+  public void testGetComplement()
+  {
+    assertEquals('t', Dna.getComplement('a'));
+    assertEquals('T', Dna.getComplement('A'));
+    assertEquals('a', Dna.getComplement('t'));
+    assertEquals('A', Dna.getComplement('T'));
+    assertEquals('c', Dna.getComplement('g'));
+    assertEquals('C', Dna.getComplement('G'));
+    assertEquals('g', Dna.getComplement('c'));
+    assertEquals('G', Dna.getComplement('C'));
+    // note uU --> aA but not vice versa
+    assertEquals('a', Dna.getComplement('u'));
+    assertEquals('A', Dna.getComplement('U'));
+    // ambiguity codes, see http://www.bioinformatics.org/sms/iupac.html
+    assertEquals('r', Dna.getComplement('y'));
+    assertEquals('R', Dna.getComplement('Y'));
+    assertEquals('y', Dna.getComplement('r'));
+    assertEquals('Y', Dna.getComplement('R'));
+    assertEquals('k', Dna.getComplement('m'));
+    assertEquals('K', Dna.getComplement('M'));
+    assertEquals('m', Dna.getComplement('k'));
+    assertEquals('M', Dna.getComplement('K'));
+    assertEquals('b', Dna.getComplement('v'));
+    assertEquals('B', Dna.getComplement('V'));
+    assertEquals('v', Dna.getComplement('b'));
+    assertEquals('V', Dna.getComplement('B'));
+    assertEquals('d', Dna.getComplement('h'));
+    assertEquals('D', Dna.getComplement('H'));
+    assertEquals('h', Dna.getComplement('d'));
+    assertEquals('H', Dna.getComplement('D'));
+    assertEquals('Q', Dna.getComplement('Q'));
+  }
+
+  @Test(groups = "Functional")
+  public void testReverseSequence()
+  {
+    String seq = "AcGtUrYkMbVdHNX";
+
+    // reverse:
+    SequenceI reversed = Dna.reverseSequence("Seq1", seq, false);
+    assertEquals(new StringBuilder(seq).reverse()
+            .toString(), reversed.getSequenceAsString());
+    assertEquals("Seq1|rev", reversed.getName());
+
+    // reverse complement:
+    SequenceI revcomp = Dna.reverseSequence("Seq1", seq, true);
+    assertEquals("XNDhBvKmRyAaCgT", revcomp.getSequenceAsString());
+    assertEquals("Seq1|revcomp", revcomp.getName());
+  }
 }
diff --git a/test/jalview/analysis/SeqsetUtilsTest.java b/test/jalview/analysis/SeqsetUtilsTest.java
new file mode 100644 (file)
index 0000000..b4d079a
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * 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 <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
+package jalview.analysis;
+
+import jalview.datamodel.Alignment;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.Sequence;
+import jalview.datamodel.SequenceFeature;
+import jalview.datamodel.SequenceI;
+
+import java.util.Hashtable;
+
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+/**
+ * @author jprocter
+ *
+ */
+public class SeqsetUtilsTest
+{
+  /**
+   * test for JAL-2046 bug - duplication of sequence features on reconstructed
+   * alignment
+   */
+  @Test(groups = { "Functional" })
+  public void testSeqFeatureAddition()
+  {
+    SequenceI[] sqset = new SequenceI[] {
+        new Sequence("Aseq1", "AREALSEQ"),
+        new Sequence("Aseq2", "AREALSEQ") };
+
+    AlignmentI al = new Alignment(sqset);
+    al.setDataset(null);
+    AlignmentI ds = al.getDataset();
+    SequenceFeature sf1 = new SequenceFeature("f1", "foo", "bleh", 2, 3,
+            "far"), sf2 = new SequenceFeature("f2", "foo", "bleh", 2, 3,
+            "far");
+    ds.getSequenceAt(0).addSequenceFeature(sf1);
+    Hashtable unq = SeqsetUtils.uniquify(sqset, true);
+    SequenceI[] sqset2 = new SequenceI[] {
+        new Sequence(sqset[0].getName(), sqset[0].getSequenceAsString()),
+        new Sequence(sqset[1].getName(), sqset[1].getSequenceAsString()) };
+    Assert.assertTrue(sqset[0].getSequenceFeatures()[0] == sf1);
+    Assert.assertEquals(sqset2[0].getSequenceFeatures(), null);
+    ds.getSequenceAt(0).addSequenceFeature(sf2);
+    Assert.assertEquals(sqset[0].getSequenceFeatures().length, 2);
+    SeqsetUtils.deuniquify(unq, sqset2);
+    // explicitly test that original sequence features still exist because they
+    // are on the shared dataset sequence
+    Assert.assertEquals(sqset[0].getSequenceFeatures().length, 2);
+    Assert.assertEquals(sqset2[0].getSequenceFeatures().length, 2);
+    Assert.assertTrue(sqset[0].getSequenceFeatures()[0] == sqset2[0]
+            .getSequenceFeatures()[0]);
+    Assert.assertTrue(sqset[0].getSequenceFeatures()[1] == sqset2[0]
+            .getSequenceFeatures()[1]);
+  }
+}
diff --git a/test/jalview/analysis/SequenceIdMatcherTest.java b/test/jalview/analysis/SequenceIdMatcherTest.java
new file mode 100644 (file)
index 0000000..eb0fc47
--- /dev/null
@@ -0,0 +1,78 @@
+package jalview.analysis;
+
+import static org.testng.AssertJUnit.assertFalse;
+import static org.testng.AssertJUnit.assertTrue;
+
+import jalview.analysis.SequenceIdMatcher.SeqIdName;
+import jalview.datamodel.SequenceI;
+
+import org.testng.annotations.Test;
+
+public class SequenceIdMatcherTest
+{
+
+  /**
+   * Test the method that checks for one sequence id starting with the other,
+   * followed by an 'allowed' separator character
+   */
+  @Test(groups = "Functional")
+  public void test_seqIdNameEquals()
+  {
+    SequenceIdMatcher sequenceIdMatcher = new SequenceIdMatcher(
+            new SequenceI[] {});
+
+    /*
+     * target name = matcher name + word separator...
+     */
+    SeqIdName testee = sequenceIdMatcher.new SeqIdName("A12345");
+    assertTrue(testee.equals("A12345"));
+    assertTrue(testee.equals("A12345~"));
+    assertTrue(testee.equals("A12345."));
+    assertTrue(testee.equals("A12345 "));
+    assertTrue(testee.equals("A12345|"));
+    assertTrue(testee.equals("A12345#"));
+    assertTrue(testee.equals("A12345\\"));
+    assertTrue(testee.equals("A12345/"));
+    assertTrue(testee.equals("A12345<"));
+    assertTrue(testee.equals("A12345>"));
+    assertTrue(testee.equals("A12345!"));
+    assertTrue(testee.equals("A12345\""));
+    assertTrue(testee.equals("A12345" + String.valueOf((char) 0x00A4)));
+    assertTrue(testee.equals("A12345$a"));
+    assertTrue(testee.equals("A12345%b"));
+    assertTrue(testee.equals("A12345^cd"));
+    assertTrue(testee.equals("A12345*efg"));
+    assertTrue(testee.equals("A12345)^&!"));
+    assertTrue(testee.equals("A12345}01&*"));
+    assertTrue(testee.equals("A12345[A23456"));
+    assertTrue(testee.equals("A12345@|Uniprot"));
+    assertTrue(testee.equals("A12345'whatever you want here"));
+    assertTrue(testee.equals("A12345,"));
+    assertTrue(testee.equals("A12345?"));
+    assertTrue(testee.equals("A12345_"));
+
+    /*
+     * matcher name = target name + word separator...
+     */
+    testee = sequenceIdMatcher.new SeqIdName("A12345#");
+    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"));
+
+    testee = sequenceIdMatcher.new SeqIdName("A12345?B23456");
+    assertFalse(testee.equals("B23456"));
+    assertFalse(testee.equals("A12345|"));
+    assertFalse(testee.equals("A12345?"));
+
+    testee = sequenceIdMatcher.new SeqIdName("A12345<");
+    assertFalse(testee.equals("A12345?"));
+    assertTrue(testee.equals("A12345<")); // bug? inconsistent
+  }
+}
index d6342ef..43ebd63 100644 (file)
@@ -119,7 +119,7 @@ public class TestAlignSeq
     String expected = "Score = 320\nLength of alignment = 10\nSequence Seq1 :  3 - 18 (Sequence length = 14)\nSequence Seq1 :  1 - 10 (Sequence length = 10)\n\n"
             + "Seq1 SDFAQQQRRR\n"
             + "     |||||||   \n"
-            + "Seq1 SDFAQQQSSS\n\n" + "Percentage ID = 70.00\n\n";
+            + "Seq1 SDFAQQQSSS\n\n" + "Percentage ID = 70.00\n";
     assertEquals(expected, baos.toString());
   }
 }
index a70fac2..029483f 100644 (file)
@@ -27,7 +27,7 @@ import jalview.gui.AlignFrame;
 import jalview.io.FileLoader;
 import jalview.io.FormatAdapter;
 
-import org.testng.AssertJUnit;
+import org.testng.Assert;
 import org.testng.annotations.Test;
 
 public class FeatureScoreModelTest
@@ -40,14 +40,13 @@ public class FeatureScoreModelTest
 
   int[] sf3 = new int[] { -1, -1, -1, -1, -1, -1, 76, 77 };
 
-  @Test(groups = { "Functional" })
-  public void testFeatureScoreModel() throws Exception
+  public AlignFrame getTestAlignmentFrame()
   {
     AlignFrame alf = new FileLoader(false).LoadFileWaitTillLoaded(
             alntestFile, FormatAdapter.PASTE);
     AlignmentI al = alf.getViewport().getAlignment();
-    AssertJUnit.assertEquals(4, al.getHeight());
-    AssertJUnit.assertEquals(5, al.getWidth());
+    Assert.assertEquals(al.getHeight(), 4);
+    Assert.assertEquals(al.getWidth(), 5);
     for (int i = 0; i < 4; i++)
     {
       SequenceI ds = al.getSequenceAt(i).getDatasetSequence();
@@ -72,21 +71,68 @@ public class FeatureScoreModelTest
     alf.getFeatureRenderer().setVisible("sf2");
     alf.getFeatureRenderer().setVisible("sf3");
     alf.getFeatureRenderer().findAllFeatures(true);
-    AssertJUnit.assertEquals("Number of feature types", 3, alf
-            .getFeatureRenderer().getDisplayedFeatureTypes().length);
-    AssertJUnit.assertTrue(alf.getCurrentView().areFeaturesDisplayed());
+    Assert.assertEquals(alf.getFeatureRenderer().getDisplayedFeatureTypes()
+            .size(), 3, "Number of feature types");
+    Assert.assertTrue(alf.getCurrentView().areFeaturesDisplayed());
+    return alf;
+  }
+
+  @Test(groups = { "Functional" })
+  public void testFeatureScoreModel() throws Exception
+  {
+    AlignFrame alf = getTestAlignmentFrame();
     FeatureScoreModel fsm = new FeatureScoreModel();
-    AssertJUnit.assertTrue(fsm.configureFromAlignmentView(alf
+    Assert.assertTrue(fsm.configureFromAlignmentView(alf
             .getCurrentView().getAlignPanel()));
     alf.selectAllSequenceMenuItem_actionPerformed(null);
     float[][] dm = fsm.findDistances(alf.getViewport().getAlignmentView(
             true));
-    AssertJUnit.assertTrue("FER1_MESCR should be identical with RAPSA (2)",
-            dm[0][2] == 0f);
-    AssertJUnit
-            .assertTrue(
-                    "FER1_MESCR should be further from SPIOL (1) than it is from RAPSA (2)",
-                    dm[0][1] > dm[0][2]);
+    Assert.assertTrue(dm[0][2] == 0f,
+            "FER1_MESCR (0) should be identical with RAPSA (2)");
+    Assert.assertTrue(dm[0][1] > dm[0][2],
+            "FER1_MESCR (0) should be further from SPIOL (1) than it is from RAPSA (2)");
+  }
+
+  @Test(groups = { "Functional" })
+  public void testFeatureScoreModel_hiddenFirstColumn() throws Exception
+  {
+    AlignFrame alf = getTestAlignmentFrame();
+    // hiding first two columns shouldn't affect the tree
+    alf.getViewport().hideColumns(0, 1);
+    FeatureScoreModel fsm = new FeatureScoreModel();
+    Assert.assertTrue(fsm.configureFromAlignmentView(alf.getCurrentView()
+            .getAlignPanel()));
+    alf.selectAllSequenceMenuItem_actionPerformed(null);
+    float[][] dm = fsm.findDistances(alf.getViewport().getAlignmentView(
+            true));
+    Assert.assertTrue(dm[0][2] == 0f,
+            "FER1_MESCR (0) should be identical with RAPSA (2)");
+    Assert.assertTrue(dm[0][1] > dm[0][2],
+            "FER1_MESCR (0) should be further from SPIOL (1) than it is from RAPSA (2)");
+  }
 
+  @Test(groups = { "Functional" })
+  public void testFeatureScoreModel_HiddenColumns() throws Exception
+  {
+    AlignFrame alf = getTestAlignmentFrame();
+    // hide columns and check tree changes
+    alf.getViewport().hideColumns(3, 4);
+    alf.getViewport().hideColumns(0, 1);
+    FeatureScoreModel fsm = new FeatureScoreModel();
+    Assert.assertTrue(fsm.configureFromAlignmentView(alf.getCurrentView()
+            .getAlignPanel()));
+    alf.selectAllSequenceMenuItem_actionPerformed(null);
+    float[][] dm = fsm.findDistances(alf.getViewport().getAlignmentView(
+            true));
+    Assert.assertTrue(dm[0][2] == 0f,
+            "After hiding last two columns FER1_MESCR (0) should still be identical with RAPSA (2)");
+    Assert.assertTrue(dm[0][1] == 0f,
+            "After hiding last two columns FER1_MESCR (0) should now also be identical with SPIOL (1)");
+    for (int s=0;s<3;s++)
+    {
+      Assert.assertTrue(dm[s][3] > 0f, "After hiding last two columns "
+              + alf.getViewport().getAlignment().getSequenceAt(s).getName()
+              + "(" + s + ") should still be distinct from FER1_MAIZE (3)");
+    }
   }
 }
index a0757cc..cd8a1e3 100644 (file)
 package jalview.datamodel;
 
 import static org.testng.AssertJUnit.assertEquals;
+import static org.testng.AssertJUnit.assertFalse;
 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.util.MapList;
 
 import java.util.Arrays;
+import java.util.List;
 
 import org.testng.annotations.Test;
 
@@ -69,6 +74,9 @@ public class AlignedCodonFrameTest
      */
     assertEquals(aa.getSequenceAt(1), acf.findAlignedSequence(cdna
             .getSequenceAt(0).getDatasetSequence(), aa));
+    // can also find this from the dna aligned sequence
+    assertEquals(aa.getSequenceAt(1),
+            acf.findAlignedSequence(cdna.getSequenceAt(0), aa));
 
     assertEquals(cdna.getSequenceAt(0), acf.findAlignedSequence(aa
             .getSequenceAt(1).getDatasetSequence(), cdna));
@@ -88,7 +96,7 @@ public class AlignedCodonFrameTest
 
     final Sequence aseq1 = new Sequence("Seq1", "-P-R");
     aseq1.createDatasetSequence();
-    final Sequence aseq2 = new Sequence("Seq2", "-LY-");
+    final Sequence aseq2 = new Sequence("Seq2", "-LY-Q");
     aseq2.createDatasetSequence();
 
     /*
@@ -100,6 +108,7 @@ public class AlignedCodonFrameTest
 
     /*
      * Set up the mappings for the exons (upper-case bases)
+     * Note residue Q is unmapped
      */
     MapList map = new MapList(new int[] { 2, 4, 6, 6, 8, 9 }, new int[] {
         1, 2 }, 3, 1);
@@ -108,14 +117,19 @@ public class AlignedCodonFrameTest
             3, 1);
     acf.addMap(seq2.getDatasetSequence(), aseq2.getDatasetSequence(), map);
 
-    assertEquals("[2, 4]",
-            Arrays.toString(acf.getMappedRegion(seq1, aseq1, 1)));
-    assertEquals("[6, 6, 8, 9]",
-            Arrays.toString(acf.getMappedRegion(seq1, aseq1, 2)));
-    assertEquals("[1, 2, 4, 4]",
-            Arrays.toString(acf.getMappedRegion(seq2, aseq2, 1)));
-    assertEquals("[5, 5, 7, 8]",
-            Arrays.toString(acf.getMappedRegion(seq2, aseq2, 2)));
+    assertArrayEquals(new int[] { 2, 4 },
+            acf.getMappedRegion(seq1, aseq1, 1));
+    assertArrayEquals(new int[] { 6, 6, 8, 9 },
+            acf.getMappedRegion(seq1, aseq1, 2));
+    assertArrayEquals(new int[] { 1, 2, 4, 4 },
+            acf.getMappedRegion(seq2, aseq2, 1));
+    assertArrayEquals(new int[] { 5, 5, 7, 8 },
+            acf.getMappedRegion(seq2, aseq2, 2));
+
+    /*
+     * No mapping from seq2 to Q
+     */
+    assertNull(acf.getMappedRegion(seq2, aseq2, 3));
 
     /*
      * No mapping from sequence 1 to sequence 2
@@ -124,11 +138,11 @@ public class AlignedCodonFrameTest
   }
 
   @Test(groups = { "Functional" })
-  public void testGetMappedCodon()
+  public void testGetMappedCodons()
   {
     final Sequence seq1 = new Sequence("Seq1", "c-G-TA-gC-gT-T");
     seq1.createDatasetSequence();
-    final Sequence aseq1 = new Sequence("Seq1", "-P-R");
+    final Sequence aseq1 = new Sequence("Seq1", "-V-L");
     aseq1.createDatasetSequence();
 
     /*
@@ -136,7 +150,42 @@ public class AlignedCodonFrameTest
      */
     AlignedCodonFrame acf = new AlignedCodonFrame();
 
-    assertNull(acf.getMappedCodon(seq1.getDatasetSequence(), 0));
+    assertNull(acf.getMappedCodons(seq1.getDatasetSequence(), 0));
+
+    /*
+     * Set up the mappings for the exons (upper-case bases)
+     */
+    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.getMappedCodons(aseq1.getDatasetSequence(), 1)
+            .size());
+    assertEquals(
+            "[G, T, A]",
+            Arrays.toString(acf.getMappedCodons(aseq1.getDatasetSequence(),
+                    1).get(0)));
+    assertEquals(
+            "[C, T, T]",
+            Arrays.toString(acf.getMappedCodons(aseq1.getDatasetSequence(),
+                    2).get(0)));
+  }
+
+  /**
+   * Test for the case where there is more than one variant of the DNA mapping
+   * to a protein sequence
+   */
+  @Test(groups = { "Functional" })
+  public void testGetMappedCodons_dnaVariants()
+  {
+    final Sequence seq1 = new Sequence("Seq1", "c-G-TA-gC-gT-T");
+    seq1.createDatasetSequence();
+    final Sequence seq2 = new Sequence("Seq2", "c-G-TT-gT-gT-A");
+    seq2.createDatasetSequence();
+    final Sequence aseq1 = new Sequence("Seq1", "-V-L");
+    aseq1.createDatasetSequence();
+
+    AlignedCodonFrame acf = new AlignedCodonFrame();
 
     /*
      * Set up the mappings for the exons (upper-case bases)
@@ -144,23 +193,30 @@ public class AlignedCodonFrameTest
     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);
+    acf.addMap(seq2.getDatasetSequence(), aseq1.getDatasetSequence(), map);
 
-    assertEquals("[G, T, A]", Arrays.toString(acf.getMappedCodon(
-            aseq1.getDatasetSequence(), 1)));
-    assertEquals("[C, T, T]", Arrays.toString(acf.getMappedCodon(
-            aseq1.getDatasetSequence(), 2)));
+    assertEquals(2, acf.getMappedCodons(aseq1.getDatasetSequence(), 1)
+            .size());
+    List<char[]> codonsForV = acf.getMappedCodons(
+            aseq1.getDatasetSequence(), 1);
+    assertEquals("[G, T, A]", Arrays.toString(codonsForV.get(0)));
+    assertEquals("[G, T, T]", Arrays.toString(codonsForV.get(1)));
+    List<char[]> codonsForL = acf.getMappedCodons(
+            aseq1.getDatasetSequence(), 2);
+    assertEquals("[C, T, T]", Arrays.toString(codonsForL.get(0)));
+    assertEquals("[T, T, A]", Arrays.toString(codonsForL.get(1)));
   }
 
   /**
    * Test for the case where sequences have start > 1
    */
   @Test(groups = { "Functional" })
-  public void testGetMappedCodon_forSubSequences()
+  public void testGetMappedCodons_forSubSequences()
   {
     final Sequence seq1 = new Sequence("Seq1", "c-G-TA-gC-gT-T", 27, 35);
     seq1.createDatasetSequence();
 
-    final Sequence aseq1 = new Sequence("Seq1", "-P-R", 12, 13);
+    final Sequence aseq1 = new Sequence("Seq1", "-V-L", 12, 13);
     aseq1.createDatasetSequence();
 
     /*
@@ -171,9 +227,228 @@ public class AlignedCodonFrameTest
             new int[] { 12, 13 }, 3, 1);
     acf.addMap(seq1.getDatasetSequence(), aseq1.getDatasetSequence(), map);
 
-    assertEquals("[G, T, A]", Arrays.toString(acf.getMappedCodon(
-            aseq1.getDatasetSequence(), 12)));
-    assertEquals("[C, T, T]", Arrays.toString(acf.getMappedCodon(
-            aseq1.getDatasetSequence(), 13)));
+    assertEquals(
+            "[G, T, A]",
+            Arrays.toString(acf.getMappedCodons(aseq1.getDatasetSequence(),
+                    12).get(0)));
+    assertEquals(
+            "[C, T, T]",
+            Arrays.toString(acf.getMappedCodons(aseq1.getDatasetSequence(),
+                    13).get(0)));
+  }
+
+  @Test(groups = { "Functional" })
+  public void testCouldReplaceSequence()
+  {
+    SequenceI seq1 = new Sequence("Seq1/10-21", "aaacccgggttt");
+    SequenceI seq1proxy = new SequenceDummy("Seq1");
+
+    // map to region within sequence is ok
+    assertTrue(AlignedCodonFrame.couldRealiseSequence(seq1proxy, seq1, 12,
+            17));
+    // map to region overlapping sequence is ok
+    assertTrue(AlignedCodonFrame.couldRealiseSequence(seq1proxy, seq1, 5,
+            10));
+    assertTrue(AlignedCodonFrame.couldRealiseSequence(seq1proxy, seq1, 21,
+            26));
+    // map to region before sequence is not ok
+    assertFalse(AlignedCodonFrame.couldRealiseSequence(seq1proxy, seq1, 4,
+            9));
+    // map to region after sequence is not ok
+    assertFalse(AlignedCodonFrame.couldRealiseSequence(seq1proxy, seq1, 22,
+            27));
+
+    /*
+     * test should fail if name doesn't match
+     */
+    seq1proxy.setName("Seq1a");
+    assertFalse(AlignedCodonFrame.couldRealiseSequence(seq1proxy, seq1, 12,
+            17));
+    seq1proxy.setName("Seq1");
+    seq1.setName("Seq1a");
+    assertFalse(AlignedCodonFrame.couldRealiseSequence(seq1proxy, seq1, 12,
+            17));
+
+    /*
+     * a dummy sequence can't replace a real one
+     */
+    assertFalse(AlignedCodonFrame.couldRealiseSequence(seq1, seq1proxy, 12,
+            17));
+
+    /*
+     * a dummy sequence can't replace a dummy sequence
+     */
+    SequenceI seq1proxy2 = new SequenceDummy("Seq1");
+    assertFalse(AlignedCodonFrame.couldRealiseSequence(seq1proxy,
+            seq1proxy2, 12, 17));
+
+    /*
+     * a real sequence can't replace a real one
+     */
+    SequenceI seq1a = new Sequence("Seq1/10-21", "aaacccgggttt");
+    assertFalse(AlignedCodonFrame.couldRealiseSequence(seq1, seq1a, 12, 17));
+  }
+
+  /**
+   * Tests for the method that tests whether any mapping to a dummy sequence can
+   * be 'realised' to a given real sequence
+   */
+  @Test(groups = { "Functional" })
+  public void testIsRealisableWith()
+  {
+    SequenceI seq1 = new Sequence("Seq1", "tttaaaCCCGGGtttaaa");
+    SequenceI seq2 = new Sequence("Seq2", "PG");
+    SequenceI seq1proxy = new SequenceDummy("Seq1");
+    seq1.createDatasetSequence();
+    seq2.createDatasetSequence();
+    MapList mapList = new MapList(new int[] { 7, 12 }, new int[] { 2, 3 },
+            3, 1);
+    AlignedCodonFrame acf = new AlignedCodonFrame();
+    acf.addMap(seq1proxy, seq2, mapList);
+
+    /*
+     * Seq2 is mapped to SequenceDummy seq1proxy bases 4-9
+     * This is 'realisable' from real sequence Seq1
+     */
+    assertTrue(acf.isRealisableWith(seq1));
+
+    /*
+     * test should fail if name doesn't match
+     */
+    seq1proxy.setName("Seq1a");
+    assertFalse(acf.isRealisableWith(seq1));
+    seq1proxy.setName("Seq1");
+
+    SequenceI seq1ds = seq1.getDatasetSequence();
+    seq1ds.setName("Seq1a");
+    assertFalse(acf.isRealisableWith(seq1));
+    seq1ds.setName("Seq1");
+
+    /*
+     * test should fail if no sequence overlap with mapping of bases 7-12
+     * use artificial start/end values to test this
+     */
+    seq1ds.setStart(1);
+    seq1ds.setEnd(6);
+    // seq1 precedes mapped region:
+    assertFalse(acf.isRealisableWith(seq1));
+    seq1ds.setEnd(7);
+    // seq1 includes first mapped base:
+    assertTrue(acf.isRealisableWith(seq1));
+    seq1ds.setStart(13);
+    seq1ds.setEnd(18);
+    // seq1 follows mapped region:
+    assertFalse(acf.isRealisableWith(seq1));
+    seq1ds.setStart(12);
+    // seq1 includes last mapped base:
+    assertTrue(acf.isRealisableWith(seq1));
+  }
+
+  /**
+   * Tests for the method that converts mappings to a dummy sequence to mappings
+   * to a compatible real sequence
+   */
+  @Test(groups = { "Functional" })
+  public void testRealiseWith()
+  {
+    SequenceI seq1 = new Sequence("Seq1", "tttCAACCCGGGtttaaa");
+    SequenceI seq2 = new Sequence("Seq2", "QPG");
+    SequenceI seq2a = new Sequence("Seq2a", "QPG");
+    SequenceI seq1proxy = new SequenceDummy("Seq1");
+    seq1.createDatasetSequence();
+    seq2.createDatasetSequence();
+    seq2a.createDatasetSequence();
+
+    /*
+     * Make mappings from Seq2 and Seq2a peptides to dummy sequence Seq1
+     */
+    AlignedCodonFrame acf = new AlignedCodonFrame();
+
+    // map PG to codons 7-12 (CCCGGG)
+    MapList mapping1 = new MapList(new int[] { 7, 12 }, new int[] { 2, 3 },
+            3, 1);
+    acf.addMap(seq1proxy, seq2, mapping1);
+    acf.addMap(seq1proxy, seq2a, mapping1);
+
+    // map QP to codons 4-9 (CAACCC)
+    MapList mapping2 = new MapList(new int[] { 4, 9 }, new int[] { 1, 2 },
+            3, 1);
+    acf.addMap(seq1proxy, seq2, mapping2);
+    acf.addMap(seq1proxy, seq2a, mapping2);
+
+    /*
+     * acf now has two mappings one from Seq1 to Seq2, one from Seq1 to Seq2a
+     */
+    assertEquals(2, acf.getdnaSeqs().length);
+    assertSame(seq1proxy, acf.getdnaSeqs()[0]);
+    assertSame(seq1proxy, acf.getdnaSeqs()[1]);
+    assertEquals(2, acf.getProtMappings().length);
+
+    // 'realise' these mappings with the compatible sequence seq1
+    // two mappings should be updated:
+    assertEquals(2, acf.realiseWith(seq1));
+    assertSame(seq1.getDatasetSequence(), acf.getdnaSeqs()[0]);
+    assertSame(seq1.getDatasetSequence(), acf.getdnaSeqs()[1]);
+  }
+
+  /**
+   * Test the method that locates the mapped codon for a protein position.
+   */
+  @Test(groups = { "Functional" })
+  public void testGetMappedRegion_eitherWay()
+  {
+    final Sequence seq1 = new Sequence("Seq1", "AAACCCGGGTTT");
+    seq1.createDatasetSequence();
+    final Sequence seq2 = new Sequence("Seq2", "KPGF");
+    seq2.createDatasetSequence();
+    final Sequence seq3 = new Sequence("Seq3", "QYKPGFSW");
+    seq3.createDatasetSequence();
+
+    /*
+     * map Seq1 to all of Seq2 and part of Seq3
+     */
+    AlignedCodonFrame acf = new AlignedCodonFrame();
+    MapList map = new MapList(new int[] { 1, 12 }, new int[] { 1, 4 }, 3, 1);
+    acf.addMap(seq1.getDatasetSequence(), seq2.getDatasetSequence(), map);
+    map = new MapList(new int[] { 1, 12 }, new int[] { 3, 6 }, 3, 1);
+    acf.addMap(seq1.getDatasetSequence(), seq3.getDatasetSequence(), map);
+
+    /*
+     * map part of Seq3 to Seq2
+     */
+    map = new MapList(new int[] { 3, 6 }, new int[] { 1, 4 }, 1, 1);
+    acf.addMap(seq3.getDatasetSequence(), seq2.getDatasetSequence(), map);
+
+    /*
+     * original case - locate mapped codon for protein position
+     */
+    assertArrayEquals(new int[] { 4, 6 },
+            acf.getMappedRegion(seq1, seq2, 2));
+    assertArrayEquals(new int[] { 7, 9 },
+            acf.getMappedRegion(seq1, seq3, 5));
+    assertNull(acf.getMappedRegion(seq1, seq3, 1));
+
+    /*
+     * locate mapped protein for protein position
+     */
+    assertArrayEquals(new int[] { 4, 4 },
+            acf.getMappedRegion(seq3, seq2, 2));
+
+    /*
+     * reverse location protein-to-protein
+     */
+    assertArrayEquals(new int[] { 2, 2 },
+            acf.getMappedRegion(seq2, seq3, 4));
+
+    /*
+     * reverse location protein-from-nucleotide
+     * any of codon [4, 5, 6] positions map to seq2/2
+     */
+    assertArrayEquals(new int[] { 2, 2 },
+            acf.getMappedRegion(seq2, seq1, 4));
+    assertArrayEquals(new int[] { 2, 2 },
+            acf.getMappedRegion(seq2, seq1, 5));
+    assertArrayEquals(new int[] { 2, 2 },
+            acf.getMappedRegion(seq2, seq1, 6));
   }
 }
index 8abc03e..5a45176 100644 (file)
@@ -22,6 +22,9 @@ 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.assertNull;
+import static org.testng.AssertJUnit.assertSame;
 import static org.testng.AssertJUnit.assertTrue;
 
 import jalview.io.AppletFormatAdapter;
@@ -29,7 +32,10 @@ import jalview.io.FormatAdapter;
 import jalview.util.MapList;
 
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Iterator;
+import java.util.List;
 
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
@@ -176,12 +182,12 @@ public class AlignmentTest
      * Make mappings between sequences. The 'aligned cDNA' is playing the role
      * of what would normally be protein here.
      */
-    makeMappings(al2, al1);
+    makeMappings(al1, al2);
 
     ((Alignment) al2).alignAs(al1, false, true);
-    assertEquals("GC-TC--GUC-GTA-CT", al2.getSequenceAt(0)
+    assertEquals("GC-TC--GUC-GTACT", al2.getSequenceAt(0)
             .getSequenceAsString());
-    assertEquals("-GG-GTC--AGG---CAGT", al2.getSequenceAt(1)
+    assertEquals("-GG-GTC--AGG--CAGT", al2.getSequenceAt(1)
             .getSequenceAsString());
   }
 
@@ -198,38 +204,21 @@ public class AlignmentTest
     AlignmentI al2 = loadAlignment(AA_SEQS_1, "FASTA");
     makeMappings(al1, al2);
 
+    // Fudge - alignProteinAsCdna expects mappings to be on protein
+    al2.getCodonFrames().addAll(al1.getCodonFrames());
+
     ((Alignment) al2).alignAs(al1, false, true);
     assertEquals("K-Q-Y-L-", al2.getSequenceAt(0).getSequenceAsString());
     assertEquals("-R-F-P-W", al2.getSequenceAt(1).getSequenceAsString());
   }
 
   /**
-   * Aligning protein from cDNA for a single sequence. This is the 'simple' case
-   * (as there is no need to compute codon 'alignments') but worth testing
-   * before tackling the multiple sequence case.
-   * 
-   * @throws IOException
-   */
-  @Test(groups = { "Functional" })
-  public void testAlignAs_proteinAsCdna_singleSequence() throws IOException
-  {
-    /*
-     * simplest case remove all gaps
-     */
-    verifyAlignAs(">protein\n-Q-K-\n", ">dna\nCAAaaa\n", "QK");
-
-    /*
-     * with sequence offsets
-     */
-    verifyAlignAs(">protein/12-13\n-Q-K-\n", ">dna/20-25\nCAAaaa\n", "QK");
-  }
-
-  /**
    * Test aligning cdna as per protein alignment.
    * 
    * @throws IOException
    */
-  @Test(groups = { "Functional" })
+  @Test(groups = { "Functional" }, enabled = false)
+  // TODO review / update this test after redesign of alignAs method
   public void testAlignAs_cdnaAsProtein() throws IOException
   {
     /*
@@ -245,7 +234,7 @@ public class AlignmentTest
     ((Alignment) al1).alignAs(al2, false, true);
     assertEquals("ACG---GCUCCA------ACT", al1.getSequenceAt(0)
             .getSequenceAsString());
-    assertEquals("---CGT---TAACGA---AGT", al1.getSequenceAt(1)
+    assertEquals("---CGT---TAACGA---AGT---", al1.getSequenceAt(1)
             .getSequenceAsString());
   }
 
@@ -254,7 +243,8 @@ public class AlignmentTest
    * 
    * @throws IOException
    */
-  @Test(groups = { "Functional" })
+  @Test(groups = { "Functional" }, enabled = false)
+  // TODO review / update this test after redesign of alignAs method
   public void testAlignAs_cdnaAsProtein_singleSequence() throws IOException
   {
     /*
@@ -303,32 +293,29 @@ public class AlignmentTest
   }
 
   /**
-   * Helper method to make mappings from protein to dna sequences, and add the
-   * mappings to the protein alignment
+   * Helper method to make mappings between sequences, and add the mappings to
+   * the 'mapped from' alignment
    * 
    * @param alFrom
    * @param alTo
    */
   public void makeMappings(AlignmentI alFrom, AlignmentI alTo)
   {
-    AlignmentI prot = !alFrom.isNucleotide() ? alFrom : alTo;
-    AlignmentI nuc = alFrom == prot ? alTo : alFrom;
-
     int ratio = (alFrom.isNucleotide() == alTo.isNucleotide() ? 1 : 3);
 
     AlignedCodonFrame acf = new AlignedCodonFrame();
 
-    for (int i = 0; i < nuc.getHeight(); i++)
+    for (int i = 0; i < alFrom.getHeight(); i++)
     {
-      SequenceI seqFrom = nuc.getSequenceAt(i);
-      SequenceI seqTo = prot.getSequenceAt(i);
+      SequenceI seqFrom = alFrom.getSequenceAt(i);
+      SequenceI seqTo = alTo.getSequenceAt(i);
       MapList ml = new MapList(new int[] { seqFrom.getStart(),
           seqFrom.getEnd() },
               new int[] { seqTo.getStart(), seqTo.getEnd() }, ratio, 1);
       acf.addMap(seqFrom, seqTo, ml);
     }
 
-    prot.addCodonFrame(acf);
+    alFrom.addCodonFrame(acf);
   }
 
   /**
@@ -337,7 +324,8 @@ public class AlignmentTest
    * 
    * @throws IOException
    */
-  @Test(groups = { "Functional" })
+  @Test(groups = { "Functional" }, enabled = false)
+  // TODO review / update this test after redesign of alignAs method
   public void testAlignAs_dnaAsProtein_withIntrons() throws IOException
   {
     /*
@@ -345,14 +333,13 @@ public class AlignmentTest
      */
     String dna1 = "A-Aa-gG-GCC-cT-TT";
     String dna2 = "c--CCGgg-TT--T-AA-A";
-    AlignmentI al1 = loadAlignment(">Seq1/6-17\n" + dna1
-            + "\n>Seq2/20-31\n" + dna2 + "\n", "FASTA");
+    AlignmentI al1 = loadAlignment(">Dna1/6-17\n" + dna1
+            + "\n>Dna2/20-31\n" + dna2 + "\n", "FASTA");
     AlignmentI al2 = loadAlignment(
-            ">Seq1/7-9\n-P--YK\n>Seq2/11-13\nG-T--F\n", "FASTA");
+            ">Pep1/7-9\n-P--YK\n>Pep2/11-13\nG-T--F\n", "FASTA");
     AlignedCodonFrame acf = new AlignedCodonFrame();
     // Seq1 has intron at dna positions 3,4,9 so splice is AAG GCC TTT
     // Seq2 has intron at dna positions 1,5,6 so splice is CCG TTT AAA
-    // TODO sequence offsets
     MapList ml1 = new MapList(new int[] { 6, 7, 10, 13, 15, 17 }, new int[]
     { 7, 9 }, 3, 1);
     acf.addMap(al1.getSequenceAt(0), al2.getSequenceAt(0), ml1);
@@ -385,4 +372,136 @@ public class AlignmentTest
     assertEquals("c--CCGgg-TT--T------AA-A", al1.getSequenceAt(1)
             .getSequenceAsString());
   }
+
+  @Test(groups = "Functional")
+  public void testCopyConstructor() throws IOException
+  {
+    AlignmentI protein = loadAlignment(AA_SEQS_1, FormatAdapter.PASTE);
+    // create sequence and alignment datasets
+    protein.setDataset(null);
+    AlignedCodonFrame acf = new AlignedCodonFrame();
+    List<AlignedCodonFrame> acfList = Arrays.asList(new AlignedCodonFrame[]
+    { acf });
+    protein.getDataset().setCodonFrames(acfList);
+    AlignmentI copy = new Alignment(protein);
+
+    /*
+     * copy has different aligned sequences but the same dataset sequences
+     */
+    assertFalse(copy.getSequenceAt(0) == protein.getSequenceAt(0));
+    assertFalse(copy.getSequenceAt(1) == protein.getSequenceAt(1));
+    assertSame(copy.getSequenceAt(0).getDatasetSequence(), protein
+            .getSequenceAt(0).getDatasetSequence());
+    assertSame(copy.getSequenceAt(1).getDatasetSequence(), protein
+            .getSequenceAt(1).getDatasetSequence());
+
+    // TODO should the copy constructor copy the dataset?
+    // or make a new one referring to the same dataset sequences??
+    assertNull(copy.getDataset());
+    // assertArrayEquals(copy.getDataset().getSequencesArray(), protein
+    // .getDataset().getSequencesArray());
+  }
+
+  /**
+   * Test behaviour of createDataset
+   * 
+   * @throws IOException
+   */
+  @Test(groups = "Functional")
+  public void testCreateDatasetAlignment() throws IOException
+  {
+    AlignmentI protein = new FormatAdapter().readFile(AA_SEQS_1,
+            AppletFormatAdapter.PASTE, "FASTA");
+    /*
+     * create a dataset sequence on first sequence
+     * leave the second without one
+     */
+    protein.getSequenceAt(0).createDatasetSequence();
+    assertNotNull(protein.getSequenceAt(0).getDatasetSequence());
+    assertNull(protein.getSequenceAt(1).getDatasetSequence());
+
+    /*
+     * add a mapping to the alignment
+     */
+    AlignedCodonFrame acf = new AlignedCodonFrame();
+    protein.addCodonFrame(acf);
+    assertNull(protein.getDataset());
+    assertTrue(protein.getCodonFrames().contains(acf));
+
+    /*
+     * create the alignment dataset
+     * note this creates sequence datasets where missing
+     * as a side-effect (in this case, on seq2
+     */
+    // TODO promote this method to AlignmentI
+    ((Alignment) protein).createDatasetAlignment();
+
+    // TODO this method should return AlignmentI not Alignment !!
+    Alignment ds = protein.getDataset();
+
+    // side-effect: dataset created on second sequence
+    assertNotNull(protein.getSequenceAt(1).getDatasetSequence());
+    // dataset alignment has references to dataset sequences
+    assertEquals(ds.getSequenceAt(0), protein.getSequenceAt(0)
+            .getDatasetSequence());
+    assertEquals(ds.getSequenceAt(1), protein.getSequenceAt(1)
+            .getDatasetSequence());
+
+    // codon frames should have been moved to the dataset
+    // getCodonFrames() should delegate to the dataset:
+    assertTrue(protein.getCodonFrames().contains(acf));
+    // prove the codon frames are indeed on the dataset:
+    assertTrue(ds.getCodonFrames().contains(acf));
+  }
+
+  @Test(groups = "Functional")
+  public void testAddCodonFrame()
+  {
+    AlignmentI align = new Alignment(new SequenceI[] {});
+    AlignedCodonFrame acf = new AlignedCodonFrame();
+    align.addCodonFrame(acf);
+    assertEquals(1, align.getCodonFrames().size());
+    assertTrue(align.getCodonFrames().contains(acf));
+    // can't add the same object twice:
+    align.addCodonFrame(acf);
+    assertEquals(1, align.getCodonFrames().size());
+
+    // create dataset alignment - mappings move to dataset
+    ((Alignment) align).createDatasetAlignment();
+    assertSame(align.getCodonFrames(), align.getDataset().getCodonFrames());
+    assertEquals(1, align.getCodonFrames().size());
+
+    AlignedCodonFrame acf2 = new AlignedCodonFrame();
+    align.addCodonFrame(acf2);
+    assertTrue(align.getDataset().getCodonFrames().contains(acf));
+  }
+
+  @Test(groups = "Functional")
+  public void getVisibleStartAndEndIndexTest()
+  {
+    Sequence seq = new Sequence("testSeq", "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
+    AlignmentI align = new Alignment(new SequenceI[] { seq });
+    ArrayList<int[]> hiddenCols = new ArrayList<int[]>();
+
+    int[] startEnd = align.getVisibleStartAndEndIndex(hiddenCols);
+    assertEquals(0, startEnd[0]);
+    assertEquals(25, startEnd[1]);
+
+    hiddenCols.add(new int[] { 0, 0 });
+    startEnd = align.getVisibleStartAndEndIndex(hiddenCols);
+    assertEquals(1, startEnd[0]);
+    assertEquals(25, startEnd[1]);
+
+    hiddenCols.add(new int[] { 6, 9 });
+    hiddenCols.add(new int[] { 11, 12 });
+    startEnd = align.getVisibleStartAndEndIndex(hiddenCols);
+    assertEquals(1, startEnd[0]);
+    assertEquals(25, startEnd[1]);
+
+    hiddenCols.add(new int[] { 24, 25 });
+    startEnd = align.getVisibleStartAndEndIndex(hiddenCols);
+    System.out.println(startEnd[0] + " : " + startEnd[1]);
+    assertEquals(1, startEnd[0]);
+    assertEquals(23, startEnd[1]);
+  }
 }
index 698f259..86e7949 100644 (file)
@@ -93,6 +93,83 @@ public class ColumnSelectionTest
     assertEquals(2, cs.findColumnPosition(5));
   }
 
+  /**
+   * Test the code used to locate the reference sequence ruler origin
+   */
+  @Test(groups = { "Functional" })
+  public void testLocateVisibleBoundsofSequence()
+  {
+    ColumnSelection cs = new ColumnSelection();
+    SequenceI seq = new Sequence("RefSeq", "-A-SD-ASD--E---");
+    assertEquals(2, seq.findIndex(seq.getStart()));
+
+    // no hidden columns
+    assertEquals(
+            Arrays.toString(new int[] { seq.findIndex(seq.getStart()) - 1,
+                seq.findIndex(seq.getEnd()) - 1, seq.getStart(),
+                seq.getEnd(), seq.findIndex(seq.getStart()) - 1,
+                seq.findIndex(seq.getEnd()) - 1 }),
+            Arrays.toString(cs.locateVisibleBoundsOfSequence(seq)));
+
+    // hidden column on gap after end of sequence - should not affect bounds
+    cs.hideColumns(13);
+    assertEquals(
+            Arrays.toString(new int[] { seq.findIndex(seq.getStart()) - 1,
+                seq.findIndex(seq.getEnd()) - 1, seq.getStart(),
+                seq.getEnd(), seq.findIndex(seq.getStart()) - 1,
+                seq.findIndex(seq.getEnd()) - 1 }),
+            Arrays.toString(cs.locateVisibleBoundsOfSequence(seq)));
+
+    cs.revealAllHiddenColumns();
+    // hidden column on gap before beginning of sequence - should vis bounds by
+    // one
+    cs.hideColumns(0);
+    assertEquals(
+            Arrays.toString(new int[] { seq.findIndex(seq.getStart()) - 2,
+                seq.findIndex(seq.getEnd()) - 2, seq.getStart(),
+                seq.getEnd(), seq.findIndex(seq.getStart()) - 1,
+                seq.findIndex(seq.getEnd()) - 1 }),
+            Arrays.toString(cs.locateVisibleBoundsOfSequence(seq)));
+
+    cs.revealAllHiddenColumns();
+    // hide columns around most of sequence - leave one residue remaining
+    cs.hideColumns(1, 3);
+    cs.hideColumns(6, 11);
+    assertEquals("-D",
+            cs.getVisibleSequenceStrings(0, 5, new SequenceI[] { seq })[0]);
+    assertEquals(
+            Arrays.toString(new int[] { 1, 1, 3, 3,
+                seq.findIndex(seq.getStart()) - 1,
+                seq.findIndex(seq.getEnd()) - 1 }),
+            Arrays.toString(cs.locateVisibleBoundsOfSequence(seq)));
+    cs.revealAllHiddenColumns();
+
+    // hide whole sequence - should just get location of hidden region
+    // containing sequence
+    cs.hideColumns(1, 11);
+    assertEquals(
+            Arrays.toString(new int[] { 0, 1, 0, 0,
+                seq.findIndex(seq.getStart()) - 1,
+                seq.findIndex(seq.getEnd()) - 1 }),
+            Arrays.toString(cs.locateVisibleBoundsOfSequence(seq)));
+
+  }
+
+  @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()
   {
@@ -244,6 +321,32 @@ public class ColumnSelectionTest
   }
 
   /**
+   * Test the method that gets runs of selected columns ordered by column. If
+   * this fails, HideSelectedColumns may also fail
+   */
+  @Test(groups = { "Functional" })
+  public void testgetSelectedRanges()
+  {
+    ColumnSelection cs = new ColumnSelection();
+    int[] sel = { 2, 3, 4, 7, 8, 9, 20, 21, 22 };
+    for (int col : sel)
+    {
+      cs.addElement(col);
+    }
+    List<int[]> range;
+    range = cs.getSelectedRanges();
+    assertEquals(3, range.size());
+    assertEquals("[2, 4]", Arrays.toString(range.get(0)));
+    assertEquals("[7, 9]", Arrays.toString(range.get(1)));
+    assertEquals("[20, 22]", Arrays.toString(range.get(2)));
+    cs.addElement(0);
+    cs.addElement(1);
+    range = cs.getSelectedRanges();
+    assertEquals(3, range.size());
+    assertEquals("[0, 4]", Arrays.toString(range.get(0)));
+  }
+
+  /**
    * Test the method that reveals a range of hidden columns given the start
    * column of the range
    */
@@ -343,4 +446,36 @@ public class ColumnSelectionTest
     cs.invertColumnSelection(1, 9);
     assertEquals("[1, 4, 8]", cs.getSelected().toString());
   }
+
+  @Test(groups = { "Functional" })
+  public void testMaxColumnSelection()
+  {
+    ColumnSelection cs = new ColumnSelection();
+    cs.addElement(0);
+    cs.addElement(513);
+    cs.addElement(1);
+    assertEquals(513, cs.getMax());
+    cs.removeElement(513);
+    assertEquals(1, cs.getMax());
+    cs.removeElement(1);
+    assertEquals(0, cs.getMax());
+    cs.addElement(512);
+    cs.addElement(513);
+    assertEquals(513, cs.getMax());
+
+  }
+
+  @Test(groups = { "Functional" })
+  public void testMinColumnSelection()
+  {
+    ColumnSelection cs = new ColumnSelection();
+    cs.addElement(0);
+    cs.addElement(513);
+    cs.addElement(1);
+    assertEquals(0, cs.getMin());
+    cs.removeElement(0);
+    assertEquals(1, cs.getMin());
+    cs.addElement(0);
+    assertEquals(0, cs.getMin());
+  }
 }
index b0f7fe5..3131ad7 100644 (file)
@@ -57,4 +57,22 @@ public class MappingTest
     assertEquals("[[1, 6], [11, 13], [15, 20]]", result);
   }
 
+  @Test(groups = { "Functional" })
+  public void testToString()
+  {
+    /*
+     * with no sequence
+     */
+    MapList fk = new MapList(new int[] { 1, 6, 8, 13 }, new int[] { 4, 7 },
+            3, 1);
+    Mapping m = new Mapping(fk);
+    assertEquals("[ [1, 6] [8, 13] ] 3:1 to [ [4, 7] ] ", m.toString());
+
+    /*
+     * with a sequence
+     */
+    SequenceI seq = new Sequence("Seq1", "");
+    m = new Mapping(seq, fk);
+    assertEquals("[ [1, 6] [8, 13] ] 3:1 to [ [4, 7] ] Seq1", m.toString());
+  }
 }
diff --git a/test/jalview/datamodel/MappingTypeTest.java b/test/jalview/datamodel/MappingTypeTest.java
new file mode 100644 (file)
index 0000000..64dc793
--- /dev/null
@@ -0,0 +1,43 @@
+package jalview.datamodel;
+
+import static org.testng.AssertJUnit.assertEquals;
+import static org.testng.AssertJUnit.assertSame;
+
+import jalview.datamodel.MappingType;
+
+import org.testng.annotations.Test;
+
+public class MappingTypeTest
+{
+
+  @Test(groups = "Functional")
+  public void testGetInverse()
+  {
+    assertSame(MappingType.PeptideToNucleotide,
+            MappingType.NucleotideToPeptide.getInverse());
+    assertSame(MappingType.NucleotideToPeptide,
+            MappingType.PeptideToNucleotide.getInverse());
+    assertSame(MappingType.NucleotideToNucleotide,
+            MappingType.NucleotideToNucleotide.getInverse());
+    assertSame(MappingType.PeptideToPeptide,
+            MappingType.PeptideToPeptide.getInverse());
+  }
+
+  @Test(groups = "Functional")
+  public void testGetFromRatio()
+  {
+    assertEquals(1, MappingType.NucleotideToNucleotide.getFromRatio());
+    assertEquals(1, MappingType.PeptideToNucleotide.getFromRatio());
+    assertEquals(1, MappingType.PeptideToPeptide.getFromRatio());
+    assertEquals(3, MappingType.NucleotideToPeptide.getFromRatio());
+  }
+
+  @Test(groups = "Functional")
+  public void testGetToRatio()
+  {
+    assertEquals(1, MappingType.NucleotideToNucleotide.getToRatio());
+    assertEquals(3, MappingType.PeptideToNucleotide.getToRatio());
+    assertEquals(1, MappingType.PeptideToPeptide.getToRatio());
+    assertEquals(1, MappingType.NucleotideToPeptide.getToRatio());
+  }
+}
index 3838ac8..ffcaa26 100644 (file)
@@ -22,8 +22,11 @@ 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.datamodel.SearchResults.Match;
+
 import org.testng.annotations.Test;
 
 public class SearchResultsTest
@@ -166,4 +169,24 @@ public class SearchResultsTest
     sr2.addResult(seq1, 6, 8);
     assertEquals(sr1.hashCode(), sr2.hashCode());
   }
+  
+  /**
+   * Verify that SearchResults$Match constructor normalises start/end to the
+   * 'forwards' direction
+   */
+  @Test(groups = { "Functional" })
+  public void testMatchConstructor()
+  {
+    SequenceI seq1 = new Sequence("", "abcdefghijklm");
+    Match m = new SearchResults().new Match(seq1, 2, 5);
+    assertSame(seq1, m.getSequence());
+    assertEquals(2, m.getStart());
+    assertEquals(5, m.getEnd());
+
+    // now a reverse mapping:
+    m = new SearchResults().new Match(seq1, 5, 2);
+    assertSame(seq1, m.getSequence());
+    assertEquals(2, m.getStart());
+    assertEquals(5, m.getEnd());
+  }
 }
index 705c773..8d3c878 100644 (file)
@@ -23,6 +23,8 @@ package jalview.datamodel;
 import static org.testng.AssertJUnit.assertEquals;
 import static org.testng.AssertJUnit.assertFalse;
 
+import jalview.util.Comparison;
+
 import org.testng.annotations.Test;
 
 /**
@@ -30,6 +32,29 @@ import org.testng.annotations.Test;
  */
 public class SeqCigarTest
 {
+  @Test(groups = { "Functional" })
+  public void testFindPosition()
+  {
+    SequenceI oseq = new Sequence("MySeq", "ASD---ASD---ASD", 37, 45);
+    oseq.createDatasetSequence();
+    SeqCigar cs = new SeqCigar(oseq);
+    assertEquals(oseq.getSequenceAsString(), cs.getSequenceString('-'));
+    for (int c = 0, cLen = oseq.getLength(); c < cLen; c++)
+    {
+      int os_p = oseq.findPosition(c);
+      int cigar_p = cs.findPosition(c);
+      if (Comparison.isGap(oseq.getCharAt(c)))
+      {
+        assertEquals("Expected gap at position " + os_p + " column " + c,
+                -1, cigar_p);
+      }
+      else
+      {
+        assertEquals("Positions don't match for at column " + c, os_p,
+                cigar_p);
+      }
+    }
+  }
   /*
    * refactored 'as is' from main method
    * 
index 229d0b1..e263843 100644 (file)
@@ -25,6 +25,7 @@ import static org.testng.AssertJUnit.assertTrue;
 
 import org.testng.annotations.Test;
 
+@Test
 public class SequenceDummyTest
 {
   /**
diff --git a/test/jalview/datamodel/SequenceFeatureTest.java b/test/jalview/datamodel/SequenceFeatureTest.java
new file mode 100644 (file)
index 0000000..82b260e
--- /dev/null
@@ -0,0 +1,153 @@
+package jalview.datamodel;
+
+import static org.testng.AssertJUnit.assertEquals;
+import static org.testng.AssertJUnit.assertFalse;
+import static org.testng.AssertJUnit.assertNull;
+import static org.testng.AssertJUnit.assertSame;
+import static org.testng.AssertJUnit.assertTrue;
+
+import org.testng.annotations.Test;
+
+public class SequenceFeatureTest
+{
+  @Test(groups = { "Functional" })
+  public void testCopyConstructor()
+  {
+    SequenceFeature sf1 = new SequenceFeature("type", "desc", 22, 33,
+            12.5f, "group");
+    sf1.setValue("STRAND", "+");
+    sf1.setValue("Note", "Testing");
+    Integer count = new Integer(7);
+    sf1.setValue("Count", count);
+
+    SequenceFeature sf2 = new SequenceFeature(sf1);
+    assertEquals("type", sf2.getType());
+    assertEquals("desc", sf2.getDescription());
+    assertEquals(22, sf2.getBegin());
+    assertEquals(33, sf2.getEnd());
+    assertEquals("+", sf2.getValue("STRAND"));
+    assertEquals("Testing", sf2.getValue("Note"));
+    // shallow clone of otherDetails map - contains the same object values!
+    assertSame(count, sf2.getValue("Count"));
+  }
+
+  /**
+   * Tests for retrieving a 'miscellaneous details' property value, with or
+   * without a supplied default
+   */
+  @Test(groups = { "Functional" })
+  public void testGetValue()
+  {
+    SequenceFeature sf1 = new SequenceFeature("type", "desc", 22, 33,
+            12.5f, "group");
+    sf1.setValue("STRAND", "+");
+    assertEquals("+", sf1.getValue("STRAND"));
+    assertNull(sf1.getValue("strand")); // case-sensitive
+    assertEquals(".", sf1.getValue("unknown", "."));
+    Integer i = new Integer(27);
+    assertSame(i, sf1.getValue("Unknown", i));
+  }
+
+  /**
+   * Tests the method that returns 1 / -1 / 0 for strand "+" / "-" / other
+   */
+  @Test(groups = { "Functional" })
+  public void testGetStrand()
+  {
+    SequenceFeature sf = new SequenceFeature("type", "desc", 22, 33, 12.5f,
+            "group");
+    assertEquals(0, sf.getStrand());
+    sf.setValue("STRAND", "+");
+    assertEquals(1, sf.getStrand());
+    sf.setValue("STRAND", "-");
+    assertEquals(-1, sf.getStrand());
+    sf.setValue("STRAND", ".");
+    assertEquals(0, sf.getStrand());
+  }
+
+  /**
+   * Tests for equality, and that equal objects have the same hashCode
+   */
+  @Test(groups = { "Functional" })
+  public void testEqualsAndHashCode()
+  {
+    SequenceFeature sf1 = new SequenceFeature("type", "desc", 22, 33,
+            12.5f, "group");
+    sf1.setValue("ID", "id");
+    sf1.setValue("Name", "name");
+    sf1.setValue("Parent", "parent");
+    sf1.setStrand("+");
+    sf1.setPhase("1");
+    SequenceFeature sf2 = new SequenceFeature("type", "desc", 22, 33,
+            12.5f, "group");
+    sf2.setValue("ID", "id");
+    sf2.setValue("Name", "name");
+    sf2.setValue("Parent", "parent");
+    sf2.setStrand("+");
+    sf2.setPhase("1");
+
+    assertFalse(sf1.equals(null));
+    assertTrue(sf1.equals(sf2));
+    assertTrue(sf2.equals(sf1));
+    assertEquals(sf1.hashCode(), sf2.hashCode());
+
+    // changing type breaks equals:
+    sf2.setType("Type");
+    assertFalse(sf1.equals(sf2));
+
+    // changing description breaks equals:
+    sf2.setType("type");
+    sf2.setDescription("Desc");
+    assertFalse(sf1.equals(sf2));
+
+    // changing start position breaks equals:
+    sf2.setDescription("desc");
+    sf2.setBegin(21);
+    assertFalse(sf1.equals(sf2));
+
+    // changing end position breaks equals:
+    sf2.setBegin(22);
+    sf2.setEnd(32);
+    assertFalse(sf1.equals(sf2));
+
+    // changing feature group breaks equals:
+    sf2.setEnd(33);
+    sf2.setFeatureGroup("Group");
+    assertFalse(sf1.equals(sf2));
+
+    // changing ID breaks equals:
+    sf2.setFeatureGroup("group");
+    sf2.setValue("ID", "id2");
+    assertFalse(sf1.equals(sf2));
+
+    // changing Name breaks equals:
+    sf2.setValue("ID", "id");
+    sf2.setValue("Name", "Name");
+    assertFalse(sf1.equals(sf2));
+
+    // changing Parent breaks equals:
+    sf2.setValue("Name", "name");
+    sf1.setValue("Parent", "Parent");
+    assertFalse(sf1.equals(sf2));
+
+    // changing strand breaks equals:
+    sf1.setValue("Parent", "parent");
+    sf2.setStrand("-");
+    assertFalse(sf1.equals(sf2));
+
+    // changing phase breaks equals:
+    sf2.setStrand("+");
+    sf1.setPhase("2");
+    assertFalse(sf1.equals(sf2));
+
+    // restore equality as sanity check:
+    sf1.setPhase("1");
+    assertTrue(sf1.equals(sf2));
+    assertTrue(sf2.equals(sf1));
+    assertEquals(sf1.hashCode(), sf2.hashCode());
+
+    // changing status doesn't change equals:
+    sf1.setStatus("new");
+    assertTrue(sf1.equals(sf2));
+  }
+}
index 9c306a3..ab11c09 100644 (file)
 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.assertNull;
 import static org.testng.AssertJUnit.assertSame;
 import static org.testng.AssertJUnit.assertTrue;
+import static org.testng.internal.junit.ArrayAsserts.assertArrayEquals;
+
+import jalview.datamodel.PDBEntry.Type;
 
 import java.util.Arrays;
 import java.util.List;
+import java.util.Vector;
 
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 public class SequenceTest
 {
-  SequenceI seq;
+  Sequence seq;
 
   @BeforeMethod(alwaysRun = true)
   public void setUp()
@@ -155,23 +161,22 @@ public class SequenceTest
     assertEquals(2, anns.length);
     assertSame(annotation, anns[0]);
     assertSame(annotation2, anns[1]);
-
   }
 
   @Test(groups = { "Functional" })
   public void testGetStartGetEnd()
   {
-    SequenceI seq = new Sequence("test", "ABCDEF");
-    assertEquals(1, seq.getStart());
-    assertEquals(6, seq.getEnd());
+    SequenceI sq = new Sequence("test", "ABCDEF");
+    assertEquals(1, sq.getStart());
+    assertEquals(6, sq.getEnd());
 
-    seq = new Sequence("test", "--AB-C-DEF--");
-    assertEquals(1, seq.getStart());
-    assertEquals(6, seq.getEnd());
+    sq = new Sequence("test", "--AB-C-DEF--");
+    assertEquals(1, sq.getStart());
+    assertEquals(6, sq.getEnd());
 
-    seq = new Sequence("test", "----");
-    assertEquals(1, seq.getStart());
-    assertEquals(0, seq.getEnd()); // ??
+    sq = new Sequence("test", "----");
+    assertEquals(1, sq.getStart());
+    assertEquals(0, sq.getEnd()); // ??
   }
 
   /**
@@ -181,24 +186,24 @@ public class SequenceTest
   @Test(groups = { "Functional" })
   public void testFindIndex()
   {
-    SequenceI seq = new Sequence("test", "ABCDEF");
-    assertEquals(0, seq.findIndex(0));
-    assertEquals(1, seq.findIndex(1));
-    assertEquals(5, seq.findIndex(5));
-    assertEquals(6, seq.findIndex(6));
-    assertEquals(6, seq.findIndex(9));
-
-    seq = new Sequence("test", "-A--B-C-D-E-F--");
-    assertEquals(2, seq.findIndex(1));
-    assertEquals(5, seq.findIndex(2));
-    assertEquals(7, seq.findIndex(3));
+    SequenceI sq = new Sequence("test", "ABCDEF");
+    assertEquals(0, sq.findIndex(0));
+    assertEquals(1, sq.findIndex(1));
+    assertEquals(5, sq.findIndex(5));
+    assertEquals(6, sq.findIndex(6));
+    assertEquals(6, sq.findIndex(9));
+
+    sq = new Sequence("test", "-A--B-C-D-E-F--");
+    assertEquals(2, sq.findIndex(1));
+    assertEquals(5, sq.findIndex(2));
+    assertEquals(7, sq.findIndex(3));
 
     // before start returns 0
-    assertEquals(0, seq.findIndex(0));
-    assertEquals(0, seq.findIndex(-1));
+    assertEquals(0, sq.findIndex(0));
+    assertEquals(0, sq.findIndex(-1));
 
     // beyond end returns last residue column
-    assertEquals(13, seq.findIndex(99));
+    assertEquals(13, sq.findIndex(99));
 
   }
 
@@ -209,65 +214,65 @@ public class SequenceTest
   @Test(groups = { "Functional" })
   public void testFindPosition()
   {
-    SequenceI seq = new Sequence("test", "ABCDEF");
-    assertEquals(1, seq.findPosition(0));
-    assertEquals(6, seq.findPosition(5));
+    SequenceI sq = new Sequence("test", "ABCDEF");
+    assertEquals(1, sq.findPosition(0));
+    assertEquals(6, sq.findPosition(5));
     // assertEquals(-1, seq.findPosition(6)); // fails
 
-    seq = new Sequence("test", "AB-C-D--");
-    assertEquals(1, seq.findPosition(0));
-    assertEquals(2, seq.findPosition(1));
+    sq = new Sequence("test", "AB-C-D--");
+    assertEquals(1, sq.findPosition(0));
+    assertEquals(2, sq.findPosition(1));
     // gap position 'finds' residue to the right (not the left as per javadoc)
-    assertEquals(3, seq.findPosition(2));
-    assertEquals(3, seq.findPosition(3));
-    assertEquals(4, seq.findPosition(4));
-    assertEquals(4, seq.findPosition(5));
+    assertEquals(3, sq.findPosition(2));
+    assertEquals(3, sq.findPosition(3));
+    assertEquals(4, sq.findPosition(4));
+    assertEquals(4, sq.findPosition(5));
     // returns 1 more than sequence length if off the end ?!?
-    assertEquals(5, seq.findPosition(6));
-    assertEquals(5, seq.findPosition(7));
-
-    seq = new Sequence("test", "--AB-C-DEF--");
-    assertEquals(1, seq.findPosition(0));
-    assertEquals(1, seq.findPosition(1));
-    assertEquals(1, seq.findPosition(2));
-    assertEquals(2, seq.findPosition(3));
-    assertEquals(3, seq.findPosition(4));
-    assertEquals(3, seq.findPosition(5));
-    assertEquals(4, seq.findPosition(6));
-    assertEquals(4, seq.findPosition(7));
-    assertEquals(5, seq.findPosition(8));
-    assertEquals(6, seq.findPosition(9));
-    assertEquals(7, seq.findPosition(10));
-    assertEquals(7, seq.findPosition(11));
+    assertEquals(5, sq.findPosition(6));
+    assertEquals(5, sq.findPosition(7));
+
+    sq = new Sequence("test", "--AB-C-DEF--");
+    assertEquals(1, sq.findPosition(0));
+    assertEquals(1, sq.findPosition(1));
+    assertEquals(1, sq.findPosition(2));
+    assertEquals(2, sq.findPosition(3));
+    assertEquals(3, sq.findPosition(4));
+    assertEquals(3, sq.findPosition(5));
+    assertEquals(4, sq.findPosition(6));
+    assertEquals(4, sq.findPosition(7));
+    assertEquals(5, sq.findPosition(8));
+    assertEquals(6, sq.findPosition(9));
+    assertEquals(7, sq.findPosition(10));
+    assertEquals(7, sq.findPosition(11));
   }
 
   @Test(groups = { "Functional" })
   public void testDeleteChars()
   {
-    SequenceI seq = new Sequence("test", "ABCDEF");
-    assertEquals(1, seq.getStart());
-    assertEquals(6, seq.getEnd());
-    seq.deleteChars(2, 3);
-    assertEquals("ABDEF", seq.getSequenceAsString());
-    assertEquals(1, seq.getStart());
-    assertEquals(5, seq.getEnd());
-
-    seq = new Sequence("test", "ABCDEF");
-    seq.deleteChars(0, 2);
-    assertEquals("CDEF", seq.getSequenceAsString());
-    assertEquals(3, seq.getStart());
-    assertEquals(6, seq.getEnd());
+    SequenceI sq = new Sequence("test", "ABCDEF");
+    assertEquals(1, sq.getStart());
+    assertEquals(6, sq.getEnd());
+    sq.deleteChars(2, 3);
+    assertEquals("ABDEF", sq.getSequenceAsString());
+    assertEquals(1, sq.getStart());
+    assertEquals(5, sq.getEnd());
+
+    sq = new Sequence("test", "ABCDEF");
+    sq.deleteChars(0, 2);
+    assertEquals("CDEF", sq.getSequenceAsString());
+    assertEquals(3, sq.getStart());
+    assertEquals(6, sq.getEnd());
   }
 
   @Test(groups = { "Functional" })
   public void testInsertCharAt()
   {
     // non-static methods:
-    SequenceI seq = new Sequence("test", "ABCDEF");
-    seq.insertCharAt(0, 'z');
-    assertEquals("zABCDEF", seq.getSequenceAsString());
-    seq.insertCharAt(2, 2, 'x');
-    assertEquals("zAxxBCDEF", seq.getSequenceAsString());
+    SequenceI sq = new Sequence("test", "ABCDEF");
+    sq.insertCharAt(0, 'z');
+    assertEquals("zABCDEF", sq.getSequenceAsString());
+    sq.insertCharAt(2, 2, 'x');
+    assertEquals("zAxxBCDEF", sq.getSequenceAsString());
 
     // for static method see StringUtilsTest
   }
@@ -279,9 +284,9 @@ public class SequenceTest
   @Test(groups = { "Functional" })
   public void testGapMap()
   {
-    SequenceI seq = new Sequence("test", "-A--B-CD-E--F-");
-    seq.createDatasetSequence();
-    assertEquals("[1, 4, 6, 7, 9, 12]", Arrays.toString(seq.gapMap()));
+    SequenceI sq = new Sequence("test", "-A--B-CD-E--F-");
+    sq.createDatasetSequence();
+    assertEquals("[1, 4, 6, 7, 9, 12]", Arrays.toString(sq.gapMap()));
   }
 
   /**
@@ -291,45 +296,52 @@ public class SequenceTest
   @Test(groups = { "Functional" })
   public void testGetSequenceFeatures()
   {
-    SequenceI seq = new Sequence("test", "GATCAT");
-    seq.createDatasetSequence();
+    SequenceI sq = new Sequence("test", "GATCAT");
+    sq.createDatasetSequence();
 
-    assertNull(seq.getSequenceFeatures());
+    assertNull(sq.getSequenceFeatures());
 
     /*
      * SequenceFeature on sequence
      */
     SequenceFeature sf = new SequenceFeature();
-    seq.addSequenceFeature(sf);
-    SequenceFeature[] sfs = seq.getSequenceFeatures();
+    sq.addSequenceFeature(sf);
+    SequenceFeature[] sfs = sq.getSequenceFeatures();
     assertEquals(1, sfs.length);
     assertSame(sf, sfs[0]);
 
+
     /*
      * SequenceFeature on sequence and dataset sequence; returns that on
      * sequence
+     * 
+     * Note JAL-2046: spurious: we have no use case for this at the moment.
+     * This test also buggy - as sf2.equals(sf), no new feature is added
      */
     SequenceFeature sf2 = new SequenceFeature();
-    seq.getDatasetSequence().addSequenceFeature(sf2);
-    sfs = seq.getSequenceFeatures();
+    sq.getDatasetSequence().addSequenceFeature(sf2);
+    sfs = sq.getSequenceFeatures();
     assertEquals(1, sfs.length);
     assertSame(sf, sfs[0]);
 
     /*
      * SequenceFeature on dataset sequence only
+     * Note JAL-2046: spurious: we have no use case for setting a non-dataset sequence's feature array to null at the moment.
      */
-    seq.setSequenceFeatures(null);
-    sfs = seq.getSequenceFeatures();
-    assertEquals(1, sfs.length);
-    assertSame(sf2, sfs[0]);
+    sq.setSequenceFeatures(null);
+    assertNull(sq.getDatasetSequence().getSequenceFeatures());
 
     /*
      * Corrupt case - no SequenceFeature, dataset's dataset is the original
      * sequence. Test shows no infinite loop results.
      */
-    seq.getDatasetSequence().setSequenceFeatures(null);
-    seq.getDatasetSequence().setDatasetSequence(seq); // loop!
-    assertNull(seq.getSequenceFeatures());
+    sq.getDatasetSequence().setSequenceFeatures(null);
+    /**
+     * is there a usecase for this ? setDatasetSequence should throw an error if
+     * this actually occurs.
+     */
+    sq.getDatasetSequence().setDatasetSequence(sq); // loop!
+    assertNull(sq.getSequenceFeatures());
   }
 
   /**
@@ -346,8 +358,8 @@ public class SequenceTest
      * right. Also it returns a non-existent residue position for a gap beyond
      * the sequence.
      */
-    Sequence seq = new Sequence("TestSeq", "AB.C-D E.");
-    int[] map = seq.findPositionMap();
+    Sequence sq = new Sequence("TestSeq", "AB.C-D E.");
+    int[] map = sq.findPositionMap();
     assertEquals(Arrays.toString(new int[] { 1, 2, 3, 3, 4, 4, 5, 5, 6 }),
             Arrays.toString(map));
   }
@@ -358,18 +370,18 @@ public class SequenceTest
   @Test(groups = { "Functional" })
   public void testGetSubsequence()
   {
-    SequenceI seq = new Sequence("TestSeq", "ABCDEFG");
-    seq.createDatasetSequence();
+    SequenceI sq = new Sequence("TestSeq", "ABCDEFG");
+    sq.createDatasetSequence();
 
     // positions are base 0, end position is exclusive
-    SequenceI subseq = seq.getSubSequence(2, 4);
+    SequenceI subseq = sq.getSubSequence(2, 4);
 
     assertEquals("CD", subseq.getSequenceAsString());
     // start/end are base 1 positions
     assertEquals(3, subseq.getStart());
     assertEquals(4, subseq.getEnd());
     // subsequence shares the full dataset sequence
-    assertSame(seq.getDatasetSequence(), subseq.getDatasetSequence());
+    assertSame(sq.getDatasetSequence(), subseq.getDatasetSequence());
   }
 
   /**
@@ -378,13 +390,23 @@ public class SequenceTest
   @Test(groups = { "Functional" })
   public void testDeriveSequence_existingDataset()
   {
-    SequenceI seq = new Sequence("Seq1", "CD");
-    seq.setDatasetSequence(new Sequence("Seq1", "ABCDEF"));
-    seq.setStart(3);
-    seq.setEnd(4);
-    SequenceI derived = seq.deriveSequence();
+    Sequence sq = new Sequence("Seq1", "CD");
+    sq.setDatasetSequence(new Sequence("Seq1", "ABCDEF"));
+    sq.getDatasetSequence().addSequenceFeature(
+            new SequenceFeature("", "", 1, 2, 0f, null));
+    sq.setStart(3);
+    sq.setEnd(4);
+
+    Sequence derived = (Sequence) sq.deriveSequence();
     assertEquals("CD", derived.getSequenceAsString());
-    assertSame(seq.getDatasetSequence(), derived.getDatasetSequence());
+    assertSame(sq.getDatasetSequence(), derived.getDatasetSequence());
+
+    assertNull(sq.sequenceFeatures);
+    assertNull(derived.sequenceFeatures);
+    // derived sequence should access dataset sequence features
+    assertNotNull(sq.getSequenceFeatures());
+    assertArrayEquals(sq.getSequenceFeatures(),
+            derived.getSequenceFeatures());
   }
 
   /**
@@ -393,10 +415,10 @@ public class SequenceTest
   @Test(groups = { "Functional" })
   public void testDeriveSequence_noDatasetUngapped()
   {
-    SequenceI seq = new Sequence("Seq1", "ABCDEF");
-    assertEquals(1, seq.getStart());
-    assertEquals(6, seq.getEnd());
-    SequenceI derived = seq.deriveSequence();
+    SequenceI sq = new Sequence("Seq1", "ABCDEF");
+    assertEquals(1, sq.getStart());
+    assertEquals(6, sq.getEnd());
+    SequenceI derived = sq.deriveSequence();
     assertEquals("ABCDEF", derived.getSequenceAsString());
     assertEquals("ABCDEF", derived.getDatasetSequence()
             .getSequenceAsString());
@@ -408,13 +430,124 @@ public class SequenceTest
   @Test(groups = { "Functional" })
   public void testDeriveSequence_noDatasetGapped()
   {
-    SequenceI seq = new Sequence("Seq1", "AB-C.D EF");
-    assertEquals(1, seq.getStart());
-    assertEquals(6, seq.getEnd());
-    assertNull(seq.getDatasetSequence());
-    SequenceI derived = seq.deriveSequence();
+    SequenceI sq = new Sequence("Seq1", "AB-C.D EF");
+    assertEquals(1, sq.getStart());
+    assertEquals(6, sq.getEnd());
+    assertNull(sq.getDatasetSequence());
+    SequenceI derived = sq.deriveSequence();
     assertEquals("AB-C.D EF", derived.getSequenceAsString());
     assertEquals("ABCDEF", derived.getDatasetSequence()
             .getSequenceAsString());
   }
+
+  @Test(groups = { "Functional" })
+  public void testCopyConstructor_noDataset()
+  {
+    SequenceI seq1 = new Sequence("Seq1", "AB-C.D EF");
+    seq1.setDescription("description");
+    seq1.addAlignmentAnnotation(new AlignmentAnnotation("label", "desc",
+            1.3d));
+    seq1.addSequenceFeature(new SequenceFeature("type", "desc", 22, 33,
+            12.4f, "group"));
+    seq1.addPDBId(new PDBEntry("1A70", "B", Type.PDB, "File"));
+    seq1.addDBRef(new DBRefEntry("EMBL", "1.2", "AZ12345"));
+    
+    SequenceI copy = new Sequence(seq1);
+
+    assertNull(copy.getDatasetSequence());
+
+    verifyCopiedSequence(seq1, copy);
+
+    // copy has a copy of the DBRefEntry
+    // this is murky - DBrefs are only copied for dataset sequences
+    // where the test for 'dataset sequence' is 'dataset is null'
+    // but that doesn't distinguish it from an aligned sequence
+    // which has not yet generated a dataset sequence
+    // NB getDBRef looks inside dataset sequence if not null
+    DBRefEntry[] dbrefs = copy.getDBRefs();
+    assertEquals(1, dbrefs.length);
+    assertFalse(dbrefs[0] == seq1.getDBRefs()[0]);
+    assertTrue(dbrefs[0].equals(seq1.getDBRefs()[0]));
+  }
+
+  @Test(groups = { "Functional" })
+  public void testCopyConstructor_withDataset()
+  {
+    SequenceI seq1 = new Sequence("Seq1", "AB-C.D EF");
+    seq1.createDatasetSequence();
+    seq1.setDescription("description");
+    seq1.addAlignmentAnnotation(new AlignmentAnnotation("label", "desc",
+            1.3d));
+    // JAL-2046 - what is the contract for using a derived sequence's
+    // addSequenceFeature ?
+    seq1.addSequenceFeature(new SequenceFeature("type", "desc", 22, 33,
+            12.4f, "group"));
+    seq1.addPDBId(new PDBEntry("1A70", "B", Type.PDB, "File"));
+    // here we add DBRef to the dataset sequence:
+    seq1.getDatasetSequence().addDBRef(
+            new DBRefEntry("EMBL", "1.2", "AZ12345"));
+
+    SequenceI copy = new Sequence(seq1);
+
+    assertNotNull(copy.getDatasetSequence());
+    assertSame(copy.getDatasetSequence(), seq1.getDatasetSequence());
+
+    verifyCopiedSequence(seq1, copy);
+
+    // getDBRef looks inside dataset sequence and this is shared,
+    // so holds the same dbref objects
+    DBRefEntry[] dbrefs = copy.getDBRefs();
+    assertEquals(1, dbrefs.length);
+    assertSame(dbrefs[0], seq1.getDBRefs()[0]);
+  }
+
+  /**
+   * Helper to make assertions about a copied sequence
+   * 
+   * @param seq1
+   * @param copy
+   */
+  protected void verifyCopiedSequence(SequenceI seq1, SequenceI copy)
+  {
+    // verify basic properties:
+    assertEquals(copy.getName(), seq1.getName());
+    assertEquals(copy.getDescription(), seq1.getDescription());
+    assertEquals(copy.getStart(), seq1.getStart());
+    assertEquals(copy.getEnd(), seq1.getEnd());
+    assertEquals(copy.getSequenceAsString(), seq1.getSequenceAsString());
+
+    // copy has a copy of the annotation:
+    AlignmentAnnotation[] anns = copy.getAnnotation();
+    assertEquals(1, anns.length);
+    assertFalse(anns[0] == seq1.getAnnotation()[0]);
+    assertEquals(anns[0].label, seq1.getAnnotation()[0].label);
+    assertEquals(anns[0].description, seq1.getAnnotation()[0].description);
+    assertEquals(anns[0].score, seq1.getAnnotation()[0].score);
+
+    // copy has a copy of the sequence feature:
+    SequenceFeature[] sfs = copy.getSequenceFeatures();
+    assertEquals(1, sfs.length);
+    if (seq1.getDatasetSequence()!=null && copy.getDatasetSequence()==seq1.getDatasetSequence()) {
+      assertTrue(sfs[0] == seq1.getSequenceFeatures()[0]);
+    } else {
+      assertFalse(sfs[0] == seq1.getSequenceFeatures()[0]);
+    }
+    assertTrue(sfs[0].equals(seq1.getSequenceFeatures()[0]));
+
+    // copy has a copy of the PDB entry
+    Vector<PDBEntry> pdbs = copy.getAllPDBEntries();
+    assertEquals(1, pdbs.size());
+    assertFalse(pdbs.get(0) == seq1.getAllPDBEntries().get(0));
+    assertTrue(pdbs.get(0).equals(seq1.getAllPDBEntries().get(0)));
+  }
+
+  @Test(groups = "Functional")
+  public void testGetCharAt()
+  {
+    SequenceI sq = new Sequence("", "abcde");
+    assertEquals('a', sq.getCharAt(0));
+    assertEquals('e', sq.getCharAt(4));
+    assertEquals(' ', sq.getCharAt(5));
+    assertEquals(' ', sq.getCharAt(-1));
+  }
 }
diff --git a/test/jalview/datamodel/xdb/embl/EmblEntryTest.java b/test/jalview/datamodel/xdb/embl/EmblEntryTest.java
new file mode 100644 (file)
index 0000000..9fffc45
--- /dev/null
@@ -0,0 +1,308 @@
+package jalview.datamodel.xdb.embl;
+
+import static org.testng.AssertJUnit.assertEquals;
+import static org.testng.AssertJUnit.assertSame;
+
+import jalview.util.MappingUtils;
+
+import java.util.Arrays;
+import java.util.Vector;
+
+import org.testng.annotations.Test;
+
+public class EmblEntryTest
+{
+  @Test(groups = "Functional")
+  public void testGetCdsRanges()
+  {
+    EmblEntry testee = new EmblEntry();
+
+    /*
+     * Make a (CDS) Feature with 4 locations
+     */
+    EmblFeature cds = new EmblFeature();
+    Vector<EmblFeatureLocations> locs = new Vector<EmblFeatureLocations>();
+    cds.setLocations(locs);
+
+    /*
+     * single range [10-20]
+     */
+    EmblFeatureLocations loc = new EmblFeatureLocations();
+    loc.setLocationType("single");
+    loc.setLocationComplement(false);
+    Vector<EmblFeatureLocElement> elements = new Vector<EmblFeatureLocElement>();
+    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<EmblFeatureLocElement>();
+    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<EmblFeatureLocElement>();
+    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<EmblFeatureLocElement>();
+    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);
+
+    int[] exons = testee.getCdsRanges(cds);
+    assertEquals("[10, 20, 40, 30, 50, 60, 70, 80, 120, 110, 100, 90]",
+            Arrays.toString(exons));
+  }
+
+  @Test(groups = "Functional")
+  public void testGetCdsRanges_badData()
+  {
+    EmblEntry testee = new EmblEntry();
+
+    /*
+     * Make a (CDS) Feature with 4 locations
+     */
+    EmblFeature cds = new EmblFeature();
+    Vector<EmblFeatureLocations> locs = new Vector<EmblFeatureLocations>();
+    cds.setLocations(locs);
+
+    /*
+     * single range [10-20]
+     */
+    EmblFeatureLocations loc = new EmblFeatureLocations();
+    loc.setLocationType("single");
+    loc.setLocationComplement(false);
+    Vector<EmblFeatureLocElement> elements = new Vector<EmblFeatureLocElement>();
+    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);
+
+    /*
+     * single range with missing end position - should be skipped
+     */
+    loc = new EmblFeatureLocations();
+    loc.setLocationType("single");
+    loc.setLocationComplement(false);
+    elements = new Vector<EmblFeatureLocElement>();
+    locElement = new EmblFeatureLocElement();
+    b1 = new BasePosition();
+    b1.setPos("30");
+    locElement.setBasePositions(new BasePosition[] { b1 });
+    elements.add(locElement);
+    loc.setLocElements(elements);
+    locs.add(loc);
+
+    /*
+     * single range with extra base position - should be skipped
+     */
+    loc = new EmblFeatureLocations();
+    loc.setLocationType("single");
+    loc.setLocationComplement(false);
+    elements = new Vector<EmblFeatureLocElement>();
+    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);
+
+    /*
+     * single valid range [50-60] to finish
+     */
+    loc = new EmblFeatureLocations();
+    loc.setLocationType("single");
+    loc.setLocationComplement(false);
+    elements = new Vector<EmblFeatureLocElement>();
+    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);
+
+    int[] exons = testee.getCdsRanges(cds);
+    assertEquals("[10, 20, 50, 60]", Arrays.toString(exons));
+  }
+
+  /**
+   * 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<EmblFeatureLocations> locs = new Vector<EmblFeatureLocations>();
+    cds.setLocations(locs);
+  
+    /*
+     * single range [10-20] for 'this' accession
+     */
+    EmblFeatureLocations loc = new EmblFeatureLocations();
+    loc.setLocationType("single");
+    loc.setLocationComplement(false);
+    Vector<EmblFeatureLocElement> elements = new Vector<EmblFeatureLocElement>();
+    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<EmblFeatureLocElement>();
+    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<EmblFeatureLocElement>();
+    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<EmblFeatureLocElement>();
+    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));
+  }
+}
index d7fd7e4..c6a94d7 100644 (file)
@@ -41,6 +41,7 @@ public class EmblFileTest
           + "<description>Chicken LDH-A mRNA for lactate dehydrogenase A chain (EC 1.1.1.27)</description>"
           + "<keyword>L-lactate dehydrogenase</keyword><keyword>chutney</keyword>"
           + "<dbreference db=\"EuropePMC\" primary=\"PMC1460223\" secondary=\"9649548\" />"
+          + "<dbreference db=\"MD5\" primary=\"d3b68\" />"
           + "<feature name=\"CDS\"><dbreference db=\"GOA\" primary=\"P00340\" secondary=\"2.1\" /><dbreference db=\"InterPro\" primary=\"IPR001236\" />"
           + "<qualifier name=\"note\"><value>L-lactate dehydrogenase A-chain</value><value>pickle</value></qualifier>"
           + "<qualifier name=\"translation\"><value>MSLKDHLIHN</value><evidence>Keith</evidence></qualifier>"
@@ -79,11 +80,16 @@ public class EmblFileTest
     /*
      * dbrefs
      */
-    assertEquals(1, entry.getDbRefs().size());
+    assertEquals(2, entry.getDbRefs().size());
     DBRefEntry dbref = entry.getDbRefs().get(0);
     assertEquals("EuropePMC", dbref.getSource());
     assertEquals("PMC1460223", dbref.getAccessionId());
     assertEquals("9649548", dbref.getVersion());
+    dbref = entry.getDbRefs().get(1);
+    assertEquals("MD5", dbref.getSource());
+    assertEquals("d3b68", dbref.getAccessionId());
+    // blank version has been converted to "0"
+    assertEquals("0", dbref.getVersion());
 
     /*
      * sequence features
@@ -99,7 +105,8 @@ public class EmblFileTest
     dbref = ef.getDbRefs().get(1);
     assertEquals("InterPro", dbref.getSource());
     assertEquals("IPR001236", dbref.getAccessionId());
-    assertEquals("", dbref.getVersion());
+    // blank version converted to "0":
+    assertEquals("0", dbref.getVersion());
     assertEquals(2, ef.getQualifiers().size());
 
     // feature qualifiers
@@ -142,5 +149,12 @@ public class EmblFileTest
     assertEquals("mRNA", seq.getType());
     assertEquals("2", seq.getVersion());
     assertEquals("GTGACG", seq.getSequence());
+
+    /*
+     * getSequence() converts empty DBRefEntry.version to "0"
+     */
+    assertEquals("0", entry.getDbRefs().get(1).getVersion());
+    assertEquals("0", entry.getFeatures().get(0).getDbRefs().get(1)
+            .getVersion());
   }
 }
diff --git a/test/jalview/ext/ensembl/ENSG00000157764.gff b/test/jalview/ext/ensembl/ENSG00000157764.gff
new file mode 100644 (file)
index 0000000..21cef29
--- /dev/null
@@ -0,0 +1,56 @@
+##gff-version 3
+# retrieved via http://rest.ensembl.org/overlap/id/ENSG00000157764?feature=gene&feature=transcript&feature=cds&content-type=text/x-gff3
+##sequence-region   7 140719327 140924764
+7      ensembl_havana  gene    140719327       140722790       .       +       .       ID=gene:ENSG00000090266;assembly_name=GRCh38;biotype=protein_coding;description=NADH dehydrogenase (ubiquinone) 1 beta subcomplex%2C 2%2C 8kDa [Source:HGNC Symbol%3BAcc:HGNC:7697];external_name=NDUFB2;logic_name=ensembl_havana_gene;version=11
+7      ensembl_havana  gene    140719327       140924764       .       -       .       ID=gene:ENSG00000157764;assembly_name=GRCh38;biotype=protein_coding;description=B-Raf proto-oncogene%2C serine/threonine kinase [Source:HGNC Symbol%3BAcc:HGNC:1097];external_name=BRAF;logic_name=ensembl_havana_gene;version=11
+7      ensembl snRNA_gene      140884072       140884178       .       +       .       ID=gene:ENSG00000271932;assembly_name=GRCh38;biotype=snRNA;description=RNA%2C U6 small nuclear 85%2C pseudogene [Source:HGNC Symbol%3BAcc:HGNC:47048];external_name=RNU6-85P;logic_name=ncrna;version=1
+7      ensembl_havana  transcript      140719327       140722790       .       +       .       ID=transcript:ENST00000476279;Parent=gene:ENSG00000090266;assembly_name=GRCh38;biotype=protein_coding;external_name=NDUFB2-003;logic_name=havana;version=4
+7      ensembl_havana  transcript      140719327       140721955       .       +       .       ID=transcript:ENST00000461457;Parent=gene:ENSG00000090266;assembly_name=GRCh38;biotype=protein_coding;external_name=NDUFB2-004;logic_name=havana;version=1
+7      ensembl_havana  transcript      140719327       140783157       .       -       .       ID=transcript:ENST00000496384;Parent=gene:ENSG00000157764;assembly_name=GRCh38;biotype=protein_coding;external_name=BRAF-003;logic_name=havana;version=5
+7      ensembl_havana  transcript      140734479       140924764       .       -       .       ID=transcript:ENST00000288602;Parent=gene:ENSG00000157764;assembly_name=GRCh38;biotype=protein_coding;external_name=BRAF-001;logic_name=ensembl_havana_transcript;version=9
+7      ensembl_havana  NMD_transcript_variant  140734521       140754211       .       -       .       ID=transcript:ENST00000479537;Parent=gene:ENSG00000157764;assembly_name=GRCh38;biotype=nonsense_mediated_decay;external_name=BRAF-005;logic_name=havana;version=4
+7      ensembl_havana  NMD_transcript_variant  140734597       140924658       .       -       .       ID=transcript:ENST00000497784;Parent=gene:ENSG00000157764;assembly_name=GRCh38;biotype=nonsense_mediated_decay;external_name=BRAF-002;logic_name=havana;version=1
+7      ensembl_havana  aberrant_processed_transcript   140834061       140924709       .       -       .       ID=transcript:ENST00000469930;Parent=gene:ENSG00000157764;assembly_name=GRCh38;biotype=retained_intron;external_name=BRAF-004;logic_name=havana;version=1
+7      ensembl snRNA   140884072       140884178       .       +       .       ID=transcript:ENST00000605989;Parent=gene:ENSG00000271932;assembly_name=GRCh38;biotype=snRNA;external_name=RNU6-85P-201;logic_name=ncrna;version=1
+7      havana  CDS     140696745       140696842       .       +       0       ID=CDS:ENSP00000419087;Parent=transcript:ENST00000476279;assembly_name=GRCh38
+7      havana  CDS     140702866       140703010       .       +       1       ID=CDS:ENSP00000419087;Parent=transcript:ENST00000476279;assembly_name=GRCh38
+7      havana  CDS     140704860       140704934       .       +       0       ID=CDS:ENSP00000419087;Parent=transcript:ENST00000476279;assembly_name=GRCh38
+7      havana  CDS     140696745       140696842       .       +       0       ID=CDS:ENSP00000420062;Parent=transcript:ENST00000461457;assembly_name=GRCh38
+7      havana  CDS     140721552       140721744       .       +       1       ID=CDS:ENSP00000420062;Parent=transcript:ENST00000461457;assembly_name=GRCh38
+7      havana  CDS     140783021       140783157       .       -       2       ID=CDS:ENSP00000419060;Parent=transcript:ENST00000496384;assembly_name=GRCh38
+7      havana  CDS     140781576       140781693       .       -       0       ID=CDS:ENSP00000419060;Parent=transcript:ENST00000496384;assembly_name=GRCh38
+7      havana  CDS     140777991       140778075       .       -       2       ID=CDS:ENSP00000419060;Parent=transcript:ENST00000496384;assembly_name=GRCh38
+7      havana  CDS     140776912       140777088       .       -       1       ID=CDS:ENSP00000419060;Parent=transcript:ENST00000496384;assembly_name=GRCh38
+7      havana  CDS     140754187       140754233       .       -       1       ID=CDS:ENSP00000419060;Parent=transcript:ENST00000496384;assembly_name=GRCh38
+7      havana  CDS     140753275       140753393       .       -       2       ID=CDS:ENSP00000419060;Parent=transcript:ENST00000496384;assembly_name=GRCh38
+7      havana  CDS     140749287       140749418       .       -       0       ID=CDS:ENSP00000419060;Parent=transcript:ENST00000496384;assembly_name=GRCh38
+7      havana  CDS     140739812       140739946       .       -       0       ID=CDS:ENSP00000419060;Parent=transcript:ENST00000496384;assembly_name=GRCh38
+7      havana  CDS     140734617       140734770       .       -       0       ID=CDS:ENSP00000419060;Parent=transcript:ENST00000496384;assembly_name=GRCh38
+7      havana  CDS     140726494       140726516       .       -       2       ID=CDS:ENSP00000419060;Parent=transcript:ENST00000496384;assembly_name=GRCh38
+7      ensembl_havana  CDS     140924566       140924703       .       -       0       ID=CDS:ENSP00000288602;Parent=transcript:ENST00000288602;assembly_name=GRCh38
+7      ensembl_havana  CDS     140850111       140850212       .       -       0       ID=CDS:ENSP00000288602;Parent=transcript:ENST00000288602;assembly_name=GRCh38
+7      ensembl_havana  CDS     140834609       140834872       .       -       0       ID=CDS:ENSP00000288602;Parent=transcript:ENST00000288602;assembly_name=GRCh38
+7      ensembl_havana  CDS     140808892       140808995       .       -       0       ID=CDS:ENSP00000288602;Parent=transcript:ENST00000288602;assembly_name=GRCh38
+7      ensembl_havana  CDS     140807960       140808062       .       -       1       ID=CDS:ENSP00000288602;Parent=transcript:ENST00000288602;assembly_name=GRCh38
+7      ensembl_havana  CDS     140801412       140801560       .       -       0       ID=CDS:ENSP00000288602;Parent=transcript:ENST00000288602;assembly_name=GRCh38
+7      ensembl_havana  CDS     140800362       140800481       .       -       1       ID=CDS:ENSP00000288602;Parent=transcript:ENST00000288602;assembly_name=GRCh38
+7      ensembl_havana  CDS     140794308       140794467       .       -       1       ID=CDS:ENSP00000288602;Parent=transcript:ENST00000288602;assembly_name=GRCh38
+7      ensembl_havana  CDS     140787548       140787584       .       -       0       ID=CDS:ENSP00000288602;Parent=transcript:ENST00000288602;assembly_name=GRCh38
+7      ensembl_havana  CDS     140783021       140783157       .       -       2       ID=CDS:ENSP00000288602;Parent=transcript:ENST00000288602;assembly_name=GRCh38
+7      ensembl_havana  CDS     140781576       140781693       .       -       0       ID=CDS:ENSP00000288602;Parent=transcript:ENST00000288602;assembly_name=GRCh38
+7      ensembl_havana  CDS     140777991       140778075       .       -       2       ID=CDS:ENSP00000288602;Parent=transcript:ENST00000288602;assembly_name=GRCh38
+7      ensembl_havana  CDS     140776912       140777088       .       -       1       ID=CDS:ENSP00000288602;Parent=transcript:ENST00000288602;assembly_name=GRCh38
+7      ensembl_havana  CDS     140754187       140754233       .       -       1       ID=CDS:ENSP00000288602;Parent=transcript:ENST00000288602;assembly_name=GRCh38
+7      ensembl_havana  CDS     140753275       140753393       .       -       2       ID=CDS:ENSP00000288602;Parent=transcript:ENST00000288602;assembly_name=GRCh38
+7      ensembl_havana  CDS     140749287       140749418       .       -       0       ID=CDS:ENSP00000288602;Parent=transcript:ENST00000288602;assembly_name=GRCh38
+7      ensembl_havana  CDS     140739812       140739946       .       -       0       ID=CDS:ENSP00000288602;Parent=transcript:ENST00000288602;assembly_name=GRCh38
+7      ensembl_havana  CDS     140734597       140734770       .       -       0       ID=CDS:ENSP00000288602;Parent=transcript:ENST00000288602;assembly_name=GRCh38
+7      havana  CDS     140754187       140754211       .       -       0       ID=CDS:ENSP00000418033;Parent=transcript:ENST00000479537;assembly_name=GRCh38
+7      havana  CDS     140753275       140753393       .       -       2       ID=CDS:ENSP00000418033;Parent=transcript:ENST00000479537;assembly_name=GRCh38
+7      havana  CDS     140749287       140749418       .       -       0       ID=CDS:ENSP00000418033;Parent=transcript:ENST00000479537;assembly_name=GRCh38
+7      havana  CDS     140747415       140747447       .       -       0       ID=CDS:ENSP00000418033;Parent=transcript:ENST00000479537;assembly_name=GRCh38
+7      havana  CDS     140924566       140924658       .       -       0       ID=CDS:ENSP00000420119;Parent=transcript:ENST00000497784;assembly_name=GRCh38
+7      havana  CDS     140850111       140850212       .       -       0       ID=CDS:ENSP00000420119;Parent=transcript:ENST00000497784;assembly_name=GRCh38
+7      havana  CDS     140834609       140834872       .       -       0       ID=CDS:ENSP00000420119;Parent=transcript:ENST00000497784;assembly_name=GRCh38
+7      havana  CDS     140808892       140808995       .       -       0       ID=CDS:ENSP00000420119;Parent=transcript:ENST00000497784;assembly_name=GRCh38
+7      havana  CDS     140808295       140808316       .       -       1       ID=CDS:ENSP00000420119;Parent=transcript:ENST00000497784;assembly_name=GRCh38
diff --git a/test/jalview/ext/ensembl/EnsemblCdnaTest.java b/test/jalview/ext/ensembl/EnsemblCdnaTest.java
new file mode 100644 (file)
index 0000000..90c38d4
--- /dev/null
@@ -0,0 +1,251 @@
+package jalview.ext.ensembl;
+
+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.SequenceDummy;
+import jalview.datamodel.SequenceFeature;
+import jalview.datamodel.SequenceI;
+import jalview.io.gff.SequenceOntologyFactory;
+import jalview.io.gff.SequenceOntologyLite;
+import jalview.util.MapList;
+
+import java.util.List;
+
+import org.testng.Assert;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+public class EnsemblCdnaTest
+{
+  @BeforeClass
+  public void setUp()
+  {
+    SequenceOntologyFactory.setInstance(new SequenceOntologyLite());
+  }
+
+  @AfterClass
+  public void tearDown()
+  {
+    SequenceOntologyFactory.setInstance(null);
+  }
+  /**
+   * Test that the cdna part of genomic sequence is correctly identified by
+   * 'exon' features (or subtypes) - reverse strand case.
+   */
+  @Test(groups = "Functional")
+  public void testGetGenomicRangesFromFeatures_reverseStrand()
+  {
+    EnsemblCdna testee = new EnsemblCdna();
+    SequenceI genomic = new SequenceDummy("chr7");
+    genomic.setStart(10000);
+    genomic.setEnd(50000);
+    String transcriptId = "ABC123";
+
+    // exon at (start+10000) length 501
+    SequenceFeature sf = new SequenceFeature("exon", "", 20000, 20500, 0f,
+            null);
+    sf.setValue("Parent", "transcript:" + transcriptId);
+    sf.setStrand("-");
+    genomic.addSequenceFeature(sf);
+
+    // exon (sub-type) at (start + exon_variant) length 101
+    sf = new SequenceFeature("coding_exon", "", 10500, 10600, 0f, null);
+    sf.setValue("Parent", "transcript:" + transcriptId);
+    sf.setStrand("-");
+    genomic.addSequenceFeature(sf);
+
+    // exon belonging to a different transcript doesn't count
+    sf = new SequenceFeature("exon", "", 11500, 12600, 0f, null);
+    sf.setValue("Parent", "transcript:anotherOne");
+    genomic.addSequenceFeature(sf);
+
+    // transcript feature doesn't count
+    sf = new SequenceFeature("transcript", "", 10000, 50000, 0f, null);
+    genomic.addSequenceFeature(sf);
+
+    MapList ranges = testee.getGenomicRangesFromFeatures(genomic,
+            transcriptId, 23);
+    List<int[]> fromRanges = ranges.getFromRanges();
+    assertEquals(2, fromRanges.size());
+
+    /*
+     * from ranges should be sorted by start order descending
+     * and hold mappings from reverse strand sense
+     */
+    assertEquals(20500, fromRanges.get(0)[0]);
+    assertEquals(20000, fromRanges.get(0)[1]);
+    assertEquals(10600, fromRanges.get(1)[0]);
+    assertEquals(10500, fromRanges.get(1)[1]);
+    // to range should start from given start numbering
+    List<int[]> toRanges = ranges.getToRanges();
+    assertEquals(1, toRanges.size());
+    assertEquals(23, toRanges.get(0)[0]);
+    assertEquals(624, toRanges.get(0)[1]);
+  }
+
+  /**
+   * Test that the cdna part of genomic sequence is correctly identified by
+   * 'exon' features (or subtypes) with the desired transcript as parent
+   */
+  @Test(groups = "Functional")
+  public void testGetGenomicRangesFromFeatures()
+  {
+    EnsemblCdna testee = new EnsemblCdna();
+    SequenceI genomic = new SequenceDummy("chr7");
+    genomic.setStart(10000);
+    genomic.setEnd(50000);
+    String transcriptId = "ABC123";
+  
+    // exon at (start+10000) length 501
+    SequenceFeature sf = new SequenceFeature("exon", "", 20000, 20500, 0f,
+            null);
+    sf.setValue("Parent", "transcript:" + transcriptId);
+    sf.setStrand("+");
+    genomic.addSequenceFeature(sf);
+  
+    // exon (sub-type) at (start + exon_variant) length 101
+    sf = new SequenceFeature("coding_exon", "", 10500, 10600, 0f, null);
+    sf.setValue("Parent", "transcript:" + transcriptId);
+    sf.setStrand("+");
+    genomic.addSequenceFeature(sf);
+  
+    // exon belonging to a different transcript doesn't count
+    sf = new SequenceFeature("exon", "", 11500, 12600, 0f, null);
+    sf.setValue("Parent", "transcript:anotherOne");
+    genomic.addSequenceFeature(sf);
+  
+    // transcript feature doesn't count
+    sf = new SequenceFeature("transcript", "", 10000, 50000, 0f, null);
+    sf.setStrand("-"); // weird but ignored
+    genomic.addSequenceFeature(sf);
+  
+    MapList ranges = testee.getGenomicRangesFromFeatures(genomic,
+            transcriptId, 23);
+    List<int[]> fromRanges = ranges.getFromRanges();
+    assertEquals(2, fromRanges.size());
+    // from ranges should be sorted by start order
+    assertEquals(10500, fromRanges.get(0)[0]);
+    assertEquals(10600, fromRanges.get(0)[1]);
+    assertEquals(20000, fromRanges.get(1)[0]);
+    assertEquals(20500, fromRanges.get(1)[1]);
+    // to range should start from given start numbering
+    List<int[]> toRanges = ranges.getToRanges();
+    assertEquals(1, toRanges.size());
+    assertEquals(23, toRanges.get(0)[0]);
+    assertEquals(624, toRanges.get(0)[1]);
+  }
+
+  /**
+   * The method under test should give up and return null if both forward and
+   * reverse strands are present in the features of interest
+   */
+  @Test(groups = "Functional")
+  public void testGetGenomicRangesFromFeatures_mixedStrand()
+  {
+    EnsemblCdna testee = new EnsemblCdna();
+    SequenceI genomic = new SequenceDummy("chr7");
+    genomic.setStart(10000);
+    genomic.setEnd(50000);
+    String transcriptId = "ABC123";
+  
+    SequenceFeature sf = new SequenceFeature("exon", "", 20000, 20500, 0f,
+            null);
+    sf.setValue("Parent", "transcript:" + transcriptId);
+    sf.setStrand("-");
+    genomic.addSequenceFeature(sf);
+  
+    sf = new SequenceFeature("coding_exon", "", 10500, 10600, 0f, null);
+    sf.setValue("Parent", "transcript:" + transcriptId);
+    sf.setStrand("+");
+    genomic.addSequenceFeature(sf);
+  
+    MapList ranges = testee.getGenomicRangesFromFeatures(genomic,
+            transcriptId, 23);
+    assertNull(ranges);
+  }
+
+  /**
+   * Test the method that retains features except for 'transcript' (or
+   * subtypes), or features with parent other than the given id
+   */
+  @Test(groups = "Functional")
+  public void testRetainFeature()
+  {
+    String accId = "ABC123";
+    EnsemblCdna testee = new EnsemblCdna();
+
+    SequenceFeature sf = new SequenceFeature("transcript", "", 20000,
+            20500, 0f, null);
+    assertFalse(testee.retainFeature(sf, accId));
+
+    sf.setType("aberrant_processed_transcript");
+    assertFalse(testee.retainFeature(sf, accId));
+
+    sf.setType("NMD_transcript_variant");
+    assertFalse(testee.retainFeature(sf, accId));
+
+    // other feature with no parent is retained
+    sf.setType("sequence_variant");
+    assertTrue(testee.retainFeature(sf, accId));
+
+    // other feature with desired parent is retained
+    sf.setValue("Parent", "transcript:" + accId);
+    assertTrue(testee.retainFeature(sf, accId));
+
+    // feature with wrong parent is not retained
+    sf.setValue("Parent", "transcript:XYZ");
+    assertFalse(testee.retainFeature(sf, accId));
+  }
+
+  /**
+   * Test the method that picks out 'exon' (or subtype) features with the
+   * accession id as parent
+   */
+  @Test(groups = "Functional")
+  public void testIdentifiesSequence()
+  {
+    String accId = "ABC123";
+    EnsemblCdna testee = new EnsemblCdna();
+
+    // exon with no parent not valid
+    SequenceFeature sf = new SequenceFeature("exon", "", 1, 2, 0f, null);
+    assertFalse(testee.identifiesSequence(sf, accId));
+
+    // exon with wrong parent not valid
+    sf.setValue("Parent", "transcript:XYZ");
+    assertFalse(testee.identifiesSequence(sf, accId));
+
+    // exon with right parent is valid
+    sf.setValue("Parent", "transcript:" + accId);
+    assertTrue(testee.identifiesSequence(sf, accId));
+
+    // exon sub-type with right parent is valid
+    sf.setType("coding_exon");
+    assertTrue(testee.identifiesSequence(sf, accId));
+
+    // transcript not valid:
+    sf.setType("transcript");
+    assertFalse(testee.identifiesSequence(sf, accId));
+
+    // CDS not valid:
+    sf.setType("CDS");
+    assertFalse(testee.identifiesSequence(sf, accId));
+  }
+
+  @Test(groups = "Functional")
+  public void testIsValidReference() throws Exception
+  {
+    EnsemblSequenceFetcher esq = new EnsemblCdna();
+    Assert.assertTrue(esq.isValidReference("CCDS5863.1"));
+    Assert.assertTrue(esq.isValidReference("ENST00000288602"));
+    Assert.assertTrue(esq.isValidReference("ENSG00000288602"));
+    Assert.assertFalse(esq.isValidReference("ENSP00000288602"));
+    Assert.assertFalse(esq.isValidReference("ENST0000288602"));
+    // non-human species having a 3 character identifier included:
+    Assert.assertTrue(esq.isValidReference("ENSMUSG00000099398"));
+  }
+}
diff --git a/test/jalview/ext/ensembl/EnsemblCdsTest.java b/test/jalview/ext/ensembl/EnsemblCdsTest.java
new file mode 100644 (file)
index 0000000..183f933
--- /dev/null
@@ -0,0 +1,168 @@
+package jalview.ext.ensembl;
+
+import static org.testng.AssertJUnit.assertEquals;
+import static org.testng.AssertJUnit.assertFalse;
+import static org.testng.AssertJUnit.assertTrue;
+
+import jalview.datamodel.SequenceDummy;
+import jalview.datamodel.SequenceFeature;
+import jalview.datamodel.SequenceI;
+import jalview.io.gff.SequenceOntologyFactory;
+import jalview.io.gff.SequenceOntologyLite;
+import jalview.util.MapList;
+
+import java.util.List;
+
+import org.testng.Assert;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+public class EnsemblCdsTest
+{
+  @BeforeClass
+  public void setUp()
+  {
+    SequenceOntologyFactory.setInstance(new SequenceOntologyLite());
+  }
+
+  @AfterClass
+  public void tearDown()
+  {
+    SequenceOntologyFactory.setInstance(null);
+  }
+
+  /**
+   * Test that the cdna part of genomic sequence is correctly identified by
+   * 'CDS' features (or subtypes) with the desired transcript as parent
+   */
+  @Test(groups = "Functional")
+  public void testGetGenomicRangesFromFeatures()
+  {
+    EnsemblCds testee = new EnsemblCds();
+    SequenceI genomic = new SequenceDummy("chr7");
+    genomic.setStart(10000);
+    genomic.setEnd(50000);
+    String transcriptId = "ABC123";
+  
+    // CDS at (start+10000) length 501
+    SequenceFeature sf = new SequenceFeature("CDS", "", 20000, 20500, 0f,
+            null);
+    sf.setValue("Parent", "transcript:" + transcriptId);
+    sf.setStrand("+");
+    genomic.addSequenceFeature(sf);
+  
+    // CDS (sub-type) at (start + 10500) length 101
+    sf = new SequenceFeature("CDS_predicted", "", 10500, 10600, 0f, null);
+    sf.setValue("Parent", "transcript:" + transcriptId);
+    sf.setStrand("+");
+    genomic.addSequenceFeature(sf);
+  
+    // CDS belonging to a different transcript doesn't count
+    sf = new SequenceFeature("CDS", "", 11500, 12600, 0f, null);
+    sf.setValue("Parent", "transcript:anotherOne");
+    genomic.addSequenceFeature(sf);
+  
+    // exon feature doesn't count
+    sf = new SequenceFeature("exon", "", 10000, 50000, 0f, null);
+    genomic.addSequenceFeature(sf);
+
+    // mRNA_region feature doesn't count (parent of CDS)
+    sf = new SequenceFeature("mRNA_region", "", 10000, 50000, 0f, null);
+    genomic.addSequenceFeature(sf);
+  
+    MapList ranges = testee.getGenomicRangesFromFeatures(genomic,
+            transcriptId, 23);
+    List<int[]> fromRanges = ranges.getFromRanges();
+    assertEquals(2, fromRanges.size());
+    // from ranges should be sorted by start order
+    assertEquals(10500, fromRanges.get(0)[0]);
+    assertEquals(10600, fromRanges.get(0)[1]);
+    assertEquals(20000, fromRanges.get(1)[0]);
+    assertEquals(20500, fromRanges.get(1)[1]);
+    // to range should start from given start numbering
+    List<int[]> toRanges = ranges.getToRanges();
+    assertEquals(1, toRanges.size());
+    assertEquals(23, toRanges.get(0)[0]);
+    assertEquals(624, toRanges.get(0)[1]);
+  }
+
+  /**
+   * Test the method that retains features except for 'CDS' (or subtypes), or
+   * features with parent other than the given id
+   */
+  @Test(groups = "Functional")
+  public void testRetainFeature()
+  {
+    String accId = "ABC123";
+    EnsemblCds testee = new EnsemblCds();
+  
+    SequenceFeature sf = new SequenceFeature("CDS", "", 20000,
+            20500, 0f, null);
+    assertFalse(testee.retainFeature(sf, accId));
+  
+    sf.setType("CDS_predicted");
+    assertFalse(testee.retainFeature(sf, accId));
+  
+    // other feature with no parent is retained
+    sf.setType("sequence_variant");
+    assertTrue(testee.retainFeature(sf, accId));
+  
+    // other feature with desired parent is retained
+    sf.setValue("Parent", "transcript:" + accId);
+    assertTrue(testee.retainFeature(sf, accId));
+  
+    // feature with wrong parent is not retained
+    sf.setValue("Parent", "transcript:XYZ");
+    assertFalse(testee.retainFeature(sf, accId));
+  }
+
+  /**
+   * Test the method that picks out 'CDS' (or subtype) features with the
+   * accession id as parent
+   */
+  @Test(groups = "Functional")
+  public void testIdentifiesSequence()
+  {
+    String accId = "ABC123";
+    EnsemblCds testee = new EnsemblCds();
+  
+    // cds with no parent not valid
+    SequenceFeature sf = new SequenceFeature("CDS", "", 1, 2, 0f, null);
+    assertFalse(testee.identifiesSequence(sf, accId));
+  
+    // cds with wrong parent not valid
+    sf.setValue("Parent", "transcript:XYZ");
+    assertFalse(testee.identifiesSequence(sf, accId));
+  
+    // cds with right parent is valid
+    sf.setValue("Parent", "transcript:" + accId);
+    assertTrue(testee.identifiesSequence(sf, accId));
+  
+    // cds sub-type with right parent is valid
+    sf.setType("CDS_predicted");
+    assertTrue(testee.identifiesSequence(sf, accId));
+  
+    // transcript not valid:
+    sf.setType("transcript");
+    assertFalse(testee.identifiesSequence(sf, accId));
+  
+    // exon not valid:
+    sf.setType("exon");
+    assertFalse(testee.identifiesSequence(sf, accId));
+  }
+
+  @Test(groups = "Functional")
+  public void testIsValidReference() throws Exception
+  {
+    EnsemblSequenceFetcher esq = new EnsemblCds();
+    Assert.assertTrue(esq.isValidReference("CCDS5863.1"));
+    Assert.assertTrue(esq.isValidReference("ENST00000288602"));
+    Assert.assertTrue(esq.isValidReference("ENSG00000288602"));
+    Assert.assertTrue(esq.isValidReference("ENSP00000288602"));
+    Assert.assertFalse(esq.isValidReference("ENST0000288602"));
+    // non-human species have a 3 character identifier included:
+    Assert.assertTrue(esq.isValidReference("ENSMUSG00000099398"));
+  }
+
+}
diff --git a/test/jalview/ext/ensembl/EnsemblGeneTest.java b/test/jalview/ext/ensembl/EnsemblGeneTest.java
new file mode 100644 (file)
index 0000000..5cf296c
--- /dev/null
@@ -0,0 +1,265 @@
+package jalview.ext.ensembl;
+
+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.api.FeatureSettingsModelI;
+import jalview.datamodel.SequenceDummy;
+import jalview.datamodel.SequenceFeature;
+import jalview.datamodel.SequenceI;
+import jalview.io.gff.SequenceOntologyFactory;
+import jalview.io.gff.SequenceOntologyLite;
+import jalview.util.MapList;
+
+import java.awt.Color;
+import java.util.List;
+
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+public class EnsemblGeneTest
+{
+  @BeforeClass
+  public void setUp()
+  {
+    SequenceOntologyFactory.setInstance(new SequenceOntologyLite());
+  }
+
+  @AfterClass
+  public void tearDown()
+  {
+    SequenceOntologyFactory.setInstance(null);
+  }
+
+  /**
+   * Test that the gene part of genomic sequence is uniquely identified by a
+   * 'gene' features (or subtype) with the correct gene ID
+   */
+  @Test(groups = "Functional")
+  public void testGetGenomicRangesFromFeatures()
+  {
+    EnsemblGene testee = new EnsemblGene();
+    SequenceI genomic = new SequenceDummy("chr7");
+    genomic.setStart(10000);
+    genomic.setEnd(50000);
+    String geneId = "ABC123";
+
+    // gene at (start+10000) length 501
+    SequenceFeature sf = new SequenceFeature("gene", "", 20000, 20500, 0f,
+            null);
+    sf.setValue("ID", "gene:" + geneId);
+    sf.setStrand("+");
+    genomic.addSequenceFeature(sf);
+
+    // gene at (start + 10500) length 101
+    // should be ignored - the first 'gene' found defines the whole range
+    sf = new SequenceFeature("gene", "", 10500, 10600, 0f, null);
+    sf.setValue("ID", "gene:" + geneId);
+    sf.setStrand("+");
+    genomic.addSequenceFeature(sf);
+
+    MapList ranges = testee.getGenomicRangesFromFeatures(genomic, geneId,
+            23);
+    List<int[]> fromRanges = ranges.getFromRanges();
+    assertEquals(1, fromRanges.size());
+    assertEquals(20000, fromRanges.get(0)[0]);
+    assertEquals(20500, fromRanges.get(0)[1]);
+    // to range should start from given start numbering
+    List<int[]> toRanges = ranges.getToRanges();
+    assertEquals(1, toRanges.size());
+    assertEquals(23, toRanges.get(0)[0]);
+    assertEquals(523, toRanges.get(0)[1]);
+  }
+
+  /**
+   * Test variant using a sub-type of gene from the Sequence Ontology
+   */
+  @Test(groups = "Functional")
+  public void testGetGenomicRangesFromFeatures_ncRNA_gene_reverseStrand()
+  {
+    EnsemblGene testee = new EnsemblGene();
+    SequenceI genomic = new SequenceDummy("chr7");
+    genomic.setStart(10000);
+    genomic.setEnd(50000);
+    String geneId = "ABC123";
+
+    // gene at (start+10000) length 501
+    SequenceFeature sf = new SequenceFeature("ncRNA_gene", "", 20000,
+            20500, 0f, null);
+    sf.setValue("ID", "gene:" + geneId);
+    sf.setStrand("-");
+    genomic.addSequenceFeature(sf);
+
+    // gene at (start + 10500) length 101
+    // should be ignored - the first 'gene' found defines the whole range
+    // (real data would only have one such feature)
+    sf = new SequenceFeature("gene", "", 10500, 10600, 0f, null);
+    sf.setValue("ID", "gene:" + geneId);
+    sf.setStrand("+");
+    genomic.addSequenceFeature(sf);
+
+    MapList ranges = testee.getGenomicRangesFromFeatures(genomic, geneId,
+            23);
+    List<int[]> fromRanges = ranges.getFromRanges();
+    assertEquals(1, fromRanges.size());
+    // from range on reverse strand:
+    assertEquals(20500, fromRanges.get(0)[0]);
+    assertEquals(20000, fromRanges.get(0)[1]);
+    // to range should start from given start numbering
+    List<int[]> toRanges = ranges.getToRanges();
+    assertEquals(1, toRanges.size());
+    assertEquals(23, toRanges.get(0)[0]);
+    assertEquals(523, toRanges.get(0)[1]);
+  }
+
+  /**
+   * Test the method that extracts transcript (or subtype) features with a
+   * specified gene as parent
+   */
+  @Test(groups = "Functional")
+  public void testGetTranscriptFeatures()
+  {
+    SequenceI genomic = new SequenceDummy("chr7");
+    genomic.setStart(10000);
+    genomic.setEnd(50000);
+    String geneId = "ABC123";
+
+    // transcript feature
+    SequenceFeature sf1 = new SequenceFeature("transcript", "", 20000,
+            20500, 0f, null);
+    sf1.setValue("Parent", "gene:" + geneId);
+    sf1.setValue("transcript_id", "transcript1");
+    genomic.addSequenceFeature(sf1);
+
+    // transcript sub-type feature
+    SequenceFeature sf2 = new SequenceFeature("snRNA", "", 20000,
+            20500, 0f, null);
+    sf2.setValue("Parent", "gene:" + geneId);
+    sf2.setValue("transcript_id", "transcript2");
+    genomic.addSequenceFeature(sf2);
+
+    // NMD_transcript_variant treated like transcript in Ensembl
+    SequenceFeature sf3 = new SequenceFeature("NMD_transcript_variant", "",
+            20000, 20500, 0f, null);
+    sf3.setValue("Parent", "gene:" + geneId);
+    sf3.setValue("transcript_id", "transcript3");
+    genomic.addSequenceFeature(sf3);
+
+    // transcript for a different gene - ignored
+    SequenceFeature sf4 = new SequenceFeature("snRNA", "", 20000, 20500,
+            0f, null);
+    sf4.setValue("Parent", "gene:XYZ");
+    sf4.setValue("transcript_id", "transcript4");
+    genomic.addSequenceFeature(sf4);
+
+    EnsemblGene testee = new EnsemblGene();
+
+    /*
+     * with no filter
+     */
+    List<SequenceFeature> features = testee.getTranscriptFeatures(geneId,
+            genomic);
+    assertEquals(3, features.size());
+    assertSame(sf1, features.get(0));
+    assertSame(sf2, features.get(1));
+    assertSame(sf3, features.get(2));
+  }
+
+  /**
+   * Test the method that retains features except for 'gene', or 'transcript'
+   * with parent other than the given id
+   */
+  @Test(groups = "Functional")
+  public void testRetainFeature()
+  {
+    String geneId = "ABC123";
+    EnsemblGene testee = new EnsemblGene();
+    SequenceFeature sf = new SequenceFeature("gene", "", 20000,
+            20500, 0f, null);
+    sf.setValue("ID", "gene:" + geneId);
+    assertFalse(testee.retainFeature(sf, geneId));
+
+    sf.setType("transcript");
+    sf.setValue("Parent", "gene:" + geneId);
+    assertTrue(testee.retainFeature(sf, geneId));
+
+    sf.setType("mature_transcript");
+    sf.setValue("Parent", "gene:" + geneId);
+    assertTrue(testee.retainFeature(sf, geneId));
+
+    sf.setType("NMD_transcript_variant");
+    sf.setValue("Parent", "gene:" + geneId);
+    assertTrue(testee.retainFeature(sf, geneId));
+
+    sf.setValue("Parent", "gene:XYZ");
+    assertFalse(testee.retainFeature(sf, geneId));
+
+    sf.setType("anything");
+    assertTrue(testee.retainFeature(sf, geneId));
+  }
+
+  /**
+   * Test the method that picks out 'gene' (or subtype) features with the
+   * accession id as ID
+   */
+  @Test(groups = "Functional")
+  public void testIdentifiesSequence()
+  {
+    String accId = "ABC123";
+    EnsemblGene testee = new EnsemblGene();
+  
+    // gene with no ID not valid
+    SequenceFeature sf = new SequenceFeature("gene", "", 1, 2, 0f, null);
+    assertFalse(testee.identifiesSequence(sf, accId));
+  
+    // gene with wrong ID not valid
+    sf.setValue("ID", "gene:XYZ");
+    assertFalse(testee.identifiesSequence(sf, accId));
+  
+    // gene with right ID is valid
+    sf.setValue("ID", "gene:" + accId);
+    assertTrue(testee.identifiesSequence(sf, accId));
+  
+    // gene sub-type with right ID is valid
+    sf.setType("snRNA_gene");
+    assertTrue(testee.identifiesSequence(sf, accId));
+  
+    // transcript not valid:
+    sf.setType("transcript");
+    assertFalse(testee.identifiesSequence(sf, accId));
+  
+    // exon not valid:
+    sf.setType("exon");
+    assertFalse(testee.identifiesSequence(sf, accId));
+  }
+
+  /**
+   * Check behaviour of feature colour scheme for EnsemblGene sequences.
+   * Currently coded to display exon and sequence_variant (or sub-types) only,
+   * with sequence_variant in red above exon coloured by label.
+   */
+  @Test(groups = "Functional")
+  public void testGetFeatureColourScheme()
+  {
+    FeatureSettingsModelI fc = new EnsemblGene().getFeatureColourScheme();
+    assertTrue(fc.isFeatureDisplayed("exon"));
+    assertTrue(fc.isFeatureDisplayed("coding_exon")); // subtype of exon
+    assertTrue(fc.isFeatureDisplayed("sequence_variant"));
+    assertTrue(fc.isFeatureDisplayed("feature_variant")); // subtype
+    assertFalse(fc.isFeatureDisplayed("transcript"));
+    assertEquals(Color.RED, fc.getFeatureColour("sequence_variant")
+            .getColour());
+    assertEquals(Color.RED, fc.getFeatureColour("feature_variant")
+            .getColour());
+    assertTrue(fc.getFeatureColour("exon").isColourByLabel());
+    assertTrue(fc.getFeatureColour("coding_exon").isColourByLabel());
+    assertEquals(1, fc.compare("sequence_variant", "exon"));
+    assertEquals(-1, fc.compare("exon", "sequence_variant"));
+    assertEquals(1, fc.compare("feature_variant", "coding_exon"));
+    assertEquals(-1, fc.compare("coding_exon", "feature_variant"));
+    assertEquals(1f, fc.getTransparency());
+  }
+}
diff --git a/test/jalview/ext/ensembl/EnsemblGenomeTest.java b/test/jalview/ext/ensembl/EnsemblGenomeTest.java
new file mode 100644 (file)
index 0000000..daad8b1
--- /dev/null
@@ -0,0 +1,170 @@
+package jalview.ext.ensembl;
+
+import static org.testng.AssertJUnit.assertEquals;
+import static org.testng.AssertJUnit.assertFalse;
+import static org.testng.AssertJUnit.assertTrue;
+
+import jalview.datamodel.SequenceDummy;
+import jalview.datamodel.SequenceFeature;
+import jalview.datamodel.SequenceI;
+import jalview.io.gff.SequenceOntologyFactory;
+import jalview.io.gff.SequenceOntologyLite;
+import jalview.util.MapList;
+
+import java.util.List;
+
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+public class EnsemblGenomeTest
+{
+  @BeforeClass
+  public void setUp()
+  {
+    SequenceOntologyFactory.setInstance(new SequenceOntologyLite());
+  }
+
+  @AfterClass
+  public void tearDown()
+  {
+    SequenceOntologyFactory.setInstance(null);
+  }
+
+  /**
+   * Test that the genomic sequence part of genomic sequence is correctly
+   * identified by 'transcript' features (or subtypes) with the correct gene ID
+   */
+  @Test(groups = "Functional")
+  public void testGetGenomicRangesFromFeatures()
+  {
+    EnsemblGenome testee = new EnsemblGenome();
+    SequenceI genomic = new SequenceDummy("chr7");
+    genomic.setStart(10000);
+    genomic.setEnd(50000);
+    String transcriptId = "ABC123";
+  
+    // transcript at (start+10000) length 501
+    SequenceFeature sf = new SequenceFeature("transcript", "", 20000,
+            20500, 0f,
+            null);
+    sf.setValue("ID", "transcript:" + transcriptId);
+    sf.setStrand("+");
+    genomic.addSequenceFeature(sf);
+  
+    // transcript (sub-type) at (start + 10500) length 101
+    sf = new SequenceFeature("ncRNA", "", 10500, 10600, 0f, null);
+    sf.setValue("ID", "transcript:" + transcriptId);
+    sf.setStrand("+");
+    genomic.addSequenceFeature(sf);
+
+    // Ensembl treats NMD_transcript_variant as if transcript
+    // although strictly it is a sequence_variant in SO
+    sf = new SequenceFeature("NMD_transcript_variant", "", 11000, 12000,
+            0f, null);
+    sf.setValue("ID", "transcript:" + transcriptId);
+    sf.setStrand("+");
+    genomic.addSequenceFeature(sf);
+  
+    // transcript with a different ID doesn't count
+    sf = new SequenceFeature("transcript", "", 11500, 12600, 0f, null);
+    sf.setValue("ID", "transcript:anotherOne");
+    genomic.addSequenceFeature(sf);
+  
+    // parent of transcript feature doesn't count
+    sf = new SequenceFeature("gene_member_region", "", 10000, 50000, 0f,
+            null);
+    genomic.addSequenceFeature(sf);
+
+    MapList ranges = testee.getGenomicRangesFromFeatures(genomic,
+            transcriptId, 23);
+    List<int[]> fromRanges = ranges.getFromRanges();
+    assertEquals(3, fromRanges.size());
+    // from ranges should be sorted by start order
+    assertEquals(10500, fromRanges.get(0)[0]);
+    assertEquals(10600, fromRanges.get(0)[1]);
+    assertEquals(11000, fromRanges.get(1)[0]);
+    assertEquals(12000, fromRanges.get(1)[1]);
+    assertEquals(20000, fromRanges.get(2)[0]);
+    assertEquals(20500, fromRanges.get(2)[1]);
+    // to range should start from given start numbering
+    List<int[]> toRanges = ranges.getToRanges();
+    assertEquals(1, toRanges.size());
+    assertEquals(23, toRanges.get(0)[0]);
+    assertEquals(1625, toRanges.get(0)[1]);
+  }
+
+  /**
+   * Test the method that retains features except for 'transcript' (or
+   * sub-type), or those with parent other than the given id
+   */
+  @Test(groups = "Functional")
+  public void testRetainFeature()
+  {
+    String accId = "ABC123";
+    EnsemblGenome testee = new EnsemblGenome();
+
+    SequenceFeature sf = new SequenceFeature("transcript", "", 20000,
+            20500, 0f, null);
+    assertFalse(testee.retainFeature(sf, accId));
+  
+    sf.setType("mature_transcript");
+    assertFalse(testee.retainFeature(sf, accId));
+  
+    sf.setType("NMD_transcript_variant");
+    assertFalse(testee.retainFeature(sf, accId));
+  
+    // other feature with no parent is kept
+    sf.setType("anything");
+    assertTrue(testee.retainFeature(sf, accId));
+
+    // other feature with correct parent is kept
+    sf.setValue("Parent", "transcript:" + accId);
+    assertTrue(testee.retainFeature(sf, accId));
+
+    // other feature with wrong parent is not kept
+    sf.setValue("Parent", "transcript:XYZ");
+    assertFalse(testee.retainFeature(sf, accId));
+  }
+
+  /**
+   * Test the method that picks out 'transcript' (or subtype) features with the
+   * accession id as ID
+   */
+  @Test(groups = "Functional")
+  public void testIdentifiesSequence()
+  {
+    String accId = "ABC123";
+    EnsemblGenome testee = new EnsemblGenome();
+  
+    // transcript with no ID not valid
+    SequenceFeature sf = new SequenceFeature("transcript", "", 1, 2, 0f,
+            null);
+    assertFalse(testee.identifiesSequence(sf, accId));
+  
+    // transcript with wrong ID not valid
+    sf.setValue("ID", "transcript");
+    assertFalse(testee.identifiesSequence(sf, accId));
+  
+    // transcript with right ID is valid
+    sf.setValue("ID", "transcript:" + accId);
+    assertTrue(testee.identifiesSequence(sf, accId));
+  
+    // transcript sub-type with right ID is valid
+    sf.setType("ncRNA");
+    assertTrue(testee.identifiesSequence(sf, accId));
+
+    // Ensembl treats NMD_transcript_variant as if a transcript
+    sf.setType("NMD_transcript_variant");
+    assertTrue(testee.identifiesSequence(sf, accId));
+  
+    // gene not valid:
+    sf.setType("gene");
+    assertFalse(testee.identifiesSequence(sf, accId));
+  
+    // exon not valid:
+    sf.setType("exon");
+    assertFalse(testee.identifiesSequence(sf, accId));
+  }
+
+}
diff --git a/test/jalview/ext/ensembl/EnsemblProteinTest.java b/test/jalview/ext/ensembl/EnsemblProteinTest.java
new file mode 100644 (file)
index 0000000..e6f6683
--- /dev/null
@@ -0,0 +1,47 @@
+package jalview.ext.ensembl;
+
+import static org.testng.AssertJUnit.assertEquals;
+
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+public class EnsemblProteinTest
+{
+
+  @Test(groups = "Functional")
+  public void testIsValidReference() throws Exception
+  {
+    EnsemblSequenceFetcher esq = new EnsemblProtein();
+    Assert.assertTrue(esq.isValidReference("CCDS5863.1"));
+    Assert.assertTrue(esq.isValidReference("ENSP00000288602"));
+    Assert.assertFalse(esq.isValidReference("ENST00000288602"));
+    Assert.assertFalse(esq.isValidReference("ENSG00000288602"));
+    // non-human species having a 3 character identifier included:
+    Assert.assertTrue(esq.isValidReference("ENSMUSP00000099398"));
+  }
+
+  @Test(groups = "Functional")
+  public void testGetAccesionIdFromQuery() throws Exception
+  {
+    EnsemblSequenceFetcher esq = new EnsemblProtein();
+    assertEquals("ENSP00000288602",
+            esq.getAccessionIdFromQuery("ENSP00000288602"));
+    assertEquals("ENSMUSP00000288602",
+            esq.getAccessionIdFromQuery("ENSMUSP00000288602"));
+
+    // ENST converted to ENSP
+    assertEquals("ENSP00000288602",
+            esq.getAccessionIdFromQuery("ENST00000288602"));
+    assertEquals("ENSMUSP00000288602",
+            esq.getAccessionIdFromQuery("ENSMUST00000288602"));
+
+    // with valid separator:
+    assertEquals("ENSP00000288604",
+            esq.getAccessionIdFromQuery("ENSP00000288604 ENSP00000288602"));
+
+    // with wrong separator:
+    assertEquals("ENSP00000288604,ENSP00000288602",
+            esq.getAccessionIdFromQuery("ENSP00000288604,ENSP00000288602"));
+  }
+
+}
diff --git a/test/jalview/ext/ensembl/EnsemblRestClientTest.java b/test/jalview/ext/ensembl/EnsemblRestClientTest.java
new file mode 100644 (file)
index 0000000..6f7c1ad
--- /dev/null
@@ -0,0 +1,69 @@
+package jalview.ext.ensembl;
+
+import jalview.datamodel.AlignmentI;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.List;
+
+import org.testng.annotations.Test;
+
+public class EnsemblRestClientTest
+{
+
+  @Test(suiteName = "live")
+  public void testLiveCheckEnsembl()
+  {
+    EnsemblRestClient sf = new EnsemblRestClient()
+    {
+  
+      @Override
+      public String getDbName()
+      {
+        return null;
+      }
+  
+      @Override
+      public AlignmentI getSequenceRecords(String queries) throws Exception
+      {
+        return null;
+      }
+  
+      @Override
+      protected URL getUrl(List<String> ids) throws MalformedURLException
+      {
+        return null;
+      }
+  
+      @Override
+      protected boolean useGetRequest()
+      {
+        return false;
+      }
+  
+      @Override
+      protected String getRequestMimeType(boolean b)
+      {
+        return null;
+      }
+  
+      @Override
+      protected String getResponseMimeType()
+      {
+        return null;
+      }
+  
+    };
+    boolean isAvailable = sf.isEnsemblAvailable();
+    if (isAvailable)
+    {
+      System.out.println("Ensembl is UP!");
+    }
+    else
+    {
+      System.err
+              .println("Ensembl is DOWN or unreachable ******************* BAD!");
+    }
+  }
+
+}
diff --git a/test/jalview/ext/ensembl/EnsemblSeqProxyAdapter.java b/test/jalview/ext/ensembl/EnsemblSeqProxyAdapter.java
new file mode 100644 (file)
index 0000000..510e072
--- /dev/null
@@ -0,0 +1,53 @@
+package jalview.ext.ensembl;
+
+import jalview.datamodel.SequenceFeature;
+
+/**
+ * A convenience class to simplify writing unit tests (pending Mockito or
+ * similar?)
+ */
+public class EnsemblSeqProxyAdapter extends EnsemblSeqProxy
+{
+  /**
+   * Default constructor (to use rest.ensembl.org)
+   */
+  public EnsemblSeqProxyAdapter()
+  {
+    super();
+  }
+
+  /**
+   * Constructor given the target domain to fetch data from
+   * 
+   * @param d
+   */
+  public EnsemblSeqProxyAdapter(String d)
+  {
+    super(d);
+  }
+
+  @Override
+  public String getDbName()
+  {
+    return null;
+  }
+
+  @Override
+  protected EnsemblFeatureType[] getFeaturesToFetch()
+  {
+    return null;
+  }
+
+  @Override
+  protected EnsemblSeqType getSourceEnsemblType()
+  {
+    return null;
+  }
+
+  @Override
+  protected boolean identifiesSequence(SequenceFeature sf, String accId)
+  {
+    return false;
+  }
+
+}
diff --git a/test/jalview/ext/ensembl/EnsemblSeqProxyTest.java b/test/jalview/ext/ensembl/EnsemblSeqProxyTest.java
new file mode 100644 (file)
index 0000000..71f0212
--- /dev/null
@@ -0,0 +1,315 @@
+package jalview.ext.ensembl;
+
+import static org.testng.AssertJUnit.assertEquals;
+import static org.testng.AssertJUnit.assertFalse;
+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;
+import jalview.io.FastaFile;
+import jalview.io.FileParse;
+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;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+
+public class EnsemblSeqProxyTest
+{
+  private static final Object[][] allSeqs = new Object[][] {
+      {
+          new EnsemblProtein(),
+          "CCDS5863.1",
+          ">CCDS5863.1\n"
+                  + "MAALSGGGGGGAEPGQALFNGDMEPEAGAGAGAAASSAADPAIPEEVWNIKQMIKLTQEH\n"
+                  + "IEALLDKFGGEHNPPSIYLEAYEEYTSKLDALQQREQQLLESLGNGTDFSVSSSASMDTV\n"
+                  + "TSSSSSSLSVLPSSLSVFQNPTDVARSNPKSPQKPIVRVFLPNKQRTVVPARCGVTVRDS\n"
+                  + "LKKALMMRGLIPECCAVYRIQDGEKKPIGWDTDISWLTGEELHVEVLENVPLTTHNFVRK\n"
+                  + "TFFTLAFCDFCRKLLFQGFRCQTCGYKFHQRCSTEVPLMCVNYDQLDLLFVSKFFEHHPI\n"
+                  + "PQEEASLAETALTSGSSPSAPASDSIGPQILTSPSPSKSIPIPQPFRPADEDHRNQFGQR\n"
+                  + "DRSSSAPNVHINTIEPVNIDDLIRDQGFRGDGGSTTGLSATPPASLPGSLTNVKALQKSP\n"
+                  + "GPQRERKSSSSSEDRNRMKTLGRRDSSDDWEIPDGQITVGQRIGSGSFGTVYKGKWHGDV\n"
+                  + "AVKMLNVTAPTPQQLQAFKNEVGVLRKTRHVNILLFMGYSTKPQLAIVTQWCEGSSLYHH\n"
+                  + "LHIIETKFEMIKLIDIARQTAQGMDYLHAKSIIHRDLKSNNIFLHEDLTVKIGDFGLATV\n"
+                  + "KSRWSGSHQFEQLSGSILWMAPEVIRMQDKNPYSFQSDVYAFGIVLYELMTGQLPYSNIN\n"
+                  + "NRDQIIFMVGRGYLSPDLSKVRSNCPKAMKRLMAECLKKKRDERPLFPQILASIELLARS\n"
+                  + "LPKIHRSASEPSLNRAGFQTEDFSLYACASPKTPIQAGGYGAFPVH\n" },
+      {
+          new EnsemblCdna(),
+          "CCDS5863.1",
+          ">CCDS5863.1\n"
+                  + "ATGGCGGCGCTGAGCGGTGGCGGTGGTGGCGGCGCGGAGCCGGGCCAGGCTCTGTTCAAC\n"
+                  + "GGGGACATGGAGCCCGAGGCCGGCGCCGGCGCCGGCGCCGCGGCCTCTTCGGCTGCGGAC\n"
+                  + "CCTGCCATTCCGGAGGAGGTGTGGAATATCAAACAAATGATTAAGTTGACACAGGAACAT\n"
+                  + "ATAGAGGCCCTATTGGACAAATTTGGTGGGGAGCATAATCCACCATCAATATATCTGGAG\n"
+                  + "GCCTATGAAGAATACACCAGCAAGCTAGATGCACTCCAACAAAGAGAACAACAGTTATTG\n"
+                  + "GAATCTCTGGGGAACGGAACTGATTTTTCTGTTTCTAGCTCTGCATCAATGGATACCGTT\n"
+                  + "ACATCTTCTTCCTCTTCTAGCCTTTCAGTGCTACCTTCATCTCTTTCAGTTTTTCAAAAT\n"
+                  + "CCCACAGATGTGGCACGGAGCAACCCCAAGTCACCACAAAAACCTATCGTTAGAGTCTTC\n"
+                  + "CTGCCCAACAAACAGAGGACAGTGGTACCTGCAAGGTGTGGAGTTACAGTCCGAGACAGT\n"
+                  + "CTAAAGAAAGCACTGATGATGAGAGGTCTAATCCCAGAGTGCTGTGCTGTTTACAGAATT\n"
+                  + "CAGGATGGAGAGAAGAAACCAATTGGTTGGGACACTGATATTTCCTGGCTTACTGGAGAA\n"
+                  + "GAATTGCATGTGGAAGTGTTGGAGAATGTTCCACTTACAACACACAACTTTGTACGAAAA\n"
+                  + "ACGTTTTTCACCTTAGCATTTTGTGACTTTTGTCGAAAGCTGCTTTTCCAGGGTTTCCGC\n"
+                  + "TGTCAAACATGTGGTTATAAATTTCACCAGCGTTGTAGTACAGAAGTTCCACTGATGTGT\n"
+                  + "GTTAATTATGACCAACTTGATTTGCTGTTTGTCTCCAAGTTCTTTGAACACCACCCAATA\n"
+                  + "CCACAGGAAGAGGCGTCCTTAGCAGAGACTGCCCTAACATCTGGATCATCCCCTTCCGCA\n"
+                  + "CCCGCCTCGGACTCTATTGGGCCCCAAATTCTCACCAGTCCGTCTCCTTCAAAATCCATT\n"
+                  + "CCAATTCCACAGCCCTTCCGACCAGCAGATGAAGATCATCGAAATCAATTTGGGCAACGA\n"
+                  + "GACCGATCCTCATCAGCTCCCAATGTGCATATAAACACAATAGAACCTGTCAATATTGAT\n"
+                  + "GACTTGATTAGAGACCAAGGATTTCGTGGTGATGGAGGATCAACCACAGGTTTGTCTGCT\n"
+                  + "ACCCCCCCTGCCTCATTACCTGGCTCACTAACTAACGTGAAAGCCTTACAGAAATCTCCA\n"
+                  + "GGACCTCAGCGAGAAAGGAAGTCATCTTCATCCTCAGAAGACAGGAATCGAATGAAAACA\n"
+                  + "CTTGGTAGACGGGACTCGAGTGATGATTGGGAGATTCCTGATGGGCAGATTACAGTGGGA\n"
+                  + "CAAAGAATTGGATCTGGATCATTTGGAACAGTCTACAAGGGAAAGTGGCATGGTGATGTG\n"
+                  + "GCAGTGAAAATGTTGAATGTGACAGCACCTACACCTCAGCAGTTACAAGCCTTCAAAAAT\n"
+                  + "GAAGTAGGAGTACTCAGGAAAACACGACATGTGAATATCCTACTCTTCATGGGCTATTCC\n"
+                  + "ACAAAGCCACAACTGGCTATTGTTACCCAGTGGTGTGAGGGCTCCAGCTTGTATCACCAT\n"
+                  + "CTCCATATCATTGAGACCAAATTTGAGATGATCAAACTTATAGATATTGCACGACAGACT\n"
+                  + "GCACAGGGCATGGATTACTTACACGCCAAGTCAATCATCCACAGAGACCTCAAGAGTAAT\n"
+                  + "AATATATTTCTTCATGAAGACCTCACAGTAAAAATAGGTGATTTTGGTCTAGCTACAGTG\n"
+                  + "AAATCTCGATGGAGTGGGTCCCATCAGTTTGAACAGTTGTCTGGATCCATTTTGTGGATG\n"
+                  + "GCACCAGAAGTCATCAGAATGCAAGATAAAAATCCATACAGCTTTCAGTCAGATGTATAT\n"
+                  + "GCATTTGGAATTGTTCTGTATGAATTGATGACTGGACAGTTACCTTATTCAAACATCAAC\n"
+                  + "AACAGGGACCAGATAATTTTTATGGTGGGACGAGGATACCTGTCTCCAGATCTCAGTAAG\n"
+                  + "GTACGGAGTAACTGTCCAAAAGCCATGAAGAGATTAATGGCAGAGTGCCTCAAAAAGAAA\n"
+                  + "AGAGATGAGAGACCACTCTTTCCCCAAATTCTCGCCTCTATTGAGCTGCTGGCCCGCTCA\n"
+                  + "TTGCCAAAAATTCACCGCAGTGCATCAGAACCCTCCTTGAATCGGGCTGGTTTCCAAACA\n"
+                  + "GAGGATTTTAGTCTATATGCTTGTGCTTCTCCAAAAACACCCATCCAGGCAGGGGGATAT\n"
+                  + "GGTGCGTTTCCTGTCCACTGA\n" },
+      {
+          new EnsemblProtein(),
+          "ENSP00000288602",
+          ">ENSP00000288602\n"
+                  + "MAALSGGGGGGAEPGQALFNGDMEPEAGAGAGAAASSAADPAIPEEVWNIKQMIKLTQEH\n"
+                  + "IEALLDKFGGEHNPPSIYLEAYEEYTSKLDALQQREQQLLESLGNGTDFSVSSSASMDTV\n"
+                  + "TSSSSSSLSVLPSSLSVFQNPTDVARSNPKSPQKPIVRVFLPNKQRTVVPARCGVTVRDS\n"
+                  + "LKKALMMRGLIPECCAVYRIQDGEKKPIGWDTDISWLTGEELHVEVLENVPLTTHNFVRK\n"
+                  + "TFFTLAFCDFCRKLLFQGFRCQTCGYKFHQRCSTEVPLMCVNYDQLDLLFVSKFFEHHPI\n"
+                  + "PQEEASLAETALTSGSSPSAPASDSIGPQILTSPSPSKSIPIPQPFRPADEDHRNQFGQR\n"
+                  + "DRSSSAPNVHINTIEPVNIDDLIRDQGFRGDGGSTTGLSATPPASLPGSLTNVKALQKSP\n"
+                  + "GPQRERKSSSSSEDRNRMKTLGRRDSSDDWEIPDGQITVGQRIGSGSFGTVYKGKWHGDV\n"
+                  + "AVKMLNVTAPTPQQLQAFKNEVGVLRKTRHVNILLFMGYSTKPQLAIVTQWCEGSSLYHH\n"
+                  + "LHIIETKFEMIKLIDIARQTAQGMDYLHAKSIIHRDLKSNNIFLHEDLTVKIGDFGLATV\n"
+                  + "KSRWSGSHQFEQLSGSILWMAPEVIRMQDKNPYSFQSDVYAFGIVLYELMTGQLPYSNIN\n"
+                  + "NRDQIIFMVGRGYLSPDLSKVRSNCPKAMKRLMAECLKKKRDERPLFPQILASIELLARS\n"
+                  + "LPKIHRSASEPSLNRAGFQTEDFSLYACASPKTPIQAGGYGAFPVH" } };
+
+  @BeforeClass
+  public void setUp()
+  {
+    SequenceOntologyFactory.setInstance(new SequenceOntologyLite());
+  }
+
+  @AfterClass
+  public void tearDown()
+  {
+    SequenceOntologyFactory.setInstance(null);
+  }
+
+  @DataProvider(name = "ens_seqs")
+  public Object[][] createData(Method m)
+  {
+    System.out.println(m.getName());
+    return allSeqs;
+  }
+
+  @Test(dataProvider = "ens_seqs", suiteName = "live")
+  public void testGetOneSeqs(EnsemblRestClient proxy, String sq, String fastasq)
+          throws Exception
+  {
+    FileParse fp = proxy.getSequenceReader(Arrays
+            .asList(new String[]
+    { sq }));
+    SequenceI[] sqs = new FastaFile(fp).getSeqsAsArray();
+    FastaFile trueRes = new FastaFile(fastasq, AppletFormatAdapter.PASTE);
+    SequenceI[] trueSqs = trueRes.getSeqsAsArray();
+    Assert.assertEquals(sqs.length, trueSqs.length,
+            "Different number of sequences retrieved for query " + sq);
+    Alignment ral = new Alignment(sqs);
+    for (SequenceI tr : trueSqs)
+    {
+      SequenceI[] rseq;
+      Assert.assertNotNull(
+              rseq = ral.findSequenceMatch(tr.getName()),
+              "Couldn't find sequences matching expected sequence "
+                      + tr.getName());
+      Assert.assertEquals(rseq.length, 1,
+              "Expected only one sequence for sequence ID " + tr.getName());
+      Assert.assertEquals(
+              rseq[0].getSequenceAsString(),
+              tr.getSequenceAsString(),
+              "Sequences differ for " + tr.getName() + "\n" + "Exp:"
+                      + tr.getSequenceAsString() + "\n" + "Got:"
+                      + rseq[0].getSequenceAsString());
+  
+    }
+  }
+
+  @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<String> 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()
+  {
+
+  }
+
+  @Test(groups = "Functional")
+  public void testIsTranscriptIdentifier()
+  {
+    EnsemblSeqProxy testee = new EnsemblGene();
+    assertFalse(testee.isTranscriptIdentifier(null));
+    assertFalse(testee.isTranscriptIdentifier(""));
+    assertFalse(testee.isTranscriptIdentifier("ENSG00000012345"));
+    assertTrue(testee.isTranscriptIdentifier("ENST00000012345"));
+    assertTrue(testee.isTranscriptIdentifier("ENSMUST00000012345"));
+    assertFalse(testee.isTranscriptIdentifier("enst00000012345"));
+    assertFalse(testee.isTranscriptIdentifier("ENST000000123456"));
+    assertFalse(testee.isTranscriptIdentifier("ENST0000001234"));
+  }
+
+  @Test(groups = "Functional")
+  public void testIsGeneIdentifier()
+  {
+    EnsemblSeqProxy testee = new EnsemblGene();
+    assertFalse(testee.isGeneIdentifier(null));
+    assertFalse(testee.isGeneIdentifier(""));
+    assertFalse(testee.isGeneIdentifier("ENST00000012345"));
+    assertTrue(testee.isGeneIdentifier("ENSG00000012345"));
+    assertTrue(testee.isGeneIdentifier("ENSMUSG00000012345"));
+    assertFalse(testee.isGeneIdentifier("ensg00000012345"));
+    assertFalse(testee.isGeneIdentifier("ENSG000000123456"));
+    assertFalse(testee.isGeneIdentifier("ENSG0000001234"));
+  }
+
+  /**
+   * Test the method that appends a single allele's reverse complement to a
+   * string buffer
+   */
+  @Test(groups = "Functional")
+  public void testReverseComplementAllele()
+  {
+    StringBuilder sb = new StringBuilder();
+    EnsemblSeqProxy.reverseComplementAllele(sb, "G"); // comp=C
+    EnsemblSeqProxy.reverseComplementAllele(sb, "g"); // comp=c
+    EnsemblSeqProxy.reverseComplementAllele(sb, "C"); // comp=G
+    EnsemblSeqProxy.reverseComplementAllele(sb, "T"); // comp=A
+    EnsemblSeqProxy.reverseComplementAllele(sb, "A"); // comp=T
+    assertEquals("C,c,G,A,T", sb.toString());
+
+    sb = new StringBuilder();
+    EnsemblSeqProxy.reverseComplementAllele(sb, "-GATt"); // revcomp=aATC-
+    EnsemblSeqProxy.reverseComplementAllele(sb, "hgmd_mutation");
+    EnsemblSeqProxy.reverseComplementAllele(sb, "PhenCode_variation");
+    assertEquals("aATC-,hgmd_mutation,PhenCode_variation", sb.toString());
+  }
+
+  /**
+   * Test the method that computes the reverse complement of the alleles in a
+   * sequence_variant feature
+   */
+  @Test(groups = "Functional")
+  public void testReverseComplementAlleles()
+  {
+    String alleles = "C,G,-TAC,HGMD_MUTATION,gac";
+    SequenceFeature sf = new SequenceFeature("sequence_variant", alleles,
+            1, 2, 0f, null);
+    sf.setValue("alleles", alleles);
+    sf.setAttributes("x=y,z;alleles=" + alleles + ";a=b,c");
+
+    EnsemblSeqProxy.reverseComplementAlleles(sf);
+    String revcomp = "G,C,GTA-,HGMD_MUTATION,gtc";
+    // verify description is updated with reverse complement
+    assertEquals(revcomp, sf.getDescription());
+    // verify alleles attribute is updated with reverse complement
+    assertEquals(revcomp, sf.getValue("alleles"));
+    // verify attributes string is updated with reverse complement
+    assertEquals("x=y,z;alleles=" + revcomp + ";a=b,c", sf.getAttributes());
+  }
+
+  @Test(groups = "Functional")
+  public void testSortFeatures()
+  {
+    SequenceFeature sf1 = new SequenceFeature("", "", 10, 15, 0f, null);
+    SequenceFeature sf2 = new SequenceFeature("", "", 8, 12, 0f, null);
+    SequenceFeature sf3 = new SequenceFeature("", "", 8, 13, 0f, null);
+    SequenceFeature sf4 = new SequenceFeature("", "", 11, 11, 0f, null);
+    SequenceFeature[] sfs = new SequenceFeature[] { sf1, sf2, sf3, sf4 };
+
+    // sort by start position ascending (forward strand)
+    // sf2 and sf3 tie and should not be reordered by sorting
+    EnsemblSeqProxy.sortFeatures(sfs, true);
+    assertArrayEquals(new SequenceFeature[] { sf2, sf3, sf1, sf4 }, sfs);
+
+    // sort by end position descending (reverse strand)
+    EnsemblSeqProxy.sortFeatures(sfs, false);
+    assertArrayEquals(new SequenceFeature[] { sf1, sf3, sf2, sf4 }, sfs);
+  }
+}
\ No newline at end of file
diff --git a/test/jalview/ext/ensembl/EnsemblXrefTest.java b/test/jalview/ext/ensembl/EnsemblXrefTest.java
new file mode 100644 (file)
index 0000000..1dc9b8d
--- /dev/null
@@ -0,0 +1,47 @@
+package jalview.ext.ensembl;
+
+import static org.testng.AssertJUnit.assertEquals;
+
+import jalview.datamodel.DBRefEntry;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.StringReader;
+import java.net.URL;
+import java.util.List;
+
+import org.testng.annotations.Test;
+
+public class EnsemblXrefTest
+{
+  //@formatter:off
+  private static final String JSON = 
+          "[{\"primary_id\":\"CCDS5863\",\"dbname\":\"CCDS\"}," +
+           "{\"primary_id\":\"P15056\",\"dbname\":\"Uniprot/SWISSPROT\",\"synonyms\":[\"C21\"]}," +
+           "{\"primary_id\":\"GO:0000165\",\"dbname\":\"GO\"}]";
+  //@formatter:on
+
+  @Test(groups = "Functional")
+  public void testGetCrossReferences()
+  {
+    System.out.println(JSON);
+    EnsemblXref testee = new EnsemblXref("http://rest.ensembl.org")
+    {
+      @Override
+      protected BufferedReader getHttpResponse(URL url, List<String> ids)
+              throws IOException
+      {
+        return new BufferedReader(new StringReader(JSON));
+      }
+    };
+
+    // synonyms and GO terms are not returned
+    List<DBRefEntry> dbrefs = testee.getCrossReferences("ABCDE");
+    assertEquals(2, dbrefs.size());
+    assertEquals("CCDS", dbrefs.get(0).getSource());
+    assertEquals("CCDS5863", dbrefs.get(0).getAccessionId());
+    // Uniprot name should get converted to Jalview canonical form
+    assertEquals("UNIPROT", dbrefs.get(1).getSource());
+    assertEquals("P15056", dbrefs.get(1).getAccessionId());
+  }
+}
diff --git a/test/jalview/ext/htsjdk/TestHtsContigDb.java b/test/jalview/ext/htsjdk/TestHtsContigDb.java
new file mode 100644 (file)
index 0000000..5e0f99a
--- /dev/null
@@ -0,0 +1,32 @@
+/**
+ * 
+ */
+package jalview.ext.htsjdk;
+
+import jalview.datamodel.SequenceI;
+
+import java.io.File;
+
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+/**
+ * @author jprocter
+ *
+ */
+public class TestHtsContigDb
+{
+  @Test
+  public final void testHTSReferenceSequence() throws Exception
+  {
+    HtsContigDb remmadb = new HtsContigDb("REEMADB", new File(
+            "test/jalview/ext/htsjdk/pgmb.fasta"));
+
+    Assert.assertTrue(remmadb.isValid());
+
+    SequenceI sq = remmadb.getSequenceProxy("Deminut");
+    Assert.assertNotNull(sq);
+    Assert.assertNotEquals(0, sq.getLength());
+  }
+
+}
diff --git a/test/jalview/ext/htsjdk/pgmB.fasta b/test/jalview/ext/htsjdk/pgmB.fasta
new file mode 100644 (file)
index 0000000..e759925
--- /dev/null
@@ -0,0 +1,183 @@
+>DDB_G0280897 
+MTDKINNLINQWLKWDKNEITRKEIEQLKENNNEKELLVRLEERIQFGTAGLRGAMRAGF
+SCMNDLTVTQASQGLCEYVIETIEQSKSKGIVIGYDGRHNSYIFAKITAATFKSKGFKVY
+LFSHIVPTPYVSFAVPNLKAAIGVMITASHNPKNDNGYKVYWETGCQINTPHDKGISKKI
+DENLEPWSNVDATSDIKYGNGDDGESMIDPLSVITELYNKNIKEYSVGSKIELANEPIVY
+TAMHGVGGVYAKKAFETFQLKPFIPVAQQIEPDAEFPTVTYPNPEEGKGALKLSIETAEA
+NNSRLILANDPDADRLAVAEKLADGSWKVFNGNEIGVLLADWAWTNRSTLTKGGSTLENN
+KYFMINTAVSSAMLKTMSEKEGFIHQECLTGFKWIGNAAYNAINNNDGTTFLFGYEEAIG
+FQYGDVSFDKDGVRAAAIFAEFALSLYKKGSSVQDHLESMYKRYGYHISKNRYFFCYEPS
+KMVSIFNKIRNDGKYLTKLGDDDDEQFTITRIRDLTTGYDNGYPDCKARLPVSSSTQMIT
+FYFKNGGIATLRGSGTEPKLKYYVEMIGEVKSNVESTLTKAVELVINQLLKPIENQLEPP
+KDD
+>PPL_06716 
+MSNIKELAESWLKWDKNAETRKEIQSLLESDNQSELKSRLEQRIAFGTAGLRGPMKAGFS
+CMNDLTVIQASQGLCIYVEQTLSNSKNSGIVVGYDGRHHSKEFARLTAATFASRGFKVYL
+FSKIVPTPYVVILYLISNYMDCYVHQAFAVPELKASVGVMITASHNPKDDNGYKVYWDNG
+CQINTPHDIRIAMQIDLNLEPWNIDVNELLNGSLVSDPLDTITKSYFGKIAKYSVKNEVK
+LATSEKIVYTAMHGVGGEYAKMAFETFGLPAFIPVDQQIQPDPEFPTVAFPNPEEGKGAL
+KLSIETAERNNSRLILANDPDADRLAVAERQPDGQWKVFNGNEIGVLFADWAWQNARRAD
+STTPAERFCMINTAVSSSMLKTMANKDGYRHEECLTGFKWVGNKARELMDKGYNFLFAYE
+EAIGFMYGDVSLDKDGVRCAPIFAELALTCYQAGKSCQDHLEELYKRYGYHISKNRYFFC
+YDPKKMVAIFDKIRNYGQFPTNCGDFYITRVRDLTVGYDSGYPDHKARLPVSSSTQMITF
+YFENGGIATLRGSGTEPKLKYYVEMIGSDRQLVESTLSQLVEQVINQFLRPVENELTPPK
+DD
+>DFA_03821 
+MTDINQLAQNWLKWDRNPKTHKEIEQLVEAKDENELRARLENRIAFGTAGIVSTTIVQSH
+MNIGPMKAGFANMNDLTVIQASQGLSIYVQETISQAQSKGVVVGYDGRYNSEVFAKLTAA
+TFASKGFKVYLFSKIVPTPFVAFAVPELGASVGVMVTASHNPKDDNGYKVYWDNGCQINT
+PHDKGIAKQIDLNLEPWTINIDKLLSSELVNDPLETISNAYFSKIYSYSVKNRSTPLELA
+NEKVVYTAMHGVGGDYVKKAFETFKLPPYVEVAQQIKPDPAFPTVAFPNPEEGKGALKLS
+IETAESVNSRLILANDPDADRLAVAEKLKDGSWKVFNGNEIGILLADWAWTNAKINHPDV
+PAEKFFMINTAVSSAMLKTMAKKEGYICEETLTGFKWVGNKAKEMIDQGYKFLFAYEEAI
+GFMYGDVSLDKDGVRCAPIFAEYALNLYANGSSCQDHLDHLMQRYGYHISKNRYFFCYEP
+SKMVRIFNDIRKSNNGQFPDKCGPYEIIRIRDLTVDYDTAYPDNKARLPVSTSTQMITFY
+FKNGAIATLRGSGTEPKLKYYVEMIGDNKQEVESTLQQVVQQVIDNFLQPVVNQLTPPKD
+D
+>DLA_10096 
+MDIYTLANKWLEWDKNEKNRKEIQHFVDEKNEQELRERLENRIQFGTAGLRGPMKAGFAN
+MNDLTVIQASQGLALYVKETIDSALTKGVVVGYDGRHNSQTFARLTAATFLSKGFKVYLF
+SKLVPTPFVAFAVPELGASCGVMITASHNPKDDNGYKVYWDNGCQINTPHDKGISKLIDE
+NLVPWTMNLDDLNKSDLVSDPLERVSKSYFTKISKYSVVKSGATIKQEKVVYTPMHGVGG
+DYAAEAFKVFDLHPFIPVELQIKPDAEFPTVAFPNPEEGKGALKLAIETAESNQSRLILA
+NDPDADRLAVAEKQSSDGSWKVFNGNEIGVLFADWAWRKERALFSEGYNCKPSEYTMIST
+AVSSAMLSTMAKKEGFQHEEVLTGFKWVGNAAKQAMDRGQKFLFAYEEAIGFMYGDVSLD
+KDGVRGASIFAELAFDLYQQGSSCQEHLESLYKKYGYHISNNRYFFCYDPKKMVRIFNEI
+RGNNREYVKELGEFKVERIRDLTTGYDTAFPPEFKAQLPTSSSTQMITFYFTNGSIATLR
+GSGTEPKLKYYVESIGSDKLQVQQTLTKLVSLVIEKLLRPKENELTPPKESVGSERLLAL
+LSEVMSTSMKIQVKYNESITEYNIIKGVKLLTQIDVLCQIFKVDANPDRFVLNYRESNLI
+LSEDNLSKLFSNEISSCSSQSQNGSNGELSSLYSSFGENSSNNNNNSTLKFELILAPIYQ
+VDSVLEHLNNSNLIKKRII
+>DPU1265769
+MSMIRSISGVRGVIGQSWTPTLVSNHIIGFTQLLESEKYYNQKQKKIVVGRDSRVSGPWI
+EMIVNGSLISMGYQVIHIDIAATPTVQYMVEKTKSSGGIVITSSHNPVEWNGLKFVGPDG
+LFIAPVECEVLFSLADNPSSFKFPNYDKLGSVVCNTTANKEHIEAIFKLPFISVDKIKEK
+KFKVCLDSVNGAGGPIMSYLLTELGCEVIGINLEPTGLFAHTPEPVPANLGQLCELVKTH
+KADFGIAVDPDVDRCVFIDDKGVPLGEEYTLAMAVELLLGDCGRRGNVCKNLSSSRAIDD
+ICKKYDSQVICAPVGEIQVAKKMQQVNAVIGGEGNGGVMLPDIHIGRDAPVAATLALQLL
+ANRNAASISEFKRTTLPTYEIVKLKAGIEGLDPDAILAEYTKQYENKEGVVINQEDGLKI
+DSADWWVHLRKSNTEHIIRVISEAKNTKEATDIATKFINEIESKRK
+>440792448
+MASRVSGRMRKISDETQQMVNAWLSVDWDPESREHVKGLVAAGKEEELVAHLGRRISFGT
+AGLRGKMKWGFAFMNAVTVTQASQGLCAYLRTVHPCLTDLRERGVIVGHDGRYNSRMFAR
+LTAAVFLSRKIKVHLFRDDVPTPLVAFGVRHLKCAAGVMVTASHNPKEDNGYKVYWANSA
+QITAPHDAQIARAIEANFSIWDRMPDDKAIDEHPLCLDPTTDVCAAYLAAARHWSFRTPQ
+QNAAAQLRVVYTAMHGVGGQSVERIFDAFGLPPVIAVREQHDPDPDFTTVEFPNPEEANG
+CSLRLAMSTADREGAPLILANDPDADRLAVAERQRDSGEWRILDGNEIALLLADWLWRNY
+TERHPEVDRAKIVMLNSTVSSKALAAMAAKEGFHYRETLTGFKWLGNLADELVRAGYTFL
+FAYEVEIGFMIGDMSLDTDGVRAAPVFVEMANHLYERGLTLSDHLDNLYHKYGYYKMAVG
+YYFCHDPRLMDQIFNEIRNDGLYISTCGDHKVQYVRDLTTGFDNSQPHNRAVLPVSSAAH
+MITFTFENECVATFRGSGTEPKLKYYIEVANASNEQLATDLLDSMKQEIIDRFLQPSQNG
+LRPPAAAEDAHNSPHNSGNSPEQMAPARIARDVIHKEIQALQNLEATLGRDFEKVVEIIE
+SRGSGRVIFTGVGKSGIIAQKISASFSSLGISSFFVHATEAAHGDLGVITAEDVIIAISN
+SGNTPELIFIIPSLRVLAGKIIGITSNKDSLLARYSDASIITGKIMEADQHKIAPTASTI
+VCLAIGDALAVTLSARMKFTLPEFGLRHPGGVLGEKVLGKVFQEFAMKGQGRFLRFWKRM
+TNEERDKLRRDFERIDLAELSRIYLQCRSKAEKGAIDPHSLEPLPSHTWVKLHESDPAAV
+AAWRDAGLRALREGKIGVVLMAGGQATRLGMTMPKGFLDLNLPSHKSLYQLHAEKLLRLQ
+DEVRQTFGGGGGDEEVQQQQQQIQIPFYVMTSPEALQQTHQFFIKHQFFGLCPKQVFFFK
+QRSLPCVAPSGEIIMDTKCSVVFSPDGHGGLFVALKDAKAYEDMKRRGVEYVFAFGVDNP
+LCEVADPAYMGYCIQRNVKMGYKVVDRRDPQETAGVVCVRDGVINCVEYSELPESVAELR
+DEQSGELVYNAANMLNLFFTLRFMRKIADNPSLMEYHLAKKRIPFVNDNGVRTEPLVPNG
+WKFEKYLVDCTPYANNSVAVMFVKREEEFAPIKNGWNSEVDSPRSARRLLAAHYRRRIER
+AGGKLAADDPDKMVEVSPLVTDRKLAQLLQDKHLVTGPAVLQ
+>ENY64621.1 
+MALNNYIKKTEMDYLYEQAALWLKWDKTPETRKEIEDLVASKNEEELKKRFCKRIEFGTA
+GLRGKMCAGFNCMNNLIVQQASQGLALAVEELVQNAHEKGVVIGYDGRYHSKEFAAITAK
+VFISKGFKTYLFSTLCPTPWTAFAVGYLKTACGVMVTASHNPKADNGYKVYWENGCQIIE
+PIDANIASKIHSNLEPWDLSNVDISKVIDPLADVSAEYYKQMMLTIPHFECPEQPKVKYV
+YTAMHGVGSKYVQDAFKTAKLPQPILVPLQNEPDPEFPTVPFPNPEEGKGALKCSIEVAE
+ANGATVIIANDPDADRLSVAVKSGNGWRQFTGNEMANLIADWTYNKYIVSGDKTPAFMVR
+STVSSSFISKMGEVEGFDTYETLTGFKWIGNKAKEIVDTQHKKLLMAYEEAIGFVIGNMS
+YDKDGVRAAVCFAAMALEYAEQGFNLEDRLNMLYEKYGYFASNNKYYFCYDPKLMEKIFN
+KMRNNGQYYWKFGKYAVKSIRDLTVGIDTAQPDKKPLLPVSASTQMITYTFENGCKATLR
+GSGTEPKLKYYIELPGKKGVKAEDVIAELMDLSHELLQASLEPEKNGLIPPKAE
+>Ppo014092.000
+MSISPSVQELVGKWLQWDKNPQNIKEIKDLVAANNEAELKNRLATRIAFGTAGLRGPMRA
+GFSCMNDLTVIQASQGLCKYLQQMVSDIKTRGIVVGYDGRHHSKEFAEWTAATFLSQGIT
+VYLFTRLVPTPFVSYATPLLRCAAGIMITASHNPKDDNGYKVYWDNGCQINVPHDKGISD
+CIEQNLTPWDINKAELLKSELVKDPTETVASAYLKEIKAKCCFHHDENSQKIPVTYTAMH
+GVGSEWVARAFEVFGLAPYVPVAPQISADPEFPTVAFPNPEEGKGALKLSMEAADKAGST
+LILATDPDADRLAVAEKLPSGSWKIFTGNEIGALLAYWAWLKYKERNPKVDPSKCVVINS
+TVSSKLLKALADKEGLKYDETLTGFKWIGGQAAIRIKEGYTFIFGFEEAIGFLFGDVNLD
+KDGVRAAAVFAEMNIQLHKQGITVVQQLEKIYKLYGYFITRNRYFFCYDPAKMERIFNAI
+RNYNNSGTYPTSCGPFKIKNTRDLTTGYDDSQTDKKAILPVSKSTQMITFFFENGGVVTL
+RGSGTEPKLKYYTELSGSDPEKVKSTLDEMVQAIIDTCLKPVENQLQPPSDE
+>ADB0001102_3
+MSTTTSINKLAQDWLKWDKNPKTRAEIQELVEQNDVKELTARLENRIAFGTAGLRGPMKA
+GFSCMNDLTVIQASQGLCLYVIDTIPNAIKSGVVIGYDGRYNSKEFAKYTAATFLSKGYK
+VYLFSKVVPTPYVAFAVTDLKASIGVMITASHNPKDDNGYKVYWENGCQINTPHDKGIAK
+LIDLNLEPWEINVDQLLSGPLVEDPLDRIVSSYNTKIAQYSVASHVKFANEKIIYTAMHG
+VGGEYTKMAFEAFKLPPFIPVAQQYQPDPAFPTVTFPNPEEGKGALKLSIETAEANGSRL
+ILANDPDADRLAVAERLKDGTWKVFNGNEIGVLLADWAWQNARRSHPDTPAEKFFMINTA
+VSSAMLKTMAKKDGYRCEETLTGFKWVGNRAREVMDAEGLHFLFAYEEAIGFLYGDVSLD
+KDGVRCAAIFAELALSYYANGSSCEDHLESLYKRYGYHISRNRYFFCYEPPKMVAIFNKI
+RNNRNFPTKCGRFEIERVRDLTIDYDDGFPDKKARLPVSTSTQMITFYFKNGAIATLRGS
+GTEPKLKYYVEMIGQDKAHVQQELAELVQCIINEFLRPVENELTPPKDD
+>Carpum
+MTQSTCITSMVINNYLSIYIFIYTINDYLKRSLFVLCLVAKMSHHKVAITHPISSYNSII
+NELAQNWLRWDKNKETRKEIEQLVEQKNEKELYDCLAKRIAFGTADNEIMMLLTHTLHTG
+LRGQMKAGFSNMNDLTVIQASQGLCKYVKETIPEAQKKGVVVGYDCRHHSETFARLTAAT
+FASQGFTVYLYSKMVPTPFVAFGVTDLKACVGVMVTASHNPKEDNGYKVYWENGCQINSP
+HDKGISQQIELNLEPWTIDVNSLLEKVDDPLERVTKSYMDQISKYSVRGSVDMATENVVY
+TAMHGVGGVFVKDAFAAFGLAPYIPVPAQVGPDAEFPTVTLPNPEEGKGALKLSIETAEA
+NNSRLIVANDPDADRLAAAEKLKDGSWKVFNGNEIGVLFADWAWQNARRQHGGDSINPSE
+YFMVTTAVSSSMLRTMATKEGYGYDETLTGFKWVGNKARDLIDQGKKFLFAYEESIGYMY
+GEVSLDKDGVRGAAVFTEMALSCYARGTSCQEHLESLYVKYGYHLSKNRYYFCYDPSKMV
+SIFNRIRNNGEFPKTCGPFEITRIRDLTVDYDNGYEDKKARLPVSSSTQMITFYFKNGAI
+ATLRGSGTEPKLKYYVEMIGDDKEQVKATLDQVHDQVIQQFLRPTENQLSPPSDE
+>Cephalum
+MTTDIYQIAQNWLRWDRNPKTHKEISQLVQDKNESELKARLESRIAFGTAGLRGPMKAGF
+SCMNDLTVIQASQGLCMYVKQTLAPDAERKGIVVGYDGRYNSEVFAKLTAATFVSQGFKV
+HLFSRLVPTPFVAFAVPFLKACVGVMITASHNPKDDNGYKVYWDNGCQINTPHDKGIAKQ
+IELNLEPWNVFYKEYFDRIERYTVRHNKQMAREKIVYSAMHGVGGEYTKRAFEVFALDPF
+IAVKEQFHPDPAFPTVTFPNPEEGKGALKLSIETAEANNNWAWKNGKPYYEKGLGSFPND
+QYFMINTAVSSAMLKTMAMKEGFTYEEVLTGFKWVGNAAQNLIEKGKHLLFAYEEAIGFM
+YGDVSLDKDGVRCAPIFAELAQHLYSKGSSCQDHLEELYKRYGYHISKNRYFFCYDPLKM
+EKIFNRIRNGGQYPTKCGDFEITRIRDLTTGYDTGYPPENKAQLPTSTSTQMITFYFKNG
+GIATLRGSGTEPKLKYYVEMIGDDKENVELILQSMVDQVINQFLRPIENELIPPKD
+>Violaceum
+MVINPFYPYYLYFCYSPGISYQGVKINKTKLEQSTLTTINQWLNGNYDEQTKKNIQNLLD
+QESYTELTDAFYRNLEFGTGGLRGIMGAGSNRINKYTIGTATQGLSNYLLKKYPGEKIKV
+AIAHDSRNNSDQFAKITADVFSANGIYVYFFKELRPTPELSFAIRELGCRSGVMLTASHN
+PKEYNGYKAYGADGGQFTAPDDRLVMDEVAKITSIDEVKFTRIDANIELIGEEIDQLYLD
+KITALSVSPEAISRQKDLKIVYSPIHGTGITLVPKALAQFGFDNVTIVEEQSKPDGNFPT
+VVYPNPEEKEAMTLALKKAQEIDADLVLATDPDADRVGIAVKNNNNEWILLNGNQTGSLL
+VHYVLTAWEEKGKIDGNQYIVKTVVTSNLIEAIAKAKKVDCYNTLTGFKWIGQLITSLQG
+KKTFVVGGEESYGYSVGELVRDKDAVISCAFIAEMTAYYKDKGSSLYNALIDMYVTHGLY
+KEELVSLTKKGKTGAEEIKAMMEKFRNNPPASLGGSKVSTLKDYELGTETDLNTGKISKL
+SLPKSDVLQFVTEDGSIVSARPSGTEPKIKFYCSVNATLSQASEFDKTDEKLGLKINALM
+EDLQK
+>Deminut
+MTDIYQIAQNWLKWDRNPKTHKEISTLVEKKDEAELRARLETRIAFGTAGLRGPMKAGFS
+CMNDLTVIQASQGLSLYVKKTLAGSESKGAVVGYDGRYNSEVFAKLTAATFASQGFKVYL
+FSKVVPTPYVAFAVPELGASVGVMVTASHNPKDDNGYKVYWDNGCQINTPHDKHISELIE
+SNLEPWNVCIYITLQINIDKLLSGVIDPLQVVTSSYMSKIEKYSVKHLPQPLKLATEQKI
+VYTAMHGVGAEYAKLAFEAFSLPPFIPVTQQVTPDPAFPTVAFPNPEEGKGALKLAIETA
+EANKSRIILANDPDADRLAVAEKQPEYVFLFYLISNNGTWKVFNGNEIGILFADWAWQNC
+RRVYPDVPADQFFMINTAVSSAMLKSMAKKDGYIHEETLTGFKWVGNKARELLDQNKRFL
+FAYEEAIGFMYGDVSLDKDGVRCAAIFAELALYQYANGSSCQRHLDSLYERYGYHISKNR
+YFFCYEPPKMVAIFNAIRNNKNYPTKCGEFEIERIRDLTDDYDNGYPDNKARLPISKSTQ
+MITFFFKNGAIATLRGSGTEPKLKYYVEMIGDNKSEVEAILAKVVTAVIDNFLRPVENQL
+TPPKDD
+>Ellipt
+MADLDKLVEDWMRWDKNTKTRDEVQKMVAQGDKKALAAALQNRIAFGTAGLRGPMKAGFA
+NMNDLTVIQASQGLCIYVSATIADAAKKGVVVGYDGRHNSLQFARLTAATFRSKGFKVYL
+FSTVVPTPYVAFSVPELGACVGVMVTASHNPKDDNGYKIDVEKLLKEDGVEDPLEKITAS
+YMSKVADYSIKSHPATKDIVMSDDKIVYTAMHGVGGEYTRRSFKAFSLPEFIPVVQQFHP
+DPEFPTVTFPNPEEGKGALKLAIETAEKNNSRLILANDPDADRLAVAERQPDGTWKVFNG
+NEIGVLFADWAWKNARARDPTTPASEFFMVNTAVSSAMLKTMAKTEGYTYEETLTGFKWV
+GNKAKEAIDKGGRFLFAYEEAIGFMYGDVSLDKDGVRTAPIFAQMALSLYAKGLSCVDHL
+EQLMKTYGYHISRNRYFFCYEPPKMVAIFDKIRNNGNFPKHCGPFEIVRVRDLTVDYDDA
+YEDKKARLPVSTSTQMITFYFKNGAIATLRGSGTEPKLKYYVEMIGDKSAKKEDVEKTLA
+EVVKQVIDNFLRPVENELTPPKDD
+>Lepto
+MASSERLQQLIQDWLKWDKNPTTLSEIQELVKKNDEKELRARLENRIAFGTAGMFLLGPM
+KAGFSCMNDLTVIQASQGLCIYVSDTIPNALNSGVVVGYDGRYNSKEFAKYTAATFLSKG
+YKVYLFSKVVPTPYVAFAVTELKAAIGVMITASHNPKDDNGYKVYWDNGCQINTPHDKGI
+AKQIQLNLEPWNVCAFFLDINANELLSGSSVVDPLDTIVNSYNSKITSYSVGNSGVKLAN
+EKIVYTAMHGVGGEYTKLAFEAFKLPPFVPVPQQYTPDPAFPTVAFPNPEEGKGALKLSI
+ETAEANGSRLILANDPDADRLAVAERNTNGTWKVFNGNEIGVLLADWAWQNARRAHPDTP
+ANRYFMINTAVSSAMLKTMAKHEGYRCDETLTGFKWVGNQARKVIDEEKLNFLFAYEEAI
+GFMYGDVSLDKDGVRCAPIFAEMALSYYAQGHSCEDHLETLYKRYGYHISRNRYFFCYEP
+PKMVAIFDRIRNGRNFPTKCGRFEIERVRDLTVDYDDAYPDKKARLPVSTSTQMITFWFK
+NGGIATLRGSGTEPKLKYYVEMIGQDKQVVEKELAELVDAVIQQFLRPVENELTPPKDD
diff --git a/test/jalview/ext/htsjdk/pgmB.fasta.fai b/test/jalview/ext/htsjdk/pgmB.fasta.fai
new file mode 100644 (file)
index 0000000..40491c6
--- /dev/null
@@ -0,0 +1,15 @@
+DDB_G0280897   603     15      60      61
+PPL_06716      602     641     60      61
+DFA_03821      601     1266    60      61
+DLA_10096      739     1890    60      61
+DPU1265769     466     2654    60      61
+440792448      1302    3139    60      61
+ENY64621.1     594     4476    60      61
+Ppo014092.000  592     5095    60      61
+ADB0001102_3   589     5711    60      61
+Carpum 655     6318    60      61
+Cephalum       536     6994    60      61
+Violaceum      605     7550    60      61
+Deminut        606     8175    60      61
+Ellipt 564     8800    60      61
+Lepto  599     9381    60      61
diff --git a/test/jalview/ext/jmol/1xyz.pdb b/test/jalview/ext/jmol/1xyz.pdb
new file mode 100644 (file)
index 0000000..710313f
--- /dev/null
@@ -0,0 +1,6108 @@
+HEADER    GLYCOSYLTRANSFERASE                     07-JUN-95   1XYZ              
+TITLE     A COMMON PROTEIN FOLD AND SIMILAR ACTIVE SITE IN TWO                  
+TITLE    2 DISTINCT FAMILIES OF BETA-GLYCANASES                                 
+COMPND    MOL_ID: 1;                                                            
+COMPND   2 MOLECULE: 1,4-BETA-D-XYLAN-XYLANOHYDROLASE;                          
+COMPND   3 CHAIN: A, B;                                                         
+COMPND   4 SYNONYM: ENDO-1\,4-BETA-XYLANASE Z, XYLANASE XYNZ;                   
+COMPND   5 EC: 3.2.1.8;                                                         
+COMPND   6 ENGINEERED: YES                                                      
+SOURCE    MOL_ID: 1;                                                            
+SOURCE   2 ORGANISM_SCIENTIFIC: CLOSTRIDIUM THERMOCELLUM;                       
+SOURCE   3 ORGANISM_TAXID: 1515;                                                
+SOURCE   4 STRAIN: NCIB 10682;                                                  
+SOURCE   5 EXPRESSION_SYSTEM: ESCHERICHIA COLI;                                 
+SOURCE   6 EXPRESSION_SYSTEM_TAXID: 562;                                        
+SOURCE   7 EXPRESSION_SYSTEM_PLASMID: PCT1214 (PUC8)                            
+KEYWDS    GLYCOSYL HYDROLASE, XYLANASE, FAMILY F/10 OF GLYCOSYL                 
+KEYWDS   2 HYDROLASES, CLOSTRIDIUM THERMOCELLUM, GLYCOSYLTRANSFERASE            
+EXPDTA    X-RAY DIFFRACTION                                                     
+AUTHOR    P.M.ALZARI,S.SPINELLI,R.DOMINGUEZ                                     
+REVDAT   2   24-FEB-09 1XYZ    1       VERSN                                    
+REVDAT   1   29-JAN-96 1XYZ    0                                                
+JRNL        AUTH   R.DOMINGUEZ,H.SOUCHON,S.SPINELLI,Z.DAUTER,                   
+JRNL        AUTH 2 K.S.WILSON,S.CHAUVAUX,P.BEGUIN,P.M.ALZARI                    
+JRNL        TITL   A COMMON PROTEIN FOLD AND SIMILAR ACTIVE SITE IN             
+JRNL        TITL 2 TWO DISTINCT FAMILIES OF BETA-GLYCANASES.                    
+JRNL        REF    NAT.STRUCT.BIOL.              V.   2   569 1995              
+JRNL        REFN                   ISSN 1072-8368                               
+JRNL        PMID   7664125                                                      
+JRNL        DOI    10.1038/NSB0795-569                                          
+REMARK   1                                                                      
+REMARK   1 REFERENCE 1                                                          
+REMARK   1  AUTH   H.SOUCHON,S.SPINELLI,P.BEGUIN,P.M.ALZARI                     
+REMARK   1  TITL   CRYSTALLIZATION AND PRELIMINARY DIFFRACTION                  
+REMARK   1  TITL 2 ANALYSIS OF THE CATALYTIC DOMAIN OF XYLANASE Z               
+REMARK   1  TITL 3 FROM CLOSTRIDIUM THERMOCELLUM                                
+REMARK   1  REF    J.MOL.BIOL.                   V. 235  1348 1994              
+REMARK   1  REFN                   ISSN 0022-2836                               
+REMARK   2                                                                      
+REMARK   2 RESOLUTION.    1.40 ANGSTROMS.                                       
+REMARK   3                                                                      
+REMARK   3 REFINEMENT.                                                          
+REMARK   3   PROGRAM     : ARP/WARP, X-PLOR                                     
+REMARK   3   AUTHORS     : LAMZIN,PERRAKIS,MORRIS                               
+REMARK   3                                                                      
+REMARK   3  DATA USED IN REFINEMENT.                                            
+REMARK   3   RESOLUTION RANGE HIGH (ANGSTROMS) : 1.40                           
+REMARK   3   RESOLUTION RANGE LOW  (ANGSTROMS) : 10.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)   (%) : NULL                           
+REMARK   3   NUMBER OF REFLECTIONS             : 117046                         
+REMARK   3                                                                      
+REMARK   3  FIT TO DATA USED IN REFINEMENT.                                     
+REMARK   3   CROSS-VALIDATION METHOD          : NULL                            
+REMARK   3   FREE R VALUE TEST SET SELECTION  : NULL                            
+REMARK   3   R VALUE            (WORKING SET) : 0.183                           
+REMARK   3   FREE R VALUE                     : 0.221                           
+REMARK   3   FREE R VALUE TEST SET SIZE   (%) : NULL                            
+REMARK   3   FREE R VALUE TEST SET COUNT      : NULL                            
+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) : NULL                         
+REMARK   3   BIN RESOLUTION RANGE LOW        (A) : NULL                         
+REMARK   3   BIN COMPLETENESS (WORKING+TEST) (%) : NULL                         
+REMARK   3   REFLECTIONS IN BIN    (WORKING SET) : NULL                         
+REMARK   3   BIN R VALUE           (WORKING SET) : NULL                         
+REMARK   3   BIN FREE R VALUE                    : NULL                         
+REMARK   3   BIN FREE R VALUE TEST SET SIZE  (%) : NULL                         
+REMARK   3   BIN FREE R VALUE TEST SET COUNT     : NULL                         
+REMARK   3   ESTIMATED ERROR OF BIN FREE R VALUE : NULL                         
+REMARK   3                                                                      
+REMARK   3  NUMBER OF NON-HYDROGEN ATOMS USED IN REFINEMENT.                    
+REMARK   3   PROTEIN ATOMS            : 5166                                    
+REMARK   3   NUCLEIC ACID ATOMS       : 0                                       
+REMARK   3   HETEROGEN ATOMS          : 0                                       
+REMARK   3   SOLVENT ATOMS            : 457                                     
+REMARK   3                                                                      
+REMARK   3  B VALUES.                                                           
+REMARK   3   FROM WILSON PLOT           (A**2) : NULL                           
+REMARK   3   MEAN B VALUE      (OVERALL, A**2) : NULL                           
+REMARK   3   OVERALL ANISOTROPIC B VALUE.                                       
+REMARK   3    B11 (A**2) : NULL                                                 
+REMARK   3    B22 (A**2) : NULL                                                 
+REMARK   3    B33 (A**2) : NULL                                                 
+REMARK   3    B12 (A**2) : NULL                                                 
+REMARK   3    B13 (A**2) : NULL                                                 
+REMARK   3    B23 (A**2) : NULL                                                 
+REMARK   3                                                                      
+REMARK   3  ESTIMATED COORDINATE ERROR.                                         
+REMARK   3   ESD FROM LUZZATI PLOT        (A) : NULL                            
+REMARK   3   ESD FROM SIGMAA              (A) : NULL                            
+REMARK   3   LOW RESOLUTION CUTOFF        (A) : NULL                            
+REMARK   3                                                                      
+REMARK   3  CROSS-VALIDATED ESTIMATED COORDINATE ERROR.                         
+REMARK   3   ESD FROM C-V LUZZATI PLOT    (A) : NULL                            
+REMARK   3   ESD FROM C-V SIGMAA          (A) : NULL                            
+REMARK   3                                                                      
+REMARK   3  RMS DEVIATIONS FROM IDEAL VALUES.                                   
+REMARK   3   BOND LENGTHS                 (A) : 0.015                           
+REMARK   3   BOND ANGLES            (DEGREES) : 1.61                            
+REMARK   3   DIHEDRAL ANGLES        (DEGREES) : 23.20                           
+REMARK   3   IMPROPER ANGLES        (DEGREES) : 1.58                            
+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  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  : NULL                                           
+REMARK   3  TOPOLOGY FILE  1   : NULL                                           
+REMARK   3                                                                      
+REMARK   3  OTHER REFINEMENT REMARKS: NULL                                      
+REMARK   4                                                                      
+REMARK   4 1XYZ 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        : NOV-93                             
+REMARK 200  TEMPERATURE           (KELVIN) : NULL                               
+REMARK 200  PH                             : NULL                               
+REMARK 200  NUMBER OF CRYSTALS USED        : 1                                  
+REMARK 200                                                                      
+REMARK 200  SYNCHROTRON              (Y/N) : Y                                  
+REMARK 200  RADIATION SOURCE               : EMBL/DESY, HAMBURG                 
+REMARK 200  BEAMLINE                       : X31                                
+REMARK 200  X-RAY GENERATOR MODEL          : NULL                               
+REMARK 200  MONOCHROMATIC OR LAUE    (M/L) : M                                  
+REMARK 200  WAVELENGTH OR RANGE        (A) : 0.92                               
+REMARK 200  MONOCHROMATOR                  : NULL                               
+REMARK 200  OPTICS                         : NULL                               
+REMARK 200                                                                      
+REMARK 200  DETECTOR TYPE                  : IMAGE PLATE                        
+REMARK 200  DETECTOR MANUFACTURER          : MARRESEARCH                        
+REMARK 200  INTENSITY-INTEGRATION SOFTWARE : DENZO                              
+REMARK 200  DATA SCALING SOFTWARE          : NULL                               
+REMARK 200                                                                      
+REMARK 200  NUMBER OF UNIQUE REFLECTIONS   : 11704                              
+REMARK 200  RESOLUTION RANGE HIGH      (A) : NULL                               
+REMARK 200  RESOLUTION RANGE LOW       (A) : NULL                               
+REMARK 200  REJECTION CRITERIA  (SIGMA(I)) : NULL                               
+REMARK 200                                                                      
+REMARK 200 OVERALL.                                                             
+REMARK 200  COMPLETENESS FOR RANGE     (%) : 96.4                               
+REMARK 200  DATA REDUNDANCY                : 2.900                              
+REMARK 200  R MERGE                    (I) : 0.08300                            
+REMARK 200  R SYM                      (I) : NULL                               
+REMARK 200  <I/SIGMA(I)> FOR THE DATA SET  : NULL                               
+REMARK 200                                                                      
+REMARK 200 IN THE HIGHEST RESOLUTION SHELL.                                     
+REMARK 200  HIGHEST RESOLUTION SHELL, RANGE HIGH (A) : NULL                     
+REMARK 200  HIGHEST RESOLUTION SHELL, RANGE LOW  (A) : NULL                     
+REMARK 200  COMPLETENESS FOR SHELL     (%) : NULL                               
+REMARK 200  DATA REDUNDANCY IN SHELL       : NULL                               
+REMARK 200  R MERGE FOR SHELL          (I) : NULL                               
+REMARK 200  R SYM FOR SHELL            (I) : NULL                               
+REMARK 200  <I/SIGMA(I)> FOR SHELL         : NULL                               
+REMARK 200                                                                      
+REMARK 200 DIFFRACTION PROTOCOL: NULL                                           
+REMARK 200 METHOD USED TO DETERMINE THE STRUCTURE: NULL                         
+REMARK 200 SOFTWARE USED: ARP/WARP, X-PLOR                                      
+REMARK 200 STARTING MODEL: NULL                                                 
+REMARK 200                                                                      
+REMARK 200 REMARK: NULL                                                         
+REMARK 280                                                                      
+REMARK 280 CRYSTAL                                                              
+REMARK 280 SOLVENT CONTENT, VS   (%): 40.63                                     
+REMARK 280 MATTHEWS COEFFICIENT, VM (ANGSTROMS**3/DA): 2.07                     
+REMARK 280                                                                      
+REMARK 280 CRYSTALLIZATION CONDITIONS: NULL                                     
+REMARK 290                                                                      
+REMARK 290 CRYSTALLOGRAPHIC SYMMETRY                                            
+REMARK 290 SYMMETRY OPERATORS FOR SPACE GROUP: P 1                              
+REMARK 290                                                                      
+REMARK 290      SYMOP   SYMMETRY                                                
+REMARK 290     NNNMMM   OPERATOR                                                
+REMARK 290       1555   X,Y,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                                                                      
+REMARK 290 REMARK: NULL                                                         
+REMARK 300                                                                      
+REMARK 300 BIOMOLECULE: 1, 2                                                    
+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:                                                              
+REMARK 300 MTRIX                                                                
+REMARK 300  THE TRANSFORMATIONS PRESENTED ON MTRIX RECORDS BELOW                
+REMARK 300  DESCRIBE NON-CRYSTALLOGRAPHIC RELATIONSHIPS AMONG THE               
+REMARK 300  VARIOUS DOMAINS IN THIS ENTRY.  APPLYING THE APPROPRIATE            
+REMARK 300  MTRIX TRANSFORMATION TO THE RESIDUES LISTED FIRST WILL              
+REMARK 300  YIELD APPROXIMATE COORDINATES FOR THE RESIDUES LISTED               
+REMARK 300  SECOND.                                                             
+REMARK 300                                                                      
+REMARK 300            APPLIED TO           TRANSFORMED TO                       
+REMARK 300  MTRIX      RESIDUES               RESIDUES         RMSD             
+REMARK 300    M1   A  516  ..  A  835     B  516  ..  B  835   0.287            
+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 350                                                                      
+REMARK 350 BIOMOLECULE: 2                                                       
+REMARK 350 AUTHOR DETERMINED BIOLOGICAL UNIT: MONOMERIC                         
+REMARK 350 APPLY THE FOLLOWING TO CHAINS: B                                     
+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     PRO A   491                                                      
+REMARK 465     GLY A   492                                                      
+REMARK 465     GLN A   493                                                      
+REMARK 465     GLY A   494                                                      
+REMARK 465     ASP A   495                                                      
+REMARK 465     VAL A   496                                                      
+REMARK 465     GLN A   497                                                      
+REMARK 465     THR A   498                                                      
+REMARK 465     PRO A   499                                                      
+REMARK 465     ASN A   500                                                      
+REMARK 465     PRO A   501                                                      
+REMARK 465     SER A   502                                                      
+REMARK 465     VAL A   503                                                      
+REMARK 465     THR A   504                                                      
+REMARK 465     PRO A   505                                                      
+REMARK 465     THR A   506                                                      
+REMARK 465     GLN A   507                                                      
+REMARK 465     THR A   508                                                      
+REMARK 465     PRO A   509                                                      
+REMARK 465     ILE A   510                                                      
+REMARK 465     PRO A   511                                                      
+REMARK 465     THR A   512                                                      
+REMARK 465     ILE A   513                                                      
+REMARK 465     SER A   514                                                      
+REMARK 465     GLY A   515                                                      
+REMARK 465     GLY A   836                                                      
+REMARK 465     TYR A   837                                                      
+REMARK 465     PRO B   491                                                      
+REMARK 465     GLY B   492                                                      
+REMARK 465     GLN B   493                                                      
+REMARK 465     GLY B   494                                                      
+REMARK 465     ASP B   495                                                      
+REMARK 465     VAL B   496                                                      
+REMARK 465     GLN B   497                                                      
+REMARK 465     THR B   498                                                      
+REMARK 465     PRO B   499                                                      
+REMARK 465     ASN B   500                                                      
+REMARK 465     PRO B   501                                                      
+REMARK 465     SER B   502                                                      
+REMARK 465     VAL B   503                                                      
+REMARK 465     THR B   504                                                      
+REMARK 465     PRO B   505                                                      
+REMARK 465     THR B   506                                                      
+REMARK 465     GLN B   507                                                      
+REMARK 465     THR B   508                                                      
+REMARK 465     PRO B   509                                                      
+REMARK 465     ILE B   510                                                      
+REMARK 465     PRO B   511                                                      
+REMARK 465     THR B   512                                                      
+REMARK 465     ILE B   513                                                      
+REMARK 465     SER B   514                                                      
+REMARK 465     GLY B   515                                                      
+REMARK 465     GLY B   836                                                      
+REMARK 465     TYR B   837                                                      
+REMARK 500                                                                      
+REMARK 500 GEOMETRY AND STEREOCHEMISTRY                                         
+REMARK 500 SUBTOPIC: CLOSE CONTACTS IN SAME ASYMMETRIC UNIT                     
+REMARK 500                                                                      
+REMARK 500 THE FOLLOWING ATOMS ARE IN CLOSE CONTACT.                            
+REMARK 500                                                                      
+REMARK 500  ATM1  RES C  SSEQI   ATM2  RES C  SSEQI           DISTANCE          
+REMARK 500   O    HOH A     8     O    HOH A   204              2.06            
+REMARK 500   SD   MET A   562     O    HOH A   193              2.11            
+REMARK 500   O    HOH B   279     O    HOH B   358              2.16            
+REMARK 500   ND2  ASN A   828     O    HOH A   104              2.17            
+REMARK 500   O    HOH A    72     O    HOH A   190              2.17            
+REMARK 500   O    HOH B   312     O    HOH B   369              2.18            
+REMARK 500   O    HOH A   175     O    HOH B   116              2.19            
+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    ASP A 693     -151.50    -91.34                                   
+REMARK 500    GLU A 754       45.56   -146.41                                   
+REMARK 500    ASN A 813       59.68     38.32                                   
+REMARK 500    ASN B 560      -17.68   -141.26                                   
+REMARK 500    ASP B 693     -150.15    -91.02                                   
+REMARK 500    GLU B 754       46.57   -142.59                                   
+REMARK 500    SER B 762        4.24     50.65                                   
+REMARK 500    ASN B 813       61.25     36.76                                   
+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 B 299        DISTANCE = 13.50 ANGSTROMS                       
+REMARK 525    HOH A  98        DISTANCE =  9.05 ANGSTROMS                       
+REMARK 525    HOH A 100        DISTANCE =  9.72 ANGSTROMS                       
+REMARK 525    HOH B 356        DISTANCE =  5.34 ANGSTROMS                       
+REMARK 525    HOH B 368        DISTANCE =  8.39 ANGSTROMS                       
+REMARK 525    HOH B 380        DISTANCE = 11.09 ANGSTROMS                       
+REMARK 525    HOH B 403        DISTANCE =  5.08 ANGSTROMS                       
+REMARK 525    HOH B 409        DISTANCE = 18.99 ANGSTROMS                       
+REMARK 525    HOH A 225        DISTANCE =  5.08 ANGSTROMS                       
+REMARK 525    HOH A 230        DISTANCE =  5.81 ANGSTROMS                       
+DBREF  1XYZ A  491   837  UNP    P10478   XYNZ_CLOTM     491    837             
+DBREF  1XYZ B  491   837  UNP    P10478   XYNZ_CLOTM     491    837             
+SEQRES   1 A  347  PRO GLY GLN GLY ASP VAL GLN THR PRO ASN PRO SER VAL          
+SEQRES   2 A  347  THR PRO THR GLN THR PRO ILE PRO THR ILE SER GLY ASN          
+SEQRES   3 A  347  ALA LEU ARG ASP TYR ALA GLU ALA ARG GLY ILE LYS ILE          
+SEQRES   4 A  347  GLY THR CYS VAL ASN TYR PRO PHE TYR ASN ASN SER ASP          
+SEQRES   5 A  347  PRO THR TYR ASN SER ILE LEU GLN ARG GLU PHE SER MET          
+SEQRES   6 A  347  VAL VAL CYS GLU ASN GLU MET LYS PHE ASP ALA LEU GLN          
+SEQRES   7 A  347  PRO ARG GLN ASN VAL PHE ASP PHE SER LYS GLY ASP GLN          
+SEQRES   8 A  347  LEU LEU ALA PHE ALA GLU ARG ASN GLY MET GLN MET ARG          
+SEQRES   9 A  347  GLY HIS THR LEU ILE TRP HIS ASN GLN ASN PRO SER TRP          
+SEQRES  10 A  347  LEU THR ASN GLY ASN TRP ASN ARG ASP SER LEU LEU ALA          
+SEQRES  11 A  347  VAL MET LYS ASN HIS ILE THR THR VAL MET THR HIS TYR          
+SEQRES  12 A  347  LYS GLY LYS ILE VAL GLU TRP ASP VAL ALA ASN GLU CYS          
+SEQRES  13 A  347  MET ASP ASP SER GLY ASN GLY LEU ARG SER SER ILE TRP          
+SEQRES  14 A  347  ARG ASN VAL ILE GLY GLN ASP TYR LEU ASP TYR ALA PHE          
+SEQRES  15 A  347  ARG TYR ALA ARG GLU ALA ASP PRO ASP ALA LEU LEU PHE          
+SEQRES  16 A  347  TYR ASN ASP TYR ASN ILE GLU ASP LEU GLY PRO LYS SER          
+SEQRES  17 A  347  ASN ALA VAL PHE ASN MET ILE LYS SER MET LYS GLU ARG          
+SEQRES  18 A  347  GLY VAL PRO ILE ASP GLY VAL GLY PHE GLN CYS HIS PHE          
+SEQRES  19 A  347  ILE ASN GLY MET SER PRO GLU TYR LEU ALA SER ILE ASP          
+SEQRES  20 A  347  GLN ASN ILE LYS ARG TYR ALA GLU ILE GLY VAL ILE VAL          
+SEQRES  21 A  347  SER PHE THR GLU ILE ASP ILE ARG ILE PRO GLN SER GLU          
+SEQRES  22 A  347  ASN PRO ALA THR ALA PHE GLN VAL GLN ALA ASN ASN TYR          
+SEQRES  23 A  347  LYS GLU LEU MET LYS ILE CYS LEU ALA ASN PRO ASN CYS          
+SEQRES  24 A  347  ASN THR PHE VAL MET TRP GLY PHE THR ASP LYS TYR THR          
+SEQRES  25 A  347  TRP ILE PRO GLY THR PHE PRO GLY TYR GLY ASN PRO LEU          
+SEQRES  26 A  347  ILE TYR ASP SER ASN TYR ASN PRO LYS PRO ALA TYR ASN          
+SEQRES  27 A  347  ALA ILE LYS GLU ALA LEU MET GLY TYR                          
+SEQRES   1 B  347  PRO GLY GLN GLY ASP VAL GLN THR PRO ASN PRO SER VAL          
+SEQRES   2 B  347  THR PRO THR GLN THR PRO ILE PRO THR ILE SER GLY ASN          
+SEQRES   3 B  347  ALA LEU ARG ASP TYR ALA GLU ALA ARG GLY ILE LYS ILE          
+SEQRES   4 B  347  GLY THR CYS VAL ASN TYR PRO PHE TYR ASN ASN SER ASP          
+SEQRES   5 B  347  PRO THR TYR ASN SER ILE LEU GLN ARG GLU PHE SER MET          
+SEQRES   6 B  347  VAL VAL CYS GLU ASN GLU MET LYS PHE ASP ALA LEU GLN          
+SEQRES   7 B  347  PRO ARG GLN ASN VAL PHE ASP PHE SER LYS GLY ASP GLN          
+SEQRES   8 B  347  LEU LEU ALA PHE ALA GLU ARG ASN GLY MET GLN MET ARG          
+SEQRES   9 B  347  GLY HIS THR LEU ILE TRP HIS ASN GLN ASN PRO SER TRP          
+SEQRES  10 B  347  LEU THR ASN GLY ASN TRP ASN ARG ASP SER LEU LEU ALA          
+SEQRES  11 B  347  VAL MET LYS ASN HIS ILE THR THR VAL MET THR HIS TYR          
+SEQRES  12 B  347  LYS GLY LYS ILE VAL GLU TRP ASP VAL ALA ASN GLU CYS          
+SEQRES  13 B  347  MET ASP ASP SER GLY ASN GLY LEU ARG SER SER ILE TRP          
+SEQRES  14 B  347  ARG ASN VAL ILE GLY GLN ASP TYR LEU ASP TYR ALA PHE          
+SEQRES  15 B  347  ARG TYR ALA ARG GLU ALA ASP PRO ASP ALA LEU LEU PHE          
+SEQRES  16 B  347  TYR ASN ASP TYR ASN ILE GLU ASP LEU GLY PRO LYS SER          
+SEQRES  17 B  347  ASN ALA VAL PHE ASN MET ILE LYS SER MET LYS GLU ARG          
+SEQRES  18 B  347  GLY VAL PRO ILE ASP GLY VAL GLY PHE GLN CYS HIS PHE          
+SEQRES  19 B  347  ILE ASN GLY MET SER PRO GLU TYR LEU ALA SER ILE ASP          
+SEQRES  20 B  347  GLN ASN ILE LYS ARG TYR ALA GLU ILE GLY VAL ILE VAL          
+SEQRES  21 B  347  SER PHE THR GLU ILE ASP ILE ARG ILE PRO GLN SER GLU          
+SEQRES  22 B  347  ASN PRO ALA THR ALA PHE GLN VAL GLN ALA ASN ASN TYR          
+SEQRES  23 B  347  LYS GLU LEU MET LYS ILE CYS LEU ALA ASN PRO ASN CYS          
+SEQRES  24 B  347  ASN THR PHE VAL MET TRP GLY PHE THR ASP LYS TYR THR          
+SEQRES  25 B  347  TRP ILE PRO GLY THR PHE PRO GLY TYR GLY ASN PRO LEU          
+SEQRES  26 B  347  ILE TYR ASP SER ASN TYR ASN PRO LYS PRO ALA TYR ASN          
+SEQRES  27 B  347  ALA ILE LYS GLU ALA LEU MET GLY TYR                          
+FORMUL   3  HOH   *457(H2 O)                                                    
+HELIX    1   1 LEU A  518  ARG A  525  1                                   8    
+HELIX    2   2 TYR A  535  ASN A  539  5                                   5    
+HELIX    3   3 PRO A  543  GLU A  552  1                                  10    
+HELIX    4   4 PHE A  564  LEU A  567  1                                   4    
+HELIX    5   5 SER A  577  ASN A  589  1                                  13    
+HELIX    6   6 SER A  606  THR A  609  1                                   4    
+HELIX    7   7 ARG A  615  HIS A  632  1                                  18    
+HELIX    8   8 ILE A  658  ILE A  663  1                                   6    
+HELIX    9   9 TYR A  667  ALA A  678  1                                  12    
+HELIX   10  10 PRO A  696  ARG A  711  1                                  16    
+HELIX   11  11 PRO A  730  ILE A  746  1                                  17    
+HELIX   12  12 PRO A  765  ALA A  785  1                                  21    
+HELIX   13  13 ILE A  804  THR A  807  1                                   4    
+HELIX   14  14 PRO A  825  LEU A  834  1                                  10    
+HELIX   15  15 LEU B  518  ARG B  525  1                                   8    
+HELIX   16  16 TYR B  535  ASN B  539  5                                   5    
+HELIX   17  17 PRO B  543  GLU B  552  1                                  10    
+HELIX   18  18 PHE B  564  LEU B  567  1                                   4    
+HELIX   19  19 SER B  577  ASN B  589  1                                  13    
+HELIX   20  20 SER B  606  THR B  609  1                                   4    
+HELIX   21  21 ARG B  615  HIS B  632  1                                  18    
+HELIX   22  22 ILE B  658  ILE B  663  1                                   6    
+HELIX   23  23 TYR B  667  ALA B  678  1                                  12    
+HELIX   24  24 PRO B  696  GLU B  710  1                                  15    
+HELIX   25  25 PRO B  730  ILE B  746  1                                  17    
+HELIX   26  26 PRO B  765  ALA B  785  1                                  21    
+HELIX   27  27 ILE B  804  THR B  807  1                                   4    
+HELIX   28  28 PRO B  825  ALA B  833  1                                   9    
+SHEET    1   A 8 GLN A 592  ARG A 594  0                                        
+SHEET    2   A 8 MET A 555  CYS A 558  1  N  VAL A 556   O  GLN A 592           
+SHEET    3   A 8 LYS A 528  VAL A 533  1  N  THR A 531   O  MET A 555           
+SHEET    4   A 8 CYS A 789  MET A 794  1  N  PHE A 792   O  LYS A 528           
+SHEET    5   A 8 ILE A 749  PHE A 752  1  N  VAL A 750   O  ASN A 790           
+SHEET    6   A 8 GLY A 717  PHE A 720  1  N  VAL A 718   O  ILE A 749           
+SHEET    7   A 8 LEU A 683  ASP A 688  1  N  TYR A 686   O  GLY A 717           
+SHEET    8   A 8 GLU A 639  ASN A 644  1  N  TRP A 640   O  LEU A 683           
+SHEET    1   B 2 HIS A 723  ILE A 725  0                                        
+SHEET    2   B 2 ASP A 756  ARG A 758  1  N  ASP A 756   O  PHE A 724           
+SHEET    1   C 8 GLN B 592  ARG B 594  0                                        
+SHEET    2   C 8 MET B 555  CYS B 558  1  N  VAL B 556   O  GLN B 592           
+SHEET    3   C 8 LYS B 528  VAL B 533  1  N  THR B 531   O  MET B 555           
+SHEET    4   C 8 CYS B 789  MET B 794  1  N  PHE B 792   O  LYS B 528           
+SHEET    5   C 8 ILE B 749  PHE B 752  1  N  VAL B 750   O  ASN B 790           
+SHEET    6   C 8 GLY B 717  PHE B 720  1  N  VAL B 718   O  ILE B 749           
+SHEET    7   C 8 LEU B 683  ASP B 688  1  N  TYR B 686   O  GLY B 717           
+SHEET    8   C 8 GLU B 639  ASN B 644  1  N  TRP B 640   O  LEU B 683           
+SHEET    1   D 2 HIS B 723  ILE B 725  0                                        
+SHEET    2   D 2 ASP B 756  ARG B 758  1  N  ASP B 756   O  PHE B 724           
+CISPEP   1 HIS A  596    THR A  597          0         0.11                     
+CISPEP   2 HIS B  596    THR B  597          0         0.29                     
+CRYST1   47.100   51.100   70.740 100.54  83.79 101.64 P 1           2          
+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.021231  0.004374 -0.001609        0.00000                         
+SCALE2      0.000000  0.019980  0.003352        0.00000                         
+SCALE3      0.000000  0.000000  0.014418        0.00000                         
+MTRIX1   1 -0.999970  0.003570  0.006220       23.67979    1                    
+MTRIX2   1  0.006340  0.034090  0.999400       -4.45463    1                    
+MTRIX3   1  0.003360  0.999410 -0.034110       56.27028    1                    
+ATOM      1  N   ASN A 516      41.511  25.152  36.876  1.00 22.29           N  
+ATOM      2  CA  ASN A 516      40.907  25.555  35.563  1.00 21.77           C  
+ATOM      3  C   ASN A 516      39.684  24.707  35.106  1.00 19.45           C  
+ATOM      4  O   ASN A 516      39.191  24.916  34.001  1.00 18.37           O  
+ATOM      5  CB  ASN A 516      41.970  25.570  34.422  1.00 25.18           C  
+ATOM      6  CG  ASN A 516      43.166  26.528  34.694  1.00 28.53           C  
+ATOM      7  OD1 ASN A 516      43.247  27.183  35.761  1.00 31.23           O  
+ATOM      8  ND2 ASN A 516      44.122  26.565  33.756  1.00 28.63           N  
+ATOM      9  N   ALA A 517      39.186  23.778  35.939  1.00 15.70           N  
+ATOM     10  CA  ALA A 517      38.027  22.952  35.538  1.00 14.27           C  
+ATOM     11  C   ALA A 517      36.730  23.719  35.746  1.00 12.59           C  
+ATOM     12  O   ALA A 517      36.707  24.699  36.480  1.00 12.14           O  
+ATOM     13  CB  ALA A 517      37.986  21.654  36.326  1.00 14.12           C  
+ATOM     14  N   LEU A 518      35.647  23.273  35.115  1.00 11.39           N  
+ATOM     15  CA  LEU A 518      34.366  23.944  35.280  1.00 11.22           C  
+ATOM     16  C   LEU A 518      33.984  24.033  36.768  1.00 10.88           C  
+ATOM     17  O   LEU A 518      33.537  25.080  37.228  1.00 11.47           O  
+ATOM     18  CB  LEU A 518      33.276  23.197  34.525  1.00 11.98           C  
+ATOM     19  CG  LEU A 518      33.253  23.288  33.007  1.00 12.97           C  
+ATOM     20  CD1 LEU A 518      32.199  22.294  32.471  1.00 13.61           C  
+ATOM     21  CD2 LEU A 518      32.943  24.720  32.590  1.00 13.01           C  
+ATOM     22  N   ARG A 519      34.201  22.959  37.533  1.00 10.76           N  
+ATOM     23  CA  ARG A 519      33.856  22.980  38.959  1.00 11.30           C  
+ATOM     24  C   ARG A 519      34.623  24.033  39.770  1.00 13.05           C  
+ATOM     25  O   ARG A 519      34.129  24.518  40.770  1.00 13.26           O  
+ATOM     26  CB  ARG A 519      34.047  21.612  39.610  1.00 11.25           C  
+ATOM     27  CG  ARG A 519      35.464  21.144  39.631  1.00 12.52           C  
+ATOM     28  CD  ARG A 519      35.624  19.805  40.289  1.00 15.25           C  
+ATOM     29  NE  ARG A 519      35.222  19.856  41.678  1.00 17.64           N  
+ATOM     30  CZ  ARG A 519      35.125  18.774  42.447  1.00 19.57           C  
+ATOM     31  NH1 ARG A 519      35.403  17.566  41.943  1.00 20.77           N  
+ATOM     32  NH2 ARG A 519      34.757  18.903  43.707  1.00 20.67           N  
+ATOM     33  N   ASP A 520      35.818  24.409  39.330  1.00 13.66           N  
+ATOM     34  CA  ASP A 520      36.605  25.420  40.057  1.00 15.27           C  
+ATOM     35  C   ASP A 520      35.994  26.819  39.900  1.00 15.32           C  
+ATOM     36  O   ASP A 520      35.875  27.572  40.864  1.00 16.59           O  
+ATOM     37  CB  ASP A 520      38.056  25.409  39.563  1.00 16.63           C  
+ATOM     38  CG  ASP A 520      38.717  24.070  39.771  1.00 18.58           C  
+ATOM     39  OD1 ASP A 520      38.507  23.499  40.860  1.00 20.36           O  
+ATOM     40  OD2 ASP A 520      39.409  23.562  38.864  1.00 18.95           O  
+ATOM     41  N   TYR A 521      35.607  27.159  38.680  1.00 14.43           N  
+ATOM     42  CA  TYR A 521      34.999  28.446  38.424  1.00 15.53           C  
+ATOM     43  C   TYR A 521      33.606  28.496  39.035  1.00 15.66           C  
+ATOM     44  O   TYR A 521      33.161  29.542  39.518  1.00 15.87           O  
+ATOM     45  CB  TYR A 521      34.936  28.692  36.930  1.00 17.67           C  
+ATOM     46  CG  TYR A 521      36.303  28.908  36.363  1.00 21.57           C  
+ATOM     47  CD1 TYR A 521      37.054  30.035  36.730  1.00 23.83           C  
+ATOM     48  CD2 TYR A 521      36.873  27.984  35.504  1.00 22.47           C  
+ATOM     49  CE1 TYR A 521      38.347  30.235  36.255  1.00 24.99           C  
+ATOM     50  CE2 TYR A 521      38.169  28.171  35.016  1.00 24.67           C  
+ATOM     51  CZ  TYR A 521      38.896  29.302  35.398  1.00 25.79           C  
+ATOM     52  OH  TYR A 521      40.165  29.509  34.903  1.00 27.89           O  
+ATOM     53  N   ALA A 522      32.906  27.366  38.988  1.00 13.96           N  
+ATOM     54  CA  ALA A 522      31.570  27.312  39.556  1.00 14.62           C  
+ATOM     55  C   ALA A 522      31.654  27.491  41.058  1.00 14.50           C  
+ATOM     56  O   ALA A 522      30.933  28.297  41.615  1.00 15.27           O  
+ATOM     57  CB  ALA A 522      30.907  25.982  39.213  1.00 14.67           C  
+ATOM     58  N   GLU A 523      32.534  26.739  41.706  1.00 15.66           N  
+ATOM     59  CA  GLU A 523      32.718  26.826  43.155  1.00 20.86           C  
+ATOM     60  C   GLU A 523      32.995  28.282  43.575  1.00 20.93           C  
+ATOM     61  O   GLU A 523      32.429  28.775  44.549  1.00 20.13           O  
+ATOM     62  CB  GLU A 523      33.873  25.912  43.621  1.00 24.74           C  
+ATOM     63  CG  GLU A 523      33.507  24.407  43.599  1.00 32.08           C  
+ATOM     64  CD  GLU A 523      34.707  23.414  43.527  1.00 35.74           C  
+ATOM     65  OE1 GLU A 523      35.852  23.761  43.957  1.00 38.51           O  
+ATOM     66  OE2 GLU A 523      34.482  22.266  43.040  1.00 36.79           O  
+ATOM     67  N   ALA A 524      33.810  28.981  42.794  1.00 20.38           N  
+ATOM     68  CA  ALA A 524      34.166  30.364  43.086  1.00 20.61           C  
+ATOM     69  C   ALA A 524      32.939  31.280  43.078  1.00 20.43           C  
+ATOM     70  O   ALA A 524      32.920  32.354  43.707  1.00 21.31           O  
+ATOM     71  CB  ALA A 524      35.213  30.848  42.069  1.00 21.00           C  
+ATOM     72  N   ARG A 525      31.911  30.857  42.361  1.00 18.97           N  
+ATOM     73  CA  ARG A 525      30.701  31.641  42.259  1.00 18.39           C  
+ATOM     74  C   ARG A 525      29.567  31.127  43.152  1.00 17.82           C  
+ATOM     75  O   ARG A 525      28.486  31.697  43.136  1.00 18.38           O  
+ATOM     76  CB  ARG A 525      30.249  31.690  40.800  1.00 19.29           C  
+ATOM     77  CG  ARG A 525      31.317  32.203  39.823  1.00 21.17           C  
+ATOM     78  CD  ARG A 525      31.730  33.670  40.097  1.00 22.80           C  
+ATOM     79  NE  ARG A 525      30.630  34.606  39.879  1.00 25.15           N  
+ATOM     80  CZ  ARG A 525      30.277  35.123  38.699  1.00 26.64           C  
+ATOM     81  NH1 ARG A 525      30.939  34.819  37.588  1.00 27.98           N  
+ATOM     82  NH2 ARG A 525      29.212  35.914  38.623  1.00 27.62           N  
+ATOM     83  N   GLY A 526      29.815  30.071  43.932  1.00 17.65           N  
+ATOM     84  CA  GLY A 526      28.786  29.496  44.809  1.00 17.76           C  
+ATOM     85  C   GLY A 526      27.692  28.668  44.122  1.00 17.76           C  
+ATOM     86  O   GLY A 526      26.561  28.562  44.629  1.00 18.64           O  
+ATOM     87  N   ILE A 527      28.044  28.082  42.977  1.00 16.77           N  
+ATOM     88  CA  ILE A 527      27.163  27.268  42.111  1.00 16.84           C  
+ATOM     89  C   ILE A 527      27.736  25.832  42.085  1.00 15.99           C  
+ATOM     90  O   ILE A 527      28.970  25.640  42.148  1.00 17.08           O  
+ATOM     91  CB  ILE A 527      27.235  27.828  40.595  1.00 17.70           C  
+ATOM     92  CG1 ILE A 527      26.668  29.250  40.491  1.00 19.09           C  
+ATOM     93  CG2 ILE A 527      26.559  26.927  39.590  1.00 18.76           C  
+ATOM     94  CD1 ILE A 527      25.392  29.465  41.200  1.00 19.73           C  
+ATOM     95  N   LYS A 528      26.858  24.832  42.063  1.00 13.16           N  
+ATOM     96  CA  LYS A 528      27.275  23.429  41.914  1.00 12.08           C  
+ATOM     97  C   LYS A 528      26.965  23.107  40.441  1.00 11.04           C  
+ATOM     98  O   LYS A 528      25.882  23.449  39.946  1.00 10.17           O  
+ATOM     99  CB  LYS A 528      26.446  22.489  42.803  1.00 14.13           C  
+ATOM    100  CG  LYS A 528      26.720  22.606  44.314  1.00 16.62           C  
+ATOM    101  CD  LYS A 528      28.184  22.310  44.610  1.00 18.95           C  
+ATOM    102  CE  LYS A 528      28.533  22.576  46.083  1.00 20.80           C  
+ATOM    103  NZ  LYS A 528      29.986  22.331  46.352  1.00 22.40           N  
+ATOM    104  N   ILE A 529      27.922  22.502  39.741  1.00  9.53           N  
+ATOM    105  CA  ILE A 529      27.746  22.147  38.339  1.00  8.79           C  
+ATOM    106  C   ILE A 529      27.829  20.640  38.243  1.00  8.34           C  
+ATOM    107  O   ILE A 529      28.763  20.039  38.759  1.00  9.37           O  
+ATOM    108  CB  ILE A 529      28.764  22.903  37.420  1.00  8.92           C  
+ATOM    109  CG1 ILE A 529      28.477  22.605  35.948  1.00 10.81           C  
+ATOM    110  CG2 ILE A 529      30.192  22.593  37.789  1.00 10.32           C  
+ATOM    111  CD1 ILE A 529      28.954  23.747  34.990  1.00 10.65           C  
+ATOM    112  N   GLY A 530      26.832  20.017  37.624  1.00  7.55           N  
+ATOM    113  CA  GLY A 530      26.842  18.575  37.593  1.00  7.77           C  
+ATOM    114  C   GLY A 530      26.306  17.919  36.347  1.00  8.70           C  
+ATOM    115  O   GLY A 530      25.993  18.600  35.347  1.00  8.22           O  
+ATOM    116  N   THR A 531      26.199  16.591  36.408  1.00  7.71           N  
+ATOM    117  CA  THR A 531      25.701  15.803  35.293  1.00  7.60           C  
+ATOM    118  C   THR A 531      25.117  14.481  35.807  1.00  8.27           C  
+ATOM    119  O   THR A 531      25.453  14.039  36.921  1.00  7.43           O  
+ATOM    120  CB  THR A 531      26.891  15.442  34.308  1.00  8.06           C  
+ATOM    121  OG1 THR A 531      26.428  14.629  33.211  1.00  8.12           O  
+ATOM    122  CG2 THR A 531      28.020  14.705  35.058  1.00  8.56           C  
+ATOM    123  N   CYS A 532      24.221  13.880  35.022  1.00  8.23           N  
+ATOM    124  CA  CYS A 532      23.762  12.537  35.353  1.00  8.73           C  
+ATOM    125  C   CYS A 532      24.913  11.621  34.905  1.00 10.18           C  
+ATOM    126  O   CYS A 532      25.752  11.977  34.032  1.00  9.35           O  
+ATOM    127  CB  CYS A 532      22.480  12.149  34.632  1.00 10.51           C  
+ATOM    128  SG  CYS A 532      22.666  11.919  32.869  1.00 13.95           S  
+ATOM    129  N   VAL A 533      25.010  10.461  35.547  1.00  9.17           N  
+ATOM    130  CA  VAL A 533      26.080   9.512  35.258  1.00  9.39           C  
+ATOM    131  C   VAL A 533      25.530   8.375  34.410  1.00 10.48           C  
+ATOM    132  O   VAL A 533      24.571   7.708  34.807  1.00 11.48           O  
+ATOM    133  CB  VAL A 533      26.668   9.022  36.593  1.00 10.22           C  
+ATOM    134  CG1 VAL A 533      27.668   7.870  36.385  1.00 10.75           C  
+ATOM    135  CG2 VAL A 533      27.340  10.205  37.316  1.00 10.21           C  
+ATOM    136  N   ASN A 534      26.061   8.234  33.198  1.00 10.57           N  
+ATOM    137  CA  ASN A 534      25.600   7.214  32.239  1.00 11.85           C  
+ATOM    138  C   ASN A 534      26.157   5.835  32.584  1.00 12.89           C  
+ATOM    139  O   ASN A 534      27.197   5.714  33.260  1.00 12.77           O  
+ATOM    140  CB  ASN A 534      25.942   7.627  30.776  1.00 11.73           C  
+ATOM    141  CG  ASN A 534      25.416   9.039  30.425  1.00 11.50           C  
+ATOM    142  OD1 ASN A 534      24.198   9.256  30.321  1.00 13.65           O  
+ATOM    143  ND2 ASN A 534      26.317  10.010  30.361  1.00  9.07           N  
+ATOM    144  N   TYR A 535      25.544   4.808  32.020  1.00 14.86           N  
+ATOM    145  CA  TYR A 535      25.946   3.450  32.338  1.00 17.34           C  
+ATOM    146  C   TYR A 535      27.413   2.986  32.289  1.00 17.31           C  
+ATOM    147  O   TYR A 535      27.845   2.227  33.169  1.00 16.66           O  
+ATOM    148  CB  TYR A 535      25.039   2.424  31.658  1.00 22.46           C  
+ATOM    149  CG  TYR A 535      25.159   1.083  32.366  1.00 27.41           C  
+ATOM    150  CD1 TYR A 535      24.839   0.963  33.729  1.00 28.84           C  
+ATOM    151  CD2 TYR A 535      25.721  -0.023  31.721  1.00 30.41           C  
+ATOM    152  CE1 TYR A 535      25.092  -0.212  34.425  1.00 31.23           C  
+ATOM    153  CE2 TYR A 535      25.974  -1.220  32.416  1.00 32.19           C  
+ATOM    154  CZ  TYR A 535      25.654  -1.302  33.772  1.00 32.33           C  
+ATOM    155  OH  TYR A 535      25.872  -2.491  34.453  1.00 34.01           O  
+ATOM    156  N   PRO A 536      28.210   3.450  31.307  1.00 16.94           N  
+ATOM    157  CA  PRO A 536      29.611   3.020  31.238  1.00 16.86           C  
+ATOM    158  C   PRO A 536      30.393   3.246  32.508  1.00 16.28           C  
+ATOM    159  O   PRO A 536      31.401   2.592  32.724  1.00 16.65           O  
+ATOM    160  CB  PRO A 536      30.171   3.865  30.092  1.00 18.10           C  
+ATOM    161  CG  PRO A 536      28.981   3.989  29.178  1.00 18.10           C  
+ATOM    162  CD  PRO A 536      27.894   4.346  30.178  1.00 17.57           C  
+ATOM    163  N   PHE A 537      29.973   4.202  33.330  1.00 15.77           N  
+ATOM    164  CA  PHE A 537      30.667   4.473  34.593  1.00 15.60           C  
+ATOM    165  C   PHE A 537      30.785   3.211  35.456  1.00 17.03           C  
+ATOM    166  O   PHE A 537      31.860   2.888  35.955  1.00 17.37           O  
+ATOM    167  CB  PHE A 537      29.919   5.546  35.402  1.00 14.84           C  
+ATOM    168  CG  PHE A 537      30.336   5.630  36.854  1.00 15.54           C  
+ATOM    169  CD1 PHE A 537      31.464   6.345  37.235  1.00 15.77           C  
+ATOM    170  CD2 PHE A 537      29.592   4.979  37.851  1.00 16.19           C  
+ATOM    171  CE1 PHE A 537      31.849   6.415  38.594  1.00 16.61           C  
+ATOM    172  CE2 PHE A 537      29.971   5.038  39.219  1.00 16.26           C  
+ATOM    173  CZ  PHE A 537      31.092   5.754  39.588  1.00 16.41           C  
+ATOM    174  N   TYR A 538      29.680   2.496  35.587  1.00 17.95           N  
+ATOM    175  CA  TYR A 538      29.633   1.314  36.426  1.00 21.33           C  
+ATOM    176  C   TYR A 538      30.512   0.138  36.019  1.00 25.76           C  
+ATOM    177  O   TYR A 538      31.203  -0.436  36.869  1.00 28.22           O  
+ATOM    178  CB  TYR A 538      28.191   0.879  36.606  1.00 17.95           C  
+ATOM    179  CG  TYR A 538      27.377   1.952  37.275  1.00 16.62           C  
+ATOM    180  CD1 TYR A 538      27.425   2.128  38.667  1.00 15.56           C  
+ATOM    181  CD2 TYR A 538      26.607   2.830  36.521  1.00 16.28           C  
+ATOM    182  CE1 TYR A 538      26.734   3.152  39.283  1.00 15.35           C  
+ATOM    183  CE2 TYR A 538      25.913   3.858  37.124  1.00 15.96           C  
+ATOM    184  CZ  TYR A 538      25.979   4.015  38.513  1.00 15.58           C  
+ATOM    185  OH  TYR A 538      25.276   5.041  39.101  1.00 16.96           O  
+ATOM    186  N   ASN A 539      30.517  -0.218  34.741  1.00 29.62           N  
+ATOM    187  CA  ASN A 539      31.343  -1.340  34.323  1.00 33.13           C  
+ATOM    188  C   ASN A 539      32.742  -0.968  33.816  1.00 34.74           C  
+ATOM    189  O   ASN A 539      33.485  -1.836  33.344  1.00 35.85           O  
+ATOM    190  CB  ASN A 539      30.602  -2.215  33.319  1.00 34.61           C  
+ATOM    191  CG  ASN A 539      30.452  -1.566  31.967  1.00 35.75           C  
+ATOM    192  OD1 ASN A 539      31.045  -0.521  31.694  1.00 36.15           O  
+ATOM    193  ND2 ASN A 539      29.657  -2.190  31.099  1.00 36.19           N  
+ATOM    194  N   ASN A 540      33.102   0.312  33.916  1.00 35.84           N  
+ATOM    195  CA  ASN A 540      34.428   0.798  33.502  1.00 37.55           C  
+ATOM    196  C   ASN A 540      34.806   0.597  32.037  1.00 36.41           C  
+ATOM    197  O   ASN A 540      35.994   0.528  31.695  1.00 36.29           O  
+ATOM    198  CB  ASN A 540      35.511   0.171  34.374  1.00 40.91           C  
+ATOM    199  CG  ASN A 540      35.365   0.552  35.825  1.00 44.11           C  
+ATOM    200  OD1 ASN A 540      35.737   1.671  36.230  1.00 45.52           O  
+ATOM    201  ND2 ASN A 540      34.790  -0.362  36.629  1.00 45.76           N  
+ATOM    202  N   SER A 541      33.802   0.550  31.171  1.00 34.36           N  
+ATOM    203  CA  SER A 541      34.030   0.351  29.754  1.00 31.80           C  
+ATOM    204  C   SER A 541      34.543   1.595  29.027  1.00 29.83           C  
+ATOM    205  O   SER A 541      34.963   1.496  27.870  1.00 30.50           O  
+ATOM    206  CB  SER A 541      32.739  -0.130  29.077  1.00 33.07           C  
+ATOM    207  OG  SER A 541      31.694   0.833  29.179  1.00 34.29           O  
+ATOM    208  N   ASP A 542      34.488   2.762  29.668  1.00 26.01           N  
+ATOM    209  CA  ASP A 542      34.931   3.991  29.015  1.00 23.12           C  
+ATOM    210  C   ASP A 542      35.764   4.833  29.994  1.00 22.05           C  
+ATOM    211  O   ASP A 542      35.234   5.671  30.724  1.00 20.76           O  
+ATOM    212  CB  ASP A 542      33.693   4.752  28.470  1.00 21.88           C  
+ATOM    213  CG  ASP A 542      34.040   5.793  27.416  1.00 20.64           C  
+ATOM    214  OD1 ASP A 542      35.203   6.238  27.350  1.00 21.37           O  
+ATOM    215  OD2 ASP A 542      33.132   6.203  26.659  1.00 19.67           O  
+ATOM    216  N   PRO A 543      37.096   4.580  30.043  1.00 22.07           N  
+ATOM    217  CA  PRO A 543      38.045   5.286  30.922  1.00 20.53           C  
+ATOM    218  C   PRO A 543      38.063   6.795  30.726  1.00 19.04           C  
+ATOM    219  O   PRO A 543      38.220   7.541  31.696  1.00 18.90           O  
+ATOM    220  CB  PRO A 543      39.403   4.677  30.541  1.00 21.59           C  
+ATOM    221  CG  PRO A 543      39.064   3.311  30.059  1.00 22.37           C  
+ATOM    222  CD  PRO A 543      37.797   3.543  29.253  1.00 22.48           C  
+ATOM    223  N   THR A 544      37.932   7.244  29.475  1.00 16.88           N  
+ATOM    224  CA  THR A 544      37.937   8.680  29.187  1.00 16.62           C  
+ATOM    225  C   THR A 544      36.699   9.327  29.839  1.00 14.37           C  
+ATOM    226  O   THR A 544      36.789  10.421  30.394  1.00 13.61           O  
+ATOM    227  CB  THR A 544      37.933   8.970  27.657  1.00 16.62           C  
+ATOM    228  OG1 THR A 544      39.048   8.320  27.045  1.00 18.82           O  
+ATOM    229  CG2 THR A 544      38.037  10.438  27.393  1.00 16.77           C  
+ATOM    230  N   TYR A 545      35.560   8.631  29.778  1.00 13.73           N  
+ATOM    231  CA  TYR A 545      34.316   9.135  30.392  1.00 12.39           C  
+ATOM    232  C   TYR A 545      34.578   9.414  31.874  1.00 12.05           C  
+ATOM    233  O   TYR A 545      34.347  10.531  32.366  1.00 11.61           O  
+ATOM    234  CB  TYR A 545      33.191   8.097  30.257  1.00 11.92           C  
+ATOM    235  CG  TYR A 545      31.861   8.538  30.805  1.00 11.56           C  
+ATOM    236  CD1 TYR A 545      31.536   8.341  32.146  1.00 12.07           C  
+ATOM    237  CD2 TYR A 545      30.932   9.177  29.997  1.00 11.46           C  
+ATOM    238  CE1 TYR A 545      30.333   8.771  32.649  1.00 11.58           C  
+ATOM    239  CE2 TYR A 545      29.733   9.607  30.494  1.00 10.57           C  
+ATOM    240  CZ  TYR A 545      29.441   9.402  31.828  1.00 10.93           C  
+ATOM    241  OH  TYR A 545      28.249   9.887  32.338  1.00 11.97           O  
+ATOM    242  N   ASN A 546      35.089   8.397  32.571  1.00 13.21           N  
+ATOM    243  CA  ASN A 546      35.370   8.505  34.004  1.00 14.05           C  
+ATOM    244  C   ASN A 546      36.404   9.572  34.355  1.00 13.17           C  
+ATOM    245  O   ASN A 546      36.268  10.254  35.376  1.00 12.33           O  
+ATOM    246  CB  ASN A 546      35.799   7.146  34.568  1.00 15.55           C  
+ATOM    247  CG  ASN A 546      34.674   6.126  34.556  1.00 17.40           C  
+ATOM    248  OD1 ASN A 546      33.706   6.261  33.818  1.00 19.28           O  
+ATOM    249  ND2 ASN A 546      34.798   5.097  35.381  1.00 19.39           N  
+ATOM    250  N   SER A 547      37.412   9.757  33.507  1.00 13.12           N  
+ATOM    251  CA  SER A 547      38.427  10.757  33.806  1.00 14.48           C  
+ATOM    252  C   SER A 547      37.903  12.207  33.694  1.00 13.07           C  
+ATOM    253  O   SER A 547      38.269  13.073  34.488  1.00 14.04           O  
+ATOM    254  CB  SER A 547      39.680  10.528  32.979  1.00 16.98           C  
+ATOM    255  OG  SER A 547      39.406  10.728  31.622  1.00 23.00           O  
+ATOM    256  N   ILE A 548      37.018  12.464  32.732  1.00 12.03           N  
+ATOM    257  CA  ILE A 548      36.437  13.801  32.611  1.00 11.90           C  
+ATOM    258  C   ILE A 548      35.424  14.000  33.755  1.00 10.12           C  
+ATOM    259  O   ILE A 548      35.368  15.070  34.354  1.00  9.55           O  
+ATOM    260  CB  ILE A 548      35.740  14.013  31.228  1.00 13.31           C  
+ATOM    261  CG1 ILE A 548      36.811  14.026  30.132  1.00 14.52           C  
+ATOM    262  CG2 ILE A 548      34.891  15.310  31.215  1.00 12.01           C  
+ATOM    263  CD1 ILE A 548      36.241  13.934  28.751  1.00 17.19           C  
+ATOM    264  N   LEU A 549      34.614  12.973  34.025  1.00 10.09           N  
+ATOM    265  CA  LEU A 549      33.611  13.030  35.100  1.00 10.02           C  
+ATOM    266  C   LEU A 549      34.207  13.450  36.454  1.00 10.24           C  
+ATOM    267  O   LEU A 549      33.718  14.398  37.071  1.00 10.79           O  
+ATOM    268  CB  LEU A 549      32.871  11.684  35.239  1.00 10.01           C  
+ATOM    269  CG  LEU A 549      31.792  11.590  36.336  1.00 10.66           C  
+ATOM    270  CD1 LEU A 549      30.634  12.512  36.049  1.00 11.62           C  
+ATOM    271  CD2 LEU A 549      31.319  10.172  36.478  1.00 11.31           C  
+ATOM    272  N   GLN A 550      35.270  12.773  36.892  1.00 10.53           N  
+ATOM    273  CA  GLN A 550      35.891  13.086  38.199  1.00 12.97           C  
+ATOM    274  C   GLN A 550      36.646  14.442  38.266  1.00 12.79           C  
+ATOM    275  O   GLN A 550      36.896  14.981  39.351  1.00 14.16           O  
+ATOM    276  CB  GLN A 550      36.828  11.933  38.655  1.00 13.64           C  
+ATOM    277  CG  GLN A 550      38.002  11.671  37.690  1.00 14.91           C  
+ATOM    278  CD  GLN A 550      38.912  10.491  38.067  1.00 15.57           C  
+ATOM    279  OE1 GLN A 550      40.030  10.389  37.562  1.00 16.54           O  
+ATOM    280  NE2 GLN A 550      38.413   9.576  38.871  1.00 13.98           N  
+ATOM    281  N   ARG A 551      36.967  14.994  37.097  1.00 12.31           N  
+ATOM    282  CA  ARG A 551      37.710  16.247  36.999  1.00 12.09           C  
+ATOM    283  C   ARG A 551      36.885  17.548  36.907  1.00 10.73           C  
+ATOM    284  O   ARG A 551      37.173  18.522  37.583  1.00 11.07           O  
+ATOM    285  CB  ARG A 551      38.628  16.157  35.768  1.00 13.98           C  
+ATOM    286  CG  ARG A 551      39.639  17.262  35.656  1.00 17.53           C  
+ATOM    287  CD  ARG A 551      40.464  17.120  34.362  1.00 19.06           C  
+ATOM    288  NE  ARG A 551      39.697  17.540  33.184  1.00 20.88           N  
+ATOM    289  CZ  ARG A 551      39.705  16.902  32.017  1.00 21.80           C  
+ATOM    290  NH1 ARG A 551      40.437  15.805  31.864  1.00 21.59           N  
+ATOM    291  NH2 ARG A 551      38.974  17.359  31.002  1.00 22.47           N  
+ATOM    292  N   GLU A 552      35.838  17.539  36.090  1.00  9.49           N  
+ATOM    293  CA  GLU A 552      35.075  18.748  35.807  1.00  9.31           C  
+ATOM    294  C   GLU A 552      33.845  19.080  36.637  1.00  8.60           C  
+ATOM    295  O   GLU A 552      33.454  20.230  36.697  1.00  9.32           O  
+ATOM    296  CB  GLU A 552      34.624  18.710  34.326  1.00  9.93           C  
+ATOM    297  CG  GLU A 552      35.727  18.576  33.262  1.00 11.83           C  
+ATOM    298  CD  GLU A 552      36.499  19.865  33.040  1.00 12.44           C  
+ATOM    299  OE1 GLU A 552      36.002  20.950  33.359  1.00 12.96           O  
+ATOM    300  OE2 GLU A 552      37.630  19.793  32.551  1.00 16.81           O  
+ATOM    301  N   PHE A 553      33.242  18.088  37.283  1.00  8.90           N  
+ATOM    302  CA  PHE A 553      31.979  18.320  37.974  1.00  8.57           C  
+ATOM    303  C   PHE A 553      32.023  18.289  39.476  1.00  8.77           C  
+ATOM    304  O   PHE A 553      32.858  17.590  40.060  1.00 10.39           O  
+ATOM    305  CB  PHE A 553      30.937  17.325  37.448  1.00  9.45           C  
+ATOM    306  CG  PHE A 553      30.752  17.397  35.954  1.00 10.03           C  
+ATOM    307  CD1 PHE A 553      30.083  18.485  35.380  1.00 11.05           C  
+ATOM    308  CD2 PHE A 553      31.328  16.441  35.109  1.00 10.75           C  
+ATOM    309  CE1 PHE A 553      30.002  18.619  33.953  1.00 12.27           C  
+ATOM    310  CE2 PHE A 553      31.250  16.570  33.697  1.00 10.90           C  
+ATOM    311  CZ  PHE A 553      30.590  17.655  33.137  1.00 10.88           C  
+ATOM    312  N   SER A 554      31.130  19.050  40.105  1.00  8.54           N  
+ATOM    313  CA  SER A 554      31.039  19.070  41.570  1.00  9.08           C  
+ATOM    314  C   SER A 554      29.733  18.417  42.085  1.00  8.65           C  
+ATOM    315  O   SER A 554      29.484  18.395  43.285  1.00  9.71           O  
+ATOM    316  CB  SER A 554      31.189  20.489  42.106  1.00  9.55           C  
+ATOM    317  OG  SER A 554      30.243  21.362  41.524  1.00 10.33           O  
+ATOM    318  N   MET A 555      28.932  17.853  41.181  1.00  8.52           N  
+ATOM    319  CA  MET A 555      27.663  17.207  41.528  1.00  8.20           C  
+ATOM    320  C   MET A 555      27.328  16.086  40.506  1.00  9.98           C  
+ATOM    321  O   MET A 555      27.616  16.202  39.303  1.00  9.39           O  
+ATOM    322  CB  MET A 555      26.541  18.271  41.580  1.00  8.93           C  
+ATOM    323  CG  MET A 555      25.157  17.749  41.903  1.00 10.17           C  
+ATOM    324  SD  MET A 555      23.988  19.061  42.174  1.00 12.03           S  
+ATOM    325  CE  MET A 555      24.160  19.365  43.943  1.00 11.88           C  
+ATOM    326  N   VAL A 556      26.771  14.975  41.002  1.00  8.37           N  
+ATOM    327  CA  VAL A 556      26.363  13.847  40.160  1.00  8.94           C  
+ATOM    328  C   VAL A 556      24.917  13.399  40.532  1.00  9.51           C  
+ATOM    329  O   VAL A 556      24.407  13.709  41.636  1.00  8.72           O  
+ATOM    330  CB  VAL A 556      27.335  12.615  40.253  1.00  9.90           C  
+ATOM    331  CG1 VAL A 556      28.651  12.901  39.530  1.00 11.18           C  
+ATOM    332  CG2 VAL A 556      27.584  12.188  41.741  1.00  9.70           C  
+ATOM    333  N   VAL A 557      24.247  12.754  39.576  1.00  8.11           N  
+ATOM    334  CA  VAL A 557      22.883  12.262  39.750  1.00  9.04           C  
+ATOM    335  C   VAL A 557      22.835  10.937  38.996  1.00  8.99           C  
+ATOM    336  O   VAL A 557      23.484  10.787  37.965  1.00  9.56           O  
+ATOM    337  CB  VAL A 557      21.822  13.227  39.094  1.00 10.16           C  
+ATOM    338  CG1 VAL A 557      20.390  12.873  39.539  1.00 10.54           C  
+ATOM    339  CG2 VAL A 557      22.111  14.637  39.425  1.00 13.14           C  
+ATOM    340  N   CYS A 558      22.082   9.968  39.514  1.00  9.81           N  
+ATOM    341  CA  CYS A 558      21.909   8.666  38.868  1.00 12.43           C  
+ATOM    342  C   CYS A 558      20.946   8.793  37.693  1.00 12.01           C  
+ATOM    343  O   CYS A 558      19.841   9.283  37.855  1.00 12.77           O  
+ATOM    344  CB  CYS A 558      21.281   7.668  39.856  1.00 13.77           C  
+ATOM    345  SG  CYS A 558      22.436   6.991  41.064  1.00 18.71           S  
+ATOM    346  N   GLU A 559      21.329   8.326  36.517  1.00 12.71           N  
+ATOM    347  CA  GLU A 559      20.405   8.462  35.395  1.00 13.52           C  
+ATOM    348  C   GLU A 559      19.197   7.547  35.561  1.00 13.28           C  
+ATOM    349  O   GLU A 559      18.062   7.989  35.407  1.00 13.92           O  
+ATOM    350  CB  GLU A 559      21.107   8.152  34.069  1.00 14.74           C  
+ATOM    351  CG  GLU A 559      20.216   8.400  32.865  1.00 16.84           C  
+ATOM    352  CD  GLU A 559      20.884   8.073  31.529  1.00 19.09           C  
+ATOM    353  OE1 GLU A 559      22.051   7.611  31.523  1.00 19.16           O  
+ATOM    354  OE2 GLU A 559      20.229   8.295  30.478  1.00 21.50           O  
+ATOM    355  N   ASN A 560      19.445   6.292  35.930  1.00 12.97           N  
+ATOM    356  CA  ASN A 560      18.355   5.306  36.052  1.00 15.58           C  
+ATOM    357  C   ASN A 560      18.400   4.427  37.280  1.00 15.17           C  
+ATOM    358  O   ASN A 560      17.418   3.778  37.599  1.00 15.41           O  
+ATOM    359  CB  ASN A 560      18.425   4.317  34.883  1.00 17.86           C  
+ATOM    360  CG  ASN A 560      18.156   4.963  33.549  1.00 20.52           C  
+ATOM    361  OD1 ASN A 560      17.068   5.493  33.305  1.00 23.03           O  
+ATOM    362  ND2 ASN A 560      19.144   4.923  32.668  1.00 21.96           N  
+ATOM    363  N   GLU A 561      19.540   4.415  37.958  1.00 14.85           N  
+ATOM    364  CA  GLU A 561      19.774   3.522  39.081  1.00 14.96           C  
+ATOM    365  C   GLU A 561      19.067   3.784  40.417  1.00 15.00           C  
+ATOM    366  O   GLU A 561      19.187   2.967  41.354  1.00 14.61           O  
+ATOM    367  CB  GLU A 561      21.289   3.331  39.265  1.00 17.32           C  
+ATOM    368  CG  GLU A 561      21.986   2.667  38.070  1.00 18.89           C  
+ATOM    369  CD  GLU A 561      22.133   3.572  36.816  1.00 20.84           C  
+ATOM    370  OE1 GLU A 561      21.933   4.827  36.888  1.00 20.56           O  
+ATOM    371  OE2 GLU A 561      22.467   3.007  35.742  1.00 22.23           O  
+ATOM    372  N   MET A 562      18.416   4.937  40.554  1.00 12.29           N  
+ATOM    373  CA  MET A 562      17.674   5.220  41.773  1.00 12.08           C  
+ATOM    374  C   MET A 562      16.182   5.404  41.518  1.00 11.74           C  
+ATOM    375  O   MET A 562      15.473   6.007  42.332  1.00 12.97           O  
+ATOM    376  CB  MET A 562      18.286   6.356  42.593  1.00 13.30           C  
+ATOM    377  CG  MET A 562      19.599   5.949  43.212  1.00 15.93           C  
+ATOM    378  SD  MET A 562      20.297   7.204  44.328  1.00 19.08           S  
+ATOM    379  CE  MET A 562      19.130   7.075  45.652  1.00 19.63           C  
+ATOM    380  N   LYS A 563      15.718   4.910  40.367  1.00 10.88           N  
+ATOM    381  CA  LYS A 563      14.290   4.930  40.041  1.00 12.47           C  
+ATOM    382  C   LYS A 563      13.635   3.736  40.799  1.00 12.55           C  
+ATOM    383  O   LYS A 563      14.332   2.804  41.194  1.00 11.94           O  
+ATOM    384  CB  LYS A 563      14.072   4.843  38.523  1.00 15.12           C  
+ATOM    385  CG  LYS A 563      14.261   6.203  37.872  1.00 17.16           C  
+ATOM    386  CD  LYS A 563      14.413   6.088  36.382  1.00 19.34           C  
+ATOM    387  CE  LYS A 563      14.874   7.463  35.843  1.00 20.42           C  
+ATOM    388  NZ  LYS A 563      15.271   7.408  34.412  1.00 21.61           N  
+ATOM    389  N   PHE A 564      12.320   3.768  40.989  1.00 12.42           N  
+ATOM    390  CA  PHE A 564      11.590   2.731  41.772  1.00 12.98           C  
+ATOM    391  C   PHE A 564      11.858   1.266  41.385  1.00 13.21           C  
+ATOM    392  O   PHE A 564      12.119   0.429  42.264  1.00 12.63           O  
+ATOM    393  CB  PHE A 564      10.099   3.043  41.741  1.00 12.27           C  
+ATOM    394  CG  PHE A 564       9.322   2.526  42.922  1.00 12.49           C  
+ATOM    395  CD1 PHE A 564       9.065   1.154  43.070  1.00 13.09           C  
+ATOM    396  CD2 PHE A 564       8.727   3.421  43.816  1.00 12.05           C  
+ATOM    397  CE1 PHE A 564       8.205   0.694  44.097  1.00 12.00           C  
+ATOM    398  CE2 PHE A 564       7.874   2.962  44.838  1.00 12.16           C  
+ATOM    399  CZ  PHE A 564       7.621   1.600  44.964  1.00 11.41           C  
+ATOM    400  N   ASP A 565      11.848   0.971  40.092  1.00 13.79           N  
+ATOM    401  CA  ASP A 565      12.104  -0.389  39.618  1.00 16.20           C  
+ATOM    402  C   ASP A 565      13.513  -0.883  39.912  1.00 14.58           C  
+ATOM    403  O   ASP A 565      13.713  -2.071  40.112  1.00 16.53           O  
+ATOM    404  CB  ASP A 565      11.759  -0.556  38.119  1.00 18.42           C  
+ATOM    405  CG  ASP A 565      12.691   0.232  37.166  1.00 21.03           C  
+ATOM    406  OD1 ASP A 565      13.301   1.279  37.510  1.00 21.94           O  
+ATOM    407  OD2 ASP A 565      12.773  -0.193  36.004  1.00 24.30           O  
+ATOM    408  N   ALA A 566      14.486   0.023  39.952  1.00 13.35           N  
+ATOM    409  CA  ALA A 566      15.872  -0.340  40.221  1.00 12.37           C  
+ATOM    410  C   ALA A 566      16.132  -0.557  41.704  1.00 11.90           C  
+ATOM    411  O   ALA A 566      16.885  -1.460  42.086  1.00 12.98           O  
+ATOM    412  CB  ALA A 566      16.823   0.737  39.684  1.00 13.87           C  
+ATOM    413  N   LEU A 567      15.549   0.302  42.525  1.00 10.41           N  
+ATOM    414  CA  LEU A 567      15.731   0.238  43.971  1.00 10.75           C  
+ATOM    415  C   LEU A 567      14.910  -0.831  44.701  1.00 10.05           C  
+ATOM    416  O   LEU A 567      15.370  -1.365  45.702  1.00  9.00           O  
+ATOM    417  CB  LEU A 567      15.460   1.611  44.615  1.00 11.83           C  
+ATOM    418  CG  LEU A 567      16.651   2.576  44.639  1.00 13.21           C  
+ATOM    419  CD1 LEU A 567      16.195   3.948  45.141  1.00 13.06           C  
+ATOM    420  CD2 LEU A 567      17.759   2.009  45.534  1.00 14.86           C  
+ATOM    421  N   GLN A 568      13.682  -1.083  44.251  1.00  9.16           N  
+ATOM    422  CA  GLN A 568      12.821  -2.086  44.902  1.00  9.03           C  
+ATOM    423  C   GLN A 568      12.257  -2.995  43.804  1.00  9.11           C  
+ATOM    424  O   GLN A 568      11.068  -2.958  43.506  1.00  9.32           O  
+ATOM    425  CB  GLN A 568      11.698  -1.388  45.681  1.00  9.34           C  
+ATOM    426  CG  GLN A 568      11.042  -2.344  46.681  1.00  9.49           C  
+ATOM    427  CD  GLN A 568       9.925  -1.770  47.515  1.00  9.83           C  
+ATOM    428  OE1 GLN A 568       9.678  -0.549  47.579  1.00 10.82           O  
+ATOM    429  NE2 GLN A 568       9.243  -2.664  48.199  1.00  7.54           N  
+ATOM    430  N   PRO A 569      13.110  -3.869  43.229  1.00  9.77           N  
+ATOM    431  CA  PRO A 569      12.740  -4.788  42.150  1.00 10.77           C  
+ATOM    432  C   PRO A 569      11.710  -5.848  42.482  1.00 11.54           C  
+ATOM    433  O   PRO A 569      11.013  -6.334  41.604  1.00 12.27           O  
+ATOM    434  CB  PRO A 569      14.089  -5.378  41.720  1.00 11.53           C  
+ATOM    435  CG  PRO A 569      14.891  -5.362  42.988  1.00 11.37           C  
+ATOM    436  CD  PRO A 569      14.536  -4.029  43.588  1.00 10.78           C  
+ATOM    437  N   ARG A 570      11.645  -6.231  43.751  1.00 12.37           N  
+ATOM    438  CA  ARG A 570      10.665  -7.217  44.243  1.00 12.40           C  
+ATOM    439  C   ARG A 570      10.108  -6.578  45.493  1.00 11.70           C  
+ATOM    440  O   ARG A 570      10.791  -5.753  46.109  1.00 11.68           O  
+ATOM    441  CB  ARG A 570      11.335  -8.558  44.581  1.00 15.41           C  
+ATOM    442  CG  ARG A 570      11.819  -9.291  43.327  1.00 19.94           C  
+ATOM    443  CD  ARG A 570      12.279 -10.747  43.584  1.00 23.04           C  
+ATOM    444  NE  ARG A 570      13.616 -10.839  44.185  1.00 25.11           N  
+ATOM    445  CZ  ARG A 570      13.853 -11.332  45.401  1.00 26.45           C  
+ATOM    446  NH1 ARG A 570      12.834 -11.768  46.145  1.00 27.52           N  
+ATOM    447  NH2 ARG A 570      15.101 -11.382  45.869  1.00 25.90           N  
+ATOM    448  N   GLN A 571       8.897  -6.930  45.899  1.00 12.35           N  
+ATOM    449  CA  GLN A 571       8.314  -6.292  47.075  1.00 12.44           C  
+ATOM    450  C   GLN A 571       9.161  -6.529  48.336  1.00 12.10           C  
+ATOM    451  O   GLN A 571       9.433  -7.664  48.726  1.00 11.73           O  
+ATOM    452  CB  GLN A 571       6.857  -6.701  47.289  1.00 14.56           C  
+ATOM    453  CG  GLN A 571       6.202  -5.788  48.306  1.00 18.17           C  
+ATOM    454  CD  GLN A 571       4.692  -5.861  48.362  1.00 21.29           C  
+ATOM    455  OE1 GLN A 571       4.060  -5.116  49.132  1.00 24.04           O  
+ATOM    456  NE2 GLN A 571       4.096  -6.733  47.552  1.00 21.88           N  
+ATOM    457  N   ASN A 572       9.522  -5.426  48.979  1.00 11.04           N  
+ATOM    458  CA  ASN A 572      10.381  -5.393  50.160  1.00 12.42           C  
+ATOM    459  C   ASN A 572      11.790  -5.899  50.036  1.00 11.15           C  
+ATOM    460  O   ASN A 572      12.384  -6.311  51.033  1.00 11.60           O  
+ATOM    461  CB  ASN A 572       9.737  -5.964  51.407  1.00 15.04           C  
+ATOM    462  CG  ASN A 572       9.221  -4.894  52.268  1.00 18.98           C  
+ATOM    463  OD1 ASN A 572       9.995  -4.059  52.850  1.00 19.98           O  
+ATOM    464  ND2 ASN A 572       7.911  -4.742  52.212  1.00 20.80           N  
+ATOM    465  N   VAL A 573      12.309  -5.873  48.813  1.00  9.96           N  
+ATOM    466  CA  VAL A 573      13.685  -6.252  48.509  1.00 10.18           C  
+ATOM    467  C   VAL A 573      14.304  -4.970  47.904  1.00 11.30           C  
+ATOM    468  O   VAL A 573      13.812  -4.470  46.875  1.00 11.52           O  
+ATOM    469  CB  VAL A 573      13.745  -7.391  47.506  1.00 10.03           C  
+ATOM    470  CG1 VAL A 573      15.175  -7.687  47.151  1.00 10.66           C  
+ATOM    471  CG2 VAL A 573      13.023  -8.657  48.098  1.00  9.74           C  
+ATOM    472  N   PHE A 574      15.340  -4.434  48.553  1.00  9.70           N  
+ATOM    473  CA  PHE A 574      15.965  -3.163  48.128  1.00  9.11           C  
+ATOM    474  C   PHE A 574      17.352  -3.410  47.617  1.00  9.74           C  
+ATOM    475  O   PHE A 574      18.152  -4.098  48.268  1.00 11.03           O  
+ATOM    476  CB  PHE A 574      15.989  -2.161  49.302  1.00  8.51           C  
+ATOM    477  CG  PHE A 574      14.613  -1.678  49.710  1.00  9.17           C  
+ATOM    478  CD1 PHE A 574      13.824  -2.414  50.605  1.00  9.18           C  
+ATOM    479  CD2 PHE A 574      14.054  -0.524  49.143  1.00  9.56           C  
+ATOM    480  CE1 PHE A 574      12.506  -2.021  50.922  1.00  8.61           C  
+ATOM    481  CE2 PHE A 574      12.729  -0.132  49.466  1.00 10.00           C  
+ATOM    482  CZ  PHE A 574      11.961  -0.897  50.358  1.00  9.53           C  
+ATOM    483  N   ASP A 575      17.660  -2.855  46.457  1.00  8.49           N  
+ATOM    484  CA  ASP A 575      18.969  -3.048  45.884  1.00  8.62           C  
+ATOM    485  C   ASP A 575      19.692  -1.703  45.888  1.00  9.81           C  
+ATOM    486  O   ASP A 575      19.393  -0.837  45.040  1.00 10.34           O  
+ATOM    487  CB  ASP A 575      18.822  -3.593  44.471  1.00  9.82           C  
+ATOM    488  CG  ASP A 575      20.161  -3.860  43.795  1.00 11.13           C  
+ATOM    489  OD1 ASP A 575      21.230  -3.431  44.288  1.00 11.30           O  
+ATOM    490  OD2 ASP A 575      20.149  -4.529  42.744  1.00 14.44           O  
+ATOM    491  N   PHE A 576      20.655  -1.531  46.805  1.00  8.48           N  
+ATOM    492  CA  PHE A 576      21.387  -0.274  46.921  1.00  8.30           C  
+ATOM    493  C   PHE A 576      22.769  -0.330  46.258  1.00  9.49           C  
+ATOM    494  O   PHE A 576      23.550   0.625  46.382  1.00 10.33           O  
+ATOM    495  CB  PHE A 576      21.615   0.064  48.405  1.00  8.54           C  
+ATOM    496  CG  PHE A 576      20.352   0.324  49.200  1.00 10.29           C  
+ATOM    497  CD1 PHE A 576      19.448   1.314  48.813  1.00 10.53           C  
+ATOM    498  CD2 PHE A 576      20.077  -0.416  50.362  1.00 10.46           C  
+ATOM    499  CE1 PHE A 576      18.284   1.570  49.558  1.00 12.42           C  
+ATOM    500  CE2 PHE A 576      18.907  -0.164  51.121  1.00 11.16           C  
+ATOM    501  CZ  PHE A 576      18.011   0.830  50.717  1.00 11.25           C  
+ATOM    502  N   SER A 577      23.093  -1.429  45.588  1.00  9.04           N  
+ATOM    503  CA  SER A 577      24.419  -1.578  45.042  1.00 10.38           C  
+ATOM    504  C   SER A 577      24.963  -0.440  44.168  1.00 10.38           C  
+ATOM    505  O   SER A 577      26.034   0.098  44.459  1.00 11.09           O  
+ATOM    506  CB  SER A 577      24.581  -2.925  44.347  1.00 11.36           C  
+ATOM    507  OG  SER A 577      23.678  -3.038  43.273  1.00 15.81           O  
+ATOM    508  N   LYS A 578      24.228  -0.074  43.115  1.00 11.96           N  
+ATOM    509  CA  LYS A 578      24.687   0.990  42.200  1.00 11.14           C  
+ATOM    510  C   LYS A 578      24.701   2.375  42.810  1.00 10.31           C  
+ATOM    511  O   LYS A 578      25.673   3.116  42.661  1.00 11.06           O  
+ATOM    512  CB  LYS A 578      23.902   0.935  40.892  1.00 11.44           C  
+ATOM    513  CG  LYS A 578      24.284  -0.299  40.108  1.00 13.23           C  
+ATOM    514  CD  LYS A 578      23.758  -0.276  38.712  1.00 15.30           C  
+ATOM    515  CE  LYS A 578      24.309  -1.457  37.954  1.00 17.76           C  
+ATOM    516  NZ  LYS A 578      23.869  -1.409  36.526  1.00 19.51           N  
+ATOM    517  N   GLY A 579      23.674   2.686  43.587  1.00 10.04           N  
+ATOM    518  CA  GLY A 579      23.612   3.973  44.240  1.00 10.33           C  
+ATOM    519  C   GLY A 579      24.736   4.141  45.244  1.00  9.65           C  
+ATOM    520  O   GLY A 579      25.304   5.220  45.337  1.00 11.01           O  
+ATOM    521  N   ASP A 580      25.085   3.085  45.986  1.00 10.04           N  
+ATOM    522  CA  ASP A 580      26.172   3.174  46.983  1.00 10.22           C  
+ATOM    523  C   ASP A 580      27.527   3.295  46.300  1.00  9.18           C  
+ATOM    524  O   ASP A 580      28.437   3.909  46.841  1.00 10.73           O  
+ATOM    525  CB  ASP A 580      26.168   1.976  47.972  1.00 12.50           C  
+ATOM    526  CG  ASP A 580      25.057   2.072  49.055  1.00 14.21           C  
+ATOM    527  OD1 ASP A 580      24.188   2.955  49.004  1.00 13.52           O  
+ATOM    528  OD2 ASP A 580      25.049   1.221  49.972  1.00 15.49           O  
+ATOM    529  N   GLN A 581      27.665   2.652  45.146  1.00  9.92           N  
+ATOM    530  CA  GLN A 581      28.883   2.735  44.350  1.00 11.72           C  
+ATOM    531  C   GLN A 581      29.065   4.198  43.854  1.00 11.64           C  
+ATOM    532  O   GLN A 581      30.170   4.745  43.924  1.00 12.21           O  
+ATOM    533  CB  GLN A 581      28.800   1.804  43.151  1.00 13.55           C  
+ATOM    534  CG  GLN A 581      30.123   1.640  42.471  1.00 18.11           C  
+ATOM    535  CD  GLN A 581      30.041   0.850  41.168  1.00 21.45           C  
+ATOM    536  OE1 GLN A 581      30.920   0.997  40.298  1.00 24.51           O  
+ATOM    537  NE2 GLN A 581      28.996   0.029  41.010  1.00 20.61           N  
+ATOM    538  N   LEU A 582      27.999   4.837  43.366  1.00  9.96           N  
+ATOM    539  CA  LEU A 582      28.132   6.234  42.936  1.00 10.73           C  
+ATOM    540  C   LEU A 582      28.414   7.183  44.116  1.00 10.35           C  
+ATOM    541  O   LEU A 582      29.228   8.110  44.014  1.00 10.03           O  
+ATOM    542  CB  LEU A 582      26.905   6.695  42.141  1.00 10.29           C  
+ATOM    543  CG  LEU A 582      27.036   8.125  41.589  1.00 10.67           C  
+ATOM    544  CD1 LEU A 582      28.254   8.259  40.663  1.00 11.85           C  
+ATOM    545  CD2 LEU A 582      25.773   8.451  40.815  1.00 11.84           C  
+ATOM    546  N   LEU A 583      27.768   6.953  45.257  1.00  9.56           N  
+ATOM    547  CA  LEU A 583      28.001   7.818  46.403  1.00  9.90           C  
+ATOM    548  C   LEU A 583      29.457   7.722  46.878  1.00  9.16           C  
+ATOM    549  O   LEU A 583      30.057   8.721  47.228  1.00  9.96           O  
+ATOM    550  CB  LEU A 583      27.023   7.499  47.537  1.00 11.71           C  
+ATOM    551  CG  LEU A 583      27.173   8.321  48.825  1.00 13.57           C  
+ATOM    552  CD1 LEU A 583      26.782   9.808  48.592  1.00 14.73           C  
+ATOM    553  CD2 LEU A 583      26.305   7.695  49.936  1.00 15.24           C  
+ATOM    554  N   ALA A 584      30.028   6.525  46.885  1.00  9.86           N  
+ATOM    555  CA  ALA A 584      31.421   6.362  47.320  1.00 10.89           C  
+ATOM    556  C   ALA A 584      32.378   7.169  46.383  1.00 10.75           C  
+ATOM    557  O   ALA A 584      33.355   7.787  46.831  1.00 10.77           O  
+ATOM    558  CB  ALA A 584      31.796   4.873  47.341  1.00 10.98           C  
+ATOM    559  N   PHE A 585      32.113   7.111  45.081  1.00 11.30           N  
+ATOM    560  CA  PHE A 585      32.899   7.851  44.092  1.00 10.70           C  
+ATOM    561  C   PHE A 585      32.740   9.351  44.358  1.00 10.59           C  
+ATOM    562  O   PHE A 585      33.738  10.077  44.384  1.00 10.72           O  
+ATOM    563  CB  PHE A 585      32.395   7.487  42.685  1.00 12.01           C  
+ATOM    564  CG  PHE A 585      32.891   8.401  41.579  1.00 13.07           C  
+ATOM    565  CD1 PHE A 585      34.106   8.154  40.941  1.00 13.99           C  
+ATOM    566  CD2 PHE A 585      32.098   9.464  41.132  1.00 13.59           C  
+ATOM    567  CE1 PHE A 585      34.528   8.948  39.870  1.00 13.36           C  
+ATOM    568  CE2 PHE A 585      32.508  10.254  40.074  1.00 13.44           C  
+ATOM    569  CZ  PHE A 585      33.725   9.988  39.448  1.00 13.72           C  
+ATOM    570  N   ALA A 586      31.505   9.812  44.594  1.00  9.66           N  
+ATOM    571  CA  ALA A 586      31.236  11.240  44.851  1.00  9.63           C  
+ATOM    572  C   ALA A 586      32.013  11.738  46.051  1.00 11.79           C  
+ATOM    573  O   ALA A 586      32.690  12.774  46.000  1.00 11.85           O  
+ATOM    574  CB  ALA A 586      29.759  11.485  45.059  1.00 10.04           C  
+ATOM    575  N   GLU A 587      31.984  10.956  47.119  1.00 12.40           N  
+ATOM    576  CA  GLU A 587      32.678  11.341  48.335  1.00 15.08           C  
+ATOM    577  C   GLU A 587      34.204  11.446  48.203  1.00 14.23           C  
+ATOM    578  O   GLU A 587      34.797  12.386  48.741  1.00 15.23           O  
+ATOM    579  CB  GLU A 587      32.265  10.423  49.494  1.00 19.00           C  
+ATOM    580  CG  GLU A 587      30.790  10.633  49.872  1.00 24.24           C  
+ATOM    581  CD  GLU A 587      30.352   9.857  51.101  1.00 27.57           C  
+ATOM    582  OE1 GLU A 587      30.760   8.676  51.256  1.00 28.92           O  
+ATOM    583  OE2 GLU A 587      29.578  10.445  51.901  1.00 30.04           O  
+ATOM    584  N   ARG A 588      34.842  10.540  47.463  1.00 12.93           N  
+ATOM    585  CA  ARG A 588      36.294  10.654  47.341  1.00 13.31           C  
+ATOM    586  C   ARG A 588      36.691  11.716  46.317  1.00 12.35           C  
+ATOM    587  O   ARG A 588      37.864  12.059  46.189  1.00 12.04           O  
+ATOM    588  CB  ARG A 588      36.983   9.310  47.104  1.00 14.50           C  
+ATOM    589  CG  ARG A 588      36.752   8.664  45.801  1.00 16.91           C  
+ATOM    590  CD  ARG A 588      37.369   7.266  45.836  1.00 19.74           C  
+ATOM    591  NE  ARG A 588      37.339   6.626  44.519  1.00 20.85           N  
+ATOM    592  CZ  ARG A 588      36.405   5.771  44.084  1.00 22.70           C  
+ATOM    593  NH1 ARG A 588      35.375   5.405  44.842  1.00 22.75           N  
+ATOM    594  NH2 ARG A 588      36.518   5.257  42.864  1.00 24.85           N  
+ATOM    595  N   ASN A 589      35.699  12.261  45.628  1.00 11.09           N  
+ATOM    596  CA  ASN A 589      35.956  13.318  44.652  1.00 11.19           C  
+ATOM    597  C   ASN A 589      35.373  14.675  45.048  1.00 12.23           C  
+ATOM    598  O   ASN A 589      35.372  15.611  44.258  1.00 13.60           O  
+ATOM    599  CB  ASN A 589      35.512  12.893  43.266  1.00 10.52           C  
+ATOM    600  CG  ASN A 589      36.448  11.891  42.671  1.00 11.20           C  
+ATOM    601  OD1 ASN A 589      37.617  12.208  42.407  1.00 12.39           O  
+ATOM    602  ND2 ASN A 589      35.983  10.663  42.493  1.00 12.35           N  
+ATOM    603  N   GLY A 590      34.948  14.799  46.303  1.00 11.11           N  
+ATOM    604  CA  GLY A 590      34.409  16.046  46.802  1.00 12.54           C  
+ATOM    605  C   GLY A 590      33.187  16.543  46.046  1.00 13.67           C  
+ATOM    606  O   GLY A 590      33.016  17.752  45.853  1.00 14.76           O  
+ATOM    607  N   MET A 591      32.322  15.611  45.659  1.00 11.86           N  
+ATOM    608  CA  MET A 591      31.110  15.937  44.929  1.00 11.81           C  
+ATOM    609  C   MET A 591      29.856  15.722  45.774  1.00 12.73           C  
+ATOM    610  O   MET A 591      29.828  14.854  46.660  1.00 13.18           O  
+ATOM    611  CB  MET A 591      30.974  15.007  43.729  1.00 12.03           C  
+ATOM    612  CG  MET A 591      32.109  15.061  42.737  1.00 13.60           C  
+ATOM    613  SD  MET A 591      31.837  13.777  41.558  1.00 17.11           S  
+ATOM    614  CE  MET A 591      32.965  14.238  40.297  1.00 18.14           C  
+ATOM    615  N   GLN A 592      28.814  16.500  45.482  1.00 11.47           N  
+ATOM    616  CA  GLN A 592      27.510  16.321  46.126  1.00 11.95           C  
+ATOM    617  C   GLN A 592      26.674  15.444  45.190  1.00 11.52           C  
+ATOM    618  O   GLN A 592      27.031  15.254  44.020  1.00 10.61           O  
+ATOM    619  CB  GLN A 592      26.801  17.655  46.371  1.00 14.73           C  
+ATOM    620  CG  GLN A 592      27.451  18.487  47.472  1.00 19.63           C  
+ATOM    621  CD  GLN A 592      26.701  19.777  47.758  1.00 23.71           C  
+ATOM    622  OE1 GLN A 592      26.914  20.393  48.812  1.00 27.70           O  
+ATOM    623  NE2 GLN A 592      25.783  20.176  46.858  1.00 24.73           N  
+ATOM    624  N   MET A 593      25.549  14.932  45.676  1.00 10.95           N  
+ATOM    625  CA  MET A 593      24.717  14.071  44.856  1.00 11.58           C  
+ATOM    626  C   MET A 593      23.246  14.468  44.999  1.00 10.01           C  
+ATOM    627  O   MET A 593      22.849  14.991  46.052  1.00 12.78           O  
+ATOM    628  CB  MET A 593      24.948  12.633  45.335  1.00 13.38           C  
+ATOM    629  CG  MET A 593      24.256  11.533  44.588  1.00 17.02           C  
+ATOM    630  SD  MET A 593      24.938   9.915  45.134  1.00 19.41           S  
+ATOM    631  CE  MET A 593      23.635   8.775  44.598  1.00 20.39           C  
+ATOM    632  N   ARG A 594      22.490  14.379  43.907  1.00  8.19           N  
+ATOM    633  CA  ARG A 594      21.038  14.611  43.945  1.00  8.93           C  
+ATOM    634  C   ARG A 594      20.394  13.207  43.875  1.00  8.31           C  
+ATOM    635  O   ARG A 594      20.926  12.302  43.224  1.00  9.88           O  
+ATOM    636  CB  ARG A 594      20.502  15.429  42.738  1.00  9.04           C  
+ATOM    637  CG  ARG A 594      21.149  16.806  42.508  1.00  9.14           C  
+ATOM    638  CD  ARG A 594      20.365  17.594  41.462  1.00  7.96           C  
+ATOM    639  NE  ARG A 594      19.123  18.140  42.007  1.00  8.48           N  
+ATOM    640  CZ  ARG A 594      17.885  17.703  41.739  1.00  8.59           C  
+ATOM    641  NH1 ARG A 594      17.672  16.701  40.895  1.00  8.09           N  
+ATOM    642  NH2 ARG A 594      16.849  18.219  42.394  1.00  7.94           N  
+ATOM    643  N   GLY A 595      19.254  13.034  44.533  1.00  7.75           N  
+ATOM    644  CA  GLY A 595      18.558  11.753  44.490  1.00  8.52           C  
+ATOM    645  C   GLY A 595      17.439  11.843  43.463  1.00  7.86           C  
+ATOM    646  O   GLY A 595      16.585  12.699  43.558  1.00  9.47           O  
+ATOM    647  N   HIS A 596      17.393  10.910  42.531  1.00  8.73           N  
+ATOM    648  CA  HIS A 596      16.406  10.953  41.482  1.00  7.94           C  
+ATOM    649  C   HIS A 596      15.952   9.513  41.226  1.00  8.14           C  
+ATOM    650  O   HIS A 596      16.745   8.713  40.778  1.00  9.92           O  
+ATOM    651  CB  HIS A 596      17.124  11.553  40.248  1.00  9.36           C  
+ATOM    652  CG  HIS A 596      16.291  11.591  39.006  1.00 10.80           C  
+ATOM    653  ND1 HIS A 596      15.337  12.559  38.773  1.00 11.73           N  
+ATOM    654  CD2 HIS A 596      16.275  10.778  37.920  1.00 12.56           C  
+ATOM    655  CE1 HIS A 596      14.769  12.344  37.598  1.00 12.76           C  
+ATOM    656  NE2 HIS A 596      15.318  11.267  37.058  1.00 13.02           N  
+ATOM    657  N   THR A 597      14.684   9.162  41.427  1.00  8.09           N  
+ATOM    658  CA  THR A 597      13.588  10.015  41.887  1.00  8.14           C  
+ATOM    659  C   THR A 597      12.621   9.019  42.554  1.00  8.44           C  
+ATOM    660  O   THR A 597      12.537   7.863  42.132  1.00  9.27           O  
+ATOM    661  CB  THR A 597      12.857  10.707  40.697  1.00  8.07           C  
+ATOM    662  OG1 THR A 597      11.738  11.439  41.182  1.00  9.27           O  
+ATOM    663  CG2 THR A 597      12.392   9.693  39.651  1.00  9.25           C  
+ATOM    664  N   LEU A 598      11.864   9.472  43.545  1.00  8.35           N  
+ATOM    665  CA  LEU A 598      10.989   8.568  44.286  1.00  9.50           C  
+ATOM    666  C   LEU A 598       9.645   8.210  43.673  1.00  9.54           C  
+ATOM    667  O   LEU A 598       9.377   7.040  43.408  1.00 12.35           O  
+ATOM    668  CB  LEU A 598      10.838   9.074  45.734  1.00  9.29           C  
+ATOM    669  CG  LEU A 598      12.154   9.258  46.501  1.00  9.29           C  
+ATOM    670  CD1 LEU A 598      11.970  10.051  47.740  1.00 10.09           C  
+ATOM    671  CD2 LEU A 598      12.786   7.915  46.818  1.00 10.46           C  
+ATOM    672  N   ILE A 599       8.811   9.206  43.425  1.00  9.46           N  
+ATOM    673  CA  ILE A 599       7.468   8.979  42.900  1.00 10.99           C  
+ATOM    674  C   ILE A 599       7.327   9.468  41.450  1.00 10.62           C  
+ATOM    675  O   ILE A 599       7.436  10.658  41.173  1.00 11.12           O  
+ATOM    676  CB  ILE A 599       6.430   9.675  43.824  1.00 11.60           C  
+ATOM    677  CG1 ILE A 599       6.578   9.192  45.293  1.00 12.74           C  
+ATOM    678  CG2 ILE A 599       5.029   9.453  43.305  1.00 13.24           C  
+ATOM    679  CD1 ILE A 599       6.568   7.645  45.498  1.00 13.61           C  
+ATOM    680  N   TRP A 600       7.038   8.546  40.540  1.00 10.60           N  
+ATOM    681  CA  TRP A 600       6.928   8.863  39.113  1.00 12.78           C  
+ATOM    682  C   TRP A 600       5.914   7.883  38.485  1.00 14.21           C  
+ATOM    683  O   TRP A 600       5.631   6.822  39.056  1.00 13.85           O  
+ATOM    684  CB  TRP A 600       8.323   8.688  38.493  1.00 12.55           C  
+ATOM    685  CG  TRP A 600       8.523   9.123  37.052  1.00 14.25           C  
+ATOM    686  CD1 TRP A 600       7.865  10.117  36.371  1.00 14.13           C  
+ATOM    687  CD2 TRP A 600       9.517   8.620  36.162  1.00 15.59           C  
+ATOM    688  NE1 TRP A 600       8.406  10.267  35.102  1.00 13.78           N  
+ATOM    689  CE2 TRP A 600       9.420   9.362  34.949  1.00 15.35           C  
+ATOM    690  CE3 TRP A 600      10.493   7.612  36.267  1.00 17.01           C  
+ATOM    691  CZ2 TRP A 600      10.270   9.124  33.849  1.00 16.96           C  
+ATOM    692  CZ3 TRP A 600      11.334   7.376  35.175  1.00 17.84           C  
+ATOM    693  CH2 TRP A 600      11.216   8.135  33.978  1.00 17.15           C  
+ATOM    694  N   HIS A 601       5.343   8.230  37.326  1.00 14.33           N  
+ATOM    695  CA  HIS A 601       4.372   7.335  36.675  1.00 15.58           C  
+ATOM    696  C   HIS A 601       5.053   6.317  35.755  1.00 17.02           C  
+ATOM    697  O   HIS A 601       4.422   5.361  35.307  1.00 18.55           O  
+ATOM    698  CB  HIS A 601       3.323   8.140  35.903  1.00 16.18           C  
+ATOM    699  CG  HIS A 601       3.912   9.001  34.841  1.00 16.40           C  
+ATOM    700  ND1 HIS A 601       4.603  10.157  35.128  1.00 16.72           N  
+ATOM    701  CD2 HIS A 601       4.004   8.826  33.501  1.00 17.39           C  
+ATOM    702  CE1 HIS A 601       5.110  10.657  34.013  1.00 16.87           C  
+ATOM    703  NE2 HIS A 601       4.761   9.870  33.011  1.00 18.08           N  
+ATOM    704  N   ASN A 602       6.345   6.507  35.506  1.00 18.40           N  
+ATOM    705  CA  ASN A 602       7.113   5.610  34.658  1.00 21.87           C  
+ATOM    706  C   ASN A 602       8.127   4.831  35.472  1.00 23.10           C  
+ATOM    707  O   ASN A 602       8.551   5.240  36.557  1.00 22.55           O  
+ATOM    708  CB  ASN A 602       7.922   6.380  33.613  1.00 24.59           C  
+ATOM    709  CG  ASN A 602       7.121   6.744  32.368  1.00 28.41           C  
+ATOM    710  OD1 ASN A 602       6.090   6.128  32.041  1.00 29.43           O  
+ATOM    711  ND2 ASN A 602       7.605   7.764  31.650  1.00 29.84           N  
+ATOM    712  N   GLN A 603       8.585   3.750  34.854  1.00 24.98           N  
+ATOM    713  CA  GLN A 603       9.599   2.878  35.419  1.00 25.68           C  
+ATOM    714  C   GLN A 603       9.289   2.332  36.803  1.00 23.01           C  
+ATOM    715  O   GLN A 603      10.134   2.400  37.714  1.00 23.45           O  
+ATOM    716  CB  GLN A 603      10.972   3.562  35.353  1.00 27.56           C  
+ATOM    717  CG  GLN A 603      11.443   3.709  33.899  1.00 30.86           C  
+ATOM    718  CD  GLN A 603      12.862   4.225  33.797  1.00 32.75           C  
+ATOM    719  OE1 GLN A 603      13.107   5.300  33.228  1.00 33.45           O  
+ATOM    720  NE2 GLN A 603      13.814   3.475  34.374  1.00 33.88           N  
+ATOM    721  N   ASN A 604       8.073   1.798  36.928  1.00 20.85           N  
+ATOM    722  CA  ASN A 604       7.592   1.161  38.162  1.00 19.41           C  
+ATOM    723  C   ASN A 604       7.675  -0.357  37.950  1.00 18.99           C  
+ATOM    724  O   ASN A 604       7.438  -0.822  36.840  1.00 19.39           O  
+ATOM    725  CB  ASN A 604       6.183   1.634  38.504  1.00 18.42           C  
+ATOM    726  CG  ASN A 604       6.193   3.041  39.070  1.00 18.72           C  
+ATOM    727  OD1 ASN A 604       7.092   3.376  39.851  1.00 18.40           O  
+ATOM    728  ND2 ASN A 604       5.267   3.891  38.623  1.00 17.42           N  
+ATOM    729  N   PRO A 605       8.077  -1.136  38.990  1.00 17.69           N  
+ATOM    730  CA  PRO A 605       8.197  -2.601  38.854  1.00 17.36           C  
+ATOM    731  C   PRO A 605       6.858  -3.303  38.643  1.00 17.68           C  
+ATOM    732  O   PRO A 605       5.821  -2.823  39.124  1.00 17.77           O  
+ATOM    733  CB  PRO A 605       8.899  -3.010  40.157  1.00 16.74           C  
+ATOM    734  CG  PRO A 605       8.427  -2.003  41.135  1.00 16.28           C  
+ATOM    735  CD  PRO A 605       8.381  -0.705  40.370  1.00 16.92           C  
+ATOM    736  N   SER A 606       6.867  -4.445  37.955  1.00 17.92           N  
+ATOM    737  CA  SER A 606       5.613  -5.143  37.691  1.00 19.48           C  
+ATOM    738  C   SER A 606       4.811  -5.506  38.942  1.00 18.07           C  
+ATOM    739  O   SER A 606       3.588  -5.426  38.920  1.00 18.54           O  
+ATOM    740  CB  SER A 606       5.811  -6.363  36.769  1.00 21.22           C  
+ATOM    741  OG  SER A 606       6.686  -7.328  37.334  1.00 25.84           O  
+ATOM    742  N   TRP A 607       5.473  -5.866  40.042  1.00 16.74           N  
+ATOM    743  CA  TRP A 607       4.715  -6.191  41.265  1.00 16.33           C  
+ATOM    744  C   TRP A 607       3.825  -5.007  41.731  1.00 16.73           C  
+ATOM    745  O   TRP A 607       2.795  -5.204  42.367  1.00 16.73           O  
+ATOM    746  CB  TRP A 607       5.643  -6.659  42.420  1.00 15.22           C  
+ATOM    747  CG  TRP A 607       6.618  -5.609  42.981  1.00 14.09           C  
+ATOM    748  CD1 TRP A 607       7.930  -5.436  42.620  1.00 13.83           C  
+ATOM    749  CD2 TRP A 607       6.355  -4.629  43.994  1.00 12.86           C  
+ATOM    750  NE1 TRP A 607       8.486  -4.420  43.345  1.00 12.89           N  
+ATOM    751  CE2 TRP A 607       7.547  -3.902  44.193  1.00 12.33           C  
+ATOM    752  CE3 TRP A 607       5.226  -4.292  44.755  1.00 12.56           C  
+ATOM    753  CZ2 TRP A 607       7.644  -2.854  45.125  1.00 12.72           C  
+ATOM    754  CZ3 TRP A 607       5.322  -3.258  45.682  1.00 12.84           C  
+ATOM    755  CH2 TRP A 607       6.524  -2.550  45.859  1.00 12.54           C  
+ATOM    756  N   LEU A 608       4.234  -3.773  41.426  1.00 17.25           N  
+ATOM    757  CA  LEU A 608       3.468  -2.612  41.842  1.00 18.31           C  
+ATOM    758  C   LEU A 608       2.344  -2.347  40.860  1.00 20.96           C  
+ATOM    759  O   LEU A 608       1.177  -2.344  41.243  1.00 20.05           O  
+ATOM    760  CB  LEU A 608       4.363  -1.370  41.947  1.00 17.68           C  
+ATOM    761  CG  LEU A 608       3.726  -0.083  42.492  1.00 18.22           C  
+ATOM    762  CD1 LEU A 608       3.524  -0.203  43.987  1.00 18.68           C  
+ATOM    763  CD2 LEU A 608       4.595   1.110  42.189  1.00 18.34           C  
+ATOM    764  N   THR A 609       2.691  -2.187  39.581  1.00 24.00           N  
+ATOM    765  CA  THR A 609       1.673  -1.864  38.577  1.00 26.97           C  
+ATOM    766  C   THR A 609       0.589  -2.934  38.368  1.00 28.56           C  
+ATOM    767  O   THR A 609      -0.521  -2.610  37.943  1.00 29.27           O  
+ATOM    768  CB  THR A 609       2.294  -1.445  37.231  1.00 27.45           C  
+ATOM    769  OG1 THR A 609       3.005  -2.548  36.659  1.00 28.41           O  
+ATOM    770  CG2 THR A 609       3.253  -0.285  37.431  1.00 27.49           C  
+ATOM    771  N   ASN A 610       0.901  -4.184  38.700  1.00 30.11           N  
+ATOM    772  CA  ASN A 610      -0.052  -5.285  38.566  1.00 32.17           C  
+ATOM    773  C   ASN A 610      -0.599  -5.744  39.909  1.00 32.33           C  
+ATOM    774  O   ASN A 610      -1.176  -6.829  39.985  1.00 33.65           O  
+ATOM    775  CB  ASN A 610       0.593  -6.510  37.906  1.00 34.50           C  
+ATOM    776  CG  ASN A 610       0.848  -6.323  36.428  1.00 36.74           C  
+ATOM    777  OD1 ASN A 610       1.843  -6.836  35.895  1.00 37.95           O  
+ATOM    778  ND2 ASN A 610      -0.050  -5.607  35.744  1.00 37.38           N  
+ATOM    779  N   GLY A 611      -0.369  -4.985  40.976  1.00 31.38           N  
+ATOM    780  CA  GLY A 611      -0.869  -5.402  42.278  1.00 30.87           C  
+ATOM    781  C   GLY A 611      -2.325  -5.010  42.479  1.00 30.76           C  
+ATOM    782  O   GLY A 611      -2.904  -4.360  41.602  1.00 30.48           O  
+ATOM    783  N   ASN A 612      -2.928  -5.448  43.589  1.00 30.43           N  
+ATOM    784  CA  ASN A 612      -4.315  -5.088  43.914  1.00 30.99           C  
+ATOM    785  C   ASN A 612      -4.220  -4.106  45.082  1.00 27.51           C  
+ATOM    786  O   ASN A 612      -3.914  -4.484  46.216  1.00 27.46           O  
+ATOM    787  CB  ASN A 612      -5.198  -6.327  44.268  1.00 35.14           C  
+ATOM    788  CG  ASN A 612      -4.897  -6.918  45.670  1.00 38.55           C  
+ATOM    789  OD1 ASN A 612      -3.799  -7.452  45.918  1.00 40.71           O  
+ATOM    790  ND2 ASN A 612      -5.879  -6.826  46.586  1.00 39.60           N  
+ATOM    791  N   TRP A 613      -4.403  -2.827  44.776  1.00 23.48           N  
+ATOM    792  CA  TRP A 613      -4.283  -1.796  45.798  1.00 20.49           C  
+ATOM    793  C   TRP A 613      -5.533  -0.978  46.026  1.00 18.93           C  
+ATOM    794  O   TRP A 613      -6.445  -0.929  45.197  1.00 20.20           O  
+ATOM    795  CB  TRP A 613      -3.152  -0.794  45.438  1.00 19.01           C  
+ATOM    796  CG  TRP A 613      -1.865  -1.396  44.966  1.00 17.06           C  
+ATOM    797  CD1 TRP A 613      -1.404  -1.447  43.670  1.00 16.68           C  
+ATOM    798  CD2 TRP A 613      -0.909  -2.107  45.764  1.00 16.08           C  
+ATOM    799  NE1 TRP A 613      -0.231  -2.170  43.619  1.00 17.17           N  
+ATOM    800  CE2 TRP A 613       0.097  -2.586  44.886  1.00 16.28           C  
+ATOM    801  CE3 TRP A 613      -0.807  -2.399  47.134  1.00 15.80           C  
+ATOM    802  CZ2 TRP A 613       1.194  -3.349  45.337  1.00 15.62           C  
+ATOM    803  CZ3 TRP A 613       0.283  -3.157  47.578  1.00 15.59           C  
+ATOM    804  CH2 TRP A 613       1.266  -3.621  46.674  1.00 14.65           C  
+ATOM    805  N   ASN A 614      -5.552  -0.333  47.179  1.00 17.76           N  
+ATOM    806  CA  ASN A 614      -6.587   0.616  47.534  1.00 17.17           C  
+ATOM    807  C   ASN A 614      -5.789   1.786  48.132  1.00 16.19           C  
+ATOM    808  O   ASN A 614      -4.554   1.697  48.284  1.00 15.42           O  
+ATOM    809  CB  ASN A 614      -7.633   0.044  48.514  1.00 19.14           C  
+ATOM    810  CG  ASN A 614      -7.017  -0.612  49.723  1.00 20.31           C  
+ATOM    811  OD1 ASN A 614      -6.364   0.024  50.535  1.00 20.35           O  
+ATOM    812  ND2 ASN A 614      -7.219  -1.909  49.837  1.00 23.30           N  
+ATOM    813  N   ARG A 615      -6.473   2.886  48.433  1.00 15.45           N  
+ATOM    814  CA  ARG A 615      -5.807   4.059  48.967  1.00 15.10           C  
+ATOM    815  C   ARG A 615      -4.887   3.748  50.147  1.00 16.05           C  
+ATOM    816  O   ARG A 615      -3.707   4.102  50.141  1.00 14.73           O  
+ATOM    817  CB  ARG A 615      -6.832   5.118  49.351  1.00 14.82           C  
+ATOM    818  CG  ARG A 615      -6.241   6.298  50.074  1.00 14.60           C  
+ATOM    819  CD  ARG A 615      -7.312   7.302  50.370  1.00 15.50           C  
+ATOM    820  NE  ARG A 615      -6.854   8.349  51.277  1.00 16.81           N  
+ATOM    821  CZ  ARG A 615      -6.429   9.551  50.882  1.00 18.20           C  
+ATOM    822  NH1 ARG A 615      -6.380   9.874  49.590  1.00 17.86           N  
+ATOM    823  NH2 ARG A 615      -6.152  10.474  51.784  1.00 18.91           N  
+ATOM    824  N   ASP A 616      -5.425   3.057  51.145  1.00 15.90           N  
+ATOM    825  CA  ASP A 616      -4.655   2.713  52.328  1.00 17.46           C  
+ATOM    826  C   ASP A 616      -3.456   1.807  52.102  1.00 15.67           C  
+ATOM    827  O   ASP A 616      -2.371   2.096  52.629  1.00 15.23           O  
+ATOM    828  CB  ASP A 616      -5.580   2.127  53.389  1.00 21.46           C  
+ATOM    829  CG  ASP A 616      -6.650   3.110  53.802  1.00 25.12           C  
+ATOM    830  OD1 ASP A 616      -6.284   4.218  54.252  1.00 27.38           O  
+ATOM    831  OD2 ASP A 616      -7.849   2.799  53.633  1.00 28.94           O  
+ATOM    832  N   SER A 617      -3.607   0.752  51.305  1.00 14.18           N  
+ATOM    833  CA  SER A 617      -2.466  -0.129  51.084  1.00 14.14           C  
+ATOM    834  C   SER A 617      -1.383   0.495  50.188  1.00 12.70           C  
+ATOM    835  O   SER A 617      -0.199   0.236  50.396  1.00 13.67           O  
+ATOM    836  CB  SER A 617      -2.869  -1.517  50.605  1.00 13.73           C  
+ATOM    837  OG  SER A 617      -3.623  -1.462  49.423  1.00 15.18           O  
+ATOM    838  N   LEU A 618      -1.774   1.353  49.248  1.00 12.05           N  
+ATOM    839  CA  LEU A 618      -0.775   1.994  48.379  1.00 10.58           C  
+ATOM    840  C   LEU A 618      -0.023   3.086  49.136  1.00  9.82           C  
+ATOM    841  O   LEU A 618       1.161   3.272  48.906  1.00 10.65           O  
+ATOM    842  CB  LEU A 618      -1.393   2.512  47.079  1.00 11.64           C  
+ATOM    843  CG  LEU A 618      -0.359   2.827  45.986  1.00 11.43           C  
+ATOM    844  CD1 LEU A 618       0.495   1.568  45.651  1.00 11.33           C  
+ATOM    845  CD2 LEU A 618      -1.068   3.369  44.750  1.00 10.85           C  
+ATOM    846  N   LEU A 619      -0.685   3.792  50.056  1.00  9.97           N  
+ATOM    847  CA  LEU A 619      -0.005   4.792  50.879  1.00 10.83           C  
+ATOM    848  C   LEU A 619       1.065   4.109  51.735  1.00 10.94           C  
+ATOM    849  O   LEU A 619       2.139   4.665  51.971  1.00 11.62           O  
+ATOM    850  CB  LEU A 619      -0.984   5.554  51.796  1.00 11.99           C  
+ATOM    851  CG  LEU A 619      -1.709   6.778  51.185  1.00 13.01           C  
+ATOM    852  CD1 LEU A 619      -2.746   7.313  52.179  1.00 13.81           C  
+ATOM    853  CD2 LEU A 619      -0.688   7.902  50.822  1.00 12.30           C  
+ATOM    854  N   ALA A 620       0.774   2.892  52.201  1.00 10.98           N  
+ATOM    855  CA  ALA A 620       1.741   2.146  53.021  1.00 10.92           C  
+ATOM    856  C   ALA A 620       2.967   1.773  52.195  1.00  9.46           C  
+ATOM    857  O   ALA A 620       4.088   1.827  52.704  1.00 10.27           O  
+ATOM    858  CB  ALA A 620       1.093   0.874  53.626  1.00 12.09           C  
+ATOM    859  N   VAL A 621       2.751   1.347  50.949  1.00 10.05           N  
+ATOM    860  CA  VAL A 621       3.858   1.013  50.040  1.00 10.26           C  
+ATOM    861  C   VAL A 621       4.702   2.284  49.769  1.00 10.57           C  
+ATOM    862  O   VAL A 621       5.945   2.240  49.782  1.00 10.12           O  
+ATOM    863  CB  VAL A 621       3.352   0.437  48.681  1.00 11.18           C  
+ATOM    864  CG1 VAL A 621       4.512   0.327  47.670  1.00 11.63           C  
+ATOM    865  CG2 VAL A 621       2.735  -0.949  48.901  1.00 12.07           C  
+ATOM    866  N   MET A 622       4.021   3.408  49.538  1.00 10.55           N  
+ATOM    867  CA  MET A 622       4.710   4.673  49.282  1.00 10.33           C  
+ATOM    868  C   MET A 622       5.591   5.048  50.473  1.00  9.76           C  
+ATOM    869  O   MET A 622       6.758   5.392  50.327  1.00  9.72           O  
+ATOM    870  CB  MET A 622       3.692   5.788  49.046  1.00 10.72           C  
+ATOM    871  CG  MET A 622       4.362   7.162  48.839  1.00 13.07           C  
+ATOM    872  SD  MET A 622       3.254   8.586  48.839  1.00 15.12           S  
+ATOM    873  CE  MET A 622       2.703   8.419  47.297  1.00 12.69           C  
+ATOM    874  N   LYS A 623       5.024   4.977  51.672  1.00 10.07           N  
+ATOM    875  CA  LYS A 623       5.759   5.315  52.890  1.00 10.43           C  
+ATOM    876  C   LYS A 623       6.951   4.396  53.133  1.00  9.10           C  
+ATOM    877  O   LYS A 623       8.010   4.862  53.539  1.00  9.69           O  
+ATOM    878  CB  LYS A 623       4.825   5.289  54.112  1.00 12.96           C  
+ATOM    879  CG  LYS A 623       5.464   5.848  55.382  1.00 16.43           C  
+ATOM    880  CD  LYS A 623       4.515   5.738  56.577  1.00 20.46           C  
+ATOM    881  CE  LYS A 623       5.240   5.954  57.939  1.00 24.16           C  
+ATOM    882  NZ  LYS A 623       5.820   7.330  58.167  1.00 27.21           N  
+ATOM    883  N   ASN A 624       6.801   3.098  52.886  1.00  9.04           N  
+ATOM    884  CA  ASN A 624       7.911   2.167  53.097  1.00  9.13           C  
+ATOM    885  C   ASN A 624       9.057   2.416  52.100  1.00  9.34           C  
+ATOM    886  O   ASN A 624      10.248   2.356  52.464  1.00  9.65           O  
+ATOM    887  CB  ASN A 624       7.456   0.716  52.955  1.00  9.98           C  
+ATOM    888  CG  ASN A 624       8.564  -0.261  53.302  1.00 10.67           C  
+ATOM    889  OD1 ASN A 624       9.196  -0.123  54.333  1.00 12.28           O  
+ATOM    890  ND2 ASN A 624       8.817  -1.222  52.438  1.00 12.13           N  
+ATOM    891  N   HIS A 625       8.696   2.709  50.847  1.00  8.84           N  
+ATOM    892  CA  HIS A 625       9.711   2.972  49.813  1.00  8.77           C  
+ATOM    893  C   HIS A 625      10.495   4.245  50.131  1.00  8.46           C  
+ATOM    894  O   HIS A 625      11.738   4.238  50.176  1.00  8.85           O  
+ATOM    895  CB  HIS A 625       9.087   3.107  48.427  1.00  8.52           C  
+ATOM    896  CG  HIS A 625      10.107   3.225  47.336  1.00  9.38           C  
+ATOM    897  ND1 HIS A 625      10.784   2.136  46.830  1.00  8.97           N  
+ATOM    898  CD2 HIS A 625      10.620   4.313  46.709  1.00  8.92           C  
+ATOM    899  CE1 HIS A 625      11.671   2.545  45.939  1.00 10.05           C  
+ATOM    900  NE2 HIS A 625      11.588   3.862  45.848  1.00  9.43           N  
+ATOM    901  N   ILE A 626       9.767   5.331  50.359  1.00  8.47           N  
+ATOM    902  CA  ILE A 626      10.391   6.607  50.669  1.00  8.25           C  
+ATOM    903  C   ILE A 626      11.262   6.554  51.939  1.00  8.45           C  
+ATOM    904  O   ILE A 626      12.402   7.007  51.934  1.00  9.43           O  
+ATOM    905  CB  ILE A 626       9.336   7.715  50.788  1.00  8.46           C  
+ATOM    906  CG1 ILE A 626       8.700   7.983  49.408  1.00  7.70           C  
+ATOM    907  CG2 ILE A 626       9.939   8.990  51.394  1.00  8.27           C  
+ATOM    908  CD1 ILE A 626       7.628   9.109  49.417  1.00  7.92           C  
+ATOM    909  N   THR A 627      10.744   5.987  53.021  1.00  7.57           N  
+ATOM    910  CA  THR A 627      11.483   5.928  54.281  1.00  8.15           C  
+ATOM    911  C   THR A 627      12.722   5.043  54.218  1.00  7.29           C  
+ATOM    912  O   THR A 627      13.794   5.433  54.695  1.00  8.36           O  
+ATOM    913  CB  THR A 627      10.571   5.431  55.438  1.00  9.80           C  
+ATOM    914  OG1 THR A 627       9.432   6.305  55.538  1.00 11.76           O  
+ATOM    915  CG2 THR A 627      11.329   5.422  56.764  1.00 10.40           C  
+ATOM    916  N   THR A 628      12.590   3.860  53.619  1.00  7.73           N  
+ATOM    917  CA  THR A 628      13.726   2.926  53.512  1.00  8.21           C  
+ATOM    918  C   THR A 628      14.868   3.500  52.651  1.00  8.19           C  
+ATOM    919  O   THR A 628      16.022   3.463  53.044  1.00  9.68           O  
+ATOM    920  CB  THR A 628      13.274   1.517  52.973  1.00  8.77           C  
+ATOM    921  OG1 THR A 628      12.290   0.966  53.866  1.00  9.58           O  
+ATOM    922  CG2 THR A 628      14.462   0.544  52.855  1.00  9.50           C  
+ATOM    923  N   VAL A 629      14.537   4.083  51.503  1.00  8.25           N  
+ATOM    924  CA  VAL A 629      15.552   4.643  50.615  1.00  7.68           C  
+ATOM    925  C   VAL A 629      16.220   5.899  51.214  1.00  7.02           C  
+ATOM    926  O   VAL A 629      17.450   5.990  51.301  1.00  7.73           O  
+ATOM    927  CB  VAL A 629      14.916   4.979  49.221  1.00  8.14           C  
+ATOM    928  CG1 VAL A 629      15.951   5.696  48.345  1.00  8.60           C  
+ATOM    929  CG2 VAL A 629      14.451   3.707  48.524  1.00  8.99           C  
+ATOM    930  N   MET A 630      15.407   6.849  51.687  1.00  7.56           N  
+ATOM    931  CA  MET A 630      15.976   8.065  52.251  1.00  7.96           C  
+ATOM    932  C   MET A 630      16.794   7.865  53.532  1.00  9.50           C  
+ATOM    933  O   MET A 630      17.769   8.579  53.744  1.00 11.04           O  
+ATOM    934  CB  MET A 630      14.914   9.151  52.425  1.00  8.46           C  
+ATOM    935  CG  MET A 630      14.424   9.705  51.072  1.00  9.69           C  
+ATOM    936  SD  MET A 630      13.266  11.064  51.234  1.00 10.77           S  
+ATOM    937  CE  MET A 630      14.304  12.370  51.922  1.00 10.43           C  
+ATOM    938  N   THR A 631      16.390   6.944  54.408  1.00  9.97           N  
+ATOM    939  CA  THR A 631      17.172   6.728  55.644  1.00 10.56           C  
+ATOM    940  C   THR A 631      18.510   6.048  55.304  1.00 10.31           C  
+ATOM    941  O   THR A 631      19.515   6.312  55.970  1.00 11.18           O  
+ATOM    942  CB  THR A 631      16.406   5.899  56.723  1.00 12.53           C  
+ATOM    943  OG1 THR A 631      16.166   4.607  56.214  1.00 15.56           O  
+ATOM    944  CG2 THR A 631      15.060   6.506  57.065  1.00 12.14           C  
+ATOM    945  N   HIS A 632      18.554   5.221  54.250  1.00  9.45           N  
+ATOM    946  CA  HIS A 632      19.835   4.604  53.845  1.00 10.32           C  
+ATOM    947  C   HIS A 632      20.846   5.692  53.435  1.00 10.36           C  
+ATOM    948  O   HIS A 632      22.060   5.537  53.611  1.00 11.83           O  
+ATOM    949  CB  HIS A 632      19.654   3.618  52.668  1.00 10.64           C  
+ATOM    950  CG  HIS A 632      20.881   2.814  52.356  1.00 10.54           C  
+ATOM    951  ND1 HIS A 632      21.407   1.890  53.232  1.00 10.21           N  
+ATOM    952  CD2 HIS A 632      21.707   2.820  51.279  1.00 10.86           C  
+ATOM    953  CE1 HIS A 632      22.504   1.363  52.717  1.00 11.14           C  
+ATOM    954  NE2 HIS A 632      22.708   1.911  51.530  1.00 11.38           N  
+ATOM    955  N   TYR A 633      20.343   6.775  52.844  1.00 11.07           N  
+ATOM    956  CA  TYR A 633      21.205   7.900  52.393  1.00 11.33           C  
+ATOM    957  C   TYR A 633      21.062   9.158  53.264  1.00 12.02           C  
+ATOM    958  O   TYR A 633      21.485  10.254  52.867  1.00 11.76           O  
+ATOM    959  CB  TYR A 633      20.856   8.284  50.927  1.00 10.10           C  
+ATOM    960  CG  TYR A 633      21.159   7.203  49.926  1.00  9.18           C  
+ATOM    961  CD1 TYR A 633      22.477   6.931  49.559  1.00  9.96           C  
+ATOM    962  CD2 TYR A 633      20.147   6.389  49.409  1.00  8.30           C  
+ATOM    963  CE1 TYR A 633      22.783   5.867  48.713  1.00  9.63           C  
+ATOM    964  CE2 TYR A 633      20.451   5.322  48.559  1.00  8.42           C  
+ATOM    965  CZ  TYR A 633      21.781   5.062  48.217  1.00  8.06           C  
+ATOM    966  OH  TYR A 633      22.102   3.985  47.432  1.00  9.73           O  
+ATOM    967  N   LYS A 634      20.561   8.991  54.479  1.00 12.16           N  
+ATOM    968  CA  LYS A 634      20.287  10.133  55.342  1.00 12.74           C  
+ATOM    969  C   LYS A 634      21.496  11.034  55.540  1.00 13.36           C  
+ATOM    970  O   LYS A 634      22.575  10.566  55.904  1.00 13.93           O  
+ATOM    971  CB  LYS A 634      19.724   9.646  56.684  1.00 14.64           C  
+ATOM    972  CG  LYS A 634      19.116  10.726  57.556  1.00 17.90           C  
+ATOM    973  CD  LYS A 634      18.686  10.132  58.901  1.00 19.94           C  
+ATOM    974  CE  LYS A 634      17.912  11.129  59.780  1.00 22.59           C  
+ATOM    975  NZ  LYS A 634      18.737  12.274  60.284  1.00 24.99           N  
+ATOM    976  N   GLY A 635      21.310  12.328  55.266  1.00 12.79           N  
+ATOM    977  CA  GLY A 635      22.365  13.307  55.428  1.00 13.55           C  
+ATOM    978  C   GLY A 635      23.446  13.242  54.364  1.00 15.28           C  
+ATOM    979  O   GLY A 635      24.376  14.023  54.404  1.00 17.72           O  
+ATOM    980  N   LYS A 636      23.330  12.357  53.387  1.00 15.95           N  
+ATOM    981  CA  LYS A 636      24.367  12.258  52.352  1.00 17.83           C  
+ATOM    982  C   LYS A 636      23.952  12.805  50.971  1.00 16.79           C  
+ATOM    983  O   LYS A 636      24.806  12.982  50.103  1.00 16.05           O  
+ATOM    984  CB  LYS A 636      24.800  10.799  52.200  1.00 21.69           C  
+ATOM    985  CG  LYS A 636      25.283  10.143  53.512  1.00 26.25           C  
+ATOM    986  CD  LYS A 636      25.456   8.628  53.310  1.00 30.78           C  
+ATOM    987  CE  LYS A 636      26.162   7.910  54.490  1.00 32.89           C  
+ATOM    988  NZ  LYS A 636      26.576   6.515  54.054  1.00 34.45           N  
+ATOM    989  N   ILE A 637      22.645  12.974  50.750  1.00 15.11           N  
+ATOM    990  CA  ILE A 637      22.108  13.484  49.479  1.00 14.10           C  
+ATOM    991  C   ILE A 637      21.426  14.839  49.746  1.00 14.57           C  
+ATOM    992  O   ILE A 637      20.469  14.934  50.507  1.00 16.15           O  
+ATOM    993  CB  ILE A 637      21.204  12.410  48.807  1.00 13.05           C  
+ATOM    994  CG1 ILE A 637      22.114  11.270  48.326  1.00 12.55           C  
+ATOM    995  CG2 ILE A 637      20.310  13.030  47.717  1.00 11.31           C  
+ATOM    996  CD1 ILE A 637      21.413  10.105  47.691  1.00 14.16           C  
+ATOM    997  N   VAL A 638      21.953  15.894  49.122  1.00 14.36           N  
+ATOM    998  CA  VAL A 638      21.474  17.254  49.358  1.00 14.86           C  
+ATOM    999  C   VAL A 638      20.144  17.688  48.766  1.00 12.58           C  
+ATOM   1000  O   VAL A 638      19.450  18.498  49.364  1.00 14.66           O  
+ATOM   1001  CB  VAL A 638      22.581  18.297  49.031  1.00 17.00           C  
+ATOM   1002  CG1 VAL A 638      23.762  18.086  49.981  1.00 19.19           C  
+ATOM   1003  CG2 VAL A 638      23.038  18.178  47.553  1.00 17.19           C  
+ATOM   1004  N   GLU A 639      19.798  17.177  47.600  1.00  8.63           N  
+ATOM   1005  CA  GLU A 639      18.542  17.525  46.970  1.00  8.26           C  
+ATOM   1006  C   GLU A 639      17.908  16.218  46.504  1.00  6.89           C  
+ATOM   1007  O   GLU A 639      18.586  15.381  45.914  1.00  7.18           O  
+ATOM   1008  CB  GLU A 639      18.788  18.410  45.728  1.00  8.85           C  
+ATOM   1009  CG  GLU A 639      19.502  19.743  46.020  1.00  9.27           C  
+ATOM   1010  CD  GLU A 639      19.635  20.649  44.793  1.00  9.86           C  
+ATOM   1011  OE1 GLU A 639      19.007  20.376  43.745  1.00 10.05           O  
+ATOM   1012  OE2 GLU A 639      20.360  21.643  44.892  1.00 11.30           O  
+ATOM   1013  N   TRP A 640      16.612  16.067  46.762  1.00  6.79           N  
+ATOM   1014  CA  TRP A 640      15.852  14.892  46.353  1.00  6.60           C  
+ATOM   1015  C   TRP A 640      14.703  15.271  45.443  1.00  5.08           C  
+ATOM   1016  O   TRP A 640      13.940  16.146  45.806  1.00  6.57           O  
+ATOM   1017  CB  TRP A 640      15.208  14.192  47.591  1.00  8.03           C  
+ATOM   1018  CG  TRP A 640      16.067  13.127  48.235  1.00  9.68           C  
+ATOM   1019  CD1 TRP A 640      16.858  13.255  49.352  1.00 11.36           C  
+ATOM   1020  CD2 TRP A 640      16.252  11.789  47.764  1.00 10.30           C  
+ATOM   1021  NE1 TRP A 640      17.516  12.076  49.588  1.00 11.42           N  
+ATOM   1022  CE2 TRP A 640      17.172  11.163  48.634  1.00 10.88           C  
+ATOM   1023  CE3 TRP A 640      15.739  11.064  46.675  1.00 11.57           C  
+ATOM   1024  CZ2 TRP A 640      17.597   9.836  48.450  1.00 12.43           C  
+ATOM   1025  CZ3 TRP A 640      16.163   9.745  46.486  1.00 13.72           C  
+ATOM   1026  CH2 TRP A 640      17.081   9.152  47.370  1.00 12.48           C  
+ATOM   1027  N   ASP A 641      14.581  14.603  44.296  1.00  6.32           N  
+ATOM   1028  CA  ASP A 641      13.427  14.793  43.413  1.00  5.74           C  
+ATOM   1029  C   ASP A 641      12.404  13.791  44.017  1.00  6.88           C  
+ATOM   1030  O   ASP A 641      12.430  12.580  43.713  1.00  7.88           O  
+ATOM   1031  CB  ASP A 641      13.729  14.395  41.970  1.00  6.68           C  
+ATOM   1032  CG  ASP A 641      14.609  15.410  41.234  1.00  8.43           C  
+ATOM   1033  OD1 ASP A 641      14.662  16.582  41.626  1.00  9.60           O  
+ATOM   1034  OD2 ASP A 641      15.230  14.998  40.242  1.00  9.12           O  
+ATOM   1035  N   VAL A 642      11.570  14.298  44.913  1.00  6.28           N  
+ATOM   1036  CA  VAL A 642      10.558  13.467  45.560  1.00  6.92           C  
+ATOM   1037  C   VAL A 642       9.502  12.991  44.579  1.00  8.31           C  
+ATOM   1038  O   VAL A 642       9.127  11.813  44.581  1.00  8.14           O  
+ATOM   1039  CB  VAL A 642       9.906  14.212  46.732  1.00  7.51           C  
+ATOM   1040  CG1 VAL A 642       8.736  13.386  47.309  1.00  9.22           C  
+ATOM   1041  CG2 VAL A 642      10.958  14.475  47.801  1.00  7.87           C  
+ATOM   1042  N   ALA A 643       9.044  13.905  43.731  1.00  8.39           N  
+ATOM   1043  CA  ALA A 643       8.029  13.599  42.728  1.00  9.29           C  
+ATOM   1044  C   ALA A 643       8.549  14.115  41.393  1.00  9.10           C  
+ATOM   1045  O   ALA A 643       9.203  15.156  41.349  1.00  9.25           O  
+ATOM   1046  CB  ALA A 643       6.699  14.253  43.081  1.00 10.98           C  
+ATOM   1047  N   ASN A 644       8.216  13.417  40.320  1.00  8.51           N  
+ATOM   1048  CA  ASN A 644       8.710  13.747  38.978  1.00  8.61           C  
+ATOM   1049  C   ASN A 644       7.612  13.687  37.913  1.00 10.26           C  
+ATOM   1050  O   ASN A 644       6.837  12.724  37.857  1.00 10.20           O  
+ATOM   1051  CB  ASN A 644       9.813  12.726  38.645  1.00  9.80           C  
+ATOM   1052  CG  ASN A 644      10.684  13.127  37.456  1.00 11.91           C  
+ATOM   1053  OD1 ASN A 644      11.150  14.266  37.345  1.00 14.46           O  
+ATOM   1054  ND2 ASN A 644      10.944  12.174  36.587  1.00 11.71           N  
+ATOM   1055  N   GLU A 645       7.487  14.753  37.124  1.00 10.35           N  
+ATOM   1056  CA  GLU A 645       6.528  14.812  36.008  1.00 10.79           C  
+ATOM   1057  C   GLU A 645       5.106  14.379  36.329  1.00 10.69           C  
+ATOM   1058  O   GLU A 645       4.512  13.605  35.591  1.00 12.21           O  
+ATOM   1059  CB  GLU A 645       7.070  13.967  34.868  1.00 11.45           C  
+ATOM   1060  CG  GLU A 645       8.515  14.289  34.543  1.00 12.47           C  
+ATOM   1061  CD  GLU A 645       9.122  13.388  33.479  1.00 15.07           C  
+ATOM   1062  OE1 GLU A 645       8.430  12.460  32.978  1.00 16.08           O  
+ATOM   1063  OE2 GLU A 645      10.323  13.594  33.157  1.00 15.18           O  
+ATOM   1064  N   CYS A 646       4.541  14.929  37.392  1.00 11.63           N  
+ATOM   1065  CA  CYS A 646       3.190  14.566  37.800  1.00 12.46           C  
+ATOM   1066  C   CYS A 646       2.109  15.467  37.211  1.00 13.44           C  
+ATOM   1067  O   CYS A 646       0.919  15.167  37.363  1.00 12.98           O  
+ATOM   1068  CB  CYS A 646       3.052  14.628  39.322  1.00 14.16           C  
+ATOM   1069  SG  CYS A 646       4.185  13.520  40.280  1.00 17.92           S  
+ATOM   1070  N   MET A 647       2.489  16.591  36.599  1.00 12.91           N  
+ATOM   1071  CA  MET A 647       1.483  17.510  36.051  1.00 12.39           C  
+ATOM   1072  C   MET A 647       1.198  17.166  34.612  1.00 12.89           C  
+ATOM   1073  O   MET A 647       2.104  16.846  33.855  1.00 11.29           O  
+ATOM   1074  CB  MET A 647       1.957  18.971  36.140  1.00 13.15           C  
+ATOM   1075  CG  MET A 647       0.914  20.014  35.716  1.00 13.35           C  
+ATOM   1076  SD  MET A 647      -0.530  20.081  36.774  1.00 16.27           S  
+ATOM   1077  CE  MET A 647       0.143  20.858  38.208  1.00 15.68           C  
+ATOM   1078  N   ASP A 648      -0.079  17.190  34.253  1.00 14.26           N  
+ATOM   1079  CA  ASP A 648      -0.460  16.910  32.874  1.00 16.47           C  
+ATOM   1080  C   ASP A 648       0.135  18.000  31.966  1.00 15.82           C  
+ATOM   1081  O   ASP A 648       0.278  19.140  32.375  1.00 14.43           O  
+ATOM   1082  CB  ASP A 648      -1.976  16.896  32.728  1.00 19.03           C  
+ATOM   1083  CG  ASP A 648      -2.401  16.358  31.395  1.00 23.11           C  
+ATOM   1084  OD1 ASP A 648      -2.234  15.131  31.173  1.00 25.41           O  
+ATOM   1085  OD2 ASP A 648      -2.864  17.145  30.535  1.00 24.25           O  
+ATOM   1086  N   ASP A 649       0.480  17.641  30.741  1.00 16.50           N  
+ATOM   1087  CA  ASP A 649       1.058  18.606  29.805  1.00 20.50           C  
+ATOM   1088  C   ASP A 649       0.217  19.825  29.439  1.00 21.12           C  
+ATOM   1089  O   ASP A 649       0.746  20.875  29.033  1.00 21.52           O  
+ATOM   1090  CB  ASP A 649       1.545  17.893  28.565  1.00 22.57           C  
+ATOM   1091  CG  ASP A 649       2.906  17.337  28.763  1.00 25.17           C  
+ATOM   1092  OD1 ASP A 649       3.732  18.045  29.387  1.00 26.56           O  
+ATOM   1093  OD2 ASP A 649       3.140  16.200  28.329  1.00 27.90           O  
+ATOM   1094  N   SER A 650      -1.090  19.683  29.621  1.00 21.45           N  
+ATOM   1095  CA  SER A 650      -2.040  20.762  29.363  1.00 21.67           C  
+ATOM   1096  C   SER A 650      -1.963  21.808  30.491  1.00 21.48           C  
+ATOM   1097  O   SER A 650      -2.315  22.975  30.286  1.00 22.52           O  
+ATOM   1098  CB  SER A 650      -3.470  20.184  29.305  1.00 22.20           C  
+ATOM   1099  OG  SER A 650      -3.899  19.603  30.554  1.00 24.05           O  
+ATOM   1100  N   GLY A 651      -1.520  21.372  31.674  1.00 18.65           N  
+ATOM   1101  CA  GLY A 651      -1.470  22.242  32.821  1.00 17.91           C  
+ATOM   1102  C   GLY A 651      -2.824  22.224  33.497  1.00 18.26           C  
+ATOM   1103  O   GLY A 651      -3.047  22.963  34.438  1.00 19.45           O  
+ATOM   1104  N   ASN A 652      -3.726  21.346  33.060  1.00 19.18           N  
+ATOM   1105  CA  ASN A 652      -5.067  21.281  33.651  1.00 21.03           C  
+ATOM   1106  C   ASN A 652      -5.198  20.552  34.968  1.00 20.60           C  
+ATOM   1107  O   ASN A 652      -6.191  20.683  35.646  1.00 23.64           O  
+ATOM   1108  CB  ASN A 652      -6.096  20.742  32.651  1.00 22.76           C  
+ATOM   1109  CG  ASN A 652      -6.361  21.723  31.514  1.00 25.67           C  
+ATOM   1110  OD1 ASN A 652      -6.396  22.941  31.722  1.00 26.40           O  
+ATOM   1111  ND2 ASN A 652      -6.487  21.206  30.305  1.00 26.40           N  
+ATOM   1112  N   GLY A 653      -4.203  19.780  35.341  1.00 19.49           N  
+ATOM   1113  CA  GLY A 653      -4.281  19.066  36.593  1.00 16.84           C  
+ATOM   1114  C   GLY A 653      -3.288  17.939  36.561  1.00 15.65           C  
+ATOM   1115  O   GLY A 653      -2.541  17.769  35.604  1.00 15.47           O  
+ATOM   1116  N   LEU A 654      -3.287  17.154  37.625  1.00 15.82           N  
+ATOM   1117  CA  LEU A 654      -2.363  16.046  37.749  1.00 15.44           C  
+ATOM   1118  C   LEU A 654      -2.632  14.949  36.729  1.00 16.20           C  
+ATOM   1119  O   LEU A 654      -3.781  14.672  36.349  1.00 17.76           O  
+ATOM   1120  CB  LEU A 654      -2.404  15.485  39.190  1.00 16.82           C  
+ATOM   1121  CG  LEU A 654      -1.999  16.441  40.339  1.00 17.28           C  
+ATOM   1122  CD1 LEU A 654      -2.341  15.847  41.727  1.00 17.10           C  
+ATOM   1123  CD2 LEU A 654      -0.529  16.707  40.232  1.00 17.49           C  
+ATOM   1124  N   ARG A 655      -1.554  14.332  36.291  1.00 15.11           N  
+ATOM   1125  CA  ARG A 655      -1.551  13.254  35.321  1.00 15.76           C  
+ATOM   1126  C   ARG A 655      -2.132  11.956  35.926  1.00 15.91           C  
+ATOM   1127  O   ARG A 655      -1.944  11.673  37.124  1.00 15.50           O  
+ATOM   1128  CB  ARG A 655      -0.080  13.073  34.942  1.00 18.24           C  
+ATOM   1129  CG  ARG A 655       0.258  12.001  34.021  1.00 20.71           C  
+ATOM   1130  CD  ARG A 655       1.743  11.779  34.062  1.00 21.00           C  
+ATOM   1131  NE  ARG A 655       2.529  12.917  33.568  1.00 22.27           N  
+ATOM   1132  CZ  ARG A 655       2.724  13.216  32.279  1.00 23.89           C  
+ATOM   1133  NH1 ARG A 655       2.157  12.478  31.324  1.00 24.61           N  
+ATOM   1134  NH2 ARG A 655       3.602  14.159  31.927  1.00 23.30           N  
+ATOM   1135  N   SER A 656      -2.848  11.167  35.143  1.00 15.30           N  
+ATOM   1136  CA  SER A 656      -3.339   9.919  35.723  1.00 17.88           C  
+ATOM   1137  C   SER A 656      -2.115   8.969  35.818  1.00 17.56           C  
+ATOM   1138  O   SER A 656      -1.179   9.044  35.004  1.00 17.81           O  
+ATOM   1139  CB  SER A 656      -4.535   9.341  34.935  1.00 20.25           C  
+ATOM   1140  OG  SER A 656      -4.134   8.362  34.006  1.00 24.17           O  
+ATOM   1141  N   SER A 657      -2.042   8.237  36.925  1.00 15.62           N  
+ATOM   1142  CA  SER A 657      -0.958   7.298  37.208  1.00 14.45           C  
+ATOM   1143  C   SER A 657      -1.453   6.353  38.303  1.00 14.09           C  
+ATOM   1144  O   SER A 657      -2.510   6.607  38.915  1.00 13.28           O  
+ATOM   1145  CB  SER A 657       0.287   8.049  37.709  1.00 13.71           C  
+ATOM   1146  OG  SER A 657       0.100   8.611  38.982  1.00 12.74           O  
+ATOM   1147  N   ILE A 658      -0.703   5.286  38.586  1.00 13.44           N  
+ATOM   1148  CA  ILE A 658      -1.144   4.377  39.644  1.00 13.09           C  
+ATOM   1149  C   ILE A 658      -1.325   5.135  40.977  1.00 12.37           C  
+ATOM   1150  O   ILE A 658      -2.355   4.987  41.642  1.00 13.54           O  
+ATOM   1151  CB  ILE A 658      -0.216   3.135  39.790  1.00 14.48           C  
+ATOM   1152  CG1 ILE A 658      -0.814   2.160  40.805  1.00 16.04           C  
+ATOM   1153  CG2 ILE A 658       1.204   3.534  40.192  1.00 15.18           C  
+ATOM   1154  CD1 ILE A 658      -0.043   0.860  40.917  1.00 18.43           C  
+ATOM   1155  N   TRP A 659      -0.403   6.044  41.307  1.00 11.81           N  
+ATOM   1156  CA  TRP A 659      -0.477   6.812  42.572  1.00 11.45           C  
+ATOM   1157  C   TRP A 659      -1.685   7.733  42.593  1.00 10.79           C  
+ATOM   1158  O   TRP A 659      -2.440   7.763  43.551  1.00 12.67           O  
+ATOM   1159  CB  TRP A 659       0.782   7.668  42.804  1.00 11.39           C  
+ATOM   1160  CG  TRP A 659       2.058   6.924  42.617  1.00 12.46           C  
+ATOM   1161  CD1 TRP A 659       2.896   6.974  41.529  1.00 12.48           C  
+ATOM   1162  CD2 TRP A 659       2.618   5.959  43.518  1.00 12.83           C  
+ATOM   1163  NE1 TRP A 659       3.936   6.084  41.700  1.00 14.54           N  
+ATOM   1164  CE2 TRP A 659       3.787   5.446  42.912  1.00 13.43           C  
+ATOM   1165  CE3 TRP A 659       2.238   5.476  44.777  1.00 12.60           C  
+ATOM   1166  CZ2 TRP A 659       4.587   4.459  43.533  1.00 14.15           C  
+ATOM   1167  CZ3 TRP A 659       3.032   4.491  45.401  1.00 12.93           C  
+ATOM   1168  CH2 TRP A 659       4.190   3.998  44.774  1.00 13.84           C  
+ATOM   1169  N   ARG A 660      -1.869   8.482  41.523  1.00 10.87           N  
+ATOM   1170  CA  ARG A 660      -2.980   9.421  41.439  1.00 10.84           C  
+ATOM   1171  C   ARG A 660      -4.355   8.767  41.432  1.00 10.26           C  
+ATOM   1172  O   ARG A 660      -5.277   9.235  42.104  1.00 10.51           O  
+ATOM   1173  CB  ARG A 660      -2.816  10.288  40.173  1.00 11.29           C  
+ATOM   1174  CG  ARG A 660      -4.019  11.178  39.823  1.00 12.05           C  
+ATOM   1175  CD  ARG A 660      -4.251  12.236  40.873  1.00 13.12           C  
+ATOM   1176  NE  ARG A 660      -5.450  13.049  40.577  1.00 13.70           N  
+ATOM   1177  CZ  ARG A 660      -6.699  12.721  40.913  1.00 12.68           C  
+ATOM   1178  NH1 ARG A 660      -6.958  11.573  41.550  1.00 11.54           N  
+ATOM   1179  NH2 ARG A 660      -7.671  13.607  40.725  1.00 11.79           N  
+ATOM   1180  N   ASN A 661      -4.489   7.720  40.632  1.00 10.81           N  
+ATOM   1181  CA  ASN A 661      -5.774   7.054  40.453  1.00 12.17           C  
+ATOM   1182  C   ASN A 661      -6.245   6.292  41.682  1.00 13.13           C  
+ATOM   1183  O   ASN A 661      -7.432   6.375  42.050  1.00 14.25           O  
+ATOM   1184  CB  ASN A 661      -5.735   6.111  39.249  1.00 13.42           C  
+ATOM   1185  CG  ASN A 661      -5.473   6.837  37.925  1.00 14.23           C  
+ATOM   1186  OD1 ASN A 661      -5.419   8.068  37.861  1.00 14.47           O  
+ATOM   1187  ND2 ASN A 661      -5.275   6.057  36.862  1.00 15.94           N  
+ATOM   1188  N   VAL A 662      -5.314   5.589  42.333  1.00 11.99           N  
+ATOM   1189  CA  VAL A 662      -5.639   4.799  43.526  1.00 11.91           C  
+ATOM   1190  C   VAL A 662      -5.733   5.601  44.830  1.00 11.64           C  
+ATOM   1191  O   VAL A 662      -6.685   5.430  45.606  1.00 12.84           O  
+ATOM   1192  CB  VAL A 662      -4.619   3.610  43.687  1.00 11.78           C  
+ATOM   1193  CG1 VAL A 662      -4.857   2.863  44.987  1.00 12.44           C  
+ATOM   1194  CG2 VAL A 662      -4.682   2.684  42.481  1.00 11.85           C  
+ATOM   1195  N   ILE A 663      -4.759   6.471  45.086  1.00  9.92           N  
+ATOM   1196  CA  ILE A 663      -4.764   7.249  46.312  1.00 10.42           C  
+ATOM   1197  C   ILE A 663      -5.719   8.432  46.260  1.00 11.77           C  
+ATOM   1198  O   ILE A 663      -6.465   8.668  47.209  1.00 12.98           O  
+ATOM   1199  CB  ILE A 663      -3.326   7.695  46.692  1.00 10.15           C  
+ATOM   1200  CG1 ILE A 663      -2.487   6.444  46.996  1.00 10.96           C  
+ATOM   1201  CG2 ILE A 663      -3.325   8.642  47.852  1.00  9.34           C  
+ATOM   1202  CD1 ILE A 663      -1.021   6.700  47.074  1.00 11.26           C  
+ATOM   1203  N   GLY A 664      -5.692   9.191  45.163  1.00 12.24           N  
+ATOM   1204  CA  GLY A 664      -6.573  10.339  45.076  1.00 12.01           C  
+ATOM   1205  C   GLY A 664      -5.814  11.621  44.833  1.00 12.95           C  
+ATOM   1206  O   GLY A 664      -4.576  11.622  44.723  1.00 12.33           O  
+ATOM   1207  N   GLN A 665      -6.541  12.734  44.871  1.00 13.82           N  
+ATOM   1208  CA  GLN A 665      -5.946  14.027  44.547  1.00 15.58           C  
+ATOM   1209  C   GLN A 665      -4.881  14.577  45.491  1.00 15.36           C  
+ATOM   1210  O   GLN A 665      -4.077  15.412  45.067  1.00 16.86           O  
+ATOM   1211  CB  GLN A 665      -7.028  15.074  44.293  1.00 18.52           C  
+ATOM   1212  CG  GLN A 665      -7.746  15.528  45.540  1.00 24.51           C  
+ATOM   1213  CD  GLN A 665      -8.484  16.875  45.363  1.00 27.85           C  
+ATOM   1214  OE1 GLN A 665      -8.431  17.508  44.299  1.00 30.10           O  
+ATOM   1215  NE2 GLN A 665      -9.150  17.318  46.422  1.00 29.11           N  
+ATOM   1216  N   ASP A 666      -4.816  14.074  46.724  1.00 13.36           N  
+ATOM   1217  CA  ASP A 666      -3.841  14.553  47.711  1.00 13.33           C  
+ATOM   1218  C   ASP A 666      -2.598  13.662  47.870  1.00 11.79           C  
+ATOM   1219  O   ASP A 666      -1.857  13.802  48.861  1.00 12.33           O  
+ATOM   1220  CB  ASP A 666      -4.525  14.684  49.078  1.00 14.83           C  
+ATOM   1221  CG  ASP A 666      -5.128  13.362  49.561  1.00 16.96           C  
+ATOM   1222  OD1 ASP A 666      -5.139  12.368  48.804  1.00 16.93           O  
+ATOM   1223  OD2 ASP A 666      -5.602  13.312  50.715  1.00 18.91           O  
+ATOM   1224  N   TYR A 667      -2.369  12.747  46.933  1.00 10.74           N  
+ATOM   1225  CA  TYR A 667      -1.232  11.853  47.062  1.00 10.51           C  
+ATOM   1226  C   TYR A 667       0.132  12.545  47.210  1.00 10.39           C  
+ATOM   1227  O   TYR A 667       0.994  12.022  47.909  1.00 10.92           O  
+ATOM   1228  CB  TYR A 667      -1.208  10.808  45.947  1.00 11.00           C  
+ATOM   1229  CG  TYR A 667      -0.526  11.236  44.655  1.00 10.72           C  
+ATOM   1230  CD1 TYR A 667      -1.243  11.893  43.645  1.00 11.01           C  
+ATOM   1231  CD2 TYR A 667       0.808  10.899  44.406  1.00 11.43           C  
+ATOM   1232  CE1 TYR A 667      -0.648  12.193  42.414  1.00 10.71           C  
+ATOM   1233  CE2 TYR A 667       1.410  11.193  43.171  1.00 11.53           C  
+ATOM   1234  CZ  TYR A 667       0.667  11.837  42.181  1.00 11.28           C  
+ATOM   1235  OH  TYR A 667       1.246  12.070  40.944  1.00 12.36           O  
+ATOM   1236  N   LEU A 668       0.348  13.693  46.557  1.00 10.36           N  
+ATOM   1237  CA  LEU A 668       1.644  14.385  46.686  1.00 10.31           C  
+ATOM   1238  C   LEU A 668       1.882  14.987  48.065  1.00  9.95           C  
+ATOM   1239  O   LEU A 668       3.028  15.071  48.522  1.00 10.72           O  
+ATOM   1240  CB  LEU A 668       1.843  15.449  45.600  1.00 12.04           C  
+ATOM   1241  CG  LEU A 668       2.114  14.909  44.192  1.00 13.54           C  
+ATOM   1242  CD1 LEU A 668       2.257  16.062  43.212  1.00 15.57           C  
+ATOM   1243  CD2 LEU A 668       3.375  14.054  44.139  1.00 14.87           C  
+ATOM   1244  N   ASP A 669       0.812  15.356  48.769  1.00  9.71           N  
+ATOM   1245  CA  ASP A 669       0.973  15.914  50.109  1.00 11.40           C  
+ATOM   1246  C   ASP A 669       1.625  14.846  51.021  1.00 10.54           C  
+ATOM   1247  O   ASP A 669       2.482  15.158  51.854  1.00 10.79           O  
+ATOM   1248  CB  ASP A 669      -0.367  16.318  50.711  1.00 12.86           C  
+ATOM   1249  CG  ASP A 669      -1.015  17.502  50.002  1.00 15.76           C  
+ATOM   1250  OD1 ASP A 669      -0.452  18.079  49.056  1.00 16.66           O  
+ATOM   1251  OD2 ASP A 669      -2.120  17.874  50.434  1.00 18.14           O  
+ATOM   1252  N   TYR A 670       1.205  13.594  50.846  1.00  9.93           N  
+ATOM   1253  CA  TYR A 670       1.754  12.476  51.618  1.00 10.41           C  
+ATOM   1254  C   TYR A 670       3.190  12.201  51.248  1.00  8.85           C  
+ATOM   1255  O   TYR A 670       4.010  12.033  52.124  1.00  9.28           O  
+ATOM   1256  CB  TYR A 670       0.922  11.200  51.415  1.00 11.99           C  
+ATOM   1257  CG  TYR A 670      -0.376  11.275  52.154  1.00 15.47           C  
+ATOM   1258  CD1 TYR A 670      -0.437  10.937  53.508  1.00 17.20           C  
+ATOM   1259  CD2 TYR A 670      -1.530  11.744  51.528  1.00 17.38           C  
+ATOM   1260  CE1 TYR A 670      -1.608  11.062  54.220  1.00 19.48           C  
+ATOM   1261  CE2 TYR A 670      -2.709  11.884  52.223  1.00 19.68           C  
+ATOM   1262  CZ  TYR A 670      -2.742  11.540  53.573  1.00 20.46           C  
+ATOM   1263  OH  TYR A 670      -3.909  11.688  54.283  1.00 23.93           O  
+ATOM   1264  N   ALA A 671       3.511  12.205  49.952  1.00  8.46           N  
+ATOM   1265  CA  ALA A 671       4.883  11.923  49.522  1.00  7.15           C  
+ATOM   1266  C   ALA A 671       5.856  12.890  50.160  1.00  8.02           C  
+ATOM   1267  O   ALA A 671       6.886  12.470  50.708  1.00  8.12           O  
+ATOM   1268  CB  ALA A 671       5.012  11.945  48.002  1.00  8.36           C  
+ATOM   1269  N   PHE A 672       5.531  14.186  50.117  1.00  7.83           N  
+ATOM   1270  CA  PHE A 672       6.405  15.212  50.717  1.00  8.55           C  
+ATOM   1271  C   PHE A 672       6.507  15.114  52.255  1.00  8.76           C  
+ATOM   1272  O   PHE A 672       7.590  15.292  52.812  1.00  9.14           O  
+ATOM   1273  CB  PHE A 672       6.022  16.624  50.234  1.00  7.96           C  
+ATOM   1274  CG  PHE A 672       6.538  16.924  48.830  1.00  8.17           C  
+ATOM   1275  CD1 PHE A 672       7.818  17.444  48.642  1.00  8.70           C  
+ATOM   1276  CD2 PHE A 672       5.780  16.604  47.700  1.00  9.12           C  
+ATOM   1277  CE1 PHE A 672       8.344  17.629  47.343  1.00  8.63           C  
+ATOM   1278  CE2 PHE A 672       6.298  16.786  46.395  1.00  8.84           C  
+ATOM   1279  CZ  PHE A 672       7.584  17.295  46.231  1.00  8.72           C  
+ATOM   1280  N   ARG A 673       5.390  14.824  52.927  1.00 10.01           N  
+ATOM   1281  CA  ARG A 673       5.403  14.642  54.393  1.00 11.25           C  
+ATOM   1282  C   ARG A 673       6.265  13.446  54.800  1.00 10.14           C  
+ATOM   1283  O   ARG A 673       7.131  13.577  55.673  1.00 11.12           O  
+ATOM   1284  CB  ARG A 673       3.989  14.462  54.922  1.00 15.64           C  
+ATOM   1285  CG  ARG A 673       3.223  15.749  55.010  1.00 20.81           C  
+ATOM   1286  CD  ARG A 673       1.981  15.528  55.843  1.00 25.86           C  
+ATOM   1287  NE  ARG A 673       0.799  16.007  55.140  1.00 30.63           N  
+ATOM   1288  CZ  ARG A 673       0.418  17.280  55.110  1.00 32.65           C  
+ATOM   1289  NH1 ARG A 673       1.138  18.205  55.756  1.00 33.81           N  
+ATOM   1290  NH2 ARG A 673      -0.681  17.625  54.429  1.00 34.41           N  
+ATOM   1291  N   TYR A 674       6.108  12.318  54.095  1.00  9.91           N  
+ATOM   1292  CA  TYR A 674       6.900  11.109  54.379  1.00 10.14           C  
+ATOM   1293  C   TYR A 674       8.390  11.389  54.172  1.00  9.98           C  
+ATOM   1294  O   TYR A 674       9.232  10.950  54.944  1.00  9.86           O  
+ATOM   1295  CB  TYR A 674       6.497   9.928  53.473  1.00 10.79           C  
+ATOM   1296  CG  TYR A 674       5.101   9.408  53.667  1.00 11.54           C  
+ATOM   1297  CD1 TYR A 674       4.442   9.582  54.876  1.00 13.46           C  
+ATOM   1298  CD2 TYR A 674       4.448   8.708  52.645  1.00 12.58           C  
+ATOM   1299  CE1 TYR A 674       3.151   9.066  55.071  1.00 13.55           C  
+ATOM   1300  CE2 TYR A 674       3.166   8.186  52.828  1.00 12.22           C  
+ATOM   1301  CZ  TYR A 674       2.536   8.371  54.043  1.00 13.30           C  
+ATOM   1302  OH  TYR A 674       1.288   7.838  54.271  1.00 15.76           O  
+ATOM   1303  N   ALA A 675       8.709  12.141  53.118  1.00  8.57           N  
+ATOM   1304  CA  ALA A 675      10.098  12.455  52.803  1.00  9.05           C  
+ATOM   1305  C   ALA A 675      10.729  13.338  53.863  1.00  7.95           C  
+ATOM   1306  O   ALA A 675      11.866  13.094  54.271  1.00  9.48           O  
+ATOM   1307  CB  ALA A 675      10.177  13.115  51.426  1.00  8.33           C  
+ATOM   1308  N   ARG A 676       9.997  14.356  54.310  1.00  8.97           N  
+ATOM   1309  CA  ARG A 676      10.508  15.260  55.338  1.00 10.41           C  
+ATOM   1310  C   ARG A 676      10.768  14.508  56.653  1.00 12.36           C  
+ATOM   1311  O   ARG A 676      11.764  14.769  57.328  1.00 13.32           O  
+ATOM   1312  CB  ARG A 676       9.548  16.412  55.569  1.00 11.14           C  
+ATOM   1313  CG  ARG A 676       9.974  17.330  56.710  1.00 13.61           C  
+ATOM   1314  CD  ARG A 676      11.221  18.203  56.350  1.00 15.19           C  
+ATOM   1315  NE  ARG A 676      10.812  19.506  55.807  1.00 16.85           N  
+ATOM   1316  CZ  ARG A 676      11.319  20.099  54.716  1.00 17.52           C  
+ATOM   1317  NH1 ARG A 676      12.286  19.525  54.017  1.00 15.32           N  
+ATOM   1318  NH2 ARG A 676      10.852  21.295  54.340  1.00 17.76           N  
+ATOM   1319  N   GLU A 677       9.919  13.539  56.979  1.00 13.53           N  
+ATOM   1320  CA  GLU A 677      10.125  12.759  58.201  1.00 16.22           C  
+ATOM   1321  C   GLU A 677      11.380  11.872  58.070  1.00 16.73           C  
+ATOM   1322  O   GLU A 677      12.154  11.722  59.039  1.00 17.17           O  
+ATOM   1323  CB  GLU A 677       8.917  11.865  58.478  1.00 20.24           C  
+ATOM   1324  CG  GLU A 677       7.720  12.553  59.115  1.00 27.80           C  
+ATOM   1325  CD  GLU A 677       6.383  11.760  58.959  1.00 31.77           C  
+ATOM   1326  OE1 GLU A 677       6.396  10.520  58.692  1.00 34.00           O  
+ATOM   1327  OE2 GLU A 677       5.300  12.405  59.089  1.00 34.87           O  
+ATOM   1328  N   ALA A 678      11.588  11.286  56.884  1.00 13.74           N  
+ATOM   1329  CA  ALA A 678      12.717  10.382  56.652  1.00 12.60           C  
+ATOM   1330  C   ALA A 678      14.079  11.049  56.774  1.00 13.19           C  
+ATOM   1331  O   ALA A 678      15.025  10.460  57.331  1.00 13.81           O  
+ATOM   1332  CB  ALA A 678      12.572   9.676  55.294  1.00 11.91           C  
+ATOM   1333  N   ASP A 679      14.211  12.248  56.208  1.00 12.01           N  
+ATOM   1334  CA  ASP A 679      15.480  12.969  56.279  1.00 12.89           C  
+ATOM   1335  C   ASP A 679      15.165  14.463  56.360  1.00 14.91           C  
+ATOM   1336  O   ASP A 679      15.082  15.151  55.365  1.00 14.07           O  
+ATOM   1337  CB  ASP A 679      16.376  12.642  55.075  1.00 12.70           C  
+ATOM   1338  CG  ASP A 679      17.734  13.333  55.151  1.00 12.64           C  
+ATOM   1339  OD1 ASP A 679      17.984  14.083  56.108  1.00 13.80           O  
+ATOM   1340  OD2 ASP A 679      18.572  13.123  54.261  1.00 13.39           O  
+ATOM   1341  N   PRO A 680      15.033  14.985  57.576  1.00 16.78           N  
+ATOM   1342  CA  PRO A 680      14.720  16.401  57.769  1.00 17.32           C  
+ATOM   1343  C   PRO A 680      15.746  17.403  57.238  1.00 17.31           C  
+ATOM   1344  O   PRO A 680      15.457  18.595  57.192  1.00 18.58           O  
+ATOM   1345  CB  PRO A 680      14.531  16.502  59.281  1.00 18.70           C  
+ATOM   1346  CG  PRO A 680      15.420  15.418  59.820  1.00 18.51           C  
+ATOM   1347  CD  PRO A 680      15.233  14.286  58.863  1.00 17.07           C  
+ATOM   1348  N   ASP A 681      16.936  16.937  56.866  1.00 16.83           N  
+ATOM   1349  CA  ASP A 681      17.977  17.830  56.341  1.00 17.87           C  
+ATOM   1350  C   ASP A 681      18.019  17.920  54.799  1.00 16.11           C  
+ATOM   1351  O   ASP A 681      18.700  18.788  54.237  1.00 16.81           O  
+ATOM   1352  CB  ASP A 681      19.359  17.445  56.891  1.00 20.24           C  
+ATOM   1353  CG  ASP A 681      19.503  17.731  58.405  1.00 23.69           C  
+ATOM   1354  OD1 ASP A 681      18.952  18.745  58.903  1.00 24.92           O  
+ATOM   1355  OD2 ASP A 681      20.169  16.925  59.093  1.00 25.53           O  
+ATOM   1356  N   ALA A 682      17.318  17.014  54.132  1.00 13.26           N  
+ATOM   1357  CA  ALA A 682      17.284  16.990  52.673  1.00 12.61           C  
+ATOM   1358  C   ALA A 682      16.392  18.116  52.125  1.00 11.78           C  
+ATOM   1359  O   ALA A 682      15.383  18.461  52.740  1.00 11.51           O  
+ATOM   1360  CB  ALA A 682      16.737  15.648  52.196  1.00 12.16           C  
+ATOM   1361  N   LEU A 683      16.783  18.710  50.994  1.00 10.35           N  
+ATOM   1362  CA  LEU A 683      15.939  19.714  50.349  1.00  9.46           C  
+ATOM   1363  C   LEU A 683      15.056  18.890  49.415  1.00  8.12           C  
+ATOM   1364  O   LEU A 683      15.547  18.129  48.574  1.00  9.20           O  
+ATOM   1365  CB  LEU A 683      16.763  20.702  49.524  1.00 10.77           C  
+ATOM   1366  CG  LEU A 683      17.612  21.595  50.414  1.00 13.17           C  
+ATOM   1367  CD1 LEU A 683      18.590  22.420  49.536  1.00 13.48           C  
+ATOM   1368  CD2 LEU A 683      16.671  22.476  51.285  1.00 14.23           C  
+ATOM   1369  N   LEU A 684      13.756  19.083  49.534  1.00  6.84           N  
+ATOM   1370  CA  LEU A 684      12.775  18.312  48.781  1.00  6.89           C  
+ATOM   1371  C   LEU A 684      12.281  19.076  47.556  1.00  5.32           C  
+ATOM   1372  O   LEU A 684      11.767  20.188  47.687  1.00  6.16           O  
+ATOM   1373  CB  LEU A 684      11.598  17.963  49.727  1.00  6.91           C  
+ATOM   1374  CG  LEU A 684      12.010  17.349  51.079  1.00  7.28           C  
+ATOM   1375  CD1 LEU A 684      10.785  17.062  51.844  1.00  8.29           C  
+ATOM   1376  CD2 LEU A 684      12.854  16.112  50.873  1.00  7.97           C  
+ATOM   1377  N   PHE A 685      12.378  18.433  46.400  1.00  5.53           N  
+ATOM   1378  CA  PHE A 685      11.986  19.027  45.111  1.00  5.54           C  
+ATOM   1379  C   PHE A 685      10.870  18.310  44.356  1.00  5.42           C  
+ATOM   1380  O   PHE A 685      10.746  17.085  44.426  1.00  6.80           O  
+ATOM   1381  CB  PHE A 685      13.180  19.007  44.143  1.00  5.66           C  
+ATOM   1382  CG  PHE A 685      14.223  20.039  44.434  1.00  6.45           C  
+ATOM   1383  CD1 PHE A 685      15.020  19.953  45.571  1.00  7.50           C  
+ATOM   1384  CD2 PHE A 685      14.383  21.125  43.586  1.00  7.13           C  
+ATOM   1385  CE1 PHE A 685      15.956  20.930  45.876  1.00  8.44           C  
+ATOM   1386  CE2 PHE A 685      15.315  22.104  43.887  1.00  9.11           C  
+ATOM   1387  CZ  PHE A 685      16.104  22.005  45.043  1.00  9.15           C  
+ATOM   1388  N   TYR A 686      10.107  19.104  43.603  1.00  6.04           N  
+ATOM   1389  CA  TYR A 686       9.105  18.643  42.648  1.00  6.20           C  
+ATOM   1390  C   TYR A 686       9.828  18.965  41.315  1.00  6.40           C  
+ATOM   1391  O   TYR A 686      10.163  20.125  41.076  1.00  7.61           O  
+ATOM   1392  CB  TYR A 686       7.807  19.436  42.729  1.00  6.67           C  
+ATOM   1393  CG  TYR A 686       6.907  19.047  41.599  1.00  8.19           C  
+ATOM   1394  CD1 TYR A 686       6.213  17.854  41.623  1.00  9.84           C  
+ATOM   1395  CD2 TYR A 686       6.846  19.826  40.440  1.00  9.73           C  
+ATOM   1396  CE1 TYR A 686       5.481  17.418  40.528  1.00 11.80           C  
+ATOM   1397  CE2 TYR A 686       6.116  19.414  39.324  1.00 10.10           C  
+ATOM   1398  CZ  TYR A 686       5.433  18.199  39.370  1.00 11.40           C  
+ATOM   1399  OH  TYR A 686       4.745  17.746  38.263  1.00 11.62           O  
+ATOM   1400  N   ASN A 687       9.999  17.970  40.451  1.00  6.16           N  
+ATOM   1401  CA  ASN A 687      10.784  18.095  39.209  1.00  6.41           C  
+ATOM   1402  C   ASN A 687       9.897  17.859  37.988  1.00  7.43           C  
+ATOM   1403  O   ASN A 687       9.096  16.917  37.981  1.00  8.20           O  
+ATOM   1404  CB  ASN A 687      11.911  17.055  39.263  1.00  6.42           C  
+ATOM   1405  CG  ASN A 687      12.938  17.225  38.151  1.00  7.76           C  
+ATOM   1406  OD1 ASN A 687      13.545  18.277  38.029  1.00  8.53           O  
+ATOM   1407  ND2 ASN A 687      13.186  16.165  37.393  1.00  7.31           N  
+ATOM   1408  N   ASP A 688      10.016  18.704  36.961  1.00  6.72           N  
+ATOM   1409  CA  ASP A 688       9.157  18.534  35.774  1.00  6.46           C  
+ATOM   1410  C   ASP A 688       9.748  19.272  34.568  1.00  6.21           C  
+ATOM   1411  O   ASP A 688      10.699  20.038  34.716  1.00  6.93           O  
+ATOM   1412  CB  ASP A 688       7.750  19.082  36.080  1.00  7.72           C  
+ATOM   1413  CG  ASP A 688       6.619  18.336  35.344  1.00  7.51           C  
+ATOM   1414  OD1 ASP A 688       6.851  17.709  34.302  1.00  8.37           O  
+ATOM   1415  OD2 ASP A 688       5.464  18.379  35.832  1.00 10.71           O  
+ATOM   1416  N   TYR A 689       9.175  19.030  33.387  1.00  7.40           N  
+ATOM   1417  CA  TYR A 689       9.636  19.662  32.136  1.00  8.13           C  
+ATOM   1418  C   TYR A 689       8.551  20.619  31.620  1.00  8.50           C  
+ATOM   1419  O   TYR A 689       7.375  20.481  31.967  1.00  8.49           O  
+ATOM   1420  CB  TYR A 689       9.998  18.590  31.083  1.00  8.55           C  
+ATOM   1421  CG  TYR A 689       8.839  17.688  30.679  1.00  9.89           C  
+ATOM   1422  CD1 TYR A 689       7.969  18.061  29.645  1.00 11.80           C  
+ATOM   1423  CD2 TYR A 689       8.589  16.478  31.340  1.00 10.35           C  
+ATOM   1424  CE1 TYR A 689       6.876  17.253  29.275  1.00 12.45           C  
+ATOM   1425  CE2 TYR A 689       7.502  15.672  30.990  1.00 11.81           C  
+ATOM   1426  CZ  TYR A 689       6.643  16.070  29.944  1.00 13.40           C  
+ATOM   1427  OH  TYR A 689       5.550  15.310  29.562  1.00 15.47           O  
+ATOM   1428  N   ASN A 690       8.939  21.587  30.778  1.00  9.20           N  
+ATOM   1429  CA  ASN A 690       7.984  22.578  30.230  1.00 10.09           C  
+ATOM   1430  C   ASN A 690       7.281  23.415  31.301  1.00  9.15           C  
+ATOM   1431  O   ASN A 690       6.119  23.775  31.142  1.00 10.51           O  
+ATOM   1432  CB  ASN A 690       6.921  21.943  29.307  1.00 13.59           C  
+ATOM   1433  CG  ASN A 690       7.503  21.349  28.024  1.00 19.88           C  
+ATOM   1434  OD1 ASN A 690       8.661  21.615  27.662  1.00 24.00           O  
+ATOM   1435  ND2 ASN A 690       6.709  20.505  27.331  1.00 21.71           N  
+ATOM   1436  N   ILE A 691       7.991  23.697  32.399  1.00  7.85           N  
+ATOM   1437  CA  ILE A 691       7.501  24.520  33.504  1.00  8.08           C  
+ATOM   1438  C   ILE A 691       8.466  25.706  33.794  1.00  8.74           C  
+ATOM   1439  O   ILE A 691       8.333  26.421  34.818  1.00  9.11           O  
+ATOM   1440  CB  ILE A 691       7.344  23.698  34.824  1.00  7.49           C  
+ATOM   1441  CG1 ILE A 691       8.690  23.112  35.262  1.00  7.88           C  
+ATOM   1442  CG2 ILE A 691       6.312  22.605  34.640  1.00  8.47           C  
+ATOM   1443  CD1 ILE A 691       8.745  22.706  36.749  1.00  9.41           C  
+ATOM   1444  N   GLU A 692       9.386  25.950  32.848  1.00  8.29           N  
+ATOM   1445  CA  GLU A 692      10.415  26.991  33.013  1.00  8.57           C  
+ATOM   1446  C   GLU A 692       9.985  28.416  32.636  1.00  9.36           C  
+ATOM   1447  O   GLU A 692      10.504  29.387  33.185  1.00  9.96           O  
+ATOM   1448  CB  GLU A 692      11.672  26.632  32.209  1.00  8.11           C  
+ATOM   1449  CG  GLU A 692      12.273  25.273  32.506  1.00  9.28           C  
+ATOM   1450  CD  GLU A 692      11.681  24.106  31.702  1.00 10.09           C  
+ATOM   1451  OE1 GLU A 692      10.704  24.272  30.918  1.00  9.96           O  
+ATOM   1452  OE2 GLU A 692      12.219  22.999  31.846  1.00 10.79           O  
+ATOM   1453  N   ASP A 693       9.034  28.519  31.699  1.00 10.25           N  
+ATOM   1454  CA  ASP A 693       8.544  29.818  31.221  1.00 10.88           C  
+ATOM   1455  C   ASP A 693       7.335  30.306  32.025  1.00 11.44           C  
+ATOM   1456  O   ASP A 693       7.231  30.035  33.230  1.00 10.68           O  
+ATOM   1457  CB  ASP A 693       8.224  29.741  29.718  1.00 12.00           C  
+ATOM   1458  CG  ASP A 693       7.124  28.713  29.379  1.00 13.76           C  
+ATOM   1459  OD1 ASP A 693       6.433  28.182  30.277  1.00 13.16           O  
+ATOM   1460  OD2 ASP A 693       6.950  28.421  28.175  1.00 15.65           O  
+ATOM   1461  N   LEU A 694       6.462  31.100  31.392  1.00 11.18           N  
+ATOM   1462  CA  LEU A 694       5.266  31.590  32.086  1.00 11.21           C  
+ATOM   1463  C   LEU A 694       4.001  31.085  31.388  1.00 10.70           C  
+ATOM   1464  O   LEU A 694       2.966  31.716  31.446  1.00 12.38           O  
+ATOM   1465  CB  LEU A 694       5.276  33.117  32.223  1.00 11.87           C  
+ATOM   1466  CG  LEU A 694       6.448  33.728  33.031  1.00 13.21           C  
+ATOM   1467  CD1 LEU A 694       6.543  35.255  32.797  1.00 13.01           C  
+ATOM   1468  CD2 LEU A 694       6.319  33.433  34.547  1.00 13.38           C  
+ATOM   1469  N   GLY A 695       4.108  29.932  30.742  1.00 11.36           N  
+ATOM   1470  CA  GLY A 695       2.988  29.301  30.055  1.00 11.97           C  
+ATOM   1471  C   GLY A 695       2.007  28.563  30.976  1.00 11.95           C  
+ATOM   1472  O   GLY A 695       2.250  28.458  32.177  1.00 10.45           O  
+ATOM   1473  N   PRO A 696       0.934  27.964  30.427  1.00 12.59           N  
+ATOM   1474  CA  PRO A 696      -0.049  27.256  31.267  1.00 12.44           C  
+ATOM   1475  C   PRO A 696       0.463  26.147  32.191  1.00 12.07           C  
+ATOM   1476  O   PRO A 696       0.079  26.136  33.358  1.00 13.43           O  
+ATOM   1477  CB  PRO A 696      -1.118  26.773  30.275  1.00 14.05           C  
+ATOM   1478  CG  PRO A 696      -0.543  26.986  28.910  1.00 15.40           C  
+ATOM   1479  CD  PRO A 696       0.480  28.082  29.028  1.00 14.21           C  
+ATOM   1480  N   LYS A 697       1.354  25.273  31.728  1.00 10.48           N  
+ATOM   1481  CA  LYS A 697       1.850  24.211  32.602  1.00 10.17           C  
+ATOM   1482  C   LYS A 697       2.710  24.814  33.722  1.00 10.26           C  
+ATOM   1483  O   LYS A 697       2.646  24.369  34.871  1.00  9.04           O  
+ATOM   1484  CB  LYS A 697       2.647  23.189  31.810  1.00  9.61           C  
+ATOM   1485  CG  LYS A 697       2.905  21.906  32.572  1.00  9.66           C  
+ATOM   1486  CD  LYS A 697       3.831  21.005  31.787  1.00  8.50           C  
+ATOM   1487  CE  LYS A 697       4.077  19.644  32.484  1.00  8.97           C  
+ATOM   1488  NZ  LYS A 697       5.049  18.797  31.704  1.00  9.85           N  
+ATOM   1489  N   SER A 698       3.506  25.839  33.395  1.00  9.18           N  
+ATOM   1490  CA  SER A 698       4.345  26.512  34.390  1.00  8.89           C  
+ATOM   1491  C   SER A 698       3.467  27.158  35.469  1.00  9.65           C  
+ATOM   1492  O   SER A 698       3.768  27.100  36.676  1.00  9.22           O  
+ATOM   1493  CB  SER A 698       5.183  27.608  33.731  1.00  9.19           C  
+ATOM   1494  OG  SER A 698       5.788  28.397  34.725  1.00  9.94           O  
+ATOM   1495  N   ASN A 699       2.399  27.811  35.027  1.00  9.47           N  
+ATOM   1496  CA  ASN A 699       1.480  28.458  35.957  1.00 10.75           C  
+ATOM   1497  C   ASN A 699       0.766  27.420  36.847  1.00 10.84           C  
+ATOM   1498  O   ASN A 699       0.525  27.677  38.036  1.00 12.28           O  
+ATOM   1499  CB  ASN A 699       0.434  29.292  35.208  1.00 11.64           C  
+ATOM   1500  CG  ASN A 699       1.020  30.526  34.549  1.00 13.16           C  
+ATOM   1501  OD1 ASN A 699       2.094  31.014  34.912  1.00 14.22           O  
+ATOM   1502  ND2 ASN A 699       0.305  31.045  33.574  1.00 14.26           N  
+ATOM   1503  N   ALA A 700       0.418  26.268  36.277  1.00 10.94           N  
+ATOM   1504  CA  ALA A 700      -0.248  25.201  37.052  1.00 11.45           C  
+ATOM   1505  C   ALA A 700       0.699  24.681  38.147  1.00 10.06           C  
+ATOM   1506  O   ALA A 700       0.269  24.489  39.285  1.00 11.58           O  
+ATOM   1507  CB  ALA A 700      -0.666  24.059  36.141  1.00 11.97           C  
+ATOM   1508  N   VAL A 701       1.978  24.478  37.824  1.00  8.49           N  
+ATOM   1509  CA  VAL A 701       2.963  23.995  38.802  1.00  8.74           C  
+ATOM   1510  C   VAL A 701       3.256  25.039  39.882  1.00  8.75           C  
+ATOM   1511  O   VAL A 701       3.299  24.709  41.055  1.00 10.08           O  
+ATOM   1512  CB  VAL A 701       4.258  23.489  38.132  1.00  7.81           C  
+ATOM   1513  CG1 VAL A 701       5.328  23.205  39.150  1.00  8.09           C  
+ATOM   1514  CG2 VAL A 701       3.981  22.224  37.352  1.00  8.15           C  
+ATOM   1515  N   PHE A 702       3.402  26.311  39.510  1.00  8.03           N  
+ATOM   1516  CA  PHE A 702       3.640  27.371  40.488  1.00  8.25           C  
+ATOM   1517  C   PHE A 702       2.477  27.469  41.499  1.00  8.70           C  
+ATOM   1518  O   PHE A 702       2.704  27.552  42.702  1.00  8.94           O  
+ATOM   1519  CB  PHE A 702       3.834  28.733  39.770  1.00  8.60           C  
+ATOM   1520  CG  PHE A 702       3.889  29.901  40.702  1.00  9.98           C  
+ATOM   1521  CD1 PHE A 702       5.054  30.194  41.388  1.00 10.08           C  
+ATOM   1522  CD2 PHE A 702       2.748  30.670  40.947  1.00 10.86           C  
+ATOM   1523  CE1 PHE A 702       5.077  31.235  42.317  1.00 11.76           C  
+ATOM   1524  CE2 PHE A 702       2.766  31.703  41.871  1.00 11.08           C  
+ATOM   1525  CZ  PHE A 702       3.935  31.983  42.558  1.00 10.61           C  
+ATOM   1526  N   ASN A 703       1.245  27.475  40.996  1.00  9.83           N  
+ATOM   1527  CA  ASN A 703       0.071  27.570  41.868  1.00 12.01           C  
+ATOM   1528  C   ASN A 703      -0.052  26.323  42.747  1.00 12.38           C  
+ATOM   1529  O   ASN A 703      -0.417  26.445  43.915  1.00 13.72           O  
+ATOM   1530  CB  ASN A 703      -1.204  27.840  41.077  1.00 14.33           C  
+ATOM   1531  CG  ASN A 703      -1.307  29.292  40.613  1.00 17.70           C  
+ATOM   1532  OD1 ASN A 703      -1.029  30.237  41.367  1.00 20.02           O  
+ATOM   1533  ND2 ASN A 703      -1.710  29.476  39.376  1.00 20.46           N  
+ATOM   1534  N   MET A 704       0.317  25.151  42.212  1.00 11.57           N  
+ATOM   1535  CA  MET A 704       0.288  23.918  42.988  1.00 11.79           C  
+ATOM   1536  C   MET A 704       1.266  24.019  44.172  1.00 10.63           C  
+ATOM   1537  O   MET A 704       0.914  23.738  45.316  1.00 10.64           O  
+ATOM   1538  CB  MET A 704       0.661  22.714  42.117  1.00 11.85           C  
+ATOM   1539  CG  MET A 704       0.756  21.410  42.921  1.00 14.76           C  
+ATOM   1540  SD  MET A 704       1.281  19.965  41.978  1.00 17.19           S  
+ATOM   1541  CE  MET A 704       2.907  20.349  41.684  1.00 17.42           C  
+ATOM   1542  N   ILE A 705       2.491  24.447  43.894  1.00  9.25           N  
+ATOM   1543  CA  ILE A 705       3.506  24.549  44.929  1.00  9.61           C  
+ATOM   1544  C   ILE A 705       3.175  25.629  45.943  1.00  9.98           C  
+ATOM   1545  O   ILE A 705       3.331  25.437  47.144  1.00 10.55           O  
+ATOM   1546  CB  ILE A 705       4.878  24.757  44.286  1.00  9.69           C  
+ATOM   1547  CG1 ILE A 705       5.251  23.481  43.525  1.00  9.53           C  
+ATOM   1548  CG2 ILE A 705       5.907  25.180  45.330  1.00  9.75           C  
+ATOM   1549  CD1 ILE A 705       6.561  23.582  42.784  1.00  9.63           C  
+ATOM   1550  N   LYS A 706       2.686  26.767  45.462  1.00 10.82           N  
+ATOM   1551  CA  LYS A 706       2.286  27.851  46.354  1.00 11.64           C  
+ATOM   1552  C   LYS A 706       1.168  27.356  47.320  1.00 11.68           C  
+ATOM   1553  O   LYS A 706       1.230  27.593  48.514  1.00 12.32           O  
+ATOM   1554  CB  LYS A 706       1.803  29.026  45.516  1.00 11.74           C  
+ATOM   1555  CG  LYS A 706       1.333  30.215  46.303  1.00 14.97           C  
+ATOM   1556  CD  LYS A 706       0.878  31.242  45.282  1.00 18.19           C  
+ATOM   1557  CE  LYS A 706      -0.112  32.194  45.863  1.00 23.05           C  
+ATOM   1558  NZ  LYS A 706       0.573  32.882  46.998  1.00 25.92           N  
+ATOM   1559  N   SER A 707       0.178  26.648  46.795  1.00 12.04           N  
+ATOM   1560  CA  SER A 707      -0.917  26.122  47.595  1.00 13.99           C  
+ATOM   1561  C   SER A 707      -0.433  25.071  48.613  1.00 14.05           C  
+ATOM   1562  O   SER A 707      -0.876  25.081  49.771  1.00 14.01           O  
+ATOM   1563  CB  SER A 707      -1.968  25.517  46.679  1.00 16.30           C  
+ATOM   1564  OG  SER A 707      -3.012  24.929  47.433  1.00 21.95           O  
+ATOM   1565  N   MET A 708       0.461  24.171  48.192  1.00 13.32           N  
+ATOM   1566  CA  MET A 708       1.007  23.146  49.089  1.00 13.90           C  
+ATOM   1567  C   MET A 708       1.652  23.828  50.278  1.00 15.20           C  
+ATOM   1568  O   MET A 708       1.387  23.458  51.427  1.00 15.09           O  
+ATOM   1569  CB  MET A 708       2.046  22.270  48.385  1.00 15.29           C  
+ATOM   1570  CG  MET A 708       1.435  21.182  47.533  1.00 17.98           C  
+ATOM   1571  SD  MET A 708       2.658  20.366  46.455  1.00 21.36           S  
+ATOM   1572  CE  MET A 708       3.602  19.453  47.631  1.00 20.26           C  
+ATOM   1573  N   LYS A 709       2.472  24.849  50.022  1.00 15.53           N  
+ATOM   1574  CA  LYS A 709       3.114  25.568  51.122  1.00 17.48           C  
+ATOM   1575  C   LYS A 709       2.109  26.272  52.032  1.00 17.94           C  
+ATOM   1576  O   LYS A 709       2.305  26.308  53.256  1.00 19.02           O  
+ATOM   1577  CB  LYS A 709       4.148  26.567  50.615  1.00 18.08           C  
+ATOM   1578  CG  LYS A 709       5.314  25.903  49.972  1.00 19.52           C  
+ATOM   1579  CD  LYS A 709       6.443  26.878  49.675  1.00 21.08           C  
+ATOM   1580  CE  LYS A 709       7.261  27.264  50.912  1.00 22.26           C  
+ATOM   1581  NZ  LYS A 709       8.206  26.178  51.397  1.00 22.53           N  
+ATOM   1582  N   GLU A 710       1.045  26.825  51.464  1.00 17.74           N  
+ATOM   1583  CA  GLU A 710       0.037  27.495  52.282  1.00 20.71           C  
+ATOM   1584  C   GLU A 710      -0.728  26.526  53.173  1.00 20.14           C  
+ATOM   1585  O   GLU A 710      -1.434  26.958  54.073  1.00 20.13           O  
+ATOM   1586  CB  GLU A 710      -0.984  28.224  51.432  1.00 22.49           C  
+ATOM   1587  CG  GLU A 710      -0.449  29.431  50.780  1.00 26.82           C  
+ATOM   1588  CD  GLU A 710      -1.500  30.127  49.937  1.00 29.66           C  
+ATOM   1589  OE1 GLU A 710      -2.505  29.496  49.509  1.00 30.93           O  
+ATOM   1590  OE2 GLU A 710      -1.316  31.332  49.715  1.00 32.59           O  
+ATOM   1591  N   ARG A 711      -0.649  25.236  52.861  1.00 19.44           N  
+ATOM   1592  CA  ARG A 711      -1.330  24.206  53.632  1.00 20.20           C  
+ATOM   1593  C   ARG A 711      -0.358  23.443  54.524  1.00 19.06           C  
+ATOM   1594  O   ARG A 711      -0.668  22.354  54.992  1.00 19.95           O  
+ATOM   1595  CB  ARG A 711      -2.051  23.252  52.680  1.00 22.22           C  
+ATOM   1596  CG  ARG A 711      -2.986  23.996  51.742  1.00 25.57           C  
+ATOM   1597  CD  ARG A 711      -3.803  23.092  50.817  1.00 26.84           C  
+ATOM   1598  NE  ARG A 711      -3.072  22.501  49.675  1.00 27.16           N  
+ATOM   1599  CZ  ARG A 711      -2.594  21.262  49.684  1.00 26.18           C  
+ATOM   1600  NH1 ARG A 711      -2.713  20.556  50.793  1.00 26.12           N  
+ATOM   1601  NH2 ARG A 711      -1.963  20.754  48.629  1.00 25.60           N  
+ATOM   1602  N   GLY A 712       0.844  23.975  54.692  1.00 17.78           N  
+ATOM   1603  CA  GLY A 712       1.847  23.325  55.526  1.00 17.90           C  
+ATOM   1604  C   GLY A 712       2.567  22.080  55.000  1.00 17.74           C  
+ATOM   1605  O   GLY A 712       3.190  21.354  55.780  1.00 18.91           O  
+ATOM   1606  N   VAL A 713       2.474  21.804  53.701  1.00 15.00           N  
+ATOM   1607  CA  VAL A 713       3.162  20.654  53.125  1.00 14.56           C  
+ATOM   1608  C   VAL A 713       4.623  21.060  52.938  1.00 14.23           C  
+ATOM   1609  O   VAL A 713       4.912  22.100  52.332  1.00 14.84           O  
+ATOM   1610  CB  VAL A 713       2.567  20.271  51.748  1.00 13.68           C  
+ATOM   1611  CG1 VAL A 713       3.349  19.121  51.117  1.00 14.30           C  
+ATOM   1612  CG2 VAL A 713       1.119  19.932  51.896  1.00 14.43           C  
+ATOM   1613  N   PRO A 714       5.568  20.229  53.408  1.00 14.38           N  
+ATOM   1614  CA  PRO A 714       7.002  20.553  53.271  1.00 14.68           C  
+ATOM   1615  C   PRO A 714       7.576  20.378  51.865  1.00 15.27           C  
+ATOM   1616  O   PRO A 714       7.753  19.259  51.401  1.00 18.74           O  
+ATOM   1617  CB  PRO A 714       7.688  19.598  54.269  1.00 15.08           C  
+ATOM   1618  CG  PRO A 714       6.744  18.384  54.259  1.00 14.97           C  
+ATOM   1619  CD  PRO A 714       5.346  18.979  54.174  1.00 14.39           C  
+ATOM   1620  N   ILE A 715       7.764  21.474  51.153  1.00 13.07           N  
+ATOM   1621  CA  ILE A 715       8.377  21.410  49.837  1.00 11.14           C  
+ATOM   1622  C   ILE A 715       9.371  22.579  49.796  1.00 10.94           C  
+ATOM   1623  O   ILE A 715       9.046  23.710  50.203  1.00 11.71           O  
+ATOM   1624  CB  ILE A 715       7.348  21.415  48.674  1.00 11.59           C  
+ATOM   1625  CG1 ILE A 715       8.103  21.491  47.339  1.00 12.65           C  
+ATOM   1626  CG2 ILE A 715       6.326  22.510  48.832  1.00 11.98           C  
+ATOM   1627  CD1 ILE A 715       7.287  21.084  46.141  1.00 14.79           C  
+ATOM   1628  N   ASP A 716      10.607  22.293  49.412  1.00  8.69           N  
+ATOM   1629  CA  ASP A 716      11.644  23.324  49.401  1.00  8.51           C  
+ATOM   1630  C   ASP A 716      11.998  23.904  48.026  1.00  8.98           C  
+ATOM   1631  O   ASP A 716      12.384  25.075  47.932  1.00  9.98           O  
+ATOM   1632  CB  ASP A 716      12.947  22.778  50.008  1.00  8.70           C  
+ATOM   1633  CG  ASP A 716      12.749  22.165  51.399  1.00  9.89           C  
+ATOM   1634  OD1 ASP A 716      12.381  22.911  52.322  1.00 12.40           O  
+ATOM   1635  OD2 ASP A 716      12.971  20.959  51.564  1.00  9.71           O  
+ATOM   1636  N   GLY A 717      11.941  23.071  46.991  1.00  7.84           N  
+ATOM   1637  CA  GLY A 717      12.349  23.542  45.684  1.00  7.82           C  
+ATOM   1638  C   GLY A 717      11.608  22.999  44.490  1.00  8.89           C  
+ATOM   1639  O   GLY A 717      10.743  22.106  44.608  1.00  7.90           O  
+ATOM   1640  N   VAL A 718      11.851  23.630  43.337  1.00  7.48           N  
+ATOM   1641  CA  VAL A 718      11.249  23.190  42.090  1.00  7.38           C  
+ATOM   1642  C   VAL A 718      12.404  22.899  41.125  1.00  6.95           C  
+ATOM   1643  O   VAL A 718      13.389  23.641  41.087  1.00  6.87           O  
+ATOM   1644  CB  VAL A 718      10.248  24.250  41.482  1.00  8.29           C  
+ATOM   1645  CG1 VAL A 718      10.941  25.558  41.143  1.00  8.18           C  
+ATOM   1646  CG2 VAL A 718       9.553  23.657  40.241  1.00  7.69           C  
+ATOM   1647  N   GLY A 719      12.335  21.759  40.463  1.00  5.91           N  
+ATOM   1648  CA  GLY A 719      13.366  21.375  39.524  1.00  5.41           C  
+ATOM   1649  C   GLY A 719      12.921  21.629  38.101  1.00  5.85           C  
+ATOM   1650  O   GLY A 719      11.891  21.110  37.661  1.00  6.86           O  
+ATOM   1651  N   PHE A 720      13.635  22.524  37.422  1.00  6.00           N  
+ATOM   1652  CA  PHE A 720      13.355  22.836  36.001  1.00  6.51           C  
+ATOM   1653  C   PHE A 720      14.225  21.848  35.184  1.00  5.39           C  
+ATOM   1654  O   PHE A 720      15.464  21.978  35.170  1.00  6.21           O  
+ATOM   1655  CB  PHE A 720      13.806  24.275  35.649  1.00  7.21           C  
+ATOM   1656  CG  PHE A 720      12.917  25.392  36.162  1.00  7.00           C  
+ATOM   1657  CD1 PHE A 720      11.830  25.166  37.016  1.00  6.87           C  
+ATOM   1658  CD2 PHE A 720      13.211  26.707  35.797  1.00  7.42           C  
+ATOM   1659  CE1 PHE A 720      11.071  26.216  37.481  1.00  7.71           C  
+ATOM   1660  CE2 PHE A 720      12.454  27.767  36.262  1.00  8.09           C  
+ATOM   1661  CZ  PHE A 720      11.380  27.532  37.104  1.00  8.65           C  
+ATOM   1662  N   GLN A 721      13.618  20.896  34.480  1.00  6.48           N  
+ATOM   1663  CA  GLN A 721      14.425  19.919  33.719  1.00  6.29           C  
+ATOM   1664  C   GLN A 721      15.273  20.559  32.622  1.00  6.69           C  
+ATOM   1665  O   GLN A 721      16.376  20.105  32.364  1.00  7.22           O  
+ATOM   1666  CB  GLN A 721      13.573  18.806  33.140  1.00  6.47           C  
+ATOM   1667  CG  GLN A 721      13.098  17.817  34.207  1.00  7.05           C  
+ATOM   1668  CD  GLN A 721      12.237  16.706  33.603  1.00  9.40           C  
+ATOM   1669  OE1 GLN A 721      12.263  16.467  32.382  1.00  9.61           O  
+ATOM   1670  NE2 GLN A 721      11.510  15.984  34.450  1.00  8.66           N  
+ATOM   1671  N   CYS A 722      14.752  21.614  32.001  1.00  6.63           N  
+ATOM   1672  CA  CYS A 722      15.479  22.324  30.946  1.00  7.18           C  
+ATOM   1673  C   CYS A 722      15.826  21.490  29.697  1.00  7.03           C  
+ATOM   1674  O   CYS A 722      16.964  21.523  29.229  1.00  7.82           O  
+ATOM   1675  CB  CYS A 722      16.737  23.016  31.503  1.00  7.45           C  
+ATOM   1676  SG  CYS A 722      16.407  24.311  32.709  1.00  9.11           S  
+ATOM   1677  N   HIS A 723      14.857  20.733  29.186  1.00  6.91           N  
+ATOM   1678  CA  HIS A 723      15.068  19.963  27.945  1.00  7.96           C  
+ATOM   1679  C   HIS A 723      14.607  20.926  26.842  1.00  9.02           C  
+ATOM   1680  O   HIS A 723      13.426  20.976  26.492  1.00 10.63           O  
+ATOM   1681  CB  HIS A 723      14.247  18.665  27.956  1.00  8.58           C  
+ATOM   1682  CG  HIS A 723      14.747  17.659  28.951  1.00  7.86           C  
+ATOM   1683  ND1 HIS A 723      16.022  17.139  28.910  1.00  7.88           N  
+ATOM   1684  CD2 HIS A 723      14.144  17.085  30.020  1.00  8.64           C  
+ATOM   1685  CE1 HIS A 723      16.187  16.286  29.910  1.00  8.80           C  
+ATOM   1686  NE2 HIS A 723      15.061  16.238  30.598  1.00  8.02           N  
+ATOM   1687  N   PHE A 724      15.555  21.739  26.377  1.00  9.16           N  
+ATOM   1688  CA  PHE A 724      15.308  22.800  25.394  1.00  9.17           C  
+ATOM   1689  C   PHE A 724      15.734  22.499  23.973  1.00 10.13           C  
+ATOM   1690  O   PHE A 724      16.539  21.622  23.731  1.00  9.08           O  
+ATOM   1691  CB  PHE A 724      16.047  24.064  25.834  1.00 10.08           C  
+ATOM   1692  CG  PHE A 724      15.597  24.621  27.170  1.00 10.27           C  
+ATOM   1693  CD1 PHE A 724      14.243  24.799  27.461  1.00 10.77           C  
+ATOM   1694  CD2 PHE A 724      16.547  25.040  28.116  1.00 11.48           C  
+ATOM   1695  CE1 PHE A 724      13.846  25.395  28.673  1.00 10.84           C  
+ATOM   1696  CE2 PHE A 724      16.144  25.640  29.325  1.00 10.76           C  
+ATOM   1697  CZ  PHE A 724      14.793  25.809  29.587  1.00 10.35           C  
+ATOM   1698  N   ILE A 725      15.185  23.262  23.026  1.00 10.65           N  
+ATOM   1699  CA  ILE A 725      15.577  23.106  21.617  1.00 11.34           C  
+ATOM   1700  C   ILE A 725      16.550  24.246  21.268  1.00  9.92           C  
+ATOM   1701  O   ILE A 725      16.368  25.377  21.709  1.00 11.49           O  
+ATOM   1702  CB  ILE A 725      14.363  23.170  20.682  1.00 12.48           C  
+ATOM   1703  CG1 ILE A 725      13.355  22.092  21.084  1.00 12.82           C  
+ATOM   1704  CG2 ILE A 725      14.812  22.917  19.222  1.00 14.06           C  
+ATOM   1705  CD1 ILE A 725      12.065  22.164  20.322  1.00 15.03           C  
+ATOM   1706  N   ASN A 726      17.570  23.943  20.484  1.00 10.22           N  
+ATOM   1707  CA  ASN A 726      18.577  24.928  20.077  1.00 10.99           C  
+ATOM   1708  C   ASN A 726      17.933  26.161  19.430  1.00 12.01           C  
+ATOM   1709  O   ASN A 726      16.992  26.033  18.636  1.00 11.87           O  
+ATOM   1710  CB  ASN A 726      19.500  24.282  19.050  1.00 12.13           C  
+ATOM   1711  CG  ASN A 726      20.780  25.037  18.862  1.00 13.79           C  
+ATOM   1712  OD1 ASN A 726      21.349  25.545  19.824  1.00 15.17           O  
+ATOM   1713  ND2 ASN A 726      21.281  25.074  17.634  1.00 14.93           N  
+ATOM   1714  N   GLY A 727      18.437  27.338  19.792  1.00 12.05           N  
+ATOM   1715  CA  GLY A 727      17.932  28.580  19.227  1.00 13.30           C  
+ATOM   1716  C   GLY A 727      16.927  29.341  20.074  1.00 14.89           C  
+ATOM   1717  O   GLY A 727      16.031  30.033  19.555  1.00 14.54           O  
+ATOM   1718  N   MET A 728      17.073  29.223  21.390  1.00 14.42           N  
+ATOM   1719  CA  MET A 728      16.201  29.913  22.331  1.00 15.58           C  
+ATOM   1720  C   MET A 728      16.256  31.426  22.104  1.00 15.24           C  
+ATOM   1721  O   MET A 728      17.348  32.004  21.985  1.00 14.97           O  
+ATOM   1722  CB  MET A 728      16.664  29.604  23.753  1.00 16.45           C  
+ATOM   1723  CG  MET A 728      16.601  28.107  24.080  1.00 18.91           C  
+ATOM   1724  SD  MET A 728      17.374  27.774  25.678  1.00 22.09           S  
+ATOM   1725  CE  MET A 728      16.084  28.274  26.690  1.00 20.27           C  
+ATOM   1726  N   SER A 729      15.088  32.061  22.096  1.00 14.74           N  
+ATOM   1727  CA  SER A 729      14.999  33.503  21.905  1.00 14.15           C  
+ATOM   1728  C   SER A 729      15.254  34.291  23.205  1.00 15.12           C  
+ATOM   1729  O   SER A 729      15.138  33.747  24.321  1.00 14.00           O  
+ATOM   1730  CB  SER A 729      13.620  33.855  21.353  1.00 15.54           C  
+ATOM   1731  OG  SER A 729      12.604  33.702  22.338  1.00 16.55           O  
+ATOM   1732  N   PRO A 730      15.612  35.588  23.090  1.00 14.41           N  
+ATOM   1733  CA  PRO A 730      15.857  36.381  24.304  1.00 14.54           C  
+ATOM   1734  C   PRO A 730      14.575  36.524  25.128  1.00 13.63           C  
+ATOM   1735  O   PRO A 730      14.626  36.617  26.343  1.00 14.91           O  
+ATOM   1736  CB  PRO A 730      16.294  37.744  23.753  1.00 14.78           C  
+ATOM   1737  CG  PRO A 730      16.946  37.388  22.469  1.00 15.50           C  
+ATOM   1738  CD  PRO A 730      16.029  36.333  21.885  1.00 15.01           C  
+ATOM   1739  N   GLU A 731      13.424  36.550  24.460  1.00 12.95           N  
+ATOM   1740  CA  GLU A 731      12.166  36.704  25.163  1.00 13.41           C  
+ATOM   1741  C   GLU A 731      11.867  35.449  25.969  1.00 13.56           C  
+ATOM   1742  O   GLU A 731      11.321  35.555  27.072  1.00 12.86           O  
+ATOM   1743  CB  GLU A 731      11.014  36.993  24.197  1.00 14.37           C  
+ATOM   1744  CG  GLU A 731      11.112  38.340  23.514  1.00 16.83           C  
+ATOM   1745  CD  GLU A 731      12.227  38.391  22.486  1.00 17.61           C  
+ATOM   1746  OE1 GLU A 731      12.365  37.429  21.693  1.00 18.03           O  
+ATOM   1747  OE2 GLU A 731      12.977  39.391  22.480  1.00 20.27           O  
+ATOM   1748  N   TYR A 732      12.209  34.283  25.411  1.00 12.17           N  
+ATOM   1749  CA  TYR A 732      11.981  33.014  26.103  1.00 12.92           C  
+ATOM   1750  C   TYR A 732      12.865  33.004  27.343  1.00 12.17           C  
+ATOM   1751  O   TYR A 732      12.381  32.765  28.462  1.00 11.37           O  
+ATOM   1752  CB  TYR A 732      12.324  31.833  25.209  1.00 14.49           C  
+ATOM   1753  CG  TYR A 732      12.007  30.506  25.844  1.00 17.56           C  
+ATOM   1754  CD1 TYR A 732      10.685  30.124  26.074  1.00 18.67           C  
+ATOM   1755  CD2 TYR A 732      13.014  29.615  26.170  1.00 19.20           C  
+ATOM   1756  CE1 TYR A 732      10.364  28.878  26.601  1.00 20.39           C  
+ATOM   1757  CE2 TYR A 732      12.706  28.351  26.700  1.00 20.78           C  
+ATOM   1758  CZ  TYR A 732      11.378  27.992  26.903  1.00 21.47           C  
+ATOM   1759  OH  TYR A 732      11.058  26.709  27.335  1.00 23.93           O  
+ATOM   1760  N   LEU A 733      14.144  33.316  27.150  1.00 10.29           N  
+ATOM   1761  CA  LEU A 733      15.088  33.359  28.252  1.00 10.72           C  
+ATOM   1762  C   LEU A 733      14.633  34.371  29.299  1.00 11.53           C  
+ATOM   1763  O   LEU A 733      14.713  34.125  30.501  1.00 10.74           O  
+ATOM   1764  CB  LEU A 733      16.506  33.642  27.732  1.00 11.69           C  
+ATOM   1765  CG  LEU A 733      17.125  32.469  26.932  1.00 14.05           C  
+ATOM   1766  CD1 LEU A 733      18.189  32.972  25.957  1.00 16.04           C  
+ATOM   1767  CD2 LEU A 733      17.747  31.412  27.856  1.00 14.26           C  
+ATOM   1768  N   ALA A 734      14.098  35.502  28.865  1.00 11.51           N  
+ATOM   1769  CA  ALA A 734      13.620  36.497  29.813  1.00 11.63           C  
+ATOM   1770  C   ALA A 734      12.457  35.945  30.658  1.00 11.52           C  
+ATOM   1771  O   ALA A 734      12.327  36.296  31.846  1.00 12.87           O  
+ATOM   1772  CB  ALA A 734      13.171  37.789  29.070  1.00 11.61           C  
+ATOM   1773  N   SER A 735      11.596  35.111  30.064  1.00 11.63           N  
+ATOM   1774  CA  SER A 735      10.451  34.557  30.813  1.00 10.39           C  
+ATOM   1775  C   SER A 735      10.890  33.548  31.896  1.00  9.87           C  
+ATOM   1776  O   SER A 735      10.290  33.487  32.963  1.00 10.17           O  
+ATOM   1777  CB  SER A 735       9.376  33.993  29.877  1.00 11.08           C  
+ATOM   1778  OG  SER A 735       9.739  32.755  29.333  1.00 14.25           O  
+ATOM   1779  N   ILE A 736      11.975  32.833  31.641  1.00  9.66           N  
+ATOM   1780  CA  ILE A 736      12.531  31.879  32.616  1.00  9.50           C  
+ATOM   1781  C   ILE A 736      13.033  32.674  33.826  1.00  9.64           C  
+ATOM   1782  O   ILE A 736      12.774  32.307  34.967  1.00  9.94           O  
+ATOM   1783  CB  ILE A 736      13.686  31.056  32.015  1.00  9.03           C  
+ATOM   1784  CG1 ILE A 736      13.177  30.219  30.832  1.00 10.43           C  
+ATOM   1785  CG2 ILE A 736      14.319  30.135  33.090  1.00 10.72           C  
+ATOM   1786  CD1 ILE A 736      14.275  29.454  30.087  1.00 10.09           C  
+ATOM   1787  N   ASP A 737      13.739  33.780  33.583  1.00  9.65           N  
+ATOM   1788  CA  ASP A 737      14.243  34.625  34.685  1.00 10.27           C  
+ATOM   1789  C   ASP A 737      13.081  35.164  35.560  1.00 10.28           C  
+ATOM   1790  O   ASP A 737      13.150  35.132  36.789  1.00 10.54           O  
+ATOM   1791  CB  ASP A 737      15.073  35.798  34.128  1.00 10.75           C  
+ATOM   1792  CG  ASP A 737      15.670  36.652  35.224  1.00 10.69           C  
+ATOM   1793  OD1 ASP A 737      16.738  36.291  35.738  1.00 12.30           O  
+ATOM   1794  OD2 ASP A 737      15.059  37.670  35.598  1.00 13.00           O  
+ATOM   1795  N   GLN A 738      12.012  35.650  34.934  1.00  9.97           N  
+ATOM   1796  CA  GLN A 738      10.874  36.163  35.677  1.00 11.34           C  
+ATOM   1797  C   GLN A 738      10.212  35.022  36.483  1.00 10.08           C  
+ATOM   1798  O   GLN A 738       9.726  35.237  37.586  1.00 10.31           O  
+ATOM   1799  CB  GLN A 738       9.842  36.758  34.718  1.00 14.24           C  
+ATOM   1800  CG  GLN A 738      10.231  38.127  34.181  1.00 20.66           C  
+ATOM   1801  CD  GLN A 738       9.590  38.453  32.821  1.00 24.70           C  
+ATOM   1802  OE1 GLN A 738       8.395  38.203  32.588  1.00 26.26           O  
+ATOM   1803  NE2 GLN A 738      10.398  39.024  31.909  1.00 27.40           N  
+ATOM   1804  N   ASN A 739      10.145  33.836  35.898  1.00  9.32           N  
+ATOM   1805  CA  ASN A 739       9.543  32.695  36.597  1.00  8.40           C  
+ATOM   1806  C   ASN A 739      10.381  32.378  37.860  1.00  8.50           C  
+ATOM   1807  O   ASN A 739       9.824  32.153  38.945  1.00  9.11           O  
+ATOM   1808  CB  ASN A 739       9.478  31.493  35.653  1.00  8.44           C  
+ATOM   1809  CG  ASN A 739       8.581  30.398  36.175  1.00  7.63           C  
+ATOM   1810  OD1 ASN A 739       7.634  30.661  36.884  1.00  9.79           O  
+ATOM   1811  ND2 ASN A 739       8.875  29.165  35.808  1.00  9.40           N  
+ATOM   1812  N   ILE A 740      11.710  32.437  37.757  1.00  7.69           N  
+ATOM   1813  CA  ILE A 740      12.579  32.167  38.913  1.00  8.67           C  
+ATOM   1814  C   ILE A 740      12.304  33.186  40.031  1.00  9.03           C  
+ATOM   1815  O   ILE A 740      12.253  32.840  41.224  1.00  8.32           O  
+ATOM   1816  CB  ILE A 740      14.093  32.142  38.509  1.00  8.06           C  
+ATOM   1817  CG1 ILE A 740      14.366  30.959  37.577  1.00  8.35           C  
+ATOM   1818  CG2 ILE A 740      15.008  32.055  39.733  1.00  9.48           C  
+ATOM   1819  CD1 ILE A 740      15.774  30.946  37.015  1.00  9.87           C  
+ATOM   1820  N   LYS A 741      12.091  34.444  39.646  1.00  8.37           N  
+ATOM   1821  CA  LYS A 741      11.809  35.507  40.604  1.00  9.50           C  
+ATOM   1822  C   LYS A 741      10.488  35.297  41.336  1.00  8.92           C  
+ATOM   1823  O   LYS A 741      10.428  35.558  42.540  1.00  9.78           O  
+ATOM   1824  CB  LYS A 741      11.887  36.907  39.926  1.00  9.95           C  
+ATOM   1825  CG  LYS A 741      13.357  37.322  39.686  1.00 11.53           C  
+ATOM   1826  CD  LYS A 741      13.500  38.544  38.802  1.00 12.32           C  
+ATOM   1827  CE  LYS A 741      14.943  39.055  38.804  1.00 11.94           C  
+ATOM   1828  NZ  LYS A 741      15.930  38.097  38.264  1.00 12.61           N  
+ATOM   1829  N   ARG A 742       9.443  34.812  40.656  1.00  9.44           N  
+ATOM   1830  CA  ARG A 742       8.182  34.571  41.363  1.00 10.41           C  
+ATOM   1831  C   ARG A 742       8.317  33.402  42.359  1.00  9.74           C  
+ATOM   1832  O   ARG A 742       7.667  33.415  43.413  1.00 10.33           O  
+ATOM   1833  CB  ARG A 742       6.963  34.450  40.446  1.00 10.94           C  
+ATOM   1834  CG  ARG A 742       6.922  33.285  39.555  1.00 11.90           C  
+ATOM   1835  CD  ARG A 742       5.526  33.180  38.932  1.00 12.49           C  
+ATOM   1836  NE  ARG A 742       5.488  32.060  37.992  1.00 12.11           N  
+ATOM   1837  CZ  ARG A 742       4.447  31.706  37.250  1.00 10.78           C  
+ATOM   1838  NH1 ARG A 742       3.314  32.394  37.295  1.00 12.10           N  
+ATOM   1839  NH2 ARG A 742       4.559  30.663  36.453  1.00 10.93           N  
+ATOM   1840  N   TYR A 743       9.172  32.423  42.063  1.00  8.16           N  
+ATOM   1841  CA  TYR A 743       9.404  31.335  43.033  1.00  8.67           C  
+ATOM   1842  C   TYR A 743      10.127  31.902  44.265  1.00  8.17           C  
+ATOM   1843  O   TYR A 743       9.817  31.545  45.394  1.00  8.53           O  
+ATOM   1844  CB  TYR A 743      10.184  30.159  42.409  1.00  7.56           C  
+ATOM   1845  CG  TYR A 743       9.268  29.164  41.708  1.00  7.73           C  
+ATOM   1846  CD1 TYR A 743       8.431  28.306  42.452  1.00  8.22           C  
+ATOM   1847  CD2 TYR A 743       9.228  29.065  40.309  1.00  7.98           C  
+ATOM   1848  CE1 TYR A 743       7.584  27.384  41.819  1.00  7.96           C  
+ATOM   1849  CE2 TYR A 743       8.388  28.143  39.657  1.00  7.98           C  
+ATOM   1850  CZ  TYR A 743       7.566  27.307  40.418  1.00  8.03           C  
+ATOM   1851  OH  TYR A 743       6.721  26.429  39.798  1.00  8.50           O  
+ATOM   1852  N   ALA A 744      11.065  32.830  44.062  1.00  8.89           N  
+ATOM   1853  CA  ALA A 744      11.780  33.454  45.197  1.00  9.08           C  
+ATOM   1854  C   ALA A 744      10.778  34.189  46.108  1.00  9.30           C  
+ATOM   1855  O   ALA A 744      10.910  34.163  47.335  1.00 10.34           O  
+ATOM   1856  CB  ALA A 744      12.856  34.443  44.692  1.00  9.52           C  
+ATOM   1857  N   GLU A 745       9.750  34.795  45.512  1.00  9.74           N  
+ATOM   1858  CA  GLU A 745       8.760  35.514  46.313  1.00 12.57           C  
+ATOM   1859  C   GLU A 745       7.935  34.624  47.237  1.00 12.31           C  
+ATOM   1860  O   GLU A 745       7.335  35.126  48.185  1.00 13.74           O  
+ATOM   1861  CB  GLU A 745       7.857  36.367  45.452  1.00 15.49           C  
+ATOM   1862  CG  GLU A 745       8.595  37.519  44.878  1.00 19.73           C  
+ATOM   1863  CD  GLU A 745       7.738  38.385  43.995  1.00 24.14           C  
+ATOM   1864  OE1 GLU A 745       6.619  37.956  43.603  1.00 26.03           O  
+ATOM   1865  OE2 GLU A 745       8.211  39.497  43.668  1.00 27.16           O  
+ATOM   1866  N   ILE A 746       7.852  33.331  46.913  1.00 11.37           N  
+ATOM   1867  CA  ILE A 746       7.152  32.380  47.764  1.00 12.11           C  
+ATOM   1868  C   ILE A 746       8.157  31.507  48.551  1.00 11.57           C  
+ATOM   1869  O   ILE A 746       7.788  30.484  49.128  1.00 12.25           O  
+ATOM   1870  CB  ILE A 746       6.091  31.519  47.000  1.00 11.99           C  
+ATOM   1871  CG1 ILE A 746       6.704  30.659  45.881  1.00 11.66           C  
+ATOM   1872  CG2 ILE A 746       5.039  32.431  46.417  1.00 12.97           C  
+ATOM   1873  CD1 ILE A 746       5.783  29.522  45.413  1.00 12.87           C  
+ATOM   1874  N   GLY A 747       9.422  31.918  48.540  1.00 10.61           N  
+ATOM   1875  CA  GLY A 747      10.471  31.223  49.273  1.00 10.70           C  
+ATOM   1876  C   GLY A 747      10.912  29.867  48.761  1.00 10.93           C  
+ATOM   1877  O   GLY A 747      11.399  29.056  49.533  1.00 12.96           O  
+ATOM   1878  N   VAL A 748      10.796  29.633  47.462  1.00  9.21           N  
+ATOM   1879  CA  VAL A 748      11.167  28.354  46.876  1.00  8.85           C  
+ATOM   1880  C   VAL A 748      12.458  28.482  46.075  1.00  9.01           C  
+ATOM   1881  O   VAL A 748      12.658  29.465  45.373  1.00 10.42           O  
+ATOM   1882  CB  VAL A 748       9.987  27.831  45.994  1.00  8.85           C  
+ATOM   1883  CG1 VAL A 748      10.383  26.626  45.188  1.00  8.99           C  
+ATOM   1884  CG2 VAL A 748       8.798  27.486  46.888  1.00  9.07           C  
+ATOM   1885  N   ILE A 749      13.357  27.520  46.222  1.00  8.82           N  
+ATOM   1886  CA  ILE A 749      14.599  27.534  45.471  1.00  9.05           C  
+ATOM   1887  C   ILE A 749      14.389  26.756  44.165  1.00  8.37           C  
+ATOM   1888  O   ILE A 749      13.512  25.889  44.052  1.00  7.65           O  
+ATOM   1889  CB  ILE A 749      15.763  26.936  46.256  1.00 12.03           C  
+ATOM   1890  CG1 ILE A 749      15.482  25.511  46.622  1.00 12.82           C  
+ATOM   1891  CG2 ILE A 749      16.044  27.765  47.505  1.00 11.65           C  
+ATOM   1892  CD1 ILE A 749      16.743  24.794  47.035  1.00 17.15           C  
+ATOM   1893  N   VAL A 750      15.176  27.114  43.160  1.00  7.77           N  
+ATOM   1894  CA  VAL A 750      15.078  26.510  41.841  1.00  7.23           C  
+ATOM   1895  C   VAL A 750      16.383  25.831  41.467  1.00  6.52           C  
+ATOM   1896  O   VAL A 750      17.459  26.385  41.704  1.00  8.27           O  
+ATOM   1897  CB  VAL A 750      14.802  27.636  40.764  1.00  6.96           C  
+ATOM   1898  CG1 VAL A 750      14.816  27.041  39.329  1.00  8.40           C  
+ATOM   1899  CG2 VAL A 750      13.488  28.351  41.048  1.00  6.84           C  
+ATOM   1900  N   SER A 751      16.293  24.615  40.930  1.00  6.22           N  
+ATOM   1901  CA  SER A 751      17.477  23.917  40.406  1.00  5.59           C  
+ATOM   1902  C   SER A 751      17.241  23.594  38.934  1.00  6.21           C  
+ATOM   1903  O   SER A 751      16.122  23.261  38.573  1.00  6.81           O  
+ATOM   1904  CB  SER A 751      17.750  22.578  41.124  1.00  7.03           C  
+ATOM   1905  OG  SER A 751      18.212  22.811  42.441  1.00  7.94           O  
+ATOM   1906  N   PHE A 752      18.279  23.742  38.095  1.00  6.21           N  
+ATOM   1907  CA  PHE A 752      18.195  23.348  36.677  1.00  7.09           C  
+ATOM   1908  C   PHE A 752      18.702  21.895  36.792  1.00  6.86           C  
+ATOM   1909  O   PHE A 752      19.855  21.659  37.111  1.00  6.50           O  
+ATOM   1910  CB  PHE A 752      19.137  24.203  35.792  1.00  7.61           C  
+ATOM   1911  CG  PHE A 752      18.696  25.669  35.606  1.00  8.76           C  
+ATOM   1912  CD1 PHE A 752      17.445  26.127  36.025  1.00  9.00           C  
+ATOM   1913  CD2 PHE A 752      19.561  26.581  34.997  1.00  9.90           C  
+ATOM   1914  CE1 PHE A 752      17.064  27.462  35.850  1.00  9.69           C  
+ATOM   1915  CE2 PHE A 752      19.181  27.929  34.818  1.00 10.82           C  
+ATOM   1916  CZ  PHE A 752      17.938  28.361  35.243  1.00 10.74           C  
+ATOM   1917  N   THR A 753      17.848  20.926  36.480  1.00  6.16           N  
+ATOM   1918  CA  THR A 753      18.166  19.528  36.756  1.00  5.84           C  
+ATOM   1919  C   THR A 753      18.536  18.553  35.668  1.00  6.58           C  
+ATOM   1920  O   THR A 753      19.174  17.548  35.962  1.00  7.31           O  
+ATOM   1921  CB  THR A 753      16.964  18.878  37.536  1.00  6.41           C  
+ATOM   1922  OG1 THR A 753      15.771  19.004  36.746  1.00  7.44           O  
+ATOM   1923  CG2 THR A 753      16.726  19.587  38.890  1.00  6.23           C  
+ATOM   1924  N   GLU A 754      18.147  18.810  34.416  1.00  5.61           N  
+ATOM   1925  CA  GLU A 754      18.435  17.862  33.360  1.00  5.74           C  
+ATOM   1926  C   GLU A 754      18.690  18.610  32.051  1.00  6.79           C  
+ATOM   1927  O   GLU A 754      18.256  18.154  30.979  1.00  7.27           O  
+ATOM   1928  CB  GLU A 754      17.229  16.915  33.166  1.00  6.30           C  
+ATOM   1929  CG  GLU A 754      16.721  16.238  34.492  1.00  6.93           C  
+ATOM   1930  CD  GLU A 754      15.569  15.281  34.278  1.00  8.49           C  
+ATOM   1931  OE1 GLU A 754      15.212  14.988  33.108  1.00  7.83           O  
+ATOM   1932  OE2 GLU A 754      15.006  14.805  35.308  1.00  8.93           O  
+ATOM   1933  N   ILE A 755      19.488  19.664  32.126  1.00  6.12           N  
+ATOM   1934  CA  ILE A 755      19.721  20.492  30.942  1.00  6.47           C  
+ATOM   1935  C   ILE A 755      20.317  19.793  29.738  1.00  6.37           C  
+ATOM   1936  O   ILE A 755      21.288  19.049  29.835  1.00  6.40           O  
+ATOM   1937  CB  ILE A 755      20.709  21.645  31.207  1.00  6.90           C  
+ATOM   1938  CG1 ILE A 755      20.310  22.480  32.421  1.00  6.34           C  
+ATOM   1939  CG2 ILE A 755      20.781  22.545  29.944  1.00  7.30           C  
+ATOM   1940  CD1 ILE A 755      21.484  23.255  32.969  1.00  8.29           C  
+ATOM   1941  N   ASP A 756      19.664  19.993  28.599  1.00  6.80           N  
+ATOM   1942  CA  ASP A 756      20.233  19.558  27.313  1.00  7.73           C  
+ATOM   1943  C   ASP A 756      19.607  20.463  26.250  1.00  7.57           C  
+ATOM   1944  O   ASP A 756      18.514  21.017  26.457  1.00  7.64           O  
+ATOM   1945  CB  ASP A 756      20.215  18.041  27.005  1.00  7.66           C  
+ATOM   1946  CG  ASP A 756      18.854  17.378  27.214  1.00  8.26           C  
+ATOM   1947  OD1 ASP A 756      17.811  18.006  27.042  1.00  9.13           O  
+ATOM   1948  OD2 ASP A 756      18.861  16.169  27.532  1.00  9.17           O  
+ATOM   1949  N   ILE A 757      20.365  20.735  25.188  1.00  8.31           N  
+ATOM   1950  CA  ILE A 757      19.891  21.674  24.130  1.00  9.29           C  
+ATOM   1951  C   ILE A 757      20.022  20.959  22.781  1.00  8.29           C  
+ATOM   1952  O   ILE A 757      21.095  20.885  22.202  1.00  8.70           O  
+ATOM   1953  CB  ILE A 757      20.680  23.012  24.221  1.00  9.49           C  
+ATOM   1954  CG1 ILE A 757      20.560  23.592  25.663  1.00 11.33           C  
+ATOM   1955  CG2 ILE A 757      20.160  24.006  23.169  1.00 10.97           C  
+ATOM   1956  CD1 ILE A 757      21.164  24.998  25.900  1.00 12.95           C  
+ATOM   1957  N   ARG A 758      18.906  20.384  22.349  1.00  9.24           N  
+ATOM   1958  CA  ARG A 758      18.882  19.552  21.174  1.00  9.77           C  
+ATOM   1959  C   ARG A 758      18.886  20.275  19.826  1.00  9.82           C  
+ATOM   1960  O   ARG A 758      18.187  21.255  19.629  1.00  9.81           O  
+ATOM   1961  CB  ARG A 758      17.753  18.518  21.297  1.00 10.69           C  
+ATOM   1962  CG  ARG A 758      16.328  19.072  21.302  1.00 10.83           C  
+ATOM   1963  CD  ARG A 758      15.340  17.913  21.478  1.00 12.03           C  
+ATOM   1964  NE  ARG A 758      13.947  18.317  21.460  1.00 12.50           N  
+ATOM   1965  CZ  ARG A 758      13.278  18.779  22.503  1.00 13.50           C  
+ATOM   1966  NH1 ARG A 758      13.866  18.930  23.683  1.00 13.90           N  
+ATOM   1967  NH2 ARG A 758      12.003  19.109  22.361  1.00 15.64           N  
+ATOM   1968  N   ILE A 759      19.646  19.707  18.900  1.00 11.27           N  
+ATOM   1969  CA  ILE A 759      19.841  20.269  17.556  1.00 12.34           C  
+ATOM   1970  C   ILE A 759      19.253  19.384  16.450  1.00 13.72           C  
+ATOM   1971  O   ILE A 759      19.518  18.166  16.408  1.00 13.26           O  
+ATOM   1972  CB  ILE A 759      21.348  20.432  17.278  1.00 11.56           C  
+ATOM   1973  CG1 ILE A 759      21.963  21.382  18.305  1.00 11.50           C  
+ATOM   1974  CG2 ILE A 759      21.601  20.969  15.831  1.00 12.61           C  
+ATOM   1975  CD1 ILE A 759      23.461  21.443  18.265  1.00 11.85           C  
+ATOM   1976  N   PRO A 760      18.444  19.986  15.542  1.00 16.07           N  
+ATOM   1977  CA  PRO A 760      17.818  19.259  14.414  1.00 18.40           C  
+ATOM   1978  C   PRO A 760      18.946  18.648  13.557  1.00 21.21           C  
+ATOM   1979  O   PRO A 760      19.933  19.325  13.254  1.00 20.98           O  
+ATOM   1980  CB  PRO A 760      17.083  20.367  13.653  1.00 18.23           C  
+ATOM   1981  CG  PRO A 760      16.805  21.415  14.702  1.00 17.98           C  
+ATOM   1982  CD  PRO A 760      18.044  21.409  15.565  1.00 16.19           C  
+ATOM   1983  N   GLN A 761      18.813  17.369  13.212  1.00 24.60           N  
+ATOM   1984  CA  GLN A 761      19.809  16.612  12.453  1.00 29.69           C  
+ATOM   1985  C   GLN A 761      20.197  17.247  11.123  1.00 31.87           C  
+ATOM   1986  O   GLN A 761      21.278  16.970  10.580  1.00 32.76           O  
+ATOM   1987  CB  GLN A 761      19.293  15.193  12.193  1.00 32.52           C  
+ATOM   1988  CG  GLN A 761      20.344  14.090  12.372  1.00 36.55           C  
+ATOM   1989  CD  GLN A 761      20.530  13.666  13.843  1.00 38.84           C  
+ATOM   1990  OE1 GLN A 761      19.947  12.661  14.293  1.00 38.83           O  
+ATOM   1991  NE2 GLN A 761      21.343  14.432  14.596  1.00 39.70           N  
+ATOM   1992  N   SER A 762      19.289  18.060  10.596  1.00 33.48           N  
+ATOM   1993  CA  SER A 762      19.478  18.755   9.329  1.00 36.66           C  
+ATOM   1994  C   SER A 762      20.221  20.107   9.375  1.00 37.70           C  
+ATOM   1995  O   SER A 762      20.685  20.571   8.328  1.00 38.59           O  
+ATOM   1996  CB  SER A 762      18.118  18.936   8.644  1.00 37.76           C  
+ATOM   1997  OG  SER A 762      17.144  19.512   9.524  1.00 40.20           O  
+ATOM   1998  N   GLU A 763      20.255  20.768  10.543  1.00 37.47           N  
+ATOM   1999  CA  GLU A 763      20.940  22.066  10.731  1.00 37.43           C  
+ATOM   2000  C   GLU A 763      22.437  21.825  10.431  1.00 36.05           C  
+ATOM   2001  O   GLU A 763      22.909  20.686  10.557  1.00 36.12           O  
+ATOM   2002  CB  GLU A 763      20.793  22.558  12.203  1.00 39.14           C  
+ATOM   2003  CG  GLU A 763      19.737  23.671  12.502  1.00 41.40           C  
+ATOM   2004  CD  GLU A 763      19.650  24.099  14.020  1.00 43.76           C  
+ATOM   2005  OE1 GLU A 763      20.602  23.877  14.808  1.00 44.89           O  
+ATOM   2006  OE2 GLU A 763      18.611  24.668  14.451  1.00 44.77           O  
+ATOM   2007  N   ASN A 764      23.169  22.857   9.982  1.00 34.17           N  
+ATOM   2008  CA  ASN A 764      24.617  22.700   9.720  1.00 31.78           C  
+ATOM   2009  C   ASN A 764      25.263  22.665  11.114  1.00 29.18           C  
+ATOM   2010  O   ASN A 764      25.092  23.619  11.878  1.00 28.63           O  
+ATOM   2011  CB  ASN A 764      25.170  23.885   8.907  1.00 32.94           C  
+ATOM   2012  CG  ASN A 764      26.709  23.948   8.919  1.00 33.58           C  
+ATOM   2013  OD1 ASN A 764      27.400  22.994   8.539  1.00 34.94           O  
+ATOM   2014  ND2 ASN A 764      27.241  25.064   9.387  1.00 33.52           N  
+ATOM   2015  N   PRO A 765      26.036  21.593  11.441  1.00 26.45           N  
+ATOM   2016  CA  PRO A 765      26.706  21.401  12.733  1.00 24.23           C  
+ATOM   2017  C   PRO A 765      27.561  22.541  13.233  1.00 21.88           C  
+ATOM   2018  O   PRO A 765      27.385  22.985  14.362  1.00 19.95           O  
+ATOM   2019  CB  PRO A 765      27.556  20.148  12.505  1.00 25.21           C  
+ATOM   2020  CG  PRO A 765      26.804  19.404  11.497  1.00 25.28           C  
+ATOM   2021  CD  PRO A 765      26.391  20.486  10.536  1.00 26.28           C  
+ATOM   2022  N   ALA A 766      28.483  23.009  12.390  1.00 19.45           N  
+ATOM   2023  CA  ALA A 766      29.414  24.070  12.768  1.00 17.82           C  
+ATOM   2024  C   ALA A 766      28.771  25.355  13.302  1.00 15.92           C  
+ATOM   2025  O   ALA A 766      29.150  25.851  14.368  1.00 16.01           O  
+ATOM   2026  CB  ALA A 766      30.382  24.357  11.620  1.00 18.46           C  
+ATOM   2027  N   THR A 767      27.760  25.858  12.612  1.00 14.28           N  
+ATOM   2028  CA  THR A 767      27.074  27.060  13.069  1.00 14.72           C  
+ATOM   2029  C   THR A 767      26.005  26.733  14.147  1.00 12.77           C  
+ATOM   2030  O   THR A 767      25.768  27.537  15.027  1.00 13.61           O  
+ATOM   2031  CB  THR A 767      26.466  27.874  11.874  1.00 17.10           C  
+ATOM   2032  OG1 THR A 767      25.641  27.013  11.073  1.00 19.71           O  
+ATOM   2033  CG2 THR A 767      27.602  28.454  10.984  1.00 17.13           C  
+ATOM   2034  N   ALA A 768      25.359  25.574  14.062  1.00 12.75           N  
+ATOM   2035  CA  ALA A 768      24.376  25.160  15.085  1.00 12.12           C  
+ATOM   2036  C   ALA A 768      25.099  25.083  16.457  1.00 10.67           C  
+ATOM   2037  O   ALA A 768      24.532  25.487  17.464  1.00 11.15           O  
+ATOM   2038  CB  ALA A 768      23.778  23.818  14.728  1.00 12.11           C  
+ATOM   2039  N   PHE A 769      26.351  24.631  16.475  1.00 10.85           N  
+ATOM   2040  CA  PHE A 769      27.145  24.543  17.725  1.00 11.87           C  
+ATOM   2041  C   PHE A 769      27.425  25.913  18.353  1.00 12.79           C  
+ATOM   2042  O   PHE A 769      27.554  26.022  19.580  1.00 12.86           O  
+ATOM   2043  CB  PHE A 769      28.470  23.794  17.530  1.00 12.06           C  
+ATOM   2044  CG  PHE A 769      28.319  22.291  17.371  1.00 13.63           C  
+ATOM   2045  CD1 PHE A 769      27.063  21.690  17.308  1.00 14.14           C  
+ATOM   2046  CD2 PHE A 769      29.439  21.487  17.208  1.00 14.70           C  
+ATOM   2047  CE1 PHE A 769      26.920  20.310  17.074  1.00 15.21           C  
+ATOM   2048  CE2 PHE A 769      29.313  20.086  16.970  1.00 16.17           C  
+ATOM   2049  CZ  PHE A 769      28.047  19.501  16.902  1.00 14.88           C  
+ATOM   2050  N   GLN A 770      27.536  26.958  17.530  1.00 10.91           N  
+ATOM   2051  CA  GLN A 770      27.759  28.305  18.019  1.00 11.24           C  
+ATOM   2052  C   GLN A 770      26.498  28.859  18.698  1.00 11.07           C  
+ATOM   2053  O   GLN A 770      26.572  29.516  19.744  1.00 12.05           O  
+ATOM   2054  CB  GLN A 770      28.172  29.214  16.872  1.00 12.81           C  
+ATOM   2055  CG  GLN A 770      29.577  29.025  16.450  1.00 15.21           C  
+ATOM   2056  CD  GLN A 770      29.963  30.063  15.400  1.00 18.23           C  
+ATOM   2057  OE1 GLN A 770      29.245  30.243  14.395  1.00 19.22           O  
+ATOM   2058  NE2 GLN A 770      31.050  30.790  15.650  1.00 18.11           N  
+ATOM   2059  N   VAL A 771      25.339  28.595  18.099  1.00 10.67           N  
+ATOM   2060  CA  VAL A 771      24.056  29.019  18.670  1.00 11.00           C  
+ATOM   2061  C   VAL A 771      23.861  28.281  20.028  1.00 11.27           C  
+ATOM   2062  O   VAL A 771      23.481  28.894  21.037  1.00 11.20           O  
+ATOM   2063  CB  VAL A 771      22.894  28.627  17.752  1.00 11.38           C  
+ATOM   2064  CG1 VAL A 771      21.573  28.923  18.421  1.00 11.70           C  
+ATOM   2065  CG2 VAL A 771      23.002  29.394  16.405  1.00 13.00           C  
+ATOM   2066  N   GLN A 772      24.115  26.974  20.016  1.00 10.26           N  
+ATOM   2067  CA  GLN A 772      24.000  26.138  21.238  1.00  9.83           C  
+ATOM   2068  C   GLN A 772      24.886  26.697  22.341  1.00 10.09           C  
+ATOM   2069  O   GLN A 772      24.445  26.783  23.494  1.00 10.98           O  
+ATOM   2070  CB  GLN A 772      24.400  24.697  20.928  1.00  9.45           C  
+ATOM   2071  CG  GLN A 772      24.463  23.772  22.153  1.00  8.95           C  
+ATOM   2072  CD  GLN A 772      24.854  22.368  21.750  1.00  9.15           C  
+ATOM   2073  OE1 GLN A 772      26.011  22.105  21.399  1.00  9.98           O  
+ATOM   2074  NE2 GLN A 772      23.883  21.456  21.763  1.00  9.31           N  
+ATOM   2075  N   ALA A 773      26.119  27.091  22.003  1.00  9.30           N  
+ATOM   2076  CA  ALA A 773      27.046  27.675  22.977  1.00 10.09           C  
+ATOM   2077  C   ALA A 773      26.479  28.953  23.603  1.00 10.89           C  
+ATOM   2078  O   ALA A 773      26.584  29.160  24.820  1.00 10.94           O  
+ATOM   2079  CB  ALA A 773      28.396  27.953  22.343  1.00 10.56           C  
+ATOM   2080  N   ASN A 774      25.865  29.822  22.793  1.00 11.21           N  
+ATOM   2081  CA  ASN A 774      25.277  31.037  23.336  1.00 12.75           C  
+ATOM   2082  C   ASN A 774      24.076  30.746  24.220  1.00 10.52           C  
+ATOM   2083  O   ASN A 774      23.840  31.467  25.187  1.00 10.75           O  
+ATOM   2084  CB  ASN A 774      24.861  32.005  22.229  1.00 16.52           C  
+ATOM   2085  CG  ASN A 774      26.064  32.636  21.521  1.00 21.29           C  
+ATOM   2086  OD1 ASN A 774      25.934  33.147  20.395  1.00 24.27           O  
+ATOM   2087  ND2 ASN A 774      27.242  32.608  22.175  1.00 23.11           N  
+ATOM   2088  N   ASN A 775      23.298  29.724  23.864  1.00 10.84           N  
+ATOM   2089  CA  ASN A 775      22.120  29.359  24.659  1.00 10.65           C  
+ATOM   2090  C   ASN A 775      22.610  28.848  26.018  1.00  9.82           C  
+ATOM   2091  O   ASN A 775      22.058  29.231  27.046  1.00 10.74           O  
+ATOM   2092  CB  ASN A 775      21.281  28.281  23.958  1.00 10.95           C  
+ATOM   2093  CG  ASN A 775      20.392  28.821  22.819  1.00 12.94           C  
+ATOM   2094  OD1 ASN A 775      19.677  28.047  22.190  1.00 13.12           O  
+ATOM   2095  ND2 ASN A 775      20.407  30.135  22.578  1.00 14.23           N  
+ATOM   2096  N   TYR A 776      23.639  27.997  26.023  1.00  9.85           N  
+ATOM   2097  CA  TYR A 776      24.193  27.500  27.295  1.00  9.62           C  
+ATOM   2098  C   TYR A 776      24.723  28.673  28.135  1.00 11.08           C  
+ATOM   2099  O   TYR A 776      24.512  28.734  29.352  1.00 10.65           O  
+ATOM   2100  CB  TYR A 776      25.315  26.481  27.059  1.00  8.96           C  
+ATOM   2101  CG  TYR A 776      24.847  25.033  27.023  1.00  9.40           C  
+ATOM   2102  CD1 TYR A 776      24.441  24.380  28.197  1.00  9.20           C  
+ATOM   2103  CD2 TYR A 776      24.837  24.299  25.831  1.00  8.96           C  
+ATOM   2104  CE1 TYR A 776      24.050  23.044  28.173  1.00  8.99           C  
+ATOM   2105  CE2 TYR A 776      24.444  22.956  25.797  1.00  8.99           C  
+ATOM   2106  CZ  TYR A 776      24.055  22.337  26.984  1.00  8.28           C  
+ATOM   2107  OH  TYR A 776      23.705  21.022  26.977  1.00  9.32           O  
+ATOM   2108  N   LYS A 777      25.409  29.621  27.489  1.00 10.11           N  
+ATOM   2109  CA  LYS A 777      25.958  30.770  28.183  1.00 11.54           C  
+ATOM   2110  C   LYS A 777      24.854  31.610  28.851  1.00 10.21           C  
+ATOM   2111  O   LYS A 777      24.984  32.031  30.009  1.00 10.63           O  
+ATOM   2112  CB  LYS A 777      26.743  31.614  27.170  1.00 13.73           C  
+ATOM   2113  CG  LYS A 777      27.354  32.871  27.756  1.00 18.39           C  
+ATOM   2114  CD  LYS A 777      28.413  33.408  26.800  1.00 22.43           C  
+ATOM   2115  CE  LYS A 777      29.155  34.588  27.413  1.00 26.37           C  
+ATOM   2116  NZ  LYS A 777      30.205  35.077  26.439  1.00 29.09           N  
+ATOM   2117  N   GLU A 778      23.786  31.888  28.114  1.00  9.53           N  
+ATOM   2118  CA  GLU A 778      22.670  32.662  28.645  1.00 11.49           C  
+ATOM   2119  C   GLU A 778      21.989  31.949  29.823  1.00 11.02           C  
+ATOM   2120  O   GLU A 778      21.608  32.600  30.784  1.00 11.95           O  
+ATOM   2121  CB  GLU A 778      21.649  32.991  27.545  1.00 13.30           C  
+ATOM   2122  CG  GLU A 778      22.182  33.976  26.523  1.00 16.77           C  
+ATOM   2123  CD  GLU A 778      22.744  35.244  27.176  1.00 19.37           C  
+ATOM   2124  OE1 GLU A 778      22.050  35.842  28.050  1.00 19.89           O  
+ATOM   2125  OE2 GLU A 778      23.896  35.632  26.835  1.00 21.64           O  
+ATOM   2126  N   LEU A 779      21.847  30.628  29.754  1.00 10.84           N  
+ATOM   2127  CA  LEU A 779      21.244  29.869  30.862  1.00 11.01           C  
+ATOM   2128  C   LEU A 779      22.108  30.025  32.137  1.00  9.58           C  
+ATOM   2129  O   LEU A 779      21.591  30.239  33.256  1.00  9.63           O  
+ATOM   2130  CB  LEU A 779      21.142  28.388  30.498  1.00 13.34           C  
+ATOM   2131  CG  LEU A 779      19.865  27.744  29.971  1.00 17.57           C  
+ATOM   2132  CD1 LEU A 779      19.989  26.215  30.269  1.00 17.70           C  
+ATOM   2133  CD2 LEU A 779      18.611  28.281  30.681  1.00 18.13           C  
+ATOM   2134  N   MET A 780      23.416  29.900  31.982  1.00  9.14           N  
+ATOM   2135  CA  MET A 780      24.325  30.090  33.122  1.00  9.68           C  
+ATOM   2136  C   MET A 780      24.221  31.505  33.690  1.00 10.14           C  
+ATOM   2137  O   MET A 780      24.249  31.681  34.905  1.00 10.76           O  
+ATOM   2138  CB  MET A 780      25.762  29.762  32.735  1.00 11.00           C  
+ATOM   2139  CG  MET A 780      26.753  29.893  33.884  1.00 12.59           C  
+ATOM   2140  SD  MET A 780      26.314  28.933  35.385  1.00 13.42           S  
+ATOM   2141  CE  MET A 780      26.988  27.360  34.936  1.00 12.56           C  
+ATOM   2142  N   LYS A 781      24.100  32.521  32.834  1.00  9.44           N  
+ATOM   2143  CA  LYS A 781      23.945  33.891  33.334  1.00 10.39           C  
+ATOM   2144  C   LYS A 781      22.668  34.053  34.152  1.00  9.21           C  
+ATOM   2145  O   LYS A 781      22.643  34.824  35.112  1.00  9.91           O  
+ATOM   2146  CB  LYS A 781      23.946  34.907  32.191  1.00 12.88           C  
+ATOM   2147  CG  LYS A 781      25.324  35.094  31.607  1.00 16.54           C  
+ATOM   2148  CD  LYS A 781      25.254  35.743  30.233  1.00 19.89           C  
+ATOM   2149  CE  LYS A 781      24.668  37.148  30.322  1.00 23.51           C  
+ATOM   2150  NZ  LYS A 781      24.540  37.781  28.957  1.00 25.51           N  
+ATOM   2151  N   ILE A 782      21.606  33.350  33.775  1.00  9.21           N  
+ATOM   2152  CA  ILE A 782      20.366  33.425  34.540  1.00  9.91           C  
+ATOM   2153  C   ILE A 782      20.588  32.769  35.919  1.00 10.45           C  
+ATOM   2154  O   ILE A 782      20.137  33.292  36.936  1.00 10.45           O  
+ATOM   2155  CB  ILE A 782      19.197  32.749  33.789  1.00 11.06           C  
+ATOM   2156  CG1 ILE A 782      18.809  33.615  32.592  1.00 11.10           C  
+ATOM   2157  CG2 ILE A 782      17.965  32.535  34.734  1.00 10.92           C  
+ATOM   2158  CD1 ILE A 782      17.815  32.947  31.692  1.00 13.38           C  
+ATOM   2159  N   CYS A 783      21.317  31.660  35.949  1.00  9.61           N  
+ATOM   2160  CA  CYS A 783      21.614  30.994  37.200  1.00 11.23           C  
+ATOM   2161  C   CYS A 783      22.439  31.948  38.107  1.00 12.01           C  
+ATOM   2162  O   CYS A 783      22.079  32.204  39.259  1.00 12.32           O  
+ATOM   2163  CB  CYS A 783      22.329  29.660  36.899  1.00 11.86           C  
+ATOM   2164  SG  CYS A 783      22.967  28.762  38.349  1.00 16.76           S  
+ATOM   2165  N   LEU A 784      23.471  32.578  37.557  1.00 12.25           N  
+ATOM   2166  CA  LEU A 784      24.298  33.497  38.329  1.00 13.07           C  
+ATOM   2167  C   LEU A 784      23.569  34.744  38.847  1.00 13.37           C  
+ATOM   2168  O   LEU A 784      23.949  35.306  39.876  1.00 15.02           O  
+ATOM   2169  CB  LEU A 784      25.508  33.926  37.491  1.00 13.57           C  
+ATOM   2170  CG  LEU A 784      26.463  32.802  37.101  1.00 13.28           C  
+ATOM   2171  CD1 LEU A 784      27.409  33.307  36.056  1.00 14.57           C  
+ATOM   2172  CD2 LEU A 784      27.252  32.289  38.296  1.00 16.54           C  
+ATOM   2173  N   ALA A 785      22.522  35.181  38.160  1.00 12.60           N  
+ATOM   2174  CA  ALA A 785      21.802  36.392  38.560  1.00 13.07           C  
+ATOM   2175  C   ALA A 785      20.714  36.221  39.611  1.00 13.35           C  
+ATOM   2176  O   ALA A 785      20.164  37.223  40.102  1.00 14.40           O  
+ATOM   2177  CB  ALA A 785      21.182  37.043  37.338  1.00 14.37           C  
+ATOM   2178  N   ASN A 786      20.346  34.973  39.899  1.00 10.77           N  
+ATOM   2179  CA  ASN A 786      19.277  34.706  40.839  1.00 10.43           C  
+ATOM   2180  C   ASN A 786      19.801  33.997  42.088  1.00 10.30           C  
+ATOM   2181  O   ASN A 786      20.245  32.853  42.012  1.00 10.02           O  
+ATOM   2182  CB  ASN A 786      18.191  33.894  40.144  1.00 10.13           C  
+ATOM   2183  CG  ASN A 786      17.384  34.733  39.189  1.00  9.46           C  
+ATOM   2184  OD1 ASN A 786      16.538  35.509  39.598  1.00  9.43           O  
+ATOM   2185  ND2 ASN A 786      17.674  34.599  37.903  1.00 11.23           N  
+ATOM   2186  N   PRO A 787      19.706  34.656  43.260  1.00 10.14           N  
+ATOM   2187  CA  PRO A 787      20.200  34.069  44.517  1.00 10.14           C  
+ATOM   2188  C   PRO A 787      19.551  32.735  44.956  1.00  9.42           C  
+ATOM   2189  O   PRO A 787      20.155  32.025  45.745  1.00 10.32           O  
+ATOM   2190  CB  PRO A 787      19.954  35.183  45.556  1.00 10.71           C  
+ATOM   2191  CG  PRO A 787      19.747  36.388  44.798  1.00 12.81           C  
+ATOM   2192  CD  PRO A 787      19.105  35.982  43.491  1.00 10.78           C  
+ATOM   2193  N   ASN A 788      18.313  32.454  44.520  1.00  8.67           N  
+ATOM   2194  CA  ASN A 788      17.608  31.198  44.851  1.00  8.43           C  
+ATOM   2195  C   ASN A 788      17.802  30.072  43.817  1.00  9.09           C  
+ATOM   2196  O   ASN A 788      17.092  29.067  43.854  1.00  9.45           O  
+ATOM   2197  CB  ASN A 788      16.107  31.437  45.050  1.00  8.26           C  
+ATOM   2198  CG  ASN A 788      15.388  31.843  43.753  1.00  9.04           C  
+ATOM   2199  OD1 ASN A 788      15.906  32.642  42.970  1.00  9.96           O  
+ATOM   2200  ND2 ASN A 788      14.193  31.329  43.543  1.00  9.14           N  
+ATOM   2201  N   CYS A 789      18.758  30.230  42.895  1.00  8.95           N  
+ATOM   2202  CA  CYS A 789      19.009  29.200  41.863  1.00 10.21           C  
+ATOM   2203  C   CYS A 789      20.520  28.959  41.830  1.00 12.08           C  
+ATOM   2204  O   CYS A 789      21.235  29.768  41.237  1.00 14.16           O  
+ATOM   2205  CB  CYS A 789      18.521  29.701  40.495  1.00 10.58           C  
+ATOM   2206  SG  CYS A 789      18.843  28.534  39.168  1.00 14.93           S  
+ATOM   2207  N   ASN A 790      21.012  27.868  42.433  1.00 10.86           N  
+ATOM   2208  CA  ASN A 790      22.458  27.624  42.486  1.00 12.32           C  
+ATOM   2209  C   ASN A 790      22.927  26.220  42.100  1.00 11.09           C  
+ATOM   2210  O   ASN A 790      24.045  25.805  42.441  1.00 11.40           O  
+ATOM   2211  CB  ASN A 790      22.979  27.983  43.884  1.00 15.28           C  
+ATOM   2212  CG  ASN A 790      22.597  29.427  44.308  1.00 18.96           C  
+ATOM   2213  OD1 ASN A 790      23.163  30.423  43.813  1.00 21.05           O  
+ATOM   2214  ND2 ASN A 790      21.627  29.539  45.220  1.00 19.29           N  
+ATOM   2215  N   THR A 791      22.068  25.484  41.404  1.00  8.83           N  
+ATOM   2216  CA  THR A 791      22.388  24.124  40.971  1.00  8.04           C  
+ATOM   2217  C   THR A 791      22.154  24.092  39.452  1.00  6.90           C  
+ATOM   2218  O   THR A 791      21.069  24.406  38.979  1.00  7.37           O  
+ATOM   2219  CB  THR A 791      21.458  23.110  41.681  1.00  9.09           C  
+ATOM   2220  OG1 THR A 791      21.666  23.196  43.091  1.00 10.63           O  
+ATOM   2221  CG2 THR A 791      21.683  21.687  41.192  1.00  8.85           C  
+ATOM   2222  N   PHE A 792      23.193  23.712  38.720  1.00  7.35           N  
+ATOM   2223  CA  PHE A 792      23.182  23.679  37.247  1.00  7.22           C  
+ATOM   2224  C   PHE A 792      23.632  22.268  36.821  1.00  6.18           C  
+ATOM   2225  O   PHE A 792      24.831  21.980  36.743  1.00  7.60           O  
+ATOM   2226  CB  PHE A 792      24.184  24.752  36.763  1.00  7.55           C  
+ATOM   2227  CG  PHE A 792      24.131  25.044  35.269  1.00  8.86           C  
+ATOM   2228  CD1 PHE A 792      24.878  24.288  34.353  1.00  9.21           C  
+ATOM   2229  CD2 PHE A 792      23.392  26.123  34.795  1.00  9.60           C  
+ATOM   2230  CE1 PHE A 792      24.899  24.611  32.981  1.00  8.88           C  
+ATOM   2231  CE2 PHE A 792      23.409  26.451  33.404  1.00  9.33           C  
+ATOM   2232  CZ  PHE A 792      24.163  25.695  32.519  1.00  8.97           C  
+ATOM   2233  N   VAL A 793      22.672  21.380  36.583  1.00  5.49           N  
+ATOM   2234  CA  VAL A 793      22.973  20.006  36.194  1.00  5.94           C  
+ATOM   2235  C   VAL A 793      22.515  19.733  34.768  1.00  6.07           C  
+ATOM   2236  O   VAL A 793      21.356  20.010  34.408  1.00  6.80           O  
+ATOM   2237  CB  VAL A 793      22.299  18.964  37.184  1.00  6.86           C  
+ATOM   2238  CG1 VAL A 793      22.601  17.531  36.748  1.00  6.89           C  
+ATOM   2239  CG2 VAL A 793      22.796  19.194  38.629  1.00  8.58           C  
+ATOM   2240  N   MET A 794      23.417  19.174  33.978  1.00  6.34           N  
+ATOM   2241  CA  MET A 794      23.140  18.811  32.572  1.00  7.49           C  
+ATOM   2242  C   MET A 794      22.860  17.301  32.491  1.00  7.70           C  
+ATOM   2243  O   MET A 794      23.393  16.505  33.301  1.00  7.76           O  
+ATOM   2244  CB  MET A 794      24.349  19.183  31.682  1.00  8.28           C  
+ATOM   2245  CG  MET A 794      24.561  20.683  31.633  1.00  9.87           C  
+ATOM   2246  SD  MET A 794      26.189  21.211  31.028  1.00 10.70           S  
+ATOM   2247  CE  MET A 794      27.231  20.747  32.296  1.00 13.21           C  
+ATOM   2248  N   TRP A 795      22.036  16.888  31.540  1.00  7.39           N  
+ATOM   2249  CA  TRP A 795      21.716  15.478  31.421  1.00  7.77           C  
+ATOM   2250  C   TRP A 795      22.749  14.747  30.572  1.00  7.54           C  
+ATOM   2251  O   TRP A 795      22.438  14.182  29.511  1.00  8.84           O  
+ATOM   2252  CB  TRP A 795      20.294  15.266  30.899  1.00  9.56           C  
+ATOM   2253  CG  TRP A 795      19.617  14.024  31.478  1.00 11.66           C  
+ATOM   2254  CD1 TRP A 795      19.065  12.987  30.774  1.00 13.21           C  
+ATOM   2255  CD2 TRP A 795      19.411  13.716  32.885  1.00 12.73           C  
+ATOM   2256  NE1 TRP A 795      18.515  12.066  31.644  1.00 15.19           N  
+ATOM   2257  CE2 TRP A 795      18.713  12.484  32.941  1.00 13.84           C  
+ATOM   2258  CE3 TRP A 795      19.753  14.363  34.091  1.00 13.15           C  
+ATOM   2259  CZ2 TRP A 795      18.340  11.877  34.168  1.00 14.51           C  
+ATOM   2260  CZ3 TRP A 795      19.380  13.756  35.335  1.00 13.66           C  
+ATOM   2261  CH2 TRP A 795      18.684  12.530  35.348  1.00 14.18           C  
+ATOM   2262  N   GLY A 796      23.972  14.728  31.100  1.00  7.39           N  
+ATOM   2263  CA  GLY A 796      25.094  14.097  30.447  1.00  7.06           C  
+ATOM   2264  C   GLY A 796      26.106  15.165  30.072  1.00  8.00           C  
+ATOM   2265  O   GLY A 796      25.860  16.352  30.299  1.00  8.37           O  
+ATOM   2266  N   PHE A 797      27.270  14.752  29.574  1.00  7.64           N  
+ATOM   2267  CA  PHE A 797      28.286  15.716  29.144  1.00  8.99           C  
+ATOM   2268  C   PHE A 797      28.901  15.410  27.768  1.00  9.89           C  
+ATOM   2269  O   PHE A 797      29.568  16.269  27.202  1.00 10.65           O  
+ATOM   2270  CB  PHE A 797      29.373  15.947  30.209  1.00  9.28           C  
+ATOM   2271  CG  PHE A 797      30.185  14.717  30.562  1.00  9.57           C  
+ATOM   2272  CD1 PHE A 797      31.348  14.400  29.849  1.00 10.53           C  
+ATOM   2273  CD2 PHE A 797      29.796  13.890  31.616  1.00 10.81           C  
+ATOM   2274  CE1 PHE A 797      32.115  13.273  30.178  1.00 10.77           C  
+ATOM   2275  CE2 PHE A 797      30.549  12.761  31.961  1.00 11.04           C  
+ATOM   2276  CZ  PHE A 797      31.709  12.449  31.244  1.00 11.41           C  
+ATOM   2277  N   THR A 798      28.712  14.208  27.236  1.00  8.95           N  
+ATOM   2278  CA  THR A 798      29.241  13.909  25.905  1.00  9.31           C  
+ATOM   2279  C   THR A 798      28.103  13.454  25.007  1.00 10.39           C  
+ATOM   2280  O   THR A 798      27.234  12.674  25.413  1.00  9.19           O  
+ATOM   2281  CB  THR A 798      30.376  12.848  25.901  1.00  9.26           C  
+ATOM   2282  OG1 THR A 798      30.632  12.447  24.554  1.00 10.64           O  
+ATOM   2283  CG2 THR A 798      29.974  11.579  26.668  1.00 10.15           C  
+ATOM   2284  N   ASP A 799      28.084  13.983  23.781  1.00 11.12           N  
+ATOM   2285  CA  ASP A 799      27.085  13.622  22.798  1.00 11.10           C  
+ATOM   2286  C   ASP A 799      27.049  12.106  22.529  1.00 11.13           C  
+ATOM   2287  O   ASP A 799      26.093  11.601  21.910  1.00 12.20           O  
+ATOM   2288  CB  ASP A 799      27.385  14.346  21.487  1.00 11.83           C  
+ATOM   2289  CG  ASP A 799      27.107  15.831  21.552  1.00 13.37           C  
+ATOM   2290  OD1 ASP A 799      26.357  16.288  22.443  1.00 12.18           O  
+ATOM   2291  OD2 ASP A 799      27.618  16.552  20.665  1.00 13.71           O  
+ATOM   2292  N   LYS A 800      28.093  11.389  22.954  1.00 10.53           N  
+ATOM   2293  CA  LYS A 800      28.183   9.933  22.787  1.00 11.86           C  
+ATOM   2294  C   LYS A 800      27.056   9.173  23.521  1.00 12.51           C  
+ATOM   2295  O   LYS A 800      26.574   8.134  23.048  1.00 12.74           O  
+ATOM   2296  CB  LYS A 800      29.541   9.450  23.312  1.00 13.34           C  
+ATOM   2297  CG  LYS A 800      29.888   8.015  23.000  1.00 14.39           C  
+ATOM   2298  CD  LYS A 800      31.345   7.718  23.383  1.00 14.66           C  
+ATOM   2299  CE  LYS A 800      31.665   6.252  23.133  1.00 16.71           C  
+ATOM   2300  NZ  LYS A 800      33.111   5.946  23.336  1.00 19.37           N  
+ATOM   2301  N   TYR A 801      26.656   9.693  24.686  1.00 11.82           N  
+ATOM   2302  CA  TYR A 801      25.624   9.068  25.527  1.00 11.92           C  
+ATOM   2303  C   TYR A 801      24.503  10.062  25.838  1.00 10.53           C  
+ATOM   2304  O   TYR A 801      24.684  10.976  26.653  1.00 11.00           O  
+ATOM   2305  CB  TYR A 801      26.250   8.569  26.864  1.00 11.88           C  
+ATOM   2306  CG  TYR A 801      27.460   7.665  26.703  1.00 12.43           C  
+ATOM   2307  CD1 TYR A 801      27.371   6.447  26.003  1.00 13.47           C  
+ATOM   2308  CD2 TYR A 801      28.691   8.015  27.250  1.00 12.35           C  
+ATOM   2309  CE1 TYR A 801      28.475   5.604  25.851  1.00 13.61           C  
+ATOM   2310  CE2 TYR A 801      29.802   7.182  27.107  1.00 13.56           C  
+ATOM   2311  CZ  TYR A 801      29.683   5.977  26.403  1.00 14.17           C  
+ATOM   2312  OH  TYR A 801      30.767   5.161  26.257  1.00 14.68           O  
+ATOM   2313  N   THR A 802      23.353   9.883  25.191  1.00 10.49           N  
+ATOM   2314  CA  THR A 802      22.216  10.763  25.418  1.00 10.35           C  
+ATOM   2315  C   THR A 802      20.893  10.119  25.030  1.00  9.86           C  
+ATOM   2316  O   THR A 802      20.807   9.411  24.034  1.00 10.95           O  
+ATOM   2317  CB  THR A 802      22.375  12.131  24.677  1.00 10.50           C  
+ATOM   2318  OG1 THR A 802      21.154  12.890  24.786  1.00 10.71           O  
+ATOM   2319  CG2 THR A 802      22.761  11.926  23.190  1.00  9.80           C  
+ATOM   2320  N   TRP A 803      19.864  10.380  25.828  1.00  9.97           N  
+ATOM   2321  CA  TRP A 803      18.526   9.865  25.574  1.00 11.28           C  
+ATOM   2322  C   TRP A 803      17.800  10.641  24.460  1.00 10.83           C  
+ATOM   2323  O   TRP A 803      16.716  10.221  24.013  1.00 12.09           O  
+ATOM   2324  CB  TRP A 803      17.663  10.000  26.854  1.00 11.75           C  
+ATOM   2325  CG  TRP A 803      17.221  11.450  27.176  1.00 12.56           C  
+ATOM   2326  CD1 TRP A 803      18.033  12.565  27.259  1.00 12.22           C  
+ATOM   2327  CD2 TRP A 803      15.885  11.921  27.412  1.00 13.47           C  
+ATOM   2328  NE1 TRP A 803      17.281  13.678  27.513  1.00 12.19           N  
+ATOM   2329  CE2 TRP A 803      15.961  13.323  27.609  1.00 13.80           C  
+ATOM   2330  CE3 TRP A 803      14.627  11.294  27.468  1.00 15.15           C  
+ATOM   2331  CZ2 TRP A 803      14.817  14.122  27.856  1.00 14.95           C  
+ATOM   2332  CZ3 TRP A 803      13.491  12.080  27.715  1.00 16.35           C  
+ATOM   2333  CH2 TRP A 803      13.599  13.490  27.905  1.00 16.48           C  
+ATOM   2334  N   ILE A 804      18.366  11.771  24.033  1.00  9.90           N  
+ATOM   2335  CA  ILE A 804      17.674  12.633  23.065  1.00 11.91           C  
+ATOM   2336  C   ILE A 804      17.155  12.015  21.760  1.00 12.44           C  
+ATOM   2337  O   ILE A 804      15.965  12.137  21.465  1.00 13.19           O  
+ATOM   2338  CB  ILE A 804      18.445  13.979  22.817  1.00 11.48           C  
+ATOM   2339  CG1 ILE A 804      18.355  14.855  24.073  1.00 10.60           C  
+ATOM   2340  CG2 ILE A 804      17.871  14.726  21.603  1.00 12.27           C  
+ATOM   2341  CD1 ILE A 804      16.946  15.332  24.401  1.00 11.47           C  
+ATOM   2342  N   PRO A 805      18.017  11.307  21.007  1.00 14.23           N  
+ATOM   2343  CA  PRO A 805      17.589  10.685  19.740  1.00 16.11           C  
+ATOM   2344  C   PRO A 805      16.423   9.699  19.855  1.00 17.14           C  
+ATOM   2345  O   PRO A 805      15.598   9.584  18.948  1.00 18.92           O  
+ATOM   2346  CB  PRO A 805      18.863   9.991  19.260  1.00 16.16           C  
+ATOM   2347  CG  PRO A 805      19.966  10.905  19.769  1.00 15.92           C  
+ATOM   2348  CD  PRO A 805      19.480  11.182  21.185  1.00 14.19           C  
+ATOM   2349  N   GLY A 806      16.338   9.007  20.979  1.00 18.02           N  
+ATOM   2350  CA  GLY A 806      15.274   8.040  21.177  1.00 19.00           C  
+ATOM   2351  C   GLY A 806      13.931   8.660  21.504  1.00 20.58           C  
+ATOM   2352  O   GLY A 806      12.874   8.053  21.292  1.00 22.29           O  
+ATOM   2353  N   THR A 807      13.945   9.857  22.063  1.00 19.90           N  
+ATOM   2354  CA  THR A 807      12.688  10.477  22.408  1.00 20.86           C  
+ATOM   2355  C   THR A 807      12.282  11.526  21.391  1.00 20.03           C  
+ATOM   2356  O   THR A 807      11.091  11.746  21.139  1.00 20.37           O  
+ATOM   2357  CB  THR A 807      12.754  11.060  23.818  1.00 23.13           C  
+ATOM   2358  OG1 THR A 807      12.976   9.990  24.753  1.00 26.29           O  
+ATOM   2359  CG2 THR A 807      11.468  11.776  24.170  1.00 24.19           C  
+ATOM   2360  N   PHE A 808      13.271  12.167  20.790  1.00 18.29           N  
+ATOM   2361  CA  PHE A 808      12.987  13.170  19.789  1.00 17.71           C  
+ATOM   2362  C   PHE A 808      13.743  12.731  18.536  1.00 17.75           C  
+ATOM   2363  O   PHE A 808      14.864  13.194  18.294  1.00 17.78           O  
+ATOM   2364  CB  PHE A 808      13.477  14.550  20.263  1.00 17.58           C  
+ATOM   2365  CG  PHE A 808      12.984  14.937  21.621  1.00 18.68           C  
+ATOM   2366  CD1 PHE A 808      11.747  15.558  21.781  1.00 19.72           C  
+ATOM   2367  CD2 PHE A 808      13.738  14.651  22.756  1.00 19.53           C  
+ATOM   2368  CE1 PHE A 808      11.253  15.894  23.075  1.00 19.96           C  
+ATOM   2369  CE2 PHE A 808      13.255  14.981  24.061  1.00 21.13           C  
+ATOM   2370  CZ  PHE A 808      12.011  15.602  24.215  1.00 20.56           C  
+ATOM   2371  N   PRO A 809      13.202  11.756  17.776  1.00 18.08           N  
+ATOM   2372  CA  PRO A 809      13.927  11.336  16.566  1.00 19.03           C  
+ATOM   2373  C   PRO A 809      14.093  12.542  15.617  1.00 19.40           C  
+ATOM   2374  O   PRO A 809      13.196  13.393  15.484  1.00 20.53           O  
+ATOM   2375  CB  PRO A 809      13.060  10.199  15.993  1.00 19.57           C  
+ATOM   2376  CG  PRO A 809      11.709  10.448  16.576  1.00 19.39           C  
+ATOM   2377  CD  PRO A 809      11.986  10.954  17.974  1.00 18.78           C  
+ATOM   2378  N   GLY A 810      15.277  12.654  15.037  1.00 18.26           N  
+ATOM   2379  CA  GLY A 810      15.567  13.793  14.189  1.00 18.03           C  
+ATOM   2380  C   GLY A 810      16.421  14.849  14.905  1.00 18.33           C  
+ATOM   2381  O   GLY A 810      16.886  15.780  14.250  1.00 19.07           O  
+ATOM   2382  N   TYR A 811      16.627  14.725  16.227  1.00 16.62           N  
+ATOM   2383  CA  TYR A 811      17.431  15.667  17.029  1.00 15.26           C  
+ATOM   2384  C   TYR A 811      18.615  14.952  17.647  1.00 14.35           C  
+ATOM   2385  O   TYR A 811      18.583  13.744  17.807  1.00 14.62           O  
+ATOM   2386  CB  TYR A 811      16.583  16.278  18.147  1.00 15.39           C  
+ATOM   2387  CG  TYR A 811      15.597  17.277  17.633  1.00 17.20           C  
+ATOM   2388  CD1 TYR A 811      14.356  16.874  17.133  1.00 18.54           C  
+ATOM   2389  CD2 TYR A 811      15.917  18.630  17.602  1.00 17.75           C  
+ATOM   2390  CE1 TYR A 811      13.457  17.810  16.609  1.00 20.31           C  
+ATOM   2391  CE2 TYR A 811      15.046  19.561  17.095  1.00 19.62           C  
+ATOM   2392  CZ  TYR A 811      13.820  19.153  16.600  1.00 21.15           C  
+ATOM   2393  OH  TYR A 811      12.973  20.113  16.105  1.00 24.01           O  
+ATOM   2394  N   GLY A 812      19.651  15.700  18.024  1.00 13.61           N  
+ATOM   2395  CA  GLY A 812      20.821  15.091  18.628  1.00 12.10           C  
+ATOM   2396  C   GLY A 812      21.836  16.126  19.066  1.00 10.88           C  
+ATOM   2397  O   GLY A 812      21.477  17.297  19.255  1.00 11.82           O  
+ATOM   2398  N   ASN A 813      23.074  15.673  19.287  1.00 11.36           N  
+ATOM   2399  CA  ASN A 813      24.233  16.506  19.700  1.00 12.67           C  
+ATOM   2400  C   ASN A 813      23.823  17.600  20.705  1.00 11.40           C  
+ATOM   2401  O   ASN A 813      24.161  18.779  20.534  1.00 10.15           O  
+ATOM   2402  CB  ASN A 813      24.856  17.148  18.437  1.00 15.20           C  
+ATOM   2403  CG  ASN A 813      25.318  16.101  17.399  1.00 18.69           C  
+ATOM   2404  OD1 ASN A 813      24.891  16.132  16.232  1.00 22.50           O  
+ATOM   2405  ND2 ASN A 813      26.166  15.165  17.824  1.00 19.74           N  
+ATOM   2406  N   PRO A 814      23.275  17.182  21.863  1.00  9.84           N  
+ATOM   2407  CA  PRO A 814      22.803  18.139  22.861  1.00  9.16           C  
+ATOM   2408  C   PRO A 814      23.707  18.607  23.971  1.00  7.36           C  
+ATOM   2409  O   PRO A 814      23.285  19.485  24.727  1.00  8.08           O  
+ATOM   2410  CB  PRO A 814      21.614  17.368  23.516  1.00  8.69           C  
+ATOM   2411  CG  PRO A 814      21.648  15.943  22.916  1.00  9.66           C  
+ATOM   2412  CD  PRO A 814      23.039  15.809  22.346  1.00 10.13           C  
+ATOM   2413  N   LEU A 815      24.928  18.080  24.020  1.00  8.09           N  
+ATOM   2414  CA  LEU A 815      25.825  18.289  25.163  1.00  9.26           C  
+ATOM   2415  C   LEU A 815      27.119  19.089  24.945  1.00  9.98           C  
+ATOM   2416  O   LEU A 815      27.347  19.571  23.857  1.00 10.44           O  
+ATOM   2417  CB  LEU A 815      26.051  16.923  25.847  1.00  8.58           C  
+ATOM   2418  CG  LEU A 815      24.724  16.170  26.141  1.00  9.21           C  
+ATOM   2419  CD1 LEU A 815      24.955  14.714  26.526  1.00  9.54           C  
+ATOM   2420  CD2 LEU A 815      23.891  16.923  27.190  1.00 10.37           C  
+ATOM   2421  N   ILE A 816      27.980  19.197  25.955  1.00  9.94           N  
+ATOM   2422  CA  ILE A 816      29.161  20.059  25.845  1.00 10.42           C  
+ATOM   2423  C   ILE A 816      30.452  19.489  25.311  1.00 11.62           C  
+ATOM   2424  O   ILE A 816      31.414  20.262  25.072  1.00 12.59           O  
+ATOM   2425  CB  ILE A 816      29.409  20.894  27.130  1.00 10.43           C  
+ATOM   2426  CG1 ILE A 816      29.907  20.004  28.273  1.00 10.94           C  
+ATOM   2427  CG2 ILE A 816      28.127  21.700  27.517  1.00 10.20           C  
+ATOM   2428  CD1 ILE A 816      30.164  20.813  29.562  1.00 12.17           C  
+ATOM   2429  N   TYR A 817      30.515  18.160  25.194  1.00 10.91           N  
+ATOM   2430  CA  TYR A 817      31.657  17.467  24.584  1.00 11.73           C  
+ATOM   2431  C   TYR A 817      31.057  16.658  23.438  1.00 13.04           C  
+ATOM   2432  O   TYR A 817      29.930  16.125  23.546  1.00 11.41           O  
+ATOM   2433  CB  TYR A 817      32.340  16.456  25.519  1.00 11.17           C  
+ATOM   2434  CG  TYR A 817      33.184  17.068  26.592  1.00 11.22           C  
+ATOM   2435  CD1 TYR A 817      32.616  17.477  27.793  1.00 10.70           C  
+ATOM   2436  CD2 TYR A 817      34.559  17.207  26.429  1.00 12.19           C  
+ATOM   2437  CE1 TYR A 817      33.380  17.999  28.807  1.00 12.01           C  
+ATOM   2438  CE2 TYR A 817      35.349  17.737  27.451  1.00 12.70           C  
+ATOM   2439  CZ  TYR A 817      34.741  18.127  28.644  1.00 13.25           C  
+ATOM   2440  OH  TYR A 817      35.498  18.620  29.690  1.00 15.87           O  
+ATOM   2441  N   ASP A 818      31.819  16.542  22.349  1.00 13.44           N  
+ATOM   2442  CA  ASP A 818      31.338  15.771  21.236  1.00 14.99           C  
+ATOM   2443  C   ASP A 818      31.576  14.300  21.542  1.00 15.86           C  
+ATOM   2444  O   ASP A 818      32.012  13.962  22.647  1.00 14.85           O  
+ATOM   2445  CB  ASP A 818      31.922  16.260  19.887  1.00 16.12           C  
+ATOM   2446  CG  ASP A 818      33.417  15.981  19.714  1.00 17.99           C  
+ATOM   2447  OD1 ASP A 818      34.032  15.182  20.450  1.00 16.77           O  
+ATOM   2448  OD2 ASP A 818      33.993  16.585  18.780  1.00 19.79           O  
+ATOM   2449  N   SER A 819      31.243  13.431  20.589  1.00 17.08           N  
+ATOM   2450  CA  SER A 819      31.396  11.984  20.748  1.00 19.29           C  
+ATOM   2451  C   SER A 819      32.800  11.488  20.891  1.00 20.46           C  
+ATOM   2452  O   SER A 819      32.987  10.334  21.280  1.00 21.54           O  
+ATOM   2453  CB  SER A 819      30.744  11.235  19.598  1.00 21.26           C  
+ATOM   2454  OG  SER A 819      29.363  11.525  19.575  1.00 25.86           O  
+ATOM   2455  N   ASN A 820      33.780  12.318  20.525  1.00 21.11           N  
+ATOM   2456  CA  ASN A 820      35.206  11.968  20.642  1.00 22.86           C  
+ATOM   2457  C   ASN A 820      35.869  12.641  21.825  1.00 21.96           C  
+ATOM   2458  O   ASN A 820      37.100  12.669  21.934  1.00 22.33           O  
+ATOM   2459  CB  ASN A 820      35.972  12.374  19.384  1.00 26.07           C  
+ATOM   2460  CG  ASN A 820      35.385  11.767  18.155  1.00 29.63           C  
+ATOM   2461  OD1 ASN A 820      34.908  12.482  17.258  1.00 32.36           O  
+ATOM   2462  ND2 ASN A 820      35.322  10.433  18.130  1.00 31.13           N  
+ATOM   2463  N   TYR A 821      35.041  13.214  22.694  1.00 19.84           N  
+ATOM   2464  CA  TYR A 821      35.495  13.919  23.881  1.00 18.97           C  
+ATOM   2465  C   TYR A 821      36.243  15.233  23.622  1.00 18.33           C  
+ATOM   2466  O   TYR A 821      37.013  15.715  24.459  1.00 18.20           O  
+ATOM   2467  CB  TYR A 821      36.231  12.981  24.861  1.00 18.34           C  
+ATOM   2468  CG  TYR A 821      35.330  11.886  25.421  1.00 17.65           C  
+ATOM   2469  CD1 TYR A 821      34.399  12.168  26.423  1.00 16.97           C  
+ATOM   2470  CD2 TYR A 821      35.387  10.578  24.920  1.00 17.21           C  
+ATOM   2471  CE1 TYR A 821      33.546  11.174  26.919  1.00 16.81           C  
+ATOM   2472  CE2 TYR A 821      34.537   9.579  25.406  1.00 17.65           C  
+ATOM   2473  CZ  TYR A 821      33.619   9.891  26.414  1.00 17.12           C  
+ATOM   2474  OH  TYR A 821      32.809   8.913  26.946  1.00 15.77           O  
+ATOM   2475  N   ASN A 822      35.971  15.840  22.473  1.00 18.49           N  
+ATOM   2476  CA  ASN A 822      36.562  17.139  22.189  1.00 18.20           C  
+ATOM   2477  C   ASN A 822      35.553  18.103  22.727  1.00 16.51           C  
+ATOM   2478  O   ASN A 822      34.369  17.969  22.437  1.00 17.16           O  
+ATOM   2479  CB  ASN A 822      36.668  17.429  20.696  1.00 21.02           C  
+ATOM   2480  CG  ASN A 822      37.546  16.452  19.969  1.00 23.10           C  
+ATOM   2481  OD1 ASN A 822      38.703  16.259  20.326  1.00 25.21           O  
+ATOM   2482  ND2 ASN A 822      36.994  15.819  18.932  1.00 24.58           N  
+ATOM   2483  N   PRO A 823      35.995  19.099  23.496  1.00 16.71           N  
+ATOM   2484  CA  PRO A 823      35.042  20.082  24.040  1.00 16.17           C  
+ATOM   2485  C   PRO A 823      34.444  20.875  22.865  1.00 15.63           C  
+ATOM   2486  O   PRO A 823      35.152  21.224  21.910  1.00 15.91           O  
+ATOM   2487  CB  PRO A 823      35.924  21.012  24.897  1.00 17.17           C  
+ATOM   2488  CG  PRO A 823      37.258  20.275  25.053  1.00 17.76           C  
+ATOM   2489  CD  PRO A 823      37.396  19.453  23.810  1.00 16.99           C  
+ATOM   2490  N   LYS A 824      33.139  21.085  22.909  1.00 13.57           N  
+ATOM   2491  CA  LYS A 824      32.423  21.863  21.889  1.00 12.32           C  
+ATOM   2492  C   LYS A 824      32.449  23.355  22.309  1.00 12.09           C  
+ATOM   2493  O   LYS A 824      32.884  23.693  23.427  1.00 12.30           O  
+ATOM   2494  CB  LYS A 824      30.979  21.342  21.770  1.00 11.52           C  
+ATOM   2495  CG  LYS A 824      30.916  19.968  21.123  1.00 11.54           C  
+ATOM   2496  CD  LYS A 824      29.569  19.254  21.306  1.00 11.61           C  
+ATOM   2497  CE  LYS A 824      28.399  20.006  20.747  1.00 11.08           C  
+ATOM   2498  NZ  LYS A 824      27.131  19.256  21.001  1.00 10.96           N  
+ATOM   2499  N   PRO A 825      31.969  24.270  21.444  1.00 11.81           N  
+ATOM   2500  CA  PRO A 825      31.984  25.692  21.821  1.00 11.31           C  
+ATOM   2501  C   PRO A 825      31.261  25.964  23.155  1.00 10.16           C  
+ATOM   2502  O   PRO A 825      31.646  26.858  23.906  1.00 11.32           O  
+ATOM   2503  CB  PRO A 825      31.265  26.355  20.648  1.00 12.10           C  
+ATOM   2504  CG  PRO A 825      31.716  25.493  19.463  1.00 12.71           C  
+ATOM   2505  CD  PRO A 825      31.585  24.086  20.026  1.00 12.89           C  
+ATOM   2506  N   ALA A 826      30.235  25.160  23.438  1.00 10.41           N  
+ATOM   2507  CA  ALA A 826      29.444  25.299  24.663  1.00 10.86           C  
+ATOM   2508  C   ALA A 826      30.273  25.212  25.961  1.00 10.74           C  
+ATOM   2509  O   ALA A 826      30.002  25.940  26.927  1.00 11.82           O  
+ATOM   2510  CB  ALA A 826      28.311  24.265  24.656  1.00 11.12           C  
+ATOM   2511  N   TYR A 827      31.287  24.357  25.968  1.00 10.86           N  
+ATOM   2512  CA  TYR A 827      32.144  24.207  27.139  1.00 12.08           C  
+ATOM   2513  C   TYR A 827      32.858  25.519  27.469  1.00 12.40           C  
+ATOM   2514  O   TYR A 827      32.833  25.997  28.592  1.00 12.25           O  
+ATOM   2515  CB  TYR A 827      33.134  23.065  26.907  1.00 13.27           C  
+ATOM   2516  CG  TYR A 827      34.136  22.880  28.009  1.00 14.69           C  
+ATOM   2517  CD1 TYR A 827      35.315  23.617  28.011  1.00 14.93           C  
+ATOM   2518  CD2 TYR A 827      33.916  21.961  29.055  1.00 15.06           C  
+ATOM   2519  CE1 TYR A 827      36.276  23.464  29.019  1.00 16.48           C  
+ATOM   2520  CE2 TYR A 827      34.870  21.790  30.081  1.00 15.81           C  
+ATOM   2521  CZ  TYR A 827      36.060  22.556  30.059  1.00 16.30           C  
+ATOM   2522  OH  TYR A 827      37.025  22.471  31.056  1.00 16.23           O  
+ATOM   2523  N   ASN A 828      33.457  26.145  26.470  1.00 13.95           N  
+ATOM   2524  CA  ASN A 828      34.135  27.419  26.727  1.00 15.71           C  
+ATOM   2525  C   ASN A 828      33.162  28.523  27.054  1.00 13.12           C  
+ATOM   2526  O   ASN A 828      33.484  29.422  27.802  1.00 13.33           O  
+ATOM   2527  CB  ASN A 828      34.946  27.853  25.515  1.00 19.94           C  
+ATOM   2528  CG  ASN A 828      36.112  26.926  25.242  1.00 24.62           C  
+ATOM   2529  OD1 ASN A 828      36.814  26.484  26.176  1.00 26.55           O  
+ATOM   2530  ND2 ASN A 828      36.338  26.623  23.956  1.00 26.63           N  
+ATOM   2531  N   ALA A 829      31.987  28.482  26.436  1.00 12.35           N  
+ATOM   2532  CA  ALA A 829      30.975  29.497  26.676  1.00 12.74           C  
+ATOM   2533  C   ALA A 829      30.515  29.486  28.143  1.00 12.84           C  
+ATOM   2534  O   ALA A 829      30.348  30.537  28.752  1.00 13.18           O  
+ATOM   2535  CB  ALA A 829      29.797  29.326  25.734  1.00 11.32           C  
+ATOM   2536  N   ILE A 830      30.328  28.295  28.707  1.00 12.98           N  
+ATOM   2537  CA  ILE A 830      29.935  28.187  30.113  1.00 12.88           C  
+ATOM   2538  C   ILE A 830      31.096  28.728  31.003  1.00 12.50           C  
+ATOM   2539  O   ILE A 830      30.866  29.487  31.954  1.00 11.19           O  
+ATOM   2540  CB  ILE A 830      29.587  26.694  30.459  1.00 12.33           C  
+ATOM   2541  CG1 ILE A 830      28.313  26.272  29.725  1.00 12.18           C  
+ATOM   2542  CG2 ILE A 830      29.430  26.500  31.959  1.00 12.90           C  
+ATOM   2543  CD1 ILE A 830      27.983  24.836  29.935  1.00 12.56           C  
+ATOM   2544  N   LYS A 831      32.329  28.328  30.681  1.00 14.33           N  
+ATOM   2545  CA  LYS A 831      33.497  28.783  31.419  1.00 16.26           C  
+ATOM   2546  C   LYS A 831      33.576  30.330  31.376  1.00 17.49           C  
+ATOM   2547  O   LYS A 831      33.779  30.972  32.416  1.00 18.07           O  
+ATOM   2548  CB  LYS A 831      34.765  28.111  30.886  1.00 17.18           C  
+ATOM   2549  CG  LYS A 831      35.903  28.130  31.896  1.00 19.97           C  
+ATOM   2550  CD  LYS A 831      37.109  27.261  31.499  1.00 20.31           C  
+ATOM   2551  CE  LYS A 831      36.844  25.775  31.738  1.00 19.79           C  
+ATOM   2552  NZ  LYS A 831      38.059  24.922  31.507  1.00 19.41           N  
+ATOM   2553  N   GLU A 832      33.303  30.938  30.222  1.00 17.44           N  
+ATOM   2554  CA  GLU A 832      33.295  32.405  30.127  1.00 18.98           C  
+ATOM   2555  C   GLU A 832      32.231  33.087  30.986  1.00 17.60           C  
+ATOM   2556  O   GLU A 832      32.498  34.129  31.574  1.00 17.32           O  
+ATOM   2557  CB  GLU A 832      33.127  32.852  28.693  1.00 22.28           C  
+ATOM   2558  CG  GLU A 832      34.407  32.709  27.894  1.00 27.15           C  
+ATOM   2559  CD  GLU A 832      34.180  32.833  26.396  1.00 30.33           C  
+ATOM   2560  OE1 GLU A 832      33.091  33.325  25.985  1.00 31.78           O  
+ATOM   2561  OE2 GLU A 832      35.075  32.397  25.624  1.00 32.82           O  
+ATOM   2562  N   ALA A 833      31.013  32.542  31.016  1.00 15.16           N  
+ATOM   2563  CA  ALA A 833      29.951  33.107  31.855  1.00 15.95           C  
+ATOM   2564  C   ALA A 833      30.378  33.076  33.332  1.00 16.66           C  
+ATOM   2565  O   ALA A 833      30.089  34.016  34.063  1.00 17.35           O  
+ATOM   2566  CB  ALA A 833      28.649  32.343  31.684  1.00 14.48           C  
+ATOM   2567  N   LEU A 834      31.038  31.990  33.754  1.00 17.48           N  
+ATOM   2568  CA  LEU A 834      31.506  31.815  35.139  1.00 18.98           C  
+ATOM   2569  C   LEU A 834      32.620  32.783  35.520  1.00 22.12           C  
+ATOM   2570  O   LEU A 834      32.789  33.094  36.693  1.00 21.51           O  
+ATOM   2571  CB  LEU A 834      31.962  30.369  35.383  1.00 17.15           C  
+ATOM   2572  CG  LEU A 834      30.825  29.329  35.442  1.00 16.47           C  
+ATOM   2573  CD1 LEU A 834      31.362  27.896  35.381  1.00 14.97           C  
+ATOM   2574  CD2 LEU A 834      29.996  29.568  36.720  1.00 16.96           C  
+ATOM   2575  N   MET A 835      33.385  33.232  34.527  1.00 25.70           N  
+ATOM   2576  CA  MET A 835      34.472  34.201  34.735  1.00 29.43           C  
+ATOM   2577  C   MET A 835      33.964  35.671  34.705  1.00 31.58           C  
+ATOM   2578  O   MET A 835      34.552  36.495  35.446  1.00 33.91           O  
+ATOM   2579  CB  MET A 835      35.604  34.002  33.705  1.00 30.09           C  
+ATOM   2580  CG  MET A 835      36.360  32.687  33.847  1.00 32.15           C  
+ATOM   2581  SD  MET A 835      37.580  32.273  32.506  1.00 36.39           S  
+ATOM   2582  CE  MET A 835      36.817  33.081  31.002  1.00 34.53           C  
+TER    2583      MET A 835                                                      
+ATOM   2584  N   ASN B 516     -17.198  33.606  80.565  1.00 24.19           N  
+ATOM   2585  CA  ASN B 516     -16.794  32.177  80.713  1.00 23.59           C  
+ATOM   2586  C   ASN B 516     -15.613  31.709  79.850  1.00 21.65           C  
+ATOM   2587  O   ASN B 516     -15.120  30.608  80.069  1.00 21.50           O  
+ATOM   2588  CB  ASN B 516     -17.983  31.225  80.484  1.00 26.32           C  
+ATOM   2589  CG  ASN B 516     -19.046  31.318  81.581  1.00 28.84           C  
+ATOM   2590  OD1 ASN B 516     -18.869  32.032  82.589  1.00 30.47           O  
+ATOM   2591  ND2 ASN B 516     -20.172  30.620  81.377  1.00 28.93           N  
+ATOM   2592  N   ALA B 517     -15.194  32.482  78.843  1.00 18.62           N  
+ATOM   2593  CA  ALA B 517     -14.041  32.076  78.017  1.00 17.01           C  
+ATOM   2594  C   ALA B 517     -12.742  32.290  78.814  1.00 16.34           C  
+ATOM   2595  O   ALA B 517     -12.721  33.058  79.778  1.00 16.04           O  
+ATOM   2596  CB  ALA B 517     -13.986  32.900  76.733  1.00 15.63           C  
+ATOM   2597  N   LEU B 518     -11.666  31.614  78.431  1.00 15.12           N  
+ATOM   2598  CA  LEU B 518     -10.394  31.800  79.111  1.00 14.72           C  
+ATOM   2599  C   LEU B 518     -10.003  33.282  79.170  1.00 14.77           C  
+ATOM   2600  O   LEU B 518      -9.486  33.756  80.210  1.00 14.43           O  
+ATOM   2601  CB  LEU B 518      -9.284  31.034  78.384  1.00 15.61           C  
+ATOM   2602  CG  LEU B 518      -9.208  29.516  78.486  1.00 16.40           C  
+ATOM   2603  CD1 LEU B 518      -8.025  28.999  77.638  1.00 16.60           C  
+ATOM   2604  CD2 LEU B 518      -9.044  29.134  79.964  1.00 16.46           C  
+ATOM   2605  N   ARG B 519     -10.239  34.020  78.070  1.00 14.30           N  
+ATOM   2606  CA  ARG B 519      -9.887  35.444  78.016  1.00 15.23           C  
+ATOM   2607  C   ARG B 519     -10.591  36.325  79.069  1.00 15.90           C  
+ATOM   2608  O   ARG B 519     -10.002  37.305  79.554  1.00 15.46           O  
+ATOM   2609  CB  ARG B 519     -10.104  36.032  76.612  1.00 15.27           C  
+ATOM   2610  CG  ARG B 519     -11.539  36.053  76.163  1.00 16.66           C  
+ATOM   2611  CD  ARG B 519     -11.648  36.598  74.766  1.00 19.19           C  
+ATOM   2612  NE  ARG B 519     -11.233  37.996  74.670  1.00 22.45           N  
+ATOM   2613  CZ  ARG B 519     -11.153  38.675  73.516  1.00 24.43           C  
+ATOM   2614  NH1 ARG B 519     -11.454  38.088  72.337  1.00 25.11           N  
+ATOM   2615  NH2 ARG B 519     -10.786  39.940  73.549  1.00 24.68           N  
+ATOM   2616  N   ASP B 520     -11.829  35.965  79.433  1.00 16.87           N  
+ATOM   2617  CA  ASP B 520     -12.589  36.726  80.454  1.00 18.63           C  
+ATOM   2618  C   ASP B 520     -11.969  36.598  81.863  1.00 19.37           C  
+ATOM   2619  O   ASP B 520     -11.858  37.585  82.602  1.00 20.45           O  
+ATOM   2620  CB  ASP B 520     -14.049  36.289  80.461  1.00 19.16           C  
+ATOM   2621  CG  ASP B 520     -14.698  36.424  79.090  1.00 20.40           C  
+ATOM   2622  OD1 ASP B 520     -14.551  37.491  78.455  1.00 21.51           O  
+ATOM   2623  OD2 ASP B 520     -15.334  35.456  78.629  1.00 21.42           O  
+ATOM   2624  N   TYR B 521     -11.549  35.393  82.225  1.00 19.60           N  
+ATOM   2625  CA  TYR B 521     -10.895  35.196  83.521  1.00 21.30           C  
+ATOM   2626  C   TYR B 521      -9.501  35.805  83.525  1.00 21.32           C  
+ATOM   2627  O   TYR B 521      -9.049  36.322  84.544  1.00 21.83           O  
+ATOM   2628  CB  TYR B 521     -10.787  33.715  83.852  1.00 23.03           C  
+ATOM   2629  CG  TYR B 521     -12.125  33.102  84.122  1.00 26.74           C  
+ATOM   2630  CD1 TYR B 521     -12.868  33.476  85.259  1.00 28.38           C  
+ATOM   2631  CD2 TYR B 521     -12.684  32.180  83.234  1.00 28.39           C  
+ATOM   2632  CE1 TYR B 521     -14.142  32.948  85.499  1.00 29.52           C  
+ATOM   2633  CE2 TYR B 521     -13.963  31.644  83.462  1.00 30.27           C  
+ATOM   2634  CZ  TYR B 521     -14.682  32.038  84.596  1.00 30.65           C  
+ATOM   2635  OH  TYR B 521     -15.951  31.538  84.797  1.00 32.07           O  
+ATOM   2636  N   ALA B 522      -8.816  35.726  82.380  1.00 19.75           N  
+ATOM   2637  CA  ALA B 522      -7.463  36.263  82.250  1.00 18.98           C  
+ATOM   2638  C   ALA B 522      -7.493  37.764  82.397  1.00 18.24           C  
+ATOM   2639  O   ALA B 522      -6.710  38.344  83.129  1.00 17.99           O  
+ATOM   2640  CB  ALA B 522      -6.854  35.863  80.863  1.00 18.58           C  
+ATOM   2641  N   GLU B 523      -8.431  38.389  81.714  1.00 19.66           N  
+ATOM   2642  CA  GLU B 523      -8.574  39.833  81.773  1.00 23.96           C  
+ATOM   2643  C   GLU B 523      -8.827  40.320  83.202  1.00 23.53           C  
+ATOM   2644  O   GLU B 523      -8.287  41.351  83.625  1.00 22.86           O  
+ATOM   2645  CB  GLU B 523      -9.728  40.285  80.877  1.00 27.38           C  
+ATOM   2646  CG  GLU B 523      -9.706  41.770  80.603  1.00 32.86           C  
+ATOM   2647  CD  GLU B 523      -8.328  42.238  80.121  1.00 36.70           C  
+ATOM   2648  OE1 GLU B 523      -7.908  41.815  79.003  1.00 37.99           O  
+ATOM   2649  OE2 GLU B 523      -7.656  43.004  80.872  1.00 38.64           O  
+ATOM   2650  N   ALA B 524      -9.657  39.570  83.924  1.00 23.28           N  
+ATOM   2651  CA  ALA B 524     -10.023  39.869  85.314  1.00 23.19           C  
+ATOM   2652  C   ALA B 524      -8.781  39.888  86.211  1.00 22.77           C  
+ATOM   2653  O   ALA B 524      -8.730  40.622  87.216  1.00 23.22           O  
+ATOM   2654  CB  ALA B 524     -11.038  38.818  85.825  1.00 22.59           C  
+ATOM   2655  N   ARG B 525      -7.770  39.115  85.823  1.00 21.90           N  
+ATOM   2656  CA  ARG B 525      -6.529  39.022  86.590  1.00 21.65           C  
+ATOM   2657  C   ARG B 525      -5.394  39.897  86.033  1.00 21.56           C  
+ATOM   2658  O   ARG B 525      -4.266  39.838  86.524  1.00 22.44           O  
+ATOM   2659  CB  ARG B 525      -6.087  37.558  86.673  1.00 23.09           C  
+ATOM   2660  CG  ARG B 525      -7.188  36.569  87.116  1.00 25.12           C  
+ATOM   2661  CD  ARG B 525      -7.754  36.897  88.502  1.00 27.14           C  
+ATOM   2662  NE  ARG B 525      -6.700  36.901  89.516  1.00 29.34           N  
+ATOM   2663  CZ  ARG B 525      -6.201  35.814  90.111  1.00 30.54           C  
+ATOM   2664  NH1 ARG B 525      -6.666  34.605  89.819  1.00 31.71           N  
+ATOM   2665  NH2 ARG B 525      -5.158  35.922  90.932  1.00 31.22           N  
+ATOM   2666  N   GLY B 526      -5.689  40.689  85.002  1.00 20.68           N  
+ATOM   2667  CA  GLY B 526      -4.689  41.565  84.402  1.00 21.01           C  
+ATOM   2668  C   GLY B 526      -3.658  40.900  83.487  1.00 21.39           C  
+ATOM   2669  O   GLY B 526      -2.560  41.417  83.260  1.00 20.72           O  
+ATOM   2670  N   ILE B 527      -3.996  39.745  82.945  1.00 20.68           N  
+ATOM   2671  CA  ILE B 527      -3.049  39.085  82.075  1.00 20.61           C  
+ATOM   2672  C   ILE B 527      -3.669  38.813  80.691  1.00 18.91           C  
+ATOM   2673  O   ILE B 527      -4.906  38.825  80.535  1.00 18.67           O  
+ATOM   2674  CB  ILE B 527      -2.482  37.761  82.717  1.00 23.03           C  
+ATOM   2675  CG1 ILE B 527      -3.555  36.686  82.784  1.00 23.34           C  
+ATOM   2676  CG2 ILE B 527      -1.876  38.002  84.142  1.00 22.85           C  
+ATOM   2677  CD1 ILE B 527      -3.003  35.329  82.359  1.00 24.94           C  
+ATOM   2678  N   LYS B 528      -2.793  38.662  79.692  1.00 15.53           N  
+ATOM   2679  CA  LYS B 528      -3.181  38.384  78.312  1.00 14.72           C  
+ATOM   2680  C   LYS B 528      -2.870  36.926  78.056  1.00 13.09           C  
+ATOM   2681  O   LYS B 528      -1.785  36.449  78.397  1.00 14.18           O  
+ATOM   2682  CB  LYS B 528      -2.378  39.266  77.328  1.00 15.94           C  
+ATOM   2683  CG  LYS B 528      -2.692  40.775  77.453  1.00 17.24           C  
+ATOM   2684  CD  LYS B 528      -4.198  41.041  77.218  1.00 18.91           C  
+ATOM   2685  CE  LYS B 528      -4.576  42.501  77.532  1.00 20.63           C  
+ATOM   2686  NZ  LYS B 528      -5.935  42.849  77.028  1.00 21.53           N  
+ATOM   2687  N   ILE B 529      -3.824  36.213  77.474  1.00 11.29           N  
+ATOM   2688  CA  ILE B 529      -3.649  34.804  77.182  1.00 11.08           C  
+ATOM   2689  C   ILE B 529      -3.780  34.648  75.656  1.00 10.68           C  
+ATOM   2690  O   ILE B 529      -4.732  35.152  75.041  1.00 12.67           O  
+ATOM   2691  CB  ILE B 529      -4.659  33.903  78.025  1.00 12.21           C  
+ATOM   2692  CG1 ILE B 529      -4.401  32.421  77.740  1.00 14.10           C  
+ATOM   2693  CG2 ILE B 529      -6.112  34.294  77.795  1.00 12.98           C  
+ATOM   2694  CD1 ILE B 529      -4.851  31.482  78.882  1.00 15.18           C  
+ATOM   2695  N   GLY B 530      -2.813  33.995  75.034  1.00 10.16           N  
+ATOM   2696  CA  GLY B 530      -2.864  33.888  73.590  1.00  9.94           C  
+ATOM   2697  C   GLY B 530      -2.346  32.606  72.996  1.00  9.84           C  
+ATOM   2698  O   GLY B 530      -2.031  31.631  73.689  1.00  9.14           O  
+ATOM   2699  N   THR B 531      -2.215  32.636  71.673  1.00  9.09           N  
+ATOM   2700  CA  THR B 531      -1.760  31.497  70.920  1.00  8.33           C  
+ATOM   2701  C   THR B 531      -1.186  31.951  69.571  1.00  8.59           C  
+ATOM   2702  O   THR B 531      -1.491  33.040  69.103  1.00  9.34           O  
+ATOM   2703  CB  THR B 531      -2.964  30.567  70.613  1.00  8.75           C  
+ATOM   2704  OG1 THR B 531      -2.529  29.436  69.850  1.00  9.28           O  
+ATOM   2705  CG2 THR B 531      -4.066  31.336  69.841  1.00  9.03           C  
+ATOM   2706  N   CYS B 532      -0.325  31.134  68.988  1.00  8.86           N  
+ATOM   2707  CA  CYS B 532       0.166  31.443  67.652  1.00 10.06           C  
+ATOM   2708  C   CYS B 532      -0.975  30.982  66.730  1.00 11.85           C  
+ATOM   2709  O   CYS B 532      -1.819  30.115  67.117  1.00 11.33           O  
+ATOM   2710  CB  CYS B 532       1.455  30.694  67.321  1.00 12.87           C  
+ATOM   2711  SG  CYS B 532       1.297  28.919  67.163  1.00 15.38           S  
+ATOM   2712  N   VAL B 533      -1.043  31.573  65.538  1.00  9.92           N  
+ATOM   2713  CA  VAL B 533      -2.088  31.249  64.568  1.00 10.61           C  
+ATOM   2714  C   VAL B 533      -1.512  30.355  63.453  1.00 12.36           C  
+ATOM   2715  O   VAL B 533      -0.493  30.678  62.822  1.00 13.27           O  
+ATOM   2716  CB  VAL B 533      -2.756  32.551  64.048  1.00 11.29           C  
+ATOM   2717  CG1 VAL B 533      -3.845  32.259  62.989  1.00 11.55           C  
+ATOM   2718  CG2 VAL B 533      -3.362  33.303  65.241  1.00 11.30           C  
+ATOM   2719  N   ASN B 534      -2.112  29.172  63.339  1.00 12.50           N  
+ATOM   2720  CA  ASN B 534      -1.720  28.125  62.391  1.00 13.59           C  
+ATOM   2721  C   ASN B 534      -2.298  28.406  60.978  1.00 13.85           C  
+ATOM   2722  O   ASN B 534      -3.255  29.187  60.815  1.00 13.79           O  
+ATOM   2723  CB  ASN B 534      -2.159  26.726  62.940  1.00 13.37           C  
+ATOM   2724  CG  ASN B 534      -1.602  26.434  64.371  1.00 14.66           C  
+ATOM   2725  OD1 ASN B 534      -0.390  26.258  64.542  1.00 16.83           O  
+ATOM   2726  ND2 ASN B 534      -2.472  26.456  65.393  1.00 11.93           N  
+ATOM   2727  N   TYR B 535      -1.774  27.704  59.976  1.00 14.14           N  
+ATOM   2728  CA  TYR B 535      -2.199  27.914  58.586  1.00 13.82           C  
+ATOM   2729  C   TYR B 535      -3.694  27.910  58.232  1.00 14.13           C  
+ATOM   2730  O   TYR B 535      -4.100  28.646  57.326  1.00 14.06           O  
+ATOM   2731  CB  TYR B 535      -1.420  26.969  57.635  1.00 16.23           C  
+ATOM   2732  CG  TYR B 535      -1.819  25.487  57.670  1.00 17.27           C  
+ATOM   2733  CD1 TYR B 535      -2.972  25.039  57.003  1.00 18.80           C  
+ATOM   2734  CD2 TYR B 535      -1.082  24.556  58.410  1.00 18.96           C  
+ATOM   2735  CE1 TYR B 535      -3.394  23.699  57.079  1.00 20.20           C  
+ATOM   2736  CE2 TYR B 535      -1.491  23.209  58.502  1.00 19.71           C  
+ATOM   2737  CZ  TYR B 535      -2.651  22.789  57.838  1.00 21.42           C  
+ATOM   2738  OH  TYR B 535      -3.104  21.473  57.953  1.00 23.97           O  
+ATOM   2739  N   PRO B 536      -4.545  27.103  58.933  1.00 14.36           N  
+ATOM   2740  CA  PRO B 536      -5.977  27.096  58.575  1.00 14.60           C  
+ATOM   2741  C   PRO B 536      -6.645  28.458  58.615  1.00 15.24           C  
+ATOM   2742  O   PRO B 536      -7.628  28.691  57.902  1.00 15.74           O  
+ATOM   2743  CB  PRO B 536      -6.603  26.178  59.635  1.00 15.96           C  
+ATOM   2744  CG  PRO B 536      -5.504  25.297  60.026  1.00 16.03           C  
+ATOM   2745  CD  PRO B 536      -4.304  26.202  60.083  1.00 14.64           C  
+ATOM   2746  N   PHE B 537      -6.157  29.339  59.490  1.00 14.57           N  
+ATOM   2747  CA  PHE B 537      -6.708  30.682  59.591  1.00 16.35           C  
+ATOM   2748  C   PHE B 537      -6.652  31.442  58.241  1.00 18.09           C  
+ATOM   2749  O   PHE B 537      -7.584  32.148  57.880  1.00 18.37           O  
+ATOM   2750  CB  PHE B 537      -5.937  31.500  60.630  1.00 15.99           C  
+ATOM   2751  CG  PHE B 537      -6.288  32.961  60.618  1.00 16.06           C  
+ATOM   2752  CD1 PHE B 537      -7.435  33.424  61.273  1.00 16.49           C  
+ATOM   2753  CD2 PHE B 537      -5.508  33.870  59.906  1.00 16.14           C  
+ATOM   2754  CE1 PHE B 537      -7.791  34.780  61.208  1.00 17.50           C  
+ATOM   2755  CE2 PHE B 537      -5.856  35.229  59.834  1.00 16.02           C  
+ATOM   2756  CZ  PHE B 537      -6.987  35.684  60.477  1.00 16.62           C  
+ATOM   2757  N   TYR B 538      -5.528  31.313  57.540  1.00 20.47           N  
+ATOM   2758  CA  TYR B 538      -5.301  31.997  56.267  1.00 22.81           C  
+ATOM   2759  C   TYR B 538      -6.036  31.464  55.042  1.00 26.14           C  
+ATOM   2760  O   TYR B 538      -6.329  32.233  54.140  1.00 27.49           O  
+ATOM   2761  CB  TYR B 538      -3.809  32.080  55.999  1.00 20.96           C  
+ATOM   2762  CG  TYR B 538      -3.090  32.832  57.083  1.00 20.46           C  
+ATOM   2763  CD1 TYR B 538      -3.161  34.236  57.154  1.00 20.07           C  
+ATOM   2764  CD2 TYR B 538      -2.356  32.148  58.058  1.00 20.31           C  
+ATOM   2765  CE1 TYR B 538      -2.514  34.932  58.173  1.00 20.01           C  
+ATOM   2766  CE2 TYR B 538      -1.711  32.827  59.076  1.00 20.38           C  
+ATOM   2767  CZ  TYR B 538      -1.793  34.228  59.126  1.00 21.06           C  
+ATOM   2768  OH  TYR B 538      -1.145  34.912  60.129  1.00 23.04           O  
+ATOM   2769  N   ASN B 539      -6.263  30.159  54.950  1.00 29.19           N  
+ATOM   2770  CA  ASN B 539      -7.000  29.658  53.792  1.00 33.11           C  
+ATOM   2771  C   ASN B 539      -8.424  29.182  54.100  1.00 33.40           C  
+ATOM   2772  O   ASN B 539      -9.110  28.625  53.243  1.00 33.76           O  
+ATOM   2773  CB  ASN B 539      -6.193  28.622  53.001  1.00 35.99           C  
+ATOM   2774  CG  ASN B 539      -5.560  27.571  53.873  1.00 38.65           C  
+ATOM   2775  OD1 ASN B 539      -4.461  27.086  53.566  1.00 40.04           O  
+ATOM   2776  ND2 ASN B 539      -6.246  27.190  54.963  1.00 39.00           N  
+ATOM   2777  N   ASN B 540      -8.877  29.489  55.311  1.00 34.01           N  
+ATOM   2778  CA  ASN B 540     -10.213  29.149  55.808  1.00 34.78           C  
+ATOM   2779  C   ASN B 540     -10.744  27.728  55.539  1.00 32.59           C  
+ATOM   2780  O   ASN B 540     -11.890  27.533  55.146  1.00 33.15           O  
+ATOM   2781  CB  ASN B 540     -11.235  30.225  55.394  1.00 38.41           C  
+ATOM   2782  CG  ASN B 540     -11.623  31.146  56.570  1.00 41.06           C  
+ATOM   2783  OD1 ASN B 540     -10.752  31.716  57.248  1.00 42.46           O  
+ATOM   2784  ND2 ASN B 540     -12.931  31.263  56.837  1.00 42.07           N  
+ATOM   2785  N   SER B 541      -9.934  26.741  55.884  1.00 29.11           N  
+ATOM   2786  CA  SER B 541     -10.267  25.349  55.676  1.00 26.26           C  
+ATOM   2787  C   SER B 541     -10.792  24.648  56.919  1.00 24.42           C  
+ATOM   2788  O   SER B 541     -11.088  23.460  56.847  1.00 24.37           O  
+ATOM   2789  CB  SER B 541      -9.014  24.603  55.202  1.00 27.33           C  
+ATOM   2790  OG  SER B 541      -7.904  24.819  56.084  1.00 28.76           O  
+ATOM   2791  N   ASP B 542     -10.835  25.346  58.058  1.00 21.69           N  
+ATOM   2792  CA  ASP B 542     -11.289  24.745  59.322  1.00 20.28           C  
+ATOM   2793  C   ASP B 542     -12.075  25.780  60.126  1.00 20.58           C  
+ATOM   2794  O   ASP B 542     -11.529  26.487  60.997  1.00 20.10           O  
+ATOM   2795  CB  ASP B 542     -10.085  24.238  60.155  1.00 19.19           C  
+ATOM   2796  CG  ASP B 542     -10.507  23.354  61.336  1.00 18.81           C  
+ATOM   2797  OD1 ASP B 542     -11.668  23.468  61.800  1.00 18.76           O  
+ATOM   2798  OD2 ASP B 542      -9.677  22.541  61.799  1.00 17.51           O  
+ATOM   2799  N   PRO B 543     -13.384  25.858  59.870  1.00 20.18           N  
+ATOM   2800  CA  PRO B 543     -14.262  26.806  60.559  1.00 18.95           C  
+ATOM   2801  C   PRO B 543     -14.278  26.650  62.078  1.00 17.86           C  
+ATOM   2802  O   PRO B 543     -14.426  27.643  62.796  1.00 17.77           O  
+ATOM   2803  CB  PRO B 543     -15.630  26.563  59.907  1.00 20.68           C  
+ATOM   2804  CG  PRO B 543     -15.549  25.141  59.423  1.00 22.15           C  
+ATOM   2805  CD  PRO B 543     -14.126  24.992  58.930  1.00 21.42           C  
+ATOM   2806  N   THR B 544     -14.085  25.435  62.579  1.00 16.90           N  
+ATOM   2807  CA  THR B 544     -14.080  25.233  64.027  1.00 16.81           C  
+ATOM   2808  C   THR B 544     -12.856  25.911  64.633  1.00 15.30           C  
+ATOM   2809  O   THR B 544     -12.952  26.539  65.686  1.00 14.64           O  
+ATOM   2810  CB  THR B 544     -14.055  23.764  64.395  1.00 18.44           C  
+ATOM   2811  OG1 THR B 544     -15.117  23.094  63.710  1.00 21.32           O  
+ATOM   2812  CG2 THR B 544     -14.243  23.590  65.918  1.00 18.61           C  
+ATOM   2813  N   TYR B 545     -11.715  25.784  63.952  1.00 13.89           N  
+ATOM   2814  CA  TYR B 545     -10.473  26.415  64.404  1.00 13.17           C  
+ATOM   2815  C   TYR B 545     -10.724  27.927  64.635  1.00 13.84           C  
+ATOM   2816  O   TYR B 545     -10.448  28.464  65.715  1.00 13.05           O  
+ATOM   2817  CB  TYR B 545      -9.374  26.207  63.354  1.00 12.36           C  
+ATOM   2818  CG  TYR B 545      -8.039  26.777  63.739  1.00 11.78           C  
+ATOM   2819  CD1 TYR B 545      -7.126  26.017  64.458  1.00 12.10           C  
+ATOM   2820  CD2 TYR B 545      -7.700  28.078  63.407  1.00 11.46           C  
+ATOM   2821  CE1 TYR B 545      -5.906  26.542  64.852  1.00 12.58           C  
+ATOM   2822  CE2 TYR B 545      -6.488  28.612  63.782  1.00 12.30           C  
+ATOM   2823  CZ  TYR B 545      -5.596  27.843  64.514  1.00 12.47           C  
+ATOM   2824  OH  TYR B 545      -4.421  28.393  64.980  1.00 13.17           O  
+ATOM   2825  N   ASN B 546     -11.306  28.590  63.637  1.00 14.02           N  
+ATOM   2826  CA  ASN B 546     -11.576  30.021  63.725  1.00 14.83           C  
+ATOM   2827  C   ASN B 546     -12.537  30.404  64.826  1.00 14.45           C  
+ATOM   2828  O   ASN B 546     -12.362  31.448  65.475  1.00 14.54           O  
+ATOM   2829  CB  ASN B 546     -12.152  30.556  62.413  1.00 16.88           C  
+ATOM   2830  CG  ASN B 546     -11.111  30.700  61.323  1.00 19.84           C  
+ATOM   2831  OD1 ASN B 546     -10.162  29.924  61.244  1.00 21.24           O  
+ATOM   2832  ND2 ASN B 546     -11.298  31.691  60.455  1.00 21.17           N  
+ATOM   2833  N   SER B 547     -13.576  29.609  65.038  1.00 14.71           N  
+ATOM   2834  CA  SER B 547     -14.528  30.017  66.070  1.00 16.25           C  
+ATOM   2835  C   SER B 547     -13.994  29.936  67.504  1.00 14.53           C  
+ATOM   2836  O   SER B 547     -14.283  30.811  68.310  1.00 14.51           O  
+ATOM   2837  CB  SER B 547     -15.873  29.328  65.917  1.00 20.24           C  
+ATOM   2838  OG  SER B 547     -15.771  27.954  66.169  1.00 25.46           O  
+ATOM   2839  N   ILE B 548     -13.124  28.958  67.773  1.00 13.39           N  
+ATOM   2840  CA  ILE B 548     -12.511  28.821  69.102  1.00 13.57           C  
+ATOM   2841  C   ILE B 548     -11.490  29.964  69.283  1.00 12.60           C  
+ATOM   2842  O   ILE B 548     -11.486  30.649  70.299  1.00 12.28           O  
+ATOM   2843  CB  ILE B 548     -11.860  27.419  69.269  1.00 14.10           C  
+ATOM   2844  CG1 ILE B 548     -12.949  26.354  69.360  1.00 16.45           C  
+ATOM   2845  CG2 ILE B 548     -10.973  27.356  70.495  1.00 14.34           C  
+ATOM   2846  CD1 ILE B 548     -12.404  24.942  69.294  1.00 18.07           C  
+ATOM   2847  N   LEU B 549     -10.677  30.201  68.249  1.00 12.20           N  
+ATOM   2848  CA  LEU B 549      -9.655  31.258  68.240  1.00 11.29           C  
+ATOM   2849  C   LEU B 549     -10.229  32.614  68.587  1.00 11.08           C  
+ATOM   2850  O   LEU B 549      -9.733  33.275  69.499  1.00 12.34           O  
+ATOM   2851  CB  LEU B 549      -8.969  31.340  66.847  1.00 11.37           C  
+ATOM   2852  CG  LEU B 549      -7.936  32.465  66.583  1.00 12.11           C  
+ATOM   2853  CD1 LEU B 549      -6.718  32.351  67.545  1.00 12.34           C  
+ATOM   2854  CD2 LEU B 549      -7.472  32.403  65.127  1.00 10.94           C  
+ATOM   2855  N   GLN B 550     -11.313  33.005  67.905  1.00 11.40           N  
+ATOM   2856  CA  GLN B 550     -11.904  34.336  68.122  1.00 12.26           C  
+ATOM   2857  C   GLN B 550     -12.632  34.511  69.454  1.00 12.99           C  
+ATOM   2858  O   GLN B 550     -12.853  35.624  69.928  1.00 13.63           O  
+ATOM   2859  CB  GLN B 550     -12.830  34.721  66.950  1.00 11.53           C  
+ATOM   2860  CG  GLN B 550     -14.103  33.905  66.851  1.00 13.51           C  
+ATOM   2861  CD  GLN B 550     -14.877  34.133  65.538  1.00 14.34           C  
+ATOM   2862  OE1 GLN B 550     -14.377  34.741  64.598  1.00 14.73           O  
+ATOM   2863  NE2 GLN B 550     -16.082  33.603  65.469  1.00 13.65           N  
+ATOM   2864  N   ARG B 551     -12.946  33.384  70.066  1.00 14.27           N  
+ATOM   2865  CA  ARG B 551     -13.673  33.355  71.317  1.00 15.63           C  
+ATOM   2866  C   ARG B 551     -12.839  33.276  72.615  1.00 13.74           C  
+ATOM   2867  O   ARG B 551     -13.121  33.968  73.587  1.00 12.92           O  
+ATOM   2868  CB  ARG B 551     -14.585  32.131  71.264  1.00 18.02           C  
+ATOM   2869  CG  ARG B 551     -15.848  32.272  72.048  1.00 23.47           C  
+ATOM   2870  CD  ARG B 551     -16.653  30.982  72.015  1.00 25.47           C  
+ATOM   2871  NE  ARG B 551     -15.916  29.913  72.676  1.00 27.78           N  
+ATOM   2872  CZ  ARG B 551     -15.831  28.679  72.202  1.00 28.83           C  
+ATOM   2873  NH1 ARG B 551     -16.440  28.378  71.058  1.00 28.88           N  
+ATOM   2874  NH2 ARG B 551     -15.180  27.741  72.883  1.00 29.71           N  
+ATOM   2875  N   GLU B 552     -11.833  32.416  72.625  1.00 12.53           N  
+ATOM   2876  CA  GLU B 552     -11.065  32.144  73.847  1.00 12.14           C  
+ATOM   2877  C   GLU B 552      -9.830  32.951  74.191  1.00 13.21           C  
+ATOM   2878  O   GLU B 552      -9.421  32.979  75.362  1.00 13.19           O  
+ATOM   2879  CB  GLU B 552     -10.662  30.665  73.888  1.00 13.36           C  
+ATOM   2880  CG  GLU B 552     -11.797  29.648  73.798  1.00 15.35           C  
+ATOM   2881  CD  GLU B 552     -12.562  29.482  75.111  1.00 17.31           C  
+ATOM   2882  OE1 GLU B 552     -11.996  29.771  76.196  1.00 16.92           O  
+ATOM   2883  OE2 GLU B 552     -13.744  29.071  75.042  1.00 19.91           O  
+ATOM   2884  N   PHE B 553      -9.232  33.608  73.195  1.00 12.38           N  
+ATOM   2885  CA  PHE B 553      -7.974  34.337  73.414  1.00 11.49           C  
+ATOM   2886  C   PHE B 553      -7.987  35.856  73.301  1.00 11.64           C  
+ATOM   2887  O   PHE B 553      -8.808  36.435  72.568  1.00 11.89           O  
+ATOM   2888  CB  PHE B 553      -6.927  33.762  72.474  1.00 11.66           C  
+ATOM   2889  CG  PHE B 553      -6.784  32.283  72.597  1.00 11.81           C  
+ATOM   2890  CD1 PHE B 553      -6.033  31.741  73.638  1.00 11.96           C  
+ATOM   2891  CD2 PHE B 553      -7.466  31.421  71.730  1.00 12.24           C  
+ATOM   2892  CE1 PHE B 553      -5.960  30.352  73.827  1.00 12.42           C  
+ATOM   2893  CE2 PHE B 553      -7.403  30.026  71.914  1.00 13.25           C  
+ATOM   2894  CZ  PHE B 553      -6.644  29.497  72.971  1.00 12.69           C  
+ATOM   2895  N   SER B 554      -7.073  36.497  74.023  1.00 10.11           N  
+ATOM   2896  CA  SER B 554      -6.981  37.943  73.970  1.00 10.94           C  
+ATOM   2897  C   SER B 554      -5.690  38.406  73.288  1.00 10.22           C  
+ATOM   2898  O   SER B 554      -5.438  39.596  73.208  1.00 10.74           O  
+ATOM   2899  CB  SER B 554      -7.118  38.550  75.382  1.00 12.22           C  
+ATOM   2900  OG  SER B 554      -6.208  37.951  76.292  1.00 13.10           O  
+ATOM   2901  N   MET B 555      -4.909  37.467  72.764  1.00 10.01           N  
+ATOM   2902  CA  MET B 555      -3.636  37.804  72.113  1.00 10.06           C  
+ATOM   2903  C   MET B 555      -3.291  36.748  71.063  1.00  9.95           C  
+ATOM   2904  O   MET B 555      -3.576  35.567  71.239  1.00  9.76           O  
+ATOM   2905  CB  MET B 555      -2.526  37.882  73.162  1.00 10.43           C  
+ATOM   2906  CG  MET B 555      -1.166  38.266  72.622  1.00 11.85           C  
+ATOM   2907  SD  MET B 555       0.055  38.483  73.930  1.00 13.08           S  
+ATOM   2908  CE  MET B 555      -0.013  40.126  74.164  1.00 12.92           C  
+ATOM   2909  N   VAL B 556      -2.768  37.200  69.926  1.00  8.47           N  
+ATOM   2910  CA  VAL B 556      -2.363  36.316  68.843  1.00  9.25           C  
+ATOM   2911  C   VAL B 556      -0.925  36.658  68.374  1.00  9.32           C  
+ATOM   2912  O   VAL B 556      -0.420  37.768  68.612  1.00  9.93           O  
+ATOM   2913  CB  VAL B 556      -3.314  36.399  67.600  1.00 10.90           C  
+ATOM   2914  CG1 VAL B 556      -4.637  35.710  67.890  1.00 12.49           C  
+ATOM   2915  CG2 VAL B 556      -3.535  37.866  67.174  1.00 11.45           C  
+ATOM   2916  N   VAL B 557      -0.285  35.691  67.722  1.00  9.40           N  
+ATOM   2917  CA  VAL B 557       1.076  35.821  67.204  1.00 10.46           C  
+ATOM   2918  C   VAL B 557       1.117  35.026  65.891  1.00 10.79           C  
+ATOM   2919  O   VAL B 557       0.472  33.995  65.774  1.00  9.49           O  
+ATOM   2920  CB  VAL B 557       2.107  35.140  68.156  1.00 10.96           C  
+ATOM   2921  CG1 VAL B 557       3.560  35.527  67.742  1.00 11.24           C  
+ATOM   2922  CG2 VAL B 557       1.824  35.487  69.575  1.00 13.25           C  
+ATOM   2923  N   CYS B 558       1.885  35.494  64.910  1.00 11.82           N  
+ATOM   2924  CA  CYS B 558       2.032  34.781  63.627  1.00 13.00           C  
+ATOM   2925  C   CYS B 558       3.027  33.645  63.828  1.00 12.84           C  
+ATOM   2926  O   CYS B 558       4.154  33.871  64.251  1.00 13.31           O  
+ATOM   2927  CB  CYS B 558       2.636  35.705  62.560  1.00 14.60           C  
+ATOM   2928  SG  CYS B 558       1.548  36.926  61.859  1.00 20.47           S  
+ATOM   2929  N   GLU B 559       2.648  32.426  63.486  1.00 13.37           N  
+ATOM   2930  CA  GLU B 559       3.572  31.310  63.645  1.00 14.15           C  
+ATOM   2931  C   GLU B 559       4.805  31.412  62.718  1.00 14.08           C  
+ATOM   2932  O   GLU B 559       5.940  31.205  63.160  1.00 14.45           O  
+ATOM   2933  CB  GLU B 559       2.845  29.973  63.388  1.00 16.24           C  
+ATOM   2934  CG  GLU B 559       3.696  28.729  63.771  1.00 18.01           C  
+ATOM   2935  CD  GLU B 559       3.053  27.406  63.371  1.00 19.86           C  
+ATOM   2936  OE1 GLU B 559       1.914  27.422  62.847  1.00 20.95           O  
+ATOM   2937  OE2 GLU B 559       3.699  26.355  63.553  1.00 20.80           O  
+ATOM   2938  N   ASN B 560       4.577  31.821  61.467  1.00 14.12           N  
+ATOM   2939  CA  ASN B 560       5.644  31.880  60.458  1.00 14.73           C  
+ATOM   2940  C   ASN B 560       5.604  33.063  59.516  1.00 15.16           C  
+ATOM   2941  O   ASN B 560       6.581  33.331  58.817  1.00 15.53           O  
+ATOM   2942  CB  ASN B 560       5.482  30.697  59.486  1.00 18.06           C  
+ATOM   2943  CG  ASN B 560       5.708  29.359  60.128  1.00 20.15           C  
+ATOM   2944  OD1 ASN B 560       6.808  29.066  60.594  1.00 22.68           O  
+ATOM   2945  ND2 ASN B 560       4.674  28.517  60.134  1.00 21.39           N  
+ATOM   2946  N   GLU B 561       4.460  33.720  59.436  1.00 14.16           N  
+ATOM   2947  CA  GLU B 561       4.251  34.790  58.472  1.00 15.25           C  
+ATOM   2948  C   GLU B 561       4.968  36.116  58.669  1.00 14.54           C  
+ATOM   2949  O   GLU B 561       4.843  37.015  57.826  1.00 14.50           O  
+ATOM   2950  CB  GLU B 561       2.741  35.022  58.285  1.00 18.09           C  
+ATOM   2951  CG  GLU B 561       1.944  33.776  57.826  1.00 22.17           C  
+ATOM   2952  CD  GLU B 561       1.848  32.629  58.884  1.00 25.43           C  
+ATOM   2953  OE1 GLU B 561       2.054  32.868  60.119  1.00 24.90           O  
+ATOM   2954  OE2 GLU B 561       1.552  31.469  58.455  1.00 27.43           O  
+ATOM   2955  N   MET B 562       5.605  36.295  59.823  1.00 13.22           N  
+ATOM   2956  CA  MET B 562       6.331  37.531  60.099  1.00 12.76           C  
+ATOM   2957  C   MET B 562       7.826  37.273  60.310  1.00 12.32           C  
+ATOM   2958  O   MET B 562       8.553  38.139  60.835  1.00 12.93           O  
+ATOM   2959  CB  MET B 562       5.694  38.338  61.240  1.00 14.10           C  
+ATOM   2960  CG  MET B 562       4.468  39.090  60.774  1.00 16.38           C  
+ATOM   2961  SD  MET B 562       3.634  40.076  62.003  1.00 21.73           S  
+ATOM   2962  CE  MET B 562       4.774  40.161  63.216  1.00 21.55           C  
+ATOM   2963  N   LYS B 563       8.286  36.092  59.874  1.00 11.06           N  
+ATOM   2964  CA  LYS B 563       9.704  35.788  59.912  1.00 11.74           C  
+ATOM   2965  C   LYS B 563      10.358  36.575  58.747  1.00 11.75           C  
+ATOM   2966  O   LYS B 563       9.656  37.021  57.842  1.00 11.81           O  
+ATOM   2967  CB  LYS B 563       9.935  34.291  59.791  1.00 13.77           C  
+ATOM   2968  CG  LYS B 563       9.915  33.706  61.175  1.00 17.63           C  
+ATOM   2969  CD  LYS B 563       9.609  32.258  61.163  1.00 20.97           C  
+ATOM   2970  CE  LYS B 563       9.216  31.875  62.600  1.00 23.47           C  
+ATOM   2971  NZ  LYS B 563       8.728  30.478  62.708  1.00 26.02           N  
+ATOM   2972  N   PHE B 564      11.679  36.700  58.755  1.00 11.12           N  
+ATOM   2973  CA  PHE B 564      12.421  37.472  57.747  1.00 11.52           C  
+ATOM   2974  C   PHE B 564      12.156  37.049  56.297  1.00 11.68           C  
+ATOM   2975  O   PHE B 564      11.898  37.920  55.440  1.00 12.27           O  
+ATOM   2976  CB  PHE B 564      13.919  37.430  58.054  1.00 10.62           C  
+ATOM   2977  CG  PHE B 564      14.709  38.570  57.454  1.00 10.64           C  
+ATOM   2978  CD1 PHE B 564      14.909  38.655  56.069  1.00 11.39           C  
+ATOM   2979  CD2 PHE B 564      15.313  39.517  58.283  1.00 11.17           C  
+ATOM   2980  CE1 PHE B 564      15.702  39.656  55.529  1.00 11.38           C  
+ATOM   2981  CE2 PHE B 564      16.115  40.529  57.752  1.00 11.49           C  
+ATOM   2982  CZ  PHE B 564      16.311  40.598  56.366  1.00 11.33           C  
+ATOM   2983  N   ASP B 565      12.218  35.755  56.014  1.00 11.55           N  
+ATOM   2984  CA  ASP B 565      11.968  35.244  54.659  1.00 12.73           C  
+ATOM   2985  C   ASP B 565      10.545  35.489  54.113  1.00 13.10           C  
+ATOM   2986  O   ASP B 565      10.365  35.649  52.913  1.00 15.50           O  
+ATOM   2987  CB  ASP B 565      12.366  33.753  54.538  1.00 14.97           C  
+ATOM   2988  CG  ASP B 565      11.423  32.776  55.309  1.00 16.45           C  
+ATOM   2989  OD1 ASP B 565      10.766  33.139  56.310  1.00 16.77           O  
+ATOM   2990  OD2 ASP B 565      11.370  31.604  54.897  1.00 19.43           O  
+ATOM   2991  N   ALA B 566       9.547  35.561  54.996  1.00 11.81           N  
+ATOM   2992  CA  ALA B 566       8.159  35.796  54.618  1.00 10.67           C  
+ATOM   2993  C   ALA B 566       7.906  37.292  54.388  1.00 10.01           C  
+ATOM   2994  O   ALA B 566       7.121  37.668  53.512  1.00 10.90           O  
+ATOM   2995  CB  ALA B 566       7.213  35.268  55.752  1.00 10.89           C  
+ATOM   2996  N   LEU B 567       8.529  38.140  55.208  1.00  8.45           N  
+ATOM   2997  CA  LEU B 567       8.330  39.591  55.111  1.00  9.12           C  
+ATOM   2998  C   LEU B 567       9.139  40.304  54.028  1.00  8.52           C  
+ATOM   2999  O   LEU B 567       8.656  41.300  53.493  1.00  8.71           O  
+ATOM   3000  CB  LEU B 567       8.548  40.295  56.465  1.00  9.88           C  
+ATOM   3001  CG  LEU B 567       7.349  40.360  57.410  1.00 12.51           C  
+ATOM   3002  CD1 LEU B 567       7.834  40.833  58.777  1.00 13.75           C  
+ATOM   3003  CD2 LEU B 567       6.291  41.317  56.872  1.00 14.56           C  
+ATOM   3004  N   GLN B 568      10.368  39.859  53.777  1.00  7.45           N  
+ATOM   3005  CA  GLN B 568      11.220  40.479  52.735  1.00  7.04           C  
+ATOM   3006  C   GLN B 568      11.800  39.332  51.909  1.00  6.71           C  
+ATOM   3007  O   GLN B 568      13.005  39.075  51.943  1.00  7.62           O  
+ATOM   3008  CB  GLN B 568      12.331  41.347  53.370  1.00  7.67           C  
+ATOM   3009  CG  GLN B 568      12.966  42.303  52.347  1.00  7.80           C  
+ATOM   3010  CD  GLN B 568      14.152  43.161  52.824  1.00  8.64           C  
+ATOM   3011  OE1 GLN B 568      14.828  43.778  51.998  1.00  9.16           O  
+ATOM   3012  NE2 GLN B 568      14.400  43.217  54.130  1.00  8.06           N  
+ATOM   3013  N   PRO B 569      10.960  38.662  51.087  1.00  6.84           N  
+ATOM   3014  CA  PRO B 569      11.409  37.523  50.275  1.00  7.43           C  
+ATOM   3015  C   PRO B 569      12.441  37.802  49.204  1.00  7.86           C  
+ATOM   3016  O   PRO B 569      13.167  36.915  48.783  1.00  9.41           O  
+ATOM   3017  CB  PRO B 569      10.110  36.933  49.742  1.00  8.23           C  
+ATOM   3018  CG  PRO B 569       9.247  38.107  49.620  1.00  9.59           C  
+ATOM   3019  CD  PRO B 569       9.541  38.964  50.846  1.00  7.95           C  
+ATOM   3020  N   ARG B 570      12.468  39.040  48.737  1.00  8.43           N  
+ATOM   3021  CA  ARG B 570      13.453  39.494  47.755  1.00  8.17           C  
+ATOM   3022  C   ARG B 570      13.958  40.818  48.329  1.00  6.99           C  
+ATOM   3023  O   ARG B 570      13.230  41.501  49.043  1.00  7.01           O  
+ATOM   3024  CB  ARG B 570      12.807  39.684  46.374  1.00  9.96           C  
+ATOM   3025  CG  ARG B 570      12.437  38.338  45.710  1.00 12.31           C  
+ATOM   3026  CD  ARG B 570      11.778  38.518  44.346  1.00 17.09           C  
+ATOM   3027  NE  ARG B 570      12.655  39.227  43.423  1.00 20.57           N  
+ATOM   3028  CZ  ARG B 570      12.301  40.311  42.736  1.00 21.54           C  
+ATOM   3029  NH1 ARG B 570      11.081  40.827  42.842  1.00 22.34           N  
+ATOM   3030  NH2 ARG B 570      13.190  40.872  41.952  1.00 23.62           N  
+ATOM   3031  N   GLN B 571      15.192  41.196  48.013  1.00  8.40           N  
+ATOM   3032  CA  GLN B 571      15.737  42.421  48.565  1.00  8.87           C  
+ATOM   3033  C   GLN B 571      14.886  43.660  48.234  1.00  9.46           C  
+ATOM   3034  O   GLN B 571      14.588  43.945  47.082  1.00  9.78           O  
+ATOM   3035  CB  GLN B 571      17.213  42.610  48.190  1.00 10.77           C  
+ATOM   3036  CG  GLN B 571      17.843  43.731  49.034  1.00 12.60           C  
+ATOM   3037  CD  GLN B 571      19.333  43.820  48.908  1.00 14.97           C  
+ATOM   3038  OE1 GLN B 571      19.949  43.108  48.114  1.00 16.06           O  
+ATOM   3039  NE2 GLN B 571      19.932  44.711  49.692  1.00 16.52           N  
+ATOM   3040  N   ASN B 572      14.463  44.349  49.282  1.00  8.71           N  
+ATOM   3041  CA  ASN B 572      13.599  45.517  49.214  1.00 10.61           C  
+ATOM   3042  C   ASN B 572      12.204  45.345  48.679  1.00 10.21           C  
+ATOM   3043  O   ASN B 572      11.580  46.328  48.247  1.00 10.44           O  
+ATOM   3044  CB  ASN B 572      14.263  46.736  48.605  1.00 13.96           C  
+ATOM   3045  CG  ASN B 572      14.777  47.635  49.666  1.00 18.48           C  
+ATOM   3046  OD1 ASN B 572      13.999  48.267  50.476  1.00 17.05           O  
+ATOM   3047  ND2 ASN B 572      16.092  47.598  49.805  1.00 20.45           N  
+ATOM   3048  N   VAL B 573      11.710  44.103  48.733  1.00  8.14           N  
+ATOM   3049  CA  VAL B 573      10.345  43.789  48.355  1.00  8.34           C  
+ATOM   3050  C   VAL B 573       9.712  43.275  49.674  1.00  8.90           C  
+ATOM   3051  O   VAL B 573      10.162  42.252  50.220  1.00 10.21           O  
+ATOM   3052  CB  VAL B 573      10.286  42.725  47.262  1.00  8.79           C  
+ATOM   3053  CG1 VAL B 573       8.842  42.353  46.995  1.00  9.66           C  
+ATOM   3054  CG2 VAL B 573      10.942  43.267  45.982  1.00  9.16           C  
+ATOM   3055  N   PHE B 574       8.736  44.006  50.205  1.00  7.99           N  
+ATOM   3056  CA  PHE B 574       8.078  43.659  51.493  1.00  6.77           C  
+ATOM   3057  C   PHE B 574       6.664  43.132  51.313  1.00  7.99           C  
+ATOM   3058  O   PHE B 574       5.846  43.745  50.636  1.00 10.09           O  
+ATOM   3059  CB  PHE B 574       8.070  44.878  52.422  1.00  7.32           C  
+ATOM   3060  CG  PHE B 574       9.440  45.270  52.920  1.00  7.71           C  
+ATOM   3061  CD1 PHE B 574      10.249  46.123  52.170  1.00  8.33           C  
+ATOM   3062  CD2 PHE B 574       9.933  44.754  54.126  1.00  8.83           C  
+ATOM   3063  CE1 PHE B 574      11.550  46.477  52.589  1.00  8.99           C  
+ATOM   3064  CE2 PHE B 574      11.232  45.083  54.579  1.00  9.25           C  
+ATOM   3065  CZ  PHE B 574      12.060  45.960  53.800  1.00  9.67           C  
+ATOM   3066  N   ASP B 575       6.364  41.984  51.898  1.00  7.27           N  
+ATOM   3067  CA  ASP B 575       5.046  41.391  51.762  1.00  7.41           C  
+ATOM   3068  C   ASP B 575       4.323  41.467  53.118  1.00  8.04           C  
+ATOM   3069  O   ASP B 575       4.613  40.664  54.011  1.00  8.93           O  
+ATOM   3070  CB  ASP B 575       5.204  39.935  51.308  1.00  8.17           C  
+ATOM   3071  CG  ASP B 575       3.875  39.256  51.045  1.00  8.54           C  
+ATOM   3072  OD1 ASP B 575       2.824  39.801  51.413  1.00  9.09           O  
+ATOM   3073  OD2 ASP B 575       3.891  38.159  50.463  1.00 11.68           O  
+ATOM   3074  N   PHE B 576       3.390  42.406  53.259  1.00  7.44           N  
+ATOM   3075  CA  PHE B 576       2.646  42.581  54.501  1.00  7.81           C  
+ATOM   3076  C   PHE B 576       1.264  41.928  54.434  1.00  9.90           C  
+ATOM   3077  O   PHE B 576       0.487  42.032  55.381  1.00 10.71           O  
+ATOM   3078  CB  PHE B 576       2.434  44.076  54.772  1.00  8.64           C  
+ATOM   3079  CG  PHE B 576       3.718  44.856  54.952  1.00 10.17           C  
+ATOM   3080  CD1 PHE B 576       4.638  44.507  55.958  1.00 11.36           C  
+ATOM   3081  CD2 PHE B 576       3.997  45.964  54.144  1.00 11.08           C  
+ATOM   3082  CE1 PHE B 576       5.829  45.259  56.155  1.00 12.42           C  
+ATOM   3083  CE2 PHE B 576       5.180  46.721  54.337  1.00 12.19           C  
+ATOM   3084  CZ  PHE B 576       6.095  46.364  55.343  1.00 11.83           C  
+ATOM   3085  N   SER B 577       0.969  41.214  53.359  1.00  9.74           N  
+ATOM   3086  CA  SER B 577      -0.359  40.662  53.194  1.00 10.63           C  
+ATOM   3087  C   SER B 577      -0.943  39.814  54.338  1.00 11.47           C  
+ATOM   3088  O   SER B 577      -2.049  40.109  54.818  1.00 13.05           O  
+ATOM   3089  CB  SER B 577      -0.484  39.954  51.843  1.00 11.30           C  
+ATOM   3090  OG  SER B 577       0.321  38.793  51.767  1.00 14.01           O  
+ATOM   3091  N   LYS B 578      -0.216  38.783  54.764  1.00 11.88           N  
+ATOM   3092  CA  LYS B 578      -0.707  37.894  55.824  1.00 11.46           C  
+ATOM   3093  C   LYS B 578      -0.687  38.548  57.179  1.00 11.71           C  
+ATOM   3094  O   LYS B 578      -1.656  38.438  57.940  1.00 11.54           O  
+ATOM   3095  CB  LYS B 578       0.067  36.588  55.810  1.00 14.38           C  
+ATOM   3096  CG  LYS B 578      -0.262  35.755  54.558  1.00 17.98           C  
+ATOM   3097  CD  LYS B 578       0.303  34.338  54.636  1.00 22.93           C  
+ATOM   3098  CE  LYS B 578       0.232  33.567  53.281  1.00 26.31           C  
+ATOM   3099  NZ  LYS B 578       1.154  32.333  53.220  1.00 28.72           N  
+ATOM   3100  N   GLY B 579       0.365  39.309  57.469  1.00  9.63           N  
+ATOM   3101  CA  GLY B 579       0.427  39.986  58.751  1.00 10.41           C  
+ATOM   3102  C   GLY B 579      -0.703  40.993  58.913  1.00 10.41           C  
+ATOM   3103  O   GLY B 579      -1.264  41.143  59.997  1.00 11.53           O  
+ATOM   3104  N   ASP B 580      -1.014  41.738  57.851  1.00  9.62           N  
+ATOM   3105  CA  ASP B 580      -2.084  42.742  57.908  1.00  9.52           C  
+ATOM   3106  C   ASP B 580      -3.462  42.061  58.028  1.00  8.94           C  
+ATOM   3107  O   ASP B 580      -4.379  42.627  58.619  1.00 10.29           O  
+ATOM   3108  CB  ASP B 580      -2.034  43.661  56.679  1.00 10.90           C  
+ATOM   3109  CG  ASP B 580      -0.930  44.722  56.760  1.00 12.19           C  
+ATOM   3110  OD1 ASP B 580      -0.092  44.715  57.671  1.00 12.06           O  
+ATOM   3111  OD2 ASP B 580      -0.908  45.591  55.866  1.00 14.11           O  
+ATOM   3112  N   GLN B 581      -3.583  40.858  57.469  1.00  9.79           N  
+ATOM   3113  CA  GLN B 581      -4.826  40.093  57.558  1.00 11.60           C  
+ATOM   3114  C   GLN B 581      -5.055  39.674  59.029  1.00 10.85           C  
+ATOM   3115  O   GLN B 581      -6.171  39.828  59.557  1.00 10.57           O  
+ATOM   3116  CB  GLN B 581      -4.735  38.863  56.681  1.00 14.32           C  
+ATOM   3117  CG  GLN B 581      -5.973  38.027  56.774  1.00 20.03           C  
+ATOM   3118  CD  GLN B 581      -5.952  36.833  55.852  1.00 22.59           C  
+ATOM   3119  OE1 GLN B 581      -5.033  36.672  55.031  1.00 25.07           O  
+ATOM   3120  NE2 GLN B 581      -6.973  35.971  55.979  1.00 24.78           N  
+ATOM   3121  N   LEU B 582      -3.999  39.188  59.688  1.00  9.78           N  
+ATOM   3122  CA  LEU B 582      -4.127  38.808  61.096  1.00 10.85           C  
+ATOM   3123  C   LEU B 582      -4.407  40.028  61.970  1.00 10.87           C  
+ATOM   3124  O   LEU B 582      -5.257  39.979  62.868  1.00 10.16           O  
+ATOM   3125  CB  LEU B 582      -2.906  38.030  61.611  1.00 11.35           C  
+ATOM   3126  CG  LEU B 582      -3.056  37.500  63.053  1.00 11.80           C  
+ATOM   3127  CD1 LEU B 582      -4.244  36.573  63.182  1.00 12.94           C  
+ATOM   3128  CD2 LEU B 582      -1.809  36.733  63.432  1.00 13.21           C  
+ATOM   3129  N   LEU B 583      -3.749  41.148  61.690  1.00  9.95           N  
+ATOM   3130  CA  LEU B 583      -3.992  42.353  62.470  1.00 11.41           C  
+ATOM   3131  C   LEU B 583      -5.455  42.825  62.407  1.00 11.58           C  
+ATOM   3132  O   LEU B 583      -6.012  43.218  63.422  1.00 12.02           O  
+ATOM   3133  CB  LEU B 583      -3.036  43.488  62.065  1.00 12.50           C  
+ATOM   3134  CG  LEU B 583      -3.218  44.792  62.859  1.00 15.13           C  
+ATOM   3135  CD1 LEU B 583      -3.073  44.577  64.361  1.00 17.01           C  
+ATOM   3136  CD2 LEU B 583      -2.199  45.836  62.404  1.00 16.30           C  
+ATOM   3137  N   ALA B 584      -6.058  42.826  61.223  1.00 10.22           N  
+ATOM   3138  CA  ALA B 584      -7.444  43.257  61.084  1.00 10.59           C  
+ATOM   3139  C   ALA B 584      -8.355  42.357  61.926  1.00  9.92           C  
+ATOM   3140  O   ALA B 584      -9.291  42.849  62.563  1.00 10.24           O  
+ATOM   3141  CB  ALA B 584      -7.879  43.213  59.633  1.00 10.82           C  
+ATOM   3142  N   PHE B 585      -8.091  41.049  61.886  1.00  9.55           N  
+ATOM   3143  CA  PHE B 585      -8.855  40.065  62.666  1.00 10.43           C  
+ATOM   3144  C   PHE B 585      -8.709  40.367  64.174  1.00 10.92           C  
+ATOM   3145  O   PHE B 585      -9.720  40.415  64.901  1.00 10.36           O  
+ATOM   3146  CB  PHE B 585      -8.371  38.657  62.318  1.00 10.60           C  
+ATOM   3147  CG  PHE B 585      -8.915  37.569  63.208  1.00 11.63           C  
+ATOM   3148  CD1 PHE B 585     -10.128  36.952  62.926  1.00 12.20           C  
+ATOM   3149  CD2 PHE B 585      -8.183  37.122  64.306  1.00 13.33           C  
+ATOM   3150  CE1 PHE B 585     -10.609  35.897  63.733  1.00 12.06           C  
+ATOM   3151  CE2 PHE B 585      -8.668  36.065  65.111  1.00 12.97           C  
+ATOM   3152  CZ  PHE B 585      -9.874  35.473  64.810  1.00 11.81           C  
+ATOM   3153  N   ALA B 586      -7.467  40.631  64.620  1.00 10.74           N  
+ATOM   3154  CA  ALA B 586      -7.161  40.952  66.032  1.00 11.28           C  
+ATOM   3155  C   ALA B 586      -7.943  42.190  66.455  1.00 12.87           C  
+ATOM   3156  O   ALA B 586      -8.618  42.198  67.494  1.00 12.68           O  
+ATOM   3157  CB  ALA B 586      -5.675  41.195  66.227  1.00 10.15           C  
+ATOM   3158  N   GLU B 587      -7.955  43.193  65.588  1.00 13.10           N  
+ATOM   3159  CA  GLU B 587      -8.655  44.411  65.884  1.00 15.27           C  
+ATOM   3160  C   GLU B 587     -10.167  44.269  66.008  1.00 14.49           C  
+ATOM   3161  O   GLU B 587     -10.742  44.837  66.924  1.00 15.69           O  
+ATOM   3162  CB  GLU B 587      -8.245  45.495  64.893  1.00 19.03           C  
+ATOM   3163  CG  GLU B 587      -6.757  45.847  65.079  1.00 24.09           C  
+ATOM   3164  CD  GLU B 587      -6.309  47.080  64.310  1.00 27.46           C  
+ATOM   3165  OE1 GLU B 587      -6.821  47.329  63.191  1.00 29.14           O  
+ATOM   3166  OE2 GLU B 587      -5.407  47.781  64.827  1.00 30.35           O  
+ATOM   3167  N   ARG B 588     -10.829  43.502  65.151  1.00 13.75           N  
+ATOM   3168  CA  ARG B 588     -12.291  43.382  65.310  1.00 15.26           C  
+ATOM   3169  C   ARG B 588     -12.698  42.413  66.457  1.00 14.57           C  
+ATOM   3170  O   ARG B 588     -13.887  42.309  66.814  1.00 13.80           O  
+ATOM   3171  CB  ARG B 588     -12.978  43.011  63.975  1.00 17.60           C  
+ATOM   3172  CG  ARG B 588     -13.005  41.557  63.616  1.00 19.93           C  
+ATOM   3173  CD  ARG B 588     -13.743  41.335  62.278  1.00 23.51           C  
+ATOM   3174  NE  ARG B 588     -12.777  41.482  61.201  1.00 27.19           N  
+ATOM   3175  CZ  ARG B 588     -12.258  40.475  60.494  1.00 27.07           C  
+ATOM   3176  NH1 ARG B 588     -12.650  39.225  60.691  1.00 27.91           N  
+ATOM   3177  NH2 ARG B 588     -11.164  40.685  59.781  1.00 27.30           N  
+ATOM   3178  N   ASN B 589     -11.705  41.730  67.042  1.00 13.38           N  
+ATOM   3179  CA  ASN B 589     -11.946  40.795  68.147  1.00 12.25           C  
+ATOM   3180  C   ASN B 589     -11.363  41.226  69.480  1.00 12.64           C  
+ATOM   3181  O   ASN B 589     -11.353  40.456  70.436  1.00 13.35           O  
+ATOM   3182  CB  ASN B 589     -11.505  39.389  67.768  1.00 11.07           C  
+ATOM   3183  CG  ASN B 589     -12.458  38.761  66.796  1.00 12.80           C  
+ATOM   3184  OD1 ASN B 589     -13.597  38.486  67.156  1.00 14.86           O  
+ATOM   3185  ND2 ASN B 589     -12.041  38.599  65.539  1.00 12.82           N  
+ATOM   3186  N   GLY B 590     -10.959  42.489  69.552  1.00 12.24           N  
+ATOM   3187  CA  GLY B 590     -10.402  43.037  70.769  1.00 13.06           C  
+ATOM   3188  C   GLY B 590      -9.165  42.323  71.280  1.00 14.24           C  
+ATOM   3189  O   GLY B 590      -8.971  42.228  72.499  1.00 16.23           O  
+ATOM   3190  N   MET B 591      -8.317  41.850  70.370  1.00 12.92           N  
+ATOM   3191  CA  MET B 591      -7.096  41.155  70.737  1.00 12.23           C  
+ATOM   3192  C   MET B 591      -5.851  42.000  70.511  1.00 12.53           C  
+ATOM   3193  O   MET B 591      -5.845  42.905  69.680  1.00 13.18           O  
+ATOM   3194  CB  MET B 591      -6.951  39.900  69.896  1.00 13.10           C  
+ATOM   3195  CG  MET B 591      -8.140  38.974  69.927  1.00 13.60           C  
+ATOM   3196  SD  MET B 591      -7.858  37.701  68.741  1.00 17.58           S  
+ATOM   3197  CE  MET B 591      -9.104  36.592  69.158  1.00 18.39           C  
+ATOM   3198  N   GLN B 592      -4.795  41.684  71.251  1.00 12.34           N  
+ATOM   3199  CA  GLN B 592      -3.506  42.340  71.095  1.00 13.25           C  
+ATOM   3200  C   GLN B 592      -2.660  41.381  70.277  1.00 12.33           C  
+ATOM   3201  O   GLN B 592      -3.027  40.226  70.102  1.00 11.66           O  
+ATOM   3202  CB  GLN B 592      -2.848  42.633  72.445  1.00 15.63           C  
+ATOM   3203  CG  GLN B 592      -3.569  43.731  73.231  1.00 19.61           C  
+ATOM   3204  CD  GLN B 592      -2.866  44.121  74.522  1.00 23.55           C  
+ATOM   3205  OE1 GLN B 592      -2.036  43.369  75.062  1.00 26.20           O  
+ATOM   3206  NE2 GLN B 592      -3.182  45.312  75.021  1.00 25.51           N  
+ATOM   3207  N   MET B 593      -1.548  41.879  69.743  1.00 12.73           N  
+ATOM   3208  CA  MET B 593      -0.678  41.082  68.892  1.00 13.26           C  
+ATOM   3209  C   MET B 593       0.787  41.200  69.262  1.00 11.84           C  
+ATOM   3210  O   MET B 593       1.217  42.265  69.673  1.00 13.73           O  
+ATOM   3211  CB  MET B 593      -0.876  41.574  67.445  1.00 15.33           C  
+ATOM   3212  CG  MET B 593      -0.193  40.760  66.367  1.00 18.86           C  
+ATOM   3213  SD  MET B 593      -0.944  41.203  64.777  1.00 21.56           S  
+ATOM   3214  CE  MET B 593       0.054  40.297  63.672  1.00 23.32           C  
+ATOM   3215  N   ARG B 594       1.526  40.091  69.192  1.00 10.21           N  
+ATOM   3216  CA  ARG B 594       2.981  40.114  69.413  1.00 10.05           C  
+ATOM   3217  C   ARG B 594       3.608  39.971  68.005  1.00 10.64           C  
+ATOM   3218  O   ARG B 594       3.061  39.263  67.153  1.00 11.00           O  
+ATOM   3219  CB  ARG B 594       3.468  38.924  70.269  1.00 10.64           C  
+ATOM   3220  CG  ARG B 594       2.907  38.829  71.701  1.00  9.93           C  
+ATOM   3221  CD  ARG B 594       3.654  37.749  72.492  1.00  9.45           C  
+ATOM   3222  NE  ARG B 594       4.915  38.253  73.044  1.00  9.36           N  
+ATOM   3223  CZ  ARG B 594       6.136  37.919  72.616  1.00  9.01           C  
+ATOM   3224  NH1 ARG B 594       6.313  37.046  71.612  1.00  8.26           N  
+ATOM   3225  NH2 ARG B 594       7.204  38.532  73.149  1.00 10.25           N  
+ATOM   3226  N   GLY B 595       4.760  40.610  67.784  1.00  8.77           N  
+ATOM   3227  CA  GLY B 595       5.445  40.517  66.503  1.00  8.49           C  
+ATOM   3228  C   GLY B 595       6.554  39.488  66.648  1.00  8.79           C  
+ATOM   3229  O   GLY B 595       7.393  39.586  67.532  1.00 10.49           O  
+ATOM   3230  N   HIS B 596       6.600  38.516  65.762  1.00  9.22           N  
+ATOM   3231  CA  HIS B 596       7.590  37.453  65.843  1.00  9.60           C  
+ATOM   3232  C   HIS B 596       8.020  37.154  64.396  1.00  9.76           C  
+ATOM   3233  O   HIS B 596       7.191  36.683  63.601  1.00 10.71           O  
+ATOM   3234  CB  HIS B 596       6.889  36.233  66.489  1.00 10.63           C  
+ATOM   3235  CG  HIS B 596       7.743  35.013  66.588  1.00 11.00           C  
+ATOM   3236  ND1 HIS B 596       8.725  34.866  67.545  1.00 12.07           N  
+ATOM   3237  CD2 HIS B 596       7.785  33.893  65.832  1.00 12.33           C  
+ATOM   3238  CE1 HIS B 596       9.340  33.712  67.370  1.00 11.28           C  
+ATOM   3239  NE2 HIS B 596       8.791  33.101  66.336  1.00 12.31           N  
+ATOM   3240  N   THR B 597       9.289  37.366  64.029  1.00  9.09           N  
+ATOM   3241  CA  THR B 597      10.404  37.870  64.862  1.00  8.20           C  
+ATOM   3242  C   THR B 597      11.358  38.515  63.828  1.00  8.37           C  
+ATOM   3243  O   THR B 597      11.420  38.064  62.681  1.00  8.84           O  
+ATOM   3244  CB  THR B 597      11.150  36.695  65.612  1.00  8.91           C  
+ATOM   3245  OG1 THR B 597      12.288  37.196  66.322  1.00  8.90           O  
+ATOM   3246  CG2 THR B 597      11.614  35.573  64.618  1.00 10.72           C  
+ATOM   3247  N   LEU B 598      12.155  39.484  64.252  1.00  8.20           N  
+ATOM   3248  CA  LEU B 598      13.022  40.201  63.320  1.00  8.51           C  
+ATOM   3249  C   LEU B 598      14.347  39.561  62.955  1.00  9.00           C  
+ATOM   3250  O   LEU B 598      14.584  39.230  61.790  1.00 11.01           O  
+ATOM   3251  CB  LEU B 598      13.205  41.658  63.808  1.00  8.63           C  
+ATOM   3252  CG  LEU B 598      11.890  42.447  63.943  1.00  9.80           C  
+ATOM   3253  CD1 LEU B 598      12.060  43.724  64.758  1.00 10.76           C  
+ATOM   3254  CD2 LEU B 598      11.312  42.770  62.537  1.00 11.66           C  
+ATOM   3255  N   ILE B 599      15.186  39.324  63.951  1.00  8.83           N  
+ATOM   3256  CA  ILE B 599      16.526  38.802  63.730  1.00 10.11           C  
+ATOM   3257  C   ILE B 599      16.640  37.380  64.287  1.00 11.26           C  
+ATOM   3258  O   ILE B 599      16.536  37.181  65.510  1.00 11.64           O  
+ATOM   3259  CB  ILE B 599      17.560  39.752  64.443  1.00 11.43           C  
+ATOM   3260  CG1 ILE B 599      17.374  41.210  63.985  1.00 12.37           C  
+ATOM   3261  CG2 ILE B 599      18.978  39.250  64.287  1.00 12.44           C  
+ATOM   3262  CD1 ILE B 599      17.391  41.424  62.477  1.00 14.29           C  
+ATOM   3263  N   TRP B 600      16.924  36.423  63.410  1.00 10.90           N  
+ATOM   3264  CA  TRP B 600      17.030  35.023  63.794  1.00 12.03           C  
+ATOM   3265  C   TRP B 600      18.036  34.365  62.829  1.00 14.26           C  
+ATOM   3266  O   TRP B 600      18.325  34.905  61.741  1.00 13.38           O  
+ATOM   3267  CB  TRP B 600      15.651  34.422  63.642  1.00 12.38           C  
+ATOM   3268  CG  TRP B 600      15.472  33.058  64.149  1.00 14.20           C  
+ATOM   3269  CD1 TRP B 600      16.160  32.425  65.163  1.00 13.82           C  
+ATOM   3270  CD2 TRP B 600      14.463  32.156  63.721  1.00 14.94           C  
+ATOM   3271  NE1 TRP B 600      15.614  31.172  65.392  1.00 13.80           N  
+ATOM   3272  CE2 TRP B 600      14.572  30.985  64.519  1.00 14.98           C  
+ATOM   3273  CE3 TRP B 600      13.465  32.223  62.740  1.00 16.49           C  
+ATOM   3274  CZ2 TRP B 600      13.711  29.894  64.356  1.00 16.58           C  
+ATOM   3275  CZ3 TRP B 600      12.611  31.142  62.581  1.00 17.30           C  
+ATOM   3276  CH2 TRP B 600      12.738  29.989  63.387  1.00 17.23           C  
+ATOM   3277  N   HIS B 601      18.620  33.235  63.237  1.00 14.82           N  
+ATOM   3278  CA  HIS B 601      19.606  32.537  62.392  1.00 15.97           C  
+ATOM   3279  C   HIS B 601      18.939  31.582  61.413  1.00 16.70           C  
+ATOM   3280  O   HIS B 601      19.577  31.100  60.485  1.00 18.39           O  
+ATOM   3281  CB  HIS B 601      20.634  31.790  63.260  1.00 16.03           C  
+ATOM   3282  CG  HIS B 601      20.015  30.812  64.207  1.00 16.82           C  
+ATOM   3283  ND1 HIS B 601      20.014  29.449  63.982  1.00 18.27           N  
+ATOM   3284  CD2 HIS B 601      19.322  31.006  65.358  1.00 16.42           C  
+ATOM   3285  CE1 HIS B 601      19.340  28.849  64.953  1.00 16.48           C  
+ATOM   3286  NE2 HIS B 601      18.913  29.770  65.799  1.00 17.05           N  
+ATOM   3287  N   ASN B 602      17.654  31.322  61.605  1.00 18.55           N  
+ATOM   3288  CA  ASN B 602      16.904  30.424  60.719  1.00 22.20           C  
+ATOM   3289  C   ASN B 602      15.886  31.201  59.871  1.00 21.73           C  
+ATOM   3290  O   ASN B 602      15.471  32.314  60.226  1.00 20.04           O  
+ATOM   3291  CB  ASN B 602      16.079  29.421  61.532  1.00 25.77           C  
+ATOM   3292  CG  ASN B 602      16.830  28.157  61.879  1.00 30.10           C  
+ATOM   3293  OD1 ASN B 602      17.846  27.806  61.256  1.00 32.36           O  
+ATOM   3294  ND2 ASN B 602      16.314  27.437  62.890  1.00 31.87           N  
+ATOM   3295  N   GLN B 603      15.406  30.534  58.826  1.00 22.42           N  
+ATOM   3296  CA  GLN B 603      14.395  31.091  57.944  1.00 24.17           C  
+ATOM   3297  C   GLN B 603      14.753  32.450  57.347  1.00 21.86           C  
+ATOM   3298  O   GLN B 603      13.963  33.410  57.412  1.00 23.34           O  
+ATOM   3299  CB  GLN B 603      13.018  31.109  58.659  1.00 28.06           C  
+ATOM   3300  CG  GLN B 603      12.457  29.672  58.897  1.00 32.58           C  
+ATOM   3301  CD  GLN B 603      11.058  29.628  59.532  1.00 35.43           C  
+ATOM   3302  OE1 GLN B 603      10.906  29.290  60.723  1.00 36.62           O  
+ATOM   3303  NE2 GLN B 603      10.024  29.934  58.731  1.00 36.92           N  
+ATOM   3304  N   ASN B 604      15.982  32.544  56.846  1.00 18.56           N  
+ATOM   3305  CA  ASN B 604      16.452  33.767  56.189  1.00 16.23           C  
+ATOM   3306  C   ASN B 604      16.356  33.489  54.692  1.00 14.27           C  
+ATOM   3307  O   ASN B 604      16.548  32.356  54.255  1.00 14.07           O  
+ATOM   3308  CB  ASN B 604      17.868  34.124  56.631  1.00 14.66           C  
+ATOM   3309  CG  ASN B 604      17.877  34.696  58.022  1.00 14.54           C  
+ATOM   3310  OD1 ASN B 604      16.996  35.459  58.373  1.00 15.26           O  
+ATOM   3311  ND2 ASN B 604      18.835  34.312  58.817  1.00 13.65           N  
+ATOM   3312  N   PRO B 605      15.978  34.498  53.902  1.00 12.62           N  
+ATOM   3313  CA  PRO B 605      15.847  34.294  52.449  1.00 12.43           C  
+ATOM   3314  C   PRO B 605      17.184  34.127  51.686  1.00 11.59           C  
+ATOM   3315  O   PRO B 605      18.258  34.534  52.179  1.00 11.15           O  
+ATOM   3316  CB  PRO B 605      15.009  35.500  52.017  1.00 11.99           C  
+ATOM   3317  CG  PRO B 605      15.452  36.579  52.968  1.00 12.18           C  
+ATOM   3318  CD  PRO B 605      15.597  35.862  54.304  1.00 12.49           C  
+ATOM   3319  N   SER B 606      17.127  33.458  50.529  1.00 11.63           N  
+ATOM   3320  CA  SER B 606      18.337  33.195  49.724  1.00 13.09           C  
+ATOM   3321  C   SER B 606      19.207  34.435  49.438  1.00 11.53           C  
+ATOM   3322  O   SER B 606      20.438  34.342  49.427  1.00 11.82           O  
+ATOM   3323  CB  SER B 606      17.971  32.541  48.371  1.00 14.79           C  
+ATOM   3324  OG  SER B 606      17.408  31.259  48.555  1.00 19.63           O  
+ATOM   3325  N   TRP B 607      18.571  35.580  49.169  1.00 10.84           N  
+ATOM   3326  CA  TRP B 607      19.337  36.792  48.860  1.00 10.78           C  
+ATOM   3327  C   TRP B 607      20.232  37.238  50.018  1.00 11.36           C  
+ATOM   3328  O   TRP B 607      21.290  37.820  49.807  1.00 11.47           O  
+ATOM   3329  CB  TRP B 607      18.422  37.947  48.393  1.00 10.08           C  
+ATOM   3330  CG  TRP B 607      17.477  38.512  49.407  1.00  8.88           C  
+ATOM   3331  CD1 TRP B 607      16.163  38.150  49.602  1.00  9.55           C  
+ATOM   3332  CD2 TRP B 607      17.740  39.576  50.337  1.00  8.90           C  
+ATOM   3333  NE1 TRP B 607      15.608  38.932  50.585  1.00  9.12           N  
+ATOM   3334  CE2 TRP B 607      16.547  39.810  51.054  1.00  8.32           C  
+ATOM   3335  CE3 TRP B 607      18.876  40.353  50.636  1.00  8.99           C  
+ATOM   3336  CZ2 TRP B 607      16.453  40.785  52.045  1.00  9.61           C  
+ATOM   3337  CZ3 TRP B 607      18.784  41.323  51.624  1.00  9.37           C  
+ATOM   3338  CH2 TRP B 607      17.579  41.532  52.316  1.00  9.92           C  
+ATOM   3339  N   LEU B 608      19.802  36.940  51.241  1.00 10.63           N  
+ATOM   3340  CA  LEU B 608      20.568  37.315  52.421  1.00 11.95           C  
+ATOM   3341  C   LEU B 608      21.662  36.276  52.695  1.00 13.48           C  
+ATOM   3342  O   LEU B 608      22.845  36.608  52.782  1.00 14.42           O  
+ATOM   3343  CB  LEU B 608      19.651  37.405  53.645  1.00 13.18           C  
+ATOM   3344  CG  LEU B 608      20.318  37.931  54.908  1.00 14.66           C  
+ATOM   3345  CD1 LEU B 608      20.522  39.419  54.731  1.00 15.22           C  
+ATOM   3346  CD2 LEU B 608      19.417  37.670  56.097  1.00 15.06           C  
+ATOM   3347  N   THR B 609      21.281  35.012  52.809  1.00 14.31           N  
+ATOM   3348  CA  THR B 609      22.273  33.999  53.110  1.00 16.90           C  
+ATOM   3349  C   THR B 609      23.336  33.796  52.003  1.00 18.62           C  
+ATOM   3350  O   THR B 609      24.489  33.476  52.328  1.00 20.10           O  
+ATOM   3351  CB  THR B 609      21.598  32.684  53.478  1.00 17.54           C  
+ATOM   3352  OG1 THR B 609      20.902  32.169  52.341  1.00 20.42           O  
+ATOM   3353  CG2 THR B 609      20.595  32.916  54.564  1.00 17.40           C  
+ATOM   3354  N   ASN B 610      22.956  33.995  50.728  1.00 19.14           N  
+ATOM   3355  CA  ASN B 610      23.870  33.844  49.586  1.00 20.57           C  
+ATOM   3356  C   ASN B 610      24.534  35.168  49.153  1.00 21.37           C  
+ATOM   3357  O   ASN B 610      25.362  35.178  48.236  1.00 21.86           O  
+ATOM   3358  CB  ASN B 610      23.144  33.229  48.375  1.00 22.27           C  
+ATOM   3359  CG  ASN B 610      22.830  31.750  48.562  1.00 24.14           C  
+ATOM   3360  OD1 ASN B 610      23.452  31.068  49.365  1.00 27.27           O  
+ATOM   3361  ND2 ASN B 610      21.861  31.254  47.825  1.00 25.02           N  
+ATOM   3362  N   GLY B 611      24.217  36.259  49.850  1.00 20.88           N  
+ATOM   3363  CA  GLY B 611      24.757  37.566  49.522  1.00 21.33           C  
+ATOM   3364  C   GLY B 611      26.205  37.781  49.886  1.00 22.66           C  
+ATOM   3365  O   GLY B 611      26.801  36.991  50.600  1.00 23.60           O  
+ATOM   3366  N   ASN B 612      26.759  38.889  49.417  1.00 24.10           N  
+ATOM   3367  CA  ASN B 612      28.155  39.252  49.663  1.00 26.44           C  
+ATOM   3368  C   ASN B 612      28.138  40.470  50.617  1.00 23.91           C  
+ATOM   3369  O   ASN B 612      27.817  41.585  50.189  1.00 24.46           O  
+ATOM   3370  CB  ASN B 612      28.787  39.595  48.306  1.00 31.28           C  
+ATOM   3371  CG  ASN B 612      30.264  39.882  48.408  1.00 35.70           C  
+ATOM   3372  OD1 ASN B 612      30.945  39.434  49.353  1.00 37.71           O  
+ATOM   3373  ND2 ASN B 612      30.783  40.643  47.435  1.00 37.58           N  
+ATOM   3374  N   TRP B 613      28.448  40.246  51.902  1.00 20.26           N  
+ATOM   3375  CA  TRP B 613      28.356  41.304  52.911  1.00 17.27           C  
+ATOM   3376  C   TRP B 613      29.598  41.588  53.751  1.00 17.04           C  
+ATOM   3377  O   TRP B 613      30.480  40.742  53.907  1.00 17.35           O  
+ATOM   3378  CB  TRP B 613      27.250  40.943  53.944  1.00 15.42           C  
+ATOM   3379  CG  TRP B 613      25.958  40.450  53.374  1.00 13.60           C  
+ATOM   3380  CD1 TRP B 613      25.508  39.167  53.381  1.00 13.57           C  
+ATOM   3381  CD2 TRP B 613      24.971  41.218  52.671  1.00 12.63           C  
+ATOM   3382  NE1 TRP B 613      24.310  39.079  52.720  1.00 13.40           N  
+ATOM   3383  CE2 TRP B 613      23.955  40.322  52.269  1.00 13.31           C  
+ATOM   3384  CE3 TRP B 613      24.850  42.564  52.341  1.00 12.34           C  
+ATOM   3385  CZ2 TRP B 613      22.833  40.730  51.549  1.00 12.48           C  
+ATOM   3386  CZ3 TRP B 613      23.726  42.975  51.620  1.00 13.38           C  
+ATOM   3387  CH2 TRP B 613      22.735  42.056  51.234  1.00 12.79           C  
+ATOM   3388  N   ASN B 614      29.600  42.777  54.346  1.00 15.75           N  
+ATOM   3389  CA  ASN B 614      30.625  43.164  55.306  1.00 15.68           C  
+ATOM   3390  C   ASN B 614      29.832  43.798  56.451  1.00 14.27           C  
+ATOM   3391  O   ASN B 614      28.601  43.897  56.373  1.00 13.48           O  
+ATOM   3392  CB  ASN B 614      31.694  44.108  54.720  1.00 17.65           C  
+ATOM   3393  CG  ASN B 614      31.102  45.367  54.114  1.00 19.42           C  
+ATOM   3394  OD1 ASN B 614      30.322  46.077  54.731  1.00 19.22           O  
+ATOM   3395  ND2 ASN B 614      31.475  45.641  52.875  1.00 22.85           N  
+ATOM   3396  N   ARG B 615      30.510  44.167  57.531  1.00 13.37           N  
+ATOM   3397  CA  ARG B 615      29.841  44.752  58.691  1.00 13.48           C  
+ATOM   3398  C   ARG B 615      28.903  45.944  58.381  1.00 13.87           C  
+ATOM   3399  O   ARG B 615      27.722  45.943  58.751  1.00 12.60           O  
+ATOM   3400  CB  ARG B 615      30.895  45.115  59.768  1.00 13.89           C  
+ATOM   3401  CG  ARG B 615      30.379  45.998  60.894  1.00 14.47           C  
+ATOM   3402  CD  ARG B 615      31.430  46.264  61.969  1.00 14.01           C  
+ATOM   3403  NE  ARG B 615      30.941  47.232  62.945  1.00 15.48           N  
+ATOM   3404  CZ  ARG B 615      30.514  46.915  64.168  1.00 17.02           C  
+ATOM   3405  NH1 ARG B 615      30.514  45.640  64.590  1.00 17.20           N  
+ATOM   3406  NH2 ARG B 615      30.081  47.868  64.976  1.00 18.41           N  
+ATOM   3407  N   ASP B 616      29.396  46.926  57.631  1.00 13.92           N  
+ATOM   3408  CA  ASP B 616      28.585  48.107  57.328  1.00 15.04           C  
+ATOM   3409  C   ASP B 616      27.403  47.845  56.429  1.00 12.93           C  
+ATOM   3410  O   ASP B 616      26.339  48.419  56.655  1.00 13.21           O  
+ATOM   3411  CB  ASP B 616      29.436  49.209  56.704  1.00 19.09           C  
+ATOM   3412  CG  ASP B 616      30.622  49.587  57.578  1.00 23.81           C  
+ATOM   3413  OD1 ASP B 616      30.442  49.857  58.793  1.00 25.80           O  
+ATOM   3414  OD2 ASP B 616      31.753  49.576  57.048  1.00 27.22           O  
+ATOM   3415  N   SER B 617      27.583  46.993  55.423  1.00 11.41           N  
+ATOM   3416  CA  SER B 617      26.497  46.723  54.507  1.00 11.55           C  
+ATOM   3417  C   SER B 617      25.436  45.844  55.151  1.00 10.98           C  
+ATOM   3418  O   SER B 617      24.257  46.035  54.874  1.00 11.96           O  
+ATOM   3419  CB  SER B 617      26.955  46.149  53.161  1.00 10.89           C  
+ATOM   3420  OG  SER B 617      27.612  44.905  53.274  1.00 12.49           O  
+ATOM   3421  N   LEU B 618      25.839  44.899  56.002  1.00 10.51           N  
+ATOM   3422  CA  LEU B 618      24.835  44.054  56.669  1.00  9.68           C  
+ATOM   3423  C   LEU B 618      24.091  44.854  57.742  1.00  8.95           C  
+ATOM   3424  O   LEU B 618      22.899  44.644  57.934  1.00  9.53           O  
+ATOM   3425  CB  LEU B 618      25.422  42.745  57.199  1.00 10.44           C  
+ATOM   3426  CG  LEU B 618      24.398  41.681  57.617  1.00 10.22           C  
+ATOM   3427  CD1 LEU B 618      23.532  41.244  56.428  1.00 11.19           C  
+ATOM   3428  CD2 LEU B 618      25.167  40.501  58.111  1.00 10.39           C  
+ATOM   3429  N   LEU B 619      24.754  45.803  58.407  1.00  9.27           N  
+ATOM   3430  CA  LEU B 619      24.065  46.654  59.384  1.00  9.59           C  
+ATOM   3431  C   LEU B 619      22.971  47.497  58.695  1.00  9.15           C  
+ATOM   3432  O   LEU B 619      21.900  47.715  59.254  1.00  9.16           O  
+ATOM   3433  CB  LEU B 619      25.054  47.576  60.132  1.00 11.47           C  
+ATOM   3434  CG  LEU B 619      25.765  47.000  61.370  1.00 12.11           C  
+ATOM   3435  CD1 LEU B 619      26.820  48.006  61.875  1.00 13.58           C  
+ATOM   3436  CD2 LEU B 619      24.754  46.731  62.471  1.00 11.52           C  
+ATOM   3437  N   ALA B 620      23.265  47.995  57.481  1.00 10.27           N  
+ATOM   3438  CA  ALA B 620      22.294  48.791  56.709  1.00 10.21           C  
+ATOM   3439  C   ALA B 620      21.080  47.922  56.332  1.00  8.39           C  
+ATOM   3440  O   ALA B 620      19.964  48.397  56.343  1.00  9.50           O  
+ATOM   3441  CB  ALA B 620      22.945  49.357  55.454  1.00 10.01           C  
+ATOM   3442  N   VAL B 621      21.303  46.665  55.959  1.00  8.16           N  
+ATOM   3443  CA  VAL B 621      20.194  45.733  55.662  1.00  8.80           C  
+ATOM   3444  C   VAL B 621      19.343  45.512  56.946  1.00  9.06           C  
+ATOM   3445  O   VAL B 621      18.107  45.519  56.886  1.00  8.64           O  
+ATOM   3446  CB  VAL B 621      20.728  44.378  55.152  1.00  9.89           C  
+ATOM   3447  CG1 VAL B 621      19.649  43.294  55.224  1.00 11.35           C  
+ATOM   3448  CG2 VAL B 621      21.225  44.536  53.712  1.00 11.09           C  
+ATOM   3449  N   MET B 622      20.017  45.330  58.090  1.00  8.81           N  
+ATOM   3450  CA  MET B 622      19.328  45.132  59.363  1.00  9.41           C  
+ATOM   3451  C   MET B 622      18.439  46.329  59.694  1.00  9.19           C  
+ATOM   3452  O   MET B 622      17.255  46.195  60.063  1.00  8.80           O  
+ATOM   3453  CB  MET B 622      20.355  44.923  60.486  1.00 10.30           C  
+ATOM   3454  CG  MET B 622      19.699  44.714  61.863  1.00 12.65           C  
+ATOM   3455  SD  MET B 622      20.870  44.771  63.228  1.00 14.79           S  
+ATOM   3456  CE  MET B 622      21.458  43.241  63.000  1.00 11.02           C  
+ATOM   3457  N   LYS B 623      19.016  47.517  59.565  1.00  8.91           N  
+ATOM   3458  CA  LYS B 623      18.293  48.736  59.848  1.00  8.78           C  
+ATOM   3459  C   LYS B 623      17.055  48.897  58.951  1.00  7.64           C  
+ATOM   3460  O   LYS B 623      15.992  49.272  59.414  1.00  9.24           O  
+ATOM   3461  CB  LYS B 623      19.221  49.939  59.680  1.00 11.10           C  
+ATOM   3462  CG  LYS B 623      18.596  51.191  60.201  1.00 15.22           C  
+ATOM   3463  CD  LYS B 623      19.573  52.344  60.182  1.00 20.02           C  
+ATOM   3464  CE  LYS B 623      19.089  53.456  61.133  1.00 24.04           C  
+ATOM   3465  NZ  LYS B 623      17.591  53.702  61.073  1.00 27.21           N  
+ATOM   3466  N   ASN B 624      17.220  48.659  57.659  1.00  7.98           N  
+ATOM   3467  CA  ASN B 624      16.105  48.809  56.705  1.00  8.10           C  
+ATOM   3468  C   ASN B 624      14.957  47.813  57.004  1.00  7.59           C  
+ATOM   3469  O   ASN B 624      13.769  48.174  56.982  1.00  7.91           O  
+ATOM   3470  CB  ASN B 624      16.599  48.640  55.251  1.00  9.28           C  
+ATOM   3471  CG  ASN B 624      15.500  48.920  54.234  1.00  9.66           C  
+ATOM   3472  OD1 ASN B 624      14.875  49.978  54.290  1.00 12.84           O  
+ATOM   3473  ND2 ASN B 624      15.246  47.978  53.319  1.00 10.71           N  
+ATOM   3474  N   HIS B 625      15.317  46.565  57.307  1.00  7.44           N  
+ATOM   3475  CA  HIS B 625      14.289  45.579  57.609  1.00  7.09           C  
+ATOM   3476  C   HIS B 625      13.530  45.945  58.884  1.00  7.40           C  
+ATOM   3477  O   HIS B 625      12.292  46.024  58.890  1.00  7.62           O  
+ATOM   3478  CB  HIS B 625      14.881  44.187  57.762  1.00  6.77           C  
+ATOM   3479  CG  HIS B 625      13.843  43.125  57.935  1.00  7.67           C  
+ATOM   3480  ND1 HIS B 625      13.170  42.557  56.875  1.00  7.14           N  
+ATOM   3481  CD2 HIS B 625      13.347  42.531  59.053  1.00  8.18           C  
+ATOM   3482  CE1 HIS B 625      12.321  41.650  57.325  1.00  7.89           C  
+ATOM   3483  NE2 HIS B 625      12.411  41.616  58.643  1.00  7.36           N  
+ATOM   3484  N   ILE B 626      14.272  46.208  59.951  1.00  7.76           N  
+ATOM   3485  CA  ILE B 626      13.629  46.529  61.223  1.00  8.23           C  
+ATOM   3486  C   ILE B 626      12.755  47.793  61.122  1.00  8.20           C  
+ATOM   3487  O   ILE B 626      11.598  47.806  61.544  1.00  8.15           O  
+ATOM   3488  CB  ILE B 626      14.676  46.672  62.347  1.00  7.96           C  
+ATOM   3489  CG1 ILE B 626      15.334  45.311  62.625  1.00  7.85           C  
+ATOM   3490  CG2 ILE B 626      14.020  47.292  63.613  1.00  7.56           C  
+ATOM   3491  CD1 ILE B 626      16.495  45.372  63.638  1.00  9.00           C  
+ATOM   3492  N   THR B 627      13.300  48.845  60.512  1.00  8.83           N  
+ATOM   3493  CA  THR B 627      12.569  50.096  60.386  1.00  8.99           C  
+ATOM   3494  C   THR B 627      11.324  49.968  59.475  1.00  8.25           C  
+ATOM   3495  O   THR B 627      10.229  50.445  59.838  1.00  9.27           O  
+ATOM   3496  CB  THR B 627      13.517  51.253  59.886  1.00 10.23           C  
+ATOM   3497  OG1 THR B 627      14.685  51.314  60.737  1.00 11.95           O  
+ATOM   3498  CG2 THR B 627      12.801  52.614  59.955  1.00 10.44           C  
+ATOM   3499  N   THR B 628      11.476  49.343  58.307  1.00  7.56           N  
+ATOM   3500  CA  THR B 628      10.338  49.226  57.385  1.00  7.60           C  
+ATOM   3501  C   THR B 628       9.200  48.401  57.996  1.00  8.35           C  
+ATOM   3502  O   THR B 628       8.036  48.837  57.987  1.00 10.18           O  
+ATOM   3503  CB  THR B 628      10.757  48.642  56.030  1.00  8.26           C  
+ATOM   3504  OG1 THR B 628      11.742  49.510  55.423  1.00  8.68           O  
+ATOM   3505  CG2 THR B 628       9.549  48.530  55.110  1.00  9.08           C  
+ATOM   3506  N   VAL B 629       9.546  47.266  58.605  1.00  7.12           N  
+ATOM   3507  CA  VAL B 629       8.541  46.404  59.222  1.00  7.87           C  
+ATOM   3508  C   VAL B 629       7.859  47.062  60.441  1.00  7.48           C  
+ATOM   3509  O   VAL B 629       6.631  47.124  60.520  1.00  7.41           O  
+ATOM   3510  CB  VAL B 629       9.170  45.042  59.625  1.00  7.57           C  
+ATOM   3511  CG1 VAL B 629       8.162  44.191  60.450  1.00  8.52           C  
+ATOM   3512  CG2 VAL B 629       9.588  44.281  58.365  1.00  8.60           C  
+ATOM   3513  N   MET B 630       8.647  47.576  61.386  1.00  8.63           N  
+ATOM   3514  CA  MET B 630       8.055  48.171  62.587  1.00  8.49           C  
+ATOM   3515  C   MET B 630       7.254  49.442  62.338  1.00  9.67           C  
+ATOM   3516  O   MET B 630       6.261  49.691  63.012  1.00  9.87           O  
+ATOM   3517  CB  MET B 630       9.100  48.378  63.688  1.00  9.55           C  
+ATOM   3518  CG  MET B 630       9.647  47.053  64.236  1.00  9.29           C  
+ATOM   3519  SD  MET B 630      10.804  47.271  65.614  1.00 11.18           S  
+ATOM   3520  CE  MET B 630       9.753  47.851  66.974  1.00  9.23           C  
+ATOM   3521  N   THR B 631       7.665  50.248  61.362  1.00  9.87           N  
+ATOM   3522  CA  THR B 631       6.895  51.458  61.078  1.00 11.08           C  
+ATOM   3523  C   THR B 631       5.546  51.109  60.434  1.00  9.97           C  
+ATOM   3524  O   THR B 631       4.566  51.776  60.689  1.00 10.25           O  
+ATOM   3525  CB  THR B 631       7.656  52.490  60.213  1.00 13.52           C  
+ATOM   3526  OG1 THR B 631       7.964  51.919  58.963  1.00 16.64           O  
+ATOM   3527  CG2 THR B 631       8.941  52.908  60.873  1.00 13.66           C  
+ATOM   3528  N   HIS B 632       5.477  50.042  59.643  1.00  9.98           N  
+ATOM   3529  CA  HIS B 632       4.197  49.631  59.046  1.00  9.75           C  
+ATOM   3530  C   HIS B 632       3.209  49.237  60.158  1.00 10.02           C  
+ATOM   3531  O   HIS B 632       2.001  49.388  60.021  1.00 11.14           O  
+ATOM   3532  CB  HIS B 632       4.380  48.458  58.061  1.00 10.06           C  
+ATOM   3533  CG  HIS B 632       3.132  48.085  57.313  1.00 10.10           C  
+ATOM   3534  ND1 HIS B 632       2.594  48.874  56.313  1.00  9.73           N  
+ATOM   3535  CD2 HIS B 632       2.319  47.007  57.415  1.00  9.51           C  
+ATOM   3536  CE1 HIS B 632       1.507  48.296  55.835  1.00 10.02           C  
+ATOM   3537  NE2 HIS B 632       1.321  47.163  56.487  1.00 10.05           N  
+ATOM   3538  N   TYR B 633       3.722  48.716  61.264  1.00 11.46           N  
+ATOM   3539  CA  TYR B 633       2.846  48.310  62.383  1.00 11.94           C  
+ATOM   3540  C   TYR B 633       2.988  49.243  63.585  1.00 12.64           C  
+ATOM   3541  O   TYR B 633       2.601  48.889  64.692  1.00 13.10           O  
+ATOM   3542  CB  TYR B 633       3.189  46.867  62.816  1.00 10.96           C  
+ATOM   3543  CG  TYR B 633       2.867  45.831  61.756  1.00 10.54           C  
+ATOM   3544  CD1 TYR B 633       1.532  45.483  61.481  1.00 10.96           C  
+ATOM   3545  CD2 TYR B 633       3.879  45.255  60.968  1.00  9.61           C  
+ATOM   3546  CE1 TYR B 633       1.220  44.606  60.440  1.00  9.87           C  
+ATOM   3547  CE2 TYR B 633       3.574  44.370  59.930  1.00  9.41           C  
+ATOM   3548  CZ  TYR B 633       2.237  44.056  59.669  1.00  9.18           C  
+ATOM   3549  OH  TYR B 633       1.940  43.208  58.628  1.00 11.15           O  
+ATOM   3550  N   LYS B 634       3.487  50.447  63.360  1.00 12.54           N  
+ATOM   3551  CA  LYS B 634       3.720  51.370  64.455  1.00 13.74           C  
+ATOM   3552  C   LYS B 634       2.498  51.586  65.358  1.00 14.58           C  
+ATOM   3553  O   LYS B 634       1.401  51.921  64.887  1.00 15.20           O  
+ATOM   3554  CB  LYS B 634       4.265  52.695  63.916  1.00 14.53           C  
+ATOM   3555  CG  LYS B 634       4.770  53.594  65.021  1.00 17.70           C  
+ATOM   3556  CD  LYS B 634       5.368  54.888  64.483  1.00 20.50           C  
+ATOM   3557  CE  LYS B 634       5.751  55.821  65.628  1.00 22.65           C  
+ATOM   3558  NZ  LYS B 634       6.239  57.119  65.113  1.00 25.30           N  
+ATOM   3559  N   GLY B 635       2.702  51.355  66.657  1.00 14.21           N  
+ATOM   3560  CA  GLY B 635       1.643  51.518  67.637  1.00 15.59           C  
+ATOM   3561  C   GLY B 635       0.550  50.446  67.630  1.00 17.77           C  
+ATOM   3562  O   GLY B 635      -0.410  50.565  68.394  1.00 18.94           O  
+ATOM   3563  N   LYS B 636       0.703  49.391  66.821  1.00 17.44           N  
+ATOM   3564  CA  LYS B 636      -0.293  48.301  66.710  1.00 17.63           C  
+ATOM   3565  C   LYS B 636       0.141  46.974  67.356  1.00 16.27           C  
+ATOM   3566  O   LYS B 636      -0.689  46.104  67.568  1.00 15.91           O  
+ATOM   3567  CB  LYS B 636      -0.566  47.979  65.238  1.00 20.09           C  
+ATOM   3568  CG  LYS B 636      -0.862  49.160  64.368  1.00 23.71           C  
+ATOM   3569  CD  LYS B 636      -2.204  49.747  64.676  1.00 26.97           C  
+ATOM   3570  CE  LYS B 636      -2.486  50.907  63.708  1.00 30.07           C  
+ATOM   3571  NZ  LYS B 636      -2.237  50.542  62.248  1.00 32.17           N  
+ATOM   3572  N   ILE B 637       1.443  46.796  67.575  1.00 15.08           N  
+ATOM   3573  CA  ILE B 637       1.994  45.569  68.137  1.00 14.58           C  
+ATOM   3574  C   ILE B 637       2.654  45.873  69.471  1.00 15.23           C  
+ATOM   3575  O   ILE B 637       3.605  46.632  69.560  1.00 17.04           O  
+ATOM   3576  CB  ILE B 637       2.917  44.883  67.106  1.00 14.19           C  
+ATOM   3577  CG1 ILE B 637       2.042  44.422  65.924  1.00 13.98           C  
+ATOM   3578  CG2 ILE B 637       3.725  43.744  67.753  1.00 13.23           C  
+ATOM   3579  CD1 ILE B 637       2.714  43.582  64.868  1.00 16.19           C  
+ATOM   3580  N   VAL B 638       2.068  45.318  70.523  1.00 14.15           N  
+ATOM   3581  CA  VAL B 638       2.503  45.574  71.879  1.00 15.59           C  
+ATOM   3582  C   VAL B 638       3.874  45.019  72.298  1.00 13.94           C  
+ATOM   3583  O   VAL B 638       4.617  45.682  73.028  1.00 14.93           O  
+ATOM   3584  CB  VAL B 638       1.358  45.157  72.885  1.00 16.85           C  
+ATOM   3585  CG1 VAL B 638       1.152  43.645  72.902  1.00 16.67           C  
+ATOM   3586  CG2 VAL B 638       1.615  45.719  74.271  1.00 20.26           C  
+ATOM   3587  N   GLU B 639       4.216  43.827  71.830  1.00 10.99           N  
+ATOM   3588  CA  GLU B 639       5.493  43.218  72.183  1.00  9.19           C  
+ATOM   3589  C   GLU B 639       6.145  42.704  70.915  1.00  7.39           C  
+ATOM   3590  O   GLU B 639       5.485  42.046  70.125  1.00  8.96           O  
+ATOM   3591  CB  GLU B 639       5.270  42.005  73.127  1.00 10.04           C  
+ATOM   3592  CG  GLU B 639       4.608  42.341  74.474  1.00 11.02           C  
+ATOM   3593  CD  GLU B 639       4.485  41.144  75.435  1.00 11.32           C  
+ATOM   3594  OE1 GLU B 639       5.109  40.077  75.221  1.00 10.22           O  
+ATOM   3595  OE2 GLU B 639       3.733  41.303  76.421  1.00 13.42           O  
+ATOM   3596  N   TRP B 640       7.433  42.958  70.761  1.00  7.03           N  
+ATOM   3597  CA  TRP B 640       8.187  42.512  69.602  1.00  6.78           C  
+ATOM   3598  C   TRP B 640       9.332  41.607  69.998  1.00  6.26           C  
+ATOM   3599  O   TRP B 640      10.123  41.961  70.873  1.00  7.34           O  
+ATOM   3600  CB  TRP B 640       8.808  43.721  68.837  1.00  8.02           C  
+ATOM   3601  CG  TRP B 640       7.951  44.265  67.716  1.00  9.48           C  
+ATOM   3602  CD1 TRP B 640       7.138  45.365  67.747  1.00 11.27           C  
+ATOM   3603  CD2 TRP B 640       7.829  43.715  66.400  1.00 10.06           C  
+ATOM   3604  NE1 TRP B 640       6.517  45.527  66.525  1.00 11.62           N  
+ATOM   3605  CE2 TRP B 640       6.927  44.532  65.683  1.00 11.50           C  
+ATOM   3606  CE3 TRP B 640       8.394  42.598  65.755  1.00 11.75           C  
+ATOM   3607  CZ2 TRP B 640       6.580  44.268  64.344  1.00 12.19           C  
+ATOM   3608  CZ3 TRP B 640       8.044  42.329  64.414  1.00 12.95           C  
+ATOM   3609  CH2 TRP B 640       7.150  43.166  63.737  1.00 12.41           C  
+ATOM   3610  N   ASP B 641       9.424  40.444  69.366  1.00  5.84           N  
+ATOM   3611  CA  ASP B 641      10.581  39.593  69.569  1.00  6.75           C  
+ATOM   3612  C   ASP B 641      11.604  40.154  68.555  1.00  7.38           C  
+ATOM   3613  O   ASP B 641      11.605  39.768  67.365  1.00  7.36           O  
+ATOM   3614  CB  ASP B 641      10.300  38.115  69.238  1.00  7.66           C  
+ATOM   3615  CG  ASP B 641       9.412  37.430  70.286  1.00  9.03           C  
+ATOM   3616  OD1 ASP B 641       9.347  37.899  71.436  1.00  8.74           O  
+ATOM   3617  OD2 ASP B 641       8.782  36.425  69.898  1.00 11.85           O  
+ATOM   3618  N   VAL B 642      12.431  41.083  69.021  1.00  6.96           N  
+ATOM   3619  CA  VAL B 642      13.455  41.679  68.165  1.00  7.28           C  
+ATOM   3620  C   VAL B 642      14.501  40.657  67.739  1.00  8.76           C  
+ATOM   3621  O   VAL B 642      14.906  40.619  66.562  1.00  9.49           O  
+ATOM   3622  CB  VAL B 642      14.148  42.853  68.875  1.00  8.35           C  
+ATOM   3623  CG1 VAL B 642      15.314  43.405  68.006  1.00  9.46           C  
+ATOM   3624  CG2 VAL B 642      13.129  43.942  69.196  1.00  8.98           C  
+ATOM   3625  N   ALA B 643      14.953  39.838  68.684  1.00  8.52           N  
+ATOM   3626  CA  ALA B 643      15.969  38.834  68.427  1.00  8.77           C  
+ATOM   3627  C   ALA B 643      15.422  37.524  68.976  1.00  9.34           C  
+ATOM   3628  O   ALA B 643      14.751  37.516  70.019  1.00  9.96           O  
+ATOM   3629  CB  ALA B 643      17.257  39.205  69.133  1.00 10.13           C  
+ATOM   3630  N   ASN B 644      15.791  36.429  68.320  1.00  8.94           N  
+ATOM   3631  CA  ASN B 644      15.297  35.085  68.653  1.00 10.05           C  
+ATOM   3632  C   ASN B 644      16.406  34.034  68.604  1.00 11.74           C  
+ATOM   3633  O   ASN B 644      17.149  33.959  67.607  1.00 11.91           O  
+ATOM   3634  CB  ASN B 644      14.268  34.719  67.579  1.00 12.30           C  
+ATOM   3635  CG  ASN B 644      13.331  33.618  67.992  1.00 13.65           C  
+ATOM   3636  OD1 ASN B 644      13.058  32.697  67.217  1.00 15.12           O  
+ATOM   3637  ND2 ASN B 644      12.771  33.736  69.169  1.00 14.52           N  
+ATOM   3638  N   GLU B 645      16.598  33.305  69.711  1.00 10.75           N  
+ATOM   3639  CA  GLU B 645      17.563  32.187  69.752  1.00 12.26           C  
+ATOM   3640  C   GLU B 645      19.009  32.502  69.352  1.00 11.99           C  
+ATOM   3641  O   GLU B 645      19.642  31.737  68.624  1.00 14.14           O  
+ATOM   3642  CB  GLU B 645      17.017  31.041  68.886  1.00 11.27           C  
+ATOM   3643  CG  GLU B 645      15.603  30.637  69.311  1.00 11.77           C  
+ATOM   3644  CD  GLU B 645      14.979  29.570  68.454  1.00 13.15           C  
+ATOM   3645  OE1 GLU B 645      15.652  29.035  67.553  1.00 14.08           O  
+ATOM   3646  OE2 GLU B 645      13.787  29.264  68.664  1.00 14.59           O  
+ATOM   3647  N   CYS B 646      19.534  33.594  69.882  1.00 13.29           N  
+ATOM   3648  CA  CYS B 646      20.886  34.027  69.571  1.00 13.72           C  
+ATOM   3649  C   CYS B 646      21.974  33.454  70.470  1.00 14.86           C  
+ATOM   3650  O   CYS B 646      23.148  33.580  70.144  1.00 15.20           O  
+ATOM   3651  CB  CYS B 646      20.955  35.555  69.630  1.00 14.57           C  
+ATOM   3652  SG  CYS B 646      19.801  36.353  68.463  1.00 17.06           S  
+ATOM   3653  N   MET B 647      21.612  32.890  71.625  1.00 14.53           N  
+ATOM   3654  CA  MET B 647      22.622  32.331  72.553  1.00 14.16           C  
+ATOM   3655  C   MET B 647      22.906  30.869  72.217  1.00 14.56           C  
+ATOM   3656  O   MET B 647      21.986  30.092  71.900  1.00 13.03           O  
+ATOM   3657  CB  MET B 647      22.130  32.439  74.007  1.00 14.22           C  
+ATOM   3658  CG  MET B 647      23.179  32.072  75.069  1.00 14.45           C  
+ATOM   3659  SD  MET B 647      24.552  33.214  75.111  1.00 16.57           S  
+ATOM   3660  CE  MET B 647      23.781  34.619  75.913  1.00 15.93           C  
+ATOM   3661  N   ASP B 648      24.179  30.488  72.278  1.00 16.24           N  
+ATOM   3662  CA  ASP B 648      24.542  29.100  71.997  1.00 17.62           C  
+ATOM   3663  C   ASP B 648      23.982  28.235  73.141  1.00 18.40           C  
+ATOM   3664  O   ASP B 648      23.885  28.701  74.267  1.00 17.29           O  
+ATOM   3665  CB  ASP B 648      26.062  28.949  71.916  1.00 19.79           C  
+ATOM   3666  CG  ASP B 648      26.490  27.579  71.399  1.00 23.40           C  
+ATOM   3667  OD1 ASP B 648      26.476  27.347  70.148  1.00 24.87           O  
+ATOM   3668  OD2 ASP B 648      26.843  26.722  72.250  1.00 24.88           O  
+ATOM   3669  N   ASP B 649      23.611  26.992  72.858  1.00 19.25           N  
+ATOM   3670  CA  ASP B 649      23.072  26.111  73.908  1.00 22.35           C  
+ATOM   3671  C   ASP B 649      24.013  25.799  75.086  1.00 22.41           C  
+ATOM   3672  O   ASP B 649      23.561  25.446  76.183  1.00 22.93           O  
+ATOM   3673  CB  ASP B 649      22.516  24.842  73.288  1.00 24.41           C  
+ATOM   3674  CG  ASP B 649      21.257  25.116  72.526  1.00 27.13           C  
+ATOM   3675  OD1 ASP B 649      20.400  25.824  73.094  1.00 29.09           O  
+ATOM   3676  OD2 ASP B 649      21.134  24.678  71.367  1.00 28.55           O  
+ATOM   3677  N   SER B 650      25.311  25.949  74.839  1.00 21.60           N  
+ATOM   3678  CA  SER B 650      26.330  25.748  75.856  1.00 22.16           C  
+ATOM   3679  C   SER B 650      26.197  26.838  76.924  1.00 22.12           C  
+ATOM   3680  O   SER B 650      26.574  26.629  78.072  1.00 24.22           O  
+ATOM   3681  CB  SER B 650      27.741  25.855  75.225  1.00 22.18           C  
+ATOM   3682  OG  SER B 650      28.036  27.181  74.743  1.00 22.55           O  
+ATOM   3683  N   GLY B 651      25.680  28.000  76.533  1.00 20.55           N  
+ATOM   3684  CA  GLY B 651      25.575  29.116  77.439  1.00 19.81           C  
+ATOM   3685  C   GLY B 651      26.911  29.848  77.450  1.00 21.34           C  
+ATOM   3686  O   GLY B 651      27.095  30.797  78.216  1.00 21.10           O  
+ATOM   3687  N   ASN B 652      27.839  29.451  76.572  1.00 21.82           N  
+ATOM   3688  CA  ASN B 652      29.151  30.087  76.539  1.00 23.47           C  
+ATOM   3689  C   ASN B 652      29.213  31.411  75.825  1.00 23.65           C  
+ATOM   3690  O   ASN B 652      30.099  32.216  76.089  1.00 25.89           O  
+ATOM   3691  CB  ASN B 652      30.218  29.151  75.970  1.00 24.73           C  
+ATOM   3692  CG  ASN B 652      30.722  28.164  77.000  1.00 26.90           C  
+ATOM   3693  OD1 ASN B 652      31.175  27.075  76.660  1.00 28.53           O  
+ATOM   3694  ND2 ASN B 652      30.626  28.532  78.269  1.00 26.97           N  
+ATOM   3695  N   GLY B 653      28.292  31.644  74.912  1.00 22.21           N  
+ATOM   3696  CA  GLY B 653      28.302  32.898  74.192  1.00 20.01           C  
+ATOM   3697  C   GLY B 653      27.305  32.838  73.057  1.00 18.18           C  
+ATOM   3698  O   GLY B 653      26.560  31.869  72.918  1.00 17.45           O  
+ATOM   3699  N   LEU B 654      27.313  33.867  72.212  1.00 18.11           N  
+ATOM   3700  CA  LEU B 654      26.372  33.943  71.095  1.00 16.71           C  
+ATOM   3701  C   LEU B 654      26.649  32.891  70.040  1.00 16.22           C  
+ATOM   3702  O   LEU B 654      27.809  32.553  69.755  1.00 16.77           O  
+ATOM   3703  CB  LEU B 654      26.395  35.343  70.470  1.00 17.30           C  
+ATOM   3704  CG  LEU B 654      25.900  36.425  71.432  1.00 17.68           C  
+ATOM   3705  CD1 LEU B 654      26.097  37.812  70.832  1.00 18.63           C  
+ATOM   3706  CD2 LEU B 654      24.447  36.163  71.737  1.00 17.10           C  
+ATOM   3707  N   ARG B 655      25.591  32.386  69.433  1.00 14.24           N  
+ATOM   3708  CA  ARG B 655      25.787  31.381  68.436  1.00 15.57           C  
+ATOM   3709  C   ARG B 655      26.223  31.986  67.102  1.00 15.43           C  
+ATOM   3710  O   ARG B 655      25.984  33.165  66.795  1.00 15.03           O  
+ATOM   3711  CB  ARG B 655      24.529  30.531  68.275  1.00 18.23           C  
+ATOM   3712  CG  ARG B 655      23.440  31.174  67.495  1.00 19.93           C  
+ATOM   3713  CD  ARG B 655      22.447  30.101  67.039  1.00 20.87           C  
+ATOM   3714  NE  ARG B 655      21.558  29.642  68.103  1.00 20.64           N  
+ATOM   3715  CZ  ARG B 655      21.242  28.371  68.321  1.00 23.03           C  
+ATOM   3716  NH1 ARG B 655      21.768  27.413  67.561  1.00 23.81           N  
+ATOM   3717  NH2 ARG B 655      20.299  28.060  69.206  1.00 22.45           N  
+ATOM   3718  N   SER B 656      26.894  31.150  66.337  1.00 15.72           N  
+ATOM   3719  CA  SER B 656      27.361  31.503  65.023  1.00 17.68           C  
+ATOM   3720  C   SER B 656      26.119  31.677  64.126  1.00 17.44           C  
+ATOM   3721  O   SER B 656      25.168  30.895  64.211  1.00 18.38           O  
+ATOM   3722  CB  SER B 656      28.254  30.349  64.532  1.00 20.26           C  
+ATOM   3723  OG  SER B 656      28.464  30.398  63.138  1.00 23.88           O  
+ATOM   3724  N   SER B 657      26.095  32.739  63.332  1.00 15.21           N  
+ATOM   3725  CA  SER B 657      24.997  33.009  62.406  1.00 13.99           C  
+ATOM   3726  C   SER B 657      25.482  34.089  61.450  1.00 13.43           C  
+ATOM   3727  O   SER B 657      26.530  34.680  61.676  1.00 13.32           O  
+ATOM   3728  CB  SER B 657      23.740  33.482  63.123  1.00 13.24           C  
+ATOM   3729  OG  SER B 657      23.880  34.802  63.594  1.00 14.00           O  
+ATOM   3730  N   ILE B 658      24.719  34.373  60.399  1.00 13.79           N  
+ATOM   3731  CA  ILE B 658      25.143  35.386  59.434  1.00 13.30           C  
+ATOM   3732  C   ILE B 658      25.302  36.752  60.092  1.00 12.53           C  
+ATOM   3733  O   ILE B 658      26.301  37.419  59.860  1.00 12.51           O  
+ATOM   3734  CB  ILE B 658      24.220  35.420  58.167  1.00 14.46           C  
+ATOM   3735  CG1 ILE B 658      24.839  36.303  57.092  1.00 16.14           C  
+ATOM   3736  CG2 ILE B 658      22.797  35.874  58.500  1.00 14.70           C  
+ATOM   3737  CD1 ILE B 658      23.978  36.392  55.872  1.00 18.29           C  
+ATOM   3738  N   TRP B 659      24.402  37.105  61.013  1.00 10.81           N  
+ATOM   3739  CA  TRP B 659      24.474  38.393  61.717  1.00 11.08           C  
+ATOM   3740  C   TRP B 659      25.700  38.487  62.653  1.00 11.08           C  
+ATOM   3741  O   TRP B 659      26.455  39.474  62.648  1.00 11.25           O  
+ATOM   3742  CB  TRP B 659      23.194  38.640  62.546  1.00 11.06           C  
+ATOM   3743  CG  TRP B 659      21.916  38.444  61.783  1.00 10.91           C  
+ATOM   3744  CD1 TRP B 659      21.052  37.388  61.874  1.00 10.47           C  
+ATOM   3745  CD2 TRP B 659      21.374  39.327  60.797  1.00 10.96           C  
+ATOM   3746  NE1 TRP B 659      20.002  37.559  61.007  1.00 11.17           N  
+ATOM   3747  CE2 TRP B 659      20.174  38.743  60.328  1.00 11.36           C  
+ATOM   3748  CE3 TRP B 659      21.787  40.554  60.261  1.00 11.25           C  
+ATOM   3749  CZ2 TRP B 659      19.378  39.360  59.332  1.00 11.65           C  
+ATOM   3750  CZ3 TRP B 659      20.996  41.167  59.273  1.00 11.31           C  
+ATOM   3751  CH2 TRP B 659      19.806  40.565  58.823  1.00 10.83           C  
+ATOM   3752  N   ARG B 660      25.889  37.445  63.456  1.00 11.66           N  
+ATOM   3753  CA  ARG B 660      26.990  37.408  64.418  1.00 11.69           C  
+ATOM   3754  C   ARG B 660      28.372  37.384  63.748  1.00 11.69           C  
+ATOM   3755  O   ARG B 660      29.288  38.083  64.177  1.00 11.78           O  
+ATOM   3756  CB  ARG B 660      26.825  36.176  65.336  1.00 11.13           C  
+ATOM   3757  CG  ARG B 660      28.048  35.879  66.226  1.00 11.48           C  
+ATOM   3758  CD  ARG B 660      28.285  36.967  67.234  1.00 11.67           C  
+ATOM   3759  NE  ARG B 660      29.482  36.710  68.068  1.00 13.33           N  
+ATOM   3760  CZ  ARG B 660      30.735  37.084  67.763  1.00 12.99           C  
+ATOM   3761  NH1 ARG B 660      30.987  37.720  66.621  1.00 12.36           N  
+ATOM   3762  NH2 ARG B 660      31.718  36.930  68.642  1.00 11.79           N  
+ATOM   3763  N   ASN B 661      28.504  36.577  62.696  1.00 11.73           N  
+ATOM   3764  CA  ASN B 661      29.795  36.389  62.027  1.00 12.88           C  
+ATOM   3765  C   ASN B 661      30.263  37.596  61.230  1.00 13.43           C  
+ATOM   3766  O   ASN B 661      31.425  38.015  61.338  1.00 13.79           O  
+ATOM   3767  CB  ASN B 661      29.781  35.146  61.119  1.00 14.10           C  
+ATOM   3768  CG  ASN B 661      29.537  33.842  61.880  1.00 14.86           C  
+ATOM   3769  OD1 ASN B 661      29.510  33.816  63.108  1.00 15.44           O  
+ATOM   3770  ND2 ASN B 661      29.315  32.761  61.139  1.00 17.33           N  
+ATOM   3771  N   VAL B 662      29.351  38.160  60.440  1.00 12.43           N  
+ATOM   3772  CA  VAL B 662      29.676  39.325  59.607  1.00 11.46           C  
+ATOM   3773  C   VAL B 662      29.799  40.665  60.374  1.00 11.03           C  
+ATOM   3774  O   VAL B 662      30.749  41.419  60.178  1.00 12.14           O  
+ATOM   3775  CB  VAL B 662      28.634  39.432  58.447  1.00 11.68           C  
+ATOM   3776  CG1 VAL B 662      28.854  40.710  57.624  1.00 12.45           C  
+ATOM   3777  CG2 VAL B 662      28.723  38.213  57.554  1.00 11.85           C  
+ATOM   3778  N   ILE B 663      28.838  40.966  61.243  1.00 10.07           N  
+ATOM   3779  CA  ILE B 663      28.844  42.214  61.984  1.00  9.48           C  
+ATOM   3780  C   ILE B 663      29.800  42.201  63.167  1.00 11.93           C  
+ATOM   3781  O   ILE B 663      30.590  43.125  63.330  1.00 12.90           O  
+ATOM   3782  CB  ILE B 663      27.411  42.600  62.442  1.00  9.16           C  
+ATOM   3783  CG1 ILE B 663      26.531  42.885  61.210  1.00 10.24           C  
+ATOM   3784  CG2 ILE B 663      27.436  43.793  63.339  1.00  8.82           C  
+ATOM   3785  CD1 ILE B 663      25.063  42.981  61.542  1.00 11.32           C  
+ATOM   3786  N   GLY B 664      29.708  41.177  64.018  1.00 11.83           N  
+ATOM   3787  CA  GLY B 664      30.593  41.127  65.164  1.00 11.31           C  
+ATOM   3788  C   GLY B 664      29.832  40.877  66.436  1.00 12.32           C  
+ATOM   3789  O   GLY B 664      28.593  40.756  66.450  1.00 12.20           O  
+ATOM   3790  N   GLN B 665      30.567  40.944  67.534  1.00 12.40           N  
+ATOM   3791  CA  GLN B 665      29.965  40.643  68.816  1.00 14.96           C  
+ATOM   3792  C   GLN B 665      28.862  41.572  69.319  1.00 13.96           C  
+ATOM   3793  O   GLN B 665      28.044  41.146  70.142  1.00 15.64           O  
+ATOM   3794  CB  GLN B 665      31.048  40.498  69.869  1.00 18.67           C  
+ATOM   3795  CG  GLN B 665      31.843  41.760  70.044  1.00 24.40           C  
+ATOM   3796  CD  GLN B 665      32.538  41.800  71.376  1.00 28.62           C  
+ATOM   3797  OE1 GLN B 665      33.054  42.853  71.780  1.00 31.12           O  
+ATOM   3798  NE2 GLN B 665      32.555  40.654  72.086  1.00 30.07           N  
+ATOM   3799  N   ASP B 666      28.803  42.799  68.809  1.00 12.47           N  
+ATOM   3800  CA  ASP B 666      27.822  43.789  69.226  1.00 12.19           C  
+ATOM   3801  C   ASP B 666      26.601  43.922  68.343  1.00 11.12           C  
+ATOM   3802  O   ASP B 666      25.861  44.892  68.485  1.00 12.04           O  
+ATOM   3803  CB  ASP B 666      28.480  45.176  69.299  1.00 14.72           C  
+ATOM   3804  CG  ASP B 666      29.092  45.617  67.962  1.00 16.50           C  
+ATOM   3805  OD1 ASP B 666      29.129  44.821  66.990  1.00 17.17           O  
+ATOM   3806  OD2 ASP B 666      29.551  46.783  67.890  1.00 18.36           O  
+ATOM   3807  N   TYR B 667      26.352  42.962  67.469  1.00 10.69           N  
+ATOM   3808  CA  TYR B 667      25.217  43.094  66.563  1.00  9.88           C  
+ATOM   3809  C   TYR B 667      23.862  43.290  67.237  1.00 10.08           C  
+ATOM   3810  O   TYR B 667      23.039  44.043  66.735  1.00 10.33           O  
+ATOM   3811  CB  TYR B 667      25.203  41.945  65.560  1.00 10.20           C  
+ATOM   3812  CG  TYR B 667      24.550  40.665  66.033  1.00 10.07           C  
+ATOM   3813  CD1 TYR B 667      25.260  39.712  66.767  1.00 10.11           C  
+ATOM   3814  CD2 TYR B 667      23.229  40.375  65.676  1.00 10.82           C  
+ATOM   3815  CE1 TYR B 667      24.661  38.503  67.118  1.00 10.19           C  
+ATOM   3816  CE2 TYR B 667      22.634  39.174  66.015  1.00 10.04           C  
+ATOM   3817  CZ  TYR B 667      23.352  38.249  66.729  1.00 10.53           C  
+ATOM   3818  OH  TYR B 667      22.738  37.052  67.017  1.00 12.33           O  
+ATOM   3819  N   LEU B 668      23.653  42.679  68.414  1.00  9.75           N  
+ATOM   3820  CA  LEU B 668      22.369  42.811  69.126  1.00  9.70           C  
+ATOM   3821  C   LEU B 668      22.126  44.212  69.708  1.00 10.27           C  
+ATOM   3822  O   LEU B 668      20.966  44.675  69.781  1.00 10.06           O  
+ATOM   3823  CB  LEU B 668      22.178  41.711  70.208  1.00 12.22           C  
+ATOM   3824  CG  LEU B 668      21.806  40.262  69.820  1.00 12.76           C  
+ATOM   3825  CD1 LEU B 668      21.511  39.436  71.082  1.00 13.67           C  
+ATOM   3826  CD2 LEU B 668      20.573  40.239  68.953  1.00 13.16           C  
+ATOM   3827  N   ASP B 669      23.202  44.906  70.111  1.00 10.21           N  
+ATOM   3828  CA  ASP B 669      23.038  46.280  70.613  1.00 11.23           C  
+ATOM   3829  C   ASP B 669      22.387  47.147  69.507  1.00 10.26           C  
+ATOM   3830  O   ASP B 669      21.503  47.953  69.782  1.00 10.52           O  
+ATOM   3831  CB  ASP B 669      24.379  46.906  71.018  1.00 13.16           C  
+ATOM   3832  CG  ASP B 669      24.997  46.258  72.258  1.00 15.42           C  
+ATOM   3833  OD1 ASP B 669      24.367  45.385  72.887  1.00 16.23           O  
+ATOM   3834  OD2 ASP B 669      26.144  46.616  72.574  1.00 17.42           O  
+ATOM   3835  N   TYR B 670      22.812  46.937  68.257  1.00 10.27           N  
+ATOM   3836  CA  TYR B 670      22.260  47.673  67.096  1.00 10.00           C  
+ATOM   3837  C   TYR B 670      20.797  47.301  66.786  1.00  8.66           C  
+ATOM   3838  O   TYR B 670      19.973  48.169  66.555  1.00  9.29           O  
+ATOM   3839  CB  TYR B 670      23.111  47.429  65.850  1.00 11.85           C  
+ATOM   3840  CG  TYR B 670      24.428  48.165  65.903  1.00 15.11           C  
+ATOM   3841  CD1 TYR B 670      24.505  49.495  65.488  1.00 17.50           C  
+ATOM   3842  CD2 TYR B 670      25.576  47.560  66.425  1.00 16.66           C  
+ATOM   3843  CE1 TYR B 670      25.697  50.216  65.597  1.00 20.33           C  
+ATOM   3844  CE2 TYR B 670      26.779  48.276  66.541  1.00 19.78           C  
+ATOM   3845  CZ  TYR B 670      26.829  49.604  66.126  1.00 21.26           C  
+ATOM   3846  OH  TYR B 670      27.994  50.349  66.252  1.00 23.68           O  
+ATOM   3847  N   ALA B 671      20.478  46.004  66.798  1.00  8.48           N  
+ATOM   3848  CA  ALA B 671      19.109  45.542  66.528  1.00  7.62           C  
+ATOM   3849  C   ALA B 671      18.139  46.232  67.476  1.00  7.76           C  
+ATOM   3850  O   ALA B 671      17.111  46.742  67.057  1.00  8.09           O  
+ATOM   3851  CB  ALA B 671      19.019  44.032  66.671  1.00  7.55           C  
+ATOM   3852  N   PHE B 672      18.462  46.228  68.775  1.00  7.93           N  
+ATOM   3853  CA  PHE B 672      17.602  46.860  69.762  1.00  8.10           C  
+ATOM   3854  C   PHE B 672      17.533  48.389  69.640  1.00  8.52           C  
+ATOM   3855  O   PHE B 672      16.459  48.966  69.801  1.00  9.28           O  
+ATOM   3856  CB  PHE B 672      17.966  46.400  71.182  1.00  8.38           C  
+ATOM   3857  CG  PHE B 672      17.426  45.022  71.517  1.00  8.10           C  
+ATOM   3858  CD1 PHE B 672      16.140  44.868  72.047  1.00  8.55           C  
+ATOM   3859  CD2 PHE B 672      18.180  43.867  71.249  1.00  9.00           C  
+ATOM   3860  CE1 PHE B 672      15.616  43.580  72.298  1.00  8.19           C  
+ATOM   3861  CE2 PHE B 672      17.651  42.570  71.500  1.00  8.79           C  
+ATOM   3862  CZ  PHE B 672      16.366  42.449  72.021  1.00  8.26           C  
+ATOM   3863  N   ARG B 673      18.666  49.042  69.351  1.00  9.58           N  
+ATOM   3864  CA  ARG B 673      18.657  50.508  69.159  1.00 11.70           C  
+ATOM   3865  C   ARG B 673      17.779  50.892  67.945  1.00  9.95           C  
+ATOM   3866  O   ARG B 673      16.962  51.812  68.027  1.00 11.11           O  
+ATOM   3867  CB  ARG B 673      20.077  51.067  68.987  1.00 13.66           C  
+ATOM   3868  CG  ARG B 673      20.870  51.100  70.281  1.00 19.60           C  
+ATOM   3869  CD  ARG B 673      22.151  51.928  70.161  1.00 23.96           C  
+ATOM   3870  NE  ARG B 673      23.360  51.175  70.526  1.00 29.34           N  
+ATOM   3871  CZ  ARG B 673      23.883  51.093  71.757  1.00 31.65           C  
+ATOM   3872  NH1 ARG B 673      23.300  51.712  72.796  1.00 33.06           N  
+ATOM   3873  NH2 ARG B 673      25.058  50.476  71.937  1.00 32.22           N  
+ATOM   3874  N   TYR B 674      17.911  50.144  66.849  1.00  9.56           N  
+ATOM   3875  CA  TYR B 674      17.117  50.401  65.636  1.00 10.17           C  
+ATOM   3876  C   TYR B 674      15.637  50.216  65.910  1.00 10.03           C  
+ATOM   3877  O   TYR B 674      14.807  50.997  65.440  1.00 10.31           O  
+ATOM   3878  CB  TYR B 674      17.519  49.480  64.480  1.00 10.16           C  
+ATOM   3879  CG  TYR B 674      18.921  49.672  63.980  1.00 10.56           C  
+ATOM   3880  CD1 TYR B 674      19.576  50.889  64.126  1.00 11.90           C  
+ATOM   3881  CD2 TYR B 674      19.575  48.639  63.318  1.00 10.39           C  
+ATOM   3882  CE1 TYR B 674      20.874  51.071  63.609  1.00 12.59           C  
+ATOM   3883  CE2 TYR B 674      20.841  48.803  62.792  1.00 12.01           C  
+ATOM   3884  CZ  TYR B 674      21.493  50.022  62.935  1.00 12.37           C  
+ATOM   3885  OH  TYR B 674      22.745  50.188  62.363  1.00 13.88           O  
+ATOM   3886  N   ALA B 675      15.303  49.178  66.680  1.00  9.09           N  
+ATOM   3887  CA  ALA B 675      13.903  48.911  67.009  1.00  8.90           C  
+ATOM   3888  C   ALA B 675      13.275  49.994  67.871  1.00  8.27           C  
+ATOM   3889  O   ALA B 675      12.118  50.383  67.657  1.00  9.81           O  
+ATOM   3890  CB  ALA B 675      13.776  47.547  67.700  1.00  8.30           C  
+ATOM   3891  N   ARG B 676      14.032  50.473  68.848  1.00  8.88           N  
+ATOM   3892  CA  ARG B 676      13.541  51.504  69.740  1.00 10.75           C  
+ATOM   3893  C   ARG B 676      13.240  52.772  68.934  1.00 12.58           C  
+ATOM   3894  O   ARG B 676      12.203  53.409  69.145  1.00 13.93           O  
+ATOM   3895  CB  ARG B 676      14.544  51.796  70.874  1.00 10.88           C  
+ATOM   3896  CG  ARG B 676      14.094  52.972  71.760  1.00 11.56           C  
+ATOM   3897  CD  ARG B 676      12.809  52.660  72.561  1.00 13.67           C  
+ATOM   3898  NE  ARG B 676      13.175  52.159  73.886  1.00 15.94           N  
+ATOM   3899  CZ  ARG B 676      12.643  51.098  74.499  1.00 17.18           C  
+ATOM   3900  NH1 ARG B 676      11.669  50.379  73.929  1.00 15.82           N  
+ATOM   3901  NH2 ARG B 676      13.148  50.722  75.687  1.00 17.84           N  
+ATOM   3902  N   GLU B 677      14.098  53.098  67.974  1.00 14.35           N  
+ATOM   3903  CA  GLU B 677      13.864  54.303  67.154  1.00 17.65           C  
+ATOM   3904  C   GLU B 677      12.631  54.157  66.237  1.00 16.14           C  
+ATOM   3905  O   GLU B 677      11.896  55.131  66.017  1.00 16.57           O  
+ATOM   3906  CB  GLU B 677      15.080  54.615  66.269  1.00 21.71           C  
+ATOM   3907  CG  GLU B 677      16.348  55.060  66.984  1.00 28.77           C  
+ATOM   3908  CD  GLU B 677      17.641  54.817  66.129  1.00 33.03           C  
+ATOM   3909  OE1 GLU B 677      17.570  54.865  64.862  1.00 35.20           O  
+ATOM   3910  OE2 GLU B 677      18.724  54.551  66.732  1.00 35.50           O  
+ATOM   3911  N   ALA B 678      12.403  52.955  65.708  1.00 13.53           N  
+ATOM   3912  CA  ALA B 678      11.284  52.732  64.789  1.00 12.75           C  
+ATOM   3913  C   ALA B 678       9.926  52.833  65.448  1.00 13.57           C  
+ATOM   3914  O   ALA B 678       8.974  53.340  64.846  1.00 13.94           O  
+ATOM   3915  CB  ALA B 678      11.430  51.394  64.071  1.00 12.51           C  
+ATOM   3916  N   ASP B 679       9.803  52.288  66.652  1.00 12.44           N  
+ATOM   3917  CA  ASP B 679       8.544  52.375  67.349  1.00 12.87           C  
+ATOM   3918  C   ASP B 679       8.856  52.459  68.831  1.00 15.16           C  
+ATOM   3919  O   ASP B 679       9.030  51.457  69.502  1.00 13.57           O  
+ATOM   3920  CB  ASP B 679       7.629  51.188  67.030  1.00 12.46           C  
+ATOM   3921  CG  ASP B 679       6.274  51.280  67.730  1.00 12.88           C  
+ATOM   3922  OD1 ASP B 679       6.028  52.240  68.509  1.00 13.38           O  
+ATOM   3923  OD2 ASP B 679       5.440  50.378  67.478  1.00 13.76           O  
+ATOM   3924  N   PRO B 680       8.880  53.680  69.365  1.00 17.05           N  
+ATOM   3925  CA  PRO B 680       9.165  53.962  70.776  1.00 17.95           C  
+ATOM   3926  C   PRO B 680       8.141  53.373  71.753  1.00 17.24           C  
+ATOM   3927  O   PRO B 680       8.430  53.252  72.936  1.00 18.25           O  
+ATOM   3928  CB  PRO B 680       9.126  55.490  70.834  1.00 18.71           C  
+ATOM   3929  CG  PRO B 680       9.440  55.913  69.428  1.00 20.37           C  
+ATOM   3930  CD  PRO B 680       8.648  54.924  68.617  1.00 18.67           C  
+ATOM   3931  N   ASP B 681       6.946  53.040  71.267  1.00 17.74           N  
+ATOM   3932  CA  ASP B 681       5.887  52.490  72.129  1.00 18.45           C  
+ATOM   3933  C   ASP B 681       5.852  50.968  72.283  1.00 17.23           C  
+ATOM   3934  O   ASP B 681       5.142  50.464  73.158  1.00 16.95           O  
+ATOM   3935  CB  ASP B 681       4.513  52.997  71.687  1.00 21.21           C  
+ATOM   3936  CG  ASP B 681       4.408  54.540  71.729  1.00 25.17           C  
+ATOM   3937  OD1 ASP B 681       4.975  55.167  72.660  1.00 26.58           O  
+ATOM   3938  OD2 ASP B 681       3.762  55.125  70.824  1.00 27.13           O  
+ATOM   3939  N   ALA B 682       6.612  50.248  71.454  1.00 13.98           N  
+ATOM   3940  CA  ALA B 682       6.659  48.789  71.513  1.00 12.50           C  
+ATOM   3941  C   ALA B 682       7.575  48.310  72.631  1.00 12.91           C  
+ATOM   3942  O   ALA B 682       8.613  48.941  72.910  1.00 12.82           O  
+ATOM   3943  CB  ALA B 682       7.158  48.228  70.204  1.00 12.34           C  
+ATOM   3944  N   LEU B 683       7.199  47.204  73.283  1.00 11.28           N  
+ATOM   3945  CA  LEU B 683       8.067  46.610  74.314  1.00 10.10           C  
+ATOM   3946  C   LEU B 683       8.967  45.681  73.511  1.00  9.22           C  
+ATOM   3947  O   LEU B 683       8.477  44.869  72.723  1.00 10.13           O  
+ATOM   3948  CB  LEU B 683       7.256  45.818  75.342  1.00 10.61           C  
+ATOM   3949  CG  LEU B 683       6.375  46.738  76.175  1.00 12.04           C  
+ATOM   3950  CD1 LEU B 683       5.394  45.872  76.989  1.00 13.23           C  
+ATOM   3951  CD2 LEU B 683       7.240  47.665  77.047  1.00 13.96           C  
+ATOM   3952  N   LEU B 684      10.274  45.798  73.700  1.00  8.11           N  
+ATOM   3953  CA  LEU B 684      11.256  45.028  72.945  1.00  7.87           C  
+ATOM   3954  C   LEU B 684      11.744  43.823  73.730  1.00  7.93           C  
+ATOM   3955  O   LEU B 684      12.244  43.990  74.839  1.00  8.95           O  
+ATOM   3956  CB  LEU B 684      12.452  45.934  72.572  1.00  7.86           C  
+ATOM   3957  CG  LEU B 684      12.090  47.261  71.873  1.00  8.50           C  
+ATOM   3958  CD1 LEU B 684      13.356  47.992  71.512  1.00  9.99           C  
+ATOM   3959  CD2 LEU B 684      11.201  46.970  70.640  1.00  7.93           C  
+ATOM   3960  N   PHE B 685      11.701  42.645  73.105  1.00  7.56           N  
+ATOM   3961  CA  PHE B 685      12.086  41.366  73.746  1.00  7.46           C  
+ATOM   3962  C   PHE B 685      13.190  40.579  73.066  1.00  8.44           C  
+ATOM   3963  O   PHE B 685      13.348  40.607  71.829  1.00  8.27           O  
+ATOM   3964  CB  PHE B 685      10.868  40.403  73.755  1.00  8.01           C  
+ATOM   3965  CG  PHE B 685       9.815  40.730  74.786  1.00  8.44           C  
+ATOM   3966  CD1 PHE B 685       8.981  41.839  74.637  1.00  9.16           C  
+ATOM   3967  CD2 PHE B 685       9.698  39.953  75.944  1.00  9.56           C  
+ATOM   3968  CE1 PHE B 685       8.057  42.188  75.619  1.00 10.18           C  
+ATOM   3969  CE2 PHE B 685       8.767  40.298  76.946  1.00 10.55           C  
+ATOM   3970  CZ  PHE B 685       7.952  41.416  76.787  1.00 10.25           C  
+ATOM   3971  N   TYR B 686      13.940  39.865  73.887  1.00  7.46           N  
+ATOM   3972  CA  TYR B 686      14.928  38.897  73.437  1.00  7.95           C  
+ATOM   3973  C   TYR B 686      14.172  37.582  73.782  1.00  8.47           C  
+ATOM   3974  O   TYR B 686      13.762  37.401  74.939  1.00  9.09           O  
+ATOM   3975  CB  TYR B 686      16.220  38.986  74.236  1.00  7.80           C  
+ATOM   3976  CG  TYR B 686      17.156  37.848  73.919  1.00  9.32           C  
+ATOM   3977  CD1 TYR B 686      17.921  37.843  72.751  1.00 10.49           C  
+ATOM   3978  CD2 TYR B 686      17.181  36.696  74.722  1.00  9.33           C  
+ATOM   3979  CE1 TYR B 686      18.663  36.721  72.384  1.00 11.33           C  
+ATOM   3980  CE2 TYR B 686      17.920  35.587  74.365  1.00  9.79           C  
+ATOM   3981  CZ  TYR B 686      18.650  35.600  73.196  1.00 11.43           C  
+ATOM   3982  OH  TYR B 686      19.318  34.474  72.808  1.00 12.88           O  
+ATOM   3983  N   ASN B 687      13.990  36.688  72.809  1.00  7.37           N  
+ATOM   3984  CA  ASN B 687      13.208  35.452  72.982  1.00  7.43           C  
+ATOM   3985  C   ASN B 687      14.121  34.216  72.796  1.00  8.97           C  
+ATOM   3986  O   ASN B 687      14.928  34.173  71.854  1.00  9.40           O  
+ATOM   3987  CB  ASN B 687      12.056  35.478  71.936  1.00  7.96           C  
+ATOM   3988  CG  ASN B 687      11.060  34.315  72.085  1.00  9.11           C  
+ATOM   3989  OD1 ASN B 687      10.861  33.506  71.161  1.00 10.19           O  
+ATOM   3990  ND2 ASN B 687      10.405  34.260  73.220  1.00  8.05           N  
+ATOM   3991  N   ASP B 688      13.999  33.204  73.666  1.00  8.15           N  
+ATOM   3992  CA  ASP B 688      14.862  32.014  73.554  1.00  8.37           C  
+ATOM   3993  C   ASP B 688      14.244  30.810  74.325  1.00  8.87           C  
+ATOM   3994  O   ASP B 688      13.250  30.964  75.056  1.00  8.64           O  
+ATOM   3995  CB  ASP B 688      16.275  32.319  74.126  1.00  8.61           C  
+ATOM   3996  CG  ASP B 688      17.407  31.617  73.369  1.00  8.78           C  
+ATOM   3997  OD1 ASP B 688      17.213  30.572  72.733  1.00  9.86           O  
+ATOM   3998  OD2 ASP B 688      18.541  32.124  73.395  1.00 11.65           O  
+ATOM   3999  N   TYR B 689      14.787  29.621  74.048  1.00  9.44           N  
+ATOM   4000  CA  TYR B 689      14.363  28.385  74.703  1.00 10.15           C  
+ATOM   4001  C   TYR B 689      15.478  27.899  75.670  1.00 10.54           C  
+ATOM   4002  O   TYR B 689      16.660  28.237  75.537  1.00  9.98           O  
+ATOM   4003  CB  TYR B 689      14.011  27.298  73.686  1.00 10.64           C  
+ATOM   4004  CG  TYR B 689      15.154  26.863  72.807  1.00 12.46           C  
+ATOM   4005  CD1 TYR B 689      16.035  25.850  73.213  1.00 13.22           C  
+ATOM   4006  CD2 TYR B 689      15.402  27.498  71.582  1.00 13.29           C  
+ATOM   4007  CE1 TYR B 689      17.144  25.491  72.430  1.00 14.11           C  
+ATOM   4008  CE2 TYR B 689      16.491  27.145  70.796  1.00 14.28           C  
+ATOM   4009  CZ  TYR B 689      17.367  26.146  71.224  1.00 15.76           C  
+ATOM   4010  OH  TYR B 689      18.484  25.840  70.457  1.00 17.07           O  
+ATOM   4011  N   ASN B 690      15.072  27.086  76.638  1.00 12.08           N  
+ATOM   4012  CA  ASN B 690      15.973  26.562  77.647  1.00 12.91           C  
+ATOM   4013  C   ASN B 690      16.693  27.651  78.431  1.00 12.35           C  
+ATOM   4014  O   ASN B 690      17.846  27.479  78.828  1.00 12.87           O  
+ATOM   4015  CB  ASN B 690      16.957  25.543  77.075  1.00 16.85           C  
+ATOM   4016  CG  ASN B 690      17.572  24.662  78.168  1.00 22.48           C  
+ATOM   4017  OD1 ASN B 690      16.922  24.382  79.210  1.00 25.36           O  
+ATOM   4018  ND2 ASN B 690      18.827  24.240  77.964  1.00 24.04           N  
+ATOM   4019  N   ILE B 691      15.990  28.761  78.686  1.00 10.98           N  
+ATOM   4020  CA  ILE B 691      16.533  29.882  79.485  1.00  9.94           C  
+ATOM   4021  C   ILE B 691      15.580  30.184  80.661  1.00 10.20           C  
+ATOM   4022  O   ILE B 691      15.709  31.199  81.332  1.00 11.07           O  
+ATOM   4023  CB  ILE B 691      16.708  31.182  78.638  1.00  9.80           C  
+ATOM   4024  CG1 ILE B 691      15.350  31.632  78.076  1.00  9.14           C  
+ATOM   4025  CG2 ILE B 691      17.779  30.953  77.536  1.00 10.15           C  
+ATOM   4026  CD1 ILE B 691      15.337  33.064  77.621  1.00 10.14           C  
+ATOM   4027  N   GLU B 692      14.644  29.270  80.920  1.00  9.37           N  
+ATOM   4028  CA  GLU B 692      13.645  29.459  81.974  1.00 10.91           C  
+ATOM   4029  C   GLU B 692      14.082  29.116  83.401  1.00 10.68           C  
+ATOM   4030  O   GLU B 692      13.560  29.692  84.352  1.00 11.85           O  
+ATOM   4031  CB  GLU B 692      12.388  28.646  81.657  1.00 11.61           C  
+ATOM   4032  CG  GLU B 692      11.754  28.957  80.292  1.00 11.88           C  
+ATOM   4033  CD  GLU B 692      12.297  28.116  79.150  1.00 12.28           C  
+ATOM   4034  OE1 GLU B 692      13.223  27.287  79.338  1.00 12.71           O  
+ATOM   4035  OE2 GLU B 692      11.770  28.272  78.030  1.00 13.89           O  
+ATOM   4036  N   ASP B 693      15.022  28.189  83.531  1.00 11.68           N  
+ATOM   4037  CA  ASP B 693      15.489  27.731  84.863  1.00 12.97           C  
+ATOM   4038  C   ASP B 693      16.680  28.550  85.359  1.00 12.88           C  
+ATOM   4039  O   ASP B 693      16.764  29.757  85.077  1.00 12.52           O  
+ATOM   4040  CB  ASP B 693      15.807  26.224  84.805  1.00 14.04           C  
+ATOM   4041  CG  ASP B 693      16.938  25.870  83.809  1.00 15.65           C  
+ATOM   4042  OD1 ASP B 693      17.634  26.765  83.283  1.00 15.60           O  
+ATOM   4043  OD2 ASP B 693      17.135  24.660  83.529  1.00 17.74           O  
+ATOM   4044  N   LEU B 694      17.552  27.929  86.159  1.00 12.21           N  
+ATOM   4045  CA  LEU B 694      18.758  28.618  86.636  1.00 12.19           C  
+ATOM   4046  C   LEU B 694      20.037  27.912  86.112  1.00 12.27           C  
+ATOM   4047  O   LEU B 694      21.113  27.988  86.707  1.00 13.93           O  
+ATOM   4048  CB  LEU B 694      18.749  28.752  88.170  1.00 11.38           C  
+ATOM   4049  CG  LEU B 694      17.626  29.604  88.766  1.00 12.07           C  
+ATOM   4050  CD1 LEU B 694      17.505  29.368  90.298  1.00 13.14           C  
+ATOM   4051  CD2 LEU B 694      17.836  31.097  88.431  1.00 12.37           C  
+ATOM   4052  N   GLY B 695      19.920  27.255  84.968  1.00 12.16           N  
+ATOM   4053  CA  GLY B 695      21.049  26.557  84.380  1.00 12.78           C  
+ATOM   4054  C   GLY B 695      22.040  27.450  83.626  1.00 13.66           C  
+ATOM   4055  O   GLY B 695      21.825  28.661  83.500  1.00 13.73           O  
+ATOM   4056  N   PRO B 696      23.069  26.857  82.998  1.00 14.68           N  
+ATOM   4057  CA  PRO B 696      24.088  27.627  82.249  1.00 15.00           C  
+ATOM   4058  C   PRO B 696      23.554  28.590  81.163  1.00 13.65           C  
+ATOM   4059  O   PRO B 696      23.955  29.755  81.131  1.00 13.72           O  
+ATOM   4060  CB  PRO B 696      24.993  26.531  81.655  1.00 15.71           C  
+ATOM   4061  CG  PRO B 696      24.823  25.369  82.628  1.00 17.35           C  
+ATOM   4062  CD  PRO B 696      23.361  25.405  82.979  1.00 15.69           C  
+ATOM   4063  N   LYS B 697      22.676  28.105  80.285  1.00 12.21           N  
+ATOM   4064  CA  LYS B 697      22.130  28.957  79.229  1.00 11.52           C  
+ATOM   4065  C   LYS B 697      21.305  30.094  79.822  1.00 12.02           C  
+ATOM   4066  O   LYS B 697      21.386  31.229  79.353  1.00 12.65           O  
+ATOM   4067  CB  LYS B 697      21.280  28.157  78.257  1.00 10.45           C  
+ATOM   4068  CG  LYS B 697      21.049  28.902  76.920  1.00 11.25           C  
+ATOM   4069  CD  LYS B 697      20.106  28.129  76.033  1.00 10.63           C  
+ATOM   4070  CE  LYS B 697      19.905  28.803  74.657  1.00 11.19           C  
+ATOM   4071  NZ  LYS B 697      18.918  28.046  73.852  1.00 10.42           N  
+ATOM   4072  N   SER B 698      20.481  29.799  80.831  1.00 11.81           N  
+ATOM   4073  CA  SER B 698      19.683  30.833  81.494  1.00 10.89           C  
+ATOM   4074  C   SER B 698      20.570  31.938  82.137  1.00 11.77           C  
+ATOM   4075  O   SER B 698      20.271  33.152  82.040  1.00 11.16           O  
+ATOM   4076  CB  SER B 698      18.777  30.216  82.574  1.00 10.87           C  
+ATOM   4077  OG  SER B 698      18.252  31.229  83.410  1.00 10.80           O  
+ATOM   4078  N   ASN B 699      21.647  31.522  82.810  1.00 11.27           N  
+ATOM   4079  CA  ASN B 699      22.543  32.500  83.440  1.00 12.24           C  
+ATOM   4080  C   ASN B 699      23.243  33.368  82.400  1.00 12.28           C  
+ATOM   4081  O   ASN B 699      23.464  34.555  82.639  1.00 13.18           O  
+ATOM   4082  CB  ASN B 699      23.588  31.818  84.325  1.00 13.86           C  
+ATOM   4083  CG  ASN B 699      22.960  31.051  85.484  1.00 15.00           C  
+ATOM   4084  OD1 ASN B 699      21.883  31.399  85.979  1.00 14.79           O  
+ATOM   4085  ND2 ASN B 699      23.614  29.967  85.880  1.00 16.53           N  
+ATOM   4086  N   ALA B 700      23.632  32.761  81.276  1.00 12.63           N  
+ATOM   4087  CA  ALA B 700      24.295  33.498  80.165  1.00 13.10           C  
+ATOM   4088  C   ALA B 700      23.346  34.582  79.607  1.00 12.50           C  
+ATOM   4089  O   ALA B 700      23.754  35.725  79.417  1.00 12.67           O  
+ATOM   4090  CB  ALA B 700      24.736  32.529  79.050  1.00 12.51           C  
+ATOM   4091  N   VAL B 701      22.076  34.247  79.389  1.00 11.96           N  
+ATOM   4092  CA  VAL B 701      21.106  35.224  78.886  1.00 11.40           C  
+ATOM   4093  C   VAL B 701      20.800  36.307  79.927  1.00 11.83           C  
+ATOM   4094  O   VAL B 701      20.739  37.499  79.604  1.00 12.54           O  
+ATOM   4095  CB  VAL B 701      19.824  34.532  78.356  1.00 11.59           C  
+ATOM   4096  CG1 VAL B 701      18.707  35.541  78.109  1.00 10.70           C  
+ATOM   4097  CG2 VAL B 701      20.159  33.727  77.090  1.00 10.92           C  
+ATOM   4098  N   PHE B 702      20.667  35.921  81.195  1.00 10.74           N  
+ATOM   4099  CA  PHE B 702      20.424  36.914  82.233  1.00 11.38           C  
+ATOM   4100  C   PHE B 702      21.606  37.927  82.291  1.00 11.37           C  
+ATOM   4101  O   PHE B 702      21.395  39.133  82.342  1.00 11.85           O  
+ATOM   4102  CB  PHE B 702      20.204  36.233  83.605  1.00 11.28           C  
+ATOM   4103  CG  PHE B 702      20.147  37.200  84.744  1.00 10.78           C  
+ATOM   4104  CD1 PHE B 702      18.998  37.917  85.000  1.00 11.62           C  
+ATOM   4105  CD2 PHE B 702      21.272  37.441  85.514  1.00 11.35           C  
+ATOM   4106  CE1 PHE B 702      18.957  38.877  86.013  1.00 12.29           C  
+ATOM   4107  CE2 PHE B 702      21.236  38.399  86.523  1.00 12.56           C  
+ATOM   4108  CZ  PHE B 702      20.076  39.115  86.769  1.00 12.23           C  
+ATOM   4109  N   ASN B 703      22.837  37.426  82.321  1.00 13.04           N  
+ATOM   4110  CA  ASN B 703      24.022  38.306  82.368  1.00 14.48           C  
+ATOM   4111  C   ASN B 703      24.059  39.228  81.126  1.00 14.60           C  
+ATOM   4112  O   ASN B 703      24.353  40.416  81.250  1.00 14.54           O  
+ATOM   4113  CB  ASN B 703      25.334  37.494  82.476  1.00 17.09           C  
+ATOM   4114  CG  ASN B 703      25.473  36.744  83.821  1.00 20.04           C  
+ATOM   4115  OD1 ASN B 703      25.000  37.207  84.850  1.00 20.78           O  
+ATOM   4116  ND2 ASN B 703      26.149  35.587  83.797  1.00 22.33           N  
+ATOM   4117  N   MET B 704      23.767  38.673  79.944  1.00 14.23           N  
+ATOM   4118  CA  MET B 704      23.755  39.457  78.710  1.00 14.02           C  
+ATOM   4119  C   MET B 704      22.765  40.604  78.831  1.00 13.16           C  
+ATOM   4120  O   MET B 704      23.086  41.760  78.548  1.00 13.49           O  
+ATOM   4121  CB  MET B 704      23.352  38.594  77.516  1.00 14.46           C  
+ATOM   4122  CG  MET B 704      23.258  39.411  76.217  1.00 15.96           C  
+ATOM   4123  SD  MET B 704      22.794  38.421  74.800  1.00 18.48           S  
+ATOM   4124  CE  MET B 704      21.079  38.288  75.044  1.00 17.01           C  
+ATOM   4125  N   ILE B 705      21.555  40.287  79.274  1.00 11.75           N  
+ATOM   4126  CA  ILE B 705      20.519  41.286  79.406  1.00 12.82           C  
+ATOM   4127  C   ILE B 705      20.848  42.303  80.496  1.00 13.76           C  
+ATOM   4128  O   ILE B 705      20.622  43.502  80.325  1.00 14.33           O  
+ATOM   4129  CB  ILE B 705      19.129  40.630  79.599  1.00 11.77           C  
+ATOM   4130  CG1 ILE B 705      18.767  39.854  78.317  1.00 11.57           C  
+ATOM   4131  CG2 ILE B 705      18.108  41.683  79.994  1.00 11.98           C  
+ATOM   4132  CD1 ILE B 705      17.448  39.162  78.358  1.00 12.17           C  
+ATOM   4133  N   LYS B 706      21.443  41.826  81.589  1.00 14.31           N  
+ATOM   4134  CA  LYS B 706      21.827  42.716  82.671  1.00 15.58           C  
+ATOM   4135  C   LYS B 706      22.849  43.726  82.163  1.00 14.92           C  
+ATOM   4136  O   LYS B 706      22.726  44.905  82.414  1.00 15.58           O  
+ATOM   4137  CB  LYS B 706      22.422  41.918  83.821  1.00 16.08           C  
+ATOM   4138  CG  LYS B 706      22.738  42.768  85.015  1.00 18.75           C  
+ATOM   4139  CD  LYS B 706      23.272  41.889  86.122  1.00 22.23           C  
+ATOM   4140  CE  LYS B 706      23.824  42.740  87.258  1.00 25.37           C  
+ATOM   4141  NZ  LYS B 706      22.818  43.732  87.779  1.00 26.98           N  
+ATOM   4142  N   SER B 707      23.825  43.251  81.410  1.00 15.08           N  
+ATOM   4143  CA  SER B 707      24.865  44.096  80.868  1.00 16.51           C  
+ATOM   4144  C   SER B 707      24.305  45.113  79.880  1.00 17.16           C  
+ATOM   4145  O   SER B 707      24.687  46.289  79.918  1.00 17.21           O  
+ATOM   4146  CB  SER B 707      25.924  43.239  80.195  1.00 17.56           C  
+ATOM   4147  OG  SER B 707      26.993  44.040  79.724  1.00 21.02           O  
+ATOM   4148  N   MET B 708      23.405  44.668  79.008  1.00 16.82           N  
+ATOM   4149  CA  MET B 708      22.788  45.564  78.034  1.00 18.53           C  
+ATOM   4150  C   MET B 708      22.071  46.692  78.758  1.00 19.86           C  
+ATOM   4151  O   MET B 708      22.191  47.859  78.371  1.00 20.74           O  
+ATOM   4152  CB  MET B 708      21.798  44.816  77.146  1.00 18.75           C  
+ATOM   4153  CG  MET B 708      22.433  43.926  76.078  1.00 20.22           C  
+ATOM   4154  SD  MET B 708      21.141  42.885  75.241  1.00 22.08           S  
+ATOM   4155  CE  MET B 708      20.147  44.077  74.481  1.00 23.05           C  
+ATOM   4156  N   LYS B 709      21.321  46.356  79.805  1.00 20.98           N  
+ATOM   4157  CA  LYS B 709      20.605  47.359  80.601  1.00 23.83           C  
+ATOM   4158  C   LYS B 709      21.615  48.358  81.215  1.00 24.74           C  
+ATOM   4159  O   LYS B 709      21.373  49.579  81.201  1.00 26.11           O  
+ATOM   4160  CB  LYS B 709      19.787  46.687  81.735  1.00 24.85           C  
+ATOM   4161  CG  LYS B 709      18.375  46.248  81.389  1.00 24.93           C  
+ATOM   4162  CD  LYS B 709      17.486  47.456  81.329  1.00 25.73           C  
+ATOM   4163  CE  LYS B 709      16.055  47.090  81.096  1.00 26.19           C  
+ATOM   4164  NZ  LYS B 709      15.243  48.254  80.665  1.00 27.07           N  
+ATOM   4165  N   GLU B 710      22.736  47.846  81.728  1.00 24.72           N  
+ATOM   4166  CA  GLU B 710      23.773  48.682  82.357  1.00 26.83           C  
+ATOM   4167  C   GLU B 710      24.438  49.651  81.368  1.00 26.23           C  
+ATOM   4168  O   GLU B 710      24.886  50.728  81.773  1.00 26.73           O  
+ATOM   4169  CB  GLU B 710      24.881  47.828  82.994  1.00 28.59           C  
+ATOM   4170  CG  GLU B 710      24.546  47.057  84.258  1.00 31.62           C  
+ATOM   4171  CD  GLU B 710      25.799  46.373  84.825  1.00 34.03           C  
+ATOM   4172  OE1 GLU B 710      26.276  45.376  84.226  1.00 34.95           O  
+ATOM   4173  OE2 GLU B 710      26.345  46.867  85.843  1.00 36.16           O  
+ATOM   4174  N   ARG B 711      24.577  49.225  80.108  1.00 24.14           N  
+ATOM   4175  CA  ARG B 711      25.176  50.036  79.043  1.00 22.55           C  
+ATOM   4176  C   ARG B 711      24.196  50.922  78.262  1.00 21.80           C  
+ATOM   4177  O   ARG B 711      24.581  51.482  77.239  1.00 23.59           O  
+ATOM   4178  CB  ARG B 711      25.918  49.136  78.065  1.00 22.61           C  
+ATOM   4179  CG  ARG B 711      26.950  48.323  78.775  1.00 23.96           C  
+ATOM   4180  CD  ARG B 711      27.713  47.452  77.851  1.00 24.34           C  
+ATOM   4181  NE  ARG B 711      26.933  46.313  77.378  1.00 24.68           N  
+ATOM   4182  CZ  ARG B 711      26.481  46.218  76.140  1.00 23.77           C  
+ATOM   4183  NH1 ARG B 711      26.698  47.220  75.300  1.00 22.90           N  
+ATOM   4184  NH2 ARG B 711      25.794  45.150  75.760  1.00 23.53           N  
+ATOM   4185  N   GLY B 712      22.947  51.020  78.723  1.00 19.74           N  
+ATOM   4186  CA  GLY B 712      21.926  51.830  78.068  1.00 19.21           C  
+ATOM   4187  C   GLY B 712      21.272  51.285  76.794  1.00 17.80           C  
+ATOM   4188  O   GLY B 712      20.629  52.036  76.066  1.00 19.05           O  
+ATOM   4189  N   VAL B 713      21.456  50.005  76.491  1.00 15.82           N  
+ATOM   4190  CA  VAL B 713      20.839  49.421  75.305  1.00 15.17           C  
+ATOM   4191  C   VAL B 713      19.358  49.233  75.627  1.00 14.59           C  
+ATOM   4192  O   VAL B 713      19.023  48.677  76.670  1.00 14.63           O  
+ATOM   4193  CB  VAL B 713      21.474  48.081  74.950  1.00 14.56           C  
+ATOM   4194  CG1 VAL B 713      20.737  47.441  73.782  1.00 15.20           C  
+ATOM   4195  CG2 VAL B 713      22.921  48.284  74.627  1.00 14.74           C  
+ATOM   4196  N   PRO B 714      18.452  49.700  74.747  1.00 14.03           N  
+ATOM   4197  CA  PRO B 714      17.018  49.563  74.999  1.00 14.49           C  
+ATOM   4198  C   PRO B 714      16.390  48.170  74.854  1.00 15.74           C  
+ATOM   4199  O   PRO B 714      15.975  47.787  73.763  1.00 19.20           O  
+ATOM   4200  CB  PRO B 714      16.399  50.564  74.002  1.00 15.01           C  
+ATOM   4201  CG  PRO B 714      17.340  50.505  72.858  1.00 13.42           C  
+ATOM   4202  CD  PRO B 714      18.691  50.486  73.515  1.00 13.20           C  
+ATOM   4203  N   ILE B 715      16.305  47.430  75.957  1.00 14.09           N  
+ATOM   4204  CA  ILE B 715      15.667  46.114  75.970  1.00 12.23           C  
+ATOM   4205  C   ILE B 715      14.677  46.138  77.145  1.00 11.74           C  
+ATOM   4206  O   ILE B 715      15.018  46.584  78.249  1.00 13.13           O  
+ATOM   4207  CB  ILE B 715      16.690  44.954  76.058  1.00 12.79           C  
+ATOM   4208  CG1 ILE B 715      15.952  43.623  76.070  1.00 13.06           C  
+ATOM   4209  CG2 ILE B 715      17.611  45.101  77.259  1.00 12.52           C  
+ATOM   4210  CD1 ILE B 715      16.844  42.447  75.886  1.00 14.53           C  
+ATOM   4211  N   ASP B 716      13.439  45.729  76.888  1.00 10.20           N  
+ATOM   4212  CA  ASP B 716      12.355  45.759  77.892  1.00  9.90           C  
+ATOM   4213  C   ASP B 716      11.990  44.430  78.527  1.00  9.81           C  
+ATOM   4214  O   ASP B 716      11.608  44.385  79.697  1.00 10.42           O  
+ATOM   4215  CB  ASP B 716      11.058  46.338  77.283  1.00  9.93           C  
+ATOM   4216  CG  ASP B 716      11.262  47.717  76.674  1.00 11.02           C  
+ATOM   4217  OD1 ASP B 716      11.666  48.645  77.411  1.00 11.62           O  
+ATOM   4218  OD2 ASP B 716      11.041  47.866  75.463  1.00 10.52           O  
+ATOM   4219  N   GLY B 717      12.097  43.352  77.767  1.00  8.75           N  
+ATOM   4220  CA  GLY B 717      11.681  42.078  78.307  1.00  8.61           C  
+ATOM   4221  C   GLY B 717      12.405  40.880  77.766  1.00  9.65           C  
+ATOM   4222  O   GLY B 717      13.219  40.971  76.817  1.00  8.64           O  
+ATOM   4223  N   VAL B 718      12.169  39.747  78.424  1.00  7.81           N  
+ATOM   4224  CA  VAL B 718      12.753  38.502  78.004  1.00  8.03           C  
+ATOM   4225  C   VAL B 718      11.608  37.526  77.733  1.00  7.73           C  
+ATOM   4226  O   VAL B 718      10.618  37.491  78.469  1.00  8.36           O  
+ATOM   4227  CB  VAL B 718      13.781  37.948  79.060  1.00  9.61           C  
+ATOM   4228  CG1 VAL B 718      13.081  37.695  80.435  1.00 10.03           C  
+ATOM   4229  CG2 VAL B 718      14.463  36.673  78.526  1.00  9.16           C  
+ATOM   4230  N   GLY B 719      11.709  36.824  76.615  1.00  7.49           N  
+ATOM   4231  CA  GLY B 719      10.699  35.862  76.238  1.00  7.79           C  
+ATOM   4232  C   GLY B 719      11.161  34.430  76.516  1.00  8.67           C  
+ATOM   4233  O   GLY B 719      12.174  33.962  75.969  1.00  8.57           O  
+ATOM   4234  N   PHE B 720      10.403  33.750  77.400  1.00  8.62           N  
+ATOM   4235  CA  PHE B 720      10.666  32.349  77.769  1.00  8.70           C  
+ATOM   4236  C   PHE B 720       9.768  31.521  76.839  1.00  8.33           C  
+ATOM   4237  O   PHE B 720       8.536  31.540  76.984  1.00  8.72           O  
+ATOM   4238  CB  PHE B 720      10.212  32.050  79.215  1.00  9.47           C  
+ATOM   4239  CG  PHE B 720      11.107  32.617  80.327  1.00 10.07           C  
+ATOM   4240  CD1 PHE B 720      12.230  33.403  80.069  1.00  9.90           C  
+ATOM   4241  CD2 PHE B 720      10.796  32.337  81.654  1.00 10.52           C  
+ATOM   4242  CE1 PHE B 720      13.007  33.886  81.091  1.00 10.06           C  
+ATOM   4243  CE2 PHE B 720      11.578  32.821  82.695  1.00 10.20           C  
+ATOM   4244  CZ  PHE B 720      12.683  33.598  82.411  1.00 10.50           C  
+ATOM   4245  N   GLN B 721      10.365  30.797  75.898  1.00  8.47           N  
+ATOM   4246  CA  GLN B 721       9.579  29.977  74.967  1.00  8.45           C  
+ATOM   4247  C   GLN B 721       8.713  28.912  75.672  1.00  9.00           C  
+ATOM   4248  O   GLN B 721       7.574  28.717  75.302  1.00 10.44           O  
+ATOM   4249  CB  GLN B 721      10.465  29.337  73.904  1.00  8.10           C  
+ATOM   4250  CG  GLN B 721      10.888  30.337  72.778  1.00  9.08           C  
+ATOM   4251  CD  GLN B 721      11.731  29.676  71.711  1.00 10.02           C  
+ATOM   4252  OE1 GLN B 721      11.681  28.459  71.519  1.00 10.19           O  
+ATOM   4253  NE2 GLN B 721      12.516  30.472  71.001  1.00 10.74           N  
+ATOM   4254  N   CYS B 722       9.242  28.268  76.708  1.00  9.73           N  
+ATOM   4255  CA  CYS B 722       8.506  27.254  77.465  1.00 10.36           C  
+ATOM   4256  C   CYS B 722       8.119  25.989  76.688  1.00  9.67           C  
+ATOM   4257  O   CYS B 722       6.976  25.508  76.777  1.00 10.50           O  
+ATOM   4258  CB  CYS B 722       7.289  27.856  78.187  1.00 10.38           C  
+ATOM   4259  SG  CYS B 722       7.655  29.113  79.456  1.00 11.84           S  
+ATOM   4260  N   HIS B 723       9.059  25.465  75.900  1.00 10.10           N  
+ATOM   4261  CA  HIS B 723       8.835  24.201  75.172  1.00 11.99           C  
+ATOM   4262  C   HIS B 723       9.298  23.099  76.157  1.00 12.75           C  
+ATOM   4263  O   HIS B 723      10.476  22.692  76.187  1.00 12.33           O  
+ATOM   4264  CB  HIS B 723       9.609  24.169  73.847  1.00 11.83           C  
+ATOM   4265  CG  HIS B 723       9.084  25.147  72.838  1.00 11.48           C  
+ATOM   4266  ND1 HIS B 723       7.805  25.076  72.312  1.00 11.45           N  
+ATOM   4267  CD2 HIS B 723       9.664  26.229  72.266  1.00 10.97           C  
+ATOM   4268  CE1 HIS B 723       7.622  26.070  71.462  1.00 10.99           C  
+ATOM   4269  NE2 HIS B 723       8.736  26.781  71.416  1.00 10.15           N  
+ATOM   4270  N   PHE B 724       8.351  22.728  77.027  1.00 12.96           N  
+ATOM   4271  CA  PHE B 724       8.580  21.774  78.120  1.00 13.75           C  
+ATOM   4272  C   PHE B 724       8.136  20.327  77.857  1.00 15.38           C  
+ATOM   4273  O   PHE B 724       7.333  20.054  76.950  1.00 15.22           O  
+ATOM   4274  CB  PHE B 724       7.874  22.282  79.390  1.00 12.93           C  
+ATOM   4275  CG  PHE B 724       8.346  23.645  79.875  1.00 12.99           C  
+ATOM   4276  CD1 PHE B 724       9.706  23.920  80.042  1.00 13.45           C  
+ATOM   4277  CD2 PHE B 724       7.421  24.621  80.254  1.00 12.67           C  
+ATOM   4278  CE1 PHE B 724      10.121  25.139  80.591  1.00 12.89           C  
+ATOM   4279  CE2 PHE B 724       7.839  25.829  80.799  1.00 12.22           C  
+ATOM   4280  CZ  PHE B 724       9.193  26.077  80.968  1.00 12.61           C  
+ATOM   4281  N   ILE B 725       8.699  19.405  78.657  1.00 17.09           N  
+ATOM   4282  CA  ILE B 725       8.365  17.978  78.601  1.00 17.43           C  
+ATOM   4283  C   ILE B 725       7.435  17.702  79.796  1.00 16.95           C  
+ATOM   4284  O   ILE B 725       7.683  18.179  80.913  1.00 17.04           O  
+ATOM   4285  CB  ILE B 725       9.626  17.069  78.716  1.00 18.98           C  
+ATOM   4286  CG1 ILE B 725      10.620  17.371  77.581  1.00 20.07           C  
+ATOM   4287  CG2 ILE B 725       9.195  15.581  78.659  1.00 19.55           C  
+ATOM   4288  CD1 ILE B 725      11.921  16.514  77.605  1.00 21.31           C  
+ATOM   4289  N   ASN B 726       6.380  16.932  79.550  1.00 15.42           N  
+ATOM   4290  CA  ASN B 726       5.386  16.599  80.565  1.00 16.02           C  
+ATOM   4291  C   ASN B 726       6.039  16.008  81.821  1.00 16.11           C  
+ATOM   4292  O   ASN B 726       7.022  15.290  81.729  1.00 16.34           O  
+ATOM   4293  CB  ASN B 726       4.418  15.581  79.962  1.00 17.03           C  
+ATOM   4294  CG  ASN B 726       3.137  15.472  80.724  1.00 17.60           C  
+ATOM   4295  OD1 ASN B 726       2.565  16.468  81.158  1.00 18.65           O  
+ATOM   4296  ND2 ASN B 726       2.644  14.255  80.852  1.00 18.82           N  
+ATOM   4297  N   GLY B 727       5.498  16.321  82.989  1.00 16.88           N  
+ATOM   4298  CA  GLY B 727       6.055  15.771  84.219  1.00 18.66           C  
+ATOM   4299  C   GLY B 727       7.124  16.626  84.875  1.00 19.96           C  
+ATOM   4300  O   GLY B 727       8.087  16.116  85.462  1.00 19.43           O  
+ATOM   4301  N   MET B 728       6.951  17.939  84.769  1.00 20.59           N  
+ATOM   4302  CA  MET B 728       7.889  18.902  85.339  1.00 21.97           C  
+ATOM   4303  C   MET B 728       7.908  18.768  86.859  1.00 21.72           C  
+ATOM   4304  O   MET B 728       6.850  18.773  87.503  1.00 20.51           O  
+ATOM   4305  CB  MET B 728       7.475  20.336  84.966  1.00 23.48           C  
+ATOM   4306  CG  MET B 728       7.326  20.587  83.466  1.00 25.37           C  
+ATOM   4307  SD  MET B 728       7.157  22.331  83.114  1.00 27.80           S  
+ATOM   4308  CE  MET B 728       5.541  22.633  83.391  1.00 26.98           C  
+ATOM   4309  N   SER B 729       9.112  18.706  87.417  1.00 22.11           N  
+ATOM   4310  CA  SER B 729       9.307  18.570  88.858  1.00 22.52           C  
+ATOM   4311  C   SER B 729       9.060  19.887  89.612  1.00 23.65           C  
+ATOM   4312  O   SER B 729       9.118  20.970  89.019  1.00 23.37           O  
+ATOM   4313  CB  SER B 729      10.728  18.083  89.123  1.00 21.40           C  
+ATOM   4314  OG  SER B 729      11.654  19.140  88.973  1.00 22.89           O  
+ATOM   4315  N   PRO B 730       8.773  19.816  90.937  1.00 24.11           N  
+ATOM   4316  CA  PRO B 730       8.522  21.006  91.771  1.00 23.92           C  
+ATOM   4317  C   PRO B 730       9.768  21.900  91.858  1.00 23.61           C  
+ATOM   4318  O   PRO B 730       9.670  23.116  92.015  1.00 23.74           O  
+ATOM   4319  CB  PRO B 730       8.206  20.399  93.147  1.00 24.83           C  
+ATOM   4320  CG  PRO B 730       7.609  19.072  92.797  1.00 25.23           C  
+ATOM   4321  CD  PRO B 730       8.511  18.579  91.708  1.00 24.67           C  
+ATOM   4322  N   GLU B 731      10.931  21.266  91.802  1.00 23.67           N  
+ATOM   4323  CA  GLU B 731      12.207  21.960  91.860  1.00 24.84           C  
+ATOM   4324  C   GLU B 731      12.417  22.715  90.556  1.00 22.71           C  
+ATOM   4325  O   GLU B 731      12.968  23.807  90.558  1.00 21.75           O  
+ATOM   4326  CB  GLU B 731      13.347  20.963  92.075  1.00 27.68           C  
+ATOM   4327  CG  GLU B 731      13.350  20.313  93.474  1.00 32.72           C  
+ATOM   4328  CD  GLU B 731      12.149  19.358  93.752  1.00 35.58           C  
+ATOM   4329  OE1 GLU B 731      11.834  18.478  92.889  1.00 35.97           O  
+ATOM   4330  OE2 GLU B 731      11.534  19.491  94.858  1.00 38.04           O  
+ATOM   4331  N   TYR B 732      11.989  22.126  89.442  1.00 20.86           N  
+ATOM   4332  CA  TYR B 732      12.136  22.793  88.149  1.00 20.30           C  
+ATOM   4333  C   TYR B 732      11.243  24.030  88.155  1.00 17.89           C  
+ATOM   4334  O   TYR B 732      11.718  25.125  87.896  1.00 16.35           O  
+ATOM   4335  CB  TYR B 732      11.768  21.861  86.995  1.00 22.05           C  
+ATOM   4336  CG  TYR B 732      12.081  22.424  85.621  1.00 24.55           C  
+ATOM   4337  CD1 TYR B 732      13.382  22.790  85.264  1.00 25.89           C  
+ATOM   4338  CD2 TYR B 732      11.086  22.531  84.651  1.00 26.21           C  
+ATOM   4339  CE1 TYR B 732      13.682  23.241  83.956  1.00 26.45           C  
+ATOM   4340  CE2 TYR B 732      11.377  22.974  83.350  1.00 26.88           C  
+ATOM   4341  CZ  TYR B 732      12.674  23.318  83.010  1.00 26.78           C  
+ATOM   4342  OH  TYR B 732      12.953  23.661  81.702  1.00 28.02           O  
+ATOM   4343  N   LEU B 733       9.973  23.861  88.519  1.00 16.12           N  
+ATOM   4344  CA  LEU B 733       9.027  24.973  88.585  1.00 16.44           C  
+ATOM   4345  C   LEU B 733       9.496  26.062  89.548  1.00 16.28           C  
+ATOM   4346  O   LEU B 733       9.299  27.260  89.303  1.00 16.59           O  
+ATOM   4347  CB  LEU B 733       7.626  24.488  88.974  1.00 17.11           C  
+ATOM   4348  CG  LEU B 733       6.921  23.629  87.922  1.00 19.01           C  
+ATOM   4349  CD1 LEU B 733       5.753  22.864  88.575  1.00 19.91           C  
+ATOM   4350  CD2 LEU B 733       6.416  24.510  86.779  1.00 19.38           C  
+ATOM   4351  N   ALA B 734      10.120  25.654  90.649  1.00 16.27           N  
+ATOM   4352  CA  ALA B 734      10.634  26.618  91.619  1.00 15.29           C  
+ATOM   4353  C   ALA B 734      11.773  27.467  91.024  1.00 13.95           C  
+ATOM   4354  O   ALA B 734      11.872  28.661  91.313  1.00 14.58           O  
+ATOM   4355  CB  ALA B 734      11.142  25.891  92.851  1.00 15.36           C  
+ATOM   4356  N   SER B 735      12.660  26.833  90.259  1.00 14.34           N  
+ATOM   4357  CA  SER B 735      13.778  27.537  89.636  1.00 13.64           C  
+ATOM   4358  C   SER B 735      13.249  28.538  88.600  1.00 13.09           C  
+ATOM   4359  O   SER B 735      13.823  29.605  88.423  1.00 13.53           O  
+ATOM   4360  CB  SER B 735      14.760  26.576  88.999  1.00 14.48           C  
+ATOM   4361  OG  SER B 735      14.227  26.021  87.819  1.00 18.32           O  
+ATOM   4362  N   ILE B 736      12.149  28.206  87.938  1.00 11.82           N  
+ATOM   4363  CA  ILE B 736      11.559  29.146  86.983  1.00 12.18           C  
+ATOM   4364  C   ILE B 736      11.088  30.397  87.728  1.00 12.46           C  
+ATOM   4365  O   ILE B 736      11.385  31.530  87.323  1.00 12.79           O  
+ATOM   4366  CB  ILE B 736      10.368  28.530  86.215  1.00 11.88           C  
+ATOM   4367  CG1 ILE B 736      10.858  27.366  85.341  1.00 12.27           C  
+ATOM   4368  CG2 ILE B 736       9.678  29.612  85.373  1.00 12.60           C  
+ATOM   4369  CD1 ILE B 736       9.759  26.639  84.562  1.00 11.49           C  
+ATOM   4370  N   ASP B 737      10.357  30.208  88.831  1.00 12.55           N  
+ATOM   4371  CA  ASP B 737       9.858  31.334  89.601  1.00 12.73           C  
+ATOM   4372  C   ASP B 737      11.013  32.197  90.123  1.00 12.95           C  
+ATOM   4373  O   ASP B 737      10.939  33.420  90.105  1.00 13.25           O  
+ATOM   4374  CB  ASP B 737       8.990  30.831  90.758  1.00 13.88           C  
+ATOM   4375  CG  ASP B 737       8.468  31.945  91.599  1.00 14.78           C  
+ATOM   4376  OD1 ASP B 737       7.429  32.537  91.254  1.00 15.90           O  
+ATOM   4377  OD2 ASP B 737       9.113  32.257  92.615  1.00 17.61           O  
+ATOM   4378  N   GLN B 738      12.088  31.567  90.564  1.00 13.12           N  
+ATOM   4379  CA  GLN B 738      13.221  32.326  91.066  1.00 16.23           C  
+ATOM   4380  C   GLN B 738      13.880  33.104  89.930  1.00 13.76           C  
+ATOM   4381  O   GLN B 738      14.309  34.235  90.123  1.00 13.44           O  
+ATOM   4382  CB  GLN B 738      14.233  31.391  91.730  1.00 21.24           C  
+ATOM   4383  CG  GLN B 738      14.024  31.223  93.239  1.00 29.40           C  
+ATOM   4384  CD  GLN B 738      12.521  31.196  93.677  1.00 34.29           C  
+ATOM   4385  OE1 GLN B 738      11.929  32.257  94.025  1.00 37.48           O  
+ATOM   4386  NE2 GLN B 738      11.920  29.983  93.711  1.00 35.58           N  
+ATOM   4387  N   ASN B 739      13.936  32.495  88.749  1.00 12.61           N  
+ATOM   4388  CA  ASN B 739      14.527  33.155  87.578  1.00 12.62           C  
+ATOM   4389  C   ASN B 739      13.695  34.407  87.228  1.00 12.16           C  
+ATOM   4390  O   ASN B 739      14.252  35.490  87.001  1.00 12.27           O  
+ATOM   4391  CB  ASN B 739      14.602  32.181  86.392  1.00 12.27           C  
+ATOM   4392  CG  ASN B 739      15.510  32.690  85.271  1.00 12.20           C  
+ATOM   4393  OD1 ASN B 739      16.447  33.444  85.515  1.00 13.21           O  
+ATOM   4394  ND2 ASN B 739      15.237  32.270  84.048  1.00 11.53           N  
+ATOM   4395  N   ILE B 740      12.366  34.295  87.251  1.00 10.28           N  
+ATOM   4396  CA  ILE B 740      11.516  35.455  86.966  1.00 11.01           C  
+ATOM   4397  C   ILE B 740      11.789  36.593  87.959  1.00 11.58           C  
+ATOM   4398  O   ILE B 740      11.835  37.764  87.565  1.00 11.38           O  
+ATOM   4399  CB  ILE B 740      10.002  35.074  86.977  1.00 10.74           C  
+ATOM   4400  CG1 ILE B 740       9.718  34.091  85.837  1.00 11.67           C  
+ATOM   4401  CG2 ILE B 740       9.086  36.301  86.885  1.00 10.84           C  
+ATOM   4402  CD1 ILE B 740       8.283  33.560  85.831  1.00 12.09           C  
+ATOM   4403  N   LYS B 741      12.022  36.242  89.234  1.00 11.07           N  
+ATOM   4404  CA  LYS B 741      12.303  37.245  90.266  1.00 12.06           C  
+ATOM   4405  C   LYS B 741      13.625  37.982  90.073  1.00 10.68           C  
+ATOM   4406  O   LYS B 741      13.700  39.169  90.314  1.00 11.90           O  
+ATOM   4407  CB  LYS B 741      12.199  36.615  91.658  1.00 12.80           C  
+ATOM   4408  CG  LYS B 741      10.772  36.384  92.038  1.00 13.98           C  
+ATOM   4409  CD  LYS B 741      10.651  35.683  93.363  1.00 15.71           C  
+ATOM   4410  CE  LYS B 741       9.178  35.737  93.849  1.00 16.67           C  
+ATOM   4411  NZ  LYS B 741       8.178  34.989  93.003  1.00 16.44           N  
+ATOM   4412  N   ARG B 742      14.659  37.301  89.597  1.00 11.44           N  
+ATOM   4413  CA  ARG B 742      15.914  38.011  89.370  1.00 12.02           C  
+ATOM   4414  C   ARG B 742      15.772  38.991  88.193  1.00 11.76           C  
+ATOM   4415  O   ARG B 742      16.357  40.051  88.223  1.00 11.82           O  
+ATOM   4416  CB  ARG B 742      17.135  37.095  89.287  1.00 12.71           C  
+ATOM   4417  CG  ARG B 742      17.246  36.196  88.085  1.00 13.57           C  
+ATOM   4418  CD  ARG B 742      18.590  35.459  88.077  1.00 13.12           C  
+ATOM   4419  NE  ARG B 742      18.631  34.540  86.952  1.00 12.95           N  
+ATOM   4420  CZ  ARG B 742      19.688  33.843  86.566  1.00 13.35           C  
+ATOM   4421  NH1 ARG B 742      20.827  33.923  87.232  1.00 15.24           N  
+ATOM   4422  NH2 ARG B 742      19.607  33.040  85.517  1.00 13.30           N  
+ATOM   4423  N   TYR B 743      14.951  38.667  87.190  1.00 11.44           N  
+ATOM   4424  CA  TYR B 743      14.682  39.611  86.091  1.00 11.20           C  
+ATOM   4425  C   TYR B 743      13.912  40.812  86.631  1.00 11.07           C  
+ATOM   4426  O   TYR B 743      14.167  41.942  86.235  1.00 10.84           O  
+ATOM   4427  CB  TYR B 743      13.891  38.953  84.951  1.00  9.15           C  
+ATOM   4428  CG  TYR B 743      14.791  38.242  83.960  1.00  9.10           C  
+ATOM   4429  CD1 TYR B 743      15.606  38.969  83.074  1.00  9.20           C  
+ATOM   4430  CD2 TYR B 743      14.866  36.843  83.923  1.00  9.34           C  
+ATOM   4431  CE1 TYR B 743      16.468  38.320  82.197  1.00  9.22           C  
+ATOM   4432  CE2 TYR B 743      15.719  36.180  83.041  1.00  8.94           C  
+ATOM   4433  CZ  TYR B 743      16.519  36.926  82.181  1.00  9.19           C  
+ATOM   4434  OH  TYR B 743      17.346  36.270  81.311  1.00 10.26           O  
+ATOM   4435  N   ALA B 744      12.988  40.583  87.573  1.00 11.82           N  
+ATOM   4436  CA  ALA B 744      12.223  41.700  88.150  1.00 12.25           C  
+ATOM   4437  C   ALA B 744      13.164  42.662  88.844  1.00 12.70           C  
+ATOM   4438  O   ALA B 744      12.972  43.870  88.760  1.00 13.31           O  
+ATOM   4439  CB  ALA B 744      11.134  41.214  89.127  1.00 11.58           C  
+ATOM   4440  N   GLU B 745      14.222  42.136  89.462  1.00 13.93           N  
+ATOM   4441  CA  GLU B 745      15.184  42.992  90.172  1.00 17.54           C  
+ATOM   4442  C   GLU B 745      15.967  43.942  89.249  1.00 17.48           C  
+ATOM   4443  O   GLU B 745      16.493  44.971  89.715  1.00 17.16           O  
+ATOM   4444  CB  GLU B 745      16.163  42.165  91.004  1.00 20.52           C  
+ATOM   4445  CG  GLU B 745      15.561  41.537  92.240  1.00 26.59           C  
+ATOM   4446  CD  GLU B 745      16.448  40.429  92.793  1.00 30.86           C  
+ATOM   4447  OE1 GLU B 745      17.698  40.640  92.823  1.00 32.41           O  
+ATOM   4448  OE2 GLU B 745      15.898  39.337  93.155  1.00 34.10           O  
+ATOM   4449  N   ILE B 746      16.099  43.580  87.969  1.00 15.40           N  
+ATOM   4450  CA  ILE B 746      16.788  44.441  87.024  1.00 15.27           C  
+ATOM   4451  C   ILE B 746      15.819  45.225  86.111  1.00 14.60           C  
+ATOM   4452  O   ILE B 746      16.255  45.848  85.151  1.00 15.33           O  
+ATOM   4453  CB  ILE B 746      17.884  43.703  86.198  1.00 14.95           C  
+ATOM   4454  CG1 ILE B 746      17.284  42.583  85.358  1.00 14.09           C  
+ATOM   4455  CG2 ILE B 746      18.975  43.198  87.130  1.00 15.28           C  
+ATOM   4456  CD1 ILE B 746      18.214  42.087  84.270  1.00 14.48           C  
+ATOM   4457  N   GLY B 747      14.530  45.232  86.477  1.00 13.85           N  
+ATOM   4458  CA  GLY B 747      13.495  45.971  85.770  1.00 14.02           C  
+ATOM   4459  C   GLY B 747      13.072  45.408  84.428  1.00 14.60           C  
+ATOM   4460  O   GLY B 747      12.550  46.144  83.601  1.00 16.93           O  
+ATOM   4461  N   VAL B 748      13.173  44.097  84.267  1.00 13.32           N  
+ATOM   4462  CA  VAL B 748      12.840  43.434  83.008  1.00 12.70           C  
+ATOM   4463  C   VAL B 748      11.552  42.606  83.126  1.00 13.76           C  
+ATOM   4464  O   VAL B 748      11.341  41.888  84.111  1.00 13.51           O  
+ATOM   4465  CB  VAL B 748      14.035  42.538  82.567  1.00 12.42           C  
+ATOM   4466  CG1 VAL B 748      13.669  41.653  81.392  1.00 13.27           C  
+ATOM   4467  CG2 VAL B 748      15.233  43.385  82.214  1.00 12.18           C  
+ATOM   4468  N   ILE B 749      10.677  42.754  82.137  1.00 12.55           N  
+ATOM   4469  CA  ILE B 749       9.418  42.030  82.044  1.00 12.80           C  
+ATOM   4470  C   ILE B 749       9.704  40.608  81.503  1.00 11.83           C  
+ATOM   4471  O   ILE B 749      10.644  40.391  80.732  1.00 11.00           O  
+ATOM   4472  CB  ILE B 749       8.492  42.730  80.994  1.00 15.78           C  
+ATOM   4473  CG1 ILE B 749       8.234  44.184  81.367  1.00 18.81           C  
+ATOM   4474  CG2 ILE B 749       7.179  41.992  80.819  1.00 17.05           C  
+ATOM   4475  CD1 ILE B 749       7.621  44.370  82.718  1.00 20.74           C  
+ATOM   4476  N   VAL B 750       8.855  39.654  81.867  1.00 10.40           N  
+ATOM   4477  CA  VAL B 750       8.974  38.284  81.378  1.00 10.33           C  
+ATOM   4478  C   VAL B 750       7.656  37.861  80.707  1.00  9.86           C  
+ATOM   4479  O   VAL B 750       6.576  38.100  81.250  1.00 11.49           O  
+ATOM   4480  CB  VAL B 750       9.251  37.295  82.544  1.00 10.64           C  
+ATOM   4481  CG1 VAL B 750       9.186  35.849  82.042  1.00 11.68           C  
+ATOM   4482  CG2 VAL B 750      10.601  37.614  83.180  1.00 10.22           C  
+ATOM   4483  N   SER B 751       7.738  37.325  79.497  1.00  8.47           N  
+ATOM   4484  CA  SER B 751       6.548  36.805  78.828  1.00  8.18           C  
+ATOM   4485  C   SER B 751       6.761  35.318  78.537  1.00  8.82           C  
+ATOM   4486  O   SER B 751       7.898  34.913  78.189  1.00  9.45           O  
+ATOM   4487  CB  SER B 751       6.297  37.529  77.490  1.00  9.10           C  
+ATOM   4488  OG  SER B 751       5.838  38.839  77.714  1.00  9.79           O  
+ATOM   4489  N   PHE B 752       5.715  34.490  78.713  1.00  7.78           N  
+ATOM   4490  CA  PHE B 752       5.819  33.077  78.329  1.00  8.95           C  
+ATOM   4491  C   PHE B 752       5.320  33.172  76.882  1.00  8.52           C  
+ATOM   4492  O   PHE B 752       4.166  33.485  76.649  1.00  8.94           O  
+ATOM   4493  CB  PHE B 752       4.905  32.170  79.190  1.00 11.03           C  
+ATOM   4494  CG  PHE B 752       5.323  32.071  80.636  1.00 12.89           C  
+ATOM   4495  CD1 PHE B 752       6.602  32.457  81.055  1.00 14.37           C  
+ATOM   4496  CD2 PHE B 752       4.422  31.585  81.591  1.00 15.38           C  
+ATOM   4497  CE1 PHE B 752       6.983  32.361  82.418  1.00 16.19           C  
+ATOM   4498  CE2 PHE B 752       4.783  31.483  82.966  1.00 15.58           C  
+ATOM   4499  CZ  PHE B 752       6.062  31.870  83.375  1.00 16.18           C  
+ATOM   4500  N   THR B 753       6.176  32.846  75.923  1.00  8.05           N  
+ATOM   4501  CA  THR B 753       5.840  33.077  74.517  1.00  8.09           C  
+ATOM   4502  C   THR B 753       5.413  31.937  73.600  1.00  8.55           C  
+ATOM   4503  O   THR B 753       4.706  32.188  72.606  1.00  9.14           O  
+ATOM   4504  CB  THR B 753       7.048  33.766  73.794  1.00  8.43           C  
+ATOM   4505  OG1 THR B 753       8.201  32.923  73.925  1.00  9.37           O  
+ATOM   4506  CG2 THR B 753       7.358  35.168  74.382  1.00  9.01           C  
+ATOM   4507  N   GLU B 754       5.848  30.712  73.867  1.00  7.13           N  
+ATOM   4508  CA  GLU B 754       5.535  29.613  72.972  1.00  8.03           C  
+ATOM   4509  C   GLU B 754       5.264  28.325  73.740  1.00  8.68           C  
+ATOM   4510  O   GLU B 754       5.714  27.248  73.314  1.00  8.71           O  
+ATOM   4511  CB  GLU B 754       6.744  29.367  72.041  1.00  9.32           C  
+ATOM   4512  CG  GLU B 754       7.294  30.669  71.376  1.00  9.63           C  
+ATOM   4513  CD  GLU B 754       8.411  30.421  70.386  1.00  9.79           C  
+ATOM   4514  OE1 GLU B 754       8.742  29.250  70.094  1.00  9.53           O  
+ATOM   4515  OE2 GLU B 754       8.978  31.425  69.902  1.00 10.55           O  
+ATOM   4516  N   ILE B 755       4.452  28.423  74.787  1.00  9.06           N  
+ATOM   4517  CA  ILE B 755       4.211  27.256  75.638  1.00  9.77           C  
+ATOM   4518  C   ILE B 755       3.594  26.046  74.981  1.00  9.16           C  
+ATOM   4519  O   ILE B 755       2.610  26.147  74.280  1.00  9.12           O  
+ATOM   4520  CB  ILE B 755       3.289  27.574  76.834  1.00  9.61           C  
+ATOM   4521  CG1 ILE B 755       3.800  28.782  77.616  1.00  9.39           C  
+ATOM   4522  CG2 ILE B 755       3.171  26.329  77.763  1.00 10.33           C  
+ATOM   4523  CD1 ILE B 755       2.705  29.437  78.473  1.00 10.97           C  
+ATOM   4524  N   ASP B 756       4.226  24.902  75.226  1.00 11.27           N  
+ATOM   4525  CA  ASP B 756       3.693  23.583  74.867  1.00 11.75           C  
+ATOM   4526  C   ASP B 756       4.331  22.530  75.815  1.00 12.16           C  
+ATOM   4527  O   ASP B 756       5.456  22.720  76.298  1.00 10.54           O  
+ATOM   4528  CB  ASP B 756       3.674  23.216  73.363  1.00 12.55           C  
+ATOM   4529  CG  ASP B 756       4.978  23.436  72.667  1.00 13.13           C  
+ATOM   4530  OD1 ASP B 756       6.040  23.308  73.286  1.00 12.24           O  
+ATOM   4531  OD2 ASP B 756       4.919  23.702  71.453  1.00 13.93           O  
+ATOM   4532  N   ILE B 757       3.527  21.534  76.211  1.00 12.16           N  
+ATOM   4533  CA  ILE B 757       3.987  20.499  77.156  1.00 12.97           C  
+ATOM   4534  C   ILE B 757       3.793  19.129  76.482  1.00 12.86           C  
+ATOM   4535  O   ILE B 757       2.687  18.579  76.468  1.00 11.90           O  
+ATOM   4536  CB  ILE B 757       3.240  20.639  78.510  1.00 13.23           C  
+ATOM   4537  CG1 ILE B 757       3.386  22.081  79.034  1.00 12.89           C  
+ATOM   4538  CG2 ILE B 757       3.799  19.621  79.528  1.00 13.62           C  
+ATOM   4539  CD1 ILE B 757       2.873  22.336  80.436  1.00 14.34           C  
+ATOM   4540  N   ARG B 758       4.875  18.646  75.863  1.00 13.17           N  
+ATOM   4541  CA  ARG B 758       4.859  17.413  75.080  1.00 14.61           C  
+ATOM   4542  C   ARG B 758       4.885  16.126  75.885  1.00 14.48           C  
+ATOM   4543  O   ARG B 758       5.654  15.979  76.831  1.00 14.28           O  
+ATOM   4544  CB  ARG B 758       5.951  17.430  73.998  1.00 14.64           C  
+ATOM   4545  CG  ARG B 758       7.386  17.421  74.482  1.00 16.53           C  
+ATOM   4546  CD  ARG B 758       8.321  17.662  73.290  1.00 16.65           C  
+ATOM   4547  NE  ARG B 758       9.726  17.572  73.651  1.00 18.67           N  
+ATOM   4548  CZ  ARG B 758      10.480  18.602  74.031  1.00 19.31           C  
+ATOM   4549  NH1 ARG B 758       9.967  19.823  74.115  1.00 19.80           N  
+ATOM   4550  NH2 ARG B 758      11.757  18.409  74.336  1.00 20.42           N  
+ATOM   4551  N   ILE B 759       4.017  15.211  75.475  1.00 16.39           N  
+ATOM   4552  CA  ILE B 759       3.817  13.915  76.129  1.00 18.18           C  
+ATOM   4553  C   ILE B 759       4.444  12.758  75.372  1.00 21.26           C  
+ATOM   4554  O   ILE B 759       4.183  12.570  74.184  1.00 20.83           O  
+ATOM   4555  CB  ILE B 759       2.309  13.616  76.264  1.00 17.34           C  
+ATOM   4556  CG1 ILE B 759       1.641  14.677  77.125  1.00 16.21           C  
+ATOM   4557  CG2 ILE B 759       2.094  12.242  76.875  1.00 18.07           C  
+ATOM   4558  CD1 ILE B 759       0.192  14.502  77.226  1.00 15.54           C  
+ATOM   4559  N   PRO B 760       5.274  11.953  76.054  1.00 24.72           N  
+ATOM   4560  CA  PRO B 760       5.931  10.802  75.428  1.00 28.37           C  
+ATOM   4561  C   PRO B 760       4.848   9.853  74.935  1.00 32.38           C  
+ATOM   4562  O   PRO B 760       3.864   9.603  75.626  1.00 31.63           O  
+ATOM   4563  CB  PRO B 760       6.726  10.204  76.584  1.00 27.79           C  
+ATOM   4564  CG  PRO B 760       7.056  11.420  77.431  1.00 27.34           C  
+ATOM   4565  CD  PRO B 760       5.717  12.115  77.448  1.00 25.62           C  
+ATOM   4566  N   GLN B 761       5.030   9.354  73.726  1.00 38.35           N  
+ATOM   4567  CA  GLN B 761       4.074   8.468  73.067  1.00 45.19           C  
+ATOM   4568  C   GLN B 761       3.734   7.138  73.763  1.00 47.15           C  
+ATOM   4569  O   GLN B 761       4.488   6.613  74.600  1.00 47.14           O  
+ATOM   4570  CB  GLN B 761       4.549   8.214  71.625  1.00 48.30           C  
+ATOM   4571  CG  GLN B 761       3.638   7.354  70.757  1.00 52.30           C  
+ATOM   4572  CD  GLN B 761       4.324   6.907  69.453  1.00 54.85           C  
+ATOM   4573  OE1 GLN B 761       4.493   5.694  69.200  1.00 55.99           O  
+ATOM   4574  NE2 GLN B 761       4.727   7.885  68.621  1.00 55.44           N  
+ATOM   4575  N   SER B 762       2.570   6.610  73.394  1.00 49.80           N  
+ATOM   4576  CA  SER B 762       2.056   5.354  73.926  1.00 52.87           C  
+ATOM   4577  C   SER B 762       2.028   5.194  75.454  1.00 54.47           C  
+ATOM   4578  O   SER B 762       1.681   4.116  75.970  1.00 54.98           O  
+ATOM   4579  CB  SER B 762       2.682   4.143  73.221  1.00 53.26           C  
+ATOM   4580  OG  SER B 762       1.813   3.671  72.190  1.00 54.16           O  
+ATOM   4581  N   GLU B 763       2.397   6.256  76.177  1.00 55.86           N  
+ATOM   4582  CA  GLU B 763       2.296   6.241  77.629  1.00 56.40           C  
+ATOM   4583  C   GLU B 763       0.781   6.507  77.805  1.00 55.89           C  
+ATOM   4584  O   GLU B 763       0.125   7.082  76.908  1.00 55.54           O  
+ATOM   4585  CB  GLU B 763       3.137   7.352  78.288  1.00 57.68           C  
+ATOM   4586  CG  GLU B 763       2.451   8.728  78.372  1.00 59.42           C  
+ATOM   4587  CD  GLU B 763       3.033   9.632  79.454  1.00 60.72           C  
+ATOM   4588  OE1 GLU B 763       3.672   9.119  80.404  1.00 61.37           O  
+ATOM   4589  OE2 GLU B 763       2.837  10.868  79.360  1.00 61.91           O  
+ATOM   4590  N   ASN B 764       0.224   6.058  78.925  1.00 55.04           N  
+ATOM   4591  CA  ASN B 764      -1.203   6.212  79.197  1.00 53.96           C  
+ATOM   4592  C   ASN B 764      -1.719   7.648  79.052  1.00 52.97           C  
+ATOM   4593  O   ASN B 764      -1.371   8.519  79.863  1.00 53.14           O  
+ATOM   4594  CB  ASN B 764      -1.508   5.688  80.606  1.00 54.70           C  
+ATOM   4595  CG  ASN B 764      -2.999   5.633  80.902  1.00 55.04           C  
+ATOM   4596  OD1 ASN B 764      -3.810   5.341  80.014  1.00 55.45           O  
+ATOM   4597  ND2 ASN B 764      -3.369   5.919  82.156  1.00 55.03           N  
+ATOM   4598  N   PRO B 765      -2.556   7.913  78.021  1.00 51.91           N  
+ATOM   4599  CA  PRO B 765      -3.135   9.245  77.763  1.00 50.40           C  
+ATOM   4600  C   PRO B 765      -3.956   9.737  78.954  1.00 49.00           C  
+ATOM   4601  O   PRO B 765      -4.058  10.942  79.190  1.00 49.31           O  
+ATOM   4602  CB  PRO B 765      -4.028   8.998  76.550  1.00 50.63           C  
+ATOM   4603  CG  PRO B 765      -3.266   7.936  75.804  1.00 51.31           C  
+ATOM   4604  CD  PRO B 765      -2.910   6.982  76.933  1.00 51.55           C  
+ATOM   4605  N   ALA B 766      -4.510   8.794  79.717  1.00 46.61           N  
+ATOM   4606  CA  ALA B 766      -5.320   9.109  80.901  1.00 44.46           C  
+ATOM   4607  C   ALA B 766      -4.562   9.852  82.015  1.00 42.12           C  
+ATOM   4608  O   ALA B 766      -4.892  11.008  82.307  1.00 42.15           O  
+ATOM   4609  CB  ALA B 766      -5.943   7.843  81.455  1.00 45.41           C  
+ATOM   4610  N   THR B 767      -3.591   9.180  82.660  1.00 38.97           N  
+ATOM   4611  CA  THR B 767      -2.790   9.800  83.734  1.00 35.17           C  
+ATOM   4612  C   THR B 767      -1.850  10.875  83.180  1.00 30.96           C  
+ATOM   4613  O   THR B 767      -1.616  11.878  83.844  1.00 28.79           O  
+ATOM   4614  CB  THR B 767      -2.002   8.766  84.608  1.00 35.84           C  
+ATOM   4615  OG1 THR B 767      -1.064   8.031  83.810  1.00 36.68           O  
+ATOM   4616  CG2 THR B 767      -2.970   7.797  85.268  1.00 36.27           C  
+ATOM   4617  N   ALA B 768      -1.342  10.655  81.963  1.00 27.74           N  
+ATOM   4618  CA  ALA B 768      -0.483  11.629  81.279  1.00 24.83           C  
+ATOM   4619  C   ALA B 768      -1.229  12.984  81.152  1.00 23.22           C  
+ATOM   4620  O   ALA B 768      -0.654  14.026  81.471  1.00 22.86           O  
+ATOM   4621  CB  ALA B 768      -0.092  11.116  79.913  1.00 24.23           C  
+ATOM   4622  N   PHE B 769      -2.493  12.975  80.713  1.00 20.89           N  
+ATOM   4623  CA  PHE B 769      -3.283  14.211  80.600  1.00 19.93           C  
+ATOM   4624  C   PHE B 769      -3.511  14.913  81.935  1.00 18.70           C  
+ATOM   4625  O   PHE B 769      -3.710  16.121  81.964  1.00 17.80           O  
+ATOM   4626  CB  PHE B 769      -4.645  13.959  79.949  1.00 21.55           C  
+ATOM   4627  CG  PHE B 769      -4.586  13.753  78.466  1.00 22.97           C  
+ATOM   4628  CD1 PHE B 769      -3.371  13.691  77.801  1.00 23.39           C  
+ATOM   4629  CD2 PHE B 769      -5.756  13.604  77.735  1.00 24.57           C  
+ATOM   4630  CE1 PHE B 769      -3.301  13.481  76.429  1.00 24.28           C  
+ATOM   4631  CE2 PHE B 769      -5.705  13.392  76.346  1.00 26.20           C  
+ATOM   4632  CZ  PHE B 769      -4.461  13.330  75.697  1.00 25.58           C  
+ATOM   4633  N   GLN B 770      -3.542  14.163  83.042  1.00 18.31           N  
+ATOM   4634  CA  GLN B 770      -3.711  14.808  84.345  1.00 18.14           C  
+ATOM   4635  C   GLN B 770      -2.418  15.494  84.784  1.00 16.17           C  
+ATOM   4636  O   GLN B 770      -2.445  16.564  85.351  1.00 16.35           O  
+ATOM   4637  CB  GLN B 770      -4.135  13.818  85.431  1.00 19.86           C  
+ATOM   4638  CG  GLN B 770      -5.498  13.158  85.189  1.00 22.96           C  
+ATOM   4639  CD  GLN B 770      -6.679  14.133  85.178  1.00 23.79           C  
+ATOM   4640  OE1 GLN B 770      -6.592  15.292  85.660  1.00 24.20           O  
+ATOM   4641  NE2 GLN B 770      -7.807  13.655  84.659  1.00 24.09           N  
+ATOM   4642  N   VAL B 771      -1.283  14.861  84.558  1.00 15.93           N  
+ATOM   4643  CA  VAL B 771      -0.002  15.461  84.942  1.00 16.39           C  
+ATOM   4644  C   VAL B 771       0.194  16.752  84.117  1.00 16.18           C  
+ATOM   4645  O   VAL B 771       0.602  17.774  84.647  1.00 15.18           O  
+ATOM   4646  CB  VAL B 771       1.174  14.486  84.658  1.00 18.42           C  
+ATOM   4647  CG1 VAL B 771       2.521  15.208  84.859  1.00 18.28           C  
+ATOM   4648  CG2 VAL B 771       1.072  13.234  85.564  1.00 18.63           C  
+ATOM   4649  N   GLN B 772      -0.159  16.687  82.833  1.00 15.51           N  
+ATOM   4650  CA  GLN B 772      -0.038  17.843  81.940  1.00 15.01           C  
+ATOM   4651  C   GLN B 772      -0.901  18.981  82.469  1.00 14.06           C  
+ATOM   4652  O   GLN B 772      -0.460  20.137  82.508  1.00 14.18           O  
+ATOM   4653  CB  GLN B 772      -0.442  17.445  80.515  1.00 13.63           C  
+ATOM   4654  CG  GLN B 772      -0.514  18.615  79.542  1.00 13.41           C  
+ATOM   4655  CD  GLN B 772      -0.966  18.177  78.169  1.00 13.57           C  
+ATOM   4656  OE1 GLN B 772      -2.134  17.838  77.973  1.00 13.87           O  
+ATOM   4657  NE2 GLN B 772      -0.042  18.167  77.208  1.00 13.14           N  
+ATOM   4658  N   ALA B 773      -2.121  18.660  82.910  1.00 13.77           N  
+ATOM   4659  CA  ALA B 773      -3.019  19.673  83.470  1.00 12.95           C  
+ATOM   4660  C   ALA B 773      -2.393  20.344  84.688  1.00 13.59           C  
+ATOM   4661  O   ALA B 773      -2.486  21.565  84.851  1.00 13.84           O  
+ATOM   4662  CB  ALA B 773      -4.358  19.051  83.860  1.00 13.73           C  
+ATOM   4663  N   ASN B 774      -1.794  19.536  85.570  1.00 15.01           N  
+ATOM   4664  CA  ASN B 774      -1.145  20.053  86.784  1.00 16.44           C  
+ATOM   4665  C   ASN B 774       0.021  20.956  86.398  1.00 15.21           C  
+ATOM   4666  O   ASN B 774       0.223  22.001  87.019  1.00 14.48           O  
+ATOM   4667  CB  ASN B 774      -0.611  18.929  87.680  1.00 19.87           C  
+ATOM   4668  CG  ASN B 774      -1.725  18.053  88.277  1.00 24.16           C  
+ATOM   4669  OD1 ASN B 774      -2.867  18.508  88.523  1.00 25.82           O  
+ATOM   4670  ND2 ASN B 774      -1.388  16.782  88.528  1.00 25.88           N  
+ATOM   4671  N   ASN B 775       0.778  20.536  85.371  1.00 15.53           N  
+ATOM   4672  CA  ASN B 775       1.931  21.311  84.850  1.00 14.59           C  
+ATOM   4673  C   ASN B 775       1.465  22.679  84.282  1.00 13.48           C  
+ATOM   4674  O   ASN B 775       2.056  23.706  84.611  1.00 13.68           O  
+ATOM   4675  CB  ASN B 775       2.706  20.498  83.797  1.00 14.91           C  
+ATOM   4676  CG  ASN B 775       3.640  19.443  84.402  1.00 15.08           C  
+ATOM   4677  OD1 ASN B 775       4.377  18.800  83.675  1.00 16.43           O  
+ATOM   4678  ND2 ASN B 775       3.637  19.288  85.723  1.00 16.45           N  
+ATOM   4679  N   TYR B 776       0.390  22.711  83.493  1.00 12.69           N  
+ATOM   4680  CA  TYR B 776      -0.140  23.990  82.966  1.00 12.56           C  
+ATOM   4681  C   TYR B 776      -0.643  24.866  84.099  1.00 12.94           C  
+ATOM   4682  O   TYR B 776      -0.454  26.078  84.095  1.00 12.66           O  
+ATOM   4683  CB  TYR B 776      -1.299  23.768  81.973  1.00 12.26           C  
+ATOM   4684  CG  TYR B 776      -0.868  23.649  80.523  1.00 13.33           C  
+ATOM   4685  CD1 TYR B 776      -0.477  24.783  79.793  1.00 13.73           C  
+ATOM   4686  CD2 TYR B 776      -0.861  22.408  79.871  1.00 12.42           C  
+ATOM   4687  CE1 TYR B 776      -0.088  24.674  78.441  1.00 13.59           C  
+ATOM   4688  CE2 TYR B 776      -0.479  22.282  78.515  1.00 13.95           C  
+ATOM   4689  CZ  TYR B 776      -0.093  23.433  77.805  1.00 13.89           C  
+ATOM   4690  OH  TYR B 776       0.254  23.340  76.473  1.00 13.64           O  
+ATOM   4691  N   LYS B 777      -1.341  24.247  85.061  1.00 13.98           N  
+ATOM   4692  CA  LYS B 777      -1.865  24.971  86.211  1.00 14.22           C  
+ATOM   4693  C   LYS B 777      -0.728  25.615  87.024  1.00 13.19           C  
+ATOM   4694  O   LYS B 777      -0.839  26.763  87.402  1.00 13.79           O  
+ATOM   4695  CB  LYS B 777      -2.699  24.035  87.101  1.00 15.67           C  
+ATOM   4696  CG  LYS B 777      -3.333  24.755  88.254  1.00 18.09           C  
+ATOM   4697  CD  LYS B 777      -4.344  23.878  88.932  1.00 20.55           C  
+ATOM   4698  CE  LYS B 777      -5.259  24.737  89.777  1.00 23.88           C  
+ATOM   4699  NZ  LYS B 777      -6.266  23.903  90.503  1.00 25.60           N  
+ATOM   4700  N   GLU B 778       0.371  24.899  87.262  1.00 14.09           N  
+ATOM   4701  CA  GLU B 778       1.480  25.468  88.036  1.00 16.38           C  
+ATOM   4702  C   GLU B 778       2.127  26.642  87.278  1.00 16.22           C  
+ATOM   4703  O   GLU B 778       2.487  27.666  87.878  1.00 15.46           O  
+ATOM   4704  CB  GLU B 778       2.539  24.410  88.367  1.00 18.97           C  
+ATOM   4705  CG  GLU B 778       2.114  23.359  89.398  1.00 22.95           C  
+ATOM   4706  CD  GLU B 778       1.516  23.959  90.657  1.00 25.33           C  
+ATOM   4707  OE1 GLU B 778       2.165  24.850  91.267  1.00 25.33           O  
+ATOM   4708  OE2 GLU B 778       0.375  23.553  91.020  1.00 28.22           O  
+ATOM   4709  N   LEU B 779       2.240  26.498  85.955  1.00 14.80           N  
+ATOM   4710  CA  LEU B 779       2.808  27.559  85.113  1.00 15.27           C  
+ATOM   4711  C   LEU B 779       1.961  28.840  85.213  1.00 13.72           C  
+ATOM   4712  O   LEU B 779       2.506  29.945  85.360  1.00 13.17           O  
+ATOM   4713  CB  LEU B 779       2.859  27.054  83.672  1.00 17.27           C  
+ATOM   4714  CG  LEU B 779       4.069  27.298  82.786  1.00 19.73           C  
+ATOM   4715  CD1 LEU B 779       5.385  26.983  83.511  1.00 20.00           C  
+ATOM   4716  CD2 LEU B 779       3.884  26.430  81.564  1.00 20.09           C  
+ATOM   4717  N   MET B 780       0.633  28.702  85.131  1.00 12.38           N  
+ATOM   4718  CA  MET B 780      -0.266  29.853  85.258  1.00 13.07           C  
+ATOM   4719  C   MET B 780      -0.180  30.489  86.663  1.00 14.32           C  
+ATOM   4720  O   MET B 780      -0.276  31.707  86.796  1.00 14.53           O  
+ATOM   4721  CB  MET B 780      -1.717  29.487  84.937  1.00 13.50           C  
+ATOM   4722  CG  MET B 780      -2.683  30.659  85.072  1.00 13.47           C  
+ATOM   4723  SD  MET B 780      -2.258  32.124  84.052  1.00 15.61           S  
+ATOM   4724  CE  MET B 780      -2.951  31.613  82.548  1.00 14.16           C  
+ATOM   4725  N   LYS B 781      -0.032  29.669  87.708  1.00 14.75           N  
+ATOM   4726  CA  LYS B 781       0.124  30.197  89.067  1.00 15.67           C  
+ATOM   4727  C   LYS B 781       1.414  31.042  89.209  1.00 14.34           C  
+ATOM   4728  O   LYS B 781       1.419  32.091  89.868  1.00 14.63           O  
+ATOM   4729  CB  LYS B 781       0.058  29.049  90.087  1.00 18.22           C  
+ATOM   4730  CG  LYS B 781      -1.392  28.764  90.547  1.00 20.69           C  
+ATOM   4731  CD  LYS B 781      -1.642  27.309  90.944  1.00 24.31           C  
+ATOM   4732  CE  LYS B 781      -0.798  26.833  92.129  1.00 26.56           C  
+ATOM   4733  NZ  LYS B 781      -1.228  27.442  93.425  1.00 28.92           N  
+ATOM   4734  N   ILE B 782       2.490  30.602  88.564  1.00 14.47           N  
+ATOM   4735  CA  ILE B 782       3.763  31.342  88.569  1.00 14.49           C  
+ATOM   4736  C   ILE B 782       3.540  32.706  87.871  1.00 14.67           C  
+ATOM   4737  O   ILE B 782       4.006  33.736  88.352  1.00 14.51           O  
+ATOM   4738  CB  ILE B 782       4.873  30.528  87.836  1.00 15.03           C  
+ATOM   4739  CG1 ILE B 782       5.274  29.330  88.702  1.00 15.13           C  
+ATOM   4740  CG2 ILE B 782       6.083  31.412  87.513  1.00 14.48           C  
+ATOM   4741  CD1 ILE B 782       6.159  28.336  87.999  1.00 16.57           C  
+ATOM   4742  N   CYS B 783       2.822  32.701  86.747  1.00 14.34           N  
+ATOM   4743  CA  CYS B 783       2.509  33.931  86.019  1.00 15.33           C  
+ATOM   4744  C   CYS B 783       1.722  34.895  86.913  1.00 16.01           C  
+ATOM   4745  O   CYS B 783       2.095  36.053  87.071  1.00 16.32           O  
+ATOM   4746  CB  CYS B 783       1.714  33.586  84.753  1.00 15.91           C  
+ATOM   4747  SG  CYS B 783       1.194  34.967  83.726  1.00 20.16           S  
+ATOM   4748  N   LEU B 784       0.706  34.374  87.594  1.00 16.28           N  
+ATOM   4749  CA  LEU B 784      -0.127  35.183  88.482  1.00 17.40           C  
+ATOM   4750  C   LEU B 784       0.607  35.727  89.700  1.00 17.91           C  
+ATOM   4751  O   LEU B 784       0.273  36.809  90.198  1.00 19.36           O  
+ATOM   4752  CB  LEU B 784      -1.339  34.373  88.954  1.00 17.52           C  
+ATOM   4753  CG  LEU B 784      -2.382  34.063  87.874  1.00 17.20           C  
+ATOM   4754  CD1 LEU B 784      -3.386  33.093  88.432  1.00 18.30           C  
+ATOM   4755  CD2 LEU B 784      -3.062  35.331  87.397  1.00 17.96           C  
+ATOM   4756  N   ALA B 785       1.584  34.969  90.192  1.00 18.24           N  
+ATOM   4757  CA  ALA B 785       2.361  35.352  91.372  1.00 17.84           C  
+ATOM   4758  C   ALA B 785       3.404  36.442  91.155  1.00 19.56           C  
+ATOM   4759  O   ALA B 785       3.809  37.103  92.116  1.00 20.73           O  
+ATOM   4760  CB  ALA B 785       3.071  34.119  91.948  1.00 18.50           C  
+ATOM   4761  N   ASN B 786       3.885  36.597  89.916  1.00 17.87           N  
+ATOM   4762  CA  ASN B 786       4.939  37.564  89.618  1.00 17.02           C  
+ATOM   4763  C   ASN B 786       4.407  38.787  88.887  1.00 17.01           C  
+ATOM   4764  O   ASN B 786       3.885  38.692  87.772  1.00 18.13           O  
+ATOM   4765  CB  ASN B 786       6.060  36.869  88.840  1.00 15.09           C  
+ATOM   4766  CG  ASN B 786       6.839  35.870  89.704  1.00 14.64           C  
+ATOM   4767  OD1 ASN B 786       7.671  36.274  90.506  1.00 14.93           O  
+ATOM   4768  ND2 ASN B 786       6.571  34.577  89.536  1.00 13.68           N  
+ATOM   4769  N   PRO B 787       4.564  39.967  89.488  1.00 17.46           N  
+ATOM   4770  CA  PRO B 787       4.077  41.213  88.877  1.00 17.30           C  
+ATOM   4771  C   PRO B 787       4.686  41.629  87.527  1.00 16.47           C  
+ATOM   4772  O   PRO B 787       4.074  42.400  86.808  1.00 16.34           O  
+ATOM   4773  CB  PRO B 787       4.312  42.259  89.971  1.00 18.37           C  
+ATOM   4774  CG  PRO B 787       5.471  41.698  90.760  1.00 19.15           C  
+ATOM   4775  CD  PRO B 787       5.183  40.214  90.809  1.00 18.17           C  
+ATOM   4776  N   ASN B 788       5.884  41.134  87.213  1.00 15.02           N  
+ATOM   4777  CA  ASN B 788       6.555  41.449  85.943  1.00 14.29           C  
+ATOM   4778  C   ASN B 788       6.289  40.392  84.867  1.00 14.27           C  
+ATOM   4779  O   ASN B 788       6.941  40.414  83.846  1.00 13.45           O  
+ATOM   4780  CB  ASN B 788       8.071  41.592  86.147  1.00 12.55           C  
+ATOM   4781  CG  ASN B 788       8.729  40.298  86.555  1.00 12.66           C  
+ATOM   4782  OD1 ASN B 788       8.180  39.549  87.361  1.00 13.26           O  
+ATOM   4783  ND2 ASN B 788       9.901  40.026  86.022  1.00 12.71           N  
+ATOM   4784  N   CYS B 789       5.326  39.494  85.075  1.00 15.09           N  
+ATOM   4785  CA  CYS B 789       5.045  38.444  84.104  1.00 16.88           C  
+ATOM   4786  C   CYS B 789       3.561  38.501  83.863  1.00 18.35           C  
+ATOM   4787  O   CYS B 789       2.783  38.098  84.715  1.00 20.01           O  
+ATOM   4788  CB  CYS B 789       5.467  37.079  84.661  1.00 17.51           C  
+ATOM   4789  SG  CYS B 789       5.184  35.693  83.514  1.00 22.69           S  
+ATOM   4790  N   ASN B 790       3.155  39.013  82.707  1.00 18.24           N  
+ATOM   4791  CA  ASN B 790       1.736  39.164  82.417  1.00 19.40           C  
+ATOM   4792  C   ASN B 790       1.251  38.738  81.029  1.00 16.05           C  
+ATOM   4793  O   ASN B 790       0.138  39.080  80.630  1.00 14.67           O  
+ATOM   4794  CB  ASN B 790       1.338  40.609  82.672  1.00 24.02           C  
+ATOM   4795  CG  ASN B 790       1.751  41.085  84.074  1.00 28.09           C  
+ATOM   4796  OD1 ASN B 790       2.754  41.800  84.220  1.00 30.79           O  
+ATOM   4797  ND2 ASN B 790       0.993  40.677  85.110  1.00 29.63           N  
+ATOM   4798  N   THR B 791       2.042  37.914  80.359  1.00 12.89           N  
+ATOM   4799  CA  THR B 791       1.730  37.442  79.023  1.00 11.55           C  
+ATOM   4800  C   THR B 791       1.925  35.935  79.031  1.00 10.00           C  
+ATOM   4801  O   THR B 791       3.018  35.451  79.343  1.00 10.08           O  
+ATOM   4802  CB  THR B 791       2.699  38.112  78.054  1.00 12.18           C  
+ATOM   4803  OG1 THR B 791       2.437  39.513  78.077  1.00 14.27           O  
+ATOM   4804  CG2 THR B 791       2.568  37.563  76.635  1.00 12.32           C  
+ATOM   4805  N   PHE B 792       0.854  35.216  78.685  1.00  9.31           N  
+ATOM   4806  CA  PHE B 792       0.834  33.757  78.696  1.00  9.88           C  
+ATOM   4807  C   PHE B 792       0.400  33.268  77.303  1.00  9.81           C  
+ATOM   4808  O   PHE B 792      -0.806  33.196  77.009  1.00 10.08           O  
+ATOM   4809  CB  PHE B 792      -0.182  33.314  79.781  1.00 10.18           C  
+ATOM   4810  CG  PHE B 792      -0.103  31.855  80.152  1.00 11.69           C  
+ATOM   4811  CD1 PHE B 792       0.732  31.434  81.198  1.00 12.53           C  
+ATOM   4812  CD2 PHE B 792      -0.904  30.900  79.495  1.00 12.16           C  
+ATOM   4813  CE1 PHE B 792       0.767  30.072  81.593  1.00 13.77           C  
+ATOM   4814  CE2 PHE B 792      -0.883  29.538  79.873  1.00 13.10           C  
+ATOM   4815  CZ  PHE B 792      -0.045  29.121  80.927  1.00 13.08           C  
+ATOM   4816  N   VAL B 793       1.367  32.961  76.437  1.00  9.05           N  
+ATOM   4817  CA  VAL B 793       1.070  32.516  75.061  1.00  9.67           C  
+ATOM   4818  C   VAL B 793       1.502  31.066  74.783  1.00  8.71           C  
+ATOM   4819  O   VAL B 793       2.639  30.678  75.046  1.00  9.22           O  
+ATOM   4820  CB  VAL B 793       1.732  33.489  73.960  1.00  9.67           C  
+ATOM   4821  CG1 VAL B 793       1.468  32.975  72.511  1.00  9.09           C  
+ATOM   4822  CG2 VAL B 793       1.180  34.905  74.121  1.00 10.35           C  
+ATOM   4823  N   MET B 794       0.567  30.274  74.293  1.00  8.06           N  
+ATOM   4824  CA  MET B 794       0.821  28.882  73.971  1.00  9.34           C  
+ATOM   4825  C   MET B 794       1.089  28.759  72.463  1.00  9.84           C  
+ATOM   4826  O   MET B 794       0.570  29.570  71.672  1.00  9.87           O  
+ATOM   4827  CB  MET B 794      -0.392  28.023  74.394  1.00  9.85           C  
+ATOM   4828  CG  MET B 794      -0.589  28.029  75.939  1.00 12.49           C  
+ATOM   4829  SD  MET B 794      -2.232  27.531  76.502  1.00 13.56           S  
+ATOM   4830  CE  MET B 794      -3.162  28.921  75.976  1.00 14.10           C  
+ATOM   4831  N   TRP B 795       1.885  27.768  72.068  1.00  9.89           N  
+ATOM   4832  CA  TRP B 795       2.209  27.588  70.653  1.00 10.89           C  
+ATOM   4833  C   TRP B 795       1.152  26.732  69.977  1.00  9.07           C  
+ATOM   4834  O   TRP B 795       1.444  25.661  69.459  1.00 11.22           O  
+ATOM   4835  CB  TRP B 795       3.620  27.004  70.465  1.00 12.28           C  
+ATOM   4836  CG  TRP B 795       4.347  27.586  69.250  1.00 14.30           C  
+ATOM   4837  CD1 TRP B 795       4.950  26.885  68.240  1.00 15.74           C  
+ATOM   4838  CD2 TRP B 795       4.512  28.994  68.922  1.00 14.78           C  
+ATOM   4839  NE1 TRP B 795       5.480  27.769  67.300  1.00 17.03           N  
+ATOM   4840  CE2 TRP B 795       5.230  29.060  67.699  1.00 16.49           C  
+ATOM   4841  CE3 TRP B 795       4.117  30.200  69.545  1.00 14.93           C  
+ATOM   4842  CZ2 TRP B 795       5.569  30.296  67.087  1.00 16.88           C  
+ATOM   4843  CZ3 TRP B 795       4.450  31.428  68.936  1.00 16.14           C  
+ATOM   4844  CH2 TRP B 795       5.170  31.461  67.723  1.00 16.14           C  
+ATOM   4845  N   GLY B 796      -0.078  27.236  69.991  1.00 10.65           N  
+ATOM   4846  CA  GLY B 796      -1.222  26.550  69.410  1.00  9.77           C  
+ATOM   4847  C   GLY B 796      -2.243  26.275  70.511  1.00 10.78           C  
+ATOM   4848  O   GLY B 796      -1.986  26.544  71.688  1.00 11.56           O  
+ATOM   4849  N   PHE B 797      -3.427  25.802  70.143  1.00 10.22           N  
+ATOM   4850  CA  PHE B 797      -4.438  25.471  71.152  1.00 10.47           C  
+ATOM   4851  C   PHE B 797      -5.055  24.081  70.936  1.00 11.11           C  
+ATOM   4852  O   PHE B 797      -5.619  23.506  71.865  1.00 12.17           O  
+ATOM   4853  CB  PHE B 797      -5.500  26.558  71.296  1.00 10.07           C  
+ATOM   4854  CG  PHE B 797      -6.307  26.813  70.056  1.00 11.57           C  
+ATOM   4855  CD1 PHE B 797      -5.892  27.778  69.134  1.00 12.54           C  
+ATOM   4856  CD2 PHE B 797      -7.500  26.127  69.824  1.00 12.64           C  
+ATOM   4857  CE1 PHE B 797      -6.656  28.063  67.996  1.00 12.91           C  
+ATOM   4858  CE2 PHE B 797      -8.278  26.405  68.677  1.00 13.41           C  
+ATOM   4859  CZ  PHE B 797      -7.839  27.383  67.768  1.00 13.02           C  
+ATOM   4860  N   THR B 798      -4.929  23.524  69.735  1.00 10.30           N  
+ATOM   4861  CA  THR B 798      -5.455  22.184  69.458  1.00 11.03           C  
+ATOM   4862  C   THR B 798      -4.378  21.200  69.012  1.00 11.46           C  
+ATOM   4863  O   THR B 798      -3.500  21.535  68.210  1.00 11.08           O  
+ATOM   4864  CB  THR B 798      -6.627  22.199  68.425  1.00 10.50           C  
+ATOM   4865  OG1 THR B 798      -6.972  20.858  68.104  1.00 11.94           O  
+ATOM   4866  CG2 THR B 798      -6.234  22.921  67.103  1.00 11.96           C  
+ATOM   4867  N   ASP B 799      -4.416  19.989  69.559  1.00 12.04           N  
+ATOM   4868  CA  ASP B 799      -3.458  18.941  69.197  1.00 13.36           C  
+ATOM   4869  C   ASP B 799      -3.493  18.599  67.710  1.00 13.69           C  
+ATOM   4870  O   ASP B 799      -2.619  17.874  67.223  1.00 14.84           O  
+ATOM   4871  CB  ASP B 799      -3.707  17.653  70.003  1.00 13.03           C  
+ATOM   4872  CG  ASP B 799      -3.376  17.808  71.476  1.00 14.37           C  
+ATOM   4873  OD1 ASP B 799      -2.672  18.771  71.858  1.00 13.46           O  
+ATOM   4874  OD2 ASP B 799      -3.821  16.937  72.258  1.00 15.05           O  
+ATOM   4875  N   LYS B 800      -4.535  19.051  67.012  1.00 14.32           N  
+ATOM   4876  CA  LYS B 800      -4.644  18.827  65.563  1.00 15.02           C  
+ATOM   4877  C   LYS B 800      -3.525  19.581  64.774  1.00 15.94           C  
+ATOM   4878  O   LYS B 800      -3.046  19.098  63.744  1.00 16.72           O  
+ATOM   4879  CB  LYS B 800      -6.006  19.305  65.085  1.00 16.19           C  
+ATOM   4880  CG  LYS B 800      -6.331  18.996  63.633  1.00 17.38           C  
+ATOM   4881  CD  LYS B 800      -7.754  19.402  63.360  1.00 18.95           C  
+ATOM   4882  CE  LYS B 800      -8.214  18.922  62.004  1.00 21.14           C  
+ATOM   4883  NZ  LYS B 800      -9.547  19.507  61.636  1.00 23.77           N  
+ATOM   4884  N   TYR B 801      -3.087  20.737  65.274  1.00 15.47           N  
+ATOM   4885  CA  TYR B 801      -2.051  21.529  64.590  1.00 14.06           C  
+ATOM   4886  C   TYR B 801      -0.923  21.860  65.546  1.00 14.12           C  
+ATOM   4887  O   TYR B 801      -1.091  22.710  66.440  1.00 13.84           O  
+ATOM   4888  CB  TYR B 801      -2.638  22.832  64.043  1.00 13.16           C  
+ATOM   4889  CG  TYR B 801      -3.825  22.640  63.127  1.00 12.66           C  
+ATOM   4890  CD1 TYR B 801      -3.677  22.070  61.858  1.00 13.56           C  
+ATOM   4891  CD2 TYR B 801      -5.089  23.007  63.538  1.00 12.59           C  
+ATOM   4892  CE1 TYR B 801      -4.797  21.872  61.019  1.00 13.37           C  
+ATOM   4893  CE2 TYR B 801      -6.194  22.823  62.730  1.00 13.14           C  
+ATOM   4894  CZ  TYR B 801      -6.052  22.256  61.471  1.00 12.89           C  
+ATOM   4895  OH  TYR B 801      -7.176  22.107  60.697  1.00 13.83           O  
+ATOM   4896  N   THR B 802       0.211  21.177  65.374  1.00 14.89           N  
+ATOM   4897  CA  THR B 802       1.389  21.405  66.214  1.00 15.78           C  
+ATOM   4898  C   THR B 802       2.699  20.926  65.585  1.00 16.56           C  
+ATOM   4899  O   THR B 802       2.750  19.895  64.927  1.00 16.66           O  
+ATOM   4900  CB  THR B 802       1.233  20.786  67.650  1.00 15.47           C  
+ATOM   4901  OG1 THR B 802       2.484  20.925  68.351  1.00 15.40           O  
+ATOM   4902  CG2 THR B 802       0.827  19.306  67.583  1.00 14.22           C  
+ATOM   4903  N   TRP B 803       3.760  21.688  65.818  1.00 17.57           N  
+ATOM   4904  CA  TRP B 803       5.082  21.363  65.286  1.00 19.37           C  
+ATOM   4905  C   TRP B 803       5.791  20.230  66.063  1.00 20.30           C  
+ATOM   4906  O   TRP B 803       6.753  19.645  65.565  1.00 20.42           O  
+ATOM   4907  CB  TRP B 803       5.982  22.614  65.333  1.00 19.81           C  
+ATOM   4908  CG  TRP B 803       6.433  22.992  66.735  1.00 20.80           C  
+ATOM   4909  CD1 TRP B 803       5.634  23.220  67.837  1.00 20.26           C  
+ATOM   4910  CD2 TRP B 803       7.782  23.167  67.183  1.00 22.32           C  
+ATOM   4911  NE1 TRP B 803       6.409  23.519  68.929  1.00 20.02           N  
+ATOM   4912  CE2 TRP B 803       7.728  23.494  68.564  1.00 22.08           C  
+ATOM   4913  CE3 TRP B 803       9.039  23.086  66.553  1.00 23.62           C  
+ATOM   4914  CZ2 TRP B 803       8.891  23.735  69.333  1.00 23.52           C  
+ATOM   4915  CZ3 TRP B 803      10.195  23.333  67.316  1.00 24.55           C  
+ATOM   4916  CH2 TRP B 803      10.108  23.652  68.697  1.00 24.30           C  
+ATOM   4917  N   ILE B 804       5.318  19.923  67.273  1.00 21.12           N  
+ATOM   4918  CA  ILE B 804       5.970  18.921  68.134  1.00 20.98           C  
+ATOM   4919  C   ILE B 804       6.266  17.526  67.566  1.00 22.84           C  
+ATOM   4920  O   ILE B 804       7.415  17.116  67.555  1.00 23.13           O  
+ATOM   4921  CB  ILE B 804       5.247  18.809  69.507  1.00 19.92           C  
+ATOM   4922  CG1 ILE B 804       5.380  20.128  70.275  1.00 18.56           C  
+ATOM   4923  CG2 ILE B 804       5.813  17.651  70.324  1.00 19.45           C  
+ATOM   4924  CD1 ILE B 804       6.790  20.518  70.613  1.00 18.51           C  
+ATOM   4925  N   PRO B 805       5.248  16.788  67.082  1.00 25.30           N  
+ATOM   4926  CA  PRO B 805       5.444  15.437  66.525  1.00 27.68           C  
+ATOM   4927  C   PRO B 805       6.494  15.284  65.399  1.00 29.75           C  
+ATOM   4928  O   PRO B 805       7.156  14.236  65.288  1.00 30.66           O  
+ATOM   4929  CB  PRO B 805       4.046  15.080  65.997  1.00 27.28           C  
+ATOM   4930  CG  PRO B 805       3.126  15.841  66.888  1.00 27.38           C  
+ATOM   4931  CD  PRO B 805       3.822  17.171  67.012  1.00 26.60           C  
+ATOM   4932  N   GLY B 806       6.596  16.306  64.548  1.00 31.03           N  
+ATOM   4933  CA  GLY B 806       7.527  16.275  63.434  1.00 32.01           C  
+ATOM   4934  C   GLY B 806       8.925  16.603  63.871  1.00 32.94           C  
+ATOM   4935  O   GLY B 806       9.890  16.026  63.361  1.00 34.39           O  
+ATOM   4936  N   THR B 807       9.028  17.481  64.862  1.00 32.98           N  
+ATOM   4937  CA  THR B 807      10.317  17.915  65.374  1.00 33.29           C  
+ATOM   4938  C   THR B 807      10.863  17.024  66.486  1.00 32.68           C  
+ATOM   4939  O   THR B 807      12.078  16.842  66.573  1.00 32.75           O  
+ATOM   4940  CB  THR B 807      10.235  19.380  65.855  1.00 34.33           C  
+ATOM   4941  OG1 THR B 807       9.711  20.191  64.794  1.00 35.43           O  
+ATOM   4942  CG2 THR B 807      11.613  19.913  66.263  1.00 34.66           C  
+ATOM   4943  N   PHE B 808       9.971  16.483  67.324  1.00 31.92           N  
+ATOM   4944  CA  PHE B 808      10.337  15.587  68.444  1.00 31.68           C  
+ATOM   4945  C   PHE B 808       9.609  14.276  68.259  1.00 31.40           C  
+ATOM   4946  O   PHE B 808       8.563  14.043  68.865  1.00 30.57           O  
+ATOM   4947  CB  PHE B 808       9.911  16.149  69.811  1.00 31.77           C  
+ATOM   4948  CG  PHE B 808      10.411  17.514  70.081  1.00 31.96           C  
+ATOM   4949  CD1 PHE B 808      11.698  17.707  70.552  1.00 31.92           C  
+ATOM   4950  CD2 PHE B 808       9.605  18.621  69.827  1.00 32.32           C  
+ATOM   4951  CE1 PHE B 808      12.182  18.994  70.765  1.00 32.91           C  
+ATOM   4952  CE2 PHE B 808      10.077  19.905  70.037  1.00 32.92           C  
+ATOM   4953  CZ  PHE B 808      11.370  20.099  70.506  1.00 32.77           C  
+ATOM   4954  N   PRO B 809      10.136  13.403  67.398  1.00 32.31           N  
+ATOM   4955  CA  PRO B 809       9.504  12.104  67.148  1.00 32.09           C  
+ATOM   4956  C   PRO B 809       9.267  11.323  68.451  1.00 31.24           C  
+ATOM   4957  O   PRO B 809      10.145  11.253  69.324  1.00 31.30           O  
+ATOM   4958  CB  PRO B 809      10.522  11.407  66.239  1.00 32.94           C  
+ATOM   4959  CG  PRO B 809      11.161  12.560  65.492  1.00 33.18           C  
+ATOM   4960  CD  PRO B 809      11.362  13.569  66.591  1.00 32.99           C  
+ATOM   4961  N   GLY B 810       8.071  10.755  68.576  1.00 30.21           N  
+ATOM   4962  CA  GLY B 810       7.739  10.007  69.771  1.00 29.70           C  
+ATOM   4963  C   GLY B 810       7.009  10.834  70.821  1.00 29.12           C  
+ATOM   4964  O   GLY B 810       6.656  10.304  71.874  1.00 29.39           O  
+ATOM   4965  N   TYR B 811       6.803  12.125  70.553  1.00 26.89           N  
+ATOM   4966  CA  TYR B 811       6.101  13.017  71.467  1.00 24.69           C  
+ATOM   4967  C   TYR B 811       4.884  13.623  70.765  1.00 23.98           C  
+ATOM   4968  O   TYR B 811       4.852  13.732  69.541  1.00 24.55           O  
+ATOM   4969  CB  TYR B 811       7.022  14.139  71.912  1.00 24.94           C  
+ATOM   4970  CG  TYR B 811       8.024  13.720  72.937  1.00 26.32           C  
+ATOM   4971  CD1 TYR B 811       9.213  13.124  72.558  1.00 28.16           C  
+ATOM   4972  CD2 TYR B 811       7.788  13.912  74.287  1.00 26.95           C  
+ATOM   4973  CE1 TYR B 811      10.151  12.721  73.500  1.00 29.23           C  
+ATOM   4974  CE2 TYR B 811       8.716  13.515  75.237  1.00 28.37           C  
+ATOM   4975  CZ  TYR B 811       9.898  12.916  74.841  1.00 29.23           C  
+ATOM   4976  OH  TYR B 811      10.828  12.478  75.774  1.00 31.35           O  
+ATOM   4977  N   GLY B 812       3.895  14.043  71.541  1.00 21.75           N  
+ATOM   4978  CA  GLY B 812       2.717  14.635  70.956  1.00 19.68           C  
+ATOM   4979  C   GLY B 812       1.759  15.171  71.995  1.00 17.54           C  
+ATOM   4980  O   GLY B 812       2.151  15.426  73.141  1.00 16.68           O  
+ATOM   4981  N   ASN B 813       0.522  15.408  71.552  1.00 17.30           N  
+ATOM   4982  CA  ASN B 813      -0.588  15.922  72.373  1.00 17.61           C  
+ATOM   4983  C   ASN B 813      -0.136  16.941  73.398  1.00 16.29           C  
+ATOM   4984  O   ASN B 813      -0.463  16.823  74.577  1.00 15.44           O  
+ATOM   4985  CB  ASN B 813      -1.273  14.747  73.061  1.00 20.42           C  
+ATOM   4986  CG  ASN B 813      -1.817  13.734  72.059  1.00 23.17           C  
+ATOM   4987  OD1 ASN B 813      -1.592  12.535  72.201  1.00 26.16           O  
+ATOM   4988  ND2 ASN B 813      -2.488  14.218  71.012  1.00 24.03           N  
+ATOM   4989  N   PRO B 814       0.433  18.070  72.921  1.00 14.90           N  
+ATOM   4990  CA  PRO B 814       0.954  19.122  73.798  1.00 13.23           C  
+ATOM   4991  C   PRO B 814       0.083  20.288  74.245  1.00 11.85           C  
+ATOM   4992  O   PRO B 814       0.526  21.079  75.081  1.00 11.52           O  
+ATOM   4993  CB  PRO B 814       2.133  19.685  72.965  1.00 13.04           C  
+ATOM   4994  CG  PRO B 814       2.069  18.949  71.596  1.00 13.90           C  
+ATOM   4995  CD  PRO B 814       0.665  18.434  71.511  1.00 14.00           C  
+ATOM   4996  N   LEU B 815      -1.148  20.360  73.735  1.00 11.48           N  
+ATOM   4997  CA  LEU B 815      -2.004  21.525  73.935  1.00 11.95           C  
+ATOM   4998  C   LEU B 815      -3.287  21.353  74.752  1.00 12.39           C  
+ATOM   4999  O   LEU B 815      -3.541  20.290  75.290  1.00 12.46           O  
+ATOM   5000  CB  LEU B 815      -2.255  22.173  72.539  1.00 12.42           C  
+ATOM   5001  CG  LEU B 815      -0.948  22.398  71.733  1.00 12.81           C  
+ATOM   5002  CD1 LEU B 815      -1.218  22.657  70.227  1.00 12.19           C  
+ATOM   5003  CD2 LEU B 815      -0.123  23.501  72.377  1.00 12.72           C  
+ATOM   5004  N   ILE B 816      -4.102  22.399  74.830  1.00 12.45           N  
+ATOM   5005  CA  ILE B 816      -5.288  22.344  75.700  1.00 12.32           C  
+ATOM   5006  C   ILE B 816      -6.593  21.766  75.170  1.00 13.12           C  
+ATOM   5007  O   ILE B 816      -7.504  21.516  75.958  1.00 12.16           O  
+ATOM   5008  CB  ILE B 816      -5.505  23.674  76.426  1.00 11.35           C  
+ATOM   5009  CG1 ILE B 816      -5.921  24.777  75.442  1.00 11.75           C  
+ATOM   5010  CG2 ILE B 816      -4.204  24.049  77.156  1.00 11.91           C  
+ATOM   5011  CD1 ILE B 816      -6.129  26.135  76.091  1.00 11.96           C  
+ATOM   5012  N   TYR B 817      -6.705  21.629  73.845  1.00 12.59           N  
+ATOM   5013  CA  TYR B 817      -7.879  21.021  73.200  1.00 13.02           C  
+ATOM   5014  C   TYR B 817      -7.342  19.823  72.445  1.00 13.70           C  
+ATOM   5015  O   TYR B 817      -6.225  19.879  71.917  1.00 13.00           O  
+ATOM   5016  CB  TYR B 817      -8.554  21.954  72.183  1.00 11.95           C  
+ATOM   5017  CG  TYR B 817      -9.378  23.065  72.777  1.00 12.46           C  
+ATOM   5018  CD1 TYR B 817      -8.806  24.283  73.106  1.00 12.87           C  
+ATOM   5019  CD2 TYR B 817     -10.738  22.916  72.975  1.00 13.28           C  
+ATOM   5020  CE1 TYR B 817      -9.566  25.330  73.613  1.00 14.08           C  
+ATOM   5021  CE2 TYR B 817     -11.519  23.965  73.485  1.00 14.49           C  
+ATOM   5022  CZ  TYR B 817     -10.922  25.169  73.800  1.00 14.41           C  
+ATOM   5023  OH  TYR B 817     -11.678  26.214  74.293  1.00 17.30           O  
+ATOM   5024  N   ASP B 818      -8.104  18.728  72.381  1.00 14.85           N  
+ATOM   5025  CA  ASP B 818      -7.616  17.563  71.643  1.00 16.43           C  
+ATOM   5026  C   ASP B 818      -7.846  17.760  70.130  1.00 16.31           C  
+ATOM   5027  O   ASP B 818      -8.350  18.805  69.716  1.00 15.53           O  
+ATOM   5028  CB  ASP B 818      -8.186  16.235  72.200  1.00 18.38           C  
+ATOM   5029  CG  ASP B 818      -9.694  16.070  71.981  1.00 21.65           C  
+ATOM   5030  OD1 ASP B 818     -10.273  16.729  71.090  1.00 21.34           O  
+ATOM   5031  OD2 ASP B 818     -10.320  15.247  72.704  1.00 22.85           O  
+ATOM   5032  N   SER B 819      -7.494  16.775  69.314  1.00 17.84           N  
+ATOM   5033  CA  SER B 819      -7.662  16.894  67.858  1.00 20.05           C  
+ATOM   5034  C   SER B 819      -9.087  16.963  67.328  1.00 19.93           C  
+ATOM   5035  O   SER B 819      -9.294  17.194  66.153  1.00 20.99           O  
+ATOM   5036  CB  SER B 819      -6.882  15.795  67.147  1.00 21.39           C  
+ATOM   5037  OG  SER B 819      -7.140  14.537  67.749  1.00 24.71           O  
+ATOM   5038  N   ASN B 820     -10.069  16.758  68.197  1.00 21.12           N  
+ATOM   5039  CA  ASN B 820     -11.488  16.839  67.829  1.00 22.22           C  
+ATOM   5040  C   ASN B 820     -12.129  18.084  68.452  1.00 21.08           C  
+ATOM   5041  O   ASN B 820     -13.359  18.221  68.466  1.00 22.16           O  
+ATOM   5042  CB  ASN B 820     -12.253  15.598  68.320  1.00 25.06           C  
+ATOM   5043  CG  ASN B 820     -11.766  14.302  67.670  1.00 27.40           C  
+ATOM   5044  OD1 ASN B 820     -11.707  14.190  66.445  1.00 29.11           O  
+ATOM   5045  ND2 ASN B 820     -11.420  13.310  68.499  1.00 29.44           N  
+ATOM   5046  N   TYR B 821     -11.291  18.988  68.967  1.00 19.08           N  
+ATOM   5047  CA  TYR B 821     -11.729  20.226  69.622  1.00 18.23           C  
+ATOM   5048  C   TYR B 821     -12.476  20.047  70.959  1.00 18.48           C  
+ATOM   5049  O   TYR B 821     -13.281  20.892  71.362  1.00 17.31           O  
+ATOM   5050  CB  TYR B 821     -12.497  21.139  68.654  1.00 17.94           C  
+ATOM   5051  CG  TYR B 821     -11.631  21.643  67.517  1.00 18.24           C  
+ATOM   5052  CD1 TYR B 821     -10.721  22.692  67.716  1.00 17.86           C  
+ATOM   5053  CD2 TYR B 821     -11.696  21.053  66.242  1.00 18.01           C  
+ATOM   5054  CE1 TYR B 821      -9.897  23.143  66.667  1.00 17.54           C  
+ATOM   5055  CE2 TYR B 821     -10.872  21.493  65.193  1.00 17.47           C  
+ATOM   5056  CZ  TYR B 821      -9.982  22.540  65.427  1.00 17.99           C  
+ATOM   5057  OH  TYR B 821      -9.181  22.995  64.420  1.00 18.19           O  
+ATOM   5058  N   ASN B 822     -12.185  18.943  71.650  1.00 18.75           N  
+ATOM   5059  CA  ASN B 822     -12.779  18.709  72.975  1.00 19.28           C  
+ATOM   5060  C   ASN B 822     -11.754  19.255  73.981  1.00 17.43           C  
+ATOM   5061  O   ASN B 822     -10.556  18.973  73.854  1.00 17.13           O  
+ATOM   5062  CB  ASN B 822     -12.917  17.200  73.285  1.00 21.82           C  
+ATOM   5063  CG  ASN B 822     -13.819  16.452  72.315  1.00 24.37           C  
+ATOM   5064  OD1 ASN B 822     -14.943  16.859  72.065  1.00 25.89           O  
+ATOM   5065  ND2 ASN B 822     -13.328  15.324  71.792  1.00 26.55           N  
+ATOM   5066  N   PRO B 823     -12.198  20.026  74.996  1.00 17.57           N  
+ATOM   5067  CA  PRO B 823     -11.224  20.539  75.982  1.00 17.11           C  
+ATOM   5068  C   PRO B 823     -10.587  19.365  76.757  1.00 17.01           C  
+ATOM   5069  O   PRO B 823     -11.275  18.399  77.153  1.00 17.73           O  
+ATOM   5070  CB  PRO B 823     -12.087  21.355  76.953  1.00 17.95           C  
+ATOM   5071  CG  PRO B 823     -13.306  21.729  76.149  1.00 19.34           C  
+ATOM   5072  CD  PRO B 823     -13.566  20.505  75.288  1.00 18.84           C  
+ATOM   5073  N   LYS B 824      -9.278  19.426  76.925  1.00 14.87           N  
+ATOM   5074  CA  LYS B 824      -8.536  18.431  77.675  1.00 13.87           C  
+ATOM   5075  C   LYS B 824      -8.486  18.897  79.151  1.00 13.32           C  
+ATOM   5076  O   LYS B 824      -8.876  20.028  79.486  1.00 12.53           O  
+ATOM   5077  CB  LYS B 824      -7.120  18.347  77.084  1.00 13.22           C  
+ATOM   5078  CG  LYS B 824      -7.124  17.753  75.712  1.00 14.11           C  
+ATOM   5079  CD  LYS B 824      -5.809  17.909  74.982  1.00 14.34           C  
+ATOM   5080  CE  LYS B 824      -4.653  17.378  75.786  1.00 14.18           C  
+ATOM   5081  NZ  LYS B 824      -3.327  17.574  75.095  1.00 13.36           N  
+ATOM   5082  N   PRO B 825      -8.014  18.030  80.058  1.00 13.35           N  
+ATOM   5083  CA  PRO B 825      -7.949  18.467  81.461  1.00 13.21           C  
+ATOM   5084  C   PRO B 825      -7.157  19.795  81.597  1.00 13.10           C  
+ATOM   5085  O   PRO B 825      -7.528  20.660  82.400  1.00 13.72           O  
+ATOM   5086  CB  PRO B 825      -7.209  17.306  82.143  1.00 13.95           C  
+ATOM   5087  CG  PRO B 825      -7.699  16.129  81.392  1.00 14.41           C  
+ATOM   5088  CD  PRO B 825      -7.685  16.600  79.929  1.00 13.57           C  
+ATOM   5089  N   ALA B 826      -6.107  19.974  80.787  1.00 11.95           N  
+ATOM   5090  CA  ALA B 826      -5.297  21.194  80.843  1.00 12.05           C  
+ATOM   5091  C   ALA B 826      -6.130  22.475  80.691  1.00 12.16           C  
+ATOM   5092  O   ALA B 826      -5.827  23.490  81.340  1.00 12.66           O  
+ATOM   5093  CB  ALA B 826      -4.196  21.147  79.793  1.00 10.96           C  
+ATOM   5094  N   TYR B 827      -7.173  22.434  79.847  1.00 11.91           N  
+ATOM   5095  CA  TYR B 827      -8.040  23.605  79.645  1.00 12.80           C  
+ATOM   5096  C   TYR B 827      -8.729  24.038  80.954  1.00 13.40           C  
+ATOM   5097  O   TYR B 827      -8.669  25.208  81.352  1.00 13.91           O  
+ATOM   5098  CB  TYR B 827      -9.085  23.324  78.544  1.00 12.99           C  
+ATOM   5099  CG  TYR B 827     -10.097  24.434  78.341  1.00 13.59           C  
+ATOM   5100  CD1 TYR B 827     -11.264  24.495  79.111  1.00 13.68           C  
+ATOM   5101  CD2 TYR B 827      -9.880  25.455  77.390  1.00 13.71           C  
+ATOM   5102  CE1 TYR B 827     -12.182  25.538  78.953  1.00 14.46           C  
+ATOM   5103  CE2 TYR B 827     -10.809  26.517  77.223  1.00 13.60           C  
+ATOM   5104  CZ  TYR B 827     -11.953  26.557  78.005  1.00 14.52           C  
+ATOM   5105  OH  TYR B 827     -12.855  27.601  77.862  1.00 14.77           O  
+ATOM   5106  N   ASN B 828      -9.349  23.065  81.633  1.00 14.50           N  
+ATOM   5107  CA  ASN B 828     -10.047  23.304  82.893  1.00 15.11           C  
+ATOM   5108  C   ASN B 828      -9.089  23.745  83.996  1.00 13.45           C  
+ATOM   5109  O   ASN B 828      -9.409  24.659  84.776  1.00 15.04           O  
+ATOM   5110  CB  ASN B 828     -10.786  22.026  83.327  1.00 16.82           C  
+ATOM   5111  CG  ASN B 828     -11.837  21.582  82.301  1.00 18.57           C  
+ATOM   5112  OD1 ASN B 828     -12.602  22.410  81.802  1.00 20.27           O  
+ATOM   5113  ND2 ASN B 828     -11.851  20.293  81.961  1.00 18.96           N  
+ATOM   5114  N   ALA B 829      -7.907  23.126  84.028  1.00 13.06           N  
+ATOM   5115  CA  ALA B 829      -6.880  23.438  85.023  1.00 13.63           C  
+ATOM   5116  C   ALA B 829      -6.400  24.920  84.955  1.00 15.02           C  
+ATOM   5117  O   ALA B 829      -6.244  25.590  85.985  1.00 15.49           O  
+ATOM   5118  CB  ALA B 829      -5.733  22.492  84.885  1.00 13.76           C  
+ATOM   5119  N   ILE B 830      -6.211  25.446  83.740  1.00 14.74           N  
+ATOM   5120  CA  ILE B 830      -5.801  26.835  83.573  1.00 14.70           C  
+ATOM   5121  C   ILE B 830      -6.945  27.727  84.041  1.00 14.57           C  
+ATOM   5122  O   ILE B 830      -6.729  28.709  84.761  1.00 15.31           O  
+ATOM   5123  CB  ILE B 830      -5.508  27.167  82.097  1.00 14.89           C  
+ATOM   5124  CG1 ILE B 830      -4.290  26.391  81.605  1.00 15.56           C  
+ATOM   5125  CG2 ILE B 830      -5.310  28.682  81.932  1.00 15.58           C  
+ATOM   5126  CD1 ILE B 830      -4.022  26.563  80.130  1.00 14.61           C  
+ATOM   5127  N   LYS B 831      -8.166  27.375  83.634  1.00 16.73           N  
+ATOM   5128  CA  LYS B 831      -9.343  28.131  84.025  1.00 19.33           C  
+ATOM   5129  C   LYS B 831      -9.486  28.174  85.547  1.00 20.65           C  
+ATOM   5130  O   LYS B 831      -9.744  29.232  86.119  1.00 20.20           O  
+ATOM   5131  CB  LYS B 831     -10.602  27.569  83.374  1.00 20.56           C  
+ATOM   5132  CG  LYS B 831     -11.751  28.543  83.488  1.00 23.03           C  
+ATOM   5133  CD  LYS B 831     -12.956  28.188  82.609  1.00 24.21           C  
+ATOM   5134  CE  LYS B 831     -12.799  28.652  81.144  1.00 24.55           C  
+ATOM   5135  NZ  LYS B 831     -14.046  28.359  80.388  1.00 23.63           N  
+ATOM   5136  N   GLU B 832      -9.266  27.049  86.220  1.00 22.27           N  
+ATOM   5137  CA  GLU B 832      -9.357  27.087  87.670  1.00 25.20           C  
+ATOM   5138  C   GLU B 832      -8.202  27.859  88.319  1.00 24.81           C  
+ATOM   5139  O   GLU B 832      -8.416  28.507  89.341  1.00 25.44           O  
+ATOM   5140  CB  GLU B 832      -9.578  25.711  88.288  1.00 29.12           C  
+ATOM   5141  CG  GLU B 832      -8.550  24.666  87.997  1.00 33.16           C  
+ATOM   5142  CD  GLU B 832      -9.028  23.279  88.451  1.00 36.14           C  
+ATOM   5143  OE1 GLU B 832     -10.268  23.039  88.437  1.00 38.01           O  
+ATOM   5144  OE2 GLU B 832      -8.171  22.431  88.805  1.00 36.98           O  
+ATOM   5145  N   ALA B 833      -7.001  27.842  87.729  1.00 22.57           N  
+ATOM   5146  CA  ALA B 833      -5.900  28.642  88.277  1.00 22.13           C  
+ATOM   5147  C   ALA B 833      -6.281  30.149  88.190  1.00 22.23           C  
+ATOM   5148  O   ALA B 833      -5.885  30.949  89.044  1.00 22.19           O  
+ATOM   5149  CB  ALA B 833      -4.587  28.366  87.522  1.00 21.19           C  
+ATOM   5150  N   LEU B 834      -7.082  30.520  87.192  1.00 22.57           N  
+ATOM   5151  CA  LEU B 834      -7.511  31.913  87.012  1.00 24.54           C  
+ATOM   5152  C   LEU B 834      -8.666  32.376  87.908  1.00 27.15           C  
+ATOM   5153  O   LEU B 834      -8.841  33.574  88.111  1.00 26.87           O  
+ATOM   5154  CB  LEU B 834      -7.858  32.195  85.544  1.00 23.15           C  
+ATOM   5155  CG  LEU B 834      -6.680  32.214  84.554  1.00 22.56           C  
+ATOM   5156  CD1 LEU B 834      -7.187  32.233  83.106  1.00 22.53           C  
+ATOM   5157  CD2 LEU B 834      -5.782  33.414  84.863  1.00 22.42           C  
+ATOM   5158  N   MET B 835      -9.470  31.439  88.403  1.00 30.86           N  
+ATOM   5159  CA  MET B 835     -10.607  31.776  89.272  1.00 35.01           C  
+ATOM   5160  C   MET B 835     -10.230  31.951  90.757  1.00 37.17           C  
+ATOM   5161  O   MET B 835     -10.838  32.844  91.390  1.00 40.31           O  
+ATOM   5162  CB  MET B 835     -11.737  30.736  89.140  1.00 35.66           C  
+ATOM   5163  CG  MET B 835     -12.433  30.741  87.801  1.00 37.03           C  
+ATOM   5164  SD  MET B 835     -13.730  29.495  87.637  1.00 40.25           S  
+ATOM   5165  CE  MET B 835     -12.842  27.973  87.858  1.00 39.14           C  
+TER    5166      MET B 835                                                      
+HETATM 5167  O   HOH A   1      19.092  16.066  38.353  1.00  8.41           O  
+HETATM 5168  O   HOH A   2      16.547  15.324  37.747  1.00 10.99           O  
+HETATM 5169  O   HOH A   3       6.695  26.587  37.079  1.00 10.88           O  
+HETATM 5170  O   HOH A   4      21.016  14.368  27.070  1.00  9.39           O  
+HETATM 5171  O   HOH A   5      26.848  12.043  28.407  1.00 11.87           O  
+HETATM 5172  O   HOH A   6      16.554  18.864  24.735  1.00 10.02           O  
+HETATM 5173  O   HOH A   7      17.849   7.210  38.783  1.00 11.25           O  
+HETATM 5174  O   HOH A   8      22.442  31.746  41.652  1.00 10.49           O  
+HETATM 5175  O   HOH A   9      12.873   5.300  43.714  1.00 13.36           O  
+HETATM 5176  O   HOH A  10      28.212  23.884  21.381  1.00 12.39           O  
+HETATM 5177  O   HOH A  11      26.566  18.819  28.818  1.00 12.51           O  
+HETATM 5178  O   HOH A  12      12.060  21.152  29.865  1.00 11.47           O  
+HETATM 5179  O   HOH A  13      23.092  11.560  28.962  1.00 11.17           O  
+HETATM 5180  O   HOH A  14       4.780  26.137  30.520  1.00 13.73           O  
+HETATM 5181  O   HOH A  15      20.446  10.150  41.932  1.00 12.80           O  
+HETATM 5182  O   HOH A  16       4.726  16.351  33.332  1.00 13.00           O  
+HETATM 5183  O   HOH A  17       4.136  11.222  37.765  1.00 16.90           O  
+HETATM 5184  O   HOH A  18      15.499  20.594  54.780  1.00 24.58           O  
+HETATM 5185  O   HOH A  19       7.268  -9.116  44.308  1.00 29.35           O  
+HETATM 5186  O   HOH A  20       7.544   5.719  41.181  1.00 15.25           O  
+HETATM 5187  O   HOH A  21      13.538  17.088  54.162  1.00 14.09           O  
+HETATM 5188  O   HOH A  22      13.111  12.935  34.616  1.00 14.25           O  
+HETATM 5189  O   HOH A  23      20.604  10.554  28.677  1.00 14.46           O  
+HETATM 5190  O   HOH A  24      19.507  25.637  43.636  1.00 15.05           O  
+HETATM 5191  O   HOH A  25      15.385  35.310  42.122  1.00 14.26           O  
+HETATM 5192  O   HOH A  26       2.601  10.075  39.424  1.00 21.42           O  
+HETATM 5193  O   HOH A  27      -0.118  12.637  38.816  1.00 21.59           O  
+HETATM 5194  O   HOH A  28      15.716 -12.816  48.256  1.00 20.09           O  
+HETATM 5195  O   HOH A  29      10.776   6.101  39.875  1.00 23.05           O  
+HETATM 5196  O   HOH A  30       8.907   8.721  56.594  1.00 18.76           O  
+HETATM 5197  O   HOH A  31      23.742   6.677  37.172  1.00 18.33           O  
+HETATM 5198  O   HOH A  32      18.178  11.281  52.509  1.00 21.24           O  
+HETATM 5199  O   HOH A  33      25.243  15.395  48.630  1.00 18.18           O  
+HETATM 5200  O   HOH A  34      20.716  35.408  30.200  1.00 19.39           O  
+HETATM 5201  O   HOH A  35      -1.257  17.902  46.345  1.00 38.64           O  
+HETATM 5202  O   HOH A  36      -1.323  15.788  45.629  1.00 17.53           O  
+HETATM 5203  O   HOH A  37      38.194   8.865  41.568  1.00 19.01           O  
+HETATM 5204  O   HOH A  38      39.358  19.261  39.040  1.00 18.54           O  
+HETATM 5205  O   HOH A  39       8.252  -7.125  39.541  1.00 37.34           O  
+HETATM 5206  O   HOH A  40       0.596  -2.149  51.896  1.00 20.47           O  
+HETATM 5207  O   HOH A  41       5.058  35.215  43.457  1.00 19.05           O  
+HETATM 5208  O   HOH A  42      32.964   3.818  43.801  1.00 20.97           O  
+HETATM 5209  O   HOH A  43      13.187  26.786  50.046  1.00 22.21           O  
+HETATM 5210  O   HOH A  44      21.565  -1.196  42.342  1.00 37.73           O  
+HETATM 5211  O   HOH A  45      20.869   1.321  43.607  1.00 20.34           O  
+HETATM 5212  O   HOH A  46      19.833   2.013  55.684  1.00 22.80           O  
+HETATM 5213  O   HOH A  47      20.435  14.846  53.291  1.00 20.43           O  
+HETATM 5214  O   HOH A  48      17.879  -3.555  40.884  1.00 20.82           O  
+HETATM 5215  O   HOH A  49      20.177  -0.969  39.757  1.00 40.33           O  
+HETATM 5216  O   HOH A  50      40.921  12.713  36.021  1.00 22.72           O  
+HETATM 5217  O   HOH A  51      -6.127  14.921  38.193  1.00 22.03           O  
+HETATM 5218  O   HOH A  52       5.904  32.134  28.591  1.00 20.98           O  
+HETATM 5219  O   HOH A  53      19.425  31.579  20.062  1.00 20.63           O  
+HETATM 5220  O   HOH A  54      -2.387  29.470  46.859  1.00 46.67           O  
+HETATM 5221  O   HOH A  55       3.159  29.874  49.502  1.00 36.83           O  
+HETATM 5222  O   HOH A  56      27.217  12.578  17.477  1.00 54.14           O  
+HETATM 5223  O   HOH A  57       7.481  -0.149  49.531  1.00 24.25           O  
+HETATM 5224  O   HOH A  58      28.883  15.229  18.637  1.00 23.58           O  
+HETATM 5225  O   HOH A  59      14.787  10.400  34.262  1.00 30.92           O  
+HETATM 5226  O   HOH A  60       2.668  25.328  28.877  1.00 20.67           O  
+HETATM 5227  O   HOH A  61      -1.920   3.649  55.031  1.00 29.89           O  
+HETATM 5228  O   HOH A  62      13.056  34.213  48.924  1.00 20.61           O  
+HETATM 5229  O   HOH A  63      30.555  19.691  45.878  1.00 23.31           O  
+HETATM 5230  O   HOH A  64       9.726 -12.345  45.837  1.00 52.60           O  
+HETATM 5231  O   HOH A  65      11.462  14.594  30.550  1.00 20.10           O  
+HETATM 5232  O   HOH A  66      31.017  23.755  42.397  1.00 20.53           O  
+HETATM 5233  O   HOH A  67      34.275  20.969  45.124  1.00 62.40           O  
+HETATM 5234  O   HOH A  68      -3.557  12.117  32.379  1.00 26.80           O  
+HETATM 5235  O   HOH A  69      24.422  37.005  35.363  1.00 24.42           O  
+HETATM 5236  O   HOH A  70      19.422  14.148  58.502  1.00 24.64           O  
+HETATM 5237  O   HOH A  71      28.709   4.427  49.649  1.00 31.62           O  
+HETATM 5238  O   HOH A  72      -8.556   3.438  45.752  1.00 26.90           O  
+HETATM 5239  O   HOH A  73       8.436  37.602  38.187  1.00 24.69           O  
+HETATM 5240  O   HOH A  74      14.202  22.999  54.415  1.00 27.61           O  
+HETATM 5241  O   HOH A  75      22.776   5.728  39.031  1.00 33.26           O  
+HETATM 5242  O   HOH A  76       1.523   4.744  36.455  1.00 23.96           O  
+HETATM 5243  O   HOH A  77      -1.746  21.683  45.895  1.00 48.37           O  
+HETATM 5244  O   HOH A  78      23.407   5.406  30.290  1.00 25.76           O  
+HETATM 5245  O   HOH A  79       7.093  -2.281  50.146  1.00 32.64           O  
+HETATM 5246  O   HOH A  80      33.930   3.884  32.329  1.00 30.08           O  
+HETATM 5247  O   HOH A  81       2.010  33.839  34.492  1.00 34.48           O  
+HETATM 5248  O   HOH A  82      29.362  32.016  23.290  1.00 47.11           O  
+HETATM 5249  O   HOH A  83      23.676  24.045  45.153  1.00 27.85           O  
+HETATM 5250  O   HOH A  84      21.703  16.882  15.491  1.00 26.92           O  
+HETATM 5251  O   HOH A  85       9.152 -10.205  47.883  1.00 26.01           O  
+HETATM 5252  O   HOH A  86      15.592  -2.231  36.166  1.00 53.96           O  
+HETATM 5253  O   HOH A  87      15.498   1.987  36.271  1.00 23.00           O  
+HETATM 5254  O   HOH A  88      39.603   6.631  33.944  1.00 27.66           O  
+HETATM 5255  O   HOH A  89      40.914  21.324  38.776  1.00 27.64           O  
+HETATM 5256  O   HOH A  90      12.162  25.478  52.725  1.00 44.31           O  
+HETATM 5257  O   HOH A  91      19.220  34.017  22.750  1.00 27.31           O  
+HETATM 5258  O   HOH A  92       6.912  30.644  26.694  1.00 35.20           O  
+HETATM 5259  O   HOH A  93      18.358  39.492  38.732  1.00 34.32           O  
+HETATM 5260  O   HOH A  94       9.309  37.483  27.619  1.00 25.77           O  
+HETATM 5261  O   HOH A  95      21.599  32.959  23.298  1.00 30.21           O  
+HETATM 5262  O   HOH A  96       9.265  26.009  29.284  1.00 26.25           O  
+HETATM 5263  O   HOH A  97       6.409  24.377  53.507  1.00 27.94           O  
+HETATM 5264  O   HOH A  98      16.490   0.624  25.160  1.00 45.41           O  
+HETATM 5265  O   HOH A  99      12.294  24.586  24.024  1.00 31.39           O  
+HETATM 5266  O   HOH A 100      -0.558  35.651  23.290  1.00 40.90           O  
+HETATM 5267  O   HOH A 101      10.378  36.004  20.806  1.00 29.72           O  
+HETATM 5268  O   HOH A 102       0.820   4.907  55.236  1.00 26.94           O  
+HETATM 5269  O   HOH A 103      10.929  23.202  27.909  1.00 29.96           O  
+HETATM 5270  O   HOH A 104      34.869  25.034  23.866  1.00 34.46           O  
+HETATM 5271  O   HOH A 105      29.015  31.319  20.245  1.00 27.16           O  
+HETATM 5272  O   HOH A 106      -5.686  17.155  39.523  1.00 33.77           O  
+HETATM 5273  O   HOH A 107      32.869  28.993  22.367  1.00 36.40           O  
+HETATM 5274  O   HOH A 108      34.677  32.045  38.500  1.00 30.03           O  
+HETATM 5275  O   HOH A 109      13.198 -15.131  44.935  1.00 29.68           O  
+HETATM 5276  O   HOH A 110      12.591  29.994  21.864  1.00 33.35           O  
+HETATM 5277  O   HOH A 111      16.700  24.364  16.393  1.00 29.43           O  
+HETATM 5278  O   HOH A 112      -8.993   0.342  53.572  1.00 32.01           O  
+HETATM 5279  O   HOH A 113      14.714   8.182  24.960  1.00 27.93           O  
+HETATM 5280  O   HOH A 114      -6.406  -1.567  52.940  1.00 27.23           O  
+HETATM 5281  O   HOH A 115      11.896 -12.296  48.647  1.00 31.24           O  
+HETATM 5282  O   HOH A 117      16.646  37.574  27.637  1.00 30.21           O  
+HETATM 5283  O   HOH A 118       1.849  -7.405  43.658  1.00 41.55           O  
+HETATM 5284  O   HOH A 119      20.364  19.716  51.572  1.00 36.09           O  
+HETATM 5285  O   HOH A 120      34.702   7.045  49.332  1.00 34.10           O  
+HETATM 5286  O   HOH A 121       4.499   1.315  55.561  1.00 27.33           O  
+HETATM 5287  O   HOH A 122      23.272   7.551  23.076  1.00 36.91           O  
+HETATM 5288  O   HOH A 123      13.808  37.251  19.174  1.00 30.43           O  
+HETATM 5289  O   HOH A 124       6.198   1.801  34.892  1.00 41.36           O  
+HETATM 5290  O   HOH A 125      17.488   2.333  55.180  1.00 29.71           O  
+HETATM 5291  O   HOH A 126      10.819  16.363  28.058  1.00 26.83           O  
+HETATM 5292  O   HOH A 127       6.489  16.464  58.027  1.00 50.52           O  
+HETATM 5293  O   HOH A 128       0.685  14.739  29.910  1.00 34.22           O  
+HETATM 5294  O   HOH A 129       2.169  34.573  39.079  1.00 42.85           O  
+HETATM 5295  O   HOH A 130      22.765  -5.966  42.543  1.00 36.13           O  
+HETATM 5296  O   HOH A 131      -0.127   8.255  56.541  1.00 26.47           O  
+HETATM 5297  O   HOH A 132      23.050   4.084  55.966  1.00 29.27           O  
+HETATM 5298  O   HOH A 133      20.862   3.875  57.453  1.00 34.13           O  
+HETATM 5299  O   HOH A 134      18.761  37.433  34.517  1.00 29.60           O  
+HETATM 5300  O   HOH A 135      23.871  18.365  14.972  1.00 32.09           O  
+HETATM 5301  O   HOH A 136       5.399  -3.221  51.305  1.00 39.04           O  
+HETATM 5302  O   HOH A 137       7.119   2.455  56.866  1.00 36.07           O  
+HETATM 5303  O   HOH A 138      27.506   0.575  51.281  1.00 36.84           O  
+HETATM 5304  O   HOH A 139      -3.543  -4.594  48.767  1.00 36.17           O  
+HETATM 5305  O   HOH A 140       3.503   2.815  36.219  1.00 33.83           O  
+HETATM 5306  O   HOH A 141      23.587  12.725  19.741  1.00 37.32           O  
+HETATM 5307  O   HOH A 142       8.989  20.839  58.051  1.00 45.44           O  
+HETATM 5308  O   HOH A 143      -2.534  29.744  33.113  1.00 32.75           O  
+HETATM 5309  O   HOH A 144      42.125  14.677  33.630  1.00 32.27           O  
+HETATM 5310  O   HOH A 145      -4.053  24.702  31.413  1.00 35.35           O  
+HETATM 5311  O   HOH A 146      14.122  11.847  31.761  1.00 49.01           O  
+HETATM 5312  O   HOH A 147      38.926  20.684  41.620  1.00 35.01           O  
+HETATM 5313  O   HOH A 148      -2.189  28.843  44.760  1.00 34.22           O  
+HETATM 5314  O   HOH A 149      11.249  -5.769  38.861  1.00 33.94           O  
+HETATM 5315  O   HOH A 150       5.649  32.761  53.301  1.00 58.68           O  
+HETATM 5316  O   HOH A 151      34.260  19.510  18.932  1.00 45.80           O  
+HETATM 5317  O   HOH A 152      14.769  17.390  12.522  1.00 43.82           O  
+HETATM 5318  O   HOH A 153      17.932  38.737  41.838  1.00 39.87           O  
+HETATM 5319  O   HOH A 154      25.739  26.223  45.840  1.00 37.55           O  
+HETATM 5320  O   HOH A 155      -2.117  29.274  55.092  1.00 30.50           O  
+HETATM 5321  O   HOH A 156      20.094  27.178  46.240  1.00 36.06           O  
+HETATM 5322  O   HOH A 157       9.113   1.258  56.545  1.00 40.12           O  
+HETATM 5323  O   HOH A 158       6.571 -10.608  50.078  1.00 67.84           O  
+HETATM 5324  O   HOH A 159      21.958  17.171  53.835  1.00 43.16           O  
+HETATM 5325  O   HOH A 160      21.936   0.334  35.813  1.00 33.02           O  
+HETATM 5326  O   HOH A 161      30.796   2.327  26.399  1.00 40.57           O  
+HETATM 5327  O   HOH A 162      27.662  12.787  50.246  1.00 40.50           O  
+HETATM 5328  O   HOH A 163      24.545   4.927  51.745  1.00 33.99           O  
+HETATM 5329  O   HOH A 164      16.496   6.307  24.788  1.00 52.52           O  
+HETATM 5330  O   HOH A 165      10.587   5.893  19.970  1.00 62.37           O  
+HETATM 5331  O   HOH A 166      -4.880  -1.513  41.940  1.00 31.35           O  
+HETATM 5332  O   HOH A 167      20.024   0.406  37.436  1.00 48.29           O  
+HETATM 5333  O   HOH A 168      39.002  12.977  48.816  1.00 49.88           O  
+HETATM 5334  O   HOH A 169       0.794  -5.344  50.407  1.00 58.54           O  
+HETATM 5335  O   HOH A 170       0.007  31.739  30.043  1.00 46.58           O  
+HETATM 5336  O   HOH A 172       3.209  -2.131  52.735  1.00 40.23           O  
+HETATM 5337  O   HOH A 173       0.772  18.965  45.987  1.00 39.51           O  
+HETATM 5338  O   HOH A 174      21.308  26.731  14.581  1.00 40.41           O  
+HETATM 5339  O   HOH A 175      13.671  31.289  51.094  1.00 62.43           O  
+HETATM 5340  O   HOH A 176      19.499  31.838  17.380  1.00 40.40           O  
+HETATM 5341  O   HOH A 177      11.886   2.295  56.480  1.00 50.97           O  
+HETATM 5342  O   HOH A 178      -4.252  27.303  50.245  1.00 44.66           O  
+HETATM 5343  O   HOH A 179      33.747   2.693  38.480  1.00 56.68           O  
+HETATM 5344  O   HOH A 180       3.291  21.885  28.023  1.00 50.12           O  
+HETATM 5345  O   HOH A 181       3.541  17.959  57.150  1.00 44.20           O  
+HETATM 5346  O   HOH A 182       8.161  37.710  29.626  1.00 38.49           O  
+HETATM 5347  O   HOH A 183      36.581   4.951  39.491  1.00 57.60           O  
+HETATM 5348  O   HOH A 184      23.646   7.936  56.692  1.00 50.35           O  
+HETATM 5349  O   HOH A 185      20.888   5.996  58.401  1.00 49.14           O  
+HETATM 5350  O   HOH A 186      12.407  12.817  61.829  1.00 37.44           O  
+HETATM 5351  O   HOH A 187      10.633   7.767  59.564  1.00 57.80           O  
+HETATM 5352  O   HOH A 188      17.889   9.445  30.740  1.00 36.98           O  
+HETATM 5353  O   HOH A 189      -0.529  19.933  56.089  1.00 45.89           O  
+HETATM 5354  O   HOH A 190      -9.019   3.505  47.871  1.00 52.05           O  
+HETATM 5355  O   HOH A 191      11.262  10.043  62.269  1.00 59.72           O  
+HETATM 5356  O   HOH A 192      39.452  25.983  29.260  1.00 54.32           O  
+HETATM 5357  O   HOH A 193      19.149   8.933  43.975  1.00 38.24           O  
+HETATM 5358  O   HOH A 194       8.192  32.808  26.669  1.00 29.09           O  
+HETATM 5359  O   HOH A 195      37.946  19.507  28.973  1.00 32.28           O  
+HETATM 5360  O   HOH A 196      17.677  11.123  15.895  1.00 30.03           O  
+HETATM 5361  O   HOH A 197      11.649  18.259  19.548  1.00 29.78           O  
+HETATM 5362  O   HOH A 198      22.936  18.625  12.852  1.00 45.21           O  
+HETATM 5363  O   HOH A 199       4.925  27.501  26.975  1.00 40.52           O  
+HETATM 5364  O   HOH A 200      27.861  -0.948  46.279  1.00 39.96           O  
+HETATM 5365  O   HOH A 201      11.237  14.317  16.719  1.00 32.61           O  
+HETATM 5366  O   HOH A 202      14.389  27.100  17.986  1.00 41.75           O  
+HETATM 5367  O   HOH A 203      36.932  27.545  43.214  1.00 33.49           O  
+HETATM 5368  O   HOH A 204      23.782  33.225  42.152  1.00 29.05           O  
+HETATM 5369  O   HOH A 205      -8.578   2.201  51.265  1.00 38.86           O  
+HETATM 5370  O   HOH A 206      25.560  30.029  46.884  1.00 38.81           O  
+HETATM 5371  O   HOH A 207       5.702  41.367  43.293  1.00 42.92           O  
+HETATM 5372  O   HOH A 208      -0.142  33.950  43.771  1.00 53.04           O  
+HETATM 5373  O   HOH A 209      23.466  17.507   9.102  1.00 35.29           O  
+HETATM 5374  O   HOH A 210       9.336  -5.342  37.057  1.00 38.16           O  
+HETATM 5375  O   HOH A 211      19.208  35.232  20.240  1.00 42.67           O  
+HETATM 5376  O   HOH A 212      21.847  22.379  46.946  1.00 47.09           O  
+HETATM 5377  O   HOH A 213       9.829   6.136  29.064  1.00 65.53           O  
+HETATM 5378  O   HOH A 214      18.300  -6.924  42.238  1.00 37.37           O  
+HETATM 5379  O   HOH A 215      33.657  21.753  17.638  1.00 41.06           O  
+HETATM 5380  O   HOH A 216      24.615  22.655  47.482  1.00 49.77           O  
+HETATM 5381  O   HOH A 218      13.895  22.801  16.048  1.00 53.98           O  
+HETATM 5382  O   HOH A 219      39.088  15.547  25.983  1.00 43.98           O  
+HETATM 5383  O   HOH A 220     -11.751   3.015  55.532  1.00 43.41           O  
+HETATM 5384  O   HOH A 221      22.192  13.305  58.897  1.00 47.00           O  
+HETATM 5385  O   HOH A 222       7.462  34.947  27.625  1.00 61.29           O  
+HETATM 5386  O   HOH A 223      18.127  36.940  30.127  1.00 67.74           O  
+HETATM 5387  O   HOH A 224     -10.173  19.602  47.111  1.00 50.12           O  
+HETATM 5388  O   HOH A 225       4.064  36.393  29.795  1.00 46.94           O  
+HETATM 5389  O   HOH A 226      25.689  34.637  24.853  1.00 47.62           O  
+HETATM 5390  O   HOH A 227       0.721  23.404  27.132  1.00 54.99           O  
+HETATM 5391  O   HOH A 228       2.351   8.980  59.016  1.00 58.70           O  
+HETATM 5392  O   HOH A 229      31.985  15.324  49.189  1.00 47.31           O  
+HETATM 5393  O   HOH A 230      -2.100  28.189  25.481  1.00 40.69           O  
+HETATM 5394  O   HOH A 231      32.843  18.552  17.241  1.00 52.37           O  
+HETATM 5395  O   HOH A 233      29.776  14.554  49.741  1.00 49.91           O  
+HETATM 5396  O   HOH A 281       7.680  33.949  50.969  1.00 35.24           O  
+HETATM 5397  O   HOH A 320       8.488  31.677  52.565  1.00 48.35           O  
+HETATM 5398  O   HOH A 381      11.970  40.004  36.107  1.00 63.40           O  
+HETATM 5399  O   HOH A 393       3.686  32.305  55.795  1.00 52.51           O  
+HETATM 5400  O   HOH A 397       8.329  15.693  60.042  1.00 40.55           O  
+HETATM 5401  O   HOH B 116      14.748  32.161  49.397  1.00 33.95           O  
+HETATM 5402  O   HOH B 171     -13.355  33.644  62.184  1.00 36.78           O  
+HETATM 5403  O   HOH B 217       2.042  27.943  56.451  1.00 49.17           O  
+HETATM 5404  O   HOH B 232      23.316  37.776  44.397  1.00 54.35           O  
+HETATM 5405  O   HOH B 234       7.439  33.931  70.275  1.00 13.96           O  
+HETATM 5406  O   HOH B 235       4.950  34.580  70.985  1.00  9.48           O  
+HETATM 5407  O   HOH B 236      17.406  33.585  81.547  1.00 11.47           O  
+HETATM 5408  O   HOH B 237       2.790  23.259  69.848  1.00 13.63           O  
+HETATM 5409  O   HOH B 238      -3.132  24.633  67.352  1.00 14.12           O  
+HETATM 5410  O   HOH B 239       7.256  20.906  74.244  1.00 12.97           O  
+HETATM 5411  O   HOH B 240       6.141  34.693  62.166  1.00 12.01           O  
+HETATM 5412  O   HOH B 241       1.520  38.468  86.779  1.00 18.06           O  
+HETATM 5413  O   HOH B 242      11.028  39.577  60.147  1.00 10.91           O  
+HETATM 5414  O   HOH B 243      -4.432  17.839  79.654  1.00 16.15           O  
+HETATM 5415  O   HOH B 244      -2.688  25.067  74.176  1.00 14.23           O  
+HETATM 5416  O   HOH B 245      11.975  26.111  76.290  1.00 14.46           O  
+HETATM 5417  O   HOH B 246       0.668  24.848  67.007  1.00 15.74           O  
+HETATM 5418  O   HOH B 247      19.334  26.853  81.210  1.00 14.18           O  
+HETATM 5419  O   HOH B 248       3.648  37.842  64.940  1.00 15.53           O  
+HETATM 5420  O   HOH B 249      19.295  29.547  71.414  1.00 13.45           O  
+HETATM 5421  O   HOH B 250      19.739  33.736  66.200  1.00 13.96           O  
+HETATM 5422  O   HOH B 251      10.409  50.429  71.603  1.00 12.57           O  
+HETATM 5423  O   HOH B 252      16.710  39.734  45.860  1.00 15.46           O  
+HETATM 5424  O   HOH B 253      16.553  37.176  60.564  1.00 13.25           O  
+HETATM 5425  O   HOH B 254       8.529  50.879  74.969  1.00 25.19           O  
+HETATM 5426  O   HOH B 255      10.888  30.771  67.958  1.00 13.04           O  
+HETATM 5427  O   HOH B 256       3.048  24.482  65.840  1.00 19.01           O  
+HETATM 5428  O   HOH B 257       4.569  40.198  80.273  1.00 17.08           O  
+HETATM 5429  O   HOH B 258       8.678  38.807  90.088  1.00 17.50           O  
+HETATM 5430  O   HOH B 259      21.484  35.524  64.927  1.00 16.89           O  
+HETATM 5431  O   HOH B 260      24.313  34.995  67.752  1.00 17.87           O  
+HETATM 5432  O   HOH B 261      16.140  46.312  92.123  1.00 17.48           O  
+HETATM 5433  O   HOH B 262      13.207  35.833  61.126  1.00 18.17           O  
+HETATM 5434  O   HOH B 263      15.243  52.558  63.195  1.00 17.75           O  
+HETATM 5435  O   HOH B 264       0.163  32.984  61.648  1.00 23.96           O  
+HETATM 5436  O   HOH B 265       5.728  48.294  65.677  1.00 18.54           O  
+HETATM 5437  O   HOH B 266      -1.157  44.752  69.959  1.00 15.58           O  
+HETATM 5438  O   HOH B 267       3.724  26.851  90.744  1.00 34.21           O  
+HETATM 5439  O   HOH B 268      25.322  41.822  70.766  1.00 18.87           O  
+HETATM 5440  O   HOH B 269      22.368  28.479  89.791  1.00 42.69           O  
+HETATM 5441  O   HOH B 270      33.001  37.560  63.743  1.00 19.24           O  
+HETATM 5442  O   HOH B 271     -15.598  35.487  74.136  1.00 24.16           O  
+HETATM 5443  O   HOH B 272      15.779  35.134  47.670  1.00 19.08           O  
+HETATM 5444  O   HOH B 273      23.387  47.303  52.383  1.00 20.94           O  
+HETATM 5445  O   HOH B 274      18.985  40.119  89.870  1.00 18.71           O  
+HETATM 5446  O   HOH B 275      -8.927  39.704  58.662  1.00 20.35           O  
+HETATM 5447  O   HOH B 276      11.085  46.543  81.325  1.00 23.40           O  
+HETATM 5448  O   HOH B 277       3.054  39.302  56.021  1.00 17.08           O  
+HETATM 5449  O   HOH B 278       3.717  40.980  58.037  1.00 54.48           O  
+HETATM 5450  O   HOH B 279       4.414  51.406  56.325  1.00 20.95           O  
+HETATM 5451  O   HOH B 280       3.554  49.374  69.340  1.00 18.98           O  
+HETATM 5452  O   HOH B 282       5.964  36.269  51.647  1.00 24.09           O  
+HETATM 5453  O   HOH B 283     -16.931  32.157  67.784  1.00 19.86           O  
+HETATM 5454  O   HOH B 284      30.273  34.109  69.896  1.00 27.55           O  
+HETATM 5455  O   HOH B 285      17.909  25.368  87.302  1.00 22.41           O  
+HETATM 5456  O   HOH B 286       4.627  16.633  87.139  1.00 25.53           O  
+HETATM 5457  O   HOH B 287      26.196  41.503  83.409  1.00 36.02           O  
+HETATM 5458  O   HOH B 288      21.155  45.378  84.765  1.00 58.15           O  
+HETATM 5459  O   HOH B 289      -5.403  14.908  71.017  1.00 30.95           O  
+HETATM 5460  O   HOH B 290      16.644  45.051  54.435  1.00 23.77           O  
+HETATM 5461  O   HOH B 291      -6.941  12.973  72.619  1.00 52.40           O  
+HETATM 5462  O   HOH B 292       9.060  30.383  65.526  1.00 22.62           O  
+HETATM 5463  O   HOH B 293      21.271  25.064  80.228  1.00 25.31           O  
+HETATM 5464  O   HOH B 294      25.858  50.682  57.897  1.00 22.54           O  
+HETATM 5465  O   HOH B 295      10.623  45.024  87.931  1.00 26.40           O  
+HETATM 5466  O   HOH B 296      -6.774  42.107  74.510  1.00 24.24           O  
+HETATM 5467  O   HOH B 297      15.913  37.013  45.657  1.00 19.18           O  
+HETATM 5468  O   HOH B 298      12.296  26.556  69.298  1.00 33.13           O  
+HETATM 5469  O   HOH B 299     -11.174  24.972 103.032  1.00 39.27           O  
+HETATM 5470  O   HOH B 300      -6.979  38.806  78.745  1.00 22.20           O  
+HETATM 5471  O   HOH B 301      27.406  28.484  67.612  1.00 23.66           O  
+HETATM 5472  O   HOH B 302      -0.194  32.304  92.017  1.00 25.56           O  
+HETATM 5473  O   HOH B 303       4.299  54.492  68.362  1.00 24.64           O  
+HETATM 5474  O   HOH B 304      -4.671  45.393  58.631  1.00 30.42           O  
+HETATM 5475  O   HOH B 305      32.572  41.587  58.308  1.00 22.61           O  
+HETATM 5476  O   HOH B 306      15.746  35.199  92.710  1.00 39.94           O  
+HETATM 5477  O   HOH B 307       9.786  51.023  77.206  1.00 28.25           O  
+HETATM 5478  O   HOH B 308       1.198  34.868  60.798  1.00 27.56           O  
+HETATM 5479  O   HOH B 309      22.558  32.369  59.801  1.00 29.00           O  
+HETATM 5480  O   HOH B 310      25.400  42.476  76.931  1.00 25.48           O  
+HETATM 5481  O   HOH B 311       0.344  26.020  61.106  1.00 25.50           O  
+HETATM 5482  O   HOH B 312      16.934  45.332  52.204  1.00 29.10           O  
+HETATM 5483  O   HOH B 313      -9.369  14.371  77.379  1.00 32.14           O  
+HETATM 5484  O   HOH B 314      22.064  31.046  89.021  1.00 24.06           O  
+HETATM 5485  O   HOH B 315      -8.528  18.349  89.376  1.00 24.13           O  
+HETATM 5486  O   HOH B 316       0.435  41.693  78.630  1.00 30.11           O  
+HETATM 5487  O   HOH B 317       1.584  11.798  73.120  1.00 30.98           O  
+HETATM 5488  O   HOH B 318      15.362  43.173  44.621  1.00 29.60           O  
+HETATM 5489  O   HOH B 319       8.197  32.118  57.027  1.00 24.67           O  
+HETATM 5490  O   HOH B 321      31.199  30.185  61.722  1.00 27.44           O  
+HETATM 5491  O   HOH B 322     -17.072  35.205  76.460  1.00 33.00           O  
+HETATM 5492  O   HOH B 323      12.274  49.073  80.223  1.00 24.99           O  
+HETATM 5493  O   HOH B 324       5.117  19.230  89.825  1.00 43.15           O  
+HETATM 5494  O   HOH B 325      15.811  23.228  87.244  1.00 54.03           O  
+HETATM 5495  O   HOH B 326       6.000  35.770  94.387  1.00 36.90           O  
+HETATM 5496  O   HOH B 327      15.101  24.717  92.228  1.00 29.30           O  
+HETATM 5497  O   HOH B 328       2.662  20.353  88.312  1.00 32.78           O  
+HETATM 5498  O   HOH B 329      14.429  25.585  80.968  1.00 32.30           O  
+HETATM 5499  O   HOH B 330      18.044  50.215  78.997  1.00 27.16           O  
+HETATM 5500  O   HOH B 331      19.334  45.805  90.182  1.00 32.88           O  
+HETATM 5501  O   HOH B 332      11.036  20.470  80.505  1.00 33.35           O  
+HETATM 5502  O   HOH B 333     -19.123  34.039  78.213  1.00 32.04           O  
+HETATM 5503  O   HOH B 334      14.295  18.329  87.940  1.00 59.00           O  
+HETATM 5504  O   HOH B 335      23.125  51.158  59.146  1.00 31.00           O  
+HETATM 5505  O   HOH B 336      13.007  24.411  78.260  1.00 31.11           O  
+HETATM 5506  O   HOH B 337     -15.858  22.514  82.572  1.00 52.70           O  
+HETATM 5507  O   HOH B 338      -5.591  16.928  87.148  1.00 29.28           O  
+HETATM 5508  O   HOH B 339      29.824  35.939  71.739  1.00 27.30           O  
+HETATM 5509  O   HOH B 340      -4.663  20.149  87.918  1.00 35.03           O  
+HETATM 5510  O   HOH B 341     -10.607  35.253  86.978  1.00 34.60           O  
+HETATM 5511  O   HOH B 342      21.277  41.352  89.613  1.00 49.69           O  
+HETATM 5512  O   HOH B 343      11.461  18.437  85.397  1.00 26.10           O  
+HETATM 5513  O   HOH B 344       4.475  11.775  80.888  1.00 27.10           O  
+HETATM 5514  O   HOH B 345      32.910  48.668  54.258  1.00 28.47           O  
+HETATM 5515  O   HOH B 346       4.364  18.122  63.520  1.00 32.48           O  
+HETATM 5516  O   HOH B 347      32.630  46.727  56.890  1.00 33.74           O  
+HETATM 5517  O   HOH B 348      16.288  41.179  43.225  1.00 58.25           O  
+HETATM 5518  O   HOH B 349       9.666  45.043  85.325  1.00 30.90           O  
+HETATM 5519  O   HOH B 350      11.805  24.177  95.869  1.00 48.75           O  
+HETATM 5520  O   HOH B 351      22.242  38.779  47.166  1.00 29.13           O  
+HETATM 5521  O   HOH B 352       3.453  48.208  74.453  1.00 40.58           O  
+HETATM 5522  O   HOH B 353     -11.224  45.171  61.549  1.00 55.91           O  
+HETATM 5523  O   HOH B 354      19.387  51.335  56.032  1.00 27.93           O  
+HETATM 5524  O   HOH B 355       2.032  23.410  62.979  1.00 46.81           O  
+HETATM 5525  O   HOH B 356       7.467  15.700  94.184  1.00 35.08           O  
+HETATM 5526  O   HOH B 357      18.756  30.581  52.741  1.00 31.41           O  
+HETATM 5527  O   HOH B 358       6.487  51.054  56.822  1.00 29.31           O  
+HETATM 5528  O   HOH B 359      13.121  24.203  71.251  1.00 46.50           O  
+HETATM 5529  O   HOH B 360      17.500  53.923  70.154  1.00 32.36           O  
+HETATM 5530  O   HOH B 361      23.444  25.786  69.799  1.00 38.24           O  
+HETATM 5531  O   HOH B 362      22.194  35.799  89.283  1.00 30.53           O  
+HETATM 5532  O   HOH B 363      -1.186  36.601  50.287  1.00 48.92           O  
+HETATM 5533  O   HOH B 364      24.144  52.464  62.699  1.00 31.31           O  
+HETATM 5534  O   HOH B 365       2.291  53.667  59.537  1.00 40.22           O  
+HETATM 5535  O   HOH B 366       0.425  51.643  58.771  1.00 32.98           O  
+HETATM 5536  O   HOH B 367       5.091  31.699  92.420  1.00 35.57           O  
+HETATM 5537  O   HOH B 368      32.321  45.942  91.655  1.00 52.87           O  
+HETATM 5538  O   HOH B 369      18.563  46.577  51.453  1.00 27.08           O  
+HETATM 5539  O   HOH B 370      17.280  52.655  56.855  1.00 35.97           O  
+HETATM 5540  O   HOH B 371      -3.601  46.622  54.884  1.00 40.65           O  
+HETATM 5541  O   HOH B 372      28.288  44.309  50.784  1.00 50.16           O  
+HETATM 5542  O   HOH B 373      21.146  32.821  57.676  1.00 39.27           O  
+HETATM 5543  O   HOH B 374       0.107  15.141  68.731  1.00 44.32           O  
+HETATM 5544  O   HOH B 375      15.916  52.384  77.418  1.00 38.73           O  
+HETATM 5545  O   HOH B 376      26.382  29.240  84.737  1.00 34.99           O  
+HETATM 5546  O   HOH B 377     -18.219  29.808  69.614  1.00 32.85           O  
+HETATM 5547  O   HOH B 378      28.556  28.222  80.228  1.00 38.74           O  
+HETATM 5548  O   HOH B 379       9.034  28.051  67.305  1.00 32.99           O  
+HETATM 5549  O   HOH B 380      26.642  25.242  95.920  1.00 39.74           O  
+HETATM 5550  O   HOH B 382      10.488  33.782  51.265  1.00 34.16           O  
+HETATM 5551  O   HOH B 383      18.477  47.625  85.435  1.00 33.25           O  
+HETATM 5552  O   HOH B 384     -10.288  15.489  75.489  1.00 43.76           O  
+HETATM 5553  O   HOH B 385       6.985   6.114  76.686  1.00 40.24           O  
+HETATM 5554  O   HOH B 386       9.284  40.209  92.226  1.00 26.97           O  
+HETATM 5555  O   HOH B 387       2.426  43.260  77.203  1.00 37.48           O  
+HETATM 5556  O   HOH B 388      21.594  49.319  85.641  1.00 63.27           O  
+HETATM 5557  O   HOH B 389       3.891  42.665  81.958  1.00 28.85           O  
+HETATM 5558  O   HOH B 390      14.554  52.382  55.766  1.00 33.31           O  
+HETATM 5559  O   HOH B 391      19.390  40.711  45.920  1.00 34.09           O  
+HETATM 5560  O   HOH B 392       1.779  49.905  71.347  1.00 43.27           O  
+HETATM 5561  O   HOH B 394      -7.135  21.945  57.471  1.00 38.93           O  
+HETATM 5562  O   HOH B 395      -4.084  46.475  67.409  1.00 35.80           O  
+HETATM 5563  O   HOH B 396      -0.011  52.405  62.898  1.00 44.36           O  
+HETATM 5564  O   HOH B 398      11.370  15.515  60.542  1.00 46.65           O  
+HETATM 5565  O   HOH B 399      28.570  37.378  53.924  1.00 58.86           O  
+HETATM 5566  O   HOH B 400       0.768  30.031  56.195  1.00 48.36           O  
+HETATM 5567  O   HOH B 401     -12.502  46.812  64.587  1.00 41.50           O  
+HETATM 5568  O   HOH B 402      25.213  40.882  48.238  1.00 46.86           O  
+HETATM 5569  O   HOH B 403      25.580  22.893  84.946  1.00 45.70           O  
+HETATM 5570  O   HOH B 404      -2.249  11.540  87.002  1.00 31.82           O  
+HETATM 5571  O   HOH B 405      25.308  49.851  52.412  1.00 37.89           O  
+HETATM 5572  O   HOH B 406      24.661  42.533  73.312  1.00 42.30           O  
+HETATM 5573  O   HOH B 407       2.972  11.241  82.743  1.00 44.00           O  
+HETATM 5574  O   HOH B 408      13.602  48.749  82.587  1.00 35.11           O  
+HETATM 5575  O   HOH B 409      27.776  57.429  37.966  1.00 38.85           O  
+HETATM 5576  O   HOH B 410      12.082  51.920  56.347  1.00 40.47           O  
+HETATM 5577  O   HOH B 411      27.993  46.209  81.546  1.00 34.53           O  
+HETATM 5578  O   HOH B 412     -12.836  35.702  59.217  1.00 56.62           O  
+HETATM 5579  O   HOH B 413      14.774  23.856  76.256  1.00 54.46           O  
+HETATM 5580  O   HOH B 414      17.265  54.862  74.559  1.00 41.62           O  
+HETATM 5581  O   HOH B 415      14.436  24.254  94.784  1.00 49.31           O  
+HETATM 5582  O   HOH B 416      31.277  34.474  57.710  1.00 48.63           O  
+HETATM 5583  O   HOH B 417       3.921  54.887  60.562  1.00 38.97           O  
+HETATM 5584  O   HOH B 418       7.279  57.053  60.698  1.00 42.99           O  
+HETATM 5585  O   HOH B 419      12.783  56.454  69.886  1.00 59.67           O  
+HETATM 5586  O   HOH B 420       9.287  54.924  62.562  1.00 55.31           O  
+HETATM 5587  O   HOH B 421       6.435  26.733  64.945  1.00 45.61           O  
+HETATM 5588  O   HOH B 422      27.163  48.475  71.511  1.00 36.69           O  
+HETATM 5589  O   HOH B 423      32.717  39.475  56.975  1.00 66.63           O  
+HETATM 5590  O   HOH B 424      13.945  54.932  62.936  1.00 44.37           O  
+HETATM 5591  O   HOH B 425     -16.352  27.758  82.727  1.00 59.88           O  
+HETATM 5592  O   HOH B 426     -10.226  28.273  58.851  1.00 22.92           O  
+HETATM 5593  O   HOH B 427      15.345  37.556  43.119  1.00 30.79           O  
+HETATM 5594  O   HOH B 428      14.902  34.782  60.183  1.00 29.59           O  
+HETATM 5595  O   HOH B 429      12.342  40.180  92.912  1.00 35.70           O  
+HETATM 5596  O   HOH B 430      18.635  30.601  57.111  1.00 30.88           O  
+HETATM 5597  O   HOH B 431      -7.115  10.825  84.024  1.00 40.05           O  
+HETATM 5598  O   HOH B 432      22.562  46.248  86.460  1.00 37.42           O  
+HETATM 5599  O   HOH B 433      14.941  53.849  75.753  1.00 44.97           O  
+HETATM 5600  O   HOH B 434       6.418  51.509  76.317  1.00 42.82           O  
+HETATM 5601  O   HOH B 435      -3.377  13.540  89.150  1.00 49.63           O  
+HETATM 5602  O   HOH B 436      17.524  26.763  66.833  1.00 45.16           O  
+HETATM 5603  O   HOH B 437      14.163  52.054  80.027  1.00 42.40           O  
+HETATM 5604  O   HOH B 438     -14.268  19.606  63.930  1.00 53.29           O  
+HETATM 5605  O   HOH B 439      24.388  33.353  87.899  1.00 51.55           O  
+HETATM 5606  O   HOH B 440      26.499  35.132  53.196  1.00 50.30           O  
+HETATM 5607  O   HOH B 441      20.910  24.375  68.203  1.00 41.47           O  
+HETATM 5608  O   HOH B 442      12.592  22.023  74.150  1.00 48.62           O  
+HETATM 5609  O   HOH B 443      27.810  51.436  60.171  1.00 47.01           O  
+HETATM 5610  O   HOH B 444      20.572  32.850  90.940  1.00 39.22           O  
+HETATM 5611  O   HOH B 445       7.283  45.036  85.904  1.00 47.83           O  
+HETATM 5612  O   HOH B 446      19.416  49.282  52.360  1.00 62.10           O  
+HETATM 5613  O   HOH B 447      -6.500  47.108  60.081  1.00 46.04           O  
+HETATM 5614  O   HOH B 448      29.110  49.027  69.273  1.00 40.84           O  
+HETATM 5615  O   HOH B 449      23.798  27.669  65.029  1.00 46.57           O  
+HETATM 5616  O   HOH B 450     -15.229  44.157  67.678  1.00 50.74           O  
+HETATM 5617  O   HOH B 451      18.882  25.750  65.244  1.00 45.94           O  
+HETATM 5618  O   HOH B 452      16.513  52.748  52.843  1.00 51.82           O  
+HETATM 5619  O   HOH B 453      30.078  50.954  62.668  1.00 65.77           O  
+HETATM 5620  O   HOH B 454     -13.923  24.553  83.514  1.00 42.38           O  
+HETATM 5621  O   HOH B 455      11.887  26.977  67.039  1.00 50.06           O  
+HETATM 5622  O   HOH B 456       4.457  32.773  95.166  1.00 54.07           O  
+HETATM 5623  O   HOH B 457      22.641  45.784  49.039  1.00 62.26           O  
+MASTER      336    2    0   28   20    0    0    9 5621    2    0   54          
+END                                                                             
diff --git a/test/jalview/ext/jmol/JmolCommandsTest.java b/test/jalview/ext/jmol/JmolCommandsTest.java
new file mode 100644 (file)
index 0000000..46fa241
--- /dev/null
@@ -0,0 +1,34 @@
+package jalview.ext.jmol;
+
+import jalview.datamodel.Alignment;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.Sequence;
+import jalview.datamodel.SequenceI;
+import jalview.gui.AlignFrame;
+import jalview.gui.SequenceRenderer;
+import jalview.structure.StructureMappingcommandSet;
+import jalview.structure.StructureSelectionManager;
+
+import org.testng.annotations.Test;
+
+public class JmolCommandsTest
+{
+
+  @Test(groups = { "Functional" })
+  public void testGetColourBySequenceCommand_noFeatures()
+  {
+    SequenceI seq1 = new Sequence("seq1", "MHRSQTRALK");
+    SequenceI seq2 = new Sequence("seq2", "MRLEITQSGD");
+    AlignmentI al = new Alignment(new SequenceI[] { seq1, seq2 });
+    AlignFrame af = new AlignFrame(al, 800, 500);
+    SequenceRenderer sr = new SequenceRenderer(af.getViewport());
+    SequenceI[][] seqs = new SequenceI[][] { { seq1 }, { seq2 } };
+    String[] files = new String[] { "seq1.pdb", "seq2.pdb" };
+    StructureSelectionManager ssm = new StructureSelectionManager();
+
+    // need some mappings!
+
+    StructureMappingcommandSet[] commands = JmolCommands
+            .getColourBySequenceCommand(ssm, files, seqs, sr, null, al);
+  }
+}
similarity index 91%
rename from test/jalview/ext/jmol/PDBFileWithJmolTest.java
rename to test/jalview/ext/jmol/JmolParserTest.java
index 4dc7095..7ac1579 100644 (file)
@@ -43,14 +43,15 @@ import MCview.PDBfile;
  * @author jimp
  * 
  */
-public class PDBFileWithJmolTest
+public class JmolParserTest
 {
   /*
    * 1GAQ has been reduced to alpha carbons only
    * 1QCF is the full PDB file including headers, HETATM etc
    */
   String[] testFile = new String[] { "./examples/1GAQ.txt",
-      "./test/jalview/ext/jmol/1QCF.pdb" }; // ,
+      "./test/jalview/ext/jmol/1xyz.pdb",
+      "./test/jalview/ext/jmol/1qcf.pdb" };
 
   //@formatter:off
   // a modified and very cut-down extract of 4UJ4
@@ -108,7 +109,7 @@ public class PDBFileWithJmolTest
     {
       PDBfile mctest = new PDBfile(false, false, false, pdbStr,
               AppletFormatAdapter.FILE);
-      PDBFileWithJmol jtest = new PDBFileWithJmol(pdbStr,
+      JmolParser jtest = new JmolParser(false, false, false, pdbStr,
               jalview.io.AppletFormatAdapter.FILE);
       Vector<SequenceI> seqs = jtest.getSeqs(), mcseqs = mctest.getSeqs();
 
@@ -174,7 +175,12 @@ public class PDBFileWithJmolTest
   {
     PDBfile mctest = new PDBfile(false, false, false, pdbWithChainBreak,
             AppletFormatAdapter.PASTE);
-    PDBFileWithJmol jtest = new PDBFileWithJmol(pdbWithChainBreak,
+    boolean annotFromStructure = false;
+    boolean localSecondaryStruct = false;
+    boolean serviceSecondaryStruct = false;
+    JmolParser jtest = new JmolParser(annotFromStructure,
+            localSecondaryStruct, serviceSecondaryStruct,
+            pdbWithChainBreak,
             jalview.io.AppletFormatAdapter.PASTE);
     Vector<SequenceI> seqs = jtest.getSeqs();
     Vector<SequenceI> mcseqs = mctest.getSeqs();
@@ -197,7 +203,11 @@ public class PDBFileWithJmolTest
   {
     PDBfile mctest = new PDBfile(false, false, false, pdbWithAltLoc,
             AppletFormatAdapter.PASTE);
-    PDBFileWithJmol jtest = new PDBFileWithJmol(pdbWithAltLoc,
+    boolean annotFromStructure = false;
+    boolean localSecondaryStruct = false;
+    boolean serviceSecondaryStruct = false;
+    JmolParser jtest = new JmolParser(annotFromStructure,
+            localSecondaryStruct, serviceSecondaryStruct, pdbWithAltLoc,
             jalview.io.AppletFormatAdapter.PASTE);
     Vector<SequenceI> seqs = jtest.getSeqs();
     Vector<SequenceI> mcseqs = mctest.getSeqs();
@@ -211,7 +221,7 @@ public class PDBFileWithJmolTest
   @Test(groups = "Functional")
   public void testSetSecondaryStructure()
   {
-    PDBFileWithJmol testee = new PDBFileWithJmol();
+    JmolParser testee = new JmolParser();
     char[] struct = new char[10];
     char[] structCode = new char[10];
     struct[0] = '1';
diff --git a/test/jalview/ext/so/SequenceOntologyTest.java b/test/jalview/ext/so/SequenceOntologyTest.java
new file mode 100644 (file)
index 0000000..be07485
--- /dev/null
@@ -0,0 +1,83 @@
+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;
+
+public class SequenceOntologyTest
+{
+  private SequenceOntologyI so;
+
+  @BeforeClass
+  public void setUp() {
+    long now = System.currentTimeMillis();
+    SequenceOntologyFactory.setInstance(new SequenceOntology());
+    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")
+  public void testIsA()
+  {
+    assertFalse(so.isA(null, null));
+    assertFalse(so.isA(null, "SO:0000087"));
+    assertFalse(so.isA("SO:0000087", null));
+    assertFalse(so.isA("complete", "garbage"));
+
+    assertTrue(so.isA("SO:0000087", "SO:0000704"));
+    assertFalse(so.isA("SO:0000704", "SO:0000087"));
+    assertTrue(so.isA("SO:0000736", "SO:0000735"));
+
+    // same thing:
+    assertTrue(so.isA("micronuclear_sequence", "micronuclear_sequence"));
+    // direct parent:
+    assertTrue(so.isA("micronuclear_sequence", "organelle_sequence"));
+    // grandparent:
+    assertTrue(so.isA("micronuclear_sequence", "sequence_location"));
+    // great-grandparent:
+    assertTrue(so.isA("micronuclear_sequence", "sequence_attribute"));
+
+    // same thing by name / description:
+    assertTrue(so.isA("micronuclear_sequence", "SO:0000084"));
+    assertTrue(so.isA("SO:0000084", "micronuclear_sequence"));
+    assertTrue(so.isA("SO:0000084", "SO:0000084"));
+
+    // SO name to description:
+    assertTrue(so.isA("SO:0000084", "organelle_sequence"));
+    assertTrue(so.isA("SO:0000084", "sequence_location"));
+    assertTrue(so.isA("SO:0000084", "sequence_attribute"));
+
+    // description to SO name:
+    assertTrue(so.isA("micronuclear_sequence", "SO:0000736"));
+    assertTrue(so.isA("micronuclear_sequence", "SO:0000735"));
+    assertTrue(so.isA("micronuclear_sequence", "SO:0000400"));
+  }
+
+  @Test(groups = "Functional")
+  public void testIsCDS()
+  {
+    assertTrue(so.isA("CDS", "CDS"));
+    assertTrue(so.isA("CDS_predicted", "CDS"));
+    assertTrue(so.isA("transposable_element_CDS", "CDS"));
+    assertTrue(so.isA("edited_CDS", "CDS"));
+    assertTrue(so.isA("CDS_independently_known", "CDS"));
+    assertTrue(so.isA("CDS_fragment", "CDS"));
+    assertFalse(so.isA("CDS_region", "CDS"));// part_of
+    assertFalse(so.isA("polypeptide", "CDS")); // derives_from
+  }
+}
diff --git a/test/jalview/fts/core/FTSRestClientTest.java b/test/jalview/fts/core/FTSRestClientTest.java
new file mode 100644 (file)
index 0000000..0dac04b
--- /dev/null
@@ -0,0 +1,298 @@
+package jalview.fts.core;
+
+import jalview.fts.api.FTSDataColumnI;
+import jalview.fts.api.FTSDataColumnI.FTSDataColumnGroupI;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.testng.Assert;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+public class FTSRestClientTest
+{
+  private FTSRestClient ftsRestClient;
+
+  @BeforeMethod(alwaysRun = true)
+  public void setup()
+  {
+    ftsRestClient = new FTSRestClient()
+    {
+
+      @Override
+      public String getColumnDataConfigFileName()
+      {
+        return "/fts/uniprot_data_columns.txt";
+      }
+
+      @Override
+      public FTSRestResponse executeRequest(FTSRestRequest ftsRequest)
+              throws Exception
+      {
+        return null;
+      }
+    };
+  }
+
+  @Test(groups = { "Functional" })
+  public void getPrimaryKeyColumIndexTest()
+  {
+    Collection<FTSDataColumnI> wantedFields = ftsRestClient
+            .getAllDefaulDisplayedDataColumns();
+    int foundIndex = -1;
+    try
+    {
+      Assert.assertEquals(foundIndex, -1);
+      foundIndex = ftsRestClient.getPrimaryKeyColumIndex(wantedFields,
+              false);
+      Assert.assertEquals(foundIndex, 0);
+      foundIndex = ftsRestClient
+              .getPrimaryKeyColumIndex(wantedFields, true);
+      Assert.assertEquals(foundIndex, 1);
+    } catch (Exception e)
+    {
+      e.printStackTrace();
+      Assert.fail("Exception thrown while testing...");
+    }
+  }
+
+  @Test(groups = { "Functional" })
+  public void getAllDefaulDisplayedDataColumns()
+  {
+    Assert.assertNotNull(ftsRestClient.getAllDefaulDisplayedDataColumns());
+    Assert.assertTrue(!ftsRestClient.getAllDefaulDisplayedDataColumns()
+            .isEmpty());
+    Assert.assertEquals(ftsRestClient.getAllDefaulDisplayedDataColumns()
+            .size(), 7);
+  }
+
+  @Test(groups = { "Functional" })
+  public void getDataColumnsFieldsAsCommaDelimitedString()
+  {
+    Collection<FTSDataColumnI> wantedFields = ftsRestClient
+            .getAllDefaulDisplayedDataColumns();
+    String actual = ftsRestClient
+            .getDataColumnsFieldsAsCommaDelimitedString(wantedFields);
+    Assert.assertEquals(actual,
+            "id,entry name,protein names,genes,organism,length,reviewed");
+  }
+
+
+  @Test(groups = { "Functional" })
+  public void getAllFTSDataColumns()
+  {
+    Collection<FTSDataColumnI> allFields = ftsRestClient
+            .getAllFTSDataColumns();
+    Assert.assertNotNull(allFields);
+    Assert.assertEquals(allFields.size(), 117);
+  }
+
+  @Test(groups = { "Functional" })
+  public void getSearchableDataColumns()
+  {
+    Collection<FTSDataColumnI> searchalbeFields = ftsRestClient
+            .getSearchableDataColumns();
+    Assert.assertNotNull(searchalbeFields);
+    Assert.assertEquals(searchalbeFields.size(), 30);
+  }
+
+  @Test(groups = { "Functional" })
+  public void getPrimaryKeyColumn()
+  {
+    FTSDataColumnI expectedPKColumn;
+    try
+    {
+      expectedPKColumn = ftsRestClient
+              .getDataColumnByNameOrCode("Uniprot Id");
+      Assert.assertNotNull(ftsRestClient.getPrimaryKeyColumn());
+      Assert.assertEquals(ftsRestClient.getPrimaryKeyColumn(),
+              expectedPKColumn);
+    } catch (Exception e)
+    {
+      e.printStackTrace();
+      Assert.fail("Exception thrown while testing...");
+    }
+  }
+
+  @Test(groups = { "Functional" })
+  public void getDataColumnByNameOrCode()
+  {
+    try
+    {
+      FTSDataColumnI foundDataCol = ftsRestClient
+              .getDataColumnByNameOrCode("genes");
+      Assert.assertNotNull(foundDataCol);
+      Assert.assertEquals(foundDataCol.getName(), "Gene Names");
+    } catch (Exception e)
+    {
+      e.printStackTrace();
+      Assert.fail("Exception thrown while testing...");
+    }
+  }
+
+  @Test(groups = { "Functional" })
+  public void getDataColumnGroupById()
+  {
+    FTSDataColumnGroupI foundDataColGroup;
+    try
+    {
+      foundDataColGroup = ftsRestClient.getDataColumnGroupById("g3");
+      Assert.assertNotNull(foundDataColGroup);
+      Assert.assertEquals(foundDataColGroup.getName(), "Names & Taxonomy");
+    } catch (Exception e)
+    {
+      e.printStackTrace();
+    }
+  }
+
+  @Test(groups = { "Functional" })
+  public void getDefaultResponsePageSize()
+  {
+    int defaultResSize = ftsRestClient.getDefaultResponsePageSize();
+    Assert.assertEquals(defaultResSize, 100);
+  }
+
+  @Test(groups = { "Functional" })
+  public void getColumnMinWidthTest()
+  {
+    try
+    {
+      FTSDataColumnI foundDataCol = ftsRestClient
+              .getDataColumnByNameOrCode("Protein names");
+      Assert.assertNotNull(foundDataCol);
+      int actualColMinWidth = foundDataCol.getMinWidth();
+      Assert.assertEquals(actualColMinWidth, 300);
+    } catch (Exception e)
+    {
+      e.printStackTrace();
+      Assert.fail("Exception thrown while testing...");
+    }
+  }
+
+  @Test(groups = { "Functional" })
+  public void getColumnMaxWidthTest()
+  {
+    try
+    {
+      FTSDataColumnI foundDataCol = ftsRestClient
+              .getDataColumnByNameOrCode("Protein names");
+      Assert.assertNotNull(foundDataCol);
+      int actualColMinWidth = foundDataCol.getMaxWidth();
+      Assert.assertEquals(actualColMinWidth, 1500);
+    } catch (Exception e)
+    {
+      e.printStackTrace();
+      Assert.fail("Exception thrown while testing...");
+    }
+  }
+
+  @Test(groups = { "Functional" })
+  public void getColumnPreferredWidthTest()
+  {
+    try
+    {
+      FTSDataColumnI foundDataCol = ftsRestClient
+              .getDataColumnByNameOrCode("Protein names");
+      Assert.assertNotNull(foundDataCol);
+      int actualColMinWidth = foundDataCol.getPreferredWidth();
+      Assert.assertEquals(actualColMinWidth, 500);
+    } catch (Exception e)
+    {
+      e.printStackTrace();
+      Assert.fail("Exception thrown while testing...");
+    }
+  }
+
+  @Test(groups = { "Functional" })
+  public void getColumnClassTest()
+  {
+    try
+    {
+      FTSDataColumnI foundDataCol = ftsRestClient
+              .getDataColumnByNameOrCode("Protein names");
+      Assert.assertNotNull(foundDataCol);
+      Assert.assertEquals(foundDataCol.getDataColumnClass(), String.class);
+      foundDataCol = ftsRestClient.getDataColumnByNameOrCode("length");
+      Assert.assertNotNull(foundDataCol);
+      Assert.assertEquals(foundDataCol.getDataColumnClass(), Integer.class);
+      // foundDataCol = ftsRestClient.getDataColumnByNameOrCode("length");
+      // Assert.assertNotNull(foundDataCol);
+      // Assert.assertEquals(foundDataCol.getDataColumnClass(), Double.class);
+    } catch (Exception e)
+    {
+      e.printStackTrace();
+      Assert.fail("Exception thrown while testing...");
+    }
+  }
+
+  @Test(groups = { "Functional" })
+  public void coverageForEqualsAndHashFunction()
+  {
+    Set<FTSDataColumnI> uniqueSet = new HashSet<FTSDataColumnI>();
+    Collection<FTSDataColumnI> searchableCols = ftsRestClient
+            .getSearchableDataColumns();
+    for (FTSDataColumnI foundCol : searchableCols)
+    {
+      uniqueSet.add(foundCol);
+      uniqueSet.add(foundCol);
+    }
+    Assert.assertTrue(!uniqueSet.isEmpty());
+    Assert.assertEquals(uniqueSet.size(), 30);
+  }
+
+  @Test(groups = { "Functional" })
+  public void coverageForMiscellaneousBranches()
+  {
+    String actual = ftsRestClient.getPrimaryKeyColumn().toString();
+    Assert.assertEquals(actual, "Uniprot Id");
+
+    String actualGroupStr;
+    try
+    {
+      actualGroupStr = ftsRestClient.getDataColumnGroupById("g4")
+              .toString();
+      Assert.assertEquals(actualGroupStr, "Procedures & Softwares");
+      actualGroupStr = ftsRestClient.getDataColumnGroupById(
+              "unavailable group").toString();
+    } catch (Exception e)
+    {
+      Assert.assertTrue(true);
+    }
+
+    String actualResourseFile = ftsRestClient
+            .getResourceFile("/fts/uniprot_data_columns.txt");
+    Assert.assertNotNull(actualResourseFile);
+    Assert.assertTrue(actualResourseFile.length() > 31);
+  }
+
+  @Test(groups = { "Functional" }, expectedExceptions = Exception.class)
+  public void coverageForExceptionBranches() throws Exception
+  {
+    try
+    {
+      ftsRestClient.getDataColumnByNameOrCode("unavailable column");
+    } catch (Exception e)
+    {
+      System.out.println(e.getMessage());
+      String expectedMessage = "Couldn't find data column with name : unavailable column";
+      Assert.assertEquals(e.getMessage(), expectedMessage);
+    }
+    try
+    {
+      ftsRestClient.getDataColumnGroupById("unavailable column group Id");
+    } catch (Exception e)
+    {
+      System.out.println(e.getMessage());
+      String expectedMessage = "Couldn't find data column group with id : unavailable column group Id";
+      Assert.assertEquals(e.getMessage(), expectedMessage);
+    }
+
+    ftsRestClient.getDataColumnByNameOrCode("unavailable column");
+
+    ftsRestClient.getResourceFile("unavailable resource file");
+
+  }
+
+}
similarity index 79%
rename from test/jalview/gui/PDBSearchPanelTest.java
rename to test/jalview/fts/service/pdb/PDBFTSPanelTest.java
index 5e31bef..ac1d304 100644 (file)
  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
  * The Jalview Authors are detailed in the 'AUTHORS' file.
  */
-package jalview.gui;
+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;
 
@@ -30,7 +32,7 @@ import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
-public class PDBSearchPanelTest
+public class PDBFTSPanelTest
 {
 
   @BeforeMethod(alwaysRun = true)
@@ -46,7 +48,7 @@ public class PDBSearchPanelTest
   @Test(groups = { "Functional" })
   public void populateCmbSearchTargetOptionsTest()
   {
-    PDBSearchPanel searchPanel = new PDBSearchPanel(null);
+    PDBFTSPanel searchPanel = new PDBFTSPanel(null);
     assertTrue(searchPanel.getCmbSearchTarget().getItemCount() > 0);
     searchPanel.populateCmbSearchTargetOptions();
   }
@@ -55,13 +57,13 @@ public class PDBSearchPanelTest
   public void testDecodeSearchTerm()
   {
     String expectedString = "1xyz OR text:2xyz OR text:3xyz";
-    String outcome = PDBSearchPanel.decodeSearchTerm("1xyz:A;2xyz;3xyz",
+    String outcome = PDBFTSPanel.decodeSearchTerm("1xyz:A;2xyz;3xyz",
             "text");
     // System.out.println("1 >>>>>>>>>>> " + outcome);
     assertEquals(expectedString, outcome);
 
     expectedString = "1xyz";
-    outcome = PDBSearchPanel.decodeSearchTerm("1xyz", "text");
+    outcome = PDBFTSPanel.decodeSearchTerm("1xyz", "text");
     // System.out.println("2 >>>>>>>>>>> " + outcome);
     assertEquals(expectedString, outcome);
   }
@@ -71,36 +73,42 @@ public class PDBSearchPanelTest
   {
 
     String expectedString = "1xyz:A";
-    String outcome = PDBSearchPanel.getPDBIdwithSpecifiedChain("1xyz",
+    String outcome = PDBFTSPanel.getPDBIdwithSpecifiedChain("1xyz",
             "2xyz;3xyz;1xyz:A");
     System.out.println("1 >>>>>>>>>>> " + outcome);
     assertEquals(expectedString, outcome);
 
     expectedString = "2xyz";
-    outcome = PDBSearchPanel.getPDBIdwithSpecifiedChain("2xyz",
+    outcome = PDBFTSPanel.getPDBIdwithSpecifiedChain("2xyz",
             "1xyz:A;2xyz;3xyz");
     System.out.println("2 >>>>>>>>>>> " + outcome);
     assertEquals(expectedString, outcome);
 
     expectedString = "2xyz:A";
-    outcome = PDBSearchPanel.getPDBIdwithSpecifiedChain("2xyz", "2xyz:A");
+    outcome = PDBFTSPanel.getPDBIdwithSpecifiedChain("2xyz", "2xyz:A");
     System.out.println("3 >>>>>>>>>>> " + outcome);
     assertEquals(expectedString, outcome);
   }
 
-  @Test(groups = { "Network", "External" }, timeOut = 5000)
+  @Test(groups = { "External" }, timeOut = 7000)
   public void txt_search_ActionPerformedTest()
   {
-    PDBSearchPanel searchPanel = new PDBSearchPanel(null);
+    PDBFTSPanel searchPanel = new PDBFTSPanel(null);
     JInternalFrame mainFrame = searchPanel.getMainFrame();
     JTextField txt_search = searchPanel.getTxtSearch();
 
     assertTrue(mainFrame.getTitle().length() == 20);
     assertTrue(mainFrame.getTitle()
             .equalsIgnoreCase("PDB Sequence Fetcher"));
-
     txt_search.setText("ABC");
-
+    try
+    {
+      // wait for web-service to handle response
+      Thread.sleep(3000);
+    } catch (InterruptedException e)
+    {
+      e.printStackTrace();
+    }
     assertTrue(mainFrame.getTitle().length() > 20);
     assertTrue(!mainFrame.getTitle().equalsIgnoreCase(
             "PDB Sequence Fetcher"));
  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
  * The Jalview Authors are detailed in the 'AUTHORS' file.
  */
-package jalview.ws.dbsources;
+package jalview.fts.service.pdb;
 
 import static org.testng.AssertJUnit.assertEquals;
 import static org.testng.AssertJUnit.assertTrue;
 
-import jalview.ws.dbsources.PDBRestClient.PDBDocField;
-import jalview.ws.uimodel.PDBRestRequest;
-import jalview.ws.uimodel.PDBRestResponse;
+import jalview.fts.api.FTSDataColumnI;
+import jalview.fts.core.FTSRestRequest;
+import jalview.fts.core.FTSRestResponse;
 
 import java.io.BufferedReader;
 import java.io.FileReader;
@@ -51,7 +51,7 @@ import com.sun.jersey.api.client.WebResource;
 import com.sun.jersey.api.client.config.ClientConfig;
 import com.sun.jersey.api.client.config.DefaultClientConfig;
 
-public class PDBRestClientTest
+public class PDBFTSRestClientTest
 {
 
   @BeforeMethod(alwaysRun = true)
@@ -67,24 +67,37 @@ public class PDBRestClientTest
   @Test(groups = { "External", "Network" })
   public void executeRequestTest()
   {
-    List<PDBDocField> wantedFields = new ArrayList<PDBDocField>();
-    wantedFields.add(PDBDocField.MOLECULE_TYPE);
-    wantedFields.add(PDBDocField.PDB_ID);
-    wantedFields.add(PDBDocField.GENUS);
-    wantedFields.add(PDBDocField.GENE_NAME);
-    wantedFields.add(PDBDocField.TITLE);
-
-    PDBRestRequest request = new PDBRestRequest();
+    List<FTSDataColumnI> wantedFields = new ArrayList<FTSDataColumnI>();
+    try
+    {
+      wantedFields.add(PDBFTSRestClient.getInstance()
+              .getDataColumnByNameOrCode("molecule_type"));
+      wantedFields
+.add(PDBFTSRestClient.getInstance()
+              .getDataColumnByNameOrCode("pdb_id"));
+      wantedFields.add(PDBFTSRestClient.getInstance()
+              .getDataColumnByNameOrCode("genus"));
+      wantedFields
+.add(PDBFTSRestClient.getInstance()
+              .getDataColumnByNameOrCode("gene_name"));
+      wantedFields.add(PDBFTSRestClient.getInstance()
+              .getDataColumnByNameOrCode("title"));
+    } catch (Exception e1)
+    {
+      e1.printStackTrace();
+    }
+
+    FTSRestRequest request = new FTSRestRequest();
     request.setAllowEmptySeq(false);
     request.setResponseSize(100);
     request.setFieldToSearchBy("text:");
     request.setSearchTerm("abc");
     request.setWantedFields(wantedFields);
 
-    PDBRestResponse response;
+    FTSRestResponse response;
     try
     {
-      response = new PDBRestClient().executeRequest(request);
+      response = PDBFTSRestClient.getInstance().executeRequest(request);
     } catch (Exception e)
     {
       e.printStackTrace();
@@ -99,16 +112,29 @@ public class PDBRestClientTest
   @Test(groups = { "Functional" })
   public void getPDBDocFieldsAsCommaDelimitedStringTest()
   {
-    List<PDBDocField> wantedFields = new ArrayList<PDBDocField>();
-    wantedFields.add(PDBDocField.MOLECULE_TYPE);
-    wantedFields.add(PDBDocField.PDB_ID);
-    wantedFields.add(PDBDocField.GENUS);
-    wantedFields.add(PDBDocField.GENE_NAME);
-    wantedFields.add(PDBDocField.TITLE);
+    List<FTSDataColumnI> wantedFields = new ArrayList<FTSDataColumnI>();
+    try
+    {
+      wantedFields.add(PDBFTSRestClient.getInstance()
+              .getDataColumnByNameOrCode("molecule_type"));
+      wantedFields
+.add(PDBFTSRestClient.getInstance()
+              .getDataColumnByNameOrCode("pdb_id"));
+      wantedFields.add(PDBFTSRestClient.getInstance()
+              .getDataColumnByNameOrCode("genus"));
+      wantedFields
+.add(PDBFTSRestClient.getInstance()
+              .getDataColumnByNameOrCode("gene_name"));
+      wantedFields.add(PDBFTSRestClient.getInstance()
+              .getDataColumnByNameOrCode("title"));
+    } catch (Exception e)
+    {
+      e.printStackTrace();
+    }
 
     String expectedResult = "molecule_type,pdb_id,genus,gene_name,title";
-    String actualResult = PDBRestClient
-            .getPDBDocFieldsAsCommaDelimitedString(wantedFields);
+    String actualResult = PDBFTSRestClient.getInstance()
+            .getDataColumnsFieldsAsCommaDelimitedString(wantedFields);
 
     assertEquals("", expectedResult, actualResult);
   }
@@ -116,14 +142,27 @@ public class PDBRestClientTest
   @Test(groups = { "External, Network" })
   public void parsePDBJsonExceptionStringTest()
   {
-    List<PDBDocField> wantedFields = new ArrayList<PDBDocField>();
-    wantedFields.add(PDBDocField.MOLECULE_TYPE);
-    wantedFields.add(PDBDocField.PDB_ID);
-    wantedFields.add(PDBDocField.GENUS);
-    wantedFields.add(PDBDocField.GENE_NAME);
-    wantedFields.add(PDBDocField.TITLE);
-
-    PDBRestRequest request = new PDBRestRequest();
+    List<FTSDataColumnI> wantedFields = new ArrayList<FTSDataColumnI>();
+    try
+    {
+      wantedFields.add(PDBFTSRestClient.getInstance()
+              .getDataColumnByNameOrCode("molecule_type"));
+      wantedFields
+.add(PDBFTSRestClient.getInstance()
+              .getDataColumnByNameOrCode("pdb_id"));
+      wantedFields.add(PDBFTSRestClient.getInstance()
+              .getDataColumnByNameOrCode("genus"));
+      wantedFields
+.add(PDBFTSRestClient.getInstance()
+              .getDataColumnByNameOrCode("gene_name"));
+      wantedFields.add(PDBFTSRestClient.getInstance()
+              .getDataColumnByNameOrCode("title"));
+    } catch (Exception e1)
+    {
+      e1.printStackTrace();
+    }
+
+    FTSRestRequest request = new FTSRestRequest();
     request.setAllowEmptySeq(false);
     request.setResponseSize(100);
     request.setFieldToSearchBy("text:");
@@ -139,7 +178,7 @@ public class PDBRestClientTest
       e.printStackTrace();
     }
 
-    String parsedErrorResponse = PDBRestClient
+    String parsedErrorResponse = PDBFTSRestClient
             .parseJsonExceptionString(jsonErrorResponse);
 
     String expectedErrorMsg = "\n============= PDB Rest Client RunTime error =============\n"
@@ -152,31 +191,46 @@ public class PDBRestClientTest
   }
 
   @Test(
-    groups = { "External", "Network" },
+    groups = { "External" },
     expectedExceptions = Exception.class)
   public void testForExpectedRuntimeException() throws Exception
   {
-    List<PDBDocField> wantedFields = new ArrayList<PDBDocField>();
-    wantedFields.add(PDBDocField.PDB_ID);
+    List<FTSDataColumnI> wantedFields = new ArrayList<FTSDataColumnI>();
+    wantedFields.add(PDBFTSRestClient.getInstance()
+            .getDataColumnByNameOrCode("pdb_id"));
 
-    PDBRestRequest request = new PDBRestRequest();
+    FTSRestRequest request = new FTSRestRequest();
     request.setFieldToSearchBy("text:");
     request.setSearchTerm("abc OR text:go:abc");
     request.setWantedFields(wantedFields);
-    new PDBRestClient().executeRequest(request);
+    PDBFTSRestClient.getInstance().executeRequest(request);
   }
 
+    // JBP: Is this actually external ?  Looks like it is mocked
   @Test(groups = { "External" })
   public void parsePDBJsonResponseTest()
   {
-    List<PDBDocField> wantedFields = new ArrayList<PDBDocField>();
-    wantedFields.add(PDBDocField.MOLECULE_TYPE);
-    wantedFields.add(PDBDocField.PDB_ID);
-    wantedFields.add(PDBDocField.GENUS);
-    wantedFields.add(PDBDocField.GENE_NAME);
-    wantedFields.add(PDBDocField.TITLE);
-
-    PDBRestRequest request = new PDBRestRequest();
+    List<FTSDataColumnI> wantedFields = new ArrayList<FTSDataColumnI>();
+    try
+    {
+      wantedFields.add(PDBFTSRestClient.getInstance()
+              .getDataColumnByNameOrCode("molecule_type"));
+      wantedFields
+.add(PDBFTSRestClient.getInstance()
+              .getDataColumnByNameOrCode("pdb_id"));
+      wantedFields.add(PDBFTSRestClient.getInstance()
+              .getDataColumnByNameOrCode("genus"));
+      wantedFields
+.add(PDBFTSRestClient.getInstance()
+              .getDataColumnByNameOrCode("gene_name"));
+      wantedFields.add(PDBFTSRestClient.getInstance()
+              .getDataColumnByNameOrCode("title"));
+    } catch (Exception e1)
+    {
+      e1.printStackTrace();
+    }
+
+    FTSRestRequest request = new FTSRestRequest();
     request.setAllowEmptySeq(false);
     request.setWantedFields(wantedFields);
 
@@ -188,7 +242,7 @@ public class PDBRestClientTest
     {
       e.printStackTrace();
     }
-    PDBRestResponse response = PDBRestClient.parsePDBJsonResponse(
+    FTSRestResponse response = PDBFTSRestClient.parsePDBJsonResponse(
             jsonString, request);
     assertTrue(response.getSearchSummary() != null);
     assertTrue(response.getNumberOfItemsFound() == 931);
@@ -198,14 +252,38 @@ public class PDBRestClientTest
   @Test(groups = { "Functional" })
   public void getPDBIdColumIndexTest()
   {
-    List<PDBDocField> wantedFields = new ArrayList<PDBDocField>();
-    wantedFields.add(PDBDocField.MOLECULE_TYPE);
-    wantedFields.add(PDBDocField.GENUS);
-    wantedFields.add(PDBDocField.GENE_NAME);
-    wantedFields.add(PDBDocField.TITLE);
-    wantedFields.add(PDBDocField.PDB_ID);
-    assertEquals(5, PDBRestClient.getPDBIdColumIndex(wantedFields, true));
-    assertEquals(4, PDBRestClient.getPDBIdColumIndex(wantedFields, false));
+    List<FTSDataColumnI> wantedFields = new ArrayList<FTSDataColumnI>();
+    try
+    {
+      wantedFields.add(PDBFTSRestClient.getInstance()
+              .getDataColumnByNameOrCode("molecule_type"));
+      wantedFields.add(PDBFTSRestClient.getInstance()
+              .getDataColumnByNameOrCode("genus"));
+      wantedFields
+.add(PDBFTSRestClient.getInstance()
+              .getDataColumnByNameOrCode("gene_name"));
+      wantedFields.add(PDBFTSRestClient.getInstance()
+              .getDataColumnByNameOrCode("title"));
+      wantedFields
+.add(PDBFTSRestClient.getInstance()
+              .getDataColumnByNameOrCode("pdb_id"));
+    } catch (Exception e)
+    {
+      e.printStackTrace();
+    }
+    try
+    {
+      assertEquals(5,
+ PDBFTSRestClient.getInstance()
+              .getPrimaryKeyColumIndex(wantedFields, true));
+      assertEquals(4,
+ PDBFTSRestClient.getInstance()
+              .getPrimaryKeyColumIndex(wantedFields, false));
+    } catch (Exception e)
+    {
+      // TODO Auto-generated catch block
+      e.printStackTrace();
+    }
   }
 
   @Test(groups = { "External" })
@@ -216,7 +294,7 @@ public class PDBRestClientTest
 
     // Build request parameters for the REST Request
     WebResource webResource = client
-            .resource(PDBRestClient.PDB_SEARCH_ENDPOINT)
+            .resource(PDBFTSRestClient.PDB_SEARCH_ENDPOINT)
             .queryParam("wt", "json").queryParam("rows", String.valueOf(1))
             .queryParam("q", "text:abc AND molecule_sequence:['' TO *]");
 
@@ -255,9 +333,10 @@ public class PDBRestClientTest
 
         JSONObject pdbJsonDoc = docIter.next();
 
-        for (PDBDocField field : PDBDocField.values())
+        for (FTSDataColumnI field : PDBFTSRestClient.getInstance()
+                .getAllFTSDataColumns())
         {
-          if (field == PDBDocField.ALL)
+          if (field.getName().equalsIgnoreCase("ALL"))
           {
             continue;
           }
diff --git a/test/jalview/gui/AlignFrameTest.java b/test/jalview/gui/AlignFrameTest.java
new file mode 100644 (file)
index 0000000..80e3d5a
--- /dev/null
@@ -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<int[]> 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]);
+  }
+}
index 0a53f10..b39b2bd 100644 (file)
@@ -37,8 +37,8 @@ import jalview.io.FileLoader;
 import jalview.io.FormatAdapter;
 import jalview.structure.StructureSelectionManager;
 
-import java.util.LinkedHashSet;
-import java.util.Set;
+import java.util.ArrayList;
+import java.util.List;
 
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.BeforeMethod;
@@ -136,7 +136,7 @@ public class AlignViewportTest
     AlignedCodonFrame acf1 = new AlignedCodonFrame();
     AlignedCodonFrame acf2 = new AlignedCodonFrame();
 
-    Set<AlignedCodonFrame> mappings = new LinkedHashSet<AlignedCodonFrame>();
+    List<AlignedCodonFrame> mappings = new ArrayList<AlignedCodonFrame>();
     mappings.add(acf1);
     mappings.add(acf2);
     af1.getViewport().getAlignment().setCodonFrames(mappings);
@@ -148,18 +148,18 @@ public class AlignViewportTest
      */
     StructureSelectionManager ssm = StructureSelectionManager
             .getStructureSelectionManager(Desktop.instance);
-    assertEquals(2, ssm.seqmappings.size());
-    assertTrue(ssm.seqmappings.contains(acf1));
-    assertTrue(ssm.seqmappings.contains(acf2));
+    assertEquals(2, ssm.getSequenceMappings().size());
+    assertTrue(ssm.getSequenceMappings().contains(acf1));
+    assertTrue(ssm.getSequenceMappings().contains(acf2));
 
     /*
      * Close the second view. Verify that mappings are not removed as the first
      * view still holds a reference to them.
      */
     af1.closeMenuItem_actionPerformed(false);
-    assertEquals(2, ssm.seqmappings.size());
-    assertTrue(ssm.seqmappings.contains(acf1));
-    assertTrue(ssm.seqmappings.contains(acf2));
+    assertEquals(2, ssm.getSequenceMappings().size());
+    assertTrue(ssm.getSequenceMappings().contains(acf1));
+    assertTrue(ssm.getSequenceMappings().contains(acf2));
   }
 
   /**
@@ -183,11 +183,11 @@ public class AlignViewportTest
     AlignedCodonFrame acf2 = new AlignedCodonFrame();
     AlignedCodonFrame acf3 = new AlignedCodonFrame();
 
-    Set<AlignedCodonFrame> mappings1 = new LinkedHashSet<AlignedCodonFrame>();
+    List<AlignedCodonFrame> mappings1 = new ArrayList<AlignedCodonFrame>();
     mappings1.add(acf1);
     af1.getViewport().getAlignment().setCodonFrames(mappings1);
 
-    Set<AlignedCodonFrame> mappings2 = new LinkedHashSet<AlignedCodonFrame>();
+    List<AlignedCodonFrame> mappings2 = new ArrayList<AlignedCodonFrame>();
     mappings2.add(acf2);
     mappings2.add(acf3);
     af2.getViewport().getAlignment().setCodonFrames(mappings2);
@@ -196,7 +196,7 @@ public class AlignViewportTest
      * AlignFrame1 has mapping acf1, AlignFrame2 has acf2 and acf3
      */
 
-    Set<AlignedCodonFrame> ssmMappings = ssm.seqmappings;
+    List<AlignedCodonFrame> ssmMappings = ssm.getSequenceMappings();
     assertEquals(0, ssmMappings.size());
     ssm.registerMapping(acf1);
     assertEquals(1, ssmMappings.size());
@@ -236,12 +236,12 @@ public class AlignViewportTest
     AlignedCodonFrame acf2 = new AlignedCodonFrame();
     AlignedCodonFrame acf3 = new AlignedCodonFrame();
 
-    Set<AlignedCodonFrame> mappings1 = new LinkedHashSet<AlignedCodonFrame>();
+    List<AlignedCodonFrame> mappings1 = new ArrayList<AlignedCodonFrame>();
     mappings1.add(acf1);
     mappings1.add(acf2);
     af1.getViewport().getAlignment().setCodonFrames(mappings1);
 
-    Set<AlignedCodonFrame> mappings2 = new LinkedHashSet<AlignedCodonFrame>();
+    List<AlignedCodonFrame> mappings2 = new ArrayList<AlignedCodonFrame>();
     mappings2.add(acf2);
     mappings2.add(acf3);
     af2.getViewport().getAlignment().setCodonFrames(mappings2);
@@ -250,7 +250,7 @@ public class AlignViewportTest
      * AlignFrame1 has mappings acf1 and acf2, AlignFrame2 has acf2 and acf3
      */
 
-    Set<AlignedCodonFrame> ssmMappings = ssm.seqmappings;
+    List<AlignedCodonFrame> ssmMappings = ssm.getSequenceMappings();
     assertEquals(0, ssmMappings.size());
     ssm.registerMapping(acf1);
     assertEquals(1, ssmMappings.size());
index 1b00c4a..c2209d6 100644 (file)
@@ -70,10 +70,16 @@ public class StructureChooserTest
   public void buildQueryTest()
   {
     String query = StructureChooser.buildQuery(seq);
-    System.out.println(">>>>>>>>>> query : " + query);
+    assertEquals("pdb_id:1tim", query);
+    System.out.println("seq >>>> " + seq);
+    seq.getAllPDBEntries().clear();
+    query = StructureChooser.buildQuery(seq);
     assertEquals(
-            "4kqy OR text:1tim OR text:XYZ_1 OR text:XYZ_2 OR text:XYZ_3 OR text:XYZ_4",
+            "text:XYZ_1 OR text:XYZ_2 OR text:XYZ_3 OR text:XYZ_4 OR text:4kqy",
             query);
+    seq.setDBRefs(null);
+    query = StructureChooser.buildQuery(seq);
+    assertEquals("text:4kqy", query);
   }
 
   @Test(groups = { "Functional" })
@@ -88,6 +94,13 @@ public class StructureChooserTest
 
     sc.setStructuresDiscovered(true);
     sc.populateFilterComboBox();
+    try
+    {
+      Thread.sleep(2000);
+    } catch (InterruptedException e)
+    {
+      e.printStackTrace();
+    }
     optionsSize = sc.getCmbFilterOption().getItemCount();
     assertTrue(optionsSize > 3); // if structures are found, filter options
                                  // should be populated
index 4b10ab8..c472576 100644 (file)
@@ -34,7 +34,6 @@ import jalview.gui.AlignFrame;
 
 import java.io.File;
 
-import org.junit.Assert;
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.BeforeMethod;
@@ -81,8 +80,8 @@ public class AnnotatedPDBFileInputTest
     {
       for (int q = p + 1; q < avec.length; q++)
       {
-        Assert.assertNotEquals("Found a duplicate annotation row "
-                + avec[p].label, avec[p], avec[q]);
+        assertTrue("Found a duplicate annotation row "
+                + avec[p].label, avec[p] != avec[q]);
       }
     }
   }
index d757a6a..625244d 100644 (file)
@@ -70,7 +70,7 @@ public class AnnotationFileIOTest
       FormatAdapter rf = new FormatAdapter();
 
       AlignmentI al = rf.readFile(ff, AppletFormatAdapter.FILE,
-              new IdentifyFile().Identify(ff, AppletFormatAdapter.FILE));
+              new IdentifyFile().identify(ff, AppletFormatAdapter.FILE));
 
       // make sure dataset is initialised ? not sure about this
       for (int i = 0; i < al.getSequencesArray().length; ++i)
index d65f9df..56305da 100644 (file)
 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.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 java.awt.Color;
@@ -39,41 +45,11 @@ import org.testng.annotations.Test;
 public class FeaturesFileTest
 {
 
-  static String TestFiles[][] = { { "Test example features import/export",
-      "examples/uniref50.fa", "examples/exampleFeatures.txt" } };
+  private static String simpleGffFile = "examples/testdata/simpleGff3.gff";
 
   @Test(groups = { "Functional" })
   public void testParse() throws Exception
   {
-    testFeaturesFileIO("Features file test");
-  }
-
-  public static AlignmentI readAlignmentFile(File f) throws IOException
-  {
-    System.out.println("Reading file: " + f);
-    String ff = f.getPath();
-    FormatAdapter rf = new FormatAdapter();
-
-    AlignmentI al = rf.readFile(ff, AppletFormatAdapter.FILE,
-            new IdentifyFile().Identify(ff, AppletFormatAdapter.FILE));
-
-    al.setDataset(null); // creates dataset sequences
-    assertNotNull("Couldn't read supplied alignment data.", al);
-    return al;
-  }
-
-  /**
-   * Helper method for testing
-   * 
-   * @param testname
-   * @param f
-   *          alignment file
-   * @param featFile
-   *          features file to load on to the alignment
-   * @throws IOException
-   */
-  public static void testFeaturesFileIO(String testname) throws IOException
-  {
     File f = new File("examples/uniref50.fa");
     AlignmentI al = readAlignmentFile(f);
     AlignFrame af = new AlignFrame(al, 500, 500);
@@ -81,7 +57,8 @@ public class FeaturesFileTest
             .getFeatureColours();
     FeaturesFile featuresFile = new FeaturesFile(
             "examples/exampleFeatures.txt", FormatAdapter.FILE);
-    assertTrue("Test " + testname + "\nFailed to parse features file.",
+    assertTrue("Test " + "Features file test"
+            + "\nFailed to parse features file.",
             featuresFile.parse(al.getDataset(), colours, true));
 
     /*
@@ -150,4 +127,319 @@ public class FeaturesFileTest
     assertEquals("netphos", sf.featureGroup);
     assertEquals("PHOSPHORYLATION (T)", sf.type);
   }
+
+  /**
+   * Test parsing a features file with a mix of Jalview and GFF formatted
+   * content
+   * 
+   * @throws Exception
+   */
+  @Test(groups = { "Functional" })
+  public void testParse_mixedJalviewGff() throws Exception
+  {
+    File f = new File("examples/uniref50.fa");
+    AlignmentI al = readAlignmentFile(f);
+    AlignFrame af = new AlignFrame(al, 500, 500);
+    Map<String, FeatureColourI> colours = af.getFeatureRenderer()
+            .getFeatureColours();
+    // GFF2 uses space as name/value separator in column 9
+    String gffData = "METAL\tcc9900\n" + "GFF\n"
+            + "FER_CAPAA\tuniprot\tMETAL\t44\t45\t4.0\t.\t.\tNote Iron-sulfur; Note 2Fe-2S\n"
+            + "FER1_SOLLC\tuniprot\tPfam\t55\t130\t2.0\t.\t.";
+    FeaturesFile featuresFile = new FeaturesFile(gffData,
+            FormatAdapter.PASTE);
+    assertTrue("Failed to parse features file",
+            featuresFile.parse(al.getDataset(), colours, true));
+
+    // verify colours read or synthesized
+    colours = af.getFeatureRenderer().getFeatureColours();
+    assertEquals("1 feature group colours not found", 1, colours.size());
+    assertEquals(colours.get("METAL").getColour(), new Color(0xcc9900));
+
+    // verify feature on FER_CAPAA
+    SequenceFeature[] sfs = al.getSequenceAt(0).getDatasetSequence()
+            .getSequenceFeatures();
+    assertEquals(1, sfs.length);
+    SequenceFeature sf = sfs[0];
+    assertEquals("Iron-sulfur,2Fe-2S", sf.description);
+    assertEquals(44, sf.begin);
+    assertEquals(45, sf.end);
+    assertEquals("uniprot", sf.featureGroup);
+    assertEquals("METAL", sf.type);
+    assertEquals(4f, sf.getScore(), 0.001f);
+
+    // verify feature on FER1_SOLLC
+    sfs = al.getSequenceAt(2).getDatasetSequence().getSequenceFeatures();
+    assertEquals(1, sfs.length);
+    sf = sfs[0];
+    assertEquals("uniprot", sf.description);
+    assertEquals(55, sf.begin);
+    assertEquals(130, sf.end);
+    assertEquals("uniprot", sf.featureGroup);
+    assertEquals("Pfam", sf.type);
+    assertEquals(2f, sf.getScore(), 0.001f);
+  }
+
+  public static AlignmentI readAlignmentFile(File f) throws IOException
+  {
+    System.out.println("Reading file: " + f);
+    String ff = f.getPath();
+    FormatAdapter rf = new FormatAdapter();
+
+    AlignmentI al = rf.readFile(ff, FormatAdapter.FILE,
+            new IdentifyFile().identify(ff, FormatAdapter.FILE));
+
+    al.setDataset(null); // creates dataset sequences
+    assertNotNull("Couldn't read supplied alignment data.", al);
+    return al;
+  }
+
+  /**
+   * Test parsing a features file with GFF formatted content only
+   * 
+   * @throws Exception
+   */
+  @Test(groups = { "Functional" })
+  public void testParse_pureGff3() throws Exception
+  {
+    File f = new File("examples/uniref50.fa");
+    AlignmentI al = readAlignmentFile(f);
+    AlignFrame af = new AlignFrame(al, 500, 500);
+    Map<String, FeatureColourI> colours = af.getFeatureRenderer()
+            .getFeatureColours();
+    // GFF3 uses '=' separator for name/value pairs in colum 9
+    String gffData = "##gff-version 3\n"
+            + "FER_CAPAA\tuniprot\tMETAL\t39\t39\t0.0\t.\t.\t"
+            + "Note=Iron-sulfur (2Fe-2S);Note=another note;evidence=ECO:0000255|PROSITE-ProRule:PRU00465\n"
+            + "FER1_SOLLC\tuniprot\tPfam\t55\t130\t3.0\t.\t.\tID=$23";
+    FeaturesFile featuresFile = new FeaturesFile(gffData,
+            FormatAdapter.PASTE);
+    assertTrue("Failed to parse features file",
+            featuresFile.parse(al.getDataset(), colours, true));
+
+    // verify feature on FER_CAPAA
+    SequenceFeature[] sfs = al.getSequenceAt(0).getDatasetSequence()
+            .getSequenceFeatures();
+    assertEquals(1, sfs.length);
+    SequenceFeature sf = sfs[0];
+    // description parsed from Note attribute
+    assertEquals("Iron-sulfur (2Fe-2S),another note", sf.description);
+    assertEquals(39, sf.begin);
+    assertEquals(39, sf.end);
+    assertEquals("uniprot", sf.featureGroup);
+    assertEquals("METAL", sf.type);
+    assertEquals(
+            "Note=Iron-sulfur (2Fe-2S);Note=another note;evidence=ECO:0000255|PROSITE-ProRule:PRU00465",
+            sf.getValue("ATTRIBUTES"));
+
+    // verify feature on FER1_SOLLC1
+    sfs = al.getSequenceAt(2).getDatasetSequence().getSequenceFeatures();
+    assertEquals(1, sfs.length);
+    sf = sfs[0];
+    // ID used for description if available
+    assertEquals("$23", sf.description);
+    assertEquals(55, sf.begin);
+    assertEquals(130, sf.end);
+    assertEquals("uniprot", sf.featureGroup);
+    assertEquals("Pfam", sf.type);
+    assertEquals(3f, sf.getScore(), 0.001f);
+  }
+
+  /**
+   * Test parsing a features file with Jalview format features (but no colour
+   * descriptors or startgroup to give the hint not to parse as GFF)
+   * 
+   * @throws Exception
+   */
+  @Test(groups = { "Functional" })
+  public void testParse_jalviewFeaturesOnly() throws Exception
+  {
+    File f = new File("examples/uniref50.fa");
+    AlignmentI al = readAlignmentFile(f);
+    AlignFrame af = new AlignFrame(al, 500, 500);
+    Map<String, FeatureColourI> colours = af.getFeatureRenderer()
+            .getFeatureColours();
+
+    /*
+     * one feature on FER_CAPAA and one on sequence 3 (index 2) FER1_SOLLC
+     */
+    String featureData = "Iron-sulfur (2Fe-2S)\tFER_CAPAA\t-1\t39\t39\tMETAL\n"
+            + "Iron-phosphorus (2Fe-P)\tID_NOT_SPECIFIED\t2\t86\t87\tMETALLIC\n";
+    FeaturesFile featuresFile = new FeaturesFile(featureData,
+            FormatAdapter.PASTE);
+    assertTrue("Failed to parse features file",
+            featuresFile.parse(al.getDataset(), colours, true));
+
+    // verify FER_CAPAA feature
+    SequenceFeature[] sfs = al.getSequenceAt(0).getDatasetSequence()
+            .getSequenceFeatures();
+    assertEquals(1, sfs.length);
+    SequenceFeature sf = sfs[0];
+    assertEquals("Iron-sulfur (2Fe-2S)", sf.description);
+    assertEquals(39, sf.begin);
+    assertEquals(39, sf.end);
+    assertEquals("METAL", sf.type);
+
+    // verify FER1_SOLLC feature
+    sfs = al.getSequenceAt(2).getDatasetSequence().getSequenceFeatures();
+    assertEquals(1, sfs.length);
+    sf = sfs[0];
+    assertEquals("Iron-phosphorus (2Fe-P)", sf.description);
+    assertEquals(86, sf.begin);
+    assertEquals(87, sf.end);
+    assertEquals("METALLIC", sf.type);
+  }
+
+  private void checkDatasetfromSimpleGff3(AlignmentI dataset)
+  {
+    assertEquals("no sequences extracted from GFF3 file", 2,
+            dataset.getHeight());
+  
+    SequenceI seq1 = dataset.findName("seq1");
+    SequenceI seq2 = dataset.findName("seq2");
+    assertNotNull(seq1);
+    assertNotNull(seq2);
+    assertFalse(
+            "Failed to replace dummy seq1 with real sequence",
+            seq1 instanceof SequenceDummy
+                    && ((SequenceDummy) seq1).isDummy());
+    assertFalse(
+            "Failed to replace dummy seq2 with real sequence",
+            seq2 instanceof SequenceDummy
+                    && ((SequenceDummy) seq2).isDummy());
+    String placeholderseq = new SequenceDummy("foo").getSequenceAsString();
+    assertFalse("dummy replacement buggy for seq1",
+            placeholderseq.equals(seq1.getSequenceAsString()));
+    assertFalse("dummy replacement buggy for seq2",
+            placeholderseq.equals(seq2.getSequenceAsString()));
+    assertNotNull("No features added to seq1", seq1.getSequenceFeatures());
+    assertEquals("Wrong number of features", 3,
+            seq1.getSequenceFeatures().length);
+    assertNull(seq2.getSequenceFeatures());
+    assertEquals(
+            "Wrong number of features",
+            0,
+            seq2.getSequenceFeatures() == null ? 0 : seq2
+                    .getSequenceFeatures().length);
+    assertTrue(
+            "Expected at least one CDNA/Protein mapping for seq1",
+            dataset.getCodonFrame(seq1) != null
+                    && dataset.getCodonFrame(seq1).size() > 0);
+  
+  }
+
+  @Test(groups = { "Functional" })
+  public void readGff3File() throws IOException
+  {
+    FeaturesFile gffreader = new FeaturesFile(true, simpleGffFile,
+            FormatAdapter.FILE);
+    Alignment dataset = new Alignment(gffreader.getSeqsAsArray());
+    gffreader.addProperties(dataset);
+    checkDatasetfromSimpleGff3(dataset);
+  }
+
+  @Test(groups = { "Functional" })
+  public void simpleGff3FileClass() throws IOException
+  {
+    AlignmentI dataset = new Alignment(new SequenceI[] {});
+    FeaturesFile ffile = new FeaturesFile(simpleGffFile,
+            FormatAdapter.FILE);
+  
+    boolean parseResult = ffile.parse(dataset, null, false, false);
+    assertTrue("return result should be true", parseResult);
+    checkDatasetfromSimpleGff3(dataset);
+  }
+
+  @Test(groups = { "Functional" })
+  public void simpleGff3FileLoader() throws IOException
+  {
+    AlignFrame af = new FileLoader(false).LoadFileWaitTillLoaded(
+            simpleGffFile, FormatAdapter.FILE);
+    assertTrue(
+            "Didn't read the alignment into an alignframe from Gff3 File",
+            af != null);
+    checkDatasetfromSimpleGff3(af.getViewport().getAlignment());
+  }
+
+  @Test(groups = { "Functional" })
+  public void simpleGff3RelaxedIdMatching() throws IOException
+  {
+    AlignmentI dataset = new Alignment(new SequenceI[] {});
+    FeaturesFile ffile = new FeaturesFile(simpleGffFile,
+            FormatAdapter.FILE);
+  
+    boolean parseResult = ffile.parse(dataset, null, false, true);
+    assertTrue("return result (relaxedID matching) should be true",
+            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<String, FeatureColourI> 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"
+            + "<html>Pfam domain<a href=\"http://pfam.sanger.ac.uk/family/PF00111\">Pfam_3_4</a></html>\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<String, FeatureColourI> 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"
+            + "<html>Pfam domain<a href=\"http://pfam.sanger.ac.uk/family/PF00111\">Pfam_3_4</a></html>\tFER_CAPAA\t-1\t20\t20\tPfam\t0.0\n"
+            + "ENDGROUP\tuniprot\n";
+    assertEquals(expected, exported);
+  }
 }
index fef7173..cde1cbc 100644 (file)
@@ -69,7 +69,7 @@ public class FileIOTester
   {
     AssertJUnit.assertTrue("Couldn't resolve " + src + " as a valid file",
             fp.isValid());
-    String type = new IdentifyFile().Identify(fp);
+    String type = new IdentifyFile().identify(fp);
     AssertJUnit.assertTrue("Data from '" + src + "' Expected to be '" + fmt
             + "' identified as '" + type + "'", type.equalsIgnoreCase(fmt));
   }
diff --git a/test/jalview/io/Gff3tests.java b/test/jalview/io/Gff3tests.java
deleted file mode 100644 (file)
index b78a004..0000000
+++ /dev/null
@@ -1,171 +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 <http://www.gnu.org/licenses/>.
- * The Jalview Authors are detailed in the 'AUTHORS' file.
- */
-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.assertNull;
-import static org.testng.AssertJUnit.assertTrue;
-
-import jalview.datamodel.Alignment;
-import jalview.datamodel.AlignmentI;
-import jalview.datamodel.SequenceDummy;
-import jalview.datamodel.SequenceI;
-import jalview.gui.AlignFrame;
-
-import java.io.IOException;
-
-import org.testng.annotations.Test;
-
-public class Gff3tests
-{
-
-  private static String exonerateSeqs = "examples/testdata/exonerateseqs.fa",
-          exonerateOutput = "examples/testdata/exonerateoutput.gff",
-          simpleGff3file = "examples/testdata/simpleGff3.gff";
-
-  @Test(groups = { "Functional" })
-  public void testExonerateImport()
-  {
-    // exonerate does not tag sequences after features, so we have a more
-    // conventional annotation import test here
-
-    FileLoader loader = new FileLoader(false);
-
-    AlignFrame af = loader.LoadFileWaitTillLoaded(exonerateSeqs,
-            FormatAdapter.FILE);
-
-    assertEquals("Unexpected number of DNA protein associations", 0, af
-            .getViewport().getAlignment().getCodonFrames().size());
-
-    af.loadJalviewDataFile(exonerateOutput, FormatAdapter.FILE, null, null);
-
-    assertTrue("Expected at least one DNA protein association", af
-            .getViewport().getAlignment().getDataset().getCodonFrames()
-            .size() > 0);
-
-  }
-
-  @Test(groups = { "Functional" })
-  public void simpleGff3FileIdentify()
-  {
-    assertEquals("Didn't recognise file correctly.", IdentifyFile.GFF3File,
-            new IdentifyFile().Identify(simpleGff3file, FormatAdapter.FILE));
-  }
-
-  @Test(groups = { "Functional" })
-  public void simpleGff3FileClass() throws IOException
-  {
-    AlignmentI dataset = new Alignment(new SequenceI[] {});
-    FeaturesFile ffile = new FeaturesFile(simpleGff3file,
-            FormatAdapter.FILE);
-
-    boolean parseResult = ffile.parse(dataset, null, null, false, false);
-    assertTrue("return result should be true", parseResult);
-    checkDatasetfromSimpleGff3(dataset);
-  }
-
-  @Test(groups = { "Functional" })
-  public void simpleGff3FileLoader() throws IOException
-  {
-    AlignFrame af = new FileLoader(false).LoadFileWaitTillLoaded(
-            simpleGff3file, FormatAdapter.FILE);
-    assertTrue(
-            "Didn't read the alignment into an alignframe from Gff3 File",
-            af != null);
-    checkDatasetfromSimpleGff3(af.getViewport().getAlignment().getDataset());
-  }
-
-  @Test(groups = { "Functional" })
-  public void simpleGff3RelaxedIdMatching() throws IOException
-  {
-    AlignmentI dataset = new Alignment(new SequenceI[] {});
-    FeaturesFile ffile = new FeaturesFile(simpleGff3file,
-            FormatAdapter.FILE);
-
-    boolean parseResult = ffile.parse(dataset, null, null, false, true);
-    assertTrue("return result (relaxedID matching) should be true",
-            parseResult);
-    checkDatasetfromSimpleGff3(dataset);
-  }
-
-  @Test(groups = { "Functional" })
-  public void readGff3File() throws IOException
-  {
-    Gff3File gff3reader = new Gff3File(simpleGff3file, FormatAdapter.FILE);
-    Alignment dataset = new Alignment(gff3reader.getSeqsAsArray());
-    gff3reader.addProperties(dataset);
-    checkDatasetfromSimpleGff3(dataset);
-
-  }
-
-  private void checkDatasetfromSimpleGff3(AlignmentI dataset)
-  {
-    assertEquals("no sequences extracted from GFF3 file", 2,
-            dataset.getHeight());
-
-    SequenceI seq1 = dataset.findName("seq1"), seq2 = dataset
-            .findName("seq2");
-    assertNotNull(seq1);
-    assertNotNull(seq2);
-    assertFalse(
-            "Failed to replace dummy seq1 with real sequence",
-            seq1 instanceof SequenceDummy
-                    && ((SequenceDummy) seq1).isDummy());
-    assertFalse(
-            "Failed to replace dummy seq2 with real sequence",
-            seq2 instanceof SequenceDummy
-                    && ((SequenceDummy) seq2).isDummy());
-    String placeholderseq = new SequenceDummy("foo").getSequenceAsString();
-    assertFalse("dummy replacement buggy for seq1",
-            placeholderseq.equals(seq1.getSequenceAsString()));
-    assertFalse("dummy replacement buggy for seq2",
-            placeholderseq.equals(seq2.getSequenceAsString()));
-    assertNotNull("No features added to seq1", seq1.getSequenceFeatures());// !=
-                                                                           // null);
-    assertEquals("Wrong number of features", 3,
-            seq1.getSequenceFeatures().length);
-    assertNull(seq2.getSequenceFeatures());
-    assertEquals(
-            "Wrong number of features",
-            0,
-            seq2.getSequenceFeatures() == null ? 0 : seq2
-                    .getSequenceFeatures().length);
-    assertTrue(
-            "Expected at least one CDNA/Protein mapping for seq1",
-            dataset.getCodonFrame(seq1) != null
-                    && dataset.getCodonFrame(seq1).size() > 0);
-
-  }
-  // @Test(groups ={ "Functional" })
-  // public final void testPrintGFFFormatSequenceIArrayMapOfStringObject()
-  // {
-  // fail("Not yet implemented");
-  // }
-  //
-  // @Test(groups ={ "Functional" })
-  // public final void testAlignFileBooleanStringString()
-  // {
-  // fail("Not yet implemented");
-  // }
-
-}
index 3b99208..6c13e26 100644 (file)
@@ -20,8 +20,6 @@
  */
 package jalview.io;
 
-import static org.junit.Assert.fail;
-
 import org.testng.annotations.Test;
 
 public class HtmlFileTest
@@ -30,7 +28,7 @@ public class HtmlFileTest
   @Test(groups = { "Functional" }, enabled = false)
   public void test()
   {
-    fail("Not yet implemented");
+    org.testng.AssertJUnit.fail("Not yet implemented");
   }
 
 }
index c958ff0..c00cf06 100644 (file)
  */
 package jalview.io;
 
+import static org.testng.AssertJUnit.assertEquals;
+import static org.testng.AssertJUnit.assertFalse;
+import static org.testng.AssertJUnit.assertTrue;
+
 import org.testng.Assert;
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
@@ -28,15 +32,47 @@ public class IdentifyFileTest
 {
 
   @Test(groups = { "Functional" }, dataProvider = "identifyFiles")
-  public void Identify(String data, String expectedFileType)
+  public void testIdentify(String data, String expectedFileType)
   {
     String protocol = AppletFormatAdapter.FILE;
     IdentifyFile ider = new IdentifyFile();
-    String actualFiletype = ider.Identify(data, protocol);
+    String actualFiletype = ider.identify(data, protocol);
     Assert.assertEquals(actualFiletype, expectedFileType,
             "File identification Failed!");
   }
 
+  /**
+   * 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
+     */
+    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";
+    assertEquals(IdentifyFile.FeaturesFile,
+            ider.identify(data, AppletFormatAdapter.PASTE));
+
+    /*
+     * 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";
+    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));
+  }
+
   @DataProvider(name = "identifyFiles")
   public Object[][] IdentifyFileDP()
   {
@@ -54,8 +90,10 @@ public class IdentifyFileTest
         { "examples/testdata/test.html", "HTML" },
         { "examples/testdata/test.pileup", "PileUp" },
         { "examples/testdata/test.blc", "BLC" },
-        { "examples/testdata/simplegff3.gff", "GFF v2 or v3" },
+        { "examples/exampleFeatures.txt", IdentifyFile.FeaturesFile },
+        { "examples/testdata/simpleGff3.gff", IdentifyFile.FeaturesFile },
         { "examples/testdata/test.jvp", "Jalview" },
+        { "examples/testdata/test.cif", "mmCIF" },
         {
             "examples/testdata/cullpdb_pc25_res3.0_R0.3_d150729_chains9361.fasta.15316",
             "FASTA" },
@@ -65,4 +103,22 @@ public class IdentifyFileTest
     };
   }
 
+  @Test(groups = "Functional")
+  public void testLooksLikeFeatureData()
+  {
+    IdentifyFile id = new IdentifyFile();
+    assertFalse(id.looksLikeFeatureData(null));
+    assertFalse(id.looksLikeFeatureData(""));
+    // too few columns:
+    assertFalse(id.looksLikeFeatureData("1 \t 2 \t 3 \t 4 \t 5"));
+    // GFF format:
+    assertTrue(id
+            .looksLikeFeatureData("Seq1\tlocal\tHelix\t2456\t2462\tss"));
+    // Jalview format:
+    assertTrue(id.looksLikeFeatureData("Helix\tSeq1\t-1\t2456\t2462\tss"));
+    // non-numeric start column:
+    assertFalse(id.looksLikeFeatureData("Helix\tSeq1\t-1\t.\t2462\tss"));
+    // non-numeric start column:
+    assertFalse(id.looksLikeFeatureData("Helix\tSeq1\t-1\t2456\t.\tss"));
+  }
 }
diff --git a/test/jalview/io/SequenceAnnotationReportTest.java b/test/jalview/io/SequenceAnnotationReportTest.java
new file mode 100644 (file)
index 0000000..f551571
--- /dev/null
@@ -0,0 +1,166 @@
+package jalview.io;
+
+import static org.testng.AssertJUnit.assertEquals;
+
+import jalview.datamodel.SequenceFeature;
+
+import java.util.Hashtable;
+import java.util.Map;
+
+import org.testng.annotations.Test;
+
+public class SequenceAnnotationReportTest
+{
+  @Test(groups = "Functional")
+  public void testAppendFeature_disulfideBond()
+  {
+    SequenceAnnotationReport sar = new SequenceAnnotationReport(null);
+    StringBuffer sb = new StringBuffer();
+    sb.append("123456");
+    SequenceFeature sf = new SequenceFeature("disulfide bond", "desc", 1,
+            3, 1.2f, "group");
+
+    // residuePos == 2 does not match start or end of feature, nothing done:
+    sar.appendFeature(sb, 2, null, sf);
+    assertEquals("123456", sb.toString());
+
+    // residuePos == 1 matches start of feature, text appended (but no <br>)
+    // feature score is not included
+    sar.appendFeature(sb, 1, null, sf);
+    assertEquals("123456disulfide bond 1:3", sb.toString());
+
+    // residuePos == 3 matches end of feature, text appended
+    // <br> is prefixed once sb.length() > 6
+    sar.appendFeature(sb, 3, null, sf);
+    assertEquals("123456disulfide bond 1:3<br>disulfide bond 1:3",
+            sb.toString());
+  }
+
+  @Test(groups = "Functional")
+  public void testAppendFeature_status()
+  {
+    SequenceAnnotationReport sar = new SequenceAnnotationReport(null);
+    StringBuffer sb = new StringBuffer();
+    SequenceFeature sf = new SequenceFeature("METAL", "Fe2-S", 1, 3,
+            Float.NaN, "group");
+    sf.setStatus("Confirmed");
+  
+    sar.appendFeature(sb, 1, null, sf);
+    assertEquals("METAL 1 3; Fe2-S; (Confirmed)", sb.toString());
+  }
+
+  @Test(groups = "Functional")
+  public void testAppendFeature_withScore()
+  {
+    SequenceAnnotationReport sar = new SequenceAnnotationReport(null);
+    StringBuffer sb = new StringBuffer();
+    SequenceFeature sf = new SequenceFeature("METAL", "Fe2-S", 1, 3, 1.3f,
+            "group");
+
+    Map<String, float[][]> minmax = new Hashtable<String, float[][]>();
+    sar.appendFeature(sb, 1, minmax, sf);
+    /*
+     * map has no entry for this feature type - score is not shown:
+     */
+    assertEquals("METAL 1 3; Fe2-S", sb.toString());
+
+    /*
+     * map has entry for this feature type - score is shown:
+     */
+    minmax.put("METAL", new float[][] { { 0f, 1f }, null });
+    sar.appendFeature(sb, 1, minmax, sf);
+    // <br> is appended to a buffer > 6 in length
+    assertEquals("METAL 1 3; Fe2-S<br>METAL 1 3; Fe2-S Score=1.3",
+            sb.toString());
+
+    /*
+     * map has min == max for this feature type - score is not shown:
+     */
+    minmax.put("METAL", new float[][] { { 2f, 2f }, null });
+    sb.setLength(0);
+    sar.appendFeature(sb, 1, minmax, sf);
+    assertEquals("METAL 1 3; Fe2-S", sb.toString());
+  }
+
+  @Test(groups = "Functional")
+  public void testAppendFeature_noScore()
+  {
+    SequenceAnnotationReport sar = new SequenceAnnotationReport(null);
+    StringBuffer sb = new StringBuffer();
+    SequenceFeature sf = new SequenceFeature("METAL", "Fe2-S", 1, 3,
+            Float.NaN, "group");
+  
+    sar.appendFeature(sb, 1, null, sf);
+    assertEquals("METAL 1 3; Fe2-S", sb.toString());
+  }
+
+  @Test(groups = "Functional")
+  public void testAppendFeature_clinicalSignificance()
+  {
+    SequenceAnnotationReport sar = new SequenceAnnotationReport(null);
+    StringBuffer sb = new StringBuffer();
+    SequenceFeature sf = new SequenceFeature("METAL", "Fe2-S", 1, 3,
+            Float.NaN, "group");
+    sf.setValue("clinical_significance", "Benign");
+  
+    sar.appendFeature(sb, 1, null, sf);
+    assertEquals("METAL 1 3; Fe2-S; Benign", sb.toString());
+  }
+
+  @Test(groups = "Functional")
+  public void testAppendFeature_withScoreStatusClinicalSignificance()
+  {
+    SequenceAnnotationReport sar = new SequenceAnnotationReport(null);
+    StringBuffer sb = new StringBuffer();
+    SequenceFeature sf = new SequenceFeature("METAL", "Fe2-S", 1, 3, 1.3f,
+            "group");
+    sf.setStatus("Confirmed");
+    sf.setValue("clinical_significance", "Benign");
+    Map<String, float[][]> minmax = new Hashtable<String, float[][]>();
+    minmax.put("METAL", new float[][] { { 0f, 1f }, null });
+    sar.appendFeature(sb, 1, minmax, sf);
+
+    assertEquals("METAL 1 3; Fe2-S Score=1.3; (Confirmed); Benign",
+            sb.toString());
+  }
+
+  @Test(groups = "Functional")
+  public void testAppendFeature_DescEqualsType()
+  {
+    SequenceAnnotationReport sar = new SequenceAnnotationReport(null);
+    StringBuffer sb = new StringBuffer();
+    SequenceFeature sf = new SequenceFeature("METAL", "METAL", 1, 3,
+            Float.NaN, "group");
+  
+    // description is not included if it duplicates type:
+    sar.appendFeature(sb, 1, null, sf);
+    assertEquals("METAL 1 3", sb.toString());
+
+    sb.setLength(0);
+    sf.setDescription("Metal");
+    // test is case-sensitive:
+    sar.appendFeature(sb, 1, null, sf);
+    assertEquals("METAL 1 3; Metal", sb.toString());
+  }
+
+  @Test(groups = "Functional")
+  public void testAppendFeature_stripHtml()
+  {
+    SequenceAnnotationReport sar = new SequenceAnnotationReport(null);
+    StringBuffer sb = new StringBuffer();
+    SequenceFeature sf = new SequenceFeature("METAL",
+            "<html><body>hello<em>world</em></body></html>", 1, 3,
+            Float.NaN, "group");
+  
+    sar.appendFeature(sb, 1, null, sf);
+    // !! strips off </body> but not <body> ??
+    assertEquals("METAL 1 3; <body>hello<em>world</em>",
+            sb.toString());
+
+    sb.setLength(0);
+    sf.setDescription("<br>&kHD>6");
+    sar.appendFeature(sb, 1, null, sf);
+    // if no <html> tag, html-encodes > and < (only):
+    assertEquals("METAL 1 3; &lt;br&gt;&kHD&gt;6", sb.toString());
+  }
+}
index e889837..d7a9166 100644 (file)
@@ -54,7 +54,7 @@ public class StockholmFileTest
   {
     AppletFormatAdapter af = new AppletFormatAdapter();
     AlignmentI al = af.readFile(PfamFile, af.FILE,
-            new IdentifyFile().Identify(PfamFile, af.FILE));
+            new IdentifyFile().identify(PfamFile, af.FILE));
     int numpdb = 0;
     for (SequenceI sq : al.getSequences())
     {
@@ -95,7 +95,7 @@ public class StockholmFileTest
       AppletFormatAdapter rf = new AppletFormatAdapter();
 
       AlignmentI al = rf.readFile(ff, AppletFormatAdapter.FILE,
-              new IdentifyFile().Identify(ff, AppletFormatAdapter.FILE));
+              new IdentifyFile().identify(ff, AppletFormatAdapter.FILE));
 
       assertNotNull("Couldn't read supplied alignment data.", al);
 
@@ -112,7 +112,7 @@ public class StockholmFileTest
               AppletFormatAdapter.PASTE, ioformat);
       assertNotNull("Couldn't parse reimported alignment data.", al_input);
 
-      String identifyoutput = new IdentifyFile().Identify(outputfile,
+      String identifyoutput = new IdentifyFile().identify(outputfile,
               AppletFormatAdapter.PASTE);
       assertNotNull("Identify routine failed for outputformat " + ioformat,
               identifyoutput);
diff --git a/test/jalview/io/gff/ExonerateHelperTest.java b/test/jalview/io/gff/ExonerateHelperTest.java
new file mode 100644 (file)
index 0000000..54d6eb2
--- /dev/null
@@ -0,0 +1,295 @@
+package jalview.io.gff;
+
+import static org.testng.AssertJUnit.assertEquals;
+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.datamodel.AlignedCodonFrame;
+import jalview.datamodel.Alignment;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.Mapping;
+import jalview.datamodel.MappingType;
+import jalview.datamodel.Sequence;
+import jalview.datamodel.SequenceDummy;
+import jalview.datamodel.SequenceI;
+import jalview.gui.AlignFrame;
+import jalview.io.FileLoader;
+import jalview.io.FormatAdapter;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.testng.annotations.Test;
+
+public class ExonerateHelperTest
+{
+  @Test(groups = "Functional")
+  public void testGetMappingType()
+  {
+    // protein-to-dna:
+    assertSame(MappingType.PeptideToNucleotide,
+            ExonerateHelper
+                    .getMappingType("exonerate:protein2genome:local"));
+    assertSame(MappingType.PeptideToNucleotide,
+            ExonerateHelper.getMappingType("exonerate:protein2dna:local"));
+
+    // dna-to-dna:
+    assertSame(MappingType.NucleotideToNucleotide,
+            ExonerateHelper.getMappingType("coding2coding"));
+    assertSame(MappingType.NucleotideToNucleotide,
+            ExonerateHelper.getMappingType("coding2genome"));
+    assertSame(MappingType.NucleotideToNucleotide,
+            ExonerateHelper.getMappingType("cdna2genome"));
+    assertSame(MappingType.NucleotideToNucleotide,
+            ExonerateHelper.getMappingType("genome2genome"));
+    assertNull(ExonerateHelper.getMappingType("affine:local"));
+  }
+
+  /**
+   * Test processing one exonerate GFF line for the case where the mapping is
+   * protein2dna, similarity feature is on the query (the protein), match to the
+   * forward strand, target sequence is in neither the alignment nor the 'new
+   * sequences'
+   * 
+   * @throws IOException
+   */
+  @Test(groups = "Functional")
+  public void testProcessGffSimilarity_protein2dna_forward_querygff()
+          throws IOException
+  {
+    ExonerateHelper testee = new ExonerateHelper();
+    List<SequenceI> newseqs = new ArrayList<SequenceI>();
+    String[] gff = "Seq\texonerate:protein2dna:local\tsimilarity\t3\t10\t.\t+\t.\talignment_id 0 ; Target dna1 ; Align 3 400 8"
+            .split("\\t");
+    SequenceI seq = new Sequence("Seq", "PQRASTGKEEDVMIWCHQN");
+    seq.createDatasetSequence();
+    AlignmentI align = new Alignment(new SequenceI[] {});
+    Map<String, List<String>> set = Gff2Helper.parseNameValuePairs(gff[8]);
+
+    /*
+     * this should create a mapping from Seq2/3-10 to virtual sequence
+     * dna1 (added to newseqs) positions 400-423
+     */
+    testee.processGffSimilarity(set, seq, gff, align, newseqs, false);
+    assertEquals(1, newseqs.size());
+    assertTrue(newseqs.get(0) instanceof SequenceDummy);
+    assertEquals("dna1", newseqs.get(0).getName());
+    assertEquals(1, align.getCodonFrames().size());
+    AlignedCodonFrame mapping = align.getCodonFrames().iterator().next();
+    assertEquals(1, mapping.getAaSeqs().length);
+    assertSame(seq.getDatasetSequence(), mapping.getAaSeqs()[0]);
+    assertEquals(1, mapping.getdnaSeqs().length);
+    assertSame(newseqs.get(0), mapping.getdnaSeqs()[0]);
+    assertEquals(1, mapping.getdnaToProt().length);
+    assertEquals(1, mapping.getdnaToProt()[0].getFromRanges().size());
+    assertArrayEquals(new int[] { 400, 423 }, mapping.getdnaToProt()[0]
+            .getFromRanges().get(0));
+    assertEquals(1, mapping.getdnaToProt()[0].getToRanges().size());
+    assertArrayEquals(new int[] { 3, 10 }, mapping.getdnaToProt()[0]
+            .getToRanges().get(0));
+  }
+
+  /**
+   * Test processing one exonerate GFF line for the case where the mapping is
+   * protein2dna, similarity feature is on the query (the protein), match to the
+   * reverse strand
+   * 
+   * @throws IOException
+   */
+  @Test(groups = "Functional")
+  public void testProcessGffSimilarity_protein2dna_reverse_querygff()
+          throws IOException
+  {
+    ExonerateHelper testee = new ExonerateHelper();
+    List<SequenceI> newseqs = new ArrayList<SequenceI>();
+    String[] gff = "Seq\texonerate:protein2dna:local\tsimilarity\t3\t10\t0\t-\t.\talignment_id 0 ; Target dna1 ; Align 3 400 8"
+            .split("\\t");
+    SequenceI seq = new Sequence("Seq", "PQRASTGKEEDVMIWCHQN");
+    seq.createDatasetSequence();
+    AlignmentI align = new Alignment(new SequenceI[] {});
+    Map<String, List<String>> set = Gff2Helper.parseNameValuePairs(gff[8]);
+
+    /*
+     * this should create a mapping from Seq2/3-10 to virtual sequence
+     * dna1 (added to newseqs) positions 400-377 (reverse)
+     */
+    testee.processGffSimilarity(set, seq, gff, align, newseqs, false);
+    assertEquals(1, newseqs.size());
+    assertTrue(newseqs.get(0) instanceof SequenceDummy);
+    assertEquals("dna1", newseqs.get(0).getName());
+    assertEquals(1, align.getCodonFrames().size());
+    AlignedCodonFrame mapping = align.getCodonFrames().iterator().next();
+    assertEquals(1, mapping.getAaSeqs().length);
+    assertSame(seq.getDatasetSequence(), mapping.getAaSeqs()[0]);
+    assertEquals(1, mapping.getdnaSeqs().length);
+    assertSame(newseqs.get(0), mapping.getdnaSeqs()[0]);
+    assertEquals(1, mapping.getdnaToProt().length);
+    assertEquals(1, mapping.getdnaToProt()[0].getFromRanges().size());
+    assertArrayEquals(new int[] { 400, 377 }, mapping.getdnaToProt()[0]
+            .getFromRanges().get(0));
+    assertEquals(1, mapping.getdnaToProt()[0].getToRanges().size());
+    assertArrayEquals(new int[] { 3, 10 }, mapping.getdnaToProt()[0]
+            .getToRanges().get(0));
+  }
+
+  /**
+   * Test processing one exonerate GFF line for the case where the mapping is
+   * protein2dna, similarity feature is on the target (the dna), match to the
+   * forward strand
+   * 
+   * @throws IOException
+   */
+  @Test(groups = "Functional")
+  public void testProcessGffSimilarity_protein2dna_forward_targetgff()
+          throws IOException
+  {
+    ExonerateHelper testee = new ExonerateHelper();
+    List<SequenceI> newseqs = new ArrayList<SequenceI>();
+    String[] gff = "dna1\texonerate:protein2dna:local\tsimilarity\t400\t423\t0\t+\t.\talignment_id 0 ; Query Prot1 ; Align 400 3 24"
+            .split("\\t");
+    SequenceI seq = new Sequence("dna1/391-430",
+            "CGATCCGATCCGATCCGATCCGATCCGATCCGATCCGATC");
+    seq.createDatasetSequence();
+    AlignmentI align = new Alignment(new SequenceI[] { seq });
+    // GFF feature on the target describes mapping from base 400 for
+    // count 24 to position 3
+    Map<String, List<String>> set = Gff2Helper.parseNameValuePairs(gff[8]);
+
+    /*
+     * this should create a mapping from virtual sequence dna1 (added to 
+     * newseqs) positions 400-423 to Prot1/3-10
+     */
+    testee.processGffSimilarity(set, seq, gff, align, newseqs, false);
+    assertEquals(1, newseqs.size());
+    assertTrue(newseqs.get(0) instanceof SequenceDummy);
+    assertEquals("Prot1", newseqs.get(0).getName());
+    assertEquals(1, align.getCodonFrames().size());
+    AlignedCodonFrame mapping = align.getCodonFrames().iterator().next();
+    assertEquals(1, mapping.getAaSeqs().length);
+    assertSame(newseqs.get(0), mapping.getAaSeqs()[0]);
+    assertSame(seq.getDatasetSequence(), mapping.getdnaSeqs()[0]);
+    assertEquals(1, mapping.getdnaSeqs().length);
+    assertEquals(1, mapping.getdnaToProt().length);
+    assertEquals(1, mapping.getdnaToProt()[0].getFromRanges().size());
+    assertArrayEquals(new int[] { 400, 423 }, mapping.getdnaToProt()[0]
+            .getFromRanges().get(0));
+    assertEquals(1, mapping.getdnaToProt()[0].getToRanges().size());
+    assertArrayEquals(new int[] { 3, 10 }, mapping.getdnaToProt()[0]
+            .getToRanges().get(0));
+  }
+
+  /**
+   * Test processing one exonerate GFF line for the case where the mapping is
+   * protein2dna, similarity feature is on the target (the dna), match to the
+   * reverse strand
+   * 
+   * @throws IOException
+   */
+  @Test(groups = "Functional")
+  public void testProcessGffSimilarity_protein2dna_reverse_targetgff()
+          throws IOException
+  {
+    ExonerateHelper testee = new ExonerateHelper();
+    List<SequenceI> newseqs = new ArrayList<SequenceI>();
+    String[] gff = "dna1\texonerate:protein2dna:local\tsimilarity\t377\t400\t0\t-\t.\talignment_id 0 ; Query Prot1 ; Align 400 3 24"
+            .split("\\t");
+    SequenceI seq = new Sequence("dna1/371-410",
+            "CGATCCGATCCGATCCGATCCGATCCGATCCGATCCGATC");
+    seq.createDatasetSequence();
+    AlignmentI align = new Alignment(new SequenceI[] { seq });
+    // GFF feature on the target describes mapping from base 400 for
+    // count 24 to position 3
+    Map<String, List<String>> set = Gff2Helper.parseNameValuePairs(gff[8]);
+
+    /*
+     * this should create a mapping from virtual sequence dna1 (added to 
+     * newseqs) positions 400-377 (reverse) to Prot1/3-10
+     */
+    testee.processGffSimilarity(set, seq, gff, align, newseqs, false);
+    assertEquals(1, newseqs.size());
+    assertTrue(newseqs.get(0) instanceof SequenceDummy);
+    assertEquals("Prot1", newseqs.get(0).getName());
+    assertEquals(1, align.getCodonFrames().size());
+    AlignedCodonFrame mapping = align.getCodonFrames().iterator().next();
+    assertEquals(1, mapping.getAaSeqs().length);
+    assertSame(newseqs.get(0), mapping.getAaSeqs()[0]);
+    assertSame(seq.getDatasetSequence(), mapping.getdnaSeqs()[0]);
+    assertEquals(1, mapping.getdnaSeqs().length);
+    assertEquals(1, mapping.getdnaToProt().length);
+    assertEquals(1, mapping.getdnaToProt()[0].getFromRanges().size());
+    assertArrayEquals(new int[] { 400, 377 }, mapping.getdnaToProt()[0]
+            .getFromRanges().get(0));
+    assertEquals(1, mapping.getdnaToProt()[0].getToRanges().size());
+    assertArrayEquals(new int[] { 3, 10 }, mapping.getdnaToProt()[0]
+            .getToRanges().get(0));
+  }
+
+  /**
+   * Tests loading exonerate GFF2 output, including 'similarity' alignment
+   * feature, on to sequences
+   */
+  @Test(groups = { "Functional" })
+  public void testAddExonerateGffToAlignment()
+  {
+    FileLoader loader = new FileLoader(false);
+    AlignFrame af = loader.LoadFileWaitTillLoaded(
+            "examples/testdata/exonerateseqs.fa",
+            FormatAdapter.FILE);
+  
+    af.loadJalviewDataFile("examples/testdata/exonerateoutput.gff",
+            FormatAdapter.FILE, null, null);
+  
+    /*
+     * verify one mapping to a dummy sequence, one to a real one
+     */
+    List<AlignedCodonFrame> mappings = af
+            .getViewport().getAlignment().getDataset().getCodonFrames();
+    assertEquals(2, mappings.size());
+    Iterator<AlignedCodonFrame> iter = mappings.iterator();
+  
+    // first mapping is to dummy sequence
+    AlignedCodonFrame mapping = iter.next();
+    Mapping[] mapList = mapping.getProtMappings();
+    assertEquals(1, mapList.length);
+    assertTrue(mapList[0].getTo() instanceof SequenceDummy);
+    assertEquals("DDB_G0269124", mapList[0].getTo().getName());
+
+    // 143 in protein should map to codon [11270, 11269, 11268] in dna
+    int[] mappedRegion = mapList[0].getMap().locateInFrom(143, 143);
+    assertArrayEquals(new int[] { 11270, 11268 }, mappedRegion);
+  
+    // second mapping is to a sequence in the alignment
+    mapping = iter.next();
+    mapList = mapping.getProtMappings();
+    assertEquals(1, mapList.length);
+    SequenceI proteinSeq = af.getViewport().getAlignment()
+            .findName("DDB_G0280897");
+    assertSame(proteinSeq.getDatasetSequence(), mapList[0].getTo());
+    assertEquals(1, mapping.getdnaToProt().length);
+  
+    // 143 in protein should map to codon [11270, 11269, 11268] in dna
+    mappedRegion = mapList[0].getMap().locateInFrom(143, 143);
+    assertArrayEquals(new int[] { 11270, 11268 }, mappedRegion);
+  
+    // 182 in protein should map to codon [11153, 11152, 11151] in dna
+    mappedRegion = mapList[0].getMap().locateInFrom(182, 182);
+    assertArrayEquals(new int[] { 11153, 11151 }, mappedRegion);
+  
+    // and the reverse mapping:
+    mappedRegion = mapList[0].getMap().locateInTo(11151, 11153);
+    assertArrayEquals(new int[] { 182, 182 }, mappedRegion);
+  
+    // 11150 in dna should _not_ map to protein
+    mappedRegion = mapList[0].getMap().locateInTo(11150, 11150);
+    assertNull(mappedRegion);
+  
+    // similarly 183 in protein should _not_ map to dna
+    mappedRegion = mapList[0].getMap().locateInFrom(183, 183);
+    assertNull(mappedRegion);
+  }
+}
diff --git a/test/jalview/io/gff/Gff3HelperTest.java b/test/jalview/io/gff/Gff3HelperTest.java
new file mode 100644 (file)
index 0000000..420b032
--- /dev/null
@@ -0,0 +1,206 @@
+package jalview.io.gff;
+
+import static org.testng.AssertJUnit.assertEquals;
+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.datamodel.AlignedCodonFrame;
+import jalview.datamodel.Alignment;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.Sequence;
+import jalview.datamodel.SequenceDummy;
+import jalview.datamodel.SequenceFeature;
+import jalview.datamodel.SequenceI;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.testng.annotations.Test;
+
+public class Gff3HelperTest
+{
+
+  /**
+   * Test processing one PASA GFF line giving a match from forward strand to
+   * forward strand
+   * 
+   * @throws IOException
+   */
+  @Test(groups = "Functional")
+  public void testProcessCdnaMatch_forwardToForward() throws IOException
+  {
+    GffHelperBase testee = new Gff3Helper();
+    List<SequenceI> newseqs = new ArrayList<SequenceI>();
+    String[] gff = "gi|68711\tblat-pasa\tcDNA_match\t12923\t13060\t98.55\t+\t.\tID=align_68;Target=gi|N37351 1 138 +"
+            .split("\\t");
+    SequenceI seq = new Sequence("gi|68711",
+            "GAATTCGTTCATGTAGGTTGATTTTTATT");
+    seq.createDatasetSequence();
+    AlignmentI align = new Alignment(new SequenceI[] {});
+
+    /*
+     * this should create a mapping from gi|68711/12923-13060
+     * to virtual sequence gi|N37351 (added to newseqs) positions 1-138
+     */
+    testee.processGff(seq, gff, align, newseqs, false);
+    assertEquals(1, newseqs.size());
+    assertTrue(newseqs.get(0) instanceof SequenceDummy);
+    assertEquals("gi|N37351", newseqs.get(0).getName());
+    assertEquals(1, align.getCodonFrames().size());
+    AlignedCodonFrame mapping = align.getCodonFrames().iterator().next();
+
+    /*
+     * 'dnaseqs' (map from) is here [gi|68711]
+     * 'aaseqs' (map to) is here [gi|N37351]
+     */
+    // TODO use more suitable naming in AlignedCodonFrame
+    assertEquals(1, mapping.getAaSeqs().length);
+    assertSame(seq.getDatasetSequence(), mapping.getdnaSeqs()[0]);
+    assertEquals(1, mapping.getdnaSeqs().length);
+    assertSame(newseqs.get(0), mapping.getAaSeqs()[0]);
+    assertEquals(1, mapping.getdnaToProt().length);
+    assertEquals(1, mapping.getdnaToProt()[0].getFromRanges().size());
+    assertArrayEquals(new int[] { 12923, 13060 }, mapping.getdnaToProt()[0]
+            .getFromRanges().get(0));
+    assertEquals(1, mapping.getdnaToProt()[0].getToRanges().size());
+    assertArrayEquals(new int[] { 1, 138 }, mapping.getdnaToProt()[0]
+            .getToRanges().get(0));
+  }
+
+  /**
+   * Test processing one PASA GFF line giving a match from forward strand to
+   * reverse strand
+   * 
+   * @throws IOException
+   */
+  @Test(groups = "Functional")
+  public void testProcessCdnaMatch_forwardToReverse() throws IOException
+  {
+    GffHelperBase testee = new Gff3Helper();
+    List<SequenceI> newseqs = new ArrayList<SequenceI>();
+    String[] gff = "gi|68711\tblat-pasa\tcDNA_match\t12923\t13060\t98.55\t+\t.\tID=align_68;Target=gi|N37351 1 138 -"
+            .split("\\t");
+    SequenceI seq = new Sequence("gi|68711",
+            "GAATTCGTTCATGTAGGTTGATTTTTATT");
+    seq.createDatasetSequence();
+    AlignmentI align = new Alignment(new SequenceI[] {});
+
+    /*
+     * this should create a mapping from gi|68711/12923-13060
+     * to virtual sequence gi|N37351 (added to newseqs) positions 138-1
+     */
+    testee.processGff(seq, gff, align, newseqs, false);
+    assertEquals(1, newseqs.size());
+    assertTrue(newseqs.get(0) instanceof SequenceDummy);
+    assertEquals("gi|N37351", newseqs.get(0).getName());
+    assertEquals(1, align.getCodonFrames().size());
+    AlignedCodonFrame mapping = align.getCodonFrames().iterator().next();
+
+    /*
+     * 'dnaseqs' (map from) is here [gi|68711]
+     * 'aaseqs' (map to) is here [gi|N37351]
+     */
+    // TODO use more suitable naming in AlignedCodonFrame
+    assertEquals(1, mapping.getAaSeqs().length);
+    assertSame(seq.getDatasetSequence(), mapping.getdnaSeqs()[0]);
+    assertEquals(1, mapping.getdnaSeqs().length);
+    assertSame(newseqs.get(0), mapping.getAaSeqs()[0]);
+    assertEquals(1, mapping.getdnaToProt().length);
+    assertEquals(1, mapping.getdnaToProt()[0].getFromRanges().size());
+    assertArrayEquals(new int[] { 12923, 13060 }, mapping.getdnaToProt()[0]
+            .getFromRanges().get(0));
+    assertEquals(1, mapping.getdnaToProt()[0].getToRanges().size());
+    assertArrayEquals(new int[] { 138, 1 }, mapping.getdnaToProt()[0]
+            .getToRanges().get(0));
+  }
+
+  /**
+   * Test processing one PASA GFF line giving a match from reverse complement
+   * strand to forward strand
+   * 
+   * @throws IOException
+   */
+  @Test(groups = "Functional")
+  public void testProcessCdnaMatch_reverseToForward() throws IOException
+  {
+    GffHelperBase testee = new Gff3Helper();
+    List<SequenceI> newseqs = new ArrayList<SequenceI>();
+    String[] gff = "gi|68711\tblat-pasa\tcDNA_match\t12923\t13060\t98.55\t-\t.\tID=align_68;Target=gi|N37351 1 138 +"
+            .split("\\t");
+    SequenceI seq = new Sequence("gi|68711",
+            "GAATTCGTTCATGTAGGTTGATTTTTATT");
+    seq.createDatasetSequence();
+    AlignmentI align = new Alignment(new SequenceI[] {});
+
+    /*
+     * (For now) we don't process reverse complement mappings; to do this
+     * would require (a) creating a virtual sequence placeholder for the
+     * reverse complement (b) resolving the sequence by its id from some
+     * source (GFF ##FASTA or other) (c) creating the reverse complement
+     * sequence (d) updating the mapping to be to the reverse complement
+     */
+    SequenceFeature sf = testee.processGff(seq, gff, align, newseqs, false);
+    assertNull(sf);
+    assertTrue(newseqs.isEmpty());
+  }
+
+  /**
+   * Test processing two PASA GFF lines representing a spliced mapping
+   * 
+   * @throws IOException
+   */
+  @Test(groups = "Functional")
+  public void testProcessCdnaMatch_spliced() throws IOException
+  {
+    GffHelperBase testee = new Gff3Helper();
+    List<SequenceI> newseqs = new ArrayList<SequenceI>();
+    SequenceI seq = new Sequence("gi|68711",
+            "GAATTCGTTCATGTAGGTTGATTTTTATT");
+    seq.createDatasetSequence();
+    AlignmentI align = new Alignment(new SequenceI[] {});
+  
+    // mapping from gi|68711 12923-13060 to gi|N37351 1-138
+    String[] gff = "gi|68711\tblat-pasa\tcDNA_match\t12923\t13060\t98.55\t+\t.\tID=align_68;Target=gi|N37351 1 138 +"
+            .split("\\t");
+    testee.processGff(seq, gff, align, newseqs, false);
+    // mapping from gi|68711 13411-13550 to gi|N37351 139-278
+    gff = "gi|68711\tblat-pasa\tcDNA_match\t13411\t13550\t98.55\t+\t.\tID=align_68;Target=gi|N37351 139 278 +"
+            .split("\\t");
+    testee.processGff(seq, gff, align, newseqs, false);
+
+    assertEquals(1, newseqs.size());
+    assertTrue(newseqs.get(0) instanceof SequenceDummy);
+    assertEquals("gi|N37351", newseqs.get(0).getName());
+
+    // only 1 AlignedCodonFrame added to the alignment with both mappings!
+    // (this is important for 'align cdna to genome' to work correctly)
+    assertEquals(1, align.getCodonFrames().size());
+    AlignedCodonFrame mapping = align.getCodonFrames().get(0);
+  
+    /*
+     * 'dnaseqs' (map from) is here [gi|68711]
+     * 'aaseqs' (map to) is here [gi|N37351]
+     */
+    // TODO use more suitable naming in AlignedCodonFrame
+    assertEquals(1, mapping.getAaSeqs().length);
+    assertSame(seq.getDatasetSequence(), mapping.getdnaSeqs()[0]);
+    assertEquals(1, mapping.getdnaSeqs().length);
+    assertSame(newseqs.get(0), mapping.getAaSeqs()[0]);
+    assertEquals(1, mapping.getdnaToProt().length);
+    assertEquals(2, mapping.getdnaToProt()[0].getFromRanges().size());
+    // the two spliced dna ranges are combined in one MapList
+    assertArrayEquals(new int[] { 12923, 13060 },
+            mapping.getdnaToProt()[0]
+            .getFromRanges().get(0));
+    assertArrayEquals(new int[] { 13411, 13550 }, mapping.getdnaToProt()[0]
+            .getFromRanges().get(1));
+    assertEquals(1, mapping.getdnaToProt()[0].getToRanges().size());
+    // the two cdna ranges are merged into one contiguous region
+    assertArrayEquals(new int[] { 1, 278 }, mapping.getdnaToProt()[0]
+            .getToRanges().get(0));
+  }
+
+}
diff --git a/test/jalview/io/gff/GffHelperBaseTest.java b/test/jalview/io/gff/GffHelperBaseTest.java
new file mode 100644 (file)
index 0000000..fe8f88e
--- /dev/null
@@ -0,0 +1,168 @@
+package jalview.io.gff;
+
+import static org.testng.AssertJUnit.assertEquals;
+import static org.testng.AssertJUnit.assertFalse;
+import static org.testng.AssertJUnit.assertTrue;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+import org.testng.annotations.Test;
+
+public class GffHelperBaseTest
+{
+
+  /**
+   * Test the method that parses lines like <br>
+   * ID=2345;Name=Something,Another thing;Notes=Hello;Notes=World
+   */
+  @Test(groups = { "Functional" })
+  public void testParseNameValuePairs()
+  {
+    assertTrue(GffHelperBase.parseNameValuePairs(null, ";", ' ', ",")
+            .isEmpty());
+    assertTrue(GffHelperBase.parseNameValuePairs("", ";", ' ', ",")
+            .isEmpty());
+    assertTrue(GffHelperBase.parseNameValuePairs("hello=world", ";", ' ',
+            ",").isEmpty());
+
+    Map<String, List<String>> map = GffHelperBase.parseNameValuePairs(
+            "hello world", ";", ' ', ", ");
+    assertEquals(1, map.size());
+    assertEquals(1, map.get("hello").size());
+    assertEquals("world", map.get("hello").get(0));
+
+    map = GffHelperBase
+            .parseNameValuePairs(
+                    "Method= manual curation ;nothing; Notes=F2 S ; Notes=Metal,Shiny; Type=",
+                    ";", '=', ",");
+
+    // Type is ignored as no value was supplied
+    assertEquals(2, map.size());
+
+    assertEquals(1, map.get("Method").size());
+    assertEquals("manual curation", map.get("Method").get(0)); // trimmed
+
+    assertEquals(3, map.get("Notes").size());
+    assertEquals("F2 S", map.get("Notes").get(0));
+    assertEquals("Metal", map.get("Notes").get(1));
+    assertEquals("Shiny", map.get("Notes").get(2));
+  }
+
+  /**
+   * Test for the method that tries to trim mappings to equivalent lengths
+   */
+  @Test(groups = "Functional")
+  public void testTrimMapping()
+  {
+    int[] from = { 1, 12 };
+    int[] to = { 20, 31 };
+    assertTrue(GffHelperBase.trimMapping(from, to, 1, 1));
+    assertEquals("[1, 12]", Arrays.toString(from)); // unchanged
+    assertEquals("[20, 31]", Arrays.toString(to)); // unchanged
+
+    // from too long:
+    from = new int[] { 1, 13 };
+    assertTrue(GffHelperBase.trimMapping(from, to, 1, 1));
+    assertEquals("[1, 12]", Arrays.toString(from)); // trimmed
+    assertEquals("[20, 31]", Arrays.toString(to)); // unchanged
+
+    // to too long:
+    to = new int[] { 20, 33 };
+    assertTrue(GffHelperBase.trimMapping(from, to, 1, 1));
+    assertEquals("[1, 12]", Arrays.toString(from)); // unchanged
+    assertEquals("[20, 31]", Arrays.toString(to)); // trimmed
+
+    // from reversed:
+    from = new int[] { 12, 1 };
+    assertTrue(GffHelperBase.trimMapping(from, to, 1, 1));
+    assertEquals("[12, 1]", Arrays.toString(from)); // unchanged
+    assertEquals("[20, 31]", Arrays.toString(to)); // unchanged
+
+    // to reversed:
+    to = new int[] { 31, 20 };
+    assertTrue(GffHelperBase.trimMapping(from, to, 1, 1));
+    assertEquals("[12, 1]", Arrays.toString(from)); // unchanged
+    assertEquals("[31, 20]", Arrays.toString(to)); // unchanged
+
+    // from reversed and too long:
+    from = new int[] { 14, 1 };
+    assertTrue(GffHelperBase.trimMapping(from, to, 1, 1));
+    assertEquals("[14, 3]", Arrays.toString(from)); // end trimmed
+    assertEquals("[31, 20]", Arrays.toString(to)); // unchanged
+
+    // to reversed and too long:
+    to = new int[] { 31, 10 };
+    assertTrue(GffHelperBase.trimMapping(from, to, 1, 1));
+    assertEquals("[14, 3]", Arrays.toString(from)); // unchanged
+    assertEquals("[31, 20]", Arrays.toString(to)); // end trimmed
+
+    // cdna to peptide (matching)
+    from = new int[] { 1, 18 };
+    to = new int[] { 4, 9 };
+    assertTrue(GffHelperBase.trimMapping(from, to, 3, 1));
+    assertEquals("[1, 18]", Arrays.toString(from)); // unchanged
+    assertEquals("[4, 9]", Arrays.toString(to)); // unchanged
+
+    // overlong cdna to peptide
+    from = new int[] { 1, 20 };
+    assertTrue(GffHelperBase.trimMapping(from, to, 3, 1));
+    assertEquals("[1, 18]", Arrays.toString(from)); // end trimmed
+    assertEquals("[4, 9]", Arrays.toString(to)); // unchanged
+
+    // overlong cdna (reversed) to peptide
+    from = new int[] { 20, 1 };
+    assertTrue(GffHelperBase.trimMapping(from, to, 3, 1));
+    assertEquals("[20, 3]", Arrays.toString(from)); // end trimmed
+    assertEquals("[4, 9]", Arrays.toString(to)); // unchanged
+
+    // overlong cdna (reversed) to peptide (reversed)
+    from = new int[] { 20, 1 };
+    to = new int[] { 9, 4 };
+    assertTrue(GffHelperBase.trimMapping(from, to, 3, 1));
+    assertEquals("[20, 3]", Arrays.toString(from)); // end trimmed
+    assertEquals("[9, 4]", Arrays.toString(to)); // unchanged
+
+    // peptide to cdna (matching)
+    from = new int[] { 4, 9 };
+    to = new int[] { 1, 18 };
+    assertTrue(GffHelperBase.trimMapping(from, to, 1, 3));
+    assertEquals("[4, 9]", Arrays.toString(from)); // unchanged
+    assertEquals("[1, 18]", Arrays.toString(to)); // unchanged
+
+    // peptide to overlong cdna
+    to = new int[] { 1, 20 };
+    assertTrue(GffHelperBase.trimMapping(from, to, 1, 3));
+    assertEquals("[4, 9]", Arrays.toString(from)); // unchanged
+    assertEquals("[1, 18]", Arrays.toString(to)); // end trimmed
+
+    // peptide to overlong cdna (reversed)
+    to = new int[] { 20, 1 };
+    assertTrue(GffHelperBase.trimMapping(from, to, 1, 3));
+    assertEquals("[4, 9]", Arrays.toString(from)); // unchanged
+    assertEquals("[20, 3]", Arrays.toString(to)); // end trimmed
+
+    // peptide (reversed) to overlong cdna (reversed)
+    from = new int[] { 9, 4 };
+    to = new int[] { 20, 1 };
+    assertTrue(GffHelperBase.trimMapping(from, to, 1, 3));
+    assertEquals("[9, 4]", Arrays.toString(from)); // unchanged
+    assertEquals("[20, 3]", Arrays.toString(to)); // end trimmed
+
+    // overlong peptide to word-length cdna
+    from = new int[] { 4, 10 };
+    to = new int[] { 1, 18 };
+    assertTrue(GffHelperBase.trimMapping(from, to, 1, 3));
+    assertEquals("[4, 9]", Arrays.toString(from)); // end trimmed
+    assertEquals("[1, 18]", Arrays.toString(to)); // unchanged
+
+    // overlong peptide to non-word-length cdna
+    from = new int[] { 4, 10 };
+    to = new int[] { 1, 19 };
+    assertFalse(GffHelperBase.trimMapping(from, to, 1, 3));
+    assertEquals("[4, 10]", Arrays.toString(from)); // unchanged
+    assertEquals("[1, 19]", Arrays.toString(to)); // unchanged
+
+  }
+}
diff --git a/test/jalview/io/gff/GffHelperFactoryTest.java b/test/jalview/io/gff/GffHelperFactoryTest.java
new file mode 100644 (file)
index 0000000..657b5bd
--- /dev/null
@@ -0,0 +1,72 @@
+package jalview.io.gff;
+
+import static org.testng.AssertJUnit.assertNull;
+import static org.testng.AssertJUnit.assertSame;
+import static org.testng.AssertJUnit.assertTrue;
+
+import org.testng.annotations.Test;
+
+public class GffHelperFactoryTest
+{
+
+  @Test(groups = "Functional")
+  public void testGetHelper()
+  {
+    assertNull(GffHelperFactory.getHelper(null));
+
+    String tabRegex = "\\t";
+
+    /*
+     * column 3 = 'similarity' indicates exonerate GFF alignment data
+     */
+    String gff = "submitted\taffine:local\tsimilarity\t20\t30\t99\t+\t.\t";
+    // no attributes (column 9 data):
+    assertTrue(GffHelperFactory.getHelper(gff.split(tabRegex)) instanceof Gff2Helper);
+
+    // attributes set but unhandled featureGroup - get generic handler
+    gff = "submitted\taffine:local\tsimilarity\t20\t30\t99\t+\t.\tID=$1";
+    assertSame(GffHelperFactory.getHelper(gff.split(tabRegex)).getClass(),
+            Gff3Helper.class);
+
+    // handled featureGroup (exonerate model) values
+    gff = "submitted\texonerate:protein2dna:local\tsimilarity\t20\t30\t99\t+\t.\tID=$1";
+    assertTrue(GffHelperFactory.getHelper(gff.split(tabRegex)) instanceof ExonerateHelper);
+
+    gff = "submitted\tprotein2genome\tsimilarity\t20\t30\t99\t+\t.\tID=$1";
+    assertTrue(GffHelperFactory.getHelper(gff.split(tabRegex)) instanceof ExonerateHelper);
+
+    gff = "submitted\tcoding2coding\tsimilarity\t20\t30\t99\t+\t.\tID=$1";
+    assertTrue(GffHelperFactory.getHelper(gff.split(tabRegex)) instanceof ExonerateHelper);
+
+    gff = "submitted\tcoding2genome\tsimilarity\t20\t30\t99\t+\t.\tID=$1";
+    assertTrue(GffHelperFactory.getHelper(gff.split(tabRegex)) instanceof ExonerateHelper);
+
+    gff = "submitted\tcdna2genome\tsimilarity\t20\t30\t99\t+\t.\tID=$1";
+    assertTrue(GffHelperFactory.getHelper(gff.split(tabRegex)) instanceof ExonerateHelper);
+
+    gff = "submitted\tgenome2genome\tsimilarity\t20\t30\t99\t+\t.\tID=$1";
+    assertTrue(GffHelperFactory.getHelper(gff.split(tabRegex)) instanceof ExonerateHelper);
+
+    // not case-sensitive:
+    gff = "submitted\tgenome2genome\tSIMILARITY\t20\t30\t99\t+\t.\tID=$1";
+    assertTrue(GffHelperFactory.getHelper(gff.split(tabRegex)) instanceof ExonerateHelper);
+
+    /*
+     * InterProScan has 'protein_match' in column 3
+     */
+    gff = "Submitted\tPANTHER\tprotein_match\t1\t1174\t0.0\t+\t.\tName=PTHR32154";
+    assertTrue(GffHelperFactory.getHelper(gff.split(tabRegex)) instanceof InterProScanHelper);
+
+    /*
+     * nothing specific - return the generic GFF3 class if Name=Value is present in col9
+     */
+    gff = "nothing\tinteresting\there\t20\t30\t99\t+\t.\tID=1";
+    GffHelperI helper = GffHelperFactory.getHelper(gff.split(tabRegex));
+    assertSame(helper.getClass(), Gff3Helper.class);
+
+    // return the generic GFF2 class if "Name Value" is present in col9
+    gff = "nothing\tinteresting\there\t20\t30\t99\t+\t.\tID 1";
+    helper = GffHelperFactory.getHelper(gff.split(tabRegex));
+    assertSame(helper.getClass(), Gff2Helper.class);
+  }
+}
diff --git a/test/jalview/io/gff/GffTests.java b/test/jalview/io/gff/GffTests.java
new file mode 100644 (file)
index 0000000..2ee4eac
--- /dev/null
@@ -0,0 +1,86 @@
+package jalview.io.gff;
+
+import static org.testng.AssertJUnit.assertEquals;
+import static org.testng.AssertJUnit.assertSame;
+import static org.testng.AssertJUnit.assertTrue;
+import static org.testng.internal.junit.ArrayAsserts.assertArrayEquals;
+
+import jalview.datamodel.AlignedCodonFrame;
+import jalview.datamodel.Alignment;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.Mapping;
+import jalview.datamodel.Sequence;
+import jalview.datamodel.SequenceDummy;
+import jalview.datamodel.SequenceI;
+import jalview.gui.AlignFrame;
+import jalview.io.FileLoader;
+import jalview.io.FormatAdapter;
+
+import java.util.List;
+
+import org.testng.annotations.Test;
+
+/**
+ * Tests of use cases that include parsing GFF (version 2 or 3) features that
+ * describe mappings between protein and cDNA. The format of the GFF varies
+ * depending on which tool generated it.
+ */
+public class GffTests
+{
+  /**
+   * Test the case where we load a protein ('query') sequence, then exonerateGff
+   * describing its mapping to cDNA, and then a DNA sequence including the
+   * mapped region
+   */
+  @Test(groups = "Functional")
+  public void testResolveExonerateGff()
+  {
+    String proteinSeq = ">prot1/10-16\nYCWRSGA";
+    AlignFrame af = new FileLoader(false).LoadFileWaitTillLoaded(
+            proteinSeq, FormatAdapter.PASTE);
+
+    /*
+     * exonerate GFF output mapping residues 11-15 (CWRSG) 
+     * to bases 24-10 in sequence 'dna1' (reverse strand)
+     */
+    String exonerateGff = "##gff-version 2\n"
+            + "prot1\tprotein2genome\tsimilarity\t11\t15\t99\t-\t.\talignment_id 0 ; Target dna1 ; Align 11 24 5";
+    af.loadJalviewDataFile(exonerateGff, FormatAdapter.PASTE, null, null);
+
+    /*
+     * check we have a mapping from prot1 to SequenceDummy 'dna1'
+     */
+    AlignmentI dataset = af.getViewport().getAlignment().getDataset();
+    assertEquals(1, dataset.getSequences().size());
+    assertEquals("prot1", dataset.getSequenceAt(0).getName());
+    assertEquals("YCWRSGA", dataset.getSequenceAt(0).getSequenceAsString());
+    List<AlignedCodonFrame> mappings = dataset.getCodonFrames();
+    assertEquals(1, mappings.size());
+    AlignedCodonFrame mapping = mappings.iterator().next();
+    SequenceI mappedDna = mapping.getDnaForAaSeq(dataset.getSequenceAt(0));
+    assertTrue(mappedDna instanceof SequenceDummy);
+    assertEquals("dna1", mappedDna.getName());
+    Mapping[] mapList = mapping.getProtMappings();
+    assertEquals(1, mapList.length);
+    // 11 in protein should map to codon [24, 23, 22] in dna
+    int[] mappedRegion = mapList[0].getMap().locateInFrom(11, 11);
+    assertArrayEquals(new int[] { 24, 22 }, mappedRegion);
+    // 15 in protein should map to codon [12, 11, 10] in dna
+    mappedRegion = mapList[0].getMap().locateInFrom(15, 15);
+    assertArrayEquals(new int[] { 12, 10 }, mappedRegion);
+
+    SequenceI dna1 = new Sequence("dna1", "AAACCCGGGTTTAAACCCGGGTTT");
+    AlignmentI al = new Alignment(new SequenceI[] { dna1 });
+    al.setDataset(null);
+
+    /*
+     * Now 'realise' the virtual mapping to the real DNA sequence;
+     * interactively this could be by a drag or fetch of the sequence data
+     * on to the alignment
+     */
+    mapping.realiseWith(dna1);
+    // verify the mapping is now from the real, not the dummy sequence
+    assertSame(dna1.getDatasetSequence(),
+            mapping.getDnaForAaSeq(dataset.getSequenceAt(0)));
+  }
+}
diff --git a/test/jalview/io/gff/InterProScanHelperTest.java b/test/jalview/io/gff/InterProScanHelperTest.java
new file mode 100644 (file)
index 0000000..2ef4c99
--- /dev/null
@@ -0,0 +1,71 @@
+package jalview.io.gff;
+
+import static org.testng.AssertJUnit.assertEquals;
+import static org.testng.AssertJUnit.assertSame;
+import static org.testng.AssertJUnit.assertTrue;
+import static org.testng.internal.junit.ArrayAsserts.assertArrayEquals;
+
+import jalview.datamodel.AlignedCodonFrame;
+import jalview.datamodel.Alignment;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.Sequence;
+import jalview.datamodel.SequenceDummy;
+import jalview.datamodel.SequenceI;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.testng.annotations.Test;
+
+public class InterProScanHelperTest
+{
+
+  /**
+   * Test processing one InterProScan GFF line
+   * 
+   * @throws IOException
+   */
+  @Test(groups = "Functional")
+  public void testProcessProteinMatch() throws IOException
+  {
+    InterProScanHelper testee = new InterProScanHelper();
+    List<SequenceI> newseqs = new ArrayList<SequenceI>();
+    String[] gff = "Submitted\tPfam\tprotein_match\t5\t30\t0\t+\t.\tName=PF12838;Target=Submitted 5 30;signature_desc=4Fe-4S dicluster domain;ID=match$17_5_30"
+            .split("\\t");
+    SequenceI seq = new Sequence("Prot1", "PQRASTGKEEDVMIWCHQN");
+    seq.createDatasetSequence();
+    AlignmentI align = new Alignment(new SequenceI[] {});
+    Map<String, List<String>> set = Gff3Helper.parseNameValuePairs(gff[8]);
+  
+    /*
+     * this should create a mapping from Prot1/5-30 to virtual sequence
+     * match$17_5_30 (added to newseqs) positions 1-26
+     */
+    testee.processProteinMatch(set, seq, gff, align, newseqs, false);
+    assertEquals(1, newseqs.size());
+    assertTrue(newseqs.get(0) instanceof SequenceDummy);
+    assertEquals("match$17_5_30", newseqs.get(0).getName());
+    assertEquals(1, align.getCodonFrames().size());
+    AlignedCodonFrame mapping = align.getCodonFrames().iterator().next();
+
+    /*
+     * 'dnaseqs' (map from) is here [Prot1]
+     * 'aaseqs' (map to) is here [match$17_5_30]
+     */
+    // TODO use more suitable naming in AlignedCodonFrame
+    assertEquals(1, mapping.getAaSeqs().length);
+    assertSame(seq.getDatasetSequence(), mapping.getdnaSeqs()[0]);
+    assertEquals(1, mapping.getdnaSeqs().length);
+    assertSame(newseqs.get(0), mapping.getAaSeqs()[0]);
+    assertEquals(1, mapping.getdnaToProt().length);
+    assertEquals(1, mapping.getdnaToProt()[0].getFromRanges().size());
+    assertArrayEquals(new int[] { 5, 30 }, mapping.getdnaToProt()[0]
+            .getFromRanges().get(0));
+    assertEquals(1, mapping.getdnaToProt()[0].getToRanges().size());
+    assertArrayEquals(new int[] { 1, 26 }, mapping.getdnaToProt()[0]
+            .getToRanges().get(0));
+  }
+
+}
index 483ea5d..9b1bd73 100644 (file)
@@ -166,7 +166,7 @@ public class FeatureColourTest
      */
     fc = new FeatureColour(Color.GREEN, Color.RED, 12f, 25f);
     String greenHex = Format.getHexString(Color.GREEN);
-    String expected = String.format("domain\t%s|%s|12.0|25.0|none",
+    String expected = String.format("domain\t%s|%s|abso|12.0|25.0|none",
             greenHex, redHex);
     assertEquals(expected, fc.toJalviewFormat("domain"));
 
@@ -174,7 +174,7 @@ public class FeatureColourTest
      * colour ranges over the actual score ranges (not min/max)
      */
     fc.setAutoScaled(true);
-    expected = String.format("domain\t%s|%s|abso|12.0|25.0|none", greenHex,
+    expected = String.format("domain\t%s|%s|12.0|25.0|none", greenHex,
             redHex);
     assertEquals(expected, fc.toJalviewFormat("domain"));
 
@@ -183,7 +183,7 @@ public class FeatureColourTest
      */
     fc.setThreshold(12.5f);
     fc.setBelowThreshold(true);
-    expected = String.format("domain\t%s|%s|abso|12.0|25.0|below|12.5",
+    expected = String.format("domain\t%s|%s|12.0|25.0|below|12.5",
             greenHex, redHex);
     assertEquals(expected, fc.toJalviewFormat("domain"));
 
@@ -192,6 +192,7 @@ public class FeatureColourTest
      */
     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"));
index cbdbc40..8674ed8 100644 (file)
@@ -30,13 +30,12 @@ import jalview.datamodel.SequenceI;
 import jalview.gui.AlignFrame;
 import jalview.io.FileLoader;
 import jalview.io.FormatAdapter;
+import jalview.io.StructureFile;
 
 import org.testng.Assert;
 import org.testng.AssertJUnit;
 import org.testng.annotations.Test;
 
-import MCview.PDBfile;
-
 public class Mapping
 {
 
@@ -67,7 +66,7 @@ public class Mapping
       { 303, 315 }, sheets[] = new int[] { 267, 268, 269, 270 };
 
       StructureSelectionManager ssm = new jalview.structure.StructureSelectionManager();
-      PDBfile pmap = ssm.setMapping(true, new SequenceI[] { uprot },
+      StructureFile pmap = ssm.setMapping(true, new SequenceI[] { uprot },
               new String[] { "A" }, "test/jalview/ext/jmol/1QCF.pdb",
               jalview.io.FormatAdapter.FILE);
       assertTrue(pmap != null);
@@ -138,7 +137,8 @@ public class Mapping
     StructureSelectionManager ssm = new jalview.structure.StructureSelectionManager();
     // Associate the 1GAQ pdb file with the subsequence 'imported' from another
     // source
-    PDBfile pde = ssm.setMapping(true, new SequenceI[] { sq }, new String[]
+    StructureFile pde = ssm.setMapping(true, new SequenceI[] { sq },
+            new String[]
     { "A" }, inFile = "examples/1gaq.txt", jalview.io.FormatAdapter.FILE);
     assertTrue("PDB File couldn't be found", pde != null);
     StructureMapping[] mp = ssm.getMapping(inFile);
@@ -234,7 +234,7 @@ public class Mapping
                     FormatAdapter.PASTE, "FASTA");
     SequenceI newseq = seqf.getViewport().getAlignment().getSequenceAt(0);
     StructureSelectionManager ssm = new jalview.structure.StructureSelectionManager();
-    PDBfile pmap = ssm.setMapping(true, new SequenceI[] { newseq },
+    StructureFile pmap = ssm.setMapping(true, new SequenceI[] { newseq },
             new String[] { null }, "examples/3W5V.pdb",
             jalview.io.FormatAdapter.FILE);
     if (pmap == null)
@@ -250,6 +250,7 @@ public class Mapping
   @Test(groups = { "Functional" })
   public void compareTransferredToRefPDBAnnot() throws Exception
   {
+    StructureViewSettings.setShowSeqFeatures(true);
     AlignFrame ref = new FileLoader(false)
             .LoadFileWaitTillLoaded("test/jalview/ext/jmol/1QCF.pdb",
                     jalview.io.FormatAdapter.FILE);
@@ -262,7 +263,7 @@ public class Mapping
     StructureSelectionManager ssm = new jalview.structure.StructureSelectionManager();
     ssm.setProcessSecondaryStructure(true);
     ssm.setAddTempFacAnnot(true);
-    PDBfile pmap = ssm.setMapping(true, new SequenceI[] { newseq },
+    StructureFile pmap = ssm.setMapping(true, new SequenceI[] { newseq },
             new String[] { null }, "test/jalview/ext/jmol/1QCF.pdb",
             jalview.io.FormatAdapter.FILE);
     assertTrue(pmap != null);
index e9fa336..999d158 100644 (file)
@@ -28,15 +28,14 @@ import jalview.datamodel.Sequence;
 import jalview.datamodel.SequenceFeature;
 import jalview.datamodel.SequenceI;
 import jalview.io.FormatAdapter;
+import jalview.io.StructureFile;
 
-import java.util.HashSet;
-import java.util.Set;
+import java.util.ArrayList;
+import java.util.List;
 
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
-import MCview.PDBfile;
-
 public class StructureSelectionManagerTest
 {
   private StructureSelectionManager ssm;
@@ -44,6 +43,7 @@ public class StructureSelectionManagerTest
   @BeforeMethod(alwaysRun = true)
   public void setUp()
   {
+    StructureViewSettings.setShowSeqFeatures(true);
     ssm = new StructureSelectionManager();
   }
 
@@ -54,21 +54,21 @@ public class StructureSelectionManagerTest
     AlignedCodonFrame acf2 = new AlignedCodonFrame();
 
     ssm.registerMapping(acf1);
-    assertEquals(1, ssm.seqmappings.size());
-    assertTrue(ssm.seqmappings.contains(acf1));
+    assertEquals(1, ssm.getSequenceMappings().size());
+    assertTrue(ssm.getSequenceMappings().contains(acf1));
 
     ssm.registerMapping(acf2);
-    assertEquals(2, ssm.seqmappings.size());
-    assertTrue(ssm.seqmappings.contains(acf1));
-    assertTrue(ssm.seqmappings.contains(acf2));
+    assertEquals(2, ssm.getSequenceMappings().size());
+    assertTrue(ssm.getSequenceMappings().contains(acf1));
+    assertTrue(ssm.getSequenceMappings().contains(acf2));
 
     /*
      * Re-adding the first mapping does nothing
      */
     ssm.registerMapping(acf1);
-    assertEquals(2, ssm.seqmappings.size());
-    assertTrue(ssm.seqmappings.contains(acf1));
-    assertTrue(ssm.seqmappings.contains(acf2));
+    assertEquals(2, ssm.getSequenceMappings().size());
+    assertTrue(ssm.getSequenceMappings().contains(acf1));
+    assertTrue(ssm.getSequenceMappings().contains(acf2));
   }
 
   @Test(groups = { "Functional" })
@@ -78,10 +78,10 @@ public class StructureSelectionManagerTest
     AlignedCodonFrame acf2 = new AlignedCodonFrame();
     AlignedCodonFrame acf3 = new AlignedCodonFrame();
 
-    Set<AlignedCodonFrame> set1 = new HashSet<AlignedCodonFrame>();
+    List<AlignedCodonFrame> set1 = new ArrayList<AlignedCodonFrame>();
     set1.add(acf1);
     set1.add(acf2);
-    Set<AlignedCodonFrame> set2 = new HashSet<AlignedCodonFrame>();
+    List<AlignedCodonFrame> set2 = new ArrayList<AlignedCodonFrame>();
     set2.add(acf2);
     set2.add(acf3);
 
@@ -93,10 +93,10 @@ public class StructureSelectionManagerTest
     ssm.registerMappings(set2);
     ssm.registerMappings(set2);
 
-    assertEquals(3, ssm.seqmappings.size());
-    assertTrue(ssm.seqmappings.contains(acf1));
-    assertTrue(ssm.seqmappings.contains(acf2));
-    assertTrue(ssm.seqmappings.contains(acf3));
+    assertEquals(3, ssm.getSequenceMappings().size());
+    assertTrue(ssm.getSequenceMappings().contains(acf1));
+    assertTrue(ssm.getSequenceMappings().contains(acf2));
+    assertTrue(ssm.getSequenceMappings().contains(acf3));
   }
 
   /**
@@ -112,7 +112,7 @@ public class StructureSelectionManagerTest
     StructureSelectionManager sm = new StructureSelectionManager();
     sm.setProcessSecondaryStructure(true);
     sm.setAddTempFacAnnot(true);
-    PDBfile pmap = sm.setMapping(true, new SequenceI[] { seq },
+    StructureFile pmap = sm.setMapping(true, new SequenceI[] { seq },
             new String[] { null }, "examples/1gaq.txt", FormatAdapter.FILE);
     assertTrue(pmap != null);
 
diff --git a/test/jalview/util/ArrayUtilsTest.java b/test/jalview/util/ArrayUtilsTest.java
new file mode 100644 (file)
index 0000000..5a2674a
--- /dev/null
@@ -0,0 +1,31 @@
+package jalview.util;
+
+import static org.testng.AssertJUnit.assertEquals;
+
+import java.util.Arrays;
+
+import org.testng.annotations.Test;
+
+public class ArrayUtilsTest
+{
+  @Test(groups="Functional")
+  public void testReverseIntArray() {
+
+    // null value: should be no exception
+    ArrayUtils.reverseIntArray((int[]) null);
+
+    // empty array: should be no exception
+    int[] arr = new int[] {};
+    ArrayUtils.reverseIntArray(arr);
+
+    // even length array
+    arr = new int[] { 1, 2, 3, 4 };
+    ArrayUtils.reverseIntArray(arr);
+    assertEquals("[4, 3, 2, 1]", Arrays.toString(arr));
+
+    // odd length array
+    arr = new int[] { 1, 2, 3, 4, 5 };
+    ArrayUtils.reverseIntArray(arr);
+    assertEquals("[5, 4, 3, 2, 1]", Arrays.toString(arr));
+  }
+}
index 2b12a72..a82b9c0 100644 (file)
@@ -72,4 +72,65 @@ public class ColorUtilsTest
     assertEquals("#800080", ColorUtils.toTkCode(new Color(128, 0, 128))); // purple
     assertEquals("#00ff00", ColorUtils.toTkCode(new Color(0, 255, 0))); // lime
   }
+
+  @Test(groups = { "Functional" })
+  public void testGetGraduatedColour()
+  {
+    Color minColour = new Color(100, 100, 100);
+    Color maxColour = new Color(180, 200, 220);
+
+    /*
+     * value half-way between min and max
+     */
+    Color col = ColorUtils.getGraduatedColour(20f, 10f, minColour, 30f,
+            maxColour);
+    assertEquals(140, col.getRed());
+    assertEquals(150, col.getGreen());
+    assertEquals(160, col.getBlue());
+
+    /*
+     * value two-thirds of the way between min and max
+     */
+    col = ColorUtils
+            .getGraduatedColour(30f, 10f, minColour, 40f, maxColour);
+    assertEquals(153, col.getRed());
+    // Color constructor rounds float value to nearest int
+    assertEquals(167, col.getGreen());
+    assertEquals(180, col.getBlue());
+
+    /*
+     * value = min
+     */
+    col = ColorUtils
+            .getGraduatedColour(10f, 10f, minColour, 30f, maxColour);
+    assertEquals(minColour, col);
+
+    /*
+     * value = max
+     */
+    col = ColorUtils
+            .getGraduatedColour(30f, 10f, minColour, 30f, maxColour);
+    assertEquals(maxColour, col);
+
+    /*
+     * value < min
+     */
+    col = ColorUtils.getGraduatedColour(0f, 10f, minColour, 30f, maxColour);
+    assertEquals(minColour, col);
+
+    /*
+     * value > max
+     */
+    col = ColorUtils
+            .getGraduatedColour(40f, 10f, minColour, 30f,
+            maxColour);
+    assertEquals(maxColour, col);
+
+    /*
+     * min = max
+     */
+    col = ColorUtils
+            .getGraduatedColour(40f, 10f, minColour, 10f, maxColour);
+    assertEquals(minColour, col);
+  }
 }
index 0c2c998..9aab66c 100644 (file)
@@ -49,7 +49,7 @@ public class ComparisonTest
    * AGCTU. Test is not case-sensitive and ignores gaps.
    */
   @Test(groups = { "Functional" })
-  public void testIsNucleotide()
+  public void testIsNucleotide_sequences()
   {
     SequenceI seq = new Sequence("eightypercent", "agctuAGCPV");
     assertFalse(Comparison.isNucleotide(new SequenceI[] { seq }));
@@ -130,6 +130,23 @@ public class ComparisonTest
             0.001f);
   }
 
+  @Test(groups = { "Functional" })
+  public void testIsNucleotide()
+  {
+    assertTrue(Comparison.isNucleotide('a'));
+    assertTrue(Comparison.isNucleotide('A'));
+    assertTrue(Comparison.isNucleotide('c'));
+    assertTrue(Comparison.isNucleotide('C'));
+    assertTrue(Comparison.isNucleotide('g'));
+    assertTrue(Comparison.isNucleotide('G'));
+    assertTrue(Comparison.isNucleotide('t'));
+    assertTrue(Comparison.isNucleotide('T'));
+    assertTrue(Comparison.isNucleotide('u'));
+    assertTrue(Comparison.isNucleotide('U'));
+    assertFalse(Comparison.isNucleotide('-'));
+    assertFalse(Comparison.isNucleotide('P'));
+  }
+
   /**
    * Test the percentage identity calculation for two sequences
    */
@@ -158,4 +175,17 @@ public class ComparisonTest
     assertEquals(87.5f, Comparison.PID(seq1, seq2, 0, length, false, true),
             0.001f);
   }
+
+  @Test(groups = { "Functional" })
+  public void testIsNucleotideSequence()
+  {
+    assertFalse(Comparison.isNucleotideSequence(null, true));
+    assertTrue(Comparison.isNucleotideSequence("", true));
+    assertTrue(Comparison.isNucleotideSequence("aAgGcCtTuU", true));
+    assertTrue(Comparison.isNucleotideSequence("aAgGcCtTuU", false));
+    assertFalse(Comparison.isNucleotideSequence("xAgGcCtTuU", false));
+    assertFalse(Comparison.isNucleotideSequence("aAgGcCtTuUx", false));
+    assertTrue(Comparison.isNucleotideSequence("a A-g.GcCtTuU", true));
+    assertFalse(Comparison.isNucleotideSequence("a A-g.GcCtTuU", false));
+  }
 }
index 7a6dc35..c5e8ef5 100644 (file)
@@ -96,6 +96,7 @@ public class DBRefUtilsTest
     assertEquals("UNIPROT", DBRefUtils.getCanonicalName("UNIPROTKB/TREMBL"));
     assertEquals("UNIPROTKB/SWISS-CHEESE",
             DBRefUtils.getCanonicalName("UNIPROTKB/SWISS-CHEESE"));
+    assertEquals("ENSEMBL", DBRefUtils.getCanonicalName("Ensembl"));
   }
 
   @Test(groups = { "Functional" })
@@ -143,7 +144,7 @@ public class DBRefUtilsTest
     assertEquals("EMBL", ref.getSource());
     assertEquals("1.2", ref.getVersion());
     assertEquals("a7890", ref.getAccessionId());
-    assertNull(seq.getAllPDBEntries());
+    assertTrue(seq.getAllPDBEntries().isEmpty());
   }
 
   /**
@@ -229,4 +230,30 @@ public class DBRefUtilsTest
     assertSame(ref1, matches[0]);
     assertSame(ref2, matches[1]);
   }
+
+  /**
+   * Test the method that searches for matching references based on accession id
+   * only
+   */
+  @Test(groups = { "Functional" })
+  public void testSearchRefs_accessionid()
+  {
+  
+    DBRefEntry ref1 = new DBRefEntry("Uniprot", "1", "A1234"); // matches
+    DBRefEntry ref2 = new DBRefEntry("embl", "1", "A1234"); // matches
+    // constructor does not upper-case accession id
+    DBRefEntry ref3 = new DBRefEntry("EMBL", "1", "a1234"); // no match
+    DBRefEntry ref4 = new DBRefEntry("EMBLCDS", "1", "A1235"); // no match
+    // ref5 matches although it has a mapping - ignored
+    DBRefEntry ref5 = new DBRefEntry("EMBL", "1", "A1234");
+    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]);
+  }
 }
index de3994e..d4ed0ea 100644 (file)
@@ -23,7 +23,9 @@ package jalview.util;
 import static org.testng.AssertJUnit.assertEquals;
 import static org.testng.AssertJUnit.assertFalse;
 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 java.util.ArrayList;
 import java.util.Arrays;
@@ -450,6 +452,36 @@ public class MapListTest
     assertEquals("{[2, 3], [5, 7], [9, 10], [12, 12], [14, 14], [16, 18]}",
             prettyPrint(ml2.getFromRanges()));
     assertEquals("{[1, 1], [3, 4], [6, 6]}", prettyPrint(ml2.getToRanges()));
+
+    /*
+     * reverse direction
+     */
+    codons = new int[] { 9, 6 };
+    protein = new int[] { 100, 91, 80, 79 };
+    ml = new MapList(codons, protein, 3, 1);
+    assertEquals(6, ml.getFromLowest());
+    assertEquals(9, ml.getFromHighest());
+    assertEquals(79, ml.getToLowest());
+    assertEquals(100, ml.getToHighest());
+  }
+
+  /**
+   * Test constructor can merge consecutive ranges
+   */
+  @Test(groups = { "Functional" })
+  public void testConstructor_mergeRanges()
+  {
+    int[] codons = { 2, 3, 3, 7, 9, 10, 12, 12, 14, 14, 16, 17 };
+    int[] protein = { 1, 1, 1, 3, 6, 6 };
+    MapList ml = new MapList(codons, protein, 3, 1);
+    assertEquals(3, ml.getFromRatio());
+    assertEquals(2, ml.getFromLowest());
+    assertEquals(17, ml.getFromHighest());
+    assertEquals(1, ml.getToLowest());
+    assertEquals(6, ml.getToHighest());
+    assertEquals("{[2, 7], [9, 10], [12, 12], [14, 14], [16, 17]}",
+            prettyPrint(ml.getFromRanges()));
+    assertEquals("{[1, 3], [6, 6]}", prettyPrint(ml.getToRanges()));
   }
 
   /**
@@ -503,7 +535,259 @@ public class MapListTest
     MapList ml = new MapList(new int[] { 1, 5, 10, 15, 25, 20 }, new int[] {
         51, 1 }, 1, 3);
     String s = ml.toString();
-    assertEquals("From (1:3) [ [1, 5] [10, 15] [25, 20] ] To [ [51, 1] ]",
+    assertEquals("[ [1, 5] [10, 15] [25, 20] ] 1:3 to [ [51, 1] ]",
             s);
   }
+
+  @Test(groups = { "Functional" })
+  public void testAddMapList()
+  {
+    MapList ml = new MapList(new int[] { 11, 15, 20, 25, 35, 30 },
+            new int[] { 72, 22 }, 1, 3);
+    assertEquals(11, ml.getFromLowest());
+    assertEquals(35, ml.getFromHighest());
+    assertEquals(22, ml.getToLowest());
+    assertEquals(72, ml.getToHighest());
+
+    MapList ml2 = new MapList(new int[] { 2, 4, 37, 40 }, new int[] { 12,
+        17, 78, 83, 88, 96 }, 1, 3);
+    ml.addMapList(ml2);
+    assertEquals(2, ml.getFromLowest());
+    assertEquals(40, ml.getFromHighest());
+    assertEquals(12, ml.getToLowest());
+    assertEquals(96, ml.getToHighest());
+
+    String s = ml.toString();
+    assertEquals(
+            "[ [11, 15] [20, 25] [35, 30] [2, 4] [37, 40] ] 1:3 to [ [72, 22] [12, 17] [78, 83] [88, 96] ]",
+            s);
+  }
+
+  @Test(groups = { "Functional" })
+  public void testAddMapList_contiguous()
+  {
+    MapList ml = new MapList(new int[] { 11, 15 }, new int[] { 72, 58 }, 1,
+            3);
+
+    MapList ml2 = new MapList(new int[] { 15, 16 }, new int[] { 58, 53 },
+            1, 3);
+    ml.addMapList(ml2);
+    assertEquals("[ [11, 16] ] 1:3 to [ [72, 53] ]", ml.toString());
+  }
+
+  @Test(groups = "Functional")
+  public void testAddRange()
+  {
+    int[] range = { 1, 5 };
+    List<int[]> ranges = new ArrayList<int[]>();
+
+    // add to empty list:
+    MapList.addRange(range, ranges);
+    assertEquals(1, ranges.size());
+    assertSame(range, ranges.get(0));
+
+    // extend contiguous (same position):
+    MapList.addRange(new int[] { 5, 10 }, ranges);
+    assertEquals(1, ranges.size());
+    assertEquals(1, ranges.get(0)[0]);
+    assertEquals(10, ranges.get(0)[1]);
+
+    // extend contiguous (next position):
+    MapList.addRange(new int[] { 11, 15 }, ranges);
+    assertEquals(1, ranges.size());
+    assertEquals(1, ranges.get(0)[0]);
+    assertEquals(15, ranges.get(0)[1]);
+
+    // change direction: range is not merged:
+    MapList.addRange(new int[] { 16, 10 }, ranges);
+    assertEquals(2, ranges.size());
+    assertEquals(16, ranges.get(1)[0]);
+    assertEquals(10, ranges.get(1)[1]);
+
+    // extend reverse contiguous (same position):
+    MapList.addRange(new int[] { 10, 8 }, ranges);
+    assertEquals(2, ranges.size());
+    assertEquals(16, ranges.get(1)[0]);
+    assertEquals(8, ranges.get(1)[1]);
+
+    // extend reverse contiguous (next position):
+    MapList.addRange(new int[] { 7, 6 }, ranges);
+    assertEquals(2, ranges.size());
+    assertEquals(16, ranges.get(1)[0]);
+    assertEquals(6, ranges.get(1)[1]);
+
+    // change direction: range is not merged:
+    MapList.addRange(new int[] { 6, 9 }, ranges);
+    assertEquals(3, ranges.size());
+    assertEquals(6, ranges.get(2)[0]);
+    assertEquals(9, ranges.get(2)[1]);
+
+    // not contiguous: not merged
+    MapList.addRange(new int[] { 11, 12 }, ranges);
+    assertEquals(4, ranges.size());
+    assertEquals(11, ranges.get(3)[0]);
+    assertEquals(12, ranges.get(3)[1]);
+  }
+
+  /**
+   * Check state after construction
+   */
+  @Test(groups = { "Functional" })
+  public void testConstructor_withLists()
+  {
+    /*
+     * reverse direction
+     */
+    int[][] codons = new int[][] { { 9, 6 } };
+    int[][] protein = new int[][] { { 100, 91 }, { 80, 79 } };
+    MapList ml = new MapList(Arrays.asList(codons), Arrays.asList(protein),
+            3, 1);
+    assertEquals(6, ml.getFromLowest());
+    assertEquals(9, ml.getFromHighest());
+    assertEquals(79, ml.getToLowest());
+    assertEquals(100, ml.getToHighest());
+  }
+
+  /**
+   * Test that method that inspects for the (first) forward or reverse from
+   * range. Single position ranges are ignored.
+   */
+  @Test(groups = { "Functional" })
+  public void testIsFromForwardStrand()
+  {
+    // [3-9] declares forward strand
+    MapList ml = new MapList(new int[] { 2, 2, 3, 9, 12, 11 },
+            new int[] { 20, 11 }, 1, 1);
+    assertTrue(ml.isFromForwardStrand());
+
+    // [11-5] declares reverse strand ([13-14] is ignored)
+    ml = new MapList(new int[] { 2, 2, 11, 5, 13, 14 },
+            new int[] { 20, 11 }, 1, 1);
+    assertFalse(ml.isFromForwardStrand());
+
+    // all single position ranges - defaults to forward strand
+    ml = new MapList(new int[] { 2, 2, 4, 4, 6, 6 }, new int[] { 3, 1 }, 1,
+            1);
+    assertTrue(ml.isFromForwardStrand());
+  }
+
+  /**
+   * Test the method that merges a list of ranges where possible
+   */
+  @Test(groups = { "Functional" })
+  public void testCoalesceRanges()
+  {
+    assertNull(MapList.coalesceRanges(null));
+    List<int[]> ranges = new ArrayList<int[]>();
+    assertSame(ranges, MapList.coalesceRanges(ranges));
+    ranges.add(new int[] { 1, 3 });
+    assertSame(ranges, MapList.coalesceRanges(ranges));
+
+    // add non-contiguous range:
+    ranges.add(new int[] { 5, 6 });
+    assertSame(ranges, MapList.coalesceRanges(ranges));
+
+    // 'contiguous' range in opposite direction is not merged:
+    ranges.add(new int[] { 7, 6 });
+    assertSame(ranges, MapList.coalesceRanges(ranges));
+
+    // merging in forward direction:
+    ranges.clear();
+    ranges.add(new int[] { 1, 3 });
+    ranges.add(new int[] { 4, 5 });
+    ranges.add(new int[] { 5, 5 });
+    ranges.add(new int[] { 5, 7 });
+    List<int[]> merged = MapList.coalesceRanges(ranges);
+    assertEquals(1, merged.size());
+    assertArrayEquals(new int[] { 1, 7 }, merged.get(0));
+    // verify input list is unchanged
+    assertEquals(4, ranges.size());
+    assertArrayEquals(new int[] { 1, 3 }, ranges.get(0));
+    assertArrayEquals(new int[] { 4, 5 }, ranges.get(1));
+    assertArrayEquals(new int[] { 5, 5 }, ranges.get(2));
+    assertArrayEquals(new int[] { 5, 7 }, ranges.get(3));
+
+    // merging in reverse direction:
+    ranges.clear();
+    ranges.add(new int[] { 7, 5 });
+    ranges.add(new int[] { 5, 4 });
+    ranges.add(new int[] { 4, 4 });
+    ranges.add(new int[] { 3, 1 });
+    merged = MapList.coalesceRanges(ranges);
+    assertEquals(1, merged.size());
+    assertArrayEquals(new int[] { 7, 1 }, merged.get(0));
+
+    // merging with switches of direction:
+    ranges.clear();
+    ranges.add(new int[] { 1, 3 });
+    ranges.add(new int[] { 4, 5 });
+    ranges.add(new int[] { 5, 5 });
+    ranges.add(new int[] { 6, 6 });
+    ranges.add(new int[] { 12, 10 });
+    ranges.add(new int[] { 9, 8 });
+    ranges.add(new int[] { 8, 8 });
+    ranges.add(new int[] { 7, 7 });
+    merged = MapList.coalesceRanges(ranges);
+    assertEquals(2, merged.size());
+    assertArrayEquals(new int[] { 1, 6 }, merged.get(0));
+    assertArrayEquals(new int[] { 12, 7 }, merged.get(1));
+  }
+
+  /**
+   * Test the method that merges a list of ranges where possible
+   */
+  @Test(groups = { "Functional" })
+  public void testCoalesceRanges_withOverlap()
+  {
+    List<int[]> ranges = new ArrayList<int[]>();
+    ranges.add(new int[] { 1, 3 });
+    ranges.add(new int[] { 2, 5 });
+
+    /*
+     * [2, 5] should extend [1, 3]
+     */
+    List<int[]> merged = MapList.coalesceRanges(ranges);
+    assertEquals(1, merged.size());
+    assertArrayEquals(new int[] { 1, 5 }, merged.get(0));
+
+    /*
+     * a subsumed interval should be dropped
+     */
+    ranges.clear();
+    ranges.add(new int[] { 1, 6 });
+    ranges.add(new int[] { 2, 4 });
+    merged = MapList.coalesceRanges(ranges);
+    assertEquals(1, merged.size());
+    assertArrayEquals(new int[] { 1, 6 }, merged.get(0));
+
+    ranges.clear();
+    ranges.add(new int[] { 1, 5 });
+    ranges.add(new int[] { 1, 6 });
+    merged = MapList.coalesceRanges(ranges);
+    assertEquals(1, merged.size());
+    assertArrayEquals(new int[] { 1, 6 }, merged.get(0));
+
+    /*
+     * merge duplicate ranges
+     */
+    ranges.clear();
+    ranges.add(new int[] { 1, 3 });
+    ranges.add(new int[] { 1, 3 });
+    merged = MapList.coalesceRanges(ranges);
+    assertEquals(1, merged.size());
+    assertArrayEquals(new int[] { 1, 3 }, merged.get(0));
+
+    /*
+     * reverse direction
+     */
+    ranges.clear();
+    ranges.add(new int[] { 9, 5 });
+    ranges.add(new int[] { 9, 4 });
+    ranges.add(new int[] { 8, 3 });
+    ranges.add(new int[] { 3, 2 });
+    ranges.add(new int[] { 1, 0 });
+    merged = MapList.coalesceRanges(ranges);
+    assertEquals(1, merged.size());
+    assertArrayEquals(new int[] { 9, 0 }, merged.get(0));
+  }
 }
index 51c99af..3c417c3 100644 (file)
@@ -21,6 +21,7 @@
 package jalview.util;
 
 import static org.testng.AssertJUnit.assertEquals;
+import static org.testng.AssertJUnit.assertFalse;
 import static org.testng.AssertJUnit.assertSame;
 import static org.testng.AssertJUnit.assertTrue;
 
@@ -43,12 +44,9 @@ import jalview.io.FormatAdapter;
 
 import java.awt.Color;
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.LinkedHashSet;
 import java.util.List;
-import java.util.Set;
 
 import org.testng.annotations.Test;
 
@@ -77,7 +75,8 @@ public class MappingUtilsTest
     MapList map = new MapList(new int[] { 5, 10 }, new int[] { 12, 13 }, 3,
             1);
     acf.addMap(seq1.getDatasetSequence(), aseq1.getDatasetSequence(), map);
-    Set<AlignedCodonFrame> acfList = Collections.singleton(acf);
+    List<AlignedCodonFrame> acfList = Arrays.asList(new AlignedCodonFrame[]
+    { acf });
 
     /*
      * Check protein residue 12 maps to codon 5-7, 13 to codon 8-10
@@ -129,7 +128,8 @@ public class MappingUtilsTest
     MapList map = new MapList(new int[] { 6, 6, 8, 9, 11, 11, 13, 13, 15,
         15 }, new int[] { 8, 9 }, 3, 1);
     acf.addMap(seq1.getDatasetSequence(), aseq1.getDatasetSequence(), map);
-    Set<AlignedCodonFrame> acfList = Collections.singleton(acf);
+    List<AlignedCodonFrame> acfList = Arrays.asList(new AlignedCodonFrame[]
+    { acf });
 
     /*
      * Check protein residue 8 maps to [6, 8, 9]
@@ -209,7 +209,8 @@ public class MappingUtilsTest
       acf.addMap(cdna.getSequenceAt(seq).getDatasetSequence(), protein
               .getSequenceAt(seq).getDatasetSequence(), map);
     }
-    Set<AlignedCodonFrame> acfList = Collections.singleton(acf);
+    List<AlignedCodonFrame> acfList = Arrays.asList(new AlignedCodonFrame[]
+    { acf });
 
     AlignViewportI dnaView = new AlignViewport(cdna);
     AlignViewportI proteinView = new AlignViewport(protein);
@@ -343,8 +344,10 @@ public class MappingUtilsTest
   protected void setupMappedAlignments() throws IOException
   {
     /*
-     * Set up dna and protein Seq1/2/3 with mappings (held on the protein
-     * viewport). Lower case for introns.
+     * Map (upper-case = coding):
+     * Seq1/10-18 AC-GctGtC-T to Seq1/40 -K-P
+     * Seq2/20-27 Tc-GA-G-T-T to Seq2/20-27 L--Q
+     * Seq3/30-38 TtTT-AaCGg- to Seq3/60-61\nG--S
      */
     AlignmentI cdna = loadAlignment(">Seq1/10-18\nAC-GctGtC-T\n"
             + ">Seq2/20-27\nTc-GA-G-T-Tc\n" + ">Seq3/30-38\nTtTT-AaCGg-\n",
@@ -373,7 +376,8 @@ public class MappingUtilsTest
         61 }, 3, 1);
     acf.addMap(cdna.getSequenceAt(2).getDatasetSequence(), protein
             .getSequenceAt(2).getDatasetSequence(), map);
-    Set<AlignedCodonFrame> acfList = Collections.singleton(acf);
+    List<AlignedCodonFrame> acfList = Arrays.asList(new AlignedCodonFrame[]
+    { acf });
 
     dnaView = new AlignViewport(cdna);
     proteinView = new AlignViewport(protein);
@@ -442,7 +446,7 @@ public class MappingUtilsTest
             "[1, 2, 3, 4, 7, 8, 9, 12]",
             Arrays.toString(MappingUtils.flattenRanges(new int[] { 1, 4, 7,
                 9, 12, 12 })));
-    // unpaired start position is ignored:
+    // trailing unpaired start position is ignored:
     assertEquals(
             "[1, 2, 3, 4, 7, 8, 9, 12]",
             Arrays.toString(MappingUtils.flattenRanges(new int[] { 1, 4, 7,
@@ -474,7 +478,8 @@ public class MappingUtilsTest
       acf.addMap(cdna.getSequenceAt(seq).getDatasetSequence(), protein
               .getSequenceAt(seq).getDatasetSequence(), map);
     }
-    Set<AlignedCodonFrame> acfList = Collections.singleton(acf);
+    List<AlignedCodonFrame> acfList = Arrays.asList(new AlignedCodonFrame[]
+    { acf });
 
     AlignViewportI dnaView = new AlignViewport(cdna);
     AlignViewportI proteinView = new AlignViewport(protein);
@@ -556,7 +561,8 @@ public class MappingUtilsTest
       acf.addMap(cdna.getSequenceAt(seq).getDatasetSequence(), protein
               .getSequenceAt(seq).getDatasetSequence(), map);
     }
-    Set<AlignedCodonFrame> acfList = Collections.singleton(acf);
+    List<AlignedCodonFrame> acfList = Arrays.asList(new AlignedCodonFrame[]
+    { acf });
 
     AlignViewportI dnaView = new AlignViewport(cdna);
     AlignViewportI proteinView = new AlignViewport(protein);
@@ -651,7 +657,7 @@ public class MappingUtilsTest
     AlignedCodonFrame acf3 = new AlignedCodonFrame();
     acf3.addMap(seq3.getDatasetSequence(), seq1.getDatasetSequence(), map);
 
-    Set<AlignedCodonFrame> mappings = new HashSet<AlignedCodonFrame>();
+    List<AlignedCodonFrame> mappings = new ArrayList<AlignedCodonFrame>();
     mappings.add(acf1);
     mappings.add(acf2);
     mappings.add(acf3);
@@ -707,7 +713,7 @@ public class MappingUtilsTest
     AlignedCodonFrame acf = new AlignedCodonFrame();
     MapList map = new MapList(new int[] { 8, 16 }, new int[] { 5, 7 }, 3, 1);
     acf.addMap(dna.getDatasetSequence(), protein.getDatasetSequence(), map);
-    Set<AlignedCodonFrame> mappings = new LinkedHashSet<AlignedCodonFrame>();
+    List<AlignedCodonFrame> mappings = new ArrayList<AlignedCodonFrame>();
     mappings.add(acf);
 
     AlignmentI prot = new Alignment(new SequenceI[] { protein });
@@ -738,6 +744,45 @@ public class MappingUtilsTest
   }
 
   /**
+   * Tests for the method that converts a series of [start, end] ranges to
+   * single positions, where the mapping is to a reverse strand i.e. start is
+   * greater than end point mapped to
+   */
+  @Test(groups = { "Functional" })
+  public void testFlattenRanges_reverseStrand()
+  {
+    assertEquals("[4, 3, 2, 1]",
+            Arrays.toString(MappingUtils.flattenRanges(new int[] { 4, 1 })));
+    assertEquals(
+            "[4, 3, 2, 1]",
+            Arrays.toString(MappingUtils.flattenRanges(new int[] { 4, 3, 2,
+                1 })));
+    assertEquals(
+            "[4, 3, 2, 1]",
+            Arrays.toString(MappingUtils.flattenRanges(new int[] { 4, 4, 3,
+                3, 2, 2, 1, 1 })));
+    assertEquals(
+            "[12, 9, 8, 7, 4, 3, 2, 1]",
+            Arrays.toString(MappingUtils.flattenRanges(new int[] { 12, 12,
+                9, 7, 4, 1 })));
+    // forwards and backwards anyone?
+    assertEquals(
+            "[4, 5, 6, 3, 2, 1]",
+            Arrays.toString(MappingUtils.flattenRanges(new int[] { 4, 6, 3,
+                1 })));
+    // backwards and forwards
+    assertEquals(
+            "[3, 2, 1, 4, 5, 6]",
+            Arrays.toString(MappingUtils.flattenRanges(new int[] { 3, 1, 4,
+                6 })));
+    // trailing unpaired start position is ignored:
+    assertEquals(
+            "[12, 9, 8, 7, 4, 3, 2]",
+            Arrays.toString(MappingUtils.flattenRanges(new int[] { 12, 12,
+                9, 7, 4, 2, 1 })));
+  }
+
+  /**
    * Test mapping a column selection including hidden columns
    * 
    * @throws IOException
@@ -747,64 +792,238 @@ public class MappingUtilsTest
   {
     setupMappedAlignments();
   
-    ColumnSelection colsel = new ColumnSelection();
+    ColumnSelection proteinSelection = new ColumnSelection();
 
     /*
      * Column 0 in protein picks up Seq2/L, Seq3/G which map to cols 0-4 and 0-3
      * in dna respectively, overall 0-4
      */
-    colsel.hideColumns(0);
-    ColumnSelection cs = MappingUtils.mapColumnSelection(colsel,
+    proteinSelection.hideColumns(0);
+    ColumnSelection dnaSelection = MappingUtils.mapColumnSelection(proteinSelection,
             proteinView, dnaView);
-    assertEquals("[]", cs.getSelected().toString());
-    List<int[]> hidden = cs.getHiddenColumns();
+    assertEquals("[]", dnaSelection.getSelected().toString());
+    List<int[]> hidden = dnaSelection.getHiddenColumns();
     assertEquals(1, hidden.size());
     assertEquals("[0, 4]", Arrays.toString(hidden.get(0)));
 
     /*
      * Column 1 in protein picks up Seq1/K which maps to cols 0-3 in dna
      */
-    colsel.revealAllHiddenColumns();
-    colsel.hideColumns(1);
-    cs = MappingUtils.mapColumnSelection(colsel, proteinView, dnaView);
-    hidden = cs.getHiddenColumns();
+    proteinSelection.revealAllHiddenColumns();
+    // the unhidden columns are now marked selected!
+    assertEquals("[0]", proteinSelection.getSelected().toString());
+    // deselect these or hideColumns will be expanded to include 0
+    proteinSelection.clear();
+    proteinSelection.hideColumns(1);
+    dnaSelection = MappingUtils.mapColumnSelection(proteinSelection, proteinView, dnaView);
+    hidden = dnaSelection.getHiddenColumns();
     assertEquals(1, hidden.size());
     assertEquals("[0, 3]", Arrays.toString(hidden.get(0)));
 
     /*
      * Column 2 in protein picks up gaps only - no mapping
      */
-    colsel.revealAllHiddenColumns();
-    colsel.clear();
-    colsel.hideColumns(2);
-    cs = MappingUtils.mapColumnSelection(colsel, proteinView, dnaView);
-    assertTrue(cs.getHiddenColumns().isEmpty());
+    proteinSelection.revealAllHiddenColumns();
+    proteinSelection.clear();
+    proteinSelection.hideColumns(2);
+    dnaSelection = MappingUtils.mapColumnSelection(proteinSelection, proteinView, dnaView);
+    assertTrue(dnaSelection.getHiddenColumns().isEmpty());
 
     /*
      * Column 3 in protein picks up Seq1/P, Seq2/Q, Seq3/S which map to columns
      * 6-9, 6-10, 5-8 respectively, overall to 5-10
      */
-    colsel.revealAllHiddenColumns();
-    colsel.clear();
-    colsel.hideColumns(3); // 5-10 hidden in dna
-    colsel.addElement(1); // 0-3 selected in dna
-    cs = MappingUtils.mapColumnSelection(colsel, proteinView, dnaView);
-    assertEquals("[0, 1, 2, 3]", cs.getSelected().toString());
-    hidden = cs.getHiddenColumns();
+    proteinSelection.revealAllHiddenColumns();
+    proteinSelection.clear();
+    proteinSelection.hideColumns(3); // 5-10 hidden in dna
+    proteinSelection.addElement(1); // 0-3 selected in dna
+    dnaSelection = MappingUtils.mapColumnSelection(proteinSelection, proteinView, dnaView);
+    assertEquals("[0, 1, 2, 3]", dnaSelection.getSelected().toString());
+    hidden = dnaSelection.getHiddenColumns();
     assertEquals(1, hidden.size());
     assertEquals("[5, 10]", Arrays.toString(hidden.get(0)));
 
     /*
      * Combine hiding columns 1 and 3 to get discontiguous hidden columns
      */
-    colsel.revealAllHiddenColumns();
-    colsel.clear();
-    colsel.hideColumns(1);
-    colsel.hideColumns(3);
-    cs = MappingUtils.mapColumnSelection(colsel, proteinView, dnaView);
-    hidden = cs.getHiddenColumns();
+    proteinSelection.revealAllHiddenColumns();
+    proteinSelection.clear();
+    proteinSelection.hideColumns(1);
+    proteinSelection.hideColumns(3);
+    dnaSelection = MappingUtils.mapColumnSelection(proteinSelection, proteinView, dnaView);
+    hidden = dnaSelection.getHiddenColumns();
     assertEquals(2, hidden.size());
     assertEquals("[0, 3]", Arrays.toString(hidden.get(0)));
     assertEquals("[5, 10]", Arrays.toString(hidden.get(1)));
   }
+
+  @Test(groups = { "Functional" })
+  public void testGetLength()
+  {
+    assertEquals(0, MappingUtils.getLength(null));
+
+    /*
+     * [start, end] ranges
+     */
+    List<int[]> ranges = new ArrayList<int[]>();
+    assertEquals(0, MappingUtils.getLength(ranges));
+    ranges.add(new int[] { 1, 1 });
+    assertEquals(1, MappingUtils.getLength(ranges));
+    ranges.add(new int[] { 2, 10 });
+    assertEquals(10, MappingUtils.getLength(ranges));
+    ranges.add(new int[] { 20, 10 });
+    assertEquals(21, MappingUtils.getLength(ranges));
+
+    /*
+     * [start, end, start, end...] ranges
+     */
+    ranges.clear();
+    ranges.add(new int[] { 1, 5, 8, 4 });
+    ranges.add(new int[] { 8, 2 });
+    ranges.add(new int[] { 12, 12 });
+    assertEquals(18, MappingUtils.getLength(ranges));
+  }
+
+  @Test(groups = { "Functional" })
+  public void testContains()
+  {
+    assertFalse(MappingUtils.contains(null, 1));
+    List<int[]> ranges = new ArrayList<int[]>();
+    assertFalse(MappingUtils.contains(ranges, 1));
+
+    ranges.add(new int[] { 1, 4 });
+    ranges.add(new int[] { 6, 6 });
+    ranges.add(new int[] { 8, 10 });
+    ranges.add(new int[] { 30, 20 });
+    ranges.add(new int[] { -16, -44 });
+
+    assertFalse(MappingUtils.contains(ranges, 0));
+    assertTrue(MappingUtils.contains(ranges, 1));
+    assertTrue(MappingUtils.contains(ranges, 2));
+    assertTrue(MappingUtils.contains(ranges, 3));
+    assertTrue(MappingUtils.contains(ranges, 4));
+    assertFalse(MappingUtils.contains(ranges, 5));
+
+    assertTrue(MappingUtils.contains(ranges, 6));
+    assertFalse(MappingUtils.contains(ranges, 7));
+
+    assertTrue(MappingUtils.contains(ranges, 8));
+    assertTrue(MappingUtils.contains(ranges, 9));
+    assertTrue(MappingUtils.contains(ranges, 10));
+
+    assertFalse(MappingUtils.contains(ranges, 31));
+    assertTrue(MappingUtils.contains(ranges, 30));
+    assertTrue(MappingUtils.contains(ranges, 29));
+    assertTrue(MappingUtils.contains(ranges, 20));
+    assertFalse(MappingUtils.contains(ranges, 19));
+
+    assertFalse(MappingUtils.contains(ranges, -15));
+    assertTrue(MappingUtils.contains(ranges, -16));
+    assertTrue(MappingUtils.contains(ranges, -44));
+    assertFalse(MappingUtils.contains(ranges, -45));
+  }
+
+  /**
+   * Test the method that drops positions from the start of a mapped range
+   */
+  @Test(groups = "Functional")
+  public void testRemoveStartPositions()
+  {
+    int[] ranges = new int[] { 1, 10 };
+    int[] adjusted = MappingUtils.removeStartPositions(0, ranges);
+    assertEquals("[1, 10]", Arrays.toString(adjusted));
+
+    adjusted = MappingUtils.removeStartPositions(1, ranges);
+    assertEquals("[2, 10]", Arrays.toString(adjusted));
+    assertEquals("[1, 10]", Arrays.toString(ranges));
+
+    ranges = adjusted;
+    adjusted = MappingUtils.removeStartPositions(1, ranges);
+    assertEquals("[3, 10]", Arrays.toString(adjusted));
+    assertEquals("[2, 10]", Arrays.toString(ranges));
+
+    ranges = new int[] { 2, 3, 10, 12 };
+    adjusted = MappingUtils.removeStartPositions(1, ranges);
+    assertEquals("[3, 3, 10, 12]", Arrays.toString(adjusted));
+    assertEquals("[2, 3, 10, 12]", Arrays.toString(ranges));
+
+    ranges = new int[] { 2, 2, 8, 12 };
+    adjusted = MappingUtils.removeStartPositions(1, ranges);
+    assertEquals("[8, 12]", Arrays.toString(adjusted));
+    assertEquals("[2, 2, 8, 12]", Arrays.toString(ranges));
+
+    ranges = new int[] { 2, 2, 8, 12 };
+    adjusted = MappingUtils.removeStartPositions(2, ranges);
+    assertEquals("[9, 12]", Arrays.toString(adjusted));
+    assertEquals("[2, 2, 8, 12]", Arrays.toString(ranges));
+
+    ranges = new int[] { 2, 2, 4, 4, 9, 12 };
+    adjusted = MappingUtils.removeStartPositions(1, ranges);
+    assertEquals("[4, 4, 9, 12]", Arrays.toString(adjusted));
+    assertEquals("[2, 2, 4, 4, 9, 12]", Arrays.toString(ranges));
+
+    ranges = new int[] { 2, 2, 4, 4, 9, 12 };
+    adjusted = MappingUtils.removeStartPositions(2, ranges);
+    assertEquals("[9, 12]", Arrays.toString(adjusted));
+    assertEquals("[2, 2, 4, 4, 9, 12]", Arrays.toString(ranges));
+
+    ranges = new int[] { 2, 3, 9, 12 };
+    adjusted = MappingUtils.removeStartPositions(3, ranges);
+    assertEquals("[10, 12]", Arrays.toString(adjusted));
+    assertEquals("[2, 3, 9, 12]", Arrays.toString(ranges));
+  }
+
+  /**
+   * Test the method that drops positions from the start of a mapped range, on
+   * the reverse strand
+   */
+  @Test(groups = "Functional")
+  public void testRemoveStartPositions_reverseStrand()
+  {
+    int[] ranges = new int[] { 10, 1 };
+    int[] adjusted = MappingUtils.removeStartPositions(0, ranges);
+    assertEquals("[10, 1]", Arrays.toString(adjusted));
+    assertEquals("[10, 1]", Arrays.toString(ranges));
+  
+    ranges = adjusted;
+    adjusted = MappingUtils.removeStartPositions(1, ranges);
+    assertEquals("[9, 1]", Arrays.toString(adjusted));
+    assertEquals("[10, 1]", Arrays.toString(ranges));
+  
+    ranges = adjusted;
+    adjusted = MappingUtils.removeStartPositions(1, ranges);
+    assertEquals("[8, 1]", Arrays.toString(adjusted));
+    assertEquals("[9, 1]", Arrays.toString(ranges));
+  
+    ranges = new int[] { 12, 11, 9, 6 };
+    adjusted = MappingUtils.removeStartPositions(1, ranges);
+    assertEquals("[11, 11, 9, 6]", Arrays.toString(adjusted));
+    assertEquals("[12, 11, 9, 6]", Arrays.toString(ranges));
+  
+    ranges = new int[] { 12, 12, 8, 4 };
+    adjusted = MappingUtils.removeStartPositions(1, ranges);
+    assertEquals("[8, 4]", Arrays.toString(adjusted));
+    assertEquals("[12, 12, 8, 4]", Arrays.toString(ranges));
+  
+    ranges = new int[] { 12, 12, 8, 4 };
+    adjusted = MappingUtils.removeStartPositions(2, ranges);
+    assertEquals("[7, 4]", Arrays.toString(adjusted));
+    assertEquals("[12, 12, 8, 4]", Arrays.toString(ranges));
+  
+    ranges = new int[] { 12, 12, 10, 10, 8, 4 };
+    adjusted = MappingUtils.removeStartPositions(1, ranges);
+    assertEquals("[10, 10, 8, 4]", Arrays.toString(adjusted));
+    assertEquals("[12, 12, 10, 10, 8, 4]", Arrays.toString(ranges));
+  
+    ranges = new int[] { 12, 12, 10, 10, 8, 4 };
+    adjusted = MappingUtils.removeStartPositions(2, ranges);
+    assertEquals("[8, 4]", Arrays.toString(adjusted));
+    assertEquals("[12, 12, 10, 10, 8, 4]", Arrays.toString(ranges));
+  
+    ranges = new int[] { 12, 11, 8, 4 };
+    adjusted = MappingUtils.removeStartPositions(3, ranges);
+    assertEquals("[7, 4]", Arrays.toString(adjusted));
+    assertEquals("[12, 11, 8, 4]", Arrays.toString(ranges));
+  }
+
 }
index 2342afe..dc2555b 100644 (file)
@@ -24,7 +24,9 @@ import static org.testng.AssertJUnit.assertEquals;
 import static org.testng.AssertJUnit.assertNull;
 import static org.testng.AssertJUnit.assertTrue;
 
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.List;
 
 import org.testng.annotations.Test;
 
@@ -128,4 +130,39 @@ public class StringUtilsTest
     assertEquals("a*b*c*cde", StringUtils.arrayToSeparatorList(new String[]
     { "a", "b*c", "cde" }, "*"));
   }
+
+  @Test(groups = { "Functional" })
+  public void testListToDelimitedString()
+  {
+    assertEquals("", StringUtils.listToDelimitedString(null, ";"));
+    List<String> list = new ArrayList<String>();
+    assertEquals("", StringUtils.listToDelimitedString(list, ";"));
+    list.add("now");
+    assertEquals("now", StringUtils.listToDelimitedString(list, ";"));
+    list.add("is");
+    assertEquals("now;is", StringUtils.listToDelimitedString(list, ";"));
+    assertEquals("now ; is", StringUtils.listToDelimitedString(list, " ; "));
+    list.add("the");
+    list.add("winter");
+    list.add("of");
+    list.add("our");
+    list.add("discontent");
+    assertEquals("now is the winter of our discontent",
+            StringUtils.listToDelimitedString(list, " "));
+  }
+
+  @Test(groups = { "Functional" })
+  public void testParseInt()
+  {
+    assertEquals(0, StringUtils.parseInt(null));
+    assertEquals(0, StringUtils.parseInt(""));
+    assertEquals(0, StringUtils.parseInt("x"));
+    assertEquals(0, StringUtils.parseInt("1.2"));
+    assertEquals(33, StringUtils.parseInt("33"));
+    assertEquals(33, StringUtils.parseInt("+33"));
+    assertEquals(-123, StringUtils.parseInt("-123"));
+    // too big for an int:
+    assertEquals(0,
+            StringUtils.parseInt(String.valueOf(Integer.MAX_VALUE) + "1"));
+  }
 }
diff --git a/test/jalview/ws/SequenceFetcherTest.java b/test/jalview/ws/SequenceFetcherTest.java
new file mode 100644 (file)
index 0000000..a54ce8b
--- /dev/null
@@ -0,0 +1,233 @@
+package jalview.ws;
+
+import jalview.datamodel.Alignment;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.DBRefSource;
+import jalview.datamodel.SequenceI;
+import jalview.ws.seqfetcher.ASequenceFetcher;
+import jalview.ws.seqfetcher.DbSourceProxy;
+
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Vector;
+
+public class SequenceFetcherTest
+{
+
+  /**
+   * simple run method to test dbsources.
+   * 
+   * @param argv
+   */
+  public static void main(String[] argv)
+  {
+    // TODO: extracted from SequenceFetcher - convert to proper unit test with
+    // assertions
+
+    AlignmentI ds = null;
+    Vector<Object[]> noProds = new Vector<Object[]>();
+    String usage = "SequenceFetcher.main [-nodas] [<DBNAME> [<ACCNO>]]\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"
+            + "If given two arguments, SequenceFetcher will try to find the DbFetcher corresponding to <DBNAME> and retrieve <ACCNO> from it.\n"
+            + "The -nodas option will exclude DAS sources from the database fetchers Jalview will try to use.";
+    boolean withDas = true;
+    if (argv != null && argv.length > 0
+            && argv[0].toLowerCase().startsWith("-nodas"))
+    {
+      withDas = false;
+      String targs[] = new String[argv.length - 1];
+      System.arraycopy(argv, 1, targs, 0, targs.length);
+      argv = targs;
+    }
+    if (argv != null && argv.length > 0)
+    {
+      List<DbSourceProxy> sps = new SequenceFetcher(withDas)
+              .getSourceProxy(argv[0]);
+  
+      if (sps != null)
+      {
+        for (DbSourceProxy sp : sps)
+        {
+          AlignmentI al = null;
+          try
+          {
+            al = sp.getSequenceRecords(argv.length > 1 ? argv[1] : sp
+                    .getTestQuery());
+          } catch (Exception e)
+          {
+            e.printStackTrace();
+            System.err.println("Error when retrieving "
+                    + (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;
+      }
+      else
+      {
+        System.err.println("Can't resolve " + argv[0]
+                + " as a database name. Allowed values are :\n"
+                + new SequenceFetcher().getSupportedDb());
+      }
+      System.out.println(usage);
+      return;
+    }
+    ASequenceFetcher sfetcher = new SequenceFetcher(withDas);
+    String[] dbSources = sfetcher.getSupportedDb();
+    for (int dbsource = 0; dbsource < dbSources.length; dbsource++)
+    {
+      String db = dbSources[dbsource];
+      // skip me
+      if (db.equals(DBRefSource.PDB))
+      {
+        continue;
+      }
+      for (DbSourceProxy sp : sfetcher.getSourceProxy(db))
+      {
+        System.out.println("Source: " + sp.getDbName() + " (" + db
+                + "): retrieving test:" + sp.getTestQuery());
+        AlignmentI al = null;
+        try
+        {
+          al = sp.getSequenceRecords(sp.getTestQuery());
+          if (al != null && al.getHeight() > 0)
+          {
+            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 (int t = 0; t < types.length; t++)
+              {
+                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++)
+                  {
+                    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.");
+          }
+        }
+        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.flush();
+        System.err.flush();
+  
+      }
+      if (noProds.size() > 0)
+      {
+        Enumeration<Object[]> 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 = 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++)
+            {
+              System.out.println("Prod " + p + ": "
+                      + prod[p].getDisplayId(true));
+            }
+          }
+        }
+  
+      }
+  
+    }
+  }
+
+}
index 7e387bd..72e599d 100644 (file)
@@ -89,19 +89,19 @@ public class UniprotTest
     assertEquals("signal peptide", sf.getType());
     assertNull(sf.getDescription());
     assertNull(sf.getStatus());
-    assertEquals(1, sf.getPosition()); // wrong - Castor bug??
+    assertEquals(1, sf.getPosition());
     assertEquals(1, sf.getBegin());
     assertEquals(18, sf.getEnd());
     sf = features.get(1);
     assertEquals("propeptide", sf.getType());
     assertEquals("Activation peptide", sf.getDescription());
-    assertEquals(19, sf.getPosition()); // wrong - Castor bug??
+    assertEquals(19, sf.getPosition());
     assertEquals(19, sf.getBegin());
     assertEquals(20, sf.getEnd());
     sf = features.get(2);
     assertEquals("chain", sf.getType());
     assertEquals("Granzyme B", sf.getDescription());
-    assertEquals(21, sf.getPosition()); // wrong - Castor bug??
+    assertEquals(21, sf.getPosition());
     assertEquals(21, sf.getBegin());
     assertEquals(247, sf.getEnd());
 
@@ -125,22 +125,35 @@ public class UniprotTest
   }
 
   /**
-   * Test the method that formats the sequence name in Fasta style
+   * Test the method that formats the sequence id
    */
   @Test(groups = { "Functional" })
-  public void testConstructSequenceFastaHeader()
+  public void testGetUniprotEntryId()
   {
-    Uniprot u = new Uniprot();
-    Reader reader = new StringReader(UNIPROT_XML);
-    Vector<UniprotEntry> entries = u.getUniprotEntries(reader);
-    UniprotEntry entry = entries.get(0);
-
-    // source + accession ids + names
-    String expectedName = "UniProt/Swiss-Prot|A9CKP4|A9CKP5|A9CKP4_AGRT5|A9CKP4_AGRT6";
-    // protein names
-    String expectedDescription = "Mitogen-activated protein kinase 13 Henry ";
+    UniprotEntry entry = new Uniprot().getUniprotEntries(
+            new StringReader(UNIPROT_XML)).get(0);
 
+    /*
+     * name formatted as source | accession ids | names
+     * source database converted to Jalview canonical name
+     */
+    String expectedName = "UNIPROT|A9CKP4|A9CKP5|A9CKP4_AGRT5|A9CKP4_AGRT6";
     assertEquals(expectedName, Uniprot.getUniprotEntryId(entry));
+  }
+
+  /**
+   * Test the method that formats the sequence description
+   */
+  @Test(groups = { "Functional" })
+  public void testGetUniprotEntryDescription()
+  {
+    UniprotEntry entry = new Uniprot().getUniprotEntries(
+            new StringReader(UNIPROT_XML)).get(0);
+  
+    /*
+     * recommended names concatenated with space separator
+     */
+    String expectedDescription = "Mitogen-activated protein kinase 13 Henry";
     assertEquals(expectedDescription,
             Uniprot.getUniprotEntryDescription(entry));
   }
diff --git a/test/jalview/ws/dbsources/XfamFetcherTest.java b/test/jalview/ws/dbsources/XfamFetcherTest.java
new file mode 100644 (file)
index 0000000..c894fd1
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ * 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 <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
+package jalview.ws.dbsources;
+
+import jalview.datamodel.AlignmentI;
+
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+public class XfamFetcherTest
+{
+  @Test(groups = { "External" })
+  public void testRfamSeed() throws Exception
+  {
+    // RfamFull rff = new RfamFull();
+    RfamSeed rfs = new RfamSeed();
+
+    AlignmentI seedrf = rfs.getSequenceRecords(rfs.getTestQuery());
+    Assert.assertNotNull(seedrf, "Seed Alignment for " + rfs.getTestQuery()
+            + " didn't retrieve.");
+    Assert.assertTrue(seedrf.getHeight() > 1,
+            "Seed Alignment for " + rfs.getTestQuery()
+                    + " didn't contain more than one sequence.");
+  }
+
+  @Test(groups = { "External" })
+  public void testPfamFullAndSeed() throws Exception
+  {
+    PfamFull pff = new PfamFull();
+    PfamSeed pfseed = new PfamSeed();
+
+    AlignmentI fullpf = pff.getSequenceRecords(pff.getTestQuery());
+    Assert.assertNotNull(fullpf, "Full Alignment for " + pff.getTestQuery()
+            + " didn't retrieve.");
+    Assert.assertTrue(fullpf.getHeight() > 1,
+            "Full Alignment for " + pff.getTestQuery()
+                    + " didn't have more than one sequence.");
+    AlignmentI seedpf = pfseed.getSequenceRecords(pff.getTestQuery());
+    Assert.assertNotNull(seedpf, "Seed Alignment for " + pff.getTestQuery()
+            + " didn't retrieve.");
+
+    Assert.assertTrue(seedpf.getHeight() < fullpf.getHeight(),
+            "Expected Full alignment to have more sequences than seed for "
+                    + pff.getTestQuery());
+  }
+}
index 64840c2..557ef7e 100644 (file)
@@ -40,7 +40,7 @@ import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
-@Test(groups = { "Network" })
+@Test(groups = { "External" })
 public class DisorderAnnotExportImport
 {
   public static String testseqs = "examples/uniref50.fa";
index 5426fce..46feebc 100644 (file)
  */
 package jalview.ws.jabaws;
 
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
 import jalview.ws.jws2.Jws2Discoverer;
 
 import java.util.Vector;
 
+import org.testng.Assert;
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
@@ -54,7 +52,7 @@ public class JalviewJabawsTestUtils
   @Test(groups = { "Functional" }, enabled = false)
   public void testAnnotExport()
   {
-    fail("Not yet implemented");
+    Assert.fail("Not yet implemented");
   }
 
   public static jalview.ws.jws2.Jws2Discoverer getJabawsDiscoverer()
@@ -85,10 +83,11 @@ public class JalviewJabawsTestUtils
     } catch (Exception e)
     {
       e.printStackTrace();
-      fail("Aborting. Problem discovering services. Tried " + svcurls);
+      Assert.fail("Aborting. Problem discovering services. Tried "
+              + svcurls);
     }
-    assertTrue("Failed to discover any services at ", disc.getServices()
-            .size() > 0);
+    Assert.assertTrue(disc.getServices().size() > 0,
+            "Failed to discover any services at ");
     return disc;
   }
 
index 902498b..63b1b9c 100644 (file)
@@ -33,6 +33,8 @@ import jalview.datamodel.SequenceFeature;
 import jalview.datamodel.SequenceI;
 import jalview.util.DBRefUtils;
 import jalview.ws.SequenceFetcher;
+import jalview.ws.dbsources.Pdb;
+import jalview.ws.dbsources.Uniprot;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -67,7 +69,7 @@ public class DbRefFetcherTest
 
   /**
    * Tests that standard protein database sources include Uniprot (as the first)
-   * and also PDB. (Additional sources are dependent on available of DAS
+   * and also PDB. (Additional sources are dependent on availability of DAS
    * services.)
    */
   @Test(groups = { "Functional" })
@@ -75,30 +77,31 @@ public class DbRefFetcherTest
   {
     String[] defdb = DBRefSource.PROTEINDBS;
     List<DbSourceProxy> srces = new ArrayList<DbSourceProxy>();
+    SequenceFetcher sfetcher = new SequenceFetcher();
+    boolean pdbFound = false;
+
     for (String ddb : defdb)
     {
-      SequenceFetcher sfetcher = new SequenceFetcher();
       List<DbSourceProxy> srcesfordb = sfetcher.getSourceProxy(ddb);
 
       if (srcesfordb != null)
       {
+        // TODO is this right? get duplicate entries
         srces.addAll(srcesfordb);
       }
     }
 
     int i = 0;
     int uniprotPos = -1;
-    int pdbPos = -1;
-    // append the selected sequence sources to the default dbs
     for (DbSourceProxy s : srces)
     {
-      if (s instanceof jalview.ws.dbsources.Uniprot)
+      if (s instanceof Uniprot && uniprotPos == -1)
       {
         uniprotPos = i;
       }
-      if (s instanceof jalview.ws.dbsources.Pdb)
+      if (s instanceof Pdb)
       {
-        pdbPos = i;
+        pdbFound = true;
       }
       i++;
     }
@@ -107,7 +110,7 @@ public class DbRefFetcherTest
             + srces.size() + " sources (source was at position "
             + uniprotPos + ")", uniprotPos == 0);
     assertTrue("Failed to find PDB source amongst " + srces.size()
-            + " sources", pdbPos >= 0);
+            + " sources", pdbFound);
   }
 
   /**
@@ -167,7 +170,8 @@ public class DbRefFetcherTest
                     sfs[0].getType()));
     assertEquals(embl.getDbSource(), sfs[0].getFeatureGroup());
     DBRefEntry[] dr = DBRefUtils.selectRefs(seq.getDBRefs(),
-            DBRefSource.PROTEINSEQ);
+            new String[] { DBRefSource.UNIPROT, DBRefSource.UNIPROTKB,
+                DBRefSource.EMBLCDSProduct, DBRefSource.ENSEMBL });
     assertNotNull(dr);
     assertEquals("Expected a single Uniprot cross reference", 1, dr.length);
     assertEquals("Expected cross reference map to be one amino acid", dr[0]
@@ -175,8 +179,7 @@ public class DbRefFetcherTest
     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.getDataset());
+            alsq.getSequencesArray(), true, dr[0].getSource(), alsq);
     assertNotNull(
             "Couldn't recover cross reference sequence from dataset. Was it ever added ?",
             sprods);
index 28b44e1..a1c2c9a 100644 (file)
@@ -80,7 +80,7 @@ public class SiftsClientTest
     File testSiftsFile = new File("test/jalview/io/" + testPDBId
             + ".xml.gz");
     PDBfile pdbFile = new PDBfile(false, false, false);
-    pdbFile.id = testPDBId;
+    pdbFile.setId(testPDBId);
     siftsClient = new SiftsClient(pdbFile, testSiftsFile);
   }
 
index cd9987c..428b998 100755 (executable)
@@ -2025,7 +2025,7 @@ and any path to a file to save to the file]]></string>
                                                                <string><![CDATA[664]]></string>
                                                        </property>
                                                        <property name="sourceName">
-                                                               <string><![CDATA[groovy-all-1.8.2.jar]]></string>
+                                                               <string><![CDATA[groovy-all-2.4.6-indy.jar]]></string>
                                                        </property>
                                                        <property name="overrideUnixPermissions">
                                                                <boolean>false</boolean>
@@ -2043,7 +2043,7 @@ and any path to a file to save to the file]]></string>
                                                                <boolean>true</boolean>
                                                        </property>
                                                        <property name="destinationName">
-                                                               <string><![CDATA[groovy-all-1.8.2.jar]]></string>
+                                                               <string><![CDATA[groovy-all-2.4.6-indy.jar]]></string>
                                                        </property>
                                                        <property name="fileSize">
                                                                <long>6149494</long>
@@ -2839,6 +2839,58 @@ and any path to a file to save to the file]]></string>
                                                        </property>
                                                </object>
                                        </method>
+                                       <method name="addElement">
+                                               <object class="com.zerog.ia.installer.actions.InstallZipfile" objectID="1000ddddfab93">
+                                                       <property name="belongsToUninstallPhase">
+                                                               <boolean>false</boolean>
+                                                       </property>
+                                                       <property name="rollbackEnabledCancel">
+                                                               <boolean>true</boolean>
+                                                       </property>
+                                                       <property name="rollbackEnabledError">
+                                                               <boolean>true</boolean>
+                                                       </property>
+                                                       <property name="ruleExpression">
+                                                               <string><![CDATA[]]></string>
+                                                       </property>
+                                                       <property name="unixPermissions">
+                                                               <string><![CDATA[664]]></string>
+                                                       </property>
+                                                       <property name="sourceName">
+                                                               <string><![CDATA[htsjdk-1.133.jar]]></string>
+                                                       </property>
+                                                       <property name="overrideUnixPermissions">
+                                                               <boolean>false</boolean>
+                                                       </property>
+                                                       <property name="sourcePath">
+                                                               <string><![CDATA[/home/cruisecontrol/jalview/lib/]]></string>
+                                                       </property>
+                                                       <property name="shouldUninstall">
+                                                               <boolean>true</boolean>
+                                                       </property>
+                                                       <property name="rollbackEnabledCancel">
+                                                               <boolean>true</boolean>
+                                                       </property>
+                                                       <property name="rollbackEnabledError">
+                                                               <boolean>true</boolean>
+                                                       </property>
+                                                       <property name="destinationName">
+                                                               <string><![CDATA[htsjdk-1.133.jar]]></string>
+                                                       </property>
+                                                       <property name="fileSize">
+                                                               <long>16046</long>
+                                                       </property>
+                                                       <property name="macBinary">
+                                                               <boolean>false</boolean>
+                                                       </property>
+                                                       <property name="targetCheckKind">
+                                                               <int>0</int>
+                                                       </property>
+                                                       <property name="ruleExpression">
+                                                               <string><![CDATA[]]></string>
+                                                       </property>
+                                               </object>
+                                       </method>
                                </object>
                        </property>
                        <property name="rulesFailedMessage">
@@ -7307,6 +7359,7 @@ and any path to a file to read from that file]]></string>
                                                                                <object refID="1f46cffffab93"/>
                                                                                <object refID="1f46efeefab93"/>
                                                                                <object refID="1936efeefab93"/>
+                                                                               <object refID="1000ddddfab93"/>
                                                                                <object refID="10936efeefab93"/>
                                                                                <object refID="11936efeefab93"/>
                                                                                <object refID="12936efeefab93"/>
@@ -7894,6 +7947,7 @@ and any path to a file to read from that file]]></string>
                                                                                                <object refID="1f46cffffab93"/>
                                                                                                <object refID="1f46efeefab93"/>
                                                                                                <object refID="1936efeefab93"/>
+                                                                                               <object refID="1000ddddfab93"/>
                                                                                                <object refID="10936efeefab93"/>
                                                                                                <object refID="11936efeefab93"/>
                                                                                                <object refID="12936efeefab93"/>