JAL-3878 update branch from 2.12 merge from 2.11.2
[jalview.git] / src / jalview / schemes / ResidueProperties.java
index 2eb303d..adbb55d 100755 (executable)
@@ -36,6 +36,13 @@ import java.util.Vector;
 
 public class ResidueProperties
 {
+  // alphabet names used in Hidden Markov Model files
+  public static final String ALPHABET_RNA = "RNA";
+
+  public static final String ALPHABET_DNA = "DNA";
+
+  public static final String ALPHABET_AMINO = "amino";
+
   // Stores residue codes/names and colours and other things
   public static final int[] aaIndex; // aaHash version 2.1.1 and below
 
@@ -52,6 +59,9 @@ public class ResidueProperties
   // lookup from modified amino acid (e.g. MSE) to canonical form (e.g. MET)
   public static final Map<String, String> modifications = new HashMap<>();
 
+  // residue background frequencies across different alphabets
+  public static final Map<String, Map<Character, Float>> backgroundFrequencies = new HashMap<>();
+
   static
   {
     aaIndex = new int[255];
@@ -407,6 +417,125 @@ public class ResidueProperties
       Color.white // ' '
   };
 
+  /*
+   * flower, blossom, sunset, ocean colour schemes from geocos.
+   * See https://gecos.biotite-python.org/
+   * https://raw.githubusercontent.com/biotite-dev/biotite/master/src/biotite/sequence/graphics/color_schemes/flower.json
+   * and https://bmcbioinformatics.biomedcentral.com/articles/10.1186/s12859-020-3526-6
+   * (https://doi.org/10.1186/s12859-020-3526-6)
+   */
+  public static final Color[] flower = { new Color(177, 138, 81), // A
+      new Color(131, 191, 241), // R
+      new Color(11, 206, 198), // N
+      new Color(1, 165, 120), // D
+      new Color(255, 87, 1), // C
+      new Color(114, 149, 174), // Q
+      new Color(45, 160, 161), // E
+      new Color(177, 194, 60), // G
+      new Color(1, 148, 249), // H
+      new Color(242, 118, 99), // I
+      new Color(223, 110, 117), // L
+      new Color(127, 195, 215), // K
+      new Color(254, 157, 175), // M
+      new Color(250, 85, 157), // F
+      new Color(79, 163, 42), // P
+      new Color(180, 189, 155), // S
+      new Color(210, 181, 118), // T
+      new Color(255, 45, 237), // W
+      new Color(201, 110, 207), // Y
+      new Color(253, 153, 123), // V
+      Color.white, // B
+      Color.white, // Z
+      Color.white, // X
+      Color.white, // -
+      Color.white, // *
+      Color.white // .
+  };
+
+  public static final Color[] blossom = { new Color(139, 196, 180), // A
+      new Color(252, 149, 2), // R
+      new Color(181, 194, 6), // N
+      new Color(95, 165, 5), // D
+      new Color(8, 147, 254), // C
+      new Color(191, 133, 39), // Q
+      new Color(219, 181, 1), // E
+      new Color(0, 211, 130), // G
+      new Color(255, 87, 1), // H
+      new Color(154, 186, 243), // I
+      new Color(205, 165, 220), // L
+      new Color(254, 165, 39), // K
+      new Color(245, 161, 184), // M
+      new Color(247, 79, 168), // F
+      new Color(16, 214, 49), // P
+      new Color(126, 157, 89), // S
+      new Color(0, 162, 156), // T
+      new Color(254, 8, 251), // W
+      new Color(255, 78, 122), // Y
+      new Color(135, 192, 228), // V
+      Color.white, // B
+      Color.white, // Z
+      Color.white, // X
+      Color.white, // -
+      Color.white, // *
+      Color.white // .
+  };
+
+  public static final Color[] sunset = { new Color(254, 160, 253), // A
+      new Color(133, 116, 106), // R
+      new Color(171, 200, 245), // N
+      new Color(46, 123, 190), // D
+      new Color(252, 12, 254), // C
+      new Color(140, 110, 129), // Q
+      new Color(103, 120, 146), // E
+      new Color(39, 153, 255), // G
+      new Color(219, 197, 142), // H
+      new Color(250, 33, 161), // I
+      new Color(224, 30, 130), // L
+      new Color(222, 190, 204), // K
+      new Color(209, 62, 123), // M
+      new Color(255, 56, 93), // F
+      new Color(87, 102, 249), // P
+      new Color(231, 180, 253), // S
+      new Color(166, 88, 183), // T
+      new Color(255, 55, 1), // W
+      new Color(203, 83, 57), // Y
+      new Color(254, 81, 184), // V
+      Color.white, // B
+      Color.white, // Z
+      Color.white, // X
+      Color.white, // -
+      Color.white, // *
+      Color.white // .
+  };
+
+  public static final Color[] ocean = { new Color(198, 202, 155), // A
+      new Color(12, 160, 168), // R
+      new Color(10, 223, 195), // N
+      new Color(76, 223, 161), // D
+      new Color(198, 129, 54), // C
+      new Color(139, 211, 209), // Q
+      new Color(96, 218, 201), // E
+      new Color(51, 165, 81), // G
+      new Color(0, 207, 254), // H
+      new Color(242, 186, 170), // I
+      new Color(187, 138, 131), // L
+      new Color(64, 160, 144), // K
+      new Color(164, 139, 136), // M
+      new Color(171, 136, 174), // F
+      new Color(175, 211, 101), // P
+      new Color(109, 155, 116), // S
+      new Color(141, 149, 102), // T
+      new Color(117, 138, 238), // W
+      new Color(186, 195, 252), // Y
+      new Color(233, 190, 164), // V
+      Color.white, // B
+      Color.white, // Z
+      Color.white, // X
+      Color.white, // -
+      Color.white, // *
+      Color.white // .
+  };
+
   // Dunno where I got these numbers from
   public static final double[] hyd2 = { 0.62, // A
       0.29, // R
@@ -502,7 +631,8 @@ public class ResidueProperties
 
   public static String STOP = "STOP";
 
-  public static List<String> STOP_CODONS = Arrays.asList("TGA", "TAA", "TAG");
+  public static List<String> STOP_CODONS = Arrays.asList("TGA", "TAA",
+          "TAG");
 
   public static String START = "ATG";
 
@@ -2272,6 +2402,58 @@ public class ResidueProperties
 
   }
 
+  static
+  {
+    Map<Character, Float> amino = new HashMap<>();
+    amino.put('A', 0.0826f);
+    amino.put('Q', 0.0393f);
+    amino.put('L', 0.0965f);
+    amino.put('S', 0.0661f);
+    amino.put('R', 0.0553f);
+    amino.put('E', 0.0674f);
+    amino.put('K', 0.0582f);
+    amino.put('T', 0.0535f);
+    amino.put('N', 0.0406f);
+    amino.put('G', 0.0708f);
+    amino.put('M', 0.0241f);
+    amino.put('W', 0.0109f);
+    amino.put('D', 0.0546f);
+    amino.put('H', 0.0227f);
+    amino.put('F', 0.0386f);
+    amino.put('Y', 0.0292f);
+    amino.put('C', 0.0137f);
+    amino.put('I', 0.0593f);
+    amino.put('P', 0.0472f);
+    amino.put('V', 0.0686f);
+    backgroundFrequencies.put(ALPHABET_AMINO, amino);
+    // todo: these don't match https://www.ebi.ac.uk/uniprot/TrEMBLstats - what
+    // are they?
+  }
+
+  // TODO get correct frequencies
+
+  static
+  {
+    Map<Character, Float> dna = new HashMap<>();
+    dna.put('A', 0.25f);
+    dna.put('C', 0.25f);
+    dna.put('T', 0.25f);
+    dna.put('G', 0.25f);
+    backgroundFrequencies.put(ALPHABET_DNA, dna);
+
+  }
+
+  static
+  {
+    Map<Character, Float> rna = new HashMap<>();
+    rna.put('A', 0.25f);
+    rna.put('C', 0.25f);
+    rna.put('T', 0.25f);
+    rna.put('G', 0.25f);
+    backgroundFrequencies.put(ALPHABET_RNA, rna);
+
+  }
+
   public static String getCanonicalAminoAcid(String aA)
   {
     String canonical = modifications.get(aA);