JAL-2416 order score models by order of addition rather than name
[jalview.git] / src / jalview / analysis / scoremodels / ScoreModels.java
1 package jalview.analysis.scoremodels;
2
3 import jalview.api.analysis.ScoreModelI;
4 import jalview.io.DataSourceType;
5 import jalview.io.FileParse;
6 import jalview.io.ScoreMatrixFile;
7
8 import java.io.IOException;
9 import java.util.LinkedHashMap;
10 import java.util.Map;
11
12 /**
13  * A class that can register and serve instances of ScoreModelI
14  */
15 public class ScoreModels
16 {
17   private static ScoreModels instance = new ScoreModels();
18
19   private Map<String, ScoreModelI> models;
20
21   public static ScoreModels getInstance()
22   {
23     return instance;
24   }
25
26   /**
27    * Private constructor to enforce use of singleton. Registers Jalview's
28    * "built-in" score models:
29    * <ul>
30    * <li>BLOSUM62</li>
31    * <li>PAM250</li>
32    * <li>SeqSpace (identity matrix)</li>
33    * <li>DNA</li>
34    * <li>Sequence Feature Similarity</li>
35    * <li>Percentage Identity</li>
36    * </ul>
37    */
38   private ScoreModels()
39   {
40     /*
41      * using LinkedHashMap keeps models ordered as added
42      */
43     models = new LinkedHashMap<String, ScoreModelI>();
44     loadScoreMatrix("scoreModel/blosum62.scm");
45     loadScoreMatrix("scoreModel/pam250.scm");
46     loadScoreMatrix("scoreModel/seqspace.scm");
47     loadScoreMatrix("scoreModel/dna.scm");
48     registerScoreModel(new FeatureScoreModel());
49     registerScoreModel(new PIDScoreModel());
50   }
51
52   /**
53    * Try to load a score matrix from the given resource file, and if successful,
54    * register it. Answers true if successful, else false.
55    * 
56    * @param string
57    */
58   boolean loadScoreMatrix(String resourcePath)
59   {
60     try
61     {
62       /*
63        * delegate parsing to ScoreMatrixFile
64        */
65       FileParse fp = new FileParse(resourcePath, DataSourceType.CLASSLOADER);
66       ScoreMatrix sm = new ScoreMatrixFile(fp).parseMatrix();
67       registerScoreModel(sm);
68       return true;
69     } catch (IOException e)
70     {
71       System.err.println("Error reading " + resourcePath + ": "
72               + e.getMessage());
73     }
74     return false;
75   }
76
77   /**
78    * Answers an iterable set of the registered score models. Currently these are
79    * returned in the order in which they were registered.
80    * 
81    * @return
82    */
83   public Iterable<ScoreModelI> getModels()
84   {
85     return models.values();
86   }
87
88   public ScoreModelI forName(String s)
89   {
90     return models.get(s);
91   }
92
93   public void registerScoreModel(ScoreModelI sm)
94   {
95     ScoreModelI sm2 = models.get(sm.getName());
96     if (sm2 != null)
97     {
98       System.err.println("Warning: replacing score model " + sm2.getName());
99     }
100     models.put(sm.getName(), sm);
101   }
102 }