-->
- <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
- /*\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;
++ }
+ }