fully integrate HMMER3 file format into Jalview
authorTZVanaalten <TZVanaalten@LS30916.ad.lifesci.dundee.ac.uk>
Thu, 22 Jun 2017 14:01:34 +0000 (15:01 +0100)
committerTZVanaalten <TZVanaalten@LS30916.ad.lifesci.dundee.ac.uk>
Thu, 22 Jun 2017 14:01:34 +0000 (15:01 +0100)
src/jalview/datamodel/HiddenMarkovModel.java
src/jalview/gui/AlignFrame.java
src/jalview/io/FileFormat.java
src/jalview/io/HMMFile.java
src/jalview/io/IdentifyFile.java
test/jalview/io/HMMFileTest.java

index cd6490e..f614013 100644 (file)
@@ -26,9 +26,16 @@ public class HiddenMarkovModel
   // 0. Node 0 contains average emission probabilities for each symbol
   List<HMMNode> nodes = new ArrayList<>();
 
-  final String YES = "yes";
+  // contains the HMM node for each alignment column
+  Map<Integer, Integer> nodeLookup = new HashMap<>();
+  
+  //contains the symbol index for each symbol
+  Map<Character, Integer> symbolIndexLookup = new HashMap<>();
+
 
-  final String NO = "no";
+  final static String YES = "yes";
+
+  final static String NO = "no";
 
   int numberOfSymbols;
   
@@ -95,14 +102,26 @@ public class HiddenMarkovModel
     return TRANSITION_TYPES[index];
   }
 
+  public Map<Integer, Integer> getNodeLookup()
+  {
+    return nodeLookup;
+  }
+
+  public void setNodeLookup(Map<Integer, Integer> nodeLookup)
+  {
+    this.nodeLookup = nodeLookup;
+  }
+
   public String[] getTransitionTypes()
   {
     return TRANSITION_TYPES;
   }
-  public char getSymbol(int index)
+
+  public List<Character> getSymbols()
   {
-    return getSymbols().get(index);
+    return symbols;
   }
+
   public Map<String, String> getFileProperties()
   {
     return fileProperties;
@@ -258,49 +277,66 @@ public class HiddenMarkovModel
   }
   
   /**
-   * gets the match emission at a node for a symbol
-   * @param nodeIndex
-   * position of node in model
-   * @param symbolIndex
-   * index of symbol being searched
+   * get match emission probability for a given symbol at a column in the
+   * alignment
+   * 
+   * @param alignColumn
+   * @param symbol
    * @return
-   * negative log probability of a match emission of the given symbol
+   * 
    */
-  public double getMatchEmission(int nodeIndex, int symbolIndex)
+  public Double getMatchEmissionProbability(int alignColumn, char symbol)
   {
-    double value = nodes.get(nodeIndex).getMatchEmissions().get(symbolIndex);
-    return value;
+    int symbolIndex;
+    int nodeIndex;
+    Double probability;
+    symbolIndex = symbolIndexLookup.get(symbol);
+    nodeIndex = nodeLookup.get(alignColumn);
+    probability = getNode(nodeIndex).getMatchEmissions().get(symbolIndex);
+    return probability;
+
   }
-  
+
   /**
-   * gets the insert emission at a node for a symbol
-   * @param nodeIndex
-   * position of node in model
-   * @param symbolIndex
-   * index of symbol being searched
+   * get insert emission probability for a given symbol at a column in the
+   * alignment
+   * 
+   * @param alignColumn
+   * @param symbol
    * @return
-   * negative log probability of an insert emission of the given symbol
    */
-  public double getInsertEmission(int nodeIndex, int symbolIndex)
+  public Double getInsertEmissionProbability(int alignColumn, char symbol)
   {
-    double value = nodes.get(nodeIndex).getInsertEmissions().get(symbolIndex);
-    return value;
+    int symbolIndex;
+    int nodeIndex;
+    Double probability;
+    symbolIndex = symbolIndexLookup.get(symbol);
+    nodeIndex = nodeLookup.get(alignColumn);
+    probability = getNode(nodeIndex).getInsertEmissions().get(symbolIndex);
+    return probability;
+
   }
   
   /**
-   * gets the state transition at a node for a specific transition
-   * @param nodeIndex
-   * position of node in model
-   * @param transitionIndex
-   * index of stransition being searched
+   * get state transition probability for a given transition type at a column in
+   * the alignment
+   * 
+   * @param alignColumn
+   * @param transition
    * @return
-   * negative log probability of a state transition of the given type
    */
-  public double getStateTransition(int nodeIndex, int transitionIndex)
-  {
-    double value = nodes.get(nodeIndex).getStateTransitions()
+  public Double getStateTransitionProbability(int alignColumn,
+          String transition)
+  {
+    int transitionIndex;
+    int nodeIndex;
+    Double probability;
+    transitionIndex = getTransitionType(transition);
+    nodeIndex = nodeLookup.get(alignColumn);
+    probability = getNode(nodeIndex).getStateTransitions()
             .get(transitionIndex);
-    return value;
+    return probability;
+
   }
   
   public Integer getNodeAlignmentColumn(int nodeIndex)
@@ -356,11 +392,7 @@ public class HiddenMarkovModel
     this.numberOfSymbols = numberOfSymbols;
   }
 
-  public List<Character> getSymbols()
-  {
-    return symbols;
-  }
-
+  
 
   /**
    * fills symbol array and also finds numberOfSymbols
@@ -370,11 +402,14 @@ public class HiddenMarkovModel
    */
   public void fillSymbols(Scanner parser)
   {
+    int i = 0;
     while (parser.hasNext())
     {
       String strSymbol = parser.next();
       char[] symbol = strSymbol.toCharArray();
       symbols.add(symbol[0]);
+      symbolIndexLookup.put(symbol[0], i);
+      i++;
     }
     numberOfSymbols = symbols.size();
   }
@@ -616,5 +651,69 @@ public class HiddenMarkovModel
       fileProperties.put(CONSENSUS_STRUCTURE, NO);
     }
   }
+
+  /**
+   * 
+   * @param transition
+   *          type of transition occuring
+   * @return index value representing position along stateTransition array.
+   */
+  public Integer getTransitionType(String transition)
+  {
+    Integer index;
+    switch (transition)
+    {
+    case "mm":
+      index = 0;
+      break;
+    case "mi":
+      index = 1;
+      break;
+    case "md":
+      index = 2;
+      break;
+    case "im":
+      index = 3;
+      break;
+    case "ii":
+      index = 4;
+      break;
+    case "dm":
+      index = 5;
+      break;
+    case "dd":
+      index = 6;
+      break;
+    default:
+      index = null;
+    }
+    return index;
+  }
+
+  /**
+   * find the index of the node in a hidden Markov model based on the column in
+   * the alignment
+   * 
+   * @param alignmentColumn
+   */
+
+  public Integer findNodeIndex(int alignmentColumn)
+  {
+    Integer index;
+    index = nodeLookup.get(alignmentColumn);
+    return index;
+  }
+
+  public static String findStringFromBoolean(boolean value)
+  {
+    if (value)
+    {
+      return YES;
+    }
+    else
+    {
+      return NO;
+    }
+  }
 }
 
index a9a970f..2140ed9 100644 (file)
@@ -72,6 +72,7 @@ import jalview.io.FileFormats;
 import jalview.io.FileLoader;
 import jalview.io.FileParse;
 import jalview.io.FormatAdapter;
+import jalview.io.HMMFile;
 import jalview.io.HtmlSvgOutput;
 import jalview.io.IdentifyFile;
 import jalview.io.JPredFile;
@@ -167,7 +168,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
 
   public AlignViewControllerI avc;
 
-  List<AlignmentPanel> alignPanels = new ArrayList<AlignmentPanel>();
+  List<AlignmentPanel> alignPanels = new ArrayList<>();
 
   /**
    * Last format used to load or save alignments in this window
@@ -396,8 +397,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
 
     addKeyListener();
 
-    final List<AlignmentPanel> selviews = new ArrayList<AlignmentPanel>();
-    final List<AlignmentPanel> origview = new ArrayList<AlignmentPanel>();
+    final List<AlignmentPanel> selviews = new ArrayList<>();
+    final List<AlignmentPanel> origview = new ArrayList<>();
     final String menuLabel = MessageManager
             .getString("label.copy_format_from");
     ViewSelectionMenu vsel = new ViewSelectionMenu(menuLabel,
@@ -410,7 +411,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
                 origview.clear();
                 origview.add(alignPanel);
                 // make an array of all alignment panels except for this one
-                List<AlignmentPanel> aps = new ArrayList<AlignmentPanel>(
+                List<AlignmentPanel> aps = new ArrayList<>(
                         Arrays.asList(Desktop.getAlignmentPanels(null)));
                 aps.remove(AlignFrame.this.alignPanel);
                 return aps.toArray(new AlignmentPanel[aps.size()]);
@@ -1732,7 +1733,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
 
   synchronized void slideSequences(boolean right, int size)
   {
-    List<SequenceI> sg = new ArrayList<SequenceI>();
+    List<SequenceI> sg = new ArrayList<>();
     if (viewport.cursorMode)
     {
       sg.add(viewport.getAlignment().getSequenceAt(
@@ -1751,7 +1752,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       return;
     }
 
-    List<SequenceI> invertGroup = new ArrayList<SequenceI>();
+    List<SequenceI> invertGroup = new ArrayList<>();
 
     for (SequenceI seq : viewport.getAlignment().getSequences())
     {
@@ -1884,7 +1885,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     ArrayList<int[]> hiddenColumns = null;
     if (viewport.hasHiddenColumns())
     {
-      hiddenColumns = new ArrayList<int[]>();
+      hiddenColumns = new ArrayList<>();
       int hiddenOffset = viewport.getSelectionGroup().getStartRes(), hiddenCutoff = viewport
               .getSelectionGroup().getEndRes();
       for (int[] region : viewport.getAlignment().getHiddenColumns()
@@ -1994,7 +1995,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       }
 
       int alwidth = 0;
-      ArrayList<Integer> newGraphGroups = new ArrayList<Integer>();
+      ArrayList<Integer> newGraphGroups = new ArrayList<>();
       int fgroup = -1;
 
       if (newAlignment)
@@ -2826,7 +2827,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
    */
   protected List<String> getExistingViewNames(List<Component> comps)
   {
-    List<String> existingNames = new ArrayList<String>();
+    List<String> existingNames = new ArrayList<>();
     for (Component comp : comps)
     {
       if (comp instanceof AlignmentPanel)
@@ -3760,7 +3761,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
 
     List<Component> comps = PaintRefresher.components.get(viewport
             .getSequenceSetId());
-    List<TreePanel> treePanels = new ArrayList<TreePanel>();
+    List<TreePanel> treePanels = new ArrayList<>();
     for (Component comp : comps)
     {
       if (comp instanceof TreePanel)
@@ -4020,7 +4021,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       @Override
       public void run()
       {
-        final List<JMenuItem> legacyItems = new ArrayList<JMenuItem>();
+        final List<JMenuItem> legacyItems = new ArrayList<>();
         try
         {
           // System.err.println("Building ws menu again "
@@ -4035,7 +4036,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
           // TODO: group services by location as well as function and/or
           // introduce
           // object broker mechanism.
-          final Vector<JMenu> wsmenu = new Vector<JMenu>();
+          final Vector<JMenu> wsmenu = new Vector<>();
           final IProgressIndicator af = me;
 
           /*
@@ -4403,8 +4404,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     // Java's Transferable for native dnd
     evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
     Transferable t = evt.getTransferable();
-    List<String> files = new ArrayList<String>();
-    List<DataSourceType> protocols = new ArrayList<DataSourceType>();
+    List<String> files = new ArrayList<>();
+    List<DataSourceType> protocols = new ArrayList<>();
 
     try
     {
@@ -4424,8 +4425,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
         /**
          * Object[] { String,SequenceI}
          */
-        ArrayList<Object[]> filesmatched = new ArrayList<Object[]>();
-        ArrayList<String> filesnotmatched = new ArrayList<String>();
+        ArrayList<Object[]> filesmatched = new ArrayList<>();
+        ArrayList<String> filesnotmatched = new ArrayList<>();
         for (int i = 0; i < files.size(); i++)
         {
           String file = files.get(i).toString();
@@ -4649,6 +4650,12 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
                             "label.successfully_loaded_matrix",
                             sm.getMatrixName()));
           }
+          else if (FileFormat.HMMER3.equals(format))
+          {
+            HMMFile hmm = new HMMFile(new FileParse(file, sourceType));
+            hmm.parse();
+            System.out.println("successful");
+          }
           else if (FileFormat.Jnet.equals(format))
           {
             JPredFile predictions = new JPredFile(file, sourceType);
@@ -5416,7 +5423,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     {
       return;
     }
-    List<SequenceI> cdnaSeqs = new ArrayList<SequenceI>();
+    List<SequenceI> cdnaSeqs = new ArrayList<>();
     for (SequenceI aaSeq : alignment.getSequences())
     {
       for (AlignedCodonFrame acf : mappings)
index 3354b88..50d2aa7 100644 (file)
@@ -353,8 +353,24 @@ public enum FileFormat implements FileFormatI
     {
       return false;
     }
+  },
+  HMMER3("HMMER3", "hmm", false, false)
+  {
+    @Override
+    public AlignmentFileReaderI getReader(FileParse source)
+            throws IOException
+    {
+      return new HMMFile(source);
+    }
+
+    @Override
+    public AlignmentFileWriterI getWriter(AlignmentI al)
+    {
+      return new HMMFile();
+    }
   };
 
+
   private boolean writable;
 
   private boolean readable;
index 7063fe9..6e49af6 100644 (file)
@@ -2,12 +2,12 @@ package jalview.io;
 
 import jalview.datamodel.HMMNode;
 import jalview.datamodel.HiddenMarkovModel;
+import jalview.datamodel.SequenceI;
 
 import java.io.BufferedReader;
-import java.io.File;
 import java.io.FileNotFoundException;
-import java.io.FileReader;
 import java.io.IOException;
+import java.io.PrintWriter;
 import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
 import java.util.List;
@@ -21,19 +21,19 @@ import java.util.Scanner;
  * @author TZVanaalten
  *
  */
-public class HMMFile extends FileParse
+public class HMMFile extends AlignFile
+        implements AlignmentFileReaderI, AlignmentFileWriterI
 {
   // HMM to store file data
-  HiddenMarkovModel hmm = new HiddenMarkovModel();
+  private HiddenMarkovModel hmm = new HiddenMarkovModel();
+
 
 
-  // Source of file
-  String dataObject;
 
   // number of possible transitions
-  final static int NUMBER_OF_TRANSITIONS = 7;
+  private final int NUMBER_OF_TRANSITIONS = 7;
 
-  final static String NEW_LINE = "\n";
+  private final String NEW_LINE = "\n";
 
 
   // file header
@@ -41,58 +41,50 @@ public class HMMFile extends FileParse
 
   int numberOfSymbols;
 
-  final static String SPACE = " ";
+  private final String SPACE = " ";
 
-  final static String COMPO = "COMPO";
+  private final String COMPO = "COMPO";
 
-  final static String EMPTY = "";
+  private final String EMPTY = "";
 
+  public HMMFile(FileParse source) throws IOException
+  {
+    super(false, source);
+  }
 
-  /**
-   * Constructor which contains model to be filled or exported
-   * 
-   * @param dataSource
-   *          Filename, URL or Pasted String to read from
-   */
-  public HMMFile(String dataSource)
+  public HMMFile()
   {
-    dataObject = dataSource;
+
   }
 
-  public HiddenMarkovModel getHmm()
+  public HiddenMarkovModel getHMM()
   {
     return hmm;
   }
 
-  public void setHmm(HiddenMarkovModel model)
+  public void setHMM(HiddenMarkovModel model)
   {
     this.hmm = model;
   }
 
+  public String getName()
+  {
+    return hmm.getName();
+  }
+
   /**
    * reads data from HMM file
    * 
    * @throws IOException
    */
+  @Override
   public void parse() throws IOException
   {
-    File file = new File(dataObject);
-    FileReader fr = new FileReader(file);
-    BufferedReader br = new BufferedReader(fr);
-    parseFileProperties(br);
-    parseModel(br);
-
+    parseFileProperties(dataIn);
+    parseModel(dataIn);
   }
 
-  public String getDataObject()
-  {
-    return dataObject;
-  }
 
-  public void setDataObject(String value)
-  {
-    this.dataObject = value;
-  }
 
   /**
    * imports file properties from hmm file
@@ -101,7 +93,7 @@ public class HMMFile extends FileParse
    *          buffered reader used to read in file
    * @throws IOException
    */
-  public void parseFileProperties(BufferedReader input) throws IOException
+  void parseFileProperties(BufferedReader input) throws IOException
   {
     boolean readingFile = true;
     fileHeader = input.readLine();
@@ -156,7 +148,7 @@ public class HMMFile extends FileParse
    *          buffered reader used to read file
    * @throws IOException
    */
-  public void parseModel(BufferedReader input) throws IOException
+  void parseModel(BufferedReader input) throws IOException
   {
     for (int i = 0; i < hmm.getLength() + 1; i++)
     {
@@ -205,13 +197,14 @@ public class HMMFile extends FileParse
    * @param index
    *          index of node which is beign scanned
    */
-  public void parseAnnotations(Scanner scanner, int index)
+  void parseAnnotations(Scanner scanner, int index)
   {
     if (hmm.mapIsActive())
     {
       int column;
       column = scanner.nextInt();
       hmm.getNodes().get(index).setAlignmentColumn(column);
+      hmm.getNodeLookup().put(column, index);
     }
     else
     {
@@ -236,43 +229,6 @@ public class HMMFile extends FileParse
     hmm.getNodes().get(index).setConsensusStructure(consensusS);
   }
 
-  /**
-   * 
-   * @param transition
-   *          type of transition occuring
-   * @return index value representing position along stateTransition array.
-   */
-  public Integer getTransitionType(String transition)
-  {
-    Integer index;
-    switch (transition)
-    {
-    case "mm":
-      index = 0;
-      break;
-    case "mi":
-      index = 1;
-      break;
-    case "md":
-      index = 2;
-      break;
-    case "im":
-      index = 3;
-      break;
-    case "ii":
-      index = 4;
-      break;
-    case "dm":
-      index = 5;
-      break;
-    case "dd":
-      index = 6;
-      break;
-    default:
-      index = null;
-    }
-    return index;
-  }
 
   /**
    * 
@@ -282,7 +238,7 @@ public class HMMFile extends FileParse
    *          number of elements in the list to be filled
    * @return filled list
    */
-  public static List<Double> fillList(Scanner input,
+  static List<Double> fillList(Scanner input,
           int numberOfElements)
   {
     List<Double> list = new ArrayList<>();
@@ -325,9 +281,13 @@ public class HMMFile extends FileParse
     
     file.append("//");
 
+    PrintWriter output = new PrintWriter(exportLocation);
+    output.append(file);
+    output.close();
+
   }
 
-  public String addData(int initialColumnSeparation,
+  String addData(int initialColumnSeparation,
           int columnSeparation, List<String> data)
   {
     String line = EMPTY;
@@ -347,7 +307,7 @@ public class HMMFile extends FileParse
     return line;
   }
 
-  public static List<String> charListToStringList(List<Character> list)
+  List<String> charListToStringList(List<Character> list)
   {
     List<String> strList = new ArrayList<>();
     for (char value : list)
@@ -358,7 +318,7 @@ public class HMMFile extends FileParse
     return strList;
   }
 
-  public static List<String> doubleListToStringList(List<Double> list,
+  List<String> doubleListToStringList(List<Double> list,
           int noOfDecimals)
   {
     List<String> strList = new ArrayList<>();
@@ -379,7 +339,7 @@ public class HMMFile extends FileParse
     return strList;
   }
 
-  public static List<String> stringArrayToStringList(String[] array)
+  List<String> stringArrayToStringList(String[] array)
   {
     List<String> list = new ArrayList<>();
     for (String value : array)
@@ -489,26 +449,40 @@ public class HMMFile extends FileParse
     line = String.format("%-5s %1s", "ALPH", hmm.getAlphabetType());
     file.append((line + NEW_LINE));
 
+    boolean status;
+    String statusStr;
+
+    status = hmm.referenceAnnotationIsActive();
+    statusStr = HiddenMarkovModel.findStringFromBoolean(status);
     line = String.format("%-5s %1s", "RF",
-            hmm.getFileProperties().get("RF"));
+            statusStr);
     file.append((line + NEW_LINE));
 
+    status = hmm.maskValueIsActive();
+    statusStr = HiddenMarkovModel.findStringFromBoolean(status);
     line = String.format("%-5s %1s", "MM",
-            hmm.getFileProperties().get("MM"));
+            statusStr);
     file.append((line + NEW_LINE));
     
+    status = hmm.consensusResidueIsActive();
+    statusStr = HiddenMarkovModel.findStringFromBoolean(status);
     line = String.format("%-5s %1s", "CONS",
-            hmm.getFileProperties().get("CONS"));
+            statusStr);
     file.append((line + NEW_LINE));
 
+    status = hmm.consensusStructureIsActive();
+    statusStr = HiddenMarkovModel.findStringFromBoolean(status);
     line = String.format("%-5s %1s", "CS",
-            hmm.getFileProperties().get("CS"));
+            statusStr);
     file.append((line + NEW_LINE));
 
+    status = hmm.mapIsActive();
+    statusStr = HiddenMarkovModel.findStringFromBoolean(status);
     line = String.format("%-5s %1s", "MAP",
-            hmm.getFileProperties().get("MAP"));
+            statusStr);
     file.append((line + NEW_LINE));
 
+
     if (hmm.getDate() != null)
     {
     line = String.format("%-5s %1s", "DATE", hmm.getDate());
@@ -563,11 +537,18 @@ public class HMMFile extends FileParse
 
 
 
-  public static char charValue(String string)
+  char charValue(String string)
   {
     char character;
     character = string.charAt(0);
     return character;
   }
+
+  @Override
+  public String print(SequenceI[] seqs, boolean jvsuffix)
+  {
+
+    return null;
+  }
 }
 
index 035c1fa..6573cbb 100755 (executable)
@@ -149,6 +149,11 @@ public class IdentifyFile
           reply = FileFormat.ScoreMatrix;
           break;
         }
+        if (data.startsWith("HMMER3"))
+        {
+          reply = FileFormat.HMMER3;
+          break;
+        }
         if (data.startsWith("H ") && !aaIndexHeaderRead)
         {
           aaIndexHeaderRead = true;
index 55e3721..8ac2cf8 100644 (file)
@@ -7,6 +7,7 @@ import jalview.datamodel.HMMNode;
 import jalview.datamodel.HiddenMarkovModel;
 
 import java.io.BufferedReader;
+import java.io.File;
 import java.io.FileReader;
 import java.io.IOException;
 import java.util.ArrayList;
@@ -17,41 +18,52 @@ import org.testng.annotations.Test;
 
 public class HMMFileTest {
 
-  HMMFile fn3 = new HMMFile("H:/fn3.hmm");
 
-  HMMFile emptyFile = new HMMFile("H:/EmptyFile.hmm");
 
-  HMMFile pKinase = new HMMFile("H:/Pkinase.hmm");
+  HMMFile fn3 = new HMMFile(
+          new FileParse("H:/fn3.hmm", DataSourceType.FILE));
+
+  HMMFile pKinase = new HMMFile(
+          new FileParse("H:/Pkinase.hmm", DataSourceType.FILE));
+
+  HMMFile made1 = new HMMFile(
+          new FileParse("H:/MADE1.hmm", DataSourceType.FILE));
+
+  HMMFileTest() throws IOException
+  {
+
+  }
+
+  
 
-  HMMFile made1 = new HMMFile("H:/MADE1.hmm");
 
   @Test
   public void testParse() throws IOException
   {
-
+  
     pKinase.parse();
-
-    assertEquals(pKinase.hmm.getName(), "Pkinase");
-    assertEquals(pKinase.hmm.getAccessionNumber(), "PF00069.17");
-    assertEquals(pKinase.hmm.getDescription(), "Protein kinase domain");
-    assertEquals(pKinase.hmm.getLength().intValue(), 260);
-    assertNull(pKinase.hmm.getMaxInstanceLength());
-    assertEquals(pKinase.hmm.getAlphabetType(), "amino");
-    assertEquals(pKinase.hmm.referenceAnnotationIsActive(), false);
-    assertEquals(pKinase.hmm.maskValueIsActive(), false);
-    assertEquals(pKinase.hmm.consensusResidueIsActive(), true);
-    assertEquals(pKinase.hmm.consensusStructureIsActive(),
+    HiddenMarkovModel hmm = pKinase.getHMM();
+    assertEquals(hmm.getName(), "Pkinase");
+    assertEquals(hmm.getAccessionNumber(), "PF00069.17");
+    assertEquals(hmm.getDescription(), "Protein kinase domain");
+    assertEquals(hmm.getLength().intValue(), 260);
+    assertNull(hmm.getMaxInstanceLength());
+    assertEquals(hmm.getAlphabetType(), "amino");
+    assertEquals(hmm.referenceAnnotationIsActive(), false);
+    assertEquals(hmm.maskValueIsActive(), false);
+    assertEquals(hmm.consensusResidueIsActive(), true);
+    assertEquals(hmm.consensusStructureIsActive(),
             true);
-    assertEquals(pKinase.hmm.mapIsActive(), true);
-    assertEquals(pKinase.hmm.getDate(), "Thu Jun 16 11:44:06 2011");
-    assertNull(pKinase.hmm.getCommandLineLog());
-    assertEquals(pKinase.hmm.getNumberOfSequences().intValue(), 54);
-    assertEquals(pKinase.hmm.getEffectiveNumberOfSequences(), 3.358521, 4d);
-    assertEquals(pKinase.hmm.getCheckSum().longValue(), 3106786190l);
-    assertEquals(pKinase.hmm.getGatheringThreshold(), "70.30 70.30");
-    assertEquals(pKinase.hmm.getTrustedCutoff(), "70.30 70.30");
-    assertEquals(pKinase.hmm.getNoiseCutoff(), "70.20 70.20");
-
+    assertEquals(hmm.mapIsActive(), true);
+    assertEquals(hmm.getDate(), "Thu Jun 16 11:44:06 2011");
+    assertNull(hmm.getCommandLineLog());
+    assertEquals(hmm.getNumberOfSequences().intValue(), 54);
+    assertEquals(hmm.getEffectiveNumberOfSequences(), 3.358521, 4d);
+    assertEquals(hmm.getCheckSum().longValue(), 3106786190l);
+    assertEquals(hmm.getGatheringThreshold(), "70.30 70.30");
+    assertEquals(hmm.getTrustedCutoff(), "70.30 70.30");
+    assertEquals(hmm.getNoiseCutoff(), "70.20 70.20");
+  
     List<Character> symbols = new ArrayList<>();
     symbols.add('A');
     symbols.add('C');
@@ -73,75 +85,75 @@ public class HMMFileTest {
     symbols.add('V');
     symbols.add('W');
     symbols.add('Y');
-
-    assertEquals(pKinase.hmm.getSymbols(), symbols);
-
-    assertEquals(pKinase.hmm.getMatchEmission(0, 19), 3.43274);
-    assertEquals(pKinase.hmm.getMatchEmission(12, 12), 4.33979);
-    assertEquals(pKinase.hmm.getMatchEmission(23, 7), 3.65600);
-    assertEquals(pKinase.hmm.getMatchEmission(54, 1), 4.76187);
-    assertEquals(pKinase.hmm.getMatchEmission(79, 0), 2.81579);
-    assertEquals(pKinase.hmm.getMatchEmission(100, 0), 1.86496);
-    assertEquals(pKinase.hmm.getMatchEmission(112, 14), 2.77179);
-    assertEquals(pKinase.hmm.getMatchEmission(143, 17), 5.10478);
-    assertEquals(pKinase.hmm.getMatchEmission(156, 4), 4.69372);
-    assertEquals(pKinase.hmm.getMatchEmission(178, 3), 2.52594);
-    assertEquals(pKinase.hmm.getMatchEmission(210, 2), 4.23598);
-    assertEquals(pKinase.hmm.getMatchEmission(260, 19), 3.81122);
-
-    assertEquals(pKinase.hmm.getInsertEmission(2, 1), 4.42225);
-    assertEquals(pKinase.hmm.getInsertEmission(15, 6), 3.72501);
-    assertEquals(pKinase.hmm.getInsertEmission(22, 9), 2.69355);
-    assertEquals(pKinase.hmm.getInsertEmission(57, 2), 2.77519);
-    assertEquals(pKinase.hmm.getInsertEmission(62, 14), 2.89801);
-    assertEquals(pKinase.hmm.getInsertEmission(95, 17), 2.98532);
-    assertEquals(pKinase.hmm.getInsertEmission(105, 4), 3.46354);
-    assertEquals(pKinase.hmm.getInsertEmission(134, 1), 4.42225);
-    assertEquals(pKinase.hmm.getInsertEmission(143, 0), 2.68618);
-    assertEquals(pKinase.hmm.getInsertEmission(152, 16), 2.77519);
-    assertEquals(pKinase.hmm.getInsertEmission(203, 16), 2.77519);
-    assertEquals(pKinase.hmm.getInsertEmission(255, 12), 2.73739);
-
-    assertEquals(pKinase.hmm.getStateTransition(0, 6),
+  
+    assertEquals(hmm.getSymbols(), symbols);
+  
+    assertEquals(getMatchEmission(0, 19, hmm), 3.43274);
+    assertEquals(getMatchEmission(12, 12, hmm), 4.33979);
+    assertEquals(getMatchEmission(23, 7, hmm), 3.65600);
+    assertEquals(getMatchEmission(54, 1, hmm), 4.76187);
+    assertEquals(getMatchEmission(79, 0, hmm), 2.81579);
+    assertEquals(getMatchEmission(100, 0, hmm), 1.86496);
+    assertEquals(getMatchEmission(112, 14, hmm), 2.77179);
+    assertEquals(getMatchEmission(143, 17, hmm), 5.10478);
+    assertEquals(getMatchEmission(156, 4, hmm), 4.69372);
+    assertEquals(getMatchEmission(178, 3, hmm), 2.52594);
+    assertEquals(getMatchEmission(210, 2, hmm), 4.23598);
+    assertEquals(getMatchEmission(260, 19, hmm), 3.81122);
+  
+    assertEquals(getInsertEmission(2, 1, hmm), 4.42225);
+    assertEquals(getInsertEmission(15, 6, hmm), 3.72501);
+    assertEquals(getInsertEmission(22, 9, hmm), 2.69355);
+    assertEquals(getInsertEmission(57, 2, hmm), 2.77519);
+    assertEquals(getInsertEmission(62, 14, hmm), 2.89801);
+    assertEquals(getInsertEmission(95, 17, hmm), 2.98532);
+    assertEquals(getInsertEmission(105, 4, hmm), 3.46354);
+    assertEquals(getInsertEmission(134, 1, hmm), 4.42225);
+    assertEquals(getInsertEmission(143, 0, hmm), 2.68618);
+    assertEquals(getInsertEmission(152, 16, hmm), 2.77519);
+    assertEquals(getInsertEmission(203, 16, hmm), 2.77519);
+    assertEquals(getInsertEmission(255, 12, hmm), 2.73739);
+  
+    assertEquals(getStateTransition(0, 6, hmm),
             Double.NEGATIVE_INFINITY);
-    assertEquals(pKinase.hmm.getStateTransition(3, 6), 0.95510);
-    assertEquals(pKinase.hmm.getStateTransition(29, 3), 0.61958);
-    assertEquals(pKinase.hmm.getStateTransition(46, 4), 0.77255);
-    assertEquals(pKinase.hmm.getStateTransition(53, 1), 5.01631);
-    assertEquals(pKinase.hmm.getStateTransition(79, 2), 5.73865);
-    assertEquals(pKinase.hmm.getStateTransition(101, 2), 5.73865);
-    assertEquals(pKinase.hmm.getStateTransition(120, 5), 0.48576);
-    assertEquals(pKinase.hmm.getStateTransition(146, 5), 0.70219);
-    assertEquals(pKinase.hmm.getStateTransition(169, 3), 1.23224);
-    assertEquals(pKinase.hmm.getStateTransition(209, 0), 0.01003);
-    assertEquals(pKinase.hmm.getStateTransition(243, 1), 5.01631);
-
-    assertEquals(pKinase.hmm.getNodeAlignmentColumn(3).intValue(), 3);
-    assertEquals(pKinase.hmm.getReferenceAnnotation(7), '-');
-    assertEquals(pKinase.hmm.getConsensusResidue(23), 't');
-    assertEquals(pKinase.hmm.getMaskedValue(30), '-');
-    assertEquals(pKinase.hmm.getConsensusStructure(56), 'S');
-
-    assertEquals(pKinase.hmm.getNodeAlignmentColumn(78).intValue(), 136);
-    assertEquals(pKinase.hmm.getReferenceAnnotation(93), '-');
-    assertEquals(pKinase.hmm.getConsensusResidue(145), 'a');
-    assertEquals(pKinase.hmm.getMaskedValue(183), '-');
-    assertEquals(pKinase.hmm.getConsensusStructure(240), 'H');
-
+    assertEquals(getStateTransition(3, 6, hmm), 0.95510);
+    assertEquals(getStateTransition(29, 3, hmm), 0.61958);
+    assertEquals(getStateTransition(46, 4, hmm), 0.77255);
+    assertEquals(getStateTransition(53, 1, hmm), 5.01631);
+    assertEquals(getStateTransition(79, 2, hmm), 5.73865);
+    assertEquals(getStateTransition(101, 2, hmm), 5.73865);
+    assertEquals(getStateTransition(120, 5, hmm), 0.48576);
+    assertEquals(getStateTransition(146, 5, hmm), 0.70219);
+    assertEquals(getStateTransition(169, 3, hmm), 1.23224);
+    assertEquals(getStateTransition(209, 0, hmm), 0.01003);
+    assertEquals(getStateTransition(243, 1, hmm), 5.01631);
+  
+    assertEquals(hmm.getNodeAlignmentColumn(3).intValue(), 3);
+    assertEquals(hmm.getReferenceAnnotation(7), '-');
+    assertEquals(hmm.getConsensusResidue(23), 't');
+    assertEquals(hmm.getMaskedValue(30), '-');
+    assertEquals(hmm.getConsensusStructure(56), 'S');
+  
+    assertEquals(hmm.getNodeAlignmentColumn(78).intValue(), 136);
+    assertEquals(hmm.getReferenceAnnotation(93), '-');
+    assertEquals(hmm.getConsensusResidue(145), 'a');
+    assertEquals(hmm.getMaskedValue(183), '-');
+    assertEquals(hmm.getConsensusStructure(240), 'H');
+  
   }
-
+  
   @Test
   public void testParseFileProperties() throws IOException
   {
-    FileReader fr = new FileReader(fn3.getDataObject());
+    FileReader fr = new FileReader(new File("H:/fn3.hmm"));
     BufferedReader br = new BufferedReader(fr);
     fn3.parseFileProperties(br);
     fn3.parseModel(br); // this is for a later test
     HiddenMarkovModel testHMM = new HiddenMarkovModel();
-    testHMM = fn3.getHmm();
+    testHMM = fn3.getHMM();
     br.close();
     fr.close();
-
+  
     assertEquals(testHMM.getName(), "fn3");
     assertEquals(testHMM.getAccessionNumber(), "PF00041.13");
     assertEquals(testHMM.getDescription(),
@@ -165,48 +177,15 @@ public class HMMFileTest {
     assertEquals(testHMM.getViterbi(), "-9.7737  0.71847");
     assertEquals(testHMM.getMSV(), "-9.4043  0.71847");
     assertEquals(testHMM.getForward(), "-3.8341  0.71847");
-
-    FileReader fr2 = new FileReader(emptyFile.getDataObject());
-    BufferedReader br2 = new BufferedReader(fr2);
-    emptyFile.parseFileProperties(br2);
-    testHMM = emptyFile.getHmm();
-    br2.close();
-    fr2.close();
-
-    assertNull(testHMM.getName());
-    assertNull(testHMM.getAccessionNumber());
-    assertNull(testHMM.getDescription());
-    assertNull(testHMM.getLength());
-    assertNull(testHMM.getMaxInstanceLength());
-    assertNull(testHMM.getAlphabetType());
-    assertEquals(testHMM.referenceAnnotationIsActive(), false);
-    assertEquals(testHMM.maskValueIsActive(), false);
-    assertEquals(testHMM.consensusResidueIsActive(), false);
-    assertEquals(testHMM.consensusStructureIsActive(),
-            false);
-    assertEquals(testHMM.mapIsActive(), false);
-    assertNull(testHMM.getDate());
-    assertNull(testHMM.getCommandLineLog());
-    assertNull(testHMM.getNumberOfSequences());
-    assertNull(testHMM.getEffectiveNumberOfSequences());
-    assertNull(testHMM.getCheckSum());
-    assertNull(testHMM.getGatheringThreshold());
-    assertNull(testHMM.getGatheringThreshold());
-    assertNull(testHMM.getTrustedCutoff());
-    assertNull(testHMM.getTrustedCutoff());
-    assertNull(testHMM.getNoiseCutoff());
-    assertNull(testHMM.getNoiseCutoff());
-    assertNull(testHMM.getViterbi());
-    assertNull(testHMM.getMSV());
-    assertNull(testHMM.getForward());
-
-    FileReader fr3 = new FileReader(made1.getDataObject());
+  
+  
+    FileReader fr3 = new FileReader(new File("H:/MADE1.hmm"));
     BufferedReader br3 = new BufferedReader(fr3);
     made1.parseFileProperties(br3);
-    testHMM = made1.getHmm();
+    testHMM = made1.getHMM();
     br3.close();
     fr3.close();
-
+  
     assertEquals(testHMM.getName(), "MADE1");
     assertEquals(testHMM.getAccessionNumber(), "DF0000629.2");
     assertEquals(testHMM.getDescription(),
@@ -230,31 +209,31 @@ public class HMMFileTest {
     assertEquals(testHMM.getViterbi(), "-9.3632  0.71858");
     assertEquals(testHMM.getMSV(), "-8.5786  0.71858");
     assertEquals(testHMM.getForward(), "-3.4823  0.71858");
-
-
+  
+  
   }
-
+  
   @Test
   public void testGetTransitionType()
   {
-
-    assertEquals(fn3.getTransitionType("mm").intValue(), 0);
-    assertEquals(fn3.getTransitionType("mi").intValue(), 1);
-    assertEquals(fn3.getTransitionType("md").intValue(), 2);
-    assertEquals(fn3.getTransitionType("im").intValue(), 3);
-    assertEquals(fn3.getTransitionType("ii").intValue(), 4);
-    assertEquals(fn3.getTransitionType("dm").intValue(), 5);
-    assertEquals(fn3.getTransitionType("dd").intValue(), 6);
-    assertNull(fn3.getTransitionType("df"));
-
+    HiddenMarkovModel hmm = fn3.getHMM();
+    assertEquals(hmm.getTransitionType("mm").intValue(), 0);
+    assertEquals(hmm.getTransitionType("mi").intValue(), 1);
+    assertEquals(hmm.getTransitionType("md").intValue(), 2);
+    assertEquals(hmm.getTransitionType("im").intValue(), 3);
+    assertEquals(hmm.getTransitionType("ii").intValue(), 4);
+    assertEquals(hmm.getTransitionType("dm").intValue(), 5);
+    assertEquals(hmm.getTransitionType("dd").intValue(), 6);
+    assertNull(hmm.getTransitionType("df"));
+  
   }
-
+  
   @Test
   public void testFillList()
   {
     Scanner scanner1 = new Scanner("1.3 2.4 5.3 3.9 9.8 4.7 4.3 2.3 6.9");
     ArrayList<Double> filledArray = new ArrayList<>();
-
+  
     filledArray.add(1.3);
     filledArray.add(2.4);
     filledArray.add(5.3);
@@ -264,11 +243,11 @@ public class HMMFileTest {
     filledArray.add(4.3);
     filledArray.add(2.3);
     filledArray.add(6.9);
-
+  
     assertEquals(HMMFile.fillList(scanner1, 9), filledArray);
     filledArray.clear();
     scanner1.close();
-
+  
     Scanner scanner2 = new Scanner(
             "1.346554 5.58756754 35.3523645 12345.3564 1.4");
     filledArray.add(1.346554);
@@ -276,16 +255,16 @@ public class HMMFileTest {
     filledArray.add(35.3523645);
     filledArray.add(12345.3564);
     filledArray.add(1.4);
-
+  
     assertEquals(HMMFile.fillList(scanner2, 5), filledArray);
     scanner2.close();
-
+  
   }
-
+  
   @Test
   public void testParseModel() throws IOException
   {
-    FileReader fr = new FileReader(made1.getDataObject());
+    FileReader fr = new FileReader(new File("H:/MADE1.hmm"));
     BufferedReader br = new BufferedReader(fr);
     HiddenMarkovModel testHMM = new HiddenMarkovModel();
     for (int i = 0; i < 24; i++)
@@ -293,95 +272,169 @@ public class HMMFileTest {
       br.readLine();
     }
     made1.parseModel(br);
-    testHMM = made1.getHmm();
+    testHMM = made1.getHMM();
     br.close();
     fr.close();
-
-    assertEquals(testHMM.getMatchEmission(0, 2), 1.62906);
-    assertEquals(testHMM.getMatchEmission(2, 1), 2.37873);
-    assertEquals(testHMM.getMatchEmission(12, 2), 2.61355);
-    assertEquals(testHMM.getMatchEmission(26, 0), 1.86925);
-    assertEquals(testHMM.getMatchEmission(32, 3), 2.58263);
-    assertEquals(testHMM.getMatchEmission(59, 3), 2.20507);
-    assertEquals(testHMM.getMatchEmission(63, 0), 0.41244);
-    assertEquals(testHMM.getMatchEmission(69, 1), 3.17398);
-    assertEquals(testHMM.getMatchEmission(76, 2), 2.65861);
-
-    assertEquals(testHMM.getInsertEmission(0, 1), 1.38629);
-    assertEquals(testHMM.getInsertEmission(1, 2), 1.38629);
-    assertEquals(testHMM.getInsertEmission(31, 3), 1.28150);
-    assertEquals(testHMM.getInsertEmission(43, 0), 1.32290);
-    assertEquals(testHMM.getInsertEmission(48, 2), 1.52606);
-    assertEquals(testHMM.getInsertEmission(52, 1), 1.62259);
-    assertEquals(testHMM.getInsertEmission(67, 0), 1.38141);
-    assertEquals(testHMM.getInsertEmission(70, 3), 1.38629);
-    assertEquals(testHMM.getInsertEmission(80, 3), 1.38629);
-
-    assertEquals(testHMM.getStateTransition(2, 0), 0.03725);
-    assertEquals(testHMM.getStateTransition(6, 1), 3.89715);
-    assertEquals(testHMM.getStateTransition(9, 3), 1.38021);
-    assertEquals(testHMM.getStateTransition(20, 4), 0.23815);
-    assertEquals(testHMM.getStateTransition(34, 6), 0.33363);
-    assertEquals(testHMM.getStateTransition(46, 5), 1.05474);
-    assertEquals(testHMM.getStateTransition(57, 6), 0.31164);
-    assertEquals(testHMM.getStateTransition(68, 2), 3.99242);
-    assertEquals(testHMM.getStateTransition(80, 6),
+  
+    assertEquals(getMatchEmission(0, 2, testHMM), 1.62906);
+    assertEquals(getMatchEmission(2, 1, testHMM), 2.37873);
+    assertEquals(getMatchEmission(12, 2, testHMM), 2.61355);
+    assertEquals(getMatchEmission(26, 0, testHMM), 1.86925);
+    assertEquals(getMatchEmission(32, 3, testHMM), 2.58263);
+    assertEquals(getMatchEmission(59, 3, testHMM), 2.20507);
+    assertEquals(getMatchEmission(63, 0, testHMM), 0.41244);
+    assertEquals(getMatchEmission(69, 1, testHMM), 3.17398);
+    assertEquals(getMatchEmission(76, 2, testHMM), 2.65861);
+  
+    assertEquals(getInsertEmission(0, 1, testHMM), 1.38629);
+    assertEquals(getInsertEmission(1, 2, testHMM), 1.38629);
+    assertEquals(getInsertEmission(31, 3, testHMM), 1.28150);
+    assertEquals(getInsertEmission(43, 0, testHMM), 1.32290);
+    assertEquals(getInsertEmission(48, 2, testHMM), 1.52606);
+    assertEquals(getInsertEmission(52, 1, testHMM), 1.62259);
+    assertEquals(getInsertEmission(67, 0, testHMM), 1.38141);
+    assertEquals(getInsertEmission(70, 3, testHMM), 1.38629);
+    assertEquals(getInsertEmission(80, 3, testHMM), 1.38629);
+  
+    assertEquals(getStateTransition(2, 0, testHMM), 0.03725);
+    assertEquals(getStateTransition(6, 1, testHMM), 3.89715);
+    assertEquals(getStateTransition(9, 3, testHMM), 1.38021);
+    assertEquals(getStateTransition(20, 4, testHMM), 0.23815);
+    assertEquals(getStateTransition(34, 6, testHMM), 0.33363);
+    assertEquals(getStateTransition(46, 5, testHMM), 1.05474);
+    assertEquals(getStateTransition(57, 6, testHMM), 0.31164);
+    assertEquals(getStateTransition(68, 2, testHMM), 3.99242);
+    assertEquals(getStateTransition(80, 6, testHMM),
             Double.NEGATIVE_INFINITY);
-
+  
   }
-
+  
   @Test
   public void testParseAnnotations()
   {
-    HMMFile testFile = new HMMFile("H:/EmptyFile.hmm");
-    testFile.hmm.getNodes().add(new HMMNode());
-    testFile.hmm.getNodes().add(new HMMNode());
-
-    testFile.hmm.setConsensusResidueStatus(true);
-    testFile.hmm.setMAPStatus(true);
-    testFile.hmm.setReferenceAnnotationStatus(true);
-    testFile.hmm.setConsensusStructureStatus(true);
-    testFile.hmm.setMaskedValueStatus(true);
+    HMMFile testFile = new HMMFile();
+    testFile.getHMM().getNodes().add(new HMMNode());
+    testFile.getHMM().getNodes().add(new HMMNode());
+    testFile.getHMM().getNodes().add(new HMMNode());
+  
+  
+    testFile.getHMM().setConsensusResidueStatus(true);
+    testFile.getHMM().setMAPStatus(true);
+    testFile.getHMM().setReferenceAnnotationStatus(true);
+    testFile.getHMM().setConsensusStructureStatus(true);
+    testFile.getHMM().setMaskedValueStatus(true);
     Scanner scanner = new Scanner("1345 t t t t");
-    testFile.parseAnnotations(scanner, 0);
-    assertEquals(testFile.hmm.getNodeAlignmentColumn(0).intValue(), 1345);
-    assertEquals(testFile.hmm.getConsensusResidue(0), 't');
-    assertEquals(testFile.hmm.getReferenceAnnotation(0), 't');
-    assertEquals(testFile.hmm.getMaskedValue(0), 't');
-    assertEquals(testFile.hmm.getConsensusStructure(0), 't');
-
-    scanner.close();
-
-    testFile.hmm.setConsensusResidueStatus(true);
-    testFile.hmm.setMAPStatus(false);
-    testFile.hmm.setReferenceAnnotationStatus(true);
-    testFile.hmm.setConsensusStructureStatus(false);
-    testFile.hmm.setMaskedValueStatus(false);
+    testFile.parseAnnotations(scanner, 1);
+  
+    testFile.getHMM().setConsensusResidueStatus(true);
+    testFile.getHMM().setMAPStatus(false);
+    testFile.getHMM().setReferenceAnnotationStatus(true);
+    testFile.getHMM().setConsensusStructureStatus(false);
+    testFile.getHMM().setMaskedValueStatus(false);
     Scanner scanner2 = new Scanner("- y x - -");
-    testFile.parseAnnotations(scanner2, 1);
-    assertNull(testFile.hmm.getNodeAlignmentColumn(1));
-    assertEquals(testFile.hmm.getConsensusResidue(1), 'y');
-    assertEquals(testFile.hmm.getReferenceAnnotation(1), 'x');
-    assertEquals(testFile.hmm.getMaskedValue(1), '-');
-    assertEquals(testFile.hmm.getConsensusStructure(1), '-');
-
+    testFile.parseAnnotations(scanner2, 2);
+  
+    HiddenMarkovModel hmm = testFile.getHMM();
+  
+    assertEquals(hmm.getNodeAlignmentColumn(1).intValue(), 1345);
+    assertEquals(hmm.getConsensusResidue(1), 't');
+    assertEquals(hmm.getReferenceAnnotation(1), 't');
+    assertEquals(hmm.getMaskedValue(1), 't');
+    assertEquals(hmm.getConsensusStructure(1), 't');
+  
+    assertEquals(hmm.findNodeIndex(1345).intValue(), 1);
+  
+    scanner.close();
+  
+    assertNull(hmm.getNodeAlignmentColumn(2));
+    assertEquals(hmm.getConsensusResidue(2), 'y');
+    assertEquals(hmm.getReferenceAnnotation(2), 'x');
+    assertEquals(hmm.getMaskedValue(2), '-');
+    assertEquals(hmm.getConsensusStructure(2), '-');
+  
+    assertNull(hmm.findNodeIndex(2));
+  
     scanner2.close();
   }
+  
+  /**
+   * tests to see if file produced by the output matches the file from the input
+   * 
+   * @throws IOException
+   */
+
 
   @Test(priority = 3)
   public void testExportFile() throws IOException
   {
-
-    fn3.exportFile("H:/WriteFileTest.hmm");
+    fn3.exportFile("H:/WriteFileTest.txt");
+    HMMFile fn3Clone = new HMMFile(
+            new FileParse("H:/WriteFileTest.txt", DataSourceType.FILE));
+    fn3Clone.parse();
+    HiddenMarkovModel fn3HMM = new HiddenMarkovModel();
+    HiddenMarkovModel fn3CloneHMM = new HiddenMarkovModel();
+    fn3HMM = fn3.getHMM();
+    fn3CloneHMM = fn3Clone.getHMM();
+  
+    for (int i = 0; i < fn3HMM.getLength(); i++)
+    {
+      List<Double> list1;
+      List<Double> list2;
+      boolean result;
+  
+      list1 = fn3HMM.getNode(i).getMatchEmissions();
+      list2 = fn3CloneHMM.getNode(i).getMatchEmissions();
+  
+      result = checkIfListsAreIdentical(list1, list2);
+      assertEquals(result, true);
+  
+      list1 = fn3HMM.getNode(i).getInsertEmissions();
+      list2 = fn3CloneHMM.getNode(i).getInsertEmissions();
+  
+      result = checkIfListsAreIdentical(list1, list2);
+      assertEquals(result, true);
+  
+      list1 = fn3HMM.getNode(i).getStateTransitions();
+      list2 = fn3CloneHMM.getNode(i).getStateTransitions();
+  
+      result = checkIfListsAreIdentical(list1, list2);
+      assertEquals(result, true);
+  
+      if (i > 0)
+      {
+        int alignColumn1;
+        int alignColumn2;
+  
+        alignColumn1 = fn3HMM.getNodeAlignmentColumn(i);
+        alignColumn2 = fn3CloneHMM.getNodeAlignmentColumn(i);
+  
+        assertEquals(alignColumn1, alignColumn2);
+  
+        char annotation1;
+        char annotation2;
+  
+        annotation1 = fn3HMM.getReferenceAnnotation(i);
+        annotation2 = fn3CloneHMM.getReferenceAnnotation(i);
+  
+        assertEquals(annotation1, annotation2);
+  
+        annotation1 = fn3HMM.getConsensusResidue(i);
+        annotation2 = fn3CloneHMM.getConsensusResidue(i);
+  
+        assertEquals(annotation1, annotation2);
+      }
+  
+    }
+  
   }
-
+  
   @Test(priority = 1)
   public void testAppendFileProperties()
   {
     StringBuilder testBuilder = new StringBuilder();
     fn3.appendFileProperties(testBuilder);
     Scanner testScanner = new Scanner(testBuilder.toString());
-
+  
     String[] expected = new String[] { "HMMER3/f [3.1b1 | May 2013]",
         "NAME  fn3", "ACC   PF00041.13",
         "DESC  Fibronectin type III domain", "LENG  86", "ALPH  amino",
@@ -391,15 +444,15 @@ public class HMMFileTest {
         "NC    7.90 7.90", "STATS LOCAL MSV       -9.4043  0.71847",
         "STATS LOCAL VITERBI   -9.7737  0.71847",
         "STATS LOCAL FORWARD   -3.8341  0.71847" };
-
+  
     for (String value : expected)
     {
       assertEquals(testScanner.nextLine(), value);
     }
-
+  
     testScanner.close();
   }
-
+  
   @Test(priority = 2)
   public void testAppendModel()
   {
@@ -408,17 +461,40 @@ public class HMMFileTest {
     String string = testBuilder.toString();
     assertEquals(findValue(2, 2, 2, string), "4.42225");
     assertEquals(findValue(12, 14, 1, string), "2.79307");
+    assertEquals(findValue(6, 24, 3, string), "0.48576");
+    assertEquals(findValue(19, 33, 2, string), "4.58477");
+    assertEquals(findValue(20, 64, 2, string), "3.61505");
+    assertEquals(findValue(3, 72, 3, string), "6.81068");
+    assertEquals(findValue(10, 80, 2, string), "2.69355");
+    assertEquals(findValue(16, 65, 1, string), "2.81003");
+    assertEquals(findValue(14, 3, 1, string), "2.69012");
+    assertEquals(findValue(11, 32, 1, string), "4.34805");
+  
   }
+  
+  /**
+   * 
+   * @param symbolIndex
+   *          index of symbol being searched. First symbol has index 1.
+   * @param nodeIndex
+   *          index of node being searched. Begin node has index 0. First node
+   *          has index 1.
+   * @param line
+   *          index of line being searched in node. First line has index 1.
+   * @param model
+   *          string model being searched
+   * @return value at specified position
+   */
 
   public String findValue(int symbolIndex, int nodeIndex, int line,
           String model)
   {
-
+  
     String value = "";
     Scanner scanner = new Scanner(model);
     scanner.nextLine();
     scanner.nextLine();
-
+  
     for (int lineIndex = 0; lineIndex < line - 1; lineIndex++)
     {
       scanner.nextLine();
@@ -429,7 +505,7 @@ public class HMMFileTest {
       scanner.nextLine();
       scanner.nextLine();
     }
-
+  
     for (int symbol = 0; symbol < symbolIndex; symbol++)
     {
       value = scanner.next();
@@ -441,10 +517,79 @@ public class HMMFileTest {
       {
         scanner.next();
       }
-
+  
+    }
+    return value;
+  
+  }
+  
+  public boolean checkIfListsAreIdentical(List<Double> list1,
+          List<Double> list2)
+  {
+    boolean isDifferent = false;
+    for (int i = 0; i < list1.size(); i++)
+    {
+      Double entry1;
+      Double entry2;
+      entry1 = list1.get(i);
+      entry2 = list2.get(i);
+      if (!(entry1 == entry2))
+      {
+        isDifferent = true;
+      }
     }
+    return isDifferent;
+  }
+
+  /**
+   * gets the match emission at a node for a symbol
+   * 
+   * @param nodeIndex
+   *          position of node in model
+   * @param symbolIndex
+   *          index of symbol being searched
+   * @return negative log probability of a match emission of the given symbol
+   */
+  public double getMatchEmission(int nodeIndex, int symbolIndex,
+          HiddenMarkovModel hmm)
+  {
+    double value = hmm.getNodes().get(nodeIndex).getMatchEmissions()
+            .get(symbolIndex);
+    return value;
+  }
+
+  /**
+   * gets the insert emission at a node for a symbol
+   * 
+   * @param nodeIndex
+   *          position of node in model
+   * @param symbolIndex
+   *          index of symbol being searched
+   * @return negative log probability of an insert emission of the given symbol
+   */
+  public double getInsertEmission(int nodeIndex, int symbolIndex,
+          HiddenMarkovModel hmm)
+  {
+    double value = hmm.getNodes().get(nodeIndex).getInsertEmissions()
+            .get(symbolIndex);
     return value;
+  }
 
+  /**
+   * gets the state transition at a node for a specific transition
+   * 
+   * @param nodeIndex
+   *          position of node in model
+   * @param transitionIndex
+   *          index of stransition being searched
+   * @return negative log probability of a state transition of the given type
+   */
+  public double getStateTransition(int nodeIndex, int transitionIndex,
+          HiddenMarkovModel hmm)
+  {
+    double value = hmm.getNodes().get(nodeIndex).getStateTransitions()
+            .get(transitionIndex);
+    return value;
   }
 
 }