JAL-2403 ScoreModelI now DistanceModelI, ScoreMatrix delegate of
[jalview.git] / src / jalview / analysis / scoremodels / ScoreModels.java
1 package jalview.analysis.scoremodels;
2
3 import jalview.api.analysis.DistanceModelI;
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, DistanceModelI> 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>SeqSpace (identity matrix)</li>
39    * <li>DNA</li>
40    * <li>Sequence Feature Similarity</li>
41    * <li>Percentage Identity</li>
42    * </ul>
43    */
44   private ScoreModels()
45   {
46     /*
47      * using LinkedHashMap keeps models ordered as added
48      */
49     models = new LinkedHashMap<String, DistanceModelI>();
50     BLOSUM62 = loadScoreMatrix("scoreModel/blosum62.scm");
51     PAM250 = loadScoreMatrix("scoreModel/pam250.scm");
52     loadScoreMatrix("scoreModel/seqspace.scm");
53     // drop seqspace.scm for IdentityScoreModel once JAL-2379 merged in?
54     // registerScoreModel(new IdentityScoreModel());
55     DNA = loadScoreMatrix("scoreModel/dna.scm");
56     registerScoreModel(new FeatureDistanceModel());
57     registerScoreModel(new PIDDistanceModel());
58   }
59
60   /**
61    * Tries to load a score matrix from the given resource file, and if
62    * successful, registers it.
63    * 
64    * @param string
65    * @return
66    */
67   ScoreMatrix loadScoreMatrix(String resourcePath)
68   {
69     try
70     {
71       /*
72        * delegate parsing to ScoreMatrixFile
73        */
74       FileParse fp = new FileParse(resourcePath, DataSourceType.CLASSLOADER);
75       ScoreMatrix sm = new ScoreMatrixFile(fp).parseMatrix();
76       registerScoreModel(sm);
77       return sm;
78     } catch (IOException e)
79     {
80       System.err.println("Error reading " + resourcePath + ": "
81               + e.getMessage());
82     }
83     return null;
84   }
85
86   /**
87    * Registers a pairwise score model
88    * 
89    * @param sm
90    */
91   public void registerScoreModel(PairwiseScoreModelI sm)
92   {
93     registerScoreModel(new PairwiseDistanceModel(sm));
94   }
95
96   /**
97    * Answers an iterable set of the registered score models. Currently these are
98    * returned in the order in which they were registered.
99    * 
100    * @return
101    */
102   public Iterable<DistanceModelI> getModels()
103   {
104     return models.values();
105   }
106
107   public DistanceModelI forName(String s)
108   {
109     return models.get(s);
110   }
111
112   public void registerScoreModel(DistanceModelI sm)
113   {
114     DistanceModelI sm2 = models.get(sm.getName());
115     if (sm2 != null)
116     {
117       System.err.println("Warning: replacing score model " + sm2.getName());
118     }
119     models.put(sm.getName(), sm);
120   }
121
122   /**
123    * Returns the default peptide or nucleotide score model, currently BLOSUM62
124    * or DNA
125    * 
126    * @param forPeptide
127    * @return
128    */
129   public ScoreMatrix getDefaultModel(boolean forPeptide)
130   {
131     return forPeptide ? BLOSUM62 : DNA;
132   }
133
134   public ScoreMatrix getBlosum62()
135   {
136     return BLOSUM62;
137   }
138
139   public ScoreMatrix getPam250()
140   {
141     return PAM250;
142   }
143 }