Merge branch 'develop' into features/JAL-2393customMatrices
[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 final ScoreMatrix BLOSUM62;
18
19   private final ScoreMatrix PAM250;
20
21   private final ScoreMatrix DNA;
22
23   private static ScoreModels instance = new ScoreModels();
24
25   private Map<String, ScoreModelI> models;
26
27   public static ScoreModels getInstance()
28   {
29     return instance;
30   }
31
32   /**
33    * Private constructor to enforce use of singleton. Registers Jalview's
34    * "built-in" score models:
35    * <ul>
36    * <li>BLOSUM62</li>
37    * <li>PAM250</li>
38    * <li>PID</li>
39    * <li>DNA</li>
40    * <li>Sequence Feature Similarity</li>
41    * </ul>
42    */
43   private ScoreModels()
44   {
45     /*
46      * using LinkedHashMap keeps models ordered as added
47      */
48     models = new LinkedHashMap<String, ScoreModelI>();
49     BLOSUM62 = loadScoreMatrix("scoreModel/blosum62.scm");
50     PAM250 = loadScoreMatrix("scoreModel/pam250.scm");
51     registerScoreModel(new PIDModel());
52     DNA = loadScoreMatrix("scoreModel/dna.scm");
53     registerScoreModel(new FeatureDistanceModel());
54   }
55
56   /**
57    * Tries to load a score matrix from the given resource file, and if
58    * successful, registers it.
59    * 
60    * @param string
61    * @return
62    */
63   ScoreMatrix loadScoreMatrix(String resourcePath)
64   {
65     try
66     {
67       /*
68        * delegate parsing to ScoreMatrixFile
69        */
70       FileParse fp = new FileParse(resourcePath, DataSourceType.CLASSLOADER);
71       ScoreMatrix sm = new ScoreMatrixFile(fp).parseMatrix();
72       registerScoreModel(sm);
73       return sm;
74     } catch (IOException e)
75     {
76       System.err.println("Error reading " + resourcePath + ": "
77               + e.getMessage());
78     }
79     return null;
80   }
81
82   /**
83    * Answers an iterable set of the registered score models. Currently these are
84    * returned in the order in which they were registered.
85    * 
86    * @return
87    */
88   public Iterable<ScoreModelI> getModels()
89   {
90     return models.values();
91   }
92
93   public ScoreModelI forName(String s)
94   {
95     return models.get(s);
96   }
97
98   public void registerScoreModel(ScoreModelI sm)
99   {
100     ScoreModelI sm2 = models.get(sm.getName());
101     if (sm2 != null)
102     {
103       System.err.println("Warning: replacing score model " + sm2.getName());
104     }
105     models.put(sm.getName(), sm);
106   }
107
108   /**
109    * Returns the default peptide or nucleotide score model, currently BLOSUM62
110    * or DNA
111    * 
112    * @param forPeptide
113    * @return
114    */
115   public ScoreMatrix getDefaultModel(boolean forPeptide)
116   {
117     return forPeptide ? BLOSUM62 : DNA;
118   }
119
120   public ScoreMatrix getBlosum62()
121   {
122     return BLOSUM62;
123   }
124
125   public ScoreMatrix getPam250()
126   {
127     return PAM250;
128   }
129 }