JAL-3210 Improvements to eclipse detection. New src tree and SwingJS updated from...
authorBen Soares <bsoares@dundee.ac.uk>
Fri, 30 Aug 2019 16:19:52 +0000 (17:19 +0100)
committerBen Soares <bsoares@dundee.ac.uk>
Fri, 30 Aug 2019 16:19:52 +0000 (17:19 +0100)
344 files changed:
README
build.gradle
gradle.properties
src/com/stevesoft/pat/RegOpt.java
src/com/stevesoft/pat/Regex.java
src/com/stevesoft/pat/RegexReader.java
src/com/stevesoft/pat/RegexTokenizer.java
src/ext/edu/ucsf/rbvi/strucviz2/ChimUtils.java
src/ext/edu/ucsf/rbvi/strucviz2/ChimeraChain.java
src/ext/edu/ucsf/rbvi/strucviz2/StructureManager.java
src/ext/vamsas/JpredSoapBindingStub.java [changed mode: 0755->0644]
src/ext/vamsas/MuscleWSSoapBindingStub.java
src/ext/vamsas/RegistryServiceSoapBindingStub.java
src/ext/vamsas/SeqSearchServiceSoapBindingStub.java
src/ext/vamsas/ServiceHandle.java
src/intervalstore/api/IntervalI.java [new file with mode: 0644]
src/intervalstore/api/IntervalStoreI.java [new file with mode: 0644]
src/intervalstore/impl/BinarySearcher.java [new file with mode: 0644]
src/intervalstore/impl/IntervalStore.java [new file with mode: 0644]
src/intervalstore/impl/NCList.java [new file with mode: 0644]
src/intervalstore/impl/NCListBuilder.java [new file with mode: 0644]
src/intervalstore/impl/NCNode.java [new file with mode: 0644]
src/intervalstore/nonc/IntervalStore.java [new file with mode: 0644]
src/jalview/analysis/AlignmentSorter.java
src/jalview/analysis/Conservation.java
src/jalview/analysis/CrossRef.java
src/jalview/analysis/Finder.java
src/jalview/analysis/GeneticCodes.java
src/jalview/analysis/ParseProperties.java
src/jalview/analysis/SeqsetUtils.java
src/jalview/analysis/StructureFrequency.java
src/jalview/analysis/scoremodels/FeatureDistanceModel.java
src/jalview/analysis/scoremodels/ScoreMatrix.java
src/jalview/analysis/scoremodels/ScoreModels.java
src/jalview/analysis/scoremodels/SimilarityParams.java
src/jalview/api/AlignFrameI.java [new file with mode: 0644]
src/jalview/api/AlignViewportI.java
src/jalview/api/AlignmentColsCollectionI.java
src/jalview/api/AlignmentViewPanel.java
src/jalview/api/FeatureColourI.java
src/jalview/api/FeatureRenderer.java
src/jalview/api/JalviewApp.java [new file with mode: 0644]
src/jalview/appletgui/AlignFrame.java
src/jalview/appletgui/AlignViewport.java
src/jalview/appletgui/AlignmentPanel.java
src/jalview/appletgui/AnnotationColourChooser.java
src/jalview/appletgui/AnnotationLabels.java
src/jalview/appletgui/AnnotationPanel.java
src/jalview/appletgui/EmbmenuFrame.java
src/jalview/appletgui/FeatureColourChooser.java
src/jalview/appletgui/FeatureSettings.java
src/jalview/appletgui/FontChooser.java
src/jalview/appletgui/IdPanel.java
src/jalview/appletgui/OverviewCanvas.java
src/jalview/appletgui/OverviewPanel.java
src/jalview/appletgui/ScalePanel.java
src/jalview/appletgui/SeqPanel.java
src/jalview/appletgui/TreePanel.java
src/jalview/bin/AppletParams.java [new file with mode: 0644]
src/jalview/bin/ApplicationSingletonProvider.java [new file with mode: 0644]
src/jalview/bin/ArgsParser.java
src/jalview/bin/Cache.java
src/jalview/bin/Jalview.java
src/jalview/bin/JalviewAppLoader.java [new file with mode: 0644]
src/jalview/bin/JalviewJS2.java
src/jalview/bin/JalviewJSApi.java [new file with mode: 0644]
src/jalview/bin/JalviewLite.java
src/jalview/bin/JalviewTaskbar.java [deleted file]
src/jalview/bin/Launcher.java [deleted file]
src/jalview/bin/MemorySetting.java [deleted file]
src/jalview/commands/ChangeCaseCommand.java
src/jalview/controller/AlignViewController.java
src/jalview/datamodel/Alignment.java
src/jalview/datamodel/AlignmentAnnotation.java
src/jalview/datamodel/AlignmentI.java
src/jalview/datamodel/AllColsCollection.java
src/jalview/datamodel/BinarySequence.java
src/jalview/datamodel/ColumnSelection.java
src/jalview/datamodel/DBRefEntry.java
src/jalview/datamodel/DBRefSource.java
src/jalview/datamodel/HiddenColumns.java
src/jalview/datamodel/PDBEntry.java
src/jalview/datamodel/ResidueCount.java
src/jalview/datamodel/SecondaryStructureAnnotation.java
src/jalview/datamodel/Sequence.java
src/jalview/datamodel/SequenceFeature.java
src/jalview/datamodel/SequenceI.java
src/jalview/datamodel/VisibleColsCollection.java
src/jalview/datamodel/features/FeatureAttributes.java
src/jalview/datamodel/features/FeatureSources.java
src/jalview/datamodel/features/FeatureStore.java
src/jalview/datamodel/features/FeatureStoreI.java [new file with mode: 0644]
src/jalview/datamodel/features/FeatureStoreImpl.java [new file with mode: 0644]
src/jalview/datamodel/features/FeatureStoreJS.java [new file with mode: 0644]
src/jalview/datamodel/features/SequenceFeatures.java
src/jalview/datamodel/features/SequenceFeaturesI.java
src/jalview/ext/ensembl/EnsemblCdna.java
src/jalview/ext/ensembl/EnsemblCds.java
src/jalview/ext/ensembl/EnsemblGene.java
src/jalview/ext/ensembl/EnsemblInfo.java
src/jalview/ext/ensembl/EnsemblMap.java
src/jalview/ext/ensembl/EnsemblProtein.java
src/jalview/ext/ensembl/EnsemblRestClient.java
src/jalview/ext/ensembl/EnsemblSeqProxy.java
src/jalview/ext/ensembl/EnsemblSequenceFetcher.java
src/jalview/ext/htsjdk/VCFReader.java
src/jalview/ext/jmol/JalviewJmolBinding.java
src/jalview/ext/paradise/Annotate3D.java
src/jalview/ext/so/SequenceOntology.java
src/jalview/fts/core/FTSRestRequest.java
src/jalview/fts/service/pdb/PDBFTSRestClient.java
src/jalview/fts/service/uniprot/UniProtFTSRestClient.java
src/jalview/gui/APQHandlers.java [deleted file]
src/jalview/gui/AlignExportOptions.java
src/jalview/gui/AlignFrame.java
src/jalview/gui/AlignViewport.java
src/jalview/gui/AlignmentPanel.java
src/jalview/gui/AnnotationColourChooser.java
src/jalview/gui/AnnotationColumnChooser.java
src/jalview/gui/AnnotationLabels.java
src/jalview/gui/AnnotationPanel.java
src/jalview/gui/AppJmol.java
src/jalview/gui/AppVarna.java
src/jalview/gui/AppVarnaBinding.java
src/jalview/gui/AssociatePdbFileWithSeq.java
src/jalview/gui/BlogReader.java
src/jalview/gui/CalculationChooser.java
src/jalview/gui/ChimeraViewFrame.java
src/jalview/gui/ColourMenuHelper.java
src/jalview/gui/ComboBoxTooltipRenderer.java
src/jalview/gui/Console.java
src/jalview/gui/CrossRefAction.java
src/jalview/gui/CutAndPasteTransfer.java
src/jalview/gui/Desktop.java
src/jalview/gui/FeatureEditor.java
src/jalview/gui/FeatureRenderer.java
src/jalview/gui/FeatureSettings.java
src/jalview/gui/FeatureTypeSettings.java
src/jalview/gui/Finder.java
src/jalview/gui/FontChooser.java
src/jalview/gui/IdCanvas.java
src/jalview/gui/IdPanel.java
src/jalview/gui/IdwidthAdjuster.java
src/jalview/gui/JalviewAppender.java
src/jalview/gui/JalviewDialog.java
src/jalview/gui/JvSwingUtils.java
src/jalview/gui/LineartOptions.java
src/jalview/gui/MenuChooser.java [deleted file]
src/jalview/gui/OOMWarning.java
src/jalview/gui/OverviewCanvas.java
src/jalview/gui/OverviewPanel.java
src/jalview/gui/PCAPanel.java
src/jalview/gui/PopupMenu.java
src/jalview/gui/Preferences.java
src/jalview/gui/PromptUserConfig.java
src/jalview/gui/RotatableCanvas.java
src/jalview/gui/ScalePanel.java
src/jalview/gui/SeqCanvas.java
src/jalview/gui/SeqPanel.java
src/jalview/gui/SequenceFetcher.java
src/jalview/gui/SequenceRenderer.java
src/jalview/gui/SliderPanel.java
src/jalview/gui/SplashScreen.java
src/jalview/gui/SplitFrame.java
src/jalview/gui/StructureChooser.java
src/jalview/gui/StructureViewer.java
src/jalview/gui/StructureViewerBase.java
src/jalview/gui/UserDefinedColours.java
src/jalview/gui/UserQuestionnaireCheck.java
src/jalview/gui/VamsasApplication.java
src/jalview/gui/WebserviceInfo.java
src/jalview/gui/WsJobParameters.java
src/jalview/gui/WsParamSetManager.java
src/jalview/gui/WsPreferences.java
src/jalview/httpserver/HttpServer.java
src/jalview/io/AlignFile.java
src/jalview/io/AnnotationFile.java
src/jalview/io/BackupFilenameParts.java
src/jalview/io/BackupFiles.java
src/jalview/io/BackupFilesPresetEntry.java [deleted file]
src/jalview/io/FeaturesFile.java
src/jalview/io/FileFormats.java
src/jalview/io/FileLoader.java
src/jalview/io/FormatAdapter.java
src/jalview/io/HTMLOutput.java
src/jalview/io/HtmlSvgOutput.java
src/jalview/io/IdentifyFile.java
src/jalview/io/IntKeyStringValueEntry.java [deleted file]
src/jalview/io/JPredFile.java
src/jalview/io/JalviewFileFilter.java
src/jalview/io/JnetAnnotationMaker.java
src/jalview/io/ModellerDescription.java
src/jalview/io/NewickFile.java
src/jalview/io/PIRFile.java
src/jalview/io/RnamlFile.java
src/jalview/io/StockholmFile.java
src/jalview/io/TCoffeeScoreFile.java
src/jalview/io/VamsasAppDatastore.java
src/jalview/io/WSWUBlastClient.java
src/jalview/io/cache/AppCache.java
src/jalview/io/cache/JvCacheableInputBox.java
src/jalview/io/gff/Gff3Helper.java
src/jalview/io/gff/InterProScanHelper.java
src/jalview/io/gff/SequenceOntologyFactory.java
src/jalview/io/vamsas/DatastoreRegistry.java
src/jalview/io/vamsas/Rangetype.java
src/jalview/io/vamsas/Sequencefeature.java
src/jalview/io/vamsas/Sequencemapping.java
src/jalview/io/vamsas/Tree.java
src/jalview/io/vcf/VCFLoader.java
src/jalview/javascript/JSFunctionExec.java
src/jalview/javascript/JalviewLiteJsApi.java
src/jalview/javascript/JsSelectionSender.java
src/jalview/javascript/MouseOverListener.java
src/jalview/javascript/MouseOverStructureListener.java
src/jalview/javascript/json/JSON.java
src/jalview/jbgui/GAlignFrame.java
src/jalview/jbgui/GAlignmentPanel.java
src/jalview/jbgui/GCutAndPasteHtmlTransfer.java
src/jalview/jbgui/GCutAndPasteTransfer.java
src/jalview/jbgui/GDesktop.java
src/jalview/jbgui/GPCAPanel.java
src/jalview/jbgui/GPreferences.java
src/jalview/jbgui/GRnaStructureViewer.java
src/jalview/jbgui/GSequenceLink.java
src/jalview/jbgui/GSliderPanel.java
src/jalview/jbgui/GSplitFrame.java
src/jalview/jbgui/GStructureChooser.java
src/jalview/jbgui/GStructureViewer.java
src/jalview/jbgui/GTreePanel.java
src/jalview/project/Jalview2XML.java
src/jalview/renderer/OverviewRenderer.java
src/jalview/renderer/OverviewResColourFinder.java
src/jalview/renderer/ResidueColourFinder.java
src/jalview/renderer/ResidueShader.java
src/jalview/renderer/ResidueShaderI.java
src/jalview/renderer/seqfeatures/FeatureColourFinder.java
src/jalview/renderer/seqfeatures/FeatureRenderer.java
src/jalview/rest/RestHandler.java
src/jalview/schemes/AnnotationColourGradient.java
src/jalview/schemes/ColourSchemeProperty.java
src/jalview/schemes/ColourSchemes.java
src/jalview/schemes/Consensus.java
src/jalview/schemes/FeatureColour.java
src/jalview/schemes/RNAHelicesColour.java
src/jalview/schemes/ResidueProperties.java
src/jalview/structure/StructureImportSettings.java
src/jalview/structure/StructureSelectionManager.java
src/jalview/structures/models/AAStructureBindingModel.java
src/jalview/urls/IdOrgSettings.java
src/jalview/urls/IdentifiersUrlProvider.java
src/jalview/util/BrowserLauncher.java
src/jalview/util/ColorUtils.java
src/jalview/util/DBRefUtils.java
src/jalview/util/GroupUrlLink.java
src/jalview/util/MessageManager.java
src/jalview/util/Platform.java
src/jalview/util/ShortcutKeyMaskExWrapper.java [deleted file]
src/jalview/util/UrlLink.java
src/jalview/viewmodel/AlignmentViewport.java
src/jalview/viewmodel/OverviewDimensions.java
src/jalview/viewmodel/OverviewDimensionsHideHidden.java
src/jalview/viewmodel/OverviewDimensionsShowHidden.java
src/jalview/viewmodel/ViewportRanges.java
src/jalview/viewmodel/seqfeatures/FeatureRendererModel.java
src/jalview/workers/AlignCalcManager.java
src/jalview/ws/DBRefFetcher.java
src/jalview/ws/SequenceFetcher.java
src/jalview/ws/SequenceFetcherFactory.java
src/jalview/ws/dbsources/EmblCdsSource.java
src/jalview/ws/dbsources/EmblSource.java
src/jalview/ws/dbsources/Pdb.java
src/jalview/ws/dbsources/PfamFull.java
src/jalview/ws/dbsources/PfamSeed.java
src/jalview/ws/dbsources/Uniprot.java
src/jalview/ws/jws1/Discoverer.java
src/jalview/ws/jws1/JPredClient.java
src/jalview/ws/jws1/MsaWSClient.java
src/jalview/ws/jws1/SeqSearchWSClient.java
src/jalview/ws/jws2/AAConClient.java
src/jalview/ws/jws2/AADisorderClient.java
src/jalview/ws/jws2/Jws2Client.java
src/jalview/ws/jws2/Jws2Discoverer.java
src/jalview/ws/jws2/MsaWSClient.java
src/jalview/ws/jws2/RNAalifoldClient.java
src/jalview/ws/jws2/SequenceAnnotationWSClient.java
src/jalview/ws/jws2/jabaws2/Jws2Instance.java
src/jalview/ws/jws2/jabaws2/Jws2InstanceFactory.java
src/jalview/ws/rest/HttpResultSet.java
src/jalview/ws/rest/RestClient.java
src/jalview/ws/seqfetcher/ASequenceFetcher.java
src/jalview/ws/seqfetcher/DbSourceProxy.java
src/jalview/ws/seqfetcher/DbSourceProxyRoot.java [new file with mode: 0644]
src/jalview/ws/sifts/SiftsClient.java
src/jalview/ws/sifts/SiftsSettings.java
src/jalview/xml/binding/jalview/JalviewModelType.java [deleted file]
src/mc_view/PDBfile.java
src/org/jibble/epsgraphics/EpsGraphics2D.java
src/uk/ac/ebi/www/InputParams.java
src/uk/ac/ebi/www/picr/AccessionMappingService/AccessionMapperBindingStub.java
utils/jalviewjs/SwingJS-site.zip
utils/jalviewjs/eclipse/dropins/net.sf.j2s.core.jar
utils/jalviewjs/site-resources/applets-nocore.html [new file with mode: 0644]
utils/jalviewjs/site-resources/applets.html [new file with mode: 0644]
utils/jalviewjs/site-resources/css/ie6.css [new file with mode: 0644]
utils/jalviewjs/site-resources/css/ie7.css [new file with mode: 0644]
utils/jalviewjs/site-resources/css/reset.css [new file with mode: 0644]
utils/jalviewjs/site-resources/css/style.css [new file with mode: 0644]
utils/jalviewjs/site-resources/examples/1gaq.txt [new file with mode: 0644]
utils/jalviewjs/site-resources/examples/2GIS.pdb [new file with mode: 0644]
utils/jalviewjs/site-resources/examples/3W5V.pdb [new file with mode: 0644]
utils/jalviewjs/site-resources/examples/backupfilestest.fa [new file with mode: 0644]
utils/jalviewjs/site-resources/examples/biojsonschema.json [new file with mode: 0644]
utils/jalviewjs/site-resources/examples/dna_interleaved.phy [new file with mode: 0644]
utils/jalviewjs/site-resources/examples/dna_sequential.phy [new file with mode: 0644]
utils/jalviewjs/site-resources/examples/estrogenReceptorCdna.fa [new file with mode: 0644]
utils/jalviewjs/site-resources/examples/estrogenReceptorCdna_aln.fa [new file with mode: 0644]
utils/jalviewjs/site-resources/examples/estrogenReceptorCdna_frag.fa [new file with mode: 0644]
utils/jalviewjs/site-resources/examples/estrogenReceptorProtein.aln [new file with mode: 0644]
utils/jalviewjs/site-resources/examples/estrogenReceptorProtein.fa [new file with mode: 0644]
utils/jalviewjs/site-resources/examples/estrogenReceptorProtein_aln.fa [new file with mode: 0644]
utils/jalviewjs/site-resources/examples/estrogenReceptorProtein_frag.fa [new file with mode: 0644]
utils/jalviewjs/site-resources/examples/example.json [new file with mode: 0644]
utils/jalviewjs/site-resources/examples/ferredoxin.nw [new file with mode: 0644]
utils/jalviewjs/site-resources/examples/jpred_msa.fasta [new file with mode: 0644]
utils/jalviewjs/site-resources/examples/jpred_msa.seq.concise [new file with mode: 0644]
utils/jalviewjs/site-resources/examples/plantfdx.annotations [new file with mode: 0644]
utils/jalviewjs/site-resources/examples/plantfdx.fa [new file with mode: 0644]
utils/jalviewjs/site-resources/examples/plantfdx.features [new file with mode: 0644]
utils/jalviewjs/site-resources/examples/unfolded_RF00031.aln [new file with mode: 0644]
utils/jalviewjs/site-resources/examples/uniref50.score_ascii [new file with mode: 0644]
utils/jalviewjs/site-resources/examples/uniref50_mz.fa [new file with mode: 0644]
utils/jalviewjs/site-resources/images/coolJalviewBackgroundFading.png [new file with mode: 0644]
utils/jalviewjs/site-resources/images/coolVeryLightBG.png [new file with mode: 0644]
utils/jalviewjs/site-resources/jalview_embedded_example1.html [new file with mode: 0644]
utils/jalviewjs/site-resources/javascript/deployJava.js [new file with mode: 0644]
utils/jalviewjs/site-resources/javascript/facebox-1.3.js [new file with mode: 0644]
utils/jalviewjs/site-resources/javascript/jalview.js [new file with mode: 0644]
utils/jalviewjs/site-resources/javascript/jquery-1.4.4.min.js [new file with mode: 0644]
utils/jalviewjs/site-resources/javascript/jquery.blockUI.js [new file with mode: 0644]
utils/jalviewjs/site-resources/javascript/jquery.timer.js [new file with mode: 0644]
utils/jalviewjs/site-resources/javascript/jshashtable-2.1.js [new file with mode: 0644]
utils/jalviewjs/site-resources/javascript/jvcontroller.js [new file with mode: 0644]
utils/jalviewjs/site-resources/swingjs/JalviewApplet.js [new file with mode: 0644]

diff --git a/README b/README
index 33f0319..43ffa63 100644 (file)
--- a/README
+++ b/README
@@ -1,6 +1,6 @@
 Download and install a clean eclipse-jee-2019-06
 
-In gradle.properties edit `jalviewjs_eclipse_root` to point to the root dir.  Include up to the Eclipse.app folder if it's the macOS version.
+In gradle.properties edit `jalviewjs_eclipse_root` to point to the root dir. DO NOT include the Eclipse.app folder in the path (up to this point, but not the .app folder) if it's the macOS version.
 
 
 gradle tasks of interest:
index 351d9ac..7890fd0 100644 (file)
@@ -233,19 +233,25 @@ def eclipseBinary
 def eclipseDropinsDir
 def eclipsePluginsDir
 task jalviewjsEclipsePaths {
+  def eclipseRoot = jalviewjs_eclipse_root
+  if (eclipseRoot.startsWith("~")) {
+    eclipseRoot = System.getProperty("user.home") + eclipseRoot.substring(1)
+  }
        if (OperatingSystem.current().isMacOsX()) {
-               eclipseDropinsDir = jalviewjs_eclipse_root+"/Contents/Eclipse/dropins"
-               eclipsePluginsDir = jalviewjs_eclipse_root+"/Contents/Eclipse/plugins"
-               eclipseBinary = jalviewjs_eclipse_root+"/Contents/MacOS/eclipse"
-       } else if (OperatingSystem.current().isWindows()) { // check this!
-               eclipseDropinsDir = jalviewjs_eclipse_root+"/dropins"
-               eclipsePluginsDir = jalviewjs_eclipse_root+"/plugins"
-               eclipseBinary = jalviewjs_eclipse_root+"/eclipse"
+    eclipseRoot += "/Eclipse.app"
+               eclipseDropinsDir = eclipseRoot+"/Contents/Eclipse/dropins"
+               eclipsePluginsDir = eclipseRoot+"/Contents/Eclipse/plugins"
+               eclipseBinary = eclipseRoot+"/Contents/MacOS/eclipse"
+       } else if (OperatingSystem.current().isWindows()) { // check these paths!!
+               eclipseDropinsDir = eclipseRoot+"/dropins"
+               eclipsePluginsDir = eclipseRoot+"/plugins"
+               eclipseBinary = eclipseRoot+"/eclipse"
        } else { // linux or unix
-               eclipseDropinsDir = jalviewjs_eclipse_root+"/dropins"
-               eclipsePluginsDir = jalviewjs_eclipse_root+"/plugins"
-               eclipseBinary = jalviewjs_eclipse_root+"/eclipse"
+               eclipseDropinsDir = eclipseRoot+"/dropins"
+               eclipsePluginsDir = eclipseRoot+"/plugins"
+               eclipseBinary = eclipseRoot+"/eclipse"
        }
+  println("ECLIPSE ROOT: "+eclipseRoot)
 }
 
 task jalviewjsEclipseCopyDropins (type: Copy) {
@@ -353,8 +359,9 @@ task jalviewjsProjectImport(type: Exec) {
   executable(eclipseBinary)
   args(["-nosplash", "--launcher.suppressErrors", "-application", "com.seeq.eclipse.importprojects.headlessimport", "-data", tempEclipseWorkspace.getPath(), "-import", jalviewDirAbsolutePath])
 
-  def tempdir = tempEclipseWorkspace.getPath()+"/.metadata/.plugins/org.eclipse.core.resources/.projects/jalview"
-  outputs.dir(tempdir)
+  def projdir = tempEclipseWorkspace.getPath()+"/.metadata/.plugins/org.eclipse.core.resources/.projects/jalview/org.eclipse.jdt.core/"
+  inputs.file(jalviewDir+"/.project")
+  outputs.dir(projdir)
 }
 
 task jalviewjsTranspile(type: Exec) {
index 1fa2f14..e30dcb5 100644 (file)
@@ -34,8 +34,7 @@ j11libDir = j11lib
 
 dev = false
 
-#jalviewjs_eclipse_root = /Users/bsoares/buildtools/eclipse/eclipse-jee-2019-06/Eclipse.app
-jalviewjs_eclipse_root = /home/bsoares/buildtools/eclipse/eclipse-jee-2019-06
+jalviewjs_eclipse_root = ~/buildtools/eclipse/eclipse-jee-2019-06
 
 jalviewjs_utils_dir = utils/jalviewjs
 jalviewjs_eclipse_plugins_dir = eclipse/plugins
index d5f62de..50d799f 100755 (executable)
@@ -138,16 +138,16 @@ class Branch extends Pattern
       n = RegOpt.opt(n, ignoreCase, dontMinQ);
     }
     n.setParent(this);
-    set(Character.valueOf(o.c), n, ignoreCase, dontMinQ);
+    set(new Character(o.c), n, ignoreCase, dontMinQ);
     if (ignoreCase)
     {
       if (o.c != o.altc)
       {
-        set(Character.valueOf(o.altc), n, ignoreCase, dontMinQ);
+        set(new Character(o.altc), n, ignoreCase, dontMinQ);
       }
       if (o.c != o.altc2 && o.altc != o.altc2)
       {
-        set(Character.valueOf(o.altc2), n, ignoreCase, dontMinQ);
+        set(new Character(o.altc2), n, ignoreCase, dontMinQ);
       }
     }
   }
@@ -250,7 +250,7 @@ class Branch extends Pattern
     {
       return -1;
     }
-    Pattern n = (Pattern) h.get(Character.valueOf(pt.src.charAt(pos)));
+    Pattern n = (Pattern) h.get(new Character(pt.src.charAt(pos)));
     if (n == null)
     {
       return -1;
index 6d07427..455f040 100755 (executable)
@@ -16,6 +16,7 @@ import java.util.Hashtable;
 
 import com.stevesoft.pat.wrap.StringWrap;
 
+
 /** Matches a Unicode punctuation character. */
 class UnicodePunct extends UniValidator
 {
@@ -306,6 +307,7 @@ class UnicodeLower extends UniValidator
  */
 public class Regex extends RegRes implements FilenameFilter
 {
+
   /**
    * BackRefOffset gives the identity number of the first pattern. Version 1.0
    * used zero, version 1.1 uses 1 to be more compatible with perl.
@@ -1095,16 +1097,13 @@ public class Regex extends RegRes implements FilenameFilter
   {
     try
     {
-      return getClass().getDeclaredConstructor().newInstance();
+      return getClass().newInstance();
     } catch (InstantiationException ie)
     {
       return null;
     } catch (IllegalAccessException iae)
     {
       return null;
-    } catch (ReflectiveOperationException roe)
-    {
-      return null;
     }
   }
 
index a0b42ce..837821e 100755 (executable)
@@ -233,7 +233,6 @@ public class RegexReader extends Reader
    * 
    * @deprecated
    */
-  @Deprecated
   public int getMaxLines()
   {
     return max_lines;
@@ -244,7 +243,6 @@ public class RegexReader extends Reader
    * 
    * @deprecated
    */
-  @Deprecated
   public void setMaxLines(int ml)
   {
     max_lines = ml;
@@ -257,7 +255,6 @@ public class RegexReader extends Reader
    * 
    * @deprecated
    */
-  @Deprecated
   public char getEOLchar()
   {
     return EOLchar;
@@ -268,7 +265,6 @@ public class RegexReader extends Reader
    * 
    * @deprecated
    */
-  @Deprecated
   public void setEOLchar(char c)
   {
     EOLchar = c;
index c99bfea..31fa2ba 100755 (executable)
@@ -43,13 +43,13 @@ public class RegexTokenizer implements Enumeration
     if (r.searchFrom(toParse, pos))
     {
       v.addElement(r.left().substring(pos));
-      vi.addElement(Integer.valueOf(r.matchFrom() + r.charsMatched()));
+      vi.addElement(new Integer(r.matchFrom() + r.charsMatched()));
       for (int i = 0; i < r.numSubs(); i++)
       {
         if (r.substring() != null)
         {
           v.addElement(r.substring(i + offset));
-          vi.addElement(Integer.valueOf(r.matchFrom(i + offset)
+          vi.addElement(new Integer(r.matchFrom(i + offset)
                   + r.charsMatched(i + offset)));
         }
       }
index 6b5e36c..1d57a31 100644 (file)
@@ -173,7 +173,7 @@ public abstract class ChimUtils
       float[] rgbValues = new float[4];
       for (int i = 0; i < rgbStrings.length; i++)
       {
-        Float f = Float.valueOf(rgbStrings[i]);
+        Float f = new Float(rgbStrings[i]);
         rgbValues[i] = f.floatValue();
       }
       if (rgbStrings.length == 4)
@@ -203,7 +203,7 @@ public abstract class ChimUtils
    */
   public static Integer makeModelKey(int model, int subModel)
   {
-    return Integer.valueOf(model * MAX_SUB_MODELS + subModel);
+    return new Integer(model * MAX_SUB_MODELS + subModel);
   }
 
   // invoked by the getResdiue (parseConnectivityReplies in
index 4f871d3..9a29a99 100644 (file)
@@ -200,7 +200,7 @@ public class ChimeraChain implements ChimeraStructuralObject
    */
   public ChimeraResidue getResidue(String index)
   {
-    // Integer index = Integer.valueOf(residueIndex);
+    // Integer index = new Integer(residueIndex);
     if (residueMap.containsKey(index))
       return residueMap.get(index);
     return null;
index 22c9098..09a9713 100644 (file)
@@ -121,8 +121,8 @@ public class StructureManager
       for (String chimObjName : names)
       {
         // get or open the corresponding models if they already exist
-        List<ChimeraModel> currentModels = chimeraManager
-                .getChimeraModels(chimObjName, type);
+        List<ChimeraModel> currentModels = chimeraManager.getChimeraModels(
+                chimObjName, type);
         if (currentModels.size() == 0)
         {
           // open and return models
@@ -562,11 +562,11 @@ public class StructureManager
         // Get the corresponding "real" model
         if (chimeraManager.hasChimeraModel(modelNumber, subModelNumber))
         {
-          ChimeraModel dataModel = chimeraManager
-                  .getChimeraModel(modelNumber, subModelNumber);
-          if (dataModel.getResidueCount() == selectedModel.getResidueCount()
-                  || dataModel
-                          .getModelType() == StructureManager.ModelType.SMILES)
+          ChimeraModel dataModel = chimeraManager.getChimeraModel(
+                  modelNumber, subModelNumber);
+          if (dataModel.getResidueCount() == selectedModel
+                  .getResidueCount()
+                  || dataModel.getModelType() == StructureManager.ModelType.SMILES)
           {
             // Select the entire model
             addChimSelection(dataModel);
@@ -576,8 +576,8 @@ public class StructureManager
           {
             for (ChimeraChain selectedChain : selectedModel.getChains())
             {
-              ChimeraChain dataChain = dataModel
-                      .getChain(selectedChain.getChainId());
+              ChimeraChain dataChain = dataModel.getChain(selectedChain
+                      .getChainId());
               if (selectedChain.getResidueCount() == dataChain
                       .getResidueCount())
               {
@@ -931,7 +931,6 @@ public class StructureManager
       pathList.add("/usr/local/chimera/bin/chimera");
       pathList.add("/usr/local/bin/chimera");
       pathList.add("/usr/bin/chimera");
-      pathList.add(System.getProperty("user.home") + "/opt/bin/chimera");
     }
     else if (os.startsWith("Windows"))
     {
old mode 100755 (executable)
new mode 100644 (file)
index cff8081..8345551
@@ -31,7 +31,7 @@ public class JpredSoapBindingStub extends org.apache.axis.client.Stub
 
   private java.util.Vector cachedDeserFactories = new java.util.Vector();
 
-  static org.apache.axis.description.OperationDesc[] _operations;
+  private static org.apache.axis.description.OperationDesc[] _operations;
 
   static
   {
@@ -260,6 +260,7 @@ public class JpredSoapBindingStub extends org.apache.axis.client.Stub
     }
   }
 
+  @Override
   public java.lang.String predict(vamsas.objects.simple.Sequence seq)
           throws java.rmi.RemoteException
   {
@@ -297,6 +298,7 @@ public class JpredSoapBindingStub extends org.apache.axis.client.Stub
     }
   }
 
+  @Override
   public java.lang.String predictOnMsa(
           vamsas.objects.simple.Msfalignment msf)
           throws java.rmi.RemoteException
@@ -335,6 +337,7 @@ public class JpredSoapBindingStub extends org.apache.axis.client.Stub
     }
   }
 
+  @Override
   public vamsas.objects.simple.Secstructpred getpredict(
           java.lang.String job_id) throws java.rmi.RemoteException
   {
@@ -373,6 +376,7 @@ public class JpredSoapBindingStub extends org.apache.axis.client.Stub
     }
   }
 
+  @Override
   public vamsas.objects.simple.JpredResult getresult(java.lang.String job_id)
           throws java.rmi.RemoteException
   {
index 1f8d231..026066c 100755 (executable)
@@ -23,7 +23,7 @@ package ext.vamsas;
 public class MuscleWSSoapBindingStub extends org.apache.axis.client.Stub
         implements ext.vamsas.MuscleWS
 {
-  static org.apache.axis.description.OperationDesc[] _operations;
+  private static final org.apache.axis.description.OperationDesc[] _operations;
 
   static
   {
@@ -296,6 +296,7 @@ public class MuscleWSSoapBindingStub extends org.apache.axis.client.Stub
     }
   }
 
+  @Override
   public vamsas.objects.simple.WsJobId align(
           vamsas.objects.simple.SequenceSet seqSet)
           throws java.rmi.RemoteException
@@ -337,6 +338,7 @@ public class MuscleWSSoapBindingStub extends org.apache.axis.client.Stub
     }
   }
 
+  @Override
   public vamsas.objects.simple.Alignment getalign(java.lang.String job_id)
           throws java.rmi.RemoteException
   {
@@ -378,6 +380,7 @@ public class MuscleWSSoapBindingStub extends org.apache.axis.client.Stub
     }
   }
 
+  @Override
   public vamsas.objects.simple.MsaResult getResult(java.lang.String job_id)
           throws java.rmi.RemoteException
   {
@@ -419,6 +422,7 @@ public class MuscleWSSoapBindingStub extends org.apache.axis.client.Stub
     }
   }
 
+  @Override
   public vamsas.objects.simple.WsJobId cancel(java.lang.String jobId)
           throws java.rmi.RemoteException
   {
index 08b2a6b..f010ee8 100755 (executable)
@@ -31,7 +31,7 @@ public class RegistryServiceSoapBindingStub extends
 
   private java.util.Vector cachedDeserFactories = new java.util.Vector();
 
-  static org.apache.axis.description.OperationDesc[] _operations;
+  private static org.apache.axis.description.OperationDesc[] _operations;
 
   static
   {
@@ -192,6 +192,7 @@ public class RegistryServiceSoapBindingStub extends
     }
   }
 
+  @Override
   public ext.vamsas.ServiceHandles getServices()
           throws java.rmi.RemoteException
   {
index 390ceb6..df0a504 100644 (file)
@@ -31,7 +31,7 @@ public class SeqSearchServiceSoapBindingStub extends
 
   private java.util.Vector cachedDeserFactories = new java.util.Vector();
 
-  static org.apache.axis.description.OperationDesc[] _operations;
+  private static final org.apache.axis.description.OperationDesc[] _operations;
 
   static
   {
@@ -299,6 +299,7 @@ public class SeqSearchServiceSoapBindingStub extends
     }
   }
 
+  @Override
   public java.lang.String getDatabase() throws java.rmi.RemoteException
   {
     if (super.cachedEndpoint == null)
@@ -335,6 +336,7 @@ public class SeqSearchServiceSoapBindingStub extends
     }
   }
 
+  @Override
   public vamsas.objects.simple.SeqSearchResult getResult(
           java.lang.String job_id) throws java.rmi.RemoteException
   {
@@ -373,6 +375,7 @@ public class SeqSearchServiceSoapBindingStub extends
     }
   }
 
+  @Override
   public vamsas.objects.simple.WsJobId psearch(
           vamsas.objects.simple.Alignment al, java.lang.String database)
           throws java.rmi.RemoteException
@@ -412,6 +415,7 @@ public class SeqSearchServiceSoapBindingStub extends
     }
   }
 
+  @Override
   public vamsas.objects.simple.WsJobId search(
           vamsas.objects.simple.Sequence s, java.lang.String database)
           throws java.rmi.RemoteException
@@ -450,6 +454,7 @@ public class SeqSearchServiceSoapBindingStub extends
     }
   }
 
+  @Override
   public vamsas.objects.simple.WsJobId cancel(java.lang.String jobId)
           throws java.rmi.RemoteException
   {
index 83412ea..428b5ea 100755 (executable)
@@ -126,6 +126,7 @@ public class ServiceHandle implements java.io.Serializable
 
   private java.lang.Object __equalsCalc = null;
 
+  @Override
   public synchronized boolean equals(java.lang.Object obj)
   {
     if (obj == null)
@@ -162,6 +163,7 @@ public class ServiceHandle implements java.io.Serializable
 
   private boolean __hashCodeCalc = false;
 
+  @Override
   public synchronized int hashCode()
   {
     if (__hashCodeCalc)
@@ -191,7 +193,7 @@ public class ServiceHandle implements java.io.Serializable
   }
 
   // Type metadata
-  private static org.apache.axis.description.TypeDesc typeDesc = new org.apache.axis.description.TypeDesc(
+  private static final org.apache.axis.description.TypeDesc typeDesc = new org.apache.axis.description.TypeDesc(
           ServiceHandle.class, true);
 
   static
diff --git a/src/intervalstore/api/IntervalI.java b/src/intervalstore/api/IntervalI.java
new file mode 100644 (file)
index 0000000..c170a43
--- /dev/null
@@ -0,0 +1,192 @@
+/*
+BSD 3-Clause License
+
+Copyright (c) 2018, Mungo Carstairs
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+  list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+  this list of conditions and the following disclaimer in the documentation
+  and/or other materials provided with the distribution.
+
+* Neither the name of the copyright holder nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+package intervalstore.api;
+
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+public interface IntervalI
+{
+
+  /**
+   * Compare intervals by start position ascending and end position descending.
+   */
+  static Comparator<? super IntervalI> COMPARATOR_BIGENDIAN = new Comparator<IntervalI>()
+  {
+    @Override
+    public int compare(IntervalI o1, IntervalI o2)
+    {
+      int ret = Integer.signum(o1.getBegin() - o2.getBegin());
+      return (ret == 0 ? Integer.signum(o2.getEnd() - o1.getEnd()) : ret);
+    }
+  };
+
+  /**
+   * Compare intervals by start position ascending and end position ascending.
+   */
+  static Comparator<? super IntervalI> COMPARATOR_LITTLEENDIAN = new Comparator<IntervalI>()
+  {
+    @Override
+    public int compare(IntervalI o1, IntervalI o2)
+    {
+      int ret = Integer.signum(o1.getBegin() - o2.getBegin());
+      return (ret == 0 ? Integer.signum(o1.getEnd() - o2.getEnd()) : ret);
+    }
+  };
+
+  /**
+   * a comparator for sorting intervals by start position ascending
+   */
+  static Comparator<? super IntervalI> FORWARD_STRAND = new Comparator<IntervalI>()
+  {
+    @Override
+    public int compare(IntervalI o1, IntervalI o2)
+    {
+      return Integer.signum(o1.getBegin() - o2.getBegin());
+    }
+  };
+
+  /**
+   * a comparator for sorting intervals by end position descending
+   */
+  static Comparator<? super IntervalI> REVERSE_STRAND = new Comparator<IntervalI>()
+  {
+    @Override
+    public int compare(IntervalI o1, IntervalI o2)
+    {
+      return Integer.signum(o2.getEnd() - o1.getEnd());
+    }
+  };
+
+  static int NOT_CONTAINED = Integer.MIN_VALUE;
+  static int CONTAINMENT_UNKNOWN = 0;
+
+  int getBegin();
+  int getEnd();
+
+  /**
+   * Answers true if this interval contains (or matches) the given interval
+   * based solely on start and end.
+   * 
+   * @param i
+   * @return
+   */
+  default boolean containsInterval(IntervalI i)
+  {
+    return i != null && i.getBegin() >= getBegin()
+            && i.getEnd() <= getEnd();
+  }
+
+
+  /**
+   * Answers true if this interval properly contains the given interval, that
+   * is, it contains it and is larger than it
+   * 
+   * @param i
+   * @return
+   */
+  default boolean properlyContainsInterval(IntervalI i)
+  {
+    return containsInterval(i)
+            && (i.getBegin() > getBegin() || i.getEnd() < getEnd());
+  }
+
+  /**
+   * Slower than equalsInterval; also includes type.
+   * 
+   * Ensure that subclasses override equals(Object). For example:
+   * 
+   * public boolean equals(Object o) { return o != null && o instanceof XXX &&
+   * equalsInterval((XXX) i); }
+   * 
+   * 
+   * equalsInterval also must be overridden.
+   * 
+   * public boolean equalsInterval(IntervalI i) {return ((SimpleFeature)i).start
+   * == start && ((SimpleFeature)i).end == end && ((SimpleFeature)i).description
+   * == this.description; }
+   * 
+   * 
+   * @param o
+   * @return true if equal, including a type check
+   */
+  @Override
+  abstract boolean equals(Object o);
+
+
+
+  /**
+   * Check that two intervals are equal, in terms of end points, descriptions,
+   * or any other distinguishing features.
+   * 
+   * Used in IntervalStore in searches, since it is faster than equals(), as at
+   * that point we know that we have the correct type.
+   * 
+   * @param i
+   * @return true if equal
+   */
+  abstract boolean equalsInterval(IntervalI i);
+
+  default boolean overlapsInterval(IntervalI i)
+  {
+    if (i == null)
+    {
+      return false;
+    }
+    if (i.getBegin() < getBegin())
+    {
+      return i.getEnd() >= getBegin();
+    }
+    if (i.getEnd() > getEnd())
+    {
+      return i.getBegin() <= getEnd();
+    }
+    return true; // i internal to this
+  }
+
+  /**
+   * Sorts the list by start position ascending (if forwardString==true), or by
+   * end position descending
+   * 
+   * @param intervals
+   * @param forwardStrand
+   */
+  static void sortIntervals(List<? extends IntervalI> intervals,
+          final boolean forwardStrand)
+  {
+    Collections.sort(intervals,
+            forwardStrand ? FORWARD_STRAND : REVERSE_STRAND);
+  }
+
+
+}
diff --git a/src/intervalstore/api/IntervalStoreI.java b/src/intervalstore/api/IntervalStoreI.java
new file mode 100644 (file)
index 0000000..3b0f575
--- /dev/null
@@ -0,0 +1,96 @@
+/*
+BSD 3-Clause License
+
+Copyright (c) 2018, Mungo Carstairs
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+  list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+  this list of conditions and the following disclaimer in the documentation
+  and/or other materials provided with the distribution.
+
+* Neither the name of the copyright holder nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+package intervalstore.api;
+
+import java.util.Collection;
+import java.util.List;
+
+import intervalstore.impl.NCList;
+
+public interface IntervalStoreI<T extends IntervalI> extends Collection<T>
+{
+
+  /**
+   * Returns a (possibly empty) list of items whose extent overlaps the given
+   * range
+   * 
+   * @param from
+   *          start of overlap range (inclusive)
+   * @param to
+   *          end of overlap range (inclusive)
+   * @return
+   */
+  List<T> findOverlaps(long from, long to);
+
+  /**
+   * Ensures that the IntervalStore is ready for findOverlap.
+   * 
+   * @return true iff the data held satisfy the rules of construction of an
+   *         IntervalStore.
+   * 
+   */
+  boolean isValid();
+
+  /**
+   * Answers the level of nesting of intervals in the store, as
+   * <ul>
+   * <li>0 if the store is empty</li>
+   * <li>1 if all intervals are 'top level' (non nested)</li>
+   * <li>else 1 plus the depth of the enclosed NCList</li>
+   * </ul>
+   * 
+   * @return
+   * @see NCList#getDepth()
+   */
+  int getDepth();
+
+  /**
+   * Return the number of top-level (not-contained) intervals.
+   * 
+   * @return
+   */
+  int getWidth();
+
+  List<T> findOverlaps(long start, long end, List<T> result);
+
+  String prettyPrint();
+
+  /**
+   * Resort and rebuild links.
+   * 
+   * @return
+   */
+  boolean revalidate();
+
+  IntervalI get(int i);
+
+}
\ No newline at end of file
diff --git a/src/intervalstore/impl/BinarySearcher.java b/src/intervalstore/impl/BinarySearcher.java
new file mode 100644 (file)
index 0000000..1086e91
--- /dev/null
@@ -0,0 +1,91 @@
+/*
+BSD 3-Clause License
+
+Copyright (c) 2018, Mungo Carstairs
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+  list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+  this list of conditions and the following disclaimer in the documentation
+  and/or other materials provided with the distribution.
+
+* Neither the name of the copyright holder nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+package intervalstore.impl;
+
+import java.util.List;
+import java.util.function.Function;
+
+/**
+ * Provides a method to perform binary search of an ordered list for the first
+ * entry that satisfies a supplied condition
+ * 
+ * @author gmcarstairs
+ */
+public final class BinarySearcher
+{
+  private BinarySearcher()
+  {
+  }
+
+  /**
+   * Performs a binary search of the list to find the index of the first entry
+   * for which the test returns true. Answers the length of the list if there is
+   * no such entry.
+   * <p>
+   * For correct behaviour, the provided list must be ordered consistent with
+   * the test, that is, any entries returning false must precede any entries
+   * returning true. Note that this means that this method is <em>not</em>
+   * usable to search for equality (to find a specific entry), as all unequal
+   * entries will answer false to the test. To do that, use
+   * <code>Collections.binarySearch</code> instead.
+   * 
+   * @param list
+   * @param test
+   * @return
+   * @see java.util.Collections#binarySearch(List, Object)
+   */
+  public static <T> int findFirst(List<? extends T> list,
+          Function<T, Boolean> test)
+  {
+    int start = 0;
+    int end = list.size() - 1;
+    int matched = list.size();
+  
+    while (start <= end)
+    {
+      int mid = (start + end) / 2;
+      T entry = list.get(mid);
+      boolean itsTrue = test.apply(entry);
+      if (itsTrue)
+      {
+        matched = mid;
+        end = mid - 1;
+      }
+      else
+      {
+        start = mid + 1;
+      }
+    }
+  
+    return matched;
+  }
+}
diff --git a/src/intervalstore/impl/IntervalStore.java b/src/intervalstore/impl/IntervalStore.java
new file mode 100644 (file)
index 0000000..8634ad4
--- /dev/null
@@ -0,0 +1,543 @@
+/*
+BSD 3-Clause License
+
+Copyright (c) 2018, Mungo Carstairs
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+  list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+  this list of conditions and the following disclaimer in the documentation
+  and/or other materials provided with the distribution.
+
+* Neither the name of the copyright holder nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+package intervalstore.impl;
+
+import java.util.AbstractCollection;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.NoSuchElementException;
+
+import intervalstore.api.IntervalI;
+import intervalstore.api.IntervalStoreI;
+
+/**
+ * A collection class to store interval-associated data, with O(log N)
+ * performance for overlap queries, insertion and deletion (where N is the size
+ * of the store). Accepts duplicate entries but not null values.
+ * 
+ * @author gmcarstairs
+ *
+ * @param <T>
+ *          any type providing <code>getBegin()</code> and <code>getEnd()</code>
+ */
+public class IntervalStore<T extends IntervalI>
+        extends AbstractCollection<T> implements IntervalStoreI<T>
+{
+  /**
+   * An iterator over the intervals held in this store, with no particular
+   * ordering guaranteed. The iterator does not support the optional
+   * <code>remove</code> operation (throws
+   * <code>UnsupportedOperationException</code> if attempted).
+   * 
+   * @author gmcarstairs
+   *
+   * @param <V>
+   */
+  private class IntervalIterator<V extends IntervalI> implements Iterator<V>
+  {
+    /*
+     * iterator over top level non-nested intervals
+     */
+    Iterator<? extends IntervalI> topLevelIterator;
+
+    /*
+     * iterator over NCList (if any)
+     */
+    Iterator<? extends IntervalI> nestedIterator;
+
+    /**
+     * Constructor initialises iterators over the top level list and any nested
+     * NCList
+     * 
+     * @param intervalStore
+     */
+    public IntervalIterator(
+            IntervalStore<? extends IntervalI> intervalStore)
+    {
+      topLevelIterator = nonNested.iterator();
+      if (nested != null)
+      {
+        nestedIterator = nested.iterator();
+      }
+    }
+
+    @Override
+    public boolean hasNext()
+    {
+      return topLevelIterator.hasNext() ? true
+              : (nestedIterator != null && nestedIterator.hasNext());
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public V next()
+    {
+      if (topLevelIterator.hasNext())
+      {
+        return (V) topLevelIterator.next();
+      }
+      if (nestedIterator != null)
+      {
+        return (V) nestedIterator.next();
+      }
+      throw new NoSuchElementException();
+    }
+
+  }
+
+  private List<T> nonNested;
+
+  private NCList<T> nested;
+
+  /**
+   * Constructor
+   */
+  public IntervalStore()
+  {
+    nonNested = new ArrayList<>();
+  }
+
+  /**
+   * Constructor given a list of intervals. Note that the list may get sorted as
+   * a side-effect of calling this constructor.
+   */
+  public IntervalStore(List<T> intervals)
+  {
+    this();
+
+    /*
+     * partition into subranges whose root intervals
+     * have no mutual containment (if no intervals are nested,
+     * each subrange is of length 1 i.e. a single interval)
+     */
+    List<IntervalI> sublists = new NCListBuilder<T>()
+            .partitionNestedSublists(intervals);
+
+    /*
+     * add all 'subrange root intervals' (and any co-located intervals)
+     * to our top level list of 'non-nested' intervals; 
+     * put aside any left over for our NCList
+     */
+    List<T> nested = new ArrayList<>();
+
+    for (IntervalI subrange : sublists)
+    {
+      int listIndex = subrange.getBegin();
+      IntervalI root = intervals.get(listIndex);
+      while (listIndex <= subrange.getEnd())
+      {
+        T t = intervals.get(listIndex);
+        if (root.equalsInterval(t))
+        {
+          nonNested.add(t);
+        }
+        else
+        {
+          nested.add(t);
+        }
+        listIndex++;
+      }
+    }
+
+    if (!nested.isEmpty())
+    {
+      this.nested = new NCList<>(nested);
+    }
+  }
+
+  /**
+   * Adds one interval to the store.
+   * 
+   * @param interval
+   */
+  @Override
+  public boolean add(T interval)
+  {
+    if (interval == null)
+    {
+      return false;
+    }
+    if (!addNonNestedInterval(interval))
+    {
+      /*
+       * detected a nested interval - put it in the NCList structure
+       */
+      addNestedInterval(interval);
+    }
+    return true;
+  }
+
+  @Override
+  public boolean contains(Object entry)
+  {
+    if (listContains(nonNested, entry))
+    {
+      return true;
+    }
+
+    return nested == null ? false : nested.contains(entry);
+  }
+
+  protected boolean addNonNestedInterval(T entry)
+  {
+    synchronized (nonNested)
+    {
+      /*
+       * find the first stored interval which doesn't precede the new one
+       */
+      int insertPosition = BinarySearcher.findFirst(nonNested,
+              val -> val.getBegin() >= entry.getBegin());
+      /*
+       * fail if we detect interval enclosure 
+       * - of the new interval by the one before or after it
+       * - of the next interval by the new one
+       */
+      if (insertPosition > 0)
+      {
+        if (nonNested.get(insertPosition - 1).properlyContainsInterval(entry))
+        {
+          return false;
+        }
+      }
+      if (insertPosition < nonNested.size())
+      {
+        T following = nonNested.get(insertPosition);
+        if (entry.properlyContainsInterval(following)
+                || following.properlyContainsInterval(entry))
+        {
+          return false;
+        }
+      }
+
+      /*
+       * checks passed - add the interval
+       */
+      nonNested.add(insertPosition, entry);
+
+      return true;
+    }
+  }
+
+  @Override
+  public List<T> findOverlaps(long from, long to)
+  {
+    List<T> result = new ArrayList<>();
+
+    findNonNestedOverlaps(from, to, result);
+
+    if (nested != null)
+    {
+      result.addAll(nested.findOverlaps(from, to));
+    }
+
+    return result;
+  }
+
+  @Override
+  public String prettyPrint()
+  {
+    String pp = nonNested.toString();
+    if (nested != null)
+    {
+      pp += System.lineSeparator() + nested.prettyPrint();
+    }
+    return pp;
+  }
+
+  @Override
+  public boolean isValid()
+  {
+    for (int i = 0; i < nonNested.size() - 1; i++)
+    {
+      IntervalI i1 = nonNested.get(i);
+      IntervalI i2 = nonNested.get(i + 1);
+
+      if (i2.getBegin() < i1.getBegin())
+      {
+        System.err.println("nonNested wrong start order : " + i1.toString()
+                + ", " + i2.toString());
+        return false;
+      }
+      if (i1.properlyContainsInterval(i2)
+              || i2.properlyContainsInterval(i1))
+      {
+        System.err.println("nonNested invalid containment!: "
+                + i1.toString()
+                + ", " + i2.toString());
+        return false;
+      }
+    }
+    return nested == null ? true : nested.isValid();
+  }
+
+  @Override
+  public int size()
+  {
+    int i = nonNested.size();
+    if (nested != null)
+    {
+      i += nested.size();
+    }
+    return i;
+  }
+
+  @Override
+  public synchronized boolean remove(Object o)
+  {
+    if (o == null)
+    {
+      return false;
+    }
+    try
+    {
+      @SuppressWarnings("unchecked")
+      T entry = (T) o;
+
+      /*
+       * try the non-nested positional intervals first
+       */
+      boolean removed = removeNonNested(entry);
+
+      /*
+       * if not found, try nested intervals
+       */
+      if (!removed && nested != null)
+      {
+        removed = nested.remove(entry);
+      }
+
+      return removed;
+    } catch (ClassCastException e)
+    {
+      return false;
+    }
+  }
+
+  /**
+   * Removes the given entry from the list of non-nested entries, returning true
+   * if found and removed, or false if not found. Specifically, removes the
+   * first item in the list for which <code>item.equals(entry)</code>.
+   * 
+   * @param entry
+   * @return
+   */
+  protected boolean removeNonNested(T entry)
+  {
+    /*
+     * find the first interval that might match, i.e. whose 
+     * start position is not less than the target range start
+     * (NB inequality test ensures the first match if any is found)
+     */
+    int startIndex = BinarySearcher.findFirst(nonNested,
+            val -> val.getBegin() >= entry.getBegin());
+
+    /*
+     * traverse intervals to look for a match
+     */
+    int from = entry.getBegin();
+    int i = startIndex;
+    int size = nonNested.size();
+    while (i < size)
+    {
+      T sf = nonNested.get(i);
+      if (sf.getBegin() > from)
+      {
+        break;
+      }
+      if (sf.equals(entry))
+      {
+        nonNested.remove(i);
+        return true;
+      }
+      i++;
+    }
+    return false;
+  }
+
+  @Override
+  public int getDepth()
+  {
+    if (size() == 0)
+    {
+      return 0;
+    }
+    return (nonNested.isEmpty() ? 0 : 1)
+            + (nested == null ? 0 : nested.getDepth());
+  }
+
+  /**
+   * Adds one interval to the NCList that can manage nested intervals (creating
+   * the NCList if necessary)
+   */
+  protected synchronized void addNestedInterval(T interval)
+  {
+    if (nested == null)
+    {
+      nested = new NCList<>();
+    }
+    nested.add(interval);
+  }
+
+  /**
+   * Answers true if the list contains the interval, else false. This method is
+   * optimised for the condition that the list is sorted on interval start
+   * position ascending, and will give unreliable results if this does not hold.
+   * 
+   * @param intervals
+   * @param entry
+   * @return
+   */
+  protected boolean listContains(List<T> intervals, Object entry)
+  {
+    if (intervals == null || entry == null || !(entry instanceof IntervalI))
+    {
+      return false;
+    }
+
+    IntervalI interval = (IntervalI) entry;
+
+    /*
+     * locate the first entry in the list which does not precede the interval
+     */
+    int pos = BinarySearcher.findFirst(intervals,
+            val -> val.getBegin() >= interval.getBegin());
+    int len = intervals.size();
+    while (pos < len)
+    {
+      T sf = intervals.get(pos);
+      if (sf.getBegin() > interval.getBegin())
+      {
+        return false; // no match found
+      }
+      if (sf.equals(interval))
+      {
+        return true;
+      }
+      pos++;
+    }
+    return false;
+  }
+
+  /**
+   * Answers an iterator over the intervals in the store, with no particular
+   * ordering guaranteed. The iterator does not support the optional
+   * <code>remove</code> operation (throws
+   * <code>UnsupportedOperationException</code> if attempted).
+   */
+  @Override
+  public Iterator<T> iterator()
+  {
+    return new IntervalIterator<>(this);
+  }
+
+  @Override
+  public void clear()
+  {
+    this.nonNested.clear();
+    this.nested = new NCList<>();
+  }
+
+  /**
+   * Adds non-nested intervals to the result list that lie within the target
+   * range
+   * 
+   * @param from
+   * @param to
+   * @param result
+   */
+  protected void findNonNestedOverlaps(long from, long to,
+          List<T> result)
+  {
+    /*
+     * find the first interval whose end position is
+     * after the target range start
+     */
+    int startIndex = BinarySearcher.findFirst(nonNested,
+            val -> val.getEnd() >= from);
+
+    final int startIndex1 = startIndex;
+    int i = startIndex1;
+    while (i < nonNested.size())
+    {
+      T sf = nonNested.get(i);
+      if (sf.getBegin() > to)
+      {
+        break;
+      }
+      if (sf.getBegin() <= to && sf.getEnd() >= from)
+      {
+        result.add(sf);
+      }
+      i++;
+    }
+  }
+
+  @Override
+  public String toString()
+  {
+    String s = nonNested.toString();
+    if (nested != null)
+    {
+      s = s + System.lineSeparator() + nested.toString();
+    }
+    return s;
+  }
+
+  @Override
+  public int getWidth()
+  {
+    // TODO Auto-generated method stub
+    return 0;
+  }
+
+  @Override
+  public List<T> findOverlaps(long start, long end, List<T> result)
+  {
+    // TODO Auto-generated method stub
+    return null;
+  }
+
+  @Override
+  public boolean revalidate()
+  {
+    // TODO Auto-generated method stub
+    return false;
+  }
+
+  @Override
+  public IntervalI get(int i)
+  {
+    // TODO Auto-generated method stub
+    return null;
+  }
+}
diff --git a/src/intervalstore/impl/NCList.java b/src/intervalstore/impl/NCList.java
new file mode 100644 (file)
index 0000000..0bf6e1b
--- /dev/null
@@ -0,0 +1,752 @@
+/*
+BSD 3-Clause License
+
+Copyright (c) 2018, Mungo Carstairs
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+  list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+  this list of conditions and the following disclaimer in the documentation
+  and/or other materials provided with the distribution.
+
+* Neither the name of the copyright holder nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+package intervalstore.impl;
+
+import java.util.AbstractCollection;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.NoSuchElementException;
+
+import intervalstore.api.IntervalI;
+import intervalstore.impl.Range;
+
+/**
+ * An adapted implementation of NCList as described in the paper
+ * 
+ * <pre>
+ * Nested Containment List (NCList): a new algorithm for accelerating
+ * interval query of genome alignment and interval databases
+ * - Alexander V. Alekseyenko, Christopher J. Lee
+ * https://doi.org/10.1093/bioinformatics/btl647
+ * </pre>
+ */
+public class NCList<T extends IntervalI> extends AbstractCollection<T>
+{
+  /**
+   * A depth-first iterator over the elements stored in the NCList
+   */
+  private class NCListIterator implements Iterator<T>
+  {
+    int subrangeIndex;
+
+    Iterator<T> nodeIterator;
+
+    /**
+     * Constructor bootstraps a pointer to an iterator over the first subrange
+     * (if any)
+     */
+    NCListIterator()
+    {
+      subrangeIndex = nextSubrange(-1);
+    }
+
+    /**
+     * Moves the subrange iterator to the next subrange, and answers its index
+     * in the list of subranges. If there are no more, sets the iterator to null
+     * and answers -1.
+     * 
+     * @return
+     */
+    private int nextSubrange(int after)
+    {
+      int nextIndex = after + 1;
+      if (nextIndex < subranges.size())
+      {
+        nodeIterator = subranges.get(nextIndex).iterator();
+        return nextIndex;
+      }
+      nodeIterator = null;
+      return -1;
+    }
+
+    @Override
+    public boolean hasNext()
+    {
+      return nodeIterator != null && nodeIterator.hasNext();
+    }
+
+    /**
+     * Answers the next element returned by the current NCNode's iterator, and
+     * advances the iterator (to the next NCNode if necessary)
+     */
+    @Override
+    public T next()
+    {
+      if (nodeIterator == null || !nodeIterator.hasNext())
+      {
+        throw new NoSuchElementException();
+      }
+      T result = nodeIterator.next();
+
+      if (!nodeIterator.hasNext())
+      {
+        subrangeIndex = nextSubrange(subrangeIndex);
+      }
+      return result;
+    }
+
+  }
+
+  /*
+   * the number of interval instances represented
+   */
+  private int size;
+
+  /*
+   * a list, in start position order, of sublists of ranges ordered so 
+   * that each contains (or is the same as) the one that follows it
+   */
+  private List<NCNode<T>> subranges;
+
+  /**
+   * Constructor given a list of things that are each located on a contiguous
+   * interval. Note that the constructor may reorder the list.
+   * <p>
+   * We assume here that for each range, start &lt;= end. Behaviour for reverse
+   * ordered ranges is undefined.
+   * 
+   * @param ranges
+   */
+  public NCList(List<T> ranges)
+  {
+    this();
+    build(ranges);
+  }
+
+  /**
+   * Sorts and groups ranges into sublists where each sublist represents an
+   * interval and its contained subintervals
+   * 
+   * @param ranges
+   */
+  protected void build(List<T> ranges)
+  {
+    /*
+     * sort and partition into subranges 
+     * which have no mutual containment
+     */
+    List<IntervalI> sublists = partitionNestedSublists(ranges);
+
+    /*
+     * convert each subrange to an NCNode consisting of a range and
+     * (possibly) its contained NCList
+     */
+    for (IntervalI sublist : sublists)
+    {
+      subranges.add(new NCNode<>(
+              ranges.subList(sublist.getBegin(), sublist.getEnd() + 1)));
+    }
+
+    size = ranges.size();
+  }
+
+  /**
+   * Default constructor
+   */
+  public NCList()
+  {
+    subranges = new ArrayList<>();
+  }
+
+  /**
+   * Sorts and traverses the ranges to identify sublists, whose start intervals
+   * are overlapping or disjoint but not mutually contained. Answers a list of
+   * start-end indices of the sorted list of ranges.
+   * 
+   * @param ranges
+   * @return
+   */
+  protected List<IntervalI> partitionNestedSublists(List<T> ranges)
+  {
+    List<IntervalI> sublists = new ArrayList<>();
+
+    if (ranges.isEmpty())
+    {
+      return sublists;
+    }
+
+    /*
+     * sort by start ascending, length descending, so that
+     * contained intervals follow their containing interval
+     */
+    Collections.sort(ranges, new NCListBuilder<>().getComparator());
+
+    int listStartIndex = 0;
+
+    IntervalI lastParent = ranges.get(0);
+    boolean first = true;
+
+    for (int i = 0; i < ranges.size(); i++)
+    {
+      IntervalI nextInterval = ranges.get(i);
+      if (!first && !lastParent.properlyContainsInterval(nextInterval))
+      {
+        /*
+         * this interval is not properly contained in the parent; 
+         * close off the last sublist
+         */
+        sublists.add(new Range(listStartIndex, i - 1));
+        listStartIndex = i;
+        lastParent = nextInterval;
+      }
+      first = false;
+    }
+
+    sublists.add(new Range(listStartIndex, ranges.size() - 1));
+    return sublists;
+  }
+
+  /**
+   * Adds one entry to the stored set
+   * 
+   * @param entry
+   */
+  @Override
+  public synchronized boolean add(final T entry)
+  {
+    final NCNode<T> newNode = new NCNode<>(entry);
+    addNode(newNode);
+    return true;
+  }
+
+  /**
+   * Adds one NCNode to this NCList
+   * <p>
+   * This method does not update the <code>size</code> (interval count) of this
+   * NCList, as it may be used to rearrange nodes without changing their count.
+   * Callers should increment the count if needed.
+   * 
+   * @param newNode
+   */
+  protected void addNode(final NCNode<T> newNode)
+  {
+    final long start = newNode.getBegin();
+    final long end = newNode.getEnd();
+    size += newNode.size();
+
+    /*
+     * cases:
+     * 1) precedes all subranges - add as NCNode on front of list
+     * 2) follows all subranges - add as NCNode on end of list
+     * 3) matches a subrange - add as a sibling in the list
+     * 4) properly enclosed by a subrange - add recursively to subrange
+     * 5) properly encloses one or more subranges - push them inside it
+     * 6) spans two subranges - insert between them
+     */
+
+    /*
+     * find the first subrange whose end does not precede entry's start
+     */
+    int candidateIndex = findFirstOverlap(start);
+
+    /*
+     * search for maximal span of subranges i-k that the new entry
+     * encloses; or a subrange that encloses the new entry
+     */
+    boolean enclosing = false;
+    int firstEnclosed = 0;
+    int lastEnclosed = 0;
+
+    for (int j = candidateIndex; j < subranges.size(); j++)
+    {
+      NCNode<T> subrange = subranges.get(j);
+
+      if (subrange.equalsInterval(newNode))
+      {
+        /*
+         * matching interval - insert adjacent
+         */
+        subranges.add(j, newNode);
+        return;
+      }
+
+      if (end < subrange.getBegin() && !enclosing)
+      {
+        /*
+         * new entry lies between subranges j-1 j
+         */
+        subranges.add(j, newNode);
+        return;
+      }
+
+      if (subrange.properlyContainsInterval(newNode))
+      {
+        /*
+         * push new entry inside this subrange as it encloses it
+         */
+        subrange.addNode(newNode);
+        return;
+      }
+
+      if (start <= subrange.getBegin())
+      {
+        if (end >= subrange.getEnd())
+        {
+          /*
+           * new entry encloses this subrange (and possibly preceding ones);
+           * continue to find the maximal list it encloses
+           */
+          if (!enclosing)
+          {
+            firstEnclosed = j;
+          }
+          lastEnclosed = j;
+          enclosing = true;
+          continue;
+        }
+        else
+        {
+          /*
+           * entry spans from before this subrange to inside it
+           */
+          if (enclosing)
+          {
+            /*
+             * entry encloses one or more preceding subranges
+             */
+            push(newNode, firstEnclosed, lastEnclosed);
+          }
+          else
+          {
+            /*
+             * entry overlaps two subranges but doesn't enclose either
+             * so just add it 
+             */
+            subranges.add(j, newNode);
+          }
+          return;
+        }
+      }
+    }
+
+    /*
+     * drops through to here if new range encloses all others
+     * or overlaps the last one
+     */
+    if (enclosing)
+    {
+      push(newNode, firstEnclosed, lastEnclosed);
+    }
+    else
+    {
+      subranges.add(newNode);
+    }
+  }
+
+  @Override
+  public boolean contains(Object entry)
+  {
+    if (!(entry instanceof IntervalI))
+    {
+      return false;
+    }
+    IntervalI interval = (IntervalI) entry;
+
+    /*
+     * find the first sublist that might overlap, i.e. 
+     * the first whose end position is >= from
+     */
+    int candidateIndex = findFirstOverlap(interval.getBegin());
+
+    int to = interval.getEnd();
+
+    for (int i = candidateIndex; i < subranges.size(); i++)
+    {
+      NCNode<T> candidate = subranges.get(i);
+      if (candidate.getBegin() > to)
+      {
+        /*
+         * we are past the end of our target range
+         */
+        break;
+      }
+      if (candidate.contains(interval))
+      {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Update the tree so that the new node encloses current subranges i to j
+   * (inclusive). That is, replace subranges i-j (inclusive) with a new subrange
+   * that contains them.
+   * 
+   * @param node
+   * @param i
+   * @param j
+   * @throws IllegalArgumentException
+   *           if any of the subranges is not contained by the node's start-end
+   *           range
+   */
+  protected synchronized void push(NCNode<T> node, final int i,
+          final int j)
+  {
+    for (int k = i; k <= j; k++)
+    {
+      NCNode<T> n = subranges.get(k);
+      if (!node.containsInterval(n)) {
+        throw new IllegalArgumentException("Can't push " + n.toString()
+                + " inside " + node.toString());
+      }
+      node.addNode(n);
+    }
+
+    for (int k = j; k >= i; k--)
+    {
+      subranges.remove(k);
+    }
+    subranges.add(i, node);
+  }
+
+  /**
+   * Answers a list of contained intervals that overlap the given range
+   * 
+   * @param from
+   * @param to
+   * @return
+   */
+  public List<T> findOverlaps(long from, long to)
+  {
+    List<T> result = new ArrayList<>();
+
+    findOverlaps(from, to, result);
+
+    return result;
+  }
+
+  /**
+   * Recursively searches the NCList adding any items that overlap the from-to
+   * range to the result list
+   * 
+   * @param from
+   * @param to
+   * @param result
+   */
+  protected void findOverlaps(long from, long to, List<T> result)
+  {
+    /*
+     * find the first sublist that might overlap, i.e. 
+     * the first whose end position is >= from
+     */
+    int candidateIndex = findFirstOverlap(from);
+
+    for (int i = candidateIndex; i < subranges.size(); i++)
+    {
+      NCNode<T> candidate = subranges.get(i);
+      if (candidate.getBegin() > to)
+      {
+        /*
+         * we are past the end of our target range
+         */
+        break;
+      }
+      candidate.findOverlaps(from, to, result);
+    }
+
+  }
+
+  /**
+   * Search subranges for the first one whose end position is not before the
+   * target range's start position, i.e. the first one that may overlap the
+   * target range. Returns the index in the list of the first such range found,
+   * or the length of the list if none found.
+   * 
+   * @param from
+   * @return
+   */
+  protected int findFirstOverlap(final long from)
+  {
+    return BinarySearcher.findFirst(subranges,
+            val -> val.getEnd() >= from);
+  }
+
+  /**
+   * Formats the tree as a bracketed list e.g.
+   * 
+   * <pre>
+   * [1-100 [10-30 [10-20]], 15-30 [20-20]]
+   * </pre>
+   */
+  @Override
+  public String toString()
+  {
+    return subranges.toString();
+  }
+
+  /**
+   * Answers the NCList as an indented list
+   * 
+   * @return
+   */
+  public String prettyPrint()
+  {
+    StringBuilder sb = new StringBuilder(512);
+    int offset = 0;
+    int indent = 2;
+    prettyPrint(sb, offset, indent);
+    sb.append(System.lineSeparator());
+    return sb.toString();
+  }
+
+  /**
+   * @param sb
+   * @param offset
+   * @param indent
+   */
+  void prettyPrint(StringBuilder sb, int offset, int indent)
+  {
+    boolean first = true;
+    for (NCNode<T> subrange : subranges)
+    {
+      if (!first)
+      {
+        sb.append(System.lineSeparator());
+      }
+      first = false;
+      subrange.prettyPrint(sb, offset, indent);
+    }
+  }
+
+  /**
+   * Answers true if the store's structure is valid (nesting containment rules
+   * are obeyed), else false. For use in testing and debugging.
+   * 
+   * @return
+   */
+  public boolean isValid()
+  {
+    int count = 0;
+    for (NCNode<T> subrange : subranges)
+    {
+      count += subrange.size();
+    }
+    if (count != size)
+    {
+      return false;
+    }
+    return isValid(Integer.MIN_VALUE, Integer.MAX_VALUE);
+  }
+
+  /**
+   * Answers true if the data held satisfy the rules of construction of an
+   * NCList bounded within the given start-end range, else false.
+   * <p>
+   * Each subrange must lie within start-end (inclusive). Subranges must be
+   * ordered by start position ascending, and within that by end position
+   * descending.
+   * <p>
+   * 
+   * @param start
+   * @param end
+   * @return
+   */
+  boolean isValid(final int start, final int end)
+  {
+    NCNode<T> lastRange = null;
+
+    for (NCNode<T> subrange : subranges)
+    {
+      if (subrange.getBegin() < start)
+      {
+        System.err.println("error in NCList: range " + subrange.toString()
+                + " starts before " + end);
+        return false;
+      }
+      if (subrange.getEnd() > end)
+      {
+        System.err.println("error in NCList: range " + subrange.toString()
+                + " ends after " + end);
+        return false;
+      }
+
+      if (lastRange != null)
+      {
+        if (subrange.getBegin() < lastRange.getBegin())
+        {
+          System.err.println("error in NCList: range " + subrange.toString()
+                  + " starts before " + lastRange.toString());
+          return false;
+        }
+        if (subrange.properlyContainsInterval(lastRange))
+        {
+          System.err.println("error in NCList: range " + subrange.toString()
+                  + " encloses preceding: " + lastRange.toString());
+          return false;
+        }
+        if (lastRange.properlyContainsInterval(subrange))
+        {
+          System.err.println("error in NCList: range " + subrange.toString()
+                  + " enclosed by preceding: " + lastRange.toString());
+          return false;
+        }
+      }
+      lastRange = subrange;
+
+      if (!subrange.isValid())
+      {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  /**
+   * Answers the number of intervals stored
+   * 
+   * @return
+   */
+  @Override
+  public int size()
+  {
+    return size;
+  }
+
+  /**
+   * Answers a list of all entries stored, in no guaranteed order. This method
+   * is not synchronized, so is not thread-safe.
+   */
+  public List<T> getEntries()
+  {
+    List<T> result = new ArrayList<>();
+    getEntries(result);
+    return result;
+  }
+
+  /**
+   * Adds all contained entries to the given list
+   * 
+   * @param result
+   */
+  void getEntries(List<T> result)
+  {
+    for (NCNode<T> subrange : subranges)
+    {
+      subrange.getEntries(result);
+    }
+  }
+
+  /**
+   * Removes the first interval <code>I</code>found that is equal to T
+   * (<code>I.equals(T)</code>). Answers true if an interval is removed, false
+   * if no match is found. This method is synchronized so thread-safe.
+   * 
+   * @param entry
+   * @return
+   */
+  public synchronized boolean remove(T entry)
+  {
+    if (entry == null)
+    {
+      return false;
+    }
+    int i = findFirstOverlap(entry.getBegin());
+
+    for (; i < subranges.size(); i++)
+    {
+      NCNode<T> subrange = subranges.get(i);
+      if (subrange.getBegin() > entry.getBegin())
+      {
+        /*
+         * not found
+         */
+        return false;
+      }
+      NCList<T> subRegions = subrange.getSubRegions();
+
+      if (subrange.getRegion().equals(entry))
+      {
+        /*
+         * if the subrange is rooted on this entry, remove it,
+         * and remove and promote its subregions (if any)  
+         */
+        subranges.remove(i);
+        size -= subrange.size();
+        if (subRegions != null)
+        {
+          for (NCNode<T> r : subRegions.subranges)
+          {
+            addNode(r);
+          }
+        }
+        return true;
+      }
+      else
+      {
+        if (subrange.remove(entry))
+        {
+          size--;
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Answers the depth of interval nesting of this object, where 1 means there
+   * are no nested sub-intervals
+   * 
+   * @return
+   */
+  public int getDepth()
+  {
+    int subDepth = 0;
+    for (NCNode<T> subrange : subranges)
+    {
+      subDepth = Math.max(subDepth, subrange.getDepth());
+    }
+
+    return subDepth;
+  }
+
+  /**
+   * Answers an iterator over the contained intervals, with no particular order
+   * guaranteed. The iterator does not support the optional <code>remove</code>
+   * operation (throws <code>UnsupportedOperationException</code> if attempted).
+   */
+  @Override
+  public Iterator<T> iterator()
+  {
+    return new NCListIterator();
+  }
+
+  @Override
+  public synchronized void clear()
+  {
+    subranges.clear();
+    size = 0;
+  }
+}
diff --git a/src/intervalstore/impl/NCListBuilder.java b/src/intervalstore/impl/NCListBuilder.java
new file mode 100644 (file)
index 0000000..4c87306
--- /dev/null
@@ -0,0 +1,143 @@
+/*
+BSD 3-Clause License
+
+Copyright (c) 2018, Mungo Carstairs
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+  list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+  this list of conditions and the following disclaimer in the documentation
+  and/or other materials provided with the distribution.
+
+* Neither the name of the copyright holder nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+package intervalstore.impl;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import intervalstore.api.IntervalI;
+import intervalstore.impl.Range;
+
+/**
+ * A comparator that orders ranges by either start position ascending. If
+ * position matches, ordering is by length descending. This provides the
+ * canonical ordering of intervals into subranges in order to build a nested
+ * containment list.
+ * 
+ * @author gmcarstairs
+ */
+public class NCListBuilder<T extends IntervalI>
+{
+  class NCListComparator<V extends IntervalI> implements Comparator<V>
+  {
+    /**
+     * Compares two intervals in a way that will sort a list by start position
+     * ascending, then by length descending. Answers
+     * <ul>
+     * <li>a negative value if o1.begin < o2.begin</li>
+     * <li>else a positive value if o1.begin > o2.begin</li>
+     * <li>else a negative value if o1.end > o2.end</li>
+     * <li>else a positive value of o1.end < o2.end</li>
+     * <li>else zero</li
+     * </ul>
+     */
+    @Override
+    public int compare(V o1, V o2)
+    {
+      int order = Integer.compare(o1.getBegin(), o2.getBegin());
+      if (order == 0)
+      {
+        /*
+         * if tied on start position, longer length sorts to left
+         * i.e. the negation of normal ordering by length
+         */
+        order = Integer.compare(o2.getEnd(), o1.getEnd());
+      }
+      return order;
+    }
+  }
+
+  private Comparator<T> comparator = new NCListComparator<>();
+  
+  /**
+   * Default constructor
+   */
+  public NCListBuilder()
+  {
+  }
+
+  /**
+   * Answers a comparator which sorts items of type T by start position
+   * ascending, and within that by end position (length) descending)
+   * 
+   * @return
+   */
+  Comparator<T> getComparator()
+  {
+    return comparator;
+  }
+
+  /**
+   * Sorts and traverses the ranges to identify sublists, whose start intervals
+   * are overlapping or disjoint but not mutually contained. Answers a list of
+   * start-end indices of the sorted list of ranges.
+   * 
+   * @param ranges
+   * @return
+   */
+  List<IntervalI> partitionNestedSublists(List<T> ranges)
+  {
+    List<IntervalI> sublists = new ArrayList<>();
+  
+    /*
+     * sort by start ascending, length descending, so that
+     * contained intervals follow their containing interval
+     */
+    Collections.sort(ranges, comparator);
+  
+    int listStartIndex = 0;
+  
+    IntervalI lastParent = ranges.get(0);
+    boolean first = true;
+  
+    for (int i = 0; i < ranges.size(); i++)
+    {
+      IntervalI nextInterval = ranges.get(i);
+      if (!first && !lastParent.properlyContainsInterval(nextInterval))
+      {
+        /*
+         * this interval is not properly contained in the parent; 
+         * close off the last sublist
+         */
+        sublists.add(new Range(listStartIndex, i - 1));
+        listStartIndex = i;
+        lastParent = nextInterval;
+      }
+      first = false;
+    }
+  
+    sublists.add(new Range(listStartIndex, ranges.size() - 1));
+    return sublists;
+  }
+}
diff --git a/src/intervalstore/impl/NCNode.java b/src/intervalstore/impl/NCNode.java
new file mode 100644 (file)
index 0000000..16ae0b7
--- /dev/null
@@ -0,0 +1,381 @@
+/*
+BSD 3-Clause License
+
+Copyright (c) 2018, Mungo Carstairs
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+  list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+  this list of conditions and the following disclaimer in the documentation
+  and/or other materials provided with the distribution.
+
+* Neither the name of the copyright holder nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+package intervalstore.impl;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.NoSuchElementException;
+
+import intervalstore.api.IntervalI;
+
+/**
+ * Each node of the NCList tree consists of a range, and (optionally) the NCList
+ * of ranges it encloses
+ *
+ * @param <T>
+ */
+class NCNode<T extends IntervalI> implements IntervalI
+{
+  /**
+   * A depth-first iterator over the intervals stored in the NCNode. The
+   * optional <code>remove</code> operation is not supported.
+   * 
+   * @author gmcarstairs
+   *
+   */
+  private class NCNodeIterator implements Iterator<T>
+  {
+    boolean first = true;
+    Iterator<T> subregionIterator;
+
+    @Override
+    public boolean hasNext()
+    {
+      return first
+              || (subregionIterator != null && subregionIterator.hasNext());
+    }
+
+    /**
+     * Answers the next interval - initially the top level interval for this
+     * node, thereafter the intervals returned by the NCList's iterator
+     */
+    @Override
+    public T next()
+    {
+      if (first)
+      {
+        subregionIterator = subregions == null ? null
+                : subregions.iterator();
+        first = false;
+        return region;
+      }
+      if (subregionIterator == null || !subregionIterator.hasNext())
+      {
+        throw new NoSuchElementException();
+      }
+      return subregionIterator.next();
+    }
+  }
+
+  private T region;
+
+  /*
+   * null, or an object holding contained subregions of this nodes region
+   */
+  private NCList<T> subregions;
+
+  /**
+   * Constructor given a list of ranges. The list not be empty, and should be
+   * ordered so that the first range contains all the others. If not, behaviour
+   * will likely be invalid.
+   * 
+   * @param ranges
+   * @throws IllegalArgumentException
+   *           if the list is empty
+   */
+  NCNode(List<T> ranges)
+  {
+    if (ranges.isEmpty())
+    {
+      throw new IllegalArgumentException("List may not be empty");
+    }
+    region = ranges.get(0);
+
+    if (ranges.size() > 1)
+    {
+      subregions = new NCList<>(ranges.subList(1, ranges.size()));
+    }
+  }
+
+  /**
+   * Constructor given a single range
+   * 
+   * @param range
+   */
+  NCNode(T range)
+  {
+    region = range;
+  }
+
+  @Override
+  public int getBegin()
+  {
+    return region.getBegin();
+  }
+
+  @Override
+  public int getEnd()
+  {
+    return region.getEnd();
+  }
+
+  /**
+   * Formats the node as a bracketed list e.g.
+   * 
+   * <pre>
+   * [1-100 [10-30 [10-20]], 15-30 [20-20]]
+   * </pre>
+   * 
+   * where the format for each interval is as given by <code>T.toString()</code>
+   */
+  @Override
+  public String toString()
+  {
+    StringBuilder sb = new StringBuilder(10 * size());
+    sb.append(region.toString());
+    if (subregions != null)
+    {
+      sb.append(" ").append(subregions.toString());
+    }
+    return sb.toString();
+  }
+
+  void prettyPrint(StringBuilder sb, int offset, int indent)
+  {
+    for (int i = 0; i < offset; i++)
+    {
+      sb.append(" ");
+    }
+    sb.append(region.toString());
+    if (subregions != null)
+    {
+      sb.append(System.lineSeparator());
+      subregions.prettyPrint(sb, offset + 2, indent);
+    }
+  }
+
+  /**
+   * Add any ranges that overlap the from-to range to the result list
+   * 
+   * @param from
+   * @param to
+   * @param result
+   */
+  void findOverlaps(long from, long to, List<T> result)
+  {
+    if (region.getBegin() <= to && region.getEnd() >= from)
+    {
+      result.add(region);
+      if (subregions != null)
+      {
+        subregions.findOverlaps(from, to, result);
+      }
+    }
+  }
+
+  /**
+   * Add one node to this node's subregions.
+   * 
+   * @param entry
+   * @throws IllegalArgumentException
+   *           if the added node is not contained by the node's start-end range
+   */
+  synchronized void addNode(NCNode<T> entry)
+  {
+    if (!region.containsInterval(entry))
+    {
+      throw new IllegalArgumentException(
+              String.format("adding improper subrange %d-%d to range %d-%d",
+                      entry.getBegin(), entry.getEnd(), region.getBegin(),
+                      region.getEnd()));
+    }
+    if (subregions == null)
+    {
+      subregions = new NCList<>();
+    }
+
+    subregions.addNode(entry);
+  }
+
+  /**
+   * Answers true if the data held satisfy the rules of construction of an
+   * NCList, else false
+   * 
+   * @return
+   */
+  boolean isValid()
+  {
+    /*
+     * we don't handle reverse ranges
+     */
+    if (region != null && region.getBegin() > region.getEnd())
+    {
+      return false;
+    }
+    if (subregions == null)
+    {
+      return true;
+    }
+    if (subregions.isEmpty())
+    {
+      /*
+       * we expect empty subregions to be nulled
+       */
+      return false;
+    }
+    return subregions.isValid(getBegin(), getEnd());
+  }
+
+  /**
+   * Adds all contained entries to the given list
+   * 
+   * @param entries
+   */
+  void getEntries(List<T> entries)
+  {
+    entries.add(region);
+    if (subregions != null)
+    {
+      subregions.getEntries(entries);
+    }
+  }
+
+  /**
+   * Answers true if this object contains the given entry (by object equals
+   * test), else false
+   * 
+   * @param entry
+   * @return
+   */
+  boolean contains(IntervalI entry)
+  {
+    if (entry == null)
+    {
+      return false;
+    }
+    if (entry.equals(region))
+    {
+      return true;
+    }
+    return subregions == null ? false : subregions.contains(entry);
+  }
+
+  /**
+   * Answers the 'root' region modelled by this object
+   * 
+   * @return
+   */
+  T getRegion()
+  {
+    return region;
+  }
+
+  /**
+   * Answers the (possibly null) contained regions within this object
+   * 
+   * @return
+   */
+  NCList<T> getSubRegions()
+  {
+    return subregions;
+  }
+
+  /**
+   * Answers the (deep) size of this node i.e. the number of intervals it models
+   * 
+   * @return
+   */
+  int size()
+  {
+    return subregions == null ? 1 : 1 + subregions.size();
+  }
+
+  /**
+   * Answers the depth of NCNode / NCList nesting in the data tree
+   * 
+   * @return
+   */
+  int getDepth()
+  {
+    return subregions == null ? 1 : 1 + subregions.getDepth();
+  }
+
+  /**
+   * Answers an iterator over the intervals stored in this node. The iterator
+   * does not support the optional <code>remove</code> operation (throws
+   * <code>UnsupportedOperationException</code> if attempted).
+   * 
+   * @return
+   */
+  public Iterator<T> iterator()
+  {
+    return new NCNodeIterator();
+  }
+
+  /**
+   * Removes the first interval found equal to the given entry. Answers true if
+   * a matching interval is found and removed, else false.
+   * 
+   * @param entry
+   * @return
+   */
+  boolean remove(T entry)
+  {
+    if (region.equals(entry))
+    {
+      /*
+       * this case must be handled by NCList, to allow any
+       * children of a deleted interval to be promoted
+       */
+      throw new IllegalArgumentException("NCNode can't remove self");
+    }
+    if (subregions == null)
+    {
+      return false;
+    }
+    if (subregions.remove(entry))
+    {
+      if (subregions.isEmpty())
+      {
+        subregions = null;
+      }
+      return true;
+    }
+    return false;
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public boolean equals(Object o)
+  {
+    return o != null && o instanceof NCNode
+            && equalsInterval((NCNode<T>) o);
+  }
+
+  @Override
+  public boolean equalsInterval(IntervalI i)
+  {
+    return getBegin() == i.getBegin() && getEnd() == i.getEnd();
+
+  }
+
+}
diff --git a/src/intervalstore/nonc/IntervalStore.java b/src/intervalstore/nonc/IntervalStore.java
new file mode 100644 (file)
index 0000000..55d29e8
--- /dev/null
@@ -0,0 +1,1053 @@
+/*
+BSD 3-Clause License
+
+Copyright (c) 2018, Mungo Carstairs
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+  list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+  this list of conditions and the following disclaimer in the documentation
+  and/or other materials provided with the distribution.
+
+* Neither the name of the copyright holder nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+package intervalstore.nonc;
+
+import java.util.AbstractCollection;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.BitSet;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+import java.util.NoSuchElementException;
+
+import intervalstore.api.IntervalI;
+import intervalstore.api.IntervalStoreI;
+
+/**
+ * 
+ * A second idea, doing a double binary sort for the full interval. Seemed like
+ * a good idea, but is 50% slower.
+ * 
+ * A Collection class to store interval-associated data, with options for "lazy"
+ * sorting so as to speed incremental construction of the data prior to issuing
+ * a findOverlap call.
+ * 
+ * 
+ * Accepts duplicate entries but not null values.
+ * 
+ * 
+ * 
+ * @author Bob Hanson 2019.08.06
+ *
+ * @param <T>
+ *          any type providing <code>getBegin()</code>, <code>getEnd()</code>
+ *          <code>getContainedBy()</code>, and <code>setContainedBy()</code>
+ */
+public class IntervalStore<T extends IntervalI>
+        extends AbstractCollection<T> implements IntervalStoreI<T>
+{
+
+  /**
+   * Search for the last interval that starts before or at the specified from/to
+   * range and the first interval that starts after it. In the situation that
+   * there are multiple intervals starting at from, this method returns the
+   * first of those.
+   * 
+   * @param a
+   * @param from
+   * @param to
+   * @param ret
+   * @return
+   */
+  public int binaryLastIntervalSearch(long from,
+          long to, int[] ret)
+  {
+    int start = 0, start2 = 0;
+    int matched = 0;
+    int end = intervalCount - 1, end2 = intervalCount;
+    int mid, begin;
+    IntervalI e;
+    while (start <= end)
+    {
+      mid = (start + end) >>> 1;
+      e = intervals[mid];
+      begin = e.getBegin();
+      switch (Long.signum(begin - from))
+      {
+      case -1:
+        matched = mid;
+        start = mid + 1;
+        break;
+      case 0:
+      case 1:
+        end = mid - 1;
+        if (begin > to)
+        {
+          end2 = mid;
+        }
+        else
+        {
+          start2 = mid;
+        }
+        break;
+      }
+    }
+    ret[0] = end2;
+    start = Math.max(start2, end);
+    end = end2 - 1;
+
+    while (start <= end)
+    {
+      mid = (start + end) >>> 1;
+      e = intervals[mid];
+      begin = e.getBegin();
+      if (begin > to)
+      {
+        ret[0] = mid;
+        end = mid - 1;
+      }
+      else
+      {
+        start = mid + 1;
+      }
+
+    }
+    return matched;
+  }
+
+  /**
+   * My preference is for a bigendian comparison, but you may differ.
+   */
+  private Comparator<? super IntervalI> icompare;
+
+  /**
+   * bigendian is what NCList does; change icompare to switch to that
+   */
+  private boolean bigendian;
+
+  private final boolean DO_PRESORT;
+
+  private boolean isSorted;
+
+  private int minStart = Integer.MAX_VALUE, maxStart = Integer.MIN_VALUE,
+          maxEnd = Integer.MAX_VALUE;
+
+  // private Comparator<IntervalI> icompare = new IntervalComparator();
+
+  private boolean isTainted;
+
+  private int capacity = 8;
+
+  private IntervalI[] intervals = new IntervalI[capacity];
+
+  private int[] offsets;
+
+  private int[] ret = new int[1];
+
+  private int intervalCount;
+
+  private int added;
+
+  private int deleted;
+
+  private BitSet bsDeleted;
+
+  /**
+   * Constructor
+   */
+  public IntervalStore()
+  {
+    this(true);
+  }
+
+  public IntervalStore(boolean presort)
+  {
+    this(null, presort);
+  }
+
+  /**
+   * Constructor given a list of intervals. Note that the list may get sorted as
+   * a side-effect of calling this constructor.
+   */
+  public IntervalStore(List<T> intervals)
+  {
+    this(intervals, true);
+  }
+
+  /**
+   * Allows a presort option, which can speed up initial loading of individual
+   * features but will delay the first findOverlap if set to true.
+   * 
+   * @param intervals
+   * @param presort
+   */
+  public IntervalStore(List<T> intervals, boolean presort)
+  {
+    this(intervals, presort, null, false);
+  }
+
+  /**
+   * 
+   * @param intervals
+   *          intervals to initialize with (others may still be added)
+   * @param presort
+   *          whether or not to presort the list as additions are made
+   * @param comparator
+   *          IntervalI.COMPARATOR_LITTLEENDIAN or
+   *          IntervalI.COMPARATOR_BIGENDIAN, but this could also be one that
+   *          sorts by description as well, for example.
+   * @param bigendian
+   *          true if the comparator sorts [10-30] before [10-20]
+   */
+  public IntervalStore(List<T> intervals, boolean presort,
+          Comparator<? super IntervalI> comparator, boolean bigendian)
+  {
+    if (intervals != null)
+    {
+      intervals.toArray(
+              this.intervals = new IntervalI[capacity = intervalCount = intervals
+                      .size()]);
+    }
+    DO_PRESORT = presort;
+    icompare = (comparator != null ? comparator
+            : bigendian ? IntervalI.COMPARATOR_BIGENDIAN
+                    : IntervalI.COMPARATOR_LITTLEENDIAN);
+    this.bigendian = bigendian;
+
+    if (DO_PRESORT && intervalCount > 1)
+    {
+      sort();
+    }
+    isSorted = DO_PRESORT;
+    isTainted = true;
+  }
+
+  /**
+   * Adds one interval to the store, allowing duplicates.
+   * 
+   * @param interval
+   */
+  @Override
+  public boolean add(T interval)
+  {
+    return add(interval, true);
+  }
+
+  /**
+   * Adds one interval to the store, optionally checking for duplicates.
+   * 
+   * @param interval
+   * @param allowDuplicates
+   */
+  public boolean add(T interval, boolean allowDuplicates)
+  {
+    if (interval == null)
+    {
+      return false;
+    }
+
+    if (deleted > 0)
+    {
+      finalizeDeletion();
+    }
+    if (!isTainted)
+    {
+      offsets = null;
+      isTainted = true;
+    }
+
+    synchronized (intervals)
+    {
+      int index = intervalCount;
+      int start = interval.getBegin();
+
+      if (intervalCount + added + 1 >= capacity)
+      {
+        intervals = finalizeAddition(
+                new IntervalI[capacity = capacity << 1]);
+
+      }
+
+      if (DO_PRESORT && isSorted)
+      {
+        if (intervalCount == 0)
+        {
+          // ignore
+        }
+        else
+        {
+          index = findInterval(interval);
+          if (!allowDuplicates && index >= 0)
+          {
+            return false;
+          }
+          if (index < 0)
+          {
+            index = -1 - index;
+          }
+          else
+          {
+            index++;
+          }
+        }
+
+      }
+      else
+      {
+        if (!allowDuplicates && findInterval(interval) >= 0)
+        {
+          return false;
+        }
+        isSorted = false;
+      }
+
+      if (index == intervalCount)
+      {
+        intervals[intervalCount++] = interval;
+        // System.out.println("added " + intervalCount + " " + interval);
+      }
+      else
+      {
+        int pt = capacity - ++added;
+        intervals[pt] = interval;
+        // System.out.println("stashed " + pt + " " + interval + " for "
+        // + index + " " + intervals[index]);
+        if (offsets == null)
+        {
+          offsets = new int[capacity];
+        }
+
+        offsets[pt] = offsets[index];
+
+        offsets[index] = pt;
+      }
+
+      minStart = Math.min(minStart, start);
+      maxStart = Math.max(maxStart, start);
+      return true;
+    }
+  }
+
+  private IntervalI[] finalizeAddition(IntervalI[] dest)
+  {
+    if (dest == null)
+    {
+      dest = intervals;
+    }
+    if (added == 0)
+    {
+      if (intervalCount > 0 && dest != intervals)
+      {
+        System.arraycopy(intervals, 0, dest, 0, intervalCount);
+      }
+      capacity = dest.length;
+      return dest;
+    }
+
+    // array is [(intervalCount)...null...(added)]
+
+    int ntotal = intervalCount + added;
+    for (int ptShift = intervalCount + added, pt = intervalCount; pt >= 0;)
+    {
+      int pt0 = pt;
+      while (--pt >= 0 && offsets[pt] == 0)
+      {
+        ;
+      }
+      if (pt < 0)
+      {
+        pt = 0;
+      }
+      int nOK = pt0 - pt;
+      // shift upper intervals right
+      ptShift -= nOK;
+      if (nOK > 0)
+      {
+        System.arraycopy(intervals, pt, dest, ptShift, nOK);
+      }
+      if (added == 0)
+      {
+        break;
+      }
+        for (int offset = offsets[pt]; offset > 0; offset = offsets[offset])
+        {
+          dest[--ptShift] = intervals[offset];
+          --added;
+        }
+    }
+    offsets = null;
+    intervalCount = ntotal;
+    capacity = dest.length;
+    return dest;
+  }
+
+  public int binaryIdentitySearch(IntervalI interval)
+  {
+    return binaryIdentitySearch(interval, null);
+  }
+  /**
+   * for remove() and contains()
+   * 
+   * @param list
+   * @param interval
+   * @param bsIgnore
+   *          for deleted
+   * @return index or, if not found, -1 - "would be here"
+   */
+  public int binaryIdentitySearch(IntervalI interval, BitSet bsIgnore)
+  {
+    int start = 0;
+    int r0 = interval.getBegin();
+    int r1 = interval.getEnd();
+    int end = intervalCount - 1;
+    if (end < 0 || r0 < minStart)
+    {
+      return -1;
+    }
+    if (r0 > maxStart)
+    {
+      return -1 - intervalCount;
+    }
+    while (start <= end)
+    {
+      int mid = (start + end) >>> 1;
+      IntervalI r = intervals[mid];
+      switch (compareRange(r, r0, r1))
+      {
+      case -1:
+        start = mid + 1;
+        continue;
+      case 1:
+        end = mid - 1;
+        continue;
+      case 0:
+        IntervalI iv = intervals[mid];
+        if ((bsIgnore == null || !bsIgnore.get(mid))
+                && iv.equalsInterval(interval))
+         {
+          return mid;
+        // found one; just scan up and down now, first checking the range, but
+        // also checking other possible aspects of equivalence.
+        }
+
+        for (int i = mid; ++i <= end;)
+        {
+          if ((iv = intervals[i]).getBegin() != r0 || iv.getEnd() != r1)
+          {
+            break;
+          }
+          if ((bsIgnore == null || !bsIgnore.get(i))
+                  && iv.equalsInterval(interval))
+          {
+            return i;
+          }
+        }
+        for (int i = mid; --i >= start;)
+        {
+          if ((iv = intervals[i]).getBegin() != r0 || iv.getEnd() < r1)
+          {
+            return -1 - ++i;
+          }
+          if ((bsIgnore == null || !bsIgnore.get(i))
+                  && iv.equalsInterval(interval))
+          {
+            return i;
+          }
+        }
+        return -1 - start;
+      }
+    }
+    return -1 - start;
+  }
+
+  // private int binaryInsertionSearch(long from, long to)
+  // {
+  // int matched = intervalCount;
+  // int end = matched - 1;
+  // int start = matched;
+  // if (end < 0 || from > intervals[end].getEnd()
+  // || from < intervals[start = 0].getBegin())
+  // return start;
+  // while (start <= end)
+  // {
+  // int mid = (start + end) >>> 1;
+  // switch (compareRange(intervals[mid], from, to))
+  // {
+  // case 0:
+  // return mid;
+  // case 1:
+  // matched = mid;
+  // end = mid - 1;
+  // continue;
+  // case -1:
+  // start = mid + 1;
+  // continue;
+  // }
+  //
+  // }
+  // return matched;
+  // }
+
+
+  @Override
+  public void clear()
+  {
+    intervalCount = added = 0;
+    isSorted = true;
+    isTainted = true;
+    offsets = null;
+    minStart = maxEnd = Integer.MAX_VALUE;
+    maxStart = Integer.MIN_VALUE;
+  }
+  /**
+   * Compare an interval t to a from/to range for insertion purposes
+   * 
+   * @param t
+   * @param from
+   * @param to
+   * @return 0 if same, 1 if start is after from, or start equals from and
+   *         [bigendian: end is before to | littleendian: end is after to], else
+   *         -1
+   */
+  private int compareRange(IntervalI t, long from, long to)
+  {
+    if (t == null)
+    {
+      System.out.println("???");
+    }
+    int order = Long.signum(t.getBegin() - from);
+    return (order == 0
+            ? Long.signum(bigendian ? to - t.getEnd() : t.getEnd() - to)
+            : order);
+  }
+
+  @Override
+  public boolean contains(Object entry)
+  {
+    if (entry == null || intervalCount == 0)
+    {
+      return false;
+    }
+    if (!isSorted || deleted > 0)
+    {
+      sort();
+    }
+    return (findInterval((IntervalI) entry) >= 0);
+  }
+
+  public boolean containsInterval(IntervalI outer, IntervalI inner)
+  {
+    ensureFinalized();
+    int index = binaryIdentitySearch(inner, null);
+    if (index >= 0)
+    {
+      while ((index = index - Math.abs(offsets[index])) >= 0)
+      {
+        if (intervals[index] == outer)
+        {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+
+  private void ensureFinalized()
+  {
+    if (isTainted)
+    {
+      if (!isSorted || added > 0 || deleted > 0)
+      {
+        sort();
+      }
+      if (offsets == null || offsets.length < intervalCount)
+      {
+        offsets = new int[intervalCount];
+      }
+      linkFeatures();
+      isTainted = false;
+    }
+  }
+
+  /**
+   * Find all overlaps within the given range, inclusively.
+   * 
+   * @return a list sorted in ascending order of start position
+   * 
+   */
+  @Override
+  public List<T> findOverlaps(long from, long to)
+  {
+    List<T> list = findOverlaps(from, to, null);
+    Collections.reverse(list);
+    return list;
+  }
+
+  /**
+   * Find all overlaps within the given range, inclusively.
+   * 
+   * @return a list sorted in descending order of start position
+   * 
+   */
+  
+  @SuppressWarnings("unchecked")
+  @Override
+  public List<T> findOverlaps(long from, long to, List<T> result)
+  {
+    if (result == null)
+    {
+      result = new ArrayList<>();
+    }
+    switch (intervalCount + added)
+    {
+    case 0:
+      return result;
+    case 1:
+      IntervalI sf = intervals[0];
+      if (sf.getBegin() <= to && sf.getEnd() >= from)
+      {
+        result.add((T) sf);
+      }
+      return result;
+    }
+
+    ensureFinalized();
+
+    if (from > maxEnd || to < minStart)
+    {
+      return result;
+    }
+    int index = binaryLastIntervalSearch(from, to, ret);
+    int index1 = ret[0];
+    if (index1 < 0)
+    {
+      return result;
+    }
+
+    if (index1 > index + 1)
+    {
+      while (--index1 > index)
+      {
+        result.add((T) intervals[index1]);
+      }
+    }
+    boolean isMonotonic = false;
+    while (index >= 0)
+    {
+      IntervalI sf = intervals[index];
+      if (sf.getEnd() >= from)
+      {
+        result.add((T) sf);
+      }
+      else if (isMonotonic)
+      {
+        break;
+      }
+      int offset = offsets[index];
+      isMonotonic = (offset < 0);
+      index -= (isMonotonic ? -offset : offset);
+    }
+    return result;
+  }
+
+  @Override
+  public IntervalI get(int i)
+  {
+    if (i < 0 || i >= intervalCount + added)
+    {
+      return null;
+    }
+    ensureFinalized();
+    return intervals[i];
+  }
+
+  private int getContainedBy(int index, int begin)
+  {
+    while (index >= 0)
+    {
+      IntervalI sf = intervals[index];
+      if (sf.getEnd() >= begin)
+      {
+        // System.out.println("\nIS found " + sf0.getIndex1() + ":" + sf0
+        // + "\nFS in " + sf.getIndex1() + ":" + sf);
+        return index;
+      }
+      index -= Math.abs(offsets[index]);
+    }
+    return IntervalI.NOT_CONTAINED;
+  }
+
+  @Override
+  public int getDepth()
+  {
+    ensureFinalized();
+    if (intervalCount < 2)
+    {
+      return intervalCount;
+    }
+    int maxDepth = 1;
+    IntervalI root = null;
+    for (int i = 0; i < intervalCount; i++)
+    {
+      IntervalI element = intervals[i];
+      if (offsets[i] == IntervalI.NOT_CONTAINED)
+      {
+        root = element;
+      }
+      int depth = 1;
+      int index = i;
+      int offset;
+      while ((index = index - Math.abs(offset = offsets[index])) >= 0)
+      {
+        element = intervals[index];
+        if (++depth > maxDepth && (element == root || offset < 0))
+        {
+          maxDepth = depth;
+          break;
+        }
+      }
+    }
+    return maxDepth;
+  }
+
+  @Override
+  public int getWidth()
+  {
+    ensureFinalized();
+    int w = 0;
+    for (int i = offsets.length; --i >= 0;)
+    {
+      if (offsets[i] > 0)
+      {
+        w++;
+      }
+    }
+    return w;
+  }
+
+  @Override
+  public boolean isValid()
+  {
+    ensureFinalized();
+    return true;
+  }
+
+  /**
+   * Answers an iterator over the intervals in the store, with no particular
+   * ordering guaranteed. The iterator does not support the optional
+   * <code>remove</code> operation (throws
+   * <code>UnsupportedOperationException</code> if attempted).
+   */
+  @Override
+  public Iterator<T> iterator()
+  {
+    ensureFinalized();
+    return new Iterator<T>()
+    {
+
+      private int next;
+
+      @Override
+      public boolean hasNext()
+      {
+        return next < intervalCount;
+      }
+
+      @SuppressWarnings("unchecked")
+      @Override
+      public T next()
+      {
+        if (next >= intervalCount)
+        {
+          throw new NoSuchElementException();
+        }
+        return (T) intervals[next++];
+      }
+
+    };
+  }
+
+  private void linkFeatures()
+  {
+    if (intervalCount == 0)
+    {
+      return;
+    }
+    maxEnd = intervals[0].getEnd();
+    offsets[0] = IntervalI.NOT_CONTAINED;
+    if (intervalCount == 1)
+    {
+      return;
+    }
+    boolean isMonotonic = true;
+    for (int i = 1; i < intervalCount; i++)
+    {
+      IntervalI sf = intervals[i];
+      int begin = sf.getBegin();
+      int index = (begin <= maxEnd ? getContainedBy(i - 1, begin) : -1);
+        // System.out.println(sf + " is contained by "
+      // + (index < 0 ? null : starts[index]));
+
+      offsets[i] = (index < 0 ? IntervalI.NOT_CONTAINED
+              : isMonotonic ? index - i : i - index);
+      isMonotonic = (sf.getEnd() > maxEnd);
+      if (isMonotonic)
+      {
+        maxEnd = sf.getEnd();
+      }
+    }
+
+  }
+
+  @Override
+  public String prettyPrint()
+  {
+    switch (intervalCount + added)
+    {
+    case 0:
+      return "";
+    case 1:
+      return intervals[0] + "\n";
+    }
+    ensureFinalized();
+    String sep = "\t";
+    StringBuffer sb = new StringBuffer();
+    for (int i = 0; i < intervalCount; i++)
+    {
+      IntervalI range = intervals[i];
+      int index = i;
+      while ((index = index - Math.abs(offsets[index])) >= 0)
+      {
+        sb.append(sep);
+      }
+      sb.append(range.toString()).append('\n');
+    }
+    return sb.toString();
+  }
+
+  @Override
+  public synchronized boolean remove(Object o)
+  {
+    // if (o == null)
+    // {
+    // throw new NullPointerException();
+    // }
+    return (o != null && intervalCount > 0
+            && removeInterval((IntervalI) o));
+  }
+
+  /**
+   * Find the interval or return where it should go, possibly into the add
+   * buffer
+   * 
+   * @param interval
+   * @return index (nonnegative) or index where it would go (negative)
+   */
+
+  private int findInterval(IntervalI interval)
+  {
+
+    if (isSorted)
+    {
+      int pt = binaryIdentitySearch(interval, null);
+      // if (addPt == intervalCount || offsets[pt] == 0)
+      // return pt;
+      if (pt >= 0 || added == 0 || pt == -1 - intervalCount)
+      {
+        return pt;
+      }
+      pt = -1 - pt;
+        int start = interval.getBegin();
+        int end = interval.getEnd();
+
+        int match = pt;
+
+        while ((pt = offsets[pt]) != 0)
+        {
+          IntervalI iv = intervals[pt];
+          switch (compareRange(iv, start, end))
+          {
+          case -1:
+            break;
+          case 0:
+            if (iv.equalsInterval(interval))
+            {
+              return pt;
+            }
+          // fall through
+          case 1:
+          match = pt;
+            continue;
+          }
+        }
+      return -1 - match;
+    }
+    else
+    {
+      int i = intervalCount;
+      while (--i >= 0 && !intervals[i].equalsInterval(interval))
+      {
+        ;
+      }
+      return i;
+    }
+  }
+
+  /**
+   * Uses a binary search to find the entry and removes it if found.
+   * 
+   * @param interval
+   * @return
+   */
+  protected boolean removeInterval(IntervalI interval)
+  {
+
+    if (!isSorted || added > 0)
+    {
+      sort();
+    }
+    int i = binaryIdentitySearch(interval, bsDeleted);
+    if (i < 0)
+    {
+      return false;
+    }
+    if (deleted == 0)
+    {
+      if (bsDeleted == null)
+      {
+        bsDeleted = new BitSet(intervalCount);
+      }
+      else
+      {
+        bsDeleted.clear();
+      }
+    }
+    bsDeleted.set(i);
+    deleted++;
+    return (isTainted = true);
+  }
+
+  private void finalizeDeletion()
+  {
+    if (deleted == 0)
+    {
+      return;
+    }
+
+    // ......xxx.....xxxx.....xxxxx....
+    // ......^i,pt
+    // ...... .......
+    // ............
+    for (int i = bsDeleted.nextSetBit(0), pt = i; i >= 0;)
+    {
+      i = bsDeleted.nextClearBit(i + 1);
+      int pt1 = bsDeleted.nextSetBit(i + 1);
+      if (pt1 < 0)
+      {
+        pt1 = intervalCount;
+      }
+      int n = pt1 - i;
+      System.arraycopy(intervals, i, intervals, pt, n);
+      pt += n;
+      if (pt1 == intervalCount)
+      {
+        for (i = pt1; --i >= pt;)
+        {
+          intervals[i] = null;
+        }
+        intervalCount -= deleted;
+        deleted = 0;
+        bsDeleted.clear();
+        break;
+      }
+      i = pt1;
+    }
+
+
+  }
+
+  @Override
+  public boolean revalidate()
+  {
+    isTainted = true;
+    isSorted = false;
+    ensureFinalized();
+    return true;
+  }
+
+  @Override
+  public int size()
+  {
+    return intervalCount + added - deleted;
+  }
+
+  @Override
+  public Object[] toArray()
+  {
+    ensureFinalized();
+    return super.toArray();
+  }
+
+  /**
+   * Sort intervals by start (lowest first) and end (highest first).
+   */
+  private void sort()
+  {
+    if (added > 0)
+    {
+      intervals = finalizeAddition(new IntervalI[intervalCount + added]);
+    }
+    else if (deleted > 0)
+    {
+      finalizeDeletion();
+    }
+    else
+    {
+      Arrays.sort(intervals, 0, intervalCount, icompare);
+    }
+    updateMinMaxStart();
+    isSorted = true;
+  }
+
+  private void updateMinMaxStart()
+  {
+    if (intervalCount > 0)
+    {
+      minStart = intervals[0].getBegin();
+      maxStart = intervals[intervalCount - 1].getBegin();
+    }
+    else
+    {
+      minStart = Integer.MAX_VALUE;
+      maxStart = Integer.MIN_VALUE;
+    }
+  }
+
+  @Override
+  public String toString()
+  {
+    return prettyPrint();
+  }
+
+}
index b88ef3a..8634db6 100755 (executable)
@@ -22,6 +22,8 @@ package jalview.analysis;
 
 import jalview.analysis.scoremodels.PIDModel;
 import jalview.analysis.scoremodels.SimilarityParams;
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
 import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.AlignmentOrder;
@@ -51,40 +53,65 @@ import java.util.List;
  * from the first tobesorted position in the alignment. e.g. (a,tb2,b,tb1,c,tb3
  * becomes a,tb1,tb2,tb3,b,c)
  */
-public class AlignmentSorter
+public class AlignmentSorter implements ApplicationSingletonI
 {
+
+  private AlignmentSorter()
+  {
+    // private singleton
+  }
+
+  private static AlignmentSorter getInstance()
+  {
+    return (AlignmentSorter) ApplicationSingletonProvider
+            .getInstance(AlignmentSorter.class);
+  }
+
+  /**
+   * types of feature ordering: Sort by score : average score - or total score -
+   * over all features in region Sort by feature label text: (or if null -
+   * feature type text) - numerical or alphabetical Sort by feature density:
+   * based on counts - ignoring individual text or scores for each feature
+   */
+  public static final String FEATURE_SCORE = "average_score";
+
+  public static final String FEATURE_LABEL = "text";
+
+  public static final String FEATURE_DENSITY = "density";
+
   /*
    * todo: refactor searches to follow a basic pattern: (search property, last
    * search state, current sort direction)
    */
-  static boolean sortIdAscending = true;
+  boolean sortIdAscending = true;
 
-  static int lastGroupHash = 0;
+  int lastGroupHash = 0;
 
-  static boolean sortGroupAscending = true;
+  boolean sortGroupAscending = true;
 
-  static AlignmentOrder lastOrder = null;
+  AlignmentOrder lastOrder = null;
 
-  static boolean sortOrderAscending = true;
+  boolean sortOrderAscending = true;
 
-  static TreeModel lastTree = null;
+  TreeModel lastTree = null;
 
-  static boolean sortTreeAscending = true;
+  boolean sortTreeAscending = true;
 
-  /*
+
+  /**
    * last Annotation Label used for sort by Annotation score
    */
-  private static String lastSortByAnnotation;
+  private String lastSortByAnnotation;
 
-  /*
-   * string hash of last arguments to sortByFeature
-   * (sort order toggles if this is unchanged between sorts)
+  /**
+   * string hash of last arguments to sortByFeature (sort order toggles if this
+   * is unchanged between sorts)
    */
-  private static String sortByFeatureCriteria;
+  private String sortByFeatureCriteria;
 
-  private static boolean sortByFeatureAscending = true;
+  private boolean sortByFeatureAscending = true;
 
-  private static boolean sortLengthAscending;
+  private boolean sortLengthAscending;
 
   /**
    * Sorts sequences in the alignment by Percentage Identity with the given
@@ -222,7 +249,8 @@ public class AlignmentSorter
 
     QuickSort.sort(ids, seqs);
 
-    if (sortIdAscending)
+    AlignmentSorter as = getInstance();
+    if (as.sortIdAscending)
     {
       setReverseOrder(align, seqs);
     }
@@ -231,7 +259,7 @@ public class AlignmentSorter
       setOrder(align, seqs);
     }
 
-    sortIdAscending = !sortIdAscending;
+    as.sortIdAscending = !as.sortIdAscending;
   }
 
   /**
@@ -255,7 +283,9 @@ public class AlignmentSorter
 
     QuickSort.sort(length, seqs);
 
-    if (sortLengthAscending)
+    AlignmentSorter as = getInstance();
+
+    if (as.sortLengthAscending)
     {
       setReverseOrder(align, seqs);
     }
@@ -264,7 +294,7 @@ public class AlignmentSorter
       setOrder(align, seqs);
     }
 
-    sortLengthAscending = !sortLengthAscending;
+    as.sortLengthAscending = !as.sortLengthAscending;
   }
 
   /**
@@ -281,14 +311,16 @@ public class AlignmentSorter
     // ORDERS BY GROUP SIZE
     List<SequenceGroup> groups = new ArrayList<>();
 
-    if (groups.hashCode() != lastGroupHash)
+    AlignmentSorter as = getInstance();
+
+    if (groups.hashCode() != as.lastGroupHash)
     {
-      sortGroupAscending = true;
-      lastGroupHash = groups.hashCode();
+      as.sortGroupAscending = true;
+      as.lastGroupHash = groups.hashCode();
     }
     else
     {
-      sortGroupAscending = !sortGroupAscending;
+      as.sortGroupAscending = !as.sortGroupAscending;
     }
 
     // SORTS GROUPS BY SIZE
@@ -328,7 +360,7 @@ public class AlignmentSorter
       }
     }
 
-    if (sortGroupAscending)
+    if (as.sortGroupAscending)
     {
       setOrder(align, seqs);
     }
@@ -401,16 +433,18 @@ public class AlignmentSorter
     // Get an ordered vector of sequences which may also be present in align
     List<SequenceI> tmp = order.getOrder();
 
-    if (lastOrder == order)
+    AlignmentSorter as = getInstance();
+
+    if (as.lastOrder == order)
     {
-      sortOrderAscending = !sortOrderAscending;
+      as.sortOrderAscending = !as.sortOrderAscending;
     }
     else
     {
-      sortOrderAscending = true;
+      as.sortOrderAscending = true;
     }
 
-    if (sortOrderAscending)
+    if (as.sortOrderAscending)
     {
       setOrder(align, tmp);
     }
@@ -473,18 +507,20 @@ public class AlignmentSorter
   {
     List<SequenceI> tmp = getOrderByTree(align, tree);
 
+    AlignmentSorter as = getInstance();
+
     // tmp should properly permute align with tree.
-    if (lastTree != tree)
+    if (as.lastTree != tree)
     {
-      sortTreeAscending = true;
-      lastTree = tree;
+      as.sortTreeAscending = true;
+      as.lastTree = tree;
     }
     else
     {
-      sortTreeAscending = !sortTreeAscending;
+      as.sortTreeAscending = !as.sortTreeAscending;
     }
 
-    if (sortTreeAscending)
+    if (as.sortTreeAscending)
     {
       setOrder(align, tmp);
     }
@@ -586,7 +622,7 @@ public class AlignmentSorter
 
     for (int i = 0; i < alignment.length; i++)
     {
-      ids[i] = (Float.valueOf(alignment[i].getName().substring(8)))
+      ids[i] = (new Float(alignment[i].getName().substring(8)))
               .floatValue();
     }
 
@@ -658,9 +694,12 @@ public class AlignmentSorter
     }
 
     jalview.util.QuickSort.sort(scores, seqs);
-    if (lastSortByAnnotation != scoreLabel)
+
+    AlignmentSorter as = getInstance();
+
+    if (as.lastSortByAnnotation != scoreLabel)
     {
-      lastSortByAnnotation = scoreLabel;
+      as.lastSortByAnnotation = scoreLabel;
       setOrder(alignment, seqs);
     }
     else
@@ -670,18 +709,6 @@ public class AlignmentSorter
   }
 
   /**
-   * types of feature ordering: Sort by score : average score - or total score -
-   * over all features in region Sort by feature label text: (or if null -
-   * feature type text) - numerical or alphabetical Sort by feature density:
-   * based on counts - ignoring individual text or scores for each feature
-   */
-  public static String FEATURE_SCORE = "average_score";
-
-  public static String FEATURE_LABEL = "text";
-
-  public static String FEATURE_DENSITY = "density";
-
-  /**
    * Sort sequences by feature score or density, optionally restricted by
    * feature types, feature groups, or alignment start/end positions.
    * <p>
@@ -809,6 +836,8 @@ public class AlignmentSorter
       }
     }
 
+    boolean doSort = false;
+
     if (FEATURE_SCORE.equals(method))
     {
       if (hasScores == 0)
@@ -834,7 +863,7 @@ public class AlignmentSorter
           }
         }
       }
-      QuickSort.sortByDouble(scores, seqs, sortByFeatureAscending);
+      doSort = true;
     }
     else if (FEATURE_DENSITY.equals(method))
     {
@@ -846,9 +875,12 @@ public class AlignmentSorter
         // System.err.println("Sorting on Density: seq "+seqs[i].getName()+
         // " Feats: "+featureCount+" Score : "+scores[i]);
       }
-      QuickSort.sortByDouble(scores, seqs, sortByFeatureAscending);
+      doSort = true;
+    }
+    if (doSort)
+    {
+      QuickSort.sortByDouble(scores, seqs, getInstance().sortByFeatureAscending);
     }
-
     setOrder(alignment, seqs);
   }
 
@@ -883,16 +915,17 @@ public class AlignmentSorter
     /*
      * if resorting on the same criteria, toggle sort order
      */
-    if (sortByFeatureCriteria == null
-            || !scoreCriteria.equals(sortByFeatureCriteria))
+    AlignmentSorter as = getInstance();
+    if (as.sortByFeatureCriteria == null
+            || !scoreCriteria.equals(as.sortByFeatureCriteria))
     {
-      sortByFeatureAscending = true;
+      as.sortByFeatureAscending = true;
     }
     else
     {
-      sortByFeatureAscending = !sortByFeatureAscending;
+      as.sortByFeatureAscending = !as.sortByFeatureAscending;
     }
-    sortByFeatureCriteria = scoreCriteria;
+    as.sortByFeatureCriteria = scoreCriteria;
   }
 
 }
index ff38c08..bd87ee8 100755 (executable)
@@ -698,7 +698,7 @@ public class Conservation
 
       max = Math.max(max, bigtot);
 
-      quality.addElement(Double.valueOf(bigtot));
+      quality.addElement(new Double(bigtot));
     }
 
     double newmax = -Double.MAX_VALUE;
@@ -710,7 +710,7 @@ public class Conservation
       tmp = ((max - tmp) * (size - cons2GapCounts[j])) / size;
 
       // System.out.println(tmp+ " " + j);
-      quality.setElementAt(Double.valueOf(tmp), j);
+      quality.setElementAt(new Double(tmp), j);
 
       if (tmp > newmax)
       {
index 00bb63a..dbad53e 100644 (file)
@@ -31,13 +31,14 @@ import jalview.datamodel.SequenceFeature;
 import jalview.datamodel.SequenceI;
 import jalview.util.DBRefUtils;
 import jalview.util.MapList;
-import jalview.ws.SequenceFetcherFactory;
-import jalview.ws.seqfetcher.ASequenceFetcher;
+import jalview.ws.SequenceFetcher;
 
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
+import intervalstore.api.IntervalI;
+
 /**
  * Functions for cross-referencing sequence databases.
  * 
@@ -402,7 +403,6 @@ public class CrossRef
   private void retrieveCrossRef(List<DBRefEntry> sourceRefs, SequenceI seq,
           List<DBRefEntry> xrfs, boolean fromDna, AlignedCodonFrame cf)
   {
-    ASequenceFetcher sftch = SequenceFetcherFactory.getSequenceFetcher();
     SequenceI[] retrieved = null;
     SequenceI dss = seq.getDatasetSequence() == null ? seq
             : seq.getDatasetSequence();
@@ -418,7 +418,8 @@ public class CrossRef
     }
     try
     {
-      retrieved = sftch.getSequences(sourceRefs, !fromDna);
+      retrieved = SequenceFetcher.getInstance()
+              .getSequences(sourceRefs, !fromDna);
     } catch (Exception e)
     {
       System.err.println(
@@ -483,7 +484,7 @@ public class CrossRef
   private void removeAlreadyRetrievedSeqs(List<DBRefEntry> sourceRefs,
           boolean fromDna)
   {
-    List<DBRefEntry> dbrSourceSet = new ArrayList<DBRefEntry>(sourceRefs);
+    List<DBRefEntry> dbrSourceSet = new ArrayList<>(sourceRefs);
     List<SequenceI> dsSeqs = dataset.getSequences();
     for (int ids = 0, nds = dsSeqs.size(); ids < nds; ids++)
     {
@@ -638,12 +639,23 @@ public class CrossRef
                    */
                   SequenceFeature newFeature = new SequenceFeature(feat)
                   {
+                    // BH 2019.08.15 We must override equalsInterval, not
+                    // equals, because that is part of the IntervalI interface,
+                    // and IntervalStore may need that for proper, faster
+                    // processing.
+                    // @Override
+                    // public boolean equals(Object o)
+                    // {
+                    // return super.equals(o, true);
+                    // }
+                    //
                     @Override
-                    public boolean equals(Object o)
+                    public boolean equalsInterval(IntervalI sf)
                     {
-                      return super.equals(o, true);
+                      return equals((SequenceFeature) sf, true);
                     }
                   };
+
                   matched.addSequenceFeature(newFeature);
                 }
               }
index 3cbef6d..3ee5be4 100644 (file)
@@ -31,6 +31,7 @@ import jalview.datamodel.SequenceGroup;
 import jalview.datamodel.SequenceI;
 import jalview.datamodel.VisibleContigsIterator;
 import jalview.util.Comparison;
+import jalview.util.Platform;
 
 import java.util.List;
 import java.util.Vector;
@@ -129,7 +130,7 @@ public class Finder implements FinderI
   {
     String searchString = matchCase ? theSearchString
             : theSearchString.toUpperCase();
-    Regex searchPattern = new Regex(searchString);
+    Regex searchPattern = Platform.newRegex(searchString, null);
     searchPattern.setIgnoreCase(!matchCase);
 
     searchResults = new SearchResults();
index 137b7f8..69a3846 100644 (file)
@@ -12,13 +12,30 @@ import java.util.Map;
 import java.util.StringTokenizer;
 
 /**
- * A singleton that provides instances of genetic code translation tables
+ * A static class that provides instances of genetic code translation tables
  * 
  * @author gmcarstairs
  * @see https://www.ncbi.nlm.nih.gov/Taxonomy/Utils/wprintgc.cgi
  */
 public final class GeneticCodes
 {
+
+  /**
+   * As implemented, this has to be the first table defined in the data file.
+   */
+  private static GeneticCodeI standardTable;
+
+  /**
+   * 
+   * @return the standard code table (table 1)
+   */
+  public static GeneticCodeI getStandardCodeTable()
+  {
+    return (standardTable == null
+            ? standardTable = codeTables.values().iterator().next()
+            : standardTable);
+  }
+
   private static final int CODON_LENGTH = 3;
 
   private static final String QUOTE = "\"";
@@ -39,42 +56,31 @@ public final class GeneticCodes
 
   private static final String RESOURCE_FILE = "/GeneticCodes.dat";
 
-  private static GeneticCodes instance = new GeneticCodes();
-
-  private Map<String, String> ambiguityCodes;
+  private static final Map<String, String> ambiguityCodes;
 
   /*
    * loaded code tables, with keys in order of loading 
    */
-  private Map<String, GeneticCodeI> codeTables;
+  private static final Map<String, GeneticCodeI> codeTables;
 
-  /**
-   * Private constructor enforces singleton
-   */
-  private GeneticCodes()
+  static
   {
-    if (instance == null)
-    {
-      ambiguityCodes = new HashMap<>();
+    ambiguityCodes = new HashMap<>();
 
-      /*
-       * LinkedHashMap preserves order of addition of entries,
-       * so we can assume the Standard Code Table is the first
-       */
-      codeTables = new LinkedHashMap<>();
-      loadAmbiguityCodes(AMBIGUITY_CODES_FILE);
-      loadCodes(RESOURCE_FILE);
-    }
+    /*
+     * LinkedHashMap preserves order of addition of entries,
+     * so we can assume the Standard Code Table is the first
+     */
+    codeTables = new LinkedHashMap<>();
+    loadAmbiguityCodes(AMBIGUITY_CODES_FILE);
+    loadCodes(RESOURCE_FILE);
   }
 
   /**
-   * Returns the singleton instance of this class
-   * 
-   * @return
+   * Private constructor enforces no instantiation
    */
-  public static GeneticCodes getInstance()
+  private GeneticCodes()
   {
-    return instance;
   }
 
   /**
@@ -82,41 +88,30 @@ public final class GeneticCodes
    * 
    * @return
    */
-  public Iterable<GeneticCodeI> getCodeTables()
+  public static Iterable<GeneticCodeI> getCodeTables()
   {
     return codeTables.values();
   }
 
   /**
-   * Answers the code table with the given id
+   * Answers the code table with the given id -- test suite only
    * 
    * @param id
    * @return
    */
-  public GeneticCodeI getCodeTable(String id)
+  public static GeneticCodeI getCodeTable(String id)
   {
     return codeTables.get(id);
   }
 
   /**
-   * A convenience method that returns the standard code table (table 1). As
-   * implemented, this has to be the first table defined in the data file.
-   * 
-   * @return
-   */
-  public GeneticCodeI getStandardCodeTable()
-  {
-    return codeTables.values().iterator().next();
-  }
-
-  /**
    * Loads the code tables from a data file
    */
-  protected void loadCodes(String fileName)
+  private static void loadCodes(String fileName)
   {
     try
     {
-      InputStream is = getClass().getResourceAsStream(fileName);
+      InputStream is = GeneticCodes.class.getResourceAsStream(fileName);
       if (is == null)
       {
         System.err.println("Resource file not found: " + fileName);
@@ -163,11 +158,11 @@ public final class GeneticCodes
    * 
    * @param fileName
    */
-  protected void loadAmbiguityCodes(String fileName)
+  private static void loadAmbiguityCodes(String fileName)
   {
     try
     {
-      InputStream is = getClass().getResourceAsStream(fileName);
+      InputStream is = GeneticCodes.class.getResourceAsStream(fileName);
       if (is == null)
       {
         System.err.println("Resource file not found: " + fileName);
@@ -209,7 +204,7 @@ public final class GeneticCodes
    * @return
    * @throws IOException
    */
-  protected String readLine(BufferedReader dataIn) throws IOException
+  private static String readLine(BufferedReader dataIn) throws IOException
   {
     String line = dataIn.readLine();
     while (line != null && line.startsWith("#"))
@@ -247,7 +242,8 @@ public final class GeneticCodes
    * @return
    * @throws IOException
    */
-  protected String loadOneTable(BufferedReader dataIn) throws IOException
+  private static String loadOneTable(BufferedReader dataIn)
+          throws IOException
   {
     String name = null;
     String id = null;
@@ -307,7 +303,7 @@ public final class GeneticCodes
    * @param name
    * @param codons
    */
-  protected void registerCodeTable(final String id, final String name,
+  private static void registerCodeTable(final String id, final String name,
           final Map<String, String> codons)
   {
     codeTables.put(id, new GeneticCodeI()
@@ -365,7 +361,7 @@ public final class GeneticCodes
    * @param codeTable
    * @return
    */
-  protected String getAmbiguousTranslation(String codon,
+  protected static String getAmbiguousTranslation(String codon,
           Map<String, String> ambiguous, GeneticCodeI codeTable)
   {
     if (codon.length() != CODON_LENGTH)
@@ -423,4 +419,5 @@ public final class GeneticCodes
     ambiguous.put(codon, peptide);
     return peptide;
   }
+
 }
index 4b68d93..9937a47 100644 (file)
@@ -23,6 +23,7 @@ package jalview.analysis;
 import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.SequenceI;
+import jalview.util.Platform;
 
 import com.stevesoft.pat.Regex;
 
@@ -90,7 +91,7 @@ public class ParseProperties
           String[] ScoreDescriptions, String regex, boolean repeat)
   {
     int count = 0;
-    Regex pattern = new Regex(regex);
+    Regex pattern = Platform.newRegex(regex, null);
     if (pattern.numSubs() > ScoreNames.length)
     {
       // Check that we have enough labels and descriptions for any parsed
@@ -134,7 +135,7 @@ public class ParseProperties
           double score = Double.NaN;
           try
           {
-            score = Double.valueOf(sstring).doubleValue();
+            score = new Double(sstring).doubleValue();
           } catch (Exception e)
           {
             // don't try very hard to parse if regex was wrong.
index fdca89d..fabd0c6 100755 (executable)
@@ -45,8 +45,8 @@ public class SeqsetUtils
   {
     Hashtable sqinfo = new Hashtable();
     sqinfo.put("Name", seq.getName());
-    sqinfo.put("Start", Integer.valueOf(seq.getStart()));
-    sqinfo.put("End", Integer.valueOf(seq.getEnd()));
+    sqinfo.put("Start", new Integer(seq.getStart()));
+    sqinfo.put("End", new Integer(seq.getEnd()));
     if (seq.getDescription() != null)
     {
       sqinfo.put("Description", seq.getDescription());
index c04df6c..cc97be0 100644 (file)
@@ -226,14 +226,14 @@ public class StructureFrequency
           maxResidue = "{";
         }
       }
-      residueHash.put(MAXCOUNT, Integer.valueOf(count));
+      residueHash.put(MAXCOUNT, new Integer(count));
       residueHash.put(MAXRESIDUE, maxResidue);
 
       percentage = ((float) count * 100) / jSize;
-      residueHash.put(PID_GAPS, Float.valueOf(percentage));
+      residueHash.put(PID_GAPS, new Float(percentage));
 
       percentage = ((float) count * 100) / nongap;
-      residueHash.put(PID_NOGAPS, Float.valueOf(percentage));
+      residueHash.put(PID_NOGAPS, new Float(percentage));
 
       if (result[i] == null)
       {
@@ -260,14 +260,14 @@ public class StructureFrequency
           residueHash.put(PAIRPROFILE, pairs);
         }
 
-        residueHash.put(MAXCOUNT, Integer.valueOf(count));
+        residueHash.put(MAXCOUNT, new Integer(count));
         residueHash.put(MAXRESIDUE, maxResidue);
 
         percentage = ((float) count * 100) / jSize;
-        residueHash.put(PID_GAPS, Float.valueOf(percentage));
+        residueHash.put(PID_GAPS, new Float(percentage));
 
         percentage = ((float) count * 100) / nongap;
-        residueHash.put(PID_NOGAPS, Float.valueOf(percentage));
+        residueHash.put(PID_NOGAPS, new Float(percentage));
 
         result[bpEnd] = residueHash;
       }
index 8545e94..38217e9 100644 (file)
@@ -55,20 +55,17 @@ public class FeatureDistanceModel extends DistanceScoreModel
   @Override
   public ScoreModelI getInstance(AlignmentViewPanel view)
   {
-    FeatureDistanceModel instance;
+    FeatureDistanceModel model;
     try
     {
-      instance = this.getClass().getDeclaredConstructor().newInstance();
-      instance.configureFromAlignmentView(view);
-      return instance;
+      model = this.getClass().newInstance();
+      model.configureFromAlignmentView(view);
+      return model;
     } catch (InstantiationException | IllegalAccessException e)
     {
       System.err.println("Error in " + getClass().getName()
               + ".getInstance(): " + e.getMessage());
       return null;
-    } catch (ReflectiveOperationException roe)
-    {
-      return null;
     }
   }
 
@@ -191,7 +188,7 @@ public class FeatureDistanceModel extends DistanceScoreModel
   protected Map<SeqCigar, Set<String>> findFeatureTypesAtColumn(
           SeqCigar[] seqs, int columnPosition)
   {
-    Map<SeqCigar, Set<String>> sfap = new HashMap<>();
+    Map<SeqCigar, Set<String>> sfap = new HashMap<SeqCigar, Set<String>>();
     for (SeqCigar seq : seqs)
     {
       int spos = seq.findPosition(columnPosition);
@@ -200,7 +197,7 @@ public class FeatureDistanceModel extends DistanceScoreModel
         /*
          * position is not a gap
          */
-        Set<String> types = new HashSet<>();
+        Set<String> types = new HashSet<String>();
         List<SequenceFeature> sfs = fr.findFeaturesAtResidue(
                 seq.getRefSeq(), spos);
         for (SequenceFeature sf : sfs)
index b206339..c53ecdb 100644 (file)
@@ -54,7 +54,8 @@ public class ScoreMatrix extends SimilarityScoreModel
    * score matrix (JAL-2397)
    * Set this flag to true (via Groovy) for 2.10.1 behaviour
    */
-  private static boolean scoreGapAsAny = false;
+  // BH 2019.05.08 was static but not ever set
+  private boolean scoreGapAsAny = false;
 
   public static final short UNMAPPED = (short) -1;
 
index ebc9a26..8700ec0 100644 (file)
@@ -22,6 +22,8 @@ package jalview.analysis.scoremodels;
 
 import jalview.api.AlignmentViewPanel;
 import jalview.api.analysis.ScoreModelI;
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
 import jalview.io.DataSourceType;
 import jalview.io.FileParse;
 import jalview.io.ScoreMatrixFile;
@@ -33,18 +35,8 @@ import java.util.Map;
 /**
  * A class that can register and serve instances of ScoreModelI
  */
-public class ScoreModels
+public class ScoreModels implements ApplicationSingletonI
 {
-  private final ScoreMatrix BLOSUM62;
-
-  private final ScoreMatrix PAM250;
-
-  private final ScoreMatrix DNA;
-
-  private static ScoreModels instance;
-
-  private Map<String, ScoreModelI> models;
-
   /**
    * Answers the singleton instance of this class, with lazy initialisation
    * (built-in score models are loaded on the first call to this method)
@@ -53,11 +45,7 @@ public class ScoreModels
    */
   public static ScoreModels getInstance()
   {
-    if (instance == null)
-    {
-      instance = new ScoreModels();
-    }
-    return instance;
+    return (ScoreModels) ApplicationSingletonProvider.getInstance(ScoreModels.class);
   }
 
   /**
@@ -84,6 +72,14 @@ public class ScoreModels
     registerScoreModel(new FeatureDistanceModel());
   }
 
+  private final ScoreMatrix BLOSUM62;
+
+  private final ScoreMatrix PAM250;
+
+  private final ScoreMatrix DNA;
+
+  private Map<String, ScoreModelI> models;
+
   /**
    * Tries to load a score matrix from the given resource file, and if
    * successful, registers it.
@@ -153,7 +149,7 @@ public class ScoreModels
    */
   public void reset()
   {
-    instance = new ScoreModels();
+    ApplicationSingletonProvider.removeInstance(this.getClass());
   }
 
   /**
index 5c47703..69ca403 100644 (file)
@@ -104,6 +104,7 @@ public class SimilarityParams implements SimilarityParamsI
 
   private boolean denominateByShortestLength;
 
+
   /**
    * Constructor
    * 
@@ -124,6 +125,19 @@ public class SimilarityParams implements SimilarityParamsI
     denominateByShortestLength = shortestLength;
   }
 
+  /**
+   * BH added a non-Groovy "standard" set for JalviewJS
+   * 
+   * @param isPCA
+   */
+  public SimilarityParams(boolean isPCA)
+  {
+    includeGappedColumns = true;
+    matchGaps = !isPCA;
+    includeGaps = true;
+    denominateByShortestLength = false;
+  }
+
   @Override
   public boolean includeGaps()
   {
diff --git a/src/jalview/api/AlignFrameI.java b/src/jalview/api/AlignFrameI.java
new file mode 100644 (file)
index 0000000..c675a6e
--- /dev/null
@@ -0,0 +1,13 @@
+package jalview.api;
+
+/**
+ * Common methods for jalview.appletgui.AlignFrame and jalview.gui.AlignFrame in
+ * relation to JalviewJS and the JalviewLiteJSApi
+ * 
+ * @author hansonr
+ *
+ */
+public interface AlignFrameI
+{
+
+}
index dcd3258..cec61f4 100644 (file)
@@ -200,6 +200,12 @@ public interface AlignViewportI extends ViewStyleI
    * sub-groups, which may have their own colour schemes). A null value is used
    * for no residue colour (white).
    * 
+   * BH Note: It is critical that any call to
+   * AlignViewportI.setGlobalColourScheme is followed closely, if not
+   * immediately, by a call to AlignPanel.repaint(true, true) so that the
+   * overview is updated. When that happens, the sequence overview color caches
+   * are cleared.
+   * 
    * @param cs
    */
   void setGlobalColourScheme(ColourSchemeI cs);
index 06b1675..70dda87 100644 (file)
@@ -20,6 +20,8 @@
  */
 package jalview.api;
 
+import java.util.BitSet;
+
 public interface AlignmentColsCollectionI extends Iterable<Integer>
 {
   /**
@@ -37,4 +39,20 @@ public interface AlignmentColsCollectionI extends Iterable<Integer>
    * @return true if there is at least 1 hidden column
    */
   public boolean hasHidden();
+
+  /**
+   * Get the visible-column bitset, possibly containing hidden columns (which
+   * may or may not be hidden in the overview).
+   * 
+   * @return a BitSet
+   */
+  public BitSet getOverviewBitSet();
+
+  /**
+   * Get the hidden-column bitset, (which may or may not be hidden in the
+   * overview).
+   * 
+   * @return
+   */
+  BitSet getHiddenBitSet();
 }
index 0b1ca21..9593a5b 100644 (file)
@@ -23,6 +23,8 @@ package jalview.api;
 import jalview.datamodel.AlignmentI;
 import jalview.structure.StructureSelectionManager;
 
+import java.awt.image.BufferedImage;
+
 /**
  * abstract interface implemented by alignment panels holding an alignment view
  * 
@@ -63,4 +65,9 @@ public interface AlignmentViewPanel extends OOMHandlerI
    * @return displayed name for the view
    */
   String getViewName();
+
+  SequenceRenderer getSequenceRenderer();
+
+  void overviewDone(BufferedImage miniMe);
+
 }
index 7bfd8a8..c5f6727 100644 (file)
@@ -64,10 +64,9 @@ public interface FeatureColourI
   Color getNoColour();
 
   /**
-   * Answers true if the feature has a single colour, i.e. if isColourByLabel()
-   * and isGraduatedColour() both answer false
+   * Answers true if the feature has a single colour
    * 
-   * @return
+   * @return true iff not (isColourByLabel() || isGraduatedColour())
    */
   boolean isSimpleColour();
 
index 404c497..6caa1c7 100644 (file)
@@ -125,7 +125,7 @@ public interface FeatureRenderer
   List<String> getFeatureGroups();
 
   /**
-   * get groups that are visible/invisible
+   * get groups that are visible/invisible -- JalviewLite only?
    * 
    * @param visible
    * @return
@@ -133,7 +133,7 @@ public interface FeatureRenderer
   List<String> getGroups(boolean visible);
 
   /**
-   * Set visibility for a list of groups
+   * Set visibility for a list of groups -- JalviewLite only?
    * 
    * @param toset
    * @param visible
diff --git a/src/jalview/api/JalviewApp.java b/src/jalview/api/JalviewApp.java
new file mode 100644 (file)
index 0000000..0548c85
--- /dev/null
@@ -0,0 +1,82 @@
+package jalview.api;
+
+import jalview.datamodel.ColumnSelection;
+import jalview.datamodel.HiddenColumns;
+import jalview.datamodel.PDBEntry;
+import jalview.datamodel.SequenceGroup;
+import jalview.datamodel.SequenceI;
+import jalview.io.DataSourceType;
+import jalview.io.NewickFile;
+import jalview.javascript.JSFunctionExec;
+import jalview.javascript.MouseOverStructureListener;
+import jalview.structure.SelectionSource;
+import jalview.structure.VamsasSource;
+
+import java.applet.AppletContext;
+import java.io.IOException;
+import java.net.URL;
+import java.util.Hashtable;
+import java.util.Vector;
+
+import netscape.javascript.JSObject;
+
+public interface JalviewApp
+{
+  public String getParameter(String name);
+
+  public boolean getDefaultParameter(String name, boolean def);
+
+  public URL getDocumentBase();
+
+  public URL getCodeBase();
+
+  public void setAlignPdbStructures(boolean defaultParameter);
+
+  public void newStructureView(PDBEntry pdb, SequenceI[] seqs,
+          String[] chains, DataSourceType protocol);
+
+  public void alignedStructureView(PDBEntry[] pdb, SequenceI[][] seqs,
+          String[][] chains, String[] protocols);
+
+  public void updateForAnnotations();
+
+  public AlignViewportI getViewport();
+
+  public void setFeatureGroupState(String[] groups, boolean state);
+
+  public boolean parseFeaturesFile(String param, DataSourceType protocol);
+
+  public void newFeatureSettings();
+
+  public boolean loadScoreFile(String sScoreFile) throws IOException;
+
+  public void loadTree(NewickFile fin, String treeFile) throws IOException;
+
+  public Vector<Runnable> getJsExecQueue(JSFunctionExec jsFunctionExec);
+
+  public AppletContext getAppletContext();
+
+  public boolean isJsfallbackEnabled();
+
+  public JSObject getJSObject();
+
+  public StructureSelectionManagerProvider getStructureSelectionManagerProvider();
+
+  public void updateColoursFromMouseOver(Object source,
+          MouseOverStructureListener mouseOverStructureListener);
+
+  public Object[] getSelectionForListener(SequenceGroup seqsel, ColumnSelection colsel,
+          HiddenColumns hidden, SelectionSource source, Object alignFrame);
+
+  public String arrayToSeparatorList(String[] array);
+
+  public Hashtable<String, int[]> getJSHashes();
+
+  Hashtable<String, Hashtable<String, String[]>> getJSMessages();
+
+  public Object getFrameForSource(VamsasSource source);
+
+  public jalview.renderer.seqfeatures.FeatureRenderer getNewFeatureRenderer(
+          AlignViewportI vp);
+
+}
index f3fdd67..062dbf8 100644 (file)
@@ -25,6 +25,7 @@ import jalview.analysis.AnnotationSorter.SequenceAnnotationOrder;
 import jalview.analysis.TreeBuilder;
 import jalview.analysis.scoremodels.PIDModel;
 import jalview.analysis.scoremodels.ScoreModels;
+import jalview.api.AlignFrameI;
 import jalview.api.AlignViewControllerGuiI;
 import jalview.api.AlignViewControllerI;
 import jalview.api.AlignViewportI;
@@ -106,7 +107,6 @@ import java.awt.event.KeyListener;
 import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
 import java.io.IOException;
-import java.io.UnsupportedEncodingException;
 import java.net.URL;
 import java.net.URLEncoder;
 import java.util.Arrays;
@@ -119,7 +119,8 @@ import java.util.Vector;
 
 import org.jmol.viewer.Viewer;
 
-public class AlignFrame extends EmbmenuFrame implements ActionListener,
+public class AlignFrame extends EmbmenuFrame implements AlignFrameI,
+        ActionListener,
         ItemListener, KeyListener, AlignViewControllerGuiI
 {
   public AlignViewControllerI avc;
@@ -881,7 +882,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     }
     else if (source == autoCalculate)
     {
-      viewport.autoCalculateConsensus = autoCalculate.getState();
+      viewport.setAutoCalculateConsensusAndConservation(autoCalculate.getState());
     }
     else if (source == sortByTree)
     {
@@ -1570,7 +1571,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     try
     {
       new URL(url);
-      url = URLEncoder.encode(url, "UTF-8");
+      url = URLEncoder.encode(url);
     }
     /*
      * When we finally deprecate 1.1 compatibility, we can start to use
@@ -1583,13 +1584,6 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     {
       url = viewport.applet.getCodeBase() + url;
     }
-    catch (UnsupportedEncodingException ex)
-    {
-      System.err.println(
-              "WARNING = IMPLEMENTATION ERROR - UNSUPPORTED ENCODING EXCEPTION FOR "
-                      + url);
-      ex.printStackTrace();
-    }
     return url;
   }
 
index 0727673..2bead46 100644 (file)
@@ -71,7 +71,7 @@ public class AlignViewport extends AlignmentViewport
       {
         try
         {
-          widthScale = Float.valueOf(param).floatValue();
+          widthScale = new Float(param).floatValue();
         } catch (Exception e)
         {
         }
@@ -94,7 +94,7 @@ public class AlignViewport extends AlignmentViewport
       {
         try
         {
-          heightScale = Float.valueOf(param).floatValue();
+          heightScale = new Float(param).floatValue();
         } catch (Exception e)
         {
         }
index 58569cd..df8fe87 100644 (file)
@@ -43,6 +43,7 @@ import java.awt.event.AdjustmentEvent;
 import java.awt.event.AdjustmentListener;
 import java.awt.event.ComponentAdapter;
 import java.awt.event.ComponentEvent;
+import java.awt.image.BufferedImage;
 import java.beans.PropertyChangeEvent;
 import java.util.List;
 
@@ -178,6 +179,7 @@ public class AlignmentPanel extends Panel
     return av;
   }
 
+  @Override
   public SequenceRenderer getSequenceRenderer()
   {
     return seqPanel.seqCanvas.sr;
@@ -1158,4 +1160,10 @@ public class AlignmentPanel extends Panel
 
   }
 
+  @Override
+  public void overviewDone(BufferedImage miniMe)
+  {
+    overviewPanel.canvas.finalizeDraw(miniMe);
+  }
+
 }
index 9456986..6eca05e 100644 (file)
@@ -22,6 +22,7 @@ package jalview.appletgui;
 
 import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.SequenceGroup;
+import jalview.gui.Preferences;
 import jalview.schemes.AnnotationColourGradient;
 import jalview.schemes.ColourSchemeI;
 import jalview.util.MessageManager;
@@ -217,9 +218,9 @@ public class AnnotationColourChooser extends Panel implements
   private void setDefaultMinMax()
   {
     minColour.setBackground(av.applet.getDefaultColourParameter(
-            "ANNOTATIONCOLOUR_MIN", Color.orange));
+            Preferences.ANNOTATIONCOLOUR_MIN, Color.orange));
     maxColour.setBackground(av.applet
-            .getDefaultColourParameter("ANNOTATIONCOLOUR_MAX", Color.red));
+            .getDefaultColourParameter(Preferences.ANNOTATIONCOLOUR_MAX, Color.red));
 
   }
 
@@ -350,7 +351,7 @@ public class AnnotationColourChooser extends Panel implements
     {
       try
       {
-        float f = Float.valueOf(thresholdValue.getText()).floatValue();
+        float f = new Float(thresholdValue.getText()).floatValue();
         slider.setValue((int) (f * 1000));
         adjustmentValueChanged(null);
       } catch (NumberFormatException ex)
index a0102b9..1366f31 100755 (executable)
@@ -457,8 +457,8 @@ public class AnnotationLabels extends Panel
             .getAlignmentAnnotation();
 
     // DETECT RIGHT MOUSE BUTTON IN AWT
-    if ((evt.getModifiersEx()
-            & InputEvent.BUTTON3_DOWN_MASK) == InputEvent.BUTTON3_DOWN_MASK)
+    if ((evt.getModifiers()
+            & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK)
     {
 
       PopupMenu popup = new PopupMenu(
index 3dae998..26d3a3b 100755 (executable)
@@ -354,8 +354,8 @@ public class AnnotationPanel extends Panel
       }
     }
 
-    if ((evt.getModifiersEx()
-            & InputEvent.BUTTON3_DOWN_MASK) == InputEvent.BUTTON3_DOWN_MASK
+    if ((evt.getModifiers()
+            & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK
             && activeRow != -1)
     {
       if (av.getColumnSelection() == null
index 0edb8c0..b6b81fa 100644 (file)
@@ -52,8 +52,7 @@ import java.util.Map;
  * 
  */
 @SuppressWarnings("serial")
-public class EmbmenuFrame extends Frame
-        implements MouseListener, AutoCloseable
+public class EmbmenuFrame extends Frame implements MouseListener
 {
   protected static final Font FONT_ARIAL_PLAIN_11 = new Font("Arial",
           Font.PLAIN, 11);
@@ -63,7 +62,7 @@ public class EmbmenuFrame extends Frame
   /**
    * map from labels to popup menus for the embedded menubar
    */
-  protected Map<Label, PopupMenu> embeddedPopup = new HashMap<>();
+  protected Map<Label, PopupMenu> embeddedPopup = new HashMap<Label, PopupMenu>();
 
   /**
    * the embedded menu is built on this and should be added to the frame at the
@@ -203,7 +202,6 @@ public class EmbmenuFrame extends Frame
     return embeddedMenu;
   }
 
-  @Override
   public void mousePressed(MouseEvent evt)
   {
     PopupMenu popup = null;
@@ -228,22 +226,18 @@ public class EmbmenuFrame extends Frame
     return embeddedPopup.get(source);
   }
 
-  @Override
   public void mouseClicked(MouseEvent evt)
   {
   }
 
-  @Override
   public void mouseReleased(MouseEvent evt)
   {
   }
 
-  @Override
   public void mouseEntered(MouseEvent evt)
   {
   }
 
-  @Override
   public void mouseExited(MouseEvent evt)
   {
   }
@@ -271,13 +265,11 @@ public class EmbmenuFrame extends Frame
   /**
    * calls destroyMenus()
    */
-  @Override
-  public void close()
+  public void finalize() throws Throwable
   {
     destroyMenus();
     embeddedPopup = null;
     embeddedMenu = null;
-    // no close for Frame
-    // super.finalize();
+    super.finalize();
   }
 }
index 0d70660..5569ab0 100644 (file)
@@ -311,7 +311,7 @@ public class FeatureColourChooser extends Panel implements ActionListener,
   {
     try
     {
-      float f = Float.valueOf(thresholdValue.getText()).floatValue();
+      float f = new Float(thresholdValue.getText()).floatValue();
       slider.setValue((int) (f * SCALE_FACTOR_1K));
       adjustmentValueChanged(null);
 
index 489cbb1..a60aacd 100755 (executable)
@@ -703,7 +703,7 @@ public class FeatureSettings extends Panel
   public void mouseClicked(MouseEvent evt)
   {
     MyCheckbox check = (MyCheckbox) evt.getSource();
-    if ((evt.getModifiersEx() & InputEvent.BUTTON3_DOWN_MASK) != 0)
+    if ((evt.getModifiers() & InputEvent.BUTTON3_MASK) != 0)
     {
       this.popupSort(check, fr.getMinMax(), evt.getX(), evt.getY());
     }
index 8b74e32..443ebce 100644 (file)
@@ -31,9 +31,9 @@ import java.awt.FlowLayout;
 import java.awt.Font;
 import java.awt.FontMetrics;
 import java.awt.Frame;
-import java.awt.GraphicsEnvironment;
 import java.awt.Label;
 import java.awt.Panel;
+import java.awt.Toolkit;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.ItemEvent;
@@ -144,9 +144,7 @@ public class FontChooser extends Panel implements ItemListener
    */
   void init()
   {
-    // String fonts[] = Toolkit.getDefaultToolkit().getFontList();
-    String fonts[] = GraphicsEnvironment.getLocalGraphicsEnvironment()
-            .getAvailableFontFamilyNames();
+    String fonts[] = Toolkit.getDefaultToolkit().getFontList();
     for (int i = 0; i < fonts.length; i++)
     {
       fontName.addItem(fonts[i]);
index 1d37d08..af1c47b 100755 (executable)
@@ -279,8 +279,8 @@ public class IdPanel extends Panel
 
     int seq = alignPanel.seqPanel.findSeq(e);
 
-    if ((e.getModifiersEx()
-            & InputEvent.BUTTON3_DOWN_MASK) == InputEvent.BUTTON3_DOWN_MASK)
+    if ((e.getModifiers()
+            & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK)
     {
       SequenceI sq = av.getAlignment().getSequenceAt(seq);
 
index 07f5919..7f4e962 100644 (file)
@@ -30,7 +30,9 @@ import java.awt.Dimension;
 import java.awt.Frame;
 import java.awt.Graphics;
 import java.awt.Image;
+import java.awt.image.BufferedImage;
 
+@SuppressWarnings("serial")
 public class OverviewCanvas extends Component
 {
   // This is set true if the alignment view changes whilst
@@ -49,13 +51,23 @@ public class OverviewCanvas extends Component
 
   private AlignViewport av;
 
+  private boolean showSequenceFeatures;
+
+  private boolean showAnnotation;
+
+  private jalview.api.FeatureRenderer featureRenderer;
+
   private jalview.renderer.seqfeatures.FeatureRenderer fr;
 
   private Frame nullFrame;
 
-  public OverviewCanvas(OverviewDimensions overviewDims,
+  private OverviewPanel panel;
+
+  public OverviewCanvas(OverviewPanel panel,
+          OverviewDimensions overviewDims,
           AlignViewport alignvp)
   {
+    this.panel = panel;
     od = overviewDims;
     av = alignvp;
 
@@ -101,46 +113,23 @@ public class OverviewCanvas extends Component
   }
 
   public void draw(boolean showSequenceFeatures, boolean showAnnotation,
-          FeatureRenderer transferRenderer)
+          jalview.api.FeatureRenderer featureRenderer)
   {
-    miniMe = null;
+    this.showSequenceFeatures = showSequenceFeatures;
+    this.showAnnotation = showAnnotation;
+    this.featureRenderer = featureRenderer;
 
     if (showSequenceFeatures)
     {
-      fr.transferSettings(transferRenderer);
+      fr.transferSettings(featureRenderer);
     }
 
     setPreferredSize(new Dimension(od.getWidth(), od.getHeight()));
 
-    or = new OverviewRenderer(fr, od, av.getAlignment(),
+    or = new OverviewRenderer(panel.ap, fr, od, av.getAlignment(),
             av.getResidueShading(), new OverviewResColourFinder());
-    miniMe = nullFrame.createImage(od.getWidth(), od.getHeight());
     offscreen = nullFrame.createImage(od.getWidth(), od.getHeight());
-
-    miniMe = or.draw(od.getRows(av.getAlignment()),
-            od.getColumns(av.getAlignment()));
-
-    Graphics mg = miniMe.getGraphics();
-
-    // checks for conservation annotation to make sure overview works for DNA
-    // too
-    if (showAnnotation)
-    {
-      mg.translate(0, od.getSequencesHeight());
-      or.drawGraph(mg, av.getAlignmentConservationAnnotation(),
-              od.getGraphHeight(), od.getColumns(av.getAlignment()));
-      mg.translate(0, -od.getSequencesHeight());
-    }
-
-    if (restart)
-    {
-      restart = false;
-      draw(showSequenceFeatures, showAnnotation, transferRenderer);
-    }
-    else
-    {
-      updaterunning = false;
-    }
+    or.drawMiniMe();
   }
 
   @Override
@@ -152,13 +141,14 @@ public class OverviewCanvas extends Component
   @Override
   public void paint(Graphics g)
   {
-    Graphics og = offscreen.getGraphics();
     if (miniMe != null)
     {
+      Graphics og = offscreen.getGraphics();
       og.drawImage(miniMe, 0, 0, this);
       og.setColor(Color.red);
       od.drawBox(og);
       g.drawImage(offscreen, 0, 0, this);
+      og.dispose();
     }
   }
 
@@ -170,4 +160,25 @@ public class OverviewCanvas extends Component
     od = null;
   }
 
+  public void finalizeDraw(BufferedImage miniMe)
+  {
+    if (restart)
+    {
+      restart = false;
+      draw(showSequenceFeatures, showAnnotation, featureRenderer);
+    }
+    else
+    {
+      this.miniMe = miniMe;
+      // checks for conservation annotation to make sure overview works for DNA
+      // too
+      if (showAnnotation)
+      {
+        or.drawGraph(av.getAlignmentConservationAnnotation());
+      }
+      updaterunning = false;
+      repaint();
+    }
+  }
+
 }
index ddb49f1..328841c 100755 (executable)
@@ -46,16 +46,17 @@ import java.beans.PropertyChangeEvent;
 
 import javax.swing.SwingUtilities;
 
+@SuppressWarnings("serial")
 public class OverviewPanel extends Panel implements Runnable,
         MouseMotionListener, MouseListener, ViewportListenerI
 {
-  private OverviewDimensions od;
+  OverviewDimensions od;
 
-  private OverviewCanvas oviewCanvas;
+  OverviewCanvas canvas;
 
   private AlignViewport av;
 
-  private AlignmentPanel ap;
+  AlignmentPanel ap;
 
   private boolean showHidden = true;
 
@@ -73,9 +74,9 @@ public class OverviewPanel extends Panel implements Runnable,
             (av.isShowAnnotation()
                     && av.getSequenceConsensusHash() != null));
 
-    oviewCanvas = new OverviewCanvas(od, av);
+    canvas = new OverviewCanvas(this, od, av);
     setLayout(new BorderLayout());
-    add(oviewCanvas, BorderLayout.CENTER);
+    add(canvas, BorderLayout.CENTER);
 
     setSize(new Dimension(od.getWidth(), od.getHeight()));
 
@@ -116,8 +117,8 @@ public class OverviewPanel extends Panel implements Runnable,
   @Override
   public void mouseClicked(MouseEvent evt)
   {
-    if ((evt.getModifiersEx()
-            & InputEvent.BUTTON3_DOWN_MASK) == InputEvent.BUTTON3_DOWN_MASK)
+    if ((evt.getModifiers()
+            & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK)
     {
       showPopupMenu(evt);
     }
@@ -142,8 +143,8 @@ public class OverviewPanel extends Panel implements Runnable,
   @Override
   public void mousePressed(MouseEvent evt)
   {
-    if ((evt.getModifiersEx()
-            & InputEvent.BUTTON3_DOWN_MASK) == InputEvent.BUTTON3_DOWN_MASK)
+    if ((evt.getModifiers()
+            & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK)
     {
       if (!Platform.isMac()) // BH was excluding JavaScript
       {
@@ -187,14 +188,10 @@ public class OverviewPanel extends Panel implements Runnable,
   @Override
   public void mouseDragged(MouseEvent evt)
   {
-    if (Platform.isWinRightButton(evt))
+    if (Platform.isWinRightButton(evt)) 
     {
-      if ((evt.getModifiersEx()
-              & InputEvent.BUTTON3_DOWN_MASK) == InputEvent.BUTTON3_DOWN_MASK)
-      {
-       showPopupMenu(evt);
-       return;
-      }
+       showPopupMenu(evt);
+       return;
     }
 
     if (SwingUtilities.isRightMouseButton(evt))
@@ -224,7 +221,7 @@ public class OverviewPanel extends Panel implements Runnable,
    */
   public void updateOverviewImage()
   {
-    if (oviewCanvas == null)
+    if (canvas == null)
     {
       /*
        * panel has been disposed
@@ -243,7 +240,7 @@ public class OverviewPanel extends Panel implements Runnable,
     {
       if (updateRunning)
       {
-        oviewCanvas.restartDraw();
+        canvas.restartDraw();
         return;
       }
 
@@ -258,11 +255,11 @@ public class OverviewPanel extends Panel implements Runnable,
   @Override
   public void run()
   {
-    oviewCanvas.draw(av.isShowSequenceFeatures(),
+    setBoxPosition();
+    canvas.draw(av.isShowSequenceFeatures(),
             (av.isShowAnnotation()
                     && av.getAlignmentConservationAnnotation() != null),
             ap.seqPanel.seqCanvas.getFeatureRenderer());
-    setBoxPosition();
   }
 
   /**
@@ -325,7 +322,7 @@ public class OverviewPanel extends Panel implements Runnable,
               (av.isShowAnnotation()
                       && av.getAlignmentConservationAnnotation() != null));
     }
-    oviewCanvas.resetOviewDims(od);
+    canvas.resetOviewDims(od);
     updateOverviewImage();
   }
 
@@ -343,11 +340,11 @@ public class OverviewPanel extends Panel implements Runnable,
     } finally
     {
       av = null;
-      if (oviewCanvas != null)
+      if (canvas != null)
       {
-        oviewCanvas.dispose();
+        canvas.dispose();
       }
-      oviewCanvas = null;
+      canvas = null;
       ap = null;
       od = null;
     }
index d3f4a69..c91449f 100755 (executable)
@@ -96,8 +96,8 @@ public class ScalePanel extends Panel
 
     min = res;
     max = res;
-    if ((evt.getModifiersEx()
-            & InputEvent.BUTTON3_DOWN_MASK) == InputEvent.BUTTON3_DOWN_MASK)
+    if ((evt.getModifiers()
+            & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK)
     {
       rightMouseButtonPressed(evt, res);
     }
index 5becbc1..32f0abb 100644 (file)
@@ -500,6 +500,7 @@ public class SeqPanel extends Panel implements MouseMotionListener,
 
     // For now, ignore the mouseWheel font resizing on Macs
     // As the Button2_mask always seems to be true
+    
     if (Platform.isWinMiddleButton(evt))
     {
       mouseWheelPressed = true;
@@ -1431,8 +1432,8 @@ public class SeqPanel extends Panel implements MouseMotionListener,
     }
 
     // DETECT RIGHT MOUSE BUTTON IN AWT
-    if ((evt.getModifiersEx()
-            & InputEvent.BUTTON3_DOWN_MASK) == InputEvent.BUTTON3_DOWN_MASK)
+    if ((evt.getModifiers()
+            & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK)
     {
       List<SequenceFeature> allFeatures = findFeaturesAtColumn(sequence,
               sequence.findPosition(column + 1));
index 671fee1..b5e3342 100644 (file)
@@ -46,7 +46,7 @@ import java.awt.event.ItemEvent;
 import java.awt.event.ItemListener;
 
 public class TreePanel extends EmbmenuFrame
-        implements ActionListener, ItemListener, AutoCloseable
+        implements ActionListener, ItemListener
 {
   SequenceI[] seq;
 
@@ -72,11 +72,11 @@ public class TreePanel extends EmbmenuFrame
   }
 
   @Override
-  public void close()
+  public void finalize() throws Throwable
   {
     ap = null;
     av = null;
-    super.close();
+    super.finalize();
   }
 
   /**
diff --git a/src/jalview/bin/AppletParams.java b/src/jalview/bin/AppletParams.java
new file mode 100644 (file)
index 0000000..6a23c39
--- /dev/null
@@ -0,0 +1,447 @@
+package jalview.bin;
+
+import jalview.gui.Preferences;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Vector;
+
+/**
+ * Collection of all known applet tags from JalviewLite
+ * 
+ * @author hansonr
+ *
+ */
+@SuppressWarnings("serial")
+public class AppletParams extends HashMap<String, String>
+{
+
+  private final static String[] params = { "alignpdbfiles",
+      Preferences.ANNOTATIONCOLOUR_MAX, Preferences.ANNOTATIONCOLOUR_MIN,
+      "annotations",
+      "APPLICATION_URL", "automaticScrolling", "centrecolumnlabels",
+      "debug", "defaultColour", "defaultColourNuc", "defaultColourProt",
+      "embedded", "enableSplitFrame", "externalstructureviewer", "features",
+      "file", "file2", "format", "heightScale", "hidefeaturegroups",
+      "jalviewhelpurl", "jnetfile", "jpredfile", "label", "linkLabel_",
+      "linkLabel_1", "linkURL_", "nojmol", "normaliseLogo",
+      "normaliseSequenceLogo", "oninit", "PDBFILE", "PDBSEQ",
+      "relaxedidmatch", "resolvetocodebase", "RGB", "scaleProteinAsCdna",
+      "scoreFile", "separator", "sequence", "showAnnotation", "showbutton",
+      "showConsensus", "showConsensusHistogram", "showConservation",
+      "showfeaturegroups", "showFeatureSettings", "showFullId",
+      "showGroupConsensus", "showGroupConservation", "showOccupancy",
+      "showQuality", "showSequenceLogo", "showTreeBootstraps",
+      "showTreeDistances", "showUnconserved", "showUnlinkedTreeNodes",
+      "sortBy", "sortByTree", "tree", "treeFile", "upperCase",
+      "userDefinedColour", "widthScale", "windowHeight", "windowWidth",
+      "wrap", };
+
+  public AppletParams(Map<String, String> info)
+  {
+    for (int i = params.length; --i >= 0;)
+    {
+      put(params[i], info.get(params[i]));
+    }
+  }
+
+  public String getParam(String param, String def)
+  {
+    String val = get(param);
+    return (val != null ? val : def);
+  }
+
+  // <applet
+  // code="jalview.bin.JalviewLite" width="140" height="35"
+  // archive="jalviewApplet.jar,JmolApplet-14.6.4_2016.10.26.jar,java-json.jar,json_simple-1.1.jar">
+  // <param name="permissions" value="sandbox"/>
+  // <param name="file" value="uniref50.fa"/>
+  // <param name="treeFile" value="ferredoxin.nw"/>
+  // <param name="userDefinedColour" value="C=yellow; R,K,H=FF5555;
+  // D,E=5555FF"/>
+  // <param name="sortByTree" value="True"/>
+  // <param name="showSequenceLogo" value="true"/>
+  // <param name="showGroupConsensus" value="true"/>
+  // <param name="showFullId" value="false"/>
+  // <param name="linkLabel_1" value="Uniprot"/>
+  // <param name="linkUrl_1"
+  // value="http://www.uniprot.org/uniprot/$SEQUENCE_ID$"/>
+  // <param name="linkLabel_2" value="EMBL-EBI Search"/>
+  // <param name="linkUrl_2"
+  // value="http://www.ebi.ac.uk/ebisearch/search.ebi?db=allebi&query=$SEQUENCE_ID$"/>
+  // <param name="APPLICATION_URL"
+  // value="http://www.jalview.org/services/launchApp"/>
+  // </applet>
+  //
+  public AppletParams(String outerHTML)
+  {
+    String[] tokens = outerHTML.split("<param");
+    outerHTML = tokens[0];
+    String code = getAttr(outerHTML, "code");
+    if (!code.equals("jalview.bin.JalviewLite"))
+    {
+      return;
+    }
+    for (int i = tokens.length; --i > 0;)
+    {
+      String param = tokens[i];
+      String key = getAttr(param, "name");
+      if (key != null)
+      {
+        String value = getAttr(param, "value");
+        System.out.println("AppletParams " + key + " = \"" + value + "\"");
+        put(key, value);
+      }
+    }
+    put("_width", getAttr(outerHTML, "width"));
+    put("_height", getAttr(outerHTML, "height"));
+    put("_id", getAttr(outerHTML, "id"));
+    put("_name", getAttr(outerHTML, "name"));
+    put("_archive", getAttr(outerHTML, "archive"));
+    put("_code", code);
+  }
+
+  public AppletParams()
+  {
+    // TODO Auto-generated constructor stub
+  }
+
+  public static AppletParams getAppletParams(String[] args,
+          Vector<String> vargs)
+  {
+    AppletParams appletParams = new AppletParams();
+    String resourcePath = null;
+    for (int i = args.length; --i > 0;) // > 0 is correct, not >=0
+    {
+      if (args[i].startsWith("name=\"Info.resourcePath\""))
+      {
+        resourcePath = getAttr(args[i], "value");
+        if (resourcePath.length() > 0 && !resourcePath.endsWith("/"))
+        {
+          resourcePath += "/";
+        }
+        break;
+      }
+    }
+    for (int i = 1; i < args.length; i++)
+    {
+      String arg = args[i].trim();
+      if (arg.startsWith("name="))
+      {
+        String prefName = getAttr(arg, "name");
+        String appletName = prefName.toLowerCase();
+        String argName = prefName;
+        String value = getAttr(arg, "value");
+
+        // note that Application arguments ARE case-sensitive, but
+        // Applet.getParameter() is not.
+
+        switch (appletName)
+        {
+
+        case "file":
+          argName = "open";
+          appletName = null;
+          value = resourcePath + value;
+          break;
+        case "file2":
+          argName = "open2";
+          prefName = null;
+          value = resourcePath + value;
+          break;
+        case "features":
+        case "jnetfile":
+        case "jpredfile":
+        case "pdbfile":
+        case "scorefile":
+        case "sequence":
+          // setting argName to null indicates that we want
+          // JalviewAppLoader to take care of this.
+          prefName = argName = null;
+          value = resourcePath + value;
+          break;
+        case "tree":
+        case "treefile":
+          // setting appletName to null indicates that we want
+          // Jalview.doMain to taken care of this as Jalview args
+          argName = "tree";
+          appletName = null;
+          value = resourcePath + value;
+          break;
+
+        // non-loading preferences
+
+        case "defaultcolour":
+          prefName = Preferences.DEFAULT_COLOUR;
+          break;
+        case "defaultcolournuc":
+          prefName = Preferences.DEFAULT_COLOUR_NUC;
+          break;
+        case "defaultcolourprot":
+          prefName = Preferences.DEFAULT_COLOUR_PROT;
+          break;
+        case "annotationcolour_max":
+          prefName = Preferences.ANNOTATIONCOLOUR_MAX;
+          break;
+        case "annotationcolour_min":
+          prefName = Preferences.ANNOTATIONCOLOUR_MIN;
+          break;
+        case "enablesplitframe":
+          prefName = Preferences.ENABLE_SPLIT_FRAME;
+          break;
+        case "centrecolumnlabels":
+          prefName = Preferences.CENTRE_COLUMN_LABELS;
+          break;
+        case "sortby":
+          prefName = Preferences.SORT_ALIGNMENT; // id, etc.
+          break;
+        case "normalisesequencelogo":
+          prefName = Preferences.NORMALISE_CONSENSUS_LOGO;
+          break;
+        case "relaxedidmatch":
+          prefName = Preferences.RELAXEDSEQIDMATCHING;
+          break;
+        case "scaleproteinascdna":
+          prefName = Preferences.SCALE_PROTEIN_TO_CDNA;
+          break;
+        case "userdefinedcolour":
+          argName = "colour";
+          prefName = Preferences.USER_DEFINED_COLOURS;
+          break;
+        case "wrap":
+          prefName = Preferences.WRAP_ALIGNMENT;
+          break;
+
+        // implemented; not tested:
+
+        case "oninit":
+          prefName = null;
+          break;
+        case "annotations":
+          value = resourcePath + value;
+          argName = null;
+          break;
+        case "hidefeaturegroups":
+          // TODO
+          break;
+        case "pdbseq":
+          argName = prefName = null;
+          break;
+        case "sortbytree":
+          prefName = Preferences.SORT_BY_TREE;
+          value = checkTF(value);
+          appletName = null; // taken care of by Jalview
+          break;
+        case "format":
+          break;
+        case "alignpdbfiles":
+          argName = prefName = null;
+          break;
+        case "separator":
+          break;
+
+        // TODO: probably not relevant?
+
+        case "rgb":
+          prefName = null; // TODO no background for application?
+          break;
+        case "externalstructureviewer":
+          break;
+        case "application_url":
+          break;
+        case "automaticscrolling":
+          break;
+        case "heightscale":
+          break;
+        case "jalviewhelpurl":
+          break;
+        case "label":
+          break;
+        case "linklabel_":
+          prefName = "linkLabel_";
+          break;
+        case "linklabel_1":
+          prefName = "linkLabel_1";
+          break;
+        case "linkurl_":
+          prefName = "linkURL_";
+          break;
+
+        // unknown:
+
+        case "nojmol":
+        case "normaliselogo":
+        case "resolvetocodebase":
+        case "uppercase":
+        case "widthscale":
+        case "windowheight":
+        case "windowwidth":
+          argName = prefName = null;
+          break;
+
+        // TRUE/FALSE
+
+        case "debug":
+          value = checkTF(value);
+          break;
+        case "embedded":
+          value = checkTF(value);
+          break;
+        case "showbutton":
+          value = checkTF(value);
+          break;
+        case "showannotation":
+          prefName = Preferences.SHOW_ANNOTATIONS;
+          value = checkTF(value);
+          break;
+        case "showconsensus":
+          prefName = Preferences.SHOW_CONSENSUS_LOGO;
+          value = checkTF(value);
+          break;
+        case "showconsensushistogram":
+          prefName = Preferences.SHOW_CONSENSUS_HISTOGRAM;
+          value = checkTF(value);
+          break;
+        case "showconservation":
+          prefName = Preferences.SHOW_CONSERVATION;
+          value = checkTF(value);
+          break;
+        case "showgroupconsensus":
+          prefName = Preferences.SHOW_GROUP_CONSENSUS;
+          value = checkTF(value);
+          break;
+        case "showgroupconservation":
+          prefName = Preferences.SHOW_GROUP_CONSERVATION;
+          value = checkTF(value);
+          break;
+        case "showoccupancy":
+          prefName = Preferences.SHOW_OCCUPANCY;
+          value = checkTF(value);
+          break;
+        case "showquality":
+          prefName = Preferences.SHOW_QUALITY;
+          value = checkTF(value);
+          break;
+        case "showsequencelogo":
+          prefName = Preferences.SHOW_CONSENSUS_LOGO;
+          value = checkTF(value);
+          break;
+        case "showfeaturegroups":
+          value = checkTF(value);
+          break;
+        case "showfeaturesettings":
+          value = checkTF(value);
+          break;
+        case "showfullid":
+          value = checkTF(value);
+          break;
+        case "showtreebootstraps":
+          value = checkTF(value);
+          break;
+        case "showtreedistances":
+          value = checkTF(value);
+          break;
+        case "showunconserved":
+          prefName = Preferences.SHOW_UNCONSERVED;
+          value = checkTF(value);
+          break;
+        case "showunlinkedtreenodes":
+          value = checkTF(value);
+          break;
+        default:
+          if (appletName.startsWith("pdbfile")
+                  || appletName.startsWith("sequence") && Character.isDigit(
+                          appletName.charAt(appletName.length() - 1)))
+          {
+            // could be pdbFile2, for example
+            prefName = argName = null;
+            value = resourcePath + value;
+            break;
+          }
+          // or one of the app preference names
+          break;
+        }
+        // put name and value into application args
+        if (value != null && argName != null)
+        {
+          vargs.add(argName);
+          if (value != "true")
+          {
+            vargs.add(value);
+          }
+        }
+        if (value == null)
+        {
+          value = "false";
+        }
+        System.out.println("AppletParams propName=" + prefName + " argName="
+                + argName + " appletName="
+                + appletName + " value=" + value);
+        if (appletName != null)
+        {
+          appletParams.put(appletName, value);
+        }
+        if (prefName != null)
+        {
+          Cache.setPropertyNoSave(prefName, value);
+        }
+      }
+    }
+    return appletParams;
+  }
+
+  /**
+   * Check for a single-argument option.
+   * 
+   * @param value
+   * @return "true" or null
+   */
+  private static String checkTF(String value)
+  {
+    return (value.toLowerCase() == "true" ? "true" : null);
+  }
+
+  /**
+   * Crude applet innerHTML parser
+   * 
+   * @param tag
+   * @param attr
+   * @return
+   */
+  private static String getAttr(String tag, String attr)
+  {
+    int pt = tag.indexOf(attr + "=\"");
+    if (pt < 0)
+    {
+      System.out
+              .println("AppletParams did not read " + attr + " in " + tag);
+      return null;
+    }
+    // <param name="sortByTree" value="True"/>
+    int pt1 = pt + attr.length() + 2;
+    int pt2 = tag.indexOf("\"", pt1);
+    return (pt < 0 ? null : tag.substring(pt1, pt2));
+  }
+
+  public static void main(String[] args)
+  {
+    new AppletParams("<applet\r\n"
+            + "    code=\"jalview.bin.JalviewLite\" width=\"140\" height=\"35\"\r\n"
+            + "    archive=\"jalviewApplet.jar,JmolApplet-14.6.4_2016.10.26.jar,java-json.jar,json_simple-1.1.jar\">  \r\n"
+            + "  <param name=\"permissions\" value=\"sandbox\"/>\r\n"
+            + "  <param name=\"file\" value=\"uniref50.fa\"/>\r\n"
+            + "  <param name=\"treeFile\" value=\"ferredoxin.nw\"/>\r\n"
+            + "  <param name=\"userDefinedColour\" value=\"C=yellow; R,K,H=FF5555; D,E=5555FF\"/>\r\n"
+            + "  <param name=\"sortByTree\" value=\"True\"/>\r\n"
+            + "  <param name=\"showSequenceLogo\" value=\"true\"/>\r\n"
+            + "  <param name=\"showGroupConsensus\" value=\"true\"/>\r\n"
+            + "  <param name=\"showFullId\" value=\"false\"/>\r\n"
+            + "    <param name=\"linkLabel_1\" value=\"Uniprot\"/>\r\n"
+            + "    <param name=\"linkUrl_1\" value=\"http://www.uniprot.org/uniprot/$SEQUENCE_ID$\"/>\r\n"
+            + "    <param name=\"linkLabel_2\" value=\"EMBL-EBI Search\"/>\r\n"
+            + "    <param name=\"linkUrl_2\" value=\"http://www.ebi.ac.uk/ebisearch/search.ebi?db=allebi&query=$SEQUENCE_ID$\"/>\r\n"
+            + "    <param name=\"APPLICATION_URL\" value=\"http://www.jalview.org/services/launchApp\"/>\r\n"
+            + "     </applet>");
+  }
+
+}
\ No newline at end of file
diff --git a/src/jalview/bin/ApplicationSingletonProvider.java b/src/jalview/bin/ApplicationSingletonProvider.java
new file mode 100644 (file)
index 0000000..eb82104
--- /dev/null
@@ -0,0 +1,164 @@
+/*
+ * 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.bin;
+
+import jalview.util.Platform;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * A class to hold singleton objects, whose scope (context) is
+ * <ul>
+ * <li>the Java runtime (JVM) when running as Java</li>
+ * <li>one 'applet', when running as JalviewJS</li>
+ * </ul>
+ * This allows separation of multiple JS applets running on the same browser
+ * page, each with their own 'singleton' instances.
+ * <p>
+ * Instance objects are held in a separate Map (keyed by Class) for each
+ * context. For Java, this is just a single static Map. For SwingJS, the map is
+ * stored as a field {@code _swingjsSingletons} of
+ * {@code Thread.currentThread.getThreadGroup()}, as a proxy for the applet.
+ * <p>
+ * Note that when an applet is stopped, its ThreadGroup is removed, allowing any
+ * singleton references to be garbage collected.
+ * 
+ * @author hansonr
+ */
+public class ApplicationSingletonProvider
+{
+  /**
+   * A tagging interface to mark classes whose singleton instances may be served
+   * by {@code ApplicationSingletonProvider}, giving a distinct instance per JS
+   * 'applet'.
+   * <p>
+   * A class whose singleton should have global scope (be shared across all
+   * applets on a page) should <em>not</em> use this mechanism, but just provide
+   * a single instance (class static member) in the normal way.
+   */
+  public interface ApplicationSingletonI
+  {
+  }
+  
+  /*
+   * Map used to hold singletons in JVM context
+   */
+  private static Map<Class<? extends ApplicationSingletonI>, ApplicationSingletonI> singletons = new HashMap<>();
+
+  /**
+   * private constructor for non-instantiable class
+   */
+  private ApplicationSingletonProvider()
+  {
+  }
+
+  /**
+   * Returns the singletons map for the current context (JVM for Java,
+   * ThreadGroup for JS), creating the map on the first request for each JS
+   * ThreadGroup
+   * 
+   * @return
+   */
+  private static Map<Class<? extends ApplicationSingletonI>, ApplicationSingletonI> getContextMap()
+  {
+    @SuppressWarnings("unused")
+    ThreadGroup g = (Platform.isJS()
+            ? Thread.currentThread().getThreadGroup()
+            : null);
+    Map<Class<? extends ApplicationSingletonI>, ApplicationSingletonI> map = singletons;
+    /** @j2sNative map = g._swingjsSingletons; */
+    if (map == null)
+    {
+      map = new HashMap<>();
+      /** @j2sNative g._swingjsSingletons = map; */
+    }
+
+    return map;
+  }
+
+  /**
+   * Answers the singleton instance of the given class for the current context
+   * (JVM or SwingJS 'applet'). If no instance yet exists, one is created, by
+   * calling the class's no-argument constructor. Answers null if any error
+   * occurs (or occurred previously for the same class).
+   * 
+   * @param c
+   * @return
+   */
+  public static ApplicationSingletonI getInstance(Class<? extends ApplicationSingletonI> c)
+  {
+    Map<Class<? extends ApplicationSingletonI>, ApplicationSingletonI> map = getContextMap();
+    if (map.containsKey(c))
+    {
+      /*
+       * singleton already created _or_ creation failed (null value stored)
+       */
+      return map.get(c);
+    }
+
+    /*
+     * create and save the singleton
+     */
+    ApplicationSingletonI o = map.get(c);
+    try
+    {
+      Constructor<? extends ApplicationSingletonI> con = c
+              .getDeclaredConstructor();
+      con.setAccessible(true);
+      o = con.newInstance();
+    } catch (IllegalAccessException | InstantiationException
+            | IllegalArgumentException | InvocationTargetException
+            | NoSuchMethodException | SecurityException e)
+    {
+      Cache.log.error("Failed to create singleton for " + c.toString()
+              + ", error was: " + e.toString());
+      e.printStackTrace();
+    }
+
+    /*
+     * store the new singleton; note that a
+     * null value is saved if construction failed
+     */
+    getContextMap().put(c, o);
+
+    return o;
+  }
+
+  /**
+   * Removes the current singleton instance of the given class from the current
+   * application context. This has the effect of ensuring that a new instance is
+   * created the next time one is requested.
+   * 
+   * @param c
+   */
+  public static void removeInstance(
+          Class<? extends ApplicationSingletonI> c)
+  {
+    Map<Class<? extends ApplicationSingletonI>, ApplicationSingletonI> map = getContextMap();
+    if (map != null)
+    {
+      map.remove(c);
+    }
+  }
+}
index c927f1f..91c8838 100644 (file)
@@ -34,19 +34,98 @@ import java.util.Vector;
  */
 public class ArgsParser
 {
-  Vector<String> vargs = null;
+
+  // BH 2019 - new
+
+  public static final String NOCALCULATION = "nocalculation";
+
+  public static final String NOMENUBAR = "nomenubar";
+
+  public static final String NOSTATUS = "nostatus";
+
+  public static final String SHOWOVERVIEW = "showoverview";
+
+  //
+  public static final String ANNOTATIONS = "annotations";
+
+  public static final String COLOUR = "colour";
+
+  public static final String FEATURES = "features";
+
+  public static final String GROOVY = "groovy";
+
+  public static final String GROUPS = "groups";
+
+  public static final String HEADLESS = "headless";
+
+  public static final String JABAWS = "jabaws";
+
+  public static final String NOANNOTATION = "no-annotation";
+
+  public static final String NOANNOTATION2 = "noannotation"; // BH 2019.05.07
+
+  public static final String NODISPLAY = "nodisplay";
+
+  public static final String NOGUI = "nogui";
+
+  public static final String NONEWS = "nonews";
+
+  public static final String NOQUESTIONNAIRE = "noquestionnaire";
+
+  public static final String NOSORTBYTREE = "nosortbytree";
+
+  public static final String NOUSAGESTATS = "nousagestats";
+
+  public static final String OPEN = "open";
+
+  public static final String OPEN2 = "open2"; // BH added -- for applet
+                                              // compatibility; not fully
+                                              // implemented
+
+  public static final String PROPS = "props";
+
+  public static final String QUESTIONNAIRE = "questionnaire";
+
+  public static final String SETPROP = "setprop";
+
+  public static final String SORTBYTREE = "sortbytree";
+
+  public static final String TREE = "tree";
+
+  public static final String VDOC = "vdoc";
+
+  public static final String VSESS = "vsess";
+
+  private Vector<String> vargs = null;
+
+  private boolean isApplet;
+
+  private AppletParams appletParams;
+
+  public boolean isApplet()
+  {
+    return isApplet;
+  }
 
   public ArgsParser(String[] args)
   {
-    vargs = new Vector<String>();
-    for (int i = 0; i < args.length; i++)
+    vargs = new Vector<>();
+    isApplet = (args.length > 0 && args[0].startsWith("<applet"));
+    if (isApplet)
+    {
+      appletParams = AppletParams.getAppletParams(args, vargs);
+    }
+    else
     {
-      String arg = args[i].trim();
-      if (arg.charAt(0) == '-')
+      for (int i = 0; i < args.length; i++)
       {
-        arg = arg.substring(1);
+        String arg = args[i].trim();
+        if (arg.charAt(0) == '-')
+        {
+          arg = arg.substring(1);
+        }
+        vargs.addElement(arg);
       }
-      vargs.addElement(arg);
     }
   }
 
@@ -114,4 +193,12 @@ public class ArgsParser
     return vargs.size();
   }
 
+  public String getAppletValue(String key, String def)
+  {
+    String value;
+    return (appletParams == null ? null
+            : (value = appletParams.get(key.toLowerCase())) != null ? value
+                    : def);
+  }
+
 }
index b6ff253..b15c317 100755 (executable)
@@ -20,8 +20,9 @@
  */
 package jalview.bin;
 
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
 import jalview.datamodel.PDBEntry;
-import jalview.gui.UserDefinedColours;
+import jalview.gui.Preferences;
 import jalview.schemes.ColourSchemeLoader;
 import jalview.schemes.ColourSchemes;
 import jalview.schemes.UserColourScheme;
@@ -32,6 +33,7 @@ import jalview.util.Platform;
 import jalview.ws.sifts.SiftsSettings;
 
 import java.awt.Color;
+import java.awt.Dimension;
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileInputStream;
@@ -207,8 +209,26 @@ import org.apache.log4j.SimpleLayout;
  * @author $author$
  * @version $Revision$
  */
-public class Cache
+public class Cache implements ApplicationSingletonI
 {
+
+  private Cache()
+  {
+    // private singleton
+  }
+
+  /**
+   * In Java, this will be a static field instance, which will be
+   * application-specific; in JavaScript it will be an applet-specific instance
+   * tied to the applet's ThreadGroup.
+   * 
+   * @return
+   */
+  private static Cache getInstance()
+  {
+    return (Cache) ApplicationSingletonProvider.getInstance(Cache.class);
+  }
+
   /**
    * property giving log4j level for CASTOR loggers
    */
@@ -265,7 +285,9 @@ public class Cache
   public static Logger log;
 
   /** Jalview Properties */
-  public static Properties applicationProperties = new Properties()
+  // BH 2019.05.08 was static
+  @SuppressWarnings("serial")
+  private Properties applicationProperties = new Properties()
   {
     // override results in properties output in alphabetical order
     @Override
@@ -276,9 +298,12 @@ public class Cache
   };
 
   /** Default file is ~/.jalview_properties */
-  static String propertiesFile;
+  private String propertiesFile;
 
-  private static boolean propsAreReadOnly = Platform.isJS();
+  /**
+   * flag to possibly allow properties to be written to a property file
+   */
+  private boolean propsAreReadOnly = Platform.isJS();
 
   private final static String JS_PROPERTY_PREFIX = "jalview_";
 
@@ -303,14 +328,14 @@ public class Cache
       jalview.bin.Cache.log = Logger.getLogger("jalview.bin.Jalview");
 
       laxis.setLevel(Level.toLevel(
-              Cache.getDefault("logs.Axis.Level", Level.INFO.toString())));
-      lcastor.setLevel(Level.toLevel(Cache.getDefault("logs.Castor.Level",
-              Level.INFO.toString())));
+              getDefault("logs.Axis.Level", Level.INFO.toString())));
+      lcastor.setLevel(Level.toLevel(
+              getDefault("logs.Castor.Level", Level.INFO.toString())));
       lcastor = Logger.getLogger("org.exolab.castor.xml");
-      lcastor.setLevel(Level.toLevel(Cache.getDefault("logs.Castor.Level",
-              Level.INFO.toString())));
+      lcastor.setLevel(Level.toLevel(
+              getDefault("logs.Castor.Level", Level.INFO.toString())));
       // lcastor = Logger.getLogger("org.exolab.castor.xml.Marshaller");
-      // lcastor.setLevel(Level.toLevel(Cache.getDefault("logs.Castor.Level",
+      // lcastor.setLevel(Level.toLevel(getDefault("logs.Castor.Level",
       // Level.INFO.toString())));
       jalview.bin.Cache.log.setLevel(Level.toLevel(Cache
               .getDefault("logs.Jalview.level", Level.INFO.toString())));
@@ -332,20 +357,30 @@ public class Cache
    */
   public static void loadProperties(String propsFile)
   {
+    getInstance().loadPropertiesImpl(propsFile);
+  }
+
+  private void loadPropertiesImpl(String propsFile)
+  {
     propertiesFile = propsFile;
-    if (propsFile == null && !propsAreReadOnly)
-    {
-      propertiesFile = System.getProperty("user.home") + File.separatorChar
-              + ".jalview_properties";
-    }
-    else
+    if (!propsAreReadOnly)
     {
-      // don't corrupt the file we've been given.
-      propsAreReadOnly = true;
+      // Java only
+      if (propsFile == null)
+      {
+        propertiesFile = System.getProperty("user.home")
+                + File.separatorChar + ".jalview_properties";
+      }
+      else
+      {
+        // don't corrupt the file we've been given.
+        propsAreReadOnly = true;
+      }
     }
 
     if (propertiesFile == null)
-    { // BH 2019
+    { // BH 2019 read properties from the Info object associated with this
+      // applet
       Platform.readInfoProperties(JS_PROPERTY_PREFIX,
               applicationProperties);
     }
@@ -417,9 +452,9 @@ public class Cache
     }
     if (authorDetails == null)
     {
-        applicationProperties.remove("AUTHORS");
-        applicationProperties.remove("AUTHORFNAMES");
-        applicationProperties.remove("YEAR");
+      applicationProperties.remove("AUTHORS");
+      applicationProperties.remove("AUTHORFNAMES");
+      applicationProperties.remove("YEAR");
     }
 
     // FIND THE VERSION NUMBER AND BUILD DATE FROM jalview.jar
@@ -445,7 +480,7 @@ public class Cache
     }
     if (buildDetails == null)
     {
-        applicationProperties.remove("VERSION");
+      applicationProperties.remove("VERSION");
     }
     String jnlpVersion = System.getProperty("jalview.version");
     String codeVersion = getProperty("VERSION");
@@ -463,21 +498,20 @@ public class Cache
     }
     new BuildDetails(codeVersion, null, codeInstallation);
 
-    SiftsSettings
-            .setMapWithSifts(Cache.getDefault("MAP_WITH_SIFTS", false));
+    SiftsSettings.setMapWithSifts(getDefault("MAP_WITH_SIFTS", false));
 
     SiftsSettings.setSiftDownloadDirectory(jalview.bin.Cache
             .getDefault("sifts_download_dir", DEFAULT_SIFTS_DOWNLOAD_DIR));
 
     SiftsSettings.setFailSafePIDThreshold(
-            jalview.bin.Cache.getDefault("sifts_fail_safe_pid_threshold",
+            getDefault("sifts_fail_safe_pid_threshold",
                     DEFAULT_FAIL_SAFE_PID_THRESHOLD));
 
     SiftsSettings.setCacheThresholdInDays(
-            jalview.bin.Cache.getDefault("sifts_cache_threshold_in_days",
+            getDefault("sifts_cache_threshold_in_days",
                     DEFAULT_CACHE_THRESHOLD_IN_DAYS));
 
-    IdOrgSettings.setUrl(getDefault("ID_ORG_HOSTURL",
+    IdOrgSettings.setUrl(getDefault(Preferences.ID_ORG_HOSTURL,
             "http://www.jalview.org/services/identifiers"));
     IdOrgSettings.setDownloadLocation(ID_ORG_FILE);
 
@@ -485,17 +519,16 @@ public class Cache
             .println("Jalview Version: " + codeVersion + codeInstallation);
 
     StructureImportSettings.setDefaultStructureFileFormat(jalview.bin.Cache
-            .getDefault("PDB_DOWNLOAD_FORMAT", PDB_DOWNLOAD_FORMAT));
+            .getDefault(Preferences.PDB_DOWNLOAD_FORMAT, PDB_DOWNLOAD_FORMAT));
     StructureImportSettings
             .setDefaultPDBFileParser(DEFAULT_PDB_FILE_PARSER);
     // StructureImportSettings
-    // .setDefaultPDBFileParser(jalview.bin.Cache.getDefault(
+    // .setDefaultPDBFileParser(jalview.bin.getDefault(
     // "DEFAULT_PDB_FILE_PARSER", DEFAULT_PDB_FILE_PARSER));
     // jnlpVersion will be null if we're using InstallAnywhere
     // Dont do this check if running in headless mode
-    if (jnlpVersion == null && getDefault("VERSION_CHECK", true)
-            && (System.getProperty("java.awt.headless") == null || System
-                    .getProperty("java.awt.headless").equals("false")))
+    if (jnlpVersion == null && !Jalview.isHeadlessMode()
+            && getDefault("VERSION_CHECK", true))
     {
 
       class VersionChecker extends Thread
@@ -566,14 +599,10 @@ public class Cache
     setProperty("VERSION", codeVersion);
 
     // LOAD USERDEFINED COLOURS
-    jalview.bin.Cache
-            .initUserColourSchemes(getProperty("USER_DEFINED_COLOURS"));
-    jalview.io.PIRFile.useModellerOutput = Cache.getDefault("PIR_MODELLER",
-            false);
+    initUserColourSchemes(getProperty(Preferences.USER_DEFINED_COLOURS));
   }
 
-
-  private static void deleteBuildProperties()
+  private void deleteBuildProperties()
   {
     applicationProperties.remove("LATEST_VERSION");
     applicationProperties.remove("VERSION");
@@ -595,13 +624,7 @@ public class Cache
    */
   public static String getProperty(String key)
   {
-    String prop = applicationProperties.getProperty(key);
-    if (prop == null && Platform.isJS())
-    {
-      prop = applicationProperties.getProperty(Platform.getUniqueAppletID()
-              + "_" + JS_PROPERTY_PREFIX + key);
-    }
-    return prop;
+    return getInstance().applicationProperties.getProperty(key);
   }
 
   /**
@@ -639,6 +662,40 @@ public class Cache
   }
 
   /**
+   * retrieve a dimension, such as for Jmol
+   * 
+   * @param property
+   * @param def
+   * @return
+   */
+  public static Dimension getDefaultDim(String property, Dimension def)
+  {
+    String s = getProperty(property);
+    if (s != null)
+    {
+      if (s.indexOf(',') < 0)
+      {
+        s = s.trim().replace(' ', ',');
+        if (s.indexOf(',') < 0)
+        {
+          s += "," + s;
+        }
+      }
+      try
+      {
+        int pt = s.indexOf(",");
+        return new Dimension(Integer.parseInt(s.substring(0, pt)),
+                Integer.parseInt(s.substring(pt + 1)));
+      } catch (NumberFormatException e)
+      {
+        System.out.println("Error parsing Dimension property '" + property
+                + "' with value '" + s + "'");
+      }
+    }
+    return def;
+  }
+
+  /**
    * Answers the value of the given property, or the supplied default value if
    * the property is not set
    */
@@ -660,11 +717,21 @@ public class Cache
    */
   public static Object setProperty(String key, String obj)
   {
+    return getInstance().setPropertyImpl(key, obj, true);
+  }
+
+  public static void setPropertyNoSave(String key, String obj)
+  {
+    getInstance().setPropertyImpl(key, obj, false);
+  }
+
+  private Object setPropertyImpl(String key, String obj, boolean andSave)
+  {
     Object oldValue = null;
     try
     {
       oldValue = applicationProperties.setProperty(key, obj);
-      if (!propsAreReadOnly)
+      if (andSave && !propsAreReadOnly && propertiesFile != null)
       {
         FileOutputStream out = new FileOutputStream(propertiesFile);
         applicationProperties.store(out, "---JalviewX Properties File---");
@@ -681,18 +748,36 @@ public class Cache
   /**
    * remove the specified property from the jalview properties file
    * 
-   * @param string
+   * @param key
    */
-  public static void removeProperty(String string)
+  public static void removeProperty(String key)
   {
-    applicationProperties.remove(string);
-    saveProperties();
+    getInstance().removePropertyImpl(key, true);
+  }
+
+  public static void removePropertyNoSave(String key)
+  {
+    getInstance().removePropertyImpl(key, false);
+  }
+
+  private void removePropertyImpl(String key, boolean andSave)
+  {
+    applicationProperties.remove(key);
+    if (andSave)
+    {
+      savePropertiesImpl();
+    }
+  }
+
+  public static void saveProperties()
+  {
+    getInstance().savePropertiesImpl();
   }
 
   /**
    * save the properties to the jalview properties path
    */
-  public static void saveProperties()
+  private void savePropertiesImpl()
   {
     if (!propsAreReadOnly)
     {
@@ -708,10 +793,17 @@ public class Cache
     }
   }
 
+  private final static int UNTESTED = -1;
+
+  private final static int TRUE = 1;
+
+  private final static int FALSE = 0;
+
   /**
    * internal vamsas class discovery state
    */
-  private static int vamsasJarsArePresent = -1;
+  private static int vamsasJarsArePresent = (Platform.isJS() ? FALSE
+          : UNTESTED);
 
   /**
    * Searches for vamsas client classes on class path.
@@ -720,7 +812,7 @@ public class Cache
    */
   public static boolean vamsasJarsPresent()
   {
-    if (vamsasJarsArePresent == -1)
+    if (vamsasJarsArePresent == UNTESTED)
     {
       try
       {
@@ -729,7 +821,7 @@ public class Cache
         {
           jalview.bin.Cache.log.debug(
                   "Found Vamsas Classes (uk.ac..vamsas.client.VorbaId can be loaded)");
-          vamsasJarsArePresent = 1;
+          vamsasJarsArePresent = TRUE;
           Logger lvclient = Logger.getLogger("uk.ac.vamsas");
           lvclient.setLevel(Level.toLevel(Cache
                   .getDefault("logs.Vamsas.Level", Level.INFO.toString())));
@@ -740,17 +832,18 @@ public class Cache
         }
       } catch (Exception e)
       {
-        vamsasJarsArePresent = 0;
+        vamsasJarsArePresent = FALSE;
         jalview.bin.Cache.log.debug("Vamsas Classes are not present");
       }
     }
-    return (vamsasJarsArePresent > 0);
+    return (vamsasJarsArePresent == TRUE);
   }
 
   /**
    * internal vamsas class discovery state
    */
-  private static int groovyJarsArePresent = -1;
+  private static int groovyJarsArePresent = (Platform.isJS() ? FALSE
+          : UNTESTED);
 
   /**
    * Searches for vamsas client classes on class path.
@@ -759,7 +852,7 @@ public class Cache
    */
   public static boolean groovyJarsPresent()
   {
-    if (groovyJarsArePresent == -1)
+    if (groovyJarsArePresent == UNTESTED)
     {
       try
       {
@@ -768,7 +861,7 @@ public class Cache
         {
           jalview.bin.Cache.log.debug(
                   "Found Groovy (groovy.lang.GroovyObject can be loaded)");
-          groovyJarsArePresent = 1;
+          groovyJarsArePresent = TRUE;
           Logger lgclient = Logger.getLogger("groovy");
           lgclient.setLevel(Level.toLevel(Cache
                   .getDefault("logs.Groovy.Level", Level.INFO.toString())));
@@ -779,15 +872,15 @@ public class Cache
         }
       } catch (Error e)
       {
-        groovyJarsArePresent = 0;
+        groovyJarsArePresent = FALSE;
         jalview.bin.Cache.log.debug("Groovy Classes are not present", e);
       } catch (Exception e)
       {
-        groovyJarsArePresent = 0;
+        groovyJarsArePresent = FALSE;
         jalview.bin.Cache.log.debug("Groovy Classes are not present");
       }
     }
-    return (groovyJarsArePresent > 0);
+    return (groovyJarsArePresent == TRUE);
   }
 
   /**
@@ -796,15 +889,18 @@ public class Cache
    */
   protected static Object tracker = null;
 
-  protected static Class trackerfocus = null;
+  protected static Class<?> trackerfocus = null;
 
-  protected static Class jgoogleanalyticstracker = null;
+  protected static Class<?> jgoogleanalyticstracker = null;
 
   /**
    * Initialise the google tracker if it is not done already.
    */
   public static void initGoogleTracker()
   {
+
+    // TODO: SwingJS JavaScript tracker?
+
     if (tracker == null)
     {
       if (jgoogleanalyticstracker == null)
@@ -839,8 +935,7 @@ public class Cache
                 .newInstance(new Object[]
                 { "Jalview Desktop",
                     (vrs = jalview.bin.Cache.getProperty("VERSION") + "_"
-                            + jalview.bin.Cache.getDefault("BUILD_DATE",
-                                    "unknown")),
+                            + getDefault("BUILD_DATE", "unknown")),
                     "UA-9060947-1" });
         jgoogleanalyticstracker
                 .getMethod("trackAsynchronously", new Class[]
@@ -1028,11 +1123,11 @@ public class Cache
     }
     if (value == null || value.trim().length() < 1)
     {
-      Cache.applicationProperties.remove(propName);
+      getInstance().applicationProperties.remove(propName);
     }
     else
     {
-      Cache.applicationProperties.setProperty(propName, value);
+      getInstance().applicationProperties.setProperty(propName, value);
     }
   }
 
@@ -1077,13 +1172,13 @@ public class Cache
     {
       if (coloursFound.toString().length() > 1)
       {
-        setProperty(UserDefinedColours.USER_DEFINED_COLOURS,
+        setProperty(Preferences.USER_DEFINED_COLOURS,
                 coloursFound.toString());
       }
       else
       {
-        applicationProperties
-                .remove(UserDefinedColours.USER_DEFINED_COLOURS);
+        getInstance().applicationProperties
+                .remove(Preferences.USER_DEFINED_COLOURS);
       }
     }
   }
index 652b259..f59c37f 100755 (executable)
  */
 package jalview.bin;
 
+import jalview.api.AlignCalcWorkerI;
+import jalview.api.AlignFrameI;
+import jalview.api.AlignViewportI;
+import jalview.api.JalviewApp;
+import jalview.api.StructureSelectionManagerProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
+import jalview.datamodel.ColumnSelection;
+import jalview.datamodel.HiddenColumns;
+import jalview.datamodel.PDBEntry;
+import jalview.datamodel.SequenceGroup;
+import jalview.datamodel.SequenceI;
 import jalview.ext.so.SequenceOntology;
 import jalview.gui.AlignFrame;
+import jalview.gui.AlignViewport;
+import jalview.gui.AlignmentPanel;
+import jalview.gui.CalculationChooser;
 import jalview.gui.Desktop;
+import jalview.gui.Preferences;
 import jalview.gui.PromptUserConfig;
+import jalview.gui.StructureViewer;
 import jalview.io.AppletFormatAdapter;
 import jalview.io.BioJsHTMLOutput;
 import jalview.io.DataSourceType;
 import jalview.io.FileFormat;
 import jalview.io.FileFormatException;
 import jalview.io.FileFormatI;
+import jalview.io.FileFormats;
 import jalview.io.FileLoader;
 import jalview.io.HtmlSvgOutput;
 import jalview.io.IdentifyFile;
 import jalview.io.NewickFile;
 import jalview.io.gff.SequenceOntologyFactory;
+import jalview.javascript.JSFunctionExec;
+import jalview.javascript.MouseOverStructureListener;
+import jalview.renderer.seqfeatures.FeatureRenderer;
 import jalview.schemes.ColourSchemeI;
 import jalview.schemes.ColourSchemeProperty;
+import jalview.structure.SelectionSource;
+import jalview.structure.VamsasSource;
 import jalview.util.MessageManager;
 import jalview.util.Platform;
 import jalview.ws.jws2.Jws2Discoverer;
 
+import java.applet.AppletContext;
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileOutputStream;
@@ -58,19 +81,16 @@ import java.security.PermissionCollection;
 import java.security.Permissions;
 import java.security.Policy;
 import java.util.HashMap;
+import java.util.Hashtable;
 import java.util.Map;
 import java.util.Vector;
-import java.util.logging.ConsoleHandler;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import javax.swing.LookAndFeel;
 import javax.swing.UIManager;
 
-import com.threerings.getdown.util.LaunchUtil;
-
 import groovy.lang.Binding;
 import groovy.util.GroovyScriptEngine;
+import netscape.javascript.JSObject;
 
 /**
  * Main class for Jalview Application <br>
@@ -87,20 +107,76 @@ import groovy.util.GroovyScriptEngine;
  * @author $author$
  * @version $Revision$
  */
-public class Jalview
+public class Jalview implements ApplicationSingletonI, JalviewJSApi
 {
+
+  public static Jalview getInstance()
+  {
+    return (Jalview) ApplicationSingletonProvider
+            .getInstance(Jalview.class);
+  }
+
+  private Jalview()
+  {
+  }
+
   static
   {
     Platform.getURLCommandArguments();
   }
 
-  // singleton instance of this class
+  private boolean headless;
 
-  private static Jalview instance;
+  public static boolean isHeadlessMode()
+  {
+    return getInstance().headless;
+  }
 
   private Desktop desktop;
 
-  public static AlignFrame currentAlignFrame;
+  private AlignFrame currentAlignFrame;
+
+  public boolean isJavaAppletTag;
+
+  public String appletResourcePath;
+
+  JalviewAppLoader appLoader;
+
+  protected JSFunctionExec jsFunctionExec;
+
+  private boolean noCalculation, noMenuBar, noStatus;
+
+  private boolean noAnnotation;
+
+  public boolean getStartCalculations()
+  {
+    return !noCalculation;
+  }
+
+  public boolean getAllowMenuBar()
+  {
+    return !noMenuBar;
+  }
+
+  public boolean getShowStatus()
+  {
+    return !noStatus;
+  }
+
+  public boolean getShowAnnotation()
+  {
+    return !noAnnotation;
+  }
+
+  public static AlignFrame getCurrentAlignFrame()
+  {
+    return getInstance().currentAlignFrame;
+  }
+
+  public static void setCurrentAlignFrame(AlignFrame currentAlignFrame)
+  {
+    getInstance().currentAlignFrame = currentAlignFrame;
+  }
 
   static
   {
@@ -112,21 +188,21 @@ public class Jalview
      */
     {
       // grab all the rights we can for the JVM
-           Policy.setPolicy(new Policy()
-           {
-             @Override
-             public PermissionCollection getPermissions(CodeSource codesource)
-             {
-               Permissions perms = new Permissions();
-               perms.add(new AllPermission());
-               return (perms);
-             }
-       
-             @Override
-             public void refresh()
-             {
-             }
-           });
+      Policy.setPolicy(new Policy()
+      {
+        @Override
+        public PermissionCollection getPermissions(CodeSource codesource)
+        {
+          Permissions perms = new Permissions();
+          perms.add(new AllPermission());
+          return (perms);
+        }
+
+        @Override
+        public void refresh()
+        {
+        }
+      });
     }
   }
 
@@ -189,11 +265,6 @@ public class Jalview
 
   }
 
-  public static Jalview getInstance()
-  {
-    return instance;
-  }
-
   /**
    * main class for Jalview application
    * 
@@ -202,61 +273,24 @@ public class Jalview
    */
   public static void main(String[] args)
   {
-//     setLogging(); // BH - for event debugging in JavaScript
-    instance = new Jalview();
-    instance.doMain(args);
-}
-
-  private static void logClass(String name) 
-  {    
-         // BH - for event debugging in JavaScript
-      ConsoleHandler consoleHandler = new ConsoleHandler();
-      consoleHandler.setLevel(Level.ALL);
-      Logger logger = Logger.getLogger(name);
-      logger.setLevel(Level.ALL);
-      logger.addHandler(consoleHandler);
-  }
-
-  @SuppressWarnings("unused")
-  private static void setLogging() 
-  {
-
-    /**
-     * @j2sIgnore
-     * 
-     */
-    {
-      System.out.println("not in js");
-    }
-
-         // BH - for event debugging in JavaScript (Java mode only)
-    if (!Platform.isJS())
-    /**
-     * Java only
-     * 
-     * @j2sIgnore
-     */
-       {
-               Logger.getLogger("").setLevel(Level.ALL);
-        logClass("java.awt.EventDispatchThread");
-        logClass("java.awt.EventQueue");
-        logClass("java.awt.Component");
-        logClass("java.awt.focus.Component");
-        logClass("java.awt.focus.DefaultKeyboardFocusManager"); 
-       }       
-
+    // Platform.startJavaLogging();
+    getInstance().doMain(args);
   }
-  
 
-  
 
+  @SuppressWarnings("unused")
   /**
    * @param args
    */
   void doMain(String[] args)
   {
 
-    if (!Platform.isJS())
+    boolean isJS = Platform.isJS();
+    if (isJS)
+    {
+      Platform.setAppClass(this);
+    }
+    else
     {
       System.setSecurityManager(null);
     }
@@ -267,60 +301,60 @@ public class Jalview
             + System.getProperty("os.name") + " "
             + System.getProperty("os.version"));
 
-    String appdirString = System.getProperty("getdownappdir");
-    if (appdirString != null && appdirString.length() > 0)
-    {
-      final File appdir = new File(appdirString);
-      new Thread()
-      {
-        @Override
-        public void run()
-        {
-          LaunchUtil.upgradeGetdown(
-                  new File(appdir, "getdown-launcher-old.jar"),
-                  new File(appdir, "getdown-launcher.jar"),
-                  new File(appdir, "getdown-launcher-new.jar"));
-        }
-      }.start();
+    ArgsParser aparser = new ArgsParser(args);
+
+    String usrPropsFile = aparser.getValue(ArgsParser.PROPS);
+    Cache.loadProperties(usrPropsFile);
 
+    if (aparser.contains(ArgsParser.NODISPLAY)
+            || aparser.contains(ArgsParser.NOGUI)
+            || aparser.contains(ArgsParser.HEADLESS)
+            || "true".equals(System.getProperty("java.awt.headless")))
+    {
+      headless = true;
     }
-    ArgsParser aparser = new ArgsParser(args);
-    boolean headless = false;
 
-    String usrPropsFile = aparser.getValue("props");
-    Cache.loadProperties(usrPropsFile); // must do this before
-    if (usrPropsFile != null)
+    if (isJS)
     {
+      isJavaAppletTag = aparser.isApplet();
+      if (isJavaAppletTag)
+      {
+        Preferences.setAppletDefaults();
+        Cache.loadProperties(usrPropsFile); // again, because we
+        // might be changing defaults here?
+      }
       System.out.println(
-              "CMD [-props " + usrPropsFile + "] executed successfully!");
+              "<Applet> found: " + aparser.getValue("Info.j2sAppletID"));
+      appletResourcePath = aparser.getValue("Info.resourcePath");
     }
-
-    if (!Platform.isJS())
+    else
     /**
      * Java only
      * 
      * @j2sIgnore
      */
     {
+      if (usrPropsFile != null)
+      {
+        System.out.println(
+                "CMD [-props " + usrPropsFile + "] executed successfully!");
+      }
+
       if (aparser.contains("help") || aparser.contains("h"))
       {
         showUsage();
         System.exit(0);
       }
-      if (aparser.contains("nodisplay") || aparser.contains("nogui")
-              || aparser.contains("headless"))
-      {
-        System.setProperty("java.awt.headless", "true");
-        headless = true;
-      }
+
+
       // anything else!
 
-      final String jabawsUrl = aparser.getValue("jabaws");
+      final String jabawsUrl = aparser.getValue(ArgsParser.JABAWS);
       if (jabawsUrl != null)
       {
         try
         {
-          Jws2Discoverer.getDiscoverer().setPreferredUrl(jabawsUrl);
+          Jws2Discoverer.getInstance().setPreferredUrl(jabawsUrl);
           System.out.println(
                   "CMD [-jabaws " + jabawsUrl + "] executed successfully!");
         } catch (MalformedURLException e)
@@ -331,7 +365,8 @@ public class Jalview
       }
 
     }
-    String defs = aparser.getValue("setprop");
+    // check for property setting
+    String defs = aparser.getValue(ArgsParser.SETPROP);
     while (defs != null)
     {
       int p = defs.indexOf('=');
@@ -342,17 +377,12 @@ public class Jalview
       else
       {
         System.out.println("Executing setprop argument: " + defs);
-        if (Platform.isJS())
+        if (isJS)
         {
-          Cache.setProperty(defs.substring(0,p), defs.substring(p+1));
+          Cache.setProperty(defs.substring(0, p), defs.substring(p + 1));
         }
       }
-      defs = aparser.getValue("setprop");
-    }
-    if (System.getProperty("java.awt.headless") != null
-            && System.getProperty("java.awt.headless").equals("true"))
-    {
-      headless = true;
+      defs = aparser.getValue(ArgsParser.SETPROP);
     }
     System.setProperty("http.agent",
             "Jalview Desktop/" + Cache.getDefault("VERSION", "Unknown"));
@@ -371,7 +401,13 @@ public class Jalview
 
     try
     {
-      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
+      if (!isJS && Platform.isWin())
+       {
+        UIManager.setLookAndFeel(
+                headless ? "javax.swing.plaf.metal.MetalLookAndFeel"
+                        : UIManager.getSystemLookAndFeelClassName());
+//      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
+      }
     } catch (Exception ex)
     {
       System.err.println("Unexpected Look and Feel Exception");
@@ -396,8 +432,9 @@ public class Jalview
                   "Failed to set QuaQua look and feel: " + e.toString());
         }
       }
-      if (lookAndFeel == null || !(lookAndFeel.getClass()
-              .isAssignableFrom(UIManager.getLookAndFeel().getClass()))
+      if (lookAndFeel == null
+              || !(lookAndFeel.getClass().isAssignableFrom(
+                      UIManager.getLookAndFeel().getClass()))
               || !UIManager.getLookAndFeel().getClass().toString()
                       .toLowerCase().contains("quaqua"))
       {
@@ -418,49 +455,18 @@ public class Jalview
      * configure 'full' SO model if preferences say to, 
      * else use the default (SO Lite)
      */
-    if (Cache.getDefault("USE_FULL_SO", false))
+    if (Cache.getDefault(Preferences.USE_FULL_SO, false))
     {
-      SequenceOntologyFactory.setInstance(new SequenceOntology());
+      SequenceOntologyFactory.setSequenceOntology(new SequenceOntology());
     }
 
     if (!headless)
     {
-      desktop = new Desktop() 
-//      {
-// // BH testing
-//       @Override
-//       protected void processEvent(AWTEvent e) {
-//               System.out.println("Jalview.java " + e);
-//               super.processEvent(e);
-//       }
-//       }
-      ;
+      desktop = Desktop.getInstance();
       desktop.setInBatchMode(true); // indicate we are starting up
-
-      try
-      {
-             if (! Platform.isJS())
-                     /**
-                      * Java only
-                      * 
-                      * @j2sIgnore
-                      */
-             {
-               JalviewTaskbar.setTaskbar(this);
-             }
-      } catch (Exception e)
-      {
-        System.out.println("Cannot set Taskbar");
-        // e.printStackTrace();
-      } catch (Throwable t)
-      {
-        System.out.println("Cannot set Taskbar");
-        // t.printStackTrace();
-      }
-
       desktop.setVisible(true);
 
-      if (!Platform.isJS())
+      if (!isJS)
       /**
        * Java only
        * 
@@ -468,7 +474,7 @@ public class Jalview
        */
       {
         desktop.startServiceDiscovery();
-        if (!aparser.contains("nousagestats"))
+        if (!aparser.contains(ArgsParser.NOUSAGESTATS))
         {
           startUsageStats(desktop);
         }
@@ -477,9 +483,9 @@ public class Jalview
           System.err.println("CMD [-nousagestats] executed successfully!");
         }
 
-        if (!aparser.contains("noquestionnaire"))
+        if (!aparser.contains(ArgsParser.NOQUESTIONNAIRE))
         {
-          String url = aparser.getValue("questionnaire");
+          String url = aparser.getValue(ArgsParser.QUESTIONNAIRE);
           if (url != null)
           {
             // Start the desktop questionnaire prompter with the specified
@@ -491,7 +497,7 @@ public class Jalview
           }
           else
           {
-            if (Cache.getProperty("NOQUESTIONNAIRES") == null)
+            if (Cache.getProperty(Preferences.NOQUESTIONNAIRES) == null)
             {
               // Start the desktop questionnaire prompter with the specified
               // questionnaire
@@ -511,7 +517,7 @@ public class Jalview
                   .println("CMD [-noquestionnaire] executed successfully!");
         }
 
-        if (!aparser.contains("nonews"))
+        if (!aparser.contains(ArgsParser.NONEWS))
         {
           desktop.checkForNews();
         }
@@ -520,111 +526,84 @@ public class Jalview
       }
     }
 
-    String file = null, data = null;
-    FileFormatI format = null;
-    DataSourceType protocol = null;
-    FileLoader fileLoader = new FileLoader(!headless);
+    parseArguments(aparser, true);
+  }
+
+  /**
+   * Allow an outside entity to initiate the second half of argument parsing
+   * (only).
+   * 
+   * @param args
+   * @return null is good
+   */
+  @Override
+  public Object parseArguments(String[] args)
+  {
+
+    try
+    {
+      ArgsParser aparser = new ArgsParser(args);
+      return parseArguments(aparser, false);
+    } catch (Throwable t)
+    {
+      return t;
+    }
+  }
+
+  /**
+   * 
+   * @param aparser
+   * @param isStartup
+   * @return
+   */
+  private Object parseArguments(ArgsParser aparser, boolean isStartup)
+  {
+    boolean isJS = Platform.isJS();
 
-    String groovyscript = null; // script to execute after all loading is
+    Desktop desktop = (headless ? null : Desktop.getInstance());
+    // script to execute after all loading is
     // completed one way or another
     // extract groovy argument and execute if necessary
-    groovyscript = aparser.getValue("groovy", true);
-    file = aparser.getValue("open", true);
+    String groovyscript = (isJS ? null
+            : aparser.getValue(ArgsParser.GROOVY, true));
+    String file = aparser.getValue(ArgsParser.OPEN, true);
+    // BH this here to allow split frame; not working as of 5/17/2019
+    String file2 = aparser.getValue(ArgsParser.OPEN2, true);
+    String fileFormat = (isJavaAppletTag
+            ? aparser.getAppletValue("format", null)
+            : null);
+    FileFormatI format = null;
+    DataSourceType protocol = null;
 
     if (file == null && desktop == null)
     {
       System.out.println("No files to open!");
       System.exit(1);
     }
-    String vamsasImport = aparser.getValue("vdoc");
-    String vamsasSession = aparser.getValue("vsess");
-    if (vamsasImport != null || vamsasSession != null)
+    boolean haveImport = checkStartVamas(aparser);
+    // Finally, deal with the remaining input data.
+    long progress = -1;
+    if (file == null && isJavaAppletTag)
     {
-      if (desktop == null || headless)
+      // Maybe the sequences are added as parameters
+      StringBuffer data = new StringBuffer("PASTE");
+      int i = 1;
+      while ((file = aparser.getAppletValue("sequence" + i, null)) != null)
       {
-        System.out.println(
-                "Headless vamsas sessions not yet supported. Sorry.");
-        System.exit(1);
-      }
-      // if we have a file, start a new session and import it.
-      boolean inSession = false;
-      if (vamsasImport != null)
-      {
-        try
-        {
-          DataSourceType viprotocol = AppletFormatAdapter
-                  .checkProtocol(vamsasImport);
-          if (viprotocol == DataSourceType.FILE)
-          {
-            inSession = desktop.vamsasImport(new File(vamsasImport));
-          }
-          else if (viprotocol == DataSourceType.URL)
-          {
-            inSession = desktop.vamsasImport(new URL(vamsasImport));
-          }
-
-        } catch (Exception e)
-        {
-          System.err.println("Exeption when importing " + vamsasImport
-                  + " as a vamsas document.");
-          e.printStackTrace();
-        }
-        if (!inSession)
-        {
-          System.err.println("Failed to import " + vamsasImport
-                  + " as a vamsas document.");
-        }
-        else
-        {
-          System.out.println("Imported Successfully into new session "
-                  + desktop.getVamsasApplication().getCurrentSession());
-        }
+        data.append(file.toString() + "\n");
+        i++;
       }
-      if (vamsasSession != null)
+      if (data.length() > 5)
       {
-        if (vamsasImport != null)
-        {
-          // close the newly imported session and import the Jalview specific
-          // remnants into the new session later on.
-          desktop.vamsasStop_actionPerformed(null);
-        }
-        // now join the new session
-        try
-        {
-          if (desktop.joinVamsasSession(vamsasSession))
-          {
-            System.out.println(
-                    "Successfully joined vamsas session " + vamsasSession);
-          }
-          else
-          {
-            System.err.println("WARNING: Failed to join vamsas session "
-                    + vamsasSession);
-          }
-        } catch (Exception e)
-        {
-          System.err.println(
-                  "ERROR: Failed to join vamsas session " + vamsasSession);
-          e.printStackTrace();
-        }
-        if (vamsasImport != null)
-        {
-          // the Jalview specific remnants can now be imported into the new
-          // session at the user's leisure.
-          Cache.log.info(
-                  "Skipping Push for import of data into existing vamsas session."); // TODO:
-          // enable
-          // this
-          // when
-          // debugged
-          // desktop.getVamsasApplication().push_update();
-        }
+        file = data.toString();
       }
     }
-    long progress = -1;
-    // Finally, deal with the remaining input data.
+
+    String data;
+
     if (file != null)
     {
+
       if (!headless)
       {
         desktop.setProgressBar(
@@ -632,14 +611,14 @@ public class Jalview
                         .getString("status.processing_commandline_args"),
                 progress = System.currentTimeMillis());
       }
-      System.out.println("CMD [-open " + file + "] executed successfully!");
 
-      if (!Platform.isJS())
-        /**
-         * ignore in JavaScript -- can't just file existence - could load it?
-         * 
-         * @j2sIgnore
-         */
+      if (!isJS)
+      /**
+       * ignore in JavaScript -- can't just check file existence - could load
+       * it?
+       * 
+       * @j2sIgnore
+       */
       {
         if (!file.startsWith("http://") && !file.startsWith("https://"))
         // BH 2019 added https check for Java
@@ -655,33 +634,94 @@ public class Jalview
         }
       }
 
-        protocol = AppletFormatAdapter.checkProtocol(file);
+      protocol = AppletFormatAdapter.checkProtocol(file);
 
       try
       {
-        format = new IdentifyFile().identify(file, protocol);
+        format = (isJavaAppletTag && fileFormat != null
+                ? FileFormats.getInstance().forName(fileFormat)
+                : null);
+        if (format == null)
+        {
+          format = new IdentifyFile().identify(file, protocol);
+        }
       } catch (FileFormatException e1)
       {
         // TODO ?
       }
 
-      AlignFrame af = fileLoader.LoadFileWaitTillLoaded(file, protocol,
-              format);
+      if (aparser.contains(ArgsParser.NOMENUBAR))
+      {
+        noMenuBar = true;
+        System.out.println("CMD [nomenu] executed successfully!");
+      }
+
+      if (aparser.contains(ArgsParser.NOSTATUS))
+      {
+        noStatus = true;
+        System.out.println("CMD [nostatus] executed successfully!");
+      }
+
+      if (aparser.contains(ArgsParser.NOANNOTATION)
+              || aparser.contains(ArgsParser.NOANNOTATION2))
+      {
+        noAnnotation = true;
+        System.out.println("CMD no-annotation executed successfully!");
+      }
+      if (aparser.contains(ArgsParser.NOCALCULATION))
+      {
+        noCalculation = true;
+        System.out.println("CMD [nocalculation] executed successfully!");
+      }
+
+      AlignFrame af = new FileLoader(!headless).loadFileWaitTillLoaded(file,
+              protocol, format);
       if (af == null)
       {
         System.out.println("error");
       }
       else
       {
+        System.out
+                .println("CMD [-open " + file + "] executed successfully!");
+        if (file2 != null)
+        {
+          protocol = AppletFormatAdapter.checkProtocol(file2);
+          try
+          {
+            format = new IdentifyFile().identify(file2, protocol);
+          } catch (FileFormatException e1)
+          {
+            // TODO ?
+          }
+          AlignFrame af2 = new FileLoader(!headless)
+                  .loadFileWaitTillLoaded(file2, protocol, format);
+          if (af2 == null)
+          {
+            System.out.println("error");
+          }
+          else
+          {
+            AlignViewport.openLinkedAlignmentAs(af,
+                    af.getViewport().getAlignment(),
+                    af2.getViewport().getAlignment(), "",
+                    AlignViewport.SPLIT_FRAME);
+            System.out.println(
+                    "CMD [-open2 " + file2 + "] executed successfully!");
+          }
+        }
+
         setCurrentAlignFrame(af);
-        data = aparser.getValue("colour", true);
+
+        // TODO: file2 How to implement file2 for the applet spit screen?
+
+        data = aparser.getValue(ArgsParser.COLOUR, true);
         if (data != null)
         {
           data.replaceAll("%20", " ");
 
-          ColourSchemeI cs = ColourSchemeProperty
-                  .getColourScheme(af.getViewport(),
-                          af.getViewport().getAlignment(), data);
+          ColourSchemeI cs = ColourSchemeProperty.getColourScheme(
+                  af.getViewport(), af.getViewport().getAlignment(), data);
 
           if (cs != null)
           {
@@ -692,7 +732,7 @@ public class Jalview
         }
 
         // Must maintain ability to use the groups flag
-        data = aparser.getValue("groups", true);
+        data = aparser.getValue(ArgsParser.GROUPS, true);
         if (data != null)
         {
           af.parseFeaturesFile(data,
@@ -701,7 +741,7 @@ public class Jalview
           System.out.println(
                   "CMD groups[-" + data + "]  executed successfully!");
         }
-        data = aparser.getValue("features", true);
+        data = aparser.getValue(ArgsParser.FEATURES, true);
         if (data != null)
         {
           af.parseFeaturesFile(data,
@@ -711,7 +751,7 @@ public class Jalview
                   "CMD [-features " + data + "]  executed successfully!");
         }
 
-        data = aparser.getValue("annotations", true);
+        data = aparser.getValue(ArgsParser.ANNOTATIONS, true);
         if (data != null)
         {
           af.loadJalviewDataFile(data, null, null, null);
@@ -719,8 +759,15 @@ public class Jalview
           System.out.println(
                   "CMD [-annotations " + data + "] executed successfully!");
         }
+
+        if (aparser.contains(ArgsParser.SHOWOVERVIEW))
+        {
+          af.overviewMenuItem_actionPerformed(null);
+          System.out.println("CMD [showoverview] executed successfully!");
+        }
+
         // set or clear the sortbytree flag.
-        if (aparser.contains("sortbytree"))
+        if (aparser.contains(ArgsParser.SORTBYTREE))
         {
           af.getViewport().setSortByTree(true);
           if (af.getViewport().getSortByTree())
@@ -728,24 +775,48 @@ public class Jalview
             System.out.println("CMD [-sortbytree] executed successfully!");
           }
         }
-        if (aparser.contains("no-annotation"))
+
+        boolean doUpdateAnnotation = false;
+
+        /**
+         * we do this earlier in JalviewJS because of a complication with
+         * SHOWOVERVIEW
+         * 
+         * For now, just fixing this in JalviewJS.
+         *
+         * 
+         * @j2sIgnore
+         * 
+         */
         {
-          af.getViewport().setShowAnnotation(false);
-          if (!af.getViewport().isShowAnnotation())
+          if (aparser.contains(ArgsParser.NOANNOTATION)
+                  || aparser.contains(ArgsParser.NOANNOTATION2))
           {
-            System.out.println("CMD no-annotation executed successfully!");
+            af.getViewport().setShowAnnotation(false);
+            if (!af.getViewport().isShowAnnotation())
+            {
+              doUpdateAnnotation = true;
+              System.out
+                      .println("CMD no-annotation executed successfully!");
+            }
           }
         }
-        if (aparser.contains("nosortbytree"))
+        if (aparser.contains(ArgsParser.NOSORTBYTREE))
         {
           af.getViewport().setSortByTree(false);
           if (!af.getViewport().getSortByTree())
           {
+            doUpdateAnnotation = true;
             System.out
                     .println("CMD [-nosortbytree] executed successfully!");
           }
         }
-        data = aparser.getValue("tree", true);
+        if (doUpdateAnnotation)
+        { // BH 2019.07.24
+          af.setMenusForViewport();
+          af.alignPanel.updateLayout();
+        }
+        data = aparser.getValue(ArgsParser.TREE, true);
         if (data != null)
         {
           try
@@ -765,110 +836,42 @@ public class Jalview
         // TODO - load PDB structure(s) to alignment JAL-629
         // (associate with identical sequence in alignment, or a specified
         // sequence)
-        if (groovyscript != null)
+        if (isJavaAppletTag)
         {
-          // Execute the groovy script after we've done all the rendering stuff
-          // and before any images or figures are generated.
-          System.out.println("Executing script " + groovyscript);
-          executeGroovyScript(groovyscript, af);
-          System.out.println("CMD groovy[" + groovyscript
-                  + "] executed successfully!");
-          groovyscript = null;
+          loadAppletParams(aparser, af);
         }
-        String imageName = "unnamed.png";
-        while (aparser.getSize() > 1)
+        else if (!isJS)
+        /**
+         * Java only
+         * 
+         * @j2sIgnore
+         */
         {
-          String outputFormat = aparser.nextValue();
-          file = aparser.nextValue();
-
-          if (outputFormat.equalsIgnoreCase("png"))
-          {
-            af.createPNG(new File(file));
-            imageName = (new File(file)).getName();
-            System.out.println("Creating PNG image: " + file);
-            continue;
-          }
-          else if (outputFormat.equalsIgnoreCase("svg"))
+          if (groovyscript != null)
           {
-            File imageFile = new File(file);
-            imageName = imageFile.getName();
-            af.createSVG(imageFile);
-            System.out.println("Creating SVG image: " + file);
-            continue;
+            // Execute the groovy script after we've done all the rendering
+            // stuff
+            // and before any images or figures are generated.
+            System.out.println("Executing script " + groovyscript);
+            executeGroovyScript(groovyscript, af);
+            System.out.println("CMD groovy[" + groovyscript
+                    + "] executed successfully!");
+            groovyscript = null;
           }
-          else if (outputFormat.equalsIgnoreCase("html"))
-          {
-            File imageFile = new File(file);
-            imageName = imageFile.getName();
-            HtmlSvgOutput htmlSVG = new HtmlSvgOutput(af.alignPanel);
-            htmlSVG.exportHTML(file);
+        }
+        checkOutputFile(aparser, af, format);
+        while (aparser.getSize() > 0)
+        {
+          System.out.println("Unknown arg: " + aparser.nextValue());
+        }
+      }
+    }
+    AlignFrame startUpAlframe = null;
+    // We'll only open the default file if the desktop is visible.
+    // And the user
+    // ////////////////////
 
-            System.out.println("Creating HTML image: " + file);
-            continue;
-          }
-          else if (outputFormat.equalsIgnoreCase("biojsmsa"))
-          {
-            if (file == null)
-            {
-              System.err.println("The output html file must not be null");
-              return;
-            }
-            try
-            {
-              BioJsHTMLOutput.refreshVersionInfo(
-                      BioJsHTMLOutput.BJS_TEMPLATES_LOCAL_DIRECTORY);
-            } catch (URISyntaxException e)
-            {
-              e.printStackTrace();
-            }
-            BioJsHTMLOutput bjs = new BioJsHTMLOutput(af.alignPanel);
-            bjs.exportHTML(file);
-            System.out
-                    .println("Creating BioJS MSA Viwer HTML file: " + file);
-            continue;
-          }
-          else if (outputFormat.equalsIgnoreCase("imgMap"))
-          {
-            af.createImageMap(new File(file), imageName);
-            System.out.println("Creating image map: " + file);
-            continue;
-          }
-          else if (outputFormat.equalsIgnoreCase("eps"))
-          {
-            File outputFile = new File(file);
-            System.out.println(
-                    "Creating EPS file: " + outputFile.getAbsolutePath());
-            af.createEPS(outputFile);
-            continue;
-          }
-
-          af.saveAlignment(file, format);
-          if (af.isSaveAlignmentSuccessful())
-          {
-            System.out.println("Written alignment in " + format
-                    + " format to " + file);
-          }
-          else
-          {
-            System.out.println("Error writing file " + file + " in "
-                    + format + " format!!");
-          }
-
-        }
-
-        while (aparser.getSize() > 0)
-        {
-          System.out.println("Unknown arg: " + aparser.nextValue());
-        }
-      }
-    }
-    AlignFrame startUpAlframe = null;
-    // We'll only open the default file if the desktop is visible.
-    // And the user
-    // ////////////////////
-
-    if (!Platform.isJS() && !headless && file == null
-            && vamsasImport == null
+    if (!isJS && !headless && file == null && !haveImport
             && jalview.bin.Cache.getDefault("SHOW_STARTUP_FILE", true))
     /**
      * Java only
@@ -911,8 +914,8 @@ public class Jalview
         }
       }
 
-      startUpAlframe = fileLoader.LoadFileWaitTillLoaded(file, protocol,
-              format);
+      startUpAlframe = new FileLoader(!headless)
+              .loadFileWaitTillLoaded(file, protocol, format);
       // extract groovy arguments before anything else.
     }
 
@@ -940,6 +943,190 @@ public class Jalview
       }
       desktop.setInBatchMode(false);
     }
+
+    return null;
+  }
+
+  private boolean checkStartVamas(ArgsParser aparser)
+  {
+    String vamsasImport = aparser.getValue(ArgsParser.VDOC);
+    String vamsasSession = aparser.getValue(ArgsParser.VSESS);
+    if (vamsasImport == null && vamsasSession == null)
+    {
+      return false;
+    }
+    if (desktop == null || headless)
+    {
+      System.out.println(
+              "Headless vamsas sessions not yet supported. Sorry.");
+      System.exit(1);
+    }
+    boolean haveImport = (vamsasImport != null);
+    if (haveImport)
+    {
+      // if we have a file, start a new session and import it.
+      boolean inSession = false;
+      try
+      {
+        DataSourceType viprotocol = AppletFormatAdapter
+                .checkProtocol(vamsasImport);
+        if (viprotocol == DataSourceType.FILE)
+        {
+          inSession = desktop.vamsasImport(new File(vamsasImport));
+        }
+        else if (viprotocol == DataSourceType.URL)
+        {
+          inSession = desktop.vamsasImport(new URL(vamsasImport));
+        }
+
+      } catch (Exception e)
+      {
+        System.err.println("Exeption when importing " + vamsasImport
+                + " as a vamsas document.");
+        e.printStackTrace();
+      }
+      if (!inSession)
+      {
+        System.err.println("Failed to import " + vamsasImport
+                + " as a vamsas document.");
+      }
+      else
+      {
+        System.out.println("Imported Successfully into new session "
+                + desktop.getVamsasApplication().getCurrentSession());
+      }
+    }
+    if (vamsasSession != null)
+    {
+      if (vamsasImport != null)
+      {
+        // close the newly imported session and import the Jalview specific
+        // remnants into the new session later on.
+        desktop.vamsasStop_actionPerformed(null);
+      }
+      // now join the new session
+      try
+      {
+        if (desktop.joinVamsasSession(vamsasSession))
+        {
+          System.out.println(
+                  "Successfully joined vamsas session " + vamsasSession);
+        }
+        else
+        {
+          System.err.println("WARNING: Failed to join vamsas session "
+                  + vamsasSession);
+        }
+      } catch (Exception e)
+      {
+        System.err.println(
+                "ERROR: Failed to join vamsas session " + vamsasSession);
+        e.printStackTrace();
+      }
+      if (vamsasImport != null)
+      {
+        // the Jalview specific remnants can now be imported into the new
+        // session at the user's leisure.
+        Cache.log.info(
+                "Skipping Push for import of data into existing vamsas session.");
+        // TODO:
+        // enable
+        // this
+        // when
+        // debugged
+        // desktop.getVamsasApplication().push_update();
+      }
+    }
+    return haveImport;
+  }
+
+  private void checkOutputFile(ArgsParser aparser, AlignFrame af,
+          FileFormatI format)
+  {
+    String imageName = "unnamed.png";
+    while (aparser.getSize() > 1)
+    {
+      // PNG filename
+      // SVG filename
+      // HTML filename
+      // biojsmsa filename
+      String outputFormat = aparser.nextValue();
+      String file = aparser.nextValue();
+      System.out.println("format " + outputFormat);
+
+      if (outputFormat.equalsIgnoreCase("png"))
+      {
+        af.createPNG(new File(file));
+        imageName = (new File(file)).getName();
+        System.out.println("Creating PNG image: " + file);
+        continue;
+      }
+      else if (outputFormat.equalsIgnoreCase("svg"))
+      {
+        File imageFile = new File(file);
+        imageName = imageFile.getName();
+        af.createSVG(imageFile);
+        System.out.println("Creating SVG image: " + file);
+        continue;
+      }
+      else if (outputFormat.equalsIgnoreCase("html"))
+      {
+        File imageFile = new File(file);
+        imageName = imageFile.getName();
+        HtmlSvgOutput htmlSVG = new HtmlSvgOutput(af.alignPanel);
+        htmlSVG.exportHTML(file);
+
+        System.out.println("Creating HTML image: " + file);
+        continue;
+      }
+      else if (outputFormat.equalsIgnoreCase("biojsmsa"))
+      {
+        if (file == null)
+        {
+          System.err.println("The output html file must not be null");
+          return;
+        }
+        try
+        {
+          BioJsHTMLOutput.refreshVersionInfo(
+                  BioJsHTMLOutput.BJS_TEMPLATES_LOCAL_DIRECTORY);
+        } catch (URISyntaxException e)
+        {
+          e.printStackTrace();
+        }
+        BioJsHTMLOutput bjs = new BioJsHTMLOutput(af.alignPanel);
+        bjs.exportHTML(file);
+        System.out.println("Creating BioJS MSA Viwer HTML file: " + file);
+        continue;
+      }
+      else if (outputFormat.equalsIgnoreCase("imgMap"))
+      {
+        af.createImageMap(new File(file), imageName);
+        System.out.println("Creating image map: " + file);
+        continue;
+      }
+      else if (outputFormat.equalsIgnoreCase("eps"))
+      {
+        File outputFile = new File(file);
+        System.out.println(
+                "Creating EPS file: " + outputFile.getAbsolutePath());
+        af.createEPS(outputFile);
+        continue;
+      }
+
+      af.saveAlignment(file, format);
+      if (af.isSaveAlignmentSuccessful())
+      {
+        System.out.println(
+                "Written alignment in " + format + " format to " + file);
+      }
+      else
+      {
+        System.out.println("Error writing file " + file + " in " + format
+                + " format!!");
+      }
+
+    }
   }
 
   private static void showUsage()
@@ -992,8 +1179,9 @@ public class Jalview
     /**
      * start a User Config prompt asking if we can log usage statistics.
      */
-    PromptUserConfig prompter = new PromptUserConfig(Desktop.desktop,
-            "USAGESTATS", "Jalview Usage Statistics",
+    PromptUserConfig prompter = new PromptUserConfig(
+            Desktop.getDesktopPane(), "USAGESTATS",
+            "Jalview Usage Statistics",
             "Do you want to help make Jalview better by enabling "
                     + "the collection of usage statistics with Google Analytics ?"
                     + "\n\n(you can enable or disable usage tracking in the preferences)",
@@ -1112,7 +1300,7 @@ public class Jalview
     }
     try
     {
-      Map<String, java.lang.Object> vbinding = new HashMap<>();
+      Map<String, Object> vbinding = new HashMap<>();
       vbinding.put("Jalview", this);
       if (af != null)
       {
@@ -1136,16 +1324,6 @@ public class Jalview
     }
   }
 
-  public static boolean isHeadlessMode()
-  {
-    String isheadless = System.getProperty("java.awt.headless");
-    if (isheadless != null && isheadless.equalsIgnoreCase("true"))
-    {
-      return true;
-    }
-    return false;
-  }
-
   public AlignFrame[] getAlignFrames()
   {
     return desktop == null ? new AlignFrame[] { getCurrentAlignFrame() }
@@ -1159,6 +1337,12 @@ public class Jalview
    */
   public void quit()
   {
+    if (jsFunctionExec != null)
+    {
+      jsFunctionExec.tidyUp();
+      jsFunctionExec = null;
+    }
+
     if (desktop != null)
     {
       desktop.quit();
@@ -1169,13 +1353,719 @@ public class Jalview
     }
   }
 
-  public static AlignFrame getCurrentAlignFrame()
+  /**
+   * Get the SwingJS applet ID and combine that with the frameType
+   * 
+   * @param frameType
+   *          "alignment", "desktop", etc., or null
+   * @return
+   */
+  public static String getAppID(String frameType)
   {
-    return Jalview.currentAlignFrame;
+    String id = Cache.getProperty("Info.j2sAppletID");
+    if (id == null)
+    {
+      id = "jalview";
+    }
+    return id + (frameType == null ? "" : "-" + frameType);
   }
 
-  public static void setCurrentAlignFrame(AlignFrame currentAlignFrame)
+  /**
+   * Handle all JalviewLite applet parameters
+   * 
+   * @param aparser
+   * @param af
+   */
+  private void loadAppletParams(ArgsParser aparser, AlignFrame af)
   {
-    Jalview.currentAlignFrame = currentAlignFrame;
+    JalviewApp app = new JalviewApp()
+    {
+
+      // TODO BH 2019
+      //
+      // These are methods that are in JalviewLite that various classes call
+      // but are not in JalviewLiteJsApi. Or, even if they are, other classes
+      // call
+      // them to JalviewLite directly. Some may not be necessary, but they have
+      // to
+      // be at least mentioned here, or the classes calling them should
+      // reference
+      // JalviewLite itself.
+
+      private boolean alignPDBStructures; // From JalviewLite; not implemented
+
+      private Hashtable<String, Hashtable<String, String[]>> jsmessages;
+
+      private Hashtable<String, int[]> jshashes;
+
+      @Override
+      public String getParameter(String name)
+      {
+        return aparser.getAppletValue(name, null);
+      }
+
+      @Override
+      public boolean getDefaultParameter(String name, boolean def)
+      {
+        String stn;
+        return ((stn = getParameter(name)) == null ? def
+                : "true".equalsIgnoreCase(stn));
+      }
+
+      /**
+       * Get the applet-like document base even though this is an application.
+       */
+      @Override
+      public URL getDocumentBase()
+      {
+        return Platform.getDocumentBase();
+      }
+
+      /**
+       * Get the applet-like code base even though this is an application.
+       */
+      @Override
+      public URL getCodeBase()
+      {
+        return Platform.getCodeBase();
+      }
+
+      @Override
+      public AlignViewportI getViewport()
+      {
+        return af.getViewport();
+      }
+
+      /**
+       * features
+       * 
+       */
+      @Override
+      public boolean parseFeaturesFile(String filename,
+              DataSourceType protocol)
+      {
+        return af.parseFeaturesFile(filename, protocol);
+      }
+
+      /**
+       * scorefile
+       * 
+       */
+      @Override
+      public boolean loadScoreFile(String sScoreFile) throws IOException
+      {
+        af.loadJalviewDataFile(sScoreFile, null, null, null);
+        return true;
+      }
+
+      /**
+       * annotations, jpredfile, jnetfile
+       * 
+       */
+      @Override
+      public void updateForAnnotations()
+      {
+        af.updateForAnnotations();
+      }
+
+      @Override
+      public void loadTree(NewickFile fin, String treeFile)
+              throws IOException
+      {
+        // n/a -- already done by standard Jalview command line processing
+      }
+
+      @Override
+      public void setAlignPdbStructures(boolean defaultParameter)
+      {
+        alignPDBStructures = true;
+      }
+
+      @Override
+      public void newStructureView(PDBEntry pdb, SequenceI[] seqs,
+              String[] chains, DataSourceType protocol)
+      {
+        StructureViewer.launchStructureViewer(af.alignPanel, pdb, seqs);
+      }
+
+      @Override
+      public void setFeatureGroupState(String[] groups, boolean state)
+      {
+        af.setFeatureGroupState(groups, state);
+      }
+
+      @Override
+      public void alignedStructureView(PDBEntry[] pdb, SequenceI[][] seqs,
+              String[][] chains, String[] protocols)
+      {
+        System.err.println(
+                "Jalview applet interface alignedStructureView not implemented");
+      }
+
+      @Override
+      public void newFeatureSettings()
+      {
+        System.err.println(
+                "Jalview applet interface newFeatureSettings not implemented");
+      }
+
+      private Vector<Runnable> jsExecQueue;
+
+      @Override
+      public Vector<Runnable> getJsExecQueue(JSFunctionExec exec)
+      {
+        jsFunctionExec = exec;
+        return (jsExecQueue == null ? (jsExecQueue = new Vector<>())
+                : jsExecQueue);
+      }
+
+      @Override
+      public AppletContext getAppletContext()
+      {
+        // TODO Auto-generated method stub
+        return null;
+      }
+
+      @Override
+      public boolean isJsfallbackEnabled()
+      {
+        // TODO Auto-generated method stub
+        return false;
+      }
+
+      @Override
+      public JSObject getJSObject()
+      {
+        // TODO Auto-generated method stub
+        return null;
+      }
+
+      @Override
+      public StructureSelectionManagerProvider getStructureSelectionManagerProvider()
+      {
+        // TODO Q: what exactly is this? BH
+        return null;
+      }
+
+      @Override
+      public void updateColoursFromMouseOver(Object source,
+              MouseOverStructureListener mouseOverStructureListener)
+      {
+        // TODO Auto-generated method stub
+
+      }
+
+      @Override
+      public Object[] getSelectionForListener(SequenceGroup seqsel,
+              ColumnSelection colsel, HiddenColumns hidden,
+              SelectionSource source, Object alignFrame)
+      {
+        return appLoader.getSelectionForListener(getCurrentAlignFrame(),
+                seqsel, colsel, hidden, source, alignFrame);
+      }
+
+      @Override
+      public String arrayToSeparatorList(String[] array)
+      {
+        return appLoader.arrayToSeparatorList(array);
+      }
+
+      @Override
+      public Hashtable<String, int[]> getJSHashes()
+      {
+        return (jshashes == null ? (jshashes = new Hashtable<>())
+                : jshashes);
+      }
+
+      @Override
+      public Hashtable<String, Hashtable<String, String[]>> getJSMessages()
+      {
+        return (jsmessages == null ? (jsmessages = new Hashtable<>())
+                : jsmessages);
+      }
+
+      @Override
+      public Object getFrameForSource(VamsasSource source)
+      {
+        if (source != null)
+        {
+          AlignFrame af;
+          if (source instanceof jalview.gui.AlignViewport
+                  && source == (af = getCurrentAlignFrame()).getViewport())
+          {
+            // should be valid if it just generated an event!
+            return af;
+          }
+          // TODO: ensure that if '_af' is specified along with a handler
+          // function, then only events from that alignFrame are sent to that
+          // function
+        }
+        return null;
+      }
+
+      @Override
+      public FeatureRenderer getNewFeatureRenderer(AlignViewportI vp)
+      {
+        return new jalview.gui.FeatureRenderer((AlignmentPanel) vp);
+      }
+
+    };
+
+    appLoader = new JalviewAppLoader(true);
+    appLoader.load(app);
+  }
+
+  /**
+   * 
+   * @see jalview.bin.JalviewLiteJsApi#getSelectedSequences()
+   */
+  @Override
+  public String getSelectedSequences()
+  {
+    return getSelectedSequencesFrom(getCurrentAlignFrame());
+  }
+
+  /**
+   * 
+   * @see jalview.bin.JalviewLiteJsApi#getSelectedSequences(java.lang.String)
+   */
+  @Override
+  public String getSelectedSequences(String sep)
+  {
+    return getSelectedSequencesFrom(getCurrentAlignFrame(), sep);
+  }
+
+  /**
+   * 
+   * @see jalview.bin.JalviewLiteJsApi#getSelectedSequencesFrom(jalview.appletgui
+   *      .AlignFrame)
+   */
+  @Override
+  public String getSelectedSequencesFrom(AlignFrameI alf)
+  {
+    return getSelectedSequencesFrom(alf, null);
+  }
+
+  /**
+   * 
+   * @see jalview.bin.JalviewLiteJsApi#getSelectedSequencesFrom(jalview.appletgui
+   *      .AlignFrame, java.lang.String)
+   */
+  @Override
+  public String getSelectedSequencesFrom(AlignFrameI alf, String sep)
+  {
+    return appLoader.getSelectedSequencesFrom(alf, sep);
+  }
+
+  /**
+   * 
+   * @see jalview.bin.JalviewLiteJsApi#getSelectedSequencesFrom(jalview.appletgui
+   *      .AlignFrame, java.lang.String)
+   */
+  @Override
+  public void highlight(String sequenceId, String position,
+          String alignedPosition)
+  {
+    highlightIn(getCurrentAlignFrame(), sequenceId, position,
+            alignedPosition);
+  }
+
+  @Override
+  public void highlightIn(AlignFrameI alf, String sequenceId,
+          String position, String alignedPosition)
+  {
+    appLoader.highlightIn(alf, sequenceId, position, alignedPosition);
+  }
+
+  @Override
+  public void select(String sequenceIds, String columns)
+  {
+    selectIn(getCurrentAlignFrame(), sequenceIds, columns, null);
+  }
+
+  @Override
+  public void select(String sequenceIds, String columns, String sep)
+  {
+    selectIn(getCurrentAlignFrame(), sequenceIds, columns, sep);
+  }
+
+  @Override
+  public void selectIn(AlignFrameI alf, String sequenceIds, String columns)
+  {
+    selectIn(alf, sequenceIds, columns, null);
+  }
+
+  @Override
+  public void selectIn(AlignFrameI alf, String sequenceIds, String columns,
+          String sep)
+  {
+    appLoader.selectIn(alf, sequenceIds, columns, sep);
+  }
+
+  @Override
+  public String getSelectedSequencesAsAlignment(String format,
+          String suffix)
+  {
+    return getSelectedSequencesAsAlignmentFrom(getCurrentAlignFrame(),
+            format, suffix);
+  }
+
+  @Override
+  public String getSelectedSequencesAsAlignmentFrom(AlignFrameI alf,
+          String format, String sep)
+  {
+    return appLoader.getSelectedSequencesAsAlignmentFrom(alf, format, sep);
+  }
+
+  @Override
+  public String getAlignmentOrder()
+  {
+    return getAlignmentFrom(getCurrentAlignFrame(), null);
+  }
+
+  @Override
+  public String getAlignmentOrderFrom(AlignFrameI alf)
+  {
+    return getAlignmentFrom(alf, null);
+  }
+
+  @Override
+  public String getAlignmentOrderFrom(AlignFrameI alf, String sep)
+  {
+    return appLoader.getAlignmentOrderFrom(alf, sep);
+  }
+
+  @Override
+  public String orderBy(String order, String undoName)
+  {
+    return orderBy(order, undoName, null);
+  }
+
+  @Override
+  public String orderBy(String order, String undoName, String sep)
+  {
+    return orderAlignmentBy(getCurrentAlignFrame(), order, undoName, sep);
+  }
+
+  @Override
+  public String orderAlignmentBy(AlignFrameI alf, String order,
+          String undoName, String sep)
+  {
+    return appLoader.orderAlignmentBy(alf, order, undoName, sep);
+  }
+
+  @Override
+  public String getAlignment(String format)
+  {
+    return getAlignmentFrom(null, format, null);
+  }
+
+  @Override
+  public String getAlignmentFrom(AlignFrameI alf, String format)
+  {
+    return getAlignmentFrom(alf, format, null);
+  }
+
+  @Override
+  public String getAlignment(String format, String suffix)
+  {
+    return getAlignmentFrom(getCurrentAlignFrame(), format, suffix);
+  }
+
+  @Override
+  public String getAlignmentFrom(AlignFrameI alf, String format,
+          String suffix)
+  {
+    return appLoader.getAlignmentFrom(alf, format, suffix);
+  }
+
+  @Override
+  public void loadAnnotation(String annotation)
+  {
+    loadAnnotationFrom(getCurrentAlignFrame(), annotation);
+  }
+
+  @Override
+  public void loadAnnotationFrom(AlignFrameI alf, String annotation)
+  {
+    appLoader.loadAnnotationFrom(alf, annotation);
+  }
+
+  @Override
+  public void loadFeatures(String features, boolean autoenabledisplay)
+  {
+    loadFeaturesFrom(currentAlignFrame, features, autoenabledisplay);
+  }
+
+  @Override
+  public boolean loadFeaturesFrom(AlignFrameI alf, String features,
+          boolean autoenabledisplay)
+  {
+    return appLoader.loadFeaturesFrom(alf, features, autoenabledisplay);
+  }
+
+  @Override
+  public String getFeatures(String format)
+  {
+    return getFeaturesFrom(getCurrentAlignFrame(), format);
+  }
+
+  @Override
+  public String getFeaturesFrom(AlignFrameI alf, String format)
+  {
+    return appLoader.getFeaturesFrom(alf, format);
+  }
+
+  @Override
+  public String getAnnotation()
+  {
+    return getAnnotationFrom(getCurrentAlignFrame());
+  }
+
+  @Override
+  public String getAnnotationFrom(AlignFrameI alf)
+  {
+    return appLoader.getAnnotationFrom(alf);
+  }
+
+  @Override
+  public AlignFrameI newView()
+  {
+    return newViewFrom(getCurrentAlignFrame(), null);
+  }
+
+  @Override
+  public AlignFrameI newView(String name)
+  {
+    return newViewFrom(getCurrentAlignFrame(), name);
+  }
+
+  @Override
+  public AlignFrameI newViewFrom(AlignFrameI alf)
+  {
+    return newViewFrom(alf, null);
+  }
+
+  @Override
+  public AlignFrameI newViewFrom(AlignFrameI alf, String name)
+  {
+    return appLoader.newViewFrom(alf, name);
+  }
+
+  @Override
+  public AlignFrameI loadAlignment(String text, String title)
+  {
+    return appLoader.loadAlignment(text, AlignFrame.DEFAULT_WIDTH,
+            AlignFrame.DEFAULT_HEIGHT, title);
+  }
+
+  @Override
+  public boolean addPdbFile(AlignFrameI alFrame, String sequenceId,
+          String pdbEntryString, String pdbFile)
+  {
+    return appLoader.addPdbFile(alFrame, sequenceId, pdbEntryString,
+            pdbFile);
+  }
+
+  @Override
+  public void scrollViewToIn(AlignFrameI alf, String topRow,
+          String leftHandColumn)
+  {
+    appLoader.scrollViewToIn(alf, topRow, leftHandColumn);
+  }
+
+  @Override
+  public void scrollViewToRowIn(AlignFrameI alf, String topRow)
+  {
+    appLoader.scrollViewToRowIn(alf, topRow);
+  }
+
+  @Override
+  public void scrollViewToColumnIn(AlignFrameI alf, String leftHandColumn)
+  {
+    appLoader.scrollViewToColumnIn(alf, leftHandColumn);
+  }
+
+  @Override
+  public String getFeatureGroups()
+  {
+    return getFeatureGroupsOn(getCurrentAlignFrame());
+  }
+
+  @Override
+  public String getFeatureGroupsOn(AlignFrameI alf)
+  {
+    return appLoader.getFeatureGroupsOn(alf);
+  }
+
+  @Override
+  public String getFeatureGroupsOfState(boolean visible)
+  {
+    return getFeatureGroupsOfStateOn(getCurrentAlignFrame(), visible);
+  }
+
+  @Override
+  public String getFeatureGroupsOfStateOn(AlignFrameI alf, boolean visible)
+  {
+    return appLoader.getFeatureGroupsOfStateOn(alf, visible);
+  }
+
+  @Override
+  public void setFeatureGroupStateOn(AlignFrameI alf, String groups,
+          boolean state)
+  {
+    setFeatureGroupStateOn(alf, groups, state);
+  }
+
+  @Override
+  public void setFeatureGroupState(String groups, boolean state)
+  {
+    appLoader.setFeatureGroupStateOn(getCurrentAlignFrame(), groups, state);
+  }
+
+  @Override
+  public String getSeparator()
+  {
+    return appLoader.getSeparator();
+  }
+
+  @Override
+  public void setSeparator(String separator)
+  {
+    appLoader.setSeparator(separator);
+  }
+
+  @Override
+  public String getJsMessage(String messageclass, String viewId)
+  {
+    // see http://www.jalview.org/examples/jalviewLiteJs.html
+    return null;
+  }
+
+  /**
+   * Open a new Tree panel on the desktop statically. Params are standard (not
+   * set by Groovy). No dialog is opened.
+   * 
+   * @param af
+   * @param treeType
+   * @param modelName
+   * @return null, or the string "label.you_need_at_least_n_sequences" if number
+   *         of sequences selected is inappropriate
+   */
+  @Override
+  public Object openTreePanel(AlignFrame af, String treeType,
+          String modelName)
+  {
+    return CalculationChooser.openTreePanel(af, treeType, modelName, null);
+  }
+
+  /**
+   * public static method for JalviewJS API to open a PCAPanel without
+   * necessarily using a dialog.
+   * 
+   * @param af
+   * @param modelName
+   * @return the PCAPanel, or the string "label.you_need_at_least_n_sequences"
+   *         if number of sequences selected is inappropriate
+   */
+  @Override
+  public Object openPcaPanel(AlignFrame af, String modelName)
+  {
+    return CalculationChooser.openPcaPanel(af, modelName, null);
+  }
+
+  @Override
+  public String getSelectedSequencesAsAlignment(String format,
+          boolean suffix)
+  {
+    return getSelectedSequencesAsAlignmentFrom(getCurrentAlignFrame(),
+            format, suffix);
+  }
+
+  @Override
+  public String getSelectedSequencesAsAlignmentFrom(AlignFrameI alf,
+          String format, boolean suffix)
+  {
+    return appLoader.getSelectedSequencesAsAlignmentFrom(alf, format,
+            "" + suffix);
+  }
+
+  @Override
+  public String arrayToSeparatorList(String[] array)
+  {
+    return appLoader.arrayToSeparatorList(array);
+  }
+
+  @Override
+  public String[] separatorListToArray(String list)
+  {
+    return appLoader.separatorListToArray(list);
+  }
+
+  //// probably not needed in JalviewJS -- From when Jmol and Jalview did not
+  //// have a direct connection?
+
+  @Override
+  public void setMouseoverListener(String listener)
+  {
+    // TODO Auto-generated method stub
+
+  }
+
+  @Override
+  public void setMouseoverListener(AlignFrameI af, String listener)
+  {
+    // TODO Auto-generated method stub
+
   }
+
+  @Override
+  public void setSelectionListener(String listener)
+  {
+    // TODO Auto-generated method stub
+
+  }
+
+  @Override
+  public void setSelectionListener(AlignFrameI af, String listener)
+  {
+    // TODO Auto-generated method stub
+
+  }
+
+  @Override
+  public void setStructureListener(String listener, String modelSet)
+  {
+    // TODO Auto-generated method stub
+
+  }
+
+  @Override
+  public void removeJavascriptListener(AlignFrameI af, String listener)
+  {
+    // TODO Auto-generated method stub
+
+  }
+
+  @Override
+  public void mouseOverStructure(String pdbResNum, String chain,
+          String pdbfile)
+  {
+    // TODO Auto-generated method stub
+
+  }
+
+  @Override
+  public void showOverview()
+  {
+    currentAlignFrame.overviewMenuItem_actionPerformed(null);
+  }
+
+  public void notifyWorker(AlignCalcWorkerI worker, String status)
+  {
+    // System.out.println("Jalview worker " + worker.getClass().getSimpleName()
+    // + " " + status);
+  }
+
 }
+
diff --git a/src/jalview/bin/JalviewAppLoader.java b/src/jalview/bin/JalviewAppLoader.java
new file mode 100644 (file)
index 0000000..51a0330
--- /dev/null
@@ -0,0 +1,1483 @@
+package jalview.bin;
+
+import jalview.api.AlignFrameI;
+import jalview.api.JalviewApp;
+import jalview.api.StructureSelectionManagerProvider;
+import jalview.datamodel.Alignment;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.AlignmentOrder;
+import jalview.datamodel.ColumnSelection;
+import jalview.datamodel.HiddenColumns;
+import jalview.datamodel.PDBEntry;
+import jalview.datamodel.Sequence;
+import jalview.datamodel.SequenceGroup;
+import jalview.datamodel.SequenceI;
+import jalview.gui.AlignFrame;
+import jalview.gui.AlignViewport;
+import jalview.gui.Desktop;
+import jalview.io.AnnotationFile;
+import jalview.io.AppletFormatAdapter;
+import jalview.io.DataSourceType;
+import jalview.io.FeaturesFile;
+import jalview.io.FileFormat;
+import jalview.io.FileFormatI;
+import jalview.io.FileFormats;
+import jalview.io.IdentifyFile;
+import jalview.io.JPredFile;
+import jalview.io.JnetAnnotationMaker;
+import jalview.io.NewickFile;
+import jalview.structure.SelectionSource;
+import jalview.structure.StructureSelectionManager;
+import jalview.util.HttpUtils;
+import jalview.util.MessageManager;
+
+import java.awt.EventQueue;
+import java.io.IOException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.StringTokenizer;
+import java.util.Vector;
+
+/**
+ * A class to load parameters for either JalviewLite or Jalview
+ * 
+ * @author hansonr
+ *
+ */
+public class JalviewAppLoader
+{
+
+  private JalviewApp app; // Jalview or JalviewJS or JalviewLite
+
+  private boolean debug;
+
+  String separator = "\u00AC"; // JalviewLite note: the default used to
+                                       // be '|', but many sequence IDS include
+                                       // pipes.
+
+  public String getSeparator()
+  {
+    return separator;
+  }
+
+  public void setSeparator(String separator)
+  {
+    this.separator = separator;
+  }
+
+  public JalviewAppLoader(boolean debug)
+  {
+    this.debug = debug;
+  }
+
+  public void load(JalviewApp app)
+  {
+
+    this.app = app;
+
+    String sep = app.getParameter("separator");
+    if (sep != null)
+    {
+      if (sep.length() > 0)
+      {
+        separator = sep;
+      }
+      else
+      {
+        throw new Error(MessageManager
+                .getString("error.invalid_separator_parameter"));
+      }
+    }
+
+    loadTree();
+    loadScoreFile();
+    loadFeatures();
+    loadAnnotations();
+    loadJnetFile();
+    loadPdbFiles();
+    callInitCallback();
+  }
+
+  /**
+   * Load PDBFiles if any specified by parameter(s). Returns true if loaded,
+   * else false.
+   * 
+   * @param loaderFrame
+   * @return
+   */
+  protected boolean loadPdbFiles()
+  {
+    boolean result = false;
+    /*
+     * <param name="alignpdbfiles" value="false/true"/> Undocumented for 2.6 -
+     * related to JAL-434
+     */
+
+    boolean doAlign = app.getDefaultParameter("alignpdbfiles", false);
+    app.setAlignPdbStructures(doAlign);
+    /*
+     * <param name="PDBfile" value="1gaq.txt PDB|1GAQ|1GAQ|A PDB|1GAQ|1GAQ|B
+     * PDB|1GAQ|1GAQ|C">
+     * 
+     * <param name="PDBfile2" value="1gaq.txt A=SEQA B=SEQB C=SEQB">
+     * 
+     * <param name="PDBfile3" value="1q0o Q45135_9MICO">
+     */
+
+    // Accumulate pdbs here if they are heading for the same view (if
+    // alignPdbStructures is true)
+    Vector<Object[]> pdbs = new Vector<>();
+    // create a lazy matcher if we're asked to
+    jalview.analysis.SequenceIdMatcher matcher = (app
+            .getDefaultParameter("relaxedidmatch", false))
+                    ? new jalview.analysis.SequenceIdMatcher(
+                            app.getViewport().getAlignment()
+                                    .getSequencesArray())
+                    : null;
+
+    int pdbFileCount = 0;
+    String param;
+    do
+    {
+      if (pdbFileCount > 0)
+      {
+        param = app.getParameter("PDBFILE" + pdbFileCount);
+      }
+      else
+      {
+        param = app.getParameter("PDBFILE");
+      }
+
+      if (param != null)
+      {
+        PDBEntry pdb = new PDBEntry();
+
+        String seqstring;
+        SequenceI[] seqs = null;
+        String[] chains = null;
+
+        StringTokenizer st = new StringTokenizer(param, " ");
+
+        if (st.countTokens() < 2)
+        {
+          String sequence = app.getParameter("PDBSEQ");
+          if (sequence != null)
+          {
+            seqs = new SequenceI[] { matcher == null
+                    ? (Sequence) app.getViewport().getAlignment()
+                            .findName(sequence)
+                    : matcher.findIdMatch(sequence) };
+          }
+
+        }
+        else
+        {
+          param = st.nextToken();
+          List<SequenceI> tmp = new ArrayList<>();
+          List<String> tmp2 = new ArrayList<>();
+
+          while (st.hasMoreTokens())
+          {
+            seqstring = st.nextToken();
+            StringTokenizer st2 = new StringTokenizer(seqstring, "=");
+            if (st2.countTokens() > 1)
+            {
+              // This is the chain
+              tmp2.add(st2.nextToken());
+              seqstring = st2.nextToken();
+            }
+            tmp.add(matcher == null
+                    ? (Sequence) app.getViewport().getAlignment()
+                            .findName(seqstring)
+                    : matcher.findIdMatch(seqstring));
+          }
+
+          seqs = tmp.toArray(new SequenceI[tmp.size()]);
+          if (tmp2.size() == tmp.size())
+          {
+            chains = tmp2.toArray(new String[tmp2.size()]);
+          }
+        }
+        pdb.setId(param);
+        ret[0] = param;
+        DataSourceType protocol = resolveFileProtocol(app, ret);
+        // TODO check JAL-357 for files in a jar (CLASSLOADER)
+        pdb.setFile(ret[0]);
+
+        if (seqs != null)
+        {
+          for (int i = 0; i < seqs.length; i++)
+          {
+            if (seqs[i] != null)
+            {
+              ((Sequence) seqs[i]).addPDBId(pdb);
+              StructureSelectionManager
+                      .getStructureSelectionManager(
+                              (StructureSelectionManagerProvider) app)
+                      .registerPDBEntry(pdb);
+            }
+            else
+            {
+              if (debug)
+              {
+                // this may not really be a problem but we give a warning
+                // anyway
+                System.err.println(
+                        "Warning: Possible input parsing error: Null sequence for attachment of PDB (sequence "
+                                + i + ")");
+              }
+            }
+          }
+
+          if (doAlign)
+          {
+            pdbs.addElement(new Object[] { pdb, seqs, chains, protocol });
+          }
+          else
+          {
+            app.newStructureView(pdb, seqs, chains, protocol);
+          }
+        }
+      }
+
+      pdbFileCount++;
+    } while (param != null || pdbFileCount < 10);
+    if (pdbs.size() > 0)
+    {
+      SequenceI[][] seqs = new SequenceI[pdbs.size()][];
+      PDBEntry[] pdb = new PDBEntry[pdbs.size()];
+      String[][] chains = new String[pdbs.size()][];
+      String[] protocols = new String[pdbs.size()];
+      for (int pdbsi = 0, pdbsiSize = pdbs
+              .size(); pdbsi < pdbsiSize; pdbsi++)
+      {
+        Object[] o = pdbs.elementAt(pdbsi);
+        pdb[pdbsi] = (PDBEntry) o[0];
+        seqs[pdbsi] = (SequenceI[]) o[1];
+        chains[pdbsi] = (String[]) o[2];
+        protocols[pdbsi] = (String) o[3];
+      }
+      app.alignedStructureView(pdb, seqs, chains, protocols);
+      result = true;
+    }
+    return result;
+  }
+
+  /**
+   * Load in a Jnetfile if specified by parameter. Returns true if loaded, else
+   * false.
+   * 
+   * @param alignFrame
+   * @return
+   */
+  protected boolean loadJnetFile()
+  {
+    boolean result = false;
+    String param = app.getParameter("jnetfile");
+    if (param == null)
+    {
+      // jnet became jpred around 2016
+      param = app.getParameter("jpredfile");
+    }
+    if (param != null)
+    {
+      try
+      {
+        ret[0] = param;
+        DataSourceType protocol = resolveFileProtocol(app, ret);
+        JPredFile predictions = new JPredFile(ret[0], protocol);
+        JnetAnnotationMaker.add_annotation(predictions,
+                app.getViewport().getAlignment(), 0, false);
+        // false == do not add sequence profile from concise output
+        app.getViewport().getAlignment().setupJPredAlignment();
+        app.updateForAnnotations();
+        result = true;
+      } catch (Exception ex)
+      {
+        ex.printStackTrace();
+      }
+    }
+    return result;
+  }
+
+  /**
+   * Load annotations if specified by parameter. Returns true if loaded, else
+   * false.
+   * 
+   * @param alignFrame
+   * @return
+   */
+  protected boolean loadAnnotations()
+  {
+    boolean result = false;
+    String param = app.getParameter("annotations");
+    if (param != null)
+    {
+      ret[0] = param;
+      DataSourceType protocol = resolveFileProtocol(app, ret);
+      param = ret[0];
+      if (new AnnotationFile().annotateAlignmentView(app.getViewport(),
+              param, protocol))
+      {
+        app.updateForAnnotations();
+        result = true;
+      }
+      else
+      {
+        System.err
+                .println("Annotations were not added from annotation file '"
+                        + param + "'");
+      }
+    }
+    return result;
+  }
+
+  /**
+   * Load features file and view settings as specified by parameters. Returns
+   * true if features were loaded, else false.
+   * 
+   * @param alignFrame
+   * @return
+   */
+  protected boolean loadFeatures()
+  {
+    boolean result = false;
+    // ///////////////////////////
+    // modify display of features
+    // we do this before any features have been loaded, ensuring any hidden
+    // groups are hidden when features first displayed
+    //
+    // hide specific groups
+    //
+    String param = app.getParameter("hidefeaturegroups");
+    if (param != null)
+    {
+      app.setFeatureGroupState(separatorListToArray(param, separator),
+              false);
+      // app.setFeatureGroupStateOn(newAlignFrame, param, false);
+    }
+    // show specific groups
+    param = app.getParameter("showfeaturegroups");
+    if (param != null)
+    {
+      app.setFeatureGroupState(separatorListToArray(param, separator),
+              true);
+      // app.setFeatureGroupStateOn(newAlignFrame, param, true);
+    }
+    // and now load features
+    param = app.getParameter("features");
+    if (param != null)
+    {
+      ret[0] = param;
+      DataSourceType protocol = resolveFileProtocol(app, ret);
+
+      result = app.parseFeaturesFile(ret[0], protocol);
+    }
+
+    param = app.getParameter("showFeatureSettings");
+    if (param != null && param.equalsIgnoreCase("true"))
+    {
+      app.newFeatureSettings();
+    }
+    return result;
+  }
+
+  /**
+   * Load a score file if specified by parameter. Returns true if file was
+   * loaded, else false.
+   * 
+   * @param loaderFrame
+   */
+  protected boolean loadScoreFile()
+  {
+    boolean result = false;
+    String sScoreFile = app.getParameter("scoreFile");
+    if (sScoreFile != null && !"".equals(sScoreFile))
+    {
+      try
+      {
+        if (debug)
+        {
+          System.err.println(
+                  "Attempting to load T-COFFEE score file from the scoreFile parameter");
+        }
+        result = app.loadScoreFile(sScoreFile);
+        if (!result)
+        {
+          System.err.println(
+                  "Failed to parse T-COFFEE parameter as a valid score file ('"
+                          + sScoreFile + "')");
+        }
+      } catch (Exception e)
+      {
+        System.err.printf("Cannot read score file: '%s'. Cause: %s \n",
+                sScoreFile, e.getMessage());
+      }
+    }
+    return result;
+  }
+
+  String[] ret = new String[1];
+
+  /**
+   * Load a tree for the alignment if specified by parameter. Returns true if a
+   * tree was loaded, else false.
+   * 
+   * @param loaderFrame
+   * @return
+   */
+  protected boolean loadTree()
+  {
+    boolean result = false;
+    String treeFile = app.getParameter("tree");
+    if (treeFile == null)
+    {
+      treeFile = app.getParameter("treeFile");
+    }
+
+    if (treeFile != null)
+    {
+      try
+      {
+        ret[0] = treeFile;
+        NewickFile fin = new NewickFile(treeFile,
+                resolveFileProtocol(app, ret));
+        fin.parse();
+
+        if (fin.getTree() != null)
+        {
+          app.loadTree(fin, ret[0]);
+          result = true;
+          if (debug)
+          {
+            System.out.println("Successfully imported tree.");
+          }
+        }
+        else
+        {
+          if (debug)
+          {
+            System.out.println(
+                    "Tree parameter did not resolve to a valid tree.");
+          }
+        }
+      } catch (Exception ex)
+      {
+        ex.printStackTrace();
+      }
+    }
+    return result;
+  }
+
+  /**
+   * form a complete URL given a path to a resource and a reference location on
+   * the same server
+   * 
+   * @param targetPath
+   *          - an absolute path on the same server as localref or a document
+   *          located relative to localref
+   * @param localref
+   *          - a URL on the same server as url
+   * @return a complete URL for the resource located by url
+   */
+  public static String resolveUrlForLocalOrAbsolute(String targetPath,
+          URL localref)
+  {
+    String resolvedPath = "";
+    if (targetPath.startsWith("/"))
+    {
+      String codebase = localref.toString();
+      String localfile = localref.getFile();
+      resolvedPath = codebase.substring(0,
+              codebase.length() - localfile.length()) + targetPath;
+      return resolvedPath;
+    }
+
+    /*
+     * get URL path and strip off any trailing file e.g.
+     * www.jalview.org/examples/index.html#applets?a=b is trimmed to
+     * www.jalview.org/examples/
+     */
+    String urlPath = localref.toString();
+    String directoryPath = urlPath;
+    int lastSeparator = directoryPath.lastIndexOf("/");
+    if (lastSeparator > 0)
+    {
+      directoryPath = directoryPath.substring(0, lastSeparator + 1);
+    }
+
+    if (targetPath.startsWith("/"))
+    {
+      /*
+       * construct absolute URL to a file on the server - this is not allowed?
+       */
+      // String localfile = localref.getFile();
+      // resolvedPath = urlPath.substring(0,
+      // urlPath.length() - localfile.length())
+      // + targetPath;
+      resolvedPath = directoryPath + targetPath.substring(1);
+    }
+    else
+    {
+      resolvedPath = directoryPath + targetPath;
+    }
+    // if (debug)
+    // {
+    // System.err.println(
+    // "resolveUrlForLocalOrAbsolute returning " + resolvedPath);
+    // }
+    return resolvedPath;
+  }
+
+  /**
+   * parse the string into a list
+   * 
+   * @param list
+   * @param separator
+   * @return elements separated by separator
+   */
+  public static String[] separatorListToArray(String list, String separator)
+  {
+    // TODO use StringUtils version (slightly different...)
+    int seplen = separator.length();
+    if (list == null || list.equals("") || list.equals(separator))
+    {
+      return null;
+    }
+    Vector<String> jv = new Vector<>();
+    int cp = 0, pos;
+    while ((pos = list.indexOf(separator, cp)) > cp)
+    {
+      jv.addElement(list.substring(cp, pos));
+      cp = pos + seplen;
+    }
+    if (cp < list.length())
+    {
+      String c = list.substring(cp);
+      if (!c.equals(separator))
+      {
+        jv.addElement(c);
+      }
+    }
+    if (jv.size() > 0)
+    {
+      String[] v = new String[jv.size()];
+      for (int i = 0; i < v.length; i++)
+      {
+        v[i] = jv.elementAt(i);
+      }
+      jv.removeAllElements();
+      // if (debug)
+      // {
+      // System.err.println("Array from '" + separator
+      // + "' separated List:\n" + v.length);
+      // for (int i = 0; i < v.length; i++)
+      // {
+      // System.err.println("item " + i + " '" + v[i] + "'");
+      // }
+      // }
+      return v;
+    }
+    // if (debug)
+    // {
+    // System.err.println(
+    // "Empty Array from '" + separator + "' separated List");
+    // }
+    return null;
+  }
+
+  public static DataSourceType resolveFileProtocol(JalviewApp app,
+          String[] retPath)
+  {
+    String path = retPath[0];
+    /*
+     * is it paste data?
+     */
+    if (path.startsWith("PASTE"))
+    {
+      retPath[0] = path.substring(5);
+      return DataSourceType.PASTE;
+    }
+
+    /*
+     * is it a URL?
+     */
+    if (path.indexOf("://") >= 0)
+    {
+      return DataSourceType.URL;
+    }
+
+    /*
+     * try relative to document root
+     */
+    URL documentBase = app.getDocumentBase();
+    String withDocBase = resolveUrlForLocalOrAbsolute(path, documentBase);
+    if (HttpUtils.isValidUrl(withDocBase))
+    {
+      // if (debug)
+      // {
+      // System.err.println("Prepended document base '" + documentBase
+      // + "' to make: '" + withDocBase + "'");
+      // }
+      retPath[0] = withDocBase;
+      return DataSourceType.URL;
+    }
+
+    /*
+     * try relative to codebase (if different to document base)
+     */
+    URL codeBase = app.getCodeBase();
+    String withCodeBase = resolveUrlForLocalOrAbsolute(path, codeBase);
+    if (!withCodeBase.equals(withDocBase)
+            && HttpUtils.isValidUrl(withCodeBase))
+    {
+      // if (debug)
+      // {
+      // System.err.println("Prepended codebase '" + codeBase
+      // + "' to make: '" + withCodeBase + "'");
+      // }
+      retPath[0] = withCodeBase;
+      return DataSourceType.URL;
+    }
+
+    /*
+     * try locating by classloader; try this last so files in the directory
+     * are resolved using document base
+     */
+    if (inArchive(app.getClass(), path))
+    {
+      return DataSourceType.CLASSLOADER;
+    }
+    return null;
+  }
+
+  /**
+   * Discovers whether the given file is in the Applet Archive
+   * 
+   * @param f
+   *          String
+   * @return boolean
+   */
+  private static boolean inArchive(Class<?> c, String f)
+  {
+    // This might throw a security exception in certain browsers
+    // Netscape Communicator for instance.
+    try
+    {
+      boolean rtn = (c.getResourceAsStream("/" + f) != null);
+      // if (debug)
+      // {
+      // System.err.println("Resource '" + f + "' was "
+      // + (rtn ? "" : "not ") + "located by classloader.");
+      // }
+      return rtn;
+    } catch (Exception ex)
+    {
+      System.out.println("Exception checking resources: " + f + " " + ex);
+      return false;
+    }
+  }
+
+  public void callInitCallback()
+  {
+    String initjscallback = app.getParameter("oninit");
+    if (initjscallback == null)
+    {
+      return;
+    }
+    initjscallback = initjscallback.trim();
+    if (initjscallback.length() > 0)
+    {
+      // TODO
+    }
+  }
+
+  /**
+   * read sequence1...sequenceN as a raw alignment
+   * 
+   * @param jalviewApp
+   * @return
+   */
+  public String getPastedSequence(JalviewApp jalviewApp)
+  {
+    StringBuffer data = new StringBuffer("PASTE");
+    int i = 1;
+    String file = null;
+    while ((file = app.getParameter("sequence" + i)) != null)
+    {
+      data.append(file.toString() + "\n");
+      i++;
+    }
+    if (data.length() > 5)
+    {
+      file = data.toString();
+    }
+    return file;
+  }
+
+  /**
+   * concatenate the list with separator
+   * 
+   * @param list
+   * @param separator
+   * @return concatenated string
+   */
+  public static String arrayToSeparatorList(String[] list, String separator)
+  {
+    // TODO use StringUtils version
+    StringBuffer v = new StringBuffer();
+    if (list != null && list.length > 0)
+    {
+      for (int i = 0, iSize = list.length; i < iSize; i++)
+      {
+        if (list[i] != null)
+        {
+          if (i > 0)
+          {
+            v.append(separator);
+          }
+          v.append(list[i]);
+        }
+      }
+      // if (debug)
+      // {
+      // System.err
+      // .println("Returning '" + separator + "' separated List:\n");
+      // System.err.println(v);
+      // }
+      return v.toString();
+    }
+    // if (debug)
+    // {
+    // System.err.println(
+    // "Returning empty '" + separator + "' separated List\n");
+    // }
+    return "" + separator;
+  }
+
+  public String arrayToSeparatorList(String[] array)
+  {
+    return arrayToSeparatorList(array, separator);
+  }
+
+  public String getSelectedSequencesFrom(AlignFrameI alf, String sep)
+  {
+    StringBuffer result = new StringBuffer("");
+    if (sep == null || sep.length() == 0)
+    {
+      sep = separator; // "+0x00AC;
+    }
+    AlignViewport v = ((AlignFrame) alf).getViewport();
+    if (v.getSelectionGroup() != null)
+    {
+      SequenceI[] seqs = v.getSelectionGroup()
+              .getSequencesInOrder(v.getAlignment());
+
+      for (int i = 0; i < seqs.length; i++)
+      {
+        result.append(seqs[i].getName());
+        result.append(sep);
+      }
+    }
+
+    return result.toString();
+  }
+
+  public void setFeatureGroupStateOn(final AlignFrameI alf,
+          final String groups, boolean state)
+  {
+    java.awt.EventQueue.invokeLater(new Runnable()
+    {
+      @Override
+      public void run()
+      {
+        ((AlignFrame) alf).setFeatureGroupState(
+                separatorListToArray(groups, separator), state);
+      }
+    });
+  }
+
+  public String getFeatureGroupsOfStateOn(AlignFrameI alf, boolean visible)
+  {
+    return arrayToSeparatorList(
+            ((AlignFrame) alf).getFeatureGroupsOfState(visible));
+  }
+
+  public void scrollViewToIn(final AlignFrameI alf, final String topRow,
+          final String leftHandColumn)
+  {
+    java.awt.EventQueue.invokeLater(new Runnable()
+    {
+      @Override
+      public void run()
+      {
+        try
+        {
+          ((AlignFrame) alf).scrollTo(new Integer(topRow).intValue(),
+                  new Integer(leftHandColumn).intValue());
+
+        } catch (Exception ex)
+        {
+          System.err.println("Couldn't parse integer arguments (topRow='"
+                  + topRow + "' and leftHandColumn='" + leftHandColumn
+                  + "')");
+          ex.printStackTrace();
+        }
+      }
+    });
+  }
+
+  public void scrollViewToRowIn(final AlignFrameI alf, final String topRow)
+  {
+
+    java.awt.EventQueue.invokeLater(new Runnable()
+    {
+      @Override
+      public void run()
+      {
+        try
+        {
+          ((AlignFrame) alf).scrollToRow(new Integer(topRow).intValue());
+
+        } catch (Exception ex)
+        {
+          System.err.println("Couldn't parse integer arguments (topRow='"
+                  + topRow + "')");
+          ex.printStackTrace();
+        }
+
+      }
+    });
+  }
+
+  public void scrollViewToColumnIn(final AlignFrameI alf,
+          final String leftHandColumn)
+  {
+    java.awt.EventQueue.invokeLater(new Runnable()
+    {
+
+      @Override
+      public void run()
+      {
+        try
+        {
+          ((AlignFrame) alf)
+                  .scrollToColumn(new Integer(leftHandColumn).intValue());
+
+        } catch (Exception ex)
+        {
+          System.err.println(
+                  "Couldn't parse integer arguments (leftHandColumn='"
+                          + leftHandColumn + "')");
+          ex.printStackTrace();
+        }
+      }
+    });
+
+  }
+
+  public boolean addPdbFile(AlignFrameI alf, String sequenceId,
+          String pdbEntryString, String pdbFile)
+  {
+    AlignFrame alFrame = (AlignFrame) alf;
+    SequenceI toaddpdb = alFrame.getViewport().getAlignment()
+            .findName(sequenceId);
+    boolean needtoadd = false;
+    if (toaddpdb != null)
+    {
+      Vector<PDBEntry> pdbe = toaddpdb.getAllPDBEntries();
+      PDBEntry pdbentry = null;
+      if (pdbe != null && pdbe.size() > 0)
+      {
+        for (int pe = 0, peSize = pdbe.size(); pe < peSize; pe++)
+        {
+          pdbentry = pdbe.elementAt(pe);
+          if (!pdbentry.getId().equals(pdbEntryString)
+                  && !pdbentry.getFile().equals(pdbFile))
+          {
+            pdbentry = null;
+          }
+          else
+          {
+            continue;
+          }
+        }
+      }
+      if (pdbentry == null)
+      {
+        pdbentry = new PDBEntry();
+        pdbentry.setId(pdbEntryString);
+        pdbentry.setFile(pdbFile);
+        needtoadd = true; // add this new entry to sequence.
+      }
+      // resolve data source
+      // TODO: this code should be a refactored to an io package
+      DataSourceType protocol = AppletFormatAdapter.resolveProtocol(pdbFile,
+              FileFormat.PDB);
+      if (protocol == null)
+      {
+        return false;
+      }
+      if (needtoadd)
+      {
+        pdbentry.setProperty("protocol", protocol);
+        toaddpdb.addPDBId(pdbentry);
+        alFrame.alignPanel.getStructureSelectionManager()
+                .registerPDBEntry(pdbentry);
+      }
+    }
+    return true;
+  }
+
+  public AlignFrameI loadAlignment(String text, int width, int height,
+          String title)
+  {
+    AlignmentI al = null;
+
+    try
+    {
+      FileFormatI format = new IdentifyFile().identify(text,
+              DataSourceType.PASTE);
+      al = new AppletFormatAdapter().readFile(text, DataSourceType.PASTE,
+              format);
+      if (al.getHeight() > 0)
+      {
+        return new AlignFrame(al, width, height, title);
+      }
+    } catch (IOException ex)
+    {
+      ex.printStackTrace();
+    }
+    return null;
+  }
+
+  public String getFeatureGroupsOn(AlignFrameI alf)
+  {
+    return arrayToSeparatorList(
+            ((AlignFrame) alf).getFeatureGroups());
+  }
+
+  public void highlightIn(final AlignFrameI alf, final String sequenceId,
+          final String position, final String alignedPosition)
+  {
+    // TODO: could try to highlight in all alignments if alf==null
+    jalview.analysis.SequenceIdMatcher matcher = new jalview.analysis.SequenceIdMatcher(
+            ((AlignFrame) alf).getViewport().getAlignment()
+                    .getSequencesArray());
+    final SequenceI sq = matcher.findIdMatch(sequenceId);
+    if (sq != null)
+    {
+      int apos = -1;
+      try
+      {
+        apos = new Integer(position).intValue();
+        apos--;
+      } catch (NumberFormatException ex)
+      {
+        return;
+      }
+      final int pos = apos;
+      // use vamsas listener to broadcast to all listeners in scope
+      if (alignedPosition != null && (alignedPosition.trim().length() == 0
+              || alignedPosition.toLowerCase().indexOf("false") > -1))
+      {
+        java.awt.EventQueue.invokeLater(new Runnable()
+        {
+          @Override
+          public void run()
+          {
+            StructureSelectionManager
+                    .getStructureSelectionManager(Desktop.getInstance())
+                    .mouseOverVamsasSequence(sq, sq.findIndex(pos), null);
+          }
+        });
+      }
+      else
+      {
+        java.awt.EventQueue.invokeLater(new Runnable()
+        {
+          @Override
+          public void run()
+          {
+            StructureSelectionManager
+                    .getStructureSelectionManager(Desktop.getInstance())
+                    .mouseOverVamsasSequence(sq, pos, null);
+          }
+        });
+      }
+    }
+  }
+
+  public void selectIn(final AlignFrameI alf, String sequenceIds,
+          String columns, String sep)
+  {
+    if (sep == null || sep.length() == 0)
+    {
+      sep = separator;
+    }
+    else
+    {
+      if (debug)
+      {
+        System.err.println("Selecting region using separator string '"
+                + separator + "'");
+      }
+    }
+    // deparse fields
+    String[] ids = JalviewAppLoader.separatorListToArray(sequenceIds, sep);
+    String[] cols = JalviewAppLoader.separatorListToArray(columns, sep);
+    final SequenceGroup sel = new SequenceGroup();
+    final ColumnSelection csel = new ColumnSelection();
+    AlignmentI al = ((AlignFrame) alf).getViewport().getAlignment();
+    jalview.analysis.SequenceIdMatcher matcher = new jalview.analysis.SequenceIdMatcher(
+            ((AlignFrame) alf).getViewport().getAlignment()
+                    .getSequencesArray());
+    int start = 0, end = al.getWidth(), alw = al.getWidth();
+    boolean seqsfound = true;
+    if (ids != null && ids.length > 0)
+    {
+      seqsfound = false;
+      for (int i = 0; i < ids.length; i++)
+      {
+        if (ids[i].trim().length() == 0)
+        {
+          continue;
+        }
+        SequenceI sq = matcher.findIdMatch(ids[i]);
+        if (sq != null)
+        {
+          seqsfound = true;
+          sel.addSequence(sq, false);
+        }
+      }
+    }
+    boolean inseqpos = false;
+    if (cols != null && cols.length > 0)
+    {
+      boolean seset = false;
+      for (int i = 0; i < cols.length; i++)
+      {
+        String cl = cols[i].trim();
+        if (cl.length() == 0)
+        {
+          continue;
+        }
+        int p;
+        if ((p = cl.indexOf("-")) > -1)
+        {
+          int from = -1, to = -1;
+          try
+          {
+            from = new Integer(cl.substring(0, p)).intValue();
+            from--;
+          } catch (NumberFormatException ex)
+          {
+            System.err.println(
+                    "ERROR: Couldn't parse first integer in range element column selection string '"
+                            + cl + "' - format is 'from-to'");
+            return;
+          }
+          try
+          {
+            to = new Integer(cl.substring(p + 1)).intValue();
+            to--;
+          } catch (NumberFormatException ex)
+          {
+            System.err.println(
+                    "ERROR: Couldn't parse second integer in range element column selection string '"
+                            + cl + "' - format is 'from-to'");
+            return;
+          }
+          if (from >= 0 && to >= 0)
+          {
+            // valid range
+            if (from < to)
+            {
+              int t = to;
+              to = from;
+              to = t;
+            }
+            if (!seset)
+            {
+              start = from;
+              end = to;
+              seset = true;
+            }
+            else
+            {
+              // comment to prevent range extension
+              if (start > from)
+              {
+                start = from;
+              }
+              if (end < to)
+              {
+                end = to;
+              }
+            }
+            for (int r = from; r <= to; r++)
+            {
+              if (r >= 0 && r < alw)
+              {
+                csel.addElement(r);
+              }
+            }
+            if (debug)
+            {
+              System.err.println("Range '" + cl + "' deparsed as [" + from
+                      + "," + to + "]");
+            }
+          }
+          else
+          {
+            System.err.println("ERROR: Invalid Range '" + cl
+                    + "' deparsed as [" + from + "," + to + "]");
+          }
+        }
+        else
+        {
+          int r = -1;
+          try
+          {
+            r = new Integer(cl).intValue();
+            r--;
+          } catch (NumberFormatException ex)
+          {
+            if (cl.toLowerCase().equals("sequence"))
+            {
+              // we are in the dataset sequence's coordinate frame.
+              inseqpos = true;
+            }
+            else
+            {
+              System.err.println(
+                      "ERROR: Couldn't parse integer from point selection element of column selection string '"
+                              + cl + "'");
+              return;
+            }
+          }
+          if (r >= 0 && r <= alw)
+          {
+            if (!seset)
+            {
+              start = r;
+              end = r;
+              seset = true;
+            }
+            else
+            {
+              // comment to prevent range extension
+              if (start > r)
+              {
+                start = r;
+              }
+              if (end < r)
+              {
+                end = r;
+              }
+            }
+            csel.addElement(r);
+            if (debug)
+            {
+              System.err.println("Point selection '" + cl
+                      + "' deparsed as [" + r + "]");
+            }
+          }
+          else
+          {
+            System.err.println("ERROR: Invalid Point selection '" + cl
+                    + "' deparsed as [" + r + "]");
+          }
+        }
+      }
+    }
+    if (seqsfound)
+    {
+      // we only propagate the selection when it was the null selection, or the
+      // given sequences were found in the alignment.
+      if (inseqpos && sel.getSize() > 0)
+      {
+        // assume first sequence provides reference frame ?
+        SequenceI rs = sel.getSequenceAt(0);
+        start = rs.findIndex(start);
+        end = rs.findIndex(end);
+        List<Integer> cs = new ArrayList<>(csel.getSelected());
+        csel.clear();
+        for (Integer selectedCol : cs)
+        {
+          csel.addElement(rs.findIndex(selectedCol));
+        }
+      }
+      sel.setStartRes(start);
+      sel.setEndRes(end);
+      EventQueue.invokeLater(new Runnable()
+      {
+        @Override
+        public void run()
+        {
+          ((AlignFrame) alf).select(sel, csel, ((AlignFrame) alf)
+                  .getCurrentView().getAlignment().getHiddenColumns());
+        }
+      });
+    }
+  }
+
+  public String getAlignmentOrderFrom(AlignFrameI alf, String sep)
+  {
+    AlignmentI alorder = ((AlignFrame) alf).getViewport().getAlignment();
+    String[] order = new String[alorder.getHeight()];
+    for (int i = 0; i < order.length; i++)
+    {
+      order[i] = alorder.getSequenceAt(i).getName();
+    }
+    return arrayToSeparatorList(order, sep);
+  }
+
+  public String getSelectedSequencesAsAlignmentFrom(AlignFrameI alf,
+          String format, String suffix)
+  {
+    try
+    {
+      AlignViewport vp = ((AlignFrame) alf).getViewport();
+      FileFormatI theFormat = FileFormats.getInstance().forName(format);
+      boolean seqlimits = (suffix == null
+              || suffix.equalsIgnoreCase("true"));
+      if (vp.getSelectionGroup() != null)
+      {
+        // JBPNote: getSelectionAsNewSequence behaviour has changed - this
+        // method now returns a full copy of sequence data
+        // TODO consider using getSequenceSelection instead here
+        String reply = new AppletFormatAdapter().formatSequences(theFormat,
+                new Alignment(vp.getSelectionAsNewSequence()),
+                seqlimits);
+        return reply;
+      }
+    } catch (IllegalArgumentException ex)
+    {
+      ex.printStackTrace();
+      return "Error retrieving alignment, possibly invalid format specifier: "
+              + format;
+    }
+    return "";
+  }
+
+  public String orderAlignmentBy(AlignFrameI alf, String order,
+          String undoName, String sep)
+  {
+    if (sep == null || sep.length() == 0)
+    {
+      sep = separator;
+    }
+    String[] ids = JalviewAppLoader.separatorListToArray(order, sep);
+    SequenceI[] sqs = null;
+    if (ids != null && ids.length > 0)
+    {
+      jalview.analysis.SequenceIdMatcher matcher = new jalview.analysis.SequenceIdMatcher(
+              ((AlignFrame) alf).getViewport().getAlignment()
+                      .getSequencesArray());
+      int s = 0;
+      sqs = new SequenceI[ids.length];
+      for (int i = 0; i < ids.length; i++)
+      {
+        if (ids[i].trim().length() == 0)
+        {
+          continue;
+        }
+        SequenceI sq = matcher.findIdMatch(ids[i]);
+        if (sq != null)
+        {
+          sqs[s++] = sq;
+        }
+      }
+      if (s > 0)
+      {
+        SequenceI[] sqq = new SequenceI[s];
+        System.arraycopy(sqs, 0, sqq, 0, s);
+        sqs = sqq;
+      }
+      else
+      {
+        sqs = null;
+      }
+    }
+    if (sqs == null)
+    {
+      return "";
+    }
+    ;
+    final AlignmentOrder aorder = new AlignmentOrder(sqs);
+
+    if (undoName != null && undoName.trim().length() == 0)
+    {
+      undoName = null;
+    }
+    final String _undoName = undoName;
+    // TODO: deal with synchronization here: cannot raise any events until after
+    // this has returned.
+    return ((AlignFrame) alf).sortBy(aorder, _undoName) ? "true" : "";
+  }
+
+  public String getAlignmentFrom(AlignFrameI alf, String format,
+          String suffix)
+  {
+    try
+    {
+      boolean seqlimits = (suffix == null
+              || suffix.equalsIgnoreCase("true"));
+
+      FileFormatI theFormat = FileFormats.getInstance().forName(format);
+      String reply = new AppletFormatAdapter().formatSequences(theFormat,
+              ((AlignFrame) alf).getViewport().getAlignment(), seqlimits);
+      return reply;
+    } catch (IllegalArgumentException ex)
+    {
+      ex.printStackTrace();
+      return "Error retrieving alignment, possibly invalid format specifier: "
+              + format;
+    }
+  }
+
+  public void loadAnnotationFrom(AlignFrameI alf, String annotation)
+  {
+    if (new AnnotationFile().annotateAlignmentView(
+            ((AlignFrame) alf).getViewport(), annotation,
+            DataSourceType.PASTE))
+    {
+      ((AlignFrame) alf).alignPanel.fontChanged();
+      ((AlignFrame) alf).alignPanel.setScrollValues(0, 0);
+    }
+    else
+    {
+      ((AlignFrame) alf).parseFeaturesFile(annotation,
+              DataSourceType.PASTE);
+    }
+  }
+
+  public boolean loadFeaturesFrom(AlignFrameI alf, String features,
+          boolean autoenabledisplay)
+  {
+    boolean ret = ((AlignFrame) alf).parseFeaturesFile(features,
+            DataSourceType.PASTE);
+    if (!ret)
+    {
+      return false;
+    }
+    if (autoenabledisplay)
+    {
+      ((AlignFrame) alf).getViewport().setShowSequenceFeatures(true);
+      // this next was for a checkbox in JalviewLite
+      // ((AlignFrame) alf).getViewport().sequenceFeatures.setState(true);
+    }
+    return true;
+  }
+
+  public String getFeaturesFrom(AlignFrameI alf, String format)
+  {
+    AlignFrame f = ((AlignFrame) alf);
+
+    String features;
+    FeaturesFile formatter = new FeaturesFile();
+    if (format.equalsIgnoreCase("Jalview"))
+    {
+      features = formatter.printJalviewFormat(
+              f.getViewport().getAlignment().getSequencesArray(),
+              f.alignPanel.getFeatureRenderer(), true);
+    }
+    else
+    {
+      features = formatter.printGffFormat(
+              f.getViewport().getAlignment().getSequencesArray(),
+              f.alignPanel.getFeatureRenderer(), true);
+    }
+
+    if (features == null)
+    {
+      features = "";
+    }
+    return features;
+
+  }
+
+  public String getAnnotationFrom(AlignFrameI alf)
+  {
+    AlignFrame f = (AlignFrame) alf;
+    String annotation = new AnnotationFile()
+            .printAnnotationsForView(f.getViewport());
+    return annotation;
+  }
+
+  public AlignFrameI newViewFrom(AlignFrameI alf, String name)
+  {
+    return (AlignFrameI) ((AlignFrame) alf).newView(name, true);
+  }
+
+  public String[] separatorListToArray(String list)
+  {
+    return separatorListToArray(list, separator);
+  }
+
+  public Object[] getSelectionForListener(AlignFrameI currentFrame,
+          SequenceGroup seqsel, ColumnSelection colsel,
+          HiddenColumns hidden, SelectionSource source, Object alignFrame)
+  {
+    // System.err.println("Testing selection event relay to
+    // jsfunction:"+_listener);
+    String setid = "";
+    AlignFrame src = (AlignFrame) alignFrame;
+    if (source != null)
+    {
+      if (source instanceof AlignViewport
+              && ((AlignFrame) currentFrame).getViewport() == source)
+      {
+        // should be valid if it just generated an event!
+        src = (AlignFrame) currentFrame;
+
+      }
+    }
+    String[] seqs = new String[] {};
+    String[] cols = new String[] {};
+    int strt = 0, end = (src == null) ? -1
+            : src.alignPanel.av.getAlignment().getWidth();
+    if (seqsel != null && seqsel.getSize() > 0)
+    {
+      seqs = new String[seqsel.getSize()];
+      for (int i = 0; i < seqs.length; i++)
+      {
+        seqs[i] = seqsel.getSequenceAt(i).getName();
+      }
+      if (strt < seqsel.getStartRes())
+      {
+        strt = seqsel.getStartRes();
+      }
+      if (end == -1 || end > seqsel.getEndRes())
+      {
+        end = seqsel.getEndRes();
+      }
+    }
+    if (colsel != null && !colsel.isEmpty())
+    {
+      if (end == -1)
+      {
+        end = colsel.getMax() + 1;
+      }
+      cols = new String[colsel.getSelected().size()];
+      for (int i = 0; i < cols.length; i++)
+      {
+        cols[i] = "" + (1 + colsel.getSelected().get(i).intValue());
+      }
+    }
+    else
+    {
+      if (seqsel != null && seqsel.getSize() > 0)
+      {
+        // send a valid range, otherwise we send the empty selection
+        cols = new String[2];
+        cols[0] = "" + (1 + strt) + "-" + (1 + end);
+      }
+    }
+    return new Object[] { src, setid, arrayToSeparatorList(seqs),
+        arrayToSeparatorList(cols) };
+  }
+
+}
\ No newline at end of file
index 26110f8..6f69f8a 100644 (file)
@@ -20,16 +20,37 @@ public class JalviewJS2
 
   static {
     /**
-     * @j2sNative
+     * @ could do it this way:
      * 
-     *            J2S.thisApplet.__Info.args =
-     *            ["open","examples/uniref50.fa","features",
-     *            "examples/exampleFeatures.txt"];
+     * j2sNative
+     * 
+     * J2S.thisApplet.__Info.args = [ "open","examples/uniref50.fa",
+     * "features","examples/exampleFeatures.txt", "noannotation" ];
      */
   }
 
   public static void main(String[] args) throws Exception
   {
+    if (args.length == 0)
+    {
+      args = new String[] {
+        //  "headless",
+          "open", "examples/uniref50.fa",
+          "features",
+          "examples/exampleFeatures.txt"
+          , "noannotation"
+          , "showoverview"
+        //  , "png", "test-bh.png"
+      };
+    }
+
+    // String cmds = "nodisplay -open examples/uniref50.fa -sortbytree -props
+    // test/jalview/io/testProps.jvprops -colour zappo "
+    // + "-jabaws http://www.compbio.dundee.ac.uk/jabaws -nosortbytree "
+    // + "-features examples/testdata/plantfdx.features -annotations
+    // examples/testdata/plantfdx.annotations -tree
+    // examples/testdata/uniref50_test_tree";
+    // args = cmds.split(" ");
     Jalview.main(args);
        //showFocusTimer();
 }
diff --git a/src/jalview/bin/JalviewJSApi.java b/src/jalview/bin/JalviewJSApi.java
new file mode 100644 (file)
index 0000000..b1fed25
--- /dev/null
@@ -0,0 +1,52 @@
+package jalview.bin;
+
+import jalview.gui.AlignFrame;
+import jalview.javascript.JalviewLiteJsApi;
+
+/**
+ * JAL-3369 JalviewJS API BH 2019.07.17
+ * 
+ * @author hansonr
+ *
+ */
+public interface JalviewJSApi extends JalviewLiteJsApi
+{
+
+  void showOverview();
+
+  /**
+   * process commandline arguments after the JavaScript application has started
+   * 
+   * @param args
+   * @return
+   */
+  Object parseArguments(String[] args);
+
+
+  /**
+   * Open a new Tree panel on the desktop statically. Params are standard (not
+   * set by Groovy). No dialog is opened.
+   * 
+   * @param af
+   *          may be null
+   * @param treeType
+   * @param modelName
+   * @return null, or the string "label.you_need_at_least_n_sequences" if number
+   *         of sequences selected is inappropriate
+   */
+  public Object openTreePanel(AlignFrame af, String treeType,
+          String modelName);
+
+  /**
+   * public static method for JalviewJS API to open a PCAPanel without
+   * necessarily using a dialog.
+   * 
+   * @param af
+   *          may be null
+   * @param modelName
+   * @return the PCAPanel, or the string "label.you_need_at_least_n_sequences"
+   *         if number of sequences selected is inappropriate
+   */
+  public Object openPcaPanel(AlignFrame af, String modelName);
+
+}
index e7f2a53..75b0add 100644 (file)
@@ -21,6 +21,9 @@
 package jalview.bin;
 
 import jalview.analysis.AlignmentUtils;
+import jalview.api.AlignFrameI;
+import jalview.api.AlignViewportI;
+import jalview.api.JalviewApp;
 import jalview.api.StructureSelectionManagerProvider;
 import jalview.appletgui.AlignFrame;
 import jalview.appletgui.AlignViewport;
@@ -31,8 +34,8 @@ import jalview.datamodel.Alignment;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.AlignmentOrder;
 import jalview.datamodel.ColumnSelection;
+import jalview.datamodel.HiddenColumns;
 import jalview.datamodel.PDBEntry;
-import jalview.datamodel.Sequence;
 import jalview.datamodel.SequenceGroup;
 import jalview.datamodel.SequenceI;
 import jalview.io.AnnotationFile;
@@ -42,18 +45,19 @@ import jalview.io.FileFormatI;
 import jalview.io.FileFormats;
 import jalview.io.FileParse;
 import jalview.io.IdentifyFile;
-import jalview.io.JPredFile;
-import jalview.io.JnetAnnotationMaker;
 import jalview.io.NewickFile;
 import jalview.javascript.JSFunctionExec;
 import jalview.javascript.JalviewLiteJsApi;
 import jalview.javascript.JsCallBack;
 import jalview.javascript.MouseOverStructureListener;
+import jalview.renderer.seqfeatures.FeatureRenderer;
 import jalview.structure.SelectionListener;
+import jalview.structure.SelectionSource;
 import jalview.structure.StructureSelectionManager;
+import jalview.structure.VamsasSource;
 import jalview.util.ColorUtils;
-import jalview.util.HttpUtils;
 import jalview.util.MessageManager;
+import jalview.viewmodel.AlignmentViewport;
 
 import java.applet.Applet;
 import java.awt.Button;
@@ -73,7 +77,6 @@ import java.net.URL;
 import java.util.ArrayList;
 import java.util.Hashtable;
 import java.util.List;
-import java.util.StringTokenizer;
 import java.util.Vector;
 
 import netscape.javascript.JSObject;
@@ -84,10 +87,16 @@ import netscape.javascript.JSObject;
  * @author $author$
  * @version $Revision: 1.92 $
  */
+@SuppressWarnings("serial")
 public class JalviewLite extends Applet
-        implements StructureSelectionManagerProvider, JalviewLiteJsApi
+        implements StructureSelectionManagerProvider, JalviewLiteJsApi,
+        JalviewApp
 {
 
+  public JalviewLite()
+  {
+    appLoader = new JalviewAppLoader(debug);
+  }
   private static final String TRUE = "true";
 
   private static final String FALSE = "false";
@@ -97,6 +106,12 @@ public class JalviewLite extends Applet
     return StructureSelectionManager.getStructureSelectionManager(this);
   }
 
+  @Override
+  public StructureSelectionManagerProvider getStructureSelectionManagerProvider()
+  {
+    return this;
+  }
+
   // /////////////////////////////////////////
   // The following public methods may be called
   // externally, eg via javascript in HTML page
@@ -130,7 +145,7 @@ public class JalviewLite extends Applet
    * .AlignFrame)
    */
   @Override
-  public String getSelectedSequencesFrom(AlignFrame alf)
+  public String getSelectedSequencesFrom(AlignFrameI alf)
   {
     return getSelectedSequencesFrom(alf, separator); // ""+0x00AC);
   }
@@ -143,17 +158,18 @@ public class JalviewLite extends Applet
    * .AlignFrame, java.lang.String)
    */
   @Override
-  public String getSelectedSequencesFrom(AlignFrame alf, String sep)
+  public String getSelectedSequencesFrom(AlignFrameI alf, String sep)
   {
     StringBuffer result = new StringBuffer("");
     if (sep == null || sep.length() == 0)
     {
       sep = separator; // "+0x00AC;
     }
-    if (alf.viewport.getSelectionGroup() != null)
+    if (((AlignFrame) alf).viewport.getSelectionGroup() != null)
     {
-      SequenceI[] seqs = alf.viewport.getSelectionGroup()
-              .getSequencesInOrder(alf.viewport.getAlignment());
+      SequenceI[] seqs = ((AlignFrame) alf).viewport.getSelectionGroup()
+              .getSequencesInOrder(
+                      ((AlignFrame) alf).viewport.getAlignment());
 
       for (int i = 0; i < seqs.length; i++)
       {
@@ -186,19 +202,19 @@ public class JalviewLite extends Applet
    * java.lang.String, java.lang.String, java.lang.String)
    */
   @Override
-  public void highlightIn(final AlignFrame alf, final String sequenceId,
+  public void highlightIn(final AlignFrameI alf, final String sequenceId,
           final String position, final String alignedPosition)
   {
     // TODO: could try to highlight in all alignments if alf==null
     jalview.analysis.SequenceIdMatcher matcher = new jalview.analysis.SequenceIdMatcher(
-            alf.viewport.getAlignment().getSequencesArray());
+            ((AlignFrame) alf).viewport.getAlignment().getSequencesArray());
     final SequenceI sq = matcher.findIdMatch(sequenceId);
     if (sq != null)
     {
       int apos = -1;
       try
       {
-        apos = Integer.valueOf(position).intValue();
+        apos = new Integer(position).intValue();
         apos--;
       } catch (NumberFormatException ex)
       {
@@ -266,7 +282,7 @@ public class JalviewLite extends Applet
    * java.lang.String, java.lang.String)
    */
   @Override
-  public void selectIn(AlignFrame alf, String sequenceIds, String columns)
+  public void selectIn(AlignFrameI alf, String sequenceIds, String columns)
   {
     selectIn(alf, sequenceIds, columns, separator);
   }
@@ -278,7 +294,7 @@ public class JalviewLite extends Applet
    * java.lang.String, java.lang.String, java.lang.String)
    */
   @Override
-  public void selectIn(final AlignFrame alf, String sequenceIds,
+  public void selectIn(final AlignFrameI alf, String sequenceIds,
           String columns, String sep)
   {
     if (sep == null || sep.length() == 0)
@@ -294,13 +310,13 @@ public class JalviewLite extends Applet
       }
     }
     // deparse fields
-    String[] ids = separatorListToArray(sequenceIds, sep);
-    String[] cols = separatorListToArray(columns, sep);
+    String[] ids = JalviewAppLoader.separatorListToArray(sequenceIds, sep);
+    String[] cols = JalviewAppLoader.separatorListToArray(columns, sep);
     final SequenceGroup sel = new SequenceGroup();
     final ColumnSelection csel = new ColumnSelection();
-    AlignmentI al = alf.viewport.getAlignment();
+    AlignmentI al = ((AlignFrame) alf).viewport.getAlignment();
     jalview.analysis.SequenceIdMatcher matcher = new jalview.analysis.SequenceIdMatcher(
-            alf.viewport.getAlignment().getSequencesArray());
+            ((AlignFrame) alf).viewport.getAlignment().getSequencesArray());
     int start = 0, end = al.getWidth(), alw = al.getWidth();
     boolean seqsfound = true;
     if (ids != null && ids.length > 0)
@@ -337,7 +353,7 @@ public class JalviewLite extends Applet
           int from = -1, to = -1;
           try
           {
-            from = Integer.valueOf(cl.substring(0, p)).intValue();
+            from = new Integer(cl.substring(0, p)).intValue();
             from--;
           } catch (NumberFormatException ex)
           {
@@ -348,7 +364,7 @@ public class JalviewLite extends Applet
           }
           try
           {
-            to = Integer.valueOf(cl.substring(p + 1)).intValue();
+            to = new Integer(cl.substring(p + 1)).intValue();
             to--;
           } catch (NumberFormatException ex)
           {
@@ -408,7 +424,7 @@ public class JalviewLite extends Applet
           int r = -1;
           try
           {
-            r = Integer.valueOf(cl).intValue();
+            r = new Integer(cl).intValue();
             r--;
           } catch (NumberFormatException ex)
           {
@@ -484,8 +500,8 @@ public class JalviewLite extends Applet
         @Override
         public void run()
         {
-          alf.select(sel, csel,
-                  alf.getAlignViewport().getAlignment().getHiddenColumns());
+          ((AlignFrame) alf).select(sel, csel, ((AlignFrame) alf)
+                  .getAlignViewport().getAlignment().getHiddenColumns());
         }
       });
     }
@@ -514,20 +530,21 @@ public class JalviewLite extends Applet
    * .appletgui.AlignFrame, java.lang.String, java.lang.String)
    */
   @Override
-  public String getSelectedSequencesAsAlignmentFrom(AlignFrame alf,
+  public String getSelectedSequencesAsAlignmentFrom(AlignFrameI alf,
           String format, String suffix)
   {
     try
     {
       FileFormatI theFormat = FileFormats.getInstance().forName(format);
       boolean seqlimits = suffix.equalsIgnoreCase(TRUE);
-      if (alf.viewport.getSelectionGroup() != null)
+      if (((AlignFrame) alf).viewport.getSelectionGroup() != null)
       {
         // JBPNote: getSelectionAsNewSequence behaviour has changed - this
         // method now returns a full copy of sequence data
         // TODO consider using getSequenceSelection instead here
         String reply = new AppletFormatAdapter().formatSequences(theFormat,
-                new Alignment(alf.viewport.getSelectionAsNewSequence()),
+                new Alignment(((AlignFrame) alf).viewport
+                        .getSelectionAsNewSequence()),
                 seqlimits);
         return reply;
       }
@@ -559,7 +576,7 @@ public class JalviewLite extends Applet
    * )
    */
   @Override
-  public String getAlignmentOrderFrom(AlignFrame alf)
+  public String getAlignmentOrderFrom(AlignFrameI alf)
   {
     return getAlignmentOrderFrom(alf, separator);
   }
@@ -572,9 +589,10 @@ public class JalviewLite extends Applet
    * , java.lang.String)
    */
   @Override
-  public String getAlignmentOrderFrom(AlignFrame alf, String sep)
+  public String getAlignmentOrderFrom(AlignFrameI alf, String sep)
   {
-    AlignmentI alorder = alf.getAlignViewport().getAlignment();
+    AlignmentI alorder = ((AlignFrame) alf).getAlignViewport()
+            .getAlignment();
     String[] order = new String[alorder.getHeight()];
     for (int i = 0; i < order.length; i++)
     {
@@ -615,15 +633,16 @@ public class JalviewLite extends Applet
    * java.lang.String, java.lang.String, java.lang.String)
    */
   @Override
-  public String orderAlignmentBy(AlignFrame alf, String order,
+  public String orderAlignmentBy(AlignFrameI alf, String order,
           String undoName, String sep)
   {
-    String[] ids = separatorListToArray(order, sep);
+    String[] ids = JalviewAppLoader.separatorListToArray(order, sep);
     SequenceI[] sqs = null;
     if (ids != null && ids.length > 0)
     {
       jalview.analysis.SequenceIdMatcher matcher = new jalview.analysis.SequenceIdMatcher(
-              alf.viewport.getAlignment().getSequencesArray());
+              ((AlignFrame) alf).viewport.getAlignment()
+                      .getSequencesArray());
       int s = 0;
       sqs = new SequenceI[ids.length];
       for (int i = 0; i < ids.length; i++)
@@ -663,7 +682,7 @@ public class JalviewLite extends Applet
     final String _undoName = undoName;
     // TODO: deal with synchronization here: cannot raise any events until after
     // this has returned.
-    return alf.sortBy(aorder, _undoName) ? TRUE : "";
+    return ((AlignFrame) alf).sortBy(aorder, _undoName) ? TRUE : "";
   }
 
   /*
@@ -685,7 +704,7 @@ public class JalviewLite extends Applet
    * java.lang.String)
    */
   @Override
-  public String getAlignmentFrom(AlignFrame alf, String format)
+  public String getAlignmentFrom(AlignFrameI alf, String format)
   {
     return getAlignmentFrom(alf, format, TRUE);
   }
@@ -710,7 +729,7 @@ public class JalviewLite extends Applet
    * java.lang.String, java.lang.String)
    */
   @Override
-  public String getAlignmentFrom(AlignFrame alf, String format,
+  public String getAlignmentFrom(AlignFrameI alf, String format,
           String suffix)
   {
     try
@@ -719,7 +738,7 @@ public class JalviewLite extends Applet
 
       FileFormatI theFormat = FileFormats.getInstance().forName(format);
       String reply = new AppletFormatAdapter().formatSequences(theFormat,
-              alf.viewport.getAlignment(), seqlimits);
+              ((AlignFrame) alf).viewport.getAlignment(), seqlimits);
       return reply;
     } catch (IllegalArgumentException ex)
     {
@@ -748,17 +767,19 @@ public class JalviewLite extends Applet
    * , java.lang.String)
    */
   @Override
-  public void loadAnnotationFrom(AlignFrame alf, String annotation)
+  public void loadAnnotationFrom(AlignFrameI alf, String annotation)
   {
-    if (new AnnotationFile().annotateAlignmentView(alf.getAlignViewport(),
+    if (new AnnotationFile().annotateAlignmentView(
+            ((AlignFrame) alf).getAlignViewport(),
             annotation, DataSourceType.PASTE))
     {
-      alf.alignPanel.fontChanged();
-      alf.alignPanel.setScrollValues(0, 0);
+      ((AlignFrame) alf).alignPanel.fontChanged();
+      ((AlignFrame) alf).alignPanel.setScrollValues(0, 0);
     }
     else
     {
-      alf.parseFeaturesFile(annotation, DataSourceType.PASTE);
+      ((AlignFrame) alf).parseFeaturesFile(annotation,
+              DataSourceType.PASTE);
     }
   }
 
@@ -781,10 +802,11 @@ public class JalviewLite extends Applet
    * , java.lang.String)
    */
   @Override
-  public boolean loadFeaturesFrom(AlignFrame alf, String features,
+  public boolean loadFeaturesFrom(AlignFrameI alf, String features,
           boolean autoenabledisplay)
   {
-    return alf.parseFeaturesFile(features, DataSourceType.PASTE,
+    return ((AlignFrame) alf).parseFeaturesFile(features,
+            DataSourceType.PASTE,
             autoenabledisplay);
   }
 
@@ -807,9 +829,9 @@ public class JalviewLite extends Applet
    * java.lang.String)
    */
   @Override
-  public String getFeaturesFrom(AlignFrame alf, String format)
+  public String getFeaturesFrom(AlignFrameI alf, String format)
   {
-    return alf.outputFeatures(false, format);
+    return ((AlignFrame) alf).outputFeatures(false, format);
   }
 
   /*
@@ -831,9 +853,9 @@ public class JalviewLite extends Applet
    * )
    */
   @Override
-  public String getAnnotationFrom(AlignFrame alf)
+  public String getAnnotationFrom(AlignFrameI alf)
   {
-    return alf.outputAnnotations(false);
+    return ((AlignFrame) alf).outputAnnotations(false);
   }
 
   /*
@@ -864,9 +886,9 @@ public class JalviewLite extends Applet
    * @see jalview.bin.JalviewLiteJsApi#newViewFrom(jalview.appletgui.AlignFrame)
    */
   @Override
-  public AlignFrame newViewFrom(AlignFrame alf)
+  public AlignFrame newViewFrom(AlignFrameI alf)
   {
-    return alf.newView(null);
+    return ((AlignFrame) alf).newView(null);
   }
 
   /*
@@ -876,9 +898,9 @@ public class JalviewLite extends Applet
    * java.lang.String)
    */
   @Override
-  public AlignFrame newViewFrom(AlignFrame alf, String name)
+  public AlignFrame newViewFrom(AlignFrameI alf, String name)
   {
-    return alf.newView(name);
+    return ((AlignFrame) alf).newView(name);
   }
 
   /*
@@ -930,7 +952,7 @@ public class JalviewLite extends Applet
    * , java.lang.String)
    */
   @Override
-  public void setMouseoverListener(AlignFrame af, String listener)
+  public void setMouseoverListener(AlignFrameI af, String listener)
   {
     if (listener != null)
     {
@@ -943,7 +965,7 @@ public class JalviewLite extends Applet
       }
     }
     jalview.javascript.MouseOverListener mol = new jalview.javascript.MouseOverListener(
-            this, af, listener);
+            this, (AlignFrame) af, listener, debug);
     javascriptListeners.addElement(mol);
     StructureSelectionManager.getStructureSelectionManager(this)
             .addStructureViewerListener(mol);
@@ -952,7 +974,8 @@ public class JalviewLite extends Applet
       System.err.println("Added a mouseover listener for "
               + ((af == null) ? "All frames"
                       : "Just views for "
-                              + af.getAlignViewport().getSequenceSetId()));
+                              + ((AlignFrame) af).getAlignViewport()
+                                      .getSequenceSetId()));
       System.err.println("There are now " + javascriptListeners.size()
               + " listeners in total.");
     }
@@ -977,7 +1000,7 @@ public class JalviewLite extends Applet
    * , java.lang.String)
    */
   @Override
-  public void setSelectionListener(AlignFrame af, String listener)
+  public void setSelectionListener(AlignFrameI af, String listener)
   {
     if (listener != null)
     {
@@ -990,7 +1013,7 @@ public class JalviewLite extends Applet
       }
     }
     jalview.javascript.JsSelectionSender mol = new jalview.javascript.JsSelectionSender(
-            this, af, listener);
+            this, (AlignFrame) af, listener, debug);
     javascriptListeners.addElement(mol);
     StructureSelectionManager.getStructureSelectionManager(this)
             .addSelectionListener(mol);
@@ -999,7 +1022,8 @@ public class JalviewLite extends Applet
       System.err.println("Added a selection listener for "
               + ((af == null) ? "All frames"
                       : "Just views for "
-                              + af.getAlignViewport().getSequenceSetId()));
+                              + ((AlignFrame) af).getAlignViewport()
+                                      .getSequenceSetId()));
       System.err.println("There are now " + javascriptListeners.size()
               + " listeners in total.");
     }
@@ -1030,7 +1054,7 @@ public class JalviewLite extends Applet
       }
     }
     MouseOverStructureListener mol = new MouseOverStructureListener(this,
-            listener, separatorListToArray(modelSet));
+            listener, separatorListToArray(modelSet), debug);
     javascriptListeners.addElement(mol);
     StructureSelectionManager.getStructureSelectionManager(this)
             .addStructureViewerListener(mol);
@@ -1051,7 +1075,7 @@ public class JalviewLite extends Applet
    * .AlignFrame, java.lang.String)
    */
   @Override
-  public void removeJavascriptListener(AlignFrame af, String listener)
+  public void removeJavascriptListener(AlignFrameI af, String listener)
   {
     if (listener != null)
     {
@@ -1146,11 +1170,10 @@ public class JalviewLite extends Applet
     }
     if (jsFunctionExec != null)
     {
-      jsFunctionExec.stopQueue();
-      jsFunctionExec.jvlite = null;
+      jsFunctionExec.tidyUp();
+      jsFunctionExec = null;
     }
     initialAlignFrame = null;
-    jsFunctionExec = null;
     javascriptListeners = null;
     StructureSelectionManager.release(this);
   }
@@ -1176,7 +1199,7 @@ public class JalviewLite extends Applet
         try
         {
           StructureSelectionManager.getStructureSelectionManager(me)
-                  .mouseOverStructure(Integer.valueOf(pdbResNum).intValue(),
+                  .mouseOverStructure(new Integer(pdbResNum).intValue(),
                           chain, pdbfile);
           if (debug)
           {
@@ -1202,7 +1225,7 @@ public class JalviewLite extends Applet
    * java.lang.String, java.lang.String)
    */
   @Override
-  public void scrollViewToIn(final AlignFrame alf, final String topRow,
+  public void scrollViewToIn(final AlignFrameI alf, final String topRow,
           final String leftHandColumn)
   {
     java.awt.EventQueue.invokeLater(new Runnable()
@@ -1212,8 +1235,8 @@ public class JalviewLite extends Applet
       {
         try
         {
-          alf.scrollTo(Integer.valueOf(topRow).intValue(),
-                  Integer.valueOf(leftHandColumn).intValue());
+          ((AlignFrame) alf).scrollTo(new Integer(topRow).intValue(),
+                  new Integer(leftHandColumn).intValue());
 
         } catch (Exception ex)
         {
@@ -1234,7 +1257,7 @@ public class JalviewLite extends Applet
    * .AlignFrame, java.lang.String)
    */
   @Override
-  public void scrollViewToRowIn(final AlignFrame alf, final String topRow)
+  public void scrollViewToRowIn(final AlignFrameI alf, final String topRow)
   {
 
     java.awt.EventQueue.invokeLater(new Runnable()
@@ -1244,7 +1267,7 @@ public class JalviewLite extends Applet
       {
         try
         {
-          alf.scrollToRow(Integer.valueOf(topRow).intValue());
+          ((AlignFrame) alf).scrollToRow(new Integer(topRow).intValue());
 
         } catch (Exception ex)
         {
@@ -1265,7 +1288,7 @@ public class JalviewLite extends Applet
    * .AlignFrame, java.lang.String)
    */
   @Override
-  public void scrollViewToColumnIn(final AlignFrame alf,
+  public void scrollViewToColumnIn(final AlignFrameI alf,
           final String leftHandColumn)
   {
     java.awt.EventQueue.invokeLater(new Runnable()
@@ -1276,7 +1299,8 @@ public class JalviewLite extends Applet
       {
         try
         {
-          alf.scrollToColumn(Integer.valueOf(leftHandColumn).intValue());
+          ((AlignFrame) alf)
+                  .scrollToColumn(new Integer(leftHandColumn).intValue());
 
         } catch (Exception ex)
         {
@@ -1322,9 +1346,9 @@ public class JalviewLite extends Applet
 
   boolean embedded = false;
 
-  private boolean checkForJmol = true;
+  boolean checkForJmol = true;
 
-  private boolean checkedForJmol = false; // ensure we don't check for jmol
+  boolean checkedForJmol = false; // ensure we don't check for jmol
 
   // every time the app is re-inited
 
@@ -1338,6 +1362,10 @@ public class JalviewLite extends Applet
    */
   public boolean useXtrnalSviewer = false;
 
+  public JalviewAppLoader appLoader;
+
+  public AlignFrame loaderFrame;
+
   public static boolean debug = false;
 
   static String builddate = null, version = null, installation = null;
@@ -1470,6 +1498,9 @@ public class JalviewLite extends Applet
                 .getString("error.invalid_separator_parameter"));
       }
     }
+
+    // Background color
+
     int r = 255;
     int g = 255;
     int b = 255;
@@ -1489,68 +1520,33 @@ public class JalviewLite extends Applet
         b = 255;
       }
     }
+    setBackground(new Color(r, g, b));
+
     param = getParameter("label");
     if (param != null)
     {
       launcher.setLabel(param);
     }
 
-    setBackground(new Color(r, g, b));
-
     file = getParameter("file");
 
     if (file == null)
     {
-      // Maybe the sequences are added as parameters
-      StringBuffer data = new StringBuffer("PASTE");
-      int i = 1;
-      while ((file = getParameter("sequence" + i)) != null)
-      {
-        data.append(file.toString() + "\n");
-        i++;
-      }
-      if (data.length() > 5)
-      {
-        file = data.toString();
-      }
+      file = appLoader.getPastedSequence(this);
     }
     if (getDefaultParameter("enableSplitFrame", true))
     {
       file2 = getParameter("file2");
     }
 
-    embedded = TRUE.equalsIgnoreCase(getParameter("embedded"));
+    embedded = (TRUE.equalsIgnoreCase(getParameter("embedded"))
+            || file != null
+                    && FALSE.equalsIgnoreCase(getParameter("showbutton")));
     if (embedded)
     {
-      LoadingThread loader = new LoadingThread(file, file2, this);
-      loader.start();
-    }
-    else if (file != null)
-    {
-      /*
-       * Start the applet immediately or show a button to start it
-       */
-      if (FALSE.equalsIgnoreCase(getParameter("showbutton")))
-      {
-        LoadingThread loader = new LoadingThread(file, file2, this);
-        loader.start();
-      }
-      else
-      {
-        add(launcher);
-        launcher.addActionListener(new java.awt.event.ActionListener()
-        {
-          @Override
-          public void actionPerformed(ActionEvent e)
-          {
-            LoadingThread loader = new LoadingThread(file, file2,
-                    JalviewLite.this);
-            loader.start();
-          }
-        });
-      }
+      startLoading();
     }
-    else
+    else if (file == null)
     {
       // jalview initialisation with no alignment. loadAlignment() method can
       // still be called to open new alignments.
@@ -1558,6 +1554,24 @@ public class JalviewLite extends Applet
       fileFound = false;
       callInitCallback();
     }
+    else
+    {
+      add(launcher);
+      launcher.addActionListener(new java.awt.event.ActionListener()
+      {
+        @Override
+        public void actionPerformed(ActionEvent e)
+        {
+          startLoading();
+        }
+      });
+    }
+  }
+
+  protected void startLoading()
+  {
+    LoadingThread loader = new LoadingThread(file, file2, this);
+    loader.start();
   }
 
   private void initLiveConnect()
@@ -1597,7 +1611,7 @@ public class JalviewLite extends Applet
     }
   }
 
-  private void callInitCallback()
+  void callInitCallback()
   {
     String initjscallback = getParameter("oninit");
     if (initjscallback == null)
@@ -1623,7 +1637,7 @@ public class JalviewLite extends Applet
         try
         {
           // do onInit with the JS executor thread
-          new JSFunctionExec(this).executeJavascriptFunction(true,
+          new JSFunctionExec(this, debug).executeJavascriptFunction(true,
                   initjscallback, null,
                   "Calling oninit callback '" + initjscallback + "'.");
         } catch (Exception e)
@@ -1836,7 +1850,7 @@ public class JalviewLite extends Applet
 
     JalviewLite applet;
 
-    private void dbgMsg(String msg)
+    public void dbgMsg(String msg)
     {
       if (JalviewLite.debug)
       {
@@ -1853,67 +1867,10 @@ public class JalviewLite extends Applet
      */
     public String resolveFileProtocol(String path)
     {
-      /*
-       * is it paste data?
-       */
-      if (path.startsWith("PASTE"))
-      {
-        protocol = DataSourceType.PASTE;
-        return path.substring(5);
-      }
 
-      /*
-       * is it a URL?
-       */
-      if (path.indexOf("://") != -1)
-      {
-        protocol = DataSourceType.URL;
-        return path;
-      }
-
-      /*
-       * try relative to document root
-       */
-      URL documentBase = getDocumentBase();
-      String withDocBase = resolveUrlForLocalOrAbsolute(path, documentBase);
-      if (HttpUtils.isValidUrl(withDocBase))
-      {
-        if (debug)
-        {
-          System.err.println("Prepended document base '" + documentBase
-                  + "' to make: '" + withDocBase + "'");
-        }
-        protocol = DataSourceType.URL;
-        return withDocBase;
-      }
-
-      /*
-       * try relative to codebase (if different to document base)
-       */
-      URL codeBase = getCodeBase();
-      String withCodeBase = applet.resolveUrlForLocalOrAbsolute(path,
-              codeBase);
-      if (!withCodeBase.equals(withDocBase)
-              && HttpUtils.isValidUrl(withCodeBase))
-      {
-        protocol = DataSourceType.URL;
-        if (debug)
-        {
-          System.err.println("Prepended codebase '" + codeBase
-                  + "' to make: '" + withCodeBase + "'");
-        }
-        return withCodeBase;
-      }
-
-      /*
-       * try locating by classloader; try this last so files in the directory
-       * are resolved using document base
-       */
-      if (inArchive(path))
-      {
-        protocol = DataSourceType.CLASSLOADER;
-      }
-      return path;
+      String[] ret = new String[] { path };
+      protocol = JalviewAppLoader.resolveFileProtocol(applet, ret);
+      return ret[0];
     }
 
     public LoadingThread(String file, String file2, JalviewLite _applet)
@@ -1958,25 +1915,16 @@ public class JalviewLite extends Applet
       if (newAlignFrame != null)
       {
         addToDisplay(newAlignFrame, newAlignFrame2);
-        loadTree(newAlignFrame);
-
-        loadScoreFile(newAlignFrame);
-
-        loadFeatures(newAlignFrame);
-
-        loadAnnotations(newAlignFrame);
-
-        loadJnetFile(newAlignFrame);
-
-        loadPdbFiles(newAlignFrame);
+        applet.loaderFrame = newAlignFrame;
+        appLoader.load(applet);
       }
       else
       {
         fileFound = false;
         applet.remove(launcher);
         applet.repaint();
+        callInitCallback();
       }
-      callInitCallback();
     }
 
     /**
@@ -2089,392 +2037,6 @@ public class JalviewLite extends Applet
       return null;
     }
 
-    /**
-     * Load PDBFiles if any specified by parameter(s). Returns true if loaded,
-     * else false.
-     * 
-     * @param alignFrame
-     * @return
-     */
-    protected boolean loadPdbFiles(AlignFrame alignFrame)
-    {
-      boolean result = false;
-      /*
-       * <param name="alignpdbfiles" value="false/true"/> Undocumented for 2.6 -
-       * related to JAL-434
-       */
-
-      applet.setAlignPdbStructures(
-              getDefaultParameter("alignpdbfiles", false));
-      /*
-       * <param name="PDBfile" value="1gaq.txt PDB|1GAQ|1GAQ|A PDB|1GAQ|1GAQ|B
-       * PDB|1GAQ|1GAQ|C">
-       * 
-       * <param name="PDBfile2" value="1gaq.txt A=SEQA B=SEQB C=SEQB">
-       * 
-       * <param name="PDBfile3" value="1q0o Q45135_9MICO">
-       */
-
-      int pdbFileCount = 0;
-      // Accumulate pdbs here if they are heading for the same view (if
-      // alignPdbStructures is true)
-      Vector pdbs = new Vector();
-      // create a lazy matcher if we're asked to
-      jalview.analysis.SequenceIdMatcher matcher = (applet
-              .getDefaultParameter("relaxedidmatch", false))
-                      ? new jalview.analysis.SequenceIdMatcher(
-                              alignFrame.getAlignViewport().getAlignment()
-                                      .getSequencesArray())
-                      : null;
-
-      String param;
-      do
-      {
-        if (pdbFileCount > 0)
-        {
-          param = applet.getParameter("PDBFILE" + pdbFileCount);
-        }
-        else
-        {
-          param = applet.getParameter("PDBFILE");
-        }
-
-        if (param != null)
-        {
-          PDBEntry pdb = new PDBEntry();
-
-          String seqstring;
-          SequenceI[] seqs = null;
-          String[] chains = null;
-
-          StringTokenizer st = new StringTokenizer(param, " ");
-
-          if (st.countTokens() < 2)
-          {
-            String sequence = applet.getParameter("PDBSEQ");
-            if (sequence != null)
-            {
-              seqs = new SequenceI[] { matcher == null
-                      ? (Sequence) alignFrame.getAlignViewport()
-                              .getAlignment().findName(sequence)
-                      : matcher.findIdMatch(sequence) };
-            }
-
-          }
-          else
-          {
-            param = st.nextToken();
-            List<SequenceI> tmp = new ArrayList<>();
-            List<String> tmp2 = new ArrayList<>();
-
-            while (st.hasMoreTokens())
-            {
-              seqstring = st.nextToken();
-              StringTokenizer st2 = new StringTokenizer(seqstring, "=");
-              if (st2.countTokens() > 1)
-              {
-                // This is the chain
-                tmp2.add(st2.nextToken());
-                seqstring = st2.nextToken();
-              }
-              tmp.add(matcher == null
-                      ? (Sequence) alignFrame.getAlignViewport()
-                              .getAlignment().findName(seqstring)
-                      : matcher.findIdMatch(seqstring));
-            }
-
-            seqs = tmp.toArray(new SequenceI[tmp.size()]);
-            if (tmp2.size() == tmp.size())
-            {
-              chains = tmp2.toArray(new String[tmp2.size()]);
-            }
-          }
-          param = resolveFileProtocol(param);
-          // TODO check JAL-357 for files in a jar (CLASSLOADER)
-          pdb.setFile(param);
-
-          if (seqs != null)
-          {
-            for (int i = 0; i < seqs.length; i++)
-            {
-              if (seqs[i] != null)
-              {
-                ((Sequence) seqs[i]).addPDBId(pdb);
-                StructureSelectionManager
-                        .getStructureSelectionManager(applet)
-                        .registerPDBEntry(pdb);
-              }
-              else
-              {
-                if (JalviewLite.debug)
-                {
-                  // this may not really be a problem but we give a warning
-                  // anyway
-                  System.err.println(
-                          "Warning: Possible input parsing error: Null sequence for attachment of PDB (sequence "
-                                  + i + ")");
-                }
-              }
-            }
-
-            if (!alignPdbStructures)
-            {
-              alignFrame.newStructureView(applet, pdb, seqs, chains,
-                      protocol);
-            }
-            else
-            {
-              pdbs.addElement(new Object[] { pdb, seqs, chains, protocol });
-            }
-          }
-        }
-
-        pdbFileCount++;
-      } while (param != null || pdbFileCount < 10);
-      if (pdbs.size() > 0)
-      {
-        SequenceI[][] seqs = new SequenceI[pdbs.size()][];
-        PDBEntry[] pdb = new PDBEntry[pdbs.size()];
-        String[][] chains = new String[pdbs.size()][];
-        String[] protocols = new String[pdbs.size()];
-        for (int pdbsi = 0, pdbsiSize = pdbs
-                .size(); pdbsi < pdbsiSize; pdbsi++)
-        {
-          Object[] o = (Object[]) pdbs.elementAt(pdbsi);
-          pdb[pdbsi] = (PDBEntry) o[0];
-          seqs[pdbsi] = (SequenceI[]) o[1];
-          chains[pdbsi] = (String[]) o[2];
-          protocols[pdbsi] = (String) o[3];
-        }
-        alignFrame.alignedStructureView(applet, pdb, seqs, chains,
-                protocols);
-        result = true;
-      }
-      return result;
-    }
-
-    /**
-     * Load in a Jnetfile if specified by parameter. Returns true if loaded,
-     * else false.
-     * 
-     * @param alignFrame
-     * @return
-     */
-    protected boolean loadJnetFile(AlignFrame alignFrame)
-    {
-      boolean result = false;
-      String param = applet.getParameter("jnetfile");
-      if (param == null)
-      {
-        // jnet became jpred around 2016
-        param = applet.getParameter("jpredfile");
-      }
-      if (param != null)
-      {
-        try
-        {
-          param = resolveFileProtocol(param);
-          JPredFile predictions = new JPredFile(param, protocol);
-          JnetAnnotationMaker.add_annotation(predictions,
-                  alignFrame.viewport.getAlignment(), 0, false);
-          // false == do not add sequence profile from concise output
-
-          alignFrame.viewport.getAlignment().setupJPredAlignment();
-
-          alignFrame.alignPanel.fontChanged();
-          alignFrame.alignPanel.setScrollValues(0, 0);
-          result = true;
-        } catch (Exception ex)
-        {
-          ex.printStackTrace();
-        }
-      }
-      return result;
-    }
-
-    /**
-     * Load annotations if specified by parameter. Returns true if loaded, else
-     * false.
-     * 
-     * @param alignFrame
-     * @return
-     */
-    protected boolean loadAnnotations(AlignFrame alignFrame)
-    {
-      boolean result = false;
-      String param = applet.getParameter("annotations");
-      if (param != null)
-      {
-        param = resolveFileProtocol(param);
-
-        if (new AnnotationFile().annotateAlignmentView(alignFrame.viewport,
-                param, protocol))
-        {
-          alignFrame.alignPanel.fontChanged();
-          alignFrame.alignPanel.setScrollValues(0, 0);
-          result = true;
-        }
-        else
-        {
-          System.err.println(
-                  "Annotations were not added from annotation file '"
-                          + param + "'");
-        }
-      }
-      return result;
-    }
-
-    /**
-     * Load features file and view settings as specified by parameters. Returns
-     * true if features were loaded, else false.
-     * 
-     * @param alignFrame
-     * @return
-     */
-    protected boolean loadFeatures(AlignFrame alignFrame)
-    {
-      boolean result = false;
-      // ///////////////////////////
-      // modify display of features
-      // we do this before any features have been loaded, ensuring any hidden
-      // groups are hidden when features first displayed
-      //
-      // hide specific groups
-      //
-      String param = applet.getParameter("hidefeaturegroups");
-      if (param != null)
-      {
-        alignFrame.setFeatureGroupState(separatorListToArray(param), false);
-        // applet.setFeatureGroupStateOn(newAlignFrame, param, false);
-      }
-      // show specific groups
-      param = applet.getParameter("showfeaturegroups");
-      if (param != null)
-      {
-        alignFrame.setFeatureGroupState(separatorListToArray(param), true);
-        // applet.setFeatureGroupStateOn(newAlignFrame, param, true);
-      }
-      // and now load features
-      param = applet.getParameter("features");
-      if (param != null)
-      {
-        param = resolveFileProtocol(param);
-
-        result = alignFrame.parseFeaturesFile(param, protocol);
-      }
-
-      param = applet.getParameter("showFeatureSettings");
-      if (param != null && param.equalsIgnoreCase(TRUE))
-      {
-        alignFrame.viewport.setShowSequenceFeatures(true);
-        new FeatureSettings(alignFrame.alignPanel);
-      }
-      return result;
-    }
-
-    /**
-     * Load a score file if specified by parameter. Returns true if file was
-     * loaded, else false.
-     * 
-     * @param alignFrame
-     */
-    protected boolean loadScoreFile(AlignFrame alignFrame)
-    {
-      boolean result = false;
-      String sScoreFile = applet.getParameter("scoreFile");
-      if (sScoreFile != null && !"".equals(sScoreFile))
-      {
-        try
-        {
-          if (debug)
-          {
-            System.err.println(
-                    "Attempting to load T-COFFEE score file from the scoreFile parameter");
-          }
-          result = alignFrame.loadScoreFile(sScoreFile);
-          if (!result)
-          {
-            System.err.println(
-                    "Failed to parse T-COFFEE parameter as a valid score file ('"
-                            + sScoreFile + "')");
-          }
-        } catch (Exception e)
-        {
-          System.err.printf("Cannot read score file: '%s'. Cause: %s \n",
-                  sScoreFile, e.getMessage());
-        }
-      }
-      return result;
-    }
-
-    /**
-     * Load a tree for the alignment if specified by parameter. Returns true if
-     * a tree was loaded, else false.
-     * 
-     * @param alignFrame
-     * @return
-     */
-    protected boolean loadTree(AlignFrame alignFrame)
-    {
-      boolean result = false;
-      String treeFile = applet.getParameter("tree");
-      if (treeFile == null)
-      {
-        treeFile = applet.getParameter("treeFile");
-      }
-
-      if (treeFile != null)
-      {
-        try
-        {
-          treeFile = resolveFileProtocol(treeFile);
-          NewickFile fin = new NewickFile(treeFile, protocol);
-          fin.parse();
-
-          if (fin.getTree() != null)
-          {
-            alignFrame.loadTree(fin, treeFile);
-            result = true;
-            dbgMsg("Successfully imported tree.");
-          }
-          else
-          {
-            dbgMsg("Tree parameter did not resolve to a valid tree.");
-          }
-        } catch (Exception ex)
-        {
-          ex.printStackTrace();
-        }
-      }
-      return result;
-    }
-
-    /**
-     * Discovers whether the given file is in the Applet Archive
-     * 
-     * @param f
-     *          String
-     * @return boolean
-     */
-    boolean inArchive(String f)
-    {
-      // This might throw a security exception in certain browsers
-      // Netscape Communicator for instance.
-      try
-      {
-        boolean rtn = (getClass().getResourceAsStream("/" + f) != null);
-        if (debug)
-        {
-          System.err.println("Resource '" + f + "' was "
-                  + (rtn ? "" : "not ") + "located by classloader.");
-        }
-        return rtn;
-      } catch (Exception ex)
-      {
-        System.out.println("Exception checking resources: " + f + " " + ex);
-        return false;
-      }
-    }
   }
 
   /**
@@ -2507,7 +2069,7 @@ public class JalviewLite extends Applet
   /**
    * set to enable the URL based javascript execution mechanism
    */
-  public boolean jsfallbackEnabled = false;
+  private boolean jsfallbackEnabled = false;
 
   /**
    * parse the string into a list
@@ -2515,66 +2077,10 @@ public class JalviewLite extends Applet
    * @param list
    * @return elements separated by separator
    */
+  @Override
   public String[] separatorListToArray(String list)
   {
-    return separatorListToArray(list, separator);
-  }
-
-  /**
-   * parse the string into a list
-   * 
-   * @param list
-   * @param separator
-   * @return elements separated by separator
-   */
-  public static String[] separatorListToArray(String list, String separator)
-  {
-    // TODO use StringUtils version (slightly different...)
-    int seplen = separator.length();
-    if (list == null || list.equals("") || list.equals(separator))
-    {
-      return null;
-    }
-    java.util.Vector jv = new Vector();
-    int cp = 0, pos;
-    while ((pos = list.indexOf(separator, cp)) > cp)
-    {
-      jv.addElement(list.substring(cp, pos));
-      cp = pos + seplen;
-    }
-    if (cp < list.length())
-    {
-      String c = list.substring(cp);
-      if (!c.equals(separator))
-      {
-        jv.addElement(c);
-      }
-    }
-    if (jv.size() > 0)
-    {
-      String[] v = new String[jv.size()];
-      for (int i = 0; i < v.length; i++)
-      {
-        v[i] = (String) jv.elementAt(i);
-      }
-      jv.removeAllElements();
-      if (debug)
-      {
-        System.err.println("Array from '" + separator
-                + "' separated List:\n" + v.length);
-        for (int i = 0; i < v.length; i++)
-        {
-          System.err.println("item " + i + " '" + v[i] + "'");
-        }
-      }
-      return v;
-    }
-    if (debug)
-    {
-      System.err.println(
-              "Empty Array from '" + separator + "' separated List");
-    }
-    return null;
+    return JalviewAppLoader.separatorListToArray(list, separator);
   }
 
   /**
@@ -2583,49 +2089,10 @@ public class JalviewLite extends Applet
    * @param list
    * @return concatenated string
    */
+  @Override
   public String arrayToSeparatorList(String[] list)
   {
-    return arrayToSeparatorList(list, separator);
-  }
-
-  /**
-   * concatenate the list with separator
-   * 
-   * @param list
-   * @param separator
-   * @return concatenated string
-   */
-  public static String arrayToSeparatorList(String[] list, String separator)
-  {
-    // TODO use StringUtils version
-    StringBuffer v = new StringBuffer();
-    if (list != null && list.length > 0)
-    {
-      for (int i = 0, iSize = list.length; i < iSize; i++)
-      {
-        if (list[i] != null)
-        {
-          if (i > 0)
-          {
-            v.append(separator);
-          }
-          v.append(list[i]);
-        }
-      }
-      if (debug)
-      {
-        System.err
-                .println("Returning '" + separator + "' separated List:\n");
-        System.err.println(v);
-      }
-      return v.toString();
-    }
-    if (debug)
-    {
-      System.err.println(
-              "Returning empty '" + separator + "' separated List\n");
-    }
-    return "" + separator;
+    return JalviewAppLoader.arrayToSeparatorList(list, separator);
   }
 
   /*
@@ -2649,9 +2116,10 @@ public class JalviewLite extends Applet
    * )
    */
   @Override
-  public String getFeatureGroupsOn(AlignFrame alf)
+  public String getFeatureGroupsOn(AlignFrameI alf)
   {
-    String lst = arrayToSeparatorList(alf.getFeatureGroups());
+    String lst = arrayToSeparatorList(
+            ((AlignFrame) alf).getFeatureGroups());
     return lst;
   }
 
@@ -2675,9 +2143,10 @@ public class JalviewLite extends Applet
    * .AlignFrame, boolean)
    */
   @Override
-  public String getFeatureGroupsOfStateOn(AlignFrame alf, boolean visible)
+  public String getFeatureGroupsOfStateOn(AlignFrameI alf, boolean visible)
   {
-    return arrayToSeparatorList(alf.getFeatureGroupsOfState(visible));
+    return arrayToSeparatorList(
+            ((AlignFrame) alf).getFeatureGroupsOfState(visible));
   }
 
   /*
@@ -2687,7 +2156,7 @@ public class JalviewLite extends Applet
    * AlignFrame, java.lang.String, boolean)
    */
   @Override
-  public void setFeatureGroupStateOn(final AlignFrame alf,
+  public void setFeatureGroupStateOn(final AlignFrameI alf,
           final String groups, boolean state)
   {
     final boolean st = state;// !(state==null || state.equals("") ||
@@ -2697,7 +2166,8 @@ public class JalviewLite extends Applet
       @Override
       public void run()
       {
-        alf.setFeatureGroupState(separatorListToArray(groups), st);
+        ((AlignFrame) alf)
+                .setFeatureGroupState(separatorListToArray(groups), st);
       }
     });
   }
@@ -2755,6 +2225,7 @@ public class JalviewLite extends Applet
    *          the value to return otherwise
    * @return true or false
    */
+  @Override
   public boolean getDefaultParameter(String name, boolean def)
   {
     String stn;
@@ -2776,13 +2247,15 @@ public class JalviewLite extends Applet
    * java.lang.String, java.lang.String, java.lang.String)
    */
   @Override
-  public boolean addPdbFile(AlignFrame alFrame, String sequenceId,
+  public boolean addPdbFile(AlignFrameI alFrame, String sequenceId,
           String pdbEntryString, String pdbFile)
   {
-    return alFrame.addPdbFile(sequenceId, pdbEntryString, pdbFile);
+    return ((AlignFrame) alFrame).addPdbFile(sequenceId, pdbEntryString,
+            pdbFile);
   }
 
-  protected void setAlignPdbStructures(boolean alignPdbStructures)
+  @Override
+  public void setAlignPdbStructures(boolean alignPdbStructures)
   {
     this.alignPdbStructures = alignPdbStructures;
   }
@@ -2798,86 +2271,36 @@ public class JalviewLite extends Applet
     // callInitCallback();
   }
 
-  private Hashtable<String, long[]> jshashes = new Hashtable<>();
+  private Hashtable<String, int[]> jshashes = new Hashtable<>();
 
   private Hashtable<String, Hashtable<String, String[]>> jsmessages = new Hashtable<>();
 
-  public void setJsMessageSet(String messageclass, String viewId,
-          String[] colcommands)
-  {
-    Hashtable<String, String[]> msgset = jsmessages.get(messageclass);
-    if (msgset == null)
-    {
-      msgset = new Hashtable<>();
-      jsmessages.put(messageclass, msgset);
-    }
-    msgset.put(viewId, colcommands);
-    long[] l = new long[colcommands.length];
-    for (int i = 0; i < colcommands.length; i++)
-    {
-      l[i] = colcommands[i].hashCode();
-    }
-    jshashes.put(messageclass + "|" + viewId, l);
-  }
 
-  /*
-   * (non-Javadoc)
-   * 
-   * @see jalview.bin.JalviewLiteJsApi#getJsMessage(java.lang.String,
-   * java.lang.String)
-   */
   @Override
-  public String getJsMessage(String messageclass, String viewId)
+  public Hashtable<String, int[]> getJSHashes()
   {
-    Hashtable<String, String[]> msgset = jsmessages.get(messageclass);
-    if (msgset != null)
-    {
-      String[] msgs = msgset.get(viewId);
-      if (msgs != null)
-      {
-        for (int i = 0; i < msgs.length; i++)
-        {
-          if (msgs[i] != null)
-          {
-            String m = msgs[i];
-            msgs[i] = null;
-            return m;
-          }
-        }
-      }
-    }
-    return "";
+    return jshashes;
   }
 
-  public boolean isJsMessageSetChanged(String string, String string2,
-          String[] colcommands)
+  @Override
+  public Hashtable<String, Hashtable<String, String[]>> getJSMessages()
   {
-    long[] l = jshashes.get(string + "|" + string2);
-    if (l == null && colcommands != null)
-    {
-      return true;
-    }
-    for (int i = 0; i < colcommands.length; i++)
-    {
-      if (l[i] != colcommands[i].hashCode())
-      {
-        return true;
-      }
-    }
-    return false;
+    return jsmessages;
   }
 
-  private Vector jsExecQueue = new Vector();
+  private Vector<Runnable> jsExecQueue = new Vector<>();
 
-  public Vector getJsExecQueue()
+  @Override
+  public Vector<Runnable> getJsExecQueue(JSFunctionExec exec)
   {
+    jsFunctionExec = exec;
     return jsExecQueue;
   }
 
-  public void setExecutor(JSFunctionExec jsFunctionExec2)
-  {
-    jsFunctionExec = jsFunctionExec2;
-  }
+  // public void setExecutor(JSFunctionExec jsFunctionExec2)
+  // {
+  // jsFunctionExec = jsFunctionExec2;
+  // }
 
   /**
    * return the given colour value parameter or the given default if parameter
@@ -2914,66 +2337,6 @@ public class JalviewLite extends Applet
   }
 
   /**
-   * form a complete URL given a path to a resource and a reference location on
-   * the same server
-   * 
-   * @param targetPath
-   *          - an absolute path on the same server as localref or a document
-   *          located relative to localref
-   * @param localref
-   *          - a URL on the same server as url
-   * @return a complete URL for the resource located by url
-   */
-  private String resolveUrlForLocalOrAbsolute(String targetPath,
-          URL localref)
-  {
-    String resolvedPath = "";
-    if (targetPath.startsWith("/"))
-    {
-      String codebase = localref.toString();
-      String localfile = localref.getFile();
-      resolvedPath = codebase.substring(0,
-              codebase.length() - localfile.length()) + targetPath;
-      return resolvedPath;
-    }
-
-    /*
-     * get URL path and strip off any trailing file e.g.
-     * www.jalview.org/examples/index.html#applets?a=b is trimmed to
-     * www.jalview.org/examples/
-     */
-    String urlPath = localref.toString();
-    String directoryPath = urlPath;
-    int lastSeparator = directoryPath.lastIndexOf("/");
-    if (lastSeparator > 0)
-    {
-      directoryPath = directoryPath.substring(0, lastSeparator + 1);
-    }
-
-    if (targetPath.startsWith("/"))
-    {
-      /*
-       * construct absolute URL to a file on the server - this is not allowed?
-       */
-      // String localfile = localref.getFile();
-      // resolvedPath = urlPath.substring(0,
-      // urlPath.length() - localfile.length())
-      // + targetPath;
-      resolvedPath = directoryPath + targetPath.substring(1);
-    }
-    else
-    {
-      resolvedPath = directoryPath + targetPath;
-    }
-    if (debug)
-    {
-      System.err.println(
-              "resolveUrlForLocalOrAbsolute returning " + resolvedPath);
-    }
-    return resolvedPath;
-  }
-
-  /**
    * open a URL in the browser - resolving it according to relative refs and
    * coping with javascript: protocol if necessary.
    * 
@@ -2990,7 +2353,7 @@ public class JalviewLite extends Applet
         // form valid URL
         // Should really use docbase, not codebase.
         URL prepend;
-        url = resolveUrlForLocalOrAbsolute(url,
+        url = JalviewAppLoader.resolveUrlForLocalOrAbsolute(url,
                 prepend = getDefaultParameter("resolvetocodebase", false)
                         ? getCodeBase()
                         : getDocumentBase());
@@ -3023,21 +2386,209 @@ public class JalviewLite extends Applet
     }
   }
 
-  /**
-   * bind structures in a viewer to any matching sequences in an alignFrame (use
-   * sequenceIds to limit scope of search to specific sequences)
-   * 
-   * @param alFrame
-   * @param viewer
-   * @param sequenceIds
-   * @return TODO: consider making an exception structure for indicating when
-   *         binding fails public SequenceStructureBinding
-   *         addStructureViewInstance( AlignFrame alFrame, Object viewer, String
-   *         sequenceIds) {
-   * 
-   *         if (sequenceIds != null && sequenceIds.length() > 0) { return
-   *         alFrame.addStructureViewInstance(viewer,
-   *         separatorListToArray(sequenceIds)); } else { return
-   *         alFrame.addStructureViewInstance(viewer, null); } // return null; }
-   */
+  @Override
+  public AlignViewportI getViewport()
+  {
+    return loaderFrame.getAlignViewport();
+  }
+
+  @Override
+  public void newStructureView(PDBEntry pdb, SequenceI[] seqs,
+          String[] chains, DataSourceType protocol)
+  {
+    loaderFrame.newStructureView(this, pdb, seqs, chains,
+            protocol);
+  }
+
+  @Override
+  public void alignedStructureView(PDBEntry[] pdb, SequenceI[][] seqs,
+          String[][] chains, String[] protocols)
+  {
+    loaderFrame.alignedStructureView(this, pdb, seqs, chains, protocols);
+  }
+
+  @Override
+  public void updateForAnnotations()
+  {
+    loaderFrame.alignPanel.fontChanged();
+    loaderFrame.alignPanel.setScrollValues(0, 0);
+  }
+
+  @Override
+  public void setFeatureGroupState(String[] groups, boolean state)
+  {
+    loaderFrame.setFeatureGroupState(groups, state);
+  }
+
+  @Override
+  public boolean parseFeaturesFile(String param, DataSourceType protocol)
+  {
+    return loaderFrame.parseFeaturesFile(param, protocol);
+  }
+
+  @Override
+  public void newFeatureSettings()
+  {
+    getViewport().setShowSequenceFeatures(true);
+    new FeatureSettings(loaderFrame.alignPanel);
+  }
+
+  @Override
+  public boolean loadScoreFile(String sScoreFile) throws IOException
+  {
+    return loaderFrame.loadScoreFile(sScoreFile);
+  }
+
+  @Override
+  public void loadTree(NewickFile tree, String treeFile) throws IOException
+  {
+    loaderFrame.loadTree(tree, treeFile);
+  }
+
+  @Override
+  public boolean isJsfallbackEnabled()
+  {
+    return jsfallbackEnabled;
+  }
+
+  @Override
+  public JSObject getJSObject()
+  {
+    return JSObject.getWindow(this);
+  }
+
+  @Override
+  public void updateColoursFromMouseOver(Object source,
+          MouseOverStructureListener listener)
+  {
+  }
+
+  @Override
+  public Object[] getSelectionForListener(SequenceGroup seqsel, ColumnSelection colsel,
+          HiddenColumns hidden, SelectionSource source, Object alignFrame)
+  {
+    // System.err.println("Testing selection event relay to
+    // jsfunction:"+_listener);
+      String setid = "";
+      AlignFrame src = (AlignFrame) alignFrame;
+      if (source != null)
+      {
+        if (source instanceof jalview.appletgui.AlignViewport
+                && ((jalview.appletgui.AlignViewport) source).applet.currentAlignFrame.viewport == source)
+        {
+          // should be valid if it just generated an event!
+          src = ((jalview.appletgui.AlignViewport) source).applet.currentAlignFrame;
+
+        }
+      }
+      String[] seqs = new String[] {};
+      String[] cols = new String[] {};
+      int strt = 0, end = (src == null) ? -1
+              : src.alignPanel.av.getAlignment().getWidth();
+      if (seqsel != null && seqsel.getSize() > 0)
+      {
+        seqs = new String[seqsel.getSize()];
+        for (int i = 0; i < seqs.length; i++)
+        {
+          seqs[i] = seqsel.getSequenceAt(i).getName();
+        }
+        if (strt < seqsel.getStartRes())
+        {
+          strt = seqsel.getStartRes();
+        }
+        if (end == -1 || end > seqsel.getEndRes())
+        {
+          end = seqsel.getEndRes();
+        }
+      }
+      if (colsel != null && !colsel.isEmpty())
+      {
+        if (end == -1)
+        {
+          end = colsel.getMax() + 1;
+        }
+        cols = new String[colsel.getSelected().size()];
+        for (int i = 0; i < cols.length; i++)
+        {
+          cols[i] = "" + (1 + colsel.getSelected().get(i).intValue());
+        }
+      }
+      else
+      {
+        if (seqsel != null && seqsel.getSize() > 0)
+        {
+          // send a valid range, otherwise we send the empty selection
+          cols = new String[2];
+          cols[0] = "" + (1 + strt) + "-" + (1 + end);
+        }
+      }
+      return  new Object[]
+    { src, setid, arrayToSeparatorList(seqs), arrayToSeparatorList(cols) };
+  }
+
+  @Override
+  public String getJsMessage(String messageclass, String viewId)
+  {
+    return JSFunctionExec.getJsMessage(messageclass, viewId, this);
+  }
+
+  @Override
+  public Object getFrameForSource(VamsasSource source)
+  {
+    if (source != null)
+    {
+      if (source instanceof jalview.appletgui.AlignViewport
+              && ((jalview.appletgui.AlignViewport) source).applet.currentAlignFrame.viewport == source)
+      {
+        // should be valid if it just generated an event!
+        return ((jalview.appletgui.AlignViewport) source).applet.currentAlignFrame;
+
+      }
+      // TODO: ensure that if '_af' is specified along with a handler
+      // function, then only events from that alignFrame are sent to that
+      // function
+    }
+    return null;
+  }
+
+  @Override
+  public FeatureRenderer getNewFeatureRenderer(AlignViewportI vp)
+  {
+    return new jalview.appletgui.FeatureRenderer((AlignmentViewport) vp);
+  }
+
+  @Override
+  public String getSelectedSequencesAsAlignment(String format,
+          boolean suffix)
+  {
+    // TODO Auto-generated method stub
+    return null;
+  }
+
+  @Override
+  public String getSelectedSequencesAsAlignmentFrom(AlignFrameI alf,
+          String format, boolean suffix)
+  {
+    // TODO Auto-generated method stub
+    return null;
+  }
+
+  // /**
+  // * bind structures in a viewer to any matching sequences in an alignFrame
+  // (use
+  // * sequenceIds to limit scope of search to specific sequences)
+  // *
+  // * @param alFrame
+  // * @param viewer
+  // * @param sequenceIds
+  // * @return TODO: consider making an exception structure for indicating when
+  // * binding fails public SequenceStructureBinding
+  // * addStructureViewInstance( AlignFrame alFrame, Object viewer, String
+  // * sequenceIds) {
+  // *
+  // * if (sequenceIds != null && sequenceIds.length() > 0) { return
+  // * alFrame.addStructureViewInstance(viewer,
+  // * separatorListToArray(sequenceIds)); } else { return
+  // * alFrame.addStructureViewInstance(viewer, null); } // return null; }
+  // */
 }
diff --git a/src/jalview/bin/JalviewTaskbar.java b/src/jalview/bin/JalviewTaskbar.java
deleted file mode 100644 (file)
index 7dd0382..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-package jalview.bin;
-
-import java.awt.Image;
-import java.awt.Taskbar;
-
-public class JalviewTaskbar
-{
-  public JalviewTaskbar()
-  {
-  }
-
-  protected static void setTaskbar(Jalview jalview)
-  {
-    
-    if (Taskbar.isTaskbarSupported())
-    {
-      Taskbar tb = Taskbar.getTaskbar();
-      if (tb.isSupported(Taskbar.Feature.ICON_IMAGE))
-      {
-        try
-        {
-          java.net.URL url = jalview.getClass()
-                  .getResource("/images/JalviewLogo_Huge.png");
-          if (url != null)
-          {
-            Image image = java.awt.Toolkit.getDefaultToolkit()
-                    .createImage(url);
-            tb.setIconImage(image);
-          }
-        } catch (Exception e)
-        {
-          System.out.println("Unable to setIconImage()");
-        }
-      }
-    }
-
-  }
-
-}
diff --git a/src/jalview/bin/Launcher.java b/src/jalview/bin/Launcher.java
deleted file mode 100644 (file)
index 412f119..0000000
+++ /dev/null
@@ -1,178 +0,0 @@
-package jalview.bin;
-
-import java.io.File;
-import java.io.IOException;
-import java.lang.management.ManagementFactory;
-import java.util.ArrayList;
-
-public class Launcher
-{
-
-  private final static String startClass = "jalview.bin.Jalview";
-
-  private final static int maxHeapSizePerCent = 90;
-
-  private final static String maxHeapSizePerCentProperty = "jvmmempc";
-
-  private final static String dockIconPath = "JalviewLogo_Huge.png";
-
-  public static void main(String[] args)
-  {
-    final String javaBin = System.getProperty("java.home") + File.separator
-            + "bin" + File.separator + "java";
-
-    ArrayList<String> command = new ArrayList<>();
-    command.add(javaBin);
-
-    String memSetting = null;
-
-    boolean isAMac = System.getProperty("os.name").indexOf("Mac") > -1;
-
-    for (String jvmArg : ManagementFactory.getRuntimeMXBean()
-            .getInputArguments())
-    {
-      command.add(jvmArg);
-    }
-    command.add("-cp");
-    command.add(ManagementFactory.getRuntimeMXBean().getClassPath());
-    ArrayList<String> arguments = new ArrayList<>();
-    for (String arg : args)
-    {
-      arguments.add(arg);
-    }
-
-    // add memory setting if not specified
-    boolean memSet = false;
-    boolean dockIcon = false;
-    boolean dockName = false;
-    ARG: for (int i = 0; i < command.size(); i++)
-    {
-      String arg = command.get(i);
-      if (arg.startsWith("-Xmx"))
-      {
-        memSetting = arg;
-        memSet = true;
-      }
-      else if (arg.startsWith("-Xdock:icon"))
-      {
-        dockIcon = true;
-      }
-      else if (arg.startsWith("-Xdock:name"))
-      {
-        dockName = true;
-      }
-    }
-
-    if (!memSet)
-    {
-      long maxMemLong = -1;
-      int percent = maxHeapSizePerCent;
-      String jvmmempc = System.getProperty(maxHeapSizePerCentProperty);
-      try
-      {
-        if (jvmmempc != null)
-        {
-          int trypercent = Integer.parseInt(jvmmempc);
-          if (0 < trypercent && trypercent <= 100)
-          {
-            percent = trypercent;
-          }
-          else
-          {
-            System.out.println("Property '" + maxHeapSizePerCentProperty
-                    + "' should be in range 1..100");
-          }
-        }
-      } catch (Exception e)
-      {
-        System.out.println("Error parsing " + maxHeapSizePerCentProperty
-                + " '" + jvmmempc + "'");
-      }
-
-      try
-      {
-        maxMemLong = MemorySetting.memPercent(percent);
-      } catch (Exception e)
-      {
-        e.printStackTrace();
-      } catch (Throwable t)
-      {
-        t.printStackTrace();
-      }
-
-      if (maxMemLong > 0)
-      {
-        memSetting = "-Xmx" + Long.toString(maxMemLong);
-        command.add(memSetting);
-      }
-    }
-
-    if (isAMac)
-    {
-      if (!dockIcon)
-      {
-        command.add("-Xdock:icon=" + dockIconPath);
-      }
-      if (!dockName)
-      {
-        // -Xdock:name=... doesn't actually work :(
-        // Leaving it in in case it gets fixed
-        command.add("-Xdock:name=" + "Jalview");
-      }
-    }
-
-    command.add(startClass);
-    command.addAll(arguments);
-
-    final ProcessBuilder builder = new ProcessBuilder(command);
-
-    // System.out.println("COMMAND: " + String.join(" ", builder.command()));
-    System.out.println("Running " + startClass + " with "
-            + (memSetting == null ? "no memSetting" : memSetting));
-
-    try
-    {
-      builder.inheritIO();
-      Process process = builder.start();
-      process.waitFor();
-    } catch (IOException e)
-    {
-      if (e.getMessage().toLowerCase().contains("memory"))
-      {
-        System.out.println("Caught a memory exception: " + e.getMessage());
-        // Probably the "Cannot allocate memory" error, try without the memory setting
-        ArrayList<String> commandNoMem = new ArrayList<>();
-        for (int i = 0; i < command.size(); i++)
-        {
-          if (!command.get(i).startsWith("-Xmx"))
-          {
-            commandNoMem.add(command.get(i));
-          }
-        }
-        final ProcessBuilder builderNoMem = new ProcessBuilder(
-                commandNoMem);
-        System.out.println("NO MEM COMMAND: "
-                + String.join(" ", builderNoMem.command()));
-        try
-        {
-          builderNoMem.inheritIO();
-          Process processNoMem = builderNoMem.start();
-          processNoMem.waitFor();
-        } catch (Exception ex)
-        {
-          ex.printStackTrace();
-        }
-      }
-      else
-      {
-        e.printStackTrace();
-      }
-    } catch (Exception e)
-    {
-      e.printStackTrace();
-    }
-    // System.exit(0);
-
-  }
-
-}
diff --git a/src/jalview/bin/MemorySetting.java b/src/jalview/bin/MemorySetting.java
deleted file mode 100644 (file)
index b3bae2d..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-package jalview.bin;
-
-import java.lang.management.ManagementFactory;
-import java.lang.management.OperatingSystemMXBean;
-
-public class MemorySetting
-{
-  public static final long leaveFreeMinMemory = 536870912; // 0.5 GB
-
-  public static final long applicationMinMemory = 536870912; // 0.5 GB
-
-  protected static long getPhysicalMemory()
-  {
-    final OperatingSystemMXBean o = ManagementFactory
-            .getOperatingSystemMXBean();
-
-    try
-    {
-      if (o instanceof com.sun.management.OperatingSystemMXBean)
-      {
-        final com.sun.management.OperatingSystemMXBean osb = (com.sun.management.OperatingSystemMXBean) o;
-        return osb.getTotalPhysicalMemorySize();
-      }
-    } catch (NoClassDefFoundError e)
-    {
-      // com.sun.management.OperatingSystemMXBean doesn't exist in this JVM
-      System.out.println("No com.sun.management.OperatingSystemMXBean");
-    }
-
-    // We didn't get a com.sun.management.OperatingSystemMXBean.
-    return -1;
-  }
-
-  public static long memPercent(int percent)
-  {
-    long memPercent = -1;
-
-    long physicalMem = getPhysicalMemory();
-    if (physicalMem > applicationMinMemory)
-    {
-      // try and set at least applicationMinMemory and thereafter ensure
-      // leaveFreeMinMemory is left for the OS
-      memPercent = Math.max(applicationMinMemory,
-              physicalMem - Math.max(physicalMem * (100 - percent) / 100,
-                      leaveFreeMinMemory));
-    }
-
-    return memPercent;
-  }
-
-}
index 7f7142f..f0ea2f6 100644 (file)
@@ -29,17 +29,17 @@ public class ChangeCaseCommand implements CommandI
 {
   String description;
 
-  public static int TO_LOWER = 0;
+  public final static int TO_LOWER = 0;
 
-  public static int TO_UPPER = 1;
+  public final static int TO_UPPER = 1;
 
-  public static int TOGGLE_CASE = 2;
+  public final static int TOGGLE_CASE = 2;
 
-  int caseChange = -1;
+  private int caseChange;
 
-  SequenceI[] seqs;
+  private SequenceI[] seqs;
 
-  List<int[]> regions;
+  private List<int[]> regions;
 
   public ChangeCaseCommand(String description, SequenceI[] seqs,
           List<int[]> regions, int caseChange)
@@ -51,21 +51,25 @@ public class ChangeCaseCommand implements CommandI
     doCommand(null);
   }
 
+  @Override
   public String getDescription()
   {
     return description;
   }
 
+  @Override
   public int getSize()
   {
     return 1;
   }
 
+  @Override
   public void doCommand(AlignmentI[] views)
   {
     changeCase(true);
   }
 
+  @Override
   public void undoCommand(AlignmentI[] views)
   {
     changeCase(false);
index 9b8a9e3..33699cc 100644 (file)
@@ -166,10 +166,9 @@ public class AlignViewController implements AlignViewControllerI
     // JBPNote this routine could also mark rows, not just columns.
     // need a decent query structure to allow all types of feature searches
     BitSet bs = new BitSet();
-    boolean searchSelection = viewport.getSelectionGroup() != null
-            && !extendCurrent;
-    SequenceCollectionI sqcol = searchSelection ? viewport
-            .getSelectionGroup() : viewport.getAlignment();
+    SequenceCollectionI sqcol = (viewport.getSelectionGroup() == null
+            || extendCurrent) ? viewport.getAlignment()
+                    : viewport.getSelectionGroup();
 
     int nseq = findColumnsWithFeature(featureType, sqcol, bs);
 
@@ -205,10 +204,9 @@ public class AlignViewController implements AlignViewControllerI
     }
     else
     {
-      String key = searchSelection ? "label.no_feature_found_selection"
-              : "label.no_feature_of_type_found";
-      avcg.setStatus(MessageManager.formatMessage(key,
-              new String[] { featureType }));
+      avcg.setStatus(MessageManager
+              .formatMessage("label.no_feature_of_type_found", new String[]
+              { featureType }));
       if (!extendCurrent)
       {
         cs.clear();
index c4098e2..98510e3 100755 (executable)
@@ -47,7 +47,7 @@ import java.util.Vector;
  * @author JimP
  * 
  */
-public class Alignment implements AlignmentI, AutoCloseable
+public class Alignment implements AlignmentI
 {
   private Alignment dataset;
 
@@ -125,8 +125,7 @@ public class Alignment implements AlignmentI, AutoCloseable
   /**
    * Make a new alignment from an array of SeqCigars
    * 
-   * @param seqs
-   *          SeqCigar[]
+   * @param alseqs
    */
   public Alignment(SeqCigar[] alseqs)
   {
@@ -303,20 +302,15 @@ public class Alignment implements AlignmentI, AutoCloseable
   }
 
   @Override
-  public void close()
+  public void finalize() throws Throwable
   {
     if (getDataset() != null)
     {
-      try
-      {
-        getDataset().removeAlignmentRef();
-      } catch (Throwable e)
-      {
-        e.printStackTrace();
-      }
+      getDataset().removeAlignmentRef();
     }
 
     nullReferences();
+    super.finalize();
   }
 
   /**
@@ -404,6 +398,10 @@ public class Alignment implements AlignmentI, AutoCloseable
     return null;
   }
 
+  private static final SequenceGroup[] noGroups = new SequenceGroup[0];
+
+  private ArrayList<SequenceGroup> temp = new ArrayList<>();
+
   /*
    * (non-Javadoc)
    * 
@@ -413,11 +411,15 @@ public class Alignment implements AlignmentI, AutoCloseable
   @Override
   public SequenceGroup[] findAllGroups(SequenceI s)
   {
-    ArrayList<SequenceGroup> temp = new ArrayList<>();
 
     synchronized (groups)
     {
       int gSize = groups.size();
+      if (gSize == 0)
+      {
+        return noGroups;
+      }
+      temp.clear();
       for (int i = 0; i < gSize; i++)
       {
         SequenceGroup sg = groups.get(i);
@@ -2032,4 +2034,17 @@ public class Alignment implements AlignmentI, AutoCloseable
     }
   }
 
+  @Override
+  public void resetColors()
+  {
+    for (int i = getHeight(); --i >= 0;)
+    {
+      sequences.get(i).resetColors();
+    }
+    // if (dataset != null)
+    // {
+    // dataset.resetColors();
+    // }
+  }
+
 }
index 2ee4503..ee9389c 100755 (executable)
@@ -991,7 +991,7 @@ public class AlignmentAnnotation
           seqPos = i + startRes;
         }
 
-        sequenceMapping.put(Integer.valueOf(seqPos), annotations[i]);
+        sequenceMapping.put(new Integer(seqPos), annotations[i]);
       }
     }
 
@@ -1030,7 +1030,7 @@ public class AlignmentAnnotation
     {
       for (a = sequenceRef.getStart(); a <= sequenceRef.getEnd(); a++)
       {
-        index = Integer.valueOf(a);
+        index = new Integer(a);
         Annotation annot = sequenceMapping.get(index);
         if (annot != null)
         {
index 93a2456..ebf4da3 100755 (executable)
@@ -624,4 +624,10 @@ public interface AlignmentI extends AnnotatedCollectionI
   public HiddenColumns propagateInsertions(SequenceI profileseq,
           AlignmentView input);
 
+  /**
+   * Remove all color already assigned to sequences, causing them to be be
+   * recalculated.
+   */
+  void resetColors();
+
 }
index e216c46..f3077fa 100644 (file)
@@ -22,6 +22,7 @@ package jalview.datamodel;
 
 import jalview.api.AlignmentColsCollectionI;
 
+import java.util.BitSet;
 import java.util.Iterator;
 
 public class AllColsCollection implements AlignmentColsCollectionI
@@ -56,4 +57,26 @@ public class AllColsCollection implements AlignmentColsCollectionI
   {
     return hidden.hasHiddenColumns();
   }
+
+  private BitSet bsVisible;
+
+  @Override
+  public BitSet getHiddenBitSet()
+  {
+    return hidden.getBitset();
+  }
+
+  /**
+   * return ALL columns, not just the truly visible ones
+   */
+  @Override
+  public BitSet getOverviewBitSet()
+  {
+    if (bsVisible == null)
+    {
+      bsVisible = new BitSet(end + 1);
+      bsVisible.set(0, end + 1);
+    }
+    return bsVisible;
+  }
 }
index cea9de7..c33abb3 100755 (executable)
@@ -169,7 +169,7 @@ public class BinarySequence extends Sequence
 
     for (int i = 0; i < binary.length; i++)
     {
-      out += (Integer.valueOf(binary[i])).toString();
+      out += (new Integer(binary[i])).toString();
 
       if (i < (binary.length - 1))
       {
index 6f14e21..3ccaab8 100644 (file)
@@ -106,7 +106,7 @@ public class ColumnSelection
     void remove(int col)
     {
 
-      Integer colInt = Integer.valueOf(col);
+      Integer colInt = new Integer(col);
 
       if (selected.get(col))
       {
@@ -204,7 +204,7 @@ public class ColumnSelection
           // clear shifted bits and update List of selected columns
           selected.clear(temp);
           mask.set(temp - change);
-          order.set(i, Integer.valueOf(temp - change));
+          order.set(i, new Integer(temp - change));
         }
       }
       // lastly update the bitfield all at once
@@ -309,7 +309,7 @@ public class ColumnSelection
     Integer colInt;
     for (int i = start; i < end; i++)
     {
-      colInt = Integer.valueOf(i);
+      colInt = new Integer(i);
       if (selection.contains(colInt))
       {
         selection.remove(colInt);
index 54e8379..0004abe 100755 (executable)
@@ -21,7 +21,6 @@
 package jalview.datamodel;
 
 import jalview.api.DBRefEntryI;
-import jalview.io.vamsas.Dbref;
 import jalview.util.DBRefUtils;
 import jalview.util.MapList;
 
@@ -42,7 +41,7 @@ public class DBRefEntry implements DBRefEntryI
 
   private String version = "";
   
-  private String ucversion;
+  private String ucversion = "";
 
   private String accessionId = "";
   
index 2f94884..71d6972 100755 (executable)
@@ -42,7 +42,8 @@ public class DBRefSource
   
   
   public static final String UNIPROT = "UNIPROT";
-  public static final String UP_NAME = "UNIPROT_NAME".toUpperCase();
+
+  public static final String UP_NAME = "UNIPROT_NAME";
   /**
    * Uniprot Knowledgebase/TrEMBL as served from EMBL protein products.
    */
@@ -56,10 +57,18 @@ public class DBRefSource
   public static final String EMBLCDSProduct = "EMBLCDSProtein".toUpperCase();
 
   public static final String PDB    = "PDB";
-  public static final String PFAM   = "PFAM";
+
+  public static final String PFAM = "PFAM";
+
   public static final String RFAM   = "RFAM";
   public static final String GENEDB = "GeneDB".toUpperCase();
 
+  public static final String PFAM_FULL = "PFAM (Full)";
+
+  public static final String PFAM_SEED = "PFAM (Seed)";
+
+  public static final String RFAM_SEED = "RFAM (Seed)";
+
   public static final String PDB_CANONICAL_NAME = PDB;
 
 
@@ -135,7 +144,7 @@ public class DBRefSource
 //       CODINGDBS, DNACODINGDBS, PROTEINDBS };
 //       
        public static final int PRIMARY_SOURCES_MASK = CODING_MASK | DNA_CODING_MASK | PROTEIN_MASK;
-       
+
     public static boolean isPrimarySource(String source)
     {
        return ((PRIMARY_SOURCES_MASK & getSourceKey(source)) != 0);
index 2d43f02..458bde7 100644 (file)
@@ -86,6 +86,20 @@ public class HiddenColumns
    */
   private List<int[]> hiddenColumns = new ArrayList<>();
 
+  private BitSet hiddenBitSet;
+
+  public BitSet getBitset()
+  {
+    if (hiddenBitSet == null)
+    {
+      hiddenBitSet = new BitSet();
+      for (int[] range : hiddenColumns)
+      {
+        hiddenBitSet.set(range[0], range[1] + 1);
+      }
+    }
+    return hiddenBitSet;
+  }
   /**
    * Constructor
    */
@@ -213,6 +227,7 @@ public class HiddenColumns
               prevHiddenCount);
     } finally
     {
+      hiddenBitSet = null;
       LOCK.writeLock().unlock();
     }
   }
@@ -264,6 +279,7 @@ public class HiddenColumns
       insertRangeAtOverlap(i, start, end, region);
       added = true;
     }
+    hiddenBitSet = null;
     return added;
   }
 
@@ -310,6 +326,7 @@ public class HiddenColumns
     }
     numColumns += region[1] - oldend;
     hiddenColumns.subList(i + 1, endi + 1).clear();
+    hiddenBitSet = null;
   }
 
   /**
@@ -330,6 +347,7 @@ public class HiddenColumns
 
     } finally
     {
+      hiddenBitSet = null;
       LOCK.writeLock().unlock();
     }
   }
@@ -356,6 +374,7 @@ public class HiddenColumns
 
     } finally
     {
+      hiddenBitSet = null;
       LOCK.writeLock().unlock();
     }
   }
@@ -399,6 +418,7 @@ public class HiddenColumns
       }
     } finally
     {
+      hiddenBitSet = null;
       LOCK.writeLock().unlock();
     }
   }
@@ -620,6 +640,7 @@ public class HiddenColumns
 
     } finally
     {
+      hiddenBitSet = null;
       LOCK.readLock().unlock();
     }
   }
@@ -798,7 +819,7 @@ public class HiddenColumns
       for (int firstSet = tohide
               .nextSetBit(start), lastSet = start; firstSet >= start
                       && lastSet <= end; firstSet = tohide
-                      .nextSetBit(lastSet))
+                              .nextSetBit(lastSet))
       {
         lastSet = tohide.nextClearBit(firstSet);
         if (lastSet <= end)
@@ -813,6 +834,7 @@ public class HiddenColumns
       cursor = new HiddenColumnsCursor(hiddenColumns);
     } finally
     {
+      hiddenBitSet = null;
       LOCK.writeLock().unlock();
     }
   }
@@ -894,6 +916,7 @@ public class HiddenColumns
       }
     } finally
     {
+      hiddenBitSet = null;
       LOCK.writeLock().unlock();
     }
   }
@@ -909,16 +932,12 @@ public class HiddenColumns
     {
       LOCK.writeLock().lock();
 
-      BitSet hiddenBitSet = new BitSet();
-      for (int[] range : hiddenColumns)
-      {
-        hiddenBitSet.set(range[0], range[1] + 1);
-      }
-      hiddenBitSet.andNot(updates);
+      getBitset().andNot(updates);
       hiddenColumns.clear();
       hideColumns(hiddenBitSet);
     } finally
     {
+      hiddenBitSet = null;
       LOCK.writeLock().unlock();
     }
   }
index c1dc77c..80e2de8 100755 (executable)
@@ -131,18 +131,11 @@ public class PDBEntry
      * CaseInsensitiveString, so we are in effect doing a 
      * case-insensitive comparison of chain codes
      */
-    boolean idMatches = id == o.id
-            || (id != null && id.equalsIgnoreCase(o.id));
-    boolean fileMatches = file == o.file
-            || (file != null && file.equals(o.file));
-    boolean typeMatches = type == o.type
-            || (type != null && type.equals(o.type));
-    if (idMatches && fileMatches && typeMatches)
-    {
-      return properties == o.properties
-              || (properties != null && properties.equals(o.properties));
-    }
-    return false;
+    return (id == o.id || (id != null && id.equalsIgnoreCase(o.id)))
+            && (file == o.file || (file != null && file.equals(o.file)))
+            && (type == o.type || (type != null && type.equals(o.type)))
+            && (properties == o.properties || (properties != null
+                    && properties.equals(o.properties)));
   }
 
   /**
@@ -169,7 +162,7 @@ public class PDBEntry
   {
     this.id = pdbId;
     this.type = entryType == null ? null : entryType.toString();
-    this.file = filePath;
+    this.file = (filePath == null ? null : filePath.replace('\\', '/'));
     setChainCode(chain);
   }
 
@@ -220,7 +213,7 @@ public class PDBEntry
 
   public void setFile(String f)
   {
-    this.file = f;
+    this.file = f.replace('\\', '/');
   }
 
   public String getFile()
@@ -257,7 +250,7 @@ public class PDBEntry
   {
     if (this.properties == null)
     {
-      this.properties = new Hashtable<String, Object>();
+      this.properties = new Hashtable<>();
     }
     properties.put(key, value);
   }
index 74eb887..bb604d0 100644 (file)
@@ -76,9 +76,10 @@ public class ResidueCount
    * fast lookup tables holding the index into our count
    * arrays of each symbol; index 0 is reserved for gap counting
    */
-  private static int[] NUC_INDEX = new int[26];
+  private final static int[] NUC_INDEX = new int[26];
+
+  private final static int[] AA_INDEX = new int[26];
 
-  private static int[] AA_INDEX = new int[26];
   static
   {
     for (int i = 0; i < NUCS.length(); i++)
index 476eb19..e395648 100644 (file)
@@ -25,7 +25,9 @@ import fr.orsay.lri.varna.models.rna.RNA;
 public class SecondaryStructureAnnotation extends AlignmentAnnotation
 {
 
-  private static RNA _rna = null;
+  // was static, but that cannot work here
+
+  private RNA _rna = null;
 
   public SecondaryStructureAnnotation(RNA rna)
   {
@@ -44,7 +46,7 @@ public class SecondaryStructureAnnotation extends AlignmentAnnotation
     Annotation[] ann = new Annotation[rna.getSize()];
     for (int i = 0; i < ann.length; i++)
     {
-      ann[i] = new Annotation(_rna.getStructDBN(true), "", ' ', 0f);
+      ann[i] = new Annotation(rna.getStructDBN(true), "", ' ', 0f);
       ;
     }
     return ann;
index ca2b6d4..bad33d1 100755 (executable)
@@ -392,6 +392,10 @@ public class Sequence extends ASequence implements SequenceI
     return sequenceFeatureStore.add(sf);
   }
 
+  /**
+   * @param sf
+   *          A known feature of this featureStore
+   */
   @Override
   public void deleteFeature(SequenceFeature sf)
   {
@@ -1967,15 +1971,15 @@ public class Sequence extends ASequence implements SequenceI
 
     List<SequenceFeature> result = getFeatures().findFeatures(startPos,
             endPos, types);
-    if (datasetSequence != null)
-    {
-      result = datasetSequence.getFeatures().findFeatures(startPos, endPos,
-              types);
-    }
-    else
-    {
-      result = sequenceFeatureStore.findFeatures(startPos, endPos, types);
-    }
+    // if (datasetSequence != null)
+    // {
+    // result = datasetSequence.getFeatures().findFeatures(startPos, endPos,
+    // types);
+    // }
+    // else
+    // {
+    // result = sequenceFeatureStore.findFeatures(startPos, endPos, types);
+    // }
 
     /*
      * if end column is gapped, endPos may be to the right, 
@@ -2026,6 +2030,7 @@ public class Sequence extends ASequence implements SequenceI
   @Override
   public void sequenceChanged()
   {
+    argb = null;
     changeCount++;
   }
 
@@ -2127,4 +2132,54 @@ public class Sequence extends ASequence implements SequenceI
     // otherwise, sequence was completely hidden
     return 0;
   }
+
+  private int[] argb;
+
+  @Override
+  public int getColor(int i)
+  {
+    return argb == null ? 0 : argb[i];
+  }
+
+  @Override
+  public int setColor(int i, int rgb)
+  {
+    if (argb == null)
+    {
+      argb = new int[this.sequence.length];
+    }
+    return (argb[i] = rgb);
+  }
+
+  @Override
+  public void resetColors()
+  {
+    argb = null;
+  }
+
+  /**
+   * @author Bob Hanson 2019.07.30
+   * 
+   *         allows passing the result ArrayList as a parameter to avoid
+   *         unnecessary construction
+   * @return result (JavaScript) or new ArrayList (Java -- see FeatureRender)
+   * 
+   */
+  @Override
+  public List<SequenceFeature> findFeatures(int column, String type,
+          List<SequenceFeature> result)
+  {
+    return getFeatures().findFeatures(findPosition(column - 1), type,
+            result);
+  }
+
+  /**
+   * allows early intervention for renderer if this returns false
+   */
+  @Override
+  public boolean hasFeatures(String type)
+  {
+    return getFeatures().hasFeatures(type);
+  }
+
 }
index 7052f34..6f51420 100755 (executable)
@@ -35,6 +35,8 @@ import java.util.SortedMap;
 import java.util.TreeMap;
 import java.util.Vector;
 
+import intervalstore.api.IntervalI;
+
 /**
  * A class that models a single contiguous feature on a sequence. If flag
  * 'contactFeature' is true, the start and end positions are interpreted instead
@@ -217,10 +219,20 @@ public class SequenceFeature implements FeatureLocationI
   @Override
   public boolean equals(Object o)
   {
-    return equals(o, false);
+    return (o != null && (o instanceof SequenceFeature)
+            && equalsInterval((SequenceFeature) o));
   }
 
   /**
+   * Having determined that this is in fact a SequenceFeature, now check it for
+   * equivalence. Overridden in CrossRef; used by IntervalStore (possibly).
+   */
+  @Override
+  public boolean equalsInterval(IntervalI sf)
+  {
+    return equals((SequenceFeature) sf, 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
@@ -230,14 +242,8 @@ public class SequenceFeature implements FeatureLocationI
    * @param ignoreParent
    * @return
    */
-  public boolean equals(Object o, boolean ignoreParent)
+  public boolean equals(SequenceFeature sf, boolean ignoreParent)
   {
-    if (o == null || !(o instanceof SequenceFeature))
-    {
-      return false;
-    }
-
-    SequenceFeature sf = (SequenceFeature) o;
     boolean sameScore = Float.isNaN(score) ? Float.isNaN(sf.score)
             : score == sf.score;
     if (begin != sf.begin || end != sf.end || !sameScore)
@@ -736,6 +742,8 @@ public class SequenceFeature implements FeatureLocationI
   {
     source = theSource;
   }
+
 }
 
 class SFSortByEnd implements Comparator<SequenceFeature>
index 933f332..0b26564 100755 (executable)
@@ -584,6 +584,48 @@ public interface SequenceI extends ASequenceI
    */
   public int firstResidueOutsideIterator(Iterator<int[]> it);
 
+  /**
+   * @author Bob Hanson 2019.07.30
+   * 
+   * get a 4-byte color, with caching
+   * 
+   */
+  public int getColor(int i);
+
+  /**
+   * @author Bob Hanson 2019.07.30
+   * 
+   * set a 4-byte color, with caching
+   * 
+   */
+  public int setColor(int i, int argb);
+
+  /**
+   * @author Bob Hanson 2019.07.30
+   * 
+   * allows resetting the color cache
+   * 
+   */
+  public void resetColors();
+
+  /**
+   * allows passing the result ArrayList as a parameter to avoid unnecessary
+   * construction
+   * 
+   * @author Bob Hanson 2019.07.30
+   * 
+   * 
+   */
+  List<SequenceFeature> findFeatures(int column, String type,
+          List<SequenceFeature> result);
+
+  /**
+   * allows early intervention for renderer if false
+   * 
+   * @author Bob Hanson 2019.07.30
+   * 
+   */
+  public boolean hasFeatures(String type);
 
 }
 
index 4ca51b5..cd812a1 100644 (file)
@@ -22,6 +22,7 @@ package jalview.datamodel;
 
 import jalview.api.AlignmentColsCollectionI;
 
+import java.util.BitSet;
 import java.util.Iterator;
 
 public class VisibleColsCollection implements AlignmentColsCollectionI
@@ -32,6 +33,8 @@ public class VisibleColsCollection implements AlignmentColsCollectionI
 
   HiddenColumns hidden;
 
+  private BitSet bsVisible;
+
   public VisibleColsCollection(int s, int e, HiddenColumns h)
   {
     start = s;
@@ -57,4 +60,27 @@ public class VisibleColsCollection implements AlignmentColsCollectionI
     return false;
   }
 
+  /**
+   * Only the visible columns.
+   */
+  @Override
+  public BitSet getOverviewBitSet()
+  {
+    if (bsVisible == null)
+    {
+      bsVisible = new BitSet(end + 1);
+    }
+    bsVisible.clear();
+    bsVisible.set(start, end + 1);
+    bsVisible.andNot(hidden.getBitset());
+
+    return bsVisible;
+  }
+
+  @Override
+  public BitSet getHiddenBitSet()
+  {
+    return new BitSet();
+  }
+
 }
index 7acebee..f51fe48 100644 (file)
@@ -1,5 +1,8 @@
 package jalview.datamodel.features;
 
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
+
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
@@ -12,14 +15,23 @@ import java.util.TreeMap;
 /**
  * A singleton class to hold the set of attributes known for each feature type
  */
-public class FeatureAttributes
+public class FeatureAttributes implements ApplicationSingletonI
 {
   public enum Datatype
   {
     Character, Number, Mixed
   }
 
-  private static FeatureAttributes instance = new FeatureAttributes();
+  public static FeatureAttributes getInstance()
+  {
+    return (FeatureAttributes) ApplicationSingletonProvider
+            .getInstance(FeatureAttributes.class);
+  }
+
+  private FeatureAttributes()
+  {
+    attributes = new HashMap<>();
+  }
 
   /*
    * map, by feature type, of a map, by attribute name, of
@@ -173,21 +185,6 @@ public class FeatureAttributes
   }
 
   /**
-   * Answers the singleton instance of this class
-   * 
-   * @return
-   */
-  public static FeatureAttributes getInstance()
-  {
-    return instance;
-  }
-
-  private FeatureAttributes()
-  {
-    attributes = new HashMap<>();
-  }
-
-  /**
    * Answers the attribute names known for the given feature type, in
    * alphabetical order (not case sensitive), or an empty set if no attributes
    * are known. An attribute name is typically 'simple' e.g. "AC", but may be
index 1be1b82..ec04bad 100644 (file)
@@ -1,31 +1,22 @@
 package jalview.datamodel.features;
 
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
+
 import java.util.HashMap;
 import java.util.Map;
 
-/**
- * A singleton to hold metadata about feature attributes, keyed by a unique
- * feature source identifier
- * 
- * @author gmcarstairs
- *
- */
-public class FeatureSources
+public class FeatureSources implements ApplicationSingletonI
 {
-  private static FeatureSources instance = new FeatureSources();
-
-  private Map<String, FeatureSourceI> sources;
 
-  /**
-   * Answers the singleton instance of this class
-   * 
-   * @return
-   */
   public static FeatureSources getInstance()
   {
-    return instance;
+    return (FeatureSources) ApplicationSingletonProvider
+            .getInstance(FeatureSources.class);
   }
 
+  private Map<String, FeatureSourceI> sources;
+
   private FeatureSources()
   {
     sources = new HashMap<>();
index 54c0d59..1451892 100644 (file)
@@ -23,25 +23,134 @@ package jalview.datamodel.features;
 import jalview.datamodel.SequenceFeature;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
-import intervalstore.api.IntervalStoreI;
-import intervalstore.impl.BinarySearcher;
-import intervalstore.impl.IntervalStore;
-
-/**
- * A data store for a set of sequence features that supports efficient lookup of
- * features overlapping a given range. Intended for (but not limited to) storage
- * of features for one sequence and feature type.
- * 
- * @author gmcarstairs
- *
- */
-public class FeatureStore
+public abstract class FeatureStore implements FeatureStoreI
 {
+
+  /**
+   * track last start for quick insertion of ordered features
+   */
+  protected int lastStart = -1, lastContactStart = -1;
+
+  /**
+   * Answers the 'length' of the feature, counting 0 for non-positional features
+   * and 1 for contact features
+   * 
+   * @param feature
+   * @return
+   */
+  protected static int getFeatureLength(SequenceFeature feature)
+  {
+    if (feature.isNonPositional())
+    {
+      return 0;
+    }
+    if (feature.isContactFeature())
+    {
+      return 1;
+    }
+    return 1 + feature.getEnd() - feature.getBegin();
+  }
+
+  /**
+   * Answers true if the list contains the feature, else false. This method is
+   * optimised for the condition that the list is sorted on feature start
+   * position ascending, and will give unreliable results if this does not hold.
+   * 
+   * @param list
+   * @param feature
+   * @return
+   */
+  @Override
+  public boolean listContains(List<SequenceFeature> list,
+          SequenceFeature feature)
+  {
+    if (list == null || feature == null)
+    {
+      return false;
+    }
+
+    return (getEquivalentFeatureIndex(list, feature) >= 0);
+  }
+
+  /**
+   * Binary search for the index (&gt;= 0) of a feature in a list.
+   * 
+   * @param list
+   * @param feature
+   * @return index if found; -1 if not
+   */
+  protected int getEquivalentFeatureIndex(List<SequenceFeature> list,
+          SequenceFeature feature)
+  {
+
+    /*
+     * locate the first entry in the list which does not precede the feature
+     */
+    int begin = feature.begin;
+    int pos = findFirstBegin(list, begin);
+    int len = list.size();
+    while (pos < len)
+    {
+      SequenceFeature sf = list.get(pos);
+      if (sf.begin > begin)
+      {
+        return -1; // no match found
+      }
+      if (sf.equals(feature))
+      {
+        return pos;
+      }
+      pos++;
+    }
+    return -1;
+  }
+
+  /**
+   * A helper method to return the maximum of two floats, where a non-NaN value
+   * is treated as 'greater than' a NaN value (unlike Math.max which does the
+   * opposite)
+   * 
+   * @param f1
+   * @param f2
+   */
+  protected static float max(float f1, float f2)
+  {
+    if (Float.isNaN(f1))
+    {
+      return Float.isNaN(f2) ? f1 : f2;
+    }
+    else
+    {
+      return Float.isNaN(f2) ? f1 : Math.max(f1, f2);
+    }
+  }
+
+  /**
+   * A helper method to return the minimum of two floats, where a non-NaN value
+   * is treated as 'less than' a NaN value (unlike Math.min which does the
+   * opposite)
+   * 
+   * @param f1
+   * @param f2
+   */
+  protected static float min(float f1, float f2)
+  {
+    if (Float.isNaN(f1))
+    {
+      return Float.isNaN(f2) ? f1 : f2;
+    }
+    else
+    {
+      return Float.isNaN(f2) ? f1 : Math.min(f1, f2);
+    }
+  }
+
   /*
    * Non-positional features have no (zero) start/end position.
    * Kept as a separate list in case this criterion changes in future.
@@ -62,7 +171,7 @@ public class FeatureStore
    * IntervalStore holds remaining features and provides efficient
    * query for features overlapping any given interval
    */
-  IntervalStoreI<SequenceFeature> features;
+  Collection<SequenceFeature> features;
 
   /*
    * Feature groups represented in stored positional features 
@@ -95,7 +204,6 @@ public class FeatureStore
    */
   public FeatureStore()
   {
-    features = new IntervalStore<>();
     positionalFeatureGroups = new HashSet<>();
     nonPositionalFeatureGroups = new HashSet<>();
     positionalMinScore = Float.NaN;
@@ -107,39 +215,99 @@ public class FeatureStore
   }
 
   /**
-   * Adds one sequence feature to the store, and returns true, unless the
-   * feature is already contained in the store, in which case this method
-   * returns false. Containment is determined by SequenceFeature.equals()
-   * comparison.
+   * Add a contact feature to the lists that hold them ordered by start (first
+   * contact) and by end (second contact) position, ensuring the lists remain
+   * ordered, and returns true. This method allows duplicate features to be
+   * added, so test before calling to avoid this.
    * 
    * @param feature
+   * @return
    */
-  public boolean addFeature(SequenceFeature feature)
+  protected synchronized boolean addContactFeature(SequenceFeature feature)
   {
-    if (contains(feature))
+    if (contactFeatureStarts == null)
     {
-      return false;
+      contactFeatureStarts = new ArrayList<>();
+      contactFeatureEnds = new ArrayList<>();
     }
 
     /*
-     * keep a record of feature groups
+     * insert into list sorted by start (first contact position):
+     * binary search the sorted list to find the insertion point
      */
-    if (!feature.isNonPositional())
-    {
-      positionalFeatureGroups.add(feature.getFeatureGroup());
-    }
+    contactFeatureStarts.add(
+            findFirstBegin(contactFeatureStarts, feature.begin), feature);
+    /*
+     * insert into list sorted by end (second contact position):
+     * binary search the sorted list to find the insertion point
+     */
+    contactFeatureEnds.add(findFirstEnd(contactFeatureEnds, feature.end),
+            feature);
+
+    return true;
+  }
+
+  /**
+   * Adds one sequence feature to the store, and returns true, unless the
+   * feature is already contained in the store, in which case this method
+   * returns false. Containment is determined by SequenceFeature.equals()
+   * comparison.
+   * 
+   * @param feature
+   */
+
+  @Override
+  public boolean addFeature(SequenceFeature feature)
+  {
+    // if (contains(feature))
+    // {
+    // return false;
+    // }
+
+    // /*
+    // * keep a record of feature groups
+    // */
+    // if (!feature.isNonPositional())
+    // {
+    // positionalFeatureGroups.add(feature.getFeatureGroup());
+    // }
 
     if (feature.isContactFeature())
     {
+      if (containsContactFeature(feature))
+      {
+        return false;
+      }
+      positionalFeatureGroups.add(feature.getFeatureGroup());
+      if (feature.begin > lastContactStart)
+      {
+        lastContactStart = feature.begin;
+      }
       addContactFeature(feature);
     }
     else if (feature.isNonPositional())
     {
+      if (containsNonPositional(feature))
+      {
+        return false;
+      }
+
       addNonPositionalFeature(feature);
     }
     else
     {
-      addNestedFeature(feature);
+      // allow for check with
+      if (checkContainsPositionalFeatureForAdd(feature)
+              || !addPositionalFeature(feature))
+      {
+        return false;
+      }
+      positionalFeatureGroups.add(feature.getFeatureGroup());
+      // addPositionalFeature(feature);
+      if (feature.begin > lastStart)
+      {
+        lastStart = feature.begin;
+      }
     }
 
     /*
@@ -171,50 +339,31 @@ public class FeatureStore
     return true;
   }
 
-  /**
-   * Answers true if this store contains the given feature (testing by
-   * SequenceFeature.equals), else false
-   * 
-   * @param feature
-   * @return
-   */
-  public boolean contains(SequenceFeature feature)
+  private void addFeaturesForGroup(String group,
+          Collection<SequenceFeature> sfs, List<SequenceFeature> result)
   {
-    if (feature.isNonPositional())
+    if (sfs == null)
     {
-      return nonPositionalFeatures == null ? false : nonPositionalFeatures
-              .contains(feature);
+      return;
     }
-
-    if (feature.isContactFeature())
+    for (SequenceFeature sf : sfs)
     {
-      return contactFeatureStarts == null ? false : listContains(
-              contactFeatureStarts, feature);
+      String featureGroup = sf.getFeatureGroup();
+      if (group == null && featureGroup == null
+              || group != null && group.equals(featureGroup))
+      {
+        result.add(sf);
+      }
     }
-
-    return features == null ? false : features
-            .contains(feature);
   }
 
   /**
-   * Answers the 'length' of the feature, counting 0 for non-positional features
-   * and 1 for contact features
+   * Adds one feature to the IntervalStore that can manage nested features
+   * (creating the IntervalStore if necessary)
    * 
-   * @param feature
-   * @return
+   * @return true if added -- allowing for late checking during addition
    */
-  protected static int getFeatureLength(SequenceFeature feature)
-  {
-    if (feature.isNonPositional())
-    {
-      return 0;
-    }
-    if (feature.isContactFeature())
-    {
-      return 1;
-    }
-    return 1 + feature.getEnd() - feature.getBegin();
-  }
+  abstract protected boolean addPositionalFeature(SequenceFeature feature);
 
   /**
    * Adds the feature to the list of non-positional features (with lazy
@@ -240,302 +389,64 @@ public class FeatureStore
   }
 
   /**
-   * Adds one feature to the IntervalStore that can manage nested features
-   * (creating the IntervalStore if necessary)
-   */
-  protected synchronized void addNestedFeature(SequenceFeature feature)
-  {
-    if (features == null)
-    {
-      features = new IntervalStore<>();
-    }
-    features.add(feature);
-  }
-
-  /**
-   * Add a contact feature to the lists that hold them ordered by start (first
-   * contact) and by end (second contact) position, ensuring the lists remain
-   * ordered, and returns true. This method allows duplicate features to be
-   * added, so test before calling to avoid this.
-   * 
-   * @param feature
-   * @return
-   */
-  protected synchronized boolean addContactFeature(SequenceFeature feature)
-  {
-    if (contactFeatureStarts == null)
-    {
-      contactFeatureStarts = new ArrayList<>();
-    }
-    if (contactFeatureEnds == null)
-    {
-      contactFeatureEnds = new ArrayList<>();
-    }
-
-    /*
-     * insert into list sorted by start (first contact position):
-     * binary search the sorted list to find the insertion point
-     */
-    int insertPosition = BinarySearcher.findFirst(contactFeatureStarts,
-            f -> f.getBegin() >= feature.getBegin());
-    contactFeatureStarts.add(insertPosition, feature);
-
-
-    /*
-     * insert into list sorted by end (second contact position):
-     * binary search the sorted list to find the insertion point
-     */
-    insertPosition = BinarySearcher.findFirst(contactFeatureEnds,
-            f -> f.getEnd() >= feature.getEnd());
-    contactFeatureEnds.add(insertPosition, feature);
-
-    return true;
-  }
-
-  /**
-   * Answers true if the list contains the feature, else false. This method is
-   * optimised for the condition that the list is sorted on feature start
-   * position ascending, and will give unreliable results if this does not hold.
+   * Answers true if this store contains the given feature (testing by
+   * SequenceFeature.equals), else false
    * 
-   * @param features
    * @param feature
    * @return
    */
-  protected static boolean listContains(List<SequenceFeature> features,
-          SequenceFeature feature)
-  {
-    if (features == null || feature == null)
-    {
-      return false;
-    }
-
-    /*
-     * locate the first entry in the list which does not precede the feature
-     */
-    // int pos = binarySearch(features,
-    // SearchCriterion.byFeature(feature, RangeComparator.BY_START_POSITION));
-    int pos = BinarySearcher.findFirst(features,
-            val -> val.getBegin() >= feature.getBegin());
-    int len = features.size();
-    while (pos < len)
-    {
-      SequenceFeature sf = features.get(pos);
-      if (sf.getBegin() > feature.getBegin())
-      {
-        return false; // no match found
-      }
-      if (sf.equals(feature))
-      {
-        return true;
-      }
-      pos++;
-    }
-    return false;
-  }
-
-  /**
-   * Returns a (possibly empty) list of features whose extent overlaps the given
-   * range. The returned list is not ordered. Contact features are included if
-   * either of the contact points lies within the range.
-   * 
-   * @param start
-   *          start position of overlap range (inclusive)
-   * @param end
-   *          end position of overlap range (inclusive)
-   * @return
-   */
-  public List<SequenceFeature> findOverlappingFeatures(long start, long end)
+  @Override
+  public boolean contains(SequenceFeature feature)
   {
-    List<SequenceFeature> result = new ArrayList<>();
-
-    findContactFeatures(start, end, result);
-
-    if (features != null)
+    if (feature.isNonPositional())
     {
-      result.addAll(features.findOverlaps(start, end));
-    }
-
-    return result;
-  }
+      return containsNonPositional(feature);
 
-  /**
-   * Adds contact features to the result list where either the second or the
-   * first contact position lies within the target range
-   * 
-   * @param from
-   * @param to
-   * @param result
-   */
-  protected void findContactFeatures(long from, long to,
-          List<SequenceFeature> result)
-  {
-    if (contactFeatureStarts != null)
-    {
-      findContactStartOverlaps(from, to, result);
     }
-    if (contactFeatureEnds != null)
-    {
-      findContactEndOverlaps(from, to, result);
-    }
-  }
 
-  /**
-   * Adds to the result list any contact features whose end (second contact
-   * point), but not start (first contact point), lies in the query from-to
-   * range
-   * 
-   * @param from
-   * @param to
-   * @param result
-   */
-  protected void findContactEndOverlaps(long from, long to,
-          List<SequenceFeature> result)
-  {
-    /*
-     * find the first contact feature (if any) 
-     * whose end point is not before the target range
-     */
-    int index = BinarySearcher.findFirst(contactFeatureEnds,
-            f -> f.getEnd() >= from);
-
-    while (index < contactFeatureEnds.size())
+    if (feature.isContactFeature())
     {
-      SequenceFeature sf = contactFeatureEnds.get(index);
-      if (!sf.isContactFeature())
-      {
-        System.err.println("Error! non-contact feature type "
-                + sf.getType() + " in contact features list");
-        index++;
-        continue;
-      }
+      return containsContactFeature(feature);
 
-      int begin = sf.getBegin();
-      if (begin >= from && begin <= to)
-      {
-        /*
-         * this feature's first contact position lies in the search range
-         * so we don't include it in results a second time
-         */
-        index++;
-        continue;
-      }
-
-      if (sf.getEnd() > to)
-      {
-        /*
-         * this feature (and all following) has end point after the target range
-         */
-        break;
-      }
-
-      /*
-       * feature has end >= from and end <= to
-       * i.e. contact end point lies within overlap search range
-       */
-      result.add(sf);
-      index++;
     }
-  }
 
-  /**
-   * Adds contact features whose start position lies in the from-to range to the
-   * result list
-   * 
-   * @param from
-   * @param to
-   * @param result
-   */
-  protected void findContactStartOverlaps(long from, long to,
-          List<SequenceFeature> result)
-  {
-    int index = BinarySearcher.findFirst(contactFeatureStarts,
-            f -> f.getBegin() >= from);
-
-    while (index < contactFeatureStarts.size())
-    {
-      SequenceFeature sf = contactFeatureStarts.get(index);
-      if (!sf.isContactFeature())
-      {
-        System.err.println("Error! non-contact feature " + sf.toString()
-                + " in contact features list");
-        index++;
-        continue;
-      }
-      if (sf.getBegin() > to)
-      {
-        /*
-         * this feature's start (and all following) follows the target range
-         */
-        break;
-      }
+    return containsPositionalFeature(feature);
 
-      /*
-       * feature has begin >= from and begin <= to
-       * i.e. contact start point lies within overlap search range
-       */
-      result.add(sf);
-      index++;
-    }
   }
 
   /**
-   * Answers a list of all positional features stored, in no guaranteed order
+   * A check that can be overridden if the check is being done during the add
+   * operation itself.
    * 
+   * @param feature
    * @return
    */
-  public List<SequenceFeature> getPositionalFeatures()
+  protected boolean checkContainsPositionalFeatureForAdd(
+          SequenceFeature feature)
   {
-    List<SequenceFeature> result = new ArrayList<>();
-
-    /*
-     * add any contact features - from the list by start position
-     */
-    if (contactFeatureStarts != null)
-    {
-      result.addAll(contactFeatureStarts);
-    }
-
-    /*
-     * add any nested features
-     */
-    if (features != null)
-    {
-      result.addAll(features);
-    }
-
-    return result;
+    return containsPositionalFeature(feature);
   }
 
-  /**
-   * Answers a list of all contact features. If there are none, returns an
-   * immutable empty list.
-   * 
-   * @return
-   */
-  public List<SequenceFeature> getContactFeatures()
+  private boolean containsPositionalFeature(SequenceFeature feature)
   {
-    if (contactFeatureStarts == null)
-    {
-      return Collections.emptyList();
-    }
-    return new ArrayList<>(contactFeatureStarts);
-  }
-
-  /**
-   * Answers a list of all non-positional features. If there are none, returns
-   * an immutable empty list.
-   * 
-   * @return
-   */
-  public List<SequenceFeature> getNonPositionalFeatures()
+    return features == null || feature.begin > lastStart ? false
+            : containsFeature(feature);
+  }
+
+  private boolean containsContactFeature(SequenceFeature feature)
   {
-    if (nonPositionalFeatures == null)
-    {
-      return Collections.emptyList();
-    }
-    return new ArrayList<>(nonPositionalFeatures);
+    return contactFeatureStarts != null && feature.begin <= lastContactStart
+            && listContains(contactFeatureStarts, feature);
+  }
+
+  private boolean containsNonPositional(SequenceFeature feature)
+  {
+    return nonPositionalFeatures == null ? false
+            : nonPositionalFeatures.contains(feature);
   }
 
+  abstract protected boolean containsFeature(SequenceFeature feature);
+
   /**
    * Deletes the given feature from the store, returning true if it was found
    * (and deleted), else false. This method makes no assumption that the feature
@@ -544,6 +455,8 @@ public class FeatureStore
    * 
    * @param sf
    */
+
+  @Override
   public synchronized boolean delete(SequenceFeature sf)
   {
     boolean removed = false;
@@ -561,15 +474,12 @@ public class FeatureStore
       }
     }
 
-    boolean removedNonPositional = false;
-
     /*
      * if not found, try non-positional features
      */
     if (!removed && nonPositionalFeatures != null)
     {
-      removedNonPositional = nonPositionalFeatures.remove(sf);
-      removed = removedNonPositional;
+      removed = nonPositionalFeatures.remove(sf);
     }
 
     /*
@@ -577,7 +487,7 @@ public class FeatureStore
      */
     if (!removed && features != null)
     {
-      removed = features.remove(sf);
+      removed = findAndRemoveNonContactFeature(sf);
     }
 
     if (removed)
@@ -588,100 +498,66 @@ public class FeatureStore
     return removed;
   }
 
-  /**
-   * Rescan all features to recompute any cached values after an entry has been
-   * deleted. This is expected to be an infrequent event, so performance here is
-   * not critical.
-   */
-  protected synchronized void rescanAfterDelete()
-  {
-    positionalFeatureGroups.clear();
-    nonPositionalFeatureGroups.clear();
-    totalExtent = 0;
-    positionalMinScore = Float.NaN;
-    positionalMaxScore = Float.NaN;
-    nonPositionalMinScore = Float.NaN;
-    nonPositionalMaxScore = Float.NaN;
+  abstract protected boolean findAndRemoveNonContactFeature(SequenceFeature sf);
 
-    /*
-     * scan non-positional features for groups and scores
-     */
-    for (SequenceFeature sf : getNonPositionalFeatures())
-    {
-      nonPositionalFeatureGroups.add(sf.getFeatureGroup());
-      float score = sf.getScore();
-      nonPositionalMinScore = min(nonPositionalMinScore, score);
-      nonPositionalMaxScore = max(nonPositionalMaxScore, score);
-    }
+  abstract protected void findContactFeatures(long from, long to,
+          List<SequenceFeature> result);
 
-    /*
-     * scan positional features for groups, scores and extents
-     */
-    for (SequenceFeature sf : getPositionalFeatures())
-    {
-      positionalFeatureGroups.add(sf.getFeatureGroup());
-      float score = sf.getScore();
-      positionalMinScore = min(positionalMinScore, score);
-      positionalMaxScore = max(positionalMaxScore, score);
-      totalExtent += getFeatureLength(sf);
-    }
+  abstract protected int findFirstBegin(List<SequenceFeature> list,
+          long pos);
+
+  abstract protected int findFirstEnd(List<SequenceFeature> list, long pos);
+
+  @Override
+  public List<SequenceFeature> findOverlappingFeatures(long start, long end)
+  {
+    return findOverlappingFeatures(start, end, null);
   }
 
-  /**
-   * A helper method to return the minimum of two floats, where a non-NaN value
-   * is treated as 'less than' a NaN value (unlike Math.min which does the
-   * opposite)
-   * 
-   * @param f1
-   * @param f2
-   */
-  protected static float min(float f1, float f2)
+  @Override
+  public List<SequenceFeature> getContactFeatures()
   {
-    if (Float.isNaN(f1))
-    {
-      return Float.isNaN(f2) ? f1 : f2;
-    }
-    else
-    {
-      return Float.isNaN(f2) ? f1 : Math.min(f1, f2);
-    }
+    return getContactFeatures(new ArrayList<>());
   }
 
   /**
-   * A helper method to return the maximum of two floats, where a non-NaN value
-   * is treated as 'greater than' a NaN value (unlike Math.max which does the
-   * opposite)
+   * Answers a list of all contact features. If there are none, returns an
+   * immutable empty list.
    * 
-   * @param f1
-   * @param f2
+   * @return
    */
-  protected static float max(float f1, float f2)
+
+  @Override
+  public List<SequenceFeature> getContactFeatures(
+          List<SequenceFeature> result)
   {
-    if (Float.isNaN(f1))
-    {
-      return Float.isNaN(f2) ? f1 : f2;
-    }
-    else
+    if (contactFeatureStarts != null)
     {
-      return Float.isNaN(f2) ? f1 : Math.max(f1, f2);
+      result.addAll(contactFeatureStarts);
     }
+    return result;
   }
 
   /**
-   * Answers true if this store has no features, else false
+   * Answers the number of positional (or non-positional) features stored.
+   * Contact features count as 1.
    * 
+   * @param positional
    * @return
    */
-  public boolean isEmpty()
+
+  @Override
+  public int getFeatureCount(boolean positional)
   {
-    boolean hasFeatures = (contactFeatureStarts != null
-            && !contactFeatureStarts
-                    .isEmpty())
-            || (nonPositionalFeatures != null && !nonPositionalFeatures
-                    .isEmpty())
-            || (features != null && features.size() > 0);
+    if (!positional)
+    {
+      return nonPositionalFeatures == null ? 0
+              : nonPositionalFeatures.size();
+    }
+
+    return (contactFeatureStarts == null ? 0 : contactFeatureStarts.size())
+            + features.size();
 
-    return !hasFeatures;
   }
 
   /**
@@ -692,6 +568,8 @@ public class FeatureStore
    * @param positionalFeatures
    * @return
    */
+
+  @Override
   public Set<String> getFeatureGroups(boolean positionalFeatures)
   {
     if (positionalFeatures)
@@ -700,52 +578,68 @@ public class FeatureStore
     }
     else
     {
-      return nonPositionalFeatureGroups == null ? Collections
-              .<String> emptySet() : Collections
-              .unmodifiableSet(nonPositionalFeatureGroups);
+      return nonPositionalFeatureGroups == null
+              ? Collections.<String> emptySet()
+              : Collections.unmodifiableSet(nonPositionalFeatureGroups);
     }
   }
 
+  @Override
+  public Collection<SequenceFeature> getFeatures()
+  {
+    return features;
+  }
+
   /**
-   * Answers the number of positional (or non-positional) features stored.
-   * Contact features count as 1.
+   * Answers a list of all either positional or non-positional features whose
+   * feature group matches the given group (which may be null)
    * 
    * @param positional
+   * @param group
    * @return
    */
-  public int getFeatureCount(boolean positional)
+
+  @Override
+  public List<SequenceFeature> getFeaturesForGroup(boolean positional,
+          String group)
   {
-    if (!positional)
+    List<SequenceFeature> result = new ArrayList<>();
+
+    /*
+     * if we know features don't include the target group, no need
+     * to inspect them for matches
+     */
+    if (positional && !positionalFeatureGroups.contains(group)
+            || !positional && !nonPositionalFeatureGroups.contains(group))
     {
-      return nonPositionalFeatures == null ? 0 : nonPositionalFeatures
-              .size();
+      return result;
     }
 
-    int size = 0;
-
-    if (contactFeatureStarts != null)
+    if (positional)
     {
-      // note a contact feature (start/end) counts as one
-      size += contactFeatureStarts.size();
+      addFeaturesForGroup(group, contactFeatureStarts, result);
+      addFeaturesForGroup(group, features, result);
     }
-
-    if (features != null)
+    else
     {
-      size += features.size();
+      addFeaturesForGroup(group, nonPositionalFeatures, result);
     }
-
-    return size;
+    return result;
   }
 
   /**
-   * Answers the total length of positional features (or zero if there are
-   * none). Contact features contribute a value of 1 to the total.
+   * Answers the maximum score held for positional or non-positional features.
+   * This may be Float.NaN if there are no features, are none has a non-NaN
+   * score.
    * 
+   * @param positional
    * @return
    */
-  public int getTotalFeatureLength()
+
+  @Override
+  public float getMaximumScore(boolean positional)
   {
-    return totalExtent;
+    return positional ? positionalMaxScore : nonPositionalMaxScore;
   }
 
   /**
@@ -756,59 +650,156 @@ public class FeatureStore
    * @param positional
    * @return
    */
+
+  @Override
   public float getMinimumScore(boolean positional)
   {
     return positional ? positionalMinScore : nonPositionalMinScore;
   }
 
+  @Override
+  public List<SequenceFeature> getNonPositionalFeatures()
+  {
+    return getNonPositionalFeatures(new ArrayList<>());
+  }
+
   /**
-   * Answers the maximum score held for positional or non-positional features.
-   * This may be Float.NaN if there are no features, are none has a non-NaN
-   * score.
+   * Answers a list of all non-positional features. If there are none, returns
+   * an immutable empty list.
    * 
-   * @param positional
    * @return
    */
-  public float getMaximumScore(boolean positional)
+
+  @Override
+  public List<SequenceFeature> getNonPositionalFeatures(
+          List<SequenceFeature> result)
   {
-    return positional ? positionalMaxScore : nonPositionalMaxScore;
+    if (nonPositionalFeatures != null)
+    {
+      result.addAll(nonPositionalFeatures);
+    }
+    return result;
+  }
+
+  @Override
+  public List<SequenceFeature> getPositionalFeatures()
+  {
+    return getPositionalFeatures(new ArrayList<>());
   }
 
   /**
-   * Answers a list of all either positional or non-positional features whose
-   * feature group matches the given group (which may be null)
+   * Answers a list of all positional features stored, in no guaranteed order
    * 
-   * @param positional
-   * @param group
    * @return
    */
-  public List<SequenceFeature> getFeaturesForGroup(boolean positional,
-          String group)
+
+  @Override
+  public List<SequenceFeature> getPositionalFeatures(
+          List<SequenceFeature> result)
   {
-    List<SequenceFeature> result = new ArrayList<>();
 
     /*
-     * if we know features don't include the target group, no need
-     * to inspect them for matches
+     * add any contact features - from the list by start position
      */
-    if (positional && !positionalFeatureGroups.contains(group)
-            || !positional && !nonPositionalFeatureGroups.contains(group))
+    if (contactFeatureStarts != null)
     {
-      return result;
+      result.addAll(contactFeatureStarts);
     }
 
-    List<SequenceFeature> sfs = positional ? getPositionalFeatures()
-            : getNonPositionalFeatures();
-    for (SequenceFeature sf : sfs)
+    /*
+     * add any nested features
+     */
+    if (features != null)
     {
-      String featureGroup = sf.getFeatureGroup();
-      if (group == null && featureGroup == null || group != null
-              && group.equals(featureGroup))
+      result.addAll(features);
+    }
+
+    return result;
+  }
+
+  /**
+   * Answers the total length of positional features (or zero if there are
+   * none). Contact features contribute a value of 1 to the total.
+   * 
+   * @return
+   */
+
+  @Override
+  public int getTotalFeatureLength()
+  {
+    return totalExtent;
+  }
+
+  /**
+   * Answers true if this store has no features, else false
+   * 
+   * @return
+   */
+
+  @Override
+  public boolean isEmpty()
+  {
+    boolean hasFeatures = (contactFeatureStarts != null
+            && !contactFeatureStarts.isEmpty())
+            || (nonPositionalFeatures != null
+                    && !nonPositionalFeatures.isEmpty())
+            || features.size() > 0;
+
+    return !hasFeatures;
+  }
+
+  /**
+   * Rescan all features to recompute any cached values after an entry has been
+   * deleted. This is expected to be an infrequent event, so performance here is
+   * not critical.
+   */
+  protected synchronized void rescanAfterDelete()
+  {
+    positionalFeatureGroups.clear();
+    nonPositionalFeatureGroups.clear();
+    totalExtent = 0;
+    positionalMinScore = Float.NaN;
+    positionalMaxScore = Float.NaN;
+    nonPositionalMinScore = Float.NaN;
+    nonPositionalMaxScore = Float.NaN;
+    /*
+     * scan non-positional features for groups and scores
+     */
+    if (nonPositionalFeatures != null)
+    {
+      List<SequenceFeature> list = nonPositionalFeatures;
+      for (int i = 0, n = list.size(); i < n; i++)
       {
-        result.add(sf);
+        SequenceFeature sf = list.get(i);
+        nonPositionalFeatureGroups.add(sf.getFeatureGroup());
+        float score = sf.getScore();
+        nonPositionalMinScore = min(nonPositionalMinScore, score);
+        nonPositionalMaxScore = max(nonPositionalMaxScore, score);
       }
     }
-    return result;
+
+    /*
+     * scan positional features for groups, scores and extents
+     */
+
+    rescanPositional(contactFeatureStarts);
+    rescanPositional(features);
+  }
+
+  private void rescanPositional(Collection<SequenceFeature> sfs)
+  {
+    if (sfs == null)
+    {
+      return;
+    }
+    for (SequenceFeature sf : sfs)
+    {
+      positionalFeatureGroups.add(sf.getFeatureGroup());
+      float score = sf.getScore();
+      positionalMinScore = min(positionalMinScore, score);
+      positionalMaxScore = max(positionalMaxScore, score);
+      totalExtent += getFeatureLength(sf);
+    }
   }
 
   /**
@@ -820,6 +811,8 @@ public class FeatureStore
    * @param shiftBy
    * @return
    */
+
+  @Override
   public synchronized boolean shiftFeatures(int fromPosition, int shiftBy)
   {
     /*
@@ -828,8 +821,10 @@ public class FeatureStore
      * (Although a simple shift of all values would preserve data integrity!)
      */
     boolean modified = false;
-    for (SequenceFeature sf : getPositionalFeatures())
+    List<SequenceFeature> list = getPositionalFeatures();
+    for (int i = 0, n = list.size(); i < n; i++)
     {
+      SequenceFeature sf = list.get(i);
       if (sf.getBegin() >= fromPosition)
       {
         modified = true;
@@ -851,4 +846,5 @@ public class FeatureStore
     }
     return modified;
   }
+
 }
diff --git a/src/jalview/datamodel/features/FeatureStoreI.java b/src/jalview/datamodel/features/FeatureStoreI.java
new file mode 100644 (file)
index 0000000..fb32577
--- /dev/null
@@ -0,0 +1,58 @@
+package jalview.datamodel.features;
+
+import jalview.datamodel.SequenceFeature;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+
+public interface FeatureStoreI
+{
+
+  boolean addFeature(SequenceFeature feature);
+
+  boolean contains(SequenceFeature feature);
+
+  boolean delete(SequenceFeature sf);
+
+  List<SequenceFeature> findOverlappingFeatures(long start, long end);
+
+  List<SequenceFeature> findOverlappingFeatures(long start, long end,
+          List<SequenceFeature> result);
+
+  List<SequenceFeature> getContactFeatures();
+
+  List<SequenceFeature> getContactFeatures(List<SequenceFeature> result);
+
+  int getFeatureCount(boolean positional);
+
+  Set<String> getFeatureGroups(boolean positionalFeatures);
+
+  Collection<SequenceFeature> getFeatures();
+
+  List<SequenceFeature> getFeaturesForGroup(boolean positional,
+          String group);
+
+  float getMaximumScore(boolean positional);
+
+  float getMinimumScore(boolean positional);
+
+  List<SequenceFeature> getNonPositionalFeatures();
+
+  List<SequenceFeature> getNonPositionalFeatures(
+          List<SequenceFeature> result);
+
+  List<SequenceFeature> getPositionalFeatures();
+
+  List<SequenceFeature> getPositionalFeatures(List<SequenceFeature> result);
+
+  int getTotalFeatureLength();
+
+  boolean isEmpty();
+
+  boolean shiftFeatures(int fromPosition, int shiftBy);
+
+  boolean listContains(List<SequenceFeature> features,
+          SequenceFeature feature);
+
+}
diff --git a/src/jalview/datamodel/features/FeatureStoreImpl.java b/src/jalview/datamodel/features/FeatureStoreImpl.java
new file mode 100644 (file)
index 0000000..a90755d
--- /dev/null
@@ -0,0 +1,304 @@
+/*
+ * 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.datamodel.features;
+
+import jalview.datamodel.SequenceFeature;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import intervalstore.api.IntervalStoreI;
+import intervalstore.impl.BinarySearcher;
+
+/**
+ * A data store for a set of sequence features that supports efficient lookup of
+ * features overlapping a given range. Intended for (but not limited to) storage
+ * of features for one sequence and feature type.
+ * 
+ * @author gmcarstairs
+ *
+ */
+public class FeatureStoreImpl extends FeatureStore
+{
+
+  /**
+   * Default constructor uses NCList
+   */
+  public FeatureStoreImpl()
+  {
+    this(true);
+  }
+
+  public FeatureStoreImpl(boolean useNCList)
+  {
+    features = (useNCList ? new intervalstore.impl.IntervalStore<>()
+            : new intervalstore.nonc.IntervalStore<>(false));
+  }
+
+  /**
+   * Add a contact feature to the lists that hold them ordered by start (first
+   * contact) and by end (second contact) position, ensuring the lists remain
+   * ordered, and returns true. This method allows duplicate features to be
+   * added, so test before calling to avoid this.
+   * 
+   * @param feature
+   * @return
+   */
+  @Override
+  protected synchronized boolean addContactFeature(SequenceFeature feature)
+  {
+    if (contactFeatureStarts == null)
+    {
+      contactFeatureStarts = new ArrayList<>();
+      contactFeatureEnds = new ArrayList<>();
+    }
+
+    /*
+     * insert into list sorted by start (first contact position):
+     * binary search the sorted list to find the insertion point
+     */
+    int insertPosition = findFirstBeginStatic(contactFeatureStarts,
+            feature.getBegin());
+    contactFeatureStarts.add(insertPosition, feature);
+
+    /*
+     * insert into list sorted by end (second contact position):
+     * binary search the sorted list to find the insertion point
+     */
+    insertPosition = findFirstEndStatic(contactFeatureEnds,
+            feature.getEnd());
+    contactFeatureEnds.add(insertPosition, feature);
+
+    return true;
+  }
+
+  /**
+   * Adds one feature to the IntervalStore that can manage nested features
+   * (creating the IntervalStore if necessary)
+   */
+  @Override
+  protected synchronized boolean addPositionalFeature(
+          SequenceFeature feature)
+  {
+    return features.add(feature);
+  }
+
+  /**
+   * Adds contact features to the result list where either the second or the
+   * first contact position lies within the target range
+   * 
+   * @param from
+   * @param to
+   * @param result
+   */
+  @Override
+  protected void findContactFeatures(long from, long to,
+          List<SequenceFeature> result)
+  {
+    if (contactFeatureStarts != null)
+    {
+      findContactStartOverlaps(from, to, result);
+      findContactEndOverlaps(from, to, result);
+    }
+  }
+
+  @Override
+  protected boolean containsFeature(SequenceFeature feature)
+  {
+    return features.contains(feature);
+  }
+
+  /**
+   * Adds to the result list any contact features whose end (second contact
+   * point), but not start (first contact point), lies in the query from-to
+   * range
+   * 
+   * @param from
+   * @param to
+   * @param result
+   */
+
+  private void findContactEndOverlaps(long from, long to,
+          List<SequenceFeature> result)
+  {
+    /*
+     * find the first contact feature (if any) 
+     * whose end point is not before the target range
+     */
+    int index = findFirstEndStatic(contactFeatureEnds, from);
+
+    int n = contactFeatureEnds.size();
+    while (index < n)
+    {
+      SequenceFeature sf = contactFeatureEnds.get(index);
+      if (!sf.isContactFeature())
+      {
+        System.err.println("Error! non-contact feature type " + sf.getType()
+                + " in contact features list");
+        index++;
+        continue;
+      }
+
+      int begin = sf.getBegin();
+      if (begin >= from && begin <= to)
+      {
+        /*
+         * this feature's first contact position lies in the search range
+         * so we don't include it in results a second time
+         */
+        index++;
+        continue;
+      }
+
+      if (sf.getEnd() > to)
+      {
+        /*
+         * this feature (and all following) has end point after the target range
+         */
+        break;
+      }
+
+      /*
+       * feature has end >= from and end <= to
+       * i.e. contact end point lies within overlap search range
+       */
+      result.add(sf);
+      index++;
+    }
+  }
+
+  /**
+   * Adds contact features whose start position lies in the from-to range to the
+   * result list
+   * 
+   * @param from
+   * @param to
+   * @param result
+   */
+
+  private void findContactStartOverlaps(long from, long to,
+          List<SequenceFeature> result)
+  {
+    int index = findFirstBegin(contactFeatureStarts, from);
+
+    while (index < contactFeatureStarts.size())
+    {
+      SequenceFeature sf = contactFeatureStarts.get(index);
+      if (!sf.isContactFeature())
+      {
+        System.err.println("Error! non-contact feature " + sf.toString()
+                + " in contact features list");
+        index++;
+        continue;
+      }
+      if (sf.getBegin() > to)
+      {
+        /*
+         * this feature's start (and all following) follows the target range
+         */
+        break;
+      }
+
+      /*
+       * feature has begin >= from and begin <= to
+       * i.e. contact start point lies within overlap search range
+       */
+      result.add(sf);
+      index++;
+    }
+  }
+
+  /**
+   * Returns a (possibly empty) list of features whose extent overlaps the given
+   * range. The returned list is not ordered. Contact features are included if
+   * either of the contact points lies within the range.
+   * 
+   * @param start
+   *          start position of overlap range (inclusive)
+   * @param end
+   *          end position of overlap range (inclusive)
+   * @param result
+   *          ignored
+   * @return
+   */
+
+  @Override
+  public List<SequenceFeature> findOverlappingFeatures(long start, long end,
+          List<SequenceFeature> result)
+  {
+    result = new ArrayList<>();
+    findContactFeatures(start, end, result);
+    findOverlaps(start, end, result);
+    return result;
+  }
+
+  private void findOverlaps(long start, long end,
+          List<SequenceFeature> result)
+  {
+    result.addAll(((IntervalStoreI<SequenceFeature>) features)
+            .findOverlaps(start, end));
+  }
+
+  @Override
+  protected int findFirstBegin(List<SequenceFeature> list, long pos)
+  {
+    return findFirstBeginStatic(list, pos);
+  }
+
+  /**
+   * Possibly a bit faster using a static method.
+   * 
+   * @param list
+   * @param pos
+   * @return
+   */
+  private static int findFirstBeginStatic(List<SequenceFeature> list,
+          long pos)
+  {
+    return BinarySearcher.findFirst(list, f -> f.getBegin() >= pos);
+  }
+
+  @Override
+  protected int findFirstEnd(List<SequenceFeature> list, long pos)
+  {
+    return findFirstEndStatic(list, pos);
+  }
+
+  /**
+   * Possibly a bit faster using a static method.
+   * 
+   * @param list
+   * @param pos
+   * @return
+   */
+  private static int findFirstEndStatic(List<SequenceFeature> list,
+          long pos)
+  {
+    return BinarySearcher.findFirst(list, f -> f.getEnd() >= pos);
+  }
+
+  @Override
+  protected boolean findAndRemoveNonContactFeature(SequenceFeature sf)
+  {
+    return features.remove(sf);
+  }
+
+}
diff --git a/src/jalview/datamodel/features/FeatureStoreJS.java b/src/jalview/datamodel/features/FeatureStoreJS.java
new file mode 100644 (file)
index 0000000..4f49360
--- /dev/null
@@ -0,0 +1,414 @@
+/*
+ * 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.datamodel.features;
+
+import jalview.datamodel.SequenceFeature;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import intervalstore.nonc.IntervalStore;
+
+/**
+ * An adaption of FeatureStore that is efficient and lightweight, accelerating
+ * processing speed in JavaScript.
+ * 
+ * It could be used in Java as well, with significant acceleration, but all this
+ * is so fast anyway that it probably will not be noticed in Java to speed it up
+ * by a factor of two or three. So for now, at least, this implementation is
+ * just in JavaScript. The flag for this is in SequenceFeatures.
+ * 
+ * This implementation uses the IntervalStore developed by Bob Hanson, found at
+ * https://github.com/BobHanson/IntervalStoreJ, forked from the one developed by
+ * Mungo Carstairs at https://github.com/bartongroup/IntervalStoreJ.
+ * 
+ * See the discussion folder at https://github.com/BobHanson/IntervalStoreJ for
+ * details.
+ * 
+ * @author gmcarstairs
+ * @author Bob Hanson 2019.08.03-2019.08.16
+ *
+ */
+public class FeatureStoreJS extends FeatureStore
+{
+  private IntervalStore<SequenceFeature> featureStore;
+
+  public FeatureStoreJS()
+  {
+    // the only reference to features field in this class -- for the superclass
+
+    // linked-list no-NCList IntervalStore with presort
+
+    features = featureStore = new IntervalStore<>(true);
+  }
+
+  /**
+   * Add a contact feature to the lists that hold them ordered by start (first
+   * contact) and by end (second contact) position, ensuring the lists remain
+   * ordered. This method allows duplicate features to be added, so test before
+   * calling to avoid this.
+   * 
+   * @param feature
+   * @return true
+   */
+  @Override
+  protected synchronized boolean addContactFeature(SequenceFeature feature)
+  {
+    if (contactFeatureStarts == null)
+    {
+      contactFeatureStarts = new ArrayList<>();
+      contactFeatureEnds = new ArrayList<>();
+    }
+    contactFeatureStarts.add(
+            findFirstBegin(contactFeatureStarts, feature.begin), feature);
+    contactFeatureEnds.add(findFirstEnd(contactFeatureEnds, feature.end),
+            feature);
+    return true;
+  }
+
+
+  /**
+   * Add a feature to the IntervalStore, not allowing for duplicates.
+   *
+   *
+   * @return false if could not add it (late check for duplicate)
+   */
+  @Override
+  protected synchronized boolean addPositionalFeature(
+          SequenceFeature feature)
+  {
+    return featureStore.add(feature, false);
+  }
+
+  /**
+   * Initial check in FeatureStore.add(feature) that in other implementations
+   * does a containment check, but in this implementation just returns false to
+   * indicate that we should continue. This implementation will do this check as
+   * part of the add() method for greater efficiency (one binary search instead
+   * of two).
+   * 
+   * @return false -- meaning "maybe not contained; continue adding"
+   */
+  @Override
+  protected boolean checkContainsPositionalFeatureForAdd(
+          SequenceFeature feature)
+  {
+    return false;
+  }
+
+  /**
+   * Check to see if a feature (or its equivalent based on
+   * IntervalI.equalsInterval) is already in this store. This method should be
+   * avoided except when necessary, as it involves a binary search with identity
+   * check.
+   * 
+   * @return true if this feature or its equivalent (based on equalsInterval) is
+   *         present already in the collection.
+   */
+  @Override
+  protected boolean containsFeature(SequenceFeature feature)
+  {
+    return featureStore.contains(feature);
+  }
+
+  @Override
+  protected boolean findAndRemoveNonContactFeature(SequenceFeature sf)
+  {
+    return featureStore.remove(sf);
+  }
+
+  /**
+   * Add contact features to the result list where either the second or the
+   * first contact position lies within the target range, inclusively.
+   * 
+   * @param from
+   * @param to
+   * @param result
+   */
+  @Override
+  protected void findContactFeatures(long from, long to,
+          List<SequenceFeature> result)
+  {
+    getContactStartOverlaps(from, to, result);
+    getContactEndOverlaps(from, to, result);
+  }
+
+  /**
+   * Locate the first feature start in a standard ArrayList that is at or after
+   * this position.
+   * 
+   */
+
+  @Override
+  protected int findFirstBegin(List<SequenceFeature> list, long pos)
+  {
+    int matched = list.size();
+    int end = matched - 1;
+    int start = (end < 0 || list.get(end).begin < pos ? matched : 0);
+    while (start <= end)
+    {
+      int mid = (start + end) / 2;
+      if (list.get(mid).begin >= pos)
+      {
+        matched = mid;
+        end = mid - 1;
+      }
+      else
+      {
+        start = mid + 1;
+      }
+    }
+    return matched;
+  }
+
+  /**
+   * Locate the feature end in a standard ArrayList that is after or at this
+   * position.
+   * 
+   */
+
+  @Override
+  protected int findFirstEnd(List<SequenceFeature> list, long pos)
+  {
+    int matched = list.size();
+    int end = matched - 1;
+    int start = 0;
+    while (start <= end)
+    {
+      int mid = (start + end) / 2;
+      if (list.get(mid).end >= pos)
+      {
+        matched = mid;
+        end = mid - 1;
+      }
+      else
+      {
+        start = mid + 1;
+      }
+    }
+    return matched;
+  }
+
+  /**
+   * Returns a (possibly empty) list of features whose extent overlaps the given
+   * range. The returned list is ordered as follows:
+   * 
+   * (1) ContactFeature starts
+   * 
+   * (2) ContactFeature ends (that are not also starts)
+   * 
+   * (3) noncontact SequenceFeatures, in reverse start order
+   * 
+   * (This last reverse order is for efficiency in processing only.)
+   * 
+   * 
+   * 
+   * @param start
+   *          start position of overlap range (inclusive)
+   * @param end
+   *          end position of overlap range (inclusive)
+   * 
+   * @param result
+   *          optional result list; for highest efficiency, provide this
+   *          parameter
+   * @return result same as result parameter, or a new ArrayList if that is null
+   */
+
+  @Override
+  public List<SequenceFeature> findOverlappingFeatures(long start, long end,
+          List<SequenceFeature> result)
+  {
+    if (result == null)
+    {
+      result = new ArrayList<>();
+    }
+    if (contactFeatureStarts != null)
+    {
+      if (start == end)
+      {
+        getContactPointStarts(contactFeatureStarts, start, result);
+        getContactPointEnds(contactFeatureEnds, end, result);
+      }
+      else
+      {
+        findContactFeatures(start, end, result);
+      }
+    }
+    if (featureStore.size() > 0)
+    {
+      featureStore.findOverlaps(start, end, result);
+    }
+    return result;
+  }
+
+  /**
+   * Adds to the result list any contact features having end (second contact
+   * point), but not start (first contact point), in the query from-to range
+   * 
+   * @param from
+   * @param to
+   * @param result
+   */
+
+  private void getContactEndOverlaps(long from, long to,
+          List<SequenceFeature> result)
+  {
+    // find the first contact feature (if any)
+    // with end point not before the target range
+
+    for (int i = findFirstEnd(contactFeatureEnds,
+            from), n = contactFeatureEnds.size(); i < n; i++)
+    {
+      SequenceFeature sf = contactFeatureEnds.get(i);
+      if (sf.begin >= from && sf.begin <= to)
+      {
+        // this feature's first contact position lies in the search range
+        // so we don't include it in results a second time
+        continue;
+      }
+
+      if (sf.end > to)
+      {
+        // this feature (and all following) has end point after the target range
+        break;
+      }
+
+      // feature has end >= from and end <= to
+      // i.e. contact end point lies within overlap search range
+      result.add(sf);
+    }
+  }
+
+  /**
+   * Binary search for contact start or end matching a specific position. This
+   * efficient search was designed specifically for rapid return for the
+   * OverviewPanel. It's implementation sped processing of that panel by 2300%.
+   * 
+   * @param l
+   * @param pos
+   * @param result
+   * @param isStart
+   * 
+   * @author Bob Hanson 2019.07.30
+   */
+  private void getContactPointStarts(List<SequenceFeature> l, long pos,
+          List<SequenceFeature> result)
+  {
+    int low = 0;
+    int high = l.size() - 1;
+    while (low <= high)
+    {
+      int mid = (low + high) >>> 1;
+      SequenceFeature f = l.get(mid);
+      switch (Long.signum(f.begin - pos))
+      {
+      case -1:
+        low = mid + 1;
+        continue;
+      case 1:
+        high = mid - 1;
+        continue;
+      case 0:
+        int m = mid;
+        result.add(f);
+        // could be "5" in 12345556788 ?
+        while (++mid <= high && (f = l.get(mid)) != null && f.begin == pos)
+        {
+          result.add(f);
+        }
+        while (--m >= low && (f = l.get(m)) != null && f.begin == pos)
+        {
+          result.add(f);
+        }
+        return;
+      }
+    }
+  }
+
+  private void getContactPointEnds(List<SequenceFeature> l, long pos,
+          List<SequenceFeature> result)
+  {
+    int low = 0;
+    int high = l.size() - 1;
+    while (low <= high)
+    {
+      int mid = (low + high) >>> 1;
+      SequenceFeature f = l.get(mid);
+      switch (Long.signum(f.end - pos))
+      {
+      case -1:
+        low = mid + 1;
+        continue;
+      case 1:
+        high = mid - 1;
+        continue;
+      case 0:
+        int m = mid;
+        if (f.begin != f.end)
+        {
+          result.add(f);
+        }
+        // could be "5" in 12345556788 ?
+        while (++mid <= high && (f = l.get(mid)) != null
+                && f.end == pos)
+        {
+          if (f.begin != f.end)
+          {
+            result.add(f);
+          }
+        }
+        while (--m >= low && (f = l.get(m)) != null
+                && f.end == pos)
+        {
+          if (f.begin != f.end)
+          {
+            result.add(f);
+          }
+        }
+        return;
+      }
+    }
+  }
+
+  /**
+   * Adds contact features whose start position lies in the from-to range to the
+   * result list
+   * 
+   * @param from
+   * @param to
+   * @param result
+   */
+
+  private void getContactStartOverlaps(long from, long to,
+          List<SequenceFeature> result)
+  {
+    for (int i = findFirstBegin(contactFeatureStarts,
+            from), n = contactFeatureStarts.size(); i < n; i++)
+    {
+      SequenceFeature sf = contactFeatureStarts.get(i);
+      if (sf.begin > to)
+      {
+        break;
+      }
+      result.add(sf);
+    }
+  }
+}
index ba8396a..cb2b8cc 100644 (file)
@@ -23,6 +23,7 @@ package jalview.datamodel.features;
 import jalview.datamodel.SequenceFeature;
 import jalview.io.gff.SequenceOntologyFactory;
 import jalview.io.gff.SequenceOntologyI;
+import jalview.util.Platform;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -50,7 +51,33 @@ public class SequenceFeatures implements SequenceFeaturesI
    * map from feature type to structured store of features for that type
    * null types are permitted (but not a good idea!)
    */
-  private Map<String, FeatureStore> featureStore;
+  private Map<String, FeatureStoreI> featureStore;
+
+  /**
+   * original NCList-based IntervalStore
+   */
+  private final static int INTERVAL_STORE_NCLIST = 0;
+
+  /**
+   * linked-list deferred-sort IntervalStore - experimental only; unused
+   */
+  private final static int INTERVAL_STORE_LINKED_LIST_NO_PRESORT = 1;
+
+  /**
+   * linked-list IntervalStore option for JavaScript
+   */
+  private final static int INTERVAL_STORE_LINKED_LIST = -1;
+
+  /**
+   * mode for Java or JavaScript; can be set differently for testing, but
+   * default is LINKED_LIST for JalviewJS and NCLIST for Java
+   */
+  private final int INTERVAL_STORE_MODE = (
+  // true || //
+  Platform.isJS() ? //
+          INTERVAL_STORE_LINKED_LIST //
+          : INTERVAL_STORE_NCLIST//
+  );
 
   /**
    * Constructor
@@ -62,7 +89,7 @@ public class SequenceFeatures implements SequenceFeaturesI
      * ? wrap as a synchronized map for add and delete operations
      */
     // featureStore = Collections
-    // .synchronizedSortedMap(new TreeMap<String, FeatureStore>());
+    // .synchronizedSortedMap(new TreeMap<String, FeatureStoreI>());
     featureStore = new TreeMap<>();
   }
 
@@ -96,11 +123,25 @@ public class SequenceFeatures implements SequenceFeaturesI
 
     if (featureStore.get(type) == null)
     {
-      featureStore.put(type, new FeatureStore());
+      featureStore.put(type, newFeatureStore());
     }
     return featureStore.get(type).addFeature(sf);
   }
 
+  private FeatureStoreI newFeatureStore()
+  {
+    switch (INTERVAL_STORE_MODE)
+    {
+    default:
+    case INTERVAL_STORE_NCLIST:
+      return new FeatureStoreImpl(true);
+    case INTERVAL_STORE_LINKED_LIST_NO_PRESORT:
+      return new FeatureStoreImpl(false);
+    case INTERVAL_STORE_LINKED_LIST:
+      return new FeatureStoreJS();
+    }
+  }
+
   /**
    * {@inheritDoc}
    */
@@ -109,12 +150,14 @@ public class SequenceFeatures implements SequenceFeaturesI
           String... type)
   {
     List<SequenceFeature> result = new ArrayList<>();
-
-    for (FeatureStore featureSet : varargToTypes(type))
+    for (FeatureStoreI featureSet : varargToTypes(type))
     {
-      result.addAll(featureSet.findOverlappingFeatures(from, to));
+      // System.err.println("SF findFeature " + System.currentTimeMillis()
+      // + " " + from + " " + to + " "
+      // + featureSet.getPositionalFeatures().get(0).type);
+      //
+      result.addAll(featureSet.findOverlappingFeatures(from, to, null));
     }
-
     return result;
   }
 
@@ -153,8 +196,8 @@ public class SequenceFeatures implements SequenceFeaturesI
       return new ArrayList<>();
     }
 
-    return getAllFeatures(featureTypes.toArray(new String[featureTypes
-            .size()]));
+    return getAllFeatures(
+            featureTypes.toArray(new String[featureTypes.size()]));
   }
 
   /**
@@ -165,7 +208,7 @@ public class SequenceFeatures implements SequenceFeaturesI
   {
     int result = 0;
 
-    for (FeatureStore featureSet : varargToTypes(type))
+    for (FeatureStoreI featureSet : varargToTypes(type))
     {
       result += featureSet.getFeatureCount(positional);
     }
@@ -180,7 +223,7 @@ public class SequenceFeatures implements SequenceFeaturesI
   {
     int result = 0;
 
-    for (FeatureStore featureSet : varargToTypes(type))
+    for (FeatureStoreI featureSet : varargToTypes(type))
     {
       result += featureSet.getTotalFeatureLength();
     }
@@ -195,9 +238,9 @@ public class SequenceFeatures implements SequenceFeaturesI
   {
     List<SequenceFeature> result = new ArrayList<>();
 
-    for (FeatureStore featureSet : varargToTypes(type))
+    for (FeatureStoreI featureSet : varargToTypes(type))
     {
-      result.addAll(featureSet.getPositionalFeatures());
+      featureSet.getPositionalFeatures(result);
     }
     return result;
   }
@@ -209,7 +252,7 @@ public class SequenceFeatures implements SequenceFeaturesI
    * @param type
    * @return
    */
-  protected Iterable<FeatureStore> varargToTypes(String... type)
+  protected Iterable<FeatureStoreI> varargToTypes(String... type)
   {
     if (type == null || type.length == 0)
     {
@@ -219,9 +262,9 @@ public class SequenceFeatures implements SequenceFeaturesI
       return featureStore.values();
     }
 
-    List<FeatureStore> types = new ArrayList<>();
+    List<FeatureStoreI> types = new ArrayList<>();
     List<String> args = Arrays.asList(type);
-    for (Entry<String, FeatureStore> featureType : featureStore.entrySet())
+    for (Entry<String, FeatureStoreI> featureType : featureStore.entrySet())
     {
       if (args.contains(featureType.getKey()))
       {
@@ -239,9 +282,9 @@ public class SequenceFeatures implements SequenceFeaturesI
   {
     List<SequenceFeature> result = new ArrayList<>();
 
-    for (FeatureStore featureSet : varargToTypes(type))
+    for (FeatureStoreI featureSet : varargToTypes(type))
     {
-      result.addAll(featureSet.getContactFeatures());
+      featureSet.getContactFeatures(result);
     }
     return result;
   }
@@ -254,9 +297,9 @@ public class SequenceFeatures implements SequenceFeaturesI
   {
     List<SequenceFeature> result = new ArrayList<>();
 
-    for (FeatureStore featureSet : varargToTypes(type))
+    for (FeatureStoreI featureSet : varargToTypes(type))
     {
-      result.addAll(featureSet.getNonPositionalFeatures());
+      featureSet.getNonPositionalFeatures(result);
     }
     return result;
   }
@@ -267,7 +310,7 @@ public class SequenceFeatures implements SequenceFeaturesI
   @Override
   public boolean delete(SequenceFeature sf)
   {
-    for (FeatureStore featureSet : featureStore.values())
+    for (FeatureStoreI featureSet : featureStore.values())
     {
       if (featureSet.delete(sf))
       {
@@ -283,7 +326,7 @@ public class SequenceFeatures implements SequenceFeaturesI
   @Override
   public boolean hasFeatures()
   {
-    for (FeatureStore featureSet : featureStore.values())
+    for (FeatureStoreI featureSet : featureStore.values())
     {
       if (!featureSet.isEmpty())
       {
@@ -302,7 +345,7 @@ public class SequenceFeatures implements SequenceFeaturesI
   {
     Set<String> groups = new HashSet<>();
 
-    for (FeatureStore featureSet : varargToTypes(type))
+    for (FeatureStoreI featureSet : varargToTypes(type))
     {
       groups.addAll(featureSet.getFeatureGroups(positionalFeatures));
     }
@@ -319,10 +362,10 @@ public class SequenceFeatures implements SequenceFeaturesI
   {
     Set<String> result = new HashSet<>();
 
-    for (Entry<String, FeatureStore> featureType : featureStore.entrySet())
+    for (Entry<String, FeatureStoreI> featureType : featureStore.entrySet())
     {
-      Set<String> featureGroups = featureType.getValue().getFeatureGroups(
-              positionalFeatures);
+      Set<String> featureGroups = featureType.getValue()
+              .getFeatureGroups(positionalFeatures);
       for (String group : groups)
       {
         if (featureGroups.contains(group))
@@ -346,7 +389,7 @@ public class SequenceFeatures implements SequenceFeaturesI
   public Set<String> getFeatureTypes(String... soTerm)
   {
     Set<String> types = new HashSet<>();
-    for (Entry<String, FeatureStore> entry : featureStore.entrySet())
+    for (Entry<String, FeatureStoreI> entry : featureStore.entrySet())
     {
       String type = entry.getKey();
       if (!entry.getValue().isEmpty() && isOntologyTerm(type, soTerm))
@@ -373,7 +416,7 @@ public class SequenceFeatures implements SequenceFeaturesI
     {
       return true;
     }
-    SequenceOntologyI so = SequenceOntologyFactory.getInstance();
+    SequenceOntologyI so = SequenceOntologyFactory.getSequenceOntology();
     for (String term : soTerm)
     {
       if (type.equals(term) || so.isA(type, term))
@@ -390,8 +433,9 @@ public class SequenceFeatures implements SequenceFeaturesI
   @Override
   public float getMinimumScore(String type, boolean positional)
   {
-    return featureStore.containsKey(type) ? featureStore.get(type)
-            .getMinimumScore(positional) : Float.NaN;
+    return featureStore.containsKey(type)
+            ? featureStore.get(type).getMinimumScore(positional)
+            : Float.NaN;
   }
 
   /**
@@ -400,8 +444,9 @@ public class SequenceFeatures implements SequenceFeaturesI
   @Override
   public float getMaximumScore(String type, boolean positional)
   {
-    return featureStore.containsKey(type) ? featureStore.get(type)
-            .getMaximumScore(positional) : Float.NaN;
+    return featureStore.containsKey(type)
+            ? featureStore.get(type).getMaximumScore(positional)
+            : Float.NaN;
   }
 
   /**
@@ -433,7 +478,7 @@ public class SequenceFeatures implements SequenceFeaturesI
           String group, String... type)
   {
     List<SequenceFeature> result = new ArrayList<>();
-    for (FeatureStore featureSet : varargToTypes(type))
+    for (FeatureStoreI featureSet : varargToTypes(type))
     {
       if (featureSet.getFeatureGroups(positional).contains(group))
       {
@@ -450,7 +495,7 @@ public class SequenceFeatures implements SequenceFeaturesI
   public boolean shiftFeatures(int fromPosition, int shiftBy)
   {
     boolean modified = false;
-    for (FeatureStore fs : featureStore.values())
+    for (FeatureStoreI fs : featureStore.values())
     {
       modified |= fs.shiftFeatures(fromPosition, shiftBy);
     }
@@ -465,4 +510,63 @@ public class SequenceFeatures implements SequenceFeaturesI
   {
     featureStore.clear();
   }
+
+  /**
+   * Simplified find for features associated with a given position.
+   * 
+   * JavaScript set to not use IntervalI, but easily testable by setting false
+   * to true in javadoc
+   * 
+   * FeatureRenderer has checked already that featureStore does contain type.
+   * 
+   * @author Bob Hanson 2019.07.30
+   */
+  @Override
+  public List<SequenceFeature> findFeatures(int pos, String type,
+          List<SequenceFeature> list)
+  {
+    FeatureStoreI fs = featureStore.get(type);
+    return fs.findOverlappingFeatures(pos, pos, list);
+  }
+
+  // Chrome; developer console closed
+
+  // BH 2019.08.01 useIntervalStore true, redraw false:
+  // Platform: timer mark 13.848 0.367 overviewrender 16000 pixels row:14
+  // Platform: timer mark 15.391 0.39 overviewrender 16000 pixels row:14
+  // Platform: timer mark 16.498 0.39 overviewrender 16000 pixels row:14
+  // Platform: timer mark 17.596 0.401 overviewrender 16000 pixels row:14
+  // Platform: timer mark 18.738 0.363 overviewrender 16000 pixels row:14
+  // Platform: timer mark 19.659 0.358 overviewrender 16000 pixels row:14
+  // Platform: timer mark 20.737 0.359 overviewrender 16000 pixels row:14
+  // Platform: timer mark 21.797 0.391 overviewrender 16000 pixels row:14
+  // Platform: timer mark 22.851 0.361 overviewrender 16000 pixels row:14
+  // Platform: timer mark 24.019 0.395 overviewrender 16000 pixels row:14
+
+  // BH 2019.08.01 useIntervalStore false, redraw false:
+  // Platform: timer mark 19.011 0.181 overviewrender 16000 pixels row:14
+  // Platform: timer mark 20.311 0.183 overviewrender 16000 pixels row:14
+  // Platform: timer mark 21.368 0.175 overviewrender 16000 pixels row:14
+  // Platform: timer mark 22.347 0.178 overviewrender 16000 pixels row:14
+  // Platform: timer mark 23.605 0.216 overviewrender 16000 pixels row:14
+  // Platform: timer mark 24.836 0.191 overviewrender 16000 pixels row:14
+  // Platform: timer mark 26.016 0.181 overviewrender 16000 pixels row:14
+  // Platform: timer mark 27.278 0.178 overviewrender 16000 pixels row:14
+  // Platform: timer mark 28.158 0.181 overviewrender 16000 pixels row:14
+  // Platform: timer mark 29.227 0.196 overviewrender 16000 pixels row:14
+  // Platform: timer mark 30.1 0.171 overviewrender 16000 pixels row:14
+  // Platform: timer mark 31.684 0.196 overviewrender 16000 pixels row:14
+  // Platform: timer mark 32.779 0.18 overviewrender 16000 pixels row:14
+  // Platform: timer mark 52.355 0.185 overviewrender 16000 pixels row:14
+  // Platform: timer mark 53.829 0.186 overviewrender 16000 pixels row:14
+
+  /**
+   * @author Bob Hanson 2019.08.01
+   */
+  @Override
+  public boolean hasFeatures(String type)
+  {
+    return featureStore.containsKey(type);
+  }
+
 }
index ca0283e..deed751 100644 (file)
@@ -228,4 +228,23 @@ public interface SequenceFeaturesI
    * Deletes all positional and non-positional features
    */
   void deleteAll();
+
+  /**
+   * Point-specific parameter return for JavaScript
+   * 
+   * @param pos
+   * @param type
+   * @param result
+   * @return result (JavaScript) or new ArrayList (Java -- see FeatureRender)
+   * @author Bob Hanson 2019.07.30
+   */
+  List<SequenceFeature> findFeatures(int pos, String type, List<SequenceFeature> result);
+
+  /**
+   * @author Bob Hanson 2019.08.01
+   * 
+   * @param type
+   * @return true if this type is in featureStore
+   */
+  boolean hasFeatures(String type);
 }
index e01ad17..bdfd208 100644 (file)
@@ -23,6 +23,7 @@ package jalview.ext.ensembl;
 import jalview.datamodel.SequenceFeature;
 import jalview.datamodel.SequenceI;
 import jalview.io.gff.SequenceOntologyI;
+import jalview.util.Platform;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -44,9 +45,7 @@ public class EnsemblCdna extends EnsemblSeqProxy
    * 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,}$)");
-
+  private static Regex ACCESSION_REGEX;
   /*
    * fetch exon features on genomic sequence (to identify the cdna regions)
    * and cds and variation features (to retain)
@@ -88,6 +87,16 @@ public class EnsemblCdna extends EnsemblSeqProxy
   @Override
   public Regex getAccessionValidator()
   {
+    if (ACCESSION_REGEX == null)
+    {
+      /*
+       * accepts ENSG/T/E/P with 11 digits
+       * or ENSMUSP or similar for other species
+       * or CCDSnnnnn.nn with at least 3 digits
+       */
+      ACCESSION_REGEX = Platform.newRegex(
+              "(ENS([A-Z]{3}|)[TG][0-9]{11}$)" + "|" + "(CCDS[0-9.]{3,}$)", null);
+    }
     return ACCESSION_REGEX;
   }
 
index 8f13d99..bf37265 100644 (file)
@@ -93,7 +93,7 @@ public class EnsemblCds extends EnsemblSeqProxy
   @Override
   protected boolean retainFeature(SequenceFeature sf, String accessionId)
   {
-    if (SequenceOntologyFactory.getInstance().isA(sf.getType(),
+    if (SequenceOntologyFactory.getSequenceOntology().isA(sf.getType(),
             SequenceOntologyI.CDS))
     {
       return false;
index 0d73a47..63a6a6c 100644 (file)
@@ -56,7 +56,7 @@ public class EnsemblGene extends EnsemblSeqProxy
    * 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 Regex ACCESSION_REGEX;
 
   private static final EnsemblFeatureType[] FEATURES_TO_FETCH = {
       EnsemblFeatureType.gene, EnsemblFeatureType.transcript,
@@ -577,7 +577,7 @@ public class EnsemblGene extends EnsemblSeqProxy
   @Override
   protected boolean retainFeature(SequenceFeature sf, String accessionId)
   {
-    SequenceOntologyI so = SequenceOntologyFactory.getInstance();
+    SequenceOntologyI so = SequenceOntologyFactory.getSequenceOntology();
     String type = sf.getType();
     if (so.isA(type, SequenceOntologyI.GENE))
     {
@@ -606,6 +606,10 @@ public class EnsemblGene extends EnsemblSeqProxy
   @Override
   public Regex getAccessionValidator()
   {
+    if (ACCESSION_REGEX == null)
+    {
+      ACCESSION_REGEX = Platform.newRegex(".*", null);
+    }
     return ACCESSION_REGEX;
   }
 
@@ -624,7 +628,7 @@ public class EnsemblGene extends EnsemblSeqProxy
   {
     return new FeatureSettingsAdapter()
     {
-      SequenceOntologyI so = SequenceOntologyFactory.getInstance();
+      SequenceOntologyI so = SequenceOntologyFactory.getSequenceOntology();
 
       @Override
       public boolean isFeatureDisplayed(String type)
index 97a8e74..a59a64d 100644 (file)
@@ -1,10 +1,10 @@
 package jalview.ext.ensembl;
 
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.DBRefSource;
-import jalview.util.JSONUtils;
 
-import java.io.BufferedReader;
 import java.io.IOException;
 import java.net.MalformedURLException;
 import java.net.URL;
@@ -16,9 +16,48 @@ import java.util.Set;
 
 import org.json.simple.parser.ParseException;
 
-public class EnsemblInfo extends EnsemblRestClient
+public class EnsemblInfo extends EnsemblRestClient implements ApplicationSingletonI
 {
 
+  /**
+   * On first request only, populate the lookup map by fetching the list of
+   * divisions known to EnsemblGenomes
+   * 
+   */
+  private static EnsemblInfo getInstance()
+  {
+    return (EnsemblInfo) ApplicationSingletonProvider.getInstance(EnsemblInfo.class);
+  }
+
+  private EnsemblInfo()
+  {
+    // use getInstance()
+
+    /*
+     * for convenience, pre-fill ensembl.org as the domain for "ENSEMBL"
+     */
+    divisions.put(DBRefSource.ENSEMBL.toUpperCase(), ensemblDomain);
+    try
+    {
+      @SuppressWarnings("unchecked")
+      Iterator<Object> rvals = (Iterator<Object>) getJSON(
+              getDivisionsUrl(ensemblGenomesDomain), null, -1,
+              MODE_ITERATOR, null);
+      if (rvals == null)
+      {
+        return;
+      }
+      while (rvals.hasNext())
+      {
+        String division = rvals.next().toString();
+        divisions.put(division.toUpperCase(), ensemblGenomesDomain);
+      }
+    } catch (IOException | ParseException | NumberFormatException e)
+    {
+      // ignore
+    }
+  }
+
   /*
    * cached results of REST /info/divisions service, currently
    * <pre>
@@ -34,7 +73,7 @@ public class EnsemblInfo extends EnsemblRestClient
    * The values for EnsemblGenomes are retrieved by a REST call, that for
    * Ensembl is added programmatically for convenience of lookup
    */
-  private static Map<String, String> divisions;
+  private Map<String, String> divisions = new HashMap<>();
 
   @Override
   public String getDbName()
@@ -68,42 +107,9 @@ public class EnsemblInfo extends EnsemblRestClient
    * @param division
    * @return
    */
-  public String getDomain(String division)
+  public static String getDomain(String division)
   {
-    if (divisions == null)
-    {
-      fetchDivisions();
-    }
-    return divisions.get(division.toUpperCase());
-  }
-
-  /**
-   * On first request only, populate the lookup map by fetching the list of
-   * divisions known to EnsemblGenomes.
-   */
-  void fetchDivisions()
-  {
-    divisions = new HashMap<>();
-
-    /*
-     * for convenience, pre-fill ensembl.org as the domain for "ENSEMBL"
-     */
-    divisions.put(DBRefSource.ENSEMBL.toUpperCase(), ensemblDomain);
-    try
-    {
-      @SuppressWarnings("unchecked")
-         Iterator<Object> rvals = (Iterator<Object>) getJSON(getDivisionsUrl(ensemblGenomesDomain), null, -1, MODE_ITERATOR, null);
-      if (rvals == null)
-         return;
-      while (rvals.hasNext())
-      {
-        String division = rvals.next().toString();
-        divisions.put(division.toUpperCase(), ensemblGenomesDomain);
-      }
-    } catch (IOException | ParseException | NumberFormatException e)
-    {
-      // ignore
-    }
+    return getInstance().divisions.get(division.toUpperCase());
   }
 
   /**
@@ -124,12 +130,8 @@ public class EnsemblInfo extends EnsemblRestClient
    * 
    * @return
    */
-  public Set<String> getDivisions() {
-    if (divisions == null)
-    {
-      fetchDivisions();
-    }
-
-    return divisions.keySet();
+  public static Set<String> getDivisions()
+  {
+    return getInstance().divisions.keySet();
   }
 }
index e9f1af1..9789819 100644 (file)
@@ -3,10 +3,8 @@ package jalview.ext.ensembl;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.DBRefSource;
 import jalview.datamodel.GeneLociI;
-import jalview.util.JSONUtils;
 import jalview.util.MapList;
 
-import java.io.BufferedReader;
 import java.io.IOException;
 import java.net.MalformedURLException;
 import java.net.URL;
@@ -18,18 +16,6 @@ import java.util.Map;
 
 import org.json.simple.parser.ParseException;
 
-/**
- * A client for the Ensembl REST service /map endpoint, to convert from
- * coordinates of one genome assembly to another.
- * <p>
- * Note that species and assembly identifiers passed to this class must be valid
- * in Ensembl. They are not case sensitive.
- * 
- * @author gmcarstairs
- * @see https://rest.ensembl.org/documentation/info/assembly_map
- * @see https://rest.ensembl.org/info/assembly/human?content-type=text/xml
- * @see https://rest.ensembl.org/info/species?content-type=text/xml
- */
 public class EnsemblMap extends EnsemblRestClient
 {
   private static final String MAPPED = "mapped";
@@ -166,7 +152,9 @@ public class EnsemblMap extends EnsemblRestClient
     {
       Iterator<Object> rvals = (Iterator<Object>) getJSON(url, null, -1, MODE_ITERATOR, MAPPINGS);
       if (rvals == null)
-         return null;
+      {
+        return null;
+      }
       while (rvals.hasNext())
       {
         // todo check for "mapped"
@@ -233,7 +221,7 @@ public class EnsemblMap extends EnsemblRestClient
     URL url = null;
     try
     {
-      String domain = new EnsemblInfo().getDomain(division);
+      String domain = EnsemblInfo.getDomain(division);
       if (domain != null)
       {
         url = getIdMapUrl(domain, accession, start, end, cdsOrCdna);
@@ -298,7 +286,9 @@ GeneLociI parseIdMappingResponse(URL url, String accession,
     {
       Iterator<Object> rvals = (Iterator<Object>) getJSON(url, null, -1, MODE_ITERATOR, MAPPINGS);
       if (rvals == null)
-         return null;
+      {
+        return null;
+      }
       String assembly = null;
       String chromosome = null;
       int fromEnd = 0;
index 0280f16..f586ed6 100644 (file)
@@ -23,6 +23,7 @@ package jalview.ext.ensembl;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.SequenceFeature;
 import jalview.datamodel.SequenceI;
+import jalview.util.Platform;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -42,8 +43,7 @@ public class EnsemblProtein extends EnsemblSeqProxy
    * 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,}$)");
+  private static Regex ACCESSION_REGEX;
 
   /**
    * Default constructor (to use rest.ensembl.org)
@@ -119,6 +119,11 @@ public class EnsemblProtein extends EnsemblSeqProxy
   @Override
   public Regex getAccessionValidator()
   {
+    if (ACCESSION_REGEX == null)
+    {
+      ACCESSION_REGEX = Platform.newRegex(
+              "(ENS([A-Z]{3}|)P[0-9]{11}$)" + "|" + "(CCDS[0-9.]{3,}$)", null);
+    }
     return ACCESSION_REGEX;
   }
 
index bf151bf..6d4bc79 100644 (file)
@@ -75,7 +75,7 @@ abstract class EnsemblRestClient extends EnsemblSequenceFetcher
 
   private static final String REST_CHANGE_LOG = "https://github.com/Ensembl/ensembl-rest/wiki/Change-log";
 
-  private static Map<String, EnsemblData> domainData;
+  private static final Map<String, EnsemblData> domainData;
 
   private final static long AVAILABILITY_RETEST_INTERVAL = 10000L; // 10 seconds
 
index 2e20665..bdaef0b 100644 (file)
@@ -423,7 +423,9 @@ public abstract class EnsemblSeqProxy extends EnsemblRestClient
 
     List<SequenceI> seqs = parseSequenceJson(ids);
     if (seqs == null)
-       return alignment;
+    {
+      return alignment;
+    }
 
     if (seqs.isEmpty())
     {
@@ -490,7 +492,9 @@ public abstract class EnsemblSeqProxy extends EnsemblRestClient
        Platform.timeCheck("ENS seqproxy", Platform.TIME_MARK);
       Map<String, Object> val = (Map<String, Object>) getJSON(null, ids, -1, MODE_MAP, null);
       if (val == null)
-         return null;
+      {
+        return null;
+      }
       Object s = val.get("desc");
       String desc = s == null ? null : s.toString();
       s = val.get("id");
@@ -736,7 +740,7 @@ public abstract class EnsemblSeqProxy extends EnsemblRestClient
        * for sequence_variant on reverse strand, have to convert the allele
        * values to their complements
        */
-      if (!forwardStrand && SequenceOntologyFactory.getInstance()
+      if (!forwardStrand && SequenceOntologyFactory.getSequenceOntology()
               .isA(sf.getType(), SequenceOntologyI.SEQUENCE_VARIANT))
       {
         reverseComplementAlleles(copy);
@@ -984,7 +988,7 @@ public abstract class EnsemblSeqProxy extends EnsemblRestClient
   public static boolean isTranscript(String featureType)
   {
     return SequenceOntologyI.NMD_TRANSCRIPT_VARIANT.equals(featureType)
-            || SequenceOntologyFactory.getInstance().isA(featureType,
+            || SequenceOntologyFactory.getSequenceOntology().isA(featureType,
                     SequenceOntologyI.TRANSCRIPT);
   }
 }
index 7454eb6..21f9f7e 100644 (file)
@@ -23,6 +23,7 @@ package jalview.ext.ensembl;
 import jalview.analysis.AlignmentUtils;
 import jalview.bin.Cache;
 import jalview.datamodel.DBRefSource;
+import jalview.util.Platform;
 import jalview.ws.seqfetcher.DbSourceProxyImpl;
 
 import com.stevesoft.pat.Regex;
@@ -45,14 +46,7 @@ abstract class EnsemblSequenceFetcher extends DbSourceProxyImpl
   // ensemblgenomes REST service merged to ensembl 9th April 2019
   protected static final String DEFAULT_ENSEMBL_GENOMES_BASEURL = DEFAULT_ENSEMBL_BASEURL;
 
-  /*
-   * 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,}$)");
+  private static Regex ACCESSION_REGEX;
 
   protected final String ensemblGenomesDomain;
 
@@ -121,6 +115,17 @@ abstract class EnsemblSequenceFetcher extends DbSourceProxyImpl
   @Override
   public Regex getAccessionValidator()
   {
+    if (ACCESSION_REGEX == null)
+    {
+      /*
+       * accepts ENSG/T/E/P with 11 digits
+       * or ENSMUSP or similar for other species
+       * or CCDSnnnnn.nn with at least 3 digits
+       */
+      ACCESSION_REGEX = Platform
+              .newRegex("(ENS([A-Z]{3}|)[GTEP]{1}[0-9]{11}$)" + "|"
+                      + "(CCDS[0-9.]{3,}$)", null);
+    }
     return ACCESSION_REGEX;
   }
 
index 04525f0..14c057f 100644 (file)
@@ -1,14 +1,14 @@
 package jalview.ext.htsjdk;
 
-import java.io.Closeable;
-import java.io.File;
-import java.io.IOException;
-
 import htsjdk.samtools.util.CloseableIterator;
 import htsjdk.variant.variantcontext.VariantContext;
 import htsjdk.variant.vcf.VCFFileReader;
 import htsjdk.variant.vcf.VCFHeader;
 
+import java.io.Closeable;
+import java.io.File;
+import java.io.IOException;
+
 /**
  * A thin wrapper for htsjdk classes to read either plain, or compressed, or
  * compressed and indexed VCF files
@@ -116,7 +116,7 @@ public class VCFReader implements Closeable, Iterable<VariantContext>
   {
     final CloseableIterator<VariantContext> it = reader.iterator();
     
-    return new CloseableIterator()
+    return new CloseableIterator<VariantContext>()
     {
       boolean atEnd = false;
 
@@ -145,7 +145,7 @@ public class VCFReader implements Closeable, Iterable<VariantContext>
           int vend = variant.getEnd();
           // todo what is the undeprecated way to get
           // the chromosome for the variant?
-          if (chrom.equals(variant.getContig()) && (vstart <= end)
+          if (chrom.equals(variant.getChr()) && (vstart <= end)
                   && (vend >= start))
           {
             return variant;
index 4698e4d..fa31fd9 100644 (file)
@@ -44,6 +44,7 @@ import java.awt.event.ComponentEvent;
 import java.awt.event.ComponentListener;
 import java.io.File;
 import java.net.URL;
+import java.security.AccessControlException;
 import java.util.ArrayList;
 import java.util.BitSet;
 import java.util.Hashtable;
@@ -618,6 +619,74 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
    */
   private int _modelFileNameMap[];
 
+  // ////////////////////////////////
+  // /StructureListener
+  // @Override
+  public synchronized String[] getPdbFilex()
+  {
+    if (viewer == null)
+    {
+      return new String[0];
+    }
+    if (modelFileNames == null)
+    {
+      List<String> mset = new ArrayList<>();
+      _modelFileNameMap = new int[viewer.ms.mc];
+      String m = viewer.ms.getModelFileName(0);
+      if (m != null)
+      {
+        String filePath = m;
+        try
+        {
+          filePath = new File(m).getAbsolutePath();
+        } catch (AccessControlException x)
+        {
+          // usually not allowed to do this in applet
+          System.err.println(
+                  "jmolBinding: Using local file string from Jmol: " + m);
+        }
+        if (filePath.indexOf("/file:") != -1)
+        {
+          // applet path with docroot - discard as format won't match pdbfile
+          filePath = m;
+        }
+        mset.add(filePath);
+        _modelFileNameMap[0] = 0; // filename index for first model is always 0.
+      }
+      int j = 1;
+      for (int i = 1; i < viewer.ms.mc; i++)
+      {
+        m = viewer.ms.getModelFileName(i);
+        String filePath = m;
+        if (m != null)
+        {
+          try
+          {
+            filePath = new File(m).getAbsolutePath();
+          } catch (AccessControlException x)
+          {
+            // usually not allowed to do this in applet, so keep raw handle
+            // System.err.println("jmolBinding: Using local file string from
+            // Jmol: "+m);
+          }
+        }
+
+        /*
+         * add this model unless it is read from a structure file we have
+         * already seen (example: 2MJW is an NMR structure with 10 models)
+         */
+        if (!mset.contains(filePath))
+        {
+          mset.add(filePath);
+          _modelFileNameMap[j] = i; // record the model index for the filename
+          j++;
+        }
+      }
+      modelFileNames = mset.toArray(new String[mset.size()]);
+    }
+    return modelFileNames;
+  }
+
   @Override
   public synchronized String[] getStructureFiles()
   {
@@ -812,7 +881,7 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
       try
       {
         // recover PDB filename for the model hovered over.
-        int mnumber = Integer.valueOf(mdlId).intValue() - 1;
+        int mnumber = new Integer(mdlId).intValue() - 1;
         if (_modelFileNameMap != null)
         {
           int _mp = _modelFileNameMap.length - 1;
index 3c443de..3b7044b 100644 (file)
@@ -137,13 +137,13 @@ public class Annotate3D
   public static Iterator<Reader> getRNAMLForPDBFileAsString(String pdbfile)
           throws Exception
   {
-    List<NameValuePair> vals = new ArrayList<>();
+    List<NameValuePair> vals = new ArrayList<NameValuePair>();
     vals.add(new BasicNameValuePair("tool", "rnaview"));
     vals.add(new BasicNameValuePair("data", pdbfile));
     vals.add(new BasicNameValuePair("output", "rnaml"));
     // return processJsonResponseFor(HttpClientUtils.doHttpUrlPost(twoDtoolsURL,
     // vals));
-    ArrayList<Reader> readers = new ArrayList<>();
+    ArrayList<Reader> readers = new ArrayList<Reader>();
     final BufferedReader postResponse = HttpClientUtils
             .doHttpUrlPost(twoDtoolsURL, vals, 0, 0);
     readers.add(postResponse);
@@ -159,23 +159,90 @@ public class Annotate3D
   public static Iterator<Reader> processJsonResponseFor(Reader respons)
           throws Exception
   {
+         // BH 2019 never called?
     try
     {
       @SuppressWarnings("unchecked")
-       List<Object> responses = (List<Object>) JSONUtils.parse(respons);
-      return new RvalsIterator(responses);
+       final Iterator<Object> rvals = ((List<Object>) JSONUtils.parse(respons)).iterator();
+      return new Iterator<Reader>()
+      {
+        @Override
+        public boolean hasNext()
+        {
+          return rvals.hasNext();
+        }
+
+        @SuppressWarnings("unchecked")
+               @Override
+        public Reader next()
+        {
+          Map<String, Object> val = (Map<String, Object>) rvals.next();
+
+          Object sval = null;
+          try
+          {
+            sval = val.get("2D");
+          } catch (Exception x)
+          {
+            x.printStackTrace();
+          }
+          ;
+          if (sval == null)
+          {
+            System.err.println(
+                    "DEVELOPER WARNING: Annotate3d didn't return a '2D' tag in its response. Consider checking output of server. Response was :"
+                            + val.toString());
+
+            sval = "";
+          }
+          return new StringReader(sval.toString());
+
+        }
+
+        @Override
+        public void remove()
+        {
+          throw new Error(
+                  MessageManager.getString("error.not_implemented_remove"));
+
+        }
+
+        @Override
+        protected Object clone() throws CloneNotSupportedException
+        {
+          throw new CloneNotSupportedException(
+                  MessageManager.getString("error.not_implemented_clone"));
+        }
+
+        @Override
+        public boolean equals(Object obj)
+        {
+          return super.equals(obj);
+        }
+
+        @Override
+        protected void finalize() throws Throwable
+        {
+          while (rvals.hasNext())
+          {
+            rvals.next();
+          }
+          super.finalize();
+        }
+      };
     } catch (Exception foo)
     {
       throw new Exception(MessageManager.getString(
               "exception.couldnt_parse_responde_from_annotated3d_server"),
               foo);
     }
+
   }
 
   public static Iterator<Reader> getRNAMLForPDBId(String pdbid)
           throws Exception
   {
-    List<NameValuePair> vals = new ArrayList<>();
+    List<NameValuePair> vals = new ArrayList<NameValuePair>();
     vals.add(new BasicNameValuePair("tool", "rnaview"));
     vals.add(new BasicNameValuePair("pdbid", pdbid));
     vals.add(new BasicNameValuePair("output", "rnaml"));
@@ -183,70 +250,9 @@ public class Annotate3D
             + pdbid + "&output=rnaml");
     // return processJsonResponseFor(new
     // InputStreamReader(geturl.openStream()));
-    ArrayList<Reader> readers = new ArrayList<>();
+    ArrayList<Reader> readers = new ArrayList<Reader>();
     readers.add(new InputStreamReader(geturl.openStream()));
     return readers.iterator();
   }
 
 }
-
-class RvalsIterator implements Iterator<Reader>, AutoCloseable
-{
-  private Iterator<Object> rvals;
-
-  protected RvalsIterator(List<Object> responses)
-  {
-    this.rvals = responses.iterator();
-  }
-
-  @Override
-  public boolean hasNext()
-  {
-    return rvals.hasNext();
-  }
-
-  @Override
-  public Reader next()
-  {
-    Map<String, Object> val = (Map<String, Object>) rvals.next();
-
-    Object sval = null;
-    try
-    {
-      sval = val.get("2D");
-    } catch (Exception x)
-    {
-      x.printStackTrace();
-    }
-    if (sval == null)
-    {
-      System.err.println(
-              "DEVELOPER WARNING: Annotate3d didn't return a '2D' tag in its response. Consider checking output of server. Response was :"
-                      + val.toString());
-
-      sval = "";
-    }
-    return new StringReader(sval.toString());
-  }
-
-  @Override
-  public void remove()
-  {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  protected Object clone() throws CloneNotSupportedException
-  {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public void close()
-  {
-    while (rvals.hasNext())
-    {
-      rvals.next();
-    }
-  }
-}
index 0d631e6..5a86fa1 100644 (file)
@@ -82,10 +82,10 @@ public class SequenceOntology implements SequenceOntologyI
    */
   public SequenceOntology()
   {
-    termsFound = new ArrayList<String>();
-    termsNotFound = new ArrayList<String>();
-    termsByDescription = new HashMap<String, Term>();
-    termIsA = new HashMap<Term, List<Term>>();
+    termsFound = new ArrayList<>();
+    termsNotFound = new ArrayList<>();
+    termsByDescription = new HashMap<>();
+    termIsA = new HashMap<>();
 
     loadOntologyZipFile("so-xp-simple.obo");
   }
@@ -404,7 +404,7 @@ public class SequenceOntology implements SequenceOntologyI
    */
   protected synchronized void findParents(Term childTerm)
   {
-    List<Term> result = new ArrayList<Term>();
+    List<Term> result = new ArrayList<>();
     for (Triple triple : ontology.getTriples(childTerm, null, isA))
     {
       Term parent = triple.getObject();
index 2d9eeb6..52c48a1 100644 (file)
@@ -24,6 +24,7 @@ package jalview.fts.core;
 import jalview.bin.Cache;
 import jalview.datamodel.SequenceI;
 import jalview.fts.api.FTSDataColumnI;
+import jalview.gui.Preferences;
 
 import java.util.Collection;
 
@@ -46,7 +47,7 @@ public class FTSRestRequest
   private boolean allowEmptySequence;
 
   private boolean allowUnpublishedEntries = Cache
-          .getDefault("ALLOW_UNPUBLISHED_PDB_QUERYING", false);
+          .getDefault(Preferences.ALLOW_UNPUBLISHED_PDB_QUERYING, false);
 
   private boolean facet;
 
index cd3e5c9..87d640b 100644 (file)
@@ -20,6 +20,8 @@
  */
 package jalview.fts.service.pdb;
 
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
 import jalview.datamodel.SequenceI;
 import jalview.fts.api.FTSData;
 import jalview.fts.api.FTSDataColumnI;
@@ -53,15 +55,19 @@ import com.sun.jersey.api.client.config.DefaultClientConfig;
  * 
  * @author tcnofoegbu
  */
-public class PDBFTSRestClient extends FTSRestClient
+public class PDBFTSRestClient extends FTSRestClient implements ApplicationSingletonI
 {
-
-  private static FTSRestClientI instance = null;
-
   public static final String PDB_SEARCH_ENDPOINT = "https://www.ebi.ac.uk/pdbe/search/pdb/select?";
 
-  protected PDBFTSRestClient()
+  public static FTSRestClientI getInstance()
+  {
+    return (FTSRestClientI) ApplicationSingletonProvider
+            .getInstance(PDBFTSRestClient.class);
+  }
+
+  private PDBFTSRestClient()
   {
+    // singleton -- use getInstance()
   }
 
   /**
@@ -459,15 +465,6 @@ public static String parseJsonExceptionString(String jsonErrorResponse)
     return "/fts/pdb_data_columns.txt";
   }
 
-  public static FTSRestClientI getInstance()
-  {
-    if (instance == null)
-    {
-      instance = new PDBFTSRestClient();
-    }
-    return instance;
-  }
-
   private Collection<FTSDataColumnI> allDefaultDisplayedStructureDataColumns;
 
   public Collection<FTSDataColumnI> getAllDefaultDisplayedStructureDataColumns()
index 3f0b8a4..094052b 100644 (file)
@@ -21,6 +21,8 @@
 
 package jalview.fts.service.uniprot;
 
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
 import jalview.bin.Cache;
 import jalview.fts.api.FTSData;
 import jalview.fts.api.FTSDataColumnI;
@@ -28,6 +30,7 @@ import jalview.fts.api.FTSRestClientI;
 import jalview.fts.core.FTSRestClient;
 import jalview.fts.core.FTSRestRequest;
 import jalview.fts.core.FTSRestResponse;
+import jalview.gui.Preferences;
 import jalview.util.MessageManager;
 import jalview.util.Platform;
 
@@ -44,25 +47,31 @@ import com.sun.jersey.api.client.WebResource;
 import com.sun.jersey.api.client.config.DefaultClientConfig;
 
 public class UniProtFTSRestClient extends FTSRestClient
+        implements ApplicationSingletonI
 {
-  private static final String DEFAULT_UNIPROT_DOMAIN = "https://www.uniprot.org";
 
-  static
+  public static FTSRestClientI getInstance()
   {
-    Platform.addJ2SDirectDatabaseCall(DEFAULT_UNIPROT_DOMAIN);
+    return (FTSRestClientI) ApplicationSingletonProvider
+            .getInstance(UniProtFTSRestClient.class);
+  }
+
+  private UniProtFTSRestClient()
+  {
+    // singleton -- use getInstance()
+
+    uniprotSearchEndpoint = Cache.getDefault(Preferences.UNIPROT_DOMAIN,
+            DEFAULT_UNIPROT_DOMAIN) + "/uniprot/";    
   }
 
-  private static FTSRestClientI instance = null;
+  private static final String DEFAULT_UNIPROT_DOMAIN = "https://www.uniprot.org";
 
   public final String uniprotSearchEndpoint;
 
-  public UniProtFTSRestClient()
+  static
   {
-    super();
-    uniprotSearchEndpoint = Cache.getDefault("UNIPROT_DOMAIN",
-            DEFAULT_UNIPROT_DOMAIN) + "/uniprot/";    
+    Platform.addJ2SDirectDatabaseCall(DEFAULT_UNIPROT_DOMAIN);
   }
-
   @SuppressWarnings("unchecked")
   @Override
   public FTSRestResponse executeRequest(FTSRestRequest uniprotRestRequest)
@@ -347,15 +356,6 @@ public class UniProtFTSRestClient extends FTSRestClient
     };
   }
 
-  public static FTSRestClientI getInstance()
-  {
-    if (instance == null)
-    {
-      instance = new UniProtFTSRestClient();
-    }
-    return instance;
-  }
-
   @Override
   public String getColumnDataConfigFileName()
   {
diff --git a/src/jalview/gui/APQHandlers.java b/src/jalview/gui/APQHandlers.java
deleted file mode 100644 (file)
index 5ebd47f..0000000
+++ /dev/null
@@ -1,151 +0,0 @@
-package jalview.gui;
-
-import jalview.util.MessageManager;
-import jalview.util.Platform;
-
-import java.awt.Desktop;
-import java.awt.desktop.AboutEvent;
-import java.awt.desktop.AboutHandler;
-import java.awt.desktop.PreferencesEvent;
-import java.awt.desktop.PreferencesHandler;
-import java.awt.desktop.QuitEvent;
-import java.awt.desktop.QuitHandler;
-import java.awt.desktop.QuitResponse;
-import java.awt.desktop.QuitStrategy;
-
-import javax.swing.JOptionPane;
-
-public class APQHandlers
-{
-  private static boolean setAPQHandlers = false;
-
-  public APQHandlers() {
-  }
-
-  protected static boolean setAPQHandlers(jalview.gui.Desktop jalviewDesktop)
-  {
-    // flagging this test to avoid unnecessary reflection
-    if (!setAPQHandlers)
-    {
-      // see if the Quit, About and Preferences handlers are available
-      Class desktopClass = Desktop.class;
-      Desktop hdesktop = Desktop.getDesktop();
-
-      try
-      {
-        Float specversion = Float.parseFloat(
-                System.getProperty("java.specification.version"));
-
-        if (specversion >= 9)
-        {
-          if (Platform.isMac())
-          {
-            if (desktopClass.getDeclaredMethod("setAboutHandler",
-                    new Class[]
-                    { AboutHandler.class }) != null)
-            {
-
-              hdesktop.setAboutHandler(new AboutHandler()
-              {
-                @Override
-                public void handleAbout(AboutEvent e)
-                {
-                  jalviewDesktop.aboutMenuItem_actionPerformed(null);
-                }
-              });
-
-            }
-
-            if (desktopClass.getDeclaredMethod("setPreferencesHandler",
-                    new Class[]
-                    { PreferencesHandler.class }) != null)
-            {
-
-              hdesktop.setPreferencesHandler(
-                      new PreferencesHandler()
-              {
-                        @Override
-                        public void handlePreferences(
-                                PreferencesEvent e)
-                        {
-                          jalviewDesktop.preferences_actionPerformed(null);
-                        }
-                      });
-
-            }
-
-            if (desktopClass.getDeclaredMethod("setQuitHandler",
-                    new Class[]
-                    { QuitHandler.class }) != null)
-            {
-
-              hdesktop.setQuitHandler(new QuitHandler()
-              {
-                @Override
-                public void handleQuitRequestWith(
-                        QuitEvent e, QuitResponse r)
-                {
-                  boolean confirmQuit = jalview.bin.Cache
-                          .getDefault(
-                                  jalview.gui.Desktop.CONFIRM_KEYBOARD_QUIT,
-                                  true);
-                  int n;
-                  if (confirmQuit)
-                  {
-                    n = JOptionPane.showConfirmDialog(null,
-                            MessageManager.getString("label.quit_jalview"),
-                            MessageManager.getString("action.quit"),
-                            JOptionPane.OK_CANCEL_OPTION,
-                            JOptionPane.PLAIN_MESSAGE, null);
-                  }
-                  else
-                  {
-                    n = JOptionPane.OK_OPTION;
-                  }
-                  if (n == JOptionPane.OK_OPTION)
-                  {
-                    System.out.println("Shortcut Quit confirmed by user");
-                    jalviewDesktop.quit();
-                    r.performQuit(); // probably won't reach this line, but just
-                                     // in
-                                     // case
-                  }
-                  else
-                  {
-                    r.cancelQuit();
-                    System.out.println("Shortcut Quit cancelled by user");
-                  }
-                }
-              });
-              hdesktop.setQuitStrategy(
-                      QuitStrategy.CLOSE_ALL_WINDOWS);
-
-            }
-          }
-          setAPQHandlers = true;
-        }
-        else
-        {
-          System.out.println(
-                  "Not going to try setting APQ Handlers as java.spec.version is "
-                          + specversion);
-        }
-
-      } catch (Exception e)
-      {
-        System.out.println(
-                "Exception when looking for About, Preferences, Quit Handlers");
-        // e.printStackTrace();
-      } catch (Throwable t)
-      {
-        System.out.println(
-                "Throwable when looking for About, Preferences, Quit Handlers");
-        // t.printStackTrace();
-      }
-
-    }
-    
-    return setAPQHandlers;
-  }
-
-}
index 70601c9..3a8fb7c 100644 (file)
@@ -96,7 +96,7 @@ public class AlignExportOptions extends JPanel
     this.settings = defaults;
     this.isComplexAlignFile = format.isComplexAlignFile();
     init(viewport.hasHiddenRows(), viewport.hasHiddenColumns());
-    dialog = JvOptionPane.newOptionDialog(Desktop.desktop);
+    dialog = JvOptionPane.newOptionDialog(Desktop.getDesktopPane());
   }
 
   /**
index 1b09868..bac06e9 100644 (file)
@@ -28,10 +28,12 @@ import jalview.analysis.GeneticCodeI;
 import jalview.analysis.ParseProperties;
 import jalview.analysis.SequenceIdMatcher;
 import jalview.api.AlignExportSettingsI;
+import jalview.api.AlignFrameI;
 import jalview.api.AlignViewControllerGuiI;
 import jalview.api.AlignViewControllerI;
 import jalview.api.AlignViewportI;
 import jalview.api.AlignmentViewPanel;
+//from JalviewLite imports import jalview.api.FeatureRenderer;
 import jalview.api.FeatureSettingsControllerI;
 import jalview.api.SplitContainerI;
 import jalview.api.ViewStyleI;
@@ -105,6 +107,7 @@ import jalview.ws.seqfetcher.DbSourceProxy;
 import java.awt.BorderLayout;
 import java.awt.Color;
 import java.awt.Component;
+import java.awt.Dimension;
 import java.awt.Rectangle;
 import java.awt.Toolkit;
 import java.awt.datatransfer.Clipboard;
@@ -162,7 +165,8 @@ import ext.vamsas.ServiceHandle;
  * @version $Revision$
  */
 @SuppressWarnings("serial")
-public class AlignFrame extends GAlignFrame implements DropTargetListener,
+public class AlignFrame extends GAlignFrame
+        implements AlignFrameI, DropTargetListener,
         IProgressIndicator, AlignViewControllerGuiI, ColourChangeListener
 {
 
@@ -296,9 +300,6 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
 
     viewport = new AlignViewport(al, hiddenColumns, sequenceSetId, viewId);
 
-    alignPanel = new AlignmentPanel(this, viewport);
-
-    addAlignmentPanel(alignPanel, true);
     init();
   }
 
@@ -318,8 +319,6 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     {
       viewport.hideSequence(hiddenSeqs);
     }
-    alignPanel = new AlignmentPanel(this, viewport);
-    addAlignmentPanel(alignPanel, true);
     init();
   }
 
@@ -335,7 +334,6 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   {
     viewport = ap.av;
     alignPanel = ap;
-    addAlignmentPanel(ap, false);
     init();
   }
 
@@ -345,11 +343,34 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
    */
   void init()
   {
-//       setBackground(Color.white); // BH 2019
+    boolean newPanel = (alignPanel == null);
+    viewport.setShowAutocalculatedAbove(isShowAutoCalculatedAbove());
+    if (newPanel)
+    {
+      if (Platform.isJS())
+      {
+        // need to set this up front if NOANNOTATION is
+        // used in conjunction with SHOWOVERVIEW.
+
+        // I have not determined if this is appropriate for
+        // Jalview/Java, as it means we are setting this flag
+        // for all subsequent AlignFrames. For now, at least,
+        // I am setting it to be JalviewJS-only.
+
+        boolean showAnnotation = Jalview.getInstance().getShowAnnotation();
+        viewport.setShowAnnotation(showAnnotation);
+      }
+      alignPanel = new AlignmentPanel(this, viewport);
+    }
+    addAlignmentPanel(alignPanel, newPanel);
+
+    // setBackground(Color.white); // BH 2019
                  
     if (!Jalview.isHeadlessMode())
     {
       progressBar = new ProgressBar(this.statusPanel, this.statusBar);
+      statusPanel.setVisible(Jalview.getInstance().getShowStatus());
+      alignFrameMenuBar.setVisible(Jalview.getInstance().getAllowMenuBar());
     }
 
     avc = new jalview.controller.AlignViewController(this, viewport,
@@ -364,7 +385,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       // modifyPID.setEnabled(false);
     }
 
-    String sortby = jalview.bin.Cache.getDefault("SORT_ALIGNMENT",
+    String sortby = jalview.bin.Cache.getDefault(Preferences.SORT_ALIGNMENT,
             "No sort");
 
     if (sortby.equals("Id"))
@@ -376,9 +397,6 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       sortPairwiseMenuItem_actionPerformed(null);
     }
 
-    this.alignPanel.av
-            .setShowAutocalculatedAbove(isShowAutoCalculatedAbove());
-
     setMenusFromViewport(viewport);
     buildSortByAnnotationScoresMenu();
     calculateTree.addActionListener(new ActionListener()
@@ -392,7 +410,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     });
     buildColourMenu();
 
-    if (Desktop.desktop != null)
+    if (Desktop.getDesktopPane() != null)
     {
       this.setDropTarget(new java.awt.dnd.DropTarget(this, this));
       if (!Platform.isJS())
@@ -407,7 +425,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       wrapMenuItem_actionPerformed(null);
     }
 
-    if (jalview.bin.Cache.getDefault("SHOW_OVERVIEW", false))
+    if (jalview.bin.Cache.getDefault(Preferences.SHOW_OVERVIEW, false))
     {
       this.overviewMenuItem_actionPerformed(null);
     }
@@ -551,7 +569,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
         switch (evt.getKeyCode())
         {
 
-        case 27: // escape key
+        case KeyEvent.VK_ESCAPE: // escape key
           deselectAllSequenceMenuItem_actionPerformed(null);
 
           break;
@@ -790,9 +808,12 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       {
         ap.av.getAlignment().padGaps();
       }
-      ap.av.updateConservation(ap);
-      ap.av.updateConsensus(ap);
-      ap.av.updateStrucConsensus(ap);
+      if (Jalview.getInstance().getStartCalculations())
+      {
+        ap.av.updateConservation(ap);
+        ap.av.updateConsensus(ap);
+        ap.av.updateStrucConsensus(ap);
+      }
     }
   }
 
@@ -815,14 +836,12 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   private void addServiceListeners()
   {
     final java.beans.PropertyChangeListener thisListener;
-    Desktop.instance.addJalviewPropertyChangeListener("services",
+    Desktop.getInstance().addJalviewPropertyChangeListener("services",
             thisListener = new java.beans.PropertyChangeListener()
             {
               @Override
               public void propertyChange(PropertyChangeEvent evt)
               {
-                // // System.out.println("Discoverer property change.");
-                // if (evt.getPropertyName().equals("services"))
                 {
                   SwingUtilities.invokeLater(new Runnable()
                   {
@@ -846,7 +865,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
               javax.swing.event.InternalFrameEvent evt)
       {
         // System.out.println("deregistering discoverer listener");
-        Desktop.instance.removeJalviewPropertyChangeListener("services",
+        Desktop.getInstance().removeJalviewPropertyChangeListener("services",
                 thisListener);
         closeMenuItem_actionPerformed(true);
       }
@@ -923,10 +942,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     /*
      * Show/hide annotations only enabled if annotation panel is shown
      */
-    showAllSeqAnnotations.setEnabled(annotationPanelMenuItem.getState());
-    hideAllSeqAnnotations.setEnabled(annotationPanelMenuItem.getState());
-    showAllAlAnnotations.setEnabled(annotationPanelMenuItem.getState());
-    hideAllAlAnnotations.setEnabled(annotationPanelMenuItem.getState());
+    syncAnnotationMenuItems();
+
     viewBoxesMenuItem.setSelected(av.getShowBoxes());
     viewTextMenuItem.setSelected(av.getShowText());
     showNonconservedMenuItem.setSelected(av.getShowUnconserved());
@@ -944,7 +961,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     applyToAllGroups.setState(av.getColourAppliesToAllGroups());
     showNpFeatsMenuitem.setSelected(av.isShowNPFeats());
     showDbRefsMenuitem.setSelected(av.isShowDBRefs());
-    autoCalculate.setSelected(av.autoCalculateConsensus);
+    autoCalculate.setSelected(av.getAutoCalculateConsensusAndConservation());
     sortByTree.setSelected(av.sortByTree);
     listenToViewSelections.setSelected(av.followSelection);
 
@@ -1027,7 +1044,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   @Override
   public void addFromFile_actionPerformed(ActionEvent e)
   {
-    Desktop.instance.inputLocalFileMenuItem_actionPerformed(viewport);
+    Desktop.getInstance().inputLocalFileMenuItem_actionPerformed(viewport);
   }
 
   @Override
@@ -1041,7 +1058,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       // file is reloaded.
       if (FileFormat.Jalview.equals(currentFileFormat))
       {
-        JInternalFrame[] frames = Desktop.desktop.getAllFrames();
+        JInternalFrame[] frames = Desktop.getDesktopPane().getAllFrames();
         for (int i = 0; i < frames.length; i++)
         {
           if (frames[i] instanceof AlignFrame && frames[i] != this
@@ -1051,20 +1068,20 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
             try
             {
               frames[i].setSelected(true);
-              Desktop.instance.closeAssociatedWindows();
+              Desktop.getInstance().closeAssociatedWindows();
             } catch (java.beans.PropertyVetoException ex)
             {
             }
           }
 
         }
-        Desktop.instance.closeAssociatedWindows();
+        Desktop.getInstance().closeAssociatedWindows();
 
         FileLoader loader = new FileLoader();
         DataSourceType protocol = fileName.startsWith("http:")
                 ? DataSourceType.URL
                 : DataSourceType.FILE;
-        loader.LoadFile(viewport, fileName, protocol, currentFileFormat);
+        loader.loadFile(viewport, fileName, protocol, currentFileFormat);
       }
       else
       {
@@ -1080,12 +1097,12 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
           DataSourceType protocol = (fileName.startsWith("http:")
                   ? DataSourceType.URL
                   : DataSourceType.FILE);
-          newframe = loader.LoadFileWaitTillLoaded(fileName, protocol,
+          newframe = loader.loadFileWaitTillLoaded(fileName, protocol,
                   currentFileFormat);
         }
         else
         {
-          newframe = loader.LoadFileWaitTillLoaded(fileObject,
+          newframe = loader.loadFileWaitTillLoaded(fileObject,
                   DataSourceType.FILE, currentFileFormat);
         }
 
@@ -1116,14 +1133,14 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   @Override
   public void addFromText_actionPerformed(ActionEvent e)
   {
-    Desktop.instance
+    Desktop.getInstance()
             .inputTextboxMenuItem_actionPerformed(viewport.getAlignPanel());
   }
 
   @Override
   public void addFromURL_actionPerformed(ActionEvent e)
   {
-    Desktop.instance.inputURLMenuItem_actionPerformed(viewport);
+    Desktop.getInstance().inputURLMenuItem_actionPerformed(viewport);
   }
 
   @Override
@@ -1167,7 +1184,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     // todo is this (2005) test now obsolete - value is never null?
     while (currentFileFormat == null)
     {
-      JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+      JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
               MessageManager
                       .getString("label.select_file_format_before_saving"),
               MessageManager.getString("label.file_format_not_specified"),
@@ -1289,6 +1306,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
             String tempFilePath = doBackup ? backupfiles.getTempFilePath() : file;
                        PrintWriter out = new PrintWriter(
                     new FileWriter(tempFilePath));
+
             out.print(output);
             out.close();
             AlignFrame.this.setTitle(file);
@@ -1929,16 +1947,17 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
 
     StringSelection ss = new StringSelection(output);
 
+    Desktop d = Desktop.getInstance();
     try
     {
-      jalview.gui.Desktop.internalCopy = true;
+      d.internalCopy = true;
       // Its really worth setting the clipboard contents
       // to empty before setting the large StringSelection!!
       Toolkit.getDefaultToolkit().getSystemClipboard()
               .setContents(new StringSelection(""), null);
 
       Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss,
-              Desktop.instance);
+              Desktop.getInstance());
     } catch (OutOfMemoryError er)
     {
       new OOMWarning("copying region", er);
@@ -1958,7 +1977,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
               hiddenCutoff, hiddenOffset);
     }
 
-    Desktop.jalviewClipboard = new Object[] { seqs,
+    d.jalviewClipboard = new Object[] { seqs,
         viewport.getAlignment().getDataset(), hiddenColumns };
     setStatus(MessageManager.formatMessage(
             "label.copied_sequences_to_clipboard", new Object[]
@@ -2030,12 +2049,14 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       boolean annotationAdded = false;
       AlignmentI alignment = null;
 
-      if (Desktop.jalviewClipboard != null)
+      Desktop d = Desktop.getInstance();
+
+      if (d.jalviewClipboard != null)
       {
         // The clipboard was filled from within Jalview, we must use the
         // sequences
         // And dataset from the copied alignment
-        SequenceI[] newseq = (SequenceI[]) Desktop.jalviewClipboard[0];
+        SequenceI[] newseq = (SequenceI[]) d.jalviewClipboard[0];
         // be doubly sure that we create *new* sequence objects.
         sequences = new SequenceI[newseq.length];
         for (int i = 0; i < newseq.length; i++)
@@ -2060,10 +2081,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       if (newAlignment)
       {
 
-        if (Desktop.jalviewClipboard != null)
+        if (d.jalviewClipboard != null)
         {
           // dataset is inherited
-          alignment.setDataset((Alignment) Desktop.jalviewClipboard[1]);
+          alignment.setDataset((Alignment) d.jalviewClipboard[1]);
         }
         else
         {
@@ -2079,8 +2100,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
         alignment = viewport.getAlignment();
         alwidth = alignment.getWidth() + 1;
         // decide if we need to import sequences from an existing dataset
-        boolean importDs = Desktop.jalviewClipboard != null
-                && Desktop.jalviewClipboard[1] != alignment.getDataset();
+        boolean importDs = d.jalviewClipboard != null
+                && d.jalviewClipboard[1] != alignment.getDataset();
         // importDs==true instructs us to copy over new dataset sequences from
         // an existing alignment
         Vector<SequenceI> newDs = (importDs) ? new Vector<>() : null; // used to
@@ -2157,7 +2178,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
                     newGraphGroups.add(q, null);
                   }
                   newGraphGroups.set(newann.graphGroup,
-                          Integer.valueOf(++fgroup));
+                          new Integer(++fgroup));
                 }
                 newann.graphGroup = newGraphGroups.get(newann.graphGroup)
                         .intValue();
@@ -2204,7 +2225,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
                     newGraphGroups.add(q, null);
                   }
                   newGraphGroups.set(newann.graphGroup,
-                          Integer.valueOf(++fgroup));
+                          new Integer(++fgroup));
                 }
                 newann.graphGroup = newGraphGroups.get(newann.graphGroup)
                         .intValue();
@@ -2282,10 +2303,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
                 DEFAULT_HEIGHT);
         String newtitle = new String("Copied sequences");
 
-        if (Desktop.jalviewClipboard != null
-                && Desktop.jalviewClipboard[2] != null)
+        if (d.jalviewClipboard != null && d.jalviewClipboard[2] != null)
         {
-          HiddenColumns hc = (HiddenColumns) Desktop.jalviewClipboard[2];
+          HiddenColumns hc = (HiddenColumns) d.jalviewClipboard[2];
           af.viewport.setHiddenColumns(hc);
         }
 
@@ -2338,10 +2358,11 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
               DEFAULT_HEIGHT);
       String newtitle = new String("Flanking alignment");
 
-      if (Desktop.jalviewClipboard != null
-              && Desktop.jalviewClipboard[2] != null)
+      Desktop d = Desktop.getInstance();
+
+      if (d.jalviewClipboard != null && d.jalviewClipboard[2] != null)
       {
-        HiddenColumns hc = (HiddenColumns) Desktop.jalviewClipboard[2];
+        HiddenColumns hc = (HiddenColumns) d.jalviewClipboard[2];
         af.viewport.setHiddenColumns(hc);
       }
 
@@ -2438,7 +2459,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
             + 1) == viewport.getAlignment().getWidth()) ? true : false;
        if (wholeHeight && wholeWidth)
        {
-           JvOptionPane dialog = JvOptionPane.newOptionDialog(Desktop.desktop);
+           JvOptionPane dialog = JvOptionPane.newOptionDialog(Desktop.getDesktopPane());
                dialog.setResponseHandler(0, okAction); // 0 = OK_OPTION
            Object[] options = new Object[] { MessageManager.getString("action.ok"),
                    MessageManager.getString("action.cancel") };
@@ -2912,7 +2933,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   @Override
   public void gatherViews_actionPerformed(ActionEvent e)
   {
-    Desktop.instance.gatherViews(this);
+    Desktop.getInstance().gatherViews(this);
   }
 
   /**
@@ -3290,13 +3311,20 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   {
     final boolean setVisible = annotationPanelMenuItem.isSelected();
     viewport.setShowAnnotation(setVisible);
-    this.showAllSeqAnnotations.setEnabled(setVisible);
-    this.hideAllSeqAnnotations.setEnabled(setVisible);
-    this.showAllAlAnnotations.setEnabled(setVisible);
-    this.hideAllAlAnnotations.setEnabled(setVisible);
+    syncAnnotationMenuItems();
     alignPanel.updateLayout();
   }
 
+  private void syncAnnotationMenuItems()
+  {
+    final boolean setVisible = annotationPanelMenuItem.isSelected();
+    showAllSeqAnnotations.setEnabled(setVisible);
+    hideAllSeqAnnotations.setEnabled(setVisible);
+    showAllAlAnnotations.setEnabled(setVisible);
+    hideAllAlAnnotations.setEnabled(setVisible);
+  }
+
+
   @Override
   public void alignmentProperties()
   {
@@ -3357,12 +3385,38 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     }
 
     JInternalFrame frame = new JInternalFrame();
-    final OverviewPanel overview = new OverviewPanel(alignPanel);
+
+    // BH 2019.07.26 we allow for an embedded
+    // undecorated overview with defined size
+    frame.setName(Jalview.getAppID("overview"));
+    //
+    Dimension dim = (Dimension) Platform.getEmbeddedAttribute(frame,
+            Platform.EMBEDDED_DIM);
+    if (dim != null && dim.width == 0)
+    {
+      dim = null; // hidden, not embedded
+    }
+
+    OverviewPanel overview = new OverviewPanel(alignPanel, dim);
+
     frame.setContentPane(overview);
+    if (dim == null)
+    {
+      dim = new Dimension();
+      // was frame.getSize(), but that is 0,0 at this point;
+    }
+    else
+    {
+      // we are imbedding, and so we have an undecorated frame
+      // and we can set the the frame dimensions accordingly.
+    }
+    // allowing for unresizable option using, style="resize:none"
+    boolean resizable = (Platform.getEmbeddedAttribute(frame,
+            "resize") != "none");
     Desktop.addInternalFrame(frame, MessageManager
             .formatMessage("label.overview_params", new Object[]
-            { this.getTitle() }), true, frame.getWidth(), frame.getHeight(),
-            true, true);
+            { this.getTitle() }), true, dim.width, dim.height, resizable,
+            true);
     frame.pack();
     frame.setLayer(JLayeredPane.PALETTE_LAYER);
     frame.addInternalFrameListener(
@@ -3642,8 +3696,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   @Override
   public void autoCalculate_actionPerformed(ActionEvent e)
   {
-    viewport.autoCalculateConsensus = autoCalculate.isSelected();
-    if (viewport.autoCalculateConsensus)
+    viewport.setAutoCalculateConsensusAndConservation(autoCalculate.isSelected());
+    if (viewport.getAutoCalculateConsensusAndConservation())
     {
       viewport.firePropertyChange("alignment", null,
               viewport.getAlignment().getSequences());
@@ -3689,7 +3743,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       {
         if (_s.getLength() < sg.getEndRes())
         {
-          JvOptionPane.showMessageDialog(Desktop.desktop,
+          JvOptionPane.showMessageDialog(Desktop.getDesktopPane(),
                   MessageManager.getString(
                           "label.selected_region_to_tree_may_only_contain_residues_or_gaps"),
                   MessageManager.getString(
@@ -4011,7 +4065,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
           viewport.setCurrentTree(showNewickTree(fin, filePath).getTree());
         } catch (Exception ex)
         {
-          JvOptionPane.showMessageDialog(Desktop.desktop, ex.getMessage(),
+          JvOptionPane.showMessageDialog(Desktop.getDesktopPane(), ex.getMessage(),
                   MessageManager
                           .getString("label.problem_reading_tree_file"),
                   JvOptionPane.WARNING_MESSAGE);
@@ -4019,7 +4073,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
         }
         if (fin != null && fin.hasWarningMessage())
         {
-          JvOptionPane.showMessageDialog(Desktop.desktop,
+          JvOptionPane.showMessageDialog(Desktop.getDesktopPane(),
                   fin.getWarningMessage(),
                   MessageManager.getString(
                           "label.possible_problem_with_tree_file"),
@@ -4147,9 +4201,11 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
           final JMenu dismenu = new JMenu("Protein Disorder");
           // JAL-940 - only show secondary structure prediction services from
           // the legacy server
+          Hashtable<String, Vector<ServiceHandle>> services = Discoverer
+                  .getInstance().getServices();
           if (// Cache.getDefault("SHOW_JWS1_SERVICES", true)
-              // &&
-          Discoverer.services != null && (Discoverer.services.size() > 0))
+          // &&
+          services != null && (services.size() > 0))
           {
             // TODO: refactor to allow list of AbstractName/Handler bindings to
             // be
@@ -4157,8 +4213,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
             // No MSAWS used any more:
             // Vector msaws = null; // (Vector)
             // Discoverer.services.get("MsaWS");
-            Vector<ServiceHandle> secstrpr = Discoverer.services
-                    .get("SecStrPred");
+            Vector<ServiceHandle> secstrpr = services.get("SecStrPred");
             if (secstrpr != null)
             {
               // Add any secondary structure prediction services
@@ -4209,10 +4264,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
                   webService.add(me.webServiceNoServices);
                 }
                 // TODO: move into separate menu builder class.
-                boolean new_sspred = false;
+                // boolean new_sspred = false;
                 if (Cache.getDefault("SHOW_JWS2_SERVICES", true))
                 {
-                  Jws2Discoverer jws2servs = Jws2Discoverer.getDiscoverer();
+                  Jws2Discoverer jws2servs = Jws2Discoverer.getInstance();
                   if (jws2servs != null)
                   {
                     if (jws2servs.hasServices())
@@ -4399,7 +4454,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       final String errorTitle = MessageManager
               .getString("label.implementation_error")
               + MessageManager.getString("label.translation_failed");
-      JvOptionPane.showMessageDialog(Desktop.desktop, msg, errorTitle,
+      JvOptionPane.showMessageDialog(Desktop.getDesktopPane(), msg, errorTitle,
               JvOptionPane.ERROR_MESSAGE);
       return;
     }
@@ -4409,7 +4464,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
               "label.select_at_least_three_bases_in_at_least_one_sequence_to_cDNA_translation");
       final String errorTitle = MessageManager
               .getString("label.translation_failed");
-      JvOptionPane.showMessageDialog(Desktop.desktop, msg, errorTitle,
+      JvOptionPane.showMessageDialog(Desktop.getDesktopPane(), msg, errorTitle,
               JvOptionPane.WARNING_MESSAGE);
     }
     else
@@ -4423,7 +4478,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       if (Cache.getDefault(Preferences.ENABLE_SPLIT_FRAME, true))
       {
         final SequenceI[] seqs = viewport.getSelectionAsNewSequence();
-        viewport.openSplitFrame(af, new Alignment(seqs));
+        AlignViewport.openSplitFrame(this, af, new Alignment(seqs));
       }
       else
       {
@@ -4456,7 +4511,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   {
     // BH 2018
     return avc.parseFeaturesFile(file, sourceType,
-            Cache.getDefault("RELAXEDSEQIDMATCHING", false));
+            Cache.getDefault(Preferences.RELAXEDSEQIDMATCHING, false));
 
   }
 
@@ -4470,6 +4525,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     {
       viewport.setShowSequenceFeatures(true);
       showSeqFeatures.setSelected(true);
+      alignPanel.getAlignment().resetColors();
     }
 
   }
@@ -4599,7 +4655,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
             if (filesmatched.size() > 0)
             {
               boolean autoAssociate = Cache
-                      .getDefault("AUTOASSOCIATE_PDBANDSEQS", false);
+                      .getDefault(Preferences.AUTOASSOCIATE_PDBANDSEQS, false);
               if (!autoAssociate)
               {
                 String msg = MessageManager.formatMessage(
@@ -4622,10 +4678,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
                   // associating PDB files which have no IDs.
                   for (SequenceI toassoc : (SequenceI[]) fm[2])
                   {
-                    PDBEntry pe = new AssociatePdbFileWithSeq()
+                    PDBEntry pe = AssociatePdbFileWithSeq
                             .associatePdbWithSeq(fm[0].toString(),
-                                    (DataSourceType) fm[1], toassoc, false,
-                                    Desktop.instance);
+                                    (DataSourceType) fm[1], toassoc, false);
                     if (pe != null)
                     {
                       System.err.println("Associated file : "
@@ -4736,7 +4791,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
             {
               // some problem - if no warning its probable that the ID matching
               // process didn't work
-              JvOptionPane.showMessageDialog(Desktop.desktop,
+              JvOptionPane.showMessageDialog(Desktop.getDesktopPane(),
                       tcf.getWarningMessage() == null
                               ? MessageManager.getString(
                                       "label.check_file_matches_sequence_ids_alignment")
@@ -4795,17 +4850,13 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
           }
           else
           {
-            new FileLoader().LoadFile(viewport, file, sourceType, format);
+            new FileLoader().loadFile(viewport, file, sourceType, format);
           }
         }
       }
       if (isAnnotation)
       {
-
-        alignPanel.adjustAnnotationHeight();
-        viewport.updateSequenceIdColours();
-        buildSortByAnnotationScoresMenu();
-        alignPanel.paintAlignment(true, true);
+        updateForAnnotations();
       }
     } catch (Exception ex)
     {
@@ -4829,11 +4880,23 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
                       + (format != null
                               ? "(parsing as '" + format + "' file)"
                               : ""),
-              oom, Desktop.desktop);
+              oom, Desktop.getDesktopPane());
     }
   }
 
   /**
+   * Do all updates necessary after an annotation file such as jnet. Also called
+   * from Jalview.loadAppletParams for "annotations", "jnetFile"
+   */
+  public void updateForAnnotations()
+  {
+    alignPanel.adjustAnnotationHeight();
+    viewport.updateSequenceIdColours();
+    buildSortByAnnotationScoresMenu();
+    alignPanel.paintAlignment(true, true);
+  }
+
+  /**
    * Method invoked by the ChangeListener on the tabbed pane, in other words
    * when a different tabbed pane is selected by the user or programmatically.
    */
@@ -4916,6 +4979,32 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   }
 
   /**
+   * Change the display state for the given feature groups -- Added by BH from
+   * JalviewLite
+   * 
+   * @param groups
+   *          list of group strings
+   * @param state
+   *          visible or invisible
+   */
+  public void setFeatureGroupState(String[] groups, boolean state)
+  {
+    jalview.api.FeatureRenderer fr = null;
+    viewport.setShowSequenceFeatures(true);
+    if (alignPanel != null
+            && (fr = alignPanel.getFeatureRenderer()) != null)
+    {
+
+      fr.setGroupVisibility(Arrays.asList(groups), state);
+      alignPanel.getSeqPanel().seqCanvas.repaint();
+      if (alignPanel.overviewPanel != null)
+      {
+        alignPanel.overviewPanel.updateOverviewImage();
+      }
+    }
+  }
+
+  /**
    * Open the dialog for regex description parsing.
    */
   @Override
@@ -5059,14 +5148,13 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       @Override
       public void run()
       {
-        final jalview.ws.SequenceFetcher sf = jalview.gui.SequenceFetcher
-                .getSequenceFetcherSingleton();
         javax.swing.SwingUtilities.invokeLater(new Runnable()
         {
           @Override
           public void run()
           {
-            String[] dbclasses = sf.getNonAlignmentSources();
+            String[] dbclasses = jalview.ws.SequenceFetcher.getInstance()
+                    .getNonAlignmentSources();
             List<DbSourceProxy> otherdb;
             JMenu dfetch = new JMenu();
             JMenu ifetch = new JMenu();
@@ -5076,7 +5164,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
             int dbi = 0;
             for (String dbclass : dbclasses)
             {
-              otherdb = sf.getSourceProxy(dbclass);
+              otherdb = jalview.ws.SequenceFetcher.getInstance()
+                      .getSourceProxy(dbclass);
               // add a single entry for this class, or submenu allowing 'fetch
               // all' or pick one
               if (otherdb == null || otherdb.size() < 1)
@@ -5089,9 +5178,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
               }
               if (otherdb.size() == 1)
               {
-                final DbSourceProxy[] dassource = otherdb
-                        .toArray(new DbSourceProxy[0]);
                 DbSourceProxy src = otherdb.get(0);
+                DbSourceProxy[] dassource = new DbSourceProxy[] {
+                    src };
                 fetchr = new JMenuItem(src.getDbSource());
                 fetchr.addActionListener(new ActionListener()
                 {
@@ -5638,7 +5727,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       } catch (Exception ex)
       {
         System.err.println((ex.toString()));
-        JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+        JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
                 MessageManager.getString("label.couldnt_run_groovy_script"),
                 MessageManager.getString("label.groovy_support_failed"),
                 JvOptionPane.ERROR_MESSAGE);
@@ -5749,6 +5838,67 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
 
   }
 
+  /**
+   * BH 2019 from JalviewLite
+   * 
+   * get sequence feature groups that are hidden or shown
+   * 
+   * @param visible
+   *          true is visible
+   * @return list
+   */
+  public String[] getFeatureGroupsOfState(boolean visible)
+  {
+    jalview.api.FeatureRenderer fr = null;
+    if (alignPanel != null
+            && (fr = alignPanel
+                    .getFeatureRenderer()) != null)
+    {
+      List<String> gps = fr.getGroups(visible);
+      String[] _gps = gps.toArray(new String[gps.size()]);
+      return _gps;
+    }
+    return null;
+  }
+
+  public void scrollTo(int row, int column)
+  {
+    alignPanel.getSeqPanel().scrollTo(row, column);
+  }
+
+  public void scrollToRow(int row)
+  {
+    alignPanel.getSeqPanel().scrollToRow(row);
+  }
+
+  public void scrollToColumn(int column)
+  {
+    alignPanel.getSeqPanel().scrollToColumn(column);
+  }
+
+  /**
+   * 
+   * @return list of feature groups on the view
+   */
+  public String[] getFeatureGroups()
+  {
+    jalview.api.FeatureRenderer fr = null;
+    if (alignPanel != null
+            && (fr = alignPanel.getFeatureRenderer()) != null)
+    {
+      List<String> gps = fr.getFeatureGroups();
+      String[] _gps = gps.toArray(new String[gps.size()]);
+      return _gps;
+    }
+    return null;
+  }
+
+  public void select(SequenceGroup sel, ColumnSelection csel,
+          HiddenColumns hidden)
+  {
+    alignPanel.getSeqPanel().selection(sel, csel, hidden, null);
+  }
+
 }
 
 class PrintThread extends Thread
@@ -5787,4 +5937,5 @@ class PrintThread extends Thread
       }
     }
   }
+
 }
index 7d01222..fb3ec3a 100644 (file)
@@ -206,24 +206,26 @@ public class AlignViewport extends AlignmentViewport
    */
   private void applyViewProperties()
   {
-    antiAlias = Cache.getDefault("ANTI_ALIAS", false);
-
-    viewStyle.setShowJVSuffix(Cache.getDefault("SHOW_JVSUFFIX", true));
-    setShowAnnotation(Cache.getDefault("SHOW_ANNOTATIONS", true));
-
-    setRightAlignIds(Cache.getDefault("RIGHT_ALIGN_IDS", false));
-    setCentreColumnLabels(Cache.getDefault("CENTRE_COLUMN_LABELS", false));
-    autoCalculateConsensus = Cache.getDefault("AUTO_CALC_CONSENSUS", true);
-
-    setPadGaps(Cache.getDefault("PAD_GAPS", true));
-    setShowNPFeats(Cache.getDefault("SHOW_NPFEATS_TOOLTIP", true));
-    setShowDBRefs(Cache.getDefault("SHOW_DBREFS_TOOLTIP", true));
-    viewStyle.setSeqNameItalics(Cache.getDefault("ID_ITALICS", true));
-    viewStyle.setWrapAlignment(Cache.getDefault("WRAP_ALIGNMENT", false));
+    antiAlias = Cache.getDefault(Preferences.ANTI_ALIAS, false);
+
+    viewStyle.setShowJVSuffix(
+            Cache.getDefault(Preferences.SHOW_JVSUFFIX, true));
+    setShowAnnotation(Cache.getDefault(Preferences.SHOW_ANNOTATIONS, true));
+
+    setRightAlignIds(Cache.getDefault(Preferences.RIGHT_ALIGN_IDS, false));
+    setCentreColumnLabels(Cache.getDefault(Preferences.CENTRE_COLUMN_LABELS, false));
+    autoCalculateConsensusAndConservation = Cache.getDefault(Preferences.AUTO_CALC_CONSENSUS, true);
+
+    setPadGaps(Cache.getDefault(Preferences.PAD_GAPS, true));
+    setShowNPFeats(Cache.getDefault(Preferences.SHOW_NPFEATS_TOOLTIP, true));
+    setShowDBRefs(Cache.getDefault(Preferences.SHOW_DBREFS_TOOLTIP, true));
+    viewStyle.setSeqNameItalics(Cache.getDefault(Preferences.ID_ITALICS, true));
+    viewStyle.setWrapAlignment(
+            Cache.getDefault(Preferences.WRAP_ALIGNMENT, false));
     viewStyle.setShowUnconserved(
-            Cache.getDefault("SHOW_UNCONSERVED", false));
-    sortByTree = Cache.getDefault("SORT_BY_TREE", false);
-    followSelection = Cache.getDefault("FOLLOW_SELECTIONS", true);
+            Cache.getDefault(Preferences.SHOW_UNCONSERVED, false));
+    sortByTree = Cache.getDefault(Preferences.SORT_BY_TREE, false);
+    followSelection = Cache.getDefault(Preferences.FOLLOW_SELECTIONS, true);
     sortAnnotationsBy = SequenceAnnotationOrder
             .valueOf(Cache.getDefault(Preferences.SORT_ANNOTATIONS,
                     SequenceAnnotationOrder.NONE.name()));
@@ -237,9 +239,10 @@ public class AlignViewport extends AlignmentViewport
   {
     applyViewProperties();
 
-    String fontName = Cache.getDefault("FONT_NAME", "SansSerif");
-    String fontStyle = Cache.getDefault("FONT_STYLE", Font.PLAIN + "");
-    String fontSize = Cache.getDefault("FONT_SIZE", "10");
+    String fontName = Cache.getDefault(Preferences.FONT_NAME, "SansSerif");
+    String fontStyle = Cache.getDefault(Preferences.FONT_STYLE,
+            Font.PLAIN + "");
+    String fontSize = Cache.getDefault(Preferences.FONT_SIZE, "10");
 
     int style = 0;
 
@@ -255,7 +258,8 @@ public class AlignViewport extends AlignmentViewport
     setFont(new Font(fontName, style, Integer.parseInt(fontSize)), true);
 
     alignment
-            .setGapCharacter(Cache.getDefault("GAP_SYMBOL", "-").charAt(0));
+            .setGapCharacter(Cache.getDefault(Preferences.GAP_SYMBOL, "-")
+                    .charAt(0));
 
     // We must set conservation and consensus before setting colour,
     // as Blosum and Clustal require this to be done
@@ -263,18 +267,22 @@ public class AlignViewport extends AlignmentViewport
     {
       if (!alignment.isNucleotide())
       {
-        showConservation = Cache.getDefault("SHOW_CONSERVATION", true);
-        showQuality = Cache.getDefault("SHOW_QUALITY", true);
-        showGroupConservation = Cache.getDefault("SHOW_GROUP_CONSERVATION",
-                false);
+        showConservation = Cache.getDefault(Preferences.SHOW_CONSERVATION,
+                true);
+        showQuality = Cache.getDefault(Preferences.SHOW_QUALITY, true);
+        showGroupConservation = Cache
+                .getDefault(Preferences.SHOW_GROUP_CONSERVATION, false);
       }
-      showConsensusHistogram = Cache.getDefault("SHOW_CONSENSUS_HISTOGRAM",
-              true);
-      showSequenceLogo = Cache.getDefault("SHOW_CONSENSUS_LOGO", false);
-      normaliseSequenceLogo = Cache.getDefault("NORMALISE_CONSENSUS_LOGO",
+      showConsensusHistogram = Cache
+              .getDefault(Preferences.SHOW_CONSENSUS_HISTOGRAM, true);
+      showSequenceLogo = Cache.getDefault(Preferences.SHOW_CONSENSUS_LOGO,
               false);
-      showGroupConsensus = Cache.getDefault("SHOW_GROUP_CONSENSUS", false);
-      showConsensus = Cache.getDefault("SHOW_IDENTITY", true);
+
+      normaliseSequenceLogo = Cache
+              .getDefault(Preferences.NORMALISE_CONSENSUS_LOGO, false);
+      showGroupConsensus = Cache
+              .getDefault(Preferences.SHOW_GROUP_CONSENSUS, false);
+      showConsensus = Cache.getDefault(Preferences.SHOW_IDENTITY, true);
 
       showOccupancy = Cache.getDefault(Preferences.SHOW_OCCUPANCY, true);
     }
@@ -289,8 +297,8 @@ public class AlignViewport extends AlignmentViewport
       schemeName = Cache.getDefault(Preferences.DEFAULT_COLOUR,
               ResidueColourScheme.NONE);
     }
-    ColourSchemeI colourScheme = ColourSchemeProperty
-            .getColourScheme(this, alignment, schemeName);
+    ColourSchemeI colourScheme = ColourSchemeProperty.getColourScheme(this,
+            alignment, schemeName);
     residueShading = new ResidueShader(colourScheme);
 
     if (colourScheme instanceof UserColourScheme)
@@ -383,9 +391,8 @@ public class AlignViewport extends AlignmentViewport
      */
     if (align != null)
     {
-      StructureSelectionManager ssm = StructureSelectionManager
-              .getStructureSelectionManager(Desktop.instance);
-      ssm.registerMappings(align.getCodonFrames());
+      Desktop.getStructureSelectionManager()
+              .registerMappings(align.getCodonFrames());
     }
 
     /*
@@ -405,8 +412,8 @@ public class AlignViewport extends AlignmentViewport
       List<AlignedCodonFrame> mappings = al.getCodonFrames();
       if (mappings != null)
       {
-        StructureSelectionManager ssm = StructureSelectionManager
-                .getStructureSelectionManager(Desktop.instance);
+        StructureSelectionManager ssm = Desktop
+                .getStructureSelectionManager();
         for (AlignedCodonFrame acf : mappings)
         {
           if (noReferencesTo(acf))
@@ -531,12 +538,10 @@ public class AlignViewport extends AlignmentViewport
   @Override
   public void sendSelection()
   {
-    jalview.structure.StructureSelectionManager
-            .getStructureSelectionManager(Desktop.instance)
-            .sendSelection(new SequenceGroup(getSelectionGroup()),
-                    new ColumnSelection(getColumnSelection()),
-                    new HiddenColumns(getAlignment().getHiddenColumns()),
-                    this);
+    Desktop.getStructureSelectionManager().sendSelection(
+            new SequenceGroup(getSelectionGroup()),
+            new ColumnSelection(getColumnSelection()),
+            new HiddenColumns(getAlignment().getHiddenColumns()), this);
   }
 
   /**
@@ -577,8 +582,7 @@ public class AlignViewport extends AlignmentViewport
   @Override
   public StructureSelectionManager getStructureSelectionManager()
   {
-    return StructureSelectionManager
-            .getStructureSelectionManager(Desktop.instance);
+    return Desktop.getStructureSelectionManager();
   }
 
   @Override
@@ -747,6 +751,12 @@ public class AlignViewport extends AlignmentViewport
     firePropertyChange("alignment", null, getAlignment().getSequences());
   }
 
+  public final static int NO_SPLIT = 0;
+
+  public final static int SPLIT_FRAME = 1;
+
+  public final static int NEW_WINDOW = 2;
+
   /**
    * Show a dialog with the option to open and link (cDNA <-> protein) as a new
    * alignment, either as a standalone alignment or in a split frame. Returns
@@ -763,54 +773,62 @@ public class AlignViewport extends AlignmentViewport
         MessageManager.getString("label.new_window"), };
     final String question = JvSwingUtils.wrapTooltip(true,
             MessageManager.getString("label.open_split_window?"));
-    final AlignViewport us = this;
-    
+
     /*
      * options No, Split Window, New Window correspond to
      * dialog responses 0, 1, 2 (even though JOptionPane shows them
      * in reverse order)
      */
-    JvOptionPane dialog = JvOptionPane.newOptionDialog(Desktop.desktop)
-            .setResponseHandler(0, new Runnable()
+    JvOptionPane dialog = JvOptionPane
+            .newOptionDialog(Desktop.getDesktopPane())
+            .setResponseHandler(NO_SPLIT, new Runnable()
             {
               @Override
               public void run()
               {
-                  addDataToAlignment(al);
+                addDataToAlignment(al);
               }
-            }).setResponseHandler(1, new Runnable()
+            }).setResponseHandler(SPLIT_FRAME, new Runnable()
             {
               @Override
               public void run()
               {
-                us.openLinkedAlignmentAs(al, title, true);
+                openLinkedAlignmentAs(getAlignPanel().alignFrame,
+                        new Alignment(getAlignment()), al, title,
+                        SPLIT_FRAME);
               }
-            }).setResponseHandler(2, new Runnable()
+            }).setResponseHandler(NEW_WINDOW, new Runnable()
             {
               @Override
               public void run()
               {
-                us.openLinkedAlignmentAs(al, title, false);
+                openLinkedAlignmentAs(null, getAlignment(), al, title,
+                        NEW_WINDOW);
               }
             });
-       dialog.showDialog(question,
+    dialog.showDialog(question,
             MessageManager.getString("label.open_split_window"),
             JvOptionPane.DEFAULT_OPTION, JvOptionPane.PLAIN_MESSAGE, null,
             options, options[0]);
   }
 
-  protected void openLinkedAlignmentAs(AlignmentI al, String title,
-          boolean newWindowOrSplitPane)
-    {
+  /**
+   * Open a split frame or a new window
+   * 
+   * @param al
+   * @param title
+   * @param mode
+   *          SPLIT_FRAME or NEW_WINDOW
+   */
+  public static void openLinkedAlignmentAs(AlignFrame thisFrame,
+          AlignmentI thisAlignment, AlignmentI al, String title, int mode)
+  {
     /*
      * Identify protein and dna alignments. Make a copy of this one if opening
      * in a new split pane.
      */
-    AlignmentI thisAlignment = newWindowOrSplitPane
-            ? new Alignment(getAlignment())
-            : getAlignment();
     AlignmentI protein = al.isNucleotide() ? thisAlignment : al;
-    final AlignmentI cdna = al.isNucleotide() ? al : thisAlignment;
+    AlignmentI cdna = al.isNucleotide() ? al : thisAlignment;
 
     /*
      * Map sequences. At least one should get mapped as we have already passed
@@ -839,7 +857,7 @@ public class AlignViewport extends AlignmentViewport
     // alignFrame.setFileName(file, format);
     // }
 
-    if (!newWindowOrSplitPane)
+    if (mode == NEW_WINDOW)
     {
       Desktop.addInternalFrame(newAlignFrame, title,
               AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT);
@@ -847,16 +865,16 @@ public class AlignViewport extends AlignmentViewport
 
     try
     {
-      newAlignFrame.setMaximum(
-              jalview.bin.Cache.getDefault("SHOW_FULLSCREEN", false));
+      newAlignFrame.setMaximum(jalview.bin.Cache
+              .getDefault(Preferences.SHOW_FULLSCREEN, false));
     } catch (java.beans.PropertyVetoException ex)
     {
     }
 
-    if (newWindowOrSplitPane)
+    if (mode == SPLIT_FRAME)
     {
       al.alignAs(thisAlignment);
-      protein = openSplitFrame(newAlignFrame, thisAlignment);
+      openSplitFrame(thisFrame, newAlignFrame, thisAlignment);
     }
   }
 
@@ -870,8 +888,8 @@ public class AlignViewport extends AlignmentViewport
    *          cdna/protein complement alignment to show in the other split half
    * @return the protein alignment in the split frame
    */
-  protected AlignmentI openSplitFrame(AlignFrame newAlignFrame,
-          AlignmentI complement)
+  static protected AlignmentI openSplitFrame(AlignFrame thisFrame,
+          AlignFrame newAlignFrame, AlignmentI complement)
   {
     /*
      * Make a new frame with a copy of the alignment we are adding to. If this
@@ -880,7 +898,7 @@ public class AlignViewport extends AlignmentViewport
      */
     AlignFrame copyMe = new AlignFrame(complement, AlignFrame.DEFAULT_WIDTH,
             AlignFrame.DEFAULT_HEIGHT);
-    copyMe.setTitle(getAlignPanel().alignFrame.getTitle());
+    copyMe.setTitle(thisFrame.getTitle());
 
     AlignmentI al = newAlignFrame.viewport.getAlignment();
     final AlignFrame proteinFrame = al.isNucleotide() ? copyMe
index 9cb690f..b636fa7 100644 (file)
@@ -23,6 +23,7 @@ package jalview.gui;
 import jalview.analysis.AnnotationSorter;
 import jalview.api.AlignViewportI;
 import jalview.api.AlignmentViewPanel;
+import jalview.api.SequenceRenderer;
 import jalview.bin.Cache;
 import jalview.bin.Jalview;
 import jalview.datamodel.AlignmentI;
@@ -55,6 +56,7 @@ import java.awt.event.AdjustmentEvent;
 import java.awt.event.AdjustmentListener;
 import java.awt.event.ComponentAdapter;
 import java.awt.event.ComponentEvent;
+import java.awt.image.BufferedImage;
 import java.awt.print.PageFormat;
 import java.awt.print.Printable;
 import java.awt.print.PrinterException;
@@ -68,7 +70,14 @@ import java.util.List;
 import javax.swing.SwingUtilities;
 
 /**
- * DOCUMENT ME!
+ * The main panel of an AlignFrame, containing holders for the IdPanel,
+ * SeqPanel, AnnotationLabels (a JPanel), and AnnotationPanel.
+ * 
+ * Additional holders contain an IdPanelWidthAdjuster space above the idPanel,
+ * AnnotationScroller (JScrollPane for AnnotationPanel), and vertical and
+ * horizontal scrollbars.
+ * 
+ * 
  * 
  * @author $author$
  * @version $Revision: 1.161 $
@@ -117,7 +126,8 @@ public class AlignmentPanel extends GAlignmentPanel implements
    */
   public AlignmentPanel(AlignFrame af, final AlignViewport av)
   {
-//     setBackground(Color.white);  // BH 2019
+    setBackground(Color.white); // BH 2019
+    setOpaque(true);
     alignFrame = af;
     this.av = av;
     setSeqPanel(new SeqPanel(av, this));
@@ -134,7 +144,11 @@ public class AlignmentPanel extends GAlignmentPanel implements
 
     annotationScroller.setViewportView(getAnnotationPanel());
     annotationSpaceFillerHolder.add(getAlabels(), BorderLayout.CENTER);
-
+    if (!av.isShowAnnotation())
+    {
+      annotationScroller.setVisible(false);
+      annotationSpaceFillerHolder.setVisible(false);
+    }
     scalePanelHolder.add(getScalePanel(), BorderLayout.CENTER);
     seqPanelHolder.add(getSeqPanel(), BorderLayout.CENTER);
 
@@ -578,7 +592,7 @@ public class AlignmentPanel extends GAlignmentPanel implements
    */
   public void updateLayout()
   {
-    fontChanged();
+    fontChanged(); // fires repaint
     setAnnotationVisible(av.isShowAnnotation());
     boolean wrap = av.getWrapAlignment();
     ViewportRanges ranges = av.getRanges();
@@ -831,6 +845,7 @@ public class AlignmentPanel extends GAlignmentPanel implements
 
       if (overviewPanel != null)
       {
+        getAlignment().resetColors();
         overviewPanel.updateOverviewImage();
       }
     }
@@ -845,6 +860,7 @@ public class AlignmentPanel extends GAlignmentPanel implements
   @Override
   public void paintComponent(Graphics g)
   {
+
     invalidate(); // needed so that the id width adjuster works correctly
 
     Dimension d = getIdPanel().getIdCanvas().getPreferredSize();
@@ -1148,13 +1164,13 @@ public class AlignmentPanel extends GAlignmentPanel implements
   public int getVisibleIdWidth(boolean onscreen)
   {
     // see if rendering offscreen - check preferences and calc width accordingly
-    if (!onscreen && Cache.getDefault("FIGURE_AUTOIDWIDTH", false))
+    if (!onscreen && Cache.getDefault(Preferences.FIGURE_AUTOIDWIDTH, false))
     {
       return calculateIdWidth(-1).width + 4;
     }
     Integer idwidth = null;
     if (onscreen || (idwidth = Cache
-            .getIntegerProperty("FIGURE_FIXEDIDWIDTH")) == null)
+            .getIntegerProperty(Preferences.FIGURE_FIXEDIDWIDTH)) == null)
     {
       int w = getIdPanel().getWidth();
       return (w > 0 ? w : calculateIdWidth().width + 4);
@@ -1376,8 +1392,7 @@ public class AlignmentPanel extends GAlignmentPanel implements
   {
     int seqPanelWidth = getSeqPanel().seqCanvas.getWidth();
 
-    if (System.getProperty("java.awt.headless") != null
-            && System.getProperty("java.awt.headless").equals("true"))
+    if (Jalview.isHeadlessMode())
     {
       seqPanelWidth = alignFrame.getWidth() - getVisibleIdWidth()
               - vscroll.getPreferredSize().width
@@ -1723,4 +1738,154 @@ public class AlignmentPanel extends GAlignmentPanel implements
     return calculationDialog;
   }
 
+  @Override
+  public SequenceRenderer getSequenceRenderer()
+  {
+    return seqPanel.seqCanvas.getSequenceRenderer();
+  }
+
+  public boolean scrollTo(int ostart, int end, int seqIndex,
+          boolean scrollToNearest, boolean redrawOverview)
+  {
+    int startv, endv, starts, ends;// , width;
+
+    int start = -1;
+    if (av.hasHiddenColumns())
+    {
+      AlignmentI al = av.getAlignment();
+      start = al.getHiddenColumns().absoluteToVisibleColumn(ostart);
+      end = al.getHiddenColumns().absoluteToVisibleColumn(end);
+      if (start == end)
+      {
+        if (!scrollToNearest && !al.getHiddenColumns().isVisible(ostart))
+        {
+          // don't scroll - position isn't visible
+          return false;
+        }
+      }
+    }
+    else
+    {
+      start = ostart;
+    }
+
+    ViewportRanges ranges = av.getRanges();
+    if (!av.getWrapAlignment())
+    {
+      /*
+       * int spos=av.getStartRes(),sqpos=av.getStartSeq(); if ((startv =
+       * av.getStartRes()) >= start) { spos=start-1; // seqIn //
+       * setScrollValues(start - 1, seqIndex); } else if ((endv =
+       * av.getEndRes()) <= end) { // setScrollValues(spos=startv + 1 + end -
+       * endv, seqIndex); spos=startv + 1 + end - endv; } else if ((starts =
+       * av.getStartSeq()) > seqIndex) { setScrollValues(av.getStartRes(),
+       * seqIndex); } else if ((ends = av.getEndSeq()) <= seqIndex) {
+       * setScrollValues(av.getStartRes(), starts + seqIndex - ends + 1); }
+       */
+
+      // below is scrolling logic up to Jalview 2.8.2
+      // if ((av.getStartRes() > end)
+      // || (av.getEndRes() < start)
+      // || ((av.getStartSeq() > seqIndex) || (av.getEndSeq() < seqIndex)))
+      // {
+      // if (start > av.getAlignment().getWidth() - hextent)
+      // {
+      // start = av.getAlignment().getWidth() - hextent;
+      // if (start < 0)
+      // {
+      // start = 0;
+      // }
+      //
+      // }
+      // if (seqIndex > av.getAlignment().getHeight() - vextent)
+      // {
+      // seqIndex = av.getAlignment().getHeight() - vextent;
+      // if (seqIndex < 0)
+      // {
+      // seqIndex = 0;
+      // }
+      // }
+      // setScrollValues(start, seqIndex);
+      // }
+      // logic copied from jalview.gui.AlignmentPanel:
+      if ((startv = ranges.getStartRes()) >= start)
+      {
+        /*
+         * Scroll left to make start of search results visible
+         */
+        setScrollValues(start - 1, seqIndex);
+      }
+      else if ((endv = ranges.getEndRes()) <= end)
+      {
+        /*
+         * Scroll right to make end of search results visible
+         */
+        setScrollValues(startv + 1 + end - endv, seqIndex);
+      }
+      else if ((starts = ranges.getStartSeq()) > seqIndex)
+      {
+        /*
+         * Scroll up to make start of search results visible
+         */
+        setScrollValues(ranges.getStartRes(), seqIndex);
+      }
+      else if ((ends = ranges.getEndSeq()) <= seqIndex)
+      {
+        /*
+         * Scroll down to make end of search results visible
+         */
+        setScrollValues(ranges.getStartRes(), starts + seqIndex - ends + 1);
+      }
+      /*
+       * Else results are already visible - no need to scroll
+       */
+    }
+    else
+    {
+      ranges.scrollToWrappedVisible(start);
+    }
+
+    paintAlignment(redrawOverview, false);
+    return true;
+  }
+
+  @Override
+  public void overviewDone(BufferedImage miniMe)
+  {
+    overviewPanel.canvas.finalizeDraw(miniMe);
+  }
+
+
+  private boolean holdRepaint = false;
+
+  public boolean getHoldRepaint()
+  {
+    return holdRepaint;
+  }
+
+  public void setHoldRepaint(boolean b)
+  {
+    if (holdRepaint == b)
+    {
+      return;
+    }
+    holdRepaint = b;
+    if (!b)
+    {
+      repaint();
+    }
+  }
+
+  @Override
+  public void repaint()
+  {
+    if (holdRepaint)
+    {
+      // System.out.println("AP repaint holding");
+      // Platform.stackTrace();
+      return;
+    }
+    super.repaint();
+  }
+
 }
index e89c1c2..a48553e 100644 (file)
@@ -283,9 +283,9 @@ public class AnnotationColourChooser extends AnnotationRowFilter
   private void setDefaultMinMax()
   {
     minColour.setBackground(
-            Cache.getDefaultColour("ANNOTATIONCOLOUR_MIN", Color.orange));
+            Cache.getDefaultColour(Preferences.ANNOTATIONCOLOUR_MIN, Color.orange));
     maxColour.setBackground(
-            Cache.getDefaultColour("ANNOTATIONCOLOUR_MAX", Color.red));
+            Cache.getDefaultColour(Preferences.ANNOTATIONCOLOUR_MAX, Color.red));
   }
 
   protected void showColourChooser(JPanel colourPanel, String titleKey)
@@ -301,7 +301,7 @@ public class AnnotationColourChooser extends AnnotationRowFilter
         updateView();
       }
     };
-    JalviewColourChooser.showColourChooser(Desktop.getDesktop(), ttl,
+    JalviewColourChooser.showColourChooser(Desktop.getDesktopPane(), ttl,
             colourPanel.getBackground(), listener);
   }
 
index fbc93b5..a1c082c 100644 (file)
@@ -79,11 +79,11 @@ public class AnnotationColumnChooser extends AnnotationRowFilter
 
   public static final int ACTION_OPTION_SELECT = 1;
 
-  public static int ACTION_OPTION_HIDE = 2;
+  public static final int ACTION_OPTION_HIDE = 2;
 
-  public static String NO_GRAPH_VIEW = "0";
+  public static final String NO_GRAPH_VIEW = "0";
 
-  public static String GRAPH_VIEW = "1";
+  public static final String GRAPH_VIEW = "1";
 
   private int actionOption = ACTION_OPTION_SELECT;
 
index a0a0df8..72d75b8 100755 (executable)
@@ -82,7 +82,7 @@ public class AnnotationLabels extends JPanel
   /**
    * height in pixels for allowing height adjuster to be active
    */
-  private static int HEIGHT_ADJUSTER_HEIGHT = 10;
+  private static final int HEIGHT_ADJUSTER_HEIGHT = 10;
 
   private static final Font font = new Font("Arial", Font.PLAIN, 11);
 
@@ -971,7 +971,7 @@ public class AnnotationLabels extends JPanel
             seqs, omitHidden, alignmentStartEnd);
 
     Toolkit.getDefaultToolkit().getSystemClipboard()
-            .setContents(new StringSelection(output), Desktop.instance);
+            .setContents(new StringSelection(output), Desktop.getInstance());
 
     HiddenColumns hiddenColumns = null;
 
@@ -981,7 +981,9 @@ public class AnnotationLabels extends JPanel
               av.getAlignment().getHiddenColumns());
     }
 
-    Desktop.jalviewClipboard = new Object[] { seqs, ds, // what is the dataset
+    Desktop.getInstance().jalviewClipboard = new Object[] { seqs, ds, // what is
+                                                                      // the
+                                                                      // dataset
                                                         // of a consensus
                                                         // sequence ? need to
                                                         // flag
index 4ead210..af7bc26 100755 (executable)
@@ -1133,6 +1133,7 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
 
     gg.dispose();
     
+
     fastPaint = true;
 
     // Call repaint on alignment panel so that repaints from other alignment
@@ -1297,18 +1298,23 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
     // Here we only want to fastpaint on a scroll, with resize using a normal
     // paint, so scroll events are identified as changes to the horizontal or
     // vertical start value.
-    if (evt.getPropertyName().equals(ViewportRanges.STARTRES))
+    switch (evt.getPropertyName())
     {
+    case ViewportRanges.STARTRES:
       fastPaint((int) evt.getNewValue() - (int) evt.getOldValue());
-    }
-    else if (evt.getPropertyName().equals(ViewportRanges.STARTRESANDSEQ))
-    {
+      break;
+    case ViewportRanges.STARTRESANDSEQ:
       fastPaint(((int[]) evt.getNewValue())[0]
               - ((int[]) evt.getOldValue())[0]);
-    }
-    else if (evt.getPropertyName().equals(ViewportRanges.MOVE_VIEWPORT))
-    {
+      break;
+    case ViewportRanges.MOVE_VIEWPORT:
       repaint();
+      break;
+    case ViewportRanges.STARTSEQ:
+    case ViewportRanges.ENDRES:
+    case ViewportRanges.ENDSEQ:
+      // ignore
+      break;
     }
   }
 
index e13df4a..5687219 100644 (file)
@@ -238,6 +238,8 @@ public class AppJmol extends StructureViewerBase
     // TODO: consider waiting until the structure/view is fully loaded before
     // displaying
     this.getContentPane().add(renderPanel, java.awt.BorderLayout.CENTER);
+    this.invalidate();
+    this.pack();
     jalview.gui.Desktop.addInternalFrame(this, jmb.getViewerTitle(),
             getBounds().width, getBounds().height);
     if (scriptWindow == null)
@@ -328,7 +330,7 @@ public class AppJmol extends StructureViewerBase
     for (String s : files)
     {
       fileList.append(SPACE).append(QUOTE)
-              .append(Platform.escapeBackslashes(s)).append(QUOTE);
+              .append(Platform.escapeString(s)).append(QUOTE);
     }
     String filesString = fileList.toString();
 
@@ -522,7 +524,7 @@ public class AppJmol extends StructureViewerBase
             addingStructures = true; // already files loaded.
             for (int c = 0; c < filesInViewer.length; c++)
             {
-              if (Platform.pathEquals(filesInViewer[c], file))
+              if (filesInViewer[c].equals(file))
               {
                 file = null;
                 break;
@@ -546,7 +548,7 @@ public class AppJmol extends StructureViewerBase
     }
     if (errormsgs.length() > 0)
     {
-      JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+      JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
               MessageManager.formatMessage(
                       "label.pdb_entries_couldnt_be_retrieved", new String[]
                       { errormsgs.toString() }),
@@ -563,6 +565,7 @@ public class AppJmol extends StructureViewerBase
    * 
    * @param type
    */
+  @Override
   public void makePDBImage(ImageMaker.TYPE type)
   {
     int width = getWidth();
@@ -626,15 +629,25 @@ public class AppJmol extends StructureViewerBase
     validate();
   }
 
+  @SuppressWarnings("serial")
   class RenderPanel extends JPanel
   {
     final Dimension currentSize = new Dimension();
 
+    public RenderPanel()
+    {
+      setPreferredSize(
+              Cache.getDefaultDim(Preferences.STRUCTURE_DIMENSIONS,
+                      Preferences.DEFAULT_STRUCTURE_DIMENSIONS));
+      // BH 2019.07.12 suggesting 600,600; current is something like 347 x 323
+    }
+
     @Override
     public void paintComponent(Graphics g)
     {
       getSize(currentSize);
-
+      // BH: Note that this size could be slightly different from the size set
+      // prior to packing.
       if (jmb != null && jmb.hasFileLoadingError())
       {
         g.setColor(Color.black);
index 3a64716..bb4528f 100644 (file)
@@ -80,11 +80,11 @@ public class AppVarna extends JInternalFrame
    * Lookup for sequence and annotation mapped to each RNA in the viewer. Using
    * a linked hashmap means that order is preserved when saved to the project.
    */
-  private Map<RNA, RnaModel> models = new LinkedHashMap<RNA, RnaModel>();
+  private Map<RNA, RnaModel> models = new LinkedHashMap<>();
 
-  private Map<RNA, ShiftList> offsets = new Hashtable<RNA, ShiftList>();
+  private Map<RNA, ShiftList> offsets = new Hashtable<>();
 
-  private Map<RNA, ShiftList> offsetsInv = new Hashtable<RNA, ShiftList>();
+  private Map<RNA, ShiftList> offsetsInv = new Hashtable<>();
 
   private JSplitPane split;
 
index 7430856..787ed53 100644 (file)
@@ -72,7 +72,7 @@ public class AppVarnaBinding extends JalviewVarnaBinding
 
   private ReorderableJList _sideList = null;
 
-  private static String errorOpt = "error";
+  private final static String errorOpt = "error";
 
   @SuppressWarnings("unused")
   private boolean _error;
@@ -100,7 +100,7 @@ public class AppVarnaBinding extends JalviewVarnaBinding
    */
   private void init()
   {
-    DefaultListModel<FullBackup> dlm = new DefaultListModel<FullBackup>();
+    DefaultListModel<FullBackup> dlm = new DefaultListModel<>();
 
     int marginTools = 40;
 
@@ -122,6 +122,7 @@ public class AppVarnaBinding extends JalviewVarnaBinding
     _sideList.setPreferredSize(new Dimension(100, 0));
     _sideList.addListSelectionListener(new ListSelectionListener()
     {
+      @Override
       public void valueChanged(ListSelectionEvent evt)
       {
         changeSelectedStructure_actionPerformed(evt);
@@ -316,7 +317,7 @@ public class AppVarnaBinding extends JalviewVarnaBinding
   {
     private DefaultListModel<FullBackup> _rnalist;
 
-    private List<RNA> _rnas = new ArrayList<RNA>();
+    private List<RNA> _rnas = new ArrayList<>();
 
     JList _l;
 
index fe0aedf..1f540da 100644 (file)
  */
 package jalview.gui;
 
-import jalview.api.StructureSelectionManagerProvider;
 import jalview.datamodel.PDBEntry;
 import jalview.datamodel.SequenceI;
 import jalview.io.DataSourceType;
 import jalview.io.StructureFile;
-import jalview.structure.StructureSelectionManager;
 import jalview.util.MessageManager;
 
-import javax.swing.JOptionPane;
-
 /**
- * GUI related routines for associating PDB files with sequences
+ * GUI related routines for associating PDB files with sequences. A single
+ * static method.
  * 
  * @author JimP
  * 
@@ -39,58 +36,56 @@ import javax.swing.JOptionPane;
 public class AssociatePdbFileWithSeq
 {
 
+  private AssociatePdbFileWithSeq()
+  {
+    // inaccessible
+  }
+
   /**
-   * assocate the given PDB file with
+   * Associate the given PDB file name or URL with a sequence. Do not map
+   * mouse-over events.
    * 
-   * @param choice
+   * @param fileName
+   *          or URL
+   * @param type
+   *          will be DataType.FILE or DataType.URL
    * @param sequence
+   *          to associate
+   * @param prompt
+   *          true if the user should be asked what to do if the specified file
+   *          does not seem to contain PDB information (StructureChooser only)
+   * @return null if file is not found
    */
-  public PDBEntry associatePdbWithSeq(String choice, DataSourceType file,
-          SequenceI sequence, boolean prompt,
-          StructureSelectionManagerProvider ssmp)
+  public static PDBEntry associatePdbWithSeq(String fileName,
+          DataSourceType type, SequenceI sequence, boolean prompt)
   {
     PDBEntry entry = new PDBEntry();
     StructureFile pdbfile = null;
-    pdbfile = StructureSelectionManager.getStructureSelectionManager(ssmp)
+    pdbfile = Desktop.getStructureSelectionManager()
             .setMapping(false, new SequenceI[]
-            { sequence }, null, choice, file);
+            { sequence }, null, fileName, type);
     if (pdbfile == null)
     {
       // stacktrace already thrown so just return
       return null;
     }
-    if (pdbfile.getId() == null)
-    {
-      String reply = null;
-
-      if (prompt)
-      {
-        reply = JvOptionPane.showInternalInputDialog(Desktop.desktop,
-                MessageManager
-                        .getString("label.couldnt_find_pdb_id_in_file"),
-                MessageManager.getString("label.no_pdb_id_in_file"),
-                JvOptionPane.QUESTION_MESSAGE);
-      }
-      if (reply == null)
-      {
-        return null;
-      }
-
-      entry.setId(reply);
-    }
-    else
+    String id = pdbfile.getId();
+    if (id == null && (id = (prompt
+            ? JvOptionPane.showInternalInputDialog(Desktop.getDesktopPane(),
+                    MessageManager
+                            .getString("label.couldnt_find_pdb_id_in_file"),
+                    MessageManager.getString("label.no_pdb_id_in_file"),
+                    JvOptionPane.QUESTION_MESSAGE)
+            : null)) == null)
     {
-      entry.setId(pdbfile.getId());
+      return null;
     }
+    entry.setId(id);
     entry.setType(PDBEntry.Type.FILE);
-
-    if (pdbfile != null)
-    {
-      entry.setFile(choice);
-      sequence.getDatasetSequence().addPDBId(entry);
-      StructureSelectionManager.getStructureSelectionManager(ssmp)
-              .registerPDBEntry(entry);
-    }
+    entry.setFile(fileName);
+    sequence.getDatasetSequence().addPDBId(entry);
+    Desktop.getInstance().getStructureSelectionManager()
+            .registerPDBEntry(entry);
     return entry;
   }
 }
index 757bb01..c515e6c 100644 (file)
@@ -537,7 +537,7 @@ public class BlogReader extends JPanel
     public LaunchJvBrowserOnItem(JList listItems)
     {
       super("Open in Browser");
-      this.putValue(MNEMONIC_KEY, Integer.valueOf(KeyEvent.VK_O));
+      this.putValue(MNEMONIC_KEY, new Integer(KeyEvent.VK_O));
       this.putValue(Action.LONG_DESCRIPTION, "Open in Browser");
       _listItems = listItems;
     }
index 097a5a0..13506a5 100644 (file)
@@ -62,8 +62,13 @@ import javax.swing.event.InternalFrameAdapter;
 import javax.swing.event.InternalFrameEvent;
 
 /**
- * A dialog where a user can choose and action Tree or PCA calculation options
+ * A dialog where a user can choose and action Tree or PCA calculation options.
+ * 
+ * Allows also for dialog-free static methods openPCAPanel(...) and
+ * openTreePanel(...) for scripted use.
+ * 
  */
+@SuppressWarnings("serial")
 public class CalculationChooser extends JPanel
 {
   /*
@@ -74,7 +79,7 @@ public class CalculationChooser extends JPanel
    */
   private static boolean treeMatchGaps = true;
 
-  private static final Font VERDANA_11PT = new Font("Verdana", 0, 11);
+  private static Font VERDANA_11PT;
 
   private static final int MIN_TREE_SELECTION = 3;
 
@@ -102,7 +107,7 @@ public class CalculationChooser extends JPanel
 
   private JCheckBox shorterSequence;
 
-  final ComboBoxTooltipRenderer renderer = new ComboBoxTooltipRenderer();
+  private static ComboBoxTooltipRenderer renderer; // BH was not static
 
   List<String> tips = new ArrayList<>();
 
@@ -112,6 +117,37 @@ public class CalculationChooser extends JPanel
   private PCAPanel pcaPanel;
 
   /**
+   * Open a new Tree panel on the desktop statically. Params are standard (not
+   * set by Groovy). No dialog is opened.
+   * 
+   * @param af
+   * @param treeType
+   * @param modelName
+   * @return null if successful; the string
+   *         "label.you_need_at_least_n_sequences" if number of sequences
+   *         selected is inappropriate
+   */
+  public static Object openTreePanel(AlignFrame af, String treeType,
+          String modelName)
+  {
+    return openTreePanel(af, treeType, modelName, null);
+  }
+
+  /**
+   * public static method for JalviewJS API to open a PCAPanel without
+   * necessarily using a dialog.
+   * 
+   * @param af
+   * @param modelName
+   * @return the PCAPanel, or the string "label.you_need_at_least_n_sequences"
+   *         if number of sequences selected is inappropriate
+   */
+  public static Object openPcaPanel(AlignFrame af, String modelName)
+  {
+    return openPcaPanel(af, modelName, null);
+  }
+
+  /**
    * Constructor
    * 
    * @param af
@@ -232,6 +268,10 @@ public class CalculationChooser extends JPanel
     paramsPanel.add(includeGappedColumns);
     paramsPanel.add(shorterSequence);
 
+    if (VERDANA_11PT == null)
+    {
+      VERDANA_11PT = new Font("Verdana", 0, 11);
+    }
     /*
      * OK / Cancel buttons
      */
@@ -380,7 +420,11 @@ public class CalculationChooser extends JPanel
    */
   protected JComboBox<String> buildModelOptionsList()
   {
-    final JComboBox<String> scoreModelsCombo = new JComboBox<>();
+    JComboBox<String> scoreModelsCombo = new JComboBox<>();
+    if (renderer == null)
+    {
+      renderer = new ComboBoxTooltipRenderer();
+    }
     scoreModelsCombo.setRenderer(renderer);
 
     /*
@@ -500,7 +544,8 @@ public class CalculationChooser extends JPanel
      * for backwards compatibility with Jalview < 2.8 (JAL-2962)
      */
     if (nucleotide && forPca
-            && Cache.getDefault("BLOSUM62_PCA_FOR_NUCLEOTIDE", false))
+            && Cache.getDefault(Preferences.BLOSUM62_PCA_FOR_NUCLEOTIDE,
+                    false))
     {
       filtered.add(scoreModels.getBlosum62());
     }
@@ -537,6 +582,63 @@ public class CalculationChooser extends JPanel
    */
   protected void openTreePanel(String modelName, SimilarityParamsI params)
   {
+    Object ret = openTreePanel(af,
+            neighbourJoining.isSelected() ? TreeBuilder.NEIGHBOUR_JOINING
+                    : TreeBuilder.AVERAGE_DISTANCE,
+            modelName, params);
+    if (ret instanceof String)
+    {
+      JvOptionPane.showMessageDialog(this, // was opening on Desktop?
+              MessageManager.formatMessage(
+                      (String) ret,
+                      MIN_TREE_SELECTION),
+              MessageManager.getString("label.not_enough_sequences"),
+              JvOptionPane.WARNING_MESSAGE);
+
+    }
+  }
+
+  /**
+   * Open a new PCA panel on the desktop
+   * 
+   * @param modelName
+   * @param params
+   */
+  protected void openPcaPanel(String modelName, SimilarityParamsI params)
+  {
+    Object ret = openPcaPanel(af, modelName, params);
+    if (ret instanceof String)
+    {
+      JvOptionPane.showInternalMessageDialog(this,
+              MessageManager.formatMessage(
+                      (String) ret,
+                      MIN_PCA_SELECTION),
+              MessageManager
+                      .getString("label.sequence_selection_insufficient"),
+              JvOptionPane.WARNING_MESSAGE);
+    }
+    else
+    {
+      // only used for test suite
+      pcaPanel = (PCAPanel) ret;
+    }
+
+  }
+
+  /**
+   * Open a new Tree panel on the desktop statically
+   * 
+   * @param af
+   * @param treeType
+   * @param modelName
+   * @param params
+   * @return null, or the string "label.you_need_at_least_n_sequences" if number
+   *         of sequences selected is inappropriate
+   */
+  public static Object openTreePanel(AlignFrame af, String treeType,
+          String modelName, SimilarityParamsI params)
+  {
+
     /*
      * gui validation shouldn't allow insufficient sequences here, but leave
      * this check in in case this method gets exposed programmatically in future
@@ -545,56 +647,58 @@ public class CalculationChooser extends JPanel
     SequenceGroup sg = viewport.getSelectionGroup();
     if (sg != null && sg.getSize() < MIN_TREE_SELECTION)
     {
-      JvOptionPane.showMessageDialog(Desktop.desktop,
-              MessageManager.formatMessage(
-                      "label.you_need_at_least_n_sequences",
-                      MIN_TREE_SELECTION),
-              MessageManager.getString("label.not_enough_sequences"),
-              JvOptionPane.WARNING_MESSAGE);
-      return;
+      return "label.you_need_at_least_n_sequences";
+    }
+
+    if (params == null)
+    {
+      params = getSimilarityParameters(false);
     }
 
-    String treeType = neighbourJoining.isSelected()
-            ? TreeBuilder.NEIGHBOUR_JOINING
-            : TreeBuilder.AVERAGE_DISTANCE;
     af.newTreePanel(treeType, modelName, params);
+    return null;
   }
 
   /**
-   * Open a new PCA panel on the desktop
+   * public static method for JalviewJS API
    * 
+   * @param af
    * @param modelName
    * @param params
+   * @return the PCAPanel, or null if number of sequences selected is
+   *         inappropriate
    */
-  protected void openPcaPanel(String modelName, SimilarityParamsI params)
+  public static Object openPcaPanel(AlignFrame af, String modelName,
+          SimilarityParamsI params)
   {
+
     AlignViewport viewport = af.getViewport();
 
     /*
      * gui validation shouldn't allow insufficient sequences here, but leave
      * this check in in case this method gets exposed programmatically in future
+     * 
+     * 
      */
     if (((viewport.getSelectionGroup() != null)
             && (viewport.getSelectionGroup().getSize() < MIN_PCA_SELECTION)
             && (viewport.getSelectionGroup().getSize() > 0))
             || (viewport.getAlignment().getHeight() < MIN_PCA_SELECTION))
     {
-      JvOptionPane.showInternalMessageDialog(this,
-              MessageManager.formatMessage(
-                      "label.you_need_at_least_n_sequences",
-                      MIN_PCA_SELECTION),
-              MessageManager
-                      .getString("label.sequence_selection_insufficient"),
-              JvOptionPane.WARNING_MESSAGE);
-      return;
+      return "label.you_need_at_least_n_sequences";
+    }
+
+    if (params == null)
+    {
+      params = getSimilarityParameters(true);
     }
 
     /*
      * construct the panel and kick off its calculation thread
      */
-    pcaPanel = new PCAPanel(af.alignPanel, modelName, params);
-    new Thread(pcaPanel).start();
-
+    PCAPanel pcap = new PCAPanel(af.alignPanel, modelName, params);
+    new Thread(pcap).start();
+    return pcap;
   }
 
   /**
@@ -610,6 +714,7 @@ public class CalculationChooser extends JPanel
     }
   }
 
+
   /**
    * Returns a data bean holding parameters for similarity (or distance) model
    * calculation
@@ -617,7 +722,8 @@ public class CalculationChooser extends JPanel
    * @param doPCA
    * @return
    */
-  protected SimilarityParamsI getSimilarityParameters(boolean doPCA)
+  public static SimilarityParamsI getSimilarityParameters(
+          boolean doPCA)
   {
     // commented out: parameter choices read from gui widgets
     // SimilarityParamsI params = new SimilarityParams(
@@ -638,6 +744,7 @@ public class CalculationChooser extends JPanel
 
     return new SimilarityParams(includeGapGap, matchGap, includeGapResidue,
             matchOnShortestLength);
+
   }
 
   /**
@@ -655,6 +762,7 @@ public class CalculationChooser extends JPanel
 
   public PCAPanel getPcaPanel()
   {
+    // only called for FreeUpMemoryTest
     return pcaPanel;
   }
 }
index c6d6e97..fff1eed 100644 (file)
@@ -336,7 +336,7 @@ public class ChimeraViewFrame extends StructureViewerBase
 
     if (!jmb.launchChimera())
     {
-      JvOptionPane.showMessageDialog(Desktop.desktop,
+      JvOptionPane.showMessageDialog(Desktop.getDesktopPane(),
               MessageManager.getString("label.chimera_failed"),
               MessageManager.getString("label.error_loading_file"),
               JvOptionPane.ERROR_MESSAGE);
@@ -481,7 +481,7 @@ public class ChimeraViewFrame extends StructureViewerBase
         {
           filePDB.add(thePdbEntry);
           filePDBpos.add(Integer.valueOf(pi));
-          files.append(" \"" + Platform.escapeBackslashes(file) + "\"");
+          files.append(" \"" + Platform.escapeString(file) + "\"");
         }
       }
     } catch (OutOfMemoryError oomerror)
@@ -497,7 +497,7 @@ public class ChimeraViewFrame extends StructureViewerBase
     if (errormsgs.length() > 0)
     {
 
-      JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+      JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
               MessageManager.formatMessage(
                       "label.pdb_entries_couldnt_be_retrieved", new Object[]
                       { errormsgs.toString() }),
index 6eab07d..5528e75 100644 (file)
@@ -158,7 +158,7 @@ public class ColourMenuHelper
             ActionListener al = radioItem.getActionListeners()[0];
             radioItem.removeActionListener(al);
             int option = JvOptionPane.showInternalConfirmDialog(
-                    Desktop.desktop,
+                    Desktop.getDesktopPane(),
                     MessageManager
                             .getString("label.remove_from_default_list"),
                     MessageManager
@@ -281,7 +281,7 @@ public class ColourMenuHelper
   static void updatePreferences()
   {
     StringBuilder coloursFound = new StringBuilder();
-    String[] files = Cache.getProperty("USER_DEFINED_COLOURS").split("\\|");
+    String[] files = Cache.getProperty(Preferences.USER_DEFINED_COLOURS).split("\\|");
 
     /*
      * the property does not include the scheme name, it is in the file;
@@ -310,11 +310,11 @@ public class ColourMenuHelper
 
     if (coloursFound.toString().length() > 1)
     {
-      Cache.setProperty("USER_DEFINED_COLOURS", coloursFound.toString());
+      Cache.setProperty(Preferences.USER_DEFINED_COLOURS, coloursFound.toString());
     }
     else
     {
-      Cache.applicationProperties.remove("USER_DEFINED_COLOURS");
+      Cache.removePropertyNoSave(Preferences.USER_DEFINED_COLOURS);
     }
   }
 }
index 684f965..a601ed6 100644 (file)
@@ -48,7 +48,8 @@ public class ComboBoxTooltipRenderer extends DefaultListCellRenderer
     JComponent comp = (JComponent) super.getListCellRendererComponent(list,
             value, index, isSelected, cellHasFocus);
 
-    if (-1 < index && null != value && null != tooltips)
+    // BH 2019.07.07 restricting this to mouse moves over the selected target
+    if (isSelected && -1 < index && null != value && null != tooltips)
     {
       list.setToolTipText(tooltips.get(index));
     }
index 2e88eeb..f44dae1 100644 (file)
@@ -136,7 +136,7 @@ public class Console extends WindowAdapter
     }
     quit = false; // signals the Threads that they should exit
 
-    // Starting two seperate threads to read from the PipedInputStreams
+    // Starting two separate threads to read from the PipedInputStreams
     //
     reader = new Thread(this);
     reader.setDaemon(true);
@@ -313,7 +313,8 @@ public class Console extends WindowAdapter
     initConsole(false);
     JalviewAppender jappender = new JalviewAppender();
     jappender.setLayout(new SimpleLayout());
-    JalviewAppender.setTextArea(textArea);
+    // BH 2019 JalviewAppender.setTextArea(textArea);
+    jappender.setTextArea(textArea);
     org.apache.log4j.Logger.getRootLogger().addAppender(jappender);
   }
 
index b5275e8..f607686 100644 (file)
@@ -34,7 +34,6 @@ import jalview.datamodel.SequenceI;
 import jalview.ext.ensembl.EnsemblInfo;
 import jalview.ext.ensembl.EnsemblMap;
 import jalview.io.gff.SequenceOntologyI;
-import jalview.structure.StructureSelectionManager;
 import jalview.util.DBRefUtils;
 import jalview.util.MapList;
 import jalview.util.MappingUtils;
@@ -108,7 +107,8 @@ public class CrossRefAction implements Runnable
       /*
        * get display scheme (if any) to apply to features
        */
-      FeatureSettingsModelI featureColourScheme = new SequenceFetcher()
+      FeatureSettingsModelI featureColourScheme = SequenceFetcher
+              .getInstance()
               .getFeatureColourScheme(source);
 
       AlignmentI xrefsAlignment = makeCrossReferencesAlignment(dataset,
@@ -141,7 +141,7 @@ public class CrossRefAction implements Runnable
        */
       AlignFrame newFrame = new AlignFrame(xrefsAlignment,
               AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT);
-      if (Cache.getDefault("HIDE_INTRONS", true))
+      if (Cache.getDefault(Preferences.HIDE_INTRONS, true))
       {
         newFrame.hideFeatureColumns(SequenceOntologyI.EXON, false);
       }
@@ -276,7 +276,7 @@ public class CrossRefAction implements Runnable
       return;
     }
     
-    Set<String> ensemblDivisions = new EnsemblInfo().getDivisions();
+    Set<String> ensemblDivisions = EnsemblInfo.getDivisions();
     
     /*
      * first look for direct dbrefs from sequence to Ensembl
@@ -436,14 +436,12 @@ public class CrossRefAction implements Runnable
     copyAlignment
             .setGapCharacter(alignFrame.viewport.getGapCharacter());
 
-    StructureSelectionManager ssm = StructureSelectionManager
-            .getStructureSelectionManager(Desktop.instance);
-
     /*
      * register any new mappings for sequence mouseover etc
      * (will not duplicate any previously registered mappings)
      */
-    ssm.registerMappings(dataset.getCodonFrames());
+    Desktop.getStructureSelectionManager()
+            .registerMappings(dataset.getCodonFrames());
 
     if (copyAlignment.getHeight() <= 0)
     {
index d328a0d..3514b75 100644 (file)
@@ -234,7 +234,7 @@ public class CutAndPasteTransfer extends GCutAndPasteTransfer
               .println(MessageManager.getString("label.couldnt_read_data"));
       if (!Jalview.isHeadlessMode())
       {
-        JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+        JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
                 AppletFormatAdapter.getSupportedFormats(),
                 MessageManager.getString("label.couldnt_read_data"),
                 JvOptionPane.WARNING_MESSAGE);
@@ -253,7 +253,7 @@ public class CutAndPasteTransfer extends GCutAndPasteTransfer
 
     } catch (IOException ex)
     {
-      JvOptionPane.showInternalMessageDialog(Desktop.desktop, MessageManager
+      JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(), MessageManager
               .formatMessage("label.couldnt_read_pasted_text", new String[]
               { ex.toString() }),
               MessageManager.getString("label.error_parsing_text"),
@@ -330,7 +330,8 @@ public class CutAndPasteTransfer extends GCutAndPasteTransfer
         try
         {
           af.setMaximum(
-                  jalview.bin.Cache.getDefault("SHOW_FULLSCREEN", false));
+                  jalview.bin.Cache.getDefault(Preferences.SHOW_FULLSCREEN,
+                          false));
         } catch (Exception ex)
         {
         }
@@ -342,7 +343,7 @@ public class CutAndPasteTransfer extends GCutAndPasteTransfer
               .println(MessageManager.getString("label.couldnt_read_data"));
       if (!Jalview.isHeadlessMode())
       {
-        JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+        JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
                 AppletFormatAdapter.getSupportedFormats(),
                 MessageManager.getString("label.couldnt_read_data"),
                 JvOptionPane.WARNING_MESSAGE);
index 9dd46d6..ace7529 100644 (file)
@@ -22,6 +22,9 @@ package jalview.gui;
 
 import jalview.api.AlignViewportI;
 import jalview.api.AlignmentViewPanel;
+import jalview.api.StructureSelectionManagerProvider;
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
 import jalview.bin.Cache;
 import jalview.bin.Jalview;
 import jalview.gui.ImageExporter.ImageWriterI;
@@ -36,6 +39,7 @@ import jalview.io.FormatAdapter;
 import jalview.io.IdentifyFile;
 import jalview.io.JalviewFileChooser;
 import jalview.io.JalviewFileView;
+import jalview.jbgui.GDesktop;
 import jalview.jbgui.GSplitFrame;
 import jalview.jbgui.GStructureViewer;
 import jalview.project.Jalview2XML;
@@ -47,6 +51,7 @@ import jalview.util.MessageManager;
 import jalview.util.Platform;
 import jalview.util.UrlConstants;
 import jalview.viewmodel.AlignmentViewport;
+import jalview.ws.jws1.Discoverer;
 import jalview.ws.params.ParamManager;
 import jalview.ws.utils.UrlDownloadClient;
 
@@ -82,11 +87,9 @@ import java.beans.PropertyChangeListener;
 import java.io.BufferedInputStream;
 import java.io.File;
 import java.io.FileOutputStream;
-import java.io.FileWriter;
 import java.io.IOException;
 import java.net.URL;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.Hashtable;
 import java.util.List;
 import java.util.ListIterator;
@@ -108,6 +111,7 @@ import javax.swing.JCheckBox;
 import javax.swing.JComboBox;
 import javax.swing.JComponent;
 import javax.swing.JDesktopPane;
+import javax.swing.JFrame;
 import javax.swing.JInternalFrame;
 import javax.swing.JLabel;
 import javax.swing.JMenuItem;
@@ -133,30 +137,28 @@ import org.stackoverflowusers.file.WindowsShortcut;
  * @author $author$
  * @version $Revision: 1.155 $
  */
-public class Desktop extends jalview.jbgui.GDesktop
+@SuppressWarnings("serial")
+public class Desktop extends GDesktop
         implements DropTargetListener, ClipboardOwner, IProgressIndicator,
-        jalview.api.StructureSelectionManagerProvider
+        StructureSelectionManagerProvider, ApplicationSingletonI
 {
-  private static int DEFAULT_MIN_WIDTH = 300;
 
-  private static int DEFAULT_MIN_HEIGHT = 250;
+  private final static int DEFAULT_MIN_WIDTH = 300;
 
-  private static int ALIGN_FRAME_DEFAULT_MIN_WIDTH = 600;
+  private final static int DEFAULT_MIN_HEIGHT = 250;
 
-  private static int ALIGN_FRAME_DEFAULT_MIN_HEIGHT = 70;
+  private final static int ALIGN_FRAME_DEFAULT_MIN_WIDTH = 600;
 
-  private static final String EXPERIMENTAL_FEATURES = "EXPERIMENTAL_FEATURES";
+  private final static int ALIGN_FRAME_DEFAULT_MIN_HEIGHT = 70;
 
-  protected static final String CONFIRM_KEYBOARD_QUIT = "CONFIRM_KEYBOARD_QUIT";
-
-  public static HashMap<String, FileWriter> savingFiles = new HashMap<>();
+  private final static String EXPERIMENTAL_FEATURES = "EXPERIMENTAL_FEATURES";
 
   private JalviewChangeSupport changeSupport = new JalviewChangeSupport();
 
   /**
    * news reader - null if it was never started.
    */
-  private BlogReader jvnews = null;
+  BlogReader jvnews = null;
 
   private File projectFile;
 
@@ -195,16 +197,16 @@ public class Desktop extends jalview.jbgui.GDesktop
             listener);
   }
 
-  /** Singleton Desktop instance */
-  public static Desktop instance;
-
-  public static MyDesktopPane desktop;
+  public static MyDesktopPane getDesktopPane()
+  {
+    Desktop desktop = Desktop.getInstance();
+    return desktop == null ? null : desktop.desktopPane;
+  }
 
-  public static MyDesktopPane getDesktop()
+  public static StructureSelectionManager getStructureSelectionManager()
   {
-    // BH 2018 could use currentThread() here as a reference to a
-    // Hashtable<Thread, MyDesktopPane> in JavaScript
-    return desktop;
+    return StructureSelectionManager
+            .getStructureSelectionManager(getInstance());
   }
 
   static int openFrameCount = 0;
@@ -213,13 +215,22 @@ public class Desktop extends jalview.jbgui.GDesktop
 
   static final int yOffset = 30;
 
-  public static jalview.ws.jws1.Discoverer discoverer;
+  public Discoverer discoverer;
+
+  public Object[] jalviewClipboard;
+
+  public boolean internalCopy = false;
+
+  private static int fileLoadingCount = 0;
 
-  public static Object[] jalviewClipboard;
+  public JInternalFrame conservationSlider;
 
-  public static boolean internalCopy = false;
+  public JInternalFrame PIDSlider;
 
-  static int fileLoadingCount = 0;
+  /**
+   * just an instance (for testng, probably); no actual frames
+   */
+  private boolean instanceOnly;
 
   class MyDesktopManager implements DesktopManager
   {
@@ -240,7 +251,7 @@ public class Desktop extends jalview.jbgui.GDesktop
       } catch (NullPointerException npe)
       {
         Point p = getMousePosition();
-        instance.showPasteMenu(p.x, p.y);
+        showPasteMenu(p.x, p.y);
       }
     }
 
@@ -288,14 +299,14 @@ public class Desktop extends jalview.jbgui.GDesktop
     public void endDraggingFrame(JComponent f)
     {
       delegate.endDraggingFrame(f);
-      desktop.repaint();
+      desktopPane.repaint();
     }
 
     @Override
     public void endResizingFrame(JComponent f)
     {
       delegate.endResizingFrame(f);
-      desktop.repaint();
+      desktopPane.repaint();
     }
 
     @Override
@@ -344,100 +355,89 @@ public class Desktop extends jalview.jbgui.GDesktop
 
   }
 
+  public MyDesktopPane desktopPane;
+
+  /**
+   * Answers an 'application scope' singleton instance of this class. Separate
+   * SwingJS 'applets' running in the same browser page will each have a
+   * distinct instance of Desktop.
+   * 
+   * @return
+   */
+  public static Desktop getInstance()
+  {
+    return Jalview.isHeadlessMode() ? null
+            : (Desktop) ApplicationSingletonProvider
+                    .getInstance(Desktop.class);
+  }
+
+  /**
+   * For testing.
+   * 
+   * @param forInstance
+   */
+  public Desktop(boolean forInstance)
+  {
+
+    Cache.initLogger();
+    instanceOnly = true;
+  }
+  
   /**
-   * Creates a new Desktop object.
+   * Private constructor enforces singleton pattern. It is called by reflection
+   * from ApplicationSingletonProvider.getInstance().
    */
-  public Desktop()
+  @SuppressWarnings("unused")
+  private Desktop()
   {
-    super();
+    Cache.initLogger();
+    try
+    {
     /**
      * A note to implementors. It is ESSENTIAL that any activities that might
      * block are spawned off as threads rather than waited for during this
      * constructor.
      */
-    instance = this;
     if (!Platform.isJS())
     {
       doVamsasClientCheck();
     }
-
+    
     doConfigureStructurePrefs();
     setTitle("Jalview " + jalview.bin.Cache.getProperty("VERSION"));
-    /*
-    if (!Platform.isAMac())
-    {
-      // this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
-    }
-    else
-    {
-     this.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
-    }
-    */
-
-    try
-    {
-           if (!Platform.isJS())
-                   /*
-                    * @j2sIgnore
-                    */
-           {
-             APQHandlers.setAPQHandlers(this);
-           }
-    } catch (Exception e)
-    {
-      System.out.println("Cannot set APQHandlers");
-      // e.printStackTrace();
-    } catch (Throwable t)
-    {
-      System.out.println("Cannot set APQHandlers");
-      // t.printStackTrace();
-    }
-
-
-    addWindowListener(new WindowAdapter()
-    {
-
-      @Override
-      public void windowClosing(WindowEvent ev)
-      {
-        quit();
-      }
-    });
-
+    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     boolean selmemusage = jalview.bin.Cache.getDefault("SHOW_MEMUSAGE",
             false);
-
     boolean showjconsole = jalview.bin.Cache.getDefault("SHOW_JAVA_CONSOLE",
             false);
-    desktop = new MyDesktopPane(selmemusage);
-
+    desktopPane = new MyDesktopPane(selmemusage);
+    
     showMemusage.setSelected(selmemusage);
-    desktop.setBackground(Color.white);
-
+    desktopPane.setBackground(Color.white);
     getContentPane().setLayout(new BorderLayout());
     // alternate config - have scrollbars - see notes in JAL-153
     // JScrollPane sp = new JScrollPane();
     // sp.getViewport().setView(desktop);
     // getContentPane().add(sp, BorderLayout.CENTER);
-
+    
     // BH 2018 - just an experiment to try unclipped JInternalFrames.
     if (Platform.isJS())
     {
       getRootPane().putClientProperty("swingjs.overflow.hidden", "false");
     }
-
-    getContentPane().add(desktop, BorderLayout.CENTER);
-    desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
-
+    
+    getContentPane().add(desktopPane, BorderLayout.CENTER);
+    desktopPane.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
+    
     // This line prevents Windows Look&Feel resizing all new windows to maximum
     // if previous window was maximised
-    desktop.setDesktopManager(new MyDesktopManager(
+    desktopPane.setDesktopManager(new MyDesktopManager(
             (Platform.isWindowsAndNotJS() ? new DefaultDesktopManager()
                     : Platform.isAMacAndNotJS()
                             ? new AquaInternalFrameManager(
-                                    desktop.getDesktopManager())
-                            : desktop.getDesktopManager())));
-
+                                    desktopPane.getDesktopManager())
+                            : desktopPane.getDesktopManager())));
+    
     Rectangle dims = getLastKnownDimensions("");
     if (dims != null)
     {
@@ -450,7 +450,7 @@ public class Desktop extends jalview.jbgui.GDesktop
       int yPos = Math.max(5, (screenSize.height - 650) / 2);
       setBounds(xPos, yPos, 900, 650);
     }
-
+    
     if (!Platform.isJS())
     /**
      * Java only
@@ -458,7 +458,7 @@ public class Desktop extends jalview.jbgui.GDesktop
      * @j2sIgnore
      */
     {
-
+    
       jconsole = new Console(this, showjconsole);
       // add essential build information
       jconsole.setHeader("Jalview Version: "
@@ -470,27 +470,20 @@ public class Desktop extends jalview.jbgui.GDesktop
               + "Java version: " + System.getProperty("java.version") + "\n"
               + System.getProperty("os.arch") + " "
               + System.getProperty("os.name") + " "
-              + System.getProperty("os.version")
-              + (jalview.bin.Cache.getProperty("VERSION").equals("DEVELOPMENT")
-                              ? "\nJava path:"
-                                      + System.getProperty(
-                                              "java.home")
-                                      + File.separator + "bin"
-                                      + File.separator + "java"
-                              : ""));
-
+              + System.getProperty("os.version"));
+    
       showConsole(showjconsole);
-
+    
       showNews.setVisible(false);
-
+    
       experimentalFeatures.setSelected(showExperimental());
-
+    
       getIdentifiersOrgData();
-
+    
       checkURLLinks();
-
+    
       // Spawn a thread that shows the splashscreen
-
+    
       SwingUtilities.invokeLater(new Runnable()
       {
         @Override
@@ -499,9 +492,10 @@ public class Desktop extends jalview.jbgui.GDesktop
           new SplashScreen();
         }
       });
-
+    
       // Thread off a new instance of the file chooser - this reduces the time
-      // it takes to open it later on.
+      // it
+      // takes to open it later on.
       new Thread(new Runnable()
       {
         @Override
@@ -518,7 +512,7 @@ public class Desktop extends jalview.jbgui.GDesktop
       changeSupport.addJalviewPropertyChangeListener("services",
               new PropertyChangeListener()
               {
-
+    
                 @Override
                 public void propertyChange(PropertyChangeEvent evt)
                 {
@@ -526,13 +520,13 @@ public class Desktop extends jalview.jbgui.GDesktop
                           + evt.getNewValue());
                   JalviewServicesChanged(evt);
                 }
-
+    
               });
-
+    
     }
-
-    this.setDropTarget(new java.awt.dnd.DropTarget(desktop, this));
-
+    
+    this.setDropTarget(new java.awt.dnd.DropTarget(desktopPane, this));
+    
     this.addWindowListener(new WindowAdapter()
     {
       @Override
@@ -541,7 +535,7 @@ public class Desktop extends jalview.jbgui.GDesktop
         quit();
       }
     });
-
+    
     MouseAdapter ma;
     this.addMouseListener(ma = new MouseAdapter()
     {
@@ -553,7 +547,7 @@ public class Desktop extends jalview.jbgui.GDesktop
           showPasteMenu(evt.getX(), evt.getY());
         }
       }
-
+    
       @Override
       public void mouseReleased(MouseEvent evt)
       {
@@ -563,8 +557,11 @@ public class Desktop extends jalview.jbgui.GDesktop
         }
       }
     });
-    desktop.addMouseListener(ma);
-
+    desktopPane.addMouseListener(ma);
+    } catch (Throwable t)
+    {
+      t.printStackTrace();
+    }
   }
 
   /**
@@ -628,10 +625,10 @@ public class Desktop extends jalview.jbgui.GDesktop
       public void run()
       {
         Cache.log.debug("Downloading data from identifiers.org");
-        UrlDownloadClient client = new UrlDownloadClient();
+        // UrlDownloadClient client = new UrlDownloadClient();
         try
         {
-          client.download(IdOrgSettings.getUrl(),
+          UrlDownloadClient.download(IdOrgSettings.getUrl(),
                   IdOrgSettings.getDownloadLocation());
         } catch (IOException e)
         {
@@ -649,7 +646,7 @@ public class Desktop extends jalview.jbgui.GDesktop
     showNews(showNews.isSelected());
   }
 
-  void showNews(boolean visible)
+  protected void showNews(boolean visible)
   {
     Cache.log.debug((visible ? "Showing" : "Hiding") + " news.");
     showNews.setSelected(visible);
@@ -661,10 +658,10 @@ public class Desktop extends jalview.jbgui.GDesktop
         public void run()
         {
           long now = System.currentTimeMillis();
-          Desktop.instance.setProgressBar(
+          setProgressBar(
                   MessageManager.getString("status.refreshing_news"), now);
           jvnews.refreshNews();
-          Desktop.instance.setProgressBar(null, now);
+          setProgressBar(null, now);
           jvnews.showNews();
         }
       }).start();
@@ -769,7 +766,7 @@ public class Desktop extends jalview.jbgui.GDesktop
     }
   }
 
-  void showPasteMenu(int x, int y)
+  protected void showPasteMenu(int x, int y)
   {
     JPopupMenu popup = new JPopupMenu();
     JMenuItem item = new JMenuItem(
@@ -802,7 +799,7 @@ public class Desktop extends jalview.jbgui.GDesktop
         FileFormatI format = new IdentifyFile().identify(file,
                 DataSourceType.PASTE);
 
-        new FileLoader().LoadFile(file, DataSourceType.PASTE, format);
+        new FileLoader().loadFile(file, DataSourceType.PASTE, format);
 
       }
     } catch (Exception ex)
@@ -897,13 +894,14 @@ public class Desktop extends jalview.jbgui.GDesktop
           int w, int h, boolean resizable, boolean ignoreMinSize)
   {
 
+
     // TODO: allow callers to determine X and Y position of frame (eg. via
     // bounds object).
     // TODO: consider fixing method to update entries in the window submenu with
     // the current window title
 
     frame.setTitle(title);
-    if (frame.getWidth() < 1 || frame.getHeight() < 1)
+    if (w > 0 && (frame.getWidth() < 1 || frame.getHeight() < 1))
     {
       frame.setSize(w, h);
     }
@@ -911,8 +909,7 @@ public class Desktop extends jalview.jbgui.GDesktop
     // A HEADLESS STATE WHEN NO DESKTOP EXISTS. MUST RETURN
     // IF JALVIEW IS RUNNING HEADLESS
     // ///////////////////////////////////////////////
-    if (instance == null || (System.getProperty("java.awt.headless") != null
-            && System.getProperty("java.awt.headless").equals("true")))
+    if (Jalview.isHeadlessMode() || Desktop.getInstance().instanceOnly)
     {
       return;
     }
@@ -952,13 +949,13 @@ public class Desktop extends jalview.jbgui.GDesktop
      * add an entry for the new frame in the Window menu 
      * (and remove it when the frame is closed)
      */
-    final JMenuItem menuItem = new JMenuItem(title);
+    JMenuItem menuItem = new JMenuItem(title);
     frame.addInternalFrameListener(new InternalFrameAdapter()
     {
       @Override
       public void internalFrameActivated(InternalFrameEvent evt)
       {
-        JInternalFrame itf = desktop.getSelectedFrame();
+        JInternalFrame itf = getDesktopPane().getSelectedFrame();
         if (itf != null)
         {
           if (itf instanceof AlignFrame)
@@ -990,7 +987,7 @@ public class Desktop extends jalview.jbgui.GDesktop
         {
           menuItem.removeActionListener(menuItem.getActionListeners()[0]);
         }
-        windowMenu.remove(menuItem);
+        Desktop.getInstance().windowMenu.remove(menuItem);
       }
     });
 
@@ -1012,9 +1009,9 @@ public class Desktop extends jalview.jbgui.GDesktop
 
     setKeyBindings(frame);
 
-    desktop.add(frame);
+    getDesktopPane().add(frame);
 
-    windowMenu.add(menuItem);
+    Desktop.getInstance().windowMenu.add(menuItem);
 
     frame.toFront();
     try
@@ -1039,7 +1036,6 @@ public class Desktop extends jalview.jbgui.GDesktop
    */
   private static void setKeyBindings(JInternalFrame frame)
   {
-    @SuppressWarnings("serial")
     final Action closeAction = new AbstractAction()
     {
       @Override
@@ -1055,7 +1051,7 @@ public class Desktop extends jalview.jbgui.GDesktop
     KeyStroke ctrlWKey = KeyStroke.getKeyStroke(KeyEvent.VK_W,
             InputEvent.CTRL_DOWN_MASK);
     KeyStroke cmdWKey = KeyStroke.getKeyStroke(KeyEvent.VK_W,
-            jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx());
+            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask());
 
     InputMap inputMap = frame
             .getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
@@ -1072,7 +1068,7 @@ public class Desktop extends jalview.jbgui.GDesktop
   {
     if (!internalCopy)
     {
-      Desktop.jalviewClipboard = null;
+      Desktop.getInstance().jalviewClipboard = null;
     }
 
     internalCopy = false;
@@ -1151,7 +1147,7 @@ public class Desktop extends jalview.jbgui.GDesktop
           {
             Platform.cacheFileData((File) file);
           }
-          new FileLoader().LoadFile(null, file, protocol, format);
+          new FileLoader().loadFile(null, file, protocol, format);
 
         }
       } catch (Exception ex)
@@ -1174,7 +1170,7 @@ public class Desktop extends jalview.jbgui.GDesktop
   {
     String fileFormat = Cache.getProperty("DEFAULT_FILE_FORMAT");
     JalviewFileChooser chooser = JalviewFileChooser
-            .forRead(Cache.getProperty("LAST_DIRECTORY"), fileFormat, BackupFiles.getEnabled());
+            .forRead(Cache.getProperty("LAST_DIRECTORY"), fileFormat, true);
 
     chooser.setFileView(new JalviewFileView());
     chooser.setDialogTitle(
@@ -1208,7 +1204,7 @@ public class Desktop extends jalview.jbgui.GDesktop
           }
         }
 
-        new FileLoader().LoadFile(viewport, selectedFile,
+        new FileLoader().loadFile(viewport, selectedFile,
                 DataSourceType.FILE, format);
       }
     });
@@ -1282,12 +1278,12 @@ public class Desktop extends jalview.jbgui.GDesktop
         {
           if (viewport != null)
           {
-            new FileLoader().LoadFile(viewport, url, DataSourceType.URL,
+            new FileLoader().loadFile(viewport, url, DataSourceType.URL,
                     FileFormat.Jalview);
           }
           else
           {
-            new FileLoader().LoadFile(url, DataSourceType.URL,
+            new FileLoader().loadFile(url, DataSourceType.URL,
                     FileFormat.Jalview);
           }
         }
@@ -1307,7 +1303,8 @@ public class Desktop extends jalview.jbgui.GDesktop
           {
             String msg = MessageManager
                     .formatMessage("label.couldnt_locate", url);
-            JvOptionPane.showInternalMessageDialog(Desktop.desktop, msg,
+            JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
+                    msg,
                     MessageManager.getString("label.url_not_found"),
                     JvOptionPane.WARNING_MESSAGE);
 
@@ -1316,19 +1313,20 @@ public class Desktop extends jalview.jbgui.GDesktop
 
           if (viewport != null)
           {
-            new FileLoader().LoadFile(viewport, url, DataSourceType.URL,
+            new FileLoader().loadFile(viewport, url, DataSourceType.URL,
                     format);
           }
           else
           {
-            new FileLoader().LoadFile(url, DataSourceType.URL, format);
+            new FileLoader().loadFile(url, DataSourceType.URL, format);
           }
         }
       }
     };
     String dialogOption = MessageManager
             .getString("label.input_alignment_from_url");
-    JvOptionPane.newOptionDialog(desktop).setResponseHandler(0, action)
+    JvOptionPane.newOptionDialog(getDesktopPane())
+            .setResponseHandler(0, action)
             .showInternalDialog(panel, dialogOption,
                     JvOptionPane.YES_NO_CANCEL_OPTION,
                     JvOptionPane.PLAIN_MESSAGE, null, options,
@@ -1414,7 +1412,7 @@ public class Desktop extends jalview.jbgui.GDesktop
   public void aboutMenuItem_actionPerformed(ActionEvent e)
   {
     // StringBuffer message = getAboutMessage(false);
-    // JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+    // JvOptionPane.showInternalMessageDialog(Desktop.getDesktop(),
     //
     // message.toString(), "About Jalview", JvOptionPane.INFORMATION_MESSAGE);
     new Thread(new Runnable()
@@ -1523,8 +1521,12 @@ public class Desktop extends jalview.jbgui.GDesktop
   @Override
   public void closeAll_actionPerformed(ActionEvent e)
   {
+    if (desktopPane == null)
+    {
+      return;
+    }
     // TODO show a progress bar while closing?
-    JInternalFrame[] frames = desktop.getAllFrames();
+    JInternalFrame[] frames = desktopPane.getAllFrames();
     for (int i = 0; i < frames.length; i++)
     {
       try
@@ -1545,12 +1547,7 @@ public class Desktop extends jalview.jbgui.GDesktop
      * reset state of singleton objects as appropriate (clear down session state
      * when all windows are closed)
      */
-    StructureSelectionManager ssm = StructureSelectionManager
-            .getStructureSelectionManager(this);
-    if (ssm != null)
-    {
-      ssm.resetAll();
-    }
+    getStructureSelectionManager().resetAll();
   }
 
   @Override
@@ -1595,7 +1592,7 @@ public class Desktop extends jalview.jbgui.GDesktop
   @Override
   protected void showMemusage_actionPerformed(ActionEvent e)
   {
-    desktop.showMemoryUsage(showMemusage.isSelected());
+    getDesktopPane().showMemoryUsage(showMemusage.isSelected());
   }
 
   /*
@@ -1632,7 +1629,7 @@ public class Desktop extends jalview.jbgui.GDesktop
 
   void reorderAssociatedWindows(boolean minimize, boolean close)
   {
-    JInternalFrame[] frames = desktop.getAllFrames();
+    JInternalFrame[] frames = getDesktopPane().getAllFrames();
     if (frames == null || frames.length < 1)
     {
       return;
@@ -1816,7 +1813,7 @@ public class Desktop extends jalview.jbgui.GDesktop
     saveState_actionPerformed(true);
   }
 
-  private void setProjectFile(File choice)
+  protected void setProjectFile(File choice)
   {
     this.projectFile = choice;
   }
@@ -1838,7 +1835,7 @@ public class Desktop extends jalview.jbgui.GDesktop
         "Jalview Project (old)" };
     JalviewFileChooser chooser = new JalviewFileChooser(
             Cache.getProperty("LAST_DIRECTORY"), suffix, desc,
-            "Jalview Project", true, BackupFiles.getEnabled()); // last two booleans: allFiles,
+            "Jalview Project", true, true); // last two booleans: allFiles,
                                             // allowBackupFiles
     chooser.setFileView(new JalviewFileView());
     chooser.setDialogTitle(MessageManager.getString("label.restore_state"));
@@ -1866,7 +1863,7 @@ public class Desktop extends jalview.jbgui.GDesktop
                {
                  Cache.log.error(
                          "Problems whilst loading project from " + choice, ex);
-                 JvOptionPane.showMessageDialog(Desktop.desktop,
+              JvOptionPane.showMessageDialog(Desktop.getDesktopPane(),
                          MessageManager.formatMessage(
                                  "label.error_whilst_loading_project_from",
                                new Object[]
@@ -1909,7 +1906,7 @@ public class Desktop extends jalview.jbgui.GDesktop
     {
       progressPanel = new JPanel(new GridLayout(1, 1));
       totalProgressCount = 0;
-      instance.getContentPane().add(progressPanel, BorderLayout.SOUTH);
+      getContentPane().add(progressPanel, BorderLayout.SOUTH);
     }
     JPanel thisprogress = new JPanel(new BorderLayout(10, 5));
     JProgressBar progressBar = new JProgressBar();
@@ -1922,7 +1919,7 @@ public class Desktop extends jalview.jbgui.GDesktop
     ((GridLayout) progressPanel.getLayout()).setRows(
             ((GridLayout) progressPanel.getLayout()).getRows() + 1);
     ++totalProgressCount;
-    instance.validate();
+    validate();
     return thisprogress;
   }
 
@@ -1976,7 +1973,7 @@ public class Desktop extends jalview.jbgui.GDesktop
    */
   public static AlignmentPanel[] getAlignmentPanels(String alignmentId)
   {
-    if (Desktop.desktop == null)
+    if (Desktop.getDesktopPane() == null)
     {
       // no frames created and in headless mode
       // TODO: verify that frames are recoverable when in headless mode
@@ -2018,7 +2015,7 @@ public class Desktop extends jalview.jbgui.GDesktop
   public static AlignmentViewport[] getViewports(String sequenceSetId)
   {
     List<AlignmentViewport> viewp = new ArrayList<>();
-    if (desktop != null)
+    if (getDesktopPane() != null)
     {
       AlignFrame[] frames = Desktop.getAlignFrames();
 
@@ -2104,7 +2101,7 @@ public class Desktop extends jalview.jbgui.GDesktop
   {
     source.viewport.setGatherViewsHere(true);
     source.viewport.setExplodedGeometry(source.getBounds());
-    JInternalFrame[] frames = desktop.getAllFrames();
+    JInternalFrame[] frames = getAllFrames();
     String viewId = source.viewport.getSequenceSetId();
 
     for (int t = 0; t < frames.length; t++)
@@ -2161,7 +2158,7 @@ public class Desktop extends jalview.jbgui.GDesktop
         String fle = chooser.getSelectedFile().toString();
         if (!vamsasImport(chooser.getSelectedFile()))
         {
-          JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+          JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
                   MessageManager.formatMessage(
                           "label.couldnt_import_as_vamsas_session",
                           new Object[]
@@ -2462,7 +2459,7 @@ public class Desktop extends jalview.jbgui.GDesktop
         removeProgressPanel(progpanel);
         if (warnmsg != null)
         {
-          JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+          JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
 
                   warnmsg, warnttl, JvOptionPane.ERROR_MESSAGE);
         }
@@ -2499,7 +2496,7 @@ public class Desktop extends jalview.jbgui.GDesktop
 
   public JInternalFrame[] getAllFrames()
   {
-    return desktop.getAllFrames();
+    return desktopPane.getAllFrames();
   }
 
   /**
@@ -2538,7 +2535,7 @@ public class Desktop extends jalview.jbgui.GDesktop
           while (li.hasNext())
           {
             String link = li.next();
-            if (link.contains(jalview.util.UrlConstants.SEQUENCE_ID)
+            if (link.contains(UrlConstants.SEQUENCE_ID)
                     && !UrlConstants.isDefaultString(link))
             {
               check = true;
@@ -2585,7 +2582,7 @@ public class Desktop extends jalview.jbgui.GDesktop
           });
           msgPanel.add(jcb);
 
-          JvOptionPane.showMessageDialog(Desktop.desktop, msgPanel,
+          JvOptionPane.showMessageDialog(desktopPane, msgPanel,
                   MessageManager
                           .getString("label.SEQUENCE_ID_no_longer_used"),
                   JvOptionPane.WARNING_MESSAGE);
@@ -2700,11 +2697,11 @@ public class Desktop extends jalview.jbgui.GDesktop
   {
     if (Jalview.isHeadlessMode())
     {
-      // Desktop.desktop is null in headless mode
-      return new AlignFrame[] { Jalview.currentAlignFrame };
+      // Desktop.getDesktop() is null in headless mode
+      return new AlignFrame[] { Jalview.getCurrentAlignFrame() };
     }
 
-    JInternalFrame[] frames = Desktop.desktop.getAllFrames();
+    JInternalFrame[] frames = Desktop.getDesktopPane().getAllFrames();
 
     if (frames == null)
     {
@@ -2749,7 +2746,7 @@ public class Desktop extends jalview.jbgui.GDesktop
    */
   public GStructureViewer[] getJmols()
   {
-    JInternalFrame[] frames = Desktop.desktop.getAllFrames();
+    JInternalFrame[] frames = Desktop.getDesktopPane().getAllFrames();
 
     if (frames == null)
     {
@@ -2785,7 +2782,7 @@ public class Desktop extends jalview.jbgui.GDesktop
     } catch (Exception ex)
     {
       jalview.bin.Cache.log.error("Groovy Shell Creation failed.", ex);
-      JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+      JvOptionPane.showInternalMessageDialog(desktopPane,
 
               MessageManager.getString("label.couldnt_create_groovy_shell"),
               MessageManager.getString("label.groovy_support_failed"),
@@ -2796,7 +2793,7 @@ public class Desktop extends jalview.jbgui.GDesktop
   /**
    * Open the Groovy console
    */
-  void openGroovyConsole()
+  private void openGroovyConsole()
   {
     if (groovyConsole == null)
     {
@@ -2845,7 +2842,7 @@ public class Desktop extends jalview.jbgui.GDesktop
   {
     getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
             .put(KeyStroke.getKeyStroke(KeyEvent.VK_Q,
-                    jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx()),
+                    Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()),
                     "Quit");
     getRootPane().getActionMap().put("Quit", new AbstractAction()
     {
@@ -2904,18 +2901,18 @@ public class Desktop extends jalview.jbgui.GDesktop
       progressBarHandlers = new Hashtable<>();
     }
 
-    if (progressBars.get(Long.valueOf(id)) != null)
+    if (progressBars.get(new Long(id)) != null)
     {
-      JPanel panel = progressBars.remove(Long.valueOf(id));
-      if (progressBarHandlers.contains(Long.valueOf(id)))
+      JPanel panel = progressBars.remove(new Long(id));
+      if (progressBarHandlers.contains(new Long(id)))
       {
-        progressBarHandlers.remove(Long.valueOf(id));
+        progressBarHandlers.remove(new Long(id));
       }
       removeProgressPanel(panel);
     }
     else
     {
-      progressBars.put(Long.valueOf(id), addProgressPanel(message));
+      progressBars.put(new Long(id), addProgressPanel(message));
     }
   }
 
@@ -2930,13 +2927,13 @@ public class Desktop extends jalview.jbgui.GDesktop
           final IProgressIndicatorHandler handler)
   {
     if (progressBarHandlers == null
-            || !progressBars.containsKey(Long.valueOf(id)))
+            || !progressBars.containsKey(new Long(id)))
     {
       throw new Error(MessageManager.getString(
               "error.call_setprogressbar_before_registering_handler"));
     }
-    progressBarHandlers.put(Long.valueOf(id), handler);
-    final JPanel progressPanel = progressBars.get(Long.valueOf(id));
+    progressBarHandlers.put(new Long(id), handler);
+    final JPanel progressPanel = progressBars.get(new Long(id));
     if (handler.canCancel())
     {
       JButton cancel = new JButton(
@@ -2982,7 +2979,7 @@ public class Desktop extends jalview.jbgui.GDesktop
    */
   public static AlignFrame getAlignFrameFor(AlignViewportI viewport)
   {
-    if (desktop != null)
+    if (getDesktopPane() != null)
     {
       AlignmentPanel[] aps = getAlignmentPanels(
               viewport.getSequenceSetId());
@@ -3043,8 +3040,8 @@ public class Desktop extends jalview.jbgui.GDesktop
       // todo: changesupport handlers need to be transferred
       if (discoverer == null)
       {
-        discoverer = new jalview.ws.jws1.Discoverer();
-        // register PCS handler for desktop.
+        discoverer = Discoverer.getInstance();
+        // register PCS handler for getDesktop().
         discoverer.addPropertyChangeListener(changeSupport);
       }
       // JAL-940 - disabled JWS1 service configuration - always start discoverer
@@ -3054,7 +3051,7 @@ public class Desktop extends jalview.jbgui.GDesktop
 
     if (Cache.getDefault("SHOW_JWS2_SERVICES", true))
     {
-      t2 = jalview.ws.jws2.Jws2Discoverer.getDiscoverer()
+      t2 = jalview.ws.jws2.Jws2Discoverer.getInstance()
               .startDiscoverer(changeSupport);
     }
     Thread t3 = null;
@@ -3087,7 +3084,7 @@ public class Desktop extends jalview.jbgui.GDesktop
   {
     if (evt.getNewValue() == null || evt.getNewValue() instanceof Vector)
     {
-      final String ermsg = jalview.ws.jws2.Jws2Discoverer.getDiscoverer()
+      final String ermsg = jalview.ws.jws2.Jws2Discoverer.getInstance()
               .getErrorMessages();
       if (ermsg != null)
       {
@@ -3126,7 +3123,7 @@ public class Desktop extends jalview.jbgui.GDesktop
                  * 
                  * jd.waitForInput();
                  */
-                JvOptionPane.showConfirmDialog(Desktop.desktop,
+                JvOptionPane.showConfirmDialog(Desktop.getDesktopPane(),
                         new JLabel("<html><table width=\"450\"><tr><td>"
                                 + ermsg + "</td></tr></table>"
                                 + "<p>It may be that you have invalid JABA URLs<br/>in your web service preferences,"
@@ -3152,7 +3149,7 @@ public class Desktop extends jalview.jbgui.GDesktop
     }
   }
 
-  private Runnable serviceChangedDialog = null;
+  Runnable serviceChangedDialog = null;
 
   /**
    * start a thread to open a URL in the configured browser. Pops up a warning
@@ -3163,7 +3160,7 @@ public class Desktop extends jalview.jbgui.GDesktop
    */
   public static void showUrl(final String url)
   {
-    showUrl(url, Desktop.instance);
+    showUrl(url, Desktop.getInstance());
   }
 
   /**
@@ -3189,10 +3186,10 @@ public class Desktop extends jalview.jbgui.GDesktop
                     .formatMessage("status.opening_params", new Object[]
                     { url }), this.hashCode());
           }
-          jalview.util.BrowserLauncher.openURL(url);
+          BrowserLauncher.openURL(url);
         } catch (Exception ex)
         {
-          JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+          JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
                   MessageManager
                           .getString("label.web_browser_not_found_unix"),
                   MessageManager.getString("label.web_browser_not_found"),
@@ -3208,15 +3205,16 @@ public class Desktop extends jalview.jbgui.GDesktop
     }).start();
   }
 
-  public static WsParamSetManager wsparamManager = null;
+  private WsParamSetManager wsparamManager = null;
 
   public static ParamManager getUserParameterStore()
   {
-    if (wsparamManager == null)
+    Desktop d = Desktop.getInstance();
+    if (d.wsparamManager == null)
     {
-      wsparamManager = new WsParamSetManager();
+      d.wsparamManager = new WsParamSetManager();
     }
-    return wsparamManager;
+    return d.wsparamManager;
   }
 
   /**
@@ -3261,14 +3259,16 @@ public class Desktop extends jalview.jbgui.GDesktop
   /**
    * flag indicating if dialogExecutor should try to acquire a permit
    */
-  private volatile boolean dialogPause = true;
+  volatile boolean dialogPause = true;
 
   /**
    * pause the queue
    */
-  private java.util.concurrent.Semaphore block = new Semaphore(0);
+  java.util.concurrent.Semaphore block = new Semaphore(0);
+
+  private groovy.ui.Console groovyConsole;
 
-  private static groovy.ui.Console groovyConsole;
+  public StructureViewer lastTargetedView;
 
   /**
    * add another dialog thread to the queue
@@ -3291,7 +3291,7 @@ public class Desktop extends jalview.jbgui.GDesktop
           {
           }
         }
-        if (instance == null)
+        if (instanceOnly)
         {
           return;
         }
@@ -3455,7 +3455,7 @@ public class Desktop extends jalview.jbgui.GDesktop
     String topViewId = myTopFrame.viewport.getSequenceSetId();
     String bottomViewId = myBottomFrame.viewport.getSequenceSetId();
 
-    JInternalFrame[] frames = desktop.getAllFrames();
+    JInternalFrame[] frames = desktopPane.getAllFrames();
     for (JInternalFrame frame : frames)
     {
       if (frame instanceof SplitFrame && frame != source)
@@ -3500,7 +3500,8 @@ public class Desktop extends jalview.jbgui.GDesktop
 
   public static groovy.ui.Console getGroovyConsole()
   {
-    return groovyConsole;
+    Desktop desktop = Desktop.getInstance();
+    return desktop == null ? null : desktop.groovyConsole;
   }
 
   /**
@@ -3518,6 +3519,7 @@ public class Desktop extends jalview.jbgui.GDesktop
    *          - the payload from the drop event
    * @throws Exception
    */
+  @SuppressWarnings("unchecked")
   public static void transferFromDropTarget(List<Object> files,
           List<DataSourceType> protocols, DropTargetDropEvent evt,
           Transferable t) throws Exception
@@ -3587,7 +3589,7 @@ public class Desktop extends jalview.jbgui.GDesktop
     {
       // Works on Windows and MacOSX
       Cache.log.debug("Drop handled as javaFileListFlavor");
-      for (Object file : (List) t
+      for (Object file : (List<Object>) t
               .getTransferData(DataFlavor.javaFileListFlavor))
       {
         files.add(file);
@@ -3751,7 +3753,7 @@ public class Desktop extends jalview.jbgui.GDesktop
           Class<? extends StructureViewerBase> structureViewerClass)
   {
     List<StructureViewerBase> result = new ArrayList<>();
-    JInternalFrame[] frames = Desktop.instance.getAllFrames();
+    JInternalFrame[] frames = getAllFrames();
 
     for (JInternalFrame frame : frames)
     {
@@ -3770,4 +3772,5 @@ public class Desktop extends jalview.jbgui.GDesktop
     }
     return result;
   }
+
 }
index d547c58..4fe9a65 100644 (file)
@@ -99,7 +99,12 @@ public class FeatureEditor
    * 
    * @param alignPanel
    * @param seqs
+   *          one or more Sequence if create is true; a singleton if create is
+   *          false
    * @param feats
+   *          a list of new SequenceFeature instances if create is true,
+   *          otherwise a list of known features for this sequence at this
+   *          position
    * @param create
    *          if true create a new feature, else amend or delete an existing
    *          feature
@@ -222,7 +227,7 @@ public class FeatureEditor
               updateColourButton(mainPanel, colour, featureColour);
             };
           };
-          JalviewColourChooser.showColourChooser(Desktop.getDesktop(),
+          JalviewColourChooser.showColourChooser(Desktop.getDesktopPane(),
                   title, featureColour.getColour(), listener);
         }
         else
@@ -412,7 +417,7 @@ public class FeatureEditor
      * set dialog action handlers for OK (create/Amend) and Cancel options
      * also for Delete if applicable (when amending features)
      */
-    JvOptionPane dialog = JvOptionPane.newOptionDialog(Desktop.desktop)
+    JvOptionPane dialog = JvOptionPane.newOptionDialog(Desktop.getDesktopPane())
             .setResponseHandler(0, okAction).setResponseHandler(2, cancelAction);
     if (!forCreate)
     {
@@ -482,6 +487,7 @@ public class FeatureEditor
     {
       boolean useLastDefaults = features.get(0).getType() == null;
 
+      @Override
       public void run()
       {
         final String enteredType = name.getText().trim();
@@ -538,6 +544,7 @@ public class FeatureEditor
   {
          Runnable deleteAction = new Runnable()
     {
+      @Override
       public void run()
       {
         SequenceFeature sf = features.get(featureIndex);
@@ -646,6 +653,7 @@ public class FeatureEditor
   
       String featureGroup = group.getText();
   
+      @Override
       public void run()
       {
         final String enteredType = name.getText().trim();
index 0553fef..61d3266 100644 (file)
@@ -30,6 +30,7 @@ import java.awt.Color;
  */
 public class FeatureRenderer
         extends jalview.renderer.seqfeatures.FeatureRenderer
+        implements jalview.api.FeatureRenderer
 {
   Color resBoxColour;
 
@@ -44,11 +45,10 @@ public class FeatureRenderer
   {
     super(alignPanel.av);
     this.ap = alignPanel;
-    if (alignPanel.getSeqPanel() != null
-            && alignPanel.getSeqPanel().seqCanvas != null
-            && alignPanel.getSeqPanel().seqCanvas.fr != null)
+    SeqPanel sp = alignPanel.getSeqPanel();
+    if (sp != null && sp.seqCanvas != null && sp.seqCanvas.fr != null)
     {
-      transferSettings(alignPanel.getSeqPanel().seqCanvas.fr);
+      transferSettings(sp.seqCanvas.fr);
     }
   }
 }
index 9fe2e92..f81ecce 100644 (file)
@@ -705,7 +705,7 @@ public class FeatureSettings extends JPanel
         data[dataIndex][FILTER_COLUMN] = featureFilter == null
                 ? new FeatureMatcherSet()
                 : featureFilter;
-        data[dataIndex][SHOW_COLUMN] = Boolean.valueOf(
+        data[dataIndex][SHOW_COLUMN] = new Boolean(
                 af.getViewport().getFeaturesDisplayed().isVisible(type));
         dataIndex++;
         displayableTypes.remove(type);
@@ -732,7 +732,7 @@ public class FeatureSettings extends JPanel
       data[dataIndex][FILTER_COLUMN] = featureFilter == null
               ? new FeatureMatcherSet()
               : featureFilter;
-      data[dataIndex][SHOW_COLUMN] = Boolean.valueOf(true);
+      data[dataIndex][SHOW_COLUMN] = new Boolean(true);
       dataIndex++;
       displayableTypes.remove(type);
     }
index cbfe80f..c3887ff 100644 (file)
@@ -22,7 +22,6 @@ package jalview.gui;
 
 import jalview.api.AlignmentViewPanel;
 import jalview.api.FeatureColourI;
-import jalview.bin.Cache;
 import jalview.datamodel.GraphLine;
 import jalview.datamodel.features.FeatureAttributes;
 import jalview.datamodel.features.FeatureAttributes.Datatype;
@@ -40,6 +39,7 @@ import java.awt.BorderLayout;
 import java.awt.Color;
 import java.awt.Dimension;
 import java.awt.FlowLayout;
+import java.awt.Graphics;
 import java.awt.GridLayout;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
@@ -64,7 +64,6 @@ import javax.swing.JPanel;
 import javax.swing.JRadioButton;
 import javax.swing.JSlider;
 import javax.swing.JTextField;
-import javax.swing.border.EmptyBorder;
 import javax.swing.border.LineBorder;
 import javax.swing.event.ChangeEvent;
 import javax.swing.event.ChangeListener;
@@ -165,7 +164,7 @@ public class FeatureTypeSettings extends JalviewDialog
 
   JPanel maxColour = new JPanel();
 
-  private JComboBox<Object> threshold = new JComboBox<>();
+  private JComboBox<String> threshold = new JComboBox<>();
 
   JSlider slider = new JSlider();
 
@@ -182,17 +181,17 @@ public class FeatureTypeSettings extends JalviewDialog
   /*
    * choice of option for 'colour for no value'
    */
-  private JComboBox<Object> noValueCombo;
+  private JComboBox<String> noValueCombo;
 
   /*
    * choice of what to colour by text (Label or attribute)
    */
-  private JComboBox<Object> colourByTextCombo;
+  private JComboBox<String> colourByTextCombo;
 
   /*
    * choice of what to colour by range (Score or attribute)
    */
-  private JComboBox<Object> colourByRangeCombo;
+  private JComboBox<String> colourByRangeCombo;
 
   private JRadioButton andFilters;
 
@@ -1122,7 +1121,7 @@ public class FeatureTypeSettings extends JalviewDialog
    * @param withRange
    * @param withText
    */
-  protected JComboBox<Object> populateAttributesDropdown(
+  protected JComboBox<String> populateAttributesDropdown(
           List<String[]> attNames, boolean withRange, boolean withText)
   {
     List<String> displayAtts = new ArrayList<>();
@@ -1161,11 +1160,9 @@ public class FeatureTypeSettings extends JalviewDialog
       tooltips.add(desc == null ? "" : desc);
     }
 
-    // now convert String List to Object List for buildComboWithTooltips
-    List<Object> displayAttsObjects = new ArrayList<>(displayAtts);
-    JComboBox<Object> attCombo = JvSwingUtils
-            .buildComboWithTooltips(displayAttsObjects, tooltips);
-    
+    JComboBox<String> attCombo = JvSwingUtils
+            .buildComboWithTooltips(displayAtts, tooltips);
+
     return attCombo;
   }
 
@@ -1343,8 +1340,8 @@ public class FeatureTypeSettings extends JalviewDialog
      * drop-down choice of attribute, with description as a tooltip 
      * if we can obtain it
      */
-    final JComboBox<Object> attCombo = populateAttributesDropdown(attNames,
-            true, true);
+    JComboBox<String> attCombo = populateAttributesDropdown(attNames, true,
+            true);
     String filterBy = setSelectedAttribute(attCombo, filter);
 
     JComboBox<Condition> condCombo = new JComboBox<>();
@@ -1445,13 +1442,20 @@ public class FeatureTypeSettings extends JalviewDialog
     if (!patternField.isEnabled()
             || (pattern != null && pattern.trim().length() > 0))
     {
-      JButton removeCondition = new JButton("\u2717"); // Dingbats cursive x
-      removeCondition.setBorder(new EmptyBorder(0, 0, 0, 0));
+      JButton removeCondition = new JButton("\u2717")
+      {
+        @Override
+        public void paint(Graphics g)
+        {
+          g.setColor(Color.black);
+          g.drawString("\u2717", 2, 14); // Dingbats cursive x
+        }
+      };
       removeCondition.setBackground(Color.WHITE);
+      removeCondition.setOpaque(true);
       removeCondition.setPreferredSize(new Dimension(23, 17));
-      removeCondition.setToolTipText(
-              MessageManager.getString("label.delete_condition"));
-      removeCondition.setBorder(new EmptyBorder(0, 0, 0, 0));
+      removeCondition
+              .setToolTipText(MessageManager.getString("label.delete_row"));
       removeCondition.addActionListener(new ActionListener()
       {
         @Override
@@ -1474,7 +1478,7 @@ public class FeatureTypeSettings extends JalviewDialog
    * @param attCombo
    * @param filter
    */
-  private String setSelectedAttribute(JComboBox<Object> attCombo,
+  private String setSelectedAttribute(JComboBox<String> attCombo,
           FeatureMatcherI filter)
   {
     String item = null;
@@ -1691,19 +1695,11 @@ public class FeatureTypeSettings extends JalviewDialog
    * @param valueField
    * @param filterIndex
    */
-  protected boolean updateFilter(JComboBox<Object> attCombo,
+  protected boolean updateFilter(JComboBox<String> attCombo,
           JComboBox<Condition> condCombo, JTextField valueField,
           int filterIndex)
   {
-    String attName;
-    try
-    {
-      attName = (String) attCombo.getSelectedItem();
-    } catch (Exception e)
-    {
-      Cache.log.error("Problem casting Combo box entry to String");
-      attName = attCombo.getSelectedItem().toString();
-    }
+    String attName = (String) attCombo.getSelectedItem();
     Condition cond = (Condition) condCombo.getSelectedItem();
     String pattern = valueField.getText().trim();
 
index a1693f7..2a6adda 100755 (executable)
@@ -176,7 +176,7 @@ public class Finder extends GFinder
    */
   boolean getFocusedViewport()
   {
-    if (focusfixed || Desktop.desktop == null)
+    if (focusfixed || Desktop.getDesktopPane() == null)
     {
       if (ap != null && av != null)
       {
@@ -187,7 +187,7 @@ public class Finder extends GFinder
     }
     // now checks further down the window stack to fix bug
     // https://mantis.lifesci.dundee.ac.uk/view.php?id=36008
-    JInternalFrame[] frames = Desktop.desktop.getAllFrames();
+    JInternalFrame[] frames = Desktop.getDesktopPane().getAllFrames();
     for (int f = 0; f < frames.length; f++)
     {
       JInternalFrame alignFrame = frames[f];
index 92cc4c6..9bb133c 100755 (executable)
@@ -215,7 +215,11 @@ public class FontChooser extends GFontChooser
     {
       if (ap.getOverviewPanel() != null)
       {
-        ap.getOverviewPanel().updateOverviewImage();
+        // changes size of rectangle
+        // BH 2019.07.29 -- updateOverviewImage forces a redraw, but all we are
+        // doing is changing the box size.
+
+        ap.getOverviewPanel().repaint();// updateOverviewImage();
       }
     }
   }
@@ -408,10 +412,10 @@ public class FontChooser extends GFontChooser
   @Override
   public void defaultButton_actionPerformed()
   {
-    Cache.setProperty("FONT_NAME", fontName.getSelectedItem().toString());
-    Cache.setProperty("FONT_STYLE", fontStyle.getSelectedIndex() + "");
-    Cache.setProperty("FONT_SIZE", fontSize.getSelectedItem().toString());
-    Cache.setProperty("ANTI_ALIAS",
+    Cache.setProperty(Preferences.FONT_NAME, fontName.getSelectedItem().toString());
+    Cache.setProperty(Preferences.FONT_STYLE, fontStyle.getSelectedIndex() + "");
+    Cache.setProperty(Preferences.FONT_SIZE, fontSize.getSelectedItem().toString());
+    Cache.setProperty(Preferences.ANTI_ALIAS,
             Boolean.toString(smoothFont.isSelected()));
     Cache.setProperty(Preferences.SCALE_PROTEIN_TO_CDNA,
             Boolean.toString(scaleAsCdna.isSelected()));
index 4057cef..e5a5946 100755 (executable)
@@ -579,21 +579,45 @@ public class IdCanvas extends JPanel implements ViewportListenerI
   @Override
   public void propertyChange(PropertyChangeEvent evt)
   {
+    // BH just clarifying logic
     String propertyName = evt.getPropertyName();
-    if (propertyName.equals(ViewportRanges.STARTSEQ)
-            || (av.getWrapAlignment()
-                    && propertyName.equals(ViewportRanges.STARTRES)))
-    {
+    switch (propertyName) {
+    case ViewportRanges.STARTSEQ:
       fastPaint((int) evt.getNewValue() - (int) evt.getOldValue());
-    }
-    else if (propertyName.equals(ViewportRanges.STARTRESANDSEQ))
-    {
+      return;
+    case ViewportRanges.STARTRES:
+      if (av.getWrapAlignment())
+      {
+        fastPaint((int) evt.getNewValue() - (int) evt.getOldValue());
+      }
+      return;
+    case ViewportRanges.STARTRESANDSEQ:
       fastPaint(((int[]) evt.getNewValue())[1]
               - ((int[]) evt.getOldValue())[1]);
-    }
-    else if (propertyName.equals(ViewportRanges.MOVE_VIEWPORT))
-    {
+      return;
+    case ViewportRanges.MOVE_VIEWPORT:
       repaint();
+      return;
+    case ViewportRanges.ENDRES:
+    case ViewportRanges.ENDSEQ:
+      // ignore ??
+      return;
     }
+// BH 2019.07.27 was:
+//    if (propertyName.equals(ViewportRanges.STARTSEQ)
+//            || (av.getWrapAlignment()
+//                    && propertyName.equals(ViewportRanges.STARTRES)))
+//    {
+//      fastPaint((int) evt.getNewValue() - (int) evt.getOldValue());
+//    }
+//    else if (propertyName.equals(ViewportRanges.STARTRESANDSEQ))
+//    {
+//      fastPaint(((int[]) evt.getNewValue())[1]
+//              - ((int[]) evt.getOldValue())[1]);
+//    }
+//    else if (propertyName.equals(ViewportRanges.MOVE_VIEWPORT))
+//    {
+//      repaint();
+    // }
   }
 }
index 6b312ad..dadf25a 100755 (executable)
@@ -246,7 +246,7 @@ public class IdPanel extends JPanel
       jalview.util.BrowserLauncher.openURL(url);
     } catch (Exception ex)
     {
-      JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+      JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
               MessageManager.getString("label.web_browser_not_found_unix"),
               MessageManager.getString("label.web_browser_not_found"),
               JvOptionPane.WARNING_MESSAGE);
@@ -456,7 +456,8 @@ public class IdPanel extends JPanel
     }
 
     PopupMenu pop = new PopupMenu(alignPanel, sq, features,
-            Preferences.getGroupURLLinks());
+            Preferences.getGroupURLLinks() // empty list; not implemented
+    );
     pop.show(this, e.getX(), e.getY());
   }
 
index 0cffc3b..2c273ad 100755 (executable)
@@ -24,10 +24,8 @@ import jalview.api.AlignViewportI;
 
 import java.awt.Color;
 import java.awt.Cursor;
-import java.awt.Graphics;
+import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
-import java.awt.event.MouseListener;
-import java.awt.event.MouseMotionListener;
 
 import javax.swing.JPanel;
 
@@ -37,157 +35,77 @@ import javax.swing.JPanel;
  * @author $author$
  * @version $Revision$
  */
+@SuppressWarnings("serial")
 public class IdwidthAdjuster extends JPanel
-        implements MouseListener, MouseMotionListener
 {
-  boolean active = false;
 
   int oldX = 0;
 
-  AlignmentPanel ap;
-
   /**
-   * Creates a new IdwidthAdjuster object.
+   * Creates a new IdwidthAdjuster object above the id panel that can be dragged
+   * to change the panel's width
    * 
    * @param ap
-   *          DOCUMENT ME!
-   */
-  public IdwidthAdjuster(AlignmentPanel ap)
-  {
-    this.ap = ap;
-    setBackground(Color.white);
-    addMouseListener(this);
-    addMouseMotionListener(this);
-  }
-
-  /**
-   * DOCUMENT ME!
-   * 
-   * @param evt
-   *          DOCUMENT ME!
-   */
-  @Override
-  public void mousePressed(MouseEvent evt)
-  {
-    oldX = evt.getX();
-  }
-
-  /**
-   * DOCUMENT ME!
-   * 
-   * @param evt
-   *          DOCUMENT ME!
-   */
-  @Override
-  public void mouseReleased(MouseEvent evt)
-  {
-    active = false;
-    repaint();
-
-    /*
-     * If in a SplitFrame with co-scaled alignments, set the other's id width to
-     * match
-     */
-    final AlignViewportI viewport = ap.getAlignViewport();
-    if (viewport.getCodingComplement() != null
-            && viewport.isScaleProteinAsCdna())
-    {
-      viewport.getCodingComplement().setIdWidth(viewport.getIdWidth());
-      SplitFrame sf = (SplitFrame) ap.alignFrame.getSplitViewContainer();
-      sf.repaint();
-    }
-
-  }
-
-  /**
-   * DOCUMENT ME!
-   * 
-   * @param evt
-   *          DOCUMENT ME!
-   */
-  @Override
-  public void mouseEntered(MouseEvent evt)
-  {
-    active = true;
-    repaint();
-  }
-
-  /**
-   * DOCUMENT ME!
+   *          The associated AlignmentPanel
    * 
-   * @param evt
-   *          DOCUMENT ME!
    */
-  @Override
-  public void mouseExited(MouseEvent evt)
-  {
-    active = false;
-    repaint();
-  }
-
-  /**
-   * DOCUMENT ME!
-   * 
-   * @param evt
-   *          DOCUMENT ME!
-   */
-  @Override
-  public void mouseDragged(MouseEvent evt)
+  public IdwidthAdjuster(AlignmentPanel ap)
   {
-    active = true;
+    // BH 2019.07.01 no need for overridden paintComponent, especially as it was
+    // overriding paint(g) so
+    // allowing strange component painting in its place.
 
-    final AlignViewportI viewport = ap.getAlignViewport();
-    int curwidth = viewport.getIdWidth();
-    int dif = evt.getX() - oldX;
-
-    final int newWidth = curwidth + dif;
-    if ((newWidth > 20) || (dif > 0))
-    {
-      viewport.setIdWidth(newWidth);
-
-      ap.paintAlignment(true, false);
-    }
-
-    oldX = evt.getX();
-  }
-
-  /**
-   * DOCUMENT ME!
-   * 
-   * @param evt
-   *          DOCUMENT ME!
-   */
-  @Override
-  public void mouseMoved(MouseEvent evt)
-  {
-  }
+    setBackground(Color.white);
+    setOpaque(true);
 
-  /**
-   * DOCUMENT ME!
-   * 
-   * @param evt
-   *          DOCUMENT ME!
-   */
-  @Override
-  public void mouseClicked(MouseEvent evt)
-  {
-  }
+    setCursor(Cursor.getPredefinedCursor(Cursor.W_RESIZE_CURSOR));
 
-  /**
-   * DOCUMENT ME!
-   * 
-   * @param g
-   *          DOCUMENT ME!
-   */
-  @Override
-  public void paintComponent(Graphics g)
-  {
-    g.setColor(Color.white);
-    g.fillRect(0, 0, getWidth(), getHeight());
+    // BH 2019.07.01 MouseAdapter is cleaner - no need for fields active or ap
 
-    if (active)
+    MouseAdapter ma = (new MouseAdapter()
     {
-        setCursor(Cursor.getPredefinedCursor(Cursor.W_RESIZE_CURSOR));
-    }
+      @Override
+      public void mousePressed(MouseEvent evt)
+      {
+        oldX = evt.getX();
+      }
+
+      @Override
+      public void mouseDragged(MouseEvent evt)
+      {
+        AlignViewportI viewport = ap.getAlignViewport();
+        int curwidth = viewport.getIdWidth();
+        int dif = evt.getX() - oldX;
+        int newWidth = curwidth + dif;
+        if ((newWidth > 20) || (dif > 0))
+        {
+          viewport.setIdWidth(newWidth);
+          ap.paintAlignment(true, false);
+        }
+        oldX = evt.getX();
+      }
+
+      @Override
+      public void mouseReleased(MouseEvent evt)
+      {
+
+        // If in a SplitFrame with co-scaled alignments, set the other's id
+        // width to match
+
+        AlignViewportI viewport = ap.getAlignViewport();
+        if (viewport.getCodingComplement() != null
+                && viewport.isScaleProteinAsCdna())
+        {
+          viewport.getCodingComplement().setIdWidth(viewport.getIdWidth());
+          SplitFrame sf = (SplitFrame) ap.alignFrame
+                  .getSplitViewContainer();
+          sf.repaint();
+        }
+
+      }
+
+    });
+    addMouseListener(ma);
+    addMouseMotionListener(ma);
   }
 }
index 1d7064b..c1140a1 100644 (file)
@@ -33,17 +33,20 @@ import org.apache.log4j.spi.LoggingEvent;
 public class JalviewAppender extends WriterAppender
 {
 
-  static private JTextArea jTextArea = null;
+  // BH 2019 was static
+
+  private JTextArea jTextArea = null;
 
   /** Set the target JTextArea for the logging information to appear. */
-  static public void setTextArea(JTextArea jTextArea)
+  public void setTextArea(JTextArea jTextArea)
   {
-    JalviewAppender.jTextArea = jTextArea;
+    this.jTextArea = jTextArea;
   }
 
   /**
    * Format and then append the loggingEvent to the stored JTextArea.
    */
+  @Override
   public void append(LoggingEvent loggingEvent)
   {
     final String message = this.layout.format(loggingEvent);
@@ -51,6 +54,7 @@ public class JalviewAppender extends WriterAppender
     // Append formatted message to textarea using the Swing Thread.
     SwingUtilities.invokeLater(new Runnable()
     {
+      @Override
       public void run()
       {
         if (jTextArea != null)
index 1d7bf3d..eb69230 100644 (file)
@@ -77,12 +77,12 @@ public abstract class JalviewDialog extends JPanel
   protected void initDialogFrame(Container content, boolean modal,
           boolean block, String title, int width, int height)
   {
-
-    frame = new JDialog(Desktop.instance, modal);
+    Desktop desktop = Desktop.getInstance();
+    frame = new JDialog(desktop, modal);
     frame.setTitle(title);
-    if (Desktop.instance != null)
+    if (desktop != null)
     {
-      Rectangle deskr = Desktop.instance.getBounds();
+      Rectangle deskr = desktop.getBounds();
       frame.setBounds(new Rectangle((int) (deskr.getCenterX() - width / 2),
               (int) (deskr.getCenterY() - height / 2), width, height));
     }
index 41287d2..7dd8e6c 100644 (file)
@@ -56,12 +56,16 @@ import javax.swing.border.TitledBorder;
  */
 public final class JvSwingUtils
 {
+  public static final String HTML_PREFIX = "<html><div style=\"width:350px;white-space:pre-wrap;padding:2px;overflow-wrap:break-word;\">";
+
+
   /**
    * wrap a bare html safe string to around 60 characters per line using a CSS
    * style class specifying word-wrap and break-word
    * 
    * @param enclose
-   *          if true, add &lt;html&gt; wrapper tags
+   *          if true, add &lt;html&gt; wrapper tags (currently false for only
+   *          two references -- both in Jws2Discoverer --
    * @param ttext
    * 
    * @return
@@ -72,8 +76,19 @@ public final class JvSwingUtils
             "Tootip text to format must not be null!");
     ttext = ttext.trim();
     boolean maxLengthExceeded = false;
-
-    if (ttext.contains("<br>"))
+    boolean isHTML = ttext.startsWith("<html>");
+    if (isHTML)
+    {
+      ttext = ttext.substring(6);
+    }
+    if (ttext.endsWith("</html>"))
+    {
+      isHTML = true;
+      ttext = ttext.substring(0, ttext.length() - 7);
+    }
+    boolean hasBR = ttext.contains("<br>");
+    enclose |= isHTML || hasBR;
+    if (hasBR)
     {
       String[] htmllines = ttext.split("<br>");
       for (String line : htmllines)
@@ -94,21 +109,12 @@ public final class JvSwingUtils
     {
       return enclose ? "<html>" + ttext + "</html>" : ttext;
     }
-
-    return (enclose ? "<html>" : "")
-            
-     // BH 2018
-            
-            + "<style> div.ttip {width:350px;white-space:pre-wrap;padding:2px;overflow-wrap:break-word;}</style><div class=\"ttip\">"
-            
-//            + "<style> p.ttip {width:350px;margin:-14px 0px -14px 0px;padding:2px;overflow-wrap:break-word;}"
-//            + "</style><p class=\"ttip\">"
-                        
+    // BH 2018,2019
+    return (enclose
+            ? HTML_PREFIX
             + ttext
-            
-            + " </div>"
-//            + "</p>"
-            + ((enclose ? "</html>" : ""));
+                    + "</div></html>"
+            : ttext);
 
   }
 
@@ -330,13 +336,13 @@ public final class JvSwingUtils
    * @param entries
    * @param tooltips
    */
-  public static JComboBox<Object> buildComboWithTooltips(
-          List<Object> entries, List<String> tooltips)
+  public static JComboBox<String> buildComboWithTooltips(
+          List<String> entries, List<String> tooltips)
   {
-    JComboBox<Object> combo = new JComboBox<>();
+    JComboBox<String> combo = new JComboBox<>();
     final ComboBoxTooltipRenderer renderer = new ComboBoxTooltipRenderer();
     combo.setRenderer(renderer);
-    for (Object attName : entries)
+    for (String attName : entries)
     {
       combo.addItem(attName);
     }
index d55733c..62bdd35 100644 (file)
@@ -86,7 +86,7 @@ public class LineartOptions extends JPanel
       ex.printStackTrace();
     }
 
-    dialog = JvOptionPane.newOptionDialog(Desktop.desktop);
+    dialog = JvOptionPane.newOptionDialog(Desktop.getDesktopPane());
   }
 
   /**
@@ -188,7 +188,7 @@ public class LineartOptions extends JPanel
     }
     else
     {
-      Cache.applicationProperties.remove(preferencesKey);
+      Cache.removePropertyNoSave(preferencesKey);
     }
   }
 
diff --git a/src/jalview/gui/MenuChooser.java b/src/jalview/gui/MenuChooser.java
deleted file mode 100644 (file)
index 0e42a7a..0000000
+++ /dev/null
@@ -1,99 +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 java.awt.BorderLayout;
-import java.awt.Color;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-
-import javax.swing.JButton;
-import javax.swing.JFrame;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-
-public class MenuChooser implements ActionListener
-{
-  public static boolean protein;
-
-  private JFrame choosemenu = new JFrame("Animation");
-
-  private JButton bouton = new JButton("bouton 1");
-
-  private JButton bouton2 = new JButton("bouton 2");
-
-  private JPanel container = new JPanel();
-
-  private JLabel label = new JLabel("Le JLabel");
-
-  public MenuChooser()
-  {
-
-    choosemenu.setSize(300, 300);
-    choosemenu.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
-    choosemenu.setLocationRelativeTo(null);
-
-    container.setBackground(Color.white);
-    container.setLayout(new BorderLayout());
-
-    // On ajoute notre Fenetre Ã  la liste des auditeurs de notre Bouton
-    bouton.addActionListener(this);
-    bouton2.addActionListener(this);
-
-    JPanel south = new JPanel();
-    south.add(bouton);
-    south.add(bouton2);
-    container.add(south, BorderLayout.SOUTH);
-
-    // On change la couleur de police
-    label.setForeground(Color.blue);
-    // Et on change l'alignement du texte grâce aux attributs static de la
-    // classe JLabel
-    label.setHorizontalAlignment(JLabel.CENTER);
-
-    container.add(label, BorderLayout.NORTH);
-
-    choosemenu.setContentPane(container);
-    choosemenu.setVisible(true);
-
-  }
-
-  // ...
-
-  // *******************************************************************************
-  // LA VOILAAAAAAAAAAAAAA
-  // *******************************************************************************
-  /**
-   * C'est la méthode qui sera appelée lors d'un clic sur notre bouton
-   */
-  public void actionPerformed(ActionEvent arg0)
-  {
-
-    if (arg0.getSource() == bouton)
-      protein = false;
-    label.setText("RNA menu");
-
-    if (arg0.getSource() == bouton2)
-      label.setText("Protein menu");
-    protein = true;
-  }
-
-}
index 02c8fe1..dc5d0f5 100644 (file)
@@ -72,7 +72,7 @@ public class OOMWarning implements Runnable
 
   public OOMWarning(String string, OutOfMemoryError oomerror)
   {
-    this(string, oomerror, Desktop.desktop);
+    this(string, oomerror, Desktop.getDesktopPane());
   }
 
   @Override
index ca27a9c..de55996 100644 (file)
@@ -22,6 +22,7 @@ package jalview.gui;
 
 import jalview.api.AlignViewportI;
 import jalview.bin.Cache;
+import jalview.datamodel.AlignmentI;
 import jalview.renderer.OverviewRenderer;
 import jalview.renderer.OverviewResColourFinder;
 import jalview.viewmodel.OverviewDimensions;
@@ -33,6 +34,7 @@ import java.awt.image.BufferedImage;
 
 import javax.swing.JPanel;
 
+@SuppressWarnings("serial")
 public class OverviewCanvas extends JPanel
 {
   private static final Color TRANS_GREY = new Color(100, 100, 100, 25);
@@ -43,11 +45,9 @@ public class OverviewCanvas extends JPanel
 
   private volatile boolean updaterunning = false;
 
-  private boolean dispose = false;
+  private boolean disposed = false;
 
-  private BufferedImage miniMe;
-
-  private BufferedImage lastMiniMe = null;
+  BufferedImage lastMiniMe = null;
 
   // Can set different properties in this seqCanvas than
   // main visible SeqCanvas
@@ -65,13 +65,26 @@ public class OverviewCanvas extends JPanel
 
   private ProgressPanel progressPanel;
 
-  public OverviewCanvas(OverviewDimensions overviewDims,
+  private boolean showSequenceFeatures;
+
+  private boolean showAnnotation;
+
+  private jalview.api.FeatureRenderer featureRenderer;
+
+  private OverviewPanel panel;
+
+  private boolean showProgress;
+
+  public OverviewCanvas(OverviewPanel panel,
+          OverviewDimensions overviewDims,
           AlignViewportI alignvp, ProgressPanel pp)
   {
+    this.panel = panel;
     od = overviewDims;
+    lastMiniMe = null;
     av = alignvp;
     progressPanel = pp;
-
+    showProgress = (pp != null);
     sr = new SequenceRenderer(av);
     sr.renderGaps = false;
     fr = new jalview.renderer.seqfeatures.FeatureRenderer(av);
@@ -84,6 +97,7 @@ public class OverviewCanvas extends JPanel
     cf = new OverviewResColourFinder(useLegacy, gapCol, hiddenCol);
 
     setSize(od.getWidth(), od.getHeight());
+    setPreferredSize(getSize()); // BH 2019.07.29 added
   }
 
   /**
@@ -95,6 +109,7 @@ public class OverviewCanvas extends JPanel
   public void resetOviewDims(OverviewDimensions overviewDims)
   {
     od = overviewDims;
+    lastMiniMe = null;
   }
 
   /**
@@ -107,20 +122,27 @@ public class OverviewCanvas extends JPanel
     {
       if (updaterunning)
       {
-        restart = true;
-        if (or != null)
-        {
-          or.setRedraw(true);
-        }
+        setRestart("restartDraw");
       }
       else
       {
         updaterunning = true;
+        restart = false;
       }
       return restart;
     }
   }
 
+  private void setRestart(String why)
+  {
+    // System.out.println("OC restart true " + why);
+    restart = true;
+    if (or != null)
+    {
+      or.setRedraw(true);
+    }
+  }
+
   /**
    * Draw the overview sequences
    * 
@@ -128,145 +150,173 @@ public class OverviewCanvas extends JPanel
    *          true if sequence features are to be shown
    * @param showAnnotation
    *          true if the annotation is to be shown
-   * @param transferRenderer
+   * @param featureRenderer
    *          the renderer to transfer feature colouring from
    */
   public void draw(boolean showSequenceFeatures, boolean showAnnotation,
-          FeatureRenderer transferRenderer)
+          jalview.api.FeatureRenderer featureRenderer)
   {
-    miniMe = null;
-
+    this.showSequenceFeatures = showSequenceFeatures;
+    this.showAnnotation = showAnnotation;
+    this.featureRenderer = featureRenderer;
     if (showSequenceFeatures)
     {
-      fr.transferSettings(transferRenderer);
+      fr.transferSettings(featureRenderer);
     }
-
     setPreferredSize(new Dimension(od.getWidth(), od.getHeight()));
+    AlignmentI al = av.getAlignment();
+    or = new OverviewRenderer(panel.ap, fr, od, al, av.getResidueShading(),
+            cf, showProgress);
+    if (showProgress)
+    {
+      or.addPropertyChangeListener(progressPanel);
+    }
+    or.drawMiniMe();
+  }
 
-    or = new OverviewRenderer(fr, od, av.getAlignment(),
-            av.getResidueShading(), cf);
-
-    or.addPropertyChangeListener(progressPanel);
-
-    miniMe = or.draw(od.getRows(av.getAlignment()),
-            od.getColumns(av.getAlignment()));
-
-    Graphics mg = miniMe.getGraphics();
+  synchronized void finalizeDraw(BufferedImage miniMe)
+  {
 
-    if (showAnnotation)
+    if (showProgress && or != null)
     {
-      mg.translate(0, od.getSequencesHeight());
-      or.drawGraph(mg, av.getAlignmentConservationAnnotation(),
-              od.getGraphHeight(), od.getColumns(av.getAlignment()));
-      mg.translate(0, -od.getSequencesHeight());
+      or.removePropertyChangeListener(progressPanel);
     }
-
-    or.removePropertyChangeListener(progressPanel);
-    or = null;
     if (restart)
     {
+      or = null;
       restart = false;
-      if (!dispose)
+      if (!disposed)
       {
-        draw(showSequenceFeatures, showAnnotation, transferRenderer);
+        draw(showSequenceFeatures, showAnnotation, featureRenderer);
       }
     }
     else
     {
+      if (showAnnotation && or != null)
+      {
+        or.drawGraph(av.getAlignmentConservationAnnotation());
+      }
+      or = null;
       updaterunning = false;
       lastMiniMe = miniMe;
+      repaint();
     }
   }
 
   @Override
   public void paintComponent(Graphics g)
   {
-    //super.paintComponent(g);
 
+    int w = getWidth();
+    int h = getHeight();
+    if (w == 0 || od.getBoxWidth() <= 0)
+    {
+      // BH 2019.07.27 removes two unnecessary paints, since boxwidth can be -1
+      // or 0 during early-stage painting
+      return;
+    }
+
+    boolean drawMe = (lastMiniMe != null);
     if (restart)
     {
-      if (lastMiniMe == null)
+      if (drawMe)
       {
-        g.setColor(Color.white);
-        g.fillRect(0, 0, getWidth(), getHeight());
+        g.drawImage(lastMiniMe, 0, 0, w, h, this);
       }
       else
       {
-        g.drawImage(lastMiniMe, 0, 0, getWidth(), getHeight(), this);
+        g.setColor(Color.white);
+        g.fillRect(0, 0, w, h);
       }
       g.setColor(TRANS_GREY);
-      g.fillRect(0, 0, getWidth(), getHeight());
+      g.fillRect(0, 0, w, h);
+      drawMe = false;
     }
-    else if (lastMiniMe != null)
+    else if (drawMe)
     {
       // is this a resize?
-      if ((getWidth() > 0) && (getHeight() > 0)
-              && ((getWidth() != od.getWidth())
-                      || (getHeight() != od.getHeight())))
+      if (w != od.getWidth() || h != od.getHeight())
       {
-        // if there is annotation, scale the alignment and annotation
-        // separately
-        if (od.getGraphHeight() > 0 
-                       && od.getSequencesHeight() > 0  // BH 2019
-                       )
-        {
-          BufferedImage topImage = lastMiniMe.getSubimage(0, 0,
-                  od.getWidth(), od.getSequencesHeight());
-          BufferedImage bottomImage = lastMiniMe.getSubimage(0,
-                  od.getSequencesHeight(), od.getWidth(),
-                  od.getGraphHeight());
-
-          // must be done at this point as we rely on using old width/height
-          // above, and new width/height below
-          od.setWidth(getWidth());
-          od.setHeight(getHeight());
-
-          // stick the images back together so lastMiniMe is consistent in the
-          // event of a repaint - BUT probably not thread safe
-          lastMiniMe = new BufferedImage(od.getWidth(), od.getHeight(),
-                  BufferedImage.TYPE_INT_RGB);
-          Graphics lg = lastMiniMe.getGraphics();
-          lg.drawImage(topImage, 0, 0, od.getWidth(),
-                  od.getSequencesHeight(), null);
-          lg.drawImage(bottomImage, 0, od.getSequencesHeight(),
-                  od.getWidth(), od.getGraphHeight(), this);
-          lg.dispose();
-        }
-        else
-        {
-          od.setWidth(getWidth());
-          od.setHeight(getHeight());
-        }
-
-        // make sure the box is in the right place
-        od.setBoxPosition(av.getAlignment().getHiddenSequences(),
-                av.getAlignment().getHiddenColumns());
+
+        lastMiniMe = null;
+        return;
+        // // if there is annotation, scale the alignment and annotation
+        // // separately
+        // if (od.getGraphHeight() <= 0 && od.getSequencesHeight() <= 0)
+        // {
+        // od.setWidth(w);
+        // od.setHeight(h);
+        // return;
+        // }
+        // try
+        // {
+        // BufferedImage topImage = lastMiniMe.getSubimage(0, 0,
+        // od.getWidth(), od.getSequencesHeight());
+        //
+        // BufferedImage bottomImage = lastMiniMe.getSubimage(0,
+        // od.getSequencesHeight(), od.getWidth(),
+        // od.getGraphHeight());
+        //
+        // // must be done at this point as we rely on using old width/height
+        // // above, and new width/height below
+        // od.setWidth(w);
+        // od.setHeight(h);
+        //
+        // // stick the images back together so lastMiniMe is consistent in the
+        // // event of a repaint - BUT probably not thread safe
+        //
+        // // right -- this fails with fast user action.
+        //
+        // lastMiniMe = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
+        // Graphics lg = lastMiniMe.getGraphics();
+        // lg.drawImage(topImage, 0, 0, w, od.getSequencesHeight(), null);
+        // lg.drawImage(bottomImage, 0, od.getSequencesHeight(), w,
+        // od.getGraphHeight(), this);
+        // lg.dispose();
+        //
+        // } catch (RasterFormatException e)
+        // {
+        // System.out.println("OC Raster Exception " + lastMiniMe.getWidth()
+        // + "/" + w + "," + lastMiniMe.getHeight() + "/" + h + " "
+        // + od.getSequencesHeight() + " " + od.getGraphHeight());
+        // }
+        // BH 2019: removed -- this is now taken care of using vpbox in
+        // OverviewDimension
+        // // make sure the box is in the right place
+        // od.setBoxPosition(av.getAlignment().getHiddenSequences(),
+        // av.getAlignment().getHiddenColumns());
       }
-      // fall back to normal behaviour
-      g.drawImage(lastMiniMe, 0, 0, getWidth(), getHeight(), this);
     }
-    else
+
+    if (drawMe)
     {
-      g.drawImage(lastMiniMe, 0, 0, getWidth(), getHeight(), this);
+      g.drawImage(lastMiniMe, 0, 0, w, h, this);
     }
-    
     // draw the box
     g.setColor(Color.red);
+    // System.out.println("OC paintComponent nd=" + ndraw + " nr=" + nrepaint
+    // + " np=" + ++npaint);
     od.drawBox(g);
   }
 
+  // private int ndraw, npaint, nrepaint;
+
+  // @Override
+  // public void repaint()
+  // {
+  // System.out.println("OC repaint " + (++nrepaint));
+  // super.repaint();
+  // }
 
   public void dispose()
   {
-    dispose = true;
+    disposed = true;
     od = null;
+    lastMiniMe = null;
     synchronized (this)
     {
-      restart = true;
-      if (or != null)
-      {
-        or.setRedraw(true);
-      }
+      setRestart("dispose");
     }
   }
+
 }
index a5aaf7c..5694c3d 100755 (executable)
@@ -20,6 +20,8 @@
  */
 package jalview.gui;
 
+import jalview.api.AlignViewportI;
+import jalview.api.AlignmentViewPanel;
 import jalview.bin.Cache;
 import jalview.renderer.OverviewRenderer;
 import jalview.util.MessageManager;
@@ -61,11 +63,11 @@ public class OverviewPanel extends JPanel
 {
   protected OverviewDimensions od;
 
-  private OverviewCanvas oviewCanvas;
+  OverviewCanvas canvas;
 
-  protected AlignViewport av;
+  protected AlignViewportI av;
 
-  private AlignmentPanel ap;
+  AlignmentViewPanel ap;
 
   protected JCheckBoxMenuItem displayToggle;
 
@@ -75,71 +77,50 @@ public class OverviewPanel extends JPanel
 
   protected ProgressPanel progressPanel;
 
+  private Dimension dim;
+
+  private boolean showProgress = !Platform.isJS(); // Jalview.getInstance().getShowStatus()
+
   /**
    * Creates a new OverviewPanel object.
    * 
    * @param alPanel
    *          The alignment panel which is shown in the overview panel
    */
-  public OverviewPanel(AlignmentPanel alPanel)
+  public OverviewPanel(AlignmentViewPanel alPanel, Dimension dim)
   {
-    this.av = alPanel.av;
+    this.av = alPanel.getAlignViewport();
     this.ap = alPanel;
+    this.dim = dim;
 
     showHidden = Cache.getDefault(Preferences.SHOW_OV_HIDDEN_AT_START,
             false);
-    if (showHidden)
-    {
-      od = new OverviewDimensionsShowHidden(av.getRanges(),
-            (av.isShowAnnotation()
-                    && av.getAlignmentConservationAnnotation() != null));
-    }
-    else
-    {
-      od = new OverviewDimensionsHideHidden(av.getRanges(),
-              (av.isShowAnnotation()
-                      && av.getAlignmentConservationAnnotation() != null));
-    }
-
+    createOverviewDimensions();
     setLayout(new BorderLayout());
     progressPanel = new ProgressPanel(OverviewRenderer.UPDATE,
             MessageManager.getString("label.oview_calc"), getWidth());
-    this.add(progressPanel, BorderLayout.SOUTH);
-    oviewCanvas = new OverviewCanvas(od, av, progressPanel);
-
-    add(oviewCanvas, BorderLayout.CENTER);
+    if (showProgress) // BH 2019
+    {
+      add(progressPanel, BorderLayout.SOUTH);
+    }
+    canvas = new OverviewCanvas(this, od, av,
+            showProgress ? progressPanel : null);
+    canvas.setPreferredSize(canvas.getSize());
+    add(canvas, BorderLayout.CENTER);
 
     av.getRanges().addPropertyChangeListener(this);
 
     // without this the overview window does not size to fit the overview canvas
-    setPreferredSize(new Dimension(od.getWidth(), od.getHeight()));
-    
+    // BH - no,no! - This does not include the progressPanel!
+    // BH the problem was that OverviewCanvas.setPreferredSize() had not been set.
+    // setPreferredSize(new Dimension(od.getWidth(), od.getHeight()));
+
     addComponentListener(new ComponentAdapter()
     {
       @Override
       public void componentResized(ComponentEvent evt)
       {
-        // Resize is called on the initial display of the overview.
-        // This code adjusts sizes to account for the progress bar if it has not
-        // already been accounted for, which triggers another resize call for
-        // the correct sizing, at which point the overview image is updated.
-        // (This avoids a double recalculation of the image.)
-        if (getWidth() == od.getWidth() && getHeight() == od.getHeight()
-                + progressPanel.getHeight())
-        {
-          updateOverviewImage();
-        }
-        else
-        {
-          if ((getWidth() > 0) && (getHeight() > 0))
-          {
-            od.setWidth(getWidth());
-            od.setHeight(getHeight() - progressPanel.getHeight());
-          }
-
-          setPreferredSize(new Dimension(od.getWidth(),
-                  od.getHeight() + progressPanel.getHeight()));
-        }
+        resizePanel();
       }
 
     });
@@ -195,37 +176,39 @@ public class OverviewPanel extends JPanel
       @Override
       public void mousePressed(MouseEvent evt)
       {
-         
-       if (Platform.isWinRightButton(evt)) {
-               showPopupMenu(evt);
-               return;
-       }
-        if (SwingUtilities.isRightMouseButton(evt)) {
-               return;
+
+        if (Platform.isWinRightButton(evt))
+        {
+          showPopupMenu(evt);
+          return;
         }
-          // don't do anything if the mouse press is in the overview's box
-          // (wait to see if it's a drag instead)
-          // otherwise update the viewport
-          if (!od.isPositionInBox(evt.getX(), evt.getY()))
-          {
-            draggingBox = false;
+        if (SwingUtilities.isRightMouseButton(evt))
+        {
+          return;
+        }
+        // don't do anything if the mouse press is in the overview's box
+        // (wait to see if it's a drag instead)
+        // otherwise update the viewport
+        if (!od.isPositionInBox(evt.getX(), evt.getY()))
+        {
+          draggingBox = false;
 
-            // display drag cursor at mouse position
-            setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
+          // display drag cursor at mouse position
+          setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
 
-            od.updateViewportFromMouse(evt.getX(), evt.getY(),
-                    av.getAlignment().getHiddenSequences(),
-                    av.getAlignment().getHiddenColumns());
-            getParent().setCursor(
-                    Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
-          }
-          else
-          {
-            draggingBox = true;
-            od.setDragPoint(evt.getX(), evt.getY(),
-                    av.getAlignment().getHiddenSequences(),
-                    av.getAlignment().getHiddenColumns());
-          }
+          od.updateViewportFromMouse(evt.getX(), evt.getY(),
+                  av.getAlignment().getHiddenSequences(),
+                  av.getAlignment().getHiddenColumns());
+          getParent().setCursor(
+                  Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
+        }
+        else
+        {
+          draggingBox = true;
+          od.setDragPoint(evt.getX(), evt.getY(),
+                  av.getAlignment().getHiddenSequences(),
+                  av.getAlignment().getHiddenColumns());
+        }
       }
 
       @Override
@@ -245,14 +228,71 @@ public class OverviewPanel extends JPanel
 
     });
 
-    /*
-     * Javascript does not call componentResized on initial display,
-     * so do the update here
-     */
-    if (Platform.isJS())
+    // /*
+    // * Javascript does not call componentResized on initial display,
+    // * so do the update here
+    // */
+    // if (Platform.isJS())
+    // {
+    // updateOverviewImage();
+    // }
+  }
+
+  protected void resizePanel()
+  {
+    int ph = (progressPanel.getParent() == null ? 0
+            : progressPanel.getHeight());
+    // Resize is called on the initial display of the overview.
+    // This code adjusts sizes to account for the progress bar if it has not
+    // already been accounted for, which triggers another resize call for
+    // the correct sizing, at which point the overview image is updated.
+    // (This avoids a double recalculation of the image.)
+    if (getWidth() == od.getWidth() && getHeight() == od.getHeight() + ph)
+    {
+      if (canvas.lastMiniMe == null)
+      {
+        updateOverviewImage();
+      }
+    }
+    else
+    {
+      int w = getWidth();
+      int h = getHeight();
+      if ((w > 0) && (h > 0))
+      {
+        if (dim != null)
+        {
+          dim.setSize(w, h - ph);
+        }
+        od.setWidth(w);
+        od.setHeight(h - ph);
+        updateOverviewImage();
+      }
+      // BH 2019.07.29 this is unnecessary -- it is what layout managers are
+      // for:
+      // setPreferredSize(new Dimension(od.getWidth(), od.getHeight() +
+      // ph));
+    }
+  }
+
+  /**
+   * Create the appropriate type of OverViewDimensions, with the desired size.
+   */
+  private void createOverviewDimensions()
+  {
+    boolean showAnnotation = (av.isShowAnnotation()
+            && av.getAlignmentConservationAnnotation() != null);
+    if (showHidden)
+    {
+      od = new OverviewDimensionsShowHidden(av.getRanges(), showAnnotation,
+              dim);
+    }
+    else
     {
-      updateOverviewImage();
+      od = new OverviewDimensionsHideHidden(av.getRanges(), showAnnotation,
+              dim);
     }
+
   }
 
   /*
@@ -285,31 +325,32 @@ public class OverviewPanel extends JPanel
    */
   protected void toggleHiddenColumns()
   {
-    if (showHidden)
-    {
-      showHidden = false;
-      od = new OverviewDimensionsHideHidden(av.getRanges(),
-              (av.isShowAnnotation()
-                      && av.getAlignmentConservationAnnotation() != null));
-    }
-    else
-    {
-      showHidden = true;
-      od = new OverviewDimensionsShowHidden(av.getRanges(),
-              (av.isShowAnnotation()
-                      && av.getAlignmentConservationAnnotation() != null));
-    }
-    oviewCanvas.resetOviewDims(od);
+    showHidden = !showHidden;
+    createOverviewDimensions();
+    canvas.resetOviewDims(od);
     updateOverviewImage();
     setBoxPosition();
   }
 
   /**
-   * Updates the overview image when the related alignment panel is updated
+   * Updates the overview image when the related alignment panel is updated.
+   * 
+   * Cases:
+   * 
+   * AlignFrame.setFeatureGroupState
+   * 
+   * AlignmentPanel.paintAlignment(true,...) (117 references)
+   * 
+   * OverviewPanel..componentResized() OverviewPanel.toggleHiddenColumns()
+   * 
+   * PopupMenu for action.reveal_sequences, action.reveal_all
+   * 
+   * SliderPanel.mouseReleased()
+   * 
    */
   public void updateOverviewImage()
   {
-    if (oviewCanvas == null)
+    if (canvas == null)
     {
       /*
        * panel has been disposed
@@ -317,37 +358,36 @@ public class OverviewPanel extends JPanel
       return;
     }
 
+    int ph = (progressPanel.getParent() == null ? 0
+            : progressPanel.getHeight());
+
     if ((getWidth() > 0) && (getHeight() > 0))
     {
       od.setWidth(getWidth());
-      od.setHeight(getHeight() - progressPanel.getHeight());
+      od.setHeight(getHeight() - ph);
     }
-    
-    setPreferredSize(new Dimension(od.getWidth(),
-            od.getHeight() + progressPanel.getHeight()));
 
-    if (oviewCanvas.restartDraw())
+    setPreferredSize(new Dimension(od.getWidth(), od.getHeight() + ph));
+
+    if (canvas.restartDraw())
     {
       return;
     }
 
     Thread thread = new Thread(this);
     thread.start();
-    repaint();
-
-    
   }
 
   @Override
   public void run()
   {
-    if (oviewCanvas != null)
+    if (canvas != null)
     {
-      oviewCanvas.draw(av.isShowSequenceFeatures(),
+      setBoxPosition();
+      canvas.draw(av.isShowSequenceFeatures(),
               (av.isShowAnnotation()
                       && av.getAlignmentConservationAnnotation() != null),
-              ap.getSeqPanel().seqCanvas.getFeatureRenderer());
-      setBoxPosition();
+              ap.getFeatureRenderer());
     }
   }
 
@@ -360,6 +400,7 @@ public class OverviewPanel extends JPanel
   {
     if (od != null)
     {
+      od.updateBox();
       int oldX = od.getBoxX();
       int oldY = od.getBoxY();
       int oldWidth = od.getBoxWidth();
@@ -400,14 +441,15 @@ public class OverviewPanel extends JPanel
         av.getRanges().removePropertyChangeListener(this);
       }
 
-      oviewCanvas.dispose();
+      canvas.dispose();
 
       /*
        * close the parent frame (which also removes it from the
        * Desktop Windows menu)
        */
-      ((JInternalFrame) SwingUtilities.getAncestorOfClass(
-              JInternalFrame.class, (this))).setClosed(true);
+      ((JInternalFrame) SwingUtilities
+              .getAncestorOfClass(JInternalFrame.class, (this)))
+                      .setClosed(true);
     } catch (PropertyVetoException e)
     {
       // ignore
@@ -415,7 +457,7 @@ public class OverviewPanel extends JPanel
     {
       progressPanel = null;
       av = null;
-      oviewCanvas = null;
+      canvas = null;
       ap = null;
       od = null;
     }
index 96a8b0d..d1e7565 100644 (file)
@@ -572,11 +572,11 @@ public class PCAPanel extends GPCAPanel
     // }
     //
     // JPanel progressPanel;
-    // Long lId = Long.valueOf(id);
+    // Long lId = new Long(id);
     // GridLayout layout = (GridLayout) statusPanel.getLayout();
     // if (progressBars.get(lId) != null)
     // {
-    // progressPanel = (JPanel) progressBars.get(Long.valueOf(id));
+    // progressPanel = (JPanel) progressBars.get(new Long(id));
     // statusPanel.remove(progressPanel);
     // progressBars.remove(lId);
     // progressPanel = null;
@@ -615,13 +615,13 @@ public class PCAPanel extends GPCAPanel
           final IProgressIndicatorHandler handler)
   {
     progressBar.registerHandler(id, handler);
-    // if (progressBarHandlers == null || !progressBars.contains(Long.valueOf(id)))
+    // if (progressBarHandlers == null || !progressBars.contains(new Long(id)))
     // {
     // throw new
     // Error(MessageManager.getString("error.call_setprogressbar_before_registering_handler"));
     // }
-    // progressBarHandlers.put(Long.valueOf(id), handler);
-    // final JPanel progressPanel = (JPanel) progressBars.get(Long.valueOf(id));
+    // progressBarHandlers.put(new Long(id), handler);
+    // final JPanel progressPanel = (JPanel) progressBars.get(new Long(id));
     // if (handler.canCancel())
     // {
     // JButton cancel = new JButton(
index ad33110..3145f7c 100644 (file)
@@ -304,10 +304,10 @@ public class PopupMenu extends JPopupMenu implements ColourChangeListener
   {
     try
     {
-      jalview.util.BrowserLauncher.openURL(url);
+      Platform.openURL(url);
     } catch (Exception ex)
     {
-      JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+      JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
               MessageManager.getString("label.web_browser_not_found_unix"),
               MessageManager.getString("label.web_browser_not_found"),
               JvOptionPane.WARNING_MESSAGE);
@@ -317,7 +317,9 @@ public class PopupMenu extends JPopupMenu implements ColourChangeListener
   }
 
   /**
-   * add a late bound groupURL item to the given linkMenu
+   * For the popup menu on the idPanel.
+   * 
+   * Add a late bound groupURL item to the given linkMenu
    * 
    * @param linkMenu
    * @param label
@@ -349,6 +351,15 @@ public class PopupMenu extends JPopupMenu implements ColourChangeListener
           {
             try
             {
+              // Object[] { int[] { number of matches seqs },
+              // boolean[] { which matched },
+              // StringBuffer[] { segment generated from inputs },
+              // String[] { url }
+              // }
+
+              // TODO bug: urlstub is { int[], boolean[] } but constructFrom
+              // requires something else.
+
               showLink(urlgenerator.constructFrom(urlstub));
             } catch (UrlStringTooLongException e2)
             {
@@ -388,6 +399,7 @@ public class PopupMenu extends JPopupMenu implements ColourChangeListener
    *          non-positional features if in the Id panel, features at the
    *          clicked residue if in the sequence panel
    * @param groupLinks
+   *          not implemented -- empty list
    */
   public PopupMenu(final AlignmentPanel alignPanel, final SequenceI seq,
           List<SequenceFeature> features, List<String> groupLinks)
@@ -658,6 +670,7 @@ public class PopupMenu extends JPopupMenu implements ColourChangeListener
       // add any groupURLs to the groupURL submenu and make it visible
       if (groupLinks != null && groupLinks.size() > 0)
       {
+        // not implemented -- empty list
         buildGroupURLMenu(sg, groupLinks);
       }
       // Add a 'show all structures' for the current selection
@@ -983,6 +996,12 @@ public class PopupMenu extends JPopupMenu implements ColourChangeListener
     showOrHideMenu.add(item);
   }
 
+  /**
+   *
+   * @param sg
+   * @param groupLinks
+   *          not implemented -- empty list
+   */
   private void buildGroupURLMenu(SequenceGroup sg, List<String> groupLinks)
   {
 
@@ -1044,9 +1063,15 @@ public class PopupMenu extends JPopupMenu implements ColourChangeListener
         }
       }
     }
+    if (groupLinks.size() == 0)
+    {
+      return;
+    }
     // now create group links for all distinct ID/sequence sets.
     boolean addMenu = false; // indicates if there are any group links to give
                              // to user
+
+    // not implmeented -- empty list
     for (String link : groupLinks)
     {
       GroupUrlLink urlLink = null;
@@ -1099,6 +1124,7 @@ public class PopupMenu extends JPopupMenu implements ColourChangeListener
       {
         urlset = urlLink.makeUrlStubs(ids, seqstr,
                 "FromJalview" + System.currentTimeMillis(), false);
+        // { int[], boolean[] } only here
       } catch (UrlStringTooLongException e)
       {
       }
@@ -1127,7 +1153,6 @@ public class PopupMenu extends JPopupMenu implements ColourChangeListener
           groupLinksMenu.add(linkMenus[m]);
         }
       }
-
       groupMenu.add(groupLinksMenu);
     }
   }
@@ -1985,7 +2010,7 @@ public class PopupMenu extends JPopupMenu implements ColourChangeListener
         refresh();
       };
     };
-    JalviewColourChooser.showColourChooser(Desktop.getDesktop(),
+    JalviewColourChooser.showColourChooser(Desktop.getDesktopPane(),
             title, Color.BLUE, listener);
   }
 
index 94f67f6..b1206a2 100755 (executable)
@@ -25,7 +25,6 @@ import jalview.bin.Cache;
 import jalview.gui.Help.HelpId;
 import jalview.gui.StructureViewer.ViewerType;
 import jalview.io.BackupFiles;
-import jalview.io.BackupFilesPresetEntry;
 import jalview.io.FileFormatI;
 import jalview.io.JalviewFileChooser;
 import jalview.io.JalviewFileView;
@@ -38,6 +37,7 @@ import jalview.urls.UrlLinkTableModel;
 import jalview.urls.api.UrlProviderFactoryI;
 import jalview.urls.api.UrlProviderI;
 import jalview.urls.desktop.DesktopUrlProviderFactory;
+import jalview.util.BrowserLauncher;
 import jalview.util.MessageManager;
 import jalview.util.Platform;
 import jalview.util.UrlConstants;
@@ -81,43 +81,139 @@ import ext.edu.ucsf.rbvi.strucviz2.StructureManager;
  * @author $author$
  * @version $Revision$
  */
+@SuppressWarnings("serial")
 public class Preferences extends GPreferences
 {
-  public static final String ENABLE_SPLIT_FRAME = "ENABLE_SPLIT_FRAME";
+  public static final String ADD_SS_ANN = "ADD_SS_ANN";
 
-  public static final String SCALE_PROTEIN_TO_CDNA = "SCALE_PROTEIN_TO_CDNA";
+  public static final String ADD_TEMPFACT_ANN = "ADD_TEMPFACT_ANN";
+
+  public static final String ALLOW_UNPUBLISHED_PDB_QUERYING = "ALLOW_UNPUBLISHED_PDB_QUERYING";
+
+  public static final String ANNOTATIONCOLOUR_MAX = "ANNOTATIONCOLOUR_MAX";
+
+  public static final String ANNOTATIONCOLOUR_MIN = "ANNOTATIONCOLOUR_MIN";
+
+  public static final String ANTI_ALIAS = "ANTI_ALIAS";
+
+  public static final String AUTO_CALC_CONSENSUS = "AUTO_CALC_CONSENSUS";
+
+  public static final String AUTOASSOCIATE_PDBANDSEQS = "AUTOASSOCIATE_PDBANDSEQS";
+
+  public static final String CENTRE_COLUMN_LABELS = "CENTRE_COLUMN_LABELS";
+
+  public static final String CHIMERA_PATH = "CHIMERA_PATH";
+
+  public static final String DBREFFETCH_USEPICR = "DBREFFETCH_USEPICR";
 
   public static final String DEFAULT_COLOUR = "DEFAULT_COLOUR";
 
+  public static final String DEFAULT_COLOUR_NUC = "DEFAULT_COLOUR_NUC";
+
   public static final String DEFAULT_COLOUR_PROT = "DEFAULT_COLOUR_PROT";
 
-  public static final String DEFAULT_COLOUR_NUC = "DEFAULT_COLOUR_NUC";
+  public static final String ENABLE_SPLIT_FRAME = "ENABLE_SPLIT_FRAME";
 
-  public static final String ADD_TEMPFACT_ANN = "ADD_TEMPFACT_ANN";
+  public static final String FIGURE_AUTOIDWIDTH = "FIGURE_AUTOIDWIDTH";
 
-  public static final String ADD_SS_ANN = "ADD_SS_ANN";
+  public static final String FIGURE_FIXEDIDWIDTH = "FIGURE_FIXEDIDWIDTH";
 
-  public static final String USE_RNAVIEW = "USE_RNAVIEW";
+  public static final String FOLLOW_SELECTIONS = "FOLLOW_SELECTIONS";
 
-  public static final String STRUCT_FROM_PDB = "STRUCT_FROM_PDB";
+  public static final String FONT_NAME = "FONT_NAME";
 
-  public static final String STRUCTURE_DISPLAY = "STRUCTURE_DISPLAY";
+  public static final String FONT_SIZE = "FONT_SIZE";
 
-  public static final String CHIMERA_PATH = "CHIMERA_PATH";
+  public static final String FONT_STYLE = "FONT_STYLE";
 
-  public static final String SORT_ANNOTATIONS = "SORT_ANNOTATIONS";
+  public static final String GAP_COLOUR = "GAP_COLOUR";
+
+  public static final String GAP_SYMBOL = "GAP_SYMBOL";
+
+  public static final String HIDDEN_COLOUR = "HIDDEN_COLOUR";
+
+  public static final String HIDE_INTRONS = "HIDE_INTRONS";
+
+  public static final String ID_ITALICS = "ID_ITALICS";
+
+  public static final String ID_ORG_HOSTURL = "ID_ORG_HOSTURL";
+
+  public static final String MAP_WITH_SIFTS = "MAP_WITH_SIFTS";
+
+  public static final String NOQUESTIONNAIRES = "NOQUESTIONNAIRES";
+
+  public static final String NORMALISE_CONSENSUS_LOGO = "NORMALISE_CONSENSUS_LOGO";
+
+  public static final String NORMALISE_LOGO = "NORMALISE_LOGO";
+
+  public static final String PAD_GAPS = "PAD_GAPS";
+
+  public static final String PDB_DOWNLOAD_FORMAT = "PDB_DOWNLOAD_FORMAT";
+
+  public static final String QUESTIONNAIRE = "QUESTIONNAIRE";
+
+  public static final String RELAXEDSEQIDMATCHING = "RELAXEDSEQIDMATCHING";
+
+  public static final String RIGHT_ALIGN_IDS = "RIGHT_ALIGN_IDS";
+
+  public static final String SCALE_PROTEIN_TO_CDNA = "SCALE_PROTEIN_TO_CDNA";
+
+  public static final String SHOW_ANNOTATIONS = "SHOW_ANNOTATIONS";
 
   public static final String SHOW_AUTOCALC_ABOVE = "SHOW_AUTOCALC_ABOVE";
 
+  public static final String SHOW_CONSENSUS = "SHOW_CONSENSUS";
+
+  public static final String SHOW_CONSENSUS_HISTOGRAM = "SHOW_CONSENSUS_HISTOGRAM";
+
+  public static final String SHOW_CONSENSUS_LOGO = "SHOW_CONSENSUS_LOGO";
+
+  public static final String SHOW_CONSERVATION = "SHOW_CONSERVATION";
+
+  public static final String SHOW_DBREFS_TOOLTIP = "SHOW_DBREFS_TOOLTIP";
+
+  public static final String SHOW_GROUP_CONSENSUS = "SHOW_GROUP_CONSENSUS";
+
+  public static final String SHOW_GROUP_CONSERVATION = "SHOW_GROUP_CONSERVATION";
+
+  public static final String SHOW_JVSUFFIX = "SHOW_JVSUFFIX";
+
+  public static final String SHOW_NPFEATS_TOOLTIP = "SHOW_NPFEATS_TOOLTIP";
+
   public static final String SHOW_OCCUPANCY = "SHOW_OCCUPANCY";
 
   public static final String SHOW_OV_HIDDEN_AT_START = "SHOW_OV_HIDDEN_AT_START";
 
+  public static final String SHOW_OVERVIEW = "SHOW_OVERVIEW";
+
+  public static final String SHOW_QUALITY = "SHOW_QUALITY";
+
+  public static final String SHOW_UNCONSERVED = "SHOW_UNCONSERVED";
+
+  public static final String SORT_ALIGNMENT = "SORT_ALIGNMENT";
+
+  public static final String SORT_ANNOTATIONS = "SORT_ANNOTATIONS";
+
+  public static final String SORT_BY_TREE = "SORT_BY_TREE";
+
+  public static final String STRUCT_FROM_PDB = "STRUCT_FROM_PDB";
+
+  public static final String STRUCTURE_DISPLAY = "STRUCTURE_DISPLAY";
+
+  public static final String STRUCTURE_DIMENSIONS = "STRUCTURE_DIMENSIONS";
+
+  public static final String UNIPROT_DOMAIN = "UNIPROT_DOMAIN";
+
+  public static final String USE_FULL_SO = "USE_FULL_SO";
+
   public static final String USE_LEGACY_GAP = "USE_LEGACY_GAP";
 
-  public static final String GAP_COLOUR = "GAP_COLOUR";
+  public static final String USE_RNAVIEW = "USE_RNAVIEW";
+
+  public static final String USER_DEFINED_COLOURS = "USER_DEFINED_COLOURS";
+
+  public static final String WRAP_ALIGNMENT = "WRAP_ALIGNMENT";
 
-  public static final String HIDDEN_COLOUR = "HIDDEN_COLOUR";
 
   private static final int MIN_FONT_SIZE = 1;
 
@@ -127,9 +223,9 @@ 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 UrlProviderI sequenceUrlLinks;
+  public static UrlProviderI sequenceUrlLinks; // must be nonfinal for test
 
-  public static UrlLinkTableModel dataModel;
+  public final static UrlLinkTableModel dataModel;
 
   /**
    * Holds name and link separated with | character. Sequence IDS and Sequences
@@ -139,7 +235,17 @@ public class Preferences extends GPreferences
    * (TODO: proper escape for using | to separate ids or sequences
    */
 
-  public static List<String> groupURLLinks;
+  public static final List<String> groupURLLinks; // not implemented
+
+  public static final String BLOSUM62_PCA_FOR_NUCLEOTIDE = "BLOSUM62_PCA_FOR_NUCLEOTIDE";
+
+  public static final String SHOW_IDENTITY = "SHOW_IDENTITY";
+
+  public static final String SHOW_FULLSCREEN = "SHOW_FULLSCREEN";
+
+  public static final Dimension DEFAULT_STRUCTURE_DIMENSIONS = new Dimension(
+          600, 600);
+
   static
   {
     // get links selected to be in the menu (SEQUENCE_LINKS)
@@ -165,7 +271,7 @@ public class Preferences extends GPreferences
      * .properties file as '|' separated strings
      */
 
-    groupURLLinks = new ArrayList<>();
+    groupURLLinks = new ArrayList<>(); // not implemented
   }
 
   JInternalFrame frame;
@@ -200,11 +306,13 @@ public class Preferences extends GPreferences
       wsPrefs = new WsPreferences();
       wsTab.add(wsPrefs, BorderLayout.CENTER);
     }
-    int width = 500, height = 450;
+    int width = 500, height = 510; // BH 2019.07.12 added 60 to height
+    // (structure panel was too small anyway, and I added a default dimension
+    // for Jmol
     if (Platform.isAMacAndNotJS())
     {
       width = 570;
-      height = 480;
+      height = 540; // BH 2019.07.12 added 30
     }
 
     Desktop.addInternalFrame(frame,
@@ -214,30 +322,30 @@ public class Preferences extends GPreferences
     /*
      * Set Visual tab defaults
      */
-    seqLimit.setSelected(Cache.getDefault("SHOW_JVSUFFIX", true));
-    rightAlign.setSelected(Cache.getDefault("RIGHT_ALIGN_IDS", false));
-    fullScreen.setSelected(Cache.getDefault("SHOW_FULLSCREEN", false));
-    annotations.setSelected(Cache.getDefault("SHOW_ANNOTATIONS", true));
-
-    conservation.setSelected(Cache.getDefault("SHOW_CONSERVATION", true));
-    quality.setSelected(Cache.getDefault("SHOW_QUALITY", true));
-    identity.setSelected(Cache.getDefault("SHOW_IDENTITY", true));
-    openoverv.setSelected(Cache.getDefault("SHOW_OVERVIEW", false));
+    seqLimit.setSelected(Cache.getDefault(SHOW_JVSUFFIX, true));
+    rightAlign.setSelected(Cache.getDefault(RIGHT_ALIGN_IDS, false));
+    fullScreen.setSelected(Cache.getDefault(SHOW_FULLSCREEN, false));
+    annotations.setSelected(Cache.getDefault(SHOW_ANNOTATIONS, true));
+
+    conservation.setSelected(Cache.getDefault(SHOW_CONSERVATION, true));
+    quality.setSelected(Cache.getDefault(SHOW_QUALITY, true));
+    identity.setSelected(Cache.getDefault(SHOW_IDENTITY, true));
+    openoverv.setSelected(Cache.getDefault(SHOW_OVERVIEW, false));
     showUnconserved
-            .setSelected(Cache.getDefault("SHOW_UNCONSERVED", false));
+            .setSelected(Cache.getDefault(SHOW_UNCONSERVED, false));
     showOccupancy.setSelected(Cache.getDefault(SHOW_OCCUPANCY, false));
     showGroupConsensus
-            .setSelected(Cache.getDefault("SHOW_GROUP_CONSENSUS", false));
+            .setSelected(Cache.getDefault(SHOW_GROUP_CONSENSUS, false));
     showGroupConservation.setSelected(
-            Cache.getDefault("SHOW_GROUP_CONSERVATION", false));
+            Cache.getDefault(SHOW_GROUP_CONSERVATION, false));
     showConsensHistogram.setSelected(
-            Cache.getDefault("SHOW_CONSENSUS_HISTOGRAM", true));
+            Cache.getDefault(SHOW_CONSENSUS_HISTOGRAM, true));
     showConsensLogo
-            .setSelected(Cache.getDefault("SHOW_CONSENSUS_LOGO", false));
+            .setSelected(Cache.getDefault(SHOW_CONSENSUS_LOGO, false));
     showNpTooltip
-            .setSelected(Cache.getDefault("SHOW_NPFEATS_TOOLTIP", true));
+            .setSelected(Cache.getDefault(SHOW_NPFEATS_TOOLTIP, true));
     showDbRefTooltip
-            .setSelected(Cache.getDefault("SHOW_DBREFS_TOOLTIP", true));
+            .setSelected(Cache.getDefault(SHOW_DBREFS_TOOLTIP, true));
 
     String[] fonts = java.awt.GraphicsEnvironment
             .getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
@@ -255,28 +363,28 @@ public class Preferences extends GPreferences
     fontStyleCB.addItem("bold");
     fontStyleCB.addItem("italic");
 
-    fontNameCB.setSelectedItem(Cache.getDefault("FONT_NAME", "SansSerif"));
-    fontSizeCB.setSelectedItem(Cache.getDefault("FONT_SIZE", "10"));
+    fontNameCB.setSelectedItem(Cache.getDefault(FONT_NAME, "SansSerif"));
+    fontSizeCB.setSelectedItem(Cache.getDefault(FONT_SIZE, "10"));
     fontStyleCB.setSelectedItem(
-            Cache.getDefault("FONT_STYLE", Font.PLAIN + ""));
+            Cache.getDefault(FONT_STYLE, Font.PLAIN + ""));
 
-    smoothFont.setSelected(Cache.getDefault("ANTI_ALIAS", false));
+    smoothFont.setSelected(Cache.getDefault(ANTI_ALIAS, false));
     scaleProteinToCdna
             .setSelected(Cache.getDefault(SCALE_PROTEIN_TO_CDNA, false));
 
-    idItalics.setSelected(Cache.getDefault("ID_ITALICS", true));
+    idItalics.setSelected(Cache.getDefault(ID_ITALICS, true));
 
-    wrap.setSelected(Cache.getDefault("WRAP_ALIGNMENT", false));
+    wrap.setSelected(Cache.getDefault(WRAP_ALIGNMENT, false));
 
     gapSymbolCB.addItem("-");
     gapSymbolCB.addItem(".");
 
-    gapSymbolCB.setSelectedItem(Cache.getDefault("GAP_SYMBOL", "-"));
+    gapSymbolCB.setSelectedItem(Cache.getDefault(GAP_SYMBOL, "-"));
 
     sortby.addItem("No sort");
     sortby.addItem("Id");
     sortby.addItem("Pairwise Identity");
-    sortby.setSelectedItem(Cache.getDefault("SORT_ALIGNMENT", "No sort"));
+    sortby.setSelectedItem(Cache.getDefault(SORT_ALIGNMENT, "No sort"));
 
     sortAnnBy.addItem(SequenceAnnotationOrder.NONE.toString());
     sortAnnBy
@@ -317,9 +425,9 @@ public class Preferences extends GPreferences
     newProp = Cache.getDefault(DEFAULT_COLOUR_NUC, null);
     nucColour.setSelectedItem(newProp != null ? newProp : oldProp);
     minColour.setBackground(
-            Cache.getDefaultColour("ANNOTATIONCOLOUR_MIN", Color.orange));
+            Cache.getDefaultColour(ANNOTATIONCOLOUR_MIN, Color.orange));
     maxColour.setBackground(
-            Cache.getDefaultColour("ANNOTATIONCOLOUR_MAX", Color.red));
+            Cache.getDefaultColour(ANNOTATIONCOLOUR_MAX, Color.red));
 
     /*
      * Set overview panel defaults
@@ -349,6 +457,10 @@ public class Preferences extends GPreferences
     addTempFactor.setEnabled(structSelected);
     structViewer.setSelectedItem(
             Cache.getDefault(STRUCTURE_DISPLAY, ViewerType.JMOL.name()));
+    Dimension d = Cache.getDefaultDim(STRUCTURE_DIMENSIONS,
+            DEFAULT_STRUCTURE_DIMENSIONS);
+    String s = d.width + "," + d.height;
+    structureDimensions.setText(s);
     chimeraPath.setText(Cache.getDefault(CHIMERA_PATH, ""));
     chimeraPath.addActionListener(new ActionListener()
     {
@@ -359,7 +471,7 @@ public class Preferences extends GPreferences
       }
     });
 
-    if (Cache.getDefault("MAP_WITH_SIFTS", false))
+    if (Cache.getDefault(MAP_WITH_SIFTS, false))
     {
       siftsMapping.setSelected(true);
     }
@@ -369,7 +481,7 @@ public class Preferences extends GPreferences
     }
 
     SiftsSettings
-            .setMapWithSifts(Cache.getDefault("MAP_WITH_SIFTS", false));
+            .setMapWithSifts(Cache.getDefault(MAP_WITH_SIFTS, false));
 
     /*
      * Set Connections tab defaults
@@ -505,7 +617,7 @@ public class Preferences extends GPreferences
     usagestats.setSelected(Cache.getDefault("USAGESTATS", false));
     // note antisense here: default is true
     questionnaire
-            .setSelected(Cache.getProperty("NOQUESTIONNAIRES") == null);
+            .setSelected(Cache.getProperty(NOQUESTIONNAIRES) == null);
     versioncheck.setSelected(Cache.getDefault("VERSION_CHECK", true));
 
     /*
@@ -514,10 +626,10 @@ public class Preferences extends GPreferences
     setupOutputCombo(epsRendering, "EPS_RENDERING");
     setupOutputCombo(htmlRendering, "HTML_RENDERING");
     setupOutputCombo(svgRendering, "SVG_RENDERING");
-    autoIdWidth.setSelected(Cache.getDefault("FIGURE_AUTOIDWIDTH", false));
+    autoIdWidth.setSelected(Cache.getDefault(FIGURE_AUTOIDWIDTH, false));
     userIdWidth.setEnabled(!autoIdWidth.isSelected());
     userIdWidthlabel.setEnabled(!autoIdWidth.isSelected());
-    Integer wi = Cache.getIntegerProperty("FIGURE_FIXEDIDWIDTH");
+    Integer wi = Cache.getIntegerProperty(FIGURE_FIXEDIDWIDTH);
     userIdWidth.setText(wi == null ? "" : wi.toString());
     // TODO: refactor to use common enum via FormatAdapter and allow extension
     // for new flat file formats
@@ -536,9 +648,9 @@ public class Preferences extends GPreferences
      * Set Editing tab defaults
      */
     autoCalculateConsCheck
-            .setSelected(Cache.getDefault("AUTO_CALC_CONSENSUS", true));
-    padGaps.setSelected(Cache.getDefault("PAD_GAPS", false));
-    sortByTree.setSelected(Cache.getDefault("SORT_BY_TREE", false));
+            .setSelected(Cache.getDefault(AUTO_CALC_CONSENSUS, true));
+    padGaps.setSelected(Cache.getDefault(PAD_GAPS, false));
+    sortByTree.setSelected(Cache.getDefault(SORT_BY_TREE, false));
 
     annotations_actionPerformed(null); // update the display of the annotation
                                        // settings
@@ -547,10 +659,7 @@ public class Preferences extends GPreferences
     /*
      * Set Backups tab defaults
      */
-    if (!Platform.isJS())
-    {
-      loadLastSavedBackupsOptions();
-    }
+    loadLastSavedBackupsOptions();
   }
 
   /**
@@ -603,65 +712,65 @@ public class Preferences extends GPreferences
     /*
      * Save Visual settings
      */
-    Cache.applicationProperties.setProperty("SHOW_JVSUFFIX",
+    Cache.setPropertyNoSave(SHOW_JVSUFFIX,
             Boolean.toString(seqLimit.isSelected()));
-    Cache.applicationProperties.setProperty("RIGHT_ALIGN_IDS",
+    Cache.setPropertyNoSave(RIGHT_ALIGN_IDS,
             Boolean.toString(rightAlign.isSelected()));
-    Cache.applicationProperties.setProperty("SHOW_FULLSCREEN",
+    Cache.setPropertyNoSave(SHOW_FULLSCREEN,
             Boolean.toString(fullScreen.isSelected()));
-    Cache.applicationProperties.setProperty("SHOW_OVERVIEW",
+    Cache.setPropertyNoSave(SHOW_OVERVIEW,
             Boolean.toString(openoverv.isSelected()));
-    Cache.applicationProperties.setProperty("SHOW_ANNOTATIONS",
+    Cache.setPropertyNoSave(SHOW_ANNOTATIONS,
             Boolean.toString(annotations.isSelected()));
-    Cache.applicationProperties.setProperty("SHOW_CONSERVATION",
+    Cache.setPropertyNoSave(SHOW_CONSERVATION,
             Boolean.toString(conservation.isSelected()));
-    Cache.applicationProperties.setProperty("SHOW_QUALITY",
+    Cache.setPropertyNoSave(SHOW_QUALITY,
             Boolean.toString(quality.isSelected()));
-    Cache.applicationProperties.setProperty("SHOW_IDENTITY",
+    Cache.setPropertyNoSave(SHOW_IDENTITY,
             Boolean.toString(identity.isSelected()));
 
-    Cache.applicationProperties.setProperty("GAP_SYMBOL",
+    Cache.setPropertyNoSave(GAP_SYMBOL,
             gapSymbolCB.getSelectedItem().toString());
 
-    Cache.applicationProperties.setProperty("FONT_NAME",
+    Cache.setPropertyNoSave(FONT_NAME,
             fontNameCB.getSelectedItem().toString());
-    Cache.applicationProperties.setProperty("FONT_STYLE",
+    Cache.setPropertyNoSave(FONT_STYLE,
             fontStyleCB.getSelectedItem().toString());
-    Cache.applicationProperties.setProperty("FONT_SIZE",
+    Cache.setPropertyNoSave(FONT_SIZE,
             fontSizeCB.getSelectedItem().toString());
 
-    Cache.applicationProperties.setProperty("ID_ITALICS",
+    Cache.setPropertyNoSave(ID_ITALICS,
             Boolean.toString(idItalics.isSelected()));
-    Cache.applicationProperties.setProperty("SHOW_UNCONSERVED",
+    Cache.setPropertyNoSave(SHOW_UNCONSERVED,
             Boolean.toString(showUnconserved.isSelected()));
-    Cache.applicationProperties.setProperty(SHOW_OCCUPANCY,
+    Cache.setPropertyNoSave(SHOW_OCCUPANCY,
             Boolean.toString(showOccupancy.isSelected()));
-    Cache.applicationProperties.setProperty("SHOW_GROUP_CONSENSUS",
+    Cache.setPropertyNoSave(SHOW_GROUP_CONSENSUS,
             Boolean.toString(showGroupConsensus.isSelected()));
-    Cache.applicationProperties.setProperty("SHOW_GROUP_CONSERVATION",
+    Cache.setPropertyNoSave(SHOW_GROUP_CONSERVATION,
             Boolean.toString(showGroupConservation.isSelected()));
-    Cache.applicationProperties.setProperty("SHOW_CONSENSUS_HISTOGRAM",
+    Cache.setPropertyNoSave(SHOW_CONSENSUS_HISTOGRAM,
             Boolean.toString(showConsensHistogram.isSelected()));
-    Cache.applicationProperties.setProperty("SHOW_CONSENSUS_LOGO",
+    Cache.setPropertyNoSave(SHOW_CONSENSUS_LOGO,
             Boolean.toString(showConsensLogo.isSelected()));
-    Cache.applicationProperties.setProperty("ANTI_ALIAS",
+    Cache.setPropertyNoSave(ANTI_ALIAS,
             Boolean.toString(smoothFont.isSelected()));
-    Cache.applicationProperties.setProperty(SCALE_PROTEIN_TO_CDNA,
+    Cache.setPropertyNoSave(SCALE_PROTEIN_TO_CDNA,
             Boolean.toString(scaleProteinToCdna.isSelected()));
-    Cache.applicationProperties.setProperty("SHOW_NPFEATS_TOOLTIP",
+    Cache.setPropertyNoSave(SHOW_NPFEATS_TOOLTIP,
             Boolean.toString(showNpTooltip.isSelected()));
-    Cache.applicationProperties.setProperty("SHOW_DBREFS_TOOLTIP",
+    Cache.setPropertyNoSave(SHOW_DBREFS_TOOLTIP,
             Boolean.toString(showDbRefTooltip.isSelected()));
 
-    Cache.applicationProperties.setProperty("WRAP_ALIGNMENT",
+    Cache.setPropertyNoSave(WRAP_ALIGNMENT,
             Boolean.toString(wrap.isSelected()));
 
-    Cache.applicationProperties.setProperty("STARTUP_FILE",
+    Cache.setPropertyNoSave("STARTUP_FILE",
             startupFileTextfield.getText());
-    Cache.applicationProperties.setProperty("SHOW_STARTUP_FILE",
+    Cache.setPropertyNoSave("SHOW_STARTUP_FILE",
             Boolean.toString(startupCheckbox.isSelected()));
 
-    Cache.applicationProperties.setProperty("SORT_ALIGNMENT",
+    Cache.setPropertyNoSave(SORT_ALIGNMENT,
             sortby.getSelectedItem().toString());
 
     // convert description of sort order to enum name for save
@@ -669,24 +778,24 @@ public class Preferences extends GPreferences
             .forDescription(sortAnnBy.getSelectedItem().toString());
     if (annSortOrder != null)
     {
-      Cache.applicationProperties.setProperty(SORT_ANNOTATIONS,
+      Cache.setPropertyNoSave(SORT_ANNOTATIONS,
               annSortOrder.name());
     }
 
     final boolean showAutocalcFirst = sortAutocalc.getSelectedIndex() == 0;
-    Cache.applicationProperties.setProperty(SHOW_AUTOCALC_ABOVE,
+    Cache.setPropertyNoSave(SHOW_AUTOCALC_ABOVE,
             Boolean.valueOf(showAutocalcFirst).toString());
 
     /*
      * Save Colours settings
      */
-    Cache.applicationProperties.setProperty(DEFAULT_COLOUR_PROT,
+    Cache.setPropertyNoSave(DEFAULT_COLOUR_PROT,
             protColour.getSelectedItem().toString());
-    Cache.applicationProperties.setProperty(DEFAULT_COLOUR_NUC,
+    Cache.setPropertyNoSave(DEFAULT_COLOUR_NUC,
             nucColour.getSelectedItem().toString());
-    Cache.setColourProperty("ANNOTATIONCOLOUR_MIN",
+    Cache.setColourProperty(ANNOTATIONCOLOUR_MIN,
             minColour.getBackground());
-    Cache.setColourProperty("ANNOTATIONCOLOUR_MAX",
+    Cache.setColourProperty(ANNOTATIONCOLOUR_MAX,
             maxColour.getBackground());
 
     /*
@@ -694,73 +803,79 @@ public class Preferences extends GPreferences
      */
     Cache.setColourProperty(GAP_COLOUR, gapColour.getBackground());
     Cache.setColourProperty(HIDDEN_COLOUR, hiddenColour.getBackground());
-    Cache.applicationProperties.setProperty(USE_LEGACY_GAP,
+    Cache.setPropertyNoSave(USE_LEGACY_GAP,
             Boolean.toString(useLegacyGap.isSelected()));
-    Cache.applicationProperties.setProperty(SHOW_OV_HIDDEN_AT_START,
+    Cache.setPropertyNoSave(SHOW_OV_HIDDEN_AT_START,
             Boolean.toString(showHiddenAtStart.isSelected()));
 
     /*
      * Save Structure settings
      */
-    Cache.applicationProperties.setProperty(ADD_TEMPFACT_ANN,
+    Cache.setPropertyNoSave(ADD_TEMPFACT_ANN,
             Boolean.toString(addTempFactor.isSelected()));
-    Cache.applicationProperties.setProperty(ADD_SS_ANN,
+    Cache.setPropertyNoSave(ADD_SS_ANN,
             Boolean.toString(addSecondaryStructure.isSelected()));
-    Cache.applicationProperties.setProperty(USE_RNAVIEW,
+    Cache.setPropertyNoSave(USE_RNAVIEW,
             Boolean.toString(useRnaView.isSelected()));
-    Cache.applicationProperties.setProperty(STRUCT_FROM_PDB,
+    Cache.setPropertyNoSave(STRUCT_FROM_PDB,
             Boolean.toString(structFromPdb.isSelected()));
-    Cache.applicationProperties.setProperty(STRUCTURE_DISPLAY,
+    Cache.setPropertyNoSave(STRUCTURE_DISPLAY,
             structViewer.getSelectedItem().toString());
+    Cache.setPropertyNoSave(STRUCTURE_DIMENSIONS,
+            structureDimensions.getText()); // BH 2019.07.12
     Cache.setOrRemove(CHIMERA_PATH, chimeraPath.getText());
-    Cache.applicationProperties.setProperty("MAP_WITH_SIFTS",
+    Cache.setPropertyNoSave(MAP_WITH_SIFTS,
             Boolean.toString(siftsMapping.isSelected()));
     SiftsSettings.setMapWithSifts(siftsMapping.isSelected());
 
     /*
      * Save Output settings
      */
-    Cache.applicationProperties.setProperty("EPS_RENDERING",
+    Cache.setPropertyNoSave("EPS_RENDERING",
             ((OptionsParam) epsRendering.getSelectedItem()).getCode());
-    Cache.applicationProperties.setProperty("HTML_RENDERING",
+    Cache.setPropertyNoSave("HTML_RENDERING",
             ((OptionsParam) htmlRendering.getSelectedItem()).getCode());
-    Cache.applicationProperties.setProperty("SVG_RENDERING",
+    Cache.setPropertyNoSave("SVG_RENDERING",
             ((OptionsParam) svgRendering.getSelectedItem()).getCode());
 
-    /*
-     * Save Connections settings
+    if (!Platform.isJS())
+    /**
+     * @j2sNative
      */
-    Cache.setOrRemove("DEFAULT_BROWSER", defaultBrowser.getText());
-
-    jalview.util.BrowserLauncher.resetBrowser();
+    {
+      // Java only
+      // Save Connections settings
+      Cache.setOrRemove("DEFAULT_BROWSER", defaultBrowser.getText());
+      BrowserLauncher.resetBrowser();
+    }
 
     // save user-defined and selected links
     String menuLinks = sequenceUrlLinks.writeUrlsAsString(true);
     if (menuLinks.isEmpty())
     {
-      Cache.applicationProperties.remove("SEQUENCE_LINKS");
+      Cache.removePropertyNoSave("SEQUENCE_LINKS");
     }
     else
     {
-      Cache.applicationProperties.setProperty("SEQUENCE_LINKS",
+      Cache.setPropertyNoSave("SEQUENCE_LINKS",
               menuLinks.toString());
     }
 
     String nonMenuLinks = sequenceUrlLinks.writeUrlsAsString(false);
     if (nonMenuLinks.isEmpty())
     {
-      Cache.applicationProperties.remove("STORED_LINKS");
+      Cache.removePropertyNoSave("STORED_LINKS");
     }
     else
     {
-      Cache.applicationProperties.setProperty("STORED_LINKS",
+      Cache.setPropertyNoSave("STORED_LINKS",
               nonMenuLinks.toString());
     }
 
-    Cache.applicationProperties.setProperty("DEFAULT_URL",
+    Cache.setPropertyNoSave("DEFAULT_URL",
             sequenceUrlLinks.getPrimaryUrlId());
 
-    Cache.applicationProperties.setProperty("USE_PROXY",
+    Cache.setPropertyNoSave("USE_PROXY",
             Boolean.toString(useProxy.isSelected()));
 
     Cache.setOrRemove("PROXY_SERVER", proxyServerTB.getText());
@@ -787,52 +902,50 @@ public class Preferences extends GPreferences
     }
     if (!questionnaire.isSelected())
     {
-      Cache.setProperty("NOQUESTIONNAIRES", "true");
+      Cache.setProperty(NOQUESTIONNAIRES, "true");
     }
     else
     {
       // special - made easy to edit a property file to disable questionnaires
       // by just adding the given line
-      Cache.removeProperty("NOQUESTIONNAIRES");
+      Cache.removeProperty(NOQUESTIONNAIRES);
     }
 
     /*
      * Save Output settings
      */
-    Cache.applicationProperties.setProperty("BLC_JVSUFFIX",
+    Cache.setPropertyNoSave("BLC_JVSUFFIX",
             Boolean.toString(blcjv.isSelected()));
-    Cache.applicationProperties.setProperty("CLUSTAL_JVSUFFIX",
+    Cache.setPropertyNoSave("CLUSTAL_JVSUFFIX",
             Boolean.toString(clustaljv.isSelected()));
-    Cache.applicationProperties.setProperty("FASTA_JVSUFFIX",
+    Cache.setPropertyNoSave("FASTA_JVSUFFIX",
             Boolean.toString(fastajv.isSelected()));
-    Cache.applicationProperties.setProperty("MSF_JVSUFFIX",
+    Cache.setPropertyNoSave("MSF_JVSUFFIX",
             Boolean.toString(msfjv.isSelected()));
-    Cache.applicationProperties.setProperty("PFAM_JVSUFFIX",
+    Cache.setPropertyNoSave("PFAM_JVSUFFIX",
             Boolean.toString(pfamjv.isSelected()));
-    Cache.applicationProperties.setProperty("PILEUP_JVSUFFIX",
+    Cache.setPropertyNoSave("PILEUP_JVSUFFIX",
             Boolean.toString(pileupjv.isSelected()));
-    Cache.applicationProperties.setProperty("PIR_JVSUFFIX",
+    Cache.setPropertyNoSave("PIR_JVSUFFIX",
             Boolean.toString(pirjv.isSelected()));
-    Cache.applicationProperties.setProperty("PIR_MODELLER",
+    Cache.setPropertyNoSave("PIR_MODELLER",
             Boolean.toString(modellerOutput.isSelected()));
-    Cache.applicationProperties.setProperty("EXPORT_EMBBED_BIOJSON",
+    Cache.setPropertyNoSave("EXPORT_EMBBED_BIOJSON",
             Boolean.toString(embbedBioJSON.isSelected()));
-    jalview.io.PIRFile.useModellerOutput = modellerOutput.isSelected();
-
-    Cache.applicationProperties.setProperty("FIGURE_AUTOIDWIDTH",
+    Cache.setPropertyNoSave(FIGURE_AUTOIDWIDTH,
             Boolean.toString(autoIdWidth.isSelected()));
     userIdWidth_actionPerformed();
-    Cache.applicationProperties.setProperty("FIGURE_FIXEDIDWIDTH",
+    Cache.setPropertyNoSave("FIGURE_FIXEDIDWIDTH",
             userIdWidth.getText());
 
     /*
      * Save Editing settings
      */
-    Cache.applicationProperties.setProperty("AUTO_CALC_CONSENSUS",
+    Cache.setPropertyNoSave(AUTO_CALC_CONSENSUS,
             Boolean.toString(autoCalculateConsCheck.isSelected()));
-    Cache.applicationProperties.setProperty("SORT_BY_TREE",
+    Cache.setPropertyNoSave(SORT_BY_TREE,
             Boolean.toString(sortByTree.isSelected()));
-    Cache.applicationProperties.setProperty("PAD_GAPS",
+    Cache.setPropertyNoSave(PAD_GAPS,
             Boolean.toString(padGaps.isSelected()));
 
     if (!Platform.isJS())
@@ -843,32 +956,25 @@ public class Preferences extends GPreferences
     /*
      * Save Backups settings
      */
-    Cache.applicationProperties.setProperty(BackupFiles.ENABLED,
-            Platform.isJS() ? Boolean.FALSE.toString()
-                    : Boolean.toString(enableBackupFiles.isSelected()));
-    if (!Platform.isJS())
-    {
-      int preset = getComboIntStringKey(backupfilesPresetsCombo);
-      Cache.applicationProperties.setProperty(BackupFiles.NS + "_PRESET",
-              Integer.toString(preset));
-
-      if (preset == BackupFilesPresetEntry.BACKUPFILESSCHEMECUSTOM)
-      {
-        BackupFilesPresetEntry customBFPE = getBackupfilesCurrentEntry();
-        BackupFilesPresetEntry.backupfilesPresetEntriesValues.put(
-                BackupFilesPresetEntry.BACKUPFILESSCHEMECUSTOM, customBFPE);
-        Cache.applicationProperties.setProperty(
-                BackupFilesPresetEntry.CUSTOMCONFIG, customBFPE.toString());
-      }
-
-      BackupFilesPresetEntry savedBFPE = BackupFilesPresetEntry.backupfilesPresetEntriesValues
-              .get(preset);
-      Cache.applicationProperties.setProperty(
-              BackupFilesPresetEntry.SAVEDCONFIG, savedBFPE.toString());
-    }
+    Cache.setPropertyNoSave(BackupFiles.CONFIRM_DELETE_OLD,
+            Boolean.toString(backupfilesConfirmDelete.isSelected()));
+    Cache.setPropertyNoSave(BackupFiles.ENABLED,
+            Boolean.toString(enableBackupFiles.isSelected()));
+    Cache.setPropertyNoSave(BackupFiles.NO_MAX,
+            Boolean.toString(backupfilesKeepAll.isSelected()));
+    Cache.setPropertyNoSave(BackupFiles.REVERSE_ORDER,
+            Boolean.toString(suffixReverse.isSelected()));
+    Cache.setPropertyNoSave(BackupFiles.SUFFIX,
+            suffixTemplate.getText());
+    Cache.setPropertyNoSave(BackupFiles.ROLL_MAX,
+            Integer.toString(getSpinnerInt(backupfilesRollMaxSpinner, 4)));
+    Cache.setPropertyNoSave(BackupFiles.SUFFIX_DIGITS,
+            Integer.toString(getSpinnerInt(suffixDigitsSpinner, 3)));
+    Cache.setPropertyNoSave(BackupFiles.NS + "_PRESET",
+            Integer.toString(getComboIntStringKey(backupfilesPresetsCombo)));
 
     Cache.saveProperties();
-    Desktop.instance.doConfigureStructurePrefs();
+    Desktop.getInstance().doConfigureStructurePrefs();
     try
     {
       frame.setClosed(true);
@@ -877,6 +983,43 @@ public class Preferences extends GPreferences
     }
   }
 
+  public static void setAppletDefaults()
+  {
+
+    // http://www.jalview.org/old/v2_8/examples/appletParameters.html
+
+    // showConservation true or false Default is true.
+    // showQuality true or false Default is true.
+    // showConsensus true or false Default is true.
+    // showFeatureSettings true or false Shows the feature settings window when
+    // startin
+    // showTreeBootstraps true or false (default is true) show or hide branch
+    // bootstraps
+    // showTreeDistances true or false (default is true) show or hide branch
+    // lengths
+    // showUnlinkedTreeNodes true or false (default is false) indicate if
+    // unassociated nodes should be highlighted in the tree view
+    // showUnconserved true of false (default is false) When true, only gaps and
+    // symbols different to the consensus sequence ions of the alignment
+    // showGroupConsensus true of false (default is false) When true, shows
+    // consensus annotation row for any groups on the alignment. (since 2.7)
+    // showGroupConservation true of false (default is false) When true, shows
+    // amino-acid property conservation annotation row for any groups on the
+    // showConsensusHistogram true of false (default is true) When true, shows
+    // the percentage occurence of the consensus symbol for each column as a
+    // showSequenceLogo true of false (default is false) When true, shows a
+    // sequence logo above the consensus sequence (overlaid above the Consensus
+
+    Cache.setPropertyNoSave(SHOW_CONSERVATION, "true");
+    Cache.setPropertyNoSave(SHOW_QUALITY, "false");
+    Cache.setPropertyNoSave(SHOW_CONSENSUS, "true");
+    Cache.setPropertyNoSave(SHOW_UNCONSERVED, "false");
+    Cache.setPropertyNoSave(SHOW_GROUP_CONSERVATION, "false");
+    Cache.setPropertyNoSave(SHOW_GROUP_CONSENSUS, "false");
+
+    // TODO -- just a start here
+  }
+
   /**
    * Do any necessary validation before saving settings. Return focus to the
    * first tab which fails validation.
@@ -921,7 +1064,7 @@ public class Preferences extends GPreferences
       FileFormatI format = chooser.getSelectedFormat();
       if (format != null)
       {
-        Cache.applicationProperties.setProperty("DEFAULT_FILE_FORMAT",
+        Cache.setPropertyNoSave("DEFAULT_FILE_FORMAT",
                 format.getName());
       }
       startupFileTextfield
@@ -979,7 +1122,7 @@ public class Preferences extends GPreferences
     boolean valid = false;
     while (!valid)
     {
-      if (JvOptionPane.showInternalConfirmDialog(Desktop.desktop, link,
+      if (JvOptionPane.showInternalConfirmDialog(Desktop.getDesktopPane(), link,
               MessageManager.getString("label.new_sequence_url_link"),
               JvOptionPane.OK_CANCEL_OPTION, -1,
               null) == JvOptionPane.OK_OPTION)
@@ -1031,7 +1174,7 @@ public class Preferences extends GPreferences
     boolean valid = false;
     while (!valid)
     {
-      if (JvOptionPane.showInternalConfirmDialog(Desktop.desktop, link,
+      if (JvOptionPane.showInternalConfirmDialog(Desktop.getDesktopPane(), link,
               MessageManager.getString("label.edit_sequence_url_link"),
               JvOptionPane.OK_CANCEL_OPTION, -1,
               null) == JvOptionPane.OK_OPTION)
@@ -1118,6 +1261,11 @@ public class Preferences extends GPreferences
     super.showunconserved_actionPerformed(e);
   }
 
+  /**
+   * not implemented -- returns empty list
+   * 
+   * @return
+   */
   public static List<String> getGroupURLLinks()
   {
     return groupURLLinks;
@@ -1204,7 +1352,7 @@ public class Preferences extends GPreferences
     } catch (NumberFormatException x)
     {
       userIdWidth.setText("");
-      JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+      JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
               MessageManager
                       .getString("warn.user_defined_width_requirements"),
               MessageManager.getString("label.invalid_id_column_width"),
@@ -1223,14 +1371,14 @@ public class Preferences extends GPreferences
    * Returns true if chimera path is to a valid executable, else show an error
    * dialog.
    */
-  private boolean validateChimeraPath()
+  protected boolean validateChimeraPath()
   {
     if (chimeraPath.getText().trim().length() > 0)
     {
       File f = new File(chimeraPath.getText());
       if (!f.canExecute())
       {
-        JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+        JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
                 MessageManager.getString("label.invalid_chimera_path"),
                 MessageManager.getString("label.invalid_name"),
                 JvOptionPane.ERROR_MESSAGE);
@@ -1269,7 +1417,7 @@ public class Preferences extends GPreferences
     if (!found)
     {
       String[] options = { "OK", "Help" };
-      int showHelp = JvOptionPane.showInternalOptionDialog(Desktop.desktop,
+      int showHelp = JvOptionPane.showInternalOptionDialog(Desktop.getDesktopPane(),
               JvSwingUtils.wrapTooltip(true,
                       MessageManager.getString("label.chimera_missing")),
               "", JvOptionPane.YES_NO_OPTION, JvOptionPane.WARNING_MESSAGE,
@@ -1342,7 +1490,7 @@ public class Preferences extends GPreferences
     }
   }
 
-  private class UrlListSelectionHandler implements ListSelectionListener
+  protected class UrlListSelectionHandler implements ListSelectionListener
   {
 
     @Override
index cb59452..77d83a8 100644 (file)
@@ -200,7 +200,7 @@ public class PromptUserConfig implements Runnable
     }
     try
     {
-      int reply = JvOptionPane.showConfirmDialog(Desktop.desktop, // component,
+      int reply = JvOptionPane.showConfirmDialog(Desktop.getDesktopPane(), // component,
               dialogText, dialogTitle,
               (allowCancel) ? JvOptionPane.YES_NO_CANCEL_OPTION
                       : JvOptionPane.YES_NO_OPTION,
index 561fb3c..dc0cdb4 100755 (executable)
@@ -630,7 +630,7 @@ public class RotatableCanvas extends JPanel implements MouseListener,
     int yDelta = yPos - mouseY;
 
     // Check if this is a rectangle drawing drag
-    if ((evt.getModifiersEx() & InputEvent.BUTTON2_DOWN_MASK) != 0)
+    if ((evt.getModifiers() & InputEvent.BUTTON2_MASK) != 0)
     {
       // rectx2 = evt.getX();
       // recty2 = evt.getY();
index a6b4b49..b06647d 100755 (executable)
@@ -54,6 +54,7 @@ import javax.swing.ToolTipManager;
  * The panel containing the sequence ruler (when not in wrapped mode), and
  * supports a range of mouse operations to select, hide or reveal columns.
  */
+@SuppressWarnings("serial")
 public class ScalePanel extends JPanel
         implements MouseMotionListener, MouseListener, ViewportListenerI
 {
@@ -187,7 +188,8 @@ public class ScalePanel extends JPanel
       });
       pop.add(item);
 
-      if (av.getAlignment().getHiddenColumns().hasMultiHiddenColumnRegions())
+      if (av.getAlignment().getHiddenColumns()
+              .hasMultiHiddenColumnRegions())
       {
         item = new JMenuItem(MessageManager.getString("action.reveal_all"));
         item.addActionListener(new ActionListener()
@@ -287,8 +289,7 @@ public class ScalePanel extends JPanel
     // todo res calculation should be a method on AlignViewport
     int xCords = Math.max(0, evt.getX()); // prevent negative X coordinates
     ViewportRanges ranges = av.getRanges();
-    int res = (xCords / av.getCharWidth())
-            + ranges.getStartRes();
+    int res = (xCords / av.getCharWidth()) + ranges.getStartRes();
     res = Math.min(res, ranges.getEndRes());
     if (av.hasHiddenColumns())
     {
@@ -435,7 +436,8 @@ public class ScalePanel extends JPanel
   @Override
   public void paintComponent(Graphics g)
   {
-    //super.paintComponent(g);  // BH 2019
+
+    // super.paintComponent(g); // BH 2019
 
     /*
      * shouldn't get called in wrapped mode as the scale above is
@@ -523,10 +525,11 @@ public class ScalePanel extends JPanel
 
           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);
+                  { -1 + res * avCharWidth - avCharHeight / 4,
+                      -1 + res * avCharWidth + avCharHeight / 4,
+                      -1 + res * avCharWidth },
+                  new int[]
+                  { y, y, y + 2 * yOf }, 3);
         }
       }
     }
@@ -566,23 +569,36 @@ public class ScalePanel extends JPanel
   @Override
   public void propertyChange(PropertyChangeEvent evt)
   {
-    // Respond to viewport change events (e.g. alignment panel was scrolled)
-    // Both scrolling and resizing change viewport ranges: scrolling changes
-    // both start and end points, but resize only changes end values.
-    // Here we only want to fastpaint on a scroll, with resize using a normal
-    // paint, so scroll events are identified as changes to the horizontal or
-    // vertical start value.
-    if (evt.getPropertyName().equals(ViewportRanges.STARTRES)
-            || evt.getPropertyName().equals(ViewportRanges.STARTRESANDSEQ)
-            || evt.getPropertyName().equals(ViewportRanges.MOVE_VIEWPORT))
+    switch (evt.getPropertyName())
     {
+    case ViewportRanges.STARTRES:
+    case ViewportRanges.STARTRESANDSEQ:
+    case ViewportRanges.MOVE_VIEWPORT:
       // scroll event, repaint panel
-       
-       // Call repaint on alignment panel so that repaints from other alignment
-    // panel components can be aggregated. Otherwise performance of the overview
-    // window and others may be adversely affected.
-      av.getAlignPanel().repaint();
+      // original comment:
+      // Call repaint on alignment panel so that repaints from other alignment
+      // panel components can be aggregated. Otherwise performance of the
+      // overview
+      // window and others may be adversely affected.
+
+      // TODO: check this?
+      // BH: This is actually quite strange. AlignmentPanel is taking care of
+      // all of this with fast paint, so why indirectly trigger a repaint from
+      // the ScalePanel? Where do we see this behavior necessary?
+      // I have set this to check for a trigger from some other ViewportRanges,
+      // but I don't actually think that is possible.
+
+      if (evt.getSource() != av.getRanges())
+      {
+        av.getAlignPanel().repaint();
+      }
+      break;
     }
   }
 
+  public boolean isMouseDragging()
+  {
+    return mouseDragging;
+  }
+
 }
index e962709..123e649 100755 (executable)
@@ -352,9 +352,6 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
       gg.copyArea(horizontal * charWidth, vertical * charHeight,
               img.getWidth(), img.getHeight(), -horizontal * charWidth,
               -vertical * charHeight);
-
-      /** @j2sNative xxi = this.img */
-
       gg.translate(transX, transY);
       drawPanel(gg, startRes, endRes, startSeq, endSeq, 0);
       gg.translate(-transX, -transY);
@@ -375,18 +372,22 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
   public void paintComponent(Graphics g)
   {
 
+    if (av.getAlignPanel().getHoldRepaint())
+    {
+      return;
+    }
     int charHeight = av.getCharHeight();
     int charWidth = av.getCharWidth();
 
-    int width = getWidth();
-    int height = getHeight();
+    int availWidth = getWidth();
+    int availHeight = getHeight();
 
-    width -= (width % charWidth);
-    height -= (height % charHeight);
+    availWidth -= (availWidth % charWidth);
+    availHeight -= (availHeight % charHeight);
 
     // BH 2019 can't possibly fastPaint if either width or height is 0
 
-    if (width == 0 || height == 0)
+    if (availWidth == 0 || availHeight == 0)
     {
       return;
     }
@@ -436,10 +437,11 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
       // img is a cached version of the last view we drew.
       // If we have no img or the size has changed, make a new one.
       //
-      if (img == null || width != img.getWidth()
-              || height != img.getHeight())
+      if (img == null || availWidth != img.getWidth()
+              || availHeight != img.getHeight())
       {
-        img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+        img = new BufferedImage(availWidth, availHeight,
+                BufferedImage.TYPE_INT_RGB);
       }
 
       Graphics2D gg = (Graphics2D) img.getGraphics();
@@ -452,11 +454,11 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
       }
 
       gg.setColor(Color.white);
-      gg.fillRect(0, 0, img.getWidth(), img.getHeight());
+      gg.fillRect(0, 0, availWidth, availHeight);
 
       if (av.getWrapAlignment())
       {
-        drawWrappedPanel(gg, width, height, ranges.getStartRes());
+        drawWrappedPanel(gg, availWidth, availHeight, ranges.getStartRes());
       }
       else
       {
@@ -524,32 +526,31 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
   }
 
   /**
-   * Returns the visible width of the canvas in residues, after allowing for
-   * East or West scales (if shown)
+   * Using the current font, determine fields labelWidthEast and labelWidthWest,
+   * and return the number of residues that can fill the remaining width.
    * 
-   * @param canvasWidth
+   * @param width
    *          the width in pixels (possibly including scales)
    * 
-   * @return
+   * @return the visible width in residues, after allowing for East or West
+   *         scales (if shown)
+   * 
    */
-  public int getWrappedCanvasWidth(int canvasWidth)
+  public int getWrappedCanvasWidth(int width)
   {
     int charWidth = av.getCharWidth();
 
     FontMetrics fm = getFontMetrics(av.getFont());
 
-    int labelWidth = 0;
-    
-    if (av.getScaleRightWrapped() || av.getScaleLeftWrapped())
-    {
-      labelWidth = getLabelWidth(fm);
-    }
+    int labelWidth = (av.getScaleRightWrapped() || av.getScaleLeftWrapped()
+            ? getLabelWidth(fm)
+            : 0);
 
     labelWidthEast = av.getScaleRightWrapped() ? labelWidth : 0;
 
     labelWidthWest = av.getScaleLeftWrapped() ? labelWidth : 0;
 
-    return (canvasWidth - labelWidthEast - labelWidthWest) / charWidth;
+    return (width - labelWidthEast - labelWidthWest) / charWidth;
   }
 
   /**
@@ -575,6 +576,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
       maxWidth = Math.max(maxWidth, alignment.getSequenceAt(i).getEnd());
     }
 
+    // quick int log10
     int length = 0;
     for (int i = maxWidth; i > 0; i /= 10)
     {
@@ -589,18 +591,18 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
    * window
    * 
    * @param g
-   * @param canvasWidth
+   * @param availWidth
    *          available width in pixels
-   * @param canvasHeight
+   * @param availHeight
    *          available height in pixels
    * @param startColumn
    *          the first column (0...) of the alignment to draw
    */
-  public void drawWrappedPanel(Graphics g, int canvasWidth,
-          int canvasHeight, final int startColumn)
+  public void drawWrappedPanel(Graphics g, int availWidth, int availHeight,
+          final int startColumn)
   {
-    int wrappedWidthInResidues = calculateWrappedGeometry(canvasWidth,
-            canvasHeight);
+    int wrappedWidthInResidues = calculateWrappedGeometry(availWidth,
+            availHeight);
 
     av.setWrappedWidth(wrappedWidthInResidues);
 
@@ -610,7 +612,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
     // we need to call this again to make sure the startColumn +
     // wrappedWidthInResidues values are used to calculate wrappedVisibleWidths
     // correctly.
-    calculateWrappedGeometry(canvasWidth, canvasHeight);
+    calculateWrappedGeometry(availWidth, availHeight);
 
     /*
      * draw one width at a time (excluding any scales shown),
@@ -625,7 +627,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
     {
       int endColumn = Math
               .min(maxWidth, start + wrappedWidthInResidues - 1);
-      drawWrappedWidth(g, ypos, start, endColumn, canvasHeight);
+      drawWrappedWidth(g, ypos, start, endColumn, availHeight);
       ypos += wrappedRepeatHeightPx;
       start += wrappedWidthInResidues;
       currentWidth++;
@@ -644,11 +646,11 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
    * <li>whether scales are shown left, right or above the alignment</li>
    * </ul>
    * 
-   * @param canvasWidth
-   * @param canvasHeight
+   * @param availWidth
+   * @param availHeight
    * @return the number of residue columns in each width
    */
-  protected int calculateWrappedGeometry(int canvasWidth, int canvasHeight)
+  protected int calculateWrappedGeometry(int availWidth, int availHeight)
   {
     int charHeight = av.getCharHeight();
 
@@ -682,8 +684,8 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
      * ensuring a part height includes at least one sequence
      */
     ViewportRanges ranges = av.getRanges();
-    wrappedVisibleWidths = canvasHeight / wrappedRepeatHeightPx;
-    int remainder = canvasHeight % wrappedRepeatHeightPx;
+    wrappedVisibleWidths = availHeight / wrappedRepeatHeightPx;
+    int remainder = availHeight % wrappedRepeatHeightPx;
     if (remainder >= (wrappedSpaceAboveAlignment + charHeight))
     {
       wrappedVisibleWidths++;
@@ -692,7 +694,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
     /*
      * compute width in residues; this also sets East and West label widths
      */
-    int wrappedWidthInResidues = getWrappedCanvasWidth(canvasWidth);
+    int wrappedWidthInResidues = getWrappedCanvasWidth(availWidth);
 
     /*
      *  limit visibleWidths to not exceed width of alignment
@@ -1679,92 +1681,164 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
   public void propertyChange(PropertyChangeEvent evt)
   {
     String eventName = evt.getPropertyName();
-    // System.err.println(">>SeqCanvas propertyChange " + eventName);
-    if (eventName.equals(SequenceGroup.SEQ_GROUP_CHANGED))
-    {
-      fastPaint = true;
-      repaint();
-      return;
-    }
-    else if (eventName.equals(ViewportRanges.MOVE_VIEWPORT))
-    {
-      fastPaint = false;
-      // System.err.println("!!!! fastPaint false from MOVE_VIEWPORT");
-      repaint();
-      return;
-    }
 
-    int scrollX = 0;
-    if (eventName.equals(ViewportRanges.STARTRES)
-            || eventName.equals(ViewportRanges.STARTRESANDSEQ))
-    {
-      // Make sure we're not trying to draw a panel
-      // larger than the visible window
-      if (eventName.equals(ViewportRanges.STARTRES))
-      {
-        scrollX = (int) evt.getNewValue() - (int) evt.getOldValue();
-      }
-      else
-      {
-        scrollX = ((int[]) evt.getNewValue())[0]
-                - ((int[]) evt.getOldValue())[0];
-      }
-      ViewportRanges vpRanges = av.getRanges();
+    // BH 2019.07.27 removes dead code introduced in aad3650 and simplifies
+    // logic, emphasizing no check for ENDRES or ENDSEQ
 
-      int range = vpRanges.getEndRes() - vpRanges.getStartRes() + 1;
-      if (scrollX > range)
-      {
-        scrollX = range;
-      }
-      else if (scrollX < -range)
-      {
-        scrollX = -range;
-      }
-    }
     // Both scrolling and resizing change viewport ranges: scrolling changes
     // both start and end points, but resize only changes end values.
     // Here we only want to fastpaint on a scroll, with resize using a normal
     // paint, so scroll events are identified as changes to the horizontal or
     // vertical start value.
-    if (eventName.equals(ViewportRanges.STARTRES))
-    {
-      if (av.getWrapAlignment())
-      {
-        fastPaintWrapped(scrollX);
-      }
-      else
-      {
-        fastPaint(scrollX, 0);
-      }
-    }
-    else if (eventName.equals(ViewportRanges.STARTSEQ))
+
+    // Make sure we're not trying to draw a panel
+    // larger than the visible window
+    int scrollX = 0;
+    int scrollY = 0;
+    switch (eventName)
     {
-      // scroll
+    case SequenceGroup.SEQ_GROUP_CHANGED:
+      fastPaint = true;
+      repaint();
+      return;
+    case ViewportRanges.MOVE_VIEWPORT:
+      fastPaint = false;
+      repaint();
+      return;
+    case ViewportRanges.STARTSEQ:
+      // meaning STARTOREND
+      // typically scroll, but possibly just the end changed
       fastPaint(0, (int) evt.getNewValue() - (int) evt.getOldValue());
-    }
-    else if (eventName.equals(ViewportRanges.STARTRESANDSEQ))
-    {
-      if (av.getWrapAlignment())
-      {
-        fastPaintWrapped(scrollX);
-      }
-      else
+      return;
+    case ViewportRanges.ENDRES:
+    case ViewportRanges.ENDSEQ:
+      // meaning second event along with "START" -- ENDONLY,NOTSTART
+      // TODO: ignore??
+      return;
+    case ViewportRanges.STARTRES:
+      // meaning STARTOREND
+      scrollX = (int) evt.getNewValue() - (int) evt.getOldValue();
+      break;
+    case ViewportRanges.STARTRESANDSEQ:
+      scrollX = ((int[]) evt.getNewValue())[0]
+              - ((int[]) evt.getOldValue())[0];
+      scrollY = ((int[]) evt.getNewValue())[1]
+              - ((int[]) evt.getOldValue())[1];
+
+      // System.out.println("SC dx dy " + scrollX + " " + scrollY);
+
+      if (scrollX != 0 && scrollY != 0)
       {
-        fastPaint(scrollX, 0);
+        // all sorts of problems in JavaScript if this is commented out.
+        repaint();
+        return;
+
       }
+      break;
     }
-    else if (eventName.equals(ViewportRanges.STARTSEQ))
+
+    ViewportRanges vpRanges = av.getRanges();
+    int range = vpRanges.getEndRes() - vpRanges.getStartRes() + 1;
+    scrollX = Math.max(Math.min(scrollX, range), -range);
+    // only STARTRES or STARTRESANDSEQ:
+    if (av.getWrapAlignment())
     {
-      // scroll
-      fastPaint(0, (int) evt.getNewValue() - (int) evt.getOldValue());
+      fastPaintWrapped(scrollX);
     }
-    else if (eventName.equals(ViewportRanges.STARTRESANDSEQ))
+    else
     {
-      if (av.getWrapAlignment())
-      {
-        fastPaintWrapped(scrollX);
-      }
+      fastPaint(scrollX, scrollY);
     }
+
+    // BH 2019.07.27 was:
+    // if (eventName.equals(SequenceGroup.SEQ_GROUP_CHANGED))
+    // {
+    // fastPaint = true;
+    // repaint();
+    // return;
+    // }
+    // else if (eventName.equals(ViewportRanges.MOVE_VIEWPORT))
+    // {
+    // fastPaint = false;
+    // // System.err.println("!!!! fastPaint false from MOVE_VIEWPORT");
+    // repaint();
+    // return;
+    // }
+    //
+    // if (eventName.equals(ViewportRanges.STARTRES)
+    // || eventName.equals(ViewportRanges.STARTRESANDSEQ))
+    // {
+    // // Make sure we're not trying to draw a panel
+    // // larger than the visible window
+    // if (eventName.equals(ViewportRanges.STARTRES))
+    // {
+    // scrollX = (int) evt.getNewValue() - (int) evt.getOldValue();
+    // }
+    // else
+    // {
+    // scrollX = ((int[]) evt.getNewValue())[0]
+    // - ((int[]) evt.getOldValue())[0];
+    // }
+    // ViewportRanges vpRanges = av.getRanges();
+    //
+    // int range = vpRanges.getEndRes() - vpRanges.getStartRes() + 1;
+    // if (scrollX > range)
+    // {
+    // scrollX = range;
+    // }
+    // else if (scrollX < -range)
+    // {
+    // scrollX = -range;
+    // }
+    // }
+    // Both scrolling and resizing change viewport ranges: scrolling changes
+    // both start and end points, but resize only changes end values.
+    // Here we only want to fastpaint on a scroll, with resize using a normal
+    // paint, so scroll events are identified as changes to the horizontal or
+    // vertical start value.
+    // BH 2019.07.27 was:
+    // if (eventName.equals(ViewportRanges.STARTRES))
+    // {
+    // if (av.getWrapAlignment())
+    // {
+    // fastPaintWrapped(scrollX);
+    // }
+    // else
+    // {
+    // fastPaint(scrollX, 0);
+    // }
+    // }
+    // else if (eventName.equals(ViewportRanges.STARTSEQ))
+    // {
+    // // scroll
+    // fastPaint(0, (int) evt.getNewValue() - (int) evt.getOldValue());
+    // }
+    // else if (eventName.equals(ViewportRanges.STARTRESANDSEQ))
+    // {
+    // if (av.getWrapAlignment())
+    // {
+    // fastPaintWrapped(scrollX);
+    // }
+    // else
+    // {
+    // fastPaint(scrollX, 0);
+    // }
+    // }
+    //
+    // BH oops!
+    //
+    // else if (eventName.equals(ViewportRanges.STARTSEQ))
+    // {
+    // // scroll
+    // fastPaint(0, (int) evt.getNewValue() - (int) evt.getOldValue());
+    // }
+    // else if (eventName.equals(ViewportRanges.STARTRESANDSEQ))
+    // {
+    // if (av.getWrapAlignment())
+    // {
+    // fastPaintWrapped(scrollX);
+    // }
+    // }
   }
 
   /**
index 2df55ad..134e284 100644 (file)
@@ -74,7 +74,8 @@ import javax.swing.Timer;
 import javax.swing.ToolTipManager;
 
 /**
- * DOCUMENT ME!
+ * The main scrollable region containing the alignment and just to the right of
+ * the IDPanel.
  * 
  * @author $author$
  * @version $Revision: 1.130 $
@@ -134,7 +135,6 @@ public class SeqPanel extends JPanel
       MousePos o = (MousePos) obj;
       boolean b = (column == o.column && seqIndex == o.seqIndex
               && annotationIndex == o.annotationIndex);
-      // System.out.println(obj + (b ? "= " : "!= ") + this);
       return b;
     }
 
@@ -224,7 +224,7 @@ public class SeqPanel extends JPanel
   SearchResultsI lastSearchResults;
 
   /**
-   * Creates a new SeqPanel object
+   * Create a new SeqPanel.
    * 
    * @param viewport
    * @param alignPanel
@@ -1504,7 +1504,6 @@ public class SeqPanel extends JPanel
         return;
       }
 
-      // System.out.print(y1+" "+y2+" "+fixedLeft+" "+fixedRight+"~~");
       // Selection spans a hidden region
       if (fixedLeft < y1 && (fixedRight > y2 || fixedRight == -1))
       {
@@ -1944,12 +1943,21 @@ public class SeqPanel extends JPanel
   {
     lastMousePosition = null;
     ap.alignFrame.setStatus(" ");
+
     if (av.getWrapAlignment())
     {
       return;
     }
 
-    if (mouseDragging && scrollThread == null)
+    /*
+     * start scrolling if mouse dragging, whether the drag started
+     * in the scale panel or this panel
+     */
+    if (ap.getScalePanel().isMouseDragging())
+    {
+      ap.getScalePanel().mouseExited(e);
+    }
+    else if (mouseDragging && scrollThread == null)
     {
       startScrolling(e.getPoint());
     }
@@ -2424,29 +2432,22 @@ public class SeqPanel extends JPanel
               // if (!scrollOnce() {t.stop();}) gives compiler error :-(
               scrollThread.scrollOnce();
             }
-          }
-        });
-        t.addActionListener(new ActionListener()
-        {
-          @Override
-          public void actionPerformed(ActionEvent e)
-          {
             if (scrollThread == null)
             {
               // SeqPanel.stopScrolling called
-              t.stop();
+              ((Timer) e.getSource()).stop();
             }
           }
         });
         t.start();
       }
-    }
-    else
-    {
-      /*
-       * Java - run in a new thread
-       */
-      scrollThread.start();
+      else
+      {
+        /*
+         * Java - run in a new thread
+         */
+        scrollThread.start();
+      }
     }
   }
 
@@ -2770,4 +2771,45 @@ public class SeqPanel extends JPanel
   {
     return lastSearchResults;
   }
+
+  /**
+   * scroll to the given row/column - or nearest visible location
+   * 
+   * @param row
+   * @param column
+   */
+  public void scrollTo(int row, int column)
+  {
+
+    row = row < 0 ? ap.av.getRanges().getStartSeq() : row;
+    column = column < 0 ? ap.av.getRanges().getStartRes() : column;
+    ap.scrollTo(column, column, row, true, true);
+  }
+
+  /**
+   * scroll to the given row - or nearest visible location
+   * 
+   * @param row
+   */
+  public void scrollToRow(int row)
+  {
+
+    row = row < 0 ? ap.av.getRanges().getStartSeq() : row;
+    ap.scrollTo(ap.av.getRanges().getStartRes(),
+            ap.av.getRanges().getStartRes(), row, true, true);
+  }
+
+  /**
+   * scroll to the given column - or nearest visible location
+   * 
+   * @param column
+   */
+  public void scrollToColumn(int column)
+  {
+
+    column = column < 0 ? ap.av.getRanges().getStartRes() : column;
+    ap.scrollTo(column, column, ap.av.getRanges().getStartSeq(), true,
+            true);
+  }
+
 }
index 646a7f1..b8e3b33 100755 (executable)
@@ -64,9 +64,9 @@ import javax.swing.SwingConstants;
  * If the selected source is Uniprot or PDB, a free text search panel is opened
  * instead to perform the search and selection.
  */
+@SuppressWarnings("serial")
 public class SequenceFetcher extends JPanel implements Runnable
 {
-  private static jalview.ws.SequenceFetcher sfetch = null;
 
   JLabel exampleAccession;
 
@@ -97,20 +97,6 @@ public class SequenceFetcher extends JPanel implements Runnable
   volatile boolean _isConstructing = false;
 
   /**
-   * Returns the shared instance of the SequenceFetcher client
-   * 
-   * @return
-   */
-  public static jalview.ws.SequenceFetcher getSequenceFetcherSingleton()
-  {
-    if (sfetch == null)
-    {
-      sfetch = new jalview.ws.SequenceFetcher();
-    }
-    return sfetch;
-  }
-
-  /**
    * Constructor given a client to receive any status or progress messages
    * (currently either the Desktop, or an AlignFrame panel)
    * 
@@ -132,7 +118,7 @@ public class SequenceFetcher extends JPanel implements Runnable
           final String selectedDb, final String queryString)
   {
     this.progressIndicator = guiIndic;
-    getSequenceFetcherSingleton();
+
     this.guiWindow = progressIndicator;
 
     if (progressIndicator instanceof AlignFrame)
@@ -164,7 +150,8 @@ public class SequenceFetcher extends JPanel implements Runnable
     database = new JComboBox<>();
     database.setFont(JvSwingUtils.getLabelFont());
     database.setPrototypeDisplayValue("ENSEMBLGENOMES   ");
-    String[] sources = new jalview.ws.SequenceFetcher().getSupportedDb();
+    String[] sources = jalview.ws.SequenceFetcher.getInstance()
+            .getSupportedDb();
     Arrays.sort(sources, String.CASE_INSENSITIVE_ORDER);
     database.addItem(MessageManager.getString("action.select_ddbb"));
     for (String source : sources)
@@ -315,7 +302,8 @@ public class SequenceFetcher extends JPanel implements Runnable
   {
     StringBuilder sb = new StringBuilder();
     HashSet<String> hs = new HashSet<>();
-    for (DbSourceProxy dbs : sfetch.getSourceProxy(db))
+    for (DbSourceProxy dbs : jalview.ws.SequenceFetcher.getInstance()
+            .getSourceProxy(db))
     {
       String tq = dbs.getTestQuery();
       if (hs.add(tq)) // not a duplicate source
@@ -463,7 +451,7 @@ public class SequenceFetcher extends JPanel implements Runnable
     List<String> presultTitle = new ArrayList<>();
     List<AlignmentI> presult = new ArrayList<>();
     List<AlignmentI> aresult = new ArrayList<>();
-    List<DbSourceProxy> sources = sfetch
+    List<DbSourceProxy> sources = jalview.ws.SequenceFetcher.getInstance()
             .getSourceProxy((String) database.getSelectedItem());
     Iterator<DbSourceProxy> proxies = sources.iterator();
     String[] qries = textArea.getText().trim().split(";");
@@ -827,7 +815,7 @@ public class SequenceFetcher extends JPanel implements Runnable
         {
           af.getViewport().applyFeaturesStyle(preferredFeatureColours);
         }
-        if (Cache.getDefault("HIDE_INTRONS", true))
+        if (Cache.getDefault(Preferences.HIDE_INTRONS, true))
         {
           af.hideFeatureColumns(SequenceOntologyI.EXON, false);
         }
@@ -839,7 +827,8 @@ public class SequenceFetcher extends JPanel implements Runnable
 
         try
         {
-          af.setMaximum(Cache.getDefault("SHOW_FULLSCREEN", false));
+          af.setMaximum(
+                  Cache.getDefault(Preferences.SHOW_FULLSCREEN, false));
         } catch (Exception ex)
         {
         }
@@ -860,7 +849,7 @@ public class SequenceFetcher extends JPanel implements Runnable
       @Override
       public void run()
       {
-        JvOptionPane.showInternalMessageDialog(Desktop.desktop, error,
+        JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(), error,
                 MessageManager.getString("label.error_retrieving_data"),
                 JvOptionPane.WARNING_MESSAGE);
       }
index fb967ed..81b394b 100755 (executable)
@@ -30,9 +30,6 @@ import java.awt.Color;
 import java.awt.FontMetrics;
 import java.awt.Graphics;
 
-import org.jfree.graphics2d.svg.SVGGraphics2D;
-import org.jibble.epsgraphics.EpsGraphics2D;
-
 public class SequenceRenderer implements jalview.api.SequenceRenderer
 {
   final static int CHAR_TO_UPPER = 'A' - 'a';
@@ -257,19 +254,8 @@ public class SequenceRenderer implements jalview.api.SequenceRenderer
     }
     graphics.setColor(av.getTextColour());
 
-    boolean drawAllText = monospacedFont && av.getShowText() && allGroups.length == 0
-            && !av.getColourText() && av.getThresholdTextColour() == 0;
-
-    /*
-     * EPS or SVG misaligns monospaced strings (JAL-3239)
-     * so always draw these one character at a time
-     */
-    if (graphics instanceof EpsGraphics2D
-            || graphics instanceof SVGGraphics2D)
-    {
-      drawAllText = false;
-    }
-    if (drawAllText)
+    if (monospacedFont && av.getShowText() && allGroups.length == 0
+            && !av.getColourText() && av.getThresholdTextColour() == 0)
     {
       if (av.isRenderGaps())
       {
index 46b47a2..31ad083 100755 (executable)
@@ -26,7 +26,6 @@ import jalview.jbgui.GSliderPanel;
 import jalview.renderer.ResidueShaderI;
 import jalview.util.MessageManager;
 
-import java.awt.event.ActionEvent;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
 import java.beans.PropertyVetoException;
@@ -45,14 +44,11 @@ import javax.swing.event.InternalFrameEvent;
  * @author $author$
  * @version $Revision$
  */
+@SuppressWarnings("serial")
 public class SliderPanel extends GSliderPanel
 {
   private static final String BACKGROUND = "Background";
 
-  static JInternalFrame conservationSlider;
-
-  static JInternalFrame PIDSlider;
-
   AlignmentPanel ap;
 
   boolean forConservation = true;
@@ -66,6 +62,12 @@ public class SliderPanel extends GSliderPanel
    */
   public static SliderPanel getSliderPanel()
   {
+
+    JInternalFrame conservationSlider = Desktop
+            .getInstance().conservationSlider;
+
+    JInternalFrame PIDSlider = Desktop.getInstance().PIDSlider;
+
     if (conservationSlider != null && conservationSlider.isVisible())
     {
       return (SliderPanel) conservationSlider.getContentPane();
@@ -153,10 +155,14 @@ public class SliderPanel extends GSliderPanel
   {
     SliderPanel sliderPanel = null;
 
+    JInternalFrame conservationSlider = Desktop
+            .getInstance().conservationSlider;
+
     if (conservationSlider == null)
     {
       sliderPanel = new SliderPanel(ap, rs.getConservationInc(), true, rs);
-      conservationSlider = new JInternalFrame();
+      conservationSlider = Desktop
+              .getInstance().conservationSlider = new JInternalFrame();
       conservationSlider.setContentPane(sliderPanel);
       conservationSlider.setLayer(JLayeredPane.PALETTE_LAYER);
     }
@@ -192,12 +198,14 @@ public class SliderPanel extends GSliderPanel
    */
   public static void hidePIDSlider()
   {
+    JInternalFrame PIDSlider = Desktop.getInstance().PIDSlider;
+
     if (PIDSlider != null)
     {
       try
       {
         PIDSlider.setClosed(true);
-        PIDSlider = null;
+        Desktop.getInstance().PIDSlider = null;
       } catch (PropertyVetoException ex)
       {
       }
@@ -209,12 +217,15 @@ public class SliderPanel extends GSliderPanel
    */
   public static void hideConservationSlider()
   {
+    JInternalFrame conservationSlider = Desktop
+            .getInstance().conservationSlider;
+
     if (conservationSlider != null)
     {
       try
       {
         conservationSlider.setClosed(true);
-        conservationSlider = null;
+        Desktop.getInstance().conservationSlider = null;
       } catch (PropertyVetoException ex)
       {
       }
@@ -228,6 +239,9 @@ public class SliderPanel extends GSliderPanel
   {
     hidePIDSlider();
 
+    JInternalFrame conservationSlider = Desktop
+            .getInstance().conservationSlider;
+
     if (!conservationSlider.isVisible())
     {
       Desktop.addInternalFrame(conservationSlider,
@@ -238,7 +252,7 @@ public class SliderPanel extends GSliderPanel
         @Override
         public void internalFrameClosed(InternalFrameEvent e)
         {
-          conservationSlider = null;
+          Desktop.getInstance().conservationSlider = null;
         }
       });
       conservationSlider.setLayer(JLayeredPane.PALETTE_LAYER);
@@ -264,10 +278,12 @@ public class SliderPanel extends GSliderPanel
 
     SliderPanel sliderPanel = null;
 
+    JInternalFrame PIDSlider = Desktop.getInstance().PIDSlider;
+
     if (PIDSlider == null)
     {
       sliderPanel = new SliderPanel(ap, threshold, false, rs);
-      PIDSlider = new JInternalFrame();
+      PIDSlider = Desktop.getInstance().PIDSlider = new JInternalFrame();
       PIDSlider.setContentPane(sliderPanel);
       PIDSlider.setLayer(JLayeredPane.PALETTE_LAYER);
     }
@@ -305,6 +321,8 @@ public class SliderPanel extends GSliderPanel
   {
     hideConservationSlider();
 
+    JInternalFrame PIDSlider = Desktop.getInstance().PIDSlider;
+
     if (!PIDSlider.isVisible())
     {
       Desktop.addInternalFrame(PIDSlider, PIDSlider.getTitle(), true,
@@ -315,7 +333,7 @@ public class SliderPanel extends GSliderPanel
         @Override
         public void internalFrameClosed(InternalFrameEvent e)
         {
-          PIDSlider = null;
+          Desktop.getInstance().PIDSlider = null;
         }
       });
       PIDSlider.setLayer(JLayeredPane.PALETTE_LAYER);
@@ -451,7 +469,7 @@ public class SliderPanel extends GSliderPanel
 
   public static int getConservationValue()
   {
-    return getValue(conservationSlider);
+    return getValue(Desktop.getInstance().conservationSlider);
   }
 
   static int getValue(JInternalFrame slider)
@@ -462,7 +480,7 @@ public class SliderPanel extends GSliderPanel
 
   public static int getPIDValue()
   {
-    return getValue(PIDSlider);
+    return getValue(Desktop.getInstance().PIDSlider);
   }
 
   /**
@@ -485,6 +503,10 @@ public class SliderPanel extends GSliderPanel
   public String getTitle()
   {
     String title = null;
+    JInternalFrame conservationSlider = Desktop
+            .getInstance().conservationSlider;
+    JInternalFrame PIDSlider = Desktop.getInstance().PIDSlider;
+
     if (isForConservation())
     {
       if (conservationSlider != null)
index 2b87e10..f5648d2 100755 (executable)
@@ -101,7 +101,7 @@ public class SplashScreen extends JPanel
        */
       {
         authlist = new JTextPane();
-        Thread t = new Thread(this);
+        Thread t = new Thread(this, "SplashScreen");
         t.start();
       }
     }
@@ -160,7 +160,7 @@ public class SplashScreen extends JPanel
             System.err.println("Error when loading images!");
           }
         } while (!mt.checkAll());
-        Desktop.instance.setIconImage(logo);
+        Desktop.getInstance().setIconImage(logo);
       }
     } catch (Exception ex)
     {
@@ -191,7 +191,7 @@ public class SplashScreen extends JPanel
     }
     add(authlist, BorderLayout.CENTER);
     authlist.addMouseListener(closer);
-    Desktop.desktop.add(iframe);
+    Desktop.getDesktopPane().add(iframe);
     refreshText();
   }
 
@@ -203,7 +203,8 @@ public class SplashScreen extends JPanel
   @SuppressWarnings("unused")
   protected boolean refreshText()
   {
-    String newtext = Desktop.instance.getAboutMessage(true).toString();
+    Desktop desktop = Desktop.getInstance();
+    String newtext = desktop.getAboutMessage(true).toString();
     // System.err.println("Text found: \n"+newtext+"\nEnd of newtext.");
     if (oldtext != newtext.length())
     {
@@ -236,8 +237,8 @@ public class SplashScreen extends JPanel
       authlist.setSize(new Dimension(750, 375));
       add(authlist, BorderLayout.CENTER);
       revalidate();
-      iframe.setBounds((Desktop.instance.getWidth() - 750) / 2,
-              (Desktop.instance.getHeight() - 375) / 2, 750,
+      iframe.setBounds((desktop.getWidth() - 750) / 2,
+              (desktop.getHeight() - 375) / 2, 750,
               authlist.getHeight() + iconimg.getHeight());
       iframe.validate();
       iframe.setVisible(true);
@@ -287,7 +288,7 @@ public class SplashScreen extends JPanel
     }
 
     closeSplash();
-    Desktop.instance.startDialogQueue();
+    Desktop.getInstance().startDialogQueue();
   }
 
   /**
index 10738e8..253b02c 100644 (file)
@@ -132,7 +132,7 @@ public class SplitFrame extends GSplitFrame implements SplitContainerI
     // allow about 65 pixels for Desktop decorators on Windows
 
     int newHeight = Math.min(height,
-            Desktop.instance.getHeight() - DESKTOP_DECORATORS_HEIGHT);
+            Desktop.getInstance().getHeight() - DESKTOP_DECORATORS_HEIGHT);
     if (newHeight != height)
     {
       int oldDividerLocation = getDividerLocation();
@@ -149,8 +149,8 @@ public class SplitFrame extends GSplitFrame implements SplitContainerI
   {
     // TODO if CommandListener is only ever 1:1 for complementary views,
     // may change broadcast pattern to direct messaging (more efficient)
-    final StructureSelectionManager ssm = StructureSelectionManager
-            .getStructureSelectionManager(Desktop.instance);
+    final StructureSelectionManager ssm = Desktop
+            .getStructureSelectionManager();
     ssm.addCommandListener(((AlignFrame) getTopFrame()).getViewport());
     ssm.addCommandListener(((AlignFrame) getBottomFrame()).getViewport());
   }
@@ -282,7 +282,7 @@ public class SplitFrame extends GSplitFrame implements SplitContainerI
       public void internalFrameClosed(InternalFrameEvent evt)
       {
         close();
-      };
+      }
     });
   }
 
@@ -412,7 +412,7 @@ public class SplitFrame extends GSplitFrame implements SplitContainerI
      * Ctrl-W / Cmd-W - close view or window
      */
     KeyStroke key_cmdW = KeyStroke.getKeyStroke(KeyEvent.VK_W,
-            jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false);
+            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
     action = new AbstractAction()
     {
       @Override
@@ -433,7 +433,7 @@ public class SplitFrame extends GSplitFrame implements SplitContainerI
      * Ctrl-T / Cmd-T open new view
      */
     KeyStroke key_cmdT = KeyStroke.getKeyStroke(KeyEvent.VK_T,
-            jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false);
+            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
     AbstractAction action = new AbstractAction()
     {
       @Override
@@ -555,8 +555,8 @@ public class SplitFrame extends GSplitFrame implements SplitContainerI
      */
     adjustLayout();
 
-    final StructureSelectionManager ssm = StructureSelectionManager
-            .getStructureSelectionManager(Desktop.instance);
+    final StructureSelectionManager ssm = Desktop
+            .getStructureSelectionManager();
     ssm.addCommandListener(newTopPanel.av);
     ssm.addCommandListener(newBottomPanel.av);
   }
@@ -683,7 +683,7 @@ public class SplitFrame extends GSplitFrame implements SplitContainerI
    */
   protected void expandViews_actionPerformed()
   {
-    Desktop.instance.explodeViews(this);
+    Desktop.getInstance().explodeViews(this);
   }
 
   /**
@@ -692,7 +692,7 @@ public class SplitFrame extends GSplitFrame implements SplitContainerI
    */
   protected void gatherViews_actionPerformed()
   {
-    Desktop.instance.gatherViews(this);
+    Desktop.getInstance().gatherViews(this);
   }
 
   /**
@@ -773,7 +773,7 @@ public class SplitFrame extends GSplitFrame implements SplitContainerI
      * Ctrl-F / Cmd-F open Finder dialog, 'focused' on the right alignment
      */
     KeyStroke key_cmdF = KeyStroke.getKeyStroke(KeyEvent.VK_F,
-            jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false);
+            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
     AbstractAction action = new AbstractAction()
     {
       @Override
index 23b7fcf..9c4f6c8 100644 (file)
@@ -36,11 +36,8 @@ import jalview.fts.core.FTSRestResponse;
 import jalview.fts.service.pdb.PDBFTSRestClient;
 import jalview.io.DataSourceType;
 import jalview.jbgui.GStructureChooser;
-import jalview.structure.StructureMapping;
 import jalview.structure.StructureSelectionManager;
 import jalview.util.MessageManager;
-import jalview.ws.DBRefFetcher;
-import jalview.ws.sifts.SiftsSettings;
 
 import java.awt.event.ItemEvent;
 import java.util.ArrayList;
@@ -71,27 +68,25 @@ public class StructureChooser extends GStructureChooser
 {
   private static final String AUTOSUPERIMPOSE = "AUTOSUPERIMPOSE";
 
-  private static int MAX_QLENGTH = 7820;
+  private static final int MAX_QLENGTH = 7820;
 
-  private SequenceI selectedSequence;
+  protected SequenceI selectedSequence;
 
-  private SequenceI[] selectedSequences;
+  public SequenceI[] selectedSequences;
 
   private IProgressIndicator progressIndicator;
 
-  private Collection<FTSData> discoveredStructuresSet;
+  protected Collection<FTSData> discoveredStructuresSet;
 
-  private FTSRestRequest lastPdbRequest;
+  protected FTSRestRequest lastPdbRequest;
 
-  private FTSRestClientI pdbRestClient;
+  protected FTSRestClientI pdbRestClient;
 
-  private String selectedPdbFileName;
+  protected String selectedPdbFileName;
 
-  private boolean isValidPBDEntry;
+  protected boolean isValidPBDEntry;
 
-  private boolean cachedPDBExists;
-
-  private static StructureViewer lastTargetedView = null;
+  protected boolean cachedPDBExists;
 
   public StructureChooser(SequenceI[] selectedSeqs, SequenceI selectedSeq,
           AlignmentPanel ap)
@@ -146,21 +141,24 @@ public class StructureChooser extends GStructureChooser
    * structures may be added. If this list is empty then it, and the 'Add'
    * button, are hidden.
    */
-  private void discoverStructureViews()
+  protected void discoverStructureViews()
   {
-    if (Desktop.instance != null)
+    Desktop desktop = Desktop.getInstance();
+    if (desktop != null)
     {
       targetView.removeAllItems();
-      if (lastTargetedView != null && !lastTargetedView.isVisible())
+      if (desktop.lastTargetedView != null
+              && !desktop.lastTargetedView.isVisible())
       {
-        lastTargetedView = null;
+        desktop.lastTargetedView = null;
       }
       int linkedViewsAt = 0;
-      for (StructureViewerBase view : Desktop.instance
+      for (StructureViewerBase view : desktop
               .getStructureViewers(null, null))
       {
-        StructureViewer viewHandler = (lastTargetedView != null
-                && lastTargetedView.sview == view) ? lastTargetedView
+        StructureViewer viewHandler = (desktop.lastTargetedView != null
+                && desktop.lastTargetedView.sview == view)
+                        ? desktop.lastTargetedView
                         : StructureViewer.reconfigure(view);
 
         if (view.isLinkedWith(ap))
@@ -181,9 +179,9 @@ public class StructureChooser extends GStructureChooser
       if (targetView.getItemCount() > 0)
       {
         targetView.setVisible(true);
-        if (lastTargetedView != null)
+        if (desktop.lastTargetedView != null)
         {
-          targetView.setSelectedItem(lastTargetedView);
+          targetView.setSelectedItem(desktop.lastTargetedView);
         }
         else
         {
@@ -874,13 +872,11 @@ public class StructureChooser extends GStructureChooser
   /**
    * structure viewer opened by this dialog, or null
    */
-  private StructureViewer sViewer = null;
+  protected StructureViewer sViewer = null;
 
   public void showStructures(boolean waitUntilFinished)
   {
 
-    final StructureSelectionManager ssm = ap.getStructureSelectionManager();
-
     final int preferredHeight = pnl_filter.getHeight();
 
     Runnable viewStruc = new Runnable()
@@ -929,7 +925,7 @@ public class StructureChooser extends GStructureChooser
           }
           SequenceI[] selectedSeqs = selectedSeqsToView
                   .toArray(new SequenceI[selectedSeqsToView.size()]);
-          sViewer = launchStructureViewer(ssm, pdbEntriesToView, ap,
+          sViewer = launchStructureViewer(ap, pdbEntriesToView,
                   selectedSeqs);
         }
         else if (currentView == VIEWS_LOCAL_PDB)
@@ -953,7 +949,7 @@ public class StructureChooser extends GStructureChooser
           }
           SequenceI[] selectedSeqs = selectedSeqsToView
                   .toArray(new SequenceI[selectedSeqsToView.size()]);
-          sViewer = launchStructureViewer(ssm, pdbEntriesToView, ap,
+          sViewer = launchStructureViewer(ap, pdbEntriesToView,
                   selectedSeqs);
         }
         else if (currentView == VIEWS_ENTER_ID)
@@ -983,7 +979,7 @@ public class StructureChooser extends GStructureChooser
           }
 
           PDBEntry[] pdbEntriesToView = new PDBEntry[] { pdbEntry };
-          sViewer = launchStructureViewer(ssm, pdbEntriesToView, ap,
+          sViewer = launchStructureViewer(ap, pdbEntriesToView,
                   new SequenceI[]
                   { selectedSequence });
         }
@@ -995,14 +991,13 @@ public class StructureChooser extends GStructureChooser
           {
             selectedSequence = userSelectedSeq;
           }
-          PDBEntry fileEntry = new AssociatePdbFileWithSeq()
+          PDBEntry fileEntry = AssociatePdbFileWithSeq
                   .associatePdbWithSeq(selectedPdbFileName,
-                          DataSourceType.FILE, selectedSequence, true,
-                          Desktop.instance);
+                          DataSourceType.FILE, selectedSequence, true);
 
           sViewer = launchStructureViewer(
-                  ssm, new PDBEntry[]
-                  { fileEntry }, ap,
+                  ap, new PDBEntry[]
+                  { fileEntry },
                   new SequenceI[]
                   { selectedSequence });
         }
@@ -1036,7 +1031,7 @@ public class StructureChooser extends GStructureChooser
     }
   }
 
-  private PDBEntry getFindEntry(String id, Vector<PDBEntry> pdbEntries)
+  protected PDBEntry getFindEntry(String id, Vector<PDBEntry> pdbEntries)
   {
     Objects.requireNonNull(id);
     Objects.requireNonNull(pdbEntries);
@@ -1055,13 +1050,12 @@ public class StructureChooser extends GStructureChooser
    * Answers a structure viewer (new or existing) configured to superimpose
    * added structures or not according to the user's choice
    * 
-   * @param ssm
    * @return
    */
-  StructureViewer getTargetedStructureViewer(
-          StructureSelectionManager ssm)
+  StructureViewer getTargetedStructureViewer()
   {
-    Object sv = targetView.getSelectedItem();
+    final StructureSelectionManager ssm = ap.getStructureSelectionManager();
+    Object sv = (targetView == null ? null : targetView.getSelectedItem());
 
     return sv == null ? new StructureViewer(ssm) : (StructureViewer) sv;
   }
@@ -1069,93 +1063,24 @@ public class StructureChooser extends GStructureChooser
   /**
    * Adds PDB structures to a new or existing structure viewer
    * 
-   * @param ssm
+   * @param ap
    * @param pdbEntriesToView
-   * @param alignPanel
    * @param sequences
-   * @return
+   * @param superimpose
+   * @return viewer
    */
-  private StructureViewer launchStructureViewer(
-          StructureSelectionManager ssm,
-          final PDBEntry[] pdbEntriesToView,
-          final AlignmentPanel alignPanel, SequenceI[] sequences)
+  protected StructureViewer launchStructureViewer(
+          AlignmentPanel ap, PDBEntry[] pdbEntriesToView,
+          SequenceI[] selectedSeqs)
   {
-    long progressId = sequences.hashCode();
-    setProgressBar(MessageManager
-            .getString("status.launching_3d_structure_viewer"), progressId);
-    final StructureViewer theViewer = getTargetedStructureViewer(ssm);
     boolean superimpose = chk_superpose.isSelected();
-    theViewer.setSuperpose(superimpose);
-
     /*
      * remember user's choice of superimpose or not
      */
     Cache.setProperty(AUTOSUPERIMPOSE,
             Boolean.valueOf(superimpose).toString());
-
-    setProgressBar(null, progressId);
-    if (SiftsSettings.isMapWithSifts())
-    {
-      List<SequenceI> seqsWithoutSourceDBRef = new ArrayList<>();
-      int p = 0;
-      // TODO: skip PDBEntry:Sequence pairs where PDBEntry doesn't look like a
-      // real PDB ID. For moment, we can also safely do this if there is already
-      // a known mapping between the PDBEntry and the sequence.
-      for (SequenceI seq : sequences)
-      {
-        PDBEntry pdbe = pdbEntriesToView[p++];
-        if (pdbe != null && pdbe.getFile() != null)
-        {
-          StructureMapping[] smm = ssm.getMapping(pdbe.getFile());
-          if (smm != null && smm.length > 0)
-          {
-            for (StructureMapping sm : smm)
-            {
-              if (sm.getSequence() == seq)
-              {
-                continue;
-              }
-            }
-          }
-        }
-        if (seq.getPrimaryDBRefs().isEmpty())
-        {
-          seqsWithoutSourceDBRef.add(seq);
-          continue;
-        }
-      }
-      if (!seqsWithoutSourceDBRef.isEmpty())
-      {
-        int y = seqsWithoutSourceDBRef.size();
-        setProgressBar(MessageManager.formatMessage(
-                "status.fetching_dbrefs_for_sequences_without_valid_refs",
-                y), progressId);
-        SequenceI[] seqWithoutSrcDBRef = seqsWithoutSourceDBRef
-                .toArray(new SequenceI[y]);
-        DBRefFetcher dbRefFetcher = new DBRefFetcher(seqWithoutSrcDBRef);
-        dbRefFetcher.fetchDBRefs(true);
-
-        setProgressBar("Fetch complete.", progressId); // todo i18n
-      }
-    }
-    if (pdbEntriesToView.length > 1)
-    {
-      setProgressBar(MessageManager.getString(
-              "status.fetching_3d_structures_for_selected_entries"),
-              progressId);
-      theViewer.viewStructures(pdbEntriesToView, sequences, alignPanel);
-    }
-    else
-    {
-      setProgressBar(MessageManager.formatMessage(
-              "status.fetching_3d_structures_for",
-              pdbEntriesToView[0].getId()),progressId);
-      theViewer.viewStructures(pdbEntriesToView[0], sequences, alignPanel);
-    }
-    setProgressBar(null, progressId);
-    // remember the last viewer we used...
-    lastTargetedView = theViewer;
-    return theViewer;
+    return StructureViewer.launchStructureViewer(ap, pdbEntriesToView, selectedSeqs,
+            superimpose, getTargetedStructureViewer(), progressBar);
   }
 
   /**
@@ -1202,7 +1127,8 @@ public class StructureChooser extends GStructureChooser
   protected void txt_search_ActionPerformed()
   {
     String text = txt_search.getText().trim();
-       if (text.length() >= PDB_ID_MIN) 
+       if (text.length() >= PDB_ID_MIN)
+  {
     new Thread()
     {
 
@@ -1248,6 +1174,7 @@ public class StructureChooser extends GStructureChooser
       }
     }.start();
   }
+  }
 
   @Override
   protected void tabRefresh()
@@ -1374,7 +1301,10 @@ public class StructureChooser extends GStructureChooser
   @Override
   public void setProgressBar(String message, long id)
   {
-    progressBar.setProgressBar(message, id);
+    if (progressBar != null)
+    {
+      progressBar.setProgressBar(message, id);
+    }
   }
 
   @Override
index 0c8354b..dc5d77d 100644 (file)
@@ -25,7 +25,12 @@ import jalview.bin.Cache;
 import jalview.datamodel.PDBEntry;
 import jalview.datamodel.SequenceI;
 import jalview.datamodel.StructureViewerModel;
+import jalview.structure.StructureMapping;
 import jalview.structure.StructureSelectionManager;
+import jalview.util.MessageManager;
+import jalview.util.Platform;
+import jalview.ws.DBRefFetcher;
+import jalview.ws.sifts.SiftsSettings;
 
 import java.awt.Rectangle;
 import java.util.ArrayList;
@@ -45,6 +50,13 @@ import java.util.Map.Entry;
  */
 public class StructureViewer
 {
+
+  static
+  {
+    Platform.loadStaticResource("core/core_jvjmol.z.js",
+            "org.jmol.viewer.Viewer");
+  }
+
   private static final String UNKNOWN_VIEWER_TYPE = "Unknown structure viewer type ";
 
   StructureSelectionManager ssm;
@@ -388,4 +400,135 @@ public class StructureViewer
     superposeAdded = alignAddedStructures;
   }
 
+  /**
+   * Launch a minimal implementation of a StructureViewer.
+   * 
+   * @param alignPanel
+   * @param pdb
+   * @param seqs
+   * @return
+   */
+  public static StructureViewer launchStructureViewer(
+          AlignmentPanel alignPanel, PDBEntry pdb, SequenceI[] seqs)
+  {
+    return launchStructureViewer(alignPanel, new PDBEntry[] { pdb }, seqs,
+            false, null, null);
+  }
+
+  /**
+   * Launch a structure viewer with or without an open StructureChooser.
+   * 
+   * Moved from StructureChooser to enable JalviewJS startup with structure
+   * display.
+   * 
+   * @param ap
+   * @param pdbEntriesToView
+   * @param sequences
+   * @param superimpose
+   * @param theViewer
+   * @param pb
+   * @return
+   */
+  protected static StructureViewer launchStructureViewer(
+          final AlignmentPanel ap,
+          final PDBEntry[] pdbEntriesToView, SequenceI[] sequences,
+          boolean superimpose, StructureViewer theViewer,
+          IProgressIndicator pb)
+  {
+    final StructureSelectionManager ssm = ap.getStructureSelectionManager();
+    long progressId = sequences.hashCode();
+    if (pb != null)
+    {
+      pb.setProgressBar(MessageManager
+            .getString("status.launching_3d_structure_viewer"), progressId);
+    }
+    if (theViewer == null)
+    {
+      theViewer = new StructureViewer(ssm);
+    }
+    theViewer.setSuperpose(superimpose);
+  
+    if (pb != null)
+    {
+      pb.setProgressBar(null, progressId);
+    }
+    if (SiftsSettings.isMapWithSifts())
+    {
+      List<SequenceI> seqsWithoutSourceDBRef = new ArrayList<>();
+      int p = 0;
+      // TODO: skip PDBEntry:Sequence pairs where PDBEntry doesn't look like a
+      // real PDB ID. For moment, we can also safely do this if there is already
+      // a known mapping between the PDBEntry and the sequence.
+      for (SequenceI seq : sequences)
+      {
+        PDBEntry pdbe = pdbEntriesToView[p++];
+        if (pdbe != null && pdbe.getFile() != null)
+        {
+          StructureMapping[] smm = ssm.getMapping(pdbe.getFile());
+          if (smm != null && smm.length > 0)
+          {
+            for (StructureMapping sm : smm)
+            {
+              if (sm.getSequence() == seq)
+              {
+                continue;
+              }
+            }
+          }
+        }
+        if (seq.getPrimaryDBRefs().isEmpty())
+        {
+          seqsWithoutSourceDBRef.add(seq);
+          continue;
+        }
+      }
+      if (!seqsWithoutSourceDBRef.isEmpty())
+      {
+        int y = seqsWithoutSourceDBRef.size();
+        if (pb != null)
+        {
+          pb.setProgressBar(MessageManager.formatMessage(
+                "status.fetching_dbrefs_for_sequences_without_valid_refs",
+                y), progressId);
+        }
+        SequenceI[] seqWithoutSrcDBRef = seqsWithoutSourceDBRef
+                .toArray(new SequenceI[y]);
+        DBRefFetcher dbRefFetcher = new DBRefFetcher(seqWithoutSrcDBRef);
+        dbRefFetcher.fetchDBRefs(true);
+  
+        if (pb != null)
+         {
+          pb.setProgressBar("Fetch complete.", progressId); // todo i18n
+        }
+      }
+    }
+    if (pdbEntriesToView.length > 1)
+    {
+      if (pb != null)
+      {
+        pb.setProgressBar(MessageManager.getString(
+              "status.fetching_3d_structures_for_selected_entries"),
+              progressId);
+      }
+      theViewer.viewStructures(pdbEntriesToView, sequences, ap);
+    }
+    else
+    {
+      if (pb != null)
+      {
+        pb.setProgressBar(MessageManager.formatMessage(
+              "status.fetching_3d_structures_for",
+              pdbEntriesToView[0].getId()),progressId);
+      }
+      theViewer.viewStructures(pdbEntriesToView[0], sequences, ap);
+    }
+    if (pb != null)
+    {
+      pb.setProgressBar(null, progressId);
+    }
+    // remember the last viewer we used...
+    Desktop.getInstance().lastTargetedView = theViewer;
+    return theViewer;
+  }
+
 }
index 418a84d..af48093 100644 (file)
@@ -407,7 +407,7 @@ public abstract class StructureViewerBase extends GStructureViewer
    */
   protected List<StructureViewerBase> getViewersFor(AlignmentPanel alp)
   {
-    return Desktop.instance.getStructureViewers(alp, this.getClass());
+    return Desktop.getInstance().getStructureViewers(alp, this.getClass());
   }
 
   @Override
index 4846049..6e3a68b 100755 (executable)
@@ -69,8 +69,6 @@ public class UserDefinedColours extends GUserDefinedColours
   private static final Font VERDANA_BOLD_10 = new Font("Verdana", Font.BOLD,
           10);
 
-  public static final String USER_DEFINED_COLOURS = "USER_DEFINED_COLOURS";
-
   private static final String LAST_DIRECTORY = "LAST_DIRECTORY";
 
   private static final int MY_FRAME_HEIGHT = 440;
@@ -448,7 +446,7 @@ public class UserDefinedColours extends GUserDefinedColours
   {
     if (isNoSelectionMade())
     {
-      JvOptionPane.showMessageDialog(Desktop.desktop,
+      JvOptionPane.showMessageDialog(Desktop.getDesktopPane(),
               MessageManager
                       .getString("label.no_colour_selection_in_scheme"),
               MessageManager.getString("label.no_colour_selection_warn"),
@@ -503,7 +501,7 @@ public class UserDefinedColours extends GUserDefinedColours
         String[] options = new String[] { title,
             MessageManager.getString("label.dont_save_changes"), };
         final String question = JvSwingUtils.wrapTooltip(true, message);
-        int response = JvOptionPane.showOptionDialog(Desktop.desktop,
+        int response = JvOptionPane.showOptionDialog(Desktop.getDesktopPane(),
                 question, title, JvOptionPane.DEFAULT_OPTION,
                 JvOptionPane.PLAIN_MESSAGE, null, options, options[0]);
 
@@ -557,7 +555,7 @@ public class UserDefinedColours extends GUserDefinedColours
   {
     if (isNoSelectionMade())
     {
-      JvOptionPane.showMessageDialog(Desktop.desktop,
+      JvOptionPane.showMessageDialog(Desktop.getDesktopPane(),
               MessageManager
                       .getString("label.no_colour_selection_in_scheme"),
               MessageManager.getString("label.no_colour_selection_warn"),
@@ -694,7 +692,7 @@ public class UserDefinedColours extends GUserDefinedColours
 
   /**
    * Loads the user-defined colour scheme from the first file listed in property
-   * "USER_DEFINED_COLOURS". If this fails, returns an all-white colour scheme.
+   * Preferences.USER_DEFINED_COLOURS. If this fails, returns an all-white colour scheme.
    * 
    * @return
    */
@@ -702,7 +700,7 @@ public class UserDefinedColours extends GUserDefinedColours
   {
     UserColourScheme ret = null;
 
-    String colours = Cache.getProperty(USER_DEFINED_COLOURS);
+    String colours = Cache.getProperty(Preferences.USER_DEFINED_COLOURS);
     if (colours != null)
     {
       if (colours.indexOf("|") > -1)
@@ -741,7 +739,7 @@ public class UserDefinedColours extends GUserDefinedColours
     String name = schemeName.getText().trim();
     if (name.length() < 1)
     {
-      JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+      JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
               MessageManager
                       .getString("label.user_colour_scheme_must_have_name"),
               MessageManager.getString("label.no_name_colour_scheme"),
@@ -756,7 +754,7 @@ public class UserDefinedColours extends GUserDefinedColours
        * @j2sIgnore
        */
       {
-        int reply = JvOptionPane.showInternalConfirmDialog(Desktop.desktop,
+        int reply = JvOptionPane.showInternalConfirmDialog(Desktop.getDesktopPane(),
                 MessageManager.formatMessage(
                         "label.colour_scheme_exists_overwrite", new Object[]
                         { name, name }),
@@ -814,7 +812,8 @@ public class UserDefinedColours extends GUserDefinedColours
      * update the delimited list of user defined colour files in
      * Jalview property USER_DEFINED_COLOURS
      */
-    String defaultColours = Cache.getDefault(USER_DEFINED_COLOURS,
+    String defaultColours = Cache.getDefault(
+            Preferences.USER_DEFINED_COLOURS,
             filePath);
     if (defaultColours.indexOf(filePath) == -1)
     {
@@ -824,7 +823,7 @@ public class UserDefinedColours extends GUserDefinedColours
       }
       defaultColours = defaultColours.concat(filePath);
     }
-    Cache.setProperty(USER_DEFINED_COLOURS, defaultColours);
+    Cache.setProperty(Preferences.USER_DEFINED_COLOURS, defaultColours);
 
     /*
      * construct and register the colour scheme
index ef86756..df64db0 100644 (file)
 package jalview.gui;
 
 import jalview.util.MessageManager;
+import jalview.util.Platform;
 
 import java.io.BufferedReader;
 import java.io.InputStreamReader;
 import java.net.URL;
 
-import javax.swing.JOptionPane;
-
 public class UserQuestionnaireCheck implements Runnable
 {
   /**
@@ -91,6 +90,7 @@ public class UserQuestionnaireCheck implements Runnable
     return prompt;
   }
 
+  @Override
   public void run()
   {
     if (url == null)
@@ -101,7 +101,7 @@ public class UserQuestionnaireCheck implements Runnable
     try
     {
       // First - check to see if wee have an old questionnaire/response id pair.
-      String lastq = jalview.bin.Cache.getProperty("QUESTIONNAIRE");
+      String lastq = jalview.bin.Cache.getProperty(Preferences.QUESTIONNAIRE);
       if (lastq == null)
       {
         prompt = checkresponse(new URL(url
@@ -133,7 +133,7 @@ public class UserQuestionnaireCheck implements Runnable
       if (qid != null && rid != null)
       {
         // Update our local property cache with latest qid and rid
-        jalview.bin.Cache.setProperty("QUESTIONNAIRE", qid + ":" + rid);
+        jalview.bin.Cache.setProperty(Preferences.QUESTIONNAIRE, qid + ":" + rid);
       }
       if (prompt)
       {
@@ -141,7 +141,7 @@ public class UserQuestionnaireCheck implements Runnable
                 + qid + "&rid=" + rid;
         jalview.bin.Cache.log
                 .info("Prompting user for questionnaire at " + qurl);
-        int reply = JvOptionPane.showInternalConfirmDialog(Desktop.desktop,
+        int reply = JvOptionPane.showInternalConfirmDialog(Desktop.getDesktopPane(),
                 MessageManager.getString("label.jalview_new_questionnaire"),
                 MessageManager.getString("label.jalview_user_survey"),
                 JvOptionPane.YES_NO_OPTION, JvOptionPane.QUESTION_MESSAGE);
@@ -149,7 +149,7 @@ public class UserQuestionnaireCheck implements Runnable
         if (reply == JvOptionPane.YES_OPTION)
         {
           jalview.bin.Cache.log.debug("Opening " + qurl);
-          jalview.util.BrowserLauncher.openURL(qurl);
+          Platform.openURL(qurl);
         }
       }
     } catch (Exception e)
index c094b1c..ef814d3 100644 (file)
@@ -173,7 +173,7 @@ public class VamsasApplication implements SelectionSource, VamsasSource
           }
         } catch (InvalidSessionDocumentException e)
         {
-          JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+          JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
 
                   MessageManager.getString(
                           "label.vamsas_doc_couldnt_be_opened_as_new_session"),
@@ -455,7 +455,7 @@ public class VamsasApplication implements SelectionSource, VamsasSource
     VamsasAppDatastore vds = new VamsasAppDatastore(doc, vobj2jv, jv2vobj,
             baseProvEntry(), alRedoState);
     // wander through frames
-    JInternalFrame[] frames = Desktop.desktop.getAllFrames();
+    JInternalFrame[] frames = Desktop.getDesktopPane().getAllFrames();
 
     if (frames == null)
     {
@@ -660,7 +660,7 @@ public class VamsasApplication implements SelectionSource, VamsasSource
                   Cache.log.debug(
                           "Asking user if the vamsas session should be stored.");
                   int reply = JvOptionPane.showInternalConfirmDialog(
-                          Desktop.desktop,
+                          Desktop.getDesktopPane(),
                           "The current VAMSAS session has unsaved data - do you want to save it ?",
                           "VAMSAS Session Shutdown",
                           JvOptionPane.YES_NO_OPTION,
@@ -669,7 +669,7 @@ public class VamsasApplication implements SelectionSource, VamsasSource
                   if (reply == JvOptionPane.YES_OPTION)
                   {
                     Cache.log.debug("Prompting for vamsas store filename.");
-                    Desktop.instance.vamsasSave_actionPerformed(null);
+                    Desktop.getInstance().vamsasSave_actionPerformed(null);
                     Cache.log
                             .debug("Finished attempt at storing document.");
                   }
@@ -688,7 +688,7 @@ public class VamsasApplication implements SelectionSource, VamsasSource
 
   public void disableGui(boolean b)
   {
-    Desktop.instance.setVamsasUpdate(b);
+    Desktop.getInstance().setVamsasUpdate(b);
   }
 
   Hashtable _backup_vobj2jv;
@@ -761,10 +761,10 @@ public class VamsasApplication implements SelectionSource, VamsasSource
       }
       try
       {
-        final IPickManager pm = vclient.getPickManager();
-        final StructureSelectionManager ssm = StructureSelectionManager
-                .getStructureSelectionManager(Desktop.instance);
-        final VamsasApplication me = this;
+        IPickManager pm = vclient.getPickManager();
+        StructureSelectionManager ssm = Desktop
+                .getStructureSelectionManager();
+        VamsasApplication me = this;
         pm.registerMessageHandler(new IMessageHandler()
         {
           String last = null;
@@ -830,7 +830,6 @@ public class VamsasApplication implements SelectionSource, VamsasSource
                 {
                   type = jvobjs[o].getClass();
                 }
-                ;
                 if (type != jvobjs[o].getClass())
                 {
                   send = false;
@@ -954,7 +953,6 @@ public class VamsasApplication implements SelectionSource, VamsasSource
               {
                 jvobjs[c] = null;
               }
-              ;
               jvobjs = null;
               return;
             }
index c6137cc..ae013ec 100644 (file)
@@ -711,7 +711,7 @@ public class WebserviceInfo extends GWebserviceInfo
       @Override
       public void run()
       {
-        JvOptionPane.showInternalMessageDialog(Desktop.desktop, message,
+        JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(), message,
                 title, JvOptionPane.WARNING_MESSAGE);
 
       }
index 976e551..45822a3 100644 (file)
@@ -215,12 +215,12 @@ public class WsJobParameters extends JPanel implements ItemListener,
   public boolean showRunDialog()
   {
 
-    frame = new JDialog(Desktop.instance, true);
+    frame = new JDialog(Desktop.getInstance(), true);
 
     frame.setTitle(MessageManager.formatMessage("label.edit_params_for",
             new String[]
             { service.getActionText() }));
-    Rectangle deskr = Desktop.instance.getBounds();
+    Rectangle deskr = Desktop.getInstance().getBounds();
     Dimension pref = this.getPreferredSize();
     frame.setBounds(
             new Rectangle((int) (deskr.getCenterX() - pref.width / 2),
@@ -436,8 +436,8 @@ public class WsJobParameters extends JPanel implements ItemListener,
     dialogpanel.add(canceljob);
     // JAL-1580: setMaximumSize() doesn't work, so just size for the worst case:
     // check for null is for JUnit usage
-    final int windowHeight = Desktop.instance == null ? 540
-            : Desktop.instance.getHeight();
+    final int windowHeight = Desktop.getInstance() == null ? 540
+            : Desktop.getInstance().getHeight();
     setPreferredSize(new Dimension(540, windowHeight));
     add(dialogpanel, BorderLayout.SOUTH);
     validate();
@@ -963,13 +963,13 @@ public class WsJobParameters extends JPanel implements ItemListener,
   public static void main(String[] args)
   {
     jalview.ws.jws2.Jws2Discoverer disc = jalview.ws.jws2.Jws2Discoverer
-            .getDiscoverer();
+            .getInstance();
     int p = 0;
     if (args.length > 0)
     {
       Vector<String> services = new Vector<>();
       services.addElement(args[p++]);
-      Jws2Discoverer.getDiscoverer().setServiceUrls(services);
+      Jws2Discoverer.getInstance().setServiceUrls(services);
     }
     try
     {
index bb5d996..0bfbb43 100644 (file)
@@ -203,7 +203,7 @@ public class WsParamSetManager implements ParamManager
       chooser.setDialogTitle(MessageManager
               .getString("label.choose_filename_for_param_file"));
       chooser.setToolTipText(MessageManager.getString("action.save"));
-      int value = chooser.showSaveDialog(Desktop.instance);
+      int value = chooser.showSaveDialog(Desktop.getInstance());
       if (value == JalviewFileChooser.APPROVE_OPTION)
       {
         outfile = chooser.getSelectedFile();
@@ -274,7 +274,7 @@ public class WsParamSetManager implements ParamManager
    * if (value == JalviewFileChooser.APPROVE_OPTION) { File choice =
    * chooser.getSelectedFile(); jalview.bin.Cache.setProperty("LAST_DIRECTORY",
    * choice.getParent()); String defaultColours = jalview.bin.Cache.getDefault(
-   * "USER_DEFINED_COLOURS", choice.getPath()); if
+   * Preferences.USER_DEFINED_COLOURS, choice.getPath()); if
    * (defaultColours.indexOf(choice.getPath()) == -1) { defaultColours =
    * defaultColours.concat("|") .concat(choice.getPath()); } (non-Javadoc)
    * 
@@ -311,7 +311,7 @@ public class WsParamSetManager implements ParamManager
       File pfile = new File(filename);
       if (pfile.exists() && pfile.canWrite())
       {
-        if (JvOptionPane.showConfirmDialog(Desktop.instance,
+        if (JvOptionPane.showConfirmDialog(Desktop.getInstance(),
                 "Delete the preset's file, too ?", "Delete User Preset ?",
                 JvOptionPane.OK_CANCEL_OPTION) == JvOptionPane.OK_OPTION)
         {
index 5186a26..01a62e9 100644 (file)
@@ -65,7 +65,7 @@ public class WsPreferences extends GWsPreferences
   private void initFromPreferences()
   {
 
-    wsUrls = Jws2Discoverer.getDiscoverer().getServiceUrls();
+    wsUrls = Jws2Discoverer.getInstance().getServiceUrls();
     if (!wsUrls.isEmpty())
     {
       oldUrls = new Vector<String>(wsUrls);
@@ -122,8 +122,8 @@ public class WsPreferences extends GWsPreferences
     int r = 0;
     for (String url : wsUrls)
     {
-      int status = Jws2Discoverer.getDiscoverer().getServerStatusFor(url);
-      tdat[r][1] = Integer.valueOf(status);
+      int status = Jws2Discoverer.getInstance().getServerStatusFor(url);
+      tdat[r][1] = new Integer(status);
       tdat[r++][0] = url;
     }
 
@@ -241,7 +241,7 @@ public class WsPreferences extends GWsPreferences
 
   private void updateServiceList()
   {
-    Jws2Discoverer.getDiscoverer().setServiceUrls(wsUrls);
+    Jws2Discoverer.getInstance().setServiceUrls(wsUrls);
   }
 
   private void updateRsbsServiceList()
@@ -454,7 +454,7 @@ public class WsPreferences extends GWsPreferences
     boolean valid = false;
     int resp = JvOptionPane.CANCEL_OPTION;
     while (!valid && (resp = JvOptionPane.showInternalConfirmDialog(
-            Desktop.desktop, panel, title,
+            Desktop.getDesktopPane(), panel, title,
             JvOptionPane.OK_CANCEL_OPTION)) == JvOptionPane.OK_OPTION)
     {
       try
@@ -472,13 +472,13 @@ public class WsPreferences extends GWsPreferences
       } catch (Exception e)
       {
         valid = false;
-        JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+        JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
                 MessageManager.getString("label.invalid_url"));
       }
     }
     if (valid && resp == JvOptionPane.OK_OPTION)
     {
-      int validate = JvOptionPane.showInternalConfirmDialog(Desktop.desktop,
+      int validate = JvOptionPane.showInternalConfirmDialog(Desktop.getDesktopPane(),
               MessageManager.getString("info.validate_jabaws_server"),
               MessageManager.getString("label.test_server"),
               JvOptionPane.YES_NO_OPTION);
@@ -491,7 +491,7 @@ public class WsPreferences extends GWsPreferences
         }
         else
         {
-          int opt = JvOptionPane.showInternalOptionDialog(Desktop.desktop,
+          int opt = JvOptionPane.showInternalOptionDialog(Desktop.getDesktopPane(),
                   "The Server  '" + foo.toString()
                           + "' failed validation,\ndo you want to add it anyway? ",
                   "Server Validation Failed", JvOptionPane.YES_NO_OPTION,
@@ -502,7 +502,7 @@ public class WsPreferences extends GWsPreferences
           }
           else
           {
-            JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+            JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
                     MessageManager.getString(
                             "warn.server_didnt_pass_validation"));
           }
@@ -595,7 +595,7 @@ public class WsPreferences extends GWsPreferences
           if (lastrefresh != update)
           {
             lastrefresh = update;
-            Desktop.instance.startServiceDiscovery(true); // wait around for all
+            Desktop.getInstance().startServiceDiscovery(true); // wait around for all
                                                           // threads to complete
             updateList();
 
@@ -616,15 +616,15 @@ public class WsPreferences extends GWsPreferences
         public void run()
         {
           long ct = System.currentTimeMillis();
-          Desktop.instance.setProgressBar(MessageManager
+          Desktop.getInstance().setProgressBar(MessageManager
                   .getString("status.refreshing_web_service_menus"), ct);
           if (lastrefresh != update)
           {
             lastrefresh = update;
-            Desktop.instance.startServiceDiscovery(true);
+            Desktop.getInstance().startServiceDiscovery(true);
             updateList();
           }
-          Desktop.instance.setProgressBar(null, ct);
+          Desktop.getInstance().setProgressBar(null, ct);
         }
 
       }).start();
@@ -646,8 +646,8 @@ public class WsPreferences extends GWsPreferences
   @Override
   protected void resetWs_actionPerformed(ActionEvent e)
   {
-    Jws2Discoverer.getDiscoverer().setServiceUrls(null);
-    List<String> nwsUrls = Jws2Discoverer.getDiscoverer().getServiceUrls();
+    Jws2Discoverer.getInstance().setServiceUrls(null);
+    List<String> nwsUrls = Jws2Discoverer.getInstance().getServiceUrls();
     if (!wsUrls.equals(nwsUrls))
     {
       update++;
index a18d38d..f2daf2b 100644 (file)
@@ -20,6 +20,8 @@
  */
 package jalview.httpserver;
 
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
 import jalview.rest.RestHandler;
 
 import java.net.BindException;
@@ -49,7 +51,7 @@ import org.eclipse.jetty.util.thread.QueuedThreadPool;
  * @author gmcarstairs
  * @see http://eclipse.org/jetty/documentation/current/embedding-jetty.html
  */
-public class HttpServer
+public class HttpServer implements ApplicationSingletonI
 {
   /*
    * 'context root' - actually just prefixed to the path for each handler for
@@ -58,11 +60,6 @@ public class HttpServer
   private static final String JALVIEW_PATH = "jalview";
 
   /*
-   * Singleton instance of this server
-   */
-  private static HttpServer instance;
-
-  /*
    * The Http server
    */
   private Server server;
@@ -75,7 +72,7 @@ public class HttpServer
   /*
    * Lookup of ContextHandler by its wrapped handler
    */
-  Map<Handler, ContextHandler> myHandlers = new HashMap<Handler, ContextHandler>();
+  Map<Handler, ContextHandler> myHandlers = new HashMap<>();
 
   /*
    * The context root for the server
@@ -92,22 +89,20 @@ public class HttpServer
   {
     synchronized (HttpServer.class)
     {
-      if (instance == null)
-      {
-        instance = new HttpServer();
-      }
-      return instance;
+      return (HttpServer) ApplicationSingletonProvider.getInstance(HttpServer.class);
     }
   }
 
   /**
-   * Private constructor to enforce use of singleton
+   * Private constructor to enforce use of singleton; use getInstance().
    * 
    * @throws BindException
    *           if no free port can be assigned
    */
   private HttpServer() throws BindException
   {
+    // use getInstance()
+
     startServer();
 
     /*
index cea2870..c2cf667 100755 (executable)
@@ -323,14 +323,15 @@ public abstract class AlignFile extends FileParse
    */
   protected void initData()
   {
-    seqs = new Vector<SequenceI>();
-    annotations = new Vector<AlignmentAnnotation>();
-    seqGroups = new ArrayList<SequenceGroup>();
+    seqs = new Vector<>();
+    annotations = new Vector<>();
+    seqGroups = new ArrayList<>();
     parseCalled = false;
   }
 
   /**
-   * DOCUMENT ME!
+   * Create the seqs Vector from a set of parsed sequences in an AlignFile,
+   * FeaturesFile, RnamlFile, or StockholmFile.
    * 
    * @param s
    *          DOCUMENT ME!
@@ -338,7 +339,7 @@ public abstract class AlignFile extends FileParse
   @Override
   public void setSeqs(SequenceI[] s)
   {
-    seqs = new Vector<SequenceI>();
+    seqs = new Vector<>();
 
     for (int i = 0; i < s.length; i++)
     {
@@ -409,7 +410,7 @@ public abstract class AlignFile extends FileParse
   {
     if (newickStrings == null)
     {
-      newickStrings = new Vector<String[]>();
+      newickStrings = new Vector<>();
     }
     newickStrings.addElement(new String[] { treeName, newickString });
   }
index f0f1ca3..02667c5 100755 (executable)
@@ -274,7 +274,7 @@ public class AnnotationFile
           if (row.graphGroup > -1)
           {
             graphGroupSeen.set(row.graphGroup);
-            Integer key = Integer.valueOf(row.graphGroup);
+            Integer key = new Integer(row.graphGroup);
             if (graphGroup.containsKey(key))
             {
               graphGroup.put(key, graphGroup.get(key) + "\t" + row.label);
@@ -762,7 +762,7 @@ public class AnnotationFile
                       autoAnnotsKey(aa[aai], aa[aai].sequenceRef,
                               (aa[aai].groupRef == null ? null
                                       : aa[aai].groupRef.getName())),
-                      Integer.valueOf(1));
+                      new Integer(1));
             }
           }
         }
@@ -1271,7 +1271,7 @@ public class AnnotationFile
         {
           displayChar = token;
           // foo
-          value = Float.valueOf(token).floatValue();
+          value = new Float(token).floatValue();
           parsedValue = true;
           continue;
         } catch (NumberFormatException ex)
index 1504404..4f93ece 100644 (file)
@@ -1,5 +1,7 @@
 package jalview.io;
 
+import jalview.bin.Cache;
+
 import java.io.File;
 
 public class BackupFilenameParts
@@ -111,9 +113,7 @@ public class BackupFilenameParts
           String filename, String base, boolean extensionMatch)
   {
     BackupFilenameParts bfp = new BackupFilenameParts();
-    BackupFilesPresetEntry bfpe = BackupFilesPresetEntry
-            .getSavedBackupEntry();
-    String template = bfpe.suffix;
+    String template = Cache.getDefault(BackupFiles.SUFFIX, null);
     if (template == null)
     {
       return bfp;
@@ -121,7 +121,8 @@ public class BackupFilenameParts
     int digits;
     try
     {
-      digits = bfpe.digits;
+      digits = Integer
+              .parseInt(Cache.getDefault(BackupFiles.SUFFIX_DIGITS, null));
     } catch (Exception e)
     {
       return bfp;
index 06c2fc9..c697a99 100644 (file)
@@ -18,8 +18,12 @@ import java.util.TreeMap;
  * BackupFiles used for manipulating (naming rolling/deleting) backup/version files when an alignment or project file is saved.
  * User configurable options are:
  * BACKUPFILES_ENABLED - boolean flag as to whether to use this mechanism or act as before, including overwriting files as saved.
- * The rest of the options are now saved as BACKUPFILES_PRESET, BACKUPFILES_SAVED and BACKUPFILES_CUSTOM
- * (see BackupFilesPresetEntry)
+ * BACKUPFILES_SUFFIX - a template to insert after the file extension.  Use '%n' to be replaced by a 0-led SUFFIX_DIGITS long integer.
+ * BACKUPFILES_NO_MAX - flag to turn off setting a maximum number of backup files to keep.
+ * BACKUPFILES_ROLL_MAX - the maximum number of backupfiles to keep for any one alignment or project file.
+ * BACKUPFILES_SUFFIX_DIGITS - the number of digits to insert replace %n with (e.g. BACKUPFILES_SUFFIX_DIGITS = 3 would make "001", "002", etc)
+ * BACKUPFILES_REVERSE_ORDER - if true then "logfile" style numbering and file rolling will occur. If false then ever-increasing version numbering will occur, but old files will still be deleted if there are more than ROLL_MAX backup files. 
+ * BACKUPFILES_CONFIRM_DELETE_OLD - if true then prompt/confirm with the user when deleting older backup/version files.
  */
 
 public class BackupFiles
@@ -30,8 +34,21 @@ public class BackupFiles
 
   public static final String ENABLED = NS + "_ENABLED";
 
+  public static final String SUFFIX = NS + "_SUFFIX";
+
+  public static final String NO_MAX = NS + "_NO_MAX";
+
+  public static final String ROLL_MAX = NS + "_ROLL_MAX";
+
+  public static final String SUFFIX_DIGITS = NS + "_SUFFIX_DIGITS";
+
   public static final String NUM_PLACEHOLDER = "%n";
 
+  public static final String REVERSE_ORDER = NS + "_REVERSE_ORDER";
+
+  public static final String CONFIRM_DELETE_OLD = NS
+          + "_CONFIRM_DELETE_OLD";
+
   private static final String DEFAULT_TEMP_FILE = "jalview_temp_file_" + NS;
 
   private static final String TEMP_FILE_EXT = ".tmp";
@@ -85,14 +102,20 @@ public class BackupFiles
   // REVERSE_ORDER
   public BackupFiles(File file)
   {
+    this(file, ".bak" + NUM_PLACEHOLDER, false, 3, 3, false);
+  }
+
+  public BackupFiles(File file, String defaultSuffix, boolean defaultNoMax,
+          int defaultMax, int defaultDigits, boolean defaultReverseOrder)
+  {
     classInit();
     this.file = file;
-    BackupFilesPresetEntry bfpe = BackupFilesPresetEntry.getSavedBackupEntry();
-    this.suffix = bfpe.suffix;
-    this.noMax = bfpe.keepAll;
-    this.max = bfpe.rollMax;
-    this.digits = bfpe.digits;
-    this.reverseOrder = bfpe.reverse;
+    this.suffix = Cache.getDefault(SUFFIX, defaultSuffix);
+    this.noMax = Cache.getDefault(NO_MAX, defaultNoMax);
+    this.max = Cache.getDefault(ROLL_MAX, defaultMax);
+    this.digits = Cache.getDefault(SUFFIX_DIGITS, defaultDigits);
+    this.reverseOrder = Cache.getDefault(REVERSE_ORDER,
+            defaultReverseOrder);
 
     // create a temp file to save new data in
     File temp = null;
@@ -123,9 +146,7 @@ public class BackupFiles
   public static void classInit()
   {
     setEnabled(Cache.getDefault(ENABLED, !Platform.isJS()));
-    BackupFilesPresetEntry bfpe = BackupFilesPresetEntry
-            .getSavedBackupEntry();
-    setConfirmDelete(bfpe.confirmDelete);
+    setConfirmDelete(Cache.getDefault(CONFIRM_DELETE_OLD, true));
   }
 
   public static void setEnabled(boolean flag)
@@ -518,7 +539,7 @@ public class BackupFiles
           MessageManager.getString("label.delete"),
           MessageManager.getString("label.rename") };
 
-      confirmButton = JvOptionPane.showOptionDialog(Desktop.desktop,
+      confirmButton = JvOptionPane.showOptionDialog(Desktop.getDesktopPane(),
               messageSB.toString(),
               MessageManager.getString("label.backupfiles_confirm_delete"),
               JvOptionPane.YES_NO_OPTION, JvOptionPane.WARNING_MESSAGE,
@@ -538,7 +559,7 @@ public class BackupFiles
           MessageManager.getString("label.delete"),
           MessageManager.getString("label.keep") };
 
-      confirmButton = JvOptionPane.showOptionDialog(Desktop.desktop,
+      confirmButton = JvOptionPane.showOptionDialog(Desktop.getDesktopPane(),
               messageSB.toString(),
               MessageManager.getString("label.backupfiles_confirm_delete"),
               JvOptionPane.YES_NO_OPTION, JvOptionPane.WARNING_MESSAGE,
@@ -573,7 +594,7 @@ public class BackupFiles
                       Long.toString(df.length()) }));
         }
 
-        int confirmButton = JvOptionPane.showConfirmDialog(Desktop.desktop,
+        int confirmButton = JvOptionPane.showConfirmDialog(Desktop.getDesktopPane(),
                 messageSB.toString(),
                 MessageManager
                         .getString("label.backupfiles_confirm_delete"),
@@ -662,7 +683,7 @@ public class BackupFiles
                 "label.backupfiles_confirm_save_new_saved_file_not_ok"));
       }
 
-      int confirmButton = JvOptionPane.showConfirmDialog(Desktop.desktop,
+      int confirmButton = JvOptionPane.showConfirmDialog(Desktop.getDesktopPane(),
               messageSB.toString(),
               MessageManager
                       .getString("label.backupfiles_confirm_save_file"),
diff --git a/src/jalview/io/BackupFilesPresetEntry.java b/src/jalview/io/BackupFilesPresetEntry.java
deleted file mode 100644 (file)
index 4face29..0000000
+++ /dev/null
@@ -1,173 +0,0 @@
-package jalview.io;
-
-import jalview.bin.Cache;
-import jalview.util.MessageManager;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.StringTokenizer;
-
-public class BackupFilesPresetEntry
-{
-
-  public String suffix;
-
-  public static final int DIGITSMIN = 1;
-
-  public static final int DIGITSMAX = 6;
-
-  public int digits;
-
-  public boolean reverse;
-
-  public boolean keepAll;
-
-  public static final int ROLLMAXMIN = 1;
-
-  public static final int ROLLMAXMAX = 999;
-
-  public int rollMax;
-
-  public boolean confirmDelete;
-
-  public static final String SAVEDCONFIG = BackupFiles.NS + "_SAVED";
-
-  public static final String CUSTOMCONFIG = BackupFiles.NS + "_CUSTOM";
-
-  private static final String stringDelim = "\t";
-
-  public static final int BACKUPFILESSCHEMECUSTOM = 0;
-
-  public static final int BACKUPFILESSCHEMEDEFAULT = 1;
-
-  public BackupFilesPresetEntry(String suffix, int digits, boolean reverse,
-          boolean keepAll, int rollMax, boolean confirmDelete)
-  {
-    this.suffix = suffix == null ? "" : suffix;
-    this.digits = digits < DIGITSMIN ? DIGITSMIN
-            : (digits > DIGITSMAX ? DIGITSMAX : digits);
-    this.reverse = reverse;
-    this.keepAll = keepAll;
-    this.rollMax = rollMax < ROLLMAXMIN ? ROLLMAXMIN
-            : (rollMax > ROLLMAXMAX ? ROLLMAXMAX : rollMax);
-    this.confirmDelete = confirmDelete;
-  }
-
-  public boolean equals(BackupFilesPresetEntry compare)
-  {
-    return suffix.equals(compare.suffix) && digits == compare.digits
-            && reverse == compare.reverse && keepAll == compare.keepAll
-            && rollMax == compare.rollMax
-            && confirmDelete == compare.confirmDelete;
-  }
-
-  @Override
-  public String toString()
-  {
-    StringBuilder sb = new StringBuilder();
-    sb.append(suffix);
-    sb.append(stringDelim);
-    sb.append(digits);
-    sb.append(stringDelim);
-    sb.append(reverse);
-    sb.append(stringDelim);
-    sb.append(keepAll);
-    sb.append(stringDelim);
-    sb.append(rollMax);
-    sb.append(stringDelim);
-    sb.append(confirmDelete);
-    return sb.toString();
-  }
-
-  public static BackupFilesPresetEntry createBackupFilesPresetEntry(
-          String line)
-  {
-    if (line == null)
-    {
-      return null;
-    }
-    StringTokenizer st = new StringTokenizer(line, stringDelim);
-    String suffix = null;
-    int digits = 0;
-    boolean reverse = false;
-    boolean keepAll = false;
-    int rollMax = 0;
-    boolean confirmDelete = false;
-
-    try
-    {
-      suffix = st.nextToken();
-      digits = Integer.valueOf(st.nextToken());
-      reverse = Boolean.valueOf(st.nextToken());
-      keepAll = Boolean.valueOf(st.nextToken());
-      rollMax = Integer.valueOf(st.nextToken());
-      confirmDelete = Boolean.valueOf(st.nextToken());
-    } catch (Exception e)
-    {
-      Cache.log.error("Error parsing backupfiles scheme '" + line + "'");
-    }
-
-    return new BackupFilesPresetEntry(suffix, digits, reverse, keepAll,
-            rollMax, confirmDelete);
-  }
-
-  public static BackupFilesPresetEntry getSavedBackupEntry()
-  {
-    String savedPresetString = Cache
-            .getDefault(BackupFilesPresetEntry.SAVEDCONFIG, null);
-    BackupFilesPresetEntry savedPreset = BackupFilesPresetEntry
-            .createBackupFilesPresetEntry(savedPresetString);
-    if (savedPreset == null)
-    {
-      savedPreset = backupfilesPresetEntriesValues
-              .get(BACKUPFILESSCHEMEDEFAULT);
-    }
-    return savedPreset;
-  }
-
-  public static final IntKeyStringValueEntry[] backupfilesPresetEntries = {
-      new IntKeyStringValueEntry(BACKUPFILESSCHEMEDEFAULT,
-              MessageManager.getString("label.default")),
-      new IntKeyStringValueEntry(2,
-              MessageManager.getString("label.single_file")),
-      new IntKeyStringValueEntry(3,
-              MessageManager.getString("label.keep_all_versions")),
-      new IntKeyStringValueEntry(4,
-              MessageManager.getString("label.rolled_backups")),
-      // ...
-      // IMPORTANT, keep "Custom" entry with key 0 (even though it appears last)
-      new IntKeyStringValueEntry(BACKUPFILESSCHEMECUSTOM,
-              MessageManager.getString("label.custom")) };
-
-  public static final String[] backupfilesPresetEntryDescriptions = {
-      MessageManager.getString("label.default_description"),
-      MessageManager.getString("label.single_file_description"),
-      MessageManager.getString("label.keep_all_versions_description"),
-      MessageManager.getString("label.rolled_backups_description"),
-      MessageManager.getString("label.custom_description") };
-
-  public static final Map<Integer, BackupFilesPresetEntry> backupfilesPresetEntriesValues = new HashMap<Integer, BackupFilesPresetEntry>()
-  {
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 125L;
-
-    {
-      put(1, new BackupFilesPresetEntry(
-              ".bak" + BackupFiles.NUM_PLACEHOLDER, 3, false, false, 3,
-              false));
-      put(2, new BackupFilesPresetEntry("~", 1, false, false, 1, false));
-      put(3, new BackupFilesPresetEntry(".v" + BackupFiles.NUM_PLACEHOLDER,
-              3, false, true, 10, true));
-      put(4, new BackupFilesPresetEntry(
-              "_bak." + BackupFiles.NUM_PLACEHOLDER, 1, true, false, 9,
-              false));
-
-      // This gets replaced by GPreferences
-      put(BACKUPFILESSCHEMECUSTOM,
-              new BackupFilesPresetEntry("", 0, false, false, 0, false));
-    }
-  };
-
-}
index 5f68099..aa21b0f 100755 (executable)
@@ -441,7 +441,7 @@ public class FeaturesFile extends AlignFile implements FeaturesSourceI
       float score = Float.NaN;
       try
       {
-        score = Float.valueOf(gffColumns[6]).floatValue();
+        score = new Float(gffColumns[6]).floatValue();
       } catch (NumberFormatException ex)
       {
         sf = new SequenceFeature(ft, desc, startPos, endPos, featureGroup);
@@ -829,14 +829,15 @@ public class FeaturesFile extends AlignFile implements FeaturesSourceI
     AlignViewportI av = getViewport();
     if (av != null)
     {
-      if (av.getAlignment() != null)
+      AlignmentI a = av.getAlignment();
+      if (a != null)
       {
-        dataset = av.getAlignment().getDataset();
+        dataset = a.getDataset();
       }
       if (dataset == null)
       {
         // working in the applet context ?
-        dataset = av.getAlignment();
+        dataset = a;
       }
     }
     else
@@ -890,7 +891,8 @@ public class FeaturesFile extends AlignFile implements FeaturesSourceI
 
     StringBuilder out = new StringBuilder(256);
 
-    out.append(String.format("%s %d\n", GFF_VERSION, gffVersion == 0 ? 2 : gffVersion));
+    out.append(String.format("%s %d" + newline, GFF_VERSION,
+            gffVersion == 0 ? 2 : gffVersion));
 
     if (!includeNonPositionalFeatures
             && (visibleColours == null || visibleColours.isEmpty()))
index aadcdb9..e83b87c 100644 (file)
@@ -20,6 +20,9 @@
  */
 package jalview.io;
 
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
+
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
@@ -36,23 +39,11 @@ import java.util.Set;
  * @author gmcarstairs
  *
  */
-public class FileFormats
+public class FileFormats implements ApplicationSingletonI
 {
-  private static FileFormats instance = new FileFormats();
-
-  /*
-   * A lookup map of file formats by upper-cased name
-   */
-  private static Map<String, FileFormatI> formats;
-
-  /*
-   * Formats in this set are capable of being identified by IdentifyFile 
-   */
-  private static Set<FileFormatI> identifiable;
-
   public static FileFormats getInstance()
   {
-    return instance;
+    return (FileFormats) ApplicationSingletonProvider.getInstance(FileFormats.class);
   }
 
   /**
@@ -63,6 +54,16 @@ public class FileFormats
     reset();
   }
 
+  /*
+   * A lookup map of file formats by upper-cased name
+   */
+  private Map<String, FileFormatI> formats;
+
+  /*
+   * Formats in this set are capable of being identified by IdentifyFile 
+   */
+  private Set<FileFormatI> identifiable;
+
   /**
    * Reset to just the built-in file formats packaged with Jalview. These are
    * added (and will be shown in menus) in the order of their declaration in the
@@ -70,8 +71,8 @@ public class FileFormats
    */
   public synchronized void reset()
   {
-    formats = new LinkedHashMap<String, FileFormatI>();
-    identifiable = new HashSet<FileFormatI>();
+    formats = new LinkedHashMap<>();
+    identifiable = new HashSet<>();
     for (FileFormat format : FileFormat.values())
     {
       registerFileFormat(format, format.isIdentifiable());
@@ -135,7 +136,7 @@ public class FileFormats
    */
   public List<String> getWritableFormats(boolean textOnly)
   {
-    List<String> l = new ArrayList<String>();
+    List<String> l = new ArrayList<>();
     for (FileFormatI ff : formats.values())
     {
       if (ff.isWritable() && (!textOnly || ff.isTextFormat()))
@@ -154,7 +155,7 @@ public class FileFormats
    */
   public List<String> getReadableFormats()
   {
-    List<String> l = new ArrayList<String>();
+    List<String> l = new ArrayList<>();
     for (FileFormatI ff : formats.values())
     {
       if (ff.isReadable())
index 95f85e6..3585c93 100755 (executable)
@@ -37,7 +37,6 @@ import jalview.gui.JvOptionPane;
 import jalview.json.binding.biojson.v1.ColourSchemeMapper;
 import jalview.project.Jalview2XML;
 import jalview.schemes.ColourSchemeI;
-import jalview.structure.StructureSelectionManager;
 import jalview.util.MessageManager;
 import jalview.util.Platform;
 import jalview.ws.utils.UrlDownloadClient;
@@ -56,16 +55,35 @@ import javax.swing.SwingUtilities;
 
 public class FileLoader implements Runnable
 {
+  private File selectedFile;
+
   String file;
 
   DataSourceType protocol;
 
   FileFormatI format;
 
-  AlignmentFileReaderI source = null; // alternative specification of where data
-                                      // comes
+  AlignmentFileReaderI source; // alternative specification of where data
+                               // comes from
 
-  // from
+  /**
+   * It is critical that all these fields are set, as this instance is reused.
+   * 
+   * @param source
+   * @param file
+   * @param inFile
+   * @param dataSourceType
+   * @param format
+   */
+  private void setFileFields(AlignmentFileReaderI source, File file,
+          String inFile, DataSourceType dataSourceType, FileFormatI format)
+  {
+    this.source = source;
+    this.file = inFile;
+    this.selectedFile = file;
+    this.protocol = dataSourceType;
+    this.format = format;
+  }
 
   AlignViewport viewport;
 
@@ -77,8 +95,6 @@ public class FileLoader implements Runnable
 
   boolean raiseGUI = true;
 
-  private File selectedFile;
-
   /**
    * default constructor always raised errors in GUI dialog boxes
    */
@@ -98,7 +114,7 @@ public class FileLoader implements Runnable
     this.raiseGUI = raiseGUI;
   }
 
-  public void LoadFile(AlignViewport viewport, Object file,
+  public void loadFile(AlignViewport viewport, Object file,
           DataSourceType protocol, FileFormatI format)
   {
     this.viewport = viewport;
@@ -106,10 +122,10 @@ public class FileLoader implements Runnable
       this.selectedFile = (File) file;
       file = selectedFile.getPath();
     }
-    LoadFile(file.toString(), protocol, format);
+    loadFile(file.toString(), protocol, format);
   }
 
-  public void LoadFile(String file, DataSourceType protocol,
+  public void loadFile(String file, DataSourceType protocol,
           FileFormatI format)
   {
     this.file = file;
@@ -136,7 +152,7 @@ public class FileLoader implements Runnable
    */
   public void LoadFile(String file, DataSourceType protocol)
   {
-    LoadFile(file, protocol, null);
+    loadFile(file, protocol, null);
   }
 
   /**
@@ -149,7 +165,7 @@ public class FileLoader implements Runnable
   public AlignFrame LoadFileWaitTillLoaded(String file,
           DataSourceType sourceType)
   {
-    return LoadFileWaitTillLoaded(file, sourceType, null);
+    return loadFileWaitTillLoaded(file, sourceType, null);
   }
 
   /**
@@ -160,13 +176,11 @@ public class FileLoader implements Runnable
    * @param format
    * @return alignFrame constructed from file contents
    */
-  public AlignFrame LoadFileWaitTillLoaded(String file,
+  public AlignFrame loadFileWaitTillLoaded(String file,
           DataSourceType sourceType, FileFormatI format)
   {
-    this.file = file;
-    this.protocol = sourceType;
-    this.format = format;
-    return _LoadFileWaitTillLoaded();
+    setFileFields(null, null, file, sourceType, format);
+    return _loadFileWaitTillLoaded();
   }
 
   /**
@@ -177,14 +191,11 @@ public class FileLoader implements Runnable
    * @param format
    * @return alignFrame constructed from file contents
    */
-  public AlignFrame LoadFileWaitTillLoaded(File file,
+  public AlignFrame loadFileWaitTillLoaded(File file,
           DataSourceType sourceType, FileFormatI format)
   {
-    this.selectedFile = file;
-    this.file = file.getPath();
-    this.protocol = sourceType;
-    this.format = format;
-    return _LoadFileWaitTillLoaded();
+    setFileFields(null, file, null, sourceType, format);
+    return _loadFileWaitTillLoaded();
   }
 
   /**
@@ -194,15 +205,12 @@ public class FileLoader implements Runnable
    * @param format
    * @return alignFrame constructed from file contents
    */
-  public AlignFrame LoadFileWaitTillLoaded(AlignmentFileReaderI source,
+  public AlignFrame loadFileWaitTillLoaded(AlignmentFileReaderI source,
           FileFormatI format)
   {
-    this.source = source;
-
-    file = source.getInFile();
-    protocol = source.getDataSourceType();
-    this.format = format;
-    return _LoadFileWaitTillLoaded();
+    setFileFields(source, null, source.getInFile(),
+            source.getDataSourceType(), format);
+    return _loadFileWaitTillLoaded();
   }
 
   /**
@@ -211,7 +219,7 @@ public class FileLoader implements Runnable
    * 
    * @return
    */
-  protected AlignFrame _LoadFileWaitTillLoaded()
+  private AlignFrame _loadFileWaitTillLoaded()
   {
     this.run();
     return alignFrame;
@@ -278,9 +286,9 @@ public class FileLoader implements Runnable
     Runtime rt = Runtime.getRuntime();
     try
     {
-      if (Desktop.instance != null)
+      if (Desktop.getInstance() != null)
       {
-        Desktop.instance.startLoading(file);
+        Desktop.getInstance().startLoading(file);
       }
       if (format == null)
       {
@@ -302,12 +310,12 @@ public class FileLoader implements Runnable
 
       if (format == null)
       {
-        Desktop.instance.stopLoading();
+        Desktop.getInstance().stopLoading();
         System.err.println("The input file \"" + file
                 + "\" has null or unidentifiable data content!");
         if (!Jalview.isHeadlessMode())
         {
-          JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+          JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
                   MessageManager.getString("label.couldnt_read_data")
                           + " in " + file + "\n"
                           + AppletFormatAdapter.getSupportedFormats(),
@@ -318,7 +326,7 @@ public class FileLoader implements Runnable
       }
       // TODO: cache any stream datasources as a temporary file (eg. PDBs
       // retrieved via URL)
-      if (Desktop.desktop != null && Desktop.desktop.isShowMemoryUsage())
+      if (Desktop.getDesktopPane() != null && Desktop.getDesktopPane().isShowMemoryUsage())
       {
         System.gc();
         memused = (rt.maxMemory() - rt.totalMemory() + rt.freeMemory()); // free
@@ -339,7 +347,10 @@ public class FileLoader implements Runnable
           // We read the data anyway - it might make sense.
         }
         // BH 2018 switch to File object here instead of filename
+        Platform.timeCheck(null, Platform.TIME_MARK);
         alignFrame = new Jalview2XML(raiseGUI).loadJalviewAlign(selectedFile == null ? file : selectedFile);
+        Platform.timeCheck("JVP loaded", Platform.TIME_MARK);
+
       }
       else
       {
@@ -361,15 +372,15 @@ public class FileLoader implements Runnable
             if (downloadStructureFile)
             {
               String structExt = format.getExtensions().split(",")[0];
-              String urlLeafName = file.substring(
-                      file.lastIndexOf(
-                              System.getProperty("file.separator")),
+              int pt = file.lastIndexOf(file.indexOf('/') >= 0 ? "/"
+                      : System.getProperty("file.separator"));
+              String urlLeafName = file.substring(pt,
                       file.lastIndexOf("."));
               String tempStructureFileStr = createNamedJvTempFile(
                       urlLeafName, structExt);
               
               // BH - switching to File object here so as to hold
-              // ._bytes array directly
+              // .秘bytes array directly
               File tempFile = new File(tempStructureFileStr);
               UrlDownloadClient.download(file, tempFile);
               
@@ -410,8 +421,7 @@ public class FileLoader implements Runnable
               {
                 // register PDB entries with desktop's structure selection
                 // manager
-                StructureSelectionManager
-                        .getStructureSelectionManager(Desktop.instance)
+                Desktop.getStructureSelectionManager()
                         .registerPDBEntry(pdbe);
               }
             }
@@ -500,23 +510,23 @@ public class FileLoader implements Runnable
         }
         else
         {
-          if (Desktop.instance != null)
+          if (Desktop.getInstance() != null)
           {
-            Desktop.instance.stopLoading();
+            Desktop.getInstance().stopLoading();
           }
 
           final String errorMessage = MessageManager.getString(
                   "label.couldnt_load_file") + " " + title + "\n" + error;
           // TODO: refactor FileLoader to be independent of Desktop / Applet GUI
           // bits ?
-          if (raiseGUI && Desktop.desktop != null)
+          if (raiseGUI && Desktop.getDesktopPane() != null)
           {
             javax.swing.SwingUtilities.invokeLater(new Runnable()
             {
               @Override
               public void run()
               {
-                JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+                JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
                         errorMessage,
                         MessageManager
                                 .getString("label.error_loading_file"),
@@ -544,7 +554,7 @@ public class FileLoader implements Runnable
           @Override
           public void run()
           {
-            JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+            JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
                     MessageManager.formatMessage(
                             "label.problems_opening_file", new String[]
                             { file }),
@@ -566,7 +576,7 @@ public class FileLoader implements Runnable
           @Override
           public void run()
           {
-            JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+            JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
                     MessageManager.formatMessage(
                             "warn.out_of_memory_loading_file", new String[]
                             { file }),
@@ -588,7 +598,7 @@ public class FileLoader implements Runnable
     // memory
     // after
     // load
-    if (Desktop.desktop != null && Desktop.desktop.isShowMemoryUsage())
+    if (Desktop.getDesktopPane() != null && Desktop.getDesktopPane().isShowMemoryUsage())
     {
       if (alignFrame != null)
       {
@@ -610,9 +620,9 @@ public class FileLoader implements Runnable
       }
     }
     // remove the visual delay indicator
-    if (Desktop.instance != null)
+    if (Desktop.getInstance() != null)
     {
-      Desktop.instance.stopLoading();
+      Desktop.getInstance().stopLoading();
     }
 
   }
index 85cf48a..b0414af 100755 (executable)
@@ -30,6 +30,7 @@ import jalview.datamodel.HiddenColumns;
 import jalview.datamodel.Sequence;
 import jalview.datamodel.SequenceGroup;
 import jalview.datamodel.SequenceI;
+import jalview.gui.Preferences;
 import jalview.util.Comparison;
 
 import java.io.File;
@@ -63,13 +64,16 @@ public class FormatAdapter extends AppletFormatAdapter
 
   private void init()
   {
-    if (jalview.bin.Cache.getDefault("STRUCT_FROM_PDB", true))
+    if (jalview.bin.Cache.getDefault(Preferences.STRUCT_FROM_PDB, true))
     {
-      annotFromStructure = jalview.bin.Cache.getDefault("ADD_TEMPFACT_ANN",
+      annotFromStructure = jalview.bin.Cache.getDefault(
+              Preferences.ADD_TEMPFACT_ANN,
               true);
-      localSecondaryStruct = jalview.bin.Cache.getDefault("ADD_SS_ANN",
+      localSecondaryStruct = jalview.bin.Cache.getDefault(
+              Preferences.ADD_SS_ANN,
               true);
-      serviceSecondaryStruct = jalview.bin.Cache.getDefault("USE_RNAVIEW",
+      serviceSecondaryStruct = jalview.bin.Cache
+              .getDefault(Preferences.USE_RNAVIEW,
               true);
     }
     else
index 54e7e4b..e7054c7 100644 (file)
@@ -22,11 +22,13 @@ package jalview.io;
 
 import jalview.api.AlignExportSettingsI;
 import jalview.bin.Cache;
+import jalview.bin.Jalview;
 import jalview.datamodel.AlignExportSettingsAdapter;
 import jalview.datamodel.AlignmentExportData;
 import jalview.gui.AlignmentPanel;
 import jalview.gui.IProgressIndicator;
 import jalview.util.MessageManager;
+import jalview.util.Platform;
 
 import java.io.BufferedReader;
 import java.io.File;
@@ -231,7 +233,7 @@ public abstract class HTMLOutput implements Runnable
 
   protected void setProgressMessage(String message)
   {
-    if (pIndicator != null && !isHeadless())
+    if (pIndicator != null && !Jalview.isHeadlessMode())
     {
       pIndicator.setProgressBar(message, pSessionId);
     }
@@ -242,29 +244,17 @@ public abstract class HTMLOutput implements Runnable
   }
 
   /**
-   * Answers true if HTML export is invoke in headless mode or false otherwise
-   * 
-   * @return
-   */
-  protected boolean isHeadless()
-  {
-    return System.getProperty("java.awt.headless") != null
-            && System.getProperty("java.awt.headless").equals("true");
-  }
-
-  /**
    * This method provides implementation of consistent behaviour which should
    * occur after a HTML file export. It MUST be called at the end of the
    * exportHTML() method implementation.
    */
   protected void exportCompleted()
   {
-    if (isLaunchInBrowserAfterExport() && !isHeadless())
+    if (isLaunchInBrowserAfterExport() && !Jalview.isHeadlessMode())
     {
       try
       {
-        jalview.util.BrowserLauncher
-                .openURL("file:///" + getExportedFile());
+        Platform.openURL("file:///" + getExportedFile());
       } catch (IOException e)
       {
         e.printStackTrace();
index b8241c8..d4a4651 100644 (file)
@@ -21,6 +21,7 @@
 package jalview.io;
 
 import jalview.bin.Cache;
+import jalview.bin.Jalview;
 import jalview.gui.AlignmentPanel;
 import jalview.gui.LineartOptions;
 import jalview.gui.OOMWarning;
@@ -223,7 +224,8 @@ public class HtmlSvgOutput extends HTMLOutput
       /*
        * Prompt for character rendering style if preference is not set
        */
-      if (renderStyle.equalsIgnoreCase("Prompt each time") && !isHeadless())
+      if (renderStyle.equalsIgnoreCase("Prompt each time")
+              && !Jalview.isHeadlessMode())
       {
         LineartOptions svgOption = new LineartOptions("HTML", textOption);
         svgOption.setResponseAction(1, new Runnable()
index b312474..621cfac 100755 (executable)
@@ -151,7 +151,7 @@ public class IdentifyFile
         {
           for (int i = 0; !isBinary && i < data.length(); i++)
           {
-            char c = data.charAt(i);
+            int c = data.charAt(i);
             isBinary = (c < 32 && c != '\t' && c != '\n' && c != '\r'
                     && c != 5 && c != 27); // nominal binary character filter
             // excluding CR, LF, tab,DEL and ^E
@@ -165,11 +165,12 @@ public class IdentifyFile
           if (source.inFile != null)
           {
             String fileStr = source.inFile.getName();
-            if (fileStr.contains(".jar")
-                    || fileStr.contains(".zip") || fileStr.contains(".jvp"))
+            if (fileStr.contains(".jar") || fileStr.contains(".zip")
+                    || fileStr.contains(".jvp"))
             {
               // possibly a Jalview archive (but check further)
               reply = FileFormat.Jalview;
+              break;
             }
           }
           if (!lineswereskipped && data.startsWith("PK"))
diff --git a/src/jalview/io/IntKeyStringValueEntry.java b/src/jalview/io/IntKeyStringValueEntry.java
deleted file mode 100644 (file)
index 084dbc5..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-package jalview.io;
-
-public class IntKeyStringValueEntry
-{
-  public final int k;
-
-  public final String v;
-
-  public IntKeyStringValueEntry(int k, String v)
-  {
-    this.k = k;
-    this.v = v;
-  }
-
-  @Override
-  public String toString()
-  {
-    return v;
-  }
-
-}
index 6af92b7..e375df7 100755 (executable)
@@ -209,7 +209,7 @@ public class JPredFile extends AlignFile
           {
             ascore = symbols.nextToken();
 
-            Float score = Float.valueOf(ascore);
+            Float score = new Float(ascore);
             scores.addElement(score);
           }
 
@@ -285,7 +285,7 @@ public class JPredFile extends AlignFile
 
           seq_entries.addElement(newseq.toString());
           ids.addElement(id);
-          Symscores.put(id, Integer.valueOf(ids.size() - 1));
+          Symscores.put(id, new Integer(ids.size() - 1));
         }
       }
     }
index bc20342..cc63a22 100755 (executable)
@@ -21,7 +21,6 @@
 package jalview.io;
 
 import java.io.File;
-import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.Map;
@@ -31,8 +30,6 @@ import javax.swing.filechooser.FileFilter;
 
 public class JalviewFileFilter extends FileFilter
 {
-  public static Hashtable suffixHash = new Hashtable();
-
   private Map<String, JalviewFileFilter> filters = null;
 
   private String description = "no description";
@@ -136,8 +133,6 @@ public class JalviewFileFilter extends FileFilter
       {
         return filename.substring(i + 1).toLowerCase();
       }
-
-      ;
     }
 
     return "";
index 6828202..c9f1fcf 100755 (executable)
@@ -148,7 +148,7 @@ public class JnetAnnotationMaker
             {
               for (int j = 0; j < width; j++)
               {
-                float value = Float.valueOf(preds[i].getCharAt(j) + "")
+                float value = new Float(preds[i].getCharAt(j) + "")
                         .floatValue();
                 annotations[gapmap[j]] = new Annotation(
                         preds[i].getCharAt(j) + "", "",
@@ -159,7 +159,7 @@ public class JnetAnnotationMaker
             {
               for (int j = 0; j < width; j++)
               {
-                float value = Float.valueOf(preds[i].getCharAt(j) + "")
+                float value = new Float(preds[i].getCharAt(j) + "")
                         .floatValue();
                 annotations[gapmap[delMap[j]]] = new Annotation(
                         preds[i].getCharAt(j) + "", "",
index a56f2af..4a12387 100755 (executable)
@@ -22,6 +22,7 @@ package jalview.io;
 
 import jalview.datamodel.DBRefEntry;
 import jalview.datamodel.SequenceI;
+import jalview.util.Platform;
 
 import java.util.List;
 
@@ -90,17 +91,25 @@ public class ModellerDescription
 
     resCode(int v)
     {
-      val = Integer.valueOf(v);
+      val = new Integer(v);
       field = val.toString();
     }
   };
 
+  private static Regex VALIDATION_REGEX;
+
+  private static Regex getRegex()
+  {
+    return (VALIDATION_REGEX == null
+            ? VALIDATION_REGEX = Platform
+                    .newRegex("\\s*((([-0-9]+).?)|FIRST|LAST|@)", null)
+            : VALIDATION_REGEX);
+  }
+
   private resCode validResidueCode(String field)
   {
     Integer val = null;
-    Regex r = new Regex(
-            "\\s*((([-0-9]+).?)|FIRST|LAST|@)");
-
+    Regex r = getRegex();
     if (!r.search(field))
     {
       return null; // invalid
index f3eaa45..7596db4 100755 (executable)
@@ -28,6 +28,7 @@ package jalview.io;
 
 import jalview.datamodel.SequenceNode;
 import jalview.util.MessageManager;
+import jalview.util.Platform;
 
 import java.io.BufferedReader;
 import java.io.File;
@@ -37,6 +38,8 @@ import java.util.StringTokenizer;
 
 import com.stevesoft.pat.Regex;
 
+// TODO This class does not conform to Java standards for field name capitalization.
+
 /**
  * Parse a new hanpshire style tree Caveats: NHX files are NOT supported and the
  * tree distances and topology are unreliable when they are parsed. TODO: on
@@ -76,7 +79,7 @@ import com.stevesoft.pat.Regex;
  */
 public class NewickFile extends FileParse
 {
-  SequenceNode root;
+  private SequenceNode root;
 
   private boolean HasBootstrap = false;
 
@@ -85,21 +88,90 @@ public class NewickFile extends FileParse
   private boolean RootHasDistance = false;
 
   // File IO Flags
-  boolean ReplaceUnderscores = false;
+  private boolean ReplaceUnderscores = false;
+
+  private boolean printRootInfo = true;
+
+  private static final int REGEX_PERL_NODE_REQUIRE_QUOTE = 0;
+
+  private static final int REGEX_PERL_NODE_ESCAPE_QUOTE = 1;
+
+  private static final int REGEX_PERL_NODE_UNQUOTED_WHITESPACE = 2;
+
+  private static final int REGEX_MAJOR_SYMS = 3;
+
+  private static final int REGEX_QNODE_NAME = 4;
+
+  private static final int REGEX_COMMENT = 5;
+
+  private static final int REGEX_UQNODE_NAME = 6;
 
-  boolean printRootInfo = true;
+  private static final int REGEX_NBOOTSTRAP = 7;
+
+  private static final int REGEX_NDIST = 8;
+
+  private static final int REGEX_NO_LINES = 9;
+
+  private static final int REGEX_PERL_EXPAND_QUOTES = 10;
+
+  private static final int REGEX_MAX = 11;
+
+  private static final Regex[] REGEX = new Regex[REGEX_MAX];
+
+  private static Regex getRegex(int id)
+  {
+    if (REGEX[id] == null)
+    {
+      String code = null;
+      String code2 = null;
+      String codePerl = null;
+      switch (id)
+      {
+      case REGEX_PERL_NODE_REQUIRE_QUOTE:
+        codePerl = "m/[\\[,:'()]/";
+        break;
+      case REGEX_PERL_NODE_ESCAPE_QUOTE:
+        codePerl = "s/'/''/";
+        break;
+      case REGEX_PERL_NODE_UNQUOTED_WHITESPACE:
+        codePerl = "s/\\/w/_/";
+        break;
+      case REGEX_PERL_EXPAND_QUOTES:
+        codePerl = "s/''/'/";
+        break;
+      case REGEX_MAJOR_SYMS:
+        code = "[(\\['),;]";
+        break;
+      case REGEX_QNODE_NAME:
+        code = "'([^']|'')+'";
+        break;
+      case REGEX_COMMENT:
+        code = "]";
+        break;
+      case REGEX_UQNODE_NAME:
+        code = "\\b([^' :;\\](),]+)";
+        break;
+      case REGEX_NBOOTSTRAP:
+        code = "\\s*([0-9+]+)\\s*:";
+        break;
+      case REGEX_NDIST:
+        code = ":([-0-9Ee.+]+)";
+        break;
+      case REGEX_NO_LINES:
+        code = "\n+";
+        code2 = "";
+        break;
+      default:
+        return null;
+      }
+      return codePerl == null ? Platform.newRegex(code, code2)
+              : Platform.newRegexPerl(codePerl);
+    }
+    return REGEX[id];
+  }
 
-  private Regex[] NodeSafeName = new Regex[] {
-      new Regex().perlCode("m/[\\[,:'()]/"), // test for
-      // requiring
-      // quotes
-      new Regex().perlCode("s/'/''/"), // escaping quote
-      // characters
-      new Regex().perlCode("s/\\/w/_/") // unqoted whitespace
-      // transformation
-  };
 
-  char QuoteChar = '\'';
+  private char quoteChar = '\'';
 
   /**
    * Creates a new NewickFile object.
@@ -257,6 +329,7 @@ public class NewickFile extends FileParse
    */
   public void parse() throws IOException
   {
+    Platform.ensureRegex();
     String nf;
 
     { // fill nf with complete tree file
@@ -294,8 +367,7 @@ public class NewickFile extends FileParse
     boolean ascending = false; // flag indicating that we are leaving the
     // current node
 
-    Regex majorsyms = new Regex(
-            "[(\\['),;]");
+    Regex majorsyms = getRegex(REGEX_MAJOR_SYMS); // "[(\\['),;]"
 
     int nextcp = 0;
     int ncp = cp;
@@ -354,8 +426,7 @@ public class NewickFile extends FileParse
       // Deal with quoted fields
       case '\'':
 
-        Regex qnodename = new Regex(
-                "'([^']|'')+'");
+        Regex qnodename = getRegex(REGEX_QNODE_NAME);// "'([^']|'')+'");
 
         if (qnodename.searchFrom(nf, fcp))
         {
@@ -363,8 +434,7 @@ public class NewickFile extends FileParse
           nodename = new String(
                   qnodename.stringMatched().substring(1, nl - 1));
           // unpack any escaped colons
-          Regex xpandquotes = Regex
-                  .perlCode("s/''/'/");
+          Regex xpandquotes = getRegex(REGEX_PERL_EXPAND_QUOTES);
           String widernodename = xpandquotes.replaceAll(nodename);
           nodename = widernodename;
           // jump to after end of quoted nodename
@@ -398,8 +468,7 @@ public class NewickFile extends FileParse
            * '"+nf.substring(cp,fcp)+"'"); }
            */
           // verify termination.
-          Regex comment = new Regex(
-                  "]");
+          Regex comment = getRegex(REGEX_COMMENT); // "]"
           if (comment.searchFrom(nf, fcp))
           {
             // Skip the comment field
@@ -430,12 +499,9 @@ public class NewickFile extends FileParse
                   + fstring.substring(cend + 1);
 
         }
-        Regex uqnodename = new Regex(
-                "\\b([^' :;\\](),]+)");
-        Regex nbootstrap = new Regex(
-                "\\s*([0-9+]+)\\s*:");
-        Regex ndist = new Regex(
-                ":([-0-9Ee.+]+)");
+        Regex uqnodename = getRegex(REGEX_UQNODE_NAME);// "\\b([^' :;\\](),]+)"
+        Regex nbootstrap = getRegex(REGEX_NBOOTSTRAP);// "\\s*([0-9+]+)\\s*:");
+        Regex ndist = getRegex(REGEX_NDIST);// ":([-0-9Ee.+]+)");
 
         if (!parsednodename && uqnodename.search(fstring)
                 && ((uqnodename.matchedFrom(1) == 0) || (fstring
@@ -475,7 +541,7 @@ public class NewickFile extends FileParse
           {
             try
             {
-              bootstrap = (Integer.valueOf(nbootstrap.stringMatched(1)))
+              bootstrap = (new Integer(nbootstrap.stringMatched(1)))
                       .intValue();
               HasBootstrap = true;
             } catch (Exception e)
@@ -492,7 +558,7 @@ public class NewickFile extends FileParse
         {
           try
           {
-            distance = (Float.valueOf(ndist.stringMatched(1))).floatValue();
+            distance = (new Float(ndist.stringMatched(1))).floatValue();
             HasDistances = true;
             nodehasdistance = true;
           } catch (Exception e)
@@ -659,7 +725,7 @@ public class NewickFile extends FileParse
             if (code.toLowerCase().equals("b"))
             {
               int v = -1;
-              Float iv = Float.valueOf(value);
+              Float iv = new Float(value);
               v = iv.intValue(); // jalview only does integer bootstraps
               // currently
               c.setBootstrap(v);
@@ -790,7 +856,7 @@ public class NewickFile extends FileParse
    */
   char getQuoteChar()
   {
-    return QuoteChar;
+    return quoteChar;
   }
 
   /**
@@ -803,8 +869,8 @@ public class NewickFile extends FileParse
    */
   char setQuoteChar(char c)
   {
-    char old = QuoteChar;
-    QuoteChar = c;
+    char old = quoteChar;
+    quoteChar = c;
 
     return old;
   }
@@ -819,13 +885,15 @@ public class NewickFile extends FileParse
    */
   private String nodeName(String name)
   {
-    if (NodeSafeName[0].search(name))
+    if (getRegex(REGEX_PERL_NODE_REQUIRE_QUOTE).search(name))
     {
-      return QuoteChar + NodeSafeName[1].replaceAll(name) + QuoteChar;
+      return quoteChar
+              + getRegex(REGEX_PERL_NODE_ESCAPE_QUOTE).replaceAll(name)
+              + quoteChar;
     }
     else
     {
-      return NodeSafeName[2].replaceAll(name);
+      return getRegex(REGEX_PERL_NODE_UNQUOTED_WHITESPACE).replaceAll(name);
     }
   }
 
@@ -972,7 +1040,7 @@ public class NewickFile extends FileParse
       trf.parse();
       System.out.println("Original file :\n");
 
-      Regex nonl = new Regex("\n+", "");
+      Regex nonl = getRegex(REGEX_NO_LINES);// "\n+", "");
       System.out.println(nonl.replaceAll(newickfile.toString()) + "\n");
 
       System.out.println("Parsed file.\n");
index d9ed516..3f0fea0 100755 (executable)
  */
 package jalview.io;
 
+import jalview.bin.Cache;
 import jalview.datamodel.Sequence;
 import jalview.datamodel.SequenceI;
 import jalview.util.Comparison;
 
 import java.io.IOException;
-import java.util.Vector;
 
 public class PIRFile extends AlignFile
 {
-  public static boolean useModellerOutput = false;
-
-  Vector words = new Vector(); // Stores the words in a line after splitting
+  // Vector words = new Vector(); // Stores the words in a line after splitting
 
   public PIRFile()
   {
@@ -111,7 +109,7 @@ public class PIRFile extends AlignFile
     StringBuffer out = new StringBuffer();
     int i = 0;
     ModellerDescription md;
-
+    boolean useModellerOutput = Cache.getDefault("PIR_MODELLER", false);
     while ((i < s.length) && (s[i] != null))
     {
       String seq = s[i].getSequenceAsString();
@@ -147,7 +145,6 @@ public class PIRFile extends AlignFile
       }
       else
       {
-
         if (useModellerOutput)
         {
           out.append(">P1;" + s[i].getName());
index 4d3ddc1..d5a8d81 100644 (file)
@@ -26,6 +26,7 @@ import jalview.datamodel.Annotation;
 import jalview.datamodel.Sequence;
 import jalview.datamodel.SequenceI;
 import jalview.util.MessageManager;
+import jalview.util.Platform;
 
 import java.io.BufferedReader;
 import java.io.FileNotFoundException;
@@ -227,7 +228,7 @@ public class RnamlFile extends AlignFile
       dataName = dataName.substring(0, b - 1);
     }
     b = 0;
-    Regex m = new Regex("[\\/]?([-A-Za-z0-9]+)\\.?");
+    Regex m = getSafeRegex();
     String mm = dataName;
     while (m.searchFrom(dataName, b))
     {
@@ -236,4 +237,13 @@ public class RnamlFile extends AlignFile
     }
     return mm;
   }
+
+  private static Regex SAFE_REGEX;
+
+  private static Regex getSafeRegex()
+  {
+    return (SAFE_REGEX == null
+            ? SAFE_REGEX = Platform.newRegex("[\\/]?([-A-Za-z0-9]+)\\.?", null)
+            : SAFE_REGEX);
+  }
 }
index 84e629e..92f73f4 100644 (file)
@@ -36,6 +36,7 @@ import jalview.schemes.ResidueProperties;
 import jalview.util.Comparison;
 import jalview.util.Format;
 import jalview.util.MessageManager;
+import jalview.util.Platform;
 
 import java.io.BufferedReader;
 import java.io.FileReader;
@@ -76,20 +77,105 @@ public class StockholmFile extends AlignFile
 {
   private static final String ANNOTATION = "annotation";
 
-//  private static final Regex OPEN_PAREN = new Regex("(<|\\[)", "(");
-//
-//  private static final Regex CLOSE_PAREN = new Regex("(>|\\])", ")");
+  // WUSS extended symbols. Avoid ambiguity with protein SS annotations by using
+  // NOT_RNASS first.
 
-  public static final Regex DETECT_BRACKETS = new Regex(
-          "(<|>|\\[|\\]|\\(|\\)|\\{|\\})");
-
-  // WUSS extended symbols. Avoid ambiguity with protein SS annotations by using NOT_RNASS first.
   public static final String RNASS_BRACKETS = "<>[](){}AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz";
 
+  public static final int REGEX_STOCKHOLM = 0;
+
+  public static final int REGEX_BRACKETS = 1;
+
   // use the following regex to decide an annotations (whole) line is NOT an RNA
   // SS (it contains only E,H,e,h and other non-brace/non-alpha chars)
-  private static final Regex NOT_RNASS = new Regex(
-          "^[^<>[\\](){}A-DF-Za-df-z]*$");
+  public static final int REGEX_NOT_RNASS = 2;
+
+  private static final int REGEX_ANNOTATION = 3;
+
+  private static final int REGEX_PFAM = 4;
+
+  private static final int REGEX_RFAM = 5;
+
+  private static final int REGEX_ALIGN_END = 6;
+
+  private static final int REGEX_SPLIT_ID = 7;
+
+  private static final int REGEX_SUBTYPE = 8;
+
+  private static final int REGEX_ANNOTATION_LINE = 9;
+
+  private static final int REGEX_REMOVE_ID = 10;
+
+  private static final int REGEX_OPEN_PAREN = 11;
+
+  private static final int REGEX_CLOSE_PAREN = 12;
+
+  public static final int REGEX_MAX = 13;
+
+  private static Regex REGEX[] = new Regex[REGEX_MAX];
+
+  /**
+   * Centralize all actual Regex instantialization in Platform.
+   * 
+   * @param id
+   * @return
+   */
+  private static Regex getRegex(int id)
+  {
+    if (REGEX[id] == null)
+    {
+      String pat = null, pat2 = null;
+      switch (id)
+      {
+      case REGEX_STOCKHOLM:
+        pat = "# STOCKHOLM ([\\d\\.]+)";
+        break;
+      case REGEX_BRACKETS:
+        // for reference; not used
+        pat = "(<|>|\\[|\\]|\\(|\\)|\\{|\\})";
+        break;
+      case REGEX_NOT_RNASS:
+        pat = "^[^<>[\\](){}A-DF-Za-df-z]*$";
+        break;
+      case REGEX_ANNOTATION:
+        pat = "(\\w+)\\s*(.*)";
+        break;
+      case REGEX_PFAM:
+        pat = "PF[0-9]{5}(.*)";
+        break;
+      case REGEX_RFAM:
+        pat = "RF[0-9]{5}(.*)";
+        break;
+      case REGEX_ALIGN_END:
+        pat = "^\\s*\\/\\/";
+        break;
+      case REGEX_SPLIT_ID:
+        pat = "(\\S+)\\/(\\d+)\\-(\\d+)";
+        break;
+      case REGEX_SUBTYPE:
+        pat = "(\\S+)\\s+(\\S*)\\s+(.*)";
+        break;
+      case REGEX_ANNOTATION_LINE:
+        pat = "#=(G[FSRC]?)\\s+(.*)";
+        break;
+      case REGEX_REMOVE_ID:
+        pat = "(\\S+)\\s+(\\S+)";
+        break;
+      case REGEX_OPEN_PAREN:
+        pat = "(<|\\[)";
+        pat2 = "(";
+        break;
+      case REGEX_CLOSE_PAREN:
+        pat = "(>|\\])";
+        pat2 = ")";
+        break;
+      default:
+        return null;
+      }
+      REGEX[id] = Platform.newRegex(pat, pat2);
+    }
+    return REGEX[id];
+  }
 
   StringBuffer out; // output buffer
 
@@ -214,7 +300,7 @@ public class StockholmFile extends AlignFile
     // First, we have to check that this file has STOCKHOLM format, i.e. the
     // first line must match
 
-    r = new Regex("# STOCKHOLM ([\\d\\.]+)");
+    r = getRegex(REGEX_STOCKHOLM);
     if (!r.search(nextLine()))
     {
       throw new IOException(MessageManager
@@ -228,19 +314,22 @@ public class StockholmFile extends AlignFile
     }
 
     // We define some Regexes here that will be used regularily later
-    rend = new Regex("^\\s*\\/\\/"); // Find the end of an alignment
-    p = new Regex("(\\S+)\\/(\\d+)\\-(\\d+)"); // split sequence id in
+    rend = getRegex(REGEX_ALIGN_END);//"^\\s*\\/\\/"); // Find the end of an alignment
+    p = getRegex(REGEX_SPLIT_ID);//"(\\S+)\\/(\\d+)\\-(\\d+)"); // split sequence id in
     // id/from/to
-    s = new Regex("(\\S+)\\s+(\\S*)\\s+(.*)"); // Parses annotation subtype
-    r = new Regex("#=(G[FSRC]?)\\s+(.*)"); // Finds any annotation line
-    x = new Regex("(\\S+)\\s+(\\S+)"); // split id from sequence
+    s = getRegex(REGEX_SUBTYPE);// "(\\S+)\\s+(\\S*)\\s+(.*)"); // Parses
+                                // annotation subtype
+    r = getRegex(REGEX_ANNOTATION_LINE);// "#=(G[FSRC]?)\\s+(.*)"); // Finds any
+                                        // annotation line
+    x = getRegex(REGEX_REMOVE_ID);// "(\\S+)\\s+(\\S+)"); // split id from
+                                  // sequence
 
     // Convert all bracket types to parentheses (necessary for passing to VARNA)
-    Regex openparen = new Regex("(<|\\[)", "(");
-    Regex closeparen = new Regex("(>|\\])", ")");
+    Regex openparen = getRegex(REGEX_OPEN_PAREN);//"(<|\\[)", "(");
+    Regex closeparen = getRegex(REGEX_CLOSE_PAREN);//"(>|\\])", ")");
 
 //    // Detect if file is RNA by looking for bracket types
-//    Regex detectbrackets = new Regex("(<|>|\\[|\\]|\\(|\\))");
+    // Regex detectbrackets = getRegex("(<|>|\\[|\\]|\\(|\\))");
 
     rend.optimize();
     p.optimize();
@@ -262,8 +351,8 @@ public class StockholmFile extends AlignFile
         this.noSeqs = seqs.size();
 
         String dbsource = null;
-        Regex pf = new Regex("PF[0-9]{5}(.*)"); // Finds AC for Pfam
-        Regex rf = new Regex("RF[0-9]{5}(.*)"); // Finds AC for Rfam
+        Regex pf = getRegex(REGEX_PFAM); // Finds AC for Pfam
+        Regex rf = getRegex(REGEX_RFAM); // Finds AC for Rfam
         if (getAlignmentProperty("AC") != null)
         {
           String dbType = getAlignmentProperty("AC").toString();
@@ -507,7 +596,7 @@ public class StockholmFile extends AlignFile
            */
           // Let's save the annotations, maybe we'll be able to do something
           // with them later...
-          Regex an = new Regex("(\\w+)\\s*(.*)");
+          Regex an = getRegex(REGEX_ANNOTATION);
           if (an.search(annContent))
           {
             if (an.stringMatched(1).equals("NH"))
@@ -837,7 +926,8 @@ public class StockholmFile extends AlignFile
     if (type.equalsIgnoreCase("secondary structure"))
     {
       ss = true;
-      isrnass = !NOT_RNASS.search(annots); // sorry about the double negative
+      isrnass = !getRegex(REGEX_NOT_RNASS).search(annots); // sorry about the double
+                                                     // negative
                                            // here (it's easier for dealing with
                                            // other non-alpha-non-brace chars)
     }
@@ -998,7 +1088,7 @@ public class StockholmFile extends AlignFile
       while (en.hasMoreElements())
       {
         Object idd = en.nextElement();
-        String type = (String) dataRef.remove(idd);
+        String type = dataRef.remove(idd);
         out.append(new Format("%-" + (maxid - 2) + "s")
                 .form("#=GS " + idd.toString() + " "));
         if (type.contains("PFAM") || type.contains("RFAM"))
index 7e963d5..d069e5e 100644 (file)
@@ -109,7 +109,7 @@ public class TCoffeeScoreFile extends AlignFile
 
   public final static String TCOFFEE_SCORE = "TCoffeeScore";
 
-  static Pattern SCORES_WITH_RESIDUE_NUMS = Pattern
+  private final static Pattern SCORES_WITH_RESIDUE_NUMS = Pattern
           .compile("^\\d+\\s([^\\s]+)\\s+\\d+$");
 
   /** The {@link Header} structure holder */
@@ -198,7 +198,7 @@ public class TCoffeeScoreFile extends AlignFile
     {
       return null;
     }
-    List<String> result = new ArrayList<String>(scores.size());
+    List<String> result = new ArrayList<>(scores.size());
     for (Map.Entry<String, StringBuilder> it : scores.entrySet())
     {
       result.add(it.getValue().toString());
@@ -250,7 +250,7 @@ public class TCoffeeScoreFile extends AlignFile
       error = true;
       return;
     }
-    scores = new LinkedHashMap<String, StringBuilder>();
+    scores = new LinkedHashMap<>();
 
     /*
      * initilize the structure
@@ -503,7 +503,7 @@ public class TCoffeeScoreFile extends AlignFile
 
     int score;
 
-    LinkedHashMap<String, Integer> scores = new LinkedHashMap<String, Integer>();
+    LinkedHashMap<String, Integer> scores = new LinkedHashMap<>();
 
     public int getScoreAvg()
     {
@@ -530,7 +530,7 @@ public class TCoffeeScoreFile extends AlignFile
     public Block(int size)
     {
       this.size = size;
-      this.items = new HashMap<String, String>(size);
+      this.items = new HashMap<>(size);
     }
 
     String getScoresFor(String id)
index 387dbfa..84d31f0 100644 (file)
@@ -389,7 +389,6 @@ public class VamsasAppDatastore
         {
           dssmods.addElement(sequence);
         }
-        ;
       }
       if (dssmods.size() > 0)
       {
@@ -585,7 +584,6 @@ public class VamsasAppDatastore
                           (AlignmentSequence) alsref, aa[i]);
                   break;
                 }
-                ;
               }
             }
           }
@@ -720,9 +718,9 @@ public class VamsasAppDatastore
       // /SAVE THE TREES
       // /////////////////////////////////
       // FIND ANY ASSOCIATED TREES
-      if (Desktop.desktop != null)
+      if (Desktop.getDesktopPane() != null)
       {
-        javax.swing.JInternalFrame[] frames = Desktop.instance
+        javax.swing.JInternalFrame[] frames = Desktop.getInstance()
                 .getAllFrames();
 
         for (int t = 0; t < frames.length; t++)
@@ -1478,8 +1476,7 @@ public class VamsasAppDatastore
           // active
           if (mappings != null)
           {
-            jalview.structure.StructureSelectionManager
-                    .getStructureSelectionManager(Desktop.instance)
+            Desktop.getStructureSelectionManager()
                     .registerMappings(mappings);
           }
         }
@@ -2020,17 +2017,17 @@ public class VamsasAppDatastore
   }
 
   // bitfields - should be a template in j1.5
-  private static int HASSECSTR = 0;
+  private static final int HASSECSTR = 0;
 
-  private static int HASVALS = 1;
+  private static final int HASVALS = 1;
 
-  private static int HASHPHOB = 2;
+  private static final int HASHPHOB = 2;
 
-  private static int HASDC = 3;
+  private static final int HASDC = 3;
 
-  private static int HASDESCSTR = 4;
+  private static final int HASDESCSTR = 4;
 
-  private static int HASTWOSTATE = 5; // not used yet.
+  private static final int HASTWOSTATE = 5; // not used yet.
 
   /**
    * parses the AnnotationElements - if they exist - into
@@ -2248,7 +2245,7 @@ public class VamsasAppDatastore
           Float val = null;
           try
           {
-            val = Float.valueOf(props[p].getContent());
+            val = new Float(props[p].getContent());
           } catch (Exception e)
           {
             Cache.log.warn("Failed to parse threshold property");
@@ -2537,7 +2534,7 @@ public class VamsasAppDatastore
           int se_end = se[1 - se[2]] + (se[2] == 0 ? 1 : -1);
           for (int p = se[se[2]]; p != se_end; p += se[2] == 0 ? 1 : -1)
           {
-            posList.add(Integer.valueOf(p));
+            posList.add(new Integer(p));
           }
         }
       }
@@ -2548,7 +2545,7 @@ public class VamsasAppDatastore
         for (int p = 0, pSize = dseta.getPosCount(); p < pSize; p++)
         {
           pos = dseta.getPos(p).getI();
-          posList.add(Integer.valueOf(pos));
+          posList.add(new Integer(pos));
         }
       }
     }
index 63b78b2..e24c2f3 100755 (executable)
@@ -150,7 +150,7 @@ public class WSWUBlastClient
   {
     // This must be outside the run() body as java 1.5
     // will not return any value from the OptionPane to the expired thread.
-    int reply = JvOptionPane.showConfirmDialog(Desktop.desktop,
+    int reply = JvOptionPane.showConfirmDialog(Desktop.getDesktopPane(),
             "Automatically update suggested ids?",
             "Auto replace sequence ids", JvOptionPane.YES_NO_OPTION);
 
index eaf6ecd..2a254cc 100644 (file)
@@ -21,6 +21,8 @@
 package jalview.io.cache;
 
 import jalview.bin.Cache;
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
 
 import java.util.Hashtable;
 import java.util.LinkedHashSet;
@@ -28,26 +30,31 @@ import java.util.LinkedHashSet;
 /**
  * A singleton class used for querying and persisting cache items.
  * 
+ * 
  * @author tcnofoegbu
  *
  */
-public class AppCache
+public class AppCache implements ApplicationSingletonI
 {
+
+  public static AppCache getInstance()
+  {
+    return (AppCache) ApplicationSingletonProvider.getInstance(AppCache.class);
+  }
+
+  private AppCache()
+  {
+    cacheItems = new Hashtable<>();
+  }
+
   public static final String DEFAULT_LIMIT = "99";
 
   public static final String CACHE_DELIMITER = ";";
 
-  private static AppCache instance = null;
-
   private static final String DEFAULT_LIMIT_KEY = ".DEFAULT_LIMIT";
 
   private Hashtable<String, LinkedHashSet<String>> cacheItems;
 
-  private AppCache()
-  {
-    cacheItems = new Hashtable<String, LinkedHashSet<String>>();
-  }
-
   /**
    * Method to obtain all the cache items for a given cache key
    * 
@@ -59,27 +66,13 @@ public class AppCache
     LinkedHashSet<String> foundCache = cacheItems.get(cacheKey);
     if (foundCache == null)
     {
-      foundCache = new LinkedHashSet<String>();
+      foundCache = new LinkedHashSet<>();
       cacheItems.put(cacheKey, foundCache);
     }
     return foundCache;
   }
 
   /**
-   * Returns a singleton instance of AppCache
-   * 
-   * @return
-   */
-  public static AppCache getInstance()
-  {
-    if (instance == null)
-    {
-      instance = new AppCache();
-    }
-    return instance;
-  }
-
-  /**
    * Method for persisting cache items for a given cache key
    * 
    * @param cacheKey
index 9ec3a9f..e02a396 100644 (file)
@@ -237,65 +237,76 @@ public class JvCacheableInputBox<E>
       @Override
       public void run()
       {
-        int cacheLimit = Integer.parseInt(appCache.getCacheLimit(cacheKey));
-        String userInput = getUserInput();
-        if (userInput != null && !userInput.isEmpty())
-        {
-          LinkedHashSet<String> foundCache = appCache
-                  .getAllCachedItemsFor(cacheKey);
-          // remove old cache item so as to place current input at the top of
-          // the result
-          foundCache.remove(userInput);
-          foundCache.add(userInput);
-          appCache.putCache(cacheKey, foundCache);
-        }
+        updateCacheNow();
+      }
+    });
+  }
 
-        String lastSearch = userInput;
-        if (comboBox.getItemCount() > 0)
-        {
-          comboBox.removeAllItems();
-        }
-        Set<String> cacheItems = appCache.getAllCachedItemsFor(cacheKey);
-        List<String> reversedCacheItems = new ArrayList<>();
-        reversedCacheItems.addAll(cacheItems);
-        cacheItems = null;
-        Collections.reverse(reversedCacheItems);
-        if (lastSearch.isEmpty())
-        {
-          comboBox.addItem("");
-        }
+  /**
+   * For TestNG
+   * 
+   * @author Bob Hanson 2019.08.28
+   */
+  public void updateCacheNow()
+  {
+    int cacheLimit = Integer.parseInt(appCache.getCacheLimit(cacheKey));
+    String userInput = getUserInput();
+    if (userInput != null && !userInput.isEmpty())
+    {
+      LinkedHashSet<String> foundCache = appCache
+              .getAllCachedItemsFor(cacheKey);
+      // remove old cache item so as to place current input at the top of
+      // the result
+      foundCache.remove(userInput);
+      foundCache.add(userInput);
+      appCache.putCache(cacheKey, foundCache);
+    }
 
-        if (reversedCacheItems != null && !reversedCacheItems.isEmpty())
+    String lastSearch = userInput;
+    if (comboBox.getItemCount() > 0)
+    {
+      comboBox.removeAllItems();
+    }
+    Set<String> cacheItems = appCache.getAllCachedItemsFor(cacheKey);
+    List<String> reversedCacheItems = new ArrayList<>();
+    reversedCacheItems.addAll(cacheItems);
+    cacheItems = null;
+    Collections.reverse(reversedCacheItems);
+    if (lastSearch.isEmpty())
+    {
+      comboBox.addItem("");
+    }
+
+    if (reversedCacheItems != null && !reversedCacheItems.isEmpty())
+    {
+      LinkedHashSet<String> foundCache = appCache
+              .getAllCachedItemsFor(cacheKey);
+      boolean prune = reversedCacheItems.size() > cacheLimit;
+      int count = 1;
+      boolean limitExceeded = false;
+      for (String cacheItem : reversedCacheItems)
+      {
+        limitExceeded = (count++ > cacheLimit);
+        if (prune)
         {
-          LinkedHashSet<String> foundCache = appCache
-                  .getAllCachedItemsFor(cacheKey);
-          boolean prune = reversedCacheItems.size() > cacheLimit;
-          int count = 1;
-          boolean limitExceeded = false;
-          for (String cacheItem : reversedCacheItems)
+          if (limitExceeded)
           {
-            limitExceeded = (count++ > cacheLimit);
-            if (prune)
-            {
-              if (limitExceeded)
-              {
-                foundCache.remove(cacheItem);
-              }
-              else
-              {
-                comboBox.addItem(cacheItem);
-              }
-            }
-            else
-            {
-              comboBox.addItem(cacheItem);
-            }
+            foundCache.remove(cacheItem);
           }
-          appCache.putCache(cacheKey, foundCache);
+          else
+          {
+            comboBox.addItem(cacheItem);
+          }
+        }
+        else
+        {
+          comboBox.addItem(cacheItem);
         }
-        setSelectedItem(lastSearch.isEmpty() ? "" : lastSearch);
       }
-    });
+      appCache.putCache(cacheKey, foundCache);
+    }
+    setSelectedItem(lastSearch.isEmpty() ? "" : lastSearch);
+
   }
 
   /**
index a25a014..28bcf44 100644 (file)
@@ -91,7 +91,7 @@ public class Gff3Helper extends GffHelperBase
       String atts = gff[ATTRIBUTES_COL];
       Map<String, List<String>> attributes = parseNameValuePairs(atts);
 
-      SequenceOntologyI so = SequenceOntologyFactory.getInstance();
+      SequenceOntologyI so = SequenceOntologyFactory.getSequenceOntology();
       if (so.isA(soTerm, SequenceOntologyI.PROTEIN_MATCH))
       {
         sf = processProteinMatch(attributes, seq, gff, align, newseqs,
@@ -394,7 +394,7 @@ public class Gff3Helper extends GffHelperBase
       desc = target.split(" ")[0];
     }
 
-    SequenceOntologyI so = SequenceOntologyFactory.getInstance();
+    SequenceOntologyI so = SequenceOntologyFactory.getSequenceOntology();
     String type = sf.getType();
     if (so.isA(type, SequenceOntologyI.SEQUENCE_VARIANT))
     {
index 948cdd2..141b677 100644 (file)
@@ -108,7 +108,7 @@ public class InterProScanHelper extends Gff3Helper
    */
   public static boolean recognises(String[] columns)
   {
-    SequenceOntologyI so = SequenceOntologyFactory.getInstance();
+    SequenceOntologyI so = SequenceOntologyFactory.getSequenceOntology();
     String type = columns[TYPE_COL];
     if (so.isA(type, SequenceOntologyI.PROTEIN_MATCH)
             || (".".equals(columns[SOURCE_COL])
index 90cae7a..2ba41da 100644 (file)
  */
 package jalview.io.gff;
 
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
+
 /**
  * A factory class that returns a model of the Sequence Ontology. By default a
- * hard-coded subset is used (for the applet, or testing), or setInstance() can
- * be used to set full Ontology data.
+ * hard-coded subset is used (for the applet, or testing), or
+ * setSequenceOntology() can be used to set full Ontology data.
  * 
  * @author gmcarstairs
  *
  */
-public class SequenceOntologyFactory
+public class SequenceOntologyFactory implements ApplicationSingletonI
 {
-  private static SequenceOntologyI instance;
+  /**
+   * Answers an instance of this class for the current application context. Note
+   * that this supports running two JS 'applets' on the same page, one with the
+   * full Sequence Ontology (USE_FULL_SO = true) and one with a hard-coded
+   * subset (USE_FULL_SO = false). If this is overkill, could change this method
+   * to just return a common static instance.
+   * 
+   * @return
+   */
+  private static synchronized SequenceOntologyFactory getInstance()
+  {
+    return (SequenceOntologyFactory) ApplicationSingletonProvider
+            .getInstance(SequenceOntologyFactory.class);
+  }
+
+  /**
+   * Answers the configured model of the Sequence Ontology.
+   * 
+   * @return
+   */
+  public static synchronized SequenceOntologyI getSequenceOntology()
+  {
+    SequenceOntologyFactory f = getInstance();
+    return (f.sequenceOntology == null
+            ? f.sequenceOntology = new SequenceOntologyLite()
+            : f.sequenceOntology);
+  }
 
-  public static synchronized SequenceOntologyI getInstance()
+  /**
+   * For testng only
+   * 
+   * @param so
+   */
+  public static void setSequenceOntology(SequenceOntologyI so)
   {
-    if (instance == null)
-    {
-      instance = new SequenceOntologyLite();
-    }
-    return instance;
+    getInstance().sequenceOntology = so;
   }
 
-  public static void setInstance(SequenceOntologyI so)
+  private SequenceOntologyI sequenceOntology;
+
+  private SequenceOntologyFactory()
   {
-    instance = so;
+    // private singleton
   }
+
 }
index b53de08..ff7a764 100644 (file)
@@ -24,7 +24,7 @@ import java.util.IdentityHashMap;
 import java.util.Iterator;
 import java.util.Map;
 
-public class DatastoreRegistry implements AutoCloseable
+public class DatastoreRegistry
 {
   protected static org.apache.log4j.Logger log = org.apache.log4j.Logger
           .getLogger(DatastoreRegistry.class);
@@ -153,7 +153,7 @@ public class DatastoreRegistry implements AutoCloseable
   }
 
   @Override
-  public void close()
+  protected void finalize() throws Throwable
   {
     if (dsObjReg != null)
     {
@@ -172,6 +172,6 @@ public class DatastoreRegistry implements AutoCloseable
     {
       dsItemReg.clear();
     }
-    // super.finalize();
+    super.finalize();
   }
 }
index b4580f0..ee4fa83 100644 (file)
@@ -148,7 +148,7 @@ public abstract class Rangetype extends DatastoreItem
           int se_end = se[1 - se[2]] + (se[2] == 0 ? 1 : -1);
           for (int p = se[se[2]]; p != se_end; p += se[2] == 0 ? 1 : -1)
           {
-            posList.add(Integer.valueOf(p));
+            posList.add(new Integer(p));
           }
         }
       }
@@ -159,7 +159,7 @@ public abstract class Rangetype extends DatastoreItem
         for (int p = 0, pSize = dseta.getPosCount(); p < pSize; p++)
         {
           pos = dseta.getPos(p).getI();
-          posList.add(Integer.valueOf(pos));
+          posList.add(new Integer(pos));
         }
       }
     }
@@ -193,8 +193,8 @@ public abstract class Rangetype extends DatastoreItem
         for (int s = 0, sSize = range.getSegCount(); s < sSize; s++)
         {
           se = getSegRange(range.getSeg(s), false);
-          posList.addElement(Integer.valueOf(se[0]));
-          posList.addElement(Integer.valueOf(se[1]));
+          posList.addElement(new Integer(se[0]));
+          posList.addElement(new Integer(se[1]));
         }
       }
       else if (range.getPosCount() > 0)
@@ -204,8 +204,8 @@ public abstract class Rangetype extends DatastoreItem
         for (int p = 0, pSize = range.getPosCount(); p < pSize; p++)
         {
           pos = range.getPos(p).getI();
-          posList.add(Integer.valueOf(pos));
-          posList.add(Integer.valueOf(pos));
+          posList.add(new Integer(pos));
+          posList.add(new Integer(pos));
         }
       }
     }
index f8d86d5..dab840e 100644 (file)
@@ -232,7 +232,7 @@ public class Sequencefeature extends Rangetype
     if (feature.otherDetails != null)
     {
       Iterator<String> iter = feature.otherDetails.keySet().iterator();
-      Vector props = dsa.getPropertyAsReference();
+      Vector<?> props = dsa.getPropertyAsReference();
       while (iter.hasNext())
       {
         String key = iter.next();
@@ -290,10 +290,11 @@ public class Sequencefeature extends Rangetype
     String featureType = dseta.getType();
     if (dseta.getScoreCount() > 0)
     {
-      Enumeration scr = dseta.enumerateScore();
+      @SuppressWarnings("unchecked")
+      Enumeration<Score> scr = dseta.enumerateScore();
       while (scr.hasMoreElements())
       {
-        Score score = (Score) scr.nextElement();
+        Score score = scr.nextElement();
         if (score.getName().equals(featureType))
         {
           theScore = score.getContent();
@@ -325,10 +326,11 @@ public class Sequencefeature extends Rangetype
     }
     if (dseta.getScoreCount() > 0)
     {
-      Enumeration scr = dseta.enumerateScore();
+      @SuppressWarnings("unchecked")
+      Enumeration<Score> scr = dseta.enumerateScore();
       while (scr.hasMoreElements())
       {
-        Score score = (Score) scr.nextElement();
+        Score score = scr.nextElement();
         if (!score.getName().equals(sf.getType()))
         {
           sf.setValue(score.getName(), "" + score.getContent());
@@ -336,10 +338,11 @@ public class Sequencefeature extends Rangetype
       }
     }
     // other details
-    Enumeration props = dseta.enumerateProperty();
+    @SuppressWarnings("unchecked")
+    Enumeration<Property> props = dseta.enumerateProperty();
     while (props.hasMoreElements())
     {
-      Property p = (Property) props.nextElement();
+      Property p = props.nextElement();
       Object val = null;
       if (Properties.isValid(p))
       {
@@ -351,7 +354,7 @@ public class Sequencefeature extends Rangetype
         {
           try
           {
-            val = Boolean.valueOf(p.getContent());
+            val = new Boolean(p.getContent());
           } catch (Exception e)
           {
           }
@@ -360,7 +363,7 @@ public class Sequencefeature extends Rangetype
         {
           try
           {
-            val = Float.valueOf(p.getContent());
+            val = new Float(p.getContent());
 
           } catch (Exception e)
           {
@@ -370,7 +373,7 @@ public class Sequencefeature extends Rangetype
         {
           try
           {
-            val = Integer.valueOf(p.getContent());
+            val = new Integer(p.getContent());
           } catch (Exception e)
           {
           }
index 0a582e5..542bd3f 100644 (file)
@@ -110,27 +110,32 @@ public class Sequencemapping extends Rangetype
     }
   }
 
+  @Override
   public void addToDocument()
   {
     add(mjvmapping, from, ds);
   }
 
+  @Override
   public void addFromDocument()
   {
     add((SequenceMapping) vobj);
   }
 
+  @Override
   public void conflict()
   {
     conflict(mjvmapping, (SequenceMapping) vobj);
 
   }
 
+  @Override
   public void updateToDoc()
   {
     update(mjvmapping, (SequenceMapping) vobj);
   }
 
+  @Override
   public void updateFromDoc()
   {
     update((SequenceMapping) vobj, (jalview.datamodel.Mapping) jvobj);
@@ -364,8 +369,7 @@ public class Sequencemapping extends Rangetype
       acf.addMap(from, to, mapping);
     }
     bindjvvobj(mapping, sequenceMapping);
-    jalview.structure.StructureSelectionManager
-            .getStructureSelectionManager(Desktop.instance)
+    Desktop.getStructureSelectionManager()
             .registerMapping(acf);
     // Try to link up any conjugate database references in the two sequences
     // matchConjugateDBRefs(from, to, mapping);
@@ -402,7 +406,7 @@ public class Sequencemapping extends Rangetype
               + from.getName() + " and " + to.getName());
     }
     List<DBRefEntry> fdb = from.getDBRefs();
-    List<DBRefEntry> tdb = new ArrayList<DBRefEntry>(to.getDBRefs());
+    List<DBRefEntry> tdb = new ArrayList<>(to.getDBRefs());
     int tdblen = to.getDBRefs().size();
 //    
 //    
index 00e4fbc..e4e0b6c 100644 (file)
@@ -443,7 +443,7 @@ public class Tree extends DatastoreItem
     Integer nindx = (Integer) nodespecs.get(nname);
     if (nindx == null)
     {
-      nindx = Integer.valueOf(1);
+      nindx = new Integer(1);
     }
     nname = nindx.toString() + " " + nname;
     return nname;
@@ -465,7 +465,7 @@ public class Tree extends DatastoreItem
     String oval = nodespec.substring(0, nodespec.indexOf(' '));
     try
     {
-      occurence = Integer.valueOf(oval).intValue();
+      occurence = new Integer(oval).intValue();
     } catch (Exception e)
     {
       System.err.println("Invalid nodespec '" + nodespec + "'");
@@ -517,7 +517,7 @@ public class Tree extends DatastoreItem
    * referenced in input data has already been associated with jalview objects.
    * 
    * @param tp
-   * @param alignFrame
+   * @param loaderFrame
    * @return Object[] { AlignmentView, AlignmentI - reference alignment for
    *         input }
    */
index 8d316fb..bf988da 100644 (file)
@@ -51,8 +51,6 @@ import htsjdk.variant.vcf.VCFInfoHeaderLine;
  */
 public class VCFLoader
 {
-  private static final String DEFAULT_SPECIES = "homo_sapiens";
-
   /**
    * A class to model the mapping from sequence to VCF coordinates. Cases include
    * <ul>
@@ -84,7 +82,7 @@ public class VCFLoader
 
   /*
    * Lookup keys, and default values, for Preference entries that describe
-   * patterns for VCF and VEP fields to capture
+   * patterns for VCF and VEP fields to capture 
    */
   private static final String VEP_FIELDS_PREF = "VEP_FIELDS";
 
@@ -95,16 +93,6 @@ public class VCFLoader
   private static final String DEFAULT_VEP_FIELDS = ".*";// "Allele,Consequence,IMPACT,SWISSPROT,SIFT,PolyPhen,CLIN_SIG";
 
   /*
-   * Lookup keys, and default values, for Preference entries that give
-   * mappings from tokens in the 'reference' header to species or assembly
-   */
-  private static final String VCF_ASSEMBLY = "VCF_ASSEMBLY";
-
-  private static final String DEFAULT_VCF_ASSEMBLY = "assembly19=GRCh38,hs37=GRCh37,grch37=GRCh37,grch38=GRCh38";
-
-  private static final String VCF_SPECIES = "VCF_SPECIES"; // default is human
-
-  /*
    * keys to fields of VEP CSQ consequence data
    * see https://www.ensembl.org/info/docs/tools/vep/vep_formats.html
    */
@@ -126,6 +114,12 @@ public class VCFLoader
   private static final String PIPE_REGEX = "\\|";
 
   /*
+   * key for Allele Frequency output by VEP
+   * see http://www.ensembl.org/info/docs/tools/vep/vep_formats.html
+   */
+  private static final String ALLELE_FREQUENCY_KEY = "AF";
+
+  /*
    * delimiter that separates multiple consequence data blocks
    */
   private static final String COMMA = ",";
@@ -161,16 +155,6 @@ public class VCFLoader
   private VCFHeader header;
 
   /*
-   * species (as a valid Ensembl term) the VCF is for 
-   */
-  private String vcfSpecies;
-
-  /*
-   * genome assembly version (as a valid Ensembl identifier) the VCF is for 
-   */
-  private String vcfAssembly;
-
-  /*
    * a Dictionary of contigs (if present) referenced in the VCF file
    */
   private SAMSequenceDictionary dictionary;
@@ -262,13 +246,12 @@ public class VCFLoader
    */
   public SequenceI loadVCFContig(String contig)
   {
-    VCFHeaderLine headerLine = header.getOtherHeaderLine(VCFHeader.REFERENCE_KEY);
-    String ref = headerLine == null ? null : headerLine.getValue();
+    String ref = header.getOtherHeaderLine(VCFHeader.REFERENCE_KEY)
+            .getValue();
     if (ref.startsWith("file://"))
     {
       ref = ref.substring(7);
     }
-    setSpeciesAndAssembly(ref);
 
     SequenceI seq = null;
     File dbFile = new File(ref);
@@ -277,7 +260,7 @@ public class VCFLoader
     {
       HtsContigDb db = new HtsContigDb("", dbFile);
       seq = db.getSequenceProxy(contig);
-      loadSequenceVCF(seq);
+      loadSequenceVCF(seq, ref);
       db.close();
     }
     else
@@ -301,9 +284,7 @@ public class VCFLoader
     {
       VCFHeaderLine ref = header
               .getOtherHeaderLine(VCFHeader.REFERENCE_KEY);
-      String reference = ref.getValue();
-
-      setSpeciesAndAssembly(reference);
+      String vcfAssembly = ref.getValue();
 
       int varCount = 0;
       int seqCount = 0;
@@ -313,7 +294,7 @@ public class VCFLoader
        */
       for (SequenceI seq : seqs)
       {
-        int added = loadSequenceVCF(seq);
+        int added = loadSequenceVCF(seq, vcfAssembly);
         if (added > 0)
         {
           seqCount++;
@@ -357,65 +338,6 @@ public class VCFLoader
   }
 
   /**
-   * Attempts to determine and save the species and genome assembly version to
-   * which the VCF data applies. This may be done by parsing the {@code reference}
-   * header line, configured in a property file, or (potentially) confirmed
-   * interactively by the user.
-   * <p>
-   * The saved values should be identifiers valid for Ensembl's REST service
-   * {@code map} endpoint, so they can be used (if necessary) to retrieve the
-   * mapping between VCF coordinates and sequence coordinates.
-   * 
-   * @param reference
-   * @see https://rest.ensembl.org/documentation/info/assembly_map
-   * @see https://rest.ensembl.org/info/assembly/human?content-type=text/xml
-   * @see https://rest.ensembl.org/info/species?content-type=text/xml
-   */
-  protected void setSpeciesAndAssembly(String reference)
-  {
-    reference = reference.toLowerCase();
-    vcfSpecies = DEFAULT_SPECIES;
-
-    /*
-     * for a non-human species, or other assembly identifier,
-     * specify as a Jalview property file entry e.g.
-     * VCF_ASSEMBLY = hs37=GRCh37,assembly19=GRCh37
-     * VCF_SPECIES = c_elegans=celegans
-     * to map a token in the reference header to a value
-     */
-    String prop = Cache.getDefault(VCF_ASSEMBLY, DEFAULT_VCF_ASSEMBLY);
-    for (String token : prop.split(","))
-    {
-      String[] tokens = token.split("=");
-      if (tokens.length == 2)
-      {
-        if (reference.contains(tokens[0].trim().toLowerCase()))
-        {
-          vcfAssembly = tokens[1].trim();
-          break;
-        }
-      }
-    }
-
-    prop = Cache.getProperty(VCF_SPECIES);
-    if (prop != null)
-    {
-      for (String token : prop.split(","))
-      {
-        String[] tokens = token.split("=");
-        if (tokens.length == 2)
-        {
-          if (reference.contains(tokens[0].trim().toLowerCase()))
-          {
-            vcfSpecies = tokens[1].trim();
-            break;
-          }
-        }
-      }
-    }
-  }
-
-  /**
    * Opens the VCF file and parses header data
    * 
    * @param filePath
@@ -666,11 +588,12 @@ public class VCFLoader
    * and returns the number of variant features added
    * 
    * @param seq
+   * @param vcfAssembly
    * @return
    */
-  protected int loadSequenceVCF(SequenceI seq)
+  protected int loadSequenceVCF(SequenceI seq, String vcfAssembly)
   {
-    VCFMap vcfMap = getVcfMap(seq);
+    VCFMap vcfMap = getVcfMap(seq, vcfAssembly);
     if (vcfMap == null)
     {
       return 0;
@@ -691,9 +614,10 @@ public class VCFLoader
    * Answers a map from sequence coordinates to VCF chromosome ranges
    * 
    * @param seq
+   * @param vcfAssembly
    * @return
    */
-  private VCFMap getVcfMap(SequenceI seq)
+  private VCFMap getVcfMap(SequenceI seq, String vcfAssembly)
   {
     /*
      * simplest case: sequence has id and length matching a VCF contig
@@ -726,26 +650,32 @@ public class VCFLoader
     String seqRef = seqCoords.getAssemblyId();
     MapList map = seqCoords.getMap();
 
-    // note this requires the configured species to match that
-    // returned with the Ensembl sequence; todo: support aliases?
-    if (!vcfSpecies.equalsIgnoreCase(species))
+    if (!vcfSpeciesMatchesSequence(vcfAssembly, species))
     {
-      Cache.log.warn("No VCF loaded to " + seq.getName()
-              + " as species not matched");
       return null;
     }
 
-    if (seqRef.equalsIgnoreCase(vcfAssembly))
+    if (vcfAssemblyMatchesSequence(vcfAssembly, seqRef))
     {
       return new VCFMap(chromosome, map);
     }
 
+    if (!"GRCh38".equalsIgnoreCase(seqRef) // Ensembl
+            || !vcfAssembly.contains("Homo_sapiens_assembly19")) // gnomAD
+    {
+      return null;
+    }
+
     /*
-     * VCF data has a different reference assembly to the sequence:
-     * query Ensembl to map chromosomal coordinates from sequence to VCF
+     * map chromosomal coordinates from sequence to VCF if the VCF
+     * data has a different reference assembly to the sequence
      */
+    // TODO generalise for cases other than GRCh38 -> GRCh37 !
+    // - or get the user to choose in a dialog
+
     List<int[]> toVcfRanges = new ArrayList<>();
     List<int[]> fromSequenceRanges = new ArrayList<>();
+    String toRef = "GRCh37";
 
     for (int[] range : map.getToRanges())
     {
@@ -757,13 +687,12 @@ public class VCFLoader
       }
 
       int[] newRange = mapReferenceRange(range, chromosome, "human", seqRef,
-              vcfAssembly);
+              toRef);
       if (newRange == null)
       {
         Cache.log.error(
                 String.format("Failed to map %s:%s:%s:%d:%d to %s", species,
-                        chromosome, seqRef, range[0], range[1],
-                        vcfAssembly));
+                        chromosome, seqRef, range[0], range[1], toRef));
         continue;
       }
       else
@@ -804,6 +733,62 @@ public class VCFLoader
   }
 
   /**
+   * Answers true if we determine that the VCF data uses the same reference
+   * assembly as the sequence, else false
+   * 
+   * @param vcfAssembly
+   * @param seqRef
+   * @return
+   */
+  private boolean vcfAssemblyMatchesSequence(String vcfAssembly,
+          String seqRef)
+  {
+    // TODO improve on this stub, which handles gnomAD and
+    // hopes for the best for other cases
+
+    if ("GRCh38".equalsIgnoreCase(seqRef) // Ensembl
+            && vcfAssembly.contains("Homo_sapiens_assembly19")) // gnomAD
+    {
+      return false;
+    }
+    return true;
+  }
+
+  /**
+   * Answers true if the species inferred from the VCF reference identifier
+   * matches that for the sequence
+   * 
+   * @param vcfAssembly
+   * @param speciesId
+   * @return
+   */
+  boolean vcfSpeciesMatchesSequence(String vcfAssembly, String speciesId)
+  {
+    // PROBLEM 1
+    // there are many aliases for species - how to equate one with another?
+    // PROBLEM 2
+    // VCF ##reference header is an unstructured URI - how to extract species?
+    // perhaps check if ref includes any (Ensembl) alias of speciesId??
+    // TODO ask the user to confirm this??
+
+    if (vcfAssembly.contains("Homo_sapiens") // gnomAD exome data example
+            && "HOMO_SAPIENS".equals(speciesId)) // Ensembl species id
+    {
+      return true;
+    }
+
+    if (vcfAssembly.contains("c_elegans") // VEP VCF response example
+            && "CAENORHABDITIS_ELEGANS".equals(speciesId)) // Ensembl
+    {
+      return true;
+    }
+
+    // this is not a sustainable solution...
+
+    return false;
+  }
+
+  /**
    * Queries the VCF reader for any variants that overlap the mapped chromosome
    * ranges of the sequence, and adds as variant features. Returns the number of
    * overlapping variants found.
index 29f3fa9..ad7a379 100644 (file)
  */
 package jalview.javascript;
 
-import jalview.bin.JalviewLite;
+import jalview.api.JalviewApp;
 
 import java.net.URL;
+import java.util.Hashtable;
 import java.util.Vector;
 
 import netscape.javascript.JSObject;
 
 public class JSFunctionExec implements Runnable
 {
-  public JalviewLite jvlite;
+  public JalviewApp jvlite;
 
-  public JSFunctionExec(JalviewLite applet)
+  protected boolean debug;
+
+  public JSFunctionExec(JalviewApp applet, boolean debug)
   {
     jvlite = applet;
-
-    jsExecQueue = jvlite.getJsExecQueue();
-    jvlite.setExecutor(this);
+    this.debug = debug;
+    jsExecQueue = jvlite.getJsExecQueue(this);
   }
 
-  private Vector jsExecQueue;
+  private Vector<Runnable> jsExecQueue;
 
   private Thread executor = null;
 
@@ -47,7 +49,7 @@ public class JSFunctionExec implements Runnable
   {
     if (jsExecQueue != null)
     {
-      Vector<JSFunctionExec> q = null;
+      Vector<Runnable> q = null;
       synchronized (jsExecQueue)
       {
         q = jsExecQueue;
@@ -55,9 +57,9 @@ public class JSFunctionExec implements Runnable
       }
       if (q != null)
       {
-        for (JSFunctionExec jx : q)
+        for (Runnable jx : q)
         {
-          jx.jvlite = null;
+          ((JSFunctionExec) jx).jvlite = null;
 
         }
         q.removeAllElements();
@@ -78,7 +80,7 @@ public class JSFunctionExec implements Runnable
     {
       if (jsExecQueue.size() > 0)
       {
-        Runnable r = (Runnable) jsExecQueue.elementAt(0);
+        Runnable r = jsExecQueue.elementAt(0);
         jsExecQueue.removeElementAt(0);
         try
         {
@@ -162,14 +164,14 @@ public class JSFunctionExec implements Runnable
           JSObject scriptObject = null;
           try
           {
-            scriptObject = JSObject.getWindow(jvlite);
+            scriptObject = jvlite.getJSObject();
           } catch (Exception ex)
           {
           }
           ;
           if (scriptObject != null)
           {
-            if (jvlite.debug && dbgMsg != null)
+            if (debug && dbgMsg != null)
             {
               System.err.println(dbgMsg);
             }
@@ -180,15 +182,15 @@ public class JSFunctionExec implements Runnable
           // squash any malformedURLExceptions thrown by windows/safari
           if (!(jex instanceof java.net.MalformedURLException))
           {
-            if (jvlite.debug)
+            if (debug)
             {
               System.err.println(jex);
             }
             if (jex instanceof netscape.javascript.JSException
-                    && jvlite.jsfallbackEnabled)
+                    && jvlite.isJsfallbackEnabled())
             {
               jsex[0] = jex;
-              if (jvlite.debug)
+              if (debug)
               {
                 System.err.println("Falling back to javascript: url call");
               }
@@ -211,7 +213,7 @@ public class JSFunctionExec implements Runnable
                 sb.append("\"");
               }
               sb.append(")");
-              if (jvlite.debug)
+              if (debug)
               {
                 System.err.println(sb.toString());
               }
@@ -248,7 +250,7 @@ public class JSFunctionExec implements Runnable
     {
       if (executor == null)
       {
-        executor = new Thread(new JSFunctionExec(jvlite));
+        executor = new Thread(new JSFunctionExec(jvlite, debug));
         executor.start();
       }
       synchronized (jsExecQueue)
@@ -268,4 +270,80 @@ public class JSFunctionExec implements Runnable
     }
   }
 
+  public static void setJsMessageSet(String messageclass, String viewId,
+          String[] colcommands, JalviewApp app)
+  {
+    Hashtable<String, Hashtable<String, String[]>> jsmessages = app
+            .getJSMessages();
+    Hashtable<String, int[]> jshashes = app.getJSHashes();
+
+    Hashtable<String, String[]> msgset = jsmessages.get(messageclass);
+    if (msgset == null)
+    {
+      msgset = new Hashtable<>();
+      jsmessages.put(messageclass, msgset);
+    }
+    msgset.put(viewId, colcommands);
+    int[] l = new int[colcommands.length];
+    for (int i = 0; i < colcommands.length; i++)
+    {
+      l[i] = colcommands[i].hashCode();
+    }
+    jshashes.put(messageclass + "|" + viewId, l);
+  }
+
+  /*
+   * (non-Javadoc)
+   * 
+   * @see jalview.bin.JalviewLiteJsApi#getJsMessage(java.lang.String,
+   * java.lang.String)
+   */
+  public static String getJsMessage(String messageclass, String viewId,
+          JalviewApp app)
+  {
+    Hashtable<String, String[]> msgset = app.getJSMessages()
+            .get(messageclass);
+    if (msgset != null)
+    {
+      String[] msgs = msgset.get(viewId);
+      if (msgs != null)
+      {
+        for (int i = 0; i < msgs.length; i++)
+        {
+          if (msgs[i] != null)
+          {
+            String m = msgs[i];
+            msgs[i] = null;
+            return m;
+          }
+        }
+      }
+    }
+    return "";
+  }
+
+  public static boolean isJsMessageSetChanged(String string, String string2,
+          String[] colcommands, JalviewApp app)
+  {
+    int[] l = app.getJSHashes().get(string + "|" + string2);
+    if (l == null && colcommands != null)
+    {
+      return true;
+    }
+    for (int i = 0; i < colcommands.length; i++)
+    {
+      if (l[i] != colcommands[i].hashCode())
+      {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  public void tidyUp()
+  {
+    stopQueue();
+    jvlite = null;
+  }
+
 }
index b5811aa..3ce2c9f 100644 (file)
@@ -1,13 +1,13 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
- * Copyright (C) $$Year-Rel$$ 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.
  * 
  * 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.
+ * 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 
  */
 package jalview.javascript;
 
-import jalview.appletgui.AlignFrame;
+import jalview.api.AlignFrameI;
 
 /**
  * The following public methods may be called
  * externally, eg via javascript in an HTML page.
  * 
- * <br><em>TODO: introduce abstract interface for jalview.appletgui.AlignFrame</em><br>
+ * <br><em>TODO: introduce abstract interface for jalview.appletgui.AlignFrameI</em><br>
  * 
  * Most function arguments are strings, which contain serialised versions of lists.
  * Lists of things are separated by a separator character - either the default or a user supplied one.
@@ -42,7 +42,7 @@ public interface JalviewLiteJsApi
 
   /**
    * @return String list of selected sequence IDs, each terminated by the
-   *         'boolean not' character (""+0x00AC) or (&#172;)
+   *         'boolean not' character (""+0x00AC); or (&#172;);
    */
   public abstract String getSelectedSequences();
 
@@ -56,12 +56,12 @@ public interface JalviewLiteJsApi
 
   /**
    * @param alf
-   *          alignframe containing selection
+   *          AlignFrameI containing selection
    * @return String list of selected sequence IDs, each terminated by current
    *         default separator sequence
    * 
    */
-  public abstract String getSelectedSequencesFrom(AlignFrame alf);
+  public abstract String getSelectedSequencesFrom(AlignFrameI alf);
 
   /**
    * get list of selected sequence IDs separated by given separator
@@ -73,7 +73,7 @@ public interface JalviewLiteJsApi
    * @return String list of selected sequence IDs, each terminated by the given
    *         separator
    */
-  public abstract String getSelectedSequencesFrom(AlignFrame alf,
+  public abstract String getSelectedSequencesFrom(AlignFrameI alf,
           String sep);
 
   /**
@@ -99,7 +99,7 @@ public interface JalviewLiteJsApi
    *          false, blank or something else - indicate if position is an
    *          alignment column or unaligned sequence position
    */
-  public abstract void highlightIn(AlignFrame alf, String sequenceId,
+  public abstract void highlightIn(AlignFrameI alf, String sequenceId,
           String position, String alignedPosition);
 
   /**
@@ -133,7 +133,7 @@ public interface JalviewLiteJsApi
    * @param sep
    *          separator between toselect fields
    */
-  public abstract void selectIn(AlignFrame alf, String sequenceIds,
+  public abstract void selectIn(AlignFrameI alf, String sequenceIds,
           String columns);
 
   /**
@@ -145,11 +145,11 @@ public interface JalviewLiteJsApi
    * @param sep
    *          separator between toselect fields
    */
-  public abstract void selectIn(AlignFrame alf, String sequenceIds,
+  public abstract void selectIn(AlignFrameI alf, String sequenceIds,
           String columns, String sep);
 
   /**
-   * get sequences selected in current alignFrame and return their alignment in
+   * get sequences selected in current AlignFrameI and return their alignment in
    * format 'format' either with or without suffix
    * 
    * @param alf
@@ -177,7 +177,8 @@ public interface JalviewLiteJsApi
    * @return selected sequences as flat file or empty string if there was no
    *         current selection
    */
-  public abstract String getSelectedSequencesAsAlignmentFrom(AlignFrame alf,
+  public abstract String getSelectedSequencesAsAlignmentFrom(
+          AlignFrameI alf,
           String format, String suffix);
 
   /**
@@ -195,7 +196,7 @@ public interface JalviewLiteJsApi
    * @param alf
    * @return
    */
-  public abstract String getAlignmentOrderFrom(AlignFrame alf);
+  public abstract String getAlignmentOrderFrom(AlignFrameI alf);
 
   /**
    * get a sep separated list of sequence IDs reflecting the order of the
@@ -206,7 +207,8 @@ public interface JalviewLiteJsApi
    *          - separator to use
    * @return
    */
-  public abstract String getAlignmentOrderFrom(AlignFrame alf, String sep);
+  public abstract String getAlignmentOrderFrom(AlignFrameI alf,
+          String sep);
 
   /**
    * re-order the current alignment using the given list of sequence IDs
@@ -232,7 +234,8 @@ public interface JalviewLiteJsApi
    * @return 'true' if alignment was actually reordered. empty string if
    *         alignment did not contain sequences.
    */
-  public abstract String orderBy(String order, String undoName, String sep);
+  public abstract String orderBy(String order, String undoName,
+          String sep);
 
   /**
    * re-order the given alignment using the given list of sequence IDs separated
@@ -247,12 +250,12 @@ public interface JalviewLiteJsApi
    * @return 'true' if alignment was actually reordered. empty string if
    *         alignment did not contain sequences.
    */
-  public abstract String orderAlignmentBy(AlignFrame alf, String order,
+  public abstract String orderAlignmentBy(AlignFrameI alf, String order,
           String undoName, String sep);
 
   /**
    * get alignment as format (format names FASTA, BLC, CLUSTAL, MSF, PILEUP,
-   * PFAM - see jalview.io.AppletFormatAdapter for full list)
+   * PFAM - see jalview.io.AppletFormatAdapter for full list);
    * 
    * @param format
    * @return
@@ -266,7 +269,7 @@ public interface JalviewLiteJsApi
    * @param format
    * @return
    */
-  public abstract String getAlignmentFrom(AlignFrame alf, String format);
+  public abstract String getAlignmentFrom(AlignFrameI alf, String format);
 
   /**
    * get alignment as format with jalview start-end sequence suffix appended
@@ -286,7 +289,7 @@ public interface JalviewLiteJsApi
    * @param suffix
    * @return
    */
-  public abstract String getAlignmentFrom(AlignFrame alf, String format,
+  public abstract String getAlignmentFrom(AlignFrameI alf, String format,
           String suffix);
 
   /**
@@ -302,12 +305,12 @@ public interface JalviewLiteJsApi
    * @param alf
    * @param annotation
    */
-  public abstract void loadAnnotationFrom(AlignFrame alf,
+  public abstract void loadAnnotationFrom(AlignFrameI alf,
           String annotation);
 
   /**
    * parse the given string as a jalview feature or GFF annotation file and
-   * optionally enable feature display on the current alignFrame
+   * optionally enable feature display on the current AlignFrameI
    * 
    * @param features
    *          - gff or features file
@@ -320,7 +323,7 @@ public interface JalviewLiteJsApi
 
   /**
    * parse the given string as a jalview feature or GFF annotation file and
-   * optionally enable feature display on the given alignFrame.
+   * optionally enable feature display on the given AlignFrameI.
    * 
    * @param alf
    * @param features
@@ -330,11 +333,11 @@ public interface JalviewLiteJsApi
    *          be parsed from the string.
    * @return true if data parsed as features
    */
-  public abstract boolean loadFeaturesFrom(AlignFrame alf, String features,
+  public abstract boolean loadFeaturesFrom(AlignFrameI alf, String features,
           boolean autoenabledisplay);
 
   /**
-   * get the sequence features in the given format (Jalview or GFF)
+   * get the sequence features in the given format (Jalview or GFF);
    * 
    * @param format
    * @return
@@ -342,13 +345,13 @@ public interface JalviewLiteJsApi
   public abstract String getFeatures(String format);
 
   /**
-   * get the sequence features in alf in the given format (Jalview or GFF)
+   * get the sequence features in alf in the given format (Jalview or GFF);
    * 
    * @param alf
    * @param format
    * @return
    */
-  public abstract String getFeaturesFrom(AlignFrame alf, String format);
+  public abstract String getFeaturesFrom(AlignFrameI alf, String format);
 
   /**
    * get current alignment's annotation as an annotation file
@@ -363,30 +366,30 @@ public interface JalviewLiteJsApi
    * @param alf
    * @return
    */
-  public abstract String getAnnotationFrom(AlignFrame alf);
+  public abstract String getAnnotationFrom(AlignFrameI alf);
 
   /**
-   * create a new view and return the alignFrame instance
+   * create a new view and return the AlignFrameI instance
    * 
    * @return
    */
-  public abstract AlignFrame newView();
+  public abstract AlignFrameI newView();
 
   /**
-   * create a new view named name and return the alignFrame instance
+   * create a new view named name and return the AlignFrameI instance
    * 
    * @param name
    * @return
    */
-  public abstract AlignFrame newView(String name);
+  public abstract AlignFrameI newView(String name);
 
   /**
-   * create a new view on alf and return the alignFrame instance
+   * create a new view on alf and return the AlignFrameI instance
    * 
    * @param alf
    * @return
    */
-  public abstract AlignFrame newViewFrom(AlignFrame alf);
+  public abstract AlignFrameI newViewFrom(AlignFrameI alf);
 
   /**
    * create a new view named name on alf
@@ -395,7 +398,7 @@ public interface JalviewLiteJsApi
    * @param name
    * @return
    */
-  public abstract AlignFrame newViewFrom(AlignFrame alf, String name);
+  public abstract AlignFrameI newViewFrom(AlignFrameI alf, String name);
 
   /**
    * 
@@ -405,15 +408,15 @@ public interface JalviewLiteJsApi
    *          window title
    * @return null or new alignment frame
    */
-  public abstract AlignFrame loadAlignment(String text, String title);
+  public abstract AlignFrameI loadAlignment(String text, String title);
 
   /**
    * register a javascript function to handle any alignment mouseover events
    * 
    * @param listener
    *          name of javascript function (called with arguments
-   *          [jalview.appletgui.AlignFrame,String(sequence id),String(column in
-   *          alignment), String(position in sequence)]
+   *          [jalview.appletgui.AlignFrameI,String(sequence id);,String(column
+   *          in alignment);, String(position in sequence);]
    */
   public abstract void setMouseoverListener(String listener);
 
@@ -421,12 +424,13 @@ public interface JalviewLiteJsApi
    * register a javascript function to handle mouseover events
    * 
    * @param af
-   *          (null or specific alignframe for which events are to be listened
-   *          for)
+   *          (null or specific AlignFrameI for which events are to be listened
+   *          for);
    * @param listener
    *          name of javascript function
    */
-  public abstract void setMouseoverListener(AlignFrame af, String listener);
+  public abstract void setMouseoverListener(AlignFrameI af,
+          String listener);
 
   /**
    * register a javascript function to handle any alignment selection events.
@@ -435,14 +439,15 @@ public interface JalviewLiteJsApi
    * 
    * @param listener
    *          name of javascript function (called with arguments
-   *          [jalview.appletgui.AlignFrame, String(sequence set id),
-   *          String(separator separated list of sequences which were selected),
-   *          String(separator separated list of column ranges (i.e. single
-   *          number or hyphenated range) that were selected)]
+   *          [jalview.appletgui.AlignFrameI, String(sequence set id);,
+   *          String(separator separated list of sequences which were
+   *          selected);, String(separator separated list of column ranges (i.e.
+   *          single number or hyphenated range); that were selected);]
    */
   public abstract void setSelectionListener(String listener);
 
-  public abstract void setSelectionListener(AlignFrame af, String listener);
+  public abstract void setSelectionListener(AlignFrameI af,
+          String listener);
 
   /**
    * register a javascript function to handle events normally routed to a Jmol
@@ -450,11 +455,11 @@ public interface JalviewLiteJsApi
    * 
    * @param listener
    *          - javascript function (arguments are variable, see
-   *          jalview.javascript.MouseOverStructureListener for full details)
+   *          jalview.javascript.MouseOverStructureListener for full details);
    * @param modelSet
    *          - separator separated list of PDB file URIs that this viewer is
    *          handling. These files must be in the same order they appear in
-   *          Jmol (e.g. first one is frame 1, second is frame 2, etc).
+   *          Jmol (e.g. first one is frame 1, second is frame 2, etc);.
    * @see jalview.javascript.MouseOverStructureListener
    */
   public abstract void setStructureListener(String listener,
@@ -462,14 +467,14 @@ public interface JalviewLiteJsApi
 
   /**
    * remove any callback using the given listener function and associated with
-   * the given alignFrame (or null for all callbacks)
+   * the given AlignFrameI (or null for all callbacks);
    * 
    * @param af
-   *          (may be null)
+   *          (may be null);
    * @param listener
-   *          (may be null)
+   *          (may be null);
    */
-  public abstract void removeJavascriptListener(AlignFrame af,
+  public abstract void removeJavascriptListener(AlignFrameI af,
           String listener);
 
   /**
@@ -484,10 +489,10 @@ public interface JalviewLiteJsApi
           String pdbfile);
 
   /**
-   * bind a pdb file to a sequence in the given alignFrame.
+   * bind a pdb file to a sequence in the given AlignFrameI.
    * 
    * @param alFrame
-   *          - null or specific alignFrame. This specifies the dataset that
+   *          - null or specific AlignFrameI. This specifies the dataset that
    *          will be searched for a seuqence called sequenceId
    * @param sequenceId
    *          - sequenceId within the dataset.
@@ -499,7 +504,7 @@ public interface JalviewLiteJsApi
    *         structure for indicating when PDB parsing or sequenceId location
    *         fails.
    */
-  public abstract boolean addPdbFile(AlignFrame alFrame, String sequenceId,
+  public abstract boolean addPdbFile(AlignFrameI alFrame, String sequenceId,
           String pdbEntryString, String pdbFile);
 
   /**
@@ -510,7 +515,7 @@ public interface JalviewLiteJsApi
    * @param topRow
    * @param leftHandColumn
    */
-  public abstract void scrollViewToIn(AlignFrame alf, String topRow,
+  public abstract void scrollViewToIn(AlignFrameI alf, String topRow,
           String leftHandColumn);
 
   /**
@@ -519,7 +524,7 @@ public interface JalviewLiteJsApi
    * @param alf
    * @param topRow
    */
-  public abstract void scrollViewToRowIn(AlignFrame alf, String topRow);
+  public abstract void scrollViewToRowIn(AlignFrameI alf, String topRow);
 
   /**
    * adjust horizontal scroll to make the given column the left one in the given
@@ -528,28 +533,28 @@ public interface JalviewLiteJsApi
    * @param alf
    * @param leftHandColumn
    */
-  public abstract void scrollViewToColumnIn(AlignFrame alf,
+  public abstract void scrollViewToColumnIn(AlignFrameI alf,
           String leftHandColumn);
 
   /**
    * 
    * @return
-   * @see jalview.appletgui.AlignFrame#getFeatureGroups()
+   * @see jalview.appletgui.AlignFrameI#getFeatureGroups();
    */
   public abstract String getFeatureGroups();
 
   /**
    * @param alf
-   *          alignframe to get feature groups on
+   *          AlignFrameI to get feature groups on
    * @return
-   * @see jalview.appletgui.AlignFrame#getFeatureGroups()
+   * @see jalview.appletgui.AlignFrameI#getFeatureGroups();
    */
-  public abstract String getFeatureGroupsOn(AlignFrame alf);
+  public abstract String getFeatureGroupsOn(AlignFrameI alf);
 
   /**
    * @param visible
    * @return
-   * @see jalview.appletgui.AlignFrame#getFeatureGroupsOfState(boolean)
+   * @see jalview.appletgui.AlignFrameI#getFeatureGroupsOfState(boolean);
    */
   public abstract String getFeatureGroupsOfState(boolean visible);
 
@@ -558,9 +563,9 @@ public interface JalviewLiteJsApi
    *          align frame to get groups of state visible
    * @param visible
    * @return
-   * @see jalview.appletgui.AlignFrame#getFeatureGroupsOfState(boolean)
+   * @see jalview.appletgui.AlignFrameI#getFeatureGroupsOfState(boolean);
    */
-  public abstract String getFeatureGroupsOfStateOn(AlignFrame alf,
+  public abstract String getFeatureGroupsOfStateOn(AlignFrameI alf,
           boolean visible);
 
   /**
@@ -568,10 +573,11 @@ public interface JalviewLiteJsApi
    *          tab separated list of group names
    * @param state
    *          true or false
-   * @see jalview.appletgui.AlignFrame#setFeatureGroupState(java.lang.String[],
-   *      boolean)
+   * @see jalview.appletgui.AlignFrameI#setFeatureGroupState(java.lang.String[],
+   *      boolean);
    */
-  public abstract void setFeatureGroupStateOn(AlignFrame alf, String groups,
+  public abstract void setFeatureGroupStateOn(AlignFrameI alf,
+          String groups,
           boolean state);
 
   public abstract void setFeatureGroupState(String groups, boolean state);
@@ -600,4 +606,24 @@ public interface JalviewLiteJsApi
    */
   public abstract String getJsMessage(String messageclass, String viewId);
 
+  /// in http://www.jalview.org/examples/jalviewLiteJs.html but missing here
+
+  // get selected sequences as alignment as format with or without start-end
+  // suffix
+  public String getSelectedSequencesAsAlignment(String format,
+          boolean suffix);
+
+  // get selected sequences as alignment from given view as format with or
+  // without start-end suffix
+  public String getSelectedSequencesAsAlignmentFrom(AlignFrameI alf,
+          String format, boolean suffix);
+
+  public String arrayToSeparatorList(String[] array);
+
+  // get a string array from a list
+  public String[] separatorListToArray(String list);
+
+  // debug flag - controls output to standard out
+  public static boolean debug = false;
+
 }
index c2a963e..56efe70 100644 (file)
@@ -20,8 +20,8 @@
  */
 package jalview.javascript;
 
+import jalview.api.JalviewApp;
 import jalview.appletgui.AlignFrame;
-import jalview.bin.JalviewLite;
 import jalview.datamodel.ColumnSelection;
 import jalview.datamodel.HiddenColumns;
 import jalview.datamodel.SequenceGroup;
@@ -35,10 +35,10 @@ public class JsSelectionSender extends JSFunctionExec
 
   String _listener;
 
-  public JsSelectionSender(JalviewLite jvlite, AlignFrame af,
-          String listener)
+  public JsSelectionSender(JalviewApp jvlite, AlignFrame af,
+          String listener, boolean debug)
   {
-    super(jvlite);
+    super(jvlite, debug);
     _af = af;
     _listener = listener;
   }
@@ -47,70 +47,13 @@ public class JsSelectionSender extends JSFunctionExec
   public void selection(SequenceGroup seqsel, ColumnSelection colsel,
           HiddenColumns hidden, SelectionSource source)
   {
-    // System.err.println("Testing selection event relay to
-    // jsfunction:"+_listener);
+    Object[] info = jvlite.getSelectionForListener(seqsel, colsel, hidden, source, _af);
     try
     {
-      String setid = "";
-      AlignFrame src = _af;
-      if (source != null)
-      {
-        if (source instanceof jalview.appletgui.AlignViewport
-                && ((jalview.appletgui.AlignViewport) source).applet.currentAlignFrame.viewport == source)
-        {
-          // should be valid if it just generated an event!
-          src = ((jalview.appletgui.AlignViewport) source).applet.currentAlignFrame;
 
-        }
-      }
-      String[] seqs = new String[] {};
-      String[] cols = new String[] {};
-      int strt = 0, end = (src == null) ? -1
-              : src.alignPanel.av.getAlignment().getWidth();
-      if (seqsel != null && seqsel.getSize() > 0)
-      {
-        seqs = new String[seqsel.getSize()];
-        for (int i = 0; i < seqs.length; i++)
-        {
-          seqs[i] = seqsel.getSequenceAt(i).getName();
-        }
-        if (strt < seqsel.getStartRes())
-        {
-          strt = seqsel.getStartRes();
-        }
-        if (end == -1 || end > seqsel.getEndRes())
-        {
-          end = seqsel.getEndRes();
-        }
-      }
-      if (colsel != null && !colsel.isEmpty())
-      {
-        if (end == -1)
-        {
-          end = colsel.getMax() + 1;
-        }
-        cols = new String[colsel.getSelected().size()];
-        for (int i = 0; i < cols.length; i++)
-        {
-          cols[i] = "" + (1 + colsel.getSelected().get(i).intValue());
-        }
-      }
-      else
-      {
-        if (seqsel != null && seqsel.getSize() > 0)
-        {
-          // send a valid range, otherwise we send the empty selection
-          cols = new String[2];
-          cols[0] = "" + (1 + strt) + "-" + (1 + end);
-        }
-        ;
-
-      }
       System.err.println("Relaying selection to jsfunction:" + _listener);
-      executeJavascriptFunction(_listener,
-              new Object[]
-              { src, setid, jvlite.arrayToSeparatorList(seqs),
-                  jvlite.arrayToSeparatorList(cols) });
+      executeJavascriptFunction(_listener, info);
+
     } catch (Exception ex)
     {
       System.err.println(
@@ -125,6 +68,7 @@ public class JsSelectionSender extends JSFunctionExec
       }
 
     }
+
   }
 
   @Override
index 6a4d0f8..7c74965 100644 (file)
@@ -20,8 +20,8 @@
  */
 package jalview.javascript;
 
+import jalview.api.JalviewApp;
 import jalview.appletgui.AlignFrame;
-import jalview.bin.JalviewLite;
 import jalview.datamodel.SequenceI;
 import jalview.structure.VamsasListener;
 import jalview.structure.VamsasSource;
@@ -48,25 +48,12 @@ public class MouseOverListener extends JSFunctionExec
       // + seq + " at " + index);
       last = seq;
       i = index;
-      AlignFrame src = null;
+      Object alignFrame = jvlite.getFrameForSource(source);
       try
       {
-        if (source != null)
-        {
-          if (source instanceof jalview.appletgui.AlignViewport
-                  && ((jalview.appletgui.AlignViewport) source).applet.currentAlignFrame.viewport == source)
-          {
-            // should be valid if it just generated an event!
-            src = ((jalview.appletgui.AlignViewport) source).applet.currentAlignFrame;
-
-          }
-          // TODO: ensure that if '_af' is specified along with a handler
-          // function, then only events from that alignFrame are sent to that
-          // function
-        }
         executeJavascriptFunction(_listener,
                 new Object[]
-                { src, seq.getDisplayId(false), "" + (1 + i),
+                { alignFrame, seq.getDisplayId(false), "" + (1 + i),
                     "" + seq.findPosition(i) });
       } catch (Exception ex)
       {
@@ -84,10 +71,10 @@ public class MouseOverListener extends JSFunctionExec
     }
   }
 
-  public MouseOverListener(JalviewLite applet, AlignFrame af,
-          String listener)
+  public MouseOverListener(JalviewApp applet, AlignFrame af,
+          String listener, boolean debug)
   {
-    super(applet);
+    super(applet, debug);
     _af = af;
     _listener = listener;
   }
index 6071933..28e2ced 100644 (file)
  */
 package jalview.javascript;
 
+import jalview.api.AlignViewportI;
 import jalview.api.AlignmentViewPanel;
-import jalview.api.FeatureRenderer;
+import jalview.api.JalviewApp;
 import jalview.api.SequenceRenderer;
 import jalview.appletgui.AlignFrame;
-import jalview.bin.JalviewLite;
 import jalview.datamodel.SequenceI;
 import jalview.ext.jmol.JmolCommands;
 import jalview.structure.AtomSpec;
@@ -76,12 +76,12 @@ public class MouseOverStructureListener extends JSFunctionExec
 
   String _listenerfn;
 
-  String[] modelSet;
+  public String[] modelSet;
 
-  public MouseOverStructureListener(JalviewLite jalviewLite,
-          String listener, String[] modelList)
+  public MouseOverStructureListener(JalviewApp app, String listener,
+          String[] modelList, boolean debug)
   {
-    super(jalviewLite);
+    super(app, debug);
     _listenerfn = listener;
     modelSet = modelList;
     if (modelSet != null)
@@ -165,21 +165,22 @@ public class MouseOverStructureListener extends JSFunctionExec
   }
 
   @Override
-  public synchronized void updateColours(Object srce)
+  public synchronized void updateColours(Object source)
   {
-    final Object source = srce;
     StructureSelectionManager ssm = StructureSelectionManager
-            .getStructureSelectionManager(jvlite);
+            .getStructureSelectionManager(
+                    jvlite.getStructureSelectionManagerProvider());
 
-    if (JalviewLite.debug)
+    if (debug)
     {
       System.err.println(
               this.getClass().getName() + " modelSet[0]: " + modelSet[0]);
       ssm.reportMapping();
     }
 
-    if (source instanceof jalview.api.AlignmentViewPanel)
+    if (source instanceof AlignmentViewPanel)
     {
+      AlignmentViewPanel panel = (AlignmentViewPanel) source;
       SequenceI[][] sequence = new SequenceI[modelSet.length][];
       for (int m = 0; m < modelSet.length; m++)
       {
@@ -203,25 +204,20 @@ public class MouseOverStructureListener extends JSFunctionExec
         // }
       }
 
-      SequenceRenderer sr = ((jalview.appletgui.AlignmentPanel) source)
-              .getSequenceRenderer();
-      FeatureRenderer fr = ((jalview.appletgui.AlignmentPanel) source).av
-              .isShowSequenceFeatures()
-                      ? new jalview.appletgui.FeatureRenderer(
-                              ((jalview.appletgui.AlignmentPanel) source).av)
-                      : null;
+      SequenceRenderer sr = panel.getSequenceRenderer();
+      AlignViewportI vp = panel.getAlignViewport();
+      jalview.renderer.seqfeatures.FeatureRenderer fr = vp
+              .isShowSequenceFeatures() ? jvlite.getNewFeatureRenderer(vp)
+              : null;
       if (fr != null)
       {
-        ((jalview.appletgui.FeatureRenderer) fr).transferSettings(
-                ((jalview.appletgui.AlignmentPanel) source)
-                        .getFeatureRenderer());
+        fr.transferSettings(panel.getFeatureRenderer());
       }
-      ;
 
       // Form a colour command from the given alignment panel for each distinct
       // structure
-      ArrayList<String[]> ccomands = new ArrayList<String[]>();
-      ArrayList<String> pdbfn = new ArrayList<String>();
+      ArrayList<String[]> ccomands = new ArrayList<>();
+      ArrayList<String> pdbfn = new ArrayList<>();
       StructureMappingcommandSet[] colcommands = JmolCommands
               .getColourBySequenceCommand(ssm, modelSet, sequence, sr,
                       (AlignmentViewPanel) source);
@@ -237,7 +233,6 @@ public class MouseOverStructureListener extends JSFunctionExec
         pdbfn.add(ccset.mapping);
       }
 
-      String mclass, mhandle;
       String ccomandset[] = new String[sz];
       sz = 0;
       for (String[] ccset : ccomands)
@@ -245,28 +240,16 @@ public class MouseOverStructureListener extends JSFunctionExec
         System.arraycopy(ccset, 0, ccomandset, sz, ccset.length);
         sz += ccset.length;
       }
-      if (jvlite.isJsMessageSetChanged(mclass = "colourstruct",
-              mhandle = ((jalview.appletgui.AlignmentPanel) source).av
-                      .getViewId(),
-              ccomandset))
+      String mclass = "colourstruct";
+      String mhandle = vp.getViewId();
+      if (isJsMessageSetChanged(mclass, mhandle, ccomandset, jvlite))
       {
-        jvlite.setJsMessageSet(mclass, mhandle, ccomandset);
+        setJsMessageSet(mclass, mhandle, ccomandset, jvlite);
         // and notify javascript handler
-        String st[] = new String[] { "colourstruct",
-            "" + ((jalview.appletgui.AlignmentPanel) source).av.getViewId(),
+        String st[] = new String[] { mclass, mhandle,
             "" + ccomandset.length, jvlite.arrayToSeparatorList(
                     pdbfn.toArray(new String[pdbfn.size()])) };
-        try
-        {
-          executeJavascriptFunction(true, _listenerfn, st);
-        } catch (Exception ex)
-        {
-          System.err.println("Couldn't execute callback with " + _listenerfn
-                  + " using args { " + st[0] + ", " + st[1] + ", " + st[2]
-                  + "," + st[3] + "}"); // + ","+st[4]+"\n");
-          ex.printStackTrace();
-
-        }
+        executeJavascriptFunction(true, st);
       }
       /*
        * new Thread(new Runnable() { public void run() { // and send to
@@ -283,6 +266,7 @@ public class MouseOverStructureListener extends JSFunctionExec
        */
     }
 
+    jvlite.updateColoursFromMouseOver(source, this);
   }
 
   @Override
@@ -312,4 +296,19 @@ public class MouseOverStructureListener extends JSFunctionExec
     return true;
   }
 
+  public void executeJavascriptFunction(boolean b, String[] st)
+  {
+    try
+    {
+      executeJavascriptFunction(true, _listenerfn, st);
+    } catch (Exception ex)
+    {
+      System.err.println("Couldn't execute callback with " + _listenerfn
+              + " using args { " + st[0] + ", " + st[1] + ", " + st[2] + ","
+              + st[3] + "}"); // + ","+st[4]+"\n");
+      ex.printStackTrace();
+
+    }
+  }
+
 }
index 4e9d1dd..72d8982 100644 (file)
@@ -16,7 +16,7 @@ import java.net.URL;
  * methods for extracting data. [get(), contains(), probably should add keySet,
  * valueSet, and entrySet].
  * 
- * @author hansonr Bob Hanson St. Olaf College 1/24/2019
+ * @author hansonr Bob Hanson St. Olaf College 1/24/2019+
  *
  */
 public class JSON {
index 6685c67..9de31ab 100755 (executable)
@@ -25,6 +25,7 @@ import jalview.analysis.GeneticCodeI;
 import jalview.analysis.GeneticCodes;
 import jalview.api.SplitContainerI;
 import jalview.bin.Cache;
+import jalview.bin.Jalview;
 import jalview.gui.JvSwingUtils;
 import jalview.gui.Preferences;
 import jalview.io.FileFormats;
@@ -35,6 +36,7 @@ import jalview.util.Platform;
 import java.awt.BorderLayout;
 import java.awt.Color;
 import java.awt.GridLayout;
+import java.awt.Toolkit;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.FocusAdapter;
@@ -220,7 +222,7 @@ public class GAlignFrame extends JInternalFrame
     {
 
       // for Web-page embedding using id=align-frame-div
-      setName("jalview-alignment");
+      setName(Jalview.getAppID("alignment"));
 
       jbInit();
       setJMenuBar(alignFrameMenuBar);
@@ -276,14 +278,14 @@ public class GAlignFrame extends JInternalFrame
 
     // FIXME getDefaultToolkit throws an exception in Headless mode
     KeyStroke keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_S,
-            jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx()
-                    | jalview.util.ShortcutKeyMaskExWrapper.SHIFT_DOWN_MASK,
+            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()
+                    | KeyEvent.SHIFT_MASK,
             false);
     addMenuActionAndAccelerator(keyStroke, saveAs, al);
 
     closeMenuItem.setText(MessageManager.getString("action.close"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_W,
-            jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false);
+            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
     al = new ActionListener()
     {
       @Override
@@ -306,7 +308,7 @@ public class GAlignFrame extends JInternalFrame
     JMenuItem selectAllSequenceMenuItem = new JMenuItem(
             MessageManager.getString("action.select_all"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_A,
-            jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false);
+            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
     al = new ActionListener()
     {
       @Override
@@ -333,7 +335,7 @@ public class GAlignFrame extends JInternalFrame
     JMenuItem invertSequenceMenuItem = new JMenuItem(
             MessageManager.getString("action.invert_sequence_selection"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_I,
-            jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false);
+            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
     al = new ActionListener()
     {
       @Override
@@ -369,7 +371,7 @@ public class GAlignFrame extends JInternalFrame
     JMenuItem remove2LeftMenuItem = new JMenuItem(
             MessageManager.getString("action.remove_left"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_L,
-            jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false);
+            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
     al = new ActionListener()
     {
       @Override
@@ -383,7 +385,7 @@ public class GAlignFrame extends JInternalFrame
     JMenuItem remove2RightMenuItem = new JMenuItem(
             MessageManager.getString("action.remove_right"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_R,
-            jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false);
+            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
     al = new ActionListener()
     {
       @Override
@@ -397,7 +399,7 @@ public class GAlignFrame extends JInternalFrame
     JMenuItem removeGappedColumnMenuItem = new JMenuItem(
             MessageManager.getString("action.remove_empty_columns"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_E,
-            jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false);
+            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
     al = new ActionListener()
     {
       @Override
@@ -411,8 +413,8 @@ public class GAlignFrame extends JInternalFrame
     JMenuItem removeAllGapsMenuItem = new JMenuItem(
             MessageManager.getString("action.remove_all_gaps"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_E,
-            jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx()
-                    | jalview.util.ShortcutKeyMaskExWrapper.SHIFT_DOWN_MASK,
+            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()
+                    | KeyEvent.SHIFT_MASK,
             false);
     al = new ActionListener()
     {
@@ -519,7 +521,7 @@ public class GAlignFrame extends JInternalFrame
     JMenuItem removeRedundancyMenuItem = new JMenuItem(
             MessageManager.getString("action.remove_redundancy"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_D,
-            jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false);
+            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
     al = new ActionListener()
     {
       @Override
@@ -543,7 +545,11 @@ public class GAlignFrame extends JInternalFrame
 
     this.getContentPane().setLayout(new BorderLayout());
     alignFrameMenuBar.setFont(new java.awt.Font("Verdana", 0, 11));
-    statusBar.setBackground(Color.white);
+    // statusBar.setBackground(Color.white); BH 2019.08.01 -- this does nothing,
+    // as the label is not opaque
+    statusBar.setOpaque(true);// BH 2019.07.01 -- setting a label opaque avoids
+                              // frame repaint in SwingJS and has no effect in
+                              // Java
     statusBar.setFont(new java.awt.Font("Verdana", 0, 11));
     statusBar.setBorder(BorderFactory.createLineBorder(Color.black));
     statusBar.setText(MessageManager.getString("label.status_bar"));
@@ -554,7 +560,7 @@ public class GAlignFrame extends JInternalFrame
     annotationPanelMenuItem
             .setText(MessageManager.getString("label.show_annotations"));
     annotationPanelMenuItem
-            .setState(Cache.getDefault("SHOW_ANNOTATIONS", true));
+            .setState(Cache.getDefault(Preferences.SHOW_ANNOTATIONS, true));
     annotationPanelMenuItem.addActionListener(new ActionListener()
     {
       @Override
@@ -694,7 +700,7 @@ public class GAlignFrame extends JInternalFrame
     undoMenuItem.setEnabled(false);
     undoMenuItem.setText(MessageManager.getString("action.undo"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_Z,
-            jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false);
+            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
     al = new ActionListener()
     {
       @Override
@@ -708,7 +714,7 @@ public class GAlignFrame extends JInternalFrame
     redoMenuItem.setEnabled(false);
     redoMenuItem.setText(MessageManager.getString("action.redo"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_Y,
-            jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false);
+            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
     al = new ActionListener()
     {
       @Override
@@ -732,7 +738,7 @@ public class GAlignFrame extends JInternalFrame
     JMenuItem printMenuItem = new JMenuItem(
             MessageManager.getString("action.print"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_P,
-            jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false);
+            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
     al = new ActionListener()
     {
       @Override
@@ -758,7 +764,7 @@ public class GAlignFrame extends JInternalFrame
     JMenuItem findMenuItem = new JMenuItem(
             MessageManager.getString("action.find"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_F,
-            jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false);
+            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
     findMenuItem.setToolTipText(JvSwingUtils.wrapTooltip(true,
             MessageManager.getString("label.find_tip")));
     al = new ActionListener()
@@ -919,7 +925,7 @@ public class GAlignFrame extends JInternalFrame
     JMenuItem deleteGroups = new JMenuItem(
             MessageManager.getString("action.undefine_groups"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_U,
-            jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false);
+            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
     al = new ActionListener()
     {
       @Override
@@ -944,7 +950,7 @@ public class GAlignFrame extends JInternalFrame
     JMenuItem createGroup = new JMenuItem(
             MessageManager.getString("action.create_group"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_G,
-            jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false);
+            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
     al = new ActionListener()
     {
       @Override
@@ -958,8 +964,8 @@ public class GAlignFrame extends JInternalFrame
     JMenuItem unGroup = new JMenuItem(
             MessageManager.getString("action.remove_group"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_G,
-            jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx()
-                    | jalview.util.ShortcutKeyMaskExWrapper.SHIFT_DOWN_MASK,
+            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()
+                    | KeyEvent.SHIFT_MASK,
             false);
     al = new ActionListener()
     {
@@ -973,7 +979,7 @@ public class GAlignFrame extends JInternalFrame
 
     copy.setText(MessageManager.getString("action.copy"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_C,
-            jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false);
+            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
 
     al = new ActionListener()
     {
@@ -987,7 +993,7 @@ public class GAlignFrame extends JInternalFrame
 
     cut.setText(MessageManager.getString("action.cut"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_X,
-            jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false);
+            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
     al = new ActionListener()
     {
       @Override
@@ -1013,8 +1019,8 @@ public class GAlignFrame extends JInternalFrame
     JMenuItem pasteNew = new JMenuItem(
             MessageManager.getString("label.to_new_alignment"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_V,
-            jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx()
-                    | jalview.util.ShortcutKeyMaskExWrapper.SHIFT_DOWN_MASK,
+            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()
+                    | KeyEvent.SHIFT_MASK,
             false);
     al = new ActionListener()
     {
@@ -1029,7 +1035,7 @@ public class GAlignFrame extends JInternalFrame
     JMenuItem pasteThis = new JMenuItem(
             MessageManager.getString("label.to_this_alignment"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_V,
-            jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false);
+            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
     al = new ActionListener()
     {
       @Override
@@ -1063,7 +1069,7 @@ public class GAlignFrame extends JInternalFrame
     });
     seqLimits.setText(
             MessageManager.getString("label.show_sequence_limits"));
-    seqLimits.setState(jalview.bin.Cache.getDefault("SHOW_JVSUFFIX", true));
+    seqLimits.setState(jalview.bin.Cache.getDefault(Preferences.SHOW_JVSUFFIX, true));
     seqLimits.addActionListener(new ActionListener()
     {
       @Override
@@ -1214,7 +1220,7 @@ public class GAlignFrame extends JInternalFrame
 
     padGapsMenuitem.setText(MessageManager.getString("label.pad_gaps"));
     padGapsMenuitem
-            .setState(jalview.bin.Cache.getDefault("PAD_GAPS", false));
+            .setState(jalview.bin.Cache.getDefault(Preferences.PAD_GAPS, false));
     padGapsMenuitem.addActionListener(new ActionListener()
     {
       @Override
@@ -1241,8 +1247,7 @@ public class GAlignFrame extends JInternalFrame
     showTranslation
             .setText(MessageManager.getString("label.translate_cDNA"));
     boolean first = true;
-    for (final GeneticCodeI table : GeneticCodes.getInstance()
-            .getCodeTables())
+    for (final GeneticCodeI table : GeneticCodes.getCodeTables())
     {
       JMenuItem item = new JMenuItem(table.getId() + " " + table.getName());
       showTranslation.add(item);
@@ -1358,7 +1363,7 @@ public class GAlignFrame extends JInternalFrame
     autoCalculate.setText(
             MessageManager.getString("label.autocalculate_consensus"));
     autoCalculate.setState(
-            jalview.bin.Cache.getDefault("AUTO_CALC_CONSENSUS", true));
+            jalview.bin.Cache.getDefault(Preferences.AUTO_CALC_CONSENSUS, true));
     autoCalculate.addActionListener(new ActionListener()
     {
       @Override
@@ -1372,7 +1377,8 @@ public class GAlignFrame extends JInternalFrame
     sortByTree.setToolTipText("<html>" + MessageManager.getString(
             "label.enable_automatically_sort_alignment_when_open_new_tree"));
     sortByTree
-            .setState(jalview.bin.Cache.getDefault("SORT_BY_TREE", false));
+            .setState(jalview.bin.Cache.getDefault(Preferences.SORT_BY_TREE,
+                    false));
     sortByTree.addActionListener(new ActionListener()
     {
       @Override
@@ -1546,8 +1552,8 @@ public class GAlignFrame extends JInternalFrame
     JMenuItem invertColSel = new JMenuItem(
             MessageManager.getString("action.invert_column_selection"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_I,
-            jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx()
-                    | jalview.util.ShortcutKeyMaskExWrapper.ALT_DOWN_MASK,
+            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()
+                    | KeyEvent.ALT_MASK,
             false);
     al = new ActionListener()
     {
@@ -1610,7 +1616,7 @@ public class GAlignFrame extends JInternalFrame
 
     JMenuItem save = new JMenuItem(MessageManager.getString("action.save"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_S,
-            jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false);
+            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
     al = new ActionListener()
     {
       @Override
@@ -1635,7 +1641,7 @@ public class GAlignFrame extends JInternalFrame
     JMenuItem newView = new JMenuItem(
             MessageManager.getString("action.new_view"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_T,
-            jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false);
+            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
     al = new ActionListener()
     {
       @Override
index b703b47..3dd0205 100755 (executable)
@@ -123,6 +123,7 @@ public class GAlignmentPanel extends JPanel
     hscrollFillerPanel.setPreferredSize(new Dimension(70, 10));
     hscrollHolder.setBackground(Color.white);
     annotationScroller.setBorder(null);
+    annotationScroller.setBackground(Color.BLUE);
     annotationScroller.setPreferredSize(new Dimension(10, 80));
     this.setPreferredSize(new Dimension(220, 166));
 
index 3f0df21..a6e0ace 100644 (file)
@@ -22,10 +22,10 @@ package jalview.jbgui;
 
 import jalview.gui.JvSwingUtils;
 import jalview.util.MessageManager;
-import jalview.util.ShortcutKeyMaskExWrapper;
 
 import java.awt.BorderLayout;
 import java.awt.Font;
+import java.awt.Toolkit;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.MouseEvent;
@@ -136,11 +136,11 @@ public class GCutAndPasteHtmlTransfer extends JInternalFrame
     });
     close.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
             java.awt.event.KeyEvent.VK_W,
-            ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false));
+            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false));
     selectAll.setText(MessageManager.getString("action.select_all"));
     selectAll.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
             java.awt.event.KeyEvent.VK_A,
-            ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false));
+            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false));
     selectAll.addActionListener(new ActionListener()
     {
       @Override
@@ -153,7 +153,7 @@ public class GCutAndPasteHtmlTransfer extends JInternalFrame
     save.setText(MessageManager.getString("action.save"));
     save.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
             java.awt.event.KeyEvent.VK_S,
-            ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false));
+            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false));
     save.addActionListener(new ActionListener()
     {
       @Override
@@ -164,7 +164,7 @@ public class GCutAndPasteHtmlTransfer extends JInternalFrame
     });
     copyItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
             java.awt.event.KeyEvent.VK_C,
-            ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false));
+            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false));
 
     editMenubar.add(jMenu1);
     editMenubar.add(editMenu);
index 94a4677..97ac840 100755 (executable)
@@ -123,7 +123,7 @@ public class GCutAndPasteTransfer extends JInternalFrame
     selectAll.setText(MessageManager.getString("action.select_all"));
     selectAll.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
             java.awt.event.KeyEvent.VK_A,
-            jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false));
+            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false));
     selectAll.addActionListener(new ActionListener()
     {
       @Override
@@ -136,7 +136,7 @@ public class GCutAndPasteTransfer extends JInternalFrame
     save.setText(MessageManager.getString("action.save"));
     save.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
             java.awt.event.KeyEvent.VK_S,
-            jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false));
+            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false));
     save.addActionListener(new ActionListener()
     {
       @Override
@@ -147,10 +147,10 @@ public class GCutAndPasteTransfer extends JInternalFrame
     });
     copyItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
             java.awt.event.KeyEvent.VK_C,
-            jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false));
+            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false));
     pasteMenu.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
             java.awt.event.KeyEvent.VK_V,
-            jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false));
+            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false));
     editMenubar.add(jMenu1);
     editMenubar.add(editMenu);
     textarea.setFont(new java.awt.Font("Monospaced", Font.PLAIN, 12));
index cd64e7b..051bac7 100755 (executable)
 package jalview.jbgui;
 
 import jalview.api.AlignmentViewPanel;
+import jalview.bin.Jalview;
 import jalview.io.FileFormatException;
 import jalview.util.MessageManager;
 import jalview.util.Platform;
 
 import java.awt.FlowLayout;
+import java.awt.Toolkit;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 
@@ -36,16 +38,14 @@ import javax.swing.JMenuBar;
 import javax.swing.JMenuItem;
 
 /**
- * DOCUMENT ME!
+ * abstract class super to jalview.gui.Desktop
  * 
- * @author $author$
- * @version $Revision$
  */
 @SuppressWarnings("serial")
-public class GDesktop extends JFrame
+public abstract class GDesktop extends JFrame
 {
 
-  protected static JMenu windowMenu = new JMenu();
+  public JMenu windowMenu = new JMenu(); // BH 2019.05.07 was static
 
   JMenuBar desktopMenubar = new JMenuBar();
 
@@ -109,7 +109,7 @@ public class GDesktop extends JFrame
 
   protected JCheckBoxMenuItem showConsole = new JCheckBoxMenuItem();
 
-  protected JCheckBoxMenuItem showNews = new JCheckBoxMenuItem();
+  public JCheckBoxMenuItem showNews = new JCheckBoxMenuItem();
 
   protected JMenuItem snapShotWindow = new JMenuItem();
 
@@ -118,7 +118,6 @@ public class GDesktop extends JFrame
    */
   public GDesktop()
   {
-    super();
     try
     {
       jbInit();
@@ -152,7 +151,7 @@ public class GDesktop extends JFrame
    */
   private void jbInit() throws Exception
   {
-    setName("jalview-desktop");
+    setName(Jalview.getAppID("desktop"));
     FileMenu.setText(MessageManager.getString("action.file"));
     HelpMenu.setText(MessageManager.getString("action.help"));
     VamsasMenu.setText("Vamsas");
@@ -165,7 +164,7 @@ public class GDesktop extends JFrame
             .setText(MessageManager.getString("label.load_tree_from_file"));
     inputLocalFileMenuItem.setAccelerator(
             javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_O,
-                    jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(),
+                    Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(),
                     false));
     inputLocalFileMenuItem
             .addActionListener(new java.awt.event.ActionListener()
@@ -429,8 +428,6 @@ public class GDesktop extends JFrame
       }
     });
 
-    Float specversion = Float.parseFloat(System.getProperty("java.specification.version"));
-    
     desktopMenubar.add(FileMenu);
     desktopMenubar.add(toolsMenu);
     VamsasMenu.setVisible(false);
@@ -440,7 +437,7 @@ public class GDesktop extends JFrame
     FileMenu.add(inputMenu);
     FileMenu.add(inputSequence);
     FileMenu.addSeparator();
-    //FileMenu.add(saveState);
+    FileMenu.add(saveState);
     FileMenu.add(saveAsState);
     FileMenu.add(loadState);
     FileMenu.addSeparator();
@@ -453,14 +450,14 @@ public class GDesktop extends JFrame
     VamsasMenu.add(vamsasImport);
     VamsasMenu.add(vamsasSave);
     VamsasMenu.add(vamsasStop);
-    if (!Platform.isMac() || specversion < 11)
-    {
-      toolsMenu.add(preferences);
-    }
+    toolsMenu.add(preferences);
     if (!Platform.isJS())
     {
       toolsMenu.add(showMemusage);
       toolsMenu.add(showConsole);
+    }
+    if (!Platform.isJS())
+    {
       toolsMenu.add(showNews);
       toolsMenu.add(garbageCollect);
       toolsMenu.add(groovyShell);
@@ -562,7 +559,6 @@ public class GDesktop extends JFrame
    */
   protected void quit()
   {
-    //System.out.println("********** GDesktop.quit()");
   }
 
   /**
index a6498d2..04aab37 100755 (executable)
@@ -20,6 +20,7 @@
  */
 package jalview.jbgui;
 
+import jalview.bin.Jalview;
 import jalview.util.ImageMaker.TYPE;
 import jalview.util.MessageManager;
 
@@ -88,8 +89,8 @@ public class GPCAPanel extends JInternalFrame
 
   private void jbInit() throws Exception
   {
-    setName("jalview-pca");
-    this.getContentPane().setLayout(new BorderLayout());
+    setName(Jalview.getAppID("pca"));
+    getContentPane().setLayout(new BorderLayout());
     JPanel jPanel2 = new JPanel();
     jPanel2.setLayout(new FlowLayout());
     JLabel jLabel1 = new JLabel();
index 9327569..7784cf4 100755 (executable)
@@ -31,8 +31,6 @@ import jalview.gui.JvSwingUtils;
 import jalview.gui.StructureViewer.ViewerType;
 import jalview.io.BackupFilenameParts;
 import jalview.io.BackupFiles;
-import jalview.io.BackupFilesPresetEntry;
-import jalview.io.IntKeyStringValueEntry;
 import jalview.util.MessageManager;
 import jalview.util.Platform;
 
@@ -54,8 +52,8 @@ import java.awt.event.KeyEvent;
 import java.awt.event.KeyListener;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
-import java.util.Arrays;
-import java.util.List;
+import java.util.HashMap;
+import java.util.Map;
 
 import javax.swing.AbstractCellEditor;
 import javax.swing.BorderFactory;
@@ -66,6 +64,7 @@ import javax.swing.JCheckBox;
 import javax.swing.JComboBox;
 import javax.swing.JFileChooser;
 import javax.swing.JLabel;
+import javax.swing.JList;
 import javax.swing.JPanel;
 import javax.swing.JRadioButton;
 import javax.swing.JScrollPane;
@@ -93,6 +92,7 @@ import javax.swing.table.TableCellRenderer;
  * @author $author$
  * @version $Revision$
  */
+@SuppressWarnings("serial")
 public class GPreferences extends JPanel
 {
   private static final Font LABEL_FONT = JvSwingUtils.getLabelFont();
@@ -180,6 +180,8 @@ public class GPreferences extends JPanel
 
   protected JComboBox<String> structViewer = new JComboBox<>();
 
+  protected JTextField structureDimensions = new JTextField();
+
   protected JTextField chimeraPath = new JTextField();
 
   protected ButtonGroup mappingMethod = new ButtonGroup();
@@ -215,13 +217,13 @@ public class GPreferences extends JPanel
   /*
    * Connections tab components
    */
-  protected JTable linkUrlTable = new JTable();
+  public JTable linkUrlTable = new JTable();
 
-  protected JButton editLink = new JButton();
+  public JButton editLink = new JButton();
 
-  protected JButton deleteLink = new JButton();
+  public JButton deleteLink = new JButton();
 
-  protected JTextField filterTB = new JTextField();
+  public JTextField filterTB = new JTextField();
 
   protected JButton doReset = new JButton();
 
@@ -302,15 +304,9 @@ public class GPreferences extends JPanel
 
   protected JPanel presetsPanel = new JPanel();
 
-  protected JLabel presetsComboLabel = new JLabel();
-
-  protected JCheckBox customiseCheckbox = new JCheckBox();
-
   protected JButton revertButton = new JButton();
 
-  protected JComboBox<Object> backupfilesPresetsCombo = new JComboBox<>();
-
-  private int backupfilesPresetsComboLastSelected = 0;
+  protected JComboBox<IntKeyStringValueEntry> backupfilesPresetsCombo = new JComboBox<>();
 
   protected JPanel suffixPanel = new JPanel();
 
@@ -380,11 +376,11 @@ public class GPreferences extends JPanel
     tabbedPane.add(initConnectionsTab(),
             MessageManager.getString("label.connections"));
 
-    if (!Platform.isJS())
-    {
-      tabbedPane.add(initBackupsTab(),
-              MessageManager.getString("label.backups"));
-    }
+       if (!Platform.isJS()) 
+       {
+         tabbedPane.add(initBackupsTab(), 
+                       MessageManager.getString("label.backups"));
+       }
 
     tabbedPane.add(initLinksTab(),
             MessageManager.getString("label.urllinks"));
@@ -1287,6 +1283,7 @@ public class GPreferences extends JPanel
     structViewer.addItem(ViewerType.JMOL.name());
     structViewer.addItem(ViewerType.CHIMERA.name());
     structViewer.addActionListener(new ActionListener()
+
     {
       @Override
       public void actionPerformed(ActionEvent e)
@@ -1297,6 +1294,20 @@ public class GPreferences extends JPanel
     });
     structureTab.add(structViewer);
 
+    // BH 2019.07.12
+    ypos += lineSpacing;
+    JLabel dimLabel = new JLabel();
+    dimLabel.setFont(new java.awt.Font("SansSerif", 0, 11));
+    dimLabel.setHorizontalAlignment(SwingConstants.LEFT);
+    dimLabel.setText(
+            MessageManager.getString("label.structure_dimensions"));
+    dimLabel.setBounds(new Rectangle(10, ypos, 140, height));
+    structureTab.add(dimLabel);
+
+    structureDimensions.setFont(LABEL_FONT);
+    structureDimensions.setBounds(new Rectangle(160, ypos, 120, height));
+    structureTab.add(structureDimensions);
+
     ypos += lineSpacing;
     JLabel pathLabel = new JLabel();
     pathLabel.setFont(new java.awt.Font("SansSerif", 0, 11));
@@ -1758,41 +1769,34 @@ public class GPreferences extends JPanel
 
   protected void loadLastSavedBackupsOptions()
   {
-    BackupFilesPresetEntry savedPreset = BackupFilesPresetEntry
-            .getSavedBackupEntry();
     enableBackupFiles
-            .setSelected(Cache.getDefault(BackupFiles.ENABLED,
-                    !Platform.isJS()));
-
-    BackupFilesPresetEntry backupfilesCustomEntry = BackupFilesPresetEntry
-            .createBackupFilesPresetEntry(Cache
-                    .getDefault(BackupFilesPresetEntry.CUSTOMCONFIG, null));
-    if (backupfilesCustomEntry == null)
-    {
-      backupfilesCustomEntry = BackupFilesPresetEntry.backupfilesPresetEntriesValues
-              .get(BackupFilesPresetEntry.BACKUPFILESSCHEMEDEFAULT);
-    }
-    BackupFilesPresetEntry.backupfilesPresetEntriesValues.put(
-            BackupFilesPresetEntry.BACKUPFILESSCHEMECUSTOM,
-            backupfilesCustomEntry);
-
+            .setSelected(Cache.getDefault(BackupFiles.ENABLED, !Platform.isJS()));
     setComboIntStringKey(backupfilesPresetsCombo,
-            Cache.getDefault(BackupFiles.NS + "_PRESET",
-                    BackupFilesPresetEntry.BACKUPFILESSCHEMEDEFAULT));
-
-    backupsSetOptions(savedPreset);
+            Cache.getDefault(BackupFiles.NS + "_PRESET", 1));
+    suffixTemplate.setText(Cache.getDefault(BackupFiles.SUFFIX,
+            ".bak" + BackupFiles.NUM_PLACEHOLDER));
+    suffixDigitsSpinner
+            .setValue(Cache.getDefault(BackupFiles.SUFFIX_DIGITS, 3));
+    suffixReverse.setSelected(
+            Cache.getDefault(BackupFiles.REVERSE_ORDER, false));
+    backupfilesKeepAll
+            .setSelected(Cache.getDefault(BackupFiles.NO_MAX, false));
+    backupfilesRollMaxSpinner
+            .setValue(Cache.getDefault(BackupFiles.ROLL_MAX, 3));
+    backupfilesConfirmDelete.setSelected(
+            Cache.getDefault(BackupFiles.CONFIRM_DELETE_OLD, true));
 
     backupsOptionsSetEnabled();
     updateBackupFilesExampleLabel();
   }
 
-  private boolean warnAboutSuffixReverseChange()
+  protected boolean warnAboutSuffixReverseChange()
   {
-    BackupFilesPresetEntry bfpe = BackupFilesPresetEntry
-            .getSavedBackupEntry();
-    boolean savedSuffixReverse = bfpe.reverse;
-    int savedSuffixDigits = bfpe.digits;
-    String savedSuffixTemplate = bfpe.suffix;
+    boolean savedSuffixReverse = Cache.getDefault(BackupFiles.REVERSE_ORDER,
+            false);
+    int savedSuffixDigits = Cache.getDefault(BackupFiles.SUFFIX_DIGITS, 3);
+    String savedSuffixTemplate = Cache.getDefault(BackupFiles.SUFFIX,
+            ".bak" + BackupFiles.NUM_PLACEHOLDER);
 
     boolean nowSuffixReverse = suffixReverse.isSelected();
     int nowSuffixDigits = getSpinnerInt(suffixDigitsSpinner, 3);
@@ -1869,6 +1873,7 @@ public class GPreferences extends JPanel
     gbc.gridy++; // row 1
     backupsTab.add(presetsPanel, gbc);
 
+    // gbc.anchor = GridBagConstraints.NORTHWEST;
     // now using whole row
     gbc.gridwidth = 2;
     gbc.gridheight = 1;
@@ -1890,10 +1895,50 @@ public class GPreferences extends JPanel
     return backupsTab;
   }
 
+  protected static final int BACKUPFILESSCHEMECUSTOMISE = 0;
+
+  private static final IntKeyStringValueEntry[] backupfilesPresetEntries = {
+      new IntKeyStringValueEntry(1,
+              MessageManager.getString("label.default")),
+      new IntKeyStringValueEntry(2,
+              MessageManager.getString("label.single_file")),
+      new IntKeyStringValueEntry(3,
+              MessageManager.getString("label.keep_all_versions")),
+      new IntKeyStringValueEntry(4,
+              MessageManager.getString("label.rolled_backups")),
+      // ...
+      // IMPORTANT, keep "Custom" entry with key 0 (even though it appears last)
+      new IntKeyStringValueEntry(BACKUPFILESSCHEMECUSTOMISE,
+              MessageManager.getString("label.customise")) };
+
+  private static final Map<Integer, BackupFilesPresetEntry> backupfilesPresetEntriesValues = new HashMap<Integer, BackupFilesPresetEntry>()
+  {
+    /**
+     * 
+     */
+    private static final long serialVersionUID = 125L;
+
+    {
+      put(1, new BackupFilesPresetEntry(
+              ".bak" + BackupFiles.NUM_PLACEHOLDER, 3, false, false, 3,
+              false));
+      put(2, new BackupFilesPresetEntry("~", 1, false, false, 1, false));
+      put(3, new BackupFilesPresetEntry(".v" + BackupFiles.NUM_PLACEHOLDER,
+              3, false, true, 10, true));
+      put(4, new BackupFilesPresetEntry(
+              "_bak." + BackupFiles.NUM_PLACEHOLDER, 1, true, false, 9,
+              false));
+    }
+  };
+
   private JPanel initBackupsTabPresetsPanel()
   {
 
     String title = MessageManager.getString("label.schemes");
+    // TitledBorder tb = new TitledBorder(new EmptyBorder(0, 0, 0, 0), title);
+    // TitledBorder tb = new TitledBorder(title);
+    // tb.setTitleFont(LABEL_FONT);
+    // presetsPanel.setBorder(tb);
 
     presetsPanel.setLayout(new GridBagLayout());
 
@@ -1908,53 +1953,24 @@ public class GPreferences extends JPanel
     // "Scheme: "
     gbc.gridx = 0;
     gbc.gridy = 0;
+    presetsPanel.add(new JLabel(title + ":"), gbc);
 
-    presetsComboLabel = new JLabel(title + ":");
-    presetsPanel.add(presetsComboLabel, gbc);
-
-    List<Object> entries = Arrays
-            .asList((Object[]) BackupFilesPresetEntry.backupfilesPresetEntries);
-    List<String> tooltips = Arrays.asList(
-            BackupFilesPresetEntry.backupfilesPresetEntryDescriptions);
-    backupfilesPresetsCombo = JvSwingUtils.buildComboWithTooltips(entries,
-            tooltips);
-    /*
-    for (int i = 0; i < BackupFilesPresetEntry.backupfilesPresetEntries.length; i++)
+    for (int i = 0; i < backupfilesPresetEntries.length; i++)
     {
-      backupfilesPresetsCombo
-              .addItem(BackupFilesPresetEntry.backupfilesPresetEntries[i]);
+      backupfilesPresetsCombo.addItem(backupfilesPresetEntries[i]);
     }
-    */
 
+    // put "Previously saved scheme" item in italics (it's not really
+    // selectable, as such -- it deselects itself when selected) and
+    // "Customise" in bold
+    backupfilesPresetsCombo
+            .setRenderer(new BackupFilesPresetsComboBoxRenderer());
     backupfilesPresetsCombo.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
       {
-        int key = getComboIntStringKey(backupfilesPresetsCombo);
-        if (!customiseCheckbox.isSelected())
-        {
-          backupfilesPresetsComboLastSelected = key;
-        }
-        if (key == BackupFilesPresetEntry.BACKUPFILESSCHEMECUSTOM)
-        {
-          if (customiseCheckbox.isSelected())
-          {
-            // got here by clicking on customiseCheckbox so don't change the values
-            backupfilesCustomOptionsSetEnabled();
-          }
-          else
-          {
-            backupsTabUpdatePresets();
-            backupfilesCustomOptionsSetEnabled();
-          }
-        }
-        else
-        {
-          customiseCheckbox.setSelected(false);
-          backupsTabUpdatePresets();
-          backupfilesCustomOptionsSetEnabled();
-        }
+        backupsTabUpdatePresets();
       }
     });
 
@@ -1963,55 +1979,20 @@ public class GPreferences extends JPanel
     presetsPanel.add(backupfilesPresetsCombo, gbc);
 
     revertButton.setText(MessageManager.getString("label.cancel_changes"));
-    revertButton.setToolTipText(
-            MessageManager.getString("label.cancel_changes_description"));
     revertButton.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
       {
-        backupsSetOptions(
-                BackupFilesPresetEntry.backupfilesPresetEntriesValues.get(
-                        BackupFilesPresetEntry.BACKUPFILESSCHEMECUSTOM));
-        backupfilesCustomOptionsSetEnabled();
+        loadLastSavedBackupsOptions();
       }
 
     });
     revertButton.setFont(LABEL_FONT);
 
-    customiseCheckbox.setFont(LABEL_FONT);
-    customiseCheckbox.setText(MessageManager.getString("label.customise"));
-    customiseCheckbox.addActionListener(new ActionListener()
-    {
-      @Override
-      public void actionPerformed(ActionEvent e)
-      {
-        int currently = getComboIntStringKey(backupfilesPresetsCombo);
-        if (customiseCheckbox.isSelected())
-        {
-          backupfilesPresetsComboLastSelected = currently;
-          setComboIntStringKey(backupfilesPresetsCombo,
-                  BackupFilesPresetEntry.BACKUPFILESSCHEMECUSTOM);
-        }
-        else
-        {
-          setComboIntStringKey(backupfilesPresetsCombo,
-                  backupfilesPresetsComboLastSelected);
-
-        }
-        backupfilesCustomOptionsSetEnabled();
-      }
-    });
-    customiseCheckbox.setToolTipText(
-            MessageManager.getString("label.customise_description"));
-
-    // customise checkbox
-    gbc.gridx = 0;
-    gbc.gridy++;
-    presetsPanel.add(customiseCheckbox, gbc);
-
     // "Cancel changes" button (aligned with combo box above)
     gbc.gridx = 1;
+    gbc.gridy++;
     presetsPanel.add(revertButton, gbc);
 
     return presetsPanel;
@@ -2020,7 +2001,7 @@ public class GPreferences extends JPanel
   private JPanel initBackupsTabFilenameExamplesPanel()
   {
     String title = MessageManager
-            .getString("label.scheme_examples");
+            .getString("label.summary_of_backups_scheme");
     TitledBorder tb = new TitledBorder(title);
     exampleFilesPanel.setBorder(tb);
     exampleFilesPanel.setLayout(new GridBagLayout());
@@ -2042,72 +2023,49 @@ public class GPreferences extends JPanel
     return exampleFilesPanel;
   }
 
-  private void backupsTabUpdatePresets()
+  protected void backupsTabUpdatePresets()
   {
     IntKeyStringValueEntry entry = (IntKeyStringValueEntry) backupfilesPresetsCombo
             .getSelectedItem();
-    int key = entry.k;
-    String value = entry.v;
+    int key = entry.getKey();
+    String value = entry.getValue();
 
-    if (BackupFilesPresetEntry.backupfilesPresetEntriesValues
-            .containsKey(key))
+    // BACKUPFILESSCHEMECUSTOMISE (==0) reserved for "Custom"
+    if (key != BACKUPFILESSCHEMECUSTOMISE)
     {
-      backupsSetOptions(
-              BackupFilesPresetEntry.backupfilesPresetEntriesValues
-                      .get(key));
-    }
-    else
-    {
-      Cache.log.error(
-              "Preset '" + value + "' [key:" + key + "] not implemented");
+      if (backupfilesPresetEntriesValues.containsKey(key))
+      {
+        backupsSetOptions(backupfilesPresetEntriesValues.get(key));
+      }
+      else
+      {
+        System.out.println("Preset '" + value + "' not implemented");
+      }
     }
 
-    // Custom options will now be enabled when the customiseCheckbox is checked
-    // (performed above)
-    // backupfilesCustomOptionsSetEnabled();
+    backupfilesCustomOptionsSetEnabled();
     updateBackupFilesExampleLabel();
   }
 
-  protected int getComboIntStringKey(
-          JComboBox<Object> backupfilesPresetsCombo2)
+  protected int getComboIntStringKey(JComboBox<IntKeyStringValueEntry> c)
   {
-    IntKeyStringValueEntry e;
-    try
-    {
-      e = (IntKeyStringValueEntry) backupfilesPresetsCombo2
-              .getSelectedItem();
-    } catch (Exception ex)
-    {
-      Cache.log.error(
-              "Problem casting Combo entry to IntKeyStringValueEntry.");
-      e = null;
-    }
-    return e != null ? e.k : 0;
+    IntKeyStringValueEntry e = (IntKeyStringValueEntry) c.getSelectedItem();
+    return e != null ? e.getKey() : 0;
   }
 
-  protected void setComboIntStringKey(
-          JComboBox<Object> backupfilesPresetsCombo2,
+  protected void setComboIntStringKey(JComboBox<IntKeyStringValueEntry> c,
           int key)
   {
-    for (int i = 0; i < backupfilesPresetsCombo2.getItemCount(); i++)
+    for (int i = 0; i < c.getItemCount(); i++)
     {
-      IntKeyStringValueEntry e;
-      try
-      {
-        e = (IntKeyStringValueEntry) backupfilesPresetsCombo2.getItemAt(i);
-      } catch (Exception ex)
-      {
-        Cache.log.error(
-                "Problem casting Combo entry to IntKeyStringValueEntry. Skipping item. ");
-        continue;
-      }
-      if (e.k == key)
+      IntKeyStringValueEntry e = c.getItemAt(i);
+      if (e.getKey() == key)
       {
-        backupfilesPresetsCombo2.setSelectedIndex(i);
+        c.setSelectedIndex(i);
         break;
       }
     }
-    // backupsTabUpdatePresets();
+    backupsTabUpdatePresets();
   }
 
   private JPanel initBackupsTabSuffixPanel()
@@ -2131,18 +2089,16 @@ public class GPreferences extends JPanel
       {
         updateBackupFilesExampleLabel();
         backupfilesCustomOptionsSetEnabled();
-        backupfilesRevertButtonSetEnabled(true);
       }
 
     });
-    suffixTemplate.addKeyListener(new KeyListener()
+    KeyListener kl = new KeyListener()
     {
       @Override
       public void keyReleased(KeyEvent e)
       {
         updateBackupFilesExampleLabel();
         backupfilesCustomOptionsSetEnabled();
-        backupfilesRevertButtonSetEnabled(true);
       }
 
       @Override
@@ -2162,25 +2118,26 @@ public class GPreferences extends JPanel
         }
       }
 
-    });
+    };
+    suffixTemplate.addKeyListener(kl);
 
     // digits spinner
     suffixDigitsLabel
             .setText(MessageManager.getString("label.index_digits"));
     suffixDigitsLabel.setHorizontalAlignment(SwingConstants.LEFT);
     suffixDigitsLabel.setFont(LABEL_FONT);
+    int defaultmin = 1;
+    int defaultmax = 6;
     ChangeListener c = new ChangeListener()
     {
       @Override
       public void stateChanged(ChangeEvent e)
       {
-        backupfilesRevertButtonSetEnabled(true);
         updateBackupFilesExampleLabel();
       }
 
     };
-    setIntegerSpinner(suffixDigitsSpinner, BackupFilesPresetEntry.DIGITSMIN,
-            BackupFilesPresetEntry.DIGITSMAX, 3, c);
+    setIntegerSpinner(suffixDigitsSpinner, defaultmin, defaultmax, 3, c);
 
     suffixReverse.setLabels(MessageManager.getString("label.reverse_roll"),
             MessageManager.getString("label.increment_index"));
@@ -2197,13 +2154,12 @@ public class GPreferences extends JPanel
         }
         if (okay)
         {
-          backupfilesRevertButtonSetEnabled(true);
           updateBackupFilesExampleLabel();
         }
         else
         {
-          boolean savedSuffixReverse = BackupFilesPresetEntry
-                  .getSavedBackupEntry().reverse;
+          boolean savedSuffixReverse = Cache
+                  .getDefault(BackupFiles.REVERSE_ORDER, false);
           suffixReverse.setSelected(savedSuffixReverse);
         }
       }
@@ -2250,12 +2206,12 @@ public class GPreferences extends JPanel
     return suffixPanel;
   }
 
-  private boolean confirmSuffixReverseChange()
+  protected boolean confirmSuffixReverseChange()
   {
     boolean ret = false;
     String warningMessage = MessageManager
             .getString("label.warning_confirm_change_reverse");
-    int confirm = JvOptionPane.showConfirmDialog(Desktop.desktop,
+    int confirm = JvOptionPane.showConfirmDialog(Desktop.getDesktopPane(),
             warningMessage,
             MessageManager.getString("label.change_increment_decrement"),
             JvOptionPane.YES_NO_OPTION, JvOptionPane.WARNING_MESSAGE);
@@ -2279,7 +2235,6 @@ public class GPreferences extends JPanel
       @Override
       public void actionPerformed(ActionEvent e)
       {
-        backupfilesRevertButtonSetEnabled(true);
         updateBackupFilesExampleLabel();
       }
     });
@@ -2288,7 +2243,6 @@ public class GPreferences extends JPanel
       @Override
       public void actionPerformed(ActionEvent e)
       {
-        backupfilesRevertButtonSetEnabled(true);
         keepRollMaxOptionsEnabled();
         updateBackupFilesExampleLabel();
       }
@@ -2299,26 +2253,15 @@ public class GPreferences extends JPanel
       @Override
       public void stateChanged(ChangeEvent e)
       {
-        backupfilesRevertButtonSetEnabled(true);
         updateBackupFilesExampleLabel();
       }
 
     };
-    setIntegerSpinner(backupfilesRollMaxSpinner,
-            BackupFilesPresetEntry.ROLLMAXMIN,
-            BackupFilesPresetEntry.ROLLMAXMAX, 4, true, c);
+    setIntegerSpinner(backupfilesRollMaxSpinner, 1, 999, 4, true, c);
 
     backupfilesConfirmDelete.setLabels(
             MessageManager.getString("label.always_ask"),
             MessageManager.getString("label.auto_delete"));
-    backupfilesConfirmDelete.addActionListener(new ActionListener()
-    {
-      @Override
-      public void actionPerformed(ActionEvent e)
-      {
-        backupfilesRevertButtonSetEnabled(true);
-      }
-    });
     // update the enabled section
     keepRollMaxOptionsEnabled();
 
@@ -2354,6 +2297,13 @@ public class GPreferences extends JPanel
     kgbc.gridwidth = GridBagConstraints.REMAINDER;
     kgbc.fill = GridBagConstraints.HORIZONTAL;
     kgbc.weightx = 1.0;
+    /*
+    keepfilesPanel.add(backupfilesConfirmDelete.getTrueButton(), kgbc);
+    
+    // fourth row (indented)
+    kgbc.gridy = 3;
+    keepfilesPanel.add(backupfilesConfirmDelete.getFalseButton(), kgbc);
+    */
 
     JPanel jp = new JPanel();
     jp.setLayout(new FlowLayout());
@@ -2409,7 +2359,6 @@ public class GPreferences extends JPanel
     int uppersurround = 0;
     StringBuilder exampleSB = new StringBuilder();
     boolean firstLine = true;
-    int lineNumber = 0;
     if (reverse)
     {
 
@@ -2420,7 +2369,6 @@ public class GPreferences extends JPanel
         if (index == min + lowersurround && index < max - uppersurround - 1)
         {
           exampleSB.append("\n...");
-          lineNumber++;
         }
         else if (index > min + lowersurround && index < max - uppersurround)
         {
@@ -2435,7 +2383,6 @@ public class GPreferences extends JPanel
           else
           {
             exampleSB.append("\n");
-            lineNumber++;
           }
           exampleSB.append(BackupFilenameParts.getBackupFilename(index,
                   base, suffix, digits));
@@ -2475,7 +2422,6 @@ public class GPreferences extends JPanel
         if (index == min + lowersurround && index < max - uppersurround - 1)
         {
           exampleSB.append("\n...");
-          lineNumber++;
         }
         else if (index > min + lowersurround && index < max - uppersurround)
         {
@@ -2490,7 +2436,6 @@ public class GPreferences extends JPanel
           else
           {
             exampleSB.append("\n");
-            lineNumber++;
           }
           exampleSB.append(BackupFilenameParts.getBackupFilename(index,
                   base, suffix, digits));
@@ -2519,18 +2464,6 @@ public class GPreferences extends JPanel
 
     }
 
-    // add some extra empty lines to pad out the example files box. ugh, please tell
-    // me how to do this better
-    int remainingLines = lowersurround + uppersurround + 1 - lineNumber;
-    if (remainingLines > 0)
-    {
-      for (int i = 0; i < remainingLines; i++)
-      {
-        exampleSB.append("\n ");
-        lineNumber++;
-      }
-    }
-
     backupfilesExampleLabel.setText(exampleSB.toString());
   }
 
@@ -2545,7 +2478,7 @@ public class GPreferences extends JPanel
         i = Integer.parseInt((String) s.getValue());
       } catch (Exception e)
       {
-        Cache.log.error(
+        System.out.println(
                 "Exception casting the initial value of s.getValue()");
       }
     }
@@ -2577,12 +2510,12 @@ public class GPreferences extends JPanel
       i = (Integer) s.getValue();
     } catch (Exception e)
     {
-      Cache.log.error("Failed casting (Integer) JSpinner s.getValue()");
+      System.out.println("Failed casting (Integer) JSpinner s.getValue()");
     }
     return i;
   }
 
-  private void keepRollMaxOptionsEnabled()
+  protected void keepRollMaxOptionsEnabled()
   {
     boolean enabled = backupfilesKeepAll.isEnabled()
             && !backupfilesKeepAll.isSelected();
@@ -2591,10 +2524,10 @@ public class GPreferences extends JPanel
     backupfilesConfirmDelete.setEnabled(enabled);
   }
 
-  private void backupfilesKeepAllSetEnabled(boolean tryEnabled)
+  protected void backupfilesKeepAllSetEnabled(boolean tryEnabled)
   {
     boolean enabled = tryEnabled && enableBackupFiles.isSelected()
-            && customiseCheckbox.isSelected()
+            && getComboIntStringKey(backupfilesPresetsCombo) == 0
             && suffixTemplate.getText()
                     .indexOf(BackupFiles.NUM_PLACEHOLDER) > -1;
     keepfilesPanel.setEnabled(enabled);
@@ -2615,48 +2548,18 @@ public class GPreferences extends JPanel
   private void backupfilesSuffixTemplateSetEnabled(boolean tryEnabled)
   {
     boolean enabled = tryEnabled && enableBackupFiles.isSelected()
-            && customiseCheckbox.isSelected();
+            && getComboIntStringKey(backupfilesPresetsCombo) == 0;
     suffixPanel.setEnabled(enabled);
     suffixTemplateLabel.setEnabled(enabled);
     suffixTemplate.setEnabled(enabled);
     backupfilesSuffixTemplateDigitsSetEnabled();
   }
 
-  private void backupfilesRevertButtonSetEnabled(boolean tryEnabled)
-  {
-    boolean enabled = tryEnabled && enableBackupFiles.isSelected()
-            && customiseCheckbox.isSelected() && backupfilesCustomChanged();
-    revertButton.setEnabled(enabled);
-  }
-
-  private boolean backupfilesCustomChanged()
-  {
-    BackupFilesPresetEntry custom = BackupFilesPresetEntry.backupfilesPresetEntriesValues
-            .get(BackupFilesPresetEntry.BACKUPFILESSCHEMECUSTOM);
-    BackupFilesPresetEntry current = getBackupfilesCurrentEntry();
-    return !custom.equals(current);
-  }
-
-  protected BackupFilesPresetEntry getBackupfilesCurrentEntry()
-  {
-    String suffix = suffixTemplate.getText();
-    int digits = getSpinnerInt(suffixDigitsSpinner, 3);
-    boolean reverse = suffixReverse.isSelected();
-    boolean keepAll = backupfilesKeepAll.isSelected();
-    int rollMax = getSpinnerInt(backupfilesRollMaxSpinner, 3);
-    boolean confirmDelete = backupfilesConfirmDelete.isSelected();
-
-    BackupFilesPresetEntry bfpe = new BackupFilesPresetEntry(suffix, digits,
-            reverse, keepAll, rollMax, confirmDelete);
-
-    return bfpe;
-  }
-
   protected void backupfilesCustomOptionsSetEnabled()
   {
-    boolean enabled = customiseCheckbox.isSelected();
+    int scheme = getComboIntStringKey(backupfilesPresetsCombo);
+    boolean enabled = scheme == 0 && enableBackupFiles.isSelected();
 
-    backupfilesRevertButtonSetEnabled(enabled);
     backupfilesSuffixTemplateSetEnabled(enabled);
     backupfilesKeepAllSetEnabled(enabled);
   }
@@ -2672,10 +2575,7 @@ public class GPreferences extends JPanel
   {
     boolean enabled = enableBackupFiles.isSelected();
     presetsPanel.setEnabled(enabled);
-    presetsComboLabel.setEnabled(enabled);
     backupfilesPresetsCombo.setEnabled(enabled);
-    customiseCheckbox.setEnabled(enabled);
-    revertButton.setEnabled(enabled);
   }
 
   protected void backupsOptionsSetEnabled()
@@ -2864,6 +2764,7 @@ public class GPreferences extends JPanel
       button.setHorizontalAlignment(SwingConstants.CENTER);
       this.button.addActionListener(new ActionListener()
       {
+        @SuppressWarnings("synthetic-access")
         @Override
         public void actionPerformed(ActionEvent e)
         {
@@ -2889,3 +2790,85 @@ public class GPreferences extends JPanel
   }
 }
 
+class IntKeyStringValueEntry
+{
+  int k;
+
+  String v;
+
+  public IntKeyStringValueEntry(int k, String v)
+  {
+    this.k = k;
+    this.v = v;
+  }
+
+  @Override
+  public String toString()
+  {
+    return this.getValue();
+  }
+
+  public int getKey()
+  {
+    return k;
+  }
+
+  public String getValue()
+  {
+    return v;
+  }
+}
+
+class BackupFilesPresetEntry
+{
+  String suffix;
+
+  int digits;
+
+  boolean reverse;
+
+  boolean keepAll;
+
+  int rollMax;
+
+  boolean confirmDelete;
+
+  public BackupFilesPresetEntry(String suffix, int digits, boolean reverse,
+          boolean keepAll, int rollMax, boolean confirmDelete)
+  {
+    this.suffix = suffix;
+    this.digits = digits;
+    this.reverse = reverse;
+    this.keepAll = keepAll;
+    this.rollMax = rollMax;
+    this.confirmDelete = confirmDelete;
+  }
+}
+
+class BackupFilesPresetsComboBoxRenderer extends DefaultListCellRenderer
+{
+  /**
+   * 
+   */
+  private static final long serialVersionUID = 88L;
+
+  @Override
+  public Component getListCellRendererComponent(JList<?> list, Object value,
+          int index, boolean isSelected, boolean cellHasFocus)
+  {
+    super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
+    
+    try {
+      IntKeyStringValueEntry e = (IntKeyStringValueEntry) value;
+      if (e.getKey() == GPreferences.BACKUPFILESSCHEMECUSTOMISE)
+      {
+        // "Customise" item
+        this.setFont(this.getFont().deriveFont(Font.BOLD));
+      }
+    } catch (Exception e) {
+      return this;
+    }
+
+    return this;
+  }
+}
index e0bec25..a90bd48 100644 (file)
@@ -20,6 +20,8 @@
  */
 package jalview.jbgui;
 
+import jalview.bin.Jalview;
+
 import javax.swing.JInternalFrame;
 
 @SuppressWarnings("serial")
@@ -38,9 +40,7 @@ public class GRnaStructureViewer extends JInternalFrame
 
   private void jbInit() throws Exception
   {
-    
-    setName("jalview-rnastructureviewer");
-
+    setName(Jalview.getAppID("rnastructureviewer"));
   }
 
 }
index a43e504..2ec7051 100755 (executable)
@@ -219,7 +219,7 @@ public class GSequenceLink extends JPanel
       return true;
     }
 
-    JvOptionPane.showInternalMessageDialog(jalview.gui.Desktop.desktop,
+    JvOptionPane.showInternalMessageDialog(jalview.gui.Desktop.getDesktopPane(),
             MessageManager.getString("warn.url_must_contain"),
             MessageManager.getString("label.invalid_url"),
             JvOptionPane.WARNING_MESSAGE);
@@ -228,7 +228,7 @@ public class GSequenceLink extends JPanel
 
   public void notifyDuplicate()
   {
-    JvOptionPane.showInternalMessageDialog(jalview.gui.Desktop.desktop,
+    JvOptionPane.showInternalMessageDialog(jalview.gui.Desktop.getDesktopPane(),
             MessageManager.getString("warn.name_cannot_be_duplicate"),
             MessageManager.getString("label.invalid_name"),
             JvOptionPane.WARNING_MESSAGE);
index d841be5..452ba61 100755 (executable)
@@ -49,6 +49,7 @@ import javax.swing.SwingConstants;
  * @author $author$
  * @version $Revision$
  */
+@SuppressWarnings("serial")
 public class GSliderPanel extends JPanel
 {
   private static final Font VERDANA_11 = new java.awt.Font("Verdana", 0, 11);
@@ -58,9 +59,9 @@ public class GSliderPanel extends JPanel
   protected static final int FRAME_HEIGHT = 120;
 
   // this is used for conservation colours, PID colours and redundancy threshold
-  protected JSlider slider = new JSlider();
+  public JSlider slider = new JSlider();
 
-  protected JTextField valueField = new JTextField();
+  public JTextField valueField = new JTextField();
 
   protected JLabel label = new JLabel();
 
index a75760d..ed715c8 100644 (file)
@@ -20,6 +20,7 @@
  */
 package jalview.jbgui;
 
+import jalview.bin.Jalview;
 import jalview.util.Platform;
 
 import java.awt.Component;
@@ -57,7 +58,7 @@ public class GSplitFrame extends JInternalFrame
    */
   public GSplitFrame(GAlignFrame top, GAlignFrame bottom)
   {
-    setName("jalview-splitframe");
+    setName(Jalview.getAppID("splitframe"));
     this.topFrame = top;
     this.bottomFrame = bottom;
 
index b9c9267..4261d67 100644 (file)
@@ -106,13 +106,13 @@ public abstract class GStructureChooser extends JPanel
   protected String frameTitle = MessageManager
           .getString("label.structure_chooser");
 
-  protected JInternalFrame mainFrame = new JInternalFrame(frameTitle);
+  public JInternalFrame mainFrame = new JInternalFrame(frameTitle);
 
-  protected JComboBox<FilterOption> cmb_filterOption = new JComboBox<>();
+  public JComboBox<FilterOption> cmb_filterOption = new JComboBox<>();
 
-  protected AlignmentPanel ap;
+  public AlignmentPanel ap;
 
-  protected StringBuilder errorWarning = new StringBuilder();
+  public StringBuilder errorWarning = new StringBuilder();
 
   protected JButton btn_add;
 
@@ -123,14 +123,14 @@ public abstract class GStructureChooser extends JPanel
   protected JCheckBox chk_superpose = new JCheckBox(
           MessageManager.getString("label.superpose_structures"));
 
-  protected JTextField txt_search = new JTextField(14);
+  public JTextField txt_search = new JTextField(14);
 
   protected JPanel pnl_switchableViews = new JPanel(new CardLayout());
 
   protected CardLayout layout_switchableViews = (CardLayout) (pnl_switchableViews
           .getLayout());
 
-  protected JCheckBox chk_invertFilter = new JCheckBox(
+  public JCheckBox chk_invertFilter = new JCheckBox(
           MessageManager.getString("label.invert"));
 
   protected ImageIcon loadingImage = new ImageIcon(
@@ -145,29 +145,29 @@ public abstract class GStructureChooser extends JPanel
   protected ImageIcon warningImage = new ImageIcon(
           getClass().getResource("/images/warning.gif"));
 
-  protected JLabel lbl_loading = new JLabel(loadingImage);
+  public JLabel lbl_loading = new JLabel(loadingImage);
 
   protected JLabel lbl_pdbManualFetchStatus = new JLabel(errorImage);
 
   protected JLabel lbl_fromFileStatus = new JLabel(errorImage);
 
-  protected AssociateSeqPanel idInputAssSeqPanel = new AssociateSeqPanel();
+  public AssociateSeqPanel idInputAssSeqPanel = new AssociateSeqPanel();
 
-  protected AssociateSeqPanel fileChooserAssSeqPanel = new AssociateSeqPanel();
+  public AssociateSeqPanel fileChooserAssSeqPanel = new AssociateSeqPanel();
 
   protected JComboBox<StructureViewer> targetView = new JComboBox<>();
 
-  protected JTable tbl_local_pdb = new JTable();
+  public JTable tbl_local_pdb = new JTable();
 
   protected JTabbedPane pnl_filter = new JTabbedPane();
 
-  protected FTSDataColumnPreferences pdbDocFieldPrefs = new FTSDataColumnPreferences(
+  public FTSDataColumnPreferences pdbDocFieldPrefs = new FTSDataColumnPreferences(
           PreferenceSource.STRUCTURE_CHOOSER,
           PDBFTSRestClient.getInstance());
 
   protected FTSDataColumnI[] previousWantedFields;
 
-  protected static Map<String, Integer> tempUserPrefs = new HashMap<>();
+  public static Map<String, Integer> tempUserPrefs = new HashMap<>();
 
   private JTable tbl_summary = new JTable()
   {
@@ -662,7 +662,7 @@ public abstract class GStructureChooser extends JPanel
   }
 
 
-protected void closeAction(int preferredHeight)
+  public void closeAction(int preferredHeight)
   {
     // System.out.println(">>>>>>>>>> closing internal frame!!!");
     // System.out.println("width : " + mainFrame.getWidth());
index dfee3e2..e16d63a 100644 (file)
@@ -21,6 +21,7 @@
 package jalview.jbgui;
 
 import jalview.api.structures.JalviewStructureDisplayI;
+import jalview.bin.Jalview;
 import jalview.gui.ColourMenuHelper.ColourChangeListener;
 import jalview.util.ImageMaker.TYPE;
 import jalview.util.MessageManager;
@@ -89,7 +90,7 @@ public abstract class GStructureViewer extends JInternalFrame
   private void jbInit() throws Exception
   {
 
-    setName("jalview-structureviewer");
+    setName(Jalview.getAppID("structureviewer"));
 
     JMenuBar menuBar = new JMenuBar();
     this.setJMenuBar(menuBar);
index d184e76..0f9c2a2 100755 (executable)
@@ -20,6 +20,7 @@
  */
 package jalview.jbgui;
 
+import jalview.bin.Jalview;
 import jalview.util.ImageMaker.TYPE;
 import jalview.util.MessageManager;
 
@@ -92,7 +93,7 @@ public class GTreePanel extends JInternalFrame
 
   private void jbInit() throws Exception
   {
-    setName("jalview-tree");
+    setName(Jalview.getAppID("tree"));
     this.getContentPane().setLayout(borderLayout1);
     this.setBackground(Color.white);
     this.setFont(new java.awt.Font("Verdana", 0, 12));
index 5618529..1a25270 100644 (file)
@@ -28,6 +28,7 @@ import jalview.analysis.Conservation;
 import jalview.analysis.PCA;
 import jalview.analysis.scoremodels.ScoreModels;
 import jalview.analysis.scoremodels.SimilarityParams;
+import jalview.api.AlignmentViewPanel;
 import jalview.api.FeatureColourI;
 import jalview.api.ViewStyleI;
 import jalview.api.analysis.ScoreModelI;
@@ -82,7 +83,6 @@ import jalview.schemes.ColourSchemeProperty;
 import jalview.schemes.FeatureColour;
 import jalview.schemes.ResidueProperties;
 import jalview.schemes.UserColourScheme;
-import jalview.structure.StructureSelectionManager;
 import jalview.structures.models.AAStructureBindingModel;
 import jalview.util.Format;
 import jalview.util.MessageManager;
@@ -163,7 +163,6 @@ import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
-import java.lang.reflect.InvocationTargetException;
 import java.math.BigInteger;
 import java.net.MalformedURLException;
 import java.net.URL;
@@ -624,13 +623,14 @@ public class Jalview2XML
    * core method for storing state for a set of AlignFrames.
    * 
    * @param frames
-   *          - frames involving all data to be exported (including containing
-   *          splitframes)
+   *          - frames involving all data to be exported (including those
+   *          contained in splitframes, though not the split frames themselves)
    * @param jout
    *          - project output stream
    */
   private void saveAllFrames(List<AlignFrame> frames, JarOutputStream jout)
   {
+
     Hashtable<String, AlignFrame> dsses = new Hashtable<>();
 
     /*
@@ -653,21 +653,22 @@ public class Jalview2XML
       for (int i = frames.size() - 1; i > -1; i--)
       {
         AlignFrame af = frames.get(i);
+        AlignViewport vp = af.getViewport();
         // skip ?
         if (skipList != null && skipList
-                .containsKey(af.getViewport().getSequenceSetId()))
+                .containsKey(vp.getSequenceSetId()))
         {
           continue;
         }
 
         String shortName = makeFilename(af, shortNames);
 
-        int apSize = af.getAlignPanels().size();
-
+        AlignmentI alignment = vp.getAlignment();
+        List<? extends AlignmentViewPanel> panels = af.getAlignPanels();
+        int apSize = panels.size();
         for (int ap = 0; ap < apSize; ap++)
-        {
-          AlignmentPanel apanel = (AlignmentPanel) af.getAlignPanels()
-                  .get(ap);
+          {
+          AlignmentPanel apanel = (AlignmentPanel) panels.get(ap);
           String fileName = apSize == 1 ? shortName : ap + shortName;
           if (!fileName.endsWith(".xml"))
           {
@@ -675,11 +676,17 @@ public class Jalview2XML
           }
 
           saveState(apanel, fileName, jout, viewIds);
-
-          String dssid = getDatasetIdRef(
-                  af.getViewport().getAlignment().getDataset());
+        }
+        if (apSize > 0)
+        {
+          // BH moved next bit out of inner loop, not that it really matters.
+          // so we are testing to make sure we actually have an alignment,
+          // apparently.
+          String dssid = getDatasetIdRef(alignment.getDataset());
           if (!dsses.containsKey(dssid))
           {
+            // We have not already covered this data by reference from another
+            // frame.
             dsses.put(dssid, af);
           }
         }
@@ -797,10 +804,22 @@ public class Jalview2XML
     }
   }
 
+  /**
+   * Each AlignFrame has a single data set associated with it. Note that none of
+   * these frames are split frames, because Desktop.getAlignFrames() collects
+   * top and bottom separately here.
+   * 
+   * @param dsses
+   * @param fileName
+   * @param jout
+   */
   private void writeDatasetFor(Hashtable<String, AlignFrame> dsses,
           String fileName, JarOutputStream jout)
   {
 
+    // Note that in saveAllFrames we have associated each specific dataset to
+    // ONE of its associated frames.
+
     for (String dssids : dsses.keySet())
     {
       AlignFrame _af = dsses.get(dssids);
@@ -1081,7 +1100,7 @@ public class Jalview2XML
            * only view *should* be coped with sensibly.
            */
           // This must have been loaded, is it still visible?
-          JInternalFrame[] frames = Desktop.desktop.getAllFrames();
+          JInternalFrame[] frames = Desktop.getDesktopPane().getAllFrames();
           String matchedFile = null;
           for (int f = frames.length - 1; f > -1; f--)
           {
@@ -1233,9 +1252,9 @@ public class Jalview2XML
     {
       // FIND ANY ASSOCIATED TREES
       // NOT IMPLEMENTED FOR HEADLESS STATE AT PRESENT
-      if (Desktop.desktop != null)
+      if (Desktop.getDesktopPane() != null)
       {
-        JInternalFrame[] frames = Desktop.desktop.getAllFrames();
+        JInternalFrame[] frames = Desktop.getDesktopPane().getAllFrames();
 
         for (int t = 0; t < frames.length; t++)
         {
@@ -1279,9 +1298,9 @@ public class Jalview2XML
     /*
      * save PCA viewers
      */
-    if (!storeDS && Desktop.desktop != null)
+    if (!storeDS && Desktop.getDesktopPane() != null)
     {
-      for (JInternalFrame frame : Desktop.desktop.getAllFrames())
+      for (JInternalFrame frame : Desktop.getDesktopPane().getAllFrames())
       {
         if (frame instanceof PCAPanel)
         {
@@ -1672,7 +1691,7 @@ public class Jalview2XML
       // using save and then load
       try
       {
-        fileName = fileName.replace('\\', '/');
+       fileName = fileName.replace('\\', '/');
         System.out.println("Writing jar entry " + fileName);
         JarEntry entry = new JarEntry(fileName);
         jout.putNextEntry(entry);
@@ -1919,11 +1938,11 @@ public class Jalview2XML
           final SequenceI jds, List<String> viewIds, AlignmentPanel ap,
           boolean storeDataset)
   {
-    if (Desktop.desktop == null)
+    if (Desktop.getDesktopPane() == null)
     {
       return;
     }
-    JInternalFrame[] frames = Desktop.desktop.getAllFrames();
+    JInternalFrame[] frames = Desktop.getDesktopPane().getAllFrames();
     for (int f = frames.length - 1; f > -1; f--)
     {
       if (frames[f] instanceof AppVarna)
@@ -2379,7 +2398,7 @@ public class Jalview2XML
     if (calcIdParam.getVersion().equals("1.0"))
     {
       final String[] calcIds = calcIdParam.getServiceURL().toArray(new String[0]);
-      Jws2Instance service = Jws2Discoverer.getDiscoverer()
+      Jws2Instance service = Jws2Discoverer.getInstance()
               .getPreferredServiceFor(calcIds);
       if (service != null)
       {
@@ -2755,7 +2774,8 @@ public class Jalview2XML
     {
       try
       {
-        SwingUtilities.invokeAndWait(new Runnable()
+         // BH 2019 -- can't wait
+        SwingUtilities.invokeLater(new Runnable()
         {
           @Override
           public void run()
@@ -2771,52 +2791,52 @@ public class Jalview2XML
     return af;
   }
 
-        @SuppressWarnings("unused")
-        private jarInputStreamProvider createjarInputStreamProvider(final Object ofile) throws MalformedURLException {
+       @SuppressWarnings("unused")
+       private jarInputStreamProvider createjarInputStreamProvider(final Object ofile) throws MalformedURLException {
 
-                // BH 2018 allow for bytes already attached to File object
-                try {
-                        String file = (ofile instanceof File ? ((File) ofile).getCanonicalPath() : ofile.toString());
+               // BH 2018 allow for bytes already attached to File object
+               try {
+                       String file = (ofile instanceof File ? ((File) ofile).getCanonicalPath() : ofile.toString());
       byte[] bytes = Platform.isJS() ? Platform.getFileBytes((File) ofile)
               : null;
-                        URL url = null;
-                        errorMessage = null;
-                        uniqueSetSuffix = null;
-                        seqRefIds = null;
-                        viewportsAdded.clear();
-                        frefedSequence = null;
-
-                        if (file.startsWith("http://")) {
-                                url = new URL(file);
-                        }
-                        final URL _url = url;
-                        return new jarInputStreamProvider() {
-
-                                @Override
-                                public JarInputStream getJarInputStream() throws IOException {
-                                        if (bytes != null) {
-//                                              System.out.println("Jalview2XML: opening byte jarInputStream for bytes.length=" + bytes.length);
-                                                return new JarInputStream(new ByteArrayInputStream(bytes));
-                                        }
-                                        if (_url != null) {
-//                                              System.out.println("Jalview2XML: opening url jarInputStream for " + _url);
-                                                return new JarInputStream(_url.openStream());
-                                        } else {
-//                                              System.out.println("Jalview2XML: opening file jarInputStream for " + file);
-                                                return new JarInputStream(new FileInputStream(file));
-                                        }
-                                }
-
-                                @Override
-                                public String getFilename() {
-                                        return file;
-                                }
-                        };
-                } catch (IOException e) {
-                        e.printStackTrace();
-                        return null;
-                }
-        }
+                       URL url = null;
+                       errorMessage = null;
+                       uniqueSetSuffix = null;
+                       seqRefIds = null;
+                       viewportsAdded.clear();
+                       frefedSequence = null;
+
+                       if (file.startsWith("http://")) {
+                               url = new URL(file);
+                       }
+                       final URL _url = url;
+                       return new jarInputStreamProvider() {
+
+                               @Override
+                               public JarInputStream getJarInputStream() throws IOException {
+                                       if (bytes != null) {
+//                                             System.out.println("Jalview2XML: opening byte jarInputStream for bytes.length=" + bytes.length);
+                                               return new JarInputStream(new ByteArrayInputStream(bytes));
+                                       }
+                                       if (_url != null) {
+//                                             System.out.println("Jalview2XML: opening url jarInputStream for " + _url);
+                                               return new JarInputStream(_url.openStream());
+                                       } else {
+//                                             System.out.println("Jalview2XML: opening file jarInputStream for " + file);
+                                               return new JarInputStream(new FileInputStream(file));
+                                       }
+                               }
+
+                               @Override
+                               public String getFilename() {
+                                       return file;
+                               }
+                       };
+               } catch (IOException e) {
+                       e.printStackTrace();
+                       return null;
+               }
+       }
 
   /**
    * Recover jalview session from a jalview project archive. Caller may
@@ -2842,12 +2862,19 @@ public class Jalview2XML
     IdentityHashMap<AlignmentI, AlignmentI> importedDatasets = new IdentityHashMap<>();
     Map<String, AlignFrame> gatherToThisFrame = new HashMap<>();
     final String file = jprovider.getFilename();
+
+    List<AlignFrame> alignFrames = new ArrayList<>();
+
     try
     {
       JarInputStream jin = null;
       JarEntry jarentry = null;
       int entryCount = 1;
 
+
+      // Look for all the entry names ending with ".xml"
+      // This includes all panels and at least one frame.
+//      Platform.timeCheck(null, Platform.TIME_MARK);
       do
       {
         jin = jprovider.getJarInputStream();
@@ -2855,9 +2882,27 @@ public class Jalview2XML
         {
           jarentry = jin.getNextJarEntry();
         }
+        String name = (jarentry == null ? null : jarentry.getName());
 
-        if (jarentry != null && jarentry.getName().endsWith(".xml"))
+//        System.out.println("Jalview2XML opening " + name);
+        if (name != null && name.endsWith(".xml"))
         {
+
+          // DataSet for.... is read last.
+          
+          
+          // The question here is what to do with the two
+          // .xml files in the jvp file.
+          // Some number of them, "...Dataset for...", will be the
+          // Only AlignPanels and will have Viewport.
+          // One or more will be the source data, with the DBRefs.
+          //
+          // JVP file writing (above) ensures tha the AlignPanels are written
+          // first, then all relevant datasets (which are
+          // Jalview.datamodel.Alignment).
+          //
+
+//          Platform.timeCheck("Jalview2XML JAXB " + name, Platform.TIME_MARK);
           JAXBContext jc = JAXBContext
                   .newInstance("jalview.xml.binding.jalview");
           XMLStreamReader streamReader = XMLInputFactory.newInstance()
@@ -2865,14 +2910,25 @@ public class Jalview2XML
           javax.xml.bind.Unmarshaller um = jc.createUnmarshaller();
           JAXBElement<JalviewModel> jbe = um
                   .unmarshal(streamReader, JalviewModel.class);
-          JalviewModel object = jbe.getValue();
+          JalviewModel model = jbe.getValue();
 
           if (true) // !skipViewport(object))
           {
-            _af = loadFromObject(object, file, true, jprovider);
-            if (_af != null && object.getViewport().size() > 0)
-            // getJalviewModelSequence().getViewportCount() > 0)
+            // Q: Do we have to load from the model, even if it
+            // does not have a viewport, could we discover that early on?
+            // Q: Do we need to load this object?
+            _af = loadFromObject(model, file, true, jprovider);
+//            Platform.timeCheck("Jalview2XML.loadFromObject",
+            // Platform.TIME_MARK);
+
+            if (_af != null)
+            {
+              alignFrames.add(_af);
+            }
+            if (_af != null && model.getViewport().size() > 0)
             {
+
+              // That is, this is one of the AlignmentPanel models
               if (af == null)
               {
                 // store a reference to the first view
@@ -2892,6 +2948,7 @@ public class Jalview2XML
                       af.getViewport().getAlignment().getDataset());
             }
           }
+//          Platform.timeCheck("JAXB " + name, Platform.TIME_MARK);
           entryCount++;
         }
         else if (jarentry != null)
@@ -2900,7 +2957,10 @@ public class Jalview2XML
           entryCount++;
         }
       } while (jarentry != null);
+//      Platform.timeCheck("JAXB loop exit", Platform.TIME_MARK);
       resolveFrefedSequences();
+//      Platform.timeCheck("JAXB resolveFrefed", Platform.TIME_MARK);
+
     } catch (IOException ex)
     {
       ex.printStackTrace();
@@ -2915,9 +2975,9 @@ public class Jalview2XML
       {
         // used to attempt to parse as V1 castor-generated xml
       }
-      if (Desktop.instance != null)
+      if (Desktop.getInstance() != null)
       {
-        Desktop.instance.stopLoading();
+        Desktop.getInstance().stopLoading();
       }
       if (af != null)
       {
@@ -2934,6 +2994,13 @@ public class Jalview2XML
       errorMessage = "Out of memory loading jalview XML file";
       System.err.println("Out of memory whilst loading jalview XML file");
       e.printStackTrace();
+    } finally
+    {
+      for (AlignFrame alf : alignFrames)
+      {
+        alf.alignPanel.setHoldRepaint(false);
+      }
+
     }
 
     /*
@@ -2945,7 +3012,7 @@ public class Jalview2XML
      */
     for (AlignFrame fr : gatherToThisFrame.values())
     {
-      Desktop.instance.gatherViews(fr);
+      Desktop.getInstance().gatherViews(fr);
     }
 
     restoreSplitFrames();
@@ -2953,8 +3020,7 @@ public class Jalview2XML
     {
       if (ds.getCodonFrames() != null)
       {
-        StructureSelectionManager
-                .getStructureSelectionManager(Desktop.instance)
+        Desktop.getStructureSelectionManager()
                 .registerMappings(ds.getCodonFrames());
       }
     }
@@ -2963,9 +3029,9 @@ public class Jalview2XML
       reportErrors();
     }
 
-    if (Desktop.instance != null)
+    if (Desktop.getInstance() != null)
     {
-      Desktop.instance.stopLoading();
+      Desktop.getInstance().stopLoading();
     }
 
     return af;
@@ -3046,7 +3112,7 @@ public class Jalview2XML
      */
     for (SplitFrame sf : gatherTo)
     {
-      Desktop.instance.gatherViews(sf);
+      Desktop.getInstance().gatherViews(sf);
     }
 
     splitFrameCandidates.clear();
@@ -3105,7 +3171,7 @@ public class Jalview2XML
           @Override
           public void run()
           {
-            JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+            JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
                     finalErrorMessage,
                     "Error " + (saving ? "saving" : "loading")
                             + " Jalview file",
@@ -3264,7 +3330,9 @@ public class Jalview2XML
   }
 
   /**
-   * Load alignment frame from jalview XML DOM object
+   * Load alignment frame from jalview XML DOM object. For a DOM object that
+   * includes one or more Viewport elements (one with a title that does NOT
+   * contain "Dataset for"), create the frame.
    * 
    * @param jalviewModel
    *          DOM
@@ -3279,9 +3347,13 @@ public class Jalview2XML
   AlignFrame loadFromObject(JalviewModel jalviewModel, String file,
           boolean loadTreesAndStructures, jarInputStreamProvider jprovider)
   {
+
+//    Platform.timeCheck("Jalview2XML.loadFromObject0", Platform.TIME_MARK);
+
     SequenceSet vamsasSet = jalviewModel.getVamsasModel().getSequenceSet().get(0);
     List<Sequence> vamsasSeqs = vamsasSet.getSequence();
 
+
     // JalviewModelSequence jms = object.getJalviewModelSequence();
 
     // Viewport view = (jms.getViewportCount() > 0) ? jms.getViewport(0)
@@ -3312,6 +3384,7 @@ public class Jalview2XML
               : view.getId() + uniqueSetSuffix);
     }
 
+//    Platform.timeCheck("Jalview2XML.loadFromObject1", Platform.TIME_MARK);
     // ////////////////////////////////
     // LOAD SEQUENCES
 
@@ -3332,6 +3405,7 @@ public class Jalview2XML
       SequenceI tmpSeq = seqRefIds.get(seqId);
       if (tmpSeq != null)
       {
+        //
         if (!incompleteSeqs.containsKey(seqId))
         {
           // may not need this check, but keep it for at least 2.9,1 release
@@ -3396,6 +3470,8 @@ public class Jalview2XML
       }
     }
 
+//    Platform.timeCheck("Jalview2XML.loadFromObject-seq",
+//            Platform.TIME_MARK);
     // /
     // Create the alignment object from the sequence set
     // ///////////////////////////////
@@ -3436,6 +3512,8 @@ public class Jalview2XML
       recoverDatasetFor(vamsasSet, al, isdsal, uniqueSeqSetId);
     }
 
+//    Platform.timeCheck("Jalview2XML.loadFromObject-align",
+//            Platform.TIME_MARK);
     if (referenceseqForView != null)
     {
       al.setSeqrep(referenceseqForView);
@@ -3448,6 +3526,8 @@ public class Jalview2XML
       al.setProperty(ssp.getKey(), ssp.getValue());
     }
 
+//    Platform.timeCheck("Jalview2XML.loadFromObject-setseqprop",
+//            Platform.TIME_MARK);
     // ///////////////////////////////
 
     Hashtable pdbloaded = new Hashtable(); // TODO nothing writes to this??
@@ -3461,6 +3541,7 @@ public class Jalview2XML
       // now, for 2.10 projects, this is also done if the xml doc includes
       // dataset sequences not actually present in any particular view.
       //
+//      Platform.timeCheck("J2XML features0", Platform.TIME_RESET);
       for (int i = 0; i < vamsasSeqs.size(); i++)
       {
         JSeq jseq = jseqs.get(i);
@@ -3515,7 +3596,9 @@ public class Jalview2XML
             }
 
             // adds feature to datasequence's feature set (since Jalview 2.10)
+//            Platform.timeCheck(null, Platform.TIME_SET);
             al.getSequenceAt(i).addSequenceFeature(sf);
+//            Platform.timeCheck(null, Platform.TIME_MARK);
           }
         }
         if (vamsasSeqs.get(i).getDBRef().size() > 0)
@@ -3575,8 +3658,7 @@ public class Jalview2XML
             {
               entry.setProperty(prop.getName(), prop.getValue());
             }
-            StructureSelectionManager
-                    .getStructureSelectionManager(Desktop.instance)
+            Desktop.getStructureSelectionManager()
                     .registerPDBEntry(entry);
             // adds PDBEntry to datasequence's set (since Jalview 2.10)
             if (al.getSequenceAt(i).getDatasetSequence() != null)
@@ -3589,7 +3671,12 @@ public class Jalview2XML
             }
           }
         }
+
       }
+
+//      Platform.timeCheck("features done", Platform.TIME_GET);
+//      Platform.timeCheck("Jalview2XML.loadFromObject-endmultiview",
+//              Platform.TIME_MARK);
     } // end !multipleview
 
     // ///////////////////////////////
@@ -3631,6 +3718,8 @@ public class Jalview2XML
           al.addCodonFrame(cf);
         }
       }
+//      Platform.timeCheck("Jalview2XML.loadFromObject-seqmap",
+//              Platform.TIME_MARK);
     }
 
     // ////////////////////////////////
@@ -3691,6 +3780,9 @@ public class Jalview2XML
         }
         // Construct new annotation from model.
         List<AnnotationElement> ae = annotation.getAnnotationElement();
+//        System.err.println(
+//                "Jalview2XML processing " + ae.size() + " annotations");
+
         jalview.datamodel.Annotation[] anot = null;
         java.awt.Color firstColour = null;
         int anpos;
@@ -3726,6 +3818,7 @@ public class Jalview2XML
             }
           }
         }
+        // create the new AlignmentAnnotation
         jalview.datamodel.AlignmentAnnotation jaa = null;
 
         if (annotation.isGraph())
@@ -3762,6 +3855,7 @@ public class Jalview2XML
           jaa._linecolour = firstColour;
         }
         // register new annotation
+        // Annotation graphs such as Conservation will not have id.
         if (annotation.getId() != null)
         {
           annotationIds.put(annotation.getId(), jaa);
@@ -3850,6 +3944,8 @@ public class Jalview2XML
           al.addAnnotation(jaa);
         }
       }
+//      Platform.timeCheck("Jalview2XML.loadFromObject-annot",
+//              Platform.TIME_MARK);
     }
     // ///////////////////////
     // LOAD GROUPS
@@ -3964,6 +4060,8 @@ public class Jalview2XML
                   jGroup.getAnnotationColours(), null, al, jalviewModel, false));
         }
       }
+//      Platform.timeCheck("Jalview2XML.loadFromObject-groups",
+//              Platform.TIME_MARK);
     }
     if (view == null)
     {
@@ -3973,8 +4071,6 @@ public class Jalview2XML
     // ///////////////////////////////
     // LOAD VIEWPORT
 
-    AlignFrame af = null;
-    AlignViewport av = null;
     // now check to see if we really need to create a new viewport.
     if (multipleView && viewportsAdded.size() == 0)
     {
@@ -4005,6 +4101,8 @@ public class Jalview2XML
         }
 
       }
+//      Platform.timeCheck("Jalview2XML.loadFromObject-viewport",
+//              Platform.TIME_MARK);
     }
     /**
      * indicate that annotation colours are applied across all groups (pre
@@ -4013,8 +4111,9 @@ public class Jalview2XML
     boolean doGroupAnnColour = Jalview2XML.isVersionStringLaterThan("2.8.1",
             jalviewModel.getVersion());
 
+    AlignFrame af = null;
     AlignmentPanel ap = null;
-    boolean isnewview = true;
+    AlignViewport av = null;
     if (viewId != null)
     {
       // Check to see if this alignment already has a view id == viewId
@@ -4024,25 +4123,27 @@ public class Jalview2XML
       {
         for (int v = 0; v < views.length; v++)
         {
-          if (views[v].av.getViewId().equalsIgnoreCase(viewId))
+          ap = views[v];
+          av = ap.av;
+          if (av.getViewId().equalsIgnoreCase(viewId))
           {
             // recover the existing alignpanel, alignframe, viewport
-            af = views[v].alignFrame;
-            av = views[v].av;
-            ap = views[v];
+            af = ap.alignFrame;
+            break;
             // TODO: could even skip resetting view settings if we don't want to
             // change the local settings from other jalview processes
-            isnewview = false;
           }
         }
       }
     }
 
-    if (isnewview)
+    if (af == null)
     {
       af = loadViewport(file, jseqs, hiddenSeqs, al, jalviewModel, view,
               uniqueSeqSetId, viewId, autoAlan);
       av = af.getViewport();
+      // note that this only retrieves the most recently accessed
+      // tab of an AlignFrame.
       ap = af.alignPanel;
     }
 
@@ -4051,14 +4152,61 @@ public class Jalview2XML
      * 
      * Not done if flag is false (when this method is used for New View)
      */
+    final AlignFrame af0 = af;
+    final AlignViewport av0 = av;
+    final AlignmentPanel ap0 = ap;
+//    Platform.timeCheck("Jalview2XML.loadFromObject-beforetree",
+//            Platform.TIME_MARK);
     if (loadTreesAndStructures)
     {
-      loadTrees(jalviewModel, view, af, av, ap);
-      loadPCAViewers(jalviewModel, ap);
-      loadPDBStructures(jprovider, jseqs, af, ap);
-      loadRnaViewers(jprovider, jseqs, ap);
+      if (!jalviewModel.getTree().isEmpty())
+      {
+        SwingUtilities.invokeLater(new Runnable()
+        {
+          @Override
+          public void run()
+          {
+//            Platform.timeCheck(null, Platform.TIME_MARK);
+            loadTrees(jalviewModel, view, af0, av0, ap0);
+//            Platform.timeCheck("Jalview2XML.loadTrees", Platform.TIME_MARK);
+          }
+        });
+      }
+      if (!jalviewModel.getPcaViewer().isEmpty())
+      {
+        SwingUtilities.invokeLater(new Runnable()
+        {
+          @Override
+          public void run()
+          {
+//            Platform.timeCheck(null, Platform.TIME_MARK);
+            loadPCAViewers(jalviewModel, ap0);
+//            Platform.timeCheck("Jalview2XML.loadPCA", Platform.TIME_MARK);
+          }
+        });
+      }
+      SwingUtilities.invokeLater(new Runnable()
+      {
+        @Override
+        public void run()
+        {
+//          Platform.timeCheck(null, Platform.TIME_MARK);
+          loadPDBStructures(jprovider, jseqs, af0, ap0);
+//          Platform.timeCheck("Jalview2XML.loadPDB", Platform.TIME_MARK);
+        }
+      });
+      SwingUtilities.invokeLater(new Runnable()
+      {
+        @Override
+        public void run()
+        {
+          loadRnaViewers(jprovider, jseqs, ap0);
+        }
+      });
     }
     // and finally return.
+    // but do not set holdRepaint true just yet, because this could be the
+    // initial frame with just its dataset.
     return af;
   }
 
@@ -4075,7 +4223,7 @@ public class Jalview2XML
    * @param jseqs
    * @param ap
    */
-  private void loadRnaViewers(jarInputStreamProvider jprovider,
+  protected void loadRnaViewers(jarInputStreamProvider jprovider,
           List<JSeq> jseqs, AlignmentPanel ap)
   {
     /*
@@ -4294,7 +4442,7 @@ public class Jalview2XML
             int height = safeInt(structureState.getHeight());
 
             // Probably don't need to do this anymore...
-            // Desktop.desktop.getComponentAt(x, y);
+            // Desktop.getDesktop().getComponentAt(x, y);
             // TODO: NOW: check that this recovers the PDB file correctly.
             String pdbFile = loadPDBFile(jprovider, pdbid.getId(),
                     pdbid.getFile());
@@ -4536,7 +4684,7 @@ public class Jalview2XML
           String reformatedOldFilename = oldfilenam.replaceAll("/", "\\\\");
           filedat = oldFiles.get(new File(reformatedOldFilename));
         }
-        newFileLoc.append(Platform.escapeBackslashes(filedat.getFilePath()));
+        newFileLoc.append(Platform.escapeString(filedat.getFilePath()));
         pdbfilenames.add(filedat.getFilePath());
         pdbids.add(filedat.getPdbId());
         seqmaps.add(filedat.getSeqList().toArray(new SequenceI[0]));
@@ -4613,9 +4761,9 @@ public class Jalview2XML
     final AlignFrame alf = af;
     final Rectangle rect = new Rectangle(svattrib.getX(), svattrib.getY(),
             svattrib.getWidth(), svattrib.getHeight());
-    try
-    {
-      javax.swing.SwingUtilities.invokeAndWait(new Runnable()
+    // try
+    // {
+      javax.swing.SwingUtilities.invokeLater(new Runnable()
       {
         @Override
         public void run()
@@ -4642,14 +4790,14 @@ public class Jalview2XML
           }
         }
       });
-    } catch (InvocationTargetException ex)
-    {
-      warn("Unexpected error when opening Jmol view.", ex);
-
-    } catch (InterruptedException e)
-    {
-      // e.printStackTrace();
-    }
+    // } catch (InvocationTargetException ex)
+    // {
+    // warn("Unexpected error when opening Jmol view.", ex);
+    //
+    // } catch (InterruptedException e)
+    // {
+    // // e.printStackTrace();
+    // }
 
   }
 
@@ -4778,7 +4926,7 @@ public class Jalview2XML
     {
       try
       {
-        frames = Desktop.desktop.getAllFrames();
+        frames = Desktop.getDesktopPane().getAllFrames();
       } catch (ArrayIndexOutOfBoundsException e)
       {
         // occasional No such child exceptions are thrown here...
@@ -4855,19 +5003,19 @@ public class Jalview2XML
   {
     AlignFrame af = null;
     af = new AlignFrame(al, safeInt(view.getWidth()),
-            safeInt(view.getHeight()), uniqueSeqSetId, viewId) 
+            safeInt(view.getHeight()), uniqueSeqSetId, viewId)
 //    {
-//      
-//      @Override
-//      protected void processKeyEvent(java.awt.event.KeyEvent e) {
-//              System.out.println("Jalview2XML   AF " + e);
-//              super.processKeyEvent(e);
-//              
-//      }
-//      
+//     
+//     @Override
+//     protected void processKeyEvent(java.awt.event.KeyEvent e) {
+//             System.out.println("Jalview2XML   AF " + e);
+//             super.processKeyEvent(e);
+//             
+//     }
+//     
 //    }
     ;
-
+    af.alignPanel.setHoldRepaint(true);
     af.setFileName(file, FileFormat.Jalview);
 
     final AlignViewport viewport = af.getViewport();
@@ -4976,8 +5124,18 @@ public class Jalview2XML
       viewport.setViewName(view.getViewName());
       af.setInitialTabVisible();
     }
-    af.setBounds(safeInt(view.getXpos()), safeInt(view.getYpos()),
-            safeInt(view.getWidth()), safeInt(view.getHeight()));
+    int x = safeInt(view.getXpos());
+    int y = safeInt(view.getYpos());
+    int w = safeInt(view.getWidth());
+    int h = safeInt(view.getHeight());
+    // // BH we cannot let the title bar go off the top
+    // if (Platform.isJS())
+    // {
+    // x = Math.max(50 - w, x);
+    // y = Math.max(0, y);
+    // }
+
+    af.setBounds(x, y, w, h);
     // startSeq set in af.alignPanel.updateLayout below
     af.alignPanel.updateLayout();
     ColourSchemeI cs = null;
@@ -5140,7 +5298,7 @@ public class Jalview2XML
         }
         else
         {
-          featureOrder.put(featureType, Float.valueOf(
+          featureOrder.put(featureType, new Float(
                   fs / jm.getFeatureSettings().getSetting().size()));
         }
         if (safeBoolean(setting.isDisplay()))
@@ -5152,7 +5310,7 @@ public class Jalview2XML
       for (int gs = 0; gs < jm.getFeatureSettings().getGroup().size(); gs++)
       {
         Group grp = jm.getFeatureSettings().getGroup().get(gs);
-        fgtable.put(grp.getName(), Boolean.valueOf(grp.isDisplay()));
+        fgtable.put(grp.getName(), new Boolean(grp.isDisplay()));
       }
       // FeatureRendererSettings frs = new FeatureRendererSettings(renderOrder,
       // fgtable, featureColours, jms.getFeatureSettings().hasTransparency() ?
@@ -5545,8 +5703,8 @@ public class Jalview2XML
       SequenceI[] dsseqs = new SequenceI[dseqs.size()];
       dseqs.copyInto(dsseqs);
       ds = new jalview.datamodel.Alignment(dsseqs);
-      debug("Created new dataset " + vamsasSet.getDatasetId()
-              + " for alignment " + System.identityHashCode(al));
+//      debug("Jalview2XML Created new dataset " + vamsasSet.getDatasetId()
+//              + " for alignment " + System.identityHashCode(al));
       addDatasetRef(vamsasSet.getDatasetId(), ds);
     }
     // set the dataset for the newly imported alignment.
index c9096e2..36b5847 100644 (file)
@@ -22,6 +22,7 @@ package jalview.renderer;
 
 import jalview.api.AlignmentColsCollectionI;
 import jalview.api.AlignmentRowsCollectionI;
+import jalview.api.AlignmentViewPanel;
 import jalview.api.RendererListenerI;
 import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.AlignmentI;
@@ -29,15 +30,23 @@ import jalview.datamodel.Annotation;
 import jalview.datamodel.SequenceGroup;
 import jalview.datamodel.SequenceI;
 import jalview.renderer.seqfeatures.FeatureColourFinder;
-import jalview.renderer.seqfeatures.FeatureRenderer;
+import jalview.util.Platform;
 import jalview.viewmodel.OverviewDimensions;
 
 import java.awt.AlphaComposite;
 import java.awt.Color;
 import java.awt.Graphics;
 import java.awt.Graphics2D;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
 import java.awt.image.BufferedImage;
+import java.awt.image.DataBufferInt;
+import java.awt.image.WritableRaster;
 import java.beans.PropertyChangeSupport;
+import java.util.BitSet;
+import java.util.Iterator;
+
+import javax.swing.Timer;
 
 public class OverviewRenderer
 {
@@ -56,9 +65,17 @@ public class OverviewRenderer
   // image to render on
   private BufferedImage miniMe;
 
-  // raw number of pixels to allocate to each column
+  /**
+   * Number of pixelsPerCol;
+   */
   private float pixelsPerCol;
 
+  /**
+   * Number of visible columns per pixel.
+   * 
+   */
+  private float colsPerPixel;
+
   // raw number of pixels to allocate to each row
   private float pixelsPerSeq;
 
@@ -75,126 +92,331 @@ public class OverviewRenderer
 
   private OverviewResColourFinder resColFinder;
 
-  public OverviewRenderer(FeatureRenderer fr, OverviewDimensions od,
-          AlignmentI alignment,
-          ResidueShaderI resshader, OverviewResColourFinder colFinder)
+  private boolean showProgress;
+
+  private AlignmentViewPanel panel;
+
+  // private int sequencesHeight;
+
+  public OverviewRenderer(AlignmentViewPanel panel,
+          jalview.api.FeatureRenderer fr, OverviewDimensions od,
+          AlignmentI alignment, ResidueShaderI resshader,
+          OverviewResColourFinder colFinder)
   {
-    finder = new FeatureColourFinder(fr);
-    resColFinder = colFinder;
+    this(panel, fr, od, alignment, resshader, colFinder, true);
+  }
 
+  /**
+   * @param panel
+   * @param fr
+   * @param od
+   * @param alignment
+   * @param resshader
+   * @param colFinder
+   * @param shwoProgress
+   *          possibly not, in JavaScript and for testng
+   */
+  public OverviewRenderer(AlignmentViewPanel panel,
+          jalview.api.FeatureRenderer fr, OverviewDimensions od,
+          AlignmentI alignment, ResidueShaderI resshader,
+          OverviewResColourFinder colFinder, boolean showProgress)
+  {
+    {
+    this.panel = panel;
+    finder = new FeatureColourFinder(fr);
     al = alignment;
     shader = resshader;
+    resColFinder = colFinder;
+    this.showProgress = showProgress;
 
-    pixelsPerCol = od.getPixelsPerCol();
-    pixelsPerSeq = od.getPixelsPerSeq();
+    w = od.getWidth();
+    h = od.getHeight();
+    rows = od.getRows(alignment);
+    cols = od.getColumns(alignment);
     graphHeight = od.getGraphHeight();
-    miniMe = new BufferedImage(od.getWidth(), od.getHeight(),
-            BufferedImage.TYPE_INT_RGB);
+    alignmentHeight = od.getSequencesHeight();
+
+    pixelsPerSeq = od.getPixelsPerSeq();
+    pixelsPerCol = od.getPixelsPerCol();
+    colsPerPixel = Math.max(1, 1f / pixelsPerCol);
+    }
   }
 
+  final static int STATE_INIT = 0;
+  final static int STATE_NEXT = 1;
+  final static int STATE_DONE = 2;
+
+  int state;
+
+  boolean isJS = Platform.isJS();
+
+  Timer timer;
+  int delay = (isJS ? 1 : 0);
+
+  int seqIndex;
+
+  int pixelRow;
+
+  private Integer row;
+
   /**
-   * Draw alignment rows and columns onto an image
+   * Draw alignment rows and columns onto an image. This method is asynchronous
+   * in JavaScript and interruptible in Java.
+   * 
+   * Whether hidden rows or columns are drawn depends upon the type of
+   * collection.
    * 
-   * @param rit
-   *          Iterator over rows to be drawn
-   * @param cit
-   *          Iterator over columns to be drawn
+   * Updated to skip through high-density sequences, where columns/pixels > 1.
+   * 
+   * When the process is complete, the image is passed to the AlignmentViewPanel
+   * provided by the constructor.
+   * 
+   * @param rows
+   *          collection of rows to be drawn
+   * @param cols
+   *          collection of columns to be drawn
    * @return image containing the drawing
+   * 
+   * @author Bob Hanson 2019.07.30
    */
-  public BufferedImage draw(AlignmentRowsCollectionI rows,
-          AlignmentColsCollectionI cols)
+  public void drawMiniMe()
   {
-    int rgbcolor = Color.white.getRGB();
-    int seqIndex = 0;
-    int pixelRow = 0;
-    int alignmentHeight = miniMe.getHeight() - graphHeight;
-    int totalPixels = miniMe.getWidth() * alignmentHeight;
+    state = STATE_INIT;
+    mainLoop();
+  }
 
-    int lastRowUpdate = 0;
-    int lastUpdate = 0;
-    changeSupport.firePropertyChange(UPDATE, -1, 0);
+  protected void mainLoop()
+  {
+    out: while (!redraw)
+    {
+      switch (state)
+      {
+      case STATE_INIT:
+        init();
+        state = STATE_NEXT;
+        continue;
+      case STATE_NEXT:
+        if (!rowIterator.hasNext())
+        {
+          state = STATE_DONE;
+          continue;
+        }
+        nextRow();
+        if (!loop())
+        {
+          // Java
+          continue;
+        }
+        // JavaScript
+        return;
+      case STATE_DONE:
+        break out;
+      }
+      // Java will continue without a timeout
+    }
+    done();
+  }
 
-    for (int alignmentRow : rows)
+  private void init()
+  {
+    rowIterator = rows.iterator();
+    seqIndex = 0;
+    pixelRow = 0;
+    lastRowUpdate = 0;
+    lastUpdate = 0;
+    totalPixels = w * alignmentHeight;
+
+    if (showProgress)
+    {
+      changeSupport.firePropertyChange(UPDATE, -1, 0);
+    }
+
+    miniMe = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
+    WritableRaster raster = miniMe.getRaster();
+    DataBufferInt db = (DataBufferInt) raster.getDataBuffer();
+    pixels = db.getBankData()[0];
+    bscol = cols.getOverviewBitSet();
+    Platform.timeCheck(null, Platform.TIME_MARK);
+  }
+
+  private void nextRow()
+  {
+    row = rowIterator.next();
+    // get details of this alignment row
+    SequenceI seq = rows.getSequence(row);
+
+    // rate limiting step when rendering overview for lots of groups
+    SequenceGroup[] allGroups = al.findAllGroups(seq);
+
+    // calculate where this row extends to in pixels
+    int endRow = Math.min(Math.round((++seqIndex) * pixelsPerSeq), h);
+    for (int pixelCol = 0, colNext = 0, pixelEnd = 0, icol = bscol
+            .nextSetBit(0); icol >= 0; icol = getNextCol(icol, pixelEnd))
     {
       if (redraw)
       {
         break;
       }
-    
-      // get details of this alignment row
-      SequenceI seq = rows.getSequence(alignmentRow);
-
-      // rate limiting step when rendering overview for lots of groups
-      SequenceGroup[] allGroups = al.findAllGroups(seq);
-
-      // calculate where this row extends to in pixels
-      int endRow = Math.min(Math.round((seqIndex + 1) * pixelsPerSeq) - 1,
-              miniMe.getHeight() - 1);
-    
-      int colIndex = 0;
-      int pixelCol = 0;
-      for (int alignmentCol : cols)
+
+      ++colNext;
+      pixelEnd = getNextPixel(colNext, colNext);
+
+      if (pixelCol == pixelEnd)
       {
-        if (redraw)
-        {
-          break;
-        }
-    
-        // calculate where this column extends to in pixels
-        int endCol = Math.min(Math.round((colIndex + 1) * pixelsPerCol) - 1,
-                miniMe.getWidth() - 1);
-    
-        // don't do expensive colour determination if we're not going to use it
-        // NB this is important to avoid performance issues in the overview
-        // panel
-        if (pixelCol <= endCol)
+        break;
+      }
+      else if (pixelCol < pixelEnd)
+      {
+        int rgb = getColumnColourFromSequence(allGroups, seq, icol);
+        // fill in the appropriate number of pixels
+        // System.out.println(
+        // "OR colNext=" + colNext + " " + pixelCol
+        // + "-" + pixelEnd + " icol=" + icol + " " + rgb + " "
+        // + pixelsPerCol);
+        for (int row = pixelRow; row < endRow; ++row)
         {
-          rgbcolor = getColumnColourFromSequence(allGroups, seq,
-                  alignmentCol);
-    
-          // fill in the appropriate number of pixels
-          for (int row = pixelRow; row <= endRow; ++row)
+          for (int col = pixelCol; col < pixelEnd; ++col)
           {
-            for (int col = pixelCol; col <= endCol; ++col)
-            {
-              miniMe.setRGB(col, row, rgbcolor);
-            }
+            // BH 2019.07.27 was:
+            //
+            // miniMe.setRGB(col, row, rgbcolor);
+            //
+            // but just directly writing to the int[] pixel buffer
+            // is three times faster by my experimentation
+            pixels[row * w + col] = rgb;
+            ndone++;
           }
-
-          // store last update value
+        }
+        pixelCol = pixelEnd;
+        // store last update value
+        if (showProgress)
+        {
           lastUpdate = sendProgressUpdate(
-                  (pixelCol + 1) * (endRow - pixelRow), totalPixels,
-                  lastRowUpdate, lastUpdate);
-
-          pixelCol = endCol + 1;
+                  pixelEnd * (endRow - 1 - pixelRow),
+                  totalPixels, lastRowUpdate, lastUpdate);
         }
-        colIndex++;
       }
 
-      if (pixelRow != endRow + 1)
+    }
+    if (pixelRow < endRow)
+    {
+      pixelRow = endRow;
+      // store row offset and last update value
+      if (showProgress)
       {
-        // store row offset and last update value
-        lastRowUpdate = sendProgressUpdate(endRow + 1, alignmentHeight, 0,
+        // BH 2019.07.29 was (old) endRow + 1 (now endRow), but should be
+        // pixelRow + 1, surely
+        lastRowUpdate = sendProgressUpdate(endRow, alignmentHeight, 0,
                 lastUpdate);
         lastUpdate = lastRowUpdate;
-        pixelRow = endRow + 1;
       }
-      seqIndex++;
     }
+  }
 
-    overlayHiddenRegions(rows, cols);
-    // final update to progress bar if present
-    if (redraw)
+  /**
+   * The next column is either the next set bit (when there are multiple pixels
+   * per column) or the next set bit for the column that aligns with the next
+   * pixel (when there are more columns than pixels).
+   * 
+   * @param icol
+   * @param pixel
+   * @return
+   */
+  private int getNextCol(int icol, int pixel)
+  {
+    return bscol.nextSetBit(
+            pixelsPerCol >= 1 ? icol + 1 : (int) (pixel * colsPerPixel));
+  }
+
+  private int getNextPixel(int icol, int pixel)
+  {
+    return Math.min(
+            pixelsPerCol >= 1 || pixel == 0
+                    ? Math.round(icol * pixelsPerCol)
+                    : pixel,
+            w);
+  }
+
+  private ActionListener listener = new ActionListener()
+  {
+    @Override
+    public void actionPerformed(ActionEvent e)
     {
-      sendProgressUpdate(pixelRow - 1, alignmentHeight, 0, 0);
+      mainLoop();
+    }
+
+  };
+
+  private boolean loop()
+  {
+    if (delay <= 0)
+    {
+      return false;
+    }
+    if (timer == null)
+    {
+      timer = new Timer(delay, listener);
+      timer.setRepeats(false);
+      timer.start();
     }
     else
     {
-      sendProgressUpdate(alignmentHeight, miniMe.getHeight(), 0, 0);
+      timer.restart();
     }
-    return miniMe;
+    return true;
   }
 
+  private void done()
+  {
+    if (!redraw)
+    {
+      Platform.timeCheck(
+              "overviewrender " + ndone + " pixels row:" + row + " redraw:"
+                      + redraw,
+              Platform.TIME_MARK);
+    }
+
+    overlayHiddenRegions();
+    if (showProgress)
+    {
+      // final update to progress bar if present
+      if (redraw)
+      {
+        // aborted in Java
+        // BH was pixelRow - 1, but that could go negative
+        sendProgressUpdate(pixelRow, alignmentHeight, 0, 0);
+      }
+      else
+      {
+        // sendProgressUpdate(alignmentHeight, miniMe.getHeight(), 0, 0);
+        sendProgressUpdate(1, 1, 0, 0);
+      }
+    }
+    panel.overviewDone(miniMe);
+  }
+
+  int ndone = 0;
+
+  private AlignmentRowsCollectionI rows;
+
+  private AlignmentColsCollectionI cols;
+
+  Iterator<Integer> rowIterator;
+
+  int alignmentHeight;
+
+  int totalPixels;
+
+  int lastRowUpdate;
+
+  int lastUpdate;
+
+  int[] pixels;
+
+  BitSet bscol;
+
+  int w, h;
+
   /*
    * Calculate progress update value and fire event
    * @param rowOffset number of rows to offset calculation by
@@ -222,40 +444,30 @@ public class OverviewRenderer
    *          column position to get colour for
    * @return colour of sequence at this position, as RGB
    */
-  int getColumnColourFromSequence(SequenceGroup[] allGroups,
-          SequenceI seq, int lastcol)
+  int getColumnColourFromSequence(SequenceGroup[] allGroups, SequenceI seq,
+          int icol)
   {
-    Color color = resColFinder.GAP_COLOUR;
-
-    if ((seq != null) && (seq.getLength() > lastcol))
-    {
-      color = resColFinder.getResidueColour(true, shader, allGroups, seq,
-              lastcol, finder);
-    }
-
-    return color.getRGB();
+    return (seq == null || icol >= seq.getLength()
+            ? resColFinder.GAP_COLOUR
+            : resColFinder.getResidueColourInt(true, shader, allGroups, seq,
+                    icol, finder));
   }
 
   /**
    * Overlay the hidden regions on the overview image
    * 
-   * @param rows
-   *          collection of rows the overview is built over
-   * @param cols
-   *          collection of columns the overview is built over
    */
-  private void overlayHiddenRegions(AlignmentRowsCollectionI rows,
-          AlignmentColsCollectionI cols)
+  private void overlayHiddenRegions()
   {
     if (cols.hasHidden() || rows.hasHidden())
     {
-      BufferedImage mask = buildHiddenImage(rows, cols, miniMe.getWidth(),
-              miniMe.getHeight());
+      BufferedImage mask = buildHiddenImage();
 
       Graphics2D g = (Graphics2D) miniMe.getGraphics();
       g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,
               TRANSPARENCY));
       g.drawImage(mask, 0, 0, miniMe.getWidth(), miniMe.getHeight(), null);
+      g.dispose();
     }
   }
 
@@ -273,20 +485,17 @@ public class OverviewRenderer
    *          height of overview in pixels
    * @return BufferedImage containing mask of hidden regions
    */
-  private BufferedImage buildHiddenImage(AlignmentRowsCollectionI rows,
-          AlignmentColsCollectionI cols, int width, int height)
+  private BufferedImage buildHiddenImage()
   {
     // new masking image
-    BufferedImage hiddenImage = new BufferedImage(width, height,
+    BufferedImage hiddenImage = new BufferedImage(w, h,
             BufferedImage.TYPE_INT_ARGB);
 
-    int colIndex = 0;
-    int pixelCol = 0;
-
     Color hidden = resColFinder.getHiddenColour();
 
     Graphics2D g2d = (Graphics2D) hiddenImage.getGraphics();
 
+    g2d.setColor(hidden);
     // set background to transparent
     // g2d.setComposite(AlphaComposite.Clear);
     // g2d.fillRect(0, 0, width, height);
@@ -294,124 +503,109 @@ public class OverviewRenderer
     // set next colour to opaque
     g2d.setComposite(AlphaComposite.Src);
 
-    for (int alignmentCol : cols)
+    // System.out.println(cols.getClass().getName());
+    if (cols.hasHidden())
     {
-      if (redraw)
-      {
-        break;
-      }
-
-      // calculate where this column extends to in pixels
-      int endCol = Math.min(Math.round((colIndex + 1) * pixelsPerCol) - 1,
-              hiddenImage.getWidth() - 1);
-
-      if (pixelCol <= endCol)
+      // AllColsCollection only
+      BitSet bs = cols.getHiddenBitSet();
+      for (int pixelCol = -1, icol2 = 0, icol = bs
+              .nextSetBit(0); icol >= 0; icol = bs.nextSetBit(icol2))
       {
-        // determine the colour based on the sequence and column position
-        if (cols.isHidden(alignmentCol))
+        if (redraw)
         {
-          g2d.setColor(hidden);
-          g2d.fillRect(pixelCol, 0, endCol - pixelCol + 1, height);
+          break;
+        }
+        icol2 = bs.nextClearBit(icol + 1);
+        int pixelEnd = getNextPixel(icol2, 0);
+        if (pixelEnd > pixelCol)
+        {
+          pixelCol = getNextPixel(icol, 0);
+          g2d.fillRect(pixelCol, 0, Math.max(1, pixelEnd - pixelCol),
+                  h);
+          pixelCol = pixelEnd;
         }
-
-        pixelCol = endCol + 1;
       }
-      colIndex++;
-
     }
-
-    int seqIndex = 0;
-    int pixelRow = 0;
-    for (int alignmentRow : rows)
+    if (rows.hasHidden())
     {
-      if (redraw)
+      int seqIndex = 0;
+      int pixelRow = 0;
+      for (int alignmentRow : rows)
       {
-        break;
-      }
+        if (redraw)
+        {
+          break;
+        }
 
-      // calculate where this row extends to in pixels
-      int endRow = Math.min(Math.round((seqIndex + 1) * pixelsPerSeq) - 1,
-              miniMe.getHeight() - 1);
+        // calculate where this row extends to in pixels
+        int endRow = Math.min(Math.round((++seqIndex) * pixelsPerSeq),
+                h);
 
-      // get details of this alignment row
-      if (rows.isHidden(alignmentRow))
-      {
-        g2d.setColor(hidden);
-        g2d.fillRect(0, pixelRow, width, endRow - pixelRow + 1);
+        // get details of this alignment row
+        if (rows.isHidden(alignmentRow))
+        {
+          g2d.fillRect(0, pixelRow, w, endRow - 1 - pixelRow);
+        }
+        pixelRow = endRow;
       }
-      pixelRow = endRow + 1;
-      seqIndex++;
     }
-
+    g2d.dispose();
     return hiddenImage;
   }
 
   /**
    * Draw the alignment annotation in the overview panel
    * 
-   * @param g
-   *          the graphics object to draw on
    * @param anno
    *          alignment annotation information
-   * @param y
-   *          y-position for the annotation graph
-   * @param cols
-   *          the collection of columns used in the overview panel
    */
-  public void drawGraph(Graphics g, AlignmentAnnotation anno, int y,
-          AlignmentColsCollectionI cols)
+  public void drawGraph(AlignmentAnnotation anno)
   {
+    int y = graphHeight;
+    Graphics g = miniMe.getGraphics();
+    g.translate(0, alignmentHeight);
+
     Annotation[] annotations = anno.annotations;
+    float max = anno.graphMax;
     g.setColor(Color.white);
-    g.fillRect(0, 0, miniMe.getWidth(), y);
+    g.fillRect(0, 0, w, y);
 
-    int height;
-    int colIndex = 0;
-    int pixelCol = 0;
-    for (int alignmentCol : cols)
+    for (int pixelCol = 0, colNext = 0, pixelEnd = 0, len = annotations.length, icol = bscol
+            .nextSetBit(0); icol >= 0
+                    && icol < len; icol = getNextCol(icol, pixelEnd))
     {
       if (redraw)
       {
-        changeSupport.firePropertyChange(UPDATE, MAX_PROGRESS - 1, 0);
+        if (showProgress)
+        {
+          changeSupport.firePropertyChange(UPDATE, MAX_PROGRESS - 1, 0);
+        }
         break;
       }
 
-      if (alignmentCol >= annotations.length)
+      ++colNext;
+      pixelEnd = getNextPixel(colNext, colNext);
+      Annotation ann = annotations[icol];
+      if (ann != null)
       {
-        break; // no more annotations to draw here
+        Color color = ann.colour;
+        g.setColor(color == null ? Color.black : color);
+        int height = Math.min(y, (int) ((ann.value / max) * y));
+        g.fillRect(pixelCol, y - height, Math.max(1, pixelEnd - pixelCol),
+                height);
       }
-      else
-      {
-        int endCol = Math.min(Math.round((colIndex + 1) * pixelsPerCol) - 1,
-                miniMe.getWidth() - 1);
-
-        if (annotations[alignmentCol] != null)
-        {
-          if (annotations[alignmentCol].colour == null)
-          {
-            g.setColor(Color.black);
-          }
-          else
-          {
-            g.setColor(annotations[alignmentCol].colour);
-          }
-
-          height = (int) ((annotations[alignmentCol].value / anno.graphMax)
-                  * y);
-          if (height > y)
-          {
-            height = y;
-          }
+      pixelCol = pixelEnd;
+    }
 
-          g.fillRect(pixelCol, y - height, endCol - pixelCol + 1, height);
-        }
+    g.translate(0, -alignmentHeight);
+    g.dispose();
 
-        pixelCol = endCol + 1;
-        colIndex++;
-      }
+    if (showProgress)
+    {
+      changeSupport.firePropertyChange(UPDATE, MAX_PROGRESS - 1,
+              MAX_PROGRESS);
     }
-    changeSupport.firePropertyChange(UPDATE, MAX_PROGRESS - 1,
-            MAX_PROGRESS);
+
   }
 
   /**
index a497d92..a98f3b3 100644 (file)
@@ -22,15 +22,16 @@ package jalview.renderer;
 
 import jalview.datamodel.SequenceGroup;
 import jalview.datamodel.SequenceI;
+import jalview.renderer.seqfeatures.FeatureColourFinder;
 import jalview.util.Comparison;
 
 import java.awt.Color;
 
 public class OverviewResColourFinder extends ResidueColourFinder
 {
-  final Color GAP_COLOUR; // default colour to use at gaps
+  final int GAP_COLOUR; // default colour to use at gaps
 
-  final Color RESIDUE_COLOUR; // default colour to use at residues
+  final int RESIDUE_COLOUR; // default colour to use at residues
 
   final Color HIDDEN_COLOUR; // colour for hidden regions
 
@@ -66,69 +67,99 @@ public class OverviewResColourFinder extends ResidueColourFinder
   {
     if (useLegacyColouring)
     {
-      GAP_COLOUR = Color.white;
-      RESIDUE_COLOUR = Color.lightGray;
-      HIDDEN_COLOUR = hiddenCol;
+      GAP_COLOUR = Color.white.getRGB();
+      RESIDUE_COLOUR = Color.lightGray.getRGB();
     }
     else
     {
-      GAP_COLOUR = gapCol;
-      RESIDUE_COLOUR = Color.white;
-      HIDDEN_COLOUR = hiddenCol;
+      GAP_COLOUR = gapCol.getRGB();
+      RESIDUE_COLOUR = Color.white.getRGB();
     }
+    HIDDEN_COLOUR = hiddenCol;
   }
 
   @Override
+  /**
+   * for Test suite only.
+   */
   public Color getBoxColour(ResidueShaderI shader, SequenceI seq, int i)
   {
-    Color resBoxColour = RESIDUE_COLOUR;
-    char currentChar = seq.getCharAt(i);
+    return new Color(getBoxColourInt(shader, seq, i));
+  }
 
+  public int getBoxColourInt(ResidueShaderI shader, SequenceI seq, int i)
+  {
+    char currentChar = seq.getCharAt(i);
     // In the overview window, gaps are coloured grey, unless the colour scheme
     // specifies a gap colour, in which case gaps honour the colour scheme
     // settings
-    if (shader.getColourScheme() != null)
+    boolean isGap = Comparison.isGap(currentChar);
+    if (shader.getColourScheme() == null)
     {
-      if (Comparison.isGap(currentChar)
-              && (!shader.getColourScheme().hasGapColour()))
-      {
-        resBoxColour = GAP_COLOUR;
-      }
-      else
-      {
-        resBoxColour = shader.findColour(currentChar, i, seq);
-      }
+      return (isGap ? GAP_COLOUR : RESIDUE_COLOUR);
     }
-    else if (Comparison.isGap(currentChar))
+    return (isGap && !shader.getColourScheme().hasGapColour() ? GAP_COLOUR
+            : shader.findColourInt(currentChar, i, seq));
+  }
+
+  /**
+   * For test suite only.
+   */
+  @Override
+  public Color getResidueColour(boolean showBoxes, ResidueShaderI shader,
+          SequenceGroup[] allGroups, final SequenceI seq, int i,
+          FeatureColourFinder finder)
+  {
+    return new Color(getResidueColourInt(showBoxes, shader, allGroups, seq,
+            i, finder));
+  }
+
+
+  public int getResidueColourInt(boolean showBoxes, ResidueShaderI shader,
+          SequenceGroup[] allGroups, final SequenceI seq, int i,
+          FeatureColourFinder finder)
+  {
+
+    int c = seq.getColor(i);
+    if (c != 0)
     {
-      resBoxColour = GAP_COLOUR;
+      return c;
     }
 
-    return resBoxColour;
+    int col = getResidueBoxColourInt(showBoxes, shader, allGroups, seq, i);
+
+    // if there's a FeatureColourFinder we might override the residue colour
+    // here with feature colouring
+    return seq.setColor(i,
+            finder == null || finder.noFeaturesDisplayed() ? col
+                    : finder.findFeatureColourInt(col, seq, i));
   }
 
   /**
-   * {@inheritDoc} In the overview, the showBoxes setting is ignored, as the
-   * overview displays the colours regardless.
+   * For test suite only.
    */
   @Override
   protected Color getResidueBoxColour(boolean showBoxes,
-          ResidueShaderI shader,
-          SequenceGroup[] allGroups, SequenceI seq, int i)
+          ResidueShaderI shader, SequenceGroup[] allGroups, SequenceI seq,
+          int i)
+  {
+    return new Color(
+            getResidueBoxColourInt(showBoxes, shader, allGroups, seq, i));
+  }
+
+  /**
+   * In the overview, the showBoxes setting is ignored, as the overview displays
+   * the colours regardless.
+   */
+  protected int getResidueBoxColourInt(boolean showBoxes,
+          ResidueShaderI shader, SequenceGroup[] allGroups, SequenceI seq,
+          int i)
   {
-    ResidueShaderI currentShader;
     SequenceGroup currentSequenceGroup = getCurrentSequenceGroup(allGroups,
             i);
-    if (currentSequenceGroup != null)
-    {
-      currentShader = currentSequenceGroup.getGroupColourScheme();
-    }
-    else
-    {
-      currentShader = shader;
-    }
-
-    return getBoxColour(currentShader, seq, i);
+    ResidueShaderI currentShader = (currentSequenceGroup == null ? shader
+            : currentSequenceGroup.getGroupColourScheme());
+    return getBoxColourInt(currentShader, seq, i);
   }
 
   /**
index 2da7233..2e45117 100644 (file)
@@ -116,12 +116,13 @@ public class ResidueColourFinder
   public SequenceGroup getCurrentSequenceGroup(SequenceGroup[] allGroups,
           int res)
   {
-    if (allGroups == null)
+    int n;
+    if (allGroups == null || (n = allGroups.length) == 0)
     {
       return null;
     }
 
-    for (int i = 0; i < allGroups.length; i++)
+    for (int i = 0; i < n; i++)
     {
       if ((allGroups[i].getStartRes() <= res)
               && (allGroups[i].getEndRes() >= res))
index c031170..73a5efd 100644 (file)
@@ -262,6 +262,36 @@ public class ResidueShader implements ResidueShaderI
     return colour;
   }
 
+  @Override
+  public int findColourInt(char symbol, int position, SequenceI seq)
+  {
+    if (colourScheme == null)
+    {
+      return -1;// Color.white; // Colour is 'None'
+    }
+
+    /*
+     * get 'base' colour
+     */
+    ProfileI profile = consensus == null ? null : consensus.get(position);
+    String modalResidue = profile == null ? null
+            : profile.getModalResidue();
+    float pid = profile == null ? 0f
+            : profile.getPercentageIdentity(ignoreGaps);
+    int colour = colourScheme
+            .findColour(symbol, position, seq, modalResidue, pid).getRGB();
+
+    /*
+     * apply PID threshold and consensus fading if in force
+     */
+    if (!Comparison.isGap(symbol))
+    {
+      colour = adjustColourInt(symbol, position, colour);
+    }
+
+    return colour;
+  }
+
   /**
    * Adjusts colour by applying thresholding or conservation shading, if in
    * force. That is
@@ -293,6 +323,20 @@ public class ResidueShader implements ResidueShaderI
     return colour;
   }
 
+  protected int adjustColourInt(char symbol, int column, int colour)
+  {
+    if (!aboveThreshold(symbol, column))
+    {
+      colour = -1;// Color.white;
+    }
+
+    if (conservationColouring)
+    {
+      colour = applyConservationInt(colour, column);
+    }
+    return colour;
+  }
+
   /**
    * Answers true if there is a consensus profile for the specified column, and
    * the given residue matches the consensus (or joint consensus) residue for
@@ -398,6 +442,45 @@ public class ResidueShader implements ResidueShaderI
     return ColorUtils.bleachColour(currentColour, bleachFactor);
   }
 
+  protected int applyConservationInt(int currentColour, int column)
+  {
+    if (conservation == null || conservation.length <= column)
+    {
+      return currentColour;
+    }
+    char conservationScore = conservation[column];
+
+    /*
+     * if residues are fully conserved (* or 11), or all properties
+     * are conserved (+ or 10), leave colour unchanged
+     */
+    if (conservationScore == '*' || conservationScore == '+'
+            || conservationScore == (char) 10
+            || conservationScore == (char) 11)
+    {
+      return currentColour;
+    }
+
+    if (Comparison.isGap(conservationScore))
+    {
+      return -1;// Color.white;
+    }
+
+    /*
+     * convert score 0-9 to a bleaching factor 1.1 - 0.2
+     */
+    float bleachFactor = (11 - (conservationScore - '0')) / 10f;
+
+    /*
+     * scale this up by 0-5 (percentage slider / 20)
+     * as a result, scores of:         0  1  2  3  4  5  6  7  8  9
+     * fade to white at slider value: 18 20 22 25 29 33 40 50 67 100%
+     */
+    bleachFactor *= (conservationIncrement / 20f);
+
+    return ColorUtils.bleachColourInt(currentColour, bleachFactor);
+  }
+
   /**
    * @see jalview.renderer.ResidueShaderI#getColourScheme()
    */
index 4d97171..2f14a5d 100644 (file)
@@ -82,4 +82,6 @@ public interface ResidueShaderI
 
   public abstract void setColourScheme(ColourSchemeI cs);
 
+  int findColourInt(char symbol, int position, SequenceI seq);
+
 }
\ No newline at end of file
index cfe2735..8da880a 100644 (file)
@@ -48,6 +48,8 @@ public class FeatureColourFinder
    */
   private BufferedImage offscreenImage;
 
+  private Graphics goff;
+
   /**
    * Constructor
    * 
@@ -57,6 +59,7 @@ public class FeatureColourFinder
   {
     featureRenderer = fr;
     offscreenImage = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
+    goff = offscreenImage.getGraphics();
   }
 
   /**
@@ -94,7 +97,7 @@ public class FeatureColourFinder
      */
     if (featureRenderer.getTransparency() != 1f)
     {
-      g = offscreenImage.getGraphics();
+      g = goff;
       if (defaultColour != null)
       {
         offscreenImage.setRGB(0, 0, defaultColour.getRGB());
@@ -114,13 +117,48 @@ public class FeatureColourFinder
     return c;
   }
 
+  public int findFeatureColourInt(int defaultColour, SequenceI seq,
+          int column)
+  {
+    // if (noFeaturesDisplayed())
+    // {
+    // return defaultColour;
+    // }
+
+    Graphics g = null;
+
+    /*
+     * if transparency applies, provide a notional 1x1 graphics context 
+     * that has been primed with the default colour
+     */
+    if (featureRenderer.getTransparency() != 1f)
+    {
+      g = goff;
+      if (defaultColour != 0)
+      {
+        offscreenImage.setRGB(0, 0, defaultColour);
+      }
+    }
+
+    Color c = featureRenderer.findFeatureColour(seq, column + 1, g);
+    if (c == null)
+    {
+      return defaultColour;
+    }
+
+    if (g != null)
+    {
+      return offscreenImage.getRGB(0, 0);
+    }
+    return c.getRGB();
+  }
   /**
    * Answers true if feature display is turned off, or there are no features
    * configured to be visible
    * 
    * @return
    */
-  boolean noFeaturesDisplayed()
+  public boolean noFeaturesDisplayed()
   {
     if (featureRenderer == null
             || !featureRenderer.getViewport().isShowSequenceFeatures())
index 13885b4..9988076 100644 (file)
@@ -26,6 +26,7 @@ import jalview.datamodel.ContiguousI;
 import jalview.datamodel.SequenceFeature;
 import jalview.datamodel.SequenceI;
 import jalview.util.Comparison;
+import jalview.util.Platform;
 import jalview.viewmodel.seqfeatures.FeatureRendererModel;
 
 import java.awt.AlphaComposite;
@@ -33,6 +34,7 @@ import java.awt.Color;
 import java.awt.FontMetrics;
 import java.awt.Graphics;
 import java.awt.Graphics2D;
+import java.util.ArrayList;
 import java.util.List;
 
 public class FeatureRenderer extends FeatureRendererModel
@@ -90,11 +92,13 @@ public class FeatureRenderer extends FeatureRendererModel
     int pady = (y1 + charHeight) - charHeight / 5;
 
     FontMetrics fm = g.getFontMetrics();
+    char s = '\0';
     for (int i = featureStart; i <= featureEnd; i++)
     {
-      char s = seq.getCharAt(i);
 
-      if (Comparison.isGap(s))
+      // colourOnly is just for Overview -- no need to check this again
+
+      if (!colourOnly && Comparison.isGap(s = seq.getCharAt(i)))
       {
         continue;
       }
@@ -103,7 +107,12 @@ public class FeatureRenderer extends FeatureRendererModel
 
       g.fillRect((i - start) * charWidth, y1, charWidth, charHeight);
 
-      if (colourOnly || !validCharWidth)
+      if (colourOnly)
+      {
+        return true;
+      }
+
+      if (!validCharWidth)
       {
         continue;
       }
@@ -117,6 +126,9 @@ public class FeatureRenderer extends FeatureRendererModel
   }
 
   /**
+   * 
+   * BH - this method is never called?
+   * 
    * Renders the sequence using the given SCORE feature colour between the given
    * start and end columns. Returns true if at least one column is drawn, else
    * false (the feature range does not overlap the start and end positions).
@@ -211,10 +223,12 @@ public class FeatureRenderer extends FeatureRendererModel
   @Override
   public Color findFeatureColour(SequenceI seq, int column, Graphics g)
   {
-    if (!av.isShowSequenceFeatures())
-    {
-      return null;
-    }
+    // BH 2019.08.01
+    // this is already checked in FeatureColorFinder
+    // if (!av.isShowSequenceFeatures())
+    // {
+    // return null;
+    // }
 
     // column is 'base 1' but getCharAt is an array index (ie from 0)
     if (Comparison.isGap(seq.getCharAt(column - 1)))
@@ -252,7 +266,8 @@ public class FeatureRenderer extends FeatureRendererModel
    * applies), or null if no feature is drawn in the range given.
    * 
    * @param g
-   *          the graphics context to draw on (may be null if colourOnly==true)
+   *          the graphics context to draw on (may be null only if t == 1 from
+   *          colourOnly==true)
    * @param seq
    * @param start
    *          start column
@@ -269,21 +284,27 @@ public class FeatureRenderer extends FeatureRendererModel
           final SequenceI seq, int start, int end, int y1,
           boolean colourOnly)
   {
+    // from SeqCanvas and OverviewRender
     /*
      * if columns are all gapped, or sequence has no features, nothing to do
      */
-    ContiguousI visiblePositions = seq.findPositions(start + 1, end + 1);
-    if (visiblePositions == null || !seq.getFeatures().hasFeatures())
+    ContiguousI visiblePositions;
+    if (!seq.getFeatures().hasFeatures() || (visiblePositions = seq
+            .findPositions(start + 1, end + 1)) == null)
     {
       return null;
     }
 
+    int vp0 = visiblePositions.getBegin();
+    int vp1 = visiblePositions.getEnd();
+
     updateFeatures();
 
-    if (transparency != 1f && g != null)
+    if (transparency != 1f) // g cannot be null here if trans == 1f - BH // && g
+                            // != null)
     {
-      Graphics2D g2 = (Graphics2D) g;
-      g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,
+      ((Graphics2D) g).setComposite(
+              AlphaComposite.getInstance(AlphaComposite.SRC_OVER,
               transparency));
     }
 
@@ -292,25 +313,28 @@ public class FeatureRenderer extends FeatureRendererModel
     /*
      * iterate over features in ordering of their rendering (last is on top)
      */
-    for (int renderIndex = 0; renderIndex < renderOrder.length; renderIndex++)
+    for (int renderIndex = 0, n = renderOrder.length; renderIndex < n; renderIndex++)
     {
       String type = renderOrder[renderIndex];
-      if (!showFeatureOfType(type))
+      if (!seq.hasFeatures(type) || !showFeatureOfType(type))
       {
         continue;
       }
 
       FeatureColourI fc = getFeatureStyle(type);
-      List<SequenceFeature> overlaps = seq.getFeatures().findFeatures(
-              visiblePositions.getBegin(), visiblePositions.getEnd(), type);
+      List<SequenceFeature> overlaps = seq.getFeatures().findFeatures(vp0,
+              vp1, type);
 
-      if (fc.isSimpleColour())
+      // colourOnly (i.e. Overview) can only be here if translucent, so
+      // there is no need to check for filtering
+      if (!colourOnly && fc.isSimpleColour())
       {
         filterFeaturesForDisplay(overlaps);
       }
 
-      for (SequenceFeature sf : overlaps)
+      for (int i = overlaps.size(); --i >= 0;)
       {
+        SequenceFeature sf = overlaps.get(i);
         Color featureColour = getColor(sf, fc);
         if (featureColour == null)
         {
@@ -325,22 +349,22 @@ public class FeatureRenderer extends FeatureRendererModel
          * restrict to visible positions (or if a contact feature,
          * to a single position)
          */
-        int visibleStart = sf.getBegin();
-        if (visibleStart < visiblePositions.getBegin())
+        int sf0 = sf.getBegin();
+        int sf1 = sf.getEnd();
+        int visibleStart = sf0;
+        if (visibleStart < vp0)
         {
-          visibleStart = sf.isContactFeature() ? sf.getEnd()
-                  : visiblePositions.getBegin();
+          visibleStart = sf.isContactFeature() ? sf1 : vp0;
         }
-        int visibleEnd = sf.getEnd();
-        if (visibleEnd > visiblePositions.getEnd())
+        int visibleEnd = sf1;
+        if (visibleEnd > vp1)
         {
-          visibleEnd = sf.isContactFeature() ? sf.getBegin()
-                  : visiblePositions.getEnd();
+          visibleEnd = sf.isContactFeature() ? sf0 : vp1;
         }
 
         int featureStartCol = seq.findIndex(visibleStart);
-        int featureEndCol = sf.begin == sf.end ? featureStartCol : seq
-                .findIndex(visibleEnd);
+        int featureEndCol = (sf.begin == sf.end ? featureStartCol
+                : seq.findIndex(visibleEnd));
 
         // Color featureColour = getColour(sequenceFeature);
 
@@ -381,26 +405,24 @@ public class FeatureRenderer extends FeatureRendererModel
           else
           {
           */
-            boolean drawn = renderFeature(g, seq,
-                    featureStartCol - 1,
-                    featureEndCol - 1, featureColour,
-                    start, end, y1, colourOnly);
-            if (drawn)
-            {
-              drawnColour = featureColour;
-            }
+          boolean drawn = renderFeature(g, seq, featureStartCol - 1,
+                  featureEndCol - 1, featureColour, start, end, y1,
+                  colourOnly);
+          if (drawn)
+          {
+            drawnColour = featureColour;
+          }
           /*}*/
         }
       }
     }
 
-    if (transparency != 1.0f && g != null)
+    if (transparency != 1.0f)
     {
       /*
        * reset transparency
        */
-      Graphics2D g2 = (Graphics2D) g;
-      g2.setComposite(NO_TRANSPARENCY);
+      ((Graphics2D) g).setComposite(NO_TRANSPARENCY);
     }
 
     return drawnColour;
@@ -417,6 +439,10 @@ public class FeatureRenderer extends FeatureRendererModel
     findAllFeatures();
   }
 
+  private List<SequenceFeature> overlaps = (Platform.isJS()
+          ? new ArrayList<>()
+          : null);
+
   /**
    * Returns the sequence feature colour rendered at the given column position,
    * or null if none found. The feature of highest render order (i.e. on top) is
@@ -428,12 +454,18 @@ public class FeatureRenderer extends FeatureRendererModel
    * colour for features enclosing a gapped column. Check for gap before calling
    * if different behaviour is wanted.
    * 
+   * BH 2019.07.30
+   * 
+   * Adds a result ArrayList to parameters in order to avoid an unnecessary
+   * construction of that for every pixel checked.
+   * 
+   * 
    * @param seq
    * @param column
    *          (1..)
    * @return
    */
-  Color findFeatureColour(SequenceI seq, int column)
+  private Color findFeatureColour(SequenceI seq, int column)
   {
     /*
      * check for new feature added while processing
@@ -444,22 +476,29 @@ public class FeatureRenderer extends FeatureRendererModel
      * inspect features in reverse renderOrder (the last in the array is 
      * displayed on top) until we find one that is rendered at the position
      */
-    for (int renderIndex = renderOrder.length
-            - 1; renderIndex >= 0; renderIndex--)
+    for (int renderIndex = renderOrder.length; --renderIndex >= 0;)
     {
       String type = renderOrder[renderIndex];
-      if (!showFeatureOfType(type))
+      if (!seq.hasFeatures(type) || !showFeatureOfType(type))
       {
         continue;
       }
 
-      List<SequenceFeature> overlaps = seq.findFeatures(column, column,
-              type);
-      for (SequenceFeature sequenceFeature : overlaps)
+      if (overlaps != null)
       {
-        if (!featureGroupNotShown(sequenceFeature))
+        overlaps.clear();
+      }
+      List<SequenceFeature> list = seq.findFeatures(column, type, overlaps);
+      if (list.size() > 0)
+      {
+        for (int i = 0, n = list.size(); i < n; i++)
         {
-          Color col = getColour(sequenceFeature);
+          SequenceFeature sf = list.get(i);
+          if (featureGroupNotShown(sf))
+          {
+            continue;
+          }
+          Color col = getColour(sf);
           if (col != null)
           {
             return col;
index a37882f..7c8c9a6 100644 (file)
@@ -20,6 +20,8 @@
  */
 package jalview.rest;
 
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
 import jalview.httpserver.AbstractRequestHandler;
 
 import java.io.IOException;
@@ -30,20 +32,16 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 /**
- * A simple handler to process (or delegate) HTTP requests on /jalview/rest
+ * A simple handler to process (or delegate) HTTP requests on /jalview/rest.
  */
 public class RestHandler extends AbstractRequestHandler
+        implements ApplicationSingletonI
 {
   private static final String MY_PATH = "rest";
 
   private static final String MY_NAME = "Rest";
 
   /**
-   * Singleton instance of this class
-   */
-  private static RestHandler instance = null;
-
-  /**
    * Returns the singleton instance of this class
    * 
    * @return
@@ -53,12 +51,8 @@ public class RestHandler extends AbstractRequestHandler
   {
     synchronized (RestHandler.class)
     {
-      if (instance == null)
-      {
-        instance = new RestHandler();
-      }
+      return (RestHandler) ApplicationSingletonProvider.getInstance(RestHandler.class);
     }
-    return instance;
   }
 
   /**
index 75a07b9..5461ec0 100755 (executable)
@@ -167,8 +167,8 @@ public class AnnotationColourGradient extends FollowerColourScheme
     if (annotation.isRNA())
     {
       // reset colour palette
-      ColourSchemeProperty.resetRnaHelicesShading();
-      ColourSchemeProperty.initRnaHelicesShading(1 + (int) aamax);
+      ColourSchemes.resetRnaHelicesShading();
+      ColourSchemes.initRnaHelicesShading(1 + (int) aamax);
     }
   }
 
@@ -218,7 +218,7 @@ public class AnnotationColourGradient extends FollowerColourScheme
       }
       if (rna)
       {
-        ColourSchemeProperty.initRnaHelicesShading(1 + (int) aamax);
+        ColourSchemes.initRnaHelicesShading(1 + (int) aamax);
       }
     }
   }
@@ -355,7 +355,7 @@ public class AnnotationColourGradient extends FollowerColourScheme
         {
           if (ann.isRNA())
           {
-            result = ColourSchemeProperty.rnaHelices[(int) aj.value];
+            result = ColourSchemes.getInstance().rnaHelices[(int) aj.value];
           }
           else
           {
index 2d5b23d..0123384 100755 (executable)
@@ -22,9 +22,6 @@ package jalview.schemes;
 
 import jalview.api.AlignViewportI;
 import jalview.datamodel.AnnotatedCollectionI;
-import jalview.util.ColorUtils;
-
-import java.awt.Color;
 
 /**
  * ColourSchemeProperty binds names to hardwired colourschemes and tries to deal
@@ -41,6 +38,11 @@ import java.awt.Color;
 public class ColourSchemeProperty
 {
 
+  private ColourSchemeProperty()
+  {
+    // requires static call to getColourScheme(...).
+  }
+
   /**
    * Returns a colour scheme for the given name, with which the given data may
    * be coloured. The name is not case-sensitive, and may be one of
@@ -109,41 +111,6 @@ public class ColourSchemeProperty
     return ucs;
   }
 
-  public static Color rnaHelices[] = null;
-
-  public static void initRnaHelicesShading(int n)
-  {
-    int j = 0;
-    if (rnaHelices == null)
-    {
-      rnaHelices = new Color[n + 1];
-    }
-    else if (rnaHelices != null && rnaHelices.length <= n)
-    {
-      Color[] t = new Color[n + 1];
-      System.arraycopy(rnaHelices, 0, t, 0, rnaHelices.length);
-      j = rnaHelices.length;
-      rnaHelices = t;
-    }
-    else
-    {
-      return;
-    }
-    // Generate random colors and store
-    for (; j <= n; j++)
-    {
-      rnaHelices[j] = ColorUtils.generateRandomColor(Color.white);
-    }
-  }
-
-  /**
-   * delete the existing cached RNA helices colours
-   */
-  public static void resetRnaHelicesShading()
-  {
-    rnaHelices = null;
-  }
-
   /**
    * Returns the name of the colour scheme (or "None" if it is null)
    * 
index d31fbba..e11540c 100644 (file)
 package jalview.schemes;
 
 import jalview.api.AlignViewportI;
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
 import jalview.datamodel.AnnotatedCollectionI;
 import jalview.datamodel.SequenceCollectionI;
 import jalview.datamodel.SequenceI;
+import jalview.util.ColorUtils;
 
+import java.awt.Color;
 import java.util.LinkedHashMap;
 import java.util.Map;
 
-public class ColourSchemes
+public class ColourSchemes implements ApplicationSingletonI
 {
-  /*
-   * singleton instance of this class
-   */
-  private static ColourSchemes instance = new ColourSchemes();
-
-  /*
-   * a map from scheme name (lower-cased) to an instance of it
-   */
-  private Map<String, ColourSchemeI> schemes;
 
   /**
    * Returns the singleton instance of this class
@@ -47,7 +42,8 @@ public class ColourSchemes
    */
   public static ColourSchemes getInstance()
   {
-    return instance;
+    return (ColourSchemes) ApplicationSingletonProvider
+            .getInstance(ColourSchemes.class);
   }
 
   private ColourSchemes()
@@ -56,6 +52,51 @@ public class ColourSchemes
   }
 
   /**
+   * ColourSchemeProperty "static"
+   */
+  public Color[] rnaHelices = null;
+
+  /**
+   * delete the existing cached RNA helices colours
+   */
+  public static void resetRnaHelicesShading()
+  {
+    getInstance().rnaHelices = null;
+  }
+
+  public static void initRnaHelicesShading(int n)
+  {
+    int i = 0;
+    ColourSchemes j = getInstance();
+
+    if (j.rnaHelices == null)
+    {
+      j.rnaHelices = new Color[n + 1];
+    }
+    else if (j.rnaHelices != null && j.rnaHelices.length <= n)
+    {
+      Color[] t = new Color[n + 1];
+      System.arraycopy(j.rnaHelices, 0, t, 0, j.rnaHelices.length);
+      i = j.rnaHelices.length;
+      j.rnaHelices = t;
+    }
+    else
+    {
+      return;
+    }
+    // Generate random colors and store
+    for (; i <= n; i++)
+    {
+      j.rnaHelices[i] = ColorUtils.generateRandomColor(Color.white);
+    }
+  }
+
+  /**
+   * a map from scheme name (lower-cased) to an instance of it
+   */
+  private Map<String, ColourSchemeI> schemes;
+
+  /**
    * Loads an instance of each standard or user-defined colour scheme
    * 
    * @return
@@ -72,16 +113,12 @@ public class ColourSchemes
     {
       try
       {
-        registerColourScheme(
-                cs.getSchemeClass().getDeclaredConstructor().newInstance());
+        registerColourScheme(cs.getSchemeClass().newInstance());
       } catch (InstantiationException | IllegalAccessException e)
       {
         System.err.println("Error instantiating colour scheme for "
                 + cs.toString() + " " + e.getMessage());
         e.printStackTrace();
-      } catch (ReflectiveOperationException roe)
-      {
-        roe.printStackTrace();
       }
     }
   }
index 9d2c738..f0d1990 100755 (executable)
@@ -53,10 +53,8 @@ public class Consensus
   /**
    * @deprecated Use {@link #isConserved(int[][],int,int,boolean)} instead
    */
-  @Deprecated
   public boolean isConserved(int[][] cons2, int col, int size)
   {
-    System.out.println("DEPRECATED!!!!");
     return isConserved(cons2, col, size, true);
   }
 
@@ -73,7 +71,7 @@ public class Consensus
       tot += cons2[col][mask[i]];
     }
 
-    if (tot > ((threshold * size) / 100))
+    if ((double) tot > ((threshold * size) / 100))
     {
       // System.out.println("True conserved "+tot+" from "+threshold+" out of
       // "+size+" : "+maskstr);
index 0d36f4f..6483b85 100644 (file)
@@ -323,7 +323,7 @@ public class FeatureColour implements FeatureColourI
       {
         if (minval.length() > 0)
         {
-          min = Float.valueOf(minval).floatValue();
+          min = new Float(minval).floatValue();
         }
       } catch (Exception e)
       {
@@ -335,7 +335,7 @@ public class FeatureColour implements FeatureColourI
       {
         if (maxval.length() > 0)
         {
-          max = Float.valueOf(maxval).floatValue();
+          max = new Float(maxval).floatValue();
         }
       } catch (Exception e)
       {
@@ -403,7 +403,7 @@ public class FeatureColour implements FeatureColourI
         {
           gcol.nextToken();
           tval = gcol.nextToken();
-          featureColour.setThreshold(Float.valueOf(tval).floatValue());
+          featureColour.setThreshold(new Float(tval).floatValue());
         } catch (Exception e)
         {
           System.err.println("Couldn't parse threshold value as a float: ("
index 33b275d..c61eeed 100644 (file)
@@ -70,14 +70,14 @@ public class RNAHelicesColour extends ResidueColourScheme
   {
     super(ResidueProperties.nucleotideIndex);
     this.annotation = annotation;
-    ColourSchemeProperty.resetRnaHelicesShading();
+    ColourSchemes.resetRnaHelicesShading();
     refresh();
   }
 
   public RNAHelicesColour(AnnotatedCollectionI alignment)
   {
     super(ResidueProperties.nucleotideIndex);
-    ColourSchemeProperty.resetRnaHelicesShading();
+    ColourSchemes.resetRnaHelicesShading();
     alignmentChanged(alignment, null);
   }
 
@@ -160,7 +160,7 @@ public class RNAHelicesColour extends ResidueColourScheme
         }
 
       }
-      ColourSchemeProperty.initRnaHelicesShading(numHelix);
+      ColourSchemes.initRnaHelicesShading(numHelix);
     }
   }
 
@@ -200,7 +200,7 @@ public class RNAHelicesColour extends ResidueColourScheme
     currentHelix = positionsToHelix.get(j);
     if (currentHelix != null)
     {
-      currentColour = ColourSchemeProperty.rnaHelices[Integer
+      currentColour = ColourSchemes.getInstance().rnaHelices[Integer
               .parseInt(currentHelix)];
     }
     return currentColour;
index 5f84ca0..df6610a 100755 (executable)
@@ -498,34 +498,35 @@ public class ResidueProperties
    * Color.white, // R Color.white, // Y Color.white, // N Color.white, // Gap
    */
 
-  public static String STOP = "STOP";
+  public static final String STOP = "STOP";
 
-  public static List<String> STOP_CODONS = Arrays.asList("TGA", "TAA", "TAG");
+  public static final List<String> STOP_CODONS = Arrays.asList("TGA", "TAA",
+          "TAG");
 
-  public static String START = "ATG";
+  public static final String START = "ATG";
 
   // Stores residue codes/names and colours and other things
-  public static Map<String, Map<String, Integer>> propHash = new Hashtable<>();
+  public static final Map<String, Map<String, Integer>> propHash = new Hashtable<>();
 
-  public static Map<String, Integer> hydrophobic = new Hashtable<>();
+  public static final Map<String, Integer> hydrophobic = new Hashtable<>();
 
-  public static Map<String, Integer> polar = new Hashtable<>();
+  public static final Map<String, Integer> polar = new Hashtable<>();
 
-  public static Map<String, Integer> small = new Hashtable<>();
+  public static final Map<String, Integer> small = new Hashtable<>();
 
-  public static Map<String, Integer> positive = new Hashtable<>();
+  public static final Map<String, Integer> positive = new Hashtable<>();
 
-  public static Map<String, Integer> negative = new Hashtable<>();
+  public static final Map<String, Integer> negative = new Hashtable<>();
 
-  public static Map<String, Integer> charged = new Hashtable<>();
+  public static final Map<String, Integer> charged = new Hashtable<>();
 
-  public static Map<String, Integer> aromatic = new Hashtable<>();
+  public static final Map<String, Integer> aromatic = new Hashtable<>();
 
-  public static Map<String, Integer> aliphatic = new Hashtable<>();
+  public static final Map<String, Integer> aliphatic = new Hashtable<>();
 
-  public static Map<String, Integer> tiny = new Hashtable<>();
+  public static final Map<String, Integer> tiny = new Hashtable<>();
 
-  public static Map<String, Integer> proline = new Hashtable<>();
+  public static final Map<String, Integer> proline = new Hashtable<>();
 
   static
   {
@@ -896,8 +897,7 @@ public class ResidueProperties
 
   public static String codonTranslate(String lccodon)
   {
-    String peptide = GeneticCodes.getInstance().getStandardCodeTable()
-            .translate(lccodon);
+    String peptide = GeneticCodes.getStandardCodeTable().translate(lccodon);
     if ("*".equals(peptide))
     {
       return "STOP";
@@ -909,7 +909,7 @@ public class ResidueProperties
    * lookup of (A-Z) alternative secondary structure symbols'
    * equivalents in DSSP3 notation
    */
-  private static char[] toDssp3State;
+  private final static char[] toDssp3State;
   static
   {
     toDssp3State = new char[9]; // for 'A'-'I'; extend if needed
index 9662fee..b5672ab 100644 (file)
@@ -20,6 +20,8 @@
  */
 package jalview.structure;
 
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
 import jalview.datamodel.PDBEntry;
 import jalview.datamodel.PDBEntry.Type;
 
@@ -30,27 +32,39 @@ import jalview.datamodel.PDBEntry.Type;
  * @author tcofoegbu
  *
  */
-public class StructureImportSettings
+public class StructureImportSettings implements ApplicationSingletonI
 {
+
+  private StructureImportSettings()
+  {
+    // private singleton
+  }
+
+  private static StructureImportSettings getInstance()
+  {
+    return (StructureImportSettings) ApplicationSingletonProvider
+            .getInstance(StructureImportSettings.class);
+  }
+
   /**
    * 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;
+  private boolean visibleChainAnnotation = false;
 
   /**
    * Set true to predict secondary structure (using JMol for protein, Annotate3D
    * for RNA)
    */
-  private static boolean processSecStr = false;
+  private boolean processSecStr = 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 boolean externalSecondaryStructure = false;
 
-  private static boolean showSeqFeatures = true;
+  private boolean showSeqFeatures = true;
 
   public enum StructureParser
   {
@@ -61,92 +75,93 @@ public class StructureImportSettings
    * Determines the default file format for structure files to be downloaded
    * from the PDB sequence fetcher. Possible options include: PDB|mmCIF
    */
-  private static PDBEntry.Type defaultStructureFileFormat = Type.PDB;
+  private PDBEntry.Type defaultStructureFileFormat = Type.PDB;
 
   /**
    * Determines the parser used for parsing PDB format file. Possible options
    * are : JMolParser|JalveiwParser
    */
-  private static StructureParser defaultPDBFileParser = StructureParser.JMOL_PARSER;
+  private StructureParser defaultPDBFileParser = StructureParser.JMOL_PARSER;
 
   public static void addSettings(boolean addAlignmentAnnotations,
           boolean processSecStr, boolean externalSecStr)
   {
-    StructureImportSettings.visibleChainAnnotation = addAlignmentAnnotations;
-    StructureImportSettings.processSecStr = processSecStr;
-    StructureImportSettings.externalSecondaryStructure = externalSecStr;
-    StructureImportSettings.showSeqFeatures = true;
+    StructureImportSettings s = getInstance();
+    s.visibleChainAnnotation = addAlignmentAnnotations;
+    s.processSecStr = processSecStr;
+    s.externalSecondaryStructure = externalSecStr;
+    s.showSeqFeatures = true;
   }
 
   public static boolean isVisibleChainAnnotation()
   {
-    return visibleChainAnnotation;
+    return getInstance().visibleChainAnnotation;
   }
 
   public static void setVisibleChainAnnotation(
           boolean visibleChainAnnotation)
   {
-    StructureImportSettings.visibleChainAnnotation = visibleChainAnnotation;
+    getInstance().visibleChainAnnotation = visibleChainAnnotation;
   }
 
   public static boolean isProcessSecondaryStructure()
   {
-    return processSecStr;
+    return getInstance().processSecStr;
   }
 
   public static void setProcessSecondaryStructure(
           boolean processSecondaryStructure)
   {
-    StructureImportSettings.processSecStr = processSecondaryStructure;
+    getInstance().processSecStr = processSecondaryStructure;
   }
 
   public static boolean isExternalSecondaryStructure()
   {
-    return externalSecondaryStructure;
+    return getInstance().externalSecondaryStructure;
   }
 
   public static void setExternalSecondaryStructure(
           boolean externalSecondaryStructure)
   {
-    StructureImportSettings.externalSecondaryStructure = externalSecondaryStructure;
+    getInstance().externalSecondaryStructure = externalSecondaryStructure;
   }
 
   public static boolean isShowSeqFeatures()
   {
-    return showSeqFeatures;
+    return getInstance().showSeqFeatures;
   }
 
   public static void setShowSeqFeatures(boolean showSeqFeatures)
   {
-    StructureImportSettings.showSeqFeatures = showSeqFeatures;
+    getInstance().showSeqFeatures = showSeqFeatures;
   }
 
   public static PDBEntry.Type getDefaultStructureFileFormat()
   {
-    return defaultStructureFileFormat;
+    return getInstance().defaultStructureFileFormat;
   }
 
   public static void setDefaultStructureFileFormat(
           String defaultStructureFileFormat)
   {
-    StructureImportSettings.defaultStructureFileFormat = PDBEntry.Type
+    getInstance().defaultStructureFileFormat = PDBEntry.Type
             .valueOf(defaultStructureFileFormat.toUpperCase());
   }
 
   public static String getDefaultPDBFileParser()
   {
-    return defaultPDBFileParser.toString();
+    return getInstance().defaultPDBFileParser.toString();
   }
 
   public static void setDefaultPDBFileParser(
           StructureParser defaultPDBFileParser)
   {
-    StructureImportSettings.defaultPDBFileParser = defaultPDBFileParser;
+    getInstance().defaultPDBFileParser = defaultPDBFileParser;
   }
 
   public static void setDefaultPDBFileParser(String defaultPDBFileParser)
   {
-    StructureImportSettings.defaultPDBFileParser = StructureParser
+    getInstance().defaultPDBFileParser = StructureParser
             .valueOf(defaultPDBFileParser.toUpperCase());
   }
 
index 1744467..012dff3 100644 (file)
@@ -22,6 +22,8 @@ package jalview.structure;
 
 import jalview.analysis.AlignSeq;
 import jalview.api.StructureSelectionManagerProvider;
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
 import jalview.commands.CommandI;
 import jalview.commands.EditCommand;
 import jalview.commands.OrderCommand;
@@ -41,7 +43,6 @@ import jalview.io.DataSourceType;
 import jalview.io.StructureFile;
 import jalview.util.MappingUtils;
 import jalview.util.MessageManager;
-import jalview.util.Platform;
 import jalview.ws.sifts.SiftsClient;
 import jalview.ws.sifts.SiftsException;
 import jalview.ws.sifts.SiftsSettings;
@@ -61,12 +62,10 @@ import mc_view.Atom;
 import mc_view.PDBChain;
 import mc_view.PDBfile;
 
-public class StructureSelectionManager
+public class StructureSelectionManager implements ApplicationSingletonI
 {
   public final static String NEWLINE = System.lineSeparator();
 
-  static IdentityHashMap<StructureSelectionManagerProvider, StructureSelectionManager> instances;
-
   private List<StructureMapping> mappings = new ArrayList<>();
 
   private boolean processSecondaryStructure = false;
@@ -84,6 +83,77 @@ public class StructureSelectionManager
 
   private List<SelectionListener> sel_listeners = new ArrayList<>();
 
+  /*
+   * instances of this class scoped by some context class
+   */
+  private IdentityHashMap<StructureSelectionManagerProvider, StructureSelectionManager> structureSelections;
+
+  /**
+   * Answers an instance of this class for the current application (Java or JS
+   * 'applet') scope
+   * 
+   * @return
+   */
+  private static StructureSelectionManager getInstance()
+  {
+    return (StructureSelectionManager) ApplicationSingletonProvider
+            .getInstance(StructureSelectionManager.class);
+  }
+
+  /**
+   * Answers an instance of this class for the current application (Java or JS
+   * 'applet') scope, and scoped to the specified context
+   * 
+   * @param context
+   * @return
+   */
+  public static StructureSelectionManager getStructureSelectionManager(
+          StructureSelectionManagerProvider context)
+  {
+    return getInstance().getInstanceForContext(context);
+  }
+
+  /**
+   * Answers an instance of this class scoped to the given context. The instance
+   * is created on the first request for the context, thereafter the same
+   * instance is returned. Note that the context may be null (this is the case
+   * when running headless without a Desktop).
+   * 
+   * @param context
+   * @return
+   */
+  StructureSelectionManager getInstanceForContext(
+          StructureSelectionManagerProvider context)
+  {
+    StructureSelectionManager instance = structureSelections.get(context);
+    if (instance == null)
+    {
+      instance = new StructureSelectionManager();
+      structureSelections.put(context, instance);
+    }
+    return instance;
+  }
+
+  /**
+   * Removes the instance associated with this provider
+   * 
+   * @param provider
+   */
+
+  public static void release(StructureSelectionManagerProvider provider)
+  {
+    getInstance().structureSelections.remove(provider);
+  }
+
+  /**
+   * Private constructor as all 'singleton' instances are managed here or by
+   * ApplicationSingletonProvider
+   */
+  private StructureSelectionManager()
+  {
+    structureSelections = new IdentityHashMap<>();
+  }
+
   /**
    * @return true if will try to use external services for processing secondary
    *         structure
@@ -198,49 +268,6 @@ public class StructureSelectionManager
             || pdbIdFileName.containsKey(idOrFile);
   }
 
-  private static StructureSelectionManager nullProvider = null;
-
-  public static StructureSelectionManager getStructureSelectionManager(
-          StructureSelectionManagerProvider context)
-  {
-    if (context == null)
-    {
-      if (nullProvider == null)
-      {
-        if (instances != null)
-        {
-          throw new Error(MessageManager.getString(
-                  "error.implementation_error_structure_selection_manager_null"),
-                  new NullPointerException(MessageManager
-                          .getString("exception.ssm_context_is_null")));
-        }
-        else
-        {
-          nullProvider = new StructureSelectionManager();
-        }
-        return nullProvider;
-      }
-    }
-    if (instances == null)
-    {
-      instances = new java.util.IdentityHashMap<>();
-    }
-    StructureSelectionManager instance = instances.get(context);
-    if (instance == null)
-    {
-      if (nullProvider != null)
-      {
-        instance = nullProvider;
-      }
-      else
-      {
-        instance = new StructureSelectionManager();
-      }
-      instances.put(context, instance);
-    }
-    return instance;
-  }
-
   /**
    * flag controlling whether SeqMappings are relayed from received sequence
    * mouse over events to other sequences
@@ -270,7 +297,7 @@ public class StructureSelectionManager
     return relaySeqMappings;
   }
 
-  Vector listeners = new Vector();
+  Vector<Object> listeners = new Vector<>();
 
   /**
    * register a listener for alignment sequence mouseover events
@@ -308,6 +335,8 @@ public class StructureSelectionManager
    * Import structure data and register a structure mapping for broadcasting
    * colouring, mouseovers and selection events (convenience wrapper).
    * 
+   * This is the standard entry point.
+   * 
    * @param sequence
    *          - one or more sequences to be mapped to pdbFile
    * @param targetChains
@@ -332,8 +361,11 @@ public class StructureSelectionManager
    * broadcasting colouring, mouseovers and selection events (convenience
    * wrapper).
    * 
+   * 
+   * 
    * @param forStructureView
-   *          when true, record the mapping for use in mouseOvers
+   *          when true (testng only), record the mapping for use in mouseOvers
+   *          (testng only)
    * @param sequence
    *          - one or more sequences to be mapped to pdbFile
    * @param targetChains
@@ -377,7 +409,7 @@ public class StructureSelectionManager
    *          mapping operation
    * @return null or the structure data parsed as a pdb file
    */
-  synchronized public StructureFile computeMapping(
+  synchronized private StructureFile computeMapping(
           boolean forStructureView, SequenceI[] sequenceArray,
           String[] targetChainIds, String pdbFile, DataSourceType sourceType,
           IProgressIndicator progress)
@@ -651,7 +683,6 @@ public class StructureSelectionManager
         {
           ds = ds.getDatasetSequence();
         }
-        ;
         if (ds.getAnnotation() != null)
         {
           for (AlignmentAnnotation ala : ds.getAnnotation())
@@ -1171,8 +1202,7 @@ public class StructureSelectionManager
     StringBuilder sb = new StringBuilder(64);
     for (StructureMapping sm : mappings)
     {
-      if (Platform.pathEquals(sm.pdbfile, pdbfile)
-              && seqs.contains(sm.sequence))
+      if (sm.pdbfile.equals(pdbfile) && seqs.contains(sm.sequence))
       {
         sb.append(sm.mappingDetails);
         sb.append(NEWLINE);
@@ -1234,43 +1264,22 @@ public class StructureSelectionManager
   }
 
   /**
-   * Resets this object to its initial state by removing all registered
-   * listeners, codon mappings, PDB file mappings
+   * Reset this object to its initial state by removing all registered
+   * listeners, codon mappings, PDB file mappings.
+   * 
+   * Called only by Desktop and testng.
+   * 
    */
   public void resetAll()
   {
-    if (mappings != null)
-    {
-      mappings.clear();
-    }
-    if (seqmappings != null)
-    {
-      seqmappings.clear();
-    }
-    if (sel_listeners != null)
-    {
-      sel_listeners.clear();
-    }
-    if (listeners != null)
-    {
-      listeners.clear();
-    }
-    if (commandListeners != null)
-    {
-      commandListeners.clear();
-    }
-    if (view_listeners != null)
-    {
-      view_listeners.clear();
-    }
-    if (pdbFileNameId != null)
-    {
-      pdbFileNameId.clear();
-    }
-    if (pdbIdFileName != null)
-    {
-      pdbIdFileName.clear();
-    }
+    mappings.clear();
+    seqmappings.clear();
+    sel_listeners.clear();
+    listeners.clear();
+    commandListeners.clear();
+    view_listeners.clear();
+    pdbFileNameId.clear();
+    pdbIdFileName.clear();
   }
 
   public void addSelectionListener(SelectionListener selecter)
@@ -1321,41 +1330,10 @@ public class StructureSelectionManager
         {
           slis.viewPosition(startRes, endRes, startSeq, endSeq, source);
         }
-        ;
       }
     }
   }
-
-  /**
-   * release all references associated with this manager provider
-   * 
-   * @param jalviewLite
-   */
-  public static void release(StructureSelectionManagerProvider jalviewLite)
-  {
-    // synchronized (instances)
-    {
-      if (instances == null)
-      {
-        return;
-      }
-      StructureSelectionManager mnger = (instances.get(jalviewLite));
-      if (mnger != null)
-      {
-        instances.remove(jalviewLite);
-        try
-        {
-          /* bsoares 2019-03-20 finalize deprecated, no apparent external
-           * resources to close
-           */
-          // mnger.finalize();
-        } catch (Throwable x)
-        {
-        }
-      }
-    }
-  }
-
+  
   public void registerPDBEntry(PDBEntry pdbentry)
   {
     if (pdbentry.getFile() != null
index 2528286..a98e4b1 100644 (file)
@@ -355,8 +355,8 @@ public abstract class AAStructureBindingModel
               { Integer.valueOf(pe).toString() }));
     }
     final String nullChain = "TheNullChain";
-    List<SequenceI> s = new ArrayList<SequenceI>();
-    List<String> c = new ArrayList<String>();
+    List<SequenceI> s = new ArrayList<>();
+    List<String> c = new ArrayList<>();
     if (getChains() == null)
     {
       setChains(new String[getPdbCount()][]);
@@ -425,8 +425,8 @@ public abstract class AAStructureBindingModel
   public synchronized PDBEntry[] addSequenceAndChain(PDBEntry[] pdbe,
           SequenceI[][] seq, String[][] chns)
   {
-    List<PDBEntry> v = new ArrayList<PDBEntry>();
-    List<int[]> rtn = new ArrayList<int[]>();
+    List<PDBEntry> v = new ArrayList<>();
+    List<int[]> rtn = new ArrayList<>();
     for (int i = 0; i < getPdbCount(); i++)
     {
       v.add(getPdbEntry(i));
@@ -512,12 +512,10 @@ public abstract class AAStructureBindingModel
   }
 
   /**
-   * Returns a readable description of all mappings for the wrapped pdbfile to
-   * any mapped sequences
    * 
-   * @param pdbfile
-   * @param seqs
-   * @return
+   * @return a readable description of all mappings for the wrapped pdbfile to
+   *         any mapped sequences
+   * 
    */
   public String printMappings()
   {
index 7dd1a19..cd7e98e 100644 (file)
 
 package jalview.urls;
 
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
+
 /**
  * Holds settings for identifiers.org e.g. url, download location
- * 
- * @author $author$
- * @version $Revision$
  */
-public class IdOrgSettings
+public class IdOrgSettings implements ApplicationSingletonI
 {
-  private static String url;
+  private String url;
 
-  private static String location;
+  private String location;
+
+  private static IdOrgSettings getInstance()
+  {
+    return (IdOrgSettings) ApplicationSingletonProvider
+            .getInstance(IdOrgSettings.class);
+  }
 
   public static void setUrl(String seturl)
   {
-    url = seturl;
+    getInstance().url = seturl;
   }
 
   public static void setDownloadLocation(String setloc)
   {
-    location = setloc;
+    getInstance().location = setloc;
   }
 
   public static String getUrl()
   {
-    return url;
+    return getInstance().url;
   }
 
   public static String getDownloadLocation()
   {
-    return location;
+    return getInstance().location;
+  }
+
+  private IdOrgSettings()
+  {
+    // private singleton
   }
 }
index 07eb23e..a44b9b9 100644 (file)
@@ -85,6 +85,7 @@ private HashMap<String, UrlLink> readIdentifiers(String idFileName)
     {
        // NOTE: THIS WILL FAIL IN SWINGJS BECAUSE IT INVOLVES A FILE READER
     
+      System.out.println("IDentifiersURL " + idFileName);
       FileReader reader = new FileReader(idFileName);
       String key = "";
       Map<String, Object> obj = (Map<String, Object>) JSONUtils.parse(reader);
@@ -118,7 +119,8 @@ private HashMap<String, UrlLink> readIdentifiers(String idFileName)
       }
     } catch (IOException | ParseException e)
     {
-      // unnecessary e.printStackTrace();
+      // unnecessary 
+      e.printStackTrace();
       // Note how in JavaScript we can grab the first bytes from any file reader. 
       // Typical report here is "NetworkError" because the file does not exist.
       // "https://." is coming from System.getProperty("user.home"), but this could
index 8119daa..ca2e55e 100755 (executable)
@@ -28,9 +28,14 @@ import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 
 /**
- * BrowserLauncher is a class that provides one static method, openURL, which
- * opens the default web browser for the current user of the system to the given
- * URL. It may support other protocols depending on the system -- mailto, ftp,
+ * BrowserLauncher is a class that provides two static methods:
+ * 
+ * openURL(String url), which opens the default web browser for the current user
+ * of the system to the given URL, and
+ * 
+ * resetBrowser(), which allows switching browsers in Java.
+ * 
+ * openURL may support other protocols depending on the system -- mailto, ftp,
  * etc. -- but that has not been rigorously tested and is not guaranteed to
  * work.
  * <p>
@@ -79,6 +84,14 @@ import java.lang.reflect.Method;
  *         "mailto:ejalbert@cs.stanford.edu">ejalbert@cs.stanford.edu</a>)
  * @version 1.4b1 (Released June 20, 2001)
  */
+/*
+ * 
+ * SwingJS note: Do not use methods in this class directly. Use
+ * 
+ * Platform.openURL(String url) only.
+ * 
+ * JavaScript does not see this class.
+ */
 public class BrowserLauncher
 {
   /**
@@ -101,22 +114,22 @@ public class BrowserLauncher
   private static boolean loadedWithoutErrors;
 
   /** The com.apple.mrj.MRJFileUtils class */
-  private static Class mrjFileUtilsClass;
+  private static Class<?> mrjFileUtilsClass;
 
   /** The com.apple.mrj.MRJOSType class */
-  private static Class mrjOSTypeClass;
+  private static Class<?> mrjOSTypeClass;
 
   /** The com.apple.MacOS.AEDesc class */
-  private static Class aeDescClass;
+  private static Class<?> aeDescClass;
 
   /** The &lt;init&gt;(int) method of com.apple.MacOS.AETarget */
-  private static Constructor aeTargetConstructor;
+  private static Constructor<?> aeTargetConstructor;
 
   /** The &lt;init&gt;(int, int, int) method of com.apple.MacOS.AppleEvent */
-  private static Constructor appleEventConstructor;
+  private static Constructor<?> appleEventConstructor;
 
   /** The &lt;init&gt;(String) method of com.apple.MacOS.AEDesc */
-  private static Constructor aeDescConstructor;
+  private static Constructor<?> aeDescConstructor;
 
   /** The findFolder method of com.apple.mrj.MRJFileUtils */
   private static Method findFolder;
@@ -236,14 +249,6 @@ public class BrowserLauncher
 
     loadedWithoutErrors = true;
 
-    if (!Platform.isJS())
-    /**
-     * Java only
-     * 
-     * @j2sIgnore
-     * 
-     */
-    {
     String osName = System.getProperty("os.name");
 
     if (osName.startsWith("Mac OS"))
@@ -316,7 +321,6 @@ public class BrowserLauncher
     { // if we haven't hit any errors yet
       loadedWithoutErrors = loadClasses();
     }
-    }
   }
 
   /**
@@ -336,24 +340,17 @@ public class BrowserLauncher
   private static boolean loadClasses()
   {
 
-    if (!Platform.isJS())
-    /**
-     * Java only
-     * 
-     * @j2sIgnore
-     * 
-     */
-    {
     switch (jvm)
     {
     case MRJ_2_0:
 
       try
       {
-        Class aeTargetClass = Class.forName("com.apple.MacOS.AETarget");
-        Class osUtilsClass = Class.forName("com.apple.MacOS.OSUtils");
-        Class appleEventClass = Class.forName("com.apple.MacOS.AppleEvent");
-        Class aeClass = Class.forName("com.apple.MacOS.ae");
+        Class<?> aeTargetClass = Class.forName("com.apple.MacOS.AETarget");
+        Class<?> osUtilsClass = Class.forName("com.apple.MacOS.OSUtils");
+        Class<?> appleEventClass = Class
+                .forName("com.apple.MacOS.AppleEvent");
+        Class<?> aeClass = Class.forName("com.apple.MacOS.ae");
         aeDescClass = Class.forName("com.apple.MacOS.AEDesc");
 
         aeTargetConstructor = aeTargetClass
@@ -464,8 +461,8 @@ public class BrowserLauncher
 
       try
       {
-        Class linker = Class.forName("com.apple.mrj.jdirect.Linker");
-        Constructor constructor = linker
+        Class<?> linker = Class.forName("com.apple.mrj.jdirect.Linker");
+        Constructor<?> constructor = linker
                 .getConstructor(new Class[]
                 { Class.class });
         linkage = constructor
@@ -526,7 +523,6 @@ public class BrowserLauncher
       break;
     }
 
-    }
     return true;
   }
 
@@ -543,14 +539,6 @@ public class BrowserLauncher
    */
   private static Object locateBrowser()
   {
-    if (!Platform.isJS())
-    /**
-     * Java only
-     * 
-     * @j2sIgnore
-     * 
-     */
-    {
     if (browser != null)
     {
       return browser;
@@ -716,11 +704,7 @@ public class BrowserLauncher
 
       break;
     }
-
-    }
-
     return browser;
-
   }
 
   /**
@@ -742,20 +726,11 @@ public class BrowserLauncher
    */
   public static void openURL(String url) throws IOException
   {
-
     if (Platform.isJS())
     {
       Platform.openURL(url);
       return;
     }
-    else
-    /**
-     * Java only
-     * 
-     * @j2sIgnore
-     */
-    {
-
     if (!loadedWithoutErrors)
     {
       throw new IOException(MessageManager
@@ -934,14 +909,11 @@ public class BrowserLauncher
       break;
 
     default:
-
       // This should never occur, but if it does, we'll try the simplest thing
       // possible
       Runtime.getRuntime().exec(new String[] { (String) browser, url });
-
       break;
     }
-    }
   }
 
 
index 60129fb..a2d8d3e 100644 (file)
@@ -199,6 +199,42 @@ public class ColorUtils
     }
   }
 
+  public static int bleachColourInt(int colour, float bleachFactor)
+  {
+    if (bleachFactor >= 1f)
+    {
+      return -1;// Color.WHITE;
+    }
+    if (bleachFactor <= -1f)
+    {
+      return 0xFF000000;// Color.BLACK;
+    }
+    if (bleachFactor == 0f)
+    {
+      return colour;
+    }
+
+    int red = (colour >> 16) & 0xFF;// getRed();
+    int green = (colour >> 8) & 0xFF;// colour.getGreen();
+    int blue = colour & 0xFF;// .getBlue();
+
+    if (bleachFactor > 0)
+    {
+      red += (255 - red) * bleachFactor;
+      green += (255 - green) * bleachFactor;
+      blue += (255 - blue) * bleachFactor;
+    }
+    else
+    {
+      float factor = 1 + bleachFactor;
+      red *= factor;
+      green *= factor;
+      blue *= factor;
+    }
+    return 0xFF000000 | (red << 16) | (green << 8) | blue;// new Color(red,
+                                                          // green, blue);
+  }
+
   /**
    * Parses a string into a Color, where the accepted formats are
    * <ul>
@@ -225,6 +261,7 @@ public class ColorUtils
       col = new Color(value);
     } catch (NumberFormatException ex)
     {
+      col = Platform.getColorFromName(colour);
     }
 
     if (col == null)
@@ -319,57 +356,8 @@ public class ColorUtils
    */
   public static Color getAWTColorFromName(String name)
   {
-    if (name == null)
-    {
-      return null;
-    }
-    Color col = null;
-    name = name.toLowerCase();
-
-    // or make a static map; or use reflection on the field name
-    switch (name)
-    {
-    case "black":
-      col = Color.black;
-      break;
-    case "blue":
-      col = Color.blue;
-      break;
-    case "cyan":
-      col = Color.cyan;
-      break;
-    case "darkgray":
-      col = Color.darkGray;
-      break;
-    case "gray":
-      col = Color.gray;
-      break;
-    case "green":
-      col = Color.green;
-      break;
-    case "lightgray":
-      col = Color.lightGray;
-      break;
-    case "magenta":
-      col = Color.magenta;
-      break;
-    case "orange":
-      col = Color.orange;
-      break;
-    case "pink":
-      col = Color.pink;
-      break;
-    case "red":
-      col = Color.red;
-      break;
-    case "white":
-      col = Color.white;
-      break;
-    case "yellow":
-      col = Color.yellow;
-      break;
-    }
-
-    return col;
+    return Platform.getColorFromName(name); // BH 2019 -- allows for wide range
+                                            // of JavaScript colors (for
+                                            // JavaScript only)
   }
 }
index fb54bba..197261a 100755 (executable)
@@ -32,7 +32,6 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 import com.stevesoft.pat.Regex;
 
@@ -96,14 +95,14 @@ public class DBRefUtils
        }
 
        // BH TODO (what?)
-       HashSet<String> srcs = new HashSet<String>();
+       HashSet<String> srcs = new HashSet<>();
        for (String src : sources) 
        {
          srcs.add(src.toUpperCase());
        }
 
        int nrefs = dbrefs.size();
-       List<DBRefEntry> res = new ArrayList<DBRefEntry>();
+       List<DBRefEntry> res = new ArrayList<>();
        for (int ib = 0; ib < nrefs; ib++) 
        {
          DBRefEntry dbr = dbrefs.get(ib);
@@ -217,7 +216,7 @@ public class DBRefUtils
         * @return
         */
        public static List<DBRefEntry> searchRefs(List<DBRefEntry> refs, String accId) {
-               List<DBRefEntry> rfs = new ArrayList<DBRefEntry>();
+               List<DBRefEntry> rfs = new ArrayList<>();
                if (refs == null || accId == null) {
                        return rfs;
                }
@@ -243,7 +242,7 @@ public class DBRefUtils
         * @return
         */
        static List<DBRefEntry> searchRefs(List<DBRefEntry> refs, DBRefEntry entry, DbRefComp comparator, int mode) {
-               List<DBRefEntry> rfs = new ArrayList<DBRefEntry>();
+               List<DBRefEntry> rfs = new ArrayList<>();
                if (refs == null || entry == null) {
                        return rfs;
                }
@@ -450,6 +449,14 @@ public class DBRefUtils
     return matches;
   }
 
+  private static Regex PARSE_REGEX;
+
+  private static Regex getParseRegex()
+  {
+    return (PARSE_REGEX == null ? PARSE_REGEX = Platform.newRegex(
+            "([0-9][0-9A-Za-z]{3})\\s*(.?)\\s*;\\s*([0-9]+)-([0-9]+)", null)
+            : PARSE_REGEX);
+  }
        /**
         * Parses a DBRefEntry and adds it to the sequence, also a PDBEntry if the
         * database is PDB.
@@ -471,7 +478,7 @@ public class DBRefUtils
                                /*
                                 * Check for PFAM style stockhom PDB accession id citation e.g. "1WRI A; 7-80;"
                                 */
-                               Regex r = new com.stevesoft.pat.Regex("([0-9][0-9A-Za-z]{3})\\s*(.?)\\s*;\\s*([0-9]+)-([0-9]+)");
+        Regex r = getParseRegex();
                                if (r.search(acn.trim())) {
                                        String pdbid = r.stringMatched(1);
                                        String chaincode = r.stringMatched(2);
@@ -558,7 +565,7 @@ public class DBRefUtils
         * @return
         */
        public static List<DBRefEntry> searchRefsForSource(List<DBRefEntry> dbRefs, String source) {
-               List<DBRefEntry> matches = new ArrayList<DBRefEntry>();
+               List<DBRefEntry> matches = new ArrayList<>();
                if (dbRefs != null && source != null) {
                        for (DBRefEntry dbref : dbRefs) {
                                if (source.equalsIgnoreCase(dbref.getSource())) {
@@ -621,7 +628,9 @@ public class DBRefUtils
                bsSelect.set(0, dbrefs.size());
 
                if (!selectRefsBS(dbrefs, isProtein ? DBRefSource.PROTEIN_MASK : DBRefSource.DNA_CODING_MASK, bsSelect))
-                       return;
+    {
+      return;
+    }
 
 //      selfs.addAll(selfArray);
 //    }
@@ -631,7 +640,9 @@ public class DBRefUtils
                        DBRefEntry p = pr.get(ip);
                        for (int i = bsSelect.nextSetBit(0); i >= 0; i = bsSelect.nextSetBit(i + 1)) {
                                if (dbrefs.get(i) == p)
-                                       bsSelect.clear(i);
+        {
+          bsSelect.clear(i);
+        }
                        }
 //      while (selfs.contains(p))
 //      {
@@ -655,7 +666,9 @@ public class DBRefUtils
                                // TODO: promote transcript refs ??
                        }
                        if (keys == 0 || !selectRefsBS(dbrefs, keys, bsSelect))
-                               return;
+      {
+        return;
+      }
 //      if (candidates != null)
                        {
                                for (int ic = bsSelect.nextSetBit(0); ic >= 0; ic = bsSelect.nextSetBit(ic + 1))
index 67309a0..e4c4ad0 100644 (file)
  */
 package jalview.util;
 
-import jalview.datamodel.Sequence;
 import jalview.datamodel.SequenceI;
 
 import java.util.Hashtable;
 
+import com.stevesoft.pat.Regex;
+
+/**
+ * This class is not implemented because Preferences never puts anything in
+ * groupURLLinks.
+ * 
+ * @author hansonr
+ *
+ */
 public class GroupUrlLink
 {
+  @SuppressWarnings("serial")
   public class UrlStringTooLongException extends Exception
   {
     public UrlStringTooLongException(int lng)
@@ -66,11 +75,6 @@ public class GroupUrlLink
   private String invalidMessage = null;
 
   /**
-   * tokens that can be replaced in the URL.
-   */
-  private static String[] tokens;
-
-  /**
    * position of each token (which can appear once only) in the url
    */
   private int[] segs;
@@ -79,32 +83,34 @@ public class GroupUrlLink
    * contains tokens in the order they appear in the URL template.
    */
   private String[] mtch;
-  static
-  {
-    if (tokens == null)
-    {
-      tokens = new String[] { "SEQUENCEIDS", "SEQUENCES", "DATASETID" };
-    }
-  }
-
-  /**
-   * test for GroupURLType bitfield (with default tokens)
-   */
-  public static final int SEQUENCEIDS = 1;
-
-  /**
-   * test for GroupURLType bitfield (with default tokens)
-   */
-  public static final int SEQUENCES = 2;
 
   /**
-   * test for GroupURLType bitfield (with default tokens)
+   * tokens that can be replaced in the URL.
    */
-  public static final int DATASETID = 4;
-
+  private static final String[] tokens = new String[] { "SEQUENCEIDS",
+      "SEQUENCES", "DATASETID" };
+
+  // /**
+  // * test for GroupURLType bitfield (with default tokens)
+  // */
+  // private static final int SEQUENCEIDS = 1;
+  //
+  // /**
+  // * test for GroupURLType bitfield (with default tokens)
+  // */
+  // private static final int SEQUENCES = 2;
+  //
+  // /**
+  // * test for GroupURLType bitfield (with default tokens)
+  // */
+  // private static final int DATASETID = 4;
+  //
   // private int idseg = -1, seqseg = -1;
 
   /**
+   * 
+   * called by PopupMenu.buildGroupURLMenu()
+   * 
    * parse the given linkString of the form '<label>|<url>|separator
    * char[|optional sequence separator char]' into parts. url may contain a
    * string $SEQUENCEIDS<=optional regex=>$ where <=optional regex=> must be of
@@ -215,8 +221,7 @@ public class GroupUrlLink
         regexReplace[pass] = link.substring(ptok[pass] + mlength, p);
         try
         {
-          com.stevesoft.pat.Regex rg = com.stevesoft.pat.Regex
-                  .perlCode("/" + regexReplace[pass] + "/");
+          Regex rg = Platform.newRegexPerl("/" + regexReplace[pass] + "/");
           if (rg == null)
           {
             invalidMessage = "Invalid Regular Expression : '"
@@ -284,6 +289,9 @@ public class GroupUrlLink
   }
 
   /**
+   * 
+   * called by PopupMenu.addShowLink()
+   * 
    * @return the url_prefix
    */
   public String getUrl_prefix()
@@ -292,6 +300,8 @@ public class GroupUrlLink
   }
 
   /**
+   * called by PopupMenu.buildGroupURLMenu()
+   * 
    * @return the target
    */
   public String getTarget()
@@ -300,6 +310,9 @@ public class GroupUrlLink
   }
 
   /**
+   * 
+   * called by PopupMenu.buildGroupURLMenu()
+   * 
    * @return the label
    */
   public String getLabel()
@@ -308,34 +321,9 @@ public class GroupUrlLink
   }
 
   /**
-   * @return the sequence ID regexReplace
-   */
-  public String getIDRegexReplace()
-  {
-    return _replaceFor(tokens[0]);
-  }
-
-  private String _replaceFor(String token)
-  {
-    for (int i = 0; i < mtch.length; i++)
-    {
-      if (segs[i] > -1 && mtch[i].equals(token))
-      {
-        return regexReplace[i];
-      }
-    }
-    return null;
-  }
-
-  /**
-   * @return the sequence ID regexReplace
-   */
-  public String getSeqRegexReplace()
-  {
-    return _replaceFor(tokens[1]);
-  }
-
-  /**
+   * 
+   * called by PopupMenu.buildGroupURLMenu()
+   * 
    * @return the invalidMessage
    */
   public String getInvalidMessage()
@@ -344,6 +332,8 @@ public class GroupUrlLink
   }
 
   /**
+   * called by PopupMenu.buildGroupURLMenu()
+   * 
    * Check if URL string was parsed properly.
    * 
    * @return boolean - if false then <code>getInvalidMessage</code> returns an
@@ -355,27 +345,34 @@ public class GroupUrlLink
   }
 
   /**
-   * return one or more URL strings by applying regex to the given idstring
    * 
-   * @param idstrings
-   *          array of id strings to pass to service
-   * @param seqstrings
-   *          array of seq strings to pass to service
+   * called by PopupMenu.buildGroupURLMenu()
+   * 
+   * This method is never called, because PopupMenu.buildGroupMenu() is never
+   * called. It relates to the popup menu for the idPanel.
+   * 
+   * @param ids
+   * @param seqstr
+   * @param string
    * @param onlyIfMatches
-   *          - when true url strings are only made if regex is defined and
-   *          matches for all qualified tokens in groupURL - TODO: consider if
-   *          onlyIfMatches is really a useful parameter!
-   * @return null or Object[] { int[] { number of seqs substituted},boolean[] {
-   *         which seqs were substituted }, StringBuffer[] { substituted lists
-   *         for each token }, String[] { url } }
+   * @return URL stub objects ready to pass to constructFrom in the form of
+   *         Object[] { int[], boolean[], Hashtable&lt;String, String[]&gt;,
+   *         boolean[] }
    * @throws UrlStringTooLongException
    */
-  public Object[] makeUrls(String[] idstrings, String[] seqstrings,
-          String dsstring, boolean onlyIfMatches)
-          throws UrlStringTooLongException
+  public Object[] makeUrlStubs(String[] ids, String[] seqstr, String string,
+          boolean onlyIfMatches) throws UrlStringTooLongException
   {
-    Hashtable rstrings = replacementArgs(idstrings, seqstrings, dsstring);
-    return makeUrls(rstrings, onlyIfMatches);
+    Hashtable<String, String[]> rstrings = replacementArgs(ids, seqstr,
+            string);
+    boolean createFullURL = false;
+    Object[] stubs = makeUrlsIf(createFullURL, rstrings, onlyIfMatches);
+    // stubs is just { int[] boolean[] }
+    return stubs == null ? null
+            : new Object[]
+            { stubs[0], stubs[1], rstrings,
+                new boolean[]
+                { onlyIfMatches } }; // int[] boolean[] Hashtable boolean[]
   }
 
   /**
@@ -386,10 +383,10 @@ public class GroupUrlLink
    * @param dsstring
    * @return
    */
-  private Hashtable replacementArgs(String[] idstrings, String[] seqstrings,
-          String dsstring)
+  private Hashtable<String, String[]> replacementArgs(String[] idstrings,
+          String[] seqstrings, String dsstring)
   {
-    Hashtable rstrings = new Hashtable();
+    Hashtable<String, String[]> rstrings = new Hashtable<>();
     rstrings.put(tokens[0], idstrings);
     rstrings.put(tokens[1], seqstrings);
     rstrings.put(tokens[2], new String[] { dsstring });
@@ -401,50 +398,34 @@ public class GroupUrlLink
     return rstrings;
   }
 
-  public Object[] makeUrls(Hashtable repstrings, boolean onlyIfMatches)
-          throws UrlStringTooLongException
-  {
-    return makeUrlsIf(true, repstrings, onlyIfMatches);
-  }
-
   /**
+   * Called from PopupMenu.addShowLink action listener
    * 
-   * @param ids
-   * @param seqstr
-   * @param string
-   * @param b
-   * @return URL stub objects ready to pass to constructFrom
-   * @throws UrlStringTooLongException
-   */
-  public Object[] makeUrlStubs(String[] ids, String[] seqstr, String string,
-          boolean b) throws UrlStringTooLongException
-  {
-    Hashtable rstrings = replacementArgs(ids, seqstr, string);
-    Object[] stubs = makeUrlsIf(false, rstrings, b);
-    if (stubs != null)
-    {
-      return new Object[] { stubs[0], stubs[1], rstrings,
-          new boolean[]
-          { b } };
-    }
-    // TODO Auto-generated method stub
-    return null;
-  }
-
-  /**
    * generate the URL for the given URL stub object array returned from
    * makeUrlStubs
    * 
    * @param stubs
-   * @return URL string.
+   *          Object[] { int[] { number of matches seqs }, boolean[] { which
+   *          matched }, (if createFullUrl also has StringBuffer[] { segment
+   *          generated from inputs that is used in URL }, String[] { url })}
+   * @return URL string
    * @throws UrlStringTooLongException
    */
+  @SuppressWarnings("unchecked")
   public String constructFrom(Object[] stubs)
           throws UrlStringTooLongException
   {
-    Object[] results = makeUrlsIf(true, (Hashtable) stubs[2],
-            ((boolean[]) stubs[3])[0]);
-    return ((String[]) results[3])[0];
+    // Object[] {
+    // int[] { number of matches seqs },
+    // boolean[] { which matched }
+    // }
+
+    boolean createFullURL = true;
+    Hashtable<String, String[]> repstrings = (Hashtable<String, String[]>) stubs[2];
+    boolean onlyIfMatches = ((boolean[]) stubs[3])[0];
+    String url = ((String[]) makeUrlsIf(createFullURL, repstrings,
+            onlyIfMatches)[3])[0];
+    return url;
   }
 
   /**
@@ -460,7 +441,8 @@ public class GroupUrlLink
    *         }, String[] { url })}
    * @throws UrlStringTooLongException
    */
-  protected Object[] makeUrlsIf(boolean createFullUrl, Hashtable repstrings,
+  private Object[] makeUrlsIf(boolean createFullUrl,
+          Hashtable<String, String[]> repstrings,
           boolean onlyIfMatches) throws UrlStringTooLongException
   {
     int pass = 0;
@@ -470,7 +452,7 @@ public class GroupUrlLink
     int mins = 0, maxs = 0; // allowed two values, 1 or n-sequences.
     for (int i = 0; i < mtch.length; i++)
     {
-      idseq[i] = (String[]) repstrings.get(mtch[i]);
+      idseq[i] = repstrings.get(mtch[i]);
       if (idseq[i].length >= 1)
       {
         if (mins == 0 && idseq[i].length == 1)
@@ -503,14 +485,13 @@ public class GroupUrlLink
     // iterate through input, collating segments to be inserted into url
     StringBuffer matched[] = new StringBuffer[idseq.length];
     // and precompile regexes
-    com.stevesoft.pat.Regex[] rgxs = new com.stevesoft.pat.Regex[matched.length];
+    Regex[] rgxs = new Regex[matched.length];
     for (pass = 0; pass < matched.length; pass++)
     {
       matched[pass] = new StringBuffer();
       if (regexReplace[pass] != null)
       {
-        rgxs[pass] = com.stevesoft.pat.Regex
-                .perlCode("/" + regexReplace[pass] + "/");
+        rgxs[pass] = Platform.newRegexPerl("/" + regexReplace[pass] + "/");
       }
       else
       {
@@ -693,7 +674,8 @@ public class GroupUrlLink
     {
       // just return the essential info about what the URL would be generated
       // from
-      return new Object[] { new int[] { seqsmatched }, thismatched };
+      return new Object[] { new int[] { seqsmatched }, thismatched // boolean[]
+      };
     }
     // otherwise, create the URL completely.
 
@@ -708,13 +690,17 @@ public class GroupUrlLink
       }
     }
 
-    return new Object[] { new int[] { seqsmatched }, thismatched, matched,
+    // full return
+    return new Object[] { new int[] { seqsmatched }, thismatched, // boolean[]
+        matched, // StringBuffer[]
         new String[]
         { submiturl.toString() } };
   }
 
   /**
    * 
+   * Called by PopupMenu.addShowLinks()
+   * 
    * @param urlstub
    * @return number of distinct sequence (id or seuqence) replacements predicted
    *         for this stub
@@ -726,6 +712,8 @@ public class GroupUrlLink
   }
 
   /**
+   * called by PopupMenu.buildGroupURLMenu()
+   * 
    * get token types present in this url as a bitfield indicating presence of
    * each token from tokens (LSB->MSB).
    * 
@@ -747,6 +735,215 @@ public class GroupUrlLink
     return r;
   }
 
+  /**
+   * called by PopupMenu.buildGroupURLMenu()
+   * 
+   * covenience method to generate the id and sequence string vector from a set
+   * of seuqences using each sequence's getName() and getSequenceAsString()
+   * method
+   * 
+   * @param seqs
+   * @return String[][] {{sequence ids},{sequence strings}}
+   */
+  public static String[][] formStrings(SequenceI[] seqs)
+  {
+    String[][] idset = new String[2][seqs.length];
+    for (int i = 0; i < seqs.length; i++)
+    {
+      idset[0][i] = seqs[i].getName();
+      idset[1][i] = seqs[i].getSequenceAsString();
+    }
+    return idset;
+  }
+
+  // commented out test code
+  //
+  // /**
+  // *
+  // * @param argv
+  // * @j2sIgnore
+  // */
+  // public static void main(String argv[])
+  // {
+  // // note - JAL-1383 - these services are all dead
+  // String[] links = new String[] {
+  // "EnVision2|IDS|http://www.ebi.ac.uk/enfin-srv/envision2/pages/linkin.jsf?workflow=Enfin%20Default%20Workflow&datasetName=linkInDatasetFromJalview&input=$SEQUENCEIDS$&inputType=0|,",
+  // "EnVision2|Seqs|http://www.ebi.ac.uk/enfin-srv/envision2/pages/linkin.jsf?workflow=Enfin%20Default%20Workflow&datasetName=linkInDatasetFromJalview&input=$SEQUENCES$&inputType=1|,",
+  // "EnVision2|IDS|http://www.ebi.ac.uk/enfin-srv/envision2/pages/linkin.jsf?workflow=Enfin%20Default%20Workflow&datasetName=$DATASETID$&input=$SEQUENCEIDS$&inputType=0|,",
+  // "EnVision2|Seqs|http://www.ebi.ac.uk/enfin-srv/envision2/pages/linkin.jsf?workflow=Enfin%20Default%20Workflow&datasetName=$DATASETID$&input=$SEQUENCES$&inputType=1|,",
+  // "EnVision2|IDS|http://www.ebi.ac.uk/enfin-srv/envision2/pages/linkin.jsf?workflow=$SEQUENCEIDS$&datasetName=linkInDatasetFromJalview&input=$SEQUENCEIDS$&inputType=0|,",
+  // "EnVision2|Seqs|http://www.ebi.ac.uk/enfin-srv/envision2/pages/linkin.jsf?workflow=$SEQUENCEIDS$&datasetName=$DATASETID$&input=$SEQUENCES$&inputType=1|,",
+  // "EnVision2
+  // Seqs|http://www.ebi.ac.uk/enfin-srv/envision2/pages/linkin.jsf?workflow=Default&datasetName=JalviewSeqs$DATASETID$&input=$SEQUENCES=/([a-zA-Z]+)/=$&inputType=1|,",
+  // "EnVision2
+  // Seqs|http://www.ebi.ac.uk/enfin-srv/envision2/pages/linkin.jsf?workflow=Default&datasetName=JalviewSeqs$DATASETID$&input=$SEQUENCES=/[A-Za-z]+/=$&inputType=1|,"
+  // /*
+  // *
+  // http://www.ebi.ac.uk/enfin-srv/envision2/pages/linkin.jsf?input=P38389,P38398
+  // * &inputType=0&workflow=Enfin%20Default%20Workflow&datasetName=
+  // * linkInDatasetFromPRIDE
+  // */
+  // };
+  //
+  // SequenceI[] seqs = new SequenceI[] {
+  // new Sequence("StupidLabel:gi|9234|pdb|102L|A",
+  // "asdiasdpasdpadpwpadasdpaspdw"), };
+  // String[][] seqsandids = formStrings(seqs);
+  // for (int i = 0; i < links.length; i++)
+  // {
+  // GroupUrlLink ul = new GroupUrlLink(links[i]);
+  // if (ul.isValid())
+  // {
+  // System.out.println("\n\n\n");
+  // System.out.println(
+  // "Link " + i + " " + links[i] + " : " + ul.toString());
+  // System.out.println(" pref : " + ul.getUrl_prefix());
+  // System.out.println(" IdReplace : " + ul.getIDRegexReplace());
+  // System.out.println(" SeqReplace : " + ul.getSeqRegexReplace());
+  // System.out.println(" Suffixes : " + ul.getUrl_suffix());
+  //
+  // System.out.println(
+  // "<insert input id and sequence strings here> Without onlyIfMatches:");
+  // Object[] urls;
+  // try
+  // {
+  // urls = ul.makeUrls(seqsandids[0], seqsandids[1], "mydataset",
+  // false);
+  // testUrls(ul, seqsandids, urls);
+  // } catch (UrlStringTooLongException ex)
+  // {
+  // System.out.println("too long exception " + ex);
+  // }
+  // System.out.println(
+  // "<insert input id and sequence strings here> With onlyIfMatches set:");
+  // try
+  // {
+  // urls = ul.makeUrls(seqsandids[0], seqsandids[1], "mydataset",
+  // true);
+  // testUrls(ul, seqsandids, urls);
+  // } catch (UrlStringTooLongException ex)
+  // {
+  // System.out.println("too long exception " + ex);
+  // }
+  // }
+  // else
+  // {
+  // System.err.println("Invalid URLLink : " + links[i] + " : "
+  // + ul.getInvalidMessage());
+  // }
+  // }
+  // }
+  // /**
+  // * @return the sequence ID regexReplace
+  // */
+  // private String getIDRegexReplace()
+  // {
+  // String token = tokens[0];
+  // for (int i = 0; i < mtch.length; i++)
+  // {
+  // if (segs[i] > -1 && mtch[i].equals(token))
+  // {
+  // return regexReplace[i];
+  // }
+  // }
+  // return null;
+  // }
+  //
+  // /**
+  // * @return the sequence ID regexReplace
+  // */
+  // private String getSeqRegexReplace()
+  // {
+  // return _replaceFor(tokens[1]);
+  // }
+  //
+  // /**
+  // * report stats about the generated url string given an input set
+  // *
+  // * @param ul
+  // * @param idstring
+  // * @param url
+  // */
+  // private static void testUrls(GroupUrlLink ul, String[][] idstring,
+  // Object[] url)
+  // {
+  //
+  // if (url == null)
+  // {
+  // System.out.println("Created NO urls.");
+  // }
+  // else
+  // {
+  // System.out.println("Created a url from " + ((int[]) url[0])[0]
+  // + "out of " + idstring[0].length + " sequences.");
+  // System.out.println("Sequences that did not match:");
+  // for (int sq = 0; sq < idstring[0].length; sq++)
+  // {
+  // if (!((boolean[]) url[1])[sq])
+  // {
+  // System.out.println("Seq " + sq + ": " + idstring[0][sq] + "\t: "
+  // + idstring[1][sq]);
+  // }
+  // }
+  // System.out.println("Sequences that DID match:");
+  // for (int sq = 0; sq < idstring[0].length; sq++)
+  // {
+  // if (((boolean[]) url[1])[sq])
+  // {
+  // System.out.println("Seq " + sq + ": " + idstring[0][sq] + "\t: "
+  // + idstring[1][sq]);
+  // }
+  // }
+  // System.out.println("The generated URL:");
+  // System.out.println(((String[]) url[3])[0]);
+  // }
+  // }
+  //
+  // public void setLabel(String newlabel)
+  // {
+  // this.label = newlabel;
+  // }
+  // /**
+  // * return one or more URL strings by applying regex to the given idstring
+  // *
+  // * @param idstrings
+  // * array of id strings to pass to service
+  // * @param seqstrings
+  // * array of seq strings to pass to service
+  // * @param onlyIfMatches
+  // * - when true url strings are only made if regex is defined and
+  // * matches for all qualified tokens in groupURL - TODO: consider if
+  // * onlyIfMatches is really a useful parameter!
+  // * @return null or Object[] { int[] { number of seqs substituted},boolean[]
+  // {
+  // * which seqs were substituted }, StringBuffer[] { substituted lists
+  // * for each token }, String[] { url } }
+  // * @throws UrlStringTooLongException
+  // */
+  // private Object[] makeUrls(String[] idstrings, String[] seqstrings,
+  // String dsstring, boolean onlyIfMatches)
+  // throws UrlStringTooLongException
+  // {
+  // Hashtable<String, String[]> rstrings = replacementArgs(idstrings,
+  // seqstrings, dsstring);
+  // return makeUrls(rstrings, onlyIfMatches);
+  // }
+  //
+  // /**
+  // *
+  // * @param repstrings
+  // * @param onlyIfMatches
+  // * @return Object[] {int[], boolean[], StringBuffer[], String[] }
+  // * @throws UrlStringTooLongException
+  // */
+  // private Object[] makeUrls(Hashtable<String, String[]> repstrings,
+  // boolean onlyIfMatches)
+  // throws UrlStringTooLongException
+  // {
+  // return makeUrlsIf(true, repstrings, onlyIfMatches);
+  // }
+  //
+
   @Override
   public String toString()
   {
@@ -774,143 +971,4 @@ public class GroupUrlLink
     return result.toString();
   }
 
-  /**
-   * report stats about the generated url string given an input set
-   * 
-   * @param ul
-   * @param idstring
-   * @param url
-   */
-  private static void testUrls(GroupUrlLink ul, String[][] idstring,
-          Object[] url)
-  {
-
-    if (url == null)
-    {
-      System.out.println("Created NO urls.");
-    }
-    else
-    {
-      System.out.println("Created a url from " + ((int[]) url[0])[0]
-              + "out of " + idstring[0].length + " sequences.");
-      System.out.println("Sequences that did not match:");
-      for (int sq = 0; sq < idstring[0].length; sq++)
-      {
-        if (!((boolean[]) url[1])[sq])
-        {
-          System.out.println("Seq " + sq + ": " + idstring[0][sq] + "\t: "
-                  + idstring[1][sq]);
-        }
-      }
-      System.out.println("Sequences that DID match:");
-      for (int sq = 0; sq < idstring[0].length; sq++)
-      {
-        if (((boolean[]) url[1])[sq])
-        {
-          System.out.println("Seq " + sq + ": " + idstring[0][sq] + "\t: "
-                  + idstring[1][sq]);
-        }
-      }
-      System.out.println("The generated URL:");
-      System.out.println(((String[]) url[3])[0]);
-    }
-  }
-
-  /**
-   * 
-   * @param argv
-   * @j2sIgnore
-   */
-  public static void main(String argv[])
-  {
-    // note - JAL-1383 - these services are all dead
-    String[] links = new String[] {
-        "EnVision2|IDS|http://www.ebi.ac.uk/enfin-srv/envision2/pages/linkin.jsf?workflow=Enfin%20Default%20Workflow&datasetName=linkInDatasetFromJalview&input=$SEQUENCEIDS$&inputType=0|,",
-        "EnVision2|Seqs|http://www.ebi.ac.uk/enfin-srv/envision2/pages/linkin.jsf?workflow=Enfin%20Default%20Workflow&datasetName=linkInDatasetFromJalview&input=$SEQUENCES$&inputType=1|,",
-        "EnVision2|IDS|http://www.ebi.ac.uk/enfin-srv/envision2/pages/linkin.jsf?workflow=Enfin%20Default%20Workflow&datasetName=$DATASETID$&input=$SEQUENCEIDS$&inputType=0|,",
-        "EnVision2|Seqs|http://www.ebi.ac.uk/enfin-srv/envision2/pages/linkin.jsf?workflow=Enfin%20Default%20Workflow&datasetName=$DATASETID$&input=$SEQUENCES$&inputType=1|,",
-        "EnVision2|IDS|http://www.ebi.ac.uk/enfin-srv/envision2/pages/linkin.jsf?workflow=$SEQUENCEIDS$&datasetName=linkInDatasetFromJalview&input=$SEQUENCEIDS$&inputType=0|,",
-        "EnVision2|Seqs|http://www.ebi.ac.uk/enfin-srv/envision2/pages/linkin.jsf?workflow=$SEQUENCEIDS$&datasetName=$DATASETID$&input=$SEQUENCES$&inputType=1|,",
-        "EnVision2 Seqs|http://www.ebi.ac.uk/enfin-srv/envision2/pages/linkin.jsf?workflow=Default&datasetName=JalviewSeqs$DATASETID$&input=$SEQUENCES=/([a-zA-Z]+)/=$&inputType=1|,",
-        "EnVision2 Seqs|http://www.ebi.ac.uk/enfin-srv/envision2/pages/linkin.jsf?workflow=Default&datasetName=JalviewSeqs$DATASETID$&input=$SEQUENCES=/[A-Za-z]+/=$&inputType=1|,"
-        /*
-         * http://www.ebi.ac.uk/enfin-srv/envision2/pages/linkin.jsf?input=P38389,P38398
-         * &inputType=0&workflow=Enfin%20Default%20Workflow&datasetName=
-         * linkInDatasetFromPRIDE
-         */
-    };
-
-    SequenceI[] seqs = new SequenceI[] {
-        new Sequence("StupidLabel:gi|9234|pdb|102L|A",
-                "asdiasdpasdpadpwpadasdpaspdw"), };
-    String[][] seqsandids = formStrings(seqs);
-    for (int i = 0; i < links.length; i++)
-    {
-      GroupUrlLink ul = new GroupUrlLink(links[i]);
-      if (ul.isValid())
-      {
-        System.out.println("\n\n\n");
-        System.out.println(
-                "Link " + i + " " + links[i] + " : " + ul.toString());
-        System.out.println(" pref : " + ul.getUrl_prefix());
-        System.out.println(" IdReplace : " + ul.getIDRegexReplace());
-        System.out.println(" SeqReplace : " + ul.getSeqRegexReplace());
-        System.out.println(" Suffixes : " + ul.getUrl_suffix());
-
-        System.out.println(
-                "<insert input id and sequence strings here> Without onlyIfMatches:");
-        Object[] urls;
-        try
-        {
-          urls = ul.makeUrls(seqsandids[0], seqsandids[1], "mydataset",
-                  false);
-          testUrls(ul, seqsandids, urls);
-        } catch (UrlStringTooLongException ex)
-        {
-          System.out.println("too long exception " + ex);
-        }
-        System.out.println(
-                "<insert input id and sequence strings here> With onlyIfMatches set:");
-        try
-        {
-          urls = ul.makeUrls(seqsandids[0], seqsandids[1], "mydataset",
-                  true);
-          testUrls(ul, seqsandids, urls);
-        } catch (UrlStringTooLongException ex)
-        {
-          System.out.println("too long exception " + ex);
-        }
-      }
-      else
-      {
-        System.err.println("Invalid URLLink : " + links[i] + " : "
-                + ul.getInvalidMessage());
-      }
-    }
-  }
-
-  /**
-   * covenience method to generate the id and sequence string vector from a set
-   * of seuqences using each sequence's getName() and getSequenceAsString()
-   * method
-   * 
-   * @param seqs
-   * @return String[][] {{sequence ids},{sequence strings}}
-   */
-  public static String[][] formStrings(SequenceI[] seqs)
-  {
-    String[][] idset = new String[2][seqs.length];
-    for (int i = 0; i < seqs.length; i++)
-    {
-      idset[0][i] = seqs[i].getName();
-      idset[1][i] = seqs[i].getSequenceAsString();
-    }
-    return idset;
-  }
-
-  public void setLabel(String newlabel)
-  {
-    this.label = newlabel;
-  }
-
 }
index 2852364..823fcc3 100644 (file)
@@ -43,20 +43,18 @@ public class MessageManager
 
   private static ResourceBundle rb;
 
-  private static Logger log = Logger
+  private final static Logger log = Logger
           .getLogger(MessageManager.class.getCanonicalName());
 
-  private static Locale loc;
+  private final static Locale loc;
 
-  private static Set<String> reportedMissing = new HashSet<>();
+  private final static Set<String> reportedMissing = new HashSet<>();
 
   static
   {
+    loc = Locale.getDefault();
     try
     {
-      /* Localize Java dialogs */
-      loc = Locale.getDefault();
-      // Locale.setDefault(loc);
       /* Getting messages for GV */
       log.info("Getting messages for lang: " + loc);
       Control control = Control.getControl(Control.FORMAT_PROPERTIES);
index bf0dfcd..fba669b 100644 (file)
@@ -22,6 +22,7 @@ package jalview.util;
 
 import jalview.javascript.json.JSON;
 
+import java.awt.Color;
 import java.awt.Toolkit;
 import java.awt.event.MouseEvent;
 import java.io.BufferedReader;
@@ -32,14 +33,20 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.Reader;
+import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.Properties;
+import java.util.logging.ConsoleHandler;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 import javax.swing.SwingUtilities;
 
 import org.json.simple.parser.JSONParser;
 import org.json.simple.parser.ParseException;
 
+import com.stevesoft.pat.Regex;
+
 /**
  * System platform information used by Applet and Application
  * 
@@ -54,7 +61,7 @@ public class Platform
   private static Boolean isNoJSMac = null, isNoJSWin = null, isMac = null,
           isWin = null;
 
-  private static Boolean isHeadless = null;
+  // private static Boolean isHeadless = null;
 
   /**
    * added to group mouse events into Windows and nonWindows (mac, unix, linux)
@@ -111,18 +118,18 @@ public class Platform
     return (isNoJSWin == null ? (isNoJSWin = !isJS && isWin()) : isNoJSWin);
   }
 
-  /**
-   * 
-   * @return true if we are running in non-interactive no UI mode
-   */
-  public static boolean isHeadless()
-  {
-    if (isHeadless == null)
-    {
-      isHeadless = "true".equals(System.getProperty("java.awt.headless"));
-    }
-    return isHeadless;
-  }
+  // /**
+  // *
+  // * @return true if we are running in non-interactive no UI mode
+  // */
+  // public static boolean isHeadless()
+  // {
+  // if (isHeadless == null)
+  // {
+  // isHeadless = "true".equals(System.getProperty("java.awt.headless"));
+  // }
+  // return isHeadless;
+  // }
 
   /**
    * 
@@ -135,15 +142,23 @@ public class Platform
   }
 
   /**
-   * Answers the input with every backslash replaced with a double backslash (an
-   * 'escaped' single backslash)
+   * escape a string according to the local platform's escape character
    * 
-   * @param s
-   * @return
+   * @param file
+   * @return escaped file
    */
-  public static String escapeBackslashes(String s)
+  public static String escapeString(String file)
   {
-    return s == null ? null : s.replace("\\", "\\\\");
+    StringBuffer f = new StringBuffer();
+    int p = 0, lastp = 0;
+    while ((p = file.indexOf('\\', lastp)) > -1)
+    {
+      f.append(file.subSequence(lastp, p));
+      f.append("\\\\");
+      lastp = p + 1;
+    }
+    f.append(file.substring(lastp));
+    return f.toString();
   }
 
   /**
@@ -169,20 +184,17 @@ public class Platform
    */
   protected static boolean isControlDown(MouseEvent e, boolean aMac)
   {
-           if (aMac)
-           {
-             /*
-              * answer false for right mouse button
-              */
-             if (e.isPopupTrigger())
-             {
-               return false;
-             }
-             return (jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx() // .getMenuShortcutKeyMaskEx()
-                     & e.getModifiersEx()) != 0; // getModifiers()) != 0;
-           }
-           return e.isControlDown();
-         }
+    if (!aMac)
+    {
+      return e.isControlDown();
+    }
+    // answer false for right mouse button
+    // shortcut key will be META for a Mac
+    return !e.isPopupTrigger()
+            && (Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()
+                    & e.getModifiers()) != 0;
+    // could we use e.isMetaDown() here?
+  }
 
   // BH: I don't know about that previous method. Here is what SwingJS uses.
   // Notice the distinction in mouse events. (BUTTON3_MASK == META)
@@ -255,6 +267,20 @@ public class Platform
 
   public static long time, mark, set, duration;
 
+  /**
+   * typical usage:
+   * 
+   * Platform.timeCheck(null, Platform.TIME_MARK);
+   * 
+   * ...
+   * 
+   * Platform.timeCheck("some message", Platform.TIME_MARK);
+   * 
+   * reset...[set/mark]n...get
+   * 
+   * @param msg
+   * @param mode
+   */
   public static void timeCheck(String msg, int mode)
   {
     long t = System.currentTimeMillis();
@@ -262,6 +288,7 @@ public class Platform
     {
     case TIME_RESET:
       time = mark = t;
+      duration = 0;
       if (msg != null)
       {
         System.err.println("Platform: timer reset\t\t\t" + msg);
@@ -270,6 +297,7 @@ public class Platform
     case TIME_MARK:
       if (set > 0)
       {
+        // total time between set/mark points
         duration += (t - set);
       }
       else
@@ -292,7 +320,7 @@ public class Platform
     case TIME_GET:
       if (msg != null)
       {
-        System.err.println("Platform: timer dur\t" + ((t - time) / 1000f)
+        System.err.println("Platform: timer get\t" + ((t - time) / 1000f)
                 + "\t" + ((duration) / 1000f) + "\t" + msg);
       }
       set = 0;
@@ -326,7 +354,9 @@ public class Platform
 
   public static byte[] getFileBytes(File f)
   {
-    return /** @j2sNative f && f._bytes || */
+    // TODO temporary doubling of ç§˜bytes and _bytes;
+    // just remove _bytes when new transpiler has been installed
+    return /** @j2sNative f && (f.秘bytes || f._bytes) || */
     null;
   }
 
@@ -364,8 +394,10 @@ public class Platform
     }
     @SuppressWarnings("unused")
     byte[] bytes = getFileAsBytes(urlstring);
+    // TODO temporary doubling of ç§˜bytes and _bytes;
+    // just remove _bytes when new transpiler has been installed
     /**
-     * @j2sNative f._bytes = bytes;
+     * @j2sNative f.秘bytes = f._bytes = bytes;
      */
     return true;
   }
@@ -400,10 +432,11 @@ public class Platform
    * @param url
    * @return true if window has been opened
    */
-  public static boolean openURL(String url)
+  public static boolean openURL(String url) throws IOException
   {
     if (!isJS())
     {
+      BrowserLauncher.openURL(url);
       return false;
     }
     /**
@@ -420,7 +453,7 @@ public class Platform
     @SuppressWarnings("unused")
     ThreadGroup g = Thread.currentThread().getThreadGroup();
     /**
-     * @j2sNative return g.html5Applet._uniqueId;
+     * @j2sNative return g.秘html5Applet._uniqueId;
      *
      */
     return null;
@@ -446,13 +479,13 @@ public class Platform
     String id = getUniqueAppletID();
     String key = "", value = "";
     /**
-     * @j2sNative var info = g.html5Applet.__Info || {}; for (var key in info) {
-     *            if (key.indexOf(prefix) == 0) { value = "" + info[key];
+     * @j2sNative var info = g.秘html5Applet.__Info || {}; for (var key in info)
+     *            { if (key.indexOf(prefix) == 0) { value = "" + info[key];
      */
 
     System.out.println(
             "Platform id=" + id + " reading Info." + key + " = " + value);
-    p.put(id + "_" + key, value);
+    p.put(key, value);
 
     /**
      * @j2sNative
@@ -606,26 +639,234 @@ public class Platform
 
   }
 
+  public static URL getDocumentBase()
+  {
+    try
+    {
+      if (isJS())
+      {
+        @SuppressWarnings("unused")
+        Object g = Thread.currentThread().getThreadGroup();
+        return new URL(/**
+                        * @j2sNative g.秘html5Applet._appletPanel.appletDocumentBase
+                        *            ||
+                        */
+                "");
+      }
+    } catch (MalformedURLException e)
+    {
+    }
+    return null;
+  }
+
+  public static URL getCodeBase()
+  {
+    try
+    {
+      if (isJS())
+      {
+        @SuppressWarnings("unused")
+        Object g = Thread.currentThread().getThreadGroup();
+        return new URL(/**
+                        * @j2sNative g.秘html5Applet._appletPanel.appletCodeBase
+                        *            ||
+                        */
+                "");
+      }
+    } catch (MalformedURLException e)
+    {
+    }
+    return null;
+  }
+
   /**
-   * A (case sensitive) file path comparator that ignores the difference between /
-   * and \
+   * load a resource -- probably a core file -- if and only if a particular
+   * class has not been instantialized. We use a String here because if we used
+   * a .class object, that reference itself would simply load the class, and we
+   * want the core package to include that as well.
    * 
-   * @param path1
-   * @param path2
-   * @return
+   * @param resourcePath
+   * @param className
+   */
+  public static void loadStaticResource(Object resourcePath,
+          String className)
+  {
+    /**
+     * 
+     * @j2sNative if (!swingjs.JSUtil.isClassLoaded$S(className))
+     *            swingjs.JSUtil.loadStaticResource$S(resourcePath);
+     */
+  }
+
+  public static void ensureRegex()
+  {
+    loadStaticResource("core/core_stevesoft.z.js",
+            "com.stevesoft.pat.Regex");
+  }
+
+  public static Regex newRegex(String searchString, String replaceString)
+  {
+    ensureRegex();
+    return (replaceString == null ? new Regex(searchString)
+            : new Regex(searchString, replaceString));
+  }
+
+  public static Regex newRegexPerl(String code)
+  {
+    ensureRegex();
+    return Regex.perlCode(code);
+  }
+
+  /**
+   * @param c
    */
-  public static boolean pathEquals(String path1, String path2)
+  public static Color getColorFromName(String name)
   {
-    if (path1 == null)
+    if (name == null)
     {
-      return path2 == null;
+      return null;
     }
-    if (path2 == null)
+    /**
+     * @j2sNative
+     * 
+     *            return swingjs.JSUtil.getColorFromName$S(name);
+     */
     {
-      return false;
+      // or make a static map; or use reflection on the field name
+      switch (name.toLowerCase())
+      {
+      case "black":
+        return Color.black;
+      case "blue":
+        return Color.blue;
+      case "cyan":
+        return Color.cyan;
+      case "darkgray":
+        return Color.darkGray;
+      case "gray":
+        return Color.gray;
+      case "green":
+        return Color.green;
+      case "lightgray":
+        return Color.lightGray;
+      case "magenta":
+        return Color.magenta;
+      case "orange":
+        return Color.orange;
+      case "pink":
+        return Color.pink;
+      case "red":
+        return Color.red;
+      case "white":
+        return Color.white;
+      case "yellow":
+        return Color.yellow;
+      default:
+        return null;
+      }
+
+    }
+  }
+
+  /**
+   * Initialize Java debug logging. A representative sample -- adapt as desired.
+   */
+  public static void startJavaLogging()
+  {
+    /**
+     * @j2sIgnore
+     */
+    {
+      logClass("java.awt.EventDispatchThread", "java.awt.EventQueue",
+              "java.awt.Component", "java.awt.focus.Component",
+              "java.awt.event.Component",
+              "java.awt.focus.DefaultKeyboardFocusManager");
+    }
+  }
+
+  /**
+   * Initiate Java logging for a given class. Only for Java, not JavaScript;
+   * Allows debugging of complex event processing.
+   * 
+   * @param className
+   */
+  public static void logClass(String... classNames)
+  {
+    /**
+     * @j2sIgnore
+     * 
+     * 
+     */
+    {
+      Logger rootLogger = Logger.getLogger("");
+      rootLogger.setLevel(Level.ALL);
+      ConsoleHandler consoleHandler = new ConsoleHandler();
+      consoleHandler.setLevel(Level.ALL);
+      for (int i = classNames.length; --i >= 0;)
+      {
+        Logger logger = Logger.getLogger(classNames[i]);
+        logger.setLevel(Level.ALL);
+        logger.addHandler(consoleHandler);
+      }
+    }
+  }
+
+  /**
+   * Set the "app" property of the HTML5 applet object, for example,
+   * "testApplet.app", to point to the Jalview instance. This will be the object
+   * that page developers use that is similar to the original Java applet object
+   * that was accessed via LiveConnect.
+   * 
+   * @param j
+   */
+  public static void setAppClass(Object j)
+  {
+    if (!isJS())
+    {
+      return;
+    }
+    @SuppressWarnings("unused")
+    Thread t = Thread.currentThread();
+    /**
+     * Set up "testApplet.app" to be this instance
+     * 
+     * @j2sNative
+     * 
+     *            try {self[t.name].app = j}catch(e){}
+     */
+  }
+
+  public final static String EMBEDDED_DIM = "dim";
+
+  /**
+   *
+   * If this frame Is this frame embedded in a web page, return a known type.
+   * 
+   * @param frame
+   *          a JFrame or JInternalFrame
+   * @param type
+   * @return null if frame is not embedded.
+   */
+  public static Object getEmbeddedAttribute(Object frame, String type)
+  {
+    if (!isJS())
+    {
+      return null;
+    }
+    return (/** swingjs@j2sNative || frame.ui.getEmbedded(type) */
+    null);
+  }
+
+  public static void stackTrace()
+  {
+    try
+    {
+      throw new NullPointerException();
+    } catch (Exception e)
+    {
+      e.printStackTrace();
     }
-    String p1 = path1.replace('\\', '/');
-    String p2 = path2.replace('\\', '/');
-    return p1.equals(p2);
+
   }
+
 }
diff --git a/src/jalview/util/ShortcutKeyMaskExWrapper.java b/src/jalview/util/ShortcutKeyMaskExWrapper.java
deleted file mode 100644 (file)
index 7292c80..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-package jalview.util;
-
-import java.awt.Toolkit;
-import java.awt.event.KeyEvent;
-
-public class ShortcutKeyMaskExWrapper
-{
-
-  private static boolean init = false;
-
-  private static final Float specversion = Float
-          .parseFloat(System.getProperty("java.specification.version"));
-
-  private static final float modern = 11;
-
-  public static int SHIFT_DOWN_MASK = KeyEvent.SHIFT_DOWN_MASK;
-
-  public static int ALT_DOWN_MASK = KeyEvent.ALT_DOWN_MASK;
-
-  public ShortcutKeyMaskExWrapper()
-  {
-  }
-
-  private static void init()
-  {
-    if (init)
-    {
-      return;
-    }
-    if (specversion < modern)
-    {
-      SHIFT_DOWN_MASK = KeyEvent.SHIFT_MASK;
-      ALT_DOWN_MASK = KeyEvent.ALT_MASK;
-    }
-    else
-    {
-      SHIFT_DOWN_MASK = KeyEvent.SHIFT_DOWN_MASK;
-      ALT_DOWN_MASK = KeyEvent.ALT_DOWN_MASK;
-    }
-
-    init = true;
-  }
-
-  public static int getMenuShortcutKeyMaskEx()
-  {
-    init();
-    if (specversion < modern)
-    {
-      return Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
-    }
-    else
-    {
-      return Toolkit.getDefaultToolkit().getMenuShortcutKeyMaskEx();
-    }
-  }
-
-}
index 0141a6a..8a60b56 100644 (file)
@@ -35,6 +35,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.Vector;
 
+import com.stevesoft.pat.Regex;
+
 /**
  * A helper class to parse URL Link strings taken from applet parameters or
  * jalview properties file using the com.stevesoft.pat.Regex implementation.
@@ -302,8 +304,7 @@ public class UrlLink
     {
       if (regexReplace != null)
       {
-        com.stevesoft.pat.Regex rg = com.stevesoft.pat.Regex
-                .perlCode("/" + regexReplace + "/");
+        Regex rg = Platform.newRegexPerl("/" + regexReplace + "/");
         if (rg.search(idstring))
         {
           int ns = rg.numSubs();
@@ -507,21 +508,8 @@ public class UrlLink
     {
       // Extract Regex and suffix
       urlSuffix = link.substring(p + endDelimiter.length());
-      regexReplace = link.substring(sqidPos + startLength, p);
-      try
-      {
-        com.stevesoft.pat.Regex rg = com.stevesoft.pat.Regex
-                .perlCode("/" + regexReplace + "/");
-        if (rg == null)
-        {
-          invalidMessage = "Invalid Regular Expression : '" + regexReplace
-                  + "'\n";
-        }
-      } catch (Exception e)
-      {
-        invalidMessage = "Invalid Regular Expression : '" + regexReplace
-                + "'\n";
-      }
+      testRegexPerl(
+              regexReplace = link.substring(sqidPos + startLength, p));
     }
     else
     {
@@ -550,6 +538,21 @@ public class UrlLink
     return p;
   }
 
+  private void testRegexPerl(String r)
+  {
+    Regex rg = null;
+    try
+    {
+      rg = Platform.newRegexPerl("/" + r + "/");
+    } catch (Exception e)
+    {
+    }
+    if (rg == null)
+    {
+      invalidMessage = "Invalid Regular Expression : '" + r + "'\n";
+    }
+  }
+
   /**
    * Create a set of URL links for a sequence
    * 
index 536f767..4116c3b 100644 (file)
@@ -605,10 +605,30 @@ public abstract class AlignmentViewport
 
   protected ColumnSelection colSel = new ColumnSelection();
 
-  public boolean autoCalculateConsensus = true;
+  protected boolean autoCalculateConsensusAndConservation = true;
+
+  public boolean getAutoCalculateConsensusAndConservation()
+  { // BH 2019.07.24
+    return autoCalculateConsensusAndConservation;
+  }
+
+  public void setAutoCalculateConsensusAndConservation(boolean b)
+  {
+    autoCalculateConsensusAndConservation = b;
+  }
 
   protected boolean autoCalculateStrucConsensus = true;
 
+  public boolean getAutoCalculateStrucConsensus()
+  { // BH 2019.07.24
+    return autoCalculateStrucConsensus;
+  }
+
+  public void setAutoCalculateStrucConsensus(boolean b)
+  {
+    autoCalculateStrucConsensus = b;
+  }
+
   protected boolean ignoreGapsInConsensusCalculation = false;
 
   protected ResidueShaderI residueShading = new ResidueShader();
@@ -824,7 +844,7 @@ public abstract class AlignmentViewport
     // see note in mantis : issue number 8585
     if (alignment.isNucleotide()
             || (conservation == null && quality == null)
-            || !autoCalculateConsensus)
+            || !autoCalculateConsensusAndConservation)
     {
       return;
     }
@@ -842,7 +862,7 @@ public abstract class AlignmentViewport
   public void updateConsensus(final AlignmentViewPanel ap)
   {
     // see note in mantis : issue number 8585
-    if (consensus == null || !autoCalculateConsensus)
+    if (consensus == null || !autoCalculateConsensusAndConservation)
     {
       return;
     }
@@ -1859,11 +1879,11 @@ public abstract class AlignmentViewport
     {
       alignment.padGaps();
     }
-    if (autoCalculateConsensus)
+    if (autoCalculateConsensusAndConservation)
     {
       updateConsensus(ap);
     }
-    if (hconsensus != null && autoCalculateConsensus)
+    if (hconsensus != null && autoCalculateConsensusAndConservation)
     {
       updateConservation(ap);
     }
index 0235081..8dc7dd8 100644 (file)
@@ -26,7 +26,9 @@ import jalview.datamodel.AlignmentI;
 import jalview.datamodel.HiddenColumns;
 import jalview.datamodel.HiddenSequences;
 
+import java.awt.Dimension;
 import java.awt.Graphics;
+import java.awt.Rectangle;
 
 public abstract class OverviewDimensions
 {
@@ -62,6 +64,8 @@ public abstract class OverviewDimensions
 
   protected float heightRatio;
 
+  private Rectangle vpbox = new Rectangle();
+
   /**
    * Create an OverviewDimensions object
    * 
@@ -71,17 +75,23 @@ public abstract class OverviewDimensions
    *          true if the annotation panel is to be shown, false otherwise
    */
   public OverviewDimensions(ViewportRanges ranges,
-          boolean showAnnotationPanel)
+          boolean showAnnotationPanel, Dimension dim)
   {
+    if (!showAnnotationPanel)
+    {
+      graphHeight = 0;
+    }
+
     // scale the initial size of overviewpanel to shape of alignment
     float initialScale = (float) ranges.getAbsoluteAlignmentWidth()
             / (float) ranges.getAbsoluteAlignmentHeight();
 
-    if (!showAnnotationPanel)
+    if (dim != null)
     {
-      graphHeight = 0;
+      width = dim.width;
+      sequencesHeight = dim.height;
+      return;
     }
-
     if (ranges.getAbsoluteAlignmentWidth() > ranges
             .getAbsoluteAlignmentHeight())
     {
@@ -114,6 +124,9 @@ public abstract class OverviewDimensions
    */
   public void drawBox(Graphics g)
   {
+    // System.out.println("OD drawBox " + boxX + " " + boxY + " " + boxWidth
+    // + " " + boxHeight);
+    updateBox();
     g.drawRect(boxX, boxY, boxWidth, boxHeight);
     g.drawRect(boxX + 1, boxY + 1, boxWidth - 2, boxHeight - 2);
   }
@@ -178,6 +191,9 @@ public abstract class OverviewDimensions
 
   public void setHeight(int h)
   {
+    // BH 2019 problem was that component.resize() can come
+    // after setBoxPosition().
+    // Solution was to move setting of box dimensions to paint
     sequencesHeight = h - graphHeight;
     heightRatio = (float) alheight / sequencesHeight;
   }
@@ -276,17 +292,22 @@ public abstract class OverviewDimensions
           int vpheight)
   {
     resetAlignmentDims();
+    vpbox = new Rectangle(startRes, startSeq, vpwidth, vpheight);
+    updateBox();
+  }
 
+  public void updateBox()
+  {
     // boxX, boxY is the x,y location equivalent to startRes, startSeq
-    int xPos = Math.min(startRes, alwidth - vpwidth + 1);
+    int xPos = Math.min(vpbox.x, alwidth - vpbox.width + 1);
     boxX = Math.round(xPos / widthRatio);
-    boxY = Math.round(startSeq / heightRatio);
+    boxY = Math.round(vpbox.y / heightRatio);
 
     // boxWidth is the width in residues translated to pixels
-    boxWidth = Math.round(vpwidth / widthRatio);
+    boxWidth = Math.max(1, Math.round(vpbox.width / widthRatio));
 
     // boxHeight is the height in sequences translated to pixels
-    boxHeight = Math.round(vpheight / heightRatio);
+    boxHeight = Math.max(1, Math.round(vpbox.height / heightRatio));
   }
 
   /**
index de90a21..d2dc607 100644 (file)
@@ -28,6 +28,8 @@ import jalview.datamodel.HiddenSequences;
 import jalview.datamodel.VisibleColsCollection;
 import jalview.datamodel.VisibleRowsCollection;
 
+import java.awt.Dimension;
+
 public class OverviewDimensionsHideHidden extends OverviewDimensions
 {
   private ViewportRanges ranges;
@@ -41,7 +43,13 @@ public class OverviewDimensionsHideHidden extends OverviewDimensions
   public OverviewDimensionsHideHidden(ViewportRanges vpranges,
           boolean showAnnotationPanel)
   {
-    super(vpranges, showAnnotationPanel);
+    this(vpranges, showAnnotationPanel, null);
+  }
+
+  public OverviewDimensionsHideHidden(ViewportRanges vpranges,
+          boolean showAnnotationPanel, Dimension dim)
+  {
+    super(vpranges, showAnnotationPanel, dim);
     ranges = vpranges;
     resetAlignmentDims();
   }
index 3aa6e1b..0752097 100644 (file)
@@ -28,6 +28,8 @@ import jalview.datamodel.AllRowsCollection;
 import jalview.datamodel.HiddenColumns;
 import jalview.datamodel.HiddenSequences;
 
+import java.awt.Dimension;
+
 public class OverviewDimensionsShowHidden extends OverviewDimensions
 {
   private ViewportRanges ranges;
@@ -38,6 +40,12 @@ public class OverviewDimensionsShowHidden extends OverviewDimensions
   private int ydiff; // when dragging, difference in alignment units between
                      // start sequence and original mouse click position
 
+  public OverviewDimensionsShowHidden(ViewportRanges vpranges,
+          boolean showAnnotationPanel) 
+  {
+    this(vpranges, showAnnotationPanel, null);
+  }
+
   /**
    * Create an OverviewDimensions object
    * 
@@ -47,9 +55,9 @@ public class OverviewDimensionsShowHidden extends OverviewDimensions
    *          true if the annotation panel is to be shown, false otherwise
    */
   public OverviewDimensionsShowHidden(ViewportRanges vpranges,
-          boolean showAnnotationPanel)
+          boolean showAnnotationPanel, Dimension dim)
   {
-    super(vpranges, showAnnotationPanel);
+    super(vpranges, showAnnotationPanel, dim);
     ranges = vpranges;
     resetAlignmentDims();
   }
index 4f671da..a022627 100644 (file)
@@ -137,11 +137,31 @@ public class ViewportRanges extends ViewportProperties
     int oldstartres = oldvalues[0];
     int oldendres = oldvalues[1];
 
+    if (oldstartres == startRes && oldendres == endRes)
+    {
+      return; // BH 2019.07.27 standard check for no changes
+    }
+
+    // listeners include:
+
+    // jalview.gui.SeqCanvas[,0,0,568x90,layout=java.awt.BorderLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=]
+    // STARTRES, STARTRESANDSEQ
+    // jalview.gui.IdCanvas[,0,0,112x90,layout=java.awt.BorderLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=java.awt.Dimension[width=112,height=0]]
+    // jalview.gui.ScalePanel[,0,0,594x17,layout=java.awt.FlowLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=]
+    // jalview.gui.AnnotationPanel[,0,0,0x162,alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=java.awt.Dimension[width=1,height=162]]
+    // jalview.gui.AlignmentPanel[,0,0,706x133,layout=java.awt.BorderLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777225,maximumSize=,minimumSize=,preferredSize=java.awt.Dimension[width=220,height=166]]
+    // jalview.gui.OverviewPanel[,0,0,543x135,layout=java.awt.BorderLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=java.awt.Dimension[width=543,height=135]]
+
+
+    // "STARTRES" is a misnomer here -- really "STARTORENDRES"
+    // note that this could be "no change" if the range is just being expanded
     changeSupport.firePropertyChange(STARTRES, oldstartres, startRes);
     if (oldstartres == startRes)
     {
-      // event won't be fired if start positions are same
-      // fire an event for the end positions in case they changed
+      // No listener cares about this
+      // "ENDRES" is a misnomer here -- really "ENDONLYRES"
+      // BH 2019.07.27 adds end change check
+      // fire only if only the end is changed
       changeSupport.firePropertyChange(ENDRES, oldendres, endRes);
     }
   }
@@ -203,12 +223,13 @@ public class ViewportRanges extends ViewportProperties
    */
   public void setStartSeq(int seq)
   {
-    int startseq = seq;
     int height = getViewportHeight();
-    if (startseq + height - 1 > getVisibleAlignmentHeight() - 1)
-    {
-      startseq = getVisibleAlignmentHeight() - height;
-    }
+    int startseq = Math.min(seq, getVisibleAlignmentHeight() - height);
+    // BH 2019.07.27 cosmetic only -- was:
+    // if (startseq + height - 1 > getVisibleAlignmentHeight() - 1)
+    // {
+    // startseq = getVisibleAlignmentHeight() - height;
+    // }
     setStartEndSeq(startseq, startseq + height - 1);
   }
 
@@ -229,11 +250,19 @@ public class ViewportRanges extends ViewportProperties
     int oldstartseq = oldvalues[0];
     int oldendseq = oldvalues[1];
 
+    if (oldstartseq == startSeq && oldendseq == endSeq)
+    {
+      return; // BH 2019.07.27 standard check for no changes
+    }
+
+    // "STARTSEQ" is a misnomer here -- really "STARTORENDSEQ"
     changeSupport.firePropertyChange(STARTSEQ, oldstartseq, startSeq);
     if (oldstartseq == startSeq)
     {
-      // event won't be fired if start positions are the same
-      // fire in case the end positions changed
+      // Note that all listeners ignore this - could be removed, or there is a
+      // bug.
+      // "ENDSEQ" is a misnomer here -- really "ENDONLYSEQ"
+      // additional fire, only if only the end is changed
       changeSupport.firePropertyChange(ENDSEQ, oldendseq, endSeq);
     }
   }
@@ -306,6 +335,7 @@ public class ViewportRanges extends ViewportProperties
    */
   public void setStartResAndSeq(int res, int seq)
   {
+    // from Overview only
     int width = getViewportWidth();
     int[] oldresvalues = updateStartEndRes(res, res + width - 1);
 
@@ -317,9 +347,9 @@ public class ViewportRanges extends ViewportProperties
     }
     int[] oldseqvalues = updateStartEndSeq(startseq, startseq + height - 1);
 
-    int[] old = new int[] { oldresvalues[0], oldseqvalues[0] };
-    int[] newresseq = new int[] { startRes, startSeq };
-    changeSupport.firePropertyChange(STARTRESANDSEQ, old, newresseq);
+    int[] oldvalues = new int[] { oldresvalues[0], oldseqvalues[0] };
+    int[] newvalues = new int[] { startRes, startSeq };
+    changeSupport.firePropertyChange(STARTRESANDSEQ, oldvalues, newvalues);
   }
 
   /**
@@ -631,7 +661,10 @@ public class ViewportRanges extends ViewportProperties
   }
 
   /**
-   * Set the viewport location so that a position is visible
+   * Set the viewport location so that a position is visible. From
+   * SeqPanel.scrollToVisible(true) only, from AlignFrame keyboard actions
+   * SeqPanel.scrollCursor[Row(VK_S)/Column(VK_C)/RowAndColumn(VK_ENTER,COMMA)/Position(VK_P)]
+   * 
    * 
    * @param x
    *          column to be visible: absolute position in alignment
index 54bb4ee..8219c6a 100644 (file)
@@ -653,7 +653,7 @@ public abstract class FeatureRendererModel
     {
       featureOrder = new Hashtable<>();
     }
-    featureOrder.put(type, Float.valueOf(position));
+    featureOrder.put(type, new Float(position));
     return position;
   }
 
@@ -853,7 +853,7 @@ public abstract class FeatureRendererModel
     }
     if (newGroupsVisible)
     {
-      featureGroups.put(group, Boolean.valueOf(true));
+      featureGroups.put(group, new Boolean(true));
       return true;
     }
     return false;
@@ -889,7 +889,7 @@ public abstract class FeatureRendererModel
   @Override
   public void setGroupVisibility(String group, boolean visible)
   {
-    featureGroups.put(group, Boolean.valueOf(visible));
+    featureGroups.put(group, new Boolean(visible));
   }
 
   @Override
@@ -901,7 +901,7 @@ public abstract class FeatureRendererModel
       for (String gst : toset)
       {
         Boolean st = featureGroups.get(gst);
-        featureGroups.put(gst, Boolean.valueOf(visible));
+        featureGroups.put(gst, new Boolean(visible));
         if (st != null)
         {
           rdrw = rdrw || (visible != st.booleanValue());
@@ -986,12 +986,12 @@ public abstract class FeatureRendererModel
    */
   protected boolean featureGroupNotShown(final SequenceFeature sequenceFeature)
   {
+    Boolean b;
     return featureGroups != null
             && sequenceFeature.featureGroup != null
-            && sequenceFeature.featureGroup.length() != 0
-            && featureGroups.containsKey(sequenceFeature.featureGroup)
-            && !featureGroups.get(sequenceFeature.featureGroup)
-                    .booleanValue();
+            && sequenceFeature.featureGroup.length() > 0
+            && (b = featureGroups.get(sequenceFeature.featureGroup)) != null
+            && !b.booleanValue();
   }
 
   /**
index 08ef3a2..9a3fc8d 100644 (file)
@@ -22,6 +22,7 @@ package jalview.workers;
 
 import jalview.api.AlignCalcManagerI;
 import jalview.api.AlignCalcWorkerI;
+import jalview.bin.Jalview;
 import jalview.datamodel.AlignmentAnnotation;
 
 import java.util.ArrayList;
@@ -34,6 +35,10 @@ import java.util.Set;
 
 public class AlignCalcManager implements AlignCalcManagerI
 {
+  public static final String STARTED = "started";
+
+  public static final String FINISHED = "finished";
+
   /*
    * list of registered workers
    */
@@ -74,7 +79,7 @@ public class AlignCalcManager implements AlignCalcManagerI
             .synchronizedList(new ArrayList<AlignCalcWorkerI>());
     updating = Collections.synchronizedMap(
             new Hashtable<Class<? extends AlignCalcWorkerI>, List<AlignCalcWorkerI>>());
-    canUpdate = new HashSet<AlignCalcWorkerI>();
+    canUpdate = new HashSet<>();
   }
 
   @Override
@@ -82,6 +87,7 @@ public class AlignCalcManager implements AlignCalcManagerI
   {
     synchronized (updating)
     {
+      Jalview.getInstance().notifyWorker(worker, STARTED);
       List<AlignCalcWorkerI> upd = updating.get(worker.getClass());
       if (upd == null)
       {
@@ -144,6 +150,7 @@ public class AlignCalcManager implements AlignCalcManagerI
   {
     synchronized (inProgress)
     {
+      Jalview.getInstance().notifyWorker(worker, FINISHED);
       // System.err.println("Worker " + worker + " marked as complete.");
       inProgress.remove(worker);
       List<AlignCalcWorkerI> upd = updating.get(worker.getClass());
@@ -285,7 +292,7 @@ public class AlignCalcManager implements AlignCalcManagerI
   public List<AlignCalcWorkerI> getRegisteredWorkersOfClass(
           Class<? extends AlignCalcWorkerI> workerClass)
   {
-    List<AlignCalcWorkerI> workingClass = new ArrayList<AlignCalcWorkerI>();
+    List<AlignCalcWorkerI> workingClass = new ArrayList<>();
     synchronized (canUpdate)
     {
       for (AlignCalcWorkerI worker : canUpdate)
@@ -312,8 +319,8 @@ public class AlignCalcManager implements AlignCalcManagerI
   public void removeRegisteredWorkersOfClass(
           Class<? extends AlignCalcWorkerI> typeToRemove)
   {
-    List<AlignCalcWorkerI> removable = new ArrayList<AlignCalcWorkerI>();
-    Set<AlignCalcWorkerI> toremovannot = new HashSet<AlignCalcWorkerI>();
+    List<AlignCalcWorkerI> removable = new ArrayList<>();
+    Set<AlignCalcWorkerI> toremovannot = new HashSet<>();
     synchronized (restartable)
     {
       for (AlignCalcWorkerI worker : restartable)
@@ -363,7 +370,7 @@ public class AlignCalcManager implements AlignCalcManagerI
      * first just find those to remove (to avoid
      * ConcurrentModificationException)
      */
-    List<AlignCalcWorkerI> toRemove = new ArrayList<AlignCalcWorkerI>();
+    List<AlignCalcWorkerI> toRemove = new ArrayList<>();
     for (AlignCalcWorkerI worker : restartable)
     {
       if (worker.involves(ann))
index b1c987e..7745b74 100644 (file)
@@ -32,6 +32,7 @@ import jalview.gui.Desktop;
 import jalview.gui.FeatureSettings;
 import jalview.gui.IProgressIndicator;
 import jalview.gui.OOMWarning;
+import jalview.gui.Preferences;
 import jalview.util.DBRefUtils;
 import jalview.util.MessageManager;
 import jalview.ws.seqfetcher.DbSourceProxy;
@@ -134,7 +135,7 @@ public class DBRefFetcher implements Runnable
     }
     this.dataset = ds;
     // TODO Jalview 2.5 lots of this code should be in the gui package!
-    sfetcher = jalview.gui.SequenceFetcher.getSequenceFetcherSingleton();
+    sfetcher = SequenceFetcher.getInstance();
     // set default behaviour for transferring excess sequence data to the
     // dataset
     trimDsSeqs = Cache.getDefault(TRIM_RETRIEVED_SEQUENCES, true);
@@ -302,7 +303,7 @@ public class DBRefFetcher implements Runnable
     }
     try
     {
-      if (Cache.getDefault("DBREFFETCH_USEPICR", false))
+      if (Cache.getDefault(Preferences.DBREFFETCH_USEPICR, false))
       {
         picrClient = new AccessionMapperServiceLocator()
                 .getAccessionMapperPort();
@@ -785,7 +786,9 @@ public class DBRefFetcher implements Runnable
   {
        int n;
        if (sequencesArray == null || (n = sequencesArray.length) == 0)
-         return sequencesArray;
+  {
+    return sequencesArray;
+  }
     ArrayList<SequenceI> nseq = new ArrayList<>();
     for (int i = 0;i < n; i++)
     {
index 18e25cc..10a2b28 100644 (file)
  */
 package jalview.ws;
 
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
+import jalview.datamodel.DBRefSource;
 import jalview.ext.ensembl.EnsemblGene;
-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.RfamSeed;
 import jalview.ws.dbsources.Uniprot;
 import jalview.ws.seqfetcher.ASequenceFetcher;
 import jalview.ws.seqfetcher.DbSourceProxy;
@@ -36,55 +33,101 @@ import java.util.Collections;
 import java.util.List;
 
 /**
- * This implements the run-time discovery of sequence database clients.
+ * Thread safe construction of database proxies. This implements the run-time
+ * discovery of sequence database clients.
  * 
+ * TODO: extend to a configurable database plugin mechanism where classes are
+ * instantiated by reflection and queried for their DbRefSource and version
+ * association.
  */
-public class SequenceFetcher extends ASequenceFetcher
+public class SequenceFetcher extends ASequenceFetcher implements ApplicationSingletonI
 {
+  /*
+   * set a mock fetcher here for testing only - reset to null afterwards
+   */
+  private static SequenceFetcher mockFetcher;
+
+  /**
+   * Returns a new SequenceFetcher singleton, or a mock object if one has been
+   * set.
+   * 
+   * @return
+   */
+  public static SequenceFetcher getInstance()
+  {
+    return mockFetcher != null ? mockFetcher
+            : (SequenceFetcher) ApplicationSingletonProvider
+                    .getInstance(SequenceFetcher.class);
+  }
+
   /**
-   * Thread safe construction of database proxies TODO: extend to a configurable
-   * database plugin mechanism where classes are instantiated by reflection and
-   * queried for their DbRefSource and version association.
+   * Set the instance object to use (intended for unit testing with mock
+   * objects).
+   * 
+   * Be sure to reset to null in the tearDown method of any tests!
+   * 
+   * @param sf
+   */
+  public static void setSequenceFetcher(SequenceFetcher sf)
+  {
+    mockFetcher = sf;
+  }
+
+  /**
+   * 
+   * This public constructor is only is for use by testng to anonymously
+   * subclass SequenceFetcher.
+   * 
    * 
    */
   public SequenceFetcher()
   {
-    addDBRefSourceImpl(EnsemblGene.class);
-    // addDBRefSourceImpl(EnsemblGenomes.class);
-    addDBRefSourceImpl(EmblSource.class);
-    addDBRefSourceImpl(EmblCdsSource.class);
-    addDBRefSourceImpl(Uniprot.class);
-    addDBRefSourceImpl(Pdb.class);
-    addDBRefSourceImpl(PfamFull.class);
-    addDBRefSourceImpl(PfamSeed.class);
-    addDBRefSourceImpl(RfamSeed.class);
+    addAllDatabases();
+  }
+
+  public void addAllDatabases()
+  {
+    addDBRefSourceImpl(EnsemblGene.class); // includes EnsemblGenomes.class
+    addDBRefSourceImpl(Uniprot.class); // includes UniprotName.class
+    // addDBRefSourceImpl(EmblSource.class);
+    // addDBRefSourceImpl(EmblCdsSource.class);
+    // addDBRefSourceImpl(Pdb.class);
+    // addDBRefSourceImpl(PfamFull.class);
+    // addDBRefSourceImpl(PfamSeed.class);
+    // addDBRefSourceImpl(RfamSeed.class);
+    addDBRefSourceImpl(DBRefSource.EMBL,
+            "jalview.ws.dbsources.EmblSource");
+    addDBRefSourceImpl(DBRefSource.EMBLCDS,
+            "jalview.ws.dbsources.EmblCdsSource");
+    addDBRefSourceImpl(DBRefSource.PDB, "jalview.ws.dbsources.Pdb");
+    addDBRefSourceImpl(DBRefSource.PFAM_FULL,
+            "jalview.ws.dbsources.PfamFull");
+    addDBRefSourceImpl(DBRefSource.PFAM_SEED,
+            "jalview.ws.dbsources.PfamSeed");
+    addDBRefSourceImpl(DBRefSource.RFAM_SEED,
+            "jalview.ws.dbsources.RfamSeed");
   }
 
   /**
-   * return an ordered list of database sources excluding alignment only databases
+   * return an ordered list of database sources excluding alignment only
+   * databases
    */
   public String[] getNonAlignmentSources()
   {
     String[] srcs = this.getSupportedDb();
     List<String> src = new ArrayList<>();
-
-    for (int i = 0; i < srcs.length; i++)
+    outer: for (int i = 0; i < srcs.length; i++)
     {
-      boolean accept = true;
       for (DbSourceProxy dbs : getSourceProxy(srcs[i]))
       {
         // Skip the alignment databases for the moment - they're not useful for
         // verifying a single sequence against its reference source
         if (dbs.isAlignmentSource())
         {
-          accept = false;
-          break;
+          continue outer;
         }
       }
-      if (accept)
-      {
-        src.add(srcs[i]);
-      }
+      src.add(srcs[i]);
     }
     Collections.sort(src, String.CASE_INSENSITIVE_ORDER);
     return src.toArray(new String[src.size()]);
index 9cc4960..7aad74a 100644 (file)
  */
 package jalview.ws;
 
-import jalview.ws.seqfetcher.ASequenceFetcher;
-
 public class SequenceFetcherFactory
 {
-
-  private static SequenceFetcher instance;
-
-  /**
-   * Returns a new SequenceFetcher object, or a mock object if one has been set
-   * 
-   * @return
-   */
-  public static ASequenceFetcher getSequenceFetcher()
-  {
-    return instance == null ? new SequenceFetcher() : instance;
-  }
-
-  /**
-   * Set the instance object to use (intended for unit testing with mock
-   * objects).
-   * 
-   * Be sure to reset to null in the tearDown method of any tests!
-   * 
-   * @param sf
-   */
-  public static void setSequenceFetcher(SequenceFetcher sf)
-  {
-    instance = sf;
-  }
+  // BH the two methods in this class merged into SequenceFetcher
 }
index a73af61..c5159f2 100644 (file)
@@ -22,12 +22,15 @@ package jalview.ws.dbsources;
 
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.DBRefSource;
+import jalview.util.Platform;
 
 import com.stevesoft.pat.Regex;
 
 public class EmblCdsSource extends EmblXmlSource
 {
 
+  private Regex ACCESSION_REGEX = null;
+
   public EmblCdsSource()
   {
     super();
@@ -42,7 +45,11 @@ public class EmblCdsSource extends EmblXmlSource
   @Override
   public Regex getAccessionValidator()
   {
-    return new Regex("^[A-Z]+[0-9]+");
+    if (ACCESSION_REGEX == null)
+    {
+      ACCESSION_REGEX = Platform.newRegex("^[A-Z]+[0-9]+", null);
+    }
+    return ACCESSION_REGEX;
   }
 
   @Override
index 6bbe2e1..ec75b04 100644 (file)
@@ -22,6 +22,7 @@ package jalview.ws.dbsources;
 
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.DBRefSource;
+import jalview.util.Platform;
 
 import com.stevesoft.pat.Regex;
 
@@ -32,6 +33,8 @@ import com.stevesoft.pat.Regex;
 public class EmblSource extends EmblXmlSource
 {
 
+  private static Regex ACCESSION_REGEX;
+
   public EmblSource()
   {
     super();
@@ -57,7 +60,11 @@ public class EmblSource extends EmblXmlSource
   @Override
   public Regex getAccessionValidator()
   {
-    return new Regex("^[A-Z]+[0-9]+");
+    if (ACCESSION_REGEX == null)
+    {
+      ACCESSION_REGEX = Platform.newRegex("^[A-Z]+[0-9]+", null);
+    }
+    return ACCESSION_REGEX;
   }
 
   /*
index a658089..d12c271 100644 (file)
@@ -36,6 +36,7 @@ import jalview.io.FormatAdapter;
 import jalview.io.PDBFeatureSettings;
 import jalview.structure.StructureImportSettings;
 import jalview.util.MessageManager;
+import jalview.util.Platform;
 import jalview.ws.ebi.EBIFetchClient;
 
 import java.io.File;
@@ -56,6 +57,8 @@ public class Pdb extends EbiFileRetrievedProxy
 
   private static final int PDB_ID_LENGTH = 4;
 
+  private static Regex ACCESSION_REGEX;
+
   public Pdb()
   {
     super();
@@ -80,7 +83,12 @@ public class Pdb extends EbiFileRetrievedProxy
   @Override
   public Regex getAccessionValidator()
   {
-    return new Regex("([1-9][0-9A-Za-z]{3}):?([ _A-Za-z0-9]?)");
+    if (ACCESSION_REGEX == null)
+    {
+      ACCESSION_REGEX = Platform
+              .newRegex("([1-9][0-9A-Za-z]{3}):?([ _A-Za-z0-9]?)", null);
+    }
+    return ACCESSION_REGEX;
   }
 
   /*
@@ -169,7 +177,7 @@ public class Pdb extends EbiFileRetrievedProxy
               fileFormat);
       if (pdbAlignment != null)
       {
-        List<SequenceI> toremove = new ArrayList<SequenceI>();
+        List<SequenceI> toremove = new ArrayList<>();
         for (SequenceI pdbcs : pdbAlignment.getSequences())
         {
           String chid = null;
index 0600427..6c313ec 100644 (file)
@@ -20,6 +20,8 @@
  */
 package jalview.ws.dbsources;
 
+import jalview.datamodel.DBRefSource;
+
 /**
  * flyweight class specifying retrieval of Full family alignments from PFAM
  * 
@@ -45,7 +47,7 @@ public class PfamFull extends Pfam
   @Override
   public String getDbName()
   {
-    return "PFAM (Full)";
+    return DBRefSource.PFAM_FULL;
   }
 
   @Override
index dff8a17..e4662e1 100644 (file)
@@ -20,6 +20,8 @@
  */
 package jalview.ws.dbsources;
 
+import jalview.datamodel.DBRefSource;
+
 /**
  * flyweight class specifying retrieval of Seed alignments from PFAM
  * 
@@ -47,7 +49,7 @@ public class PfamSeed extends Pfam
   @Override
   public String getDbName()
   {
-    return "PFAM (Seed)";
+    return DBRefSource.PFAM_SEED;
   }
 
   @Override
index 6f5f033..a021d4a 100644 (file)
@@ -29,10 +29,11 @@ import jalview.datamodel.PDBEntry;
 import jalview.datamodel.Sequence;
 import jalview.datamodel.SequenceFeature;
 import jalview.datamodel.SequenceI;
+import jalview.gui.Preferences;
 import jalview.schemes.ResidueProperties;
+import jalview.util.Platform;
 import jalview.util.StringUtils;
 import jalview.ws.seqfetcher.DbSourceProxyImpl;
-import jalview.xml.binding.embl.ROOT;
 import jalview.xml.binding.uniprot.DbReferenceType;
 import jalview.xml.binding.uniprot.Entry;
 import jalview.xml.binding.uniprot.FeatureType;
@@ -71,6 +72,8 @@ public class Uniprot extends DbSourceProxyImpl
 
   private static final String BAR_DELIMITER = "|";
 
+  private static Regex ACCESSION_REGEX;
+
   /**
    * Constructor
    */
@@ -81,7 +84,7 @@ public class Uniprot extends DbSourceProxyImpl
 
   private String getDomain()
   {
-    return Cache.getDefault("UNIPROT_DOMAIN", DEFAULT_UNIPROT_DOMAIN);
+    return Cache.getDefault(Preferences.UNIPROT_DOMAIN, DEFAULT_UNIPROT_DOMAIN);
   }
 
   /*
@@ -103,7 +106,12 @@ public class Uniprot extends DbSourceProxyImpl
   @Override
   public Regex getAccessionValidator()
   {
-    return new Regex("([A-Z]+[0-9]+[A-Z0-9]+|[A-Z0-9]+_[A-Z0-9]+)");
+    if (ACCESSION_REGEX == null)
+    {
+      ACCESSION_REGEX = Platform
+              .newRegex("([A-Z]+[0-9]+[A-Z0-9]+|[A-Z0-9]+_[A-Z0-9]+)", null);
+    }
+    return ACCESSION_REGEX;
   }
 
   /*
index bee9fad..74263b1 100644 (file)
@@ -20,6 +20,8 @@
  */
 package jalview.ws.jws1;
 
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
 import jalview.gui.JvOptionPane;
 import jalview.util.MessageManager;
 
@@ -34,9 +36,36 @@ import ext.vamsas.RegistryServiceSoapBindingStub;
 import ext.vamsas.ServiceHandle;
 import ext.vamsas.ServiceHandles;
 
-public class Discoverer implements Runnable
+public class Discoverer implements Runnable, ApplicationSingletonI
 {
-  ext.vamsas.IRegistry registry; // the root registry service.
+
+  public static Discoverer getInstance()
+  {
+    return (Discoverer) ApplicationSingletonProvider.getInstance(Discoverer.class);
+  }
+
+  private Discoverer()
+  {
+    // use getInstance()
+  }
+
+  private java.net.URL RootServiceURL = null;
+
+  private Vector<URL> ServiceURLList = null;
+
+  private boolean reallyDiscoverServices = true;
+
+  private Hashtable<String, Vector<ServiceHandle>> services = null;
+
+  public Hashtable<String, Vector<ServiceHandle>> getServices()
+  {
+    return services;
+  }
+
+  private Vector<ServiceHandle> serviceList = null;
+
+  // private ext.vamsas.IRegistry registry; // the root registry service.
+
 
   private java.beans.PropertyChangeSupport changeSupport = new java.beans.PropertyChangeSupport(
           this);
@@ -110,19 +139,6 @@ public class Discoverer implements Runnable
     return server;
   }
 
-  static private java.net.URL RootServiceURL = null;
-
-  static public Vector<URL> ServiceURLList = null;
-
-  static private boolean reallyDiscoverServices = true;
-
-  public static java.util.Hashtable<String, Vector<ServiceHandle>> services = null;
-  // stored by
-  // abstractServiceType
-  // string
-
-  public static java.util.Vector<ServiceHandle> serviceList = null;
-
   static private Vector<URL> getDiscoveryURLS()
   {
     Vector<URL> urls = new Vector<>();
@@ -178,18 +194,19 @@ public class Discoverer implements Runnable
   {
     jalview.bin.Cache.log
             .debug("(Re)-Initialising the discovery URL list.");
+    Discoverer d = getInstance();
     try
     {
-      reallyDiscoverServices = jalview.bin.Cache
+      d.reallyDiscoverServices = jalview.bin.Cache
               .getDefault("DISCOVERY_START", false);
-      if (reallyDiscoverServices)
+      if (d.reallyDiscoverServices)
       {
-        ServiceURLList = getDiscoveryURLS();
+        d.ServiceURLList = getDiscoveryURLS();
       }
       else
       {
         jalview.bin.Cache.log.debug("Setting default services");
-        services = new Hashtable<>();
+        d.services = new Hashtable<>();
         // Muscle, Clustal and JPred.
         ServiceHandle[] defServices = { new ServiceHandle("MsaWS",
                 "Edgar, Robert C. (2004), MUSCLE: multiple sequence alignment "
@@ -217,16 +234,16 @@ public class Discoverer implements Runnable
                             + "\ndoi://10.1093/nar/gkv332",
                     "http://www.compbio.dundee.ac.uk/JalviewWS/services/jpred",
                     "JPred Secondary Structure Prediction") };
-        services = new Hashtable<>();
-        serviceList = new Vector<>();
-        buildServiceLists(defServices, serviceList, services);
+        d.services = new Hashtable<>();
+        d.serviceList = new Vector<>();
+        buildServiceLists(defServices, d.serviceList, d.services);
       }
 
     } catch (Exception e)
     {
       System.err.println(
               "jalview.rootRegistry is not a proper url!\nWas set to "
-                      + RootServiceURL + "\n" + e);
+                      + d.RootServiceURL + "\n" + e);
     }
 
   }
@@ -246,9 +263,9 @@ public class Discoverer implements Runnable
       // JBPNote - should do this a better way!
       if (f.getFaultReason().indexOf("(407)") > -1)
       {
-        if (jalview.gui.Desktop.desktop != null)
+        if (jalview.gui.Desktop.getDesktopPane() != null)
         {
-          JvOptionPane.showMessageDialog(jalview.gui.Desktop.desktop,
+          JvOptionPane.showMessageDialog(jalview.gui.Desktop.getDesktopPane(),
                   MessageManager.getString("label.set_proxy_settings"),
                   MessageManager
                           .getString("label.proxy_authorization_failed"),
@@ -307,17 +324,18 @@ public class Discoverer implements Runnable
         cat.add(sh[i]);
         if (sh[i].getAbstractName().equals("Registry"))
         {
-          for (int s = 0, sUrls = ServiceURLList.size(); s < sUrls; s++)
+          Vector<URL> list = getInstance().ServiceURLList;
+          for (int s = 0, sUrls = list.size(); s < sUrls; s++)
           {
             java.net.URL disc_serv = null;
             try
             {
               disc_serv = new java.net.URL(sh[i].getEndpointURL());
-              if (!ServiceURLList.contains(disc_serv))
+              if (!list.contains(disc_serv))
               {
                 jalview.bin.Cache.log.debug(
                         "Adding new discovery service at " + disc_serv);
-                ServiceURLList.add(disc_serv);
+                list.add(disc_serv);
                 seenNewDiscovery = true;
               }
             } catch (Exception e)
index 3b7bdb6..3dd8104 100644 (file)
@@ -323,7 +323,7 @@ public class JPredClient extends WS1Client
 
     } catch (Exception ex)
     {
-      JvOptionPane.showMessageDialog(Desktop.desktop,
+      JvOptionPane.showMessageDialog(Desktop.getDesktopPane(),
               MessageManager.formatMessage(
                       "label.secondary_structure_prediction_service_couldnt_be_located",
                       new String[]
index 4a09625..e97d309 100644 (file)
@@ -78,7 +78,7 @@ public class MsaWSClient extends WS1Client
     alignFrame = _alignFrame;
     if (!sh.getAbstractName().equals("MsaWS"))
     {
-      JvOptionPane.showMessageDialog(Desktop.desktop,
+      JvOptionPane.showMessageDialog(Desktop.getDesktopPane(),
               MessageManager.formatMessage(
                       "label.service_called_is_not_msa_service",
                       new String[]
@@ -91,7 +91,7 @@ public class MsaWSClient extends WS1Client
 
     if ((wsInfo = setWebService(sh)) == null)
     {
-      JvOptionPane.showMessageDialog(Desktop.desktop, MessageManager
+      JvOptionPane.showMessageDialog(Desktop.getDesktopPane(), MessageManager
               .formatMessage("label.msa_service_is_unknown", new String[]
               { sh.getName() }),
               MessageManager.getString("label.internal_jalview_error"),
index 53338d3..cb965f0 100644 (file)
@@ -84,7 +84,7 @@ public class SeqSearchWSClient extends WS1Client
     // name to service client name
     if (!sh.getAbstractName().equals(this.getServiceActionKey()))
     {
-      JvOptionPane.showMessageDialog(Desktop.desktop,
+      JvOptionPane.showMessageDialog(Desktop.getDesktopPane(),
               MessageManager.formatMessage(
                       "label.service_called_is_not_seq_search_service",
                       new String[]
@@ -97,7 +97,7 @@ public class SeqSearchWSClient extends WS1Client
 
     if ((wsInfo = setWebService(sh)) == null)
     {
-      JvOptionPane.showMessageDialog(Desktop.desktop,
+      JvOptionPane.showMessageDialog(Desktop.getDesktopPane(),
               MessageManager.formatMessage(
                       "label.seq_search_service_is_unknown", new String[]
                       { sh.getName() }),
index 327864a..2c9b34a 100644 (file)
@@ -116,7 +116,7 @@ public class AAConClient extends JabawsCalcWorker
     return CALC_ID;
   }
 
-  private static String CALC_ID = "jabaws2.AACon";
+  private final static String CALC_ID = "jabaws2.AACon";
 
   public static AlignAnalysisUIText getAlignAnalysisUITest()
   {
index a1b8e7a..a06fed5 100644 (file)
@@ -53,48 +53,22 @@ public class AADisorderClient extends JabawsCalcWorker
 
   private static final String RANGE = "RANGE";
 
-  String typeName;
+  private String typeName;
 
-  String methodName;
+  private String methodName;
 
-  String groupName;
+  // private String groupName;
 
   AlignFrame af;
 
-  public AADisorderClient(Jws2Instance sh, AlignFrame alignFrame,
-          WsParamSetI thePreset, List<Argument> paramset)
-  {
-    super(sh, alignFrame, thePreset, paramset);
-    af = alignFrame;
-    typeName = sh.action;
-    methodName = sh.serviceType;
+  private final static Map<String, Map<String, String[]>> featureMap;
 
-    submitGaps = false;
-    alignedSeqs = false;
-    nucleotidesAllowed = false;
-    proteinAllowed = true;
-    bySequence = true;
-  }
+  private final static Map<String, Map<String, Map<String, Object>>> annotMap;
 
-  @Override
-  public String getServiceActionText()
-  {
-    return "Submitting amino acid sequences for disorder prediction.";
-  }
+  private final static String DONTCOMBINE = "DONTCOMBINE";
 
-  @Override
-  boolean checkValidInputSeqs(boolean dynamic, List<FastaSequence> seqs)
-  {
-    return (seqs.size() > 0);
-  }
-
-  private static Map<String, Map<String, String[]>> featureMap;
+  private final static String INVISIBLE = "INVISIBLE";
 
-  private static Map<String, Map<String, Map<String, Object>>> annotMap;
-
-  private static String DONTCOMBINE = "DONTCOMBINE";
-
-  private static String INVISIBLE = "INVISIBLE";
   static
   {
     // TODO: turn this into some kind of configuration file that's a bit easier
@@ -162,6 +136,33 @@ public class AADisorderClient extends JabawsCalcWorker
     amap.get("JRonn").put(RANGE, new float[] { 0, 1 });
   }
 
+  public AADisorderClient(Jws2Instance sh, AlignFrame alignFrame,
+          WsParamSetI thePreset, List<Argument> paramset)
+  {
+    super(sh, alignFrame, thePreset, paramset);
+    af = alignFrame;
+    typeName = sh.action;
+    methodName = sh.serviceType;
+
+    submitGaps = false;
+    alignedSeqs = false;
+    nucleotidesAllowed = false;
+    proteinAllowed = true;
+    bySequence = true;
+  }
+
+  @Override
+  public String getServiceActionText()
+  {
+    return "Submitting amino acid sequences for disorder prediction.";
+  }
+
+  @Override
+  boolean checkValidInputSeqs(boolean dynamic, List<FastaSequence> seqs)
+  {
+    return (seqs.size() > 0);
+  }
+
   @Override
   public void updateResultAnnotation(boolean immediate)
   {
@@ -239,13 +240,13 @@ public class AADisorderClient extends JabawsCalcWorker
                 if (vals.hasNext())
                 {
                   val = vals.next().floatValue();
-                  sf = new SequenceFeature(type[0], type[1],
-                          base + rn.from, base + rn.to, val, methodName);
+                  sf = new SequenceFeature(type[0], type[1], base + rn.from,
+                          base + rn.to, val, methodName);
                 }
                 else
                 {
-                  sf = new SequenceFeature(type[0], type[1],
-                          base + rn.from, base + rn.to, methodName);
+                  sf = new SequenceFeature(type[0], type[1], base + rn.from,
+                          base + rn.to, methodName);
                 }
                 dseq.addSequenceFeature(sf);
                 if (last != val && !Float.isNaN(last))
index 0f1a25e..62f2a03 100644 (file)
@@ -398,7 +398,7 @@ public abstract class Jws2Client extends jalview.ws.WSClient
       {
         // check service is actually in the list of currently avaialable
         // services
-        if (!Jws2Discoverer.getDiscoverer().getServices().contains(service))
+        if (!Jws2Discoverer.getInstance().getServices().contains(service))
         {
           // it isn't ..
           service = null;
@@ -408,7 +408,7 @@ public abstract class Jws2Client extends jalview.ws.WSClient
     if (service == null)
     {
       // get the default service for AACon
-      service = Jws2Discoverer.getDiscoverer().getPreferredServiceFor(null,
+      service = Jws2Discoverer.getInstance().getPreferredServiceFor(null,
               aaui.getServiceType());
     }
     if (service == null)
index 516a719..bd4d352 100644 (file)
@@ -21,6 +21,8 @@
 package jalview.ws.jws2;
 
 import jalview.bin.Cache;
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
 import jalview.gui.AlignFrame;
 import jalview.gui.Desktop;
 import jalview.gui.JvSwingUtils;
@@ -60,8 +62,29 @@ import compbio.ws.client.Services;
  * @author JimP
  * 
  */
-public class Jws2Discoverer implements Runnable, WSMenuEntryProviderI
+public class Jws2Discoverer
+        implements Runnable, WSMenuEntryProviderI, ApplicationSingletonI
 {
+
+  /**
+   * Returns the singleton instance of this class.
+   * 
+   * @return
+   */
+  public static Jws2Discoverer getInstance()
+  {
+    return (Jws2Discoverer) ApplicationSingletonProvider
+            .getInstance(Jws2Discoverer.class);
+  }
+
+  /**
+   * Private constructor enforces use of singleton via getDiscoverer()
+   */
+  private Jws2Discoverer()
+  {
+    // use getInstance();
+  }
+
   public static final String COMPBIO_JABAWS = "http://www.compbio.dundee.ac.uk/jabaws";
 
   /*
@@ -70,11 +93,6 @@ public class Jws2Discoverer implements Runnable, WSMenuEntryProviderI
   private final static String JWS2HOSTURLS = "JWS2HOSTURLS";
 
   /*
-   * Singleton instance
-   */
-  private static Jws2Discoverer discoverer;
-
-  /*
    * Override for testing only
    */
   private static List<String> testUrls = null;
@@ -82,7 +100,7 @@ public class Jws2Discoverer implements Runnable, WSMenuEntryProviderI
   // preferred url has precedence over others
   private String preferredUrl;
 
-  private PropertyChangeSupport changeSupport = new PropertyChangeSupport(
+  protected PropertyChangeSupport changeSupport = new PropertyChangeSupport(
           this);
 
   private Vector<String> invalidServiceUrls = null;
@@ -103,13 +121,6 @@ public class Jws2Discoverer implements Runnable, WSMenuEntryProviderI
   protected Vector<Jws2Instance> services;
 
   /**
-   * Private constructor enforces use of singleton via getDiscoverer()
-   */
-  private Jws2Discoverer()
-  {
-  }
-
-  /**
    * change listeners are notified of "services" property changes
    * 
    * @param listener
@@ -190,7 +201,7 @@ public class Jws2Discoverer implements Runnable, WSMenuEntryProviderI
     oldthread = Thread.currentThread();
     try
     {
-      Class foo = getClass().getClassLoader()
+      getClass().getClassLoader()
               .loadClass("compbio.ws.client.Jws2Client");
     } catch (ClassNotFoundException e)
     {
@@ -591,19 +602,19 @@ public class Jws2Discoverer implements Runnable, WSMenuEntryProviderI
         testUrls.add(url);
       }
     }
-    Thread runner = getDiscoverer()
+    Thread runner = getInstance()
             .startDiscoverer(new PropertyChangeListener()
             {
 
               @Override
               public void propertyChange(PropertyChangeEvent evt)
               {
-                if (getDiscoverer().services != null)
+                if (getInstance().services != null)
                 {
                   System.out.println("Changesupport: There are now "
-                          + getDiscoverer().services.size() + " services");
+                          + getInstance().services.size() + " services");
                   int i = 1;
-                  for (Jws2Instance instance : getDiscoverer().services)
+                  for (Jws2Instance instance : getInstance().services)
                   {
                     System.out.println("Service " + i++ + " "
                             + instance.getClass() + "@" + instance.getHost()
@@ -630,20 +641,6 @@ public class Jws2Discoverer implements Runnable, WSMenuEntryProviderI
     }
   }
 
-  /**
-   * Returns the singleton instance of this class.
-   * 
-   * @return
-   */
-  public static Jws2Discoverer getDiscoverer()
-  {
-    if (discoverer == null)
-    {
-      discoverer = new Jws2Discoverer();
-    }
-    return discoverer;
-  }
-
   public boolean hasServices()
   {
     return !running && services != null && services.size() > 0;
index 23c6949..319252a 100644 (file)
@@ -107,7 +107,7 @@ public class MsaWSClient extends Jws2Client
     if (!(sh.service instanceof MsaWS))
     {
       // redundant at mo - but may change
-      JvOptionPane.showMessageDialog(Desktop.desktop,
+      JvOptionPane.showMessageDialog(Desktop.getDesktopPane(),
               MessageManager.formatMessage(
                       "label.service_called_is_not_msa_service",
                       new String[]
@@ -120,7 +120,7 @@ public class MsaWSClient extends Jws2Client
     server = (MsaWS) sh.service;
     if ((wsInfo = setWebService(sh, false)) == null)
     {
-      JvOptionPane.showMessageDialog(Desktop.desktop, MessageManager
+      JvOptionPane.showMessageDialog(Desktop.getDesktopPane(), MessageManager
               .formatMessage("label.msa_service_is_unknown", new String[]
               { sh.serviceType }),
               MessageManager.getString("label.internal_jalview_error"),
index f9e597f..80c9ce9 100644 (file)
@@ -237,7 +237,7 @@ public class RNAalifoldClient extends JabawsCalcWorker
         // The Score objects contain a set of size one containing the range and
         // an ArrayList<float> of size one containing the probabilty
         basePairs.put(score.getRanges().first(),
-                Float.valueOf(score.getScores().get(0)));
+                new Float(score.getScores().get(0)));
       }
 
       for (int i = 0, ri = 0, iEnd = struct.length(); i < iEnd; i++, ri++)
index 45bddac..9358c76 100644 (file)
@@ -67,7 +67,7 @@ public class SequenceAnnotationWSClient extends Jws2Client
     // dan changed! dan test. comment out if conditional
     // if (alignFrame.getViewport().getAlignment().isNucleotide())
     // {
-    // JvOptionPane.showMessageDialog(Desktop.desktop, sh.serviceType
+    // JvOptionPane.showMessageDialog(Desktop.getDesktop(), sh.serviceType
     // + " can only be used\nfor amino acid alignments.",
     // "Wrong type of sequences!", JvOptionPane.WARNING_MESSAGE);
     // return;
@@ -242,7 +242,7 @@ public class SequenceAnnotationWSClient extends Jws2Client
           @Override
           public void actionPerformed(ActionEvent arg0)
           {
-            Desktop.instance.showUrl(service.docUrl);
+            Desktop.getInstance().showUrl(service.docUrl);
           }
         });
         annotservice.setToolTipText(
index e092192..a4e2e75 100644 (file)
@@ -38,7 +38,7 @@ import compbio.data.msa.SequenceAnnotation;
 import compbio.metadata.PresetManager;
 import compbio.metadata.RunnerConfig;
 
-public class Jws2Instance implements AutoCloseable
+public class Jws2Instance
 {
   public String hosturl;
 
@@ -164,7 +164,7 @@ public class Jws2Instance implements AutoCloseable
   }
 
   @Override
-  public void close()
+  protected void finalize() throws Throwable
   {
     if (service != null)
     {
@@ -176,7 +176,7 @@ public class Jws2Instance implements AutoCloseable
         // ignore
       }
     }
-    // super.finalize();
+    super.finalize();
   }
 
   public ParamDatastoreI getParamStore()
@@ -186,7 +186,7 @@ public class Jws2Instance implements AutoCloseable
       try
       {
         paramStore = new JabaParamStore(this,
-                (Desktop.instance != null ? Desktop.getUserParameterStore()
+                (Desktop.getInstance() != null ? Desktop.getUserParameterStore()
                         : null));
       } catch (Exception ex)
       {
index 623b8de..1983ff5 100644 (file)
@@ -20,6 +20,8 @@
  */
 package jalview.ws.jws2.jabaws2;
 
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
 import jalview.ws.jws2.AAConClient;
 import jalview.ws.jws2.RNAalifoldClient;
 import jalview.ws.uimodel.AlignAnalysisUIText;
@@ -29,11 +31,23 @@ import java.util.HashSet;
 
 import compbio.data.msa.JABAService;
 
-public class Jws2InstanceFactory
+public class Jws2InstanceFactory implements ApplicationSingletonI
 {
-  private static HashMap<String, AlignAnalysisUIText> aaConGUI;
 
-  private static HashSet<String> ignoreGUI;
+  private Jws2InstanceFactory()
+  {
+    // private singleton
+  }
+
+  private static Jws2InstanceFactory getInstance()
+  {
+    return (Jws2InstanceFactory) ApplicationSingletonProvider
+            .getInstance(Jws2InstanceFactory.class);
+  }
+
+  private HashMap<String, AlignAnalysisUIText> aaConGUI;
+
+  private HashSet<String> ignoreGUI;
 
   private static String category_rewrite(String cat_name)
   {
@@ -42,17 +56,17 @@ public class Jws2InstanceFactory
             : cat_name;
   }
 
-  private static void init()
+  private void init()
   {
     if (aaConGUI == null)
     {
-      aaConGUI = new HashMap<String, AlignAnalysisUIText>();
+      aaConGUI = new HashMap<>();
       aaConGUI.put(compbio.ws.client.Services.AAConWS.toString(),
               AAConClient.getAlignAnalysisUITest());
       aaConGUI.put(compbio.ws.client.Services.RNAalifoldWS.toString(),
               RNAalifoldClient.getAlignAnalysisUITest());
       // ignore list for JABAWS services not supported in jalview ...
-      ignoreGUI = new HashSet<String>();
+      ignoreGUI = new HashSet<>();
     }
   }
 
@@ -65,8 +79,8 @@ public class Jws2InstanceFactory
    */
   public static boolean ignoreService(String serviceType)
   {
-    init();
-    return (ignoreGUI.contains(serviceType.toString()));
+    getInstance().init();
+    return (getInstance().ignoreGUI.contains(serviceType.toString()));
   }
 
   /**
@@ -84,10 +98,10 @@ public class Jws2InstanceFactory
           String serviceType, String name, String description,
           JABAService service)
   {
-    init();
+    getInstance().init();
     Jws2Instance svc = new Jws2Instance(jwsservers, serviceType,
             category_rewrite(name), description, service);
-    svc.aaui = aaConGUI.get(serviceType.toString());
+    svc.aaui = getInstance().aaConGUI.get(serviceType.toString());
     return svc;
   }
 
index 5bfe3b5..4d5a2aa 100644 (file)
@@ -50,7 +50,7 @@ import org.apache.james.mime4j.parser.MimeStreamParser;
  * 
  */
 
-public class HttpResultSet extends FileParse implements AutoCloseable
+public class HttpResultSet extends FileParse
 {
 
   private HttpRequestBase cachedRequest;
@@ -89,7 +89,7 @@ public class HttpResultSet extends FileParse implements AutoCloseable
    */
   public List<DataProvider> createResultDataProviders()
   {
-    List<DataProvider> dp = new ArrayList<>();
+    List<DataProvider> dp = new ArrayList<DataProvider>();
     for (JvDataType type : restJob.rsd.getResultDataTypes())
     {
       dp.add(new SimpleDataProvider(type, this, null));
@@ -106,7 +106,7 @@ public class HttpResultSet extends FileParse implements AutoCloseable
    */
   public Object[] parseResultSet() throws Exception, Error
   {
-    List<DataProvider> dp = new ArrayList<>();
+    List<DataProvider> dp = new ArrayList<DataProvider>();
     Object[] results = null;
 
     if (en == null)
@@ -200,7 +200,7 @@ public class HttpResultSet extends FileParse implements AutoCloseable
   }
 
   @Override
-  public void close()
+  protected void finalize() throws Throwable
   {
     dataIn = null;
     cachedRequest = null;
@@ -215,8 +215,7 @@ public class HttpResultSet extends FileParse implements AutoCloseable
     } catch (Error ex)
     {
     }
-    // no finalize for FileParse
-    // super.close();
+    super.finalize();
   }
 
   /**
index a71b70d..a5b68d7 100644 (file)
@@ -21,6 +21,8 @@
 package jalview.ws.rest;
 
 import jalview.bin.Cache;
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
 import jalview.datamodel.AlignmentView;
 import jalview.gui.AlignFrame;
 import jalview.gui.AlignViewport;
@@ -49,14 +51,11 @@ import javax.swing.event.MenuListener;
  * 
  */
 public class RestClient extends WSClient
-        implements WSClientI, WSMenuEntryProviderI
+        implements WSClientI, WSMenuEntryProviderI, ApplicationSingletonI
 {
-  RestServiceDescription service;
+  public static final String RSBS_SERVICES = "RSBS_SERVICES";
 
-  public RestClient(RestServiceDescription rsd)
-  {
-    service = rsd;
-  }
+  RestServiceDescription service;
 
   /**
    * parent alignframe for this job
@@ -68,6 +67,118 @@ public class RestClient extends WSClient
    */
   AlignViewport av;
 
+  boolean headless = false;
+
+  protected Vector<String> services = null;
+
+  private static RestClient getInstance()
+  {
+    return (RestClient) ApplicationSingletonProvider.getInstance(RestClient.class);
+  }
+
+  public static RestClient makeShmmrRestClient()
+  {
+    String action = "Analysis",
+            description = "Sequence Harmony and Multi-Relief (Brandt et al. 2010)",
+            name = MessageManager.getString("label.multiharmony");
+    Hashtable<String, InputType> iparams = new Hashtable<>();
+    // jalview.ws.rest.params.JobConstant toolp;
+    // toolp = new jalview.ws.rest.JobConstant("tool","jalview");
+    // iparams.put(toolp.token, toolp);
+    // toolp = new jalview.ws.rest.params.JobConstant("mbjob[method]","shmr");
+    // iparams.put(toolp.token, toolp);
+    // toolp = new
+    // jalview.ws.rest.params.JobConstant("mbjob[description]","step 1");
+    // iparams.put(toolp.token, toolp);
+    // toolp = new jalview.ws.rest.params.JobConstant("start_search","1");
+    // iparams.put(toolp.token, toolp);
+    // toolp = new jalview.ws.rest.params.JobConstant("blast","0");
+    // iparams.put(toolp.token, toolp);
+
+    jalview.ws.rest.params.Alignment aliinput = new jalview.ws.rest.params.Alignment();
+    // SHMR server has a 65K limit for content pasted into the 'ali' parameter,
+    // so we always upload our files.
+    aliinput.token = "ali_file";
+    aliinput.writeAsFile = true;
+    iparams.put(aliinput.token, aliinput);
+    jalview.ws.rest.params.SeqGroupIndexVector sgroups = new jalview.ws.rest.params.SeqGroupIndexVector();
+    sgroups.setMinsize(2);
+    sgroups.min = 2;// need at least two group defined to make a partition
+    iparams.put("groups", sgroups);
+    sgroups.token = "groups";
+    sgroups.sep = " ";
+    RestServiceDescription shmrService = new RestServiceDescription(action,
+            description, name,
+            "http://zeus.few.vu.nl/programs/shmrwww/index.php?tool=jalview", // ?tool=jalview&mbjob[method]=shmr&mbjob[description]=step1",
+            "?tool=jalview", iparams, true, false, '-');
+    // a priori knowledge of the data returned from the service
+    shmrService.addResultDatatype(JvDataType.ANNOTATION);
+    return new RestClient(shmrService);
+  }
+
+  public static RestClient[] getRestClients()
+  {
+    RestClient c = getInstance();
+
+    if (c.services == null)
+    {
+      c.services = new Vector<>();
+      try
+      {
+        for (RestServiceDescription descr : RestServiceDescription
+                .parseDescriptions(
+                        jalview.bin.Cache.getDefault(RSBS_SERVICES,
+                                makeShmmrRestClient().service.toString())))
+        {
+          c.services.add(descr.toString());
+        }
+      } catch (Exception ex)
+      {
+        System.err.println(
+                "Serious - RSBS descriptions in user preferences are corrupt!");
+        ex.printStackTrace();
+      }
+
+    }
+    RestClient[] lst = new RestClient[c.services.size()];
+    int i = 0;
+    for (String svc : c.services)
+    {
+      lst[i++] = new RestClient(new RestServiceDescription(svc));
+    }
+    return lst;
+  }
+
+  public static Vector<String> getRsbsDescriptions()
+  {
+    Vector<String> rsbsDescrs = new Vector<>();
+    for (RestClient rsbs : getRestClients())
+    {
+      rsbsDescrs.add(rsbs.getRestDescription().toString());
+    }
+    return rsbsDescrs;
+  }
+
+  public static void setRsbsServices(Vector<String> rsbsUrls)
+  {
+    if (rsbsUrls != null)
+    {
+      // TODO: consider validating services ?
+      RestClient c = getInstance();
+      c.services = new Vector<>(rsbsUrls);
+      StringBuffer sprop = new StringBuffer();
+      for (String s : c.services)
+      {
+        sprop.append(s);
+      }
+      Cache.setProperty(RSBS_SERVICES, sprop.toString());
+    }
+    else
+    {
+      Cache.removeProperty(RSBS_SERVICES);
+    }
+  }
+
   /**
    * get the alignFrame for the associated input data if it exists.
    * 
@@ -78,13 +189,21 @@ public class RestClient extends WSClient
     return jalview.gui.Desktop.getAlignFrameFor(av);
   }
 
+  private RestClient()
+  {
+
+  }
+
+  public RestClient(RestServiceDescription rsd)
+  {
+    service = rsd;
+  }
+
   public RestClient(RestServiceDescription service2, AlignFrame alignFrame)
   {
     this(service2, alignFrame, false);
   }
 
-  boolean headless = false;
-
   public RestClient(RestServiceDescription service2, AlignFrame alignFrame,
           boolean nogui)
   {
@@ -329,7 +448,7 @@ public class RestClient extends WSClient
     else
     {
       // TODO: try to tell the user why the job couldn't be started.
-      JvOptionPane.showMessageDialog(Desktop.desktop,
+      JvOptionPane.showMessageDialog(Desktop.getDesktopPane(),
               (jobsthread.hasWarnings() ? jobsthread.getWarnings()
                       : MessageManager.getString(
                               "label.job_couldnt_be_started_check_input")),
@@ -339,46 +458,6 @@ public class RestClient extends WSClient
     }
   }
 
-  public static RestClient makeShmmrRestClient()
-  {
-    String action = "Analysis",
-            description = "Sequence Harmony and Multi-Relief (Brandt et al. 2010)",
-            name = MessageManager.getString("label.multiharmony");
-    Hashtable<String, InputType> iparams = new Hashtable<String, InputType>();
-    jalview.ws.rest.params.JobConstant toolp;
-    // toolp = new jalview.ws.rest.JobConstant("tool","jalview");
-    // iparams.put(toolp.token, toolp);
-    // toolp = new jalview.ws.rest.params.JobConstant("mbjob[method]","shmr");
-    // iparams.put(toolp.token, toolp);
-    // toolp = new
-    // jalview.ws.rest.params.JobConstant("mbjob[description]","step 1");
-    // iparams.put(toolp.token, toolp);
-    // toolp = new jalview.ws.rest.params.JobConstant("start_search","1");
-    // iparams.put(toolp.token, toolp);
-    // toolp = new jalview.ws.rest.params.JobConstant("blast","0");
-    // iparams.put(toolp.token, toolp);
-
-    jalview.ws.rest.params.Alignment aliinput = new jalview.ws.rest.params.Alignment();
-    // SHMR server has a 65K limit for content pasted into the 'ali' parameter,
-    // so we always upload our files.
-    aliinput.token = "ali_file";
-    aliinput.writeAsFile = true;
-    iparams.put(aliinput.token, aliinput);
-    jalview.ws.rest.params.SeqGroupIndexVector sgroups = new jalview.ws.rest.params.SeqGroupIndexVector();
-    sgroups.setMinsize(2);
-    sgroups.min = 2;// need at least two group defined to make a partition
-    iparams.put("groups", sgroups);
-    sgroups.token = "groups";
-    sgroups.sep = " ";
-    RestServiceDescription shmrService = new RestServiceDescription(action,
-            description, name,
-            "http://zeus.few.vu.nl/programs/shmrwww/index.php?tool=jalview", // ?tool=jalview&mbjob[method]=shmr&mbjob[description]=step1",
-            "?tool=jalview", iparams, true, false, '-');
-    // a priori knowledge of the data returned from the service
-    shmrService.addResultDatatype(JvDataType.ANNOTATION);
-    return new RestClient(shmrService);
-  }
-
   public AlignmentPanel recoverAlignPanelForView()
   {
     AlignmentPanel[] aps = Desktop
@@ -399,41 +478,6 @@ public class RestClient extends WSClient
     return true;
   }
 
-  protected static Vector<String> services = null;
-
-  public static final String RSBS_SERVICES = "RSBS_SERVICES";
-
-  public static RestClient[] getRestClients()
-  {
-    if (services == null)
-    {
-      services = new Vector<String>();
-      try
-      {
-        for (RestServiceDescription descr : RestServiceDescription
-                .parseDescriptions(
-                        jalview.bin.Cache.getDefault(RSBS_SERVICES,
-                                makeShmmrRestClient().service.toString())))
-        {
-          services.add(descr.toString());
-        }
-      } catch (Exception ex)
-      {
-        System.err.println(
-                "Serious - RSBS descriptions in user preferences are corrupt!");
-        ex.printStackTrace();
-      }
-
-    }
-    RestClient[] lst = new RestClient[services.size()];
-    int i = 0;
-    for (String svc : services)
-    {
-      lst[i++] = new RestClient(new RestServiceDescription(svc));
-    }
-    return lst;
-  }
-
   public String getAction()
   {
     return service.details.Action;
@@ -444,33 +488,4 @@ public class RestClient extends WSClient
     return service;
   }
 
-  public static Vector<String> getRsbsDescriptions()
-  {
-    Vector<String> rsbsDescrs = new Vector<String>();
-    for (RestClient rsbs : getRestClients())
-    {
-      rsbsDescrs.add(rsbs.getRestDescription().toString());
-    }
-    return rsbsDescrs;
-  }
-
-  public static void setRsbsServices(Vector<String> rsbsUrls)
-  {
-    if (rsbsUrls != null)
-    {
-      // TODO: consider validating services ?
-      services = new Vector<String>(rsbsUrls);
-      StringBuffer sprop = new StringBuffer();
-      for (String s : services)
-      {
-        sprop.append(s);
-      }
-      Cache.setProperty(RSBS_SERVICES, sprop.toString());
-    }
-    else
-    {
-      Cache.removeProperty(RSBS_SERVICES);
-    }
-  }
-
 }
index 2a27cce..e205e76 100644 (file)
@@ -36,6 +36,7 @@ import java.util.HashSet;
 import java.util.Hashtable;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Stack;
 import java.util.Vector;
 
@@ -45,7 +46,7 @@ public class ASequenceFetcher
   /*
    * set of databases we can retrieve entries from
    */
-  protected Hashtable<String, Map<String, DbSourceProxy>> fetchableDbs;
+  protected Hashtable<String, Map<String, DbSourceProxyRoot>> fetchableDbs;
 
   /*
    * comparator to sort by tier (0/1/2) and name
@@ -57,8 +58,6 @@ public class ASequenceFetcher
    */
   protected ASequenceFetcher()
   {
-    super();
-
     /*
      * comparator to sort proxies by tier and name
      */
@@ -305,7 +304,7 @@ public class ASequenceFetcher
   public List<DbSourceProxy> getSourceProxy(String db)
   {
     db = DBRefUtils.getCanonicalName(db);
-    Map<String, DbSourceProxy> dblist = fetchableDbs.get(db);
+    Map<String, DbSourceProxyRoot> dblist = fetchableDbs.get(db);
     if (dblist == null)
     {
       return new ArrayList<>();
@@ -314,27 +313,75 @@ public class ASequenceFetcher
     /*
      * sort so that primary sources precede secondary
      */
-    List<DbSourceProxy> dbs = new ArrayList<>(dblist.values());
+    List<DbSourceProxy> dbs = new ArrayList<>();
+    for (Entry<String, DbSourceProxyRoot> entry : dblist.entrySet())
+    {
+      DbSourceProxyRoot proxy = entry.getValue();
+      if (proxy instanceof DbRoot)
+      {
+        proxy = setProxy((DbRoot) proxy, dblist);
+      }
+      dbs.add((DbSourceProxy) proxy);
+    }
     Collections.sort(dbs, proxyComparator);
     return dbs;
   }
 
+  class DbRoot implements DbSourceProxyRoot
+  {
+
+    private String sourceName;
+
+    private String className;
+
+    DbRoot(String sourceName, String className)
+    {
+      this.sourceName = sourceName;
+      this.className = className;
+    }
+
+    @Override
+    public String getDbSource()
+    {
+      return sourceName;
+    }
+
+    /**
+     * lazy class creation
+     * 
+     * @return the actual proxy object
+     */
+    public DbSourceProxy getProxy()
+    {
+      try
+      {
+        System.err.println("ASeqFetch " + className);
+        return (DbSourceProxy) Class.forName(className).newInstance();
+      } catch (Exception e)
+      {
+        // Serious problems if this happens.
+        throw new Error(MessageManager.getString(
+                "error.dbrefsource_implementation_exception"), e);
+      }
+    }
+
+  }
+
   /**
    * constructs an instance of the proxy and registers it as a valid dbrefsource
    * 
-   * @param dbSourceProxy
+   * @param dbSourceProxyClass
    *          reference for class implementing
    *          jalview.ws.seqfetcher.DbSourceProxy
    */
   protected void addDBRefSourceImpl(
-          Class<? extends DbSourceProxy> dbSourceProxy)
+          Class<? extends DbSourceProxy> dbSourceProxyClass)
           throws IllegalArgumentException
   {
     DbSourceProxy proxy = null;
     try
     {
-      DbSourceProxy proxyObj = dbSourceProxy.getConstructor().newInstance();
-      proxy = proxyObj;
+      proxy = dbSourceProxyClass.getConstructor().newInstance();
     } catch (IllegalArgumentException e)
     {
       throw e;
@@ -347,13 +394,18 @@ public class ASequenceFetcher
     addDbRefSourceImpl(proxy);
   }
 
+  public void addDBRefSourceImpl(String sourceName, String className)
+  {
+    addDbRefSourceImpl(new DbRoot(sourceName, className));
+  }
+
   /**
    * add the properly initialised DbSourceProxy object 'proxy' to the list of
    * sequence fetchers
    * 
    * @param proxy
    */
-  protected void addDbRefSourceImpl(DbSourceProxy proxy)
+  void addDbRefSourceImpl(DbSourceProxyRoot proxy)
   {
     if (proxy != null)
     {
@@ -361,25 +413,31 @@ public class ASequenceFetcher
       {
         fetchableDbs = new Hashtable<>();
       }
-      Map<String, DbSourceProxy> slist = fetchableDbs
-              .get(proxy.getDbSource());
+      String key = proxy.getDbSource();
+      Map<String, DbSourceProxyRoot> slist = fetchableDbs.get(key);
       if (slist == null)
       {
-        fetchableDbs.put(proxy.getDbSource(),
-                slist = new Hashtable<>());
+        fetchableDbs.put(key, slist = new Hashtable<>());
+      }
+      if (proxy instanceof DbRoot)
+      {
+        slist.put("", proxy);
+      }
+      else
+      {
+        slist.put(((DbSourceProxy) proxy).getDbName(), proxy);
       }
-      slist.put(proxy.getDbName(), proxy);
     }
   }
 
   /**
    * select sources which are implemented by instances of the given class
    * 
-   * @param class
+   * @param class1
    *          that implements DbSourceProxy
    * @return null or vector of source names for fetchers
    */
-  public String[] getDbInstances(Class class1)
+  public String[] getDbInstances(Class<?> class1)
   {
     if (!DbSourceProxy.class.isAssignableFrom(class1))
     {
@@ -392,20 +450,25 @@ public class ASequenceFetcher
     {
       return null;
     }
-    String[] sources = null;
     Vector<String> src = new Vector<>();
-    Enumeration<String> dbs = fetchableDbs.keys();
-    while (dbs.hasMoreElements())
+    for (String dbSource : fetchableDbs.keySet())
     {
-      String dbn = dbs.nextElement();
-      for (DbSourceProxy dbp : fetchableDbs.get(dbn).values())
+      Map<String, DbSourceProxyRoot> dblist = fetchableDbs.get(dbSource);
+      for (Entry<String, DbSourceProxyRoot> entry : dblist.entrySet())
       {
-        if (class1.isAssignableFrom(dbp.getClass()))
+        DbSourceProxyRoot proxy = entry.getValue();
+        if (proxy instanceof DbRoot)
         {
-          src.addElement(dbn);
+          proxy = setProxy((DbRoot) proxy, dblist);
+        }
+        Class<?> c = proxy.getClass();
+        if (class1 == c || class1.isAssignableFrom(c))
+        {
+          src.addElement(dbSource);
         }
       }
     }
+    String[] sources = null;
     if (src.size() > 0)
     {
       src.copyInto(sources = new String[src.size()]);
@@ -413,10 +476,24 @@ public class ASequenceFetcher
     return sources;
   }
 
-  public DbSourceProxy[] getDbSourceProxyInstances(Class class1)
+  private DbSourceProxyRoot setProxy(DbRoot root,
+          Map<String, DbSourceProxyRoot> dblist)
+  {
+    DbSourceProxy proxy = root.getProxy();
+    // Time to create the actual proxy
+    dblist.remove("");
+    dblist.put(proxy.getDbName(), proxy);
+    return proxy;
+  }
+
+  public DbSourceProxy[] getDbSourceProxyInstances(Class<?> class1)
   {
+    if (fetchableDbs == null)
+    {
+      return null;
+    }
     List<DbSourceProxy> prlist = new ArrayList<>();
-    for (String fetchable : getSupportedDb())
+    for (String fetchable : fetchableDbs.keySet())
     {
       for (DbSourceProxy pr : getSourceProxy(fetchable))
       {
index a02ffc9..3e7441a 100644 (file)
@@ -34,15 +34,9 @@ import com.stevesoft.pat.Regex;
  * 
  * @author JimP
  */
-public interface DbSourceProxy
+public interface DbSourceProxy extends DbSourceProxyRoot
 {
   /**
-   * 
-   * @return source string constant used for this DB source
-   */
-  String getDbSource();
-
-  /**
    * Short meaningful name for this data source for display in menus or
    * selection boxes.
    * 
diff --git a/src/jalview/ws/seqfetcher/DbSourceProxyRoot.java b/src/jalview/ws/seqfetcher/DbSourceProxyRoot.java
new file mode 100644 (file)
index 0000000..7b0c2a7
--- /dev/null
@@ -0,0 +1,11 @@
+package jalview.ws.seqfetcher;
+
+public interface DbSourceProxyRoot
+{
+  /**
+   * 
+   * @return source string constant used for this DB source
+   */
+  String getDbSource();
+
+}
index d065666..bf4d970 100644 (file)
@@ -82,6 +82,22 @@ public class SiftsClient implements SiftsClientI
    */
   private static File mockSiftsFile;
 
+  private static final int BUFFER_SIZE = 4096;
+
+  public static final int UNASSIGNED = Integer.MIN_VALUE;
+
+  private static final int PDB_RES_POS = 0;
+
+  private static final int PDB_ATOM_POS = 1;
+
+  private static final int PDBE_POS = 2;
+
+  private static final String NOT_OBSERVED = "Not_Observed";
+
+  protected static final String SIFTS_FTP_BASE_URL = "http://ftp.ebi.ac.uk/pub/databases/msd/sifts/xml/";
+
+  protected final static String NEWLINE = System.lineSeparator();
+
   private Entry siftsEntry;
 
   private StructureFile pdb;
@@ -100,22 +116,6 @@ public class SiftsClient implements SiftsClientI
    */
   private jalview.datamodel.Mapping seqFromPdbMapping;
 
-  private static final int BUFFER_SIZE = 4096;
-
-  public static final int UNASSIGNED = Integer.MIN_VALUE;
-
-  private static final int PDB_RES_POS = 0;
-
-  private static final int PDB_ATOM_POS = 1;
-
-  private static final int PDBE_POS = 2;
-
-  private static final String NOT_OBSERVED = "Not_Observed";
-
-  private static final String SIFTS_FTP_BASE_URL = "http://ftp.ebi.ac.uk/pub/databases/msd/sifts/xml/";
-
-  private final static String NEWLINE = System.lineSeparator();
-
   private String curSourceDBRef;
 
   private HashSet<String> curDBRefAccessionIdsString;
@@ -400,7 +400,7 @@ public class SiftsClient implements SiftsClientI
   @Override
   public HashSet<String> getAllMappingAccession()
   {
-    HashSet<String> accessions = new HashSet<String>();
+    HashSet<String> accessions = new HashSet<>();
     List<Entity> entities = siftsEntry.getEntity();
     for (Entity entity : entities)
     {
@@ -467,7 +467,7 @@ public class SiftsClient implements SiftsClientI
     entity = getEntityById(entityId);
     String originalSeq = AlignSeq.extractGaps(
             jalview.util.Comparison.GapChars, seq.getSequenceAsString());
-    HashMap<Integer, int[]> mapping = new HashMap<Integer, int[]>();
+    HashMap<Integer, int[]> mapping = new HashMap<>();
     DBRefEntryI sourceDBRef;
     sourceDBRef = getValidSourceDBRef(seq);
     // TODO ensure sequence start/end is in the same coordinate system and
@@ -479,7 +479,7 @@ public class SiftsClient implements SiftsClientI
       seqCoordSys = CoordinateSys.PDB;
     }
 
-    HashSet<String> dbRefAccessionIdsString = new HashSet<String>();
+    HashSet<String> dbRefAccessionIdsString = new HashSet<>();
     for (DBRefEntry dbref : seq.getDBRefs())
     {
       dbRefAccessionIdsString.add(dbref.getAccessionId().toLowerCase());
@@ -489,7 +489,7 @@ public class SiftsClient implements SiftsClientI
     curDBRefAccessionIdsString = dbRefAccessionIdsString;
     curSourceDBRef = sourceDBRef.getAccessionId();
 
-    TreeMap<Integer, String> resNumMap = new TreeMap<Integer, String>();
+    TreeMap<Integer, String> resNumMap = new TreeMap<>();
     List<Segment> segments = entity.getSegment();
     SegmentHelperPojo shp = new SegmentHelperPojo(seq, mapping, resNumMap,
             omitNonObserved, nonObservedShiftIndex,pdbeNonObserved);
@@ -668,9 +668,9 @@ public class SiftsClient implements SiftsClientI
         }
         if (!isObserved)
         {
-          ++pdbeNonObservedCount;
+          ++pdbeNonObservedCount; // TODO this value is never used
         }
-        if (seqCoordSys == seqCoordSys.PDB) // FIXME: is seqCoordSys ever PDBe
+        if (seqCoordSys == CoordinateSys.PDB) // FIXME: is seqCoordSys ever PDBe
                                             // ???
         {
           // if the sequence has a primary reference to the PDB, then we are
@@ -850,7 +850,7 @@ public class SiftsClient implements SiftsClientI
   private Set<String> getResidueAnnotaitons(Residue residue,
           ResidueDetailType type)
   {
-    HashSet<String> foundAnnotations = new HashSet<String>();
+    HashSet<String> foundAnnotations = new HashSet<>();
     List<ResidueDetail> resDetails = residue.getResidueDetail();
     for (ResidueDetail resDetail : resDetails)
     {
@@ -995,6 +995,10 @@ public class SiftsClient implements SiftsClientI
 
     public int resCount;
 
+    protected SiftsEntitySortPojo()
+    {
+    }
+
     @Override
     public int compareTo(SiftsEntitySortPojo o)
     {
@@ -1044,6 +1048,7 @@ public class SiftsClient implements SiftsClientI
     {
       return pdbeNonObserved;
     }
+
     public SequenceI getSeq()
     {
       return seq;
index 5e2c526..88aaed4 100644 (file)
  */
 package jalview.ws.sifts;
 
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
+
 import java.util.Objects;
 
-public class SiftsSettings
+public class SiftsSettings implements ApplicationSingletonI
 {
-  private static boolean mapWithSifts = false;
 
-  private static String siftDownloadDirectory;
+  /**
+   * public only for testng
+   * 
+   * @return
+   */
+  public static SiftsSettings getInstance()
+  {
+    return (SiftsSettings) ApplicationSingletonProvider
+            .getInstance(SiftsSettings.class);
+  }
+
+  private SiftsSettings()
+  {
+    // singleton; use getInstance()
+  }
+
+  private boolean mapWithSifts = false;
+
+  private String siftDownloadDirectory;
 
-  private static int cacheThresholdInDays;
+  private int cacheThresholdInDays;
 
-  private static int failSafePIDThreshold;
+  private int failSafePIDThreshold;
 
   public static boolean isMapWithSifts()
   {
-    return mapWithSifts;
+    return getInstance().mapWithSifts;
   }
 
   public static void setMapWithSifts(boolean mapWithSifts)
   {
-    SiftsSettings.mapWithSifts = mapWithSifts;
+    getInstance().mapWithSifts = mapWithSifts;
   }
 
   public static String getSiftDownloadDirectory()
   {
-    return siftDownloadDirectory;
+    return getInstance().siftDownloadDirectory;
   }
 
   public static void setSiftDownloadDirectory(String siftDownloadDirectory)
   {
-    SiftsSettings.siftDownloadDirectory = siftDownloadDirectory;
+    getInstance().siftDownloadDirectory = siftDownloadDirectory;
   }
 
   public static int getCacheThresholdInDays()
   {
-    return cacheThresholdInDays;
+    return getInstance().cacheThresholdInDays;
   }
 
   public static void setCacheThresholdInDays(String cacheThresholdInDays)
   {
     Objects.requireNonNull(cacheThresholdInDays);
-    SiftsSettings.cacheThresholdInDays = Integer
+    getInstance().cacheThresholdInDays = Integer
             .valueOf(cacheThresholdInDays);
   }
 
   public static int getFailSafePIDThreshold()
   {
-    return failSafePIDThreshold;
+    return getInstance().failSafePIDThreshold;
   }
 
   public static void setFailSafePIDThreshold(String failSafePIDThreshold)
   {
     Objects.requireNonNull(failSafePIDThreshold);
-    SiftsSettings.failSafePIDThreshold = Integer
+    getInstance().failSafePIDThreshold = Integer
             .valueOf(failSafePIDThreshold);
   }
 }
diff --git a/src/jalview/xml/binding/jalview/JalviewModelType.java b/src/jalview/xml/binding/jalview/JalviewModelType.java
deleted file mode 100644 (file)
index f084bc3..0000000
+++ /dev/null
@@ -1,5090 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2018.09.18 at 01:33:02 PM BST 
-//
-
-
-package jalview.xml.binding.jalview;
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlID;
-import javax.xml.bind.annotation.XmlSchemaType;
-import javax.xml.bind.annotation.XmlType;
-import javax.xml.bind.annotation.XmlValue;
-import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-import javax.xml.datatype.XMLGregorianCalendar;
-
-
-/**
- * <p>Java class for JalviewModelType complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="JalviewModelType">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;element name="creationDate" type="{http://www.w3.org/2001/XMLSchema}dateTime"/>
- *         &lt;element name="version" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *         &lt;element name="vamsasModel" type="{www.vamsas.ac.uk/jalview/version2}VAMSAS"/>
- *         &lt;sequence>
- *           &lt;element name="JSeq" maxOccurs="unbounded" minOccurs="0">
- *             &lt;complexType>
- *               &lt;complexContent>
- *                 &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *                   &lt;sequence>
- *                     &lt;element name="features" type="{www.jalview.org}feature" maxOccurs="unbounded" minOccurs="0"/>
- *                     &lt;element name="pdbids" maxOccurs="unbounded" minOccurs="0">
- *                       &lt;complexType>
- *                         &lt;complexContent>
- *                           &lt;extension base="{www.jalview.org}pdbentry">
- *                             &lt;sequence>
- *                               &lt;element name="structureState" maxOccurs="unbounded" minOccurs="0">
- *                                 &lt;complexType>
- *                                   &lt;simpleContent>
- *                                     &lt;extension base="&lt;http://www.w3.org/2001/XMLSchema>string">
- *                                       &lt;attGroup ref="{www.jalview.org}swingwindow"/>
- *                                       &lt;attribute name="visible" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- *                                       &lt;attribute name="viewId" type="{http://www.w3.org/2001/XMLSchema}string" />
- *                                       &lt;attribute name="alignwithAlignPanel" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- *                                       &lt;attribute name="colourwithAlignPanel" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- *                                       &lt;attribute name="colourByJmol" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- *                                       &lt;attribute name="type" type="{http://www.w3.org/2001/XMLSchema}string" />
- *                                     &lt;/extension>
- *                                   &lt;/simpleContent>
- *                                 &lt;/complexType>
- *                               &lt;/element>
- *                             &lt;/sequence>
- *                           &lt;/extension>
- *                         &lt;/complexContent>
- *                       &lt;/complexType>
- *                     &lt;/element>
- *                     &lt;element name="hiddenSequences" type="{http://www.w3.org/2001/XMLSchema}int" maxOccurs="unbounded" minOccurs="0"/>
- *                     &lt;element name="rnaViewer" maxOccurs="unbounded" minOccurs="0">
- *                       &lt;complexType>
- *                         &lt;complexContent>
- *                           &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *                             &lt;sequence>
- *                               &lt;element name="secondaryStructure" maxOccurs="unbounded">
- *                                 &lt;complexType>
- *                                   &lt;complexContent>
- *                                     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *                                       &lt;attribute name="title" type="{http://www.w3.org/2001/XMLSchema}string" />
- *                                       &lt;attribute name="annotationId" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
- *                                       &lt;attribute name="gapped" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- *                                       &lt;attribute name="viewerState" type="{http://www.w3.org/2001/XMLSchema}string" />
- *                                     &lt;/restriction>
- *                                   &lt;/complexContent>
- *                                 &lt;/complexType>
- *                               &lt;/element>
- *                             &lt;/sequence>
- *                             &lt;attGroup ref="{www.jalview.org}swingwindow"/>
- *                             &lt;attribute name="title" type="{http://www.w3.org/2001/XMLSchema}string" />
- *                             &lt;attribute name="viewId" type="{http://www.w3.org/2001/XMLSchema}string" />
- *                             &lt;attribute name="dividerLocation" type="{http://www.w3.org/2001/XMLSchema}int" />
- *                             &lt;attribute name="selectedRna" type="{http://www.w3.org/2001/XMLSchema}int" />
- *                           &lt;/restriction>
- *                         &lt;/complexContent>
- *                       &lt;/complexType>
- *                     &lt;/element>
- *                   &lt;/sequence>
- *                   &lt;attribute name="colour" type="{http://www.w3.org/2001/XMLSchema}int" />
- *                   &lt;attribute name="start" use="required" type="{http://www.w3.org/2001/XMLSchema}int" />
- *                   &lt;attribute name="end" use="required" type="{http://www.w3.org/2001/XMLSchema}int" />
- *                   &lt;attribute name="id" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
- *                   &lt;attribute name="hidden" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- *                   &lt;attribute name="viewreference" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- *                 &lt;/restriction>
- *               &lt;/complexContent>
- *             &lt;/complexType>
- *           &lt;/element>
- *           &lt;element name="JGroup" maxOccurs="unbounded" minOccurs="0">
- *             &lt;complexType>
- *               &lt;complexContent>
- *                 &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *                   &lt;sequence>
- *                     &lt;element name="seq" type="{http://www.w3.org/2001/XMLSchema}string" maxOccurs="unbounded"/>
- *                     &lt;element name="annotationColours" type="{www.jalview.org}AnnotationColourScheme" minOccurs="0"/>
- *                   &lt;/sequence>
- *                   &lt;attribute name="start" type="{http://www.w3.org/2001/XMLSchema}int" />
- *                   &lt;attribute name="end" type="{http://www.w3.org/2001/XMLSchema}int" />
- *                   &lt;attribute name="name" type="{http://www.w3.org/2001/XMLSchema}string" />
- *                   &lt;attribute name="colour" type="{http://www.w3.org/2001/XMLSchema}string" />
- *                   &lt;attribute name="consThreshold" type="{http://www.w3.org/2001/XMLSchema}int" />
- *                   &lt;attribute name="pidThreshold" type="{http://www.w3.org/2001/XMLSchema}int" />
- *                   &lt;attribute name="outlineColour" type="{http://www.w3.org/2001/XMLSchema}int" />
- *                   &lt;attribute name="displayBoxes" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- *                   &lt;attribute name="displayText" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- *                   &lt;attribute name="colourText" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- *                   &lt;attribute name="textCol1" type="{http://www.w3.org/2001/XMLSchema}int" />
- *                   &lt;attribute name="textCol2" type="{http://www.w3.org/2001/XMLSchema}int" />
- *                   &lt;attribute name="textColThreshold" type="{http://www.w3.org/2001/XMLSchema}int" />
- *                   &lt;attribute name="showUnconserved" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- *                   &lt;attribute name="ignoreGapsinConsensus" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- *                   &lt;attribute name="showConsensusHistogram" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- *                   &lt;attribute name="showSequenceLogo" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- *                   &lt;attribute name="normaliseSequenceLogo" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- *                   &lt;attribute name="id" type="{http://www.w3.org/2001/XMLSchema}string" />
- *                 &lt;/restriction>
- *               &lt;/complexContent>
- *             &lt;/complexType>
- *           &lt;/element>
- *           &lt;element name="Viewport" maxOccurs="unbounded" minOccurs="0">
- *             &lt;complexType>
- *               &lt;complexContent>
- *                 &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *                   &lt;sequence>
- *                     &lt;element name="AnnotationColours" type="{www.jalview.org}AnnotationColourScheme" minOccurs="0"/>
- *                     &lt;element name="hiddenColumns" maxOccurs="unbounded" minOccurs="0">
- *                       &lt;complexType>
- *                         &lt;complexContent>
- *                           &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *                             &lt;attribute name="start" type="{http://www.w3.org/2001/XMLSchema}int" />
- *                             &lt;attribute name="end" type="{http://www.w3.org/2001/XMLSchema}int" />
- *                           &lt;/restriction>
- *                         &lt;/complexContent>
- *                       &lt;/complexType>
- *                     &lt;/element>
- *                     &lt;element name="calcIdParam" maxOccurs="unbounded" minOccurs="0">
- *                       &lt;complexType>
- *                         &lt;complexContent>
- *                           &lt;extension base="{www.jalview.org/xml/wsparamset}WebServiceParameterSet">
- *                             &lt;attribute name="calcId" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
- *                             &lt;attribute name="needsUpdate" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- *                             &lt;attribute name="autoUpdate" use="required" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- *                           &lt;/extension>
- *                         &lt;/complexContent>
- *                       &lt;/complexType>
- *                     &lt;/element>
- *                   &lt;/sequence>
- *                   &lt;attGroup ref="{www.jalview.org}swingwindow"/>
- *                   &lt;attribute name="conservationSelected" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- *                   &lt;attribute name="pidSelected" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- *                   &lt;attribute name="bgColour" type="{http://www.w3.org/2001/XMLSchema}string" />
- *                   &lt;attribute name="consThreshold" type="{http://www.w3.org/2001/XMLSchema}int" />
- *                   &lt;attribute name="pidThreshold" type="{http://www.w3.org/2001/XMLSchema}int" />
- *                   &lt;attribute name="title" type="{http://www.w3.org/2001/XMLSchema}string" />
- *                   &lt;attribute name="showFullId" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- *                   &lt;attribute name="rightAlignIds" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- *                   &lt;attribute name="showText" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- *                   &lt;attribute name="showColourText" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- *                   &lt;attribute name="showUnconserved" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- *                   &lt;attribute name="showBoxes" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- *                   &lt;attribute name="wrapAlignment" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- *                   &lt;attribute name="renderGaps" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- *                   &lt;attribute name="showSequenceFeatures" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- *                   &lt;attribute name="showNPfeatureTooltip" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- *                   &lt;attribute name="showDbRefTooltip" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- *                   &lt;attribute name="followHighlight" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- *                   &lt;attribute name="followSelection" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- *                   &lt;attribute name="showAnnotation" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- *                   &lt;attribute name="centreColumnLabels" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- *                   &lt;attribute name="showGroupConservation" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- *                   &lt;attribute name="showGroupConsensus" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- *                   &lt;attribute name="showConsensusHistogram" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- *                   &lt;attribute name="showSequenceLogo" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- *                   &lt;attribute name="normaliseSequenceLogo" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- *                   &lt;attribute name="ignoreGapsinConsensus" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- *                   &lt;attribute name="startRes" type="{http://www.w3.org/2001/XMLSchema}int" />
- *                   &lt;attribute name="startSeq" type="{http://www.w3.org/2001/XMLSchema}int" />
- *                   &lt;attribute name="fontName" type="{http://www.w3.org/2001/XMLSchema}string" />
- *                   &lt;attribute name="fontSize" type="{http://www.w3.org/2001/XMLSchema}int" />
- *                   &lt;attribute name="fontStyle" type="{http://www.w3.org/2001/XMLSchema}int" />
- *                   &lt;attribute name="scaleProteinAsCdna" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- *                   &lt;attribute name="viewName" type="{http://www.w3.org/2001/XMLSchema}string" />
- *                   &lt;attribute name="sequenceSetId" type="{http://www.w3.org/2001/XMLSchema}string" />
- *                   &lt;attribute name="gatheredViews" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- *                   &lt;attribute name="textCol1" type="{http://www.w3.org/2001/XMLSchema}int" />
- *                   &lt;attribute name="textCol2" type="{http://www.w3.org/2001/XMLSchema}int" />
- *                   &lt;attribute name="textColThreshold" type="{http://www.w3.org/2001/XMLSchema}int" />
- *                   &lt;attribute name="id" type="{http://www.w3.org/2001/XMLSchema}ID" />
- *                   &lt;attribute name="complementId" type="{http://www.w3.org/2001/XMLSchema}string" />
- *                 &lt;/restriction>
- *               &lt;/complexContent>
- *             &lt;/complexType>
- *           &lt;/element>
- *           &lt;element name="UserColours" maxOccurs="unbounded" minOccurs="0">
- *             &lt;complexType>
- *               &lt;complexContent>
- *                 &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *                   &lt;sequence>
- *                     &lt;element name="UserColourScheme" type="{www.jalview.org/colours}JalviewUserColours"/>
- *                   &lt;/sequence>
- *                   &lt;attribute name="id" type="{http://www.w3.org/2001/XMLSchema}string" />
- *                 &lt;/restriction>
- *               &lt;/complexContent>
- *             &lt;/complexType>
- *           &lt;/element>
- *           &lt;element name="tree" maxOccurs="unbounded" minOccurs="0">
- *             &lt;complexType>
- *               &lt;complexContent>
- *                 &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *                   &lt;sequence minOccurs="0">
- *                     &lt;element name="title" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *                     &lt;element name="newick" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *                   &lt;/sequence>
- *                   &lt;attGroup ref="{www.jalview.org}swingwindow"/>
- *                   &lt;attribute name="fontName" type="{http://www.w3.org/2001/XMLSchema}string" />
- *                   &lt;attribute name="fontSize" type="{http://www.w3.org/2001/XMLSchema}int" />
- *                   &lt;attribute name="fontStyle" type="{http://www.w3.org/2001/XMLSchema}int" />
- *                   &lt;attribute name="threshold" type="{http://www.w3.org/2001/XMLSchema}float" />
- *                   &lt;attribute name="showBootstrap" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- *                   &lt;attribute name="showDistances" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- *                   &lt;attribute name="markUnlinked" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- *                   &lt;attribute name="fitToWindow" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- *                   &lt;attribute name="currentTree" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- *                   &lt;attribute name="id" type="{http://www.w3.org/2001/XMLSchema}ID" />
- *                 &lt;/restriction>
- *               &lt;/complexContent>
- *             &lt;/complexType>
- *           &lt;/element>
- *           &lt;element name="FeatureSettings" minOccurs="0">
- *             &lt;complexType>
- *               &lt;complexContent>
- *                 &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *                   &lt;sequence>
- *                     &lt;element name="setting" maxOccurs="unbounded" minOccurs="0">
- *                       &lt;complexType>
- *                         &lt;complexContent>
- *                           &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *                             &lt;sequence>
- *                               &lt;element name="attributeName" type="{http://www.w3.org/2001/XMLSchema}string" maxOccurs="2" minOccurs="0"/>
- *                               &lt;element name="matcherSet" type="{www.jalview.org/colours}FeatureMatcherSet" minOccurs="0"/>
- *                             &lt;/sequence>
- *                             &lt;attribute name="type" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
- *                             &lt;attribute name="colour" use="required" type="{http://www.w3.org/2001/XMLSchema}int" />
- *                             &lt;attribute name="display" use="required" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- *                             &lt;attribute name="order" type="{http://www.w3.org/2001/XMLSchema}float" />
- *                             &lt;attribute name="mincolour" type="{http://www.w3.org/2001/XMLSchema}int" />
- *                             &lt;attribute name="noValueColour" type="{www.jalview.org/colours}NoValueColour" default="Min" />
- *                             &lt;attribute name="threshold" type="{http://www.w3.org/2001/XMLSchema}float" />
- *                             &lt;attribute name="threshstate" type="{http://www.w3.org/2001/XMLSchema}int" />
- *                             &lt;attribute name="max" type="{http://www.w3.org/2001/XMLSchema}float" />
- *                             &lt;attribute name="min" type="{http://www.w3.org/2001/XMLSchema}float" />
- *                             &lt;attribute name="colourByLabel" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- *                             &lt;attribute name="autoScale" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- *                           &lt;/restriction>
- *                         &lt;/complexContent>
- *                       &lt;/complexType>
- *                     &lt;/element>
- *                     &lt;element name="group" maxOccurs="unbounded" minOccurs="0">
- *                       &lt;complexType>
- *                         &lt;complexContent>
- *                           &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *                             &lt;attribute name="name" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
- *                             &lt;attribute name="display" use="required" type="{http://www.w3.org/2001/XMLSchema}boolean" />
- *                           &lt;/restriction>
- *                         &lt;/complexContent>
- *                       &lt;/complexType>
- *                     &lt;/element>
- *                   &lt;/sequence>
- *                 &lt;/restriction>
- *               &lt;/complexContent>
- *             &lt;/complexType>
- *           &lt;/element>
- *         &lt;/sequence>
- *       &lt;/sequence>
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "JalviewModelType", namespace = "www.jalview.org", propOrder = {
-    "creationDate",
-    "version",
-    "vamsasModel",
-    "jSeq",
-    "jGroup",
-    "viewport",
-    "userColours",
-    "tree",
-    "featureSettings"
-})
-public class JalviewModelType {
-
-    @XmlElement(required = true)
-    @XmlSchemaType(name = "dateTime")
-    protected XMLGregorianCalendar creationDate;
-    @XmlElement(required = true)
-    protected String version;
-    @XmlElement(required = true)
-    protected VAMSAS vamsasModel;
-    @XmlElement(name = "JSeq")
-    protected List<JalviewModelType.JSeq> jSeq;
-    @XmlElement(name = "JGroup")
-    protected List<JalviewModelType.JGroup> jGroup;
-    @XmlElement(name = "Viewport")
-    protected List<JalviewModelType.Viewport> viewport;
-    @XmlElement(name = "UserColours")
-    protected List<JalviewModelType.UserColours> userColours;
-    protected List<JalviewModelType.Tree> tree;
-    @XmlElement(name = "FeatureSettings")
-    protected JalviewModelType.FeatureSettings featureSettings;
-
-    /**
-     * Gets the value of the creationDate property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link XMLGregorianCalendar }
-     *     
-     */
-    public XMLGregorianCalendar getCreationDate() {
-        return creationDate;
-    }
-
-    /**
-     * Sets the value of the creationDate property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link XMLGregorianCalendar }
-     *     
-     */
-    public void setCreationDate(XMLGregorianCalendar value) {
-        this.creationDate = value;
-    }
-
-    /**
-     * Gets the value of the version property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getVersion() {
-        return version;
-    }
-
-    /**
-     * Sets the value of the version property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setVersion(String value) {
-        this.version = value;
-    }
-
-    /**
-     * Gets the value of the vamsasModel property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link VAMSAS }
-     *     
-     */
-    public VAMSAS getVamsasModel() {
-        return vamsasModel;
-    }
-
-    /**
-     * Sets the value of the vamsasModel property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link VAMSAS }
-     *     
-     */
-    public void setVamsasModel(VAMSAS value) {
-        this.vamsasModel = value;
-    }
-
-    /**
-     * Gets the value of the jSeq property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the jSeq property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getJSeq().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link JalviewModelType.JSeq }
-     * 
-     * 
-     */
-    public List<JalviewModelType.JSeq> getJSeq() {
-        if (jSeq == null) {
-            jSeq = new ArrayList<JalviewModelType.JSeq>();
-        }
-        return this.jSeq;
-    }
-
-    /**
-     * Gets the value of the jGroup property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the jGroup property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getJGroup().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link JalviewModelType.JGroup }
-     * 
-     * 
-     */
-    public List<JalviewModelType.JGroup> getJGroup() {
-        if (jGroup == null) {
-            jGroup = new ArrayList<JalviewModelType.JGroup>();
-        }
-        return this.jGroup;
-    }
-
-    /**
-     * Gets the value of the viewport property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the viewport property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getViewport().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link JalviewModelType.Viewport }
-     * 
-     * 
-     */
-    public List<JalviewModelType.Viewport> getViewport() {
-        if (viewport == null) {
-            viewport = new ArrayList<JalviewModelType.Viewport>();
-        }
-        return this.viewport;
-    }
-
-    /**
-     * Gets the value of the userColours property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the userColours property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getUserColours().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link JalviewModelType.UserColours }
-     * 
-     * 
-     */
-    public List<JalviewModelType.UserColours> getUserColours() {
-        if (userColours == null) {
-            userColours = new ArrayList<JalviewModelType.UserColours>();
-        }
-        return this.userColours;
-    }
-
-    /**
-     * Gets the value of the tree property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the tree property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getTree().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link JalviewModelType.Tree }
-     * 
-     * 
-     */
-    public List<JalviewModelType.Tree> getTree() {
-        if (tree == null) {
-            tree = new ArrayList<JalviewModelType.Tree>();
-        }
-        return this.tree;
-    }
-
-    /**
-     * Gets the value of the featureSettings property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link JalviewModelType.FeatureSettings }
-     *     
-     */
-    public JalviewModelType.FeatureSettings getFeatureSettings() {
-        return featureSettings;
-    }
-
-    /**
-     * Sets the value of the featureSettings property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link JalviewModelType.FeatureSettings }
-     *     
-     */
-    public void setFeatureSettings(JalviewModelType.FeatureSettings value) {
-        this.featureSettings = value;
-    }
-
-
-    /**
-     * <p>Java class for anonymous complex type.
-     * 
-     * <p>The following schema fragment specifies the expected content contained within this class.
-     * 
-     * <pre>
-     * &lt;complexType>
-     *   &lt;complexContent>
-     *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
-     *       &lt;sequence>
-     *         &lt;element name="setting" maxOccurs="unbounded" minOccurs="0">
-     *           &lt;complexType>
-     *             &lt;complexContent>
-     *               &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
-     *                 &lt;sequence>
-     *                   &lt;element name="attributeName" type="{http://www.w3.org/2001/XMLSchema}string" maxOccurs="2" minOccurs="0"/>
-     *                   &lt;element name="matcherSet" type="{www.jalview.org/colours}FeatureMatcherSet" minOccurs="0"/>
-     *                 &lt;/sequence>
-     *                 &lt;attribute name="type" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
-     *                 &lt;attribute name="colour" use="required" type="{http://www.w3.org/2001/XMLSchema}int" />
-     *                 &lt;attribute name="display" use="required" type="{http://www.w3.org/2001/XMLSchema}boolean" />
-     *                 &lt;attribute name="order" type="{http://www.w3.org/2001/XMLSchema}float" />
-     *                 &lt;attribute name="mincolour" type="{http://www.w3.org/2001/XMLSchema}int" />
-     *                 &lt;attribute name="noValueColour" type="{www.jalview.org/colours}NoValueColour" default="Min" />
-     *                 &lt;attribute name="threshold" type="{http://www.w3.org/2001/XMLSchema}float" />
-     *                 &lt;attribute name="threshstate" type="{http://www.w3.org/2001/XMLSchema}int" />
-     *                 &lt;attribute name="max" type="{http://www.w3.org/2001/XMLSchema}float" />
-     *                 &lt;attribute name="min" type="{http://www.w3.org/2001/XMLSchema}float" />
-     *                 &lt;attribute name="colourByLabel" type="{http://www.w3.org/2001/XMLSchema}boolean" />
-     *                 &lt;attribute name="autoScale" type="{http://www.w3.org/2001/XMLSchema}boolean" />
-     *               &lt;/restriction>
-     *             &lt;/complexContent>
-     *           &lt;/complexType>
-     *         &lt;/element>
-     *         &lt;element name="group" maxOccurs="unbounded" minOccurs="0">
-     *           &lt;complexType>
-     *             &lt;complexContent>
-     *               &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
-     *                 &lt;attribute name="name" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
-     *                 &lt;attribute name="display" use="required" type="{http://www.w3.org/2001/XMLSchema}boolean" />
-     *               &lt;/restriction>
-     *             &lt;/complexContent>
-     *           &lt;/complexType>
-     *         &lt;/element>
-     *       &lt;/sequence>
-     *     &lt;/restriction>
-     *   &lt;/complexContent>
-     * &lt;/complexType>
-     * </pre>
-     * 
-     * 
-     */
-    @XmlAccessorType(XmlAccessType.FIELD)
-    @XmlType(name = "", propOrder = {
-        "setting",
-        "group"
-    })
-    public static class FeatureSettings {
-
-        @XmlElement(namespace = "www.jalview.org")
-        protected List<JalviewModelType.FeatureSettings.Setting> setting;
-        @XmlElement(namespace = "www.jalview.org")
-        protected List<JalviewModelType.FeatureSettings.Group> group;
-
-        /**
-         * Gets the value of the setting property.
-         * 
-         * <p>
-         * This accessor method returns a reference to the live list,
-         * not a snapshot. Therefore any modification you make to the
-         * returned list will be present inside the JAXB object.
-         * This is why there is not a <CODE>set</CODE> method for the setting property.
-         * 
-         * <p>
-         * For example, to add a new item, do as follows:
-         * <pre>
-         *    getSetting().add(newItem);
-         * </pre>
-         * 
-         * 
-         * <p>
-         * Objects of the following type(s) are allowed in the list
-         * {@link JalviewModelType.FeatureSettings.Setting }
-         * 
-         * 
-         */
-        public List<JalviewModelType.FeatureSettings.Setting> getSetting() {
-            if (setting == null) {
-                setting = new ArrayList<JalviewModelType.FeatureSettings.Setting>();
-            }
-            return this.setting;
-        }
-
-        /**
-         * Gets the value of the group property.
-         * 
-         * <p>
-         * This accessor method returns a reference to the live list,
-         * not a snapshot. Therefore any modification you make to the
-         * returned list will be present inside the JAXB object.
-         * This is why there is not a <CODE>set</CODE> method for the group property.
-         * 
-         * <p>
-         * For example, to add a new item, do as follows:
-         * <pre>
-         *    getGroup().add(newItem);
-         * </pre>
-         * 
-         * 
-         * <p>
-         * Objects of the following type(s) are allowed in the list
-         * {@link JalviewModelType.FeatureSettings.Group }
-         * 
-         * 
-         */
-        public List<JalviewModelType.FeatureSettings.Group> getGroup() {
-            if (group == null) {
-                group = new ArrayList<JalviewModelType.FeatureSettings.Group>();
-            }
-            return this.group;
-        }
-
-
-        /**
-         * <p>Java class for anonymous complex type.
-         * 
-         * <p>The following schema fragment specifies the expected content contained within this class.
-         * 
-         * <pre>
-         * &lt;complexType>
-         *   &lt;complexContent>
-         *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
-         *       &lt;attribute name="name" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
-         *       &lt;attribute name="display" use="required" type="{http://www.w3.org/2001/XMLSchema}boolean" />
-         *     &lt;/restriction>
-         *   &lt;/complexContent>
-         * &lt;/complexType>
-         * </pre>
-         * 
-         * 
-         */
-        @XmlAccessorType(XmlAccessType.FIELD)
-        @XmlType(name = "")
-        public static class Group {
-
-            @XmlAttribute(name = "name", required = true)
-            protected String name;
-            @XmlAttribute(name = "display", required = true)
-            protected boolean display;
-
-            /**
-             * Gets the value of the name property.
-             * 
-             * @return
-             *     possible object is
-             *     {@link String }
-             *     
-             */
-            public String getName() {
-                return name;
-            }
-
-            /**
-             * Sets the value of the name property.
-             * 
-             * @param value
-             *     allowed object is
-             *     {@link String }
-             *     
-             */
-            public void setName(String value) {
-                this.name = value;
-            }
-
-            /**
-             * Gets the value of the display property.
-             * 
-             */
-            public boolean isDisplay() {
-                return display;
-            }
-
-            /**
-             * Sets the value of the display property.
-             * 
-             */
-            public void setDisplay(boolean value) {
-                this.display = value;
-            }
-
-        }
-
-
-        /**
-         * <p>Java class for anonymous complex type.
-         * 
-         * <p>The following schema fragment specifies the expected content contained within this class.
-         * 
-         * <pre>
-         * &lt;complexType>
-         *   &lt;complexContent>
-         *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
-         *       &lt;sequence>
-         *         &lt;element name="attributeName" type="{http://www.w3.org/2001/XMLSchema}string" maxOccurs="2" minOccurs="0"/>
-         *         &lt;element name="matcherSet" type="{www.jalview.org/colours}FeatureMatcherSet" minOccurs="0"/>
-         *       &lt;/sequence>
-         *       &lt;attribute name="type" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
-         *       &lt;attribute name="colour" use="required" type="{http://www.w3.org/2001/XMLSchema}int" />
-         *       &lt;attribute name="display" use="required" type="{http://www.w3.org/2001/XMLSchema}boolean" />
-         *       &lt;attribute name="order" type="{http://www.w3.org/2001/XMLSchema}float" />
-         *       &lt;attribute name="mincolour" type="{http://www.w3.org/2001/XMLSchema}int" />
-         *       &lt;attribute name="noValueColour" type="{www.jalview.org/colours}NoValueColour" default="Min" />
-         *       &lt;attribute name="threshold" type="{http://www.w3.org/2001/XMLSchema}float" />
-         *       &lt;attribute name="threshstate" type="{http://www.w3.org/2001/XMLSchema}int" />
-         *       &lt;attribute name="max" type="{http://www.w3.org/2001/XMLSchema}float" />
-         *       &lt;attribute name="min" type="{http://www.w3.org/2001/XMLSchema}float" />
-         *       &lt;attribute name="colourByLabel" type="{http://www.w3.org/2001/XMLSchema}boolean" />
-         *       &lt;attribute name="autoScale" type="{http://www.w3.org/2001/XMLSchema}boolean" />
-         *     &lt;/restriction>
-         *   &lt;/complexContent>
-         * &lt;/complexType>
-         * </pre>
-         * 
-         * 
-         */
-        @XmlAccessorType(XmlAccessType.FIELD)
-        @XmlType(name = "", propOrder = {
-            "attributeName",
-            "matcherSet"
-        })
-        public static class Setting {
-
-            @XmlElement(namespace = "www.jalview.org")
-            protected List<String> attributeName;
-            @XmlElement(namespace = "www.jalview.org")
-            protected FeatureMatcherSet matcherSet;
-            @XmlAttribute(name = "type", required = true)
-            protected String type;
-            @XmlAttribute(name = "colour", required = true)
-            protected int colour;
-            @XmlAttribute(name = "display", required = true)
-            protected boolean display;
-            @XmlAttribute(name = "order")
-            protected Float order;
-            @XmlAttribute(name = "mincolour")
-            protected Integer mincolour;
-            @XmlAttribute(name = "noValueColour")
-            protected NoValueColour noValueColour;
-            @XmlAttribute(name = "threshold")
-            protected Float threshold;
-            @XmlAttribute(name = "threshstate")
-            protected Integer threshstate;
-            @XmlAttribute(name = "max")
-            protected Float max;
-            @XmlAttribute(name = "min")
-            protected Float min;
-            @XmlAttribute(name = "colourByLabel")
-            protected Boolean colourByLabel;
-            @XmlAttribute(name = "autoScale")
-            protected Boolean autoScale;
-
-            /**
-             * Gets the value of the attributeName property.
-             * 
-             * <p>
-             * This accessor method returns a reference to the live list,
-             * not a snapshot. Therefore any modification you make to the
-             * returned list will be present inside the JAXB object.
-             * This is why there is not a <CODE>set</CODE> method for the attributeName property.
-             * 
-             * <p>
-             * For example, to add a new item, do as follows:
-             * <pre>
-             *    getAttributeName().add(newItem);
-             * </pre>
-             * 
-             * 
-             * <p>
-             * Objects of the following type(s) are allowed in the list
-             * {@link String }
-             * 
-             * 
-             */
-            public List<String> getAttributeName() {
-                if (attributeName == null) {
-                    attributeName = new ArrayList<String>();
-                }
-                return this.attributeName;
-            }
-
-            /**
-             * Gets the value of the matcherSet property.
-             * 
-             * @return
-             *     possible object is
-             *     {@link FeatureMatcherSet }
-             *     
-             */
-            public FeatureMatcherSet getMatcherSet() {
-                return matcherSet;
-            }
-
-            /**
-             * Sets the value of the matcherSet property.
-             * 
-             * @param value
-             *     allowed object is
-             *     {@link FeatureMatcherSet }
-             *     
-             */
-            public void setMatcherSet(FeatureMatcherSet value) {
-                this.matcherSet = value;
-            }
-
-            /**
-             * Gets the value of the type property.
-             * 
-             * @return
-             *     possible object is
-             *     {@link String }
-             *     
-             */
-            public String getType() {
-                return type;
-            }
-
-            /**
-             * Sets the value of the type property.
-             * 
-             * @param value
-             *     allowed object is
-             *     {@link String }
-             *     
-             */
-            public void setType(String value) {
-                this.type = value;
-            }
-
-            /**
-             * Gets the value of the colour property.
-             * 
-             */
-            public int getColour() {
-                return colour;
-            }
-
-            /**
-             * Sets the value of the colour property.
-             * 
-             */
-            public void setColour(int value) {
-                this.colour = value;
-            }
-
-            /**
-             * Gets the value of the display property.
-             * 
-             */
-            public boolean isDisplay() {
-                return display;
-            }
-
-            /**
-             * Sets the value of the display property.
-             * 
-             */
-            public void setDisplay(boolean value) {
-                this.display = value;
-            }
-
-            /**
-             * Gets the value of the order property.
-             * 
-             * @return
-             *     possible object is
-             *     {@link Float }
-             *     
-             */
-            public Float getOrder() {
-                return order;
-            }
-
-            /**
-             * Sets the value of the order property.
-             * 
-             * @param value
-             *     allowed object is
-             *     {@link Float }
-             *     
-             */
-            public void setOrder(Float value) {
-                this.order = value;
-            }
-
-            /**
-             * Gets the value of the mincolour property.
-             * 
-             * @return
-             *     possible object is
-             *     {@link Integer }
-             *     
-             */
-            public Integer getMincolour() {
-                return mincolour;
-            }
-
-            /**
-             * Sets the value of the mincolour property.
-             * 
-             * @param value
-             *     allowed object is
-             *     {@link Integer }
-             *     
-             */
-            public void setMincolour(Integer value) {
-                this.mincolour = value;
-            }
-
-            /**
-             * Gets the value of the noValueColour property.
-             * 
-             * @return
-             *     possible object is
-             *     {@link NoValueColour }
-             *     
-             */
-            public NoValueColour getNoValueColour() {
-                if (noValueColour == null) {
-                    return NoValueColour.MIN;
-                } else {
-                    return noValueColour;
-                }
-            }
-
-            /**
-             * Sets the value of the noValueColour property.
-             * 
-             * @param value
-             *     allowed object is
-             *     {@link NoValueColour }
-             *     
-             */
-            public void setNoValueColour(NoValueColour value) {
-                this.noValueColour = value;
-            }
-
-            /**
-             * Gets the value of the threshold property.
-             * 
-             * @return
-             *     possible object is
-             *     {@link Float }
-             *     
-             */
-            public Float getThreshold() {
-                return threshold;
-            }
-
-            /**
-             * Sets the value of the threshold property.
-             * 
-             * @param value
-             *     allowed object is
-             *     {@link Float }
-             *     
-             */
-            public void setThreshold(Float value) {
-                this.threshold = value;
-            }
-
-            /**
-             * Gets the value of the threshstate property.
-             * 
-             * @return
-             *     possible object is
-             *     {@link Integer }
-             *     
-             */
-            public Integer getThreshstate() {
-                return threshstate;
-            }
-
-            /**
-             * Sets the value of the threshstate property.
-             * 
-             * @param value
-             *     allowed object is
-             *     {@link Integer }
-             *     
-             */
-            public void setThreshstate(Integer value) {
-                this.threshstate = value;
-            }
-
-            /**
-             * Gets the value of the max property.
-             * 
-             * @return
-             *     possible object is
-             *     {@link Float }
-             *     
-             */
-            public Float getMax() {
-                return max;
-            }
-
-            /**
-             * Sets the value of the max property.
-             * 
-             * @param value
-             *     allowed object is
-             *     {@link Float }
-             *     
-             */
-            public void setMax(Float value) {
-                this.max = value;
-            }
-
-            /**
-             * Gets the value of the min property.
-             * 
-             * @return
-             *     possible object is
-             *     {@link Float }
-             *     
-             */
-            public Float getMin() {
-                return min;
-            }
-
-            /**
-             * Sets the value of the min property.
-             * 
-             * @param value
-             *     allowed object is
-             *     {@link Float }
-             *     
-             */
-            public void setMin(Float value) {
-                this.min = value;
-            }
-
-            /**
-             * Gets the value of the colourByLabel property.
-             * 
-             * @return
-             *     possible object is
-             *     {@link Boolean }
-             *     
-             */
-            public Boolean isColourByLabel() {
-                return colourByLabel;
-            }
-
-            /**
-             * Sets the value of the colourByLabel property.
-             * 
-             * @param value
-             *     allowed object is
-             *     {@link Boolean }
-             *     
-             */
-            public void setColourByLabel(Boolean value) {
-                this.colourByLabel = value;
-            }
-
-            /**
-             * Gets the value of the autoScale property.
-             * 
-             * @return
-             *     possible object is
-             *     {@link Boolean }
-             *     
-             */
-            public Boolean isAutoScale() {
-                return autoScale;
-            }
-
-            /**
-             * Sets the value of the autoScale property.
-             * 
-             * @param value
-             *     allowed object is
-             *     {@link Boolean }
-             *     
-             */
-            public void setAutoScale(Boolean value) {
-                this.autoScale = value;
-            }
-
-        }
-
-    }
-
-
-    /**
-     * <p>Java class for anonymous complex type.
-     * 
-     * <p>The following schema fragment specifies the expected content contained within this class.
-     * 
-     * <pre>
-     * &lt;complexType>
-     *   &lt;complexContent>
-     *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
-     *       &lt;sequence>
-     *         &lt;element name="seq" type="{http://www.w3.org/2001/XMLSchema}string" maxOccurs="unbounded"/>
-     *         &lt;element name="annotationColours" type="{www.jalview.org}AnnotationColourScheme" minOccurs="0"/>
-     *       &lt;/sequence>
-     *       &lt;attribute name="start" type="{http://www.w3.org/2001/XMLSchema}int" />
-     *       &lt;attribute name="end" type="{http://www.w3.org/2001/XMLSchema}int" />
-     *       &lt;attribute name="name" type="{http://www.w3.org/2001/XMLSchema}string" />
-     *       &lt;attribute name="colour" type="{http://www.w3.org/2001/XMLSchema}string" />
-     *       &lt;attribute name="consThreshold" type="{http://www.w3.org/2001/XMLSchema}int" />
-     *       &lt;attribute name="pidThreshold" type="{http://www.w3.org/2001/XMLSchema}int" />
-     *       &lt;attribute name="outlineColour" type="{http://www.w3.org/2001/XMLSchema}int" />
-     *       &lt;attribute name="displayBoxes" type="{http://www.w3.org/2001/XMLSchema}boolean" />
-     *       &lt;attribute name="displayText" type="{http://www.w3.org/2001/XMLSchema}boolean" />
-     *       &lt;attribute name="colourText" type="{http://www.w3.org/2001/XMLSchema}boolean" />
-     *       &lt;attribute name="textCol1" type="{http://www.w3.org/2001/XMLSchema}int" />
-     *       &lt;attribute name="textCol2" type="{http://www.w3.org/2001/XMLSchema}int" />
-     *       &lt;attribute name="textColThreshold" type="{http://www.w3.org/2001/XMLSchema}int" />
-     *       &lt;attribute name="showUnconserved" type="{http://www.w3.org/2001/XMLSchema}boolean" />
-     *       &lt;attribute name="ignoreGapsinConsensus" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
-     *       &lt;attribute name="showConsensusHistogram" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
-     *       &lt;attribute name="showSequenceLogo" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
-     *       &lt;attribute name="normaliseSequenceLogo" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
-     *       &lt;attribute name="id" type="{http://www.w3.org/2001/XMLSchema}string" />
-     *     &lt;/restriction>
-     *   &lt;/complexContent>
-     * &lt;/complexType>
-     * </pre>
-     * 
-     * 
-     */
-    @XmlAccessorType(XmlAccessType.FIELD)
-    @XmlType(name = "", propOrder = {
-        "seq",
-        "annotationColours"
-    })
-    public static class JGroup {
-
-        @XmlElement(namespace = "www.jalview.org", required = true)
-        protected List<String> seq;
-        @XmlElement(namespace = "www.jalview.org")
-        protected AnnotationColourScheme annotationColours;
-        @XmlAttribute(name = "start")
-        protected Integer start;
-        @XmlAttribute(name = "end")
-        protected Integer end;
-        @XmlAttribute(name = "name")
-        protected String name;
-        @XmlAttribute(name = "colour")
-        protected String colour;
-        @XmlAttribute(name = "consThreshold")
-        protected Integer consThreshold;
-        @XmlAttribute(name = "pidThreshold")
-        protected Integer pidThreshold;
-        @XmlAttribute(name = "outlineColour")
-        protected Integer outlineColour;
-        @XmlAttribute(name = "displayBoxes")
-        protected Boolean displayBoxes;
-        @XmlAttribute(name = "displayText")
-        protected Boolean displayText;
-        @XmlAttribute(name = "colourText")
-        protected Boolean colourText;
-        @XmlAttribute(name = "textCol1")
-        protected Integer textCol1;
-        @XmlAttribute(name = "textCol2")
-        protected Integer textCol2;
-        @XmlAttribute(name = "textColThreshold")
-        protected Integer textColThreshold;
-        @XmlAttribute(name = "showUnconserved")
-        protected Boolean showUnconserved;
-        @XmlAttribute(name = "ignoreGapsinConsensus")
-        protected Boolean ignoreGapsinConsensus;
-        @XmlAttribute(name = "showConsensusHistogram")
-        protected Boolean showConsensusHistogram;
-        @XmlAttribute(name = "showSequenceLogo")
-        protected Boolean showSequenceLogo;
-        @XmlAttribute(name = "normaliseSequenceLogo")
-        protected Boolean normaliseSequenceLogo;
-        @XmlAttribute(name = "id")
-        protected String id;
-
-        /**
-         * Gets the value of the seq property.
-         * 
-         * <p>
-         * This accessor method returns a reference to the live list,
-         * not a snapshot. Therefore any modification you make to the
-         * returned list will be present inside the JAXB object.
-         * This is why there is not a <CODE>set</CODE> method for the seq property.
-         * 
-         * <p>
-         * For example, to add a new item, do as follows:
-         * <pre>
-         *    getSeq().add(newItem);
-         * </pre>
-         * 
-         * 
-         * <p>
-         * Objects of the following type(s) are allowed in the list
-         * {@link String }
-         * 
-         * 
-         */
-        public List<String> getSeq() {
-            if (seq == null) {
-                seq = new ArrayList<String>();
-            }
-            return this.seq;
-        }
-
-        /**
-         * Gets the value of the annotationColours property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link AnnotationColourScheme }
-         *     
-         */
-        public AnnotationColourScheme getAnnotationColours() {
-            return annotationColours;
-        }
-
-        /**
-         * Sets the value of the annotationColours property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link AnnotationColourScheme }
-         *     
-         */
-        public void setAnnotationColours(AnnotationColourScheme value) {
-            this.annotationColours = value;
-        }
-
-        /**
-         * Gets the value of the start property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Integer }
-         *     
-         */
-        public Integer getStart() {
-            return start;
-        }
-
-        /**
-         * Sets the value of the start property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Integer }
-         *     
-         */
-        public void setStart(Integer value) {
-            this.start = value;
-        }
-
-        /**
-         * Gets the value of the end property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Integer }
-         *     
-         */
-        public Integer getEnd() {
-            return end;
-        }
-
-        /**
-         * Sets the value of the end property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Integer }
-         *     
-         */
-        public void setEnd(Integer value) {
-            this.end = value;
-        }
-
-        /**
-         * Gets the value of the name property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link String }
-         *     
-         */
-        public String getName() {
-            return name;
-        }
-
-        /**
-         * Sets the value of the name property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link String }
-         *     
-         */
-        public void setName(String value) {
-            this.name = value;
-        }
-
-        /**
-         * Gets the value of the colour property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link String }
-         *     
-         */
-        public String getColour() {
-            return colour;
-        }
-
-        /**
-         * Sets the value of the colour property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link String }
-         *     
-         */
-        public void setColour(String value) {
-            this.colour = value;
-        }
-
-        /**
-         * Gets the value of the consThreshold property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Integer }
-         *     
-         */
-        public Integer getConsThreshold() {
-            return consThreshold;
-        }
-
-        /**
-         * Sets the value of the consThreshold property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Integer }
-         *     
-         */
-        public void setConsThreshold(Integer value) {
-            this.consThreshold = value;
-        }
-
-        /**
-         * Gets the value of the pidThreshold property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Integer }
-         *     
-         */
-        public Integer getPidThreshold() {
-            return pidThreshold;
-        }
-
-        /**
-         * Sets the value of the pidThreshold property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Integer }
-         *     
-         */
-        public void setPidThreshold(Integer value) {
-            this.pidThreshold = value;
-        }
-
-        /**
-         * Gets the value of the outlineColour property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Integer }
-         *     
-         */
-        public Integer getOutlineColour() {
-            return outlineColour;
-        }
-
-        /**
-         * Sets the value of the outlineColour property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Integer }
-         *     
-         */
-        public void setOutlineColour(Integer value) {
-            this.outlineColour = value;
-        }
-
-        /**
-         * Gets the value of the displayBoxes property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Boolean }
-         *     
-         */
-        public Boolean isDisplayBoxes() {
-            return displayBoxes;
-        }
-
-        /**
-         * Sets the value of the displayBoxes property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Boolean }
-         *     
-         */
-        public void setDisplayBoxes(Boolean value) {
-            this.displayBoxes = value;
-        }
-
-        /**
-         * Gets the value of the displayText property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Boolean }
-         *     
-         */
-        public Boolean isDisplayText() {
-            return displayText;
-        }
-
-        /**
-         * Sets the value of the displayText property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Boolean }
-         *     
-         */
-        public void setDisplayText(Boolean value) {
-            this.displayText = value;
-        }
-
-        /**
-         * Gets the value of the colourText property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Boolean }
-         *     
-         */
-        public Boolean isColourText() {
-            return colourText;
-        }
-
-        /**
-         * Sets the value of the colourText property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Boolean }
-         *     
-         */
-        public void setColourText(Boolean value) {
-            this.colourText = value;
-        }
-
-        /**
-         * Gets the value of the textCol1 property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Integer }
-         *     
-         */
-        public Integer getTextCol1() {
-            return textCol1;
-        }
-
-        /**
-         * Sets the value of the textCol1 property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Integer }
-         *     
-         */
-        public void setTextCol1(Integer value) {
-            this.textCol1 = value;
-        }
-
-        /**
-         * Gets the value of the textCol2 property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Integer }
-         *     
-         */
-        public Integer getTextCol2() {
-            return textCol2;
-        }
-
-        /**
-         * Sets the value of the textCol2 property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Integer }
-         *     
-         */
-        public void setTextCol2(Integer value) {
-            this.textCol2 = value;
-        }
-
-        /**
-         * Gets the value of the textColThreshold property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Integer }
-         *     
-         */
-        public Integer getTextColThreshold() {
-            return textColThreshold;
-        }
-
-        /**
-         * Sets the value of the textColThreshold property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Integer }
-         *     
-         */
-        public void setTextColThreshold(Integer value) {
-            this.textColThreshold = value;
-        }
-
-        /**
-         * Gets the value of the showUnconserved property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Boolean }
-         *     
-         */
-        public Boolean isShowUnconserved() {
-            return showUnconserved;
-        }
-
-        /**
-         * Sets the value of the showUnconserved property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Boolean }
-         *     
-         */
-        public void setShowUnconserved(Boolean value) {
-            this.showUnconserved = value;
-        }
-
-        /**
-         * Gets the value of the ignoreGapsinConsensus property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Boolean }
-         *     
-         */
-        public boolean isIgnoreGapsinConsensus() {
-            if (ignoreGapsinConsensus == null) {
-                return true;
-            } else {
-                return ignoreGapsinConsensus;
-            }
-        }
-
-        /**
-         * Sets the value of the ignoreGapsinConsensus property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Boolean }
-         *     
-         */
-        public void setIgnoreGapsinConsensus(Boolean value) {
-            this.ignoreGapsinConsensus = value;
-        }
-
-        /**
-         * Gets the value of the showConsensusHistogram property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Boolean }
-         *     
-         */
-        public boolean isShowConsensusHistogram() {
-            if (showConsensusHistogram == null) {
-                return true;
-            } else {
-                return showConsensusHistogram;
-            }
-        }
-
-        /**
-         * Sets the value of the showConsensusHistogram property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Boolean }
-         *     
-         */
-        public void setShowConsensusHistogram(Boolean value) {
-            this.showConsensusHistogram = value;
-        }
-
-        /**
-         * Gets the value of the showSequenceLogo property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Boolean }
-         *     
-         */
-        public boolean isShowSequenceLogo() {
-            if (showSequenceLogo == null) {
-                return false;
-            } else {
-                return showSequenceLogo;
-            }
-        }
-
-        /**
-         * Sets the value of the showSequenceLogo property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Boolean }
-         *     
-         */
-        public void setShowSequenceLogo(Boolean value) {
-            this.showSequenceLogo = value;
-        }
-
-        /**
-         * Gets the value of the normaliseSequenceLogo property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Boolean }
-         *     
-         */
-        public boolean isNormaliseSequenceLogo() {
-            if (normaliseSequenceLogo == null) {
-                return false;
-            } else {
-                return normaliseSequenceLogo;
-            }
-        }
-
-        /**
-         * Sets the value of the normaliseSequenceLogo property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Boolean }
-         *     
-         */
-        public void setNormaliseSequenceLogo(Boolean value) {
-            this.normaliseSequenceLogo = value;
-        }
-
-        /**
-         * Gets the value of the id property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link String }
-         *     
-         */
-        public String getId() {
-            return id;
-        }
-
-        /**
-         * Sets the value of the id property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link String }
-         *     
-         */
-        public void setId(String value) {
-            this.id = value;
-        }
-
-    }
-
-
-    /**
-     * <p>Java class for anonymous complex type.
-     * 
-     * <p>The following schema fragment specifies the expected content contained within this class.
-     * 
-     * <pre>
-     * &lt;complexType>
-     *   &lt;complexContent>
-     *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
-     *       &lt;sequence>
-     *         &lt;element name="features" type="{www.jalview.org}feature" maxOccurs="unbounded" minOccurs="0"/>
-     *         &lt;element name="pdbids" maxOccurs="unbounded" minOccurs="0">
-     *           &lt;complexType>
-     *             &lt;complexContent>
-     *               &lt;extension base="{www.jalview.org}pdbentry">
-     *                 &lt;sequence>
-     *                   &lt;element name="structureState" maxOccurs="unbounded" minOccurs="0">
-     *                     &lt;complexType>
-     *                       &lt;simpleContent>
-     *                         &lt;extension base="&lt;http://www.w3.org/2001/XMLSchema>string">
-     *                           &lt;attGroup ref="{www.jalview.org}swingwindow"/>
-     *                           &lt;attribute name="visible" type="{http://www.w3.org/2001/XMLSchema}boolean" />
-     *                           &lt;attribute name="viewId" type="{http://www.w3.org/2001/XMLSchema}string" />
-     *                           &lt;attribute name="alignwithAlignPanel" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
-     *                           &lt;attribute name="colourwithAlignPanel" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
-     *                           &lt;attribute name="colourByJmol" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
-     *                           &lt;attribute name="type" type="{http://www.w3.org/2001/XMLSchema}string" />
-     *                         &lt;/extension>
-     *                       &lt;/simpleContent>
-     *                     &lt;/complexType>
-     *                   &lt;/element>
-     *                 &lt;/sequence>
-     *               &lt;/extension>
-     *             &lt;/complexContent>
-     *           &lt;/complexType>
-     *         &lt;/element>
-     *         &lt;element name="hiddenSequences" type="{http://www.w3.org/2001/XMLSchema}int" maxOccurs="unbounded" minOccurs="0"/>
-     *         &lt;element name="rnaViewer" maxOccurs="unbounded" minOccurs="0">
-     *           &lt;complexType>
-     *             &lt;complexContent>
-     *               &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
-     *                 &lt;sequence>
-     *                   &lt;element name="secondaryStructure" maxOccurs="unbounded">
-     *                     &lt;complexType>
-     *                       &lt;complexContent>
-     *                         &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
-     *                           &lt;attribute name="title" type="{http://www.w3.org/2001/XMLSchema}string" />
-     *                           &lt;attribute name="annotationId" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
-     *                           &lt;attribute name="gapped" type="{http://www.w3.org/2001/XMLSchema}boolean" />
-     *                           &lt;attribute name="viewerState" type="{http://www.w3.org/2001/XMLSchema}string" />
-     *                         &lt;/restriction>
-     *                       &lt;/complexContent>
-     *                     &lt;/complexType>
-     *                   &lt;/element>
-     *                 &lt;/sequence>
-     *                 &lt;attGroup ref="{www.jalview.org}swingwindow"/>
-     *                 &lt;attribute name="title" type="{http://www.w3.org/2001/XMLSchema}string" />
-     *                 &lt;attribute name="viewId" type="{http://www.w3.org/2001/XMLSchema}string" />
-     *                 &lt;attribute name="dividerLocation" type="{http://www.w3.org/2001/XMLSchema}int" />
-     *                 &lt;attribute name="selectedRna" type="{http://www.w3.org/2001/XMLSchema}int" />
-     *               &lt;/restriction>
-     *             &lt;/complexContent>
-     *           &lt;/complexType>
-     *         &lt;/element>
-     *       &lt;/sequence>
-     *       &lt;attribute name="colour" type="{http://www.w3.org/2001/XMLSchema}int" />
-     *       &lt;attribute name="start" use="required" type="{http://www.w3.org/2001/XMLSchema}int" />
-     *       &lt;attribute name="end" use="required" type="{http://www.w3.org/2001/XMLSchema}int" />
-     *       &lt;attribute name="id" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
-     *       &lt;attribute name="hidden" type="{http://www.w3.org/2001/XMLSchema}boolean" />
-     *       &lt;attribute name="viewreference" type="{http://www.w3.org/2001/XMLSchema}boolean" />
-     *     &lt;/restriction>
-     *   &lt;/complexContent>
-     * &lt;/complexType>
-     * </pre>
-     * 
-     * 
-     */
-    @XmlAccessorType(XmlAccessType.FIELD)
-    @XmlType(name = "", propOrder = {
-        "features",
-        "pdbids",
-        "hiddenSequences",
-        "rnaViewer"
-    })
-    public static class JSeq {
-
-        @XmlElement(namespace = "www.jalview.org")
-        protected List<Feature> features;
-        @XmlElement(namespace = "www.jalview.org")
-        protected List<JalviewModelType.JSeq.Pdbids> pdbids;
-        @XmlElement(namespace = "www.jalview.org", type = Integer.class)
-        protected List<Integer> hiddenSequences;
-        @XmlElement(namespace = "www.jalview.org")
-        protected List<JalviewModelType.JSeq.RnaViewer> rnaViewer;
-        @XmlAttribute(name = "colour")
-        protected Integer colour;
-        @XmlAttribute(name = "start", required = true)
-        protected int start;
-        @XmlAttribute(name = "end", required = true)
-        protected int end;
-        @XmlAttribute(name = "id", required = true)
-        protected String id;
-        @XmlAttribute(name = "hidden")
-        protected Boolean hidden;
-        @XmlAttribute(name = "viewreference")
-        protected Boolean viewreference;
-
-        /**
-         * Gets the value of the features property.
-         * 
-         * <p>
-         * This accessor method returns a reference to the live list,
-         * not a snapshot. Therefore any modification you make to the
-         * returned list will be present inside the JAXB object.
-         * This is why there is not a <CODE>set</CODE> method for the features property.
-         * 
-         * <p>
-         * For example, to add a new item, do as follows:
-         * <pre>
-         *    getFeatures().add(newItem);
-         * </pre>
-         * 
-         * 
-         * <p>
-         * Objects of the following type(s) are allowed in the list
-         * {@link Feature }
-         * 
-         * 
-         */
-        public List<Feature> getFeatures() {
-            if (features == null) {
-                features = new ArrayList<Feature>();
-            }
-            return this.features;
-        }
-
-        /**
-         * Gets the value of the pdbids property.
-         * 
-         * <p>
-         * This accessor method returns a reference to the live list,
-         * not a snapshot. Therefore any modification you make to the
-         * returned list will be present inside the JAXB object.
-         * This is why there is not a <CODE>set</CODE> method for the pdbids property.
-         * 
-         * <p>
-         * For example, to add a new item, do as follows:
-         * <pre>
-         *    getPdbids().add(newItem);
-         * </pre>
-         * 
-         * 
-         * <p>
-         * Objects of the following type(s) are allowed in the list
-         * {@link JalviewModelType.JSeq.Pdbids }
-         * 
-         * 
-         */
-        public List<JalviewModelType.JSeq.Pdbids> getPdbids() {
-            if (pdbids == null) {
-                pdbids = new ArrayList<JalviewModelType.JSeq.Pdbids>();
-            }
-            return this.pdbids;
-        }
-
-        /**
-         * Gets the value of the hiddenSequences property.
-         * 
-         * <p>
-         * This accessor method returns a reference to the live list,
-         * not a snapshot. Therefore any modification you make to the
-         * returned list will be present inside the JAXB object.
-         * This is why there is not a <CODE>set</CODE> method for the hiddenSequences property.
-         * 
-         * <p>
-         * For example, to add a new item, do as follows:
-         * <pre>
-         *    getHiddenSequences().add(newItem);
-         * </pre>
-         * 
-         * 
-         * <p>
-         * Objects of the following type(s) are allowed in the list
-         * {@link Integer }
-         * 
-         * 
-         */
-        public List<Integer> getHiddenSequences() {
-            if (hiddenSequences == null) {
-                hiddenSequences = new ArrayList<Integer>();
-            }
-            return this.hiddenSequences;
-        }
-
-        /**
-         * Gets the value of the rnaViewer property.
-         * 
-         * <p>
-         * This accessor method returns a reference to the live list,
-         * not a snapshot. Therefore any modification you make to the
-         * returned list will be present inside the JAXB object.
-         * This is why there is not a <CODE>set</CODE> method for the rnaViewer property.
-         * 
-         * <p>
-         * For example, to add a new item, do as follows:
-         * <pre>
-         *    getRnaViewer().add(newItem);
-         * </pre>
-         * 
-         * 
-         * <p>
-         * Objects of the following type(s) are allowed in the list
-         * {@link JalviewModelType.JSeq.RnaViewer }
-         * 
-         * 
-         */
-        public List<JalviewModelType.JSeq.RnaViewer> getRnaViewer() {
-            if (rnaViewer == null) {
-                rnaViewer = new ArrayList<JalviewModelType.JSeq.RnaViewer>();
-            }
-            return this.rnaViewer;
-        }
-
-        /**
-         * Gets the value of the colour property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Integer }
-         *     
-         */
-        public Integer getColour() {
-            return colour;
-        }
-
-        /**
-         * Sets the value of the colour property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Integer }
-         *     
-         */
-        public void setColour(Integer value) {
-            this.colour = value;
-        }
-
-        /**
-         * Gets the value of the start property.
-         * 
-         */
-        public int getStart() {
-            return start;
-        }
-
-        /**
-         * Sets the value of the start property.
-         * 
-         */
-        public void setStart(int value) {
-            this.start = value;
-        }
-
-        /**
-         * Gets the value of the end property.
-         * 
-         */
-        public int getEnd() {
-            return end;
-        }
-
-        /**
-         * Sets the value of the end property.
-         * 
-         */
-        public void setEnd(int value) {
-            this.end = value;
-        }
-
-        /**
-         * Gets the value of the id property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link String }
-         *     
-         */
-        public String getId() {
-            return id;
-        }
-
-        /**
-         * Sets the value of the id property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link String }
-         *     
-         */
-        public void setId(String value) {
-            this.id = value;
-        }
-
-        /**
-         * Gets the value of the hidden property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Boolean }
-         *     
-         */
-        public Boolean isHidden() {
-            return hidden;
-        }
-
-        /**
-         * Sets the value of the hidden property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Boolean }
-         *     
-         */
-        public void setHidden(Boolean value) {
-            this.hidden = value;
-        }
-
-        /**
-         * Gets the value of the viewreference property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Boolean }
-         *     
-         */
-        public Boolean isViewreference() {
-            return viewreference;
-        }
-
-        /**
-         * Sets the value of the viewreference property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Boolean }
-         *     
-         */
-        public void setViewreference(Boolean value) {
-            this.viewreference = value;
-        }
-
-
-        /**
-         * <p>Java class for anonymous complex type.
-         * 
-         * <p>The following schema fragment specifies the expected content contained within this class.
-         * 
-         * <pre>
-         * &lt;complexType>
-         *   &lt;complexContent>
-         *     &lt;extension base="{www.jalview.org}pdbentry">
-         *       &lt;sequence>
-         *         &lt;element name="structureState" maxOccurs="unbounded" minOccurs="0">
-         *           &lt;complexType>
-         *             &lt;simpleContent>
-         *               &lt;extension base="&lt;http://www.w3.org/2001/XMLSchema>string">
-         *                 &lt;attGroup ref="{www.jalview.org}swingwindow"/>
-         *                 &lt;attribute name="visible" type="{http://www.w3.org/2001/XMLSchema}boolean" />
-         *                 &lt;attribute name="viewId" type="{http://www.w3.org/2001/XMLSchema}string" />
-         *                 &lt;attribute name="alignwithAlignPanel" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
-         *                 &lt;attribute name="colourwithAlignPanel" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
-         *                 &lt;attribute name="colourByJmol" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
-         *                 &lt;attribute name="type" type="{http://www.w3.org/2001/XMLSchema}string" />
-         *               &lt;/extension>
-         *             &lt;/simpleContent>
-         *           &lt;/complexType>
-         *         &lt;/element>
-         *       &lt;/sequence>
-         *     &lt;/extension>
-         *   &lt;/complexContent>
-         * &lt;/complexType>
-         * </pre>
-         * 
-         * 
-         */
-        @XmlAccessorType(XmlAccessType.FIELD)
-        @XmlType(name = "", propOrder = {
-            "structureState"
-        })
-        public static class Pdbids
-            extends Pdbentry
-        {
-
-            @XmlElement(namespace = "www.jalview.org")
-            protected List<JalviewModelType.JSeq.Pdbids.StructureState> structureState;
-
-            /**
-             * Gets the value of the structureState property.
-             * 
-             * <p>
-             * This accessor method returns a reference to the live list,
-             * not a snapshot. Therefore any modification you make to the
-             * returned list will be present inside the JAXB object.
-             * This is why there is not a <CODE>set</CODE> method for the structureState property.
-             * 
-             * <p>
-             * For example, to add a new item, do as follows:
-             * <pre>
-             *    getStructureState().add(newItem);
-             * </pre>
-             * 
-             * 
-             * <p>
-             * Objects of the following type(s) are allowed in the list
-             * {@link JalviewModelType.JSeq.Pdbids.StructureState }
-             * 
-             * 
-             */
-            public List<JalviewModelType.JSeq.Pdbids.StructureState> getStructureState() {
-                if (structureState == null) {
-                    structureState = new ArrayList<JalviewModelType.JSeq.Pdbids.StructureState>();
-                }
-                return this.structureState;
-            }
-
-
-            /**
-             * <p>Java class for anonymous complex type.
-             * 
-             * <p>The following schema fragment specifies the expected content contained within this class.
-             * 
-             * <pre>
-             * &lt;complexType>
-             *   &lt;simpleContent>
-             *     &lt;extension base="&lt;http://www.w3.org/2001/XMLSchema>string">
-             *       &lt;attGroup ref="{www.jalview.org}swingwindow"/>
-             *       &lt;attribute name="visible" type="{http://www.w3.org/2001/XMLSchema}boolean" />
-             *       &lt;attribute name="viewId" type="{http://www.w3.org/2001/XMLSchema}string" />
-             *       &lt;attribute name="alignwithAlignPanel" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
-             *       &lt;attribute name="colourwithAlignPanel" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
-             *       &lt;attribute name="colourByJmol" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
-             *       &lt;attribute name="type" type="{http://www.w3.org/2001/XMLSchema}string" />
-             *     &lt;/extension>
-             *   &lt;/simpleContent>
-             * &lt;/complexType>
-             * </pre>
-             * 
-             * 
-             */
-            @XmlAccessorType(XmlAccessType.FIELD)
-            @XmlType(name = "", propOrder = {
-                "value"
-            })
-            public static class StructureState {
-
-                @XmlValue
-                protected String value;
-                @XmlAttribute(name = "visible")
-                protected Boolean visible;
-                @XmlAttribute(name = "viewId")
-                protected String viewId;
-                @XmlAttribute(name = "alignwithAlignPanel")
-                protected Boolean alignwithAlignPanel;
-                @XmlAttribute(name = "colourwithAlignPanel")
-                protected Boolean colourwithAlignPanel;
-                @XmlAttribute(name = "colourByJmol")
-                protected Boolean colourByJmol;
-                @XmlAttribute(name = "type")
-                protected String type;
-                @XmlAttribute(name = "width")
-                protected Integer width;
-                @XmlAttribute(name = "height")
-                protected Integer height;
-                @XmlAttribute(name = "xpos")
-                protected Integer xpos;
-                @XmlAttribute(name = "ypos")
-                protected Integer ypos;
-
-                /**
-                 * Gets the value of the value property.
-                 * 
-                 * @return
-                 *     possible object is
-                 *     {@link String }
-                 *     
-                 */
-                public String getValue() {
-                    return value;
-                }
-
-                /**
-                 * Sets the value of the value property.
-                 * 
-                 * @param value
-                 *     allowed object is
-                 *     {@link String }
-                 *     
-                 */
-                public void setValue(String value) {
-                    this.value = value;
-                }
-
-                /**
-                 * Gets the value of the visible property.
-                 * 
-                 * @return
-                 *     possible object is
-                 *     {@link Boolean }
-                 *     
-                 */
-                public Boolean isVisible() {
-                    return visible;
-                }
-
-                /**
-                 * Sets the value of the visible property.
-                 * 
-                 * @param value
-                 *     allowed object is
-                 *     {@link Boolean }
-                 *     
-                 */
-                public void setVisible(Boolean value) {
-                    this.visible = value;
-                }
-
-                /**
-                 * Gets the value of the viewId property.
-                 * 
-                 * @return
-                 *     possible object is
-                 *     {@link String }
-                 *     
-                 */
-                public String getViewId() {
-                    return viewId;
-                }
-
-                /**
-                 * Sets the value of the viewId property.
-                 * 
-                 * @param value
-                 *     allowed object is
-                 *     {@link String }
-                 *     
-                 */
-                public void setViewId(String value) {
-                    this.viewId = value;
-                }
-
-                /**
-                 * Gets the value of the alignwithAlignPanel property.
-                 * 
-                 * @return
-                 *     possible object is
-                 *     {@link Boolean }
-                 *     
-                 */
-                public boolean isAlignwithAlignPanel() {
-                    if (alignwithAlignPanel == null) {
-                        return true;
-                    } else {
-                        return alignwithAlignPanel;
-                    }
-                }
-
-                /**
-                 * Sets the value of the alignwithAlignPanel property.
-                 * 
-                 * @param value
-                 *     allowed object is
-                 *     {@link Boolean }
-                 *     
-                 */
-                public void setAlignwithAlignPanel(Boolean value) {
-                    this.alignwithAlignPanel = value;
-                }
-
-                /**
-                 * Gets the value of the colourwithAlignPanel property.
-                 * 
-                 * @return
-                 *     possible object is
-                 *     {@link Boolean }
-                 *     
-                 */
-                public boolean isColourwithAlignPanel() {
-                    if (colourwithAlignPanel == null) {
-                        return false;
-                    } else {
-                        return colourwithAlignPanel;
-                    }
-                }
-
-                /**
-                 * Sets the value of the colourwithAlignPanel property.
-                 * 
-                 * @param value
-                 *     allowed object is
-                 *     {@link Boolean }
-                 *     
-                 */
-                public void setColourwithAlignPanel(Boolean value) {
-                    this.colourwithAlignPanel = value;
-                }
-
-                /**
-                 * Gets the value of the colourByJmol property.
-                 * 
-                 * @return
-                 *     possible object is
-                 *     {@link Boolean }
-                 *     
-                 */
-                public boolean isColourByJmol() {
-                    if (colourByJmol == null) {
-                        return true;
-                    } else {
-                        return colourByJmol;
-                    }
-                }
-
-                /**
-                 * Sets the value of the colourByJmol property.
-                 * 
-                 * @param value
-                 *     allowed object is
-                 *     {@link Boolean }
-                 *     
-                 */
-                public void setColourByJmol(Boolean value) {
-                    this.colourByJmol = value;
-                }
-
-                /**
-                 * Gets the value of the type property.
-                 * 
-                 * @return
-                 *     possible object is
-                 *     {@link String }
-                 *     
-                 */
-                public String getType() {
-                    return type;
-                }
-
-                /**
-                 * Sets the value of the type property.
-                 * 
-                 * @param value
-                 *     allowed object is
-                 *     {@link String }
-                 *     
-                 */
-                public void setType(String value) {
-                    this.type = value;
-                }
-
-                /**
-                 * Gets the value of the width property.
-                 * 
-                 * @return
-                 *     possible object is
-                 *     {@link Integer }
-                 *     
-                 */
-                public Integer getWidth() {
-                    return width;
-                }
-
-                /**
-                 * Sets the value of the width property.
-                 * 
-                 * @param value
-                 *     allowed object is
-                 *     {@link Integer }
-                 *     
-                 */
-                public void setWidth(Integer value) {
-                    this.width = value;
-                }
-
-                /**
-                 * Gets the value of the height property.
-                 * 
-                 * @return
-                 *     possible object is
-                 *     {@link Integer }
-                 *     
-                 */
-                public Integer getHeight() {
-                    return height;
-                }
-
-                /**
-                 * Sets the value of the height property.
-                 * 
-                 * @param value
-                 *     allowed object is
-                 *     {@link Integer }
-                 *     
-                 */
-                public void setHeight(Integer value) {
-                    this.height = value;
-                }
-
-                /**
-                 * Gets the value of the xpos property.
-                 * 
-                 * @return
-                 *     possible object is
-                 *     {@link Integer }
-                 *     
-                 */
-                public Integer getXpos() {
-                    return xpos;
-                }
-
-                /**
-                 * Sets the value of the xpos property.
-                 * 
-                 * @param value
-                 *     allowed object is
-                 *     {@link Integer }
-                 *     
-                 */
-                public void setXpos(Integer value) {
-                    this.xpos = value;
-                }
-
-                /**
-                 * Gets the value of the ypos property.
-                 * 
-                 * @return
-                 *     possible object is
-                 *     {@link Integer }
-                 *     
-                 */
-                public Integer getYpos() {
-                    return ypos;
-                }
-
-                /**
-                 * Sets the value of the ypos property.
-                 * 
-                 * @param value
-                 *     allowed object is
-                 *     {@link Integer }
-                 *     
-                 */
-                public void setYpos(Integer value) {
-                    this.ypos = value;
-                }
-
-            }
-
-        }
-
-
-        /**
-         * <p>Java class for anonymous complex type.
-         * 
-         * <p>The following schema fragment specifies the expected content contained within this class.
-         * 
-         * <pre>
-         * &lt;complexType>
-         *   &lt;complexContent>
-         *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
-         *       &lt;sequence>
-         *         &lt;element name="secondaryStructure" maxOccurs="unbounded">
-         *           &lt;complexType>
-         *             &lt;complexContent>
-         *               &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
-         *                 &lt;attribute name="title" type="{http://www.w3.org/2001/XMLSchema}string" />
-         *                 &lt;attribute name="annotationId" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
-         *                 &lt;attribute name="gapped" type="{http://www.w3.org/2001/XMLSchema}boolean" />
-         *                 &lt;attribute name="viewerState" type="{http://www.w3.org/2001/XMLSchema}string" />
-         *               &lt;/restriction>
-         *             &lt;/complexContent>
-         *           &lt;/complexType>
-         *         &lt;/element>
-         *       &lt;/sequence>
-         *       &lt;attGroup ref="{www.jalview.org}swingwindow"/>
-         *       &lt;attribute name="title" type="{http://www.w3.org/2001/XMLSchema}string" />
-         *       &lt;attribute name="viewId" type="{http://www.w3.org/2001/XMLSchema}string" />
-         *       &lt;attribute name="dividerLocation" type="{http://www.w3.org/2001/XMLSchema}int" />
-         *       &lt;attribute name="selectedRna" type="{http://www.w3.org/2001/XMLSchema}int" />
-         *     &lt;/restriction>
-         *   &lt;/complexContent>
-         * &lt;/complexType>
-         * </pre>
-         * 
-         * 
-         */
-        @XmlAccessorType(XmlAccessType.FIELD)
-        @XmlType(name = "", propOrder = {
-            "secondaryStructure"
-        })
-        public static class RnaViewer {
-
-            @XmlElement(namespace = "www.jalview.org", required = true)
-            protected List<JalviewModelType.JSeq.RnaViewer.SecondaryStructure> secondaryStructure;
-            @XmlAttribute(name = "title")
-            protected String title;
-            @XmlAttribute(name = "viewId")
-            protected String viewId;
-            @XmlAttribute(name = "dividerLocation")
-            protected Integer dividerLocation;
-            @XmlAttribute(name = "selectedRna")
-            protected Integer selectedRna;
-            @XmlAttribute(name = "width")
-            protected Integer width;
-            @XmlAttribute(name = "height")
-            protected Integer height;
-            @XmlAttribute(name = "xpos")
-            protected Integer xpos;
-            @XmlAttribute(name = "ypos")
-            protected Integer ypos;
-
-            /**
-             * Gets the value of the secondaryStructure property.
-             * 
-             * <p>
-             * This accessor method returns a reference to the live list,
-             * not a snapshot. Therefore any modification you make to the
-             * returned list will be present inside the JAXB object.
-             * This is why there is not a <CODE>set</CODE> method for the secondaryStructure property.
-             * 
-             * <p>
-             * For example, to add a new item, do as follows:
-             * <pre>
-             *    getSecondaryStructure().add(newItem);
-             * </pre>
-             * 
-             * 
-             * <p>
-             * Objects of the following type(s) are allowed in the list
-             * {@link JalviewModelType.JSeq.RnaViewer.SecondaryStructure }
-             * 
-             * 
-             */
-            public List<JalviewModelType.JSeq.RnaViewer.SecondaryStructure> getSecondaryStructure() {
-                if (secondaryStructure == null) {
-                    secondaryStructure = new ArrayList<JalviewModelType.JSeq.RnaViewer.SecondaryStructure>();
-                }
-                return this.secondaryStructure;
-            }
-
-            /**
-             * Gets the value of the title property.
-             * 
-             * @return
-             *     possible object is
-             *     {@link String }
-             *     
-             */
-            public String getTitle() {
-                return title;
-            }
-
-            /**
-             * Sets the value of the title property.
-             * 
-             * @param value
-             *     allowed object is
-             *     {@link String }
-             *     
-             */
-            public void setTitle(String value) {
-                this.title = value;
-            }
-
-            /**
-             * Gets the value of the viewId property.
-             * 
-             * @return
-             *     possible object is
-             *     {@link String }
-             *     
-             */
-            public String getViewId() {
-                return viewId;
-            }
-
-            /**
-             * Sets the value of the viewId property.
-             * 
-             * @param value
-             *     allowed object is
-             *     {@link String }
-             *     
-             */
-            public void setViewId(String value) {
-                this.viewId = value;
-            }
-
-            /**
-             * Gets the value of the dividerLocation property.
-             * 
-             * @return
-             *     possible object is
-             *     {@link Integer }
-             *     
-             */
-            public Integer getDividerLocation() {
-                return dividerLocation;
-            }
-
-            /**
-             * Sets the value of the dividerLocation property.
-             * 
-             * @param value
-             *     allowed object is
-             *     {@link Integer }
-             *     
-             */
-            public void setDividerLocation(Integer value) {
-                this.dividerLocation = value;
-            }
-
-            /**
-             * Gets the value of the selectedRna property.
-             * 
-             * @return
-             *     possible object is
-             *     {@link Integer }
-             *     
-             */
-            public Integer getSelectedRna() {
-                return selectedRna;
-            }
-
-            /**
-             * Sets the value of the selectedRna property.
-             * 
-             * @param value
-             *     allowed object is
-             *     {@link Integer }
-             *     
-             */
-            public void setSelectedRna(Integer value) {
-                this.selectedRna = value;
-            }
-
-            /**
-             * Gets the value of the width property.
-             * 
-             * @return
-             *     possible object is
-             *     {@link Integer }
-             *     
-             */
-            public Integer getWidth() {
-                return width;
-            }
-
-            /**
-             * Sets the value of the width property.
-             * 
-             * @param value
-             *     allowed object is
-             *     {@link Integer }
-             *     
-             */
-            public void setWidth(Integer value) {
-                this.width = value;
-            }
-
-            /**
-             * Gets the value of the height property.
-             * 
-             * @return
-             *     possible object is
-             *     {@link Integer }
-             *     
-             */
-            public Integer getHeight() {
-                return height;
-            }
-
-            /**
-             * Sets the value of the height property.
-             * 
-             * @param value
-             *     allowed object is
-             *     {@link Integer }
-             *     
-             */
-            public void setHeight(Integer value) {
-                this.height = value;
-            }
-
-            /**
-             * Gets the value of the xpos property.
-             * 
-             * @return
-             *     possible object is
-             *     {@link Integer }
-             *     
-             */
-            public Integer getXpos() {
-                return xpos;
-            }
-
-            /**
-             * Sets the value of the xpos property.
-             * 
-             * @param value
-             *     allowed object is
-             *     {@link Integer }
-             *     
-             */
-            public void setXpos(Integer value) {
-                this.xpos = value;
-            }
-
-            /**
-             * Gets the value of the ypos property.
-             * 
-             * @return
-             *     possible object is
-             *     {@link Integer }
-             *     
-             */
-            public Integer getYpos() {
-                return ypos;
-            }
-
-            /**
-             * Sets the value of the ypos property.
-             * 
-             * @param value
-             *     allowed object is
-             *     {@link Integer }
-             *     
-             */
-            public void setYpos(Integer value) {
-                this.ypos = value;
-            }
-
-
-            /**
-             * <p>Java class for anonymous complex type.
-             * 
-             * <p>The following schema fragment specifies the expected content contained within this class.
-             * 
-             * <pre>
-             * &lt;complexType>
-             *   &lt;complexContent>
-             *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
-             *       &lt;attribute name="title" type="{http://www.w3.org/2001/XMLSchema}string" />
-             *       &lt;attribute name="annotationId" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
-             *       &lt;attribute name="gapped" type="{http://www.w3.org/2001/XMLSchema}boolean" />
-             *       &lt;attribute name="viewerState" type="{http://www.w3.org/2001/XMLSchema}string" />
-             *     &lt;/restriction>
-             *   &lt;/complexContent>
-             * &lt;/complexType>
-             * </pre>
-             * 
-             * 
-             */
-            @XmlAccessorType(XmlAccessType.FIELD)
-            @XmlType(name = "")
-            public static class SecondaryStructure {
-
-                @XmlAttribute(name = "title")
-                protected String title;
-                @XmlAttribute(name = "annotationId", required = true)
-                protected String annotationId;
-                @XmlAttribute(name = "gapped")
-                protected Boolean gapped;
-                @XmlAttribute(name = "viewerState")
-                protected String viewerState;
-
-                /**
-                 * Gets the value of the title property.
-                 * 
-                 * @return
-                 *     possible object is
-                 *     {@link String }
-                 *     
-                 */
-                public String getTitle() {
-                    return title;
-                }
-
-                /**
-                 * Sets the value of the title property.
-                 * 
-                 * @param value
-                 *     allowed object is
-                 *     {@link String }
-                 *     
-                 */
-                public void setTitle(String value) {
-                    this.title = value;
-                }
-
-                /**
-                 * Gets the value of the annotationId property.
-                 * 
-                 * @return
-                 *     possible object is
-                 *     {@link String }
-                 *     
-                 */
-                public String getAnnotationId() {
-                    return annotationId;
-                }
-
-                /**
-                 * Sets the value of the annotationId property.
-                 * 
-                 * @param value
-                 *     allowed object is
-                 *     {@link String }
-                 *     
-                 */
-                public void setAnnotationId(String value) {
-                    this.annotationId = value;
-                }
-
-                /**
-                 * Gets the value of the gapped property.
-                 * 
-                 * @return
-                 *     possible object is
-                 *     {@link Boolean }
-                 *     
-                 */
-                public Boolean isGapped() {
-                    return gapped;
-                }
-
-                /**
-                 * Sets the value of the gapped property.
-                 * 
-                 * @param value
-                 *     allowed object is
-                 *     {@link Boolean }
-                 *     
-                 */
-                public void setGapped(Boolean value) {
-                    this.gapped = value;
-                }
-
-                /**
-                 * Gets the value of the viewerState property.
-                 * 
-                 * @return
-                 *     possible object is
-                 *     {@link String }
-                 *     
-                 */
-                public String getViewerState() {
-                    return viewerState;
-                }
-
-                /**
-                 * Sets the value of the viewerState property.
-                 * 
-                 * @param value
-                 *     allowed object is
-                 *     {@link String }
-                 *     
-                 */
-                public void setViewerState(String value) {
-                    this.viewerState = value;
-                }
-
-            }
-
-        }
-
-    }
-
-
-    /**
-     * <p>Java class for anonymous complex type.
-     * 
-     * <p>The following schema fragment specifies the expected content contained within this class.
-     * 
-     * <pre>
-     * &lt;complexType>
-     *   &lt;complexContent>
-     *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
-     *       &lt;sequence minOccurs="0">
-     *         &lt;element name="title" type="{http://www.w3.org/2001/XMLSchema}string"/>
-     *         &lt;element name="newick" type="{http://www.w3.org/2001/XMLSchema}string"/>
-     *       &lt;/sequence>
-     *       &lt;attGroup ref="{www.jalview.org}swingwindow"/>
-     *       &lt;attribute name="fontName" type="{http://www.w3.org/2001/XMLSchema}string" />
-     *       &lt;attribute name="fontSize" type="{http://www.w3.org/2001/XMLSchema}int" />
-     *       &lt;attribute name="fontStyle" type="{http://www.w3.org/2001/XMLSchema}int" />
-     *       &lt;attribute name="threshold" type="{http://www.w3.org/2001/XMLSchema}float" />
-     *       &lt;attribute name="showBootstrap" type="{http://www.w3.org/2001/XMLSchema}boolean" />
-     *       &lt;attribute name="showDistances" type="{http://www.w3.org/2001/XMLSchema}boolean" />
-     *       &lt;attribute name="markUnlinked" type="{http://www.w3.org/2001/XMLSchema}boolean" />
-     *       &lt;attribute name="fitToWindow" type="{http://www.w3.org/2001/XMLSchema}boolean" />
-     *       &lt;attribute name="currentTree" type="{http://www.w3.org/2001/XMLSchema}boolean" />
-     *       &lt;attribute name="id" type="{http://www.w3.org/2001/XMLSchema}ID" />
-     *     &lt;/restriction>
-     *   &lt;/complexContent>
-     * &lt;/complexType>
-     * </pre>
-     * 
-     * 
-     */
-    @XmlAccessorType(XmlAccessType.FIELD)
-    @XmlType(name = "", propOrder = {
-        "title",
-        "newick"
-    })
-    public static class Tree {
-
-        @XmlElement(namespace = "www.jalview.org")
-        protected String title;
-        @XmlElement(namespace = "www.jalview.org")
-        protected String newick;
-        @XmlAttribute(name = "fontName")
-        protected String fontName;
-        @XmlAttribute(name = "fontSize")
-        protected Integer fontSize;
-        @XmlAttribute(name = "fontStyle")
-        protected Integer fontStyle;
-        @XmlAttribute(name = "threshold")
-        protected Float threshold;
-        @XmlAttribute(name = "showBootstrap")
-        protected Boolean showBootstrap;
-        @XmlAttribute(name = "showDistances")
-        protected Boolean showDistances;
-        @XmlAttribute(name = "markUnlinked")
-        protected Boolean markUnlinked;
-        @XmlAttribute(name = "fitToWindow")
-        protected Boolean fitToWindow;
-        @XmlAttribute(name = "currentTree")
-        protected Boolean currentTree;
-        @XmlAttribute(name = "id")
-        @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
-        @XmlID
-        @XmlSchemaType(name = "ID")
-        protected String id;
-        @XmlAttribute(name = "width")
-        protected Integer width;
-        @XmlAttribute(name = "height")
-        protected Integer height;
-        @XmlAttribute(name = "xpos")
-        protected Integer xpos;
-        @XmlAttribute(name = "ypos")
-        protected Integer ypos;
-
-        /**
-         * Gets the value of the title property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link String }
-         *     
-         */
-        public String getTitle() {
-            return title;
-        }
-
-        /**
-         * Sets the value of the title property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link String }
-         *     
-         */
-        public void setTitle(String value) {
-            this.title = value;
-        }
-
-        /**
-         * Gets the value of the newick property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link String }
-         *     
-         */
-        public String getNewick() {
-            return newick;
-        }
-
-        /**
-         * Sets the value of the newick property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link String }
-         *     
-         */
-        public void setNewick(String value) {
-            this.newick = value;
-        }
-
-        /**
-         * Gets the value of the fontName property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link String }
-         *     
-         */
-        public String getFontName() {
-            return fontName;
-        }
-
-        /**
-         * Sets the value of the fontName property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link String }
-         *     
-         */
-        public void setFontName(String value) {
-            this.fontName = value;
-        }
-
-        /**
-         * Gets the value of the fontSize property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Integer }
-         *     
-         */
-        public Integer getFontSize() {
-            return fontSize;
-        }
-
-        /**
-         * Sets the value of the fontSize property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Integer }
-         *     
-         */
-        public void setFontSize(Integer value) {
-            this.fontSize = value;
-        }
-
-        /**
-         * Gets the value of the fontStyle property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Integer }
-         *     
-         */
-        public Integer getFontStyle() {
-            return fontStyle;
-        }
-
-        /**
-         * Sets the value of the fontStyle property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Integer }
-         *     
-         */
-        public void setFontStyle(Integer value) {
-            this.fontStyle = value;
-        }
-
-        /**
-         * Gets the value of the threshold property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Float }
-         *     
-         */
-        public Float getThreshold() {
-            return threshold;
-        }
-
-        /**
-         * Sets the value of the threshold property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Float }
-         *     
-         */
-        public void setThreshold(Float value) {
-            this.threshold = value;
-        }
-
-        /**
-         * Gets the value of the showBootstrap property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Boolean }
-         *     
-         */
-        public Boolean isShowBootstrap() {
-            return showBootstrap;
-        }
-
-        /**
-         * Sets the value of the showBootstrap property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Boolean }
-         *     
-         */
-        public void setShowBootstrap(Boolean value) {
-            this.showBootstrap = value;
-        }
-
-        /**
-         * Gets the value of the showDistances property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Boolean }
-         *     
-         */
-        public Boolean isShowDistances() {
-            return showDistances;
-        }
-
-        /**
-         * Sets the value of the showDistances property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Boolean }
-         *     
-         */
-        public void setShowDistances(Boolean value) {
-            this.showDistances = value;
-        }
-
-        /**
-         * Gets the value of the markUnlinked property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Boolean }
-         *     
-         */
-        public Boolean isMarkUnlinked() {
-            return markUnlinked;
-        }
-
-        /**
-         * Sets the value of the markUnlinked property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Boolean }
-         *     
-         */
-        public void setMarkUnlinked(Boolean value) {
-            this.markUnlinked = value;
-        }
-
-        /**
-         * Gets the value of the fitToWindow property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Boolean }
-         *     
-         */
-        public Boolean isFitToWindow() {
-            return fitToWindow;
-        }
-
-        /**
-         * Sets the value of the fitToWindow property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Boolean }
-         *     
-         */
-        public void setFitToWindow(Boolean value) {
-            this.fitToWindow = value;
-        }
-
-        /**
-         * Gets the value of the currentTree property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Boolean }
-         *     
-         */
-        public Boolean isCurrentTree() {
-            return currentTree;
-        }
-
-        /**
-         * Sets the value of the currentTree property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Boolean }
-         *     
-         */
-        public void setCurrentTree(Boolean value) {
-            this.currentTree = value;
-        }
-
-        /**
-         * Gets the value of the id property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link String }
-         *     
-         */
-        public String getId() {
-            return id;
-        }
-
-        /**
-         * Sets the value of the id property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link String }
-         *     
-         */
-        public void setId(String value) {
-            this.id = value;
-        }
-
-        /**
-         * Gets the value of the width property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Integer }
-         *     
-         */
-        public Integer getWidth() {
-            return width;
-        }
-
-        /**
-         * Sets the value of the width property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Integer }
-         *     
-         */
-        public void setWidth(Integer value) {
-            this.width = value;
-        }
-
-        /**
-         * Gets the value of the height property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Integer }
-         *     
-         */
-        public Integer getHeight() {
-            return height;
-        }
-
-        /**
-         * Sets the value of the height property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Integer }
-         *     
-         */
-        public void setHeight(Integer value) {
-            this.height = value;
-        }
-
-        /**
-         * Gets the value of the xpos property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Integer }
-         *     
-         */
-        public Integer getXpos() {
-            return xpos;
-        }
-
-        /**
-         * Sets the value of the xpos property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Integer }
-         *     
-         */
-        public void setXpos(Integer value) {
-            this.xpos = value;
-        }
-
-        /**
-         * Gets the value of the ypos property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Integer }
-         *     
-         */
-        public Integer getYpos() {
-            return ypos;
-        }
-
-        /**
-         * Sets the value of the ypos property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Integer }
-         *     
-         */
-        public void setYpos(Integer value) {
-            this.ypos = value;
-        }
-
-    }
-
-
-    /**
-     * <p>Java class for anonymous complex type.
-     * 
-     * <p>The following schema fragment specifies the expected content contained within this class.
-     * 
-     * <pre>
-     * &lt;complexType>
-     *   &lt;complexContent>
-     *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
-     *       &lt;sequence>
-     *         &lt;element name="UserColourScheme" type="{www.jalview.org/colours}JalviewUserColours"/>
-     *       &lt;/sequence>
-     *       &lt;attribute name="id" type="{http://www.w3.org/2001/XMLSchema}string" />
-     *     &lt;/restriction>
-     *   &lt;/complexContent>
-     * &lt;/complexType>
-     * </pre>
-     * 
-     * 
-     */
-    @XmlAccessorType(XmlAccessType.FIELD)
-    @XmlType(name = "", propOrder = {
-        "userColourScheme"
-    })
-    public static class UserColours {
-
-        @XmlElement(name = "UserColourScheme", namespace = "www.jalview.org", required = true)
-        protected JalviewUserColours userColourScheme;
-        @XmlAttribute(name = "id")
-        protected String id;
-
-        /**
-         * Gets the value of the userColourScheme property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link JalviewUserColours }
-         *     
-         */
-        public JalviewUserColours getUserColourScheme() {
-            return userColourScheme;
-        }
-
-        /**
-         * Sets the value of the userColourScheme property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link JalviewUserColours }
-         *     
-         */
-        public void setUserColourScheme(JalviewUserColours value) {
-            this.userColourScheme = value;
-        }
-
-        /**
-         * Gets the value of the id property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link String }
-         *     
-         */
-        public String getId() {
-            return id;
-        }
-
-        /**
-         * Sets the value of the id property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link String }
-         *     
-         */
-        public void setId(String value) {
-            this.id = value;
-        }
-
-    }
-
-
-    /**
-     * <p>Java class for anonymous complex type.
-     * 
-     * <p>The following schema fragment specifies the expected content contained within this class.
-     * 
-     * <pre>
-     * &lt;complexType>
-     *   &lt;complexContent>
-     *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
-     *       &lt;sequence>
-     *         &lt;element name="AnnotationColours" type="{www.jalview.org}AnnotationColourScheme" minOccurs="0"/>
-     *         &lt;element name="hiddenColumns" maxOccurs="unbounded" minOccurs="0">
-     *           &lt;complexType>
-     *             &lt;complexContent>
-     *               &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
-     *                 &lt;attribute name="start" type="{http://www.w3.org/2001/XMLSchema}int" />
-     *                 &lt;attribute name="end" type="{http://www.w3.org/2001/XMLSchema}int" />
-     *               &lt;/restriction>
-     *             &lt;/complexContent>
-     *           &lt;/complexType>
-     *         &lt;/element>
-     *         &lt;element name="calcIdParam" maxOccurs="unbounded" minOccurs="0">
-     *           &lt;complexType>
-     *             &lt;complexContent>
-     *               &lt;extension base="{www.jalview.org/xml/wsparamset}WebServiceParameterSet">
-     *                 &lt;attribute name="calcId" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
-     *                 &lt;attribute name="needsUpdate" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
-     *                 &lt;attribute name="autoUpdate" use="required" type="{http://www.w3.org/2001/XMLSchema}boolean" />
-     *               &lt;/extension>
-     *             &lt;/complexContent>
-     *           &lt;/complexType>
-     *         &lt;/element>
-     *       &lt;/sequence>
-     *       &lt;attGroup ref="{www.jalview.org}swingwindow"/>
-     *       &lt;attribute name="conservationSelected" type="{http://www.w3.org/2001/XMLSchema}boolean" />
-     *       &lt;attribute name="pidSelected" type="{http://www.w3.org/2001/XMLSchema}boolean" />
-     *       &lt;attribute name="bgColour" type="{http://www.w3.org/2001/XMLSchema}string" />
-     *       &lt;attribute name="consThreshold" type="{http://www.w3.org/2001/XMLSchema}int" />
-     *       &lt;attribute name="pidThreshold" type="{http://www.w3.org/2001/XMLSchema}int" />
-     *       &lt;attribute name="title" type="{http://www.w3.org/2001/XMLSchema}string" />
-     *       &lt;attribute name="showFullId" type="{http://www.w3.org/2001/XMLSchema}boolean" />
-     *       &lt;attribute name="rightAlignIds" type="{http://www.w3.org/2001/XMLSchema}boolean" />
-     *       &lt;attribute name="showText" type="{http://www.w3.org/2001/XMLSchema}boolean" />
-     *       &lt;attribute name="showColourText" type="{http://www.w3.org/2001/XMLSchema}boolean" />
-     *       &lt;attribute name="showUnconserved" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
-     *       &lt;attribute name="showBoxes" type="{http://www.w3.org/2001/XMLSchema}boolean" />
-     *       &lt;attribute name="wrapAlignment" type="{http://www.w3.org/2001/XMLSchema}boolean" />
-     *       &lt;attribute name="renderGaps" type="{http://www.w3.org/2001/XMLSchema}boolean" />
-     *       &lt;attribute name="showSequenceFeatures" type="{http://www.w3.org/2001/XMLSchema}boolean" />
-     *       &lt;attribute name="showNPfeatureTooltip" type="{http://www.w3.org/2001/XMLSchema}boolean" />
-     *       &lt;attribute name="showDbRefTooltip" type="{http://www.w3.org/2001/XMLSchema}boolean" />
-     *       &lt;attribute name="followHighlight" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
-     *       &lt;attribute name="followSelection" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
-     *       &lt;attribute name="showAnnotation" type="{http://www.w3.org/2001/XMLSchema}boolean" />
-     *       &lt;attribute name="centreColumnLabels" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
-     *       &lt;attribute name="showGroupConservation" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
-     *       &lt;attribute name="showGroupConsensus" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
-     *       &lt;attribute name="showConsensusHistogram" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
-     *       &lt;attribute name="showSequenceLogo" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
-     *       &lt;attribute name="normaliseSequenceLogo" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
-     *       &lt;attribute name="ignoreGapsinConsensus" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
-     *       &lt;attribute name="startRes" type="{http://www.w3.org/2001/XMLSchema}int" />
-     *       &lt;attribute name="startSeq" type="{http://www.w3.org/2001/XMLSchema}int" />
-     *       &lt;attribute name="fontName" type="{http://www.w3.org/2001/XMLSchema}string" />
-     *       &lt;attribute name="fontSize" type="{http://www.w3.org/2001/XMLSchema}int" />
-     *       &lt;attribute name="fontStyle" type="{http://www.w3.org/2001/XMLSchema}int" />
-     *       &lt;attribute name="scaleProteinAsCdna" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
-     *       &lt;attribute name="viewName" type="{http://www.w3.org/2001/XMLSchema}string" />
-     *       &lt;attribute name="sequenceSetId" type="{http://www.w3.org/2001/XMLSchema}string" />
-     *       &lt;attribute name="gatheredViews" type="{http://www.w3.org/2001/XMLSchema}boolean" />
-     *       &lt;attribute name="textCol1" type="{http://www.w3.org/2001/XMLSchema}int" />
-     *       &lt;attribute name="textCol2" type="{http://www.w3.org/2001/XMLSchema}int" />
-     *       &lt;attribute name="textColThreshold" type="{http://www.w3.org/2001/XMLSchema}int" />
-     *       &lt;attribute name="id" type="{http://www.w3.org/2001/XMLSchema}ID" />
-     *       &lt;attribute name="complementId" type="{http://www.w3.org/2001/XMLSchema}string" />
-     *     &lt;/restriction>
-     *   &lt;/complexContent>
-     * &lt;/complexType>
-     * </pre>
-     * 
-     * 
-     */
-    @XmlAccessorType(XmlAccessType.FIELD)
-    @XmlType(name = "", propOrder = {
-        "annotationColours",
-        "hiddenColumns",
-        "calcIdParam"
-    })
-    public static class Viewport {
-
-        @XmlElement(name = "AnnotationColours", namespace = "www.jalview.org")
-        protected AnnotationColourScheme annotationColours;
-        @XmlElement(namespace = "www.jalview.org")
-        protected List<JalviewModelType.Viewport.HiddenColumns> hiddenColumns;
-        @XmlElement(namespace = "www.jalview.org")
-        protected List<JalviewModelType.Viewport.CalcIdParam> calcIdParam;
-        @XmlAttribute(name = "conservationSelected")
-        protected Boolean conservationSelected;
-        @XmlAttribute(name = "pidSelected")
-        protected Boolean pidSelected;
-        @XmlAttribute(name = "bgColour")
-        protected String bgColour;
-        @XmlAttribute(name = "consThreshold")
-        protected Integer consThreshold;
-        @XmlAttribute(name = "pidThreshold")
-        protected Integer pidThreshold;
-        @XmlAttribute(name = "title")
-        protected String title;
-        @XmlAttribute(name = "showFullId")
-        protected Boolean showFullId;
-        @XmlAttribute(name = "rightAlignIds")
-        protected Boolean rightAlignIds;
-        @XmlAttribute(name = "showText")
-        protected Boolean showText;
-        @XmlAttribute(name = "showColourText")
-        protected Boolean showColourText;
-        @XmlAttribute(name = "showUnconserved")
-        protected Boolean showUnconserved;
-        @XmlAttribute(name = "showBoxes")
-        protected Boolean showBoxes;
-        @XmlAttribute(name = "wrapAlignment")
-        protected Boolean wrapAlignment;
-        @XmlAttribute(name = "renderGaps")
-        protected Boolean renderGaps;
-        @XmlAttribute(name = "showSequenceFeatures")
-        protected Boolean showSequenceFeatures;
-        @XmlAttribute(name = "showNPfeatureTooltip")
-        protected Boolean showNPfeatureTooltip;
-        @XmlAttribute(name = "showDbRefTooltip")
-        protected Boolean showDbRefTooltip;
-        @XmlAttribute(name = "followHighlight")
-        protected Boolean followHighlight;
-        @XmlAttribute(name = "followSelection")
-        protected Boolean followSelection;
-        @XmlAttribute(name = "showAnnotation")
-        protected Boolean showAnnotation;
-        @XmlAttribute(name = "centreColumnLabels")
-        protected Boolean centreColumnLabels;
-        @XmlAttribute(name = "showGroupConservation")
-        protected Boolean showGroupConservation;
-        @XmlAttribute(name = "showGroupConsensus")
-        protected Boolean showGroupConsensus;
-        @XmlAttribute(name = "showConsensusHistogram")
-        protected Boolean showConsensusHistogram;
-        @XmlAttribute(name = "showSequenceLogo")
-        protected Boolean showSequenceLogo;
-        @XmlAttribute(name = "normaliseSequenceLogo")
-        protected Boolean normaliseSequenceLogo;
-        @XmlAttribute(name = "ignoreGapsinConsensus")
-        protected Boolean ignoreGapsinConsensus;
-        @XmlAttribute(name = "startRes")
-        protected Integer startRes;
-        @XmlAttribute(name = "startSeq")
-        protected Integer startSeq;
-        @XmlAttribute(name = "fontName")
-        protected String fontName;
-        @XmlAttribute(name = "fontSize")
-        protected Integer fontSize;
-        @XmlAttribute(name = "fontStyle")
-        protected Integer fontStyle;
-        @XmlAttribute(name = "scaleProteinAsCdna")
-        protected Boolean scaleProteinAsCdna;
-        @XmlAttribute(name = "viewName")
-        protected String viewName;
-        @XmlAttribute(name = "sequenceSetId")
-        protected String sequenceSetId;
-        @XmlAttribute(name = "gatheredViews")
-        protected Boolean gatheredViews;
-        @XmlAttribute(name = "textCol1")
-        protected Integer textCol1;
-        @XmlAttribute(name = "textCol2")
-        protected Integer textCol2;
-        @XmlAttribute(name = "textColThreshold")
-        protected Integer textColThreshold;
-        @XmlAttribute(name = "id")
-        @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
-        @XmlID
-        @XmlSchemaType(name = "ID")
-        protected String id;
-        @XmlAttribute(name = "complementId")
-        protected String complementId;
-        @XmlAttribute(name = "width")
-        protected Integer width;
-        @XmlAttribute(name = "height")
-        protected Integer height;
-        @XmlAttribute(name = "xpos")
-        protected Integer xpos;
-        @XmlAttribute(name = "ypos")
-        protected Integer ypos;
-
-        /**
-         * Gets the value of the annotationColours property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link AnnotationColourScheme }
-         *     
-         */
-        public AnnotationColourScheme getAnnotationColours() {
-            return annotationColours;
-        }
-
-        /**
-         * Sets the value of the annotationColours property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link AnnotationColourScheme }
-         *     
-         */
-        public void setAnnotationColours(AnnotationColourScheme value) {
-            this.annotationColours = value;
-        }
-
-        /**
-         * Gets the value of the hiddenColumns property.
-         * 
-         * <p>
-         * This accessor method returns a reference to the live list,
-         * not a snapshot. Therefore any modification you make to the
-         * returned list will be present inside the JAXB object.
-         * This is why there is not a <CODE>set</CODE> method for the hiddenColumns property.
-         * 
-         * <p>
-         * For example, to add a new item, do as follows:
-         * <pre>
-         *    getHiddenColumns().add(newItem);
-         * </pre>
-         * 
-         * 
-         * <p>
-         * Objects of the following type(s) are allowed in the list
-         * {@link JalviewModelType.Viewport.HiddenColumns }
-         * 
-         * 
-         */
-        public List<JalviewModelType.Viewport.HiddenColumns> getHiddenColumns() {
-            if (hiddenColumns == null) {
-                hiddenColumns = new ArrayList<JalviewModelType.Viewport.HiddenColumns>();
-            }
-            return this.hiddenColumns;
-        }
-
-        /**
-         * Gets the value of the calcIdParam property.
-         * 
-         * <p>
-         * This accessor method returns a reference to the live list,
-         * not a snapshot. Therefore any modification you make to the
-         * returned list will be present inside the JAXB object.
-         * This is why there is not a <CODE>set</CODE> method for the calcIdParam property.
-         * 
-         * <p>
-         * For example, to add a new item, do as follows:
-         * <pre>
-         *    getCalcIdParam().add(newItem);
-         * </pre>
-         * 
-         * 
-         * <p>
-         * Objects of the following type(s) are allowed in the list
-         * {@link JalviewModelType.Viewport.CalcIdParam }
-         * 
-         * 
-         */
-        public List<JalviewModelType.Viewport.CalcIdParam> getCalcIdParam() {
-            if (calcIdParam == null) {
-                calcIdParam = new ArrayList<JalviewModelType.Viewport.CalcIdParam>();
-            }
-            return this.calcIdParam;
-        }
-
-        /**
-         * Gets the value of the conservationSelected property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Boolean }
-         *     
-         */
-        public Boolean isConservationSelected() {
-            return conservationSelected;
-        }
-
-        /**
-         * Sets the value of the conservationSelected property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Boolean }
-         *     
-         */
-        public void setConservationSelected(Boolean value) {
-            this.conservationSelected = value;
-        }
-
-        /**
-         * Gets the value of the pidSelected property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Boolean }
-         *     
-         */
-        public Boolean isPidSelected() {
-            return pidSelected;
-        }
-
-        /**
-         * Sets the value of the pidSelected property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Boolean }
-         *     
-         */
-        public void setPidSelected(Boolean value) {
-            this.pidSelected = value;
-        }
-
-        /**
-         * Gets the value of the bgColour property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link String }
-         *     
-         */
-        public String getBgColour() {
-            return bgColour;
-        }
-
-        /**
-         * Sets the value of the bgColour property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link String }
-         *     
-         */
-        public void setBgColour(String value) {
-            this.bgColour = value;
-        }
-
-        /**
-         * Gets the value of the consThreshold property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Integer }
-         *     
-         */
-        public Integer getConsThreshold() {
-            return consThreshold;
-        }
-
-        /**
-         * Sets the value of the consThreshold property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Integer }
-         *     
-         */
-        public void setConsThreshold(Integer value) {
-            this.consThreshold = value;
-        }
-
-        /**
-         * Gets the value of the pidThreshold property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Integer }
-         *     
-         */
-        public Integer getPidThreshold() {
-            return pidThreshold;
-        }
-
-        /**
-         * Sets the value of the pidThreshold property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Integer }
-         *     
-         */
-        public void setPidThreshold(Integer value) {
-            this.pidThreshold = value;
-        }
-
-        /**
-         * Gets the value of the title property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link String }
-         *     
-         */
-        public String getTitle() {
-            return title;
-        }
-
-        /**
-         * Sets the value of the title property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link String }
-         *     
-         */
-        public void setTitle(String value) {
-            this.title = value;
-        }
-
-        /**
-         * Gets the value of the showFullId property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Boolean }
-         *     
-         */
-        public Boolean isShowFullId() {
-            return showFullId;
-        }
-
-        /**
-         * Sets the value of the showFullId property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Boolean }
-         *     
-         */
-        public void setShowFullId(Boolean value) {
-            this.showFullId = value;
-        }
-
-        /**
-         * Gets the value of the rightAlignIds property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Boolean }
-         *     
-         */
-        public Boolean isRightAlignIds() {
-            return rightAlignIds;
-        }
-
-        /**
-         * Sets the value of the rightAlignIds property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Boolean }
-         *     
-         */
-        public void setRightAlignIds(Boolean value) {
-            this.rightAlignIds = value;
-        }
-
-        /**
-         * Gets the value of the showText property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Boolean }
-         *     
-         */
-        public Boolean isShowText() {
-            return showText;
-        }
-
-        /**
-         * Sets the value of the showText property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Boolean }
-         *     
-         */
-        public void setShowText(Boolean value) {
-            this.showText = value;
-        }
-
-        /**
-         * Gets the value of the showColourText property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Boolean }
-         *     
-         */
-        public Boolean isShowColourText() {
-            return showColourText;
-        }
-
-        /**
-         * Sets the value of the showColourText property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Boolean }
-         *     
-         */
-        public void setShowColourText(Boolean value) {
-            this.showColourText = value;
-        }
-
-        /**
-         * Gets the value of the showUnconserved property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Boolean }
-         *     
-         */
-        public boolean isShowUnconserved() {
-            if (showUnconserved == null) {
-                return false;
-            } else {
-                return showUnconserved;
-            }
-        }
-
-        /**
-         * Sets the value of the showUnconserved property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Boolean }
-         *     
-         */
-        public void setShowUnconserved(Boolean value) {
-            this.showUnconserved = value;
-        }
-
-        /**
-         * Gets the value of the showBoxes property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Boolean }
-         *     
-         */
-        public Boolean isShowBoxes() {
-            return showBoxes;
-        }
-
-        /**
-         * Sets the value of the showBoxes property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Boolean }
-         *     
-         */
-        public void setShowBoxes(Boolean value) {
-            this.showBoxes = value;
-        }
-
-        /**
-         * Gets the value of the wrapAlignment property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Boolean }
-         *     
-         */
-        public Boolean isWrapAlignment() {
-            return wrapAlignment;
-        }
-
-        /**
-         * Sets the value of the wrapAlignment property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Boolean }
-         *     
-         */
-        public void setWrapAlignment(Boolean value) {
-            this.wrapAlignment = value;
-        }
-
-        /**
-         * Gets the value of the renderGaps property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Boolean }
-         *     
-         */
-        public Boolean isRenderGaps() {
-            return renderGaps;
-        }
-
-        /**
-         * Sets the value of the renderGaps property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Boolean }
-         *     
-         */
-        public void setRenderGaps(Boolean value) {
-            this.renderGaps = value;
-        }
-
-        /**
-         * Gets the value of the showSequenceFeatures property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Boolean }
-         *     
-         */
-        public Boolean isShowSequenceFeatures() {
-            return showSequenceFeatures;
-        }
-
-        /**
-         * Sets the value of the showSequenceFeatures property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Boolean }
-         *     
-         */
-        public void setShowSequenceFeatures(Boolean value) {
-            this.showSequenceFeatures = value;
-        }
-
-        /**
-         * Gets the value of the showNPfeatureTooltip property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Boolean }
-         *     
-         */
-        public Boolean isShowNPfeatureTooltip() {
-            return showNPfeatureTooltip;
-        }
-
-        /**
-         * Sets the value of the showNPfeatureTooltip property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Boolean }
-         *     
-         */
-        public void setShowNPfeatureTooltip(Boolean value) {
-            this.showNPfeatureTooltip = value;
-        }
-
-        /**
-         * Gets the value of the showDbRefTooltip property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Boolean }
-         *     
-         */
-        public Boolean isShowDbRefTooltip() {
-            return showDbRefTooltip;
-        }
-
-        /**
-         * Sets the value of the showDbRefTooltip property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Boolean }
-         *     
-         */
-        public void setShowDbRefTooltip(Boolean value) {
-            this.showDbRefTooltip = value;
-        }
-
-        /**
-         * Gets the value of the followHighlight property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Boolean }
-         *     
-         */
-        public boolean isFollowHighlight() {
-            if (followHighlight == null) {
-                return true;
-            } else {
-                return followHighlight;
-            }
-        }
-
-        /**
-         * Sets the value of the followHighlight property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Boolean }
-         *     
-         */
-        public void setFollowHighlight(Boolean value) {
-            this.followHighlight = value;
-        }
-
-        /**
-         * Gets the value of the followSelection property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Boolean }
-         *     
-         */
-        public boolean isFollowSelection() {
-            if (followSelection == null) {
-                return true;
-            } else {
-                return followSelection;
-            }
-        }
-
-        /**
-         * Sets the value of the followSelection property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Boolean }
-         *     
-         */
-        public void setFollowSelection(Boolean value) {
-            this.followSelection = value;
-        }
-
-        /**
-         * Gets the value of the showAnnotation property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Boolean }
-         *     
-         */
-        public Boolean isShowAnnotation() {
-            return showAnnotation;
-        }
-
-        /**
-         * Sets the value of the showAnnotation property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Boolean }
-         *     
-         */
-        public void setShowAnnotation(Boolean value) {
-            this.showAnnotation = value;
-        }
-
-        /**
-         * Gets the value of the centreColumnLabels property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Boolean }
-         *     
-         */
-        public boolean isCentreColumnLabels() {
-            if (centreColumnLabels == null) {
-                return false;
-            } else {
-                return centreColumnLabels;
-            }
-        }
-
-        /**
-         * Sets the value of the centreColumnLabels property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Boolean }
-         *     
-         */
-        public void setCentreColumnLabels(Boolean value) {
-            this.centreColumnLabels = value;
-        }
-
-        /**
-         * Gets the value of the showGroupConservation property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Boolean }
-         *     
-         */
-        public boolean isShowGroupConservation() {
-            if (showGroupConservation == null) {
-                return false;
-            } else {
-                return showGroupConservation;
-            }
-        }
-
-        /**
-         * Sets the value of the showGroupConservation property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Boolean }
-         *     
-         */
-        public void setShowGroupConservation(Boolean value) {
-            this.showGroupConservation = value;
-        }
-
-        /**
-         * Gets the value of the showGroupConsensus property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Boolean }
-         *     
-         */
-        public boolean isShowGroupConsensus() {
-            if (showGroupConsensus == null) {
-                return false;
-            } else {
-                return showGroupConsensus;
-            }
-        }
-
-        /**
-         * Sets the value of the showGroupConsensus property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Boolean }
-         *     
-         */
-        public void setShowGroupConsensus(Boolean value) {
-            this.showGroupConsensus = value;
-        }
-
-        /**
-         * Gets the value of the showConsensusHistogram property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Boolean }
-         *     
-         */
-        public boolean isShowConsensusHistogram() {
-            if (showConsensusHistogram == null) {
-                return true;
-            } else {
-                return showConsensusHistogram;
-            }
-        }
-
-        /**
-         * Sets the value of the showConsensusHistogram property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Boolean }
-         *     
-         */
-        public void setShowConsensusHistogram(Boolean value) {
-            this.showConsensusHistogram = value;
-        }
-
-        /**
-         * Gets the value of the showSequenceLogo property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Boolean }
-         *     
-         */
-        public boolean isShowSequenceLogo() {
-            if (showSequenceLogo == null) {
-                return false;
-            } else {
-                return showSequenceLogo;
-            }
-        }
-
-        /**
-         * Sets the value of the showSequenceLogo property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Boolean }
-         *     
-         */
-        public void setShowSequenceLogo(Boolean value) {
-            this.showSequenceLogo = value;
-        }
-
-        /**
-         * Gets the value of the normaliseSequenceLogo property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Boolean }
-         *     
-         */
-        public boolean isNormaliseSequenceLogo() {
-            if (normaliseSequenceLogo == null) {
-                return false;
-            } else {
-                return normaliseSequenceLogo;
-            }
-        }
-
-        /**
-         * Sets the value of the normaliseSequenceLogo property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Boolean }
-         *     
-         */
-        public void setNormaliseSequenceLogo(Boolean value) {
-            this.normaliseSequenceLogo = value;
-        }
-
-        /**
-         * Gets the value of the ignoreGapsinConsensus property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Boolean }
-         *     
-         */
-        public boolean isIgnoreGapsinConsensus() {
-            if (ignoreGapsinConsensus == null) {
-                return true;
-            } else {
-                return ignoreGapsinConsensus;
-            }
-        }
-
-        /**
-         * Sets the value of the ignoreGapsinConsensus property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Boolean }
-         *     
-         */
-        public void setIgnoreGapsinConsensus(Boolean value) {
-            this.ignoreGapsinConsensus = value;
-        }
-
-        /**
-         * Gets the value of the startRes property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Integer }
-         *     
-         */
-        public Integer getStartRes() {
-            return startRes;
-        }
-
-        /**
-         * Sets the value of the startRes property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Integer }
-         *     
-         */
-        public void setStartRes(Integer value) {
-            this.startRes = value;
-        }
-
-        /**
-         * Gets the value of the startSeq property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Integer }
-         *     
-         */
-        public Integer getStartSeq() {
-            return startSeq;
-        }
-
-        /**
-         * Sets the value of the startSeq property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Integer }
-         *     
-         */
-        public void setStartSeq(Integer value) {
-            this.startSeq = value;
-        }
-
-        /**
-         * Gets the value of the fontName property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link String }
-         *     
-         */
-        public String getFontName() {
-            return fontName;
-        }
-
-        /**
-         * Sets the value of the fontName property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link String }
-         *     
-         */
-        public void setFontName(String value) {
-            this.fontName = value;
-        }
-
-        /**
-         * Gets the value of the fontSize property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Integer }
-         *     
-         */
-        public Integer getFontSize() {
-            return fontSize;
-        }
-
-        /**
-         * Sets the value of the fontSize property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Integer }
-         *     
-         */
-        public void setFontSize(Integer value) {
-            this.fontSize = value;
-        }
-
-        /**
-         * Gets the value of the fontStyle property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Integer }
-         *     
-         */
-        public Integer getFontStyle() {
-            return fontStyle;
-        }
-
-        /**
-         * Sets the value of the fontStyle property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Integer }
-         *     
-         */
-        public void setFontStyle(Integer value) {
-            this.fontStyle = value;
-        }
-
-        /**
-         * Gets the value of the scaleProteinAsCdna property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Boolean }
-         *     
-         */
-        public boolean isScaleProteinAsCdna() {
-            if (scaleProteinAsCdna == null) {
-                return true;
-            } else {
-                return scaleProteinAsCdna;
-            }
-        }
-
-        /**
-         * Sets the value of the scaleProteinAsCdna property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Boolean }
-         *     
-         */
-        public void setScaleProteinAsCdna(Boolean value) {
-            this.scaleProteinAsCdna = value;
-        }
-
-        /**
-         * Gets the value of the viewName property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link String }
-         *     
-         */
-        public String getViewName() {
-            return viewName;
-        }
-
-        /**
-         * Sets the value of the viewName property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link String }
-         *     
-         */
-        public void setViewName(String value) {
-            this.viewName = value;
-        }
-
-        /**
-         * Gets the value of the sequenceSetId property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link String }
-         *     
-         */
-        public String getSequenceSetId() {
-            return sequenceSetId;
-        }
-
-        /**
-         * Sets the value of the sequenceSetId property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link String }
-         *     
-         */
-        public void setSequenceSetId(String value) {
-            this.sequenceSetId = value;
-        }
-
-        /**
-         * Gets the value of the gatheredViews property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Boolean }
-         *     
-         */
-        public Boolean isGatheredViews() {
-            return gatheredViews;
-        }
-
-        /**
-         * Sets the value of the gatheredViews property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Boolean }
-         *     
-         */
-        public void setGatheredViews(Boolean value) {
-            this.gatheredViews = value;
-        }
-
-        /**
-         * Gets the value of the textCol1 property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Integer }
-         *     
-         */
-        public Integer getTextCol1() {
-            return textCol1;
-        }
-
-        /**
-         * Sets the value of the textCol1 property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Integer }
-         *     
-         */
-        public void setTextCol1(Integer value) {
-            this.textCol1 = value;
-        }
-
-        /**
-         * Gets the value of the textCol2 property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Integer }
-         *     
-         */
-        public Integer getTextCol2() {
-            return textCol2;
-        }
-
-        /**
-         * Sets the value of the textCol2 property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Integer }
-         *     
-         */
-        public void setTextCol2(Integer value) {
-            this.textCol2 = value;
-        }
-
-        /**
-         * Gets the value of the textColThreshold property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Integer }
-         *     
-         */
-        public Integer getTextColThreshold() {
-            return textColThreshold;
-        }
-
-        /**
-         * Sets the value of the textColThreshold property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Integer }
-         *     
-         */
-        public void setTextColThreshold(Integer value) {
-            this.textColThreshold = value;
-        }
-
-        /**
-         * Gets the value of the id property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link String }
-         *     
-         */
-        public String getId() {
-            return id;
-        }
-
-        /**
-         * Sets the value of the id property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link String }
-         *     
-         */
-        public void setId(String value) {
-            this.id = value;
-        }
-
-        /**
-         * Gets the value of the complementId property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link String }
-         *     
-         */
-        public String getComplementId() {
-            return complementId;
-        }
-
-        /**
-         * Sets the value of the complementId property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link String }
-         *     
-         */
-        public void setComplementId(String value) {
-            this.complementId = value;
-        }
-
-        /**
-         * Gets the value of the width property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Integer }
-         *     
-         */
-        public Integer getWidth() {
-            return width;
-        }
-
-        /**
-         * Sets the value of the width property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Integer }
-         *     
-         */
-        public void setWidth(Integer value) {
-            this.width = value;
-        }
-
-        /**
-         * Gets the value of the height property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Integer }
-         *     
-         */
-        public Integer getHeight() {
-            return height;
-        }
-
-        /**
-         * Sets the value of the height property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Integer }
-         *     
-         */
-        public void setHeight(Integer value) {
-            this.height = value;
-        }
-
-        /**
-         * Gets the value of the xpos property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Integer }
-         *     
-         */
-        public Integer getXpos() {
-            return xpos;
-        }
-
-        /**
-         * Sets the value of the xpos property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Integer }
-         *     
-         */
-        public void setXpos(Integer value) {
-            this.xpos = value;
-        }
-
-        /**
-         * Gets the value of the ypos property.
-         * 
-         * @return
-         *     possible object is
-         *     {@link Integer }
-         *     
-         */
-        public Integer getYpos() {
-            return ypos;
-        }
-
-        /**
-         * Sets the value of the ypos property.
-         * 
-         * @param value
-         *     allowed object is
-         *     {@link Integer }
-         *     
-         */
-        public void setYpos(Integer value) {
-            this.ypos = value;
-        }
-
-
-        /**
-         * <p>Java class for anonymous complex type.
-         * 
-         * <p>The following schema fragment specifies the expected content contained within this class.
-         * 
-         * <pre>
-         * &lt;complexType>
-         *   &lt;complexContent>
-         *     &lt;extension base="{www.jalview.org/xml/wsparamset}WebServiceParameterSet">
-         *       &lt;attribute name="calcId" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
-         *       &lt;attribute name="needsUpdate" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
-         *       &lt;attribute name="autoUpdate" use="required" type="{http://www.w3.org/2001/XMLSchema}boolean" />
-         *     &lt;/extension>
-         *   &lt;/complexContent>
-         * &lt;/complexType>
-         * </pre>
-         * 
-         * 
-         */
-        @XmlAccessorType(XmlAccessType.FIELD)
-        @XmlType(name = "")
-        public static class CalcIdParam
-            extends WebServiceParameterSet
-        {
-
-            @XmlAttribute(name = "calcId", required = true)
-            protected String calcId;
-            @XmlAttribute(name = "needsUpdate")
-            protected Boolean needsUpdate;
-            @XmlAttribute(name = "autoUpdate", required = true)
-            protected boolean autoUpdate;
-
-            /**
-             * Gets the value of the calcId property.
-             * 
-             * @return
-             *     possible object is
-             *     {@link String }
-             *     
-             */
-            public String getCalcId() {
-                return calcId;
-            }
-
-            /**
-             * Sets the value of the calcId property.
-             * 
-             * @param value
-             *     allowed object is
-             *     {@link String }
-             *     
-             */
-            public void setCalcId(String value) {
-                this.calcId = value;
-            }
-
-            /**
-             * Gets the value of the needsUpdate property.
-             * 
-             * @return
-             *     possible object is
-             *     {@link Boolean }
-             *     
-             */
-            public boolean isNeedsUpdate() {
-                if (needsUpdate == null) {
-                    return false;
-                } else {
-                    return needsUpdate;
-                }
-            }
-
-            /**
-             * Sets the value of the needsUpdate property.
-             * 
-             * @param value
-             *     allowed object is
-             *     {@link Boolean }
-             *     
-             */
-            public void setNeedsUpdate(Boolean value) {
-                this.needsUpdate = value;
-            }
-
-            /**
-             * Gets the value of the autoUpdate property.
-             * 
-             */
-            public boolean isAutoUpdate() {
-                return autoUpdate;
-            }
-
-            /**
-             * Sets the value of the autoUpdate property.
-             * 
-             */
-            public void setAutoUpdate(boolean value) {
-                this.autoUpdate = value;
-            }
-
-        }
-
-
-        /**
-         * <p>Java class for anonymous complex type.
-         * 
-         * <p>The following schema fragment specifies the expected content contained within this class.
-         * 
-         * <pre>
-         * &lt;complexType>
-         *   &lt;complexContent>
-         *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
-         *       &lt;attribute name="start" type="{http://www.w3.org/2001/XMLSchema}int" />
-         *       &lt;attribute name="end" type="{http://www.w3.org/2001/XMLSchema}int" />
-         *     &lt;/restriction>
-         *   &lt;/complexContent>
-         * &lt;/complexType>
-         * </pre>
-         * 
-         * 
-         */
-        @XmlAccessorType(XmlAccessType.FIELD)
-        @XmlType(name = "")
-        public static class HiddenColumns {
-
-            @XmlAttribute(name = "start")
-            protected Integer start;
-            @XmlAttribute(name = "end")
-            protected Integer end;
-
-            /**
-             * Gets the value of the start property.
-             * 
-             * @return
-             *     possible object is
-             *     {@link Integer }
-             *     
-             */
-            public Integer getStart() {
-                return start;
-            }
-
-            /**
-             * Sets the value of the start property.
-             * 
-             * @param value
-             *     allowed object is
-             *     {@link Integer }
-             *     
-             */
-            public void setStart(Integer value) {
-                this.start = value;
-            }
-
-            /**
-             * Gets the value of the end property.
-             * 
-             * @return
-             *     possible object is
-             *     {@link Integer }
-             *     
-             */
-            public Integer getEnd() {
-                return end;
-            }
-
-            /**
-             * Sets the value of the end property.
-             * 
-             * @param value
-             *     allowed object is
-             *     {@link Integer }
-             *     
-             */
-            public void setEnd(Integer value) {
-                this.end = value;
-            }
-
-        }
-
-    }
-
-}
index 04eda42..d3e14c7 100755 (executable)
@@ -36,7 +36,7 @@ import java.util.Vector;
 
 public class PDBfile extends StructureFile
 {
-  private static String CALC_ID_PREFIX = "JalviewPDB";
+  private final static String CALC_ID_PREFIX = "JalviewPDB";
 
   public PDBfile(boolean addAlignmentAnnotations,
           boolean predictSecondaryStructure, boolean externalSecStr)
@@ -77,15 +77,15 @@ public class PDBfile extends StructureFile
     setId(safeName(getDataName()));
 
     setChains(new Vector<PDBChain>());
-    List<SequenceI> rna = new ArrayList<SequenceI>();
-    List<SequenceI> prot = new ArrayList<SequenceI>();
+    List<SequenceI> rna = new ArrayList<>();
+    List<SequenceI> prot = new ArrayList<>();
     PDBChain tmpchain;
     String line = null;
     boolean modelFlag = false;
     boolean terFlag = false;
     String lastID = "";
 
-    int indexx = 0;
+    // int indexx = 0;
     String atomnam = null;
     try
     {
index fe6d962..313ec1c 100644 (file)
@@ -119,7 +119,6 @@ import java.util.Map;
  * 
  */
 public class EpsGraphics2D extends java.awt.Graphics2D
-        implements AutoCloseable
 {
 
   public static final String VERSION = "0.8.8";
@@ -251,7 +250,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
    * OutputStream is automatically flushed before being closed. If you forget to
    * do this, the file may be incomplete.
    */
-  @Override
   public void close() throws IOException
   {
     flush();
@@ -404,7 +402,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
    * Draws a 3D rectangle outline. If it is raised, light appears to come from
    * the top left.
    */
-  @Override
   public void draw3DRect(int x, int y, int width, int height, boolean raised)
   {
     Color originalColor = getColor();
@@ -444,7 +441,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
    * Fills a 3D rectangle. If raised, it has bright fill and light appears to
    * come from the top left.
    */
-  @Override
   public void fill3DRect(int x, int y, int width, int height, boolean raised)
   {
     Color originalColor = getColor();
@@ -465,7 +461,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Draws a Shape on the EPS document.
    */
-  @Override
   public void draw(Shape s)
   {
     draw(s, "stroke");
@@ -474,7 +469,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Draws an Image on the EPS document.
    */
-  @Override
   public boolean drawImage(Image img, AffineTransform xform,
           ImageObserver obs)
   {
@@ -488,7 +482,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Draws a BufferedImage on the EPS document.
    */
-  @Override
   public void drawImage(BufferedImage img, BufferedImageOp op, int x, int y)
   {
     BufferedImage img1 = op.filter(img, null);
@@ -498,7 +491,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Draws a RenderedImage on the EPS document.
    */
-  @Override
   public void drawRenderedImage(RenderedImage img, AffineTransform xform)
   {
     Hashtable properties = new Hashtable();
@@ -521,7 +513,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Draws a RenderableImage by invoking its createDefaultRendering method.
    */
-  @Override
   public void drawRenderableImage(RenderableImage img, AffineTransform xform)
   {
     drawRenderedImage(img.createDefaultRendering(), xform);
@@ -530,7 +521,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Draws a string at (x,y)
    */
-  @Override
   public void drawString(String str, int x, int y)
   {
     drawString(str, (float) x, (float) y);
@@ -539,7 +529,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Draws a string at (x,y)
    */
-  @Override
   public void drawString(String s, float x, float y)
   {
     if (s != null && s.length() > 0)
@@ -554,7 +543,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
    * Draws the characters of an AttributedCharacterIterator, starting from
    * (x,y).
    */
-  @Override
   public void drawString(AttributedCharacterIterator iterator, int x, int y)
   {
     drawString(iterator, (float) x, (float) y);
@@ -564,7 +552,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
    * Draws the characters of an AttributedCharacterIterator, starting from
    * (x,y).
    */
-  @Override
   public void drawString(AttributedCharacterIterator iterator, float x,
           float y)
   {
@@ -597,7 +584,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Draws a GlyphVector at (x,y)
    */
-  @Override
   public void drawGlyphVector(GlyphVector g, float x, float y)
   {
     Shape shape = g.getOutline(x, y);
@@ -607,7 +593,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Fills a Shape on the EPS document.
    */
-  @Override
   public void fill(Shape s)
   {
     draw(s, "fill");
@@ -617,7 +602,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
    * Checks whether or not the specified Shape intersects the specified
    * Rectangle, which is in device space.
    */
-  @Override
   public boolean hit(Rectangle rect, Shape s, boolean onStroke)
   {
     return s.intersects(rect);
@@ -626,7 +610,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Returns the device configuration associated with this EpsGraphics2D object.
    */
-  @Override
   public GraphicsConfiguration getDeviceConfiguration()
   {
     GraphicsConfiguration gc = null;
@@ -649,7 +632,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
    * Sets the Composite to be used by this EpsGraphics2D. EpsGraphics2D does not
    * make use of these.
    */
-  @Override
   public void setComposite(Composite comp)
   {
     _composite = comp;
@@ -659,7 +641,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
    * Sets the Paint attribute for the EpsGraphics2D object. Only Paint objects
    * of type Color are respected by EpsGraphics2D.
    */
-  @Override
   public void setPaint(Paint paint)
   {
     _paint = paint;
@@ -673,7 +654,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
    * Sets the stroke. Only accepts BasicStroke objects (or subclasses of
    * BasicStroke).
    */
-  @Override
   public void setStroke(Stroke s)
   {
     if (s instanceof BasicStroke)
@@ -708,7 +688,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Sets a rendering hint. These are not used by EpsGraphics2D.
    */
-  @Override
   public void setRenderingHint(RenderingHints.Key hintKey, Object hintValue)
   {
     // Do nothing.
@@ -718,7 +697,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
    * Returns the value of a single preference for the rendering algorithms.
    * Rendering hints are not used by EpsGraphics2D.
    */
-  @Override
   public Object getRenderingHint(RenderingHints.Key hintKey)
   {
     return null;
@@ -727,7 +705,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Sets the rendering hints. These are ignored by EpsGraphics2D.
    */
-  @Override
   public void setRenderingHints(Map hints)
   {
     // Do nothing.
@@ -736,7 +713,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Adds rendering hints. These are ignored by EpsGraphics2D.
    */
-  @Override
   public void addRenderingHints(Map hints)
   {
     // Do nothing.
@@ -745,7 +721,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Returns the preferences for the rendering algorithms.
    */
-  @Override
   public RenderingHints getRenderingHints()
   {
     return new RenderingHints(null);
@@ -755,7 +730,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
    * Translates the origin of the EpsGraphics2D context to the point (x,y) in
    * the current coordinate system.
    */
-  @Override
   public void translate(int x, int y)
   {
     translate((double) x, (double) y);
@@ -765,7 +739,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
    * Concatenates the current EpsGraphics2D Transformation with a translation
    * transform.
    */
-  @Override
   public void translate(double tx, double ty)
   {
     transform(AffineTransform.getTranslateInstance(tx, ty));
@@ -774,7 +747,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Concatenates the current EpsGraphics2D Transform with a rotation transform.
    */
-  @Override
   public void rotate(double theta)
   {
     rotate(theta, 0, 0);
@@ -784,7 +756,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
    * Concatenates the current EpsGraphics2D Transform with a translated rotation
    * transform.
    */
-  @Override
   public void rotate(double theta, double x, double y)
   {
     transform(AffineTransform.getRotateInstance(theta, x, y));
@@ -794,7 +765,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
    * Concatenates the current EpsGraphics2D Transform with a scaling
    * transformation.
    */
-  @Override
   public void scale(double sx, double sy)
   {
     transform(AffineTransform.getScaleInstance(sx, sy));
@@ -803,7 +773,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Concatenates the current EpsGraphics2D Transform with a shearing transform.
    */
-  @Override
   public void shear(double shx, double shy)
   {
     transform(AffineTransform.getShearInstance(shx, shy));
@@ -813,7 +782,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
    * Composes an AffineTransform object with the Transform in this EpsGraphics2D
    * according to the rule last-specified-first-applied.
    */
-  @Override
   public void transform(AffineTransform Tx)
   {
     _transform.concatenate(Tx);
@@ -823,7 +791,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Sets the AffineTransform to be used by this EpsGraphics2D.
    */
-  @Override
   public void setTransform(AffineTransform Tx)
   {
     if (Tx == null)
@@ -842,7 +809,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Gets the AffineTransform used by this EpsGraphics2D.
    */
-  @Override
   public AffineTransform getTransform()
   {
     return new AffineTransform(_transform);
@@ -851,7 +817,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Returns the current Paint of the EpsGraphics2D object.
    */
-  @Override
   public Paint getPaint()
   {
     return _paint;
@@ -860,7 +825,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * returns the current Composite of the EpsGraphics2D object.
    */
-  @Override
   public Composite getComposite()
   {
     return _composite;
@@ -869,7 +833,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Sets the background color to be used by the clearRect method.
    */
-  @Override
   public void setBackground(Color color)
   {
     if (color == null)
@@ -882,7 +845,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Gets the background color that is used by the clearRect method.
    */
-  @Override
   public Color getBackground()
   {
     return _backgroundColor;
@@ -892,7 +854,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
    * Returns the Stroke currently used. Guaranteed to be an instance of
    * BasicStroke.
    */
-  @Override
   public Stroke getStroke()
   {
     return _stroke;
@@ -902,7 +863,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
    * Intersects the current clip with the interior of the specified Shape and
    * sets the clip to the resulting intersection.
    */
-  @Override
   public void clip(Shape s)
   {
     if (_clip == null)
@@ -920,7 +880,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Returns the FontRenderContext.
    */
-  @Override
   public FontRenderContext getFontRenderContext()
   {
     return _fontRenderContext;
@@ -931,7 +890,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Returns a new Graphics object that is identical to this EpsGraphics2D.
    */
-  @Override
   public Graphics create()
   {
     return new EpsGraphics2D(this);
@@ -941,7 +899,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
    * Returns an EpsGraphics2D object based on this Graphics object, but with a
    * new translation and clip area.
    */
-  @Override
   public Graphics create(int x, int y, int width, int height)
   {
     Graphics g = create();
@@ -954,7 +911,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
    * Returns the current Color. This will be a default value (black) until it is
    * changed using the setColor method.
    */
-  @Override
   public Color getColor()
   {
     return _color;
@@ -963,7 +919,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Sets the Color to be used when drawing all future shapes, text, etc.
    */
-  @Override
   public void setColor(Color c)
   {
     if (c == null)
@@ -979,7 +934,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
    * Sets the paint mode of this EpsGraphics2D object to overwrite the
    * destination EpsDocument with the current color.
    */
-  @Override
   public void setPaintMode()
   {
     // Do nothing - paint mode is the only method supported anyway.
@@ -989,7 +943,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
    * <b><i><font color="red">Not implemented</font></i></b> - performs no
    * action.
    */
-  @Override
   public void setXORMode(Color c1)
   {
     methodNotSupported();
@@ -998,7 +951,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Returns the Font currently being used.
    */
-  @Override
   public Font getFont()
   {
     return _font;
@@ -1007,7 +959,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Sets the Font to be used in future text.
    */
-  @Override
   public void setFont(Font font)
   {
     if (font == null)
@@ -1015,14 +966,13 @@ public class EpsGraphics2D extends java.awt.Graphics2D
       font = Font.decode(null);
     }
     _font = font;
-    append("/" + _font.getPSName() + " findfont " + (_font.getSize())
+    append("/" + _font.getPSName() + " findfont " + ((int) _font.getSize())
             + " scalefont setfont");
   }
 
   /**
    * Gets the font metrics of the current font.
    */
-  @Override
   public FontMetrics getFontMetrics()
   {
     return getFontMetrics(getFont());
@@ -1031,7 +981,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Gets the font metrics for the specified font.
    */
-  @Override
   public FontMetrics getFontMetrics(Font f)
   {
     BufferedImage image = new BufferedImage(1, 1,
@@ -1043,7 +992,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Returns the bounding rectangle of the current clipping area.
    */
-  @Override
   public Rectangle getClipBounds()
   {
     if (_clip == null)
@@ -1057,7 +1005,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Intersects the current clip with the specified rectangle.
    */
-  @Override
   public void clipRect(int x, int y, int width, int height)
   {
     clip(new Rectangle(x, y, width, height));
@@ -1066,7 +1013,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Sets the current clip to the rectangle specified by the given coordinates.
    */
-  @Override
   public void setClip(int x, int y, int width, int height)
   {
     setClip(new Rectangle(x, y, width, height));
@@ -1075,7 +1021,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Gets the current clipping area.
    */
-  @Override
   public Shape getClip()
   {
     if (_clip == null)
@@ -1101,7 +1046,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Sets the current clipping area to an arbitrary clip shape.
    */
-  @Override
   public void setClip(Shape clip)
   {
     if (clip != null)
@@ -1135,7 +1079,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
    * <b><i><font color="red">Not implemented</font></i></b> - performs no
    * action.
    */
-  @Override
   public void copyArea(int x, int y, int width, int height, int dx, int dy)
   {
     methodNotSupported();
@@ -1144,7 +1087,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Draws a straight line from (x1,y1) to (x2,y2).
    */
-  @Override
   public void drawLine(int x1, int y1, int x2, int y2)
   {
     Shape shape = new Line2D.Float(x1, y1, x2, y2);
@@ -1154,7 +1096,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Fills a rectangle with top-left corner placed at (x,y).
    */
-  @Override
   public void fillRect(int x, int y, int width, int height)
   {
     Shape shape = new Rectangle(x, y, width, height);
@@ -1164,7 +1105,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Draws a rectangle with top-left corner placed at (x,y).
    */
-  @Override
   public void drawRect(int x, int y, int width, int height)
   {
     Shape shape = new Rectangle(x, y, width, height);
@@ -1175,7 +1115,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
    * Clears a rectangle with top-left corner placed at (x,y) using the current
    * background color.
    */
-  @Override
   public void clearRect(int x, int y, int width, int height)
   {
     Color originalColor = getColor();
@@ -1190,7 +1129,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Draws a rounded rectangle.
    */
-  @Override
   public void drawRoundRect(int x, int y, int width, int height,
           int arcWidth, int arcHeight)
   {
@@ -1202,7 +1140,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Fills a rounded rectangle.
    */
-  @Override
   public void fillRoundRect(int x, int y, int width, int height,
           int arcWidth, int arcHeight)
   {
@@ -1214,7 +1151,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Draws an oval.
    */
-  @Override
   public void drawOval(int x, int y, int width, int height)
   {
     Shape shape = new Ellipse2D.Float(x, y, width, height);
@@ -1224,7 +1160,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Fills an oval.
    */
-  @Override
   public void fillOval(int x, int y, int width, int height)
   {
     Shape shape = new Ellipse2D.Float(x, y, width, height);
@@ -1234,7 +1169,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Draws an arc.
    */
-  @Override
   public void drawArc(int x, int y, int width, int height, int startAngle,
           int arcAngle)
   {
@@ -1246,7 +1180,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Fills an arc.
    */
-  @Override
   public void fillArc(int x, int y, int width, int height, int startAngle,
           int arcAngle)
   {
@@ -1258,7 +1191,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Draws a polyline.
    */
-  @Override
   public void drawPolyline(int[] xPoints, int[] yPoints, int nPoints)
   {
     if (nPoints > 0)
@@ -1276,7 +1208,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Draws a polygon made with the specified points.
    */
-  @Override
   public void drawPolygon(int[] xPoints, int[] yPoints, int nPoints)
   {
     Shape shape = new Polygon(xPoints, yPoints, nPoints);
@@ -1286,7 +1217,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Draws a polygon.
    */
-  @Override
   public void drawPolygon(Polygon p)
   {
     draw(p);
@@ -1295,7 +1225,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Fills a polygon made with the specified points.
    */
-  @Override
   public void fillPolygon(int[] xPoints, int[] yPoints, int nPoints)
   {
     Shape shape = new Polygon(xPoints, yPoints, nPoints);
@@ -1305,7 +1234,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Fills a polygon.
    */
-  @Override
   public void fillPolygon(Polygon p)
   {
     draw(p, "fill");
@@ -1314,7 +1242,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Draws the specified characters, starting from (x,y)
    */
-  @Override
   public void drawChars(char[] data, int offset, int length, int x, int y)
   {
     String string = new String(data, offset, length);
@@ -1324,7 +1251,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Draws the specified bytes, starting from (x,y)
    */
-  @Override
   public void drawBytes(byte[] data, int offset, int length, int x, int y)
   {
     String string = new String(data, offset, length);
@@ -1334,7 +1260,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Draws an image.
    */
-  @Override
   public boolean drawImage(Image img, int x, int y, ImageObserver observer)
   {
     return drawImage(img, x, y, Color.white, observer);
@@ -1343,7 +1268,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Draws an image.
    */
-  @Override
   public boolean drawImage(Image img, int x, int y, int width, int height,
           ImageObserver observer)
   {
@@ -1353,7 +1277,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Draws an image.
    */
-  @Override
   public boolean drawImage(Image img, int x, int y, Color bgcolor,
           ImageObserver observer)
   {
@@ -1365,7 +1288,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Draws an image.
    */
-  @Override
   public boolean drawImage(Image img, int x, int y, int width, int height,
           Color bgcolor, ImageObserver observer)
   {
@@ -1376,7 +1298,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Draws an image.
    */
-  @Override
   public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2,
           int sx1, int sy1, int sx2, int sy2, ImageObserver observer)
   {
@@ -1387,7 +1308,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Draws an image.
    */
-  @Override
   public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2,
           int sx1, int sy1, int sx2, int sy2, Color bgcolor,
           ImageObserver observer)
@@ -1483,29 +1403,24 @@ public class EpsGraphics2D extends java.awt.Graphics2D
    * only remaining EpsGraphics2D instance pointing at a EpsDocument object,
    * then the EpsDocument object shall become eligible for garbage collection.
    */
-  @Override
   public void dispose()
   {
     _document = null;
   }
 
-  /* bsoares 2019-03-20
-   * finalize is now deprecated. Implementing AutoCloseable instead
   /**
    * Finalizes the object.
-  @Override
+   */
   public void finalize()
   {
     super.finalize();
   }
-   */
 
   /**
    * Returns the entire contents of the EPS document, complete with headers and
    * bounding box. The returned String is suitable for being written directly to
    * disk as an EPS file.
    */
-  @Override
   public String toString()
   {
     StringWriter writer = new StringWriter();
@@ -1525,7 +1440,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
    * Returns true if the specified rectangular area might intersect the current
    * clipping area.
    */
-  @Override
   public boolean hitClip(int x, int y, int width, int height)
   {
     if (_clip == null)
@@ -1539,7 +1453,6 @@ public class EpsGraphics2D extends java.awt.Graphics2D
   /**
    * Returns the bounding rectangle of the current clipping area.
    */
-  @Override
   public Rectangle getClipBounds(Rectangle r)
   {
     if (_clip == null)
index ba8f8b0..fe1c70c 100755 (executable)
@@ -296,8 +296,8 @@ public class InputParams implements java.io.Serializable
     {
       _hashCode += getMatrix().hashCode();
     }
-    _hashCode += Float.valueOf(getExp()).hashCode();
-    _hashCode += Boolean.valueOf(isEchofilter()).hashCode();
+    _hashCode += new Float(getExp()).hashCode();
+    _hashCode += new Boolean(isEchofilter()).hashCode();
     if (getFilter() != null)
     {
       _hashCode += getFilter().hashCode();
@@ -325,7 +325,7 @@ public class InputParams implements java.io.Serializable
       _hashCode += getOutformat().hashCode();
     }
     _hashCode += getTopcombon();
-    _hashCode += Boolean.valueOf(isAsync()).hashCode();
+    _hashCode += new Boolean(isAsync()).hashCode();
     if (getEmail() != null)
     {
       _hashCode += getEmail().hashCode();
index f06a80a..5391221 100644 (file)
@@ -285,7 +285,7 @@ public class AccessionMapperBindingStub extends org.apache.axis.client.Stub
     setAttachments(_call);
     java.lang.Object _resp = _call.invoke(new java.lang.Object[] {
         sequence, searchDatabases, taxonId,
-        java.lang.Boolean.valueOf(onlyActive) });
+        new java.lang.Boolean(onlyActive) });
 
     if (_resp instanceof java.rmi.RemoteException)
     {
@@ -332,7 +332,7 @@ public class AccessionMapperBindingStub extends org.apache.axis.client.Stub
     setAttachments(_call);
     java.lang.Object _resp = _call.invoke(new java.lang.Object[] {
         accession, ac_version, searchDatabases, taxonId,
-        java.lang.Boolean.valueOf(onlyActive) });
+        new java.lang.Boolean(onlyActive) });
 
     if (_resp instanceof java.rmi.RemoteException)
     {
index f252799..c8c7341 100644 (file)
Binary files a/utils/jalviewjs/SwingJS-site.zip and b/utils/jalviewjs/SwingJS-site.zip differ
index 54e0f0c..87df1d9 100644 (file)
Binary files a/utils/jalviewjs/eclipse/dropins/net.sf.j2s.core.jar and b/utils/jalviewjs/eclipse/dropins/net.sf.j2s.core.jar differ
diff --git a/utils/jalviewjs/site-resources/applets-nocore.html b/utils/jalviewjs/site-resources/applets-nocore.html
new file mode 100644 (file)
index 0000000..f63f78d
--- /dev/null
@@ -0,0 +1,230 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>SwingJS test Jalview</title>
+<meta charset="utf-8" />
+<script src="swingjs/swingjs2.js"></script>
+<script src="swingjs/JalviewApplet.js"></script>
+<script>
+if (!self.SwingJS)alert('swingjs2.js was not found. It needs to be in swingjs folder in the same directory as ' + document.location.href)
+JalviewInfo = {
+       code: null,
+       main: "jalview.bin.Jalview",
+       core: "NONE",
+       //core:"_jalview",
+       resourcePath: "examples",
+       readyFunction: null,
+       serverURL: 'https://chemapps.stolaf.edu/jmol/jsmol/php/jsmol.php',
+       j2sPath: 'swingjs/j2s',
+       console:'sysout',
+       startButton:'Start Jalview',
+       hideDesktop:true,
+       embedInternalFrames:false,
+       idPrefix:'%ID%',
+       allowjavascript: true
+}
+</script>
+</head>
+<body>
+<!-- content template start
+JalviewApplet.js will add divs such as these:
+<div id="jalview0-desktop-div" style="width:0px;display:none"></div>
+<div id="jalview0-alignment-div" style="width:0px;display:none"></div>
+ -->
+<p align="left">
+<h2>JalviewJS Button Examples</h2>
+Try out JalviewJS by pressing one of the buttons below. 
+<a target="_blank" href="http://www.jalview.org/examples/applets.html">Original Java</a> (requires SeaMonkey browser)
+</p>
+<p>&nbsp;</p><div align="center">
+  <p align="center">
+    <h2>Ferredoxins, chloroplast precursor related UniRef50
+      cluster</h2>
+    <br /> (15 sequences x 150 residues)
+  </p>
+  <table width="90%">
+    <tr>
+      <td width="10%" valign="center">
+      <applet
+       code="jalview.bin.JalviewLite" width="140" height="35"
+       archive="jalviewApplet.jar,JmolApplet-14.6.4_2016.10.26.jar,java-json.jar,json_simple-1.1.jar">  
+       <param name="permissions" value="sandbox"/>
+       <param name="file" value="uniref50.fa"/>
+       <param name="treeFile" value="ferredoxin.nw"/>
+       <param name="userDefinedColour" value="C=yellow; R,K,H=FF5555; D,E=5555FF"/>
+       <param name="sortByTree" value="True"/>
+       <param name="showSequenceLogo" value="true"/>
+       <param name="showGroupConsensus" value="true"/>
+       <param name="showFullId" value="false"/>
+       <param name="linkLabel_1" value="Uniprot"/>
+       <param name="linkUrl_1" value="http://www.uniprot.org/uniprot/$SEQUENCE_ID$"/>
+       <param name="linkLabel_2" value="EMBL-EBI Search"/>
+       <param name="linkUrl_2" value="http://www.ebi.ac.uk/ebisearch/search.ebi?db=allebi&query=$SEQUENCE_ID$"/>
+       <param name="APPLICATION_URL" value="http://www.jalview.org/services/launchApp"/>
+     </applet>
+</td>
+      <td valign="center">User Defined Colours, loads an associated
+       Newick format tree file which is used to sort the alignment, and
+       group consensus and sequence logos are shown below the alignment.</td>
+    </tr>
+    <tr>
+      <td width="10%" valign="center"><applet
+   code="jalview.bin.JalviewLite" width="140" height="35"
+   archive="jalviewApplet.jar,JmolApplet-14.6.4_2016.10.26.jar,java-json.jar,json_simple-1.1.jar">
+<param name="permissions" value="sandbox"/>
+<param name="file" value="uniref50.fa"/>
+<param name="features" value="exampleFeatures.txt"/>
+<param name="showFullId" value="false"/>
+<param name="windowHeight" value="500"/>
+<param name="windowWidth" value="650"/>
+<param name="showFeatureSettings" value="true"/>
+<param name="wrap" value="true"/>
+<param name="showAnnotation" value="false"/>
+   <param name="linkLabel_1" value="Uniprot"/>
+   <param name="linkUrl_1"
+     value="http://www.uniprot.org/uniprot/$SEQUENCE_ID$"/>
+   <param name="linkLabel_2" value="EMBL-EBI Search"/>
+   <param name="linkUrl_2"
+     value="http://www.ebi.ac.uk/ebisearch/search.ebi?db=allebi&query=$SEQUENCE_ID$"/>
+   <param name="APPLICATION_URL"
+     value="http://www.jalview.org/services/launchApp"/>
+</applet>
+</td>
+      <td valign="center">Displays a features file on the alignment</td>
+    </tr>
+    <tr>
+      <td width="10%" valign="center"><applet
+   code="jalview.bin.JalviewLite" width="140" height="35"
+   archive="jalviewApplet.jar,JmolApplet-14.6.4_2016.10.26.jar,java-json.jar,json_simple-1.1.jar">
+<param name="permissions" value="sandbox"/>
+<param name="file" value="uniref50.fa"/>
+<param name="showFullId" value="false"/>
+<param name="windowHeight" value="500"/>
+<param name="windowWidth" value="650"/>
+<param name="wrap" value="true"/>
+<param name="debug" value="true"/>
+<param name="showAnnotation" value="false"/>
+<param name="defaultColour" value="Strand Propensity"/>
+<param name="PDBfile" value="1gaq.txt FER1_MAIZE"/>
+   <param name="linkLabel_1" value="Uniprot"/>
+   <param name="linkUrl_1"
+     value="http://www.uniprot.org/uniprot/$SEQUENCE_ID$"/>
+   <param name="linkLabel_2" value="EMBL-EBI Search"/>
+   <param name="linkUrl_2"
+     value="http://www.ebi.ac.uk/ebisearch/search.ebi?db=allebi&query=$SEQUENCE_ID$"/>
+   <param name="APPLICATION_URL"
+     value="http://www.jalview.org/services/launchApp"/>
+</applet>
+</td>
+      <td valign="center">Associates PDB file 1GAQ with sequence
+       FER1_MAIZE</td>
+    </tr>
+    <tr>
+      <td width="10%" valign="center"><applet
+   code="jalview.bin.JalviewLite" width="140" height="35"
+   archive="jalviewApplet.jar,JmolApplet-14.6.4_2016.10.26.jar,java-json.jar,json_simple-1.1.jar">
+<param name="permissions" value="sandbox"/>
+<param name="file" value="jpred_msa.fasta"/>
+<param name="jnetfile" value="jpred_msa.seq.concise"/>
+<param name="showFullId" value="false"/>
+<param name="windowHeight" value="515"/>
+<param name="windowWidth" value="650"/>
+<param name="showAnnotation" value="true"/>
+<param name="defaultColour" value="Clustal"/>
+   <param name="linkLabel_1" value="Uniprot"/>
+   <param name="linkUrl_1"
+     value="http://www.uniprot.org/uniprot/$SEQUENCE_ID$"/>
+   <param name="linkLabel_2" value="EMBL-EBI Search"/>
+   <param name="linkUrl_2"
+     value="http://www.ebi.ac.uk/ebisearch/search.ebi?db=allebi&query=$SEQUENCE_ID$"/>
+   <param name="APPLICATION_URL"
+     value="http://www.jalview.org/services/launchApp"/>
+</applet>
+                                                      </td>
+      <td valign="middle">Displays a Multiple Sequence Alignment
+       Based JPred Prediction for a Sequence</td>
+    </tr>
+  </table>
+  <p>
+    <h2>RF00031 RFAM Alignment with per sequence secondary
+      structure</h2>
+  </p>
+  <table width="90%">
+    <tr>
+      <td width="10%" valign="center"><applet
+   code="jalview.bin.JalviewLite" width="140" height="35"
+   archive="jalviewApplet.jar,JmolApplet-14.6.4_2016.10.26.jar,java-json.jar,json_simple-1.1.jar">
+<param name="permissions" value="sandbox"/>
+<param name="file" value="RF00031_folded.stk"/>
+<param name="showFullId" value="false"/>
+<param name="windowHeight" value="515"/>
+<param name="windowWidth" value="650"/>
+<param name="showAnnotation" value="true"/>
+<param name="defaultColour" value="Purine/Pyrimidine"/>
+   <param name="APPLICATION_URL"
+     value="http://www.jalview.org/services/launchApp"/>
+</applet>
+</td>
+      <td valign="center">Displays an RFAM RNA fold family with
+       secondary structure annotation</td>
+    </tr>
+  </table>
+  <p>
+    <h2>Linked Protein and cDNA alignments for a family of Steroid Receptors</h2>
+  </p>
+  <table width="90%">
+    <tr>
+      <td width="10%" valign="center">
+<applet
+   code="jalview.bin.JalviewLite" width="140" height="35"
+   archive="jalviewApplet.jar,JmolApplet-14.6.4_2016.10.26.jar,java-json.jar,json_simple-1.1.jar">
+<param name="permissions" value="sandbox"/>
+<param name="file2" value="estrogenReceptorCdna_frag.fa"/>
+<param name="file" value="estrogenReceptorProtein_frag.fa"/>
+<param name="enableSplitFrame" value="true"/>
+<param name="scaleProteinAsCdna" value="true"/>
+<param name="showFullId" value="false"/>
+<param name="windowHeight" value="300"/>
+<param name="windowWidth" value="800"/>
+<param name="showAnnotation" value="true"/>
+<param name="showSequenceLogo" value="true"/>
+<param name="defaultColourNuc" value="Purine/Pyrimidine"/>
+<param name="defaultColourProt" value="Clustal"/>
+   <param name="APPLICATION_URL"
+     value="http://www.jalview.org/services/launchApp"/>
+</applet>
+</td>
+      <td valign="center">Displays a split window view showing aligned protein
+        and a reconstructed cDNA alignment.<br />Proteins were aligned with <a
+        href="http://www.drive5.com/muscle">Muscle</a> (version 3.8.31,
+        via the Jalview Desktop).<br />Data retrieved from Uniprot and
+        ENA, after Thornton, Need and Crews, <a
+        href="http://dx.doi.org/10.1126/science.1086185">Science 19
+          September 2003: 301 (5640), 1714-1717</a>
+      </td>
+    </tr>
+  </table>
+</div>
+<div id="sysout" style="width:500px;height:300px;background:yellow;overflow:auto"></div>
+
+</body>
+</html>
+<!--
+ * 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.
+-->
+
diff --git a/utils/jalviewjs/site-resources/applets.html b/utils/jalviewjs/site-resources/applets.html
new file mode 100644 (file)
index 0000000..2496054
--- /dev/null
@@ -0,0 +1,230 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>SwingJS test Jalview</title>
+<meta charset="utf-8" />
+<script src="swingjs/swingjs2.js"></script>
+<script src="swingjs/JalviewApplet.js"></script>
+<script>
+if (!self.SwingJS)alert('swingjs2.js was not found. It needs to be in swingjs folder in the same directory as ' + document.location.href)
+JalviewInfo = {
+       code: null,
+       main: "jalview.bin.Jalview",
+       //core: "NONE",
+       core:"_jalview",
+       resourcePath: "examples",
+       readyFunction: null,
+       serverURL: 'https://chemapps.stolaf.edu/jmol/jsmol/php/jsmol.php',
+       j2sPath: 'swingjs/j2s',
+       console:'sysout',
+       startButton:'Start Jalview',
+       hideDesktop:true,
+       embedInternalFrames:false,
+       idPrefix:'%ID%',
+       allowJavascript: true
+}
+</script>
+</head>
+<body>
+<!-- content template start
+JalviewApplet.js will add divs such as these:
+<div id="jalview0-desktop-div" style="width:0px;display:none"></div>
+<div id="jalview0-alignment-div" style="width:0px;display:none"></div>
+ -->
+<p align="left">
+<h2>JalviewJS Button Examples</h2>
+Try out JalviewJS by pressing one of the buttons below. 
+<a target="_blank" href="http://www.jalview.org/examples/applets.html">Original Java</a> (requires SeaMonkey browser)
+</p>
+<p>&nbsp;</p><div align="center">
+  <p align="center">
+    <h2>Ferredoxins, chloroplast precursor related UniRef50
+      cluster</h2>
+    <br /> (15 sequences x 150 residues)
+  </p>
+  <table width="90%">
+    <tr>
+      <td width="10%" valign="center">
+      <applet
+       code="jalview.bin.JalviewLite" width="140" height="35"
+       archive="jalviewApplet.jar,JmolApplet-14.6.4_2016.10.26.jar,java-json.jar,json_simple-1.1.jar">  
+       <param name="permissions" value="sandbox"/>
+       <param name="file" value="uniref50.fa"/>
+       <param name="treeFile" value="ferredoxin.nw"/>
+       <param name="userDefinedColour" value="C=yellow; R,K,H=FF5555; D,E=5555FF"/>
+       <param name="sortByTree" value="True"/>
+       <param name="showSequenceLogo" value="true"/>
+       <param name="showGroupConsensus" value="true"/>
+       <param name="showFullId" value="false"/>
+       <param name="linkLabel_1" value="Uniprot"/>
+       <param name="linkUrl_1" value="http://www.uniprot.org/uniprot/$SEQUENCE_ID$"/>
+       <param name="linkLabel_2" value="EMBL-EBI Search"/>
+       <param name="linkUrl_2" value="http://www.ebi.ac.uk/ebisearch/search.ebi?db=allebi&query=$SEQUENCE_ID$"/>
+       <param name="APPLICATION_URL" value="http://www.jalview.org/services/launchApp"/>
+     </applet>
+</td>
+      <td valign="center">User Defined Colours, loads an associated
+       Newick format tree file which is used to sort the alignment, and
+       group consensus and sequence logos are shown below the alignment.</td>
+    </tr>
+    <tr>
+      <td width="10%" valign="center"><applet
+   code="jalview.bin.JalviewLite" width="140" height="35"
+   archive="jalviewApplet.jar,JmolApplet-14.6.4_2016.10.26.jar,java-json.jar,json_simple-1.1.jar">
+<param name="permissions" value="sandbox"/>
+<param name="file" value="uniref50.fa"/>
+<param name="features" value="exampleFeatures.txt"/>
+<param name="showFullId" value="false"/>
+<param name="windowHeight" value="500"/>
+<param name="windowWidth" value="650"/>
+<param name="showFeatureSettings" value="true"/>
+<param name="wrap" value="true"/>
+<param name="showAnnotation" value="false"/>
+   <param name="linkLabel_1" value="Uniprot"/>
+   <param name="linkUrl_1"
+     value="http://www.uniprot.org/uniprot/$SEQUENCE_ID$"/>
+   <param name="linkLabel_2" value="EMBL-EBI Search"/>
+   <param name="linkUrl_2"
+     value="http://www.ebi.ac.uk/ebisearch/search.ebi?db=allebi&query=$SEQUENCE_ID$"/>
+   <param name="APPLICATION_URL"
+     value="http://www.jalview.org/services/launchApp"/>
+</applet>
+</td>
+      <td valign="center">Displays a features file on the alignment</td>
+    </tr>
+    <tr>
+      <td width="10%" valign="center"><applet
+   code="jalview.bin.JalviewLite" width="140" height="35"
+   archive="jalviewApplet.jar,JmolApplet-14.6.4_2016.10.26.jar,java-json.jar,json_simple-1.1.jar">
+<param name="permissions" value="sandbox"/>
+<param name="file" value="uniref50.fa"/>
+<param name="showFullId" value="false"/>
+<param name="windowHeight" value="500"/>
+<param name="windowWidth" value="650"/>
+<param name="wrap" value="true"/>
+<param name="debug" value="true"/>
+<param name="showAnnotation" value="false"/>
+<param name="defaultColour" value="Strand Propensity"/>
+<param name="PDBfile" value="1gaq.txt FER1_MAIZE"/>
+   <param name="linkLabel_1" value="Uniprot"/>
+   <param name="linkUrl_1"
+     value="http://www.uniprot.org/uniprot/$SEQUENCE_ID$"/>
+   <param name="linkLabel_2" value="EMBL-EBI Search"/>
+   <param name="linkUrl_2"
+     value="http://www.ebi.ac.uk/ebisearch/search.ebi?db=allebi&query=$SEQUENCE_ID$"/>
+   <param name="APPLICATION_URL"
+     value="http://www.jalview.org/services/launchApp"/>
+</applet>
+</td>
+      <td valign="center">Associates PDB file 1GAQ with sequence
+       FER1_MAIZE</td>
+    </tr>
+    <tr>
+      <td width="10%" valign="center"><applet
+   code="jalview.bin.JalviewLite" width="140" height="35"
+   archive="jalviewApplet.jar,JmolApplet-14.6.4_2016.10.26.jar,java-json.jar,json_simple-1.1.jar">
+<param name="permissions" value="sandbox"/>
+<param name="file" value="jpred_msa.fasta"/>
+<param name="jnetfile" value="jpred_msa.seq.concise"/>
+<param name="showFullId" value="false"/>
+<param name="windowHeight" value="515"/>
+<param name="windowWidth" value="650"/>
+<param name="showAnnotation" value="true"/>
+<param name="defaultColour" value="Clustal"/>
+   <param name="linkLabel_1" value="Uniprot"/>
+   <param name="linkUrl_1"
+     value="http://www.uniprot.org/uniprot/$SEQUENCE_ID$"/>
+   <param name="linkLabel_2" value="EMBL-EBI Search"/>
+   <param name="linkUrl_2"
+     value="http://www.ebi.ac.uk/ebisearch/search.ebi?db=allebi&query=$SEQUENCE_ID$"/>
+   <param name="APPLICATION_URL"
+     value="http://www.jalview.org/services/launchApp"/>
+</applet>
+                                                      </td>
+      <td valign="middle">Displays a Multiple Sequence Alignment
+       Based JPred Prediction for a Sequence</td>
+    </tr>
+  </table>
+  <p>
+    <h2>RF00031 RFAM Alignment with per sequence secondary
+      structure</h2>
+  </p>
+  <table width="90%">
+    <tr>
+      <td width="10%" valign="center"><applet
+   code="jalview.bin.JalviewLite" width="140" height="35"
+   archive="jalviewApplet.jar,JmolApplet-14.6.4_2016.10.26.jar,java-json.jar,json_simple-1.1.jar">
+<param name="permissions" value="sandbox"/>
+<param name="file" value="RF00031_folded.stk"/>
+<param name="showFullId" value="false"/>
+<param name="windowHeight" value="515"/>
+<param name="windowWidth" value="650"/>
+<param name="showAnnotation" value="true"/>
+<param name="defaultColour" value="Purine/Pyrimidine"/>
+   <param name="APPLICATION_URL"
+     value="http://www.jalview.org/services/launchApp"/>
+</applet>
+</td>
+      <td valign="center">Displays an RFAM RNA fold family with
+       secondary structure annotation</td>
+    </tr>
+  </table>
+  <p>
+    <h2>Linked Protein and cDNA alignments for a family of Steroid Receptors</h2>
+  </p>
+  <table width="90%">
+    <tr>
+      <td width="10%" valign="center">
+<applet
+   code="jalview.bin.JalviewLite" width="140" height="35"
+   archive="jalviewApplet.jar,JmolApplet-14.6.4_2016.10.26.jar,java-json.jar,json_simple-1.1.jar">
+<param name="permissions" value="sandbox"/>
+<param name="file2" value="estrogenReceptorCdna_frag.fa"/>
+<param name="file" value="estrogenReceptorProtein_frag.fa"/>
+<param name="enableSplitFrame" value="true"/>
+<param name="scaleProteinAsCdna" value="true"/>
+<param name="showFullId" value="false"/>
+<param name="windowHeight" value="300"/>
+<param name="windowWidth" value="800"/>
+<param name="showAnnotation" value="true"/>
+<param name="showSequenceLogo" value="true"/>
+<param name="defaultColourNuc" value="Purine/Pyrimidine"/>
+<param name="defaultColourProt" value="Clustal"/>
+   <param name="APPLICATION_URL"
+     value="http://www.jalview.org/services/launchApp"/>
+</applet>
+</td>
+      <td valign="center">Displays a split window view showing aligned protein
+        and a reconstructed cDNA alignment.<br />Proteins were aligned with <a
+        href="http://www.drive5.com/muscle">Muscle</a> (version 3.8.31,
+        via the Jalview Desktop).<br />Data retrieved from Uniprot and
+        ENA, after Thornton, Need and Crews, <a
+        href="http://dx.doi.org/10.1126/science.1086185">Science 19
+          September 2003: 301 (5640), 1714-1717</a>
+      </td>
+    </tr>
+  </table>
+</div>
+<div id="sysout" style="width:500px;height:300px;background:yellow;overflow:auto"></div>
+
+</body>
+</html>
+<!--
+ * 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.
+-->
+
diff --git a/utils/jalviewjs/site-resources/css/ie6.css b/utils/jalviewjs/site-resources/css/ie6.css
new file mode 100644 (file)
index 0000000..2a70fa1
--- /dev/null
@@ -0,0 +1,91 @@
+/**
+ * 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.
+ */
+#nav #navInner
+{
+margin-top:0x;
+}
+
+
+#sddm
+{
+       position:relative;
+       top:0;
+}
+
+
+#sddm li a.download-right
+{
+position:absolute;
+top:28px;
+left:270px;
+}
+
+#sddm li
+{
+padding-top:30px;
+padding-bottom:30px;
+}
+
+#sddm div
+{      position: absolute;
+       visibility: hidden;
+       margin: 0;
+       padding: 0;
+       top:80px;
+       z-index:9999;
+       width:0;
+       display:none;
+}
+
+
+       #sddm div a
+       {       position: relative;
+               display: block;
+               margin: 0;
+               padding:8px;
+               width: 200px;
+               white-space: nowrap;
+               text-align: left;
+               text-decoration: none;
+               background: #555;
+               color: #fff;
+               border: 1px solid #000000;
+               background: #555;
+               z-index:100;
+               left:-1100px;
+       }
+       
+       
+#nav
+{
+position:relative;
+z-index:2;
+   clear:both;
+    float:left;
+    width:100%;                /* width of whole page */
+}
+
+#content 
+{
+position:relative;
+z-index:2;
+   clear:both;
+    float:left;
+    width:100%;                /* width of whole page */
+}
diff --git a/utils/jalviewjs/site-resources/css/ie7.css b/utils/jalviewjs/site-resources/css/ie7.css
new file mode 100644 (file)
index 0000000..47ba859
--- /dev/null
@@ -0,0 +1,85 @@
+/**
+ * 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.
+ */
+#sddm
+{
+       position:relative;
+       top:0;
+}
+
+
+#sddm li a.download-right
+{
+position:relative;
+left:0;
+}
+
+#sddm li
+{
+padding-top:30px;
+padding-bottom:30px;
+}
+
+#sddm div
+{      position: absolute;
+       visibility: hidden;
+       margin: 0;
+       padding: 0;
+       background: #555;
+       border: 1px solid #000000;
+       top:80px;
+       z-index:9999;
+       width:120px;
+}
+
+
+       #sddm div a
+       {       position: relative;
+               display: block;
+               margin: 0;
+               padding:8px;
+               width: 200px;
+               white-space: nowrap;
+               text-align: left;
+               text-decoration: none;
+               background: #555;
+               color: #fff;
+               border: 1px solid #000000;
+               background: #555;
+               z-index:100;
+               left:-80px;
+       }
+       
+       
+#nav
+{
+position:relative;
+z-index:2;
+   clear:both;
+    float:left;
+    width:100%;                /* width of whole page */
+}
+
+#content 
+{
+position:relative;
+z-index:2;
+   clear:both;
+    float:left;
+    width:100%;                /* width of whole page */
+}
diff --git a/utils/jalviewjs/site-resources/css/reset.css b/utils/jalviewjs/site-resources/css/reset.css
new file mode 100644 (file)
index 0000000..de3e422
--- /dev/null
@@ -0,0 +1,113 @@
+/**
+ * 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.
+ */
+/* http://meyerweb.com/eric/tools/css/reset/ 
+
+   v2.0 | 20110126
+
+   License: none (public domain)
+
+*/
+
+
+
+html, body, div, span, applet, object, iframe,
+
+h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+
+a, abbr, acronym, address, big, cite, code,
+
+del, dfn, em, img, ins, kbd, q, s, samp,
+
+small, strike, strong, sub, sup, tt, var,
+
+b, u, i, center,
+
+dl, dt, dd, ol, ul, li,
+
+fieldset, form, label, legend,
+
+table, caption, tbody, tfoot, thead, tr, th, td,
+
+article, aside, canvas, details, embed, 
+
+figure, figcaption, footer, header, hgroup, 
+
+menu, nav, output, ruby, section, summary,
+
+time, mark, audio, video {
+
+       margin: 0;
+
+       padding: 0;
+
+       border: 0;
+
+       font-size: 100%;
+
+       font: inherit;
+
+       vertical-align: baseline;
+
+}
+
+/* HTML5 display-role reset for older browsers */
+
+article, aside, details, figcaption, figure, 
+
+footer, header, hgroup, menu, nav, section {
+
+       display: block;
+
+}
+
+body {
+
+       line-height: 1;
+
+}
+
+ol, ul {
+
+       list-style: none;
+
+}
+
+blockquote, q {
+
+       quotes: none;
+
+}
+
+blockquote:before, blockquote:after,
+
+q:before, q:after {
+
+       content: '';
+
+       content: none;
+
+}
+
+table {
+
+       border-collapse: collapse;
+
+       border-spacing: 0;
+
+}
diff --git a/utils/jalviewjs/site-resources/css/style.css b/utils/jalviewjs/site-resources/css/style.css
new file mode 100644 (file)
index 0000000..3184fde
--- /dev/null
@@ -0,0 +1,457 @@
+/**
+ * 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.
+ */
+@import url(http://fonts.googleapis.com/css?family=Lato);
+@import url(http://fonts.googleapis.com/css?family=Oswald);
+
+/*****************
+HTML 5 Elements
+******************/
+new
+
+
+article, aside, details, figcaption, figure, 
+footer, header, hgroup, menu, nav, section 
+{
+    display: block;
+}
+
+
+.clearfix:after
+ {
+    visibility: hidden;
+    display: block;
+    font-size: 0;
+    content: " ";
+    clear: both;
+    height: 0;
+}
+
+
+/****************
+Body
+****************/
+
+body
+
+{
+  font: 76% arial,Helvetica,sans-serif;
+  text-align:left; 
+  background:#fff; 
+  color:#000;
+  border-top: 20px solid #555555;
+}
+
+
+
+/*********************
+Page Wrapper
+********************/
+
+#pageWrap 
+
+{
+       width: 960px;
+       margin: 0 auto;
+       position:relative;
+}
+
+/**********************
+HEADER
+************************/
+
+#header 
+{
+  display: block;
+  height: 180px;
+  margin: 0 auto 8px;
+  width: 960px;
+  position:relative;
+}
+
+#logo a 
+{
+  background-image: url("../images/logo.jpg");
+  background-repeat: no-repeat;
+  height: 87px;
+  left: 0;
+  position: absolute;
+  top: 50px;
+  width: 361px;
+  margin-bottom:50px;
+}
+
+#buttons
+{
+height:88px;
+width:252px;
+float:right;
+ right: 0;
+  position: absolute;
+  top: 50px;
+}
+
+#buttons li
+{
+margin-bottom:10px;
+}
+
+#buttons #applet a
+{
+  background-image: url("../images/applet.jpg");
+  background-repeat: no-repeat;
+    height:50px;
+  width:250px;
+  position: absolute;
+         opacity: 1;
+   transition: opacity .25s ease-in-out;
+   -moz-transition: opacity .25s ease-in-out;
+   -webkit-transition: opacity .25s ease-in-out;
+   text-shadow: 2px 2px 10px #000000;
+}
+
+#buttons #desktop a
+{
+  background-image: url("../images/desk.jpg");
+  background-repeat: no-repeat;
+  height:50px;
+  width:250px;
+  position: absolute;
+  top:45px;
+         opacity: 1;
+   transition: opacity .25s ease-in-out;
+   -moz-transition: opacity .25s ease-in-out;
+   -webkit-transition: opacity .25s ease-in-out;
+   text-shadow: 2px 2px 10px #000000;
+}
+
+#buttons #applet a:hover
+{
+ opacity: 0.8;
+}
+
+#buttons #desktop a:hover
+{
+ opacity: 0.8;
+}
+
+/*****************************
+NAV
+*********************************/
+#nav
+{
+width:100%;
+max-width:100%;
+color:#fff;
+background:#555;
+height:80px;
+}
+
+#navInner
+{
+width:960px;
+margin:0 auto;
+position:relative;
+}
+
+
+#sddm
+{      margin: 0;
+       padding: 0;
+       z-index: 30;
+       position:relative;
+       top:27px;
+}
+
+#sddm li
+{      margin: 0;
+       padding:0;
+       list-style: none;
+       float: left;
+}
+
+#sddm li a
+{ 
+       color: #FFFFFF;
+    font-size: 13pt;
+    padding: 27px 15px 25px;
+    text-align: center;
+    text-decoration: none;
+           font-family: 'Lato',sans-serif;
+}
+
+#sddm li a.community:hover
+{
+background:#F78E1E;
+}
+
+#sddm li a.development:hover
+{
+background:#AEBF45;
+}
+
+#sddm li a.training:hover
+{
+background:#009DDC;
+}
+
+#sddm li a.download-right
+{
+float:right;
+position:relative;
+left:345px;
+display:block;
+clear:left;
+ margin-top: -27px;
+    padding: 27px 15px 25px;
+}
+
+
+ul#sddm li a:hover 
+{          
+       text-decoration: none;
+       background:#0083A9;
+}
+
+#sddm div
+{      position: absolute;
+       visibility: hidden;
+       margin: 0;
+       padding: 0;
+       background: #555;
+       border: 1px solid #000000;
+       top:50px;
+}
+
+       #sddm div a
+       {       position: relative;
+               display: block;
+               margin: 0;
+               padding:8px;
+               width: 200px;
+               white-space: nowrap;
+               text-align: center;
+               text-decoration: none;
+               background: #555;
+               color: #fff;
+               border: 1px solid #000000;
+               background: #555;
+       }
+       
+
+
+/*****************************
+CONTENT
+*****************************/
+
+#content
+{
+  font-size: 10pt;
+  height: auto;
+  width: 710px;
+  padding-top:23px;
+  padding-bottom:12px;
+  overflow-x:auto; 
+  overflow-y:hidden; 
+}
+#content h1
+{
+       padding-top:29px;
+       font-size: 15pt;
+       font-style: bold;
+}
+#content h2
+{
+       padding-top:27px;
+       font-size: 13pt;
+       font-style: bold;
+}
+#content h3
+{
+       padding-top:25px;
+       font-size: 12pt;
+       font-style: bold italic;
+}
+#content pre
+{
+       font-family: monospace;
+}
+#sideNav
+{
+width:200px;
+float:left;
+padding-top:29px;
+margin-right:50px;
+}
+#content ul
+{
+       list-style-type: disc;
+}
+#content li
+{
+       margin-left: 11px;
+       padding-bottom:11px;
+}
+       
+#sideNav li
+{
+  height: 40px;
+    list-style-image: none;
+    list-style-type: none;
+    margin-bottom: 20px;
+}
+
+#sideNav a
+{
+   color: #555555;
+    display: block;
+    font-size: 13pt;
+    padding: 8px 0 0 15px;
+    text-decoration: none;
+}
+
+#sideNav a:hover
+{
+    text-decoration: underline;
+}
+#sideNav .about-nav-title
+{
+background: url("../images/normal-arrow-3-normal.png") no-repeat scroll 0 0 transparent;
+    color: #FFFFFF;
+    font-family: 'Lato',sans-serif;
+    font-size: 18pt;
+    font-weight: normal;
+    height: 40px;
+    margin-bottom: 20px;
+    padding-left: 5px;
+}
+
+#sideNav .jvlite-nav-title
+{
+background: url("../images/jvlite-arrow-3-small.png") no-repeat scroll 0 0 transparent;
+    color: #FFFFFF;
+    font-family: 'Lato',sans-serif;
+    font-size: 18pt;
+    font-weight: normal;
+    height: 40px;
+    margin-bottom: 20px;
+    padding-left: 5px;
+}
+
+#sideNav .jvlite-nav-small
+{
+background: url("../images/jvlite-arrow-3-small.png") no-repeat scroll 0 0 transparent;
+    color: #FFFFFF;
+    font-family: 'Lato',sans-serif;
+    font-size: 18pt;
+    font-weight: normal;
+    height: 40px;
+    margin-bottom: 20px;
+    padding-left: 0px;
+}
+
+#sideNav .com-nav-title
+{
+background: url("../images/com-arrow-3-small.png") no-repeat scroll 0 0 transparent;
+    color: #FFFFFF;
+    font-family: 'Lato',sans-serif;
+    font-size: 18pt;
+    font-weight: normal;
+    height: 40px;
+    margin-bottom: 20px;
+    padding-left: 5px;
+}
+
+#sideNav .dev-nav-title
+{
+background: url("../images/dev-arrow-3-normal.png") no-repeat scroll 0 0 transparent;
+    color: #FFFFFF;
+    font-family: 'Lato',sans-serif;
+    font-size: 18pt;
+    font-weight: normal;
+    height: 40px;
+    margin-bottom: 20px;
+    padding-left: 5px;
+}
+
+#sideNav .train-nav-title
+{
+background: url("../images/train-arrow-3-normal.png") no-repeat scroll 0 0 transparent;
+    color: #FFFFFF;
+    font-family: 'Lato',sans-serif;
+    font-size: 18pt;
+    font-weight: normal;
+    height: 40px;
+    margin-bottom: 20px;
+    padding-left: 5px;
+}
+
+#content .borderTable td
+{
+       border: 1px solid black;
+}
+#content .borderTable tr
+{
+       border-bottom: 2px solid black;
+}
+
+td
+{
+    vertical-align: middle;
+}
+
+/********************************
+FOOTER
+***********************************/
+
+#footer
+{
+max-width:100%;
+width:100%;
+color:#fff;
+background:#555;
+height:140px;
+padding-top:10px;
+clear:both;
+}
+#innerFooter a
+{
+       color: #EEEEEE;
+       visited: #DDDDDD;
+       
+}
+
+#innerFooter
+{
+width:960px;
+margin:0 auto;
+height:140px;
+padding-top:10px;
+}
+
+
+#copyright
+{
+float:left;
+}
+
+#cite
+{
+float:right;
+width:555px;
+}
diff --git a/utils/jalviewjs/site-resources/examples/1gaq.txt b/utils/jalviewjs/site-resources/examples/1gaq.txt
new file mode 100644 (file)
index 0000000..7a40768
--- /dev/null
@@ -0,0 +1,691 @@
+HEADER    OXIDOREDUCTASE/ELECTRON TRANSPORT       08-MAY-00   1GAQ 
+ATOM      2  CA  GLU A  19      20.491  30.713  36.290  1.00 74.29           C  
+ATOM     11  CA  SER A  20      24.056  29.774  37.264  1.00 72.09           C  
+ATOM     17  CA  LYS A  21      27.517  31.289  37.563  1.00 70.09           C  
+ATOM     26  CA  LYS A  22      28.794  27.865  36.481  1.00 68.64           C  
+ATOM     35  CA  GLN A  23      29.484  26.806  32.884  1.00 70.46           C  
+ATOM     44  CA  GLU A  24      26.420  25.175  31.360  1.00 72.08           C  
+ATOM     53  CA  GLU A  25      26.736  26.049  27.683  1.00 70.43           C  
+ATOM     62  CA  GLY A  26      28.299  22.912  26.233  1.00 63.14           C  
+ATOM     66  CA  VAL A  27      26.863  20.704  28.982  1.00 54.50           C  
+ATOM     73  CA  VAL A  28      25.030  17.390  28.655  1.00 48.32           C  
+ATOM     80  CA  THR A  29      23.728  14.677  30.991  1.00 44.86           C  
+ATOM     87  CA  ASN A  30      22.327  11.164  30.703  1.00 45.42           C  
+ATOM     95  CA  LEU A  31      23.332  10.459  27.102  1.00 45.42           C  
+ATOM    103  CA  TYR A  32      23.549   6.898  28.380  1.00 45.88           C  
+ATOM    115  CA  LYS A  33      21.656   5.321  31.262  1.00 47.27           C  
+ATOM    124  CA  PRO A  34      21.991   2.046  33.248  1.00 48.99           C  
+ATOM    131  CA  LYS A  35      19.339   0.560  30.970  1.00 52.75           C  
+ATOM    140  CA  GLU A  36      21.580   0.855  27.886  1.00 53.33           C  
+ATOM    149  CA  PRO A  37      25.154   2.015  28.678  1.00 47.54           C  
+ATOM    156  CA  TYR A  38      27.929   2.872  26.249  1.00 41.98           C  
+ATOM    168  CA  VAL A  39      30.355  -0.017  25.909  1.00 41.48           C  
+ATOM    175  CA  GLY A  40      33.823   1.485  25.966  1.00 37.59           C  
+ATOM    179  CA  ARG A  41      37.165  -0.277  26.122  1.00 39.77           C  
+ATOM    190  CA  CYS A  42      40.148  -0.029  28.442  1.00 36.51           C  
+ATOM    196  CA  LEU A  43      43.095   1.441  26.554  1.00 36.13           C  
+ATOM    204  CA  LEU A  44      45.231   2.023  29.649  1.00 33.55           C  
+ATOM    212  CA  ASN A  45      45.140   1.026  33.307  1.00 27.79           C  
+ATOM    220  CA  THR A  46      48.056   1.800  35.617  1.00 28.75           C  
+ATOM    227  CA  LYS A  47      48.542   1.776  39.388  1.00 30.31           C  
+ATOM    236  CA  ILE A  48      49.564   5.317  40.376  1.00 31.32           C  
+ATOM    244  CA  THR A  49      50.339   4.682  44.059  1.00 37.62           C  
+ATOM    251  CA  GLY A  50      53.585   3.317  45.460  1.00 44.49           C  
+ATOM    255  CA  ASP A  51      53.706  -0.448  46.087  1.00 52.89           C  
+ATOM    263  CA  ASP A  52      53.910   0.545  49.751  1.00 55.23           C  
+ATOM    271  CA  ALA A  53      50.816   2.767  50.056  1.00 53.34           C  
+ATOM    276  CA  PRO A  54      47.904   1.940  52.405  1.00 50.60           C  
+ATOM    283  CA  GLY A  55      45.420   1.579  49.561  1.00 50.35           C  
+ATOM    287  CA  GLU A  56      46.098   1.286  45.836  1.00 42.53           C  
+ATOM    296  CA  THR A  57      44.534   3.816  43.480  1.00 41.14           C  
+ATOM    303  CA  TRP A  58      44.540   3.423  39.708  1.00 35.60           C  
+ATOM    317  CA  HIS A  59      44.468   5.853  36.796  1.00 31.89           C  
+ATOM    327  CA  MET A  60      42.658   4.227  33.866  1.00 31.65           C  
+ATOM    335  CA  VAL A  61      41.716   5.345  30.350  1.00 30.43           C  
+ATOM    342  CA  PHE A  62      38.669   4.172  28.360  1.00 34.36           C  
+ATOM    353  CA  SER A  63      37.657   4.908  24.772  1.00 34.69           C  
+ATOM    359  CA  THR A  64      34.448   6.828  23.951  1.00 36.96           C  
+ATOM    366  CA  GLU A  65      34.691   7.644  20.254  1.00 40.08           C  
+ATOM    375  CA  GLY A  66      33.742  11.183  21.285  1.00 40.22           C  
+ATOM    379  CA  LYS A  67      30.272   9.763  22.003  1.00 41.93           C  
+ATOM    388  CA  ILE A  68      30.279  11.116  25.577  1.00 41.52           C  
+ATOM    396  CA  PRO A  69      30.791  14.926  25.537  1.00 42.35           C  
+ATOM    403  CA  TYR A  70      31.228  15.232  29.299  1.00 39.84           C  
+ATOM    415  CA  ARG A  71      32.639  18.451  30.768  1.00 44.14           C  
+ATOM    426  CA  GLU A  72      35.122  19.278  33.515  1.00 43.82           C  
+ATOM    435  CA  GLY A  73      33.472  18.458  36.835  1.00 41.97           C  
+ATOM    439  CA  GLN A  74      30.929  15.874  35.657  1.00 37.19           C  
+ATOM    448  CA  SER A  75      31.285  12.124  36.138  1.00 38.28           C  
+ATOM    454  CA  ILE A  76      30.458   8.792  34.539  1.00 36.84           C  
+ATOM    462  CA  GLY A  77      28.983   5.620  35.918  1.00 35.39           C  
+ATOM    466  CA  VAL A  78      30.311   2.108  35.530  1.00 32.05           C  
+ATOM    473  CA  ILE A  79      28.458  -1.201  35.591  1.00 32.67           C  
+ATOM    481  CA  ALA A  80      30.745  -4.018  36.644  1.00 35.36           C  
+ATOM    486  CA  ASP A  81      30.359  -7.373  34.872  1.00 38.72           C  
+ATOM    494  CA  GLY A  82      28.308 -10.332  36.110  1.00 45.79           C  
+ATOM    498  CA  VAL A  83      25.820 -10.242  39.001  1.00 52.24           C  
+ATOM    505  CA  ASP A  84      25.838 -10.250  42.834  1.00 60.54           C  
+ATOM    513  CA  LYS A  85      25.014 -13.158  45.196  1.00 66.72           C  
+ATOM    522  CA  ASN A  86      21.414 -13.062  43.904  1.00 67.37           C  
+ATOM    530  CA  GLY A  87      21.724 -13.423  40.136  1.00 64.74           C  
+ATOM    534  CA  LYS A  88      20.971  -9.733  39.570  1.00 61.12           C  
+ATOM    543  CA  PRO A  89      23.054  -7.201  37.561  1.00 54.68           C  
+ATOM    550  CA  HIS A  90      25.224  -4.957  39.755  1.00 44.44           C  
+ATOM    560  CA  LYS A  91      23.940  -1.433  40.260  1.00 40.48           C  
+ATOM    569  CA  VAL A  92      25.803   1.546  38.843  1.00 38.45           C  
+ATOM    576  CA  ARG A  93      28.709   2.986  40.828  1.00 38.93           C  
+ATOM    587  CA  LEU A  94      29.778   6.584  40.096  1.00 34.37           C  
+ATOM    595  CA  TYR A  95      33.309   7.878  39.513  1.00 30.27           C  
+ATOM    607  CA  SER A  96      34.425  11.475  39.057  1.00 29.44           C  
+ATOM    613  CA  ILE A  97      36.029  12.090  35.662  1.00 27.61           C  
+ATOM    621  CA  ALA A  98      39.769  12.693  36.069  1.00 31.12           C  
+ATOM    626  CA  SER A  99      40.393  13.712  32.475  1.00 32.42           C  
+ATOM    632  CA  SER A 100      39.566  17.142  31.059  1.00 36.14           C  
+ATOM    638  CA  ALA A 101      37.097  17.367  28.154  1.00 41.07           C  
+ATOM    643  CA  ILE A 102      39.764  16.549  25.527  1.00 47.65           C  
+ATOM    651  CA  GLY A 103      41.172  13.692  27.599  1.00 46.77           C  
+ATOM    655  CA  ASP A 104      44.730  12.612  28.289  1.00 43.82           C  
+ATOM    663  CA  PHE A 105      45.115  12.065  24.522  1.00 41.52           C  
+ATOM    674  CA  GLY A 106      43.862  15.455  23.328  1.00 41.66           C  
+ATOM    678  CA  ASP A 107      41.355  13.883  20.926  1.00 40.90           C  
+ATOM    686  CA  SER A 108      38.132  14.250  22.954  1.00 42.95           C  
+ATOM    692  CA  LYS A 109      37.967  10.535  22.224  1.00 44.74           C  
+ATOM    701  CA  THR A 110      38.731   9.184  25.704  1.00 41.09           C  
+ATOM    708  CA  VAL A 111      37.728   9.519  29.374  1.00 39.03           C  
+ATOM    715  CA  SER A 112      39.912   8.705  32.399  1.00 37.17           C  
+ATOM    721  CA  LEU A 113      39.098   7.476  35.935  1.00 32.10           C  
+ATOM    729  CA  CYS A 114      40.964   7.578  39.261  1.00 30.65           C  
+ATOM    735  CA  VAL A 115      39.724   4.459  41.060  1.00 33.45           C  
+ATOM    742  CA  LYS A 116      40.668   3.524  44.628  1.00 34.75           C  
+ATOM    751  CA  ARG A 117      40.376  -0.250  45.123  1.00 32.85           C  
+ATOM    762  CA  LEU A 118      38.137  -1.094  48.077  1.00 30.50           C  
+ATOM    770  CA  ILE A 119      39.376  -3.752  50.459  1.00 34.34           C  
+ATOM    778  CA  TYR A 120      38.699  -4.266  54.125  1.00 31.39           C  
+ATOM    790  CA  THR A 121      38.264  -7.086  56.567  1.00 28.83           C  
+ATOM    797  CA  ASN A 122      34.792  -7.477  58.109  1.00 26.51           C  
+ATOM    805  CA  ASP A 123      33.626  -8.382  61.634  1.00 31.58           C  
+ATOM    813  CA  ALA A 124      34.191 -12.077  60.901  1.00 27.84           C  
+ATOM    818  CA  GLY A 125      37.759 -11.844  59.728  1.00 32.39           C  
+ATOM    822  CA  GLU A 126      36.809 -12.146  56.073  1.00 35.82           C  
+ATOM    831  CA  ILE A 127      38.655  -9.932  53.598  1.00 38.42           C  
+ATOM    839  CA  VAL A 128      36.025  -8.261  51.421  1.00 33.73           C  
+ATOM    846  CA  LYS A 129      36.482  -6.484  48.090  1.00 31.87           C  
+ATOM    855  CA  GLY A 130      34.363  -3.680  46.686  1.00 26.91           C  
+ATOM    859  CA  VAL A 131      32.680  -5.051  43.569  1.00 27.89           C  
+ATOM    866  CA  CYS A 132      33.074  -2.246  41.018  1.00 28.46           C  
+ATOM    872  CA  SER A 133      36.266  -0.553  42.213  1.00 31.33           C  
+ATOM    878  CA  ASN A 134      37.861  -3.983  41.984  1.00 30.29           C  
+ATOM    886  CA  PHE A 135      36.318  -4.795  38.623  1.00 31.48           C  
+ATOM    897  CA  LEU A 136      37.926  -1.553  37.520  1.00 27.81           C  
+ATOM    905  CA  CYS A 137      41.417  -1.976  38.955  1.00 25.91           C  
+ATOM    911  CA  ASP A 138      41.605  -5.419  37.338  1.00 30.22           C  
+ATOM    919  CA  LEU A 139      40.462  -4.306  33.874  1.00 32.69           C  
+ATOM    927  CA  GLN A 140      42.851  -5.511  31.186  1.00 36.80           C  
+ATOM    936  CA  PRO A 141      43.380  -3.220  28.170  1.00 36.16           C  
+ATOM    943  CA  GLY A 142      40.864  -4.420  25.586  1.00 31.10           C  
+ATOM    947  CA  ASP A 143      38.129  -5.298  28.055  1.00 30.62           C  
+ATOM    955  CA  ASN A 144      34.690  -3.847  27.645  1.00 33.52           C  
+ATOM    963  CA  VAL A 145      33.430  -1.522  30.361  1.00 37.08           C  
+ATOM    970  CA  GLN A 146      29.817  -0.374  30.523  1.00 37.65           C  
+ATOM    979  CA  ILE A 147      29.547   3.413  31.045  1.00 30.95           C  
+ATOM    987  CA  THR A 148      26.637   5.791  31.832  1.00 29.95           C  
+ATOM    994  CA  GLY A 149      26.297   9.581  31.843  1.00 32.81           C  
+ATOM    998  CA  PRO A 150      27.785  12.148  31.800  1.00 34.98           C  
+ATOM   1005  CA  VAL A 151      26.376  12.668  35.275  1.00 36.53           C  
+ATOM   1012  CA  GLY A 152      26.196  15.756  37.474  1.00 43.09           C  
+ATOM   1016  CA  LYS A 153      26.048  19.528  37.068  1.00 48.37           C  
+ATOM   1025  CA  GLU A 154      26.921  20.540  40.633  1.00 49.70           C  
+ATOM   1034  CA  MET A 155      30.710  20.266  40.235  1.00 47.30           C  
+ATOM   1042  CA  LEU A 156      30.882  22.020  36.869  1.00 50.36           C  
+ATOM   1050  CA  MET A 157      33.362  24.883  36.404  1.00 55.29           C  
+ATOM   1058  CA  PRO A 158      32.521  28.612  36.605  1.00 54.88           C  
+ATOM   1065  CA  LYS A 159      32.291  30.776  33.464  1.00 54.92           C  
+ATOM   1074  CA  ASP A 160      34.497  33.503  34.939  1.00 57.22           C  
+ATOM   1082  CA  PRO A 161      38.055  32.687  33.759  1.00 58.62           C  
+ATOM   1089  CA  ASN A 162      39.524  35.240  36.163  1.00 60.44           C  
+ATOM   1097  CA  ALA A 163      37.814  33.910  39.279  1.00 55.80           C  
+ATOM   1102  CA  THR A 164      39.596  32.487  42.316  1.00 51.04           C  
+ATOM   1109  CA  ILE A 165      38.966  28.771  42.756  1.00 50.26           C  
+ATOM   1117  CA  ILE A 166      39.774  26.773  45.885  1.00 47.54           C  
+ATOM   1125  CA  MET A 167      39.883  23.014  45.324  1.00 46.38           C  
+ATOM   1133  CA  LEU A 168      39.700  20.963  48.522  1.00 42.18           C  
+ATOM   1141  CA  ALA A 169      40.377  17.316  47.770  1.00 36.41           C  
+ATOM   1146  CA  THR A 170      41.005  14.086  49.622  1.00 32.98           C  
+ATOM   1153  CA  GLY A 171      42.027  10.802  48.014  1.00 31.36           C  
+ATOM   1157  CA  THR A 172      40.386  10.037  44.680  1.00 30.48           C  
+ATOM   1164  CA  GLY A 173      38.640  13.335  45.359  1.00 33.99           C  
+ATOM   1168  CA  ILE A 174      41.418  15.036  43.394  1.00 35.66           C  
+ATOM   1176  CA  ALA A 175      39.758  13.585  40.300  1.00 36.00           C  
+ATOM   1181  CA  PRO A 176      37.445  16.385  39.155  1.00 39.41           C  
+ATOM   1188  CA  PHE A 177      40.109  18.971  39.976  1.00 43.21           C  
+ATOM   1199  CA  ARG A 178      42.726  17.119  37.955  1.00 41.09           C  
+ATOM   1210  CA  SER A 179      40.235  17.536  35.124  1.00 39.92           C  
+ATOM   1216  CA  PHE A 180      39.808  21.204  36.009  1.00 39.23           C  
+ATOM   1227  CA  LEU A 181      43.528  21.949  35.995  1.00 39.50           C  
+ATOM   1235  CA  TRP A 182      44.305  20.081  32.770  1.00 41.47           C  
+ATOM   1249  CA  LYS A 183      42.141  22.654  30.972  1.00 48.08           C  
+ATOM   1258  CA  MET A 184      43.477  25.547  33.062  1.00 52.79           C  
+ATOM   1266  CA  PHE A 185      47.102  25.043  32.014  1.00 57.35           C  
+ATOM   1277  CA  PHE A 186      48.075  21.921  30.051  1.00 55.98           C  
+ATOM   1288  CA  GLU A 187      45.758  23.173  27.297  1.00 54.44           C  
+ATOM   1297  CA  LYS A 188      44.908  26.236  25.196  1.00 51.29           C  
+ATOM   1306  CA  HIS A 189      41.395  27.080  24.003  1.00 51.35           C  
+ATOM   1316  CA  ASP A 190      40.108  29.972  21.873  1.00 54.30           C  
+ATOM   1324  CA  ASP A 191      37.199  30.481  24.249  1.00 53.95           C  
+ATOM   1332  CA  TYR A 192      38.816  29.937  27.634  1.00 50.68           C  
+ATOM   1344  CA  LYS A 193      41.916  31.388  29.230  1.00 51.00           C  
+ATOM   1353  CA  PHE A 194      42.322  30.967  32.956  1.00 52.09           C  
+ATOM   1364  CA  ASN A 195      43.672  34.234  34.312  1.00 56.46           C  
+ATOM   1372  CA  GLY A 196      42.616  34.078  37.969  1.00 57.17           C  
+ATOM   1376  CA  LEU A 197      43.874  31.920  40.843  1.00 57.92           C  
+ATOM   1384  CA  GLY A 198      43.549  28.151  41.086  1.00 56.67           C  
+ATOM   1388  CA  TRP A 199      44.258  26.886  44.592  1.00 51.55           C  
+ATOM   1402  CA  LEU A 200      44.411  23.170  45.379  1.00 49.17           C  
+ATOM   1410  CA  PHE A 201      44.558  21.335  48.709  1.00 48.60           C  
+ATOM   1421  CA  LEU A 202      45.122  17.570  48.598  1.00 45.34           C  
+ATOM   1429  CA  GLY A 203      44.885  15.480  51.742  1.00 48.55           C  
+ATOM   1433  CA  VAL A 204      46.225  11.936  51.755  1.00 50.23           C  
+ATOM   1440  CA  PRO A 205      47.942   9.740  54.365  1.00 51.51           C  
+ATOM   1447  CA  THR A 206      51.284   9.148  52.648  1.00 50.21           C  
+ATOM   1454  CA  SER A 207      53.551  10.483  49.894  1.00 49.38           C  
+ATOM   1460  CA  SER A 208      53.267   7.061  48.259  1.00 43.49           C  
+ATOM   1466  CA  SER A 209      49.588   8.049  48.093  1.00 42.57           C  
+ATOM   1472  CA  LEU A 210      49.990  11.424  46.364  1.00 42.65           C  
+ATOM   1480  CA  LEU A 211      48.121  11.446  43.035  1.00 39.33           C  
+ATOM   1488  CA  TYR A 212      49.516  13.214  39.935  1.00 40.89           C  
+ATOM   1500  CA  LYS A 213      52.128  15.234  41.873  1.00 45.88           C  
+ATOM   1509  CA  GLU A 214      54.518  15.406  38.899  1.00 53.22           C  
+ATOM   1518  CA  GLU A 215      51.680  16.911  36.889  1.00 55.16           C  
+ATOM   1527  CA  PHE A 216      50.757  19.475  39.514  1.00 60.55           C  
+ATOM   1538  CA  GLY A 217      54.488  20.153  39.524  1.00 66.64           C  
+ATOM   1542  CA  LYS A 218      54.575  21.110  35.850  1.00 68.86           C  
+ATOM   1551  CA  MET A 219      51.398  23.159  36.265  1.00 66.97           C  
+ATOM   1559  CA  LYS A 220      53.138  25.090  39.061  1.00 65.97           C  
+ATOM   1568  CA  GLU A 221      55.654  26.250  36.459  1.00 70.02           C  
+ATOM   1577  CA  ARG A 222      53.584  26.507  33.294  1.00 73.48           C  
+ATOM   1588  CA  ALA A 223      52.005  29.449  35.175  1.00 76.21           C  
+ATOM   1593  CA  PRO A 224      53.272  29.877  38.804  1.00 79.25           C  
+ATOM   1600  CA  GLU A 225      51.296  33.124  39.020  1.00 81.84           C  
+ATOM   1609  CA  ASN A 226      47.873  31.528  38.622  1.00 78.84           C  
+ATOM   1617  CA  PHE A 227      48.418  28.176  40.350  1.00 75.28           C  
+ATOM   1628  CA  ARG A 228      49.090  27.305  43.996  1.00 72.05           C  
+ATOM   1639  CA  VAL A 229      49.165  23.724  45.323  1.00 68.82           C  
+ATOM   1646  CA  ASP A 230      49.258  22.581  48.958  1.00 66.54           C  
+ATOM   1654  CA  TYR A 231      49.605  18.943  49.968  1.00 60.31           C  
+ATOM   1666  CA  ALA A 232      48.551  17.560  53.332  1.00 57.39           C  
+ATOM   1671  CA  VAL A 233      50.260  14.228  53.945  1.00 57.14           C  
+ATOM   1678  CA  SER A 234      48.465  13.579  57.244  1.00 60.81           C  
+ATOM   1684  CA  ARG A 235      50.959  11.010  58.514  1.00 60.74           C  
+ATOM   1695  CA  GLU A 236      54.268  12.594  57.481  1.00 59.17           C  
+ATOM   1704  CA  GLN A 237      53.494  16.197  58.450  1.00 59.62           C  
+ATOM   1713  CA  THR A 238      52.590  18.236  61.521  1.00 63.18           C  
+ATOM   1720  CA  ASN A 239      52.019  21.937  62.188  1.00 66.71           C  
+ATOM   1728  CA  ALA A 240      52.096  23.767  65.537  1.00 70.06           C  
+ATOM   1733  CA  ALA A 241      51.302  21.400  68.410  1.00 72.44           C  
+ATOM   1738  CA  GLY A 242      52.383  18.324  66.438  1.00 72.38           C  
+ATOM   1742  CA  GLU A 243      48.826  18.169  65.110  1.00 69.71           C  
+ATOM   1751  CA  ARG A 244      48.674  15.776  62.148  1.00 67.21           C  
+ATOM   1762  CA  MET A 245      48.712  17.796  58.933  1.00 64.20           C  
+ATOM   1770  CA  TYR A 246      45.246  17.082  57.556  1.00 60.65           C  
+ATOM   1782  CA  ILE A 247      43.617  18.437  54.409  1.00 62.98           C  
+ATOM   1790  CA  GLN A 248      42.035  21.001  56.761  1.00 64.64           C  
+ATOM   1799  CA  THR A 249      45.057  21.461  59.009  1.00 63.37           C  
+ATOM   1806  CA  ARG A 250      46.891  22.664  55.903  1.00 62.47           C  
+ATOM   1817  CA  MET A 251      44.123  25.201  55.251  1.00 63.35           C  
+ATOM   1825  CA  ALA A 252      44.571  26.305  58.854  1.00 65.73           C  
+ATOM   1830  CA  GLU A 253      47.973  27.809  58.076  1.00 65.97           C  
+ATOM   1839  CA  TYR A 254      46.267  30.063  55.517  1.00 65.83           C  
+ATOM   1851  CA  LYS A 255      42.991  30.559  57.379  1.00 70.30           C  
+ATOM   1860  CA  GLU A 256      43.578  34.326  57.320  1.00 73.73           C  
+ATOM   1869  CA  GLU A 257      44.189  34.738  53.593  1.00 71.52           C  
+ATOM   1878  CA  LEU A 258      41.459  32.202  52.893  1.00 73.38           C  
+ATOM   1886  CA  TRP A 259      38.790  34.074  54.853  1.00 76.72           C  
+ATOM   1900  CA  GLU A 260      39.721  37.275  53.006  1.00 78.61           C  
+ATOM   1909  CA  LEU A 261      38.580  35.553  49.815  1.00 75.71           C  
+ATOM   1917  CA  LEU A 262      35.391  33.881  51.047  1.00 73.74           C  
+ATOM   1925  CA  LYS A 263      33.562  37.165  50.535  1.00 73.64           C  
+ATOM   1934  CA  LYS A 264      34.299  38.143  46.954  1.00 72.48           C  
+ATOM   1943  CA  ASP A 265      31.954  37.554  43.993  1.00 69.65           C  
+ATOM   1951  CA  ASN A 266      34.660  35.649  42.106  1.00 65.06           C  
+ATOM   1959  CA  THR A 267      35.835  33.117  44.683  1.00 58.24           C  
+ATOM   1966  CA  TYR A 268      34.459  29.646  43.909  1.00 51.04           C  
+ATOM   1978  CA  VAL A 269      35.192  26.827  46.382  1.00 44.95           C  
+ATOM   1985  CA  TYR A 270      35.012  23.150  45.368  1.00 44.96           C  
+ATOM   1997  CA  MET A 271      35.162  20.122  47.656  1.00 41.72           C  
+ATOM   2005  CA  CYS A 272      35.314  16.468  46.632  1.00 37.19           C  
+ATOM   2011  CA  GLY A 273      36.343  13.080  47.951  1.00 37.65           C  
+ATOM   2015  CA  LEU A 274      36.040  10.886  51.020  1.00 39.39           C  
+ATOM   2023  CA  LYS A 275      33.076  12.283  52.955  1.00 44.86           C  
+ATOM   2032  CA  GLY A 276      34.322  13.183  56.400  1.00 49.16           C  
+ATOM   2036  CA  MET A 277      36.932  15.608  55.168  1.00 53.30           C  
+ATOM   2044  CA  GLU A 278      33.917  17.921  55.165  1.00 56.74           C  
+ATOM   2053  CA  LYS A 279      33.531  18.089  58.947  1.00 59.30           C  
+ATOM   2062  CA  GLY A 280      36.982  19.413  59.776  1.00 58.94           C  
+ATOM   2066  CA  ILE A 281      36.705  22.048  57.063  1.00 61.43           C  
+ATOM   2074  CA  ASP A 282      33.453  23.402  58.515  1.00 67.06           C  
+ATOM   2082  CA  ASP A 283      35.050  23.189  61.972  1.00 74.12           C  
+ATOM   2090  CA  ILE A 284      37.991  25.422  61.040  1.00 78.49           C  
+ATOM   2098  CA  MET A 285      35.456  27.566  59.201  1.00 82.25           C  
+ATOM   2106  CA  VAL A 286      32.941  27.959  62.027  1.00 83.44           C  
+ATOM   2113  CA  SER A 287      35.610  29.113  64.469  1.00 83.43           C  
+ATOM   2119  CA  LEU A 288      36.927  31.601  61.887  1.00 85.53           C  
+ATOM   2127  CA  ALA A 289      33.506  33.025  60.970  1.00 86.85           C  
+ATOM   2132  CA  GLU A 290      31.841  32.696  64.387  1.00 89.26           C  
+ATOM   2141  CA  LYS A 291      34.438  35.312  65.347  1.00 88.73           C  
+ATOM   2150  CA  ASP A 292      33.635  37.891  62.652  1.00 88.03           C  
+ATOM   2158  CA  GLY A 293      30.219  37.450  61.081  1.00 87.88           C  
+ATOM   2162  CA  ILE A 294      27.319  35.051  61.511  1.00 84.61           C  
+ATOM   2170  CA  ASP A 295      27.665  31.329  62.188  1.00 82.45           C  
+ATOM   2178  CA  TRP A 296      29.539  29.627  59.355  1.00 80.12           C  
+ATOM   2192  CA  PHE A 297      26.527  27.452  58.512  1.00 78.99           C  
+ATOM   2203  CA  ASP A 298      24.167  30.241  57.486  1.00 76.37           C  
+ATOM   2211  CA  TYR A 299      27.074  31.748  55.561  1.00 74.07           C  
+ATOM   2223  CA  LYS A 300      27.679  28.620  53.473  1.00 74.31           C  
+ATOM   2232  CA  LYS A 301      24.059  29.146  52.464  1.00 75.97           C  
+ATOM   2241  CA  GLN A 302      24.921  32.563  51.018  1.00 75.38           C  
+ATOM   2250  CA  LEU A 303      27.896  31.099  49.155  1.00 72.10           C  
+ATOM   2258  CA  LYS A 304      25.917  28.207  47.690  1.00 72.08           C  
+ATOM   2267  CA  ARG A 305      23.595  31.021  46.594  1.00 74.82           C  
+ATOM   2278  CA  GLY A 306      26.071  32.136  43.958  1.00 71.84           C  
+ATOM   2282  CA  ASP A 307      27.505  28.682  43.220  1.00 67.23           C  
+ATOM   2290  CA  GLN A 308      30.620  29.291  45.346  1.00 60.18           C  
+ATOM   2299  CA  TRP A 309      30.585  26.177  47.537  1.00 52.25           C  
+ATOM   2313  CA  ASN A 310      29.894  22.997  45.597  1.00 45.03           C  
+ATOM   2321  CA  VAL A 311      30.327  19.716  47.403  1.00 39.13           C  
+ATOM   2328  CA  GLU A 312      30.507  16.190  46.110  1.00 35.17           C  
+ATOM   2337  CA  VAL A 313      31.761  13.957  48.861  1.00 30.12           C  
+ATOM   2344  CA  TYR A 314      31.112  10.230  49.021  1.00 28.23           C  
+ATOM   2358  CA  ALA B   1       2.311  24.702  44.475  1.00 74.17           C  
+ATOM   2363  CA  THR B   2       3.590  24.207  48.055  1.00 74.76           C  
+ATOM   2370  CA  TYR B   3       3.069  20.876  49.837  1.00 73.52           C  
+ATOM   2382  CA  ASN B   4       3.748  19.874  53.435  1.00 75.75           C  
+ATOM   2390  CA  VAL B   5       6.618  17.399  53.868  1.00 75.95           C  
+ATOM   2397  CA  LYS B   6       7.769  15.523  56.983  1.00 77.70           C  
+ATOM   2406  CA  LEU B   7      11.351  14.325  57.458  1.00 78.91           C  
+ATOM   2414  CA  ILE B   8      11.807  11.511  59.985  1.00 81.00           C  
+ATOM   2422  CA  THR B   9      15.560  12.046  60.247  1.00 87.49           C  
+ATOM   2429  CA  PRO B  10      17.662   9.793  62.539  1.00 92.94           C  
+ATOM   2436  CA  GLU B  11      18.161  13.147  64.282  1.00 96.61           C  
+ATOM   2445  CA  GLY B  12      14.579  14.154  65.041  1.00 97.52           C  
+ATOM   2449  CA  GLU B  13      11.602  14.823  62.748  1.00 96.90           C  
+ATOM   2458  CA  VAL B  14      11.547  17.892  60.480  1.00 96.63           C  
+ATOM   2465  CA  GLU B  15       8.340  19.701  59.440  1.00 94.86           C  
+ATOM   2474  CA  LEU B  16       9.471  21.479  56.254  1.00 91.55           C  
+ATOM   2482  CA  GLN B  17       7.281  23.141  53.598  1.00 89.75           C  
+ATOM   2491  CA  VAL B  18       8.485  22.069  50.145  1.00 87.92           C  
+ATOM   2498  CA  PRO B  19       6.906  23.558  46.964  1.00 86.35           C  
+ATOM   2505  CA  ASP B  20       5.990  21.744  43.717  1.00 86.29           C  
+ATOM   2513  CA  ASP B  21       8.578  22.751  41.083  1.00 83.78           C  
+ATOM   2521  CA  VAL B  22      11.385  22.401  43.639  1.00 80.98           C  
+ATOM   2528  CA  TYR B  23      13.439  19.280  44.481  1.00 77.04           C  
+ATOM   2540  CA  ILE B  24      13.212  18.196  48.120  1.00 76.45           C  
+ATOM   2548  CA  LEU B  25      16.959  18.133  48.851  1.00 75.15           C  
+ATOM   2556  CA  ASP B  26      17.154  21.745  47.689  1.00 75.80           C  
+ATOM   2564  CA  GLN B  27      14.616  22.906  50.280  1.00 76.31           C  
+ATOM   2573  CA  ALA B  28      16.562  20.957  52.914  1.00 78.86           C  
+ATOM   2578  CA  GLU B  29      19.698  23.011  52.198  1.00 81.51           C  
+ATOM   2587  CA  GLU B  30      17.491  26.106  52.510  1.00 83.25           C  
+ATOM   2596  CA  ASP B  31      15.857  25.933  55.935  1.00 81.92           C  
+ATOM   2604  CA  GLY B  32      19.280  24.859  57.151  1.00 79.08           C  
+ATOM   2608  CA  ILE B  33      18.621  21.130  57.157  1.00 76.93           C  
+ATOM   2616  CA  ASP B  34      21.528  18.731  56.618  1.00 73.53           C  
+ATOM   2624  CA  LEU B  35      20.738  15.738  54.421  1.00 67.74           C  
+ATOM   2632  CA  PRO B  36      23.138  13.391  52.547  1.00 65.90           C  
+ATOM   2639  CA  TYR B  37      23.916  14.226  48.912  1.00 64.85           C  
+ATOM   2651  CA  SER B  38      26.659  13.373  46.412  1.00 62.58           C  
+ATOM   2657  CA  CYS B  39      26.193  13.603  42.652  1.00 60.99           C  
+ATOM   2663  CA  ARG B  40      22.908  15.441  43.251  1.00 58.35           C  
+ATOM   2674  CA  ALA B  41      21.699  14.108  39.886  1.00 56.38           C  
+ATOM   2679  CA  GLY B  42      19.886  10.955  40.991  1.00 56.66           C  
+ATOM   2683  CA  SER B  43      22.465   8.336  40.010  1.00 58.55           C  
+ATOM   2689  CA  CYS B  44      23.548   7.052  43.447  1.00 56.27           C  
+ATOM   2695  CA  SER B  45      22.057   5.987  46.791  1.00 58.20           C  
+ATOM   2701  CA  SER B  46      23.574   8.773  48.890  1.00 59.13           C  
+ATOM   2707  CA  CYS B  47      20.220  10.475  49.517  1.00 65.64           C  
+ATOM   2713  CA  ALA B  48      17.911   7.436  49.610  1.00 69.71           C  
+ATOM   2718  CA  GLY B  49      14.733   7.635  51.681  1.00 73.09           C  
+ATOM   2722  CA  LYS B  50      11.712   5.340  52.183  1.00 73.77           C  
+ATOM   2731  CA  VAL B  51       8.551   7.412  51.568  1.00 76.51           C  
+ATOM   2738  CA  VAL B  52       5.237   7.081  53.429  1.00 78.85           C  
+ATOM   2745  CA  SER B  53       2.180   9.376  53.647  1.00 79.57           C  
+ATOM   2751  CA  GLY B  54       2.118  10.991  50.218  1.00 76.32           C  
+ATOM   2755  CA  SER B  55       3.577  10.944  46.726  1.00 76.31           C  
+ATOM   2761  CA  VAL B  56       6.436  12.592  44.828  1.00 77.50           C  
+ATOM   2768  CA  ASP B  57       7.691  12.960  41.243  1.00 76.83           C  
+ATOM   2776  CA  GLN B  58      11.150  11.483  40.555  1.00 76.66           C  
+ATOM   2785  CA  SER B  59      10.976  10.827  36.792  1.00 80.19           C  
+ATOM   2791  CA  ASP B  60      14.688  11.644  36.510  1.00 83.51           C  
+ATOM   2799  CA  GLN B  61      15.175   8.137  37.916  1.00 85.74           C  
+ATOM   2808  CA  SER B  62      18.644   7.080  36.699  1.00 85.85           C  
+ATOM   2814  CA  TYR B  63      19.324   5.049  39.852  1.00 84.49           C  
+ATOM   2826  CA  LEU B  64      15.683   4.296  40.629  1.00 89.06           C  
+ATOM   2834  CA  ASP B  65      15.356   0.604  39.742  1.00 92.21           C  
+ATOM   2842  CA  ASP B  66      12.421  -1.791  39.331  1.00 92.35           C  
+ATOM   2850  CA  GLY B  67      10.747  -2.542  42.659  1.00 89.07           C  
+ATOM   2854  CA  GLN B  68      12.336   0.632  44.010  1.00 88.41           C  
+ATOM   2863  CA  ILE B  69       9.483   2.828  42.742  1.00 86.11           C  
+ATOM   2871  CA  ALA B  70       7.060   0.441  44.446  1.00 81.10           C  
+ATOM   2876  CA  ASP B  71       8.985  -0.310  47.648  1.00 76.82           C  
+ATOM   2884  CA  GLY B  72       8.653   3.423  48.186  1.00 73.00           C  
+ATOM   2888  CA  TRP B  73      12.342   4.386  48.095  1.00 67.93           C  
+ATOM   2902  CA  VAL B  74      13.052   8.007  47.136  1.00 63.84           C  
+ATOM   2909  CA  LEU B  75      16.093   9.940  45.892  1.00 58.37           C  
+ATOM   2917  CA  THR B  76      15.524  13.198  47.826  1.00 55.82           C  
+ATOM   2924  CA  CYS B  77      17.941  15.109  45.556  1.00 58.23           C  
+ATOM   2930  CA  HIS B  78      15.777  14.389  42.513  1.00 64.55           C  
+ATOM   2940  CA  ALA B  79      12.108  14.429  43.512  1.00 68.40           C  
+ATOM   2945  CA  TYR B  80       9.442  17.152  43.581  1.00 69.69           C  
+ATOM   2957  CA  PRO B  81       6.414  16.584  45.842  1.00 71.39           C  
+ATOM   2964  CA  THR B  82       3.015  16.014  44.179  1.00 73.67           C  
+ATOM   2971  CA  SER B  83       1.278  15.771  47.557  1.00 76.90           C  
+ATOM   2977  CA  ASP B  84       1.940  16.119  51.289  1.00 75.20           C  
+ATOM   2985  CA  VAL B  85       4.840  13.765  52.050  1.00 71.37           C  
+ATOM   2992  CA  VAL B  86       6.363  11.824  54.956  1.00 70.12           C  
+ATOM   2999  CA  ILE B  87       9.770  10.300  54.188  1.00 74.18           C  
+ATOM   3007  CA  GLU B  88      12.211   8.403  56.410  1.00 78.53           C  
+ATOM   3012  CA  THR B  89      15.541   9.964  55.407  1.00 79.79           C  
+ATOM   3019  CA  HIS B  90      19.062   8.538  55.881  1.00 79.40           C  
+ATOM   3029  CA  LYS B  91      17.584   5.099  55.099  1.00 84.52           C  
+ATOM   3038  CA  GLU B  92      20.016   2.596  53.549  1.00 91.64           C  
+ATOM   3047  CA  GLU B  93      20.192  -0.858  51.981  1.00 98.97           C  
+ATOM   3056  CA  GLU B  94      23.321  -2.924  51.298  1.00106.32           C  
+ATOM   3065  CA  LEU B  95      22.104  -6.552  51.453  1.00111.32           C  
+ATOM   3073  CA  THR B  96      18.778  -8.417  51.866  1.00116.01           C  
+ATOM   3080  CA  GLY B  97      18.877 -11.302  49.394  1.00116.63           C  
+ATOM   3084  CA  ALA B  98      22.056  -9.833  47.910  1.00116.02           C  
+ATOM   3091  CA  GLU C  19      26.080  -2.480  15.294  1.00 73.96           C  
+ATOM   3100  CA  SER C  20      23.405   0.198  14.956  1.00 67.27           C  
+ATOM   3106  CA  LYS C  21      22.937   3.927  15.380  1.00 59.27           C  
+ATOM   3115  CA  LYS C  22      19.198   3.481  15.874  1.00 58.42           C  
+ATOM   3124  CA  GLN C  23      17.251   3.141  19.137  1.00 59.89           C  
+ATOM   3133  CA  GLU C  24      17.931  -0.276  20.610  1.00 62.66           C  
+ATOM   3142  CA  GLU C  25      16.850  -0.453  24.226  1.00 64.27           C  
+ATOM   3151  CA  GLY C  26      13.211  -0.817  25.116  1.00 61.78           C  
+ATOM   3155  CA  VAL C  27      12.703  -2.073  21.582  1.00 58.37           C  
+ATOM   3162  CA  VAL C  28      10.779  -5.347  21.485  1.00 54.17           C  
+ATOM   3169  CA  THR C  29       9.481  -7.339  18.549  1.00 52.79           C  
+ATOM   3176  CA  ASN C  30       6.670  -9.775  17.786  1.00 51.30           C  
+ATOM   3184  CA  LEU C  31       4.863  -9.997  21.112  1.00 51.05           C  
+ATOM   3192  CA  TYR C  32       1.766 -11.297  19.327  1.00 50.51           C  
+ATOM   3204  CA  LYS C  33       1.373 -13.532  16.266  1.00 49.49           C  
+ATOM   3213  CA  PRO C  34      -1.609 -14.150  13.925  1.00 50.98           C  
+ATOM   3220  CA  LYS C  35      -2.450 -17.248  16.011  1.00 55.46           C  
+ATOM   3229  CA  GLU C  36      -2.977 -15.400  19.288  1.00 53.79           C  
+ATOM   3238  CA  PRO C  37      -3.251 -11.638  18.607  1.00 49.32           C  
+ATOM   3245  CA  TYR C  38      -3.674  -9.050  21.318  1.00 46.76           C  
+ATOM   3257  CA  VAL C  39      -7.276  -7.947  21.418  1.00 43.68           C  
+ATOM   3264  CA  GLY C  40      -7.415  -4.194  21.922  1.00 41.62           C  
+ATOM   3268  CA  ARG C  41     -10.273  -1.719  21.954  1.00 40.07           C  
+ATOM   3279  CA  CYS C  42     -11.026   1.064  19.477  1.00 36.37           C  
+ATOM   3285  CA  LEU C  43     -11.330   4.206  21.583  1.00 31.09           C  
+ATOM   3293  CA  LEU C  44     -11.337   6.671  18.673  1.00 28.46           C  
+ATOM   3301  CA  ASN C  45     -11.792   6.653  14.923  1.00 26.74           C  
+ATOM   3309  CA  THR C  46     -11.954   9.920  13.013  1.00 25.29           C  
+ATOM   3316  CA  LYS C  47     -11.667  10.775   9.352  1.00 21.50           C  
+ATOM   3325  CA  ILE C  48      -8.895  13.355   9.121  1.00 19.33           C  
+ATOM   3333  CA  THR C  49      -9.125  14.281   5.442  1.00 20.38           C  
+ATOM   3340  CA  GLY C  50     -11.630  16.676   3.855  1.00 20.12           C  
+ATOM   3344  CA  ASP C  51     -14.895  15.345   2.412  1.00 21.75           C  
+ATOM   3352  CA  ASP C  52     -13.889  16.693  -0.999  1.00 21.19           C  
+ATOM   3360  CA  ALA C  53     -10.651  14.683  -0.749  1.00 21.06           C  
+ATOM   3365  CA  PRO C  54     -10.036  11.974  -3.413  1.00 21.39           C  
+ATOM   3372  CA  GLY C  55      -9.982   9.067  -0.977  1.00 24.42           C  
+ATOM   3376  CA  GLU C  56     -10.374   9.298   2.857  1.00 22.08           C  
+ATOM   3385  CA  THR C  57      -7.723   8.611   5.517  1.00 20.31           C  
+ATOM   3392  CA  TRP C  58      -8.541   7.849   9.162  1.00 19.33           C  
+ATOM   3406  CA  HIS C  59      -6.758   8.520  12.438  1.00 22.68           C  
+ATOM   3416  CA  MET C  60      -7.645   5.951  15.108  1.00 27.16           C  
+ATOM   3424  CA  VAL C  61      -6.672   5.224  18.723  1.00 29.32           C  
+ATOM   3431  CA  PHE C  62      -6.669   1.704  20.220  1.00 34.23           C  
+ATOM   3442  CA  SER C  63      -6.102   0.643  23.847  1.00 37.05           C  
+ATOM   3448  CA  THR C  64      -3.096  -1.517  24.798  1.00 41.86           C  
+ATOM   3455  CA  GLU C  65      -3.169  -1.652  28.621  1.00 48.33           C  
+ATOM   3464  CA  GLY C  66       0.537  -0.885  28.318  1.00 52.45           C  
+ATOM   3468  CA  LYS C  67       0.955  -4.385  26.891  1.00 54.14           C  
+ATOM   3477  CA  ILE C  68       2.429  -3.211  23.570  1.00 51.52           C  
+ATOM   3485  CA  PRO C  69       5.602  -1.279  24.487  1.00 49.85           C  
+ATOM   3492  CA  TYR C  70       6.523  -0.180  20.967  1.00 44.48           C  
+ATOM   3504  CA  ARG C  71       9.185   2.353  19.993  1.00 40.96           C  
+ATOM   3515  CA  GLU C  72       8.727   5.317  17.688  1.00 33.49           C  
+ATOM   3524  CA  GLY C  73       8.913   3.876  14.164  1.00 30.16           C  
+ATOM   3528  CA  GLN C  74       7.423   0.399  14.427  1.00 31.26           C  
+ATOM   3537  CA  SER C  75       4.187  -0.913  12.966  1.00 33.65           C  
+ATOM   3543  CA  ILE C  76       1.454  -3.212  14.278  1.00 33.75           C  
+ATOM   3551  CA  GLY C  77      -0.295  -5.923  12.356  1.00 34.32           C  
+ATOM   3555  CA  VAL C  78      -4.060  -6.111  12.164  1.00 36.67           C  
+ATOM   3562  CA  ILE C  79      -6.137  -9.230  11.507  1.00 41.91           C  
+ATOM   3570  CA  ALA C  80      -9.427  -8.086  10.024  1.00 44.06           C  
+ATOM   3575  CA  ASP C  81     -12.530  -9.927  11.224  1.00 47.03           C  
+ATOM   3583  CA  GLY C  82     -13.972 -12.487   8.829  1.00 53.52           C  
+ATOM   3587  CA  VAL C  83     -12.521 -14.951   6.324  1.00 62.57           C  
+ATOM   3594  CA  ASP C  84     -11.856 -14.200   2.630  1.00 71.97           C  
+ATOM   3602  CA  LYS C  85     -12.935 -17.403   0.861  1.00 76.86           C  
+ATOM   3611  CA  ASN C  86     -13.690 -18.960   4.253  1.00 76.52           C  
+ATOM   3619  CA  GLY C  87     -10.006 -19.837   4.066  1.00 76.22           C  
+ATOM   3623  CA  LYS C  88      -8.802 -19.138   7.616  1.00 71.60           C  
+ATOM   3632  CA  PRO C  89      -8.651 -15.577   8.944  1.00 64.14           C  
+ATOM   3639  CA  HIS C  90      -7.547 -12.649   6.805  1.00 52.35           C  
+ATOM   3649  CA  LYS C  91      -3.753 -12.529   6.474  1.00 46.81           C  
+ATOM   3658  CA  VAL C  92      -2.180  -9.868   8.686  1.00 43.48           C  
+ATOM   3665  CA  ARG C  93      -1.491  -6.414   7.232  1.00 36.99           C  
+ATOM   3676  CA  LEU C  94       0.983  -3.882   8.601  1.00 32.95           C  
+ATOM   3684  CA  TYR C  95       0.340  -0.239   9.510  1.00 24.84           C  
+ATOM   3696  CA  SER C  96       3.003   2.101  10.803  1.00 23.32           C  
+ATOM   3702  CA  ILE C  97       2.244   3.502  14.236  1.00 24.12           C  
+ATOM   3710  CA  ALA C  98       1.243   7.179  13.932  1.00 22.32           C  
+ATOM   3715  CA  SER C  99       1.572   7.636  17.676  1.00 25.69           C  
+ATOM   3721  CA  SER C 100       4.752   7.924  19.726  1.00 28.83           C  
+ATOM   3727  CA  ALA C 101       5.741   5.521  22.508  1.00 35.61           C  
+ATOM   3732  CA  ILE C 102       3.906   7.635  25.079  1.00 38.39           C  
+ATOM   3740  CA  GLY C 103       0.899   7.826  22.742  1.00 31.93           C  
+ATOM   3744  CA  ASP C 104      -1.803  10.384  21.986  1.00 28.77           C  
+ATOM   3752  CA  PHE C 105      -3.050  10.293  25.607  1.00 37.05           C  
+ATOM   3763  CA  GLY C 106       0.503  10.389  26.967  1.00 39.36           C  
+ATOM   3767  CA  ASP C 107      -0.221   7.437  29.266  1.00 41.44           C  
+ATOM   3775  CA  SER C 108       1.566   4.766  27.217  1.00 42.18           C  
+ATOM   3781  CA  LYS C 109      -1.747   2.877  27.156  1.00 42.45           C  
+ATOM   3790  CA  THR C 110      -2.698   3.586  23.515  1.00 38.10           C  
+ATOM   3797  CA  VAL C 111      -1.603   2.971  19.906  1.00 32.79           C  
+ATOM   3804  CA  SER C 112      -2.671   5.020  16.872  1.00 29.60           C  
+ATOM   3810  CA  LEU C 113      -2.713   4.324  13.126  1.00 25.68           C  
+ATOM   3818  CA  CYS C 114      -3.142   6.498   9.999  1.00 24.23           C  
+ATOM   3824  CA  VAL C 115      -5.345   4.496   7.641  1.00 22.80           C  
+ATOM   3831  CA  LYS C 116      -6.221   5.196   4.015  1.00 22.11           C  
+ATOM   3840  CA  ARG C 117      -9.458   3.521   2.955  1.00 25.68           C  
+ATOM   3851  CA  LEU C 118      -8.447   1.440  -0.100  1.00 28.80           C  
+ATOM   3859  CA  ILE C 119     -11.140   1.661  -2.792  1.00 31.75           C  
+ATOM   3867  CA  TYR C 120     -10.086   0.716  -6.312  1.00 32.93           C  
+ATOM   3879  CA  THR C 121     -11.388  -0.733  -9.598  1.00 36.84           C  
+ATOM   3886  CA  ASN C 122     -10.258  -4.257 -10.546  1.00 36.90           C  
+ATOM   3894  CA  ASP C 123      -9.574  -5.562 -14.056  1.00 45.45           C  
+ATOM   3902  CA  ALA C 124     -13.196  -6.758 -14.269  1.00 44.66           C  
+ATOM   3907  CA  GLY C 125     -14.207  -3.102 -14.023  1.00 45.49           C  
+ATOM   3911  CA  GLU C 126     -16.059  -3.511 -10.722  1.00 45.54           C  
+ATOM   3920  CA  ILE C 127     -15.507  -1.321  -7.638  1.00 39.70           C  
+ATOM   3928  CA  VAL C 128     -13.846  -3.171  -4.762  1.00 38.09           C  
+ATOM   3935  CA  LYS C 129     -12.759  -2.512  -1.198  1.00 33.77           C  
+ATOM   3944  CA  GLY C 130      -9.566  -3.363   0.599  1.00 31.98           C  
+ATOM   3948  CA  VAL C 131     -10.443  -5.797   3.385  1.00 33.16           C  
+ATOM   3955  CA  CYS C 132      -8.241  -4.645   6.257  1.00 29.97           C  
+ATOM   3961  CA  SER C 133      -8.238  -0.898   5.607  1.00 30.67           C  
+ATOM   3967  CA  ASN C 134     -12.022  -0.902   5.268  1.00 30.35           C  
+ATOM   3975  CA  PHE C 135     -12.375  -2.946   8.424  1.00 29.86           C  
+ATOM   3986  CA  LEU C 136     -10.223  -0.334  10.195  1.00 29.42           C  
+ATOM   3994  CA  CYS C 137     -11.779   2.834   8.813  1.00 32.27           C  
+ATOM   4000  CA  ASP C 138     -15.116   1.280   9.724  1.00 34.29           C  
+ATOM   4008  CA  LEU C 139     -14.287   0.699  13.399  1.00 37.51           C  
+ATOM   4016  CA  GLN C 140     -16.635   2.170  16.028  1.00 43.76           C  
+ATOM   4025  CA  PRO C 141     -15.630   3.032  19.581  1.00 42.77           C  
+ATOM   4032  CA  GLY C 142     -16.082  -0.210  21.478  1.00 42.83           C  
+ATOM   4036  CA  ASP C 143     -15.117  -2.625  18.696  1.00 40.91           C  
+ATOM   4044  CA  ASN C 144     -12.182  -4.947  19.288  1.00 45.66           C  
+ATOM   4052  CA  VAL C 145      -9.056  -5.146  17.145  1.00 46.95           C  
+ATOM   4059  CA  GLN C 146      -6.707  -8.107  16.606  1.00 48.69           C  
+ATOM   4068  CA  ILE C 147      -3.249  -6.538  17.123  1.00 46.84           C  
+ATOM   4076  CA  THR C 148      -0.010  -8.392  16.264  1.00 46.26           C  
+ATOM   4083  CA  GLY C 149       3.543  -7.117  16.634  1.00 45.60           C  
+ATOM   4087  CA  PRO C 150       5.248  -4.818  17.394  1.00 44.97           C  
+ATOM   4094  CA  VAL C 151       7.423  -5.293  14.321  1.00 44.50           C  
+ATOM   4101  CA  GLY C 152      10.289  -3.716  12.438  1.00 45.33           C  
+ATOM   4105  CA  LYS C 153      13.599  -2.161  13.435  1.00 48.64           C  
+ATOM   4114  CA  GLU C 154      14.166  -0.437  10.074  1.00 48.20           C  
+ATOM   4123  CA  MET C 155      12.437   2.888  10.737  1.00 41.77           C  
+ATOM   4131  CA  LEU C 156      13.839   3.081  14.267  1.00 38.27           C  
+ATOM   4139  CA  MET C 157      15.076   6.540  15.308  1.00 34.29           C  
+ATOM   4147  CA  PRO C 158      18.782   7.419  15.339  1.00 34.05           C  
+ATOM   4154  CA  LYS C 159      20.262   7.521  18.845  1.00 35.82           C  
+ATOM   4163  CA  ASP C 160      22.076  10.792  18.273  1.00 35.95           C  
+ATOM   4171  CA  PRO C 161      19.683  13.401  19.809  1.00 35.63           C  
+ATOM   4178  CA  ASN C 162      21.563  15.948  17.758  1.00 33.92           C  
+ATOM   4186  CA  ALA C 163      21.028  14.172  14.487  1.00 30.82           C  
+ATOM   4191  CA  THR C 164      19.693  15.722  11.305  1.00 25.18           C  
+ATOM   4198  CA  ILE C 165      16.617  13.601  10.636  1.00 19.91           C  
+ATOM   4206  CA  ILE C 166      15.351  13.978   7.060  1.00 13.76           C  
+ATOM   4214  CA  MET C 167      11.843  12.550   6.703  1.00 14.98           C  
+ATOM   4222  CA  LEU C 168      10.385  11.831   3.251  1.00 16.64           C  
+ATOM   4230  CA  ALA C 169       6.747  10.808   3.007  1.00 15.85           C  
+ATOM   4235  CA  THR C 170       3.765  10.346   0.737  1.00 14.23           C  
+ATOM   4242  CA  GLY C 171       0.255   9.724   2.035  1.00 13.78           C  
+ATOM   4246  CA  THR C 172      -0.103   7.560   5.139  1.00 17.62           C  
+ATOM   4253  CA  GLY C 173       3.646   7.343   4.821  1.00 17.20           C  
+ATOM   4257  CA  ILE C 174       3.469  10.213   7.270  1.00 15.91           C  
+ATOM   4265  CA  ALA C 175       2.586   7.783  10.110  1.00 15.63           C  
+ATOM   4270  CA  PRO C 176       6.023   6.933  11.582  1.00 17.04           C  
+ATOM   4277  CA  PHE C 177       7.215  10.514  11.327  1.00 18.21           C  
+ATOM   4288  CA  ARG C 178       4.268  11.745  13.359  1.00 22.35           C  
+ATOM   4299  CA  SER C 179       5.563   9.289  15.983  1.00 25.22           C  
+ATOM   4305  CA  PHE C 180       9.139  10.593  15.614  1.00 25.98           C  
+ATOM   4316  CA  LEU C 181       7.925  14.180  15.767  1.00 29.12           C  
+ATOM   4324  CA  TRP C 182       5.625  13.641  18.714  1.00 31.35           C  
+ATOM   4338  CA  LYS C 183       8.488  12.385  20.871  1.00 30.92           C  
+ATOM   4347  CA  MET C 184      10.841  15.050  19.503  1.00 24.85           C  
+ATOM   4355  CA  PHE C 185       8.741  18.202  20.114  1.00 22.97           C  
+ATOM   4366  CA  PHE C 186       5.604  17.337  22.076  1.00 27.77           C  
+ATOM   4377  CA  GLU C 187       7.117  15.432  25.009  1.00 37.71           C  
+ATOM   4386  CA  LYS C 188       9.542  15.977  27.878  1.00 53.59           C  
+ATOM   4395  CA  HIS C 189      12.355  13.416  28.180  1.00 63.67           C  
+ATOM   4405  CA  ASP C 190      15.318  13.181  30.569  1.00 66.93           C  
+ATOM   4413  CA  ASP C 191      17.480  11.106  28.238  1.00 59.79           C  
+ATOM   4421  CA  TYR C 192      16.190  12.725  25.047  1.00 51.96           C  
+ATOM   4433  CA  LYS C 193      16.700  16.406  24.324  1.00 47.01           C  
+ATOM   4442  CA  PHE C 194      16.580  16.471  20.530  1.00 39.85           C  
+ATOM   4453  CA  ASN C 195      18.572  19.494  19.409  1.00 37.52           C  
+ATOM   4461  CA  GLY C 196      19.361  18.548  15.845  1.00 32.08           C  
+ATOM   4465  CA  LEU C 197      17.310  19.266  12.766  1.00 28.26           C  
+ATOM   4473  CA  GLY C 198      14.051  17.526  11.928  1.00 25.05           C  
+ATOM   4477  CA  TRP C 199      13.211  18.137   8.269  1.00 19.81           C  
+ATOM   4491  CA  LEU C 200       9.908  16.742   7.059  1.00 13.86           C  
+ATOM   4499  CA  PHE C 201       8.855  16.521   3.429  1.00 14.83           C  
+ATOM   4510  CA  LEU C 202       5.288  15.361   2.717  1.00 16.12           C  
+ATOM   4518  CA  GLY C 203       3.701  14.731  -0.681  1.00 13.79           C  
+ATOM   4522  CA  VAL C 204      -0.051  14.414  -1.182  1.00 11.75           C  
+ATOM   4529  CA  PRO C 205      -2.113  15.264  -4.308  1.00 14.66           C  
+ATOM   4536  CA  THR C 206      -4.553  17.737  -2.778  1.00 16.37           C  
+ATOM   4543  CA  SER C 207      -4.756  20.169   0.120  1.00 18.01           C  
+ATOM   4549  CA  SER C 208      -7.780  18.225   1.280  1.00 17.59           C  
+ATOM   4555  CA  SER C 209      -5.452  15.198   1.550  1.00 16.19           C  
+ATOM   4561  CA  LEU C 210      -2.972  16.940   3.860  1.00 14.22           C  
+ATOM   4569  CA  LEU C 211      -2.255  14.980   7.059  1.00 14.43           C  
+ATOM   4577  CA  TYR C 212      -1.624  16.449  10.549  1.00 18.94           C  
+ATOM   4589  CA  LYS C 213      -0.818  19.896   9.150  1.00 22.61           C  
+ATOM   4598  CA  GLU C 214      -2.039  21.572  12.352  1.00 25.73           C  
+ATOM   4607  CA  GLU C 215       0.152  19.413  14.514  1.00 19.23           C  
+ATOM   4616  CA  PHE C 216       3.216  20.178  12.439  1.00 17.80           C  
+ATOM   4627  CA  GLY C 217       2.478  23.890  12.512  1.00 19.90           C  
+ATOM   4631  CA  LYS C 218       2.578  24.001  16.294  1.00 25.54           C  
+ATOM   4640  CA  MET C 219       5.810  22.021  16.188  1.00 26.79           C  
+ATOM   4648  CA  LYS C 220       7.224  24.606  13.819  1.00 31.85           C  
+ATOM   4657  CA  GLU C 221       6.071  27.341  16.219  1.00 38.62           C  
+ATOM   4666  CA  ARG C 222       7.760  25.760  19.233  1.00 39.10           C  
+ATOM   4677  CA  ALA C 223      11.124  24.971  17.668  1.00 35.43           C  
+ATOM   4682  CA  PRO C 224      11.696  27.100  14.528  1.00 32.99           C  
+ATOM   4689  CA  GLU C 225      15.425  26.331  14.360  1.00 33.87           C  
+ATOM   4698  CA  ASN C 226      15.038  22.591  14.986  1.00 30.46           C  
+ATOM   4706  CA  PHE C 227      12.088  21.755  12.732  1.00 24.98           C  
+ATOM   4717  CA  ARG C 228      11.351  22.384   9.075  1.00 19.87           C  
+ATOM   4728  CA  VAL C 229       8.435  21.010   7.118  1.00 14.21           C  
+ATOM   4735  CA  ASP C 230       7.739  21.452   3.398  1.00 12.26           C  
+ATOM   4743  CA  TYR C 231       4.627  20.147   1.722  1.00 14.42           C  
+ATOM   4755  CA  ALA C 232       4.334  19.003  -1.872  1.00  9.99           C  
+ATOM   4760  CA  VAL C 233       0.778  19.232  -3.168  1.00 10.49           C  
+ATOM   4767  CA  SER C 234       1.043  17.769  -6.694  1.00 19.00           C  
+ATOM   4773  CA  ARG C 235      -2.240  19.042  -8.206  1.00 23.13           C  
+ATOM   4784  CA  GLU C 236      -2.069  22.459  -6.578  1.00 17.58           C  
+ATOM   4793  CA  GLN C 237       1.546  23.511  -6.623  1.00 15.89           C  
+ATOM   4802  CA  THR C 238       4.202  24.018  -9.275  1.00 17.86           C  
+ATOM   4809  CA  ASN C 239       7.922  24.800  -9.182  1.00 15.15           C  
+ATOM   4817  CA  ALA C 240       9.558  27.791 -10.892  1.00 21.51           C  
+ATOM   4822  CA  ALA C 241       9.475  25.887 -14.174  1.00 24.05           C  
+ATOM   4827  CA  GLY C 242       5.741  25.110 -13.938  1.00 26.25           C  
+ATOM   4831  CA  GLU C 243       5.999  21.359 -13.153  1.00 25.92           C  
+ATOM   4840  CA  ARG C 244       3.679  19.536 -10.704  1.00 24.04           C  
+ATOM   4851  CA  MET C 245       5.076  19.643  -7.174  1.00 18.58           C  
+ATOM   4859  CA  TYR C 246       5.784  16.047  -6.100  1.00 14.16           C  
+ATOM   4871  CA  ILE C 247       7.910  15.343  -3.034  1.00 16.78           C  
+ATOM   4879  CA  GLN C 248      11.089  15.070  -5.120  1.00 18.72           C  
+ATOM   4888  CA  THR C 249      10.168  18.255  -6.921  1.00 20.93           C  
+ATOM   4895  CA  ARG C 250       9.962  20.031  -3.567  1.00 19.25           C  
+ATOM   4906  CA  MET C 251      13.275  18.471  -2.561  1.00 19.40           C  
+ATOM   4914  CA  ALA C 252      14.910  19.812  -5.760  1.00 20.48           C  
+ATOM   4919  CA  GLU C 253      14.456  23.418  -4.569  1.00 18.19           C  
+ATOM   4928  CA  TYR C 254      16.804  22.515  -1.673  1.00 17.80           C  
+ATOM   4940  CA  LYS C 255      19.038  20.415  -3.902  1.00 20.66           C  
+ATOM   4949  CA  GLU C 256      22.452  21.603  -2.682  1.00 16.05           C  
+ATOM   4958  CA  GLU C 257      21.544  21.914   0.993  1.00 15.89           C  
+ATOM   4967  CA  LEU C 258      20.377  18.297   0.919  1.00 20.74           C  
+ATOM   4975  CA  TRP C 259      23.388  16.939  -0.965  1.00 23.45           C  
+ATOM   4989  CA  GLU C 260      25.645  18.669   1.563  1.00 24.08           C  
+ATOM   4998  CA  LEU C 261      23.573  17.378   4.477  1.00 24.74           C  
+ATOM   5006  CA  LEU C 262      24.020  13.928   2.938  1.00 26.14           C  
+ATOM   5014  CA  LYS C 263      27.792  14.091   3.402  1.00 25.40           C  
+ATOM   5023  CA  LYS C 264      27.457  14.521   7.176  1.00 31.47           C  
+ATOM   5032  CA  ASP C 265      27.877  11.474   9.425  1.00 35.31           C  
+ATOM   5040  CA  ASN C 266      24.934  12.482  11.620  1.00 29.63           C  
+ATOM   5048  CA  THR C 267      22.321  12.795   8.832  1.00 28.00           C  
+ATOM   5055  CA  TYR C 268      19.556  10.160   8.808  1.00 27.00           C  
+ATOM   5067  CA  VAL C 269      17.143   9.903   5.884  1.00 24.65           C  
+ATOM   5074  CA  TYR C 270      13.890   8.016   6.276  1.00 23.37           C  
+ATOM   5086  CA  MET C 271      11.373   7.327   3.518  1.00 18.93           C  
+ATOM   5094  CA  CYS C 272       7.834   6.074   4.043  1.00 18.24           C  
+ATOM   5100  CA  GLY C 273       4.784   5.874   1.826  1.00 22.39           C  
+ATOM   5104  CA  LEU C 274       3.837   4.483  -1.568  1.00 26.95           C  
+ATOM   5112  CA  LYS C 275       6.305   2.384  -3.532  1.00 32.36           C  
+ATOM   5121  CA  GLY C 276       7.741   4.199  -6.514  1.00 37.46           C  
+ATOM   5125  CA  MET C 277       7.714   7.455  -4.608  1.00 28.76           C  
+ATOM   5133  CA  GLU C 278      11.430   6.639  -4.425  1.00 32.22           C  
+ATOM   5142  CA  LYS C 279      12.017   6.321  -8.153  1.00 29.94           C  
+ATOM   5151  CA  GLY C 280      11.317  10.057  -8.293  1.00 24.18           C  
+ATOM   5155  CA  ILE C 281      13.766  10.673  -5.460  1.00 23.68           C  
+ATOM   5163  CA  ASP C 282      16.431   8.365  -6.934  1.00 26.58           C  
+ATOM   5171  CA  ASP C 283      16.211  10.530 -10.054  1.00 28.70           C  
+ATOM   5179  CA  ILE C 284      17.089  13.937  -8.538  1.00 27.28           C  
+ATOM   5187  CA  MET C 285      19.706  12.222  -6.388  1.00 27.45           C  
+ATOM   5195  CA  VAL C 286      21.377  10.712  -9.470  1.00 30.74           C  
+ATOM   5202  CA  SER C 287      21.619  14.159 -11.061  1.00 32.14           C  
+ATOM   5208  CA  LEU C 288      23.240  15.463  -7.873  1.00 34.20           C  
+ATOM   5216  CA  ALA C 289      25.801  12.653  -7.874  1.00 40.16           C  
+ATOM   5221  CA  GLU C 290      26.837  12.825 -11.536  1.00 41.84           C  
+ATOM   5230  CA  LYS C 291      27.855  16.387 -10.793  1.00 43.17           C  
+ATOM   5239  CA  ASP C 292      30.299  15.115  -8.139  1.00 41.84           C  
+ATOM   5247  CA  GLY C 293      31.237  12.232 -10.420  1.00 46.12           C  
+ATOM   5251  CA  ILE C 294      30.053   9.669  -7.864  1.00 45.54           C  
+ATOM   5259  CA  ASP C 295      27.399   6.998  -8.480  1.00 41.14           C  
+ATOM   5267  CA  TRP C 296      24.222   7.605  -6.479  1.00 30.67           C  
+ATOM   5281  CA  PHE C 297      23.381   3.910  -6.151  1.00 31.97           C  
+ATOM   5292  CA  ASP C 298      26.856   2.916  -4.907  1.00 38.12           C  
+ATOM   5300  CA  TYR C 299      26.671   5.875  -2.540  1.00 39.05           C  
+ATOM   5312  CA  LYS C 300      23.196   4.971  -1.294  1.00 41.63           C  
+ATOM   5321  CA  LYS C 301      24.542   1.489  -0.577  1.00 43.40           C  
+ATOM   5330  CA  GLN C 302      27.207   3.064   1.608  1.00 43.79           C  
+ATOM   5339  CA  LEU C 303      24.476   5.181   3.238  1.00 41.51           C  
+ATOM   5347  CA  LYS C 304      22.138   2.343   4.264  1.00 45.18           C  
+ATOM   5356  CA  ARG C 305      25.322   0.535   5.256  1.00 46.65           C  
+ATOM   5367  CA  GLY C 306      25.613   3.181   7.945  1.00 40.29           C  
+ATOM   5371  CA  ASP C 307      21.954   3.487   8.940  1.00 41.21           C  
+ATOM   5379  CA  GLN C 308      21.463   6.730   7.023  1.00 35.55           C  
+ATOM   5388  CA  TRP C 309      18.961   5.674   4.361  1.00 31.22           C  
+ATOM   5402  CA  ASN C 310      16.018   3.728   5.752  1.00 31.61           C  
+ATOM   5410  CA  VAL C 311      13.120   2.841   3.452  1.00 32.13           C  
+ATOM   5417  CA  GLU C 312       9.705   1.332   4.261  1.00 31.51           C  
+ATOM   5426  CA  VAL C 313       7.466   1.606   1.209  1.00 26.39           C  
+ATOM   5433  CA  TYR C 314       4.403  -0.343   0.111  1.00 25.42           C  
diff --git a/utils/jalviewjs/site-resources/examples/2GIS.pdb b/utils/jalviewjs/site-resources/examples/2GIS.pdb
new file mode 100644 (file)
index 0000000..7a51ef1
--- /dev/null
@@ -0,0 +1,2693 @@
+HEADER    RNA                                     29-MAR-06   2GIS              
+TITLE     STRUCTURE OF THE S-ADENOSYLMETHIONINE RIBOSWITCH MRNA                 
+TITLE    2 REGULATORY ELEMENT                                                   
+COMPND    MOL_ID: 1;                                                            
+COMPND   2 MOLECULE: SAM-I RIBOSWITCH;                                          
+COMPND   3 CHAIN: A;                                                            
+COMPND   4 ENGINEERED: YES                                                      
+SOURCE    MOL_ID: 1;                                                            
+SOURCE   2 SYNTHETIC: YES;                                                      
+SOURCE   3 OTHER_DETAILS: THIS SEQUENCE WAS ENGINEERED BASED ON THE             
+SOURCE   4 SAM-I RIBOSWITCH FROM THE METF-METH OPERON IN                        
+SOURCE   5 THERMOANAEROBACTER TENGCONGENSIS                                     
+KEYWDS    MRNA, RIBOSWITCH, S-ADENOSYLMETHIONINE, SAM, RNA-LIGAND               
+KEYWDS   2 COMPLEX                                                              
+EXPDTA    X-RAY DIFFRACTION                                                     
+AUTHOR    R.K.MONTANGE,R.T.BATEY                                                
+REVDAT   2   24-FEB-09 2GIS    1       VERSN                                    
+REVDAT   1   04-JUL-06 2GIS    0                                                
+JRNL        AUTH   R.K.MONTANGE,R.T.BATEY                                       
+JRNL        TITL   STRUCTURE OF THE S-ADENOSYLMETHIONINE RIBOSWITCH             
+JRNL        TITL 2 REGULATORY MRNA ELEMENT.                                     
+JRNL        REF    NATURE                        V. 441  1172 2006              
+JRNL        REFN                   ISSN 0028-0836                               
+JRNL        PMID   16810258                                                     
+JRNL        DOI    10.1038/NATURE04819                                          
+REMARK   1                                                                      
+REMARK   2                                                                      
+REMARK   2 RESOLUTION.    2.90 ANGSTROMS.                                       
+REMARK   3                                                                      
+REMARK   3 REFINEMENT.                                                          
+REMARK   3   PROGRAM     : CNS 1.1                                              
+REMARK   3   AUTHORS     : BRUNGER,ADAMS,CLORE,DELANO,GROS,GROSSE-              
+REMARK   3               : KUNSTLEVE,JIANG,KUSZEWSKI,NILGES, PANNU,             
+REMARK   3               : READ,RICE,SIMONSON,WARREN                            
+REMARK   3                                                                      
+REMARK   3  REFINEMENT TARGET : ENGH & HUBER                                    
+REMARK   3                                                                      
+REMARK   3  DATA USED IN REFINEMENT.                                            
+REMARK   3   RESOLUTION RANGE HIGH (ANGSTROMS) : 2.90                           
+REMARK   3   RESOLUTION RANGE LOW  (ANGSTROMS) : 49.32                          
+REMARK   3   DATA CUTOFF            (SIGMA(F)) : 0.000                          
+REMARK   3   DATA CUTOFF HIGH         (ABS(F)) : 441185.100                     
+REMARK   3   DATA CUTOFF LOW          (ABS(F)) : 0.0000                         
+REMARK   3   COMPLETENESS (WORKING+TEST)   (%) : 99.3                           
+REMARK   3   NUMBER OF REFLECTIONS             : 13415                          
+REMARK   3                                                                      
+REMARK   3  FIT TO DATA USED IN REFINEMENT.                                     
+REMARK   3   CROSS-VALIDATION METHOD          : THROUGHOUT                      
+REMARK   3   FREE R VALUE TEST SET SELECTION  : RANDOM                          
+REMARK   3   R VALUE            (WORKING SET) : 0.266                           
+REMARK   3   FREE R VALUE                     : 0.289                           
+REMARK   3   FREE R VALUE TEST SET SIZE   (%) : 7.400                           
+REMARK   3   FREE R VALUE TEST SET COUNT      : 999                             
+REMARK   3   ESTIMATED ERROR OF FREE R VALUE  : 0.009                           
+REMARK   3                                                                      
+REMARK   3  FIT IN THE HIGHEST RESOLUTION BIN.                                  
+REMARK   3   TOTAL NUMBER OF BINS USED           : 6                            
+REMARK   3   BIN RESOLUTION RANGE HIGH       (A) : 2.90                         
+REMARK   3   BIN RESOLUTION RANGE LOW        (A) : 3.08                         
+REMARK   3   BIN COMPLETENESS (WORKING+TEST) (%) : 98.90                        
+REMARK   3   REFLECTIONS IN BIN    (WORKING SET) : 2056                         
+REMARK   3   BIN R VALUE           (WORKING SET) : 0.4270                       
+REMARK   3   BIN FREE R VALUE                    : 0.4160                       
+REMARK   3   BIN FREE R VALUE TEST SET SIZE  (%) : 7.30                         
+REMARK   3   BIN FREE R VALUE TEST SET COUNT     : 162                          
+REMARK   3   ESTIMATED ERROR OF BIN FREE R VALUE : 0.033                        
+REMARK   3                                                                      
+REMARK   3  NUMBER OF NON-HYDROGEN ATOMS USED IN REFINEMENT.                    
+REMARK   3   PROTEIN ATOMS            : 0                                       
+REMARK   3   NUCLEIC ACID ATOMS       : 2029                                    
+REMARK   3   HETEROGEN ATOMS          : 57                                      
+REMARK   3   SOLVENT ATOMS            : 88                                      
+REMARK   3                                                                      
+REMARK   3  B VALUES.                                                           
+REMARK   3   FROM WILSON PLOT           (A**2) : 139.30                         
+REMARK   3   MEAN B VALUE      (OVERALL, A**2) : 69.60                          
+REMARK   3   OVERALL ANISOTROPIC B VALUE.                                       
+REMARK   3    B11 (A**2) : 11.87000                                             
+REMARK   3    B22 (A**2) : 11.87000                                             
+REMARK   3    B33 (A**2) : -23.74000                                            
+REMARK   3    B12 (A**2) : 0.00000                                              
+REMARK   3    B13 (A**2) : 0.00000                                              
+REMARK   3    B23 (A**2) : 0.00000                                              
+REMARK   3                                                                      
+REMARK   3  ESTIMATED COORDINATE ERROR.                                         
+REMARK   3   ESD FROM LUZZATI PLOT        (A) : 0.39                            
+REMARK   3   ESD FROM SIGMAA              (A) : 0.39                            
+REMARK   3   LOW RESOLUTION CUTOFF        (A) : 5.00                            
+REMARK   3                                                                      
+REMARK   3  CROSS-VALIDATED ESTIMATED COORDINATE ERROR.                         
+REMARK   3   ESD FROM C-V LUZZATI PLOT    (A) : 0.48                            
+REMARK   3   ESD FROM C-V SIGMAA          (A) : 0.35                            
+REMARK   3                                                                      
+REMARK   3  RMS DEVIATIONS FROM IDEAL VALUES.                                   
+REMARK   3   BOND LENGTHS                 (A) : 0.010                           
+REMARK   3   BOND ANGLES            (DEGREES) : 1.60                            
+REMARK   3   DIHEDRAL ANGLES        (DEGREES) : 17.30                           
+REMARK   3   IMPROPER ANGLES        (DEGREES) : 2.31                            
+REMARK   3                                                                      
+REMARK   3  ISOTROPIC THERMAL MODEL : RESTRAINED                                
+REMARK   3                                                                      
+REMARK   3  ISOTROPIC THERMAL FACTOR RESTRAINTS.    RMS    SIGMA                
+REMARK   3   MAIN-CHAIN BOND              (A**2) : 1.380 ; 1.500                
+REMARK   3   MAIN-CHAIN ANGLE             (A**2) : 2.560 ; 2.000                
+REMARK   3   SIDE-CHAIN BOND              (A**2) : 1.630 ; 2.000                
+REMARK   3   SIDE-CHAIN ANGLE             (A**2) : 2.610 ; 2.500                
+REMARK   3                                                                      
+REMARK   3  BULK SOLVENT MODELING.                                              
+REMARK   3   METHOD USED : FLAT MODEL                                           
+REMARK   3   KSOL        : 0.88                                                 
+REMARK   3   BSOL        : 300.00                                               
+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  : DNA-RNA_REP.PARAM                              
+REMARK   3  PARAMETER FILE  2  : ION2.PARAM                                     
+REMARK   3  PARAMETER FILE  3  : SAM3.PARAM                                     
+REMARK   3  PARAMETER FILE  4  : WATER_REP.PARAM                                
+REMARK   3  PARAMETER FILE  5  : NULL                                           
+REMARK   3  TOPOLOGY FILE  1   : DNA-RNA_REP.TOP                                
+REMARK   3  TOPOLOGY FILE  2   : ION2.TOP                                       
+REMARK   3  TOPOLOGY FILE  3   : SAM3.TOP                                       
+REMARK   3  TOPOLOGY FILE  4   : WATER_REP.TOP                                  
+REMARK   3  TOPOLOGY FILE  5   : NULL                                           
+REMARK   3                                                                      
+REMARK   3  OTHER REFINEMENT REMARKS: NULL                                      
+REMARK   4                                                                      
+REMARK   4 2GIS COMPLIES WITH FORMAT V. 3.15, 01-DEC-08                         
+REMARK 100                                                                      
+REMARK 100 THIS ENTRY HAS BEEN PROCESSED BY RCSB ON 14-APR-06.                  
+REMARK 100 THE RCSB ID CODE IS RCSB037170.                                      
+REMARK 200                                                                      
+REMARK 200 EXPERIMENTAL DETAILS                                                 
+REMARK 200  EXPERIMENT TYPE                : X-RAY DIFFRACTION                  
+REMARK 200  DATE OF DATA COLLECTION        : 11-NOV-05                          
+REMARK 200  TEMPERATURE           (KELVIN) : 100                                
+REMARK 200  PH                             : NULL                               
+REMARK 200  NUMBER OF CRYSTALS USED        : 1                                  
+REMARK 200                                                                      
+REMARK 200  SYNCHROTRON              (Y/N) : Y                                  
+REMARK 200  RADIATION SOURCE               : ALS                                
+REMARK 200  BEAMLINE                       : 8.2.1                              
+REMARK 200  X-RAY GENERATOR MODEL          : NULL                               
+REMARK 200  MONOCHROMATIC OR LAUE    (M/L) : M                                  
+REMARK 200  WAVELENGTH OR RANGE        (A) : 1.10532, 1.10573                   
+REMARK 200  MONOCHROMATOR                  : NULL                               
+REMARK 200  OPTICS                         : NULL                               
+REMARK 200                                                                      
+REMARK 200  DETECTOR TYPE                  : CCD                                
+REMARK 200  DETECTOR MANUFACTURER          : ADSC QUANTUM 315                   
+REMARK 200  INTENSITY-INTEGRATION SOFTWARE : BOS                                
+REMARK 200  DATA SCALING SOFTWARE          : D*TREK                             
+REMARK 200                                                                      
+REMARK 200  NUMBER OF UNIQUE REFLECTIONS   : 14940                              
+REMARK 200  RESOLUTION RANGE HIGH      (A) : 2.900                              
+REMARK 200  RESOLUTION RANGE LOW       (A) : 49.320                             
+REMARK 200  REJECTION CRITERIA  (SIGMA(I)) : 3.000                              
+REMARK 200                                                                      
+REMARK 200 OVERALL.                                                             
+REMARK 200  COMPLETENESS FOR RANGE     (%) : 99.6                               
+REMARK 200  DATA REDUNDANCY                : 14.640                             
+REMARK 200  R MERGE                    (I) : 0.07200                            
+REMARK 200  R SYM                      (I) : NULL                               
+REMARK 200  <I/SIGMA(I)> FOR THE DATA SET  : 17.9000                            
+REMARK 200                                                                      
+REMARK 200 IN THE HIGHEST RESOLUTION SHELL.                                     
+REMARK 200  HIGHEST RESOLUTION SHELL, RANGE HIGH (A) : 2.90                     
+REMARK 200  HIGHEST RESOLUTION SHELL, RANGE LOW  (A) : 3.08                     
+REMARK 200  COMPLETENESS FOR SHELL     (%) : 99.9                               
+REMARK 200  DATA REDUNDANCY IN SHELL       : 11.74                              
+REMARK 200  R MERGE FOR SHELL          (I) : 0.42600                            
+REMARK 200  R SYM FOR SHELL            (I) : NULL                               
+REMARK 200  <I/SIGMA(I)> FOR SHELL         : 4.400                              
+REMARK 200                                                                      
+REMARK 200 DIFFRACTION PROTOCOL: MAD                                            
+REMARK 200 METHOD USED TO DETERMINE THE STRUCTURE: MAD                          
+REMARK 200 SOFTWARE USED: CNS                                                   
+REMARK 200 STARTING MODEL: NULL                                                 
+REMARK 200                                                                      
+REMARK 200 REMARK: NULL                                                         
+REMARK 280                                                                      
+REMARK 280 CRYSTAL                                                              
+REMARK 280 SOLVENT CONTENT, VS   (%): 52.20                                     
+REMARK 280 MATTHEWS COEFFICIENT, VM (ANGSTROMS**3/DA): 2.57                     
+REMARK 280                                                                      
+REMARK 280 CRYSTALLIZATION CONDITIONS: NULL                                     
+REMARK 290                                                                      
+REMARK 290 CRYSTALLOGRAPHIC SYMMETRY                                            
+REMARK 290 SYMMETRY OPERATORS FOR SPACE GROUP: P 43 21 2                        
+REMARK 290                                                                      
+REMARK 290      SYMOP   SYMMETRY                                                
+REMARK 290     NNNMMM   OPERATOR                                                
+REMARK 290       1555   X,Y,Z                                                   
+REMARK 290       2555   -X,-Y,Z+1/2                                             
+REMARK 290       3555   -Y+1/2,X+1/2,Z+3/4                                      
+REMARK 290       4555   Y+1/2,-X+1/2,Z+1/4                                      
+REMARK 290       5555   -X+1/2,Y+1/2,-Z+3/4                                     
+REMARK 290       6555   X+1/2,-Y+1/2,-Z+1/4                                     
+REMARK 290       7555   Y,X,-Z                                                  
+REMARK 290       8555   -Y,-X,-Z+1/2                                            
+REMARK 290                                                                      
+REMARK 290     WHERE NNN -> OPERATOR NUMBER                                     
+REMARK 290           MMM -> TRANSLATION VECTOR                                  
+REMARK 290                                                                      
+REMARK 290 CRYSTALLOGRAPHIC SYMMETRY TRANSFORMATIONS                            
+REMARK 290 THE FOLLOWING TRANSFORMATIONS OPERATE ON THE ATOM/HETATM             
+REMARK 290 RECORDS IN THIS ENTRY TO PRODUCE CRYSTALLOGRAPHICALLY                
+REMARK 290 RELATED MOLECULES.                                                   
+REMARK 290   SMTRY1   1  1.000000  0.000000  0.000000        0.00000            
+REMARK 290   SMTRY2   1  0.000000  1.000000  0.000000        0.00000            
+REMARK 290   SMTRY3   1  0.000000  0.000000  1.000000        0.00000            
+REMARK 290   SMTRY1   2 -1.000000  0.000000  0.000000        0.00000            
+REMARK 290   SMTRY2   2  0.000000 -1.000000  0.000000        0.00000            
+REMARK 290   SMTRY3   2  0.000000  0.000000  1.000000       79.48350            
+REMARK 290   SMTRY1   3  0.000000 -1.000000  0.000000       31.45050            
+REMARK 290   SMTRY2   3  1.000000  0.000000  0.000000       31.45050            
+REMARK 290   SMTRY3   3  0.000000  0.000000  1.000000      119.22525            
+REMARK 290   SMTRY1   4  0.000000  1.000000  0.000000       31.45050            
+REMARK 290   SMTRY2   4 -1.000000  0.000000  0.000000       31.45050            
+REMARK 290   SMTRY3   4  0.000000  0.000000  1.000000       39.74175            
+REMARK 290   SMTRY1   5 -1.000000  0.000000  0.000000       31.45050            
+REMARK 290   SMTRY2   5  0.000000  1.000000  0.000000       31.45050            
+REMARK 290   SMTRY3   5  0.000000  0.000000 -1.000000      119.22525            
+REMARK 290   SMTRY1   6  1.000000  0.000000  0.000000       31.45050            
+REMARK 290   SMTRY2   6  0.000000 -1.000000  0.000000       31.45050            
+REMARK 290   SMTRY3   6  0.000000  0.000000 -1.000000       39.74175            
+REMARK 290   SMTRY1   7  0.000000  1.000000  0.000000        0.00000            
+REMARK 290   SMTRY2   7  1.000000  0.000000  0.000000        0.00000            
+REMARK 290   SMTRY3   7  0.000000  0.000000 -1.000000        0.00000            
+REMARK 290   SMTRY1   8  0.000000 -1.000000  0.000000        0.00000            
+REMARK 290   SMTRY2   8 -1.000000  0.000000  0.000000        0.00000            
+REMARK 290   SMTRY3   8  0.000000  0.000000 -1.000000       79.48350            
+REMARK 290                                                                      
+REMARK 290 REMARK: NULL                                                         
+REMARK 300                                                                      
+REMARK 300 BIOMOLECULE: 1                                                       
+REMARK 300 SEE REMARK 350 FOR THE AUTHOR PROVIDED AND/OR PROGRAM                
+REMARK 300 GENERATED ASSEMBLY INFORMATION FOR THE STRUCTURE IN                  
+REMARK 300 THIS ENTRY. THE REMARK MAY ALSO PROVIDE INFORMATION ON               
+REMARK 300 BURIED SURFACE AREA.                                                 
+REMARK 350                                                                      
+REMARK 350 COORDINATES FOR A COMPLETE MULTIMER REPRESENTING THE KNOWN           
+REMARK 350 BIOLOGICALLY SIGNIFICANT OLIGOMERIZATION STATE OF THE                
+REMARK 350 MOLECULE CAN BE GENERATED BY APPLYING BIOMT TRANSFORMATIONS          
+REMARK 350 GIVEN BELOW.  BOTH NON-CRYSTALLOGRAPHIC AND                          
+REMARK 350 CRYSTALLOGRAPHIC OPERATIONS ARE GIVEN.                               
+REMARK 350                                                                      
+REMARK 350 BIOMOLECULE: 1                                                       
+REMARK 350 AUTHOR DETERMINED BIOLOGICAL UNIT: MONOMERIC                         
+REMARK 350 APPLY THE FOLLOWING TO CHAINS: A                                     
+REMARK 350   BIOMT1   1  1.000000  0.000000  0.000000        0.00000            
+REMARK 350   BIOMT2   1  0.000000  1.000000  0.000000        0.00000            
+REMARK 350   BIOMT3   1  0.000000  0.000000  1.000000        0.00000            
+REMARK 500                                                                      
+REMARK 500 GEOMETRY AND STEREOCHEMISTRY                                         
+REMARK 500 SUBTOPIC: 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   O2'  A   A    20     O4'  G   A    21              2.13            
+REMARK 500   O2'  A   A    20     OP2  G   A    21              2.18            
+REMARK 500                                                                      
+REMARK 500 REMARK: NULL                                                         
+REMARK 500                                                                      
+REMARK 500 GEOMETRY AND STEREOCHEMISTRY                                         
+REMARK 500 SUBTOPIC: CLOSE CONTACTS                                             
+REMARK 500                                                                      
+REMARK 500 THE FOLLOWING ATOMS THAT ARE RELATED BY CRYSTALLOGRAPHIC             
+REMARK 500 SYMMETRY ARE IN CLOSE CONTACT.  AN ATOM LOCATED WITHIN 0.15          
+REMARK 500 ANGSTROMS OF A SYMMETRY RELATED ATOM IS ASSUMED TO BE ON A           
+REMARK 500 SPECIAL POSITION AND IS, THEREFORE, LISTED IN REMARK 375             
+REMARK 500 INSTEAD OF REMARK 500.  ATOMS WITH NON-BLANK ALTERNATE               
+REMARK 500 LOCATION INDICATORS ARE NOT INCLUDED IN THE CALCULATIONS.            
+REMARK 500                                                                      
+REMARK 500 DISTANCE CUTOFF:                                                     
+REMARK 500 2.2 ANGSTROMS FOR CONTACTS NOT INVOLVING HYDROGEN ATOMS              
+REMARK 500 1.6 ANGSTROMS FOR CONTACTS INVOLVING HYDROGEN ATOMS                  
+REMARK 500                                                                      
+REMARK 500  ATM1  RES C  SSEQI   ATM2  RES C  SSEQI  SSYMOP   DISTANCE          
+REMARK 500   N3   IRI A   201     N3   IRI A   201     7555     1.02            
+REMARK 500  IR    IRI A   201     N3   IRI A   201     7555     2.10            
+REMARK 500                                                                      
+REMARK 500 REMARK: NULL                                                         
+REMARK 500                                                                      
+REMARK 500 GEOMETRY AND STEREOCHEMISTRY                                         
+REMARK 500 SUBTOPIC: COVALENT BOND LENGTHS                                      
+REMARK 500                                                                      
+REMARK 500 THE STEREOCHEMICAL PARAMETERS OF THE FOLLOWING RESIDUES              
+REMARK 500 HAVE VALUES WHICH DEVIATE FROM EXPECTED VALUES BY MORE               
+REMARK 500 THAN 6*RMSD (M=MODEL NUMBER; RES=RESIDUE NAME; C=CHAIN               
+REMARK 500 IDENTIFIER; SSEQ=SEQUENCE NUMBER; I=INSERTION CODE).                 
+REMARK 500                                                                      
+REMARK 500 STANDARD TABLE:                                                      
+REMARK 500 FORMAT: (10X,I3,1X,2(A3,1X,A1,I4,A1,1X,A4,3X),1X,F6.3)               
+REMARK 500                                                                      
+REMARK 500 EXPECTED VALUES PROTEIN: ENGH AND HUBER, 1999                        
+REMARK 500 EXPECTED VALUES NUCLEIC ACID: CLOWNEY ET AL 1996                     
+REMARK 500                                                                      
+REMARK 500  M RES CSSEQI ATM1   RES CSSEQI ATM2   DEVIATION                     
+REMARK 500      G A   1   P       G A   1   OP3    -0.078                       
+REMARK 500                                                                      
+REMARK 500 REMARK: NULL                                                         
+REMARK 500                                                                      
+REMARK 500 GEOMETRY AND STEREOCHEMISTRY                                         
+REMARK 500 SUBTOPIC: COVALENT BOND ANGLES                                       
+REMARK 500                                                                      
+REMARK 500 THE STEREOCHEMICAL PARAMETERS OF THE FOLLOWING RESIDUES              
+REMARK 500 HAVE VALUES WHICH DEVIATE FROM EXPECTED VALUES BY MORE               
+REMARK 500 THAN 6*RMSD (M=MODEL NUMBER; RES=RESIDUE NAME; C=CHAIN               
+REMARK 500 IDENTIFIER; SSEQ=SEQUENCE NUMBER; I=INSERTION CODE).                 
+REMARK 500                                                                      
+REMARK 500 STANDARD TABLE:                                                      
+REMARK 500 FORMAT: (10X,I3,1X,A3,1X,A1,I4,A1,3(1X,A4,2X),12X,F5.1)              
+REMARK 500                                                                      
+REMARK 500 EXPECTED VALUES PROTEIN: ENGH AND HUBER, 1999                        
+REMARK 500 EXPECTED VALUES NUCLEIC ACID: CLOWNEY ET AL 1996                     
+REMARK 500                                                                      
+REMARK 500  M RES CSSEQI ATM1   ATM2   ATM3                                     
+REMARK 500      A A   9   C2' -  C3' -  O3' ANGL. DEV. =  12.3 DEGREES          
+REMARK 500      A A  33   C2' -  C3' -  O3' ANGL. DEV. =  12.6 DEGREES          
+REMARK 500      G A  50   C4' -  C3' -  O3' ANGL. DEV. =  13.7 DEGREES          
+REMARK 500      G A  50   C2' -  C3' -  O3' ANGL. DEV. =  10.0 DEGREES          
+REMARK 500      G A  50   N9  -  C1' -  C2' ANGL. DEV. =  -8.2 DEGREES          
+REMARK 500      U A  63   C2' -  C3' -  O3' ANGL. DEV. =  15.3 DEGREES          
+REMARK 500      G A  74   C4' -  C3' -  O3' ANGL. DEV. =  12.7 DEGREES          
+REMARK 500      G A  74   C2' -  C3' -  O3' ANGL. DEV. =  11.3 DEGREES          
+REMARK 500      G A  74   N9  -  C1' -  C2' ANGL. DEV. =  -7.3 DEGREES          
+REMARK 500                                                                      
+REMARK 500 REMARK: NULL                                                         
+REMARK 500                                                                      
+REMARK 500 GEOMETRY AND STEREOCHEMISTRY                                         
+REMARK 500 SUBTOPIC: PLANAR GROUPS                                              
+REMARK 500                                                                      
+REMARK 500 PLANAR GROUPS IN THE FOLLOWING RESIDUES HAVE A TOTAL                 
+REMARK 500 RMS DISTANCE OF ALL ATOMS FROM THE BEST-FIT PLANE                    
+REMARK 500 BY MORE THAN AN EXPECTED VALUE OF 6*RMSD, WITH AN                    
+REMARK 500 RMSD 0.02 ANGSTROMS, OR AT LEAST ONE ATOM HAS                        
+REMARK 500 AN RMSD GREATER THAN THIS VALUE                                      
+REMARK 500 (M=MODEL NUMBER; RES=RESIDUE NAME; C=CHAIN IDENTIFIER;               
+REMARK 500 SSEQ=SEQUENCE NUMBER; I=INSERTION CODE).                             
+REMARK 500                                                                      
+REMARK 500  M RES CSSEQI        RMS     TYPE                                    
+REMARK 500      G A  19         0.05    SIDE_CHAIN                              
+REMARK 500      G A  35         0.06    SIDE_CHAIN                              
+REMARK 500      G A  50         0.07    SIDE_CHAIN                              
+REMARK 500      U A  67         0.08    SIDE_CHAIN                              
+REMARK 500      G A  74         0.08    SIDE_CHAIN                              
+REMARK 500                                                                      
+REMARK 500 REMARK: NULL                                                         
+REMARK 620                                                                      
+REMARK 620 METAL COORDINATION                                                   
+REMARK 620  (M=MODEL NUMBER; RES=RESIDUE NAME; C=CHAIN IDENTIFIER;              
+REMARK 620  SSEQ=SEQUENCE NUMBER; I=INSERTION CODE):                            
+REMARK 620                                                                      
+REMARK 620 COORDINATION ANGLES FOR:  M RES CSSEQI METAL                         
+REMARK 620                              MG A 205  MG                            
+REMARK 620 N RES CSSEQI ATOM                                                    
+REMARK 620 1   A A  10   OP2                                                    
+REMARK 620 2   U A  63   O3'  95.0                                              
+REMARK 620 3   U A  64   OP2 133.2  53.2                                        
+REMARK 620 N                    1     2                                         
+REMARK 620                                                                      
+REMARK 620 COORDINATION ANGLES FOR:  M RES CSSEQI METAL                         
+REMARK 620                              MG A 206  MG                            
+REMARK 620 N RES CSSEQI ATOM                                                    
+REMARK 620 1   A A  84   O5'                                                    
+REMARK 620 2   A A  84   O3' 115.5                                              
+REMARK 620 3   A A  85   OP2 130.4  63.5                                        
+REMARK 620 4   A A  84   OP1  62.8 164.4 130.5                                  
+REMARK 620 N                    1     2     3                                   
+REMARK 800                                                                      
+REMARK 800 SITE                                                                 
+REMARK 800 SITE_IDENTIFIER: AC1                                                 
+REMARK 800 EVIDENCE_CODE: SOFTWARE                                              
+REMARK 800 SITE_DESCRIPTION: BINDING SITE FOR RESIDUE MG A 205                  
+REMARK 800 SITE_IDENTIFIER: AC2                                                 
+REMARK 800 EVIDENCE_CODE: SOFTWARE                                              
+REMARK 800 SITE_DESCRIPTION: BINDING SITE FOR RESIDUE MG A 206                  
+REMARK 800 SITE_IDENTIFIER: AC3                                                 
+REMARK 800 EVIDENCE_CODE: SOFTWARE                                              
+REMARK 800 SITE_DESCRIPTION: BINDING SITE FOR RESIDUE IRI A 201                 
+REMARK 800 SITE_IDENTIFIER: AC4                                                 
+REMARK 800 EVIDENCE_CODE: SOFTWARE                                              
+REMARK 800 SITE_DESCRIPTION: BINDING SITE FOR RESIDUE IRI A 202                 
+REMARK 800 SITE_IDENTIFIER: AC5                                                 
+REMARK 800 EVIDENCE_CODE: SOFTWARE                                              
+REMARK 800 SITE_DESCRIPTION: BINDING SITE FOR RESIDUE IRI A 203                 
+REMARK 800 SITE_IDENTIFIER: AC6                                                 
+REMARK 800 EVIDENCE_CODE: SOFTWARE                                              
+REMARK 800 SITE_DESCRIPTION: BINDING SITE FOR RESIDUE IRI A 204                 
+REMARK 800 SITE_IDENTIFIER: AC7                                                 
+REMARK 800 EVIDENCE_CODE: SOFTWARE                                              
+REMARK 800 SITE_DESCRIPTION: BINDING SITE FOR RESIDUE SAM A 301                 
+DBREF  2GIS A    1    94  PDB    2GIS     2GIS             1     94             
+SEQRES   1 A   94    G   G   C   U   U   A   U   C   A   A   G   A   G          
+SEQRES   2 A   94    A   G   G   U   G   G   A   G   G   G   A   C   U          
+SEQRES   3 A   94    G   G   C   C   C   G   A   U   G   A   A   A   C          
+SEQRES   4 A   94    C   C   G   G   C   A   A   C   C   A   G   A   A          
+SEQRES   5 A   94    A   U   G   G   U   G   C   C   A   A   U   U   C          
+SEQRES   6 A   94    C   U   G   C   A   G   C   G   G   A   A   A   C          
+SEQRES   7 A   94    G   U   U   G   A   A   A   G   A   U   G   A   G          
+SEQRES   8 A   94    C   C   A                                                  
+HET     MG  A 205       1                                                       
+HET     MG  A 206       1                                                       
+HET    IRI  A 201       7                                                       
+HET    IRI  A 202       7                                                       
+HET    IRI  A 203       7                                                       
+HET    IRI  A 204       7                                                       
+HET    SAM  A 301      27                                                       
+HETNAM      MG MAGNESIUM ION                                                    
+HETNAM     IRI IRIDIUM HEXAMMINE ION                                            
+HETNAM     SAM S-ADENOSYLMETHIONINE                                             
+FORMUL   2   MG    2(MG 2+)                                                     
+FORMUL   4  IRI    4(H18 IR N6 3+)                                              
+FORMUL   8  SAM    C15 H22 N6 O5 S                                              
+FORMUL   9  HOH   *88(H2 O)                                                     
+LINK        MG    MG A 205                 OP2   A A  10     1555   1555  2.88  
+LINK        MG    MG A 205                 O3'   U A  63     1555   1555  2.88  
+LINK        MG    MG A 205                 OP2   U A  64     1555   1555  2.42  
+LINK        MG    MG A 206                 O5'   A A  84     1555   1555  1.93  
+LINK        MG    MG A 206                 O3'   A A  84     1555   1555  2.35  
+LINK        MG    MG A 206                 OP2   A A  85     1555   1555  2.46  
+LINK        MG    MG A 206                 OP1   A A  84     1555   1555  2.71  
+SITE     1 AC1  4   A A   9    A A  10    U A  63    U A  64                    
+SITE     1 AC2  2   A A  84    A A  85                                          
+SITE     1 AC3  5   C A  31    G A  32    A A  33    U A  34                    
+SITE     2 AC3  5 HOH A 448                                                     
+SITE     1 AC4  6   G A  15    G A  16    U A  17    G A  18                    
+SITE     2 AC4  6   A A  36    A A  38                                          
+SITE     1 AC5  6   G A  23    C A  25    U A  26    G A  27                    
+SITE     2 AC5  6   G A  28    C A  29                                          
+SITE     1 AC6  6   U A   4    U A   5    A A   6    U A  88                    
+SITE     2 AC6  6   G A  89  HOH A 475                                          
+SITE     1 AC7 11   U A   7    G A  11    A A  45    A A  46                    
+SITE     2 AC7 11   C A  47    U A  57    G A  58    C A  59                    
+SITE     3 AC7 11   U A  88    G A  89  HOH A 437                               
+CRYST1   62.901   62.901  158.967  90.00  90.00  90.00 P 43 21 2     8          
+ORIGX1      1.000000  0.000000  0.000000        0.00000                         
+ORIGX2      0.000000  1.000000  0.000000        0.00000                         
+ORIGX3      0.000000  0.000000  1.000000        0.00000                         
+SCALE1      0.015898  0.000000  0.000000        0.00000                         
+SCALE2      0.000000  0.015898  0.000000        0.00000                         
+SCALE3      0.000000  0.000000  0.006291        0.00000                         
+ATOM      1  OP3   G A   1      66.836  54.358  31.023  1.00 83.72           O  
+ATOM      2  P     G A   1      66.932  54.717  32.506  1.00 83.64           P  
+ATOM      3  OP1   G A   1      68.009  55.754  32.789  1.00 83.61           O  
+ATOM      4  OP2   G A   1      65.585  55.074  33.126  1.00 82.16           O  
+ATOM      5  O5'   G A   1      67.440  53.379  33.287  1.00 79.65           O  
+ATOM      6  C5'   G A   1      68.672  52.742  32.913  1.00 73.57           C  
+ATOM      7  C4'   G A   1      69.247  51.962  34.076  1.00 70.37           C  
+ATOM      8  O4'   G A   1      69.770  52.884  35.073  1.00 66.83           O  
+ATOM      9  C3'   G A   1      68.269  51.092  34.851  1.00 68.85           C  
+ATOM     10  O3'   G A   1      68.072  49.836  34.215  1.00 68.87           O  
+ATOM     11  C2'   G A   1      68.974  50.952  36.194  1.00 66.89           C  
+ATOM     12  O2'   G A   1      70.032  50.011  36.151  1.00 66.32           O  
+ATOM     13  C1'   G A   1      69.560  52.353  36.371  1.00 64.13           C  
+ATOM     14  N9    G A   1      68.630  53.226  37.076  1.00 60.62           N  
+ATOM     15  C8    G A   1      67.918  54.269  36.547  1.00 60.07           C  
+ATOM     16  N7    G A   1      67.123  54.838  37.412  1.00 59.30           N  
+ATOM     17  C5    G A   1      67.331  54.130  38.585  1.00 57.00           C  
+ATOM     18  C6    G A   1      66.738  54.282  39.860  1.00 55.77           C  
+ATOM     19  O6    G A   1      65.881  55.106  40.221  1.00 56.93           O  
+ATOM     20  N1    G A   1      67.233  53.352  40.767  1.00 54.01           N  
+ATOM     21  C2    G A   1      68.178  52.396  40.480  1.00 55.22           C  
+ATOM     22  N2    G A   1      68.526  51.581  41.489  1.00 54.38           N  
+ATOM     23  N3    G A   1      68.740  52.247  39.288  1.00 56.29           N  
+ATOM     24  C4    G A   1      68.270  53.140  38.397  1.00 57.86           C  
+ATOM     25  P     G A   2      66.612  49.156  34.222  1.00 69.18           P  
+ATOM     26  OP1   G A   2      66.706  47.977  33.323  1.00 70.02           O  
+ATOM     27  OP2   G A   2      65.566  50.194  33.985  1.00 68.86           O  
+ATOM     28  O5'   G A   2      66.442  48.597  35.701  1.00 66.97           O  
+ATOM     29  C5'   G A   2      67.276  47.544  36.152  1.00 62.30           C  
+ATOM     30  C4'   G A   2      67.252  47.457  37.651  1.00 59.60           C  
+ATOM     31  O4'   G A   2      67.506  48.784  38.198  1.00 56.42           O  
+ATOM     32  C3'   G A   2      65.898  47.105  38.233  1.00 59.17           C  
+ATOM     33  O3'   G A   2      65.645  45.711  38.175  1.00 60.55           O  
+ATOM     34  C2'   G A   2      66.007  47.655  39.650  1.00 56.90           C  
+ATOM     35  O2'   G A   2      66.780  46.829  40.499  1.00 57.29           O  
+ATOM     36  C1'   G A   2      66.787  48.946  39.405  1.00 54.02           C  
+ATOM     37  N9    G A   2      65.942  50.127  39.299  1.00 50.64           N  
+ATOM     38  C8    G A   2      65.753  50.932  38.206  1.00 50.83           C  
+ATOM     39  N7    G A   2      64.944  51.936  38.442  1.00 50.61           N  
+ATOM     40  C5    G A   2      64.573  51.774  39.768  1.00 48.72           C  
+ATOM     41  C6    G A   2      63.723  52.556  40.584  1.00 48.85           C  
+ATOM     42  O6    G A   2      63.108  53.584  40.289  1.00 50.52           O  
+ATOM     43  N1    G A   2      63.627  52.034  41.866  1.00 48.14           N  
+ATOM     44  C2    G A   2      64.268  50.902  42.311  1.00 47.93           C  
+ATOM     45  N2    G A   2      64.035  50.543  43.580  1.00 47.56           N  
+ATOM     46  N3    G A   2      65.071  50.172  41.568  1.00 48.14           N  
+ATOM     47  C4    G A   2      65.177  50.661  40.312  1.00 49.83           C  
+ATOM     48  P     C A   3      64.129  45.193  38.109  1.00 60.96           P  
+ATOM     49  OP1   C A   3      64.118  43.738  37.817  1.00 60.20           O  
+ATOM     50  OP2   C A   3      63.355  46.126  37.249  1.00 61.70           O  
+ATOM     51  O5'   C A   3      63.587  45.427  39.585  1.00 60.54           O  
+ATOM     52  C5'   C A   3      63.884  44.512  40.626  1.00 55.75           C  
+ATOM     53  C4'   C A   3      63.184  44.934  41.889  1.00 53.73           C  
+ATOM     54  O4'   C A   3      63.549  46.312  42.172  1.00 52.44           O  
+ATOM     55  C3'   C A   3      61.674  45.025  41.777  1.00 53.43           C  
+ATOM     56  O3'   C A   3      61.022  43.789  41.941  1.00 55.57           O  
+ATOM     57  C2'   C A   3      61.321  45.978  42.898  1.00 51.46           C  
+ATOM     58  O2'   C A   3      61.402  45.337  44.151  1.00 52.96           O  
+ATOM     59  C1'   C A   3      62.458  46.978  42.787  1.00 49.83           C  
+ATOM     60  N1    C A   3      62.072  48.135  41.979  1.00 46.39           N  
+ATOM     61  C2    C A   3      61.207  49.065  42.547  1.00 45.76           C  
+ATOM     62  O2    C A   3      60.800  48.861  43.692  1.00 47.45           O  
+ATOM     63  N3    C A   3      60.831  50.152  41.837  1.00 43.39           N  
+ATOM     64  C4    C A   3      61.290  50.323  40.602  1.00 44.39           C  
+ATOM     65  N4    C A   3      60.911  51.413  39.948  1.00 44.48           N  
+ATOM     66  C5    C A   3      62.168  49.382  39.986  1.00 45.55           C  
+ATOM     67  C6    C A   3      62.534  48.309  40.707  1.00 46.04           C  
+ATOM     68  P     U A   4      59.622  43.553  41.204  1.00 57.98           P  
+ATOM     69  OP1   U A   4      59.364  42.082  41.244  1.00 57.52           O  
+ATOM     70  OP2   U A   4      59.681  44.265  39.900  1.00 59.29           O  
+ATOM     71  O5'   U A   4      58.561  44.348  42.088  1.00 53.55           O  
+ATOM     72  C5'   U A   4      58.363  44.011  43.446  1.00 53.36           C  
+ATOM     73  C4'   U A   4      57.410  44.981  44.081  1.00 55.02           C  
+ATOM     74  O4'   U A   4      57.989  46.313  44.050  1.00 55.96           O  
+ATOM     75  C3'   U A   4      56.097  45.142  43.346  1.00 57.18           C  
+ATOM     76  O3'   U A   4      55.179  44.108  43.677  1.00 60.33           O  
+ATOM     77  C2'   U A   4      55.642  46.516  43.814  1.00 54.53           C  
+ATOM     78  O2'   U A   4      55.165  46.437  45.140  1.00 55.14           O  
+ATOM     79  C1'   U A   4      56.967  47.272  43.829  1.00 52.98           C  
+ATOM     80  N1    U A   4      57.269  47.986  42.580  1.00 49.42           N  
+ATOM     81  C2    U A   4      56.614  49.174  42.350  1.00 47.24           C  
+ATOM     82  O2    U A   4      55.771  49.612  43.103  1.00 45.38           O  
+ATOM     83  N3    U A   4      56.978  49.829  41.207  1.00 46.59           N  
+ATOM     84  C4    U A   4      57.903  49.416  40.282  1.00 48.90           C  
+ATOM     85  O4    U A   4      58.117  50.111  39.282  1.00 50.34           O  
+ATOM     86  C5    U A   4      58.523  48.162  40.580  1.00 48.98           C  
+ATOM     87  C6    U A   4      58.187  47.505  41.691  1.00 49.39           C  
+ATOM     88  P     U A   5      54.205  43.531  42.537  1.00 60.31           P  
+ATOM     89  OP1   U A   5      53.567  42.301  43.067  1.00 60.80           O  
+ATOM     90  OP2   U A   5      54.982  43.466  41.269  1.00 61.31           O  
+ATOM     91  O5'   U A   5      53.102  44.672  42.382  1.00 57.62           O  
+ATOM     92  C5'   U A   5      52.176  44.937  43.427  1.00 56.18           C  
+ATOM     93  C4'   U A   5      51.450  46.221  43.143  1.00 55.97           C  
+ATOM     94  O4'   U A   5      52.432  47.275  43.039  1.00 55.58           O  
+ATOM     95  C3'   U A   5      50.695  46.272  41.826  1.00 56.58           C  
+ATOM     96  O3'   U A   5      49.393  45.733  41.981  1.00 58.63           O  
+ATOM     97  C2'   U A   5      50.663  47.767  41.536  1.00 55.50           C  
+ATOM     98  O2'   U A   5      49.696  48.452  42.301  1.00 56.71           O  
+ATOM     99  C1'   U A   5      52.048  48.188  42.023  1.00 54.24           C  
+ATOM    100  N1    U A   5      53.071  48.125  40.974  1.00 50.31           N  
+ATOM    101  C2    U A   5      53.197  49.208  40.124  1.00 48.81           C  
+ATOM    102  O2    U A   5      52.488  50.194  40.204  1.00 48.14           O  
+ATOM    103  N3    U A   5      54.188  49.091  39.181  1.00 47.64           N  
+ATOM    104  C4    U A   5      55.044  48.019  39.011  1.00 49.86           C  
+ATOM    105  O4    U A   5      55.897  48.060  38.122  1.00 53.10           O  
+ATOM    106  C5    U A   5      54.843  46.933  39.930  1.00 49.29           C  
+ATOM    107  C6    U A   5      53.886  47.020  40.854  1.00 48.98           C  
+ATOM    108  P     A A   6      48.651  45.080  40.719  1.00 60.24           P  
+ATOM    109  OP1   A A   6      47.527  44.256  41.233  1.00 60.47           O  
+ATOM    110  OP2   A A   6      49.696  44.440  39.882  1.00 58.91           O  
+ATOM    111  O5'   A A   6      48.047  46.341  39.956  1.00 56.95           O  
+ATOM    112  C5'   A A   6      47.050  47.139  40.571  1.00 55.21           C  
+ATOM    113  C4'   A A   6      46.808  48.385  39.760  1.00 56.41           C  
+ATOM    114  O4'   A A   6      47.992  49.219  39.787  1.00 56.16           O  
+ATOM    115  C3'   A A   6      46.574  48.148  38.285  1.00 57.58           C  
+ATOM    116  O3'   A A   6      45.232  47.755  38.032  1.00 59.85           O  
+ATOM    117  C2'   A A   6      46.960  49.491  37.679  1.00 55.59           C  
+ATOM    118  O2'   A A   6      45.980  50.474  37.905  1.00 56.04           O  
+ATOM    119  C1'   A A   6      48.163  49.859  38.536  1.00 53.99           C  
+ATOM    120  N9    A A   6      49.425  49.404  37.958  1.00 52.37           N  
+ATOM    121  C8    A A   6      50.091  48.223  38.172  1.00 52.73           C  
+ATOM    122  N7    A A   6      51.212  48.119  37.495  1.00 50.40           N  
+ATOM    123  C5    A A   6      51.282  49.309  36.791  1.00 48.95           C  
+ATOM    124  C6    A A   6      52.220  49.810  35.895  1.00 49.10           C  
+ATOM    125  N6    A A   6      53.319  49.157  35.543  1.00 49.07           N  
+ATOM    126  N1    A A   6      51.991  51.030  35.360  1.00 49.55           N  
+ATOM    127  C2    A A   6      50.892  51.689  35.721  1.00 49.92           C  
+ATOM    128  N3    A A   6      49.936  51.324  36.564  1.00 51.13           N  
+ATOM    129  C4    A A   6      50.192  50.108  37.068  1.00 50.04           C  
+ATOM    130  P     U A   7      44.942  46.678  36.880  1.00 60.77           P  
+ATOM    131  OP1   U A   7      43.556  46.166  37.041  1.00 62.34           O  
+ATOM    132  OP2   U A   7      46.083  45.727  36.862  1.00 60.86           O  
+ATOM    133  O5'   U A   7      45.014  47.576  35.575  1.00 58.27           O  
+ATOM    134  C5'   U A   7      44.309  48.807  35.537  1.00 56.31           C  
+ATOM    135  C4'   U A   7      44.796  49.660  34.396  1.00 55.63           C  
+ATOM    136  O4'   U A   7      46.124  50.175  34.690  1.00 53.71           O  
+ATOM    137  C3'   U A   7      44.989  48.897  33.106  1.00 55.41           C  
+ATOM    138  O3'   U A   7      43.761  48.723  32.432  1.00 57.39           O  
+ATOM    139  C2'   U A   7      45.975  49.781  32.356  1.00 54.03           C  
+ATOM    140  O2'   U A   7      45.344  50.895  31.752  1.00 54.05           O  
+ATOM    141  C1'   U A   7      46.877  50.253  33.497  1.00 51.60           C  
+ATOM    142  N1    U A   7      48.069  49.414  33.644  1.00 48.98           N  
+ATOM    143  C2    U A   7      49.147  49.744  32.880  1.00 47.41           C  
+ATOM    144  O2    U A   7      49.125  50.684  32.101  1.00 50.13           O  
+ATOM    145  N3    U A   7      50.245  48.941  33.048  1.00 44.70           N  
+ATOM    146  C4    U A   7      50.360  47.854  33.884  1.00 44.88           C  
+ATOM    147  O4    U A   7      51.421  47.226  33.925  1.00 43.14           O  
+ATOM    148  C5    U A   7      49.192  47.568  34.642  1.00 45.41           C  
+ATOM    149  C6    U A   7      48.109  48.343  34.502  1.00 48.51           C  
+ATOM    150  P     C A   8      43.662  47.638  31.261  1.00 59.85           P  
+ATOM    151  OP1   C A   8      42.278  47.710  30.723  1.00 61.02           O  
+ATOM    152  OP2   C A   8      44.188  46.346  31.770  1.00 59.29           O  
+ATOM    153  O5'   C A   8      44.678  48.182  30.158  1.00 58.48           O  
+ATOM    154  C5'   C A   8      44.351  49.334  29.392  1.00 56.82           C  
+ATOM    155  C4'   C A   8      45.288  49.473  28.222  1.00 58.23           C  
+ATOM    156  O4'   C A   8      46.602  49.835  28.707  1.00 57.92           O  
+ATOM    157  C3'   C A   8      45.519  48.211  27.410  1.00 58.66           C  
+ATOM    158  O3'   C A   8      44.512  48.077  26.413  1.00 61.50           O  
+ATOM    159  C2'   C A   8      46.870  48.491  26.771  1.00 57.69           C  
+ATOM    160  O2'   C A   8      46.744  49.342  25.647  1.00 56.83           O  
+ATOM    161  C1'   C A   8      47.593  49.232  27.896  1.00 56.12           C  
+ATOM    162  N1    C A   8      48.418  48.363  28.744  1.00 53.94           N  
+ATOM    163  C2    C A   8      49.783  48.292  28.489  1.00 52.97           C  
+ATOM    164  O2    C A   8      50.251  48.967  27.565  1.00 54.92           O  
+ATOM    165  N3    C A   8      50.560  47.493  29.251  1.00 50.44           N  
+ATOM    166  C4    C A   8      50.013  46.784  30.242  1.00 49.28           C  
+ATOM    167  N4    C A   8      50.812  46.013  30.966  1.00 47.57           N  
+ATOM    168  C5    C A   8      48.619  46.840  30.530  1.00 50.26           C  
+ATOM    169  C6    C A   8      47.865  47.635  29.762  1.00 52.95           C  
+ATOM    170  P     A A   9      44.220  46.636  25.756  1.00 62.39           P  
+ATOM    171  OP1   A A   9      43.364  45.868  26.691  1.00 62.54           O  
+ATOM    172  OP2   A A   9      45.505  46.055  25.302  1.00 62.79           O  
+ATOM    173  O5'   A A   9      43.321  46.991  24.492  1.00 64.20           O  
+ATOM    174  C5'   A A   9      43.849  46.942  23.173  1.00 69.12           C  
+ATOM    175  C4'   A A   9      42.837  47.488  22.188  1.00 71.94           C  
+ATOM    176  O4'   A A   9      41.791  46.511  21.961  1.00 74.83           O  
+ATOM    177  C3'   A A   9      42.121  48.739  22.656  1.00 71.21           C  
+ATOM    178  O3'   A A   9      42.375  49.964  21.965  1.00 68.03           O  
+ATOM    179  C2'   A A   9      40.779  48.297  23.235  1.00 73.66           C  
+ATOM    180  O2'   A A   9      39.714  49.146  22.861  1.00 73.60           O  
+ATOM    181  C1'   A A   9      40.588  46.912  22.594  1.00 77.57           C  
+ATOM    182  N9    A A   9      40.229  45.843  23.530  1.00 83.33           N  
+ATOM    183  C8    A A   9      40.530  45.749  24.869  1.00 84.98           C  
+ATOM    184  N7    A A   9      40.113  44.636  25.429  1.00 87.16           N  
+ATOM    185  C5    A A   9      39.485  43.954  24.394  1.00 88.00           C  
+ATOM    186  C6    A A   9      38.840  42.694  24.335  1.00 89.06           C  
+ATOM    187  N6    A A   9      38.726  41.864  25.379  1.00 88.96           N  
+ATOM    188  N1    A A   9      38.314  42.312  23.147  1.00 89.43           N  
+ATOM    189  C2    A A   9      38.439  43.138  22.097  1.00 89.45           C  
+ATOM    190  N3    A A   9      39.028  44.337  22.025  1.00 88.20           N  
+ATOM    191  C4    A A   9      39.536  44.692  23.221  1.00 86.70           C  
+ATOM    192  P     A A  10      41.514  50.352  20.666  1.00 61.47           P  
+ATOM    193  OP1   A A  10      40.725  49.160  20.325  1.00 65.15           O  
+ATOM    194  OP2   A A  10      42.447  50.920  19.669  1.00 65.52           O  
+ATOM    195  O5'   A A  10      40.538  51.510  21.159  1.00 61.29           O  
+ATOM    196  C5'   A A  10      39.126  51.356  21.085  1.00 61.12           C  
+ATOM    197  C4'   A A  10      38.435  52.547  21.702  1.00 61.27           C  
+ATOM    198  O4'   A A  10      38.545  52.487  23.140  1.00 61.33           O  
+ATOM    199  C3'   A A  10      39.017  53.894  21.326  1.00 60.56           C  
+ATOM    200  O3'   A A  10      38.418  54.348  20.136  1.00 62.31           O  
+ATOM    201  C2'   A A  10      38.590  54.770  22.486  1.00 60.01           C  
+ATOM    202  O2'   A A  10      37.262  55.220  22.354  1.00 61.63           O  
+ATOM    203  C1'   A A  10      38.702  53.795  23.654  1.00 60.36           C  
+ATOM    204  N9    A A  10      39.993  53.847  24.327  1.00 60.66           N  
+ATOM    205  C8    A A  10      40.916  52.837  24.411  1.00 60.47           C  
+ATOM    206  N7    A A  10      41.969  53.145  25.124  1.00 62.84           N  
+ATOM    207  C5    A A  10      41.727  54.453  25.533  1.00 62.66           C  
+ATOM    208  C6    A A  10      42.457  55.346  26.339  1.00 62.24           C  
+ATOM    209  N6    A A  10      43.621  55.042  26.911  1.00 63.38           N  
+ATOM    210  N1    A A  10      41.939  56.573  26.545  1.00 62.82           N  
+ATOM    211  C2    A A  10      40.765  56.873  25.983  1.00 62.56           C  
+ATOM    212  N3    A A  10      39.981  56.121  25.217  1.00 62.85           N  
+ATOM    213  C4    A A  10      40.523  54.905  25.030  1.00 62.24           C  
+ATOM    214  P     G A  11      39.283  55.186  19.092  1.00 64.09           P  
+ATOM    215  OP1   G A  11      38.517  55.279  17.830  1.00 67.46           O  
+ATOM    216  OP2   G A  11      40.632  54.579  19.093  1.00 65.72           O  
+ATOM    217  O5'   G A  11      39.385  56.634  19.737  1.00 64.27           O  
+ATOM    218  C5'   G A  11      38.238  57.286  20.263  1.00 65.57           C  
+ATOM    219  C4'   G A  11      38.672  58.430  21.142  1.00 66.04           C  
+ATOM    220  O4'   G A  11      39.266  57.913  22.356  1.00 66.05           O  
+ATOM    221  C3'   G A  11      39.753  59.293  20.527  1.00 66.30           C  
+ATOM    222  O3'   G A  11      39.131  60.294  19.737  1.00 68.41           O  
+ATOM    223  C2'   G A  11      40.417  59.895  21.755  1.00 65.85           C  
+ATOM    224  O2'   G A  11      39.667  60.970  22.273  1.00 68.84           O  
+ATOM    225  C1'   G A  11      40.345  58.737  22.749  1.00 65.15           C  
+ATOM    226  N9    G A  11      41.537  57.901  22.820  1.00 64.75           N  
+ATOM    227  C8    G A  11      41.777  56.766  22.093  1.00 63.49           C  
+ATOM    228  N7    G A  11      42.910  56.195  22.394  1.00 64.89           N  
+ATOM    229  C5    G A  11      43.455  57.007  23.378  1.00 64.88           C  
+ATOM    230  C6    G A  11      44.666  56.884  24.103  1.00 64.13           C  
+ATOM    231  O6    G A  11      45.526  55.999  24.029  1.00 64.41           O  
+ATOM    232  N1    G A  11      44.830  57.926  25.000  1.00 64.36           N  
+ATOM    233  C2    G A  11      43.947  58.946  25.189  1.00 65.00           C  
+ATOM    234  N2    G A  11      44.297  59.851  26.098  1.00 68.08           N  
+ATOM    235  N3    G A  11      42.807  59.069  24.535  1.00 65.84           N  
+ATOM    236  C4    G A  11      42.627  58.071  23.645  1.00 65.62           C  
+ATOM    237  P     A A  12      39.589  60.508  18.216  1.00 72.17           P  
+ATOM    238  OP1   A A  12      38.441  61.088  17.469  1.00 72.28           O  
+ATOM    239  OP2   A A  12      40.202  59.237  17.756  1.00 71.67           O  
+ATOM    240  O5'   A A  12      40.736  61.612  18.310  1.00 73.09           O  
+ATOM    241  C5'   A A  12      40.436  62.931  18.755  1.00 74.99           C  
+ATOM    242  C4'   A A  12      41.689  63.630  19.220  1.00 76.06           C  
+ATOM    243  O4'   A A  12      42.252  62.910  20.347  1.00 75.60           O  
+ATOM    244  C3'   A A  12      42.811  63.640  18.200  1.00 77.69           C  
+ATOM    245  O3'   A A  12      42.666  64.736  17.314  1.00 84.06           O  
+ATOM    246  C2'   A A  12      44.049  63.806  19.063  1.00 76.03           C  
+ATOM    247  O2'   A A  12      44.266  65.155  19.407  1.00 74.27           O  
+ATOM    248  C1'   A A  12      43.669  62.990  20.300  1.00 75.72           C  
+ATOM    249  N9    A A  12      44.223  61.636  20.328  1.00 75.30           N  
+ATOM    250  C8    A A  12      44.108  60.649  19.388  1.00 74.14           C  
+ATOM    251  N7    A A  12      44.736  59.544  19.705  1.00 74.09           N  
+ATOM    252  C5    A A  12      45.300  59.823  20.941  1.00 74.63           C  
+ATOM    253  C6    A A  12      46.096  59.060  21.819  1.00 74.42           C  
+ATOM    254  N6    A A  12      46.478  57.808  21.578  1.00 72.95           N  
+ATOM    255  N1    A A  12      46.490  59.638  22.971  1.00 74.65           N  
+ATOM    256  C2    A A  12      46.104  60.888  23.220  1.00 74.97           C  
+ATOM    257  N3    A A  12      45.361  61.704  22.480  1.00 75.87           N  
+ATOM    258  C4    A A  12      44.989  61.105  21.338  1.00 75.00           C  
+ATOM    259  P     G A  13      42.588  64.456  15.747  1.00 89.08           P  
+ATOM    260  OP1   G A  13      41.214  63.997  15.432  1.00 89.24           O  
+ATOM    261  OP2   G A  13      43.757  63.599  15.410  1.00 88.56           O  
+ATOM    262  O5'   G A  13      42.840  65.858  15.051  1.00 92.85           O  
+ATOM    263  C5'   G A  13      43.609  65.918  13.855  1.00 99.27           C  
+ATOM    264  C4'   G A  13      44.119  67.311  13.644  1.00103.14           C  
+ATOM    265  O4'   G A  13      44.653  67.791  14.898  1.00103.90           O  
+ATOM    266  C3'   G A  13      45.283  67.411  12.672  1.00105.04           C  
+ATOM    267  O3'   G A  13      44.800  67.565  11.345  1.00108.37           O  
+ATOM    268  C2'   G A  13      45.964  68.692  13.125  1.00105.26           C  
+ATOM    269  O2'   G A  13      45.315  69.841  12.618  1.00104.89           O  
+ATOM    270  C1'   G A  13      45.756  68.625  14.639  1.00104.73           C  
+ATOM    271  N9    G A  13      46.891  68.187  15.441  1.00104.87           N  
+ATOM    272  C8    G A  13      47.268  66.915  15.809  1.00104.80           C  
+ATOM    273  N7    G A  13      48.320  66.902  16.586  1.00104.77           N  
+ATOM    274  C5    G A  13      48.654  68.244  16.726  1.00104.42           C  
+ATOM    275  C6    G A  13      49.696  68.877  17.464  1.00103.88           C  
+ATOM    276  O6    G A  13      50.565  68.363  18.184  1.00102.76           O  
+ATOM    277  N1    G A  13      49.657  70.262  17.305  1.00104.10           N  
+ATOM    278  C2    G A  13      48.734  70.949  16.541  1.00104.31           C  
+ATOM    279  N2    G A  13      48.843  72.280  16.483  1.00103.88           N  
+ATOM    280  N3    G A  13      47.769  70.373  15.873  1.00104.42           N  
+ATOM    281  C4    G A  13      47.787  69.036  16.008  1.00104.66           C  
+ATOM    282  P     A A  14      44.891  66.334  10.322  1.00111.53           P  
+ATOM    283  OP1   A A  14      43.610  65.588  10.429  1.00111.71           O  
+ATOM    284  OP2   A A  14      46.174  65.631  10.568  1.00111.96           O  
+ATOM    285  O5'   A A  14      44.952  67.015   8.880  1.00113.37           O  
+ATOM    286  C5'   A A  14      46.163  67.595   8.388  1.00115.63           C  
+ATOM    287  C4'   A A  14      45.863  68.602   7.295  1.00117.25           C  
+ATOM    288  O4'   A A  14      45.362  67.887   6.140  1.00118.63           O  
+ATOM    289  C3'   A A  14      44.811  69.629   7.703  1.00117.39           C  
+ATOM    290  O3'   A A  14      45.367  70.922   7.924  1.00115.58           O  
+ATOM    291  C2'   A A  14      43.702  69.579   6.645  1.00118.52           C  
+ATOM    292  O2'   A A  14      43.661  70.767   5.878  1.00117.82           O  
+ATOM    293  C1'   A A  14      44.122  68.423   5.730  1.00119.51           C  
+ATOM    294  N9    A A  14      43.165  67.322   5.573  1.00120.87           N  
+ATOM    295  C8    A A  14      43.339  66.006   5.934  1.00121.79           C  
+ATOM    296  N7    A A  14      42.327  65.231   5.622  1.00122.72           N  
+ATOM    297  C5    A A  14      41.418  66.095   5.023  1.00122.75           C  
+ATOM    298  C6    A A  14      40.141  65.887   4.464  1.00122.97           C  
+ATOM    299  N6    A A  14      39.545  64.692   4.404  1.00123.09           N  
+ATOM    300  N1    A A  14      39.493  66.962   3.957  1.00122.70           N  
+ATOM    301  C2    A A  14      40.097  68.157   4.010  1.00122.76           C  
+ATOM    302  N3    A A  14      41.296  68.477   4.503  1.00122.66           N  
+ATOM    303  C4    A A  14      41.914  67.389   4.999  1.00122.06           C  
+ATOM    304  P     G A  15      46.313  71.178   9.199  1.00114.09           P  
+ATOM    305  OP1   G A  15      47.669  70.679   8.842  1.00113.11           O  
+ATOM    306  OP2   G A  15      45.634  70.652  10.411  1.00113.63           O  
+ATOM    307  O5'   G A  15      46.392  72.765   9.299  1.00110.78           O  
+ATOM    308  C5'   G A  15      47.622  73.436   9.083  1.00106.55           C  
+ATOM    309  C4'   G A  15      47.841  74.474  10.147  1.00104.29           C  
+ATOM    310  O4'   G A  15      47.457  73.923  11.434  1.00103.66           O  
+ATOM    311  C3'   G A  15      49.285  74.901  10.335  1.00103.12           C  
+ATOM    312  O3'   G A  15      49.677  75.893   9.400  1.00102.02           O  
+ATOM    313  C2'   G A  15      49.282  75.408  11.769  1.00102.62           C  
+ATOM    314  O2'   G A  15      48.760  76.718  11.867  1.00102.61           O  
+ATOM    315  C1'   G A  15      48.341  74.398  12.438  1.00102.79           C  
+ATOM    316  N9    G A  15      49.064  73.248  12.975  1.00102.03           N  
+ATOM    317  C8    G A  15      48.919  71.930  12.610  1.00101.72           C  
+ATOM    318  N7    G A  15      49.732  71.131  13.246  1.00101.59           N  
+ATOM    319  C5    G A  15      50.453  71.971  14.085  1.00101.16           C  
+ATOM    320  C6    G A  15      51.487  71.679  15.022  1.00101.10           C  
+ATOM    321  O6    G A  15      51.994  70.575  15.304  1.00101.15           O  
+ATOM    322  N1    G A  15      51.932  72.833  15.662  1.00100.41           N  
+ATOM    323  C2    G A  15      51.449  74.098  15.432  1.00 99.93           C  
+ATOM    324  N2    G A  15      51.999  75.086  16.142  1.00 99.94           N  
+ATOM    325  N3    G A  15      50.493  74.377  14.567  1.00100.17           N  
+ATOM    326  C4    G A  15      50.045  73.278  13.935  1.00100.88           C  
+ATOM    327  P     G A  16      51.026  75.682   8.551  1.00101.42           P  
+ATOM    328  OP1   G A  16      50.682  75.731   7.109  1.00102.83           O  
+ATOM    329  OP2   G A  16      51.725  74.492   9.095  1.00101.20           O  
+ATOM    330  O5'   G A  16      51.919  76.949   8.908  1.00100.66           O  
+ATOM    331  C5'   G A  16      53.321  76.916   8.702  1.00100.34           C  
+ATOM    332  C4'   G A  16      54.036  77.485   9.896  1.00100.56           C  
+ATOM    333  O4'   G A  16      53.436  76.981  11.111  1.00 99.81           O  
+ATOM    334  C3'   G A  16      55.491  77.080   9.985  1.00101.38           C  
+ATOM    335  O3'   G A  16      56.265  77.979   9.201  1.00103.43           O  
+ATOM    336  C2'   G A  16      55.778  77.206  11.477  1.00100.28           C  
+ATOM    337  O2'   G A  16      56.066  78.524  11.885  1.00101.05           O  
+ATOM    338  C1'   G A  16      54.443  76.770  12.086  1.00 99.62           C  
+ATOM    339  N9    G A  16      54.369  75.375  12.509  1.00 98.45           N  
+ATOM    340  C8    G A  16      53.508  74.423  12.025  1.00 97.73           C  
+ATOM    341  N7    G A  16      53.644  73.266  12.608  1.00 96.93           N  
+ATOM    342  C5    G A  16      54.659  73.463  13.530  1.00 96.67           C  
+ATOM    343  C6    G A  16      55.243  72.561  14.451  1.00 96.34           C  
+ATOM    344  O6    G A  16      54.965  71.373  14.646  1.00 96.14           O  
+ATOM    345  N1    G A  16      56.247  73.169  15.195  1.00 96.64           N  
+ATOM    346  C2    G A  16      56.637  74.479  15.071  1.00 97.14           C  
+ATOM    347  N2    G A  16      57.623  74.875  15.890  1.00 96.62           N  
+ATOM    348  N3    G A  16      56.099  75.334  14.211  1.00 97.69           N  
+ATOM    349  C4    G A  16      55.123  74.760  13.478  1.00 97.40           C  
+ATOM    350  P     U A  17      57.613  77.465   8.504  1.00105.06           P  
+ATOM    351  OP1   U A  17      58.306  78.633   7.898  1.00106.21           O  
+ATOM    352  OP2   U A  17      57.264  76.299   7.656  1.00105.45           O  
+ATOM    353  O5'   U A  17      58.481  76.978   9.742  1.00104.29           O  
+ATOM    354  C5'   U A  17      59.030  77.934  10.631  1.00105.27           C  
+ATOM    355  C4'   U A  17      60.024  77.281  11.542  1.00106.09           C  
+ATOM    356  O4'   U A  17      59.313  76.526  12.556  1.00106.80           O  
+ATOM    357  C3'   U A  17      60.896  76.236  10.865  1.00106.38           C  
+ATOM    358  O3'   U A  17      61.999  76.794  10.166  1.00105.97           O  
+ATOM    359  C2'   U A  17      61.333  75.377  12.039  1.00107.09           C  
+ATOM    360  O2'   U A  17      62.390  75.956  12.777  1.00107.37           O  
+ATOM    361  C1'   U A  17      60.062  75.368  12.886  1.00107.53           C  
+ATOM    362  N1    U A  17      59.249  74.171  12.641  1.00108.23           N  
+ATOM    363  C2    U A  17      59.727  72.987  13.165  1.00108.78           C  
+ATOM    364  O2    U A  17      60.774  72.918  13.788  1.00108.71           O  
+ATOM    365  N3    U A  17      58.941  71.889  12.933  1.00109.36           N  
+ATOM    366  C4    U A  17      57.756  71.849  12.242  1.00109.57           C  
+ATOM    367  O4    U A  17      57.161  70.773  12.132  1.00109.52           O  
+ATOM    368  C5    U A  17      57.327  73.116  11.719  1.00109.14           C  
+ATOM    369  C6    U A  17      58.072  74.209  11.933  1.00108.45           C  
+ATOM    370  P     G A  18      62.500  76.096   8.807  1.00105.66           P  
+ATOM    371  OP1   G A  18      63.661  76.851   8.267  1.00106.51           O  
+ATOM    372  OP2   G A  18      61.283  75.919   7.968  1.00105.50           O  
+ATOM    373  O5'   G A  18      63.018  74.668   9.285  1.00103.99           O  
+ATOM    374  C5'   G A  18      64.021  74.559  10.291  1.00102.43           C  
+ATOM    375  C4'   G A  18      64.199  73.117  10.695  1.00101.12           C  
+ATOM    376  O4'   G A  18      62.949  72.618  11.238  1.00100.63           O  
+ATOM    377  C3'   G A  18      64.527  72.165   9.556  1.00100.12           C  
+ATOM    378  O3'   G A  18      65.928  72.132   9.335  1.00 99.74           O  
+ATOM    379  C2'   G A  18      64.031  70.830  10.098  1.00 99.32           C  
+ATOM    380  O2'   G A  18      64.952  70.220  10.976  1.00 98.70           O  
+ATOM    381  C1'   G A  18      62.774  71.261  10.858  1.00 99.21           C  
+ATOM    382  N9    G A  18      61.557  71.174  10.058  1.00 97.34           N  
+ATOM    383  C8    G A  18      61.041  72.135   9.221  1.00 96.69           C  
+ATOM    384  N7    G A  18      59.926  71.773   8.650  1.00 96.07           N  
+ATOM    385  C5    G A  18      59.693  70.496   9.136  1.00 95.84           C  
+ATOM    386  C6    G A  18      58.632  69.595   8.875  1.00 95.53           C  
+ATOM    387  O6    G A  18      57.654  69.753   8.139  1.00 94.90           O  
+ATOM    388  N1    G A  18      58.790  68.401   9.575  1.00 95.75           N  
+ATOM    389  C2    G A  18      59.837  68.113  10.420  1.00 95.59           C  
+ATOM    390  N2    G A  18      59.815  66.907  10.994  1.00 95.41           N  
+ATOM    391  N3    G A  18      60.830  68.947  10.676  1.00 95.69           N  
+ATOM    392  C4    G A  18      60.695  70.110  10.004  1.00 96.38           C  
+ATOM    393  P     G A  19      66.529  72.627   7.927  1.00100.83           P  
+ATOM    394  OP1   G A  19      67.023  74.021   8.096  1.00101.74           O  
+ATOM    395  OP2   G A  19      65.531  72.332   6.866  1.00 99.87           O  
+ATOM    396  O5'   G A  19      67.784  71.666   7.719  1.00 98.72           O  
+ATOM    397  C5'   G A  19      67.715  70.548   6.836  1.00 95.36           C  
+ATOM    398  C4'   G A  19      67.006  69.387   7.504  1.00 92.73           C  
+ATOM    399  O4'   G A  19      65.677  69.803   7.898  1.00 92.37           O  
+ATOM    400  C3'   G A  19      66.784  68.160   6.634  1.00 90.61           C  
+ATOM    401  O3'   G A  19      67.898  67.278   6.715  1.00 88.58           O  
+ATOM    402  C2'   G A  19      65.571  67.513   7.282  1.00 90.73           C  
+ATOM    403  O2'   G A  19      65.939  66.784   8.435  1.00 91.75           O  
+ATOM    404  C1'   G A  19      64.761  68.740   7.698  1.00 90.64           C  
+ATOM    405  N9    G A  19      63.754  69.219   6.755  1.00 88.83           N  
+ATOM    406  C8    G A  19      63.909  70.246   5.855  1.00 87.97           C  
+ATOM    407  N7    G A  19      62.804  70.558   5.236  1.00 87.34           N  
+ATOM    408  C5    G A  19      61.865  69.664   5.732  1.00 87.12           C  
+ATOM    409  C6    G A  19      60.486  69.532   5.442  1.00 86.28           C  
+ATOM    410  O6    G A  19      59.791  70.206   4.678  1.00 85.66           O  
+ATOM    411  N1    G A  19      59.914  68.489   6.154  1.00 86.49           N  
+ATOM    412  C2    G A  19      60.577  67.680   7.038  1.00 87.60           C  
+ATOM    413  N2    G A  19      59.838  66.725   7.615  1.00 88.67           N  
+ATOM    414  N3    G A  19      61.863  67.797   7.332  1.00 87.70           N  
+ATOM    415  C4    G A  19      62.442  68.805   6.647  1.00 87.88           C  
+ATOM    416  P     A A  20      67.943  65.983   5.777  1.00 86.58           P  
+ATOM    417  OP1   A A  20      69.331  65.483   5.704  1.00 86.40           O  
+ATOM    418  OP2   A A  20      67.232  66.383   4.539  1.00 86.39           O  
+ATOM    419  O5'   A A  20      67.063  64.896   6.537  1.00 85.63           O  
+ATOM    420  C5'   A A  20      67.650  63.993   7.479  1.00 83.85           C  
+ATOM    421  C4'   A A  20      66.922  62.667   7.448  1.00 82.33           C  
+ATOM    422  O4'   A A  20      65.507  62.890   7.680  1.00 81.16           O  
+ATOM    423  C3'   A A  20      66.983  61.952   6.114  1.00 81.89           C  
+ATOM    424  O3'   A A  20      68.221  61.231   6.041  1.00 83.05           O  
+ATOM    425  C2'   A A  20      65.712  61.108   6.103  1.00 81.15           C  
+ATOM    426  O2'   A A  20      65.786  59.824   6.656  1.00 83.37           O  
+ATOM    427  C1'   A A  20      64.744  61.986   6.902  1.00 80.09           C  
+ATOM    428  N9    A A  20      63.779  62.755   6.122  1.00 77.26           N  
+ATOM    429  C8    A A  20      63.909  64.014   5.592  1.00 76.84           C  
+ATOM    430  N7    A A  20      62.844  64.431   4.955  1.00 76.08           N  
+ATOM    431  C5    A A  20      61.958  63.373   5.068  1.00 75.98           C  
+ATOM    432  C6    A A  20      60.651  63.184   4.598  1.00 75.86           C  
+ATOM    433  N6    A A  20      59.982  64.094   3.882  1.00 76.10           N  
+ATOM    434  N1    A A  20      60.045  62.012   4.888  1.00 75.42           N  
+ATOM    435  C2    A A  20      60.720  61.100   5.602  1.00 76.18           C  
+ATOM    436  N3    A A  20      61.952  61.161   6.096  1.00 76.33           N  
+ATOM    437  C4    A A  20      62.522  62.336   5.786  1.00 76.27           C  
+ATOM    438  P     G A  21      68.416  59.835   6.842  1.00 83.99           P  
+ATOM    439  OP1   G A  21      69.871  59.617   7.084  1.00 82.93           O  
+ATOM    440  OP2   G A  21      67.632  58.787   6.129  1.00 85.06           O  
+ATOM    441  O5'   G A  21      67.758  60.103   8.267  1.00 81.30           O  
+ATOM    442  C5'   G A  21      67.378  59.027   9.123  1.00 78.72           C  
+ATOM    443  C4'   G A  21      66.027  59.321   9.725  1.00 78.10           C  
+ATOM    444  O4'   G A  21      65.080  59.521   8.640  1.00 78.26           O  
+ATOM    445  C3'   G A  21      65.380  58.242  10.572  1.00 76.75           C  
+ATOM    446  O3'   G A  21      65.797  58.230  11.918  1.00 75.15           O  
+ATOM    447  C2'   G A  21      63.914  58.615  10.469  1.00 77.51           C  
+ATOM    448  O2'   G A  21      63.635  59.759  11.250  1.00 78.02           O  
+ATOM    449  C1'   G A  21      63.821  58.986   8.994  1.00 78.22           C  
+ATOM    450  N9    G A  21      63.595  57.775   8.211  1.00 78.46           N  
+ATOM    451  C8    G A  21      64.527  57.004   7.558  1.00 78.61           C  
+ATOM    452  N7    G A  21      64.008  55.947   6.988  1.00 79.65           N  
+ATOM    453  C5    G A  21      62.651  56.035   7.272  1.00 79.52           C  
+ATOM    454  C6    G A  21      61.569  55.176   6.920  1.00 79.20           C  
+ATOM    455  O6    G A  21      61.593  54.121   6.262  1.00 77.93           O  
+ATOM    456  N1    G A  21      60.362  55.653   7.420  1.00 79.94           N  
+ATOM    457  C2    G A  21      60.211  56.801   8.162  1.00 80.08           C  
+ATOM    458  N2    G A  21      58.978  57.110   8.559  1.00 80.92           N  
+ATOM    459  N3    G A  21      61.202  57.597   8.494  1.00 79.71           N  
+ATOM    460  C4    G A  21      62.383  57.161   8.020  1.00 79.25           C  
+ATOM    461  P     G A  22      65.553  56.907  12.788  1.00 75.22           P  
+ATOM    462  OP1   G A  22      66.079  57.154  14.161  1.00 76.23           O  
+ATOM    463  OP2   G A  22      66.048  55.739  12.002  1.00 74.26           O  
+ATOM    464  O5'   G A  22      63.966  56.780  12.860  1.00 74.14           O  
+ATOM    465  C5'   G A  22      63.189  57.768  13.513  1.00 71.88           C  
+ATOM    466  C4'   G A  22      61.736  57.364  13.541  1.00 70.11           C  
+ATOM    467  O4'   G A  22      61.245  57.258  12.173  1.00 69.75           O  
+ATOM    468  C3'   G A  22      61.479  55.972  14.091  1.00 69.37           C  
+ATOM    469  O3'   G A  22      61.441  55.892  15.497  1.00 68.01           O  
+ATOM    470  C2'   G A  22      60.128  55.634  13.493  1.00 69.71           C  
+ATOM    471  O2'   G A  22      59.080  56.284  14.172  1.00 69.55           O  
+ATOM    472  C1'   G A  22      60.269  56.226  12.097  1.00 70.83           C  
+ATOM    473  N9    G A  22      60.698  55.184  11.167  1.00 71.65           N  
+ATOM    474  C8    G A  22      61.942  54.973  10.631  1.00 71.65           C  
+ATOM    475  N7    G A  22      61.995  53.916   9.865  1.00 72.21           N  
+ATOM    476  C5    G A  22      60.704  53.408   9.890  1.00 71.92           C  
+ATOM    477  C6    G A  22      60.149  52.278   9.247  1.00 71.25           C  
+ATOM    478  O6    G A  22      60.704  51.471   8.496  1.00 71.85           O  
+ATOM    479  N1    G A  22      58.797  52.130   9.550  1.00 71.46           N  
+ATOM    480  C2    G A  22      58.071  52.964  10.362  1.00 71.45           C  
+ATOM    481  N2    G A  22      56.779  52.662  10.534  1.00 71.19           N  
+ATOM    482  N3    G A  22      58.578  54.021  10.962  1.00 72.00           N  
+ATOM    483  C4    G A  22      59.891  54.181  10.684  1.00 72.15           C  
+ATOM    484  P     G A  23      61.563  54.455  16.191  1.00 67.32           P  
+ATOM    485  OP1   G A  23      61.633  54.663  17.661  1.00 67.78           O  
+ATOM    486  OP2   G A  23      62.665  53.751  15.493  1.00 67.92           O  
+ATOM    487  O5'   G A  23      60.178  53.745  15.842  1.00 66.55           O  
+ATOM    488  C5'   G A  23      58.959  54.370  16.209  1.00 66.95           C  
+ATOM    489  C4'   G A  23      57.770  53.491  15.901  1.00 66.33           C  
+ATOM    490  O4'   G A  23      57.553  53.426  14.460  1.00 66.90           O  
+ATOM    491  C3'   G A  23      57.922  52.034  16.291  1.00 66.34           C  
+ATOM    492  O3'   G A  23      57.682  51.787  17.656  1.00 69.23           O  
+ATOM    493  C2'   G A  23      56.884  51.359  15.412  1.00 64.38           C  
+ATOM    494  O2'   G A  23      55.584  51.547  15.920  1.00 61.23           O  
+ATOM    495  C1'   G A  23      57.037  52.146  14.114  1.00 64.35           C  
+ATOM    496  N9    G A  23      57.967  51.457  13.227  1.00 63.89           N  
+ATOM    497  C8    G A  23      59.306  51.697  13.043  1.00 63.75           C  
+ATOM    498  N7    G A  23      59.868  50.849  12.223  1.00 64.11           N  
+ATOM    499  C5    G A  23      58.831  50.010  11.833  1.00 62.97           C  
+ATOM    500  C6    G A  23      58.825  48.887  10.958  1.00 62.43           C  
+ATOM    501  O6    G A  23      59.769  48.388  10.326  1.00 63.41           O  
+ATOM    502  N1    G A  23      57.556  48.332  10.852  1.00 61.36           N  
+ATOM    503  C2    G A  23      56.437  48.785  11.502  1.00 60.60           C  
+ATOM    504  N2    G A  23      55.296  48.112  11.268  1.00 60.05           N  
+ATOM    505  N3    G A  23      56.431  49.822  12.322  1.00 61.58           N  
+ATOM    506  C4    G A  23      57.652  50.383  12.437  1.00 62.69           C  
+ATOM    507  P     A A  24      58.081  50.365  18.262  1.00 70.89           P  
+ATOM    508  OP1   A A  24      58.882  49.647  17.244  1.00 73.17           O  
+ATOM    509  OP2   A A  24      56.848  49.740  18.787  1.00 72.21           O  
+ATOM    510  O5'   A A  24      59.039  50.727  19.478  1.00 71.11           O  
+ATOM    511  C5'   A A  24      60.110  51.657  19.320  1.00 70.21           C  
+ATOM    512  C4'   A A  24      61.356  51.123  19.985  1.00 68.55           C  
+ATOM    513  O4'   A A  24      61.028  50.722  21.337  1.00 67.16           O  
+ATOM    514  C3'   A A  24      61.944  49.873  19.358  1.00 69.42           C  
+ATOM    515  O3'   A A  24      62.824  50.253  18.304  1.00 71.85           O  
+ATOM    516  C2'   A A  24      62.695  49.249  20.531  1.00 67.92           C  
+ATOM    517  O2'   A A  24      63.935  49.871  20.803  1.00 69.68           O  
+ATOM    518  C1'   A A  24      61.752  49.558  21.688  1.00 64.41           C  
+ATOM    519  N9    A A  24      60.780  48.506  21.963  1.00 60.75           N  
+ATOM    520  C8    A A  24      59.468  48.471  21.572  1.00 59.22           C  
+ATOM    521  N7    A A  24      58.812  47.425  22.015  1.00 59.13           N  
+ATOM    522  C5    A A  24      59.761  46.720  22.737  1.00 58.33           C  
+ATOM    523  C6    A A  24      59.689  45.530  23.474  1.00 58.17           C  
+ATOM    524  N6    A A  24      58.567  44.818  23.625  1.00 58.76           N  
+ATOM    525  N1    A A  24      60.816  45.090  24.067  1.00 58.32           N  
+ATOM    526  C2    A A  24      61.931  45.814  23.930  1.00 60.28           C  
+ATOM    527  N3    A A  24      62.122  46.959  23.277  1.00 61.00           N  
+ATOM    528  C4    A A  24      60.983  47.364  22.697  1.00 60.30           C  
+ATOM    529  P     C A  25      63.295  49.164  17.228  1.00 72.52           P  
+ATOM    530  OP1   C A  25      64.442  49.734  16.487  1.00 70.92           O  
+ATOM    531  OP2   C A  25      62.101  48.674  16.477  1.00 74.42           O  
+ATOM    532  O5'   C A  25      63.825  47.968  18.134  1.00 71.83           O  
+ATOM    533  C5'   C A  25      65.165  47.952  18.598  1.00 72.62           C  
+ATOM    534  C4'   C A  25      65.485  46.606  19.185  1.00 74.39           C  
+ATOM    535  O4'   C A  25      64.558  46.356  20.273  1.00 73.10           O  
+ATOM    536  C3'   C A  25      65.263  45.426  18.250  1.00 76.56           C  
+ATOM    537  O3'   C A  25      66.392  45.192  17.419  1.00 81.10           O  
+ATOM    538  C2'   C A  25      65.043  44.274  19.223  1.00 74.88           C  
+ATOM    539  O2'   C A  25      66.249  43.738  19.735  1.00 75.19           O  
+ATOM    540  C1'   C A  25      64.261  44.972  20.335  1.00 72.77           C  
+ATOM    541  N1    C A  25      62.813  44.801  20.227  1.00 71.71           N  
+ATOM    542  C2    C A  25      62.260  43.662  20.760  1.00 71.83           C  
+ATOM    543  O2    C A  25      63.013  42.827  21.270  1.00 73.95           O  
+ATOM    544  N3    C A  25      60.927  43.481  20.711  1.00 70.88           N  
+ATOM    545  C4    C A  25      60.155  44.391  20.139  1.00 69.84           C  
+ATOM    546  N4    C A  25      58.841  44.155  20.123  1.00 70.13           N  
+ATOM    547  C5    C A  25      60.695  45.576  19.562  1.00 69.41           C  
+ATOM    548  C6    C A  25      62.022  45.740  19.626  1.00 70.68           C  
+ATOM    549  P     U A  26      66.238  44.250  16.126  1.00 85.16           P  
+ATOM    550  OP1   U A  26      67.594  43.929  15.605  1.00 84.53           O  
+ATOM    551  OP2   U A  26      65.243  44.884  15.235  1.00 85.22           O  
+ATOM    552  O5'   U A  26      65.582  42.908  16.686  1.00 83.10           O  
+ATOM    553  C5'   U A  26      66.404  41.853  17.168  1.00 83.06           C  
+ATOM    554  C4'   U A  26      65.751  40.520  16.911  1.00 82.90           C  
+ATOM    555  O4'   U A  26      64.618  40.350  17.795  1.00 83.33           O  
+ATOM    556  C3'   U A  26      65.164  40.371  15.525  1.00 82.05           C  
+ATOM    557  O3'   U A  26      66.184  39.990  14.616  1.00 81.59           O  
+ATOM    558  C2'   U A  26      64.113  39.289  15.737  1.00 82.83           C  
+ATOM    559  O2'   U A  26      64.643  37.983  15.780  1.00 83.21           O  
+ATOM    560  C1'   U A  26      63.594  39.639  17.129  1.00 83.33           C  
+ATOM    561  N1    U A  26      62.387  40.475  17.115  1.00 84.07           N  
+ATOM    562  C2    U A  26      61.168  39.833  17.084  1.00 84.45           C  
+ATOM    563  O2    U A  26      61.060  38.619  17.070  1.00 84.31           O  
+ATOM    564  N3    U A  26      60.076  40.662  17.073  1.00 84.96           N  
+ATOM    565  C4    U A  26      60.082  42.039  17.090  1.00 85.37           C  
+ATOM    566  O4    U A  26      59.012  42.648  17.081  1.00 85.84           O  
+ATOM    567  C5    U A  26      61.383  42.627  17.120  1.00 84.60           C  
+ATOM    568  C6    U A  26      62.465  41.842  17.132  1.00 84.27           C  
+ATOM    569  P     G A  27      66.132  40.515  13.104  1.00 81.65           P  
+ATOM    570  OP1   G A  27      67.350  40.038  12.413  1.00 83.23           O  
+ATOM    571  OP2   G A  27      65.837  41.963  13.132  1.00 82.55           O  
+ATOM    572  O5'   G A  27      64.885  39.731  12.503  1.00 80.51           O  
+ATOM    573  C5'   G A  27      64.935  38.317  12.376  1.00 78.28           C  
+ATOM    574  C4'   G A  27      63.552  37.741  12.178  1.00 77.67           C  
+ATOM    575  O4'   G A  27      62.747  38.009  13.362  1.00 77.49           O  
+ATOM    576  C3'   G A  27      62.728  38.306  11.023  1.00 76.44           C  
+ATOM    577  O3'   G A  27      63.058  37.664   9.795  1.00 75.91           O  
+ATOM    578  C2'   G A  27      61.311  37.972  11.470  1.00 76.07           C  
+ATOM    579  O2'   G A  27      61.007  36.613  11.242  1.00 74.28           O  
+ATOM    580  C1'   G A  27      61.397  38.227  12.979  1.00 76.21           C  
+ATOM    581  N9    G A  27      61.016  39.598  13.319  1.00 74.43           N  
+ATOM    582  C8    G A  27      61.838  40.697  13.410  1.00 74.12           C  
+ATOM    583  N7    G A  27      61.190  41.800  13.682  1.00 73.38           N  
+ATOM    584  C5    G A  27      59.863  41.404  13.788  1.00 72.40           C  
+ATOM    585  C6    G A  27      58.695  42.162  14.067  1.00 71.55           C  
+ATOM    586  O6    G A  27      58.592  43.386  14.280  1.00 70.85           O  
+ATOM    587  N1    G A  27      57.559  41.356  14.086  1.00 70.35           N  
+ATOM    588  C2    G A  27      57.544  40.002  13.863  1.00 70.15           C  
+ATOM    589  N2    G A  27      56.350  39.400  13.926  1.00 68.30           N  
+ATOM    590  N3    G A  27      58.623  39.288  13.598  1.00 71.70           N  
+ATOM    591  C4    G A  27      59.740  40.047  13.577  1.00 72.98           C  
+ATOM    592  P     G A  28      62.365  38.133   8.409  1.00 76.89           P  
+ATOM    593  OP1   G A  28      62.160  36.878   7.623  1.00 77.47           O  
+ATOM    594  OP2   G A  28      63.124  39.269   7.796  1.00 75.40           O  
+ATOM    595  O5'   G A  28      60.924  38.672   8.823  1.00 76.26           O  
+ATOM    596  C5'   G A  28      60.164  39.487   7.926  1.00 73.92           C  
+ATOM    597  C4'   G A  28      58.705  39.462   8.314  1.00 71.92           C  
+ATOM    598  O4'   G A  28      58.573  39.835   9.714  1.00 71.54           O  
+ATOM    599  C3'   G A  28      57.811  40.439   7.565  1.00 70.88           C  
+ATOM    600  O3'   G A  28      57.367  39.868   6.331  1.00 69.61           O  
+ATOM    601  C2'   G A  28      56.656  40.616   8.546  1.00 70.99           C  
+ATOM    602  O2'   G A  28      55.717  39.557   8.480  1.00 71.07           O  
+ATOM    603  C1'   G A  28      57.387  40.587   9.894  1.00 71.11           C  
+ATOM    604  N9    G A  28      57.746  41.916  10.380  1.00 70.31           N  
+ATOM    605  C8    G A  28      58.962  42.543  10.281  1.00 70.75           C  
+ATOM    606  N7    G A  28      58.958  43.747  10.782  1.00 70.48           N  
+ATOM    607  C5    G A  28      57.663  43.920  11.251  1.00 69.56           C  
+ATOM    608  C6    G A  28      57.055  45.027  11.906  1.00 69.08           C  
+ATOM    609  O6    G A  28      57.557  46.119  12.224  1.00 68.50           O  
+ATOM    610  N1    G A  28      55.724  44.771  12.202  1.00 69.21           N  
+ATOM    611  C2    G A  28      55.060  43.608  11.915  1.00 69.07           C  
+ATOM    612  N2    G A  28      53.767  43.555  12.280  1.00 68.80           N  
+ATOM    613  N3    G A  28      55.616  42.572  11.315  1.00 69.71           N  
+ATOM    614  C4    G A  28      56.906  42.797  11.014  1.00 69.55           C  
+ATOM    615  P     C A  29      57.271  40.780   5.008  1.00 67.90           P  
+ATOM    616  OP1   C A  29      56.896  39.914   3.864  1.00 70.57           O  
+ATOM    617  OP2   C A  29      58.508  41.596   4.940  1.00 69.03           O  
+ATOM    618  O5'   C A  29      56.055  41.759   5.299  1.00 66.35           O  
+ATOM    619  C5'   C A  29      54.758  41.248   5.567  1.00 62.83           C  
+ATOM    620  C4'   C A  29      53.946  42.279   6.308  1.00 62.09           C  
+ATOM    621  O4'   C A  29      54.537  42.496   7.619  1.00 59.41           O  
+ATOM    622  C3'   C A  29      53.949  43.661   5.684  1.00 62.50           C  
+ATOM    623  O3'   C A  29      53.018  43.803   4.618  1.00 64.25           O  
+ATOM    624  C2'   C A  29      53.618  44.546   6.876  1.00 61.37           C  
+ATOM    625  O2'   C A  29      52.234  44.525   7.187  1.00 61.74           O  
+ATOM    626  C1'   C A  29      54.421  43.860   7.981  1.00 59.52           C  
+ATOM    627  N1    C A  29      55.777  44.424   8.092  1.00 59.57           N  
+ATOM    628  C2    C A  29      55.950  45.631   8.772  1.00 59.50           C  
+ATOM    629  O2    C A  29      54.973  46.175   9.280  1.00 60.54           O  
+ATOM    630  N3    C A  29      57.180  46.174   8.858  1.00 59.71           N  
+ATOM    631  C4    C A  29      58.225  45.562   8.299  1.00 59.10           C  
+ATOM    632  N4    C A  29      59.412  46.152   8.405  1.00 56.50           N  
+ATOM    633  C5    C A  29      58.091  44.321   7.607  1.00 59.16           C  
+ATOM    634  C6    C A  29      56.856  43.790   7.529  1.00 59.74           C  
+ATOM    635  P     C A  30      53.015  45.164   3.761  1.00 65.71           P  
+ATOM    636  OP1   C A  30      51.995  45.078   2.682  1.00 66.48           O  
+ATOM    637  OP2   C A  30      54.428  45.487   3.422  1.00 64.15           O  
+ATOM    638  O5'   C A  30      52.539  46.252   4.817  1.00 66.68           O  
+ATOM    639  C5'   C A  30      52.834  47.619   4.624  1.00 66.07           C  
+ATOM    640  C4'   C A  30      52.552  48.383   5.883  1.00 64.24           C  
+ATOM    641  O4'   C A  30      53.379  47.875   6.961  1.00 63.99           O  
+ATOM    642  C3'   C A  30      52.853  49.863   5.817  1.00 63.38           C  
+ATOM    643  O3'   C A  30      51.704  50.500   5.285  1.00 63.48           O  
+ATOM    644  C2'   C A  30      53.060  50.195   7.287  1.00 63.64           C  
+ATOM    645  O2'   C A  30      51.818  50.289   7.955  1.00 63.72           O  
+ATOM    646  C1'   C A  30      53.793  48.945   7.782  1.00 63.35           C  
+ATOM    647  N1    C A  30      55.243  49.051   7.628  1.00 63.96           N  
+ATOM    648  C2    C A  30      55.945  49.948   8.418  1.00 64.30           C  
+ATOM    649  O2    C A  30      55.330  50.610   9.257  1.00 66.15           O  
+ATOM    650  N3    C A  30      57.280  50.073   8.250  1.00 64.07           N  
+ATOM    651  C4    C A  30      57.909  49.334   7.339  1.00 63.26           C  
+ATOM    652  N4    C A  30      59.218  49.497   7.206  1.00 63.72           N  
+ATOM    653  C5    C A  30      57.220  48.395   6.526  1.00 63.27           C  
+ATOM    654  C6    C A  30      55.897  48.284   6.704  1.00 64.28           C  
+ATOM    655  P     C A  31      51.870  51.754   4.306  1.00 64.41           P  
+ATOM    656  OP1   C A  31      50.528  52.130   3.784  1.00 63.20           O  
+ATOM    657  OP2   C A  31      52.983  51.484   3.365  1.00 63.17           O  
+ATOM    658  O5'   C A  31      52.369  52.895   5.282  1.00 63.89           O  
+ATOM    659  C5'   C A  31      51.578  53.280   6.382  1.00 63.36           C  
+ATOM    660  C4'   C A  31      52.287  54.339   7.160  1.00 63.12           C  
+ATOM    661  O4'   C A  31      53.352  53.730   7.927  1.00 63.91           O  
+ATOM    662  C3'   C A  31      53.003  55.344   6.284  1.00 61.70           C  
+ATOM    663  O3'   C A  31      52.113  56.345   5.844  1.00 61.08           O  
+ATOM    664  C2'   C A  31      54.052  55.885   7.231  1.00 62.18           C  
+ATOM    665  O2'   C A  31      53.483  56.788   8.145  1.00 62.99           O  
+ATOM    666  C1'   C A  31      54.443  54.622   7.990  1.00 63.19           C  
+ATOM    667  N1    C A  31      55.620  53.977   7.410  1.00 63.84           N  
+ATOM    668  C2    C A  31      56.831  54.589   7.597  1.00 63.43           C  
+ATOM    669  O2    C A  31      56.855  55.634   8.245  1.00 64.84           O  
+ATOM    670  N3    C A  31      57.946  54.041   7.081  1.00 63.21           N  
+ATOM    671  C4    C A  31      57.872  52.902   6.402  1.00 64.27           C  
+ATOM    672  N4    C A  31      59.010  52.390   5.922  1.00 64.98           N  
+ATOM    673  C5    C A  31      56.633  52.238   6.190  1.00 65.15           C  
+ATOM    674  C6    C A  31      55.535  52.809   6.707  1.00 64.47           C  
+ATOM    675  P     G A  32      52.458  57.185   4.523  1.00 62.37           P  
+ATOM    676  OP1   G A  32      51.396  58.213   4.397  1.00 60.41           O  
+ATOM    677  OP2   G A  32      52.715  56.238   3.403  1.00 60.94           O  
+ATOM    678  O5'   G A  32      53.835  57.910   4.866  1.00 63.18           O  
+ATOM    679  C5'   G A  32      53.847  59.093   5.641  1.00 62.39           C  
+ATOM    680  C4'   G A  32      55.228  59.676   5.680  1.00 63.39           C  
+ATOM    681  O4'   G A  32      56.105  58.751   6.367  1.00 64.76           O  
+ATOM    682  C3'   G A  32      55.889  59.815   4.326  1.00 64.49           C  
+ATOM    683  O3'   G A  32      55.509  60.970   3.617  1.00 65.91           O  
+ATOM    684  C2'   G A  32      57.362  59.837   4.675  1.00 65.04           C  
+ATOM    685  O2'   G A  32      57.780  61.102   5.143  1.00 64.75           O  
+ATOM    686  C1'   G A  32      57.404  58.811   5.800  1.00 64.89           C  
+ATOM    687  N9    G A  32      57.744  57.503   5.264  1.00 66.38           N  
+ATOM    688  C8    G A  32      56.907  56.435   5.060  1.00 68.11           C  
+ATOM    689  N7    G A  32      57.510  55.412   4.521  1.00 69.20           N  
+ATOM    690  C5    G A  32      58.823  55.836   4.361  1.00 68.47           C  
+ATOM    691  C6    G A  32      59.932  55.175   3.806  1.00 69.12           C  
+ATOM    692  O6    G A  32      59.980  54.056   3.304  1.00 71.60           O  
+ATOM    693  N1    G A  32      61.076  55.961   3.856  1.00 69.48           N  
+ATOM    694  C2    G A  32      61.139  57.234   4.358  1.00 69.13           C  
+ATOM    695  N2    G A  32      62.336  57.831   4.314  1.00 68.48           N  
+ATOM    696  N3    G A  32      60.103  57.870   4.863  1.00 68.83           N  
+ATOM    697  C4    G A  32      58.984  57.116   4.833  1.00 67.70           C  
+ATOM    698  P     A A  33      55.228  60.837   2.054  1.00 67.60           P  
+ATOM    699  OP1   A A  33      53.763  60.625   1.905  1.00 65.92           O  
+ATOM    700  OP2   A A  33      56.180  59.801   1.567  1.00 67.33           O  
+ATOM    701  O5'   A A  33      55.593  62.258   1.434  1.00 67.76           O  
+ATOM    702  C5'   A A  33      56.865  62.878   1.641  1.00 69.76           C  
+ATOM    703  C4'   A A  33      56.994  64.038   0.684  1.00 71.33           C  
+ATOM    704  O4'   A A  33      58.204  64.805   0.937  1.00 71.47           O  
+ATOM    705  C3'   A A  33      57.125  63.544  -0.740  1.00 72.06           C  
+ATOM    706  O3'   A A  33      56.034  63.736  -1.619  1.00 74.07           O  
+ATOM    707  C2'   A A  33      58.602  63.589  -1.112  1.00 71.79           C  
+ATOM    708  O2'   A A  33      58.810  64.058  -2.429  1.00 71.97           O  
+ATOM    709  C1'   A A  33      59.144  64.615  -0.110  1.00 70.81           C  
+ATOM    710  N9    A A  33      60.441  64.313   0.492  1.00 69.50           N  
+ATOM    711  C8    A A  33      61.506  65.166   0.616  1.00 69.12           C  
+ATOM    712  N7    A A  33      62.547  64.634   1.211  1.00 68.67           N  
+ATOM    713  C5    A A  33      62.140  63.340   1.497  1.00 68.66           C  
+ATOM    714  C6    A A  33      62.789  62.260   2.126  1.00 67.48           C  
+ATOM    715  N6    A A  33      64.024  62.321   2.622  1.00 67.34           N  
+ATOM    716  N1    A A  33      62.112  61.104   2.236  1.00 66.36           N  
+ATOM    717  C2    A A  33      60.863  61.047   1.756  1.00 68.99           C  
+ATOM    718  N3    A A  33      60.140  61.993   1.155  1.00 68.41           N  
+ATOM    719  C4    A A  33      60.845  63.127   1.054  1.00 69.05           C  
+ATOM    720  P     U A  34      55.824  65.152  -2.328  1.00 74.88           P  
+ATOM    721  OP1   U A  34      55.020  64.908  -3.544  1.00 76.95           O  
+ATOM    722  OP2   U A  34      57.139  65.818  -2.430  1.00 77.84           O  
+ATOM    723  O5'   U A  34      54.926  65.989  -1.318  1.00 78.42           O  
+ATOM    724  C5'   U A  34      54.185  65.351  -0.295  1.00 81.29           C  
+ATOM    725  C4'   U A  34      52.728  65.677  -0.440  1.00 83.18           C  
+ATOM    726  O4'   U A  34      52.277  65.244  -1.744  1.00 85.09           O  
+ATOM    727  C3'   U A  34      51.830  64.944   0.538  1.00 84.70           C  
+ATOM    728  O3'   U A  34      51.739  65.734   1.721  1.00 86.22           O  
+ATOM    729  C2'   U A  34      50.492  64.920  -0.195  1.00 85.34           C  
+ATOM    730  O2'   U A  34      49.750  66.116  -0.048  1.00 86.46           O  
+ATOM    731  C1'   U A  34      50.941  64.780  -1.652  1.00 85.85           C  
+ATOM    732  N1    U A  34      50.856  63.449  -2.274  1.00 86.02           N  
+ATOM    733  C2    U A  34      49.694  62.731  -2.110  1.00 86.35           C  
+ATOM    734  O2    U A  34      48.760  63.134  -1.441  1.00 86.70           O  
+ATOM    735  N3    U A  34      49.663  61.521  -2.759  1.00 86.83           N  
+ATOM    736  C4    U A  34      50.662  60.967  -3.534  1.00 86.45           C  
+ATOM    737  O4    U A  34      50.500  59.849  -4.031  1.00 85.04           O  
+ATOM    738  C5    U A  34      51.837  61.771  -3.643  1.00 86.54           C  
+ATOM    739  C6    U A  34      51.894  62.951  -3.021  1.00 85.75           C  
+ATOM    740  P     G A  35      52.152  65.101   3.133  1.00 86.03           P  
+ATOM    741  OP1   G A  35      53.057  63.962   2.842  1.00 87.58           O  
+ATOM    742  OP2   G A  35      50.900  64.870   3.900  1.00 86.93           O  
+ATOM    743  O5'   G A  35      52.992  66.243   3.851  1.00 82.44           O  
+ATOM    744  C5'   G A  35      53.697  65.970   5.055  1.00 82.21           C  
+ATOM    745  C4'   G A  35      54.954  65.202   4.743  1.00 80.34           C  
+ATOM    746  O4'   G A  35      55.443  65.620   3.455  1.00 81.24           O  
+ATOM    747  C3'   G A  35      56.105  65.432   5.709  1.00 80.16           C  
+ATOM    748  O3'   G A  35      56.017  64.446   6.733  1.00 78.85           O  
+ATOM    749  C2'   G A  35      57.326  65.138   4.843  1.00 81.09           C  
+ATOM    750  O2'   G A  35      57.613  63.762   4.756  1.00 84.00           O  
+ATOM    751  C1'   G A  35      56.852  65.607   3.468  1.00 81.14           C  
+ATOM    752  N9    G A  35      57.345  66.850   2.883  1.00 80.09           N  
+ATOM    753  C8    G A  35      56.599  67.774   2.191  1.00 79.74           C  
+ATOM    754  N7    G A  35      57.324  68.703   1.637  1.00 79.94           N  
+ATOM    755  C5    G A  35      58.624  68.394   2.016  1.00 78.91           C  
+ATOM    756  C6    G A  35      59.843  69.026   1.693  1.00 78.16           C  
+ATOM    757  O6    G A  35      60.033  70.005   0.961  1.00 79.05           O  
+ATOM    758  N1    G A  35      60.919  68.399   2.305  1.00 76.96           N  
+ATOM    759  C2    G A  35      60.834  67.298   3.114  1.00 77.37           C  
+ATOM    760  N2    G A  35      61.990  66.850   3.623  1.00 76.36           N  
+ATOM    761  N3    G A  35      59.702  66.685   3.407  1.00 78.05           N  
+ATOM    762  C4    G A  35      58.645  67.280   2.825  1.00 78.58           C  
+ATOM    763  P     A A  36      56.302  64.840   8.264  1.00 76.30           P  
+ATOM    764  OP1   A A  36      54.975  64.874   8.942  1.00 75.67           O  
+ATOM    765  OP2   A A  36      57.180  66.045   8.282  1.00 77.08           O  
+ATOM    766  O5'   A A  36      57.155  63.624   8.842  1.00 72.20           O  
+ATOM    767  C5'   A A  36      56.630  62.304   8.880  1.00 69.65           C  
+ATOM    768  C4'   A A  36      57.735  61.338   9.196  1.00 67.97           C  
+ATOM    769  O4'   A A  36      58.775  61.499   8.202  1.00 68.85           O  
+ATOM    770  C3'   A A  36      58.432  61.569  10.525  1.00 67.41           C  
+ATOM    771  O3'   A A  36      57.747  60.830  11.524  1.00 67.02           O  
+ATOM    772  C2'   A A  36      59.815  60.974  10.276  1.00 67.37           C  
+ATOM    773  O2'   A A  36      59.886  59.573  10.441  1.00 66.90           O  
+ATOM    774  C1'   A A  36      60.045  61.341   8.808  1.00 67.53           C  
+ATOM    775  N9    A A  36      60.752  62.600   8.641  1.00 66.76           N  
+ATOM    776  C8    A A  36      60.375  63.652   7.852  1.00 67.45           C  
+ATOM    777  N7    A A  36      61.191  64.671   7.908  1.00 66.96           N  
+ATOM    778  C5    A A  36      62.172  64.259   8.794  1.00 66.08           C  
+ATOM    779  C6    A A  36      63.311  64.889   9.276  1.00 66.19           C  
+ATOM    780  N6    A A  36      63.665  66.125   8.928  1.00 67.40           N  
+ATOM    781  N1    A A  36      64.087  64.205  10.142  1.00 66.85           N  
+ATOM    782  C2    A A  36      63.716  62.966  10.495  1.00 66.08           C  
+ATOM    783  N3    A A  36      62.657  62.268  10.111  1.00 65.19           N  
+ATOM    784  C4    A A  36      61.917  62.982   9.248  1.00 65.98           C  
+ATOM    785  P     A A  37      57.509  61.470  12.975  1.00 68.44           P  
+ATOM    786  OP1   A A  37      56.864  60.414  13.806  1.00 68.71           O  
+ATOM    787  OP2   A A  37      56.818  62.771  12.773  1.00 66.15           O  
+ATOM    788  O5'   A A  37      58.982  61.698  13.553  1.00 69.51           O  
+ATOM    789  C5'   A A  37      59.702  60.597  14.106  1.00 72.39           C  
+ATOM    790  C4'   A A  37      61.083  61.004  14.590  1.00 73.88           C  
+ATOM    791  O4'   A A  37      61.842  61.585  13.493  1.00 74.64           O  
+ATOM    792  C3'   A A  37      61.133  62.080  15.665  1.00 75.34           C  
+ATOM    793  O3'   A A  37      60.948  61.522  16.963  1.00 77.76           O  
+ATOM    794  C2'   A A  37      62.544  62.635  15.506  1.00 74.93           C  
+ATOM    795  O2'   A A  37      63.525  61.813  16.108  1.00 73.93           O  
+ATOM    796  C1'   A A  37      62.730  62.569  13.995  1.00 75.06           C  
+ATOM    797  N9    A A  37      62.515  63.833  13.299  1.00 76.44           N  
+ATOM    798  C8    A A  37      61.475  64.214  12.492  1.00 77.47           C  
+ATOM    799  N7    A A  37      61.604  65.421  12.002  1.00 77.88           N  
+ATOM    800  C5    A A  37      62.808  65.868  12.528  1.00 78.70           C  
+ATOM    801  C6    A A  37      63.516  67.076  12.386  1.00 79.68           C  
+ATOM    802  N6    A A  37      63.093  68.103  11.641  1.00 80.75           N  
+ATOM    803  N1    A A  37      64.689  67.195  13.045  1.00 80.31           N  
+ATOM    804  C2    A A  37      65.112  66.167  13.792  1.00 80.01           C  
+ATOM    805  N3    A A  37      64.538  64.987  14.002  1.00 79.09           N  
+ATOM    806  C4    A A  37      63.376  64.900  13.332  1.00 78.07           C  
+ATOM    807  P     A A  38      60.393  62.448  18.155  1.00 79.26           P  
+ATOM    808  OP1   A A  38      60.704  61.769  19.430  1.00 80.61           O  
+ATOM    809  OP2   A A  38      58.991  62.817  17.844  1.00 79.34           O  
+ATOM    810  O5'   A A  38      61.291  63.760  18.070  1.00 79.38           O  
+ATOM    811  C5'   A A  38      62.553  63.820  18.730  1.00 81.15           C  
+ATOM    812  C4'   A A  38      63.073  65.228  18.704  1.00 81.79           C  
+ATOM    813  O4'   A A  38      63.352  65.593  17.331  1.00 81.63           O  
+ATOM    814  C3'   A A  38      62.094  66.283  19.177  1.00 82.49           C  
+ATOM    815  O3'   A A  38      62.076  66.412  20.583  1.00 84.40           O  
+ATOM    816  C2'   A A  38      62.616  67.524  18.479  1.00 82.22           C  
+ATOM    817  O2'   A A  38      63.767  68.030  19.123  1.00 83.01           O  
+ATOM    818  C1'   A A  38      62.993  66.945  17.115  1.00 80.98           C  
+ATOM    819  N9    A A  38      61.822  66.947  16.243  1.00 78.84           N  
+ATOM    820  C8    A A  38      60.905  65.942  16.088  1.00 78.39           C  
+ATOM    821  N7    A A  38      59.915  66.249  15.289  1.00 77.70           N  
+ATOM    822  C5    A A  38      60.210  67.540  14.875  1.00 77.24           C  
+ATOM    823  C6    A A  38      59.546  68.437  14.018  1.00 77.01           C  
+ATOM    824  N6    A A  38      58.390  68.170  13.407  1.00 76.37           N  
+ATOM    825  N1    A A  38      60.117  69.640  13.812  1.00 77.26           N  
+ATOM    826  C2    A A  38      61.268  69.918  14.433  1.00 77.25           C  
+ATOM    827  N3    A A  38      61.981  69.165  15.263  1.00 77.22           N  
+ATOM    828  C4    A A  38      61.391  67.974  15.444  1.00 77.56           C  
+ATOM    829  P     C A  39      60.743  66.942  21.298  1.00 86.61           P  
+ATOM    830  OP1   C A  39      60.919  66.819  22.766  1.00 87.75           O  
+ATOM    831  OP2   C A  39      59.580  66.302  20.641  1.00 86.54           O  
+ATOM    832  O5'   C A  39      60.712  68.487  20.936  1.00 86.18           O  
+ATOM    833  C5'   C A  39      61.720  69.347  21.428  1.00 85.71           C  
+ATOM    834  C4'   C A  39      61.518  70.740  20.903  1.00 86.21           C  
+ATOM    835  O4'   C A  39      61.657  70.721  19.457  1.00 85.21           O  
+ATOM    836  C3'   C A  39      60.124  71.312  21.113  1.00 86.52           C  
+ATOM    837  O3'   C A  39      59.927  71.874  22.399  1.00 87.69           O  
+ATOM    838  C2'   C A  39      60.063  72.379  20.039  1.00 86.39           C  
+ATOM    839  O2'   C A  39      60.788  73.527  20.422  1.00 87.59           O  
+ATOM    840  C1'   C A  39      60.782  71.680  18.888  1.00 85.69           C  
+ATOM    841  N1    C A  39      59.790  71.009  18.040  1.00 85.17           N  
+ATOM    842  C2    C A  39      59.112  71.781  17.103  1.00 85.98           C  
+ATOM    843  O2    C A  39      59.424  72.977  16.983  1.00 88.51           O  
+ATOM    844  N3    C A  39      58.140  71.218  16.353  1.00 85.49           N  
+ATOM    845  C4    C A  39      57.847  69.928  16.510  1.00 84.91           C  
+ATOM    846  N4    C A  39      56.868  69.416  15.759  1.00 84.63           N  
+ATOM    847  C5    C A  39      58.543  69.105  17.445  1.00 84.88           C  
+ATOM    848  C6    C A  39      59.503  69.681  18.179  1.00 84.74           C  
+ATOM    849  P     C A  40      58.440  71.960  23.004  1.00 87.52           P  
+ATOM    850  OP1   C A  40      58.530  72.443  24.403  1.00 87.13           O  
+ATOM    851  OP2   C A  40      57.789  70.663  22.722  1.00 88.65           O  
+ATOM    852  O5'   C A  40      57.724  73.076  22.125  1.00 87.10           O  
+ATOM    853  C5'   C A  40      58.160  74.423  22.184  1.00 87.69           C  
+ATOM    854  C4'   C A  40      57.305  75.294  21.301  1.00 88.35           C  
+ATOM    855  O4'   C A  40      57.424  74.836  19.927  1.00 88.43           O  
+ATOM    856  C3'   C A  40      55.811  75.229  21.578  1.00 89.15           C  
+ATOM    857  O3'   C A  40      55.427  76.080  22.652  1.00 89.80           O  
+ATOM    858  C2'   C A  40      55.221  75.672  20.247  1.00 89.22           C  
+ATOM    859  O2'   C A  40      55.242  77.071  20.063  1.00 90.74           O  
+ATOM    860  C1'   C A  40      56.184  75.016  19.259  1.00 89.11           C  
+ATOM    861  N1    C A  40      55.680  73.714  18.791  1.00 89.08           N  
+ATOM    862  C2    C A  40      54.720  73.712  17.784  1.00 88.89           C  
+ATOM    863  O2    C A  40      54.357  74.800  17.312  1.00 88.07           O  
+ATOM    864  N3    C A  40      54.214  72.537  17.349  1.00 88.17           N  
+ATOM    865  C4    C A  40      54.640  71.394  17.881  1.00 87.25           C  
+ATOM    866  N4    C A  40      54.111  70.259  17.420  1.00 86.84           N  
+ATOM    867  C5    C A  40      55.627  71.365  18.910  1.00 87.49           C  
+ATOM    868  C6    C A  40      56.118  72.537  19.329  1.00 88.37           C  
+ATOM    869  P     C A  41      54.296  75.590  23.687  1.00 91.70           P  
+ATOM    870  OP1   C A  41      54.317  76.506  24.848  1.00 92.23           O  
+ATOM    871  OP2   C A  41      54.484  74.132  23.905  1.00 92.16           O  
+ATOM    872  O5'   C A  41      52.921  75.809  22.911  1.00 89.93           O  
+ATOM    873  C5'   C A  41      52.470  77.118  22.601  1.00 89.57           C  
+ATOM    874  C4'   C A  41      51.643  77.101  21.344  1.00 89.19           C  
+ATOM    875  O4'   C A  41      52.410  76.440  20.301  1.00 89.84           O  
+ATOM    876  C3'   C A  41      50.360  76.288  21.406  1.00 88.65           C  
+ATOM    877  O3'   C A  41      49.269  76.984  21.992  1.00 87.24           O  
+ATOM    878  C2'   C A  41      50.117  75.978  19.940  1.00 89.20           C  
+ATOM    879  O2'   C A  41      49.606  77.084  19.234  1.00 90.10           O  
+ATOM    880  C1'   C A  41      51.538  75.698  19.463  1.00 89.86           C  
+ATOM    881  N1    C A  41      51.817  74.263  19.619  1.00 90.67           N  
+ATOM    882  C2    C A  41      51.094  73.376  18.829  1.00 90.46           C  
+ATOM    883  O2    C A  41      50.292  73.835  18.017  1.00 90.97           O  
+ATOM    884  N3    C A  41      51.280  72.049  18.972  1.00 90.17           N  
+ATOM    885  C4    C A  41      52.155  71.592  19.865  1.00 91.13           C  
+ATOM    886  N4    C A  41      52.292  70.264  19.975  1.00 91.98           N  
+ATOM    887  C5    C A  41      52.927  72.476  20.683  1.00 91.06           C  
+ATOM    888  C6    C A  41      52.730  73.795  20.523  1.00 90.74           C  
+ATOM    889  P     G A  42      48.270  76.196  22.975  1.00 87.44           P  
+ATOM    890  OP1   G A  42      47.291  77.141  23.567  1.00 89.10           O  
+ATOM    891  OP2   G A  42      49.134  75.380  23.871  1.00 88.78           O  
+ATOM    892  O5'   G A  42      47.474  75.205  22.013  1.00 86.64           O  
+ATOM    893  C5'   G A  42      46.541  75.702  21.061  1.00 83.77           C  
+ATOM    894  C4'   G A  42      45.922  74.562  20.279  1.00 82.63           C  
+ATOM    895  O4'   G A  42      46.960  73.869  19.533  1.00 81.47           O  
+ATOM    896  C3'   G A  42      45.236  73.476  21.096  1.00 81.18           C  
+ATOM    897  O3'   G A  42      43.883  73.838  21.383  1.00 79.00           O  
+ATOM    898  C2'   G A  42      45.304  72.282  20.150  1.00 81.50           C  
+ATOM    899  O2'   G A  42      44.294  72.313  19.164  1.00 82.78           O  
+ATOM    900  C1'   G A  42      46.671  72.484  19.489  1.00 81.61           C  
+ATOM    901  N9    G A  42      47.741  71.774  20.181  1.00 81.64           N  
+ATOM    902  C8    G A  42      48.763  72.326  20.911  1.00 81.07           C  
+ATOM    903  N7    G A  42      49.539  71.435  21.463  1.00 81.18           N  
+ATOM    904  C5    G A  42      49.003  70.221  21.061  1.00 81.25           C  
+ATOM    905  C6    G A  42      49.410  68.898  21.358  1.00 81.50           C  
+ATOM    906  O6    G A  42      50.354  68.526  22.067  1.00 81.74           O  
+ATOM    907  N1    G A  42      48.589  67.959  20.740  1.00 81.55           N  
+ATOM    908  C2    G A  42      47.512  68.257  19.943  1.00 81.83           C  
+ATOM    909  N2    G A  42      46.847  67.214  19.438  1.00 82.10           N  
+ATOM    910  N3    G A  42      47.119  69.488  19.664  1.00 81.24           N  
+ATOM    911  C4    G A  42      47.904  70.414  20.254  1.00 81.41           C  
+ATOM    912  P     G A  43      43.122  73.181  22.637  1.00 79.16           P  
+ATOM    913  OP1   G A  43      41.728  73.681  22.656  1.00 80.54           O  
+ATOM    914  OP2   G A  43      43.981  73.361  23.831  1.00 80.58           O  
+ATOM    915  O5'   G A  43      43.054  71.627  22.294  1.00 78.89           O  
+ATOM    916  C5'   G A  43      42.267  71.158  21.205  1.00 76.22           C  
+ATOM    917  C4'   G A  43      42.432  69.665  21.035  1.00 73.95           C  
+ATOM    918  O4'   G A  43      43.825  69.361  20.731  1.00 73.16           O  
+ATOM    919  C3'   G A  43      42.147  68.845  22.284  1.00 72.25           C  
+ATOM    920  O3'   G A  43      40.760  68.556  22.410  1.00 70.37           O  
+ATOM    921  C2'   G A  43      42.934  67.568  22.021  1.00 72.79           C  
+ATOM    922  O2'   G A  43      42.252  66.676  21.167  1.00 72.66           O  
+ATOM    923  C1'   G A  43      44.169  68.108  21.301  1.00 73.72           C  
+ATOM    924  N9    G A  43      45.326  68.263  22.176  1.00 74.90           N  
+ATOM    925  C8    G A  43      45.959  69.425  22.531  1.00 75.68           C  
+ATOM    926  N7    G A  43      46.978  69.231  23.326  1.00 76.53           N  
+ATOM    927  C5    G A  43      47.014  67.856  23.511  1.00 76.40           C  
+ATOM    928  C6    G A  43      47.904  67.046  24.278  1.00 77.11           C  
+ATOM    929  O6    G A  43      48.872  67.395  24.964  1.00 77.75           O  
+ATOM    930  N1    G A  43      47.576  65.697  24.188  1.00 77.74           N  
+ATOM    931  C2    G A  43      46.535  65.187  23.456  1.00 77.07           C  
+ATOM    932  N2    G A  43      46.377  63.863  23.507  1.00 75.92           N  
+ATOM    933  N3    G A  43      45.705  65.927  22.731  1.00 77.52           N  
+ATOM    934  C4    G A  43      46.002  67.244  22.807  1.00 76.21           C  
+ATOM    935  P     C A  44      40.195  67.977  23.797  1.00 69.28           P  
+ATOM    936  OP1   C A  44      38.714  67.902  23.774  1.00 70.40           O  
+ATOM    937  OP2   C A  44      40.874  68.768  24.857  1.00 71.31           O  
+ATOM    938  O5'   C A  44      40.754  66.488  23.872  1.00 68.86           O  
+ATOM    939  C5'   C A  44      40.391  65.506  22.905  1.00 66.43           C  
+ATOM    940  C4'   C A  44      41.060  64.188  23.236  1.00 63.86           C  
+ATOM    941  O4'   C A  44      42.501  64.360  23.212  1.00 61.55           O  
+ATOM    942  C3'   C A  44      40.764  63.664  24.631  1.00 62.52           C  
+ATOM    943  O3'   C A  44      39.610  62.844  24.610  1.00 63.93           O  
+ATOM    944  C2'   C A  44      41.970  62.790  24.921  1.00 61.24           C  
+ATOM    945  O2'   C A  44      41.822  61.512  24.348  1.00 60.87           O  
+ATOM    946  C1'   C A  44      43.089  63.572  24.232  1.00 60.02           C  
+ATOM    947  N1    C A  44      43.846  64.470  25.117  1.00 57.66           N  
+ATOM    948  C2    C A  44      44.654  63.921  26.119  1.00 56.64           C  
+ATOM    949  O2    C A  44      44.654  62.698  26.294  1.00 55.06           O  
+ATOM    950  N3    C A  44      45.410  64.740  26.872  1.00 56.82           N  
+ATOM    951  C4    C A  44      45.372  66.056  26.665  1.00 57.91           C  
+ATOM    952  N4    C A  44      46.153  66.830  27.420  1.00 58.97           N  
+ATOM    953  C5    C A  44      44.533  66.641  25.676  1.00 57.75           C  
+ATOM    954  C6    C A  44      43.788  65.821  24.938  1.00 57.21           C  
+ATOM    955  P     A A  45      38.915  62.435  25.990  1.00 67.24           P  
+ATOM    956  OP1   A A  45      37.920  61.357  25.739  1.00 66.87           O  
+ATOM    957  OP2   A A  45      38.473  63.720  26.574  1.00 68.09           O  
+ATOM    958  O5'   A A  45      40.101  61.855  26.886  1.00 64.88           O  
+ATOM    959  C5'   A A  45      40.493  60.486  26.806  1.00 61.73           C  
+ATOM    960  C4'   A A  45      41.533  60.188  27.856  1.00 60.43           C  
+ATOM    961  O4'   A A  45      42.672  61.053  27.651  1.00 58.62           O  
+ATOM    962  C3'   A A  45      41.106  60.425  29.294  1.00 60.22           C  
+ATOM    963  O3'   A A  45      40.583  59.206  29.787  1.00 62.36           O  
+ATOM    964  C2'   A A  45      42.432  60.692  29.984  1.00 58.55           C  
+ATOM    965  O2'   A A  45      43.085  59.476  30.257  1.00 60.38           O  
+ATOM    966  C1'   A A  45      43.194  61.456  28.902  1.00 57.88           C  
+ATOM    967  N9    A A  45      43.076  62.911  28.943  1.00 57.39           N  
+ATOM    968  C8    A A  45      42.160  63.673  28.261  1.00 56.72           C  
+ATOM    969  N7    A A  45      42.351  64.962  28.378  1.00 55.38           N  
+ATOM    970  C5    A A  45      43.445  65.058  29.218  1.00 55.87           C  
+ATOM    971  C6    A A  45      44.141  66.154  29.716  1.00 56.96           C  
+ATOM    972  N6    A A  45      43.820  67.421  29.438  1.00 57.41           N  
+ATOM    973  N1    A A  45      45.196  65.909  30.525  1.00 57.38           N  
+ATOM    974  C2    A A  45      45.510  64.636  30.807  1.00 56.39           C  
+ATOM    975  N3    A A  45      44.925  63.522  30.402  1.00 56.23           N  
+ATOM    976  C4    A A  45      43.888  63.803  29.596  1.00 56.50           C  
+ATOM    977  P     A A  46      39.689  59.199  31.111  1.00 66.16           P  
+ATOM    978  OP1   A A  46      39.133  57.830  31.270  1.00 64.50           O  
+ATOM    979  OP2   A A  46      38.779  60.365  30.994  1.00 65.42           O  
+ATOM    980  O5'   A A  46      40.701  59.506  32.306  1.00 67.24           O  
+ATOM    981  C5'   A A  46      41.462  58.484  32.965  1.00 66.66           C  
+ATOM    982  C4'   A A  46      42.341  59.140  34.004  1.00 66.99           C  
+ATOM    983  O4'   A A  46      43.028  60.224  33.349  1.00 67.35           O  
+ATOM    984  C3'   A A  46      41.625  59.765  35.195  1.00 67.72           C  
+ATOM    985  O3'   A A  46      41.669  58.959  36.376  1.00 68.21           O  
+ATOM    986  C2'   A A  46      42.564  60.890  35.577  1.00 69.03           C  
+ATOM    987  O2'   A A  46      43.607  60.394  36.401  1.00 72.13           O  
+ATOM    988  C1'   A A  46      43.082  61.336  34.209  1.00 66.39           C  
+ATOM    989  N9    A A  46      42.276  62.348  33.564  1.00 62.89           N  
+ATOM    990  C8    A A  46      41.084  62.169  32.918  1.00 62.52           C  
+ATOM    991  N7    A A  46      40.653  63.243  32.308  1.00 62.67           N  
+ATOM    992  C5    A A  46      41.614  64.200  32.605  1.00 62.01           C  
+ATOM    993  C6    A A  46      41.747  65.544  32.251  1.00 61.96           C  
+ATOM    994  N6    A A  46      40.877  66.192  31.482  1.00 64.57           N  
+ATOM    995  N1    A A  46      42.823  66.214  32.714  1.00 62.07           N  
+ATOM    996  C2    A A  46      43.697  65.565  33.480  1.00 62.26           C  
+ATOM    997  N3    A A  46      43.684  64.298  33.881  1.00 63.14           N  
+ATOM    998  C4    A A  46      42.603  63.665  33.400  1.00 62.84           C  
+ATOM    999  P     C A  47      42.413  57.528  36.388  1.00 67.72           P  
+ATOM   1000  OP1   C A  47      42.629  56.988  35.028  1.00 70.69           O  
+ATOM   1001  OP2   C A  47      41.663  56.714  37.372  1.00 70.77           O  
+ATOM   1002  O5'   C A  47      43.856  57.748  37.034  1.00 64.73           O  
+ATOM   1003  C5'   C A  47      44.558  56.596  37.540  1.00 62.38           C  
+ATOM   1004  C4'   C A  47      46.022  56.881  37.836  1.00 60.75           C  
+ATOM   1005  O4'   C A  47      46.726  57.283  36.632  1.00 57.34           O  
+ATOM   1006  C3'   C A  47      46.301  58.002  38.819  1.00 61.65           C  
+ATOM   1007  O3'   C A  47      46.215  57.517  40.147  1.00 66.33           O  
+ATOM   1008  C2'   C A  47      47.730  58.398  38.472  1.00 58.98           C  
+ATOM   1009  O2'   C A  47      48.710  57.539  39.015  1.00 59.79           O  
+ATOM   1010  C1'   C A  47      47.729  58.226  36.961  1.00 56.15           C  
+ATOM   1011  N1    C A  47      47.460  59.483  36.270  1.00 52.42           N  
+ATOM   1012  C2    C A  47      48.401  60.504  36.371  1.00 52.13           C  
+ATOM   1013  O2    C A  47      49.423  60.304  37.044  1.00 51.95           O  
+ATOM   1014  N3    C A  47      48.179  61.672  35.738  1.00 50.89           N  
+ATOM   1015  C4    C A  47      47.062  61.832  35.031  1.00 51.44           C  
+ATOM   1016  N4    C A  47      46.861  62.994  34.431  1.00 52.10           N  
+ATOM   1017  C5    C A  47      46.091  60.804  34.911  1.00 51.28           C  
+ATOM   1018  C6    C A  47      46.326  59.658  35.541  1.00 51.11           C  
+ATOM   1019  P     C A  48      45.766  58.513  41.317  1.00 69.35           P  
+ATOM   1020  OP1   C A  48      45.485  57.695  42.529  1.00 67.22           O  
+ATOM   1021  OP2   C A  48      44.703  59.395  40.751  1.00 67.82           O  
+ATOM   1022  O5'   C A  48      47.058  59.411  41.569  1.00 67.80           O  
+ATOM   1023  C5'   C A  48      48.244  58.859  42.135  1.00 66.18           C  
+ATOM   1024  C4'   C A  48      49.242  59.962  42.373  1.00 65.53           C  
+ATOM   1025  O4'   C A  48      49.635  60.527  41.099  1.00 62.77           O  
+ATOM   1026  C3'   C A  48      48.679  61.145  43.136  1.00 66.13           C  
+ATOM   1027  O3'   C A  48      48.741  60.923  44.527  1.00 71.49           O  
+ATOM   1028  C2'   C A  48      49.582  62.286  42.698  1.00 63.22           C  
+ATOM   1029  O2'   C A  48      50.818  62.332  43.383  1.00 63.14           O  
+ATOM   1030  C1'   C A  48      49.807  61.927  41.231  1.00 60.44           C  
+ATOM   1031  N1    C A  48      48.843  62.587  40.347  1.00 55.14           N  
+ATOM   1032  C2    C A  48      49.088  63.893  39.966  1.00 54.49           C  
+ATOM   1033  O2    C A  48      50.090  64.465  40.414  1.00 55.34           O  
+ATOM   1034  N3    C A  48      48.233  64.509  39.125  1.00 52.59           N  
+ATOM   1035  C4    C A  48      47.161  63.865  38.679  1.00 51.17           C  
+ATOM   1036  N4    C A  48      46.362  64.510  37.843  1.00 50.44           N  
+ATOM   1037  C5    C A  48      46.871  62.531  39.070  1.00 52.11           C  
+ATOM   1038  C6    C A  48      47.732  61.933  39.898  1.00 54.08           C  
+ATOM   1039  P     A A  49      47.654  61.613  45.471  1.00 74.04           P  
+ATOM   1040  OP1   A A  49      47.893  61.129  46.859  1.00 75.80           O  
+ATOM   1041  OP2   A A  49      46.338  61.389  44.821  1.00 75.26           O  
+ATOM   1042  O5'   A A  49      48.017  63.156  45.395  1.00 72.61           O  
+ATOM   1043  C5'   A A  49      49.222  63.621  45.964  1.00 73.43           C  
+ATOM   1044  C4'   A A  49      49.383  65.087  45.696  1.00 74.37           C  
+ATOM   1045  O4'   A A  49      49.425  65.301  44.263  1.00 73.83           O  
+ATOM   1046  C3'   A A  49      48.229  65.975  46.115  1.00 76.55           C  
+ATOM   1047  O3'   A A  49      48.233  66.240  47.513  1.00 80.22           O  
+ATOM   1048  C2'   A A  49      48.525  67.223  45.299  1.00 75.25           C  
+ATOM   1049  O2'   A A  49      49.601  67.966  45.824  1.00 76.33           O  
+ATOM   1050  C1'   A A  49      48.953  66.608  43.969  1.00 73.01           C  
+ATOM   1051  N9    A A  49      47.835  66.511  43.031  1.00 71.22           N  
+ATOM   1052  C8    A A  49      47.031  65.426  42.781  1.00 71.73           C  
+ATOM   1053  N7    A A  49      46.081  65.663  41.907  1.00 70.51           N  
+ATOM   1054  C5    A A  49      46.280  66.989  41.550  1.00 69.33           C  
+ATOM   1055  C6    A A  49      45.599  67.839  40.664  1.00 69.09           C  
+ATOM   1056  N6    A A  49      44.545  67.453  39.944  1.00 69.34           N  
+ATOM   1057  N1    A A  49      46.044  69.110  40.540  1.00 69.39           N  
+ATOM   1058  C2    A A  49      47.106  69.484  41.260  1.00 70.23           C  
+ATOM   1059  N3    A A  49      47.833  68.775  42.123  1.00 70.98           N  
+ATOM   1060  C4    A A  49      47.360  67.522  42.226  1.00 69.91           C  
+ATOM   1061  P     G A  50      46.846  66.209  48.339  1.00 82.72           P  
+ATOM   1062  OP1   G A  50      47.164  66.087  49.785  1.00 82.86           O  
+ATOM   1063  OP2   G A  50      45.964  65.198  47.703  1.00 81.94           O  
+ATOM   1064  O5'   G A  50      46.219  67.654  48.091  1.00 81.41           O  
+ATOM   1065  C5'   G A  50      45.935  68.105  46.777  1.00 84.37           C  
+ATOM   1066  C4'   G A  50      45.652  69.584  46.784  1.00 86.37           C  
+ATOM   1067  O4'   G A  50      45.672  70.042  45.399  1.00 85.92           O  
+ATOM   1068  C3'   G A  50      44.276  69.971  47.302  1.00 88.18           C  
+ATOM   1069  O3'   G A  50      43.942  70.325  48.632  1.00 92.03           O  
+ATOM   1070  C2'   G A  50      43.367  70.206  46.117  1.00 86.73           C  
+ATOM   1071  O2'   G A  50      42.687  71.428  46.274  1.00 86.89           O  
+ATOM   1072  C1'   G A  50      44.351  70.323  44.948  1.00 84.88           C  
+ATOM   1073  N9    G A  50      43.925  69.272  44.029  1.00 81.15           N  
+ATOM   1074  C8    G A  50      44.114  67.917  44.173  1.00 79.88           C  
+ATOM   1075  N7    G A  50      43.441  67.213  43.306  1.00 79.00           N  
+ATOM   1076  C5    G A  50      42.810  68.160  42.516  1.00 78.27           C  
+ATOM   1077  C6    G A  50      41.925  67.995  41.442  1.00 78.52           C  
+ATOM   1078  O6    G A  50      41.491  66.941  40.959  1.00 78.22           O  
+ATOM   1079  N1    G A  50      41.521  69.220  40.921  1.00 78.77           N  
+ATOM   1080  C2    G A  50      41.922  70.445  41.387  1.00 78.84           C  
+ATOM   1081  N2    G A  50      41.425  71.512  40.756  1.00 79.59           N  
+ATOM   1082  N3    G A  50      42.748  70.610  42.398  1.00 78.54           N  
+ATOM   1083  C4    G A  50      43.143  69.435  42.917  1.00 78.68           C  
+ATOM   1084  P     A A  51      42.880  69.415  49.453  1.00 96.02           P  
+ATOM   1085  OP1   A A  51      42.446  70.195  50.660  1.00 95.76           O  
+ATOM   1086  OP2   A A  51      43.467  68.046  49.625  1.00 96.17           O  
+ATOM   1087  O5'   A A  51      41.609  69.253  48.500  1.00 94.71           O  
+ATOM   1088  C5'   A A  51      40.743  68.118  48.626  1.00 93.44           C  
+ATOM   1089  C4'   A A  51      39.313  68.526  48.358  1.00 92.36           C  
+ATOM   1090  O4'   A A  51      38.931  69.502  49.358  1.00 90.16           O  
+ATOM   1091  C3'   A A  51      39.090  69.216  47.018  1.00 92.54           C  
+ATOM   1092  O3'   A A  51      38.742  68.280  46.002  1.00 96.31           O  
+ATOM   1093  C2'   A A  51      37.939  70.159  47.316  1.00 90.20           C  
+ATOM   1094  O2'   A A  51      36.698  69.487  47.304  1.00 89.63           O  
+ATOM   1095  C1'   A A  51      38.293  70.602  48.737  1.00 86.88           C  
+ATOM   1096  N9    A A  51      39.245  71.707  48.758  1.00 82.36           N  
+ATOM   1097  C8    A A  51      40.528  71.680  49.247  1.00 80.40           C  
+ATOM   1098  N7    A A  51      41.164  72.817  49.124  1.00 78.33           N  
+ATOM   1099  C5    A A  51      40.236  73.652  48.517  1.00 77.49           C  
+ATOM   1100  C6    A A  51      40.296  74.995  48.117  1.00 75.83           C  
+ATOM   1101  N6    A A  51      41.375  75.764  48.279  1.00 75.08           N  
+ATOM   1102  N1    A A  51      39.199  75.530  47.539  1.00 76.02           N  
+ATOM   1103  C2    A A  51      38.118  74.757  47.382  1.00 77.71           C  
+ATOM   1104  N3    A A  51      37.939  73.479  47.718  1.00 78.31           N  
+ATOM   1105  C4    A A  51      39.049  72.981  48.287  1.00 79.42           C  
+ATOM   1106  P     A A  52      39.515  68.317  44.596  1.00 97.90           P  
+ATOM   1107  OP1   A A  52      39.960  66.929  44.294  1.00 98.51           O  
+ATOM   1108  OP2   A A  52      40.520  69.410  44.687  1.00 97.41           O  
+ATOM   1109  O5'   A A  52      38.395  68.749  43.546  1.00 98.75           O  
+ATOM   1110  C5'   A A  52      38.737  69.495  42.378  1.00100.86           C  
+ATOM   1111  C4'   A A  52      37.985  70.804  42.367  1.00101.84           C  
+ATOM   1112  O4'   A A  52      38.002  71.359  43.705  1.00100.72           O  
+ATOM   1113  C3'   A A  52      38.535  71.905  41.465  1.00102.80           C  
+ATOM   1114  O3'   A A  52      37.991  71.808  40.147  1.00105.83           O  
+ATOM   1115  C2'   A A  52      38.020  73.163  42.155  1.00101.22           C  
+ATOM   1116  O2'   A A  52      36.680  73.455  41.831  1.00102.17           O  
+ATOM   1117  C1'   A A  52      38.111  72.767  43.631  1.00 99.83           C  
+ATOM   1118  N9    A A  52      39.367  73.140  44.269  1.00 97.90           N  
+ATOM   1119  C8    A A  52      40.197  72.318  44.981  1.00 96.81           C  
+ATOM   1120  N7    A A  52      41.251  72.923  45.460  1.00 96.75           N  
+ATOM   1121  C5    A A  52      41.110  74.232  45.031  1.00 96.25           C  
+ATOM   1122  C6    A A  52      41.900  75.370  45.216  1.00 95.31           C  
+ATOM   1123  N6    A A  52      43.037  75.365  45.910  1.00 94.72           N  
+ATOM   1124  N1    A A  52      41.481  76.527  44.657  1.00 95.37           N  
+ATOM   1125  C2    A A  52      40.338  76.521  43.962  1.00 96.12           C  
+ATOM   1126  N3    A A  52      39.505  75.511  43.719  1.00 96.85           N  
+ATOM   1127  C4    A A  52      39.955  74.381  44.291  1.00 97.01           C  
+ATOM   1128  P     A A  53      38.666  72.624  38.930  1.00108.87           P  
+ATOM   1129  OP1   A A  53      37.810  72.491  37.721  1.00108.36           O  
+ATOM   1130  OP2   A A  53      40.093  72.223  38.866  1.00109.37           O  
+ATOM   1131  O5'   A A  53      38.606  74.150  39.369  1.00107.46           O  
+ATOM   1132  C5'   A A  53      38.058  75.137  38.499  1.00107.85           C  
+ATOM   1133  C4'   A A  53      38.929  76.365  38.509  1.00108.27           C  
+ATOM   1134  O4'   A A  53      39.209  76.699  39.891  1.00108.81           O  
+ATOM   1135  C3'   A A  53      40.298  76.243  37.854  1.00108.40           C  
+ATOM   1136  O3'   A A  53      40.239  76.517  36.456  1.00107.76           O  
+ATOM   1137  C2'   A A  53      41.086  77.317  38.590  1.00108.67           C  
+ATOM   1138  O2'   A A  53      40.806  78.618  38.112  1.00108.67           O  
+ATOM   1139  C1'   A A  53      40.542  77.152  40.011  1.00109.27           C  
+ATOM   1140  N9    A A  53      41.277  76.108  40.718  1.00109.89           N  
+ATOM   1141  C8    A A  53      41.033  74.758  40.673  1.00110.42           C  
+ATOM   1142  N7    A A  53      41.870  74.045  41.382  1.00110.63           N  
+ATOM   1143  C5    A A  53      42.720  74.990  41.938  1.00110.94           C  
+ATOM   1144  C6    A A  53      43.826  74.875  42.795  1.00111.51           C  
+ATOM   1145  N6    A A  53      44.285  73.710  43.257  1.00112.10           N  
+ATOM   1146  N1    A A  53      44.452  76.014  43.167  1.00111.76           N  
+ATOM   1147  C2    A A  53      43.988  77.184  42.703  1.00111.34           C  
+ATOM   1148  N3    A A  53      42.958  77.419  41.892  1.00110.90           N  
+ATOM   1149  C4    A A  53      42.361  76.266  41.542  1.00110.47           C  
+ATOM   1150  P     U A  54      40.720  75.399  35.403  1.00107.30           P  
+ATOM   1151  OP1   U A  54      40.655  75.985  34.040  1.00107.24           O  
+ATOM   1152  OP2   U A  54      39.952  74.165  35.708  1.00107.10           O  
+ATOM   1153  O5'   U A  54      42.250  75.138  35.772  1.00104.79           O  
+ATOM   1154  C5'   U A  54      43.228  76.148  35.560  1.00101.43           C  
+ATOM   1155  C4'   U A  54      44.377  75.983  36.522  1.00 99.06           C  
+ATOM   1156  O4'   U A  54      43.865  75.376  37.739  1.00 98.18           O  
+ATOM   1157  C3'   U A  54      45.481  75.031  36.092  1.00 98.11           C  
+ATOM   1158  O3'   U A  54      46.453  75.676  35.281  1.00 97.57           O  
+ATOM   1159  C2'   U A  54      46.093  74.631  37.424  1.00 97.54           C  
+ATOM   1160  O2'   U A  54      46.934  75.633  37.945  1.00 98.55           O  
+ATOM   1161  C1'   U A  54      44.850  74.523  38.300  1.00 96.75           C  
+ATOM   1162  N1    U A  54      44.348  73.146  38.309  1.00 95.04           N  
+ATOM   1163  C2    U A  54      44.996  72.251  39.131  1.00 93.99           C  
+ATOM   1164  O2    U A  54      45.921  72.575  39.851  1.00 94.77           O  
+ATOM   1165  N3    U A  54      44.524  70.966  39.077  1.00 92.33           N  
+ATOM   1166  C4    U A  54      43.489  70.502  38.302  1.00 92.24           C  
+ATOM   1167  O4    U A  54      43.181  69.316  38.357  1.00 90.91           O  
+ATOM   1168  C5    U A  54      42.859  71.495  37.488  1.00 93.43           C  
+ATOM   1169  C6    U A  54      43.298  72.754  37.521  1.00 94.21           C  
+ATOM   1170  P     G A  55      47.525  74.791  34.471  1.00 97.86           P  
+ATOM   1171  OP1   G A  55      48.367  75.702  33.647  1.00 97.40           O  
+ATOM   1172  OP2   G A  55      46.754  73.696  33.816  1.00 97.86           O  
+ATOM   1173  O5'   G A  55      48.459  74.154  35.595  1.00 93.42           O  
+ATOM   1174  C5'   G A  55      49.390  74.964  36.297  1.00 88.24           C  
+ATOM   1175  C4'   G A  55      50.177  74.134  37.278  1.00 84.14           C  
+ATOM   1176  O4'   G A  55      49.264  73.510  38.217  1.00 83.46           O  
+ATOM   1177  C3'   G A  55      50.899  72.957  36.664  1.00 82.28           C  
+ATOM   1178  O3'   G A  55      52.132  73.333  36.107  1.00 79.65           O  
+ATOM   1179  C2'   G A  55      51.068  72.020  37.846  1.00 82.45           C  
+ATOM   1180  O2'   G A  55      52.130  72.351  38.713  1.00 84.02           O  
+ATOM   1181  C1'   G A  55      49.743  72.224  38.567  1.00 82.65           C  
+ATOM   1182  N9    G A  55      48.800  71.227  38.088  1.00 81.63           N  
+ATOM   1183  C8    G A  55      47.779  71.396  37.188  1.00 81.42           C  
+ATOM   1184  N7    G A  55      47.143  70.286  36.929  1.00 81.40           N  
+ATOM   1185  C5    G A  55      47.781  69.334  37.714  1.00 79.68           C  
+ATOM   1186  C6    G A  55      47.541  67.944  37.855  1.00 79.26           C  
+ATOM   1187  O6    G A  55      46.695  67.247  37.288  1.00 77.42           O  
+ATOM   1188  N1    G A  55      48.419  67.366  38.763  1.00 79.31           N  
+ATOM   1189  C2    G A  55      49.404  68.036  39.442  1.00 79.67           C  
+ATOM   1190  N2    G A  55      50.148  67.311  40.283  1.00 79.56           N  
+ATOM   1191  N3    G A  55      49.642  69.324  39.310  1.00 79.52           N  
+ATOM   1192  C4    G A  55      48.797  69.905  38.440  1.00 80.03           C  
+ATOM   1193  P     G A  56      52.789  72.392  35.004  1.00 78.55           P  
+ATOM   1194  OP1   G A  56      54.080  72.967  34.550  1.00 77.49           O  
+ATOM   1195  OP2   G A  56      51.707  72.125  34.021  1.00 80.25           O  
+ATOM   1196  O5'   G A  56      53.090  71.050  35.801  1.00 75.12           O  
+ATOM   1197  C5'   G A  56      54.067  71.039  36.829  1.00 69.26           C  
+ATOM   1198  C4'   G A  56      54.371  69.628  37.263  1.00 65.32           C  
+ATOM   1199  O4'   G A  56      53.188  69.046  37.881  1.00 62.82           O  
+ATOM   1200  C3'   G A  56      54.686  68.665  36.136  1.00 63.79           C  
+ATOM   1201  O3'   G A  56      56.038  68.731  35.713  1.00 65.54           O  
+ATOM   1202  C2'   G A  56      54.375  67.320  36.769  1.00 62.66           C  
+ATOM   1203  O2'   G A  56      55.428  66.873  37.601  1.00 62.67           O  
+ATOM   1204  C1'   G A  56      53.141  67.657  37.609  1.00 60.08           C  
+ATOM   1205  N9    G A  56      51.901  67.352  36.905  1.00 55.37           N  
+ATOM   1206  C8    G A  56      51.122  68.217  36.174  1.00 55.74           C  
+ATOM   1207  N7    G A  56      50.106  67.629  35.599  1.00 52.72           N  
+ATOM   1208  C5    G A  56      50.214  66.302  35.990  1.00 50.91           C  
+ATOM   1209  C6    G A  56      49.406  65.204  35.675  1.00 49.97           C  
+ATOM   1210  O6    G A  56      48.416  65.180  34.958  1.00 50.77           O  
+ATOM   1211  N1    G A  56      49.854  64.038  36.284  1.00 48.77           N  
+ATOM   1212  C2    G A  56      50.958  63.951  37.093  1.00 50.36           C  
+ATOM   1213  N2    G A  56      51.234  62.732  37.591  1.00 48.97           N  
+ATOM   1214  N3    G A  56      51.734  64.983  37.392  1.00 51.51           N  
+ATOM   1215  C4    G A  56      51.304  66.118  36.809  1.00 51.89           C  
+ATOM   1216  P     U A  57      56.393  68.380  34.188  1.00 68.18           P  
+ATOM   1217  OP1   U A  57      57.633  67.563  34.126  1.00 68.19           O  
+ATOM   1218  OP2   U A  57      56.289  69.634  33.385  1.00 68.11           O  
+ATOM   1219  O5'   U A  57      55.175  67.458  33.751  1.00 66.24           O  
+ATOM   1220  C5'   U A  57      55.324  66.486  32.736  1.00 62.03           C  
+ATOM   1221  C4'   U A  57      55.340  65.129  33.360  1.00 59.74           C  
+ATOM   1222  O4'   U A  57      54.232  65.038  34.289  1.00 57.88           O  
+ATOM   1223  C3'   U A  57      55.156  63.959  32.420  1.00 58.61           C  
+ATOM   1224  O3'   U A  57      56.382  63.599  31.803  1.00 58.26           O  
+ATOM   1225  C2'   U A  57      54.620  62.895  33.370  1.00 58.38           C  
+ATOM   1226  O2'   U A  57      55.622  62.306  34.173  1.00 58.99           O  
+ATOM   1227  C1'   U A  57      53.699  63.732  34.261  1.00 56.63           C  
+ATOM   1228  N1    U A  57      52.361  63.811  33.672  1.00 55.20           N  
+ATOM   1229  C2    U A  57      51.624  62.655  33.644  1.00 55.04           C  
+ATOM   1230  O2    U A  57      52.044  61.605  34.100  1.00 55.79           O  
+ATOM   1231  N3    U A  57      50.387  62.767  33.057  1.00 53.93           N  
+ATOM   1232  C4    U A  57      49.831  63.906  32.503  1.00 53.12           C  
+ATOM   1233  O4    U A  57      48.707  63.850  32.010  1.00 53.57           O  
+ATOM   1234  C5    U A  57      50.660  65.073  32.575  1.00 52.60           C  
+ATOM   1235  C6    U A  57      51.868  64.988  33.148  1.00 54.55           C  
+ATOM   1236  P     G A  58      56.449  63.448  30.205  1.00 60.26           P  
+ATOM   1237  OP1   G A  58      57.754  62.807  29.877  1.00 60.58           O  
+ATOM   1238  OP2   G A  58      56.111  64.754  29.597  1.00 58.54           O  
+ATOM   1239  O5'   G A  58      55.268  62.426  29.875  1.00 57.10           O  
+ATOM   1240  C5'   G A  58      55.312  61.107  30.387  1.00 55.69           C  
+ATOM   1241  C4'   G A  58      54.029  60.369  30.093  1.00 55.43           C  
+ATOM   1242  O4'   G A  58      52.921  61.007  30.791  1.00 55.24           O  
+ATOM   1243  C3'   G A  58      53.589  60.368  28.636  1.00 54.18           C  
+ATOM   1244  O3'   G A  58      54.246  59.338  27.923  1.00 53.96           O  
+ATOM   1245  C2'   G A  58      52.097  60.092  28.757  1.00 54.41           C  
+ATOM   1246  O2'   G A  58      51.846  58.731  29.012  1.00 57.23           O  
+ATOM   1247  C1'   G A  58      51.737  60.887  30.012  1.00 53.85           C  
+ATOM   1248  N9    G A  58      51.267  62.217  29.656  1.00 53.03           N  
+ATOM   1249  C8    G A  58      51.950  63.400  29.767  1.00 52.08           C  
+ATOM   1250  N7    G A  58      51.278  64.419  29.308  1.00 51.44           N  
+ATOM   1251  C5    G A  58      50.074  63.877  28.879  1.00 50.05           C  
+ATOM   1252  C6    G A  58      48.951  64.496  28.292  1.00 50.75           C  
+ATOM   1253  O6    G A  58      48.794  65.685  28.008  1.00 53.29           O  
+ATOM   1254  N1    G A  58      47.939  63.583  28.022  1.00 50.16           N  
+ATOM   1255  C2    G A  58      48.003  62.239  28.270  1.00 51.00           C  
+ATOM   1256  N2    G A  58      46.914  61.522  27.924  1.00 50.63           N  
+ATOM   1257  N3    G A  58      49.053  61.641  28.814  1.00 52.48           N  
+ATOM   1258  C4    G A  58      50.045  62.521  29.095  1.00 51.88           C  
+ATOM   1259  P     C A  59      54.759  59.607  26.431  1.00 53.17           P  
+ATOM   1260  OP1   C A  59      55.673  58.491  26.089  1.00 55.70           O  
+ATOM   1261  OP2   C A  59      55.228  61.001  26.296  1.00 53.99           O  
+ATOM   1262  O5'   C A  59      53.445  59.435  25.560  1.00 54.08           O  
+ATOM   1263  C5'   C A  59      52.793  58.183  25.522  1.00 52.32           C  
+ATOM   1264  C4'   C A  59      51.386  58.359  25.064  1.00 52.96           C  
+ATOM   1265  O4'   C A  59      50.695  59.217  26.007  1.00 53.34           O  
+ATOM   1266  C3'   C A  59      51.248  59.093  23.746  1.00 54.55           C  
+ATOM   1267  O3'   C A  59      51.430  58.198  22.670  1.00 56.10           O  
+ATOM   1268  C2'   C A  59      49.826  59.625  23.841  1.00 54.97           C  
+ATOM   1269  O2'   C A  59      48.860  58.610  23.649  1.00 56.71           O  
+ATOM   1270  C1'   C A  59      49.766  60.033  25.310  1.00 55.15           C  
+ATOM   1271  N1    C A  59      50.164  61.434  25.444  1.00 55.90           N  
+ATOM   1272  C2    C A  59      49.218  62.407  25.156  1.00 56.55           C  
+ATOM   1273  O2    C A  59      48.077  62.055  24.858  1.00 59.12           O  
+ATOM   1274  N3    C A  59      49.563  63.702  25.209  1.00 56.90           N  
+ATOM   1275  C4    C A  59      50.800  64.045  25.557  1.00 56.99           C  
+ATOM   1276  N4    C A  59      51.083  65.348  25.606  1.00 57.32           N  
+ATOM   1277  C5    C A  59      51.793  63.071  25.874  1.00 56.89           C  
+ATOM   1278  C6    C A  59      51.433  61.787  25.809  1.00 56.91           C  
+ATOM   1279  P     C A  60      52.117  58.708  21.315  1.00 58.55           P  
+ATOM   1280  OP1   C A  60      52.566  57.477  20.623  1.00 60.10           O  
+ATOM   1281  OP2   C A  60      53.091  59.805  21.572  1.00 59.59           O  
+ATOM   1282  O5'   C A  60      50.930  59.382  20.504  1.00 58.02           O  
+ATOM   1283  C5'   C A  60      49.699  58.712  20.311  1.00 58.31           C  
+ATOM   1284  C4'   C A  60      48.692  59.668  19.729  1.00 60.59           C  
+ATOM   1285  O4'   C A  60      48.367  60.687  20.711  1.00 61.17           O  
+ATOM   1286  C3'   C A  60      49.215  60.451  18.536  1.00 61.75           C  
+ATOM   1287  O3'   C A  60      48.977  59.710  17.353  1.00 62.05           O  
+ATOM   1288  C2'   C A  60      48.336  61.689  18.549  1.00 62.65           C  
+ATOM   1289  O2'   C A  60      47.085  61.451  17.947  1.00 65.68           O  
+ATOM   1290  C1'   C A  60      48.151  61.920  20.050  1.00 62.43           C  
+ATOM   1291  N1    C A  60      49.075  62.919  20.594  1.00 63.39           N  
+ATOM   1292  C2    C A  60      48.741  64.252  20.458  1.00 63.93           C  
+ATOM   1293  O2    C A  60      47.699  64.537  19.859  1.00 66.02           O  
+ATOM   1294  N3    C A  60      49.552  65.196  20.975  1.00 64.43           N  
+ATOM   1295  C4    C A  60      50.669  64.837  21.602  1.00 64.08           C  
+ATOM   1296  N4    C A  60      51.437  65.800  22.106  1.00 64.35           N  
+ATOM   1297  C5    C A  60      51.045  63.476  21.743  1.00 63.45           C  
+ATOM   1298  C6    C A  60      50.228  62.556  21.229  1.00 63.91           C  
+ATOM   1299  P     A A  61      50.069  59.698  16.181  1.00 61.03           P  
+ATOM   1300  OP1   A A  61      51.287  59.065  16.739  1.00 62.45           O  
+ATOM   1301  OP2   A A  61      50.159  61.053  15.587  1.00 61.91           O  
+ATOM   1302  O5'   A A  61      49.427  58.698  15.124  1.00 60.51           O  
+ATOM   1303  C5'   A A  61      49.093  57.375  15.519  1.00 59.15           C  
+ATOM   1304  C4'   A A  61      48.325  56.663  14.432  1.00 57.25           C  
+ATOM   1305  O4'   A A  61      49.094  56.675  13.204  1.00 57.46           O  
+ATOM   1306  C3'   A A  61      48.113  55.187  14.715  1.00 56.35           C  
+ATOM   1307  O3'   A A  61      46.952  54.985  15.510  1.00 54.37           O  
+ATOM   1308  C2'   A A  61      47.924  54.610  13.325  1.00 56.77           C  
+ATOM   1309  O2'   A A  61      46.606  54.782  12.860  1.00 58.82           O  
+ATOM   1310  C1'   A A  61      48.893  55.462  12.506  1.00 56.45           C  
+ATOM   1311  N9    A A  61      50.194  54.840  12.299  1.00 55.64           N  
+ATOM   1312  C8    A A  61      51.375  55.127  12.934  1.00 56.06           C  
+ATOM   1313  N7    A A  61      52.390  54.419  12.503  1.00 56.16           N  
+ATOM   1314  C5    A A  61      51.836  53.608  11.524  1.00 55.20           C  
+ATOM   1315  C6    A A  61      52.389  52.642  10.683  1.00 53.69           C  
+ATOM   1316  N6    A A  61      53.685  52.311  10.692  1.00 53.61           N  
+ATOM   1317  N1    A A  61      51.563  52.015   9.819  1.00 52.98           N  
+ATOM   1318  C2    A A  61      50.275  52.347   9.811  1.00 52.85           C  
+ATOM   1319  N3    A A  61      49.634  53.243  10.552  1.00 53.34           N  
+ATOM   1320  C4    A A  61      50.484  53.847  11.397  1.00 55.08           C  
+ATOM   1321  P     A A  62      46.873  53.710  16.473  1.00 53.92           P  
+ATOM   1322  OP1   A A  62      45.603  53.723  17.227  1.00 56.55           O  
+ATOM   1323  OP2   A A  62      48.168  53.615  17.202  1.00 53.63           O  
+ATOM   1324  O5'   A A  62      46.816  52.489  15.470  1.00 54.86           O  
+ATOM   1325  C5'   A A  62      45.702  52.292  14.626  1.00 53.89           C  
+ATOM   1326  C4'   A A  62      45.976  51.126  13.735  1.00 54.46           C  
+ATOM   1327  O4'   A A  62      47.097  51.468  12.878  1.00 54.59           O  
+ATOM   1328  C3'   A A  62      46.438  49.885  14.479  1.00 53.52           C  
+ATOM   1329  O3'   A A  62      45.316  49.126  14.908  1.00 51.33           O  
+ATOM   1330  C2'   A A  62      47.214  49.158  13.396  1.00 54.74           C  
+ATOM   1331  O2'   A A  62      46.297  48.519  12.537  1.00 56.57           O  
+ATOM   1332  C1'   A A  62      47.893  50.323  12.664  1.00 54.85           C  
+ATOM   1333  N9    A A  62      49.247  50.628  13.130  1.00 55.09           N  
+ATOM   1334  C8    A A  62      49.610  51.419  14.192  1.00 55.06           C  
+ATOM   1335  N7    A A  62      50.908  51.497  14.377  1.00 55.94           N  
+ATOM   1336  C5    A A  62      51.434  50.706  13.369  1.00 54.99           C  
+ATOM   1337  C6    A A  62      52.743  50.373  13.029  1.00 53.85           C  
+ATOM   1338  N6    A A  62      53.812  50.830  13.683  1.00 52.77           N  
+ATOM   1339  N1    A A  62      52.928  49.550  11.980  1.00 53.74           N  
+ATOM   1340  C2    A A  62      51.858  49.111  11.318  1.00 54.27           C  
+ATOM   1341  N3    A A  62      50.576  49.358  11.532  1.00 53.66           N  
+ATOM   1342  C4    A A  62      50.426  50.169  12.589  1.00 55.03           C  
+ATOM   1343  P     U A  63      45.533  47.735  15.702  1.00 53.62           P  
+ATOM   1344  OP1   U A  63      46.808  47.065  15.295  1.00 52.97           O  
+ATOM   1345  OP2   U A  63      44.239  46.994  15.593  1.00 51.06           O  
+ATOM   1346  O5'   U A  63      45.691  48.165  17.223  1.00 51.23           O  
+ATOM   1347  C5'   U A  63      44.669  48.915  17.849  1.00 53.41           C  
+ATOM   1348  C4'   U A  63      44.630  48.623  19.322  1.00 54.01           C  
+ATOM   1349  O4'   U A  63      44.185  47.260  19.517  1.00 55.92           O  
+ATOM   1350  C3'   U A  63      46.012  48.682  19.940  1.00 54.73           C  
+ATOM   1351  O3'   U A  63      46.420  49.839  20.679  1.00 51.79           O  
+ATOM   1352  C2'   U A  63      46.533  47.253  20.033  1.00 54.94           C  
+ATOM   1353  O2'   U A  63      47.210  46.942  21.223  1.00 56.33           O  
+ATOM   1354  C1'   U A  63      45.234  46.451  20.007  1.00 57.13           C  
+ATOM   1355  N1    U A  63      45.287  45.226  19.207  1.00 60.34           N  
+ATOM   1356  C2    U A  63      45.138  44.028  19.869  1.00 61.56           C  
+ATOM   1357  O2    U A  63      44.930  43.959  21.059  1.00 61.71           O  
+ATOM   1358  N3    U A  63      45.231  42.914  19.079  1.00 64.02           N  
+ATOM   1359  C4    U A  63      45.442  42.883  17.712  1.00 64.85           C  
+ATOM   1360  O4    U A  63      45.492  41.795  17.125  1.00 65.14           O  
+ATOM   1361  C5    U A  63      45.570  44.173  17.102  1.00 64.42           C  
+ATOM   1362  C6    U A  63      45.489  45.272  17.855  1.00 62.18           C  
+ATOM   1363  P     U A  64      46.459  49.804  22.269  1.00 47.09           P  
+ATOM   1364  OP1   U A  64      45.474  48.814  22.740  1.00 49.72           O  
+ATOM   1365  OP2   U A  64      46.277  51.213  22.644  1.00 53.47           O  
+ATOM   1366  O5'   U A  64      47.944  49.291  22.621  1.00 48.05           O  
+ATOM   1367  C5'   U A  64      49.095  50.077  22.297  1.00 47.89           C  
+ATOM   1368  C4'   U A  64      50.371  49.234  22.232  1.00 47.96           C  
+ATOM   1369  O4'   U A  64      50.790  48.792  23.553  1.00 49.48           O  
+ATOM   1370  C3'   U A  64      50.175  47.926  21.478  1.00 49.78           C  
+ATOM   1371  O3'   U A  64      50.580  48.044  20.115  1.00 52.62           O  
+ATOM   1372  C2'   U A  64      51.262  47.014  22.015  1.00 48.66           C  
+ATOM   1373  O2'   U A  64      52.403  47.113  21.200  1.00 52.21           O  
+ATOM   1374  C1'   U A  64      51.487  47.568  23.418  1.00 47.24           C  
+ATOM   1375  N1    U A  64      51.309  46.702  24.587  1.00 44.75           N  
+ATOM   1376  C2    U A  64      52.389  45.900  24.918  1.00 43.26           C  
+ATOM   1377  O2    U A  64      53.425  45.886  24.269  1.00 39.02           O  
+ATOM   1378  N3    U A  64      52.214  45.120  26.034  1.00 42.01           N  
+ATOM   1379  C4    U A  64      51.096  45.064  26.839  1.00 44.23           C  
+ATOM   1380  O4    U A  64      51.140  44.403  27.873  1.00 46.83           O  
+ATOM   1381  C5    U A  64      50.012  45.904  26.423  1.00 44.86           C  
+ATOM   1382  C6    U A  64      50.152  46.679  25.333  1.00 46.40           C  
+ATOM   1383  P     C A  65      51.326  49.377  19.562  1.00 51.71           P  
+ATOM   1384  OP1   C A  65      52.793  49.248  19.702  1.00 52.59           O  
+ATOM   1385  OP2   C A  65      50.663  50.616  20.021  1.00 54.65           O  
+ATOM   1386  O5'   C A  65      50.956  49.256  18.023  1.00 51.76           O  
+ATOM   1387  C5'   C A  65      49.594  49.033  17.666  1.00 51.17           C  
+ATOM   1388  C4'   C A  65      49.473  47.942  16.630  1.00 50.61           C  
+ATOM   1389  O4'   C A  65      50.228  48.336  15.457  1.00 51.33           O  
+ATOM   1390  C3'   C A  65      50.034  46.584  17.008  1.00 50.04           C  
+ATOM   1391  O3'   C A  65      49.065  45.811  17.703  1.00 50.23           O  
+ATOM   1392  C2'   C A  65      50.312  45.974  15.645  1.00 50.59           C  
+ATOM   1393  O2'   C A  65      49.128  45.495  15.051  1.00 52.19           O  
+ATOM   1394  C1'   C A  65      50.793  47.192  14.856  1.00 50.72           C  
+ATOM   1395  N1    C A  65      52.250  47.341  14.829  1.00 49.53           N  
+ATOM   1396  C2    C A  65      52.951  46.590  13.916  1.00 49.03           C  
+ATOM   1397  O2    C A  65      52.317  45.825  13.179  1.00 48.88           O  
+ATOM   1398  N3    C A  65      54.296  46.704  13.849  1.00 49.20           N  
+ATOM   1399  C4    C A  65      54.933  47.538  14.661  1.00 49.64           C  
+ATOM   1400  N4    C A  65      56.250  47.644  14.526  1.00 48.30           N  
+ATOM   1401  C5    C A  65      54.241  48.311  15.632  1.00 50.78           C  
+ATOM   1402  C6    C A  65      52.905  48.188  15.676  1.00 49.60           C  
+ATOM   1403  P     C A  66      49.544  44.611  18.663  1.00 48.93           P  
+ATOM   1404  OP1   C A  66      48.423  44.178  19.537  1.00 48.42           O  
+ATOM   1405  OP2   C A  66      50.819  45.058  19.272  1.00 50.19           O  
+ATOM   1406  O5'   C A  66      49.908  43.433  17.666  1.00 49.16           O  
+ATOM   1407  C5'   C A  66      48.903  42.780  16.909  1.00 49.92           C  
+ATOM   1408  C4'   C A  66      49.538  41.774  15.989  1.00 50.54           C  
+ATOM   1409  O4'   C A  66      50.440  42.461  15.091  1.00 50.00           O  
+ATOM   1410  C3'   C A  66      50.440  40.788  16.695  1.00 51.95           C  
+ATOM   1411  O3'   C A  66      49.688  39.704  17.173  1.00 55.18           O  
+ATOM   1412  C2'   C A  66      51.380  40.343  15.597  1.00 51.22           C  
+ATOM   1413  O2'   C A  66      50.802  39.365  14.770  1.00 54.36           O  
+ATOM   1414  C1'   C A  66      51.558  41.640  14.822  1.00 49.83           C  
+ATOM   1415  N1    C A  66      52.765  42.358  15.216  1.00 49.69           N  
+ATOM   1416  C2    C A  66      53.962  41.892  14.740  1.00 49.58           C  
+ATOM   1417  O2    C A  66      53.950  40.868  14.055  1.00 52.02           O  
+ATOM   1418  N3    C A  66      55.105  42.549  15.034  1.00 48.70           N  
+ATOM   1419  C4    C A  66      55.067  43.641  15.795  1.00 49.07           C  
+ATOM   1420  N4    C A  66      56.224  44.276  16.032  1.00 50.40           N  
+ATOM   1421  C5    C A  66      53.843  44.135  16.335  1.00 50.89           C  
+ATOM   1422  C6    C A  66      52.720  43.464  16.021  1.00 49.92           C  
+ATOM   1423  P     U A  67      50.160  38.971  18.505  1.00 60.57           P  
+ATOM   1424  OP1   U A  67      49.141  37.934  18.832  1.00 59.64           O  
+ATOM   1425  OP2   U A  67      50.501  40.029  19.500  1.00 60.62           O  
+ATOM   1426  O5'   U A  67      51.540  38.286  18.096  1.00 58.02           O  
+ATOM   1427  C5'   U A  67      51.590  37.228  17.156  1.00 57.98           C  
+ATOM   1428  C4'   U A  67      53.024  36.859  16.894  1.00 60.31           C  
+ATOM   1429  O4'   U A  67      53.725  38.007  16.350  1.00 60.03           O  
+ATOM   1430  C3'   U A  67      53.814  36.475  18.130  1.00 62.18           C  
+ATOM   1431  O3'   U A  67      53.645  35.077  18.330  1.00 67.36           O  
+ATOM   1432  C2'   U A  67      55.243  36.786  17.716  1.00 60.43           C  
+ATOM   1433  O2'   U A  67      55.790  35.730  16.969  1.00 60.29           O  
+ATOM   1434  C1'   U A  67      55.052  38.027  16.836  1.00 59.24           C  
+ATOM   1435  N1    U A  67      55.230  39.310  17.518  1.00 58.88           N  
+ATOM   1436  C2    U A  67      56.440  39.956  17.379  1.00 58.64           C  
+ATOM   1437  O2    U A  67      57.395  39.461  16.803  1.00 60.38           O  
+ATOM   1438  N3    U A  67      56.493  41.205  17.945  1.00 57.00           N  
+ATOM   1439  C4    U A  67      55.490  41.839  18.634  1.00 56.08           C  
+ATOM   1440  O4    U A  67      55.624  43.017  18.919  1.00 57.14           O  
+ATOM   1441  C5    U A  67      54.299  41.077  18.794  1.00 56.32           C  
+ATOM   1442  C6    U A  67      54.210  39.869  18.243  1.00 58.50           C  
+ATOM   1443  P     G A  68      54.230  34.371  19.646  1.00 71.64           P  
+ATOM   1444  OP1   G A  68      53.897  32.933  19.519  1.00 71.19           O  
+ATOM   1445  OP2   G A  68      53.751  35.126  20.834  1.00 71.67           O  
+ATOM   1446  O5'   G A  68      55.806  34.568  19.513  1.00 71.77           O  
+ATOM   1447  C5'   G A  68      56.659  33.491  19.142  1.00 75.69           C  
+ATOM   1448  C4'   G A  68      58.091  33.830  19.491  1.00 79.27           C  
+ATOM   1449  O4'   G A  68      58.380  35.132  18.918  1.00 79.57           O  
+ATOM   1450  C3'   G A  68      58.385  34.004  20.980  1.00 81.28           C  
+ATOM   1451  O3'   G A  68      58.787  32.812  21.679  1.00 83.11           O  
+ATOM   1452  C2'   G A  68      59.584  34.943  20.956  1.00 82.22           C  
+ATOM   1453  O2'   G A  68      60.802  34.283  20.671  1.00 84.89           O  
+ATOM   1454  C1'   G A  68      59.236  35.853  19.782  1.00 81.50           C  
+ATOM   1455  N9    G A  68      58.575  37.093  20.173  1.00 81.29           N  
+ATOM   1456  C8    G A  68      57.250  37.289  20.478  1.00 81.20           C  
+ATOM   1457  N7    G A  68      56.970  38.535  20.755  1.00 80.75           N  
+ATOM   1458  C5    G A  68      58.186  39.194  20.627  1.00 80.02           C  
+ATOM   1459  C6    G A  68      58.516  40.567  20.783  1.00 80.22           C  
+ATOM   1460  O6    G A  68      57.767  41.520  21.044  1.00 80.59           O  
+ATOM   1461  N1    G A  68      59.875  40.791  20.584  1.00 80.75           N  
+ATOM   1462  C2    G A  68      60.798  39.828  20.258  1.00 80.78           C  
+ATOM   1463  N2    G A  68      62.075  40.236  20.108  1.00 79.89           N  
+ATOM   1464  N3    G A  68      60.496  38.555  20.089  1.00 80.70           N  
+ATOM   1465  C4    G A  68      59.185  38.312  20.288  1.00 80.39           C  
+ATOM   1466  P     C A  69      59.229  31.475  20.876  1.00 84.26           P  
+ATOM   1467  OP1   C A  69      60.580  31.681  20.282  1.00 80.96           O  
+ATOM   1468  OP2   C A  69      58.112  30.992  20.017  1.00 83.67           O  
+ATOM   1469  O5'   C A  69      59.373  30.393  22.036  1.00 81.95           O  
+ATOM   1470  C5'   C A  69      60.304  30.567  23.099  1.00 78.18           C  
+ATOM   1471  C4'   C A  69      59.612  30.374  24.428  1.00 76.05           C  
+ATOM   1472  O4'   C A  69      58.981  31.619  24.844  1.00 74.44           O  
+ATOM   1473  C3'   C A  69      58.468  29.372  24.406  1.00 75.69           C  
+ATOM   1474  O3'   C A  69      58.908  28.028  24.532  1.00 76.59           O  
+ATOM   1475  C2'   C A  69      57.624  29.805  25.597  1.00 74.75           C  
+ATOM   1476  O2'   C A  69      58.123  29.297  26.823  1.00 74.80           O  
+ATOM   1477  C1'   C A  69      57.768  31.329  25.529  1.00 73.22           C  
+ATOM   1478  N1    C A  69      56.654  31.993  24.829  1.00 70.35           N  
+ATOM   1479  C2    C A  69      55.423  32.067  25.471  1.00 69.49           C  
+ATOM   1480  O2    C A  69      55.308  31.549  26.584  1.00 69.27           O  
+ATOM   1481  N3    C A  69      54.392  32.698  24.862  1.00 67.72           N  
+ATOM   1482  C4    C A  69      54.563  33.232  23.651  1.00 68.13           C  
+ATOM   1483  N4    C A  69      53.526  33.851  23.091  1.00 69.40           N  
+ATOM   1484  C5    C A  69      55.807  33.158  22.964  1.00 66.89           C  
+ATOM   1485  C6    C A  69      56.816  32.536  23.584  1.00 68.40           C  
+ATOM   1486  P     A A  70      57.971  26.841  23.990  1.00 76.83           P  
+ATOM   1487  OP1   A A  70      58.699  25.566  24.172  1.00 76.97           O  
+ATOM   1488  OP2   A A  70      57.496  27.236  22.638  1.00 78.32           O  
+ATOM   1489  O5'   A A  70      56.735  26.838  24.986  1.00 73.56           O  
+ATOM   1490  C5'   A A  70      56.921  26.420  26.317  1.00 71.88           C  
+ATOM   1491  C4'   A A  70      55.660  26.599  27.107  1.00 70.52           C  
+ATOM   1492  O4'   A A  70      55.305  28.006  27.120  1.00 70.13           O  
+ATOM   1493  C3'   A A  70      54.435  25.933  26.512  1.00 70.69           C  
+ATOM   1494  O3'   A A  70      54.363  24.549  26.820  1.00 72.81           O  
+ATOM   1495  C2'   A A  70      53.305  26.731  27.143  1.00 69.29           C  
+ATOM   1496  O2'   A A  70      53.075  26.359  28.482  1.00 69.16           O  
+ATOM   1497  C1'   A A  70      53.893  28.138  27.128  1.00 68.11           C  
+ATOM   1498  N9    A A  70      53.470  28.894  25.952  1.00 64.00           N  
+ATOM   1499  C8    A A  70      54.178  29.247  24.834  1.00 62.02           C  
+ATOM   1500  N7    A A  70      53.474  29.925  23.959  1.00 60.61           N  
+ATOM   1501  C5    A A  70      52.220  30.021  24.544  1.00 60.84           C  
+ATOM   1502  C6    A A  70      51.013  30.616  24.123  1.00 60.96           C  
+ATOM   1503  N6    A A  70      50.866  31.271  22.968  1.00 61.70           N  
+ATOM   1504  N1    A A  70      49.944  30.517  24.947  1.00 58.65           N  
+ATOM   1505  C2    A A  70      50.089  29.880  26.111  1.00 58.26           C  
+ATOM   1506  N3    A A  70      51.171  29.287  26.616  1.00 60.01           N  
+ATOM   1507  C4    A A  70      52.208  29.393  25.770  1.00 61.17           C  
+ATOM   1508  P     G A  71      53.262  23.639  26.088  1.00 73.21           P  
+ATOM   1509  OP1   G A  71      53.410  22.249  26.575  1.00 75.65           O  
+ATOM   1510  OP2   G A  71      53.327  23.913  24.628  1.00 74.68           O  
+ATOM   1511  O5'   G A  71      51.889  24.194  26.658  1.00 73.13           O  
+ATOM   1512  C5'   G A  71      51.545  23.948  28.006  1.00 73.66           C  
+ATOM   1513  C4'   G A  71      50.085  24.200  28.222  1.00 74.68           C  
+ATOM   1514  O4'   G A  71      49.834  25.619  28.061  1.00 74.96           O  
+ATOM   1515  C3'   G A  71      49.168  23.560  27.196  1.00 74.87           C  
+ATOM   1516  O3'   G A  71      48.900  22.193  27.431  1.00 77.06           O  
+ATOM   1517  C2'   G A  71      47.926  24.423  27.302  1.00 74.74           C  
+ATOM   1518  O2'   G A  71      47.160  24.095  28.450  1.00 73.45           O  
+ATOM   1519  C1'   G A  71      48.557  25.807  27.466  1.00 74.47           C  
+ATOM   1520  N9    G A  71      48.732  26.500  26.190  1.00 73.18           N  
+ATOM   1521  C8    G A  71      49.893  26.651  25.465  1.00 72.22           C  
+ATOM   1522  N7    G A  71      49.730  27.362  24.379  1.00 71.34           N  
+ATOM   1523  C5    G A  71      48.381  27.690  24.382  1.00 70.99           C  
+ATOM   1524  C6    G A  71      47.614  28.457  23.459  1.00 70.89           C  
+ATOM   1525  O6    G A  71      47.990  29.025  22.425  1.00 70.62           O  
+ATOM   1526  N1    G A  71      46.279  28.535  23.845  1.00 70.13           N  
+ATOM   1527  C2    G A  71      45.746  27.955  24.973  1.00 71.44           C  
+ATOM   1528  N2    G A  71      44.437  28.147  25.177  1.00 71.27           N  
+ATOM   1529  N3    G A  71      46.448  27.240  25.840  1.00 70.99           N  
+ATOM   1530  C4    G A  71      47.749  27.153  25.486  1.00 71.48           C  
+ATOM   1531  P     C A  72      48.570  21.242  26.182  1.00 78.06           P  
+ATOM   1532  OP1   C A  72      48.427  19.843  26.654  1.00 79.10           O  
+ATOM   1533  OP2   C A  72      49.597  21.571  25.154  1.00 77.70           O  
+ATOM   1534  O5'   C A  72      47.129  21.735  25.716  1.00 76.34           O  
+ATOM   1535  C5'   C A  72      46.020  21.583  26.588  1.00 74.73           C  
+ATOM   1536  C4'   C A  72      44.789  22.243  26.020  1.00 74.94           C  
+ATOM   1537  O4'   C A  72      44.999  23.681  25.940  1.00 74.18           O  
+ATOM   1538  C3'   C A  72      44.435  21.873  24.594  1.00 74.74           C  
+ATOM   1539  O3'   C A  72      43.818  20.614  24.463  1.00 77.63           O  
+ATOM   1540  C2'   C A  72      43.573  23.046  24.163  1.00 72.71           C  
+ATOM   1541  O2'   C A  72      42.275  23.012  24.727  1.00 72.93           O  
+ATOM   1542  C1'   C A  72      44.345  24.199  24.789  1.00 70.56           C  
+ATOM   1543  N1    C A  72      45.366  24.656  23.839  1.00 65.60           N  
+ATOM   1544  C2    C A  72      44.983  25.549  22.825  1.00 62.36           C  
+ATOM   1545  O2    C A  72      43.796  25.935  22.781  1.00 60.28           O  
+ATOM   1546  N3    C A  72      45.908  25.962  21.926  1.00 58.47           N  
+ATOM   1547  C4    C A  72      47.160  25.518  22.012  1.00 58.31           C  
+ATOM   1548  N4    C A  72      48.035  25.941  21.095  1.00 57.64           N  
+ATOM   1549  C5    C A  72      47.575  24.616  23.042  1.00 58.81           C  
+ATOM   1550  C6    C A  72      46.656  24.215  23.923  1.00 61.58           C  
+ATOM   1551  P     G A  73      44.246  19.681  23.238  1.00 79.51           P  
+ATOM   1552  OP1   G A  73      43.644  18.340  23.446  1.00 79.13           O  
+ATOM   1553  OP2   G A  73      45.725  19.817  23.084  1.00 78.76           O  
+ATOM   1554  O5'   G A  73      43.539  20.372  21.992  1.00 77.35           O  
+ATOM   1555  C5'   G A  73      42.142  20.629  22.020  1.00 74.33           C  
+ATOM   1556  C4'   G A  73      41.738  21.509  20.863  1.00 72.37           C  
+ATOM   1557  O4'   G A  73      42.458  22.769  20.932  1.00 70.30           O  
+ATOM   1558  C3'   G A  73      42.087  21.020  19.470  1.00 72.08           C  
+ATOM   1559  O3'   G A  73      41.194  20.013  19.012  1.00 72.84           O  
+ATOM   1560  C2'   G A  73      41.929  22.305  18.670  1.00 70.65           C  
+ATOM   1561  O2'   G A  73      40.567  22.611  18.440  1.00 71.39           O  
+ATOM   1562  C1'   G A  73      42.536  23.329  19.632  1.00 67.90           C  
+ATOM   1563  N9    G A  73      43.929  23.628  19.311  1.00 64.50           N  
+ATOM   1564  C8    G A  73      45.070  23.161  19.922  1.00 62.79           C  
+ATOM   1565  N7    G A  73      46.169  23.599  19.359  1.00 61.48           N  
+ATOM   1566  C5    G A  73      45.722  24.411  18.322  1.00 61.69           C  
+ATOM   1567  C6    G A  73      46.448  25.169  17.342  1.00 59.71           C  
+ATOM   1568  O6    G A  73      47.679  25.276  17.188  1.00 57.76           O  
+ATOM   1569  N1    G A  73      45.588  25.842  16.485  1.00 59.01           N  
+ATOM   1570  C2    G A  73      44.216  25.798  16.549  1.00 61.75           C  
+ATOM   1571  N2    G A  73      43.552  26.506  15.635  1.00 62.68           N  
+ATOM   1572  N3    G A  73      43.537  25.106  17.443  1.00 62.36           N  
+ATOM   1573  C4    G A  73      44.344  24.442  18.288  1.00 62.76           C  
+ATOM   1574  P     G A  74      41.787  18.637  18.416  1.00 74.17           P  
+ATOM   1575  OP1   G A  74      40.716  17.600  18.506  1.00 74.30           O  
+ATOM   1576  OP2   G A  74      43.117  18.392  19.042  1.00 71.62           O  
+ATOM   1577  O5'   G A  74      42.045  18.934  16.875  1.00 72.80           O  
+ATOM   1578  C5'   G A  74      42.905  19.983  16.477  1.00 71.35           C  
+ATOM   1579  C4'   G A  74      42.600  20.383  15.067  1.00 68.80           C  
+ATOM   1580  O4'   G A  74      43.028  21.760  14.917  1.00 69.15           O  
+ATOM   1581  C3'   G A  74      43.339  19.614  13.992  1.00 68.58           C  
+ATOM   1582  O3'   G A  74      42.846  18.468  13.299  1.00 71.01           O  
+ATOM   1583  C2'   G A  74      44.522  20.455  13.553  1.00 67.98           C  
+ATOM   1584  O2'   G A  74      44.576  20.558  12.143  1.00 68.13           O  
+ATOM   1585  C1'   G A  74      44.203  21.839  14.136  1.00 66.63           C  
+ATOM   1586  N9    G A  74      45.323  22.134  15.022  1.00 63.24           N  
+ATOM   1587  C8    G A  74      45.492  21.692  16.311  1.00 60.66           C  
+ATOM   1588  N7    G A  74      46.701  21.882  16.760  1.00 60.19           N  
+ATOM   1589  C5    G A  74      47.349  22.547  15.729  1.00 60.81           C  
+ATOM   1590  C6    G A  74      48.677  23.004  15.635  1.00 61.76           C  
+ATOM   1591  O6    G A  74      49.584  22.902  16.473  1.00 65.71           O  
+ATOM   1592  N1    G A  74      48.918  23.642  14.418  1.00 60.45           N  
+ATOM   1593  C2    G A  74      47.989  23.822  13.425  1.00 58.92           C  
+ATOM   1594  N2    G A  74      48.406  24.479  12.330  1.00 58.54           N  
+ATOM   1595  N3    G A  74      46.741  23.391  13.503  1.00 58.36           N  
+ATOM   1596  C4    G A  74      46.494  22.764  14.674  1.00 60.52           C  
+ATOM   1597  P     A A  75      43.733  17.113  13.257  1.00 71.98           P  
+ATOM   1598  OP1   A A  75      43.102  16.200  12.276  1.00 73.52           O  
+ATOM   1599  OP2   A A  75      43.955  16.648  14.649  1.00 72.26           O  
+ATOM   1600  O5'   A A  75      45.151  17.547  12.672  1.00 68.58           O  
+ATOM   1601  C5'   A A  75      46.255  16.653  12.710  1.00 65.94           C  
+ATOM   1602  C4'   A A  75      47.133  16.874  11.504  1.00 65.49           C  
+ATOM   1603  O4'   A A  75      46.434  16.429  10.319  1.00 66.68           O  
+ATOM   1604  C3'   A A  75      47.472  18.333  11.260  1.00 65.46           C  
+ATOM   1605  O3'   A A  75      48.720  18.628  11.864  1.00 64.21           O  
+ATOM   1606  C2'   A A  75      47.592  18.420   9.750  1.00 64.16           C  
+ATOM   1607  O2'   A A  75      48.875  18.031   9.336  1.00 65.40           O  
+ATOM   1608  C1'   A A  75      46.555  17.396   9.295  1.00 64.67           C  
+ATOM   1609  N9    A A  75      45.227  17.950   9.094  1.00 64.06           N  
+ATOM   1610  C8    A A  75      44.138  17.744   9.898  1.00 64.00           C  
+ATOM   1611  N7    A A  75      43.056  18.349   9.486  1.00 66.17           N  
+ATOM   1612  C5    A A  75      43.463  19.001   8.332  1.00 65.71           C  
+ATOM   1613  C6    A A  75      42.781  19.821   7.424  1.00 65.96           C  
+ATOM   1614  N6    A A  75      41.490  20.141   7.546  1.00 67.52           N  
+ATOM   1615  N1    A A  75      43.476  20.311   6.375  1.00 66.21           N  
+ATOM   1616  C2    A A  75      44.770  19.991   6.260  1.00 66.15           C  
+ATOM   1617  N3    A A  75      45.520  19.231   7.050  1.00 66.38           N  
+ATOM   1618  C4    A A  75      44.799  18.763   8.080  1.00 64.69           C  
+ATOM   1619  P     A A  76      48.870  19.950  12.740  1.00 62.82           P  
+ATOM   1620  OP1   A A  76      50.069  19.832  13.600  1.00 63.15           O  
+ATOM   1621  OP2   A A  76      47.539  20.165  13.362  1.00 59.79           O  
+ATOM   1622  O5'   A A  76      49.159  21.073  11.650  1.00 60.99           O  
+ATOM   1623  C5'   A A  76      50.435  21.172  11.023  1.00 58.74           C  
+ATOM   1624  C4'   A A  76      50.317  21.995   9.775  1.00 57.81           C  
+ATOM   1625  O4'   A A  76      49.237  21.437   8.991  1.00 57.97           O  
+ATOM   1626  C3'   A A  76      49.940  23.455   9.967  1.00 56.91           C  
+ATOM   1627  O3'   A A  76      51.121  24.238  10.118  1.00 57.19           O  
+ATOM   1628  C2'   A A  76      49.263  23.779   8.643  1.00 56.44           C  
+ATOM   1629  O2'   A A  76      50.201  24.001   7.608  1.00 54.76           O  
+ATOM   1630  C1'   A A  76      48.515  22.475   8.363  1.00 55.29           C  
+ATOM   1631  N9    A A  76      47.162  22.417   8.897  1.00 53.64           N  
+ATOM   1632  C8    A A  76      46.775  21.938  10.128  1.00 53.02           C  
+ATOM   1633  N7    A A  76      45.476  21.937  10.309  1.00 53.29           N  
+ATOM   1634  C5    A A  76      44.974  22.466   9.127  1.00 53.22           C  
+ATOM   1635  C6    A A  76      43.668  22.715   8.684  1.00 53.02           C  
+ATOM   1636  N6    A A  76      42.582  22.451   9.400  1.00 52.94           N  
+ATOM   1637  N1    A A  76      43.513  23.251   7.456  1.00 54.02           N  
+ATOM   1638  C2    A A  76      44.606  23.509   6.723  1.00 53.06           C  
+ATOM   1639  N3    A A  76      45.885  23.312   7.024  1.00 53.73           N  
+ATOM   1640  C4    A A  76      46.004  22.782   8.255  1.00 54.00           C  
+ATOM   1641  P     A A  77      51.041  25.690  10.808  1.00 57.22           P  
+ATOM   1642  OP1   A A  77      52.362  26.338  10.668  1.00 56.31           O  
+ATOM   1643  OP2   A A  77      50.451  25.502  12.167  1.00 57.57           O  
+ATOM   1644  O5'   A A  77      50.023  26.495   9.880  1.00 57.05           O  
+ATOM   1645  C5'   A A  77      50.484  27.150   8.697  1.00 55.43           C  
+ATOM   1646  C4'   A A  77      49.318  27.660   7.869  1.00 55.21           C  
+ATOM   1647  O4'   A A  77      48.395  26.566   7.621  1.00 55.90           O  
+ATOM   1648  C3'   A A  77      48.457  28.764   8.470  1.00 54.93           C  
+ATOM   1649  O3'   A A  77      48.994  30.044   8.166  1.00 55.04           O  
+ATOM   1650  C2'   A A  77      47.149  28.572   7.719  1.00 55.16           C  
+ATOM   1651  O2'   A A  77      47.237  29.094   6.409  1.00 54.30           O  
+ATOM   1652  C1'   A A  77      47.068  27.048   7.639  1.00 54.33           C  
+ATOM   1653  N9    A A  77      46.406  26.464   8.801  1.00 53.13           N  
+ATOM   1654  C8    A A  77      46.987  26.001   9.955  1.00 52.87           C  
+ATOM   1655  N7    A A  77      46.127  25.506  10.817  1.00 53.79           N  
+ATOM   1656  C5    A A  77      44.899  25.658  10.187  1.00 52.32           C  
+ATOM   1657  C6    A A  77      43.586  25.329  10.578  1.00 52.60           C  
+ATOM   1658  N6    A A  77      43.286  24.748  11.739  1.00 55.40           N  
+ATOM   1659  N1    A A  77      42.580  25.618   9.722  1.00 52.52           N  
+ATOM   1660  C2    A A  77      42.887  26.202   8.552  1.00 52.91           C  
+ATOM   1661  N3    A A  77      44.085  26.561   8.072  1.00 52.18           N  
+ATOM   1662  C4    A A  77      45.056  26.256   8.949  1.00 52.16           C  
+ATOM   1663  P     C A  78      49.484  31.004   9.354  1.00 55.69           P  
+ATOM   1664  OP1   C A  78      49.843  32.325   8.764  1.00 54.67           O  
+ATOM   1665  OP2   C A  78      50.489  30.262  10.161  1.00 56.60           O  
+ATOM   1666  O5'   C A  78      48.186  31.175  10.259  1.00 54.42           O  
+ATOM   1667  C5'   C A  78      47.035  31.822   9.746  1.00 53.71           C  
+ATOM   1668  C4'   C A  78      45.790  31.247  10.370  1.00 53.69           C  
+ATOM   1669  O4'   C A  78      45.943  29.803  10.457  1.00 54.25           O  
+ATOM   1670  C3'   C A  78      45.529  31.646  11.808  1.00 53.72           C  
+ATOM   1671  O3'   C A  78      44.893  32.906  11.911  1.00 53.94           O  
+ATOM   1672  C2'   C A  78      44.636  30.518  12.292  1.00 53.88           C  
+ATOM   1673  O2'   C A  78      43.308  30.647  11.805  1.00 54.27           O  
+ATOM   1674  C1'   C A  78      45.305  29.325  11.623  1.00 52.32           C  
+ATOM   1675  N1    C A  78      46.318  28.721  12.494  1.00 50.20           N  
+ATOM   1676  C2    C A  78      45.883  27.995  13.596  1.00 48.56           C  
+ATOM   1677  O2    C A  78      44.666  27.900  13.787  1.00 47.16           O  
+ATOM   1678  N3    C A  78      46.789  27.419  14.418  1.00 48.57           N  
+ATOM   1679  C4    C A  78      48.092  27.546  14.162  1.00 50.34           C  
+ATOM   1680  N4    C A  78      48.958  26.946  14.992  1.00 49.92           N  
+ATOM   1681  C5    C A  78      48.571  28.290  13.040  1.00 51.43           C  
+ATOM   1682  C6    C A  78      47.654  28.859  12.238  1.00 49.99           C  
+ATOM   1683  P     G A  79      45.068  33.757  13.257  1.00 52.92           P  
+ATOM   1684  OP1   G A  79      44.602  35.126  12.971  1.00 55.12           O  
+ATOM   1685  OP2   G A  79      46.464  33.538  13.738  1.00 54.61           O  
+ATOM   1686  O5'   G A  79      44.053  33.066  14.268  1.00 52.03           O  
+ATOM   1687  C5'   G A  79      42.681  32.970  13.939  1.00 52.92           C  
+ATOM   1688  C4'   G A  79      41.965  32.101  14.936  1.00 53.20           C  
+ATOM   1689  O4'   G A  79      42.600  30.794  14.948  1.00 54.24           O  
+ATOM   1690  C3'   G A  79      42.120  32.560  16.371  1.00 54.77           C  
+ATOM   1691  O3'   G A  79      41.208  33.586  16.721  1.00 56.81           O  
+ATOM   1692  C2'   G A  79      41.863  31.284  17.147  1.00 54.49           C  
+ATOM   1693  O2'   G A  79      40.484  31.015  17.176  1.00 56.96           O  
+ATOM   1694  C1'   G A  79      42.546  30.252  16.255  1.00 53.50           C  
+ATOM   1695  N9    G A  79      43.889  29.889  16.704  1.00 51.11           N  
+ATOM   1696  C8    G A  79      45.106  30.274  16.195  1.00 50.11           C  
+ATOM   1697  N7    G A  79      46.120  29.761  16.851  1.00 48.60           N  
+ATOM   1698  C5    G A  79      45.529  28.995  17.849  1.00 47.30           C  
+ATOM   1699  C6    G A  79      46.111  28.202  18.879  1.00 46.07           C  
+ATOM   1700  O6    G A  79      47.321  28.008  19.130  1.00 45.96           O  
+ATOM   1701  N1    G A  79      45.139  27.600  19.665  1.00 43.73           N  
+ATOM   1702  C2    G A  79      43.785  27.738  19.492  1.00 48.40           C  
+ATOM   1703  N2    G A  79      42.983  27.078  20.352  1.00 51.24           N  
+ATOM   1704  N3    G A  79      43.236  28.469  18.544  1.00 49.81           N  
+ATOM   1705  C4    G A  79      44.158  29.064  17.767  1.00 49.45           C  
+ATOM   1706  P     U A  80      41.696  34.744  17.718  1.00 57.91           P  
+ATOM   1707  OP1   U A  80      40.668  35.811  17.699  1.00 58.33           O  
+ATOM   1708  OP2   U A  80      43.105  35.066  17.387  1.00 55.86           O  
+ATOM   1709  O5'   U A  80      41.666  34.031  19.139  1.00 59.76           O  
+ATOM   1710  C5'   U A  80      40.441  33.510  19.646  1.00 60.84           C  
+ATOM   1711  C4'   U A  80      40.693  32.611  20.834  1.00 61.61           C  
+ATOM   1712  O4'   U A  80      41.480  31.465  20.405  1.00 61.05           O  
+ATOM   1713  C3'   U A  80      41.535  33.217  21.943  1.00 62.84           C  
+ATOM   1714  O3'   U A  80      40.767  34.025  22.818  1.00 67.34           O  
+ATOM   1715  C2'   U A  80      42.082  31.983  22.640  1.00 61.11           C  
+ATOM   1716  O2'   U A  80      41.107  31.381  23.464  1.00 61.83           O  
+ATOM   1717  C1'   U A  80      42.354  31.067  21.450  1.00 58.89           C  
+ATOM   1718  N1    U A  80      43.737  31.189  20.978  1.00 55.50           N  
+ATOM   1719  C2    U A  80      44.688  30.431  21.622  1.00 53.56           C  
+ATOM   1720  O2    U A  80      44.415  29.688  22.539  1.00 54.05           O  
+ATOM   1721  N3    U A  80      45.971  30.581  21.159  1.00 50.66           N  
+ATOM   1722  C4    U A  80      46.386  31.399  20.140  1.00 50.72           C  
+ATOM   1723  O4    U A  80      47.579  31.424  19.832  1.00 49.30           O  
+ATOM   1724  C5    U A  80      45.339  32.157  19.520  1.00 52.21           C  
+ATOM   1725  C6    U A  80      44.078  32.027  19.950  1.00 54.00           C  
+ATOM   1726  P     U A  81      41.512  35.096  23.759  1.00 69.99           P  
+ATOM   1727  OP1   U A  81      40.440  35.890  24.422  1.00 70.01           O  
+ATOM   1728  OP2   U A  81      42.570  35.792  22.973  1.00 68.74           O  
+ATOM   1729  O5'   U A  81      42.243  34.197  24.853  1.00 69.66           O  
+ATOM   1730  C5'   U A  81      41.492  33.546  25.869  1.00 69.69           C  
+ATOM   1731  C4'   U A  81      42.411  32.874  26.858  1.00 70.12           C  
+ATOM   1732  O4'   U A  81      43.154  31.827  26.185  1.00 70.30           O  
+ATOM   1733  C3'   U A  81      43.492  33.765  27.442  1.00 71.48           C  
+ATOM   1734  O3'   U A  81      43.008  34.521  28.543  1.00 73.23           O  
+ATOM   1735  C2'   U A  81      44.548  32.755  27.868  1.00 71.16           C  
+ATOM   1736  O2'   U A  81      44.243  32.119  29.088  1.00 72.71           O  
+ATOM   1737  C1'   U A  81      44.455  31.733  26.740  1.00 69.65           C  
+ATOM   1738  N1    U A  81      45.445  32.005  25.694  1.00 67.60           N  
+ATOM   1739  C2    U A  81      46.694  31.456  25.857  1.00 67.36           C  
+ATOM   1740  O2    U A  81      46.984  30.751  26.806  1.00 69.28           O  
+ATOM   1741  N3    U A  81      47.595  31.762  24.873  1.00 65.88           N  
+ATOM   1742  C4    U A  81      47.377  32.543  23.770  1.00 64.36           C  
+ATOM   1743  O4    U A  81      48.298  32.741  22.977  1.00 63.94           O  
+ATOM   1744  C5    U A  81      46.053  33.070  23.668  1.00 66.08           C  
+ATOM   1745  C6    U A  81      45.152  32.786  24.610  1.00 67.30           C  
+ATOM   1746  P     G A  82      43.833  35.803  29.047  1.00 74.81           P  
+ATOM   1747  OP1   G A  82      43.043  36.432  30.132  1.00 76.99           O  
+ATOM   1748  OP2   G A  82      44.213  36.612  27.861  1.00 76.87           O  
+ATOM   1749  O5'   G A  82      45.157  35.176  29.671  1.00 72.53           O  
+ATOM   1750  C5'   G A  82      45.067  34.297  30.782  1.00 72.61           C  
+ATOM   1751  C4'   G A  82      46.398  33.635  31.056  1.00 73.05           C  
+ATOM   1752  O4'   G A  82      46.808  32.836  29.908  1.00 72.32           O  
+ATOM   1753  C3'   G A  82      47.550  34.606  31.244  1.00 73.03           C  
+ATOM   1754  O3'   G A  82      47.600  35.046  32.591  1.00 73.81           O  
+ATOM   1755  C2'   G A  82      48.762  33.750  30.917  1.00 71.15           C  
+ATOM   1756  O2'   G A  82      49.183  32.982  32.016  1.00 71.55           O  
+ATOM   1757  C1'   G A  82      48.219  32.851  29.809  1.00 70.45           C  
+ATOM   1758  N9    G A  82      48.606  33.304  28.483  1.00 69.22           N  
+ATOM   1759  C8    G A  82      47.862  34.024  27.586  1.00 68.93           C  
+ATOM   1760  N7    G A  82      48.523  34.307  26.494  1.00 68.74           N  
+ATOM   1761  C5    G A  82      49.772  33.732  26.686  1.00 66.17           C  
+ATOM   1762  C6    G A  82      50.914  33.717  25.853  1.00 65.71           C  
+ATOM   1763  O6    G A  82      51.064  34.234  24.737  1.00 67.39           O  
+ATOM   1764  N1    G A  82      51.960  33.015  26.437  1.00 65.06           N  
+ATOM   1765  C2    G A  82      51.910  32.409  27.667  1.00 65.49           C  
+ATOM   1766  N2    G A  82      53.019  31.776  28.066  1.00 66.07           N  
+ATOM   1767  N3    G A  82      50.854  32.422  28.450  1.00 65.40           N  
+ATOM   1768  C4    G A  82      49.832  33.098  27.902  1.00 67.06           C  
+ATOM   1769  P     A A  83      48.714  36.110  33.037  1.00 75.74           P  
+ATOM   1770  OP1   A A  83      48.454  36.457  34.461  1.00 76.19           O  
+ATOM   1771  OP2   A A  83      48.787  37.192  32.017  1.00 75.92           O  
+ATOM   1772  O5'   A A  83      50.084  35.306  32.950  1.00 73.07           O  
+ATOM   1773  C5'   A A  83      51.311  35.996  32.798  1.00 71.48           C  
+ATOM   1774  C4'   A A  83      52.389  35.042  32.352  1.00 72.32           C  
+ATOM   1775  O4'   A A  83      52.006  34.431  31.092  1.00 71.90           O  
+ATOM   1776  C3'   A A  83      53.717  35.706  32.044  1.00 72.39           C  
+ATOM   1777  O3'   A A  83      54.479  35.854  33.223  1.00 73.75           O  
+ATOM   1778  C2'   A A  83      54.367  34.722  31.088  1.00 71.88           C  
+ATOM   1779  O2'   A A  83      55.011  33.652  31.742  1.00 73.47           O  
+ATOM   1780  C1'   A A  83      53.158  34.234  30.289  1.00 70.66           C  
+ATOM   1781  N9    A A  83      52.993  34.981  29.046  1.00 68.56           N  
+ATOM   1782  C8    A A  83      51.908  35.688  28.594  1.00 67.12           C  
+ATOM   1783  N7    A A  83      52.100  36.253  27.425  1.00 66.12           N  
+ATOM   1784  C5    A A  83      53.397  35.888  27.088  1.00 66.03           C  
+ATOM   1785  C6    A A  83      54.198  36.164  25.971  1.00 66.42           C  
+ATOM   1786  N6    A A  83      53.795  36.897  24.937  1.00 66.62           N  
+ATOM   1787  N1    A A  83      55.448  35.651  25.951  1.00 66.47           N  
+ATOM   1788  C2    A A  83      55.854  34.913  26.993  1.00 65.81           C  
+ATOM   1789  N3    A A  83      55.194  34.582  28.094  1.00 66.02           N  
+ATOM   1790  C4    A A  83      53.956  35.106  28.078  1.00 66.63           C  
+ATOM   1791  P     A A  84      55.352  37.173  33.429  1.00 74.69           P  
+ATOM   1792  OP1   A A  84      56.069  37.043  34.725  1.00 74.75           O  
+ATOM   1793  OP2   A A  84      54.440  38.322  33.207  1.00 72.53           O  
+ATOM   1794  O5'   A A  84      56.405  37.108  32.237  1.00 72.08           O  
+ATOM   1795  C5'   A A  84      57.422  36.109  32.201  1.00 70.69           C  
+ATOM   1796  C4'   A A  84      58.311  36.343  31.007  1.00 69.31           C  
+ATOM   1797  O4'   A A  84      57.606  35.966  29.799  1.00 68.54           O  
+ATOM   1798  C3'   A A  84      58.703  37.790  30.786  1.00 69.05           C  
+ATOM   1799  O3'   A A  84      59.818  38.159  31.581  1.00 71.70           O  
+ATOM   1800  C2'   A A  84      58.992  37.827  29.289  1.00 67.78           C  
+ATOM   1801  O2'   A A  84      60.283  37.385  28.923  1.00 68.74           O  
+ATOM   1802  C1'   A A  84      57.912  36.881  28.759  1.00 66.10           C  
+ATOM   1803  N9    A A  84      56.685  37.615  28.467  1.00 62.63           N  
+ATOM   1804  C8    A A  84      55.570  37.709  29.260  1.00 60.97           C  
+ATOM   1805  N7    A A  84      54.624  38.454  28.752  1.00 60.47           N  
+ATOM   1806  C5    A A  84      55.149  38.877  27.539  1.00 58.77           C  
+ATOM   1807  C6    A A  84      54.633  39.693  26.524  1.00 57.48           C  
+ATOM   1808  N6    A A  84      53.422  40.254  26.573  1.00 58.08           N  
+ATOM   1809  N1    A A  84      55.411  39.919  25.444  1.00 57.00           N  
+ATOM   1810  C2    A A  84      56.628  39.354  25.400  1.00 57.46           C  
+ATOM   1811  N3    A A  84      57.223  38.568  26.295  1.00 58.36           N  
+ATOM   1812  C4    A A  84      56.419  38.367  27.352  1.00 59.63           C  
+ATOM   1813  P     A A  85      60.045  39.705  31.960  1.00 72.98           P  
+ATOM   1814  OP1   A A  85      61.385  39.797  32.591  1.00 74.48           O  
+ATOM   1815  OP2   A A  85      58.855  40.226  32.685  1.00 72.40           O  
+ATOM   1816  O5'   A A  85      60.110  40.435  30.548  1.00 70.44           O  
+ATOM   1817  C5'   A A  85      61.253  40.307  29.714  1.00 66.23           C  
+ATOM   1818  C4'   A A  85      61.044  41.084  28.441  1.00 64.90           C  
+ATOM   1819  O4'   A A  85      59.882  40.545  27.748  1.00 62.64           O  
+ATOM   1820  C3'   A A  85      60.699  42.549  28.626  1.00 62.94           C  
+ATOM   1821  O3'   A A  85      61.844  43.363  28.835  1.00 63.23           O  
+ATOM   1822  C2'   A A  85      59.984  42.868  27.322  1.00 61.52           C  
+ATOM   1823  O2'   A A  85      60.881  43.020  26.246  1.00 61.55           O  
+ATOM   1824  C1'   A A  85      59.174  41.592  27.113  1.00 58.58           C  
+ATOM   1825  N9    A A  85      57.869  41.712  27.755  1.00 55.06           N  
+ATOM   1826  C8    A A  85      57.468  41.210  28.962  1.00 53.46           C  
+ATOM   1827  N7    A A  85      56.235  41.526  29.280  1.00 53.24           N  
+ATOM   1828  C5    A A  85      55.794  42.281  28.202  1.00 51.20           C  
+ATOM   1829  C6    A A  85      54.571  42.927  27.926  1.00 51.15           C  
+ATOM   1830  N6    A A  85      53.514  42.908  28.743  1.00 50.33           N  
+ATOM   1831  N1    A A  85      54.469  43.605  26.763  1.00 51.08           N  
+ATOM   1832  C2    A A  85      55.521  43.623  25.939  1.00 49.66           C  
+ATOM   1833  N3    A A  85      56.712  43.057  26.085  1.00 51.02           N  
+ATOM   1834  C4    A A  85      56.787  42.396  27.253  1.00 52.63           C  
+ATOM   1835  P     G A  86      61.717  44.687  29.747  1.00 63.01           P  
+ATOM   1836  OP1   G A  86      63.080  45.233  29.962  1.00 63.49           O  
+ATOM   1837  OP2   G A  86      60.860  44.331  30.912  1.00 62.23           O  
+ATOM   1838  O5'   G A  86      60.926  45.717  28.830  1.00 60.62           O  
+ATOM   1839  C5'   G A  86      61.397  46.003  27.524  1.00 57.16           C  
+ATOM   1840  C4'   G A  86      60.338  46.713  26.717  1.00 54.53           C  
+ATOM   1841  O4'   G A  86      59.166  45.857  26.587  1.00 53.07           O  
+ATOM   1842  C3'   G A  86      59.774  47.960  27.371  1.00 53.14           C  
+ATOM   1843  O3'   G A  86      60.618  49.084  27.216  1.00 51.63           O  
+ATOM   1844  C2'   G A  86      58.432  48.112  26.672  1.00 52.73           C  
+ATOM   1845  O2'   G A  86      58.570  48.629  25.368  1.00 50.58           O  
+ATOM   1846  C1'   G A  86      57.994  46.657  26.559  1.00 51.72           C  
+ATOM   1847  N9    G A  86      57.100  46.230  27.628  1.00 50.07           N  
+ATOM   1848  C8    G A  86      57.353  45.289  28.594  1.00 50.13           C  
+ATOM   1849  N7    G A  86      56.333  45.083  29.386  1.00 49.23           N  
+ATOM   1850  C5    G A  86      55.355  45.948  28.923  1.00 48.44           C  
+ATOM   1851  C6    G A  86      54.036  46.158  29.377  1.00 50.00           C  
+ATOM   1852  O6    G A  86      53.447  45.603  30.304  1.00 52.45           O  
+ATOM   1853  N1    G A  86      53.379  47.127  28.628  1.00 49.28           N  
+ATOM   1854  C2    G A  86      53.924  47.806  27.575  1.00 48.05           C  
+ATOM   1855  N2    G A  86      53.121  48.698  27.001  1.00 46.91           N  
+ATOM   1856  N3    G A  86      55.161  47.618  27.128  1.00 47.93           N  
+ATOM   1857  C4    G A  86      55.814  46.677  27.847  1.00 48.84           C  
+ATOM   1858  P     A A  87      60.528  50.278  28.276  1.00 48.22           P  
+ATOM   1859  OP1   A A  87      61.493  51.324  27.903  1.00 50.47           O  
+ATOM   1860  OP2   A A  87      60.599  49.663  29.612  1.00 48.71           O  
+ATOM   1861  O5'   A A  87      59.072  50.870  28.036  1.00 47.96           O  
+ATOM   1862  C5'   A A  87      58.810  51.665  26.888  1.00 45.52           C  
+ATOM   1863  C4'   A A  87      57.420  52.245  26.944  1.00 45.17           C  
+ATOM   1864  O4'   A A  87      56.474  51.163  27.023  1.00 44.86           O  
+ATOM   1865  C3'   A A  87      57.104  53.065  28.183  1.00 47.55           C  
+ATOM   1866  O3'   A A  87      57.553  54.398  28.043  1.00 48.74           O  
+ATOM   1867  C2'   A A  87      55.590  52.985  28.257  1.00 45.69           C  
+ATOM   1868  O2'   A A  87      54.966  53.829  27.315  1.00 46.31           O  
+ATOM   1869  C1'   A A  87      55.363  51.547  27.819  1.00 43.13           C  
+ATOM   1870  N9    A A  87      55.242  50.601  28.918  1.00 40.51           N  
+ATOM   1871  C8    A A  87      56.174  49.711  29.374  1.00 40.58           C  
+ATOM   1872  N7    A A  87      55.738  48.948  30.344  1.00 41.86           N  
+ATOM   1873  C5    A A  87      54.439  49.376  30.546  1.00 38.70           C  
+ATOM   1874  C6    A A  87      53.436  48.953  31.422  1.00 38.67           C  
+ATOM   1875  N6    A A  87      53.591  47.957  32.293  1.00 38.56           N  
+ATOM   1876  N1    A A  87      52.246  49.589  31.368  1.00 40.88           N  
+ATOM   1877  C2    A A  87      52.088  50.575  30.477  1.00 41.68           C  
+ATOM   1878  N3    A A  87      52.958  51.054  29.589  1.00 40.58           N  
+ATOM   1879  C4    A A  87      54.126  50.402  29.681  1.00 39.79           C  
+ATOM   1880  P     U A  88      58.198  55.136  29.302  1.00 48.29           P  
+ATOM   1881  OP1   U A  88      58.993  56.266  28.738  1.00 47.03           O  
+ATOM   1882  OP2   U A  88      58.870  54.083  30.122  1.00 47.21           O  
+ATOM   1883  O5'   U A  88      56.917  55.689  30.075  1.00 47.92           O  
+ATOM   1884  C5'   U A  88      56.127  56.707  29.482  1.00 47.38           C  
+ATOM   1885  C4'   U A  88      54.808  56.850  30.197  1.00 47.01           C  
+ATOM   1886  O4'   U A  88      54.078  55.598  30.095  1.00 47.37           O  
+ATOM   1887  C3'   U A  88      54.903  57.067  31.692  1.00 47.34           C  
+ATOM   1888  O3'   U A  88      55.161  58.407  32.052  1.00 47.14           O  
+ATOM   1889  C2'   U A  88      53.536  56.615  32.152  1.00 46.01           C  
+ATOM   1890  O2'   U A  88      52.617  57.604  31.753  1.00 46.16           O  
+ATOM   1891  C1'   U A  88      53.334  55.384  31.278  1.00 44.84           C  
+ATOM   1892  N1    U A  88      53.835  54.171  31.938  1.00 43.85           N  
+ATOM   1893  C2    U A  88      53.089  53.677  32.974  1.00 44.35           C  
+ATOM   1894  O2    U A  88      52.073  54.213  33.349  1.00 47.48           O  
+ATOM   1895  N3    U A  88      53.572  52.538  33.563  1.00 42.79           N  
+ATOM   1896  C4    U A  88      54.705  51.864  33.226  1.00 43.22           C  
+ATOM   1897  O4    U A  88      55.018  50.851  33.858  1.00 44.99           O  
+ATOM   1898  C5    U A  88      55.436  52.443  32.140  1.00 43.46           C  
+ATOM   1899  C6    U A  88      54.985  53.554  31.549  1.00 43.73           C  
+ATOM   1900  P     G A  89      56.009  58.702  33.383  1.00 46.16           P  
+ATOM   1901  OP1   G A  89      56.494  60.099  33.290  1.00 45.41           O  
+ATOM   1902  OP2   G A  89      56.980  57.592  33.512  1.00 42.04           O  
+ATOM   1903  O5'   G A  89      54.938  58.588  34.557  1.00 45.55           O  
+ATOM   1904  C5'   G A  89      53.772  59.397  34.546  1.00 45.93           C  
+ATOM   1905  C4'   G A  89      52.792  58.945  35.610  1.00 47.23           C  
+ATOM   1906  O4'   G A  89      52.385  57.568  35.369  1.00 48.15           O  
+ATOM   1907  C3'   G A  89      53.329  58.926  37.034  1.00 47.10           C  
+ATOM   1908  O3'   G A  89      53.245  60.232  37.593  1.00 48.88           O  
+ATOM   1909  C2'   G A  89      52.396  57.933  37.723  1.00 46.50           C  
+ATOM   1910  O2'   G A  89      51.145  58.503  38.102  1.00 44.07           O  
+ATOM   1911  C1'   G A  89      52.178  56.906  36.608  1.00 45.89           C  
+ATOM   1912  N9    G A  89      53.064  55.750  36.658  1.00 43.74           N  
+ATOM   1913  C8    G A  89      54.217  55.571  35.944  1.00 43.64           C  
+ATOM   1914  N7    G A  89      54.781  54.412  36.166  1.00 43.02           N  
+ATOM   1915  C5    G A  89      53.952  53.797  37.091  1.00 41.41           C  
+ATOM   1916  C6    G A  89      54.056  52.525  37.720  1.00 41.45           C  
+ATOM   1917  O6    G A  89      54.923  51.659  37.572  1.00 42.99           O  
+ATOM   1918  N1    G A  89      53.011  52.301  38.601  1.00 40.30           N  
+ATOM   1919  C2    G A  89      51.997  53.182  38.846  1.00 43.16           C  
+ATOM   1920  N2    G A  89      51.077  52.782  39.723  1.00 44.32           N  
+ATOM   1921  N3    G A  89      51.887  54.375  38.271  1.00 43.05           N  
+ATOM   1922  C4    G A  89      52.893  54.612  37.411  1.00 41.85           C  
+ATOM   1923  P     A A  90      54.261  60.673  38.754  1.00 49.33           P  
+ATOM   1924  OP1   A A  90      53.796  62.025  39.132  1.00 50.89           O  
+ATOM   1925  OP2   A A  90      55.663  60.483  38.318  1.00 50.02           O  
+ATOM   1926  O5'   A A  90      53.920  59.654  39.935  1.00 48.11           O  
+ATOM   1927  C5'   A A  90      52.697  59.783  40.661  1.00 46.82           C  
+ATOM   1928  C4'   A A  90      52.547  58.662  41.657  1.00 46.54           C  
+ATOM   1929  O4'   A A  90      52.472  57.405  40.938  1.00 46.05           O  
+ATOM   1930  C3'   A A  90      53.729  58.460  42.584  1.00 48.87           C  
+ATOM   1931  O3'   A A  90      53.706  59.332  43.695  1.00 53.87           O  
+ATOM   1932  C2'   A A  90      53.565  57.013  43.002  1.00 47.31           C  
+ATOM   1933  O2'   A A  90      52.561  56.871  43.985  1.00 50.65           O  
+ATOM   1934  C1'   A A  90      53.097  56.384  41.694  1.00 43.08           C  
+ATOM   1935  N9    A A  90      54.200  55.832  40.911  1.00 39.20           N  
+ATOM   1936  C8    A A  90      54.964  56.432  39.942  1.00 37.90           C  
+ATOM   1937  N7    A A  90      55.882  55.642  39.432  1.00 35.96           N  
+ATOM   1938  C5    A A  90      55.706  54.448  40.111  1.00 34.77           C  
+ATOM   1939  C6    A A  90      56.367  53.206  40.038  1.00 37.49           C  
+ATOM   1940  N6    A A  90      57.370  52.939  39.203  1.00 40.40           N  
+ATOM   1941  N1    A A  90      55.950  52.227  40.865  1.00 37.63           N  
+ATOM   1942  C2    A A  90      54.933  52.484  41.695  1.00 37.37           C  
+ATOM   1943  N3    A A  90      54.233  53.606  41.850  1.00 35.09           N  
+ATOM   1944  C4    A A  90      54.677  54.554  41.023  1.00 35.63           C  
+ATOM   1945  P     G A  91      55.092  59.795  44.359  1.00 56.70           P  
+ATOM   1946  OP1   G A  91      54.771  60.922  45.270  1.00 57.70           O  
+ATOM   1947  OP2   G A  91      56.117  59.995  43.298  1.00 55.05           O  
+ATOM   1948  O5'   G A  91      55.497  58.514  45.213  1.00 54.40           O  
+ATOM   1949  C5'   G A  91      54.652  58.066  46.257  1.00 55.05           C  
+ATOM   1950  C4'   G A  91      55.146  56.755  46.819  1.00 57.40           C  
+ATOM   1951  O4'   G A  91      54.959  55.689  45.845  1.00 57.63           O  
+ATOM   1952  C3'   G A  91      56.630  56.703  47.121  1.00 58.60           C  
+ATOM   1953  O3'   G A  91      56.928  57.302  48.366  1.00 62.00           O  
+ATOM   1954  C2'   G A  91      56.905  55.208  47.110  1.00 57.65           C  
+ATOM   1955  O2'   G A  91      56.449  54.586  48.296  1.00 61.81           O  
+ATOM   1956  C1'   G A  91      56.021  54.752  45.950  1.00 56.16           C  
+ATOM   1957  N9    G A  91      56.782  54.738  44.704  1.00 51.72           N  
+ATOM   1958  C8    G A  91      56.926  55.756  43.791  1.00 49.57           C  
+ATOM   1959  N7    G A  91      57.738  55.451  42.813  1.00 47.94           N  
+ATOM   1960  C5    G A  91      58.138  54.151  43.090  1.00 47.47           C  
+ATOM   1961  C6    G A  91      59.021  53.291  42.388  1.00 48.13           C  
+ATOM   1962  O6    G A  91      59.639  53.516  41.342  1.00 49.59           O  
+ATOM   1963  N1    G A  91      59.152  52.056  43.022  1.00 46.53           N  
+ATOM   1964  C2    G A  91      58.509  51.695  44.184  1.00 45.93           C  
+ATOM   1965  N2    G A  91      58.759  50.457  44.657  1.00 43.94           N  
+ATOM   1966  N3    G A  91      57.678  52.491  44.842  1.00 46.16           N  
+ATOM   1967  C4    G A  91      57.544  53.693  44.244  1.00 48.37           C  
+ATOM   1968  P     C A  92      58.460  57.535  48.781  1.00 65.24           P  
+ATOM   1969  OP1   C A  92      58.483  58.295  50.060  1.00 65.63           O  
+ATOM   1970  OP2   C A  92      59.219  58.050  47.604  1.00 65.80           O  
+ATOM   1971  O5'   C A  92      58.959  56.063  49.081  1.00 61.36           O  
+ATOM   1972  C5'   C A  92      60.332  55.789  49.189  1.00 58.00           C  
+ATOM   1973  C4'   C A  92      60.583  54.344  48.883  1.00 54.97           C  
+ATOM   1974  O4'   C A  92      59.894  53.989  47.667  1.00 54.29           O  
+ATOM   1975  C3'   C A  92      62.029  54.026  48.617  1.00 55.01           C  
+ATOM   1976  O3'   C A  92      62.681  53.819  49.854  1.00 55.30           O  
+ATOM   1977  C2'   C A  92      61.934  52.781  47.754  1.00 53.19           C  
+ATOM   1978  O2'   C A  92      61.752  51.585  48.477  1.00 54.48           O  
+ATOM   1979  C1'   C A  92      60.689  53.090  46.926  1.00 52.53           C  
+ATOM   1980  N1    C A  92      61.028  53.742  45.664  1.00 49.85           N  
+ATOM   1981  C2    C A  92      61.710  53.010  44.726  1.00 49.42           C  
+ATOM   1982  O2    C A  92      61.987  51.826  44.989  1.00 51.77           O  
+ATOM   1983  N3    C A  92      62.054  53.592  43.561  1.00 49.14           N  
+ATOM   1984  C4    C A  92      61.722  54.858  43.328  1.00 49.22           C  
+ATOM   1985  N4    C A  92      62.086  55.389  42.166  1.00 49.50           N  
+ATOM   1986  C5    C A  92      61.004  55.632  44.276  1.00 49.21           C  
+ATOM   1987  C6    C A  92      60.683  55.041  45.421  1.00 49.19           C  
+ATOM   1988  P     C A  93      64.095  54.516  50.109  1.00 55.71           P  
+ATOM   1989  OP1   C A  93      64.369  54.474  51.568  1.00 57.76           O  
+ATOM   1990  OP2   C A  93      64.088  55.822  49.397  1.00 55.38           O  
+ATOM   1991  O5'   C A  93      65.104  53.533  49.376  1.00 55.30           O  
+ATOM   1992  C5'   C A  93      65.215  52.186  49.814  1.00 55.96           C  
+ATOM   1993  C4'   C A  93      66.119  51.421  48.893  1.00 57.33           C  
+ATOM   1994  O4'   C A  93      65.506  51.340  47.586  1.00 56.23           O  
+ATOM   1995  C3'   C A  93      67.453  52.093  48.646  1.00 58.35           C  
+ATOM   1996  O3'   C A  93      68.358  51.720  49.676  1.00 60.91           O  
+ATOM   1997  C2'   C A  93      67.859  51.519  47.295  1.00 56.28           C  
+ATOM   1998  O2'   C A  93      68.444  50.245  47.419  1.00 56.69           O  
+ATOM   1999  C1'   C A  93      66.505  51.408  46.587  1.00 53.87           C  
+ATOM   2000  N1    C A  93      66.164  52.519  45.689  1.00 50.29           N  
+ATOM   2001  C2    C A  93      66.553  52.449  44.357  1.00 48.90           C  
+ATOM   2002  O2    C A  93      67.196  51.459  43.974  1.00 49.47           O  
+ATOM   2003  N3    C A  93      66.219  53.459  43.516  1.00 47.11           N  
+ATOM   2004  C4    C A  93      65.528  54.508  43.973  1.00 45.79           C  
+ATOM   2005  N4    C A  93      65.205  55.474  43.112  1.00 47.26           N  
+ATOM   2006  C5    C A  93      65.134  54.610  45.330  1.00 45.95           C  
+ATOM   2007  C6    C A  93      65.467  53.599  46.149  1.00 48.81           C  
+ATOM   2008  P     A A  94      69.700  52.565  49.893  1.00 63.26           P  
+ATOM   2009  OP1   A A  94      70.472  51.929  51.000  1.00 63.03           O  
+ATOM   2010  OP2   A A  94      69.311  54.001  49.989  1.00 63.37           O  
+ATOM   2011  O5'   A A  94      70.490  52.381  48.519  1.00 61.77           O  
+ATOM   2012  C5'   A A  94      71.326  51.253  48.283  1.00 61.29           C  
+ATOM   2013  C4'   A A  94      72.146  51.475  47.027  1.00 62.44           C  
+ATOM   2014  O4'   A A  94      71.241  51.538  45.895  1.00 61.92           O  
+ATOM   2015  C3'   A A  94      72.937  52.778  46.954  1.00 63.29           C  
+ATOM   2016  O3'   A A  94      74.230  52.643  47.539  1.00 63.03           O  
+ATOM   2017  C2'   A A  94      73.070  52.992  45.454  1.00 63.82           C  
+ATOM   2018  O2'   A A  94      74.136  52.237  44.902  1.00 65.97           O  
+ATOM   2019  C1'   A A  94      71.721  52.471  44.948  1.00 62.06           C  
+ATOM   2020  N9    A A  94      70.717  53.521  44.818  1.00 60.30           N  
+ATOM   2021  C8    A A  94      69.962  54.073  45.821  1.00 60.55           C  
+ATOM   2022  N7    A A  94      69.162  55.030  45.415  1.00 59.61           N  
+ATOM   2023  C5    A A  94      69.401  55.106  44.053  1.00 59.00           C  
+ATOM   2024  C6    A A  94      68.872  55.924  43.063  1.00 58.81           C  
+ATOM   2025  N6    A A  94      67.974  56.874  43.310  1.00 59.79           N  
+ATOM   2026  N1    A A  94      69.307  55.745  41.796  1.00 58.99           N  
+ATOM   2027  C2    A A  94      70.230  54.798  41.564  1.00 59.88           C  
+ATOM   2028  N3    A A  94      70.812  53.965  42.421  1.00 59.48           N  
+ATOM   2029  C4    A A  94      70.348  54.174  43.666  1.00 59.71           C  
+TER    2030        A A  94                                                      
+HETATM 2031 MG    MG A 205      44.673  52.089  21.066  1.00 52.79          MG  
+HETATM 2032 MG    MG A 206      57.959  37.961  33.008  1.00 75.51          MG  
+HETATM 2033 IR   IRI A 201      53.885  56.740  -0.635  1.00 98.98          IR  
+HETATM 2034  N1  IRI A 201      52.485  58.054  -1.822  1.00 97.67           N  
+HETATM 2035  N2  IRI A 201      54.266  58.382   0.816  1.00 98.55           N  
+HETATM 2036  N3  IRI A 201      55.233  55.348   0.506  1.00 98.59           N  
+HETATM 2037  N4  IRI A 201      53.497  55.076  -2.135  1.00 99.01           N  
+HETATM 2038  N5  IRI A 201      52.127  56.049   0.598  1.00 98.22           N  
+HETATM 2039  N6  IRI A 201      55.669  57.413  -1.820  1.00 99.00           N  
+HETATM 2040 IR   IRI A 202      53.580  69.128  10.808  1.00 85.21          IR  
+HETATM 2041  N1  IRI A 202      51.863  70.294   9.931  1.00 85.46           N  
+HETATM 2042  N2  IRI A 202      53.979  70.743  12.294  1.00 85.76           N  
+HETATM 2043  N3  IRI A 202      55.263  67.867  11.657  1.00 84.55           N  
+HETATM 2044  N4  IRI A 202      53.191  67.483   9.307  1.00 85.84           N  
+HETATM 2045  N5  IRI A 202      52.135  68.142  12.244  1.00 85.61           N  
+HETATM 2046  N6  IRI A 202      55.040  70.069   9.391  1.00 85.28           N  
+HETATM 2047 IR   IRI A 203      61.715  45.974  13.576  1.00 89.54          IR  
+HETATM 2048  N1  IRI A 203      60.528  47.751  14.317  1.00 90.96           N  
+HETATM 2049  N2  IRI A 203      60.570  44.590  14.901  1.00 90.31           N  
+HETATM 2050  N3  IRI A 203      62.943  44.257  12.747  1.00 91.15           N  
+HETATM 2051  N4  IRI A 203      62.898  47.359  12.224  1.00 90.58           N  
+HETATM 2052  N5  IRI A 203      60.217  45.694  11.915  1.00 90.65           N  
+HETATM 2053  N6  IRI A 203      63.229  46.280  15.197  1.00 90.26           N  
+HETATM 2054 IR   IRI A 204      58.679  49.493  35.312  1.00 49.00          IR  
+HETATM 2055  N1  IRI A 204      57.796  50.488  33.496  1.00 51.75           N  
+HETATM 2056  N2  IRI A 204      56.792  49.834  36.443  1.00 50.76           N  
+HETATM 2057  N3  IRI A 204      59.668  48.489  37.085  1.00 53.82           N  
+HETATM 2058  N4  IRI A 204      60.576  49.136  34.184  1.00 51.33           N  
+HETATM 2059  N5  IRI A 204      57.947  47.503  34.598  1.00 53.62           N  
+HETATM 2060  N6  IRI A 204      59.488  51.435  36.079  1.00 53.26           N  
+HETATM 2061  N   SAM A 301      48.661  58.442  29.234  1.00 71.76           N  
+HETATM 2062  CA  SAM A 301      48.892  57.767  27.953  1.00 71.83           C  
+HETATM 2063  C   SAM A 301      47.728  58.043  27.018  1.00 73.09           C  
+HETATM 2064  O   SAM A 301      47.747  57.608  25.870  1.00 74.98           O  
+HETATM 2065  OXT SAM A 301      46.793  58.755  27.385  1.00 73.14           O  
+HETATM 2066  CB  SAM A 301      49.051  56.247  28.156  1.00 70.42           C  
+HETATM 2067  CG  SAM A 301      49.924  55.993  29.384  1.00 68.18           C  
+HETATM 2068  SD  SAM A 301      50.180  54.222  29.811  1.00 68.57           S  
+HETATM 2069  CE  SAM A 301      49.547  53.321  28.362  1.00 68.16           C  
+HETATM 2070  C5' SAM A 301      48.781  54.097  30.945  1.00 63.51           C  
+HETATM 2071  C4' SAM A 301      49.142  54.393  32.411  1.00 61.14           C  
+HETATM 2072  O4' SAM A 301      49.826  55.679  32.483  1.00 59.00           O  
+HETATM 2073  C3' SAM A 301      47.793  54.604  33.049  1.00 59.63           C  
+HETATM 2074  O3' SAM A 301      47.357  53.395  33.671  1.00 61.69           O  
+HETATM 2075  C2' SAM A 301      48.045  55.680  34.098  1.00 58.07           C  
+HETATM 2076  O2' SAM A 301      48.258  55.128  35.392  1.00 60.89           O  
+HETATM 2077  C1' SAM A 301      49.315  56.473  33.618  1.00 56.29           C  
+HETATM 2078  N9  SAM A 301      49.019  57.807  33.055  1.00 52.35           N  
+HETATM 2079  C8  SAM A 301      49.941  58.804  32.897  1.00 49.96           C  
+HETATM 2080  N7  SAM A 301      49.391  59.863  32.379  1.00 49.17           N  
+HETATM 2081  C5  SAM A 301      48.084  59.618  32.158  1.00 49.87           C  
+HETATM 2082  C6  SAM A 301      47.000  60.356  31.619  1.00 49.12           C  
+HETATM 2083  N6  SAM A 301      47.179  61.649  31.181  1.00 49.12           N  
+HETATM 2084  N1  SAM A 301      45.794  59.770  31.541  1.00 48.62           N  
+HETATM 2085  C2  SAM A 301      45.596  58.512  31.950  1.00 48.26           C  
+HETATM 2086  N3  SAM A 301      46.578  57.797  32.476  1.00 48.84           N  
+HETATM 2087  C4  SAM A 301      47.821  58.293  32.591  1.00 50.12           C  
+HETATM 2088  O   HOH A 401      57.434  67.701   5.730  1.00 62.83           O  
+HETATM 2089  O   HOH A 402      66.189  60.895   3.390  1.00102.86           O  
+HETATM 2090  O   HOH A 403      41.692  28.822  12.775  1.00 79.78           O  
+HETATM 2091  O   HOH A 404      58.520  32.372  29.001  1.00 87.70           O  
+HETATM 2092  O   HOH A 405      41.683  78.187  34.648  1.00 90.77           O  
+HETATM 2093  O   HOH A 406      39.116  52.800  26.854  1.00 47.35           O  
+HETATM 2094  O   HOH A 407      60.473  27.307  22.789  1.00 55.76           O  
+HETATM 2095  O   HOH A 408      66.992  61.289  13.604  1.00 74.35           O  
+HETATM 2096  O   HOH A 409      54.344  44.338  21.904  1.00 44.49           O  
+HETATM 2097  O   HOH A 410      44.691  72.338  12.049  1.00 50.99           O  
+HETATM 2098  O   HOH A 411      40.751  63.603  43.590  1.00 89.83           O  
+HETATM 2099  O   HOH A 412      53.645  41.356   9.844  1.00 90.63           O  
+HETATM 2100  O   HOH A 413      59.949  37.796  24.955  1.00 70.80           O  
+HETATM 2101  O   HOH A 415      51.339  54.431  20.373  1.00 76.96           O  
+HETATM 2102  O   HOH A 416      37.653  77.331  42.105  1.00104.47           O  
+HETATM 2103  O   HOH A 417      52.864  38.162  12.617  1.00 80.23           O  
+HETATM 2104  O   HOH A 418      70.042  75.630   9.251  1.00 96.14           O  
+HETATM 2105  O   HOH A 419      57.849  36.827  16.245  1.00 55.25           O  
+HETATM 2106  O   HOH A 420      51.199  53.647  16.824  1.00 68.61           O  
+HETATM 2107  O   HOH A 421      46.270  42.361  39.422  1.00 86.08           O  
+HETATM 2108  O   HOH A 422      39.748  46.501  33.723  1.00 90.52           O  
+HETATM 2109  O   HOH A 423      55.402  30.310  22.335  1.00153.77           O  
+HETATM 2110  O   HOH A 424      62.850  37.633  36.622  1.00 93.90           O  
+HETATM 2111  O   HOH A 425      52.620  28.934  10.172  1.00 66.53           O  
+HETATM 2112  O   HOH A 426      46.043  72.059  15.009  1.00 81.11           O  
+HETATM 2113  O   HOH A 427      44.504  24.559  13.975  1.00 95.67           O  
+HETATM 2114  O   HOH A 428      64.390  51.541   8.357  1.00 96.89           O  
+HETATM 2115  O   HOH A 429      62.387  43.098  34.217  1.00 62.96           O  
+HETATM 2116  O   HOH A 430      40.781  42.498  19.177  1.00 95.04           O  
+HETATM 2117  O   HOH A 431      51.714  28.135  30.983  1.00 99.10           O  
+HETATM 2118  O   HOH A 432      56.277  41.684  42.172  1.00 76.07           O  
+HETATM 2119  O   HOH A 433      71.383  70.114   4.691  1.00115.24           O  
+HETATM 2120  O   HOH A 434      43.954  36.036  19.243  1.00 60.36           O  
+HETATM 2121  O   HOH A 435      42.927  80.090  37.718  1.00 93.62           O  
+HETATM 2122  O   HOH A 436      57.157  36.207  23.849  1.00 66.99           O  
+HETATM 2123  O   HOH A 437      50.487  54.395  35.797  1.00115.03           O  
+HETATM 2124  O   HOH A 438      42.557  37.639  16.483  1.00104.97           O  
+HETATM 2125  O   HOH A 439      52.517  25.349   8.099  1.00 83.24           O  
+HETATM 2126  O   HOH A 440      43.812  69.893  17.618  1.00 74.07           O  
+HETATM 2127  O   HOH A 441      42.386  49.215  25.612  1.00 87.62           O  
+HETATM 2128  O   HOH A 442      43.738  47.793  12.611  1.00 97.20           O  
+HETATM 2129  O   HOH A 443      56.851  56.881  11.453  1.00 65.45           O  
+HETATM 2130  O   HOH A 444      41.494  28.883  24.574  1.00 68.68           O  
+HETATM 2131  O   HOH A 445      66.299  67.845  11.185  1.00119.36           O  
+HETATM 2132  O   HOH A 446      44.327  43.962  37.114  1.00 59.00           O  
+HETATM 2133  O   HOH A 447      55.964  29.615  20.081  1.00 95.39           O  
+HETATM 2134  O   HOH A 448      57.973  59.050  -2.009  1.00109.16           O  
+HETATM 2135  O   HOH A 449      59.402  59.312  31.449  1.00 68.84           O  
+HETATM 2136  O   HOH A 450      43.007  16.103  21.017  1.00106.73           O  
+HETATM 2137  O   HOH A 451      42.422  49.150  15.212  1.00 78.44           O  
+HETATM 2138  O   HOH A 452      70.835  47.923  38.230  1.00 80.61           O  
+HETATM 2139  O   HOH A 453      61.705  64.436  22.275  1.00 84.32           O  
+HETATM 2140  O   HOH A 454      46.943  51.613  25.671  1.00 73.11           O  
+HETATM 2141  O   HOH A 455      54.648  46.163  19.618  1.00 62.24           O  
+HETATM 2142  O   HOH A 456      38.484  46.751  20.701  1.00 56.54           O  
+HETATM 2143  O   HOH A 457      60.794  35.462  31.358  1.00109.99           O  
+HETATM 2144  O   HOH A 458      44.895  54.912  35.019  1.00 81.53           O  
+HETATM 2145  O   HOH A 459      60.469  54.509  19.865  1.00 78.35           O  
+HETATM 2146  O   HOH A 460      40.557  49.152  31.709  1.00 94.98           O  
+HETATM 2147  O   HOH A 461      49.564  72.961   7.126  1.00127.46           O  
+HETATM 2148  O   HOH A 462      38.911  32.924  24.206  1.00 94.52           O  
+HETATM 2149  O   HOH A 463      44.840  67.115  17.805  1.00 64.28           O  
+HETATM 2150  O   HOH A 464      59.959  60.408  29.152  1.00 87.28           O  
+HETATM 2151  O   HOH A 465      47.480  63.127  48.379  1.00106.79           O  
+HETATM 2152  O   HOH A 466      41.379  47.530  27.555  1.00 63.18           O  
+HETATM 2153  O   HOH A 467      55.256  41.519  33.323  1.00 88.02           O  
+HETATM 2154  O   HOH A 468      46.278  35.257  34.883  1.00103.21           O  
+HETATM 2155  O   HOH A 469      50.168  44.685  11.400  1.00 84.54           O  
+HETATM 2156  O   HOH A 470      55.140  23.817   9.150  1.00 80.25           O  
+HETATM 2157  O   HOH A 471      59.853  74.716   4.618  1.00 98.69           O  
+HETATM 2158  O   HOH A 472      50.122  40.345  41.076  1.00 96.48           O  
+HETATM 2159  O   HOH A 473      65.972  41.974  36.431  1.00117.24           O  
+HETATM 2160  O   HOH A 474      55.172  63.267  37.006  1.00103.99           O  
+HETATM 2161  O   HOH A 475      57.260  52.484  35.826  1.00 36.48           O  
+HETATM 2162  O   HOH A 476      47.778  19.952   7.533  1.00 98.79           O  
+HETATM 2163  O   HOH A 477      61.467  73.402   3.421  1.00 91.53           O  
+HETATM 2164  O   HOH A 478      58.411  68.300  -1.259  1.00 79.23           O  
+HETATM 2165  O   HOH A 479      41.220  45.034  19.654  1.00104.86           O  
+HETATM 2166  O   HOH A 480      55.599  58.758  22.542  1.00 99.09           O  
+HETATM 2167  O   HOH A 481      53.744  43.835  45.686  1.00120.41           O  
+HETATM 2168  O   HOH A 482      59.195  65.528  18.099  1.00 79.51           O  
+HETATM 2169  O   HOH A 483      61.286  41.409  39.993  1.00 90.87           O  
+HETATM 2170  O   HOH A 484      49.047  34.291  16.948  1.00101.95           O  
+HETATM 2171  O   HOH A 485      51.730  71.388  25.674  1.00 52.14           O  
+HETATM 2172  O   HOH A 486      49.629  29.507  20.165  1.00 58.18           O  
+HETATM 2173  O   HOH A 487      39.919  50.462  26.232  1.00 67.53           O  
+HETATM 2174  O   HOH A 488      64.965  67.977   4.650  1.00 80.20           O  
+HETATM 2175  O   HOH A 489      48.890  37.269  24.529  1.00 49.39           O  
+CONECT  194 2031                                                                
+CONECT 1351 2031                                                                
+CONECT 1365 2031                                                                
+CONECT 1792 2032                                                                
+CONECT 1794 2032                                                                
+CONECT 1799 2032                                                                
+CONECT 1815 2032                                                                
+CONECT 2031  194 1351 1365                                                      
+CONECT 2032 1792 1794 1799 1815                                                 
+CONECT 2033 2034 2035 2036 2037                                                 
+CONECT 2033 2038 2039                                                           
+CONECT 2034 2033                                                                
+CONECT 2035 2033                                                                
+CONECT 2036 2033                                                                
+CONECT 2037 2033                                                                
+CONECT 2038 2033                                                                
+CONECT 2039 2033                                                                
+CONECT 2040 2041 2042 2043 2044                                                 
+CONECT 2040 2045 2046                                                           
+CONECT 2041 2040                                                                
+CONECT 2042 2040                                                                
+CONECT 2043 2040                                                                
+CONECT 2044 2040                                                                
+CONECT 2045 2040                                                                
+CONECT 2046 2040                                                                
+CONECT 2047 2048 2049 2050 2051                                                 
+CONECT 2047 2052 2053                                                           
+CONECT 2048 2047                                                                
+CONECT 2049 2047                                                                
+CONECT 2050 2047                                                                
+CONECT 2051 2047                                                                
+CONECT 2052 2047                                                                
+CONECT 2053 2047                                                                
+CONECT 2054 2055 2056 2057 2058                                                 
+CONECT 2054 2059 2060                                                           
+CONECT 2055 2054                                                                
+CONECT 2056 2054                                                                
+CONECT 2057 2054                                                                
+CONECT 2058 2054                                                                
+CONECT 2059 2054                                                                
+CONECT 2060 2054                                                                
+CONECT 2061 2062                                                                
+CONECT 2062 2061 2063 2066                                                      
+CONECT 2063 2062 2064 2065                                                      
+CONECT 2064 2063                                                                
+CONECT 2065 2063                                                                
+CONECT 2066 2062 2067                                                           
+CONECT 2067 2066 2068                                                           
+CONECT 2068 2067 2069 2070                                                      
+CONECT 2069 2068                                                                
+CONECT 2070 2068 2071                                                           
+CONECT 2071 2070 2072 2073                                                      
+CONECT 2072 2071 2077                                                           
+CONECT 2073 2071 2074 2075                                                      
+CONECT 2074 2073                                                                
+CONECT 2075 2073 2076 2077                                                      
+CONECT 2076 2075                                                                
+CONECT 2077 2072 2075 2078                                                      
+CONECT 2078 2077 2079 2087                                                      
+CONECT 2079 2078 2080                                                           
+CONECT 2080 2079 2081                                                           
+CONECT 2081 2080 2082 2087                                                      
+CONECT 2082 2081 2083 2084                                                      
+CONECT 2083 2082                                                                
+CONECT 2084 2082 2085                                                           
+CONECT 2085 2084 2086                                                           
+CONECT 2086 2085 2087                                                           
+CONECT 2087 2078 2081 2086                                                      
+MASTER      373    0    7    0    0    0   13    6 2174    1   68    8          
+END                                                                             
diff --git a/utils/jalviewjs/site-resources/examples/3W5V.pdb b/utils/jalviewjs/site-resources/examples/3W5V.pdb
new file mode 100644 (file)
index 0000000..8af59d9
--- /dev/null
@@ -0,0 +1,7088 @@
+HEADER    ELECTRON TRANSPORT                      06-FEB-13   3W5V              
+TITLE     CROSS-LINKED COMPLEX BETWEEN FERREDOXIN AND FERREDOXIN-NADP+ REDUCTASE
+COMPND    MOL_ID: 1;                                                            
+COMPND   2 MOLECULE: FERREDOXIN;                                                
+COMPND   3 CHAIN: A, C;                                                         
+COMPND   4 FRAGMENT: UNP RESIDUES 42-355;                                       
+COMPND   5 SYNONYM: FERREDOXIN--NADP REDUCTASE, LEAF ISOZYME,                   
+COMPND   6 FERREDOXINFERREDOXIN--NADP REDUCTASE, LEAF ISOZYME, UNCHARACTERIZED  
+COMPND   7 PROTEIN;                                                             
+COMPND   8 ENGINEERED: YES;                                                     
+COMPND   9 MUTATION: YES;                                                       
+COMPND  10 MOL_ID: 2;                                                           
+COMPND  11 MOLECULE: FERREDOXIN-1, CHLOROPLASTIC;                               
+COMPND  12 CHAIN: B, D;                                                         
+COMPND  13 FRAGMENT: UNP RESIDUES 53-150;                                       
+COMPND  14 SYNONYM: FERREDOXIN I, FD I;                                         
+COMPND  15 ENGINEERED: YES;                                                     
+COMPND  16 MUTATION: YES                                                        
+SOURCE    MOL_ID: 1;                                                            
+SOURCE   2 ORGANISM_SCIENTIFIC: ZEA MAYS;                                       
+SOURCE   3 ORGANISM_COMMON: MAIZE;                                              
+SOURCE   4 ORGANISM_TAXID: 4577;                                                
+SOURCE   5 GENE: L-FNRI, ZEAMMB73_343560;                                       
+SOURCE   6 EXPRESSION_SYSTEM: ESCHERICHIA COLI;                                 
+SOURCE   7 EXPRESSION_SYSTEM_TAXID: 562;                                        
+SOURCE   8 EXPRESSION_SYSTEM_VECTOR_TYPE: PLASMID;                              
+SOURCE   9 MOL_ID: 2;                                                           
+SOURCE  10 ORGANISM_SCIENTIFIC: ZEA MAYS;                                       
+SOURCE  11 ORGANISM_COMMON: MAIZE;                                              
+SOURCE  12 ORGANISM_TAXID: 4577;                                                
+SOURCE  13 GENE: FDX1, PFD1;                                                    
+SOURCE  14 EXPRESSION_SYSTEM: ESCHERICHIA COLI;                                 
+SOURCE  15 EXPRESSION_SYSTEM_TAXID: 562;                                        
+SOURCE  16 EXPRESSION_SYSTEM_VECTOR_TYPE: PLASMID                               
+KEYWDS    ELECTRON TRANSFER COMPLEX, ELECTRON TRANSPORT                         
+EXPDTA    X-RAY DIFFRACTION                                                     
+AUTHOR    Y.KIMATA-ARIGA,H.KUBOTA-KAWAI,N.MURAKI,T.HASE,G.KURISU                
+REVDAT   1   19-JUN-13 3W5V    0                                                
+JRNL        AUTH   Y.KIMATA-ARIGA,H.KUBOTA-KAWAI,Y.-H.LEE,N.MURAKI,T.IKEGAMI,   
+JRNL        AUTH 2 G.KURISU,T.HASE                                              
+JRNL        TITL   CONCENTRATION-DEPENDENT OLIGOMERIZATION OF CROSS-LINKED      
+JRNL        TITL 2 COMPLEXES BETWEEN FERREDOXIN AND FERREDOXIN-NADP(+)          
+JRNL        TITL 3 REDUCTASE                                                    
+JRNL        REF    BIOCHEM.BIOPHYS.RES.COMMUN.   V. 434   867 2013              
+JRNL        REFN                   ISSN 0006-291X                               
+JRNL        PMID   23618857                                                     
+JRNL        DOI    10.1016/J.BBRC.2013.04.033                                   
+REMARK   2                                                                      
+REMARK   2 RESOLUTION.    3.81 ANGSTROMS.                                       
+REMARK   3                                                                      
+REMARK   3 REFINEMENT.                                                          
+REMARK   3   PROGRAM     : REFMAC 5.6.0117                                      
+REMARK   3   AUTHORS     : MURSHUDOV,VAGIN,DODSON                               
+REMARK   3                                                                      
+REMARK   3    REFINEMENT TARGET : MAXIMUM LIKELIHOOD                            
+REMARK   3                                                                      
+REMARK   3  DATA USED IN REFINEMENT.                                            
+REMARK   3   RESOLUTION RANGE HIGH (ANGSTROMS) : 3.81                           
+REMARK   3   RESOLUTION RANGE LOW  (ANGSTROMS) : 35.67                          
+REMARK   3   DATA CUTOFF            (SIGMA(F)) : NULL                           
+REMARK   3   COMPLETENESS FOR RANGE        (%) : 98.3                           
+REMARK   3   NUMBER OF REFLECTIONS             : 13076                          
+REMARK   3                                                                      
+REMARK   3  FIT TO DATA USED IN REFINEMENT.                                     
+REMARK   3   CROSS-VALIDATION METHOD          : THROUGHOUT                      
+REMARK   3   FREE R VALUE TEST SET SELECTION  : RANDOM                          
+REMARK   3   R VALUE     (WORKING + TEST SET) : 0.279                           
+REMARK   3   R VALUE            (WORKING SET) : 0.277                           
+REMARK   3   FREE R VALUE                     : 0.306                           
+REMARK   3   FREE R VALUE TEST SET SIZE   (%) : 5.000                           
+REMARK   3   FREE R VALUE TEST SET COUNT      : 683                             
+REMARK   3                                                                      
+REMARK   3  FIT IN THE HIGHEST RESOLUTION BIN.                                  
+REMARK   3   TOTAL NUMBER OF BINS USED           : 20                           
+REMARK   3   BIN RESOLUTION RANGE HIGH       (A) : 3.81                         
+REMARK   3   BIN RESOLUTION RANGE LOW        (A) : 3.90                         
+REMARK   3   REFLECTION IN BIN     (WORKING SET) : 878                          
+REMARK   3   BIN COMPLETENESS (WORKING+TEST) (%) : 93.74                        
+REMARK   3   BIN R VALUE           (WORKING SET) : 0.5870                       
+REMARK   3   BIN FREE R VALUE SET COUNT          : 51                           
+REMARK   3   BIN FREE R VALUE                    : 0.6500                       
+REMARK   3                                                                      
+REMARK   3  NUMBER OF NON-HYDROGEN ATOMS USED IN REFINEMENT.                    
+REMARK   3   PROTEIN ATOMS            : 6176                                    
+REMARK   3   NUCLEIC ACID ATOMS       : 0                                       
+REMARK   3   HETEROGEN ATOMS          : 114                                     
+REMARK   3   SOLVENT ATOMS            : 0                                       
+REMARK   3                                                                      
+REMARK   3  B VALUES.                                                           
+REMARK   3   FROM WILSON PLOT           (A**2) : NULL                           
+REMARK   3   MEAN B VALUE      (OVERALL, A**2) : 39.99                          
+REMARK   3   OVERALL ANISOTROPIC B VALUE.                                       
+REMARK   3    B11 (A**2) : -0.01000                                             
+REMARK   3    B22 (A**2) : 0.12000                                              
+REMARK   3    B33 (A**2) : -0.07000                                             
+REMARK   3    B12 (A**2) : -0.00000                                             
+REMARK   3    B13 (A**2) : 0.07000                                              
+REMARK   3    B23 (A**2) : -0.00000                                             
+REMARK   3                                                                      
+REMARK   3  ESTIMATED OVERALL COORDINATE ERROR.                                 
+REMARK   3   ESU BASED ON R VALUE                            (A): NULL          
+REMARK   3   ESU BASED ON FREE R VALUE                       (A): 0.827         
+REMARK   3   ESU BASED ON MAXIMUM LIKELIHOOD                 (A): 0.920         
+REMARK   3   ESU FOR B VALUES BASED ON MAXIMUM LIKELIHOOD (A**2): 73.326        
+REMARK   3                                                                      
+REMARK   3 CORRELATION COEFFICIENTS.                                            
+REMARK   3   CORRELATION COEFFICIENT FO-FC      : 0.949                         
+REMARK   3   CORRELATION COEFFICIENT FO-FC FREE : 0.942                         
+REMARK   3                                                                      
+REMARK   3  RMS DEVIATIONS FROM IDEAL VALUES        COUNT    RMS    WEIGHT      
+REMARK   3   BOND LENGTHS REFINED ATOMS        (A):  6430 ; 0.010 ; 0.020       
+REMARK   3   BOND LENGTHS OTHERS               (A):  NULL ;  NULL ;  NULL       
+REMARK   3   BOND ANGLES REFINED ATOMS   (DEGREES):  8708 ; 1.361 ; 1.989       
+REMARK   3   BOND ANGLES OTHERS          (DEGREES):  NULL ;  NULL ;  NULL       
+REMARK   3   TORSION ANGLES, PERIOD 1    (DEGREES):   782 ; 6.280 ; 5.000       
+REMARK   3   TORSION ANGLES, PERIOD 2    (DEGREES):   286 ;37.739 ;25.315       
+REMARK   3   TORSION ANGLES, PERIOD 3    (DEGREES):  1124 ;17.100 ;15.000       
+REMARK   3   TORSION ANGLES, PERIOD 4    (DEGREES):    24 ;13.428 ;15.000       
+REMARK   3   CHIRAL-CENTER RESTRAINTS       (A**3):   932 ; 0.084 ; 0.200       
+REMARK   3   GENERAL PLANES REFINED ATOMS      (A):  4820 ; 0.005 ; 0.021       
+REMARK   3   GENERAL PLANES OTHERS             (A):  NULL ;  NULL ;  NULL       
+REMARK   3   NON-BONDED CONTACTS REFINED ATOMS (A):  NULL ;  NULL ;  NULL       
+REMARK   3   NON-BONDED CONTACTS OTHERS        (A):  NULL ;  NULL ;  NULL       
+REMARK   3   NON-BONDED TORSION REFINED ATOMS  (A):  NULL ;  NULL ;  NULL       
+REMARK   3   NON-BONDED TORSION OTHERS         (A):  NULL ;  NULL ;  NULL       
+REMARK   3   H-BOND (X...Y) REFINED ATOMS      (A):  NULL ;  NULL ;  NULL       
+REMARK   3   H-BOND (X...Y) OTHERS             (A):  NULL ;  NULL ;  NULL       
+REMARK   3   POTENTIAL METAL-ION REFINED ATOMS (A):  NULL ;  NULL ;  NULL       
+REMARK   3   POTENTIAL METAL-ION OTHERS        (A):  NULL ;  NULL ;  NULL       
+REMARK   3   SYMMETRY VDW REFINED ATOMS        (A):  NULL ;  NULL ;  NULL       
+REMARK   3   SYMMETRY VDW OTHERS               (A):  NULL ;  NULL ;  NULL       
+REMARK   3   SYMMETRY H-BOND REFINED ATOMS     (A):  NULL ;  NULL ;  NULL       
+REMARK   3   SYMMETRY H-BOND OTHERS            (A):  NULL ;  NULL ;  NULL       
+REMARK   3   SYMMETRY METAL-ION REFINED ATOMS  (A):  NULL ;  NULL ;  NULL       
+REMARK   3   SYMMETRY METAL-ION OTHERS         (A):  NULL ;  NULL ;  NULL       
+REMARK   3                                                                      
+REMARK   3  ISOTROPIC THERMAL FACTOR RESTRAINTS.     COUNT   RMS    WEIGHT      
+REMARK   3   MAIN-CHAIN BOND REFINED ATOMS  (A**2):  NULL ;  NULL ;  NULL       
+REMARK   3   MAIN-CHAIN BOND OTHER ATOMS    (A**2):  NULL ;  NULL ;  NULL       
+REMARK   3   MAIN-CHAIN ANGLE REFINED ATOMS (A**2):  NULL ;  NULL ;  NULL       
+REMARK   3   SIDE-CHAIN BOND REFINED ATOMS  (A**2):  NULL ;  NULL ;  NULL       
+REMARK   3   SIDE-CHAIN ANGLE REFINED ATOMS (A**2):  NULL ;  NULL ;  NULL       
+REMARK   3                                                                      
+REMARK   3 ANISOTROPIC THERMAL FACTOR RESTRAINTS.    COUNT   RMS   WEIGHT       
+REMARK   3   RIGID-BOND RESTRAINTS          (A**2):  NULL ;  NULL ;  NULL       
+REMARK   3   SPHERICITY; FREE ATOMS         (A**2):  NULL ;  NULL ;  NULL       
+REMARK   3   SPHERICITY; BONDED ATOMS       (A**2):  NULL ;  NULL ;  NULL       
+REMARK   3                                                                      
+REMARK   3  NCS RESTRAINTS STATISTICS                                           
+REMARK   3   NUMBER OF DIFFERENT NCS GROUPS : NULL                              
+REMARK   3                                                                      
+REMARK   3  TLS DETAILS                                                         
+REMARK   3   NUMBER OF TLS GROUPS  : NULL                                       
+REMARK   3                                                                      
+REMARK   3  BULK SOLVENT MODELLING.                                             
+REMARK   3   METHOD USED : MASK                                                 
+REMARK   3   PARAMETERS FOR MASK CALCULATION                                    
+REMARK   3   VDW PROBE RADIUS   : 1.20                                          
+REMARK   3   ION PROBE RADIUS   : 0.80                                          
+REMARK   3   SHRINKAGE RADIUS   : 0.80                                          
+REMARK   3                                                                      
+REMARK   3  OTHER REFINEMENT REMARKS: HYDROGENS HAVE BEEN USED IF PRESENT IN    
+REMARK   3  THE INPUT                                                           
+REMARK   4                                                                      
+REMARK   4 3W5V COMPLIES WITH FORMAT V. 3.30, 13-JUL-11                         
+REMARK 100                                                                      
+REMARK 100 THIS ENTRY HAS BEEN PROCESSED BY PDBJ ON 15-FEB-13.                  
+REMARK 100 THE RCSB ID CODE IS RCSB095924.                                      
+REMARK 200                                                                      
+REMARK 200 EXPERIMENTAL DETAILS                                                 
+REMARK 200  EXPERIMENT TYPE                : X-RAY DIFFRACTION                  
+REMARK 200  DATE OF DATA COLLECTION        : 24-JUL-11                          
+REMARK 200  TEMPERATURE           (KELVIN) : 100                                
+REMARK 200  PH                             : 7.5                                
+REMARK 200  NUMBER OF CRYSTALS USED        : 1                                  
+REMARK 200                                                                      
+REMARK 200  SYNCHROTRON              (Y/N) : Y                                  
+REMARK 200  RADIATION SOURCE               : SPRING-8                           
+REMARK 200  BEAMLINE                       : BL44XU                             
+REMARK 200  X-RAY GENERATOR MODEL          : NULL                               
+REMARK 200  MONOCHROMATIC OR LAUE    (M/L) : M                                  
+REMARK 200  WAVELENGTH OR RANGE        (A) : 0.90000                            
+REMARK 200  MONOCHROMATOR                  : NULL                               
+REMARK 200  OPTICS                         : NULL                               
+REMARK 200                                                                      
+REMARK 200  DETECTOR TYPE                  : CCD                                
+REMARK 200  DETECTOR MANUFACTURER          : RAYONIX MX225HE                    
+REMARK 200  INTENSITY-INTEGRATION SOFTWARE : HKL-2000                           
+REMARK 200  DATA SCALING SOFTWARE          : HKL-2000                           
+REMARK 200                                                                      
+REMARK 200  NUMBER OF UNIQUE REFLECTIONS   : 13803                              
+REMARK 200  RESOLUTION RANGE HIGH      (A) : 3.800                              
+REMARK 200  RESOLUTION RANGE LOW       (A) : 50.000                             
+REMARK 200  REJECTION CRITERIA  (SIGMA(I)) : NULL                               
+REMARK 200                                                                      
+REMARK 200 OVERALL.                                                             
+REMARK 200  COMPLETENESS FOR RANGE     (%) : NULL                               
+REMARK 200  DATA REDUNDANCY                : NULL                               
+REMARK 200  R MERGE                    (I) : NULL                               
+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: SINGLE WAVELENGTH                              
+REMARK 200 METHOD USED TO DETERMINE THE STRUCTURE: MOLECULAR REPLACEMENT        
+REMARK 200 SOFTWARE USED: PHASER                                                
+REMARK 200 STARTING MODEL: 1GAW, 3B2F                                           
+REMARK 200                                                                      
+REMARK 200 REMARK: NULL                                                         
+REMARK 280                                                                      
+REMARK 280 CRYSTAL                                                              
+REMARK 280 SOLVENT CONTENT, VS   (%): 68.66                                     
+REMARK 280 MATTHEWS COEFFICIENT, VM (ANGSTROMS**3/DA): 3.92                     
+REMARK 280                                                                      
+REMARK 280 CRYSTALLIZATION CONDITIONS: 8% PEG 8000, 20% ETHYLENE GLYCOL,        
+REMARK 280  100MM BIS-TRIS, PH 7.5, VAPOR DIFFUSION, HANGING DROP,              
+REMARK 280  TEMPERATURE 277K                                                    
+REMARK 290                                                                      
+REMARK 290 CRYSTALLOGRAPHIC SYMMETRY                                            
+REMARK 290 SYMMETRY OPERATORS FOR SPACE GROUP: P 1 21 1                         
+REMARK 290                                                                      
+REMARK 290      SYMOP   SYMMETRY                                                
+REMARK 290     NNNMMM   OPERATOR                                                
+REMARK 290       1555   X,Y,Z                                                   
+REMARK 290       2555   -X,Y+1/2,-Z                                             
+REMARK 290                                                                      
+REMARK 290     WHERE NNN -> OPERATOR NUMBER                                     
+REMARK 290           MMM -> TRANSLATION VECTOR                                  
+REMARK 290                                                                      
+REMARK 290 CRYSTALLOGRAPHIC SYMMETRY TRANSFORMATIONS                            
+REMARK 290 THE FOLLOWING TRANSFORMATIONS OPERATE ON THE ATOM/HETATM             
+REMARK 290 RECORDS IN THIS ENTRY TO PRODUCE CRYSTALLOGRAPHICALLY                
+REMARK 290 RELATED MOLECULES.                                                   
+REMARK 290   SMTRY1   1  1.000000  0.000000  0.000000        0.00000            
+REMARK 290   SMTRY2   1  0.000000  1.000000  0.000000        0.00000            
+REMARK 290   SMTRY3   1  0.000000  0.000000  1.000000        0.00000            
+REMARK 290   SMTRY1   2 -1.000000  0.000000  0.000000        0.00000            
+REMARK 290   SMTRY2   2  0.000000  1.000000  0.000000       60.17250            
+REMARK 290   SMTRY3   2  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 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: DIMERIC                           
+REMARK 350 SOFTWARE DETERMINED QUATERNARY STRUCTURE: DIMERIC                    
+REMARK 350 SOFTWARE USED: PISA                                                  
+REMARK 350 TOTAL BURIED SURFACE AREA: 1370 ANGSTROM**2                          
+REMARK 350 SURFACE AREA OF THE COMPLEX: 19220 ANGSTROM**2                       
+REMARK 350 CHANGE IN SOLVENT FREE ENERGY: -28.0 KCAL/MOL                        
+REMARK 350 APPLY THE FOLLOWING TO CHAINS: A, D                                  
+REMARK 350   BIOMT1   1  1.000000  0.000000  0.000000        0.00000            
+REMARK 350   BIOMT2   1  0.000000  1.000000  0.000000        0.00000            
+REMARK 350   BIOMT3   1  0.000000  0.000000  1.000000        0.00000            
+REMARK 350                                                                      
+REMARK 350 BIOMOLECULE: 2                                                       
+REMARK 350 AUTHOR DETERMINED BIOLOGICAL UNIT: DIMERIC                           
+REMARK 350 SOFTWARE DETERMINED QUATERNARY STRUCTURE: DIMERIC                    
+REMARK 350 SOFTWARE USED: PISA                                                  
+REMARK 350 TOTAL BURIED SURFACE AREA: 1640 ANGSTROM**2                          
+REMARK 350 SURFACE AREA OF THE COMPLEX: 18950 ANGSTROM**2                       
+REMARK 350 CHANGE IN SOLVENT FREE ENERGY: -28.0 KCAL/MOL                        
+REMARK 350 APPLY THE FOLLOWING TO CHAINS: C, 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     ILE A     1                                                      
+REMARK 465     ARG A     2                                                      
+REMARK 465     ALA A     3                                                      
+REMARK 465     GLN A     4                                                      
+REMARK 465     ALA A     5                                                      
+REMARK 465     SER A     6                                                      
+REMARK 465     ALA A     7                                                      
+REMARK 465     VAL A     8                                                      
+REMARK 465     GLU A     9                                                      
+REMARK 465     ALA A    10                                                      
+REMARK 465     PRO A    11                                                      
+REMARK 465     ALA A    12                                                      
+REMARK 465     THR A    13                                                      
+REMARK 465     ALA A    14                                                      
+REMARK 465     LYS A    15                                                      
+REMARK 465     ALA A    16                                                      
+REMARK 465     LYS A    17                                                      
+REMARK 465     GLY B    97                                                      
+REMARK 465     ALA B    98                                                      
+REMARK 465     ILE C     1                                                      
+REMARK 465     ARG C     2                                                      
+REMARK 465     ALA C     3                                                      
+REMARK 465     GLN C     4                                                      
+REMARK 465     ALA C     5                                                      
+REMARK 465     SER C     6                                                      
+REMARK 465     ALA C     7                                                      
+REMARK 465     VAL C     8                                                      
+REMARK 465     GLU C     9                                                      
+REMARK 465     ALA C    10                                                      
+REMARK 465     PRO C    11                                                      
+REMARK 465     ALA C    12                                                      
+REMARK 465     THR C    13                                                      
+REMARK 465     ALA C    14                                                      
+REMARK 465     LYS C    15                                                      
+REMARK 465     ALA C    16                                                      
+REMARK 465     LYS C    17                                                      
+REMARK 465     GLY D    97                                                      
+REMARK 465     ALA D    98                                                      
+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   SG   CYS B    47    FE1   FES B   101              1.79            
+REMARK 500   SG   CYS B    44    FE2   FES B   101              1.83            
+REMARK 500   O    LEU C    94     C9A  FAD C   401              2.17            
+REMARK 500                                                                      
+REMARK 500 REMARK: NULL                                                         
+REMARK 500                                                                      
+REMARK 500 GEOMETRY AND STEREOCHEMISTRY                                         
+REMARK 500 SUBTOPIC: COVALENT BOND ANGLES                                       
+REMARK 500                                                                      
+REMARK 500 THE STEREOCHEMICAL PARAMETERS OF THE FOLLOWING RESIDUES              
+REMARK 500 HAVE VALUES WHICH DEVIATE FROM EXPECTED VALUES BY MORE               
+REMARK 500 THAN 6*RMSD (M=MODEL NUMBER; RES=RESIDUE NAME; C=CHAIN               
+REMARK 500 IDENTIFIER; SSEQ=SEQUENCE NUMBER; I=INSERTION CODE).                 
+REMARK 500                                                                      
+REMARK 500 STANDARD TABLE:                                                      
+REMARK 500 FORMAT: (10X,I3,1X,A3,1X,A1,I4,A1,3(1X,A4,2X),12X,F5.1)              
+REMARK 500                                                                      
+REMARK 500 EXPECTED VALUES PROTEIN: ENGH AND HUBER, 1999                        
+REMARK 500 EXPECTED VALUES NUCLEIC ACID: CLOWNEY ET AL 1996                     
+REMARK 500                                                                      
+REMARK 500  M RES CSSEQI ATM1   ATM2   ATM3                                     
+REMARK 500    CYS C  19   CA  -  CB  -  SG  ANGL. DEV. =   8.7 DEGREES          
+REMARK 500                                                                      
+REMARK 500 REMARK: NULL                                                         
+REMARK 500                                                                      
+REMARK 500 GEOMETRY AND STEREOCHEMISTRY                                         
+REMARK 500 SUBTOPIC: TORSION ANGLES                                             
+REMARK 500                                                                      
+REMARK 500 TORSION ANGLES OUTSIDE THE EXPECTED RAMACHANDRAN REGIONS:            
+REMARK 500 (M=MODEL NUMBER; RES=RESIDUE NAME; C=CHAIN IDENTIFIER;               
+REMARK 500 SSEQ=SEQUENCE NUMBER; I=INSERTION CODE).                             
+REMARK 500                                                                      
+REMARK 500 STANDARD TABLE:                                                      
+REMARK 500 FORMAT:(10X,I3,1X,A3,1X,A1,I4,A1,4X,F7.2,3X,F7.2)                    
+REMARK 500                                                                      
+REMARK 500 EXPECTED VALUES: GJ KLEYWEGT AND TA JONES (1996). PHI/PSI-           
+REMARK 500 CHOLOGY: RAMACHANDRAN REVISITED. STRUCTURE 4, 1395 - 1400            
+REMARK 500                                                                      
+REMARK 500  M RES CSSEQI        PSI       PHI                                   
+REMARK 500    GLN A  23      109.52    -58.82                                   
+REMARK 500    ASN A  45       92.65    172.03                                   
+REMARK 500    GLU A  56      115.31     72.23                                   
+REMARK 500    PRO A  69       74.20    -68.96                                   
+REMARK 500    GLU A  72      109.91    -44.80                                   
+REMARK 500    THR A 172       20.52    -73.87                                   
+REMARK 500    ASN A 195       42.91   -167.55                                   
+REMARK 500    TYR A 212       12.59     54.24                                   
+REMARK 500    GLU A 236        5.02   -155.90                                   
+REMARK 500    LYS A 255      -16.18    -46.64                                   
+REMARK 500    GLU A 256      -80.11    -72.63                                   
+REMARK 500    LYS A 300      -71.41    -59.56                                   
+REMARK 500    LYS A 301      -58.26    -27.03                                   
+REMARK 500    ASP A 307       19.54     53.46                                   
+REMARK 500    ILE B   8       79.93   -101.73                                   
+REMARK 500    ASP B  20        4.98    -66.21                                   
+REMARK 500    SER B  38      -78.01   -148.14                                   
+REMARK 500    ALA B  41       19.26   -151.32                                   
+REMARK 500    ASP B  60       15.91     96.95                                   
+REMARK 500    SER B  62       -6.27   -143.09                                   
+REMARK 500    GLN C  23      105.40    -59.16                                   
+REMARK 500    ASN C  45       93.14    173.52                                   
+REMARK 500    GLU C  56      118.79     69.25                                   
+REMARK 500    GLN C  74     -173.82    -67.66                                   
+REMARK 500    ILE C 127      102.10    -59.16                                   
+REMARK 500    VAL C 131      -72.25    -48.59                                   
+REMARK 500    ASN C 195       41.36   -161.84                                   
+REMARK 500    TYR C 212       11.89     53.93                                   
+REMARK 500    GLU C 236        1.48   -151.37                                   
+REMARK 500    LYS C 255      -11.94    -45.29                                   
+REMARK 500    GLU C 256      -78.15    -77.12                                   
+REMARK 500    LYS C 301      -58.19    -29.78                                   
+REMARK 500    ASP C 307       17.60     52.66                                   
+REMARK 500    LEU D  16      162.38    179.37                                   
+REMARK 500    ASP D  20        3.82    -67.10                                   
+REMARK 500    SER D  38      -81.95   -149.47                                   
+REMARK 500    ALA D  41       17.72   -150.42                                   
+REMARK 500    ASP D  60       12.76     97.38                                   
+REMARK 500    SER D  62       -9.08   -144.78                                   
+REMARK 500                                                                      
+REMARK 500 REMARK: NULL                                                         
+REMARK 620                                                                      
+REMARK 620 METAL COORDINATION                                                   
+REMARK 620 (M=MODEL NUMBER; RES=RESIDUE NAME; C=CHAIN IDENTIFIER;               
+REMARK 620 SSEQ=SEQUENCE NUMBER; I=INSERTION CODE):                             
+REMARK 620                                                                      
+REMARK 620 COORDINATION ANGLES FOR:  M RES CSSEQI METAL                         
+REMARK 620                             FES D 101  FE2                           
+REMARK 620 N RES CSSEQI ATOM                                                    
+REMARK 620 1 CYS D  44   SG                                                     
+REMARK 620 2 FES D 101   S1  125.9                                              
+REMARK 620 3 FES D 101   S2   95.5  93.6                                        
+REMARK 620 4 CYS D  39   SG  140.2  77.5 116.4                                  
+REMARK 620 N                    1     2     3                                   
+REMARK 620                                                                      
+REMARK 620 COORDINATION ANGLES FOR:  M RES CSSEQI METAL                         
+REMARK 620                             FES D 101  FE1                           
+REMARK 620 N RES CSSEQI ATOM                                                    
+REMARK 620 1 CYS D  47   SG                                                     
+REMARK 620 2 FES D 101   S1  126.0                                              
+REMARK 620 3 FES D 101   S2  106.4  93.2                                        
+REMARK 620 4 CYS D  77   SG  126.8  80.4 118.3                                  
+REMARK 620 N                    1     2     3                                   
+REMARK 620                                                                      
+REMARK 620 COORDINATION ANGLES FOR:  M RES CSSEQI METAL                         
+REMARK 620                             FES B 101  FE2                           
+REMARK 620 N RES CSSEQI ATOM                                                    
+REMARK 620 1 CYS B  39   SG                                                     
+REMARK 620 2 FES B 101   S1   86.8                                              
+REMARK 620 3 FES B 101   S2  116.1  91.6                                        
+REMARK 620 N                    1     2                                         
+REMARK 620                                                                      
+REMARK 620 COORDINATION ANGLES FOR:  M RES CSSEQI METAL                         
+REMARK 620                             FES B 101  FE1                           
+REMARK 620 N RES CSSEQI ATOM                                                    
+REMARK 620 1 CYS B  77   SG                                                     
+REMARK 620 2 FES B 101   S1   88.1                                              
+REMARK 620 3 FES B 101   S2  109.5  92.2                                        
+REMARK 620 N                    1     2                                         
+REMARK 800                                                                      
+REMARK 800 SITE                                                                 
+REMARK 800 SITE_IDENTIFIER: AC1                                                 
+REMARK 800 EVIDENCE_CODE: SOFTWARE                                              
+REMARK 800 SITE_DESCRIPTION: BINDING SITE FOR RESIDUE FAD A 401                 
+REMARK 800                                                                      
+REMARK 800 SITE_IDENTIFIER: AC2                                                 
+REMARK 800 EVIDENCE_CODE: SOFTWARE                                              
+REMARK 800 SITE_DESCRIPTION: BINDING SITE FOR RESIDUE FES B 101                 
+REMARK 800                                                                      
+REMARK 800 SITE_IDENTIFIER: AC3                                                 
+REMARK 800 EVIDENCE_CODE: SOFTWARE                                              
+REMARK 800 SITE_DESCRIPTION: BINDING SITE FOR RESIDUE FAD C 401                 
+REMARK 800                                                                      
+REMARK 800 SITE_IDENTIFIER: AC4                                                 
+REMARK 800 EVIDENCE_CODE: SOFTWARE                                              
+REMARK 800 SITE_DESCRIPTION: BINDING SITE FOR RESIDUE FES D 101                 
+REMARK 900                                                                      
+REMARK 900 RELATED ENTRIES                                                      
+REMARK 900 RELATED ID: 3W5U   RELATED DB: PDB                                   
+REMARK 900 SIMILAR COMPLEX WITH A DISTINCT CROSS-LINKAGE                        
+REMARK 900 RELATED ID: 1GAW   RELATED DB: PDB                                   
+REMARK 900 FERREDOXIN-NADP+ REDUCTASE                                           
+REMARK 900 RELATED ID: 3B2F   RELATED DB: PDB                                   
+REMARK 900 FERREDOXIN                                                           
+DBREF  3W5V A    1   314  UNP    Q9SLP6   Q9SLP6_MAIZE    42    355             
+DBREF  3W5V B    1    98  UNP    P27787   FER1_MAIZE      53    150             
+DBREF  3W5V C    1   314  UNP    Q9SLP6   Q9SLP6_MAIZE    42    355             
+DBREF  3W5V D    1    98  UNP    P27787   FER1_MAIZE      53    150             
+SEQADV 3W5V CYS A   19  UNP  Q9SLP6    GLU    60 ENGINEERED MUTATION            
+SEQADV 3W5V CYS B   70  UNP  P27787    ALA   122 ENGINEERED MUTATION            
+SEQADV 3W5V CYS C   19  UNP  Q9SLP6    GLU    60 ENGINEERED MUTATION            
+SEQADV 3W5V CYS D   70  UNP  P27787    ALA   122 ENGINEERED MUTATION            
+SEQRES   1 A  314  ILE ARG ALA GLN ALA SER ALA VAL GLU ALA PRO ALA THR          
+SEQRES   2 A  314  ALA LYS ALA LYS LYS CYS SER LYS LYS GLN GLU GLU GLY          
+SEQRES   3 A  314  VAL VAL THR ASN LEU TYR LYS PRO LYS GLU PRO TYR VAL          
+SEQRES   4 A  314  GLY ARG CYS LEU LEU ASN THR LYS ILE THR GLY ASP ASP          
+SEQRES   5 A  314  ALA PRO GLY GLU THR TRP HIS MET VAL PHE SER THR GLU          
+SEQRES   6 A  314  GLY LYS ILE PRO TYR ARG GLU GLY GLN SER ILE GLY VAL          
+SEQRES   7 A  314  ILE ALA ASP GLY VAL ASP LYS ASN GLY LYS PRO HIS LYS          
+SEQRES   8 A  314  VAL ARG LEU TYR SER ILE ALA SER SER ALA ILE GLY ASP          
+SEQRES   9 A  314  PHE GLY ASP SER LYS THR VAL SER LEU CYS VAL LYS ARG          
+SEQRES  10 A  314  LEU ILE TYR THR ASN ASP ALA GLY GLU ILE VAL LYS GLY          
+SEQRES  11 A  314  VAL CYS SER ASN PHE LEU CYS ASP LEU GLN PRO GLY ASP          
+SEQRES  12 A  314  ASN VAL GLN ILE THR GLY PRO VAL GLY LYS GLU MET LEU          
+SEQRES  13 A  314  MET PRO LYS ASP PRO ASN ALA THR ILE ILE MET LEU ALA          
+SEQRES  14 A  314  THR GLY THR GLY ILE ALA PRO PHE ARG SER PHE LEU TRP          
+SEQRES  15 A  314  LYS MET PHE PHE GLU LYS HIS ASP ASP TYR LYS PHE ASN          
+SEQRES  16 A  314  GLY LEU GLY TRP LEU PHE LEU GLY VAL PRO THR SER SER          
+SEQRES  17 A  314  SER LEU LEU TYR LYS GLU GLU PHE GLY LYS MET LYS GLU          
+SEQRES  18 A  314  ARG ALA PRO GLU ASN PHE ARG VAL ASP TYR ALA VAL SER          
+SEQRES  19 A  314  ARG GLU GLN THR ASN ALA ALA GLY GLU ARG MET TYR ILE          
+SEQRES  20 A  314  GLN THR ARG MET ALA GLU TYR LYS GLU GLU LEU TRP GLU          
+SEQRES  21 A  314  LEU LEU LYS LYS ASP ASN THR TYR VAL TYR MET CYS GLY          
+SEQRES  22 A  314  LEU LYS GLY MET GLU LYS GLY ILE ASP ASP ILE MET VAL          
+SEQRES  23 A  314  SER LEU ALA GLU LYS ASP GLY ILE ASP TRP PHE ASP TYR          
+SEQRES  24 A  314  LYS LYS GLN LEU LYS ARG GLY ASP GLN TRP ASN VAL GLU          
+SEQRES  25 A  314  VAL TYR                                                      
+SEQRES   1 B   98  ALA THR TYR ASN VAL LYS LEU ILE THR PRO GLU GLY GLU          
+SEQRES   2 B   98  VAL GLU LEU GLN VAL PRO ASP ASP VAL TYR ILE LEU ASP          
+SEQRES   3 B   98  GLN ALA GLU GLU ASP GLY ILE ASP LEU PRO TYR SER CYS          
+SEQRES   4 B   98  ARG ALA GLY SER CYS SER SER CYS ALA GLY LYS VAL VAL          
+SEQRES   5 B   98  SER GLY SER VAL ASP GLN SER ASP GLN SER TYR LEU ASP          
+SEQRES   6 B   98  ASP GLY GLN ILE CYS ASP GLY TRP VAL LEU THR CYS HIS          
+SEQRES   7 B   98  ALA TYR PRO THR SER ASP VAL VAL ILE GLU THR HIS LYS          
+SEQRES   8 B   98  GLU GLU GLU LEU THR GLY ALA                                  
+SEQRES   1 C  314  ILE ARG ALA GLN ALA SER ALA VAL GLU ALA PRO ALA THR          
+SEQRES   2 C  314  ALA LYS ALA LYS LYS CYS SER LYS LYS GLN GLU GLU GLY          
+SEQRES   3 C  314  VAL VAL THR ASN LEU TYR LYS PRO LYS GLU PRO TYR VAL          
+SEQRES   4 C  314  GLY ARG CYS LEU LEU ASN THR LYS ILE THR GLY ASP ASP          
+SEQRES   5 C  314  ALA PRO GLY GLU THR TRP HIS MET VAL PHE SER THR GLU          
+SEQRES   6 C  314  GLY LYS ILE PRO TYR ARG GLU GLY GLN SER ILE GLY VAL          
+SEQRES   7 C  314  ILE ALA ASP GLY VAL ASP LYS ASN GLY LYS PRO HIS LYS          
+SEQRES   8 C  314  VAL ARG LEU TYR SER ILE ALA SER SER ALA ILE GLY ASP          
+SEQRES   9 C  314  PHE GLY ASP SER LYS THR VAL SER LEU CYS VAL LYS ARG          
+SEQRES  10 C  314  LEU ILE TYR THR ASN ASP ALA GLY GLU ILE VAL LYS GLY          
+SEQRES  11 C  314  VAL CYS SER ASN PHE LEU CYS ASP LEU GLN PRO GLY ASP          
+SEQRES  12 C  314  ASN VAL GLN ILE THR GLY PRO VAL GLY LYS GLU MET LEU          
+SEQRES  13 C  314  MET PRO LYS ASP PRO ASN ALA THR ILE ILE MET LEU ALA          
+SEQRES  14 C  314  THR GLY THR GLY ILE ALA PRO PHE ARG SER PHE LEU TRP          
+SEQRES  15 C  314  LYS MET PHE PHE GLU LYS HIS ASP ASP TYR LYS PHE ASN          
+SEQRES  16 C  314  GLY LEU GLY TRP LEU PHE LEU GLY VAL PRO THR SER SER          
+SEQRES  17 C  314  SER LEU LEU TYR LYS GLU GLU PHE GLY LYS MET LYS GLU          
+SEQRES  18 C  314  ARG ALA PRO GLU ASN PHE ARG VAL ASP TYR ALA VAL SER          
+SEQRES  19 C  314  ARG GLU GLN THR ASN ALA ALA GLY GLU ARG MET TYR ILE          
+SEQRES  20 C  314  GLN THR ARG MET ALA GLU TYR LYS GLU GLU LEU TRP GLU          
+SEQRES  21 C  314  LEU LEU LYS LYS ASP ASN THR TYR VAL TYR MET CYS GLY          
+SEQRES  22 C  314  LEU LYS GLY MET GLU LYS GLY ILE ASP ASP ILE MET VAL          
+SEQRES  23 C  314  SER LEU ALA GLU LYS ASP GLY ILE ASP TRP PHE ASP TYR          
+SEQRES  24 C  314  LYS LYS GLN LEU LYS ARG GLY ASP GLN TRP ASN VAL GLU          
+SEQRES  25 C  314  VAL TYR                                                      
+SEQRES   1 D   98  ALA THR TYR ASN VAL LYS LEU ILE THR PRO GLU GLY GLU          
+SEQRES   2 D   98  VAL GLU LEU GLN VAL PRO ASP ASP VAL TYR ILE LEU ASP          
+SEQRES   3 D   98  GLN ALA GLU GLU ASP GLY ILE ASP LEU PRO TYR SER CYS          
+SEQRES   4 D   98  ARG ALA GLY SER CYS SER SER CYS ALA GLY LYS VAL VAL          
+SEQRES   5 D   98  SER GLY SER VAL ASP GLN SER ASP GLN SER TYR LEU ASP          
+SEQRES   6 D   98  ASP GLY GLN ILE CYS ASP GLY TRP VAL LEU THR CYS HIS          
+SEQRES   7 D   98  ALA TYR PRO THR SER ASP VAL VAL ILE GLU THR HIS LYS          
+SEQRES   8 D   98  GLU GLU GLU LEU THR GLY ALA                                  
+HET    FAD  A 401      53                                                       
+HET    FES  B 101       4                                                       
+HET    FAD  C 401      53                                                       
+HET    FES  D 101       4                                                       
+HETNAM     FAD FLAVIN-ADENINE DINUCLEOTIDE                                      
+HETNAM     FES FE2/S2 (INORGANIC) CLUSTER                                       
+FORMUL   5  FAD    2(C27 H33 N9 O15 P2)                                         
+FORMUL   6  FES    2(FE2 S2)                                                    
+HELIX    1   1 GLY A  130  ASP A  138  1                                   9    
+HELIX    2   2 ILE A  174  PHE A  186  1                                  13    
+HELIX    3   3 TYR A  212  ALA A  223  1                                  12    
+HELIX    4   4 TYR A  246  GLU A  253  1                                   8    
+HELIX    5   5 TYR A  254  LEU A  262  1                                   9    
+HELIX    6   6 GLY A  276  GLU A  290  1                                  15    
+HELIX    7   7 ASP A  295  GLY A  306  1                                  12    
+HELIX    8   8 TYR B   23  ASP B   31  1                                   9    
+HELIX    9   9 ASP B   65  CYS B   70  1                                   6    
+HELIX   10  10 CYS B   77  ALA B   79  5                                   3    
+HELIX   11  11 LYS B   91  THR B   96  1                                   6    
+HELIX   12  12 GLY C  130  ASP C  138  1                                   9    
+HELIX   13  13 ILE C  174  PHE C  186  1                                  13    
+HELIX   14  14 TYR C  212  ALA C  223  1                                  12    
+HELIX   15  15 TYR C  246  GLU C  253  1                                   8    
+HELIX   16  16 TYR C  254  LEU C  262  1                                   9    
+HELIX   17  17 GLY C  276  GLU C  290  1                                  15    
+HELIX   18  18 ASP C  295  GLY C  306  1                                  12    
+HELIX   19  19 TYR D   23  ASP D   31  1                                   9    
+HELIX   20  20 ASP D   65  ASP D   71  1                                   7    
+HELIX   21  21 CYS D   77  ALA D   79  5                                   3    
+HELIX   22  22 LYS D   91  THR D   96  1                                   6    
+SHEET    1   A 6 THR A  46  LYS A  47  0                                        
+SHEET    2   A 6 THR A  57  SER A  63 -1  O  HIS A  59   N  THR A  46           
+SHEET    3   A 6 TYR A  38  CYS A  42 -1  N  ARG A  41   O  SER A  63           
+SHEET    4   A 6 ASN A 144  VAL A 151 -1  O  ILE A 147   N  TYR A  38           
+SHEET    5   A 6 SER A  75  ILE A  79 -1  N  GLY A  77   O  THR A 148           
+SHEET    6   A 6 ARG A  93  SER A  96 -1  O  TYR A  95   N  ILE A  76           
+SHEET    1   B 3 THR A  46  LYS A  47  0                                        
+SHEET    2   B 3 THR A  57  SER A  63 -1  O  HIS A  59   N  THR A  46           
+SHEET    3   B 3 THR A 110  LYS A 116 -1  O  LEU A 113   N  MET A  60           
+SHEET    1   C 2 ILE A 119  THR A 121  0                                        
+SHEET    2   C 2 ILE A 127  LYS A 129 -1  O  VAL A 128   N  TYR A 120           
+SHEET    1   D 5 PHE A 227  VAL A 233  0                                        
+SHEET    2   D 5 LEU A 197  VAL A 204  1  N  GLY A 198   O  ARG A 228           
+SHEET    3   D 5 THR A 164  THR A 170  1  N  MET A 167   O  PHE A 201           
+SHEET    4   D 5 THR A 267  LEU A 274  1  O  TYR A 270   N  ILE A 166           
+SHEET    5   D 5 TRP A 309  TYR A 314  1  O  ASN A 310   N  MET A 271           
+SHEET    1   E 5 GLY B  12  PRO B  19  0                                        
+SHEET    2   E 5 THR B   2  THR B   9 -1  N  LEU B   7   O  VAL B  14           
+SHEET    3   E 5 VAL B  85  GLU B  88  1  O  ILE B  87   N  ILE B   8           
+SHEET    4   E 5 ALA B  48  SER B  53 -1  N  VAL B  52   O  VAL B  86           
+SHEET    5   E 5 TRP B  73  LEU B  75 -1  O  VAL B  74   N  GLY B  49           
+SHEET    1   F 2 VAL B  56  ASP B  57  0                                        
+SHEET    2   F 2 TYR B  80  PRO B  81 -1  O  TYR B  80   N  ASP B  57           
+SHEET    1   G 6 THR C  46  LYS C  47  0                                        
+SHEET    2   G 6 THR C  57  SER C  63 -1  O  HIS C  59   N  THR C  46           
+SHEET    3   G 6 TYR C  38  CYS C  42 -1  N  ARG C  41   O  SER C  63           
+SHEET    4   G 6 ASN C 144  VAL C 151 -1  O  VAL C 145   N  GLY C  40           
+SHEET    5   G 6 SER C  75  ILE C  79 -1  N  GLY C  77   O  THR C 148           
+SHEET    6   G 6 ARG C  93  SER C  96 -1  O  TYR C  95   N  ILE C  76           
+SHEET    1   H 3 THR C  46  LYS C  47  0                                        
+SHEET    2   H 3 THR C  57  SER C  63 -1  O  HIS C  59   N  THR C  46           
+SHEET    3   H 3 THR C 110  LYS C 116 -1  O  VAL C 111   N  PHE C  62           
+SHEET    1   I 2 ILE C 119  THR C 121  0                                        
+SHEET    2   I 2 ILE C 127  LYS C 129 -1  O  VAL C 128   N  TYR C 120           
+SHEET    1   J 5 PHE C 227  VAL C 233  0                                        
+SHEET    2   J 5 LEU C 197  VAL C 204  1  N  GLY C 198   O  ARG C 228           
+SHEET    3   J 5 THR C 164  THR C 170  1  N  MET C 167   O  PHE C 201           
+SHEET    4   J 5 THR C 267  LEU C 274  1  O  TYR C 268   N  THR C 164           
+SHEET    5   J 5 TRP C 309  TYR C 314  1  O  ASN C 310   N  MET C 271           
+SHEET    1   K 5 GLY D  12  PRO D  19  0                                        
+SHEET    2   K 5 THR D   2  THR D   9 -1  N  LEU D   7   O  VAL D  14           
+SHEET    3   K 5 VAL D  85  THR D  89  1  O  ILE D  87   N  ILE D   8           
+SHEET    4   K 5 ALA D  48  SER D  53 -1  N  VAL D  52   O  VAL D  86           
+SHEET    5   K 5 TRP D  73  LEU D  75 -1  O  VAL D  74   N  GLY D  49           
+SHEET    1   L 2 VAL D  56  ASP D  57  0                                        
+SHEET    2   L 2 TYR D  80  PRO D  81 -1  O  TYR D  80   N  ASP D  57           
+SSBOND   1 CYS A   19    CYS D   70                          1555   1555  2.02  
+SSBOND   2 CYS B   70    CYS C   19                          1555   1555  2.03  
+LINK         SG  CYS D  44                FE2  FES D 101     1555   1555  1.91  
+LINK         SG  CYS D  47                FE1  FES D 101     1555   1555  1.95  
+LINK         SG  CYS B  39                FE2  FES B 101     1555   1555  1.96  
+LINK         SG  CYS D  39                FE2  FES D 101     1555   1555  2.15  
+LINK         SG  CYS B  77                FE1  FES B 101     1555   1555  2.35  
+LINK         SG  CYS D  77                FE1  FES D 101     1555   1555  2.61  
+CISPEP   1 GLY A  149    PRO A  150          0        -1.95                     
+CISPEP   2 GLY C  149    PRO C  150          0        -1.62                     
+SITE     1 AC1 15 ARG A  93  LEU A  94  TYR A  95  SER A  96                    
+SITE     2 AC1 15 CYS A 114  LYS A 116  LEU A 118  TYR A 120                    
+SITE     3 AC1 15 GLY A 130  VAL A 131  CYS A 132  SER A 133                    
+SITE     4 AC1 15 THR A 172  TYR A 314  SER B  38                               
+SITE     1 AC2  9 SER B  38  CYS B  39  ARG B  40  GLY B  42                    
+SITE     2 AC2  9 SER B  43  CYS B  44  CYS B  47  LEU B  75                    
+SITE     3 AC2  9 CYS B  77                                                     
+SITE     1 AC3 17 GLY A 242  ARG A 244  ARG C  93  LEU C  94                    
+SITE     2 AC3 17 TYR C  95  SER C  96  CYS C 114  VAL C 115                    
+SITE     3 AC3 17 LYS C 116  LEU C 118  TYR C 120  GLY C 130                    
+SITE     4 AC3 17 VAL C 131  CYS C 132  SER C 133  THR C 172                    
+SITE     5 AC3 17 TYR C 314                                                     
+SITE     1 AC4  9 SER D  38  CYS D  39  ARG D  40  GLY D  42                    
+SITE     2 AC4  9 SER D  43  CYS D  44  CYS D  47  LEU D  75                    
+SITE     3 AC4  9 CYS D  77                                                     
+CRYST1   75.170  120.345   84.577  90.00 109.70  90.00 P 1 21 1      4          
+ORIGX1      1.000000  0.000000  0.000000        0.00000                         
+ORIGX2      0.000000  1.000000  0.000000        0.00000                         
+ORIGX3      0.000000  0.000000  1.000000        0.00000                         
+SCALE1      0.013303  0.000000  0.004764        0.00000                         
+SCALE2      0.000000  0.008309  0.000000        0.00000                         
+SCALE3      0.000000  0.000000  0.012559        0.00000                         
+MTRIX1   1  1.000000  0.000000  0.000000        0.00000    1                    
+MTRIX2   1  0.000000  1.000000  0.000000        0.00000    1                    
+MTRIX3   1  0.000000  0.000000  1.000000        0.00000    1                    
+MTRIX1   2 -0.900585 -0.360692  0.242586      -93.40076    1                    
+MTRIX2   2 -0.323557  0.183576 -0.928230       33.09570    1                    
+MTRIX3   2  0.290273 -0.914440 -0.282030       74.35553    1                    
+ATOM      1  N   LYS A  18     -28.790 -18.357  17.844  1.00 40.00           N  
+ATOM      2  CA  LYS A  18     -27.990 -18.527  19.103  1.00 40.00           C  
+ATOM      3  C   LYS A  18     -28.888 -18.264  20.328  1.00 40.00           C  
+ATOM      4  O   LYS A  18     -29.482 -17.177  20.452  1.00 40.00           O  
+ATOM      5  CB  LYS A  18     -26.767 -17.582  19.138  1.00 40.00           C  
+ATOM      6  CG  LYS A  18     -26.359 -16.919  17.814  1.00 40.00           C  
+ATOM      7  CD  LYS A  18     -27.280 -15.776  17.366  1.00 40.00           C  
+ATOM      8  CE  LYS A  18     -27.659 -14.804  18.485  1.00 40.00           C  
+ATOM      9  NZ  LYS A  18     -26.567 -13.860  18.840  1.00 40.00           N  
+ATOM     10  N   CYS A  19     -29.018 -19.251  21.219  1.00 40.00           N  
+ATOM     11  CA  CYS A  19     -29.736 -19.000  22.469  1.00 40.00           C  
+ATOM     12  C   CYS A  19     -28.765 -18.475  23.517  1.00 40.00           C  
+ATOM     13  O   CYS A  19     -27.614 -18.928  23.642  1.00 40.00           O  
+ATOM     14  CB  CYS A  19     -30.569 -20.193  22.949  1.00 40.00           C  
+ATOM     15  SG  CYS A  19     -29.784 -21.807  22.816  1.00 40.00           S  
+ATOM     16  N   SER A  20     -29.241 -17.468  24.227  1.00 40.00           N  
+ATOM     17  CA  SER A  20     -28.405 -16.691  25.110  1.00 40.00           C  
+ATOM     18  C   SER A  20     -28.651 -17.107  26.557  1.00 40.00           C  
+ATOM     19  O   SER A  20     -29.707 -17.666  26.874  1.00 40.00           O  
+ATOM     20  CB  SER A  20     -28.692 -15.201  24.887  1.00 40.00           C  
+ATOM     21  OG  SER A  20     -28.226 -14.386  25.948  1.00 40.00           O  
+ATOM     22  N   LYS A  21     -27.671 -16.835  27.422  1.00 40.00           N  
+ATOM     23  CA  LYS A  21     -27.776 -17.131  28.847  1.00 40.00           C  
+ATOM     24  C   LYS A  21     -28.469 -16.016  29.608  1.00 40.00           C  
+ATOM     25  O   LYS A  21     -28.576 -16.083  30.831  1.00 40.00           O  
+ATOM     26  CB  LYS A  21     -26.396 -17.388  29.438  1.00 40.00           C  
+ATOM     27  CG  LYS A  21     -25.693 -18.583  28.818  1.00 40.00           C  
+ATOM     28  CD  LYS A  21     -24.275 -18.744  29.338  1.00 40.00           C  
+ATOM     29  CE  LYS A  21     -23.428 -19.521  28.345  1.00 40.00           C  
+ATOM     30  NZ  LYS A  21     -22.039 -19.714  28.839  1.00 40.00           N  
+ATOM     31  N   LYS A  22     -28.949 -15.011  28.867  1.00 40.00           N  
+ATOM     32  CA  LYS A  22     -29.640 -13.820  29.400  1.00 40.00           C  
+ATOM     33  C   LYS A  22     -31.095 -13.782  28.970  1.00 40.00           C  
+ATOM     34  O   LYS A  22     -31.378 -13.969  27.792  1.00 40.00           O  
+ATOM     35  CB  LYS A  22     -28.976 -12.554  28.871  1.00 40.00           C  
+ATOM     36  CG  LYS A  22     -27.457 -12.569  28.929  1.00 40.00           C  
+ATOM     37  CD  LYS A  22     -26.889 -11.294  28.334  1.00 40.00           C  
+ATOM     38  CE  LYS A  22     -25.393 -11.184  28.564  1.00 40.00           C  
+ATOM     39  NZ  LYS A  22     -24.847  -9.966  27.905  1.00 40.00           N  
+ATOM     40  N   GLN A  23     -32.010 -13.517  29.901  1.00 40.00           N  
+ATOM     41  CA  GLN A  23     -33.443 -13.632  29.609  1.00 40.00           C  
+ATOM     42  C   GLN A  23     -33.847 -12.730  28.472  1.00 40.00           C  
+ATOM     43  O   GLN A  23     -33.873 -11.517  28.638  1.00 40.00           O  
+ATOM     44  CB  GLN A  23     -34.285 -13.288  30.821  1.00 40.00           C  
+ATOM     45  CG  GLN A  23     -34.161 -14.283  31.949  1.00 40.00           C  
+ATOM     46  CD  GLN A  23     -34.707 -13.739  33.250  1.00 40.00           C  
+ATOM     47  OE1 GLN A  23     -35.821 -13.197  33.293  1.00 40.00           O  
+ATOM     48  NE2 GLN A  23     -33.926 -13.876  34.327  1.00 40.00           N  
+ATOM     49  N   GLU A  24     -34.168 -13.327  27.322  1.00 40.00           N  
+ATOM     50  CA  GLU A  24     -34.463 -12.550  26.110  1.00 40.00           C  
+ATOM     51  C   GLU A  24     -35.961 -12.512  25.779  1.00 40.00           C  
+ATOM     52  O   GLU A  24     -36.399 -11.866  24.824  1.00 40.00           O  
+ATOM     53  CB  GLU A  24     -33.599 -13.030  24.929  1.00 40.00           C  
+ATOM     54  CG  GLU A  24     -32.098 -12.852  25.188  1.00 40.00           C  
+ATOM     55  CD  GLU A  24     -31.292 -12.380  23.983  1.00 40.00           C  
+ATOM     56  OE1 GLU A  24     -31.884 -11.756  23.060  1.00 40.00           O  
+ATOM     57  OE2 GLU A  24     -30.056 -12.619  23.976  1.00 40.00           O  
+ATOM     58  N   GLU A  25     -36.735 -13.170  26.630  1.00 40.00           N  
+ATOM     59  CA  GLU A  25     -38.162 -13.331  26.437  1.00 40.00           C  
+ATOM     60  C   GLU A  25     -38.996 -12.123  26.887  1.00 40.00           C  
+ATOM     61  O   GLU A  25     -39.035 -11.786  28.066  1.00 40.00           O  
+ATOM     62  CB  GLU A  25     -38.616 -14.588  27.179  1.00 40.00           C  
+ATOM     63  CG  GLU A  25     -40.121 -14.836  27.137  1.00 40.00           C  
+ATOM     64  CD  GLU A  25     -40.633 -15.707  28.283  1.00 40.00           C  
+ATOM     65  OE1 GLU A  25     -41.875 -15.854  28.414  1.00 40.00           O  
+ATOM     66  OE2 GLU A  25     -39.806 -16.243  29.060  1.00 40.00           O  
+ATOM     67  N   GLY A  26     -39.692 -11.503  25.943  1.00 40.00           N  
+ATOM     68  CA  GLY A  26     -40.566 -10.364  26.242  1.00 40.00           C  
+ATOM     69  C   GLY A  26     -39.886  -9.008  26.056  1.00 40.00           C  
+ATOM     70  O   GLY A  26     -40.544  -7.959  25.948  1.00 40.00           O  
+ATOM     71  N   VAL A  27     -38.559  -9.036  26.018  1.00 40.00           N  
+ATOM     72  CA  VAL A  27     -37.749  -7.848  25.849  1.00 40.00           C  
+ATOM     73  C   VAL A  27     -38.078  -7.122  24.552  1.00 40.00           C  
+ATOM     74  O   VAL A  27     -37.933  -7.683  23.480  1.00 40.00           O  
+ATOM     75  CB  VAL A  27     -36.277  -8.254  25.799  1.00 40.00           C  
+ATOM     76  CG1 VAL A  27     -35.391  -7.024  25.762  1.00 40.00           C  
+ATOM     77  CG2 VAL A  27     -35.947  -9.134  26.990  1.00 40.00           C  
+ATOM     78  N   VAL A  28     -38.508  -5.874  24.640  1.00 40.00           N  
+ATOM     79  CA  VAL A  28     -38.799  -5.109  23.432  1.00 40.00           C  
+ATOM     80  C   VAL A  28     -37.718  -4.048  23.188  1.00 40.00           C  
+ATOM     81  O   VAL A  28     -37.091  -3.598  24.138  1.00 40.00           O  
+ATOM     82  CB  VAL A  28     -40.218  -4.495  23.498  1.00 40.00           C  
+ATOM     83  CG1 VAL A  28     -41.217  -5.521  24.018  1.00 40.00           C  
+ATOM     84  CG2 VAL A  28     -40.254  -3.255  24.379  1.00 40.00           C  
+ATOM     85  N   THR A  29     -37.477  -3.665  21.934  1.00 40.00           N  
+ATOM     86  CA  THR A  29     -36.574  -2.537  21.657  1.00 40.00           C  
+ATOM     87  C   THR A  29     -37.134  -1.489  20.708  1.00 40.00           C  
+ATOM     88  O   THR A  29     -38.044  -1.749  19.930  1.00 40.00           O  
+ATOM     89  CB  THR A  29     -35.197  -2.967  21.126  1.00 40.00           C  
+ATOM     90  OG1 THR A  29     -35.354  -4.108  20.293  1.00 40.00           O  
+ATOM     91  CG2 THR A  29     -34.287  -3.330  22.251  1.00 40.00           C  
+ATOM     92  N   ASN A  30     -36.557  -0.296  20.803  1.00 40.00           N  
+ATOM     93  CA  ASN A  30     -36.905   0.869  19.986  1.00 40.00           C  
+ATOM     94  C   ASN A  30     -38.395   1.116  19.727  1.00 40.00           C  
+ATOM     95  O   ASN A  30     -38.775   1.572  18.647  1.00 40.00           O  
+ATOM     96  CB  ASN A  30     -36.064   0.893  18.710  1.00 40.00           C  
+ATOM     97  CG  ASN A  30     -34.598   1.154  19.000  1.00 40.00           C  
+ATOM     98  OD1 ASN A  30     -34.152   2.307  19.007  1.00 40.00           O  
+ATOM     99  ND2 ASN A  30     -33.841   0.081  19.259  1.00 40.00           N  
+ATOM    100  N   LEU A  31     -39.213   0.838  20.749  1.00 40.00           N  
+ATOM    101  CA  LEU A  31     -40.649   1.101  20.729  1.00 40.00           C  
+ATOM    102  C   LEU A  31     -40.994   2.576  20.443  1.00 40.00           C  
+ATOM    103  O   LEU A  31     -41.929   2.844  19.702  1.00 40.00           O  
+ATOM    104  CB  LEU A  31     -41.297   0.630  22.027  1.00 40.00           C  
+ATOM    105  CG  LEU A  31     -42.459  -0.352  21.899  1.00 40.00           C  
+ATOM    106  CD1 LEU A  31     -43.174  -0.478  23.228  1.00 40.00           C  
+ATOM    107  CD2 LEU A  31     -43.458   0.073  20.839  1.00 40.00           C  
+ATOM    108  N   TYR A  32     -40.253   3.522  21.021  1.00 40.00           N  
+ATOM    109  CA  TYR A  32     -40.294   4.924  20.569  1.00 40.00           C  
+ATOM    110  C   TYR A  32     -38.899   5.382  20.108  1.00 40.00           C  
+ATOM    111  O   TYR A  32     -37.879   5.020  20.708  1.00 40.00           O  
+ATOM    112  CB  TYR A  32     -40.812   5.870  21.655  1.00 40.00           C  
+ATOM    113  CG  TYR A  32     -42.199   5.587  22.193  1.00 40.00           C  
+ATOM    114  CD1 TYR A  32     -42.442   4.480  23.014  1.00 40.00           C  
+ATOM    115  CD2 TYR A  32     -43.259   6.450  21.924  1.00 40.00           C  
+ATOM    116  CE1 TYR A  32     -43.703   4.225  23.533  1.00 40.00           C  
+ATOM    117  CE2 TYR A  32     -44.528   6.205  22.437  1.00 40.00           C  
+ATOM    118  CZ  TYR A  32     -44.743   5.091  23.246  1.00 40.00           C  
+ATOM    119  OH  TYR A  32     -45.992   4.821  23.773  1.00 40.00           O  
+ATOM    120  N   LYS A  33     -38.867   6.178  19.039  1.00 40.00           N  
+ATOM    121  CA  LYS A  33     -37.616   6.691  18.445  1.00 40.00           C  
+ATOM    122  C   LYS A  33     -37.626   8.235  18.464  1.00 40.00           C  
+ATOM    123  O   LYS A  33     -38.688   8.830  18.665  1.00 40.00           O  
+ATOM    124  CB  LYS A  33     -37.440   6.174  16.999  1.00 40.00           C  
+ATOM    125  CG  LYS A  33     -37.289   4.652  16.831  1.00 40.00           C  
+ATOM    126  CD  LYS A  33     -37.474   4.221  15.363  1.00 40.00           C  
+ATOM    127  CE  LYS A  33     -37.663   2.713  15.168  1.00 40.00           C  
+ATOM    128  NZ  LYS A  33     -39.025   2.239  15.551  1.00 40.00           N  
+ATOM    129  N   PRO A  34     -36.447   8.887  18.267  1.00 40.00           N  
+ATOM    130  CA  PRO A  34     -36.280  10.366  18.253  1.00 40.00           C  
+ATOM    131  C   PRO A  34     -37.264  11.186  17.397  1.00 40.00           C  
+ATOM    132  O   PRO A  34     -37.515  12.357  17.704  1.00 40.00           O  
+ATOM    133  CB  PRO A  34     -34.857  10.543  17.725  1.00 40.00           C  
+ATOM    134  CG  PRO A  34     -34.140   9.335  18.228  1.00 40.00           C  
+ATOM    135  CD  PRO A  34     -35.135   8.203  18.237  1.00 40.00           C  
+ATOM    136  N   LYS A  35     -37.800  10.578  16.340  1.00 40.00           N  
+ATOM    137  CA  LYS A  35     -38.849  11.199  15.530  1.00 40.00           C  
+ATOM    138  C   LYS A  35     -40.211  11.280  16.256  1.00 40.00           C  
+ATOM    139  O   LYS A  35     -40.899  12.304  16.167  1.00 40.00           O  
+ATOM    140  CB  LYS A  35     -39.004  10.472  14.188  1.00 40.00           C  
+ATOM    141  CG  LYS A  35     -39.985   9.302  14.206  1.00 40.00           C  
+ATOM    142  CD  LYS A  35     -39.803   8.387  13.013  1.00 40.00           C  
+ATOM    143  CE  LYS A  35     -38.570   7.518  13.187  1.00 40.00           C  
+ATOM    144  NZ  LYS A  35     -38.127   6.952  11.883  1.00 40.00           N  
+ATOM    145  N   GLU A  36     -40.605  10.205  16.950  1.00 40.00           N  
+ATOM    146  CA  GLU A  36     -41.873  10.179  17.706  1.00 40.00           C  
+ATOM    147  C   GLU A  36     -41.734   9.676  19.153  1.00 40.00           C  
+ATOM    148  O   GLU A  36     -42.177   8.560  19.475  1.00 40.00           O  
+ATOM    149  CB  GLU A  36     -42.958   9.405  16.952  1.00 40.00           C  
+ATOM    150  CG  GLU A  36     -43.620  10.221  15.850  1.00 40.00           C  
+ATOM    151  CD  GLU A  36     -44.885   9.573  15.306  1.00 40.00           C  
+ATOM    152  OE1 GLU A  36     -44.957   9.388  14.068  1.00 40.00           O  
+ATOM    153  OE2 GLU A  36     -45.805   9.247  16.103  1.00 40.00           O  
+ATOM    154  N   PRO A  37     -41.128  10.514  20.032  1.00 40.00           N  
+ATOM    155  CA  PRO A  37     -40.925  10.163  21.443  1.00 40.00           C  
+ATOM    156  C   PRO A  37     -42.210  10.182  22.254  1.00 40.00           C  
+ATOM    157  O   PRO A  37     -43.074  11.034  22.044  1.00 40.00           O  
+ATOM    158  CB  PRO A  37     -39.998  11.277  21.952  1.00 40.00           C  
+ATOM    159  CG  PRO A  37     -40.282  12.447  21.069  1.00 40.00           C  
+ATOM    160  CD  PRO A  37     -40.593  11.860  19.720  1.00 40.00           C  
+ATOM    161  N   TYR A  38     -42.330   9.250  23.186  1.00 40.00           N  
+ATOM    162  CA  TYR A  38     -43.392   9.337  24.168  1.00 40.00           C  
+ATOM    163  C   TYR A  38     -43.159  10.548  25.084  1.00 40.00           C  
+ATOM    164  O   TYR A  38     -42.049  10.781  25.576  1.00 40.00           O  
+ATOM    165  CB  TYR A  38     -43.482   8.045  24.982  1.00 40.00           C  
+ATOM    166  CG  TYR A  38     -44.433   8.147  26.140  1.00 40.00           C  
+ATOM    167  CD1 TYR A  38     -45.807   7.979  25.963  1.00 40.00           C  
+ATOM    168  CD2 TYR A  38     -43.956   8.434  27.413  1.00 40.00           C  
+ATOM    169  CE1 TYR A  38     -46.677   8.086  27.029  1.00 40.00           C  
+ATOM    170  CE2 TYR A  38     -44.811   8.535  28.486  1.00 40.00           C  
+ATOM    171  CZ  TYR A  38     -46.164   8.366  28.293  1.00 40.00           C  
+ATOM    172  OH  TYR A  38     -46.982   8.477  29.393  1.00 40.00           O  
+ATOM    173  N   VAL A  39     -44.201  11.331  25.306  1.00 40.00           N  
+ATOM    174  CA  VAL A  39     -44.064  12.412  26.249  1.00 40.00           C  
+ATOM    175  C   VAL A  39     -44.601  11.918  27.577  1.00 40.00           C  
+ATOM    176  O   VAL A  39     -45.771  11.562  27.697  1.00 40.00           O  
+ATOM    177  CB  VAL A  39     -44.717  13.720  25.754  1.00 40.00           C  
+ATOM    178  CG1 VAL A  39     -44.727  14.770  26.847  1.00 40.00           C  
+ATOM    179  CG2 VAL A  39     -43.955  14.261  24.551  1.00 40.00           C  
+ATOM    180  N   GLY A  40     -43.702  11.848  28.551  1.00 40.00           N  
+ATOM    181  CA  GLY A  40     -44.030  11.417  29.907  1.00 40.00           C  
+ATOM    182  C   GLY A  40     -44.064  12.579  30.875  1.00 40.00           C  
+ATOM    183  O   GLY A  40     -44.082  13.734  30.467  1.00 40.00           O  
+ATOM    184  N   ARG A  41     -44.072  12.288  32.167  1.00 40.00           N  
+ATOM    185  CA  ARG A  41     -44.154  13.375  33.120  1.00 40.00           C  
+ATOM    186  C   ARG A  41     -43.387  13.136  34.402  1.00 40.00           C  
+ATOM    187  O   ARG A  41     -43.339  12.001  34.897  1.00 40.00           O  
+ATOM    188  CB  ARG A  41     -45.603  13.674  33.447  1.00 40.00           C  
+ATOM    189  CG  ARG A  41     -45.807  15.073  33.989  1.00 40.00           C  
+ATOM    190  CD  ARG A  41     -47.283  15.412  34.094  1.00 40.00           C  
+ATOM    191  NE  ARG A  41     -47.922  15.509  32.782  1.00 40.00           N  
+ATOM    192  CZ  ARG A  41     -48.022  16.630  32.072  1.00 40.00           C  
+ATOM    193  NH1 ARG A  41     -47.520  17.772  32.542  1.00 40.00           N  
+ATOM    194  NH2 ARG A  41     -48.619  16.605  30.883  1.00 40.00           N  
+ATOM    195  N   CYS A  42     -42.816  14.228  34.934  1.00 40.00           N  
+ATOM    196  CA  CYS A  42     -41.958  14.215  36.133  1.00 40.00           C  
+ATOM    197  C   CYS A  42     -42.762  14.117  37.430  1.00 40.00           C  
+ATOM    198  O   CYS A  42     -43.594  14.964  37.730  1.00 40.00           O  
+ATOM    199  CB  CYS A  42     -41.034  15.446  36.156  1.00 40.00           C  
+ATOM    200  SG  CYS A  42     -39.841  15.488  37.524  1.00 40.00           S  
+ATOM    201  N   LEU A  43     -42.502  13.070  38.196  1.00 40.00           N  
+ATOM    202  CA  LEU A  43     -43.235  12.832  39.417  1.00 40.00           C  
+ATOM    203  C   LEU A  43     -42.380  13.251  40.604  1.00 40.00           C  
+ATOM    204  O   LEU A  43     -42.809  14.064  41.421  1.00 40.00           O  
+ATOM    205  CB  LEU A  43     -43.630  11.351  39.513  1.00 40.00           C  
+ATOM    206  CG  LEU A  43     -44.789  10.752  38.693  1.00 40.00           C  
+ATOM    207  CD1 LEU A  43     -45.023  11.410  37.337  1.00 40.00           C  
+ATOM    208  CD2 LEU A  43     -44.591   9.248  38.532  1.00 40.00           C  
+ATOM    209  N   LEU A  44     -41.174  12.687  40.682  1.00 40.00           N  
+ATOM    210  CA  LEU A  44     -40.198  13.000  41.731  1.00 40.00           C  
+ATOM    211  C   LEU A  44     -38.964  13.607  41.105  1.00 40.00           C  
+ATOM    212  O   LEU A  44     -38.890  13.762  39.886  1.00 40.00           O  
+ATOM    213  CB  LEU A  44     -39.783  11.741  42.516  1.00 40.00           C  
+ATOM    214  CG  LEU A  44     -40.797  11.112  43.474  1.00 40.00           C  
+ATOM    215  CD1 LEU A  44     -40.100  10.077  44.349  1.00 40.00           C  
+ATOM    216  CD2 LEU A  44     -41.502  12.174  44.316  1.00 40.00           C  
+ATOM    217  N   ASN A  45     -38.003  13.943  41.960  1.00 40.00           N  
+ATOM    218  CA  ASN A  45     -36.712  14.492  41.563  1.00 40.00           C  
+ATOM    219  C   ASN A  45     -36.006  14.916  42.840  1.00 40.00           C  
+ATOM    220  O   ASN A  45     -36.197  16.022  43.330  1.00 40.00           O  
+ATOM    221  CB  ASN A  45     -36.854  15.678  40.576  1.00 40.00           C  
+ATOM    222  CG  ASN A  45     -35.547  16.018  39.854  1.00 40.00           C  
+ATOM    223  OD1 ASN A  45     -34.512  15.390  40.083  1.00 40.00           O  
+ATOM    224  ND2 ASN A  45     -35.596  17.017  38.969  1.00 40.00           N  
+ATOM    225  N   THR A  46     -35.206  14.016  43.389  1.00 40.00           N  
+ATOM    226  CA  THR A  46     -34.545  14.249  44.664  1.00 40.00           C  
+ATOM    227  C   THR A  46     -33.023  14.198  44.497  1.00 40.00           C  
+ATOM    228  O   THR A  46     -32.503  13.253  43.909  1.00 40.00           O  
+ATOM    229  CB  THR A  46     -34.994  13.176  45.676  1.00 40.00           C  
+ATOM    230  OG1 THR A  46     -36.415  13.026  45.596  1.00 40.00           O  
+ATOM    231  CG2 THR A  46     -34.581  13.531  47.102  1.00 40.00           C  
+ATOM    232  N   LYS A  47     -32.302  15.202  44.993  1.00 40.00           N  
+ATOM    233  CA  LYS A  47     -30.850  15.085  45.060  1.00 40.00           C  
+ATOM    234  C   LYS A  47     -30.584  13.942  46.019  1.00 40.00           C  
+ATOM    235  O   LYS A  47     -31.277  13.796  47.022  1.00 40.00           O  
+ATOM    236  CB  LYS A  47     -30.183  16.378  45.549  1.00 40.00           C  
+ATOM    237  CG  LYS A  47     -28.695  16.463  45.219  1.00 40.00           C  
+ATOM    238  CD  LYS A  47     -28.118  17.866  45.326  1.00 40.00           C  
+ATOM    239  CE  LYS A  47     -27.205  17.999  46.525  1.00 40.00           C  
+ATOM    240  NZ  LYS A  47     -26.233  19.097  46.295  1.00 40.00           N  
+ATOM    241  N   ILE A  48     -29.610  13.108  45.687  1.00 40.00           N  
+ATOM    242  CA  ILE A  48     -29.268  11.956  46.527  1.00 40.00           C  
+ATOM    243  C   ILE A  48     -27.803  11.960  47.021  1.00 40.00           C  
+ATOM    244  O   ILE A  48     -27.420  11.140  47.860  1.00 40.00           O  
+ATOM    245  CB  ILE A  48     -29.630  10.625  45.839  1.00 40.00           C  
+ATOM    246  CG1 ILE A  48     -29.110  10.621  44.405  1.00 40.00           C  
+ATOM    247  CG2 ILE A  48     -31.138  10.426  45.842  1.00 40.00           C  
+ATOM    248  CD1 ILE A  48     -28.765   9.252  43.880  1.00 40.00           C  
+ATOM    249  N   THR A  49     -26.995  12.881  46.488  1.00 40.00           N  
+ATOM    250  CA  THR A  49     -25.672  13.207  47.045  1.00 40.00           C  
+ATOM    251  C   THR A  49     -25.827  14.275  48.159  1.00 40.00           C  
+ATOM    252  O   THR A  49     -26.760  15.104  48.119  1.00 40.00           O  
+ATOM    253  CB  THR A  49     -24.658  13.706  45.963  1.00 40.00           C  
+ATOM    254  OG1 THR A  49     -25.212  14.791  45.208  1.00 40.00           O  
+ATOM    255  CG2 THR A  49     -24.258  12.608  45.001  1.00 40.00           C  
+ATOM    256  N   GLY A  50     -24.925  14.246  49.150  1.00 40.00           N  
+ATOM    257  CA  GLY A  50     -24.826  15.302  50.191  1.00 40.00           C  
+ATOM    258  C   GLY A  50     -24.474  16.671  49.608  1.00 40.00           C  
+ATOM    259  O   GLY A  50     -24.331  16.813  48.387  1.00 40.00           O  
+ATOM    260  N   ASP A  51     -24.336  17.692  50.450  1.00 40.00           N  
+ATOM    261  CA  ASP A  51     -24.119  19.048  49.917  1.00 40.00           C  
+ATOM    262  C   ASP A  51     -22.654  19.324  49.611  1.00 40.00           C  
+ATOM    263  O   ASP A  51     -22.311  20.122  48.725  1.00 40.00           O  
+ATOM    264  CB  ASP A  51     -24.703  20.088  50.863  1.00 40.00           C  
+ATOM    265  CG  ASP A  51     -26.211  20.175  50.759  1.00 40.00           C  
+ATOM    266  OD1 ASP A  51     -26.905  19.754  51.714  1.00 40.00           O  
+ATOM    267  OD2 ASP A  51     -26.699  20.651  49.706  1.00 40.00           O  
+ATOM    268  N   ASP A  52     -21.808  18.624  50.357  1.00 40.00           N  
+ATOM    269  CA  ASP A  52     -20.368  18.673  50.201  1.00 40.00           C  
+ATOM    270  C   ASP A  52     -19.892  17.891  48.971  1.00 40.00           C  
+ATOM    271  O   ASP A  52     -18.757  18.073  48.514  1.00 40.00           O  
+ATOM    272  CB  ASP A  52     -19.698  18.150  51.478  1.00 40.00           C  
+ATOM    273  CG  ASP A  52     -20.384  16.909  52.048  1.00 40.00           C  
+ATOM    274  OD1 ASP A  52     -21.637  16.813  52.034  1.00 40.00           O  
+ATOM    275  OD2 ASP A  52     -19.648  16.030  52.535  1.00 40.00           O  
+ATOM    276  N   ALA A  53     -20.771  17.037  48.439  1.00 40.00           N  
+ATOM    277  CA  ALA A  53     -20.493  16.213  47.250  1.00 40.00           C  
+ATOM    278  C   ALA A  53     -19.982  16.975  46.023  1.00 40.00           C  
+ATOM    279  O   ALA A  53     -20.568  17.984  45.608  1.00 40.00           O  
+ATOM    280  CB  ALA A  53     -21.718  15.397  46.877  1.00 40.00           C  
+ATOM    281  N   PRO A  54     -18.885  16.478  45.434  1.00 40.00           N  
+ATOM    282  CA  PRO A  54     -18.259  17.121  44.284  1.00 40.00           C  
+ATOM    283  C   PRO A  54     -19.181  17.402  43.079  1.00 40.00           C  
+ATOM    284  O   PRO A  54     -19.044  18.441  42.428  1.00 40.00           O  
+ATOM    285  CB  PRO A  54     -17.130  16.140  43.902  1.00 40.00           C  
+ATOM    286  CG  PRO A  54     -17.359  14.899  44.711  1.00 40.00           C  
+ATOM    287  CD  PRO A  54     -18.076  15.354  45.938  1.00 40.00           C  
+ATOM    288  N   GLY A  55     -20.116  16.500  42.796  1.00 40.00           N  
+ATOM    289  CA  GLY A  55     -20.763  16.496  41.487  1.00 40.00           C  
+ATOM    290  C   GLY A  55     -22.252  16.748  41.411  1.00 40.00           C  
+ATOM    291  O   GLY A  55     -22.731  17.305  40.418  1.00 40.00           O  
+ATOM    292  N   GLU A  56     -22.985  16.328  42.443  1.00 40.00           N  
+ATOM    293  CA  GLU A  56     -24.454  16.432  42.468  1.00 40.00           C  
+ATOM    294  C   GLU A  56     -25.172  15.432  41.517  1.00 40.00           C  
+ATOM    295  O   GLU A  56     -25.052  15.505  40.284  1.00 40.00           O  
+ATOM    296  CB  GLU A  56     -24.912  17.888  42.236  1.00 40.00           C  
+ATOM    297  CG  GLU A  56     -26.414  18.093  42.298  1.00 40.00           C  
+ATOM    298  CD  GLU A  56     -26.820  19.539  42.179  1.00 40.00           C  
+ATOM    299  OE1 GLU A  56     -26.457  20.334  43.065  1.00 40.00           O  
+ATOM    300  OE2 GLU A  56     -27.520  19.867  41.207  1.00 40.00           O  
+ATOM    301  N   THR A  57     -25.931  14.515  42.119  1.00 40.00           N  
+ATOM    302  CA  THR A  57     -26.616  13.446  41.399  1.00 40.00           C  
+ATOM    303  C   THR A  57     -28.043  13.255  41.921  1.00 40.00           C  
+ATOM    304  O   THR A  57     -28.260  13.062  43.114  1.00 40.00           O  
+ATOM    305  CB  THR A  57     -25.803  12.142  41.502  1.00 40.00           C  
+ATOM    306  OG1 THR A  57     -24.613  12.272  40.718  1.00 40.00           O  
+ATOM    307  CG2 THR A  57     -26.590  10.956  41.008  1.00 40.00           C  
+ATOM    308  N   TRP A  58     -29.004  13.307  41.004  1.00 40.00           N  
+ATOM    309  CA  TRP A  58     -30.434  13.245  41.326  1.00 40.00           C  
+ATOM    310  C   TRP A  58     -31.092  11.933  40.947  1.00 40.00           C  
+ATOM    311  O   TRP A  58     -30.743  11.335  39.923  1.00 40.00           O  
+ATOM    312  CB  TRP A  58     -31.155  14.372  40.595  1.00 40.00           C  
+ATOM    313  CG  TRP A  58     -30.775  15.755  41.046  1.00 40.00           C  
+ATOM    314  CD1 TRP A  58     -29.567  16.415  40.844  1.00 40.00           C  
+ATOM    315  CD2 TRP A  58     -31.608  16.703  41.794  1.00 40.00           C  
+ATOM    316  NE1 TRP A  58     -29.598  17.670  41.396  1.00 40.00           N  
+ATOM    317  CE2 TRP A  58     -30.791  17.903  41.983  1.00 40.00           C  
+ATOM    318  CE3 TRP A  58     -32.898  16.677  42.304  1.00 40.00           C  
+ATOM    319  CZ2 TRP A  58     -31.266  19.011  42.654  1.00 40.00           C  
+ATOM    320  CZ3 TRP A  58     -33.366  17.799  42.984  1.00 40.00           C  
+ATOM    321  CH2 TRP A  58     -32.571  18.939  43.153  1.00 40.00           C  
+ATOM    322  N   HIS A  59     -32.068  11.481  41.743  1.00 40.00           N  
+ATOM    323  CA  HIS A  59     -32.878  10.310  41.378  1.00 40.00           C  
+ATOM    324  C   HIS A  59     -34.281  10.627  40.983  1.00 40.00           C  
+ATOM    325  O   HIS A  59     -35.088  11.090  41.798  1.00 40.00           O  
+ATOM    326  CB  HIS A  59     -32.942   9.314  42.493  1.00 40.00           C  
+ATOM    327  CG  HIS A  59     -33.793   8.133  42.160  1.00 40.00           C  
+ATOM    328  ND1 HIS A  59     -33.340   7.113  41.424  1.00 40.00           N  
+ATOM    329  CD2 HIS A  59     -35.113   7.849  42.457  1.00 40.00           C  
+ATOM    330  CE1 HIS A  59     -34.306   6.200  41.283  1.00 40.00           C  
+ATOM    331  NE2 HIS A  59     -35.393   6.652  41.913  1.00 40.00           N  
+ATOM    332  N   MET A  60     -34.603  10.320  39.737  1.00 40.00           N  
+ATOM    333  CA  MET A  60     -35.849  10.782  39.170  1.00 40.00           C  
+ATOM    334  C   MET A  60     -36.703   9.667  38.610  1.00 40.00           C  
+ATOM    335  O   MET A  60     -36.186   8.702  38.054  1.00 40.00           O  
+ATOM    336  CB  MET A  60     -35.592  11.852  38.110  1.00 40.00           C  
+ATOM    337  CG  MET A  60     -34.631  11.461  37.002  1.00 40.00           C  
+ATOM    338  SD  MET A  60     -34.024  12.965  36.220  1.00 40.00           S  
+ATOM    339  CE  MET A  60     -32.764  13.417  37.401  1.00 40.00           C  
+ATOM    340  N   VAL A  61     -38.018   9.838  38.761  1.00 40.00           N  
+ATOM    341  CA  VAL A  61     -39.025   8.875  38.324  1.00 40.00           C  
+ATOM    342  C   VAL A  61     -40.008   9.534  37.337  1.00 40.00           C  
+ATOM    343  O   VAL A  61     -40.361  10.707  37.491  1.00 40.00           O  
+ATOM    344  CB  VAL A  61     -39.796   8.278  39.531  1.00 40.00           C  
+ATOM    345  CG1 VAL A  61     -40.247   6.862  39.218  1.00 40.00           C  
+ATOM    346  CG2 VAL A  61     -38.928   8.259  40.786  1.00 40.00           C  
+ATOM    347  N   PHE A  62     -40.438   8.783  36.322  1.00 40.00           N  
+ATOM    348  CA  PHE A  62     -41.399   9.295  35.336  1.00 40.00           C  
+ATOM    349  C   PHE A  62     -42.632   8.416  35.114  1.00 40.00           C  
+ATOM    350  O   PHE A  62     -42.584   7.179  35.279  1.00 40.00           O  
+ATOM    351  CB  PHE A  62     -40.738   9.530  33.976  1.00 40.00           C  
+ATOM    352  CG  PHE A  62     -39.466  10.322  34.031  1.00 40.00           C  
+ATOM    353  CD1 PHE A  62     -39.434  11.591  34.586  1.00 40.00           C  
+ATOM    354  CD2 PHE A  62     -38.298   9.804  33.482  1.00 40.00           C  
+ATOM    355  CE1 PHE A  62     -38.251  12.320  34.613  1.00 40.00           C  
+ATOM    356  CE2 PHE A  62     -37.111  10.527  33.504  1.00 40.00           C  
+ATOM    357  CZ  PHE A  62     -37.087  11.788  34.071  1.00 40.00           C  
+ATOM    358  N   SER A  63     -43.720   9.080  34.713  1.00 40.00           N  
+ATOM    359  CA  SER A  63     -44.963   8.426  34.328  1.00 40.00           C  
+ATOM    360  C   SER A  63     -44.881   7.967  32.874  1.00 40.00           C  
+ATOM    361  O   SER A  63     -44.475   8.728  31.981  1.00 40.00           O  
+ATOM    362  CB  SER A  63     -46.127   9.389  34.494  1.00 40.00           C  
+ATOM    363  OG  SER A  63     -45.875  10.568  33.749  1.00 40.00           O  
+ATOM    364  N   THR A  64     -45.292   6.714  32.667  1.00 40.00           N  
+ATOM    365  CA  THR A  64     -45.090   5.974  31.416  1.00 40.00           C  
+ATOM    366  C   THR A  64     -46.394   5.421  30.855  1.00 40.00           C  
+ATOM    367  O   THR A  64     -46.471   5.081  29.676  1.00 40.00           O  
+ATOM    368  CB  THR A  64     -44.178   4.749  31.645  1.00 40.00           C  
+ATOM    369  OG1 THR A  64     -44.864   3.776  32.443  1.00 40.00           O  
+ATOM    370  CG2 THR A  64     -42.914   5.139  32.379  1.00 40.00           C  
+ATOM    371  N   GLU A  65     -47.399   5.326  31.730  1.00 40.00           N  
+ATOM    372  CA  GLU A  65     -48.696   4.680  31.462  1.00 40.00           C  
+ATOM    373  C   GLU A  65     -48.599   3.163  31.192  1.00 40.00           C  
+ATOM    374  O   GLU A  65     -49.466   2.597  30.527  1.00 40.00           O  
+ATOM    375  CB  GLU A  65     -49.451   5.382  30.329  1.00 40.00           C  
+ATOM    376  CG  GLU A  65     -49.692   6.869  30.531  1.00 40.00           C  
+ATOM    377  CD  GLU A  65     -50.340   7.504  29.309  1.00 40.00           C  
+ATOM    378  OE1 GLU A  65     -51.537   7.226  29.062  1.00 40.00           O  
+ATOM    379  OE2 GLU A  65     -49.658   8.276  28.588  1.00 40.00           O  
+ATOM    380  N   GLY A  66     -47.560   2.510  31.719  1.00 40.00           N  
+ATOM    381  CA  GLY A  66     -47.309   1.087  31.443  1.00 40.00           C  
+ATOM    382  C   GLY A  66     -46.930   0.849  29.990  1.00 40.00           C  
+ATOM    383  O   GLY A  66     -46.709  -0.298  29.569  1.00 40.00           O  
+ATOM    384  N   LYS A  67     -46.842   1.958  29.244  1.00 40.00           N  
+ATOM    385  CA  LYS A  67     -46.648   1.973  27.779  1.00 40.00           C  
+ATOM    386  C   LYS A  67     -45.213   1.614  27.318  1.00 40.00           C  
+ATOM    387  O   LYS A  67     -44.925   1.554  26.100  1.00 40.00           O  
+ATOM    388  CB  LYS A  67     -47.116   3.324  27.173  1.00 40.00           C  
+ATOM    389  CG  LYS A  67     -48.639   3.472  27.026  1.00 40.00           C  
+ATOM    390  CD  LYS A  67     -49.052   4.687  26.184  1.00 40.00           C  
+ATOM    391  CE  LYS A  67     -50.562   4.731  25.952  1.00 40.00           C  
+ATOM    392  NZ  LYS A  67     -50.995   5.959  25.222  1.00 40.00           N  
+ATOM    393  N   ILE A  68     -44.325   1.383  28.289  1.00 40.00           N  
+ATOM    394  CA  ILE A  68     -42.946   1.039  27.993  1.00 40.00           C  
+ATOM    395  C   ILE A  68     -42.532  -0.130  28.856  1.00 40.00           C  
+ATOM    396  O   ILE A  68     -41.862   0.072  29.858  1.00 40.00           O  
+ATOM    397  CB  ILE A  68     -41.987   2.225  28.214  1.00 40.00           C  
+ATOM    398  CG1 ILE A  68     -42.425   3.445  27.375  1.00 40.00           C  
+ATOM    399  CG2 ILE A  68     -40.573   1.789  27.864  1.00 40.00           C  
+ATOM    400  CD1 ILE A  68     -41.767   4.769  27.724  1.00 40.00           C  
+ATOM    401  N   PRO A  69     -42.935  -1.360  28.467  1.00 40.00           N  
+ATOM    402  CA  PRO A  69     -42.637  -2.574  29.235  1.00 40.00           C  
+ATOM    403  C   PRO A  69     -41.153  -2.886  29.178  1.00 40.00           C  
+ATOM    404  O   PRO A  69     -40.732  -3.803  28.469  1.00 40.00           O  
+ATOM    405  CB  PRO A  69     -43.440  -3.661  28.513  1.00 40.00           C  
+ATOM    406  CG  PRO A  69     -43.521  -3.179  27.109  1.00 40.00           C  
+ATOM    407  CD  PRO A  69     -43.632  -1.679  27.205  1.00 40.00           C  
+ATOM    408  N   TYR A  70     -40.374  -2.099  29.916  1.00 40.00           N  
+ATOM    409  CA  TYR A  70     -38.932  -2.248  29.950  1.00 40.00           C  
+ATOM    410  C   TYR A  70     -38.521  -3.405  30.817  1.00 40.00           C  
+ATOM    411  O   TYR A  70     -39.291  -3.900  31.639  1.00 40.00           O  
+ATOM    412  CB  TYR A  70     -38.248  -0.961  30.424  1.00 40.00           C  
+ATOM    413  CG  TYR A  70     -38.543  -0.511  31.851  1.00 40.00           C  
+ATOM    414  CD1 TYR A  70     -37.698  -0.855  32.907  1.00 40.00           C  
+ATOM    415  CD2 TYR A  70     -39.644   0.302  32.135  1.00 40.00           C  
+ATOM    416  CE1 TYR A  70     -37.958  -0.421  34.204  1.00 40.00           C  
+ATOM    417  CE2 TYR A  70     -39.911   0.739  33.428  1.00 40.00           C  
+ATOM    418  CZ  TYR A  70     -39.067   0.380  34.456  1.00 40.00           C  
+ATOM    419  OH  TYR A  70     -39.345   0.822  35.732  1.00 40.00           O  
+ATOM    420  N   ARG A  71     -37.290  -3.834  30.622  1.00 40.00           N  
+ATOM    421  CA  ARG A  71     -36.788  -4.906  31.416  1.00 40.00           C  
+ATOM    422  C   ARG A  71     -35.400  -4.586  31.972  1.00 40.00           C  
+ATOM    423  O   ARG A  71     -34.612  -3.855  31.350  1.00 40.00           O  
+ATOM    424  CB  ARG A  71     -36.835  -6.212  30.626  1.00 40.00           C  
+ATOM    425  CG  ARG A  71     -37.151  -7.440  31.477  1.00 40.00           C  
+ATOM    426  CD  ARG A  71     -38.593  -7.499  31.989  1.00 40.00           C  
+ATOM    427  NE  ARG A  71     -39.564  -7.907  30.961  1.00 40.00           N  
+ATOM    428  CZ  ARG A  71     -39.833  -9.170  30.595  1.00 40.00           C  
+ATOM    429  NH1 ARG A  71     -39.198 -10.204  31.151  1.00 40.00           N  
+ATOM    430  NH2 ARG A  71     -40.742  -9.409  29.646  1.00 40.00           N  
+ATOM    431  N   GLU A  72     -35.148  -5.133  33.167  1.00 40.00           N  
+ATOM    432  CA  GLU A  72     -33.984  -4.850  34.010  1.00 40.00           C  
+ATOM    433  C   GLU A  72     -32.664  -4.822  33.253  1.00 40.00           C  
+ATOM    434  O   GLU A  72     -32.184  -5.860  32.796  1.00 40.00           O  
+ATOM    435  CB  GLU A  72     -33.909  -5.874  35.151  1.00 40.00           C  
+ATOM    436  CG  GLU A  72     -34.974  -5.723  36.237  1.00 40.00           C  
+ATOM    437  CD  GLU A  72     -36.307  -6.390  35.907  1.00 40.00           C  
+ATOM    438  OE1 GLU A  72     -36.381  -7.150  34.918  1.00 40.00           O  
+ATOM    439  OE2 GLU A  72     -37.294  -6.163  36.649  1.00 40.00           O  
+ATOM    440  N   GLY A  73     -32.090  -3.628  33.120  1.00 40.00           N  
+ATOM    441  CA  GLY A  73     -30.760  -3.483  32.542  1.00 40.00           C  
+ATOM    442  C   GLY A  73     -30.753  -2.563  31.359  1.00 40.00           C  
+ATOM    443  O   GLY A  73     -29.710  -2.106  30.888  1.00 40.00           O  
+ATOM    444  N   GLN A  74     -31.942  -2.286  30.878  1.00 40.00           N  
+ATOM    445  CA  GLN A  74     -32.066  -1.431  29.740  1.00 40.00           C  
+ATOM    446  C   GLN A  74     -31.752   0.006  30.134  1.00 40.00           C  
+ATOM    447  O   GLN A  74     -31.291   0.275  31.245  1.00 40.00           O  
+ATOM    448  CB  GLN A  74     -33.454  -1.578  29.124  1.00 40.00           C  
+ATOM    449  CG  GLN A  74     -33.702  -2.957  28.517  1.00 40.00           C  
+ATOM    450  CD  GLN A  74     -35.029  -3.062  27.790  1.00 40.00           C  
+ATOM    451  OE1 GLN A  74     -36.094  -3.173  28.407  1.00 40.00           O  
+ATOM    452  NE2 GLN A  74     -34.968  -3.039  26.464  1.00 40.00           N  
+ATOM    453  N   SER A  75     -31.998   0.921  29.208  1.00 40.00           N  
+ATOM    454  CA  SER A  75     -31.564   2.287  29.334  1.00 40.00           C  
+ATOM    455  C   SER A  75     -32.503   3.069  28.459  1.00 40.00           C  
+ATOM    456  O   SER A  75     -33.016   2.531  27.491  1.00 40.00           O  
+ATOM    457  CB  SER A  75     -30.145   2.404  28.774  1.00 40.00           C  
+ATOM    458  OG  SER A  75     -29.446   1.152  28.823  1.00 40.00           O  
+ATOM    459  N   ILE A  76     -32.737   4.333  28.764  1.00 40.00           N  
+ATOM    460  CA  ILE A  76     -33.582   5.116  27.866  1.00 40.00           C  
+ATOM    461  C   ILE A  76     -32.987   6.420  27.366  1.00 40.00           C  
+ATOM    462  O   ILE A  76     -31.976   6.922  27.874  1.00 40.00           O  
+ATOM    463  CB  ILE A  76     -34.985   5.384  28.439  1.00 40.00           C  
+ATOM    464  CG1 ILE A  76     -34.904   6.188  29.731  1.00 40.00           C  
+ATOM    465  CG2 ILE A  76     -35.734   4.084  28.648  1.00 40.00           C  
+ATOM    466  CD1 ILE A  76     -36.182   6.935  30.059  1.00 40.00           C  
+ATOM    467  N   GLY A  77     -33.654   6.959  26.356  1.00 40.00           N  
+ATOM    468  CA  GLY A  77     -33.234   8.179  25.712  1.00 40.00           C  
+ATOM    469  C   GLY A  77     -34.017   9.371  26.197  1.00 40.00           C  
+ATOM    470  O   GLY A  77     -35.193   9.273  26.550  1.00 40.00           O  
+ATOM    471  N   VAL A  78     -33.335  10.505  26.214  1.00 40.00           N  
+ATOM    472  CA  VAL A  78     -33.906  11.744  26.675  1.00 40.00           C  
+ATOM    473  C   VAL A  78     -33.591  12.832  25.662  1.00 40.00           C  
+ATOM    474  O   VAL A  78     -32.420  13.150  25.391  1.00 40.00           O  
+ATOM    475  CB  VAL A  78     -33.358  12.145  28.065  1.00 40.00           C  
+ATOM    476  CG1 VAL A  78     -33.909  13.507  28.478  1.00 40.00           C  
+ATOM    477  CG2 VAL A  78     -33.709  11.096  29.116  1.00 40.00           C  
+ATOM    478  N   ILE A  79     -34.661  13.376  25.091  1.00 40.00           N  
+ATOM    479  CA  ILE A  79     -34.580  14.580  24.271  1.00 40.00           C  
+ATOM    480  C   ILE A  79     -34.788  15.791  25.173  1.00 40.00           C  
+ATOM    481  O   ILE A  79     -35.906  16.045  25.671  1.00 40.00           O  
+ATOM    482  CB  ILE A  79     -35.621  14.597  23.124  1.00 40.00           C  
+ATOM    483  CG1 ILE A  79     -35.448  13.361  22.215  1.00 40.00           C  
+ATOM    484  CG2 ILE A  79     -35.524  15.914  22.347  1.00 40.00           C  
+ATOM    485  CD1 ILE A  79     -36.684  12.946  21.435  1.00 40.00           C  
+ATOM    486  N   ALA A  80     -33.687  16.513  25.384  1.00 40.00           N  
+ATOM    487  CA  ALA A  80     -33.678  17.749  26.175  1.00 40.00           C  
+ATOM    488  C   ALA A  80     -34.479  18.867  25.493  1.00 40.00           C  
+ATOM    489  O   ALA A  80     -34.510  18.977  24.250  1.00 40.00           O  
+ATOM    490  CB  ALA A  80     -32.243  18.203  26.469  1.00 40.00           C  
+ATOM    491  N   ASP A  81     -35.138  19.677  26.321  1.00 40.00           N  
+ATOM    492  CA  ASP A  81     -35.970  20.754  25.819  1.00 40.00           C  
+ATOM    493  C   ASP A  81     -35.108  21.891  25.296  1.00 40.00           C  
+ATOM    494  O   ASP A  81     -34.049  22.214  25.866  1.00 40.00           O  
+ATOM    495  CB  ASP A  81     -36.970  21.232  26.880  1.00 40.00           C  
+ATOM    496  CG  ASP A  81     -38.255  20.401  26.888  1.00 40.00           C  
+ATOM    497  OD1 ASP A  81     -38.262  19.276  26.330  1.00 40.00           O  
+ATOM    498  OD2 ASP A  81     -39.267  20.875  27.451  1.00 40.00           O  
+ATOM    499  N   GLY A  82     -35.569  22.472  24.190  1.00 40.00           N  
+ATOM    500  CA  GLY A  82     -34.833  23.508  23.487  1.00 40.00           C  
+ATOM    501  C   GLY A  82     -34.290  22.996  22.171  1.00 40.00           C  
+ATOM    502  O   GLY A  82     -34.594  21.870  21.739  1.00 40.00           O  
+ATOM    503  N   VAL A  83     -33.485  23.839  21.535  1.00 40.00           N  
+ATOM    504  CA  VAL A  83     -32.905  23.536  20.227  1.00 40.00           C  
+ATOM    505  C   VAL A  83     -31.386  23.798  20.223  1.00 40.00           C  
+ATOM    506  O   VAL A  83     -30.876  24.560  21.064  1.00 40.00           O  
+ATOM    507  CB  VAL A  83     -33.655  24.261  19.053  1.00 40.00           C  
+ATOM    508  CG1 VAL A  83     -35.043  23.648  18.824  1.00 40.00           C  
+ATOM    509  CG2 VAL A  83     -33.746  25.777  19.262  1.00 40.00           C  
+ATOM    510  N   ASP A  84     -30.668  23.138  19.307  1.00 40.00           N  
+ATOM    511  CA  ASP A  84     -29.243  23.408  19.089  1.00 40.00           C  
+ATOM    512  C   ASP A  84     -29.095  24.738  18.338  1.00 40.00           C  
+ATOM    513  O   ASP A  84     -30.096  25.440  18.107  1.00 40.00           O  
+ATOM    514  CB  ASP A  84     -28.555  22.244  18.344  1.00 40.00           C  
+ATOM    515  CG  ASP A  84     -29.096  22.025  16.935  1.00 40.00           C  
+ATOM    516  OD1 ASP A  84     -28.631  21.099  16.258  1.00 40.00           O  
+ATOM    517  OD2 ASP A  84     -29.980  22.766  16.487  1.00 40.00           O  
+ATOM    518  N   LYS A  85     -27.864  25.084  17.957  1.00 40.00           N  
+ATOM    519  CA  LYS A  85     -27.621  26.282  17.146  1.00 40.00           C  
+ATOM    520  C   LYS A  85     -28.473  26.388  15.855  1.00 40.00           C  
+ATOM    521  O   LYS A  85     -28.785  27.511  15.407  1.00 40.00           O  
+ATOM    522  CB  LYS A  85     -26.147  26.380  16.790  1.00 40.00           C  
+ATOM    523  CG  LYS A  85     -25.591  25.135  16.115  1.00 40.00           C  
+ATOM    524  CD  LYS A  85     -24.194  25.391  15.588  1.00 40.00           C  
+ATOM    525  CE  LYS A  85     -23.360  26.152  16.612  1.00 40.00           C  
+ATOM    526  NZ  LYS A  85     -23.672  25.752  18.019  1.00 40.00           N  
+ATOM    527  N   ASN A  86     -28.851  25.228  15.287  1.00 40.00           N  
+ATOM    528  CA  ASN A  86     -29.528  25.119  13.963  1.00 40.00           C  
+ATOM    529  C   ASN A  86     -31.074  25.049  13.961  1.00 40.00           C  
+ATOM    530  O   ASN A  86     -31.683  24.652  12.947  1.00 40.00           O  
+ATOM    531  CB  ASN A  86     -28.973  23.914  13.184  1.00 40.00           C  
+ATOM    532  CG  ASN A  86     -27.496  24.057  12.830  1.00 40.00           C  
+ATOM    533  OD1 ASN A  86     -26.940  23.182  12.170  1.00 40.00           O  
+ATOM    534  ND2 ASN A  86     -26.856  25.147  13.257  1.00 40.00           N  
+ATOM    535  N   GLY A  87     -31.690  25.441  15.086  1.00 40.00           N  
+ATOM    536  CA  GLY A  87     -33.138  25.295  15.311  1.00 40.00           C  
+ATOM    537  C   GLY A  87     -33.572  23.838  15.505  1.00 40.00           C  
+ATOM    538  O   GLY A  87     -34.777  23.552  15.696  1.00 40.00           O  
+ATOM    539  N   LYS A  88     -32.582  22.927  15.467  1.00 40.00           N  
+ATOM    540  CA  LYS A  88     -32.770  21.461  15.542  1.00 40.00           C  
+ATOM    541  C   LYS A  88     -32.750  20.935  16.979  1.00 40.00           C  
+ATOM    542  O   LYS A  88     -32.002  21.463  17.816  1.00 40.00           O  
+ATOM    543  CB  LYS A  88     -31.682  20.740  14.738  1.00 40.00           C  
+ATOM    544  CG  LYS A  88     -31.854  20.847  13.238  1.00 40.00           C  
+ATOM    545  CD  LYS A  88     -30.580  20.423  12.547  1.00 40.00           C  
+ATOM    546  CE  LYS A  88     -30.614  20.780  11.076  1.00 40.00           C  
+ATOM    547  NZ  LYS A  88     -29.401  20.226  10.412  1.00 40.00           N  
+ATOM    548  N   PRO A  89     -33.551  19.873  17.265  1.00 40.00           N  
+ATOM    549  CA  PRO A  89     -33.560  19.337  18.638  1.00 40.00           C  
+ATOM    550  C   PRO A  89     -32.130  19.033  19.111  1.00 40.00           C  
+ATOM    551  O   PRO A  89     -31.192  18.976  18.297  1.00 40.00           O  
+ATOM    552  CB  PRO A  89     -34.381  18.036  18.523  1.00 40.00           C  
+ATOM    553  CG  PRO A  89     -35.116  18.116  17.223  1.00 40.00           C  
+ATOM    554  CD  PRO A  89     -34.361  19.059  16.327  1.00 40.00           C  
+ATOM    555  N   HIS A  90     -31.957  18.865  20.417  1.00 40.00           N  
+ATOM    556  CA  HIS A  90     -30.689  18.342  20.936  1.00 40.00           C  
+ATOM    557  C   HIS A  90     -30.642  16.854  20.637  1.00 40.00           C  
+ATOM    558  O   HIS A  90     -31.658  16.255  20.244  1.00 40.00           O  
+ATOM    559  CB  HIS A  90     -30.518  18.644  22.437  1.00 40.00           C  
+ATOM    560  CG  HIS A  90     -30.581  20.127  22.779  1.00 40.00           C  
+ATOM    561  ND1 HIS A  90     -29.625  21.003  22.399  1.00 40.00           N  
+ATOM    562  CD2 HIS A  90     -31.538  20.873  23.483  1.00 40.00           C  
+ATOM    563  CE1 HIS A  90     -29.949  22.245  22.831  1.00 40.00           C  
+ATOM    564  NE2 HIS A  90     -31.120  22.165  23.493  1.00 40.00           N  
+ATOM    565  N   LYS A  91     -29.473  16.234  20.796  1.00 40.00           N  
+ATOM    566  CA  LYS A  91     -29.331  14.806  20.482  1.00 40.00           C  
+ATOM    567  C   LYS A  91     -29.667  13.918  21.692  1.00 40.00           C  
+ATOM    568  O   LYS A  91     -29.379  14.267  22.838  1.00 40.00           O  
+ATOM    569  CB  LYS A  91     -27.929  14.515  19.914  1.00 40.00           C  
+ATOM    570  CG  LYS A  91     -27.882  13.452  18.813  1.00 40.00           C  
+ATOM    571  CD  LYS A  91     -28.185  13.974  17.411  1.00 40.00           C  
+ATOM    572  CE  LYS A  91     -26.907  14.289  16.635  1.00 40.00           C  
+ATOM    573  NZ  LYS A  91     -27.166  15.339  15.604  1.00 40.00           N  
+ATOM    574  N   VAL A  92     -30.307  12.786  21.416  1.00 40.00           N  
+ATOM    575  CA  VAL A  92     -30.689  11.803  22.429  1.00 40.00           C  
+ATOM    576  C   VAL A  92     -29.541  11.474  23.366  1.00 40.00           C  
+ATOM    577  O   VAL A  92     -28.484  11.042  22.928  1.00 40.00           O  
+ATOM    578  CB  VAL A  92     -31.156  10.494  21.760  1.00 40.00           C  
+ATOM    579  CG1 VAL A  92     -31.308   9.366  22.770  1.00 40.00           C  
+ATOM    580  CG2 VAL A  92     -32.464  10.722  21.036  1.00 40.00           C  
+ATOM    581  N   ARG A  93     -29.736  11.689  24.656  1.00 40.00           N  
+ATOM    582  CA  ARG A  93     -28.787  11.168  25.618  1.00 40.00           C  
+ATOM    583  C   ARG A  93     -29.381   9.936  26.265  1.00 40.00           C  
+ATOM    584  O   ARG A  93     -30.591   9.826  26.421  1.00 40.00           O  
+ATOM    585  CB  ARG A  93     -28.426  12.213  26.668  1.00 40.00           C  
+ATOM    586  CG  ARG A  93     -27.177  13.021  26.352  1.00 40.00           C  
+ATOM    587  CD  ARG A  93     -27.400  13.906  25.150  1.00 40.00           C  
+ATOM    588  NE  ARG A  93     -26.626  15.133  25.226  1.00 40.00           N  
+ATOM    589  CZ  ARG A  93     -26.703  16.119  24.338  1.00 40.00           C  
+ATOM    590  NH1 ARG A  93     -27.517  16.021  23.289  1.00 40.00           N  
+ATOM    591  NH2 ARG A  93     -25.963  17.211  24.499  1.00 40.00           N  
+ATOM    592  N   LEU A  94     -28.529   9.001  26.643  1.00 40.00           N  
+ATOM    593  CA  LEU A  94     -29.027   7.768  27.204  1.00 40.00           C  
+ATOM    594  C   LEU A  94     -28.708   7.629  28.673  1.00 40.00           C  
+ATOM    595  O   LEU A  94     -27.617   7.998  29.129  1.00 40.00           O  
+ATOM    596  CB  LEU A  94     -28.463   6.587  26.439  1.00 40.00           C  
+ATOM    597  CG  LEU A  94     -28.893   6.493  24.976  1.00 40.00           C  
+ATOM    598  CD1 LEU A  94     -28.234   5.277  24.332  1.00 40.00           C  
+ATOM    599  CD2 LEU A  94     -30.406   6.428  24.827  1.00 40.00           C  
+ATOM    600  N   TYR A  95     -29.680   7.099  29.409  1.00 40.00           N  
+ATOM    601  CA  TYR A  95     -29.533   6.926  30.843  1.00 40.00           C  
+ATOM    602  C   TYR A  95     -30.029   5.551  31.267  1.00 40.00           C  
+ATOM    603  O   TYR A  95     -31.121   5.129  30.892  1.00 40.00           O  
+ATOM    604  CB  TYR A  95     -30.274   8.062  31.574  1.00 40.00           C  
+ATOM    605  CG  TYR A  95     -29.678   9.428  31.276  1.00 40.00           C  
+ATOM    606  CD1 TYR A  95     -28.523   9.869  31.947  1.00 40.00           C  
+ATOM    607  CD2 TYR A  95     -30.238  10.261  30.301  1.00 40.00           C  
+ATOM    608  CE1 TYR A  95     -27.957  11.108  31.666  1.00 40.00           C  
+ATOM    609  CE2 TYR A  95     -29.678  11.501  30.017  1.00 40.00           C  
+ATOM    610  CZ  TYR A  95     -28.536  11.915  30.700  1.00 40.00           C  
+ATOM    611  OH  TYR A  95     -27.951  13.132  30.436  1.00 40.00           O  
+ATOM    612  N   SER A  96     -29.188   4.852  32.030  1.00 40.00           N  
+ATOM    613  CA  SER A  96     -29.441   3.478  32.434  1.00 40.00           C  
+ATOM    614  C   SER A  96     -30.620   3.475  33.347  1.00 40.00           C  
+ATOM    615  O   SER A  96     -30.680   4.268  34.269  1.00 40.00           O  
+ATOM    616  CB  SER A  96     -28.242   2.913  33.186  1.00 40.00           C  
+ATOM    617  OG  SER A  96     -27.015   3.360  32.632  1.00 40.00           O  
+ATOM    618  N   ILE A  97     -31.561   2.578  33.097  1.00 40.00           N  
+ATOM    619  CA  ILE A  97     -32.782   2.575  33.869  1.00 40.00           C  
+ATOM    620  C   ILE A  97     -32.546   2.089  35.280  1.00 40.00           C  
+ATOM    621  O   ILE A  97     -32.032   0.990  35.500  1.00 40.00           O  
+ATOM    622  CB  ILE A  97     -33.883   1.756  33.198  1.00 40.00           C  
+ATOM    623  CG1 ILE A  97     -34.219   2.376  31.841  1.00 40.00           C  
+ATOM    624  CG2 ILE A  97     -35.114   1.715  34.091  1.00 40.00           C  
+ATOM    625  CD1 ILE A  97     -34.996   1.463  30.933  1.00 40.00           C  
+ATOM    626  N   ALA A  98     -32.951   2.928  36.224  1.00 40.00           N  
+ATOM    627  CA  ALA A  98     -32.674   2.712  37.625  1.00 40.00           C  
+ATOM    628  C   ALA A  98     -33.733   1.884  38.321  1.00 40.00           C  
+ATOM    629  O   ALA A  98     -33.386   1.093  39.192  1.00 40.00           O  
+ATOM    630  CB  ALA A  98     -32.493   4.042  38.330  1.00 40.00           C  
+ATOM    631  N   SER A  99     -35.009   2.059  37.957  1.00 40.00           N  
+ATOM    632  CA  SER A  99     -36.078   1.250  38.572  1.00 40.00           C  
+ATOM    633  C   SER A  99     -36.173  -0.154  37.983  1.00 40.00           C  
+ATOM    634  O   SER A  99     -35.708  -0.389  36.876  1.00 40.00           O  
+ATOM    635  CB  SER A  99     -37.439   1.950  38.506  1.00 40.00           C  
+ATOM    636  OG  SER A  99     -37.670   2.505  37.233  1.00 40.00           O  
+ATOM    637  N   SER A 100     -36.767  -1.084  38.728  1.00 40.00           N  
+ATOM    638  CA  SER A 100     -37.017  -2.428  38.218  1.00 40.00           C  
+ATOM    639  C   SER A 100     -38.166  -2.382  37.222  1.00 40.00           C  
+ATOM    640  O   SER A 100     -38.791  -1.351  37.052  1.00 40.00           O  
+ATOM    641  CB  SER A 100     -37.387  -3.366  39.357  1.00 40.00           C  
+ATOM    642  OG  SER A 100     -38.731  -3.151  39.748  1.00 40.00           O  
+ATOM    643  N   ALA A 101     -38.464  -3.506  36.587  1.00 40.00           N  
+ATOM    644  CA  ALA A 101     -39.560  -3.574  35.631  1.00 40.00           C  
+ATOM    645  C   ALA A 101     -40.817  -2.937  36.207  1.00 40.00           C  
+ATOM    646  O   ALA A 101     -41.525  -2.174  35.545  1.00 40.00           O  
+ATOM    647  CB  ALA A 101     -39.829  -5.026  35.256  1.00 40.00           C  
+ATOM    648  N   ILE A 102     -41.054  -3.239  37.472  1.00 40.00           N  
+ATOM    649  CA  ILE A 102     -42.299  -2.917  38.129  1.00 40.00           C  
+ATOM    650  C   ILE A 102     -42.355  -1.438  38.499  1.00 40.00           C  
+ATOM    651  O   ILE A 102     -43.403  -0.918  38.896  1.00 40.00           O  
+ATOM    652  CB  ILE A 102     -42.472  -3.800  39.381  1.00 40.00           C  
+ATOM    653  CG1 ILE A 102     -41.786  -5.167  39.177  1.00 40.00           C  
+ATOM    654  CG2 ILE A 102     -43.949  -3.957  39.721  1.00 40.00           C  
+ATOM    655  CD1 ILE A 102     -42.319  -6.004  38.026  1.00 40.00           C  
+ATOM    656  N   GLY A 103     -41.219  -0.764  38.345  1.00 40.00           N  
+ATOM    657  CA  GLY A 103     -41.067   0.630  38.746  1.00 40.00           C  
+ATOM    658  C   GLY A 103     -40.758   0.734  40.222  1.00 40.00           C  
+ATOM    659  O   GLY A 103     -40.701  -0.274  40.947  1.00 40.00           O  
+ATOM    660  N   ASP A 104     -40.554   1.962  40.672  1.00 40.00           N  
+ATOM    661  CA  ASP A 104     -40.362   2.218  42.095  1.00 40.00           C  
+ATOM    662  C   ASP A 104     -41.646   2.044  42.909  1.00 40.00           C  
+ATOM    663  O   ASP A 104     -41.615   1.767  44.112  1.00 40.00           O  
+ATOM    664  CB  ASP A 104     -39.807   3.623  42.301  1.00 40.00           C  
+ATOM    665  CG  ASP A 104     -38.379   3.741  41.857  1.00 40.00           C  
+ATOM    666  OD1 ASP A 104     -37.629   2.735  41.974  1.00 40.00           O  
+ATOM    667  OD2 ASP A 104     -38.015   4.846  41.398  1.00 40.00           O  
+ATOM    668  N   PHE A 105     -42.782   2.210  42.251  1.00 40.00           N  
+ATOM    669  CA  PHE A 105     -44.036   2.109  42.953  1.00 40.00           C  
+ATOM    670  C   PHE A 105     -44.558   0.697  42.851  1.00 40.00           C  
+ATOM    671  O   PHE A 105     -45.513   0.355  43.526  1.00 40.00           O  
+ATOM    672  CB  PHE A 105     -45.046   3.121  42.414  1.00 40.00           C  
+ATOM    673  CG  PHE A 105     -44.503   4.518  42.311  1.00 40.00           C  
+ATOM    674  CD1 PHE A 105     -43.559   4.986  43.233  1.00 40.00           C  
+ATOM    675  CD2 PHE A 105     -44.938   5.379  41.303  1.00 40.00           C  
+ATOM    676  CE1 PHE A 105     -43.049   6.280  43.137  1.00 40.00           C  
+ATOM    677  CE2 PHE A 105     -44.437   6.676  41.201  1.00 40.00           C  
+ATOM    678  CZ  PHE A 105     -43.492   7.130  42.118  1.00 40.00           C  
+ATOM    679  N   GLY A 106     -43.925  -0.126  42.018  1.00 40.00           N  
+ATOM    680  CA  GLY A 106     -44.315  -1.525  41.884  1.00 40.00           C  
+ATOM    681  C   GLY A 106     -45.626  -1.729  41.145  1.00 40.00           C  
+ATOM    682  O   GLY A 106     -46.351  -2.689  41.409  1.00 40.00           O  
+ATOM    683  N   ASP A 107     -45.917  -0.836  40.205  1.00 40.00           N  
+ATOM    684  CA  ASP A 107     -47.158  -0.895  39.444  1.00 40.00           C  
+ATOM    685  C   ASP A 107     -46.914  -0.878  37.932  1.00 40.00           C  
+ATOM    686  O   ASP A 107     -47.855  -0.914  37.157  1.00 40.00           O  
+ATOM    687  CB  ASP A 107     -48.078   0.264  39.848  1.00 40.00           C  
+ATOM    688  CG  ASP A 107     -47.636   1.607  39.256  1.00 40.00           C  
+ATOM    689  OD1 ASP A 107     -46.415   1.871  39.206  1.00 40.00           O  
+ATOM    690  OD2 ASP A 107     -48.511   2.401  38.839  1.00 40.00           O  
+ATOM    691  N   SER A 108     -45.649  -0.801  37.530  1.00 40.00           N  
+ATOM    692  CA  SER A 108     -45.237  -0.830  36.119  1.00 40.00           C  
+ATOM    693  C   SER A 108     -45.753   0.328  35.243  1.00 40.00           C  
+ATOM    694  O   SER A 108     -45.887   0.174  34.033  1.00 40.00           O  
+ATOM    695  CB  SER A 108     -45.573  -2.184  35.491  1.00 40.00           C  
+ATOM    696  OG  SER A 108     -44.964  -3.235  36.213  1.00 40.00           O  
+ATOM    697  N   LYS A 109     -46.022   1.480  35.858  1.00 40.00           N  
+ATOM    698  CA  LYS A 109     -46.450   2.704  35.149  1.00 40.00           C  
+ATOM    699  C   LYS A 109     -45.403   3.816  35.304  1.00 40.00           C  
+ATOM    700  O   LYS A 109     -45.703   5.018  35.218  1.00 40.00           O  
+ATOM    701  CB  LYS A 109     -47.790   3.192  35.709  1.00 40.00           C  
+ATOM    702  CG  LYS A 109     -48.906   2.154  35.719  1.00 40.00           C  
+ATOM    703  CD  LYS A 109     -49.242   1.651  34.318  1.00 40.00           C  
+ATOM    704  CE  LYS A 109     -50.562   0.893  34.262  1.00 40.00           C  
+ATOM    705  NZ  LYS A 109     -51.743   1.801  34.275  1.00 40.00           N  
+ATOM    706  N   THR A 110     -44.164   3.378  35.520  1.00 40.00           N  
+ATOM    707  CA  THR A 110     -43.132   4.200  36.133  1.00 40.00           C  
+ATOM    708  C   THR A 110     -41.740   3.770  35.740  1.00 40.00           C  
+ATOM    709  O   THR A 110     -41.391   2.581  35.825  1.00 40.00           O  
+ATOM    710  CB  THR A 110     -43.176   4.086  37.673  1.00 40.00           C  
+ATOM    711  OG1 THR A 110     -42.773   2.762  38.086  1.00 40.00           O  
+ATOM    712  CG2 THR A 110     -44.582   4.402  38.198  1.00 40.00           C  
+ATOM    713  N   VAL A 111     -40.942   4.758  35.352  1.00 40.00           N  
+ATOM    714  CA  VAL A 111     -39.539   4.547  35.046  1.00 40.00           C  
+ATOM    715  C   VAL A 111     -38.681   5.464  35.922  1.00 40.00           C  
+ATOM    716  O   VAL A 111     -39.092   6.584  36.201  1.00 40.00           O  
+ATOM    717  CB  VAL A 111     -39.270   4.819  33.558  1.00 40.00           C  
+ATOM    718  CG1 VAL A 111     -39.332   6.304  33.259  1.00 40.00           C  
+ATOM    719  CG2 VAL A 111     -37.935   4.229  33.131  1.00 40.00           C  
+ATOM    720  N   SER A 112     -37.500   4.993  36.344  1.00 40.00           N  
+ATOM    721  CA  SER A 112     -36.612   5.768  37.210  1.00 40.00           C  
+ATOM    722  C   SER A 112     -35.195   5.904  36.669  1.00 40.00           C  
+ATOM    723  O   SER A 112     -34.578   4.915  36.265  1.00 40.00           O  
+ATOM    724  CB  SER A 112     -36.581   5.142  38.589  1.00 40.00           C  
+ATOM    725  OG  SER A 112     -37.902   4.802  38.978  1.00 40.00           O  
+ATOM    726  N   LEU A 113     -34.700   7.146  36.678  1.00 40.00           N  
+ATOM    727  CA  LEU A 113     -33.350   7.495  36.226  1.00 40.00           C  
+ATOM    728  C   LEU A 113     -32.426   7.979  37.334  1.00 40.00           C  
+ATOM    729  O   LEU A 113     -32.875   8.519  38.340  1.00 40.00           O  
+ATOM    730  CB  LEU A 113     -33.423   8.601  35.188  1.00 40.00           C  
+ATOM    731  CG  LEU A 113     -33.742   8.182  33.763  1.00 40.00           C  
+ATOM    732  CD1 LEU A 113     -33.598   9.386  32.853  1.00 40.00           C  
+ATOM    733  CD2 LEU A 113     -32.802   7.078  33.325  1.00 40.00           C  
+ATOM    734  N   CYS A 114     -31.127   7.812  37.125  1.00 40.00           N  
+ATOM    735  CA  CYS A 114     -30.134   8.284  38.069  1.00 40.00           C  
+ATOM    736  C   CYS A 114     -29.172   9.188  37.325  1.00 40.00           C  
+ATOM    737  O   CYS A 114     -28.409   8.728  36.475  1.00 40.00           O  
+ATOM    738  CB  CYS A 114     -29.409   7.100  38.680  1.00 40.00           C  
+ATOM    739  SG  CYS A 114     -28.053   7.523  39.784  1.00 40.00           S  
+ATOM    740  N   VAL A 115     -29.225  10.479  37.626  1.00 40.00           N  
+ATOM    741  CA  VAL A 115     -28.500  11.460  36.823  1.00 40.00           C  
+ATOM    742  C   VAL A 115     -27.558  12.344  37.630  1.00 40.00           C  
+ATOM    743  O   VAL A 115     -27.969  13.010  38.587  1.00 40.00           O  
+ATOM    744  CB  VAL A 115     -29.450  12.373  36.020  1.00 40.00           C  
+ATOM    745  CG1 VAL A 115     -28.696  13.063  34.888  1.00 40.00           C  
+ATOM    746  CG2 VAL A 115     -30.614  11.582  35.463  1.00 40.00           C  
+ATOM    747  N   LYS A 116     -26.291  12.354  37.219  1.00 40.00           N  
+ATOM    748  CA  LYS A 116     -25.312  13.297  37.734  1.00 40.00           C  
+ATOM    749  C   LYS A 116     -25.303  14.521  36.826  1.00 40.00           C  
+ATOM    750  O   LYS A 116     -25.272  14.409  35.591  1.00 40.00           O  
+ATOM    751  CB  LYS A 116     -23.925  12.667  37.794  1.00 40.00           C  
+ATOM    752  CG  LYS A 116     -22.913  13.470  38.580  1.00 40.00           C  
+ATOM    753  CD  LYS A 116     -21.544  13.277  37.972  1.00 40.00           C  
+ATOM    754  CE  LYS A 116     -20.591  14.385  38.372  1.00 40.00           C  
+ATOM    755  NZ  LYS A 116     -19.921  14.036  39.646  1.00 40.00           N  
+ATOM    756  N   ARG A 117     -25.360  15.685  37.466  1.00 40.00           N  
+ATOM    757  CA  ARG A 117     -25.310  16.981  36.805  1.00 40.00           C  
+ATOM    758  C   ARG A 117     -23.893  17.241  36.254  1.00 40.00           C  
+ATOM    759  O   ARG A 117     -22.926  17.397  37.016  1.00 40.00           O  
+ATOM    760  CB  ARG A 117     -25.724  18.062  37.817  1.00 40.00           C  
+ATOM    761  CG  ARG A 117     -26.222  19.356  37.206  1.00 40.00           C  
+ATOM    762  CD  ARG A 117     -26.411  20.435  38.260  1.00 40.00           C  
+ATOM    763  NE  ARG A 117     -27.721  20.374  38.908  1.00 40.00           N  
+ATOM    764  CZ  ARG A 117     -28.829  20.947  38.438  1.00 40.00           C  
+ATOM    765  NH1 ARG A 117     -28.806  21.629  37.299  1.00 40.00           N  
+ATOM    766  NH2 ARG A 117     -29.968  20.835  39.110  1.00 40.00           N  
+ATOM    767  N   LEU A 118     -23.767  17.254  34.928  1.00 40.00           N  
+ATOM    768  CA  LEU A 118     -22.479  17.524  34.289  1.00 40.00           C  
+ATOM    769  C   LEU A 118     -22.130  19.002  34.438  1.00 40.00           C  
+ATOM    770  O   LEU A 118     -22.697  19.844  33.730  1.00 40.00           O  
+ATOM    771  CB  LEU A 118     -22.512  17.118  32.798  1.00 40.00           C  
+ATOM    772  CG  LEU A 118     -21.355  17.468  31.845  1.00 40.00           C  
+ATOM    773  CD1 LEU A 118     -20.050  16.822  32.286  1.00 40.00           C  
+ATOM    774  CD2 LEU A 118     -21.666  17.083  30.406  1.00 40.00           C  
+ATOM    775  N   ILE A 119     -21.237  19.320  35.381  1.00 40.00           N  
+ATOM    776  CA  ILE A 119     -20.637  20.668  35.454  1.00 40.00           C  
+ATOM    777  C   ILE A 119     -19.129  20.613  35.733  1.00 40.00           C  
+ATOM    778  O   ILE A 119     -18.690  20.060  36.746  1.00 40.00           O  
+ATOM    779  CB  ILE A 119     -21.336  21.634  36.455  1.00 40.00           C  
+ATOM    780  CG1 ILE A 119     -22.827  21.824  36.124  1.00 40.00           C  
+ATOM    781  CG2 ILE A 119     -20.641  22.992  36.423  1.00 40.00           C  
+ATOM    782  CD1 ILE A 119     -23.622  22.615  37.146  1.00 40.00           C  
+ATOM    783  N   TYR A 120     -18.358  21.178  34.803  1.00 40.00           N  
+ATOM    784  CA  TYR A 120     -16.898  21.312  34.919  1.00 40.00           C  
+ATOM    785  C   TYR A 120     -16.486  22.749  34.631  1.00 40.00           C  
+ATOM    786  O   TYR A 120     -17.273  23.525  34.095  1.00 40.00           O  
+ATOM    787  CB  TYR A 120     -16.127  20.328  33.992  1.00 40.00           C  
+ATOM    788  CG  TYR A 120     -16.482  20.331  32.489  1.00 40.00           C  
+ATOM    789  CD1 TYR A 120     -17.665  19.724  32.018  1.00 40.00           C  
+ATOM    790  CD2 TYR A 120     -15.617  20.891  31.532  1.00 40.00           C  
+ATOM    791  CE1 TYR A 120     -17.991  19.699  30.659  1.00 40.00           C  
+ATOM    792  CE2 TYR A 120     -15.940  20.867  30.164  1.00 40.00           C  
+ATOM    793  CZ  TYR A 120     -17.128  20.265  29.732  1.00 40.00           C  
+ATOM    794  OH  TYR A 120     -17.481  20.224  28.390  1.00 40.00           O  
+ATOM    795  N   THR A 121     -15.264  23.097  35.025  1.00 40.00           N  
+ATOM    796  CA  THR A 121     -14.608  24.343  34.610  1.00 40.00           C  
+ATOM    797  C   THR A 121     -13.546  23.922  33.568  1.00 40.00           C  
+ATOM    798  O   THR A 121     -12.801  22.960  33.812  1.00 40.00           O  
+ATOM    799  CB  THR A 121     -14.024  25.127  35.848  1.00 40.00           C  
+ATOM    800  OG1 THR A 121     -15.065  25.870  36.507  1.00 40.00           O  
+ATOM    801  CG2 THR A 121     -12.909  26.121  35.477  1.00 40.00           C  
+ATOM    802  N   ASN A 122     -13.515  24.577  32.397  1.00 40.00           N  
+ATOM    803  CA  ASN A 122     -12.383  24.390  31.444  1.00 40.00           C  
+ATOM    804  C   ASN A 122     -11.133  25.248  31.785  1.00 40.00           C  
+ATOM    805  O   ASN A 122     -11.107  25.916  32.834  1.00 40.00           O  
+ATOM    806  CB  ASN A 122     -12.798  24.456  29.939  1.00 40.00           C  
+ATOM    807  CG  ASN A 122     -13.401  25.803  29.513  1.00 40.00           C  
+ATOM    808  OD1 ASN A 122     -12.796  26.869  29.669  1.00 40.00           O  
+ATOM    809  ND2 ASN A 122     -14.586  25.741  28.912  1.00 40.00           N  
+ATOM    810  N   ASP A 123     -10.105  25.215  30.925  1.00 40.00           N  
+ATOM    811  CA  ASP A 123      -8.842  25.962  31.178  1.00 40.00           C  
+ATOM    812  C   ASP A 123      -8.906  27.528  31.050  1.00 40.00           C  
+ATOM    813  O   ASP A 123      -7.963  28.247  31.453  1.00 40.00           O  
+ATOM    814  CB  ASP A 123      -7.632  25.339  30.423  1.00 40.00           C  
+ATOM    815  CG  ASP A 123      -7.922  25.017  28.942  1.00 40.00           C  
+ATOM    816  OD1 ASP A 123      -8.986  25.411  28.394  1.00 40.00           O  
+ATOM    817  OD2 ASP A 123      -7.046  24.360  28.326  1.00 40.00           O  
+ATOM    818  N   ALA A 124     -10.021  28.041  30.517  1.00 40.00           N  
+ATOM    819  CA  ALA A 124     -10.295  29.487  30.481  1.00 40.00           C  
+ATOM    820  C   ALA A 124     -11.108  30.011  31.708  1.00 40.00           C  
+ATOM    821  O   ALA A 124     -11.480  31.195  31.749  1.00 40.00           O  
+ATOM    822  CB  ALA A 124     -10.959  29.865  29.155  1.00 40.00           C  
+ATOM    823  N   GLY A 125     -11.349  29.135  32.700  1.00 40.00           N  
+ATOM    824  CA  GLY A 125     -12.114  29.457  33.926  1.00 40.00           C  
+ATOM    825  C   GLY A 125     -13.628  29.297  33.788  1.00 40.00           C  
+ATOM    826  O   GLY A 125     -14.375  29.486  34.768  1.00 40.00           O  
+ATOM    827  N   GLU A 126     -14.052  28.912  32.574  1.00 40.00           N  
+ATOM    828  CA  GLU A 126     -15.458  28.920  32.097  1.00 40.00           C  
+ATOM    829  C   GLU A 126     -16.289  27.700  32.509  1.00 40.00           C  
+ATOM    830  O   GLU A 126     -16.063  26.596  32.002  1.00 40.00           O  
+ATOM    831  CB  GLU A 126     -15.495  29.041  30.559  1.00 40.00           C  
+ATOM    832  CG  GLU A 126     -14.751  30.247  29.999  1.00 40.00           C  
+ATOM    833  CD  GLU A 126     -14.203  30.032  28.593  1.00 40.00           C  
+ATOM    834  OE1 GLU A 126     -13.985  28.867  28.172  1.00 40.00           O  
+ATOM    835  OE2 GLU A 126     -13.960  31.055  27.912  1.00 40.00           O  
+ATOM    836  N   ILE A 127     -17.258  27.922  33.406  1.00 40.00           N  
+ATOM    837  CA  ILE A 127     -18.194  26.882  33.880  1.00 40.00           C  
+ATOM    838  C   ILE A 127     -19.071  26.318  32.736  1.00 40.00           C  
+ATOM    839  O   ILE A 127     -19.987  26.998  32.234  1.00 40.00           O  
+ATOM    840  CB  ILE A 127     -19.036  27.368  35.107  1.00 40.00           C  
+ATOM    841  CG1 ILE A 127     -18.186  27.333  36.389  1.00 40.00           C  
+ATOM    842  CG2 ILE A 127     -20.310  26.546  35.298  1.00 40.00           C  
+ATOM    843  CD1 ILE A 127     -18.945  27.614  37.674  1.00 40.00           C  
+ATOM    844  N   VAL A 128     -18.751  25.079  32.330  1.00 40.00           N  
+ATOM    845  CA  VAL A 128     -19.491  24.319  31.302  1.00 40.00           C  
+ATOM    846  C   VAL A 128     -20.505  23.383  31.972  1.00 40.00           C  
+ATOM    847  O   VAL A 128     -20.198  22.706  32.961  1.00 40.00           O  
+ATOM    848  CB  VAL A 128     -18.553  23.472  30.397  1.00 40.00           C  
+ATOM    849  CG1 VAL A 128     -19.304  22.932  29.185  1.00 40.00           C  
+ATOM    850  CG2 VAL A 128     -17.339  24.274  29.947  1.00 40.00           C  
+ATOM    851  N   LYS A 129     -21.714  23.361  31.421  1.00 40.00           N  
+ATOM    852  CA  LYS A 129     -22.788  22.508  31.928  1.00 40.00           C  
+ATOM    853  C   LYS A 129     -23.339  21.556  30.837  1.00 40.00           C  
+ATOM    854  O   LYS A 129     -23.557  21.965  29.685  1.00 40.00           O  
+ATOM    855  CB  LYS A 129     -23.926  23.366  32.503  1.00 40.00           C  
+ATOM    856  CG  LYS A 129     -23.519  24.435  33.513  1.00 40.00           C  
+ATOM    857  CD  LYS A 129     -24.732  25.009  34.254  1.00 40.00           C  
+ATOM    858  CE  LYS A 129     -25.698  25.765  33.340  1.00 40.00           C  
+ATOM    859  NZ  LYS A 129     -26.987  26.080  34.018  1.00 40.00           N  
+ATOM    860  N   GLY A 130     -23.569  20.295  31.204  1.00 40.00           N  
+ATOM    861  CA  GLY A 130     -24.160  19.319  30.286  1.00 40.00           C  
+ATOM    862  C   GLY A 130     -25.624  19.575  29.974  1.00 40.00           C  
+ATOM    863  O   GLY A 130     -26.442  19.695  30.883  1.00 40.00           O  
+ATOM    864  N   VAL A 131     -25.944  19.649  28.682  1.00 40.00           N  
+ATOM    865  CA  VAL A 131     -27.308  19.894  28.208  1.00 40.00           C  
+ATOM    866  C   VAL A 131     -28.322  18.985  28.914  1.00 40.00           C  
+ATOM    867  O   VAL A 131     -29.124  19.445  29.733  1.00 40.00           O  
+ATOM    868  CB  VAL A 131     -27.416  19.720  26.667  1.00 40.00           C  
+ATOM    869  CG1 VAL A 131     -28.848  19.929  26.179  1.00 40.00           C  
+ATOM    870  CG2 VAL A 131     -26.471  20.671  25.946  1.00 40.00           C  
+ATOM    871  N   CYS A 132     -28.266  17.694  28.612  1.00 40.00           N  
+ATOM    872  CA  CYS A 132     -29.274  16.755  29.085  1.00 40.00           C  
+ATOM    873  C   CYS A 132     -29.195  16.559  30.596  1.00 40.00           C  
+ATOM    874  O   CYS A 132     -30.220  16.564  31.274  1.00 40.00           O  
+ATOM    875  CB  CYS A 132     -29.141  15.419  28.356  1.00 40.00           C  
+ATOM    876  SG  CYS A 132     -30.708  14.639  27.945  1.00 40.00           S  
+ATOM    877  N   SER A 133     -27.976  16.420  31.119  1.00 40.00           N  
+ATOM    878  CA  SER A 133     -27.757  16.172  32.546  1.00 40.00           C  
+ATOM    879  C   SER A 133     -28.342  17.269  33.407  1.00 40.00           C  
+ATOM    880  O   SER A 133     -28.935  17.008  34.455  1.00 40.00           O  
+ATOM    881  CB  SER A 133     -26.268  16.081  32.842  1.00 40.00           C  
+ATOM    882  OG  SER A 133     -25.647  17.327  32.581  1.00 40.00           O  
+ATOM    883  N   ASN A 134     -28.145  18.502  32.956  1.00 40.00           N  
+ATOM    884  CA  ASN A 134     -28.660  19.668  33.663  1.00 40.00           C  
+ATOM    885  C   ASN A 134     -30.156  19.861  33.442  1.00 40.00           C  
+ATOM    886  O   ASN A 134     -30.871  20.219  34.376  1.00 40.00           O  
+ATOM    887  CB  ASN A 134     -27.860  20.932  33.315  1.00 40.00           C  
+ATOM    888  CG  ASN A 134     -26.510  20.972  34.019  1.00 40.00           C  
+ATOM    889  OD1 ASN A 134     -26.403  21.436  35.159  1.00 40.00           O  
+ATOM    890  ND2 ASN A 134     -25.473  20.477  33.345  1.00 40.00           N  
+ATOM    891  N   PHE A 135     -30.627  19.601  32.223  1.00 40.00           N  
+ATOM    892  CA  PHE A 135     -32.054  19.635  31.944  1.00 40.00           C  
+ATOM    893  C   PHE A 135     -32.812  18.734  32.932  1.00 40.00           C  
+ATOM    894  O   PHE A 135     -33.855  19.124  33.475  1.00 40.00           O  
+ATOM    895  CB  PHE A 135     -32.319  19.235  30.486  1.00 40.00           C  
+ATOM    896  CG  PHE A 135     -33.754  18.869  30.201  1.00 40.00           C  
+ATOM    897  CD1 PHE A 135     -34.766  19.830  30.267  1.00 40.00           C  
+ATOM    898  CD2 PHE A 135     -34.099  17.554  29.860  1.00 40.00           C  
+ATOM    899  CE1 PHE A 135     -36.087  19.483  30.009  1.00 40.00           C  
+ATOM    900  CE2 PHE A 135     -35.420  17.203  29.596  1.00 40.00           C  
+ATOM    901  CZ  PHE A 135     -36.415  18.171  29.669  1.00 40.00           C  
+ATOM    902  N   LEU A 136     -32.253  17.554  33.193  1.00 40.00           N  
+ATOM    903  CA  LEU A 136     -32.944  16.525  33.959  1.00 40.00           C  
+ATOM    904  C   LEU A 136     -32.970  16.775  35.450  1.00 40.00           C  
+ATOM    905  O   LEU A 136     -34.036  16.712  36.064  1.00 40.00           O  
+ATOM    906  CB  LEU A 136     -32.378  15.140  33.650  1.00 40.00           C  
+ATOM    907  CG  LEU A 136     -32.822  14.638  32.268  1.00 40.00           C  
+ATOM    908  CD1 LEU A 136     -31.982  13.460  31.773  1.00 40.00           C  
+ATOM    909  CD2 LEU A 136     -34.317  14.322  32.236  1.00 40.00           C  
+ATOM    910  N   CYS A 137     -31.809  17.073  36.032  1.00 40.00           N  
+ATOM    911  CA  CYS A 137     -31.756  17.422  37.449  1.00 40.00           C  
+ATOM    912  C   CYS A 137     -32.649  18.637  37.738  1.00 40.00           C  
+ATOM    913  O   CYS A 137     -33.182  18.764  38.846  1.00 40.00           O  
+ATOM    914  CB  CYS A 137     -30.318  17.712  37.879  1.00 40.00           C  
+ATOM    915  SG  CYS A 137     -29.191  16.300  37.890  1.00 40.00           S  
+ATOM    916  N   ASP A 138     -32.810  19.499  36.720  1.00 40.00           N  
+ATOM    917  CA  ASP A 138     -33.585  20.761  36.787  1.00 40.00           C  
+ATOM    918  C   ASP A 138     -35.098  20.568  36.736  1.00 40.00           C  
+ATOM    919  O   ASP A 138     -35.859  21.534  36.878  1.00 40.00           O  
+ATOM    920  CB  ASP A 138     -33.183  21.726  35.649  1.00 40.00           C  
+ATOM    921  CG  ASP A 138     -31.939  22.562  35.977  1.00 40.00           C  
+ATOM    922  OD1 ASP A 138     -31.361  22.413  37.082  1.00 40.00           O  
+ATOM    923  OD2 ASP A 138     -31.532  23.376  35.113  1.00 40.00           O  
+ATOM    924  N   LEU A 139     -35.535  19.333  36.528  1.00 40.00           N  
+ATOM    925  CA  LEU A 139     -36.950  19.092  36.343  1.00 40.00           C  
+ATOM    926  C   LEU A 139     -37.750  19.113  37.634  1.00 40.00           C  
+ATOM    927  O   LEU A 139     -37.335  18.564  38.659  1.00 40.00           O  
+ATOM    928  CB  LEU A 139     -37.195  17.809  35.564  1.00 40.00           C  
+ATOM    929  CG  LEU A 139     -36.862  17.934  34.072  1.00 40.00           C  
+ATOM    930  CD1 LEU A 139     -37.016  16.572  33.412  1.00 40.00           C  
+ATOM    931  CD2 LEU A 139     -37.685  18.996  33.341  1.00 40.00           C  
+ATOM    932  N   GLN A 140     -38.901  19.776  37.556  1.00 40.00           N  
+ATOM    933  CA  GLN A 140     -39.833  19.898  38.671  1.00 40.00           C  
+ATOM    934  C   GLN A 140     -40.996  18.939  38.501  1.00 40.00           C  
+ATOM    935  O   GLN A 140     -41.377  18.616  37.362  1.00 40.00           O  
+ATOM    936  CB  GLN A 140     -40.372  21.334  38.787  1.00 40.00           C  
+ATOM    937  CG  GLN A 140     -39.315  22.396  39.072  1.00 40.00           C  
+ATOM    938  CD  GLN A 140     -38.353  22.014  40.195  1.00 40.00           C  
+ATOM    939  OE1 GLN A 140     -37.207  22.469  40.215  1.00 40.00           O  
+ATOM    940  NE2 GLN A 140     -38.813  21.174  41.132  1.00 40.00           N  
+ATOM    941  N   PRO A 141     -41.569  18.478  39.630  1.00 40.00           N  
+ATOM    942  CA  PRO A 141     -42.819  17.730  39.510  1.00 40.00           C  
+ATOM    943  C   PRO A 141     -43.761  18.392  38.480  1.00 40.00           C  
+ATOM    944  O   PRO A 141     -44.050  19.592  38.570  1.00 40.00           O  
+ATOM    945  CB  PRO A 141     -43.397  17.789  40.934  1.00 40.00           C  
+ATOM    946  CG  PRO A 141     -42.201  17.931  41.827  1.00 40.00           C  
+ATOM    947  CD  PRO A 141     -41.064  18.512  41.020  1.00 40.00           C  
+ATOM    948  N   GLY A 142     -44.179  17.627  37.477  1.00 40.00           N  
+ATOM    949  CA  GLY A 142     -45.208  18.090  36.557  1.00 40.00           C  
+ATOM    950  C   GLY A 142     -44.722  18.481  35.192  1.00 40.00           C  
+ATOM    951  O   GLY A 142     -45.525  18.641  34.262  1.00 40.00           O  
+ATOM    952  N   ASP A 143     -43.407  18.641  35.072  1.00 40.00           N  
+ATOM    953  CA  ASP A 143     -42.783  18.922  33.783  1.00 40.00           C  
+ATOM    954  C   ASP A 143     -42.959  17.749  32.808  1.00 40.00           C  
+ATOM    955  O   ASP A 143     -43.105  16.583  33.218  1.00 40.00           O  
+ATOM    956  CB  ASP A 143     -41.302  19.261  33.969  1.00 40.00           C  
+ATOM    957  CG  ASP A 143     -41.083  20.453  34.884  1.00 40.00           C  
+ATOM    958  OD1 ASP A 143     -41.995  20.805  35.670  1.00 40.00           O  
+ATOM    959  OD2 ASP A 143     -39.979  21.032  34.816  1.00 40.00           O  
+ATOM    960  N   ASN A 144     -42.968  18.072  31.519  1.00 40.00           N  
+ATOM    961  CA  ASN A 144     -42.992  17.047  30.502  1.00 40.00           C  
+ATOM    962  C   ASN A 144     -41.600  16.581  30.099  1.00 40.00           C  
+ATOM    963  O   ASN A 144     -40.657  17.385  30.092  1.00 40.00           O  
+ATOM    964  CB  ASN A 144     -43.770  17.526  29.292  1.00 40.00           C  
+ATOM    965  CG  ASN A 144     -45.229  17.149  29.371  1.00 40.00           C  
+ATOM    966  OD1 ASN A 144     -46.048  17.607  28.575  1.00 40.00           O  
+ATOM    967  ND2 ASN A 144     -45.564  16.290  30.331  1.00 40.00           N  
+ATOM    968  N   VAL A 145     -41.487  15.275  29.795  1.00 40.00           N  
+ATOM    969  CA  VAL A 145     -40.241  14.627  29.301  1.00 40.00           C  
+ATOM    970  C   VAL A 145     -40.498  13.830  28.001  1.00 40.00           C  
+ATOM    971  O   VAL A 145     -41.399  12.974  27.938  1.00 40.00           O  
+ATOM    972  CB  VAL A 145     -39.573  13.668  30.343  1.00 40.00           C  
+ATOM    973  CG1 VAL A 145     -38.104  13.472  30.015  1.00 40.00           C  
+ATOM    974  CG2 VAL A 145     -39.690  14.179  31.771  1.00 40.00           C  
+ATOM    975  N   GLN A 146     -39.703  14.116  26.970  1.00 40.00           N  
+ATOM    976  CA  GLN A 146     -39.768  13.348  25.725  1.00 40.00           C  
+ATOM    977  C   GLN A 146     -38.863  12.123  25.831  1.00 40.00           C  
+ATOM    978  O   GLN A 146     -37.657  12.249  26.089  1.00 40.00           O  
+ATOM    979  CB  GLN A 146     -39.365  14.214  24.536  1.00 40.00           C  
+ATOM    980  CG  GLN A 146     -40.338  15.340  24.214  1.00 40.00           C  
+ATOM    981  CD  GLN A 146     -39.825  16.229  23.096  1.00 40.00           C  
+ATOM    982  OE1 GLN A 146     -38.720  16.781  23.178  1.00 40.00           O  
+ATOM    983  NE2 GLN A 146     -40.625  16.374  22.040  1.00 40.00           N  
+ATOM    984  N   ILE A 147     -39.448  10.942  25.624  1.00 40.00           N  
+ATOM    985  CA  ILE A 147     -38.804   9.665  25.987  1.00 40.00           C  
+ATOM    986  C   ILE A 147     -38.645   8.662  24.828  1.00 40.00           C  
+ATOM    987  O   ILE A 147     -39.631   8.250  24.203  1.00 40.00           O  
+ATOM    988  CB  ILE A 147     -39.548   9.004  27.177  1.00 40.00           C  
+ATOM    989  CG1 ILE A 147     -39.446   9.898  28.412  1.00 40.00           C  
+ATOM    990  CG2 ILE A 147     -38.992   7.619  27.480  1.00 40.00           C  
+ATOM    991  CD1 ILE A 147     -40.486   9.620  29.468  1.00 40.00           C  
+ATOM    992  N   THR A 148     -37.393   8.276  24.564  1.00 40.00           N  
+ATOM    993  CA  THR A 148     -37.063   7.238  23.575  1.00 40.00           C  
+ATOM    994  C   THR A 148     -36.675   5.904  24.234  1.00 40.00           C  
+ATOM    995  O   THR A 148     -36.190   5.870  25.367  1.00 40.00           O  
+ATOM    996  CB  THR A 148     -35.922   7.680  22.625  1.00 40.00           C  
+ATOM    997  OG1 THR A 148     -34.740   7.978  23.376  1.00 40.00           O  
+ATOM    998  CG2 THR A 148     -36.321   8.908  21.832  1.00 40.00           C  
+ATOM    999  N   GLY A 149     -36.882   4.803  23.525  1.00 40.00           N  
+ATOM   1000  CA  GLY A 149     -36.491   3.508  24.057  1.00 40.00           C  
+ATOM   1001  C   GLY A 149     -37.626   2.503  24.097  1.00 40.00           C  
+ATOM   1002  O   GLY A 149     -38.636   2.684  23.402  1.00 40.00           O  
+ATOM   1003  N   PRO A 150     -37.462   1.418  24.884  1.00 40.00           N  
+ATOM   1004  CA  PRO A 150     -36.271   1.117  25.663  1.00 40.00           C  
+ATOM   1005  C   PRO A 150     -35.124   0.669  24.768  1.00 40.00           C  
+ATOM   1006  O   PRO A 150     -35.361   0.262  23.629  1.00 40.00           O  
+ATOM   1007  CB  PRO A 150     -36.723  -0.025  26.572  1.00 40.00           C  
+ATOM   1008  CG  PRO A 150     -37.820  -0.691  25.850  1.00 40.00           C  
+ATOM   1009  CD  PRO A 150     -38.472   0.349  24.987  1.00 40.00           C  
+ATOM   1010  N   VAL A 151     -33.896   0.753  25.273  1.00 40.00           N  
+ATOM   1011  CA  VAL A 151     -32.719   0.495  24.458  1.00 40.00           C  
+ATOM   1012  C   VAL A 151     -31.702  -0.353  25.218  1.00 40.00           C  
+ATOM   1013  O   VAL A 151     -31.580  -0.231  26.434  1.00 40.00           O  
+ATOM   1014  CB  VAL A 151     -32.095   1.825  23.975  1.00 40.00           C  
+ATOM   1015  CG1 VAL A 151     -30.744   1.599  23.326  1.00 40.00           C  
+ATOM   1016  CG2 VAL A 151     -33.011   2.522  22.981  1.00 40.00           C  
+ATOM   1017  N   GLY A 152     -30.991  -1.217  24.491  1.00 40.00           N  
+ATOM   1018  CA  GLY A 152     -29.925  -2.036  25.060  1.00 40.00           C  
+ATOM   1019  C   GLY A 152     -30.393  -3.446  25.327  1.00 40.00           C  
+ATOM   1020  O   GLY A 152     -31.478  -3.664  25.858  1.00 40.00           O  
+ATOM   1021  N   LYS A 153     -29.577  -4.408  24.934  1.00 40.00           N  
+ATOM   1022  CA  LYS A 153     -29.853  -5.785  25.250  1.00 40.00           C  
+ATOM   1023  C   LYS A 153     -28.638  -6.265  25.976  1.00 40.00           C  
+ATOM   1024  O   LYS A 153     -28.606  -7.381  26.486  1.00 40.00           O  
+ATOM   1025  CB  LYS A 153     -30.011  -6.611  23.978  1.00 40.00           C  
+ATOM   1026  CG  LYS A 153     -31.176  -6.229  23.063  1.00 40.00           C  
+ATOM   1027  CD  LYS A 153     -32.425  -7.104  23.259  1.00 40.00           C  
+ATOM   1028  CE  LYS A 153     -32.369  -8.463  22.555  1.00 40.00           C  
+ATOM   1029  NZ  LYS A 153     -32.662  -8.406  21.096  1.00 40.00           N  
+ATOM   1030  N   GLU A 154     -27.627  -5.406  26.011  1.00 40.00           N  
+ATOM   1031  CA  GLU A 154     -26.322  -5.791  26.493  1.00 40.00           C  
+ATOM   1032  C   GLU A 154     -26.320  -6.129  27.976  1.00 40.00           C  
+ATOM   1033  O   GLU A 154     -25.576  -6.999  28.422  1.00 40.00           O  
+ATOM   1034  CB  GLU A 154     -25.314  -4.692  26.182  1.00 40.00           C  
+ATOM   1035  CG  GLU A 154     -23.885  -5.029  26.586  1.00 40.00           C  
+ATOM   1036  CD  GLU A 154     -23.215  -6.101  25.726  1.00 40.00           C  
+ATOM   1037  OE1 GLU A 154     -23.919  -6.833  24.987  1.00 40.00           O  
+ATOM   1038  OE2 GLU A 154     -21.964  -6.212  25.791  1.00 40.00           O  
+ATOM   1039  N   MET A 155     -27.176  -5.468  28.735  1.00 40.00           N  
+ATOM   1040  CA  MET A 155     -27.100  -5.586  30.173  1.00 40.00           C  
+ATOM   1041  C   MET A 155     -28.265  -6.311  30.831  1.00 40.00           C  
+ATOM   1042  O   MET A 155     -28.585  -6.055  31.983  1.00 40.00           O  
+ATOM   1043  CB  MET A 155     -26.916  -4.199  30.767  1.00 40.00           C  
+ATOM   1044  CG  MET A 155     -25.592  -3.569  30.387  1.00 40.00           C  
+ATOM   1045  SD  MET A 155     -24.208  -4.601  30.890  1.00 40.00           S  
+ATOM   1046  CE  MET A 155     -23.855  -3.957  32.519  1.00 40.00           C  
+ATOM   1047  N   LEU A 156     -28.885  -7.236  30.114  1.00 40.00           N  
+ATOM   1048  CA  LEU A 156     -30.019  -7.981  30.657  1.00 40.00           C  
+ATOM   1049  C   LEU A 156     -29.555  -9.015  31.666  1.00 40.00           C  
+ATOM   1050  O   LEU A 156     -28.435  -9.513  31.581  1.00 40.00           O  
+ATOM   1051  CB  LEU A 156     -30.803  -8.666  29.535  1.00 40.00           C  
+ATOM   1052  CG  LEU A 156     -31.392  -7.809  28.402  1.00 40.00           C  
+ATOM   1053  CD1 LEU A 156     -31.667  -8.655  27.163  1.00 40.00           C  
+ATOM   1054  CD2 LEU A 156     -32.645  -7.064  28.852  1.00 40.00           C  
+ATOM   1055  N   MET A 157     -30.430  -9.342  32.614  1.00 40.00           N  
+ATOM   1056  CA  MET A 157     -30.103 -10.273  33.701  1.00 40.00           C  
+ATOM   1057  C   MET A 157     -29.798 -11.657  33.171  1.00 40.00           C  
+ATOM   1058  O   MET A 157     -30.134 -11.954  32.028  1.00 40.00           O  
+ATOM   1059  CB  MET A 157     -31.268 -10.385  34.683  1.00 40.00           C  
+ATOM   1060  CG  MET A 157     -31.984  -9.081  34.977  1.00 40.00           C  
+ATOM   1061  SD  MET A 157     -32.949  -9.217  36.492  1.00 40.00           S  
+ATOM   1062  CE  MET A 157     -31.623  -9.401  37.693  1.00 40.00           C  
+ATOM   1063  N   PRO A 158     -29.171 -12.517  33.992  1.00 40.00           N  
+ATOM   1064  CA  PRO A 158     -29.047 -13.891  33.544  1.00 40.00           C  
+ATOM   1065  C   PRO A 158     -30.374 -14.620  33.665  1.00 40.00           C  
+ATOM   1066  O   PRO A 158     -31.252 -14.187  34.424  1.00 40.00           O  
+ATOM   1067  CB  PRO A 158     -28.024 -14.492  34.514  1.00 40.00           C  
+ATOM   1068  CG  PRO A 158     -27.307 -13.324  35.072  1.00 40.00           C  
+ATOM   1069  CD  PRO A 158     -28.378 -12.286  35.202  1.00 40.00           C  
+ATOM   1070  N   LYS A 159     -30.509 -15.703  32.900  1.00 40.00           N  
+ATOM   1071  CA  LYS A 159     -31.654 -16.586  33.000  1.00 40.00           C  
+ATOM   1072  C   LYS A 159     -31.562 -17.326  34.319  1.00 40.00           C  
+ATOM   1073  O   LYS A 159     -32.563 -17.456  35.026  1.00 40.00           O  
+ATOM   1074  CB  LYS A 159     -31.701 -17.558  31.811  1.00 40.00           C  
+ATOM   1075  CG  LYS A 159     -32.395 -16.993  30.569  1.00 40.00           C  
+ATOM   1076  CD  LYS A 159     -32.161 -17.807  29.290  1.00 40.00           C  
+ATOM   1077  CE  LYS A 159     -32.824 -17.144  28.076  1.00 40.00           C  
+ATOM   1078  NZ  LYS A 159     -32.295 -17.566  26.743  1.00 40.00           N  
+ATOM   1079  N   ASP A 160     -30.342 -17.763  34.647  1.00 40.00           N  
+ATOM   1080  CA  ASP A 160     -30.024 -18.511  35.873  1.00 40.00           C  
+ATOM   1081  C   ASP A 160     -30.443 -17.784  37.170  1.00 40.00           C  
+ATOM   1082  O   ASP A 160     -29.834 -16.772  37.527  1.00 40.00           O  
+ATOM   1083  CB  ASP A 160     -28.512 -18.812  35.898  1.00 40.00           C  
+ATOM   1084  CG  ASP A 160     -28.103 -19.795  37.012  1.00 40.00           C  
+ATOM   1085  OD1 ASP A 160     -28.936 -20.156  37.876  1.00 40.00           O  
+ATOM   1086  OD2 ASP A 160     -26.923 -20.214  37.018  1.00 40.00           O  
+ATOM   1087  N   PRO A 161     -31.470 -18.301  37.894  1.00 40.00           N  
+ATOM   1088  CA  PRO A 161     -31.816 -17.616  39.142  1.00 40.00           C  
+ATOM   1089  C   PRO A 161     -30.994 -18.138  40.329  1.00 40.00           C  
+ATOM   1090  O   PRO A 161     -31.324 -17.842  41.479  1.00 40.00           O  
+ATOM   1091  CB  PRO A 161     -33.316 -17.925  39.314  1.00 40.00           C  
+ATOM   1092  CG  PRO A 161     -33.562 -19.173  38.515  1.00 40.00           C  
+ATOM   1093  CD  PRO A 161     -32.334 -19.480  37.678  1.00 40.00           C  
+ATOM   1094  N   ASN A 162     -29.946 -18.916  40.039  1.00 40.00           N  
+ATOM   1095  CA  ASN A 162     -28.958 -19.364  41.037  1.00 40.00           C  
+ATOM   1096  C   ASN A 162     -27.577 -18.861  40.649  1.00 40.00           C  
+ATOM   1097  O   ASN A 162     -26.542 -19.424  41.035  1.00 40.00           O  
+ATOM   1098  CB  ASN A 162     -28.957 -20.894  41.175  1.00 40.00           C  
+ATOM   1099  CG  ASN A 162     -30.085 -21.402  42.057  1.00 40.00           C  
+ATOM   1100  OD1 ASN A 162     -30.552 -22.526  41.897  1.00 40.00           O  
+ATOM   1101  ND2 ASN A 162     -30.530 -20.573  42.990  1.00 40.00           N  
+ATOM   1102  N   ALA A 163     -27.593 -17.778  39.882  1.00 40.00           N  
+ATOM   1103  CA  ALA A 163     -26.399 -17.218  39.296  1.00 40.00           C  
+ATOM   1104  C   ALA A 163     -25.562 -16.502  40.331  1.00 40.00           C  
+ATOM   1105  O   ALA A 163     -26.089 -15.955  41.293  1.00 40.00           O  
+ATOM   1106  CB  ALA A 163     -26.782 -16.256  38.186  1.00 40.00           C  
+ATOM   1107  N   THR A 164     -24.252 -16.536  40.128  1.00 40.00           N  
+ATOM   1108  CA  THR A 164     -23.336 -15.630  40.792  1.00 40.00           C  
+ATOM   1109  C   THR A 164     -23.306 -14.371  39.923  1.00 40.00           C  
+ATOM   1110  O   THR A 164     -22.897 -14.440  38.765  1.00 40.00           O  
+ATOM   1111  CB  THR A 164     -21.917 -16.230  40.866  1.00 40.00           C  
+ATOM   1112  OG1 THR A 164     -21.967 -17.553  41.413  1.00 40.00           O  
+ATOM   1113  CG2 THR A 164     -21.015 -15.375  41.723  1.00 40.00           C  
+ATOM   1114  N   ILE A 165     -23.755 -13.234  40.458  1.00 40.00           N  
+ATOM   1115  CA  ILE A 165     -23.834 -12.001  39.653  1.00 40.00           C  
+ATOM   1116  C   ILE A 165     -22.952 -10.868  40.148  1.00 40.00           C  
+ATOM   1117  O   ILE A 165     -23.278 -10.153  41.097  1.00 40.00           O  
+ATOM   1118  CB  ILE A 165     -25.264 -11.490  39.519  1.00 40.00           C  
+ATOM   1119  CG1 ILE A 165     -26.149 -12.615  39.020  1.00 40.00           C  
+ATOM   1120  CG2 ILE A 165     -25.302 -10.323  38.548  1.00 40.00           C  
+ATOM   1121  CD1 ILE A 165     -27.609 -12.407  39.330  1.00 40.00           C  
+ATOM   1122  N   ILE A 166     -21.843 -10.686  39.461  1.00 40.00           N  
+ATOM   1123  CA  ILE A 166     -20.872  -9.724  39.883  1.00 40.00           C  
+ATOM   1124  C   ILE A 166     -21.085  -8.444  39.139  1.00 40.00           C  
+ATOM   1125  O   ILE A 166     -21.057  -8.407  37.915  1.00 40.00           O  
+ATOM   1126  CB  ILE A 166     -19.470 -10.250  39.643  1.00 40.00           C  
+ATOM   1127  CG1 ILE A 166     -19.293 -11.513  40.474  1.00 40.00           C  
+ATOM   1128  CG2 ILE A 166     -18.435  -9.195  40.002  1.00 40.00           C  
+ATOM   1129  CD1 ILE A 166     -18.232 -12.451  39.951  1.00 40.00           C  
+ATOM   1130  N   MET A 167     -21.278  -7.393  39.915  1.00 40.00           N  
+ATOM   1131  CA  MET A 167     -21.655  -6.109  39.399  1.00 40.00           C  
+ATOM   1132  C   MET A 167     -20.611  -5.075  39.777  1.00 40.00           C  
+ATOM   1133  O   MET A 167     -20.463  -4.734  40.949  1.00 40.00           O  
+ATOM   1134  CB  MET A 167     -22.996  -5.741  39.998  1.00 40.00           C  
+ATOM   1135  CG  MET A 167     -24.031  -6.839  39.870  1.00 40.00           C  
+ATOM   1136  SD  MET A 167     -25.494  -6.488  40.852  1.00 40.00           S  
+ATOM   1137  CE  MET A 167     -25.129  -7.461  42.309  1.00 40.00           C  
+ATOM   1138  N   LEU A 168     -19.872  -4.592  38.788  1.00 40.00           N  
+ATOM   1139  CA  LEU A 168     -18.912  -3.532  39.030  1.00 40.00           C  
+ATOM   1140  C   LEU A 168     -19.503  -2.220  38.588  1.00 40.00           C  
+ATOM   1141  O   LEU A 168     -19.976  -2.106  37.463  1.00 40.00           O  
+ATOM   1142  CB  LEU A 168     -17.610  -3.782  38.279  1.00 40.00           C  
+ATOM   1143  CG  LEU A 168     -16.800  -5.023  38.621  1.00 40.00           C  
+ATOM   1144  CD1 LEU A 168     -17.060  -5.544  40.029  1.00 40.00           C  
+ATOM   1145  CD2 LEU A 168     -17.153  -6.076  37.604  1.00 40.00           C  
+ATOM   1146  N   ALA A 169     -19.472  -1.228  39.472  1.00 40.00           N  
+ATOM   1147  CA  ALA A 169     -20.097   0.055  39.185  1.00 40.00           C  
+ATOM   1148  C   ALA A 169     -19.341   1.233  39.745  1.00 40.00           C  
+ATOM   1149  O   ALA A 169     -18.823   1.186  40.846  1.00 40.00           O  
+ATOM   1150  CB  ALA A 169     -21.526   0.070  39.696  1.00 40.00           C  
+ATOM   1151  N   THR A 170     -19.307   2.306  38.977  1.00 40.00           N  
+ATOM   1152  CA  THR A 170     -18.687   3.535  39.415  1.00 40.00           C  
+ATOM   1153  C   THR A 170     -19.607   4.684  39.100  1.00 40.00           C  
+ATOM   1154  O   THR A 170     -19.853   4.979  37.941  1.00 40.00           O  
+ATOM   1155  CB  THR A 170     -17.395   3.797  38.648  1.00 40.00           C  
+ATOM   1156  OG1 THR A 170     -17.645   3.597  37.251  1.00 40.00           O  
+ATOM   1157  CG2 THR A 170     -16.275   2.866  39.120  1.00 40.00           C  
+ATOM   1158  N   GLY A 171     -20.112   5.340  40.128  1.00 40.00           N  
+ATOM   1159  CA  GLY A 171     -20.984   6.480  39.922  1.00 40.00           C  
+ATOM   1160  C   GLY A 171     -22.345   6.077  39.397  1.00 40.00           C  
+ATOM   1161  O   GLY A 171     -22.928   5.114  39.882  1.00 40.00           O  
+ATOM   1162  N   THR A 172     -22.840   6.807  38.394  1.00 40.00           N  
+ATOM   1163  CA  THR A 172     -24.168   6.566  37.829  1.00 40.00           C  
+ATOM   1164  C   THR A 172     -24.191   5.311  36.969  1.00 40.00           C  
+ATOM   1165  O   THR A 172     -25.068   5.140  36.114  1.00 40.00           O  
+ATOM   1166  CB  THR A 172     -24.680   7.759  37.003  1.00 40.00           C  
+ATOM   1167  OG1 THR A 172     -23.932   7.871  35.791  1.00 40.00           O  
+ATOM   1168  CG2 THR A 172     -24.555   9.031  37.770  1.00 40.00           C  
+ATOM   1169  N   GLY A 173     -23.205   4.441  37.203  1.00 40.00           N  
+ATOM   1170  CA  GLY A 173     -23.184   3.107  36.618  1.00 40.00           C  
+ATOM   1171  C   GLY A 173     -23.761   2.079  37.575  1.00 40.00           C  
+ATOM   1172  O   GLY A 173     -23.717   0.878  37.317  1.00 40.00           O  
+ATOM   1173  N   ILE A 174     -24.298   2.558  38.689  1.00 40.00           N  
+ATOM   1174  CA  ILE A 174     -24.989   1.708  39.623  1.00 40.00           C  
+ATOM   1175  C   ILE A 174     -26.422   1.505  39.155  1.00 40.00           C  
+ATOM   1176  O   ILE A 174     -27.036   0.492  39.469  1.00 40.00           O  
+ATOM   1177  CB  ILE A 174     -25.006   2.340  41.012  1.00 40.00           C  
+ATOM   1178  CG1 ILE A 174     -25.696   1.427  42.023  1.00 40.00           C  
+ATOM   1179  CG2 ILE A 174     -25.708   3.687  40.968  1.00 40.00           C  
+ATOM   1180  CD1 ILE A 174     -24.779   0.452  42.722  1.00 40.00           C  
+ATOM   1181  N   ALA A 175     -26.942   2.467  38.393  1.00 40.00           N  
+ATOM   1182  CA  ALA A 175     -28.350   2.472  37.936  1.00 40.00           C  
+ATOM   1183  C   ALA A 175     -28.978   1.118  37.523  1.00 40.00           C  
+ATOM   1184  O   ALA A 175     -29.980   0.692  38.113  1.00 40.00           O  
+ATOM   1185  CB  ALA A 175     -28.541   3.508  36.834  1.00 40.00           C  
+ATOM   1186  N   PRO A 176     -28.405   0.446  36.506  1.00 40.00           N  
+ATOM   1187  CA  PRO A 176     -28.979  -0.821  36.128  1.00 40.00           C  
+ATOM   1188  C   PRO A 176     -29.001  -1.785  37.302  1.00 40.00           C  
+ATOM   1189  O   PRO A 176     -29.996  -2.462  37.517  1.00 40.00           O  
+ATOM   1190  CB  PRO A 176     -28.018  -1.318  35.053  1.00 40.00           C  
+ATOM   1191  CG  PRO A 176     -26.742  -0.599  35.287  1.00 40.00           C  
+ATOM   1192  CD  PRO A 176     -27.202   0.746  35.710  1.00 40.00           C  
+ATOM   1193  N   PHE A 177     -27.917  -1.824  38.068  1.00 40.00           N  
+ATOM   1194  CA  PHE A 177     -27.815  -2.737  39.188  1.00 40.00           C  
+ATOM   1195  C   PHE A 177     -28.808  -2.421  40.279  1.00 40.00           C  
+ATOM   1196  O   PHE A 177     -29.149  -3.290  41.066  1.00 40.00           O  
+ATOM   1197  CB  PHE A 177     -26.427  -2.711  39.774  1.00 40.00           C  
+ATOM   1198  CG  PHE A 177     -25.363  -3.037  38.795  1.00 40.00           C  
+ATOM   1199  CD1 PHE A 177     -25.354  -4.253  38.159  1.00 40.00           C  
+ATOM   1200  CD2 PHE A 177     -24.355  -2.125  38.514  1.00 40.00           C  
+ATOM   1201  CE1 PHE A 177     -24.357  -4.565  37.253  1.00 40.00           C  
+ATOM   1202  CE2 PHE A 177     -23.349  -2.428  37.609  1.00 40.00           C  
+ATOM   1203  CZ  PHE A 177     -23.349  -3.655  36.975  1.00 40.00           C  
+ATOM   1204  N   ARG A 178     -29.264  -1.177  40.347  1.00 40.00           N  
+ATOM   1205  CA  ARG A 178     -30.387  -0.878  41.213  1.00 40.00           C  
+ATOM   1206  C   ARG A 178     -31.491  -1.749  40.691  1.00 40.00           C  
+ATOM   1207  O   ARG A 178     -32.012  -2.615  41.393  1.00 40.00           O  
+ATOM   1208  CB  ARG A 178     -30.816   0.584  41.112  1.00 40.00           C  
+ATOM   1209  CG  ARG A 178     -32.073   0.903  41.917  1.00 40.00           C  
+ATOM   1210  CD  ARG A 178     -32.270   2.396  42.117  1.00 40.00           C  
+ATOM   1211  NE  ARG A 178     -33.134   2.685  43.252  1.00 40.00           N  
+ATOM   1212  CZ  ARG A 178     -34.451   2.752  43.177  1.00 40.00           C  
+ATOM   1213  NH1 ARG A 178     -35.055   2.562  42.031  1.00 40.00           N  
+ATOM   1214  NH2 ARG A 178     -35.159   3.014  44.244  1.00 40.00           N  
+ATOM   1215  N   SER A 179     -31.796  -1.527  39.418  1.00 40.00           N  
+ATOM   1216  CA  SER A 179     -32.868  -2.202  38.734  1.00 40.00           C  
+ATOM   1217  C   SER A 179     -32.804  -3.698  38.985  1.00 40.00           C  
+ATOM   1218  O   SER A 179     -33.817  -4.321  39.261  1.00 40.00           O  
+ATOM   1219  CB  SER A 179     -32.779  -1.893  37.249  1.00 40.00           C  
+ATOM   1220  OG  SER A 179     -34.041  -2.036  36.652  1.00 40.00           O  
+ATOM   1221  N   PHE A 180     -31.600  -4.253  38.919  1.00 40.00           N  
+ATOM   1222  CA  PHE A 180     -31.374  -5.661  39.180  1.00 40.00           C  
+ATOM   1223  C   PHE A 180     -31.828  -6.057  40.556  1.00 40.00           C  
+ATOM   1224  O   PHE A 180     -32.624  -6.960  40.717  1.00 40.00           O  
+ATOM   1225  CB  PHE A 180     -29.891  -5.973  39.116  1.00 40.00           C  
+ATOM   1226  CG  PHE A 180     -29.360  -6.178  37.735  1.00 40.00           C  
+ATOM   1227  CD1 PHE A 180     -29.923  -5.529  36.644  1.00 40.00           C  
+ATOM   1228  CD2 PHE A 180     -28.253  -7.000  37.532  1.00 40.00           C  
+ATOM   1229  CE1 PHE A 180     -29.410  -5.719  35.370  1.00 40.00           C  
+ATOM   1230  CE2 PHE A 180     -27.726  -7.189  36.265  1.00 40.00           C  
+ATOM   1231  CZ  PHE A 180     -28.308  -6.546  35.182  1.00 40.00           C  
+ATOM   1232  N   LEU A 181     -31.294  -5.391  41.562  1.00 40.00           N  
+ATOM   1233  CA  LEU A 181     -31.458  -5.874  42.922  1.00 40.00           C  
+ATOM   1234  C   LEU A 181     -32.908  -5.764  43.372  1.00 40.00           C  
+ATOM   1235  O   LEU A 181     -33.454  -6.696  43.972  1.00 40.00           O  
+ATOM   1236  CB  LEU A 181     -30.486  -5.162  43.868  1.00 40.00           C  
+ATOM   1237  CG  LEU A 181     -29.032  -5.571  43.605  1.00 40.00           C  
+ATOM   1238  CD1 LEU A 181     -28.107  -4.381  43.767  1.00 40.00           C  
+ATOM   1239  CD2 LEU A 181     -28.590  -6.735  44.482  1.00 40.00           C  
+ATOM   1240  N   TRP A 182     -33.536  -4.639  43.041  1.00 40.00           N  
+ATOM   1241  CA  TRP A 182     -34.936  -4.420  43.360  1.00 40.00           C  
+ATOM   1242  C   TRP A 182     -35.714  -5.656  43.072  1.00 40.00           C  
+ATOM   1243  O   TRP A 182     -36.352  -6.212  43.961  1.00 40.00           O  
+ATOM   1244  CB  TRP A 182     -35.484  -3.251  42.553  1.00 40.00           C  
+ATOM   1245  CG  TRP A 182     -35.496  -1.952  43.315  1.00 40.00           C  
+ATOM   1246  CD1 TRP A 182     -34.406  -1.225  43.766  1.00 40.00           C  
+ATOM   1247  CD2 TRP A 182     -36.668  -1.171  43.732  1.00 40.00           C  
+ATOM   1248  NE1 TRP A 182     -34.811  -0.085  44.416  1.00 40.00           N  
+ATOM   1249  CE2 TRP A 182     -36.150   0.007  44.432  1.00 40.00           C  
+ATOM   1250  CE3 TRP A 182     -38.040  -1.323  43.597  1.00 40.00           C  
+ATOM   1251  CZ2 TRP A 182     -36.983   0.964  44.976  1.00 40.00           C  
+ATOM   1252  CZ3 TRP A 182     -38.873  -0.346  44.147  1.00 40.00           C  
+ATOM   1253  CH2 TRP A 182     -38.354   0.768  44.821  1.00 40.00           C  
+ATOM   1254  N   LYS A 183     -35.635  -6.108  41.823  1.00 40.00           N  
+ATOM   1255  CA  LYS A 183     -36.297  -7.331  41.379  1.00 40.00           C  
+ATOM   1256  C   LYS A 183     -35.870  -8.531  42.241  1.00 40.00           C  
+ATOM   1257  O   LYS A 183     -36.711  -9.311  42.690  1.00 40.00           O  
+ATOM   1258  CB  LYS A 183     -35.992  -7.581  39.890  1.00 40.00           C  
+ATOM   1259  CG  LYS A 183     -37.109  -8.256  39.101  1.00 40.00           C  
+ATOM   1260  CD  LYS A 183     -36.589  -9.063  37.907  1.00 40.00           C  
+ATOM   1261  CE  LYS A 183     -37.747  -9.737  37.168  1.00 40.00           C  
+ATOM   1262  NZ  LYS A 183     -37.304 -10.815  36.228  1.00 40.00           N  
+ATOM   1263  N   MET A 184     -34.569  -8.643  42.497  1.00 40.00           N  
+ATOM   1264  CA  MET A 184     -34.015  -9.798  43.171  1.00 40.00           C  
+ATOM   1265  C   MET A 184     -34.423  -9.892  44.607  1.00 40.00           C  
+ATOM   1266  O   MET A 184     -34.765 -10.964  45.071  1.00 40.00           O  
+ATOM   1267  CB  MET A 184     -32.510  -9.758  43.129  1.00 40.00           C  
+ATOM   1268  CG  MET A 184     -31.963  -9.985  41.749  1.00 40.00           C  
+ATOM   1269  SD  MET A 184     -30.327  -9.277  41.642  1.00 40.00           S  
+ATOM   1270  CE  MET A 184     -29.404 -10.476  42.602  1.00 40.00           C  
+ATOM   1271  N   PHE A 185     -34.379  -8.780  45.318  1.00 40.00           N  
+ATOM   1272  CA  PHE A 185     -34.528  -8.853  46.753  1.00 40.00           C  
+ATOM   1273  C   PHE A 185     -35.754  -8.174  47.294  1.00 40.00           C  
+ATOM   1274  O   PHE A 185     -36.326  -8.600  48.295  1.00 40.00           O  
+ATOM   1275  CB  PHE A 185     -33.291  -8.308  47.422  1.00 40.00           C  
+ATOM   1276  CG  PHE A 185     -32.094  -9.156  47.209  1.00 40.00           C  
+ATOM   1277  CD1 PHE A 185     -32.001 -10.402  47.808  1.00 40.00           C  
+ATOM   1278  CD2 PHE A 185     -31.062  -8.722  46.401  1.00 40.00           C  
+ATOM   1279  CE1 PHE A 185     -30.887 -11.204  47.619  1.00 40.00           C  
+ATOM   1280  CE2 PHE A 185     -29.943  -9.516  46.204  1.00 40.00           C  
+ATOM   1281  CZ  PHE A 185     -29.851 -10.761  46.816  1.00 40.00           C  
+ATOM   1282  N   PHE A 186     -36.165  -7.107  46.642  1.00 40.00           N  
+ATOM   1283  CA  PHE A 186     -37.333  -6.423  47.127  1.00 40.00           C  
+ATOM   1284  C   PHE A 186     -38.630  -7.064  46.639  1.00 40.00           C  
+ATOM   1285  O   PHE A 186     -39.640  -7.017  47.338  1.00 40.00           O  
+ATOM   1286  CB  PHE A 186     -37.274  -4.937  46.782  1.00 40.00           C  
+ATOM   1287  CG  PHE A 186     -36.399  -4.133  47.708  1.00 40.00           C  
+ATOM   1288  CD1 PHE A 186     -35.872  -4.705  48.872  1.00 40.00           C  
+ATOM   1289  CD2 PHE A 186     -36.134  -2.790  47.433  1.00 40.00           C  
+ATOM   1290  CE1 PHE A 186     -35.077  -3.959  49.721  1.00 40.00           C  
+ATOM   1291  CE2 PHE A 186     -35.348  -2.035  48.284  1.00 40.00           C  
+ATOM   1292  CZ  PHE A 186     -34.818  -2.621  49.427  1.00 40.00           C  
+ATOM   1293  N   GLU A 187     -38.596  -7.695  45.465  1.00 40.00           N  
+ATOM   1294  CA  GLU A 187     -39.835  -8.139  44.812  1.00 40.00           C  
+ATOM   1295  C   GLU A 187     -40.097  -9.663  44.850  1.00 40.00           C  
+ATOM   1296  O   GLU A 187     -39.163 -10.483  44.870  1.00 40.00           O  
+ATOM   1297  CB  GLU A 187     -39.912  -7.568  43.386  1.00 40.00           C  
+ATOM   1298  CG  GLU A 187     -39.751  -6.050  43.341  1.00 40.00           C  
+ATOM   1299  CD  GLU A 187     -39.603  -5.467  41.937  1.00 40.00           C  
+ATOM   1300  OE1 GLU A 187     -39.112  -6.152  41.010  1.00 40.00           O  
+ATOM   1301  OE2 GLU A 187     -39.976  -4.287  41.758  1.00 40.00           O  
+ATOM   1302  N   LYS A 188     -41.384 -10.015  44.892  1.00 40.00           N  
+ATOM   1303  CA  LYS A 188     -41.835 -11.410  44.841  1.00 40.00           C  
+ATOM   1304  C   LYS A 188     -42.450 -11.734  43.488  1.00 40.00           C  
+ATOM   1305  O   LYS A 188     -43.497 -11.191  43.111  1.00 40.00           O  
+ATOM   1306  CB  LYS A 188     -42.854 -11.706  45.944  1.00 40.00           C  
+ATOM   1307  CG  LYS A 188     -42.292 -11.621  47.350  1.00 40.00           C  
+ATOM   1308  CD  LYS A 188     -41.264 -12.715  47.616  1.00 40.00           C  
+ATOM   1309  CE  LYS A 188     -40.557 -12.486  48.939  1.00 40.00           C  
+ATOM   1310  NZ  LYS A 188     -41.537 -12.398  50.057  1.00 40.00           N  
+ATOM   1311  N   HIS A 189     -41.783 -12.615  42.756  1.00 40.00           N  
+ATOM   1312  CA  HIS A 189     -42.287 -13.057  41.473  1.00 40.00           C  
+ATOM   1313  C   HIS A 189     -42.439 -14.536  41.503  1.00 40.00           C  
+ATOM   1314  O   HIS A 189     -41.630 -15.261  42.110  1.00 40.00           O  
+ATOM   1315  CB  HIS A 189     -41.360 -12.634  40.347  1.00 40.00           C  
+ATOM   1316  CG  HIS A 189     -41.238 -11.139  40.200  1.00 40.00           C  
+ATOM   1317  ND1 HIS A 189     -41.884 -10.451  39.237  1.00 40.00           N  
+ATOM   1318  CD2 HIS A 189     -40.527 -10.197  40.954  1.00 40.00           C  
+ATOM   1319  CE1 HIS A 189     -41.594  -9.135  39.356  1.00 40.00           C  
+ATOM   1320  NE2 HIS A 189     -40.765  -8.981  40.410  1.00 40.00           N  
+ATOM   1321  N   ASP A 190     -43.504 -14.989  40.854  1.00 40.00           N  
+ATOM   1322  CA  ASP A 190     -43.826 -16.400  40.798  1.00 40.00           C  
+ATOM   1323  C   ASP A 190     -42.862 -17.081  39.840  1.00 40.00           C  
+ATOM   1324  O   ASP A 190     -42.321 -18.151  40.136  1.00 40.00           O  
+ATOM   1325  CB  ASP A 190     -45.288 -16.569  40.382  1.00 40.00           C  
+ATOM   1326  CG  ASP A 190     -46.225 -15.766  41.267  1.00 40.00           C  
+ATOM   1327  OD1 ASP A 190     -46.339 -16.128  42.461  1.00 40.00           O  
+ATOM   1328  OD2 ASP A 190     -46.816 -14.762  40.788  1.00 40.00           O  
+ATOM   1329  N   ASP A 191     -42.616 -16.423  38.711  1.00 40.00           N  
+ATOM   1330  CA  ASP A 191     -41.725 -16.951  37.689  1.00 40.00           C  
+ATOM   1331  C   ASP A 191     -40.269 -16.761  38.047  1.00 40.00           C  
+ATOM   1332  O   ASP A 191     -39.390 -17.377  37.451  1.00 40.00           O  
+ATOM   1333  CB  ASP A 191     -42.020 -16.300  36.337  1.00 40.00           C  
+ATOM   1334  CG  ASP A 191     -42.157 -14.789  36.423  1.00 40.00           C  
+ATOM   1335  OD1 ASP A 191     -42.994 -14.294  37.216  1.00 40.00           O  
+ATOM   1336  OD2 ASP A 191     -41.441 -14.097  35.670  1.00 40.00           O  
+ATOM   1337  N   TYR A 192     -40.013 -15.905  39.025  1.00 40.00           N  
+ATOM   1338  CA  TYR A 192     -38.642 -15.551  39.353  1.00 40.00           C  
+ATOM   1339  C   TYR A 192     -38.371 -15.389  40.841  1.00 40.00           C  
+ATOM   1340  O   TYR A 192     -38.819 -14.429  41.479  1.00 40.00           O  
+ATOM   1341  CB  TYR A 192     -38.207 -14.292  38.595  1.00 40.00           C  
+ATOM   1342  CG  TYR A 192     -36.711 -14.097  38.595  1.00 40.00           C  
+ATOM   1343  CD1 TYR A 192     -35.879 -14.961  37.880  1.00 40.00           C  
+ATOM   1344  CD2 TYR A 192     -36.126 -13.065  39.314  1.00 40.00           C  
+ATOM   1345  CE1 TYR A 192     -34.505 -14.793  37.878  1.00 40.00           C  
+ATOM   1346  CE2 TYR A 192     -34.753 -12.886  39.315  1.00 40.00           C  
+ATOM   1347  CZ  TYR A 192     -33.944 -13.753  38.597  1.00 40.00           C  
+ATOM   1348  OH  TYR A 192     -32.572 -13.589  38.590  1.00 40.00           O  
+ATOM   1349  N   LYS A 193     -37.632 -16.351  41.382  1.00 40.00           N  
+ATOM   1350  CA  LYS A 193     -37.067 -16.235  42.716  1.00 40.00           C  
+ATOM   1351  C   LYS A 193     -35.578 -16.517  42.586  1.00 40.00           C  
+ATOM   1352  O   LYS A 193     -35.160 -17.556  42.064  1.00 40.00           O  
+ATOM   1353  CB  LYS A 193     -37.739 -17.189  43.706  1.00 40.00           C  
+ATOM   1354  CG  LYS A 193     -39.248 -17.018  43.822  1.00 40.00           C  
+ATOM   1355  CD  LYS A 193     -39.896 -18.271  44.398  1.00 40.00           C  
+ATOM   1356  CE  LYS A 193     -39.597 -19.530  43.581  1.00 40.00           C  
+ATOM   1357  NZ  LYS A 193     -40.161 -19.482  42.194  1.00 40.00           N  
+ATOM   1358  N   PHE A 194     -34.786 -15.550  43.027  1.00 40.00           N  
+ATOM   1359  CA  PHE A 194     -33.336 -15.647  43.003  1.00 40.00           C  
+ATOM   1360  C   PHE A 194     -32.839 -16.492  44.187  1.00 40.00           C  
+ATOM   1361  O   PHE A 194     -33.509 -16.589  45.216  1.00 40.00           O  
+ATOM   1362  CB  PHE A 194     -32.735 -14.234  43.027  1.00 40.00           C  
+ATOM   1363  CG  PHE A 194     -31.242 -14.211  42.988  1.00 40.00           C  
+ATOM   1364  CD1 PHE A 194     -30.561 -14.520  41.815  1.00 40.00           C  
+ATOM   1365  CD2 PHE A 194     -30.515 -13.886  44.127  1.00 40.00           C  
+ATOM   1366  CE1 PHE A 194     -29.178 -14.510  41.782  1.00 40.00           C  
+ATOM   1367  CE2 PHE A 194     -29.131 -13.866  44.103  1.00 40.00           C  
+ATOM   1368  CZ  PHE A 194     -28.461 -14.176  42.926  1.00 40.00           C  
+ATOM   1369  N   ASN A 195     -31.678 -17.121  44.035  1.00 40.00           N  
+ATOM   1370  CA  ASN A 195     -31.084 -17.861  45.126  1.00 40.00           C  
+ATOM   1371  C   ASN A 195     -29.640 -18.233  44.826  1.00 40.00           C  
+ATOM   1372  O   ASN A 195     -29.204 -19.354  45.068  1.00 40.00           O  
+ATOM   1373  CB  ASN A 195     -31.923 -19.099  45.442  1.00 40.00           C  
+ATOM   1374  CG  ASN A 195     -31.707 -19.606  46.855  1.00 40.00           C  
+ATOM   1375  OD1 ASN A 195     -31.873 -20.802  47.144  1.00 40.00           O  
+ATOM   1376  ND2 ASN A 195     -31.330 -18.697  47.749  1.00 40.00           N  
+ATOM   1377  N   GLY A 196     -28.901 -17.285  44.273  1.00 40.00           N  
+ATOM   1378  CA  GLY A 196     -27.467 -17.455  44.073  1.00 40.00           C  
+ATOM   1379  C   GLY A 196     -26.718 -16.521  45.006  1.00 40.00           C  
+ATOM   1380  O   GLY A 196     -27.026 -16.439  46.205  1.00 40.00           O  
+ATOM   1381  N   LEU A 197     -25.741 -15.803  44.454  1.00 40.00           N  
+ATOM   1382  CA  LEU A 197     -25.001 -14.805  45.216  1.00 40.00           C  
+ATOM   1383  C   LEU A 197     -24.844 -13.486  44.470  1.00 40.00           C  
+ATOM   1384  O   LEU A 197     -24.182 -13.425  43.430  1.00 40.00           O  
+ATOM   1385  CB  LEU A 197     -23.627 -15.340  45.582  1.00 40.00           C  
+ATOM   1386  CG  LEU A 197     -22.745 -14.288  46.248  1.00 40.00           C  
+ATOM   1387  CD1 LEU A 197     -23.057 -14.173  47.735  1.00 40.00           C  
+ATOM   1388  CD2 LEU A 197     -21.284 -14.619  46.015  1.00 40.00           C  
+ATOM   1389  N   GLY A 198     -25.440 -12.432  45.018  1.00 40.00           N  
+ATOM   1390  CA  GLY A 198     -25.305 -11.104  44.440  1.00 40.00           C  
+ATOM   1391  C   GLY A 198     -24.190 -10.298  45.084  1.00 40.00           C  
+ATOM   1392  O   GLY A 198     -24.344  -9.800  46.200  1.00 40.00           O  
+ATOM   1393  N   TRP A 199     -23.064 -10.169  44.385  1.00 40.00           N  
+ATOM   1394  CA  TRP A 199     -21.941  -9.382  44.886  1.00 40.00           C  
+ATOM   1395  C   TRP A 199     -21.843  -8.076  44.161  1.00 40.00           C  
+ATOM   1396  O   TRP A 199     -21.849  -8.043  42.925  1.00 40.00           O  
+ATOM   1397  CB  TRP A 199     -20.639 -10.146  44.725  1.00 40.00           C  
+ATOM   1398  CG  TRP A 199     -19.601  -9.819  45.772  1.00 40.00           C  
+ATOM   1399  CD1 TRP A 199     -19.549  -8.704  46.601  1.00 40.00           C  
+ATOM   1400  CD2 TRP A 199     -18.403 -10.606  46.118  1.00 40.00           C  
+ATOM   1401  NE1 TRP A 199     -18.453  -8.756  47.421  1.00 40.00           N  
+ATOM   1402  CE2 TRP A 199     -17.724  -9.869  47.178  1.00 40.00           C  
+ATOM   1403  CE3 TRP A 199     -17.853 -11.811  45.675  1.00 40.00           C  
+ATOM   1404  CZ2 TRP A 199     -16.549 -10.333  47.755  1.00 40.00           C  
+ATOM   1405  CZ3 TRP A 199     -16.668 -12.271  46.267  1.00 40.00           C  
+ATOM   1406  CH2 TRP A 199     -16.033 -11.549  47.282  1.00 40.00           C  
+ATOM   1407  N   LEU A 200     -21.745  -6.989  44.922  1.00 40.00           N  
+ATOM   1408  CA  LEU A 200     -21.708  -5.662  44.342  1.00 40.00           C  
+ATOM   1409  C   LEU A 200     -20.494  -4.892  44.774  1.00 40.00           C  
+ATOM   1410  O   LEU A 200     -20.218  -4.785  45.961  1.00 40.00           O  
+ATOM   1411  CB  LEU A 200     -22.951  -4.868  44.729  1.00 40.00           C  
+ATOM   1412  CG  LEU A 200     -22.899  -3.357  44.467  1.00 40.00           C  
+ATOM   1413  CD1 LEU A 200     -22.604  -3.017  43.015  1.00 40.00           C  
+ATOM   1414  CD2 LEU A 200     -24.198  -2.711  44.901  1.00 40.00           C  
+ATOM   1415  N   PHE A 201     -19.795  -4.330  43.796  1.00 40.00           N  
+ATOM   1416  CA  PHE A 201     -18.699  -3.401  44.043  1.00 40.00           C  
+ATOM   1417  C   PHE A 201     -19.060  -2.019  43.493  1.00 40.00           C  
+ATOM   1418  O   PHE A 201     -19.343  -1.874  42.302  1.00 40.00           O  
+ATOM   1419  CB  PHE A 201     -17.404  -3.936  43.412  1.00 40.00           C  
+ATOM   1420  CG  PHE A 201     -16.817  -5.124  44.137  1.00 40.00           C  
+ATOM   1421  CD1 PHE A 201     -17.472  -6.354  44.161  1.00 40.00           C  
+ATOM   1422  CD2 PHE A 201     -15.600  -5.011  44.804  1.00 40.00           C  
+ATOM   1423  CE1 PHE A 201     -16.926  -7.439  44.837  1.00 40.00           C  
+ATOM   1424  CE2 PHE A 201     -15.049  -6.094  45.481  1.00 40.00           C  
+ATOM   1425  CZ  PHE A 201     -15.712  -7.308  45.495  1.00 40.00           C  
+ATOM   1426  N   LEU A 202     -19.081  -1.012  44.362  1.00 40.00           N  
+ATOM   1427  CA  LEU A 202     -19.356   0.348  43.915  1.00 40.00           C  
+ATOM   1428  C   LEU A 202     -18.323   1.363  44.359  1.00 40.00           C  
+ATOM   1429  O   LEU A 202     -18.145   1.606  45.548  1.00 40.00           O  
+ATOM   1430  CB  LEU A 202     -20.732   0.818  44.351  1.00 40.00           C  
+ATOM   1431  CG  LEU A 202     -20.907   2.333  44.162  1.00 40.00           C  
+ATOM   1432  CD1 LEU A 202     -21.056   2.749  42.701  1.00 40.00           C  
+ATOM   1433  CD2 LEU A 202     -22.085   2.826  44.977  1.00 40.00           C  
+ATOM   1434  N   GLY A 203     -17.688   1.989  43.377  1.00 40.00           N  
+ATOM   1435  CA  GLY A 203     -16.596   2.912  43.622  1.00 40.00           C  
+ATOM   1436  C   GLY A 203     -17.015   4.335  43.367  1.00 40.00           C  
+ATOM   1437  O   GLY A 203     -17.647   4.631  42.347  1.00 40.00           O  
+ATOM   1438  N   VAL A 204     -16.654   5.207  44.308  1.00 40.00           N  
+ATOM   1439  CA  VAL A 204     -16.982   6.638  44.261  1.00 40.00           C  
+ATOM   1440  C   VAL A 204     -15.888   7.537  44.858  1.00 40.00           C  
+ATOM   1441  O   VAL A 204     -14.970   7.041  45.526  1.00 40.00           O  
+ATOM   1442  CB  VAL A 204     -18.310   6.950  44.998  1.00 40.00           C  
+ATOM   1443  CG1 VAL A 204     -19.514   6.676  44.101  1.00 40.00           C  
+ATOM   1444  CG2 VAL A 204     -18.390   6.202  46.325  1.00 40.00           C  
+ATOM   1445  N   PRO A 205     -15.989   8.866  44.613  1.00 40.00           N  
+ATOM   1446  CA  PRO A 205     -15.120   9.837  45.278  1.00 40.00           C  
+ATOM   1447  C   PRO A 205     -15.268   9.916  46.814  1.00 40.00           C  
+ATOM   1448  O   PRO A 205     -14.289   9.735  47.535  1.00 40.00           O  
+ATOM   1449  CB  PRO A 205     -15.518  11.179  44.617  1.00 40.00           C  
+ATOM   1450  CG  PRO A 205     -16.813  10.933  43.903  1.00 40.00           C  
+ATOM   1451  CD  PRO A 205     -16.745   9.493  43.503  1.00 40.00           C  
+ATOM   1452  N   THR A 206     -16.478  10.178  47.297  1.00 40.00           N  
+ATOM   1453  CA  THR A 206     -16.685  10.568  48.689  1.00 40.00           C  
+ATOM   1454  C   THR A 206     -17.681   9.641  49.358  1.00 40.00           C  
+ATOM   1455  O   THR A 206     -18.304   8.828  48.696  1.00 40.00           O  
+ATOM   1456  CB  THR A 206     -17.222  12.022  48.791  1.00 40.00           C  
+ATOM   1457  OG1 THR A 206     -18.350  12.190  47.921  1.00 40.00           O  
+ATOM   1458  CG2 THR A 206     -16.152  13.053  48.412  1.00 40.00           C  
+ATOM   1459  N   SER A 207     -17.823   9.758  50.674  1.00 40.00           N  
+ATOM   1460  CA  SER A 207     -18.925   9.108  51.374  1.00 40.00           C  
+ATOM   1461  C   SER A 207     -20.210   9.890  51.163  1.00 40.00           C  
+ATOM   1462  O   SER A 207     -21.279   9.429  51.552  1.00 40.00           O  
+ATOM   1463  CB  SER A 207     -18.637   8.974  52.868  1.00 40.00           C  
+ATOM   1464  OG  SER A 207     -17.909   7.786  53.146  1.00 40.00           O  
+ATOM   1465  N   SER A 208     -20.089  11.073  50.556  1.00 40.00           N  
+ATOM   1466  CA  SER A 208     -21.235  11.913  50.171  1.00 40.00           C  
+ATOM   1467  C   SER A 208     -21.745  11.619  48.749  1.00 40.00           C  
+ATOM   1468  O   SER A 208     -22.867  12.000  48.396  1.00 40.00           O  
+ATOM   1469  CB  SER A 208     -20.900  13.405  50.313  1.00 40.00           C  
+ATOM   1470  OG  SER A 208     -19.921  13.819  49.373  1.00 40.00           O  
+ATOM   1471  N   SER A 209     -20.916  10.955  47.939  1.00 40.00           N  
+ATOM   1472  CA  SER A 209     -21.310  10.485  46.595  1.00 40.00           C  
+ATOM   1473  C   SER A 209     -21.835   9.021  46.607  1.00 40.00           C  
+ATOM   1474  O   SER A 209     -22.129   8.444  45.554  1.00 40.00           O  
+ATOM   1475  CB  SER A 209     -20.139  10.620  45.597  1.00 40.00           C  
+ATOM   1476  OG  SER A 209     -19.661  11.949  45.489  1.00 40.00           O  
+ATOM   1477  N   LEU A 210     -21.965   8.438  47.797  1.00 40.00           N  
+ATOM   1478  CA  LEU A 210     -22.286   7.027  47.947  1.00 40.00           C  
+ATOM   1479  C   LEU A 210     -23.788   6.758  47.786  1.00 40.00           C  
+ATOM   1480  O   LEU A 210     -24.528   6.776  48.772  1.00 40.00           O  
+ATOM   1481  CB  LEU A 210     -21.807   6.579  49.321  1.00 40.00           C  
+ATOM   1482  CG  LEU A 210     -21.345   5.146  49.534  1.00 40.00           C  
+ATOM   1483  CD1 LEU A 210     -20.037   4.862  48.806  1.00 40.00           C  
+ATOM   1484  CD2 LEU A 210     -21.198   4.942  51.035  1.00 40.00           C  
+ATOM   1485  N   LEU A 211     -24.227   6.483  46.555  1.00 40.00           N  
+ATOM   1486  CA  LEU A 211     -25.658   6.410  46.215  1.00 40.00           C  
+ATOM   1487  C   LEU A 211     -26.446   5.237  46.859  1.00 40.00           C  
+ATOM   1488  O   LEU A 211     -25.908   4.160  47.082  1.00 40.00           O  
+ATOM   1489  CB  LEU A 211     -25.823   6.424  44.690  1.00 40.00           C  
+ATOM   1490  CG  LEU A 211     -24.971   7.372  43.831  1.00 40.00           C  
+ATOM   1491  CD1 LEU A 211     -25.086   6.992  42.370  1.00 40.00           C  
+ATOM   1492  CD2 LEU A 211     -25.331   8.838  43.997  1.00 40.00           C  
+ATOM   1493  N   TYR A 212     -27.709   5.486  47.194  1.00 40.00           N  
+ATOM   1494  CA  TYR A 212     -28.674   4.449  47.591  1.00 40.00           C  
+ATOM   1495  C   TYR A 212     -28.276   3.519  48.735  1.00 40.00           C  
+ATOM   1496  O   TYR A 212     -28.945   2.514  48.956  1.00 40.00           O  
+ATOM   1497  CB  TYR A 212     -29.064   3.587  46.378  1.00 40.00           C  
+ATOM   1498  CG  TYR A 212     -29.405   4.350  45.104  1.00 40.00           C  
+ATOM   1499  CD1 TYR A 212     -30.723   4.713  44.807  1.00 40.00           C  
+ATOM   1500  CD2 TYR A 212     -28.413   4.678  44.180  1.00 40.00           C  
+ATOM   1501  CE1 TYR A 212     -31.031   5.401  43.643  1.00 40.00           C  
+ATOM   1502  CE2 TYR A 212     -28.708   5.367  43.015  1.00 40.00           C  
+ATOM   1503  CZ  TYR A 212     -30.013   5.726  42.749  1.00 40.00           C  
+ATOM   1504  OH  TYR A 212     -30.284   6.412  41.582  1.00 40.00           O  
+ATOM   1505  N   LYS A 213     -27.215   3.856  49.463  1.00 40.00           N  
+ATOM   1506  CA  LYS A 213     -26.605   2.952  50.469  1.00 40.00           C  
+ATOM   1507  C   LYS A 213     -27.572   2.268  51.483  1.00 40.00           C  
+ATOM   1508  O   LYS A 213     -27.448   1.060  51.756  1.00 40.00           O  
+ATOM   1509  CB  LYS A 213     -25.441   3.669  51.184  1.00 40.00           C  
+ATOM   1510  CG  LYS A 213     -24.832   2.963  52.398  1.00 40.00           C  
+ATOM   1511  CD  LYS A 213     -24.096   3.974  53.280  1.00 40.00           C  
+ATOM   1512  CE  LYS A 213     -23.843   3.473  54.696  1.00 40.00           C  
+ATOM   1513  NZ  LYS A 213     -22.624   2.627  54.814  1.00 40.00           N  
+ATOM   1514  N   GLU A 214     -28.522   3.039  52.022  1.00 40.00           N  
+ATOM   1515  CA  GLU A 214     -29.479   2.553  53.036  1.00 40.00           C  
+ATOM   1516  C   GLU A 214     -30.404   1.516  52.429  1.00 40.00           C  
+ATOM   1517  O   GLU A 214     -30.997   0.713  53.140  1.00 40.00           O  
+ATOM   1518  CB  GLU A 214     -30.344   3.682  53.632  1.00 40.00           C  
+ATOM   1519  CG  GLU A 214     -29.854   5.109  53.424  1.00 40.00           C  
+ATOM   1520  CD  GLU A 214     -29.645   5.459  51.958  1.00 40.00           C  
+ATOM   1521  OE1 GLU A 214     -30.340   4.896  51.077  1.00 40.00           O  
+ATOM   1522  OE2 GLU A 214     -28.759   6.292  51.684  1.00 40.00           O  
+ATOM   1523  N   GLU A 215     -30.550   1.559  51.111  1.00 40.00           N  
+ATOM   1524  CA  GLU A 215     -31.352   0.576  50.425  1.00 40.00           C  
+ATOM   1525  C   GLU A 215     -30.596  -0.732  50.453  1.00 40.00           C  
+ATOM   1526  O   GLU A 215     -31.072  -1.713  51.022  1.00 40.00           O  
+ATOM   1527  CB  GLU A 215     -31.652   1.023  49.002  1.00 40.00           C  
+ATOM   1528  CG  GLU A 215     -32.550   2.247  48.954  1.00 40.00           C  
+ATOM   1529  CD  GLU A 215     -32.960   2.613  47.550  1.00 40.00           C  
+ATOM   1530  OE1 GLU A 215     -32.902   1.742  46.661  1.00 40.00           O  
+ATOM   1531  OE2 GLU A 215     -33.349   3.779  47.339  1.00 40.00           O  
+ATOM   1532  N   PHE A 216     -29.393  -0.727  49.887  1.00 40.00           N  
+ATOM   1533  CA  PHE A 216     -28.559  -1.920  49.871  1.00 40.00           C  
+ATOM   1534  C   PHE A 216     -28.381  -2.455  51.277  1.00 40.00           C  
+ATOM   1535  O   PHE A 216     -28.292  -3.665  51.485  1.00 40.00           O  
+ATOM   1536  CB  PHE A 216     -27.200  -1.626  49.257  1.00 40.00           C  
+ATOM   1537  CG  PHE A 216     -27.274  -0.936  47.931  1.00 40.00           C  
+ATOM   1538  CD1 PHE A 216     -27.761  -1.595  46.814  1.00 40.00           C  
+ATOM   1539  CD2 PHE A 216     -26.845   0.376  47.794  1.00 40.00           C  
+ATOM   1540  CE1 PHE A 216     -27.825  -0.955  45.585  1.00 40.00           C  
+ATOM   1541  CE2 PHE A 216     -26.900   1.019  46.569  1.00 40.00           C  
+ATOM   1542  CZ  PHE A 216     -27.391   0.354  45.461  1.00 40.00           C  
+ATOM   1543  N   GLY A 217     -28.331  -1.544  52.239  1.00 40.00           N  
+ATOM   1544  CA  GLY A 217     -28.376  -1.933  53.630  1.00 40.00           C  
+ATOM   1545  C   GLY A 217     -29.563  -2.849  53.858  1.00 40.00           C  
+ATOM   1546  O   GLY A 217     -29.391  -4.018  54.214  1.00 40.00           O  
+ATOM   1547  N   LYS A 218     -30.765  -2.325  53.612  1.00 40.00           N  
+ATOM   1548  CA  LYS A 218     -32.014  -3.035  53.899  1.00 40.00           C  
+ATOM   1549  C   LYS A 218     -32.033  -4.391  53.233  1.00 40.00           C  
+ATOM   1550  O   LYS A 218     -32.654  -5.320  53.730  1.00 40.00           O  
+ATOM   1551  CB  LYS A 218     -33.234  -2.204  53.484  1.00 40.00           C  
+ATOM   1552  CG  LYS A 218     -33.508  -1.019  54.412  1.00 40.00           C  
+ATOM   1553  CD  LYS A 218     -34.755  -0.213  54.053  1.00 40.00           C  
+ATOM   1554  CE  LYS A 218     -34.466   0.952  53.109  1.00 40.00           C  
+ATOM   1555  NZ  LYS A 218     -35.689   1.772  52.869  1.00 40.00           N  
+ATOM   1556  N   MET A 219     -31.313  -4.501  52.123  1.00 40.00           N  
+ATOM   1557  CA  MET A 219     -31.187  -5.759  51.394  1.00 40.00           C  
+ATOM   1558  C   MET A 219     -30.257  -6.715  52.110  1.00 40.00           C  
+ATOM   1559  O   MET A 219     -30.664  -7.813  52.486  1.00 40.00           O  
+ATOM   1560  CB  MET A 219     -30.666  -5.503  49.986  1.00 40.00           C  
+ATOM   1561  CG  MET A 219     -31.499  -4.500  49.219  1.00 40.00           C  
+ATOM   1562  SD  MET A 219     -31.269  -4.665  47.449  1.00 40.00           S  
+ATOM   1563  CE  MET A 219     -32.434  -3.439  46.849  1.00 40.00           C  
+ATOM   1564  N   LYS A 220     -29.009  -6.278  52.285  1.00 40.00           N  
+ATOM   1565  CA  LYS A 220     -28.010  -7.009  53.056  1.00 40.00           C  
+ATOM   1566  C   LYS A 220     -28.624  -7.451  54.365  1.00 40.00           C  
+ATOM   1567  O   LYS A 220     -28.229  -8.468  54.931  1.00 40.00           O  
+ATOM   1568  CB  LYS A 220     -26.777  -6.133  53.334  1.00 40.00           C  
+ATOM   1569  CG  LYS A 220     -25.688  -6.776  54.193  1.00 40.00           C  
+ATOM   1570  CD  LYS A 220     -25.117  -8.007  53.517  1.00 40.00           C  
+ATOM   1571  CE  LYS A 220     -24.068  -8.675  54.376  1.00 40.00           C  
+ATOM   1572  NZ  LYS A 220     -23.592  -9.900  53.678  1.00 40.00           N  
+ATOM   1573  N   GLU A 221     -29.603  -6.686  54.831  1.00 40.00           N  
+ATOM   1574  CA  GLU A 221     -30.260  -6.993  56.077  1.00 40.00           C  
+ATOM   1575  C   GLU A 221     -31.314  -8.096  55.940  1.00 40.00           C  
+ATOM   1576  O   GLU A 221     -31.514  -8.889  56.875  1.00 40.00           O  
+ATOM   1577  CB  GLU A 221     -30.867  -5.738  56.666  1.00 40.00           C  
+ATOM   1578  CG  GLU A 221     -31.057  -5.839  58.160  1.00 40.00           C  
+ATOM   1579  CD  GLU A 221     -32.118  -4.892  58.654  1.00 40.00           C  
+ATOM   1580  OE1 GLU A 221     -32.139  -3.737  58.177  1.00 40.00           O  
+ATOM   1581  OE2 GLU A 221     -32.930  -5.301  59.513  1.00 40.00           O  
+ATOM   1582  N   ARG A 222     -31.983  -8.164  54.791  1.00 40.00           N  
+ATOM   1583  CA  ARG A 222     -32.971  -9.222  54.591  1.00 40.00           C  
+ATOM   1584  C   ARG A 222     -32.480 -10.386  53.733  1.00 40.00           C  
+ATOM   1585  O   ARG A 222     -33.196 -11.366  53.568  1.00 40.00           O  
+ATOM   1586  CB  ARG A 222     -34.301  -8.669  54.090  1.00 40.00           C  
+ATOM   1587  CG  ARG A 222     -34.164  -7.635  53.000  1.00 40.00           C  
+ATOM   1588  CD  ARG A 222     -35.456  -6.860  52.895  1.00 40.00           C  
+ATOM   1589  NE  ARG A 222     -36.524  -7.716  52.387  1.00 40.00           N  
+ATOM   1590  CZ  ARG A 222     -37.757  -7.302  52.097  1.00 40.00           C  
+ATOM   1591  NH1 ARG A 222     -38.101  -6.025  52.277  1.00 40.00           N  
+ATOM   1592  NH2 ARG A 222     -38.652  -8.171  51.625  1.00 40.00           N  
+ATOM   1593  N   ALA A 223     -31.262 -10.290  53.204  1.00 40.00           N  
+ATOM   1594  CA  ALA A 223     -30.637 -11.435  52.533  1.00 40.00           C  
+ATOM   1595  C   ALA A 223     -29.128 -11.479  52.745  1.00 40.00           C  
+ATOM   1596  O   ALA A 223     -28.356 -11.283  51.805  1.00 40.00           O  
+ATOM   1597  CB  ALA A 223     -30.966 -11.437  51.056  1.00 40.00           C  
+ATOM   1598  N   PRO A 224     -28.707 -11.758  53.986  1.00 40.00           N  
+ATOM   1599  CA  PRO A 224     -27.305 -11.668  54.373  1.00 40.00           C  
+ATOM   1600  C   PRO A 224     -26.340 -12.503  53.515  1.00 40.00           C  
+ATOM   1601  O   PRO A 224     -25.296 -11.985  53.109  1.00 40.00           O  
+ATOM   1602  CB  PRO A 224     -27.306 -12.142  55.836  1.00 40.00           C  
+ATOM   1603  CG  PRO A 224     -28.593 -12.858  56.024  1.00 40.00           C  
+ATOM   1604  CD  PRO A 224     -29.559 -12.193  55.105  1.00 40.00           C  
+ATOM   1605  N   GLU A 225     -26.681 -13.764  53.235  1.00 40.00           N  
+ATOM   1606  CA  GLU A 225     -25.782 -14.660  52.480  1.00 40.00           C  
+ATOM   1607  C   GLU A 225     -25.941 -14.552  50.960  1.00 40.00           C  
+ATOM   1608  O   GLU A 225     -25.012 -14.894  50.215  1.00 40.00           O  
+ATOM   1609  CB  GLU A 225     -25.928 -16.120  52.927  1.00 40.00           C  
+ATOM   1610  CG  GLU A 225     -27.322 -16.710  52.744  1.00 40.00           C  
+ATOM   1611  CD  GLU A 225     -28.098 -16.815  54.046  1.00 40.00           C  
+ATOM   1612  OE1 GLU A 225     -28.088 -15.849  54.845  1.00 40.00           O  
+ATOM   1613  OE2 GLU A 225     -28.725 -17.876  54.269  1.00 40.00           O  
+ATOM   1614  N   ASN A 226     -27.114 -14.073  50.521  1.00 40.00           N  
+ATOM   1615  CA  ASN A 226     -27.470 -13.925  49.090  1.00 40.00           C  
+ATOM   1616  C   ASN A 226     -27.034 -12.602  48.471  1.00 40.00           C  
+ATOM   1617  O   ASN A 226     -27.124 -12.393  47.255  1.00 40.00           O  
+ATOM   1618  CB  ASN A 226     -28.975 -14.084  48.921  1.00 40.00           C  
+ATOM   1619  CG  ASN A 226     -29.481 -15.365  49.527  1.00 40.00           C  
+ATOM   1620  OD1 ASN A 226     -29.251 -16.453  48.987  1.00 40.00           O  
+ATOM   1621  ND2 ASN A 226     -30.154 -15.250  50.671  1.00 40.00           N  
+ATOM   1622  N   PHE A 227     -26.562 -11.719  49.340  1.00 40.00           N  
+ATOM   1623  CA  PHE A 227     -26.097 -10.412  48.955  1.00 40.00           C  
+ATOM   1624  C   PHE A 227     -24.800 -10.078  49.674  1.00 40.00           C  
+ATOM   1625  O   PHE A 227     -24.652 -10.328  50.879  1.00 40.00           O  
+ATOM   1626  CB  PHE A 227     -27.157  -9.375  49.295  1.00 40.00           C  
+ATOM   1627  CG  PHE A 227     -26.880  -8.011  48.735  1.00 40.00           C  
+ATOM   1628  CD1 PHE A 227     -26.245  -7.858  47.498  1.00 40.00           C  
+ATOM   1629  CD2 PHE A 227     -27.293  -6.875  49.425  1.00 40.00           C  
+ATOM   1630  CE1 PHE A 227     -26.000  -6.600  46.977  1.00 40.00           C  
+ATOM   1631  CE2 PHE A 227     -27.062  -5.611  48.905  1.00 40.00           C  
+ATOM   1632  CZ  PHE A 227     -26.413  -5.472  47.680  1.00 40.00           C  
+ATOM   1633  N   ARG A 228     -23.864  -9.522  48.909  1.00 40.00           N  
+ATOM   1634  CA  ARG A 228     -22.584  -9.059  49.423  1.00 40.00           C  
+ATOM   1635  C   ARG A 228     -22.272  -7.732  48.757  1.00 40.00           C  
+ATOM   1636  O   ARG A 228     -22.294  -7.626  47.537  1.00 40.00           O  
+ATOM   1637  CB  ARG A 228     -21.477 -10.086  49.144  1.00 40.00           C  
+ATOM   1638  CG  ARG A 228     -21.620 -11.404  49.909  1.00 40.00           C  
+ATOM   1639  CD  ARG A 228     -20.396 -12.290  49.734  1.00 40.00           C  
+ATOM   1640  NE  ARG A 228     -19.180 -11.627  50.216  1.00 40.00           N  
+ATOM   1641  CZ  ARG A 228     -17.948 -12.142  50.157  1.00 40.00           C  
+ATOM   1642  NH1 ARG A 228     -17.728 -13.352  49.626  1.00 40.00           N  
+ATOM   1643  NH2 ARG A 228     -16.925 -11.436  50.633  1.00 40.00           N  
+ATOM   1644  N   VAL A 229     -22.021  -6.708  49.557  1.00 40.00           N  
+ATOM   1645  CA  VAL A 229     -21.687  -5.419  48.996  1.00 40.00           C  
+ATOM   1646  C   VAL A 229     -20.295  -5.054  49.403  1.00 40.00           C  
+ATOM   1647  O   VAL A 229     -19.782  -5.530  50.416  1.00 40.00           O  
+ATOM   1648  CB  VAL A 229     -22.580  -4.289  49.509  1.00 40.00           C  
+ATOM   1649  CG1 VAL A 229     -22.712  -3.220  48.439  1.00 40.00           C  
+ATOM   1650  CG2 VAL A 229     -23.938  -4.815  49.931  1.00 40.00           C  
+ATOM   1651  N   ASP A 230     -19.700  -4.188  48.601  1.00 40.00           N  
+ATOM   1652  CA  ASP A 230     -18.407  -3.619  48.879  1.00 40.00           C  
+ATOM   1653  C   ASP A 230     -18.415  -2.248  48.233  1.00 40.00           C  
+ATOM   1654  O   ASP A 230     -18.835  -2.102  47.085  1.00 40.00           O  
+ATOM   1655  CB  ASP A 230     -17.298  -4.490  48.279  1.00 40.00           C  
+ATOM   1656  CG  ASP A 230     -16.973  -5.704  49.136  1.00 40.00           C  
+ATOM   1657  OD1 ASP A 230     -16.034  -5.598  49.948  1.00 40.00           O  
+ATOM   1658  OD2 ASP A 230     -17.648  -6.752  49.015  1.00 40.00           O  
+ATOM   1659  N   TYR A 231     -17.982  -1.234  48.966  1.00 40.00           N  
+ATOM   1660  CA  TYR A 231     -17.850   0.083  48.370  1.00 40.00           C  
+ATOM   1661  C   TYR A 231     -16.393   0.463  48.281  1.00 40.00           C  
+ATOM   1662  O   TYR A 231     -15.554  -0.159  48.918  1.00 40.00           O  
+ATOM   1663  CB  TYR A 231     -18.571   1.102  49.200  1.00 40.00           C  
+ATOM   1664  CG  TYR A 231     -19.999   0.764  49.485  1.00 40.00           C  
+ATOM   1665  CD1 TYR A 231     -20.342  -0.075  50.543  1.00 40.00           C  
+ATOM   1666  CD2 TYR A 231     -21.017   1.318  48.725  1.00 40.00           C  
+ATOM   1667  CE1 TYR A 231     -21.667  -0.360  50.825  1.00 40.00           C  
+ATOM   1668  CE2 TYR A 231     -22.346   1.044  49.000  1.00 40.00           C  
+ATOM   1669  CZ  TYR A 231     -22.666   0.205  50.050  1.00 40.00           C  
+ATOM   1670  OH  TYR A 231     -23.986  -0.065  50.331  1.00 40.00           O  
+ATOM   1671  N   ALA A 232     -16.088   1.480  47.485  1.00 40.00           N  
+ATOM   1672  CA  ALA A 232     -14.719   1.959  47.359  1.00 40.00           C  
+ATOM   1673  C   ALA A 232     -14.712   3.481  47.249  1.00 40.00           C  
+ATOM   1674  O   ALA A 232     -14.956   4.045  46.177  1.00 40.00           O  
+ATOM   1675  CB  ALA A 232     -14.020   1.311  46.171  1.00 40.00           C  
+ATOM   1676  N   VAL A 233     -14.452   4.139  48.375  1.00 40.00           N  
+ATOM   1677  CA  VAL A 233     -14.387   5.593  48.420  1.00 40.00           C  
+ATOM   1678  C   VAL A 233     -12.940   6.018  48.170  1.00 40.00           C  
+ATOM   1679  O   VAL A 233     -12.092   5.940  49.065  1.00 40.00           O  
+ATOM   1680  CB  VAL A 233     -14.890   6.143  49.768  1.00 40.00           C  
+ATOM   1681  CG1 VAL A 233     -15.344   7.574  49.603  1.00 40.00           C  
+ATOM   1682  CG2 VAL A 233     -16.033   5.301  50.309  1.00 40.00           C  
+ATOM   1683  N   SER A 234     -12.660   6.453  46.944  1.00 40.00           N  
+ATOM   1684  CA  SER A 234     -11.289   6.780  46.530  1.00 40.00           C  
+ATOM   1685  C   SER A 234     -10.607   7.838  47.424  1.00 40.00           C  
+ATOM   1686  O   SER A 234      -9.396   7.754  47.685  1.00 40.00           O  
+ATOM   1687  CB  SER A 234     -11.255   7.177  45.046  1.00 40.00           C  
+ATOM   1688  OG  SER A 234     -11.900   8.418  44.799  1.00 40.00           O  
+ATOM   1689  N   ARG A 235     -11.404   8.794  47.917  1.00 40.00           N  
+ATOM   1690  CA  ARG A 235     -10.918   9.949  48.687  1.00 40.00           C  
+ATOM   1691  C   ARG A 235     -11.096   9.871  50.200  1.00 40.00           C  
+ATOM   1692  O   ARG A 235     -11.116  10.918  50.862  1.00 40.00           O  
+ATOM   1693  CB  ARG A 235     -11.632  11.209  48.232  1.00 40.00           C  
+ATOM   1694  CG  ARG A 235     -11.318  11.648  46.835  1.00 40.00           C  
+ATOM   1695  CD  ARG A 235     -11.957  12.997  46.690  1.00 40.00           C  
+ATOM   1696  NE  ARG A 235     -11.945  13.453  45.316  1.00 40.00           N  
+ATOM   1697  CZ  ARG A 235     -12.796  14.350  44.829  1.00 40.00           C  
+ATOM   1698  NH1 ARG A 235     -13.742  14.873  45.610  1.00 40.00           N  
+ATOM   1699  NH2 ARG A 235     -12.710  14.718  43.556  1.00 40.00           N  
+ATOM   1700  N   GLU A 236     -11.238   8.660  50.746  1.00 40.00           N  
+ATOM   1701  CA  GLU A 236     -11.512   8.488  52.176  1.00 40.00           C  
+ATOM   1702  C   GLU A 236     -11.080   7.147  52.705  1.00 40.00           C  
+ATOM   1703  O   GLU A 236     -11.354   6.799  53.852  1.00 40.00           O  
+ATOM   1704  CB  GLU A 236     -12.993   8.654  52.465  1.00 40.00           C  
+ATOM   1705  CG  GLU A 236     -13.464  10.092  52.463  1.00 40.00           C  
+ATOM   1706  CD  GLU A 236     -14.932  10.191  52.757  1.00 40.00           C  
+ATOM   1707  OE1 GLU A 236     -15.373   9.527  53.725  1.00 40.00           O  
+ATOM   1708  OE2 GLU A 236     -15.633  10.922  52.020  1.00 40.00           O  
+ATOM   1709  N   GLN A 237     -10.435   6.375  51.849  1.00 40.00           N  
+ATOM   1710  CA  GLN A 237      -9.888   5.092  52.244  1.00 40.00           C  
+ATOM   1711  C   GLN A 237      -8.631   4.851  51.429  1.00 40.00           C  
+ATOM   1712  O   GLN A 237      -8.480   5.381  50.319  1.00 40.00           O  
+ATOM   1713  CB  GLN A 237     -10.882   3.950  51.988  1.00 40.00           C  
+ATOM   1714  CG  GLN A 237     -12.212   4.036  52.720  1.00 40.00           C  
+ATOM   1715  CD  GLN A 237     -13.285   3.197  52.056  1.00 40.00           C  
+ATOM   1716  OE1 GLN A 237     -13.250   2.955  50.849  1.00 40.00           O  
+ATOM   1717  NE2 GLN A 237     -14.249   2.751  52.843  1.00 40.00           N  
+ATOM   1718  N   THR A 238      -7.720   4.075  52.005  1.00 40.00           N  
+ATOM   1719  CA  THR A 238      -6.615   3.488  51.262  1.00 40.00           C  
+ATOM   1720  C   THR A 238      -6.430   2.047  51.743  1.00 40.00           C  
+ATOM   1721  O   THR A 238      -7.001   1.637  52.766  1.00 40.00           O  
+ATOM   1722  CB  THR A 238      -5.293   4.290  51.380  1.00 40.00           C  
+ATOM   1723  OG1 THR A 238      -4.833   4.265  52.730  1.00 40.00           O  
+ATOM   1724  CG2 THR A 238      -5.450   5.752  50.914  1.00 40.00           C  
+ATOM   1725  N   ASN A 239      -5.656   1.277  50.983  1.00 40.00           N  
+ATOM   1726  CA  ASN A 239      -5.400  -0.120  51.313  1.00 40.00           C  
+ATOM   1727  C   ASN A 239      -4.243  -0.263  52.295  1.00 40.00           C  
+ATOM   1728  O   ASN A 239      -3.701   0.753  52.772  1.00 40.00           O  
+ATOM   1729  CB  ASN A 239      -5.166  -0.965  50.041  1.00 40.00           C  
+ATOM   1730  CG  ASN A 239      -4.091  -0.390  49.119  1.00 40.00           C  
+ATOM   1731  OD1 ASN A 239      -3.859   0.815  49.079  1.00 40.00           O  
+ATOM   1732  ND2 ASN A 239      -3.445  -1.266  48.355  1.00 40.00           N  
+ATOM   1733  N   ALA A 240      -3.885  -1.519  52.600  1.00 40.00           N  
+ATOM   1734  CA  ALA A 240      -2.667  -1.830  53.349  1.00 40.00           C  
+ATOM   1735  C   ALA A 240      -1.430  -1.258  52.637  1.00 40.00           C  
+ATOM   1736  O   ALA A 240      -0.485  -0.809  53.291  1.00 40.00           O  
+ATOM   1737  CB  ALA A 240      -2.531  -3.324  53.563  1.00 40.00           C  
+ATOM   1738  N   ALA A 241      -1.459  -1.237  51.306  1.00 40.00           N  
+ATOM   1739  CA  ALA A 241      -0.391  -0.616  50.521  1.00 40.00           C  
+ATOM   1740  C   ALA A 241      -0.400   0.954  50.457  1.00 40.00           C  
+ATOM   1741  O   ALA A 241       0.414   1.565  49.752  1.00 40.00           O  
+ATOM   1742  CB  ALA A 241      -0.351  -1.244  49.137  1.00 40.00           C  
+ATOM   1743  N   GLY A 242      -1.297   1.597  51.206  1.00 40.00           N  
+ATOM   1744  CA  GLY A 242      -1.349   3.070  51.279  1.00 40.00           C  
+ATOM   1745  C   GLY A 242      -1.703   3.838  49.998  1.00 40.00           C  
+ATOM   1746  O   GLY A 242      -1.227   4.970  49.782  1.00 40.00           O  
+ATOM   1747  N   GLU A 243      -2.551   3.229  49.161  1.00 40.00           N  
+ATOM   1748  CA  GLU A 243      -2.998   3.815  47.882  1.00 40.00           C  
+ATOM   1749  C   GLU A 243      -4.501   4.007  47.915  1.00 40.00           C  
+ATOM   1750  O   GLU A 243      -5.203   3.246  48.595  1.00 40.00           O  
+ATOM   1751  CB  GLU A 243      -2.682   2.876  46.718  1.00 40.00           C  
+ATOM   1752  CG  GLU A 243      -1.593   1.855  47.014  1.00 40.00           C  
+ATOM   1753  CD  GLU A 243      -1.617   0.674  46.063  1.00 40.00           C  
+ATOM   1754  OE1 GLU A 243      -1.472   0.898  44.843  1.00 40.00           O  
+ATOM   1755  OE2 GLU A 243      -1.763  -0.479  46.531  1.00 40.00           O  
+ATOM   1756  N   ARG A 244      -4.988   5.000  47.162  1.00 40.00           N  
+ATOM   1757  CA  ARG A 244      -6.425   5.328  47.105  1.00 40.00           C  
+ATOM   1758  C   ARG A 244      -7.339   4.144  46.701  1.00 40.00           C  
+ATOM   1759  O   ARG A 244      -7.059   3.420  45.729  1.00 40.00           O  
+ATOM   1760  CB  ARG A 244      -6.657   6.517  46.186  1.00 40.00           C  
+ATOM   1761  CG  ARG A 244      -6.320   7.850  46.813  1.00 40.00           C  
+ATOM   1762  CD  ARG A 244      -6.601   8.952  45.797  1.00 40.00           C  
+ATOM   1763  NE  ARG A 244      -6.305  10.309  46.284  1.00 40.00           N  
+ATOM   1764  CZ  ARG A 244      -6.022  11.360  45.506  1.00 40.00           C  
+ATOM   1765  NH1 ARG A 244      -5.966  11.247  44.176  1.00 40.00           N  
+ATOM   1766  NH2 ARG A 244      -5.768  12.532  46.074  1.00 40.00           N  
+ATOM   1767  N   MET A 245      -8.423   3.953  47.458  1.00 40.00           N  
+ATOM   1768  CA  MET A 245      -9.300   2.807  47.257  1.00 40.00           C  
+ATOM   1769  C   MET A 245     -10.158   2.997  46.025  1.00 40.00           C  
+ATOM   1770  O   MET A 245     -11.228   3.604  46.072  1.00 40.00           O  
+ATOM   1771  CB  MET A 245     -10.171   2.550  48.484  1.00 40.00           C  
+ATOM   1772  CG  MET A 245     -10.926   1.225  48.435  1.00 40.00           C  
+ATOM   1773  SD  MET A 245      -9.869  -0.242  48.406  1.00 40.00           S  
+ATOM   1774  CE  MET A 245      -9.239  -0.262  50.089  1.00 40.00           C  
+ATOM   1775  N   TYR A 246      -9.662   2.489  44.909  1.00 40.00           N  
+ATOM   1776  CA  TYR A 246     -10.440   2.475  43.689  1.00 40.00           C  
+ATOM   1777  C   TYR A 246     -11.153   1.148  43.600  1.00 40.00           C  
+ATOM   1778  O   TYR A 246     -10.849   0.221  44.368  1.00 40.00           O  
+ATOM   1779  CB  TYR A 246      -9.548   2.732  42.479  1.00 40.00           C  
+ATOM   1780  CG  TYR A 246      -8.975   4.122  42.523  1.00 40.00           C  
+ATOM   1781  CD1 TYR A 246      -9.821   5.240  42.564  1.00 40.00           C  
+ATOM   1782  CD2 TYR A 246      -7.592   4.333  42.563  1.00 40.00           C  
+ATOM   1783  CE1 TYR A 246      -9.310   6.528  42.625  1.00 40.00           C  
+ATOM   1784  CE2 TYR A 246      -7.071   5.626  42.630  1.00 40.00           C  
+ATOM   1785  CZ  TYR A 246      -7.936   6.720  42.659  1.00 40.00           C  
+ATOM   1786  OH  TYR A 246      -7.435   8.007  42.715  1.00 40.00           O  
+ATOM   1787  N   ILE A 247     -12.121   1.060  42.688  1.00 40.00           N  
+ATOM   1788  CA  ILE A 247     -12.915  -0.157  42.544  1.00 40.00           C  
+ATOM   1789  C   ILE A 247     -11.998  -1.369  42.495  1.00 40.00           C  
+ATOM   1790  O   ILE A 247     -12.138  -2.305  43.288  1.00 40.00           O  
+ATOM   1791  CB  ILE A 247     -13.869  -0.105  41.332  1.00 40.00           C  
+ATOM   1792  CG1 ILE A 247     -14.676  -1.397  41.278  1.00 40.00           C  
+ATOM   1793  CG2 ILE A 247     -13.127   0.175  40.027  1.00 40.00           C  
+ATOM   1794  CD1 ILE A 247     -16.070  -1.219  40.729  1.00 40.00           C  
+ATOM   1795  N   GLN A 248     -11.026  -1.297  41.592  1.00 40.00           N  
+ATOM   1796  CA  GLN A 248     -10.024  -2.336  41.429  1.00 40.00           C  
+ATOM   1797  C   GLN A 248      -9.315  -2.681  42.736  1.00 40.00           C  
+ATOM   1798  O   GLN A 248      -9.077  -3.859  43.012  1.00 40.00           O  
+ATOM   1799  CB  GLN A 248      -9.009  -1.953  40.339  1.00 40.00           C  
+ATOM   1800  CG  GLN A 248      -8.233  -0.661  40.564  1.00 40.00           C  
+ATOM   1801  CD  GLN A 248      -8.895   0.546  39.935  1.00 40.00           C  
+ATOM   1802  OE1 GLN A 248     -10.113   0.687  39.968  1.00 40.00           O  
+ATOM   1803  NE2 GLN A 248      -8.088   1.429  39.361  1.00 40.00           N  
+ATOM   1804  N   THR A 249      -9.002  -1.650  43.528  1.00 40.00           N  
+ATOM   1805  CA  THR A 249      -8.272  -1.790  44.790  1.00 40.00           C  
+ATOM   1806  C   THR A 249      -9.101  -2.584  45.799  1.00 40.00           C  
+ATOM   1807  O   THR A 249      -8.594  -3.504  46.443  1.00 40.00           O  
+ATOM   1808  CB  THR A 249      -7.877  -0.416  45.391  1.00 40.00           C  
+ATOM   1809  OG1 THR A 249      -7.721   0.559  44.350  1.00 40.00           O  
+ATOM   1810  CG2 THR A 249      -6.580  -0.521  46.181  1.00 40.00           C  
+ATOM   1811  N   ARG A 250     -10.379  -2.241  45.919  1.00 40.00           N  
+ATOM   1812  CA  ARG A 250     -11.274  -2.991  46.784  1.00 40.00           C  
+ATOM   1813  C   ARG A 250     -11.442  -4.433  46.302  1.00 40.00           C  
+ATOM   1814  O   ARG A 250     -11.462  -5.370  47.114  1.00 40.00           O  
+ATOM   1815  CB  ARG A 250     -12.637  -2.309  46.868  1.00 40.00           C  
+ATOM   1816  CG  ARG A 250     -13.690  -3.110  47.640  1.00 40.00           C  
+ATOM   1817  CD  ARG A 250     -13.400  -3.138  49.131  1.00 40.00           C  
+ATOM   1818  NE  ARG A 250     -13.244  -1.771  49.632  1.00 40.00           N  
+ATOM   1819  CZ  ARG A 250     -12.578  -1.426  50.734  1.00 40.00           C  
+ATOM   1820  NH1 ARG A 250     -11.990  -2.350  51.478  1.00 40.00           N  
+ATOM   1821  NH2 ARG A 250     -12.495  -0.147  51.096  1.00 40.00           N  
+ATOM   1822  N   MET A 251     -11.581  -4.591  44.982  1.00 40.00           N  
+ATOM   1823  CA  MET A 251     -11.716  -5.901  44.350  1.00 40.00           C  
+ATOM   1824  C   MET A 251     -10.500  -6.738  44.665  1.00 40.00           C  
+ATOM   1825  O   MET A 251     -10.630  -7.863  45.142  1.00 40.00           O  
+ATOM   1826  CB  MET A 251     -11.836  -5.759  42.844  1.00 40.00           C  
+ATOM   1827  CG  MET A 251     -13.208  -5.348  42.370  1.00 40.00           C  
+ATOM   1828  SD  MET A 251     -13.105  -4.663  40.713  1.00 40.00           S  
+ATOM   1829  CE  MET A 251     -12.752  -6.110  39.727  1.00 40.00           C  
+ATOM   1830  N   ALA A 252      -9.322  -6.165  44.410  1.00 40.00           N  
+ATOM   1831  CA  ALA A 252      -8.037  -6.812  44.677  1.00 40.00           C  
+ATOM   1832  C   ALA A 252      -8.004  -7.464  46.059  1.00 40.00           C  
+ATOM   1833  O   ALA A 252      -7.259  -8.424  46.283  1.00 40.00           O  
+ATOM   1834  CB  ALA A 252      -6.892  -5.818  44.521  1.00 40.00           C  
+ATOM   1835  N   GLU A 253      -8.829  -6.949  46.971  1.00 40.00           N  
+ATOM   1836  CA  GLU A 253      -8.964  -7.513  48.315  1.00 40.00           C  
+ATOM   1837  C   GLU A 253      -9.618  -8.899  48.324  1.00 40.00           C  
+ATOM   1838  O   GLU A 253      -9.644  -9.574  49.354  1.00 40.00           O  
+ATOM   1839  CB  GLU A 253      -9.750  -6.566  49.219  1.00 40.00           C  
+ATOM   1840  CG  GLU A 253      -9.057  -5.250  49.498  1.00 40.00           C  
+ATOM   1841  CD  GLU A 253      -9.732  -4.479  50.608  1.00 40.00           C  
+ATOM   1842  OE1 GLU A 253      -9.069  -3.587  51.176  1.00 40.00           O  
+ATOM   1843  OE2 GLU A 253     -10.913  -4.765  50.917  1.00 40.00           O  
+ATOM   1844  N   TYR A 254     -10.143  -9.320  47.182  1.00 40.00           N  
+ATOM   1845  CA  TYR A 254     -10.752 -10.626  47.082  1.00 40.00           C  
+ATOM   1846  C   TYR A 254     -10.238 -11.339  45.856  1.00 40.00           C  
+ATOM   1847  O   TYR A 254     -10.873 -12.280  45.382  1.00 40.00           O  
+ATOM   1848  CB  TYR A 254     -12.256 -10.492  46.941  1.00 40.00           C  
+ATOM   1849  CG  TYR A 254     -12.975  -9.750  48.035  1.00 40.00           C  
+ATOM   1850  CD1 TYR A 254     -13.483 -10.434  49.136  1.00 40.00           C  
+ATOM   1851  CD2 TYR A 254     -13.205  -8.364  47.942  1.00 40.00           C  
+ATOM   1852  CE1 TYR A 254     -14.183  -9.770  50.131  1.00 40.00           C  
+ATOM   1853  CE2 TYR A 254     -13.905  -7.684  48.936  1.00 40.00           C  
+ATOM   1854  CZ  TYR A 254     -14.395  -8.397  50.030  1.00 40.00           C  
+ATOM   1855  OH  TYR A 254     -15.099  -7.767  51.034  1.00 40.00           O  
+ATOM   1856  N   LYS A 255      -9.098 -10.893  45.337  1.00 40.00           N  
+ATOM   1857  CA  LYS A 255      -8.579 -11.415  44.072  1.00 40.00           C  
+ATOM   1858  C   LYS A 255      -8.622 -12.944  44.015  1.00 40.00           C  
+ATOM   1859  O   LYS A 255      -8.538 -13.537  42.939  1.00 40.00           O  
+ATOM   1860  CB  LYS A 255      -7.174 -10.866  43.782  1.00 40.00           C  
+ATOM   1861  CG  LYS A 255      -6.121 -11.123  44.859  1.00 40.00           C  
+ATOM   1862  CD  LYS A 255      -4.916 -10.193  44.690  1.00 40.00           C  
+ATOM   1863  CE  LYS A 255      -3.747 -10.562  45.606  1.00 40.00           C  
+ATOM   1864  NZ  LYS A 255      -2.946 -11.712  45.095  1.00 40.00           N  
+ATOM   1865  N   GLU A 256      -8.787 -13.554  45.194  1.00 40.00           N  
+ATOM   1866  CA  GLU A 256      -8.911 -15.009  45.376  1.00 40.00           C  
+ATOM   1867  C   GLU A 256     -10.266 -15.532  44.890  1.00 40.00           C  
+ATOM   1868  O   GLU A 256     -10.347 -16.062  43.771  1.00 40.00           O  
+ATOM   1869  CB  GLU A 256      -8.694 -15.414  46.852  1.00 40.00           C  
+ATOM   1870  CG  GLU A 256      -7.734 -14.537  47.657  1.00 40.00           C  
+ATOM   1871  CD  GLU A 256      -6.288 -14.625  47.185  1.00 40.00           C  
+ATOM   1872  OE1 GLU A 256      -5.925 -15.636  46.534  1.00 40.00           O  
+ATOM   1873  OE2 GLU A 256      -5.514 -13.676  47.473  1.00 40.00           O  
+ATOM   1874  N   GLU A 257     -11.317 -15.377  45.719  1.00 40.00           N  
+ATOM   1875  CA  GLU A 257     -12.663 -15.916  45.405  1.00 40.00           C  
+ATOM   1876  C   GLU A 257     -13.055 -15.502  44.012  1.00 40.00           C  
+ATOM   1877  O   GLU A 257     -13.594 -16.294  43.245  1.00 40.00           O  
+ATOM   1878  CB  GLU A 257     -13.785 -15.444  46.349  1.00 40.00           C  
+ATOM   1879  CG  GLU A 257     -13.543 -15.588  47.828  1.00 40.00           C  
+ATOM   1880  CD  GLU A 257     -12.964 -14.318  48.403  1.00 40.00           C  
+ATOM   1881  OE1 GLU A 257     -11.737 -14.089  48.225  1.00 40.00           O  
+ATOM   1882  OE2 GLU A 257     -13.746 -13.549  49.018  1.00 40.00           O  
+ATOM   1883  N   LEU A 258     -12.781 -14.241  43.703  1.00 40.00           N  
+ATOM   1884  CA  LEU A 258     -13.121 -13.680  42.415  1.00 40.00           C  
+ATOM   1885  C   LEU A 258     -12.502 -14.525  41.308  1.00 40.00           C  
+ATOM   1886  O   LEU A 258     -13.221 -15.147  40.528  1.00 40.00           O  
+ATOM   1887  CB  LEU A 258     -12.701 -12.204  42.338  1.00 40.00           C  
+ATOM   1888  CG  LEU A 258     -13.248 -11.262  43.435  1.00 40.00           C  
+ATOM   1889  CD1 LEU A 258     -12.801  -9.832  43.172  1.00 40.00           C  
+ATOM   1890  CD2 LEU A 258     -14.767 -11.313  43.604  1.00 40.00           C  
+ATOM   1891  N   TRP A 259     -11.178 -14.597  41.274  1.00 40.00           N  
+ATOM   1892  CA  TRP A 259     -10.516 -15.402  40.268  1.00 40.00           C  
+ATOM   1893  C   TRP A 259     -11.031 -16.805  40.217  1.00 40.00           C  
+ATOM   1894  O   TRP A 259     -11.203 -17.390  39.143  1.00 40.00           O  
+ATOM   1895  CB  TRP A 259      -9.031 -15.432  40.503  1.00 40.00           C  
+ATOM   1896  CG  TRP A 259      -8.376 -16.315  39.492  1.00 40.00           C  
+ATOM   1897  CD1 TRP A 259      -7.599 -17.441  39.725  1.00 40.00           C  
+ATOM   1898  CD2 TRP A 259      -8.479 -16.208  38.024  1.00 40.00           C  
+ATOM   1899  NE1 TRP A 259      -7.192 -18.002  38.540  1.00 40.00           N  
+ATOM   1900  CE2 TRP A 259      -7.690 -17.314  37.478  1.00 40.00           C  
+ATOM   1901  CE3 TRP A 259      -9.110 -15.325  37.139  1.00 40.00           C  
+ATOM   1902  CZ2 TRP A 259      -7.554 -17.516  36.100  1.00 40.00           C  
+ATOM   1903  CZ3 TRP A 259      -8.967 -15.537  35.758  1.00 40.00           C  
+ATOM   1904  CH2 TRP A 259      -8.207 -16.605  35.252  1.00 40.00           C  
+ATOM   1905  N   GLU A 260     -11.264 -17.352  41.399  1.00 40.00           N  
+ATOM   1906  CA  GLU A 260     -11.913 -18.634  41.538  1.00 40.00           C  
+ATOM   1907  C   GLU A 260     -13.270 -18.638  40.847  1.00 40.00           C  
+ATOM   1908  O   GLU A 260     -13.471 -19.364  39.865  1.00 40.00           O  
+ATOM   1909  CB  GLU A 260     -12.072 -18.983  43.018  1.00 40.00           C  
+ATOM   1910  CG  GLU A 260     -10.772 -19.396  43.679  1.00 40.00           C  
+ATOM   1911  CD  GLU A 260     -10.094 -20.535  42.938  1.00 40.00           C  
+ATOM   1912  OE1 GLU A 260      -8.957 -20.310  42.443  1.00 40.00           O  
+ATOM   1913  OE2 GLU A 260     -10.711 -21.636  42.832  1.00 40.00           O  
+ATOM   1914  N   LEU A 261     -14.183 -17.811  41.360  1.00 40.00           N  
+ATOM   1915  CA  LEU A 261     -15.549 -17.695  40.834  1.00 40.00           C  
+ATOM   1916  C   LEU A 261     -15.559 -17.431  39.325  1.00 40.00           C  
+ATOM   1917  O   LEU A 261     -16.569 -17.639  38.647  1.00 40.00           O  
+ATOM   1918  CB  LEU A 261     -16.319 -16.599  41.581  1.00 40.00           C  
+ATOM   1919  CG  LEU A 261     -16.818 -16.923  42.989  1.00 40.00           C  
+ATOM   1920  CD1 LEU A 261     -16.672 -15.716  43.908  1.00 40.00           C  
+ATOM   1921  CD2 LEU A 261     -18.251 -17.440  42.951  1.00 40.00           C  
+ATOM   1922  N   LEU A 262     -14.412 -17.000  38.811  1.00 40.00           N  
+ATOM   1923  CA  LEU A 262     -14.270 -16.685  37.403  1.00 40.00           C  
+ATOM   1924  C   LEU A 262     -14.189 -17.905  36.531  1.00 40.00           C  
+ATOM   1925  O   LEU A 262     -14.233 -17.802  35.303  1.00 40.00           O  
+ATOM   1926  CB  LEU A 262     -13.038 -15.823  37.160  1.00 40.00           C  
+ATOM   1927  CG  LEU A 262     -13.352 -14.325  37.180  1.00 40.00           C  
+ATOM   1928  CD1 LEU A 262     -12.166 -13.531  36.670  1.00 40.00           C  
+ATOM   1929  CD2 LEU A 262     -14.587 -13.993  36.351  1.00 40.00           C  
+ATOM   1930  N   LYS A 263     -14.059 -19.064  37.157  1.00 40.00           N  
+ATOM   1931  CA  LYS A 263     -13.965 -20.294  36.389  1.00 40.00           C  
+ATOM   1932  C   LYS A 263     -15.279 -21.094  36.432  1.00 40.00           C  
+ATOM   1933  O   LYS A 263     -15.423 -22.083  35.717  1.00 40.00           O  
+ATOM   1934  CB  LYS A 263     -12.705 -21.079  36.792  1.00 40.00           C  
+ATOM   1935  CG  LYS A 263     -11.428 -20.242  36.621  1.00 40.00           C  
+ATOM   1936  CD  LYS A 263     -10.148 -20.962  37.024  1.00 40.00           C  
+ATOM   1937  CE  LYS A 263      -9.915 -20.920  38.534  1.00 40.00           C  
+ATOM   1938  NZ  LYS A 263      -8.674 -21.639  38.953  1.00 40.00           N  
+ATOM   1939  N   LYS A 264     -16.243 -20.627  37.232  1.00 40.00           N  
+ATOM   1940  CA  LYS A 264     -17.583 -21.228  37.295  1.00 40.00           C  
+ATOM   1941  C   LYS A 264     -18.421 -20.900  36.064  1.00 40.00           C  
+ATOM   1942  O   LYS A 264     -18.123 -19.967  35.316  1.00 40.00           O  
+ATOM   1943  CB  LYS A 264     -18.328 -20.819  38.573  1.00 40.00           C  
+ATOM   1944  CG  LYS A 264     -17.896 -21.589  39.813  1.00 40.00           C  
+ATOM   1945  CD  LYS A 264     -18.712 -21.197  41.037  1.00 40.00           C  
+ATOM   1946  CE  LYS A 264     -18.562 -22.206  42.175  1.00 40.00           C  
+ATOM   1947  NZ  LYS A 264     -17.171 -22.350  42.699  1.00 40.00           N  
+ATOM   1948  N   ASP A 265     -19.468 -21.692  35.871  1.00 40.00           N  
+ATOM   1949  CA  ASP A 265     -20.310 -21.614  34.686  1.00 40.00           C  
+ATOM   1950  C   ASP A 265     -21.506 -20.747  34.935  1.00 40.00           C  
+ATOM   1951  O   ASP A 265     -22.216 -20.366  34.006  1.00 40.00           O  
+ATOM   1952  CB  ASP A 265     -20.819 -23.001  34.298  1.00 40.00           C  
+ATOM   1953  CG  ASP A 265     -19.878 -23.728  33.354  1.00 40.00           C  
+ATOM   1954  OD1 ASP A 265     -19.949 -24.981  33.312  1.00 40.00           O  
+ATOM   1955  OD2 ASP A 265     -19.075 -23.052  32.654  1.00 40.00           O  
+ATOM   1956  N   ASN A 266     -21.741 -20.454  36.201  1.00 40.00           N  
+ATOM   1957  CA  ASN A 266     -22.913 -19.694  36.580  1.00 40.00           C  
+ATOM   1958  C   ASN A 266     -22.515 -18.385  37.265  1.00 40.00           C  
+ATOM   1959  O   ASN A 266     -23.265 -17.830  38.077  1.00 40.00           O  
+ATOM   1960  CB  ASN A 266     -23.782 -20.546  37.489  1.00 40.00           C  
+ATOM   1961  CG  ASN A 266     -23.079 -20.908  38.782  1.00 40.00           C  
+ATOM   1962  OD1 ASN A 266     -21.837 -20.970  38.849  1.00 40.00           O  
+ATOM   1963  ND2 ASN A 266     -23.870 -21.139  39.824  1.00 40.00           N  
+ATOM   1964  N   THR A 267     -21.319 -17.908  36.933  1.00 40.00           N  
+ATOM   1965  CA  THR A 267     -20.837 -16.625  37.409  1.00 40.00           C  
+ATOM   1966  C   THR A 267     -20.857 -15.624  36.240  1.00 40.00           C  
+ATOM   1967  O   THR A 267     -20.141 -15.803  35.259  1.00 40.00           O  
+ATOM   1968  CB  THR A 267     -19.432 -16.772  38.031  1.00 40.00           C  
+ATOM   1969  OG1 THR A 267     -19.489 -17.674  39.147  1.00 40.00           O  
+ATOM   1970  CG2 THR A 267     -18.919 -15.445  38.514  1.00 40.00           C  
+ATOM   1971  N   TYR A 268     -21.697 -14.591  36.338  1.00 40.00           N  
+ATOM   1972  CA  TYR A 268     -21.846 -13.602  35.259  1.00 40.00           C  
+ATOM   1973  C   TYR A 268     -21.443 -12.208  35.721  1.00 40.00           C  
+ATOM   1974  O   TYR A 268     -21.956 -11.691  36.713  1.00 40.00           O  
+ATOM   1975  CB  TYR A 268     -23.285 -13.578  34.721  1.00 40.00           C  
+ATOM   1976  CG  TYR A 268     -23.874 -14.943  34.418  1.00 40.00           C  
+ATOM   1977  CD1 TYR A 268     -24.509 -15.681  35.413  1.00 40.00           C  
+ATOM   1978  CD2 TYR A 268     -23.801 -15.496  33.136  1.00 40.00           C  
+ATOM   1979  CE1 TYR A 268     -25.050 -16.931  35.149  1.00 40.00           C  
+ATOM   1980  CE2 TYR A 268     -24.342 -16.752  32.864  1.00 40.00           C  
+ATOM   1981  CZ  TYR A 268     -24.969 -17.461  33.879  1.00 40.00           C  
+ATOM   1982  OH  TYR A 268     -25.521 -18.700  33.652  1.00 40.00           O  
+ATOM   1983  N   VAL A 269     -20.528 -11.597  34.989  1.00 40.00           N  
+ATOM   1984  CA  VAL A 269     -19.997 -10.311  35.387  1.00 40.00           C  
+ATOM   1985  C   VAL A 269     -20.635  -9.174  34.620  1.00 40.00           C  
+ATOM   1986  O   VAL A 269     -20.812  -9.251  33.404  1.00 40.00           O  
+ATOM   1987  CB  VAL A 269     -18.490 -10.248  35.150  1.00 40.00           C  
+ATOM   1988  CG1 VAL A 269     -18.001  -8.821  35.268  1.00 40.00           C  
+ATOM   1989  CG2 VAL A 269     -17.771 -11.126  36.148  1.00 40.00           C  
+ATOM   1990  N   TYR A 270     -20.950  -8.106  35.339  1.00 40.00           N  
+ATOM   1991  CA  TYR A 270     -21.510  -6.931  34.724  1.00 40.00           C  
+ATOM   1992  C   TYR A 270     -20.739  -5.711  35.194  1.00 40.00           C  
+ATOM   1993  O   TYR A 270     -20.550  -5.508  36.386  1.00 40.00           O  
+ATOM   1994  CB  TYR A 270     -22.992  -6.798  35.083  1.00 40.00           C  
+ATOM   1995  CG  TYR A 270     -23.941  -7.857  34.507  1.00 40.00           C  
+ATOM   1996  CD1 TYR A 270     -24.091  -9.107  35.114  1.00 40.00           C  
+ATOM   1997  CD2 TYR A 270     -24.726  -7.584  33.383  1.00 40.00           C  
+ATOM   1998  CE1 TYR A 270     -24.967 -10.059  34.602  1.00 40.00           C  
+ATOM   1999  CE2 TYR A 270     -25.605  -8.530  32.865  1.00 40.00           C  
+ATOM   2000  CZ  TYR A 270     -25.725  -9.769  33.475  1.00 40.00           C  
+ATOM   2001  OH  TYR A 270     -26.603 -10.714  32.966  1.00 40.00           O  
+ATOM   2002  N   MET A 271     -20.289  -4.908  34.242  1.00 40.00           N  
+ATOM   2003  CA  MET A 271     -19.529  -3.706  34.528  1.00 40.00           C  
+ATOM   2004  C   MET A 271     -20.259  -2.507  33.939  1.00 40.00           C  
+ATOM   2005  O   MET A 271     -20.636  -2.524  32.762  1.00 40.00           O  
+ATOM   2006  CB  MET A 271     -18.133  -3.825  33.920  1.00 40.00           C  
+ATOM   2007  CG  MET A 271     -17.120  -2.855  34.488  1.00 40.00           C  
+ATOM   2008  SD  MET A 271     -15.619  -2.784  33.511  1.00 40.00           S  
+ATOM   2009  CE  MET A 271     -14.777  -4.264  34.022  1.00 40.00           C  
+ATOM   2010  N   CYS A 272     -20.459  -1.475  34.756  1.00 40.00           N  
+ATOM   2011  CA  CYS A 272     -21.139  -0.257  34.306  1.00 40.00           C  
+ATOM   2012  C   CYS A 272     -20.628   1.035  34.944  1.00 40.00           C  
+ATOM   2013  O   CYS A 272     -20.347   1.079  36.137  1.00 40.00           O  
+ATOM   2014  CB  CYS A 272     -22.635  -0.376  34.547  1.00 40.00           C  
+ATOM   2015  SG  CYS A 272     -23.569   0.962  33.788  1.00 40.00           S  
+ATOM   2016  N   GLY A 273     -20.520   2.088  34.140  1.00 40.00           N  
+ATOM   2017  CA  GLY A 273     -20.152   3.397  34.654  1.00 40.00           C  
+ATOM   2018  C   GLY A 273     -19.260   4.248  33.775  1.00 40.00           C  
+ATOM   2019  O   GLY A 273     -19.592   4.570  32.634  1.00 40.00           O  
+ATOM   2020  N   LEU A 274     -18.115   4.613  34.328  1.00 40.00           N  
+ATOM   2021  CA  LEU A 274     -17.276   5.636  33.744  1.00 40.00           C  
+ATOM   2022  C   LEU A 274     -16.165   5.022  32.930  1.00 40.00           C  
+ATOM   2023  O   LEU A 274     -15.307   4.310  33.460  1.00 40.00           O  
+ATOM   2024  CB  LEU A 274     -16.690   6.527  34.846  1.00 40.00           C  
+ATOM   2025  CG  LEU A 274     -17.668   7.296  35.753  1.00 40.00           C  
+ATOM   2026  CD1 LEU A 274     -17.084   7.563  37.144  1.00 40.00           C  
+ATOM   2027  CD2 LEU A 274     -18.161   8.582  35.075  1.00 40.00           C  
+ATOM   2028  N   LYS A 275     -16.182   5.308  31.635  1.00 40.00           N  
+ATOM   2029  CA  LYS A 275     -15.110   4.893  30.758  1.00 40.00           C  
+ATOM   2030  C   LYS A 275     -13.784   5.099  31.464  1.00 40.00           C  
+ATOM   2031  O   LYS A 275     -13.462   6.203  31.882  1.00 40.00           O  
+ATOM   2032  CB  LYS A 275     -15.141   5.716  29.481  1.00 40.00           C  
+ATOM   2033  CG  LYS A 275     -14.125   5.272  28.446  1.00 40.00           C  
+ATOM   2034  CD  LYS A 275     -14.314   6.044  27.151  1.00 40.00           C  
+ATOM   2035  CE  LYS A 275     -13.537   5.406  26.012  1.00 40.00           C  
+ATOM   2036  NZ  LYS A 275     -14.084   5.851  24.697  1.00 40.00           N  
+ATOM   2037  N   GLY A 276     -13.027   4.028  31.623  1.00 40.00           N  
+ATOM   2038  CA  GLY A 276     -11.723   4.140  32.245  1.00 40.00           C  
+ATOM   2039  C   GLY A 276     -11.553   3.188  33.402  1.00 40.00           C  
+ATOM   2040  O   GLY A 276     -10.442   2.704  33.659  1.00 40.00           O  
+ATOM   2041  N   MET A 277     -12.651   2.912  34.095  1.00 40.00           N  
+ATOM   2042  CA  MET A 277     -12.606   2.010  35.231  1.00 40.00           C  
+ATOM   2043  C   MET A 277     -11.976   0.674  34.851  1.00 40.00           C  
+ATOM   2044  O   MET A 277     -11.239   0.079  35.648  1.00 40.00           O  
+ATOM   2045  CB  MET A 277     -14.001   1.804  35.806  1.00 40.00           C  
+ATOM   2046  CG  MET A 277     -15.014   1.300  34.800  1.00 40.00           C  
+ATOM   2047  SD  MET A 277     -16.700   1.372  35.412  1.00 40.00           S  
+ATOM   2048  CE  MET A 277     -16.685   0.097  36.673  1.00 40.00           C  
+ATOM   2049  N   GLU A 278     -12.244   0.227  33.622  1.00 40.00           N  
+ATOM   2050  CA  GLU A 278     -11.842  -1.117  33.188  1.00 40.00           C  
+ATOM   2051  C   GLU A 278     -10.357  -1.269  32.888  1.00 40.00           C  
+ATOM   2052  O   GLU A 278      -9.843  -2.390  32.941  1.00 40.00           O  
+ATOM   2053  CB  GLU A 278     -12.694  -1.658  32.018  1.00 40.00           C  
+ATOM   2054  CG  GLU A 278     -12.296  -1.187  30.627  1.00 40.00           C  
+ATOM   2055  CD  GLU A 278     -12.872   0.175  30.297  1.00 40.00           C  
+ATOM   2056  OE1 GLU A 278     -12.496   1.172  30.967  1.00 40.00           O  
+ATOM   2057  OE2 GLU A 278     -13.706   0.238  29.366  1.00 40.00           O  
+ATOM   2058  N   LYS A 279      -9.660  -0.177  32.569  1.00 40.00           N  
+ATOM   2059  CA  LYS A 279      -8.212  -0.286  32.558  1.00 40.00           C  
+ATOM   2060  C   LYS A 279      -7.795  -0.758  33.957  1.00 40.00           C  
+ATOM   2061  O   LYS A 279      -7.112  -1.784  34.103  1.00 40.00           O  
+ATOM   2062  CB  LYS A 279      -7.505   1.016  32.187  1.00 40.00           C  
+ATOM   2063  CG  LYS A 279      -6.016   0.777  31.946  1.00 40.00           C  
+ATOM   2064  CD  LYS A 279      -5.170   2.013  32.187  1.00 40.00           C  
+ATOM   2065  CE  LYS A 279      -3.696   1.641  32.262  1.00 40.00           C  
+ATOM   2066  NZ  LYS A 279      -2.802   2.831  32.123  1.00 40.00           N  
+ATOM   2067  N   GLY A 280      -8.255  -0.027  34.977  1.00 40.00           N  
+ATOM   2068  CA  GLY A 280      -8.025  -0.384  36.381  1.00 40.00           C  
+ATOM   2069  C   GLY A 280      -8.230  -1.862  36.659  1.00 40.00           C  
+ATOM   2070  O   GLY A 280      -7.353  -2.528  37.224  1.00 40.00           O  
+ATOM   2071  N   ILE A 281      -9.378  -2.375  36.228  1.00 40.00           N  
+ATOM   2072  CA  ILE A 281      -9.752  -3.760  36.472  1.00 40.00           C  
+ATOM   2073  C   ILE A 281      -8.942  -4.768  35.671  1.00 40.00           C  
+ATOM   2074  O   ILE A 281      -8.450  -5.746  36.224  1.00 40.00           O  
+ATOM   2075  CB  ILE A 281     -11.248  -3.961  36.232  1.00 40.00           C  
+ATOM   2076  CG1 ILE A 281     -12.034  -3.295  37.373  1.00 40.00           C  
+ATOM   2077  CG2 ILE A 281     -11.554  -5.443  36.100  1.00 40.00           C  
+ATOM   2078  CD1 ILE A 281     -13.545  -3.366  37.257  1.00 40.00           C  
+ATOM   2079  N   ASP A 282      -8.808  -4.524  34.373  1.00 40.00           N  
+ATOM   2080  CA  ASP A 282      -8.007  -5.375  33.507  1.00 40.00           C  
+ATOM   2081  C   ASP A 282      -6.603  -5.585  34.080  1.00 40.00           C  
+ATOM   2082  O   ASP A 282      -6.097  -6.705  34.113  1.00 40.00           O  
+ATOM   2083  CB  ASP A 282      -7.920  -4.789  32.087  1.00 40.00           C  
+ATOM   2084  CG  ASP A 282      -9.233  -4.907  31.303  1.00 40.00           C  
+ATOM   2085  OD1 ASP A 282     -10.134  -5.677  31.712  1.00 40.00           O  
+ATOM   2086  OD2 ASP A 282      -9.360  -4.225  30.260  1.00 40.00           O  
+ATOM   2087  N   ASP A 283      -5.992  -4.499  34.547  1.00 40.00           N  
+ATOM   2088  CA  ASP A 283      -4.645  -4.522  35.128  1.00 40.00           C  
+ATOM   2089  C   ASP A 283      -4.515  -5.520  36.289  1.00 40.00           C  
+ATOM   2090  O   ASP A 283      -3.503  -6.219  36.422  1.00 40.00           O  
+ATOM   2091  CB  ASP A 283      -4.257  -3.103  35.585  1.00 40.00           C  
+ATOM   2092  CG  ASP A 283      -4.122  -2.106  34.412  1.00 40.00           C  
+ATOM   2093  OD1 ASP A 283      -3.766  -2.519  33.286  1.00 40.00           O  
+ATOM   2094  OD2 ASP A 283      -4.365  -0.895  34.618  1.00 40.00           O  
+ATOM   2095  N   ILE A 284      -5.563  -5.575  37.108  1.00 40.00           N  
+ATOM   2096  CA  ILE A 284      -5.652  -6.488  38.241  1.00 40.00           C  
+ATOM   2097  C   ILE A 284      -5.841  -7.940  37.786  1.00 40.00           C  
+ATOM   2098  O   ILE A 284      -5.338  -8.881  38.424  1.00 40.00           O  
+ATOM   2099  CB  ILE A 284      -6.804  -6.068  39.192  1.00 40.00           C  
+ATOM   2100  CG1 ILE A 284      -6.615  -4.616  39.679  1.00 40.00           C  
+ATOM   2101  CG2 ILE A 284      -6.982  -7.056  40.351  1.00 40.00           C  
+ATOM   2102  CD1 ILE A 284      -5.211  -4.234  40.122  1.00 40.00           C  
+ATOM   2103  N   MET A 285      -6.565  -8.110  36.680  1.00 40.00           N  
+ATOM   2104  CA  MET A 285      -6.879  -9.438  36.145  1.00 40.00           C  
+ATOM   2105  C   MET A 285      -5.707 -10.059  35.414  1.00 40.00           C  
+ATOM   2106  O   MET A 285      -5.577 -11.284  35.359  1.00 40.00           O  
+ATOM   2107  CB  MET A 285      -8.084  -9.361  35.213  1.00 40.00           C  
+ATOM   2108  CG  MET A 285      -9.386  -9.147  35.960  1.00 40.00           C  
+ATOM   2109  SD  MET A 285      -9.690 -10.513  37.113  1.00 40.00           S  
+ATOM   2110  CE  MET A 285     -10.320  -9.624  38.535  1.00 40.00           C  
+ATOM   2111  N   VAL A 286      -4.871  -9.188  34.855  1.00 40.00           N  
+ATOM   2112  CA  VAL A 286      -3.674  -9.576  34.127  1.00 40.00           C  
+ATOM   2113  C   VAL A 286      -2.762 -10.434  35.006  1.00 40.00           C  
+ATOM   2114  O   VAL A 286      -2.376 -11.540  34.608  1.00 40.00           O  
+ATOM   2115  CB  VAL A 286      -2.942  -8.318  33.586  1.00 40.00           C  
+ATOM   2116  CG1 VAL A 286      -1.493  -8.624  33.224  1.00 40.00           C  
+ATOM   2117  CG2 VAL A 286      -3.685  -7.751  32.382  1.00 40.00           C  
+ATOM   2118  N   SER A 287      -2.455  -9.927  36.203  1.00 40.00           N  
+ATOM   2119  CA  SER A 287      -1.558 -10.603  37.144  1.00 40.00           C  
+ATOM   2120  C   SER A 287      -2.140 -11.898  37.733  1.00 40.00           C  
+ATOM   2121  O   SER A 287      -1.383 -12.821  38.055  1.00 40.00           O  
+ATOM   2122  CB  SER A 287      -1.099  -9.636  38.247  1.00 40.00           C  
+ATOM   2123  OG  SER A 287      -2.195  -9.006  38.890  1.00 40.00           O  
+ATOM   2124  N   LEU A 288      -3.473 -11.953  37.854  1.00 40.00           N  
+ATOM   2125  CA  LEU A 288      -4.223 -13.151  38.296  1.00 40.00           C  
+ATOM   2126  C   LEU A 288      -4.275 -14.282  37.253  1.00 40.00           C  
+ATOM   2127  O   LEU A 288      -4.320 -15.474  37.594  1.00 40.00           O  
+ATOM   2128  CB  LEU A 288      -5.659 -12.768  38.688  1.00 40.00           C  
+ATOM   2129  CG  LEU A 288      -5.948 -12.379  40.139  1.00 40.00           C  
+ATOM   2130  CD1 LEU A 288      -7.365 -11.839  40.269  1.00 40.00           C  
+ATOM   2131  CD2 LEU A 288      -5.730 -13.572  41.064  1.00 40.00           C  
+ATOM   2132  N   ALA A 289      -4.287 -13.878  35.985  1.00 40.00           N  
+ATOM   2133  CA  ALA A 289      -4.353 -14.795  34.847  1.00 40.00           C  
+ATOM   2134  C   ALA A 289      -3.032 -15.533  34.634  1.00 40.00           C  
+ATOM   2135  O   ALA A 289      -3.012 -16.760  34.670  1.00 40.00           O  
+ATOM   2136  CB  ALA A 289      -4.777 -14.053  33.578  1.00 40.00           C  
+ATOM   2137  N   GLU A 290      -1.946 -14.781  34.422  1.00 40.00           N  
+ATOM   2138  CA  GLU A 290      -0.595 -15.328  34.234  1.00 40.00           C  
+ATOM   2139  C   GLU A 290      -0.115 -16.168  35.429  1.00 40.00           C  
+ATOM   2140  O   GLU A 290       0.921 -16.827  35.337  1.00 40.00           O  
+ATOM   2141  CB  GLU A 290       0.394 -14.194  33.952  1.00 40.00           C  
+ATOM   2142  CG  GLU A 290       0.355 -13.097  35.020  1.00 40.00           C  
+ATOM   2143  CD  GLU A 290       1.393 -12.002  34.827  1.00 40.00           C  
+ATOM   2144  OE1 GLU A 290       2.601 -12.325  34.822  1.00 40.00           O  
+ATOM   2145  OE2 GLU A 290       1.008 -10.814  34.709  1.00 40.00           O  
+ATOM   2146  N   LYS A 291      -0.859 -16.123  36.542  1.00 40.00           N  
+ATOM   2147  CA  LYS A 291      -0.677 -17.060  37.665  1.00 40.00           C  
+ATOM   2148  C   LYS A 291      -0.925 -18.505  37.250  1.00 40.00           C  
+ATOM   2149  O   LYS A 291      -0.148 -19.394  37.604  1.00 40.00           O  
+ATOM   2150  CB  LYS A 291      -1.628 -16.755  38.827  1.00 40.00           C  
+ATOM   2151  CG  LYS A 291      -1.201 -15.620  39.723  1.00 40.00           C  
+ATOM   2152  CD  LYS A 291       0.220 -15.786  40.223  1.00 40.00           C  
+ATOM   2153  CE  LYS A 291       0.657 -14.493  40.875  1.00 40.00           C  
+ATOM   2154  NZ  LYS A 291      -0.456 -13.928  41.697  1.00 40.00           N  
+ATOM   2155  N   ASP A 292      -2.029 -18.726  36.527  1.00 40.00           N  
+ATOM   2156  CA  ASP A 292      -2.407 -20.051  35.993  1.00 40.00           C  
+ATOM   2157  C   ASP A 292      -1.778 -20.331  34.627  1.00 40.00           C  
+ATOM   2158  O   ASP A 292      -2.083 -21.354  33.996  1.00 40.00           O  
+ATOM   2159  CB  ASP A 292      -3.931 -20.169  35.863  1.00 40.00           C  
+ATOM   2160  CG  ASP A 292      -4.652 -19.995  37.185  1.00 40.00           C  
+ATOM   2161  OD1 ASP A 292      -4.061 -19.435  38.144  1.00 40.00           O  
+ATOM   2162  OD2 ASP A 292      -5.829 -20.419  37.257  1.00 40.00           O  
+ATOM   2163  N   GLY A 293      -0.909 -19.416  34.185  1.00 40.00           N  
+ATOM   2164  CA  GLY A 293      -0.314 -19.435  32.837  1.00 40.00           C  
+ATOM   2165  C   GLY A 293      -1.218 -18.920  31.714  1.00 40.00           C  
+ATOM   2166  O   GLY A 293      -0.947 -19.171  30.527  1.00 40.00           O  
+ATOM   2167  N   ILE A 294      -2.272 -18.186  32.096  1.00 40.00           N  
+ATOM   2168  CA  ILE A 294      -3.351 -17.744  31.188  1.00 40.00           C  
+ATOM   2169  C   ILE A 294      -3.151 -16.293  30.669  1.00 40.00           C  
+ATOM   2170  O   ILE A 294      -2.731 -15.398  31.425  1.00 40.00           O  
+ATOM   2171  CB  ILE A 294      -4.756 -17.942  31.856  1.00 40.00           C  
+ATOM   2172  CG1 ILE A 294      -5.002 -19.429  32.192  1.00 40.00           C  
+ATOM   2173  CG2 ILE A 294      -5.884 -17.397  30.981  1.00 40.00           C  
+ATOM   2174  CD1 ILE A 294      -6.184 -19.697  33.107  1.00 40.00           C  
+ATOM   2175  N   ASP A 295      -3.411 -16.083  29.373  1.00 40.00           N  
+ATOM   2176  CA  ASP A 295      -3.548 -14.731  28.830  1.00 40.00           C  
+ATOM   2177  C   ASP A 295      -4.981 -14.224  28.989  1.00 40.00           C  
+ATOM   2178  O   ASP A 295      -5.954 -14.825  28.500  1.00 40.00           O  
+ATOM   2179  CB  ASP A 295      -3.102 -14.615  27.370  1.00 40.00           C  
+ATOM   2180  CG  ASP A 295      -3.338 -13.206  26.794  1.00 40.00           C  
+ATOM   2181  OD1 ASP A 295      -3.307 -13.036  25.556  1.00 40.00           O  
+ATOM   2182  OD2 ASP A 295      -3.563 -12.257  27.574  1.00 40.00           O  
+ATOM   2183  N   TRP A 296      -5.066 -13.080  29.659  1.00 40.00           N  
+ATOM   2184  CA  TRP A 296      -6.314 -12.498  30.133  1.00 40.00           C  
+ATOM   2185  C   TRP A 296      -7.316 -12.203  29.050  1.00 40.00           C  
+ATOM   2186  O   TRP A 296      -8.456 -12.674  29.108  1.00 40.00           O  
+ATOM   2187  CB  TRP A 296      -6.003 -11.250  30.969  1.00 40.00           C  
+ATOM   2188  CG  TRP A 296      -7.190 -10.364  31.254  1.00 40.00           C  
+ATOM   2189  CD1 TRP A 296      -7.320  -9.012  30.967  1.00 40.00           C  
+ATOM   2190  CD2 TRP A 296      -8.467 -10.740  31.884  1.00 40.00           C  
+ATOM   2191  NE1 TRP A 296      -8.546  -8.541  31.365  1.00 40.00           N  
+ATOM   2192  CE2 TRP A 296      -9.281  -9.522  31.922  1.00 40.00           C  
+ATOM   2193  CE3 TRP A 296      -8.994 -11.916  32.396  1.00 40.00           C  
+ATOM   2194  CZ2 TRP A 296     -10.558  -9.505  32.459  1.00 40.00           C  
+ATOM   2195  CZ3 TRP A 296     -10.286 -11.887  32.932  1.00 40.00           C  
+ATOM   2196  CH2 TRP A 296     -11.045 -10.708  32.965  1.00 40.00           C  
+ATOM   2197  N   PHE A 297      -6.896 -11.441  28.045  1.00 40.00           N  
+ATOM   2198  CA  PHE A 297      -7.820 -10.958  27.031  1.00 40.00           C  
+ATOM   2199  C   PHE A 297      -8.493 -12.110  26.298  1.00 40.00           C  
+ATOM   2200  O   PHE A 297      -9.658 -12.006  25.930  1.00 40.00           O  
+ATOM   2201  CB  PHE A 297      -7.132  -9.947  26.112  1.00 40.00           C  
+ATOM   2202  CG  PHE A 297      -6.670  -8.710  26.844  1.00 40.00           C  
+ATOM   2203  CD1 PHE A 297      -5.410  -8.668  27.455  1.00 40.00           C  
+ATOM   2204  CD2 PHE A 297      -7.506  -7.596  26.972  1.00 40.00           C  
+ATOM   2205  CE1 PHE A 297      -4.987  -7.534  28.152  1.00 40.00           C  
+ATOM   2206  CE2 PHE A 297      -7.085  -6.458  27.667  1.00 40.00           C  
+ATOM   2207  CZ  PHE A 297      -5.824  -6.425  28.256  1.00 40.00           C  
+ATOM   2208  N   ASP A 298      -7.783 -13.229  26.167  1.00 40.00           N  
+ATOM   2209  CA  ASP A 298      -8.319 -14.437  25.529  1.00 40.00           C  
+ATOM   2210  C   ASP A 298      -9.290 -15.176  26.406  1.00 40.00           C  
+ATOM   2211  O   ASP A 298     -10.206 -15.832  25.919  1.00 40.00           O  
+ATOM   2212  CB  ASP A 298      -7.189 -15.366  25.159  1.00 40.00           C  
+ATOM   2213  CG  ASP A 298      -6.196 -14.707  24.252  1.00 40.00           C  
+ATOM   2214  OD1 ASP A 298      -5.434 -15.452  23.612  1.00 40.00           O  
+ATOM   2215  OD2 ASP A 298      -6.175 -13.449  24.170  1.00 40.00           O  
+ATOM   2216  N   TYR A 299      -9.069 -15.079  27.707  1.00 40.00           N  
+ATOM   2217  CA  TYR A 299     -10.021 -15.585  28.667  1.00 40.00           C  
+ATOM   2218  C   TYR A 299     -11.202 -14.625  28.747  1.00 40.00           C  
+ATOM   2219  O   TYR A 299     -12.342 -15.051  28.940  1.00 40.00           O  
+ATOM   2220  CB  TYR A 299      -9.351 -15.732  30.026  1.00 40.00           C  
+ATOM   2221  CG  TYR A 299     -10.108 -16.593  31.022  1.00 40.00           C  
+ATOM   2222  CD1 TYR A 299     -10.252 -17.974  30.834  1.00 40.00           C  
+ATOM   2223  CD2 TYR A 299     -10.653 -16.032  32.180  1.00 40.00           C  
+ATOM   2224  CE1 TYR A 299     -10.930 -18.761  31.765  1.00 40.00           C  
+ATOM   2225  CE2 TYR A 299     -11.332 -16.813  33.117  1.00 40.00           C  
+ATOM   2226  CZ  TYR A 299     -11.470 -18.173  32.905  1.00 40.00           C  
+ATOM   2227  OH  TYR A 299     -12.141 -18.936  33.832  1.00 40.00           O  
+ATOM   2228  N   LYS A 300     -10.915 -13.333  28.578  1.00 40.00           N  
+ATOM   2229  CA  LYS A 300     -11.937 -12.285  28.554  1.00 40.00           C  
+ATOM   2230  C   LYS A 300     -12.916 -12.553  27.430  1.00 40.00           C  
+ATOM   2231  O   LYS A 300     -14.065 -12.931  27.672  1.00 40.00           O  
+ATOM   2232  CB  LYS A 300     -11.297 -10.898  28.377  1.00 40.00           C  
+ATOM   2233  CG  LYS A 300     -12.301  -9.742  28.322  1.00 40.00           C  
+ATOM   2234  CD  LYS A 300     -11.662  -8.388  27.996  1.00 40.00           C  
+ATOM   2235  CE  LYS A 300     -11.327  -7.569  29.245  1.00 40.00           C  
+ATOM   2236  NZ  LYS A 300     -10.991  -6.153  28.917  1.00 40.00           N  
+ATOM   2237  N   LYS A 301     -12.438 -12.354  26.205  1.00 40.00           N  
+ATOM   2238  CA  LYS A 301     -13.154 -12.733  25.006  1.00 40.00           C  
+ATOM   2239  C   LYS A 301     -14.095 -13.901  25.279  1.00 40.00           C  
+ATOM   2240  O   LYS A 301     -15.305 -13.796  25.083  1.00 40.00           O  
+ATOM   2241  CB  LYS A 301     -12.149 -13.165  23.950  1.00 40.00           C  
+ATOM   2242  CG  LYS A 301     -11.372 -12.036  23.309  1.00 40.00           C  
+ATOM   2243  CD  LYS A 301     -10.036 -12.541  22.773  1.00 40.00           C  
+ATOM   2244  CE  LYS A 301      -9.474 -11.659  21.667  1.00 40.00           C  
+ATOM   2245  NZ  LYS A 301      -9.623 -10.192  21.906  1.00 40.00           N  
+ATOM   2246  N   GLN A 302     -13.520 -15.006  25.748  1.00 40.00           N  
+ATOM   2247  CA  GLN A 302     -14.242 -16.259  25.962  1.00 40.00           C  
+ATOM   2248  C   GLN A 302     -15.452 -16.119  26.882  1.00 40.00           C  
+ATOM   2249  O   GLN A 302     -16.534 -16.633  26.591  1.00 40.00           O  
+ATOM   2250  CB  GLN A 302     -13.280 -17.305  26.515  1.00 40.00           C  
+ATOM   2251  CG  GLN A 302     -13.917 -18.647  26.825  1.00 40.00           C  
+ATOM   2252  CD  GLN A 302     -13.017 -19.509  27.674  1.00 40.00           C  
+ATOM   2253  OE1 GLN A 302     -13.421 -19.966  28.745  1.00 40.00           O  
+ATOM   2254  NE2 GLN A 302     -11.780 -19.722  27.213  1.00 40.00           N  
+ATOM   2255  N   LEU A 303     -15.262 -15.427  27.996  1.00 40.00           N  
+ATOM   2256  CA  LEU A 303     -16.354 -15.194  28.913  1.00 40.00           C  
+ATOM   2257  C   LEU A 303     -17.409 -14.397  28.201  1.00 40.00           C  
+ATOM   2258  O   LEU A 303     -18.594 -14.648  28.369  1.00 40.00           O  
+ATOM   2259  CB  LEU A 303     -15.872 -14.425  30.129  1.00 40.00           C  
+ATOM   2260  CG  LEU A 303     -14.750 -15.113  30.898  1.00 40.00           C  
+ATOM   2261  CD1 LEU A 303     -13.966 -14.082  31.692  1.00 40.00           C  
+ATOM   2262  CD2 LEU A 303     -15.284 -16.233  31.787  1.00 40.00           C  
+ATOM   2263  N   LYS A 304     -16.962 -13.439  27.393  1.00 40.00           N  
+ATOM   2264  CA  LYS A 304     -17.874 -12.588  26.639  1.00 40.00           C  
+ATOM   2265  C   LYS A 304     -18.707 -13.447  25.712  1.00 40.00           C  
+ATOM   2266  O   LYS A 304     -19.932 -13.366  25.752  1.00 40.00           O  
+ATOM   2267  CB  LYS A 304     -17.133 -11.497  25.861  1.00 40.00           C  
+ATOM   2268  CG  LYS A 304     -16.518 -10.423  26.738  1.00 40.00           C  
+ATOM   2269  CD  LYS A 304     -15.816  -9.347  25.930  1.00 40.00           C  
+ATOM   2270  CE  LYS A 304     -16.647  -8.076  25.838  1.00 40.00           C  
+ATOM   2271  NZ  LYS A 304     -15.861  -6.953  25.250  1.00 40.00           N  
+ATOM   2272  N   ARG A 305     -18.052 -14.284  24.903  1.00 40.00           N  
+ATOM   2273  CA  ARG A 305     -18.775 -15.237  24.062  1.00 40.00           C  
+ATOM   2274  C   ARG A 305     -19.781 -15.994  24.912  1.00 40.00           C  
+ATOM   2275  O   ARG A 305     -20.893 -16.262  24.467  1.00 40.00           O  
+ATOM   2276  CB  ARG A 305     -17.836 -16.218  23.361  1.00 40.00           C  
+ATOM   2277  CG  ARG A 305     -17.602 -15.931  21.881  1.00 40.00           C  
+ATOM   2278  CD  ARG A 305     -16.864 -17.080  21.181  1.00 40.00           C  
+ATOM   2279  NE  ARG A 305     -15.444 -17.174  21.566  1.00 40.00           N  
+ATOM   2280  CZ  ARG A 305     -14.917 -18.103  22.373  1.00 40.00           C  
+ATOM   2281  NH1 ARG A 305     -15.684 -19.064  22.893  1.00 40.00           N  
+ATOM   2282  NH2 ARG A 305     -13.610 -18.072  22.660  1.00 40.00           N  
+ATOM   2283  N   GLY A 306     -19.403 -16.312  26.147  1.00 40.00           N  
+ATOM   2284  CA  GLY A 306     -20.336 -16.937  27.074  1.00 40.00           C  
+ATOM   2285  C   GLY A 306     -21.323 -15.966  27.709  1.00 40.00           C  
+ATOM   2286  O   GLY A 306     -22.011 -16.332  28.665  1.00 40.00           O  
+ATOM   2287  N   ASP A 307     -21.400 -14.736  27.194  1.00 40.00           N  
+ATOM   2288  CA  ASP A 307     -22.252 -13.696  27.777  1.00 40.00           C  
+ATOM   2289  C   ASP A 307     -21.947 -13.530  29.255  1.00 40.00           C  
+ATOM   2290  O   ASP A 307     -22.772 -13.011  30.004  1.00 40.00           O  
+ATOM   2291  CB  ASP A 307     -23.736 -14.043  27.621  1.00 40.00           C  
+ATOM   2292  CG  ASP A 307     -24.146 -14.239  26.187  1.00 40.00           C  
+ATOM   2293  OD1 ASP A 307     -23.858 -13.364  25.341  1.00 40.00           O  
+ATOM   2294  OD2 ASP A 307     -24.781 -15.272  25.913  1.00 40.00           O  
+ATOM   2295  N   GLN A 308     -20.772 -13.995  29.675  1.00 40.00           N  
+ATOM   2296  CA  GLN A 308     -20.417 -14.016  31.090  1.00 40.00           C  
+ATOM   2297  C   GLN A 308     -19.707 -12.733  31.512  1.00 40.00           C  
+ATOM   2298  O   GLN A 308     -19.525 -12.476  32.703  1.00 40.00           O  
+ATOM   2299  CB  GLN A 308     -19.618 -15.288  31.445  1.00 40.00           C  
+ATOM   2300  CG  GLN A 308     -20.503 -16.538  31.592  1.00 40.00           C  
+ATOM   2301  CD  GLN A 308     -19.745 -17.843  31.852  1.00 40.00           C  
+ATOM   2302  OE1 GLN A 308     -19.205 -18.069  32.936  1.00 40.00           O  
+ATOM   2303  NE2 GLN A 308     -19.741 -18.725  30.863  1.00 40.00           N  
+ATOM   2304  N   TRP A 309     -19.348 -11.914  30.525  1.00 40.00           N  
+ATOM   2305  CA  TRP A 309     -18.743 -10.606  30.762  1.00 40.00           C  
+ATOM   2306  C   TRP A 309     -19.429  -9.588  29.935  1.00 40.00           C  
+ATOM   2307  O   TRP A 309     -19.490  -9.721  28.708  1.00 40.00           O  
+ATOM   2308  CB  TRP A 309     -17.304 -10.628  30.340  1.00 40.00           C  
+ATOM   2309  CG  TRP A 309     -16.536  -9.401  30.745  1.00 40.00           C  
+ATOM   2310  CD1 TRP A 309     -16.325  -8.230  30.014  1.00 40.00           C  
+ATOM   2311  CD2 TRP A 309     -15.808  -9.206  31.991  1.00 40.00           C  
+ATOM   2312  NE1 TRP A 309     -15.533  -7.348  30.712  1.00 40.00           N  
+ATOM   2313  CE2 TRP A 309     -15.189  -7.870  31.906  1.00 40.00           C  
+ATOM   2314  CE3 TRP A 309     -15.602  -9.983  33.132  1.00 40.00           C  
+ATOM   2315  CZ2 TRP A 309     -14.410  -7.356  32.928  1.00 40.00           C  
+ATOM   2316  CZ3 TRP A 309     -14.819  -9.453  34.162  1.00 40.00           C  
+ATOM   2317  CH2 TRP A 309     -14.239  -8.169  34.061  1.00 40.00           C  
+ATOM   2318  N   ASN A 310     -19.928  -8.545  30.598  1.00 40.00           N  
+ATOM   2319  CA  ASN A 310     -20.834  -7.571  29.971  1.00 40.00           C  
+ATOM   2320  C   ASN A 310     -20.569  -6.108  30.408  1.00 40.00           C  
+ATOM   2321  O   ASN A 310     -20.638  -5.790  31.596  1.00 40.00           O  
+ATOM   2322  CB  ASN A 310     -22.298  -7.989  30.218  1.00 40.00           C  
+ATOM   2323  CG  ASN A 310     -22.550  -9.477  29.950  1.00 40.00           C  
+ATOM   2324  OD1 ASN A 310     -22.310  -9.986  28.847  1.00 40.00           O  
+ATOM   2325  ND2 ASN A 310     -23.048 -10.178  30.963  1.00 40.00           N  
+ATOM   2326  N   VAL A 311     -20.276  -5.232  29.441  1.00 40.00           N  
+ATOM   2327  CA  VAL A 311     -19.674  -3.910  29.698  1.00 40.00           C  
+ATOM   2328  C   VAL A 311     -20.449  -2.734  29.105  1.00 40.00           C  
+ATOM   2329  O   VAL A 311     -20.713  -2.683  27.917  1.00 40.00           O  
+ATOM   2330  CB  VAL A 311     -18.239  -3.851  29.132  1.00 40.00           C  
+ATOM   2331  CG1 VAL A 311     -17.594  -2.513  29.430  1.00 40.00           C  
+ATOM   2332  CG2 VAL A 311     -17.387  -4.978  29.689  1.00 40.00           C  
+ATOM   2333  N   GLU A 312     -20.760  -1.757  29.932  1.00 40.00           N  
+ATOM   2334  CA  GLU A 312     -21.562  -0.642  29.506  1.00 40.00           C  
+ATOM   2335  C   GLU A 312     -20.966   0.609  30.137  1.00 40.00           C  
+ATOM   2336  O   GLU A 312     -21.380   0.997  31.224  1.00 40.00           O  
+ATOM   2337  CB  GLU A 312     -22.976  -0.879  30.028  1.00 40.00           C  
+ATOM   2338  CG  GLU A 312     -24.017   0.174  29.690  1.00 40.00           C  
+ATOM   2339  CD  GLU A 312     -25.082  -0.356  28.756  1.00 40.00           C  
+ATOM   2340  OE1 GLU A 312     -24.693  -0.818  27.662  1.00 40.00           O  
+ATOM   2341  OE2 GLU A 312     -26.294  -0.316  29.114  1.00 40.00           O  
+ATOM   2342  N   VAL A 313     -19.977   1.231  29.498  1.00 40.00           N  
+ATOM   2343  CA  VAL A 313     -19.362   2.434  30.091  1.00 40.00           C  
+ATOM   2344  C   VAL A 313     -19.471   3.659  29.212  1.00 40.00           C  
+ATOM   2345  O   VAL A 313     -19.553   3.532  28.011  1.00 40.00           O  
+ATOM   2346  CB  VAL A 313     -17.887   2.230  30.497  1.00 40.00           C  
+ATOM   2347  CG1 VAL A 313     -17.780   1.254  31.663  1.00 40.00           C  
+ATOM   2348  CG2 VAL A 313     -17.043   1.778  29.318  1.00 40.00           C  
+ATOM   2349  N   TYR A 314     -19.471   4.843  29.820  1.00 40.00           N  
+ATOM   2350  CA  TYR A 314     -19.621   6.099  29.083  1.00 40.00           C  
+ATOM   2351  C   TYR A 314     -18.769   7.202  29.668  1.00 40.00           C  
+ATOM   2352  O   TYR A 314     -18.195   7.056  30.748  1.00 40.00           O  
+ATOM   2353  CB  TYR A 314     -21.079   6.553  29.038  1.00 40.00           C  
+ATOM   2354  CG  TYR A 314     -21.819   6.413  30.341  1.00 40.00           C  
+ATOM   2355  CD1 TYR A 314     -21.944   7.475  31.212  1.00 40.00           C  
+ATOM   2356  CD2 TYR A 314     -22.406   5.212  30.698  1.00 40.00           C  
+ATOM   2357  CE1 TYR A 314     -22.631   7.340  32.413  1.00 40.00           C  
+ATOM   2358  CE2 TYR A 314     -23.089   5.064  31.897  1.00 40.00           C  
+ATOM   2359  CZ  TYR A 314     -23.206   6.127  32.753  1.00 40.00           C  
+ATOM   2360  OH  TYR A 314     -23.903   5.960  33.936  1.00 40.00           O  
+ATOM   2361  OXT TYR A 314     -18.642   8.263  29.059  1.00 40.00           O  
+TER    2362      TYR A 314                                                      
+ATOM   2363  N   ALA B   1     -53.291 -14.159  81.934  1.00 40.00           N  
+ATOM   2364  CA  ALA B   1     -52.106 -13.577  81.238  1.00 40.00           C  
+ATOM   2365  C   ALA B   1     -51.069 -13.092  82.240  1.00 40.00           C  
+ATOM   2366  O   ALA B   1     -51.414 -12.674  83.342  1.00 40.00           O  
+ATOM   2367  CB  ALA B   1     -52.535 -12.439  80.327  1.00 40.00           C  
+ATOM   2368  N   THR B   2     -49.799 -13.152  81.850  1.00 40.00           N  
+ATOM   2369  CA  THR B   2     -48.690 -12.696  82.696  1.00 40.00           C  
+ATOM   2370  C   THR B   2     -47.816 -11.746  81.869  1.00 40.00           C  
+ATOM   2371  O   THR B   2     -47.528 -12.035  80.713  1.00 40.00           O  
+ATOM   2372  CB  THR B   2     -47.873 -13.900  83.257  1.00 40.00           C  
+ATOM   2373  OG1 THR B   2     -48.706 -14.689  84.122  1.00 40.00           O  
+ATOM   2374  CG2 THR B   2     -46.631 -13.451  84.045  1.00 40.00           C  
+ATOM   2375  N   TYR B   3     -47.415 -10.615  82.456  1.00 40.00           N  
+ATOM   2376  CA  TYR B   3     -46.621  -9.595  81.748  1.00 40.00           C  
+ATOM   2377  C   TYR B   3     -45.389  -9.150  82.549  1.00 40.00           C  
+ATOM   2378  O   TYR B   3     -45.362  -9.266  83.784  1.00 40.00           O  
+ATOM   2379  CB  TYR B   3     -47.468  -8.354  81.437  1.00 40.00           C  
+ATOM   2380  CG  TYR B   3     -48.872  -8.592  80.913  1.00 40.00           C  
+ATOM   2381  CD1 TYR B   3     -49.920  -8.921  81.780  1.00 40.00           C  
+ATOM   2382  CD2 TYR B   3     -49.165  -8.435  79.564  1.00 40.00           C  
+ATOM   2383  CE1 TYR B   3     -51.207  -9.116  81.313  1.00 40.00           C  
+ATOM   2384  CE2 TYR B   3     -50.454  -8.627  79.090  1.00 40.00           C  
+ATOM   2385  CZ  TYR B   3     -51.469  -8.966  79.974  1.00 40.00           C  
+ATOM   2386  OH  TYR B   3     -52.758  -9.163  79.537  1.00 40.00           O  
+ATOM   2387  N   ASN B   4     -44.382  -8.625  81.843  1.00 40.00           N  
+ATOM   2388  CA  ASN B   4     -43.164  -8.113  82.484  1.00 40.00           C  
+ATOM   2389  C   ASN B   4     -43.332  -6.746  83.138  1.00 40.00           C  
+ATOM   2390  O   ASN B   4     -43.884  -5.810  82.547  1.00 40.00           O  
+ATOM   2391  CB  ASN B   4     -41.967  -8.071  81.519  1.00 40.00           C  
+ATOM   2392  CG  ASN B   4     -40.730  -7.419  82.145  1.00 40.00           C  
+ATOM   2393  OD1 ASN B   4     -40.209  -7.886  83.170  1.00 40.00           O  
+ATOM   2394  ND2 ASN B   4     -40.260  -6.329  81.534  1.00 40.00           N  
+ATOM   2395  N   VAL B   5     -42.831  -6.649  84.367  1.00 40.00           N  
+ATOM   2396  CA  VAL B   5     -42.800  -5.390  85.098  1.00 40.00           C  
+ATOM   2397  C   VAL B   5     -41.394  -5.073  85.574  1.00 40.00           C  
+ATOM   2398  O   VAL B   5     -40.709  -5.913  86.165  1.00 40.00           O  
+ATOM   2399  CB  VAL B   5     -43.747  -5.378  86.310  1.00 40.00           C  
+ATOM   2400  CG1 VAL B   5     -43.828  -3.968  86.876  1.00 40.00           C  
+ATOM   2401  CG2 VAL B   5     -45.135  -5.889  85.927  1.00 40.00           C  
+ATOM   2402  N   LYS B   6     -40.995  -3.839  85.305  1.00 40.00           N  
+ATOM   2403  CA  LYS B   6     -39.669  -3.343  85.612  1.00 40.00           C  
+ATOM   2404  C   LYS B   6     -39.817  -2.233  86.647  1.00 40.00           C  
+ATOM   2405  O   LYS B   6     -40.451  -1.210  86.383  1.00 40.00           O  
+ATOM   2406  CB  LYS B   6     -39.025  -2.818  84.324  1.00 40.00           C  
+ATOM   2407  CG  LYS B   6     -37.626  -2.237  84.463  1.00 40.00           C  
+ATOM   2408  CD  LYS B   6     -37.094  -1.703  83.132  1.00 40.00           C  
+ATOM   2409  CE  LYS B   6     -36.805  -2.811  82.123  1.00 40.00           C  
+ATOM   2410  NZ  LYS B   6     -35.913  -2.359  81.016  1.00 40.00           N  
+ATOM   2411  N   LEU B   7     -39.244  -2.441  87.827  1.00 40.00           N  
+ATOM   2412  CA  LEU B   7     -39.395  -1.482  88.903  1.00 40.00           C  
+ATOM   2413  C   LEU B   7     -38.138  -0.714  89.101  1.00 40.00           C  
+ATOM   2414  O   LEU B   7     -37.073  -1.294  89.283  1.00 40.00           O  
+ATOM   2415  CB  LEU B   7     -39.777  -2.172  90.199  1.00 40.00           C  
+ATOM   2416  CG  LEU B   7     -41.164  -2.805  90.153  1.00 40.00           C  
+ATOM   2417  CD1 LEU B   7     -41.447  -3.576  91.437  1.00 40.00           C  
+ATOM   2418  CD2 LEU B   7     -42.225  -1.744  89.896  1.00 40.00           C  
+ATOM   2419  N   ILE B   8     -38.280   0.604  89.057  1.00 40.00           N  
+ATOM   2420  CA  ILE B   8     -37.173   1.519  89.306  1.00 40.00           C  
+ATOM   2421  C   ILE B   8     -37.271   2.090  90.730  1.00 40.00           C  
+ATOM   2422  O   ILE B   8     -37.755   3.216  90.945  1.00 40.00           O  
+ATOM   2423  CB  ILE B   8     -37.091   2.621  88.231  1.00 40.00           C  
+ATOM   2424  CG1 ILE B   8     -37.457   2.024  86.867  1.00 40.00           C  
+ATOM   2425  CG2 ILE B   8     -35.693   3.229  88.217  1.00 40.00           C  
+ATOM   2426  CD1 ILE B   8     -38.366   2.888  86.025  1.00 40.00           C  
+ATOM   2427  N   THR B   9     -36.822   1.271  91.691  1.00 40.00           N  
+ATOM   2428  CA  THR B   9     -36.771   1.620  93.114  1.00 40.00           C  
+ATOM   2429  C   THR B   9     -35.679   2.687  93.308  1.00 40.00           C  
+ATOM   2430  O   THR B   9     -34.882   2.915  92.387  1.00 40.00           O  
+ATOM   2431  CB  THR B   9     -36.547   0.359  94.011  1.00 40.00           C  
+ATOM   2432  OG1 THR B   9     -35.149   0.079  94.170  1.00 40.00           O  
+ATOM   2433  CG2 THR B   9     -37.244  -0.870  93.421  1.00 40.00           C  
+ATOM   2434  N   PRO B  10     -35.640   3.359  94.482  1.00 40.00           N  
+ATOM   2435  CA  PRO B  10     -34.550   4.320  94.721  1.00 40.00           C  
+ATOM   2436  C   PRO B  10     -33.225   3.583  94.929  1.00 40.00           C  
+ATOM   2437  O   PRO B  10     -32.163   4.199  95.046  1.00 40.00           O  
+ATOM   2438  CB  PRO B  10     -34.974   5.029  96.015  1.00 40.00           C  
+ATOM   2439  CG  PRO B  10     -36.379   4.606  96.270  1.00 40.00           C  
+ATOM   2440  CD  PRO B  10     -36.520   3.254  95.654  1.00 40.00           C  
+ATOM   2441  N   GLU B  11     -33.316   2.258  94.969  1.00 40.00           N  
+ATOM   2442  CA  GLU B  11     -32.167   1.388  95.091  1.00 40.00           C  
+ATOM   2443  C   GLU B  11     -32.037   0.467  93.870  1.00 40.00           C  
+ATOM   2444  O   GLU B  11     -31.719  -0.727  93.991  1.00 40.00           O  
+ATOM   2445  CB  GLU B  11     -32.288   0.579  96.370  1.00 40.00           C  
+ATOM   2446  CG  GLU B  11     -32.489   1.441  97.598  1.00 40.00           C  
+ATOM   2447  CD  GLU B  11     -32.233   0.668  98.867  1.00 40.00           C  
+ATOM   2448  OE1 GLU B  11     -32.989  -0.288  99.140  1.00 40.00           O  
+ATOM   2449  OE2 GLU B  11     -31.270   1.010  99.586  1.00 40.00           O  
+ATOM   2450  N   GLY B  12     -32.297   1.037  92.694  1.00 40.00           N  
+ATOM   2451  CA  GLY B  12     -32.036   0.361  91.432  1.00 40.00           C  
+ATOM   2452  C   GLY B  12     -33.216  -0.383  90.858  1.00 40.00           C  
+ATOM   2453  O   GLY B  12     -34.280  -0.484  91.484  1.00 40.00           O  
+ATOM   2454  N   GLU B  13     -32.990  -0.919  89.662  1.00 40.00           N  
+ATOM   2455  CA  GLU B  13     -34.008  -1.581  88.856  1.00 40.00           C  
+ATOM   2456  C   GLU B  13     -34.140  -3.063  89.241  1.00 40.00           C  
+ATOM   2457  O   GLU B  13     -33.197  -3.658  89.771  1.00 40.00           O  
+ATOM   2458  CB  GLU B  13     -33.635  -1.411  87.379  1.00 40.00           C  
+ATOM   2459  CG  GLU B  13     -34.758  -1.590  86.382  1.00 40.00           C  
+ATOM   2460  CD  GLU B  13     -34.220  -1.770  84.979  1.00 40.00           C  
+ATOM   2461  OE1 GLU B  13     -34.314  -2.901  84.452  1.00 40.00           O  
+ATOM   2462  OE2 GLU B  13     -33.683  -0.790  84.418  1.00 40.00           O  
+ATOM   2463  N   VAL B  14     -35.323  -3.631  89.004  1.00 40.00           N  
+ATOM   2464  CA  VAL B  14     -35.569  -5.071  89.164  1.00 40.00           C  
+ATOM   2465  C   VAL B  14     -36.873  -5.478  88.460  1.00 40.00           C  
+ATOM   2466  O   VAL B  14     -37.894  -4.806  88.585  1.00 40.00           O  
+ATOM   2467  CB  VAL B  14     -35.527  -5.534  90.653  1.00 40.00           C  
+ATOM   2468  CG1 VAL B  14     -36.541  -4.785  91.514  1.00 40.00           C  
+ATOM   2469  CG2 VAL B  14     -35.688  -7.049  90.771  1.00 40.00           C  
+ATOM   2470  N   GLU B  15     -36.821  -6.570  87.703  1.00 40.00           N  
+ATOM   2471  CA  GLU B  15     -37.971  -7.037  86.922  1.00 40.00           C  
+ATOM   2472  C   GLU B  15     -38.583  -8.301  87.511  1.00 40.00           C  
+ATOM   2473  O   GLU B  15     -37.996  -8.937  88.391  1.00 40.00           O  
+ATOM   2474  CB  GLU B  15     -37.589  -7.256  85.454  1.00 40.00           C  
+ATOM   2475  CG  GLU B  15     -37.021  -6.013  84.780  1.00 40.00           C  
+ATOM   2476  CD  GLU B  15     -36.490  -6.278  83.382  1.00 40.00           C  
+ATOM   2477  OE1 GLU B  15     -35.323  -5.908  83.105  1.00 40.00           O  
+ATOM   2478  OE2 GLU B  15     -37.239  -6.858  82.563  1.00 40.00           O  
+ATOM   2479  N   LEU B  16     -39.773  -8.645  87.025  1.00 40.00           N  
+ATOM   2480  CA  LEU B  16     -40.571  -9.736  87.586  1.00 40.00           C  
+ATOM   2481  C   LEU B  16     -41.869  -9.946  86.818  1.00 40.00           C  
+ATOM   2482  O   LEU B  16     -42.302  -9.087  86.054  1.00 40.00           O  
+ATOM   2483  CB  LEU B  16     -40.907  -9.475  89.050  1.00 40.00           C  
+ATOM   2484  CG  LEU B  16     -41.741  -8.218  89.287  1.00 40.00           C  
+ATOM   2485  CD1 LEU B  16     -42.715  -8.439  90.428  1.00 40.00           C  
+ATOM   2486  CD2 LEU B  16     -40.852  -7.006  89.547  1.00 40.00           C  
+ATOM   2487  N   GLN B  17     -42.500 -11.089  87.060  1.00 40.00           N  
+ATOM   2488  CA  GLN B  17     -43.656 -11.522  86.279  1.00 40.00           C  
+ATOM   2489  C   GLN B  17     -44.938 -11.455  87.089  1.00 40.00           C  
+ATOM   2490  O   GLN B  17     -45.044 -12.076  88.148  1.00 40.00           O  
+ATOM   2491  CB  GLN B  17     -43.439 -12.948  85.745  1.00 40.00           C  
+ATOM   2492  CG  GLN B  17     -42.303 -13.069  84.733  1.00 40.00           C  
+ATOM   2493  CD  GLN B  17     -42.375 -12.015  83.633  1.00 40.00           C  
+ATOM   2494  OE1 GLN B  17     -41.444 -11.226  83.450  1.00 40.00           O  
+ATOM   2495  NE2 GLN B  17     -43.490 -11.993  82.901  1.00 40.00           N  
+ATOM   2496  N   VAL B  18     -45.914 -10.707  86.585  1.00 40.00           N  
+ATOM   2497  CA  VAL B  18     -47.151 -10.507  87.333  1.00 40.00           C  
+ATOM   2498  C   VAL B  18     -48.420 -10.876  86.580  1.00 40.00           C  
+ATOM   2499  O   VAL B  18     -48.741 -10.271  85.549  1.00 40.00           O  
+ATOM   2500  CB  VAL B  18     -47.303  -9.065  87.838  1.00 40.00           C  
+ATOM   2501  CG1 VAL B  18     -48.354  -9.017  88.947  1.00 40.00           C  
+ATOM   2502  CG2 VAL B  18     -45.963  -8.520  88.318  1.00 40.00           C  
+ATOM   2503  N   PRO B  19     -49.154 -11.867  87.111  1.00 40.00           N  
+ATOM   2504  CA  PRO B  19     -50.457 -12.258  86.585  1.00 40.00           C  
+ATOM   2505  C   PRO B  19     -51.437 -11.091  86.617  1.00 40.00           C  
+ATOM   2506  O   PRO B  19     -51.528 -10.413  87.639  1.00 40.00           O  
+ATOM   2507  CB  PRO B  19     -50.897 -13.364  87.551  1.00 40.00           C  
+ATOM   2508  CG  PRO B  19     -49.618 -13.959  88.038  1.00 40.00           C  
+ATOM   2509  CD  PRO B  19     -48.689 -12.788  88.168  1.00 40.00           C  
+ATOM   2510  N   ASP B  20     -52.153 -10.875  85.506  1.00 40.00           N  
+ATOM   2511  CA  ASP B  20     -53.104  -9.750  85.347  1.00 40.00           C  
+ATOM   2512  C   ASP B  20     -54.350  -9.792  86.256  1.00 40.00           C  
+ATOM   2513  O   ASP B  20     -55.247  -8.947  86.131  1.00 40.00           O  
+ATOM   2514  CB  ASP B  20     -53.492  -9.524  83.859  1.00 40.00           C  
+ATOM   2515  CG  ASP B  20     -54.532 -10.535  83.323  1.00 40.00           C  
+ATOM   2516  OD1 ASP B  20     -54.851 -10.458  82.106  1.00 40.00           O  
+ATOM   2517  OD2 ASP B  20     -55.033 -11.391  84.093  1.00 40.00           O  
+ATOM   2518  N   ASP B  21     -54.386 -10.777  87.156  1.00 40.00           N  
+ATOM   2519  CA  ASP B  21     -55.429 -10.904  88.175  1.00 40.00           C  
+ATOM   2520  C   ASP B  21     -54.848 -10.740  89.583  1.00 40.00           C  
+ATOM   2521  O   ASP B  21     -55.563 -10.873  90.583  1.00 40.00           O  
+ATOM   2522  CB  ASP B  21     -56.128 -12.257  88.055  1.00 40.00           C  
+ATOM   2523  CG  ASP B  21     -55.154 -13.404  87.801  1.00 40.00           C  
+ATOM   2524  OD1 ASP B  21     -53.933 -13.251  88.036  1.00 40.00           O  
+ATOM   2525  OD2 ASP B  21     -55.615 -14.472  87.352  1.00 40.00           O  
+ATOM   2526  N   VAL B  22     -53.548 -10.449  89.643  1.00 40.00           N  
+ATOM   2527  CA  VAL B  22     -52.842 -10.206  90.900  1.00 40.00           C  
+ATOM   2528  C   VAL B  22     -52.370  -8.749  90.938  1.00 40.00           C  
+ATOM   2529  O   VAL B  22     -51.800  -8.251  89.961  1.00 40.00           O  
+ATOM   2530  CB  VAL B  22     -51.640 -11.179  91.062  1.00 40.00           C  
+ATOM   2531  CG1 VAL B  22     -50.811 -10.856  92.306  1.00 40.00           C  
+ATOM   2532  CG2 VAL B  22     -52.118 -12.627  91.103  1.00 40.00           C  
+ATOM   2533  N   TYR B  23     -52.630  -8.073  92.059  1.00 40.00           N  
+ATOM   2534  CA  TYR B  23     -52.105  -6.731  92.301  1.00 40.00           C  
+ATOM   2535  C   TYR B  23     -50.579  -6.719  92.270  1.00 40.00           C  
+ATOM   2536  O   TYR B  23     -49.926  -7.702  92.647  1.00 40.00           O  
+ATOM   2537  CB  TYR B  23     -52.572  -6.210  93.649  1.00 40.00           C  
+ATOM   2538  CG  TYR B  23     -54.047  -5.929  93.750  1.00 40.00           C  
+ATOM   2539  CD1 TYR B  23     -54.864  -6.674  94.605  1.00 40.00           C  
+ATOM   2540  CD2 TYR B  23     -54.631  -4.906  93.011  1.00 40.00           C  
+ATOM   2541  CE1 TYR B  23     -56.224  -6.404  94.718  1.00 40.00           C  
+ATOM   2542  CE2 TYR B  23     -55.990  -4.632  93.110  1.00 40.00           C  
+ATOM   2543  CZ  TYR B  23     -56.784  -5.378  93.966  1.00 40.00           C  
+ATOM   2544  OH  TYR B  23     -58.133  -5.095  94.060  1.00 40.00           O  
+ATOM   2545  N   ILE B  24     -50.015  -5.593  91.839  1.00 40.00           N  
+ATOM   2546  CA  ILE B  24     -48.579  -5.498  91.589  1.00 40.00           C  
+ATOM   2547  C   ILE B  24     -47.747  -5.671  92.847  1.00 40.00           C  
+ATOM   2548  O   ILE B  24     -46.802  -6.457  92.871  1.00 40.00           O  
+ATOM   2549  CB  ILE B  24     -48.221  -4.176  90.903  1.00 40.00           C  
+ATOM   2550  CG1 ILE B  24     -48.733  -4.196  89.477  1.00 40.00           C  
+ATOM   2551  CG2 ILE B  24     -46.720  -3.994  90.855  1.00 40.00           C  
+ATOM   2552  CD1 ILE B  24     -48.951  -2.828  88.881  1.00 40.00           C  
+ATOM   2553  N   LEU B  25     -48.117  -4.932  93.886  1.00 40.00           N  
+ATOM   2554  CA  LEU B  25     -47.412  -4.939  95.166  1.00 40.00           C  
+ATOM   2555  C   LEU B  25     -47.416  -6.321  95.823  1.00 40.00           C  
+ATOM   2556  O   LEU B  25     -46.398  -6.747  96.385  1.00 40.00           O  
+ATOM   2557  CB  LEU B  25     -48.027  -3.896  96.104  1.00 40.00           C  
+ATOM   2558  CG  LEU B  25     -47.376  -3.610  97.455  1.00 40.00           C  
+ATOM   2559  CD1 LEU B  25     -46.174  -2.689  97.310  1.00 40.00           C  
+ATOM   2560  CD2 LEU B  25     -48.415  -2.996  98.378  1.00 40.00           C  
+ATOM   2561  N   ASP B  26     -48.557  -7.008  95.745  1.00 40.00           N  
+ATOM   2562  CA  ASP B  26     -48.681  -8.387  96.208  1.00 40.00           C  
+ATOM   2563  C   ASP B  26     -47.572  -9.258  95.659  1.00 40.00           C  
+ATOM   2564  O   ASP B  26     -46.868  -9.932  96.417  1.00 40.00           O  
+ATOM   2565  CB  ASP B  26     -50.022  -8.953  95.790  1.00 40.00           C  
+ATOM   2566  CG  ASP B  26     -51.158  -8.223  96.424  1.00 40.00           C  
+ATOM   2567  OD1 ASP B  26     -50.891  -7.377  97.298  1.00 40.00           O  
+ATOM   2568  OD2 ASP B  26     -52.311  -8.486  96.047  1.00 40.00           O  
+ATOM   2569  N   GLN B  27     -47.415  -9.224  94.339  1.00 40.00           N  
+ATOM   2570  CA  GLN B  27     -46.324  -9.919  93.677  1.00 40.00           C  
+ATOM   2571  C   GLN B  27     -44.939  -9.535  94.252  1.00 40.00           C  
+ATOM   2572  O   GLN B  27     -44.220 -10.401  94.777  1.00 40.00           O  
+ATOM   2573  CB  GLN B  27     -46.396  -9.683  92.162  1.00 40.00           C  
+ATOM   2574  CG  GLN B  27     -45.584 -10.675  91.344  1.00 40.00           C  
+ATOM   2575  CD  GLN B  27     -46.015 -12.104  91.588  1.00 40.00           C  
+ATOM   2576  OE1 GLN B  27     -47.193 -12.437  91.453  1.00 40.00           O  
+ATOM   2577  NE2 GLN B  27     -45.066 -12.957  91.960  1.00 40.00           N  
+ATOM   2578  N   ALA B  28     -44.597  -8.241  94.176  1.00 40.00           N  
+ATOM   2579  CA  ALA B  28     -43.285  -7.715  94.595  1.00 40.00           C  
+ATOM   2580  C   ALA B  28     -42.860  -8.244  95.952  1.00 40.00           C  
+ATOM   2581  O   ALA B  28     -41.702  -8.605  96.161  1.00 40.00           O  
+ATOM   2582  CB  ALA B  28     -43.304  -6.200  94.614  1.00 40.00           C  
+ATOM   2583  N   GLU B  29     -43.828  -8.302  96.857  1.00 40.00           N  
+ATOM   2584  CA  GLU B  29     -43.632  -8.814  98.204  1.00 40.00           C  
+ATOM   2585  C   GLU B  29     -43.206 -10.302  98.235  1.00 40.00           C  
+ATOM   2586  O   GLU B  29     -42.186 -10.626  98.849  1.00 40.00           O  
+ATOM   2587  CB  GLU B  29     -44.906  -8.571  99.011  1.00 40.00           C  
+ATOM   2588  CG  GLU B  29     -44.782  -8.712 100.514  1.00 40.00           C  
+ATOM   2589  CD  GLU B  29     -46.145  -8.837 101.155  1.00 40.00           C  
+ATOM   2590  OE1 GLU B  29     -47.150  -8.623 100.449  1.00 40.00           O  
+ATOM   2591  OE2 GLU B  29     -46.219  -9.153 102.356  1.00 40.00           O  
+ATOM   2592  N   GLU B  30     -43.964 -11.189  97.576  1.00 40.00           N  
+ATOM   2593  CA  GLU B  30     -43.621 -12.625  97.537  1.00 40.00           C  
+ATOM   2594  C   GLU B  30     -42.341 -12.829  96.794  1.00 40.00           C  
+ATOM   2595  O   GLU B  30     -41.678 -13.853  96.954  1.00 40.00           O  
+ATOM   2596  CB  GLU B  30     -44.655 -13.445  96.800  1.00 40.00           C  
+ATOM   2597  CG  GLU B  30     -45.945 -13.677  97.541  1.00 40.00           C  
+ATOM   2598  CD  GLU B  30     -47.013 -14.147  96.584  1.00 40.00           C  
+ATOM   2599  OE1 GLU B  30     -46.699 -15.067  95.788  1.00 40.00           O  
+ATOM   2600  OE2 GLU B  30     -48.141 -13.589  96.611  1.00 40.00           O  
+ATOM   2601  N   ASP B  31     -42.030 -11.861  95.944  1.00 40.00           N  
+ATOM   2602  CA  ASP B  31     -40.783 -11.861  95.221  1.00 40.00           C  
+ATOM   2603  C   ASP B  31     -39.734 -11.101  96.003  1.00 40.00           C  
+ATOM   2604  O   ASP B  31     -38.678 -10.767  95.476  1.00 40.00           O  
+ATOM   2605  CB  ASP B  31     -40.975 -11.298  93.816  1.00 40.00           C  
+ATOM   2606  CG  ASP B  31     -41.769 -12.247  92.912  1.00 40.00           C  
+ATOM   2607  OD1 ASP B  31     -42.290 -13.277  93.423  1.00 40.00           O  
+ATOM   2608  OD2 ASP B  31     -41.872 -11.964  91.690  1.00 40.00           O  
+ATOM   2609  N   GLY B  32     -40.042 -10.838  97.269  1.00 40.00           N  
+ATOM   2610  CA  GLY B  32     -39.059 -10.364  98.233  1.00 40.00           C  
+ATOM   2611  C   GLY B  32     -38.613  -8.932  98.066  1.00 40.00           C  
+ATOM   2612  O   GLY B  32     -37.513  -8.572  98.493  1.00 40.00           O  
+ATOM   2613  N   ILE B  33     -39.466  -8.115  97.452  1.00 40.00           N  
+ATOM   2614  CA  ILE B  33     -39.151  -6.708  97.222  1.00 40.00           C  
+ATOM   2615  C   ILE B  33     -39.905  -5.807  98.195  1.00 40.00           C  
+ATOM   2616  O   ILE B  33     -41.122  -5.951  98.391  1.00 40.00           O  
+ATOM   2617  CB  ILE B  33     -39.420  -6.274  95.768  1.00 40.00           C  
+ATOM   2618  CG1 ILE B  33     -38.961  -7.357  94.789  1.00 40.00           C  
+ATOM   2619  CG2 ILE B  33     -38.694  -4.968  95.473  1.00 40.00           C  
+ATOM   2620  CD1 ILE B  33     -39.755  -7.404  93.498  1.00 40.00           C  
+ATOM   2621  N   ASP B  34     -39.150  -4.888  98.797  1.00 40.00           N  
+ATOM   2622  CA  ASP B  34     -39.662  -3.966  99.801  1.00 40.00           C  
+ATOM   2623  C   ASP B  34     -40.100  -2.634  99.160  1.00 40.00           C  
+ATOM   2624  O   ASP B  34     -39.283  -1.744  98.864  1.00 40.00           O  
+ATOM   2625  CB  ASP B  34     -38.617  -3.770 100.921  1.00 40.00           C  
+ATOM   2626  CG  ASP B  34     -39.196  -3.111 102.192  1.00 40.00           C  
+ATOM   2627  OD1 ASP B  34     -40.444  -3.043 102.348  1.00 40.00           O  
+ATOM   2628  OD2 ASP B  34     -38.385  -2.663 103.046  1.00 40.00           O  
+ATOM   2629  N   LEU B  35     -41.410  -2.530  98.942  1.00 40.00           N  
+ATOM   2630  CA  LEU B  35     -42.039  -1.341  98.380  1.00 40.00           C  
+ATOM   2631  C   LEU B  35     -42.942  -0.709  99.418  1.00 40.00           C  
+ATOM   2632  O   LEU B  35     -43.597  -1.427 100.179  1.00 40.00           O  
+ATOM   2633  CB  LEU B  35     -42.890  -1.709  97.172  1.00 40.00           C  
+ATOM   2634  CG  LEU B  35     -42.232  -2.483  96.042  1.00 40.00           C  
+ATOM   2635  CD1 LEU B  35     -43.293  -2.924  95.052  1.00 40.00           C  
+ATOM   2636  CD2 LEU B  35     -41.174  -1.617  95.377  1.00 40.00           C  
+ATOM   2637  N   PRO B  36     -43.009   0.635  99.438  1.00 40.00           N  
+ATOM   2638  CA  PRO B  36     -43.776   1.316 100.485  1.00 40.00           C  
+ATOM   2639  C   PRO B  36     -45.285   1.047 100.366  1.00 40.00           C  
+ATOM   2640  O   PRO B  36     -45.777   0.865  99.251  1.00 40.00           O  
+ATOM   2641  CB  PRO B  36     -43.454   2.798 100.242  1.00 40.00           C  
+ATOM   2642  CG  PRO B  36     -43.158   2.881  98.782  1.00 40.00           C  
+ATOM   2643  CD  PRO B  36     -42.488   1.580  98.430  1.00 40.00           C  
+ATOM   2644  N   TYR B  37     -45.982   0.998 101.512  1.00 40.00           N  
+ATOM   2645  CA  TYR B  37     -47.441   0.776 101.588  1.00 40.00           C  
+ATOM   2646  C   TYR B  37     -48.046   1.211 102.913  1.00 40.00           C  
+ATOM   2647  O   TYR B  37     -47.326   1.506 103.845  1.00 40.00           O  
+ATOM   2648  CB  TYR B  37     -47.817  -0.689 101.297  1.00 40.00           C  
+ATOM   2649  CG  TYR B  37     -47.342  -1.774 102.272  1.00 40.00           C  
+ATOM   2650  CD1 TYR B  37     -46.012  -2.208 102.285  1.00 40.00           C  
+ATOM   2651  CD2 TYR B  37     -48.243  -2.419 103.120  1.00 40.00           C  
+ATOM   2652  CE1 TYR B  37     -45.597  -3.216 103.140  1.00 40.00           C  
+ATOM   2653  CE2 TYR B  37     -47.834  -3.429 103.971  1.00 40.00           C  
+ATOM   2654  CZ  TYR B  37     -46.515  -3.817 103.973  1.00 40.00           C  
+ATOM   2655  OH  TYR B  37     -46.110  -4.806 104.819  1.00 40.00           O  
+ATOM   2656  N   SER B  38     -49.372   1.265 102.979  1.00 40.00           N  
+ATOM   2657  CA  SER B  38     -50.075   1.532 104.225  1.00 40.00           C  
+ATOM   2658  C   SER B  38     -51.425   0.825 104.285  1.00 40.00           C  
+ATOM   2659  O   SER B  38     -51.560  -0.212 104.937  1.00 40.00           O  
+ATOM   2660  CB  SER B  38     -50.269   3.028 104.435  1.00 40.00           C  
+ATOM   2661  OG  SER B  38     -50.794   3.262 105.728  1.00 40.00           O  
+ATOM   2662  N   CYS B  39     -52.413   1.393 103.593  1.00 40.00           N  
+ATOM   2663  CA  CYS B  39     -53.800   0.917 103.621  1.00 40.00           C  
+ATOM   2664  C   CYS B  39     -53.963  -0.458 102.981  1.00 40.00           C  
+ATOM   2665  O   CYS B  39     -54.596  -1.359 103.552  1.00 40.00           O  
+ATOM   2666  CB  CYS B  39     -54.707   1.920 102.899  1.00 40.00           C  
+ATOM   2667  SG  CYS B  39     -54.499   1.939 101.101  1.00 40.00           S  
+ATOM   2668  N   ARG B  40     -53.382  -0.592 101.788  1.00 40.00           N  
+ATOM   2669  CA  ARG B  40     -53.546  -1.759 100.921  1.00 40.00           C  
+ATOM   2670  C   ARG B  40     -55.000  -1.941 100.498  1.00 40.00           C  
+ATOM   2671  O   ARG B  40     -55.512  -3.053 100.410  1.00 40.00           O  
+ATOM   2672  CB  ARG B  40     -52.964  -3.008 101.573  1.00 40.00           C  
+ATOM   2673  CG  ARG B  40     -51.452  -2.942 101.679  1.00 40.00           C  
+ATOM   2674  CD  ARG B  40     -50.910  -4.052 102.552  1.00 40.00           C  
+ATOM   2675  NE  ARG B  40     -51.013  -5.348 101.896  1.00 40.00           N  
+ATOM   2676  CZ  ARG B  40     -50.055  -5.890 101.150  1.00 40.00           C  
+ATOM   2677  NH1 ARG B  40     -48.909  -5.250 100.962  1.00 40.00           N  
+ATOM   2678  NH2 ARG B  40     -50.243  -7.077 100.593  1.00 40.00           N  
+ATOM   2679  N   ALA B  41     -55.654  -0.817 100.242  1.00 40.00           N  
+ATOM   2680  CA  ALA B  41     -57.024  -0.806  99.756  1.00 40.00           C  
+ATOM   2681  C   ALA B  41     -57.257   0.442  98.916  1.00 40.00           C  
+ATOM   2682  O   ALA B  41     -58.393   0.873  98.692  1.00 40.00           O  
+ATOM   2683  CB  ALA B  41     -58.013  -0.902 100.902  1.00 40.00           C  
+ATOM   2684  N   GLY B  42     -56.150   1.021  98.465  1.00 40.00           N  
+ATOM   2685  CA  GLY B  42     -56.171   1.959  97.355  1.00 40.00           C  
+ATOM   2686  C   GLY B  42     -56.852   3.277  97.621  1.00 40.00           C  
+ATOM   2687  O   GLY B  42     -57.432   3.875  96.719  1.00 40.00           O  
+ATOM   2688  N   SER B  43     -56.792   3.734  98.861  1.00 40.00           N  
+ATOM   2689  CA  SER B  43     -57.242   5.077  99.158  1.00 40.00           C  
+ATOM   2690  C   SER B  43     -56.235   5.797 100.032  1.00 40.00           C  
+ATOM   2691  O   SER B  43     -56.621   6.514 100.939  1.00 40.00           O  
+ATOM   2692  CB  SER B  43     -58.644   5.070  99.788  1.00 40.00           C  
+ATOM   2693  OG  SER B  43     -58.642   4.519 101.092  1.00 40.00           O  
+ATOM   2694  N   CYS B  44     -54.948   5.591  99.763  1.00 40.00           N  
+ATOM   2695  CA  CYS B  44     -53.889   6.330 100.446  1.00 40.00           C  
+ATOM   2696  C   CYS B  44     -52.771   6.656  99.469  1.00 40.00           C  
+ATOM   2697  O   CYS B  44     -52.956   6.518  98.273  1.00 40.00           O  
+ATOM   2698  CB  CYS B  44     -53.371   5.569 101.663  1.00 40.00           C  
+ATOM   2699  SG  CYS B  44     -51.997   4.467 101.318  1.00 40.00           S  
+ATOM   2700  N   SER B  45     -51.617   7.080  99.970  1.00 40.00           N  
+ATOM   2701  CA  SER B  45     -50.556   7.583  99.102  1.00 40.00           C  
+ATOM   2702  C   SER B  45     -49.225   6.835  99.209  1.00 40.00           C  
+ATOM   2703  O   SER B  45     -48.283   7.137  98.469  1.00 40.00           O  
+ATOM   2704  CB  SER B  45     -50.326   9.063  99.389  1.00 40.00           C  
+ATOM   2705  OG  SER B  45     -49.974   9.247 100.749  1.00 40.00           O  
+ATOM   2706  N   SER B  46     -49.149   5.863 100.116  1.00 40.00           N  
+ATOM   2707  CA  SER B  46     -47.866   5.238 100.490  1.00 40.00           C  
+ATOM   2708  C   SER B  46     -47.192   4.505  99.341  1.00 40.00           C  
+ATOM   2709  O   SER B  46     -45.993   4.674  99.089  1.00 40.00           O  
+ATOM   2710  CB  SER B  46     -48.044   4.290 101.681  1.00 40.00           C  
+ATOM   2711  OG  SER B  46     -48.247   5.008 102.885  1.00 40.00           O  
+ATOM   2712  N   CYS B  47     -47.992   3.717  98.636  1.00 40.00           N  
+ATOM   2713  CA  CYS B  47     -47.511   2.845  97.579  1.00 40.00           C  
+ATOM   2714  C   CYS B  47     -47.249   3.577  96.267  1.00 40.00           C  
+ATOM   2715  O   CYS B  47     -46.905   2.962  95.257  1.00 40.00           O  
+ATOM   2716  CB  CYS B  47     -48.520   1.725  97.372  1.00 40.00           C  
+ATOM   2717  SG  CYS B  47     -50.226   2.302  97.364  1.00 40.00           S  
+ATOM   2718  N   ALA B  48     -47.386   4.895  96.305  1.00 40.00           N  
+ATOM   2719  CA  ALA B  48     -47.285   5.729  95.124  1.00 40.00           C  
+ATOM   2720  C   ALA B  48     -46.130   5.394  94.200  1.00 40.00           C  
+ATOM   2721  O   ALA B  48     -45.009   5.074  94.628  1.00 40.00           O  
+ATOM   2722  CB  ALA B  48     -47.223   7.190  95.518  1.00 40.00           C  
+ATOM   2723  N   GLY B  49     -46.444   5.497  92.918  1.00 40.00           N  
+ATOM   2724  CA  GLY B  49     -45.484   5.319  91.860  1.00 40.00           C  
+ATOM   2725  C   GLY B  49     -45.930   5.983  90.574  1.00 40.00           C  
+ATOM   2726  O   GLY B  49     -47.069   6.446  90.453  1.00 40.00           O  
+ATOM   2727  N   LYS B  50     -45.023   6.011  89.605  1.00 40.00           N  
+ATOM   2728  CA  LYS B  50     -45.265   6.687  88.348  1.00 40.00           C  
+ATOM   2729  C   LYS B  50     -45.053   5.756  87.174  1.00 40.00           C  
+ATOM   2730  O   LYS B  50     -44.003   5.118  87.063  1.00 40.00           O  
+ATOM   2731  CB  LYS B  50     -44.340   7.894  88.207  1.00 40.00           C  
+ATOM   2732  CG  LYS B  50     -44.715   9.077  89.083  1.00 40.00           C  
+ATOM   2733  CD  LYS B  50     -44.402  10.393  88.395  1.00 40.00           C  
+ATOM   2734  CE  LYS B  50     -45.443  10.704  87.343  1.00 40.00           C  
+ATOM   2735  NZ  LYS B  50     -44.982  11.862  86.547  1.00 40.00           N  
+ATOM   2736  N   VAL B  51     -46.048   5.701  86.293  1.00 40.00           N  
+ATOM   2737  CA  VAL B  51     -45.951   4.910  85.078  1.00 40.00           C  
+ATOM   2738  C   VAL B  51     -45.055   5.596  84.078  1.00 40.00           C  
+ATOM   2739  O   VAL B  51     -45.300   6.734  83.686  1.00 40.00           O  
+ATOM   2740  CB  VAL B  51     -47.317   4.677  84.426  1.00 40.00           C  
+ATOM   2741  CG1 VAL B  51     -47.169   3.906  83.118  1.00 40.00           C  
+ATOM   2742  CG2 VAL B  51     -48.209   3.907  85.375  1.00 40.00           C  
+ATOM   2743  N   VAL B  52     -44.014   4.876  83.678  1.00 40.00           N  
+ATOM   2744  CA  VAL B  52     -43.097   5.312  82.635  1.00 40.00           C  
+ATOM   2745  C   VAL B  52     -43.600   4.842  81.260  1.00 40.00           C  
+ATOM   2746  O   VAL B  52     -43.571   5.601  80.283  1.00 40.00           O  
+ATOM   2747  CB  VAL B  52     -41.673   4.776  82.898  1.00 40.00           C  
+ATOM   2748  CG1 VAL B  52     -40.694   5.304  81.856  1.00 40.00           C  
+ATOM   2749  CG2 VAL B  52     -41.214   5.144  84.302  1.00 40.00           C  
+ATOM   2750  N   SER B  53     -44.065   3.593  81.202  1.00 40.00           N  
+ATOM   2751  CA  SER B  53     -44.579   2.986  79.974  1.00 40.00           C  
+ATOM   2752  C   SER B  53     -45.525   1.850  80.337  1.00 40.00           C  
+ATOM   2753  O   SER B  53     -45.565   1.422  81.490  1.00 40.00           O  
+ATOM   2754  CB  SER B  53     -43.425   2.431  79.150  1.00 40.00           C  
+ATOM   2755  OG  SER B  53     -42.770   1.398  79.868  1.00 40.00           O  
+ATOM   2756  N   GLY B  54     -46.275   1.359  79.357  1.00 40.00           N  
+ATOM   2757  CA  GLY B  54     -47.226   0.286  79.599  1.00 40.00           C  
+ATOM   2758  C   GLY B  54     -48.460   0.783  80.323  1.00 40.00           C  
+ATOM   2759  O   GLY B  54     -48.523   1.934  80.766  1.00 40.00           O  
+ATOM   2760  N   SER B  55     -49.441  -0.101  80.446  1.00 40.00           N  
+ATOM   2761  CA  SER B  55     -50.738   0.250  81.011  1.00 40.00           C  
+ATOM   2762  C   SER B  55     -51.091  -0.587  82.242  1.00 40.00           C  
+ATOM   2763  O   SER B  55     -50.592  -1.702  82.404  1.00 40.00           O  
+ATOM   2764  CB  SER B  55     -51.824   0.089  79.943  1.00 40.00           C  
+ATOM   2765  OG  SER B  55     -51.783  -1.199  79.348  1.00 40.00           O  
+ATOM   2766  N   VAL B  56     -51.943  -0.042  83.113  1.00 40.00           N  
+ATOM   2767  CA  VAL B  56     -52.496  -0.808  84.248  1.00 40.00           C  
+ATOM   2768  C   VAL B  56     -54.006  -0.595  84.445  1.00 40.00           C  
+ATOM   2769  O   VAL B  56     -54.576   0.406  83.989  1.00 40.00           O  
+ATOM   2770  CB  VAL B  56     -51.773  -0.538  85.591  1.00 40.00           C  
+ATOM   2771  CG1 VAL B  56     -50.260  -0.576  85.436  1.00 40.00           C  
+ATOM   2772  CG2 VAL B  56     -52.237   0.769  86.203  1.00 40.00           C  
+ATOM   2773  N   ASP B  57     -54.644  -1.550  85.121  1.00 40.00           N  
+ATOM   2774  CA  ASP B  57     -56.062  -1.456  85.458  1.00 40.00           C  
+ATOM   2775  C   ASP B  57     -56.161  -1.222  86.943  1.00 40.00           C  
+ATOM   2776  O   ASP B  57     -56.246  -2.163  87.742  1.00 40.00           O  
+ATOM   2777  CB  ASP B  57     -56.836  -2.724  85.045  1.00 40.00           C  
+ATOM   2778  CG  ASP B  57     -58.263  -2.785  85.630  1.00 40.00           C  
+ATOM   2779  OD1 ASP B  57     -58.805  -3.908  85.746  1.00 40.00           O  
+ATOM   2780  OD2 ASP B  57     -58.842  -1.729  85.972  1.00 40.00           O  
+ATOM   2781  N   GLN B  58     -56.140   0.048  87.312  1.00 40.00           N  
+ATOM   2782  CA  GLN B  58     -56.276   0.405  88.707  1.00 40.00           C  
+ATOM   2783  C   GLN B  58     -57.672   0.898  89.019  1.00 40.00           C  
+ATOM   2784  O   GLN B  58     -57.853   1.781  89.854  1.00 40.00           O  
+ATOM   2785  CB  GLN B  58     -55.238   1.434  89.094  1.00 40.00           C  
+ATOM   2786  CG  GLN B  58     -55.110   2.549  88.089  1.00 40.00           C  
+ATOM   2787  CD  GLN B  58     -54.138   3.605  88.550  1.00 40.00           C  
+ATOM   2788  OE1 GLN B  58     -53.820   4.544  87.808  1.00 40.00           O  
+ATOM   2789  NE2 GLN B  58     -53.651   3.462  89.787  1.00 40.00           N  
+ATOM   2790  N   SER B  59     -58.661   0.326  88.335  1.00 40.00           N  
+ATOM   2791  CA  SER B  59     -60.042   0.553  88.715  1.00 40.00           C  
+ATOM   2792  C   SER B  59     -60.224  -0.127  90.066  1.00 40.00           C  
+ATOM   2793  O   SER B  59     -59.732  -1.243  90.307  1.00 40.00           O  
+ATOM   2794  CB  SER B  59     -61.035   0.044  87.660  1.00 40.00           C  
+ATOM   2795  OG  SER B  59     -60.987  -1.366  87.537  1.00 40.00           O  
+ATOM   2796  N   ASP B  60     -60.885   0.601  90.953  1.00 40.00           N  
+ATOM   2797  CA  ASP B  60     -61.073   0.197  92.333  1.00 40.00           C  
+ATOM   2798  C   ASP B  60     -60.060   0.813  93.298  1.00 40.00           C  
+ATOM   2799  O   ASP B  60     -59.903   0.344  94.426  1.00 40.00           O  
+ATOM   2800  CB  ASP B  60     -61.084  -1.318  92.474  1.00 40.00           C  
+ATOM   2801  CG  ASP B  60     -61.974  -1.771  93.586  1.00 40.00           C  
+ATOM   2802  OD1 ASP B  60     -62.636  -0.922  94.229  1.00 40.00           O  
+ATOM   2803  OD2 ASP B  60     -62.016  -2.987  93.816  1.00 40.00           O  
+ATOM   2804  N   GLN B  61     -59.372   1.858  92.843  1.00 40.00           N  
+ATOM   2805  CA  GLN B  61     -58.739   2.803  93.757  1.00 40.00           C  
+ATOM   2806  C   GLN B  61     -59.721   3.951  93.954  1.00 40.00           C  
+ATOM   2807  O   GLN B  61     -60.731   4.033  93.253  1.00 40.00           O  
+ATOM   2808  CB  GLN B  61     -57.377   3.298  93.231  1.00 40.00           C  
+ATOM   2809  CG  GLN B  61     -57.399   4.229  92.015  1.00 40.00           C  
+ATOM   2810  CD  GLN B  61     -57.531   5.715  92.352  1.00 40.00           C  
+ATOM   2811  OE1 GLN B  61     -57.046   6.194  93.382  1.00 40.00           O  
+ATOM   2812  NE2 GLN B  61     -58.183   6.454  91.463  1.00 40.00           N  
+ATOM   2813  N   SER B  62     -59.431   4.829  94.908  1.00 40.00           N  
+ATOM   2814  CA  SER B  62     -60.283   5.991  95.144  1.00 40.00           C  
+ATOM   2815  C   SER B  62     -59.534   7.281  95.529  1.00 40.00           C  
+ATOM   2816  O   SER B  62     -60.147   8.345  95.598  1.00 40.00           O  
+ATOM   2817  CB  SER B  62     -61.415   5.660  96.142  1.00 40.00           C  
+ATOM   2818  OG  SER B  62     -61.075   4.598  97.021  1.00 40.00           O  
+ATOM   2819  N   TYR B  63     -58.219   7.195  95.736  1.00 40.00           N  
+ATOM   2820  CA  TYR B  63     -57.419   8.334  96.241  1.00 40.00           C  
+ATOM   2821  C   TYR B  63     -57.030   9.406  95.199  1.00 40.00           C  
+ATOM   2822  O   TYR B  63     -57.100  10.615  95.473  1.00 40.00           O  
+ATOM   2823  CB  TYR B  63     -56.161   7.820  96.961  1.00 40.00           C  
+ATOM   2824  CG  TYR B  63     -55.351   8.887  97.685  1.00 40.00           C  
+ATOM   2825  CD1 TYR B  63     -54.398   9.660  97.010  1.00 40.00           C  
+ATOM   2826  CD2 TYR B  63     -55.524   9.105  99.046  1.00 40.00           C  
+ATOM   2827  CE1 TYR B  63     -53.657  10.623  97.676  1.00 40.00           C  
+ATOM   2828  CE2 TYR B  63     -54.784  10.060  99.719  1.00 40.00           C  
+ATOM   2829  CZ  TYR B  63     -53.858  10.815  99.036  1.00 40.00           C  
+ATOM   2830  OH  TYR B  63     -53.151  11.762  99.735  1.00 40.00           O  
+ATOM   2831  N   LEU B  64     -56.589   8.971  94.025  1.00 40.00           N  
+ATOM   2832  CA  LEU B  64     -56.165   9.908  92.998  1.00 40.00           C  
+ATOM   2833  C   LEU B  64     -57.362  10.478  92.268  1.00 40.00           C  
+ATOM   2834  O   LEU B  64     -58.344   9.770  92.025  1.00 40.00           O  
+ATOM   2835  CB  LEU B  64     -55.273   9.216  91.977  1.00 40.00           C  
+ATOM   2836  CG  LEU B  64     -53.982   8.569  92.452  1.00 40.00           C  
+ATOM   2837  CD1 LEU B  64     -53.414   7.717  91.333  1.00 40.00           C  
+ATOM   2838  CD2 LEU B  64     -52.975   9.616  92.886  1.00 40.00           C  
+ATOM   2839  N   ASP B  65     -57.279  11.758  91.912  1.00 40.00           N  
+ATOM   2840  CA  ASP B  65     -58.207  12.327  90.935  1.00 40.00           C  
+ATOM   2841  C   ASP B  65     -57.750  11.942  89.529  1.00 40.00           C  
+ATOM   2842  O   ASP B  65     -56.681  11.346  89.358  1.00 40.00           O  
+ATOM   2843  CB  ASP B  65     -58.299  13.847  91.079  1.00 40.00           C  
+ATOM   2844  CG  ASP B  65     -56.953  14.542  90.909  1.00 40.00           C  
+ATOM   2845  OD1 ASP B  65     -56.245  14.293  89.902  1.00 40.00           O  
+ATOM   2846  OD2 ASP B  65     -56.613  15.359  91.789  1.00 40.00           O  
+ATOM   2847  N   ASP B  66     -58.541  12.298  88.524  1.00 40.00           N  
+ATOM   2848  CA  ASP B  66     -58.230  11.914  87.156  1.00 40.00           C  
+ATOM   2849  C   ASP B  66     -56.964  12.516  86.562  1.00 40.00           C  
+ATOM   2850  O   ASP B  66     -56.278  11.862  85.774  1.00 40.00           O  
+ATOM   2851  CB  ASP B  66     -59.426  12.198  86.281  1.00 40.00           C  
+ATOM   2852  CG  ASP B  66     -60.537  11.229  86.533  1.00 40.00           C  
+ATOM   2853  OD1 ASP B  66     -60.244  10.020  86.681  1.00 40.00           O  
+ATOM   2854  OD2 ASP B  66     -61.697  11.672  86.597  1.00 40.00           O  
+ATOM   2855  N   GLY B  67     -56.669  13.756  86.954  1.00 40.00           N  
+ATOM   2856  CA  GLY B  67     -55.488  14.493  86.482  1.00 40.00           C  
+ATOM   2857  C   GLY B  67     -54.181  13.907  86.984  1.00 40.00           C  
+ATOM   2858  O   GLY B  67     -53.109  14.125  86.397  1.00 40.00           O  
+ATOM   2859  N   GLN B  68     -54.290  13.175  88.089  1.00 40.00           N  
+ATOM   2860  CA  GLN B  68     -53.198  12.381  88.620  1.00 40.00           C  
+ATOM   2861  C   GLN B  68     -53.087  11.050  87.825  1.00 40.00           C  
+ATOM   2862  O   GLN B  68     -51.976  10.603  87.508  1.00 40.00           O  
+ATOM   2863  CB  GLN B  68     -53.372  12.194  90.149  1.00 40.00           C  
+ATOM   2864  CG  GLN B  68     -53.129  13.483  90.962  1.00 40.00           C  
+ATOM   2865  CD  GLN B  68     -53.590  13.441  92.429  1.00 40.00           C  
+ATOM   2866  OE1 GLN B  68     -54.676  12.939  92.756  1.00 40.00           O  
+ATOM   2867  NE2 GLN B  68     -52.769  14.008  93.318  1.00 40.00           N  
+ATOM   2868  N   ILE B  69     -54.234  10.454  87.471  1.00 40.00           N  
+ATOM   2869  CA  ILE B  69     -54.281   9.256  86.609  1.00 40.00           C  
+ATOM   2870  C   ILE B  69     -53.802   9.627  85.218  1.00 40.00           C  
+ATOM   2871  O   ILE B  69     -53.069   8.872  84.570  1.00 40.00           O  
+ATOM   2872  CB  ILE B  69     -55.706   8.649  86.519  1.00 40.00           C  
+ATOM   2873  CG1 ILE B  69     -56.088   7.980  87.841  1.00 40.00           C  
+ATOM   2874  CG2 ILE B  69     -55.800   7.632  85.388  1.00 40.00           C  
+ATOM   2875  CD1 ILE B  69     -57.575   7.899  88.092  1.00 40.00           C  
+ATOM   2876  N   CYS B  70     -54.237  10.804  84.779  1.00 40.00           N  
+ATOM   2877  CA  CYS B  70     -53.785  11.408  83.543  1.00 40.00           C  
+ATOM   2878  C   CYS B  70     -52.291  11.666  83.548  1.00 40.00           C  
+ATOM   2879  O   CYS B  70     -51.654  11.644  82.503  1.00 40.00           O  
+ATOM   2880  CB  CYS B  70     -54.520  12.722  83.331  1.00 20.00           C  
+ATOM   2881  SG  CYS B  70     -55.578  12.751  81.867  1.00 20.00           S  
+ATOM   2882  N   ASP B  71     -51.737  11.908  84.728  1.00 40.00           N  
+ATOM   2883  CA  ASP B  71     -50.317  12.197  84.857  1.00 40.00           C  
+ATOM   2884  C   ASP B  71     -49.482  10.930  85.132  1.00 40.00           C  
+ATOM   2885  O   ASP B  71     -48.294  11.013  85.464  1.00 40.00           O  
+ATOM   2886  CB  ASP B  71     -50.108  13.265  85.942  1.00 40.00           C  
+ATOM   2887  CG  ASP B  71     -49.042  14.308  85.567  1.00 40.00           C  
+ATOM   2888  OD1 ASP B  71     -48.813  14.563  84.353  1.00 40.00           O  
+ATOM   2889  OD2 ASP B  71     -48.438  14.886  86.507  1.00 40.00           O  
+ATOM   2890  N   GLY B  72     -50.111   9.763  84.994  1.00 40.00           N  
+ATOM   2891  CA  GLY B  72     -49.407   8.475  85.083  1.00 40.00           C  
+ATOM   2892  C   GLY B  72     -49.042   8.010  86.484  1.00 40.00           C  
+ATOM   2893  O   GLY B  72     -48.242   7.087  86.672  1.00 40.00           O  
+ATOM   2894  N   TRP B  73     -49.628   8.657  87.476  1.00 40.00           N  
+ATOM   2895  CA  TRP B  73     -49.456   8.244  88.846  1.00 40.00           C  
+ATOM   2896  C   TRP B  73     -50.145   6.952  89.065  1.00 40.00           C  
+ATOM   2897  O   TRP B  73     -51.158   6.677  88.426  1.00 40.00           O  
+ATOM   2898  CB  TRP B  73     -50.064   9.283  89.751  1.00 40.00           C  
+ATOM   2899  CG  TRP B  73     -49.131  10.425  89.984  1.00 40.00           C  
+ATOM   2900  CD1 TRP B  73     -49.193  11.708  89.444  1.00 40.00           C  
+ATOM   2901  CD2 TRP B  73     -47.934  10.412  90.827  1.00 40.00           C  
+ATOM   2902  NE1 TRP B  73     -48.150  12.475  89.894  1.00 40.00           N  
+ATOM   2903  CE2 TRP B  73     -47.352  11.755  90.730  1.00 40.00           C  
+ATOM   2904  CE3 TRP B  73     -47.313   9.457  91.641  1.00 40.00           C  
+ATOM   2905  CZ2 TRP B  73     -46.195  12.106  91.426  1.00 40.00           C  
+ATOM   2906  CZ3 TRP B  73     -46.152   9.822  92.339  1.00 40.00           C  
+ATOM   2907  CH2 TRP B  73     -45.606  11.113  92.233  1.00 40.00           C  
+ATOM   2908  N   VAL B  74     -49.612   6.148  89.980  1.00 40.00           N  
+ATOM   2909  CA  VAL B  74     -50.226   4.865  90.299  1.00 40.00           C  
+ATOM   2910  C   VAL B  74     -50.107   4.412  91.742  1.00 40.00           C  
+ATOM   2911  O   VAL B  74     -49.065   4.565  92.385  1.00 40.00           O  
+ATOM   2912  CB  VAL B  74     -49.679   3.736  89.414  1.00 40.00           C  
+ATOM   2913  CG1 VAL B  74     -48.164   3.659  89.517  1.00 40.00           C  
+ATOM   2914  CG2 VAL B  74     -50.328   2.400  89.772  1.00 40.00           C  
+ATOM   2915  N   LEU B  75     -51.204   3.836  92.221  1.00 40.00           N  
+ATOM   2916  CA  LEU B  75     -51.234   3.157  93.496  1.00 40.00           C  
+ATOM   2917  C   LEU B  75     -50.967   1.692  93.263  1.00 40.00           C  
+ATOM   2918  O   LEU B  75     -51.782   0.978  92.669  1.00 40.00           O  
+ATOM   2919  CB  LEU B  75     -52.572   3.359  94.214  1.00 40.00           C  
+ATOM   2920  CG  LEU B  75     -52.784   4.744  94.839  1.00 40.00           C  
+ATOM   2921  CD1 LEU B  75     -54.017   4.758  95.737  1.00 40.00           C  
+ATOM   2922  CD2 LEU B  75     -51.543   5.191  95.605  1.00 40.00           C  
+ATOM   2923  N   THR B  76     -49.804   1.267  93.740  1.00 40.00           N  
+ATOM   2924  CA  THR B  76     -49.308  -0.081  93.537  1.00 40.00           C  
+ATOM   2925  C   THR B  76     -50.151  -1.165  94.245  1.00 40.00           C  
+ATOM   2926  O   THR B  76     -50.355  -2.255  93.695  1.00 40.00           O  
+ATOM   2927  CB  THR B  76     -47.816  -0.170  93.905  1.00 40.00           C  
+ATOM   2928  OG1 THR B  76     -47.580   0.574  95.097  1.00 40.00           O  
+ATOM   2929  CG2 THR B  76     -46.984   0.449  92.822  1.00 40.00           C  
+ATOM   2930  N   CYS B  77     -50.674  -0.859  95.430  1.00 40.00           N  
+ATOM   2931  CA  CYS B  77     -51.440  -1.847  96.189  1.00 40.00           C  
+ATOM   2932  C   CYS B  77     -52.763  -2.189  95.539  1.00 40.00           C  
+ATOM   2933  O   CYS B  77     -53.406  -3.150  95.926  1.00 40.00           O  
+ATOM   2934  CB  CYS B  77     -51.647  -1.410  97.646  1.00 40.00           C  
+ATOM   2935  SG  CYS B  77     -52.996  -0.254  98.003  1.00 40.00           S  
+ATOM   2936  N   HIS B  78     -53.165  -1.397  94.555  1.00 40.00           N  
+ATOM   2937  CA  HIS B  78     -54.412  -1.637  93.838  1.00 40.00           C  
+ATOM   2938  C   HIS B  78     -54.288  -1.498  92.345  1.00 40.00           C  
+ATOM   2939  O   HIS B  78     -55.223  -1.052  91.675  1.00 40.00           O  
+ATOM   2940  CB  HIS B  78     -55.541  -0.763  94.383  1.00 40.00           C  
+ATOM   2941  CG  HIS B  78     -56.486  -1.489  95.323  1.00 40.00           C  
+ATOM   2942  ND1 HIS B  78     -56.058  -2.158  96.412  1.00 40.00           N  
+ATOM   2943  CD2 HIS B  78     -57.874  -1.612  95.307  1.00 40.00           C  
+ATOM   2944  CE1 HIS B  78     -57.114  -2.689  97.054  1.00 40.00           C  
+ATOM   2945  NE2 HIS B  78     -58.225  -2.350  96.379  1.00 40.00           N  
+ATOM   2946  N   ALA B  79     -53.137  -1.892  91.805  1.00 40.00           N  
+ATOM   2947  CA  ALA B  79     -52.937  -1.891  90.359  1.00 40.00           C  
+ATOM   2948  C   ALA B  79     -52.617  -3.296  89.838  1.00 40.00           C  
+ATOM   2949  O   ALA B  79     -51.672  -3.933  90.322  1.00 40.00           O  
+ATOM   2950  CB  ALA B  79     -51.850  -0.898  89.967  1.00 40.00           C  
+ATOM   2951  N   TYR B  80     -53.448  -3.780  88.901  1.00 40.00           N  
+ATOM   2952  CA  TYR B  80     -53.161  -4.957  88.068  1.00 40.00           C  
+ATOM   2953  C   TYR B  80     -52.502  -4.454  86.791  1.00 40.00           C  
+ATOM   2954  O   TYR B  80     -52.779  -3.333  86.363  1.00 40.00           O  
+ATOM   2955  CB  TYR B  80     -54.442  -5.667  87.636  1.00 40.00           C  
+ATOM   2956  CG  TYR B  80     -55.349  -6.145  88.726  1.00 40.00           C  
+ATOM   2957  CD1 TYR B  80     -56.584  -5.546  88.940  1.00 40.00           C  
+ATOM   2958  CD2 TYR B  80     -54.992  -7.219  89.519  1.00 40.00           C  
+ATOM   2959  CE1 TYR B  80     -57.433  -5.995  89.928  1.00 40.00           C  
+ATOM   2960  CE2 TYR B  80     -55.829  -7.675  90.512  1.00 40.00           C  
+ATOM   2961  CZ  TYR B  80     -57.045  -7.063  90.708  1.00 40.00           C  
+ATOM   2962  OH  TYR B  80     -57.857  -7.538  91.703  1.00 40.00           O  
+ATOM   2963  N   PRO B  81     -51.640  -5.272  86.162  1.00 40.00           N  
+ATOM   2964  CA  PRO B  81     -51.158  -4.848  84.842  1.00 40.00           C  
+ATOM   2965  C   PRO B  81     -52.077  -5.311  83.703  1.00 40.00           C  
+ATOM   2966  O   PRO B  81     -52.777  -6.332  83.835  1.00 40.00           O  
+ATOM   2967  CB  PRO B  81     -49.786  -5.512  84.739  1.00 40.00           C  
+ATOM   2968  CG  PRO B  81     -49.877  -6.723  85.618  1.00 40.00           C  
+ATOM   2969  CD  PRO B  81     -50.941  -6.474  86.657  1.00 40.00           C  
+ATOM   2970  N   THR B  82     -52.097  -4.546  82.612  1.00 40.00           N  
+ATOM   2971  CA  THR B  82     -52.779  -4.970  81.388  1.00 40.00           C  
+ATOM   2972  C   THR B  82     -51.783  -5.006  80.242  1.00 40.00           C  
+ATOM   2973  O   THR B  82     -52.154  -5.251  79.096  1.00 40.00           O  
+ATOM   2974  CB  THR B  82     -53.996  -4.084  81.009  1.00 40.00           C  
+ATOM   2975  OG1 THR B  82     -53.606  -2.704  80.957  1.00 40.00           O  
+ATOM   2976  CG2 THR B  82     -55.162  -4.282  81.992  1.00 40.00           C  
+ATOM   2977  N   SER B  83     -50.518  -4.756  80.562  1.00 40.00           N  
+ATOM   2978  CA  SER B  83     -49.452  -4.819  79.581  1.00 40.00           C  
+ATOM   2979  C   SER B  83     -48.129  -4.899  80.301  1.00 40.00           C  
+ATOM   2980  O   SER B  83     -48.077  -4.766  81.521  1.00 40.00           O  
+ATOM   2981  CB  SER B  83     -49.483  -3.593  78.660  1.00 40.00           C  
+ATOM   2982  OG  SER B  83     -48.931  -2.447  79.279  1.00 40.00           O  
+ATOM   2983  N   ASP B  84     -47.068  -5.142  79.536  1.00 40.00           N  
+ATOM   2984  CA  ASP B  84     -45.703  -4.980  80.018  1.00 40.00           C  
+ATOM   2985  C   ASP B  84     -45.536  -3.536  80.460  1.00 40.00           C  
+ATOM   2986  O   ASP B  84     -45.883  -2.609  79.728  1.00 40.00           O  
+ATOM   2987  CB  ASP B  84     -44.694  -5.322  78.916  1.00 40.00           C  
+ATOM   2988  CG  ASP B  84     -44.421  -6.826  78.795  1.00 40.00           C  
+ATOM   2989  OD1 ASP B  84     -43.315  -7.172  78.325  1.00 40.00           O  
+ATOM   2990  OD2 ASP B  84     -45.285  -7.660  79.163  1.00 40.00           O  
+ATOM   2991  N   VAL B  85     -45.022  -3.344  81.667  1.00 40.00           N  
+ATOM   2992  CA  VAL B  85     -45.050  -2.015  82.277  1.00 40.00           C  
+ATOM   2993  C   VAL B  85     -43.782  -1.670  83.080  1.00 40.00           C  
+ATOM   2994  O   VAL B  85     -43.272  -2.502  83.838  1.00 40.00           O  
+ATOM   2995  CB  VAL B  85     -46.379  -1.788  83.074  1.00 40.00           C  
+ATOM   2996  CG1 VAL B  85     -46.649  -2.907  84.077  1.00 40.00           C  
+ATOM   2997  CG2 VAL B  85     -46.431  -0.413  83.734  1.00 40.00           C  
+ATOM   2998  N   VAL B  86     -43.270  -0.452  82.864  1.00 40.00           N  
+ATOM   2999  CA  VAL B  86     -42.123   0.087  83.605  1.00 40.00           C  
+ATOM   3000  C   VAL B  86     -42.621   1.117  84.624  1.00 40.00           C  
+ATOM   3001  O   VAL B  86     -43.398   2.012  84.259  1.00 40.00           O  
+ATOM   3002  CB  VAL B  86     -41.093   0.764  82.672  1.00 40.00           C  
+ATOM   3003  CG1 VAL B  86     -39.861   1.197  83.454  1.00 40.00           C  
+ATOM   3004  CG2 VAL B  86     -40.692  -0.169  81.543  1.00 40.00           C  
+ATOM   3005  N   ILE B  87     -42.168   0.985  85.884  1.00 40.00           N  
+ATOM   3006  CA  ILE B  87     -42.645   1.810  87.037  1.00 40.00           C  
+ATOM   3007  C   ILE B  87     -41.541   2.222  88.056  1.00 40.00           C  
+ATOM   3008  O   ILE B  87     -40.732   1.386  88.491  1.00 40.00           O  
+ATOM   3009  CB  ILE B  87     -43.849   1.135  87.783  1.00 40.00           C  
+ATOM   3010  CG1 ILE B  87     -45.124   1.190  86.936  1.00 40.00           C  
+ATOM   3011  CG2 ILE B  87     -44.147   1.820  89.107  1.00 40.00           C  
+ATOM   3012  CD1 ILE B  87     -46.294   0.426  87.514  1.00 40.00           C  
+ATOM   3013  N   GLU B  88     -41.526   3.515  88.417  1.00 40.00           N  
+ATOM   3014  CA  GLU B  88     -40.719   4.039  89.535  1.00 40.00           C  
+ATOM   3015  C   GLU B  88     -41.498   3.906  90.829  1.00 40.00           C  
+ATOM   3016  O   GLU B  88     -42.676   4.247  90.874  1.00 40.00           O  
+ATOM   3017  CB  GLU B  88     -40.431   5.523  89.345  1.00 40.00           C  
+ATOM   3018  CG  GLU B  88     -39.597   5.883  88.136  1.00 40.00           C  
+ATOM   3019  CD  GLU B  88     -39.866   7.299  87.679  1.00 40.00           C  
+ATOM   3020  OE1 GLU B  88     -41.040   7.724  87.714  1.00 40.00           O  
+ATOM   3021  OE2 GLU B  88     -38.906   7.988  87.279  1.00 40.00           O  
+ATOM   3022  N   THR B  89     -40.843   3.455  91.888  1.00 40.00           N  
+ATOM   3023  CA  THR B  89     -41.513   3.322  93.174  1.00 40.00           C  
+ATOM   3024  C   THR B  89     -41.008   4.387  94.145  1.00 40.00           C  
+ATOM   3025  O   THR B  89     -40.146   5.187  93.777  1.00 40.00           O  
+ATOM   3026  CB  THR B  89     -41.315   1.908  93.747  1.00 40.00           C  
+ATOM   3027  OG1 THR B  89     -39.932   1.689  94.035  1.00 40.00           O  
+ATOM   3028  CG2 THR B  89     -41.749   0.886  92.737  1.00 40.00           C  
+ATOM   3029  N   HIS B  90     -41.546   4.400  95.370  1.00 40.00           N  
+ATOM   3030  CA  HIS B  90     -41.099   5.306  96.448  1.00 40.00           C  
+ATOM   3031  C   HIS B  90     -41.301   6.726  96.016  1.00 40.00           C  
+ATOM   3032  O   HIS B  90     -40.430   7.584  96.180  1.00 40.00           O  
+ATOM   3033  CB  HIS B  90     -39.628   5.065  96.849  1.00 40.00           C  
+ATOM   3034  CG  HIS B  90     -39.315   3.651  97.354  1.00 40.00           C  
+ATOM   3035  ND1 HIS B  90     -39.489   2.545  96.596  1.00 40.00           N  
+ATOM   3036  CD2 HIS B  90     -38.756   3.209  98.560  1.00 40.00           C  
+ATOM   3037  CE1 HIS B  90     -39.104   1.451  97.292  1.00 40.00           C  
+ATOM   3038  NE2 HIS B  90     -38.653   1.857  98.490  1.00 40.00           N  
+ATOM   3039  N   LYS B  91     -42.468   6.975  95.445  1.00 40.00           N  
+ATOM   3040  CA  LYS B  91     -42.743   8.249  94.819  1.00 40.00           C  
+ATOM   3041  C   LYS B  91     -43.735   9.073  95.599  1.00 40.00           C  
+ATOM   3042  O   LYS B  91     -44.197  10.119  95.118  1.00 40.00           O  
+ATOM   3043  CB  LYS B  91     -43.286   8.017  93.421  1.00 40.00           C  
+ATOM   3044  CG  LYS B  91     -42.256   7.497  92.443  1.00 40.00           C  
+ATOM   3045  CD  LYS B  91     -41.324   8.600  91.962  1.00 40.00           C  
+ATOM   3046  CE  LYS B  91     -40.129   8.783  92.880  1.00 40.00           C  
+ATOM   3047  NZ  LYS B  91     -39.048   9.476  92.134  1.00 40.00           N  
+ATOM   3048  N   GLU B  92     -44.073   8.601  96.799  1.00 40.00           N  
+ATOM   3049  CA  GLU B  92     -45.069   9.292  97.611  1.00 40.00           C  
+ATOM   3050  C   GLU B  92     -44.666  10.748  97.807  1.00 40.00           C  
+ATOM   3051  O   GLU B  92     -45.444  11.653  97.494  1.00 40.00           O  
+ATOM   3052  CB  GLU B  92     -45.310   8.603  98.958  1.00 40.00           C  
+ATOM   3053  CG  GLU B  92     -46.388   9.303  99.780  1.00 40.00           C  
+ATOM   3054  CD  GLU B  92     -46.585   8.715 101.164  1.00 40.00           C  
+ATOM   3055  OE1 GLU B  92     -45.715   7.950 101.636  1.00 40.00           O  
+ATOM   3056  OE2 GLU B  92     -47.617   9.027 101.792  1.00 40.00           O  
+ATOM   3057  N   GLU B  93     -43.442  10.957  98.292  1.00 40.00           N  
+ATOM   3058  CA  GLU B  93     -42.939  12.296  98.561  1.00 40.00           C  
+ATOM   3059  C   GLU B  93     -43.052  13.207  97.342  1.00 40.00           C  
+ATOM   3060  O   GLU B  93     -43.366  14.400  97.471  1.00 40.00           O  
+ATOM   3061  CB  GLU B  93     -41.495  12.244  99.043  1.00 40.00           C  
+ATOM   3062  CG  GLU B  93     -40.877  13.628  99.151  1.00 40.00           C  
+ATOM   3063  CD  GLU B  93     -39.546  13.630  99.873  1.00 40.00           C  
+ATOM   3064  OE1 GLU B  93     -38.557  13.093  99.313  1.00 40.00           O  
+ATOM   3065  OE2 GLU B  93     -39.493  14.188 100.998  1.00 40.00           O  
+ATOM   3066  N   GLU B  94     -42.791  12.641  96.165  1.00 40.00           N  
+ATOM   3067  CA  GLU B  94     -42.983  13.381  94.934  1.00 40.00           C  
+ATOM   3068  C   GLU B  94     -44.452  13.784  94.755  1.00 40.00           C  
+ATOM   3069  O   GLU B  94     -44.734  14.907  94.319  1.00 40.00           O  
+ATOM   3070  CB  GLU B  94     -42.458  12.621  93.714  1.00 40.00           C  
+ATOM   3071  CG  GLU B  94     -42.543  13.458  92.442  1.00 40.00           C  
+ATOM   3072  CD  GLU B  94     -41.943  12.792  91.229  1.00 40.00           C  
+ATOM   3073  OE1 GLU B  94     -40.910  12.104  91.369  1.00 40.00           O  
+ATOM   3074  OE2 GLU B  94     -42.505  12.978  90.128  1.00 40.00           O  
+ATOM   3075  N   LEU B  95     -45.374  12.879  95.102  1.00 40.00           N  
+ATOM   3076  CA  LEU B  95     -46.808  13.186  95.075  1.00 40.00           C  
+ATOM   3077  C   LEU B  95     -47.161  14.216  96.151  1.00 40.00           C  
+ATOM   3078  O   LEU B  95     -47.834  15.220  95.891  1.00 40.00           O  
+ATOM   3079  CB  LEU B  95     -47.625  11.912  95.263  1.00 40.00           C  
+ATOM   3080  CG  LEU B  95     -49.144  12.067  95.202  1.00 40.00           C  
+ATOM   3081  CD1 LEU B  95     -49.617  12.716  93.898  1.00 40.00           C  
+ATOM   3082  CD2 LEU B  95     -49.786  10.705  95.409  1.00 40.00           C  
+ATOM   3083  N   THR B  96     -46.701  13.929  97.363  1.00 40.00           N  
+ATOM   3084  CA  THR B  96     -46.629  14.885  98.462  1.00 40.00           C  
+ATOM   3085  C   THR B  96     -45.690  16.047  98.102  1.00 40.00           C  
+ATOM   3086  O   THR B  96     -45.914  17.200  98.478  1.00 40.00           O  
+ATOM   3087  CB  THR B  96     -46.142  14.144  99.734  1.00 40.00           C  
+ATOM   3088  OG1 THR B  96     -47.275  13.674 100.467  1.00 40.00           O  
+ATOM   3089  CG2 THR B  96     -45.272  15.017 100.646  1.00 40.00           C  
+TER    3090      THR B  96                                                      
+ATOM   3091  N   LYS C  18     -58.009  18.926  79.425  1.00 40.00           N  
+ATOM   3092  CA  LYS C  18     -58.319  17.450  79.423  1.00 40.00           C  
+ATOM   3093  C   LYS C  18     -57.250  16.682  78.632  1.00 40.00           C  
+ATOM   3094  O   LYS C  18     -56.972  16.993  77.455  1.00 40.00           O  
+ATOM   3095  CB  LYS C  18     -59.725  17.138  78.849  1.00 40.00           C  
+ATOM   3096  CG  LYS C  18     -60.691  18.323  78.676  1.00 40.00           C  
+ATOM   3097  CD  LYS C  18     -60.325  19.296  77.533  1.00 40.00           C  
+ATOM   3098  CE  LYS C  18     -59.955  18.619  76.204  1.00 40.00           C  
+ATOM   3099  NZ  LYS C  18     -61.102  17.999  75.476  1.00 40.00           N  
+ATOM   3100  N   CYS C  19     -56.645  15.691  79.284  1.00 40.00           N  
+ATOM   3101  CA  CYS C  19     -55.661  14.858  78.611  1.00 40.00           C  
+ATOM   3102  C   CYS C  19     -56.375  13.639  77.986  1.00 40.00           C  
+ATOM   3103  O   CYS C  19     -57.234  12.985  78.612  1.00 40.00           O  
+ATOM   3104  CB  CYS C  19     -54.438  14.589  79.533  1.00 40.00           C  
+ATOM   3105  SG  CYS C  19     -54.191  13.011  80.414  1.00 40.00           S  
+ATOM   3106  N   SER C  20     -56.061  13.414  76.714  1.00 40.00           N  
+ATOM   3107  CA  SER C  20     -56.756  12.448  75.898  1.00 40.00           C  
+ATOM   3108  C   SER C  20     -55.937  11.176  75.749  1.00 40.00           C  
+ATOM   3109  O   SER C  20     -54.711  11.211  75.766  1.00 40.00           O  
+ATOM   3110  CB  SER C  20     -57.028  13.058  74.531  1.00 40.00           C  
+ATOM   3111  OG  SER C  20     -57.317  12.055  73.580  1.00 40.00           O  
+ATOM   3112  N   LYS C  21     -56.629  10.052  75.588  1.00 40.00           N  
+ATOM   3113  CA  LYS C  21     -55.976   8.749  75.425  1.00 40.00           C  
+ATOM   3114  C   LYS C  21     -55.500   8.538  73.990  1.00 40.00           C  
+ATOM   3115  O   LYS C  21     -55.014   7.452  73.650  1.00 40.00           O  
+ATOM   3116  CB  LYS C  21     -56.914   7.609  75.857  1.00 40.00           C  
+ATOM   3117  CG  LYS C  21     -57.380   7.714  77.304  1.00 40.00           C  
+ATOM   3118  CD  LYS C  21     -58.500   6.742  77.617  1.00 40.00           C  
+ATOM   3119  CE  LYS C  21     -59.278   7.220  78.833  1.00 40.00           C  
+ATOM   3120  NZ  LYS C  21     -60.349   6.258  79.206  1.00 40.00           N  
+ATOM   3121  N   LYS C  22     -55.640   9.581  73.166  1.00 40.00           N  
+ATOM   3122  CA  LYS C  22     -55.257   9.546  71.759  1.00 40.00           C  
+ATOM   3123  C   LYS C  22     -54.057  10.458  71.563  1.00 40.00           C  
+ATOM   3124  O   LYS C  22     -54.044  11.564  72.090  1.00 40.00           O  
+ATOM   3125  CB  LYS C  22     -56.417  10.015  70.878  1.00 40.00           C  
+ATOM   3126  CG  LYS C  22     -57.774   9.413  71.218  1.00 40.00           C  
+ATOM   3127  CD  LYS C  22     -58.858   9.982  70.324  1.00 40.00           C  
+ATOM   3128  CE  LYS C  22     -60.177   9.278  70.544  1.00 40.00           C  
+ATOM   3129  NZ  LYS C  22     -61.203   9.839  69.630  1.00 40.00           N  
+ATOM   3130  N   GLN C  23     -53.055   9.992  70.815  1.00 40.00           N  
+ATOM   3131  CA  GLN C  23     -51.804  10.744  70.620  1.00 40.00           C  
+ATOM   3132  C   GLN C  23     -52.053  12.095  69.994  1.00 40.00           C  
+ATOM   3133  O   GLN C  23     -52.320  12.192  68.792  1.00 40.00           O  
+ATOM   3134  CB  GLN C  23     -50.827   9.987  69.733  1.00 40.00           C  
+ATOM   3135  CG  GLN C  23     -50.282   8.713  70.339  1.00 40.00           C  
+ATOM   3136  CD  GLN C  23     -49.611   7.827  69.305  1.00 40.00           C  
+ATOM   3137  OE1 GLN C  23     -48.764   8.283  68.523  1.00 40.00           O  
+ATOM   3138  NE2 GLN C  23     -49.983   6.549  69.295  1.00 40.00           N  
+ATOM   3139  N   GLU C  24     -51.955  13.143  70.802  1.00 40.00           N  
+ATOM   3140  CA  GLU C  24     -52.297  14.462  70.309  1.00 40.00           C  
+ATOM   3141  C   GLU C  24     -51.056  15.283  69.983  1.00 40.00           C  
+ATOM   3142  O   GLU C  24     -51.152  16.425  69.542  1.00 40.00           O  
+ATOM   3143  CB  GLU C  24     -53.274  15.166  71.263  1.00 40.00           C  
+ATOM   3144  CG  GLU C  24     -54.615  14.429  71.362  1.00 40.00           C  
+ATOM   3145  CD  GLU C  24     -55.843  15.342  71.429  1.00 40.00           C  
+ATOM   3146  OE1 GLU C  24     -55.779  16.502  70.941  1.00 40.00           O  
+ATOM   3147  OE2 GLU C  24     -56.892  14.881  71.955  1.00 40.00           O  
+ATOM   3148  N   GLU C  25     -49.895  14.663  70.135  1.00 40.00           N  
+ATOM   3149  CA  GLU C  25     -48.629  15.360  69.990  1.00 40.00           C  
+ATOM   3150  C   GLU C  25     -48.146  15.495  68.541  1.00 40.00           C  
+ATOM   3151  O   GLU C  25     -47.923  14.494  67.866  1.00 40.00           O  
+ATOM   3152  CB  GLU C  25     -47.580  14.640  70.832  1.00 40.00           C  
+ATOM   3153  CG  GLU C  25     -46.161  15.200  70.732  1.00 40.00           C  
+ATOM   3154  CD  GLU C  25     -45.081  14.190  71.139  1.00 40.00           C  
+ATOM   3155  OE1 GLU C  25     -43.878  14.513  71.001  1.00 40.00           O  
+ATOM   3156  OE2 GLU C  25     -45.418  13.068  71.591  1.00 40.00           O  
+ATOM   3157  N   GLY C  26     -47.959  16.735  68.090  1.00 40.00           N  
+ATOM   3158  CA  GLY C  26     -47.467  17.018  66.743  1.00 40.00           C  
+ATOM   3159  C   GLY C  26     -48.567  17.152  65.703  1.00 40.00           C  
+ATOM   3160  O   GLY C  26     -48.339  17.646  64.600  1.00 40.00           O  
+ATOM   3161  N   VAL C  27     -49.762  16.702  66.059  1.00 40.00           N  
+ATOM   3162  CA  VAL C  27     -50.917  16.705  65.172  1.00 40.00           C  
+ATOM   3163  C   VAL C  27     -51.241  18.137  64.758  1.00 40.00           C  
+ATOM   3164  O   VAL C  27     -51.474  18.974  65.625  1.00 40.00           O  
+ATOM   3165  CB  VAL C  27     -52.140  16.099  65.903  1.00 40.00           C  
+ATOM   3166  CG1 VAL C  27     -53.366  16.071  65.004  1.00 40.00           C  
+ATOM   3167  CG2 VAL C  27     -51.836  14.701  66.423  1.00 40.00           C  
+ATOM   3168  N   VAL C  28     -51.252  18.427  63.456  1.00 40.00           N  
+ATOM   3169  CA  VAL C  28     -51.605  19.779  62.973  1.00 40.00           C  
+ATOM   3170  C   VAL C  28     -52.984  19.809  62.296  1.00 40.00           C  
+ATOM   3171  O   VAL C  28     -53.421  18.810  61.748  1.00 40.00           O  
+ATOM   3172  CB  VAL C  28     -50.510  20.378  62.046  1.00 40.00           C  
+ATOM   3173  CG1 VAL C  28     -49.114  20.079  62.575  1.00 40.00           C  
+ATOM   3174  CG2 VAL C  28     -50.633  19.864  60.623  1.00 40.00           C  
+ATOM   3175  N   THR C  29     -53.681  20.937  62.347  1.00 40.00           N  
+ATOM   3176  CA  THR C  29     -54.941  21.038  61.611  1.00 40.00           C  
+ATOM   3177  C   THR C  29     -55.071  22.296  60.777  1.00 40.00           C  
+ATOM   3178  O   THR C  29     -54.453  23.330  61.067  1.00 40.00           O  
+ATOM   3179  CB  THR C  29     -56.185  20.910  62.509  1.00 40.00           C  
+ATOM   3180  OG1 THR C  29     -55.939  21.548  63.766  1.00 40.00           O  
+ATOM   3181  CG2 THR C  29     -56.533  19.456  62.738  1.00 40.00           C  
+ATOM   3182  N   ASN C  30     -55.889  22.165  59.735  1.00 40.00           N  
+ATOM   3183  CA  ASN C  30     -56.228  23.234  58.807  1.00 40.00           C  
+ATOM   3184  C   ASN C  30     -55.059  24.055  58.276  1.00 40.00           C  
+ATOM   3185  O   ASN C  30     -55.192  25.262  58.029  1.00 40.00           O  
+ATOM   3186  CB  ASN C  30     -57.311  24.109  59.417  1.00 40.00           C  
+ATOM   3187  CG  ASN C  30     -58.629  23.387  59.497  1.00 40.00           C  
+ATOM   3188  OD1 ASN C  30     -59.401  23.385  58.538  1.00 40.00           O  
+ATOM   3189  ND2 ASN C  30     -58.887  22.746  60.633  1.00 40.00           N  
+ATOM   3190  N   LEU C  31     -53.924  23.383  58.080  1.00 40.00           N  
+ATOM   3191  CA  LEU C  31     -52.718  24.011  57.540  1.00 40.00           C  
+ATOM   3192  C   LEU C  31     -52.982  24.730  56.207  1.00 40.00           C  
+ATOM   3193  O   LEU C  31     -52.474  25.829  55.970  1.00 40.00           O  
+ATOM   3194  CB  LEU C  31     -51.596  22.987  57.401  1.00 40.00           C  
+ATOM   3195  CG  LEU C  31     -50.291  23.335  58.116  1.00 40.00           C  
+ATOM   3196  CD1 LEU C  31     -49.233  22.305  57.768  1.00 40.00           C  
+ATOM   3197  CD2 LEU C  31     -49.800  24.741  57.787  1.00 40.00           C  
+ATOM   3198  N   TYR C  32     -53.788  24.111  55.351  1.00 40.00           N  
+ATOM   3199  CA  TYR C  32     -54.310  24.788  54.177  1.00 40.00           C  
+ATOM   3200  C   TYR C  32     -55.843  24.795  54.232  1.00 40.00           C  
+ATOM   3201  O   TYR C  32     -56.464  23.794  54.615  1.00 40.00           O  
+ATOM   3202  CB  TYR C  32     -53.822  24.115  52.889  1.00 40.00           C  
+ATOM   3203  CG  TYR C  32     -52.311  24.098  52.648  1.00 40.00           C  
+ATOM   3204  CD1 TYR C  32     -51.480  23.229  53.360  1.00 40.00           C  
+ATOM   3205  CD2 TYR C  32     -51.719  24.922  51.675  1.00 40.00           C  
+ATOM   3206  CE1 TYR C  32     -50.111  23.190  53.130  1.00 40.00           C  
+ATOM   3207  CE2 TYR C  32     -50.346  24.884  51.437  1.00 40.00           C  
+ATOM   3208  CZ  TYR C  32     -49.549  24.011  52.170  1.00 40.00           C  
+ATOM   3209  OH  TYR C  32     -48.191  23.953  51.963  1.00 40.00           O  
+ATOM   3210  N   LYS C  33     -56.431  25.936  53.857  1.00 40.00           N  
+ATOM   3211  CA  LYS C  33     -57.901  26.153  53.823  1.00 40.00           C  
+ATOM   3212  C   LYS C  33     -58.391  26.383  52.371  1.00 40.00           C  
+ATOM   3213  O   LYS C  33     -57.575  26.701  51.501  1.00 40.00           O  
+ATOM   3214  CB  LYS C  33     -58.294  27.357  54.709  1.00 40.00           C  
+ATOM   3215  CG  LYS C  33     -57.982  27.224  56.203  1.00 40.00           C  
+ATOM   3216  CD  LYS C  33     -58.128  28.566  56.930  1.00 40.00           C  
+ATOM   3217  CE  LYS C  33     -57.539  28.556  58.340  1.00 40.00           C  
+ATOM   3218  NZ  LYS C  33     -56.047  28.576  58.334  1.00 40.00           N  
+ATOM   3219  N   PRO C  34     -59.713  26.220  52.100  1.00 40.00           N  
+ATOM   3220  CA  PRO C  34     -60.316  26.436  50.759  1.00 40.00           C  
+ATOM   3221  C   PRO C  34     -59.958  27.747  49.999  1.00 40.00           C  
+ATOM   3222  O   PRO C  34     -59.988  27.760  48.753  1.00 40.00           O  
+ATOM   3223  CB  PRO C  34     -61.817  26.365  51.049  1.00 40.00           C  
+ATOM   3224  CG  PRO C  34     -61.908  25.404  52.178  1.00 40.00           C  
+ATOM   3225  CD  PRO C  34     -60.690  25.619  53.031  1.00 40.00           C  
+ATOM   3226  N   LYS C  35     -59.637  28.822  50.735  1.00 40.00           N  
+ATOM   3227  CA  LYS C  35     -59.136  30.083  50.147  1.00 40.00           C  
+ATOM   3228  C   LYS C  35     -57.726  29.944  49.520  1.00 40.00           C  
+ATOM   3229  O   LYS C  35     -57.483  30.459  48.414  1.00 40.00           O  
+ATOM   3230  CB  LYS C  35     -59.146  31.223  51.184  1.00 40.00           C  
+ATOM   3231  CG  LYS C  35     -57.854  31.369  51.995  1.00 40.00           C  
+ATOM   3232  CD  LYS C  35     -58.042  32.238  53.226  1.00 40.00           C  
+ATOM   3233  CE  LYS C  35     -58.807  31.494  54.323  1.00 40.00           C  
+ATOM   3234  NZ  LYS C  35     -59.389  32.434  55.331  1.00 40.00           N  
+ATOM   3235  N   GLU C  36     -56.812  29.265  50.234  1.00 40.00           N  
+ATOM   3236  CA  GLU C  36     -55.432  29.011  49.755  1.00 40.00           C  
+ATOM   3237  C   GLU C  36     -54.972  27.531  49.834  1.00 40.00           C  
+ATOM   3238  O   GLU C  36     -54.097  27.199  50.674  1.00 40.00           O  
+ATOM   3239  CB  GLU C  36     -54.430  29.949  50.446  1.00 40.00           C  
+ATOM   3240  CG  GLU C  36     -54.447  31.352  49.858  1.00 40.00           C  
+ATOM   3241  CD  GLU C  36     -53.270  32.193  50.299  1.00 40.00           C  
+ATOM   3242  OE1 GLU C  36     -53.513  33.280  50.859  1.00 40.00           O  
+ATOM   3243  OE2 GLU C  36     -52.107  31.776  50.091  1.00 40.00           O  
+ATOM   3244  N   PRO C  37     -55.548  26.653  48.947  1.00 40.00           N  
+ATOM   3245  CA  PRO C  37     -55.224  25.226  48.901  1.00 40.00           C  
+ATOM   3246  C   PRO C  37     -53.844  24.952  48.327  1.00 40.00           C  
+ATOM   3247  O   PRO C  37     -53.431  25.593  47.353  1.00 40.00           O  
+ATOM   3248  CB  PRO C  37     -56.285  24.656  47.956  1.00 40.00           C  
+ATOM   3249  CG  PRO C  37     -56.615  25.776  47.049  1.00 40.00           C  
+ATOM   3250  CD  PRO C  37     -56.566  26.992  47.926  1.00 40.00           C  
+ATOM   3251  N   TYR C  38     -53.137  24.004  48.933  1.00 40.00           N  
+ATOM   3252  CA  TYR C  38     -51.904  23.513  48.355  1.00 40.00           C  
+ATOM   3253  C   TYR C  38     -52.241  22.809  47.042  1.00 40.00           C  
+ATOM   3254  O   TYR C  38     -53.164  21.981  46.990  1.00 40.00           O  
+ATOM   3255  CB  TYR C  38     -51.203  22.553  49.311  1.00 40.00           C  
+ATOM   3256  CG  TYR C  38     -50.038  21.856  48.679  1.00 40.00           C  
+ATOM   3257  CD1 TYR C  38     -48.798  22.492  48.545  1.00 40.00           C  
+ATOM   3258  CD2 TYR C  38     -50.181  20.562  48.186  1.00 40.00           C  
+ATOM   3259  CE1 TYR C  38     -47.730  21.838  47.948  1.00 40.00           C  
+ATOM   3260  CE2 TYR C  38     -49.126  19.900  47.591  1.00 40.00           C  
+ATOM   3261  CZ  TYR C  38     -47.910  20.534  47.473  1.00 40.00           C  
+ATOM   3262  OH  TYR C  38     -46.890  19.834  46.880  1.00 40.00           O  
+ATOM   3263  N   VAL C  39     -51.518  23.153  45.981  1.00 40.00           N  
+ATOM   3264  CA  VAL C  39     -51.703  22.445  44.727  1.00 40.00           C  
+ATOM   3265  C   VAL C  39     -50.671  21.317  44.676  1.00 40.00           C  
+ATOM   3266  O   VAL C  39     -49.466  21.579  44.682  1.00 40.00           O  
+ATOM   3267  CB  VAL C  39     -51.642  23.387  43.507  1.00 40.00           C  
+ATOM   3268  CG1 VAL C  39     -51.728  22.588  42.217  1.00 40.00           C  
+ATOM   3269  CG2 VAL C  39     -52.789  24.387  43.566  1.00 40.00           C  
+ATOM   3270  N   GLY C  40     -51.158  20.072  44.676  1.00 40.00           N  
+ATOM   3271  CA  GLY C  40     -50.309  18.876  44.669  1.00 40.00           C  
+ATOM   3272  C   GLY C  40     -50.352  18.208  43.322  1.00 40.00           C  
+ATOM   3273  O   GLY C  40     -50.801  18.814  42.354  1.00 40.00           O  
+ATOM   3274  N   ARG C  41     -49.896  16.960  43.246  1.00 40.00           N  
+ATOM   3275  CA  ARG C  41     -49.868  16.271  41.959  1.00 40.00           C  
+ATOM   3276  C   ARG C  41     -50.191  14.784  42.022  1.00 40.00           C  
+ATOM   3277  O   ARG C  41     -49.794  14.104  42.959  1.00 40.00           O  
+ATOM   3278  CB  ARG C  41     -48.532  16.494  41.263  1.00 40.00           C  
+ATOM   3279  CG  ARG C  41     -48.652  16.407  39.755  1.00 40.00           C  
+ATOM   3280  CD  ARG C  41     -47.429  16.973  39.051  1.00 40.00           C  
+ATOM   3281  NE  ARG C  41     -47.310  18.440  39.146  1.00 40.00           N  
+ATOM   3282  CZ  ARG C  41     -47.772  19.321  38.248  1.00 40.00           C  
+ATOM   3283  NH1 ARG C  41     -48.427  18.913  37.150  1.00 40.00           N  
+ATOM   3284  NH2 ARG C  41     -47.580  20.626  38.460  1.00 40.00           N  
+ATOM   3285  N   CYS C  42     -50.914  14.299  41.009  1.00 40.00           N  
+ATOM   3286  CA  CYS C  42     -51.350  12.902  40.924  1.00 40.00           C  
+ATOM   3287  C   CYS C  42     -50.240  12.006  40.423  1.00 40.00           C  
+ATOM   3288  O   CYS C  42     -49.746  12.182  39.315  1.00 40.00           O  
+ATOM   3289  CB  CYS C  42     -52.570  12.755  40.005  1.00 40.00           C  
+ATOM   3290  SG  CYS C  42     -53.073  11.032  39.708  1.00 40.00           S  
+ATOM   3291  N   LEU C  43     -49.873  11.033  41.247  1.00 40.00           N  
+ATOM   3292  CA  LEU C  43     -48.792  10.095  40.936  1.00 40.00           C  
+ATOM   3293  C   LEU C  43     -49.354   8.759  40.439  1.00 40.00           C  
+ATOM   3294  O   LEU C  43     -49.005   8.280  39.358  1.00 40.00           O  
+ATOM   3295  CB  LEU C  43     -47.910   9.874  42.175  1.00 40.00           C  
+ATOM   3296  CG  LEU C  43     -46.896  10.914  42.686  1.00 40.00           C  
+ATOM   3297  CD1 LEU C  43     -47.278  12.360  42.380  1.00 40.00           C  
+ATOM   3298  CD2 LEU C  43     -46.657  10.743  44.181  1.00 40.00           C  
+ATOM   3299  N   LEU C  44     -50.224   8.165  41.248  1.00 40.00           N  
+ATOM   3300  CA  LEU C  44     -50.913   6.941  40.886  1.00 40.00           C  
+ATOM   3301  C   LEU C  44     -52.397   7.185  40.790  1.00 40.00           C  
+ATOM   3302  O   LEU C  44     -52.868   8.298  41.039  1.00 40.00           O  
+ATOM   3303  CB  LEU C  44     -50.658   5.850  41.916  1.00 40.00           C  
+ATOM   3304  CG  LEU C  44     -49.261   5.247  41.897  1.00 40.00           C  
+ATOM   3305  CD1 LEU C  44     -49.255   3.977  42.730  1.00 40.00           C  
+ATOM   3306  CD2 LEU C  44     -48.778   4.963  40.477  1.00 40.00           C  
+ATOM   3307  N   ASN C  45     -53.124   6.132  40.422  1.00 40.00           N  
+ATOM   3308  CA  ASN C  45     -54.578   6.148  40.358  1.00 40.00           C  
+ATOM   3309  C   ASN C  45     -55.012   4.834  39.750  1.00 40.00           C  
+ATOM   3310  O   ASN C  45     -55.078   4.690  38.538  1.00 40.00           O  
+ATOM   3311  CB  ASN C  45     -55.104   7.336  39.533  1.00 40.00           C  
+ATOM   3312  CG  ASN C  45     -56.578   7.615  39.779  1.00 40.00           C  
+ATOM   3313  OD1 ASN C  45     -57.219   6.952  40.592  1.00 40.00           O  
+ATOM   3314  ND2 ASN C  45     -57.123   8.600  39.073  1.00 40.00           N  
+ATOM   3315  N   THR C  46     -55.294   3.864  40.601  1.00 40.00           N  
+ATOM   3316  CA  THR C  46     -55.593   2.515  40.144  1.00 40.00           C  
+ATOM   3317  C   THR C  46     -56.983   2.131  40.626  1.00 40.00           C  
+ATOM   3318  O   THR C  46     -57.333   2.381  41.780  1.00 40.00           O  
+ATOM   3319  CB  THR C  46     -54.528   1.527  40.669  1.00 40.00           C  
+ATOM   3320  OG1 THR C  46     -53.223   2.059  40.388  1.00 40.00           O  
+ATOM   3321  CG2 THR C  46     -54.675   0.119  40.056  1.00 40.00           C  
+ATOM   3322  N   LYS C  47     -57.795   1.564  39.737  1.00 40.00           N  
+ATOM   3323  CA  LYS C  47     -59.039   0.956  40.177  1.00 40.00           C  
+ATOM   3324  C   LYS C  47     -58.617  -0.238  41.015  1.00 40.00           C  
+ATOM   3325  O   LYS C  47     -57.631  -0.918  40.696  1.00 40.00           O  
+ATOM   3326  CB  LYS C  47     -59.940   0.530  39.007  1.00 40.00           C  
+ATOM   3327  CG  LYS C  47     -61.374   0.227  39.436  1.00 40.00           C  
+ATOM   3328  CD  LYS C  47     -62.341   0.149  38.271  1.00 40.00           C  
+ATOM   3329  CE  LYS C  47     -62.826  -1.264  38.039  1.00 40.00           C  
+ATOM   3330  NZ  LYS C  47     -64.128  -1.269  37.325  1.00 40.00           N  
+ATOM   3331  N   ILE C  48     -59.338  -0.460  42.108  1.00 40.00           N  
+ATOM   3332  CA  ILE C  48     -59.023  -1.561  43.020  1.00 40.00           C  
+ATOM   3333  C   ILE C  48     -60.203  -2.518  43.215  1.00 40.00           C  
+ATOM   3334  O   ILE C  48     -60.050  -3.601  43.803  1.00 40.00           O  
+ATOM   3335  CB  ILE C  48     -58.502  -1.044  44.370  1.00 40.00           C  
+ATOM   3336  CG1 ILE C  48     -59.407   0.069  44.891  1.00 40.00           C  
+ATOM   3337  CG2 ILE C  48     -57.076  -0.532  44.219  1.00 40.00           C  
+ATOM   3338  CD1 ILE C  48     -59.380   0.222  46.389  1.00 40.00           C  
+ATOM   3339  N   THR C  49     -61.371  -2.098  42.721  1.00 40.00           N  
+ATOM   3340  CA  THR C  49     -62.527  -2.976  42.558  1.00 40.00           C  
+ATOM   3341  C   THR C  49     -62.402  -3.763  41.235  1.00 40.00           C  
+ATOM   3342  O   THR C  49     -61.833  -3.247  40.257  1.00 40.00           O  
+ATOM   3343  CB  THR C  49     -63.866  -2.182  42.573  1.00 40.00           C  
+ATOM   3344  OG1 THR C  49     -63.812  -1.096  41.640  1.00 40.00           O  
+ATOM   3345  CG2 THR C  49     -64.174  -1.638  43.948  1.00 40.00           C  
+ATOM   3346  N   GLY C  50     -62.919  -5.003  41.216  1.00 40.00           N  
+ATOM   3347  CA  GLY C  50     -63.077  -5.809  39.977  1.00 40.00           C  
+ATOM   3348  C   GLY C  50     -63.970  -5.142  38.920  1.00 40.00           C  
+ATOM   3349  O   GLY C  50     -64.459  -4.019  39.126  1.00 40.00           O  
+ATOM   3350  N   ASP C  51     -64.192  -5.803  37.782  1.00 40.00           N  
+ATOM   3351  CA  ASP C  51     -64.990  -5.176  36.707  1.00 40.00           C  
+ATOM   3352  C   ASP C  51     -66.493  -5.389  36.854  1.00 40.00           C  
+ATOM   3353  O   ASP C  51     -67.312  -4.576  36.396  1.00 40.00           O  
+ATOM   3354  CB  ASP C  51     -64.514  -5.649  35.347  1.00 40.00           C  
+ATOM   3355  CG  ASP C  51     -63.217  -5.007  34.953  1.00 40.00           C  
+ATOM   3356  OD1 ASP C  51     -62.207  -5.738  34.834  1.00 40.00           O  
+ATOM   3357  OD2 ASP C  51     -63.207  -3.767  34.794  1.00 40.00           O  
+ATOM   3358  N   ASP C  52     -66.822  -6.505  37.498  1.00 40.00           N  
+ATOM   3359  CA  ASP C  52     -68.181  -6.864  37.878  1.00 40.00           C  
+ATOM   3360  C   ASP C  52     -68.681  -6.034  39.079  1.00 40.00           C  
+ATOM   3361  O   ASP C  52     -69.885  -5.939  39.315  1.00 40.00           O  
+ATOM   3362  CB  ASP C  52     -68.256  -8.376  38.168  1.00 40.00           C  
+ATOM   3363  CG  ASP C  52     -67.097  -8.880  39.031  1.00 40.00           C  
+ATOM   3364  OD1 ASP C  52     -65.933  -8.456  38.837  1.00 40.00           O  
+ATOM   3365  OD2 ASP C  52     -67.356  -9.724  39.903  1.00 40.00           O  
+ATOM   3366  N   ALA C  53     -67.753  -5.421  39.816  1.00 40.00           N  
+ATOM   3367  CA  ALA C  53     -68.073  -4.624  41.002  1.00 40.00           C  
+ATOM   3368  C   ALA C  53     -69.131  -3.569  40.735  1.00 40.00           C  
+ATOM   3369  O   ALA C  53     -69.051  -2.865  39.731  1.00 40.00           O  
+ATOM   3370  CB  ALA C  53     -66.820  -3.966  41.551  1.00 40.00           C  
+ATOM   3371  N   PRO C  54     -70.120  -3.458  41.643  1.00 40.00           N  
+ATOM   3372  CA  PRO C  54     -71.227  -2.494  41.565  1.00 40.00           C  
+ATOM   3373  C   PRO C  54     -70.863  -0.994  41.458  1.00 40.00           C  
+ATOM   3374  O   PRO C  54     -71.552  -0.237  40.772  1.00 40.00           O  
+ATOM   3375  CB  PRO C  54     -72.017  -2.754  42.867  1.00 40.00           C  
+ATOM   3376  CG  PRO C  54     -71.120  -3.569  43.734  1.00 40.00           C  
+ATOM   3377  CD  PRO C  54     -70.301  -4.382  42.777  1.00 40.00           C  
+ATOM   3378  N   GLY C  55     -69.806  -0.558  42.122  1.00 40.00           N  
+ATOM   3379  CA  GLY C  55     -69.601   0.876  42.267  1.00 40.00           C  
+ATOM   3380  C   GLY C  55     -68.351   1.481  41.663  1.00 40.00           C  
+ATOM   3381  O   GLY C  55     -68.365   2.660  41.300  1.00 40.00           O  
+ATOM   3382  N   GLU C  56     -67.278   0.686  41.571  1.00 40.00           N  
+ATOM   3383  CA  GLU C  56     -65.955   1.160  41.138  1.00 40.00           C  
+ATOM   3384  C   GLU C  56     -65.262   2.108  42.165  1.00 40.00           C  
+ATOM   3385  O   GLU C  56     -65.774   3.196  42.494  1.00 40.00           O  
+ATOM   3386  CB  GLU C  56     -66.038   1.778  39.738  1.00 40.00           C  
+ATOM   3387  CG  GLU C  56     -64.734   2.341  39.221  1.00 40.00           C  
+ATOM   3388  CD  GLU C  56     -64.866   2.912  37.832  1.00 40.00           C  
+ATOM   3389  OE1 GLU C  56     -65.247   2.158  36.920  1.00 40.00           O  
+ATOM   3390  OE2 GLU C  56     -64.581   4.108  37.647  1.00 40.00           O  
+ATOM   3391  N   THR C  57     -64.094   1.674  42.658  1.00 40.00           N  
+ATOM   3392  CA  THR C  57     -63.320   2.411  43.667  1.00 40.00           C  
+ATOM   3393  C   THR C  57     -61.814   2.373  43.371  1.00 40.00           C  
+ATOM   3394  O   THR C  57     -61.236   1.300  43.158  1.00 40.00           O  
+ATOM   3395  CB  THR C  57     -63.618   1.863  45.070  1.00 40.00           C  
+ATOM   3396  OG1 THR C  57     -64.954   2.224  45.433  1.00 40.00           O  
+ATOM   3397  CG2 THR C  57     -62.652   2.415  46.100  1.00 40.00           C  
+ATOM   3398  N   TRP C  58     -61.198   3.558  43.371  1.00 40.00           N  
+ATOM   3399  CA  TRP C  58     -59.799   3.748  42.956  1.00 40.00           C  
+ATOM   3400  C   TRP C  58     -58.870   4.143  44.073  1.00 40.00           C  
+ATOM   3401  O   TRP C  58     -59.270   4.879  44.979  1.00 40.00           O  
+ATOM   3402  CB  TRP C  58     -59.730   4.848  41.914  1.00 40.00           C  
+ATOM   3403  CG  TRP C  58     -60.412   4.540  40.613  1.00 40.00           C  
+ATOM   3404  CD1 TRP C  58     -61.772   4.392  40.375  1.00 40.00           C  
+ATOM   3405  CD2 TRP C  58     -59.776   4.366  39.311  1.00 40.00           C  
+ATOM   3406  NE1 TRP C  58     -62.006   4.137  39.054  1.00 40.00           N  
+ATOM   3407  CE2 TRP C  58     -60.852   4.107  38.362  1.00 40.00           C  
+ATOM   3408  CE3 TRP C  58     -58.469   4.400  38.854  1.00 40.00           C  
+ATOM   3409  CZ2 TRP C  58     -60.605   3.887  37.019  1.00 40.00           C  
+ATOM   3410  CZ3 TRP C  58     -58.230   4.172  37.499  1.00 40.00           C  
+ATOM   3411  CH2 TRP C  58     -59.273   3.924  36.605  1.00 40.00           C  
+ATOM   3412  N   HIS C  59     -57.613   3.699  44.002  1.00 40.00           N  
+ATOM   3413  CA  HIS C  59     -56.595   4.095  44.987  1.00 40.00           C  
+ATOM   3414  C   HIS C  59     -55.609   5.053  44.395  1.00 40.00           C  
+ATOM   3415  O   HIS C  59     -54.871   4.695  43.484  1.00 40.00           O  
+ATOM   3416  CB  HIS C  59     -55.866   2.879  45.546  1.00 40.00           C  
+ATOM   3417  CG  HIS C  59     -54.840   3.214  46.605  1.00 40.00           C  
+ATOM   3418  ND1 HIS C  59     -55.172   3.478  47.882  1.00 40.00           N  
+ATOM   3419  CD2 HIS C  59     -53.455   3.315  46.534  1.00 40.00           C  
+ATOM   3420  CE1 HIS C  59     -54.057   3.736  48.594  1.00 40.00           C  
+ATOM   3421  NE2 HIS C  59     -53.007   3.636  47.769  1.00 40.00           N  
+ATOM   3422  N   MET C  60     -55.572   6.280  44.913  1.00 40.00           N  
+ATOM   3423  CA  MET C  60     -54.713   7.318  44.342  1.00 40.00           C  
+ATOM   3424  C   MET C  60     -53.772   7.939  45.354  1.00 40.00           C  
+ATOM   3425  O   MET C  60     -54.111   8.080  46.532  1.00 40.00           O  
+ATOM   3426  CB  MET C  60     -55.554   8.405  43.717  1.00 40.00           C  
+ATOM   3427  CG  MET C  60     -56.531   8.993  44.697  1.00 40.00           C  
+ATOM   3428  SD  MET C  60     -57.842   9.607  43.678  1.00 40.00           S  
+ATOM   3429  CE  MET C  60     -58.815   8.132  43.402  1.00 40.00           C  
+ATOM   3430  N   VAL C  61     -52.595   8.321  44.864  1.00 40.00           N  
+ATOM   3431  CA  VAL C  61     -51.534   8.888  45.687  1.00 40.00           C  
+ATOM   3432  C   VAL C  61     -51.145  10.281  45.154  1.00 40.00           C  
+ATOM   3433  O   VAL C  61     -51.163  10.504  43.941  1.00 40.00           O  
+ATOM   3434  CB  VAL C  61     -50.304   7.956  45.714  1.00 40.00           C  
+ATOM   3435  CG1 VAL C  61     -49.547   8.119  47.015  1.00 40.00           C  
+ATOM   3436  CG2 VAL C  61     -50.715   6.501  45.572  1.00 40.00           C  
+ATOM   3437  N   PHE C  62     -50.816  11.216  46.056  1.00 40.00           N  
+ATOM   3438  CA  PHE C  62     -50.438  12.591  45.672  1.00 40.00           C  
+ATOM   3439  C   PHE C  62     -49.126  13.094  46.276  1.00 40.00           C  
+ATOM   3440  O   PHE C  62     -48.780  12.771  47.410  1.00 40.00           O  
+ATOM   3441  CB  PHE C  62     -51.535  13.599  46.026  1.00 40.00           C  
+ATOM   3442  CG  PHE C  62     -52.921  13.194  45.602  1.00 40.00           C  
+ATOM   3443  CD1 PHE C  62     -53.204  12.859  44.283  1.00 40.00           C  
+ATOM   3444  CD2 PHE C  62     -53.964  13.194  46.525  1.00 40.00           C  
+ATOM   3445  CE1 PHE C  62     -54.491  12.497  43.906  1.00 40.00           C  
+ATOM   3446  CE2 PHE C  62     -55.254  12.843  46.151  1.00 40.00           C  
+ATOM   3447  CZ  PHE C  62     -55.518  12.494  44.839  1.00 40.00           C  
+ATOM   3448  N   SER C  63     -48.419  13.917  45.504  1.00 40.00           N  
+ATOM   3449  CA  SER C  63     -47.179  14.549  45.947  1.00 40.00           C  
+ATOM   3450  C   SER C  63     -47.503  15.738  46.828  1.00 40.00           C  
+ATOM   3451  O   SER C  63     -48.339  16.579  46.477  1.00 40.00           O  
+ATOM   3452  CB  SER C  63     -46.331  15.000  44.756  1.00 40.00           C  
+ATOM   3453  OG  SER C  63     -47.059  15.878  43.916  1.00 40.00           O  
+ATOM   3454  N   THR C  64     -46.819  15.805  47.965  1.00 40.00           N  
+ATOM   3455  CA  THR C  64     -47.136  16.761  49.014  1.00 40.00           C  
+ATOM   3456  C   THR C  64     -45.948  17.648  49.338  1.00 40.00           C  
+ATOM   3457  O   THR C  64     -46.102  18.696  49.950  1.00 40.00           O  
+ATOM   3458  CB  THR C  64     -47.523  16.027  50.307  1.00 40.00           C  
+ATOM   3459  OG1 THR C  64     -46.363  15.396  50.854  1.00 40.00           O  
+ATOM   3460  CG2 THR C  64     -48.559  14.966  50.029  1.00 40.00           C  
+ATOM   3461  N   GLU C  65     -44.761  17.207  48.933  1.00 40.00           N  
+ATOM   3462  CA  GLU C  65     -43.499  17.854  49.303  1.00 40.00           C  
+ATOM   3463  C   GLU C  65     -43.231  17.805  50.818  1.00 40.00           C  
+ATOM   3464  O   GLU C  65     -42.460  18.612  51.354  1.00 40.00           O  
+ATOM   3465  CB  GLU C  65     -43.449  19.306  48.814  1.00 40.00           C  
+ATOM   3466  CG  GLU C  65     -43.635  19.518  47.320  1.00 40.00           C  
+ATOM   3467  CD  GLU C  65     -43.610  20.998  46.938  1.00 40.00           C  
+ATOM   3468  OE1 GLU C  65     -42.513  21.599  46.914  1.00 40.00           O  
+ATOM   3469  OE2 GLU C  65     -44.687  21.571  46.660  1.00 40.00           O  
+ATOM   3470  N   GLY C  66     -43.861  16.850  51.503  1.00 40.00           N  
+ATOM   3471  CA  GLY C  66     -43.715  16.711  52.951  1.00 40.00           C  
+ATOM   3472  C   GLY C  66     -44.311  17.906  53.655  1.00 40.00           C  
+ATOM   3473  O   GLY C  66     -44.203  18.040  54.877  1.00 40.00           O  
+ATOM   3474  N   LYS C  67     -44.951  18.768  52.864  1.00 40.00           N  
+ATOM   3475  CA  LYS C  67     -45.543  20.032  53.337  1.00 40.00           C  
+ATOM   3476  C   LYS C  67     -46.858  19.856  54.118  1.00 40.00           C  
+ATOM   3477  O   LYS C  67     -47.478  20.842  54.532  1.00 40.00           O  
+ATOM   3478  CB  LYS C  67     -45.752  21.023  52.167  1.00 40.00           C  
+ATOM   3479  CG  LYS C  67     -44.493  21.752  51.715  1.00 40.00           C  
+ATOM   3480  CD  LYS C  67     -44.784  22.851  50.705  1.00 40.00           C  
+ATOM   3481  CE  LYS C  67     -43.497  23.583  50.353  1.00 40.00           C  
+ATOM   3482  NZ  LYS C  67     -43.700  24.661  49.351  1.00 40.00           N  
+ATOM   3483  N   ILE C  68     -47.281  18.608  54.305  1.00 40.00           N  
+ATOM   3484  CA  ILE C  68     -48.496  18.318  55.042  1.00 40.00           C  
+ATOM   3485  C   ILE C  68     -48.251  17.161  56.003  1.00 40.00           C  
+ATOM   3486  O   ILE C  68     -48.615  16.029  55.700  1.00 40.00           O  
+ATOM   3487  CB  ILE C  68     -49.655  18.004  54.089  1.00 40.00           C  
+ATOM   3488  CG1 ILE C  68     -49.877  19.194  53.156  1.00 40.00           C  
+ATOM   3489  CG2 ILE C  68     -50.904  17.700  54.890  1.00 40.00           C  
+ATOM   3490  CD1 ILE C  68     -50.796  18.942  51.986  1.00 40.00           C  
+ATOM   3491  N   PRO C  69     -47.626  17.443  57.168  1.00 40.00           N  
+ATOM   3492  CA  PRO C  69     -47.273  16.400  58.136  1.00 40.00           C  
+ATOM   3493  C   PRO C  69     -48.516  15.832  58.800  1.00 40.00           C  
+ATOM   3494  O   PRO C  69     -48.785  16.111  59.972  1.00 40.00           O  
+ATOM   3495  CB  PRO C  69     -46.394  17.138  59.157  1.00 40.00           C  
+ATOM   3496  CG  PRO C  69     -46.870  18.544  59.101  1.00 40.00           C  
+ATOM   3497  CD  PRO C  69     -47.282  18.788  57.669  1.00 40.00           C  
+ATOM   3498  N   TYR C  70     -49.266  15.044  58.034  1.00 40.00           N  
+ATOM   3499  CA  TYR C  70     -50.494  14.444  58.528  1.00 40.00           C  
+ATOM   3500  C   TYR C  70     -50.218  13.312  59.482  1.00 40.00           C  
+ATOM   3501  O   TYR C  70     -49.094  12.825  59.593  1.00 40.00           O  
+ATOM   3502  CB  TYR C  70     -51.425  13.985  57.390  1.00 40.00           C  
+ATOM   3503  CG  TYR C  70     -50.918  12.876  56.477  1.00 40.00           C  
+ATOM   3504  CD1 TYR C  70     -51.317  11.556  56.657  1.00 40.00           C  
+ATOM   3505  CD2 TYR C  70     -50.083  13.162  55.396  1.00 40.00           C  
+ATOM   3506  CE1 TYR C  70     -50.873  10.550  55.809  1.00 40.00           C  
+ATOM   3507  CE2 TYR C  70     -49.636  12.163  54.543  1.00 40.00           C  
+ATOM   3508  CZ  TYR C  70     -50.038  10.865  54.755  1.00 40.00           C  
+ATOM   3509  OH  TYR C  70     -49.591   9.887  53.909  1.00 40.00           O  
+ATOM   3510  N   ARG C  71     -51.261  12.908  60.181  1.00 40.00           N  
+ATOM   3511  CA  ARG C  71     -51.132  11.818  61.096  1.00 40.00           C  
+ATOM   3512  C   ARG C  71     -52.317  10.864  60.965  1.00 40.00           C  
+ATOM   3513  O   ARG C  71     -53.437  11.260  60.625  1.00 40.00           O  
+ATOM   3514  CB  ARG C  71     -50.921  12.342  62.520  1.00 40.00           C  
+ATOM   3515  CG  ARG C  71     -49.958  11.516  63.371  1.00 40.00           C  
+ATOM   3516  CD  ARG C  71     -48.494  11.578  62.915  1.00 40.00           C  
+ATOM   3517  NE  ARG C  71     -47.780  12.796  63.329  1.00 40.00           N  
+ATOM   3518  CZ  ARG C  71     -47.215  13.002  64.528  1.00 40.00           C  
+ATOM   3519  NH1 ARG C  71     -47.280  12.081  65.489  1.00 40.00           N  
+ATOM   3520  NH2 ARG C  71     -46.588  14.152  64.782  1.00 40.00           N  
+ATOM   3521  N   GLU C  72     -52.018   9.597  61.223  1.00 40.00           N  
+ATOM   3522  CA  GLU C  72     -52.904   8.477  60.988  1.00 40.00           C  
+ATOM   3523  C   GLU C  72     -54.313   8.727  61.481  1.00 40.00           C  
+ATOM   3524  O   GLU C  72     -54.547   8.848  62.683  1.00 40.00           O  
+ATOM   3525  CB  GLU C  72     -52.336   7.229  61.662  1.00 40.00           C  
+ATOM   3526  CG  GLU C  72     -51.081   6.668  61.002  1.00 40.00           C  
+ATOM   3527  CD  GLU C  72     -49.790   7.381  61.402  1.00 40.00           C  
+ATOM   3528  OE1 GLU C  72     -49.816   8.160  62.383  1.00 40.00           O  
+ATOM   3529  OE2 GLU C  72     -48.737   7.150  60.744  1.00 40.00           O  
+ATOM   3530  N   GLY C  73     -55.247   8.810  60.540  1.00 40.00           N  
+ATOM   3531  CA  GLY C  73     -56.665   8.884  60.870  1.00 40.00           C  
+ATOM   3532  C   GLY C  73     -57.318  10.129  60.329  1.00 40.00           C  
+ATOM   3533  O   GLY C  73     -58.551  10.237  60.251  1.00 40.00           O  
+ATOM   3534  N   GLN C  74     -56.483  11.078  59.948  1.00 40.00           N  
+ATOM   3535  CA  GLN C  74     -56.991  12.319  59.419  1.00 40.00           C  
+ATOM   3536  C   GLN C  74     -57.663  12.097  58.074  1.00 40.00           C  
+ATOM   3537  O   GLN C  74     -57.856  10.964  57.632  1.00 40.00           O  
+ATOM   3538  CB  GLN C  74     -55.884  13.362  59.355  1.00 40.00           C  
+ATOM   3539  CG  GLN C  74     -55.479  13.831  60.738  1.00 40.00           C  
+ATOM   3540  CD  GLN C  74     -54.476  14.950  60.695  1.00 40.00           C  
+ATOM   3541  OE1 GLN C  74     -53.327  14.750  60.299  1.00 40.00           O  
+ATOM   3542  NE2 GLN C  74     -54.897  16.139  61.118  1.00 40.00           N  
+ATOM   3543  N   SER C  75     -58.048  13.193  57.449  1.00 40.00           N  
+ATOM   3544  CA  SER C  75     -58.818  13.155  56.237  1.00 40.00           C  
+ATOM   3545  C   SER C  75     -58.419  14.432  55.534  1.00 40.00           C  
+ATOM   3546  O   SER C  75     -57.978  15.372  56.194  1.00 40.00           O  
+ATOM   3547  CB  SER C  75     -60.306  13.178  56.585  1.00 40.00           C  
+ATOM   3548  OG  SER C  75     -60.566  12.573  57.851  1.00 40.00           O  
+ATOM   3549  N   ILE C  76     -58.530  14.490  54.210  1.00 40.00           N  
+ATOM   3550  CA  ILE C  76     -58.253  15.771  53.533  1.00 40.00           C  
+ATOM   3551  C   ILE C  76     -59.353  16.315  52.630  1.00 40.00           C  
+ATOM   3552  O   ILE C  76     -60.336  15.631  52.310  1.00 40.00           O  
+ATOM   3553  CB  ILE C  76     -56.908  15.813  52.770  1.00 40.00           C  
+ATOM   3554  CG1 ILE C  76     -56.843  14.726  51.688  1.00 40.00           C  
+ATOM   3555  CG2 ILE C  76     -55.745  15.729  53.741  1.00 40.00           C  
+ATOM   3556  CD1 ILE C  76     -55.962  15.094  50.504  1.00 40.00           C  
+ATOM   3557  N   GLY C  77     -59.153  17.562  52.224  1.00 40.00           N  
+ATOM   3558  CA  GLY C  77     -60.093  18.231  51.372  1.00 40.00           C  
+ATOM   3559  C   GLY C  77     -59.632  18.239  49.935  1.00 40.00           C  
+ATOM   3560  O   GLY C  77     -58.426  18.292  49.641  1.00 40.00           O  
+ATOM   3561  N   VAL C  78     -60.621  18.173  49.045  1.00 40.00           N  
+ATOM   3562  CA  VAL C  78     -60.398  18.236  47.615  1.00 40.00           C  
+ATOM   3563  C   VAL C  78     -61.353  19.244  46.996  1.00 40.00           C  
+ATOM   3564  O   VAL C  78     -62.579  19.092  47.053  1.00 40.00           O  
+ATOM   3565  CB  VAL C  78     -60.586  16.858  46.951  1.00 40.00           C  
+ATOM   3566  CG1 VAL C  78     -60.445  16.967  45.443  1.00 40.00           C  
+ATOM   3567  CG2 VAL C  78     -59.570  15.861  47.484  1.00 40.00           C  
+ATOM   3568  N   ILE C  79     -60.766  20.288  46.428  1.00 40.00           N  
+ATOM   3569  CA  ILE C  79     -61.492  21.203  45.568  1.00 40.00           C  
+ATOM   3570  C   ILE C  79     -61.450  20.629  44.140  1.00 40.00           C  
+ATOM   3571  O   ILE C  79     -60.380  20.617  43.487  1.00 40.00           O  
+ATOM   3572  CB  ILE C  79     -60.910  22.641  45.631  1.00 40.00           C  
+ATOM   3573  CG1 ILE C  79     -60.945  23.163  47.083  1.00 40.00           C  
+ATOM   3574  CG2 ILE C  79     -61.654  23.580  44.671  1.00 40.00           C  
+ATOM   3575  CD1 ILE C  79     -59.961  24.277  47.402  1.00 40.00           C  
+ATOM   3576  N   ALA C  80     -62.615  20.126  43.691  1.00 40.00           N  
+ATOM   3577  CA  ALA C  80     -62.832  19.603  42.320  1.00 40.00           C  
+ATOM   3578  C   ALA C  80     -62.685  20.693  41.249  1.00 40.00           C  
+ATOM   3579  O   ALA C  80     -63.093  21.850  41.454  1.00 40.00           O  
+ATOM   3580  CB  ALA C  80     -64.200  18.933  42.211  1.00 40.00           C  
+ATOM   3581  N   ASP C  81     -62.102  20.329  40.108  1.00 40.00           N  
+ATOM   3582  CA  ASP C  81     -61.849  21.309  39.051  1.00 40.00           C  
+ATOM   3583  C   ASP C  81     -63.120  21.725  38.320  1.00 40.00           C  
+ATOM   3584  O   ASP C  81     -64.010  20.902  38.088  1.00 40.00           O  
+ATOM   3585  CB  ASP C  81     -60.772  20.818  38.084  1.00 40.00           C  
+ATOM   3586  CG  ASP C  81     -59.353  21.053  38.614  1.00 40.00           C  
+ATOM   3587  OD1 ASP C  81     -59.174  21.320  39.834  1.00 40.00           O  
+ATOM   3588  OD2 ASP C  81     -58.406  20.971  37.799  1.00 40.00           O  
+ATOM   3589  N   GLY C  82     -63.194  23.012  37.981  1.00 40.00           N  
+ATOM   3590  CA  GLY C  82     -64.398  23.599  37.405  1.00 40.00           C  
+ATOM   3591  C   GLY C  82     -65.100  24.521  38.387  1.00 40.00           C  
+ATOM   3592  O   GLY C  82     -64.574  24.795  39.482  1.00 40.00           O  
+ATOM   3593  N   VAL C  83     -66.285  25.001  37.990  1.00 40.00           N  
+ATOM   3594  CA  VAL C  83     -67.094  25.921  38.813  1.00 40.00           C  
+ATOM   3595  C   VAL C  83     -68.561  25.462  38.916  1.00 40.00           C  
+ATOM   3596  O   VAL C  83     -69.039  24.665  38.088  1.00 40.00           O  
+ATOM   3597  CB  VAL C  83     -66.981  27.400  38.333  1.00 40.00           C  
+ATOM   3598  CG1 VAL C  83     -65.600  27.987  38.654  1.00 40.00           C  
+ATOM   3599  CG2 VAL C  83     -67.299  27.525  36.846  1.00 40.00           C  
+ATOM   3600  N   ASP C  84     -69.255  25.933  39.952  1.00 40.00           N  
+ATOM   3601  CA  ASP C  84     -70.674  25.645  40.106  1.00 40.00           C  
+ATOM   3602  C   ASP C  84     -71.456  26.538  39.138  1.00 40.00           C  
+ATOM   3603  O   ASP C  84     -70.844  27.245  38.329  1.00 40.00           O  
+ATOM   3604  CB  ASP C  84     -71.117  25.852  41.564  1.00 40.00           C  
+ATOM   3605  CG  ASP C  84     -70.956  27.295  42.043  1.00 40.00           C  
+ATOM   3606  OD1 ASP C  84     -71.272  27.574  43.216  1.00 40.00           O  
+ATOM   3607  OD2 ASP C  84     -70.523  28.158  41.257  1.00 40.00           O  
+ATOM   3608  N   LYS C  85     -72.789  26.517  39.221  1.00 40.00           N  
+ATOM   3609  CA  LYS C  85     -73.635  27.398  38.400  1.00 40.00           C  
+ATOM   3610  C   LYS C  85     -73.283  28.893  38.501  1.00 40.00           C  
+ATOM   3611  O   LYS C  85     -73.508  29.639  37.544  1.00 40.00           O  
+ATOM   3612  CB  LYS C  85     -75.116  27.213  38.735  1.00 40.00           C  
+ATOM   3613  CG  LYS C  85     -75.462  27.436  40.204  1.00 40.00           C  
+ATOM   3614  CD  LYS C  85     -76.963  27.503  40.431  1.00 40.00           C  
+ATOM   3615  CE  LYS C  85     -77.680  26.403  39.669  1.00 40.00           C  
+ATOM   3616  NZ  LYS C  85     -76.907  25.123  39.643  1.00 40.00           N  
+ATOM   3617  N   ASN C  86     -72.738  29.321  39.648  1.00 40.00           N  
+ATOM   3618  CA  ASN C  86     -72.501  30.752  39.942  1.00 40.00           C  
+ATOM   3619  C   ASN C  86     -71.091  31.275  39.634  1.00 40.00           C  
+ATOM   3620  O   ASN C  86     -70.720  32.356  40.114  1.00 40.00           O  
+ATOM   3621  CB  ASN C  86     -72.836  31.067  41.413  1.00 40.00           C  
+ATOM   3622  CG  ASN C  86     -74.321  30.932  41.738  1.00 40.00           C  
+ATOM   3623  OD1 ASN C  86     -74.751  31.265  42.844  1.00 40.00           O  
+ATOM   3624  ND2 ASN C  86     -75.109  30.444  40.788  1.00 40.00           N  
+ATOM   3625  N   GLY C  87     -70.318  30.519  38.845  1.00 40.00           N  
+ATOM   3626  CA  GLY C  87     -68.917  30.852  38.543  1.00 40.00           C  
+ATOM   3627  C   GLY C  87     -67.984  30.576  39.714  1.00 40.00           C  
+ATOM   3628  O   GLY C  87     -66.763  30.802  39.620  1.00 40.00           O  
+ATOM   3629  N   LYS C  88     -68.571  30.078  40.811  1.00 40.00           N  
+ATOM   3630  CA  LYS C  88     -67.872  29.807  42.082  1.00 40.00           C  
+ATOM   3631  C   LYS C  88     -67.287  28.396  42.136  1.00 40.00           C  
+ATOM   3632  O   LYS C  88     -67.866  27.460  41.548  1.00 40.00           O  
+ATOM   3633  CB  LYS C  88     -68.820  29.989  43.273  1.00 40.00           C  
+ATOM   3634  CG  LYS C  88     -69.113  31.431  43.605  1.00 40.00           C  
+ATOM   3635  CD  LYS C  88     -70.344  31.516  44.478  1.00 40.00           C  
+ATOM   3636  CE  LYS C  88     -70.882  32.939  44.517  1.00 40.00           C  
+ATOM   3637  NZ  LYS C  88     -72.018  33.029  45.479  1.00 40.00           N  
+ATOM   3638  N   PRO C  89     -66.157  28.230  42.872  1.00 40.00           N  
+ATOM   3639  CA  PRO C  89     -65.567  26.886  43.012  1.00 40.00           C  
+ATOM   3640  C   PRO C  89     -66.623  25.859  43.460  1.00 40.00           C  
+ATOM   3641  O   PRO C  89     -67.716  26.242  43.902  1.00 40.00           O  
+ATOM   3642  CB  PRO C  89     -64.494  27.069  44.109  1.00 40.00           C  
+ATOM   3643  CG  PRO C  89     -64.242  28.541  44.206  1.00 40.00           C  
+ATOM   3644  CD  PRO C  89     -65.473  29.246  43.709  1.00 40.00           C  
+ATOM   3645  N   HIS C  90     -66.319  24.569  43.332  1.00 40.00           N  
+ATOM   3646  CA  HIS C  90     -67.167  23.541  43.954  1.00 40.00           C  
+ATOM   3647  C   HIS C  90     -66.859  23.514  45.433  1.00 40.00           C  
+ATOM   3648  O   HIS C  90     -65.870  24.140  45.869  1.00 40.00           O  
+ATOM   3649  CB  HIS C  90     -66.963  22.167  43.298  1.00 40.00           C  
+ATOM   3650  CG  HIS C  90     -67.302  22.136  41.812  1.00 40.00           C  
+ATOM   3651  ND1 HIS C  90     -68.560  22.339  41.341  1.00 40.00           N  
+ATOM   3652  CD2 HIS C  90     -66.492  21.917  40.685  1.00 40.00           C  
+ATOM   3653  CE1 HIS C  90     -68.556  22.259  39.985  1.00 40.00           C  
+ATOM   3654  NE2 HIS C  90     -67.291  22.001  39.585  1.00 40.00           N  
+ATOM   3655  N   LYS C  91     -67.691  22.823  46.225  1.00 40.00           N  
+ATOM   3656  CA  LYS C  91     -67.492  22.772  47.687  1.00 40.00           C  
+ATOM   3657  C   LYS C  91     -66.598  21.591  48.136  1.00 40.00           C  
+ATOM   3658  O   LYS C  91     -66.630  20.505  47.534  1.00 40.00           O  
+ATOM   3659  CB  LYS C  91     -68.835  22.802  48.440  1.00 40.00           C  
+ATOM   3660  CG  LYS C  91     -68.801  23.579  49.757  1.00 40.00           C  
+ATOM   3661  CD  LYS C  91     -69.083  25.064  49.582  1.00 40.00           C  
+ATOM   3662  CE  LYS C  91     -70.561  25.357  49.794  1.00 40.00           C  
+ATOM   3663  NZ  LYS C  91     -70.916  26.599  49.069  1.00 40.00           N  
+ATOM   3664  N   VAL C  92     -65.792  21.842  49.175  1.00 40.00           N  
+ATOM   3665  CA  VAL C  92     -64.818  20.885  49.728  1.00 40.00           C  
+ATOM   3666  C   VAL C  92     -65.476  19.538  50.079  1.00 40.00           C  
+ATOM   3667  O   VAL C  92     -66.387  19.487  50.905  1.00 40.00           O  
+ATOM   3668  CB  VAL C  92     -64.083  21.500  50.962  1.00 40.00           C  
+ATOM   3669  CG1 VAL C  92     -63.308  20.452  51.751  1.00 40.00           C  
+ATOM   3670  CG2 VAL C  92     -63.150  22.630  50.535  1.00 40.00           C  
+ATOM   3671  N   ARG C  93     -65.039  18.461  49.420  1.00 40.00           N  
+ATOM   3672  CA  ARG C  93     -65.430  17.104  49.822  1.00 40.00           C  
+ATOM   3673  C   ARG C  93     -64.326  16.477  50.632  1.00 40.00           C  
+ATOM   3674  O   ARG C  93     -63.135  16.742  50.392  1.00 40.00           O  
+ATOM   3675  CB  ARG C  93     -65.727  16.205  48.626  1.00 40.00           C  
+ATOM   3676  CG  ARG C  93     -67.182  16.165  48.220  1.00 40.00           C  
+ATOM   3677  CD  ARG C  93     -67.582  17.501  47.644  1.00 40.00           C  
+ATOM   3678  NE  ARG C  93     -68.656  17.371  46.685  1.00 40.00           N  
+ATOM   3679  CZ  ARG C  93     -69.167  18.391  46.025  1.00 40.00           C  
+ATOM   3680  NH1 ARG C  93     -68.691  19.612  46.226  1.00 40.00           N  
+ATOM   3681  NH2 ARG C  93     -70.150  18.187  45.168  1.00 40.00           N  
+ATOM   3682  N   LEU C  94     -64.722  15.628  51.578  1.00 40.00           N  
+ATOM   3683  CA  LEU C  94     -63.765  15.059  52.502  1.00 40.00           C  
+ATOM   3684  C   LEU C  94     -63.605  13.577  52.319  1.00 40.00           C  
+ATOM   3685  O   LEU C  94     -64.557  12.851  52.075  1.00 40.00           O  
+ATOM   3686  CB  LEU C  94     -64.139  15.378  53.941  1.00 40.00           C  
+ATOM   3687  CG  LEU C  94     -64.083  16.863  54.308  1.00 40.00           C  
+ATOM   3688  CD1 LEU C  94     -64.493  17.025  55.762  1.00 40.00           C  
+ATOM   3689  CD2 LEU C  94     -62.714  17.491  54.044  1.00 40.00           C  
+ATOM   3690  N   TYR C  95     -62.361  13.146  52.421  1.00 40.00           N  
+ATOM   3691  CA  TYR C  95     -62.038  11.759  52.260  1.00 40.00           C  
+ATOM   3692  C   TYR C  95     -60.956  11.412  53.240  1.00 40.00           C  
+ATOM   3693  O   TYR C  95     -59.986  12.149  53.419  1.00 40.00           O  
+ATOM   3694  CB  TYR C  95     -61.586  11.488  50.831  1.00 40.00           C  
+ATOM   3695  CG  TYR C  95     -62.625  11.881  49.811  1.00 40.00           C  
+ATOM   3696  CD1 TYR C  95     -63.527  10.944  49.333  1.00 40.00           C  
+ATOM   3697  CD2 TYR C  95     -62.715  13.198  49.337  1.00 40.00           C  
+ATOM   3698  CE1 TYR C  95     -64.477  11.291  48.397  1.00 40.00           C  
+ATOM   3699  CE2 TYR C  95     -63.672  13.558  48.410  1.00 40.00           C  
+ATOM   3700  CZ  TYR C  95     -64.556  12.601  47.953  1.00 40.00           C  
+ATOM   3701  OH  TYR C  95     -65.507  12.953  47.029  1.00 40.00           O  
+ATOM   3702  N   SER C  96     -61.153  10.275  53.883  1.00 40.00           N  
+ATOM   3703  CA  SER C  96     -60.253   9.802  54.908  1.00 40.00           C  
+ATOM   3704  C   SER C  96     -58.941   9.395  54.280  1.00 40.00           C  
+ATOM   3705  O   SER C  96     -58.935   8.747  53.235  1.00 40.00           O  
+ATOM   3706  CB  SER C  96     -60.878   8.598  55.574  1.00 40.00           C  
+ATOM   3707  OG  SER C  96     -62.283   8.745  55.574  1.00 40.00           O  
+ATOM   3708  N   ILE C  97     -57.829   9.775  54.914  1.00 40.00           N  
+ATOM   3709  CA  ILE C  97     -56.496   9.520  54.351  1.00 40.00           C  
+ATOM   3710  C   ILE C  97     -56.134   8.053  54.457  1.00 40.00           C  
+ATOM   3711  O   ILE C  97     -56.182   7.454  55.530  1.00 40.00           O  
+ATOM   3712  CB  ILE C  97     -55.386  10.380  54.989  1.00 40.00           C  
+ATOM   3713  CG1 ILE C  97     -55.650  11.866  54.750  1.00 40.00           C  
+ATOM   3714  CG2 ILE C  97     -54.026  10.008  54.413  1.00 40.00           C  
+ATOM   3715  CD1 ILE C  97     -54.966  12.771  55.754  1.00 40.00           C  
+ATOM   3716  N   ALA C  98     -55.765   7.496  53.314  1.00 40.00           N  
+ATOM   3717  CA  ALA C  98     -55.528   6.077  53.180  1.00 40.00           C  
+ATOM   3718  C   ALA C  98     -54.106   5.704  53.512  1.00 40.00           C  
+ATOM   3719  O   ALA C  98     -53.882   4.598  53.990  1.00 40.00           O  
+ATOM   3720  CB  ALA C  98     -55.872   5.614  51.778  1.00 40.00           C  
+ATOM   3721  N   SER C  99     -53.149   6.605  53.256  1.00 40.00           N  
+ATOM   3722  CA  SER C  99     -51.732   6.324  53.557  1.00 40.00           C  
+ATOM   3723  C   SER C  99     -51.344   6.638  54.991  1.00 40.00           C  
+ATOM   3724  O   SER C  99     -51.957   7.481  55.631  1.00 40.00           O  
+ATOM   3725  CB  SER C  99     -50.784   7.054  52.601  1.00 40.00           C  
+ATOM   3726  OG  SER C  99     -51.127   8.418  52.466  1.00 40.00           O  
+ATOM   3727  N   SER C 100     -50.318   5.948  55.483  1.00 40.00           N  
+ATOM   3728  CA  SER C 100     -49.759   6.222  56.800  1.00 40.00           C  
+ATOM   3729  C   SER C 100     -49.026   7.559  56.769  1.00 40.00           C  
+ATOM   3730  O   SER C 100     -48.942   8.187  55.722  1.00 40.00           O  
+ATOM   3731  CB  SER C 100     -48.801   5.110  57.231  1.00 40.00           C  
+ATOM   3732  OG  SER C 100     -47.504   5.324  56.695  1.00 40.00           O  
+ATOM   3733  N   ALA C 101     -48.488   7.979  57.913  1.00 40.00           N  
+ATOM   3734  CA  ALA C 101     -47.779   9.251  58.020  1.00 40.00           C  
+ATOM   3735  C   ALA C 101     -46.694   9.323  56.963  1.00 40.00           C  
+ATOM   3736  O   ALA C 101     -46.478  10.346  56.295  1.00 40.00           O  
+ATOM   3737  CB  ALA C 101     -47.171   9.392  59.409  1.00 40.00           C  
+ATOM   3738  N   ILE C 102     -46.042   8.188  56.798  1.00 40.00           N  
+ATOM   3739  CA  ILE C 102     -44.836   8.110  56.035  1.00 40.00           C  
+ATOM   3740  C   ILE C 102     -45.143   8.036  54.563  1.00 40.00           C  
+ATOM   3741  O   ILE C 102     -44.246   8.141  53.736  1.00 40.00           O  
+ATOM   3742  CB  ILE C 102     -44.042   6.882  56.452  1.00 40.00           C  
+ATOM   3743  CG1 ILE C 102     -44.290   6.571  57.938  1.00 40.00           C  
+ATOM   3744  CG2 ILE C 102     -42.571   7.103  56.158  1.00 40.00           C  
+ATOM   3745  CD1 ILE C 102     -43.875   7.669  58.909  1.00 40.00           C  
+ATOM   3746  N   GLY C 103     -46.422   7.868  54.245  1.00 40.00           N  
+ATOM   3747  CA  GLY C 103     -46.882   7.718  52.859  1.00 40.00           C  
+ATOM   3748  C   GLY C 103     -46.785   6.282  52.373  1.00 40.00           C  
+ATOM   3749  O   GLY C 103     -46.257   5.407  53.071  1.00 40.00           O  
+ATOM   3750  N   ASP C 104     -47.297   6.039  51.172  1.00 40.00           N  
+ATOM   3751  CA  ASP C 104     -47.193   4.718  50.567  1.00 40.00           C  
+ATOM   3752  C   ASP C 104     -45.744   4.399  50.178  1.00 40.00           C  
+ATOM   3753  O   ASP C 104     -45.348   3.231  50.083  1.00 40.00           O  
+ATOM   3754  CB  ASP C 104     -48.112   4.619  49.341  1.00 40.00           C  
+ATOM   3755  CG  ASP C 104     -49.583   4.416  49.712  1.00 40.00           C  
+ATOM   3756  OD1 ASP C 104     -49.867   3.911  50.824  1.00 40.00           O  
+ATOM   3757  OD2 ASP C 104     -50.453   4.747  48.873  1.00 40.00           O  
+ATOM   3758  N   PHE C 105     -44.954   5.439  49.953  1.00 40.00           N  
+ATOM   3759  CA  PHE C 105     -43.575   5.224  49.577  1.00 40.00           C  
+ATOM   3760  C   PHE C 105     -42.676   5.273  50.789  1.00 40.00           C  
+ATOM   3761  O   PHE C 105     -41.497   4.974  50.686  1.00 40.00           O  
+ATOM   3762  CB  PHE C 105     -43.137   6.230  48.523  1.00 40.00           C  
+ATOM   3763  CG  PHE C 105     -44.126   6.389  47.420  1.00 40.00           C  
+ATOM   3764  CD1 PHE C 105     -44.842   5.291  46.960  1.00 40.00           C  
+ATOM   3765  CD2 PHE C 105     -44.347   7.632  46.840  1.00 40.00           C  
+ATOM   3766  CE1 PHE C 105     -45.771   5.429  45.950  1.00 40.00           C  
+ATOM   3767  CE2 PHE C 105     -45.274   7.783  45.824  1.00 40.00           C  
+ATOM   3768  CZ  PHE C 105     -45.986   6.677  45.378  1.00 40.00           C  
+ATOM   3769  N   GLY C 106     -43.237   5.635  51.938  1.00 40.00           N  
+ATOM   3770  CA  GLY C 106     -42.481   5.658  53.181  1.00 40.00           C  
+ATOM   3771  C   GLY C 106     -41.452   6.768  53.249  1.00 40.00           C  
+ATOM   3772  O   GLY C 106     -40.399   6.608  53.852  1.00 40.00           O  
+ATOM   3773  N   ASP C 107     -41.757   7.904  52.640  1.00 40.00           N  
+ATOM   3774  CA  ASP C 107     -40.829   9.024  52.630  1.00 40.00           C  
+ATOM   3775  C   ASP C 107     -41.482  10.356  53.058  1.00 40.00           C  
+ATOM   3776  O   ASP C 107     -40.839  11.405  53.023  1.00 40.00           O  
+ATOM   3777  CB  ASP C 107     -40.213   9.151  51.244  1.00 40.00           C  
+ATOM   3778  CG  ASP C 107     -41.191   9.674  50.233  1.00 40.00           C  
+ATOM   3779  OD1 ASP C 107     -42.376   9.274  50.268  1.00 40.00           O  
+ATOM   3780  OD2 ASP C 107     -40.773  10.501  49.407  1.00 40.00           O  
+ATOM   3781  N   SER C 108     -42.759  10.298  53.444  1.00 40.00           N  
+ATOM   3782  CA  SER C 108     -43.532  11.439  53.977  1.00 40.00           C  
+ATOM   3783  C   SER C 108     -43.690  12.642  53.045  1.00 40.00           C  
+ATOM   3784  O   SER C 108     -43.845  13.766  53.504  1.00 40.00           O  
+ATOM   3785  CB  SER C 108     -42.980  11.883  55.332  1.00 40.00           C  
+ATOM   3786  OG  SER C 108     -43.020  10.817  56.257  1.00 40.00           O  
+ATOM   3787  N   LYS C 109     -43.662  12.392  51.741  1.00 40.00           N  
+ATOM   3788  CA  LYS C 109     -43.883  13.425  50.728  1.00 40.00           C  
+ATOM   3789  C   LYS C 109     -45.135  13.069  49.935  1.00 40.00           C  
+ATOM   3790  O   LYS C 109     -45.340  13.527  48.800  1.00 40.00           O  
+ATOM   3791  CB  LYS C 109     -42.681  13.506  49.784  1.00 40.00           C  
+ATOM   3792  CG  LYS C 109     -41.320  13.620  50.467  1.00 40.00           C  
+ATOM   3793  CD  LYS C 109     -41.206  14.897  51.286  1.00 40.00           C  
+ATOM   3794  CE  LYS C 109     -39.765  15.283  51.606  1.00 40.00           C  
+ATOM   3795  NZ  LYS C 109     -39.043  15.920  50.463  1.00 40.00           N  
+ATOM   3796  N   THR C 110     -45.974  12.253  50.569  1.00 40.00           N  
+ATOM   3797  CA  THR C 110     -47.022  11.510  49.884  1.00 40.00           C  
+ATOM   3798  C   THR C 110     -48.230  11.251  50.766  1.00 40.00           C  
+ATOM   3799  O   THR C 110     -48.094  10.810  51.911  1.00 40.00           O  
+ATOM   3800  CB  THR C 110     -46.525  10.123  49.445  1.00 40.00           C  
+ATOM   3801  OG1 THR C 110     -46.372   9.284  50.597  1.00 40.00           O  
+ATOM   3802  CG2 THR C 110     -45.210  10.232  48.691  1.00 40.00           C  
+ATOM   3803  N   VAL C 111     -49.406  11.501  50.195  1.00 40.00           N  
+ATOM   3804  CA  VAL C 111     -50.676  11.213  50.834  1.00 40.00           C  
+ATOM   3805  C   VAL C 111     -51.491  10.294  49.945  1.00 40.00           C  
+ATOM   3806  O   VAL C 111     -51.388  10.370  48.723  1.00 40.00           O  
+ATOM   3807  CB  VAL C 111     -51.476  12.494  51.033  1.00 40.00           C  
+ATOM   3808  CG1 VAL C 111     -51.933  13.046  49.688  1.00 40.00           C  
+ATOM   3809  CG2 VAL C 111     -52.661  12.227  51.943  1.00 40.00           C  
+ATOM   3810  N   SER C 112     -52.319   9.451  50.551  1.00 40.00           N  
+ATOM   3811  CA  SER C 112     -53.117   8.502  49.786  1.00 40.00           C  
+ATOM   3812  C   SER C 112     -54.588   8.528  50.161  1.00 40.00           C  
+ATOM   3813  O   SER C 112     -54.921   8.607  51.333  1.00 40.00           O  
+ATOM   3814  CB  SER C 112     -52.547   7.105  49.950  1.00 40.00           C  
+ATOM   3815  OG  SER C 112     -51.143   7.136  49.734  1.00 40.00           O  
+ATOM   3816  N   LEU C 113     -55.454   8.460  49.149  1.00 40.00           N  
+ATOM   3817  CA  LEU C 113     -56.898   8.522  49.338  1.00 40.00           C  
+ATOM   3818  C   LEU C 113     -57.582   7.298  48.807  1.00 40.00           C  
+ATOM   3819  O   LEU C 113     -57.065   6.627  47.919  1.00 40.00           O  
+ATOM   3820  CB  LEU C 113     -57.465   9.700  48.579  1.00 40.00           C  
+ATOM   3821  CG  LEU C 113     -57.290  11.028  49.267  1.00 40.00           C  
+ATOM   3822  CD1 LEU C 113     -57.924  12.110  48.408  1.00 40.00           C  
+ATOM   3823  CD2 LEU C 113     -57.958  10.912  50.619  1.00 40.00           C  
+ATOM   3824  N   CYS C 114     -58.768   7.030  49.332  1.00 40.00           N  
+ATOM   3825  CA  CYS C 114     -59.589   5.950  48.817  1.00 40.00           C  
+ATOM   3826  C   CYS C 114     -60.936   6.513  48.395  1.00 40.00           C  
+ATOM   3827  O   CYS C 114     -61.679   7.053  49.220  1.00 40.00           O  
+ATOM   3828  CB  CYS C 114     -59.755   4.849  49.857  1.00 40.00           C  
+ATOM   3829  SG  CYS C 114     -60.695   3.413  49.274  1.00 40.00           S  
+ATOM   3830  N   VAL C 115     -61.231   6.401  47.100  1.00 40.00           N  
+ATOM   3831  CA  VAL C 115     -62.420   7.031  46.518  1.00 40.00           C  
+ATOM   3832  C   VAL C 115     -63.275   6.105  45.652  1.00 40.00           C  
+ATOM   3833  O   VAL C 115     -62.808   5.511  44.665  1.00 40.00           O  
+ATOM   3834  CB  VAL C 115     -62.072   8.279  45.680  1.00 40.00           C  
+ATOM   3835  CG1 VAL C 115     -63.307   9.157  45.504  1.00 40.00           C  
+ATOM   3836  CG2 VAL C 115     -60.947   9.066  46.333  1.00 40.00           C  
+ATOM   3837  N   LYS C 116     -64.545   6.012  46.038  1.00 40.00           N  
+ATOM   3838  CA  LYS C 116     -65.562   5.345  45.242  1.00 40.00           C  
+ATOM   3839  C   LYS C 116     -66.220   6.392  44.345  1.00 40.00           C  
+ATOM   3840  O   LYS C 116     -66.573   7.493  44.792  1.00 40.00           O  
+ATOM   3841  CB  LYS C 116     -66.598   4.672  46.145  1.00 40.00           C  
+ATOM   3842  CG  LYS C 116     -67.550   3.739  45.423  1.00 40.00           C  
+ATOM   3843  CD  LYS C 116     -68.898   3.755  46.123  1.00 40.00           C  
+ATOM   3844  CE  LYS C 116     -70.031   3.252  45.235  1.00 40.00           C  
+ATOM   3845  NZ  LYS C 116     -70.175   1.775  45.339  1.00 40.00           N  
+ATOM   3846  N   ARG C 117     -66.352   6.034  43.074  1.00 40.00           N  
+ATOM   3847  CA  ARG C 117     -67.003   6.863  42.080  1.00 40.00           C  
+ATOM   3848  C   ARG C 117     -68.522   6.864  42.333  1.00 40.00           C  
+ATOM   3849  O   ARG C 117     -69.210   5.845  42.142  1.00 40.00           O  
+ATOM   3850  CB  ARG C 117     -66.668   6.312  40.692  1.00 40.00           C  
+ATOM   3851  CG  ARG C 117     -66.724   7.322  39.568  1.00 40.00           C  
+ATOM   3852  CD  ARG C 117     -66.647   6.638  38.212  1.00 40.00           C  
+ATOM   3853  NE  ARG C 117     -65.278   6.494  37.728  1.00 40.00           N  
+ATOM   3854  CZ  ARG C 117     -64.612   7.434  37.066  1.00 40.00           C  
+ATOM   3855  NH1 ARG C 117     -65.181   8.599  36.819  1.00 40.00           N  
+ATOM   3856  NH2 ARG C 117     -63.371   7.213  36.656  1.00 40.00           N  
+ATOM   3857  N   LEU C 118     -69.033   8.002  42.798  1.00 40.00           N  
+ATOM   3858  CA  LEU C 118     -70.469   8.166  42.994  1.00 40.00           C  
+ATOM   3859  C   LEU C 118     -71.159   8.194  41.627  1.00 40.00           C  
+ATOM   3860  O   LEU C 118     -71.077   9.202  40.910  1.00 40.00           O  
+ATOM   3861  CB  LEU C 118     -70.771   9.448  43.799  1.00 40.00           C  
+ATOM   3862  CG  LEU C 118     -72.212   9.949  43.968  1.00 40.00           C  
+ATOM   3863  CD1 LEU C 118     -73.056   8.959  44.749  1.00 40.00           C  
+ATOM   3864  CD2 LEU C 118     -72.247  11.301  44.646  1.00 40.00           C  
+ATOM   3865  N   ILE C 119     -71.778   7.068  41.247  1.00 40.00           N  
+ATOM   3866  CA  ILE C 119     -72.764   7.035  40.128  1.00 40.00           C  
+ATOM   3867  C   ILE C 119     -74.029   6.213  40.487  1.00 40.00           C  
+ATOM   3868  O   ILE C 119     -73.936   5.009  40.798  1.00 40.00           O  
+ATOM   3869  CB  ILE C 119     -72.181   6.584  38.748  1.00 40.00           C  
+ATOM   3870  CG1 ILE C 119     -71.024   7.482  38.303  1.00 40.00           C  
+ATOM   3871  CG2 ILE C 119     -73.256   6.641  37.665  1.00 40.00           C  
+ATOM   3872  CD1 ILE C 119     -70.299   6.984  37.072  1.00 40.00           C  
+ATOM   3873  N   TYR C 120     -75.187   6.891  40.455  1.00 40.00           N  
+ATOM   3874  CA  TYR C 120     -76.525   6.289  40.653  1.00 40.00           C  
+ATOM   3875  C   TYR C 120     -77.437   6.617  39.455  1.00 40.00           C  
+ATOM   3876  O   TYR C 120     -77.104   7.493  38.644  1.00 40.00           O  
+ATOM   3877  CB  TYR C 120     -77.170   6.721  42.008  1.00 40.00           C  
+ATOM   3878  CG  TYR C 120     -77.278   8.235  42.308  1.00 40.00           C  
+ATOM   3879  CD1 TYR C 120     -76.156   8.983  42.708  1.00 40.00           C  
+ATOM   3880  CD2 TYR C 120     -78.515   8.909  42.241  1.00 40.00           C  
+ATOM   3881  CE1 TYR C 120     -76.251  10.353  42.993  1.00 40.00           C  
+ATOM   3882  CE2 TYR C 120     -78.617  10.282  42.526  1.00 40.00           C  
+ATOM   3883  CZ  TYR C 120     -77.486  10.999  42.906  1.00 40.00           C  
+ATOM   3884  OH  TYR C 120     -77.567  12.350  43.192  1.00 40.00           O  
+ATOM   3885  N   THR C 121     -78.551   5.883  39.324  1.00 40.00           N  
+ATOM   3886  CA  THR C 121     -79.678   6.254  38.419  1.00 40.00           C  
+ATOM   3887  C   THR C 121     -80.856   6.724  39.307  1.00 40.00           C  
+ATOM   3888  O   THR C 121     -81.221   6.002  40.241  1.00 40.00           O  
+ATOM   3889  CB  THR C 121     -80.086   5.077  37.459  1.00 40.00           C  
+ATOM   3890  OG1 THR C 121     -79.204   5.042  36.321  1.00 40.00           O  
+ATOM   3891  CG2 THR C 121     -81.548   5.189  36.956  1.00 40.00           C  
+ATOM   3892  N   ASN C 122     -81.409   7.925  39.061  1.00 40.00           N  
+ATOM   3893  CA  ASN C 122     -82.621   8.363  39.800  1.00 40.00           C  
+ATOM   3894  C   ASN C 122     -83.918   7.760  39.217  1.00 40.00           C  
+ATOM   3895  O   ASN C 122     -83.847   6.913  38.300  1.00 40.00           O  
+ATOM   3896  CB  ASN C 122     -82.687   9.902  40.100  1.00 40.00           C  
+ATOM   3897  CG  ASN C 122     -82.666  10.784  38.845  1.00 40.00           C  
+ATOM   3898  OD1 ASN C 122     -83.512  10.662  37.948  1.00 40.00           O  
+ATOM   3899  ND2 ASN C 122     -81.719  11.719  38.808  1.00 40.00           N  
+ATOM   3900  N   ASP C 123     -85.078   8.160  39.767  1.00 40.00           N  
+ATOM   3901  CA  ASP C 123     -86.413   7.640  39.324  1.00 40.00           C  
+ATOM   3902  C   ASP C 123     -86.874   8.015  37.882  1.00 40.00           C  
+ATOM   3903  O   ASP C 123     -87.813   7.394  37.330  1.00 40.00           O  
+ATOM   3904  CB  ASP C 123     -87.547   7.863  40.380  1.00 40.00           C  
+ATOM   3905  CG  ASP C 123     -87.508   9.260  41.090  1.00 40.00           C  
+ATOM   3906  OD1 ASP C 123     -86.823  10.227  40.649  1.00 40.00           O  
+ATOM   3907  OD2 ASP C 123     -88.212   9.376  42.124  1.00 40.00           O  
+ATOM   3908  N   ALA C 124     -86.193   9.014  37.297  1.00 40.00           N  
+ATOM   3909  CA  ALA C 124     -86.385   9.443  35.903  1.00 40.00           C  
+ATOM   3910  C   ALA C 124     -85.479   8.684  34.866  1.00 40.00           C  
+ATOM   3911  O   ALA C 124     -85.502   9.001  33.663  1.00 40.00           O  
+ATOM   3912  CB  ALA C 124     -86.250  10.974  35.797  1.00 40.00           C  
+ATOM   3913  N   GLY C 125     -84.725   7.671  35.333  1.00 40.00           N  
+ATOM   3914  CA  GLY C 125     -83.774   6.892  34.501  1.00 40.00           C  
+ATOM   3915  C   GLY C 125     -82.401   7.545  34.308  1.00 40.00           C  
+ATOM   3916  O   GLY C 125     -81.506   6.949  33.672  1.00 40.00           O  
+ATOM   3917  N   GLU C 126     -82.251   8.752  34.894  1.00 40.00           N  
+ATOM   3918  CA  GLU C 126     -81.133   9.722  34.678  1.00 40.00           C  
+ATOM   3919  C   GLU C 126     -79.853   9.451  35.499  1.00 40.00           C  
+ATOM   3920  O   GLU C 126     -79.839   9.675  36.728  1.00 40.00           O  
+ATOM   3921  CB  GLU C 126     -81.599  11.172  34.972  1.00 40.00           C  
+ATOM   3922  CG  GLU C 126     -82.812  11.647  34.180  1.00 40.00           C  
+ATOM   3923  CD  GLU C 126     -83.642  12.715  34.896  1.00 40.00           C  
+ATOM   3924  OE1 GLU C 126     -83.587  12.829  36.151  1.00 40.00           O  
+ATOM   3925  OE2 GLU C 126     -84.389  13.431  34.188  1.00 40.00           O  
+ATOM   3926  N   ILE C 127     -78.791   9.006  34.804  1.00 40.00           N  
+ATOM   3927  CA  ILE C 127     -77.448   8.757  35.390  1.00 40.00           C  
+ATOM   3928  C   ILE C 127     -76.807  10.024  36.047  1.00 40.00           C  
+ATOM   3929  O   ILE C 127     -76.304  10.928  35.349  1.00 40.00           O  
+ATOM   3930  CB  ILE C 127     -76.507   8.029  34.372  1.00 40.00           C  
+ATOM   3931  CG1 ILE C 127     -76.911   6.557  34.254  1.00 40.00           C  
+ATOM   3932  CG2 ILE C 127     -75.034   8.138  34.764  1.00 40.00           C  
+ATOM   3933  CD1 ILE C 127     -75.960   5.718  33.435  1.00 40.00           C  
+ATOM   3934  N   VAL C 128     -76.867  10.078  37.391  1.00 40.00           N  
+ATOM   3935  CA  VAL C 128     -76.253  11.147  38.221  1.00 40.00           C  
+ATOM   3936  C   VAL C 128     -74.812  10.752  38.597  1.00 40.00           C  
+ATOM   3937  O   VAL C 128     -74.545   9.598  38.952  1.00 40.00           O  
+ATOM   3938  CB  VAL C 128     -77.075  11.458  39.518  1.00 40.00           C  
+ATOM   3939  CG1 VAL C 128     -76.561  12.719  40.212  1.00 40.00           C  
+ATOM   3940  CG2 VAL C 128     -78.568  11.588  39.227  1.00 40.00           C  
+ATOM   3941  N   LYS C 129     -73.891  11.708  38.497  1.00 40.00           N  
+ATOM   3942  CA  LYS C 129     -72.495  11.474  38.860  1.00 40.00           C  
+ATOM   3943  C   LYS C 129     -71.995  12.498  39.893  1.00 40.00           C  
+ATOM   3944  O   LYS C 129     -72.264  13.702  39.784  1.00 40.00           O  
+ATOM   3945  CB  LYS C 129     -71.605  11.485  37.614  1.00 40.00           C  
+ATOM   3946  CG  LYS C 129     -72.046  10.553  36.487  1.00 40.00           C  
+ATOM   3947  CD  LYS C 129     -70.960  10.413  35.417  1.00 40.00           C  
+ATOM   3948  CE  LYS C 129     -70.569  11.756  34.794  1.00 40.00           C  
+ATOM   3949  NZ  LYS C 129     -69.312  11.712  33.986  1.00 40.00           N  
+ATOM   3950  N   GLY C 130     -71.281  12.006  40.900  1.00 40.00           N  
+ATOM   3951  CA  GLY C 130     -70.667  12.871  41.891  1.00 40.00           C  
+ATOM   3952  C   GLY C 130     -69.561  13.735  41.305  1.00 40.00           C  
+ATOM   3953  O   GLY C 130     -68.653  13.238  40.637  1.00 40.00           O  
+ATOM   3954  N   VAL C 131     -69.649  15.037  41.563  1.00 40.00           N  
+ATOM   3955  CA  VAL C 131     -68.611  16.003  41.182  1.00 40.00           C  
+ATOM   3956  C   VAL C 131     -67.209  15.515  41.602  1.00 40.00           C  
+ATOM   3957  O   VAL C 131     -66.409  15.090  40.755  1.00 40.00           O  
+ATOM   3958  CB  VAL C 131     -68.905  17.421  41.770  1.00 40.00           C  
+ATOM   3959  CG1 VAL C 131     -67.826  18.433  41.381  1.00 40.00           C  
+ATOM   3960  CG2 VAL C 131     -70.282  17.914  41.340  1.00 40.00           C  
+ATOM   3961  N   CYS C 132     -66.942  15.551  42.911  1.00 40.00           N  
+ATOM   3962  CA  CYS C 132     -65.605  15.325  43.441  1.00 40.00           C  
+ATOM   3963  C   CYS C 132     -65.135  13.894  43.233  1.00 40.00           C  
+ATOM   3964  O   CYS C 132     -64.005  13.690  42.794  1.00 40.00           O  
+ATOM   3965  CB  CYS C 132     -65.533  15.717  44.913  1.00 40.00           C  
+ATOM   3966  SG  CYS C 132     -63.970  16.504  45.332  1.00 40.00           S  
+ATOM   3967  N   SER C 133     -66.009  12.920  43.525  1.00 40.00           N  
+ATOM   3968  CA  SER C 133     -65.695  11.481  43.398  1.00 40.00           C  
+ATOM   3969  C   SER C 133     -65.317  11.080  41.970  1.00 40.00           C  
+ATOM   3970  O   SER C 133     -64.406  10.264  41.768  1.00 40.00           O  
+ATOM   3971  CB  SER C 133     -66.865  10.609  43.872  1.00 40.00           C  
+ATOM   3972  OG  SER C 133     -67.963  10.715  42.979  1.00 40.00           O  
+ATOM   3973  N   ASN C 134     -66.022  11.653  40.991  1.00 40.00           N  
+ATOM   3974  CA  ASN C 134     -65.744  11.394  39.578  1.00 40.00           C  
+ATOM   3975  C   ASN C 134     -64.542  12.151  39.080  1.00 40.00           C  
+ATOM   3976  O   ASN C 134     -63.747  11.606  38.320  1.00 40.00           O  
+ATOM   3977  CB  ASN C 134     -66.963  11.695  38.720  1.00 40.00           C  
+ATOM   3978  CG  ASN C 134     -67.988  10.583  38.788  1.00 40.00           C  
+ATOM   3979  OD1 ASN C 134     -67.844   9.561  38.118  1.00 40.00           O  
+ATOM   3980  ND2 ASN C 134     -69.019  10.764  39.612  1.00 40.00           N  
+ATOM   3981  N   PHE C 135     -64.414  13.405  39.524  1.00 40.00           N  
+ATOM   3982  CA  PHE C 135     -63.202  14.193  39.292  1.00 40.00           C  
+ATOM   3983  C   PHE C 135     -61.964  13.366  39.658  1.00 40.00           C  
+ATOM   3984  O   PHE C 135     -61.018  13.252  38.863  1.00 40.00           O  
+ATOM   3985  CB  PHE C 135     -63.243  15.525  40.081  1.00 40.00           C  
+ATOM   3986  CG  PHE C 135     -61.912  16.241  40.156  1.00 40.00           C  
+ATOM   3987  CD1 PHE C 135     -61.267  16.680  38.996  1.00 40.00           C  
+ATOM   3988  CD2 PHE C 135     -61.302  16.480  41.385  1.00 40.00           C  
+ATOM   3989  CE1 PHE C 135     -60.043  17.331  39.063  1.00 40.00           C  
+ATOM   3990  CE2 PHE C 135     -60.079  17.136  41.455  1.00 40.00           C  
+ATOM   3991  CZ  PHE C 135     -59.451  17.563  40.295  1.00 40.00           C  
+ATOM   3992  N   LEU C 136     -62.016  12.762  40.847  1.00 40.00           N  
+ATOM   3993  CA  LEU C 136     -60.871  12.093  41.445  1.00 40.00           C  
+ATOM   3994  C   LEU C 136     -60.518  10.763  40.786  1.00 40.00           C  
+ATOM   3995  O   LEU C 136     -59.353  10.529  40.443  1.00 40.00           O  
+ATOM   3996  CB  LEU C 136     -61.054  11.954  42.960  1.00 40.00           C  
+ATOM   3997  CG  LEU C 136     -60.809  13.274  43.718  1.00 40.00           C  
+ATOM   3998  CD1 LEU C 136     -61.321  13.203  45.153  1.00 40.00           C  
+ATOM   3999  CD2 LEU C 136     -59.344  13.717  43.691  1.00 40.00           C  
+ATOM   4000  N   CYS C 137     -61.504   9.901  40.582  1.00 40.00           N  
+ATOM   4001  CA  CYS C 137     -61.246   8.657  39.873  1.00 40.00           C  
+ATOM   4002  C   CYS C 137     -60.762   8.918  38.445  1.00 40.00           C  
+ATOM   4003  O   CYS C 137     -60.040   8.098  37.869  1.00 40.00           O  
+ATOM   4004  CB  CYS C 137     -62.494   7.792  39.879  1.00 40.00           C  
+ATOM   4005  SG  CYS C 137     -62.975   7.260  41.545  1.00 40.00           S  
+ATOM   4006  N   ASP C 138     -61.144  10.085  37.908  1.00 40.00           N  
+ATOM   4007  CA  ASP C 138     -60.800  10.525  36.540  1.00 40.00           C  
+ATOM   4008  C   ASP C 138     -59.381  11.067  36.354  1.00 40.00           C  
+ATOM   4009  O   ASP C 138     -58.959  11.340  35.220  1.00 40.00           O  
+ATOM   4010  CB  ASP C 138     -61.795  11.586  36.041  1.00 40.00           C  
+ATOM   4011  CG  ASP C 138     -63.053  10.983  35.441  1.00 40.00           C  
+ATOM   4012  OD1 ASP C 138     -63.167   9.730  35.360  1.00 40.00           O  
+ATOM   4013  OD2 ASP C 138     -63.933  11.781  35.052  1.00 40.00           O  
+ATOM   4014  N   LEU C 139     -58.647  11.232  37.451  1.00 40.00           N  
+ATOM   4015  CA  LEU C 139     -57.332  11.860  37.369  1.00 40.00           C  
+ATOM   4016  C   LEU C 139     -56.265  10.961  36.761  1.00 40.00           C  
+ATOM   4017  O   LEU C 139     -56.208   9.756  37.019  1.00 40.00           O  
+ATOM   4018  CB  LEU C 139     -56.888  12.434  38.720  1.00 40.00           C  
+ATOM   4019  CG  LEU C 139     -57.626  13.708  39.150  1.00 40.00           C  
+ATOM   4020  CD1 LEU C 139     -57.174  14.094  40.544  1.00 40.00           C  
+ATOM   4021  CD2 LEU C 139     -57.459  14.875  38.179  1.00 40.00           C  
+ATOM   4022  N   GLN C 140     -55.442  11.576  35.924  1.00 40.00           N  
+ATOM   4023  CA  GLN C 140     -54.323  10.903  35.302  1.00 40.00           C  
+ATOM   4024  C   GLN C 140     -53.016  11.281  36.021  1.00 40.00           C  
+ATOM   4025  O   GLN C 140     -52.923  12.390  36.571  1.00 40.00           O  
+ATOM   4026  CB  GLN C 140     -54.266  11.281  33.814  1.00 40.00           C  
+ATOM   4027  CG  GLN C 140     -55.489  10.873  33.008  1.00 40.00           C  
+ATOM   4028  CD  GLN C 140     -55.935   9.443  33.285  1.00 40.00           C  
+ATOM   4029  OE1 GLN C 140     -57.104   9.120  33.125  1.00 40.00           O  
+ATOM   4030  NE2 GLN C 140     -55.009   8.585  33.708  1.00 40.00           N  
+ATOM   4031  N   PRO C 141     -52.011  10.364  36.045  1.00 40.00           N  
+ATOM   4032  CA  PRO C 141     -50.678  10.782  36.470  1.00 40.00           C  
+ATOM   4033  C   PRO C 141     -50.308  12.166  35.888  1.00 40.00           C  
+ATOM   4034  O   PRO C 141     -50.358  12.358  34.672  1.00 40.00           O  
+ATOM   4035  CB  PRO C 141     -49.776   9.694  35.880  1.00 40.00           C  
+ATOM   4036  CG  PRO C 141     -50.625   8.477  35.814  1.00 40.00           C  
+ATOM   4037  CD  PRO C 141     -52.066   8.910  35.787  1.00 40.00           C  
+ATOM   4038  N   GLY C 142     -49.985  13.135  36.740  1.00 40.00           N  
+ATOM   4039  CA  GLY C 142     -49.518  14.447  36.259  1.00 40.00           C  
+ATOM   4040  C   GLY C 142     -50.501  15.598  36.379  1.00 40.00           C  
+ATOM   4041  O   GLY C 142     -50.123  16.776  36.253  1.00 40.00           O  
+ATOM   4042  N   ASP C 143     -51.765  15.245  36.615  1.00 40.00           N  
+ATOM   4043  CA  ASP C 143     -52.829  16.213  36.871  1.00 40.00           C  
+ATOM   4044  C   ASP C 143     -52.573  16.949  38.189  1.00 40.00           C  
+ATOM   4045  O   ASP C 143     -52.031  16.380  39.132  1.00 40.00           O  
+ATOM   4046  CB  ASP C 143     -54.201  15.508  36.916  1.00 40.00           C  
+ATOM   4047  CG  ASP C 143     -54.563  14.802  35.604  1.00 40.00           C  
+ATOM   4048  OD1 ASP C 143     -53.655  14.490  34.809  1.00 40.00           O  
+ATOM   4049  OD2 ASP C 143     -55.764  14.546  35.374  1.00 40.00           O  
+ATOM   4050  N   ASN C 144     -52.954  18.217  38.244  1.00 40.00           N  
+ATOM   4051  CA  ASN C 144     -52.895  18.961  39.496  1.00 40.00           C  
+ATOM   4052  C   ASN C 144     -54.107  18.687  40.383  1.00 40.00           C  
+ATOM   4053  O   ASN C 144     -55.196  18.427  39.865  1.00 40.00           O  
+ATOM   4054  CB  ASN C 144     -52.764  20.467  39.230  1.00 40.00           C  
+ATOM   4055  CG  ASN C 144     -51.319  20.941  39.238  1.00 40.00           C  
+ATOM   4056  OD1 ASN C 144     -51.016  22.064  38.818  1.00 40.00           O  
+ATOM   4057  ND2 ASN C 144     -50.419  20.094  39.732  1.00 40.00           N  
+ATOM   4058  N   VAL C 145     -53.904  18.726  41.710  1.00 40.00           N  
+ATOM   4059  CA  VAL C 145     -54.997  18.631  42.730  1.00 40.00           C  
+ATOM   4060  C   VAL C 145     -54.888  19.780  43.765  1.00 40.00           C  
+ATOM   4061  O   VAL C 145     -53.794  20.059  44.295  1.00 40.00           O  
+ATOM   4062  CB  VAL C 145     -55.055  17.252  43.490  1.00 40.00           C  
+ATOM   4063  CG1 VAL C 145     -56.415  17.036  44.156  1.00 40.00           C  
+ATOM   4064  CG2 VAL C 145     -54.744  16.071  42.574  1.00 40.00           C  
+ATOM   4065  N   GLN C 146     -56.022  20.439  44.038  1.00 40.00           N  
+ATOM   4066  CA  GLN C 146     -56.102  21.455  45.094  1.00 40.00           C  
+ATOM   4067  C   GLN C 146     -56.493  20.775  46.410  1.00 40.00           C  
+ATOM   4068  O   GLN C 146     -57.515  20.071  46.496  1.00 40.00           O  
+ATOM   4069  CB  GLN C 146     -57.098  22.566  44.724  1.00 40.00           C  
+ATOM   4070  CG  GLN C 146     -56.642  23.480  43.586  1.00 40.00           C  
+ATOM   4071  CD  GLN C 146     -57.707  24.482  43.134  1.00 40.00           C  
+ATOM   4072  OE1 GLN C 146     -58.872  24.123  42.879  1.00 40.00           O  
+ATOM   4073  NE2 GLN C 146     -57.302  25.748  43.010  1.00 40.00           N  
+ATOM   4074  N   ILE C 147     -55.668  20.986  47.431  1.00 40.00           N  
+ATOM   4075  CA  ILE C 147     -55.758  20.188  48.649  1.00 40.00           C  
+ATOM   4076  C   ILE C 147     -55.829  21.012  49.931  1.00 40.00           C  
+ATOM   4077  O   ILE C 147     -54.932  21.827  50.210  1.00 40.00           O  
+ATOM   4078  CB  ILE C 147     -54.587  19.182  48.739  1.00 40.00           C  
+ATOM   4079  CG1 ILE C 147     -54.693  18.146  47.617  1.00 40.00           C  
+ATOM   4080  CG2 ILE C 147     -54.589  18.455  50.077  1.00 40.00           C  
+ATOM   4081  CD1 ILE C 147     -53.386  17.454  47.293  1.00 40.00           C  
+ATOM   4082  N   THR C 148     -56.899  20.770  50.700  1.00 40.00           N  
+ATOM   4083  CA  THR C 148     -57.126  21.395  52.014  1.00 40.00           C  
+ATOM   4084  C   THR C 148     -56.839  20.421  53.158  1.00 40.00           C  
+ATOM   4085  O   THR C 148     -56.967  19.200  53.000  1.00 40.00           O  
+ATOM   4086  CB  THR C 148     -58.576  21.931  52.171  1.00 40.00           C  
+ATOM   4087  OG1 THR C 148     -59.511  20.862  52.015  1.00 40.00           O  
+ATOM   4088  CG2 THR C 148     -58.899  23.004  51.135  1.00 40.00           C  
+ATOM   4089  N   GLY C 149     -56.458  20.970  54.308  1.00 40.00           N  
+ATOM   4090  CA  GLY C 149     -56.265  20.159  55.504  1.00 40.00           C  
+ATOM   4091  C   GLY C 149     -54.965  20.452  56.233  1.00 40.00           C  
+ATOM   4092  O   GLY C 149     -54.358  21.502  56.007  1.00 40.00           O  
+ATOM   4093  N   PRO C 150     -54.527  19.526  57.116  1.00 40.00           N  
+ATOM   4094  CA  PRO C 150     -55.248  18.294  57.424  1.00 40.00           C  
+ATOM   4095  C   PRO C 150     -56.356  18.570  58.408  1.00 40.00           C  
+ATOM   4096  O   PRO C 150     -56.344  19.599  59.082  1.00 40.00           O  
+ATOM   4097  CB  PRO C 150     -54.185  17.414  58.074  1.00 40.00           C  
+ATOM   4098  CG  PRO C 150     -53.224  18.370  58.682  1.00 40.00           C  
+ATOM   4099  CD  PRO C 150     -53.254  19.628  57.859  1.00 40.00           C  
+ATOM   4100  N   VAL C 151     -57.303  17.646  58.493  1.00 40.00           N  
+ATOM   4101  CA  VAL C 151     -58.528  17.873  59.246  1.00 40.00           C  
+ATOM   4102  C   VAL C 151     -59.002  16.620  59.999  1.00 40.00           C  
+ATOM   4103  O   VAL C 151     -58.809  15.478  59.536  1.00 40.00           O  
+ATOM   4104  CB  VAL C 151     -59.637  18.352  58.296  1.00 40.00           C  
+ATOM   4105  CG1 VAL C 151     -60.973  18.404  59.002  1.00 40.00           C  
+ATOM   4106  CG2 VAL C 151     -59.301  19.719  57.737  1.00 40.00           C  
+ATOM   4107  N   GLY C 152     -59.634  16.843  61.153  1.00 40.00           N  
+ATOM   4108  CA  GLY C 152     -60.164  15.753  61.977  1.00 40.00           C  
+ATOM   4109  C   GLY C 152     -59.190  15.399  63.082  1.00 40.00           C  
+ATOM   4110  O   GLY C 152     -57.983  15.275  62.859  1.00 40.00           O  
+ATOM   4111  N   LYS C 153     -59.707  15.269  64.291  1.00 40.00           N  
+ATOM   4112  CA  LYS C 153     -58.886  14.832  65.399  1.00 40.00           C  
+ATOM   4113  C   LYS C 153     -59.606  13.624  65.934  1.00 40.00           C  
+ATOM   4114  O   LYS C 153     -59.112  12.932  66.823  1.00 40.00           O  
+ATOM   4115  CB  LYS C 153     -58.796  15.914  66.478  1.00 40.00           C  
+ATOM   4116  CG  LYS C 153     -58.182  17.237  66.036  1.00 40.00           C  
+ATOM   4117  CD  LYS C 153     -56.728  17.366  66.453  1.00 40.00           C  
+ATOM   4118  CE  LYS C 153     -56.571  17.714  67.929  1.00 40.00           C  
+ATOM   4119  NZ  LYS C 153     -56.830  19.145  68.228  1.00 40.00           N  
+ATOM   4120  N   GLU C 154     -60.786  13.380  65.369  1.00 40.00           N  
+ATOM   4121  CA  GLU C 154     -61.705  12.393  65.906  1.00 40.00           C  
+ATOM   4122  C   GLU C 154     -61.164  10.975  65.797  1.00 40.00           C  
+ATOM   4123  O   GLU C 154     -61.406  10.133  66.668  1.00 40.00           O  
+ATOM   4124  CB  GLU C 154     -63.064  12.504  65.208  1.00 40.00           C  
+ATOM   4125  CG  GLU C 154     -64.143  11.554  65.742  1.00 40.00           C  
+ATOM   4126  CD  GLU C 154     -64.703  11.955  67.104  1.00 40.00           C  
+ATOM   4127  OE1 GLU C 154     -64.068  12.786  67.796  1.00 40.00           O  
+ATOM   4128  OE2 GLU C 154     -65.787  11.438  67.479  1.00 40.00           O  
+ATOM   4129  N   MET C 155     -60.412  10.714  64.743  1.00 40.00           N  
+ATOM   4130  CA  MET C 155     -60.042   9.355  64.479  1.00 40.00           C  
+ATOM   4131  C   MET C 155     -58.580   9.044  64.700  1.00 40.00           C  
+ATOM   4132  O   MET C 155     -58.056   8.114  64.118  1.00 40.00           O  
+ATOM   4133  CB  MET C 155     -60.478   9.001  63.077  1.00 40.00           C  
+ATOM   4134  CG  MET C 155     -61.982   8.961  62.964  1.00 40.00           C  
+ATOM   4135  SD  MET C 155     -62.656   7.770  64.134  1.00 40.00           S  
+ATOM   4136  CE  MET C 155     -62.756   6.298  63.115  1.00 40.00           C  
+ATOM   4137  N   LEU C 156     -57.922   9.805  65.562  1.00 40.00           N  
+ATOM   4138  CA  LEU C 156     -56.511   9.564  65.843  1.00 40.00           C  
+ATOM   4139  C   LEU C 156     -56.340   8.255  66.610  1.00 40.00           C  
+ATOM   4140  O   LEU C 156     -57.227   7.845  67.353  1.00 40.00           O  
+ATOM   4141  CB  LEU C 156     -55.895  10.739  66.616  1.00 40.00           C  
+ATOM   4142  CG  LEU C 156     -55.910  12.149  65.997  1.00 40.00           C  
+ATOM   4143  CD1 LEU C 156     -55.752  13.239  67.047  1.00 40.00           C  
+ATOM   4144  CD2 LEU C 156     -54.834  12.297  64.941  1.00 40.00           C  
+ATOM   4145  N   MET C 157     -55.198   7.601  66.409  1.00 40.00           N  
+ATOM   4146  CA  MET C 157     -54.900   6.320  67.044  1.00 40.00           C  
+ATOM   4147  C   MET C 157     -54.801   6.505  68.544  1.00 40.00           C  
+ATOM   4148  O   MET C 157     -54.660   7.629  69.018  1.00 40.00           O  
+ATOM   4149  CB  MET C 157     -53.565   5.788  66.546  1.00 40.00           C  
+ATOM   4150  CG  MET C 157     -53.320   5.997  65.069  1.00 40.00           C  
+ATOM   4151  SD  MET C 157     -51.987   4.945  64.499  1.00 40.00           S  
+ATOM   4152  CE  MET C 157     -52.750   3.337  64.635  1.00 40.00           C  
+ATOM   4153  N   PRO C 158     -54.868   5.409  69.306  1.00 40.00           N  
+ATOM   4154  CA  PRO C 158     -54.652   5.558  70.744  1.00 40.00           C  
+ATOM   4155  C   PRO C 158     -53.182   5.838  71.088  1.00 40.00           C  
+ATOM   4156  O   PRO C 158     -52.315   5.674  70.244  1.00 40.00           O  
+ATOM   4157  CB  PRO C 158     -55.102   4.200  71.307  1.00 40.00           C  
+ATOM   4158  CG  PRO C 158     -55.970   3.608  70.245  1.00 40.00           C  
+ATOM   4159  CD  PRO C 158     -55.341   4.060  68.964  1.00 40.00           C  
+ATOM   4160  N   LYS C 159     -52.918   6.285  72.308  1.00 40.00           N  
+ATOM   4161  CA  LYS C 159     -51.555   6.442  72.779  1.00 40.00           C  
+ATOM   4162  C   LYS C 159     -50.982   5.090  73.147  1.00 40.00           C  
+ATOM   4163  O   LYS C 159     -49.818   4.811  72.866  1.00 40.00           O  
+ATOM   4164  CB  LYS C 159     -51.506   7.373  73.982  1.00 40.00           C  
+ATOM   4165  CG  LYS C 159     -51.429   8.837  73.597  1.00 40.00           C  
+ATOM   4166  CD  LYS C 159     -51.852   9.766  74.728  1.00 40.00           C  
+ATOM   4167  CE  LYS C 159     -51.754  11.215  74.241  1.00 40.00           C  
+ATOM   4168  NZ  LYS C 159     -52.514  12.204  75.069  1.00 40.00           N  
+ATOM   4169  N   ASP C 160     -51.819   4.257  73.766  1.00 40.00           N  
+ATOM   4170  CA  ASP C 160     -51.473   2.894  74.211  1.00 40.00           C  
+ATOM   4171  C   ASP C 160     -50.944   1.990  73.071  1.00 40.00           C  
+ATOM   4172  O   ASP C 160     -51.698   1.648  72.162  1.00 40.00           O  
+ATOM   4173  CB  ASP C 160     -52.722   2.267  74.871  1.00 40.00           C  
+ATOM   4174  CG  ASP C 160     -52.460   0.894  75.515  1.00 40.00           C  
+ATOM   4175  OD1 ASP C 160     -51.365   0.303  75.334  1.00 40.00           O  
+ATOM   4176  OD2 ASP C 160     -53.386   0.407  76.213  1.00 40.00           O  
+ATOM   4177  N   PRO C 161     -49.653   1.592  73.112  1.00 40.00           N  
+ATOM   4178  CA  PRO C 161     -49.205   0.704  72.057  1.00 40.00           C  
+ATOM   4179  C   PRO C 161     -49.447  -0.776  72.400  1.00 40.00           C  
+ATOM   4180  O   PRO C 161     -48.912  -1.660  71.721  1.00 40.00           O  
+ATOM   4181  CB  PRO C 161     -47.715   1.036  71.925  1.00 40.00           C  
+ATOM   4182  CG  PRO C 161     -47.333   1.664  73.215  1.00 40.00           C  
+ATOM   4183  CD  PRO C 161     -48.564   1.887  74.048  1.00 40.00           C  
+ATOM   4184  N   ASN C 162     -50.260  -1.030  73.429  1.00 40.00           N  
+ATOM   4185  CA  ASN C 162     -50.733  -2.377  73.756  1.00 40.00           C  
+ATOM   4186  C   ASN C 162     -52.243  -2.444  73.743  1.00 40.00           C  
+ATOM   4187  O   ASN C 162     -52.862  -3.273  74.409  1.00 40.00           O  
+ATOM   4188  CB  ASN C 162     -50.210  -2.811  75.119  1.00 40.00           C  
+ATOM   4189  CG  ASN C 162     -48.769  -3.290  75.066  1.00 40.00           C  
+ATOM   4190  OD1 ASN C 162     -48.045  -3.217  76.062  1.00 40.00           O  
+ATOM   4191  ND2 ASN C 162     -48.342  -3.785  73.902  1.00 40.00           N  
+ATOM   4192  N   ALA C 163     -52.819  -1.556  72.952  1.00 40.00           N  
+ATOM   4193  CA  ALA C 163     -54.251  -1.372  72.879  1.00 40.00           C  
+ATOM   4194  C   ALA C 163     -54.943  -2.458  72.094  1.00 40.00           C  
+ATOM   4195  O   ALA C 163     -54.380  -3.016  71.155  1.00 40.00           O  
+ATOM   4196  CB  ALA C 163     -54.554  -0.035  72.238  1.00 40.00           C  
+ATOM   4197  N   THR C 164     -56.178  -2.740  72.489  1.00 40.00           N  
+ATOM   4198  CA  THR C 164     -57.083  -3.532  71.687  1.00 40.00           C  
+ATOM   4199  C   THR C 164     -57.756  -2.531  70.766  1.00 40.00           C  
+ATOM   4200  O   THR C 164     -58.417  -1.613  71.244  1.00 40.00           O  
+ATOM   4201  CB  THR C 164     -58.140  -4.225  72.568  1.00 40.00           C  
+ATOM   4202  OG1 THR C 164     -57.493  -4.960  73.611  1.00 40.00           O  
+ATOM   4203  CG2 THR C 164     -58.985  -5.182  71.755  1.00 40.00           C  
+ATOM   4204  N   ILE C 165     -57.573  -2.688  69.454  1.00 40.00           N  
+ATOM   4205  CA  ILE C 165     -58.113  -1.721  68.494  1.00 40.00           C  
+ATOM   4206  C   ILE C 165     -59.139  -2.270  67.522  1.00 40.00           C  
+ATOM   4207  O   ILE C 165     -58.809  -2.866  66.497  1.00 40.00           O  
+ATOM   4208  CB  ILE C 165     -57.015  -1.050  67.687  1.00 40.00           C  
+ATOM   4209  CG1 ILE C 165     -56.022  -0.417  68.641  1.00 40.00           C  
+ATOM   4210  CG2 ILE C 165     -57.622   0.009  66.785  1.00 40.00           C  
+ATOM   4211  CD1 ILE C 165     -54.711  -0.064  67.987  1.00 40.00           C  
+ATOM   4212  N   ILE C 166     -60.396  -2.011  67.833  1.00 40.00           N  
+ATOM   4213  CA  ILE C 166     -61.471  -2.568  67.064  1.00 40.00           C  
+ATOM   4214  C   ILE C 166     -61.914  -1.604  66.009  1.00 40.00           C  
+ATOM   4215  O   ILE C 166     -62.306  -0.474  66.299  1.00 40.00           O  
+ATOM   4216  CB  ILE C 166     -62.639  -2.936  67.959  1.00 40.00           C  
+ATOM   4217  CG1 ILE C 166     -62.154  -3.987  68.949  1.00 40.00           C  
+ATOM   4218  CG2 ILE C 166     -63.784  -3.478  67.119  1.00 40.00           C  
+ATOM   4219  CD1 ILE C 166     -62.985  -4.107  70.203  1.00 40.00           C  
+ATOM   4220  N   MET C 167     -61.866  -2.090  64.779  1.00 40.00           N  
+ATOM   4221  CA  MET C 167     -62.083  -1.272  63.613  1.00 40.00           C  
+ATOM   4222  C   MET C 167     -63.248  -1.784  62.776  1.00 40.00           C  
+ATOM   4223  O   MET C 167     -63.170  -2.835  62.139  1.00 40.00           O  
+ATOM   4224  CB  MET C 167     -60.797  -1.248  62.809  1.00 40.00           C  
+ATOM   4225  CG  MET C 167     -59.596  -0.847  63.652  1.00 40.00           C  
+ATOM   4226  SD  MET C 167     -58.020  -1.016  62.796  1.00 40.00           S  
+ATOM   4227  CE  MET C 167     -57.561  -2.673  63.303  1.00 40.00           C  
+ATOM   4228  N   LEU C 168     -64.339  -1.034  62.795  1.00 40.00           N  
+ATOM   4229  CA  LEU C 168     -65.488  -1.399  62.003  1.00 40.00           C  
+ATOM   4230  C   LEU C 168     -65.540  -0.534  60.778  1.00 40.00           C  
+ATOM   4231  O   LEU C 168     -65.555   0.689  60.881  1.00 40.00           O  
+ATOM   4232  CB  LEU C 168     -66.775  -1.223  62.793  1.00 40.00           C  
+ATOM   4233  CG  LEU C 168     -66.972  -2.032  64.068  1.00 40.00           C  
+ATOM   4234  CD1 LEU C 168     -66.153  -3.320  64.072  1.00 40.00           C  
+ATOM   4235  CD2 LEU C 168     -66.580  -1.141  65.224  1.00 40.00           C  
+ATOM   4236  N   ALA C 169     -65.591  -1.174  59.617  1.00 40.00           N  
+ATOM   4237  CA  ALA C 169     -65.541  -0.442  58.366  1.00 40.00           C  
+ATOM   4238  C   ALA C 169     -66.437  -0.998  57.281  1.00 40.00           C  
+ATOM   4239  O   ALA C 169     -66.541  -2.203  57.107  1.00 40.00           O  
+ATOM   4240  CB  ALA C 169     -64.113  -0.373  57.866  1.00 40.00           C  
+ATOM   4241  N   THR C 170     -67.063  -0.095  56.541  1.00 40.00           N  
+ATOM   4242  CA  THR C 170     -67.895  -0.448  55.413  1.00 40.00           C  
+ATOM   4243  C   THR C 170     -67.483   0.396  54.237  1.00 40.00           C  
+ATOM   4244  O   THR C 170     -67.626   1.626  54.267  1.00 40.00           O  
+ATOM   4245  CB  THR C 170     -69.366  -0.120  55.683  1.00 40.00           C  
+ATOM   4246  OG1 THR C 170     -69.468   1.213  56.211  1.00 40.00           O  
+ATOM   4247  CG2 THR C 170     -69.964  -1.111  56.661  1.00 40.00           C  
+ATOM   4248  N   GLY C 171     -66.979  -0.258  53.197  1.00 40.00           N  
+ATOM   4249  CA  GLY C 171     -66.609   0.436  51.966  1.00 40.00           C  
+ATOM   4250  C   GLY C 171     -65.386   1.305  52.153  1.00 40.00           C  
+ATOM   4251  O   GLY C 171     -64.430   0.892  52.805  1.00 40.00           O  
+ATOM   4252  N   THR C 172     -65.429   2.517  51.601  1.00 40.00           N  
+ATOM   4253  CA  THR C 172     -64.300   3.440  51.682  1.00 40.00           C  
+ATOM   4254  C   THR C 172     -64.118   4.004  53.099  1.00 40.00           C  
+ATOM   4255  O   THR C 172     -63.422   5.004  53.303  1.00 40.00           O  
+ATOM   4256  CB  THR C 172     -64.415   4.588  50.653  1.00 40.00           C  
+ATOM   4257  OG1 THR C 172     -65.483   5.468  51.027  1.00 40.00           O  
+ATOM   4258  CG2 THR C 172     -64.679   4.042  49.262  1.00 40.00           C  
+ATOM   4259  N   GLY C 173     -64.750   3.360  54.074  1.00 40.00           N  
+ATOM   4260  CA  GLY C 173     -64.515   3.676  55.475  1.00 40.00           C  
+ATOM   4261  C   GLY C 173     -63.331   2.904  56.024  1.00 40.00           C  
+ATOM   4262  O   GLY C 173     -63.022   2.986  57.207  1.00 40.00           O  
+ATOM   4263  N   ILE C 174     -62.674   2.143  55.162  1.00 40.00           N  
+ATOM   4264  CA  ILE C 174     -61.505   1.385  55.556  1.00 40.00           C  
+ATOM   4265  C   ILE C 174     -60.304   2.302  55.531  1.00 40.00           C  
+ATOM   4266  O   ILE C 174     -59.328   2.074  56.239  1.00 40.00           O  
+ATOM   4267  CB  ILE C 174     -61.257   0.210  54.596  1.00 40.00           C  
+ATOM   4268  CG1 ILE C 174     -60.001  -0.582  54.986  1.00 40.00           C  
+ATOM   4269  CG2 ILE C 174     -61.100   0.717  53.173  1.00 40.00           C  
+ATOM   4270  CD1 ILE C 174     -60.245  -1.716  55.956  1.00 40.00           C  
+ATOM   4271  N   ALA C 175     -60.396   3.346  54.715  1.00 40.00           N  
+ATOM   4272  CA  ALA C 175     -59.280   4.256  54.458  1.00 40.00           C  
+ATOM   4273  C   ALA C 175     -58.406   4.602  55.673  1.00 40.00           C  
+ATOM   4274  O   ALA C 175     -57.191   4.385  55.622  1.00 40.00           O  
+ATOM   4275  CB  ALA C 175     -59.773   5.521  53.777  1.00 40.00           C  
+ATOM   4276  N   PRO C 176     -59.011   5.133  56.763  1.00 40.00           N  
+ATOM   4277  CA  PRO C 176     -58.199   5.459  57.921  1.00 40.00           C  
+ATOM   4278  C   PRO C 176     -57.533   4.226  58.483  1.00 40.00           C  
+ATOM   4279  O   PRO C 176     -56.384   4.291  58.885  1.00 40.00           O  
+ATOM   4280  CB  PRO C 176     -59.218   5.987  58.923  1.00 40.00           C  
+ATOM   4281  CG  PRO C 176     -60.515   5.396  58.511  1.00 40.00           C  
+ATOM   4282  CD  PRO C 176     -60.437   5.406  57.021  1.00 40.00           C  
+ATOM   4283  N   PHE C 177     -58.243   3.108  58.490  1.00 40.00           N  
+ATOM   4284  CA  PHE C 177     -57.706   1.897  59.057  1.00 40.00           C  
+ATOM   4285  C   PHE C 177     -56.567   1.324  58.259  1.00 40.00           C  
+ATOM   4286  O   PHE C 177     -55.684   0.688  58.818  1.00 40.00           O  
+ATOM   4287  CB  PHE C 177     -58.795   0.884  59.185  1.00 40.00           C  
+ATOM   4288  CG  PHE C 177     -59.916   1.344  60.031  1.00 40.00           C  
+ATOM   4289  CD1 PHE C 177     -59.698   1.693  61.348  1.00 40.00           C  
+ATOM   4290  CD2 PHE C 177     -61.191   1.431  59.515  1.00 40.00           C  
+ATOM   4291  CE1 PHE C 177     -60.742   2.111  62.148  1.00 40.00           C  
+ATOM   4292  CE2 PHE C 177     -62.247   1.844  60.307  1.00 40.00           C  
+ATOM   4293  CZ  PHE C 177     -62.021   2.183  61.630  1.00 40.00           C  
+ATOM   4294  N   ARG C 178     -56.583   1.540  56.953  1.00 40.00           N  
+ATOM   4295  CA  ARG C 178     -55.411   1.242  56.165  1.00 40.00           C  
+ATOM   4296  C   ARG C 178     -54.284   1.953  56.888  1.00 40.00           C  
+ATOM   4297  O   ARG C 178     -53.361   1.322  57.427  1.00 40.00           O  
+ATOM   4298  CB  ARG C 178     -55.551   1.770  54.735  1.00 40.00           C  
+ATOM   4299  CG  ARG C 178     -54.305   1.541  53.901  1.00 40.00           C  
+ATOM   4300  CD  ARG C 178     -54.555   1.687  52.415  1.00 40.00           C  
+ATOM   4301  NE  ARG C 178     -53.512   1.009  51.641  1.00 40.00           N  
+ATOM   4302  CZ  ARG C 178     -52.405   1.593  51.188  1.00 40.00           C  
+ATOM   4303  NH1 ARG C 178     -52.182   2.882  51.407  1.00 40.00           N  
+ATOM   4304  NH2 ARG C 178     -51.524   0.884  50.506  1.00 40.00           N  
+ATOM   4305  N   SER C 179     -54.424   3.278  56.938  1.00 40.00           N  
+ATOM   4306  CA  SER C 179     -53.438   4.187  57.510  1.00 40.00           C  
+ATOM   4307  C   SER C 179     -52.934   3.685  58.854  1.00 40.00           C  
+ATOM   4308  O   SER C 179     -51.735   3.711  59.107  1.00 40.00           O  
+ATOM   4309  CB  SER C 179     -54.028   5.594  57.637  1.00 40.00           C  
+ATOM   4310  OG  SER C 179     -53.012   6.567  57.623  1.00 40.00           O  
+ATOM   4311  N   PHE C 180     -53.853   3.201  59.687  1.00 40.00           N  
+ATOM   4312  CA  PHE C 180     -53.521   2.638  60.995  1.00 40.00           C  
+ATOM   4313  C   PHE C 180     -52.612   1.446  60.856  1.00 40.00           C  
+ATOM   4314  O   PHE C 180     -51.552   1.365  61.474  1.00 40.00           O  
+ATOM   4315  CB  PHE C 180     -54.778   2.146  61.700  1.00 40.00           C  
+ATOM   4316  CG  PHE C 180     -55.498   3.198  62.478  1.00 40.00           C  
+ATOM   4317  CD1 PHE C 180     -55.465   4.527  62.086  1.00 40.00           C  
+ATOM   4318  CD2 PHE C 180     -56.249   2.845  63.588  1.00 40.00           C  
+ATOM   4319  CE1 PHE C 180     -56.149   5.485  62.805  1.00 40.00           C  
+ATOM   4320  CE2 PHE C 180     -56.940   3.795  64.313  1.00 40.00           C  
+ATOM   4321  CZ  PHE C 180     -56.888   5.117  63.921  1.00 40.00           C  
+ATOM   4322  N   LEU C 181     -53.043   0.502  60.046  1.00 40.00           N  
+ATOM   4323  CA  LEU C 181     -52.366  -0.760  60.044  1.00 40.00           C  
+ATOM   4324  C   LEU C 181     -50.962  -0.606  59.480  1.00 40.00           C  
+ATOM   4325  O   LEU C 181     -49.994  -1.086  60.078  1.00 40.00           O  
+ATOM   4326  CB  LEU C 181     -53.210  -1.820  59.340  1.00 40.00           C  
+ATOM   4327  CG  LEU C 181     -54.447  -2.163  60.175  1.00 40.00           C  
+ATOM   4328  CD1 LEU C 181     -55.630  -2.475  59.294  1.00 40.00           C  
+ATOM   4329  CD2 LEU C 181     -54.180  -3.323  61.104  1.00 40.00           C  
+ATOM   4330  N   TRP C 182     -50.839   0.113  58.371  1.00 40.00           N  
+ATOM   4331  CA  TRP C 182     -49.532   0.324  57.789  1.00 40.00           C  
+ATOM   4332  C   TRP C 182     -48.517   0.699  58.823  1.00 40.00           C  
+ATOM   4333  O   TRP C 182     -47.458   0.093  58.897  1.00 40.00           O  
+ATOM   4334  CB  TRP C 182     -49.596   1.378  56.719  1.00 40.00           C  
+ATOM   4335  CG  TRP C 182     -49.746   0.810  55.336  1.00 40.00           C  
+ATOM   4336  CD1 TRP C 182     -50.799   0.060  54.830  1.00 40.00           C  
+ATOM   4337  CD2 TRP C 182     -48.816   0.956  54.218  1.00 40.00           C  
+ATOM   4338  NE1 TRP C 182     -50.586  -0.258  53.513  1.00 40.00           N  
+ATOM   4339  CE2 TRP C 182     -49.417   0.248  53.086  1.00 40.00           C  
+ATOM   4340  CE3 TRP C 182     -47.596   1.583  54.046  1.00 40.00           C  
+ATOM   4341  CZ2 TRP C 182     -48.801   0.183  51.851  1.00 40.00           C  
+ATOM   4342  CZ3 TRP C 182     -46.985   1.512  52.791  1.00 40.00           C  
+ATOM   4343  CH2 TRP C 182     -47.574   0.827  51.721  1.00 40.00           C  
+ATOM   4344  N   LYS C 183     -48.836   1.688  59.649  1.00 40.00           N  
+ATOM   4345  CA  LYS C 183     -47.924   2.131  60.692  1.00 40.00           C  
+ATOM   4346  C   LYS C 183     -47.662   0.996  61.661  1.00 40.00           C  
+ATOM   4347  O   LYS C 183     -46.523   0.733  62.024  1.00 40.00           O  
+ATOM   4348  CB  LYS C 183     -48.497   3.346  61.436  1.00 40.00           C  
+ATOM   4349  CG  LYS C 183     -47.454   4.318  62.006  1.00 40.00           C  
+ATOM   4350  CD  LYS C 183     -47.932   5.102  63.245  1.00 40.00           C  
+ATOM   4351  CE  LYS C 183     -46.844   6.029  63.813  1.00 40.00           C  
+ATOM   4352  NZ  LYS C 183     -47.163   6.581  65.163  1.00 40.00           N  
+ATOM   4353  N   MET C 184     -48.727   0.312  62.051  1.00 40.00           N  
+ATOM   4354  CA  MET C 184     -48.638  -0.717  63.067  1.00 40.00           C  
+ATOM   4355  C   MET C 184     -47.807  -1.900  62.646  1.00 40.00           C  
+ATOM   4356  O   MET C 184     -47.003  -2.410  63.423  1.00 40.00           O  
+ATOM   4357  CB  MET C 184     -50.016  -1.227  63.407  1.00 40.00           C  
+ATOM   4358  CG  MET C 184     -50.865  -0.195  64.084  1.00 40.00           C  
+ATOM   4359  SD  MET C 184     -52.568  -0.614  63.780  1.00 40.00           S  
+ATOM   4360  CE  MET C 184     -52.758  -2.005  64.901  1.00 40.00           C  
+ATOM   4361  N   PHE C 185     -48.009  -2.346  61.416  1.00 40.00           N  
+ATOM   4362  CA  PHE C 185     -47.455  -3.609  61.020  1.00 40.00           C  
+ATOM   4363  C   PHE C 185     -46.429  -3.531  59.916  1.00 40.00           C  
+ATOM   4364  O   PHE C 185     -45.461  -4.277  59.921  1.00 40.00           O  
+ATOM   4365  CB  PHE C 185     -48.572  -4.548  60.636  1.00 40.00           C  
+ATOM   4366  CG  PHE C 185     -49.431  -4.957  61.787  1.00 40.00           C  
+ATOM   4367  CD1 PHE C 185     -48.937  -5.796  62.780  1.00 40.00           C  
+ATOM   4368  CD2 PHE C 185     -50.741  -4.518  61.874  1.00 40.00           C  
+ATOM   4369  CE1 PHE C 185     -49.740  -6.185  63.841  1.00 40.00           C  
+ATOM   4370  CE2 PHE C 185     -51.548  -4.903  62.931  1.00 40.00           C  
+ATOM   4371  CZ  PHE C 185     -51.050  -5.738  63.915  1.00 40.00           C  
+ATOM   4372  N   PHE C 186     -46.620  -2.641  58.962  1.00 40.00           N  
+ATOM   4373  CA  PHE C 186     -45.622  -2.531  57.911  1.00 40.00           C  
+ATOM   4374  C   PHE C 186     -44.371  -1.774  58.349  1.00 40.00           C  
+ATOM   4375  O   PHE C 186     -43.282  -2.055  57.862  1.00 40.00           O  
+ATOM   4376  CB  PHE C 186     -46.216  -1.923  56.633  1.00 40.00           C  
+ATOM   4377  CG  PHE C 186     -47.055  -2.890  55.818  1.00 40.00           C  
+ATOM   4378  CD1 PHE C 186     -47.053  -4.260  56.109  1.00 40.00           C  
+ATOM   4379  CD2 PHE C 186     -47.825  -2.431  54.737  1.00 40.00           C  
+ATOM   4380  CE1 PHE C 186     -47.816  -5.143  55.363  1.00 40.00           C  
+ATOM   4381  CE2 PHE C 186     -48.583  -3.314  53.990  1.00 40.00           C  
+ATOM   4382  CZ  PHE C 186     -48.577  -4.670  54.302  1.00 40.00           C  
+ATOM   4383  N   GLU C 187     -44.525  -0.847  59.295  1.00 40.00           N  
+ATOM   4384  CA  GLU C 187     -43.475   0.135  59.625  1.00 40.00           C  
+ATOM   4385  C   GLU C 187     -42.762  -0.051  60.983  1.00 40.00           C  
+ATOM   4386  O   GLU C 187     -43.348  -0.539  61.963  1.00 40.00           O  
+ATOM   4387  CB  GLU C 187     -44.027   1.563  59.470  1.00 40.00           C  
+ATOM   4388  CG  GLU C 187     -44.621   1.816  58.089  1.00 40.00           C  
+ATOM   4389  CD  GLU C 187     -45.361   3.129  57.965  1.00 40.00           C  
+ATOM   4390  OE1 GLU C 187     -45.828   3.687  58.975  1.00 40.00           O  
+ATOM   4391  OE2 GLU C 187     -45.487   3.605  56.829  1.00 40.00           O  
+ATOM   4392  N   LYS C 188     -41.480   0.328  61.002  1.00 40.00           N  
+ATOM   4393  CA  LYS C 188     -40.634   0.277  62.202  1.00 40.00           C  
+ATOM   4394  C   LYS C 188     -40.372   1.675  62.713  1.00 40.00           C  
+ATOM   4395  O   LYS C 188     -39.677   2.468  62.080  1.00 40.00           O  
+ATOM   4396  CB  LYS C 188     -39.287  -0.423  61.943  1.00 40.00           C  
+ATOM   4397  CG  LYS C 188     -39.384  -1.907  61.604  1.00 40.00           C  
+ATOM   4398  CD  LYS C 188     -39.918  -2.763  62.755  1.00 40.00           C  
+ATOM   4399  CE  LYS C 188     -40.284  -4.179  62.305  1.00 40.00           C  
+ATOM   4400  NZ  LYS C 188     -39.143  -4.922  61.687  1.00 40.00           N  
+ATOM   4401  N   HIS C 189     -40.941   1.965  63.870  1.00 40.00           N  
+ATOM   4402  CA  HIS C 189     -40.704   3.228  64.521  1.00 40.00           C  
+ATOM   4403  C   HIS C 189     -40.034   2.983  65.820  1.00 40.00           C  
+ATOM   4404  O   HIS C 189     -40.355   2.010  66.518  1.00 40.00           O  
+ATOM   4405  CB  HIS C 189     -42.012   3.953  64.726  1.00 40.00           C  
+ATOM   4406  CG  HIS C 189     -42.684   4.312  63.446  1.00 40.00           C  
+ATOM   4407  ND1 HIS C 189     -42.669   5.560  62.949  1.00 40.00           N  
+ATOM   4408  CD2 HIS C 189     -43.367   3.526  62.530  1.00 40.00           C  
+ATOM   4409  CE1 HIS C 189     -43.331   5.581  61.784  1.00 40.00           C  
+ATOM   4410  NE2 HIS C 189     -43.754   4.332  61.525  1.00 40.00           N  
+ATOM   4411  N   ASP C 190     -39.086   3.856  66.148  1.00 40.00           N  
+ATOM   4412  CA  ASP C 190     -38.360   3.770  67.404  1.00 40.00           C  
+ATOM   4413  C   ASP C 190     -39.260   4.189  68.550  1.00 40.00           C  
+ATOM   4414  O   ASP C 190     -39.270   3.551  69.592  1.00 40.00           O  
+ATOM   4415  CB  ASP C 190     -37.103   4.624  67.332  1.00 40.00           C  
+ATOM   4416  CG  ASP C 190     -36.256   4.279  66.128  1.00 40.00           C  
+ATOM   4417  OD1 ASP C 190     -35.773   3.127  66.055  1.00 40.00           O  
+ATOM   4418  OD2 ASP C 190     -36.097   5.148  65.247  1.00 40.00           O  
+ATOM   4419  N   ASP C 191     -40.044   5.240  68.328  1.00 40.00           N  
+ATOM   4420  CA  ASP C 191     -41.009   5.723  69.317  1.00 40.00           C  
+ATOM   4421  C   ASP C 191     -42.292   4.905  69.364  1.00 40.00           C  
+ATOM   4422  O   ASP C 191     -43.088   5.023  70.286  1.00 40.00           O  
+ATOM   4423  CB  ASP C 191     -41.349   7.201  69.069  1.00 40.00           C  
+ATOM   4424  CG  ASP C 191     -41.728   7.487  67.634  1.00 40.00           C  
+ATOM   4425  OD1 ASP C 191     -40.908   7.202  66.736  1.00 40.00           O  
+ATOM   4426  OD2 ASP C 191     -42.834   8.019  67.410  1.00 40.00           O  
+ATOM   4427  N   TYR C 192     -42.495   4.071  68.363  1.00 40.00           N  
+ATOM   4428  CA  TYR C 192     -43.752   3.370  68.254  1.00 40.00           C  
+ATOM   4429  C   TYR C 192     -43.630   1.923  67.750  1.00 40.00           C  
+ATOM   4430  O   TYR C 192     -43.355   1.657  66.571  1.00 40.00           O  
+ATOM   4431  CB  TYR C 192     -44.743   4.185  67.408  1.00 40.00           C  
+ATOM   4432  CG  TYR C 192     -46.143   3.679  67.564  1.00 40.00           C  
+ATOM   4433  CD1 TYR C 192     -46.815   3.823  68.770  1.00 40.00           C  
+ATOM   4434  CD2 TYR C 192     -46.783   3.011  66.527  1.00 40.00           C  
+ATOM   4435  CE1 TYR C 192     -48.097   3.331  68.935  1.00 40.00           C  
+ATOM   4436  CE2 TYR C 192     -48.066   2.519  66.681  1.00 40.00           C  
+ATOM   4437  CZ  TYR C 192     -48.714   2.684  67.886  1.00 40.00           C  
+ATOM   4438  OH  TYR C 192     -49.979   2.196  68.060  1.00 40.00           O  
+ATOM   4439  N   LYS C 193     -43.821   0.989  68.670  1.00 40.00           N  
+ATOM   4440  CA  LYS C 193     -43.969  -0.402  68.306  1.00 40.00           C  
+ATOM   4441  C   LYS C 193     -45.244  -0.899  68.964  1.00 40.00           C  
+ATOM   4442  O   LYS C 193     -45.420  -0.786  70.181  1.00 40.00           O  
+ATOM   4443  CB  LYS C 193     -42.761  -1.223  68.750  1.00 40.00           C  
+ATOM   4444  CG  LYS C 193     -41.426  -0.735  68.204  1.00 40.00           C  
+ATOM   4445  CD  LYS C 193     -40.254  -1.252  69.035  1.00 40.00           C  
+ATOM   4446  CE  LYS C 193     -40.320  -0.835  70.507  1.00 40.00           C  
+ATOM   4447  NZ  LYS C 193     -40.254   0.640  70.725  1.00 40.00           N  
+ATOM   4448  N   PHE C 194     -46.147  -1.413  68.138  1.00 40.00           N  
+ATOM   4449  CA  PHE C 194     -47.423  -1.924  68.600  1.00 40.00           C  
+ATOM   4450  C   PHE C 194     -47.244  -3.324  69.159  1.00 40.00           C  
+ATOM   4451  O   PHE C 194     -46.361  -4.058  68.731  1.00 40.00           O  
+ATOM   4452  CB  PHE C 194     -48.425  -1.921  67.445  1.00 40.00           C  
+ATOM   4453  CG  PHE C 194     -49.781  -2.420  67.822  1.00 40.00           C  
+ATOM   4454  CD1 PHE C 194     -50.628  -1.651  68.593  1.00 40.00           C  
+ATOM   4455  CD2 PHE C 194     -50.210  -3.667  67.412  1.00 40.00           C  
+ATOM   4456  CE1 PHE C 194     -51.880  -2.121  68.954  1.00 40.00           C  
+ATOM   4457  CE2 PHE C 194     -51.467  -4.143  67.762  1.00 40.00           C  
+ATOM   4458  CZ  PHE C 194     -52.306  -3.365  68.534  1.00 40.00           C  
+ATOM   4459  N   ASN C 195     -48.072  -3.682  70.131  1.00 40.00           N  
+ATOM   4460  CA  ASN C 195     -48.074  -5.034  70.676  1.00 40.00           C  
+ATOM   4461  C   ASN C 195     -49.366  -5.358  71.447  1.00 40.00           C  
+ATOM   4462  O   ASN C 195     -49.339  -5.976  72.515  1.00 40.00           O  
+ATOM   4463  CB  ASN C 195     -46.815  -5.280  71.528  1.00 40.00           C  
+ATOM   4464  CG  ASN C 195     -46.470  -6.763  71.670  1.00 40.00           C  
+ATOM   4465  OD1 ASN C 195     -45.833  -7.164  72.651  1.00 40.00           O  
+ATOM   4466  ND2 ASN C 195     -46.883  -7.585  70.692  1.00 40.00           N  
+ATOM   4467  N   GLY C 196     -50.496  -4.925  70.895  1.00 40.00           N  
+ATOM   4468  CA  GLY C 196     -51.811  -5.301  71.416  1.00 40.00           C  
+ATOM   4469  C   GLY C 196     -52.510  -6.241  70.440  1.00 40.00           C  
+ATOM   4470  O   GLY C 196     -51.905  -7.213  69.952  1.00 40.00           O  
+ATOM   4471  N   LEU C 197     -53.777  -5.945  70.148  1.00 40.00           N  
+ATOM   4472  CA  LEU C 197     -54.571  -6.751  69.229  1.00 40.00           C  
+ATOM   4473  C   LEU C 197     -55.365  -5.882  68.280  1.00 40.00           C  
+ATOM   4474  O   LEU C 197     -56.271  -5.170  68.698  1.00 40.00           O  
+ATOM   4475  CB  LEU C 197     -55.527  -7.657  69.999  1.00 40.00           C  
+ATOM   4476  CG  LEU C 197     -56.495  -8.415  69.099  1.00 40.00           C  
+ATOM   4477  CD1 LEU C 197     -55.826  -9.634  68.460  1.00 40.00           C  
+ATOM   4478  CD2 LEU C 197     -57.733  -8.796  69.899  1.00 40.00           C  
+ATOM   4479  N   GLY C 198     -55.027  -5.954  67.000  1.00 40.00           N  
+ATOM   4480  CA  GLY C 198     -55.754  -5.215  65.977  1.00 40.00           C  
+ATOM   4481  C   GLY C 198     -56.840  -6.053  65.329  1.00 40.00           C  
+ATOM   4482  O   GLY C 198     -56.545  -6.917  64.508  1.00 40.00           O  
+ATOM   4483  N   TRP C 199     -58.097  -5.804  65.695  1.00 40.00           N  
+ATOM   4484  CA  TRP C 199     -59.223  -6.533  65.113  1.00 40.00           C  
+ATOM   4485  C   TRP C 199     -59.964  -5.665  64.162  1.00 40.00           C  
+ATOM   4486  O   TRP C 199     -60.401  -4.573  64.527  1.00 40.00           O  
+ATOM   4487  CB  TRP C 199     -60.186  -7.035  66.182  1.00 40.00           C  
+ATOM   4488  CG  TRP C 199     -60.897  -8.337  65.837  1.00 40.00           C  
+ATOM   4489  CD1 TRP C 199     -61.046  -8.919  64.582  1.00 40.00           C  
+ATOM   4490  CD2 TRP C 199     -61.603  -9.256  66.761  1.00 40.00           C  
+ATOM   4491  NE1 TRP C 199     -61.753 -10.092  64.662  1.00 40.00           N  
+ATOM   4492  CE2 TRP C 199     -62.120 -10.351  65.934  1.00 40.00           C  
+ATOM   4493  CE3 TRP C 199     -61.844  -9.279  68.138  1.00 40.00           C  
+ATOM   4494  CZ2 TRP C 199     -62.847 -11.405  66.479  1.00 40.00           C  
+ATOM   4495  CZ3 TRP C 199     -62.571 -10.353  68.678  1.00 40.00           C  
+ATOM   4496  CH2 TRP C 199     -63.060 -11.389  67.867  1.00 40.00           C  
+ATOM   4497  N   LEU C 200     -60.122  -6.165  62.936  1.00 40.00           N  
+ATOM   4498  CA  LEU C 200     -60.765  -5.430  61.846  1.00 40.00           C  
+ATOM   4499  C   LEU C 200     -61.991  -6.107  61.241  1.00 40.00           C  
+ATOM   4500  O   LEU C 200     -61.940  -7.261  60.787  1.00 40.00           O  
+ATOM   4501  CB  LEU C 200     -59.769  -5.151  60.731  1.00 40.00           C  
+ATOM   4502  CG  LEU C 200     -60.379  -4.613  59.440  1.00 40.00           C  
+ATOM   4503  CD1 LEU C 200     -61.115  -3.295  59.646  1.00 40.00           C  
+ATOM   4504  CD2 LEU C 200     -59.280  -4.468  58.408  1.00 40.00           C  
+ATOM   4505  N   PHE C 201     -63.078  -5.346  61.207  1.00 40.00           N  
+ATOM   4506  CA  PHE C 201     -64.310  -5.777  60.591  1.00 40.00           C  
+ATOM   4507  C   PHE C 201     -64.603  -4.868  59.399  1.00 40.00           C  
+ATOM   4508  O   PHE C 201     -64.741  -3.652  59.554  1.00 40.00           O  
+ATOM   4509  CB  PHE C 201     -65.450  -5.734  61.616  1.00 40.00           C  
+ATOM   4510  CG  PHE C 201     -65.383  -6.827  62.665  1.00 40.00           C  
+ATOM   4511  CD1 PHE C 201     -64.445  -6.783  63.693  1.00 40.00           C  
+ATOM   4512  CD2 PHE C 201     -66.279  -7.898  62.638  1.00 40.00           C  
+ATOM   4513  CE1 PHE C 201     -64.395  -7.790  64.656  1.00 40.00           C  
+ATOM   4514  CE2 PHE C 201     -66.237  -8.905  63.604  1.00 40.00           C  
+ATOM   4515  CZ  PHE C 201     -65.294  -8.852  64.613  1.00 40.00           C  
+ATOM   4516  N   LEU C 202     -64.667  -5.471  58.210  1.00 40.00           N  
+ATOM   4517  CA  LEU C 202     -64.990  -4.753  56.978  1.00 40.00           C  
+ATOM   4518  C   LEU C 202     -66.097  -5.377  56.150  1.00 40.00           C  
+ATOM   4519  O   LEU C 202     -65.958  -6.489  55.628  1.00 40.00           O  
+ATOM   4520  CB  LEU C 202     -63.774  -4.604  56.087  1.00 40.00           C  
+ATOM   4521  CG  LEU C 202     -64.180  -4.177  54.673  1.00 40.00           C  
+ATOM   4522  CD1 LEU C 202     -64.604  -2.702  54.588  1.00 40.00           C  
+ATOM   4523  CD2 LEU C 202     -63.042  -4.509  53.724  1.00 40.00           C  
+ATOM   4524  N   GLY C 203     -67.170  -4.613  55.988  1.00 40.00           N  
+ATOM   4525  CA  GLY C 203     -68.365  -5.072  55.299  1.00 40.00           C  
+ATOM   4526  C   GLY C 203     -68.535  -4.415  53.949  1.00 40.00           C  
+ATOM   4527  O   GLY C 203     -68.418  -3.194  53.817  1.00 40.00           O  
+ATOM   4528  N   VAL C 204     -68.815  -5.243  52.947  1.00 40.00           N  
+ATOM   4529  CA  VAL C 204     -68.987  -4.796  51.564  1.00 40.00           C  
+ATOM   4530  C   VAL C 204     -70.073  -5.591  50.847  1.00 40.00           C  
+ATOM   4531  O   VAL C 204     -70.547  -6.610  51.364  1.00 40.00           O  
+ATOM   4532  CB  VAL C 204     -67.695  -4.947  50.719  1.00 40.00           C  
+ATOM   4533  CG1 VAL C 204     -66.785  -3.744  50.890  1.00 40.00           C  
+ATOM   4534  CG2 VAL C 204     -66.980  -6.266  51.010  1.00 40.00           C  
+ATOM   4535  N   PRO C 205     -70.467  -5.126  49.645  1.00 40.00           N  
+ATOM   4536  CA  PRO C 205     -71.365  -5.875  48.748  1.00 40.00           C  
+ATOM   4537  C   PRO C 205     -70.840  -7.231  48.188  1.00 40.00           C  
+ATOM   4538  O   PRO C 205     -71.480  -8.271  48.365  1.00 40.00           O  
+ATOM   4539  CB  PRO C 205     -71.610  -4.877  47.598  1.00 40.00           C  
+ATOM   4540  CG  PRO C 205     -70.552  -3.821  47.725  1.00 40.00           C  
+ATOM   4541  CD  PRO C 205     -70.286  -3.728  49.194  1.00 40.00           C  
+ATOM   4542  N   THR C 206     -69.696  -7.201  47.513  1.00 40.00           N  
+ATOM   4543  CA  THR C 206     -69.220  -8.336  46.735  1.00 40.00           C  
+ATOM   4544  C   THR C 206     -67.819  -8.752  47.137  1.00 40.00           C  
+ATOM   4545  O   THR C 206     -67.154  -8.047  47.879  1.00 40.00           O  
+ATOM   4546  CB  THR C 206     -69.162  -7.971  45.249  1.00 40.00           C  
+ATOM   4547  OG1 THR C 206     -68.452  -6.733  45.087  1.00 40.00           O  
+ATOM   4548  CG2 THR C 206     -70.554  -7.832  44.690  1.00 40.00           C  
+ATOM   4549  N   SER C 207     -67.373  -9.902  46.644  1.00 40.00           N  
+ATOM   4550  CA  SER C 207     -65.972 -10.295  46.763  1.00 40.00           C  
+ATOM   4551  C   SER C 207     -65.131  -9.472  45.809  1.00 40.00           C  
+ATOM   4552  O   SER C 207     -63.908  -9.533  45.842  1.00 40.00           O  
+ATOM   4553  CB  SER C 207     -65.786 -11.782  46.463  1.00 40.00           C  
+ATOM   4554  OG  SER C 207     -66.038 -12.575  47.610  1.00 40.00           O  
+ATOM   4555  N   SER C 208     -65.810  -8.710  44.957  1.00 40.00           N  
+ATOM   4556  CA  SER C 208     -65.165  -7.803  44.014  1.00 40.00           C  
+ATOM   4557  C   SER C 208     -65.034  -6.405  44.594  1.00 40.00           C  
+ATOM   4558  O   SER C 208     -64.231  -5.613  44.107  1.00 40.00           O  
+ATOM   4559  CB  SER C 208     -65.924  -7.741  42.679  1.00 40.00           C  
+ATOM   4560  OG  SER C 208     -67.178  -7.087  42.817  1.00 40.00           O  
+ATOM   4561  N   SER C 209     -65.828  -6.104  45.620  1.00 40.00           N  
+ATOM   4562  CA  SER C 209     -65.718  -4.826  46.333  1.00 40.00           C  
+ATOM   4563  C   SER C 209     -64.754  -4.892  47.547  1.00 40.00           C  
+ATOM   4564  O   SER C 209     -64.613  -3.928  48.305  1.00 40.00           O  
+ATOM   4565  CB  SER C 209     -67.105  -4.326  46.761  1.00 40.00           C  
+ATOM   4566  OG  SER C 209     -67.974  -4.181  45.653  1.00 40.00           O  
+ATOM   4567  N   LEU C 210     -64.074  -6.024  47.702  1.00 40.00           N  
+ATOM   4568  CA  LEU C 210     -63.244  -6.305  48.877  1.00 40.00           C  
+ATOM   4569  C   LEU C 210     -61.841  -5.649  48.800  1.00 40.00           C  
+ATOM   4570  O   LEU C 210     -60.876  -6.252  48.316  1.00 40.00           O  
+ATOM   4571  CB  LEU C 210     -63.147  -7.830  49.052  1.00 40.00           C  
+ATOM   4572  CG  LEU C 210     -63.103  -8.506  50.424  1.00 40.00           C  
+ATOM   4573  CD1 LEU C 210     -64.430  -8.400  51.156  1.00 40.00           C  
+ATOM   4574  CD2 LEU C 210     -62.713  -9.963  50.255  1.00 40.00           C  
+ATOM   4575  N   LEU C 211     -61.736  -4.422  49.306  1.00 40.00           N  
+ATOM   4576  CA  LEU C 211     -60.522  -3.603  49.166  1.00 40.00           C  
+ATOM   4577  C   LEU C 211     -59.254  -4.123  49.895  1.00 40.00           C  
+ATOM   4578  O   LEU C 211     -59.331  -4.705  50.969  1.00 40.00           O  
+ATOM   4579  CB  LEU C 211     -60.833  -2.146  49.564  1.00 40.00           C  
+ATOM   4580  CG  LEU C 211     -62.145  -1.471  49.125  1.00 40.00           C  
+ATOM   4581  CD1 LEU C 211     -62.313  -0.115  49.786  1.00 40.00           C  
+ATOM   4582  CD2 LEU C 211     -62.231  -1.312  47.621  1.00 40.00           C  
+ATOM   4583  N   TYR C 212     -58.097  -3.928  49.267  1.00 40.00           N  
+ATOM   4584  CA  TYR C 212     -56.783  -4.133  49.887  1.00 40.00           C  
+ATOM   4585  C   TYR C 212     -56.508  -5.496  50.536  1.00 40.00           C  
+ATOM   4586  O   TYR C 212     -55.508  -5.646  51.236  1.00 40.00           O  
+ATOM   4587  CB  TYR C 212     -56.511  -3.036  50.920  1.00 40.00           C  
+ATOM   4588  CG  TYR C 212     -56.798  -1.621  50.472  1.00 40.00           C  
+ATOM   4589  CD1 TYR C 212     -55.823  -0.856  49.840  1.00 40.00           C  
+ATOM   4590  CD2 TYR C 212     -58.026  -1.036  50.719  1.00 40.00           C  
+ATOM   4591  CE1 TYR C 212     -56.077   0.441  49.441  1.00 40.00           C  
+ATOM   4592  CE2 TYR C 212     -58.293   0.256  50.321  1.00 40.00           C  
+ATOM   4593  CZ  TYR C 212     -57.315   0.990  49.686  1.00 40.00           C  
+ATOM   4594  OH  TYR C 212     -57.583   2.281  49.295  1.00 40.00           O  
+ATOM   4595  N   LYS C 213     -57.371  -6.481  50.289  1.00 40.00           N  
+ATOM   4596  CA  LYS C 213     -57.327  -7.806  50.959  1.00 40.00           C  
+ATOM   4597  C   LYS C 213     -55.953  -8.504  51.050  1.00 40.00           C  
+ATOM   4598  O   LYS C 213     -55.599  -9.012  52.117  1.00 40.00           O  
+ATOM   4599  CB  LYS C 213     -58.376  -8.747  50.343  1.00 40.00           C  
+ATOM   4600  CG  LYS C 213     -58.310 -10.212  50.773  1.00 40.00           C  
+ATOM   4601  CD  LYS C 213     -59.049 -11.103  49.775  1.00 40.00           C  
+ATOM   4602  CE  LYS C 213     -58.738 -12.585  49.945  1.00 40.00           C  
+ATOM   4603  NZ  LYS C 213     -59.547 -13.251  51.004  1.00 40.00           N  
+ATOM   4604  N   GLU C 214     -55.203  -8.533  49.942  1.00 40.00           N  
+ATOM   4605  CA  GLU C 214     -53.857  -9.168  49.882  1.00 40.00           C  
+ATOM   4606  C   GLU C 214     -52.842  -8.451  50.784  1.00 40.00           C  
+ATOM   4607  O   GLU C 214     -51.827  -9.034  51.176  1.00 40.00           O  
+ATOM   4608  CB  GLU C 214     -53.275  -9.237  48.446  1.00 40.00           C  
+ATOM   4609  CG  GLU C 214     -54.242  -8.988  47.297  1.00 40.00           C  
+ATOM   4610  CD  GLU C 214     -54.952  -7.636  47.401  1.00 40.00           C  
+ATOM   4611  OE1 GLU C 214     -54.374  -6.660  47.959  1.00 40.00           O  
+ATOM   4612  OE2 GLU C 214     -56.113  -7.556  46.938  1.00 40.00           O  
+ATOM   4613  N   GLU C 215     -53.107  -7.185  51.091  1.00 40.00           N  
+ATOM   4614  CA  GLU C 215     -52.263  -6.443  51.995  1.00 40.00           C  
+ATOM   4615  C   GLU C 215     -52.486  -6.969  53.390  1.00 40.00           C  
+ATOM   4616  O   GLU C 215     -51.577  -7.487  54.013  1.00 40.00           O  
+ATOM   4617  CB  GLU C 215     -52.587  -4.959  51.921  1.00 40.00           C  
+ATOM   4618  CG  GLU C 215     -52.154  -4.306  50.619  1.00 40.00           C  
+ATOM   4619  CD  GLU C 215     -52.280  -2.791  50.646  1.00 40.00           C  
+ATOM   4620  OE1 GLU C 215     -52.327  -2.185  51.739  1.00 40.00           O  
+ATOM   4621  OE2 GLU C 215     -52.331  -2.194  49.556  1.00 40.00           O  
+ATOM   4622  N   PHE C 216     -53.718  -6.857  53.862  1.00 40.00           N  
+ATOM   4623  CA  PHE C 216     -54.071  -7.365  55.173  1.00 40.00           C  
+ATOM   4624  C   PHE C 216     -53.679  -8.823  55.299  1.00 40.00           C  
+ATOM   4625  O   PHE C 216     -53.290  -9.276  56.372  1.00 40.00           O  
+ATOM   4626  CB  PHE C 216     -55.568  -7.237  55.405  1.00 40.00           C  
+ATOM   4627  CG  PHE C 216     -56.116  -5.880  55.091  1.00 40.00           C  
+ATOM   4628  CD1 PHE C 216     -55.735  -4.778  55.837  1.00 40.00           C  
+ATOM   4629  CD2 PHE C 216     -57.029  -5.705  54.056  1.00 40.00           C  
+ATOM   4630  CE1 PHE C 216     -56.243  -3.519  55.553  1.00 40.00           C  
+ATOM   4631  CE2 PHE C 216     -57.543  -4.449  53.771  1.00 40.00           C  
+ATOM   4632  CZ  PHE C 216     -57.147  -3.352  54.521  1.00 40.00           C  
+ATOM   4633  N   GLY C 217     -53.814  -9.558  54.198  1.00 40.00           N  
+ATOM   4634  CA  GLY C 217     -53.293 -10.912  54.114  1.00 40.00           C  
+ATOM   4635  C   GLY C 217     -51.851 -10.910  54.586  1.00 40.00           C  
+ATOM   4636  O   GLY C 217     -51.530 -11.515  55.616  1.00 40.00           O  
+ATOM   4637  N   LYS C 218     -50.996 -10.185  53.858  1.00 40.00           N  
+ATOM   4638  CA  LYS C 218     -49.560 -10.100  54.169  1.00 40.00           C  
+ATOM   4639  C   LYS C 218     -49.304  -9.705  55.630  1.00 40.00           C  
+ATOM   4640  O   LYS C 218     -48.277 -10.071  56.218  1.00 40.00           O  
+ATOM   4641  CB  LYS C 218     -48.847  -9.133  53.210  1.00 40.00           C  
+ATOM   4642  CG  LYS C 218     -48.689  -9.661  51.785  1.00 40.00           C  
+ATOM   4643  CD  LYS C 218     -47.932  -8.694  50.872  1.00 40.00           C  
+ATOM   4644  CE  LYS C 218     -48.839  -7.669  50.191  1.00 40.00           C  
+ATOM   4645  NZ  LYS C 218     -48.065  -6.833  49.228  1.00 40.00           N  
+ATOM   4646  N   MET C 219     -50.257  -8.972  56.202  1.00 40.00           N  
+ATOM   4647  CA  MET C 219     -50.195  -8.552  57.590  1.00 40.00           C  
+ATOM   4648  C   MET C 219     -50.487  -9.728  58.501  1.00 40.00           C  
+ATOM   4649  O   MET C 219     -49.641 -10.120  59.305  1.00 40.00           O  
+ATOM   4650  CB  MET C 219     -51.199  -7.434  57.841  1.00 40.00           C  
+ATOM   4651  CG  MET C 219     -51.043  -6.257  56.896  1.00 40.00           C  
+ATOM   4652  SD  MET C 219     -51.644  -4.733  57.631  1.00 40.00           S  
+ATOM   4653  CE  MET C 219     -51.254  -3.579  56.313  1.00 40.00           C  
+ATOM   4654  N   LYS C 220     -51.685 -10.290  58.356  1.00 40.00           N  
+ATOM   4655  CA  LYS C 220     -52.101 -11.473  59.101  1.00 40.00           C  
+ATOM   4656  C   LYS C 220     -51.044 -12.559  59.011  1.00 40.00           C  
+ATOM   4657  O   LYS C 220     -50.943 -13.419  59.886  1.00 40.00           O  
+ATOM   4658  CB  LYS C 220     -53.432 -11.990  58.552  1.00 40.00           C  
+ATOM   4659  CG  LYS C 220     -53.931 -13.274  59.194  1.00 40.00           C  
+ATOM   4660  CD  LYS C 220     -54.262 -13.065  60.658  1.00 40.00           C  
+ATOM   4661  CE  LYS C 220     -54.685 -14.368  61.303  1.00 40.00           C  
+ATOM   4662  NZ  LYS C 220     -54.931 -14.153  62.749  1.00 40.00           N  
+ATOM   4663  N   GLU C 221     -50.254 -12.498  57.944  1.00 40.00           N  
+ATOM   4664  CA  GLU C 221     -49.194 -13.465  57.715  1.00 40.00           C  
+ATOM   4665  C   GLU C 221     -47.900 -13.138  58.483  1.00 40.00           C  
+ATOM   4666  O   GLU C 221     -47.156 -14.053  58.859  1.00 40.00           O  
+ATOM   4667  CB  GLU C 221     -48.917 -13.626  56.220  1.00 40.00           C  
+ATOM   4668  CG  GLU C 221     -48.288 -14.962  55.855  1.00 40.00           C  
+ATOM   4669  CD  GLU C 221     -47.477 -14.880  54.589  1.00 40.00           C  
+ATOM   4670  OE1 GLU C 221     -47.949 -14.239  53.626  1.00 40.00           O  
+ATOM   4671  OE2 GLU C 221     -46.368 -15.450  54.565  1.00 40.00           O  
+ATOM   4672  N   ARG C 222     -47.617 -11.860  58.722  1.00 40.00           N  
+ATOM   4673  CA  ARG C 222     -46.439 -11.528  59.519  1.00 40.00           C  
+ATOM   4674  C   ARG C 222     -46.753 -11.171  60.969  1.00 40.00           C  
+ATOM   4675  O   ARG C 222     -45.840 -10.987  61.756  1.00 40.00           O  
+ATOM   4676  CB  ARG C 222     -45.563 -10.473  58.841  1.00 40.00           C  
+ATOM   4677  CG  ARG C 222     -46.318  -9.305  58.244  1.00 40.00           C  
+ATOM   4678  CD  ARG C 222     -45.437  -8.605  57.233  1.00 40.00           C  
+ATOM   4679  NE  ARG C 222     -44.316  -7.933  57.887  1.00 40.00           N  
+ATOM   4680  CZ  ARG C 222     -43.426  -7.158  57.268  1.00 40.00           C  
+ATOM   4681  NH1 ARG C 222     -43.499  -6.939  55.958  1.00 40.00           N  
+ATOM   4682  NH2 ARG C 222     -42.451  -6.592  57.963  1.00 40.00           N  
+ATOM   4683  N   ALA C 223     -48.033 -11.101  61.325  1.00 40.00           N  
+ATOM   4684  CA  ALA C 223     -48.428 -10.907  62.725  1.00 40.00           C  
+ATOM   4685  C   ALA C 223     -49.727 -11.634  63.084  1.00 40.00           C  
+ATOM   4686  O   ALA C 223     -50.747 -11.005  63.361  1.00 40.00           O  
+ATOM   4687  CB  ALA C 223     -48.525  -9.429  63.056  1.00 40.00           C  
+ATOM   4688  N   PRO C 224     -49.683 -12.972  63.103  1.00 40.00           N  
+ATOM   4689  CA  PRO C 224     -50.866 -13.826  63.235  1.00 40.00           C  
+ATOM   4690  C   PRO C 224     -51.702 -13.582  64.485  1.00 40.00           C  
+ATOM   4691  O   PRO C 224     -52.929 -13.594  64.401  1.00 40.00           O  
+ATOM   4692  CB  PRO C 224     -50.282 -15.241  63.270  1.00 40.00           C  
+ATOM   4693  CG  PRO C 224     -48.845 -15.070  63.626  1.00 40.00           C  
+ATOM   4694  CD  PRO C 224     -48.441 -13.759  63.037  1.00 40.00           C  
+ATOM   4695  N   GLU C 225     -51.047 -13.372  65.627  1.00 40.00           N  
+ATOM   4696  CA  GLU C 225     -51.765 -13.157  66.898  1.00 40.00           C  
+ATOM   4697  C   GLU C 225     -52.083 -11.685  67.181  1.00 40.00           C  
+ATOM   4698  O   GLU C 225     -53.025 -11.382  67.928  1.00 40.00           O  
+ATOM   4699  CB  GLU C 225     -51.025 -13.776  68.096  1.00 40.00           C  
+ATOM   4700  CG  GLU C 225     -49.642 -13.211  68.345  1.00 40.00           C  
+ATOM   4701  CD  GLU C 225     -48.554 -14.141  67.861  1.00 40.00           C  
+ATOM   4702  OE1 GLU C 225     -48.673 -14.689  66.746  1.00 40.00           O  
+ATOM   4703  OE2 GLU C 225     -47.577 -14.328  68.610  1.00 40.00           O  
+ATOM   4704  N   ASN C 226     -51.297 -10.788  66.583  1.00 40.00           N  
+ATOM   4705  CA  ASN C 226     -51.452  -9.341  66.775  1.00 40.00           C  
+ATOM   4706  C   ASN C 226     -52.446  -8.710  65.798  1.00 40.00           C  
+ATOM   4707  O   ASN C 226     -52.762  -7.512  65.894  1.00 40.00           O  
+ATOM   4708  CB  ASN C 226     -50.095  -8.646  66.674  1.00 40.00           C  
+ATOM   4709  CG  ASN C 226     -49.067  -9.252  67.604  1.00 40.00           C  
+ATOM   4710  OD1 ASN C 226     -49.105  -9.044  68.820  1.00 40.00           O  
+ATOM   4711  ND2 ASN C 226     -48.145 -10.018  67.035  1.00 40.00           N  
+ATOM   4712  N   PHE C 227     -52.934  -9.532  64.870  1.00 40.00           N  
+ATOM   4713  CA  PHE C 227     -53.906  -9.115  63.869  1.00 40.00           C  
+ATOM   4714  C   PHE C 227     -54.972 -10.183  63.683  1.00 40.00           C  
+ATOM   4715  O   PHE C 227     -54.682 -11.378  63.644  1.00 40.00           O  
+ATOM   4716  CB  PHE C 227     -53.201  -8.822  62.542  1.00 40.00           C  
+ATOM   4717  CG  PHE C 227     -54.075  -8.163  61.500  1.00 40.00           C  
+ATOM   4718  CD1 PHE C 227     -55.058  -7.238  61.852  1.00 40.00           C  
+ATOM   4719  CD2 PHE C 227     -53.872  -8.433  60.147  1.00 40.00           C  
+ATOM   4720  CE1 PHE C 227     -55.841  -6.631  60.880  1.00 40.00           C  
+ATOM   4721  CE2 PHE C 227     -54.643  -7.816  59.169  1.00 40.00           C  
+ATOM   4722  CZ  PHE C 227     -55.631  -6.916  59.537  1.00 40.00           C  
+ATOM   4723  N   ARG C 228     -56.211  -9.728  63.589  1.00 40.00           N  
+ATOM   4724  CA  ARG C 228     -57.340 -10.587  63.332  1.00 40.00           C  
+ATOM   4725  C   ARG C 228     -58.215  -9.853  62.328  1.00 40.00           C  
+ATOM   4726  O   ARG C 228     -58.568  -8.698  62.552  1.00 40.00           O  
+ATOM   4727  CB  ARG C 228     -58.094 -10.864  64.636  1.00 40.00           C  
+ATOM   4728  CG  ARG C 228     -57.324 -11.720  65.638  1.00 40.00           C  
+ATOM   4729  CD  ARG C 228     -58.196 -12.158  66.810  1.00 40.00           C  
+ATOM   4730  NE  ARG C 228     -59.360 -12.940  66.378  1.00 40.00           N  
+ATOM   4731  CZ  ARG C 228     -60.306 -13.437  67.181  1.00 40.00           C  
+ATOM   4732  NH1 ARG C 228     -60.265 -13.246  68.497  1.00 40.00           N  
+ATOM   4733  NH2 ARG C 228     -61.315 -14.131  66.658  1.00 40.00           N  
+ATOM   4734  N   VAL C 229     -58.532 -10.494  61.205  1.00 40.00           N  
+ATOM   4735  CA  VAL C 229     -59.426  -9.886  60.220  1.00 40.00           C  
+ATOM   4736  C   VAL C 229     -60.704 -10.675  60.083  1.00 40.00           C  
+ATOM   4737  O   VAL C 229     -60.744 -11.867  60.360  1.00 40.00           O  
+ATOM   4738  CB  VAL C 229     -58.805  -9.828  58.828  1.00 40.00           C  
+ATOM   4739  CG1 VAL C 229     -59.325  -8.610  58.084  1.00 40.00           C  
+ATOM   4740  CG2 VAL C 229     -57.295  -9.812  58.929  1.00 40.00           C  
+ATOM   4741  N   ASP C 230     -61.750  -9.993  59.645  1.00 40.00           N  
+ATOM   4742  CA  ASP C 230     -63.021 -10.624  59.382  1.00 40.00           C  
+ATOM   4743  C   ASP C 230     -63.693  -9.797  58.322  1.00 40.00           C  
+ATOM   4744  O   ASP C 230     -63.754  -8.573  58.457  1.00 40.00           O  
+ATOM   4745  CB  ASP C 230     -63.878 -10.630  60.644  1.00 40.00           C  
+ATOM   4746  CG  ASP C 230     -63.542 -11.780  61.566  1.00 40.00           C  
+ATOM   4747  OD1 ASP C 230     -64.153 -12.855  61.407  1.00 40.00           O  
+ATOM   4748  OD2 ASP C 230     -62.674 -11.612  62.449  1.00 40.00           O  
+ATOM   4749  N   TYR C 231     -64.182 -10.449  57.266  1.00 40.00           N  
+ATOM   4750  CA  TYR C 231     -64.920  -9.750  56.226  1.00 40.00           C  
+ATOM   4751  C   TYR C 231     -66.376 -10.139  56.282  1.00 40.00           C  
+ATOM   4752  O   TYR C 231     -66.725 -11.166  56.859  1.00 40.00           O  
+ATOM   4753  CB  TYR C 231     -64.356 -10.066  54.860  1.00 40.00           C  
+ATOM   4754  CG  TYR C 231     -62.884  -9.803  54.746  1.00 40.00           C  
+ATOM   4755  CD1 TYR C 231     -61.955 -10.748  55.175  1.00 40.00           C  
+ATOM   4756  CD2 TYR C 231     -62.408  -8.611  54.199  1.00 40.00           C  
+ATOM   4757  CE1 TYR C 231     -60.587 -10.513  55.061  1.00 40.00           C  
+ATOM   4758  CE2 TYR C 231     -61.039  -8.368  54.076  1.00 40.00           C  
+ATOM   4759  CZ  TYR C 231     -60.131  -9.321  54.506  1.00 40.00           C  
+ATOM   4760  OH  TYR C 231     -58.780  -9.088  54.379  1.00 40.00           O  
+ATOM   4761  N   ALA C 232     -67.222  -9.298  55.697  1.00 40.00           N  
+ATOM   4762  CA  ALA C 232     -68.665  -9.534  55.656  1.00 40.00           C  
+ATOM   4763  C   ALA C 232     -69.214  -9.140  54.291  1.00 40.00           C  
+ATOM   4764  O   ALA C 232     -69.485  -7.964  54.023  1.00 40.00           O  
+ATOM   4765  CB  ALA C 232     -69.377  -8.772  56.772  1.00 40.00           C  
+ATOM   4766  N   VAL C 233     -69.349 -10.136  53.422  1.00 40.00           N  
+ATOM   4767  CA  VAL C 233     -69.861  -9.918  52.080  1.00 40.00           C  
+ATOM   4768  C   VAL C 233     -71.377 -10.126  52.108  1.00 40.00           C  
+ATOM   4769  O   VAL C 233     -71.866 -11.257  52.197  1.00 40.00           O  
+ATOM   4770  CB  VAL C 233     -69.169 -10.832  51.041  1.00 40.00           C  
+ATOM   4771  CG1 VAL C 233     -69.240 -10.199  49.661  1.00 40.00           C  
+ATOM   4772  CG2 VAL C 233     -67.712 -11.093  51.416  1.00 40.00           C  
+ATOM   4773  N   SER C 234     -72.107  -9.013  52.054  1.00 40.00           N  
+ATOM   4774  CA  SER C 234     -73.566  -9.013  52.182  1.00 40.00           C  
+ATOM   4775  C   SER C 234     -74.268  -9.823  51.087  1.00 40.00           C  
+ATOM   4776  O   SER C 234     -75.294 -10.460  51.339  1.00 40.00           O  
+ATOM   4777  CB  SER C 234     -74.124  -7.578  52.256  1.00 40.00           C  
+ATOM   4778  OG  SER C 234     -74.119  -6.898  51.005  1.00 40.00           O  
+ATOM   4779  N   ARG C 235     -73.700  -9.816  49.883  1.00 40.00           N  
+ATOM   4780  CA  ARG C 235     -74.303 -10.505  48.741  1.00 40.00           C  
+ATOM   4781  C   ARG C 235     -73.664 -11.842  48.361  1.00 40.00           C  
+ATOM   4782  O   ARG C 235     -73.834 -12.267  47.224  1.00 40.00           O  
+ATOM   4783  CB  ARG C 235     -74.244  -9.616  47.511  1.00 40.00           C  
+ATOM   4784  CG  ARG C 235     -75.199  -8.458  47.535  1.00 40.00           C  
+ATOM   4785  CD  ARG C 235     -75.135  -7.813  46.175  1.00 40.00           C  
+ATOM   4786  NE  ARG C 235     -75.651  -6.450  46.194  1.00 40.00           N  
+ATOM   4787  CZ  ARG C 235     -75.338  -5.515  45.298  1.00 40.00           C  
+ATOM   4788  NH1 ARG C 235     -74.496  -5.789  44.303  1.00 40.00           N  
+ATOM   4789  NH2 ARG C 235     -75.861  -4.298  45.401  1.00 40.00           N  
+ATOM   4790  N   GLU C 236     -72.931 -12.492  49.274  1.00 40.00           N  
+ATOM   4791  CA  GLU C 236     -72.218 -13.755  48.969  1.00 40.00           C  
+ATOM   4792  C   GLU C 236     -72.051 -14.651  50.177  1.00 40.00           C  
+ATOM   4793  O   GLU C 236     -71.422 -15.706  50.096  1.00 40.00           O  
+ATOM   4794  CB  GLU C 236     -70.828 -13.484  48.390  1.00 40.00           C  
+ATOM   4795  CG  GLU C 236     -70.812 -13.070  46.927  1.00 40.00           C  
+ATOM   4796  CD  GLU C 236     -69.415 -12.796  46.410  1.00 40.00           C  
+ATOM   4797  OE1 GLU C 236     -68.525 -13.663  46.595  1.00 40.00           O  
+ATOM   4798  OE2 GLU C 236     -69.219 -11.713  45.813  1.00 40.00           O  
+ATOM   4799  N   GLN C 237     -72.581 -14.204  51.304  1.00 40.00           N  
+ATOM   4800  CA  GLN C 237     -72.544 -14.981  52.524  1.00 40.00           C  
+ATOM   4801  C   GLN C 237     -73.824 -14.731  53.293  1.00 40.00           C  
+ATOM   4802  O   GLN C 237     -74.415 -13.644  53.222  1.00 40.00           O  
+ATOM   4803  CB  GLN C 237     -71.361 -14.578  53.412  1.00 40.00           C  
+ATOM   4804  CG  GLN C 237     -69.967 -14.751  52.819  1.00 40.00           C  
+ATOM   4805  CD  GLN C 237     -68.910 -13.929  53.552  1.00 40.00           C  
+ATOM   4806  OE1 GLN C 237     -69.207 -12.893  54.153  1.00 40.00           O  
+ATOM   4807  NE2 GLN C 237     -67.667 -14.389  53.499  1.00 40.00           N  
+ATOM   4808  N   THR C 238     -74.249 -15.765  54.013  1.00 40.00           N  
+ATOM   4809  CA  THR C 238     -75.267 -15.645  55.056  1.00 40.00           C  
+ATOM   4810  C   THR C 238     -74.799 -16.417  56.309  1.00 40.00           C  
+ATOM   4811  O   THR C 238     -73.823 -17.201  56.266  1.00 40.00           O  
+ATOM   4812  CB  THR C 238     -76.690 -16.103  54.601  1.00 40.00           C  
+ATOM   4813  OG1 THR C 238     -76.712 -17.514  54.343  1.00 40.00           O  
+ATOM   4814  CG2 THR C 238     -77.168 -15.337  53.352  1.00 40.00           C  
+ATOM   4815  N   ASN C 239     -75.482 -16.168  57.425  1.00 40.00           N  
+ATOM   4816  CA  ASN C 239     -75.183 -16.843  58.689  1.00 40.00           C  
+ATOM   4817  C   ASN C 239     -75.899 -18.197  58.816  1.00 40.00           C  
+ATOM   4818  O   ASN C 239     -76.573 -18.657  57.876  1.00 40.00           O  
+ATOM   4819  CB  ASN C 239     -75.468 -15.913  59.906  1.00 40.00           C  
+ATOM   4820  CG  ASN C 239     -76.900 -15.354  59.931  1.00 40.00           C  
+ATOM   4821  OD1 ASN C 239     -77.554 -15.216  58.895  1.00 40.00           O  
+ATOM   4822  ND2 ASN C 239     -77.378 -15.016  61.128  1.00 40.00           N  
+ATOM   4823  N   ALA C 240     -75.730 -18.835  59.974  1.00 40.00           N  
+ATOM   4824  CA  ALA C 240     -76.516 -20.008  60.327  1.00 40.00           C  
+ATOM   4825  C   ALA C 240     -78.010 -19.677  60.212  1.00 40.00           C  
+ATOM   4826  O   ALA C 240     -78.797 -20.492  59.713  1.00 40.00           O  
+ATOM   4827  CB  ALA C 240     -76.163 -20.486  61.731  1.00 40.00           C  
+ATOM   4828  N   ALA C 241     -78.383 -18.468  60.635  1.00 40.00           N  
+ATOM   4829  CA  ALA C 241     -79.770 -18.005  60.556  1.00 40.00           C  
+ATOM   4830  C   ALA C 241     -80.267 -17.639  59.129  1.00 40.00           C  
+ATOM   4831  O   ALA C 241     -81.400 -17.154  58.979  1.00 40.00           O  
+ATOM   4832  CB  ALA C 241     -80.000 -16.859  61.537  1.00 40.00           C  
+ATOM   4833  N   GLY C 242     -79.439 -17.878  58.101  1.00 40.00           N  
+ATOM   4834  CA  GLY C 242     -79.812 -17.649  56.685  1.00 40.00           C  
+ATOM   4835  C   GLY C 242     -80.131 -16.217  56.243  1.00 40.00           C  
+ATOM   4836  O   GLY C 242     -80.959 -16.008  55.340  1.00 40.00           O  
+ATOM   4837  N   GLU C 243     -79.471 -15.240  56.879  1.00 40.00           N  
+ATOM   4838  CA  GLU C 243     -79.617 -13.797  56.563  1.00 40.00           C  
+ATOM   4839  C   GLU C 243     -78.301 -13.226  56.023  1.00 40.00           C  
+ATOM   4840  O   GLU C 243     -77.219 -13.757  56.308  1.00 40.00           O  
+ATOM   4841  CB  GLU C 243     -80.033 -12.986  57.793  1.00 40.00           C  
+ATOM   4842  CG  GLU C 243     -80.657 -13.808  58.904  1.00 40.00           C  
+ATOM   4843  CD  GLU C 243     -80.512 -13.141  60.249  1.00 40.00           C  
+ATOM   4844  OE1 GLU C 243     -81.036 -12.011  60.386  1.00 40.00           O  
+ATOM   4845  OE2 GLU C 243     -79.878 -13.742  61.157  1.00 40.00           O  
+ATOM   4846  N   ARG C 244     -78.403 -12.131  55.267  1.00 40.00           N  
+ATOM   4847  CA  ARG C 244     -77.258 -11.546  54.561  1.00 40.00           C  
+ATOM   4848  C   ARG C 244     -76.153 -11.059  55.502  1.00 40.00           C  
+ATOM   4849  O   ARG C 244     -76.437 -10.346  56.470  1.00 40.00           O  
+ATOM   4850  CB  ARG C 244     -77.736 -10.398  53.676  1.00 40.00           C  
+ATOM   4851  CG  ARG C 244     -78.369 -10.838  52.370  1.00 40.00           C  
+ATOM   4852  CD  ARG C 244     -78.677  -9.617  51.524  1.00 40.00           C  
+ATOM   4853  NE  ARG C 244     -79.229  -9.964  50.220  1.00 40.00           N  
+ATOM   4854  CZ  ARG C 244     -80.074  -9.195  49.534  1.00 40.00           C  
+ATOM   4855  NH1 ARG C 244     -80.482  -8.032  50.029  1.00 40.00           N  
+ATOM   4856  NH2 ARG C 244     -80.527  -9.592  48.354  1.00 40.00           N  
+ATOM   4857  N   MET C 245     -74.904 -11.433  55.207  1.00 40.00           N  
+ATOM   4858  CA  MET C 245     -73.764 -11.100  56.083  1.00 40.00           C  
+ATOM   4859  C   MET C 245     -73.396  -9.623  56.060  1.00 40.00           C  
+ATOM   4860  O   MET C 245     -72.573  -9.167  55.260  1.00 40.00           O  
+ATOM   4861  CB  MET C 245     -72.530 -11.962  55.780  1.00 40.00           C  
+ATOM   4862  CG  MET C 245     -71.451 -11.903  56.855  1.00 40.00           C  
+ATOM   4863  SD  MET C 245     -72.010 -12.534  58.449  1.00 40.00           S  
+ATOM   4864  CE  MET C 245     -72.063 -14.302  58.147  1.00 40.00           C  
+ATOM   4865  N   TYR C 246     -74.033  -8.885  56.956  1.00 40.00           N  
+ATOM   4866  CA  TYR C 246     -73.697  -7.499  57.179  1.00 40.00           C  
+ATOM   4867  C   TYR C 246     -72.656  -7.425  58.272  1.00 40.00           C  
+ATOM   4868  O   TYR C 246     -72.459  -8.384  59.030  1.00 40.00           O  
+ATOM   4869  CB  TYR C 246     -74.949  -6.698  57.521  1.00 40.00           C  
+ATOM   4870  CG  TYR C 246     -75.907  -6.704  56.373  1.00 40.00           C  
+ATOM   4871  CD1 TYR C 246     -75.485  -6.291  55.116  1.00 40.00           C  
+ATOM   4872  CD2 TYR C 246     -77.216  -7.157  56.523  1.00 40.00           C  
+ATOM   4873  CE1 TYR C 246     -76.340  -6.308  54.032  1.00 40.00           C  
+ATOM   4874  CE2 TYR C 246     -78.090  -7.177  55.445  1.00 40.00           C  
+ATOM   4875  CZ  TYR C 246     -77.645  -6.750  54.198  1.00 40.00           C  
+ATOM   4876  OH  TYR C 246     -78.487  -6.750  53.101  1.00 40.00           O  
+ATOM   4877  N   ILE C 247     -71.963  -6.296  58.329  1.00 40.00           N  
+ATOM   4878  CA  ILE C 247     -70.920  -6.117  59.318  1.00 40.00           C  
+ATOM   4879  C   ILE C 247     -71.410  -6.649  60.670  1.00 40.00           C  
+ATOM   4880  O   ILE C 247     -70.770  -7.529  61.253  1.00 40.00           O  
+ATOM   4881  CB  ILE C 247     -70.411  -4.646  59.365  1.00 40.00           C  
+ATOM   4882  CG1 ILE C 247     -69.286  -4.499  60.396  1.00 40.00           C  
+ATOM   4883  CG2 ILE C 247     -71.546  -3.644  59.597  1.00 40.00           C  
+ATOM   4884  CD1 ILE C 247     -68.284  -3.408  60.075  1.00 40.00           C  
+ATOM   4885  N   GLN C 248     -72.579  -6.161  61.103  1.00 40.00           N  
+ATOM   4886  CA  GLN C 248     -73.181  -6.511  62.389  1.00 40.00           C  
+ATOM   4887  C   GLN C 248     -73.349  -8.007  62.527  1.00 40.00           C  
+ATOM   4888  O   GLN C 248     -73.117  -8.567  63.600  1.00 40.00           O  
+ATOM   4889  CB  GLN C 248     -74.529  -5.800  62.598  1.00 40.00           C  
+ATOM   4890  CG  GLN C 248     -75.606  -6.096  61.562  1.00 40.00           C  
+ATOM   4891  CD  GLN C 248     -75.602  -5.108  60.414  1.00 40.00           C  
+ATOM   4892  OE1 GLN C 248     -74.550  -4.721  59.911  1.00 40.00           O  
+ATOM   4893  NE2 GLN C 248     -76.784  -4.697  59.991  1.00 40.00           N  
+ATOM   4894  N   THR C 249     -73.732  -8.648  61.429  1.00 40.00           N  
+ATOM   4895  CA  THR C 249     -73.978 -10.080  61.420  1.00 40.00           C  
+ATOM   4896  C   THR C 249     -72.677 -10.827  61.692  1.00 40.00           C  
+ATOM   4897  O   THR C 249     -72.639 -11.738  62.522  1.00 40.00           O  
+ATOM   4898  CB  THR C 249     -74.587 -10.526  60.084  1.00 40.00           C  
+ATOM   4899  OG1 THR C 249     -75.322  -9.437  59.516  1.00 40.00           O  
+ATOM   4900  CG2 THR C 249     -75.509 -11.715  60.287  1.00 40.00           C  
+ATOM   4901  N   ARG C 250     -71.613 -10.414  61.009  1.00 40.00           N  
+ATOM   4902  CA  ARG C 250     -70.298 -11.004  61.200  1.00 40.00           C  
+ATOM   4903  C   ARG C 250     -69.831 -10.786  62.629  1.00 40.00           C  
+ATOM   4904  O   ARG C 250     -69.279 -11.685  63.262  1.00 40.00           O  
+ATOM   4905  CB  ARG C 250     -69.298 -10.399  60.208  1.00 40.00           C  
+ATOM   4906  CG  ARG C 250     -67.853 -10.861  60.383  1.00 40.00           C  
+ATOM   4907  CD  ARG C 250     -67.659 -12.323  60.023  1.00 40.00           C  
+ATOM   4908  NE  ARG C 250     -68.078 -12.570  58.647  1.00 40.00           N  
+ATOM   4909  CZ  ARG C 250     -68.486 -13.746  58.175  1.00 40.00           C  
+ATOM   4910  NH1 ARG C 250     -68.535 -14.819  58.969  1.00 40.00           N  
+ATOM   4911  NH2 ARG C 250     -68.853 -13.847  56.900  1.00 40.00           N  
+ATOM   4912  N   MET C 251     -70.055  -9.574  63.119  1.00 40.00           N  
+ATOM   4913  CA  MET C 251     -69.680  -9.200  64.469  1.00 40.00           C  
+ATOM   4914  C   MET C 251     -70.420 -10.084  65.440  1.00 40.00           C  
+ATOM   4915  O   MET C 251     -69.808 -10.665  66.335  1.00 40.00           O  
+ATOM   4916  CB  MET C 251     -70.052  -7.749  64.744  1.00 40.00           C  
+ATOM   4917  CG  MET C 251     -69.102  -6.714  64.165  1.00 40.00           C  
+ATOM   4918  SD  MET C 251     -69.870  -5.081  64.056  1.00 40.00           S  
+ATOM   4919  CE  MET C 251     -70.085  -4.652  65.778  1.00 40.00           C  
+ATOM   4920  N   ALA C 252     -71.736 -10.183  65.245  1.00 40.00           N  
+ATOM   4921  CA  ALA C 252     -72.607 -10.985  66.101  1.00 40.00           C  
+ATOM   4922  C   ALA C 252     -72.040 -12.390  66.336  1.00 40.00           C  
+ATOM   4923  O   ALA C 252     -72.352 -13.036  67.343  1.00 40.00           O  
+ATOM   4924  CB  ALA C 252     -74.008 -11.060  65.515  1.00 40.00           C  
+ATOM   4925  N   GLU C 253     -71.191 -12.843  65.411  1.00 40.00           N  
+ATOM   4926  CA  GLU C 253     -70.503 -14.130  65.534  1.00 40.00           C  
+ATOM   4927  C   GLU C 253     -69.422 -14.153  66.620  1.00 40.00           C  
+ATOM   4928  O   GLU C 253     -68.841 -15.204  66.905  1.00 40.00           O  
+ATOM   4929  CB  GLU C 253     -69.887 -14.532  64.201  1.00 40.00           C  
+ATOM   4930  CG  GLU C 253     -70.899 -14.829  63.112  1.00 40.00           C  
+ATOM   4931  CD  GLU C 253     -70.248 -15.405  61.869  1.00 40.00           C  
+ATOM   4932  OE1 GLU C 253     -70.990 -15.925  61.005  1.00 40.00           O  
+ATOM   4933  OE2 GLU C 253     -68.998 -15.340  61.757  1.00 40.00           O  
+ATOM   4934  N   TYR C 254     -69.142 -13.000  67.217  1.00 40.00           N  
+ATOM   4935  CA  TYR C 254     -68.202 -12.938  68.311  1.00 40.00           C  
+ATOM   4936  C   TYR C 254     -68.798 -12.153  69.444  1.00 40.00           C  
+ATOM   4937  O   TYR C 254     -68.072 -11.712  70.320  1.00 40.00           O  
+ATOM   4938  CB  TYR C 254     -66.930 -12.235  67.879  1.00 40.00           C  
+ATOM   4939  CG  TYR C 254     -66.204 -12.838  66.712  1.00 40.00           C  
+ATOM   4940  CD1 TYR C 254     -65.220 -13.798  66.914  1.00 40.00           C  
+ATOM   4941  CD2 TYR C 254     -66.466 -12.415  65.407  1.00 40.00           C  
+ATOM   4942  CE1 TYR C 254     -64.524 -14.337  65.854  1.00 40.00           C  
+ATOM   4943  CE2 TYR C 254     -65.779 -12.952  64.336  1.00 40.00           C  
+ATOM   4944  CZ  TYR C 254     -64.807 -13.910  64.571  1.00 40.00           C  
+ATOM   4945  OH  TYR C 254     -64.106 -14.455  63.529  1.00 40.00           O  
+ATOM   4946  N   LYS C 255     -70.115 -11.972  69.430  1.00 40.00           N  
+ATOM   4947  CA  LYS C 255     -70.788 -11.115  70.409  1.00 40.00           C  
+ATOM   4948  C   LYS C 255     -70.300 -11.356  71.831  1.00 40.00           C  
+ATOM   4949  O   LYS C 255     -70.573 -10.577  72.735  1.00 40.00           O  
+ATOM   4950  CB  LYS C 255     -72.310 -11.256  70.314  1.00 40.00           C  
+ATOM   4951  CG  LYS C 255     -72.856 -12.648  70.563  1.00 40.00           C  
+ATOM   4952  CD  LYS C 255     -74.246 -12.784  69.964  1.00 40.00           C  
+ATOM   4953  CE  LYS C 255     -74.884 -14.108  70.343  1.00 40.00           C  
+ATOM   4954  NZ  LYS C 255     -75.336 -14.081  71.759  1.00 40.00           N  
+ATOM   4955  N   GLU C 256     -69.553 -12.441  71.994  1.00 40.00           N  
+ATOM   4956  CA  GLU C 256     -68.949 -12.833  73.264  1.00 40.00           C  
+ATOM   4957  C   GLU C 256     -67.706 -12.000  73.590  1.00 40.00           C  
+ATOM   4958  O   GLU C 256     -67.784 -11.085  74.410  1.00 40.00           O  
+ATOM   4959  CB  GLU C 256     -68.578 -14.330  73.248  1.00 40.00           C  
+ATOM   4960  CG  GLU C 256     -69.500 -15.242  72.439  1.00 40.00           C  
+ATOM   4961  CD  GLU C 256     -70.910 -15.357  73.007  1.00 40.00           C  
+ATOM   4962  OE1 GLU C 256     -71.097 -15.145  74.230  1.00 40.00           O  
+ATOM   4963  OE2 GLU C 256     -71.839 -15.668  72.221  1.00 40.00           O  
+ATOM   4964  N   GLU C 257     -66.570 -12.320  72.954  1.00 40.00           N  
+ATOM   4965  CA  GLU C 257     -65.281 -11.644  73.230  1.00 40.00           C  
+ATOM   4966  C   GLU C 257     -65.433 -10.138  73.151  1.00 40.00           C  
+ATOM   4967  O   GLU C 257     -64.926  -9.407  73.998  1.00 40.00           O  
+ATOM   4968  CB  GLU C 257     -64.157 -12.042  72.250  1.00 40.00           C  
+ATOM   4969  CG  GLU C 257     -63.930 -13.521  72.006  1.00 40.00           C  
+ATOM   4970  CD  GLU C 257     -64.649 -13.986  70.763  1.00 40.00           C  
+ATOM   4971  OE1 GLU C 257     -65.892 -14.168  70.834  1.00 40.00           O  
+ATOM   4972  OE2 GLU C 257     -63.967 -14.149  69.724  1.00 40.00           O  
+ATOM   4973  N   LEU C 258     -66.123  -9.689  72.109  1.00 40.00           N  
+ATOM   4974  CA  LEU C 258     -66.345  -8.280  71.891  1.00 40.00           C  
+ATOM   4975  C   LEU C 258     -66.957  -7.670  73.137  1.00 40.00           C  
+ATOM   4976  O   LEU C 258     -66.327  -6.826  73.771  1.00 40.00           O  
+ATOM   4977  CB  LEU C 258     -67.211  -8.056  70.655  1.00 40.00           C  
+ATOM   4978  CG  LEU C 258     -66.662  -8.675  69.358  1.00 40.00           C  
+ATOM   4979  CD1 LEU C 258     -67.614  -8.424  68.195  1.00 40.00           C  
+ATOM   4980  CD2 LEU C 258     -65.256  -8.191  69.013  1.00 40.00           C  
+ATOM   4981  N   TRP C 259     -68.144  -8.131  73.527  1.00 40.00           N  
+ATOM   4982  CA  TRP C 259     -68.791  -7.617  74.740  1.00 40.00           C  
+ATOM   4983  C   TRP C 259     -67.885  -7.646  75.946  1.00 40.00           C  
+ATOM   4984  O   TRP C 259     -67.882  -6.728  76.768  1.00 40.00           O  
+ATOM   4985  CB  TRP C 259     -70.092  -8.354  75.033  1.00 40.00           C  
+ATOM   4986  CG  TRP C 259     -70.756  -7.831  76.282  1.00 40.00           C  
+ATOM   4987  CD1 TRP C 259     -71.069  -8.540  77.442  1.00 40.00           C  
+ATOM   4988  CD2 TRP C 259     -71.168  -6.437  76.563  1.00 40.00           C  
+ATOM   4989  NE1 TRP C 259     -71.650  -7.715  78.381  1.00 40.00           N  
+ATOM   4990  CE2 TRP C 259     -71.737  -6.440  77.918  1.00 40.00           C  
+ATOM   4991  CE3 TRP C 259     -71.144  -5.245  75.848  1.00 40.00           C  
+ATOM   4992  CZ2 TRP C 259     -72.245  -5.282  78.507  1.00 40.00           C  
+ATOM   4993  CZ3 TRP C 259     -71.660  -4.090  76.452  1.00 40.00           C  
+ATOM   4994  CH2 TRP C 259     -72.196  -4.110  77.748  1.00 40.00           C  
+ATOM   4995  N   GLU C 260     -67.108  -8.719  76.048  1.00 40.00           N  
+ATOM   4996  CA  GLU C 260     -66.101  -8.868  77.082  1.00 40.00           C  
+ATOM   4997  C   GLU C 260     -65.066  -7.762  76.954  1.00 40.00           C  
+ATOM   4998  O   GLU C 260     -64.902  -6.958  77.868  1.00 40.00           O  
+ATOM   4999  CB  GLU C 260     -65.425 -10.247  76.972  1.00 40.00           C  
+ATOM   5000  CG  GLU C 260     -66.263 -11.421  77.469  1.00 40.00           C  
+ATOM   5001  CD  GLU C 260     -66.689 -11.263  78.921  1.00 40.00           C  
+ATOM   5002  OE1 GLU C 260     -67.908 -11.300  79.186  1.00 40.00           O  
+ATOM   5003  OE2 GLU C 260     -65.813 -11.084  79.798  1.00 40.00           O  
+ATOM   5004  N   LEU C 261     -64.396  -7.725  75.803  1.00 40.00           N  
+ATOM   5005  CA  LEU C 261     -63.350  -6.743  75.500  1.00 40.00           C  
+ATOM   5006  C   LEU C 261     -63.837  -5.310  75.662  1.00 40.00           C  
+ATOM   5007  O   LEU C 261     -63.047  -4.383  75.793  1.00 40.00           O  
+ATOM   5008  CB  LEU C 261     -62.815  -6.960  74.077  1.00 40.00           C  
+ATOM   5009  CG  LEU C 261     -61.874  -8.157  73.840  1.00 40.00           C  
+ATOM   5010  CD1 LEU C 261     -62.098  -8.829  72.494  1.00 40.00           C  
+ATOM   5011  CD2 LEU C 261     -60.417  -7.747  73.975  1.00 40.00           C  
+ATOM   5012  N   LEU C 262     -65.152  -5.149  75.668  1.00 40.00           N  
+ATOM   5013  CA  LEU C 262     -65.777  -3.847  75.823  1.00 40.00           C  
+ATOM   5014  C   LEU C 262     -65.723  -3.293  77.235  1.00 40.00           C  
+ATOM   5015  O   LEU C 262     -66.098  -2.142  77.486  1.00 40.00           O  
+ATOM   5016  CB  LEU C 262     -67.232  -3.923  75.389  1.00 40.00           C  
+ATOM   5017  CG  LEU C 262     -67.471  -3.515  73.940  1.00 40.00           C  
+ATOM   5018  CD1 LEU C 262     -68.959  -3.316  73.688  1.00 40.00           C  
+ATOM   5019  CD2 LEU C 262     -66.724  -2.227  73.634  1.00 40.00           C  
+ATOM   5020  N   LYS C 263     -65.277  -4.119  78.166  1.00 40.00           N  
+ATOM   5021  CA  LYS C 263     -65.229  -3.696  79.548  1.00 40.00           C  
+ATOM   5022  C   LYS C 263     -63.778  -3.426  79.960  1.00 40.00           C  
+ATOM   5023  O   LYS C 263     -63.521  -2.919  81.046  1.00 40.00           O  
+ATOM   5024  CB  LYS C 263     -65.961  -4.715  80.440  1.00 40.00           C  
+ATOM   5025  CG  LYS C 263     -67.431  -4.911  80.044  1.00 40.00           C  
+ATOM   5026  CD  LYS C 263     -68.199  -5.887  80.929  1.00 40.00           C  
+ATOM   5027  CE  LYS C 263     -67.948  -7.340  80.548  1.00 40.00           C  
+ATOM   5028  NZ  LYS C 263     -68.742  -8.257  81.414  1.00 40.00           N  
+ATOM   5029  N   LYS C 264     -62.841  -3.735  79.065  1.00 40.00           N  
+ATOM   5030  CA  LYS C 264     -61.432  -3.430  79.278  1.00 40.00           C  
+ATOM   5031  C   LYS C 264     -61.139  -1.944  79.082  1.00 40.00           C  
+ATOM   5032  O   LYS C 264     -61.908  -1.229  78.457  1.00 40.00           O  
+ATOM   5033  CB  LYS C 264     -60.556  -4.269  78.353  1.00 40.00           C  
+ATOM   5034  CG  LYS C 264     -60.323  -5.693  78.837  1.00 40.00           C  
+ATOM   5035  CD  LYS C 264     -59.338  -6.437  77.938  1.00 40.00           C  
+ATOM   5036  CE  LYS C 264     -58.817  -7.711  78.587  1.00 40.00           C  
+ATOM   5037  NZ  LYS C 264     -59.893  -8.704  78.862  1.00 40.00           N  
+ATOM   5038  N   ASP C 265     -60.012  -1.495  79.627  1.00 40.00           N  
+ATOM   5039  CA  ASP C 265     -59.617  -0.071  79.660  1.00 40.00           C  
+ATOM   5040  C   ASP C 265     -58.748   0.315  78.484  1.00 40.00           C  
+ATOM   5041  O   ASP C 265     -58.461   1.488  78.261  1.00 40.00           O  
+ATOM   5042  CB  ASP C 265     -58.804   0.230  80.937  1.00 40.00           C  
+ATOM   5043  CG  ASP C 265     -59.675   0.548  82.149  1.00 40.00           C  
+ATOM   5044  OD1 ASP C 265     -59.187   0.363  83.297  1.00 40.00           O  
+ATOM   5045  OD2 ASP C 265     -60.833   0.992  81.955  1.00 40.00           O  
+ATOM   5046  N   ASN C 266     -58.288  -0.687  77.763  1.00 40.00           N  
+ATOM   5047  CA  ASN C 266     -57.352  -0.463  76.701  1.00 40.00           C  
+ATOM   5048  C   ASN C 266     -57.930  -1.027  75.410  1.00 40.00           C  
+ATOM   5049  O   ASN C 266     -57.208  -1.374  74.474  1.00 40.00           O  
+ATOM   5050  CB  ASN C 266     -56.019  -1.109  77.053  1.00 40.00           C  
+ATOM   5051  CG  ASN C 266     -56.129  -2.615  77.214  1.00 40.00           C  
+ATOM   5052  OD1 ASN C 266     -57.210  -3.149  77.510  1.00 40.00           O  
+ATOM   5053  ND2 ASN C 266     -55.009  -3.314  77.010  1.00 40.00           N  
+ATOM   5054  N   THR C 267     -59.252  -1.126  75.376  1.00 40.00           N  
+ATOM   5055  CA  THR C 267     -59.960  -1.496  74.164  1.00 40.00           C  
+ATOM   5056  C   THR C 267     -60.576  -0.225  73.574  1.00 40.00           C  
+ATOM   5057  O   THR C 267     -61.405   0.407  74.204  1.00 40.00           O  
+ATOM   5058  CB  THR C 267     -61.032  -2.566  74.465  1.00 40.00           C  
+ATOM   5059  OG1 THR C 267     -60.407  -3.733  75.007  1.00 40.00           O  
+ATOM   5060  CG2 THR C 267     -61.753  -2.971  73.223  1.00 40.00           C  
+ATOM   5061  N   TYR C 268     -60.151   0.169  72.380  1.00 40.00           N  
+ATOM   5062  CA  TYR C 268     -60.680   1.383  71.758  1.00 40.00           C  
+ATOM   5063  C   TYR C 268     -61.353   1.068  70.421  1.00 40.00           C  
+ATOM   5064  O   TYR C 268     -60.772   0.382  69.568  1.00 40.00           O  
+ATOM   5065  CB  TYR C 268     -59.577   2.413  71.553  1.00 40.00           C  
+ATOM   5066  CG  TYR C 268     -58.700   2.617  72.752  1.00 40.00           C  
+ATOM   5067  CD1 TYR C 268     -57.652   1.750  73.016  1.00 40.00           C  
+ATOM   5068  CD2 TYR C 268     -58.907   3.681  73.624  1.00 40.00           C  
+ATOM   5069  CE1 TYR C 268     -56.830   1.927  74.118  1.00 40.00           C  
+ATOM   5070  CE2 TYR C 268     -58.086   3.870  74.734  1.00 40.00           C  
+ATOM   5071  CZ  TYR C 268     -57.043   2.983  74.974  1.00 40.00           C  
+ATOM   5072  OH  TYR C 268     -56.202   3.119  76.059  1.00 40.00           O  
+ATOM   5073  N   VAL C 269     -62.575   1.575  70.241  1.00 40.00           N  
+ATOM   5074  CA  VAL C 269     -63.386   1.268  69.058  1.00 40.00           C  
+ATOM   5075  C   VAL C 269     -63.399   2.422  68.089  1.00 40.00           C  
+ATOM   5076  O   VAL C 269     -63.566   3.575  68.468  1.00 40.00           O  
+ATOM   5077  CB  VAL C 269     -64.839   0.919  69.425  1.00 40.00           C  
+ATOM   5078  CG1 VAL C 269     -65.718   0.899  68.197  1.00 40.00           C  
+ATOM   5079  CG2 VAL C 269     -64.888  -0.439  70.078  1.00 40.00           C  
+ATOM   5080  N   TYR C 270     -63.226   2.094  66.824  1.00 40.00           N  
+ATOM   5081  CA  TYR C 270     -63.311   3.089  65.794  1.00 40.00           C  
+ATOM   5082  C   TYR C 270     -64.279   2.611  64.720  1.00 40.00           C  
+ATOM   5083  O   TYR C 270     -64.194   1.459  64.260  1.00 40.00           O  
+ATOM   5084  CB  TYR C 270     -61.941   3.313  65.190  1.00 40.00           C  
+ATOM   5085  CG  TYR C 270     -60.904   3.965  66.086  1.00 40.00           C  
+ATOM   5086  CD1 TYR C 270     -60.209   3.231  67.038  1.00 40.00           C  
+ATOM   5087  CD2 TYR C 270     -60.569   5.312  65.925  1.00 40.00           C  
+ATOM   5088  CE1 TYR C 270     -59.238   3.829  67.826  1.00 40.00           C  
+ATOM   5089  CE2 TYR C 270     -59.597   5.915  66.705  1.00 40.00           C  
+ATOM   5090  CZ  TYR C 270     -58.935   5.169  67.651  1.00 40.00           C  
+ATOM   5091  OH  TYR C 270     -57.970   5.761  68.425  1.00 40.00           O  
+ATOM   5092  N   MET C 271     -65.200   3.496  64.333  1.00 40.00           N  
+ATOM   5093  CA  MET C 271     -66.225   3.183  63.337  1.00 40.00           C  
+ATOM   5094  C   MET C 271     -66.148   4.179  62.206  1.00 40.00           C  
+ATOM   5095  O   MET C 271     -66.098   5.380  62.452  1.00 40.00           O  
+ATOM   5096  CB  MET C 271     -67.621   3.254  63.954  1.00 40.00           C  
+ATOM   5097  CG  MET C 271     -68.709   2.570  63.131  1.00 40.00           C  
+ATOM   5098  SD  MET C 271     -70.407   2.855  63.711  1.00 40.00           S  
+ATOM   5099  CE  MET C 271     -70.577   1.683  65.062  1.00 40.00           C  
+ATOM   5100  N   CYS C 272     -66.150   3.681  60.972  1.00 40.00           N  
+ATOM   5101  CA  CYS C 272     -66.031   4.546  59.805  1.00 40.00           C  
+ATOM   5102  C   CYS C 272     -66.695   3.956  58.577  1.00 40.00           C  
+ATOM   5103  O   CYS C 272     -66.631   2.753  58.341  1.00 40.00           O  
+ATOM   5104  CB  CYS C 272     -64.557   4.842  59.502  1.00 40.00           C  
+ATOM   5105  SG  CYS C 272     -64.262   6.245  58.397  1.00 40.00           S  
+ATOM   5106  N   GLY C 273     -67.335   4.820  57.799  1.00 40.00           N  
+ATOM   5107  CA  GLY C 273     -67.863   4.432  56.504  1.00 40.00           C  
+ATOM   5108  C   GLY C 273     -69.174   5.084  56.140  1.00 40.00           C  
+ATOM   5109  O   GLY C 273     -69.292   6.313  56.082  1.00 40.00           O  
+ATOM   5110  N   LEU C 274     -70.166   4.234  55.904  1.00 40.00           N  
+ATOM   5111  CA  LEU C 274     -71.442   4.646  55.327  1.00 40.00           C  
+ATOM   5112  C   LEU C 274     -72.503   4.885  56.383  1.00 40.00           C  
+ATOM   5113  O   LEU C 274     -72.908   3.951  57.091  1.00 40.00           O  
+ATOM   5114  CB  LEU C 274     -71.938   3.572  54.357  1.00 40.00           C  
+ATOM   5115  CG  LEU C 274     -71.016   3.238  53.181  1.00 40.00           C  
+ATOM   5116  CD1 LEU C 274     -71.247   1.810  52.683  1.00 40.00           C  
+ATOM   5117  CD2 LEU C 274     -71.184   4.287  52.076  1.00 40.00           C  
+ATOM   5118  N   LYS C 275     -72.959   6.130  56.480  1.00 40.00           N  
+ATOM   5119  CA  LYS C 275     -74.051   6.452  57.379  1.00 40.00           C  
+ATOM   5120  C   LYS C 275     -75.092   5.330  57.302  1.00 40.00           C  
+ATOM   5121  O   LYS C 275     -75.577   5.003  56.220  1.00 40.00           O  
+ATOM   5122  CB  LYS C 275     -74.665   7.797  56.997  1.00 40.00           C  
+ATOM   5123  CG  LYS C 275     -75.699   8.305  57.986  1.00 40.00           C  
+ATOM   5124  CD  LYS C 275     -76.164   9.710  57.637  1.00 40.00           C  
+ATOM   5125  CE  LYS C 275     -76.995  10.311  58.767  1.00 40.00           C  
+ATOM   5126  NZ  LYS C 275     -77.027  11.808  58.755  1.00 40.00           N  
+ATOM   5127  N   GLY C 276     -75.395   4.710  58.437  1.00 40.00           N  
+ATOM   5128  CA  GLY C 276     -76.421   3.678  58.470  1.00 40.00           C  
+ATOM   5129  C   GLY C 276     -75.954   2.367  59.049  1.00 40.00           C  
+ATOM   5130  O   GLY C 276     -76.736   1.635  59.659  1.00 40.00           O  
+ATOM   5131  N   MET C 277     -74.677   2.064  58.858  1.00 40.00           N  
+ATOM   5132  CA  MET C 277     -74.087   0.872  59.453  1.00 40.00           C  
+ATOM   5133  C   MET C 277     -74.378   0.757  60.964  1.00 40.00           C  
+ATOM   5134  O   MET C 277     -74.733  -0.332  61.434  1.00 40.00           O  
+ATOM   5135  CB  MET C 277     -72.578   0.793  59.149  1.00 40.00           C  
+ATOM   5136  CG  MET C 277     -71.732   1.975  59.628  1.00 40.00           C  
+ATOM   5137  SD  MET C 277     -70.032   2.043  58.995  1.00 40.00           S  
+ATOM   5138  CE  MET C 277     -69.241   0.709  59.891  1.00 40.00           C  
+ATOM   5139  N   GLU C 278     -74.277   1.881  61.696  1.00 40.00           N  
+ATOM   5140  CA  GLU C 278     -74.348   1.895  63.182  1.00 40.00           C  
+ATOM   5141  C   GLU C 278     -75.716   1.588  63.795  1.00 40.00           C  
+ATOM   5142  O   GLU C 278     -75.778   1.136  64.942  1.00 40.00           O  
+ATOM   5143  CB  GLU C 278     -73.757   3.181  63.809  1.00 40.00           C  
+ATOM   5144  CG  GLU C 278     -74.690   4.377  63.889  1.00 40.00           C  
+ATOM   5145  CD  GLU C 278     -74.710   5.158  62.599  1.00 40.00           C  
+ATOM   5146  OE1 GLU C 278     -75.211   4.634  61.571  1.00 40.00           O  
+ATOM   5147  OE2 GLU C 278     -74.207   6.301  62.621  1.00 40.00           O  
+ATOM   5148  N   LYS C 279     -76.803   1.827  63.061  1.00 40.00           N  
+ATOM   5149  CA  LYS C 279     -78.079   1.304  63.519  1.00 40.00           C  
+ATOM   5150  C   LYS C 279     -77.883  -0.192  63.633  1.00 40.00           C  
+ATOM   5151  O   LYS C 279     -78.078  -0.752  64.706  1.00 40.00           O  
+ATOM   5152  CB  LYS C 279     -79.242   1.611  62.580  1.00 40.00           C  
+ATOM   5153  CG  LYS C 279     -80.577   1.245  63.219  1.00 40.00           C  
+ATOM   5154  CD  LYS C 279     -81.681   0.972  62.205  1.00 40.00           C  
+ATOM   5155  CE  LYS C 279     -82.875   0.318  62.892  1.00 40.00           C  
+ATOM   5156  NZ  LYS C 279     -84.124   0.391  62.089  1.00 40.00           N  
+ATOM   5157  N   GLY C 280     -77.449  -0.814  62.535  1.00 40.00           N  
+ATOM   5158  CA  GLY C 280     -77.128  -2.238  62.504  1.00 40.00           C  
+ATOM   5159  C   GLY C 280     -76.375  -2.681  63.740  1.00 40.00           C  
+ATOM   5160  O   GLY C 280     -76.785  -3.629  64.408  1.00 40.00           O  
+ATOM   5161  N   ILE C 281     -75.295  -1.965  64.053  1.00 40.00           N  
+ATOM   5162  CA  ILE C 281     -74.420  -2.273  65.185  1.00 40.00           C  
+ATOM   5163  C   ILE C 281     -75.094  -2.034  66.531  1.00 40.00           C  
+ATOM   5164  O   ILE C 281     -75.137  -2.926  67.381  1.00 40.00           O  
+ATOM   5165  CB  ILE C 281     -73.087  -1.500  65.080  1.00 40.00           C  
+ATOM   5166  CG1 ILE C 281     -72.192  -2.178  64.041  1.00 40.00           C  
+ATOM   5167  CG2 ILE C 281     -72.371  -1.439  66.417  1.00 40.00           C  
+ATOM   5168  CD1 ILE C 281     -70.836  -1.532  63.840  1.00 40.00           C  
+ATOM   5169  N   ASP C 282     -75.629  -0.836  66.718  1.00 40.00           N  
+ATOM   5170  CA  ASP C 282     -76.312  -0.510  67.953  1.00 40.00           C  
+ATOM   5171  C   ASP C 282     -77.331  -1.581  68.305  1.00 40.00           C  
+ATOM   5172  O   ASP C 282     -77.402  -2.005  69.453  1.00 40.00           O  
+ATOM   5173  CB  ASP C 282     -76.964   0.869  67.862  1.00 40.00           C  
+ATOM   5174  CG  ASP C 282     -75.938   2.005  67.871  1.00 40.00           C  
+ATOM   5175  OD1 ASP C 282     -74.758   1.763  68.210  1.00 40.00           O  
+ATOM   5176  OD2 ASP C 282     -76.305   3.150  67.537  1.00 40.00           O  
+ATOM   5177  N   ASP C 283     -78.078  -2.041  67.298  1.00 40.00           N  
+ATOM   5178  CA  ASP C 283     -79.117  -3.084  67.451  1.00 40.00           C  
+ATOM   5179  C   ASP C 283     -78.584  -4.368  68.073  1.00 40.00           C  
+ATOM   5180  O   ASP C 283     -79.273  -5.014  68.875  1.00 40.00           O  
+ATOM   5181  CB  ASP C 283     -79.784  -3.413  66.100  1.00 40.00           C  
+ATOM   5182  CG  ASP C 283     -80.613  -2.247  65.544  1.00 40.00           C  
+ATOM   5183  OD1 ASP C 283     -81.178  -1.462  66.342  1.00 40.00           O  
+ATOM   5184  OD2 ASP C 283     -80.704  -2.116  64.300  1.00 40.00           O  
+ATOM   5185  N   ILE C 284     -77.355  -4.718  67.692  1.00 40.00           N  
+ATOM   5186  CA  ILE C 284     -76.654  -5.892  68.212  1.00 40.00           C  
+ATOM   5187  C   ILE C 284     -76.160  -5.655  69.640  1.00 40.00           C  
+ATOM   5188  O   ILE C 284     -76.125  -6.581  70.462  1.00 40.00           O  
+ATOM   5189  CB  ILE C 284     -75.477  -6.289  67.287  1.00 40.00           C  
+ATOM   5190  CG1 ILE C 284     -75.974  -6.535  65.854  1.00 40.00           C  
+ATOM   5191  CG2 ILE C 284     -74.717  -7.501  67.818  1.00 40.00           C  
+ATOM   5192  CD1 ILE C 284     -77.242  -7.360  65.741  1.00 40.00           C  
+ATOM   5193  N   MET C 285     -75.802  -4.406  69.932  1.00 40.00           N  
+ATOM   5194  CA  MET C 285     -75.251  -4.036  71.237  1.00 40.00           C  
+ATOM   5195  C   MET C 285     -76.310  -3.925  72.311  1.00 40.00           C  
+ATOM   5196  O   MET C 285     -76.042  -4.148  73.489  1.00 40.00           O  
+ATOM   5197  CB  MET C 285     -74.489  -2.722  71.129  1.00 40.00           C  
+ATOM   5198  CG  MET C 285     -73.222  -2.842  70.296  1.00 40.00           C  
+ATOM   5199  SD  MET C 285     -71.950  -3.864  71.075  1.00 40.00           S  
+ATOM   5200  CE  MET C 285     -71.399  -4.868  69.698  1.00 40.00           C  
+ATOM   5201  N   VAL C 286     -77.511  -3.570  71.879  1.00 40.00           N  
+ATOM   5202  CA  VAL C 286     -78.649  -3.421  72.761  1.00 40.00           C  
+ATOM   5203  C   VAL C 286     -78.923  -4.727  73.499  1.00 40.00           C  
+ATOM   5204  O   VAL C 286     -78.986  -4.734  74.735  1.00 40.00           O  
+ATOM   5205  CB  VAL C 286     -79.885  -2.929  71.973  1.00 40.00           C  
+ATOM   5206  CG1 VAL C 286     -81.182  -3.218  72.721  1.00 40.00           C  
+ATOM   5207  CG2 VAL C 286     -79.749  -1.438  71.674  1.00 40.00           C  
+ATOM   5208  N   SER C 287     -79.045  -5.823  72.744  1.00 40.00           N  
+ATOM   5209  CA  SER C 287     -79.365  -7.132  73.330  1.00 40.00           C  
+ATOM   5210  C   SER C 287     -78.245  -7.659  74.229  1.00 40.00           C  
+ATOM   5211  O   SER C 287     -78.520  -8.373  75.197  1.00 40.00           O  
+ATOM   5212  CB  SER C 287     -79.798  -8.173  72.271  1.00 40.00           C  
+ATOM   5213  OG  SER C 287     -78.784  -8.436  71.319  1.00 40.00           O  
+ATOM   5214  N   LEU C 288     -77.002  -7.281  73.918  1.00 40.00           N  
+ATOM   5215  CA  LEU C 288     -75.836  -7.654  74.729  1.00 40.00           C  
+ATOM   5216  C   LEU C 288     -75.752  -6.872  76.035  1.00 40.00           C  
+ATOM   5217  O   LEU C 288     -75.257  -7.395  77.041  1.00 40.00           O  
+ATOM   5218  CB  LEU C 288     -74.532  -7.464  73.946  1.00 40.00           C  
+ATOM   5219  CG  LEU C 288     -73.944  -8.643  73.165  1.00 40.00           C  
+ATOM   5220  CD1 LEU C 288     -72.822  -8.153  72.265  1.00 40.00           C  
+ATOM   5221  CD2 LEU C 288     -73.454  -9.764  74.079  1.00 40.00           C  
+ATOM   5222  N   ALA C 289     -76.221  -5.619  75.999  1.00 40.00           N  
+ATOM   5223  CA  ALA C 289     -76.168  -4.707  77.148  1.00 40.00           C  
+ATOM   5224  C   ALA C 289     -77.197  -5.087  78.212  1.00 40.00           C  
+ATOM   5225  O   ALA C 289     -76.830  -5.290  79.368  1.00 40.00           O  
+ATOM   5226  CB  ALA C 289     -76.346  -3.258  76.709  1.00 40.00           C  
+ATOM   5227  N   GLU C 290     -78.470  -5.199  77.819  1.00 40.00           N  
+ATOM   5228  CA  GLU C 290     -79.556  -5.609  78.725  1.00 40.00           C  
+ATOM   5229  C   GLU C 290     -79.351  -7.011  79.316  1.00 40.00           C  
+ATOM   5230  O   GLU C 290     -80.066  -7.389  80.243  1.00 40.00           O  
+ATOM   5231  CB  GLU C 290     -80.901  -5.530  78.002  1.00 40.00           C  
+ATOM   5232  CG  GLU C 290     -80.917  -6.309  76.686  1.00 40.00           C  
+ATOM   5233  CD  GLU C 290     -82.271  -6.330  75.987  1.00 40.00           C  
+ATOM   5234  OE1 GLU C 290     -83.248  -6.824  76.590  1.00 40.00           O  
+ATOM   5235  OE2 GLU C 290     -82.362  -5.880  74.819  1.00 40.00           O  
+ATOM   5236  N   LYS C 291     -78.394  -7.767  78.758  1.00 40.00           N  
+ATOM   5237  CA  LYS C 291     -77.908  -9.033  79.336  1.00 40.00           C  
+ATOM   5238  C   LYS C 291     -77.322  -8.849  80.720  1.00 40.00           C  
+ATOM   5239  O   LYS C 291     -77.598  -9.645  81.616  1.00 40.00           O  
+ATOM   5240  CB  LYS C 291     -76.820  -9.675  78.478  1.00 40.00           C  
+ATOM   5241  CG  LYS C 291     -77.331 -10.428  77.280  1.00 40.00           C  
+ATOM   5242  CD  LYS C 291     -78.345 -11.490  77.665  1.00 40.00           C  
+ATOM   5243  CE  LYS C 291     -78.957 -12.084  76.409  1.00 40.00           C  
+ATOM   5244  NZ  LYS C 291     -77.906 -12.452  75.414  1.00 40.00           N  
+ATOM   5245  N   ASP C 292     -76.482  -7.824  80.874  1.00 40.00           N  
+ATOM   5246  CA  ASP C 292     -75.886  -7.460  82.172  1.00 40.00           C  
+ATOM   5247  C   ASP C 292     -76.790  -6.492  82.982  1.00 40.00           C  
+ATOM   5248  O   ASP C 292     -76.403  -6.014  84.067  1.00 40.00           O  
+ATOM   5249  CB  ASP C 292     -74.483  -6.855  81.971  1.00 40.00           C  
+ATOM   5250  CG  ASP C 292     -73.524  -7.787  81.224  1.00 40.00           C  
+ATOM   5251  OD1 ASP C 292     -73.969  -8.743  80.533  1.00 40.00           O  
+ATOM   5252  OD2 ASP C 292     -72.300  -7.544  81.325  1.00 40.00           O  
+ATOM   5253  N   GLY C 293     -77.993  -6.234  82.448  1.00 40.00           N  
+ATOM   5254  CA  GLY C 293     -78.933  -5.240  82.980  1.00 40.00           C  
+ATOM   5255  C   GLY C 293     -78.596  -3.797  82.611  1.00 40.00           C  
+ATOM   5256  O   GLY C 293     -79.139  -2.867  83.212  1.00 40.00           O  
+ATOM   5257  N   ILE C 294     -77.715  -3.614  81.619  1.00 40.00           N  
+ATOM   5258  CA  ILE C 294     -77.146  -2.300  81.244  1.00 40.00           C  
+ATOM   5259  C   ILE C 294     -77.907  -1.643  80.081  1.00 40.00           C  
+ATOM   5260  O   ILE C 294     -78.306  -2.329  79.118  1.00 40.00           O  
+ATOM   5261  CB  ILE C 294     -75.635  -2.417  80.886  1.00 40.00           C  
+ATOM   5262  CG1 ILE C 294     -74.832  -2.920  82.095  1.00 40.00           C  
+ATOM   5263  CG2 ILE C 294     -75.072  -1.085  80.393  1.00 40.00           C  
+ATOM   5264  CD1 ILE C 294     -73.423  -3.387  81.781  1.00 40.00           C  
+ATOM   5265  N   ASP C 295     -78.125  -0.325  80.184  1.00 40.00           N  
+ATOM   5266  CA  ASP C 295     -78.639   0.445  79.044  1.00 40.00           C  
+ATOM   5267  C   ASP C 295     -77.494   0.912  78.160  1.00 40.00           C  
+ATOM   5268  O   ASP C 295     -76.577   1.613  78.614  1.00 40.00           O  
+ATOM   5269  CB  ASP C 295     -79.511   1.633  79.446  1.00 40.00           C  
+ATOM   5270  CG  ASP C 295     -79.899   2.501  78.244  1.00 40.00           C  
+ATOM   5271  OD1 ASP C 295     -80.288   3.665  78.437  1.00 40.00           O  
+ATOM   5272  OD2 ASP C 295     -79.808   2.034  77.092  1.00 40.00           O  
+ATOM   5273  N   TRP C 296     -77.600   0.534  76.885  1.00 40.00           N  
+ATOM   5274  CA  TRP C 296     -76.529   0.648  75.898  1.00 40.00           C  
+ATOM   5275  C   TRP C 296     -76.038   2.056  75.666  1.00 40.00           C  
+ATOM   5276  O   TRP C 296     -74.839   2.331  75.760  1.00 40.00           O  
+ATOM   5277  CB  TRP C 296     -76.950  -0.047  74.595  1.00 40.00           C  
+ATOM   5278  CG  TRP C 296     -76.084   0.291  73.410  1.00 40.00           C  
+ATOM   5279  CD1 TRP C 296     -76.497   0.815  72.192  1.00 40.00           C  
+ATOM   5280  CD2 TRP C 296     -74.615   0.162  73.290  1.00 40.00           C  
+ATOM   5281  NE1 TRP C 296     -75.424   1.004  71.347  1.00 40.00           N  
+ATOM   5282  CE2 TRP C 296     -74.270   0.640  71.941  1.00 40.00           C  
+ATOM   5283  CE3 TRP C 296     -73.598  -0.285  74.126  1.00 40.00           C  
+ATOM   5284  CZ2 TRP C 296     -72.963   0.660  71.475  1.00 40.00           C  
+ATOM   5285  CZ3 TRP C 296     -72.284  -0.258  73.646  1.00 40.00           C  
+ATOM   5286  CH2 TRP C 296     -71.977   0.204  72.352  1.00 40.00           C  
+ATOM   5287  N   PHE C 297     -76.956   2.968  75.389  1.00 40.00           N  
+ATOM   5288  CA  PHE C 297     -76.564   4.311  74.989  1.00 40.00           C  
+ATOM   5289  C   PHE C 297     -75.797   5.018  76.101  1.00 40.00           C  
+ATOM   5290  O   PHE C 297     -74.883   5.790  75.832  1.00 40.00           O  
+ATOM   5291  CB  PHE C 297     -77.775   5.096  74.459  1.00 40.00           C  
+ATOM   5292  CG  PHE C 297     -78.383   4.482  73.216  1.00 40.00           C  
+ATOM   5293  CD1 PHE C 297     -79.366   3.481  73.317  1.00 40.00           C  
+ATOM   5294  CD2 PHE C 297     -77.945   4.862  71.947  1.00 40.00           C  
+ATOM   5295  CE1 PHE C 297     -79.909   2.892  72.182  1.00 40.00           C  
+ATOM   5296  CE2 PHE C 297     -78.488   4.275  70.812  1.00 40.00           C  
+ATOM   5297  CZ  PHE C 297     -79.470   3.291  70.929  1.00 40.00           C  
+ATOM   5298  N   ASP C 298     -76.121   4.692  77.345  1.00 40.00           N  
+ATOM   5299  CA  ASP C 298     -75.425   5.275  78.487  1.00 40.00           C  
+ATOM   5300  C   ASP C 298     -74.037   4.700  78.667  1.00 40.00           C  
+ATOM   5301  O   ASP C 298     -73.134   5.366  79.176  1.00 40.00           O  
+ATOM   5302  CB  ASP C 298     -76.243   5.069  79.750  1.00 40.00           C  
+ATOM   5303  CG  ASP C 298     -77.633   5.645  79.630  1.00 40.00           C  
+ATOM   5304  OD1 ASP C 298     -78.258   5.871  80.683  1.00 40.00           O  
+ATOM   5305  OD2 ASP C 298     -78.098   5.878  78.487  1.00 40.00           O  
+ATOM   5306  N   TYR C 299     -73.887   3.449  78.252  1.00 40.00           N  
+ATOM   5307  CA  TYR C 299     -72.596   2.796  78.245  1.00 40.00           C  
+ATOM   5308  C   TYR C 299     -71.802   3.322  77.057  1.00 40.00           C  
+ATOM   5309  O   TYR C 299     -70.592   3.506  77.144  1.00 40.00           O  
+ATOM   5310  CB  TYR C 299     -72.767   1.267  78.196  1.00 40.00           C  
+ATOM   5311  CG  TYR C 299     -71.513   0.469  78.519  1.00 40.00           C  
+ATOM   5312  CD1 TYR C 299     -70.975   0.447  79.816  1.00 40.00           C  
+ATOM   5313  CD2 TYR C 299     -70.870  -0.282  77.536  1.00 40.00           C  
+ATOM   5314  CE1 TYR C 299     -69.820  -0.285  80.112  1.00 40.00           C  
+ATOM   5315  CE2 TYR C 299     -69.720  -1.019  77.822  1.00 40.00           C  
+ATOM   5316  CZ  TYR C 299     -69.193  -1.022  79.106  1.00 40.00           C  
+ATOM   5317  OH  TYR C 299     -68.049  -1.754  79.383  1.00 40.00           O  
+ATOM   5318  N   LYS C 300     -72.504   3.588  75.958  1.00 40.00           N  
+ATOM   5319  CA  LYS C 300     -71.893   4.160  74.763  1.00 40.00           C  
+ATOM   5320  C   LYS C 300     -71.293   5.514  75.120  1.00 40.00           C  
+ATOM   5321  O   LYS C 300     -70.075   5.682  75.112  1.00 40.00           O  
+ATOM   5322  CB  LYS C 300     -72.929   4.300  73.638  1.00 40.00           C  
+ATOM   5323  CG  LYS C 300     -72.372   4.849  72.327  1.00 40.00           C  
+ATOM   5324  CD  LYS C 300     -73.469   5.273  71.355  1.00 40.00           C  
+ATOM   5325  CE  LYS C 300     -73.722   4.232  70.277  1.00 40.00           C  
+ATOM   5326  NZ  LYS C 300     -74.698   4.706  69.248  1.00 40.00           N  
+ATOM   5327  N   LYS C 301     -72.162   6.463  75.449  1.00 40.00           N  
+ATOM   5328  CA  LYS C 301     -71.758   7.758  75.951  1.00 40.00           C  
+ATOM   5329  C   LYS C 301     -70.460   7.633  76.698  1.00 40.00           C  
+ATOM   5330  O   LYS C 301     -69.474   8.258  76.345  1.00 40.00           O  
+ATOM   5331  CB  LYS C 301     -72.812   8.268  76.913  1.00 40.00           C  
+ATOM   5332  CG  LYS C 301     -74.047   8.816  76.234  1.00 40.00           C  
+ATOM   5333  CD  LYS C 301     -75.269   8.728  77.144  1.00 40.00           C  
+ATOM   5334  CE  LYS C 301     -76.391   9.685  76.736  1.00 40.00           C  
+ATOM   5335  NZ  LYS C 301     -76.720   9.751  75.272  1.00 40.00           N  
+ATOM   5336  N   GLN C 302     -70.479   6.789  77.723  1.00 40.00           N  
+ATOM   5337  CA  GLN C 302     -69.367   6.618  78.656  1.00 40.00           C  
+ATOM   5338  C   GLN C 302     -68.060   6.243  77.971  1.00 40.00           C  
+ATOM   5339  O   GLN C 302     -67.000   6.800  78.267  1.00 40.00           O  
+ATOM   5340  CB  GLN C 302     -69.739   5.568  79.703  1.00 40.00           C  
+ATOM   5341  CG  GLN C 302     -68.645   5.240  80.708  1.00 40.00           C  
+ATOM   5342  CD  GLN C 302     -68.967   3.996  81.524  1.00 40.00           C  
+ATOM   5343  OE1 GLN C 302     -68.173   3.045  81.582  1.00 40.00           O  
+ATOM   5344  NE2 GLN C 302     -70.143   3.987  82.151  1.00 40.00           N  
+ATOM   5345  N   LEU C 303     -68.138   5.293  77.055  1.00 40.00           N  
+ATOM   5346  CA  LEU C 303     -66.959   4.894  76.319  1.00 40.00           C  
+ATOM   5347  C   LEU C 303     -66.486   6.087  75.538  1.00 40.00           C  
+ATOM   5348  O   LEU C 303     -65.291   6.361  75.485  1.00 40.00           O  
+ATOM   5349  CB  LEU C 303     -67.268   3.735  75.378  1.00 40.00           C  
+ATOM   5350  CG  LEU C 303     -67.821   2.483  76.057  1.00 40.00           C  
+ATOM   5351  CD1 LEU C 303     -68.639   1.688  75.062  1.00 40.00           C  
+ATOM   5352  CD2 LEU C 303     -66.725   1.625  76.675  1.00 40.00           C  
+ATOM   5353  N   LYS C 304     -67.438   6.811  74.952  1.00 40.00           N  
+ATOM   5354  CA  LYS C 304     -67.100   7.991  74.175  1.00 40.00           C  
+ATOM   5355  C   LYS C 304     -66.335   8.961  75.050  1.00 40.00           C  
+ATOM   5356  O   LYS C 304     -65.245   9.385  74.673  1.00 40.00           O  
+ATOM   5357  CB  LYS C 304     -68.334   8.649  73.560  1.00 40.00           C  
+ATOM   5358  CG  LYS C 304     -68.934   7.832  72.431  1.00 40.00           C  
+ATOM   5359  CD  LYS C 304     -70.144   8.504  71.800  1.00 40.00           C  
+ATOM   5360  CE  LYS C 304     -69.834   9.105  70.436  1.00 40.00           C  
+ATOM   5361  NZ  LYS C 304     -71.088   9.574  69.780  1.00 40.00           N  
+ATOM   5362  N   ARG C 305     -66.876   9.281  76.228  1.00 40.00           N  
+ATOM   5363  CA  ARG C 305     -66.153  10.131  77.177  1.00 40.00           C  
+ATOM   5364  C   ARG C 305     -64.757   9.579  77.397  1.00 40.00           C  
+ATOM   5365  O   ARG C 305     -63.800  10.333  77.500  1.00 40.00           O  
+ATOM   5366  CB  ARG C 305     -66.892  10.287  78.508  1.00 40.00           C  
+ATOM   5367  CG  ARG C 305     -67.678  11.593  78.647  1.00 40.00           C  
+ATOM   5368  CD  ARG C 305     -68.207  11.813  80.063  1.00 40.00           C  
+ATOM   5369  NE  ARG C 305     -69.324  10.919  80.409  1.00 40.00           N  
+ATOM   5370  CZ  ARG C 305     -69.232   9.807  81.154  1.00 40.00           C  
+ATOM   5371  NH1 ARG C 305     -68.062   9.412  81.663  1.00 40.00           N  
+ATOM   5372  NH2 ARG C 305     -70.323   9.077  81.394  1.00 40.00           N  
+ATOM   5373  N   GLY C 306     -64.637   8.258  77.425  1.00 40.00           N  
+ATOM   5374  CA  GLY C 306     -63.328   7.640  77.506  1.00 40.00           C  
+ATOM   5375  C   GLY C 306     -62.574   7.621  76.184  1.00 40.00           C  
+ATOM   5376  O   GLY C 306     -61.561   6.929  76.059  1.00 40.00           O  
+ATOM   5377  N   ASP C 307     -63.056   8.372  75.195  1.00 40.00           N  
+ATOM   5378  CA  ASP C 307     -62.476   8.369  73.851  1.00 40.00           C  
+ATOM   5379  C   ASP C 307     -62.372   6.957  73.317  1.00 40.00           C  
+ATOM   5380  O   ASP C 307     -61.621   6.712  72.383  1.00 40.00           O  
+ATOM   5381  CB  ASP C 307     -61.082   9.005  73.845  1.00 40.00           C  
+ATOM   5382  CG  ASP C 307     -61.084  10.448  74.330  1.00 40.00           C  
+ATOM   5383  OD1 ASP C 307     -61.835  11.291  73.785  1.00 40.00           O  
+ATOM   5384  OD2 ASP C 307     -60.306  10.754  75.254  1.00 40.00           O  
+ATOM   5385  N   GLN C 308     -63.114   6.034  73.930  1.00 40.00           N  
+ATOM   5386  CA  GLN C 308     -63.027   4.601  73.617  1.00 40.00           C  
+ATOM   5387  C   GLN C 308     -63.980   4.208  72.484  1.00 40.00           C  
+ATOM   5388  O   GLN C 308     -63.879   3.113  71.940  1.00 40.00           O  
+ATOM   5389  CB  GLN C 308     -63.216   3.734  74.885  1.00 40.00           C  
+ATOM   5390  CG  GLN C 308     -61.956   3.664  75.762  1.00 40.00           C  
+ATOM   5391  CD  GLN C 308     -62.126   2.913  77.081  1.00 40.00           C  
+ATOM   5392  OE1 GLN C 308     -62.191   1.691  77.121  1.00 40.00           O  
+ATOM   5393  NE2 GLN C 308     -62.144   3.652  78.171  1.00 40.00           N  
+ATOM   5394  N   TRP C 309     -64.867   5.132  72.111  1.00 40.00           N  
+ATOM   5395  CA  TRP C 309     -65.828   4.942  71.016  1.00 40.00           C  
+ATOM   5396  C   TRP C 309     -65.759   6.118  70.100  1.00 40.00           C  
+ATOM   5397  O   TRP C 309     -65.982   7.262  70.524  1.00 40.00           O  
+ATOM   5398  CB  TRP C 309     -67.226   4.833  71.584  1.00 40.00           C  
+ATOM   5399  CG  TRP C 309     -68.287   4.382  70.620  1.00 40.00           C  
+ATOM   5400  CD1 TRP C 309     -69.164   5.170  69.891  1.00 40.00           C  
+ATOM   5401  CD2 TRP C 309     -68.651   3.005  70.297  1.00 40.00           C  
+ATOM   5402  NE1 TRP C 309     -70.015   4.396  69.152  1.00 40.00           N  
+ATOM   5403  CE2 TRP C 309     -69.759   3.085  69.350  1.00 40.00           C  
+ATOM   5404  CE3 TRP C 309     -68.179   1.759  70.680  1.00 40.00           C  
+ATOM   5405  CZ2 TRP C 309     -70.355   1.948  68.815  1.00 40.00           C  
+ATOM   5406  CZ3 TRP C 309     -68.785   0.624  70.137  1.00 40.00           C  
+ATOM   5407  CH2 TRP C 309     -69.846   0.716  69.226  1.00 40.00           C  
+ATOM   5408  N   ASN C 310     -65.440   5.846  68.835  1.00 40.00           N  
+ATOM   5409  CA  ASN C 310     -65.100   6.901  67.875  1.00 40.00           C  
+ATOM   5410  C   ASN C 310     -65.665   6.677  66.461  1.00 40.00           C  
+ATOM   5411  O   ASN C 310     -65.361   5.679  65.803  1.00 40.00           O  
+ATOM   5412  CB  ASN C 310     -63.578   7.129  67.843  1.00 40.00           C  
+ATOM   5413  CG  ASN C 310     -62.955   7.228  69.243  1.00 40.00           C  
+ATOM   5414  OD1 ASN C 310     -63.358   8.044  70.084  1.00 40.00           O  
+ATOM   5415  ND2 ASN C 310     -61.954   6.394  69.488  1.00 40.00           N  
+ATOM   5416  N   VAL C 311     -66.472   7.636  66.003  1.00 40.00           N  
+ATOM   5417  CA  VAL C 311     -67.351   7.446  64.851  1.00 40.00           C  
+ATOM   5418  C   VAL C 311     -67.171   8.507  63.762  1.00 40.00           C  
+ATOM   5419  O   VAL C 311     -67.185   9.709  64.034  1.00 40.00           O  
+ATOM   5420  CB  VAL C 311     -68.831   7.421  65.286  1.00 40.00           C  
+ATOM   5421  CG1 VAL C 311     -69.731   7.059  64.118  1.00 40.00           C  
+ATOM   5422  CG2 VAL C 311     -69.048   6.432  66.421  1.00 40.00           C  
+ATOM   5423  N   GLU C 312     -67.039   8.031  62.525  1.00 40.00           N  
+ATOM   5424  CA  GLU C 312     -66.745   8.851  61.356  1.00 40.00           C  
+ATOM   5425  C   GLU C 312     -67.498   8.262  60.178  1.00 40.00           C  
+ATOM   5426  O   GLU C 312     -66.919   7.510  59.399  1.00 40.00           O  
+ATOM   5427  CB  GLU C 312     -65.249   8.760  61.058  1.00 40.00           C  
+ATOM   5428  CG  GLU C 312     -64.717   9.626  59.923  1.00 40.00           C  
+ATOM   5429  CD  GLU C 312     -63.878  10.797  60.420  1.00 40.00           C  
+ATOM   5430  OE1 GLU C 312     -64.374  11.541  61.312  1.00 40.00           O  
+ATOM   5431  OE2 GLU C 312     -62.729  10.975  59.919  1.00 40.00           O  
+ATOM   5432  N   VAL C 313     -68.783   8.591  60.044  1.00 40.00           N  
+ATOM   5433  CA  VAL C 313     -69.602   8.065  58.928  1.00 40.00           C  
+ATOM   5434  C   VAL C 313     -70.199   9.157  58.029  1.00 40.00           C  
+ATOM   5435  O   VAL C 313     -70.390  10.299  58.468  1.00 40.00           O  
+ATOM   5436  CB  VAL C 313     -70.717   7.106  59.401  1.00 40.00           C  
+ATOM   5437  CG1 VAL C 313     -70.114   5.853  60.013  1.00 40.00           C  
+ATOM   5438  CG2 VAL C 313     -71.653   7.795  60.381  1.00 40.00           C  
+ATOM   5439  N   TYR C 314     -70.487   8.803  56.774  1.00 40.00           N  
+ATOM   5440  CA  TYR C 314     -70.949   9.777  55.778  1.00 40.00           C  
+ATOM   5441  C   TYR C 314     -71.875   9.124  54.771  1.00 40.00           C  
+ATOM   5442  O   TYR C 314     -71.981   7.896  54.713  1.00 40.00           O  
+ATOM   5443  CB  TYR C 314     -69.760  10.453  55.053  1.00 40.00           C  
+ATOM   5444  CG  TYR C 314     -68.662   9.485  54.630  1.00 40.00           C  
+ATOM   5445  CD1 TYR C 314     -68.664   8.888  53.360  1.00 40.00           C  
+ATOM   5446  CD2 TYR C 314     -67.617   9.165  55.504  1.00 40.00           C  
+ATOM   5447  CE1 TYR C 314     -67.660   7.993  52.983  1.00 40.00           C  
+ATOM   5448  CE2 TYR C 314     -66.615   8.267  55.141  1.00 40.00           C  
+ATOM   5449  CZ  TYR C 314     -66.630   7.681  53.884  1.00 40.00           C  
+ATOM   5450  OH  TYR C 314     -65.621   6.791  53.546  1.00 40.00           O  
+ATOM   5451  OXT TYR C 314     -72.521   9.829  53.997  1.00 40.00           O  
+TER    5452      TYR C 314                                                      
+ATOM   5453  N   ALA D   1     -35.462 -28.005  -0.988  1.00 40.00           N  
+ATOM   5454  CA  ALA D   1     -33.990 -27.743  -0.945  1.00 40.00           C  
+ATOM   5455  C   ALA D   1     -33.218 -28.950  -0.428  1.00 40.00           C  
+ATOM   5456  O   ALA D   1     -33.724 -29.706   0.392  1.00 40.00           O  
+ATOM   5457  CB  ALA D   1     -33.694 -26.520  -0.090  1.00 40.00           C  
+ATOM   5458  N   THR D   2     -31.994 -29.120  -0.922  1.00 40.00           N  
+ATOM   5459  CA  THR D   2     -31.100 -30.212  -0.507  1.00 40.00           C  
+ATOM   5460  C   THR D   2     -29.765 -29.585  -0.074  1.00 40.00           C  
+ATOM   5461  O   THR D   2     -29.266 -28.676  -0.736  1.00 40.00           O  
+ATOM   5462  CB  THR D   2     -30.903 -31.259  -1.646  1.00 40.00           C  
+ATOM   5463  OG1 THR D   2     -32.164 -31.853  -1.982  1.00 40.00           O  
+ATOM   5464  CG2 THR D   2     -29.919 -32.368  -1.256  1.00 40.00           C  
+ATOM   5465  N   TYR D   3     -29.203 -30.050   1.043  1.00 40.00           N  
+ATOM   5466  CA  TYR D   3     -27.958 -29.483   1.598  1.00 40.00           C  
+ATOM   5467  C   TYR D   3     -26.955 -30.580   1.968  1.00 40.00           C  
+ATOM   5468  O   TYR D   3     -27.344 -31.720   2.244  1.00 40.00           O  
+ATOM   5469  CB  TYR D   3     -28.236 -28.636   2.848  1.00 40.00           C  
+ATOM   5470  CG  TYR D   3     -29.403 -27.660   2.765  1.00 40.00           C  
+ATOM   5471  CD1 TYR D   3     -30.726 -28.102   2.902  1.00 40.00           C  
+ATOM   5472  CD2 TYR D   3     -29.188 -26.294   2.602  1.00 40.00           C  
+ATOM   5473  CE1 TYR D   3     -31.792 -27.219   2.856  1.00 40.00           C  
+ATOM   5474  CE2 TYR D   3     -30.253 -25.404   2.556  1.00 40.00           C  
+ATOM   5475  CZ  TYR D   3     -31.551 -25.875   2.683  1.00 40.00           C  
+ATOM   5476  OH  TYR D   3     -32.616 -25.006   2.639  1.00 40.00           O  
+ATOM   5477  N   ASN D   4     -25.668 -30.227   1.985  1.00 40.00           N  
+ATOM   5478  CA  ASN D   4     -24.608 -31.176   2.363  1.00 40.00           C  
+ATOM   5479  C   ASN D   4     -24.573 -31.469   3.866  1.00 40.00           C  
+ATOM   5480  O   ASN D   4     -24.685 -30.559   4.709  1.00 40.00           O  
+ATOM   5481  CB  ASN D   4     -23.215 -30.727   1.859  1.00 40.00           C  
+ATOM   5482  CG  ASN D   4     -22.081 -31.649   2.329  1.00 40.00           C  
+ATOM   5483  OD1 ASN D   4     -22.086 -32.860   2.063  1.00 40.00           O  
+ATOM   5484  ND2 ASN D   4     -21.100 -31.071   3.031  1.00 40.00           N  
+ATOM   5485  N   VAL D   5     -24.434 -32.758   4.177  1.00 40.00           N  
+ATOM   5486  CA  VAL D   5     -24.203 -33.210   5.547  1.00 40.00           C  
+ATOM   5487  C   VAL D   5     -22.988 -34.128   5.629  1.00 40.00           C  
+ATOM   5488  O   VAL D   5     -22.810 -35.045   4.822  1.00 40.00           O  
+ATOM   5489  CB  VAL D   5     -25.432 -33.895   6.181  1.00 40.00           C  
+ATOM   5490  CG1 VAL D   5     -25.227 -34.060   7.688  1.00 40.00           C  
+ATOM   5491  CG2 VAL D   5     -26.706 -33.103   5.892  1.00 40.00           C  
+ATOM   5492  N   LYS D   6     -22.165 -33.849   6.629  1.00 40.00           N  
+ATOM   5493  CA  LYS D   6     -20.899 -34.513   6.844  1.00 40.00           C  
+ATOM   5494  C   LYS D   6     -21.017 -35.171   8.196  1.00 40.00           C  
+ATOM   5495  O   LYS D   6     -21.233 -34.507   9.212  1.00 40.00           O  
+ATOM   5496  CB  LYS D   6     -19.775 -33.465   6.832  1.00 40.00           C  
+ATOM   5497  CG  LYS D   6     -18.365 -33.958   7.139  1.00 40.00           C  
+ATOM   5498  CD  LYS D   6     -17.336 -32.820   7.112  1.00 40.00           C  
+ATOM   5499  CE  LYS D   6     -17.121 -32.260   5.703  1.00 40.00           C  
+ATOM   5500  NZ  LYS D   6     -15.848 -31.501   5.550  1.00 40.00           N  
+ATOM   5501  N   LEU D   7     -20.901 -36.487   8.205  1.00 40.00           N  
+ATOM   5502  CA  LEU D   7     -21.063 -37.224   9.444  1.00 40.00           C  
+ATOM   5503  C   LEU D   7     -19.755 -37.759   9.957  1.00 40.00           C  
+ATOM   5504  O   LEU D   7     -19.040 -38.472   9.254  1.00 40.00           O  
+ATOM   5505  CB  LEU D   7     -22.052 -38.371   9.280  1.00 40.00           C  
+ATOM   5506  CG  LEU D   7     -23.491 -37.929   9.037  1.00 40.00           C  
+ATOM   5507  CD1 LEU D   7     -24.351 -39.145   8.751  1.00 40.00           C  
+ATOM   5508  CD2 LEU D   7     -24.030 -37.156  10.231  1.00 40.00           C  
+ATOM   5509  N   ILE D   8     -19.455 -37.414  11.199  1.00 40.00           N  
+ATOM   5510  CA  ILE D   8     -18.237 -37.878  11.822  1.00 40.00           C  
+ATOM   5511  C   ILE D   8     -18.625 -39.018  12.753  1.00 40.00           C  
+ATOM   5512  O   ILE D   8     -18.820 -38.842  13.968  1.00 40.00           O  
+ATOM   5513  CB  ILE D   8     -17.461 -36.737  12.528  1.00 40.00           C  
+ATOM   5514  CG1 ILE D   8     -17.575 -35.431  11.720  1.00 40.00           C  
+ATOM   5515  CG2 ILE D   8     -15.993 -37.127  12.709  1.00 40.00           C  
+ATOM   5516  CD1 ILE D   8     -17.774 -34.185  12.566  1.00 40.00           C  
+ATOM   5517  N   THR D   9     -18.764 -40.190  12.141  1.00 40.00           N  
+ATOM   5518  CA  THR D   9     -19.029 -41.428  12.864  1.00 40.00           C  
+ATOM   5519  C   THR D   9     -17.766 -41.815  13.684  1.00 40.00           C  
+ATOM   5520  O   THR D   9     -16.693 -41.221  13.476  1.00 40.00           O  
+ATOM   5521  CB  THR D   9     -19.509 -42.548  11.894  1.00 40.00           C  
+ATOM   5522  OG1 THR D   9     -18.392 -43.275  11.365  1.00 40.00           O  
+ATOM   5523  CG2 THR D   9     -20.334 -41.954  10.733  1.00 40.00           C  
+ATOM   5524  N   PRO D  10     -17.882 -42.780  14.634  1.00 40.00           N  
+ATOM   5525  CA  PRO D  10     -16.682 -43.237  15.361  1.00 40.00           C  
+ATOM   5526  C   PRO D  10     -15.761 -44.047  14.445  1.00 40.00           C  
+ATOM   5527  O   PRO D  10     -14.647 -44.427  14.832  1.00 40.00           O  
+ATOM   5528  CB  PRO D  10     -17.253 -44.146  16.463  1.00 40.00           C  
+ATOM   5529  CG  PRO D  10     -18.717 -43.874  16.494  1.00 40.00           C  
+ATOM   5530  CD  PRO D  10     -19.081 -43.501  15.091  1.00 40.00           C  
+ATOM   5531  N   GLU D  11     -16.250 -44.302  13.233  1.00 40.00           N  
+ATOM   5532  CA  GLU D  11     -15.498 -44.999  12.201  1.00 40.00           C  
+ATOM   5533  C   GLU D  11     -15.266 -44.098  10.987  1.00 40.00           C  
+ATOM   5534  O   GLU D  11     -15.336 -44.546   9.835  1.00 40.00           O  
+ATOM   5535  CB  GLU D  11     -16.239 -46.263  11.803  1.00 40.00           C  
+ATOM   5536  CG  GLU D  11     -16.520 -47.176  12.981  1.00 40.00           C  
+ATOM   5537  CD  GLU D  11     -16.924 -48.562  12.534  1.00 40.00           C  
+ATOM   5538  OE1 GLU D  11     -17.983 -48.686  11.877  1.00 40.00           O  
+ATOM   5539  OE2 GLU D  11     -16.178 -49.523  12.834  1.00 40.00           O  
+ATOM   5540  N   GLY D  12     -14.997 -42.822  11.268  1.00 40.00           N  
+ATOM   5541  CA  GLY D  12     -14.643 -41.853  10.246  1.00 40.00           C  
+ATOM   5542  C   GLY D  12     -15.780 -41.038   9.661  1.00 40.00           C  
+ATOM   5543  O   GLY D  12     -16.967 -41.191  10.004  1.00 40.00           O  
+ATOM   5544  N   GLU D  13     -15.380 -40.174   8.741  1.00 40.00           N  
+ATOM   5545  CA  GLU D  13     -16.259 -39.198   8.137  1.00 40.00           C  
+ATOM   5546  C   GLU D  13     -16.964 -39.785   6.905  1.00 40.00           C  
+ATOM   5547  O   GLU D  13     -16.455 -40.721   6.284  1.00 40.00           O  
+ATOM   5548  CB  GLU D  13     -15.419 -37.966   7.776  1.00 40.00           C  
+ATOM   5549  CG  GLU D  13     -16.187 -36.661   7.613  1.00 40.00           C  
+ATOM   5550  CD  GLU D  13     -15.354 -35.597   6.916  1.00 40.00           C  
+ATOM   5551  OE1 GLU D  13     -15.670 -35.274   5.740  1.00 40.00           O  
+ATOM   5552  OE2 GLU D  13     -14.380 -35.101   7.539  1.00 40.00           O  
+ATOM   5553  N   VAL D  14     -18.144 -39.247   6.584  1.00 40.00           N  
+ATOM   5554  CA  VAL D  14     -18.858 -39.553   5.335  1.00 40.00           C  
+ATOM   5555  C   VAL D  14     -19.938 -38.494   5.058  1.00 40.00           C  
+ATOM   5556  O   VAL D  14     -20.680 -38.083   5.959  1.00 40.00           O  
+ATOM   5557  CB  VAL D  14     -19.414 -41.005   5.304  1.00 40.00           C  
+ATOM   5558  CG1 VAL D  14     -20.356 -41.269   6.477  1.00 40.00           C  
+ATOM   5559  CG2 VAL D  14     -20.061 -41.319   3.958  1.00 40.00           C  
+ATOM   5560  N   GLU D  15     -20.000 -38.040   3.811  1.00 40.00           N  
+ATOM   5561  CA  GLU D  15     -20.914 -36.962   3.443  1.00 40.00           C  
+ATOM   5562  C   GLU D  15     -22.038 -37.474   2.566  1.00 40.00           C  
+ATOM   5563  O   GLU D  15     -21.991 -38.614   2.106  1.00 40.00           O  
+ATOM   5564  CB  GLU D  15     -20.168 -35.817   2.749  1.00 40.00           C  
+ATOM   5565  CG  GLU D  15     -19.062 -35.181   3.588  1.00 40.00           C  
+ATOM   5566  CD  GLU D  15     -18.267 -34.130   2.824  1.00 40.00           C  
+ATOM   5567  OE1 GLU D  15     -17.016 -34.205   2.846  1.00 40.00           O  
+ATOM   5568  OE2 GLU D  15     -18.888 -33.231   2.199  1.00 40.00           O  
+ATOM   5569  N   LEU D  16     -23.041 -36.623   2.347  1.00 40.00           N  
+ATOM   5570  CA  LEU D  16     -24.273 -37.025   1.671  1.00 40.00           C  
+ATOM   5571  C   LEU D  16     -25.290 -35.900   1.540  1.00 40.00           C  
+ATOM   5572  O   LEU D  16     -25.238 -34.910   2.271  1.00 40.00           O  
+ATOM   5573  CB  LEU D  16     -24.935 -38.168   2.431  1.00 40.00           C  
+ATOM   5574  CG  LEU D  16     -25.333 -37.858   3.880  1.00 40.00           C  
+ATOM   5575  CD1 LEU D  16     -26.649 -38.555   4.225  1.00 40.00           C  
+ATOM   5576  CD2 LEU D  16     -24.214 -38.227   4.860  1.00 40.00           C  
+ATOM   5577  N   GLN D  17     -26.244 -36.099   0.636  1.00 40.00           N  
+ATOM   5578  CA  GLN D  17     -27.202 -35.062   0.273  1.00 40.00           C  
+ATOM   5579  C   GLN D  17     -28.566 -35.289   0.897  1.00 40.00           C  
+ATOM   5580  O   GLN D  17     -29.179 -36.339   0.686  1.00 40.00           O  
+ATOM   5581  CB  GLN D  17     -27.326 -34.976  -1.255  1.00 40.00           C  
+ATOM   5582  CG  GLN D  17     -26.062 -34.470  -1.927  1.00 40.00           C  
+ATOM   5583  CD  GLN D  17     -25.494 -33.236  -1.232  1.00 40.00           C  
+ATOM   5584  OE1 GLN D  17     -24.355 -33.250  -0.750  1.00 40.00           O  
+ATOM   5585  NE2 GLN D  17     -26.296 -32.167  -1.158  1.00 40.00           N  
+ATOM   5586  N   VAL D  18     -29.044 -34.304   1.657  1.00 40.00           N  
+ATOM   5587  CA  VAL D  18     -30.330 -34.447   2.344  1.00 40.00           C  
+ATOM   5588  C   VAL D  18     -31.340 -33.338   2.054  1.00 40.00           C  
+ATOM   5589  O   VAL D  18     -31.102 -32.168   2.394  1.00 40.00           O  
+ATOM   5590  CB  VAL D  18     -30.170 -34.558   3.869  1.00 40.00           C  
+ATOM   5591  CG1 VAL D  18     -31.451 -35.132   4.485  1.00 40.00           C  
+ATOM   5592  CG2 VAL D  18     -28.945 -35.400   4.213  1.00 40.00           C  
+ATOM   5593  N   PRO D  19     -32.482 -33.710   1.437  1.00 40.00           N  
+ATOM   5594  CA  PRO D  19     -33.627 -32.795   1.249  1.00 40.00           C  
+ATOM   5595  C   PRO D  19     -34.182 -32.276   2.586  1.00 40.00           C  
+ATOM   5596  O   PRO D  19     -34.333 -33.067   3.528  1.00 40.00           O  
+ATOM   5597  CB  PRO D  19     -34.660 -33.672   0.522  1.00 40.00           C  
+ATOM   5598  CG  PRO D  19     -33.839 -34.715  -0.182  1.00 40.00           C  
+ATOM   5599  CD  PRO D  19     -32.672 -34.994   0.725  1.00 40.00           C  
+ATOM   5600  N   ASP D  20     -34.474 -30.971   2.655  1.00 40.00           N  
+ATOM   5601  CA  ASP D  20     -34.919 -30.295   3.906  1.00 40.00           C  
+ATOM   5602  C   ASP D  20     -36.309 -30.697   4.472  1.00 40.00           C  
+ATOM   5603  O   ASP D  20     -36.773 -30.117   5.478  1.00 40.00           O  
+ATOM   5604  CB  ASP D  20     -34.789 -28.749   3.795  1.00 40.00           C  
+ATOM   5605  CG  ASP D  20     -35.867 -28.085   2.879  1.00 40.00           C  
+ATOM   5606  OD1 ASP D  20     -35.752 -26.857   2.662  1.00 40.00           O  
+ATOM   5607  OD2 ASP D  20     -36.816 -28.743   2.377  1.00 40.00           O  
+ATOM   5608  N   ASP D  21     -36.944 -31.680   3.816  1.00 40.00           N  
+ATOM   5609  CA  ASP D  21     -38.240 -32.261   4.221  1.00 40.00           C  
+ATOM   5610  C   ASP D  21     -38.120 -33.722   4.685  1.00 40.00           C  
+ATOM   5611  O   ASP D  21     -39.118 -34.329   5.081  1.00 40.00           O  
+ATOM   5612  CB  ASP D  21     -39.281 -32.134   3.091  1.00 40.00           C  
+ATOM   5613  CG  ASP D  21     -38.698 -32.407   1.695  1.00 40.00           C  
+ATOM   5614  OD1 ASP D  21     -37.603 -33.002   1.570  1.00 40.00           O  
+ATOM   5615  OD2 ASP D  21     -39.348 -32.021   0.704  1.00 40.00           O  
+ATOM   5616  N   VAL D  22     -36.895 -34.260   4.640  1.00 40.00           N  
+ATOM   5617  CA  VAL D  22     -36.580 -35.625   5.062  1.00 40.00           C  
+ATOM   5618  C   VAL D  22     -35.696 -35.571   6.301  1.00 40.00           C  
+ATOM   5619  O   VAL D  22     -34.720 -34.827   6.346  1.00 40.00           O  
+ATOM   5620  CB  VAL D  22     -35.870 -36.428   3.935  1.00 40.00           C  
+ATOM   5621  CG1 VAL D  22     -35.412 -37.798   4.430  1.00 40.00           C  
+ATOM   5622  CG2 VAL D  22     -36.787 -36.592   2.725  1.00 40.00           C  
+ATOM   5623  N   TYR D  23     -36.055 -36.356   7.310  1.00 40.00           N  
+ATOM   5624  CA  TYR D  23     -35.212 -36.522   8.483  1.00 40.00           C  
+ATOM   5625  C   TYR D  23     -33.854 -37.067   8.097  1.00 40.00           C  
+ATOM   5626  O   TYR D  23     -33.723 -37.835   7.146  1.00 40.00           O  
+ATOM   5627  CB  TYR D  23     -35.854 -37.467   9.490  1.00 40.00           C  
+ATOM   5628  CG  TYR D  23     -37.118 -36.945  10.121  1.00 40.00           C  
+ATOM   5629  CD1 TYR D  23     -38.349 -37.544   9.864  1.00 40.00           C  
+ATOM   5630  CD2 TYR D  23     -37.087 -35.858  10.981  1.00 40.00           C  
+ATOM   5631  CE1 TYR D  23     -39.510 -37.070  10.452  1.00 40.00           C  
+ATOM   5632  CE2 TYR D  23     -38.240 -35.374  11.569  1.00 40.00           C  
+ATOM   5633  CZ  TYR D  23     -39.445 -35.980  11.305  1.00 40.00           C  
+ATOM   5634  OH  TYR D  23     -40.575 -35.478  11.901  1.00 40.00           O  
+ATOM   5635  N   ILE D  24     -32.849 -36.675   8.865  1.00 40.00           N  
+ATOM   5636  CA  ILE D  24     -31.455 -36.971   8.543  1.00 40.00           C  
+ATOM   5637  C   ILE D  24     -31.105 -38.467   8.576  1.00 40.00           C  
+ATOM   5638  O   ILE D  24     -30.468 -38.978   7.649  1.00 40.00           O  
+ATOM   5639  CB  ILE D  24     -30.484 -36.168   9.451  1.00 40.00           C  
+ATOM   5640  CG1 ILE D  24     -30.558 -34.661   9.128  1.00 40.00           C  
+ATOM   5641  CG2 ILE D  24     -29.050 -36.693   9.311  1.00 40.00           C  
+ATOM   5642  CD1 ILE D  24     -30.128 -33.749  10.260  1.00 40.00           C  
+ATOM   5643  N   LEU D  25     -31.509 -39.151   9.649  1.00 40.00           N  
+ATOM   5644  CA  LEU D  25     -31.208 -40.580   9.845  1.00 40.00           C  
+ATOM   5645  C   LEU D  25     -31.864 -41.426   8.757  1.00 40.00           C  
+ATOM   5646  O   LEU D  25     -31.263 -42.402   8.290  1.00 40.00           O  
+ATOM   5647  CB  LEU D  25     -31.664 -41.037  11.237  1.00 40.00           C  
+ATOM   5648  CG  LEU D  25     -31.419 -42.468  11.725  1.00 40.00           C  
+ATOM   5649  CD1 LEU D  25     -30.012 -42.638  12.271  1.00 40.00           C  
+ATOM   5650  CD2 LEU D  25     -32.454 -42.809  12.791  1.00 40.00           C  
+ATOM   5651  N   ASP D  26     -33.089 -41.034   8.371  1.00 40.00           N  
+ATOM   5652  CA  ASP D  26     -33.819 -41.613   7.241  1.00 40.00           C  
+ATOM   5653  C   ASP D  26     -32.915 -41.732   6.025  1.00 40.00           C  
+ATOM   5654  O   ASP D  26     -32.703 -42.837   5.496  1.00 40.00           O  
+ATOM   5655  CB  ASP D  26     -35.032 -40.746   6.890  1.00 40.00           C  
+ATOM   5656  CG  ASP D  26     -36.116 -40.819   7.934  1.00 40.00           C  
+ATOM   5657  OD1 ASP D  26     -35.968 -41.620   8.888  1.00 40.00           O  
+ATOM   5658  OD2 ASP D  26     -37.120 -40.082   7.793  1.00 40.00           O  
+ATOM   5659  N   GLN D  27     -32.377 -40.586   5.601  1.00 40.00           N  
+ATOM   5660  CA  GLN D  27     -31.390 -40.520   4.521  1.00 40.00           C  
+ATOM   5661  C   GLN D  27     -30.182 -41.470   4.732  1.00 40.00           C  
+ATOM   5662  O   GLN D  27     -29.927 -42.350   3.896  1.00 40.00           O  
+ATOM   5663  CB  GLN D  27     -30.925 -39.072   4.335  1.00 40.00           C  
+ATOM   5664  CG  GLN D  27     -30.270 -38.802   2.996  1.00 40.00           C  
+ATOM   5665  CD  GLN D  27     -31.189 -39.139   1.849  1.00 40.00           C  
+ATOM   5666  OE1 GLN D  27     -32.315 -38.633   1.766  1.00 40.00           O  
+ATOM   5667  NE2 GLN D  27     -30.722 -40.009   0.960  1.00 40.00           N  
+ATOM   5668  N   ALA D  28     -29.471 -41.294   5.855  1.00 40.00           N  
+ATOM   5669  CA  ALA D  28     -28.270 -42.073   6.206  1.00 40.00           C  
+ATOM   5670  C   ALA D  28     -28.468 -43.556   5.970  1.00 40.00           C  
+ATOM   5671  O   ALA D  28     -27.605 -44.227   5.421  1.00 40.00           O  
+ATOM   5672  CB  ALA D  28     -27.885 -41.829   7.658  1.00 40.00           C  
+ATOM   5673  N   GLU D  29     -29.630 -44.040   6.386  1.00 40.00           N  
+ATOM   5674  CA  GLU D  29     -30.022 -45.430   6.252  1.00 40.00           C  
+ATOM   5675  C   GLU D  29     -30.128 -45.910   4.788  1.00 40.00           C  
+ATOM   5676  O   GLU D  29     -29.498 -46.910   4.438  1.00 40.00           O  
+ATOM   5677  CB  GLU D  29     -31.340 -45.626   6.992  1.00 40.00           C  
+ATOM   5678  CG  GLU D  29     -31.734 -47.058   7.294  1.00 40.00           C  
+ATOM   5679  CD  GLU D  29     -33.203 -47.154   7.665  1.00 40.00           C  
+ATOM   5680  OE1 GLU D  29     -33.816 -46.099   7.943  1.00 40.00           O  
+ATOM   5681  OE2 GLU D  29     -33.757 -48.276   7.673  1.00 40.00           O  
+ATOM   5682  N   GLU D  30     -30.908 -45.217   3.943  1.00 40.00           N  
+ATOM   5683  CA  GLU D  30     -31.027 -45.583   2.505  1.00 40.00           C  
+ATOM   5684  C   GLU D  30     -29.698 -45.452   1.817  1.00 40.00           C  
+ATOM   5685  O   GLU D  30     -29.450 -46.112   0.803  1.00 40.00           O  
+ATOM   5686  CB  GLU D  30     -31.962 -44.666   1.742  1.00 40.00           C  
+ATOM   5687  CG  GLU D  30     -33.420 -44.830   2.039  1.00 40.00           C  
+ATOM   5688  CD  GLU D  30     -34.138 -43.576   1.635  1.00 40.00           C  
+ATOM   5689  OE1 GLU D  30     -33.848 -43.103   0.510  1.00 40.00           O  
+ATOM   5690  OE2 GLU D  30     -34.944 -43.052   2.443  1.00 40.00           O  
+ATOM   5691  N   ASP D  31     -28.868 -44.559   2.357  1.00 40.00           N  
+ATOM   5692  CA  ASP D  31     -27.512 -44.354   1.875  1.00 40.00           C  
+ATOM   5693  C   ASP D  31     -26.550 -45.344   2.526  1.00 40.00           C  
+ATOM   5694  O   ASP D  31     -25.332 -45.214   2.397  1.00 40.00           O  
+ATOM   5695  CB  ASP D  31     -27.083 -42.893   2.073  1.00 40.00           C  
+ATOM   5696  CG  ASP D  31     -27.815 -41.937   1.124  1.00 40.00           C  
+ATOM   5697  OD1 ASP D  31     -28.789 -42.368   0.454  1.00 40.00           O  
+ATOM   5698  OD2 ASP D  31     -27.422 -40.749   1.045  1.00 40.00           O  
+ATOM   5699  N   GLY D  32     -27.116 -46.335   3.214  1.00 40.00           N  
+ATOM   5700  CA  GLY D  32     -26.358 -47.479   3.714  1.00 40.00           C  
+ATOM   5701  C   GLY D  32     -25.488 -47.263   4.938  1.00 40.00           C  
+ATOM   5702  O   GLY D  32     -24.548 -48.036   5.180  1.00 40.00           O  
+ATOM   5703  N   ILE D  33     -25.802 -46.222   5.710  1.00 40.00           N  
+ATOM   5704  CA  ILE D  33     -25.006 -45.863   6.884  1.00 40.00           C  
+ATOM   5705  C   ILE D  33     -25.730 -46.315   8.156  1.00 40.00           C  
+ATOM   5706  O   ILE D  33     -26.948 -46.112   8.314  1.00 40.00           O  
+ATOM   5707  CB  ILE D  33     -24.643 -44.350   6.925  1.00 40.00           C  
+ATOM   5708  CG1 ILE D  33     -24.297 -43.825   5.519  1.00 40.00           C  
+ATOM   5709  CG2 ILE D  33     -23.466 -44.112   7.869  1.00 40.00           C  
+ATOM   5710  CD1 ILE D  33     -24.632 -42.366   5.278  1.00 40.00           C  
+ATOM   5711  N   ASP D  34     -24.955 -46.952   9.036  1.00 40.00           N  
+ATOM   5712  CA  ASP D  34     -25.441 -47.504  10.301  1.00 40.00           C  
+ATOM   5713  C   ASP D  34     -25.234 -46.517  11.480  1.00 40.00           C  
+ATOM   5714  O   ASP D  34     -24.148 -46.444  12.076  1.00 40.00           O  
+ATOM   5715  CB  ASP D  34     -24.769 -48.869  10.563  1.00 40.00           C  
+ATOM   5716  CG  ASP D  34     -25.460 -49.688  11.665  1.00 40.00           C  
+ATOM   5717  OD1 ASP D  34     -26.592 -49.350  12.086  1.00 40.00           O  
+ATOM   5718  OD2 ASP D  34     -24.859 -50.691  12.109  1.00 40.00           O  
+ATOM   5719  N   LEU D  35     -26.290 -45.758  11.790  1.00 40.00           N  
+ATOM   5720  CA  LEU D  35     -26.304 -44.789  12.895  1.00 40.00           C  
+ATOM   5721  C   LEU D  35     -27.220 -45.285  13.997  1.00 40.00           C  
+ATOM   5722  O   LEU D  35     -28.292 -45.810  13.704  1.00 40.00           O  
+ATOM   5723  CB  LEU D  35     -26.829 -43.439  12.415  1.00 40.00           C  
+ATOM   5724  CG  LEU D  35     -26.151 -42.793  11.216  1.00 40.00           C  
+ATOM   5725  CD1 LEU D  35     -26.983 -41.600  10.799  1.00 40.00           C  
+ATOM   5726  CD2 LEU D  35     -24.732 -42.379  11.586  1.00 40.00           C  
+ATOM   5727  N   PRO D  36     -26.829 -45.086  15.268  1.00 40.00           N  
+ATOM   5728  CA  PRO D  36     -27.635 -45.625  16.359  1.00 40.00           C  
+ATOM   5729  C   PRO D  36     -29.022 -44.966  16.408  1.00 40.00           C  
+ATOM   5730  O   PRO D  36     -29.167 -43.807  15.996  1.00 40.00           O  
+ATOM   5731  CB  PRO D  36     -26.810 -45.285  17.602  1.00 40.00           C  
+ATOM   5732  CG  PRO D  36     -26.072 -44.049  17.220  1.00 40.00           C  
+ATOM   5733  CD  PRO D  36     -25.758 -44.202  15.758  1.00 40.00           C  
+ATOM   5734  N   TYR D  37     -30.017 -45.732  16.869  1.00 40.00           N  
+ATOM   5735  CA  TYR D  37     -31.418 -45.289  16.994  1.00 40.00           C  
+ATOM   5736  C   TYR D  37     -32.237 -46.232  17.871  1.00 40.00           C  
+ATOM   5737  O   TYR D  37     -31.779 -47.329  18.213  1.00 40.00           O  
+ATOM   5738  CB  TYR D  37     -32.107 -45.139  15.621  1.00 40.00           C  
+ATOM   5739  CG  TYR D  37     -32.334 -46.423  14.822  1.00 40.00           C  
+ATOM   5740  CD1 TYR D  37     -31.271 -47.064  14.170  1.00 40.00           C  
+ATOM   5741  CD2 TYR D  37     -33.614 -46.970  14.682  1.00 40.00           C  
+ATOM   5742  CE1 TYR D  37     -31.464 -48.221  13.429  1.00 40.00           C  
+ATOM   5743  CE2 TYR D  37     -33.822 -48.123  13.933  1.00 40.00           C  
+ATOM   5744  CZ  TYR D  37     -32.740 -48.745  13.309  1.00 40.00           C  
+ATOM   5745  OH  TYR D  37     -32.910 -49.896  12.559  1.00 40.00           O  
+ATOM   5746  N   SER D  38     -33.449 -45.794  18.221  1.00 40.00           N  
+ATOM   5747  CA  SER D  38     -34.385 -46.595  19.005  1.00 40.00           C  
+ATOM   5748  C   SER D  38     -35.825 -46.245  18.635  1.00 40.00           C  
+ATOM   5749  O   SER D  38     -36.444 -46.934  17.818  1.00 40.00           O  
+ATOM   5750  CB  SER D  38     -34.140 -46.385  20.506  1.00 40.00           C  
+ATOM   5751  OG  SER D  38     -34.786 -47.367  21.288  1.00 40.00           O  
+ATOM   5752  N   CYS D  39     -36.324 -45.158  19.229  1.00 40.00           N  
+ATOM   5753  CA  CYS D  39     -37.730 -44.741  19.153  1.00 40.00           C  
+ATOM   5754  C   CYS D  39     -38.129 -44.304  17.760  1.00 40.00           C  
+ATOM   5755  O   CYS D  39     -39.217 -44.632  17.263  1.00 40.00           O  
+ATOM   5756  CB  CYS D  39     -37.984 -43.574  20.117  1.00 40.00           C  
+ATOM   5757  SG  CYS D  39     -37.365 -41.965  19.544  1.00 40.00           S  
+ATOM   5758  N   ARG D  40     -37.229 -43.540  17.151  1.00 40.00           N  
+ATOM   5759  CA  ARG D  40     -37.478 -42.902  15.880  1.00 40.00           C  
+ATOM   5760  C   ARG D  40     -38.738 -42.063  15.967  1.00 40.00           C  
+ATOM   5761  O   ARG D  40     -39.567 -42.064  15.062  1.00 40.00           O  
+ATOM   5762  CB  ARG D  40     -37.559 -43.935  14.754  1.00 40.00           C  
+ATOM   5763  CG  ARG D  40     -36.222 -44.608  14.461  1.00 40.00           C  
+ATOM   5764  CD  ARG D  40     -36.386 -45.810  13.539  1.00 40.00           C  
+ATOM   5765  NE  ARG D  40     -36.719 -45.420  12.174  1.00 40.00           N  
+ATOM   5766  CZ  ARG D  40     -35.824 -45.218  11.217  1.00 40.00           C  
+ATOM   5767  NH1 ARG D  40     -34.534 -45.372  11.474  1.00 40.00           N  
+ATOM   5768  NH2 ARG D  40     -36.224 -44.857  10.007  1.00 40.00           N  
+ATOM   5769  N   ALA D  41     -38.879 -41.362  17.083  1.00 40.00           N  
+ATOM   5770  CA  ALA D  41     -39.955 -40.405  17.250  1.00 40.00           C  
+ATOM   5771  C   ALA D  41     -39.513 -39.287  18.186  1.00 40.00           C  
+ATOM   5772  O   ALA D  41     -40.335 -38.544  18.737  1.00 40.00           O  
+ATOM   5773  CB  ALA D  41     -41.221 -41.088  17.736  1.00 40.00           C  
+ATOM   5774  N   GLY D  42     -38.198 -39.187  18.357  1.00 40.00           N  
+ATOM   5775  CA  GLY D  42     -37.581 -38.012  18.949  1.00 40.00           C  
+ATOM   5776  C   GLY D  42     -37.859 -37.764  20.413  1.00 40.00           C  
+ATOM   5777  O   GLY D  42     -37.872 -36.624  20.873  1.00 40.00           O  
+ATOM   5778  N   SER D  43     -38.087 -38.818  21.167  1.00 40.00           N  
+ATOM   5779  CA  SER D  43     -38.162 -38.622  22.586  1.00 40.00           C  
+ATOM   5780  C   SER D  43     -37.345 -39.697  23.266  1.00 40.00           C  
+ATOM   5781  O   SER D  43     -37.779 -40.267  24.261  1.00 40.00           O  
+ATOM   5782  CB  SER D  43     -39.611 -38.598  23.068  1.00 40.00           C  
+ATOM   5783  OG  SER D  43     -40.169 -39.883  22.990  1.00 40.00           O  
+ATOM   5784  N   CYS D  44     -36.165 -39.980  22.711  1.00 40.00           N  
+ATOM   5785  CA  CYS D  44     -35.177 -40.867  23.360  1.00 40.00           C  
+ATOM   5786  C   CYS D  44     -33.755 -40.327  23.180  1.00 40.00           C  
+ATOM   5787  O   CYS D  44     -33.580 -39.162  22.805  1.00 40.00           O  
+ATOM   5788  CB  CYS D  44     -35.297 -42.320  22.872  1.00 40.00           C  
+ATOM   5789  SG  CYS D  44     -34.195 -42.765  21.510  1.00 40.00           S  
+ATOM   5790  N   SER D  45     -32.752 -41.167  23.437  1.00 40.00           N  
+ATOM   5791  CA  SER D  45     -31.367 -40.714  23.418  1.00 40.00           C  
+ATOM   5792  C   SER D  45     -30.437 -41.428  22.434  1.00 40.00           C  
+ATOM   5793  O   SER D  45     -29.278 -41.033  22.294  1.00 40.00           O  
+ATOM   5794  CB  SER D  45     -30.783 -40.806  24.822  1.00 40.00           C  
+ATOM   5795  OG  SER D  45     -30.887 -42.124  25.312  1.00 40.00           O  
+ATOM   5796  N   SER D  46     -30.942 -42.449  21.745  1.00 40.00           N  
+ATOM   5797  CA  SER D  46     -30.090 -43.369  20.973  1.00 40.00           C  
+ATOM   5798  C   SER D  46     -29.371 -42.757  19.790  1.00 40.00           C  
+ATOM   5799  O   SER D  46     -28.178 -43.002  19.594  1.00 40.00           O  
+ATOM   5800  CB  SER D  46     -30.900 -44.561  20.496  1.00 40.00           C  
+ATOM   5801  OG  SER D  46     -31.220 -45.408  21.586  1.00 40.00           O  
+ATOM   5802  N   CYS D  47     -30.109 -41.964  19.015  1.00 40.00           N  
+ATOM   5803  CA  CYS D  47     -29.601 -41.327  17.791  1.00 40.00           C  
+ATOM   5804  C   CYS D  47     -28.733 -40.083  18.034  1.00 40.00           C  
+ATOM   5805  O   CYS D  47     -28.312 -39.413  17.079  1.00 40.00           O  
+ATOM   5806  CB  CYS D  47     -30.767 -40.990  16.867  1.00 40.00           C  
+ATOM   5807  SG  CYS D  47     -32.074 -40.088  17.697  1.00 40.00           S  
+ATOM   5808  N   ALA D  48     -28.455 -39.815  19.313  1.00 40.00           N  
+ATOM   5809  CA  ALA D  48     -27.720 -38.639  19.769  1.00 40.00           C  
+ATOM   5810  C   ALA D  48     -26.500 -38.306  18.946  1.00 40.00           C  
+ATOM   5811  O   ALA D  48     -25.771 -39.174  18.461  1.00 40.00           O  
+ATOM   5812  CB  ALA D  48     -27.329 -38.777  21.230  1.00 40.00           C  
+ATOM   5813  N   GLY D  49     -26.302 -37.009  18.809  1.00 40.00           N  
+ATOM   5814  CA  GLY D  49     -25.183 -36.465  18.081  1.00 40.00           C  
+ATOM   5815  C   GLY D  49     -24.997 -35.007  18.441  1.00 40.00           C  
+ATOM   5816  O   GLY D  49     -25.828 -34.415  19.150  1.00 40.00           O  
+ATOM   5817  N   LYS D  50     -23.907 -34.426  17.940  1.00 40.00           N  
+ATOM   5818  CA  LYS D  50     -23.546 -33.038  18.254  1.00 40.00           C  
+ATOM   5819  C   LYS D  50     -23.358 -32.170  16.997  1.00 40.00           C  
+ATOM   5820  O   LYS D  50     -22.594 -32.544  16.098  1.00 40.00           O  
+ATOM   5821  CB  LYS D  50     -22.267 -32.997  19.117  1.00 40.00           C  
+ATOM   5822  CG  LYS D  50     -22.432 -33.498  20.548  1.00 40.00           C  
+ATOM   5823  CD  LYS D  50     -21.540 -32.723  21.501  1.00 40.00           C  
+ATOM   5824  CE  LYS D  50     -22.085 -31.326  21.724  1.00 40.00           C  
+ATOM   5825  NZ  LYS D  50     -21.109 -30.511  22.488  1.00 40.00           N  
+ATOM   5826  N   VAL D  51     -24.048 -31.023  16.946  1.00 40.00           N  
+ATOM   5827  CA  VAL D  51     -23.841 -30.035  15.880  1.00 40.00           C  
+ATOM   5828  C   VAL D  51     -22.471 -29.386  16.034  1.00 40.00           C  
+ATOM   5829  O   VAL D  51     -22.185 -28.787  17.072  1.00 40.00           O  
+ATOM   5830  CB  VAL D  51     -24.925 -28.931  15.872  1.00 40.00           C  
+ATOM   5831  CG1 VAL D  51     -24.640 -27.886  14.792  1.00 40.00           C  
+ATOM   5832  CG2 VAL D  51     -26.294 -29.551  15.662  1.00 40.00           C  
+ATOM   5833  N   VAL D  52     -21.629 -29.540  15.008  1.00 40.00           N  
+ATOM   5834  CA  VAL D  52     -20.333 -28.845  14.904  1.00 40.00           C  
+ATOM   5835  C   VAL D  52     -20.541 -27.494  14.175  1.00 40.00           C  
+ATOM   5836  O   VAL D  52     -19.970 -26.463  14.566  1.00 40.00           O  
+ATOM   5837  CB  VAL D  52     -19.254 -29.729  14.200  1.00 40.00           C  
+ATOM   5838  CG1 VAL D  52     -17.900 -29.028  14.118  1.00 40.00           C  
+ATOM   5839  CG2 VAL D  52     -19.104 -31.068  14.911  1.00 40.00           C  
+ATOM   5840  N   SER D  53     -21.385 -27.506  13.141  1.00 40.00           N  
+ATOM   5841  CA  SER D  53     -21.648 -26.329  12.328  1.00 40.00           C  
+ATOM   5842  C   SER D  53     -22.962 -26.503  11.605  1.00 40.00           C  
+ATOM   5843  O   SER D  53     -23.525 -27.593  11.585  1.00 40.00           O  
+ATOM   5844  CB  SER D  53     -20.527 -26.129  11.305  1.00 40.00           C  
+ATOM   5845  OG  SER D  53     -20.487 -27.198  10.377  1.00 40.00           O  
+ATOM   5846  N   GLY D  54     -23.440 -25.426  10.998  1.00 40.00           N  
+ATOM   5847  CA  GLY D  54     -24.700 -25.460  10.292  1.00 40.00           C  
+ATOM   5848  C   GLY D  54     -25.864 -25.582  11.252  1.00 40.00           C  
+ATOM   5849  O   GLY D  54     -25.683 -25.795  12.464  1.00 40.00           O  
+ATOM   5850  N   SER D  55     -27.062 -25.452  10.686  1.00 40.00           N  
+ATOM   5851  CA  SER D  55     -28.316 -25.423  11.447  1.00 40.00           C  
+ATOM   5852  C   SER D  55     -29.263 -26.588  11.094  1.00 40.00           C  
+ATOM   5853  O   SER D  55     -29.151 -27.193  10.010  1.00 40.00           O  
+ATOM   5854  CB  SER D  55     -29.028 -24.051  11.295  1.00 40.00           C  
+ATOM   5855  OG  SER D  55     -29.234 -23.669   9.940  1.00 40.00           O  
+ATOM   5856  N   VAL D  56     -30.166 -26.908  12.032  1.00 40.00           N  
+ATOM   5857  CA  VAL D  56     -31.234 -27.908  11.829  1.00 40.00           C  
+ATOM   5858  C   VAL D  56     -32.609 -27.465  12.382  1.00 40.00           C  
+ATOM   5859  O   VAL D  56     -32.698 -26.626  13.290  1.00 40.00           O  
+ATOM   5860  CB  VAL D  56     -30.869 -29.333  12.369  1.00 40.00           C  
+ATOM   5861  CG1 VAL D  56     -29.465 -29.769  11.936  1.00 40.00           C  
+ATOM   5862  CG2 VAL D  56     -31.056 -29.445  13.883  1.00 40.00           C  
+ATOM   5863  N   ASP D  57     -33.670 -28.033  11.803  1.00 40.00           N  
+ATOM   5864  CA  ASP D  57     -35.052 -27.858  12.277  1.00 40.00           C  
+ATOM   5865  C   ASP D  57     -35.521 -29.145  12.975  1.00 40.00           C  
+ATOM   5866  O   ASP D  57     -36.141 -30.035  12.361  1.00 40.00           O  
+ATOM   5867  CB  ASP D  57     -35.992 -27.454  11.114  1.00 40.00           C  
+ATOM   5868  CG  ASP D  57     -37.479 -27.453  11.506  1.00 40.00           C  
+ATOM   5869  OD1 ASP D  57     -38.320 -27.548  10.583  1.00 40.00           O  
+ATOM   5870  OD2 ASP D  57     -37.808 -27.364  12.717  1.00 40.00           O  
+ATOM   5871  N   GLN D  58     -35.202 -29.240  14.260  1.00 40.00           N  
+ATOM   5872  CA  GLN D  58     -35.620 -30.385  15.044  1.00 40.00           C  
+ATOM   5873  C   GLN D  58     -36.814 -30.027  15.923  1.00 40.00           C  
+ATOM   5874  O   GLN D  58     -36.955 -30.550  17.029  1.00 40.00           O  
+ATOM   5875  CB  GLN D  58     -34.453 -30.956  15.860  1.00 40.00           C  
+ATOM   5876  CG  GLN D  58     -33.647 -29.910  16.614  1.00 40.00           C  
+ATOM   5877  CD  GLN D  58     -32.558 -30.520  17.471  1.00 40.00           C  
+ATOM   5878  OE1 GLN D  58     -31.707 -29.803  18.004  1.00 40.00           O  
+ATOM   5879  NE2 GLN D  58     -32.580 -31.848  17.616  1.00 40.00           N  
+ATOM   5880  N   SER D  59     -37.665 -29.124  15.432  1.00 40.00           N  
+ATOM   5881  CA  SER D  59     -38.962 -28.897  16.065  1.00 40.00           C  
+ATOM   5882  C   SER D  59     -39.769 -30.177  15.880  1.00 40.00           C  
+ATOM   5883  O   SER D  59     -39.781 -30.767  14.782  1.00 40.00           O  
+ATOM   5884  CB  SER D  59     -39.693 -27.666  15.500  1.00 40.00           C  
+ATOM   5885  OG  SER D  59     -40.198 -27.888  14.194  1.00 40.00           O  
+ATOM   5886  N   ASP D  60     -40.389 -30.619  16.975  1.00 40.00           N  
+ATOM   5887  CA  ASP D  60     -41.091 -31.908  17.041  1.00 40.00           C  
+ATOM   5888  C   ASP D  60     -40.261 -33.064  17.661  1.00 40.00           C  
+ATOM   5889  O   ASP D  60     -40.617 -34.245  17.554  1.00 40.00           O  
+ATOM   5890  CB  ASP D  60     -41.649 -32.305  15.665  1.00 40.00           C  
+ATOM   5891  CG  ASP D  60     -42.980 -33.028  15.762  1.00 40.00           C  
+ATOM   5892  OD1 ASP D  60     -43.526 -33.167  16.889  1.00 40.00           O  
+ATOM   5893  OD2 ASP D  60     -43.486 -33.455  14.702  1.00 40.00           O  
+ATOM   5894  N   GLN D  61     -39.144 -32.722  18.290  1.00 40.00           N  
+ATOM   5895  CA  GLN D  61     -38.545 -33.624  19.249  1.00 40.00           C  
+ATOM   5896  C   GLN D  61     -39.126 -33.216  20.599  1.00 40.00           C  
+ATOM   5897  O   GLN D  61     -39.817 -32.192  20.710  1.00 40.00           O  
+ATOM   5898  CB  GLN D  61     -37.003 -33.578  19.218  1.00 40.00           C  
+ATOM   5899  CG  GLN D  61     -36.345 -32.313  19.774  1.00 40.00           C  
+ATOM   5900  CD  GLN D  61     -36.164 -32.307  21.293  1.00 40.00           C  
+ATOM   5901  OE1 GLN D  61     -35.932 -33.350  21.914  1.00 40.00           O  
+ATOM   5902  NE2 GLN D  61     -36.259 -31.119  21.896  1.00 40.00           N  
+ATOM   5903  N   SER D  62     -38.867 -34.023  21.617  1.00 40.00           N  
+ATOM   5904  CA  SER D  62     -39.357 -33.714  22.942  1.00 40.00           C  
+ATOM   5905  C   SER D  62     -38.394 -34.127  24.055  1.00 40.00           C  
+ATOM   5906  O   SER D  62     -38.605 -33.740  25.201  1.00 40.00           O  
+ATOM   5907  CB  SER D  62     -40.764 -34.299  23.157  1.00 40.00           C  
+ATOM   5908  OG  SER D  62     -40.920 -35.545  22.494  1.00 40.00           O  
+ATOM   5909  N   TYR D  63     -37.332 -34.871  23.728  1.00 40.00           N  
+ATOM   5910  CA  TYR D  63     -36.413 -35.418  24.752  1.00 40.00           C  
+ATOM   5911  C   TYR D  63     -35.429 -34.428  25.416  1.00 40.00           C  
+ATOM   5912  O   TYR D  63     -35.204 -34.476  26.635  1.00 40.00           O  
+ATOM   5913  CB  TYR D  63     -35.634 -36.604  24.182  1.00 40.00           C  
+ATOM   5914  CG  TYR D  63     -34.821 -37.348  25.219  1.00 40.00           C  
+ATOM   5915  CD1 TYR D  63     -33.538 -36.924  25.566  1.00 40.00           C  
+ATOM   5916  CD2 TYR D  63     -35.335 -38.478  25.860  1.00 40.00           C  
+ATOM   5917  CE1 TYR D  63     -32.793 -37.607  26.522  1.00 40.00           C  
+ATOM   5918  CE2 TYR D  63     -34.595 -39.176  26.806  1.00 40.00           C  
+ATOM   5919  CZ  TYR D  63     -33.329 -38.739  27.135  1.00 40.00           C  
+ATOM   5920  OH  TYR D  63     -32.610 -39.433  28.077  1.00 40.00           O  
+ATOM   5921  N   LEU D  64     -34.828 -33.557  24.610  1.00 40.00           N  
+ATOM   5922  CA  LEU D  64     -33.866 -32.571  25.106  1.00 40.00           C  
+ATOM   5923  C   LEU D  64     -34.530 -31.326  25.703  1.00 40.00           C  
+ATOM   5924  O   LEU D  64     -35.555 -30.849  25.199  1.00 40.00           O  
+ATOM   5925  CB  LEU D  64     -32.945 -32.125  23.970  1.00 40.00           C  
+ATOM   5926  CG  LEU D  64     -32.161 -33.161  23.166  1.00 40.00           C  
+ATOM   5927  CD1 LEU D  64     -31.595 -32.503  21.912  1.00 40.00           C  
+ATOM   5928  CD2 LEU D  64     -31.058 -33.779  24.015  1.00 40.00           C  
+ATOM   5929  N   ASP D  65     -33.937 -30.793  26.769  1.00 40.00           N  
+ATOM   5930  CA  ASP D  65     -34.296 -29.460  27.256  1.00 40.00           C  
+ATOM   5931  C   ASP D  65     -33.571 -28.421  26.402  1.00 40.00           C  
+ATOM   5932  O   ASP D  65     -32.741 -28.783  25.560  1.00 40.00           O  
+ATOM   5933  CB  ASP D  65     -33.950 -29.300  28.744  1.00 40.00           C  
+ATOM   5934  CG  ASP D  65     -32.466 -29.573  29.058  1.00 40.00           C  
+ATOM   5935  OD1 ASP D  65     -31.571 -28.997  28.395  1.00 40.00           O  
+ATOM   5936  OD2 ASP D  65     -32.193 -30.347  30.002  1.00 40.00           O  
+ATOM   5937  N   ASP D  66     -33.861 -27.140  26.624  1.00 40.00           N  
+ATOM   5938  CA  ASP D  66     -33.265 -26.064  25.807  1.00 40.00           C  
+ATOM   5939  C   ASP D  66     -31.749 -25.888  25.905  1.00 40.00           C  
+ATOM   5940  O   ASP D  66     -31.121 -25.478  24.926  1.00 40.00           O  
+ATOM   5941  CB  ASP D  66     -33.946 -24.730  26.086  1.00 40.00           C  
+ATOM   5942  CG  ASP D  66     -35.289 -24.624  25.417  1.00 40.00           C  
+ATOM   5943  OD1 ASP D  66     -35.404 -25.086  24.253  1.00 40.00           O  
+ATOM   5944  OD2 ASP D  66     -36.222 -24.073  26.052  1.00 40.00           O  
+ATOM   5945  N   GLY D  67     -31.188 -26.176  27.084  1.00 40.00           N  
+ATOM   5946  CA  GLY D  67     -29.741 -26.069  27.352  1.00 40.00           C  
+ATOM   5947  C   GLY D  67     -28.899 -27.117  26.645  1.00 40.00           C  
+ATOM   5948  O   GLY D  67     -27.695 -26.922  26.427  1.00 40.00           O  
+ATOM   5949  N   GLN D  68     -29.545 -28.236  26.309  1.00 40.00           N  
+ATOM   5950  CA  GLN D  68     -28.970 -29.281  25.460  1.00 40.00           C  
+ATOM   5951  C   GLN D  68     -29.053 -28.885  23.964  1.00 40.00           C  
+ATOM   5952  O   GLN D  68     -28.115 -29.145  23.201  1.00 40.00           O  
+ATOM   5953  CB  GLN D  68     -29.632 -30.645  25.756  1.00 40.00           C  
+ATOM   5954  CG  GLN D  68     -29.261 -31.232  27.128  1.00 40.00           C  
+ATOM   5955  CD  GLN D  68     -30.143 -32.398  27.609  1.00 40.00           C  
+ATOM   5956  OE1 GLN D  68     -31.377 -32.386  27.468  1.00 40.00           O  
+ATOM   5957  NE2 GLN D  68     -29.503 -33.401  28.216  1.00 40.00           N  
+ATOM   5958  N   ILE D  69     -30.163 -28.246  23.566  1.00 40.00           N  
+ATOM   5959  CA  ILE D  69     -30.319 -27.606  22.231  1.00 40.00           C  
+ATOM   5960  C   ILE D  69     -29.362 -26.417  22.078  1.00 40.00           C  
+ATOM   5961  O   ILE D  69     -28.738 -26.220  21.017  1.00 40.00           O  
+ATOM   5962  CB  ILE D  69     -31.770 -27.096  22.000  1.00 40.00           C  
+ATOM   5963  CG1 ILE D  69     -32.725 -28.280  21.796  1.00 40.00           C  
+ATOM   5964  CG2 ILE D  69     -31.849 -26.107  20.826  1.00 40.00           C  
+ATOM   5965  CD1 ILE D  69     -34.171 -27.979  22.148  1.00 40.00           C  
+ATOM   5966  N   CYS D  70     -29.283 -25.623  23.148  1.00 40.00           N  
+ATOM   5967  CA  CYS D  70     -28.295 -24.564  23.286  1.00 40.00           C  
+ATOM   5968  C   CYS D  70     -26.883 -25.112  23.172  1.00 40.00           C  
+ATOM   5969  O   CYS D  70     -25.992 -24.451  22.632  1.00 40.00           O  
+ATOM   5970  CB  CYS D  70     -28.456 -23.862  24.636  1.00 20.00           C  
+ATOM   5971  SG  CYS D  70     -28.825 -22.076  24.577  1.00 20.00           S  
+ATOM   5972  N   ASP D  71     -26.691 -26.325  23.679  1.00 40.00           N  
+ATOM   5973  CA  ASP D  71     -25.388 -26.972  23.630  1.00 40.00           C  
+ATOM   5974  C   ASP D  71     -25.141 -27.729  22.312  1.00 40.00           C  
+ATOM   5975  O   ASP D  71     -24.165 -28.479  22.196  1.00 40.00           O  
+ATOM   5976  CB  ASP D  71     -25.195 -27.887  24.850  1.00 40.00           C  
+ATOM   5977  CG  ASP D  71     -23.798 -27.766  25.468  1.00 40.00           C  
+ATOM   5978  OD1 ASP D  71     -23.116 -26.726  25.251  1.00 40.00           O  
+ATOM   5979  OD2 ASP D  71     -23.386 -28.710  26.183  1.00 40.00           O  
+ATOM   5980  N   GLY D  72     -26.016 -27.523  21.325  1.00 40.00           N  
+ATOM   5981  CA  GLY D  72     -25.837 -28.095  19.981  1.00 40.00           C  
+ATOM   5982  C   GLY D  72     -26.086 -29.593  19.873  1.00 40.00           C  
+ATOM   5983  O   GLY D  72     -25.733 -30.221  18.863  1.00 40.00           O  
+ATOM   5984  N   TRP D  73     -26.684 -30.165  20.920  1.00 40.00           N  
+ATOM   5985  CA  TRP D  73     -27.124 -31.549  20.901  1.00 40.00           C  
+ATOM   5986  C   TRP D  73     -28.241 -31.708  19.918  1.00 40.00           C  
+ATOM   5987  O   TRP D  73     -29.040 -30.787  19.720  1.00 40.00           O  
+ATOM   5988  CB  TRP D  73     -27.605 -31.969  22.279  1.00 40.00           C  
+ATOM   5989  CG  TRP D  73     -26.497 -32.374  23.215  1.00 40.00           C  
+ATOM   5990  CD1 TRP D  73     -26.015 -31.669  24.312  1.00 40.00           C  
+ATOM   5991  CD2 TRP D  73     -25.691 -33.611  23.169  1.00 40.00           C  
+ATOM   5992  NE1 TRP D  73     -24.999 -32.361  24.930  1.00 40.00           N  
+ATOM   5993  CE2 TRP D  73     -24.752 -33.529  24.299  1.00 40.00           C  
+ATOM   5994  CE3 TRP D  73     -25.656 -34.737  22.338  1.00 40.00           C  
+ATOM   5995  CZ2 TRP D  73     -23.827 -34.533  24.564  1.00 40.00           C  
+ATOM   5996  CZ3 TRP D  73     -24.719 -35.743  22.617  1.00 40.00           C  
+ATOM   5997  CH2 TRP D  73     -23.825 -35.638  23.701  1.00 40.00           C  
+ATOM   5998  N   VAL D  74     -28.316 -32.882  19.298  1.00 40.00           N  
+ATOM   5999  CA  VAL D  74     -29.358 -33.146  18.310  1.00 40.00           C  
+ATOM   6000  C   VAL D  74     -29.842 -34.607  18.281  1.00 40.00           C  
+ATOM   6001  O   VAL D  74     -29.062 -35.560  18.462  1.00 40.00           O  
+ATOM   6002  CB  VAL D  74     -28.927 -32.656  16.902  1.00 40.00           C  
+ATOM   6003  CG1 VAL D  74     -27.600 -33.284  16.482  1.00 40.00           C  
+ATOM   6004  CG2 VAL D  74     -30.024 -32.895  15.868  1.00 40.00           C  
+ATOM   6005  N   LEU D  75     -31.149 -34.753  18.069  1.00 40.00           N  
+ATOM   6006  CA  LEU D  75     -31.757 -36.046  17.785  1.00 40.00           C  
+ATOM   6007  C   LEU D  75     -31.869 -36.253  16.280  1.00 40.00           C  
+ATOM   6008  O   LEU D  75     -32.652 -35.582  15.583  1.00 40.00           O  
+ATOM   6009  CB  LEU D  75     -33.117 -36.191  18.482  1.00 40.00           C  
+ATOM   6010  CG  LEU D  75     -33.048 -36.415  20.006  1.00 40.00           C  
+ATOM   6011  CD1 LEU D  75     -34.420 -36.748  20.597  1.00 40.00           C  
+ATOM   6012  CD2 LEU D  75     -32.004 -37.471  20.389  1.00 40.00           C  
+ATOM   6013  N   THR D  76     -31.053 -37.183  15.796  1.00 40.00           N  
+ATOM   6014  CA  THR D  76     -30.929 -37.444  14.380  1.00 40.00           C  
+ATOM   6015  C   THR D  76     -32.257 -37.913  13.760  1.00 40.00           C  
+ATOM   6016  O   THR D  76     -32.620 -37.466  12.668  1.00 40.00           O  
+ATOM   6017  CB  THR D  76     -29.737 -38.387  14.082  1.00 40.00           C  
+ATOM   6018  OG1 THR D  76     -29.666 -39.422  15.066  1.00 40.00           O  
+ATOM   6019  CG2 THR D  76     -28.442 -37.621  14.146  1.00 40.00           C  
+ATOM   6020  N   CYS D  77     -32.995 -38.771  14.476  1.00 40.00           N  
+ATOM   6021  CA  CYS D  77     -34.259 -39.349  13.972  1.00 40.00           C  
+ATOM   6022  C   CYS D  77     -35.354 -38.308  13.738  1.00 40.00           C  
+ATOM   6023  O   CYS D  77     -36.359 -38.581  13.088  1.00 40.00           O  
+ATOM   6024  CB  CYS D  77     -34.778 -40.446  14.911  1.00 40.00           C  
+ATOM   6025  SG  CYS D  77     -35.879 -39.875  16.241  1.00 40.00           S  
+ATOM   6026  N   HIS D  78     -35.151 -37.115  14.277  1.00 40.00           N  
+ATOM   6027  CA  HIS D  78     -36.119 -36.040  14.136  1.00 40.00           C  
+ATOM   6028  C   HIS D  78     -35.502 -34.696  13.825  1.00 40.00           C  
+ATOM   6029  O   HIS D  78     -36.019 -33.643  14.206  1.00 40.00           O  
+ATOM   6030  CB  HIS D  78     -37.010 -35.974  15.372  1.00 40.00           C  
+ATOM   6031  CG  HIS D  78     -38.357 -36.621  15.186  1.00 40.00           C  
+ATOM   6032  ND1 HIS D  78     -38.500 -37.901  14.800  1.00 40.00           N  
+ATOM   6033  CD2 HIS D  78     -39.644 -36.113  15.363  1.00 40.00           C  
+ATOM   6034  CE1 HIS D  78     -39.812 -38.197  14.724  1.00 40.00           C  
+ATOM   6035  NE2 HIS D  78     -40.510 -37.102  15.075  1.00 40.00           N  
+ATOM   6036  N   ALA D  79     -34.394 -34.715  13.104  1.00 40.00           N  
+ATOM   6037  CA  ALA D  79     -33.794 -33.484  12.668  1.00 40.00           C  
+ATOM   6038  C   ALA D  79     -33.811 -33.391  11.145  1.00 40.00           C  
+ATOM   6039  O   ALA D  79     -33.263 -34.257  10.464  1.00 40.00           O  
+ATOM   6040  CB  ALA D  79     -32.382 -33.390  13.201  1.00 40.00           C  
+ATOM   6041  N   TYR D  80     -34.483 -32.365  10.619  1.00 40.00           N  
+ATOM   6042  CA  TYR D  80     -34.336 -31.948   9.209  1.00 40.00           C  
+ATOM   6043  C   TYR D  80     -33.210 -30.908   9.112  1.00 40.00           C  
+ATOM   6044  O   TYR D  80     -32.987 -30.171  10.080  1.00 40.00           O  
+ATOM   6045  CB  TYR D  80     -35.583 -31.218   8.703  1.00 40.00           C  
+ATOM   6046  CG  TYR D  80     -36.879 -31.961   8.766  1.00 40.00           C  
+ATOM   6047  CD1 TYR D  80     -37.866 -31.584   9.677  1.00 40.00           C  
+ATOM   6048  CD2 TYR D  80     -37.143 -33.014   7.889  1.00 40.00           C  
+ATOM   6049  CE1 TYR D  80     -39.076 -32.250   9.728  1.00 40.00           C  
+ATOM   6050  CE2 TYR D  80     -38.347 -33.690   7.931  1.00 40.00           C  
+ATOM   6051  CZ  TYR D  80     -39.310 -33.302   8.848  1.00 40.00           C  
+ATOM   6052  OH  TYR D  80     -40.506 -33.972   8.886  1.00 40.00           O  
+ATOM   6053  N   PRO D  81     -32.518 -30.809   7.947  1.00 40.00           N  
+ATOM   6054  CA  PRO D  81     -31.587 -29.669   7.822  1.00 40.00           C  
+ATOM   6055  C   PRO D  81     -32.241 -28.359   7.300  1.00 40.00           C  
+ATOM   6056  O   PRO D  81     -33.255 -28.391   6.575  1.00 40.00           O  
+ATOM   6057  CB  PRO D  81     -30.502 -30.199   6.867  1.00 40.00           C  
+ATOM   6058  CG  PRO D  81     -31.194 -31.243   6.042  1.00 40.00           C  
+ATOM   6059  CD  PRO D  81     -32.370 -31.774   6.834  1.00 40.00           C  
+ATOM   6060  N   THR D  82     -31.672 -27.225   7.722  1.00 40.00           N  
+ATOM   6061  CA  THR D  82     -31.993 -25.896   7.157  1.00 40.00           C  
+ATOM   6062  C   THR D  82     -30.724 -25.242   6.552  1.00 40.00           C  
+ATOM   6063  O   THR D  82     -30.770 -24.106   6.043  1.00 40.00           O  
+ATOM   6064  CB  THR D  82     -32.723 -24.944   8.163  1.00 40.00           C  
+ATOM   6065  OG1 THR D  82     -31.946 -24.766   9.360  1.00 40.00           O  
+ATOM   6066  CG2 THR D  82     -34.118 -25.476   8.521  1.00 40.00           C  
+ATOM   6067  N   SER D  83     -29.609 -25.980   6.612  1.00 40.00           N  
+ATOM   6068  CA  SER D  83     -28.335 -25.577   6.021  1.00 40.00           C  
+ATOM   6069  C   SER D  83     -27.401 -26.779   5.856  1.00 40.00           C  
+ATOM   6070  O   SER D  83     -27.669 -27.881   6.357  1.00 40.00           O  
+ATOM   6071  CB  SER D  83     -27.651 -24.493   6.870  1.00 40.00           C  
+ATOM   6072  OG  SER D  83     -26.960 -25.049   7.981  1.00 40.00           O  
+ATOM   6073  N   ASP D  84     -26.310 -26.548   5.130  1.00 40.00           N  
+ATOM   6074  CA  ASP D  84     -25.166 -27.452   5.123  1.00 40.00           C  
+ATOM   6075  C   ASP D  84     -24.722 -27.634   6.571  1.00 40.00           C  
+ATOM   6076  O   ASP D  84     -24.533 -26.647   7.311  1.00 40.00           O  
+ATOM   6077  CB  ASP D  84     -24.010 -26.871   4.285  1.00 40.00           C  
+ATOM   6078  CG  ASP D  84     -24.183 -27.094   2.775  1.00 40.00           C  
+ATOM   6079  OD1 ASP D  84     -23.145 -27.097   2.067  1.00 40.00           O  
+ATOM   6080  OD2 ASP D  84     -25.334 -27.267   2.293  1.00 40.00           O  
+ATOM   6081  N   VAL D  85     -24.568 -28.887   6.985  1.00 40.00           N  
+ATOM   6082  CA  VAL D  85     -24.343 -29.167   8.403  1.00 40.00           C  
+ATOM   6083  C   VAL D  85     -23.353 -30.320   8.639  1.00 40.00           C  
+ATOM   6084  O   VAL D  85     -23.401 -31.343   7.954  1.00 40.00           O  
+ATOM   6085  CB  VAL D  85     -25.705 -29.308   9.161  1.00 40.00           C  
+ATOM   6086  CG1 VAL D  85     -26.622 -30.317   8.476  1.00 40.00           C  
+ATOM   6087  CG2 VAL D  85     -25.523 -29.612  10.647  1.00 40.00           C  
+ATOM   6088  N   VAL D  86     -22.435 -30.115   9.586  1.00 40.00           N  
+ATOM   6089  CA  VAL D  86     -21.465 -31.137  10.013  1.00 40.00           C  
+ATOM   6090  C   VAL D  86     -21.920 -31.704  11.365  1.00 40.00           C  
+ATOM   6091  O   VAL D  86     -22.281 -30.930  12.265  1.00 40.00           O  
+ATOM   6092  CB  VAL D  86     -20.028 -30.556  10.137  1.00 40.00           C  
+ATOM   6093  CG1 VAL D  86     -19.015 -31.653  10.452  1.00 40.00           C  
+ATOM   6094  CG2 VAL D  86     -19.623 -29.815   8.866  1.00 40.00           C  
+ATOM   6095  N   ILE D  87     -21.912 -33.039  11.500  1.00 40.00           N  
+ATOM   6096  CA  ILE D  87     -22.411 -33.727  12.724  1.00 40.00           C  
+ATOM   6097  C   ILE D  87     -21.623 -34.986  13.178  1.00 40.00           C  
+ATOM   6098  O   ILE D  87     -21.318 -35.879  12.378  1.00 40.00           O  
+ATOM   6099  CB  ILE D  87     -23.937 -34.049  12.631  1.00 40.00           C  
+ATOM   6100  CG1 ILE D  87     -24.780 -32.762  12.702  1.00 40.00           C  
+ATOM   6101  CG2 ILE D  87     -24.367 -35.022  13.728  1.00 40.00           C  
+ATOM   6102  CD1 ILE D  87     -26.237 -32.932  12.330  1.00 40.00           C  
+ATOM   6103  N   GLU D  88     -21.312 -35.038  14.475  1.00 40.00           N  
+ATOM   6104  CA  GLU D  88     -20.799 -36.244  15.114  1.00 40.00           C  
+ATOM   6105  C   GLU D  88     -21.977 -37.122  15.507  1.00 40.00           C  
+ATOM   6106  O   GLU D  88     -22.962 -36.628  16.057  1.00 40.00           O  
+ATOM   6107  CB  GLU D  88     -20.024 -35.901  16.387  1.00 40.00           C  
+ATOM   6108  CG  GLU D  88     -18.735 -35.118  16.194  1.00 40.00           C  
+ATOM   6109  CD  GLU D  88     -18.331 -34.355  17.454  1.00 40.00           C  
+ATOM   6110  OE1 GLU D  88     -19.242 -33.868  18.179  1.00 40.00           O  
+ATOM   6111  OE2 GLU D  88     -17.103 -34.232  17.716  1.00 40.00           O  
+ATOM   6112  N   THR D  89     -21.865 -38.422  15.240  1.00 40.00           N  
+ATOM   6113  CA  THR D  89     -22.887 -39.386  15.645  1.00 40.00           C  
+ATOM   6114  C   THR D  89     -22.320 -40.284  16.739  1.00 40.00           C  
+ATOM   6115  O   THR D  89     -21.147 -40.146  17.112  1.00 40.00           O  
+ATOM   6116  CB  THR D  89     -23.369 -40.223  14.445  1.00 40.00           C  
+ATOM   6117  OG1 THR D  89     -22.307 -41.068  13.987  1.00 40.00           O  
+ATOM   6118  CG2 THR D  89     -23.793 -39.311  13.302  1.00 40.00           C  
+ATOM   6119  N   HIS D  90     -23.151 -41.195  17.248  1.00 40.00           N  
+ATOM   6120  CA  HIS D  90     -22.769 -42.158  18.316  1.00 40.00           C  
+ATOM   6121  C   HIS D  90     -22.379 -41.453  19.593  1.00 40.00           C  
+ATOM   6122  O   HIS D  90     -21.413 -41.830  20.270  1.00 40.00           O  
+ATOM   6123  CB  HIS D  90     -21.673 -43.132  17.854  1.00 40.00           C  
+ATOM   6124  CG  HIS D  90     -22.035 -43.941  16.611  1.00 40.00           C  
+ATOM   6125  ND1 HIS D  90     -22.296 -43.369  15.408  1.00 40.00           N  
+ATOM   6126  CD2 HIS D  90     -22.135 -45.323  16.413  1.00 40.00           C  
+ATOM   6127  CE1 HIS D  90     -22.566 -44.331  14.498  1.00 40.00           C  
+ATOM   6128  NE2 HIS D  90     -22.471 -45.525  15.113  1.00 40.00           N  
+ATOM   6129  N   LYS D  91     -23.158 -40.422  19.921  1.00 40.00           N  
+ATOM   6130  CA  LYS D  91     -22.851 -39.507  21.003  1.00 40.00           C  
+ATOM   6131  C   LYS D  91     -23.766 -39.686  22.179  1.00 40.00           C  
+ATOM   6132  O   LYS D  91     -23.773 -38.847  23.072  1.00 40.00           O  
+ATOM   6133  CB  LYS D  91     -22.972 -38.060  20.525  1.00 40.00           C  
+ATOM   6134  CG  LYS D  91     -21.911 -37.618  19.526  1.00 40.00           C  
+ATOM   6135  CD  LYS D  91     -20.540 -37.368  20.153  1.00 40.00           C  
+ATOM   6136  CE  LYS D  91     -19.681 -38.628  20.211  1.00 40.00           C  
+ATOM   6137  NZ  LYS D  91     -18.239 -38.312  20.375  1.00 40.00           N  
+ATOM   6138  N   GLU D  92     -24.546 -40.764  22.183  1.00 40.00           N  
+ATOM   6139  CA  GLU D  92     -25.457 -41.026  23.302  1.00 40.00           C  
+ATOM   6140  C   GLU D  92     -24.704 -41.129  24.625  1.00 40.00           C  
+ATOM   6141  O   GLU D  92     -25.058 -40.437  25.582  1.00 40.00           O  
+ATOM   6142  CB  GLU D  92     -26.325 -42.282  23.098  1.00 40.00           C  
+ATOM   6143  CG  GLU D  92     -27.296 -42.532  24.263  1.00 40.00           C  
+ATOM   6144  CD  GLU D  92     -28.113 -43.813  24.151  1.00 40.00           C  
+ATOM   6145  OE1 GLU D  92     -27.791 -44.678  23.316  1.00 40.00           O  
+ATOM   6146  OE2 GLU D  92     -29.088 -43.962  24.913  1.00 40.00           O  
+ATOM   6147  N   GLU D  93     -23.675 -41.981  24.678  1.00 40.00           N  
+ATOM   6148  CA  GLU D  93     -22.884 -42.156  25.900  1.00 40.00           C  
+ATOM   6149  C   GLU D  93     -22.327 -40.841  26.453  1.00 40.00           C  
+ATOM   6150  O   GLU D  93     -22.286 -40.663  27.678  1.00 40.00           O  
+ATOM   6151  CB  GLU D  93     -21.744 -43.137  25.680  1.00 40.00           C  
+ATOM   6152  CG  GLU D  93     -20.791 -43.176  26.861  1.00 40.00           C  
+ATOM   6153  CD  GLU D  93     -19.779 -44.291  26.761  1.00 40.00           C  
+ATOM   6154  OE1 GLU D  93     -18.896 -44.231  25.877  1.00 40.00           O  
+ATOM   6155  OE2 GLU D  93     -19.864 -45.229  27.579  1.00 40.00           O  
+ATOM   6156  N   GLU D  94     -21.895 -39.945  25.552  1.00 40.00           N  
+ATOM   6157  CA  GLU D  94     -21.473 -38.586  25.921  1.00 40.00           C  
+ATOM   6158  C   GLU D  94     -22.605 -37.756  26.554  1.00 40.00           C  
+ATOM   6159  O   GLU D  94     -22.384 -37.029  27.520  1.00 40.00           O  
+ATOM   6160  CB  GLU D  94     -20.859 -37.836  24.732  1.00 40.00           C  
+ATOM   6161  CG  GLU D  94     -20.342 -36.446  25.119  1.00 40.00           C  
+ATOM   6162  CD  GLU D  94     -19.657 -35.669  23.990  1.00 40.00           C  
+ATOM   6163  OE1 GLU D  94     -18.988 -36.296  23.129  1.00 40.00           O  
+ATOM   6164  OE2 GLU D  94     -19.768 -34.413  23.983  1.00 40.00           O  
+ATOM   6165  N   LEU D  95     -23.809 -37.863  26.007  1.00 40.00           N  
+ATOM   6166  CA  LEU D  95     -24.982 -37.267  26.632  1.00 40.00           C  
+ATOM   6167  C   LEU D  95     -25.286 -37.974  27.963  1.00 40.00           C  
+ATOM   6168  O   LEU D  95     -25.458 -37.327  28.996  1.00 40.00           O  
+ATOM   6169  CB  LEU D  95     -26.168 -37.352  25.675  1.00 40.00           C  
+ATOM   6170  CG  LEU D  95     -27.462 -36.667  26.097  1.00 40.00           C  
+ATOM   6171  CD1 LEU D  95     -27.250 -35.173  26.345  1.00 40.00           C  
+ATOM   6172  CD2 LEU D  95     -28.515 -36.912  25.029  1.00 40.00           C  
+ATOM   6173  N   THR D  96     -25.356 -39.303  27.904  1.00 40.00           N  
+ATOM   6174  CA  THR D  96     -25.330 -40.186  29.068  1.00 40.00           C  
+ATOM   6175  C   THR D  96     -24.003 -40.044  29.811  1.00 40.00           C  
+ATOM   6176  O   THR D  96     -23.949 -40.140  31.036  1.00 40.00           O  
+ATOM   6177  CB  THR D  96     -25.549 -41.653  28.624  1.00 40.00           C  
+ATOM   6178  OG1 THR D  96     -26.934 -41.981  28.772  1.00 40.00           O  
+ATOM   6179  CG2 THR D  96     -24.705 -42.650  29.425  1.00 40.00           C  
+TER    6180      THR D  96                                                      
+HETATM 6181  PA  FAD A 401     -23.428  17.103  27.091  1.00 40.00           P  
+HETATM 6182  O1A FAD A 401     -24.306  18.270  26.716  1.00 40.00           O  
+HETATM 6183  O2A FAD A 401     -23.559  15.832  26.282  1.00 40.00           O  
+HETATM 6184  O5B FAD A 401     -21.890  17.553  27.179  1.00 40.00           O  
+HETATM 6185  C5B FAD A 401     -20.853  16.590  27.038  1.00 40.00           C  
+HETATM 6186  C4B FAD A 401     -19.842  17.121  26.035  1.00 40.00           C  
+HETATM 6187  O4B FAD A 401     -18.794  17.804  26.729  1.00 40.00           O  
+HETATM 6188  C3B FAD A 401     -19.217  15.972  25.272  1.00 40.00           C  
+HETATM 6189  O3B FAD A 401     -19.255  16.278  23.875  1.00 40.00           O  
+HETATM 6190  C2B FAD A 401     -17.792  15.873  25.793  1.00 40.00           C  
+HETATM 6191  O2B FAD A 401     -16.826  15.915  24.736  1.00 40.00           O  
+HETATM 6192  C1B FAD A 401     -17.592  17.045  26.742  1.00 40.00           C  
+HETATM 6193  N9A FAD A 401     -17.401  16.497  28.097  1.00 40.00           N  
+HETATM 6194  C8A FAD A 401     -18.201  15.571  28.651  1.00 40.00           C  
+HETATM 6195  N7A FAD A 401     -17.783  15.244  29.896  1.00 40.00           N  
+HETATM 6196  C5A FAD A 401     -16.679  15.970  30.175  1.00 40.00           C  
+HETATM 6197  C6A FAD A 401     -15.733  16.101  31.336  1.00 40.00           C  
+HETATM 6198  N6A FAD A 401     -15.890  15.366  32.480  1.00 40.00           N  
+HETATM 6199  N1A FAD A 401     -14.702  16.986  31.205  1.00 40.00           N  
+HETATM 6200  C2A FAD A 401     -14.533  17.709  30.076  1.00 40.00           C  
+HETATM 6201  N3A FAD A 401     -15.352  17.635  28.998  1.00 40.00           N  
+HETATM 6202  C4A FAD A 401     -16.431  16.801  28.973  1.00 40.00           C  
+HETATM 6203  N1  FAD A 401     -25.090   9.523  32.642  1.00 40.00           N  
+HETATM 6204  C2  FAD A 401     -25.557   9.541  33.915  1.00 40.00           C  
+HETATM 6205  O2  FAD A 401     -25.483  10.627  34.537  1.00 40.00           O  
+HETATM 6206  N3  FAD A 401     -26.098   8.445  34.510  1.00 40.00           N  
+HETATM 6207  C4  FAD A 401     -26.237   7.253  33.884  1.00 40.00           C  
+HETATM 6208  O4  FAD A 401     -26.778   6.234  34.424  1.00 40.00           O  
+HETATM 6209  C4X FAD A 401     -25.739   7.161  32.489  1.00 40.00           C  
+HETATM 6210  N5  FAD A 401     -25.863   6.001  31.802  1.00 40.00           N  
+HETATM 6211  C5X FAD A 401     -25.398   5.956  30.524  1.00 40.00           C  
+HETATM 6212  C6  FAD A 401     -25.490   4.755  29.818  1.00 40.00           C  
+HETATM 6213  C7  FAD A 401     -25.017   4.678  28.501  1.00 40.00           C  
+HETATM 6214  C7M FAD A 401     -25.148   3.362  27.765  1.00 40.00           C  
+HETATM 6215  C8  FAD A 401     -24.383   5.906  27.849  1.00 40.00           C  
+HETATM 6216  C8M FAD A 401     -23.851   5.897  26.433  1.00 40.00           C  
+HETATM 6217  C9  FAD A 401     -24.283   7.099  28.560  1.00 40.00           C  
+HETATM 6218  C9A FAD A 401     -24.746   7.161  29.867  1.00 40.00           C  
+HETATM 6219  N10 FAD A 401     -24.654   8.366  30.570  1.00 40.00           N  
+HETATM 6220  C10 FAD A 401     -25.146   8.399  31.889  1.00 40.00           C  
+HETATM 6221  C1' FAD A 401     -24.095   9.555  29.919  1.00 40.00           C  
+HETATM 6222  C2' FAD A 401     -25.245  10.459  29.459  1.00 40.00           C  
+HETATM 6223  O2' FAD A 401     -25.841   9.937  28.246  1.00 40.00           O  
+HETATM 6224  C3' FAD A 401     -24.785  11.898  29.225  1.00 40.00           C  
+HETATM 6225  O3' FAD A 401     -23.775  11.857  28.206  1.00 40.00           O  
+HETATM 6226  C4' FAD A 401     -24.249  12.610  30.477  1.00 40.00           C  
+HETATM 6227  O4' FAD A 401     -25.197  12.552  31.543  1.00 40.00           O  
+HETATM 6228  C5' FAD A 401     -23.945  14.082  30.202  1.00 40.00           C  
+HETATM 6229  O5' FAD A 401     -24.838  14.583  29.203  1.00 40.00           O  
+HETATM 6230  P   FAD A 401     -25.140  16.152  28.992  1.00 40.00           P  
+HETATM 6231  O1P FAD A 401     -26.059  16.273  27.791  1.00 40.00           O  
+HETATM 6232  O2P FAD A 401     -25.528  16.748  30.312  1.00 40.00           O  
+HETATM 6233  O3P FAD A 401     -23.701  16.741  28.620  1.00 40.00           O  
+HETATM 6234 FE1  FES B 101     -51.609   1.622  98.269  1.00 40.00          FE  
+HETATM 6235 FE2  FES B 101     -52.880   2.980 100.726  1.00 40.00          FE  
+HETATM 6236  S1  FES B 101     -53.432   2.833  98.586  1.00 40.00           S  
+HETATM 6237  S2  FES B 101     -51.017   1.806 100.389  1.00 40.00           S  
+HETATM 6238  PA  FAD C 401     -71.512  15.192  45.303  1.00 40.00           P  
+HETATM 6239  O1A FAD C 401     -71.196  16.095  44.126  1.00 40.00           O  
+HETATM 6240  O2A FAD C 401     -71.257  15.763  46.676  1.00 40.00           O  
+HETATM 6241  O5B FAD C 401     -73.004  14.581  45.212  1.00 40.00           O  
+HETATM 6242  C5B FAD C 401     -73.681  14.131  46.378  1.00 40.00           C  
+HETATM 6243  C4B FAD C 401     -75.069  14.753  46.405  1.00 40.00           C  
+HETATM 6244  O4B FAD C 401     -76.017  13.854  45.806  1.00 40.00           O  
+HETATM 6245  C3B FAD C 401     -75.475  15.014  47.848  1.00 40.00           C  
+HETATM 6246  O3B FAD C 401     -75.908  16.371  48.034  1.00 40.00           O  
+HETATM 6247  C2B FAD C 401     -76.572  13.998  48.130  1.00 40.00           C  
+HETATM 6248  O2B FAD C 401     -77.747  14.621  48.666  1.00 40.00           O  
+HETATM 6249  C1B FAD C 401     -76.849  13.269  46.810  1.00 40.00           C  
+HETATM 6250  N9A FAD C 401     -76.460  11.848  46.996  1.00 40.00           N  
+HETATM 6251  C8A FAD C 401     -75.293  11.445  47.534  1.00 40.00           C  
+HETATM 6252  N7A FAD C 401     -75.211  10.092  47.590  1.00 40.00           N  
+HETATM 6253  C5A FAD C 401     -76.353   9.571  47.087  1.00 40.00           C  
+HETATM 6254  C6A FAD C 401     -76.920   8.189  46.862  1.00 40.00           C  
+HETATM 6255  N6A FAD C 401     -76.254   7.052  47.184  1.00 40.00           N  
+HETATM 6256  N1A FAD C 401     -78.147   8.081  46.312  1.00 40.00           N  
+HETATM 6257  C2A FAD C 401     -78.810   9.203  45.978  1.00 40.00           C  
+HETATM 6258  N3A FAD C 401     -78.385  10.482  46.155  1.00 40.00           N  
+HETATM 6259  C4A FAD C 401     -77.171  10.745  46.698  1.00 40.00           C  
+HETATM 6260  N1  FAD C 401     -65.661   9.492  50.049  1.00 40.00           N  
+HETATM 6261  C2  FAD C 401     -64.871   8.517  49.530  1.00 40.00           C  
+HETATM 6262  O2  FAD C 401     -65.158   8.098  48.382  1.00 40.00           O  
+HETATM 6263  N3  FAD C 401     -63.801   8.024  50.206  1.00 40.00           N  
+HETATM 6264  C4  FAD C 401     -63.462   8.454  51.440  1.00 40.00           C  
+HETATM 6265  O4  FAD C 401     -62.478   7.989  52.060  1.00 40.00           O  
+HETATM 6266  C4X FAD C 401     -64.274   9.523  52.063  1.00 40.00           C  
+HETATM 6267  N5  FAD C 401     -63.998  10.018  53.286  1.00 40.00           N  
+HETATM 6268  C5X FAD C 401     -64.775  10.985  53.813  1.00 40.00           C  
+HETATM 6269  C6  FAD C 401     -64.501  11.476  55.068  1.00 40.00           C  
+HETATM 6270  C7  FAD C 401     -65.298  12.469  55.614  1.00 40.00           C  
+HETATM 6271  C7M FAD C 401     -64.967  12.998  56.986  1.00 40.00           C  
+HETATM 6272  C8  FAD C 401     -66.454  13.004  54.860  1.00 40.00           C  
+HETATM 6273  C8M FAD C 401     -67.330  14.079  55.439  1.00 40.00           C  
+HETATM 6274  C9  FAD C 401     -66.736  12.505  53.615  1.00 40.00           C  
+HETATM 6275  C9A FAD C 401     -65.945  11.515  53.081  1.00 40.00           C  
+HETATM 6276  N10 FAD C 401     -66.230  11.025  51.811  1.00 40.00           N  
+HETATM 6277  C10 FAD C 401     -65.420  10.022  51.268  1.00 40.00           C  
+HETATM 6278  C1' FAD C 401     -67.368  11.555  51.076  1.00 40.00           C  
+HETATM 6279  C2' FAD C 401     -66.800  12.560  50.081  1.00 40.00           C  
+HETATM 6280  O2' FAD C 401     -66.365  13.763  50.738  1.00 40.00           O  
+HETATM 6281  C3' FAD C 401     -67.851  12.841  49.021  1.00 40.00           C  
+HETATM 6282  O3' FAD C 401     -69.000  13.394  49.680  1.00 40.00           O  
+HETATM 6283  C4' FAD C 401     -68.281  11.567  48.257  1.00 40.00           C  
+HETATM 6284  O4' FAD C 401     -67.170  10.752  47.833  1.00 40.00           O  
+HETATM 6285  C5' FAD C 401     -69.122  11.942  47.040  1.00 40.00           C  
+HETATM 6286  O5' FAD C 401     -68.816  13.304  46.693  1.00 40.00           O  
+HETATM 6287  P   FAD C 401     -69.069  13.912  45.222  1.00 40.00           P  
+HETATM 6288  O1P FAD C 401     -68.616  15.371  45.244  1.00 40.00           O  
+HETATM 6289  O2P FAD C 401     -68.531  12.935  44.203  1.00 40.00           O  
+HETATM 6290  O3P FAD C 401     -70.673  13.835  45.140  1.00 40.00           O  
+HETATM 6291 FE1  FES D 101     -33.932 -40.658  17.785  1.00 40.00          FE  
+HETATM 6292 FE2  FES D 101     -35.294 -42.145  20.075  1.00 40.00          FE  
+HETATM 6293  S1  FES D 101     -35.422 -40.052  19.343  1.00 40.00           S  
+HETATM 6294  S2  FES D 101     -33.906 -42.776  18.453  1.00 40.00           S  
+CONECT   15 5971                                                                
+CONECT 2667 6235                                                                
+CONECT 2881 3105                                                                
+CONECT 2935 6234                                                                
+CONECT 3105 2881                                                                
+CONECT 5757 6292                                                                
+CONECT 5789 6292                                                                
+CONECT 5807 6291                                                                
+CONECT 5971   15                                                                
+CONECT 6025 6291                                                                
+CONECT 6181 6182 6183 6184 6233                                                 
+CONECT 6182 6181                                                                
+CONECT 6183 6181                                                                
+CONECT 6184 6181 6185                                                           
+CONECT 6185 6184 6186                                                           
+CONECT 6186 6185 6187 6188                                                      
+CONECT 6187 6186 6192                                                           
+CONECT 6188 6186 6189 6190                                                      
+CONECT 6189 6188                                                                
+CONECT 6190 6188 6191 6192                                                      
+CONECT 6191 6190                                                                
+CONECT 6192 6187 6190 6193                                                      
+CONECT 6193 6192 6194 6202                                                      
+CONECT 6194 6193 6195                                                           
+CONECT 6195 6194 6196                                                           
+CONECT 6196 6195 6197 6202                                                      
+CONECT 6197 6196 6198 6199                                                      
+CONECT 6198 6197                                                                
+CONECT 6199 6197 6200                                                           
+CONECT 6200 6199 6201                                                           
+CONECT 6201 6200 6202                                                           
+CONECT 6202 6193 6196 6201                                                      
+CONECT 6203 6204 6220                                                           
+CONECT 6204 6203 6205 6206                                                      
+CONECT 6205 6204                                                                
+CONECT 6206 6204 6207                                                           
+CONECT 6207 6206 6208 6209                                                      
+CONECT 6208 6207                                                                
+CONECT 6209 6207 6210 6220                                                      
+CONECT 6210 6209 6211                                                           
+CONECT 6211 6210 6212 6218                                                      
+CONECT 6212 6211 6213                                                           
+CONECT 6213 6212 6214 6215                                                      
+CONECT 6214 6213                                                                
+CONECT 6215 6213 6216 6217                                                      
+CONECT 6216 6215                                                                
+CONECT 6217 6215 6218                                                           
+CONECT 6218 6211 6217 6219                                                      
+CONECT 6219 6218 6220 6221                                                      
+CONECT 6220 6203 6209 6219                                                      
+CONECT 6221 6219 6222                                                           
+CONECT 6222 6221 6223 6224                                                      
+CONECT 6223 6222                                                                
+CONECT 6224 6222 6225 6226                                                      
+CONECT 6225 6224                                                                
+CONECT 6226 6224 6227 6228                                                      
+CONECT 6227 6226                                                                
+CONECT 6228 6226 6229                                                           
+CONECT 6229 6228 6230                                                           
+CONECT 6230 6229 6231 6232 6233                                                 
+CONECT 6231 6230                                                                
+CONECT 6232 6230                                                                
+CONECT 6233 6181 6230                                                           
+CONECT 6234 2935 6236 6237                                                      
+CONECT 6235 2667 6236 6237                                                      
+CONECT 6236 6234 6235                                                           
+CONECT 6237 6234 6235                                                           
+CONECT 6238 6239 6240 6241 6290                                                 
+CONECT 6239 6238                                                                
+CONECT 6240 6238                                                                
+CONECT 6241 6238 6242                                                           
+CONECT 6242 6241 6243                                                           
+CONECT 6243 6242 6244 6245                                                      
+CONECT 6244 6243 6249                                                           
+CONECT 6245 6243 6246 6247                                                      
+CONECT 6246 6245                                                                
+CONECT 6247 6245 6248 6249                                                      
+CONECT 6248 6247                                                                
+CONECT 6249 6244 6247 6250                                                      
+CONECT 6250 6249 6251 6259                                                      
+CONECT 6251 6250 6252                                                           
+CONECT 6252 6251 6253                                                           
+CONECT 6253 6252 6254 6259                                                      
+CONECT 6254 6253 6255 6256                                                      
+CONECT 6255 6254                                                                
+CONECT 6256 6254 6257                                                           
+CONECT 6257 6256 6258                                                           
+CONECT 6258 6257 6259                                                           
+CONECT 6259 6250 6253 6258                                                      
+CONECT 6260 6261 6277                                                           
+CONECT 6261 6260 6262 6263                                                      
+CONECT 6262 6261                                                                
+CONECT 6263 6261 6264                                                           
+CONECT 6264 6263 6265 6266                                                      
+CONECT 6265 6264                                                                
+CONECT 6266 6264 6267 6277                                                      
+CONECT 6267 6266 6268                                                           
+CONECT 6268 6267 6269 6275                                                      
+CONECT 6269 6268 6270                                                           
+CONECT 6270 6269 6271 6272                                                      
+CONECT 6271 6270                                                                
+CONECT 6272 6270 6273 6274                                                      
+CONECT 6273 6272                                                                
+CONECT 6274 6272 6275                                                           
+CONECT 6275 6268 6274 6276                                                      
+CONECT 6276 6275 6277 6278                                                      
+CONECT 6277 6260 6266 6276                                                      
+CONECT 6278 6276 6279                                                           
+CONECT 6279 6278 6280 6281                                                      
+CONECT 6280 6279                                                                
+CONECT 6281 6279 6282 6283                                                      
+CONECT 6282 6281                                                                
+CONECT 6283 6281 6284 6285                                                      
+CONECT 6284 6283                                                                
+CONECT 6285 6283 6286                                                           
+CONECT 6286 6285 6287                                                           
+CONECT 6287 6286 6288 6289 6290                                                 
+CONECT 6288 6287                                                                
+CONECT 6289 6287                                                                
+CONECT 6290 6238 6287                                                           
+CONECT 6291 5807 6025 6293 6294                                                 
+CONECT 6292 5757 5789 6293 6294                                                 
+CONECT 6293 6291 6292                                                           
+CONECT 6294 6291 6292                                                           
+MASTER      433    0    4   22   46    0   15   12 6290    4  124   66          
+END                                                                             
diff --git a/utils/jalviewjs/site-resources/examples/backupfilestest.fa b/utils/jalviewjs/site-resources/examples/backupfilestest.fa
new file mode 100644 (file)
index 0000000..c536a79
--- /dev/null
@@ -0,0 +1,2 @@
+>BACKUP_FILES/1-6 backupfiles
+AAAARG
diff --git a/utils/jalviewjs/site-resources/examples/biojsonschema.json b/utils/jalviewjs/site-resources/examples/biojsonschema.json
new file mode 100644 (file)
index 0000000..e6670d2
--- /dev/null
@@ -0,0 +1 @@
+{"$schema":"http://json-schema.org/draft-04/schema#","id":"http://jsonschema.net","type":"object","properties":{"seqs":{"id":"http://jsonschema.net/seqs","type":"array","items":{"id":"http://jsonschema.net/seqs/0","type":"object","properties":{"name":{"id":"http://jsonschema.net/seqs/0/name","type":"string","description":"Sequence name"},"start":{"id":"http://jsonschema.net/seqs/0/start","type":"integer","description":"Start residue position"},"svid":{"id":"http://jsonschema.net/seqs/0/svid","type":"string","description":"Serial version id for sequence object"},"end":{"id":"http://jsonschema.net/seqs/0/end","type":"integer","description":"End residue position"},"id":{"id":"http://jsonschema.net/seqs/0/id","type":"string","description":"Sequence unique identifier"},"seq":{"id":"http://jsonschema.net/seqs/0/seq","type":"string","description":"Sequence Residues"},"order":{"id":"http://jsonschema.net/seqs/0/order","type":"integer","description":"Sequence order in an alignment space"}},"required":["name","start","svid","end","id","seq"]},"required":["0"],"description":"Sequences in the Alignemnt","minItems":"1","maxItems":"*"},"appSettings":{"id":"http://jsonschema.net/appSettings","type":"object","properties":{"globalColorScheme":{"id":"http://jsonschema.net/appSettings/globalColorScheme","type":"string","description":"Global colour schem for the alignment"},"webStartUrl":{"id":"http://jsonschema.net/appSettings/webStartUrl","type":"string","description":"Jalview specific setting which points to a url for launching Jalview"},"application":{"id":"http://jsonschema.net/appSettings/application","type":"string","description":"Application which generated the Json"},"showSeqFeatures":{"id":"http://jsonschema.net/appSettings/showSeqFeatures","type":"string","description":"Determines if sequence features are visible or not"},"version":{"id":"http://jsonschema.net/appSettings/version","type":"string","description":"Verion of the application which generated the JSON"},"hiddenCols":{"id":"http://jsonschema.net/appSettings/hiddenCols","type":"string","description":"Delimited lists of hidden colums ranges i.e [2-3,5-5,11-23]"}},"description":"Application specific settings"},"seqGroups":{"id":"http://jsonschema.net/seqGroups","type":"array","items":[{"id":"http://jsonschema.net/seqGroups/0","type":"object","properties":{"displayText":{"id":"http://jsonschema.net/seqGroups/0/displayText","type":"boolean","description":"Determines if the texts of the group is displayed or not"},"startRes":{"id":"http://jsonschema.net/seqGroups/0/startRes","type":"integer","description":"Start residue position for a given group"},"groupName":{"id":"http://jsonschema.net/seqGroups/0/groupName","type":"string","description":"Group name"},"endRes":{"id":"http://jsonschema.net/seqGroups/0/endRes","type":"integer","description":"End residue position for a given group"},"colourText":{"id":"http://jsonschema.net/seqGroups/0/colourText","type":"boolean","description":"Determines if the Residues text for the group is coloured"},"seqsHash":{"id":"http://jsonschema.net/seqGroups/0/seqsHash","type":"array","items":[],"minItems":"0","maxItems":"*","description":"The id's of the sequences which belongs to the group"},"svid":{"id":"http://jsonschema.net/seqGroups/0/svid","type":"string","description":"Serial version id for a given group"},"showNonconserved":{"id":"http://jsonschema.net/seqGroups/0/showNonconserved","type":"boolean","description":"Determines if non conserved regions of a group is shown or not"},"colourScheme":{"id":"http://jsonschema.net/seqGroups/0/colourScheme","type":"string","description":"Colour Scheme for the sequence group"},"displayBoxes":{"id":"http://jsonschema.net/seqGroups/0/displayBoxes","type":"boolean","description":"Determines if the group border should be visible or not"}}}],"description":"Sequence groups in the Alignment","minItems":"0","maxItems":"*"},"alignAnnotation":{"id":"http://jsonschema.net/alignAnnotation","type":"array","items":{"id":"http://jsonschema.net/alignAnnotation/0","type":"object","properties":{"svid":{"id":"http://jsonschema.net/alignAnnotation/0/svid","type":"string","description":"Serial version id for the annotation object"},"annotations":{"id":"http://jsonschema.net/alignAnnotation/0/annotations","type":"array","items":[{"id":"http://jsonschema.net/alignAnnotation/0/annotations/0","type":"object","properties":{"displayCharacter":{"id":"http://jsonschema.net/alignAnnotation/0/annotations/0/displayCharacter","type":"string","description":"Display character to denote the given annotation"},"value":{"id":"http://jsonschema.net/alignAnnotation/0/annotations/0/value","type":"integer","description":"Value of the annotation"},"secondaryStructure":{"id":"http://jsonschema.net/alignAnnotation/0/annotations/0/secondaryStructure","type":"string","description":"Secondary structure symbol for the given annotation"}}},{"id":"http://jsonschema.net/alignAnnotation/0/annotations/1","type":"object","properties":{"displayCharacter":{"id":"http://jsonschema.net/alignAnnotation/0/annotations/1/displayCharacter","type":"string"},"value":{"id":"http://jsonschema.net/alignAnnotation/0/annotations/1/value","type":"integer"},"secondaryStructure":{"id":"http://jsonschema.net/alignAnnotation/0/annotations/1/secondaryStructure","type":"string"}}},{"id":"http://jsonschema.net/alignAnnotation/0/annotations/2","type":"object","properties":{"displayCharacter":{"id":"http://jsonschema.net/alignAnnotation/0/annotations/2/displayCharacter","type":"string"},"value":{"id":"http://jsonschema.net/alignAnnotation/0/annotations/2/value","type":"integer"},"secondaryStructure":{"id":"http://jsonschema.net/alignAnnotation/0/annotations/2/secondaryStructure","type":"string"}}}]},"description":{"id":"http://jsonschema.net/alignAnnotation/0/description","type":"string","description":"Description of the Alignment Annotation"},"label":{"id":"http://jsonschema.net/alignAnnotation/0/label","type":"string","description":"Label for the Annotation"}}},"description":"Alignment Annotations","minItems":"0","maxItems":"*"},"svid":{"id":"http://jsonschema.net/svid","type":"string","description":"Serial version id"},"seqFeatures":{"id":"http://jsonschema.net/seqFeatures","type":"array","items":{"id":"http://jsonschema.net/seqFeatures/0","type":"object","properties":{"fillColor":{"id":"http://jsonschema.net/seqFeatures/0/fillColor","type":"string","description":"Fill colour"},"score":{"id":"http://jsonschema.net/seqFeatures/0/score","type":"integer","description":"Score"},"sequenceRef":{"id":"http://jsonschema.net/seqFeatures/0/sequenceRef","type":"string","description":"Reference to the Sequence in the alignement (More like a foreign key)"},"featureGroup":{"id":"http://jsonschema.net/seqFeatures/0/featureGroup","type":"string","description":"Feature Group"},"svid":{"id":"http://jsonschema.net/seqFeatures/0/svid","type":"string","description":"Serial version id for the SeqFeature object"},"description":{"id":"http://jsonschema.net/seqFeatures/0/description","type":"string","description":"Description of Feature"},"xStart":{"id":"http://jsonschema.net/seqFeatures/0/xStart","type":"integer","description":"Start residue position for the sequence feature"},"xEnd":{"id":"http://jsonschema.net/seqFeatures/0/xEnd","type":"integer","description":"End residue position for the sequence feature"},"type":{"id":"http://jsonschema.net/seqFeatures/0/type","type":"string","description":"The name of the SequenceFeature"}}},"minItems":"0","maxItems":"*","description":"Sequence Features within the alignment"}},"required":["seqs","appSettings","seqGroups","alignAnnotation","svid","seqFeatures"]}
\ No newline at end of file
diff --git a/utils/jalviewjs/site-resources/examples/dna_interleaved.phy b/utils/jalviewjs/site-resources/examples/dna_interleaved.phy
new file mode 100644 (file)
index 0000000..745f399
--- /dev/null
@@ -0,0 +1,132 @@
+10 705
+Cow       ATGGCATATCCCATACAACTAGGATTCCAAGATGCAACATCACCAATCATAGAAGAACTA
+Carp      ATGGCACACCCAACGCAACTAGGTTTCAAGGACGCGGCCATACCCGTTATAGAGGAACTT
+Chicken   ATGGCCAACCACTCCCAACTAGGCTTTCAAGACGCCTCATCCCCCATCATAGAAGAGCTC
+Human     ATGGCACATGCAGCGCAAGTAGGTCTACAAGACGCTACTTCCCCTATCATAGAAGAGCTT
+Loach     ATGGCACATCCCACACAATTAGGATTCCAAGACGCGGCCTCACCCGTAATAGAAGAACTT
+Mouse     ATGGCCTACCCATTCCAACTTGGTCTACAAGACGCCACATCCCCTATTATAGAAGAGCTA
+Rat       ATGGCTTACCCATTTCAACTTGGCTTACAAGACGCTACATCACCTATCATAGAAGAACTT
+Seal      ATGGCATACCCCCTACAAATAGGCCTACAAGATGCAACCTCTCCCATTATAGAGGAGTTA
+Whale     ATGGCATATCCATTCCAACTAGGTTTCCAAGATGCAGCATCACCCATCATAGAAGAGCTC
+Frog      ATGGCACACCCATCACAATTAGGTTTTCAAGACGCAGCCTCTCCAATTATAGAAGAATTA
+
+CTTCACTTTCATGACCACACGCTAATAATTGTCTTCTTAATTAGCTCATTAGTACTTTAC
+CTTCACTTCCACGACCACGCATTAATAATTGTGCTCCTAATTAGCACTTTAGTTTTATAT
+GTTGAATTCCACGACCACGCCCTGATAGTCGCACTAGCAATTTGCAGCTTAGTACTCTAC
+ATCACCTTTCATGATCACGCCCTCATAATCATTTTCCTTATCTGCTTCCTAGTCCTGTAT
+CTTCACTTCCATGACCATGCCCTAATAATTGTATTTTTGATTAGCGCCCTAGTACTTTAT
+ATAAATTTCCATGATCACACACTAATAATTGTTTTCCTAATTAGCTCCTTAGTCCTCTAT
+ACAAACTTTCATGACCACACCCTAATAATTGTATTCCTCATCAGCTCCCTAGTACTTTAT
+CTACACTTCCATGACCACACATTAATAATTGTGTTCCTAATTAGCTCATTAGTACTCTAC
+CTACACTTTCACGATCATACACTAATAATCGTTTTTCTAATTAGCTCTTTAGTTCTCTAC
+CTTCACTTCCACGACCATACCCTCATAGCCGTTTTTCTTATTAGTACGCTAGTTCTTTAC
+
+ATTATTTCACTAATACTAACGACAAAGCTGACCCATACAAGCACGATAGATGCACAAGAA
+ATTATTACTGCAATGGTATCAACTAAACTTACTAATAAATATATTCTAGACTCCCAAGAA
+CTTCTAACTCTTATACTTATAGAAAAACTATCA---TCAAACACCGTAGATGCCCAAGAA
+GCCCTTTTCCTAACACTCACAACAAAACTAACTAATACTAACATCTCAGACGCTCAGGAA
+GTTATTATTACAACCGTCTCAACAAAACTCACTAACATATATATTTTGGACTCACAAGAA
+ATCATCTCGCTAATATTAACAACAAAACTAACACATACAAGCACAATAGATGCACAAGAA
+ATTATTTCACTAATACTAACAACAAAACTAACACACACAAGCACAATAGACGCCCAAGAA
+ATTATCTCACTTATACTAACCACGAAACTCACCCACACAAGTACAATAGACGCACAAGAA
+ATTATTACCCTAATGCTTACAACCAAATTAACACATACTAGTACAATAGACGCCCAAGAA
+ATTATTACTATTATAATAACTACTAAACTAACTAATACAAACCTAATGGACGCACAAGAG
+
+GTAGAGACAATCTGAACCATTCTGCCCGCCATCATCTTAATTCTAATTGCTCTTCCTTCT
+ATCGAAATCGTATGAACCATTCTACCAGCCGTCATTTTAGTACTAATCGCCCTGCCCTCC
+GTTGAACTAATCTGAACCATCCTACCCGCTATTGTCCTAGTCCTGCTTGCCCTCCCCTCC
+ATAGAAACCGTCTGAACTATCCTGCCCGCCATCATCCTAGTCCTCATCGCCCTCCCATCC
+ATTGAAATCGTATGAACTGTGCTCCCTGCCCTAATCCTCATTTTAATCGCCCTCCCCTCA
+GTTGAAACCATTTGAACTATTCTACCAGCTGTAATCCTTATCATAATTGCTCTCCCCTCT
+GTAGAAACAATTTGAACAATTCTCCCAGCTGTCATTCTTATTCTAATTGCCCTTCCCTCC
+GTGGAAACGGTGTGAACGATCCTACCCGCTATCATTTTAATTCTCATTGCCCTACCATCA
+GTAGAAACTGTCTGAACTATCCTCCCAGCCATTATCTTAATTTTAATTGCCTTGCCTTCA
+ATCGAAATAGTGTGAACTATTATACCAGCTATTAGCCTCATCATAATTGCCCTTCCATCC
+
+TTACGAATTCTATACATAATAGATGAAATCAATAACCCATCTCTTACAGTAAAAACCATA
+CTACGCATCCTGTACCTTATAGACGAAATTAACGACCCTCACCTGACAATTAAAGCAATA
+CTCCAAATCCTCTACATAATAGACGAAATCGACGAACCTGATCTCACCCTAAAAGCCATC
+CTACGCATCCTTTACATAACAGACGAGGTCAACGATCCCTCCCTTACCATCAAATCAATT
+CTACGAATTCTATATCTTATAGACGAGATTAATGACCCCCACCTAACAATTAAGGCCATG
+CTACGCATTCTATATATAATAGACGAAATCAACAACCCCGTATTAACCGTTAAAACCATA
+CTACGAATTCTATACATAATAGACGAGATTAATAACCCAGTTCTAACAGTAAAAACTATA
+TTACGAATCCTCTACATAATGGACGAGATCAATAACCCTTCCTTGACCGTAAAAACTATA
+TTACGGATCCTTTACATAATAGACGAAGTCAATAACCCCTCCCTCACTGTAAAAACAATA
+CTTCGTATCCTATATTTAATAGATGAAGTTAATGATCCACACTTAACAATTAAAGCAATC
+
+GGACATCAGTGATACTGAAGCTATGAGTATACAGATTATGAGGACTTAAGCTTCGACTCC
+GGACACCAATGATACTGAAGTTACGAGTATACAGACTATGAAAATCTAGGATTCGACTCC
+GGACACCAATGATACTGAACCTATGAATACACAGACTTCAAGGACCTCTCATTTGACTCC
+GGCCACCAATGGTACTGAACCTACGAGTACACCGACTACGGCGGACTAATCTTCAACTCC
+GGGCACCAATGATACTGAAGCTACGAGTATACTGATTATGAAAACTTAAGTTTTGACTCC
+GGGCACCAATGATACTGAAGCTACGAATATACTGACTATGAAGACCTATGCTTTGATTCA
+GGACACCAATGATACTGAAGCTATGAATATACTGACTATGAAGACCTATGCTTTGACTCC
+GGACATCAGTGATACTGAAGCTATGAGTACACAGACTACGAAGACCTGAACTTTGACTCA
+GGTCACCAATGATATTGAAGCTATGAGTATACCGACTACGAAGACCTAAGCTTCGACTCC
+GGCCACCAATGATACTGAAGCTACGAATATACTAACTATGAGGATCTCTCATTTGACTCT
+
+TACATAATTCCAACATCAGAATTAAAGCCAGGGGAGCTACGACTATTAGAAGTCGATAAT
+TATATAGTACCAACCCAAGACCTTGCCCCCGGACAATTCCGACTTCTGGAAACAGACCAC
+TACATAACCCCAACAACAGACCTCCCCCTAGGCCACTTCCGCCTACTAGAAGTCGACCAT
+TACATACTTCCCCCATTATTCCTAGAACCAGGCGACCTGCGACTCCTTGACGTTGACAAT
+TACATAATCCCCACCCAGGACCTAACCCCTGGACAATTCCGGCTACTAGAGACAGACCAC
+TATATAATCCCAACAAACGACCTAAAACCTGGTGAACTACGACTGCTAGAAGTTGATAAC
+TACATAATCCCAACCAATGACCTAAAACCAGGTGAACTTCGTCTATTAGAAGTTGATAAT
+TATATGATCCCCACACAAGAACTAAAGCCCGGAGAACTACGACTGCTAGAAGTAGACAAT
+TATATAATCCCAACATCAGACCTAAAGCCAGGAGAACTACGATTATTAGAAGTAGATAAC
+TATATAATTCCAACTAATGACCTTACCCCTGGACAATTCCGGCTGCTAGAAGTTGATAAT
+
+CGAGTTGTACTACCAATAGAAATAACAATCCGAATGTTAGTCTCCTCTGAAGACGTATTA
+CGAATAGTTGTTCCAATAGAATCCCCAGTCCGTGTCCTAGTATCTGCTGAAGACGTGCTA
+CGCATTGTAATCCCCATAGAATCCCCCATTCGAGTAATCATCACCGCTGATGACGTCCTC
+CGAGTAGTACTCCCGATTGAAGCCCCCATTCGTATAATAATTACATCACAAGACGTCTTG
+CGAATGGTTGTTCCCATAGAATCCCCTATTCGCATTCTTGTTTCCGCCGAAGATGTACTA
+CGAGTCGTTCTGCCAATAGAACTTCCAATCCGTATATTAATTTCATCTGAAGACGTCCTC
+CGGGTAGTCTTACCAATAGAACTTCCAATTCGTATACTAATCTCATCCGAAGACGTCCTG
+CGAGTAGTCCTCCCAATAGAAATAACAATCCGCATACTAATCTCATCAGAAGATGTACTC
+CGAGTTGTCTTACCTATAGAAATAACAATCCGAATATTAGTCTCATCAGAAGACGTACTC
+CGAATAGTAGTCCCAATAGAATCTCCAACCCGACTTTTAGTTACAGCCGAAGACGTCCTC
+
+CACTCATGAGCTGTGCCCTCTCTAGGACTAAAAACAGACGCAATCCCAGGCCGTCTAAAC
+CATTCTTGAGCTGTTCCATCCCTTGGCGTAAAAATGGACGCAGTCCCAGGACGACTAAAT
+CACTCATGAGCCGTACCCGCCCTCGGGGTAAAAACAGACGCAATCCCTGGACGACTAAAT
+CACTCATGAGCTGTCCCCACATTAGGCTTAAAAACAGATGCAATTCCCGGACGTCTAAAC
+CACTCCTGGGCCCTTCCAGCCATGGGGGTAAAGATAGACGCGGTCCCAGGACGCCTTAAC
+CACTCATGAGCAGTCCCCTCCCTAGGACTTAAAACTGATGCCATCCCAGGCCGACTAAAT
+CACTCATGAGCCATCCCTTCACTAGGGTTAAAAACCGACGCAATCCCCGGCCGCCTAAAC
+CACTCATGAGCCGTACCGTCCCTAGGACTAAAAACTGATGCTATCCCAGGACGACTAAAC
+CACTCATGGGCCGTACCCTCCTTGGGCCTAAAAACAGATGCAATCCCAGGACGCCTAAAC
+CACTCGTGAGCTGTACCCTCCTTGGGTGTCAAAACAGATGCAATCCCAGGACGACTTCAT
+
+CAAACAACCCTTATATCGTCCCGTCCAGGCTTATATTACGGTCAATGCTCAGAAATTTGC
+CAAGCCGCCTTTATTGCCTCACGCCCAGGGGTCTTTTACGGACAATGCTCTGAAATTTGT
+CAAACCTCCTTCATCACCACTCGACCAGGAGTGTTTTACGGACAATGCTCAGAAATCTGC
+CAAACCACTTTCACCGCTACACGACCGGGGGTATACTACGGTCAATGCTCTGAAATCTGT
+CAAACCGCCTTTATTGCCTCCCGCCCCGGGGTATTCTATGGGCAATGCTCAGAAATCTGT
+CAAGCAACAGTAACATCAAACCGACCAGGGTTATTCTATGGCCAATGCTCTGAAATTTGT
+CAAGCTACAGTCACATCAAACCGACCAGGTCTATTCTATGGCCAATGCTCTGAAATTTGC
+CAAACAACCCTAATAACCATACGACCAGGACTGTACTACGGTCAATGCTCAGAAATCTGT
+CAAACAACCTTAATATCAACACGACCAGGCCTATTTTATGGACAATGCTCAGAGATCTGC
+CAAACATCATTTATTGCTACTCGTCCGGGAGTATTTTACGGACAATGTTCAGAAATTTGC
+
+GGGTCAAACCACAGTTTCATACCCATTGTCCTTGAGTTAGTCCCACTAAAGTACTTTGAA
+GGAGCTAATCACAGCTTTATACCAATTGTAGTTGAAGCAGTACCTCTCGAACACTTCGAA
+GGAGCTAACCACAGCTACATACCCATTGTAGTAGAGTCTACCCCCCTAAAACACTTTGAA
+GGAGCAAACCACAGTTTCATGCCCATCGTCCTAGAATTAATTCCCCTAAAAATCTTTGAA
+GGAGCAAACCACAGCTTTATACCCATCGTAGTAGAAGCGGTCCCACTATCTCACTTCGAA
+GGATCTAACCATAGCTTTATGCCCATTGTCCTAGAAATGGTTCCACTAAAATATTTCGAA
+GGCTCAAATCACAGCTTCATACCCATTGTACTAGAAATAGTGCCTCTAAAATATTTCGAA
+GGTTCAAACCACAGCTTCATACCTATTGTCCTCGAATTGGTCCCACTATCCCACTTCGAG
+GGCTCAAACCACAGTTTCATACCAATTGTCCTAGAACTAGTACCCCTAGAAGTCTTTGAA
+GGAGCAAACCACAGCTTTATACCAATTGTAGTTGAAGCAGTACCGCTAACCGACTTTGAA
+
+AAATGATCTGCGTCAATATTA---------------------TAA
+AACTGATCCTCATTAATACTAGAAGACGCCTCGCTAGGAAGCTAA
+GCCTGATCCTCACTA------------------CTGTCATCTTAA
+ATA---------------------GGGCCCGTATTTACCCTATAG
+AACTGGTCCACCCTTATACTAAAAGACGCCTCACTAGGAAGCTAA
+AACTGATCTGCTTCAATAATT---------------------TAA
+AACTGATCAGCTTCTATAATT---------------------TAA
+AAATGATCTACCTCAATGCTT---------------------TAA
+AAATGATCTGTATCAATACTA---------------------TAA
+AACTGATCTTCATCAATACTA---GAAGCATCACTA------AGA
diff --git a/utils/jalviewjs/site-resources/examples/dna_sequential.phy b/utils/jalviewjs/site-resources/examples/dna_sequential.phy
new file mode 100644 (file)
index 0000000..99dd34c
--- /dev/null
@@ -0,0 +1,11 @@
+10 705
+Cow       ATGGCATATCCCATACAACTAGGATTCCAAGATGCAACATCACCAATCATAGAAGAACTACTTCACTTTCATGACCACACGCTAATAATTGTCTTCTTAATTAGCTCATTAGTACTTTACATTATTTCACTAATACTAACGACAAAGCTGACCCATACAAGCACGATAGATGCACAAGAAGTAGAGACAATCTGAACCATTCTGCCCGCCATCATCTTAATTCTAATTGCTCTTCCTTCTTTACGAATTCTATACATAATAGATGAAATCAATAACCCATCTCTTACAGTAAAAACCATAGGACATCAGTGATACTGAAGCTATGAGTATACAGATTATGAGGACTTAAGCTTCGACTCCTACATAATTCCAACATCAGAATTAAAGCCAGGGGAGCTACGACTATTAGAAGTCGATAATCGAGTTGTACTACCAATAGAAATAACAATCCGAATGTTAGTCTCCTCTGAAGACGTATTACACTCATGAGCTGTGCCCTCTCTAGGACTAAAAACAGACGCAATCCCAGGCCGTCTAAACCAAACAACCCTTATATCGTCCCGTCCAGGCTTATATTACGGTCAATGCTCAGAAATTTGCGGGTCAAACCACAGTTTCATACCCATTGTCCTTGAGTTAGTCCCACTAAAGTACTTTGAAAAATGATCTGCGTCAATATTA---------------------TAA
+Carp      ATGGCACACCCAACGCAACTAGGTTTCAAGGACGCGGCCATACCCGTTATAGAGGAACTTCTTCACTTCCACGACCACGCATTAATAATTGTGCTCCTAATTAGCACTTTAGTTTTATATATTATTACTGCAATGGTATCAACTAAACTTACTAATAAATATATTCTAGACTCCCAAGAAATCGAAATCGTATGAACCATTCTACCAGCCGTCATTTTAGTACTAATCGCCCTGCCCTCCCTACGCATCCTGTACCTTATAGACGAAATTAACGACCCTCACCTGACAATTAAAGCAATAGGACACCAATGATACTGAAGTTACGAGTATACAGACTATGAAAATCTAGGATTCGACTCCTATATAGTACCAACCCAAGACCTTGCCCCCGGACAATTCCGACTTCTGGAAACAGACCACCGAATAGTTGTTCCAATAGAATCCCCAGTCCGTGTCCTAGTATCTGCTGAAGACGTGCTACATTCTTGAGCTGTTCCATCCCTTGGCGTAAAAATGGACGCAGTCCCAGGACGACTAAATCAAGCCGCCTTTATTGCCTCACGCCCAGGGGTCTTTTACGGACAATGCTCTGAAATTTGTGGAGCTAATCACAGCTTTATACCAATTGTAGTTGAAGCAGTACCTCTCGAACACTTCGAAAACTGATCCTCATTAATACTAGAAGACGCCTCGCTAGGAAGCTAA
+Chicken   ATGGCCAACCACTCCCAACTAGGCTTTCAAGACGCCTCATCCCCCATCATAGAAGAGCTCGTTGAATTCCACGACCACGCCCTGATAGTCGCACTAGCAATTTGCAGCTTAGTACTCTACCTTCTAACTCTTATACTTATAGAAAAACTATCA---TCAAACACCGTAGATGCCCAAGAAGTTGAACTAATCTGAACCATCCTACCCGCTATTGTCCTAGTCCTGCTTGCCCTCCCCTCCCTCCAAATCCTCTACATAATAGACGAAATCGACGAACCTGATCTCACCCTAAAAGCCATCGGACACCAATGATACTGAACCTATGAATACACAGACTTCAAGGACCTCTCATTTGACTCCTACATAACCCCAACAACAGACCTCCCCCTAGGCCACTTCCGCCTACTAGAAGTCGACCATCGCATTGTAATCCCCATAGAATCCCCCATTCGAGTAATCATCACCGCTGATGACGTCCTCCACTCATGAGCCGTACCCGCCCTCGGGGTAAAAACAGACGCAATCCCTGGACGACTAAATCAAACCTCCTTCATCACCACTCGACCAGGAGTGTTTTACGGACAATGCTCAGAAATCTGCGGAGCTAACCACAGCTACATACCCATTGTAGTAGAGTCTACCCCCCTAAAACACTTTGAAGCCTGATCCTCACTA------------------CTGTCATCTTAA
+Human     ATGGCACATGCAGCGCAAGTAGGTCTACAAGACGCTACTTCCCCTATCATAGAAGAGCTTATCACCTTTCATGATCACGCCCTCATAATCATTTTCCTTATCTGCTTCCTAGTCCTGTATGCCCTTTTCCTAACACTCACAACAAAACTAACTAATACTAACATCTCAGACGCTCAGGAAATAGAAACCGTCTGAACTATCCTGCCCGCCATCATCCTAGTCCTCATCGCCCTCCCATCCCTACGCATCCTTTACATAACAGACGAGGTCAACGATCCCTCCCTTACCATCAAATCAATTGGCCACCAATGGTACTGAACCTACGAGTACACCGACTACGGCGGACTAATCTTCAACTCCTACATACTTCCCCCATTATTCCTAGAACCAGGCGACCTGCGACTCCTTGACGTTGACAATCGAGTAGTACTCCCGATTGAAGCCCCCATTCGTATAATAATTACATCACAAGACGTCTTGCACTCATGAGCTGTCCCCACATTAGGCTTAAAAACAGATGCAATTCCCGGACGTCTAAACCAAACCACTTTCACCGCTACACGACCGGGGGTATACTACGGTCAATGCTCTGAAATCTGTGGAGCAAACCACAGTTTCATGCCCATCGTCCTAGAATTAATTCCCCTAAAAATCTTTGAAATA---------------------GGGCCCGTATTTACCCTATAG
+Loach     ATGGCACATCCCACACAATTAGGATTCCAAGACGCGGCCTCACCCGTAATAGAAGAACTTCTTCACTTCCATGACCATGCCCTAATAATTGTATTTTTGATTAGCGCCCTAGTACTTTATGTTATTATTACAACCGTCTCAACAAAACTCACTAACATATATATTTTGGACTCACAAGAAATTGAAATCGTATGAACTGTGCTCCCTGCCCTAATCCTCATTTTAATCGCCCTCCCCTCACTACGAATTCTATATCTTATAGACGAGATTAATGACCCCCACCTAACAATTAAGGCCATGGGGCACCAATGATACTGAAGCTACGAGTATACTGATTATGAAAACTTAAGTTTTGACTCCTACATAATCCCCACCCAGGACCTAACCCCTGGACAATTCCGGCTACTAGAGACAGACCACCGAATGGTTGTTCCCATAGAATCCCCTATTCGCATTCTTGTTTCCGCCGAAGATGTACTACACTCCTGGGCCCTTCCAGCCATGGGGGTAAAGATAGACGCGGTCCCAGGACGCCTTAACCAAACCGCCTTTATTGCCTCCCGCCCCGGGGTATTCTATGGGCAATGCTCAGAAATCTGTGGAGCAAACCACAGCTTTATACCCATCGTAGTAGAAGCGGTCCCACTATCTCACTTCGAAAACTGGTCCACCCTTATACTAAAAGACGCCTCACTAGGAAGCTAA
+Mouse     ATGGCCTACCCATTCCAACTTGGTCTACAAGACGCCACATCCCCTATTATAGAAGAGCTAATAAATTTCCATGATCACACACTAATAATTGTTTTCCTAATTAGCTCCTTAGTCCTCTATATCATCTCGCTAATATTAACAACAAAACTAACACATACAAGCACAATAGATGCACAAGAAGTTGAAACCATTTGAACTATTCTACCAGCTGTAATCCTTATCATAATTGCTCTCCCCTCTCTACGCATTCTATATATAATAGACGAAATCAACAACCCCGTATTAACCGTTAAAACCATAGGGCACCAATGATACTGAAGCTACGAATATACTGACTATGAAGACCTATGCTTTGATTCATATATAATCCCAACAAACGACCTAAAACCTGGTGAACTACGACTGCTAGAAGTTGATAACCGAGTCGTTCTGCCAATAGAACTTCCAATCCGTATATTAATTTCATCTGAAGACGTCCTCCACTCATGAGCAGTCCCCTCCCTAGGACTTAAAACTGATGCCATCCCAGGCCGACTAAATCAAGCAACAGTAACATCAAACCGACCAGGGTTATTCTATGGCCAATGCTCTGAAATTTGTGGATCTAACCATAGCTTTATGCCCATTGTCCTAGAAATGGTTCCACTAAAATATTTCGAAAACTGATCTGCTTCAATAATT---------------------TAA
+Rat       ATGGCTTACCCATTTCAACTTGGCTTACAAGACGCTACATCACCTATCATAGAAGAACTTACAAACTTTCATGACCACACCCTAATAATTGTATTCCTCATCAGCTCCCTAGTACTTTATATTATTTCACTAATACTAACAACAAAACTAACACACACAAGCACAATAGACGCCCAAGAAGTAGAAACAATTTGAACAATTCTCCCAGCTGTCATTCTTATTCTAATTGCCCTTCCCTCCCTACGAATTCTATACATAATAGACGAGATTAATAACCCAGTTCTAACAGTAAAAACTATAGGACACCAATGATACTGAAGCTATGAATATACTGACTATGAAGACCTATGCTTTGACTCCTACATAATCCCAACCAATGACCTAAAACCAGGTGAACTTCGTCTATTAGAAGTTGATAATCGGGTAGTCTTACCAATAGAACTTCCAATTCGTATACTAATCTCATCCGAAGACGTCCTGCACTCATGAGCCATCCCTTCACTAGGGTTAAAAACCGACGCAATCCCCGGCCGCCTAAACCAAGCTACAGTCACATCAAACCGACCAGGTCTATTCTATGGCCAATGCTCTGAAATTTGCGGCTCAAATCACAGCTTCATACCCATTGTACTAGAAATAGTGCCTCTAAAATATTTCGAAAACTGATCAGCTTCTATAATT---------------------TAA
+Seal      ATGGCATACCCCCTACAAATAGGCCTACAAGATGCAACCTCTCCCATTATAGAGGAGTTACTACACTTCCATGACCACACATTAATAATTGTGTTCCTAATTAGCTCATTAGTACTCTACATTATCTCACTTATACTAACCACGAAACTCACCCACACAAGTACAATAGACGCACAAGAAGTGGAAACGGTGTGAACGATCCTACCCGCTATCATTTTAATTCTCATTGCCCTACCATCATTACGAATCCTCTACATAATGGACGAGATCAATAACCCTTCCTTGACCGTAAAAACTATAGGACATCAGTGATACTGAAGCTATGAGTACACAGACTACGAAGACCTGAACTTTGACTCATATATGATCCCCACACAAGAACTAAAGCCCGGAGAACTACGACTGCTAGAAGTAGACAATCGAGTAGTCCTCCCAATAGAAATAACAATCCGCATACTAATCTCATCAGAAGATGTACTCCACTCATGAGCCGTACCGTCCCTAGGACTAAAAACTGATGCTATCCCAGGACGACTAAACCAAACAACCCTAATAACCATACGACCAGGACTGTACTACGGTCAATGCTCAGAAATCTGTGGTTCAAACCACAGCTTCATACCTATTGTCCTCGAATTGGTCCCACTATCCCACTTCGAGAAATGATCTACCTCAATGCTT---------------------TAA
+Whale     ATGGCATATCCATTCCAACTAGGTTTCCAAGATGCAGCATCACCCATCATAGAAGAGCTCCTACACTTTCACGATCATACACTAATAATCGTTTTTCTAATTAGCTCTTTAGTTCTCTACATTATTACCCTAATGCTTACAACCAAATTAACACATACTAGTACAATAGACGCCCAAGAAGTAGAAACTGTCTGAACTATCCTCCCAGCCATTATCTTAATTTTAATTGCCTTGCCTTCATTACGGATCCTTTACATAATAGACGAAGTCAATAACCCCTCCCTCACTGTAAAAACAATAGGTCACCAATGATATTGAAGCTATGAGTATACCGACTACGAAGACCTAAGCTTCGACTCCTATATAATCCCAACATCAGACCTAAAGCCAGGAGAACTACGATTATTAGAAGTAGATAACCGAGTTGTCTTACCTATAGAAATAACAATCCGAATATTAGTCTCATCAGAAGACGTACTCCACTCATGGGCCGTACCCTCCTTGGGCCTAAAAACAGATGCAATCCCAGGACGCCTAAACCAAACAACCTTAATATCAACACGACCAGGCCTATTTTATGGACAATGCTCAGAGATCTGCGGCTCAAACCACAGTTTCATACCAATTGTCCTAGAACTAGTACCCCTAGAAGTCTTTGAAAAATGATCTGTATCAATACTA---------------------TAA
+Frog      ATGGCACACCCATCACAATTAGGTTTTCAAGACGCAGCCTCTCCAATTATAGAAGAATTACTTCACTTCCACGACCATACCCTCATAGCCGTTTTTCTTATTAGTACGCTAGTTCTTTACATTATTACTATTATAATAACTACTAAACTAACTAATACAAACCTAATGGACGCACAAGAGATCGAAATAGTGTGAACTATTATACCAGCTATTAGCCTCATCATAATTGCCCTTCCATCCCTTCGTATCCTATATTTAATAGATGAAGTTAATGATCCACACTTAACAATTAAAGCAATCGGCCACCAATGATACTGAAGCTACGAATATACTAACTATGAGGATCTCTCATTTGACTCTTATATAATTCCAACTAATGACCTTACCCCTGGACAATTCCGGCTGCTAGAAGTTGATAATCGAATAGTAGTCCCAATAGAATCTCCAACCCGACTTTTAGTTACAGCCGAAGACGTCCTCCACTCGTGAGCTGTACCCTCCTTGGGTGTCAAAACAGATGCAATCCCAGGACGACTTCATCAAACATCATTTATTGCTACTCGTCCGGGAGTATTTTACGGACAATGTTCAGAAATTTGCGGAGCAAACCACAGCTTTATACCAATTGTAGTTGAAGCAGTACCGCTAACCGACTTTGAAAACTGATCTTCATCAATACTA---GAAGCATCACTA------AGA
diff --git a/utils/jalviewjs/site-resources/examples/estrogenReceptorCdna.fa b/utils/jalviewjs/site-resources/examples/estrogenReceptorCdna.fa
new file mode 100644 (file)
index 0000000..9d857db
--- /dev/null
@@ -0,0 +1,221 @@
+>EMBLCDS|ADZ17331/1-1593 Homo sapiens (human) estrogen nuclear receptor beta variant a
+atggatataaaaaactcaccatctagccttaattctccttcctcctacaactgcagtcaatccatcttaccc
+ctggagcacggctccatatacataccttcctcctatgtagacagccaccatgaatatccagccatgacattc
+tatagccctgctgtgatgaattacagcattcccagcaatgtcactaacttggaaggtgggcctggtcggcag
+accacaagcccaaatgtgttgtggccaacacctgggcacctttctcctttagtggtccatcgccagttatca
+catctgtatgcggaacctcaaaagagtccctggtgtgaagcaagatcgctagaacacaccttacctgtaaac
+agagagacactgaaaaggaaggttagtgggaaccgttgcgccagccctgttactggtccaggttcaaagagg
+gatgctcacttctgcgctgtctgcagcgattacgcatcgggatatcactatggagtctggtcgtgtgaagga
+tgtaaggccttttttaaaagaagcattcaaggacataatgattatatttgtccagctacaaatcagtgtaca
+atcgataaaaaccggcgcaagagctgccaggcctgccgacttcggaagtgttacgaagtgggaatggtgaag
+tgtggctcccggagagagagatgtgggtaccgccttgtgcggagacagagaagtgccgacgagcagctgcac
+tgtgccggcaaggccaagagaagtggcggccacgcgccccgagtgcgggagctgctgctggacgccctgagc
+cccgagcagctagtgctcaccctcctggaggctgagccgccccatgtgctgatcagccgccccagtgcgccc
+ttcaccgaggcctccatgatgatgtccctgaccaagttggccgacaaggagttggtacacatgatcagctgg
+gccaagaagattcccggctttgtggagctcagcctgttcgaccaagtgcggctcttggagagctgttggatg
+gaggtgttaatgatggggctgatgtggcgctcaattgaccaccccggcaagctcatctttgctccagatctt
+gttctggacagggatgaggggaaatgcgtagaaggaattctggaaatctttgacatgctcctggcaactact
+tcaaggtttcgagagttaaaactccaacacaaagaatatctctgtgtcaaggccatgatcctgctcaattcc
+agtatgtaccctctggtcacagcgacccaggatgctgacagcagccggaagctggctcacttgctgaacgcc
+gtgaccgatgctttggtttgggtgattgccaagagcggcatctcctcccagcagcaatccatgcgcctggct
+aacctcctgatgctcctgtcccacgtcaggcatgcgagtaacaagggcatggaacatctgctcaacatgaag
+tgcaaaaatgtggtcccagtgtatgacctgctgctggagatgctgaatgcccacgtgcttcgcgggtgcaag
+tcctccatcacggggtccgagtgcagcccggcagaggacagtaaaagcaaagagggctcccagaacccacag
+tctcagtga
+>EMBLCDS|AAK93056/1-1455 Drosophila melanogaster (fruit fly) GH28308p
+atgtccgacggcgtcagcatcttgcacatcaaacaggaggtggacactccatcggcgtcctgctttagtccc
+agctccaagtcaacggccacgcagagtggcacaaacggcctgaaatcctcgccctcggtttcgccggaaagg
+cagctctgcagctcgacgacctctctatcctgcgatttgcacaatgtatccttaagcaatgatggcgatagt
+ctgaaaggaagtggtacaagtggcggcaatggcggaggaggaggtggtggtacgagtggtggaaatgcgacc
+aatgcgagtgccggagctggatcgggatccgtcagggacgagctccgccgattgtgtttggtttgtggcgat
+gtggccagtggattccactatggtgtggcgagttgtgaggcttgcaaagcgttctttaaacgcaccatccaa
+ggcaacatcgagtacacgtgtccggcgaacaacgagtgtgagattaacaagcggagacgcaaggcctgccaa
+gcgtgtcgcttccagaaatgtctactaatgggcatgctcaaggagggtgtgcgcttggatcgagttcgtgga
+ggacggcagaagtaccgaaggaatcctgtatcaaactcttaccagactatgcagctgctataccaatccaac
+accacctcgctgtgcgatgtcaagatactggaggtgctcaattcatatgagccggatgccttgagcgtccaa
+acgccgccgccgcaagtccacacgactagcataactaatgatgaggcctcatcctcctcgggcagcataaaa
+ctggagtccagcgttgttacgcccaatgggacttgcattttccaaaacaacaacaacaatgatcccaatgag
+atactaagcgtccttagtgatatttacgacaaggaattggtcagcgtcattggctgggccaagcagatacct
+ggctttatagatctgccacttaacgaccagatgaagcttctccaggtgtcgtgggcagagatcctgacgctc
+cagctgaccttccggtccctaccgttcaatggcaagttatgcttcgccacggatgtctggatggatgaacat
+ttggccaaggagtgcggttacacggagttctactaccactgcgtccagatcgcacagcgcatggaaagaata
+tcgccacgaagggaggagtactacttgctaaaggcgctcctgctggccaactgcgacattctgctggatgat
+cagagttccctgcgcgcatttcgtgatacgattcttaattctctaaacgatgtggtctacttgctgcgtcat
+tcgtcggccgtgtcgcatcagcaacaattgctgcttttgctgccttcgctgcggcaggcggatgatatcctg
+cgaagattttggcgtggaattgcacgcgatgaagtcattaccatgaagaaactgttcctcgagatgctcgag
+ccgctggccaggtga
+>EMBLCDS|BAA89539/1-2133 Anguilla japonica (Japanese eel) progesterone receptor
+atggacaacaatcaccaagacaagatggaaagtctatacacgccagccagagcatcaccaactcctgatgca
+gaatcgattaaaagagccaggaatttgattaaaacatactcggagtcttttgggagttatgtggaggagata
+gttcgagacgactcgaataacatacaatctttgagcagcgtccctctcttgatgcgtaattttggaaacatg
+gacaccctaacctgcgcacctggctcgggtagtgacagtgagatttggaaagactttgttgttcccgggaac
+tctgtggtaagcaaagacacctgtggtcatgttgaaatatccactaaagccgaaaatttgtcttgggctgcc
+gcgcccttaagtagagaagaaaccctcgcgaaaggaactgttacggtcccagcgactgtgcctaaagaaagt
+tttaccgcaacatcaaacacttcttcagccagtggaatctctattaaagatgaacaacaatctttgctcaaa
+atggaaccacagtcttctgacttttgtccttatacagcaaatataccgaaattgaatccatcttatctgacc
+aatactgcgagtacgaaacaacttggatatggcgaacagccggacacttcagcgcactcctctccacctgct
+cagaagattgttttagatactgctcgatactcggccgatttatgttcggataaccctttaccgcaagcgaca
+aatatcaaaacagatccttgtagtagtttctcttctttcgttggagaagggatccttactagggcatctatg
+ggctactcacagcaagcgattcagacattgccggtgcacaagagtgaaccgttcaggttgtctgcttcgagc
+gcgcccgcggattctccgttttggtgccaatccacgggtccttctgaggatcatcatctgcagattgactat
+ctatctcccgctggactccacagcacatgcaaatacagttccacgaacgcgtacagctcctatttaggtgtg
+ctgccccagagggtgtgcgtcatctgtggggatgaagcatcaggctgtcactatggtgtcctcacctgtggc
+agctgtaaggtgttctttaagagggcagtggaaggccatcataactacttgtgtgctggacggaatgactgc
+atcgtggacaagatccgtaggaaaaactgtcctgcttgtcgcctcagaaagtgctaccaggcgggaatgata
+ctgggaggtcggaagctgaagaagttgggggctctgaaggcagcagggctgacccaggccctggtggcccac
+tcactgactcctcggaggctctctggtgacagccaggccctgatgcccctgggctgccttccaggggtccgg
+gagctgcacctttccccacagatcatcagcgtgctggagagcattgagcctgaggtggtgtactctggttat
+gacaactcccagcctgacatgcccaatatgctgctcaacagcctcaaccgcttatgtgagaggcagctgctg
+aggattgtcaagtggtccaagtctttaccaggttttcgcagtttacacatcaatgaccaaatggctctgatc
+cagtactcctggatgagcttaatggtattttctttgggttggcggtctttccaaaatgtcaccagtgattac
+ctgtactttgcacctgacctcattctcaacgaagagtatatgaggaggtctccaatatttgacctgtgcatg
+gccatgcagttcatccctcaagagtttgccaatctccaggtgaccaaggaggagtttctgtgcatgaaggtc
+ttgctgttgctcaacacagtgcctctggaggggttgaagagccagccacagtttgatgagatgaggcagaat
+tacatccatgaactcaccaaggccattcacctgcgagagaatggtgtggtcgcctgctcccagcgtttctac
+cacctgaccaagctgatggaccacatgcatgacattgtgaagaagctccacctgtactgcctgagcactttc
+attcaggcagatgccatgcgggtagagttccccgagatgatgtcagaagtcatcgcctcccagctgcctcgg
+gtgctcgctggaatggtgaaaccccttctttttcacaccaaatga
+>EMBLCDS|AHW56473/1-1590 Homo sapiens (human) partial estrogen receptor 2 isoform A
+atggatataaaaaactcaccatctagccttaattctccttcctcctacaactgcagtcaatccatcttaccc
+ctggagcacggctccatatacataccttcctcctatgtagacagccaccatgaatatccagccatgacattc
+tatagccctgctgtgatgaattacagcattcccagcaatgtcactaacttggaaggtgggcctggtcggcag
+accacaagcccaaatgtgttgtggccaacacctgggcacctttctcctttagtggtccatcgccagttatca
+catctgtatgcggaacctcaaaagagtccctggtgtgaagcaagatcgctagaacacaccttacctgtaaac
+agagagacactgaaaaggaaggttagtgggaaccgttgcgccagccctgttactggtccaggttcaaagagg
+gatgctcacttctgcgctgtctgcagcgattacgcatcgggatatcactatggagtctggtcgtgtgaagga
+tgtaaggccttttttaaaagaagcattcaaggacataatgattatatttgtccagctacaaatcagtgtaca
+atcgataaaaaccggcgcaagagctgccaggcctgccgacttcggaagtgttacgaagtgggaatggtgaag
+tgtggctcccggagagagagatgtgggtaccgccttgtgcggagacagagaagtgccgacgagcagctgcac
+tgtgccggcaaggccaagagaagtggcggccacgcgccccgagtgcgggagctgctgctggacgccctgagc
+cccgagcagctagtgctcaccctcctggaggctgagccgccccatgtgctgatcagccgccccagtgcgccc
+ttcaccgaggcctccatgatgatgtccctgaccaagttggccgacaaggagttggtacacatgatcagctgg
+gccaagaagattcccggctttgtggagctcagcctgttcgaccaagtgcggctcttggagagctgttggatg
+gaggtgttaatgatggggctgatgtggcgctcaattgaccaccccggcaagctcatctttgctccagatctt
+gttctggacagggatgaggggaaatgcgtagaaggaattctggaaatctttgacatgctcctggcaactact
+tcaaggtttcgagagttaaaactccaacacaaagaatatctctgtgtcaaggccatgatcctgctcaattcc
+agtatgtaccctctggtcacagcgacccaggatgctgacagcagccggaagctggctcacttgctgaacgcc
+gtgaccgatgctttggtttgggtgattgccaagagcggcatctcctcccagcagcaatccatgcgcctggct
+aacctcctgatgctcctgtcccacgtcaggcatgcgagtaacaagggcatggaacatctgctcaacatgaag
+tgcaaaaatgtggtcccagtgtatgacctgctgctggagatgctgaatgcccacgtgcttcgcgggtgcaag
+tcctccatcacggggtccgagtgcagcccggcagaggacagtaaaagcaaagagggctcccagaacccacag
+tctcag
+>EMBLCDS|BAA75464/1-2547 Anguilla japonica (Japanese eel) androgen receptor alpha
+atggagattccagttgggttaggaggagtttcagatgccacaaacgccgtttttcgcggaccttaccaaaac
+gttttccacagccttcaagtggcatttcagagtcacggtgccgtctccaggagcttagattttccaaataca
+aagtacggttttttacaaaacagacatttctgtgaaatgcgtcaggagaacaagcagccgccatgcaaagga
+ctcggcctattttacgggaaccatcgtaattcggacactgggacaaacgaagacgacatcgcttgtttttcc
+agacagtccgacgctgaagccagacctggtattttttctgaaagctcattggatactggagacgagattact
+tgcaaactccagtcagacaaccaaggggtaagagcgagcggtcctctcctaccgggctctagcggctgcaat
+tcgggacaaaagtcctcccttgcttgtacgtcccaacaaagggagacaacatctcaaagtgacacctgcgca
+ggagagagctgctcggaacatcaagcaactaccatttcggaaactgcgcgcgaattgtgcaacgccgtttcc
+gtgtcgctgggcttgaatttagatcttaatgatatgaatgacctaagttcaaaccaaatatcgtctaccgaa
+agtgacacaagtcaagccatctacttatttgaatcttcacctgggtatactggggtcggactgaacgccttg
+gtaagagactgtaaatgtcagagtgcacgcgaagggacatcgacacaacagtacgaccgcggggcaatgttt
+aagataaaccgtgtaaatgacttgccgcttcagccagcacccccgcgacacaccagcattagcgatgctaaa
+tgggacatggaagcaggtttgtgtgcgcagatggagcacaaagactctgaaaagtgcgcgaatatggatggt
+gcacactccacttctgtcttctcccagttcgaccaactgttgccagtaaacgcgtcgcactacagtcagaac
+gtttcggtcagagtggaaccacaaagtgatttctctccgattttgtacaaatcacctggtattcagaaaaat
+gccgaaaagtacaatgtccaatatgatgccacaattaaatcagaagatgggaaaacgacatctgaacgggaa
+tggggttttcagtacaggtacaatgaaagctgcagcacaccgtcagcacctcctagacattgtgcacatcag
+aacagggccggaccgtacaaccagttcttttttaatccatttgaatatgcgaaaagaggtgttgtctcaagg
+gaaggatattctctcgaacatgggttcccaaacaatctcgctcggacaccctactctggttccttgaaaaac
+gaactaggagatcgtctgagtgggccataccctgacgtcagttacaggtacgagggcgagcgggagaacgtg
+ttccccgtggagttcttctttccgccgcagaggacctgcctgatctgcggggacgaggcctcgggctgtcac
+tatggagccctcacctgcggcagctgcaaggtgttcttcaagagggccgcggaagggaaacagaagtacctg
+tgcgccagcatcaatgattgcaccattgataaacttcgaaggaagaactgcccctcttgccgtctcaaaagg
+tgctttgctgccggaatgacccttggagcgcggaagctgaagaagatcgggcaaatgagggcccccgaggat
+ggccaggggcagggcccggcggaagcggagctgagcgtctcccccaagtacgacctgggcttccacacccag
+tccatgttcctcaacatcctggaggccatcgagccggaggtggtgaacgccgggcacgactatggccagccg
+gactctgcggccagcctgctgaccagcctcaacgagctcggagaacggcaactcgtcaaggtcgtcaagtgg
+gccaagggcatgccaggttttcggagtctgtacgtggatgaccagatgacagtcatccagcactcctggatg
+gcagtgatggtgttcgctctgggctggaggtcatttaagaatgtgaagtccaggatgctttactttgctcct
+gaccttgttttcaacgagcaccgaatgcaggtgtccaccatgtatgaacactgcatccggatgaagaacttc
+tcccaggagtttgctatgctgcaggtctcccaggaagagttcctgtgcatgaaagctctgcttctcttcagc
+accatccccgttgaagggctgaaggggcagaatttctttgacgagctgcggaggagctacattaacgagctg
+gaccggctggttagcttcaggagcaagtccagctgttccgagaggttccagcagctcacccgcctcctggac
+tccctccaacctgttctgaagaagctccaccagtttacgttcgaccttttcgtccagtcccagaacctctcc
+aaccaagtttgctttcccgagatgatctcagagatcatatccgtgcacgtgccaaagattctcgctggcacg
+gtgaagccaatcctcttccacaagtag
+>EMBLCDS|AAK20930/1-1317 Petromyzon marinus (sea lamprey) partial corticoid receptor
+ggggtggagtttcagttgccctactcggcatctgccacatcctttcgtccgtccgttgccacctcgtccgcc
+tcgggcatctccaacttttcaaatgggaataattttggattcctttctcccaatggagtacaacaggatgga
+tttccttaccctggtttcacgagtcccgcacagtcctcagtccctccgcagaaggcgtgtctcatctgtagt
+gatgaggcttcgggctgccactacggagtgctcacctgtggaagctgcaaggtgttcttcaagcgtgccgtg
+gaaggacagcacaattatctgtgcgccggacgaaacgactgcatcattgacaagatccgccgcaagaactgc
+ccagcttgccgtctgcgcaagtgcatccaggctggaatgacgctaggagcacgcaagcttaagaagcaaggc
+cgggtaaagggagagaaccagcgcagcccagcgtcctccacagccaccacctcgtctgccaccccgcaaccc
+tccagcaactcgacggccgtgaccacgttctcgccaccgccgaccggagagcccattttctcacccacactc
+atcgccatcctgcaggcgatcgagcccgaggtggtcatgtccggctatgacaacacgcggtcccagaccacc
+gcctacatgctgtcgagcctcaaccgcctctgcgacaagcagctcgtgtccattgtcaagtgggccaagtct
+ctgccaggtttccgaaacctgcacatcgacgaccagatggtgttaatccagtactcatggatgggcctgatg
+tcatttgccatgagctggaggtccttccagcacaccaacagcaagctgctctactttgctcctgatctggtt
+tttgatgagacgcgcatgcagcartcggcgatgtatcaattgtgcgtggaaatgaggcaagtctcggaggac
+ttcatgaagttgcaagtcacttcagaggagtttctgtgcatgaaagccatcttgctcctgagtactgtccca
+caagagggtctgaagagccagggctgcttcgaggagatgcggatcagctacatccgggaattgaaccggacc
+atcgcgcggacggagaagaatgccgtgcagtgttggcagcgcttctaccagctcaccaagctgctggrctgc
+atgcaggatctcgtgagcaagctcctggagttctgcttcgcaaccttcacgcagacgcaggtgtggagtgtg
+gagtttcctgacatgatggccgagatcatcagtgcgcagcttgcctcgcatcatggccgagaagcccgggca
+ctccacttccacaagaaatga
+>EMBLCDS|AAA17402/1-1032 Serinus canaria (common canary) partial androgen receptor
+gaagcctccgggtgccactacggagccctgacgtgtgggagctgcaaagtgttcttcaaacgggcagctgaa
+ggtaaacagaagtacctctgtgccagccgcaacgactgcaccatcgacaagttccggcggaaaaactgcccc
+tcctgccgcctgcgcaagtgctacgaggccgggatgacgcttggagcccgcaagctgaagaaactgggtaac
+ctgaaggcacaggacgacatagagggagccagctcgtccagcccaacggaggagcaagctcccaagctggtg
+atgacacgcattgatggctacgagtgccagcccatcttcctcaacgtcctggaggccatcgagcctggggtg
+gtgtgtgctggccatgacaacagccagcctgactccttctccaacctgctgaccagcctgaatgagcttggg
+gagaggcagctggtctacgtggtcaaatgggcaaaggctctgccaggatttcgcaacctgcatgtggatgac
+cagatgtcaataatccagtactcttggatgggcctgatggtgtttgctatggggtggagatccttcaccaac
+gtcaattccaggatgctttactttgctccagacctggtcttcaatgagtaccgcatgcacaaatccaggatg
+tacagccagtgcatcaggatgcggcacctctcccaggaattcgggtggcttcagatcacaccccaggggttc
+ctctgtatgaaggctctcctcttcttcagtattattccagtggatggcctgaagaaccagaagctcttcgat
+gagctccgcatgaattacatcaaggaacttgaccgtatcattgcctgcaagaggaagaaccccacctcatgc
+tcccggaggttttaccagctcaccaaggtcctggactccgtgactccgattgccaaggacctgcatcagttt
+acatttgatctcctaatcaaggcacacatggtgagcgtggactacccagaaatgatggctgagatcatctct
+gtgcaggttcccaagatcctgtct
+>EMBLCDS|AAL37553/1-1455 Drosophila melanogaster (fruit fly) estrogen-related receptor
+atgtccgacggcgtcagcatcttgcacatcaaacaggaggtggacactccatcggcgtcctgctttagtccc
+agctccaagtcaacggccacgcagagtggcacaaacggcctgaaatcctcgccctcggtttcgccggaaagg
+cagctctgcagctcgacgacctctctatcctgcgatttgcacaatgtatccttaagcaatgatggcgatagt
+ctgaaaggaagtggtacaagtggcggcaatggcggaggaggaggtggtggtacgagtggtggaaatgcgacc
+aatgcgagtgccggagctggatcgggatccgtcagggacgagctccgccgattgtgtttggtttgtggcgat
+gtggccagtggattccactatggtgtggcgagttgtgaggcttgcaaagcgttctttaaacgcaccatccaa
+ggcaacatcgagtacacgtgtccggcgaacaacgagtgtgagattaacaagcggagacgcaaggcctgccaa
+gcgtgtcgcttccagaaatgtctactaatgggcatgctcaaggagggtgtgcgcttggatcgagttcgtgga
+ggacggcagaagtaccgaaggaatcctgtatcaaactcttaccagactatgcagctgctataccaatccaac
+accacctcgctgtgcgatgtcaagatactggaggtgctcaattcatatgagccggatgccttgagcgtccaa
+acgccgccgccgcaagtccacacgactagcataactaatgatgaggcctcatcctcctcgggcagcataaaa
+ctggagtccagcgttgttacgcccaatgggacttgcattttccaaaacaacaacaacaatgatcccaatgag
+atactaagcgtccttagtgatatttacgacaaggaattggtcagcgtcattggctgggccaagcagatacct
+ggctttatagatctgccacttaacgaccagatgaagcttctccaggtgtcgtgggcagagatcctgacgctc
+cagctgaccttccggtccctaccgttcaatggcaagttatgcttcgccacggatgtctggatggatgaacat
+ttggccaaggagtgcggttacacggagttctactaccactgcgtccagatcgcacagcgcatggaaagaata
+tcgccacgaagggaggagtactacttgctaaaggcgctcctgctggccaactgcgacattctgctggatgat
+cagagttccctgcgcgcatttcgtgatacgattcttaattctctaaacgatgtggtctacttgctgcgtcat
+tcgtcggccgtgtcgcatcagcaacaattgctgcttttgctgccttcgctgcggcaggcggatgatatcctg
+cgaagattttggcgtggaattgcacgcgatgaagtcattaccatgaagaaactgttcctcgagatgctcgag
+ccgctggccaggtga
+>EMBLCDS|AAK20929/1-1662 Petromyzon marinus (sea lamprey) partial estrogen receptor
+gcacgaggcttcagcgaggcacatggctacgagtactccggggcctcgctctaccagccactgcctccctcg
+tgcacagagttctcaattggagctcatcaacaacaacaacatcagcaccagcatcaccagcaccagcatcag
+cagcaccaccaccagcagcagcagcagcagccacagccgcagcagaatggagttttgggcgaggggcagagt
+tcccatctctcttatcttccgccctcgaccgagctgccccagtacgtgccctccagccccagcgcgccctac
+agcatggagctcggggcagggcgtcctcacggctacgacccagggccacagagcctctacaggggcggtgtg
+gagagcagcgcccccccgtacagcgagcagcagcaggtggtgggcggcggcggagccatgtcggccatgggc
+ttgacagagccacgccacgtcagctccggatcgctacccagcagcacgaggcccgagcgcagcacccagttc
+tgtgccgtgtgcagcgactatgcctcggggtaccactacggcgtgtggtcctgcgagggctgcaaagccttc
+ttcaagcgcagcacgcaaggccacaatgactacatgtgcccggccaccaaccagtgcaccatcgacaggaac
+cgtcgcaagagctgtcaggcttgccgcctgcgtaagtgctacgaagtgggcatggtcaaaggcgttcgcaag
+gaccgcaaaggctttcgaggggtcaagcacaaacgtaagcgccccatcccccaaaagaatgggggagaagga
+ggtgccggcggcggccaagacgtgagcgagacgaggcctcagggtgagaggccctccgggccgagggaccgg
+gagagcgccgtcagctcactcgaggctgaccaggtgatctcggctcttctggaggctgagccacccaccgta
+ctgtcctcgtatgaccccgacaagcctgtgacggaggcctcgctcatggctgctctcaccagcctggctgac
+cgagagctcgtgcacatgatcacctgggctaagaagattccaggattcacggccatcgggctgagtgaccag
+gtgcagctgctggagtgctgctggctggagatcctaatcgtggggctcatctggaggtctatcgatcgccct
+ggtcagctccactttgctccaaacctcatcctaggaagggaggacgcgcgcaatgtggagggcatgctggac
+atgttcgacatgctgctcgtcaccgtgagtcgcttccgtgagctgcatctccgccgggaggaatacgtctgc
+ctcaaggccatgatcctcctcaactcgggggtgtttttctgcctctccaattccgccggggagcagacgaat
+gtgcagctcatccagcagatcctcgagaaggtgatggacgccctgggcagcaccatcggccacattgaggcg
+tccccgccgcaacactcgcgtcgcctctcccagctgctcctgctgctttcacagatccggcacattagcaac
+aagggcatcgagcatctcaacagcatgaagcgtaagaatgtgatcccgctatacgacctgctccttgagctg
+ctggacgctcacagcctgcagaatactggcttacggacgtcgcccccaccgcaggatttcagggcaaccctc
+gtgccg
diff --git a/utils/jalviewjs/site-resources/examples/estrogenReceptorCdna_aln.fa b/utils/jalviewjs/site-resources/examples/estrogenReceptorCdna_aln.fa
new file mode 100644 (file)
index 0000000..2f121db
--- /dev/null
@@ -0,0 +1,320 @@
+>EMBLCDS|ADZ17331/1-1593 Homo sapiens (human) estrogen nuclear receptor beta variant a
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------atggatataaaaaactcaccatctagccttaattctccttcctcctacaactgcagtcaatccatc
+------------------ttacccctggagcacggctccatatacataccttcctcctatgtagacagccac
+catgaatatccagccatgacattctatagccctgctgtgatgaattacagcattcccagcaatgtcactaac
+ttggaaggtgggcctggtcggcagacc---------------------acaagccca---------------
+---------------aatgtgttgtggccaacacctgggcacctttctcctttagtggtccatcgccagtta
+tcacatctgtat------------------------------------------------------------
+------------------------------------------------------------------------
+gcggaacctcaaaagagtccctggtgtgaagcaagatcgctagaacacaccttacctgtaaacagagagaca
+ctgaaa------------------------------aggaaggttagtgggaac------------------
+---------------------------cgttgcgccagccctgttactggtcca------------------
+------------------------------------------------------------------------
+---------------------------------------------------------ggttcaaagagggat
+gctcacttc---------------------------------------------------------------
+------------------------------------tgcgctgtctgcagcgattacgcatcgggatatcac
+tatggagtctggtcgtgtgaaggatgtaaggccttttttaaaagaagcattcaaggacataatgattatatt
+tgtccagctacaaatcagtgtacaatcgataaaaaccggcgcaagagctgccaggcctgccgacttcggaag
+tgttacgaagtgggaatggtgaagtgtggctcccggagagagagatgt---gggtaccgccttgtgcggaga
+cagagaagtgccgacgagcagctgcactgtgccggcaaggccaagagaagtggcggccac------------
+---------------------------gcgccccgagtgcgggagctgctgctggacgccctgagccccgag
+cagctagtgctcaccctcctggaggct---gagccgccccatgtgctgatcagc------------------
+------------------------------------------------------------------cgc---
+cccagtgcgcccttcaccgaggcctccatgatgatgtccctgaccaagttggccgacaaggagttggtacac
+atgatcagctgggccaagaagattcccggctttgtggagctcagcctgttcgaccaagtgcggctcttggag
+agctgttggatggaggtgttaatgatggggctgatgtggcgctcaattgac------caccccggcaagctc
+atctttgctccagatcttgttctggacagggatgaggggaaatgcgtagaaggaattctggaaatctttgac
+atgctcctggcaact---------acttcaaggtttcgagagttaaaactccaacacaaagaatatctctgt
+gtcaaggccatgatcctgctcaattccagtatgtaccctctggtcacagcgacc---caggatgctgacagc
+agccggaagctggctcacttgctgaacgccgtgaccgatgctttggtttgggtgattgccaagagcggcatc
+tcctcccagcagcaatccatgcgcctggctaacctcctgatgctcctgtcccacgtcaggcatgcgagtaac
+aagggcatggaacatctgctcaac------atgaagtgcaaaaatgtg---------gtcccagtgtatgac
+ctgctgctggagatgctgaatgcccacgtgcttcgcgggtgcaagtcctccatcacggggtccgagtgcagc
+ccggcagaggacagtaaaagcaaagagggctcccagaacccacagtctcagtga
+>EMBLCDS|AAK93056/1-1455 Drosophila melanogaster (fruit fly) GH28308p
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+---------------------------------atgtccgacggcgtcagcatcttgcacatcaaacaggag
+gtggacactccatcggcgtcctgctttagtcccagctccaagtcaacggccacgcagagtggcacaaacggc
+ctgaaa------------------------------------------tcctcgccc---------------
+---------------tcggtttcgccggaaaggcagctctgcagctcgacgacctctctatcctgcgatttg
+cacaatgtatcc------------------------------------------------------------
+---------------------------------------------------------ttaagcaatgatggc
+gatagtctgaaaggaagtggtacaagtggcggcaatggcggaggaggaggtggtggtacgagtggtggaaat
+gcgacc------------------------------------------------------------------
+------------------------------aatgcgagtgccggagctggatcg------------------
+------------------------------------------------------------------------
+---------------------------------------------------------ggatccgtcagggac
+gagctccgccgattg---------------------------------------------------------
+------------------------------------tgtttggtttgtggcgatgtggccagtggattccac
+tatggtgtggcgagttgtgaggcttgcaaagcgttctttaaacgcaccatccaaggcaacatcgagtacacg
+tgtccggcgaacaacgagtgtgagattaacaagcggagacgcaaggcctgccaagcgtgtcgcttccagaaa
+tgtctactaatgggcatgctcaaggagggtgtgcgcttggatcgagttcgtggaggacggcagaagtaccga
+aggaatcctgtatcaaactcttaccagactatgcagctgctataccaatccaacaccacctcgctg------
+---------------------------tgcgatgtcaagatactggaggtgctcaattcatatgagccggat
+gccttgagcgtccaaacg------------ccgccgccgcaagtccacacgactagcataactaatgatgag
+gcctcatcctcctcgggcagcataaaactggagtccagcgttgttacgcccaatgggacttgcattttccaa
+aacaacaacaacaatgatcccaatgagatactaagcgtccttagtgatatttacgacaaggaattggtcagc
+gtcattggctgggccaagcagatacctggctttatagatctgccacttaacgaccagatgaagcttctccag
+gtgtcgtgggcagagatcctgacgctccagctgaccttccggtccctaccg------ttcaatggcaagtta
+tgcttcgccacggatgtctggatggatgaacatttggccaaggagtgc---ggttacacggagttctactac
+cactgcgtccagatc---------gcacagcgcatggaaagaatatcgccacgaagggaggagtactacttg
+ctaaaggcgctcctgctggccaactgcgacattctgctg------------------gatgatcagagttcc
+ctgcgcgcatttcgtgatacgattcttaattctctaaacgatgtggtctacttgctgcgtcattcgtcggcc
+gtgtcgcatcagcaa---------------caattgctgcttttgctgccttcgctgcggcaggcggatgat
+atcctgcgaagattttggcgtgga------attgcacgcgatgaagtc---------attaccatgaagaaa
+ctgttcctcgagatgctcgag---------------------------------------------------
+---------------------------------------ccgctggccaggtga
+>EMBLCDS|BAA89539/1-2133 Anguilla japonica (Japanese eel) progesterone receptor
+------------------------------------------------------------------------
+------------------------------------------------------------atggacaacaat
+caccaagacaagatggaaagtctatacacgccagccagagcatcaccaactcctgatgcagaatcgattaaa
+agagccaggaatttgattaaaacatactcggagtcttttgggagttatgtggaggagatagttcgagacgac
+tcgaataacatacaatctttgagcagcgtccctctcttgatgcgtaattttggaaacatggacaccctaacc
+tgcgcacctggctcgggtagtgacagtgagatttggaaagactttgttgttcccgggaactctgtggtaagc
+aaagacacctgtggtcatgttgaaatatccactaaagccgaaaatttgtcttgggctgccgcgcccttaagt
+agagaagaaaccctcgcgaaaggaactgttacggtcccagcgactgtgcctaaagaaagttttaccgcaaca
+---------------tcaaacacttcttcagccagtggaatctctattaaagatgaacaacaatctttgctc
+aaaatggaaccacagtcttctgacttttgtccttatacagcaaatataccgaaattgaatccatcttatctg
+accaatactgcgagtacgaaacaacttggatatggc------------gaacagccg---------------
+---------------gacacttcagcgcactcctctccacctgctcagaagattgttttagatactgctcga
+tactcggccgat------------------------------------------------------------
+------------------------------------------ttatgttcggataaccctttaccgcaagcg
+acaaatatcaaaacagatccttgtagtagtttctcttctttcgttggagaagggatccttactagggcatct
+atgggctactcacagcaagcgattcagacattgccggtgcacaagagtgaaccg------------------
+---------------------------ttcaggttgtctgcttcgagcgcgcccgcggattctccgttttgg
+tgccaatcc---------------------------------------------------------------
+------------------------------------------------------acgggtccttctgaggat
+catcatctgcagattgactatctatctcccgctggactccacagcacatgcaaatacagttccacgaacgcg
+tacagctcctatttaggtgtgctgccccagagggtgtgcgtcatctgtggggatgaagcatcaggctgtcac
+tatggtgtcctcacctgtggcagctgtaaggtgttctttaagagggcagtggaaggccatcataactacttg
+tgtgctggacggaatgactgcatcgtggacaagatccgtaggaaaaactgtcctgcttgtcgcctcagaaag
+tgctaccaggcgggaatgatactgggaggtcggaagctgaagaagttg---ggggctctgaaggcagcaggg
+ctgacccaggccctggtggcccactcactgactcctcggaggctctctggtgacagccaggccctg------
+---------------------------atgcccctgggctgccttccaggggtccgggagctgcacctttcc
+ccacagatcatcagcgtgctggagagcattgagcctgaggtggtgtactctggt------------------
+------------------------------------------------------------------tatgac
+aactcccagcctgacatgcccaatatgctgctcaacagcctcaaccgcttatgtgagaggcagctgctgagg
+attgtcaagtggtccaagtctttaccaggttttcgcagtttacacatcaatgaccaaatggctctgatccag
+tactcctggatgagcttaatggtattttctttgggttggcggtctttccaaaatgtcaccagtgattacctg
+tactttgcacctgacctcattctcaacgaagagtatatgaggaggtct------------ccaatatttgac
+ctgtgcatggccatgcagttcatccctcaagagtttgccaatctccaggtgaccaaggaggagtttctgtgc
+atgaaggtcttgctgttgctcaac------acagtgcctctg---------------gaggggttgaagagc
+cagccacagtttgatgagatgaggcagaattacatccatgaactcaccaaggccattcacctgcgagagaat
+ggtgtggtcgcctgctcccagcgtttctaccacctgaccaagctgatggaccacatgcatgacattgtgaag
+aagctccacctgtactgcctgagcactttcattcaggcagatgccatgcgg------gtagagttccccgag
+atgatgtcagaagtcatcgcctcccagctg------------------------------------------
+------------cctcgggtgctcgctggaatggtgaaaccccttctttttcacaccaaatga
+>EMBLCDS|AHW56473/1-1590 Homo sapiens (human) partial estrogen receptor 2 isoform A
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------atggatataaaaaactcaccatctagccttaattctccttcctcctacaactgcagtcaatccatc
+------------------ttacccctggagcacggctccatatacataccttcctcctatgtagacagccac
+catgaatatccagccatgacattctatagccctgctgtgatgaattacagcattcccagcaatgtcactaac
+ttggaaggtgggcctggtcggcagacc---------------------acaagccca---------------
+---------------aatgtgttgtggccaacacctgggcacctttctcctttagtggtccatcgccagtta
+tcacatctgtat------------------------------------------------------------
+------------------------------------------------------------------------
+gcggaacctcaaaagagtccctggtgtgaagcaagatcgctagaacacaccttacctgtaaacagagagaca
+ctgaaa------------------------------aggaaggttagtgggaac------------------
+---------------------------cgttgcgccagccctgttactggtcca------------------
+------------------------------------------------------------------------
+---------------------------------------------------------ggttcaaagagggat
+gctcacttc---------------------------------------------------------------
+------------------------------------tgcgctgtctgcagcgattacgcatcgggatatcac
+tatggagtctggtcgtgtgaaggatgtaaggccttttttaaaagaagcattcaaggacataatgattatatt
+tgtccagctacaaatcagtgtacaatcgataaaaaccggcgcaagagctgccaggcctgccgacttcggaag
+tgttacgaagtgggaatggtgaagtgtggctcccggagagagagatgt---gggtaccgccttgtgcggaga
+cagagaagtgccgacgagcagctgcactgtgccggcaaggccaagagaagtggcggccac------------
+---------------------------gcgccccgagtgcgggagctgctgctggacgccctgagccccgag
+cagctagtgctcaccctcctggaggct---gagccgccccatgtgctgatcagc------------------
+------------------------------------------------------------------cgc---
+cccagtgcgcccttcaccgaggcctccatgatgatgtccctgaccaagttggccgacaaggagttggtacac
+atgatcagctgggccaagaagattcccggctttgtggagctcagcctgttcgaccaagtgcggctcttggag
+agctgttggatggaggtgttaatgatggggctgatgtggcgctcaattgac------caccccggcaagctc
+atctttgctccagatcttgttctggacagggatgaggggaaatgcgtagaaggaattctggaaatctttgac
+atgctcctggcaact---------acttcaaggtttcgagagttaaaactccaacacaaagaatatctctgt
+gtcaaggccatgatcctgctcaattccagtatgtaccctctggtcacagcgacc---caggatgctgacagc
+agccggaagctggctcacttgctgaacgccgtgaccgatgctttggtttgggtgattgccaagagcggcatc
+tcctcccagcagcaatccatgcgcctggctaacctcctgatgctcctgtcccacgtcaggcatgcgagtaac
+aagggcatggaacatctgctcaac------atgaagtgcaaaaatgtg---------gtcccagtgtatgac
+ctgctgctggagatgctgaatgcccacgtgcttcgcgggtgcaagtcctccatcacggggtccgagtgcagc
+ccggcagaggacagtaaaagcaaagagggctcccagaacccacagtctcag
+>EMBLCDS|BAA75464/1-2547 Anguilla japonica (Japanese eel) androgen receptor alpha
+atggagattccagttgggttaggaggagtttcagatgccacaaacgccgtttttcgcggaccttaccaaaac
+gttttccacagccttcaagtggcatttcagagtcacggtgccgtctccaggagcttagattttccaaataca
+aagtacggttttttacaaaacagacatttctgtgaaatgcgtcaggagaacaagcagccgccatgcaaagga
+ctcggcctattttacgggaaccatcgtaattcggacactgggacaaacgaagacgacatcgcttgtttttcc
+agacagtccgacgctgaagccagacctggtattttttctgaaagctcattggatactggagacgagattact
+tgcaaactccagtcagacaaccaaggggtaagagcgagcggtcctctcctaccgggctctagcggctgcaat
+tcgggacaaaagtcctcccttgcttgtacgtcccaacaaagggagacaacatctcaaagtgacacctgcgca
+ggagagagctgctcggaacatcaagcaactaccatttcggaaactgcgcgcgaattgtgcaacgccgtttcc
+gtgtcgctgggcttgaatttagatcttaatgatatgaatgacctaagttcaaaccaaatatcgtctaccgaa
+agtgacacaagtcaagccatctacttatttgaatcttcacctgggtatactggggtcggactgaacgccttg
+gtaagagactgtaaatgtcagagtgcacgcgaagggacatcgacacaacagtacgaccgcggggcaatgttt
+aagataaaccgtgtaaatgacttgccgcttcagccagcacccccgcgacacaccagcattagcgatgctaaa
+tgggacatggaagcaggtttgtgtgcgcagatggagcacaaagactctgaaaagtgcgcgaatatggatggt
+gcacactccacttctgtcttctcccagttcgaccaactgttgccagtaaacgcgtcgcactacagtcagaac
+gtttcggtcagagtggaaccacaaagtgatttctctccgattttgtacaaatcacctggtattcagaaaaat
+gccgaaaagtacaatgtccaatatgatgccacaattaaatcagaagatgggaaaacgacatctgaacgggaa
+tggggttttcagtacaggtacaatgaaagctgcagcacaccgtcagcacctcctagacattgtgcacatcag
+aacagggccggaccgtacaaccagttcttttttaatccatttgaatatgcgaaaagaggtgttgtctcaagg
+gaaggatattctctcgaacatgggttcccaaacaatctcgctcggacaccctactctggttccttgaaaaac
+gaactaggagatcgtctgagtgggccataccctgacgtcagttacaggtacgagggcgagcgggagaacgtg
+ttccccgtggagttcttctttccgccgcagaggacctgcctgatctgcggggacgaggcctcgggctgtcac
+tatggagccctcacctgcggcagctgcaaggtgttcttcaagagggccgcggaagggaaacagaagtacctg
+tgcgccagcatcaatgattgcaccattgataaacttcgaaggaagaactgcccctcttgccgtctcaaaagg
+tgctttgctgccggaatgaccctt---------------------------ggagcgcggaagctgaagaag
+atcgggcaaatgagggcccccgaggatggccaggggcagggcccggcggaagcggagctgagcgtc------
+---------------------------tcccccaagtacgacctg------------ggcttccacacccag
+tccatgttcctcaacatcctggaggccatcgagccggaggtggtgaacgccggg------------------
+------------------------------------------------------------------cacgac
+tatggccagccggactctgcggccagcctgctgaccagcctcaacgagctcggagaacggcaactcgtcaag
+gtcgtcaagtgggccaagggcatgccaggttttcggagtctgtacgtggatgaccagatgacagtcatccag
+cactcctggatggcagtgatggtgttcgctctgggctggaggtcatttaagaatgtgaagtccaggatgctt
+tactttgctcctgaccttgttttcaacgagcaccgaatgcaggtgtcc------------accatgtatgaa
+cactgcatccggatgaagaacttctcccaggagtttgctatgctgcaggtctcccaggaagagttcctgtgc
+atgaaagctctgcttctcttcagc------accatccccgtt---------------gaagggctgaagggg
+cagaatttctttgacgagctgcggaggagctacattaacgagctggaccggctggttagcttcaggagcaag
+tccagc------tgttccgagaggttccagcagctcacccgcctcctggactccctccaacctgttctgaag
+aagctccaccagtttacgttcgaccttttcgtccagtcccagaacctctccaaccaagtttgctttcccgag
+atgatctcagagatcatatccgtgcacgtg------------------------------------------
+------------ccaaagattctcgctggcacggtgaagccaatcctcttccacaagtag
+>EMBLCDS|AAA17402/1-1032 Serinus canaria (common canary) partial androgen receptor
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------gaagcctccgggtgccac
+tacggagccctgacgtgtgggagctgcaaagtgttcttcaaacgggcagctgaaggtaaacagaagtacctc
+tgtgccagccgcaacgactgcaccatcgacaagttccggcggaaaaactgcccctcctgccgcctgcgcaag
+tgctacgaggccgggatgacgctt---------------------------ggagcccgcaagctgaagaaa
+ctgggtaacctgaaggcacaggacgacatagagggagccagctcgtccagcccaacggaggagcaa------
+---------------------------gctcccaagctggtgatgacacgcattgatggctacgagtgccag
+cccatcttcctcaacgtcctggaggccatcgagcctggggtggtgtgtgctggc------------------
+------------------------------------------------------------------catgac
+aacagccagcctgactccttctccaacctgctgaccagcctgaatgagcttggggagaggcagctggtctac
+gtggtcaaatgggcaaaggctctgccaggatttcgcaacctgcatgtggatgaccagatgtcaataatccag
+tactcttggatgggcctgatggtgtttgctatggggtggagatccttcaccaacgtcaattccaggatgctt
+tactttgctccagacctggtcttcaatgagtaccgcatgcacaaatcc------------aggatgtacagc
+cagtgcatcaggatgcggcacctctcccaggaattcgggtggcttcagatcacaccccaggggttcctctgt
+atgaaggctctcctcttcttcagt------attattccagtg---------------gatggcctgaagaac
+cagaagctcttcgatgagctccgcatgaattacatcaaggaacttgaccgtatcattgcctgcaagaggaag
+aaccccacctcatgctcccggaggttttaccagctcaccaaggtcctggactccgtgactccgattgccaag
+gacctgcatcagtttacatttgatctcctaatcaaggcacacatggtgagc------gtggactacccagaa
+atgatggctgagatcatctctgtgcaggtt------------------------------------------
+------------cccaagatcctgtct
+>EMBLCDS|AAL37553/1-1455 Drosophila melanogaster (fruit fly) estrogen-related receptor
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+---------------------------------atgtccgacggcgtcagcatcttgcacatcaaacaggag
+gtggacactccatcggcgtcctgctttagtcccagctccaagtcaacggccacgcagagtggcacaaacggc
+ctgaaa------------------------------------------tcctcgccc---------------
+---------------tcggtttcgccggaaaggcagctctgcagctcgacgacctctctatcctgcgatttg
+cacaatgtatcc------------------------------------------------------------
+---------------------------------------------------------ttaagcaatgatggc
+gatagtctgaaaggaagtggtacaagtggcggcaatggcggaggaggaggtggtggtacgagtggtggaaat
+gcgacc------------------------------------------------------------------
+------------------------------aatgcgagtgccggagctggatcg------------------
+------------------------------------------------------------------------
+---------------------------------------------------------ggatccgtcagggac
+gagctccgccgattg---------------------------------------------------------
+------------------------------------tgtttggtttgtggcgatgtggccagtggattccac
+tatggtgtggcgagttgtgaggcttgcaaagcgttctttaaacgcaccatccaaggcaacatcgagtacacg
+tgtccggcgaacaacgagtgtgagattaacaagcggagacgcaaggcctgccaagcgtgtcgcttccagaaa
+tgtctactaatgggcatgctcaaggagggtgtgcgcttggatcgagttcgtggaggacggcagaagtaccga
+aggaatcctgtatcaaactcttaccagactatgcagctgctataccaatccaacaccacctcgctg------
+---------------------------tgcgatgtcaagatactggaggtgctcaattcatatgagccggat
+gccttgagcgtccaaacg------------ccgccgccgcaagtccacacgactagcataactaatgatgag
+gcctcatcctcctcgggcagcataaaactggagtccagcgttgttacgcccaatgggacttgcattttccaa
+aacaacaacaacaatgatcccaatgagatactaagcgtccttagtgatatttacgacaaggaattggtcagc
+gtcattggctgggccaagcagatacctggctttatagatctgccacttaacgaccagatgaagcttctccag
+gtgtcgtgggcagagatcctgacgctccagctgaccttccggtccctaccg------ttcaatggcaagtta
+tgcttcgccacggatgtctggatggatgaacatttggccaaggagtgc---ggttacacggagttctactac
+cactgcgtccagatc---------gcacagcgcatggaaagaatatcgccacgaagggaggagtactacttg
+ctaaaggcgctcctgctggccaactgcgacattctgctg------------------gatgatcagagttcc
+ctgcgcgcatttcgtgatacgattcttaattctctaaacgatgtggtctacttgctgcgtcattcgtcggcc
+gtgtcgcatcagcaa---------------caattgctgcttttgctgccttcgctgcggcaggcggatgat
+atcctgcgaagattttggcgtgga------attgcacgcgatgaagtc---------attaccatgaagaaa
+ctgttcctcgagatgctcgag---------------------------------------------------
+---------------------------------------ccgctggccaggtga
+>EMBLCDS|AAK20929/1-1662 Petromyzon marinus (sea lamprey) partial estrogen receptor
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+---------------------------------------------------------gcacgaggcttcagc
+gaggcacatggctacgagtactccggggcctcgctctaccagccactgcctccctcgtgcacagagttctca
+---------------------------------attggagctcatcaacaacaacaacatcagcaccagcat
+caccagcaccagcatcagcagcaccaccaccagcagcagcagcagcagccacagccgcagcagaatggagtt
+ttgggcgaggggcagagttcccatctctcttatcttccgccctcgaccgagctgccc---------------
+---------------cagtacgtgccctccagccccagcgcgccctacagcatggagctcggggcagggcgt
+cctcacggctacgac---------------------------------------------------------
+------------------------------------------ccagggccacagagcctctacaggggcggt
+gtggagagcagcgcccccccgtacagcgagcagcagcaggtggtgggcggcggcggagccatgtcggccatg
+ggcttg---------------------------------------acagagcca------------------
+---------------------------cgccacgtcagctccggatcgctaccc------------------
+------------------------------------------------------------------------
+---------------------------------------------------------agcagcacgaggccc
+gagcgcagcacccagttc------------------------------------------------------
+------------------------------------tgtgccgtgtgcagcgactatgcctcggggtaccac
+tacggcgtgtggtcctgcgagggctgcaaagccttcttcaagcgcagcacgcaaggccacaatgactacatg
+tgcccggccaccaaccagtgcaccatcgacaggaaccgtcgcaagagctgtcaggcttgccgcctgcgtaag
+tgctacgaagtgggcatggtcaaa---ggcgttcgcaaggaccgcaaa---ggctttcgaggggtcaagcac
+aaacgtaagcgccccatcccccaaaagaatgggggagaaggaggtgccggcggcggccaagacgtgagcgag
+acgaggcctcagggtgagaggccctccgggccgagggaccgggagagcgccgtcagctcactcgaggctgac
+caggtgatctcggctcttctggaggct---gagccacccaccgtactgtcctcg------------------
+------------------------------------------------------------------tatgac
+cccgacaagcctgtgacggaggcctcgctcatggctgctctcaccagcctggctgaccgagagctcgtgcac
+atgatcacctgggctaagaagattccaggattcacggccatcgggctgagtgaccaggtgcagctgctggag
+tgctgctggctggagatcctaatcgtggggctcatctggaggtctatcgat------cgccctggtcagctc
+cactttgctccaaacctcatcctaggaagggaggacgcgcgcaatgtggagggcatgctggacatgttcgac
+atgctgctcgtcacc---------gtgagtcgcttccgtgagctgcatctccgccgggaggaatacgtctgc
+ctcaaggccatgatcctcctcaactcgggggtgtttttctgcctctccaattccgccggggagcagacgaat
+gtgcagctcatccagcagatcctcgagaaggtgatggacgccctgggcagcaccatcggccacattgaggcg
+tccccgccgcaacactcgcgtcgcctctcccagctgctcctgctgctttcacagatccggcacattagcaac
+aagggcatcgagcatctcaacagc------atgaagcgtaagaatgtg---------atcccgctatacgac
+ctgctccttgagctgctggacgctcacagcctgcag---------------------aatactggcttacgg
+acgtcgcccccaccgcaggatttcagggcaaccctcgtgccg
diff --git a/utils/jalviewjs/site-resources/examples/estrogenReceptorCdna_frag.fa b/utils/jalviewjs/site-resources/examples/estrogenReceptorCdna_frag.fa
new file mode 100644 (file)
index 0000000..c44766d
--- /dev/null
@@ -0,0 +1,32 @@
+>EMBLCDS|ADZ17331/532-675 Homo sapiens (human) estrogen nuclear receptor beta variant a
+caaggacataatgattatatttgtccagctacaaatcagtgtacaatcgataaaaaccggcgcaagagctgc
+caggcctgccgacttcggaagtgttacgaagtgggaatggtgaagtgtggctcccggagagagagatgt---
+ggg
+>EMBLCDS|AAK93056/430-576 Drosophila melanogaster (fruit fly) GH28308p
+caaggcaacatcgagtacacgtgtccggcgaacaacgagtgtgagattaacaagcggagacgcaaggcctgc
+caagcgtgtcgcttccagaaatgtctactaatgggcatgctcaaggagggtgtgcgcttggatcgagttcgt
+gga
+>EMBLCDS|BAA89539/1111-1254 Anguilla japonica (Japanese eel) progesterone receptor
+gaaggccatcataactacttgtgtgctggacggaatgactgcatcgtggacaagatccgtaggaaaaactgt
+cctgcttgtcgcctcagaaagtgctaccaggcgggaatgatactgggaggtcggaagctgaagaagttg---
+ggg
+>EMBLCDS|AHW56473/532-675 Homo sapiens (human) partial estrogen receptor 2 isoform A
+caaggacataatgattatatttgtccagctacaaatcagtgtacaatcgataaaaaccggcgcaagagctgc
+caggcctgccgacttcggaagtgttacgaagtgggaatggtgaagtgtggctcccggagagagagatgt---
+ggg
+>EMBLCDS|BAA75464/1564-1683 Anguilla japonica (Japanese eel) androgen receptor alpha
+gaagggaaacagaagtacctgtgcgccagcatcaatgattgcaccattgataaacttcgaaggaagaactgc
+ccctcttgccgtctcaaaaggtgctttgctgccggaatgaccctt---------------------------
+gga
+>EMBLCDS|AAA17402/70-189 Serinus canaria (common canary) partial androgen receptor
+gaaggtaaacagaagtacctctgtgccagccgcaacgactgcaccatcgacaagttccggcggaaaaactgc
+ccctcctgccgcctgcgcaagtgctacgaggccgggatgacgctt---------------------------
+gga
+>EMBLCDS|AAL37553/430-576 Drosophila melanogaster (fruit fly) estrogen-related receptor
+caaggcaacatcgagtacacgtgtccggcgaacaacgagtgtgagattaacaagcggagacgcaaggcctgc
+caagcgtgtcgcttccagaaatgtctactaatgggcatgctcaaggagggtgtgcgcttggatcgagttcgt
+gga
+>EMBLCDS|AAK20929/592-732 Petromyzon marinus (sea lamprey) partial estrogen receptor
+caaggccacaatgactacatgtgcccggccaccaaccagtgcaccatcgacaggaaccgtcgcaagagctgt
+caggcttgccgcctgcgtaagtgctacgaagtgggcatggtcaaa---ggcgttcgcaaggaccgcaaa---
+ggc
diff --git a/utils/jalviewjs/site-resources/examples/estrogenReceptorProtein.aln b/utils/jalviewjs/site-resources/examples/estrogenReceptorProtein.aln
new file mode 100644 (file)
index 0000000..cfe7d80
--- /dev/null
@@ -0,0 +1,162 @@
+CLUSTAL
+
+UNIPROT|Q7LCB3/1-530 -------MDIKNSPSSLNSPSSYNCSQSILPLEHG-----------SIYIPSSYVDSHHE
+UNIPROT|Q9VSE9/1-484 ----------------------------------M-----------SDGVSILHIKQEVD
+UNIPROT|Q9IBD5/1-710 -----MDNNHQDKMESLYTPARASPTPDAESIKRARNLIKTYSESFGSYVEEIVRDDSNN
+UNIPROT|Q7LCB3/1-530 -------MDIKNSPSSLNSPSSYNCSQSILPLEHG-----------SIYIPSSYVDSHHE
+UNIPROT|Q9YGV9/1-848 MEIPVGLGGVSDATNAVFRGPYQNVFHSLQ----------------VAFQSHGAVSRSLD
+UNIPROT|Q90ZM7/1-438 -----------------------------------------------------GVEFQLP
+UNIPROT|Q91445/1-344 ------------------------------------------------------------
+UNIPROT|Q9VSE9/1-484 ----------------------------------M-----------SDGVSILHIKQEVD
+UNIPROT|Q90ZM8/1-554 ARGFSEAHGYEYSGASLYQPLPPSCTEFSI----------------GAHQQQQHQHQHHQ
+
+UNIPROT|Q7LCB3/1-530 YPAM--------------------------------------------TFYSPAVMNYSI
+UNIPROT|Q9VSE9/1-484 TPSA--------------------------------------------SCFSPSSKSTAT
+UNIPROT|Q9IBD5/1-710 IQSLSSVPLLMRNFGNMDTLTCAPGSGSDSEIWKDFVVPGNSVVSKD-TCGHVEISTKAE
+UNIPROT|Q7LCB3/1-530 YPAM--------------------------------------------TFYSPAVMNYSI
+UNIPROT|Q9YGV9/1-848 FPNTKYGFLQNRHFCEMRQENKQPPCKGLGLFYGNHRNSDTGTNEDDIACFSRQSDAEAR
+UNIPROT|Q90ZM7/1-438 YSASA-------------------------------------------TSFRPSVATSSA
+UNIPROT|Q91445/1-344 ------------------------------------------------------------
+UNIPROT|Q9VSE9/1-484 TPSA--------------------------------------------SCFSPSSKSTAT
+UNIPROT|Q90ZM8/1-554 HQHQ--------------------------------------------QHHHQQQQQQPQ
+
+UNIPROT|Q7LCB3/1-530 P---------SNVTNLEGGP-------GRQTTSPNVLWPTPGHLSPLVVHRQLSHLYAEP
+UNIPROT|Q9VSE9/1-484 Q---------SGTNGLKSSP----------SVSPERQLCSS--TTSLSCDLHNVSLSNDG
+UNIPROT|Q9IBD5/1-710 NLSWAAAPL-SREETLAKGTVTVPATVPKESFTATSNTSSASGIS--IKDEQQSLLKMEP
+UNIPROT|Q7LCB3/1-530 P---------SNVTNLEGGP-------GRQTTSPNVLWPTPGHLSPLVVHRQLSHLYAEP
+UNIPROT|Q9YGV9/1-848 PGIFSESSLDTGDEITCKLQSDNQGVRASGPLLPGSSGCNSGQKSSLACTSQQRETTSQS
+UNIPROT|Q90ZM7/1-438 ----------SGISNFSNGN----------------------------------------
+UNIPROT|Q91445/1-344 ------------------------------------------------------------
+UNIPROT|Q9VSE9/1-484 Q---------SGTNGLKSSP----------SVSPERQLCSS--TTSLSCDLHNVSLSNDG
+UNIPROT|Q90ZM8/1-554 P---------QQNGVLGEGQSSHLSYLPPSTELPQYVPSSPSAPYSMELGAGRPHGYDPG
+
+UNIPROT|Q7LCB3/1-530 QKSPWCE---------------------------------------------------AR
+UNIPROT|Q9VSE9/1-484 DS--------------------------------------------------------LK
+UNIPROT|Q9IBD5/1-710 QSSDFCPYTANIPKLNP-----------------------------------------SY
+UNIPROT|Q7LCB3/1-530 QKSPWCE---------------------------------------------------AR
+UNIPROT|Q9YGV9/1-848 DTCAGESCSEHQATTISETARELCNAVSVSLGLNLDLNDMNDLSSNQISSTESDTSQAIY
+UNIPROT|Q90ZM7/1-438 ----------------------------------------------------------NF
+UNIPROT|Q91445/1-344 ------------------------------------------------------------
+UNIPROT|Q9VSE9/1-484 DS--------------------------------------------------------LK
+UNIPROT|Q90ZM8/1-554 PQSLYRGGVE------------------------------------------------SS
+
+UNIPROT|Q7LCB3/1-530 SLEHTLPVNRETLKRKVSGNRCASPV----------------------------------
+UNIPROT|Q9VSE9/1-484 GSGTSGGNGGGGGGGTSGGNATNASA----------------------------------
+UNIPROT|Q9IBD5/1-710 LTNTASTKQLGYGEQPDTSAHSSPPA----------------------------------
+UNIPROT|Q7LCB3/1-530 SLEHTLPVNRETLKRKVSGNRCASPV----------------------------------
+UNIPROT|Q9YGV9/1-848 LFESSPGYTGVGLNALVRDCKCQSAREGTSTQQYDRGAMFKINRVNDLPLQPAPPRHTSI
+UNIPROT|Q90ZM7/1-438 GFLSPNGVQQDGFPYPGFTSPAQSSV----------------------------------
+UNIPROT|Q91445/1-344 ------------------------------------------------------------
+UNIPROT|Q9VSE9/1-484 GSGTSGGNGGGGGGGTSGGNATNASA----------------------------------
+UNIPROT|Q90ZM8/1-554 APPYSEQQQVVGGGGAMSAMGLTEPR----------------------------------
+
+UNIPROT|Q7LCB3/1-530 ------------------------------------------------------------
+UNIPROT|Q9VSE9/1-484 ------------------------------------------------------------
+UNIPROT|Q9IBD5/1-710 QKIVLDTARYSADLCSDNPLPQATNIKTDPCSSFSSFVGEGILTRASMGYSQQAIQTLPV
+UNIPROT|Q7LCB3/1-530 ------------------------------------------------------------
+UNIPROT|Q9YGV9/1-848 SDAKWDMEAGLCAQMEHKDSEKCANMDGAHSTSVFSQFDQLLPVNASHYSQNVSVRVEPQ
+UNIPROT|Q90ZM7/1-438 ------------------------------------------------------------
+UNIPROT|Q91445/1-344 ------------------------------------------------------------
+UNIPROT|Q9VSE9/1-484 ------------------------------------------------------------
+UNIPROT|Q90ZM8/1-554 ------------------------------------------------------------
+
+UNIPROT|Q7LCB3/1-530 ------------------------------------------------------------
+UNIPROT|Q9VSE9/1-484 ------------------------------------------------------------
+UNIPROT|Q9IBD5/1-710 HKSEPFRLSASSAPADSPFW----------------------------------------
+UNIPROT|Q7LCB3/1-530 ------------------------------------------------------------
+UNIPROT|Q9YGV9/1-848 SDFSPILYKSPGIQKNAEKYNVQYDATIKSEDGKTTSEREWGFQYRYNESCSTPSAPPRH
+UNIPROT|Q90ZM7/1-438 ------------------------------------------------------------
+UNIPROT|Q91445/1-344 ------------------------------------------------------------
+UNIPROT|Q9VSE9/1-484 ------------------------------------------------------------
+UNIPROT|Q90ZM8/1-554 ------------------------------------------------------------
+
+UNIPROT|Q7LCB3/1-530 --------------------------------------------TGPGSKRDA-------
+UNIPROT|Q9VSE9/1-484 -------------------------------------------GAGSGSVRDELR-----
+UNIPROT|Q9IBD5/1-710 -------------------------------------------CQSTGPSEDHHLQIDYL
+UNIPROT|Q7LCB3/1-530 --------------------------------------------TGPGSKRDA-------
+UNIPROT|Q9YGV9/1-848 CAHQNRAGPYNQFFFNPFEYAKRGVVSREGYSLEHGFPNNLARTPYSGSLKNELGDRLSG
+UNIPROT|Q90ZM7/1-438 ------------------------------------------------------------
+UNIPROT|Q91445/1-344 ------------------------------------------------------------
+UNIPROT|Q9VSE9/1-484 -------------------------------------------GAGSGSVRDELR-----
+UNIPROT|Q90ZM8/1-554 -------------------------------------------HVSSGSLPSSTRPE---
+
+UNIPROT|Q7LCB3/1-530 --------------------------HFCAVCSDYASGYHYGVWSCEGCKAFFKRSIQGH
+UNIPROT|Q9VSE9/1-484 --------------------------RLCLVCGDVASGFHYGVASCEACKAFFKRTIQGN
+UNIPROT|Q9IBD5/1-710 SPAGLHSTCKYSSTNAYSSYLGVLPQRVCVICGDEASGCHYGVLTCGSCKVFFKRAVEGH
+UNIPROT|Q7LCB3/1-530 --------------------------HFCAVCSDYASGYHYGVWSCEGCKAFFKRSIQGH
+UNIPROT|Q9YGV9/1-848 PYPDVSYRYEGERENVFPVEFFFPPQRTCLICGDEASGCHYGALTCGSCKVFFKRAAEGK
+UNIPROT|Q90ZM7/1-438 -----------------------PPQKACLICSDEASGCHYGVLTCGSCKVFFKRAVEGQ
+UNIPROT|Q91445/1-344 ----------------------------------EASGCHYGALTCGSCKVFFKRAAEGK
+UNIPROT|Q9VSE9/1-484 --------------------------RLCLVCGDVASGFHYGVASCEACKAFFKRTIQGN
+UNIPROT|Q90ZM8/1-554 -----------------------RSTQFCAVCSDYASGYHYGVWSCEGCKAFFKRSTQGH
+
+UNIPROT|Q7LCB3/1-530 NDYICPATNQCTIDKNRRKSCQACRLRKCYEVGMVKCGSRRER-CGYRLVRRQRSADEQL
+UNIPROT|Q9VSE9/1-484 IEYTCPANNECEINKRRRKACQACRFQKCLLMGMLKEGVRLDRVRGGRQKYRRNPVSNSY
+UNIPROT|Q9IBD5/1-710 HNYLCAGRNDCIVDKIRRKNCPACRLRKCYQAGMI---------LGGRKLKKLGALKAAG
+UNIPROT|Q7LCB3/1-530 NDYICPATNQCTIDKNRRKSCQACRLRKCYEVGMVKCGSRRER-CGYRLVRRQRSADEQL
+UNIPROT|Q9YGV9/1-848 QKYLCASINDCTIDKLRRKNCPSCRLKRCFAAGMT---------LGARKLKKIGQMRAPE
+UNIPROT|Q90ZM7/1-438 HNYLCAGRNDCIIDKIRRKNCPACRLRKCIQAGMT---------LGARKLKKQGRVKGEN
+UNIPROT|Q91445/1-344 QKYLCASRNDCTIDKFRRKNCPSCRLRKCYEAGMT---------LGARKLKKLGNLKAQD
+UNIPROT|Q9VSE9/1-484 IEYTCPANNECEINKRRRKACQACRFQKCLLMGMLKEGVRLDRVRGGRQKYRRNPVSNSY
+UNIPROT|Q90ZM8/1-554 NDYMCPATNQCTIDRNRRKSCQACRLRKCYEVGMVK-GVRKDR-KGFRGVKHKRKRPIPQ
+
+UNIPROT|Q7LCB3/1-530 HCAGKAKRSGGH------------------------APRVRELLLDALSPE--------Q
+UNIPROT|Q9VSE9/1-484 QTMQLLYQSNTTSLCDVKILEVLNSYEPDALSVQTPPPQVHTTSITNDEASSSSGSI--K
+UNIPROT|Q9IBD5/1-710 LTQALVAHSLTPRR---------LSGDSQALMPLGCLPGVRELHLS-------------P
+UNIPROT|Q7LCB3/1-530 HCAGKAKRSGGH------------------------APRVRELLLDALSPE--------Q
+UNIPROT|Q9YGV9/1-848 DGQGQGPAEAELSV----------------------SPKYDLGFHTQ------------S
+UNIPROT|Q90ZM7/1-438 QRSPASSTATTSSA--------------------TPQPSSNSTAVTTFSPPPTGEPIFSP
+UNIPROT|Q91445/1-344 DIEGASSSSPTEEQ----------------------APKLVMTRIDGYECQ--------P
+UNIPROT|Q9VSE9/1-484 QTMQLLYQSNTTSLCDVKILEVLNSYEPDALSVQTPPPQVHTTSITNDEASSSSGSI--K
+UNIPROT|Q90ZM8/1-554 KNGGEGGAGGGQDV-----------SETRPQGERPSGPRDRESAVSSLEAD--------Q
+
+UNIPROT|Q7LCB3/1-530 LVLTLLEA-EPPHVLISR-PSAPFTEASMMMSLTKLADKELVHMISWAKKIPGFVELSLF
+UNIPROT|Q9VSE9/1-484 LESSVVTP-NGTCIFQNNNNNDP---NEILSVLSDIYDKELVSVIGWAKQIPGFIDLPLN
+UNIPROT|Q9IBD5/1-710 QIISVLESIEPEVVYSGYDNSQPDMPNMLLNSLNRLCERQLLRIVKWSKSLPGFRSLHIN
+UNIPROT|Q7LCB3/1-530 LVLTLLEA-EPPHVLISR-PSAPFTEASMMMSLTKLADKELVHMISWAKKIPGFVELSLF
+UNIPROT|Q9YGV9/1-848 MFLNILEAIEPEVVNAGHDYGQPDSAASLLTSLNELGERQLVKVVKWAKGMPGFRSLYVD
+UNIPROT|Q90ZM7/1-438 TLIAILQAIEPEVVMSGYDNTRSQTTAYMLSSLNRLCDKQLVSIVKWAKSLPGFRNLHID
+UNIPROT|Q91445/1-344 IFLNVLEAIEPGVVCAGHDNSQPDSFSNLLTSLNELGERQLVYVVKWAKALPGFRNLHVD
+UNIPROT|Q9VSE9/1-484 LESSVVTP-NGTCIFQNNNNNDP---NEILSVLSDIYDKELVSVIGWAKQIPGFIDLPLN
+UNIPROT|Q90ZM8/1-554 VISALLEA-EPPTVLSSYDPDKPVTEASLMAALTSLADRELVHMITWAKKIPGFTAIGLS
+
+UNIPROT|Q7LCB3/1-530 DQVRLLESCWMEVLMMGLMWRSIDH--PGKLIFAPDLVLDRDEGKCVEGILEIFDMLLA-
+UNIPROT|Q9VSE9/1-484 DQMKLLQVSWAEILTLQLTFRSLPF--NGKLCFATDVWMDEHLAKEC-GYTEFYYHCVQ-
+UNIPROT|Q9IBD5/1-710 DQMALIQYSWMSLMVFSLGWRSFQNVTSDYLYFAPDLILNEEYMRRS----PIFDLCMAM
+UNIPROT|Q7LCB3/1-530 DQVRLLESCWMEVLMMGLMWRSIDH--PGKLIFAPDLVLDRDEGKCVEGILEIFDMLLA-
+UNIPROT|Q9YGV9/1-848 DQMTVIQHSWMAVMVFALGWRSFKNVKSRMLYFAPDLVFNEHRMQVS----TMYEHCIRM
+UNIPROT|Q90ZM7/1-438 DQMVLIQYSWMGLMSFAMSWRSFQHTNSKLLYFAPDLVFDETRMQQS----AMYQLCVEM
+UNIPROT|Q91445/1-344 DQMSIIQYSWMGLMVFAMGWRSFTNVNSRMLYFAPDLVFNEYRMHKS----RMYSQCIRM
+UNIPROT|Q9VSE9/1-484 DQMKLLQVSWAEILTLQLTFRSLPF--NGKLCFATDVWMDEHLAKEC-GYTEFYYHCVQ-
+UNIPROT|Q90ZM8/1-554 DQVQLLECCWLEILIVGLIWRSIDR--PGQLHFAPNLILGREDARNVEGMLDMFDMLLV-
+
+UNIPROT|Q7LCB3/1-530 --TTSRFRELKLQHKEYLCVKAMILLNSSMYPLVTATQDADSSRKL-AHLLNAVTDALVW
+UNIPROT|Q9VSE9/1-484 --IAQRMERISPRREEYYLLKALLLANC------DILLDDQSSLRAFRDTILNSLNDVVY
+UNIPROT|Q9IBD5/1-710 QFIPQEFANLQVTKEEFLCMKVLLLLN-------TVPLEGLKSQPQFDEMRQNYIHELTK
+UNIPROT|Q7LCB3/1-530 --TTSRFRELKLQHKEYLCVKAMILLNSSMYPLVTATQDADSSRKL-AHLLNAVTDALVW
+UNIPROT|Q9YGV9/1-848 KNFSQEFAMLQVSQEEFLCMKALLLFS-------TIPVEGLKGQNFFDELRRSYINELDR
+UNIPROT|Q90ZM7/1-438 RQVSEDFMKLQVTSEEFLCMKAILLLS-------TVPQEGLKSQGCFEEMRISYIRELNR
+UNIPROT|Q91445/1-344 RHLSQEFGWLQITPQGFLCMKALLFFS-------IIPVDGLKNQKLFDELRMNYIKELDR
+UNIPROT|Q9VSE9/1-484 --IAQRMERISPRREEYYLLKALLLANC------DILLDDQSSLRAFRDTILNSLNDVVY
+UNIPROT|Q90ZM8/1-554 --TVSRFRELHLRREEYVCLKAMILLNSGVFFCLSNSAGEQTNVQLIQQILEKVMDALGS
+
+UNIPROT|Q7LCB3/1-530 VIAKSGISSQQQSMRLANLLMLLSHVRHASNKGMEHLLNMKCKNV-----VPVYDLLLEM
+UNIPROT|Q9VSE9/1-484 LLRHSSAVSHQQ-----QLLLLLPSLRQADDILRRFWRGIARDEV-----ITMKKLFLEM
+UNIPROT|Q9IBD5/1-710 AIHLRENGVVACSQRFYHLTKLMDHMHDIVKKLHLYCLSTFIQADAMR--VEFPEMMSEV
+UNIPROT|Q7LCB3/1-530 VIAKSGISSQQQSMRLANLLMLLSHVRHASNKGMEHLLNMKCKNV-----VPVYDLLLEM
+UNIPROT|Q9YGV9/1-848 LVSFRSK--SSCSERFQQLTRLLDSLQPVLKKLHQFTFDLFVQSQNLSNQVCFPEMISEI
+UNIPROT|Q90ZM7/1-438 TIARTEKNAVQCWQRFYQLTKLLXCMQDLVSKLLEFCFATFTQTQVWS--VEFPDMMAEI
+UNIPROT|Q91445/1-344 IIACKRKNPTSCSRRFYQLTKVLDSVTPIAKDLHQFTFDLLIKAHMVS--VDYPEMMAEI
+UNIPROT|Q9VSE9/1-484 LLRHSSAVSHQQ-----QLLLLLPSLRQADDILRRFWRGIARDEV-----ITMKKLFLEM
+UNIPROT|Q90ZM8/1-554 TIGHIEASPPQHSRRLSQLLLLLSQIRHISNKGIEHLNSMKRKNV-----IPLYDLLLEL
+
+UNIPROT|Q7LCB3/1-530 LNAHVLRGCKSSITGSECSPAEDSKSKEGSQNPQSQ---
+UNIPROT|Q9VSE9/1-484 LE------------------------------PLAR---
+UNIPROT|Q9IBD5/1-710 IASQL------------------PRVLAGMVKPLLFHTK
+UNIPROT|Q7LCB3/1-530 LNAHVLRGCKSSITGSECSPAEDSKSKEGSQNPQSQ---
+UNIPROT|Q9YGV9/1-848 ISVHV------------------PKILAGTVKPILFHK-
+UNIPROT|Q90ZM7/1-438 ISAQL------------------ASHHGREARALHFHKK
+UNIPROT|Q91445/1-344 ISVQV------------------PKILS-----------
+UNIPROT|Q9VSE9/1-484 LE------------------------------PLAR---
+UNIPROT|Q90ZM8/1-554 LDAHSLQN-----TGLRTSPP--PQDFRATLVP------
+
diff --git a/utils/jalviewjs/site-resources/examples/estrogenReceptorProtein.fa b/utils/jalviewjs/site-resources/examples/estrogenReceptorProtein.fa
new file mode 100644 (file)
index 0000000..0541d39
--- /dev/null
@@ -0,0 +1,81 @@
+>UNIPROT|Q7LCB3/1-530 estrogen nuclear receptor beta variant a
+MDIKNSPSSLNSPSSYNCSQSILPLEHGSIYIPSSYVDSHHEYPAMTFYSPAVMNYSIPSNVTNLEGGPGRQ
+TTSPNVLWPTPGHLSPLVVHRQLSHLYAEPQKSPWCEARSLEHTLPVNRETLKRKVSGNRCASPVTGPGSKR
+DAHFCAVCSDYASGYHYGVWSCEGCKAFFKRSIQGHNDYICPATNQCTIDKNRRKSCQACRLRKCYEVGMVK
+CGSRRERCGYRLVRRQRSADEQLHCAGKAKRSGGHAPRVRELLLDALSPEQLVLTLLEAEPPHVLISRPSAP
+FTEASMMMSLTKLADKELVHMISWAKKIPGFVELSLFDQVRLLESCWMEVLMMGLMWRSIDHPGKLIFAPDL
+VLDRDEGKCVEGILEIFDMLLATTSRFRELKLQHKEYLCVKAMILLNSSMYPLVTATQDADSSRKLAHLLNA
+VTDALVWVIAKSGISSQQQSMRLANLLMLLSHVRHASNKGMEHLLNMKCKNVVPVYDLLLEMLNAHVLRGCK
+SSITGSECSPAEDSKSKEGSQNPQSQ
+>UNIPROT|Q9VSE9/1-484 GH28308p
+MSDGVSILHIKQEVDTPSASCFSPSSKSTATQSGTNGLKSSPSVSPERQLCSSTTSLSCDLHNVSLSNDGDS
+LKGSGTSGGNGGGGGGGTSGGNATNASAGAGSGSVRDELRRLCLVCGDVASGFHYGVASCEACKAFFKRTIQ
+GNIEYTCPANNECEINKRRRKACQACRFQKCLLMGMLKEGVRLDRVRGGRQKYRRNPVSNSYQTMQLLYQSN
+TTSLCDVKILEVLNSYEPDALSVQTPPPQVHTTSITNDEASSSSGSIKLESSVVTPNGTCIFQNNNNNDPNE
+ILSVLSDIYDKELVSVIGWAKQIPGFIDLPLNDQMKLLQVSWAEILTLQLTFRSLPFNGKLCFATDVWMDEH
+LAKECGYTEFYYHCVQIAQRMERISPRREEYYLLKALLLANCDILLDDQSSLRAFRDTILNSLNDVVYLLRH
+SSAVSHQQQLLLLLPSLRQADDILRRFWRGIARDEVITMKKLFLEMLEPLAR
+>UNIPROT|Q9IBD5/1-710 progesterone receptor
+MDNNHQDKMESLYTPARASPTPDAESIKRARNLIKTYSESFGSYVEEIVRDDSNNIQSLSSVPLLMRNFGNM
+DTLTCAPGSGSDSEIWKDFVVPGNSVVSKDTCGHVEISTKAENLSWAAAPLSREETLAKGTVTVPATVPKES
+FTATSNTSSASGISIKDEQQSLLKMEPQSSDFCPYTANIPKLNPSYLTNTASTKQLGYGEQPDTSAHSSPPA
+QKIVLDTARYSADLCSDNPLPQATNIKTDPCSSFSSFVGEGILTRASMGYSQQAIQTLPVHKSEPFRLSASS
+APADSPFWCQSTGPSEDHHLQIDYLSPAGLHSTCKYSSTNAYSSYLGVLPQRVCVICGDEASGCHYGVLTCG
+SCKVFFKRAVEGHHNYLCAGRNDCIVDKIRRKNCPACRLRKCYQAGMILGGRKLKKLGALKAAGLTQALVAH
+SLTPRRLSGDSQALMPLGCLPGVRELHLSPQIISVLESIEPEVVYSGYDNSQPDMPNMLLNSLNRLCERQLL
+RIVKWSKSLPGFRSLHINDQMALIQYSWMSLMVFSLGWRSFQNVTSDYLYFAPDLILNEEYMRRSPIFDLCM
+AMQFIPQEFANLQVTKEEFLCMKVLLLLNTVPLEGLKSQPQFDEMRQNYIHELTKAIHLRENGVVACSQRFY
+HLTKLMDHMHDIVKKLHLYCLSTFIQADAMRVEFPEMMSEVIASQLPRVLAGMVKPLLFHTK
+>UNIPROT|Q7LCB3/1-530 estrogen receptor 2 isoform A
+MDIKNSPSSLNSPSSYNCSQSILPLEHGSIYIPSSYVDSHHEYPAMTFYSPAVMNYSIPSNVTNLEGGPGRQ
+TTSPNVLWPTPGHLSPLVVHRQLSHLYAEPQKSPWCEARSLEHTLPVNRETLKRKVSGNRCASPVTGPGSKR
+DAHFCAVCSDYASGYHYGVWSCEGCKAFFKRSIQGHNDYICPATNQCTIDKNRRKSCQACRLRKCYEVGMVK
+CGSRRERCGYRLVRRQRSADEQLHCAGKAKRSGGHAPRVRELLLDALSPEQLVLTLLEAEPPHVLISRPSAP
+FTEASMMMSLTKLADKELVHMISWAKKIPGFVELSLFDQVRLLESCWMEVLMMGLMWRSIDHPGKLIFAPDL
+VLDRDEGKCVEGILEIFDMLLATTSRFRELKLQHKEYLCVKAMILLNSSMYPLVTATQDADSSRKLAHLLNA
+VTDALVWVIAKSGISSQQQSMRLANLLMLLSHVRHASNKGMEHLLNMKCKNVVPVYDLLLEMLNAHVLRGCK
+SSITGSECSPAEDSKSKEGSQNPQSQ
+>UNIPROT|Q9YGV9/1-848 androgen receptor alpha
+MEIPVGLGGVSDATNAVFRGPYQNVFHSLQVAFQSHGAVSRSLDFPNTKYGFLQNRHFCEMRQENKQPPCKG
+LGLFYGNHRNSDTGTNEDDIACFSRQSDAEARPGIFSESSLDTGDEITCKLQSDNQGVRASGPLLPGSSGCN
+SGQKSSLACTSQQRETTSQSDTCAGESCSEHQATTISETARELCNAVSVSLGLNLDLNDMNDLSSNQISSTE
+SDTSQAIYLFESSPGYTGVGLNALVRDCKCQSAREGTSTQQYDRGAMFKINRVNDLPLQPAPPRHTSISDAK
+WDMEAGLCAQMEHKDSEKCANMDGAHSTSVFSQFDQLLPVNASHYSQNVSVRVEPQSDFSPILYKSPGIQKN
+AEKYNVQYDATIKSEDGKTTSEREWGFQYRYNESCSTPSAPPRHCAHQNRAGPYNQFFFNPFEYAKRGVVSR
+EGYSLEHGFPNNLARTPYSGSLKNELGDRLSGPYPDVSYRYEGERENVFPVEFFFPPQRTCLICGDEASGCH
+YGALTCGSCKVFFKRAAEGKQKYLCASINDCTIDKLRRKNCPSCRLKRCFAAGMTLGARKLKKIGQMRAPED
+GQGQGPAEAELSVSPKYDLGFHTQSMFLNILEAIEPEVVNAGHDYGQPDSAASLLTSLNELGERQLVKVVKW
+AKGMPGFRSLYVDDQMTVIQHSWMAVMVFALGWRSFKNVKSRMLYFAPDLVFNEHRMQVSTMYEHCIRMKNF
+SQEFAMLQVSQEEFLCMKALLLFSTIPVEGLKGQNFFDELRRSYINELDRLVSFRSKSSCSERFQQLTRLLD
+SLQPVLKKLHQFTFDLFVQSQNLSNQVCFPEMISEIISVHVPKILAGTVKPILFHK
+>UNIPROT|Q90ZM7/1-438 corticoid receptor
+GVEFQLPYSASATSFRPSVATSSASGISNFSNGNNFGFLSPNGVQQDGFPYPGFTSPAQSSVPPQKACLICS
+DEASGCHYGVLTCGSCKVFFKRAVEGQHNYLCAGRNDCIIDKIRRKNCPACRLRKCIQAGMTLGARKLKKQG
+RVKGENQRSPASSTATTSSATPQPSSNSTAVTTFSPPPTGEPIFSPTLIAILQAIEPEVVMSGYDNTRSQTT
+AYMLSSLNRLCDKQLVSIVKWAKSLPGFRNLHIDDQMVLIQYSWMGLMSFAMSWRSFQHTNSKLLYFAPDLV
+FDETRMQQSAMYQLCVEMRQVSEDFMKLQVTSEEFLCMKAILLLSTVPQEGLKSQGCFEEMRISYIRELNRT
+IARTEKNAVQCWQRFYQLTKLLXCMQDLVSKLLEFCFATFTQTQVWSVEFPDMMAEIISAQLASHHGREARA
+LHFHKK
+>UNIPROT|Q91445/1-344 androgen receptor
+EASGCHYGALTCGSCKVFFKRAAEGKQKYLCASRNDCTIDKFRRKNCPSCRLRKCYEAGMTLGARKLKKLGN
+LKAQDDIEGASSSSPTEEQAPKLVMTRIDGYECQPIFLNVLEAIEPGVVCAGHDNSQPDSFSNLLTSLNELG
+ERQLVYVVKWAKALPGFRNLHVDDQMSIIQYSWMGLMVFAMGWRSFTNVNSRMLYFAPDLVFNEYRMHKSRM
+YSQCIRMRHLSQEFGWLQITPQGFLCMKALLFFSIIPVDGLKNQKLFDELRMNYIKELDRIIACKRKNPTSC
+SRRFYQLTKVLDSVTPIAKDLHQFTFDLLIKAHMVSVDYPEMMAEIISVQVPKILS
+>UNIPROT|Q9VSE9/1-484 estrogen-related receptor
+MSDGVSILHIKQEVDTPSASCFSPSSKSTATQSGTNGLKSSPSVSPERQLCSSTTSLSCDLHNVSLSNDGDS
+LKGSGTSGGNGGGGGGGTSGGNATNASAGAGSGSVRDELRRLCLVCGDVASGFHYGVASCEACKAFFKRTIQ
+GNIEYTCPANNECEINKRRRKACQACRFQKCLLMGMLKEGVRLDRVRGGRQKYRRNPVSNSYQTMQLLYQSN
+TTSLCDVKILEVLNSYEPDALSVQTPPPQVHTTSITNDEASSSSGSIKLESSVVTPNGTCIFQNNNNNDPNE
+ILSVLSDIYDKELVSVIGWAKQIPGFIDLPLNDQMKLLQVSWAEILTLQLTFRSLPFNGKLCFATDVWMDEH
+LAKECGYTEFYYHCVQIAQRMERISPRREEYYLLKALLLANCDILLDDQSSLRAFRDTILNSLNDVVYLLRH
+SSAVSHQQQLLLLLPSLRQADDILRRFWRGIARDEVITMKKLFLEMLEPLAR
+>UNIPROT|Q90ZM8/1-554 estrogen receptor
+ARGFSEAHGYEYSGASLYQPLPPSCTEFSIGAHQQQQHQHQHHQHQHQQHHHQQQQQQPQPQQNGVLGEGQS
+SHLSYLPPSTELPQYVPSSPSAPYSMELGAGRPHGYDPGPQSLYRGGVESSAPPYSEQQQVVGGGGAMSAMG
+LTEPRHVSSGSLPSSTRPERSTQFCAVCSDYASGYHYGVWSCEGCKAFFKRSTQGHNDYMCPATNQCTIDRN
+RRKSCQACRLRKCYEVGMVKGVRKDRKGFRGVKHKRKRPIPQKNGGEGGAGGGQDVSETRPQGERPSGPRDR
+ESAVSSLEADQVISALLEAEPPTVLSSYDPDKPVTEASLMAALTSLADRELVHMITWAKKIPGFTAIGLSDQ
+VQLLECCWLEILIVGLIWRSIDRPGQLHFAPNLILGREDARNVEGMLDMFDMLLVTVSRFRELHLRREEYVC
+LKAMILLNSGVFFCLSNSAGEQTNVQLIQQILEKVMDALGSTIGHIEASPPQHSRRLSQLLLLLSQIRHISN
+KGIEHLNSMKRKNVIPLYDLLLELLDAHSLQNTGLRTSPPPQDFRATLVP
diff --git a/utils/jalviewjs/site-resources/examples/estrogenReceptorProtein_aln.fa b/utils/jalviewjs/site-resources/examples/estrogenReceptorProtein_aln.fa
new file mode 100644 (file)
index 0000000..353c68c
--- /dev/null
@@ -0,0 +1,112 @@
+>UNIPROT|Q7LCB3/1-530 estrogen nuclear receptor beta variant a
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+--------------------------MDIKNSPSSLNSPSSYNCSQSI------LPLEHGSIYIPSSYVDSH
+HEYPAMTFYSPAVMNYSIPSNVTNLEGGPGRQT-------TSP----------NVLWPTPGHLSPLVVHRQL
+SHLY--------------------------------------------AEPQKSPWCEARSLEHTLPVNRET
+LK----------RKVSGN---------------RCASPVTGP------------------------------
+-------------------GSKRDAHF---------------------------------CAVCSDYASGYH
+YGVWSCEGCKAFFKRSIQGHNDYICPATNQCTIDKNRRKSCQACRLRKCYEVGMVKCGSRRERC-GYRLVRR
+QRSADEQLHCAGKAKRSGGH-------------APRVRELLLDALSPEQLVLTLLEA-EPPHVLIS------
+----------------------R-PSAPFTEASMMMSLTKLADKELVHMISWAKKIPGFVELSLFDQVRLLE
+SCWMEVLMMGLMWRSID--HPGKLIFAPDLVLDRDEGKCVEGILEIFDMLLAT---TSRFRELKLQHKEYLC
+VKAMILLNSSMYPLVTAT-QDADSSRKLAHLLNAVTDALVWVIAKSGISSQQQSMRLANLLMLLSHVRHASN
+KGMEHLLN--MKCKNV---VPVYDLLLEMLNAHVLRGCKSSITGSECSPAEDSKSKEGSQNPQSQ---
+>UNIPROT|Q9VSE9/1-484 GH28308p
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+-----------------------------------------------------------MSDGVSILHIKQE
+VDTPSASCFSPSSKSTATQSGTNGLK--------------SSP----------SVSPERQLCSSTTSLSCDL
+HNVS---------------------------------------LSNDGDSLKGSGTSGGNGGGGGGGTSGGN
+AT--------------------------------NASAGAGS------------------------------
+-------------------GSVRDELRRL-------------------------------CLVCGDVASGFH
+YGVASCEACKAFFKRTIQGNIEYTCPANNECEINKRRRKACQACRFQKCLLMGMLKEGVRLDRVRGGRQKYR
+RNPVSNSYQTMQLLYQSNTTSL-----------CDVKILEVLNSYEPDALSVQT----PPPQVHTTSITNDE
+ASSSSGSIKLESSVVTPNGTCIFQNNNNNDPNEILSVLSDIYDKELVSVIGWAKQIPGFIDLPLNDQMKLLQ
+VSWAEILTLQLTFRSLP--FNGKLCFATDVWMDEHLAKEC-GYTEFYYHCVQI---AQRMERISPRREEYYL
+LKALLLANCDILL------DDQSSLRAFRDTILNSLNDVVYLLRHSSAVSHQQ-----QLLLLLPSLRQADD
+ILRRFWRG--IARDEV---ITMKKLFLEMLE------------------------------PLAR---
+>UNIPROT|Q9IBD5/1-710 progesterone receptor
+--------------------------------------------MDNNHQDKMESLYTPARASPTPDAESIK
+RARNLIKTYSESFGSYVEEIVRDDSNNIQSLSSVPLLMRNFGNMDTLTCAPGSGSDSEIWKDFVVPGNSVVS
+KDTCGHVEISTKAENLSWAAAPLSREETLAKGTVTVPATVPKESFTAT-----SNTSSASGISIKDEQQSLL
+KMEPQSSDFCPYTANIPKLNPSYLTNTASTKQLGYG----EQP----------DTSAHSSPPAQKIVLDTAR
+YSAD----------------------------------LCSDNPLPQATNIKTDPCSSFSSFVGEGILTRAS
+MGYSQQAIQTLPVHKSEP---------------FRLSASSAPADSPFWCQS---------------------
+------------------TGPSEDHHLQIDYLSPAGLHSTCKYSSTNAYSSYLGVLPQRVCVICGDEASGCH
+YGVLTCGSCKVFFKRAVEGHHNYLCAGRNDCIVDKIRRKNCPACRLRKCYQAGMILGGRKLKKL-GALKAAG
+LTQALVAHSLTPRRLSGDSQAL-----------MPLGCLPGVRELHLSPQIISVLESIEPEVVYSG------
+----------------------YDNSQPDMPNMLLNSLNRLCERQLLRIVKWSKSLPGFRSLHINDQMALIQ
+YSWMSLMVFSLGWRSFQNVTSDYLYFAPDLILNEEYMRRS----PIFDLCMAMQFIPQEFANLQVTKEEFLC
+MKVLLLLN--TVPL-----EGLKSQPQFDEMRQNYIHELTKAIHLRENGVVACSQRFYHLTKLMDHMHDIVK
+KLHLYCLSTFIQADAMR--VEFPEMMSEVIASQL------------------PRVLAGMVKPLLFHTK
+>UNIPROT|Q7LCB3/1-530 estrogen receptor 2 isoform A
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+--------------------------MDIKNSPSSLNSPSSYNCSQSI------LPLEHGSIYIPSSYVDSH
+HEYPAMTFYSPAVMNYSIPSNVTNLEGGPGRQT-------TSP----------NVLWPTPGHLSPLVVHRQL
+SHLY--------------------------------------------AEPQKSPWCEARSLEHTLPVNRET
+LK----------RKVSGN---------------RCASPVTGP------------------------------
+-------------------GSKRDAHF---------------------------------CAVCSDYASGYH
+YGVWSCEGCKAFFKRSIQGHNDYICPATNQCTIDKNRRKSCQACRLRKCYEVGMVKCGSRRERC-GYRLVRR
+QRSADEQLHCAGKAKRSGGH-------------APRVRELLLDALSPEQLVLTLLEA-EPPHVLIS------
+----------------------R-PSAPFTEASMMMSLTKLADKELVHMISWAKKIPGFVELSLFDQVRLLE
+SCWMEVLMMGLMWRSID--HPGKLIFAPDLVLDRDEGKCVEGILEIFDMLLAT---TSRFRELKLQHKEYLC
+VKAMILLNSSMYPLVTAT-QDADSSRKLAHLLNAVTDALVWVIAKSGISSQQQSMRLANLLMLLSHVRHASN
+KGMEHLLN--MKCKNV---VPVYDLLLEMLNAHVLRGCKSSITGSECSPAEDSKSKEGSQNPQSQ---
+>UNIPROT|Q9YGV9/1-848 androgen receptor alpha
+MEIPVGLGGVSDATNAVFRGPYQNVFHSLQVAFQSHGAVSRSLDFPNTKYGFLQNRHFCEMRQENKQPPCKG
+LGLFYGNHRNSDTGTNEDDIACFSRQSDAEARPGIFSESSLDTGDEITCKLQSDNQGVRASGPLLPGSSGCN
+SGQKSSLACTSQQRETTSQSDTCAGESCSEHQATTISETARELCNAVSVSLGLNLDLNDMNDLSSNQISSTE
+SDTSQAIYLFESSPGYTGVGLNALVRDCKCQSAREGTSTQQYDRGAMFKINRVNDLPLQPAPPRHTSISDAK
+WDMEAGLCAQMEHKDSEKCANMDGAHSTSVFSQFDQLLPVNASHYSQNVSVRVEPQSDFSPILYKSPGIQKN
+AEKYNVQYDATIKSEDGKTTSEREWGFQYRYNESCSTPSAPPRHCAHQNRAGPYNQFFFNPFEYAKRGVVSR
+EGYSLEHGFPNNLARTPYSGSLKNELGDRLSGPYPDVSYRYEGERENVFPVEFFFPPQRTCLICGDEASGCH
+YGALTCGSCKVFFKRAAEGKQKYLCASINDCTIDKLRRKNCPSCRLKRCFAAGMTL---------GARKLKK
+IGQMRAPEDGQGQGPAEAELSV-----------SPKYDL----GFHTQSMFLNILEAIEPEVVNAG------
+----------------------HDYGQPDSAASLLTSLNELGERQLVKVVKWAKGMPGFRSLYVDDQMTVIQ
+HSWMAVMVFALGWRSFKNVKSRMLYFAPDLVFNEHRMQVS----TMYEHCIRMKNFSQEFAMLQVSQEEFLC
+MKALLLFS--TIPV-----EGLKGQNFFDELRRSYINELDRLVSFRSKSS--CSERFQQLTRLLDSLQPVLK
+KLHQFTFDLFVQSQNLSNQVCFPEMISEIISVHV------------------PKILAGTVKPILFHK-
+>UNIPROT|Q91445/1-344 androgen receptor
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+------------------------------------------------------------------EASGCH
+YGALTCGSCKVFFKRAAEGKQKYLCASRNDCTIDKFRRKNCPSCRLRKCYEAGMTL---------GARKLKK
+LGNLKAQDDIEGASSSSPTEEQ-----------APKLVMTRIDGYECQPIFLNVLEAIEPGVVCAG------
+----------------------HDNSQPDSFSNLLTSLNELGERQLVYVVKWAKALPGFRNLHVDDQMSIIQ
+YSWMGLMVFAMGWRSFTNVNSRMLYFAPDLVFNEYRMHKS----RMYSQCIRMRHLSQEFGWLQITPQGFLC
+MKALLFFS--IIPV-----DGLKNQKLFDELRMNYIKELDRIIACKRKNPTSCSRRFYQLTKVLDSVTPIAK
+DLHQFTFDLLIKAHMVS--VDYPEMMAEIISVQV------------------PKILS-----------
+>UNIPROT|Q9VSE9/1-484 estrogen-related receptor
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+-----------------------------------------------------------MSDGVSILHIKQE
+VDTPSASCFSPSSKSTATQSGTNGLK--------------SSP----------SVSPERQLCSSTTSLSCDL
+HNVS---------------------------------------LSNDGDSLKGSGTSGGNGGGGGGGTSGGN
+AT--------------------------------NASAGAGS------------------------------
+-------------------GSVRDELRRL-------------------------------CLVCGDVASGFH
+YGVASCEACKAFFKRTIQGNIEYTCPANNECEINKRRRKACQACRFQKCLLMGMLKEGVRLDRVRGGRQKYR
+RNPVSNSYQTMQLLYQSNTTSL-----------CDVKILEVLNSYEPDALSVQT----PPPQVHTTSITNDE
+ASSSSGSIKLESSVVTPNGTCIFQNNNNNDPNEILSVLSDIYDKELVSVIGWAKQIPGFIDLPLNDQMKLLQ
+VSWAEILTLQLTFRSLP--FNGKLCFATDVWMDEHLAKEC-GYTEFYYHCVQI---AQRMERISPRREEYYL
+LKALLLANCDILL------DDQSSLRAFRDTILNSLNDVVYLLRHSSAVSHQQ-----QLLLLLPSLRQADD
+ILRRFWRG--IARDEV---ITMKKLFLEMLE------------------------------PLAR---
+>UNIPROT|Q90ZM8/1-554 estrogen receptor
+------------------------------------------------------------------------
+------------------------------------------------------------------------
+-------------------ARGFSEAHGYEYSGASLYQPLPPSCTEFS-----------IGAHQQQQHQHQH
+HQHQHQQHHHQQQQQQPQPQQNGVLGEGQSSHLSYLPPSTELP----------QYVPSSPSAPYSMELGAGR
+PHGYD---------------------------------PGPQSLYRGGVESSAPPYSEQQQVVGGGGAMSAM
+GL-------------TEP---------------RHVSSGSLP------------------------------
+-------------------SSTRPERSTQF------------------------------CAVCSDYASGYH
+YGVWSCEGCKAFFKRSTQGHNDYMCPATNQCTIDRNRRKSCQACRLRKCYEVGMVK-GVRKDRK-GFRGVKH
+KRKRPIPQKNGGEGGAGGGQDVSETRPQGERPSGPRDRESAVSSLEADQVISALLEA-EPPTVLSS------
+----------------------YDPDKPVTEASLMAALTSLADRELVHMITWAKKIPGFTAIGLSDQVQLLE
+CCWLEILIVGLIWRSID--RPGQLHFAPNLILGREDARNVEGMLDMFDMLLVT---VSRFRELHLRREEYVC
+LKAMILLNSGVFFCLSNSAGEQTNVQLIQQILEKVMDALGSTIGHIEASPPQHSRRLSQLLLLLSQIRHISN
+KGIEHLNS--MKRKNV---IPLYDLLLELLDAHSLQ-------NTGLRTSPPPQDFRATLVP------
diff --git a/utils/jalviewjs/site-resources/examples/estrogenReceptorProtein_frag.fa b/utils/jalviewjs/site-resources/examples/estrogenReceptorProtein_frag.fa
new file mode 100644 (file)
index 0000000..efd89bf
--- /dev/null
@@ -0,0 +1,16 @@
+>UNIPROT|Q7LCB3/178-225 estrogen nuclear receptor beta variant a
+QGHNDYICPATNQCTIDKNRRKSCQACRLRKCYEVGMVKCGSRRERC-G
+>UNIPROT|Q9VSE9/144-192 GH28308p
+QGNIEYTCPANNECEINKRRRKACQACRFQKCLLMGMLKEGVRLDRVRG
+>UNIPROT|Q9IBD5/371-418 progesterone receptor
+EGHHNYLCAGRNDCIVDKIRRKNCPACRLRKCYQAGMILGGRKLKKL-G
+>UNIPROT|Q7LCB3/178-225 estrogen receptor 2 isoform A
+QGHNDYICPATNQCTIDKNRRKSCQACRLRKCYEVGMVKCGSRRERC-G
+>UNIPROT|Q9YGV9/522-561 androgen receptor alpha
+EGKQKYLCASINDCTIDKLRRKNCPSCRLKRCFAAGMTL---------G
+>UNIPROT|Q91445/24-63 androgen receptor
+EGKQKYLCASRNDCTIDKFRRKNCPSCRLRKCYEAGMTL---------G
+>UNIPROT|Q9VSE9/144-192 estrogen-related receptor
+QGNIEYTCPANNECEINKRRRKACQACRFQKCLLMGMLKEGVRLDRVRG
+>UNIPROT|Q90ZM8/198-244 estrogen receptor
+QGHNDYMCPATNQCTIDRNRRKSCQACRLRKCYEVGMVK-GVRKDRK-G
diff --git a/utils/jalviewjs/site-resources/examples/example.json b/utils/jalviewjs/site-resources/examples/example.json
new file mode 100644 (file)
index 0000000..93c19db
--- /dev/null
@@ -0,0 +1 @@
+{"seqs":[{"name":"FER_CAPAN/3-34","start":3,"svid":"1.0","end":34,"id":"1665704504","seq":"SVSATMISTSFMPRKPAVTSL-KPIPNVGE--ALF","order":1},{"name":"FER1_SOLLC/3-34","start":3,"svid":"1.0","end":34,"id":"1003594867","seq":"SISGTMISTSFLPRKPAVTSL-KAISNVGE--ALF","order":2},{"name":"Q93XJ9_SOLTU/3-34","start":3,"svid":"1.0","end":34,"id":"1332961135","seq":"SISGTMISTSFLPRKPVVTSL-KAISNVGE--ALF","order":3},{"name":"FER1_PEA/6-37","start":6,"svid":"1.0","end":37,"id":"1335040546","seq":"ALYGTAVSTSFLRTQPMPMSV-TTTKAFSN--GFL","order":4},{"name":"Q7XA98_TRIPR/6-39","start":6,"svid":"1.0","end":39,"id":"1777084554","seq":"ALYGTAVSTSFMRRQPVPMSV-ATTTTTKAFPSGF","order":5},{"name":"FER_TOCH/3-34","start":3,"svid":"1.0","end":34,"id":"823528539","seq":"FILGTMISKSFLFRKPAVTSL-KAISNVGE--ALF","order":6}],"appSettings":{"globalColorScheme":"zappo","webStartUrl":"www.jalview.org/services/launchApp","application":"Jalview","hiddenSeqs":"823528539","showSeqFeatures":"true","version":"2.9","hiddenCols":"32-33;34-34"},"seqGroups":[{"displayText":true,"startRes":21,"groupName":"JGroup:1883305585","endRes":29,"colourText":false,"sequenceRefs":["1003594867","1332961135","1335040546","1777084554"],"svid":"1.0","showNonconserved":false,"colourScheme":"Zappo","displayBoxes":true}],"alignAnnotation":[{"svid":"1.0","annotations":[{"displayCharacter":"","value":0,"secondaryStructure":"\u0000"},{"displayCharacter":"","value":0,"secondaryStructure":"\u0000"},{"displayCharacter":"α","value":0,"secondaryStructure":"H"},{"displayCharacter":"α","value":0,"secondaryStructure":"H"},{"displayCharacter":"α","value":0,"secondaryStructure":"H"},{"displayCharacter":"","value":0,"secondaryStructure":"\u0000"},{"displayCharacter":"","value":0,"secondaryStructure":"\u0000"},{"displayCharacter":"","value":0,"secondaryStructure":"\u0000"},{"displayCharacter":"β","value":0,"secondaryStructure":"E"},{"displayCharacter":"β","value":0,"secondaryStructure":"E"},{"displayCharacter":"β","value":0,"secondaryStructure":"E"},{"displayCharacter":"β","value":0,"secondaryStructure":"E"},{"displayCharacter":"β","value":0,"secondaryStructure":"E"},{"displayCharacter":"β","value":0,"secondaryStructure":"E"},{"displayCharacter":"β","value":0,"secondaryStructure":"E"},{"displayCharacter":"β","value":0,"secondaryStructure":"E"},{"displayCharacter":"","value":0,"secondaryStructure":"\u0000"},{"displayCharacter":"","value":0,"secondaryStructure":"\u0000"},{"displayCharacter":"","value":0,"secondaryStructure":"\u0000"},{"displayCharacter":"","value":0,"secondaryStructure":"\u0000"},{"displayCharacter":"","value":0,"secondaryStructure":"\u0000"},{"displayCharacter":"","value":0,"secondaryStructure":"\u0000"},{"displayCharacter":"","value":0,"secondaryStructure":"\u0000"},{"displayCharacter":"","value":0,"secondaryStructure":"\u0000"},{"displayCharacter":"","value":0,"secondaryStructure":"\u0000"},{"displayCharacter":"","value":0,"secondaryStructure":"\u0000"},{"displayCharacter":"α","value":0,"secondaryStructure":"H"},{"displayCharacter":"α","value":0,"secondaryStructure":"H"},{"displayCharacter":"α","value":0,"secondaryStructure":"H"},{"displayCharacter":"α","value":0,"secondaryStructure":"H"},{"displayCharacter":"α","value":0,"secondaryStructure":"H"},{"displayCharacter":"","value":0,"secondaryStructure":"\u0000"},{"displayCharacter":"","value":0,"secondaryStructure":"\u0000"},{"displayCharacter":"","value":0,"secondaryStructure":"\u0000"},{"displayCharacter":"","value":0,"secondaryStructure":"\u0000"}],"description":"New description","label":"Secondary Structure"}],"svid":"1.0","seqFeatures":[{"fillColor":"#7d1633","score":0,"otherDetails":{"status":"+"},"sequenceRef":"1332961135","featureGroup":"Pfam","svid":"1.0","description":"My description","xStart":0,"xEnd":0,"type":"Domain"},{"fillColor":"#7d1633","score":0,"sequenceRef":"1332961135","featureGroup":"Jalview","svid":"1.0","description":"theDesc","xStart":3,"xEnd":13,"type":"feature_x"},{"fillColor":"#7d1633","score":0,"sequenceRef":"1335040546","featureGroup":"Jalview","svid":"1.0","description":"theDesc","xStart":3,"xEnd":13,"type":"feature_x"},{"fillColor":"#7d1633","score":0,"sequenceRef":"1777084554","featureGroup":"Jalview","svid":"1.0","description":"theDesc","xStart":3,"xEnd":13,"type":"feature_x"}]}
\ No newline at end of file
diff --git a/utils/jalviewjs/site-resources/examples/ferredoxin.nw b/utils/jalviewjs/site-resources/examples/ferredoxin.nw
new file mode 100644 (file)
index 0000000..89ea348
--- /dev/null
@@ -0,0 +1 @@
+(((FER_BRANA:128.0,FER3_RAPSA:128.0):50.75,FER_CAPAA:178.75):121.94443,(Q93Z60_ARATH:271.45456,((O80429_MAIZE:183.0,FER1_MAIZE:183.0):30.5,((Q7XA98_TRIPR:90.0,FER1_PEA:90.0):83.32143,(((FER1_ARATH:64.0,FER2_ARATH:64.0):94.375,(FER1_SPIOL:124.5,FER1_MESCR:124.5):33.875):6.4166718,((Q93XJ9_SOLTU:33.5,FER1_SOLLC:33.5):49.0,FER_CAPAN:82.5):82.29167):8.529755):40.178574):57.95456):29.239868);
diff --git a/utils/jalviewjs/site-resources/examples/jpred_msa.fasta b/utils/jalviewjs/site-resources/examples/jpred_msa.fasta
new file mode 100644 (file)
index 0000000..b269404
--- /dev/null
@@ -0,0 +1,45 @@
+>FER_CAPAA Ferredoxin
+ASYKVKLITPDGPIEFDCPDDVYILDQAEEAGHDLPYSCRAGSCSSCAGKIAGGAVDQTDGNFLDDDQLEEG
+WVLTCVAYPQSDVTIETHKEAELVG-
+>FER_CAPAN Ferredoxin, chloroplast precursor
+ASYKVKLITPDGPIEFDCPDNVYILDQAEEAGHDLPYSCRAGSCSSCAGKIAGGAVDQTDGNFLDDDQLEEG
+WVLTCVAYPQSDVTIETHKEAELVG-
+>FER1_SOLLC Ferredoxin-1, chloroplast precursor
+ASYKVKLITPEGPIEFECPDDVYILDQAEEEGHDLPYSCRAGSCSSCAGKVTAGSVDQSDGNFLDEDQEAAG
+FVLTCVAYPKGDVTIETHKEEELTA-
+>Q93XJ9_SOLTU Ferredoxin I precursor
+ASYKVKLITPDGPIEFECPDDVYILDQAEEEGHDLPYSCRAGSCSSCAGKVTAGTVDQSDGKFLDDDQEAAG
+FVLTCVAYPKCDVTIETHKEEELTA-
+>FER1_MESCR Ferredoxin-1, chloroplast precursor
+AAYKVTLVTPEGKQELECPDDVYILDAAEEAGIDLPYSCRAGSCSSCAGKVTSGSVNQDDGSFLDDDQIKEG
+WVLTCVAYPTGDVTIETHKEEELTA-
+>FER1_SPIOL Ferredoxin-1, chloroplast precursor
+AAYKVTLVTPTGNVEFQCPDDVYILDAAEEEGIDLPYSCRAGSCSSCAGKLKTGSLNQDDQSFLDDDQIDEG
+WVLTCAAYPVSDVTIETHKEEELTA-
+>FER1_ARATH Ferredoxin-1, chloroplast precursor
+ATYKVKFITPEGELEVECDDDVYVLDAAEEAGIDLPYSCRAGSCSSCAGKVVSGSVDQSDQSFLDDEQIGEG
+FVLTCAAYPTSDVTIETHKEEDIV--
+>FER2_ARATH Ferredoxin-2, chloroplast precursor
+ATYKVKFITPEGEQEVECEEDVYVLDAAEEAGLDLPYSCRAGSCSSCAGKVVSGSIDQSDQSFLDDEQMSEG
+YVLTCVAYPTSDVVIETHKEEAIM--
+>FER1_PEA Ferredoxin-1, chloroplast precursor
+ASYKVKLVTPDGTQEFECPSDVYILDHAEEVGIDLPYSCRAGSCSSCAGKVVGGEVDQSDGSFLDDEQIEAG
+FVLTCVAYPTSDVVIETHKEEDLTA-
+>Q7XA98_TRIPR Ferredoxin I
+ATYKVKLITPEGPQEFDCPDDVYILDHAEEVGIELPYSCRAGSCSSCAGKVVNGNVNQEDGSFLDDEQIEGG
+WVLTCVAFPTSDVTIETHKEEELTA-
+>FER1_MAIZE Ferredoxin-1, chloroplast precursor
+ATYNVKLITPEGEVELQVPDDVYILDQAEEDGIDLPYSCRAGSCSSCAGKVVSGSVDQSDQSYLDDGQIADG
+WVLTCHAYPTSDVVIETHKEEELTGA
+>O80429_MAIZE Ferredoxin
+ATYNVKLITPEGEVELQVPDDVYILDFAEEEGIDLPFSCRAGSCSSCAGKVVSGSVDQSDQSFLNDNQVADG
+WVLTCAAYPTSDVVIETHKEDDLL--
+>Q93Z60_ARATH At1g10960/T19D16_12
+ATYKVKFITPEGEQEVECEEDVYVLDAAEEAGLDLPYSCRAGSCSSCAGKVVSGSIDQSDQSFLDD------
+--------------------------
+>FER3_RAPSA Ferredoxin, leaf L-A
+ATYKVKFITPEGEQEVECDDDVYVLDAAEEAGIDLPYSCRAGSCSSCAGKVVSGSVDQSDQSFLDDDQIAEG
+FVLTCAAYPTSDVTIETHREEDMV--
+>FER_BRANA Ferredoxin
+ATYKVKFITPEGEQEVECDDDVYVLDAAEEAGIDLPYSCRAGSCSSCAGKVVSGFVDQSDESFLDDDQIAEG
+FVLTCAAYPTSDVTIETHKEEELV--
diff --git a/utils/jalviewjs/site-resources/examples/jpred_msa.seq.concise b/utils/jalviewjs/site-resources/examples/jpred_msa.seq.concise
new file mode 100644 (file)
index 0000000..90bd4c3
--- /dev/null
@@ -0,0 +1,30 @@
+Lupas_21:-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,
+Lupas_14:-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,
+Lupas_28:-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,
+
+jnetpred:-,-,-,-,E,E,E,E,E,E,-,-,-,-,-,E,E,E,E,-,-,-,-,E,E,E,E,E,-,H,H,H,H,H,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,E,E,E,E,-,-,E,E,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,E,E,E,E,E,E,E,E,-,-,-,-,E,E,E,E,-,
+JNETCONF:1,3,1,2,7,7,9,9,7,1,6,8,9,8,1,3,5,5,1,6,8,9,7,4,8,8,7,2,3,2,0,2,1,2,5,7,8,8,7,6,4,2,1,3,5,7,8,7,5,4,4,5,7,5,2,5,5,1,4,2,0,1,5,6,7,7,5,4,5,4,5,6,6,3,1,1,1,4,6,1,6,9,9,9,8,8,7,0,8,9,9,7,2,8,9,9,8,
+JNETSOL25:B,-,B,-,-,B,B,B,B,B,-,-,-,-,-,-,-,-,-,-,-,-,-,-,B,B,B,B,-,B,-,B,-,-,-,-,-,-,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,-,-,B,-,-,-,-,-,-,-,-,-,-,-,-,B,B,-,-,-,-,-,-,B,-,-,B,B,B,B,B,B,B,B,B,B,-,-,-,-,B,B,-,-,
+JNETSOL5:-,-,-,-,-,-,-,B,B,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,B,-,-,-,-,-,-,-,-,-,-,-,-,-,-,B,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,B,B,B,B,B,B,-,-,-,-,-,-,-,B,-,-,
+JNETSOL0:-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,B,-,B,-,-,-,-,-,-,-,-,-,-,-,-,-,
+JNETPROPH:0.44514,0.02676,0.50891,0.59931,0.03767,0.31300,0.54697,0.01490,0.41391,0.55820,0.01816,0.38620,0.82780,0.00804,0.16764,0.86436,0.00416,0.14111,0.96423,0.00391,0.03569,0.94587,0.00483,0.05758,0.88110,0.01273,0.13718,0.57335,0.02654,0.44509,0.17935,0.02373,0.80108,0.08085,0.00825,0.91351,0.06739,0.00450,0.93803,0.11202,0.00730,0.88142,0.41953,0.00953,0.55868,0.64171,0.00894,0.34807,0.74660,0.00831,0.27522,0.78367,0.00952,0.27786,0.54376,0.01578,0.49285,0.18080,0.01695,0.78463,0.05922,0.01157,0.90794,0.03565,0.02045,0.91548,0.12377,0.02896,0.77671,0.58102,0.05600,0.22143,0.82750,0.03376,0.07013,0.86371,0.02169,0.08984,0.81881,0.04410,0.14200,0.60784,0.05837,0.36725,0.27275,0.10034,0.53452,0.12405,0.28672,0.44961,0.07683,0.43094,0.40783,0.05134,0.55252,0.37353,0.03890,
+JNETPROPB:0.59931,0.03767,0.31300,0.54697,0.01490,0.41391,0.55820,0.01816,0.38620,0.82780,0.00804,0.16764,0.86436,0.00416,0.14111,0.96423,0.00391,0.03569,0.94587,0.00483,0.05758,0.88110,0.01273,0.13718,0.57335,0.02654,0.44509,0.17935,0.02373,0.80108,0.08085,0.00825,0.91351,0.06739,0.00450,0.93803,0.11202,0.00730,0.88142,0.41953,0.00953,0.55868,0.64171,0.00894,0.34807,0.74660,0.00831,0.27522,0.78367,0.00952,0.27786,0.54376,0.01578,0.49285,0.18080,0.01695,0.78463,0.05922,0.01157,0.90794,0.03565,0.02045,0.91548,0.12377,0.02896,0.77671,0.58102,0.05600,0.22143,0.82750,0.03376,0.07013,0.86371,0.02169,0.08984,0.81881,0.04410,0.14200,0.60784,0.05837,0.36725,0.27275,0.10034,0.53452,0.12405,0.28672,0.44961,0.07683,0.43094,0.40783,0.05134,0.55252,0.37353,0.03890,0.52815,0.46401,0.03979,
+JNETPROPC:0.54697,0.01490,0.41391,0.55820,0.01816,0.38620,0.82780,0.00804,0.16764,0.86436,0.00416,0.14111,0.96423,0.00391,0.03569,0.94587,0.00483,0.05758,0.88110,0.01273,0.13718,0.57335,0.02654,0.44509,0.17935,0.02373,0.80108,0.08085,0.00825,0.91351,0.06739,0.00450,0.93803,0.11202,0.00730,0.88142,0.41953,0.00953,0.55868,0.64171,0.00894,0.34807,0.74660,0.00831,0.27522,0.78367,0.00952,0.27786,0.54376,0.01578,0.49285,0.18080,0.01695,0.78463,0.05922,0.01157,0.90794,0.03565,0.02045,0.91548,0.12377,0.02896,0.77671,0.58102,0.05600,0.22143,0.82750,0.03376,0.07013,0.86371,0.02169,0.08984,0.81881,0.04410,0.14200,0.60784,0.05837,0.36725,0.27275,0.10034,0.53452,0.12405,0.28672,0.44961,0.07683,0.43094,0.40783,0.05134,0.55252,0.37353,0.03890,0.52815,0.46401,0.03979,0.40515,0.56556,0.03815,
+JNETHMM:-,-,-,-,E,E,E,E,E,E,-,-,-,-,-,E,E,E,E,-,-,-,-,E,E,E,E,E,-,-,H,H,H,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,E,E,E,E,-,-,E,E,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,E,E,E,E,E,E,E,E,-,-,-,-,E,E,E,E,-,
+JNETALIGN:-,-,-,E,E,E,E,E,-,-,-,-,-,-,E,-,-,-,-,-,-,E,E,E,E,H,H,H,H,H,-,-,-,-,-,-,-,E,-,-,-,-,-,-,-,-,-,-,-,-,E,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,H,-,-,-,-,-,-,E,E,E,E,E,E,-,-,-,-,-,E,E,E,E,E,E,H,H,H,-,-,-,-,
+align1;Sequence0/1.97:A,S,Y,K,V,K,L,I,T,P,D,G,P,I,E,F,D,C,P,D,D,V,Y,I,L,D,Q,A,E,E,A,G,H,D,L,P,Y,S,C,R,A,G,S,C,S,S,C,A,G,K,I,A,G,G,A,V,D,Q,T,D,G,N,F,L,D,D,D,Q,L,E,E,G,W,V,L,T,C,V,A,Y,P,Q,S,D,V,T,I,E,T,H,K,E,A,E,L,V,G,
+align2;Sequence1/1.144:A,S,Y,K,V,K,L,I,T,P,D,G,P,I,E,F,D,C,P,D,N,V,Y,I,L,D,Q,A,E,E,A,G,H,D,L,P,Y,S,C,R,A,G,S,C,S,S,C,A,G,K,I,A,G,G,A,V,D,Q,T,D,G,N,F,L,D,D,D,Q,L,E,E,G,W,V,L,T,C,V,A,Y,P,Q,S,D,V,T,I,E,T,H,K,E,A,E,L,V,G,
+align3;Sequence2/1.144:A,S,Y,K,V,K,L,I,T,P,E,G,P,I,E,F,E,C,P,D,D,V,Y,I,L,D,Q,A,E,E,E,G,H,D,L,P,Y,S,C,R,A,G,S,C,S,S,C,A,G,K,V,T,A,G,S,V,D,Q,S,D,G,N,F,L,D,E,D,Q,E,A,A,G,F,V,L,T,C,V,A,Y,P,K,G,D,V,T,I,E,T,H,K,E,E,E,L,T,A,
+align4;Sequence3/1.144:A,S,Y,K,V,K,L,I,T,P,D,G,P,I,E,F,E,C,P,D,D,V,Y,I,L,D,Q,A,E,E,E,G,H,D,L,P,Y,S,C,R,A,G,S,C,S,S,C,A,G,K,V,T,A,G,T,V,D,Q,S,D,G,K,F,L,D,D,D,Q,E,A,A,G,F,V,L,T,C,V,A,Y,P,K,C,D,V,T,I,E,T,H,K,E,E,E,L,T,A,
+align5;Sequence4/1.149:A,S,Y,K,V,K,L,V,T,P,D,G,T,Q,E,F,E,C,P,S,D,V,Y,I,L,D,H,A,E,E,V,G,I,D,L,P,Y,S,C,R,A,G,S,C,S,S,C,A,G,K,V,V,G,G,E,V,D,Q,S,D,G,S,F,L,D,D,E,Q,I,E,A,G,F,V,L,T,C,V,A,Y,P,T,S,D,V,V,I,E,T,H,K,E,E,D,L,T,A,
+align6;Sequence5/1.152:A,T,Y,K,V,K,L,I,T,P,E,G,P,Q,E,F,D,C,P,D,D,V,Y,I,L,D,H,A,E,E,V,G,I,E,L,P,Y,S,C,R,A,G,S,C,S,S,C,A,G,K,V,V,N,G,N,V,N,Q,E,D,G,S,F,L,D,D,E,Q,I,E,G,G,W,V,L,T,C,V,A,F,P,T,S,D,V,T,I,E,T,H,K,E,E,E,L,T,A,
+align7;Sequence6/1.148:A,A,Y,K,V,T,L,V,T,P,E,G,K,Q,E,L,E,C,P,D,D,V,Y,I,L,D,A,A,E,E,A,G,I,D,L,P,Y,S,C,R,A,G,S,C,S,S,C,A,G,K,V,T,S,G,S,V,N,Q,D,D,G,S,F,L,D,D,D,Q,I,K,E,G,W,V,L,T,C,V,A,Y,P,T,G,D,V,T,I,E,T,H,K,E,E,E,L,T,A,
+align8;Sequence7/1.147:A,A,Y,K,V,T,L,V,T,P,T,G,N,V,E,F,Q,C,P,D,D,V,Y,I,L,D,A,A,E,E,E,G,I,D,L,P,Y,S,C,R,A,G,S,C,S,S,C,A,G,K,L,K,T,G,S,L,N,Q,D,D,Q,S,F,L,D,D,D,Q,I,D,E,G,W,V,L,T,C,A,A,Y,P,V,S,D,V,T,I,E,T,H,K,E,E,E,L,T,A,
+align9;Sequence8/1.96:A,T,Y,K,V,K,F,I,T,P,E,G,E,Q,E,V,E,C,D,D,D,V,Y,V,L,D,A,A,E,E,A,G,I,D,L,P,Y,S,C,R,A,G,S,C,S,S,C,A,G,K,V,V,S,G,S,V,D,Q,S,D,Q,S,F,L,D,D,D,Q,I,A,E,G,F,V,L,T,C,A,A,Y,P,T,S,D,V,T,I,E,T,H,R,E,E,D,M,V,.,
+align10;Sequence9/1.148:A,T,Y,K,V,K,F,I,T,P,E,G,E,L,E,V,E,C,D,D,D,V,Y,V,L,D,A,A,E,E,A,G,I,D,L,P,Y,S,C,R,A,G,S,C,S,S,C,A,G,K,V,V,S,G,S,V,D,Q,S,D,Q,S,F,L,D,D,E,Q,I,G,E,G,F,V,L,T,C,A,A,Y,P,T,S,D,V,T,I,E,T,H,K,E,E,D,I,V,.,
+align11;Sequence10/1.96:A,T,Y,K,V,K,F,I,T,P,E,G,E,Q,E,V,E,C,D,D,D,V,Y,V,L,D,A,A,E,E,A,G,I,D,L,P,Y,S,C,R,A,G,S,C,S,S,C,A,G,K,V,V,S,G,F,V,D,Q,S,D,E,S,F,L,D,D,D,Q,I,A,E,G,F,V,L,T,C,A,A,Y,P,T,S,D,V,T,I,E,T,H,K,E,E,E,L,V,.,
+align12;Sequence11/1.148:A,T,Y,K,V,K,F,I,T,P,E,G,E,Q,E,V,E,C,E,E,D,V,Y,V,L,D,A,A,E,E,A,G,L,D,L,P,Y,S,C,R,A,G,S,C,S,S,C,A,G,K,V,V,S,G,S,I,D,Q,S,D,Q,S,F,L,D,D,E,Q,M,S,E,G,Y,V,L,T,C,V,A,Y,P,T,S,D,V,V,I,E,T,H,K,E,E,A,I,M,.,
+align13;Sequence12/1.118:A,T,Y,K,V,K,F,I,T,P,E,G,E,Q,E,V,E,C,E,E,D,V,Y,V,L,D,A,A,E,E,A,G,L,D,L,P,Y,S,C,R,A,G,S,C,S,S,C,A,G,K,V,V,S,G,S,I,D,Q,S,D,Q,S,F,L,D,D,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,
+align14;Sequence13/1.150:A,T,Y,N,V,K,L,I,T,P,E,G,E,V,E,L,Q,V,P,D,D,V,Y,I,L,D,Q,A,E,E,D,G,I,D,L,P,Y,S,C,R,A,G,S,C,S,S,C,A,G,K,V,V,S,G,S,V,D,Q,S,D,Q,S,Y,L,D,D,G,Q,I,A,D,G,W,V,L,T,C,H,A,Y,P,T,S,D,V,V,I,E,T,H,K,E,E,E,L,T,G,
+align15;Sequence14/1.140:A,T,Y,N,V,K,L,I,T,P,E,G,E,V,E,L,Q,V,P,D,D,V,Y,I,L,D,F,A,E,E,E,G,I,D,L,P,F,S,C,R,A,G,S,C,S,S,C,A,G,K,V,V,S,G,S,V,D,Q,S,D,Q,S,F,L,N,D,N,Q,V,A,D,G,W,V,L,T,C,A,A,Y,P,T,S,D,V,V,I,E,T,H,K,E,D,D,L,L,.,
+jpred:-,-,-,-,E,E,E,E,E,E,-,-,-,-,-,E,E,E,E,-,-,-,-,E,E,E,E,E,-,H,H,H,H,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,E,E,E,E,-,-,E,E,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,E,E,E,E,E,E,E,E,-,-,-,-,E,E,E,E,-,
diff --git a/utils/jalviewjs/site-resources/examples/plantfdx.annotations b/utils/jalviewjs/site-resources/examples/plantfdx.annotations
new file mode 100644 (file)
index 0000000..b4ed4a4
--- /dev/null
@@ -0,0 +1,7 @@
+JALVIEW_ANNOTATION
+# Created: Mon Dec 11 10:43:00 GMT 2006
+
+NO_GRAPH       Secondary Structure     ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||1,E|E|E|||||2,E|E|E|E|E|E|E|E|||||3,H|H|H|H|H|||||||||||Fe|||||Fe|||Fe||4,E|E||||||5,E|E|||||||||||6,H|H|H|H||7,E||||Fe|||E|E||||9,E|E|E|E|E||||||||||
+NO_GRAPH       Iron Sulphur Contacts   ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||Fe|||||Fe|||Fe||||||||||||||||||||||||||||||Fe||||||||||||||||||||||
+COLOUR Conservation    5d1500
+COLOUR Quality 560c00
diff --git a/utils/jalviewjs/site-resources/examples/plantfdx.fa b/utils/jalviewjs/site-resources/examples/plantfdx.fa
new file mode 100644 (file)
index 0000000..80d7133
--- /dev/null
@@ -0,0 +1,60 @@
+>FER_CAPAA/1-97
+----------------------------------------------------------ASYKVKLITPDGPI
+EFDCPDDVYILDQAEEAGHDLPYSCRAGSCSSCAGKIAGGAVDQTDGNFLDDDQLEEGWVLTCVAYPQSDVT
+IETHKEAELVG-
+>FER_CAPAN/1-144
+------MASVSATMISTSFMPRKPAVTSLKPIP-NVG-EALFGLKS---ANGGKVTCMASYKVKLITPDGPI
+EFDCPDNVYILDQAEEAGHDLPYSCRAGSCSSCAGKIAGGAVDQTDGNFLDDDQLEEGWVLTCVAYPQSDVT
+IETHKEAELVG-
+>FER1_SOLLC/1-144
+------MASISGTMISTSFLPRKPAVTSLKAIS-NVG-EALFGLKS---GRNGRITCMASYKVKLITPEGPI
+EFECPDDVYILDQAEEEGHDLPYSCRAGSCSSCAGKVTAGSVDQSDGNFLDEDQEAAGFVLTCVAYPKGDVT
+IETHKEEELTA-
+>Q93XJ9_SOLTU/1-144
+------MASISGTMISTSFLPRKPVVTSLKAIS-NVG-EALFGLKS---GRNGRITCMASYKVKLITPDGPI
+EFECPDDVYILDQAEEEGHDLPYSCRAGSCSSCAGKVTAGTVDQSDGKFLDDDQEAAGFVLTCVAYPKCDVT
+IETHKEEELTA-
+>FER1_PEA/1-149
+---MATTPALYGTAVSTSFLRTQPMPMSVTTTKAFSN--GFLGLKT-SLKRGDLAVAMASYKVKLVTPDGTQ
+EFECPSDVYILDHAEEVGIDLPYSCRAGSCSSCAGKVVGGEVDQSDGSFLDDEQIEAGFVLTCVAYPTSDVV
+IETHKEEDLTA-
+>Q7XA98_TRIPR/1-152
+---MATTPALYGTAVSTSFMRRQPVPMSVATTTTTKAFPSGFGLKSVSTKRGDLAVAMATYKVKLITPEGPQ
+EFDCPDDVYILDHAEEVGIELPYSCRAGSCSSCAGKVVNGNVNQEDGSFLDDEQIEGGWVLTCVAFPTSDVT
+IETHKEEELTA-
+>FER1_MESCR/1-148
+--MAATTAALSGATMSTAFAPKT--PPMTAALPTNVG-RALFGLKS--SASRGRVTAMAAYKVTLVTPEGKQ
+ELECPDDVYILDAAEEAGIDLPYSCRAGSCSSCAGKVTSGSVNQDDGSFLDDDQIKEGWVLTCVAYPTGDVT
+IETHKEEELTA-
+>FER1_SPIOL/1-147
+----MAATTTTMMGMATTFVPKPQAPPMMAALPSNTG-RSLFGLKT--GSRGGRMT-MAAYKVTLVTPTGNV
+EFQCPDDVYILDAAEEEGIDLPYSCRAGSCSSCAGKLKTGSLNQDDQSFLDDDQIDEGWVLTCAAYPVSDVT
+IETHKEEELTA-
+>FER3_RAPSA/1-96
+----------------------------------------------------------ATYKVKFITPEGEQ
+EVECDDDVYVLDAAEEAGIDLPYSCRAGSCSSCAGKVVSGSVDQSDQSFLDDDQIAEGFVLTCAAYPTSDVT
+IETHREEDMV--
+>FER2_ARATH/1-148
+----MASTALSSAIVGTSFIRRSPAPISLRSLPSANT-QSLFGLKS-GTARGGRVTAMATYKVKFITPEGEL
+EVECDDDVYVLDAAEEAGIDLPYSCRAGSCSSCAGKVVSGSVDQSDQSFLDDEQIGEGFVLTCAAYPTSDVT
+IETHKEEDIV--
+>FER_BRANA/1-96
+----------------------------------------------------------ATYKVKFITPEGEQ
+EVECDDDVYVLDAAEEAGIDLPYSCRAGSCSSCAGKVVSGFVDQSDESFLDDDQIAEGFVLTCAAYPTSDVT
+IETHKEEELV--
+>FER1_ARATH/1-148
+----MASTALSSAIVSTSFLRRQQTPISLRSLPFANT-QSLFGLKS-STARGGRVTAMATYKVKFITPEGEQ
+EVECEEDVYVLDAAEEAGLDLPYSCRAGSCSSCAGKVVSGSIDQSDQSFLDDEQMSEGYVLTCVAYPTSDVV
+IETHKEEAIM--
+>Q93Z60_ARATH/1-118
+----MASTALSSAIVSTSFLRRQQTPISLRSLPFANT-QSLFGLKS-STARGGRVTAMATYKVKFITPEGEQ
+EVECEEDVYVLDAAEEAGLDLPYSCRAGSCSSCAGKVVSGSIDQSDQSFLDD--------------------
+------------
+>FER1_MAIZE/1-150
+MATVLGSPRAPAFFFSSSSLRAAPAPTAVALPAAKVG---IMGRSA---SSRRRLRAQATYNVKLITPEGEV
+ELQVPDDVYILDQAEEDGIDLPYSCRAGSCSSCAGKVVSGSVDQSDQSYLDDGQIADGWVLTCHAYPTSDVV
+IETHKEEELTGA
+>O80429_MAIZE/1-140
+---------MAATALSMSILRAPP-PCFSSPLRLRVAVAKPLAAPM----RRQLLRAQATYNVKLITPEGEV
+ELQVPDDVYILDFAEEEGIDLPFSCRAGSCSSCAGKVVSGSVDQSDQSFLNDNQVADGWVLTCAAYPTSDVV
+IETHKEDDLL--
diff --git a/utils/jalviewjs/site-resources/examples/plantfdx.features b/utils/jalviewjs/site-resources/examples/plantfdx.features
new file mode 100644 (file)
index 0000000..6a2e058
--- /dev/null
@@ -0,0 +1,118 @@
+HELIX  d4d189
+MOD_RES        47e459
+TRANSIT        6f949b
+TURN   1d1e2d
+METAL  70686e
+SIGNAL 92c7dd
+VARIANT        60beac
+Pfam   dc206a
+CONFLICT       c46c6e
+STRAND 25c54c
+
+STARTGROUP     uniprot
+Iron-sulfur (2Fe-2S)   FER_CAPAA       -1      39      39      METAL
+Iron-sulfur (2Fe-2S)   FER_CAPAA       -1      44      44      METAL
+Iron-sulfur (2Fe-2S)   FER_CAPAA       -1      47      47      METAL
+Iron-sulfur (2Fe-2S)   FER_CAPAA       -1      77      77      METAL
+<html>Description: Fer2 Status: True Positive <a href="http://pfam.xfam.org/family/PF00111">Pfam 8_83</a></html>       FER_CAPAA       -1      8       83      Pfam
+Chloroplast    FER_CAPAN       -1      1       47      TRANSIT
+Iron-sulfur (2Fe-2S)   FER_CAPAN       -1      86      86      METAL
+Iron-sulfur (2Fe-2S)   FER_CAPAN       -1      91      91      METAL
+Iron-sulfur (2Fe-2S)   FER_CAPAN       -1      94      94      METAL
+Iron-sulfur (2Fe-2S)   FER_CAPAN       -1      124     124     METAL
+Phosphothreonine       FER_CAPAN       -1      136     136     MOD_RES
+<html>Description: Fer2 Status: True Positive <a href="http://pfam.xfam.org/family/PF00111">Pfam 55_130</a></html>     FER_CAPAN       -1      55      130     Pfam
+Chloroplast    FER1_SOLLC      -1      1       47      TRANSIT
+Iron-sulfur (2Fe-2S)   FER1_SOLLC      -1      86      86      METAL
+Iron-sulfur (2Fe-2S)   FER1_SOLLC      -1      91      91      METAL
+Iron-sulfur (2Fe-2S)   FER1_SOLLC      -1      94      94      METAL
+Iron-sulfur (2Fe-2S)   FER1_SOLLC      -1      124     124     METAL
+<html>Description: Fer2 Status: True Positive <a href="http://pfam.xfam.org/family/PF00111">Pfam 55_130</a></html>     FER1_SOLLC      -1      55      130     Pfam
+Evidence: EI4  Q93XJ9_SOLTU    -1      1       48      SIGNAL
+<html>Description: Fer2 Status: True Positive <a href="http://pfam.xfam.org/family/PF00111">Pfam 55_130</a></html>     Q93XJ9_SOLTU    -1      55      130     Pfam
+Chloroplast    FER1_PEA        -1      1       52      TRANSIT
+L -> I (in strain: cv. Onward)         FER1_PEA        -1      59      59      VARIANT
+I -> L (in strain: cv. Onward)         FER1_PEA        -1      85      85      VARIANT
+Iron-sulfur (2Fe-2S)   FER1_PEA        -1      91      91      METAL
+Iron-sulfur (2Fe-2S)   FER1_PEA        -1      96      96      METAL
+Iron-sulfur (2Fe-2S)   FER1_PEA        -1      99      99      METAL
+Iron-sulfur (2Fe-2S)   FER1_PEA        -1      129     129     METAL
+YPTS -> PPPA (in Ref. 2)       FER1_PEA        -1      132     135     CONFLICT
+<html>Description: Fer2 Status: True Positive <a href="http://pfam.xfam.org/family/PF00111">Pfam 60_135</a></html>     FER1_PEA        -1      60      135     Pfam
+<html>Description: Fer2 Status: True Positive <a href="http://pfam.xfam.org/family/PF00111">Pfam 63_138</a></html>     Q7XA98_TRIPR    -1      63      138     Pfam
+Chloroplast    FER1_MESCR      -1      1       51      TRANSIT
+Iron-sulfur (2Fe-2S)   FER1_MESCR      -1      90      90      METAL
+Iron-sulfur (2Fe-2S)   FER1_MESCR      -1      95      95      METAL
+Iron-sulfur (2Fe-2S)   FER1_MESCR      -1      98      98      METAL
+Iron-sulfur (2Fe-2S)   FER1_MESCR      -1      128     128     METAL
+<html>Description: Fer2 Status: True Positive <a href="http://pfam.xfam.org/family/PF00111">Pfam 59_134</a></html>     FER1_MESCR      -1      59      134     Pfam
+Chloroplast    FER1_SPIOL      -1      1       50      TRANSIT
+STRAND FER1_SPIOL      -1      52      59      STRAND
+TURN   FER1_SPIOL      -1      60      61      TURN
+STRAND FER1_SPIOL      -1      62      69      STRAND
+TURN   FER1_SPIOL      -1      70      71      TURN
+HELIX  FER1_SPIOL      -1      74      80      HELIX
+TURN   FER1_SPIOL      -1      81      82      TURN
+STRAND FER1_SPIOL      -1      88      92      STRAND
+Iron-sulfur (2Fe-2S)   FER1_SPIOL      -1      89      89      METAL
+Iron-sulfur (2Fe-2S)   FER1_SPIOL      -1      94      94      METAL
+TURN   FER1_SPIOL      -1      96      97      TURN
+Iron-sulfur (2Fe-2S)   FER1_SPIOL      -1      97      97      METAL
+STRAND FER1_SPIOL      -1      98      104     STRAND
+TURN   FER1_SPIOL      -1      109     110     TURN
+HELIX  FER1_SPIOL      -1      116     121     HELIX
+TURN   FER1_SPIOL      -1      122     122     TURN
+STRAND FER1_SPIOL      -1      123     125     STRAND
+HELIX  FER1_SPIOL      -1      126     128     HELIX
+Iron-sulfur (2Fe-2S)   FER1_SPIOL      -1      127     127     METAL
+STRAND FER1_SPIOL      -1      130     133     STRAND
+STRAND FER1_SPIOL      -1      135     138     STRAND
+HELIX  FER1_SPIOL      -1      142     144     HELIX
+<html>Description: Fer2 Status: True Positive <a href="http://pfam.xfam.org/family/PF00111">Pfam 58_133</a></html>     FER1_SPIOL      -1      58      133     Pfam
+I -> V         FER3_RAPSA      -1      8       8       VARIANT
+Iron-sulfur (2Fe-2S)   FER3_RAPSA      -1      39      39      METAL
+Iron-sulfur (2Fe-2S)   FER3_RAPSA      -1      44      44      METAL
+Iron-sulfur (2Fe-2S)   FER3_RAPSA      -1      47      47      METAL
+S -> T         FER3_RAPSA      -1      55      55      VARIANT
+Iron-sulfur (2Fe-2S)   FER3_RAPSA      -1      77      77      METAL
+R -> K         FER3_RAPSA      -1      91      91      VARIANT
+M -> V         FER3_RAPSA      -1      95      95      VARIANT
+<html>Description: Fer2 Status: True Positive <a href="http://pfam.xfam.org/family/PF00111">Pfam 8_83</a></html>       FER3_RAPSA      -1      8       83      Pfam
+Chloroplast    FER2_ARATH      -1      1       52      TRANSIT
+Iron-sulfur (2Fe-2S)   FER2_ARATH      -1      91      91      METAL
+Iron-sulfur (2Fe-2S)   FER2_ARATH      -1      96      96      METAL
+Iron-sulfur (2Fe-2S)   FER2_ARATH      -1      99      99      METAL
+Iron-sulfur (2Fe-2S)   FER2_ARATH      -1      129     129     METAL
+<html>Description: Fer2 Status: True Positive <a href="http://pfam.xfam.org/family/PF00111">Pfam 60_135</a></html>     FER2_ARATH      -1      60      135     Pfam
+Iron-sulfur (2Fe-2S)   FER_BRANA       -1      39      39      METAL
+Iron-sulfur (2Fe-2S)   FER_BRANA       -1      44      44      METAL
+Iron-sulfur (2Fe-2S)   FER_BRANA       -1      47      47      METAL
+Iron-sulfur (2Fe-2S)   FER_BRANA       -1      77      77      METAL
+<html>Description: Fer2 Status: True Positive <a href="http://pfam.xfam.org/family/PF00111">Pfam 8_83</a></html>       FER_BRANA       -1      8       83      Pfam
+Chloroplast    FER1_ARATH      -1      1       52      TRANSIT
+Iron-sulfur (2Fe-2S)   FER1_ARATH      -1      91      91      METAL
+Iron-sulfur (2Fe-2S)   FER1_ARATH      -1      96      96      METAL
+Iron-sulfur (2Fe-2S)   FER1_ARATH      -1      99      99      METAL
+Iron-sulfur (2Fe-2S)   FER1_ARATH      -1      129     129     METAL
+<html>Description: Fer2 Status: True Positive <a href="http://pfam.xfam.org/family/PF00111">Pfam 60_135</a></html>     FER1_ARATH      -1      60      135     Pfam
+<html>Description: Fer2 Status: True Positive <a href="http://pfam.xfam.org/family/PF00111">Pfam 60_118</a></html>     Q93Z60_ARATH    -1      60      118     Pfam
+Chloroplast    FER1_MAIZE      -1      1       52      TRANSIT
+STRAND FER1_MAIZE      -1      57      59      STRAND
+STRAND FER1_MAIZE      -1      72      74      STRAND
+HELIX  FER1_MAIZE      -1      76      80      HELIX
+TURN   FER1_MAIZE      -1      81      84      TURN
+STRAND FER1_MAIZE      -1      90      97      STRAND
+Iron-sulfur (2Fe-2S)   FER1_MAIZE      -1      91      91      METAL
+Iron-sulfur (2Fe-2S)   FER1_MAIZE      -1      96      96      METAL
+TURN   FER1_MAIZE      -1      98      99      TURN
+Iron-sulfur (2Fe-2S)   FER1_MAIZE      -1      99      99      METAL
+TURN   FER1_MAIZE      -1      118     119     TURN
+HELIX  FER1_MAIZE      -1      120     123     HELIX
+TURN   FER1_MAIZE      -1      128     129     TURN
+Iron-sulfur (2Fe-2S)   FER1_MAIZE      -1      129     129     METAL
+STRAND FER1_MAIZE      -1      132     135     STRAND
+STRAND FER1_MAIZE      -1      137     141     STRAND
+TURN   FER1_MAIZE      -1      142     142     TURN
+<html>Description: Fer2 Status: True Positive <a href="http://pfam.xfam.org/family/PF00111">Pfam 60_135</a></html>     FER1_MAIZE      -1      60      135     Pfam
+<html>Description: Fer2 Status: True Positive <a href="http://pfam.xfam.org/family/PF00111">Pfam 52_127</a></html>     O80429_MAIZE    -1      52      127     Pfam
+ENDGROUP       uniprot
diff --git a/utils/jalviewjs/site-resources/examples/unfolded_RF00031.aln b/utils/jalviewjs/site-resources/examples/unfolded_RF00031.aln
new file mode 100644 (file)
index 0000000..69a7850
--- /dev/null
@@ -0,0 +1,126 @@
+CLUSTAL
+
+B.taurus.1/1-64       C-UUGCGUU--AAUGAGAACAGAAACG-UAAA--CUAUAA-CCUAG-G---------GGU
+D.melanogaster.3/1-68 G-UGGCGCU--UAUGACGCAGUUGUCU-UAAA-CUCGAAC--UCGA-GC--------GGG
+D.melanogaster.2/1-63 C-AUUCAACU-UAUGAGGAUUAUUUCU-UAAA-GGCCUCU---GGC--U-------CGGA
+D.melanogaster.1/1-65 G-AGCC-CU---AUGAUCGAUGAUUGG-CAAA-UCCUCUC--GAGG--A-------ACCG
+R.norvegicus.7/1-66   C-CGGCACU--CAUGACGGUCUGCCUG-AAAA-CCAGCCC--GCUG-GU--------GGG
+R.norvegicus.6/1-67   G-CCGCUUC---AUGACAGGAAGGACU-GAAA-UGUCUCA-AAGAC--C-----UGUGGU
+R.norvegicus.5/1-62   G-UUUUUCC---AUGACGGUGUUUCCUCUAAA--UUUAC----AUG-----------GAG
+R.norvegicus.4/1-61   G-UCAGAUG---AUGACGGCCUGUGCA-GAAA-CCCCCAC-GUGGG--C--------UGC
+R.norvegicus.3/1-67   U-UUGCAUU--AAUGAGGAUUACACAG-AAAA-CCUUUGU--UAAGGGU--------UUG
+R.norvegicus.2/1-64   G-UUACAUU--GAUGAGAACAGAAACA-UAAA--CUAUGA-CCUAG-G---------GGU
+R.norvegicus.1/1-61   A-UAUUUGUU-UAUGAUGGUCACAGUG-UAAA--GUUCA----CAC-----------AGC
+O.aries.1/1-68        G-ACGCUUC---AUGACAGGAAGGACU-GAAA-UGUCUCU-UGGAC-GC------CUGGU
+M.musculus.9/1-66     C-CGGCACU--CAUGAAGGUCUGCUUG-AAAA-CCAGCCU--GCUG-GU--------GGG
+M.musculus.8/1-67     U-UUGCAUU--AAUGAGGAUUACACAG-AAAA-CCUUUGU--UAAG-GA-------CUUG
+O.niloticus.3/1-65    G-UGUCUCU---GUGAAGUUCGGUUUU-UAAA-AGGGUCA---UCC--A-------GAAA
+M.musculus.7/1-64     G-UGUCUCU---AUGAAGGAGGGGCCC-GAAG-CCCUUGU---GGG--C--------GGG
+O.niloticus.2/1-61    U-GUUUAUU--AAUGACGGCUACAGAU-UAAA--CCUUU----AGC-----------CUC
+M.musculus.6/1-61     G-UCAGAUG---AUGAUGGCCUGGGCA-GAAA-CCCCAUG--UGGG--C--------CGC
+O.niloticus.1/1-59    G-UUUCUCA---GUGAAGGCUACAGAU-UAAA--CCUCU----GGC-----------CUC
+M.musculus.5/1-66     G-CCGCUUC---AUGACAGGAAGGACU-GAAA-UGUCUUA---GAC--C-----UGUGGU
+M.musculus.4/1-65     G-UGUGCGA---AUGAUAACUACUGAC-GAAA-GAGCUGU-CUGCU--C-------AGUC
+M.musculus.3/1-64     G-GUUCUUC--CAUGAUGGUGUUUCCUCUAAA--UUUGC----ACG-----------GAG
+M.musculus.2/1-64     G-UUACAUU--AAUGAGAACAGAAACA-UAAA--CUAUGA-CCUAG-G---------GGU
+M.musculus.1/1-64     G-UCACCGA---AUGAUCUGCUCUGGU-CAAA-UCCUUCU---AUG--C------CAGCC
+C.elegans.1/1-64      G-AGGCAGCUUUGUGACGACCUUUGGC-UAAA-CUCCAUC--GUGA-GC--------GCC
+H.sapiens.15/1-63     U-UUUCAUC--UAUGAGGGUGUUUCCUCUAAA--CCUACG---AGG-----------GAG
+H.sapiens.14/1-62     C-ACUGCUG---AUGACGAACUAUCUC-UAAC-UGGUCUU--GACC--A-------CGAG
+H.sapiens.13/1-64     G-UCACUGC---AUGAUCCGCUCUGGU-CAAA-CCCUUCC---AGG--C------CAGCC
+H.sapiens.12/1-67     C-UCUGUUA---AUGACGUCUCUCCCUCUAAA-CCCCAUU-AAGGA--C--------UGG
+D.rerio.1/1-66        A-UGUGGUCUUUAUGAAGGCAGGUGCA-GAAA-CUAUGCA---CUA-GU--------GGU
+H.sapiens.11/1-63     G-CCGGAUG---AUGACGACCUGGGUG-GAAA-CCUACCC-UGUGG--G--------CAC
+H.sapiens.10/1-62     C-CGGCACU--CAUGACGGCCUGCCUG-CAAA--CCUGC----UGG--U--------GGG
+S.mansoni.1/1-67      C-UCGCUAU---AUGACGAUGGCAAUC-UCAA--AUGUU----CAU--U--------GGU
+S.scrofa.4/1-64       C-UGGCACC--CAUGACAGUCUGCCUA-AAAA-CCAGCC----CUG-GU--------GGG
+S.scrofa.3/1-63       A-UUUUAUC--CAUGAAAGUGUUUCCUCUAAA--CCUAU----GUG-----------GAG
+S.scrofa.2/1-65       C-UGGCACC--CAUGACAGUCUGCCUA-AAAA-CCAGCCC---CUG-GU--------GGG
+S.scrofa.1/1-68       G-ACGCUUC---AUGACAGGAAGGACU-GAAA-UGUCUUG-UGGAC-GC------CUGGU
+H.sapiens.9/1-58      U-AUUUGUU--UAUGAUGGCCACAGCC-UAAA--GUACA----CAC-----------GGC
+H.sapiens.8/1-67      U-UUGCUUU--AAUGAGAAUAGAAACG-UAAA--CUAUGA-CCUAG-G---------GGU
+X.laevis.1/1-67       G-UGUUUGCA-AAUGACGACCGAUUUU-GAAA-UGGUCUCACGGCC--A-------AAAA
+H.sapiens.7/1-70      U-GGCGUCUU-CAUGAGGGAGGGGCCC--AAA-GCCCUUG--UGGG--C--------GGA
+H.sapiens.6/1-66      G-UGUGCGG---AUGAUAACUACUGAC-GAAAGAGUCAUC---GAC--C-----UCAGUU
+H.sapiens.5/1-57      U-UCACAGA---AUGAUGGCACCUUCC-UAA---ACCCU----CAU-----------GGG
+H.sapiens.4/1-71      G-ACUGACAU-UAUGAAGGCCUGUACU-GAAG-ACAGCAA--GCUG--U-------UAGU
+H.sapiens.3/1-68      G-ACGCUUC---AUGAUAGGAAGGACU-GAAA-AGUCUUG-UGGAC--A-----CCUGGU
+H.sapiens.2/1-65      G-UGUGCGG---AUGAUAACUACUGAC-GAAA-GAGUCAU-CGACU--C-------AGUU
+H.sapiens.1/1-63      G-CCAGAUG---AUGACGACCUGGGUG-GAAA-CCUACCC-UGUGG--G--------CAC
+M.musculus.14/1-67    C-UCUGAUA---AUGAUGUCUCUCCCU-CUAA-CUCCCAGUAAGGA--C--------UGG
+M.musculus.13/1-60    C-AUGCGUC--CAUGAAGUCACUGGCC-UCAA-GCCCAA----GUG-GU--------GGG
+M.musculus.12/1-65    C-UCAGCAG--GAUGAUGAGAAGGGCU-GAAA-UGCUGCC--AAAC--C-------AGGU
+M.musculus.11/1-63    U-AUUUGUG--UAUGAUGGUCACAGUG-UAAA--GUUCC----CAC-----------AGC
+M.musculus.10/1-66    C-CGGCACU--CAUGAAGGUCUGCCUG-AAAA-CCAGCCU--GCUG-GU--------GGG
+B.taurus.7/1-61       U-UUUGCCC---AUGAAGGUGUUCCCUCUAAA--CCUAC----GUG-----------GAG
+B.taurus.6/1-67       G-AUGCGUC--CAUGAAGUCACCAGCC-CCAA-GCCCCUC---GUG-GU--------GGG
+B.taurus.5/1-61       G-CCAGAUG---AUGAGGACCUGUGCG-GAAA-CCCCCCG--CGGG--C--------UGC
+B.taurus.4/1-64       ACUUGCGUU--AAUGAGAACAGAAACG-UAAA--CUAUAA-CCUAG-G---------GGU
+G.gallus.3/1-73       U-AUUUCUU--UGUGAUGACCGAUUUU-GAAA-UGGGUUU---CUC--UAAUGCCAGGAA
+B.taurus.3/1-66       C-CCGGUGCC-UAUGACGGUCUGUCUG-AAAA-CCAGCCC---CUG-GU--------GGG
+G.gallus.2/1-60       U-AUUUGUC---AUGACAGUCACAGCA-UAAA--GCGCA----GAC-----------GGC
+B.taurus.2/1-64       C-UUGCGUU--AAUGAGAACAGAAACG-AAAA--CUAUAA-CCUAG-G---------GGU
+G.gallus.1/1-63       G-UGUGUUU---AUGAAGAGCACUAAC-AAAA-GAGUAAU-UGACU--C-------AGUU
+
+B.taurus.1/1-64       UUC-U-G-UUGGAU--GGUUG-------GCAAC
+D.melanogaster.3/1-68 CAA-U-U-GCUGAU---UACG---AUUAACCAC
+D.melanogaster.2/1-63 AAU-A-G-UCUGAA---CCU--------UAUUG
+D.melanogaster.1/1-65 AUC-G-U-UGAGAA--CCCCU-----UUGCCUU
+R.norvegicus.7/1-66   GCA-G-U-CCCGAG-GACCUG-------GCGUG
+R.norvegicus.6/1-67   CUU-U-C-UUCGAU--GUUCU-------GCGGC
+R.norvegicus.5/1-62   AAA-C-A-CCUGAU-UUCCAG------AAAAAU
+R.norvegicus.4/1-61   -CA-G-G-UUUGAA---CCC--------CUGGC
+R.norvegicus.3/1-67   UGUCG-A-UCUGCU--AAUUG-------GCAAA
+R.norvegicus.2/1-64   UUC-U-G-UUGGAU--AGCUC-------GUAAU
+R.norvegicus.1/1-61   UGU-G-A-CUUGAU--UUUUA-------AAAAU
+O.aries.1/1-68        CCU-U-C-CUUGAU--GUUCU------CACGGC
+M.musculus.9/1-66     GCA-G-U-CCUGAG-GACCUG-------GCGUG
+M.musculus.8/1-67     UGU-AGA-UCUGAU--AAUUG-------GCAAA
+O.niloticus.3/1-65    ACC-G-ACACUGAU--GUUUC------CGACAC
+M.musculus.7/1-64     CCU-C-C-CCUGAG---CCCG----UCUGUGGU
+O.niloticus.2/1-61    UGG-A-G-CCAGAU--GCAUU------CAAACA
+M.musculus.6/1-61     CCA-G-G-UUUGAA---CCC--------CUGGC
+O.niloticus.1/1-59    UGG-A-G-CCAGAU--GCAUU-------GAAAC
+M.musculus.5/1-66     CUU-U-C-CUCGAU--GUUCC------UGCGGC
+M.musculus.4/1-65     UGU-G-G-UUGGAU---GUAG------UCACAC
+M.musculus.3/1-64     AAA-C-A-CCUGAU-UUCCAG-----GAAAAUC
+M.musculus.2/1-64     UUC-U-G-UUGGAU--AGCUU-------GUAAU
+M.musculus.1/1-64     AGG-G-U-GGUGAU--GACCC-------GUGAC
+C.elegans.1/1-64      UCU-G-G-UCUGAU---GC---------GCCUC
+H.sapiens.15/1-63     GAA-C-A-CCUGAU---CUUA-----CAGAAAA
+H.sapiens.14/1-62     CUA-G-U-UCUGAA---UU-G-------CAGGG
+H.sapiens.13/1-64     AGA-G-U-GGGGAU--GGUCU-------GUGAC
+H.sapiens.12/1-67     GAG-A-G-GCAGAGCAAGCCU-------CAGAG
+D.rerio.1/1-66        GUC-U-G-UCUGAU--GUUUG-------GCCAU
+H.sapiens.11/1-63     CCA-U-G-UCCGAG---CCCC-------CUGGC
+H.sapiens.10/1-62     GCA-G-A-CCCGAA-AAUCCA-------GCGUG
+S.mansoni.1/1-67      UGC-C-A-UUUGAU--GAAAUCAGUUUUGUGUG
+S.scrofa.4/1-64       GCA-G-A-CUCGAG-AACCUG-------GCGUG
+S.scrofa.3/1-63       GAA-C-A-CCUGAU-GUCCAG------GAAAAU
+S.scrofa.2/1-65       GCA-G-A-CUCGAG-AACCUG-------GCGUG
+S.scrofa.1/1-68       CCU-U-C-CCUGAU--GUUCU------CAUGGC
+H.sapiens.9/1-58      UGU-G-A-CUUGAU---UCA--------AAAGA
+H.sapiens.8/1-67      UUC-U-G-UUGGAU-AAUUAG-----CAGUUUA
+X.laevis.1/1-67       CUC-GUG-UCCGAC---AUC--------AACCC
+H.sapiens.7/1-70      CCU-C-C-CCUGAG---CCUGUCUGAGGGGCCA
+H.sapiens.6/1-66      AGU-G-G-UUGGAU---GUAG------UCACAU
+H.sapiens.5/1-57      UGG-U-G-UCUGAG--AGGC--------GUGAA
+H.sapiens.4/1-71      ACA-G-A-CCAGAU--GCUUU--CUUGGCAGGC
+H.sapiens.3/1-68      CUU-U-C-CCUGAU--GUUCU------CGUGGC
+H.sapiens.2/1-65      AGU-G-G-UUGGAU---GUAG------UCACAU
+H.sapiens.1/1-63      CCA-U-G-UCCGAG---CCCC-------CUGGC
+M.musculus.14/1-67    GAG-A-G-GCUGAACAAACCU-------CAGAG
+M.musculus.13/1-60    CAG-U-G-ACAGAA---GA---------GCUGC
+M.musculus.12/1-65    CCU-U-U-UCUGAU--GGUGG-------CUGGG
+M.musculus.11/1-63    UGU-G-A-CUUGAU--UUUUA----AAAAUGUC
+M.musculus.10/1-66    GCA-G-U-CCUGAG-GACCUG-------GCGUG
+B.taurus.7/1-61       GAA-U-G-CCUGAU-GUCCAG-------GAAAA
+B.taurus.6/1-67       UGG-U-G-AUGGAA-CCGUCA-----AAGCAGU
+B.taurus.5/1-61       CCA-U-G-UCUGAG---CCC--------CUGGC
+B.taurus.4/1-64       UUC-U-G-UUGGAU--GGUUG-------GCAA-
+G.gallus.3/1-73       AUC-GUG-UCUGAU---GUUG-----UCAAGUA
+B.taurus.3/1-66       GCA-G-A-CCUGAG-AACCUG-------GCGUG
+G.gallus.2/1-60       UGU-G-A-CCUGAU--UUUAG------AAAAUA
+B.taurus.2/1-64       UUC-U-G-UUGGAU--GGUUG-------GCAAC
+G.gallus.1/1-63       GGU-G-U-UCAGAU--GCU---------CUCAC
+
diff --git a/utils/jalviewjs/site-resources/examples/uniref50.score_ascii b/utils/jalviewjs/site-resources/examples/uniref50.score_ascii
new file mode 100644 (file)
index 0000000..4a506d9
--- /dev/null
@@ -0,0 +1,99 @@
+T-COFFEE, Version_8.99(Fri Feb 18 08:27:45 CET 2011 - Revision 596)
+Cedric Notredame 
+CPU TIME:0 sec.
+SCORE=94
+*
+ BAD AVG GOOD
+*
+FER_CAPAA      :  99
+FER_CAPAN      :  94
+FER1_SOLLC     :  94
+Q93XJ9_SOLTU   :  93
+FER1_PEA       :  93
+Q7XA98_TRIPR   :  92
+FER1_MESCR     :  92
+FER1_SPIOL     :  92
+FER3_RAPSA     :  99
+FER1_ARATH     :  93
+FER_BRANA      :  99
+FER2_ARATH     :  93
+Q93Z60_ARATH   :  92
+FER1_MAIZE     :  91
+O80429_MAIZE   :  91
+cons           :  94
+
+FER_CAPAA      ------------------------------------------------
+FER_CAPAN      99------333445778888876665554-23333345--6778765-
+FER1_SOLLC     98------344556788888876665544-23333344--5677765-
+Q93XJ9_SOLTU   98------344556788888876555554-23333344--5677765-
+FER1_PEA       9964---1344556788888876655544-23333344--6778876-
+Q7XA98_TRIPR   9964---1344566788888876665554-222222210056777650
+FER1_MESCR     9954--1124455677878765--22222122233345--5677776-
+FER1_SPIOL     9965--111111--677777765444444233334445--6789876-
+FER3_RAPSA     ------------------------------------------------
+FER1_ARATH     9965----344556888888876665554233333344--6788776-
+FER_BRANA      ------------------------------------------------
+FER2_ARATH     9965----344556888888876665555233333345--6778876-
+Q93Z60_ARATH   9965----344556888888876665555233333345--6778876-
+FER1_MAIZE     99540001222334677777765555443--2222233--4567554-
+O80429_MAIZE   9854---------23445555---11111111111111--1212222-
+cons           996400012344557778887766544441222233340056777650
+
+
+FER_CAPAA      -----------9999999999999999999999999999999999999
+FER_CAPAN      4--445678999999999999999999999999999999999999999
+FER1_SOLLC     4--445678999999999999999999999999999999999999999
+Q93XJ9_SOLTU   4--445678999999999999999999999999999999999999999
+FER1_PEA       533444568999999999999999999999999999999999999999
+Q7XA98_TRIPR   333434568999999999999999999999999999999999999999
+FER1_MESCR     4333-5678999999999999999999999999999999999999999
+FER1_SPIOL     422--2334599999999999999999999999999999999999999
+FER3_RAPSA     -----------9999999999999999999999999999999999999
+FER1_ARATH     533446788999999999999999999999999999999999999999
+FER_BRANA      -----------9999999999999999999999999999999999999
+FER2_ARATH     533546788999999999999999999999999999999999999999
+Q93Z60_ARATH   533546788999999999999999999999999999999999999999
+FER1_MAIZE     4222--567899999999999999999999999999999999999999
+O80429_MAIZE   222435678999999999999999999999999999999999999999
+cons           422445677899999999999999999999999999999999999999
+
+
+FER_CAPAA      999999999999999999999999999999999999999999999999
+FER_CAPAN      999999999999999999999999999999999999999999999999
+FER1_SOLLC     999999999999999999999999999999999999999999999999
+Q93XJ9_SOLTU   999999999999999999999999999999999999999999999999
+FER1_PEA       999999999999999999999999999999999999999999999999
+Q7XA98_TRIPR   999999999999999999999999999999999999999999999999
+FER1_MESCR     999999999999999999999999999999999999999999999999
+FER1_SPIOL     999999999999999999999999999999999999999999999999
+FER3_RAPSA     999999999999999999999999999999999999999999999999
+FER1_ARATH     999999999999999999999999999999999999999999999999
+FER_BRANA      999999999999999999999999999999999999999999999999
+FER2_ARATH     999999999999999999999999999999999999999999999999
+Q93Z60_ARATH   99999999999999999999999999999-------------------
+FER1_MAIZE     999999999999999999999999999999999999999999999999
+O80429_MAIZE   999999999999999999999999999999999999999999999999
+cons           999999999999999999999999999999999999999999999999
+
+
+FER_CAPAA      999999998865-
+FER_CAPAN      999999998865-
+FER1_SOLLC     999999998865-
+Q93XJ9_SOLTU   999999998865-
+FER1_PEA       999999999865-
+Q7XA98_TRIPR   999999998865-
+FER1_MESCR     999999998865-
+FER1_SPIOL     999999998865-
+FER3_RAPSA     99999999874--
+FER1_ARATH     99999998874--
+FER_BRANA      99999999874--
+FER2_ARATH     99999998764--
+Q93Z60_ARATH   -------------
+FER1_MAIZE     9999999998620
+O80429_MAIZE   99999999874--
+cons           9999999987550
+
+
+
+
+
diff --git a/utils/jalviewjs/site-resources/examples/uniref50_mz.fa b/utils/jalviewjs/site-resources/examples/uniref50_mz.fa
new file mode 100644 (file)
index 0000000..725d210
--- /dev/null
@@ -0,0 +1,30 @@
+>FER1_MAIZE/53-118 Ferredoxin-1, chloroplast precursor
+ATYNVKLITPEGEVELQVPDDVYILDQAEEDGIDLPYSCRAGSCSSCAGKVVSGSVDQSDQSYLDD
+>FER_CAPAA/1-66 Ferredoxin
+ASYKVKLITPDGPIEFDCPDDVYILDQAEEAGHDLPYSCRAGSCSSCAGKIAGGAVDQTDGNFLDD
+>FER_CAPAN/48-113 Ferredoxin, chloroplast precursor
+ASYKVKLITPDGPIEFDCPDNVYILDQAEEAGHDLPYSCRAGSCSSCAGKIAGGAVDQTDGNFLDD
+>FER1_SOLLC/48-113 Ferredoxin-1, chloroplast precursor
+ASYKVKLITPEGPIEFECPDDVYILDQAEEEGHDLPYSCRAGSCSSCAGKVTAGSVDQSDGNFLDE
+>Q93XJ9_SOLTU/48-113 Ferredoxin I precursor
+ASYKVKLITPDGPIEFECPDDVYILDQAEEEGHDLPYSCRAGSCSSCAGKVTAGTVDQSDGKFLDD
+>FER1_PEA/53-118 Ferredoxin-1, chloroplast precursor
+ASYKVKLVTPDGTQEFECPSDVYILDHAEEVGIDLPYSCRAGSCSSCAGKVVGGEVDQSDGSFLDD
+>Q7XA98_TRIPR/56-121 Ferredoxin I
+ATYKVKLITPEGPQEFDCPDDVYILDHAEEVGIELPYSCRAGSCSSCAGKVVNGNVNQEDGSFLDD
+>FER1_MESCR/52-117 Ferredoxin-1, chloroplast precursor
+AAYKVTLVTPEGKQELECPDDVYILDAAEEAGIDLPYSCRAGSCSSCAGKVTSGSVNQDDGSFLDD
+>FER1_SPIOL/51-116 Ferredoxin-1, chloroplast precursor
+AAYKVTLVTPTGNVEFQCPDDVYILDAAEEEGIDLPYSCRAGSCSSCAGKLKTGSLNQDDQSFLDD
+>FER3_RAPSA/1-66 Ferredoxin, leaf L-A
+ATYKVKFITPEGEQEVECDDDVYVLDAAEEAGIDLPYSCRAGSCSSCAGKVVSGSVDQSDQSFLDD
+>FER2_ARATH/53-118 Ferredoxin-1, chloroplast precursor
+ATYKVKFITPEGELEVECDDDVYVLDAAEEAGIDLPYSCRAGSCSSCAGKVVSGSVDQSDQSFLDD
+>FER_BRANA/1-66 Ferredoxin
+ATYKVKFITPEGEQEVECDDDVYVLDAAEEAGIDLPYSCRAGSCSSCAGKVVSGFVDQSDESFLDD
+>FER1_ARATH/53-118 Ferredoxin-2, chloroplast precursor
+ATYKVKFITPEGEQEVECEEDVYVLDAAEEAGLDLPYSCRAGSCSSCAGKVVSGSIDQSDQSFLDD
+>Q93Z60_ARATH/53-118 At1g10960/T19D16_12
+ATYKVKFITPEGEQEVECEEDVYVLDAAEEAGLDLPYSCRAGSCSSCAGKVVSGSIDQSDQSFLDD
+>O80429_MAIZE/45-110 Ferredoxin
+ATYNVKLITPEGEVELQVPDDVYILDFAEEEGIDLPFSCRAGSCSSCAGKVVSGSVDQSDQSFLND
diff --git a/utils/jalviewjs/site-resources/images/coolJalviewBackgroundFading.png b/utils/jalviewjs/site-resources/images/coolJalviewBackgroundFading.png
new file mode 100644 (file)
index 0000000..0a6eb6c
Binary files /dev/null and b/utils/jalviewjs/site-resources/images/coolJalviewBackgroundFading.png differ
diff --git a/utils/jalviewjs/site-resources/images/coolVeryLightBG.png b/utils/jalviewjs/site-resources/images/coolVeryLightBG.png
new file mode 100644 (file)
index 0000000..ce32520
Binary files /dev/null and b/utils/jalviewjs/site-resources/images/coolVeryLightBG.png differ
diff --git a/utils/jalviewjs/site-resources/jalview_embedded_example1.html b/utils/jalviewjs/site-resources/jalview_embedded_example1.html
new file mode 100644 (file)
index 0000000..7163d57
--- /dev/null
@@ -0,0 +1,134 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Embedded JalviewJS Example 1</title><meta charset="utf-8" />
+<script src="swingjs/swingjs2.js"></script>
+<script>
+if (!self.SwingJS)alert('swingjs2.js was not found. It needs to be in swingjs folder in the same directory as ' + document.location.href)
+Info = {
+  code: null,
+  main: "jalview.bin.JalviewJS2",
+//  core: "NONE",
+       core:"_jalview",
+  readyFunction: null,
+       serverURL: 'https://chemapps.stolaf.edu/jmol/jsmol/php/jsmol.php',
+       j2sPath: 'swingjs/j2s',
+       console:'none',
+       allowjavascript: true,
+       
+       //Jalview-specific:
+       // note that desktop-frame-div has been set to display:none
+       jalview_SCREEN_WIDTH: 0, // desktop width -- 0 to hide
+       jalview_SCREEN_HEIGHT: 0,  // desktop height -- 0 to hide
+       jalview_SCREEN_X: 10,
+       jalview_SCREEN_Y: 10,
+       jalview_EMBEDDED: true
+       
+}
+
+jvGet = function(what) {
+       switch(what) {
+       case "tree":
+       break;
+       case "pca":
+       break;
+       }
+       
+}
+</script>
+</head>
+<body style="background-image: url(images/coolVeryLightBG.png);">
+<table style="width:1400px;border:2px solid lightblue;border-spacing:0;font-size:16pt;" padding="10" valign="top">
+<tr>
+<td style="font-size:24;font-weight:bold;background-color:lightblue" colspan=2><center>Demonstration of embedded JalviewJS components</center>
+</td>
+
+
+</tr><tr>
+
+
+<td valign=top style="padding:20px;background-color:lightgray">
+<div style="padding:20px;width:600px;height:400px;overflow-y:auto;background-color:white">
+This simple page illustrates how one can embed the JalviewJS desktop into a web page. 
+The basic idea is that we have something interesting to say &mdash; some sort of scientific context &mdash; something we want to get 
+across to our visitors with more than just text and images. The idea is to have a <b>dynamic</b> page that will involve <b>user interaction</b>. 
+<br><br>
+We start with a Jalview desktop. You can't see it, because I have placed it in a <code>div</code> tag with style <i>width:0px;height:0px</i> just after the period that ends this sentence.
+<div id="jalview-desktop-div" style="width:0px;height:0px;"></div>
+<br>
+The idea is NOT to teach visitors how to use Jalview. The idea is to seamlessly integrate components of Jalview that can be used to enrich a discussion. 
+Like JSmol in <a target="_blank" href="http://proteopedia.org/wiki/index.php/Main_Page"><img src=https://pbs.twimg.com/profile_images/818051034/proteopedia_135x200_small_logo_for_Twitter_400x400.png width=16 height=16/>Proteopedia</a>.
+For example, in the space to the right, after a few seconds, you will see an alignment frame. This alignment is for 15 genes that code for one of the domains in the ferredoxin family (<a href=https://pfam.xfam.org/family/NIR_SIR_ferr target=_blank>NIR_SIR_ferr (PF03460)</a>). 
+<br><br>
+What you see initially is just the first few residues. Doesn't look like much of an alignment, does it? But <b>scroll to the right</b>. 
+See the big block of red color? That's the <i>Ferredoxin fold</i>domain.
+
+</div>
+</td><td style="background-color:lightgray;padding:20px">
+<div id="jalview-alignment-div" style="padding:20px;position:relative;top:0px;left:0px;width:680px;height:400px">
+<br><br>
+The alignment frame will appear here momentarily. When it does, you can go ahead and manipulate the alignment with your mouse.
+</div>
+</td>
+
+
+</tr><tr>
+
+
+<td colspan=2 valign=top style="padding:0px 0px 0px 0px"> 
+<table style="background-color:lightgray"><tr><td  style="padding:0px 0px 0px 20px">
+<b>Select a few alignments</b> by left-dragging across a few rows of the alignment to make a selection box. 
+Then click one of the buttons below to see more information about your selected subset of the alignment.
+<ul>
+<li><button onclick='jvGet("tree")'>similarity tree</button></li>
+<li><button onclick='jvGet("pca")'>principal component analysis</button></li>
+</ul>
+
+
+
+
+</td><td style="padding:0px 0px 0px 0px">
+<table style="border-spacing:0"><tr><td style="background-color:lightgray;padding:10px 0px 10px 20px">
+<div id="jalview-tree-div" style="position:relative;top:0px;left:0px;width:500px;height:500px">
+<br><br><br><br>
+jalview-tree-div
+</div>
+</td><td style="background-color:lightgray;padding:10px 20px 10px 0px">
+<div id="jalview-pca-div" style="position:relative;top:0px;left:0px;width:500px;height:500px">
+<br><br><br><br>
+jalview-pca-div
+</div>
+</td></tr></table>
+
+</td></tr></table>
+
+
+</td></tr>
+
+<tr>
+
+<td valign=top style="padding:20px;height:650px" >
+
+<div id="jalview-structureviewer-div" style="position:relative;top:0px;left:0px;width:600px;height:600px">
+jalview-strucddtureviewer-div
+</div>
+</td>
+<td valign=top style="padding:20px;background-color:white" >
+One more thing. Let's take a look at the 3D structure of one these proteins. Ferredoxins are important, because they have 
+iron-sulfur clusters that can accept and deliver electrons in metabolic processes. Let's see if we can find it. 
+<br><center><a href="">add the 3D structure</a></center> 
+</td></tr></table>
+
+
+<script>
+SwingJS.getApplet('testApplet', Info)
+getClassList = function(){J2S._saveFile('_j2sclasslist.txt', Clazz.ClassFilesLoaded.sort().join('\n'))}
+</script>
+
+
+<div style="display:none;position:absolute;left:900px;top:30px;width:600px;height:300px;">
+<div id="sysoutdiv" style="border:1px solid green;width:100%;height:95%;overflow:auto"></div>
+This is System.out. <a href="javascript:testApplet._clearConsole()">clear it</a> <br>Add ?j2snocore to URL to see full class list; ?j2sdebug to use uncompressed j2s/core files <br><a href="javascript:getClassList()">get _j2sClassList.txt</a>
+</div>
+</body>
+</html>
diff --git a/utils/jalviewjs/site-resources/javascript/deployJava.js b/utils/jalviewjs/site-resources/javascript/deployJava.js
new file mode 100644 (file)
index 0000000..8aa7a65
--- /dev/null
@@ -0,0 +1 @@
+var deployJava=function(){var l={core:["id","class","title","style"],i18n:["lang","dir"],events:["onclick","ondblclick","onmousedown","onmouseup","onmouseover","onmousemove","onmouseout","onkeypress","onkeydown","onkeyup"],applet:["codebase","code","name","archive","object","width","height","alt","align","hspace","vspace"],object:["classid","codebase","codetype","data","type","archive","declare","standby","height","width","usemap","name","tabindex","align","border","hspace","vspace"]};var b=l.object.concat(l.core,l.i18n,l.events);var m=l.applet.concat(l.core);function g(o){if(!d.debug){return}if(console.log){console.log(o)}else{alert(o)}}function k(p,o){if(p==null||p.length==0){return true}var r=p.charAt(p.length-1);if(r!="+"&&r!="*"&&(p.indexOf("_")!=-1&&r!="_")){p=p+"*";r="*"}p=p.substring(0,p.length-1);if(p.length>0){var q=p.charAt(p.length-1);if(q=="."||q=="_"){p=p.substring(0,p.length-1)}}if(r=="*"){return(o.indexOf(p)==0)}else{if(r=="+"){return p<=o}}return false}function e(){var o="//java.com/js/webstart.png";try{return document.location.protocol.indexOf("http")!=-1?o:"http:"+o}catch(p){return"http:"+o}}function n(p){var o="http://java.com/dt-redirect";if(p==null||p.length==0){return o}if(p.charAt(0)=="&"){p=p.substring(1,p.length)}return o+"?"+p}function j(q,p){var o=q.length;for(var r=0;r<o;r++){if(q[r]===p){return true}}return false}function c(o){return j(m,o.toLowerCase())}function i(o){return j(b,o.toLowerCase())}function a(o){if("MSIE"!=deployJava.browserName){return true}if(deployJava.compareVersionToPattern(deployJava.getPlugin().version,["10","0","0"],false,true)){return true}if(o==null){return false}return !k("1.6.0_33+",o)}var d={debug:null,version:"20120801",firefoxJavaVersion:null,myInterval:null,preInstallJREList:null,returnPage:null,brand:null,locale:null,installType:null,EAInstallEnabled:false,EarlyAccessURL:null,oldMimeType:"application/npruntime-scriptable-plugin;DeploymentToolkit",mimeType:"application/java-deployment-toolkit",launchButtonPNG:e(),browserName:null,browserName2:null,getJREs:function(){var t=new Array();if(this.isPluginInstalled()){var r=this.getPlugin();var o=r.jvms;for(var q=0;q<o.getLength();q++){t[q]=o.get(q).version}}else{var p=this.getBrowser();if(p=="MSIE"){if(this.testUsingActiveX("1.7.0")){t[0]="1.7.0"}else{if(this.testUsingActiveX("1.6.0")){t[0]="1.6.0"}else{if(this.testUsingActiveX("1.5.0")){t[0]="1.5.0"}else{if(this.testUsingActiveX("1.4.2")){t[0]="1.4.2"}else{if(this.testForMSVM()){t[0]="1.1"}}}}}}else{if(p=="Netscape Family"){this.getJPIVersionUsingMimeType();if(this.firefoxJavaVersion!=null){t[0]=this.firefoxJavaVersion}else{if(this.testUsingMimeTypes("1.7")){t[0]="1.7.0"}else{if(this.testUsingMimeTypes("1.6")){t[0]="1.6.0"}else{if(this.testUsingMimeTypes("1.5")){t[0]="1.5.0"}else{if(this.testUsingMimeTypes("1.4.2")){t[0]="1.4.2"}else{if(this.browserName2=="Safari"){if(this.testUsingPluginsArray("1.7.0")){t[0]="1.7.0"}else{if(this.testUsingPluginsArray("1.6")){t[0]="1.6.0"}else{if(this.testUsingPluginsArray("1.5")){t[0]="1.5.0"}else{if(this.testUsingPluginsArray("1.4.2")){t[0]="1.4.2"}}}}}}}}}}}}}if(this.debug){for(var q=0;q<t.length;++q){g("[getJREs()] We claim to have detected Java SE "+t[q])}}return t},installJRE:function(r,p){var o=false;if(this.isPluginInstalled()&&this.isAutoInstallEnabled(r)){var q=false;if(this.isCallbackSupported()){q=this.getPlugin().installJRE(r,p)}else{q=this.getPlugin().installJRE(r)}if(q){this.refresh();if(this.returnPage!=null){document.location=this.returnPage}}return q}else{return this.installLatestJRE()}},isAutoInstallEnabled:function(o){if(!this.isPluginInstalled()){return false}if(typeof o=="undefined"){o=null}return a(o)},isCallbackSupported:function(){return this.isPluginInstalled()&&this.compareVersionToPattern(this.getPlugin().version,["10","2","0"],false,true)},installLatestJRE:function(q){if(this.isPluginInstalled()&&this.isAutoInstallEnabled()){var r=false;if(this.isCallbackSupported()){r=this.getPlugin().installLatestJRE(q)}else{r=this.getPlugin().installLatestJRE()}if(r){this.refresh();if(this.returnPage!=null){document.location=this.returnPage}}return r}else{var p=this.getBrowser();var o=navigator.platform.toLowerCase();if((this.EAInstallEnabled=="true")&&(o.indexOf("win")!=-1)&&(this.EarlyAccessURL!=null)){this.preInstallJREList=this.getJREs();if(this.returnPage!=null){this.myInterval=setInterval("deployJava.poll()",3000)}location.href=this.EarlyAccessURL;return false}else{if(p=="MSIE"){return this.IEInstall()}else{if((p=="Netscape Family")&&(o.indexOf("win32")!=-1)){return this.FFInstall()}else{location.href=n(((this.returnPage!=null)?("&returnPage="+this.returnPage):"")+((this.locale!=null)?("&locale="+this.locale):"")+((this.brand!=null)?("&brand="+this.brand):""))}}return false}}},runApplet:function(p,u,r){if(r=="undefined"||r==null){r="1.1"}var t="^(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)(?:_(\\d+))?)?)?$";var o=r.match(t);if(this.returnPage==null){this.returnPage=document.location}if(o!=null){var q=this.getBrowser();if(q!="?"){if(this.versionCheck(r+"+")){this.writeAppletTag(p,u)}else{if(this.installJRE(r+"+")){this.refresh();location.href=document.location;this.writeAppletTag(p,u)}}}else{this.writeAppletTag(p,u)}}else{g("[runApplet()] Invalid minimumVersion argument to runApplet():"+r)}},writeAppletTag:function(r,w){var o="<"+"applet ";var q="";var t="<"+"/"+"applet"+">";var x=true;if(null==w||typeof w!="object"){w=new Object()}for(var p in r){if(!c(p)){w[p]=r[p]}else{o+=(" "+p+'="'+r[p]+'"');if(p=="code"){x=false}}}var v=false;for(var u in w){if(u=="codebase_lookup"){v=true}if(u=="object"||u=="java_object"||u=="java_code"){x=false}q+='<param name="'+u+'" value="'+w[u]+'"/>'}if(!v){q+='<param name="codebase_lookup" value="false"/>'}if(x){o+=(' code="dummy"')}o+=">";document.write(o+"\n"+q+"\n"+t)},versionCheck:function(p){var v=0;var x="^(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)(?:_(\\d+))?)?)?(\\*|\\+)?$";var y=p.match(x);if(y!=null){var r=false;var u=false;var q=new Array();for(var t=1;t<y.length;++t){if((typeof y[t]=="string")&&(y[t]!="")){q[v]=y[t];v++}}if(q[q.length-1]=="+"){u=true;r=false;q.length--}else{if(q[q.length-1]=="*"){u=false;r=true;q.length--}else{if(q.length<4){u=false;r=true}}}var w=this.getJREs();for(var t=0;t<w.length;++t){if(this.compareVersionToPattern(w[t],q,r,u)){return true}}return false}else{var o="Invalid versionPattern passed to versionCheck: "+p;g("[versionCheck()] "+o);alert(o);return false}},isWebStartInstalled:function(r){var q=this.getBrowser();if(q=="?"){return true}if(r=="undefined"||r==null){r="1.4.2"}var p=false;var t="^(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)(?:_(\\d+))?)?)?$";var o=r.match(t);if(o!=null){p=this.versionCheck(r+"+")}else{g("[isWebStartInstaller()] Invalid minimumVersion argument to isWebStartInstalled(): "+r);p=this.versionCheck("1.4.2+")}return p},getJPIVersionUsingMimeType:function(){for(var p=0;p<navigator.mimeTypes.length;++p){var q=navigator.mimeTypes[p].type;var o=q.match(/^application\/x-java-applet;jpi-version=(.*)$/);if(o!=null){this.firefoxJavaVersion=o[1];if("Opera"!=this.browserName2){break}}}},launchWebStartApplication:function(r){var o=navigator.userAgent.toLowerCase();this.getJPIVersionUsingMimeType();if(this.isWebStartInstalled("1.7.0")==false){if((this.installJRE("1.7.0+")==false)||((this.isWebStartInstalled("1.7.0")==false))){return false}}var u=null;if(document.documentURI){u=document.documentURI}if(u==null){u=document.URL}var p=this.getBrowser();var q;if(p=="MSIE"){q="<"+'object classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" '+'width="0" height="0">'+"<"+'PARAM name="launchjnlp" value="'+r+'"'+">"+"<"+'PARAM name="docbase" value="'+u+'"'+">"+"<"+"/"+"object"+">"}else{if(p=="Netscape Family"){q="<"+'embed type="application/x-java-applet;jpi-version='+this.firefoxJavaVersion+'" '+'width="0" height="0" '+'launchjnlp="'+r+'"'+'docbase="'+u+'"'+" />"}}if(document.body=="undefined"||document.body==null){document.write(q);document.location=u}else{var t=document.createElement("div");t.id="div1";t.style.position="relative";t.style.left="-10000px";t.style.margin="0px auto";t.className="dynamicDiv";t.innerHTML=q;document.body.appendChild(t)}},createWebStartLaunchButtonEx:function(q,p){if(this.returnPage==null){this.returnPage=q}var o="javascript:deployJava.launchWebStartApplication('"+q+"');";document.write("<"+'a href="'+o+"\" onMouseOver=\"window.status=''; "+'return true;"><'+"img "+'src="'+this.launchButtonPNG+'" '+'border="0" /><'+"/"+"a"+">")},createWebStartLaunchButton:function(q,p){if(this.returnPage==null){this.returnPage=q}var o="javascript:"+"if (!deployJava.isWebStartInstalled(&quot;"+p+"&quot;)) {"+"if (deployJava.installLatestJRE()) {"+"if (deployJava.launch(&quot;"+q+"&quot;)) {}"+"}"+"} else {"+"if (deployJava.launch(&quot;"+q+"&quot;)) {}"+"}";document.write("<"+'a href="'+o+"\" onMouseOver=\"window.status=''; "+'return true;"><'+"img "+'src="'+this.launchButtonPNG+'" '+'border="0" /><'+"/"+"a"+">")},launch:function(o){document.location=o;return true},isPluginInstalled:function(){var o=this.getPlugin();if(o&&o.jvms){return true}else{return false}},isAutoUpdateEnabled:function(){if(this.isPluginInstalled()){return this.getPlugin().isAutoUpdateEnabled()}return false},setAutoUpdateEnabled:function(){if(this.isPluginInstalled()){return this.getPlugin().setAutoUpdateEnabled()}return false},setInstallerType:function(o){this.installType=o;if(this.isPluginInstalled()){return this.getPlugin().setInstallerType(o)}return false},setAdditionalPackages:function(o){if(this.isPluginInstalled()){return this.getPlugin().setAdditionalPackages(o)}return false},setEarlyAccess:function(o){this.EAInstallEnabled=o},isPlugin2:function(){if(this.isPluginInstalled()){if(this.versionCheck("1.6.0_10+")){try{return this.getPlugin().isPlugin2()}catch(o){}}}return false},allowPlugin:function(){this.getBrowser();var o=("Safari"!=this.browserName2&&"Opera"!=this.browserName2);return o},getPlugin:function(){this.refresh();var o=null;if(this.allowPlugin()){o=document.getElementById("deployJavaPlugin")}return o},compareVersionToPattern:function(v,p,r,t){if(v==undefined||p==undefined){return false}var w="^(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)(?:_(\\d+))?)?)?$";var x=v.match(w);if(x!=null){var u=0;var y=new Array();for(var q=1;q<x.length;++q){if((typeof x[q]=="string")&&(x[q]!="")){y[u]=x[q];u++}}var o=Math.min(y.length,p.length);if(t){for(var q=0;q<o;++q){if(y[q]<p[q]){return false}else{if(y[q]>p[q]){return true}}}return true}else{for(var q=0;q<o;++q){if(y[q]!=p[q]){return false}}if(r){return true}else{return(y.length==p.length)}}}else{return false}},getBrowser:function(){if(this.browserName==null){var o=navigator.userAgent.toLowerCase();g("[getBrowser()] navigator.userAgent.toLowerCase() -> "+o);if((o.indexOf("msie")!=-1)&&(o.indexOf("opera")==-1)){this.browserName="MSIE";this.browserName2="MSIE"}else{if(o.indexOf("trident")!=-1||o.indexOf("Trident")!=-1){this.browserName="MSIE";this.browserName2="MSIE"}else{if(o.indexOf("iphone")!=-1){this.browserName="Netscape Family";this.browserName2="iPhone"}else{if((o.indexOf("firefox")!=-1)&&(o.indexOf("opera")==-1)){this.browserName="Netscape Family";this.browserName2="Firefox"}else{if(o.indexOf("chrome")!=-1){this.browserName="Netscape Family";this.browserName2="Chrome"}else{if(o.indexOf("safari")!=-1){this.browserName="Netscape Family";this.browserName2="Safari"}else{if((o.indexOf("mozilla")!=-1)&&(o.indexOf("opera")==-1)){this.browserName="Netscape Family";this.browserName2="Other"}else{if(o.indexOf("opera")!=-1){this.browserName="Netscape Family";this.browserName2="Opera"}else{this.browserName="?";this.browserName2="unknown"}}}}}}}}g("[getBrowser()] Detected browser name:"+this.browserName+", "+this.browserName2)}return this.browserName},testUsingActiveX:function(o){var q="JavaWebStart.isInstalled."+o+".0";if(typeof ActiveXObject=="undefined"||!ActiveXObject){g("[testUsingActiveX()] Browser claims to be IE, but no ActiveXObject object?");return false}try{return(new ActiveXObject(q)!=null)}catch(p){return false}},testForMSVM:function(){var p="{08B0E5C0-4FCB-11CF-AAA5-00401C608500}";if(typeof oClientCaps!="undefined"){var o=oClientCaps.getComponentVersion(p,"ComponentID");if((o=="")||(o=="5,0,5000,0")){return false}else{return true}}else{return false}},testUsingMimeTypes:function(p){if(!navigator.mimeTypes){g("[testUsingMimeTypes()] Browser claims to be Netscape family, but no mimeTypes[] array?");return false}for(var q=0;q<navigator.mimeTypes.length;++q){s=navigator.mimeTypes[q].type;var o=s.match(/^application\/x-java-applet\x3Bversion=(1\.8|1\.7|1\.6|1\.5|1\.4\.2)$/);if(o!=null){if(this.compareVersions(o[1],p)){return true}}}return false},testUsingPluginsArray:function(p){if((!navigator.plugins)||(!navigator.plugins.length)){return false}var o=navigator.platform.toLowerCase();for(var q=0;q<navigator.plugins.length;++q){s=navigator.plugins[q].description;if(s.search(/^Java Switchable Plug-in (Cocoa)/)!=-1){if(this.compareVersions("1.5.0",p)){return true}}else{if(s.search(/^Java/)!=-1){if(o.indexOf("win")!=-1){if(this.compareVersions("1.5.0",p)||this.compareVersions("1.6.0",p)){return true}}}}}if(this.compareVersions("1.5.0",p)){return true}return false},IEInstall:function(){location.href=n(((this.returnPage!=null)?("&returnPage="+this.returnPage):"")+((this.locale!=null)?("&locale="+this.locale):"")+((this.brand!=null)?("&brand="+this.brand):""));return false},done:function(p,o){},FFInstall:function(){location.href=n(((this.returnPage!=null)?("&returnPage="+this.returnPage):"")+((this.locale!=null)?("&locale="+this.locale):"")+((this.brand!=null)?("&brand="+this.brand):"")+((this.installType!=null)?("&type="+this.installType):""));return false},compareVersions:function(r,t){var p=r.split(".");var o=t.split(".");for(var q=0;q<p.length;++q){p[q]=Number(p[q])}for(var q=0;q<o.length;++q){o[q]=Number(o[q])}if(p.length==2){p[2]=0}if(p[0]>o[0]){return true}if(p[0]<o[0]){return false}if(p[1]>o[1]){return true}if(p[1]<o[1]){return false}if(p[2]>o[2]){return true}if(p[2]<o[2]){return false}return true},enableAlerts:function(){this.browserName=null;this.debug=true},poll:function(){this.refresh();var o=this.getJREs();if((this.preInstallJREList.length==0)&&(o.length!=0)){clearInterval(this.myInterval);if(this.returnPage!=null){location.href=this.returnPage}}if((this.preInstallJREList.length!=0)&&(o.length!=0)&&(this.preInstallJREList[0]!=o[0])){clearInterval(this.myInterval);if(this.returnPage!=null){location.href=this.returnPage}}},writePluginTag:function(){var o=this.getBrowser();if(o=="MSIE"){document.write("<"+'object classid="clsid:CAFEEFAC-DEC7-0000-0001-ABCDEFFEDCBA" '+'id="deployJavaPlugin" width="0" height="0">'+"<"+"/"+"object"+">")}else{if(o=="Netscape Family"&&this.allowPlugin()){this.writeEmbedTag()}}},refresh:function(){navigator.plugins.refresh(false);var o=this.getBrowser();if(o=="Netscape Family"&&this.allowPlugin()){var p=document.getElementById("deployJavaPlugin");if(p==null){this.writeEmbedTag()}}},writeEmbedTag:function(){var o=false;if(navigator.mimeTypes!=null){for(var p=0;p<navigator.mimeTypes.length;p++){if(navigator.mimeTypes[p].type==this.mimeType){if(navigator.mimeTypes[p].enabledPlugin){document.write("<"+'embed id="deployJavaPlugin" type="'+this.mimeType+'" hidden="true" />');o=true}}}if(!o){for(var p=0;p<navigator.mimeTypes.length;p++){if(navigator.mimeTypes[p].type==this.oldMimeType){if(navigator.mimeTypes[p].enabledPlugin){document.write("<"+'embed id="deployJavaPlugin" type="'+this.oldMimeType+'" hidden="true" />')}}}}}}};d.writePluginTag();if(d.locale==null){var h=null;if(h==null){try{h=navigator.userLanguage}catch(f){}}if(h==null){try{h=navigator.systemLanguage}catch(f){}}if(h==null){try{h=navigator.language}catch(f){}}if(h!=null){h.replace("-","_");d.locale=h}}return d}();
\ No newline at end of file
diff --git a/utils/jalviewjs/site-resources/javascript/facebox-1.3.js b/utils/jalviewjs/site-resources/javascript/facebox-1.3.js
new file mode 100644 (file)
index 0000000..ad45310
--- /dev/null
@@ -0,0 +1,309 @@
+/*
+ * Facebox (for jQuery)
+ * version: 1.2 (05/05/2008)
+ * @requires jQuery v1.2 or later
+ *
+ * Examples at http://famspam.com/facebox/
+ *
+ * Licensed under the MIT:
+ *   http://www.opensource.org/licenses/mit-license.php
+ *
+ * Copyright 2007, 2008 Chris Wanstrath [ chris@ozmm.org ]
+ *
+ * Usage:
+ *
+ *  jQuery(document).ready(function() {
+ *    jQuery('a[rel*=facebox]').facebox()
+ *  })
+ *
+ *  <a href="#terms" rel="facebox">Terms</a>
+ *    Loads the #terms div in the box
+ *
+ *  <a href="terms.html" rel="facebox">Terms</a>
+ *    Loads the terms.html page in the box
+ *
+ *  <a href="terms.png" rel="facebox">Terms</a>
+ *    Loads the terms.png image in the box
+ *
+ *
+ *  You can also use it programmatically:
+ *
+ *    jQuery.facebox('some html')
+ *    jQuery.facebox('some html', 'my-groovy-style')
+ *
+ *  The above will open a facebox with "some html" as the content.
+ *
+ *    jQuery.facebox(function($) {
+ *      $.get('blah.html', function(data) { $.facebox(data) })
+ *    })
+ *
+ *  The above will show a loading screen before the passed function is called,
+ *  allowing for a better ajaxy experience.
+ *
+ *  The facebox function can also display an ajax page, an image, or the contents of a div:
+ *
+ *    jQuery.facebox({ ajax: 'remote.html' })
+ *    jQuery.facebox({ ajax: 'remote.html' }, 'my-groovy-style')
+ *    jQuery.facebox({ image: 'stairs.jpg' })
+ *    jQuery.facebox({ image: 'stairs.jpg' }, 'my-groovy-style')
+ *    jQuery.facebox({ div: '#box' })
+ *    jQuery.facebox({ div: '#box' }, 'my-groovy-style')
+ *
+ *  Want to close the facebox?  Trigger the 'close.facebox' document event:
+ *
+ *    jQuery(document).trigger('close.facebox')
+ *
+ *  Facebox also has a bunch of other hooks:
+ *
+ *    loading.facebox
+ *    beforeReveal.facebox
+ *    reveal.facebox (aliased as 'afterReveal.facebox')
+ *    init.facebox
+ *    afterClose.facebox
+ *
+ *  Simply bind a function to any of these hooks:
+ *
+ *   $(document).bind('reveal.facebox', function() { ...stuff to do after the facebox and contents are revealed... })
+ *
+ */
+(function($) {
+  $.facebox = function(data, klass) {
+    $.facebox.loading()
+
+    if (data.ajax) fillFaceboxFromAjax(data.ajax, klass)
+    else if (data.image) fillFaceboxFromImage(data.image, klass)
+    else if (data.div) fillFaceboxFromHref(data.div, klass)
+    else if ($.isFunction(data)) data.call($)
+    else $.facebox.reveal(data, klass)
+  }
+
+  /*
+   * Public, $.facebox methods
+   */
+
+  $.extend($.facebox, {
+    settings: {
+      opacity      : 0.2,
+      overlay      : true,
+      loadingImage : 'https://raw.githubusercontent.com/jalview/biojson/gh-pages/images/loading.gif',
+      closeImage   : 'https://raw.githubusercontent.com/jalview/biojson/gh-pages/images/cancel.png',
+      imageTypes   : [ 'png', 'jpg', 'jpeg', 'gif' ],
+      faceboxHtml  : '\
+    <div id="facebox" style="display:none;"> \
+      <div class="popup"> \
+        <div class="content"> \
+        </div> \
+        <a href="#" class="close"><img src="https://raw.githubusercontent.com/jalview/biojson/gh-pages/images/cancel.png" title="close" class="close_image" /></a> \
+      </div> \
+    </div>'
+    },
+
+    loading: function() {
+      init()
+      if ($('#facebox .loading').length == 1) return true
+      showOverlay()
+
+      $('#facebox .content').empty()
+      $('#facebox .body').children().hide().end().
+        append('<div class="loading"><img src="'+$.facebox.settings.loadingImage+'"/></div>')
+
+      $('#facebox').css({
+        top:   getPageScroll()[1] + (getPageHeight() / 10),
+        left:  $(window).width() / 2 - 205
+      }).show()
+
+      $(document).bind('keydown.facebox', function(e) {
+        if (e.keyCode == 27) $.facebox.close()
+        return true
+      })
+      $(document).trigger('loading.facebox')
+    },
+
+    reveal: function(data, klass) {
+      $(document).trigger('beforeReveal.facebox')
+      if (klass) $('#facebox .content').addClass(klass)
+      $('#facebox .content').append('<pre><code>'+JSON.stringify(JSON.parse(data),null,4)+'</pre></code>')
+      $('#facebox .loading').remove()
+      $('#facebox .body').children().fadeIn('normal')
+      $('#facebox').css('left', $(window).width() / 2 - ($('#facebox .popup').width() / 2))
+      $(document).trigger('reveal.facebox').trigger('afterReveal.facebox')
+    },
+
+    close: function() {
+      $(document).trigger('close.facebox')
+      return false
+    }
+  })
+
+  /*
+   * Public, $.fn methods
+   */
+
+  $.fn.facebox = function(settings) {
+    if ($(this).length == 0) return
+
+    init(settings)
+
+    function clickHandler() {
+      $.facebox.loading(true)
+
+      // support for rel="facebox.inline_popup" syntax, to add a class
+      // also supports deprecated "facebox[.inline_popup]" syntax
+      var klass = this.rel.match(/facebox\[?\.(\w+)\]?/)
+      if (klass) klass = klass[1]
+
+      fillFaceboxFromHref(this.href, klass)
+      return false
+    }
+
+    return this.bind('click.facebox', clickHandler)
+  }
+
+  /*
+   * Private methods
+   */
+
+  // called one time to setup facebox on this page
+  function init(settings) {
+    if ($.facebox.settings.inited) return true
+    else $.facebox.settings.inited = true
+
+    $(document).trigger('init.facebox')
+    makeCompatible()
+
+    var imageTypes = $.facebox.settings.imageTypes.join('|')
+    $.facebox.settings.imageTypesRegexp = new RegExp('\.(' + imageTypes + ')$', 'i')
+
+    if (settings) $.extend($.facebox.settings, settings)
+    $('body').append($.facebox.settings.faceboxHtml)
+
+    var preload = [ new Image(), new Image() ]
+    preload[0].src = $.facebox.settings.closeImage
+    preload[1].src = $.facebox.settings.loadingImage
+
+    $('#facebox').find('.b:first, .bl').each(function() {
+      preload.push(new Image())
+      preload.slice(-1).src = $(this).css('background-image').replace(/url\((.+)\)/, '$1')
+    })
+
+    $('#facebox .close').click($.facebox.close)
+    $('#facebox .close_image').attr('src', $.facebox.settings.closeImage)
+  }
+
+  // getPageScroll() by quirksmode.com
+  function getPageScroll() {
+    var xScroll, yScroll;
+    if (self.pageYOffset) {
+      yScroll = self.pageYOffset;
+      xScroll = self.pageXOffset;
+    } else if (document.documentElement && document.documentElement.scrollTop) {        // Explorer 6 Strict
+      yScroll = document.documentElement.scrollTop;
+      xScroll = document.documentElement.scrollLeft;
+    } else if (document.body) {// all other Explorers
+      yScroll = document.body.scrollTop;
+      xScroll = document.body.scrollLeft;
+    }
+    return new Array(xScroll,yScroll)
+  }
+
+  // Adapted from getPageSize() by quirksmode.com
+  function getPageHeight() {
+    var windowHeight
+    if (self.innerHeight) {    // all except Explorer
+      windowHeight = self.innerHeight;
+    } else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
+      windowHeight = document.documentElement.clientHeight;
+    } else if (document.body) { // other Explorers
+      windowHeight = document.body.clientHeight;
+    }
+    return windowHeight
+  }
+
+  // Backwards compatibility
+  function makeCompatible() {
+    var $s = $.facebox.settings
+
+    $s.loadingImage = $s.loading_image || $s.loadingImage
+    $s.closeImage = $s.close_image || $s.closeImage
+    $s.imageTypes = $s.image_types || $s.imageTypes
+    $s.faceboxHtml = $s.facebox_html || $s.faceboxHtml
+  }
+
+  // Figures out what you want to display and displays it
+  // formats are:
+  //     div: #id
+  //   image: blah.extension
+  //    ajax: anything else
+  function fillFaceboxFromHref(href, klass) {
+    // div
+    if (href.match(/#/)) {
+      var url    = window.location.href.split('#')[0]
+      var target = href.replace(url,'')
+      if (target == '#') return
+      $.facebox.reveal($(target).html(), klass)
+
+    // image
+    } else if (href.match($.facebox.settings.imageTypesRegexp)) {
+      fillFaceboxFromImage(href, klass)
+    // ajax
+    } else {
+      fillFaceboxFromAjax(href, klass)
+    }
+  }
+
+  function fillFaceboxFromImage(href, klass) {
+    var image = new Image()
+    image.onload = function() {
+      $.facebox.reveal('<div class="image"><img src="' + image.src + '" /></div>', klass)
+    }
+    image.src = href
+  }
+
+  function fillFaceboxFromAjax(href, klass) {
+    $.get(href, function(data) { $.facebox.reveal(data, klass) })
+  }
+
+  function skipOverlay() {
+    return $.facebox.settings.overlay == false || $.facebox.settings.opacity === null
+  }
+
+  function showOverlay() {
+    if (skipOverlay()) return
+
+    if ($('#facebox_overlay').length == 0)
+      $("body").append('<div id="facebox_overlay" class="facebox_hide"></div>')
+
+    $('#facebox_overlay').hide().addClass("facebox_overlayBG")
+      .css('opacity', $.facebox.settings.opacity)
+      .click(function() { $(document).trigger('close.facebox') })
+      .fadeIn(200)
+    return false
+  }
+
+  function hideOverlay() {
+    if (skipOverlay()) return
+
+    $('#facebox_overlay').fadeOut(200, function(){
+      $("#facebox_overlay").removeClass("facebox_overlayBG")
+      $("#facebox_overlay").addClass("facebox_hide")
+      $("#facebox_overlay").remove()
+    })
+
+    return false
+  }
+
+  /*
+   * Bindings
+   */
+
+  $(document).bind('close.facebox', function() {
+    $(document).unbind('keydown.facebox')
+    $('#facebox').fadeOut(function() {
+      $('#facebox .content').removeClass().addClass('content')
+      $('#facebox .loading').remove()
+      $(document).trigger('afterClose.facebox')
+    })
+    hideOverlay()
+  })
+
+})(jQuery);
diff --git a/utils/jalviewjs/site-resources/javascript/jalview.js b/utils/jalviewjs/site-resources/javascript/jalview.js
new file mode 100644 (file)
index 0000000..1c1f1c2
--- /dev/null
@@ -0,0 +1,380 @@
+/**
+ * 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.
+ */
+
+
+
+
+
+
+
+
+
+// default console to report messages
+var _console = document.getElementById("stdout");
+var _jvapps = new Array();
+// jvjmols is a list associating a jmol id to { modelstofiles }
+var _jvjmols = new Hashtable();
+// array of model names used to lookup index in Jmol
+var _modeltofiles = new Array();
+// counter for jmol structures
+var mnum = 1;
+
+function getDocumentBase() {
+       var dburi = document.baseURI;
+       // IE does not support document.baseURI
+       // logic from patch to TYPO3:
+       // http://forge.typo3.org/projects/typo3cms-core/repository/revisions/f61358afad28adb6dcaeb270ba480e998dfb0b79/diff/typo3/sysext/rtehtmlarea/htmlarea/htmlarea.js
+       if (!dburi) {
+               var baseTags = document.getElementsByTagName('base');
+               if (baseTags.length > 0) {
+                       dburi = baseTags[0].href;
+               } else {
+                       dburi = document.URL;
+               }
+       }
+       return dburi.substring(0, dburi.lastIndexOf("/") + 1);
+}
+function setConsole(console) {
+       _console = console;
+}
+
+function getDestinationFrms(source, frames) {
+       var frms = new Array();
+       var frid = "";
+       for (frm in frames) {
+               try {
+                       frid = (source!=null) && (("" + source.getSequenceSetId()) == ("" + frames[frm].currentAlignFrame
+                                       .getSequenceSetId()));
+               } catch (q) {
+               };
+               
+               if (!frames[frm].equals(source) && !frid
+                               && !frames[frm].currentAlignFrame.equals(source)) {
+                       frms[frms.length] = frames[frm];
+               }
+       }
+       return frms;
+}
+
+function mouseover(list1, list2, list3, list4) {
+       // list1 = new Object(list1);
+       var list = new Array(("" + list1), ("" + list2), ("" + list3), ("" + list4));
+       var msg = "Mouse over :\n" + "AlignFrame obj: " + list1 + " Seq : "
+                       + list[1] + "\nPos: " + list[2] + "(" + list[3] + ")\n";
+
+       var flist = getDestinationFrms(list1, _jvapps);
+       if (_console) {
+               _console.value = msg + "\n";
+       }
+
+       for (follower in flist) {
+               if (_console) {
+                       _console.value += "Sending to " + flist[follower] + "\n";
+               }
+               flist[follower].highlight(list[1], list[2], "true");
+       }
+       return true;
+}
+
+function sellist(list1, list2, list3, list4) {
+       // list1 = new Object(list1);
+       var list = new Array(("" + list1), ("" + list2), ("" + list3), ("" + list4));
+       var msg = "Selection:\n" + "AlignFrame obj: " + list[0] + " id : "
+                       + list[1] + "\nSeqs " + list[2] + "\nColumns " + list[3] + "\n";
+       var flist = getDestinationFrms(list1, _jvapps);
+       if (_console) {
+               _console.value = msg + "\n";
+       }
+       
+       for (follower in flist) {
+               if (_console) {
+                       _console.value += "Sending to " + flist[follower] + "\n";
+               }
+               flist[follower].selectIn(flist[follower].getDefaultTargetFrame(),
+                               list[2], list[3])
+       }
+       return true;
+}
+
+function viewlist(list1, list2, list3, list4) {
+       // list1 = new Object(list1);
+       var list = new Array(("" + list1), ("" + list2), ("" + list3), ("" + list4));
+       var msg = "Viewport extent change::\n" + "AlignFrame obj: " + list[0]
+                       + " id : " + list[1] + "\nRow from " + list[2] + " and to "
+                       + list[3] + "\nVisible columns: " + list[4] + "\n";
+       var flist = getDestinationFrms(list1, _jvapps);
+       if (_console) {
+               _console.value = msg + "\n";
+       }
+
+       for (follower in flist) {
+               if (_console) {
+                       _console.value += "Sending to " + flist[follower] + "\n";
+               }
+               flist[follower].scrollToViewIn(flist[follower].getDefaultTargetFrame(),
+                               list[2], "-1");
+       }
+       return true;
+}
+
+// register a jalview applet and add some handlers to it
+// jmolView is a reference to a jmol applet that is displaying the PDB files listed (in order) in the modeltofiles Array
+function linkJvJmol(applet, jmolView, modeltofiles) {
+       var i = _jvapps.length;
+       while (i--) {
+               if (_jvapps[i].equals(applet)) {
+                       throw ("Ignoring additional linkJvJmol call for "
+                                       + applet.getName() + ".");
+               }
+       }
+       _jvapps[_jvapps.length] = applet;
+       applet.setMouseoverListener("mouseover");
+       applet.setSelectionListener("sellist");
+       // viewListener not fully implemented in 2.7
+       // try { applet.setViewListener("viewlist"); } catch (err) {};
+       if (jmolView)
+       {
+               var sep = applet.getSeparator();
+               var oldjm=jmolView;
+               // recover full id of Jmol applet
+               jmolView=jmolFindTarget(jmolView)._id; // Jmol 14.2.14
+               var jmbinding=_jvjmols.get(jmolView);
+               if (!jmbinding)
+               {       
+                       jmbinding=new Object();
+                       jmbinding._modelstofiles=new Array();
+                       jmbinding._fullmpath=new Array();
+                       jmbinding._filetonum=new Hashtable();
+                       jmbinding._jmol=jmolView;
+                       jmbinding._jmhandle=oldjm;
+                       _jvjmols.put(jmolView,jmbinding);
+               }
+               
+               jmbinding._modelstofiles=jmbinding._modelstofiles.concat(jmbinding._modelstofiles,modeltofiles);
+               jmbinding._jmol=jmolView;
+               // now update structureListener list
+               mtf="";
+               var dbase = getDocumentBase();
+               for (m in jmbinding._modelstofiles)
+               { if (m>0) { mtf+=sep; }
+               mtf+=jmbinding._modelstofiles[m];
+               if (jmbinding._modelstofiles[m].indexOf("//")==-1)
+                       { jmbinding._fullmpath[m] = dbase+((jmbinding._modelstofiles[m].indexOf("/")==0) ? jmbinding._modelstofiles[m].substring(1) : jmbinding._modelstofiles[m]); }
+                 jmbinding._filetonum.put(jmbinding._modelstofiles[m], m+1); 
+                 jmbinding._filetonum.put(jmbinding._fullmpath[m], m+1);
+                 
+                 }
+               applet.setStructureListener("_structure", mtf);
+       }
+}
+
+/*function _addJmolModel(jmolid, modelname) {
+       modelname=""+modelname;
+       var jminf = _jvjmols[jmolid];
+       if (!jminf) {
+               jminf = new Object();
+               jminf._modelstofiles = new Array(); //new Hashtable();
+               jminf._jmol = jmolid;
+               jminf._modellist=new Array();
+               _jvjmols[jmolid] = jminf;
+       }
+       var obj = new Object();
+       jminf._modeltofiles[modelname] = obj; // .put(modelname, obj);
+       obj.id = modelname;
+       obj.mnum = jminf._modeltofiles.length;
+       jminf._modellist+=modelname;
+}*/
+
+
+
+// jmol Jalview Methods
+
+function _structure(list1, list2, list3, list4) {
+       var follower;
+       // if (_console) { if (!_console.value) { _console.value="";} }
+       if (list1 == "mouseover") {
+               var list = new Array(("" + list1), ("" + list2), ("" + list3),
+                               ("" + list4));
+               // 1 is pdb file, 2 is residue number, 3 is chain
+               // list1 = new Object(list1);
+               var base = list[1].indexOf(getDocumentBase()); // .indexOf(_path);
+               if (base==0) { base = getDocumentBase(); }
+               var sid = list[1]; // .substring(base);
+               base = list[1].substring(0, base);
+               if (_console) {
+                       _console.value += "Model is " + list[1] + ", Structure id is : "
+                                       + sid + "\n";
+               }
+               ;
+               var siddat;
+               for ( var jmolappi in _jvjmols.values()) {
+                       var jmolapp=_jvjmols.values()[jmolappi];
+                       var msg = "";
+                       if (siddat = jmolapp._filetonum.get(sid)) {
+                               // we don't putin chain number because there isn't one ?
+                               // skip select 0 bit
+                               var ch = ""+list[3];
+                               if ((""+list[2]).trim().length==1)
+                                       {
+                                       ch+=":"+list[2];
+                                       }
+                               msg = "select (" + ch + " /" + siddat + ") ;";
+                       }
+                       if (msg) {
+                               if (_console) {
+                                       _console.value += "Sending '" + msg + "' to jmol." + "\n";
+                               }
+                       }
+                       jmolScriptWait(msg, "" + jmolapp._jmhandle);
+                       // only do highlight for one jmol ?
+                       // return 1;
+               }
+       }
+       if (list1 == "colourstruct") {
+               if (_console) {
+                       _console.value += 'colourStruct("' + list1 + '","' + list2
+                       + '") [' + list4 + ']' + "\n";
+               }
+               setTimeout('colourStruct("'+list4+'","' + list1 + '","' + list2 + '")', 1);
+               return 1;
+       }
+       return 1;
+}
+// last colour message
+var _lastMsg = "";
+// indicator - if _colourStruct==0 then no colouring is going on
+var _colourStruct = 0;
+
+function colourStruct(involves, msg, handle) {
+       if (_colourStruct == 0) {
+               _colourStruct = 1;
+               for (ap in _jvapps) {
+                       var _msg = "";
+                       do {
+                               if (_msg.match(/\S/)) {
+                                       _lastMsg += _msg;
+                               }
+                               _msg = "" + _jvapps[ap].getJsMessage(msg, handle);
+                       } while (_msg.match(/\S/));
+               }
+               // locate the jmol that should get the message
+               for (var jmol in _jvjmols.values())
+                       {
+                       var jml=_jvjmols.values()[jmol];
+                       if (jml._filetonum.get(involves))
+                               {
+                                       colourStructs(jml._jmhandle);
+                               }
+                       }
+               _colourStruct = 0;
+       } else {
+               // setTimeout('colourStruct("'+msg+'","'+handle+'")',3);
+       }
+}
+
+function colourStructs(jmolapp) {
+       dbg(0, "Colouring the structures\n");
+       jmolScriptWait("set selectionhalos false;" + _lastMsg
+                       + "; select 0; set selectionhalos true;", jmolapp);
+       _lastMsg = "";
+}
+var _jmolhovermsg="";
+function _jmolhover(jmid, atomlabel, atomidx) {
+       var msg=""+jmid+" "+atomlabel+" "+atomidx;
+       if (_jmolhovermsg==msg)
+               {
+               return;
+               }
+       _jmolhovermsg=msg;
+       modeltofiles = _jvjmols.get(jmid)._modelstofiles;
+       // atomlabel=(""+atomlabel).match(/\[(.+)\](\d+):(.)\.(\S+)\s*\/(\d+)\..+/);
+       // relaxed third parameter - may be null or a model number for multi model
+       // views
+       atomlabel = ("" + atomlabel)
+                       .match(/\[(.+)\](\d+):(.)\.([^\/]+)(\/\d+\.|).+/);
+       atomidx = "" + atomidx;
+       if (atomlabel[5]) {
+               atomlabel[5] = atomlabel[5].match(/\/(.+)\./)[1];
+               atomlabel[5] = parseInt(atomlabel[5])-1;
+       } else {
+               // default - first model
+               atomlabel[5] = 0;
+       }
+       // use atomlabel[5] to look up model filename so we can highlight associated positions in any jalviews
+       for (ap in _jvapps) {
+               pdb = getDocumentBase() + modeltofiles[atomlabel[5]];
+               _jvapps[ap].mouseOverStructure(atomlabel[2], atomlabel[3], pdb);
+               msg = _jmolhovermsg;
+       }
+}
+function _jmolpick(jmid, atomlabel, atomidx) {
+       atomlabel = "" + atomlabel;
+       atomidx = "" + atomidx;
+       // label is atom id, atom number, and xyz coordinates in the form:
+       // C6 #6 -0.30683374 -1.6836332 -0.716934
+       // atom index, starting with 0.
+
+}
+function _jmolMessagecallback(jmid, statmess) {
+       // if (statmess.indexOf("Script Terminated")==0)
+       {
+               var thisTime = new Date();
+               if (_console) {
+                       _console.value += "Last script execution took : "
+                                       + (thisTime.valueOf() - _lastTime.valueOf()) / 1000.0
+                                       + " seconds.";
+               }
+               _lastTime = thisTime;
+
+       }
+}
+
+
+  function lJvApp() {
+    setTimeout(function() {
+       //alert("in lJvApp");
+       var jvapp = document.getElementById("jvapp");
+       var jvfollower = document.getElementById("jvfollower");
+       //console.log(">>>>>>>> lJvApp" + jvapp);
+       linkJvJmol(jvapp);
+    }, 200);
+    setConsole(document.getElementById("stdout"));
+  };
+
+  function lJvFollow() {
+    setTimeout(function() {
+       //alert("in lJvFollow");
+       var jvapp = document.getElementById("jvapp");
+       var jvfollower = document.getElementById("jvfollower");
+       console.log(">>>>>>> lJvFollow" + jvfollower);
+       linkJvJmol(jvfollower);
+    }, 200);
+  };
+
+  function lJvA() {
+    setTimeout(function() {
+      //alert("lJvA");
+      jvfollower = document.getElementById("jvA");
+      setConsole(document.getElementById("stdout"));  
+      //sep = jvfollower.getSeparator();
+      //jvapp.setSeparator(""+jvapp.getSeparator());
+      linkJvJmol(jvfollower, "jmolView", modeltofiles);
+    }, 100);
+  };
+
diff --git a/utils/jalviewjs/site-resources/javascript/jquery-1.4.4.min.js b/utils/jalviewjs/site-resources/javascript/jquery-1.4.4.min.js
new file mode 100644 (file)
index 0000000..8f3ca2e
--- /dev/null
@@ -0,0 +1,167 @@
+/*!
+ * jQuery JavaScript Library v1.4.4
+ * http://jquery.com/
+ *
+ * Copyright 2010, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2010, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Thu Nov 11 19:04:53 2010 -0500
+ */
+(function(E,B){function ka(a,b,d){if(d===B&&a.nodeType===1){d=a.getAttribute("data-"+b);if(typeof d==="string"){try{d=d==="true"?true:d==="false"?false:d==="null"?null:!c.isNaN(d)?parseFloat(d):Ja.test(d)?c.parseJSON(d):d}catch(e){}c.data(a,b,d)}else d=B}return d}function U(){return false}function ca(){return true}function la(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function Ka(a){var b,d,e,f,h,l,k,o,x,r,A,C=[];f=[];h=c.data(this,this.nodeType?"events":"__events__");if(typeof h==="function")h=
+h.events;if(!(a.liveFired===this||!h||!h.live||a.button&&a.type==="click")){if(a.namespace)A=RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)");a.liveFired=this;var J=h.live.slice(0);for(k=0;k<J.length;k++){h=J[k];h.origType.replace(X,"")===a.type?f.push(h.selector):J.splice(k--,1)}f=c(a.target).closest(f,a.currentTarget);o=0;for(x=f.length;o<x;o++){r=f[o];for(k=0;k<J.length;k++){h=J[k];if(r.selector===h.selector&&(!A||A.test(h.namespace))){l=r.elem;e=null;if(h.preType==="mouseenter"||
+h.preType==="mouseleave"){a.type=h.preType;e=c(a.relatedTarget).closest(h.selector)[0]}if(!e||e!==l)C.push({elem:l,handleObj:h,level:r.level})}}}o=0;for(x=C.length;o<x;o++){f=C[o];if(d&&f.level>d)break;a.currentTarget=f.elem;a.data=f.handleObj.data;a.handleObj=f.handleObj;A=f.handleObj.origHandler.apply(f.elem,arguments);if(A===false||a.isPropagationStopped()){d=f.level;if(A===false)b=false;if(a.isImmediatePropagationStopped())break}}return b}}function Y(a,b){return(a&&a!=="*"?a+".":"")+b.replace(La,
+"`").replace(Ma,"&")}function ma(a,b,d){if(c.isFunction(b))return c.grep(a,function(f,h){return!!b.call(f,h,f)===d});else if(b.nodeType)return c.grep(a,function(f){return f===b===d});else if(typeof b==="string"){var e=c.grep(a,function(f){return f.nodeType===1});if(Na.test(b))return c.filter(b,e,!d);else b=c.filter(b,e)}return c.grep(a,function(f){return c.inArray(f,b)>=0===d})}function na(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var e=c.data(a[d++]),f=c.data(this,
+e);if(e=e&&e.events){delete f.handle;f.events={};for(var h in e)for(var l in e[h])c.event.add(this,h,e[h][l],e[h][l].data)}}})}function Oa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function oa(a,b,d){var e=b==="width"?a.offsetWidth:a.offsetHeight;if(d==="border")return e;c.each(b==="width"?Pa:Qa,function(){d||(e-=parseFloat(c.css(a,"padding"+this))||0);if(d==="margin")e+=parseFloat(c.css(a,
+"margin"+this))||0;else e-=parseFloat(c.css(a,"border"+this+"Width"))||0});return e}function da(a,b,d,e){if(c.isArray(b)&&b.length)c.each(b,function(f,h){d||Ra.test(a)?e(a,h):da(a+"["+(typeof h==="object"||c.isArray(h)?f:"")+"]",h,d,e)});else if(!d&&b!=null&&typeof b==="object")c.isEmptyObject(b)?e(a,""):c.each(b,function(f,h){da(a+"["+f+"]",h,d,e)});else e(a,b)}function S(a,b){var d={};c.each(pa.concat.apply([],pa.slice(0,b)),function(){d[this]=a});return d}function qa(a){if(!ea[a]){var b=c("<"+
+a+">").appendTo("body"),d=b.css("display");b.remove();if(d==="none"||d==="")d="block";ea[a]=d}return ea[a]}function fa(a){return c.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var t=E.document,c=function(){function a(){if(!b.isReady){try{t.documentElement.doScroll("left")}catch(j){setTimeout(a,1);return}b.ready()}}var b=function(j,s){return new b.fn.init(j,s)},d=E.jQuery,e=E.$,f,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,l=/\S/,k=/^\s+/,o=/\s+$/,x=/\W/,r=/\d/,A=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,
+C=/^[\],:{}\s]*$/,J=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,w=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,I=/(?:^|:|,)(?:\s*\[)+/g,L=/(webkit)[ \/]([\w.]+)/,g=/(opera)(?:.*version)?[ \/]([\w.]+)/,i=/(msie) ([\w.]+)/,n=/(mozilla)(?:.*? rv:([\w.]+))?/,m=navigator.userAgent,p=false,q=[],u,y=Object.prototype.toString,F=Object.prototype.hasOwnProperty,M=Array.prototype.push,N=Array.prototype.slice,O=String.prototype.trim,D=Array.prototype.indexOf,R={};b.fn=b.prototype={init:function(j,
+s){var v,z,H;if(!j)return this;if(j.nodeType){this.context=this[0]=j;this.length=1;return this}if(j==="body"&&!s&&t.body){this.context=t;this[0]=t.body;this.selector="body";this.length=1;return this}if(typeof j==="string")if((v=h.exec(j))&&(v[1]||!s))if(v[1]){H=s?s.ownerDocument||s:t;if(z=A.exec(j))if(b.isPlainObject(s)){j=[t.createElement(z[1])];b.fn.attr.call(j,s,true)}else j=[H.createElement(z[1])];else{z=b.buildFragment([v[1]],[H]);j=(z.cacheable?z.fragment.cloneNode(true):z.fragment).childNodes}return b.merge(this,
+j)}else{if((z=t.getElementById(v[2]))&&z.parentNode){if(z.id!==v[2])return f.find(j);this.length=1;this[0]=z}this.context=t;this.selector=j;return this}else if(!s&&!x.test(j)){this.selector=j;this.context=t;j=t.getElementsByTagName(j);return b.merge(this,j)}else return!s||s.jquery?(s||f).find(j):b(s).find(j);else if(b.isFunction(j))return f.ready(j);if(j.selector!==B){this.selector=j.selector;this.context=j.context}return b.makeArray(j,this)},selector:"",jquery:"1.4.4",length:0,size:function(){return this.length},
+toArray:function(){return N.call(this,0)},get:function(j){return j==null?this.toArray():j<0?this.slice(j)[0]:this[j]},pushStack:function(j,s,v){var z=b();b.isArray(j)?M.apply(z,j):b.merge(z,j);z.prevObject=this;z.context=this.context;if(s==="find")z.selector=this.selector+(this.selector?" ":"")+v;else if(s)z.selector=this.selector+"."+s+"("+v+")";return z},each:function(j,s){return b.each(this,j,s)},ready:function(j){b.bindReady();if(b.isReady)j.call(t,b);else q&&q.push(j);return this},eq:function(j){return j===
+-1?this.slice(j):this.slice(j,+j+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(N.apply(this,arguments),"slice",N.call(arguments).join(","))},map:function(j){return this.pushStack(b.map(this,function(s,v){return j.call(s,v,s)}))},end:function(){return this.prevObject||b(null)},push:M,sort:[].sort,splice:[].splice};b.fn.init.prototype=b.fn;b.extend=b.fn.extend=function(){var j,s,v,z,H,G=arguments[0]||{},K=1,Q=arguments.length,ga=false;
+if(typeof G==="boolean"){ga=G;G=arguments[1]||{};K=2}if(typeof G!=="object"&&!b.isFunction(G))G={};if(Q===K){G=this;--K}for(;K<Q;K++)if((j=arguments[K])!=null)for(s in j){v=G[s];z=j[s];if(G!==z)if(ga&&z&&(b.isPlainObject(z)||(H=b.isArray(z)))){if(H){H=false;v=v&&b.isArray(v)?v:[]}else v=v&&b.isPlainObject(v)?v:{};G[s]=b.extend(ga,v,z)}else if(z!==B)G[s]=z}return G};b.extend({noConflict:function(j){E.$=e;if(j)E.jQuery=d;return b},isReady:false,readyWait:1,ready:function(j){j===true&&b.readyWait--;
+if(!b.readyWait||j!==true&&!b.isReady){if(!t.body)return setTimeout(b.ready,1);b.isReady=true;if(!(j!==true&&--b.readyWait>0))if(q){var s=0,v=q;for(q=null;j=v[s++];)j.call(t,b);b.fn.trigger&&b(t).trigger("ready").unbind("ready")}}},bindReady:function(){if(!p){p=true;if(t.readyState==="complete")return setTimeout(b.ready,1);if(t.addEventListener){t.addEventListener("DOMContentLoaded",u,false);E.addEventListener("load",b.ready,false)}else if(t.attachEvent){t.attachEvent("onreadystatechange",u);E.attachEvent("onload",
+b.ready);var j=false;try{j=E.frameElement==null}catch(s){}t.documentElement.doScroll&&j&&a()}}},isFunction:function(j){return b.type(j)==="function"},isArray:Array.isArray||function(j){return b.type(j)==="array"},isWindow:function(j){return j&&typeof j==="object"&&"setInterval"in j},isNaN:function(j){return j==null||!r.test(j)||isNaN(j)},type:function(j){return j==null?String(j):R[y.call(j)]||"object"},isPlainObject:function(j){if(!j||b.type(j)!=="object"||j.nodeType||b.isWindow(j))return false;if(j.constructor&&
+!F.call(j,"constructor")&&!F.call(j.constructor.prototype,"isPrototypeOf"))return false;for(var s in j);return s===B||F.call(j,s)},isEmptyObject:function(j){for(var s in j)return false;return true},error:function(j){throw j;},parseJSON:function(j){if(typeof j!=="string"||!j)return null;j=b.trim(j);if(C.test(j.replace(J,"@").replace(w,"]").replace(I,"")))return E.JSON&&E.JSON.parse?E.JSON.parse(j):(new Function("return "+j))();else b.error("Invalid JSON: "+j)},noop:function(){},globalEval:function(j){if(j&&
+l.test(j)){var s=t.getElementsByTagName("head")[0]||t.documentElement,v=t.createElement("script");v.type="text/javascript";if(b.support.scriptEval)v.appendChild(t.createTextNode(j));else v.text=j;s.insertBefore(v,s.firstChild);s.removeChild(v)}},nodeName:function(j,s){return j.nodeName&&j.nodeName.toUpperCase()===s.toUpperCase()},each:function(j,s,v){var z,H=0,G=j.length,K=G===B||b.isFunction(j);if(v)if(K)for(z in j){if(s.apply(j[z],v)===false)break}else for(;H<G;){if(s.apply(j[H++],v)===false)break}else if(K)for(z in j){if(s.call(j[z],
+z,j[z])===false)break}else for(v=j[0];H<G&&s.call(v,H,v)!==false;v=j[++H]);return j},trim:O?function(j){return j==null?"":O.call(j)}:function(j){return j==null?"":j.toString().replace(k,"").replace(o,"")},makeArray:function(j,s){var v=s||[];if(j!=null){var z=b.type(j);j.length==null||z==="string"||z==="function"||z==="regexp"||b.isWindow(j)?M.call(v,j):b.merge(v,j)}return v},inArray:function(j,s){if(s.indexOf)return s.indexOf(j);for(var v=0,z=s.length;v<z;v++)if(s[v]===j)return v;return-1},merge:function(j,
+s){var v=j.length,z=0;if(typeof s.length==="number")for(var H=s.length;z<H;z++)j[v++]=s[z];else for(;s[z]!==B;)j[v++]=s[z++];j.length=v;return j},grep:function(j,s,v){var z=[],H;v=!!v;for(var G=0,K=j.length;G<K;G++){H=!!s(j[G],G);v!==H&&z.push(j[G])}return z},map:function(j,s,v){for(var z=[],H,G=0,K=j.length;G<K;G++){H=s(j[G],G,v);if(H!=null)z[z.length]=H}return z.concat.apply([],z)},guid:1,proxy:function(j,s,v){if(arguments.length===2)if(typeof s==="string"){v=j;j=v[s];s=B}else if(s&&!b.isFunction(s)){v=
+s;s=B}if(!s&&j)s=function(){return j.apply(v||this,arguments)};if(j)s.guid=j.guid=j.guid||s.guid||b.guid++;return s},access:function(j,s,v,z,H,G){var K=j.length;if(typeof s==="object"){for(var Q in s)b.access(j,Q,s[Q],z,H,v);return j}if(v!==B){z=!G&&z&&b.isFunction(v);for(Q=0;Q<K;Q++)H(j[Q],s,z?v.call(j[Q],Q,H(j[Q],s)):v,G);return j}return K?H(j[0],s):B},now:function(){return(new Date).getTime()},uaMatch:function(j){j=j.toLowerCase();j=L.exec(j)||g.exec(j)||i.exec(j)||j.indexOf("compatible")<0&&n.exec(j)||
+[];return{browser:j[1]||"",version:j[2]||"0"}},browser:{}});b.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(j,s){R["[object "+s+"]"]=s.toLowerCase()});m=b.uaMatch(m);if(m.browser){b.browser[m.browser]=true;b.browser.version=m.version}if(b.browser.webkit)b.browser.safari=true;if(D)b.inArray=function(j,s){return D.call(s,j)};if(!/\s/.test("\u00a0")){k=/^[\s\xA0]+/;o=/[\s\xA0]+$/}f=b(t);if(t.addEventListener)u=function(){t.removeEventListener("DOMContentLoaded",u,
+false);b.ready()};else if(t.attachEvent)u=function(){if(t.readyState==="complete"){t.detachEvent("onreadystatechange",u);b.ready()}};return E.jQuery=E.$=b}();(function(){c.support={};var a=t.documentElement,b=t.createElement("script"),d=t.createElement("div"),e="script"+c.now();d.style.display="none";d.innerHTML="   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var f=d.getElementsByTagName("*"),h=d.getElementsByTagName("a")[0],l=t.createElement("select"),
+k=l.appendChild(t.createElement("option"));if(!(!f||!f.length||!h)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(h.getAttribute("style")),hrefNormalized:h.getAttribute("href")==="/a",opacity:/^0.55$/.test(h.style.opacity),cssFloat:!!h.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:k.selected,deleteExpando:true,optDisabled:false,checkClone:false,
+scriptEval:false,noCloneEvent:true,boxModel:null,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableHiddenOffsets:true};l.disabled=true;c.support.optDisabled=!k.disabled;b.type="text/javascript";try{b.appendChild(t.createTextNode("window."+e+"=1;"))}catch(o){}a.insertBefore(b,a.firstChild);if(E[e]){c.support.scriptEval=true;delete E[e]}try{delete b.test}catch(x){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function r(){c.support.noCloneEvent=
+false;d.detachEvent("onclick",r)});d.cloneNode(true).fireEvent("onclick")}d=t.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=t.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var r=t.createElement("div");r.style.width=r.style.paddingLeft="1px";t.body.appendChild(r);c.boxModel=c.support.boxModel=r.offsetWidth===2;if("zoom"in r.style){r.style.display="inline";r.style.zoom=
+1;c.support.inlineBlockNeedsLayout=r.offsetWidth===2;r.style.display="";r.innerHTML="<div style='width:4px;'></div>";c.support.shrinkWrapBlocks=r.offsetWidth!==2}r.innerHTML="<table><tr><td style='padding:0;display:none'></td><td>t</td></tr></table>";var A=r.getElementsByTagName("td");c.support.reliableHiddenOffsets=A[0].offsetHeight===0;A[0].style.display="";A[1].style.display="none";c.support.reliableHiddenOffsets=c.support.reliableHiddenOffsets&&A[0].offsetHeight===0;r.innerHTML="";t.body.removeChild(r).style.display=
+"none"});a=function(r){var A=t.createElement("div");r="on"+r;var C=r in A;if(!C){A.setAttribute(r,"return;");C=typeof A[r]==="function"}return C};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=f=h=null}})();var ra={},Ja=/^(?:\{.*\}|\[.*\])$/;c.extend({cache:{},uuid:0,expando:"jQuery"+c.now(),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},data:function(a,b,d){if(c.acceptData(a)){a=a==E?ra:a;var e=a.nodeType,f=e?a[c.expando]:null,h=
+c.cache;if(!(e&&!f&&typeof b==="string"&&d===B)){if(e)f||(a[c.expando]=f=++c.uuid);else h=a;if(typeof b==="object")if(e)h[f]=c.extend(h[f],b);else c.extend(h,b);else if(e&&!h[f])h[f]={};a=e?h[f]:h;if(d!==B)a[b]=d;return typeof b==="string"?a[b]:a}}},removeData:function(a,b){if(c.acceptData(a)){a=a==E?ra:a;var d=a.nodeType,e=d?a[c.expando]:a,f=c.cache,h=d?f[e]:e;if(b){if(h){delete h[b];d&&c.isEmptyObject(h)&&c.removeData(a)}}else if(d&&c.support.deleteExpando)delete a[c.expando];else if(a.removeAttribute)a.removeAttribute(c.expando);
+else if(d)delete f[e];else for(var l in a)delete a[l]}},acceptData:function(a){if(a.nodeName){var b=c.noData[a.nodeName.toLowerCase()];if(b)return!(b===true||a.getAttribute("classid")!==b)}return true}});c.fn.extend({data:function(a,b){var d=null;if(typeof a==="undefined"){if(this.length){var e=this[0].attributes,f;d=c.data(this[0]);for(var h=0,l=e.length;h<l;h++){f=e[h].name;if(f.indexOf("data-")===0){f=f.substr(5);ka(this[0],f,d[f])}}}return d}else if(typeof a==="object")return this.each(function(){c.data(this,
+a)});var k=a.split(".");k[1]=k[1]?"."+k[1]:"";if(b===B){d=this.triggerHandler("getData"+k[1]+"!",[k[0]]);if(d===B&&this.length){d=c.data(this[0],a);d=ka(this[0],a,d)}return d===B&&k[1]?this.data(k[0]):d}else return this.each(function(){var o=c(this),x=[k[0],b];o.triggerHandler("setData"+k[1]+"!",x);c.data(this,a,b);o.triggerHandler("changeData"+k[1]+"!",x)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var e=
+c.data(a,b);if(!d)return e||[];if(!e||c.isArray(d))e=c.data(a,b,c.makeArray(d));else e.push(d);return e}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),e=d.shift();if(e==="inprogress")e=d.shift();if(e){b==="fx"&&d.unshift("inprogress");e.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===B)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,
+a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var sa=/[\n\t]/g,ha=/\s+/,Sa=/\r/g,Ta=/^(?:href|src|style)$/,Ua=/^(?:button|input)$/i,Va=/^(?:button|input|object|select|textarea)$/i,Wa=/^a(?:rea)?$/i,ta=/^(?:radio|checkbox)$/i;c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",
+colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};c.fn.extend({attr:function(a,b){return c.access(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(x){var r=c(this);r.addClass(a.call(this,x,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ha),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===
+1)if(f.className){for(var h=" "+f.className+" ",l=f.className,k=0,o=b.length;k<o;k++)if(h.indexOf(" "+b[k]+" ")<0)l+=" "+b[k];f.className=c.trim(l)}else f.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(o){var x=c(this);x.removeClass(a.call(this,o,x.attr("class")))});if(a&&typeof a==="string"||a===B)for(var b=(a||"").split(ha),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===1&&f.className)if(a){for(var h=(" "+f.className+" ").replace(sa," "),
+l=0,k=b.length;l<k;l++)h=h.replace(" "+b[l]+" "," ");f.className=c.trim(h)}else f.className=""}return this},toggleClass:function(a,b){var d=typeof a,e=typeof b==="boolean";if(c.isFunction(a))return this.each(function(f){var h=c(this);h.toggleClass(a.call(this,f,h.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var f,h=0,l=c(this),k=b,o=a.split(ha);f=o[h++];){k=e?k:!l.hasClass(f);l[k?"addClass":"removeClass"](f)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,
+"__className__",this.className);this.className=this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(sa," ").indexOf(a)>-1)return true;return false},val:function(a){if(!arguments.length){var b=this[0];if(b){if(c.nodeName(b,"option")){var d=b.attributes.value;return!d||d.specified?b.value:b.text}if(c.nodeName(b,"select")){var e=b.selectedIndex;d=[];var f=b.options;b=b.type==="select-one";
+if(e<0)return null;var h=b?e:0;for(e=b?e+1:f.length;h<e;h++){var l=f[h];if(l.selected&&(c.support.optDisabled?!l.disabled:l.getAttribute("disabled")===null)&&(!l.parentNode.disabled||!c.nodeName(l.parentNode,"optgroup"))){a=c(l).val();if(b)return a;d.push(a)}}return d}if(ta.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Sa,"")}return B}var k=c.isFunction(a);return this.each(function(o){var x=c(this),r=a;if(this.nodeType===1){if(k)r=
+a.call(this,o,x.val());if(r==null)r="";else if(typeof r==="number")r+="";else if(c.isArray(r))r=c.map(r,function(C){return C==null?"":C+""});if(c.isArray(r)&&ta.test(this.type))this.checked=c.inArray(x.val(),r)>=0;else if(c.nodeName(this,"select")){var A=c.makeArray(r);c("option",this).each(function(){this.selected=c.inArray(c(this).val(),A)>=0});if(!A.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},
+attr:function(a,b,d,e){if(!a||a.nodeType===3||a.nodeType===8)return B;if(e&&b in c.attrFn)return c(a)[b](d);e=a.nodeType!==1||!c.isXMLDoc(a);var f=d!==B;b=e&&c.props[b]||b;var h=Ta.test(b);if((b in a||a[b]!==B)&&e&&!h){if(f){b==="type"&&Ua.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");if(d===null)a.nodeType===1&&a.removeAttribute(b);else a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&
+b.specified?b.value:Va.test(a.nodeName)||Wa.test(a.nodeName)&&a.href?0:B;return a[b]}if(!c.support.style&&e&&b==="style"){if(f)a.style.cssText=""+d;return a.style.cssText}f&&a.setAttribute(b,""+d);if(!a.attributes[b]&&a.hasAttribute&&!a.hasAttribute(b))return B;a=!c.support.hrefNormalized&&e&&h?a.getAttribute(b,2):a.getAttribute(b);return a===null?B:a}});var X=/\.(.*)$/,ia=/^(?:textarea|input|select)$/i,La=/\./g,Ma=/ /g,Xa=/[^\w\s.|`]/g,Ya=function(a){return a.replace(Xa,"\\$&")},ua={focusin:0,focusout:0};
+c.event={add:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(c.isWindow(a)&&a!==E&&!a.frameElement)a=E;if(d===false)d=U;else if(!d)return;var f,h;if(d.handler){f=d;d=f.handler}if(!d.guid)d.guid=c.guid++;if(h=c.data(a)){var l=a.nodeType?"events":"__events__",k=h[l],o=h.handle;if(typeof k==="function"){o=k.handle;k=k.events}else if(!k){a.nodeType||(h[l]=h=function(){});h.events=k={}}if(!o)h.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,
+arguments):B};o.elem=a;b=b.split(" ");for(var x=0,r;l=b[x++];){h=f?c.extend({},f):{handler:d,data:e};if(l.indexOf(".")>-1){r=l.split(".");l=r.shift();h.namespace=r.slice(0).sort().join(".")}else{r=[];h.namespace=""}h.type=l;if(!h.guid)h.guid=d.guid;var A=k[l],C=c.event.special[l]||{};if(!A){A=k[l]=[];if(!C.setup||C.setup.call(a,e,r,o)===false)if(a.addEventListener)a.addEventListener(l,o,false);else a.attachEvent&&a.attachEvent("on"+l,o)}if(C.add){C.add.call(a,h);if(!h.handler.guid)h.handler.guid=
+d.guid}A.push(h);c.event.global[l]=true}a=null}}},global:{},remove:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(d===false)d=U;var f,h,l=0,k,o,x,r,A,C,J=a.nodeType?"events":"__events__",w=c.data(a),I=w&&w[J];if(w&&I){if(typeof I==="function"){w=I;I=I.events}if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(f in I)c.event.remove(a,f+b)}else{for(b=b.split(" ");f=b[l++];){r=f;k=f.indexOf(".")<0;o=[];if(!k){o=f.split(".");f=o.shift();x=RegExp("(^|\\.)"+
+c.map(o.slice(0).sort(),Ya).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(A=I[f])if(d){r=c.event.special[f]||{};for(h=e||0;h<A.length;h++){C=A[h];if(d.guid===C.guid){if(k||x.test(C.namespace)){e==null&&A.splice(h--,1);r.remove&&r.remove.call(a,C)}if(e!=null)break}}if(A.length===0||e!=null&&A.length===1){if(!r.teardown||r.teardown.call(a,o)===false)c.removeEvent(a,f,w.handle);delete I[f]}}else for(h=0;h<A.length;h++){C=A[h];if(k||x.test(C.namespace)){c.event.remove(a,r,C.handler,h);A.splice(h--,1)}}}if(c.isEmptyObject(I)){if(b=
+w.handle)b.elem=null;delete w.events;delete w.handle;if(typeof w==="function")c.removeData(a,J);else c.isEmptyObject(w)&&c.removeData(a)}}}}},trigger:function(a,b,d,e){var f=a.type||a;if(!e){a=typeof a==="object"?a[c.expando]?a:c.extend(c.Event(f),a):c.Event(f);if(f.indexOf("!")>=0){a.type=f=f.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[f]&&c.each(c.cache,function(){this.events&&this.events[f]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===
+8)return B;a.result=B;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(e=d.nodeType?c.data(d,"handle"):(c.data(d,"__events__")||{}).handle)&&e.apply(d,b);e=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+f]&&d["on"+f].apply(d,b)===false){a.result=false;a.preventDefault()}}catch(h){}if(!a.isPropagationStopped()&&e)c.event.trigger(a,b,e,true);else if(!a.isDefaultPrevented()){var l;e=a.target;var k=f.replace(X,""),o=c.nodeName(e,"a")&&k===
+"click",x=c.event.special[k]||{};if((!x._default||x._default.call(d,a)===false)&&!o&&!(e&&e.nodeName&&c.noData[e.nodeName.toLowerCase()])){try{if(e[k]){if(l=e["on"+k])e["on"+k]=null;c.event.triggered=true;e[k]()}}catch(r){}if(l)e["on"+k]=l;c.event.triggered=false}}},handle:function(a){var b,d,e,f;d=[];var h=c.makeArray(arguments);a=h[0]=c.event.fix(a||E.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;if(!b){e=a.type.split(".");a.type=e.shift();d=e.slice(0).sort();e=RegExp("(^|\\.)"+
+d.join("\\.(?:.*\\.)?")+"(\\.|$)")}a.namespace=a.namespace||d.join(".");f=c.data(this,this.nodeType?"events":"__events__");if(typeof f==="function")f=f.events;d=(f||{})[a.type];if(f&&d){d=d.slice(0);f=0;for(var l=d.length;f<l;f++){var k=d[f];if(b||e.test(k.namespace)){a.handler=k.handler;a.data=k.data;a.handleObj=k;k=k.handler.apply(this,h);if(k!==B){a.result=k;if(k===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
+fix:function(a){if(a[c.expando])return a;var b=a;a=c.Event(b);for(var d=this.props.length,e;d;){e=this.props[--d];a[e]=b[e]}if(!a.target)a.target=a.srcElement||t;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=t.documentElement;d=t.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
+d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(a.which==null&&(a.charCode!=null||a.keyCode!=null))a.which=a.charCode!=null?a.charCode:a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==B)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,Y(a.origType,a.selector),c.extend({},a,{handler:Ka,guid:a.handler.guid}))},remove:function(a){c.event.remove(this,
+Y(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,d){if(c.isWindow(this))this.onbeforeunload=d},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};c.removeEvent=t.removeEventListener?function(a,b,d){a.removeEventListener&&a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent&&a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=a;this.type=a.type}else this.type=a;this.timeStamp=
+c.now();this[c.expando]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=ca;var a=this.originalEvent;if(a)if(a.preventDefault)a.preventDefault();else a.returnValue=false},stopPropagation:function(){this.isPropagationStopped=ca;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=ca;this.stopPropagation()},isDefaultPrevented:U,isPropagationStopped:U,isImmediatePropagationStopped:U};
+var va=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},wa=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?wa:va,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?wa:va)}}});if(!c.support.submitBubbles)c.event.special.submit={setup:function(){if(this.nodeName.toLowerCase()!==
+"form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length){a.liveFired=B;return la("submit",this,arguments)}});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13){a.liveFired=B;return la("submit",this,arguments)}})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};if(!c.support.changeBubbles){var V,
+xa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(e){return e.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},Z=function(a,b){var d=a.target,e,f;if(!(!ia.test(d.nodeName)||d.readOnly)){e=c.data(d,"_change_data");f=xa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",f);if(!(e===B||f===e))if(e!=null||f){a.type="change";a.liveFired=
+B;return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:Z,beforedeactivate:Z,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return Z.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return Z.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,"_change_data",xa(a))}},setup:function(){if(this.type===
+"file")return false;for(var a in V)c.event.add(this,a+".specialChange",V[a]);return ia.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return ia.test(this.nodeName)}};V=c.event.special.change.filters;V.focus=V.beforeactivate}t.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(e){e=c.event.fix(e);e.type=b;return c.event.trigger(e,null,e.target)}c.event.special[b]={setup:function(){ua[b]++===0&&t.addEventListener(a,d,true)},teardown:function(){--ua[b]===
+0&&t.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,e,f){if(typeof d==="object"){for(var h in d)this[b](h,e,d[h],f);return this}if(c.isFunction(e)||e===false){f=e;e=B}var l=b==="one"?c.proxy(f,function(o){c(this).unbind(o,l);return f.apply(this,arguments)}):f;if(d==="unload"&&b!=="one")this.one(d,e,f);else{h=0;for(var k=this.length;h<k;h++)c.event.add(this[h],d,l,e)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&!a.preventDefault)for(var d in a)this.unbind(d,
+a[d]);else{d=0;for(var e=this.length;d<e;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,e){return this.live(b,d,e,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){var d=c.Event(a);d.preventDefault();d.stopPropagation();c.event.trigger(d,b,this[0]);return d.result}},toggle:function(a){for(var b=arguments,d=
+1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(e){var f=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,f+1);e.preventDefault();return b[f].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var ya={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,e,f,h){var l,k=0,o,x,r=h||this.selector;h=h?this:c(this.context);if(typeof d===
+"object"&&!d.preventDefault){for(l in d)h[b](l,e,d[l],r);return this}if(c.isFunction(e)){f=e;e=B}for(d=(d||"").split(" ");(l=d[k++])!=null;){o=X.exec(l);x="";if(o){x=o[0];l=l.replace(X,"")}if(l==="hover")d.push("mouseenter"+x,"mouseleave"+x);else{o=l;if(l==="focus"||l==="blur"){d.push(ya[l]+x);l+=x}else l=(ya[l]||l)+x;if(b==="live"){x=0;for(var A=h.length;x<A;x++)c.event.add(h[x],"live."+Y(l,r),{data:e,selector:r,handler:f,origType:l,origHandler:f,preType:o})}else h.unbind("live."+Y(l,r),f)}}return this}});
+c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){c.fn[b]=function(d,e){if(e==null){e=d;d=null}return arguments.length>0?this.bind(b,d,e):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});E.attachEvent&&!E.addEventListener&&c(E).bind("unload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});
+(function(){function a(g,i,n,m,p,q){p=0;for(var u=m.length;p<u;p++){var y=m[p];if(y){var F=false;for(y=y[g];y;){if(y.sizcache===n){F=m[y.sizset];break}if(y.nodeType===1&&!q){y.sizcache=n;y.sizset=p}if(y.nodeName.toLowerCase()===i){F=y;break}y=y[g]}m[p]=F}}}function b(g,i,n,m,p,q){p=0;for(var u=m.length;p<u;p++){var y=m[p];if(y){var F=false;for(y=y[g];y;){if(y.sizcache===n){F=m[y.sizset];break}if(y.nodeType===1){if(!q){y.sizcache=n;y.sizset=p}if(typeof i!=="string"){if(y===i){F=true;break}}else if(k.filter(i,
+[y]).length>0){F=y;break}}y=y[g]}m[p]=F}}}var d=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,h=false,l=true;[0,0].sort(function(){l=false;return 0});var k=function(g,i,n,m){n=n||[];var p=i=i||t;if(i.nodeType!==1&&i.nodeType!==9)return[];if(!g||typeof g!=="string")return n;var q,u,y,F,M,N=true,O=k.isXML(i),D=[],R=g;do{d.exec("");if(q=d.exec(R)){R=q[3];D.push(q[1]);if(q[2]){F=q[3];
+break}}}while(q);if(D.length>1&&x.exec(g))if(D.length===2&&o.relative[D[0]])u=L(D[0]+D[1],i);else for(u=o.relative[D[0]]?[i]:k(D.shift(),i);D.length;){g=D.shift();if(o.relative[g])g+=D.shift();u=L(g,u)}else{if(!m&&D.length>1&&i.nodeType===9&&!O&&o.match.ID.test(D[0])&&!o.match.ID.test(D[D.length-1])){q=k.find(D.shift(),i,O);i=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]}if(i){q=m?{expr:D.pop(),set:C(m)}:k.find(D.pop(),D.length===1&&(D[0]==="~"||D[0]==="+")&&i.parentNode?i.parentNode:i,O);u=q.expr?k.filter(q.expr,
+q.set):q.set;if(D.length>0)y=C(u);else N=false;for(;D.length;){q=M=D.pop();if(o.relative[M])q=D.pop();else M="";if(q==null)q=i;o.relative[M](y,q,O)}}else y=[]}y||(y=u);y||k.error(M||g);if(f.call(y)==="[object Array]")if(N)if(i&&i.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&k.contains(i,y[g])))n.push(u[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&n.push(u[g]);else n.push.apply(n,y);else C(y,n);if(F){k(F,p,n,m);k.uniqueSort(n)}return n};k.uniqueSort=function(g){if(w){h=
+l;g.sort(w);if(h)for(var i=1;i<g.length;i++)g[i]===g[i-1]&&g.splice(i--,1)}return g};k.matches=function(g,i){return k(g,null,null,i)};k.matchesSelector=function(g,i){return k(i,null,null,[g]).length>0};k.find=function(g,i,n){var m;if(!g)return[];for(var p=0,q=o.order.length;p<q;p++){var u,y=o.order[p];if(u=o.leftMatch[y].exec(g)){var F=u[1];u.splice(1,1);if(F.substr(F.length-1)!=="\\"){u[1]=(u[1]||"").replace(/\\/g,"");m=o.find[y](u,i,n);if(m!=null){g=g.replace(o.match[y],"");break}}}}m||(m=i.getElementsByTagName("*"));
+return{set:m,expr:g}};k.filter=function(g,i,n,m){for(var p,q,u=g,y=[],F=i,M=i&&i[0]&&k.isXML(i[0]);g&&i.length;){for(var N in o.filter)if((p=o.leftMatch[N].exec(g))!=null&&p[2]){var O,D,R=o.filter[N];D=p[1];q=false;p.splice(1,1);if(D.substr(D.length-1)!=="\\"){if(F===y)y=[];if(o.preFilter[N])if(p=o.preFilter[N](p,F,n,y,m,M)){if(p===true)continue}else q=O=true;if(p)for(var j=0;(D=F[j])!=null;j++)if(D){O=R(D,p,j,F);var s=m^!!O;if(n&&O!=null)if(s)q=true;else F[j]=false;else if(s){y.push(D);q=true}}if(O!==
+B){n||(F=y);g=g.replace(o.match[N],"");if(!q)return[];break}}}if(g===u)if(q==null)k.error(g);else break;u=g}return F};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var o=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+\-]*)\))?/,
+POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},relative:{"+":function(g,i){var n=typeof i==="string",m=n&&!/\W/.test(i);n=n&&!m;if(m)i=i.toLowerCase();m=0;for(var p=g.length,q;m<p;m++)if(q=g[m]){for(;(q=q.previousSibling)&&q.nodeType!==1;);g[m]=n||q&&q.nodeName.toLowerCase()===
+i?q||false:q===i}n&&k.filter(i,g,true)},">":function(g,i){var n,m=typeof i==="string",p=0,q=g.length;if(m&&!/\W/.test(i))for(i=i.toLowerCase();p<q;p++){if(n=g[p]){n=n.parentNode;g[p]=n.nodeName.toLowerCase()===i?n:false}}else{for(;p<q;p++)if(n=g[p])g[p]=m?n.parentNode:n.parentNode===i;m&&k.filter(i,g,true)}},"":function(g,i,n){var m,p=e++,q=b;if(typeof i==="string"&&!/\W/.test(i)){m=i=i.toLowerCase();q=a}q("parentNode",i,p,g,m,n)},"~":function(g,i,n){var m,p=e++,q=b;if(typeof i==="string"&&!/\W/.test(i)){m=
+i=i.toLowerCase();q=a}q("previousSibling",i,p,g,m,n)}},find:{ID:function(g,i,n){if(typeof i.getElementById!=="undefined"&&!n)return(g=i.getElementById(g[1]))&&g.parentNode?[g]:[]},NAME:function(g,i){if(typeof i.getElementsByName!=="undefined"){for(var n=[],m=i.getElementsByName(g[1]),p=0,q=m.length;p<q;p++)m[p].getAttribute("name")===g[1]&&n.push(m[p]);return n.length===0?null:n}},TAG:function(g,i){return i.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,i,n,m,p,q){g=" "+g[1].replace(/\\/g,
+"")+" ";if(q)return g;q=0;for(var u;(u=i[q])!=null;q++)if(u)if(p^(u.className&&(" "+u.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))n||m.push(u);else if(n)i[q]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},CHILD:function(g){if(g[1]==="nth"){var i=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=i[1]+(i[2]||1)-0;g[3]=i[3]-0}g[0]=e++;return g},ATTR:function(g,i,n,
+m,p,q){i=g[1].replace(/\\/g,"");if(!q&&o.attrMap[i])g[1]=o.attrMap[i];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,i,n,m,p){if(g[1]==="not")if((d.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,i);else{g=k.filter(g[3],i,n,true^p);n||m.push.apply(m,g);return false}else if(o.match.POS.test(g[0])||o.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===
+true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,i,n){return!!k(n[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===
+g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},setFilters:{first:function(g,i){return i===0},last:function(g,i,n,m){return i===m.length-1},even:function(g,i){return i%2===0},odd:function(g,i){return i%2===1},lt:function(g,i,n){return i<n[3]-0},gt:function(g,i,n){return i>n[3]-0},nth:function(g,i,n){return n[3]-
+0===i},eq:function(g,i,n){return n[3]-0===i}},filter:{PSEUDO:function(g,i,n,m){var p=i[1],q=o.filters[p];if(q)return q(g,n,i,m);else if(p==="contains")return(g.textContent||g.innerText||k.getText([g])||"").indexOf(i[3])>=0;else if(p==="not"){i=i[3];n=0;for(m=i.length;n<m;n++)if(i[n]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+p)},CHILD:function(g,i){var n=i[1],m=g;switch(n){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(n===
+"first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":n=i[2];var p=i[3];if(n===1&&p===0)return true;var q=i[0],u=g.parentNode;if(u&&(u.sizcache!==q||!g.nodeIndex)){var y=0;for(m=u.firstChild;m;m=m.nextSibling)if(m.nodeType===1)m.nodeIndex=++y;u.sizcache=q}m=g.nodeIndex-p;return n===0?m===0:m%n===0&&m/n>=0}},ID:function(g,i){return g.nodeType===1&&g.getAttribute("id")===i},TAG:function(g,i){return i==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===
+i},CLASS:function(g,i){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(i)>-1},ATTR:function(g,i){var n=i[1];n=o.attrHandle[n]?o.attrHandle[n](g):g[n]!=null?g[n]:g.getAttribute(n);var m=n+"",p=i[2],q=i[4];return n==null?p==="!=":p==="="?m===q:p==="*="?m.indexOf(q)>=0:p==="~="?(" "+m+" ").indexOf(q)>=0:!q?m&&n!==false:p==="!="?m!==q:p==="^="?m.indexOf(q)===0:p==="$="?m.substr(m.length-q.length)===q:p==="|="?m===q||m.substr(0,q.length+1)===q+"-":false},POS:function(g,i,n,m){var p=o.setFilters[i[2]];
+if(p)return p(g,n,i,m)}}},x=o.match.POS,r=function(g,i){return"\\"+(i-0+1)},A;for(A in o.match){o.match[A]=RegExp(o.match[A].source+/(?![^\[]*\])(?![^\(]*\))/.source);o.leftMatch[A]=RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[A].source.replace(/\\(\d+)/g,r))}var C=function(g,i){g=Array.prototype.slice.call(g,0);if(i){i.push.apply(i,g);return i}return g};try{Array.prototype.slice.call(t.documentElement.childNodes,0)}catch(J){C=function(g,i){var n=0,m=i||[];if(f.call(g)==="[object Array]")Array.prototype.push.apply(m,
+g);else if(typeof g.length==="number")for(var p=g.length;n<p;n++)m.push(g[n]);else for(;g[n];n++)m.push(g[n]);return m}}var w,I;if(t.documentElement.compareDocumentPosition)w=function(g,i){if(g===i){h=true;return 0}if(!g.compareDocumentPosition||!i.compareDocumentPosition)return g.compareDocumentPosition?-1:1;return g.compareDocumentPosition(i)&4?-1:1};else{w=function(g,i){var n,m,p=[],q=[];n=g.parentNode;m=i.parentNode;var u=n;if(g===i){h=true;return 0}else if(n===m)return I(g,i);else if(n){if(!m)return 1}else return-1;
+for(;u;){p.unshift(u);u=u.parentNode}for(u=m;u;){q.unshift(u);u=u.parentNode}n=p.length;m=q.length;for(u=0;u<n&&u<m;u++)if(p[u]!==q[u])return I(p[u],q[u]);return u===n?I(g,q[u],-1):I(p[u],i,1)};I=function(g,i,n){if(g===i)return n;for(g=g.nextSibling;g;){if(g===i)return-1;g=g.nextSibling}return 1}}k.getText=function(g){for(var i="",n,m=0;g[m];m++){n=g[m];if(n.nodeType===3||n.nodeType===4)i+=n.nodeValue;else if(n.nodeType!==8)i+=k.getText(n.childNodes)}return i};(function(){var g=t.createElement("div"),
+i="script"+(new Date).getTime(),n=t.documentElement;g.innerHTML="<a name='"+i+"'/>";n.insertBefore(g,n.firstChild);if(t.getElementById(i)){o.find.ID=function(m,p,q){if(typeof p.getElementById!=="undefined"&&!q)return(p=p.getElementById(m[1]))?p.id===m[1]||typeof p.getAttributeNode!=="undefined"&&p.getAttributeNode("id").nodeValue===m[1]?[p]:B:[]};o.filter.ID=function(m,p){var q=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&q&&q.nodeValue===p}}n.removeChild(g);
+n=g=null})();(function(){var g=t.createElement("div");g.appendChild(t.createComment(""));if(g.getElementsByTagName("*").length>0)o.find.TAG=function(i,n){var m=n.getElementsByTagName(i[1]);if(i[1]==="*"){for(var p=[],q=0;m[q];q++)m[q].nodeType===1&&p.push(m[q]);m=p}return m};g.innerHTML="<a href='#'></a>";if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")o.attrHandle.href=function(i){return i.getAttribute("href",2)};g=null})();t.querySelectorAll&&
+function(){var g=k,i=t.createElement("div");i.innerHTML="<p class='TEST'></p>";if(!(i.querySelectorAll&&i.querySelectorAll(".TEST").length===0)){k=function(m,p,q,u){p=p||t;m=m.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!u&&!k.isXML(p))if(p.nodeType===9)try{return C(p.querySelectorAll(m),q)}catch(y){}else if(p.nodeType===1&&p.nodeName.toLowerCase()!=="object"){var F=p.getAttribute("id"),M=F||"__sizzle__";F||p.setAttribute("id",M);try{return C(p.querySelectorAll("#"+M+" "+m),q)}catch(N){}finally{F||
+p.removeAttribute("id")}}return g(m,p,q,u)};for(var n in g)k[n]=g[n];i=null}}();(function(){var g=t.documentElement,i=g.matchesSelector||g.mozMatchesSelector||g.webkitMatchesSelector||g.msMatchesSelector,n=false;try{i.call(t.documentElement,"[test!='']:sizzle")}catch(m){n=true}if(i)k.matchesSelector=function(p,q){q=q.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(p))try{if(n||!o.match.PSEUDO.test(q)&&!/!=/.test(q))return i.call(p,q)}catch(u){}return k(q,null,null,[p]).length>0}})();(function(){var g=
+t.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){o.order.splice(1,0,"CLASS");o.find.CLASS=function(i,n,m){if(typeof n.getElementsByClassName!=="undefined"&&!m)return n.getElementsByClassName(i[1])};g=null}}})();k.contains=t.documentElement.contains?function(g,i){return g!==i&&(g.contains?g.contains(i):true)}:t.documentElement.compareDocumentPosition?
+function(g,i){return!!(g.compareDocumentPosition(i)&16)}:function(){return false};k.isXML=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false};var L=function(g,i){for(var n,m=[],p="",q=i.nodeType?[i]:i;n=o.match.PSEUDO.exec(g);){p+=n[0];g=g.replace(o.match.PSEUDO,"")}g=o.relative[g]?g+"*":g;n=0;for(var u=q.length;n<u;n++)k(g,q[n],m);return k.filter(p,m)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=k.getText;c.isXMLDoc=k.isXML;
+c.contains=k.contains})();var Za=/Until$/,$a=/^(?:parents|prevUntil|prevAll)/,ab=/,/,Na=/^.[^:#\[\.,]*$/,bb=Array.prototype.slice,cb=c.expr.match.POS;c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,e=0,f=this.length;e<f;e++){d=b.length;c.find(a,this[e],b);if(e>0)for(var h=d;h<b.length;h++)for(var l=0;l<d;l++)if(b[l]===b[h]){b.splice(h--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,e=b.length;d<e;d++)if(c.contains(this,b[d]))return true})},
+not:function(a){return this.pushStack(ma(this,a,false),"not",a)},filter:function(a){return this.pushStack(ma(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){var d=[],e,f,h=this[0];if(c.isArray(a)){var l,k={},o=1;if(h&&a.length){e=0;for(f=a.length;e<f;e++){l=a[e];k[l]||(k[l]=c.expr.match.POS.test(l)?c(l,b||this.context):l)}for(;h&&h.ownerDocument&&h!==b;){for(l in k){e=k[l];if(e.jquery?e.index(h)>-1:c(h).is(e))d.push({selector:l,elem:h,level:o})}h=
+h.parentNode;o++}}return d}l=cb.test(a)?c(a,b||this.context):null;e=0;for(f=this.length;e<f;e++)for(h=this[e];h;)if(l?l.index(h)>-1:c.find.matchesSelector(h,a)){d.push(h);break}else{h=h.parentNode;if(!h||!h.ownerDocument||h===b)break}d=d.length>1?c.unique(d):d;return this.pushStack(d,"closest",a)},index:function(a){if(!a||typeof a==="string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var d=typeof a==="string"?c(a,b||this.context):
+c.makeArray(a),e=c.merge(this.get(),d);return this.pushStack(!d[0]||!d[0].parentNode||d[0].parentNode.nodeType===11||!e[0]||!e[0].parentNode||e[0].parentNode.nodeType===11?e:c.unique(e))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,
+2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,
+b){c.fn[a]=function(d,e){var f=c.map(this,b,d);Za.test(a)||(e=d);if(e&&typeof e==="string")f=c.filter(e,f);f=this.length>1?c.unique(f):f;if((this.length>1||ab.test(e))&&$a.test(a))f=f.reverse();return this.pushStack(f,a,bb.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return b.length===1?c.find.matchesSelector(b[0],a)?[b[0]]:[]:c.find.matches(a,b)},dir:function(a,b,d){var e=[];for(a=a[b];a&&a.nodeType!==9&&(d===B||a.nodeType!==1||!c(a).is(d));){a.nodeType===1&&
+e.push(a);a=a[b]}return e},nth:function(a,b,d){b=b||1;for(var e=0;a;a=a[d])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var za=/ jQuery\d+="(?:\d+|null)"/g,$=/^\s+/,Aa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Ba=/<([\w:]+)/,db=/<tbody/i,eb=/<|&#?\w+;/,Ca=/<(?:script|object|embed|option|style)/i,Da=/checked\s*(?:[^=]|=\s*.checked.)/i,fb=/\=([^="'>\s]+\/)>/g,P={option:[1,
+"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};P.optgroup=P.option;P.tbody=P.tfoot=P.colgroup=P.caption=P.thead;P.th=P.td;if(!c.support.htmlSerialize)P._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=
+c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==B)return this.empty().append((this[0]&&this[0].ownerDocument||t).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
+wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},
+prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,
+this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,e;(e=this[d])!=null;d++)if(!a||c.filter(a,[e]).length){if(!b&&e.nodeType===1){c.cleanData(e.getElementsByTagName("*"));c.cleanData([e])}e.parentNode&&e.parentNode.removeChild(e)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);
+return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,e=this.ownerDocument;if(!d){d=e.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(za,"").replace(fb,'="$1">').replace($,"")],e)[0]}else return this.cloneNode(true)});if(a===true){na(this,b);na(this.find("*"),b.find("*"))}return b},html:function(a){if(a===B)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(za,""):null;
+else if(typeof a==="string"&&!Ca.test(a)&&(c.support.leadingWhitespace||!$.test(a))&&!P[(Ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Aa,"<$1></$2>");try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(e){this.empty().append(a)}}else c.isFunction(a)?this.each(function(f){var h=c(this);h.html(a.call(this,f,h.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=
+c(this),e=d.html();d.replaceWith(a.call(this,b,e))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){var e,f,h,l=a[0],k=[];if(!c.support.checkClone&&arguments.length===3&&typeof l==="string"&&Da.test(l))return this.each(function(){c(this).domManip(a,
+b,d,true)});if(c.isFunction(l))return this.each(function(x){var r=c(this);a[0]=l.call(this,x,b?r.html():B);r.domManip(a,b,d)});if(this[0]){e=l&&l.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:c.buildFragment(a,this,k);h=e.fragment;if(f=h.childNodes.length===1?h=h.firstChild:h.firstChild){b=b&&c.nodeName(f,"tr");f=0;for(var o=this.length;f<o;f++)d.call(b?c.nodeName(this[f],"table")?this[f].getElementsByTagName("tbody")[0]||this[f].appendChild(this[f].ownerDocument.createElement("tbody")):
+this[f]:this[f],f>0||e.cacheable||this.length>1?h.cloneNode(true):h)}k.length&&c.each(k,Oa)}return this}});c.buildFragment=function(a,b,d){var e,f,h;b=b&&b[0]?b[0].ownerDocument||b[0]:t;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===t&&!Ca.test(a[0])&&(c.support.checkClone||!Da.test(a[0]))){f=true;if(h=c.fragments[a[0]])if(h!==1)e=h}if(!e){e=b.createDocumentFragment();c.clean(a,b,e,d)}if(f)c.fragments[a[0]]=h?e:1;return{fragment:e,cacheable:f}};c.fragments={};c.each({appendTo:"append",
+prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var e=[];d=c(d);var f=this.length===1&&this[0].parentNode;if(f&&f.nodeType===11&&f.childNodes.length===1&&d.length===1){d[b](this[0]);return this}else{f=0;for(var h=d.length;f<h;f++){var l=(f>0?this.clone(true):this).get();c(d[f])[b](l);e=e.concat(l)}return this.pushStack(e,a,d.selector)}}});c.extend({clean:function(a,b,d,e){b=b||t;if(typeof b.createElement==="undefined")b=b.ownerDocument||
+b[0]&&b[0].ownerDocument||t;for(var f=[],h=0,l;(l=a[h])!=null;h++){if(typeof l==="number")l+="";if(l){if(typeof l==="string"&&!eb.test(l))l=b.createTextNode(l);else if(typeof l==="string"){l=l.replace(Aa,"<$1></$2>");var k=(Ba.exec(l)||["",""])[1].toLowerCase(),o=P[k]||P._default,x=o[0],r=b.createElement("div");for(r.innerHTML=o[1]+l+o[2];x--;)r=r.lastChild;if(!c.support.tbody){x=db.test(l);k=k==="table"&&!x?r.firstChild&&r.firstChild.childNodes:o[1]==="<table>"&&!x?r.childNodes:[];for(o=k.length-
+1;o>=0;--o)c.nodeName(k[o],"tbody")&&!k[o].childNodes.length&&k[o].parentNode.removeChild(k[o])}!c.support.leadingWhitespace&&$.test(l)&&r.insertBefore(b.createTextNode($.exec(l)[0]),r.firstChild);l=r.childNodes}if(l.nodeType)f.push(l);else f=c.merge(f,l)}}if(d)for(h=0;f[h];h++)if(e&&c.nodeName(f[h],"script")&&(!f[h].type||f[h].type.toLowerCase()==="text/javascript"))e.push(f[h].parentNode?f[h].parentNode.removeChild(f[h]):f[h]);else{f[h].nodeType===1&&f.splice.apply(f,[h+1,0].concat(c.makeArray(f[h].getElementsByTagName("script"))));
+d.appendChild(f[h])}return f},cleanData:function(a){for(var b,d,e=c.cache,f=c.event.special,h=c.support.deleteExpando,l=0,k;(k=a[l])!=null;l++)if(!(k.nodeName&&c.noData[k.nodeName.toLowerCase()]))if(d=k[c.expando]){if((b=e[d])&&b.events)for(var o in b.events)f[o]?c.event.remove(k,o):c.removeEvent(k,o,b.handle);if(h)delete k[c.expando];else k.removeAttribute&&k.removeAttribute(c.expando);delete e[d]}}});var Ea=/alpha\([^)]*\)/i,gb=/opacity=([^)]*)/,hb=/-([a-z])/ig,ib=/([A-Z])/g,Fa=/^-?\d+(?:px)?$/i,
+jb=/^-?\d/,kb={position:"absolute",visibility:"hidden",display:"block"},Pa=["Left","Right"],Qa=["Top","Bottom"],W,Ga,aa,lb=function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){if(arguments.length===2&&b===B)return this;return c.access(this,a,b,true,function(d,e,f){return f!==B?c.style(d,e,f):c.css(d,e)})};c.extend({cssHooks:{opacity:{get:function(a,b){if(b){var d=W(a,"opacity","opacity");return d===""?"1":d}else return a.style.opacity}}},cssNumber:{zIndex:true,fontWeight:true,opacity:true,
+zoom:true,lineHeight:true},cssProps:{"float":c.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,d,e){if(!(!a||a.nodeType===3||a.nodeType===8||!a.style)){var f,h=c.camelCase(b),l=a.style,k=c.cssHooks[h];b=c.cssProps[h]||h;if(d!==B){if(!(typeof d==="number"&&isNaN(d)||d==null)){if(typeof d==="number"&&!c.cssNumber[h])d+="px";if(!k||!("set"in k)||(d=k.set(a,d))!==B)try{l[b]=d}catch(o){}}}else{if(k&&"get"in k&&(f=k.get(a,false,e))!==B)return f;return l[b]}}},css:function(a,b,d){var e,f=c.camelCase(b),
+h=c.cssHooks[f];b=c.cssProps[f]||f;if(h&&"get"in h&&(e=h.get(a,true,d))!==B)return e;else if(W)return W(a,b,f)},swap:function(a,b,d){var e={},f;for(f in b){e[f]=a.style[f];a.style[f]=b[f]}d.call(a);for(f in b)a.style[f]=e[f]},camelCase:function(a){return a.replace(hb,lb)}});c.curCSS=c.css;c.each(["height","width"],function(a,b){c.cssHooks[b]={get:function(d,e,f){var h;if(e){if(d.offsetWidth!==0)h=oa(d,b,f);else c.swap(d,kb,function(){h=oa(d,b,f)});if(h<=0){h=W(d,b,b);if(h==="0px"&&aa)h=aa(d,b,b);
+if(h!=null)return h===""||h==="auto"?"0px":h}if(h<0||h==null){h=d.style[b];return h===""||h==="auto"?"0px":h}return typeof h==="string"?h:h+"px"}},set:function(d,e){if(Fa.test(e)){e=parseFloat(e);if(e>=0)return e+"px"}else return e}}});if(!c.support.opacity)c.cssHooks.opacity={get:function(a,b){return gb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var d=a.style;d.zoom=1;var e=c.isNaN(b)?"":"alpha(opacity="+b*100+")",f=
+d.filter||"";d.filter=Ea.test(f)?f.replace(Ea,e):d.filter+" "+e}};if(t.defaultView&&t.defaultView.getComputedStyle)Ga=function(a,b,d){var e;d=d.replace(ib,"-$1").toLowerCase();if(!(b=a.ownerDocument.defaultView))return B;if(b=b.getComputedStyle(a,null)){e=b.getPropertyValue(d);if(e===""&&!c.contains(a.ownerDocument.documentElement,a))e=c.style(a,d)}return e};if(t.documentElement.currentStyle)aa=function(a,b){var d,e,f=a.currentStyle&&a.currentStyle[b],h=a.style;if(!Fa.test(f)&&jb.test(f)){d=h.left;
+e=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;h.left=b==="fontSize"?"1em":f||0;f=h.pixelLeft+"px";h.left=d;a.runtimeStyle.left=e}return f===""?"auto":f};W=Ga||aa;if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=a.offsetHeight;return a.offsetWidth===0&&b===0||!c.support.reliableHiddenOffsets&&(a.style.display||c.css(a,"display"))==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var mb=c.now(),nb=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
+ob=/^(?:select|textarea)/i,pb=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,qb=/^(?:GET|HEAD)$/,Ra=/\[\]$/,T=/\=\?(&|$)/,ja=/\?/,rb=/([?&])_=[^&]*/,sb=/^(\w+:)?\/\/([^\/?#]+)/,tb=/%20/g,ub=/#.*$/,Ha=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!=="string"&&Ha)return Ha.apply(this,arguments);else if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var f=a.slice(e,a.length);a=a.slice(0,e)}e="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b===
+"object"){b=c.param(b,c.ajaxSettings.traditional);e="POST"}var h=this;c.ajax({url:a,type:e,dataType:"html",data:b,complete:function(l,k){if(k==="success"||k==="notmodified")h.html(f?c("<div>").append(l.responseText.replace(nb,"")).find(f):l.responseText);d&&h.each(d,[l.responseText,k,l])}});return this},serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&
+!this.disabled&&(this.checked||ob.test(this.nodeName)||pb.test(this.type))}).map(function(a,b){var d=c(this).val();return d==null?null:c.isArray(d)?c.map(d,function(e){return{name:b.name,value:e}}):{name:b.name,value:d}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:e})},
+getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:e})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return new E.XMLHttpRequest},accepts:{xml:"application/xml, text/xml",html:"text/html",
+script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},ajax:function(a){var b=c.extend(true,{},c.ajaxSettings,a),d,e,f,h=b.type.toUpperCase(),l=qb.test(h);b.url=b.url.replace(ub,"");b.context=a&&a.context!=null?a.context:b;if(b.data&&b.processData&&typeof b.data!=="string")b.data=c.param(b.data,b.traditional);if(b.dataType==="jsonp"){if(h==="GET")T.test(b.url)||(b.url+=(ja.test(b.url)?"&":"?")+(b.jsonp||"callback")+"=?");else if(!b.data||
+!T.test(b.data))b.data=(b.data?b.data+"&":"")+(b.jsonp||"callback")+"=?";b.dataType="json"}if(b.dataType==="json"&&(b.data&&T.test(b.data)||T.test(b.url))){d=b.jsonpCallback||"jsonp"+mb++;if(b.data)b.data=(b.data+"").replace(T,"="+d+"$1");b.url=b.url.replace(T,"="+d+"$1");b.dataType="script";var k=E[d];E[d]=function(m){if(c.isFunction(k))k(m);else{E[d]=B;try{delete E[d]}catch(p){}}f=m;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);r&&r.removeChild(A)}}if(b.dataType==="script"&&b.cache===null)b.cache=
+false;if(b.cache===false&&l){var o=c.now(),x=b.url.replace(rb,"$1_="+o);b.url=x+(x===b.url?(ja.test(b.url)?"&":"?")+"_="+o:"")}if(b.data&&l)b.url+=(ja.test(b.url)?"&":"?")+b.data;b.global&&c.active++===0&&c.event.trigger("ajaxStart");o=(o=sb.exec(b.url))&&(o[1]&&o[1].toLowerCase()!==location.protocol||o[2].toLowerCase()!==location.host);if(b.dataType==="script"&&h==="GET"&&o){var r=t.getElementsByTagName("head")[0]||t.documentElement,A=t.createElement("script");if(b.scriptCharset)A.charset=b.scriptCharset;
+A.src=b.url;if(!d){var C=false;A.onload=A.onreadystatechange=function(){if(!C&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){C=true;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);A.onload=A.onreadystatechange=null;r&&A.parentNode&&r.removeChild(A)}}}r.insertBefore(A,r.firstChild);return B}var J=false,w=b.xhr();if(w){b.username?w.open(h,b.url,b.async,b.username,b.password):w.open(h,b.url,b.async);try{if(b.data!=null&&!l||a&&a.contentType)w.setRequestHeader("Content-Type",
+b.contentType);if(b.ifModified){c.lastModified[b.url]&&w.setRequestHeader("If-Modified-Since",c.lastModified[b.url]);c.etag[b.url]&&w.setRequestHeader("If-None-Match",c.etag[b.url])}o||w.setRequestHeader("X-Requested-With","XMLHttpRequest");w.setRequestHeader("Accept",b.dataType&&b.accepts[b.dataType]?b.accepts[b.dataType]+", */*; q=0.01":b.accepts._default)}catch(I){}if(b.beforeSend&&b.beforeSend.call(b.context,w,b)===false){b.global&&c.active--===1&&c.event.trigger("ajaxStop");w.abort();return false}b.global&&
+c.triggerGlobal(b,"ajaxSend",[w,b]);var L=w.onreadystatechange=function(m){if(!w||w.readyState===0||m==="abort"){J||c.handleComplete(b,w,e,f);J=true;if(w)w.onreadystatechange=c.noop}else if(!J&&w&&(w.readyState===4||m==="timeout")){J=true;w.onreadystatechange=c.noop;e=m==="timeout"?"timeout":!c.httpSuccess(w)?"error":b.ifModified&&c.httpNotModified(w,b.url)?"notmodified":"success";var p;if(e==="success")try{f=c.httpData(w,b.dataType,b)}catch(q){e="parsererror";p=q}if(e==="success"||e==="notmodified")d||
+c.handleSuccess(b,w,e,f);else c.handleError(b,w,e,p);d||c.handleComplete(b,w,e,f);m==="timeout"&&w.abort();if(b.async)w=null}};try{var g=w.abort;w.abort=function(){w&&Function.prototype.call.call(g,w);L("abort")}}catch(i){}b.async&&b.timeout>0&&setTimeout(function(){w&&!J&&L("timeout")},b.timeout);try{w.send(l||b.data==null?null:b.data)}catch(n){c.handleError(b,w,null,n);c.handleComplete(b,w,e,f)}b.async||L();return w}},param:function(a,b){var d=[],e=function(h,l){l=c.isFunction(l)?l():l;d[d.length]=
+encodeURIComponent(h)+"="+encodeURIComponent(l)};if(b===B)b=c.ajaxSettings.traditional;if(c.isArray(a)||a.jquery)c.each(a,function(){e(this.name,this.value)});else for(var f in a)da(f,a[f],b,e);return d.join("&").replace(tb,"+")}});c.extend({active:0,lastModified:{},etag:{},handleError:function(a,b,d,e){a.error&&a.error.call(a.context,b,d,e);a.global&&c.triggerGlobal(a,"ajaxError",[b,a,e])},handleSuccess:function(a,b,d,e){a.success&&a.success.call(a.context,e,d,b);a.global&&c.triggerGlobal(a,"ajaxSuccess",
+[b,a])},handleComplete:function(a,b,d){a.complete&&a.complete.call(a.context,b,d);a.global&&c.triggerGlobal(a,"ajaxComplete",[b,a]);a.global&&c.active--===1&&c.event.trigger("ajaxStop")},triggerGlobal:function(a,b,d){(a.context&&a.context.url==null?c(a.context):c.event).trigger(b,d)},httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===1223}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),
+e=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(e)c.etag[b]=e;return a.status===304},httpData:function(a,b,d){var e=a.getResponseHeader("content-type")||"",f=b==="xml"||!b&&e.indexOf("xml")>=0;a=f?a.responseXML:a.responseText;f&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b==="json"||!b&&e.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&e.indexOf("javascript")>=0)c.globalEval(a);return a}});
+if(E.ActiveXObject)c.ajaxSettings.xhr=function(){if(E.location.protocol!=="file:")try{return new E.XMLHttpRequest}catch(a){}try{return new E.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}};c.support.ajax=!!c.ajaxSettings.xhr();var ea={},vb=/^(?:toggle|show|hide)$/,wb=/^([+\-]=)?([\d+.\-]+)(.*)$/,ba,pa=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b,d){if(a||a===0)return this.animate(S("show",
+3),a,b,d);else{d=0;for(var e=this.length;d<e;d++){a=this[d];b=a.style.display;if(!c.data(a,"olddisplay")&&b==="none")b=a.style.display="";b===""&&c.css(a,"display")==="none"&&c.data(a,"olddisplay",qa(a.nodeName))}for(d=0;d<e;d++){a=this[d];b=a.style.display;if(b===""||b==="none")a.style.display=c.data(a,"olddisplay")||""}return this}},hide:function(a,b,d){if(a||a===0)return this.animate(S("hide",3),a,b,d);else{a=0;for(b=this.length;a<b;a++){d=c.css(this[a],"display");d!=="none"&&c.data(this[a],"olddisplay",
+d)}for(a=0;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b,d){var e=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||e?this.each(function(){var f=e?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(S("toggle",3),a,b,d);return this},fadeTo:function(a,b,d,e){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d,e)},animate:function(a,b,d,e){var f=c.speed(b,
+d,e);if(c.isEmptyObject(a))return this.each(f.complete);return this[f.queue===false?"each":"queue"](function(){var h=c.extend({},f),l,k=this.nodeType===1,o=k&&c(this).is(":hidden"),x=this;for(l in a){var r=c.camelCase(l);if(l!==r){a[r]=a[l];delete a[l];l=r}if(a[l]==="hide"&&o||a[l]==="show"&&!o)return h.complete.call(this);if(k&&(l==="height"||l==="width")){h.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(c.css(this,"display")==="inline"&&c.css(this,"float")==="none")if(c.support.inlineBlockNeedsLayout)if(qa(this.nodeName)===
+"inline")this.style.display="inline-block";else{this.style.display="inline";this.style.zoom=1}else this.style.display="inline-block"}if(c.isArray(a[l])){(h.specialEasing=h.specialEasing||{})[l]=a[l][1];a[l]=a[l][0]}}if(h.overflow!=null)this.style.overflow="hidden";h.curAnim=c.extend({},a);c.each(a,function(A,C){var J=new c.fx(x,h,A);if(vb.test(C))J[C==="toggle"?o?"show":"hide":C](a);else{var w=wb.exec(C),I=J.cur()||0;if(w){var L=parseFloat(w[2]),g=w[3]||"px";if(g!=="px"){c.style(x,A,(L||1)+g);I=(L||
+1)/J.cur()*I;c.style(x,A,I+g)}if(w[1])L=(w[1]==="-="?-1:1)*L+I;J.custom(I,L,g)}else J.custom(I,C,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);this.each(function(){for(var e=d.length-1;e>=0;e--)if(d[e].elem===this){b&&d[e](true);d.splice(e,1)}});b||this.dequeue();return this}});c.each({slideDown:S("show",1),slideUp:S("hide",1),slideToggle:S("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){c.fn[a]=function(d,e,f){return this.animate(b,
+d,e,f)}});c.extend({speed:function(a,b,d){var e=a&&typeof a==="object"?c.extend({},a):{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};e.duration=c.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in c.fx.speeds?c.fx.speeds[e.duration]:c.fx.speeds._default;e.old=e.complete;e.complete=function(){e.queue!==false&&c(this).dequeue();c.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,d,e){return d+e*a},swing:function(a,b,d,e){return(-Math.cos(a*
+Math.PI)/2+0.5)*e+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||c.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a=parseFloat(c.css(this.elem,this.prop));return a&&a>-1E4?a:0},custom:function(a,b,d){function e(l){return f.step(l)}
+var f=this,h=c.fx;this.startTime=c.now();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;this.pos=this.state=0;e.elem=this.elem;if(e()&&c.timers.push(e)&&!ba)ba=setInterval(h.tick,h.interval)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;
+this.custom(this.cur(),0)},step:function(a){var b=c.now(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var e in this.options.curAnim)if(this.options.curAnim[e]!==true)d=false;if(d){if(this.options.overflow!=null&&!c.support.shrinkWrapBlocks){var f=this.elem,h=this.options;c.each(["","X","Y"],function(k,o){f.style["overflow"+o]=h.overflow[k]})}this.options.hide&&c(this.elem).hide();if(this.options.hide||
+this.options.show)for(var l in this.options.curAnim)c.style(this.elem,l,this.options.orig[l]);this.options.complete.call(this.elem)}return false}else{a=b-this.startTime;this.state=a/this.options.duration;b=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||b](this.state,a,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=
+c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||c.fx.stop()},interval:13,stop:function(){clearInterval(ba);ba=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===
+b.elem}).length};var xb=/^t(?:able|d|h)$/i,Ia=/^(?:body|html)$/i;c.fn.offset="getBoundingClientRect"in t.documentElement?function(a){var b=this[0],d;if(a)return this.each(function(l){c.offset.setOffset(this,a,l)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);try{d=b.getBoundingClientRect()}catch(e){}var f=b.ownerDocument,h=f.documentElement;if(!d||!c.contains(h,b))return d||{top:0,left:0};b=f.body;f=fa(f);return{top:d.top+(f.pageYOffset||c.support.boxModel&&
+h.scrollTop||b.scrollTop)-(h.clientTop||b.clientTop||0),left:d.left+(f.pageXOffset||c.support.boxModel&&h.scrollLeft||b.scrollLeft)-(h.clientLeft||b.clientLeft||0)}}:function(a){var b=this[0];if(a)return this.each(function(x){c.offset.setOffset(this,a,x)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d,e=b.offsetParent,f=b.ownerDocument,h=f.documentElement,l=f.body;d=(f=f.defaultView)?f.getComputedStyle(b,null):b.currentStyle;
+for(var k=b.offsetTop,o=b.offsetLeft;(b=b.parentNode)&&b!==l&&b!==h;){if(c.offset.supportsFixedPosition&&d.position==="fixed")break;d=f?f.getComputedStyle(b,null):b.currentStyle;k-=b.scrollTop;o-=b.scrollLeft;if(b===e){k+=b.offsetTop;o+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&xb.test(b.nodeName))){k+=parseFloat(d.borderTopWidth)||0;o+=parseFloat(d.borderLeftWidth)||0}e=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&d.overflow!=="visible"){k+=
+parseFloat(d.borderTopWidth)||0;o+=parseFloat(d.borderLeftWidth)||0}d=d}if(d.position==="relative"||d.position==="static"){k+=l.offsetTop;o+=l.offsetLeft}if(c.offset.supportsFixedPosition&&d.position==="fixed"){k+=Math.max(h.scrollTop,l.scrollTop);o+=Math.max(h.scrollLeft,l.scrollLeft)}return{top:k,left:o}};c.offset={initialize:function(){var a=t.body,b=t.createElement("div"),d,e,f,h=parseFloat(c.css(a,"marginTop"))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",
+height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";a.insertBefore(b,a.firstChild);d=b.firstChild;e=d.firstChild;f=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=e.offsetTop!==5;this.doesAddBorderForTableAndCells=
+f.offsetTop===5;e.style.position="fixed";e.style.top="20px";this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15;e.style.position=e.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==h;a.removeChild(b);c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.css(a,
+"marginTop"))||0;d+=parseFloat(c.css(a,"marginLeft"))||0}return{top:b,left:d}},setOffset:function(a,b,d){var e=c.css(a,"position");if(e==="static")a.style.position="relative";var f=c(a),h=f.offset(),l=c.css(a,"top"),k=c.css(a,"left"),o=e==="absolute"&&c.inArray("auto",[l,k])>-1;e={};var x={};if(o)x=f.position();l=o?x.top:parseInt(l,10)||0;k=o?x.left:parseInt(k,10)||0;if(c.isFunction(b))b=b.call(a,d,h);if(b.top!=null)e.top=b.top-h.top+l;if(b.left!=null)e.left=b.left-h.left+k;"using"in b?b.using.call(a,
+e):f.css(e)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),e=Ia.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.css(a,"marginTop"))||0;d.left-=parseFloat(c.css(a,"marginLeft"))||0;e.top+=parseFloat(c.css(b[0],"borderTopWidth"))||0;e.left+=parseFloat(c.css(b[0],"borderLeftWidth"))||0;return{top:d.top-e.top,left:d.left-e.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||t.body;a&&!Ia.test(a.nodeName)&&
+c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(e){var f=this[0],h;if(!f)return null;if(e!==B)return this.each(function(){if(h=fa(this))h.scrollTo(!a?e:c(h).scrollLeft(),a?e:c(h).scrollTop());else this[d]=e});else return(h=fa(f))?"pageXOffset"in h?h[a?"pageYOffset":"pageXOffset"]:c.support.boxModel&&h.document.documentElement[d]||h.document.body[d]:f[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();
+c.fn["inner"+b]=function(){return this[0]?parseFloat(c.css(this[0],d,"padding")):null};c.fn["outer"+b]=function(e){return this[0]?parseFloat(c.css(this[0],d,e?"margin":"border")):null};c.fn[d]=function(e){var f=this[0];if(!f)return e==null?null:this;if(c.isFunction(e))return this.each(function(l){var k=c(this);k[d](e.call(this,l,k[d]()))});if(c.isWindow(f))return f.document.compatMode==="CSS1Compat"&&f.document.documentElement["client"+b]||f.document.body["client"+b];else if(f.nodeType===9)return Math.max(f.documentElement["client"+
+b],f.body["scroll"+b],f.documentElement["scroll"+b],f.body["offset"+b],f.documentElement["offset"+b]);else if(e===B){f=c.css(f,d);var h=parseFloat(f);return c.isNaN(h)?f:h}else return this.css(d,typeof e==="string"?e:e+"px")}})})(window);
diff --git a/utils/jalviewjs/site-resources/javascript/jquery.blockUI.js b/utils/jalviewjs/site-resources/javascript/jquery.blockUI.js
new file mode 100644 (file)
index 0000000..502a2e8
--- /dev/null
@@ -0,0 +1,490 @@
+\feff/*!
+ * jQuery blockUI plugin
+ * Version 2.37 (29-JAN-2011)
+ * @requires jQuery v1.2.3 or later
+ *
+ * Examples at: http://malsup.com/jquery/block/
+ * Copyright (c) 2007-2010 M. Alsup
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * Thanks to Amir-Hossein Sobhi for some excellent contributions!
+ */
+
+;(function($) {
+
+if (/1\.(0|1|2)\.(0|1|2)/.test($.fn.jquery) || /^1.1/.test($.fn.jquery)) {
+       alert('blockUI requires jQuery v1.2.3 or later!  You are using v' + $.fn.jquery);
+       return;
+}
+
+$.fn._fadeIn = $.fn.fadeIn;
+
+var noOp = function() {};
+
+// this bit is to ensure we don't call setExpression when we shouldn't (with extra muscle to handle
+// retarded userAgent strings on Vista)
+var mode = document.documentMode || 0;
+var setExpr = $.browser.msie && (($.browser.version < 8 && !mode) || mode < 8);
+var ie6 = $.browser.msie && /MSIE 6.0/.test(navigator.userAgent) && !mode;
+
+// global $ methods for blocking/unblocking the entire page
+$.blockUI   = function(opts) { install(window, opts); };
+$.unblockUI = function(opts) { remove(window, opts); };
+
+// convenience method for quick growl-like notifications  (http://www.google.com/search?q=growl)
+$.growlUI = function(title, message, timeout, onClose) {
+       var $m = $('<div class="growlUI"></div>');
+       if (title) $m.append('<h1>'+title+'</h1>');
+       if (message) $m.append('<h2>'+message+'</h2>');
+       if (timeout == undefined) timeout = 3000;
+       $.blockUI({
+               message: $m, fadeIn: 700, fadeOut: 1000, centerY: false,
+               timeout: timeout, showOverlay: false,
+               onUnblock: onClose, 
+               css: $.blockUI.defaults.growlCSS
+       });
+};
+
+// plugin method for blocking element content
+$.fn.block = function(opts) {
+       return this.unblock({ fadeOut: 0 }).each(function() {
+               if ($.css(this,'position') == 'static')
+                       this.style.position = 'relative';
+               if ($.browser.msie)
+                       this.style.zoom = 1; // force 'hasLayout'
+               install(this, opts);
+       });
+};
+
+// plugin method for unblocking element content
+$.fn.unblock = function(opts) {
+       return this.each(function() {
+               remove(this, opts);
+       });
+};
+
+$.blockUI.version = 2.37; // 2nd generation blocking at no extra cost!
+
+// override these in your code to change the default behavior and style
+$.blockUI.defaults = {
+       // message displayed when blocking (use null for no message)
+       message:  '<h1>Please wait...</h1>',
+
+       title: null,      // title string; only used when theme == true
+       draggable: true,  // only used when theme == true (requires jquery-ui.js to be loaded)
+       
+       theme: false, // set to true to use with jQuery UI themes
+       
+       // styles for the message when blocking; if you wish to disable
+       // these and use an external stylesheet then do this in your code:
+       // $.blockUI.defaults.css = {};
+       css: {
+               padding:        0,
+               margin:         0,
+               width:          '30%',
+               top:            '40%',
+               left:           '35%',
+               textAlign:      'center',
+               color:          '#000',
+               border:         '3px solid #aaa',
+               backgroundColor:'#fff',
+               cursor:         'wait'
+       },
+       
+       // minimal style set used when themes are used
+       themedCSS: {
+               width:  '30%',
+               top:    '40%',
+               left:   '35%'
+       },
+
+       // styles for the overlay
+       overlayCSS:  {
+               backgroundColor: '#000',
+               opacity:                 0.6,
+               cursor:                  'wait'
+       },
+
+       // styles applied when using $.growlUI
+       growlCSS: {
+               width:          '350px',
+               top:            '10px',
+               left:           '',
+               right:          '10px',
+               border:         'none',
+               padding:        '5px',
+               opacity:        0.6,
+               cursor:         'default',
+               color:          '#fff',
+               backgroundColor: '#000',
+               '-webkit-border-radius': '10px',
+               '-moz-border-radius':    '10px',
+               'border-radius':                 '10px'
+       },
+       
+       // IE issues: 'about:blank' fails on HTTPS and javascript:false is s-l-o-w
+       // (hat tip to Jorge H. N. de Vasconcelos)
+       iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank',
+
+       // force usage of iframe in non-IE browsers (handy for blocking applets)
+       forceIframe: false,
+
+       // z-index for the blocking overlay
+       baseZ: 1000,
+
+       // set these to true to have the message automatically centered
+       centerX: true, // <-- only effects element blocking (page block controlled via css above)
+       centerY: true,
+
+       // allow body element to be stetched in ie6; this makes blocking look better
+       // on "short" pages.  disable if you wish to prevent changes to the body height
+       allowBodyStretch: true,
+
+       // enable if you want key and mouse events to be disabled for content that is blocked
+       bindEvents: true,
+
+       // be default blockUI will supress tab navigation from leaving blocking content
+       // (if bindEvents is true)
+       constrainTabKey: true,
+
+       // fadeIn time in millis; set to 0 to disable fadeIn on block
+       fadeIn:  200,
+
+       // fadeOut time in millis; set to 0 to disable fadeOut on unblock
+       fadeOut:  400,
+
+       // time in millis to wait before auto-unblocking; set to 0 to disable auto-unblock
+       timeout: 0,
+
+       // disable if you don't want to show the overlay
+       showOverlay: true,
+
+       // if true, focus will be placed in the first available input field when
+       // page blocking
+       focusInput: true,
+
+       // suppresses the use of overlay styles on FF/Linux (due to performance issues with opacity)
+       applyPlatformOpacityRules: true,
+       
+       // callback method invoked when fadeIn has completed and blocking message is visible
+       onBlock: null,
+
+       // callback method invoked when unblocking has completed; the callback is
+       // passed the element that has been unblocked (which is the window object for page
+       // blocks) and the options that were passed to the unblock call:
+       //       onUnblock(element, options)
+       onUnblock: null,
+
+       // don't ask; if you really must know: http://groups.google.com/group/jquery-en/browse_thread/thread/36640a8730503595/2f6a79a77a78e493#2f6a79a77a78e493
+       quirksmodeOffsetHack: 4,
+
+       // class name of the message block
+       blockMsgClass: 'blockMsg'
+};
+
+// private data and functions follow...
+
+var pageBlock = null;
+var pageBlockEls = [];
+
+function install(el, opts) {
+       var full = (el == window);
+       var msg = opts && opts.message !== undefined ? opts.message : undefined;
+       opts = $.extend({}, $.blockUI.defaults, opts || {});
+       opts.overlayCSS = $.extend({}, $.blockUI.defaults.overlayCSS, opts.overlayCSS || {});
+       var css = $.extend({}, $.blockUI.defaults.css, opts.css || {});
+       var themedCSS = $.extend({}, $.blockUI.defaults.themedCSS, opts.themedCSS || {});
+       msg = msg === undefined ? opts.message : msg;
+
+       // remove the current block (if there is one)
+       if (full && pageBlock)
+               remove(window, {fadeOut:0});
+
+       // if an existing element is being used as the blocking content then we capture
+       // its current place in the DOM (and current display style) so we can restore
+       // it when we unblock
+       if (msg && typeof msg != 'string' && (msg.parentNode || msg.jquery)) {
+               var node = msg.jquery ? msg[0] : msg;
+               var data = {};
+               $(el).data('blockUI.history', data);
+               data.el = node;
+               data.parent = node.parentNode;
+               data.display = node.style.display;
+               data.position = node.style.position;
+               if (data.parent)
+                       data.parent.removeChild(node);
+       }
+
+       var z = opts.baseZ;
+
+       // blockUI uses 3 layers for blocking, for simplicity they are all used on every platform;
+       // layer1 is the iframe layer which is used to supress bleed through of underlying content
+       // layer2 is the overlay layer which has opacity and a wait cursor (by default)
+       // layer3 is the message content that is displayed while blocking
+
+       var lyr1 = ($.browser.msie || opts.forceIframe) 
+               ? $('<iframe class="blockUI" style="z-index:'+ (z++) +';display:none;border:none;margin:0;padding:0;position:absolute;width:100%;height:100%;top:0;left:0" src="'+opts.iframeSrc+'"></iframe>')
+               : $('<div class="blockUI" style="display:none"></div>');
+       var lyr2 = $('<div class="blockUI blockOverlay" style="z-index:'+ (z++) +';display:none;border:none;margin:0;padding:0;width:100%;height:100%;top:0;left:0"></div>');
+       
+       var lyr3, s;
+       if (opts.theme && full) {
+               s = '<div class="blockUI ' + opts.blockMsgClass + ' blockPage ui-dialog ui-widget ui-corner-all" style="z-index:'+z+';display:none;position:fixed">' +
+                               '<div class="ui-widget-header ui-dialog-titlebar ui-corner-all blockTitle">'+(opts.title || '&nbsp;')+'</div>' +
+                               '<div class="ui-widget-content ui-dialog-content"></div>' +
+                       '</div>';
+       }
+       else if (opts.theme) {
+               s = '<div class="blockUI ' + opts.blockMsgClass + ' blockElement ui-dialog ui-widget ui-corner-all" style="z-index:'+z+';display:none;position:absolute">' +
+                               '<div class="ui-widget-header ui-dialog-titlebar ui-corner-all blockTitle">'+(opts.title || '&nbsp;')+'</div>' +
+                               '<div class="ui-widget-content ui-dialog-content"></div>' +
+                       '</div>';
+       }
+       else if (full) {
+               s = '<div class="blockUI ' + opts.blockMsgClass + ' blockPage" style="z-index:'+z+';display:none;position:fixed"></div>';
+       }                       
+       else {
+               s = '<div class="blockUI ' + opts.blockMsgClass + ' blockElement" style="z-index:'+z+';display:none;position:absolute"></div>';
+       }
+       lyr3 = $(s);
+
+       // if we have a message, style it
+       if (msg) {
+               if (opts.theme) {
+                       lyr3.css(themedCSS);
+                       lyr3.addClass('ui-widget-content');
+               }
+               else 
+                       lyr3.css(css);
+       }
+
+       // style the overlay
+       if (!opts.applyPlatformOpacityRules || !($.browser.mozilla && /Linux/.test(navigator.platform)))
+               lyr2.css(opts.overlayCSS);
+       lyr2.css('position', full ? 'fixed' : 'absolute');
+
+       // make iframe layer transparent in IE
+       if ($.browser.msie || opts.forceIframe)
+               lyr1.css('opacity',0.0);
+
+       //$([lyr1[0],lyr2[0],lyr3[0]]).appendTo(full ? 'body' : el);
+       var layers = [lyr1,lyr2,lyr3], $par = full ? $('body') : $(el);
+       $.each(layers, function() {
+               this.appendTo($par);
+       });
+       
+       if (opts.theme && opts.draggable && $.fn.draggable) {
+               lyr3.draggable({
+                       handle: '.ui-dialog-titlebar',
+                       cancel: 'li'
+               });
+       }
+
+       // ie7 must use absolute positioning in quirks mode and to account for activex issues (when scrolling)
+       var expr = setExpr && (!$.boxModel || $('object,embed', full ? null : el).length > 0);
+       if (ie6 || expr) {
+               // give body 100% height
+               if (full && opts.allowBodyStretch && $.boxModel)
+                       $('html,body').css('height','100%');
+
+               // fix ie6 issue when blocked element has a border width
+               if ((ie6 || !$.boxModel) && !full) {
+                       var t = sz(el,'borderTopWidth'), l = sz(el,'borderLeftWidth');
+                       var fixT = t ? '(0 - '+t+')' : 0;
+                       var fixL = l ? '(0 - '+l+')' : 0;
+               }
+
+               // simulate fixed position
+               $.each([lyr1,lyr2,lyr3], function(i,o) {
+                       var s = o[0].style;
+                       s.position = 'absolute';
+                       if (i < 2) {
+                               full ? s.setExpression('height','Math.max(document.body.scrollHeight, document.body.offsetHeight) - (jQuery.boxModel?0:'+opts.quirksmodeOffsetHack+') + "px"')
+                                        : s.setExpression('height','this.parentNode.offsetHeight + "px"');
+                               full ? s.setExpression('width','jQuery.boxModel && document.documentElement.clientWidth || document.body.clientWidth + "px"')
+                                        : s.setExpression('width','this.parentNode.offsetWidth + "px"');
+                               if (fixL) s.setExpression('left', fixL);
+                               if (fixT) s.setExpression('top', fixT);
+                       }
+                       else if (opts.centerY) {
+                               if (full) s.setExpression('top','(document.documentElement.clientHeight || document.body.clientHeight) / 2 - (this.offsetHeight / 2) + (blah = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + "px"');
+                               s.marginTop = 0;
+                       }
+                       else if (!opts.centerY && full) {
+                               var top = (opts.css && opts.css.top) ? parseInt(opts.css.top) : 0;
+                               var expression = '((document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + '+top+') + "px"';
+                               s.setExpression('top',expression);
+                       }
+               });
+       }
+
+       // show the message
+       if (msg) {
+               if (opts.theme)
+                       lyr3.find('.ui-widget-content').append(msg);
+               else
+                       lyr3.append(msg);
+               if (msg.jquery || msg.nodeType)
+                       $(msg).show();
+       }
+
+       if (($.browser.msie || opts.forceIframe) && opts.showOverlay)
+               lyr1.show(); // opacity is zero
+       if (opts.fadeIn) {
+               var cb = opts.onBlock ? opts.onBlock : noOp;
+               var cb1 = (opts.showOverlay && !msg) ? cb : noOp;
+               var cb2 = msg ? cb : noOp;
+               if (opts.showOverlay)
+                       lyr2._fadeIn(opts.fadeIn, cb1);
+               if (msg)
+                       lyr3._fadeIn(opts.fadeIn, cb2);
+       }
+       else {
+               if (opts.showOverlay)
+                       lyr2.show();
+               if (msg)
+                       lyr3.show();
+               if (opts.onBlock)
+                       opts.onBlock();
+       }
+
+       // bind key and mouse events
+       bind(1, el, opts);
+
+       if (full) {
+               pageBlock = lyr3[0];
+               pageBlockEls = $(':input:enabled:visible',pageBlock);
+               if (opts.focusInput)
+                       setTimeout(focus, 20);
+       }
+       else
+               center(lyr3[0], opts.centerX, opts.centerY);
+
+       if (opts.timeout) {
+               // auto-unblock
+               var to = setTimeout(function() {
+                       full ? $.unblockUI(opts) : $(el).unblock(opts);
+               }, opts.timeout);
+               $(el).data('blockUI.timeout', to);
+       }
+};
+
+// remove the block
+function remove(el, opts) {
+       var full = (el == window);
+       var $el = $(el);
+       var data = $el.data('blockUI.history');
+       var to = $el.data('blockUI.timeout');
+       if (to) {
+               clearTimeout(to);
+               $el.removeData('blockUI.timeout');
+       }
+       opts = $.extend({}, $.blockUI.defaults, opts || {});
+       bind(0, el, opts); // unbind events
+       
+       var els;
+       if (full) // crazy selector to handle odd field errors in ie6/7
+               els = $('body').children().filter('.blockUI').add('body > .blockUI');
+       else
+               els = $('.blockUI', el);
+
+       if (full)
+               pageBlock = pageBlockEls = null;
+
+       if (opts.fadeOut) {
+               els.fadeOut(opts.fadeOut);
+               setTimeout(function() { reset(els,data,opts,el); }, opts.fadeOut);
+       }
+       else
+               reset(els, data, opts, el);
+};
+
+// move blocking element back into the DOM where it started
+function reset(els,data,opts,el) {
+       els.each(function(i,o) {
+               // remove via DOM calls so we don't lose event handlers
+               if (this.parentNode)
+                       this.parentNode.removeChild(this);
+       });
+
+       if (data && data.el) {
+               data.el.style.display = data.display;
+               data.el.style.position = data.position;
+               if (data.parent)
+                       data.parent.appendChild(data.el);
+               $(el).removeData('blockUI.history');
+       }
+
+       if (typeof opts.onUnblock == 'function')
+               opts.onUnblock(el,opts);
+};
+
+// bind/unbind the handler
+function bind(b, el, opts) {
+       var full = el == window, $el = $(el);
+
+       // don't bother unbinding if there is nothing to unbind
+       if (!b && (full && !pageBlock || !full && !$el.data('blockUI.isBlocked')))
+               return;
+       if (!full)
+               $el.data('blockUI.isBlocked', b);
+
+       // don't bind events when overlay is not in use or if bindEvents is false
+       if (!opts.bindEvents || (b && !opts.showOverlay)) 
+               return;
+
+       // bind anchors and inputs for mouse and key events
+       var events = 'mousedown mouseup keydown keypress';
+       b ? $(document).bind(events, opts, handler) : $(document).unbind(events, handler);
+
+// former impl...
+//        var $e = $('a,:input');
+//        b ? $e.bind(events, opts, handler) : $e.unbind(events, handler);
+};
+
+// event handler to suppress keyboard/mouse events when blocking
+function handler(e) {
+       // allow tab navigation (conditionally)
+       if (e.keyCode && e.keyCode == 9) {
+               if (pageBlock && e.data.constrainTabKey) {
+                       var els = pageBlockEls;
+                       var fwd = !e.shiftKey && e.target === els[els.length-1];
+                       var back = e.shiftKey && e.target === els[0];
+                       if (fwd || back) {
+                               setTimeout(function(){focus(back)},10);
+                               return false;
+                       }
+               }
+       }
+       var opts = e.data;
+       // allow events within the message content
+       if ($(e.target).parents('div.' + opts.blockMsgClass).length > 0)
+               return true;
+
+       // allow events for content that is not being blocked
+       return $(e.target).parents().children().filter('div.blockUI').length == 0;
+};
+
+function focus(back) {
+       if (!pageBlockEls)
+               return;
+       var e = pageBlockEls[back===true ? pageBlockEls.length-1 : 0];
+       if (e)
+               e.focus();
+};
+
+function center(el, x, y) {
+       var p = el.parentNode, s = el.style;
+       var l = ((p.offsetWidth - el.offsetWidth)/2) - sz(p,'borderLeftWidth');
+       var t = ((p.offsetHeight - el.offsetHeight)/2) - sz(p,'borderTopWidth');
+       if (x) s.left = l > 0 ? (l+'px') : '0';
+       if (y) s.top  = t > 0 ? (t+'px') : '0';
+};
+
+function sz(el, p) {
+       return parseInt($.css(el,p))||0;
+};
+
+})(jQuery);
diff --git a/utils/jalviewjs/site-resources/javascript/jquery.timer.js b/utils/jalviewjs/site-resources/javascript/jquery.timer.js
new file mode 100644 (file)
index 0000000..fe9afe2
--- /dev/null
@@ -0,0 +1,75 @@
+\feff/*
+ *
+ *     jQuery Timer plugin v0.1
+ *             Matt Schmidt [http://www.mattptr.net]
+ *
+ *     Licensed under the BSD License:
+ *             http://mattptr.net/license/license.txt
+ *
+ */
+ jQuery.timer = function (interval, callback)
+ {
+ /**
+  *
+  * timer() provides a cleaner way to handle intervals  
+  *
+  *    @usage
+  * $.timer(interval, callback);
+  *
+  *
+  * @example
+  * $.timer(1000, function (timer) {
+  *    alert("hello");
+  *    timer.stop();
+  * });
+  * @desc Show an alert box after 1 second and stop
+  * 
+  * @example
+  * var second = false;
+  *    $.timer(1000, function (timer) {
+  *            if (!second) {
+  *                    alert('First time!');
+  *                    second = true;
+  *                    timer.reset(3000);
+  *            }
+  *            else {
+  *                    alert('Second time');
+  *                    timer.stop();
+  *            }
+  *    });
+  * @desc Show an alert box after 1 second and show another after 3 seconds
+  *
+  * 
+  */
+
+       var interval = interval || 100;
+
+       if (!callback)
+               return false;
+       
+       _timer = function (interval, callback) {
+               this.stop = function () {
+                       clearInterval(self.id);
+               };
+               
+               this.internalCallback = function () {
+                       callback(self);
+               };
+               
+               this.reset = function (val) {
+                       if (self.id)
+                               clearInterval(self.id);
+                       
+                       var val = val || 100;
+                       this.id = setInterval(this.internalCallback, val);
+               };
+               
+               this.interval = interval;
+               this.id = setInterval(this.internalCallback, this.interval);
+               
+               var self = this;
+       };
+       
+       return new _timer(interval, callback);
+ };
\ No newline at end of file
diff --git a/utils/jalviewjs/site-resources/javascript/jshashtable-2.1.js b/utils/jalviewjs/site-resources/javascript/jshashtable-2.1.js
new file mode 100644 (file)
index 0000000..e19c0be
--- /dev/null
@@ -0,0 +1,16 @@
+/**
+ * Copyright 2010 Tim Down.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+var Hashtable=(function(){var p="function";var n=(typeof Array.prototype.splice==p)?function(s,r){s.splice(r,1)}:function(u,t){var s,v,r;if(t===u.length-1){u.length=t}else{s=u.slice(t+1);u.length=t;for(v=0,r=s.length;v<r;++v){u[t+v]=s[v]}}};function a(t){var r;if(typeof t=="string"){return t}else{if(typeof t.hashCode==p){r=t.hashCode();return(typeof r=="string")?r:a(r)}else{if(typeof t.toString==p){return t.toString()}else{try{return String(t)}catch(s){return Object.prototype.toString.call(t)}}}}}function g(r,s){return r.equals(s)}function e(r,s){return(typeof s.equals==p)?s.equals(r):(r===s)}function c(r){return function(s){if(s===null){throw new Error("null is not a valid "+r)}else{if(typeof s=="undefined"){throw new Error(r+" must not be undefined")}}}}var q=c("key"),l=c("value");function d(u,s,t,r){this[0]=u;this.entries=[];this.addEntry(s,t);if(r!==null){this.getEqualityFunction=function(){return r}}}var h=0,j=1,f=2;function o(r){return function(t){var s=this.entries.length,v,u=this.getEqualityFunction(t);while(s--){v=this.entries[s];if(u(t,v[0])){switch(r){case h:return true;case j:return v;case f:return[s,v[1]]}}}return false}}function k(r){return function(u){var v=u.length;for(var t=0,s=this.entries.length;t<s;++t){u[v+t]=this.entries[t][r]}}}d.prototype={getEqualityFunction:function(r){return(typeof r.equals==p)?g:e},getEntryForKey:o(j),getEntryAndIndexForKey:o(f),removeEntryForKey:function(s){var r=this.getEntryAndIndexForKey(s);if(r){n(this.entries,r[0]);return r[1]}return null},addEntry:function(r,s){this.entries[this.entries.length]=[r,s]},keys:k(0),values:k(1),getEntries:function(s){var u=s.length;for(var t=0,r=this.entries.length;t<r;++t){s[u+t]=this.entries[t].slice(0)}},containsKey:o(h),containsValue:function(s){var r=this.entries.length;while(r--){if(s===this.entries[r][1]){return true}}return false}};function m(s,t){var r=s.length,u;while(r--){u=s[r];if(t===u[0]){return r}}return null}function i(r,s){var t=r[s];return(t&&(t instanceof d))?t:null}function b(t,r){var w=this;var v=[];var u={};var x=(typeof t==p)?t:a;var s=(typeof r==p)?r:null;this.put=function(B,C){q(B);l(C);var D=x(B),E,A,z=null;E=i(u,D);if(E){A=E.getEntryForKey(B);if(A){z=A[1];A[1]=C}else{E.addEntry(B,C)}}else{E=new d(D,B,C,s);v[v.length]=E;u[D]=E}return z};this.get=function(A){q(A);var B=x(A);var C=i(u,B);if(C){var z=C.getEntryForKey(A);if(z){return z[1]}}return null};this.containsKey=function(A){q(A);var z=x(A);var B=i(u,z);return B?B.containsKey(A):false};this.containsValue=function(A){l(A);var z=v.length;while(z--){if(v[z].containsValue(A)){return true}}return false};this.clear=function(){v.length=0;u={}};this.isEmpty=function(){return !v.length};var y=function(z){return function(){var A=[],B=v.length;while(B--){v[B][z](A)}return A}};this.keys=y("keys");this.values=y("values");this.entries=y("getEntries");this.remove=function(B){q(B);var C=x(B),z,A=null;var D=i(u,C);if(D){A=D.removeEntryForKey(B);if(A!==null){if(!D.entries.length){z=m(v,C);n(v,z);delete u[C]}}}return A};this.size=function(){var A=0,z=v.length;while(z--){A+=v[z].entries.length}return A};this.each=function(C){var z=w.entries(),A=z.length,B;while(A--){B=z[A];C(B[0],B[1])}};this.putAll=function(H,C){var B=H.entries();var E,F,D,z,A=B.length;var G=(typeof C==p);while(A--){E=B[A];F=E[0];D=E[1];if(G&&(z=w.get(F))){D=C(F,z,D)}w.put(F,D)}};this.clone=function(){var z=new b(t,r);z.putAll(w);return z}}return b})();
\ No newline at end of file
diff --git a/utils/jalviewjs/site-resources/javascript/jvcontroller.js b/utils/jalviewjs/site-resources/javascript/jvcontroller.js
new file mode 100644 (file)
index 0000000..8116e60
--- /dev/null
@@ -0,0 +1,220 @@
+/**
+ * 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.
+ */
+
+
+$(document).ready(function() {
+       processAllAppletElements();
+});
+
+
+    
+    var currentPage = "applets";
+
+    function processAllAppletElements() {
+       var apps = document.getElementsByTagName("applet");
+       for (var i = apps.length; --i >= 0;) {
+               processAppletElement(apps[i]);
+       }
+    }
+       
+    var jvid = 0;
+
+    function testBtn(e) {
+       var element = e.target.appletElement;
+       var text = element.outerHTML;
+       
+       //var
+       var Info = self.JalviewInfo || {
+  code: null,
+  main: "jalview.bin.Jalview",
+  core: "NONE",
+       
+       
+       width: 850,
+       height: 550,
+  readyFunction: null,
+       serverURL: 'https://chemapps.stolaf.edu/jmol/jsmol/php/jsmol.php',
+       j2sPath: 'swingjs/j2s',
+//     console:'sysoutdiv',
+       allowjavascript: true
+}
+       
+var id = "JVApplet" + jvid++;
+var args = text.replace(/[\n\t]/g, " ").split("<param ");
+Info.j2sAppletID = id;
+Info.jalview_SCREEN_WIDTH= 100, // desktop width -- 0 to hide
+Info.jalview_SCREEN_HEIGHT= 70,  // desktop height -- 0 to hide
+Info.jalview_SCREEN_X= 10,
+Info.jalview_SCREEN_Y= 10,
+Info.jalview_EMBEDDED= true;
+
+
+for (var i in Info) {
+       var v = ("" + Info[i] || "null").replace(/\"/g,"'");
+       args.push("name=\"Info." + i + "\" value=\"" + v + "\""); 
+}
+Info.args = args;
+SwingJS.getApplet(id, Info);
+       document.title = id;
+       e.target.style.visibility="hidden";
+
+    }
+    
+    function processAppletElement(element) {
+        var code = element.getAttribute("code");
+        var parent = element.parentElement;
+        if (code == "jalview.bin.JalviewLite") {
+               var text = element.outerHTML;
+               console.log(text);
+               var btn = document.createElement("button");
+               btn.innerHTML = "Start Jalview";
+               var a = element.getAttribute("width");
+               btn.style.width = (a || 140) + "px";
+               a = element.getAttribute("height");
+               btn.style.height = (a || 25) + "px";
+               btn.appletElement = element;
+               parent.replaceChild(btn, element);        
+               $(btn).click(testBtn)
+        } else {
+               parent.removeElement(element);
+        }
+    }
+       
+
+    /** 
+     * Generate an applet tag
+     * 
+     * @param code
+     * @param name
+     * @param archive
+     * @param width
+     * @param height
+     * @param params
+     * @returns  a DOM APPLET element
+     */
+    function createAppletTag(code, name, archive, width, height, params){
+        var app = document.createElement('applet');
+       app.code= code;
+       app.width = width;
+       app.height = height;
+       app.archive = archive;
+
+       var arrayLength = params.length;
+       for (var i = 0; i < arrayLength; i++) {
+           //console.log('name : '+ params[i][0] + ' code : '+ params[i][1]);              
+           var param = document.createElement('param');
+           param.name = params[i][0];
+           param.value = params[i][1];
+           app.appendChild(param);
+       }
+       return app;
+    }
+
+    function readCookie(name) {
+        var nameEQ = name + "=";
+        var ca = document.cookie.split(';');
+        for(var i=0;i < ca.length;i++) {
+            var c = ca[i];
+            while (c.charAt(0)==' ') c = c.substring(1,c.length);
+            if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
+        }
+        return null;
+    }
+
+    function setOrUpdateCookie(name, value, days) {
+        var expires;
+        if (days) {
+            var date = new Date();
+            date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
+            expires = "; expires=" + date.toGMTString();
+        }
+        else {
+            expires = "";
+        }
+        document.cookie = name + "=" + value + expires + "; path=/";
+    }
+
+   $(function(){        
+        var url = window.location.href;
+       var end = url.length;
+       var start = url.lastIndexOf("#");
+       var newPage = url.substring(start + 1, end);
+       var page = ((start === -1) ? currentPage : newPage);
+       //alert("page:" + page); 
+       if(page === "embeddedWJmol"){
+         // do nothing embeddedWJmol page already include
+
+            $('#header').load("includes/header_jv.html");
+            //$('#content').load(page + ".html");
+            $('#nav').load("includes/nav_jv.html");
+            $('#footer').load("includes/footer_jv.html"); 
+            $('#'+ currentPage).addClass('active-trail active'); 
+        }else{
+            $('#header').load("includes/header_jv.html");
+            $('#content').load(page + ".html");
+            $('#nav').load("includes/nav_jv.html");
+            $('#footer').load("includes/footer_jv.html"); 
+            $('#'+ currentPage).addClass('active-trail active');  
+
+           var e = document.getElementById("view_decorated");
+            e.style.display = 'none';
+       }     
+   });
+   
+function doSubmit(target){
+   var currentPage = target+'.html';
+   //alert("page:" + target); 
+   if(target == "embeddedWJmol"){
+      //loadJMolPage();
+      window.location.href = 'embeddedWJmol.html#' + target;
+      $('#content').load(currentPage);
+   }else{
+      window.location.href = 'index.html#' + target;
+      $('#content').load(currentPage);
+   }
+   updateLinks(target);
+}
+
+
+
+function updateLinks(target) {
+    var ul = document.getElementById("menu");
+    var items = ul.getElementsByTagName("li");
+    for (var i = 0; i < items.length; ++i) {
+       removeClass(items[i], "active-trail active");
+    }
+   $('#'+ target).addClass('active-trail active');
+}
+
+function hasClass(ele,cls) {
+  return !!ele.className.match(new RegExp('(\\s|^)'+cls+'(\\s|$)'));
+}
+
+function addClass(ele,cls) {
+  if (!hasClass(ele,cls)) ele.className += " "+cls;
+}
+
+function removeClass(ele,cls) {
+  if (hasClass(ele,cls)) {
+    var reg = new RegExp('(\\s|^)'+cls+'(\\s|$)');
+    ele.className=ele.className.replace(reg,' ');
+  }
+}
+
diff --git a/utils/jalviewjs/site-resources/swingjs/JalviewApplet.js b/utils/jalviewjs/site-resources/swingjs/JalviewApplet.js
new file mode 100644 (file)
index 0000000..53f39c6
--- /dev/null
@@ -0,0 +1,191 @@
+// Jalview Priliminary applet-generation code.
+// author: Bob Hanson hansonr@stolaf.edu
+
+Jalview = { 
+       jvid : 0 
+}
+
+$(document).ready(function() {
+       if (document.location.href.toLowerCase().indexOf("_use=java") < 0)
+               Jalview.processAllAppletElements(self.JalviewInfo);
+});
+
+Jalview.processAllAppletElements = function(PageInfo) {
+       var applets = document.getElementsByTagName("applet");
+       var apps=[];
+       for (var i = 0; i < applets.length; i++)
+               apps[i] = applets[i];
+       for (var i = 0; i < apps.length; i++) {
+               Jalview.processAppletElement(apps[i], PageInfo);
+       }
+}
+Jalview.processAppletElement = function(element, UserInfo) {
+       
+       var code = element.getAttribute("code");
+       var parent = element.parentElement;
+       if (code != "jalview.bin.JalviewLite") {
+               return;
+       }
+
+       var Info = {
+               code: null,
+               main: "jalview.bin.Jalview",
+               core: "NONE",
+               resourcePath: "examples",
+               readyFunction: null,
+               serverURL: 'https://chemapps.stolaf.edu/jmol/jsmol/php/jsmol.php',
+               j2sPath: 'swingjs/j2s',
+               console:'sysout',
+               startButton:'Start Jalview',
+               hideDesktop:true,
+               embedInternalFrames:false,
+               idPrefix:'%ID%',
+               allowJavascript: true,
+       }
+
+       var text = element.outerHTML;
+       var args = Info.args = text.replace(/[\n\t]/g, " ").split("<param ");
+
+       // overwrite default parameters with UserInfo (global JalviewInfo):
+       if (UserInfo) {
+               for (var i in UserInfo) {
+                       Info[i] = UserInfo[i];
+               }
+       }
+       // generate name/value pairs for parameters in Applet tag
+
+       Info.j2sAppletID = Info.j2sAppletID 
+               || element.getAttribute("name") 
+               || element.getAttribute("id") 
+               || Info.idPrefix.replace(/%ID%/g, "jalview" + ++Jalview.jvid);
+       
+       //Info.jalview_SCREEN_X= 10,Info.jalview_SCREEN_Y= 10;
+       //Info.jalview_EMBEDDED= true;
+       //Info.jalview_SCREEN_WIDTH = 400;
+       //Info.jalview_SCREEN_HEIGHT = 100;
+
+       
+       var addParam = function(key,value) {
+               args.push("name=\"" + key + "\" value=\"" + value + "\""); 
+       }
+
+
+       for (var i in Info) {
+               var v = ("" + Info[i] || "null").replace(/\"/g,"'");
+               addParam("Info." + i, v);
+       }
+       
+       
+
+       element.JalviewInfo = Info;
+       var btn = document.createElement("button");
+       btn.appletElement = element;
+       var a = element.getAttribute("width");
+       //a && (btn.style.width = (a || 140) + "px");
+       a = element.getAttribute("height");
+       //a && (btn.style.height = (a || 25) + "px");
+       btn.jvparent = parent;
+       if (Info.startButton) {
+               btn.innerHTML = Info.startButton;
+               parent.replaceChild(btn, element); 
+               $(btn).click(Jalview.doStartJalview);
+       } else {
+               parent.removeChild(element);
+               Jalview.doStartJalview({target:btn});
+       }
+}
+
+
+Jalview.doStartJalview = function(e) {
+       e.target.disabled = true;
+       var element = e.target.appletElement;
+       var parent = e.target.jvparent;
+       var Info = element.JalviewInfo;
+       var id = Info.j2sAppletID;
+       var d = document.createElement("div");
+       d.id = id + "-desktop-div";
+       if (Info.hideDesktop) {
+               d.style.display = "none";
+               d.style.width = d.style.height = "0px";
+       } else {
+               d.style.width = "300px", d.style.height = "70px";
+       }
+       parent.appendChild(d);
+       d = document.createElement("div");
+       d.id = id + "-alignment-div";
+       if (Info.embedInternalFrames) {
+// TODO
+       } else {
+               d.style.display = "none";
+               d.style.width = d.style.height = "0px";
+       }
+       if (Info.allowJavascript) {
+               if (Info.readyFunction) {
+                       var c = Info.readyFunction;
+                       Info.readyFunction = function(a){
+                               Jalview._setAPI(a);
+                               c.apply(null, arguments);                       
+                       }
+               } else {
+                       Info.readyFunction = function(a) {Jalview._setAPI(a)};
+               }
+       }
+       var app = SwingJS.getApplet(id, Info);
+}
+
+Jalview._setAPI = function(app) {
+       
+       // Create a map of nonqualified methods to qualified methods
+       // based on parameter type.
+       var cl = Class.forName$S("jalview.bin.Jalview");
+       if (!cl.$clazz$.getInstance$) {
+               System.err.println(app.__Info.main + " has no getInstance() method; interface creation skipped.");
+               return;
+       }
+       var instance = app._instance = cl.$clazz$.getInstance$();
+       var apply = function(args, methods) {
+               return methods[args.length].apply(instance, args);
+       }
+       var getMap = function(cl) {
+               var methods = cl.getMethods$();
+               var p = cl.$clazz$.prototype;
+               var map = {};
+               for (var i = 0, n = methods.length; i < n; i++) {
+                       var qname = methods[i].name; 
+                       if (cl.$clazz$[qname])
+                               continue; // static method
+                       var s = qname.split("$");
+                       var name = s[0];
+                       if (!name)
+                               continue; // $init$, $cinit$
+                       if (app[name]) {
+                               name += "$";
+                               System.err.println(app._id + "." + name + " is " + qname);
+                       };
+                       (m = map[name])||(m = map[name] = []);
+                       var j = p[qname].length;
+                       if (m[j]) {
+                               System.err.println(app._id + ".instance." + qname + " must be called directly.");
+                               app[qname] = p[qname];
+                       } else {
+                               System.out.println(app._id + "." + name + "(" + j + ") aliases " + app._id + ".instance." + qname);
+                               m[j] = p[qname];
+                       }
+               }
+               return map;
+       }
+       var getFunc = function(map,i) {
+               return function(){return apply(arguments,map[i])};
+       }
+       var map = getMap(Clazz._4Name(app.__Info.main));
+       var n = 0;
+       for (var i in map) {
+               n++;
+               app[i] = getFunc(map,i);
+       }
+       System.err.println(app._id + " contains " + n + " JavaScript interface methods");
+}