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 --cc build.xml
+++ b/build.xml
  
  -->
  
-       <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">
       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
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -69,9 -70,11 +69,8 @@@ public class AppletFormatAdapte
     * 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
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -1,74 -1,50 +1,74 @@@
- /*\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;
      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);
            }
          }
      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;
++  }
+ }
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge