Merge branch 'docs/2_8_1_Release' into Release_2_8_2_Branch
authorJim Procter <jprocter@dundee.ac.uk>
Thu, 5 Jun 2014 10:46:39 +0000 (11:46 +0100)
committerJim Procter <jprocter@dundee.ac.uk>
Thu, 5 Jun 2014 10:46:39 +0000 (11:46 +0100)
JAL-1517 JAL-1503 merge 2.8.1 source code updates to 2_8_2 branch
Conflicts:
RELEASE
build.xml
src/jalview/ext/varna/VarnaCommands.java
src/jalview/io/AppletFormatAdapter.java
src/jalview/io/StockholmFile.java

35 files changed:
1  2 
build.xml
src/MCview/PDBViewer.java
src/MCview/PDBfile.java
src/jalview/analysis/AlignSeq.java
src/jalview/analysis/Rna.java
src/jalview/analysis/StructureFrequency.java
src/jalview/appletgui/AlignFrame.java
src/jalview/bin/Jalview.java
src/jalview/datamodel/AlignmentAnnotation.java
src/jalview/datamodel/Annotation.java
src/jalview/datamodel/Sequence.java
src/jalview/datamodel/SequenceI.java
src/jalview/gui/AppVarna.java
src/jalview/gui/AppVarnaBinding.java
src/jalview/gui/AssociatePdbFileWithSeq.java
src/jalview/gui/Desktop.java
src/jalview/gui/PopupMenu.java
src/jalview/io/AlignFile.java
src/jalview/io/AppletFormatAdapter.java
src/jalview/io/FastaFile.java
src/jalview/io/FeaturesFile.java
src/jalview/io/FileLoader.java
src/jalview/io/IdentifyFile.java
src/jalview/io/JPredFile.java
src/jalview/io/PfamFile.java
src/jalview/io/PileUpfile.java
src/jalview/io/StockholmFile.java
src/jalview/io/TCoffeeScoreFile.java
src/jalview/jbgui/GAlignFrame.java
src/jalview/jbgui/GDesktop.java
src/jalview/renderer/AnnotationRenderer.java
src/jalview/schemes/ColourSchemeProperty.java
src/jalview/schemes/ResidueProperties.java
src/jalview/util/DBRefUtils.java
src/jalview/ws/dbsources/Pdb.java

diff --combined build.xml
+++ b/build.xml
@@@ -1,6 -1,6 +1,6 @@@
  <?xml version="1.0"?>
  <!--
-  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.1)
   * Copyright (C) 2014 The Jalview Authors
   * 
   * This file is part of Jalview.
   * The Jalview Authors are detailed in the 'AUTHORS' file.
  -->
  <project name="jalviewX" default="usage" basedir=".">
-       <!-- we use jalopy to format our sources -->
-       <taskdef name="jalopy" classname="de.hunsicker.jalopy.plugin.ant.AntPlugin">
-               <classpath>
-                       <fileset dir="utils/jalopy/lib">
-                               <include name="*.jar" />
-                       </fileset>
-               </classpath>
-       </taskdef>
-       <target name="help" depends="usage" />
-       <target name="usage">
-               <echo message="~~~Jalview Ant build.xml Usage~~~~" />
-               <echo message="Targets include:" />
-               <echo message="usage - default target, displays this message" />
-               <echo message="buildindices - generates JavaHelpSearch from the help files" />
-               <echo message="build - compiles all necessary files for Application" />
-               <echo message="makedist - compiles and places all necessary jar files into directory dist" />
-               <echo message="makefulldist - signs all jar files and builds jnlp file for full distribution" />
-               <echo message="              this needs a keystore and key. See docs/building.html for more information." />
-               <echo message="compileApplet - compiles all necessary files for Applet" />
-               <echo message="makeApplet - compiles, then packages and obfuscates the Applet" />
-               <echo message="See docs/building.html and the comments in build file for other targets." />
-               <echo message="note: compile and makeApplet require the property java118.home to be set to point to a java 1.1.8 jdk." />
-               <echo message="Useful -D flags: -Ddonotobfuscate will prevent applet obfuscation" />
-       </target>
-       <!-- utils is a class path to additional utilities needed for
+   <!-- we use jalopy to format our sources -->
+   <taskdef name="jalopy" classname="de.hunsicker.jalopy.plugin.ant.AntPlugin">
+     <classpath>
+       <fileset dir="utils/jalopy/lib">
+         <include name="*.jar" />
+       </fileset>
+     </classpath>
+   </taskdef>
+   <target name="help" depends="usage" />
+   <target name="usage">
+     <echo message="~~~Jalview Ant build.xml Usage~~~~" />
+     <echo message="Targets include:" />
+     <echo message="usage - default target, displays this message" />
+     <echo message="buildindices - generates JavaHelpSearch from the help files" />
+     <echo message="build - compiles all necessary files for Application" />
+     <echo message="makedist - compiles and places all necessary jar files into directory dist" />
+     <echo message="makefulldist - signs all jar files and builds jnlp file for full distribution" />
+     <echo message="              this needs a keystore and key. See docs/building.html for more information." />
+     <echo message="compileApplet - compiles all necessary files for Applet" />
+     <echo message="makeApplet - compiles, then packages and obfuscates the Applet" />
+     <echo message="See docs/building.html and the comments in build file for other targets." />
+     <echo message="note: compile and makeApplet require the property java118.home to be set to point to a java 1.1.8 jdk." />
+     <echo message="Useful -D flags: -Ddonotobfuscate will prevent applet obfuscation" />
+   </target>
+   <!-- utils is a class path to additional utilities needed for
      building docs, jars and webstart stuff -->
-       <!--
+   <!--
          Userdefined build property defaults
  
          wsdl.server list (plus namespace mapping info ???)  - also want
  
  -->
  
-       <target name="init">
-               <path id="axis.classpath">
-                       <!-->
-                       <fileset dir="/usr/local/axis/lib">
-                               <include name="**/*.jar" />
-                       </fileset>
-                       <fileset dir="/usr/local/jakarta-tomcat-5/webapps/axis/WEB-INF/lib">
-                               <include name="**/*.jar"/>
-                               <include name="*.jar"/>
-                       </fileset> -->
+   <target name="init">
+     <path id="axis.classpath">
+       <!-->
+       <fileset dir="/usr/local/axis/lib">
+         <include name="**/*.jar" />
+       </fileset>
+       <fileset dir="/usr/local/jakarta-tomcat-5/webapps/axis/WEB-INF/lib">
+         <include name="**/*.jar"/>
+         <include name="*.jar"/>
+       </fileset> -->
        </path>
-               <!-- Jalview Version String displayed by application on startup and used to check for updates -->
-               <property name="JALVIEW_VERSION" value="DEVELOPMENT" />
-               <!-- 2.4 (VAMSAS)" -->
-               <!-- Include debugging information in javac true or false -->
-               <property name="javac.debug" value="true" />
-               <!-- JarSigner Key Store for Webstart Distribution -->
-               <property name="jalview.keystore" value="./keys/.keystore" />
-               <!-- Keystore Password -->
-               <property name="jalview.keystore.pass" value="alignmentisfun" />
-               <!-- Key Name -->
-               <property name="jalview.key" value="jalview" />
-               <!-- Key Password -->
-               <property name="jalview.key.pass" value="alignmentisfun" />
-                   
-                   
-               <!-- Don't change anything below here unless you know what you are doing! -->
-               <!-- Url path for WebStart in JNLP file -->
-               <property name="WebStartLocation" value="http://www.jalview.org/webstart" />
-               <!-- Webstart Image - looked for in resources/images -->
-               <property name="WebStartImage" value="JalviewLogo_big.png"/>
-               <!-- J2SE version needed for webstart launch -->
+     <!-- Jalview Version String displayed by application on startup and used to check for updates -->
+     <property name="JALVIEW_VERSION" value="DEVELOPMENT" />
+     <!-- 2.4 (VAMSAS)" -->
+     <!-- Include debugging information in javac true or false -->
+     <property name="javac.debug" value="true" />
+     <!-- JarSigner Key Store for Webstart Distribution -->
+     <property name="jalview.keystore" value="./keys/.keystore" />
+     <!-- Keystore Password -->
+     <property name="jalview.keystore.pass" value="alignmentisfun" />
+     <!-- Key Name -->
+     <property name="jalview.key" value="jalview" />
+     <!-- Key Password -->
+     <property name="jalview.key.pass" value="alignmentisfun" />
 -
 -
+     <!-- Don't change anything below here unless you know what you are doing! -->
+     <!-- Url path for WebStart in JNLP file -->
+     <property name="WebStartLocation" value="http://www.jalview.org/webstart" />
+     <!-- Webstart Image - looked for in resources/images -->
+     <property name="WebStartImage" value="JalviewLogo_big.png"/>
+     <!-- J2SE version needed for webstart launch -->
 -    <property name="j2sev" value="1.6+"/>
 +<!-- Anne's version needs 1.7 - should rebuild VARNA to java 1.6 for release -->
-               <property name="j2sev" value="1.7+"/>
++    <property name="j2sev" value="1.7+"/>
  
      <!-- Permissions for running Java applets and applications. -->
      <!-- Defaults are those suitable for deploying jalview webstart www.jalview.org -->
      <property name="application.codebase" value="*.jalview.org" />
      <!-- and allowing the applet to be deployed from any URL -->
-     <property name="applet.codebase" value="*" />
+     <!-- note - if you want to make sure LiveConnect works without any warnings, please rebuild and sign your applet jar with your own domain included in the codebase/allowable-codebase properties -->
+     <property name="applet.codebase" value="*.jalview.org *.dundee.ac.uk *" />
      <property name="applet.caller-codebase" value="${applet.codebase}" />
  
-               <!-- build directory configuration -->
-               <property name="libDir" value="lib" />
-               <property name="resourceDir" value="resources" />
-               <property name="helpDir" value="help" />
-               <property name="docDir" value="doc" />
-               <property name="sourceDir" value="src" />
-               <property name="schemaDir" value="schemas" />
-               <property name="outputDir" value="classes" />
-               <property name="packageDir" value="dist" />
-               <property name="outputJar" value="jalview.jar" />
-               <!-- Jalview Applet JMol Jar Dependency -->
-               <property name="jmolJar" value="JmolApplet-12.2.4.jar" />
-               <property name="varnaJar" value="VARNAv3-9.jar" />
-               <property name="jalviewLiteJar" value="jalviewApplet.jar" />
-               <!-- switch to indicate if we should obfuscate jalviewLite -->
-               <!--<property name="donotobfuscate" value="true"/> -->
-               <!-- Jalview Web Service Clients - see the comments in 'buildextclients' for details -->
-               <property name="wsdl.File" value="http://www.compbio.dundee.ac.uk/JalviewWS/services/jpred?wsdl" />
-               <property name="wsdl.Files" value="http://www.compbio.dundee.ac.uk/JalviewWS/services/vamsas?wsdlFiles" />
-               <property name="wsdl.MsaWS" value="http://www.compbio.dundee.ac.uk/JalviewWS/services/MuscleWS?wsdl" />
-               <property name="wsdl.MsaWS2" value="http://www.compbio.dundee.ac.uk/JalviewWS/services/ClustalWS?wsdl" />
-               <property name="WSInterf" value="MsaWS" />
-               <property name="wsdl.Namespace" value="vamsas" />
-               <property name="wsdl.ClientNS" value="ext.vamsas" />
-               <!-- the class path for building the application -->
-               <path id="build.classpath">
-                       <fileset dir="utils">
-                               <include name="*.jar" />
-                               <include name="**/*.jar" />
-                       </fileset>
-                       <fileset dir="${libDir}">
-                               <include name="*.jar" />
-                               <include name="**/*.jar" />
-                       </fileset>
-                       <fileset dir="${java.home}/lib">
-                               <include name="plugin.jar"/>
-                       </fileset>
-                       <fileset dir="appletlib">
-                               <!-- the JmolApplet includes the JmolApplet console and the application javac seems to always try and build all packages 
+     <!-- build directory configuration -->
+     <property name="libDir" value="lib" />
+     <property name="resourceDir" value="resources" />
+     <property name="helpDir" value="help" />
+     <property name="docDir" value="doc" />
+     <property name="sourceDir" value="src" />
+     <property name="schemaDir" value="schemas" />
+     <property name="outputDir" value="classes" />
+     <property name="packageDir" value="dist" />
+     <property name="outputJar" value="jalview.jar" />
+     <!-- Jalview Applet JMol Jar Dependency -->
+     <property name="jmolJar" value="JmolApplet-12.2.4.jar" />
++    <property name="varnaJar" value="VARNAv3-9.jar" />
+     <property name="jalviewLiteJar" value="jalviewApplet.jar" />
+     <!-- switch to indicate if we should obfuscate jalviewLite -->
+     <!-- <property name="donotobfuscate" value="true"/> -->
+     <!-- switch to exclude associations from generated jnlp files -->
+     <!-- <property name="nojnlpfileassocs" value="true"/> -->
+     <!-- Jalview Web Service Clients - see the comments in 'buildextclients' for details -->
+     <property name="wsdl.File" value="http://www.compbio.dundee.ac.uk/JalviewWS/services/jpred?wsdl" />
+     <property name="wsdl.Files" value="http://www.compbio.dundee.ac.uk/JalviewWS/services/vamsas?wsdlFiles" />
+     <property name="wsdl.MsaWS" value="http://www.compbio.dundee.ac.uk/JalviewWS/services/MuscleWS?wsdl" />
+     <property name="wsdl.MsaWS2" value="http://www.compbio.dundee.ac.uk/JalviewWS/services/ClustalWS?wsdl" />
+     <property name="WSInterf" value="MsaWS" />
+     <property name="wsdl.Namespace" value="vamsas" />
+     <property name="wsdl.ClientNS" value="ext.vamsas" />
+     <!-- the class path for building the application -->
+     <path id="build.classpath">
+       <fileset dir="utils">
+         <include name="*.jar" />
+         <include name="**/*.jar" />
+       </fileset>
+       <fileset dir="${libDir}">
+         <include name="*.jar" />
+         <include name="**/*.jar" />
+       </fileset>
+       <fileset dir="${java.home}/lib">
+         <include name="plugin.jar"/>
+       </fileset>
+       <fileset dir="appletlib">
+         <!-- the JmolApplet includes the JmolApplet console and the application javac seems to always try and build all packages 
                                -->
-                               <include name="${jmolJar}" />
-                               <include name="${varnaJar}" />
-                       </fileset>
-               </path>
-               <property name="source.dist.name" value="${basedir}/jalview-src.tar.gz" />
-               <!-- The Location of the java 1.1.8 jdk -->
-               <!--<property name="java118.home" value="C:\Sun\jdk1.1.8" />
+         <include name="${jmolJar}" />
++      <include name="${varnaJar}" />
+       </fileset>
+     </path>
+     <property name="source.dist.name" value="${basedir}/jalview-src.tar.gz" />
+     <!-- The Location of the java 1.1.8 jdk -->
 -    <!--<property name="java118.home" value="C:\Sun\jdk1.1.8" />
 -              -->
++    <!--<property name="java118.home" value="C:\Sun\jdk1.1.8" /> -->
+     <property name="java118.home" value="${java.home}" />
 -    <!--<property name="applet.jre.tools" value="${java118.home}/lib/classes.zip" />
++    <!-- <property name="applet.jre.tools" value="${java118.home}/lib/classes.zip" />
                -->
-               <property name="java118.home" value="${java.home}" />
-                   <!--<property name="applet.jre.tools" value="${java118.home}/lib/classes.zip" />
-               --><!-- jre for 1.4 version -->
-               <property name="applet.jre.tools" value="${java.home}/lib/rt.jar"/>
-               
-               <!-- the classpath for building the 1.1 applet -->
-               <path id="jalviewlite.deps">
-                       <fileset dir="${java118.home}">
-                               <include name="lib/classes.zip" />
-                       </fileset>
-                       <fileset dir="${java.home}/lib">
-                               <include name="plugin.jar"/>
-                       </fileset>
-                       <pathelement location="appletlib/${jmolJar}" />
-       <pathelement location="lib/${varnaJar}" />
+     <!-- jre for 1.4 version -->
+     <property name="applet.jre.tools" value="${java.home}/lib/rt.jar"/>
  
-               </path>
+     <!-- the classpath for building the 1.1 applet -->
+     <path id="jalviewlite.deps">
+       <fileset dir="${java118.home}">
+         <include name="lib/classes.zip" />
+       </fileset>
+       <fileset dir="${java.home}/lib">
+         <include name="plugin.jar"/>
+       </fileset>
+       <pathelement location="appletlib/${jmolJar}" />
++      <pathelement location="lib/${varnaJar}" />
+     </path>
      <!-- default location for outputting javadoc -->
      <property name="javadocDir" value="${packageDir}/javadoc"/>
-       </target>
+   </target>
  
  
-       <taskdef classpath="utils/roxes-ant-tasks-1.2-2004-01-30.jar" resource="com/roxes/tools/ant/taskdefs.properties" />
-       <target name="buildPropertiesFile" depends="init">
-               <tstamp prefix="build">
-                       <format property="date" pattern="dd MMMM yyyy" />
-               </tstamp>
-               <properties file="${outputDir}/.build_properties">
-                       <header>
+   <taskdef classpath="utils/roxes-ant-tasks-1.2-2004-01-30.jar" resource="com/roxes/tools/ant/taskdefs.properties" />
+   <target name="buildPropertiesFile" depends="init">
+     <tstamp prefix="build">
+       <format property="date" pattern="dd MMMM yyyy" />
+     </tstamp>
+     <properties file="${outputDir}/.build_properties">
+       <header>
            ---Jalview Build Details---
          </header>
-                       <property name="VERSION" value="${JALVIEW_VERSION}" />
-                       <property name="BUILD_DATE" value="${build.date}" />
-               </properties>
-       </target>
-       <target name="clean" depends="init">
-               <!-- not efficient yet. -->
-               <delete dir="${outputDir}" includes="*,**/*"/>
-       </target>
-       <target name="distclean" depends="init, clean">
-               <echo message="REMOVING ALL BACKUP/AUTOSAVES!" />
-               <delete>
-                       <fileset dir=".">
-                               <include name="${outputJar}" />
-                               <include name="#*#" />
-                               <include name="#*.*#" />
-                               <include name="**/#*#" />
-                               <include name="**/#*.*#" />
-                               <include name="*~" />
-                               <include name="*.*~" />
-                               <include name="**/*~" />
-                               <include name="**/*.*~" />
-                       </fileset>
-               </delete>
-       </target>
-       <target name="prepare" depends="init">
-               <mkdir dir="${outputDir}" />
-               <copy todir="${outputDir}">
-                       <fileset dir=".">
-                               <include name="${docDir}/**/*.*" />
-                               <include name="${helpDir}/**/*.*" />
-                               <include name="${libDir}/*.jar" />
-                       </fileset>
-                       <fileset dir="${resourceDir}">
-                               <include name="**/*.*" />
-                       </fileset>
-               </copy>
-       </target>
-       <target name="build" depends="prepare">
-               <!-- not efficient yet. -->
-               <javac source="1.5" target="1.5" srcdir="${sourceDir}" destdir="${outputDir}" debug="${javac.debug}" classpathref="build.classpath">
-                       <exclude name="jalview/*applet*" />
-                       <exclude name="jalview/appletgui/**" />
-                       <exclude name="com/stevesoft/**" />
-               </javac>
-       </target>
-       <target name="buildindices" depends="init, prepare" unless="help.uptodate">
-               <java classname="com.sun.java.help.search.Indexer" classpathref="build.classpath" fork="true" dir="${outputDir}/${helpDir}">
-                       <arg line="html" />
-               </java>
-       </target>
-       <target name="makefulldist" depends="makedist">
-               <copy todir="${packageDir}">
-                       <fileset dir="${resourceDir}/images">
-                               <include name="${WebStartImage}"/>
-                       </fileset>
-                                       </copy>
-               
-               <taskdef classpathref="build.classpath" resource="com/roxes/tools/ant/taskdefs.properties" />
+       <property name="VERSION" value="${JALVIEW_VERSION}" />
+       <property name="BUILD_DATE" value="${build.date}" />
+     </properties>
+   </target>
+   <target name="clean" depends="init">
+     <!-- not efficient yet. -->
+     <delete dir="${outputDir}" includes="*,**/*"/>
+   </target>
+   <target name="distclean" depends="init, clean">
+     <echo message="REMOVING ALL BACKUP/AUTOSAVES!" />
+     <delete>
+       <fileset dir=".">
+         <include name="${outputJar}" />
+         <include name="#*#" />
+         <include name="#*.*#" />
+         <include name="**/#*#" />
+         <include name="**/#*.*#" />
+         <include name="*~" />
+         <include name="*.*~" />
+         <include name="**/*~" />
+         <include name="**/*.*~" />
+       </fileset>
+     </delete>
+   </target>
+   <target name="prepare" depends="init">
+     <mkdir dir="${outputDir}" />
+     <copy todir="${outputDir}">
+       <fileset dir=".">
+         <include name="${docDir}/**/*.*" />
+         <include name="${helpDir}/**/*.*" />
+         <include name="${libDir}/*.jar" />
+       </fileset>
+       <fileset dir="${resourceDir}">
+         <include name="**/*.*" />
+       </fileset>
+     </copy>
+   </target>
+   <target name="build" depends="prepare">
+     <!-- not efficient yet. -->
+     <javac source="1.5" target="1.5" srcdir="${sourceDir}" destdir="${outputDir}" debug="${javac.debug}" classpathref="build.classpath">
+       <exclude name="jalview/*applet*" />
+       <exclude name="jalview/appletgui/**" />
+       <exclude name="com/stevesoft/**" />
+     </javac>
+   </target>
+   <target name="buildindices" depends="init, prepare" unless="help.uptodate">
+     <java classname="com.sun.java.help.search.Indexer" classpathref="build.classpath" fork="true" dir="${outputDir}/${helpDir}">
+       <arg line="html" />
+     </java>
+   </target>
+   <target name="makefulldist" depends="makedist">
+     <copy todir="${packageDir}">
+       <fileset dir="${resourceDir}/images">
+         <include name="${WebStartImage}"/>
+       </fileset>
+     </copy>
+     <taskdef classpathref="build.classpath" resource="com/roxes/tools/ant/taskdefs.properties" />
  
      <!-- create a dummy jar which will eventually contain the jnlp template -->
      <jar destfile="${packageDir}/jalview_jnlp_vm.jar" index="true">
-                               <fileset dir="${packageDir}">
-                                       <include name="jalview.jar" />
-                               </fileset>
+       <fileset dir="${packageDir}">
+         <include name="jalview.jar" />
+       </fileset>
      </jar>
-       
-       <mkdir dir="${packageDir}/JNLP-INF"/>
+     <mkdir dir="${packageDir}/JNLP-INF"/>
      <antcall target="writejnlpf">
-        <param name="jnlpFile" value="${packageDir}/JNLP-INF/APPLICATION-TEMPLATE.JNLP"/>
-        <param name="inih" value="*" />
-        <param name="maxh" value="*"/>
+       <param name="jnlpFile" value="${packageDir}/JNLP-INF/APPLICATION-TEMPLATE.JNLP"/>
+       <param name="inih" value="*" />
+       <param name="maxh" value="*"/>
      </antcall>
-               
-       <jar destfile="${packageDir}/jalview_jnlp_vm.jar" index="true">
-                               <fileset dir="${packageDir}">
-               <include name="JNLP-INF"/>
-                               </fileset>
-       </jar>
-     
-       <antcall target="writejnlpf">
-               <param name="jnlpFile" value="${packageDir}/jalview.jnlp"/>
-               <param name="inih" value="10M" />
-         <param name="maxh" value="256M"/>
-       </antcall>
-       
-       <antcall target="writejnlpf">
-         <param name="jnlpFile" value="${packageDir}/jalview_1G.jnlp"/>
-         <param name="inih" value="128M" />
-               <param name="maxh" value="512M"/>
-       </antcall>
-           
-       <antcall target="writejnlpf">
-         <param name="jnlpFile" value="${packageDir}/jalview_2G.jnlp"/>
-         <param name="inih" value="256M" />
-         <param name="maxh" value="1024M"/>
-       </antcall>
-       
-                       <!-- finally, need to postprocess to add in associations at end of 'information' element 
+     <jar destfile="${packageDir}/jalview_jnlp_vm.jar" index="true">
+       <fileset dir="${packageDir}">
+         <include name="JNLP-INF"/>
+       </fileset>
+     </jar>
+     <antcall target="writejnlpf">
+       <param name="jnlpFile" value="${packageDir}/jalview.jnlp"/>
+       <param name="inih" value="10M" />
+       <param name="maxh" value="256M"/>
+     </antcall>
+     <antcall target="writejnlpf">
+       <param name="jnlpFile" value="${packageDir}/jalview_1G.jnlp"/>
+       <param name="inih" value="128M" />
+       <param name="maxh" value="512M"/>
+     </antcall>
+     <antcall target="writejnlpf">
+       <param name="jnlpFile" value="${packageDir}/jalview_2G.jnlp"/>
+       <param name="inih" value="256M" />
+       <param name="maxh" value="1024M"/>
+     </antcall>
+     <!-- finally, need to postprocess to add in associations at end of 'information' element 
                        
                        <xslt in="${packageDir}/jalview_noa_1G.jnlp" out="${packageDir}/jalview_1G.jnlp">
                
                        
                        
                        -->
-                                       <!--
+     <!--
                                <association mime-type="application-x/ext-file" extensions="fa"/>
          <association mime-type="application-x/ext-file" extensions="fasta"/>
          <association mime-type="application-x/ext-file" extensions="mfa"/>
      <!-- and sign the jars -->
      <!-- the default keystore details might need to be edited here -->
      <signjar storepass="${jalview.keystore.pass}" keypass="${jalview.key.pass}" keystore="${jalview.keystore}" alias="${jalview.key}" lazy="false" verbose="false" sigalg="SHA1withRSA">
-         <fileset dir="${packageDir}">
-           <include name="*.jar" />
-         </fileset>
+       <fileset dir="${packageDir}">
+         <include name="*.jar" />
+       </fileset>
      </signjar>
-       </target>
-       <target name="runenv" depends="init">
-               <path id="run.classpath">
-                       <pathelement location="${outputDir}" />
-                       <fileset dir="${outputDir}">
-                               <include name="${libDir}/*.jar" />
-                       </fileset>
-               </path>
-               <pathconvert targetos="unix" refid="run.classpath" property="run.classpath" />
-               <echo>java -classpath ${run.classpath} jalview.bin.Jalview
+   </target>
+   <target name="runenv" depends="init">
+     <path id="run.classpath">
+       <pathelement location="${outputDir}" />
+       <fileset dir="${outputDir}">
+         <include name="${libDir}/*.jar" />
+       </fileset>
+     </path>
+     <pathconvert targetos="unix" refid="run.classpath" property="run.classpath" />
+     <echo>java -classpath ${run.classpath} jalview.bin.Jalview
        </echo>
-       </target>
-   <target name="writejnlpf">
-       <presetdef name="jnlpf">
-           <jnlp codebase="${WebStartLocation}">
-             <information>
-               <title>Jalview</title>
-               <vendor>The Barton Group</vendor>
-               <homepage href="http://www.jalview.org" />
-               <description>Jalview Multiple Alignment Editor</description>
-               <description kind="short">Jalview</description>
-               <icon href="${WebStartImage}" />
-               <offline_allowed />
-             </information>
-             <resources>
-               <j2se version="${j2sev}" initial_heap_size="${inih}" max_heap_size="${maxh}" />
-               <fileset dir="${packageDir}">
-                 <include name="jalview.jar" />
-               </fileset>
-               <fileset dir="${packageDir}">
-                 <include name="*.jar" />
-                 <include name="*_*.jar" />
-                 <exclude name="jalview.jar" />
-               </fileset>
-               <property name="jalview.version" value="${JALVIEW_VERSION}" />
-             </resources>
-             <application_desc main_class="jalview.bin.Jalview">
-             </application_desc>
-             <security>
-               <all_permissions />
-             </security>
-           </jnlp>
-           </presetdef>
-           <jnlpf toFile="${jnlpFile}"/>
    </target>
-       <target name="buildextclients" depends="init">
-               <input message="Building external client source from WSDLs - Do you really want to do this ? (Yy/Nn)" validargs="Y,y,n,N" defaultvalue="N" addproperty="doextbuild.response" />
-               <condition property="dontextbuild">
-                       <equals arg1="n" arg2="${doextbuild.response}" />
-               </condition>
-               <condition property="dontextbuild">
-                       <equals arg1="N" arg2="${doextbuild.response}" />
-               </condition>
-               <fail if="dontextbuild">
+   <target name="-generatejnlpf">
+     <presetdef name="jnlpf">
+       <jnlp codebase="${WebStartLocation}">
+         <information>
+           <title>Jalview</title>
+           <vendor>The Barton Group</vendor>
+           <homepage href="http://www.jalview.org" />
+           <description>Jalview Multiple Alignment Editor</description>
+           <description kind="short">Jalview</description>
+           <icon href="${WebStartImage}" />
+           <offline_allowed />
+         </information>
+         <resources>
+           <j2se version="${j2sev}" initial_heap_size="${inih}" max_heap_size="${maxh}" />
+           <fileset dir="${packageDir}">
+             <include name="jalview.jar" />
+           </fileset>
+           <fileset dir="${packageDir}">
+             <include name="*.jar" />
+             <include name="*_*.jar" />
+             <exclude name="jalview.jar" />
+           </fileset>
+           <property name="jalview.version" value="${JALVIEW_VERSION}" />
+         </resources>
+         <application_desc main_class="jalview.bin.Jalview">
+         </application_desc>
+         <security>
+           <all_permissions />
+         </security>
+       </jnlp>
+     </presetdef>
+     <jnlpf toFile="${jnlpFile}"/>
+   
+   </target>
+   
+   <target name="-dofakejnlpfileassoc" depends="-generatejnlpf" if="nojnlpfileassocs">
+     <echo message="Not adding JNLP File Associations"/>
+   </target>
+   
+   <target name="-dojnlpfileassoc" depends="-generatejnlpf" unless="nojnlpfileassocs">
+     <replace file="${jnlpFile}">
+       <replacetoken>
+         <![CDATA[</information>]]></replacetoken>
+       <replacevalue>
+         <![CDATA[
+           <association mime-type="application-x/ext-file" extensions="fa" />
+         <association mime-type="application-x/ext-file" extensions="fasta" />
+         <association mime-type="application-x/ext-file" extensions="mfa" />
+         <association mime-type="application-x/ext-file" extensions="fastq" />
+         <association mime-type="application-x/ext-file" extensions="blc" />
+         <association mime-type="application-x/ext-file" extensions="msf" />
+         <association mime-type="application-x/ext-file" extensions="pfam" />
+         <association mime-type="application-x/ext-file" extensions="aln"/>
+         <association mime-type="application-x/ext-file" extensions="pir"/>
+         <association mime-type="application-x/ext-file" extensions="amsa"/>
+         <association mime-type="application-x/ext-file" extensions="stk"/>
+         <association mime-type="application-x/ext-file" extensions="jvp"/>
+       </information>]]></replacevalue>
+     </replace>
+     <echo message="Added file associations to JNLP file"/>
+     </target>
+ <target name="writejnlpf" depends="-dojnlpfileassoc,-dofakejnlpfileassoc">
+ </target>
+ <target name="buildextclients" depends="init">
+   <input message="Building external client source from WSDLs - Do you really want to do this ? (Yy/Nn)" validargs="Y,y,n,N" defaultvalue="N" addproperty="doextbuild.response" />
+   <condition property="dontextbuild">
+     <equals arg1="n" arg2="${doextbuild.response}" />
+   </condition>
+   <condition property="dontextbuild">
+     <equals arg1="N" arg2="${doextbuild.response}" />
+   </condition>
+   <fail if="dontextbuild">
          Build External Client Code process aborted by user. Jalview source is unchanged.
        </fail>
-               <!-- Currently, this doesn't happen automatically.
+   <!-- Currently, this doesn't happen automatically.
       1. Run WSDL2Java as below, which generates an ext.vamsas +
       vamsas.<datapackages> fileset.
       2. refactor ext.vamsas.SpecificserviceWS* to
       might be using.
  
  -->
-               <path id="axisbuild">
-                       <path refid="build.classpath" />
-               </path>
-               <taskdef resource="axis-tasks.properties" classpathref="axisbuild" />
-               <move todir="./bak">
-                       <fileset dir="${sourceDir}" id="client">
-                               <include name="${wsdl.ClientNS}/*.*" />
-                       </fileset>
-               </move>
-               <axis-wsdl2java output="${sourceDir}" verbose="true" url="${wsdl.MsaWS2}" serverside="false" deployscope="Request" debug="false" helpergen="true" all="true">
-                       <mappingSet>
-                               <mapping namespace="${wsdl.Namespace}" package="${wsdl.ClientNS}" />
-                               <mapping namespace="http://dataTypes.vamsas" package="${wsdl.ClientNS}" />
-                       </mappingSet>
-               </axis-wsdl2java>
-       </target>
-       <target name="makedist" depends="build, buildPropertiesFile, buildindices">
-               <!-- make the package jar if not already existing -->
-               <mkdir dir="${packageDir}" />
-               <!-- clean dir if it already existed -->
-               <delete>
-                       <fileset dir="${packageDir}">
-                               <include name="*.jar"/>
-                       </fileset>
-               </delete>
-               <jar destfile="${packageDir}/${outputJar}" index="true">
-                       <manifest>
-                               <attribute name="Main-Class" value="jalview.bin.Jalview" />
-         <attribute name="Permissions" value="all-permissions" />
-         <attribute name="Application-Name" value="Jalview Desktop" />
-         <attribute name="Codebase" value="${application.codebase}" />
-                       </manifest>
-                       <fileset dir="${outputDir}/">
-                               <exclude name="cache*/**" />
-                               <exclude name="*.jar" />
-                               <exclude name="*.jar.*" />
-                               <exclude name="**/*.jar" />
-                               <exclude name="**/*.jar.*" />
-                       </fileset>
-               </jar>
-               <copy toDir="${packageDir}" flatten="true">
-                       <fileset dir="${outputDir}">
-                               <include name="*.jar" />
-                               <include name="**/*.jar" />
-                       </fileset>
-               </copy>
-       </target>
-       <!-- jalopy code reformatter -->
-       <target name="sourcescrub" depends="init,build">
-               <jalopy destdir="jsrc" classpathref="run.classpath" convention="jalview-jalopy.xml">
-                       <fileset dir="${sourceDir}">
-                               <include name="*.java" />
-                               <include name="**/*.java" />
-                               <include name="**/**/*.java" />
-                       </fileset>
-               </jalopy>
-       </target>
-       <!-- Compile, package and obfuscate Jalview Applet -->
-       <target name="makeApplet" depends="obfuscate" description="assemble the final jalviewLite applet jar with or without obfuscation"/>
-       <target name="compileApplet" depends="init,clean">
-               <mkdir dir="${outputDir}" />
-               <javac source="1.5" target="1.5" srcdir="${sourceDir}" destdir="${outputDir}" debug="${javac.debug}" 
+   <path id="axisbuild">
+     <path refid="build.classpath" />
+   </path>
+   <taskdef resource="axis-tasks.properties" classpathref="axisbuild" />
+   <move todir="./bak">
+     <fileset dir="${sourceDir}" id="client">
+       <include name="${wsdl.ClientNS}/*.*" />
+     </fileset>
+   </move>
+   <axis-wsdl2java output="${sourceDir}" verbose="true" url="${wsdl.MsaWS2}" serverside="false" deployscope="Request" debug="false" helpergen="true" all="true">
+     <mappingSet>
+       <mapping namespace="${wsdl.Namespace}" package="${wsdl.ClientNS}" />
+       <mapping namespace="http://dataTypes.vamsas" package="${wsdl.ClientNS}" />
+     </mappingSet>
+   </axis-wsdl2java>
+ </target>
+ <target name="makedist" depends="build, buildPropertiesFile, buildindices">
+   <!-- make the package jar if not already existing -->
+   <mkdir dir="${packageDir}" />
+   <!-- clean dir if it already existed -->
+   <delete>
+     <fileset dir="${packageDir}">
+       <include name="*.jar"/>
+     </fileset>
+   </delete>
+   <jar destfile="${packageDir}/${outputJar}" index="true">
+     <manifest>
+       <attribute name="Main-Class" value="jalview.bin.Jalview" />
+       <attribute name="Permissions" value="all-permissions" />
+       <attribute name="Application-Name" value="Jalview Desktop" />
+       <attribute name="Codebase" value="${application.codebase}" />
+     </manifest>
+     <fileset dir="${outputDir}/">
+       <exclude name="cache*/**" />
+       <exclude name="*.jar" />
+       <exclude name="*.jar.*" />
+       <exclude name="**/*.jar" />
+       <exclude name="**/*.jar.*" />
+     </fileset>
+   </jar>
+   <copy toDir="${packageDir}" flatten="true">
+     <fileset dir="${outputDir}">
+       <include name="*.jar" />
+       <include name="**/*.jar" />
+     </fileset>
+   </copy>
+ </target>
+ <!-- jalopy code reformatter -->
+ <target name="sourcescrub" depends="init,build">
+   <jalopy destdir="jsrc" classpathref="run.classpath" convention="jalview-jalopy.xml">
+     <fileset dir="${sourceDir}">
+       <include name="*.java" />
+       <include name="**/*.java" />
+       <include name="**/**/*.java" />
+     </fileset>
+   </jalopy>
+ </target>
+ <!-- Compile, package and obfuscate Jalview Applet -->
+ <target name="makeApplet" depends="obfuscate" description="assemble the final jalviewLite applet jar with or without obfuscation"/>
+ <target name="compileApplet" depends="init,clean">
+   <mkdir dir="${outputDir}" />
+   <javac source="1.5" target="1.5" srcdir="${sourceDir}" destdir="${outputDir}" debug="${javac.debug}" 
                        classpathref="jalviewlite.deps" includes="jalview/appletgui/**"
 -                      excludes="ext/**,MCview/**,org/**,vamsas/**" />
 +                      excludes="ext/**,MCview/**,org/**,vamsas/**,jalview/ext/paradise/**" />
-       </target>
-       <target name="packageApplet" depends="compileApplet, buildPropertiesFile">
-               <copy file="${resourceDir}/images/idwidth.gif" toFile="${outputDir}/images/idwidth.gif" />
-               <copy file="${resourceDir}/images/link.gif" toFile="${outputDir}/images/link.gif" />
-               <copy todir="${outputDir}/lang">
-                       <fileset dir="${resourceDir}/lang"><include name="**.*"/></fileset></copy>
-               <jar destfile="in.jar" index="true">
-                       <manifest>
-                               <attribute name="Main-Class" value="jalview.bin.JalviewLite" />
-               <attribute name="Application-Name" value="JalviewLite" />
-           <attribute name="Codebase" value="${applet.codebase}" />
-                       </manifest>
-                       <fileset dir="${outputDir}">
-                               <include name="com/**" />
-                               <include name="MCview/**" />
-                               <include name="jalview/**" />
-                               <include name=".build_properties" />
-                               <include name="images/idwidth.gif" />
-                               <include name="images/link.gif" />
-                               <include name="lang/**" />
-                       </fileset>
-               </jar>
-       </target>
-       <target name="obfuscate" depends="-obfuscatefake,-obfuscatereally">
-       </target>
-       <target name="-obfuscatefake" depends="packageApplet" if="donotobfuscate">
-               <copy file="in.jar" tofile="${jalviewLiteJar}" overwrite="true" />
-               <delete file="in.jar" />
-       </target>
-       <target name="-obfuscatereally" unless="donotobfuscate">
-               <path id="obfuscateDeps.path">
-                       <pathelement location="${applet.jre.tools}" />
-                       <pathelement location="appletlib/${jmolJar}" />
-               </path>
-               <taskdef resource="proguard/ant/task.properties" classpath="utils/proguard.jar" />
-               <proguard>
-                       <injar file="in.jar" />
-                       <outjar file="${jalviewLiteJar}" />
-                       <libraryjar refid="obfuscateDeps.path" />
-                       <dontwarn/>
-                       <keep access="public" type="class" name="jalview.bin.JalviewLite">
-                               <field access="public" />
-                               <method access="public" />
-                               <constructor access="public" />
-                       </keep>
-                       <keep access="public" type="class" name="jalview.appletgui.AlignFrame">
-                               <field access="public" />
-                               <method access="public" />
-                               <constructor access="public" />
-                       </keep>
-                       <!--      -libraryjars "${obfuscateDeps}"
+ </target>
+ <target name="packageApplet" depends="compileApplet, buildPropertiesFile">
+   <copy file="${resourceDir}/images/idwidth.gif" toFile="${outputDir}/images/idwidth.gif" />
+   <copy file="${resourceDir}/images/link.gif" toFile="${outputDir}/images/link.gif" />
+   <copy todir="${outputDir}/lang">
+     <fileset dir="${resourceDir}/lang">
+       <include name="**.*"/>
+     </fileset>
+   </copy>
+   <jar destfile="in.jar" index="true">
+     <manifest>
+       <attribute name="Main-Class" value="jalview.bin.JalviewLite" />
+       <attribute name="Application-Name" value="JalviewLite" />
+       <attribute name="Codebase" value="${applet.codebase}" />
+     </manifest>
+     <fileset dir="${outputDir}">
+       <include name="com/**" />
+       <include name="MCview/**" />
+       <include name="jalview/**" />
+       <include name=".build_properties" />
+       <include name="images/idwidth.gif" />
+       <include name="images/link.gif" />
+       <include name="lang/**" />
+     </fileset>
+   </jar>
+ </target>
+ <target name="obfuscate" depends="-obfuscatefake,-obfuscatereally">
+ </target>
+ <target name="-obfuscatefake" depends="packageApplet" if="donotobfuscate">
+   <copy file="in.jar" tofile="${jalviewLiteJar}" overwrite="true" />
+   <delete file="in.jar" />
+ </target>
+ <target name="-obfuscatereally" unless="donotobfuscate">
+   <path id="obfuscateDeps.path">
+     <pathelement location="${applet.jre.tools}" />
+     <pathelement location="appletlib/${jmolJar}" />
+   </path>
+   <taskdef resource="proguard/ant/task.properties" classpath="utils/proguard.jar" />
+   <proguard>
+     <injar file="in.jar" />
+     <outjar file="${jalviewLiteJar}" />
+     <libraryjar refid="obfuscateDeps.path" />
+     <dontwarn/>
+     <keep access="public" type="class" name="jalview.bin.JalviewLite">
+       <field access="public" />
+       <method access="public" />
+       <constructor access="public" />
+     </keep>
+     <keep access="public" type="class" name="jalview.appletgui.AlignFrame">
+       <field access="public" />
+       <method access="public" />
+       <constructor access="public" />
+     </keep>
+     <!--      -libraryjars "${obfuscateDeps}"
        -injars      in.jar
        -outjars     jalviewApplet.jar
        -keep public class jalview.bin.JalviewLite
         { public * ; } -->
-               </proguard>
-               <delete file="in.jar" />
-       </target>
-       <target name="castorbinding" depends="init" description="Generate Java bindings to supported Jalview XML models.">
-               <taskdef name="castor-srcgen" classname="org.castor.anttask.CastorCodeGenTask" classpathref="build.classpath" />
-               <delete>
-                       <fileset dir="${sourceDir}/jalview/schemabinding/version2">
-                               <include name="*.java" />
-                               <include name="descriptors/*.java" />
-                       </fileset>
-               </delete>
-               <castor-srcgen file="${schemaDir}/vamsas.xsd" todir="${sourceDir}" package="jalview.schemabinding.version2" warnings="false" nodesc="false" verbose="true" properties="${schemaDir}/jalview.properties" />
-               <castor-srcgen file="${schemaDir}/JalviewUserColours.xsd" todir="${sourceDir}" package="jalview.schemabinding.version2" warnings="false" nodesc="false" verbose="true" properties="${schemaDir}/jalview.properties" />
-               <castor-srcgen file="${schemaDir}/JalviewWsParamSet.xsd" todir="${sourceDir}" package="jalview.schemabinding.version2" warnings="false" nodesc="false" verbose="true" properties="${schemaDir}/jalview.properties" />
-               <castor-srcgen file="${schemaDir}/jalview.xsd" todir="${sourceDir}" package="jalview.schemabinding.version2" warnings="false" nodesc="false" verbose="true" properties="${schemaDir}/jalview.properties" />
-               <!-- 
+   </proguard>
+   <delete file="in.jar" />
+ </target>
+ <target name="castorbinding" depends="init" description="Generate Java bindings to supported Jalview XML models.">
+   <taskdef name="castor-srcgen" classname="org.castor.anttask.CastorCodeGenTask" classpathref="build.classpath" />
+   <delete>
+     <fileset dir="${sourceDir}/jalview/schemabinding/version2">
+       <include name="*.java" />
+       <include name="descriptors/*.java" />
+     </fileset>
+   </delete>
+   <castor-srcgen file="${schemaDir}/vamsas.xsd" todir="${sourceDir}" package="jalview.schemabinding.version2" warnings="false" nodesc="false" verbose="true" properties="${schemaDir}/jalview.properties" />
+   <castor-srcgen file="${schemaDir}/JalviewUserColours.xsd" todir="${sourceDir}" package="jalview.schemabinding.version2" warnings="false" nodesc="false" verbose="true" properties="${schemaDir}/jalview.properties" />
+   <castor-srcgen file="${schemaDir}/JalviewWsParamSet.xsd" todir="${sourceDir}" package="jalview.schemabinding.version2" warnings="false" nodesc="false" verbose="true" properties="${schemaDir}/jalview.properties" />
+   <castor-srcgen file="${schemaDir}/jalview.xsd" todir="${sourceDir}" package="jalview.schemabinding.version2" warnings="false" nodesc="false" verbose="true" properties="${schemaDir}/jalview.properties" />
+   <!-- 
                now build the jalview.binding package with the old schema set
                -->
-               <delete>
-                       <fileset dir="${sourceDir}/jalview/binding/">
-                               <include name="**" />
-                       </fileset>
-               </delete>
-               <castor-srcgen file="${schemaDir}/vamsasJvV1.xsd" todir="${sourceDir}" package="jalview.binding" warnings="false" nodesc="true" verbose="true" properties="${schemaDir}/jalview.nodesc.properties" />
-               <castor-srcgen file="${schemaDir}/JalviewUserColours.xsd" todir="${sourceDir}" package="jalview.binding" warnings="false" nodesc="true" verbose="true" properties="${schemaDir}/jalview.nodesc.properties" />
-               <castor-srcgen file="${schemaDir}/jalviewJvV1.xsd" todir="${sourceDir}" package="jalview.binding" warnings="false" nodesc="true" verbose="true" properties="${schemaDir}/jalview.nodesc.properties" />
-       </target>
-       <target name="sourcedist" description="create jalview source distribution" depends="init">
-               <delete file="${source.dist.name}" />
-               <tar destfile="${source.dist.name}" compression="gzip">
-                       <tarfileset dir="./" prefix="jalview" preserveLeadingSlashes="true">
-                               <include name="LICENSE" />
-                               <include name="README" />
-                               <include name="build.xml" />
-                               <include name="jalview-jalopy.xml" />
-                               <include name="JalviewApplet.jpx" />
-                               <include name="JalviewX.jpx" />
-                               <include name="nbbuild.xml"/>
-                               <include name="nbproject/genfiles.properties"/>
-         <include name="nbproject/project.properties"/>
-         <include name="nbproject/project.xml"/>
-                               <include name="${sourceDir}/*.java" />
-                               <include name="${sourceDir}/**/*.java" />
-                               <include name="${sourceDir}/**/*.cdr" />
-                               <include name="${libDir}/**/*" />
-                               <include name="${resourceDir}/**/*" />
-                               <include name="${helpDir}/**/*" />
-                               <include name="appletlib/${jmolJar}" />
-                               <exclude name="**/*locales" />
-                               <exclude name="*locales/**" />
-                               <exclude name="utils/InstallAnywhere/**Build.iap_xml" />
-                               <exclude name="utils/InstallAnywhere/**Build*/**" />
-                               <exclude name="utils/InstallAnywhere/**Build*/**" />
-                               <exclude name="utils/InstallAnywhere/**locale*" />
-                               <exclude name="utils/InstallAnywhere/**locale*/**" />
-                               <include name="${schemaDir}/**/*" />
-                               <include name="utils/**/*" />
-                               <include name="${docDir}/**/*" />
-                               <include name="examples/**/*" />
-                       </tarfileset>
-               </tar>
-       </target>
-       <target name="pubapplet" description="installs the jalviewLite applet and dependent jars into an applet examples directory built under ${outputDir}" depends="makeApplet">
-         <copy todir="${packageDir}/examples">
-         <fileset dir="examples">
-               <include name="**/*"/>
-               <include name="javascript/*"/>
+   <delete>
+     <fileset dir="${sourceDir}/jalview/binding/">
+       <include name="**" />
+     </fileset>
+   </delete>
+   <castor-srcgen file="${schemaDir}/vamsasJvV1.xsd" todir="${sourceDir}" package="jalview.binding" warnings="false" nodesc="true" verbose="true" properties="${schemaDir}/jalview.nodesc.properties" />
+   <castor-srcgen file="${schemaDir}/JalviewUserColours.xsd" todir="${sourceDir}" package="jalview.binding" warnings="false" nodesc="true" verbose="true" properties="${schemaDir}/jalview.nodesc.properties" />
+   <castor-srcgen file="${schemaDir}/jalviewJvV1.xsd" todir="${sourceDir}" package="jalview.binding" warnings="false" nodesc="true" verbose="true" properties="${schemaDir}/jalview.nodesc.properties" />
+ </target>
+ <target name="sourcedist" description="create jalview source distribution" depends="init">
+   <delete file="${source.dist.name}" />
+   <tar destfile="${source.dist.name}" compression="gzip">
+     <tarfileset dir="./" prefix="jalview" preserveLeadingSlashes="true">
+       <include name="LICENSE" />
+       <include name="README" />
+       <include name="build.xml" />
+       <include name="jalview-jalopy.xml" />
+       <include name="JalviewApplet.jpx" />
+       <include name="JalviewX.jpx" />
+       <include name="nbbuild.xml"/>
+       <include name="nbproject/genfiles.properties"/>
+       <include name="nbproject/project.properties"/>
+       <include name="nbproject/project.xml"/>
+       <include name="${sourceDir}/*.java" />
+       <include name="${sourceDir}/**/*.java" />
+       <include name="${sourceDir}/**/*.cdr" />
+       <include name="${libDir}/**/*" />
+       <include name="${resourceDir}/**/*" />
+       <include name="${helpDir}/**/*" />
+       <include name="appletlib/${jmolJar}" />
+       <exclude name="**/*locales" />
+       <exclude name="*locales/**" />
+       <exclude name="utils/InstallAnywhere/**Build.iap_xml" />
+       <exclude name="utils/InstallAnywhere/**Build*/**" />
+       <exclude name="utils/InstallAnywhere/**Build*/**" />
+       <exclude name="utils/InstallAnywhere/**locale*" />
+       <exclude name="utils/InstallAnywhere/**locale*/**" />
+       <include name="${schemaDir}/**/*" />
+       <include name="utils/**/*" />
+       <include name="${docDir}/**/*" />
+       <include name="examples/**/*" />
+     </tarfileset>
+   </tar>
+ </target>
+ <target name="pubapplet" description="installs the jalviewLite applet and dependent jars into an applet examples directory built under ${outputDir}" depends="makeApplet">
+   <copy todir="${packageDir}/examples">
+     <fileset dir="examples">
+       <include name="**/*"/>
+       <include name="javascript/*"/>
        <include name="jmol/*"/>
-         </fileset>
-               <fileset dir=".">
-         <include name="${jalviewLiteJar}" />
-                       </fileset>
-               <fileset dir="appletlib">
-                     <include name="**/*"/>
-                       </fileset>
-         </copy>
-           <jar update="true" index="true" jarfile="${packageDir}/examples/${jalviewLiteJar}"/>
-           <jar update="true" index="true" jarfile="${packageDir}/examples/${jmolJar}">
-               <manifest>
-               <attribute name="Application-Name" value="Jmol (bundled with JalviewLite)"/>
-               <!--          <attribute name="Permissions" value="sandbox" /> -->
-               <!--<attribute name="Trusted-Lib" value="true" /> -->
-               <attribute name="Codebase" value="${applet.codebase}"/>
-               <attribute name="Caller-Allowable-Codebase" value="${applet.caller-codebase}"/>
-                 </manifest>
-               </jar>
-     <signjar sigalg="SHA1WithRSA" storepass="${jalview.keystore.pass}" keypass="${jalview.key.pass}" keystore="${jalview.keystore}" alias="${jalview.key}" lazy="false" verbose="false">
-       <fileset dir="${packageDir}/examples">
-         <include name="*.jar" />
-       </fileset>
-     </signjar>
-     <presetdef name="ap_applet.jar">
-       <!-- build a signed applet with 'all-permissions' - 
+     </fileset>
+     <fileset dir=".">
+       <include name="${jalviewLiteJar}" />
+     </fileset>
+     <fileset dir="appletlib">
+       <include name="**/*"/>
+     </fileset>
+   </copy>
+   <jar update="true" index="true" jarfile="${packageDir}/examples/${jalviewLiteJar}"/>
+   <jar update="true" index="true" jarfile="${packageDir}/examples/${jmolJar}">
+     <manifest>
+       <attribute name="Application-Name" value="Jmol (bundled with JalviewLite)"/>
+       <!--          <attribute name="Permissions" value="sandbox" /> -->
+       <!--<attribute name="Trusted-Lib" value="true" /> -->
+       <attribute name="Codebase" value="${applet.codebase}"/>
+       <attribute name="Caller-Allowable-Codebase" value="${applet.caller-codebase}"/>
+     </manifest>
+   </jar>
+   <signjar sigalg="SHA1WithRSA" storepass="${jalview.keystore.pass}" keypass="${jalview.key.pass}" keystore="${jalview.keystore}" alias="${jalview.key}" lazy="false" verbose="false">
+     <fileset dir="${packageDir}/examples">
+       <include name="*.jar" />
+     </fileset>
+   </signjar>
+   <presetdef name="ap_applet.jar">
+     <!-- build a signed applet with 'all-permissions' - 
                          Needs 'param name="permissions' value="all-permissions"' in applet tag
                          JalviewLite+JmolApplet linked sequence/structure fails
                          Mixed code warnings are raised
                          -->
-       <jar update="true" index="true">
-         <manifest>
-           <attribute name="Application-Name" value="JalviewLite" />
-           <attribute name="Permissions" value="all-permissions" />
-           <attribute name="Codebase" value="${applet.codebase}" />
-           <attribute name="Caller-Allowable-Codebase" value="${applet.caller-codebase}" />
-           <attribute name="Application-Library-Allowable-Codebase" value="${applet.codebase}" />
-         </manifest>
-       </jar>
-     </presetdef>
-     <presetdef name="applet.jar">
-       <!-- build signed applet with sandbox permissions -
+     <jar update="true" index="true">
+       <manifest>
+         <attribute name="Application-Name" value="JalviewLite" />
+         <attribute name="Permissions" value="all-permissions" />
+         <attribute name="Codebase" value="${applet.codebase}" />
+         <attribute name="Caller-Allowable-Codebase" value="${applet.caller-codebase}" />
+         <attribute name="Application-Library-Allowable-Codebase" value="${applet.codebase}" />
+       </manifest>
+     </jar>
+   </presetdef>
+   <presetdef name="applet.jar">
+     <!-- build signed applet with sandbox permissions -
                          Needs 'param name="permissions' value="sandbox"' in applet tag
                         Preserves Pre-Java 1.7_u45 behavior once 'permissions' parameter added to applet tag 
                        -->
  
-       <jar update="true" index="true">
-         <manifest>
-           <attribute name="Application-Name" value="JalviewLite" />
-           <attribute name="Permissions" value="sandbox" />
-           <attribute name="Codebase" value="${applet.codebase}" />
-           <attribute name="Caller-Allowable-Codebase" value="${applet.caller-codebase}" />
-           <attribute name="Application-Library-Allowable-Codebase" value="${applet.codebase}" />
-         </manifest>
-       </jar>
-     </presetdef>
-     <presetdef name="tl_applet.jar">
-       <!-- build signed applet with trusted library/trusted permissions -
+     <jar update="true" index="true">
+       <manifest>
+         <attribute name="Application-Name" value="JalviewLite" />
+         <attribute name="Permissions" value="sandbox" />
+         <attribute name="Codebase" value="${applet.codebase}" />
+         <attribute name="Caller-Allowable-Codebase" value="${applet.caller-codebase}" />
+         <attribute name="Application-Library-Allowable-Codebase" value="${applet.codebase}" />
+       </manifest>
+     </jar>
+   </presetdef>
+   <presetdef name="tl_applet.jar">
+     <!-- build signed applet with trusted library/trusted permissions -
                                Needs 'param name="permissions' value="all-permissions"' in applet tag
                               j1.7_45:
                               No mixed code warnings raised 
                               
                              -->
  
-       <jar update="true" index="true">
-         <manifest>
-           <attribute name="Application-Name" value="JalviewLite" />
-           <attribute name="Permissions" value="all-permissions" />
-           <attribute name="Codebase" value="${applet.codebase}" />
-           <attribute name="Trusted-Only" value="true" />
-           <attribute name="Trusted-Library" value="true" />
-         </manifest>
-       </jar>
-     </presetdef>
-     <presetdef name="to_applet.jar">
-       <!-- not fully test variant (yet) -->
-       <jar update="true" index="true">
-         <manifest>
-           <attribute name="Application-Name" value="JalviewLite" />
-           <attribute name="Permissions" value="all-permissions" />
-           <attribute name="Codebase" value="${applet.codebase}" />
-           <attribute name="Trusted-Only" value="true" />
-         </manifest>
-       </jar>
-     </presetdef>
-     <!-- create differently privileged artefacts -->
-     <copy file="${packageDir}/examples/${jalviewLiteJar}" tofile="${packageDir}/examples/u_${jalviewLiteJar}" />
-     <copy file="${packageDir}/examples/${jmolJar}" tofile="${packageDir}/examples/u_${jmolJar}" overwrite="true"/>
-     <copy file="${packageDir}/examples/${jalviewLiteJar}" tofile="${packageDir}/examples/ap_${jalviewLiteJar}" />
-     <copy file="${packageDir}/examples/${jmolJar}" tofile="${packageDir}/examples/ap_${jmolJar}"/>
-     <ap_applet.jar jarfile="${packageDir}/examples/ap_${jalviewLiteJar}" />
-     <ap_applet.jar jarfile="${packageDir}/examples/ap_${jmolJar}" />
-     <copy file="${packageDir}/examples/${jalviewLiteJar}" tofile="${packageDir}/examples/tl_${jalviewLiteJar}" />
-     <copy file="${packageDir}/examples/${jmolJar}" tofile="${packageDir}/examples/tl_${jmolJar}" />
-     <tl_applet.jar jarfile="${packageDir}/examples/tl_${jalviewLiteJar}" />
-     <tl_applet.jar jarfile="${packageDir}/examples/tl_${jmolJar}" />
-     <copy file="${packageDir}/examples/${jalviewLiteJar}" tofile="${packageDir}/examples/to_${jalviewLiteJar}" />
-     <copy file="${packageDir}/examples/${jmolJar}" tofile="${packageDir}/examples/to_${jmolJar}" />
-     <to_applet.jar jarfile="${packageDir}/examples/to_${jalviewLiteJar}" />
-     <to_applet.jar jarfile="${packageDir}/examples/to_${jmolJar}" />
-     <!-- finally, create manifest for original jars -->
-     <applet.jar jarfile="${packageDir}/examples/${jalviewLiteJar}" />
-     <applet.jar jarfile="${packageDir}/examples/${jmolJar}" />
-     <!-- todo - write examples/downloads for alternate versions of the applet -->
-     <signjar storepass="${jalview.keystore.pass}" keypass="${jalview.key.pass}" keystore="${jalview.keystore}" alias="${jalview.key}" lazy="false" verbose="false">
-       <fileset dir="${packageDir}/examples">
-         <exclude name="u_*.jar"/>
-         <include name="${jalviewLiteJar}" />
-         <include name="${jmolJar}" />
-         <include name="to_${jalviewLiteJar}" />
-         <include name="to_${jmolJar}" />
-         <include name="tl_${jalviewLiteJar}" />
-         <include name="tl_${jmolJar}" />
-         <include name="ap_${jalviewLiteJar}" />
-         <include name="ap_${jmolJar}" />
-       </fileset>
-     </signjar>
-     <!-- bizarre bug causes JmolApplet to always get signed, even if excluded from above. so copy explicitly -->
-     <copy file="appletlib/${jmolJar}" tofile="${packageDir}/examples/u_${jmolJar}" overwrite="true" />
-   </target>
-   <target name="sourcedoc" description="Create jalview source documentation pages" depends="init">
-     <javadoc destdir="${javadocDir}">
-       <packageset dir="${sourceDir}" includes="jalview/*,MCView/*">
-       </packageset>
-     </javadoc>
-   </target>
+     <jar update="true" index="true">
+       <manifest>
+         <attribute name="Application-Name" value="JalviewLite" />
+         <attribute name="Permissions" value="all-permissions" />
+         <attribute name="Codebase" value="${applet.codebase}" />
+         <attribute name="Trusted-Only" value="true" />
+         <attribute name="Trusted-Library" value="true" />
+       </manifest>
+     </jar>
+   </presetdef>
+   <presetdef name="to_applet.jar">
+     <!-- not fully test variant (yet) -->
+     <jar update="true" index="true">
+       <manifest>
+         <attribute name="Application-Name" value="JalviewLite" />
+         <attribute name="Permissions" value="all-permissions" />
+         <attribute name="Codebase" value="${applet.codebase}" />
+         <attribute name="Trusted-Only" value="true" />
+       </manifest>
+     </jar>
+   </presetdef>
+   <!-- create differently privileged artefacts -->
+   <copy file="${packageDir}/examples/${jalviewLiteJar}" tofile="${packageDir}/examples/u_${jalviewLiteJar}" />
+   <copy file="${packageDir}/examples/${jmolJar}" tofile="${packageDir}/examples/u_${jmolJar}" overwrite="true"/>
+   <copy file="${packageDir}/examples/${jalviewLiteJar}" tofile="${packageDir}/examples/ap_${jalviewLiteJar}" />
+   <copy file="${packageDir}/examples/${jmolJar}" tofile="${packageDir}/examples/ap_${jmolJar}"/>
+   <ap_applet.jar jarfile="${packageDir}/examples/ap_${jalviewLiteJar}" />
+   <ap_applet.jar jarfile="${packageDir}/examples/ap_${jmolJar}" />
+   <copy file="${packageDir}/examples/${jalviewLiteJar}" tofile="${packageDir}/examples/tl_${jalviewLiteJar}" />
+   <copy file="${packageDir}/examples/${jmolJar}" tofile="${packageDir}/examples/tl_${jmolJar}" />
+   <tl_applet.jar jarfile="${packageDir}/examples/tl_${jalviewLiteJar}" />
+   <tl_applet.jar jarfile="${packageDir}/examples/tl_${jmolJar}" />
+   <copy file="${packageDir}/examples/${jalviewLiteJar}" tofile="${packageDir}/examples/to_${jalviewLiteJar}" />
+   <copy file="${packageDir}/examples/${jmolJar}" tofile="${packageDir}/examples/to_${jmolJar}" />
+   <to_applet.jar jarfile="${packageDir}/examples/to_${jalviewLiteJar}" />
+   <to_applet.jar jarfile="${packageDir}/examples/to_${jmolJar}" />
+   <!-- finally, create manifest for original jars -->
+   <applet.jar jarfile="${packageDir}/examples/${jalviewLiteJar}" />
+   <applet.jar jarfile="${packageDir}/examples/${jmolJar}" />
+   <!-- todo - write examples/downloads for alternate versions of the applet -->
+   <signjar storepass="${jalview.keystore.pass}" keypass="${jalview.key.pass}" keystore="${jalview.keystore}" alias="${jalview.key}" lazy="false" verbose="false">
+     <fileset dir="${packageDir}/examples">
+       <exclude name="u_*.jar"/>
+       <include name="${jalviewLiteJar}" />
+       <include name="${jmolJar}" />
+       <include name="to_${jalviewLiteJar}" />
+       <include name="to_${jmolJar}" />
+       <include name="tl_${jalviewLiteJar}" />
+       <include name="tl_${jmolJar}" />
+       <include name="ap_${jalviewLiteJar}" />
+       <include name="ap_${jmolJar}" />
+     </fileset>
+   </signjar>
+   <!-- bizarre bug causes JmolApplet to always get signed, even if excluded from above. so copy explicitly -->
+   <copy file="appletlib/${jmolJar}" tofile="${packageDir}/examples/u_${jmolJar}" overwrite="true" />
+ </target>
+ <target name="sourcedoc" description="Create jalview source documentation pages" depends="init">
+   <javadoc destdir="${javadocDir}">
+     <packageset dir="${sourceDir}" includes="jalview/*,MCView/*">
+     </packageset>
+   </javadoc>
+ </target>
  </project>
@@@ -1,5 -1,5 +1,5 @@@
  /*
-  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.1)
   * Copyright (C) 2014 The Jalview Authors
   * 
   * This file is part of Jalview.
@@@ -52,6 -52,7 +52,6 @@@ public class PDBViewer extends JInterna
  
    public PDBViewer(PDBEntry pdbentry, SequenceI[] seq, String[] chains,
            AlignmentPanel ap, String protocol)
 -
    {
      this.pdbentry = pdbentry;
      this.seq = seq;
diff --combined src/MCview/PDBfile.java
@@@ -1,5 -1,5 +1,5 @@@
  /*
-  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.1)
   * Copyright (C) 2014 The Jalview Authors
   * 
   * This file is part of Jalview.
@@@ -23,7 -23,6 +23,7 @@@ import java.util.*
  
  import java.awt.*;
  
 +import jalview.analysis.AlignSeq;
  import jalview.datamodel.*;
  import jalview.io.FileParse;
  
@@@ -59,7 -58,7 +59,7 @@@ public class PDBfile extends jalview.io
      id = safeName(getDataName());
  
      chains = new Vector();
 -
 +    ArrayList<SequenceI> rna=new ArrayList<SequenceI>(), prot=new ArrayList<SequenceI>();
      PDBChain tmpchain;
      String line = null;
      boolean modelFlag = false;
          dataset.setName(id + "|" + dataset.getName());
          PDBEntry entry = new PDBEntry();
          entry.setId(id);
 +        entry.setProperty(new Hashtable());
 +        if (((PDBChain)chains.elementAt(i)).id!=null) {
 +          entry.getProperty().put("CHAIN", ((PDBChain)chains.elementAt(i)).id);
 +        }
          if (inFile != null)
          {
            entry.setFile(inFile.getAbsolutePath());
          // maintain reference to
          // dataset
          seqs.addElement(chainseq);
 +       if(isRNA(chainseq)==true)
 +       {
 +         rna.add(chainseq);
 +       } else {
 +         prot.add(chainseq);
 +       }
 +         
          AlignmentAnnotation[] chainannot = chainseq.getAnnotation();
 +        
          if (chainannot != null)
          {
            for (int ai = 0; ai < chainannot.length; ai++)
            {
 +        
              chainannot[ai].visible = VisibleChainAnnotation;
              annotations.addElement(chainannot[ai]);
            }
          }
        }
 +      if (rna.size()>0)
 +      try {
 +        processPdbFileWithAnnotate3d(rna);
 +      } catch (Exception x)
 +      {
 +        System.err.println("Exceptions when dealing with RNA in pdb file");
 +        x.printStackTrace();
 +        
 +      };
 +      if (prot.size()>0)
 +      try {
 +        processPdbFileWithJmol(prot);
 +      } catch (Exception x)
 +      {
 +        System.err.println("Exceptions when dealing with RNA in pdb file");
 +        x.printStackTrace();
 +        
 +      };
 +      if (prot.size()>0)
 +      try {
 +        processPdbFileWithJmol(prot);
 +      } catch (Exception x)
 +      {
 +        System.err.println("Exceptions when dealing with RNA in pdb file");
 +        x.printStackTrace();
 +        
 +      };
      } catch (OutOfMemoryError er)
      {
        System.out.println("OUT OF MEMORY LOADING PDB FILE");
        }
      }
    }
 -
 +  private void processPdbFileWithJmol(ArrayList<SequenceI> prot) throws Exception
 +  {
 +    try {
 +      Class cl = Class.forName("jalview.ext.jmol.PDBFileWithJmol");
 +      if (cl!=null)
 +      {
 +        Object jmf = cl.getConstructor(new Class[] {FileParse.class}).newInstance(new Object[] {new FileParse(getDataName(),type)});
 +        Alignment al = new Alignment((SequenceI[]) cl.getMethod("getSeqsAsArray", new Class[] {}).invoke(jmf));
 +        cl.getMethod("addAnnotations",new Class[] {Alignment.class}).invoke(jmf, al);
 +        replaceMatchingSeqsWith(prot, al, AlignSeq.PEP);
 +      }
 +    } catch (ClassNotFoundException q)
 +    {}
 +  }
 +  private void processPdbFileWithAnnotate3d(ArrayList<SequenceI> rna) throws Exception {
 +//    System.out.println("this is a PDB format and RNA sequence");
 +    // note: we use reflection here so that the applet can compile and run without the HTTPClient bits and pieces needed for accessing Annotate3D web service
 +    try {
 +    Class cl = Class.forName("jalview.ws.jws1.Annotate3D");
 +    if (cl!=null)
 +    {
 +      // TODO: use the PDB ID of the structure if one is available, to save bandwidth and avoid uploading the whole structure to the service
 +      Object annotate3d = cl.getConstructor(new Class[] {}).newInstance(new Object[] {});
 +      AlignmentI al = ((AlignmentI) cl.getMethod("getRNAMLFor", new Class[] { FileParse.class}).invoke(annotate3d, new Object[] { new FileParse(getDataName(),type)}));
 +      replaceMatchingSeqsWith(rna, al, AlignSeq.DNA);
 +    }
 +    } catch (ClassNotFoundException x)
 +    {
 +      //ignore classnotfounds - occurs in applet
 +    };
 +  }
 +  private void replaceMatchingSeqsWith(ArrayList<SequenceI> ochains, AlignmentI al, String dnaOrProtein)
 +  {
 +    if (al!=null && al.getHeight()>0)
 +    {
 +      ArrayList<SequenceI> matches=new ArrayList<SequenceI>();
 +      ArrayList<AlignSeq> aligns=new ArrayList<AlignSeq>();
 +      
 +      for (SequenceI sq:ochains)
 +      {
 +        SequenceI bestm=null;
 +        AlignSeq bestaseq=null;
 +        int bestscore=0;
 +        for (SequenceI msq:al.getSequences())
 +        {
 +          AlignSeq aseq = AlignSeq.doGlobalNWAlignment(msq, sq, dnaOrProtein);
 +          if (bestm==null || aseq.getMaxScore()>bestscore)
 +          {
 +            bestscore=aseq.getMaxScore();
 +            bestaseq= aseq;
 +            bestm=msq;
 +          }
 +        }
 +        System.out.println("Best Score for "+(matches.size()+1)+" :"+bestscore);
 +        matches.add(bestm);
 +        aligns.add(bestaseq);
 +        al.deleteSequence(bestm);
 +      }
 +      for (int p=0,pSize=seqs.size();p<pSize;p++)
 +      {
 +        SequenceI sq,sp=seqs.get(p);
 +        int q;
 +        if ((q=ochains.indexOf(sp))>-1)
 +        {
 +          seqs.set(p, sq=matches.get(q));
 +          sq.setName(sp.getName());
 +          sq.setDescription(sp.getDescription());
 +          sq.transferAnnotation(sp, aligns.get(q).getMappingFromS1(false));
 +          int inspos=-1;
 +          for (int ap=0;ap<annotations.size();)
 +          {
 +            if (((AlignmentAnnotation)annotations.get(ap)).sequenceRef==sp) {
 +              if (inspos==-1)
 +              {
 +                inspos=ap;
 +              }
 +              annotations.remove(ap);
 +            } else {
 +              ap++;
 +            }
 +          }
 +          if (sq.getAnnotation()!=null) {
 +            annotations.addAll(inspos, Arrays.asList(sq.getAnnotation()));
 +          }
 +        }
 +      }
 +    }
 +  }
    /**
     * make a friendly ID string.
     * 
                1.0f / (float) i, .4f, 1.0f));
      }
    }
 +  public boolean isRNA(SequenceI seqs)
 +  {
 +        for (int i=0;i<seqs.getLength();i++){
 +                if((seqs.getCharAt(i)!='A') &&(seqs.getCharAt(i)!='C')&&(seqs.getCharAt(i)!='G')&&(seqs.getCharAt(i)!='U'))
 +                {
 +                        return false;
 +                }
 +        }
 +       
 +                return true;
 +        
 +        
 +  }
  }
@@@ -1,5 -1,5 +1,5 @@@
  /*
-  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.1)
   * Copyright (C) 2014 The Jalview Authors
   * 
   * This file is part of Jalview.
@@@ -17,6 -17,7 +17,6 @@@
   * The Jalview Authors are detailed in the 'AUTHORS' file.
   */
  package jalview.analysis;
 -
  import java.util.*;
  
  import java.awt.*;
@@@ -267,11 -268,16 +267,11 @@@ public class AlignSe
    }
  
    /**
 -   * DOCUMENT ME!
 -   * 
 -   * @param s1
 -   *          DOCUMENT ME!
 -   * @param string1
 -   *          - string to align for sequence1
 -   * @param s2
 -   *          sequence 2
 -   * @param string2
 -   *          - string to align for sequence2
 +   * Construct score matrix for sequences with standard DNA or PEPTIDE matrix
 +   * @param s1 - sequence 1
 +   * @param string1 - string to use for s1
 +   * @param s2 - sequence 2
 +   * @param string2 - string to use for s2
     * @param type
     *          DNA or PEPTIDE
     */
      SeqInit(string1, string2);
    }
  
 +  /**
 +   * Construct score matrix for sequences with custom substitution matrix
 +   * @param s1 - sequence 1
 +   * @param string1 - string to use for s1
 +   * @param s2 - sequence 2
 +   * @param string2 - string to use for s2
 +   * @param scoreMatrix - substitution matrix to use for alignment
 +   */
    public void SeqInit(SequenceI s1, String string1, SequenceI s2,
            String string2, ScoreMatrix scoreMatrix)
    {
     * construct score matrix for string1 and string2 (after removing any existing
     * gaps
     * 
 -   * @param string1
 +   * @param string1 
     * @param string2
     */
    private void SeqInit(String string1, String string2)
    }
  
    /**
 +   * Compute a globally optimal needleman and wunsch alignment between two
 +   * sequences
 +   * 
 +   * @param s1
 +   * @param s2
 +   * @param type
 +   *          AlignSeq.DNA or AlignSeq.PEP
 +   */
 +  public static AlignSeq doGlobalNWAlignment(SequenceI s1, SequenceI s2,
 +          String type)
 +  {
 +    AlignSeq as = new AlignSeq(s1, s2, type);
 +
 +    as.calcScoreMatrix();
 +    as.traceAlignment();
 +    return as;
 +  }
 +
 +  /**
 +   * 
 +   * @return mapping from positions in S1 to corresponding positions in S2
 +   */
 +  public jalview.datamodel.Mapping getMappingFromS1(boolean allowmismatch)
 +  {
 +    ArrayList<Integer> as1 = new ArrayList<Integer>(), as2 = new ArrayList<Integer>();
 +    int pdbpos = s2.getStart() + getSeq2Start() - 2;
 +    int alignpos = s1.getStart() + getSeq1Start() - 2;
 +    int lp2 = pdbpos - 3, lp1 = alignpos - 3;
 +    boolean lastmatch = false;
 +    // and now trace the alignment onto the atom set.
 +    for (int i = 0; i < astr1.length(); i++)
 +    {
 +      char c1 = astr1.charAt(i), c2 = astr2.charAt(i);
 +      if (c1 != '-')
 +      {
 +        alignpos++;
 +      }
 +
 +      if (c2 != '-')
 +      {
 +        pdbpos++;
 +      }
 +
 +      if (allowmismatch || c1 == c2)
 +      {
 +        lastmatch = true;
 +        // extend mapping interval.
 +        if (lp1 + 1 != alignpos || lp2+1 !=pdbpos)
 +        {
 +          as1.add(Integer.valueOf(alignpos));
 +          as2.add(Integer.valueOf(pdbpos));
 +        }
 +        lp1 = alignpos;
 +        lp2 = pdbpos;
 +      }
 +      else
 +      {
 +        lastmatch = false;
 +      }
 +    }
 +    // construct range pairs
 +    int[] mapseq1 = new int[as1.size() + (lastmatch ? 1 : 0)], mapseq2 = new int[as2
 +            .size() + (lastmatch ? 1 : 0)];
 +    int i = 0;
 +    for (Integer ip : as1)
 +    {
 +      mapseq1[i++] = ip;
 +    }
 +    ;
 +    i = 0;
 +    for (Integer ip : as2)
 +    {
 +      mapseq2[i++] = ip;
 +    }
 +    ;
 +    if (lastmatch)
 +    {
 +      mapseq1[mapseq1.length - 1] = alignpos;
 +      mapseq2[mapseq2.length - 1] = pdbpos;
 +    }
 +    MapList map = new MapList(mapseq1, mapseq2, 1, 1);
 +
 +    jalview.datamodel.Mapping mapping = new Mapping(map);
 +    mapping.setTo(s2);
 +    return mapping;
 +  }
 +
 +  /**
     * compute the PID vector used by the redundancy filter.
     * 
     * @param originalSequences
@@@ -1,5 -1,5 +1,5 @@@
  /*
-  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.1)
   * Copyright (C) 2014 The Jalview Authors
   * 
   * This file is part of Jalview.
   */
  /* Author: Lauren Michelle Lui 
   * Methods are based on RALEE methods http://personalpages.manchester.ac.uk/staff/sam.griffiths-jones/software/ralee/
 + * Additional Author: Jan Engelhart (2011) - Structure consensus and bug fixing
 + * Additional Author: Anne Menard (2012) - Pseudoknot support and secondary structure consensus
   * */
  
  package jalview.analysis;
  
 +
 +import java.util.ArrayList;
 +import java.util.Arrays;
 +import java.util.HashSet;
  import java.util.Hashtable;
  import java.util.Stack;
  import java.util.Vector;
  
 +
 +import jalview.analysis.SecStrConsensus.SimpleBP;
  import jalview.datamodel.SequenceFeature;
  
  public class Rna
  {
 -  static Hashtable<Integer, Integer> pairHash = new Hashtable();
 +      
 +      static Hashtable<Integer, Integer> pairHash = new Hashtable();
 +      
 +  private static final Character[] openingPars = {'(','[','{','<','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'}; 
 +  private static final Character[] closingPars = {')',']','}','>','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; 
 +  
 +  private static HashSet<Character> openingParsSet = new HashSet<Character>(Arrays.asList(openingPars)); 
 +  private static HashSet<Character> closingParsSet = new HashSet<Character>(Arrays.asList(closingPars));
 +  private static Hashtable<Character,Character> closingToOpening = new Hashtable<Character,Character>()
 +  // Initializing final data structure
 +  {
 +      private static final long serialVersionUID = 1L;
 +      {
 +        for(int i=0;i<openingPars.length;i++)
 +        {
 +                System.out.println(closingPars[i]+"->"+openingPars[i]);
 +                put(closingPars[i],openingPars[i]);             
 +        }
 +  }};
 +      
 +  private static boolean isOpeningParenthesis(char c)
 +  {
 +        return openingParsSet.contains(c);
 +  }
 +      
 +  private static boolean isClosingParenthesis(char c)
 +  {
 +        return closingParsSet.contains(c);
 +  }
  
 +  private static char matchingOpeningParenthesis(char closingParenthesis) throws WUSSParseException
 +  {
 +        if (!isClosingParenthesis(closingParenthesis))
 +        {
 +                throw new WUSSParseException("Querying matching opening parenthesis for non-closing parenthesis character "+closingParenthesis, -1);
 +        }
 +      
 +        return closingToOpening.get(closingParenthesis);
 +  }
 +  
    /**
     * Based off of RALEE code ralee-get-base-pairs. Keeps track of open bracket
     * positions in "stack" vector. When a close bracket is reached, pair this
     * @return Array of SequenceFeature; type = RNA helix, begin is open base
     *         pair, end is close base pair
     */
 -  public static SequenceFeature[] GetBasePairs(CharSequence line)
 -          throws WUSSParseException
 +  public static Vector<SimpleBP> GetSimpleBPs(CharSequence line) throws WUSSParseException
    {
 -    Stack stack = new Stack();
 -    Vector pairs = new Vector();
 -
 +    System.out.println(line);
 +      Hashtable<Character,Stack<Integer>> stacks = new Hashtable<Character,Stack<Integer>>();
 +    Vector<SimpleBP> pairs = new Vector<SimpleBP>();
      int i = 0;
      while (i < line.length())
      {
        char base = line.charAt(i);
 -
 -      if ((base == '<') || (base == '(') || (base == '{') || (base == '['))
 +     
 +      if (isOpeningParenthesis(base))
        {
 -        stack.push(i);
 +        if (!stacks.containsKey(base)){
 +                stacks.put(base, new Stack<Integer>());
 +        }
 +        stacks.get(base).push(i);
 +       
        }
 -      else if ((base == '>') || (base == ')') || (base == '}')
 -              || (base == ']'))
 +      else if (isClosingParenthesis(base))
        {
 -
 +      
 +        char opening = matchingOpeningParenthesis(base);
 +        
 +        if (!stacks.containsKey(opening)){
 +                throw new WUSSParseException("Mismatched (unseen) closing character "+base, i);
 +        }
 +        
 +       Stack<Integer> stack = stacks.get(opening);
          if (stack.isEmpty())
          {
            // error whilst parsing i'th position. pass back
 -          throw new WUSSParseException("Mismatched closing bracket", i);
 +                throw new WUSSParseException("Mismatched closing character "+base, i);
          }
 -        Object temp = stack.pop();
 -        pairs.addElement(temp);
 -        pairs.addElement(i);
 +        int temp = stack.pop();
 +        
 +        pairs.add(new SimpleBP(temp,i));
        }
 -
        i++;
      }
 -
 -    int numpairs = pairs.size() / 2;
 -    SequenceFeature[] outPairs = new SequenceFeature[numpairs];
 -
 -    // Convert pairs to array
 -    for (int p = 0; p < pairs.size(); p += 2)
 +    for(char opening: stacks.keySet())
      {
 -      int begin = Integer.parseInt(pairs.elementAt(p).toString());
 -      int end = Integer.parseInt(pairs.elementAt(p + 1).toString());
 -
 -      outPairs[p / 2] = new SequenceFeature("RNA helix", "", "", begin,
 -              end, "");
 -      // pairHash.put(begin, end);
 -
 +      Stack<Integer> stack = stacks.get(opening);
 +      if (!stack.empty())
 +      {
 +                throw new WUSSParseException("Mismatched opening character "+opening+" at "+stack.pop(), i);                  
 +      }
 +    }
 +    return pairs;
 +  }
 +  
 +  public static SequenceFeature[] GetBasePairs(CharSequence line) throws WUSSParseException
 +  {
 +        Vector<SimpleBP> bps = GetSimpleBPs(line);
 +        SequenceFeature[] outPairs = new SequenceFeature[bps.size()];
 +    for (int p = 0; p < bps.size(); p++)
 +    {
 +      SimpleBP bp = bps.elementAt(p);
 +      outPairs[p] = new SequenceFeature("RNA helix", "", "", bp.getBP5(),bp.getBP3(), "");
      }
 -
      return outPairs;
    }
 -
 +  
 +  
 +  public static  ArrayList<SimpleBP> GetModeleBP(CharSequence line) throws WUSSParseException
 +  {
 +        Vector<SimpleBP> bps = GetSimpleBPs(line);
 +        return new ArrayList<SimpleBP>(bps);
 +  }
 +  
 +  
    /**
     * Function to get the end position corresponding to a given start position
 -   * 
 -   * @param indice
 -   *          - start position of a base pair
 +   * @param indice - start position of a base pair
     * @return - end position of a base pair
     */
 -  /*
 -   * makes no sense at the moment :( public int findEnd(int indice){ //TODO:
 -   * Probably extend this to find the start to a given end? //could be done by
 -   * putting everything twice to the hash ArrayList<Integer> pair = new
 -   * ArrayList<Integer>(); return pairHash.get(indice); }
 -   */
 +  /*makes no sense at the moment :(
 +  public int findEnd(int indice){
 +        //TODO: Probably extend this to find the start to a given end?
 +        //could be done by putting everything twice to the hash
 +        ArrayList<Integer> pair = new ArrayList<Integer>();
 +        return pairHash.get(indice);
 +  }*/
 +  
  
    /**
     * Figures out which helix each position belongs to and stores the helix
      }
    }
  }
 +
@@@ -1,5 -1,5 +1,5 @@@
  /*
-  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.1)
   * Copyright (C) 2014 The Jalview Authors
   * 
   * This file is part of Jalview.
@@@ -16,7 -16,6 +16,7 @@@
   * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
   * The Jalview Authors are detailed in the 'AUTHORS' file.
   */
 +
  package jalview.analysis;
  
  import java.util.*;
@@@ -60,15 -59,11 +60,15 @@@ public class StructureFrequenc
     */
    public static int findPair(SequenceFeature[] pairs, int indice)
    {
 +
      for (int i = 0; i < pairs.length; i++)
      {
        if (pairs[i].getBegin() == indice)
 +
        {
 +
          return pairs[i].getEnd();
 +
        }
      }
      return -1;
            int end, Hashtable[] result, boolean profile,
            AlignmentAnnotation rnaStruc)
    {
 +
      Hashtable residueHash;
      String maxResidue;
 -    char[] seq, struc = rnaStruc.getRNAStruc().toCharArray();
 +    char[] struc = rnaStruc.getRNAStruc().toCharArray();
 +
      SequenceFeature[] rna = rnaStruc._rnasecstr;
      char c, s, cEnd;
 -    int count, nonGap = 0, i, bpEnd = -1, j, jSize = sequences.length;
 +    int count = 0, nonGap = 0, i, bpEnd = -1, j, jSize = sequences.length;
      int[] values;
      int[][] pairs;
      float percentage;
 -
 +    boolean wooble = true;
      for (i = start; i < end; i++) // foreach column
      {
        residueHash = new Hashtable();
        values = new int[255];
        pairs = new int[255][255];
        bpEnd = -1;
 +      // System.out.println("s="+struc[i]);
        if (i < struc.length)
        {
          s = struc[i];
 +
        }
        else
        {
          s = '-';
        }
  
 -      if (s != '(')
 +      if (s != '(' && s != '[')
        {
          if (s == '-')
          {
        }
        else
        {
 +
          bpEnd = findPair(rna, i);
 +
          if (bpEnd > -1)
          {
            for (j = 0; j < jSize; j++) // foreach row
                continue;
              }
              c = sequences[j].getCharAt(i);
 +            // System.out.println("c="+c);
 +
 +            // standard representation for gaps in sequence and structure
 +            if (c == '.' || c == ' ')
              {
 +              c = '-';
 +            }
  
 -              // standard representation for gaps in sequence and structure
 -              if (c == '.' || c == ' ')
 -              {
 -                c = '-';
 -              }
 -
 -              if (c == '-')
 -              {
 -                values['-']++;
 -                continue;
 -              }
 -              cEnd = sequences[j].getCharAt(bpEnd);
 -              if (checkBpType(c, cEnd))
 -              {
 -                values['(']++; // H means it's a helix (structured)
 -              }
 -              pairs[c][cEnd]++;
 +            if (c == '-')
 +            {
 +              values['-']++;
 +              continue;
 +            }
 +            cEnd = sequences[j].getCharAt(bpEnd);
  
 +            // System.out.println("pairs ="+c+","+cEnd);
 +            if (checkBpType(c, cEnd) == true)
 +            {
 +              values['(']++; // H means it's a helix (structured)
                maxResidue = "(";
 +              wooble = true;
 +              // System.out.println("It's a pair wc");
 +
              }
 +            if (checkBpType(c, cEnd) == false)
 +            {
 +              wooble = false;
 +              values['[']++; // H means it's a helix (structured)
 +              maxResidue = "[";
 +
 +            }
 +            pairs[c][cEnd]++;
 +
            }
          }
          // nonGap++;
  
          residueHash.put(PAIRPROFILE, pairs);
        }
 -
 -      count = values['('];
 -
 +      if (wooble == true)
 +      {
 +        count = values['('];
 +      }
 +      if (wooble == false)
 +      {
 +        count = values['['];
 +      }
        residueHash.put(MAXCOUNT, new Integer(count));
        residueHash.put(MAXRESIDUE, maxResidue);
  
        if (bpEnd > 0)
        {
          values[')'] = values['('];
 +        values[']'] = values['['];
          values['('] = 0;
 -
 +        values['['] = 0;
          residueHash = new Hashtable();
 -        maxResidue = ")";
 -
 +        if (wooble == true)
 +        {
 +          // System.out.println(maxResidue+","+wooble);
 +          maxResidue = ")";
 +        }
 +        if (wooble == false)
 +        {
 +          // System.out.println(maxResidue+","+wooble);
 +          maxResidue = "]";
 +        }
          if (profile)
          {
            residueHash.put(PROFILE, new int[][]
          residueHash.put(PID_GAPS, new Float(percentage));
  
          result[bpEnd] = residueHash;
 +
        }
      }
    }
@@@ -1,5 -1,5 +1,5 @@@
  /*
-  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.1)
   * Copyright (C) 2014 The Jalview Authors
   * 
   * This file is part of Jalview.
@@@ -53,7 -53,6 +53,7 @@@ import jalview.schemes.NucleotideColour
  import jalview.schemes.PIDColourScheme;
  import jalview.schemes.PurinePyrimidineColourScheme;
  import jalview.schemes.RNAHelicesColourChooser;
 +import jalview.schemes.RNAInteractionColourScheme;\r
  import jalview.schemes.ResidueProperties;
  import jalview.schemes.StrandColourScheme;
  import jalview.schemes.TCoffeeColourScheme;
@@@ -1046,10 -1045,6 +1046,10 @@@ public class AlignFrame extends Embmenu
      {
        changeColour(new PurinePyrimidineColourScheme());
      }
 +    else if (source == RNAInteractionColour)\r
 +    {\r
 +      changeColour(new RNAInteractionColourScheme());\r
 +    }\r
      else if (source == RNAHelixColour)
      {
        new RNAHelicesColourChooser(viewport, alignPanel);
  
    MenuItem purinePyrimidineColour = new MenuItem();
  
 +  MenuItem RNAInteractionColour = new MenuItem();\r
 +\r
    MenuItem RNAHelixColour = new MenuItem();
  
    MenuItem userDefinedColour = new MenuItem();
      buriedColour.addActionListener(this);
      purinePyrimidineColour.setLabel(MessageManager.getString("label.purine_pyrimidine"));
      purinePyrimidineColour.addActionListener(this);
 +    RNAInteractionColour.setLabel(MessageManager.getString("label.rna_interaction"));\r
 +    RNAInteractionColour.addActionListener(this);\r
      RNAHelixColour.setLabel(MessageManager.getString("action.by_rna_helixes"));
      RNAHelixColour.addActionListener(this);
      userDefinedColour.setLabel(MessageManager.getString("action.user_defined"));
      colourMenu.add(buriedColour);
      colourMenu.add(nucleotideColour);
      colourMenu.add(purinePyrimidineColour);
 +    //    colourMenu.add(RNAInteractionColour);\r
      colourMenu.add(tcoffeeColour);
      colourMenu.add(userDefinedColour);
      colourMenu.addSeparator();
        fileMenu.remove(closeMenuItem);
        fileMenu.remove(3); // Remove Seperator
        embeddedMenu = makeEmbeddedPopupMenu(alignFrameMenuBar, "Arial",
-               Font.PLAIN, 10, false); // use our own fonts.
+               Font.PLAIN, 11, false); // use our own fonts.
        // and actually add the components to the applet area
        viewport.applet.setLayout(new BorderLayout());
        viewport.applet.add(embeddedMenu, BorderLayout.NORTH);
@@@ -1,5 -1,5 +1,5 @@@
  /*
-  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.1)
   * Copyright (C) 2014 The Jalview Authors
   * 
   * This file is part of Jalview.
   */
  package jalview.bin;
  
 +import java.awt.FlowLayout;
 +import java.awt.Frame;
 +import java.awt.event.ActionEvent;
 +import java.awt.event.ActionListener;
  import java.io.BufferedReader;
  import java.io.File;
  import java.io.FileOutputStream;
@@@ -71,11 -67,6 +71,11 @@@ public class Jalvie
        }
      });
    }
 +  /**
 +   * Put protein=true for get a protein example
 +   */
 +  private static boolean protein=false;
 +
  
    /**
     * main class for Jalview application
      // We'll only open the default file if the desktop is visible.
      // And the user
      // ////////////////////
 +  
 +
 + 
 +    
 +    
 +
 +    
      if (!headless && file == null && vamsasImport == null
 -            && jalview.bin.Cache.getDefault("SHOW_STARTUP_FILE", true))
 +            && jalview.bin.Cache.getDefault("SHOW_STARTUP_FILE", true) && protein == true)
      {
        file = jalview.bin.Cache.getDefault(
                "STARTUP_FILE",
        desktop.setInBatchMode(false);
      }
    }
 -
 +  
 +  
    private static void startUsageStats(final Desktop desktop)
    {
      /**
   * @author Andrew Waterhouse and JBP documented.
   * 
   */
 +
 +class rnabuttonlistener  implements ActionListener{
 +        public void actionPerformed(ActionEvent arg0) {
 +                System.out.println("Good idea ! ");
 +
 +        }
 +}
 +
 +class pbuttonlistener  implements ActionListener{
 +        public void actionPerformed(ActionEvent arg0) {
 +              
 +        
 +        }
 +}
 +
  class ArgsParser
  {
    Vector vargs = null;
@@@ -1073,7 -1041,4 +1073,7 @@@ class FeatureFetche
    {
      return queued == 0 && running == 0;
    }
 +  
 +  
 +  
  };
@@@ -1,5 -1,5 +1,5 @@@
  /*
-  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.1)
   * Copyright (C) 2014 The Jalview Authors
   * 
   * This file is part of Jalview.
  package jalview.datamodel;
  
  import jalview.analysis.Rna;
 +import jalview.analysis.SecStrConsensus.SimpleBP;
 +
  import jalview.analysis.WUSSParseException;
  
 +import java.util.ArrayList;
  import java.util.Enumeration;
  import java.util.Hashtable;
  
 +import fr.orsay.lri.varna.models.rna.RNA;
 +
  /**
   * DOCUMENT ME!
   * 
@@@ -55,10 -50,7 +55,10 @@@ public class AlignmentAnnotatio
  
    /** DOCUMENT ME!! */
    public Annotation[] annotations;
 +  
 +  
  
 +  public ArrayList<SimpleBP> bps=null;
    /**
     * RNA secondary structure contact positions
     */
     */
    private void _updateRnaSecStr(CharSequence RNAannot)
    {
 -    try
 -    {
 -      _rnasecstr = Rna.GetBasePairs(RNAannot);
 -      invalidrnastruc = -1;
 -    } catch (WUSSParseException px)
 +    try {
 +    _rnasecstr = Rna.GetBasePairs(RNAannot);
 +    bps = Rna.GetModeleBP(RNAannot);
 +    invalidrnastruc=-1;
 +    }
 +    catch (WUSSParseException px)
      {
 -      invalidrnastruc = px.getProblemPos();
 +      // DEBUG System.out.println(px);
 +      invalidrnastruc=px.getProblemPos();
      }
      if (invalidrnastruc > -1)
      {
        return NO_GRAPH;
      }
    }
 -
 +    // JBPNote: what does this do ?
 +  public void ConcenStru(CharSequence RNAannot) throws WUSSParseException
 +  {
 +        bps = Rna.GetModeleBP(RNAannot);
 +  }
    /**
     * Creates a new AlignmentAnnotation object.
     * 
        else
        // Check for RNA secondary structure
        {
 -        if (annotations[i].secondaryStructure == 'S')
 +        //System.out.println(annotations[i].secondaryStructure);
 +        if (annotations[i].secondaryStructure == '('
 +                      || annotations[i].secondaryStructure == '['
 +                      || annotations[i].secondaryStructure == '<'
 +                      || annotations[i].secondaryStructure == '{'
 +                      || annotations[i].secondaryStructure == 'A'
 +                      || annotations[i].secondaryStructure == 'B'
 +                      || annotations[i].secondaryStructure == 'C'
 +                      || annotations[i].secondaryStructure == 'D'
 +                      || annotations[i].secondaryStructure == 'E'
 +                      || annotations[i].secondaryStructure == 'F'
 +                      || annotations[i].secondaryStructure == 'G'
 +                      || annotations[i].secondaryStructure == 'H'
 +                      || annotations[i].secondaryStructure == 'I'
 +                      || annotations[i].secondaryStructure == 'J'
 +                      || annotations[i].secondaryStructure == 'K'
 +                      || annotations[i].secondaryStructure == 'L'
 +                      || annotations[i].secondaryStructure == 'M'
 +                      || annotations[i].secondaryStructure == 'N'
 +                      || annotations[i].secondaryStructure == 'O'
 +                      || annotations[i].secondaryStructure == 'P'
 +                      || annotations[i].secondaryStructure == 'Q'
 +                      || annotations[i].secondaryStructure == 'R'
 +                      || annotations[i].secondaryStructure == 'S'
 +                      || annotations[i].secondaryStructure == 'T'
 +                      || annotations[i].secondaryStructure == 'U'
 +                      || annotations[i].secondaryStructure == 'V'
 +                      || annotations[i].secondaryStructure == 'W'
 +                      || annotations[i].secondaryStructure == 'X'
 +                      || annotations[i].secondaryStructure == 'Y'
 +                      || annotations[i].secondaryStructure == 'Z')
          {
            hasIcons |= true;
            isrna |= true;
                  // &&
                  // annotations[i].displayCharacter.charAt(0)==annotations[i].secondaryStructure
                  firstChar != ' '
 -                && firstChar != 'H'
 +                && firstChar != '$'
 +                && firstChar != 'µ' // JBPNote should explicitly express as unicode number to avoid source code translation problems
 +                && firstChar != '('
 +                && firstChar != '['
 +                && firstChar != '>'
 +                && firstChar != '{'
 +                && firstChar != 'A'
 +                && firstChar != 'B'
 +                && firstChar != 'C'
 +                && firstChar != 'D'
                  && firstChar != 'E'
 +                && firstChar != 'F'
 +                && firstChar != 'G'
 +                && firstChar != 'H'
 +                && firstChar != 'I'
 +                && firstChar != 'J'
 +                && firstChar != 'K'
 +                && firstChar != 'L'
 +                && firstChar != 'M'
 +                && firstChar != 'N'
 +                && firstChar != 'O'
 +                && firstChar != 'P'
 +                && firstChar != 'Q'
 +                && firstChar != 'R'
                  && firstChar != 'S'
 +                && firstChar != 'T'
 +                && firstChar != 'U'
 +                && firstChar != 'V'
 +                && firstChar != 'W'
 +                && firstChar != 'X'
 +                && firstChar != 'Y'
 +                && firstChar != 'Z'
                  && firstChar != '-'
                  && firstChar < jalview.schemes.ResidueProperties.aaIndex.length)
          {
        {
          if (annotations[i] != null)
          {
 -          annotations[i].displayCharacter = "";
 +          annotations[i].displayCharacter = "X";
          }
        }
      }
        {
          if (annotations[i] == null)
            annotations[i] = new Annotation(String.valueOf(gapchar), null,
 -                  ' ', 0f);
 +                  ' ', 0f,null);
          else if (annotations[i].displayCharacter == null
                  || annotations[i].displayCharacter.equals(" "))
            annotations[i].displayCharacter = String.valueOf(gapchar);
    {
      this.calcId = calcId;
    }
 -
  }
@@@ -1,5 -1,5 +1,5 @@@
  /*
-  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.1)
   * Copyright (C) 2014 The Jalview Authors
   * 
   * This file is part of Jalview.
@@@ -45,7 -45,7 +45,7 @@@ public class Annotatio
  
    /** Score for the position - used in histograms, line graphs and for shading */
    public float value;
 -
 +  
    /** Colour for position */
    public Color colour;
  
@@@ -67,7 -67,6 +67,7 @@@
      description = desc;
      secondaryStructure = ss;
      value = val;
 +    
    }
  
    /**
      secondaryStructure = that.secondaryStructure;
      value = that.value;
      colour = that.colour;
 +
    }
  
    /**
     */
    public Annotation(float val)
    {
 -    this(null, null, ' ', val);
 +    this(null, null, ' ', val,null);
    }
  
    /**
@@@ -1,5 -1,5 +1,5 @@@
  /*
-  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.1)
   * Copyright (C) 2014 The Jalview Authors
   * 
   * This file is part of Jalview.
@@@ -23,8 -23,6 +23,8 @@@ import jalview.analysis.AlignSeq
  import java.util.Enumeration;
  import java.util.Vector;
  
 +import fr.orsay.lri.varna.models.rna.RNA;
 +
  /**
   * 
   * Implements the SequenceI interface for a char[] based sequence object.
@@@ -51,8 -49,6 +51,8 @@@ public class Sequence implements Sequen
    String vamsasId;
  
    DBRefEntry[] dbrefs;
 +  
 +  RNA rna;
  
    /**
     * This annotation is displayed below the alignment but the positions are tied
@@@ -65,7 -61,7 +65,7 @@@
     */
    int index = -1;
  
 -  /** array of seuqence features - may not be null for a valid sequence object */
 +  /** array of sequence features - may not be null for a valid sequence object */
    public SequenceFeature[] sequenceFeatures;
  
    /**
    {
      index = value;
    }
 +  
 +  public void setRNA(RNA r){rna=r;}
 +  
 +  public RNA getRNA() { return rna; }
 +  
  }
@@@ -1,5 -1,5 +1,5 @@@
  /*
-  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.1)
   * Copyright (C) 2014 The Jalview Authors
   * 
   * This file is part of Jalview.
   */
  package jalview.datamodel;
  
 +
  import java.util.Vector;
  
 +import fr.orsay.lri.varna.models.rna.RNA;
 +
  /**
   * DOCUMENT ME!
   * 
@@@ -369,17 -366,5 +369,17 @@@ public interface Sequence
     * @return The index of the sequence in the alignment
     */
    public int getIndex();
 +  
 +  /**
 +   * @return The RNA of the sequence in the alignment
 +   */
 +  
 +  public RNA getRNA();
 + 
 +  /**
 +   * @param rna The RNA.
 +   */
 +  public void setRNA(RNA rna);
 +  
  
  }
@@@ -1,5 -1,5 +1,5 @@@
  /*
-  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.1)
   * Copyright (C) 2014 The Jalview Authors
   * 
   * This file is part of Jalview.
   */
  package jalview.gui;
  
 -import java.util.*;
 +import jalview.bin.Cache;
 +import jalview.datamodel.ColumnSelection;
 +import jalview.datamodel.SequenceGroup;
 +import jalview.datamodel.SequenceI;
 +import jalview.structure.SecondaryStructureListener;
 +import jalview.structure.SelectionListener;
 +import jalview.structure.SelectionSource;
 +import jalview.structure.StructureSelectionManager;
 +import jalview.structure.VamsasSource;
 +import jalview.util.ShiftList;
 +
 +import java.awt.BorderLayout;
 +import java.awt.Color;
 +import java.util.ArrayList;
 +import java.util.Hashtable;
 +import java.util.Map;
  import java.util.regex.Matcher;
  import java.util.regex.Pattern;
 -import java.awt.*;
  
 -import javax.swing.*;
 +import javax.swing.JInternalFrame;
 +import javax.swing.JSplitPane;
  
  import jalview.bin.Cache;
 -import jalview.datamodel.*;
 -import jalview.structure.*;
  import jalview.util.MessageManager;
  import jalview.util.ShiftList;
 +
  import fr.orsay.lri.varna.VARNAPanel;
  import fr.orsay.lri.varna.exceptions.ExceptionFileFormatOrSyntax;
  import fr.orsay.lri.varna.exceptions.ExceptionUnmatchedClosingParentheses;
@@@ -80,23 -66,12 +80,23 @@@ public class AppVarna extends JInternal
    public AppVarna(String sname, SequenceI seq, String strucseq,
            String struc, String name, AlignmentPanel ap)
    {
 +
 +//      System.out.println("1:"+sname);
 +//      System.out.println("2:"+seq);
 +//      System.out.println("3:"+strucseq);
 +//      System.out.println("4:"+struc);
 +//      System.out.println("5:"+name);
 +//      System.out.println("6:"+ap);
      this.ap = ap;
      ArrayList<RNA> rnaList = new ArrayList<RNA>();
      RNA rna1 = new RNA(name);
      try
      {
 +
        rna1.setRNA(strucseq, replaceOddGaps(struc));
 +//      System.out.println("The sequence is :"+rna1.getSeq());
 +//      System.out.println("The sequence is:"+struc);
 +//      System.out.println("The sequence is:"+replaceOddGaps(struc).toString());
      } catch (ExceptionUnmatchedClosingParentheses e2)
      {
        e2.printStackTrace();
      RNA trim = trimRNA(rna1, "trimmed " + sname);
      rnaList.add(trim);
      rnaList.add(rna1);
 +    
      rnas.put(seq, rna1);
      rnas.put(seq, trim);
      rna1.setName(sname + " (with gaps)");
      {
        seqs.put(trim, seq);
        seqs.put(rna1, seq);
 -
 +      
        /**
         * if (false || seq.getStart()!=1) { for (RNA rshift:rnaList) { ShiftList
         * shift=offsets.get(rshift); if (shift==null) { offsets.put(rshift,
      }
      vab = new AppVarnaBinding(rnaList);
      // vab = new AppVarnaBinding(seq,struc);
 -    // System.out.println("Hallo: "+name);
      this.name = sname + " trimmed to " + name;
      initVarna();
 +   
      ssm = ap.getStructureSelectionManager();
 +    //System.out.println(ssm.toString());
      ssm.addStructureViewerListener(this);
      ssm.addSelectionListener(this);
    }
  
    public void initVarna()
    {
 +       
      // vab.setFinishedInit(false);
      varnaPanel = vab.get_varnaPanel();
      setBackground(Color.white);
              getBounds().width, getBounds().height);
      this.pack();
      showPanel(true);
 +  
    }
  
    public String replaceOddGaps(String oldStr)
    public RNA trimRNA(RNA rna, String name)
    {
      ShiftList offset = new ShiftList();
 +    
      RNA rnaTrim = new RNA(name);
      try
      {
  
    }
  
 +  @Override
 +  public void onTranslationChanged()
 +  {
 +    // TODO Auto-generated method stub
 +    
 +  }
 +
 +  @Override
 +  public void onZoomLevelChanged()
 +  {
 +    // TODO Auto-generated method stub
 +    
 +  }
 +
  }
@@@ -1,5 -1,5 +1,5 @@@
  /*
-  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.1)
   * Copyright (C) 2014 The Jalview Authors
   * 
   * This file is part of Jalview.
@@@ -46,14 -46,20 +46,14 @@@ import java.util.List
  
  import javax.swing.DefaultListModel;
  import javax.swing.DefaultListSelectionModel;
 -import javax.swing.Icon;
  import javax.swing.JButton;
 -import javax.swing.JFrame;
  import javax.swing.JLabel;
  import javax.swing.JList;
 -import javax.swing.JOptionPane;
  import javax.swing.JPanel;
  import javax.swing.JScrollPane;
  import javax.swing.JTextField;
  import javax.swing.ListModel;
  import javax.swing.ListSelectionModel;
 -import javax.swing.UIManager;
 -import javax.swing.UnsupportedLookAndFeelException;
  import javax.swing.event.ListSelectionEvent;
  import javax.swing.event.ListSelectionListener;
  
@@@ -143,19 -149,16 +143,19 @@@ public class AppVarnaBinding extends ja
    {
      // super("VARNA in Jalview");
      initVarna(seq, struc);
 +   
    }
  
    public AppVarnaBinding(ArrayList<RNA> rnaList)
    {
 +
      // super("VARNA in Jalview");
      initVarnaEdit(rnaList);
    }
  
    private void initVarna(String seq, String str)
    {
 +        
      DefaultListModel dlm = new DefaultListModel();
  
      DefaultListSelectionModel m = new DefaultListSelectionModel();
  
      try
      {
 +    
        vp = new VARNAPanel("0", ".");
        _RNA1.setRNA(seq, str);
        _RNA1.drawRNARadiate(vp.getConfig());
  
    private void initVarnaEdit(ArrayList<RNA> rnaInList)
    {
 +      
      DefaultListModel dlm = new DefaultListModel();
  
      int marginTools = 40;
            FullBackup sel = (FullBackup) _sideList.getSelectedValue();
            Mapping map = Mapping.DefaultOutermostMapping(vp.getRNA()
                    .getSize(), sel.rna.getSize());
 -          vp.showRNAInterpolated(sel.rna, sel.config, map);
 +          //vp.showRNAInterpolated(sel.rna, sel.config, map);
 +          vp.showRNA(sel.rna, sel.config);
            // _seq.setText(sel.rna.getSeq());
            _str.setText(sel.rna.getStructDBN());
          }
  
      try
      {
 +      
        vp = new VARNAPanel("0", ".");
        for (int i = 0; i < rnaInList.size(); i++)
        {
          rnaInList.get(i).drawRNARadiate(vp.getConfig());
 +       
        }
      } catch (ExceptionNonEqualLength e)
      {
  
    public void onUINewStructure(VARNAConfig v, RNA r)
    {
 -    _rnaList.add(v, r, "", true);
 +    // patch to fix infinite loop
 +    // The problem is that onUINewStructure is called when user clicks 
 +    // check with Yann about whether Jalview should do anything with this event.
 +    // e.g. if user has used VARNA's menu to import a structure .. Jalview may need to be told which structure is displayed.
 +    
 +    // _rnaList.add(v, r, "", true);
    }
  
    public void onWarningEmitted(String s)
      // TODO Auto-generated method stub
  
    }
 +
 +  @Override
 +  public void onZoomLevelChanged()
 +  {
 +    // TODO Auto-generated method stub
 +    
 +  }
 +
 +  @Override
 +  public void onTranslationChanged()
 +  {
 +    // TODO Auto-generated method stub
 +    
 +  }
  }
  
  /*
@@@ -1,5 -1,5 +1,5 @@@
  /*
-  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.1)
   * Copyright (C) 2014 The Jalview Authors
   * 
   * This file is part of Jalview.
@@@ -19,6 -19,7 +19,6 @@@
  package jalview.gui;
  
  import javax.swing.JOptionPane;
 -
  import jalview.datamodel.PDBEntry;
  import jalview.datamodel.SequenceI;
  import jalview.util.MessageManager;
@@@ -69,7 -70,6 +69,7 @@@ public class AssociatePdbFileWithSe
        {
          entry.setId(pdbfile.id);
        }
 +
      } catch (java.io.IOException ex)
      {
        ex.printStackTrace();
@@@ -79,4 -79,5 +79,4 @@@
      sequence.getDatasetSequence().addPDBId(entry);
      return entry;
    }
 -
  }
@@@ -1,5 -1,5 +1,5 @@@
  /*
-  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.1)
   * Copyright (C) 2014 The Jalview Authors
   * 
   * This file is part of Jalview.
@@@ -1372,7 -1372,7 +1372,7 @@@ public class Desktop extends jalview.jb
    {
      JalviewFileChooser chooser = new JalviewFileChooser(
              jalview.bin.Cache.getProperty("LAST_DIRECTORY"), new String[]
-             { "jar" }, new String[]
+             { "jvp" }, new String[]
              { "Jalview Project" }, "Jalview Project");
  
      chooser.setFileView(new JalviewFileView());
    {
      JalviewFileChooser chooser = new JalviewFileChooser(
              jalview.bin.Cache.getProperty("LAST_DIRECTORY"), new String[]
-             { "jar" }, new String[]
-             { "Jalview Project" }, "Jalview Project");
+             { "jvp","jar" }, new String[]
+             { "Jalview Project", "Jalview Project (old)" }, "Jalview Project");
      chooser.setFileView(new JalviewFileView());
      chooser.setDialogTitle("Restore state");
  
    {
      if (progressPanel != null)
      {
 +      synchronized(progressPanel) {
        progressPanel.remove(progbar);
        GridLayout gl = (GridLayout) progressPanel.getLayout();
        gl.setRows(gl.getRows() - 1);
          this.getContentPane().remove(progressPanel);
          progressPanel = null;
        }
 +      }
      }
      validate();
    }
      fileLoadingCount--;
      if (fileLoadingCount < 1)
      {
 -      for (JPanel flp : fileLoadingPanels)
 +      while (fileLoadingPanels.size()>0)
        {
 -        removeProgressPanel(flp);
 +        removeProgressPanel(fileLoadingPanels.remove(0));
        }
        fileLoadingPanels.clear();
        fileLoadingCount = 0;
@@@ -1,5 -1,5 +1,5 @@@
  /*
-  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.1)
   * Copyright (C) 2014 The Jalview Authors
   * 
   * This file is part of Jalview.
@@@ -72,7 -72,6 +72,7 @@@ public class PopupMenu extends JPopupMe
    protected JRadioButtonMenuItem BLOSUM62Colour = new JRadioButtonMenuItem();
  
    protected JRadioButtonMenuItem purinePyrimidineColour = new JRadioButtonMenuItem();
 +  protected JRadioButtonMenuItem RNAInteractionColour = new JRadioButtonMenuItem();
  
    // protected JRadioButtonMenuItem covariationColour = new
    // JRadioButtonMenuItem();
    JMenu pdbMenu = new JMenu();
  
    JMenuItem pdbFromFile = new JMenuItem();
 -
 +    // JBPNote: Commented these out - Should add these services via the web services menu system.
 +    // JMenuItem ContraFold = new JMenuItem();
 +  
 +    // JMenuItem RNAFold = new JMenuItem();
 +  
    JMenuItem enterPDB = new JMenuItem();
  
    JMenuItem discoverPDB = new JMenuItem();
      colours.add(PIDColour);
      colours.add(BLOSUM62Colour);
      colours.add(purinePyrimidineColour);
 +    colours.add(RNAInteractionColour);
      // colours.add(covariationColour);
  
      for (int i = 0; i < jalview.io.FormatAdapter.WRITEABLE_FORMATS.length; i++)
              menuItem = new JMenuItem();
              menuItem.setText(MessageManager.formatMessage("label.2d_rna_structure_line", new String[]{structureLine}));\r
              menuItem.addActionListener(new java.awt.event.ActionListener()
 +            
              {
                public void actionPerformed(ActionEvent e)
                {
 -                new AppVarna(structureLine, seq, seq.getSequenceAsString(),
 -                        rnastruc, seq.getName(), ap);
 +                      //System.out.println("1:"+structureLine);
 +                      System.out.println("1:sname"+seq.getName());
 +                      System.out.println("2:seq"+seq);
 +                
 +                      //System.out.println("3:"+seq.getSequenceAsString());
 +                      System.out.println("3:strucseq"+rnastruc);
 +                      //System.out.println("4:struc"+seq.getRNA());
 +                      System.out.println("5:name"+seq.getName());
 +                      System.out.println("6:ap"+ap);
 +                      new AppVarna(structureLine, seq, seq.getSequenceAsString(), rnastruc, seq
 +                            .getName(), ap);
 +                      //new AppVarna(seq.getName(),seq,rnastruc,seq.getRNA(), seq.getName(), ap);
 +                      System.out.println("end");
                }
              });
              viewStructureMenu.add(menuItem);
                  public void actionPerformed(ActionEvent e)
                  {
                    // TODO: VARNA does'nt print gaps in the sequence
 +                
                    new AppVarna(seq.getName() + " structure", seq, seq
                            .getSequenceAsString(), rnastruc, seq.getName(),
                            ap);
        {
          purinePyrimidineColour.setSelected(true);
        }
 +      
 +   
        /*
         * else if (sg.cs instanceof CovariationColourScheme) {
         * covariationColour.setSelected(true); }
          pdbFromFile_actionPerformed();
        }
      });
 +//    RNAFold.setText("From RNA Fold with predict2D");
 +//    RNAFold.addActionListener(new ActionListener()
 +//    {
 +//      public void actionPerformed(ActionEvent e)
 +//      {
 +//              try {
 +//                    RNAFold_actionPerformed();
 +//            } catch (Exception e1) {
 +//                    // TODO Auto-generated catch block
 +//                    e1.printStackTrace();
 +//            }
 +//      }   
 +//    });
 +//    ContraFold.setText("From Contra Fold with predict2D");
 +//    ContraFold.addActionListener(new ActionListener()
 +//    {
 +//      public void actionPerformed(ActionEvent e)
 +//      {
 +//              try {
 +//                    ContraFold_actionPerformed();
 +//            } catch (Exception e1) {
 +//                    // TODO Auto-generated catch block
 +//                    e1.printStackTrace();
 +//            }
 +//      }   
 +//    });
      enterPDB.setText(MessageManager.getString("label.enter_pdb_id"));\r
      enterPDB.addActionListener(new ActionListener()
      {
      colourMenu.add(turnColour);
      colourMenu.add(buriedColour);
      colourMenu.add(nucleotideMenuItem);
 -    if (ap.getAlignment().isNucleotide())
 -    {
 -      colourMenu.add(purinePyrimidineColour);
 +    if (ap.getAlignment().isNucleotide()) {
 +      // JBPNote - commented since the colourscheme isn't functional
 +      //  colourMenu.add(RNAInteractionColour);
 +      colourMenu.add(purinePyrimidineColour);
      }
      // colourMenu.add(covariationColour);
      colourMenu.add(userDefinedColour);
      editMenu.add(lowerCase);
      editMenu.add(toggle);
      pdbMenu.add(pdbFromFile);
 +    // JBPNote: These shouldn't be added here - should appear in a generic 'apply web service to this sequence menu'
 +    //    pdbMenu.add(RNAFold);
 +    //    pdbMenu.add(ContraFold);
      pdbMenu.add(enterPDB);
      pdbMenu.add(discoverPDB);
      jMenu1.add(groupName);
                  purinePyrimidineColour_actionPerformed();
                }
              });
 +    
 +   
      /*
       * covariationColour.addActionListener(new java.awt.event.ActionListener() {
       * public void actionPerformed(ActionEvent e) {
      refresh();
    }
  
 +
    /*
     * protected void covariationColour_actionPerformed() { getGroup().cs = new
     * CovariationColourScheme(sequence.getAnnotation()[0]); refresh(); }
      }
  
    }
 -
 +    // JBNote: commented out - these won't be instantiated here...!  
 +//  public void RNAFold_actionPerformed() throws Exception
 +//  {
 +//      Predict2D P2D = new Predict2D();
 +//      P2D.getStructure2DFromRNAFold("toto");
 +//  }
 +//  
 +//  public void ContraFold_actionPerformed() throws Exception
 +//  {
 +//      Predict2D P2D = new Predict2D();
 +//      P2D.getStructure2DFromContraFold("toto");
 +//  }
    public void enterPDB_actionPerformed()
    {
      String id = JOptionPane.showInternalInputDialog(Desktop.desktop,
@@@ -1,5 -1,5 +1,5 @@@
  /*
-  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.1)
   * Copyright (C) 2014 The Jalview Authors
   * 
   * This file is part of Jalview.
@@@ -66,8 -66,6 +66,8 @@@ public abstract class AlignFile extend
     */
    public AlignFile()
    {
 +        // Shouldn't we init data structures (JBPNote: not sure - initData is for initialising the structures used for reading from a datasource, and the bare constructor hasn't got any datasource)
 +        initData();
    }
  
    /**
@@@ -1,5 -1,5 +1,5 @@@
  /*
-  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.1)
   * Copyright (C) 2014 The Jalview Authors
   * 
   * This file is part of Jalview.
@@@ -39,22 -39,23 +39,22 @@@ public class AppletFormatAdapte
     */
    public static final String[] READABLE_FORMATS = new String[]
    { "BLC", "CLUSTAL", "FASTA", "MSF", "PileUp", "PIR", "PFAM", "STH",
 -      "PDB", "JnetFile" }; // , "SimpleBLAST" };
 +      "PDB", "JnetFile" , "RNAML"}; // , "SimpleBLAST" };
  
    /**
     * List of valid format strings for use by callers of the formatSequences
     * method
     */
    public static final String[] WRITEABLE_FORMATS = new String[]
 -  { "BLC", "CLUSTAL", "FASTA", "MSF", "PileUp", "PIR", "PFAM", "STH",
 -      "AMSA" };
 +  { "BLC", "CLUSTAL", "FASTA", "MSF", "PileUp", "PIR", "PFAM", "AMSA" };
  
    /**
     * List of extensions corresponding to file format types in WRITABLE_FNAMES
     * that are writable by the application.
     */
    public static final String[] WRITABLE_EXTENSIONS = new String[]
-   { "fa, fasta, mfa, fastq", "aln", "pfam", "msf", "pir", "blc", "amsa", "jar",
-       "sto,stk" };
+   { "fa, fasta, mfa, fastq", "aln", "pfam", "msf", "pir", "blc", "amsa", "jvp",
+       "sto,stk", "jar" };
  
    /**
     * List of writable formats by the application. Order must correspond with the
     */
    public static final String[] WRITABLE_FNAMES = new String[]
    { "Fasta", "Clustal", "PFAM", "MSF", "PIR", "BLC", "AMSA", "Jalview",
-       "STH" };
+       "STH", "Jalview" };
  
    /**
     * List of readable format file extensions by application in order
     * corresponding to READABLE_FNAMES
     */
    public static final String[] READABLE_EXTENSIONS = new String[]
-   { "fa, fasta, mfa, fastq", "aln", "pfam", "msf", "pir", "blc", "amsa", "jar",
-       "sto,stk","xml,rnaml" }; // ".blast"
-   // };
+   { "fa, fasta, mfa, fastq", "aln", "pfam", "msf", "pir", "blc", "amsa", "jar,jvp",
 -      "sto,stk" }; // ,
 -
 -  // ".blast"
 -  // };
++    "sto,stk", "xml,rnaml" }; // ".blast"
  
    /**
     * List of readable formats by application in order corresponding to
@@@ -79,7 -82,7 +78,7 @@@
     */
    public static final String[] READABLE_FNAMES = new String[]
    { "Fasta", "Clustal", "PFAM", "MSF", "PIR", "BLC", "AMSA", "Jalview",
 -      "Stockholm" };// ,
 +      "Stockholm","RNAML" };// ,
  
    // "SimpleBLAST"
    // };
        }
        else if (format.equals("PDB"))
        {
 -        afile = new MCview.PDBfile(inFile, type);
 +        afile = new MCview.PDBfile(inFile, type);        
 +        // Uncomment to test Jmol data based PDB processing: JAL-1213
 +        // afile = new jalview.ext.jmol.PDBFileWithJmol(inFile, type);
        }
        else if (format.equals("STH"))
        {
        {
          afile = new SimpleBlastFile(inFile, type);
        }
 -
 +      else if (format.equals("RNAML"))
 +      {
 +        afile = new RnamlFile(inFile, type);
 +      }
 +      
        Alignment al = new Alignment(afile.getSeqsAsArray());
  
        afile.addAnnotations(al);
     * 
     * @return DOCUMENT ME!
     */
 -  public Alignment readFromFile(FileParse source, String format)
 +  public AlignmentI readFromFile(FileParse source, String format)
            throws java.io.IOException
    {
      // TODO: generalise mapping between format string and io. class instances
        {
          afile = new StockholmFile(source);
        }
 +      else if (format.equals("RNAML"))
 +      {
 +        afile = new RnamlFile(source);
 +      }
        else if (format.equals("SimpleBLAST"))
        {
          afile = new SimpleBlastFile(source);
        {
          afile = new AMSAFile(alignment);
        }
 +      else if (format.equalsIgnoreCase("RNAML"))
 +      {
 +        afile = new RnamlFile();
 +      }
 +      
        else
        {
          throw new Exception(
          {
            System.out.println("Reading file: " + f);
            AppletFormatAdapter afa = new AppletFormatAdapter();
 -          String fName = f.getName();
 +          Runtime r = Runtime.getRuntime();
 +          System.gc();
 +          long memf = -r.totalMemory() + r.freeMemory();
 +          long t1 = -System.currentTimeMillis();
 +          Alignment al = afa.readFile(args[i], FILE,
 +                  new IdentifyFile().Identify(args[i], FILE));
 +          t1 += System.currentTimeMillis();
 +          System.gc();
 +          memf += r.totalMemory() - r.freeMemory();
 +          if (al != null)
            {
 -            Runtime r = Runtime.getRuntime();
 -            System.gc();
 -            long memf = -r.totalMemory() + r.freeMemory();
 -            long t1 = -System.currentTimeMillis();
 -            Alignment al = afa.readFile(args[i], FILE,
 -                    new IdentifyFile().Identify(args[i], FILE));
 -            t1 += System.currentTimeMillis();
 -            System.gc();
 -            memf += r.totalMemory() - r.freeMemory();
 -            if (al != null)
 +            System.out.println("Alignment contains " + al.getHeight()
 +                    + " sequences and " + al.getWidth() + " columns.");
 +            try
              {
 -              System.out.println("Alignment contains " + al.getHeight()
 -                      + " sequences and " + al.getWidth() + " columns.");
 -              try
 -              {
 -                System.out.println(new AppletFormatAdapter()
 -                        .formatSequences("FASTA", al, true));
 -              } catch (Exception e)
 -              {
 -                System.err
 -                        .println("Couln't format the alignment for output as a FASTA file.");
 -                e.printStackTrace(System.err);
 -              }
 -            }
 -            else
 +              System.out.println(new AppletFormatAdapter().formatSequences(
 +                      "FASTA", al, true));
 +            } catch (Exception e)
              {
 -              System.out.println("Couldn't read alignment");
 +              System.err
 +                      .println("Couln't format the alignment for output as a FASTA file.");
 +              e.printStackTrace(System.err);
              }
 -            System.out.println("Read took " + (t1 / 1000.0) + " seconds.");
 -            System.out
 -                    .println("Difference between free memory now and before is "
 -                            + (memf / (1024.0 * 1024.0) * 1.0) + " MB");
            }
 +          else
 +          {
 +            System.out.println("Couldn't read alignment");
 +          }
 +          System.out.println("Read took " + (t1 / 1000.0) + " seconds.");
 +          System.out
 +                  .println("Difference between free memory now and before is "
 +                          + (memf / (1024.0 * 1024.0) * 1.0) + " MB");
          } catch (Exception e)
          {
            System.err.println("Exception when dealing with " + i
                    + "'th argument: " + args[i] + "\n" + e);
          }
 -
        }
        else
        {
      }
      return null;
    }
 -
  }
@@@ -1,5 -1,5 +1,5 @@@
  /*
-  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.1)
   * Copyright (C) 2014 The Jalview Authors
   * 
   * This file is part of Jalview.
@@@ -20,7 -20,6 +20,7 @@@ package jalview.io
  
  import java.io.*;
  
 +
  import jalview.datamodel.*;
  
  /**
@@@ -1,5 -1,5 +1,5 @@@
  /*
-  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.1)
   * Copyright (C) 2014 The Jalview Authors
   * 
   * This file is part of Jalview.
@@@ -130,7 -130,7 +130,7 @@@ public class FeaturesFile extends Align
    }
  
    /**
 -   * /** Parse GFF or sequence features file
 +   * Parse GFF or sequence features file
     * 
     * @param align
     *          - alignment/dataset containing sequences that are to be annotated
        resetMatcher();
      } catch (Exception ex)
      {
 -      System.out.println(line);
        System.out.println("Error parsing feature file: " + ex + "\n" + line);
        ex.printStackTrace(System.err);
        resetMatcher();
@@@ -1,5 -1,5 +1,5 @@@
  /*
-  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.1)
   * Copyright (C) 2014 The Jalview Authors
   * 
   * This file is part of Jalview.
   */
  package jalview.io;
  
 -import java.util.*;
 +import jalview.datamodel.AlignmentI;
 +import jalview.gui.AlignFrame;
 +import jalview.gui.AlignViewport;
 +import jalview.gui.Desktop;
 +import jalview.gui.Jalview2XML;
  
 -import javax.swing.*;
 +import java.util.StringTokenizer;
 +import java.util.Vector;
  
 -import jalview.datamodel.*;
 -import jalview.gui.*;
  import jalview.util.MessageManager;
 +import javax.swing.JOptionPane;
 +import javax.swing.SwingUtilities;
  
  public class FileLoader implements Runnable
  {
          // load
        }
        loadtime = -System.currentTimeMillis();
 -      Alignment al = null;
 +      AlignmentI al = null;
  
        if (format.equalsIgnoreCase("Jalview"))
        {
              error = format + "\n" + error;
            }
          }
 -
 +        
          if ((al != null) && (al.getHeight() > 0))
          {
            if (viewport != null)
@@@ -1,5 -1,5 +1,5 @@@
  /*
-  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.1)
   * Copyright (C) 2014 The Jalview Authors
   * 
   * This file is part of Jalview.
@@@ -132,13 -132,6 +132,13 @@@ public class IdentifyFil
  
            break;
          }
 +        
 +        if ((data.indexOf("<") > -1))
 +        {
 +          reply = "RNAML";
 +          
 +          break;
 +        }
  
          if ((data.length() < 1) || (data.indexOf("#") == 0))
          {
  
            break;
          }
 +        
 +        
          else if (data.indexOf(">") > -1)
          {
            // FASTA, PIR file or BLC file
@@@ -1,5 -1,5 +1,5 @@@
  /*
-  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.1)
   * Copyright (C) 2014 The Jalview Authors
   * 
   * This file is part of Jalview.
@@@ -349,7 -349,7 +349,7 @@@ public class JPredFile extends AlignFil
     * @param args
     *          DOCUMENT ME!
     */
 -  public static void main(String[] args)
 +  public static void main(String[] args) 
    {
      try
      {
@@@ -1,5 -1,5 +1,5 @@@
  /*
-  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.1)
   * Copyright (C) 2014 The Jalview Authors
   * 
   * This file is part of Jalview.
@@@ -21,7 -21,6 +21,7 @@@ package jalview.io
  import java.io.*;
  import java.util.*;
  
 +
  import jalview.datamodel.*;
  import jalview.util.*;
  
@@@ -1,5 -1,5 +1,5 @@@
  /*
-  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.1)
   * Copyright (C) 2014 The Jalview Authors
   * 
   * This file is part of Jalview.
@@@ -58,7 -58,6 +58,7 @@@ public class PileUpfile extends MSFfil
     * 
     * @throws IOException
     *           DOCUMENT ME!
 +
     */
    public PileUpfile(String inFile, String type) throws IOException
    {
@@@ -1,82 -1,58 +1,82 @@@
- /*\r
-  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+ /*
+  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.1)
   * Copyright (C) 2014 The Jalview Authors
-  * \r
-  * This file is part of Jalview.\r
-  * \r
-  * Jalview is free software: you can redistribute it and/or\r
-  * modify it under the terms of the GNU General Public License \r
-  * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\r
-  *  \r
-  * Jalview is distributed in the hope that it will be useful, but \r
-  * WITHOUT ANY WARRANTY; without even the implied warranty \r
-  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR \r
-  * PURPOSE.  See the GNU General Public License for more details.\r
-  * \r
-  * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.\r
+  * 
+  * 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.
-  */\r
- /*\r
-  * This extension was written by Benjamin Schuster-Boeckler at sanger.ac.uk\r
-  */\r
- package jalview.io;\r
\r
- import jalview.datamodel.AlignmentI;\r
- import jalview.datamodel.AlignmentAnnotation;\r
- import jalview.datamodel.AlignmentI;\r
- import jalview.datamodel.Annotation;\r
- import jalview.datamodel.DBRefEntry;\r
- import jalview.datamodel.Mapping;\r
- import jalview.datamodel.Sequence;\r
- import jalview.datamodel.SequenceFeature;\r
- import jalview.datamodel.SequenceI;\r
- import jalview.util.Format;\r
\r
- import java.io.BufferedReader;\r
- import java.io.FileReader;\r
- import java.io.IOException;\r
- import java.util.ArrayList;\r
- import java.util.Enumeration;\r
- import java.util.Hashtable;\r
- import java.util.List;\r
- import java.util.StringTokenizer;\r
- import java.util.Vector;\r
\r
- import com.stevesoft.pat.Regex;\r
\r
- import fr.orsay.lri.varna.exceptions.ExceptionUnmatchedClosingParentheses;\r
- import fr.orsay.lri.varna.factories.RNAFactory;\r
- import fr.orsay.lri.varna.models.rna.RNA;\r
\r
- // import org.apache.log4j.*;\r
\r
- /**\r
-  * This class is supposed to parse a Stockholm format file into Jalview There\r
-  * are TODOs in this class: we do not know what the database source and version\r
-  * is for the file when parsing the #GS= AC tag which associates accessions with\r
-  * sequences. Database references are also not parsed correctly: a separate\r
-  * reference string parser must be added to parse the database reference form\r
-  * into Jalview's local representation.\r
-  * \r
-  * @author bsb at sanger.ac.uk\r
-  * @author Natasha Shersnev (Dundee, UK) (Stockholm file writer)\r
-  * @author Lauren Lui (UCSC, USA) (RNA secondary structure annotation import as stockholm)\r
-  * @author Anne Menard (Paris, FR) (VARNA parsing of Stockholm file data)\r
-  * @version 0.3 + jalview mods\r
-  * \r
-  */\r
- public class StockholmFile extends AlignFile\r
- {\r
-   // static Logger logger = Logger.getLogger("jalview.io.StockholmFile");\r
-   protected ArrayList<RNA> result;\r
+  */
+ /*
+  * This extension was written by Benjamin Schuster-Boeckler at sanger.ac.uk
+  */
+ package jalview.io;
 -import java.io.*;
 -import java.util.*;
 -
 -import com.stevesoft.pat.*;
 -import jalview.datamodel.*;
++import jalview.datamodel.AlignmentI;
++import jalview.datamodel.AlignmentAnnotation;
++import jalview.datamodel.AlignmentI;
++import jalview.datamodel.Annotation;
++import jalview.datamodel.DBRefEntry;
++import jalview.datamodel.Mapping;
++import jalview.datamodel.Sequence;
++import jalview.datamodel.SequenceFeature;
++import jalview.datamodel.SequenceI;
+ import jalview.util.Format;
++import java.io.BufferedReader;
++import java.io.FileReader;
++import java.io.IOException;
++import java.util.ArrayList;
++import java.util.Enumeration;
++import java.util.Hashtable;
++import java.util.List;
++import java.util.StringTokenizer;
++import java.util.Vector;
++
++import com.stevesoft.pat.Regex;
++
++import fr.orsay.lri.varna.exceptions.ExceptionUnmatchedClosingParentheses;
++import fr.orsay.lri.varna.factories.RNAFactory;
++import fr.orsay.lri.varna.models.rna.RNA;
++
+ // import org.apache.log4j.*;
+ /**
+  * This class is supposed to parse a Stockholm format file into Jalview There
+  * are TODOs in this class: we do not know what the database source and version
+  * is for the file when parsing the #GS= AC tag which associates accessions with
+  * sequences. Database references are also not parsed correctly: a separate
+  * reference string parser must be added to parse the database reference form
+  * into Jalview's local representation.
+  * 
+  * @author bsb at sanger.ac.uk
++ * @author Natasha Shersnev (Dundee, UK) (Stockholm file writer)
++ * @author Lauren Lui (UCSC, USA) (RNA secondary structure annotation import as stockholm)
++ * @author Anne Menard (Paris, FR) (VARNA parsing of Stockholm file data)
+  * @version 0.3 + jalview mods
+  * 
+  */
+ public class StockholmFile extends AlignFile
+ {
+   // static Logger logger = Logger.getLogger("jalview.io.StockholmFile");
++  protected ArrayList<RNA> result;
    StringBuffer out; // output buffer
  
    AlignmentI al;
\r
-   public StockholmFile()\r
-   {\r
-   }\r
\r
+   public StockholmFile()
+   {
+   }
    /**
     * Creates a new StockholmFile object for output.
     */
      this.al = al;
    }
  
-   public StockholmFile(String inFile, String type) throws IOException\r
-   {\r
-     super(inFile, type);\r
-   }\r
\r
-   public StockholmFile(FileParse source) throws IOException\r
-   {\r
-     super(source);\r
-   }\r
\r
-   public void initData()\r
-   {\r
-     super.initData();\r
-   }\r
-   /**\r
-    * Parse a file in Stockholm format into Jalview's data model using VARNA\r
-    * \r
-    * @throws IOException\r
-    *           If there is an error with the input file\r
-    */\r
-   public void parse_with_VARNA(java.io.File inFile) throws IOException\r
-   {\r
-     FileReader fr = null;\r
-     fr = new FileReader(inFile);\r
\r
-     BufferedReader r = new BufferedReader(fr);\r
-     result = null;\r
-     try\r
-     {\r
-       result = RNAFactory.loadSecStrStockholm(r);\r
-     } catch (ExceptionUnmatchedClosingParentheses umcp)\r
-     {\r
-       errormessage = "Unmatched parentheses in annotation. Aborting ("\r
-               + umcp.getMessage() + ")";\r
-       throw new IOException(umcp);\r
-     }\r
-     // DEBUG System.out.println("this is the secondary scructure:"\r
-     // +result.size());\r
-     SequenceI[] seqs = new SequenceI[result.size()];\r
-     String id=null;\r
-     for (int i = 0; i < result.size(); i++)\r
-     {\r
-       // DEBUG System.err.println("Processing i'th sequence in Stockholm file")\r
-       RNA current = result.get(i);\r
\r
-       String seq = current.getSeq();\r
-       String rna = current.getStructDBN(true);\r
-       // DEBUG System.out.println(seq);\r
-       // DEBUG System.err.println(rna);\r
-       int begin = 0;\r
-       int end = seq.length() - 1;\r
-       id = safeName(getDataName());\r
-       seqs[i] = new Sequence(id, seq, begin, end);\r
-       String[] annot = new String[rna.length()];\r
-       Annotation[] ann = new Annotation[rna.length()];\r
-       for (int j = 0; j < rna.length(); j++)\r
-       {\r
-         annot[j] = rna.substring(j, j + 1);\r
\r
-       }\r
\r
-       for (int k = 0; k < rna.length(); k++)\r
-       {\r
-         ann[k] = new Annotation(annot[k], "",\r
-                 jalview.schemes.ResidueProperties.getRNASecStrucState(\r
-                         annot[k]).charAt(0), 0f);\r
\r
-       }\r
-       AlignmentAnnotation align = new AlignmentAnnotation("Sec. str.",\r
-               current.getID(), ann);\r
\r
-       seqs[i].addAlignmentAnnotation(align);\r
-       seqs[i].setRNA(result.get(i));\r
-       this.annotations.addElement(align);\r
-     }\r
-     this.setSeqs(seqs);\r
\r
-   }\r
\r
-   \r
-   /**\r
-    * Parse a file in Stockholm format into Jalview's data model. The file has to\r
-    * be passed at construction time\r
-    * \r
-    * @throws IOException\r
-    *           If there is an error with the input file\r
-    */\r
-   public void parse() throws IOException\r
-   {\r
-       StringBuffer treeString = new StringBuffer();\r
-       String treeName = null;\r
-       // --------------- Variable Definitions -------------------\r
-       String line;\r
-       String version;\r
-     // String id;\r
-       Hashtable seqAnn = new Hashtable(); // Sequence related annotations\r
-       Hashtable seqs = new Hashtable();\r
-       Regex p, r, rend, s, x;\r
-       // Temporary line for processing RNA annotation\r
-       // String RNAannot = "";\r
\r
-       // ------------------ Parsing File ----------------------\r
-       // First, we have to check that this file has STOCKHOLM format, i.e. the\r
-       // first line must match\r
-       \r
-   \r
-               r = new Regex("# STOCKHOLM ([\\d\\.]+)");\r
-               if (!r.search(nextLine()))\r
-               {\r
-                       throw new IOException(\r
-                                       "This file is not in valid STOCKHOLM format: First line does not contain '# STOCKHOLM'");\r
-               }\r
-               else\r
-               {\r
-                       version = r.stringMatched(1);\r
-               \r
-                       // logger.debug("Stockholm version: " + version);\r
-               }\r
\r
-               // We define some Regexes here that will be used regularily later\r
-               rend = new Regex("^\\s*\\/\\/"); // Find the end of an alignment\r
-               p = new Regex("(\\S+)\\/(\\d+)\\-(\\d+)"); // split sequence id in\r
-               // id/from/to\r
-               s = new Regex("(\\S+)\\s+(\\S*)\\s+(.*)"); // Parses annotation subtype\r
-               r = new Regex("#=(G[FSRC]?)\\s+(.*)"); // Finds any annotation line\r
-               x = new Regex("(\\S+)\\s+(\\S+)"); // split id from sequence\r
\r
-               // Convert all bracket types to parentheses (necessary for passing to VARNA)\r
-               Regex openparen = new Regex("(<|\\[)", "(");\r
-               Regex closeparen = new Regex("(>|\\])", ")");\r
\r
-               // Detect if file is RNA by looking for bracket types\r
-               Regex detectbrackets = new Regex("(<|>|\\[|\\]|\\(|\\))");\r
\r
-               rend.optimize();\r
-           p.optimize();\r
-           s.optimize();\r
-           r.optimize();\r
-           x.optimize();\r
-           openparen.optimize();\r
-           closeparen.optimize();\r
-       \r
-           while ((line = nextLine()) != null)\r
-           {\r
-             if (line.length() == 0)\r
-             {\r
-               continue;\r
-             }\r
-             if (rend.search(line))\r
-             {\r
-               // End of the alignment, pass stuff back\r
-         this.noSeqs = seqs.size();\r
-       \r
-         String seqdb,dbsource = null;\r
-         Regex pf = new Regex("PF[0-9]{5}(.*)"); // Finds AC for Pfam\r
-         Regex rf = new Regex("RF[0-9]{5}(.*)"); // Finds AC for Rfam\r
-         if (getAlignmentProperty("AC") != null)\r
-         {\r
-           String dbType = getAlignmentProperty("AC").toString();\r
-           if (pf.search(dbType))\r
-           {\r
-             // PFAM Alignment - so references are typically from Uniprot\r
-             dbsource = "PFAM";\r
-           }\r
-           else if (rf.search(dbType))\r
-           {\r
-             dbsource = "RFAM";\r
-           }\r
-         }\r
-               // logger.debug("Number of sequences: " + this.noSeqs);\r
-               Enumeration accs = seqs.keys();\r
-               while (accs.hasMoreElements())\r
-               {\r
-                 String acc = (String) accs.nextElement();\r
-                 // logger.debug("Processing sequence " + acc);\r
-                 String seq = (String) seqs.remove(acc);\r
-                 if (maxLength < seq.length())\r
-                 {\r
-                   maxLength = seq.length();\r
-                 }\r
-                 int start = 1;\r
-                 int end = -1;\r
-                 String sid = acc;\r
-                 /*\r
-            * Retrieve hash of annotations for this accession Associate\r
-            * Annotation with accession\r
-                  */\r
-                 Hashtable accAnnotations = null;\r
-       \r
-                 if (seqAnn != null && seqAnn.containsKey(acc))\r
-                 {\r
-                   accAnnotations = (Hashtable) seqAnn.remove(acc);\r
-                   //TODO: add structures to sequence\r
-                 }\r
-       \r
-                 // Split accession in id and from/to\r
-                 if (p.search(acc))\r
-                 {\r
-                   sid = p.stringMatched(1);\r
-                   start = Integer.parseInt(p.stringMatched(2));\r
-                   end = Integer.parseInt(p.stringMatched(3));\r
-                 }\r
-                 // logger.debug(sid + ", " + start + ", " + end);\r
-       \r
-                 Sequence seqO = new Sequence(sid, seq, start, end);\r
-                 // Add Description (if any)\r
-                 if (accAnnotations != null && accAnnotations.containsKey("DE"))\r
-                 {\r
-                   String desc = (String) accAnnotations.get("DE");\r
-                   seqO.setDescription((desc == null) ? "" : desc);\r
-                 }\r
-                 // Add DB References (if any)\r
-                 if (accAnnotations != null && accAnnotations.containsKey("DR"))\r
-                 {\r
-                   String dbr = (String) accAnnotations.get("DR");\r
-                   if (dbr != null && dbr.indexOf(";") > -1)\r
-                   {\r
-                     String src = dbr.substring(0, dbr.indexOf(";"));\r
-                     String acn = dbr.substring(dbr.indexOf(";") + 1);\r
-                     jalview.util.DBRefUtils.parseToDbRef(seqO, src, "0", acn);\r
-                   }\r
-                 }        \r
\r
-           if (accAnnotations != null && accAnnotations.containsKey("AC"))\r
-           {\r
-             if (dbsource != null)\r
-             {\r
-               String dbr = (String) accAnnotations.get("AC");\r
-               if (dbr != null)\r
-                 {\r
-                 // we could get very clever here - but for now - just try to guess accession type from source of alignment plus structure of accession\r
-                 guessDatabaseFor(seqO, dbr, dbsource);\r
-                         \r
-                           }\r
-                 }\r
-             // else - do what ?  add the data anyway and prompt the user to specify what references these are ?\r
-           }\r
-               \r
-                 Hashtable features = null;\r
-                 // We need to adjust the positions of all features to account for gaps\r
-                 try\r
-                 {\r
-                   features = (Hashtable) accAnnotations.remove("features");\r
-                 } catch (java.lang.NullPointerException e)\r
-                 {\r
-                   // loggerwarn("Getting Features for " + acc + ": " +\r
-                   // e.getMessage());\r
-                   // continue;\r
-                 }\r
-                 // if we have features\r
-                 if (features != null)\r
-                 {\r
-                   int posmap[] = seqO.findPositionMap();\r
-                   Enumeration i = features.keys();\r
-                   while (i.hasMoreElements())\r
-                   {\r
-                     // TODO: parse out secondary structure annotation as annotation\r
-                     // row\r
-                     // TODO: parse out scores as annotation row\r
-                     // TODO: map coding region to core jalview feature types\r
-                     String type = i.nextElement().toString();\r
-                     Hashtable content = (Hashtable) features.remove(type);\r
\r
-               // add alignment annotation for this feature\r
-               String key = type2id(type);\r
-               if (key != null)\r
-               {\r
-                 if (accAnnotations != null\r
-                         && accAnnotations.containsKey(key))\r
-                 {\r
-                   Vector vv = (Vector) accAnnotations.get(key);\r
-                   for (int ii = 0; ii < vv.size(); ii++)\r
-                   {\r
-                     AlignmentAnnotation an = (AlignmentAnnotation) vv\r
-                             .elementAt(ii);\r
-                     seqO.addAlignmentAnnotation(an);\r
-                   }\r
-                 }\r
-               }\r
\r
-                     Enumeration j = content.keys();\r
-                     while (j.hasMoreElements())\r
-                     {\r
-                       String desc = j.nextElement().toString();\r
-                       String ns = content.get(desc).toString();\r
-                       char[] byChar = ns.toCharArray();\r
-                       for (int k = 0; k < byChar.length; k++)\r
-                       {\r
-                         char c = byChar[k];\r
-                         if (!(c == ' ' || c == '_' || c == '-' || c == '.')) // PFAM\r
-                         // uses\r
-                         // '.'\r
-                         // for\r
-                         // feature\r
-                         // background\r
-                         {\r
-                           int new_pos = posmap[k]; // look up nearest seqeunce\r
-                           // position to this column\r
-                           SequenceFeature feat = new SequenceFeature(type, desc,\r
-                                   new_pos, new_pos, 0f, null);\r
-       \r
-                           seqO.addSequenceFeature(feat);\r
-                         }\r
-                       }\r
-                     }\r
-       \r
-                   }\r
-       \r
-                 }\r
-                 // garbage collect\r
-       \r
-                 // logger.debug("Adding seq " + acc + " from " + start + " to " + end\r
-                 // + ": " + seq);\r
-                 this.seqs.addElement(seqO);\r
-               }\r
-               return; // finished parsing this segment of source\r
-             }\r
-             else if (!r.search(line))\r
-             {\r
-               // System.err.println("Found sequence line: " + line);\r
-       \r
-               // Split sequence in sequence and accession parts\r
-               if (!x.search(line))\r
-               {\r
-                 // logger.error("Could not parse sequence line: " + line);\r
-                 throw new IOException("Could not parse sequence line: " + line);\r
-               }\r
-               String ns = (String) seqs.get(x.stringMatched(1));\r
-               if (ns == null)\r
-               {\r
-                 ns = "";\r
-               }\r
-               ns += x.stringMatched(2);\r
-       \r
-               seqs.put(x.stringMatched(1), ns);\r
-             }\r
-             else\r
-             {\r
-               String annType = r.stringMatched(1);\r
-               String annContent = r.stringMatched(2);\r
-       \r
-               // System.err.println("type:" + annType + " content: " + annContent);\r
-       \r
-               if (annType.equals("GF"))\r
-               {\r
-                 /*\r
-                  * Generic per-File annotation, free text Magic features: #=GF NH\r
-                  * <tree in New Hampshire eXtended format> #=GF TN <Unique identifier\r
-                  * for the next tree> Pfam descriptions: 7. DESCRIPTION OF FIELDS\r
-                  * \r
-                  * Compulsory fields: ------------------\r
-                  * \r
-                  * AC Accession number: Accession number in form PFxxxxx.version or\r
-                  * PBxxxxxx. ID Identification: One word name for family. DE\r
-                  * Definition: Short description of family. AU Author: Authors of the\r
-                  * entry. SE Source of seed: The source suggesting the seed members\r
-                  * belong to one family. GA Gathering method: Search threshold to\r
-                  * build the full alignment. TC Trusted Cutoff: Lowest sequence score\r
-                  * and domain score of match in the full alignment. NC Noise Cutoff:\r
-                  * Highest sequence score and domain score of match not in full\r
-                  * alignment. TP Type: Type of family -- presently Family, Domain,\r
-                  * Motif or Repeat. SQ Sequence: Number of sequences in alignment. AM\r
-                  * Alignment Method The order ls and fs hits are aligned to the model\r
-                  * to build the full align. // End of alignment.\r
-                  * \r
-                  * Optional fields: ----------------\r
-                  * \r
-                  * DC Database Comment: Comment about database reference. DR Database\r
-                  * Reference: Reference to external database. RC Reference Comment:\r
-                  * Comment about literature reference. RN Reference Number: Reference\r
-                  * Number. RM Reference Medline: Eight digit medline UI number. RT\r
-                  * Reference Title: Reference Title. RA Reference Author: Reference\r
-                  * Author RL Reference Location: Journal location. PI Previous\r
-                  * identifier: Record of all previous ID lines. KW Keywords: Keywords.\r
-                  * CC Comment: Comments. NE Pfam accession: Indicates a nested domain.\r
-                  * NL Location: Location of nested domains - sequence ID, start and\r
-                  * end of insert.\r
-                  * \r
-                  * Obsolete fields: ----------- AL Alignment method of seed: The\r
-                  * method used to align the seed members.\r
-                  */\r
-                 // Let's save the annotations, maybe we'll be able to do something\r
-                 // with them later...\r
-                 Regex an = new Regex("(\\w+)\\s*(.*)");\r
-                 if (an.search(annContent))\r
-                 {\r
-                   if (an.stringMatched(1).equals("NH"))\r
-                   {\r
-                     treeString.append(an.stringMatched(2));\r
-                   }\r
-                   else if (an.stringMatched(1).equals("TN"))\r
-                   {\r
-                     if (treeString.length() > 0)\r
-                     {\r
-                       if (treeName == null)\r
-                       {\r
-                         treeName = "Tree " + (getTreeCount() + 1);\r
-                       }\r
-                       addNewickTree(treeName, treeString.toString());\r
-                     }\r
-                     treeName = an.stringMatched(2);\r
-                     treeString = new StringBuffer();\r
-                   }\r
-                   setAlignmentProperty(an.stringMatched(1), an.stringMatched(2));\r
-                 }\r
-               }\r
-               else if (annType.equals("GS"))\r
-               {\r
-                 // Generic per-Sequence annotation, free text\r
-                 /*\r
-                  * Pfam uses these features: Feature Description ---------------------\r
-                  * ----------- AC <accession> ACcession number DE <freetext>\r
-                  * DEscription DR <db>; <accession>; Database Reference OS <organism>\r
-                  * OrganiSm (species) OC <clade> Organism Classification (clade, etc.)\r
-                  * LO <look> Look (Color, etc.)\r
-                  */\r
-                 if (s.search(annContent))\r
-                 {\r
-                   String acc = s.stringMatched(1);\r
-                   String type = s.stringMatched(2);\r
-                   String content = s.stringMatched(3);\r
-                   // TODO: store DR in a vector.\r
-                   // TODO: store AC according to generic file db annotation.\r
-                   Hashtable ann;\r
-                   if (seqAnn.containsKey(acc))\r
-                   {\r
-                     ann = (Hashtable) seqAnn.get(acc);\r
-                   }\r
-                   else\r
-                   {\r
-                     ann = new Hashtable();\r
-                   }\r
-                   ann.put(type, content);\r
-                   seqAnn.put(acc, ann);\r
-                 }\r
-                 else\r
-                 {\r
-                   throw new IOException("Error parsing " + line);\r
-                 }\r
-               }\r
-               else if (annType.equals("GC"))\r
-               {\r
-                 // Generic per-Column annotation, exactly 1 char per column\r
-                 // always need a label.\r
-                 if (x.search(annContent))\r
-                 {\r
-                   // parse out and create alignment annotation directly.\r
-                   parseAnnotationRow(annotations, x.stringMatched(1),\r
-                           x.stringMatched(2));\r
-                 }\r
-               }\r
-               else if (annType.equals("GR"))\r
-               {\r
-                 // Generic per-Sequence AND per-Column markup, exactly 1 char per\r
-                 // column\r
-                 /*\r
-                  * Feature Description Markup letters ------- -----------\r
-                  * -------------- SS Secondary Structure [HGIEBTSCX] SA Surface\r
-                  * Accessibility [0-9X] (0=0%-10%; ...; 9=90%-100%) TM TransMembrane\r
-                  * [Mio] PP Posterior Probability [0-9*] (0=0.00-0.05; 1=0.05-0.15;\r
-                  * *=0.95-1.00) LI LIgand binding [*] AS Active Site [*] IN INtron (in\r
-                  * or after) [0-2]\r
-                  */\r
-                 if (s.search(annContent))\r
-                 {\r
-                   String acc = s.stringMatched(1);\r
-                   String type = s.stringMatched(2);\r
-                   String seq = new String(s.stringMatched(3));\r
-                   String description = null;\r
-                   // Check for additional information about the current annotation\r
-                   // We use a simple string tokenizer here for speed\r
-                   StringTokenizer sep = new StringTokenizer(seq, " \t");\r
-                   description = sep.nextToken();\r
-                   if (sep.hasMoreTokens())\r
-                   {\r
-                     seq = sep.nextToken();\r
-                   }\r
-                   else\r
-                   {\r
-                     seq = description;\r
-                     description = new String();\r
-                   }\r
-                   // sequence id with from-to fields\r
-       \r
-                   Hashtable ann;\r
-                   // Get an object with all the annotations for this sequence\r
-                   if (seqAnn.containsKey(acc))\r
-                   {\r
-                     // logger.debug("Found annotations for " + acc);\r
-                     ann = (Hashtable) seqAnn.get(acc);\r
-                   }\r
-                   else\r
-                   {\r
-                     // logger.debug("Creating new annotations holder for " + acc);\r
-                     ann = new Hashtable();\r
-                     seqAnn.put(acc, ann);\r
-                   }\r
-             // TODO test structure, call parseAnnotationRow with vector from\r
-             // hashtable for specific sequence\r
-                   Hashtable features;\r
-                   // Get an object with all the content for an annotation\r
-                   if (ann.containsKey("features"))\r
-                   {\r
-                     // logger.debug("Found features for " + acc);\r
-                     features = (Hashtable) ann.get("features");\r
-                   }\r
-                   else\r
-                   {\r
-                     // logger.debug("Creating new features holder for " + acc);\r
-                     features = new Hashtable();\r
-                     ann.put("features", features);\r
-                   }\r
-       \r
-                   Hashtable content;\r
-                   if (features.containsKey(this.id2type(type)))\r
-                   {\r
-                     // logger.debug("Found content for " + this.id2type(type));\r
-                     content = (Hashtable) features.get(this.id2type(type));\r
-                   }\r
-                   else\r
-                   {\r
-                     // logger.debug("Creating new content holder for " +\r
-                     // this.id2type(type));\r
-                     content = new Hashtable();\r
-                     features.put(this.id2type(type), content);\r
-                   }\r
-                   String ns = (String) content.get(description);\r
-                   if (ns == null)\r
-                   {\r
-                     ns = "";\r
-                   }\r
-                   ns += seq;\r
-                   content.put(description, ns);\r
-       \r
- //                if(type.equals("SS")){\r
-                       Hashtable strucAnn;\r
-                       if (seqAnn.containsKey(acc))\r
-                       {\r
-                         strucAnn = (Hashtable) seqAnn.get(acc);\r
-                       }\r
-                       else\r
-                       {\r
-                         strucAnn = new Hashtable();\r
-                       }\r
-                       \r
-                       Vector newStruc=new Vector();\r
-                       parseAnnotationRow(newStruc, type,ns);\r
-                       \r
-                       strucAnn.put(type, newStruc);\r
-                       seqAnn.put(acc, strucAnn);\r
-                    }\r
- //              }\r
-                       else\r
-                       {\r
-                                               System.err\r
-                                               .println("Warning - couldn't parse sequence annotation row line:\n"\r
-                                               + line);\r
-                       // throw new IOException("Error parsing " + line);\r
-                       }\r
-                       }\r
-                       else\r
-                       {\r
-                       throw new IOException("Unknown annotation detected: " + annType\r
-                               + " " + annContent);\r
-                       }\r
-                       }\r
-               }\r
-               if (treeString.length() > 0)\r
-               {\r
-               if (treeName == null)\r
-               {\r
-                       treeName = "Tree " + (1 + getTreeCount());\r
-               }\r
-               addNewickTree(treeName, treeString.toString());\r
-               }\r
-       }\r
\r
- /**\r
-    * Demangle an accession string and guess the originating sequence database for a given sequence\r
-    * @param seqO sequence to be annotated\r
-    * @param dbr Accession string for sequence\r
-    * @param dbsource source database for alignment (PFAM or RFAM)\r
-    */\r
-   private void guessDatabaseFor(Sequence seqO, String dbr, String dbsource)\r
-   {\r
-     DBRefEntry dbrf=null;\r
-     List<DBRefEntry> dbrs=new ArrayList<DBRefEntry>();\r
-     String seqdb="Unknown",sdbac=""+dbr;\r
-     int st=-1,en=-1,p;\r
-     if ((st=sdbac.indexOf("/"))>-1)\r
-     {\r
-       String num,range=sdbac.substring(st+1);\r
-       sdbac = sdbac.substring(0,st);\r
-       if ((p=range.indexOf("-"))>-1)\r
-       {\r
-         p++;\r
-         if (p<range.length())\r
-         {\r
-         num = range.substring(p).trim();\r
-         try {\r
-           en = Integer.parseInt(num);\r
-         } catch (NumberFormatException x)\r
-         {\r
-           // could warn here that index is invalid\r
-           en = -1;\r
-         }\r
-         }\r
-       } else {\r
-         p=range.length();\r
-       }\r
-       num=range.substring(0,p).trim();\r
-       try {\r
-         st = Integer.parseInt(num);\r
-       } catch (NumberFormatException x)\r
-       {\r
-         // could warn here that index is invalid\r
-         st = -1;\r
-       }\r
-     }\r
-     if (dbsource.equals("PFAM")) {\r
-       seqdb = "UNIPROT";\r
-       if (sdbac.indexOf(".")>-1)\r
-       {\r
-         // strip of last subdomain\r
-         sdbac = sdbac.substring(0,sdbac.indexOf("."));\r
-         dbrf = jalview.util.DBRefUtils.parseToDbRef(seqO, seqdb, dbsource, sdbac);\r
-         if (dbrf!=null)\r
-         {\r
-           dbrs.add(dbrf);\r
-         }\r
-       }\r
-       dbrf = jalview.util.DBRefUtils.parseToDbRef(seqO, dbsource, dbsource, dbr);\r
-       if (dbr!=null)\r
-       {\r
-         dbrs.add(dbrf);\r
-       }\r
-     } else {\r
-       seqdb = "EMBL"; // total guess - could be ENA, or something else these days\r
-       if (sdbac.indexOf(".")>-1)\r
-       {\r
-         // strip off last subdomain\r
-         sdbac = sdbac.substring(0,sdbac.indexOf("."));\r
-         dbrf = jalview.util.DBRefUtils.parseToDbRef(seqO, seqdb, dbsource, sdbac);\r
-         if (dbrf!=null)\r
-         {\r
-           dbrs.add(dbrf);\r
-         }\r
-       }\r
-       \r
-       dbrf = jalview.util.DBRefUtils.parseToDbRef(seqO, dbsource, dbsource, dbr);\r
-       if (dbrf!=null)\r
-       {\r
-         dbrs.add(dbrf);\r
-       }\r
-     }\r
-     if (st!=-1 && en!=-1)\r
-     {\r
-       for (DBRefEntry d:dbrs)\r
-       {\r
-         jalview.util.MapList mp = new jalview.util.MapList(new int[] { seqO.getStart(),seqO.getEnd()},new int[] { st,en},1,1);\r
-         jalview.datamodel.Mapping mping = new Mapping(mp);\r
-         d.setMap(mping);\r
-       }\r
-     }\r
-   }\r
\r
-   protected static AlignmentAnnotation parseAnnotationRow(\r
-           Vector annotation, String label, String annots)\r
-   {\r
-     String convert1, convert2 = null;\r
\r
-     // Convert all bracket types to parentheses\r
-     Regex openparen = new Regex("(<|\\[)", "(");\r
-     Regex closeparen = new Regex("(>|\\])", ")");\r
\r
-     // Detect if file is RNA by looking for bracket types\r
-     Regex detectbrackets = new Regex("(<|>|\\[|\\]|\\(|\\))");\r
\r
-     convert1 = openparen.replaceAll(annots);\r
-     convert2 = closeparen.replaceAll(convert1);\r
-     annots = convert2;\r
\r
-     String type = label;\r
-     if (label.contains("_cons"))\r
-     {\r
-       type = (label.indexOf("_cons") == label.length() - 5) ? label\r
-               .substring(0, label.length() - 5) : label;\r
-     }\r
-     boolean ss = false;\r
-     type = id2type(type);\r
-     if (type.equals("secondary structure"))\r
-     {\r
-       ss = true;\r
-     }\r
-     // decide on secondary structure or not.\r
-     Annotation[] els = new Annotation[annots.length()];\r
-     for (int i = 0; i < annots.length(); i++)\r
-     {\r
-       String pos = annots.substring(i, i + 1);\r
-       Annotation ann;\r
-       ann = new Annotation(pos, "", ' ', 0f); // 0f is 'valid' null - will not\r
-       // be written out\r
-       if (ss)\r
-       {\r
-         if (detectbrackets.search(pos))\r
-         {\r
-           ann.secondaryStructure = jalview.schemes.ResidueProperties\r
-                   .getRNASecStrucState(pos).charAt(0);\r
-         }\r
-         else\r
-         {\r
-           ann.secondaryStructure = jalview.schemes.ResidueProperties\r
-                   .getDssp3state(pos).charAt(0);\r
-         }\r
\r
-         if (ann.secondaryStructure == pos.charAt(0) || pos.charAt(0) == 'C')\r
-         {\r
-           ann.displayCharacter = ""; // null; // " ";\r
-         }\r
-         else\r
-         {\r
-           ann.displayCharacter = " " + ann.displayCharacter;\r
-         }\r
-       }\r
\r
-       els[i] = ann;\r
-     }\r
-     AlignmentAnnotation annot = null;\r
-     Enumeration e = annotation.elements();\r
-     while (e.hasMoreElements())\r
-     {\r
-       annot = (AlignmentAnnotation) e.nextElement();\r
-       if (annot.label.equals(type))\r
-         break;\r
-       annot = null;\r
-     }\r
-     if (annot == null)\r
-     {\r
-       annot = new AlignmentAnnotation(type, type, els);\r
-       annotation.addElement(annot);\r
-     }\r
-     else\r
-     {\r
-       Annotation[] anns = new Annotation[annot.annotations.length\r
-               + els.length];\r
-       System.arraycopy(annot.annotations, 0, anns, 0,\r
-               annot.annotations.length);\r
-       System.arraycopy(els, 0, anns, annot.annotations.length, els.length);\r
-       annot.annotations = anns;\r
-       // System.out.println("else: ");\r
-     }\r
-     return annot;\r
-   }\r
\r
+   public StockholmFile(String inFile, String type) throws IOException
+   {
+     super(inFile, type);
+   }
+   public StockholmFile(FileParse source) throws IOException
+   {
+     super(source);
+   }
+   public void initData()
+   {
+     super.initData();
+   }
 -
+   /**
 -   * Parse a file in Stockholm format into Jalview's data model. The file has to
 -   * be passed at construction time
++   * Parse a file in Stockholm format into Jalview's data model using VARNA
+    * 
+    * @throws IOException
+    *           If there is an error with the input file
+    */
 -  public void parse() throws IOException
++  public void parse_with_VARNA(java.io.File inFile) throws IOException
+   {
 -    StringBuffer treeString = new StringBuffer();
 -    String treeName = null;
 -    // --------------- Variable Definitions -------------------
 -    String line;
 -    String version;
 -    // String id;
 -    Hashtable seqAnn = new Hashtable(); // Sequence related annotations
 -    Hashtable seqs = new Hashtable();
 -    Regex p, r, rend, s, x;
++    FileReader fr = null;
++    fr = new FileReader(inFile);
 -    // Temporary line for processing RNA annotation
 -    // String RNAannot = "";
 -
 -    // ------------------ Parsing File ----------------------
 -    // First, we have to check that this file has STOCKHOLM format, i.e. the
 -    // first line must match
 -    r = new Regex("# STOCKHOLM ([\\d\\.]+)");
 -    if (!r.search(nextLine()))
++    BufferedReader r = new BufferedReader(fr);
++    result = null;
++    try
+     {
 -      throw new IOException(
 -              "This file is not in valid STOCKHOLM format: First line does not contain '# STOCKHOLM'");
 -    }
 -    else
++      result = RNAFactory.loadSecStrStockholm(r);
++    } catch (ExceptionUnmatchedClosingParentheses umcp)
+     {
 -      version = r.stringMatched(1);
 -      // logger.debug("Stockholm version: " + version);
++      errormessage = "Unmatched parentheses in annotation. Aborting ("
++              + umcp.getMessage() + ")";
++      throw new IOException(umcp);
+     }
++    // DEBUG System.out.println("this is the secondary scructure:"
++    // +result.size());
++    SequenceI[] seqs = new SequenceI[result.size()];
++    String id=null;
++    for (int i = 0; i < result.size(); i++)
++    {
++      // DEBUG System.err.println("Processing i'th sequence in Stockholm file")
++      RNA current = result.get(i);
++
++      String seq = current.getSeq();
++      String rna = current.getStructDBN(true);
++      // DEBUG System.out.println(seq);
++      // DEBUG System.err.println(rna);
++      int begin = 0;
++      int end = seq.length() - 1;
++      id = safeName(getDataName());
++      seqs[i] = new Sequence(id, seq, begin, end);
++      String[] annot = new String[rna.length()];
++      Annotation[] ann = new Annotation[rna.length()];
++      for (int j = 0; j < rna.length(); j++)
++      {
++        annot[j] = rna.substring(j, j + 1);
 -    // 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
 -    // 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
++      }
 -    // Convert all bracket types to parentheses (necessary for passing to VARNA)
 -    Regex openparen = new Regex("(<|\\[)", "(");
 -    Regex closeparen = new Regex("(>|\\])", ")");
++      for (int k = 0; k < rna.length(); k++)
++      {
++        ann[k] = new Annotation(annot[k], "",
++                jalview.schemes.ResidueProperties.getRNASecStrucState(
++                        annot[k]).charAt(0), 0f);
 -    // Detect if file is RNA by looking for bracket types
 -    Regex detectbrackets = new Regex("(<|>|\\[|\\]|\\(|\\))");
++      }
++      AlignmentAnnotation align = new AlignmentAnnotation("Sec. str.",
++              current.getID(), ann);
 -    rend.optimize();
 -    p.optimize();
 -    s.optimize();
 -    r.optimize();
 -    x.optimize();
 -    openparen.optimize();
 -    closeparen.optimize();
++      seqs[i].addAlignmentAnnotation(align);
++      seqs[i].setRNA(result.get(i));
++      this.annotations.addElement(align);
++    }
++    this.setSeqs(seqs);
 -    while ((line = nextLine()) != null)
 -    {
 -      if (line.length() == 0)
 -      {
 -        continue;
 -      }
 -      if (rend.search(line))
 -      {
 -        // End of the alignment, pass stuff back
 -        this.noSeqs = seqs.size();
++  }
++  
++  /**
++   * Parse a file in Stockholm format into Jalview's data model. The file has to
++   * be passed at construction time
++   * 
++   * @throws IOException
++   *           If there is an error with the input file
++   */
++  public void parse() throws IOException
++  {
++      StringBuffer treeString = new StringBuffer();
++      String treeName = null;
++      // --------------- Variable Definitions -------------------
++      String line;
++      String version;
++    // String id;
++      Hashtable seqAnn = new Hashtable(); // Sequence related annotations
++      Hashtable seqs = new Hashtable();
++      Regex p, r, rend, s, x;
++      // Temporary line for processing RNA annotation
++      // String RNAannot = "";
++
++      // ------------------ Parsing File ----------------------
++      // First, we have to check that this file has STOCKHOLM format, i.e. the
++      // first line must match
++      
++  
++              r = new Regex("# STOCKHOLM ([\\d\\.]+)");
++              if (!r.search(nextLine()))
++              {
++                      throw new IOException(
++                                      "This file is not in valid STOCKHOLM format: First line does not contain '# STOCKHOLM'");
++              }
++              else
++              {
++                      version = r.stringMatched(1);
++              
++                      // logger.debug("Stockholm version: " + version);
++              }
++
++              // 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
++              // 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
++
++              // Convert all bracket types to parentheses (necessary for passing to VARNA)
++              Regex openparen = new Regex("(<|\\[)", "(");
++              Regex closeparen = new Regex("(>|\\])", ")");
++
++              // Detect if file is RNA by looking for bracket types
++              Regex detectbrackets = new Regex("(<|>|\\[|\\]|\\(|\\))");
++
++              rend.optimize();
++          p.optimize();
++          s.optimize();
++          r.optimize();
++          x.optimize();
++          openparen.optimize();
++          closeparen.optimize();
++      
++          while ((line = nextLine()) != null)
++          {
++            if (line.length() == 0)
++            {
++              continue;
++            }
++            if (rend.search(line))
++            {
++              // End of the alignment, pass stuff back
++        this.noSeqs = seqs.size();
++      
+         String seqdb,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
+         if (getAlignmentProperty("AC") != null)
+         {
+           String dbType = getAlignmentProperty("AC").toString();
+           if (pf.search(dbType))
+           {
+             // PFAM Alignment - so references are typically from Uniprot
+             dbsource = "PFAM";
+           }
+           else if (rf.search(dbType))
+           {
+             dbsource = "RFAM";
+           }
+         }
 -        // logger.debug("Number of sequences: " + this.noSeqs);
 -        Enumeration accs = seqs.keys();
 -        while (accs.hasMoreElements())
 -        {
 -          String acc = (String) accs.nextElement();
 -          // logger.debug("Processing sequence " + acc);
 -          String seq = (String) seqs.remove(acc);
 -          if (maxLength < seq.length())
 -          {
 -            maxLength = seq.length();
 -          }
 -          int start = 1;
 -          int end = -1;
 -          String sid = acc;
 -          /*
++              // logger.debug("Number of sequences: " + this.noSeqs);
++              Enumeration accs = seqs.keys();
++              while (accs.hasMoreElements())
++              {
++                String acc = (String) accs.nextElement();
++                // logger.debug("Processing sequence " + acc);
++                String seq = (String) seqs.remove(acc);
++                if (maxLength < seq.length())
++                {
++                  maxLength = seq.length();
++                }
++                int start = 1;
++                int end = -1;
++                String sid = acc;
++                /*
+            * Retrieve hash of annotations for this accession Associate
+            * Annotation with accession
 -           */
 -          Hashtable accAnnotations = null;
 -
 -          if (seqAnn != null && seqAnn.containsKey(acc))
 -          {
 -            accAnnotations = (Hashtable) seqAnn.remove(acc);
 -            // TODO: add structures to sequence
 -          }
 -
 -          // Split accession in id and from/to
 -          if (p.search(acc))
 -          {
 -            sid = p.stringMatched(1);
 -            start = Integer.parseInt(p.stringMatched(2));
 -            end = Integer.parseInt(p.stringMatched(3));
 -          }
 -          // logger.debug(sid + ", " + start + ", " + end);
 -
 -          Sequence seqO = new Sequence(sid, seq, start, end);
 -          // Add Description (if any)
 -          if (accAnnotations != null && accAnnotations.containsKey("DE"))
 -          {
 -            String desc = (String) accAnnotations.get("DE");
 -            seqO.setDescription((desc == null) ? "" : desc);
 -          }
 -
 -          // Add DB References (if any)
 -          if (accAnnotations != null && accAnnotations.containsKey("DR"))
 -          {
 -            String dbr = (String) accAnnotations.get("DR");
 -            if (dbr != null && dbr.indexOf(";") > -1)
 -            {
 -              String src = dbr.substring(0, dbr.indexOf(";"));
 -              String acn = dbr.substring(dbr.indexOf(";") + 1);
 -              jalview.util.DBRefUtils.parseToDbRef(seqO, src, "0", acn);
 -            }
 -          }
++                 */
++                Hashtable accAnnotations = null;
++      
++                if (seqAnn != null && seqAnn.containsKey(acc))
++                {
++                  accAnnotations = (Hashtable) seqAnn.remove(acc);
++                  //TODO: add structures to sequence
++                }
++      
++                // Split accession in id and from/to
++                if (p.search(acc))
++                {
++                  sid = p.stringMatched(1);
++                  start = Integer.parseInt(p.stringMatched(2));
++                  end = Integer.parseInt(p.stringMatched(3));
++                }
++                // logger.debug(sid + ", " + start + ", " + end);
++      
++                Sequence seqO = new Sequence(sid, seq, start, end);
++                // Add Description (if any)
++                if (accAnnotations != null && accAnnotations.containsKey("DE"))
++                {
++                  String desc = (String) accAnnotations.get("DE");
++                  seqO.setDescription((desc == null) ? "" : desc);
++                }
++                // Add DB References (if any)
++                if (accAnnotations != null && accAnnotations.containsKey("DR"))
++                {
++                  String dbr = (String) accAnnotations.get("DR");
++                  if (dbr != null && dbr.indexOf(";") > -1)
++                  {
++                    String src = dbr.substring(0, dbr.indexOf(";"));
++                    String acn = dbr.substring(dbr.indexOf(";") + 1);
++                    jalview.util.DBRefUtils.parseToDbRef(seqO, src, "0", acn);
++                  }
++                }        
+           if (accAnnotations != null && accAnnotations.containsKey("AC"))
+           {
+             if (dbsource != null)
+             {
+               String dbr = (String) accAnnotations.get("AC");
+               if (dbr != null)
 -              {
++                {
+                 // we could get very clever here - but for now - just try to guess accession type from source of alignment plus structure of accession
+                 guessDatabaseFor(seqO, dbr, dbsource);
 -                
 -              }
 -            } 
++                        
++                          }
++                }
+             // else - do what ?  add the data anyway and prompt the user to specify what references these are ?
+           }
 -
 -          Hashtable features = null;
 -          // We need to adjust the positions of all features to account for gaps
 -          try
 -          {
 -            features = (Hashtable) accAnnotations.remove("features");
 -          } catch (java.lang.NullPointerException e)
 -          {
 -            // loggerwarn("Getting Features for " + acc + ": " +
 -            // e.getMessage());
 -            // continue;
 -          }
 -          // if we have features
 -          if (features != null)
 -          {
 -            int posmap[] = seqO.findPositionMap();
 -            Enumeration i = features.keys();
 -            while (i.hasMoreElements())
 -            {
 -              // TODO: parse out secondary structure annotation as annotation
 -              // row
 -              // TODO: parse out scores as annotation row
 -              // TODO: map coding region to core jalview feature types
 -              String type = i.nextElement().toString();
 -              Hashtable content = (Hashtable) features.remove(type);
++              
++                Hashtable features = null;
++                // We need to adjust the positions of all features to account for gaps
++                try
++                {
++                  features = (Hashtable) accAnnotations.remove("features");
++                } catch (java.lang.NullPointerException e)
++                {
++                  // loggerwarn("Getting Features for " + acc + ": " +
++                  // e.getMessage());
++                  // continue;
++                }
++                // if we have features
++                if (features != null)
++                {
++                  int posmap[] = seqO.findPositionMap();
++                  Enumeration i = features.keys();
++                  while (i.hasMoreElements())
++                  {
++                    // TODO: parse out secondary structure annotation as annotation
++                    // row
++                    // TODO: parse out scores as annotation row
++                    // TODO: map coding region to core jalview feature types
++                    String type = i.nextElement().toString();
++                    Hashtable content = (Hashtable) features.remove(type);
+               // add alignment annotation for this feature
+               String key = type2id(type);
+               if (key != null)
+               {
+                 if (accAnnotations != null
+                         && accAnnotations.containsKey(key))
+                 {
+                   Vector vv = (Vector) accAnnotations.get(key);
+                   for (int ii = 0; ii < vv.size(); ii++)
+                   {
+                     AlignmentAnnotation an = (AlignmentAnnotation) vv
+                             .elementAt(ii);
+                     seqO.addAlignmentAnnotation(an);
+                   }
+                 }
+               }
 -              Enumeration j = content.keys();
 -              while (j.hasMoreElements())
 -              {
 -                String desc = j.nextElement().toString();
 -                String ns = content.get(desc).toString();
 -                char[] byChar = ns.toCharArray();
 -                for (int k = 0; k < byChar.length; k++)
 -                {
 -                  char c = byChar[k];
 -                  if (!(c == ' ' || c == '_' || c == '-' || c == '.')) // PFAM
 -                  // uses
 -                  // '.'
 -                  // for
 -                  // feature
 -                  // background
 -                  {
 -                    int new_pos = posmap[k]; // look up nearest seqeunce
 -                    // position to this column
 -                    SequenceFeature feat = new SequenceFeature(type, desc,
 -                            new_pos, new_pos, 0f, null);
 -
 -                    seqO.addSequenceFeature(feat);
 -                  }
 -                }
 -              }
 -
 -            }
 -
 -          }
 -          // garbage collect
 -
 -          // logger.debug("Adding seq " + acc + " from " + start + " to " + end
 -          // + ": " + seq);
 -          this.seqs.addElement(seqO);
 -        }
 -        return; // finished parsing this segment of source
 -      }
 -      else if (!r.search(line))
 -      {
 -        // System.err.println("Found sequence line: " + line);
 -
 -        // Split sequence in sequence and accession parts
 -        if (!x.search(line))
 -        {
 -          // logger.error("Could not parse sequence line: " + line);
 -          throw new IOException("Could not parse sequence line: " + line);
 -        }
 -        String ns = (String) seqs.get(x.stringMatched(1));
 -        if (ns == null)
 -        {
 -          ns = "";
 -        }
 -        ns += x.stringMatched(2);
 -
 -        seqs.put(x.stringMatched(1), ns);
 -      }
 -      else
 -      {
 -        String annType = r.stringMatched(1);
 -        String annContent = r.stringMatched(2);
 -
 -        // System.err.println("type:" + annType + " content: " + annContent);
 -
 -        if (annType.equals("GF"))
 -        {
 -          /*
 -           * Generic per-File annotation, free text Magic features: #=GF NH
 -           * <tree in New Hampshire eXtended format> #=GF TN <Unique identifier
 -           * for the next tree> Pfam descriptions: 7. DESCRIPTION OF FIELDS
 -           * 
 -           * Compulsory fields: ------------------
 -           * 
 -           * AC Accession number: Accession number in form PFxxxxx.version or
 -           * PBxxxxxx. ID Identification: One word name for family. DE
 -           * Definition: Short description of family. AU Author: Authors of the
 -           * entry. SE Source of seed: The source suggesting the seed members
 -           * belong to one family. GA Gathering method: Search threshold to
 -           * build the full alignment. TC Trusted Cutoff: Lowest sequence score
 -           * and domain score of match in the full alignment. NC Noise Cutoff:
 -           * Highest sequence score and domain score of match not in full
 -           * alignment. TP Type: Type of family -- presently Family, Domain,
 -           * Motif or Repeat. SQ Sequence: Number of sequences in alignment. AM
 -           * Alignment Method The order ls and fs hits are aligned to the model
 -           * to build the full align. // End of alignment.
 -           * 
 -           * Optional fields: ----------------
 -           * 
 -           * DC Database Comment: Comment about database reference. DR Database
 -           * Reference: Reference to external database. RC Reference Comment:
 -           * Comment about literature reference. RN Reference Number: Reference
 -           * Number. RM Reference Medline: Eight digit medline UI number. RT
 -           * Reference Title: Reference Title. RA Reference Author: Reference
 -           * Author RL Reference Location: Journal location. PI Previous
 -           * identifier: Record of all previous ID lines. KW Keywords: Keywords.
 -           * CC Comment: Comments. NE Pfam accession: Indicates a nested domain.
 -           * NL Location: Location of nested domains - sequence ID, start and
 -           * end of insert.
 -           * 
 -           * Obsolete fields: ----------- AL Alignment method of seed: The
 -           * method used to align the seed members.
 -           */
 -          // Let's save the annotations, maybe we'll be able to do something
 -          // with them later...
 -          Regex an = new Regex("(\\w+)\\s*(.*)");
 -          if (an.search(annContent))
 -          {
 -            if (an.stringMatched(1).equals("NH"))
 -            {
 -              treeString.append(an.stringMatched(2));
 -            }
 -            else if (an.stringMatched(1).equals("TN"))
 -            {
 -              if (treeString.length() > 0)
 -              {
 -                if (treeName == null)
 -                {
 -                  treeName = "Tree " + (getTreeCount() + 1);
 -                }
 -                addNewickTree(treeName, treeString.toString());
 -              }
 -              treeName = an.stringMatched(2);
 -              treeString = new StringBuffer();
 -            }
 -            setAlignmentProperty(an.stringMatched(1), an.stringMatched(2));
 -          }
 -        }
 -        else if (annType.equals("GS"))
 -        {
 -          // Generic per-Sequence annotation, free text
 -          /*
 -           * Pfam uses these features: Feature Description ---------------------
 -           * ----------- AC <accession> ACcession number DE <freetext>
 -           * DEscription DR <db>; <accession>; Database Reference OS <organism>
 -           * OrganiSm (species) OC <clade> Organism Classification (clade, etc.)
 -           * LO <look> Look (Color, etc.)
 -           */
 -          if (s.search(annContent))
 -          {
 -            String acc = s.stringMatched(1);
 -            String type = s.stringMatched(2);
 -            String content = s.stringMatched(3);
 -            // TODO: store DR in a vector.
 -            // TODO: store AC according to generic file db annotation.
 -            Hashtable ann;
 -            if (seqAnn.containsKey(acc))
 -            {
 -              ann = (Hashtable) seqAnn.get(acc);
 -            }
 -            else
 -            {
 -              ann = new Hashtable();
 -            }
 -            ann.put(type, content);
 -            seqAnn.put(acc, ann);
 -          }
 -          else
 -          {
 -            throw new IOException("Error parsing " + line);
 -          }
 -        }
 -        else if (annType.equals("GC"))
 -        {
 -          // Generic per-Column annotation, exactly 1 char per column
 -          // always need a label.
 -          if (x.search(annContent))
 -          {
 -            // parse out and create alignment annotation directly.
 -            parseAnnotationRow(annotations, x.stringMatched(1),
 -                    x.stringMatched(2));
 -          }
 -        }
 -        else if (annType.equals("GR"))
 -        {
 -          // Generic per-Sequence AND per-Column markup, exactly 1 char per
 -          // column
 -          /*
 -           * Feature Description Markup letters ------- -----------
 -           * -------------- SS Secondary Structure [HGIEBTSCX] SA Surface
 -           * Accessibility [0-9X] (0=0%-10%; ...; 9=90%-100%) TM TransMembrane
 -           * [Mio] PP Posterior Probability [0-9*] (0=0.00-0.05; 1=0.05-0.15;
 -           * *=0.95-1.00) LI LIgand binding [*] AS Active Site [*] IN INtron (in
 -           * or after) [0-2]
 -           */
 -          if (s.search(annContent))
 -          {
 -            String acc = s.stringMatched(1);
 -            String type = s.stringMatched(2);
 -            String seq = new String(s.stringMatched(3));
 -            String description = null;
 -            // Check for additional information about the current annotation
 -            // We use a simple string tokenizer here for speed
 -            StringTokenizer sep = new StringTokenizer(seq, " \t");
 -            description = sep.nextToken();
 -            if (sep.hasMoreTokens())
 -            {
 -              seq = sep.nextToken();
 -            }
 -            else
 -            {
 -              seq = description;
 -              description = new String();
 -            }
 -            // sequence id with from-to fields
 -
 -            Hashtable ann;
 -            // Get an object with all the annotations for this sequence
 -            if (seqAnn.containsKey(acc))
 -            {
 -              // logger.debug("Found annotations for " + acc);
 -              ann = (Hashtable) seqAnn.get(acc);
 -            }
 -            else
 -            {
 -              // logger.debug("Creating new annotations holder for " + acc);
 -              ann = new Hashtable();
 -              seqAnn.put(acc, ann);
 -            }
++                    Enumeration j = content.keys();
++                    while (j.hasMoreElements())
++                    {
++                      String desc = j.nextElement().toString();
++                      String ns = content.get(desc).toString();
++                      char[] byChar = ns.toCharArray();
++                      for (int k = 0; k < byChar.length; k++)
++                      {
++                        char c = byChar[k];
++                        if (!(c == ' ' || c == '_' || c == '-' || c == '.')) // PFAM
++                        // uses
++                        // '.'
++                        // for
++                        // feature
++                        // background
++                        {
++                          int new_pos = posmap[k]; // look up nearest seqeunce
++                          // position to this column
++                          SequenceFeature feat = new SequenceFeature(type, desc,
++                                  new_pos, new_pos, 0f, null);
++      
++                          seqO.addSequenceFeature(feat);
++                        }
++                      }
++                    }
++      
++                  }
++      
++                }
++                // garbage collect
++      
++                // logger.debug("Adding seq " + acc + " from " + start + " to " + end
++                // + ": " + seq);
++                this.seqs.addElement(seqO);
++              }
++              return; // finished parsing this segment of source
++            }
++            else if (!r.search(line))
++            {
++              // System.err.println("Found sequence line: " + line);
++      
++              // Split sequence in sequence and accession parts
++              if (!x.search(line))
++              {
++                // logger.error("Could not parse sequence line: " + line);
++                throw new IOException("Could not parse sequence line: " + line);
++              }
++              String ns = (String) seqs.get(x.stringMatched(1));
++              if (ns == null)
++              {
++                ns = "";
++              }
++              ns += x.stringMatched(2);
++      
++              seqs.put(x.stringMatched(1), ns);
++            }
++            else
++            {
++              String annType = r.stringMatched(1);
++              String annContent = r.stringMatched(2);
++      
++              // System.err.println("type:" + annType + " content: " + annContent);
++      
++              if (annType.equals("GF"))
++              {
++                /*
++                 * Generic per-File annotation, free text Magic features: #=GF NH
++                 * <tree in New Hampshire eXtended format> #=GF TN <Unique identifier
++                 * for the next tree> Pfam descriptions: 7. DESCRIPTION OF FIELDS
++                 * 
++                 * Compulsory fields: ------------------
++                 * 
++                 * AC Accession number: Accession number in form PFxxxxx.version or
++                 * PBxxxxxx. ID Identification: One word name for family. DE
++                 * Definition: Short description of family. AU Author: Authors of the
++                 * entry. SE Source of seed: The source suggesting the seed members
++                 * belong to one family. GA Gathering method: Search threshold to
++                 * build the full alignment. TC Trusted Cutoff: Lowest sequence score
++                 * and domain score of match in the full alignment. NC Noise Cutoff:
++                 * Highest sequence score and domain score of match not in full
++                 * alignment. TP Type: Type of family -- presently Family, Domain,
++                 * Motif or Repeat. SQ Sequence: Number of sequences in alignment. AM
++                 * Alignment Method The order ls and fs hits are aligned to the model
++                 * to build the full align. // End of alignment.
++                 * 
++                 * Optional fields: ----------------
++                 * 
++                 * DC Database Comment: Comment about database reference. DR Database
++                 * Reference: Reference to external database. RC Reference Comment:
++                 * Comment about literature reference. RN Reference Number: Reference
++                 * Number. RM Reference Medline: Eight digit medline UI number. RT
++                 * Reference Title: Reference Title. RA Reference Author: Reference
++                 * Author RL Reference Location: Journal location. PI Previous
++                 * identifier: Record of all previous ID lines. KW Keywords: Keywords.
++                 * CC Comment: Comments. NE Pfam accession: Indicates a nested domain.
++                 * NL Location: Location of nested domains - sequence ID, start and
++                 * end of insert.
++                 * 
++                 * Obsolete fields: ----------- AL Alignment method of seed: The
++                 * method used to align the seed members.
++                 */
++                // Let's save the annotations, maybe we'll be able to do something
++                // with them later...
++                Regex an = new Regex("(\\w+)\\s*(.*)");
++                if (an.search(annContent))
++                {
++                  if (an.stringMatched(1).equals("NH"))
++                  {
++                    treeString.append(an.stringMatched(2));
++                  }
++                  else if (an.stringMatched(1).equals("TN"))
++                  {
++                    if (treeString.length() > 0)
++                    {
++                      if (treeName == null)
++                      {
++                        treeName = "Tree " + (getTreeCount() + 1);
++                      }
++                      addNewickTree(treeName, treeString.toString());
++                    }
++                    treeName = an.stringMatched(2);
++                    treeString = new StringBuffer();
++                  }
++                  setAlignmentProperty(an.stringMatched(1), an.stringMatched(2));
++                }
++              }
++              else if (annType.equals("GS"))
++              {
++                // Generic per-Sequence annotation, free text
++                /*
++                 * Pfam uses these features: Feature Description ---------------------
++                 * ----------- AC <accession> ACcession number DE <freetext>
++                 * DEscription DR <db>; <accession>; Database Reference OS <organism>
++                 * OrganiSm (species) OC <clade> Organism Classification (clade, etc.)
++                 * LO <look> Look (Color, etc.)
++                 */
++                if (s.search(annContent))
++                {
++                  String acc = s.stringMatched(1);
++                  String type = s.stringMatched(2);
++                  String content = s.stringMatched(3);
++                  // TODO: store DR in a vector.
++                  // TODO: store AC according to generic file db annotation.
++                  Hashtable ann;
++                  if (seqAnn.containsKey(acc))
++                  {
++                    ann = (Hashtable) seqAnn.get(acc);
++                  }
++                  else
++                  {
++                    ann = new Hashtable();
++                  }
++                  ann.put(type, content);
++                  seqAnn.put(acc, ann);
++                }
++                else
++                {
++                  throw new IOException("Error parsing " + line);
++                }
++              }
++              else if (annType.equals("GC"))
++              {
++                // Generic per-Column annotation, exactly 1 char per column
++                // always need a label.
++                if (x.search(annContent))
++                {
++                  // parse out and create alignment annotation directly.
++                  parseAnnotationRow(annotations, x.stringMatched(1),
++                          x.stringMatched(2));
++                }
++              }
++              else if (annType.equals("GR"))
++              {
++                // Generic per-Sequence AND per-Column markup, exactly 1 char per
++                // column
++                /*
++                 * Feature Description Markup letters ------- -----------
++                 * -------------- SS Secondary Structure [HGIEBTSCX] SA Surface
++                 * Accessibility [0-9X] (0=0%-10%; ...; 9=90%-100%) TM TransMembrane
++                 * [Mio] PP Posterior Probability [0-9*] (0=0.00-0.05; 1=0.05-0.15;
++                 * *=0.95-1.00) LI LIgand binding [*] AS Active Site [*] IN INtron (in
++                 * or after) [0-2]
++                 */
++                if (s.search(annContent))
++                {
++                  String acc = s.stringMatched(1);
++                  String type = s.stringMatched(2);
++                  String seq = new String(s.stringMatched(3));
++                  String description = null;
++                  // Check for additional information about the current annotation
++                  // We use a simple string tokenizer here for speed
++                  StringTokenizer sep = new StringTokenizer(seq, " \t");
++                  description = sep.nextToken();
++                  if (sep.hasMoreTokens())
++                  {
++                    seq = sep.nextToken();
++                  }
++                  else
++                  {
++                    seq = description;
++                    description = new String();
++                  }
++                  // sequence id with from-to fields
++      
++                  Hashtable ann;
++                  // Get an object with all the annotations for this sequence
++                  if (seqAnn.containsKey(acc))
++                  {
++                    // logger.debug("Found annotations for " + acc);
++                    ann = (Hashtable) seqAnn.get(acc);
++                  }
++                  else
++                  {
++                    // logger.debug("Creating new annotations holder for " + acc);
++                    ann = new Hashtable();
++                    seqAnn.put(acc, ann);
++                  }
+             // TODO test structure, call parseAnnotationRow with vector from
+             // hashtable for specific sequence
 -            Hashtable features;
 -            // Get an object with all the content for an annotation
 -            if (ann.containsKey("features"))
 -            {
 -              // logger.debug("Found features for " + acc);
 -              features = (Hashtable) ann.get("features");
 -            }
 -            else
 -            {
 -              // logger.debug("Creating new features holder for " + acc);
 -              features = new Hashtable();
 -              ann.put("features", features);
 -            }
++                  Hashtable features;
++                  // Get an object with all the content for an annotation
++                  if (ann.containsKey("features"))
++                  {
++                    // logger.debug("Found features for " + acc);
++                    features = (Hashtable) ann.get("features");
++                  }
++                  else
++                  {
++                    // logger.debug("Creating new features holder for " + acc);
++                    features = new Hashtable();
++                    ann.put("features", features);
++                  }
++      
++                  Hashtable content;
++                  if (features.containsKey(this.id2type(type)))
++                  {
++                    // logger.debug("Found content for " + this.id2type(type));
++                    content = (Hashtable) features.get(this.id2type(type));
++                  }
++                  else
++                  {
++                    // logger.debug("Creating new content holder for " +
++                    // this.id2type(type));
++                    content = new Hashtable();
++                    features.put(this.id2type(type), content);
++                  }
++                  String ns = (String) content.get(description);
++                  if (ns == null)
++                  {
++                    ns = "";
++                  }
++                  ns += seq;
++                  content.put(description, ns);
++      
++//                if(type.equals("SS")){
++                      Hashtable strucAnn;
++                      if (seqAnn.containsKey(acc))
++                      {
++                        strucAnn = (Hashtable) seqAnn.get(acc);
++                      }
++                      else
++                      {
++                        strucAnn = new Hashtable();
++                      }
++                      
++                      Vector newStruc=new Vector();
++                      parseAnnotationRow(newStruc, type,ns);
++                      
++                      strucAnn.put(type, newStruc);
++                      seqAnn.put(acc, strucAnn);
++                   }
++//              }
++                      else
++                      {
++                                              System.err
++                                              .println("Warning - couldn't parse sequence annotation row line:\n"
++                                              + line);
++                      // throw new IOException("Error parsing " + line);
++                      }
++                      }
++                      else
++                      {
++                      throw new IOException("Unknown annotation detected: " + annType
++                              + " " + annContent);
++                      }
++                      }
++              }
++              if (treeString.length() > 0)
++              {
++              if (treeName == null)
++              {
++                      treeName = "Tree " + (1 + getTreeCount());
++              }
++              addNewickTree(treeName, treeString.toString());
++              }
++      }
 -            Hashtable content;
 -            if (features.containsKey(this.id2type(type)))
 -            {
 -              // logger.debug("Found content for " + this.id2type(type));
 -              content = (Hashtable) features.get(this.id2type(type));
 -            }
 -            else
 -            {
 -              // logger.debug("Creating new content holder for " +
 -              // this.id2type(type));
 -              content = new Hashtable();
 -              features.put(this.id2type(type), content);
 -            }
 -            String ns = (String) content.get(description);
 -            if (ns == null)
 -            {
 -              ns = "";
 -            }
 -            ns += seq;
 -            content.put(description, ns);
 -            Hashtable strucAnn;
 -            if (seqAnn.containsKey(acc))
 -            {
 -              strucAnn = (Hashtable) seqAnn.get(acc);
 -            }
 -            else
 -            {
 -              strucAnn = new Hashtable();
 -            }
 -
 -            Vector newStruc = new Vector();
 -            parseAnnotationRow(newStruc, type, ns);
 -            strucAnn.put(type, newStruc);
 -            seqAnn.put(acc, strucAnn);
 -          }
 -          else
 -          {
 -            System.err
 -                    .println("Warning - couldn't parse sequence annotation row line:\n"
 -                            + line);
 -            // throw new IOException("Error parsing " + line);
 -          }
 -        }
 -        else
 -        {
 -          throw new IOException("Unknown annotation detected: " + annType
 -                  + " " + annContent);
 -        }
 -      }
 -    }
 -    if (treeString.length() > 0)
 -    {
 -      if (treeName == null)
 -      {
 -        treeName = "Tree " + (1 + getTreeCount());
 -      }
 -      addNewickTree(treeName, treeString.toString());
 -    }
 -  }
 -
 -  /**
++/**
+    * Demangle an accession string and guess the originating sequence database for a given sequence
+    * @param seqO sequence to be annotated
+    * @param dbr Accession string for sequence
+    * @param dbsource source database for alignment (PFAM or RFAM)
+    */
+   private void guessDatabaseFor(Sequence seqO, String dbr, String dbsource)
+   {
+     DBRefEntry dbrf=null;
+     List<DBRefEntry> dbrs=new ArrayList<DBRefEntry>();
+     String seqdb="Unknown",sdbac=""+dbr;
+     int st=-1,en=-1,p;
+     if ((st=sdbac.indexOf("/"))>-1)
+     {
+       String num,range=sdbac.substring(st+1);
+       sdbac = sdbac.substring(0,st);
+       if ((p=range.indexOf("-"))>-1)
+       {
+         p++;
+         if (p<range.length())
+         {
+         num = range.substring(p).trim();
+         try {
+           en = Integer.parseInt(num);
+         } catch (NumberFormatException x)
+         {
+           // could warn here that index is invalid
+           en = -1;
+         }
+         }
+       } else {
+         p=range.length();
+       }
+       num=range.substring(0,p).trim();
+       try {
+         st = Integer.parseInt(num);
+       } catch (NumberFormatException x)
+       {
+         // could warn here that index is invalid
+         st = -1;
+       }
+     }
+     if (dbsource.equals("PFAM")) {
+       seqdb = "UNIPROT";
+       if (sdbac.indexOf(".")>-1)
+       {
+         // strip of last subdomain
+         sdbac = sdbac.substring(0,sdbac.indexOf("."));
+         dbrf = jalview.util.DBRefUtils.parseToDbRef(seqO, seqdb, dbsource, sdbac);
+         if (dbrf!=null)
+         {
+           dbrs.add(dbrf);
+         }
+       }
+       dbrf = jalview.util.DBRefUtils.parseToDbRef(seqO, dbsource, dbsource, dbr);
+       if (dbr!=null)
+       {
+         dbrs.add(dbrf);
+       }
+     } else {
+       seqdb = "EMBL"; // total guess - could be ENA, or something else these days
+       if (sdbac.indexOf(".")>-1)
+       {
+         // strip off last subdomain
+         sdbac = sdbac.substring(0,sdbac.indexOf("."));
+         dbrf = jalview.util.DBRefUtils.parseToDbRef(seqO, seqdb, dbsource, sdbac);
+         if (dbrf!=null)
+         {
+           dbrs.add(dbrf);
+         }
+       }
+       
+       dbrf = jalview.util.DBRefUtils.parseToDbRef(seqO, dbsource, dbsource, dbr);
+       if (dbrf!=null)
+       {
+         dbrs.add(dbrf);
+       }
+     }
+     if (st!=-1 && en!=-1)
+     {
+       for (DBRefEntry d:dbrs)
+       {
+         jalview.util.MapList mp = new jalview.util.MapList(new int[] { seqO.getStart(),seqO.getEnd()},new int[] { st,en},1,1);
+         jalview.datamodel.Mapping mping = new Mapping(mp);
+         d.setMap(mping);
+       }
+     }
+   }
+   protected static AlignmentAnnotation parseAnnotationRow(
+           Vector annotation, String label, String annots)
+   {
+     String convert1, convert2 = null;
+     // Convert all bracket types to parentheses
+     Regex openparen = new Regex("(<|\\[)", "(");
+     Regex closeparen = new Regex("(>|\\])", ")");
+     // Detect if file is RNA by looking for bracket types
+     Regex detectbrackets = new Regex("(<|>|\\[|\\]|\\(|\\))");
+     convert1 = openparen.replaceAll(annots);
+     convert2 = closeparen.replaceAll(convert1);
+     annots = convert2;
+     String type = label;
+     if (label.contains("_cons"))
+     {
+       type = (label.indexOf("_cons") == label.length() - 5) ? label
+               .substring(0, label.length() - 5) : label;
+     }
+     boolean ss = false;
+     type = id2type(type);
+     if (type.equals("secondary structure"))
+     {
+       ss = true;
+     }
+     // decide on secondary structure or not.
+     Annotation[] els = new Annotation[annots.length()];
+     for (int i = 0; i < annots.length(); i++)
+     {
+       String pos = annots.substring(i, i + 1);
+       Annotation ann;
+       ann = new Annotation(pos, "", ' ', 0f); // 0f is 'valid' null - will not
+       // be written out
+       if (ss)
+       {
+         if (detectbrackets.search(pos))
+         {
+           ann.secondaryStructure = jalview.schemes.ResidueProperties
+                   .getRNASecStrucState(pos).charAt(0);
+         }
+         else
+         {
+           ann.secondaryStructure = jalview.schemes.ResidueProperties
+                   .getDssp3state(pos).charAt(0);
+         }
+         if (ann.secondaryStructure == pos.charAt(0) || pos.charAt(0) == 'C')
+         {
+           ann.displayCharacter = ""; // null; // " ";
+         }
+         else
+         {
+           ann.displayCharacter = " " + ann.displayCharacter;
+         }
+       }
+       els[i] = ann;
+     }
+     AlignmentAnnotation annot = null;
+     Enumeration e = annotation.elements();
+     while (e.hasMoreElements())
+     {
+       annot = (AlignmentAnnotation) e.nextElement();
+       if (annot.label.equals(type))
+         break;
+       annot = null;
+     }
+     if (annot == null)
+     {
+       annot = new AlignmentAnnotation(type, type, els);
+       annotation.addElement(annot);
+     }
+     else
+     {
+       Annotation[] anns = new Annotation[annot.annotations.length
+               + els.length];
+       System.arraycopy(annot.annotations, 0, anns, 0,
+               annot.annotations.length);
+       System.arraycopy(els, 0, anns, annot.annotations.length, els.length);
+       annot.annotations = anns;
+       // System.out.println("else: ");
+     }
+     return annot;
+   }
    public String print(SequenceI[] s)
    {
      // find max length of id
              seq += ch;
            }
            else if (ch.length() > 1)
-   {\r
 -          {
++  {
              seq += ch.charAt(1);
            }
          }
        }
      }
      return out.toString();
-   }\r
\r
-   public String print()\r
-   {\r
+   }
+   public String print()
+   {
      out = new StringBuffer();
      out.append("# STOCKHOLM 1.0");
      out.append(newline);
      out.append("//");
      out.append(newline);
      return out.toString();
-   }\r
\r
-   private static Hashtable typeIds = null;\r
-   static\r
-   {\r
-     if (typeIds == null)\r
-     {\r
-       typeIds = new Hashtable();\r
-       typeIds.put("SS", "secondary structure");\r
-       typeIds.put("SA", "surface accessibility");\r
-       typeIds.put("TM", "transmembrane");\r
-       typeIds.put("PP", "posterior probability");\r
-       typeIds.put("LI", "ligand binding");\r
-       typeIds.put("AS", "active site");\r
-       typeIds.put("IN", "intron");\r
-       typeIds.put("IR", "interacting residue");\r
-       typeIds.put("AC", "accession");\r
-       typeIds.put("OS", "organism");\r
-       typeIds.put("CL", "class");\r
-       typeIds.put("DE", "description");\r
-       typeIds.put("DR", "reference");\r
-       typeIds.put("LO", "look");\r
-       typeIds.put("RF", "reference positions");\r
\r
-     }\r
-   }\r
\r
-   protected static String id2type(String id)\r
-   {\r
-     if (typeIds.containsKey(id))\r
-     {\r
-       return (String) typeIds.get(id);\r
-     }\r
-     System.err.println("Warning : Unknown Stockholm annotation type code "\r
-             + id);\r
-     return id;\r
-   }\r
\r
-   protected static String type2id(String type)\r
-   {\r
-     String key = null;\r
-     Enumeration e = typeIds.keys();\r
-     while (e.hasMoreElements())\r
-     {\r
-       Object ll = e.nextElement();\r
-       if (typeIds.get(ll).toString().equals(type))\r
-       {\r
-         key = (String) ll;\r
-         break;\r
-       }\r
-     }\r
-     if (key != null)\r
-     {\r
-       return (String) key;\r
-     }\r
-     System.err.println("Warning : Unknown Stockholm annotation type: "\r
-             + type);\r
-     return key;\r
    }
-   /**\r
-    * make a friendly ID string.\r
-    * \r
-    * @param dataName\r
-    * @return truncated dataName to after last '/'\r
-    */\r
-   private String safeName(String dataName)\r
-   {\r
-     int b = 0;\r
-     while ((b = dataName.indexOf("/")) > -1 && b < dataName.length())\r
-     {\r
-       dataName = dataName.substring(b + 1).trim();\r
\r
-     }\r
-     int e = (dataName.length() - dataName.indexOf(".")) + 1;\r
-     dataName = dataName.substring(1, e).trim();\r
-     return dataName;\r
-   }\r
- }\r
+   private static Hashtable typeIds = null;
+   static
+   {
+     if (typeIds == null)
+     {
+       typeIds = new Hashtable();
+       typeIds.put("SS", "secondary structure");
+       typeIds.put("SA", "surface accessibility");
+       typeIds.put("TM", "transmembrane");
+       typeIds.put("PP", "posterior probability");
+       typeIds.put("LI", "ligand binding");
+       typeIds.put("AS", "active site");
+       typeIds.put("IN", "intron");
+       typeIds.put("IR", "interacting residue");
+       typeIds.put("AC", "accession");
+       typeIds.put("OS", "organism");
+       typeIds.put("CL", "class");
+       typeIds.put("DE", "description");
+       typeIds.put("DR", "reference");
+       typeIds.put("LO", "look");
+       typeIds.put("RF", "reference positions");
+     }
+   }
+   protected static String id2type(String id)
+   {
+     if (typeIds.containsKey(id))
+     {
+       return (String) typeIds.get(id);
+     }
+     System.err.println("Warning : Unknown Stockholm annotation type code "
+             + id);
+     return id;
+   }
+   protected static String type2id(String type)
+   {
+     String key = null;
+     Enumeration e = typeIds.keys();
+     while (e.hasMoreElements())
+     {
+       Object ll = e.nextElement();
+       if (typeIds.get(ll).toString().equals(type))
+       {
+         key = (String) ll;
+         break;
+       }
+     }
+     if (key != null)
+     {
+       return (String) key;
+     }
+     System.err.println("Warning : Unknown Stockholm annotation type: "
+             + type);
+     return key;
+   }
+   /**
 -   * //ssline is complete secondary structure line private AlignmentAnnotation
 -   * addHelices(Vector annotation, String label, String ssline) {
 -   * 
 -   * // decide on secondary structure or not. Annotation[] els = new
 -   * Annotation[ssline.length()]; for (int i = 0; i < ssline.length(); i++) {
 -   * String pos = ssline.substring(i, i + 1); Annotation ann; ann = new
 -   * Annotation(pos, "", ' ', 0f); // 0f is 'valid' null - will not
++   * make a friendly ID string.
+    * 
 -   * ann.secondaryStructure =
 -   * jalview.schemes.ResidueProperties.getRNAssState(pos).charAt(0);
 -   * 
 -   * ann.displayCharacter = "x" + ann.displayCharacter;
 -   * 
 -   * System.out.println(ann.displayCharacter);
 -   * 
 -   * els[i] = ann; } AlignmentAnnotation helicesAnnot = null; Enumeration e =
 -   * annotation.elements(); while (e.hasMoreElements()) { helicesAnnot =
 -   * (AlignmentAnnotation) e.nextElement(); if (helicesAnnot.label.equals(type))
 -   * break; helicesAnnot = null; } if (helicesAnnot == null) { helicesAnnot =
 -   * new AlignmentAnnotation(type, type, els);
 -   * annotation.addElement(helicesAnnot); } else { Annotation[] anns = new
 -   * Annotation[helicesAnnot.annotations.length + els.length];
 -   * System.arraycopy(helicesAnnot.annotations, 0, anns, 0,
 -   * helicesAnnot.annotations.length); System.arraycopy(els, 0, anns,
 -   * helicesAnnot.annotations.length, els.length); helicesAnnot.annotations =
 -   * anns; }
 -   * 
 -   * helicesAnnot.features = Rna.GetBasePairs(ssline);
 -   * Rna.HelixMap(helicesAnnot.features);
 -   * 
 -   * 
 -   * return helicesAnnot; }
++   * @param dataName
++   * @return truncated dataName to after last '/'
+    */
++  private String safeName(String dataName)
++  {
++    int b = 0;
++    while ((b = dataName.indexOf("/")) > -1 && b < dataName.length())
++    {
++      dataName = dataName.substring(b + 1).trim();
++
++    }
++    int e = (dataName.length() - dataName.indexOf(".")) + 1;
++    dataName = dataName.substring(1, e).trim();
++    return dataName;
++  }
+ }
@@@ -1,5 -1,5 +1,5 @@@
  /*
-  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.1)
   * Copyright (C) 2014 The Jalview Authors
   * 
   * This file is part of Jalview.
@@@ -87,7 -87,9 +87,7 @@@ import java.util.regex.Pattern
   * @author Paolo Di Tommaso
   * 
   */
 -public class TCoffeeScoreFile extends AlignFile
 -{
 -
 +public class TCoffeeScoreFile extends AlignFile {
    public TCoffeeScoreFile(String inFile, String type) throws IOException
    {
      super(inFile, type);
@@@ -1,5 -1,5 +1,5 @@@
  /*
-  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.1)
   * Copyright (C) 2014 The Jalview Authors
   * 
   * This file is part of Jalview.
@@@ -140,8 -140,6 +140,8 @@@ public class GAlignFrame extends JInter
    protected JRadioButtonMenuItem nucleotideColour = new JRadioButtonMenuItem();
  
    protected JRadioButtonMenuItem purinePyrimidineColour = new JRadioButtonMenuItem();
 +  
 +  protected JRadioButtonMenuItem RNAInteractionColour = new JRadioButtonMenuItem();
  
    // protected JRadioButtonMenuItem covariationColour = new
    // JRadioButtonMenuItem();
      colours.add(purinePyrimidineColour);
      // colours.add(covariationColour);
      colours.add(tcoffeeColour);
 -
 +    colours.add(RNAInteractionColour);
      setColourSelected(jalview.bin.Cache
              .getDefault("DEFAULT_COLOUR", "None"));
  
          purinePyrimidineColour.setSelected(true);
  
          break;
 +        
 +      case ColourSchemeProperty.RNAINTERACTION:
 +          RNAInteractionColour.setSelected(true);
 +
 +          break;
        /*
         * case ColourSchemeProperty.COVARIATION:
         * covariationColour.setSelected(true);
                  purinePyrimidineColour_actionPerformed(e);
                }
              });
 +    
 +    RNAInteractionColour.setText("RNA Interaction type");
 +    RNAInteractionColour.addActionListener(new java.awt.event.ActionListener()
 +            {
 +              public void actionPerformed(ActionEvent e)
 +              {
 +                RNAInteractionColour_actionPerformed(e);
 +              }
 +            });
      /*
       * covariationColour.setText("Covariation");
       * covariationColour.addActionListener(new java.awt.event.ActionListener() {
      colourMenu.add(buriedColour);
      colourMenu.add(nucleotideColour);
      colourMenu.add(purinePyrimidineColour);
 +    colourMenu.add(RNAInteractionColour);
      // colourMenu.add(covariationColour);
      colourMenu.add(tcoffeeColour);
      colourMenu.add(userDefinedColour);
      colourMenu.add(abovePIDThreshold);
      colourMenu.add(modifyPID);
      colourMenu.add(annotationColour);
 -    colourMenu.add(rnahelicesColour);
 +    colourMenu.add(rnahelicesColour);  
      calculateMenu.add(sort);
      calculateMenu.add(calculateTree);
      calculateMenu.addSeparator();
    protected void purinePyrimidineColour_actionPerformed(ActionEvent e)
    {
    }
 +  
 +  protected void RNAInteractionColour_actionPerformed(ActionEvent e)
 +  {
 +  }
 +  
  
    /*
     * protected void covariationColour_actionPerformed(ActionEvent e) { }
@@@ -1,5 -1,5 +1,5 @@@
  /*
-  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.1)
   * Copyright (C) 2014 The Jalview Authors
   * 
   * This file is part of Jalview.
@@@ -129,7 -129,6 +129,7 @@@ public class GDesktop extends JFram
     */
    private void jbInit() throws Exception
    {
 +       
      FileMenu.setText(MessageManager.getString("action.file"));
      HelpMenu.setText(MessageManager.getString("action.help"));
      VamsasMenu.setText("Vamsas");
@@@ -1,5 -1,5 +1,5 @@@
  /*
-  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.1)
   * Copyright (C) 2014 The Jalview Authors
   * 
   * This file is part of Jalview.
@@@ -83,7 -83,6 +83,7 @@@ public class AnnotationRendere
      // If a closing base pair half of the stem, display a backward arrow
      if (column > 0 && closeparen.search(dc))
      {
 +      
        if (diffupstream)
        // if (validRes && column>1 && row_annotations[column-2]!=null &&
        // dc.equals(row_annotations[column-2].displayCharacter))
      }
      else
      {
 +      
        // display a forward arrow
        if (diffdownstream)
        {
     * master flag indicating if renderer should ever try to clip. not enabled for jalview 2.8.1 
     */
    private boolean canClip=false;
 +
    
 +  public void drawNotCanonicalAnnot(Graphics g, Color nonCanColor, Annotation[] row_annotations,
 +          int lastSSX, int x, int y, int iconOffset, int startRes,
 +          int column, boolean validRes, boolean validEnd)
 +  {
 +      //System.out.println(nonCanColor);
 +      
 +    g.setColor(nonCanColor);
 +    int sCol = (lastSSX / charWidth) + startRes;
 +    int x1 = lastSSX;
 +    int x2 = (x * charWidth);
 +    Regex closeparen = new Regex("}|]|<|[a-z]");
 +    
 +    String dc = (column == 0 || row_annotations[column - 1] == null) ? ""
 +            : row_annotations[column - 1].displayCharacter;
 +
 +    boolean diffupstream = sCol == 0 || row_annotations[sCol - 1] == null
 +            || !dc.equals(row_annotations[sCol - 1].displayCharacter);
 +    boolean diffdownstream = !validRes || !validEnd
 +            || row_annotations[column] == null
 +            || !dc.equals(row_annotations[column].displayCharacter);
 +    // System.out.println("Column "+column+" diff up: "+diffupstream+" down:"+diffdownstream);
 +    // If a closing base pair half of the stem, display a backward arrow
 +    if (column > 0 && closeparen.search(dc))//  closeletter_b.search(dc)||closeletter_c.search(dc)||closeletter_d.search(dc)||closecrochet.search(dc)) )
 +    {
 +      
 +      if (diffupstream)
 +      // if (validRes && column>1 && row_annotations[column-2]!=null &&
 +      // dc.equals(row_annotations[column-2].displayCharacter))
 +      {
 +        g.fillPolygon(new int[]
 +        { lastSSX + 5, lastSSX + 5, lastSSX }, new int[]
 +        { y + iconOffset, y + 14 + iconOffset, y + 8 + iconOffset }, 3);
 +        x1 += 5;
 +      }
 +      if (diffdownstream)
 +      {
 +        x2 -= 1;
 +      }
 +    }
 +    else
 +    {
 +      
 +      // display a forward arrow
 +      if (diffdownstream)
 +      {
 +        g.fillPolygon(new int[]
 +        { x2 - 5, x2 - 5, x2 }, new int[]
 +        { y + iconOffset, y + 14 + iconOffset, y + 8 + iconOffset }, 3);
 +        x2 -= 5;
 +      }
 +      if (diffupstream)
 +      {
 +        x1 += 1;
 +      }
 +    }
 +    // draw arrow body
 +    g.fillRect(x1, y + 4 + iconOffset, x2 - x1, 7);
 +  }
    // public void updateFromAnnotationPanel(FontMetrics annotFM, AlignViewportI
    // av)
    public void updateFromAwtRenderPanel(AwtRenderPanelI annotPanel,
      updateFromAwtRenderPanel(annotPanel, av);
      fm = g.getFontMetrics();
      AlignmentAnnotation[] aa = av.getAlignment().getAlignmentAnnotation();
 +    int temp = 0;
      if (aa==null)
      {
        return false;
                                      .equals(row_annotations[column - 1].displayCharacter) || (row_annotations[column].displayCharacter
                              .length() < 2 && row_annotations[column].secondaryStructure == ' ')))
              {
 -              g.drawString(row_annotations[column].displayCharacter, x
 +              g.drawString(row_annotations[column].displayCharacter
 +                        , x
                        * charWidth + charOffset, y + iconOffset);
              }
              g.setFont(ofont);
          if (row.hasIcons)
          {
            char ss = validRes ? row_annotations[column].secondaryStructure
 -                  : ' ';
 -          if (ss == 'S')
 +                  : '-';
 +          
 +          if (ss == '(')
            {
              // distinguish between forward/backward base-pairing
              if (row_annotations[column].displayCharacter.indexOf(')') > -1)
              {
 -              ss = 's';
 +            
 +              ss = ')';
 +              
              }
            }
 -          if (!validRes || (ss != lastSS))
 +           if (ss == '[')
            {
 -            if (x > -1)
 +            if ((row_annotations[column].displayCharacter.indexOf(']') > -1))
              {
 +                ss = ']';
 +                
 +                
 +            }
 +          }
 +           if (ss == '{')
 +           {
 +             // distinguish between forward/backward base-pairing
 +             if (row_annotations[column].displayCharacter.indexOf('}') > -1)
 +             {
 +               ss = '}';
 +               
 +               
 +             }
 +           }
 +           if (ss == '<')
 +           {
 +             // distinguish between forward/backward base-pairing
 +             if (row_annotations[column].displayCharacter.indexOf('<') > -1)
 +             {
 +               ss = '>';
 +               
 +               
 +             }
 +           }
 +           if (ss >=65)
 +           {
 +             // distinguish between forward/backward base-pairing
 +             if (row_annotations[column].displayCharacter.indexOf(ss+32) > -1)
 +             {
 +              
 +               ss = (char) (ss+32);
 +               
 +               
 +             }
 +           }
 +           
 +               
 +          if (!validRes || (ss != lastSS))
 +             {
 +               
 +               
 +            if (x > -1)
 +             {
 +               
 +               
 +              int nb_annot=x-temp;
 +              //System.out.println("\t type :"+lastSS+"\t x :"+x+"\t nbre annot :"+nb_annot);
                switch (lastSS)
 -              {
 -              case 'H':
 -                drawHelixAnnot(g, row_annotations, lastSSX, x, y,
 -                        iconOffset, startRes, column, validRes, validEnd);
 +             {
 +               
 +              case '$':
 +                drawHelixAnnot(g, row_annotations, lastSSX, x, y, iconOffset, startRes,
 +                        column, validRes, validEnd);
                  break;
  
 -              case 'E':
 -                drawSheetAnnot(g, row_annotations, lastSSX, x, y,
 -                        iconOffset, startRes, column, validRes, validEnd);
 +              case 'µ':
 +                drawSheetAnnot(g, row_annotations, lastSSX, x, y, iconOffset, startRes,
 +                        column, validRes, validEnd);
                  break;
  
 -              case 'S': // Stem case for RNA secondary structure
 -              case 's': // and opposite direction
 -                drawStemAnnot(g, row_annotations, lastSSX, x, y,
 -                        iconOffset, startRes, column, validRes, validEnd);
 +              case '(': // Stem case for RNA secondary structure
 +              case ')': // and opposite direction
 +                drawStemAnnot(g, row_annotations, lastSSX, x, y, iconOffset, startRes,
 +                        column, validRes, validEnd);
 +                temp=x;
                  break;
 -
 +              case '{':
 +              case '}':
 +              case '[':
 +              case ']':
 +              case '>':
 +              case '<':
 +              case 'A':
 +              case 'a':
 +              case 'B':
 +              case 'b':
 +              case 'C':
 +              case 'c':
 +              case 'D':
 +              case 'd':
 +              case 'E':
 +              case 'e':
 +              case 'F':
 +              case 'f':
 +              case 'G':
 +              case 'g':
 +              case 'H':
 +              case 'h':
 +              case 'I':
 +              case 'i':
 +              case 'J':
 +              case 'j':
 +              case 'K':
 +              case 'k':
 +              case 'L':
 +              case 'l':
 +              case 'M':
 +              case 'm':
 +              case 'N':
 +              case 'n':
 +              case 'O':
 +              case 'o':
 +              case 'P':
 +              case 'p':
 +              case 'Q':
 +              case 'q':
 +              case 'R':
 +              case 'r':
 +              case 'S':
 +              case 's':
 +              case 'T':
 +              case 't':
 +              case 'U':
 +              case 'u':
 +              case 'V':
 +              case 'v':
 +              case 'W':
 +              case 'w':
 +              case 'X':
 +              case 'x':
 +              case 'Y':
 +              case 'y':
 +              case 'Z':
 +              case 'z':
 +                
 +                        Color nonCanColor= getNotCanonicalColor(lastSS);
 +                drawNotCanonicalAnnot(g, nonCanColor, row_annotations, lastSSX, x, y, iconOffset, startRes,
 +                          column, validRes, validEnd);
 +                temp=x;
 +                break;
                default:
                  g.setColor(Color.gray);
                  g.fillRect(lastSSX, y + 6 + iconOffset, (x * charWidth)
                          - lastSSX, 2);
 -
 +                temp=x;
                  break;
                }
              }
        {
          switch (lastSS)
          {
 -        case 'H':
 -          drawHelixAnnot(g, row_annotations, lastSSX, x, y, iconOffset,
 -                  startRes, column, validRes, validEnd);
 +        case '$':
 +          drawHelixAnnot(g, row_annotations, lastSSX, x, y, iconOffset, startRes,
 +                  column, validRes, validEnd);
            break;
  
 -        case 'E':
 -          drawSheetAnnot(g, row_annotations, lastSSX, x, y, iconOffset,
 -                  startRes, column, validRes, validEnd);
 +        case 'µ':
 +          drawSheetAnnot(g, row_annotations, lastSSX, x, y, iconOffset, startRes,
 +                  column, validRes, validEnd);
            break;
          case 's':
          case 'S': // Stem case for RNA secondary structure
 -          drawStemAnnot(g, row_annotations, lastSSX, x, y, iconOffset,
 -                  startRes, column, validRes, validEnd);
 +              
 +          drawStemAnnot(g, row_annotations, lastSSX, x, y, iconOffset, startRes,
 +                  column, validRes, validEnd);
 +          
            break;
 +        case '{':
 +        case '}':
 +        case '[':
 +        case ']':
 +        case '>':
 +        case '<':
 +        case 'A':
 +        case 'a':
 +        case 'B':
 +        case 'b':
 +        case 'C':
 +        case 'c':
 +        case 'D':
 +        case 'd':
 +        case 'E':
 +        case 'e':
 +        case 'F':
 +        case 'f':
 +        case 'G':
 +        case 'g':
 +        case 'H':
 +        case 'h':
 +        case 'I':
 +        case 'i':
 +        case 'J':
 +        case 'j':
 +        case 'K':
 +        case 'k':
 +        case 'L':
 +        case 'l':
 +        case 'M':
 +        case 'm':
 +        case 'N':
 +        case 'n':
 +        case 'O':
 +        case 'o':
 +        case 'P':
 +        case 'p':
 +        case 'Q':
 +        case 'q':
 +        case 'R':
 +        case 'r':
 +        case 'T':
 +        case 't':
 +        case 'U':
 +        case 'u':
 +        case 'V':
 +        case 'v':
 +        case 'W':
 +        case 'w':
 +        case 'X':
 +        case 'x':
 +        case 'Y':
 +        case 'y':
 +        case 'Z':
 +        case 'z':
 +              //System.out.println(lastSS);
 +          Color nonCanColor = getNotCanonicalColor(lastSS);
 +                drawNotCanonicalAnnot(g,nonCanColor, row_annotations, lastSSX, x, y, iconOffset, startRes,
 +                    column, validRes, validEnd);
 +                break;
          default:
 -          drawGlyphLine(g, row_annotations, lastSSX, x, y, iconOffset,
 -                  startRes, column, validRes, validEnd);
 +          drawGlyphLine(g, row_annotations, lastSSX, x, y, iconOffset, startRes,
 +                  column, validRes, validEnd);
            break;
          }
        }
              {
                if (aa[gg].graphGroup == row.graphGroup)
                {
 -                drawLineGraph(g, aa[gg], aa[gg].annotations, startRes,
 -                        endRes, y, groupmin, groupmax, row.graphHeight);
 +                drawLineGraph(g, aa[gg], aa[gg].annotations, startRes, endRes, y, groupmin,
 +                        groupmax, row.graphHeight);
                }
              }
  
            }
            else
            {
 -            drawLineGraph(g, row, row_annotations, startRes, endRes, y,
 -                    row.graphMin, row.graphMax, row.graphHeight);
 +            drawLineGraph(g, row, row_annotations, startRes, endRes, y, row.graphMin,
 +                    row.graphMax, row.graphHeight);
            }
          }
          else if (row.graph == AlignmentAnnotation.BAR_GRAPH)
    private final Color HELIX_COLOUR = Color.red;
  
    private final Color STEM_COLOUR = Color.blue;
 +  
 +  private  Color sdNOTCANONICAL_COLOUR;
  
 -  public void drawGlyphLine(Graphics g, Annotation[] row, int lastSSX,
 -          int x, int y, int iconOffset, int startRes, int column,
 -          boolean validRes, boolean validEnd)
 +  public void drawGlyphLine(Graphics g, Annotation[] row,
 +          int lastSSX, int x, int y, int iconOffset, int startRes,
 +          int column, boolean validRes, boolean validEnd)
    {
      g.setColor(GLYPHLINE_COLOR);
      g.fillRect(lastSSX, y + 6 + iconOffset, (x * charWidth) - lastSSX, 2);
    }
  
 -  public void drawSheetAnnot(Graphics g, Annotation[] row, int lastSSX,
 -          int x, int y, int iconOffset, int startRes, int column,
 -          boolean validRes, boolean validEnd)
 +  public void drawSheetAnnot(Graphics g, Annotation[] row,
 +
 +          int lastSSX, int x, int y, int iconOffset, int startRes,
 +          int column, boolean validRes, boolean validEnd)
    {
      g.setColor(SHEET_COLOUR);
  
        x += charWidth;
      }
    }
 +
 +  
 +  Color getNotCanonicalColor(char lastss)
 +      {
 +        switch (lastss)
 +      {
 +                case '{':  
 +            case '}':
 +                return new Color(255,125,5);
 +                       
 +            case '[':
 +            case ']':
 +                return new Color(245,115,10);
 +                       
 +            case '>':
 +            case '<':
 +                return new Color(235,135,15);
 +                        
 +            case 'A':
 +            case 'a':
 +                return new Color(225,105,20);
 +                      
 +            case 'B':
 +            case 'b':
 +                return new Color(215,145,30);
 +                        
 +            case 'C':
 +            case 'c':
 +                return new Color(205,95,35);
 +                       
 +            case 'D':
 +            case 'd':
 +                return new Color(195,155,45);
 +                        
 +            case 'E':
 +            case 'e':
 +                return new Color(185,85,55);
 +                       
 +            case 'F':
 +            case 'f':
 +                return new Color(175,165,65);
 +                       
 +            case 'G':
 +            case 'g':
 +                return new Color(170,75,75);
 +                      
 +            case 'H':
 +            case 'h':
 +                return new Color(160,175,85);
 +                        
 +            case 'I':
 +            case 'i':
 +                return new Color(150,65,95);
 +                       
 +            case 'J':
 +            case 'j':
 +                return new Color(140,185,105);
 +                        
 +            case 'K':
 +            case 'k':
 +                return new Color(130,55,110);
 +                      
 +            case 'L':
 +            case 'l':
 +                return new Color(120,195,120);
 +              
 +            case 'M':
 +            case 'm':
 +                return new Color(110,45,130);
 +                      
 +            case 'N':
 +            case 'n':
 +                return new Color(100,205,140);
 +                        
 +            case 'O':
 +            case 'o':
 +                return new Color(90,35,150);
 +                      
 +            case 'P':
 +            case 'p':
 +                return new Color(85,215,160);
 +                      
 +            case 'Q':
 +            case 'q':
 +                return new Color(75,25,170);
 +              
 +            case 'R':
 +            case 'r':
 +                return new Color(65,225,180);
 +              
 +            case 'S':
 +            case 's':
 +                return new Color(55,15,185);
 +                      
 +            case 'T':
 +            case 't':
 +                return new Color(45,235,195);
 +                       
 +            case 'U':
 +            case 'u':
 +                return new Color(35,5,205);
 +                        
 +            case 'V':
 +            case 'v':
 +                return new Color(25,245,215);
 +                       
 +            case 'W':
 +            case 'w':
 +                return new Color(15,0,225);
 +                        
 +            case 'X':
 +            case 'x':
 +                return new Color(10,255,235);
 +                       
 +            case 'Y':
 +            case 'y':
 +                return new Color(5,150,245);
 +                        
 +            case 'Z':
 +            case 'z':
 +                return new Color(0,80,255);
 +                       
 +              default :
 +                      System.out.println("This is not a interaction : "+lastss);
 +                      return null;
 +              
 +      }
 +      }
  }
 +
 +      
 +      
@@@ -1,5 -1,5 +1,5 @@@
  /*
-  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.1)
   * Copyright (C) 2014 The Jalview Authors
   * 
   * This file is part of Jalview.
@@@ -89,14 -89,12 +89,14 @@@ public class ColourSchemePropert
    
    public static final int RNAHELIX = 16;
  
 +  public static final int RNAINTERACTION = 17;
 +
    /**
     * index of first colourscheme (includes 'None')
     */
    public static final int FIRST_COLOUR = NONE;
  
 -  public static final int LAST_COLOUR = RNAHELIX;
 +  public static final int LAST_COLOUR = RNAINTERACTION;
  
    /**
     * DOCUMENT ME!
      {
        ret = PURINEPYRIMIDINE;
      }
 +    else if (name.equalsIgnoreCase("RNA Interaction type"))
 +    {
 +      ret = RNAINTERACTION;
 +    }
      else if (name.equalsIgnoreCase("RNA Helices"))
      {
        ret = RNAHELIX;
        ret = "T-Coffee Scores";
  
        break;
 +      
 +    case RNAINTERACTION:
 +        ret = "RNA Interaction type";
 +
 +        break;
      case RNAHELIX:
        ret = "RNA Helices";
  
        
        // case COVARIATION:
        // cs = new CovariationColourScheme(annotation);
 -
 -      // break;
 +    // break;
  
      case USER_DEFINED:
        Color[] col = new Color[24];
@@@ -1,5 -1,5 +1,5 @@@
  /*
-  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.1)
   * Copyright (C) 2014 The Jalview Authors
   * 
   * This file is part of Jalview.
@@@ -1420,41 -1420,62 +1420,62 @@@ public class ResiduePropertie
    }
    static
    {
-     int[][][] propMatrix = new int[3][maxProteinIndex][maxProteinIndex];
+     int[][] propMatrixF = new int[maxProteinIndex][maxProteinIndex],
+             propMatrixPos = new int[maxProteinIndex][maxProteinIndex],
+             propMatrixEpos = new int[maxProteinIndex][maxProteinIndex];
      for (int i=0;i<maxProteinIndex;i++)
      {
+       int maxF=0,maxP=0,maxEP=0;
        String ic="";
-       if (aa.length<i) {
+       if (aa.length>i) {
          ic+=aa[i];
        }
        else {ic = "-";}
        for (int j=i+1;j<maxProteinIndex; j++)
        {
          String jc="";
-         if (aa.length<j) {
+         if (aa.length>j) {
            jc+=aa[j];
          }
          else {jc = "-";}
-         propMatrix[0][i][j]=0;
-         propMatrix[1][i][j]=0;
-         propMatrix[2][i][j]=0;
+         propMatrixF[i][j]=0;
+         propMatrixPos[i][j]=0;
+         propMatrixEpos[i][j]=0;
          for (Enumeration<String> en= (Enumeration<String>)propHash.keys(); en.hasMoreElements(); )
          {
            String ph = en.nextElement();
            Map<String,Integer> pph=(Map<String,Integer>)propHash.get(ph);
-           propMatrix[0][i][j]+= pph.get(ic).equals(pph.get(jc)) ? pph.get(ic) : -1;
-           propMatrix[1][i][j]+= pph.get(ic).equals(pph.get(jc)) ? 1 : -1;
-           propMatrix[2][i][j]+= pph.get(ic).equals(pph.get(jc)) ? pph.get(ic)*2 : 0;
+           if (pph.get(ic)!=null && pph.get(jc)!=null) {
+             int icp=pph.get(ic).intValue(),jcp=pph.get(jc).intValue();
+             // Still working on these definitions.
+             propMatrixPos[i][j] += icp == jcp && icp>0 ? 2 : 0;
+             propMatrixPos[j][i] += icp == jcp && icp>0 ? 2 : 0;
+             propMatrixF[i][j] += icp == jcp ? 2 : 0;
+             propMatrixF[j][i] += icp == jcp ? 2 : 0;
+             propMatrixEpos[i][j] += icp == jcp ? (1+icp * 2) : 0;
+             propMatrixEpos[j][i] += icp == jcp ? (1+icp * 2) : 0;
+         }}
+         if (maxF<propMatrixF[i][j])
+         {
+           maxF=propMatrixF[i][j];
+         }
+         if (maxP<propMatrixPos[i][j])
+         {
+           maxP=propMatrixPos[i][j];
+         }
+         if (maxEP<propMatrixEpos[i][j])
+         {
+           maxEP=propMatrixEpos[i][j];
          }
        }
+       propMatrixF[i][i]=maxF;
+       propMatrixPos[i][i]=maxP;
+       propMatrixEpos[i][i]=maxEP;
      }
-     
-     scoreMatrices.put("Conservation Pos", new ScoreMatrix("Conservation Pos",propMatrix[0],0));
-     scoreMatrices.put("Conservation Both", new ScoreMatrix("Conservation Both",propMatrix[1],0));
-     scoreMatrices.put("Conservation EnhPos", new ScoreMatrix("Conservation EnhPos",propMatrix[2],0));
+     // JAL-1512 comment out physicochemical score matrices for 2.8.1 release
+     //scoreMatrices.put("Conservation Pos", new ScoreMatrix("Conservation Pos",propMatrixPos,0));
+     //scoreMatrices.put("Conservation Both", new ScoreMatrix("Conservation Both",propMatrixF,0));
+     //scoreMatrices.put("Conservation EnhPos", new ScoreMatrix("Conservation EnhPos",propMatrixEpos,0));
      scoreMatrices.put("PID", new PIDScoreModel());
    }
  
    public static Hashtable toRNAssState;
    static
    {
 -    toRNAssState = new Hashtable();
 -    toRNAssState.put(")", "S");
 -    toRNAssState.put("(", "S");
 +      toRNAssState = new Hashtable<String,String>();
 +    toRNAssState.put(")", "(");
 +    toRNAssState.put("(", "(");
 +    toRNAssState.put("]", "[");
 +    toRNAssState.put("[", "[");
 +    toRNAssState.put("{", "{");
 +    toRNAssState.put("}", "{");
 +    toRNAssState.put(">", ">");
 +    toRNAssState.put("<", ">");
 +    toRNAssState.put("A", "A");
 +    toRNAssState.put("a", "A");
 +    toRNAssState.put("B", "B");
 +    toRNAssState.put("b", "B");
 +    toRNAssState.put("C", "C");
 +    toRNAssState.put("c", "C");
 +    toRNAssState.put("D", "D");
 +    toRNAssState.put("d", "D");
 +    toRNAssState.put("E", "E");
 +    toRNAssState.put("e", "E");
 +    toRNAssState.put("F", "F");
 +    toRNAssState.put("f", "F");
 +    toRNAssState.put("G", "G");
 +    toRNAssState.put("g", "G");
 +    toRNAssState.put("H", "H");
 +    toRNAssState.put("h", "H");
 +    toRNAssState.put("I", "I");
 +    toRNAssState.put("i", "I");
 +    toRNAssState.put("J", "J");
 +    toRNAssState.put("j", "J");
 +    toRNAssState.put("K", "K");
 +    toRNAssState.put("k", "K");
 +    toRNAssState.put("L", "L");
 +    toRNAssState.put("l", "L");
 +    toRNAssState.put("M", "M");
 +    toRNAssState.put("m", "M");
 +    toRNAssState.put("N", "N");
 +    toRNAssState.put("n", "N");
 +    toRNAssState.put("O", "O");
 +    toRNAssState.put("o", "O");
 +    toRNAssState.put("P", "P");
 +    toRNAssState.put("p", "P");
 +    toRNAssState.put("Q", "Q");
 +    toRNAssState.put("q", "Q");
 +    toRNAssState.put("R", "R");
 +    toRNAssState.put("r", "R");
 +    toRNAssState.put("S", "S");
 +    toRNAssState.put("s", "S");
 +    toRNAssState.put("T", "T");
 +    toRNAssState.put("t", "T");
 +    toRNAssState.put("U", "U");
 +    toRNAssState.put("u", "U");
 +    toRNAssState.put("V", "V");
 +    toRNAssState.put("v", "V");
 +    toRNAssState.put("W", "W");
 +    toRNAssState.put("w", "W");
 +    toRNAssState.put("X", "X");
 +    toRNAssState.put("x", "X");
 +    toRNAssState.put("Y", "Y");
 +    toRNAssState.put("y", "Y");
 +    toRNAssState.put("Z", "Z");
 +    toRNAssState.put("z", "Z");
 +    
    }
  
    /**
@@@ -1,5 -1,5 +1,5 @@@
  /*
-  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.1)
   * Copyright (C) 2014 The Jalview Authors
   * 
   * This file is part of Jalview.
@@@ -431,7 -431,6 +431,7 @@@ public class DBRefUtil
            ref = new DBRefEntry(locsrc, version, pdbid + chaincode);
            PDBEntry pdbr = new PDBEntry();
            pdbr.setId(pdbid);
 +          pdbr.getProperty().put("CHAIN",chaincode);
            seq.addPDBId(pdbr);
          }
        }
@@@ -1,5 -1,5 +1,5 @@@
  /*
-  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.1)
   * Copyright (C) 2014 The Jalview Authors
   * 
   * This file is part of Jalview.
@@@ -21,11 -21,8 +21,11 @@@ package jalview.ws.dbsources
  import jalview.datamodel.Alignment;
  import jalview.datamodel.DBRefEntry;
  import jalview.datamodel.DBRefSource;
 +import jalview.datamodel.PDBEntry;
  import jalview.datamodel.SequenceI;
  
 +import java.util.ArrayList;
 +import java.util.List;
  import java.util.Vector;
  
  import MCview.PDBChain;
@@@ -34,7 -31,6 +34,7 @@@ import MCview.PDBfile
  import com.stevesoft.pat.Regex;
  
  import jalview.datamodel.AlignmentI;
 +import jalview.io.FormatAdapter;
  import jalview.ws.ebi.EBIFetchClient;
  import jalview.ws.seqfetcher.DbSourceProxy;
  
@@@ -98,7 -94,7 +98,7 @@@ public class Pdb extends EbiFileRetriev
     */
    public AlignmentI getSequenceRecords(String queries) throws Exception
    {
 -
 +    AlignmentI pdbfile = null;
      Vector result = new Vector();
      String chain = null;
      String id = null;
      try
      {
  
 -      PDBfile pdbfile = new PDBfile(file,
 -              jalview.io.AppletFormatAdapter.FILE);
 -      for (int i = 0; i < pdbfile.chains.size(); i++)
 +      pdbfile = new FormatAdapter().readFile(file,
 +              jalview.io.AppletFormatAdapter.FILE, "PDB");
 +      if (pdbfile != null)
        {
 -        if (chain == null
 -                || ((PDBChain) pdbfile.chains.elementAt(i)).id
 -                        .toUpperCase().equals(chain))
 +        List<SequenceI> toremove=new ArrayList<SequenceI>();
 +        for (SequenceI pdbcs : pdbfile.getSequences())
          {
 -          PDBChain pdbchain = (PDBChain) pdbfile.chains.elementAt(i);
 -          // Get the Chain's Sequence - who's dataset includes any special
 -          // features added from the PDB file
 -          SequenceI sq = pdbchain.sequence;
 -          // Specially formatted name for the PDB chain sequences retrieved from
 -          // the PDB
 -          sq.setName(jalview.datamodel.DBRefSource.PDB + "|" + id + "|"
 -                  + sq.getName());
 -          // Might need to add more metadata to the PDBEntry object
 -          // like below
 -          /*
 -           * PDBEntry entry = new PDBEntry(); // Construct the PDBEntry
 -           * entry.setId(id); if (entry.getProperty() == null)
 -           * entry.setProperty(new Hashtable());
 -           * entry.getProperty().put("chains", pdbchain.id + "=" + sq.getStart()
 -           * + "-" + sq.getEnd()); sq.getDatasetSequence().addPDBId(entry);
 -           */
 -          // Add PDB DB Refs
 -          // We make a DBRefEtntry because we have obtained the PDB file from a
 -          // verifiable source
 -          // JBPNote - PDB DBRefEntry should also carry the chain and mapping
 -          // information
 -          DBRefEntry dbentry = new DBRefEntry(getDbSource(),
 -                  getDbVersion(), id + pdbchain.id);
 -          sq.addDBRef(dbentry);
 -          // and add seuqence to the retrieved set
 -          result.addElement(sq.deriveSequence());
 +          String chid = null;
 +          // Mapping map=null;
 +          for (PDBEntry pid : (Vector<PDBEntry>) pdbcs.getPDBId())
 +          {
 +            if (pid.getFile() == file)
 +            {
 +              chid = (String) pid.getProperty().get("CHAIN");
 +
 +            }
 +            ;
 +
 +          }
 +          if (chain == null
 +                  || (chid != null && (chid.equals(chain)
 +                          || chid.trim().equals(chain.trim()) || (chain
 +                          .trim().length() == 0 && chid.equals("_")))))
 +          {
 +            pdbcs.setName(jalview.datamodel.DBRefSource.PDB + "|" + id
 +                    + "|" + pdbcs.getName());
 +            // Might need to add more metadata to the PDBEntry object
 +            // like below
 +            /*
 +             * PDBEntry entry = new PDBEntry(); // Construct the PDBEntry
 +             * entry.setId(id); if (entry.getProperty() == null)
 +             * entry.setProperty(new Hashtable());
 +             * entry.getProperty().put("chains", pdbchain.id + "=" +
 +             * sq.getStart() + "-" + sq.getEnd());
 +             * sq.getDatasetSequence().addPDBId(entry);
 +             */
 +            // Add PDB DB Refs
 +            // We make a DBRefEtntry because we have obtained the PDB file from
 +            // a
 +            // verifiable source
 +            // JBPNote - PDB DBRefEntry should also carry the chain and mapping
 +            // information
 +            DBRefEntry dbentry = new DBRefEntry(getDbSource(),
 +                    getDbVersion(), (chid == null ? id : id + chid));
 +            // dbentry.setMap()
 +            pdbcs.addDBRef(dbentry);
 +          }
 +          else
 +          {
 +            // mark this sequence to be removed from the alignment 
 +            // - since it's not from the right chain
 +            toremove.add(pdbcs);
 +          }
 +        }
 +        // now remove marked sequences 
 +        for (SequenceI pdbcs:toremove) {
 +          pdbfile.deleteSequence(pdbcs);
          }
        }
 -
 -      if (result.size() < 1)
 +      
 +      if (pdbfile == null || pdbfile.getHeight() < 1)
        {
          throw new Exception("No PDB Records for " + id + " chain "
                  + ((chain == null) ? "' '" : chain));
        }
 +
      } catch (Exception ex) // Problem parsing PDB file
      {
        stopQuery();
        throw (ex);
      }
 -
 -    SequenceI[] results = new SequenceI[result.size()];
 -    for (int i = 0, j = result.size(); i < j; i++)
 -    {
 -      results[i] = (SequenceI) result.elementAt(i);
 -      result.setElementAt(null, i);
 -    }
 -    return new Alignment(results);
 +    return pdbfile;
    }
  
    /*