1 package jalview.analysis.scoremodels;
3 import jalview.api.analysis.ScoreModelI;
4 import jalview.api.analysis.ViewBasedAnalysisI;
5 import jalview.datamodel.AlignmentView;
6 import jalview.datamodel.SequenceFeature;
7 import jalview.datamodel.SequenceI;
8 import jalview.util.Comparison;
10 import java.util.ArrayList;
11 import java.util.Arrays;
12 import java.util.Hashtable;
13 import java.util.List;
15 public class FeatureScoreModel implements ScoreModelI, ViewBasedAnalysisI
17 jalview.api.FeatureRenderer fr;
20 public boolean configureFromAlignmentView(
21 jalview.api.AlignmentViewPanel view)
23 fr = view.cloneFeatureRenderer();
28 public float[][] findDistances(AlignmentView seqData)
31 List<String> dft = Arrays.asList(fr.getDisplayedFeatureTypes());
38 SequenceI[] sequenceString = seqData.getVisibleAlignment(
39 Comparison.GapChars.charAt(0)).getSequencesArray();
40 int noseqs = sequenceString.length;
41 int cpwidth = seqData.getWidth();
42 float[][] distance = new float[noseqs][noseqs];
45 for (float[] d : distance)
47 for (int i = 0; i < d.length; d[i++] = 0f)
55 for (int cpos = 0; cpos < cpwidth; cpos++)
57 // get visible features at cpos under view's display settings and compare
59 List<Hashtable<String, SequenceFeature>> sfap = new ArrayList<Hashtable<String, SequenceFeature>>();
60 for (int i = 0; i < noseqs; i++)
62 Hashtable<String, SequenceFeature> types = new Hashtable<String, SequenceFeature>();
63 List<SequenceFeature> sfs = fr.findFeaturesAtRes(sequenceString[i],
64 sequenceString[i].findPosition(cpos));
65 for (SequenceFeature sf : sfs)
67 types.put(sf.getType(), sf);
71 for (int i = 0; i < (noseqs - 1); i++)
77 for (int j = i + 1; j < noseqs; j++)
80 // compare the two lists of features...
81 Hashtable<String, SequenceFeature> fi = sfap.get(i), fk, fj = sfap
83 if (fi.size() > fj.size())
92 for (String k : fi.keySet())
94 SequenceFeature sfj = fk.get(k);
100 distance[i][j] += (fi.size() + fk.size() - 2f * sfcommon);
101 distance[j][i] += distance[i][j];
105 for (int i = 0; i < noseqs; i++)
107 for (int j = i + 1; j < noseqs; j++)
109 distance[i][j] /= cpwidth;
110 distance[j][i] = distance[i][j];
117 public String getName()
119 return "Sequence Feature Similarity";
123 public boolean isDNA()
129 public boolean isProtein()
134 public String toString()
136 return "Score between sequences based on hamming distance between binary vectors marking features displayed at each column";