JAL-1645 Version-Rel Version 2.9 Year-Rel 2015 Licensing glob
[jalview.git] / src / jalview / io / FeaturesFile.java
index d6c3c21..f316c5e 100755 (executable)
@@ -1,6 +1,6 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
- * Copyright (C) $$Year-Rel$$ The Jalview Authors
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.9)
+ * Copyright (C) 2015 The Jalview Authors
  * 
  * This file is part of Jalview.
  * 
@@ -70,27 +70,48 @@ public class FeaturesFile extends AlignFile
   }
 
   /**
-   * Creates a new FeaturesFile object.
-   * 
    * @param inFile
-   *          DOCUMENT ME!
    * @param type
-   *          DOCUMENT ME!
-   * 
    * @throws IOException
-   *           DOCUMENT ME!
    */
   public FeaturesFile(String inFile, String type) throws IOException
   {
     super(inFile, type);
   }
 
+  /**
+   * @param source
+   * @throws IOException
+   */
   public FeaturesFile(FileParse source) throws IOException
   {
     super(source);
   }
 
   /**
+   * @param parseImmediately
+   * @param source
+   * @throws IOException
+   */
+  public FeaturesFile(boolean parseImmediately, FileParse source)
+          throws IOException
+  {
+    super(parseImmediately, source);
+  }
+
+  /**
+   * @param parseImmediately
+   * @param inFile
+   * @param type
+   * @throws IOException
+   */
+  public FeaturesFile(boolean parseImmediately, String inFile, String type)
+          throws IOException
+  {
+    super(parseImmediately, inFile, type);
+  }
+
+  /**
    * Parse GFF or sequence features file using case-independent matching,
    * discarding URLs
    * 
@@ -148,6 +169,27 @@ public class FeaturesFile extends AlignFile
     return parse(align, colours, featureLink, removeHTML, false);
   }
 
+  @Override
+  public void addAnnotations(AlignmentI al)
+  {
+    // TODO Auto-generated method stub
+    super.addAnnotations(al);
+  }
+
+  @Override
+  public void addProperties(AlignmentI al)
+  {
+    // TODO Auto-generated method stub
+    super.addProperties(al);
+  }
+
+  @Override
+  public void addSeqGroups(AlignmentI al)
+  {
+    // TODO Auto-generated method stub
+    super.addSeqGroups(al);
+  }
+
   /**
    * Parse GFF or sequence features file
    * 
@@ -172,7 +214,8 @@ public class FeaturesFile extends AlignFile
     {
       SequenceI seq = null;
       /**
-       * keep track of any sequences we try to create from the data if it is a GFF3 file
+       * keep track of any sequences we try to create from the data if it is a
+       * GFF3 file
        */
       ArrayList<SequenceI> newseqs = new ArrayList<SequenceI>();
       String type, desc, token = null;
@@ -791,18 +834,19 @@ public class FeaturesFile extends AlignFile
    * @return true if sf was actually added to the sequence, false if it was
    *         processed in another way
    */
-  public boolean processOrAddSeqFeature(AlignmentI align, List<SequenceI> newseqs, SequenceI seq, SequenceFeature sf,
+  public boolean processOrAddSeqFeature(AlignmentI align,
+          List<SequenceI> newseqs, SequenceI seq, SequenceFeature sf,
           boolean gFFFile, boolean relaxedIdMatching)
   {
     String attr = (String) sf.getValue("ATTRIBUTES");
     boolean add = true;
     if (gFFFile && attr != null)
     {
-      int nattr=8;
+      int nattr = 8;
 
       for (String attset : attr.split("\t"))
       {
-        if (attset==null || attset.trim().length()==0)
+        if (attset == null || attset.trim().length() == 0)
         {
           continue;
         }
@@ -818,22 +862,25 @@ public class FeaturesFile extends AlignFile
             continue;
           }
 
-          // expect either space seperated (gff2) or '=' separated (gff3) 
+          // expect either space seperated (gff2) or '=' separated (gff3)
           // key/value pairs here
 
-          int eqpos = pair.indexOf('='),sppos = pair.indexOf(' ');
+          int eqpos = pair.indexOf('='), sppos = pair.indexOf(' ');
           String key = null, value = null;
 
           if (sppos > -1 && (eqpos == -1 || sppos < eqpos))
           {
             key = pair.substring(0, sppos);
             value = pair.substring(sppos + 1);
-          } else {
+          }
+          else
+          {
             if (eqpos > -1 && (sppos == -1 || eqpos < sppos))
             {
               key = pair.substring(0, eqpos);
               value = pair.substring(eqpos + 1);
-            } else
+            }
+            else
             {
               key = pair;
             }
@@ -856,8 +903,8 @@ public class FeaturesFile extends AlignFile
         {
           add &= processGffKey(set, nattr, seq, sf, align, newseqs,
                   relaxedIdMatching); // process decides if
-                                                     // feature is actually
-                                                     // added
+                                      // feature is actually
+                                      // added
         } catch (InvalidGFF3FieldException ivfe)
         {
           System.err.println(ivfe);
@@ -906,20 +953,20 @@ public class FeaturesFile extends AlignFile
     {
       int strand = sf.getStrand();
       // exonerate cdna/protein map
-      // look for fields 
+      // look for fields
       List<SequenceI> querySeq = findNames(align, newseqs,
-              relaxedIdMatching, set.get(attr="Query"));
-      if (querySeq==null || querySeq.size()!=1)
+              relaxedIdMatching, set.get(attr = "Query"));
+      if (querySeq == null || querySeq.size() != 1)
       {
-        throw new InvalidGFF3FieldException( attr, set,
+        throw new InvalidGFF3FieldException(attr, set,
                 "Expecting exactly one sequence in Query field (got "
                         + set.get(attr) + ")");
       }
-      if (set.containsKey(attr="Align"))
+      if (set.containsKey(attr = "Align"))
       {
         // process the align maps and create cdna/protein maps
         // ideally, the query sequences are in the alignment, but maybe not...
-        
+
         AlignedCodonFrame alco = new AlignedCodonFrame();
         MapList codonmapping = constructCodonMappingFromAlign(set, attr,
                 strand);
@@ -937,8 +984,8 @@ public class FeaturesFile extends AlignFile
   }
 
   private MapList constructCodonMappingFromAlign(
-          Map<String, List<String>> set,
-          String attr, int strand) throws InvalidGFF3FieldException
+          Map<String, List<String>> set, String attr, int strand)
+          throws InvalidGFF3FieldException
   {
     if (strand == 0)
     {
@@ -1092,21 +1139,21 @@ public class FeaturesFile extends AlignFile
           }
         }
       }
-      
+
     }
-    if (match==null && newseqs!=null)
+    if (match == null && newseqs != null)
     {
       match = new SequenceDummy(seqId);
       if (relaxedIdMatching)
       {
-        matcher.addAll(Arrays.asList(new SequenceI[]
-        { match }));
+        matcher.addAll(Arrays.asList(new SequenceI[] { match }));
       }
       // add dummy sequence to the newseqs list
       newseqs.add(match);
     }
     return match;
   }
+
   public void parseDescriptionHTML(SequenceFeature sf, boolean removeHTML)
   {
     if (sf.getDescription() == null)
@@ -1134,7 +1181,8 @@ public class FeaturesFile extends AlignFile
    *          hash of feature types and colours
    * @return features file contents
    */
-  public String printJalviewFormat(SequenceI[] seqs, Map<String,Object> visible)
+  public String printJalviewFormat(SequenceI[] seqs,
+          Map<String, Object> visible)
   {
     return printJalviewFormat(seqs, visible, true, true);
   }
@@ -1342,7 +1390,7 @@ public class FeaturesFile extends AlignFile
             out.append(next[j].end);
             out.append("\t");
             out.append(next[j].type);
-            if (next[j].score != Float.NaN)
+            if (!Float.isNaN(next[j].score))
             {
               out.append("\t");
               out.append(next[j].score);
@@ -1382,13 +1430,13 @@ public class FeaturesFile extends AlignFile
    * @param visible
    * @return
    */
-  public String printGFFFormat(SequenceI[] seqs, Map<String,Object> visible)
+  public String printGFFFormat(SequenceI[] seqs, Map<String, Object> visible)
   {
     return printGFFFormat(seqs, visible, true, true);
   }
 
-  public String printGFFFormat(SequenceI[] seqs, Map<String,Object> visible,
-          boolean visOnly, boolean nonpos)
+  public String printGFFFormat(SequenceI[] seqs,
+          Map<String, Object> visible, boolean visOnly, boolean nonpos)
   {
     StringBuffer out = new StringBuffer();
     SequenceFeature[] next;