X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fio%2FFeaturesFile.java;h=462ee22dd65d8260f500437db9f2b22d4abc7bfe;hb=506d60f0e188723ddc91c26824b41ac7034df3fe;hp=e961683a97a03c83a640efd93b4770b56d9b5178;hpb=3a993bbe274824870c78bd7695c42fa93908cb30;p=jalview.git
diff --git a/src/jalview/io/FeaturesFile.java b/src/jalview/io/FeaturesFile.java
index e961683..462ee22 100755
--- a/src/jalview/io/FeaturesFile.java
+++ b/src/jalview/io/FeaturesFile.java
@@ -1,17 +1,17 @@
/*
- * Jalview - A Sequence Alignment Editor and Viewer
- * Copyright (C) 2007 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
- *
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.4)
+ * Copyright (C) 2008 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
+ *
* This program 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 2
* of the License, or (at your option) any later version.
- *
+ *
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
@@ -25,15 +25,15 @@ import jalview.datamodel.*;
import jalview.schemes.*;
/**
- * Parse and create Jalview Features files
- * Detects GFF format features files and parses.
- * Does not implement standard print() - call specific printFeatures or printGFF.
- * Uses AlignmentI.findSequence(String id) to find the sequence object for the features annotation - this normally works on an exact match.
+ * Parse and create Jalview Features files Detects GFF format features files and
+ * parses. Does not implement standard print() - call specific printFeatures or
+ * printGFF. Uses AlignmentI.findSequence(String id) to find the sequence object
+ * for the features annotation - this normally works on an exact match.
+ *
* @author AMW
* @version $Revision$
*/
-public class FeaturesFile
- extends AlignFile
+public class FeaturesFile extends AlignFile
{
/**
* Creates a new FeaturesFile object.
@@ -44,47 +44,47 @@ public class FeaturesFile
/**
* Creates a new FeaturesFile object.
- *
- * @param inFile DOCUMENT ME!
- * @param type DOCUMENT ME!
- *
- * @throws IOException DOCUMENT ME!
+ *
+ * @param inFile
+ * DOCUMENT ME!
+ * @param type
+ * DOCUMENT ME!
+ *
+ * @throws IOException
+ * DOCUMENT ME!
*/
- public FeaturesFile(String inFile, String type)
- throws IOException
+ public FeaturesFile(String inFile, String type) throws IOException
{
super(inFile, type);
}
+
public FeaturesFile(FileParse source) throws IOException
{
super(source);
}
/**
- * The Application can render HTML, but the applet will
- * remove HTML tags and replace links with %LINK%
- * Both need to read links in HTML however
- *
- * @throws IOException DOCUMENT ME!
+ * The Application can render HTML, but the applet will remove HTML tags and
+ * replace links with %LINK% Both need to read links in HTML however
+ *
+ * @throws IOException
+ * DOCUMENT ME!
*/
- public boolean parse(AlignmentI align,
- Hashtable colours,
- boolean removeHTML)
+ public boolean parse(AlignmentI align, Hashtable colours,
+ boolean removeHTML)
{
return parse(align, colours, null, removeHTML);
}
/**
- * The Application can render HTML, but the applet will
- * remove HTML tags and replace links with %LINK%
- * Both need to read links in HTML however
- *
- * @throws IOException DOCUMENT ME!
+ * The Application can render HTML, but the applet will remove HTML tags and
+ * replace links with %LINK% Both need to read links in HTML however
+ *
+ * @throws IOException
+ * DOCUMENT ME!
*/
- public boolean parse(AlignmentI align,
- Hashtable colours,
- Hashtable featureLink,
- boolean removeHTML)
+ public boolean parse(AlignmentI align, Hashtable colours,
+ Hashtable featureLink, boolean removeHTML)
{
String line = null;
try
@@ -101,7 +101,7 @@ public class FeaturesFile
boolean GFFFile = true;
- while ( (line = nextLine()) != null)
+ while ((line = nextLine()) != null)
{
if (line.startsWith("#"))
{
@@ -124,8 +124,8 @@ public class FeaturesFile
}
else if (type.equalsIgnoreCase("endgroup"))
{
- //We should check whether this is the current group,
- //but at present theres no way of showing more than 1 group
+ // We should check whether this is the current group,
+ // but at present theres no way of showing more than 1 group
st.nextToken();
featureGroup = null;
groupLink = null;
@@ -148,7 +148,7 @@ public class FeaturesFile
}
continue;
}
-
+ String seqId = "";
while (st.hasMoreElements())
{
@@ -156,30 +156,30 @@ public class FeaturesFile
{
// Still possible this is an old Jalview file,
// which does not have type colours at the beginning
- token = st.nextToken();
- seq = align.findName(token, true);
+ seqId = token = st.nextToken();
+ seq = align.findName(seqId, true);
if (seq != null)
{
desc = st.nextToken();
type = st.nextToken();
- try {
- start = Integer.parseInt(st.nextToken());
+ try
+ {
+ start = Integer.parseInt(st.nextToken());
} catch (NumberFormatException ex)
{
- start=0;
+ start = 0;
}
- try {
+ try
+ {
end = Integer.parseInt(st.nextToken());
- }
- catch (NumberFormatException ex)
+ } catch (NumberFormatException ex)
{
- end=-1;
- }
+ end = -1;
+ }
try
{
score = new Float(st.nextToken()).floatValue();
- }
- catch (NumberFormatException ex)
+ } catch (NumberFormatException ex)
{
score = 0;
}
@@ -190,9 +190,9 @@ public class FeaturesFile
{
sf.setValue("STRAND", st.nextToken());
sf.setValue("FRAME", st.nextToken());
+ } catch (Exception ex)
+ {
}
- catch (Exception ex)
- {}
if (st.hasMoreTokens())
{
@@ -205,7 +205,10 @@ public class FeaturesFile
}
seq.addSequenceFeature(sf);
-
+ while ((seq = align.findName(seq, seqId, true)) != null)
+ {
+ seq.addSequenceFeature(new SequenceFeature(sf));
+ }
break;
}
}
@@ -220,26 +223,28 @@ public class FeaturesFile
}
if (!st.hasMoreTokens())
{
- System.err.println("DEBUG: Run out of tokens when trying to identify the destination for the feature.. giving up.");
- // in all probability, this isn't a file we understand, so bail quietly.
+ System.err
+ .println("DEBUG: Run out of tokens when trying to identify the destination for the feature.. giving up.");
+ // in all probability, this isn't a file we understand, so bail
+ // quietly.
return false;
}
-
+
token = st.nextToken();
-
+
if (!token.equals("ID_NOT_SPECIFIED"))
{
- seq = align.findName(token, true);
+ seq = align.findName(seqId = token, true);
st.nextToken();
}
else
{
+ seqId = null;
try
{
index = Integer.parseInt(st.nextToken());
seq = align.getSequenceAt(index);
- }
- catch (NumberFormatException ex)
+ } catch (NumberFormatException ex)
{
seq = null;
}
@@ -265,8 +270,6 @@ public class FeaturesFile
sf = new SequenceFeature(type, desc, "", start, end, featureGroup);
- seq.addSequenceFeature(sf);
-
if (groupLink != null && removeHTML)
{
sf.addLink(groupLink);
@@ -280,12 +283,18 @@ public class FeaturesFile
parseDescriptionHTML(sf, removeHTML);
- //If we got here, its not a GFFFile
+ seq.addSequenceFeature(sf);
+
+ while (seqId != null
+ && (seq = align.findName(seq, seqId, false)) != null)
+ {
+ seq.addSequenceFeature(new SequenceFeature(sf));
+ }
+ // If we got here, its not a GFFFile
GFFFile = false;
}
}
- }
- catch (Exception ex)
+ } catch (Exception ex)
{
System.out.println(line);
System.out.println("Error parsing feature file: " + ex + "\n" + line);
@@ -303,7 +312,8 @@ public class FeaturesFile
return;
}
- if (removeHTML && sf.getDescription().toUpperCase().indexOf("") == -1)
+ if (removeHTML
+ && sf.getDescription().toUpperCase().indexOf("") == -1)
{
removeHTML = false;
}
@@ -371,40 +381,58 @@ public class FeaturesFile
}
/**
- * DOCUMENT ME!
- *
- * @param s DOCUMENT ME!
- * @param len DOCUMENT ME!
- * @param gaps DOCUMENT ME!
- * @param displayId DOCUMENT ME!
- *
- * @return DOCUMENT ME!
+ * generate a features file for seqs
+ *
+ * @param seqs
+ * source of sequence features
+ * @param visible
+ * hash of feature types and colours
+ * @return features file contents
+ */
+ public String printJalviewFormat(SequenceI[] seqs, Hashtable visible)
+ {
+ return printJalviewFormat(seqs, visible, true);
+ }
+
+ /**
+ * generate a features file for seqs with colours from visible (if any)
+ *
+ * @param seqs
+ * source of features
+ * @param visible
+ * hash of Colours for each feature type
+ * @param visOnly
+ * when true only feature types in 'visible' will be output
+ * @return features file contents
*/
- public String printJalviewFormat(SequenceI[] seqs,
- Hashtable visible)
+ public String printJalviewFormat(SequenceI[] seqs, Hashtable visible,
+ boolean visOnly)
{
StringBuffer out = new StringBuffer();
SequenceFeature[] next;
- if (visible == null || visible.size() < 1)
+ if (visOnly && (visible == null || visible.size() < 1))
{
return "No Features Visible";
}
-
- Enumeration en = visible.keys();
- String type;
- int color;
- while (en.hasMoreElements())
+ if (visible != null && visOnly)
{
- type = en.nextElement().toString();
- color = Integer.parseInt(visible.get(type).toString());
- out.append(type + "\t"
- + jalview.util.Format.getHexString(
- new java.awt.Color(color))
- + "\n");
+ // write feature colours only if we're given them and we are generating
+ // viewed features
+ Enumeration en = visible.keys();
+ String type;
+ int color;
+ while (en.hasMoreElements())
+ {
+ type = en.nextElement().toString();
+ color = Integer.parseInt(visible.get(type).toString());
+ out.append(type
+ + "\t"
+ + jalview.util.Format
+ .getHexString(new java.awt.Color(color)) + "\n");
+ }
}
-
- //Work out which groups are both present and visible
+ // Work out which groups are both present and visible
Vector groups = new Vector();
int groupIndex = 0;
@@ -415,13 +443,13 @@ public class FeaturesFile
{
for (int j = 0; j < next.length; j++)
{
- if (!visible.containsKey(next[j].type))
+ if (visOnly && !visible.containsKey(next[j].type))
{
continue;
}
if (next[j].featureGroup != null
- && !groups.contains(next[j].featureGroup))
+ && !groups.contains(next[j].featureGroup))
{
groups.addElement(next[j].featureGroup);
}
@@ -451,15 +479,14 @@ public class FeaturesFile
{
for (int j = 0; j < next.length; j++)
{
- if (!visible.containsKey(next[j].type))
+ if (visOnly && !visible.containsKey(next[j].type))
{
continue;
}
if (group != null
- && (next[j].featureGroup == null
- || !next[j].featureGroup.equals(group))
- )
+ && (next[j].featureGroup == null || !next[j].featureGroup
+ .equals(group)))
{
continue;
}
@@ -469,14 +496,15 @@ public class FeaturesFile
continue;
}
- if (next[j].description == null || next[j].description.equals(""))
+ if (next[j].description == null
+ || next[j].description.equals(""))
{
out.append(next[j].type + "\t");
}
else
{
if (next[j].links != null
- && next[j].getDescription().indexOf("") == -1)
+ && next[j].getDescription().indexOf("") == -1)
{
out.append("");
}
@@ -492,11 +520,9 @@ public class FeaturesFile
if (next[j].description.indexOf(href) == -1)
{
- out.append(""
- + label
- + "");
+ out
+ .append("" + label
+ + "");
}
}
@@ -509,11 +535,8 @@ public class FeaturesFile
out.append("\t");
}
- out.append(seqs[i].getName() + "\t-1\t"
- + next[j].begin + "\t"
- + next[j].end + "\t"
- + next[j].type + "\n"
- );
+ out.append(seqs[i].getName() + "\t-1\t" + next[j].begin + "\t"
+ + next[j].end + "\t" + next[j].type + "\n");
}
}
}
@@ -528,14 +551,19 @@ public class FeaturesFile
break;
}
- }
- while (groupIndex < groups.size() + 1);
+ } while (groupIndex < groups.size() + 1);
return out.toString();
}
public String printGFFFormat(SequenceI[] seqs, Hashtable visible)
{
+ return printGFFFormat(seqs, visible, true);
+ }
+
+ public String printGFFFormat(SequenceI[] seqs, Hashtable visible,
+ boolean visOnly)
+ {
StringBuffer out = new StringBuffer();
SequenceFeature[] next;
String source;
@@ -547,7 +575,7 @@ public class FeaturesFile
next = seqs[i].getSequenceFeatures();
for (int j = 0; j < next.length; j++)
{
- if (!visible.containsKey(next[j].type))
+ if (visOnly && !visible.containsKey(next[j].type))
{
continue;
}
@@ -558,13 +586,9 @@ public class FeaturesFile
source = next[j].getDescription();
}
- out.append(seqs[i].getName() + "\t"
- + source + "\t"
- + next[j].type + "\t"
- + next[j].begin + "\t"
- + next[j].end + "\t"
- + next[j].score + "\t"
- );
+ out.append(seqs[i].getName() + "\t" + source + "\t"
+ + next[j].type + "\t" + next[j].begin + "\t"
+ + next[j].end + "\t" + next[j].score + "\t");
if (next[j].getValue("STRAND") != null)
{
@@ -598,15 +622,18 @@ public class FeaturesFile
return out.toString();
}
+ /**
+ * this is only for the benefit of object polymorphism - method does nothing.
+ */
public void parse()
{
- //IGNORED
+ // IGNORED
}
/**
- * DOCUMENT ME!
- *
- * @return DOCUMENT ME!
+ * this is only for the benefit of object polymorphism - method does nothing.
+ *
+ * @return error message
*/
public String print()
{