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 { /* * constants for built-in score model names * NB! these have to match names in loaded score matrix files */ public static final String BLOSUM62 = "BLOSUM62"; public static final String PAM250 = "PAM250"; public static final String DNA = "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(); loadScoreMatrix("scoreModel/blosum62.scm"); loadScoreMatrix("scoreModel/pam250.scm"); loadScoreMatrix("scoreModel/seqspace.scm"); loadScoreMatrix("scoreModel/dna.scm"); registerScoreModel(new FeatureScoreModel()); registerScoreModel(new PIDScoreModel()); } /** * Try to load a score matrix from the given resource file, and if successful, * register it. Answers true if successful, else false. * * @param string */ boolean loadScoreMatrix(String resourcePath) { try { /* * delegate parsing to ScoreMatrixFile */ FileParse fp = new FileParse(resourcePath, DataSourceType.CLASSLOADER); ScoreMatrix sm = new ScoreMatrixFile(fp).parseMatrix(); registerScoreModel(sm); return true; } catch (IOException e) { System.err.println("Error reading " + resourcePath + ": " + e.getMessage()); } return false; } /** * 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 PairwiseSeqScoreModel getDefaultModel(boolean forPeptide) { return (PairwiseSeqScoreModel) (forPeptide ? forName("BLOSUM62") : forName("DNA")); } }