Merge branch 'test_paolo_JAL-1065' into Tcoffee_JAL-1065
authorjprocter <jprocter@compbio.dundee.ac.uk>
Fri, 4 May 2012 16:08:21 +0000 (17:08 +0100)
committerjprocter <jprocter@compbio.dundee.ac.uk>
Fri, 4 May 2012 16:08:21 +0000 (17:08 +0100)
Conflicts:
src/jalview/appletgui/AlignFrame.java
src/jalview/gui/AlignFrame.java
updated handler methods for creating colourscheme for new 'jalviewish' approach to storing tcoffee scores.

src/jalview/appletgui/AlignFrame.java
src/jalview/bin/JalviewLite.java
src/jalview/gui/AlignFrame.java
src/jalview/io/TCoffeeScoreFile.java
test/jalview/io/TCoffeeScoreFileTest.java

index cc2c966..90b1a05 100644 (file)
@@ -2334,7 +2334,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,  ItemLis
         {\r
           try\r
           {\r
-            sg.cs = (ColourSchemeI) cs.getClass().newInstance();\r
+            sg.cs = cs.getClass().newInstance();\r
           } catch (Exception ex)\r
           {\r
             ex.printStackTrace();\r
@@ -3681,16 +3681,28 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,  ItemLis
          \r
          TCoffeeScoreFile file = TCoffeeScoreFile.load( new InputStreamReader( url.openStream() ) );\r
          if( file == null ) {\r
+        // TODO: raise a dialog box here rather than bomb out.\r
+            \r
                  throw new RuntimeException("The file provided does not match the T-Coffee scores file format");\r
          }\r
-         // TODO add parameter to indicate if matching should be done\r
+         \r
+         /*\r
+          * check that the score matrix matches the alignment dimensions\r
+          */\r
+         AlignmentI aln; \r
+         if( (aln=viewport.alignment) != null && (aln.getHeight() != file.getHeight() || aln.getWidth() != file.getWidth()) ) {\r
+           // TODO: raise a dialog box here rather than bomb out.\r
+           throw new RuntimeException("The scores matrix does not match the alignment dimensions");\r
+                 \r
+         }\r
+         \r
+          // TODO add parameter to indicate if matching should be done\r
          if (file.annotateAlignment(alignPanel.getAlignment(), false))\r
          {\r
                  tcoffeeColour.setEnabled(true);\r
                  // switch to this color\r
                  changeColour(new TCoffeeColourScheme(alignPanel.getAlignment()));\r
           }\r
-\r
   }\r
   \r
   \r
index 5785ed1..2e5a184 100644 (file)
@@ -1871,7 +1871,6 @@ public class JalviewLite extends Applet implements
             try {\r
                URL urlScore = new URL(sScoreFile);\r
                newAlignFrame.loadScoreFile(urlScore);\r
-               //TODO check the scores matrix matches the MSA dimensions\r
                \r
             }\r
             catch( Exception e ) {\r
index 2ba0d59..221d52c 100755 (executable)
@@ -1014,7 +1014,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       }
       FormatAdapter f = new FormatAdapter();
       String output = f.formatSequences(format,
-              (Alignment) viewport.alignment, // class cast exceptions will
+              viewport.alignment, // class cast exceptions will
               // occur in the distant future
               omitHidden, f.getCacheSuffixDefault(format), viewport.colSel);
 
@@ -3065,7 +3065,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
         {
           try
           {
-            sg.cs = (ColourSchemeI) cs.getClass().newInstance();
+            sg.cs = cs.getClass().newInstance();
           } catch (Exception ex)
           {
           }
@@ -3881,9 +3881,20 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
              try 
              {
                  TCoffeeScoreFile result = TCoffeeScoreFile.load(new File(sFilePath));
-                 if( result == null ) { throw new RuntimeException("The file provided does not match the T-Coffee scores file format"); }
-
-                 // TODO check that the loaded scores matches the current MSA 'dimension'
+                 if( result == null ) { 
+                      // TODO: raise a dialog box here rather than bomb out.
+                 
+                         throw new RuntimeException("The file provided does not match the T-Coffee scores file format"); 
+                 }
+
+                 /*
+                  * check that the score matrix matches the alignment dimensions
+                  */
+                 AlignmentI aln; 
+                 if( (aln=viewport.alignment) != null && (aln.getHeight() != result.getHeight() || aln.getWidth() != result.getWidth()) ) {
+                     // TODO: raise a dialog box here rather than bomb out.
+                   throw new RuntimeException("The scores matrix does not match the alignment dimensions");
+                 }
                  if (result.annotateAlignment(alignPanel.getAlignment(), true))
                  {
                          tcoffeeColour.setEnabled(true);
index a28e461..6cab3ae 100644 (file)
@@ -82,7 +82,8 @@ public class TCoffeeScoreFile {
         * insertion order. 
         */
        LinkedHashMap<String,StringBuilder> scores = new LinkedHashMap<String,StringBuilder>();
-       
+
+       Integer fWidth;
 
        /**
         * Parse the specified file.
@@ -117,6 +118,25 @@ public class TCoffeeScoreFile {
        }
                
        /**
+        * @return The 'height' of the score matrix i.e. the numbers of score rows that should matches 
+        * the number of sequences in the alignment
+        */
+       public int getHeight() {
+               // the last entry will always be the 'global' alingment consensus scores, so it is removed 
+               // from the 'height' count to make this value compatible with the number of sequences in the MSA
+               return scores != null && scores.size() > 0 ? scores.size()-1 : 0;
+       }
+       
+       /**
+        * @return The 'width' of the score matrix i.e. the number of columns. 
+        * Since teh score value are supposd to be calculated for an 'aligned' MSA, all the entries 
+        * have to have the same width.  
+        */
+       public int getWidth() {
+               return fWidth != null ? fWidth : 0;
+       }
+       
+       /**
         * The default constructor is marked as {@code protected} since this class is meant to created 
         * through the {@link #load(File)} or {@link #load(Reader)} factory methods
         */
@@ -197,14 +217,27 @@ public class TCoffeeScoreFile {
                        for( Map.Entry<String,String> entry : block.items.entrySet() ) {
                                StringBuilder scoreStringBuilder = scores.get(entry.getKey());
                                if( scoreStringBuilder == null ) {
-                                       throw new RuntimeException(String.format("Invalid T-Coffee score file. Sequence ID '%s' is not declared in header section", entry.getKey()));
+                                       throw new RuntimeException(String.format("Invalid T-Coffee score file: Sequence ID '%s' is not declared in header section", entry.getKey()));
                                }
                                
                                scoreStringBuilder.append( entry.getValue() );
                        }
-                       
                }
                
+               /*
+                * verify that all rows have the same width
+                */
+               for( StringBuilder str : scores.values() ) {
+                       if( fWidth == null ) {
+                               fWidth = str.length();
+                       }
+                       else if( fWidth != str.length() ) {
+                               throw new RuntimeException("Invalid T-Coffee score file: All the score sequences must have the same length");
+                       }
+               }
+               
+               
+               
        }
 
 
index 27df5e0..7257e14 100644 (file)
@@ -42,6 +42,14 @@ public class TCoffeeScoreFileTest {
                TCoffeeScoreFile result = TCoffeeScoreFile.load(new File("./test/jalview/io/tcoffee.fasta_aln"));
                assertNull(result);
        } 
+
+       @Test
+       public void testHeightAndWidth() {
+               TCoffeeScoreFile result = TCoffeeScoreFile.load(new File("./test/jalview/io/tcoffee.score_ascii"));
+               assertNotNull(result);
+               assertEquals( 8, result.getHeight() );
+               assertEquals( 83, result.getWidth() );
+       }       
        
        @Test
        public void testReadBlock( ) throws IOException {