Merge branch 'bug/JAL-3997_NPE_in_wrapped_mode' into develop
authorJim Procter <j.procter@dundee.ac.uk>
Tue, 19 Apr 2022 14:02:17 +0000 (15:02 +0100)
committerJim Procter <j.procter@dundee.ac.uk>
Tue, 19 Apr 2022 14:02:17 +0000 (15:02 +0100)
help/help/html/features/cursorMode.html
src/jalview/datamodel/AlignmentAnnotation.java
src/jalview/io/StockholmFile.java
test/jalview/io/StockholmFileTest.java

index ab09012..c28bd09 100755 (executable)
   <p>
     <b>Navigation</b>
   <ul>
-    <li>Cursor keys - Move cursor around the alignment.</li>
+    <li><em>Cursor (Arrow) keys</em> - Move cursor around the alignment.<br/>
+    <em>Shift+Cursor key</em> - move to next gap or aligned residue</li>
   </ul>
   <ul>
-    <li>S - Type a number x then press 'S' to jump to sequence x.</li>
+    <li><em>S</em> - Type a number x then press 'S' to jump to sequence x.</li>
   </ul>
   <ul>
-    <li>C - Type a number x then press 'C' to jump to column x.</li>
+    <li><em>C</em> - Type a number x then press 'C' to jump to column x.</li>
   </ul>
   <ul>
-    <li>P - Type a number x then press 'P' to jump to position x in
+    <li><em>P</em> - Type a number x then press 'P' to jump to position x in
       current sequence.</li>
   </ul>
   <ul>
   <p>
     <b>Defining Regions</b>
   <ul>
-    <li>Q - Define the top left corner of the selection area</li>
+    <li><em>Q</em> - Define the top left corner of the selection area</li>
   </ul>
   <ul>
-    <li>M - Define the bottom right corner of the selection area<br>
+    <li><em>M</em> - Define the bottom right corner of the selection area<br>
     </li>
   </ul>
   <p>
     <b>Editing The Alignment</b>
   <ul>
-    <li>Space - Insert a gap at the cursor position. <br> To
+    <li><em>Space</em> - Insert a gap at the cursor position. <br> To
       insert 12 spaces at the current cursor, type 12 before pressing
       Space.<br> To group insert, hold control or shift together
       with space.
     </li>
   </ul>
   <ul>
-    <li>Delete (or backspace) - Delete a gap at the cursor
+    <li><em>Delete (or backspace)</em> - Delete a gap at the cursor
       position.<br> To delete 12 spaces at the current cursor, type
       12 before pressing Delete (or backspace).<br> To group
       delete, hold down control or shift together with Delete (or
       backspace).
     </li>
   </ul>
+  <p>
+    Some keyboard operations are not available in keyboard mode. See <a
+      href="../keys.html">the full list of keystrokes</a>.
   </p>
 </body>
 </html>
index f3cdae6..0f41850 100755 (executable)
  */
 package jalview.datamodel;
 
-import java.util.Locale;
-
-import jalview.analysis.Rna;
-import jalview.analysis.SecStrConsensus.SimpleBP;
-import jalview.analysis.WUSSParseException;
-
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -33,9 +27,14 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 import java.util.Map.Entry;
 
+import jalview.analysis.Rna;
+import jalview.analysis.SecStrConsensus.SimpleBP;
+import jalview.analysis.WUSSParseException;
+
 /**
  * DOCUMENT ME!
  * 
@@ -382,21 +381,24 @@ public class AlignmentAnnotation
         // annotations[i].secondaryStructure + "'");
         // TODO: 2.8.2 should this ss symbol validation check be a function in
         // RNA/ResidueProperties ?
+        // allow for DSSP extended code:
+        // https://www.wikidoc.org/index.php/Secondary_structure#The_DSSP_code
+        // GHITEBS as well as C and X (for missing?)
         if (annotations[i].secondaryStructure == '('
                 || annotations[i].secondaryStructure == '['
                 || annotations[i].secondaryStructure == '<'
                 || annotations[i].secondaryStructure == '{'
                 || annotations[i].secondaryStructure == 'A'
-                || annotations[i].secondaryStructure == 'B'
-                || annotations[i].secondaryStructure == 'C'
+                // || annotations[i].secondaryStructure == 'B'
+                // || annotations[i].secondaryStructure == 'C'
                 || annotations[i].secondaryStructure == 'D'
                 // || annotations[i].secondaryStructure == 'E' // ambiguous on
                 // its own -- already checked above
                 || annotations[i].secondaryStructure == 'F'
-                || annotations[i].secondaryStructure == 'G'
+                // || annotations[i].secondaryStructure == 'G'
                 // || annotations[i].secondaryStructure == 'H' // ambiguous on
                 // its own -- already checked above
-                || annotations[i].secondaryStructure == 'I'
+                // || annotations[i].secondaryStructure == 'I'
                 || annotations[i].secondaryStructure == 'J'
                 || annotations[i].secondaryStructure == 'K'
                 || annotations[i].secondaryStructure == 'L'
@@ -406,12 +408,12 @@ public class AlignmentAnnotation
                 || annotations[i].secondaryStructure == 'P'
                 || annotations[i].secondaryStructure == 'Q'
                 || annotations[i].secondaryStructure == 'R'
-                || annotations[i].secondaryStructure == 'S'
-                || annotations[i].secondaryStructure == 'T'
+                // || annotations[i].secondaryStructure == 'S'
+                // || annotations[i].secondaryStructure == 'T'
                 || annotations[i].secondaryStructure == 'U'
                 || annotations[i].secondaryStructure == 'V'
                 || annotations[i].secondaryStructure == 'W'
-                || annotations[i].secondaryStructure == 'X'
+                // || annotations[i].secondaryStructure == 'X'
                 || annotations[i].secondaryStructure == 'Y'
                 || annotations[i].secondaryStructure == 'Z')
         {
@@ -547,12 +549,12 @@ public class AlignmentAnnotation
                       : annotations[index + offset].displayCharacter == null
                               || annotations[index
                                       + offset].displayCharacter
-                                              .length() == 0
-                                                      ? annotations[index
-                                                              + offset].secondaryStructure
-                                                      : annotations[index
-                                                              + offset].displayCharacter
-                                                                      .charAt(0));
+                                      .length() == 0
+                                              ? annotations[index
+                                                      + offset].secondaryStructure
+                                              : annotations[index
+                                                      + offset].displayCharacter
+                                                      .charAt(0));
     }
 
     @Override
index cff328b..5d645ca 100644 (file)
@@ -90,7 +90,7 @@ public class StockholmFile extends AlignFile
   // use the following regex to decide an annotations (whole) line is NOT an RNA
   // SS (it contains only E,H,e,h and other non-brace/non-alpha chars)
   private static final Regex NOT_RNASS = new Regex(
-          "^[^<>[\\](){}A-DF-Za-df-z]*$");
+          "^[^<>[\\](){}ADFJ-RUVWYZadfj-ruvwyz]*$");
 
   StringBuffer out; // output buffer
 
index e4f2abc..b1995ab 100644 (file)
@@ -274,6 +274,11 @@ public class StockholmFileTest
     // check Alignment annotation
     AlignmentAnnotation[] aa_new = al_input.getAlignmentAnnotation();
     AlignmentAnnotation[] aa_original = al.getAlignmentAnnotation();
+    boolean expectProteinSS = !al.isNucleotide();
+    assertTrue(
+            "Alignments not both "
+                    + (al.isNucleotide() ? "nucleotide" : "protein"),
+            al_input.isNucleotide() == al.isNucleotide());
 
     // note - at moment we do not distinguish between alignment without any
     // annotation rows and alignment with no annotation row vector
@@ -292,6 +297,13 @@ public class StockholmFileTest
           assertEqualSecondaryStructure(
                   "Different alignment annotation at position " + i,
                   aa_original[i], aa_new[i], allowNullAnnotation);
+          if (aa_original[i].hasIcons)
+          {
+            assertTrue(
+                    "Secondary structure expected to be "
+                            + (expectProteinSS ? "protein" : "nucleotide"),
+                    expectProteinSS == !aa_original[i].isRNA());
+          }
           // compare graphGroup or graph properties - needed to verify JAL-1299
           assertEquals("Graph type not identical.", aa_original[i].graph,
                   aa_new[i].graph);