package jalview.analysis.scoremodels; import jalview.api.analysis.ScoreModelI; import jalview.io.DataSourceType; import jalview.io.FileParse; import jalview.io.ScoreMatrixFile; import java.io.IOException; import java.util.LinkedHashMap; import java.util.Map; /** * A class that can register and serve instances of ScoreModelI */ public class ScoreModels { private final ScoreMatrix BLOSUM62; private final ScoreMatrix PAM250; private final ScoreMatrix DNA; private static ScoreModels instance = new ScoreModels(); private Map models; public static ScoreModels getInstance() { return instance; } /** * Private constructor to enforce use of singleton. Registers Jalview's * "built-in" score models: * */ private ScoreModels() { /* * using LinkedHashMap keeps models ordered as added */ models = new LinkedHashMap(); BLOSUM62 = loadScoreMatrix("scoreModel/blosum62.scm"); PAM250 = loadScoreMatrix("scoreModel/pam250.scm"); registerScoreModel(new PIDModel()); DNA = loadScoreMatrix("scoreModel/dna.scm"); registerScoreModel(new FeatureDistanceModel()); } /** * Tries to load a score matrix from the given resource file, and if * successful, registers it. * * @param string * @return */ ScoreMatrix loadScoreMatrix(String resourcePath) { try { /* * delegate parsing to ScoreMatrixFile */ FileParse fp = new FileParse(resourcePath, DataSourceType.CLASSLOADER); ScoreMatrix sm = new ScoreMatrixFile(fp).parseMatrix(); registerScoreModel(sm); return sm; } catch (IOException e) { System.err.println("Error reading " + resourcePath + ": " + e.getMessage()); } return null; } /** * Answers an iterable set of the registered score models. Currently these are * returned in the order in which they were registered. * * @return */ public Iterable getModels() { return models.values(); } public ScoreModelI forName(String s) { return models.get(s); } public void registerScoreModel(ScoreModelI sm) { ScoreModelI sm2 = models.get(sm.getName()); if (sm2 != null) { System.err.println("Warning: replacing score model " + sm2.getName()); } models.put(sm.getName(), sm); } /** * Returns the default peptide or nucleotide score model, currently BLOSUM62 * or DNA * * @param forPeptide * @return */ public ScoreMatrix getDefaultModel(boolean forPeptide) { return forPeptide ? BLOSUM62 : DNA; } public ScoreMatrix getBlosum62() { return BLOSUM62; } public ScoreMatrix getPam250() { return PAM250; } }