3cbd5f106f068e34da54804e0df825c19116caae
[jalview.git] / src / jalview / analysis / scoremodels / ScoreModels.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors
4  * 
5  * This file is part of Jalview.
6  * 
7  * Jalview is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License 
9  * as published by the Free Software Foundation, either version 3
10  * of the License, or (at your option) any later version.
11  *  
12  * Jalview is distributed in the hope that it will be useful, but 
13  * WITHOUT ANY WARRANTY; without even the implied warranty 
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
15  * PURPOSE.  See the GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
19  * The Jalview Authors are detailed in the 'AUTHORS' file.
20  */
21 package jalview.analysis.scoremodels;
22
23 import jalview.api.AlignmentViewPanel;
24 import jalview.api.analysis.ScoreModelI;
25 import jalview.io.DataSourceType;
26 import jalview.io.FileParse;
27 import jalview.io.ScoreMatrixFile;
28
29 import java.io.IOException;
30 import java.util.LinkedHashMap;
31 import java.util.Map;
32
33 /**
34  * A class that can register and serve instances of ScoreModelI
35  */
36 public class ScoreModels
37 {
38   private final ScoreMatrix BLOSUM62;
39
40   private final ScoreMatrix PAM250;
41
42   private final ScoreMatrix DNA;
43
44   private static ScoreModels instance = new ScoreModels();
45
46   private Map<String, ScoreModelI> models;
47
48   public static ScoreModels getInstance()
49   {
50     return instance;
51   }
52
53   /**
54    * Private constructor to enforce use of singleton. Registers Jalview's
55    * "built-in" score models:
56    * <ul>
57    * <li>BLOSUM62</li>
58    * <li>PAM250</li>
59    * <li>PID</li>
60    * <li>DNA</li>
61    * <li>Sequence Feature Similarity</li>
62    * </ul>
63    */
64   private ScoreModels()
65   {
66     /*
67      * using LinkedHashMap keeps models ordered as added
68      */
69     models = new LinkedHashMap<>();
70     BLOSUM62 = loadScoreMatrix("scoreModel/blosum62.scm");
71     PAM250 = loadScoreMatrix("scoreModel/pam250.scm");
72     DNA = loadScoreMatrix("scoreModel/dna.scm");
73     registerScoreModel(new PIDModel());
74     registerScoreModel(new FeatureDistanceModel());
75   }
76
77   /**
78    * Tries to load a score matrix from the given resource file, and if
79    * successful, registers it.
80    * 
81    * @param string
82    * @return
83    */
84   ScoreMatrix loadScoreMatrix(String resourcePath)
85   {
86     try
87     {
88       /*
89        * delegate parsing to ScoreMatrixFile
90        */
91       FileParse fp = new FileParse(resourcePath,
92               DataSourceType.CLASSLOADER);
93       ScoreMatrix sm = new ScoreMatrixFile(fp).parseMatrix();
94       registerScoreModel(sm);
95       return sm;
96     } catch (IOException e)
97     {
98       System.err.println(
99               "Error reading " + resourcePath + ": " + e.getMessage());
100     }
101     return null;
102   }
103
104   /**
105    * Answers an iterable set of the registered score models. Currently these are
106    * returned in the order in which they were registered.
107    * 
108    * @return
109    */
110   public Iterable<ScoreModelI> getModels()
111   {
112     return models.values();
113   }
114
115   /**
116    * Returns an instance of a score model for the given name. If the model is of
117    * 'view dependent' type (e.g. feature similarity), instantiates a new
118    * instance configured for the given view. Otherwise returns a cached instance
119    * of the score model.
120    * 
121    * @param name
122    * @param avp
123    * @return
124    */
125   public ScoreModelI getScoreModel(String name, AlignmentViewPanel avp)
126   {
127     ScoreModelI model = models.get(name);
128     return model == null ? null : model.getInstance(avp);
129   }
130
131   public void registerScoreModel(ScoreModelI sm)
132   {
133     ScoreModelI sm2 = models.get(sm.getName());
134     if (sm2 != null)
135     {
136       System.err.println("Warning: replacing score model " + sm2.getName());
137     }
138     models.put(sm.getName(), sm);
139   }
140
141   /**
142    * Returns the default peptide or nucleotide score model, currently BLOSUM62
143    * or DNA
144    * 
145    * @param forPeptide
146    * @return
147    */
148   public ScoreMatrix getDefaultModel(boolean forPeptide)
149   {
150     return forPeptide ? BLOSUM62 : DNA;
151   }
152
153   public ScoreMatrix getBlosum62()
154   {
155     return BLOSUM62;
156   }
157
158   public ScoreMatrix getPam250()
159   {
160     return PAM250;
161   }
162 }