X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fanalysis%2Fscoremodels%2FFeatureDistanceModel.java;fp=src%2Fjalview%2Fanalysis%2Fscoremodels%2FFeatureDistanceModel.java;h=b44b4cfff7042606a5531e342d9948a2b184b757;hb=693e17575680c94d9bdc5797faa0b328bb6f7c05;hp=636c19b3b545760a4d6018dddd7f43da7ee51e25;hpb=f56a081f0c0174cf6a5b8799a5531ddbdb71f20f;p=jalview.git
diff --git a/src/jalview/analysis/scoremodels/FeatureDistanceModel.java b/src/jalview/analysis/scoremodels/FeatureDistanceModel.java
index 636c19b..b44b4cf 100644
--- a/src/jalview/analysis/scoremodels/FeatureDistanceModel.java
+++ b/src/jalview/analysis/scoremodels/FeatureDistanceModel.java
@@ -57,17 +57,28 @@ public class FeatureDistanceModel implements DistanceScoreModelI,
* features each sequence pair has at each column, ignore feature types they
* have in common, and count the rest. The totals are normalised by the number
* of columns processed.
+ *
+ * The parameters argument provides settings for treatment of gap-residue
+ * aligned positions, and whether the score is over the longer or shorter of
+ * each pair of sequences
+ *
+ * @param seqData
+ * @param params
*/
@Override
public MatrixI findDistances(AlignmentView seqData,
- SimilarityParamsI options)
+ SimilarityParamsI params)
{
- List dft = fr.getDisplayedFeatureTypes();
SeqCigar[] seqs = seqData.getSequences();
int noseqs = seqs.length;
int cpwidth = 0;// = seqData.getWidth();
double[][] distances = new double[noseqs][noseqs];
- if (dft.isEmpty())
+ List dft = null;
+ if (fr != null)
+ {
+ dft = fr.getDisplayedFeatureTypes();
+ }
+ if (dft == null || dft.isEmpty())
{
return new Matrix(distances);
}
@@ -86,7 +97,7 @@ public class FeatureDistanceModel implements DistanceScoreModelI,
cpwidth++;
/*
- * first pass: record features types in column for each sequence
+ * first record feature types in this column for each sequence
*/
Map> sfap = findFeatureTypesAtColumn(
seqs, cpos);
@@ -99,9 +110,23 @@ public class FeatureDistanceModel implements DistanceScoreModelI,
{
for (int j = i + 1; j < noseqs; j++)
{
- int seqDistance = SetUtils.countDisjunction(sfap.get(seqs[i]),
- sfap.get(seqs[j]));
- distances[i][j] += seqDistance;
+ SeqCigar sc1 = seqs[i];
+ SeqCigar sc2 = seqs[j];
+ Set set1 = sfap.get(sc1);
+ Set set2 = sfap.get(sc2);
+ boolean gap1 = set1 == null;
+ boolean gap2 = set2 == null;
+
+ /*
+ * gap-gap always scores zero
+ * residue-residue is always scored
+ * include gap-residue score if params say to do so
+ */
+ if ((!gap1 && !gap2) || params.includeGaps())
+ {
+ int seqDistance = SetUtils.countDisjunction(set1, set2);
+ distances[i][j] += seqDistance;
+ }
}
}
}
@@ -125,8 +150,9 @@ public class FeatureDistanceModel implements DistanceScoreModelI,
}
/**
- * Builds and returns a list (one per SeqCigar) of visible feature types at
- * the given column position
+ * Builds and returns a map containing a (possibly empty) list (one per
+ * SeqCigar) of visible feature types at the given column position. The map
+ * has no entry for sequences which are gapped at the column position.
*
* @param seqs
* @param columnPosition
@@ -138,18 +164,18 @@ public class FeatureDistanceModel implements DistanceScoreModelI,
Map> sfap = new HashMap>();
for (SeqCigar seq : seqs)
{
- Set types = new HashSet();
int spos = seq.findPosition(columnPosition);
if (spos != -1)
{
+ Set types = new HashSet();
List sfs = fr.findFeaturesAtRes(seq.getRefSeq(),
spos);
for (SequenceFeature sf : sfs)
{
types.add(sf.getType());
}
+ sfap.put(seq, types);
}
- sfap.put(seq, types);
}
return sfap;
}