/*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7)
- * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, G Barton, M Clamp, S Searle
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2)
+ * Copyright (C) 2014 The Jalview Authors
*
* This file is part of Jalview.
*
* Jalview is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
- *
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
+ *
* Jalview is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
- * You should have received a copy of the GNU General Public License along with Jalview. If not, see <http://www.gnu.org/licenses/>.
+ * You should have received a copy of the GNU General Public License
+ * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
*/
package jalview.analysis;
}
/**
- * DOCUMENT ME!
+ * Construct score matrix for sequences with standard DNA or PEPTIDE matrix
*
* @param s1
- * DOCUMENT ME!
+ * - sequence 1
* @param string1
- * - string to align for sequence1
+ * - string to use for s1
* @param s2
- * sequence 2
+ * - sequence 2
* @param string2
- * - string to align for sequence2
+ * - string to use for s2
* @param type
* DNA or PEPTIDE
*/
SeqInit(string1, string2);
}
+ /**
+ * Construct score matrix for sequences with custom substitution matrix
+ *
+ * @param s1
+ * - sequence 1
+ * @param string1
+ * - string to use for s1
+ * @param s2
+ * - sequence 2
+ * @param string2
+ * - string to use for s2
+ * @param scoreMatrix
+ * - substitution matrix to use for alignment
+ */
public void SeqInit(SequenceI s1, String string1, SequenceI s2,
String string2, ScoreMatrix scoreMatrix)
{
{
intToStr = pep;
charToInt = ResidueProperties.aaIndex;
- defInt = 23;
+ defInt = ResidueProperties.maxProteinIndex;
}
else if (type.equals(AlignSeq.DNA))
{
intToStr = dna;
charToInt = ResidueProperties.nucleotideIndex;
- defInt = 4;
+ defInt = ResidueProperties.maxNucleotideIndex;
}
else
{
output.append("Wrong type = dna or pep only");
- throw new Error("Unknown Type " + type2
- + " - dna or pep are the only allowed values.");
+ throw new Error(MessageManager.formatMessage("error.unknown_type_dna_or_pep", new String[]{type2}));
}
}
}
/**
+ * Compute a globally optimal needleman and wunsch alignment between two
+ * sequences
+ *
+ * @param s1
+ * @param s2
+ * @param type
+ * AlignSeq.DNA or AlignSeq.PEP
+ */
+ public static AlignSeq doGlobalNWAlignment(SequenceI s1, SequenceI s2,
+ String type)
+ {
+ AlignSeq as = new AlignSeq(s1, s2, type);
+
+ as.calcScoreMatrix();
+ as.traceAlignment();
+ return as;
+ }
+
+ /**
+ *
+ * @return mapping from positions in S1 to corresponding positions in S2
+ */
+ public jalview.datamodel.Mapping getMappingFromS1(boolean allowmismatch)
+ {
+ ArrayList<Integer> as1 = new ArrayList<Integer>(), as2 = new ArrayList<Integer>();
+ int pdbpos = s2.getStart() + getSeq2Start() - 2;
+ int alignpos = s1.getStart() + getSeq1Start() - 2;
+ int lp2 = pdbpos - 3, lp1 = alignpos - 3;
+ boolean lastmatch = false;
+ // and now trace the alignment onto the atom set.
+ for (int i = 0; i < astr1.length(); i++)
+ {
+ char c1 = astr1.charAt(i), c2 = astr2.charAt(i);
+ if (c1 != '-')
+ {
+ alignpos++;
+ }
+
+ if (c2 != '-')
+ {
+ pdbpos++;
+ }
+
+ if (allowmismatch || c1 == c2)
+ {
+ lastmatch = true;
+ // extend mapping interval.
+ if (lp1 + 1 != alignpos || lp2 + 1 != pdbpos)
+ {
+ as1.add(Integer.valueOf(alignpos));
+ as2.add(Integer.valueOf(pdbpos));
+ }
+ lp1 = alignpos;
+ lp2 = pdbpos;
+ }
+ else
+ {
+ lastmatch = false;
+ }
+ }
+ // construct range pairs
+ int[] mapseq1 = new int[as1.size() + (lastmatch ? 1 : 0)], mapseq2 = new int[as2
+ .size() + (lastmatch ? 1 : 0)];
+ int i = 0;
+ for (Integer ip : as1)
+ {
+ mapseq1[i++] = ip;
+ }
+ ;
+ i = 0;
+ for (Integer ip : as2)
+ {
+ mapseq2[i++] = ip;
+ }
+ ;
+ if (lastmatch)
+ {
+ mapseq1[mapseq1.length - 1] = alignpos;
+ mapseq2[mapseq2.length - 1] = pdbpos;
+ }
+ MapList map = new MapList(mapseq1, mapseq2, 1, 1);
+
+ jalview.datamodel.Mapping mapping = new Mapping(map);
+ mapping.setTo(s2);
+ return mapping;
+ }
+
+ /**
* compute the PID vector used by the redundancy filter.
- * @param originalSequences - sequences in alignment that are to filtered
- * @param omitHidden - null or strings to be analysed (typically, visible portion of each sequence in alignment)
- * @param start - first column in window for calculation
- * @param end - last column in window for calculation
- * @param ungapped - if true then use ungapped sequence to compute PID
- * @return vector containing maximum PID for i-th sequence and any sequences longer than that seuqence
+ *
+ * @param originalSequences
+ * - sequences in alignment that are to filtered
+ * @param omitHidden
+ * - null or strings to be analysed (typically, visible portion of
+ * each sequence in alignment)
+ * @param start
+ * - first column in window for calculation
+ * @param end
+ * - last column in window for calculation
+ * @param ungapped
+ * - if true then use ungapped sequence to compute PID
+ * @return vector containing maximum PID for i-th sequence and any sequences
+ * longer than that seuqence
*/
- public static float[] computeRedundancyMatrix(SequenceI[] originalSequences,
- String[] omitHidden, int start, int end, boolean ungapped)
+ public static float[] computeRedundancyMatrix(
+ SequenceI[] originalSequences, String[] omitHidden, int start,
+ int end, boolean ungapped)
{
- int height=originalSequences.length;
+ int height = originalSequences.length;
float[] redundancy = new float[height];
- int[] lngth=new int[height];
+ int[] lngth = new int[height];
for (int i = 0; i < height; i++)
{
redundancy[i] = 0f;
- lngth[i]=-1;
+ lngth[i] = -1;
}
-
// long start = System.currentTimeMillis();
float pid;
String seqi, seqj;
for (int i = 0; i < height; i++)
{
-
+
for (int j = 0; j < i; j++)
{
if (i == j)
seqi = omitHidden[i];
seqj = omitHidden[j];
}
- if (lngth[i]==-1)
+ if (lngth[i] == -1)
{
- String ug=AlignSeq.extractGaps(Comparison.GapChars, seqi);
- lngth[i]=ug.length();
+ String ug = AlignSeq.extractGaps(Comparison.GapChars, seqi);
+ lngth[i] = ug.length();
if (ungapped)
{
- seqi=ug;
+ seqi = ug;
}
}
- if (lngth[j]==-1)
+ if (lngth[j] == -1)
{
- String ug=AlignSeq.extractGaps(Comparison.GapChars, seqj);
- lngth[j]=ug.length();
+ String ug = AlignSeq.extractGaps(Comparison.GapChars, seqj);
+ lngth[j] = ug.length();
if (ungapped)
{
- seqj=ug;
+ seqj = ug;
}
}
pid = Comparison.PID(seqi, seqj);
- // use real sequence length rather than string length
- if (lngth[j]<lngth[i])
+ // use real sequence length rather than string length
+ if (lngth[j] < lngth[i])
{
redundancy[j] = Math.max(pid, redundancy[j]);
}