X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fanalysis%2Fscoremodels%2FFeatureScoreModel.java;h=7c819128139b6590448faba534689dd13031c0b5;hb=8c7a9e1133d84d0d80db855f85b052a737c245f3;hp=b946bba43ff996d4e8d4cc1f9081e46ea7036c18;hpb=d14dc9ab689ddef65d7440facdc7b0dd512438ad;p=jalview.git diff --git a/src/jalview/analysis/scoremodels/FeatureScoreModel.java b/src/jalview/analysis/scoremodels/FeatureScoreModel.java index b946bba..7c81912 100644 --- a/src/jalview/analysis/scoremodels/FeatureScoreModel.java +++ b/src/jalview/analysis/scoremodels/FeatureScoreModel.java @@ -1,16 +1,34 @@ +/* + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ The Jalview Authors + * + * This file is part of Jalview. + * + * Jalview is free software: you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. + * + * Jalview is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Jalview. If not, see . + * The Jalview Authors are detailed in the 'AUTHORS' file. + */ package jalview.analysis.scoremodels; -import java.awt.Color; -import java.util.List; - -import jalview.analysis.AlignSeq; import jalview.api.analysis.ScoreModelI; import jalview.api.analysis.ViewBasedAnalysisI; import jalview.datamodel.AlignmentView; import jalview.datamodel.SeqCigar; import jalview.datamodel.SequenceFeature; -import jalview.datamodel.SequenceI; -import jalview.util.Comparison; + +import java.util.ArrayList; +import java.util.Hashtable; +import java.util.List; public class FeatureScoreModel implements ScoreModelI, ViewBasedAnalysisI { @@ -27,51 +45,100 @@ public class FeatureScoreModel implements ScoreModelI, ViewBasedAnalysisI @Override public float[][] findDistances(AlignmentView seqData) { - - SequenceI[] sequenceString = seqData.getVisibleAlignment( - Comparison.GapChars.charAt(0)).getSequencesArray(); - int noseqs = sequenceString.length; - int cpwidth = seqData.getWidth(); + int nofeats = 0; + List dft = fr.getDisplayedFeatureTypes(); + nofeats = dft.size(); + SeqCigar[] seqs = seqData.getSequences(); + int noseqs = seqs.length; + int cpwidth = 0;// = seqData.getWidth(); float[][] distance = new float[noseqs][noseqs]; - float max = 0; - for (int cpos = 0; cpos < cpwidth; cpos++) + if (nofeats == 0) { - // get visible features at cpos under view's display settings and compare - // them - for (int i = 0; i < (noseqs - 1); i++) + for (float[] d : distance) { - List sf = fr.findFeaturesAtRes(sequenceString[i], - cpos); - for (int j = i + 1; j < noseqs; j++) + for (int i = 0; i < d.length; d[i++] = 0f) { - List jsf = fr.findFeaturesAtRes( - sequenceString[i], cpos); - // compare the two lists of features... + ; + } + } + return distance; + } + // need to get real position for view position + int[] viscont = seqData.getVisibleContigs(); + for (int vc = 0; vc < viscont.length; vc += 2) + { - if (max < distance[i][j]) + for (int cpos = viscont[vc]; cpos <= viscont[vc + 1]; cpos++) + { + cpwidth++; + // get visible features at cpos under view's display settings and + // compare them + List> sfap = new ArrayList>(); + for (int i = 0; i < noseqs; i++) + { + Hashtable types = new Hashtable(); + int spos = seqs[i].findPosition(cpos); + if (spos != -1) + { + List sfs = fr.findFeaturesAtRes( + seqs[i].getRefSeq(), spos); + for (SequenceFeature sf : sfs) + { + types.put(sf.getType(), sf); + } + } + sfap.add(types); + } + for (int i = 0; i < (noseqs - 1); i++) + { + if (cpos == 0) { - max = distance[i][j]; + distance[i][i] = 0f; + } + for (int j = i + 1; j < noseqs; j++) + { + int sfcommon = 0; + // compare the two lists of features... + Hashtable fi = sfap.get(i), fk, fj = sfap + .get(j); + if (fi.size() > fj.size()) + { + fk = fj; + } + else + { + fk = fi; + fi = fj; + } + for (String k : fi.keySet()) + { + SequenceFeature sfj = fk.get(k); + if (sfj != null) + { + sfcommon++; + } + } + distance[i][j] += (fi.size() + fk.size() - 2f * sfcommon); + distance[j][i] += distance[i][j]; } } } } - - for (int i = 0; i < (noseqs - 1); i++) + for (int i = 0; i < noseqs; i++) { - for (int j = i; j < noseqs; j++) + for (int j = i + 1; j < noseqs; j++) { - distance[i][j] = max - distance[i][j]; + distance[i][j] /= cpwidth; distance[j][i] = distance[i][j]; } } - return distance; } @Override public String getName() { - return "Smith Waterman Score"; + return "Sequence Feature Similarity"; } @Override @@ -86,8 +153,9 @@ public class FeatureScoreModel implements ScoreModelI, ViewBasedAnalysisI return true; } + @Override public String toString() { - return "Score between two sequences aligned with Smith Waterman with default Peptide/Nucleotide matrix"; + return "Score between sequences based on hamming distance between binary vectors marking features displayed at each column"; } }