193d5f48e7d34ea0b02b60da9f9c3f84e8e802c0
[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>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, ScoreModelI>();
50     BLOSUM62 = loadScoreMatrix("scoreModel/blosum62.scm");
51     PAM250 = loadScoreMatrix("scoreModel/pam250.scm");
52     registerScoreModel(new PIDModel());
53     DNA = loadScoreMatrix("scoreModel/dna.scm");
54     registerScoreModel(new FeatureDistanceModel());
55     // registerScoreModel(new PIDDistanceModel()); // superseded by PIDModel
56   }
57
58   /**
59    * Tries to load a score matrix from the given resource file, and if
60    * successful, registers it.
61    * 
62    * @param string
63    * @return
64    */
65   ScoreMatrix loadScoreMatrix(String resourcePath)
66   {
67     try
68     {
69       /*
70        * delegate parsing to ScoreMatrixFile
71        */
72       FileParse fp = new FileParse(resourcePath, DataSourceType.CLASSLOADER);
73       ScoreMatrix sm = new ScoreMatrixFile(fp).parseMatrix();
74       registerScoreModel(sm);
75       return sm;
76     } catch (IOException e)
77     {
78       System.err.println("Error reading " + resourcePath + ": "
79               + e.getMessage());
80     }
81     return null;
82   }
83
84   /**
85    * Answers an iterable set of the registered score models. Currently these are
86    * returned in the order in which they were registered.
87    * 
88    * @return
89    */
90   public Iterable<ScoreModelI> getModels()
91   {
92     return models.values();
93   }
94
95   public ScoreModelI forName(String s)
96   {
97     return models.get(s);
98   }
99
100   public void registerScoreModel(ScoreModelI sm)
101   {
102     ScoreModelI sm2 = models.get(sm.getName());
103     if (sm2 != null)
104     {
105       System.err.println("Warning: replacing score model " + sm2.getName());
106     }
107     models.put(sm.getName(), sm);
108   }
109
110   /**
111    * Returns the default peptide or nucleotide score model, currently BLOSUM62
112    * or DNA
113    * 
114    * @param forPeptide
115    * @return
116    */
117   public ScoreMatrix getDefaultModel(boolean forPeptide)
118   {
119     return forPeptide ? BLOSUM62 : DNA;
120   }
121
122   public ScoreMatrix getBlosum62()
123   {
124     return BLOSUM62;
125   }
126
127   public ScoreMatrix getPam250()
128   {
129     return PAM250;
130   }
131 }