JAL-4386_Added changes in similarity score calculation for different cases of sequenc...
[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;
45
46   private Map<String, ScoreModelI> models;
47
48   /**
49    * Answers the singleton instance of this class, with lazy initialisation
50    * (built-in score models are loaded on the first call to this method)
51    * 
52    * @return
53    */
54   public static ScoreModels getInstance()
55   {
56     if (instance == null)
57     {
58       instance = new ScoreModels();
59     }
60     return instance;
61   }
62
63   /**
64    * Private constructor to enforce use of singleton. Registers Jalview's
65    * "built-in" score models:
66    * <ul>
67    * <li>BLOSUM62</li>
68    * <li>PAM250</li>
69    * <li>PID</li>
70    * <li>DNA</li>
71    * <li>Sequence Feature Similarity</li>   * 
72    * <li>Secondary Structure Similarity</li>
73    * </ul>
74    */
75   private ScoreModels()
76   {
77     /*
78      * using LinkedHashMap keeps models ordered as added
79      */
80     models = new LinkedHashMap<>();
81     BLOSUM62 = loadScoreMatrix("scoreModel/blosum62.scm");
82     PAM250 = loadScoreMatrix("scoreModel/pam250.scm");
83     DNA = loadScoreMatrix("scoreModel/dna.scm");
84     registerScoreModel(new PIDModel());
85     registerScoreModel(new FeatureDistanceModel());
86     registerScoreModel(new SecondaryStructureDistanceModel());
87   }
88
89   /**
90    * Tries to load a score matrix from the given resource file, and if
91    * successful, registers it.
92    * 
93    * @param string
94    * @return
95    */
96   ScoreMatrix loadScoreMatrix(String resourcePath)
97   {
98     try
99     {
100       /*
101        * delegate parsing to ScoreMatrixFile
102        */
103       FileParse fp = new FileParse(resourcePath,
104               DataSourceType.CLASSLOADER);
105       ScoreMatrix sm = new ScoreMatrixFile(fp).parseMatrix();
106       registerScoreModel(sm);
107       return sm;
108     } catch (IOException e)
109     {
110       jalview.bin.Console.errPrintln(
111               "Error reading " + resourcePath + ": " + e.getMessage());
112     }
113     return null;
114   }
115
116   /**
117    * Answers an iterable set of the registered score models. Currently these are
118    * returned in the order in which they were registered.
119    * 
120    * @return
121    */
122   public Iterable<ScoreModelI> getModels()
123   {
124     return models.values();
125   }
126
127   /**
128    * Returns an instance of a score model for the given name. If the model is of
129    * 'view dependent' type (e.g. feature similarity), instantiates a new
130    * instance configured for the given view. Otherwise returns a cached instance
131    * of the score model.
132    * 
133    * @param name
134    * @param avp
135    * @return
136    */
137   public ScoreModelI getScoreModel(String name, AlignmentViewPanel avp)
138   {
139     ScoreModelI model = models.get(name);
140     return model == null ? null : model.getInstance(avp);
141   }
142
143   public void registerScoreModel(ScoreModelI sm)
144   {
145     ScoreModelI sm2 = models.get(sm.getName());
146     if (sm2 != null)
147     {
148       jalview.bin.Console.errPrintln(
149               "Warning: replacing score model " + sm2.getName());
150     }
151     models.put(sm.getName(), sm);
152   }
153
154   /**
155    * Resets to just the built-in score models
156    */
157   public void reset()
158   {
159     instance = new ScoreModels();
160   }
161
162   /**
163    * Returns the default peptide or nucleotide score model, currently BLOSUM62
164    * or DNA
165    * 
166    * @param forPeptide
167    * @return
168    */
169   public ScoreMatrix getDefaultModel(boolean forPeptide)
170   {
171     return forPeptide ? BLOSUM62 : DNA;
172   }
173
174   public ScoreMatrix getBlosum62()
175   {
176     return BLOSUM62;
177   }
178
179   public ScoreMatrix getPam250()
180   {
181     return PAM250;
182   }
183 }