1 package jalview.analysis.scoremodels;
3 import jalview.api.AlignmentViewPanel;
4 import jalview.api.FeatureRenderer;
5 import jalview.api.analysis.ScoreModelI;
6 import jalview.api.analysis.ViewBasedAnalysisI;
7 import jalview.datamodel.AlignmentView;
8 import jalview.datamodel.SequenceFeature;
9 import jalview.datamodel.SequenceI;
10 import jalview.util.Comparison;
12 import java.util.ArrayList;
13 import java.util.Arrays;
14 import java.util.Hashtable;
15 import java.util.List;
17 public class FeatureScoreModel implements ScoreModelI, ViewBasedAnalysisI
22 public boolean configureFromAlignmentView(AlignmentViewPanel view)
24 fr = view.cloneFeatureRenderer();
29 public float[][] findDistances(AlignmentView seqData)
32 List<String> dft = Arrays.asList(fr.getDisplayedFeatureTypes());
39 SequenceI[] sequenceString = seqData.getVisibleAlignment(
40 Comparison.GapChars.charAt(0)).getSequencesArray();
41 int noseqs = sequenceString.length;
42 int cpwidth = seqData.getWidth();
43 float[][] distance = new float[noseqs][noseqs];
46 for (float[] d : distance)
48 for (int i = 0; i < d.length; d[i++] = 0f)
56 for (int cpos = 0; cpos < cpwidth; cpos++)
58 // get visible features at cpos under view's display settings and compare
60 List<Hashtable<String, SequenceFeature>> sfap = new ArrayList<Hashtable<String, SequenceFeature>>();
61 for (int i = 0; i < noseqs; i++)
63 Hashtable<String, SequenceFeature> types = new Hashtable<String, SequenceFeature>();
64 List<SequenceFeature> sfs = fr.findFeaturesAtRes(sequenceString[i],
65 sequenceString[i].findPosition(cpos));
66 for (SequenceFeature sf : sfs)
68 types.put(sf.getType(), sf);
72 for (int i = 0; i < (noseqs - 1); i++)
78 for (int j = i + 1; j < noseqs; j++)
81 // compare the two lists of features...
82 Hashtable<String, SequenceFeature> fi = sfap.get(i), fk, fj = sfap
84 if (fi.size() > fj.size())
93 for (String k : fi.keySet())
95 SequenceFeature sfj = fk.get(k);
101 distance[i][j] += (fi.size() + fk.size() - 2f * sfcommon);
102 distance[j][i] += distance[i][j];
106 for (int i = 0; i < noseqs; i++)
108 for (int j = i + 1; j < noseqs; j++)
110 distance[i][j] /= cpwidth;
111 distance[j][i] = distance[i][j];
118 public String getName()
120 return "Sequence Feature Similarity";
124 public boolean isDNA()
130 public boolean isProtein()
135 public String toString()
137 return "Score between sequences based on hamming distance between binary vectors marking features displayed at each column";