--- /dev/null
+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
+{
+ jalview.api.FeatureRenderer fr;
+
+ @Override
+ public boolean configureFromAlignmentView(jalview.api.AlignmentViewPanel view)
+ {
+ fr = view.cloneFeatureRenderer();
+ return true;
+ }
+
+ @Override
+ public float[][] findDistances(AlignmentView seqData)
+ {
+
+ 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<cpwidth;cpos++)
+ {
+ // get visible features at cpos under view's display settings and compare them
+ for (int i = 0; i < (noseqs - 1); i++)
+ {
+ SequenceFeature[] sf = fr.getVisible(sequenceString[i],cpos);
+ for (int j=i+1;j<noseqs;j++)
+ {
+ SequenceFeature[] jsf = fr.getVisible(sequenceString[i],cpos);
+
+
+ if (max < distance[i][j])
+ {
+ max = distance[i][j];
+ }
+ }
+ }
+ }
+
+ for (int i = 0; i < (noseqs - 1); i++)
+ {
+ for (int j = i; j < noseqs; j++)
+ {
+ distance[i][j] = max - distance[i][j];
+ distance[j][i] = distance[i][j];
+ }
+ }
+
+ return distance;
+ }
+
+ @Override
+ public String getName()
+ {
+ return "Smith Waterman Score";
+ }
+ @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";
+ }
+}