X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fanalysis%2Fscoremodels%2FFeatureScoreModel.java;h=e2a8b9a57d3b2091ca77c1a662691a241436ef53;hb=872491e84ca43e8ec17ef8c0395d1b7a45e6b5d4;hp=e9347e41d7f342449ad8d1810eb4e9b05f73b321;hpb=dfa04e77181fccfa6229ffef1591fc9c622d9b39;p=jalview.git diff --git a/src/jalview/analysis/scoremodels/FeatureScoreModel.java b/src/jalview/analysis/scoremodels/FeatureScoreModel.java index e9347e4..e2a8b9a 100644 --- a/src/jalview/analysis/scoremodels/FeatureScoreModel.java +++ b/src/jalview/analysis/scoremodels/FeatureScoreModel.java @@ -1,22 +1,24 @@ package jalview.analysis.scoremodels; -import java.awt.Color; - -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; -public class FeatureScoreModel implements ScoreModelI,ViewBasedAnalysisI +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Hashtable; +import java.util.List; + +public class FeatureScoreModel implements ScoreModelI, ViewBasedAnalysisI { jalview.api.FeatureRenderer fr; - - @Override - public boolean configureFromAlignmentView(jalview.api.AlignmentViewPanel view) + + @Override + public boolean configureFromAlignmentView( + jalview.api.AlignmentViewPanel view) { fr = view.cloneFeatureRenderer(); return true; @@ -25,60 +27,112 @@ public class FeatureScoreModel implements ScoreModelI,ViewBasedAnalysisI @Override public float[][] findDistances(AlignmentView seqData) { - - SequenceI[] sequenceString = seqData - .getVisibleAlignment(Comparison.GapChars.charAt(0)).getSequencesArray(); + int nofeats = 0; + List dft = Arrays.asList(fr.getDisplayedFeatureTypes()); + + if (dft != null) + { + nofeats = dft.size(); + } + + SequenceI[] sequenceString = seqData.getVisibleAlignment( + Comparison.GapChars.charAt(0)).getSequencesArray(); int noseqs = sequenceString.length; int cpwidth = seqData.getWidth(); float[][] distance = new float[noseqs][noseqs]; - float max=0; - for (int cpos = 0;cpos> sfap = new ArrayList>(); + for (int i = 0; i < noseqs; i++) + { + Hashtable types = new Hashtable(); + List sfs = fr.findFeaturesAtRes(sequenceString[i], + sequenceString[i].findPosition(cpos)); + for (SequenceFeature sf : sfs) + { + types.put(sf.getType(), sf); + } + sfap.add(types); + } for (int i = 0; i < (noseqs - 1); i++) { - SequenceFeature[] sf = fr.getVisible(sequenceString[i],cpos); - for (int j=i+1;j 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 public boolean isDNA() { return true; } + @Override public boolean isProtein() { return true; } - public String toString() { - return "Score between two sequences aligned with Smith Waterman with default Peptide/Nucleotide matrix"; + + public String toString() + { + return "Score between sequences based on hamming distance between binary vectors marking features displayed at each column"; } }