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; }