JAL-1807 still testing
[jalviewjs.git] / bin / jalview / analysis / AlignmentUtils.js
index 2990b03..6af5e7a 100644 (file)
-Clazz.declarePackage ("jalview.analysis");
-Clazz.load (null, "jalview.analysis.AlignmentUtils", ["jalview.analysis.CodonComparator", "jalview.datamodel.AlignedCodonFrame", "$.Alignment", "$.AlignmentAnnotation", "$.DBRefEntry", "$.DBRefSource", "$.FeatureProperties", "$.SearchResults", "$.Sequence", "jalview.schemes.ResidueProperties", "jalview.util.DBRefUtils", "$.MapList", "$.MappingUtils", "java.lang.StringBuilder", "java.util.ArrayList", "$.Arrays", "$.HashMap", "$.HashSet", "$.LinkedHashMap", "$.LinkedHashSet", "$.TreeMap"], function () {
-c$ = Clazz.declareType (jalview.analysis, "AlignmentUtils");
-c$.expandContext = Clazz.defineMethod (c$, "expandContext", 
-function (core, flankSize) {
-var sq =  new java.util.ArrayList ();
-var maxoffset = 0;
-for (var s, $s = core.getSequences ().iterator (); $s.hasNext () && ((s = $s.next ()) || true);) {
-var newSeq = s.deriveSequence ();
-var newSeqStart = newSeq.getStart () - 1;
-if (newSeqStart > maxoffset && newSeq.getDatasetSequence ().getStart () < s.getStart ()) {
-maxoffset = newSeqStart;
-}sq.add (newSeq);
-}
-if (flankSize > -1) {
-maxoffset = Math.min (maxoffset, flankSize);
-}for (var s, $s = sq.iterator (); $s.hasNext () && ((s = $s.next ()) || true);) {
-var ds = s;
-while (ds.getDatasetSequence () != null) {
-ds = ds.getDatasetSequence ();
-}
-var s_end = s.findPosition (s.getStart () + s.getLength ());
-var ustream_ds = s.getStart () - ds.getStart ();
-var dstream_ds = ds.getEnd () - s_end;
-var offset = maxoffset - ustream_ds;
-if (flankSize >= 0) {
-if (flankSize < ustream_ds) {
-offset = maxoffset - flankSize;
-ustream_ds = flankSize;
-}if (flankSize <= dstream_ds) {
-dstream_ds = flankSize - 1;
-}}var upstream =  String.instantialize (ds.getSequence (s.getStart () - 1 - ustream_ds, s.getStart () - 1)).toLowerCase ().toCharArray ();
-var downstream =  String.instantialize (ds.getSequence (s_end - 1, s_end + dstream_ds)).toLowerCase ().toCharArray ();
-var coreseq = s.getSequence ();
-var nseq =  Clazz.newCharArray (offset + upstream.length + downstream.length + coreseq.length, '\0');
-var c = core.getGapCharacter ();
-var p = 0;
-for (; p < offset; p++) {
-nseq[p] = c;
-}
-System.arraycopy (upstream, 0, nseq, p, upstream.length);
-System.arraycopy (coreseq, 0, nseq, p + upstream.length, coreseq.length);
-System.arraycopy (downstream, 0, nseq, p + coreseq.length + upstream.length, downstream.length);
-s.setSequence ( String.instantialize (nseq));
-s.setStart (s.getStart () - ustream_ds);
-s.setEnd (s_end + downstream.length);
-}
-var newAl =  new jalview.datamodel.Alignment (sq.toArray ( new Array (0)));
-for (var s, $s = sq.iterator (); $s.hasNext () && ((s = $s.next ()) || true);) {
-if (s.getAnnotation () != null) {
-for (var aa, $aa = 0, $$aa = s.getAnnotation (); $aa < $$aa.length && ((aa = $$aa[$aa]) || true); $aa++) {
-aa.adjustForAlignment ();
-newAl.addAnnotation (aa);
-}
-}}
-newAl.setDataset (core.getDataset ());
-return newAl;
-}, "jalview.datamodel.AlignmentI,~N");
-c$.getSequenceIndex = Clazz.defineMethod (c$, "getSequenceIndex", 
-function (al, seq) {
-var result = -1;
-var pos = 0;
-for (var alSeq, $alSeq = al.getSequences ().iterator (); $alSeq.hasNext () && ((alSeq = $alSeq.next ()) || true);) {
-if (alSeq === seq) {
-result = pos;
-break;
-}pos++;
-}
-return result;
-}, "jalview.datamodel.AlignmentI,jalview.datamodel.SequenceI");
-c$.getSequencesByName = Clazz.defineMethod (c$, "getSequencesByName", 
-function (al) {
-var theMap =  new java.util.LinkedHashMap ();
-for (var seq, $seq = al.getSequences ().iterator (); $seq.hasNext () && ((seq = $seq.next ()) || true);) {
-var name = seq.getName ();
-if (name != null) {
-var seqs = theMap.get (name);
-if (seqs == null) {
-seqs =  new java.util.ArrayList ();
-theMap.put (name, seqs);
-}seqs.add (seq);
-}}
-return theMap;
-}, "jalview.datamodel.AlignmentI");
-c$.mapProteinToCdna = Clazz.defineMethod (c$, "mapProteinToCdna", 
-function (proteinAlignment, cdnaAlignment) {
-if (proteinAlignment == null || cdnaAlignment == null) {
-return false;
-}var mappedDna =  new java.util.HashSet ();
-var mappedProtein =  new java.util.HashSet ();
-var mappingPerformed = jalview.analysis.AlignmentUtils.mapProteinToCdna (proteinAlignment, cdnaAlignment, mappedDna, mappedProtein, true);
-mappingPerformed = new Boolean (mappingPerformed | jalview.analysis.AlignmentUtils.mapProteinToCdna (proteinAlignment, cdnaAlignment, mappedDna, mappedProtein, false)).valueOf ();
-return mappingPerformed;
-}, "jalview.datamodel.AlignmentI,jalview.datamodel.AlignmentI");
-c$.mapProteinToCdna = Clazz.defineMethod (c$, "mapProteinToCdna", 
-function (proteinAlignment, cdnaAlignment, mappedDna, mappedProtein, xrefsOnly) {
-var mappingPerformed = false;
-var thisSeqs = proteinAlignment.getSequences ();
-for (var aaSeq, $aaSeq = thisSeqs.iterator (); $aaSeq.hasNext () && ((aaSeq = $aaSeq.next ()) || true);) {
-var proteinMapped = false;
-var acf =  new jalview.datamodel.AlignedCodonFrame ();
-for (var cdnaSeq, $cdnaSeq = cdnaAlignment.getSequences ().iterator (); $cdnaSeq.hasNext () && ((cdnaSeq = $cdnaSeq.next ()) || true);) {
-if (xrefsOnly && !jalview.analysis.AlignmentUtils.haveCrossRef (aaSeq, cdnaSeq)) {
-continue;
-}if (!xrefsOnly && (mappedProtein.contains (aaSeq) || mappedDna.contains (cdnaSeq))) {
-continue;
-}if (!jalview.analysis.AlignmentUtils.mappingExists (proteinAlignment.getCodonFrames (), aaSeq.getDatasetSequence (), cdnaSeq.getDatasetSequence ())) {
-var map = jalview.analysis.AlignmentUtils.mapProteinToCdna (aaSeq, cdnaSeq);
-if (map != null) {
-acf.addMap (cdnaSeq, aaSeq, map);
-mappingPerformed = true;
-proteinMapped = true;
-mappedDna.add (cdnaSeq);
-mappedProtein.add (aaSeq);
-}}}
-if (proteinMapped) {
-proteinAlignment.addCodonFrame (acf);
-}}
-return mappingPerformed;
-}, "jalview.datamodel.AlignmentI,jalview.datamodel.AlignmentI,java.util.Set,java.util.Set,~B");
-c$.mappingExists = Clazz.defineMethod (c$, "mappingExists", 
-function (set, aaSeq, cdnaSeq) {
-if (set != null) {
-for (var acf, $acf = set.iterator (); $acf.hasNext () && ((acf = $acf.next ()) || true);) {
-if (cdnaSeq === acf.getDnaForAaSeq (aaSeq)) {
-return true;
-}}
-}return false;
-}, "java.util.Set,jalview.datamodel.SequenceI,jalview.datamodel.SequenceI");
-c$.mapProteinToCdna = Clazz.defineMethod (c$, "mapProteinToCdna", 
-function (proteinSeq, cdnaSeq) {
-var proteinDataset = proteinSeq.getDatasetSequence ();
-var aaSeqChars = proteinDataset != null ? proteinDataset.getSequence () : proteinSeq.getSequence ();
-var cdnaDataset = cdnaSeq.getDatasetSequence ();
-var cdnaSeqChars = cdnaDataset != null ? cdnaDataset.getSequence () : cdnaSeq.getSequence ();
-if (aaSeqChars == null || cdnaSeqChars == null) {
-return null;
-}var mappedLength = 3 * aaSeqChars.length;
-var cdnaLength = cdnaSeqChars.length;
-var cdnaStart = 1;
-var cdnaEnd = cdnaLength;
-var proteinStart = 1;
-var proteinEnd = aaSeqChars.length;
-if (cdnaLength != mappedLength && cdnaLength > 2) {
-var lastCodon = String.valueOf (cdnaSeqChars, cdnaLength - 3, 3).toUpperCase ();
-for (var stop, $stop = jalview.schemes.ResidueProperties.STOP.iterator (); $stop.hasNext () && ((stop = $stop.next ()) || true);) {
-if (lastCodon.equals (stop)) {
-cdnaEnd -= 3;
-cdnaLength -= 3;
-break;
-}}
-}if (cdnaLength != mappedLength && cdnaLength > 2 && String.valueOf (cdnaSeqChars, 0, 3).toUpperCase ().equals (jalview.schemes.ResidueProperties.START)) {
-cdnaStart += 3;
-cdnaLength -= 3;
-}if (cdnaLength != mappedLength) {
-return null;
-}if (!jalview.analysis.AlignmentUtils.translatesAs (cdnaSeqChars, cdnaStart - 1, aaSeqChars)) {
-return null;
-}var map =  new jalview.util.MapList ( Clazz.newIntArray (-1, [cdnaStart, cdnaEnd]),  Clazz.newIntArray (-1, [1, proteinEnd]), 3, 1);
-return map;
-}, "jalview.datamodel.SequenceI,jalview.datamodel.SequenceI");
-c$.translatesAs = Clazz.defineMethod (c$, "translatesAs", 
-function (cdnaSeqChars, cdnaStart, aaSeqChars) {
-var aaResidue = 0;
-for (var i = cdnaStart; i < cdnaSeqChars.length - 2 && aaResidue < aaSeqChars.length; i += 3, aaResidue++) {
-var codon = String.valueOf (cdnaSeqChars, i, 3);
-var translated = jalview.schemes.ResidueProperties.codonTranslate (codon);
-var aaRes = aaSeqChars[aaResidue];
-if ((translated == null || "STOP".equals (translated)) && aaRes == 'X') {
-continue;
-}if (translated == null || !(aaRes == translated.charAt (0))) {
-return false;
-}}
-return (aaResidue == aaSeqChars.length);
-}, "~A,~N,~A");
-c$.alignSequenceAs = Clazz.defineMethod (c$, "alignSequenceAs", 
-function (seq, al, gap, preserveMappedGaps, preserveUnmappedGaps) {
-var mappings = al.getCodonFrame (seq);
-if (mappings == null || mappings.isEmpty ()) {
-return false;
-}var alignFrom = null;
-var mapping = null;
-for (var mp, $mp = mappings.iterator (); $mp.hasNext () && ((mp = $mp.next ()) || true);) {
-alignFrom = mp.findAlignedSequence (seq.getDatasetSequence (), al);
-if (alignFrom != null) {
-mapping = mp;
-break;
-}}
-if (alignFrom == null) {
-return false;
-}jalview.analysis.AlignmentUtils.alignSequenceAs (seq, alignFrom, mapping, gap, al.getGapCharacter (), preserveMappedGaps, preserveUnmappedGaps);
-return true;
-}, "jalview.datamodel.SequenceI,jalview.datamodel.AlignmentI,~S,~B,~B");
-c$.alignSequenceAs = Clazz.defineMethod (c$, "alignSequenceAs", 
-function (alignTo, alignFrom, mapping, myGap, sourceGap, preserveMappedGaps, preserveUnmappedGaps) {
-var thisSeq = alignTo.getSequence ();
-var thatAligned = alignFrom.getSequence ();
-var thisAligned =  new StringBuilder (2 * thisSeq.length);
-var thisSeqPos = 0;
-var sourceDsPos = 0;
-var basesWritten = 0;
-var myGapChar = myGap.charAt (0);
-var ratio = myGap.length;
-var sourceGapMappedLength = 0;
-var inExon = false;
-for (var sourceChar, $sourceChar = 0, $$sourceChar = thatAligned; $sourceChar < $$sourceChar.length && ((sourceChar = $$sourceChar[$sourceChar]) || true); $sourceChar++) {
-if (sourceChar == sourceGap) {
-sourceGapMappedLength += ratio;
-continue;
-}sourceDsPos++;
-var mappedPos = mapping.getMappedRegion (alignTo, alignFrom, sourceDsPos);
-if (mappedPos == null) {
-System.err.println ("Can't align: no codon mapping to residue " + sourceDsPos + "(" + sourceChar + ")");
-return;
-}var mappedCodonStart = mappedPos[0];
-var mappedCodonEnd = mappedPos[mappedPos.length - 1];
-var trailingCopiedGap =  new StringBuilder ();
-var intronLength = 0;
-while (basesWritten < mappedCodonEnd && thisSeqPos < thisSeq.length) {
-var c = thisSeq[thisSeqPos++];
-if (c != myGapChar) {
-basesWritten++;
-if (basesWritten < mappedCodonStart) {
-if (preserveUnmappedGaps && trailingCopiedGap.length () > 0) {
-thisAligned.append (trailingCopiedGap.toString ());
-intronLength += trailingCopiedGap.length ();
-trailingCopiedGap =  new StringBuilder ();
-}intronLength++;
-inExon = false;
-} else {
-var startOfCodon = basesWritten == mappedCodonStart;
-var gapsToAdd = jalview.analysis.AlignmentUtils.calculateGapsToInsert (preserveMappedGaps, preserveUnmappedGaps, sourceGapMappedLength, inExon, trailingCopiedGap.length (), intronLength, startOfCodon);
-for (var i = 0; i < gapsToAdd; i++) {
-thisAligned.append (myGapChar);
-}
-sourceGapMappedLength = 0;
-inExon = true;
-}thisAligned.append (c);
-trailingCopiedGap =  new StringBuilder ();
-} else {
-if (inExon && preserveMappedGaps) {
-trailingCopiedGap.append (myGapChar);
-} else if (!inExon && preserveUnmappedGaps) {
-trailingCopiedGap.append (myGapChar);
-}}}
-}
-while (thisSeqPos < thisSeq.length) {
-var c = thisSeq[thisSeqPos++];
-if (c != myGapChar || preserveUnmappedGaps) {
-thisAligned.append (c);
-}}
-alignTo.setSequence ( String.instantialize (thisAligned));
-}, "jalview.datamodel.SequenceI,jalview.datamodel.SequenceI,jalview.datamodel.AlignedCodonFrame,~S,~S,~B,~B");
-c$.calculateGapsToInsert = Clazz.defineMethod (c$, "calculateGapsToInsert", 
-function (preserveMappedGaps, preserveUnmappedGaps, sourceGapMappedLength, inExon, trailingGapLength, intronLength, startOfCodon) {
-var gapsToAdd = 0;
-if (startOfCodon) {
-if (inExon && !preserveMappedGaps) {
-trailingGapLength = 0;
-}if (!inExon && !(preserveMappedGaps && preserveUnmappedGaps)) {
-trailingGapLength = 0;
-}if (inExon) {
-gapsToAdd = Math.max (sourceGapMappedLength, trailingGapLength);
-} else {
-if (intronLength + trailingGapLength <= sourceGapMappedLength) {
-gapsToAdd = sourceGapMappedLength - intronLength;
-} else {
-gapsToAdd = Math.min (intronLength + trailingGapLength - sourceGapMappedLength, trailingGapLength);
-}}} else {
-if (!preserveMappedGaps) {
-trailingGapLength = 0;
-}gapsToAdd = Math.max (sourceGapMappedLength, trailingGapLength);
-}return gapsToAdd;
-}, "~B,~B,~N,~B,~N,~N,~B");
-c$.getAlignedTranslation = Clazz.defineMethod (c$, "getAlignedTranslation", 
-function (sequences, gapCharacter, mappings) {
-var alignedSeqs =  new java.util.ArrayList ();
-for (var seq, $seq = sequences.iterator (); $seq.hasNext () && ((seq = $seq.next ()) || true);) {
-var mapped = jalview.analysis.AlignmentUtils.getAlignedTranslation (seq, gapCharacter, mappings);
-alignedSeqs.addAll (mapped);
-}
-return alignedSeqs;
-}, "java.util.List,~S,java.util.Set");
-c$.getAlignedTranslation = Clazz.defineMethod (c$, "getAlignedTranslation", 
-function (seq, gapCharacter, mappings) {
-var result =  new java.util.ArrayList ();
-for (var mapping, $mapping = mappings.iterator (); $mapping.hasNext () && ((mapping = $mapping.next ()) || true);) {
-if (mapping.involvesSequence (seq)) {
-var mapped = jalview.analysis.AlignmentUtils.getAlignedTranslation (seq, gapCharacter, mapping);
-if (mapped != null) {
-result.add (mapped);
-}}}
-return result;
-}, "jalview.datamodel.SequenceI,~S,java.util.Set");
-c$.getAlignedTranslation = Clazz.defineMethod (c$, "getAlignedTranslation", 
-function (seq, gapCharacter, mapping) {
-var gap = String.valueOf (gapCharacter);
-var toDna = false;
-var fromRatio = 1;
-var mapTo = mapping.getDnaForAaSeq (seq);
-if (mapTo != null) {
-toDna = true;
-gap = String.valueOf ( Clazz.newCharArray (-1, [gapCharacter, gapCharacter, gapCharacter]));
-} else {
-mapTo = mapping.getAaForDnaSeq (seq);
-fromRatio = 3;
-}var newseq =  new StringBuilder (seq.getLength () * (toDna ? 3 : 1));
-var residueNo = 0;
-var phrase =  Clazz.newIntArray (fromRatio, 0);
-var phraseOffset = 0;
-var gapWidth = 0;
-var first = true;
-var alignedSeq =  new jalview.datamodel.Sequence ("", "");
-for (var c, $c = 0, $$c = seq.getSequence (); $c < $$c.length && ((c = $$c[$c]) || true); $c++) {
-if (c == gapCharacter) {
-gapWidth++;
-if (gapWidth >= fromRatio) {
-newseq.append (gap);
-gapWidth = 0;
-}} else {
-phrase[phraseOffset++] = residueNo + 1;
-if (phraseOffset == fromRatio) {
-var sr =  new jalview.datamodel.SearchResults ();
-for (var pos, $pos = 0, $$pos = phrase; $pos < $$pos.length && ((pos = $$pos[$pos]) || true); $pos++) {
-mapping.markMappedRegion (seq, pos, sr);
-}
-newseq.append (sr.toString ());
-if (first) {
-first = false;
-var mappedTo = sr.getResultSequence (0);
-alignedSeq.setName (mappedTo.getName ());
-alignedSeq.setDescription (mappedTo.getDescription ());
-alignedSeq.setDatasetSequence (mappedTo);
-}phraseOffset = 0;
-}residueNo++;
-}}
-alignedSeq.setSequence (newseq.toString ());
-return alignedSeq;
-}, "jalview.datamodel.SequenceI,~S,jalview.datamodel.AlignedCodonFrame");
-c$.alignProteinAsDna = Clazz.defineMethod (c$, "alignProteinAsDna", 
-function (protein, dna) {
-var mappings = protein.getCodonFrames ();
-var alignedCodons =  new java.util.TreeMap ( new jalview.analysis.CodonComparator ());
-for (var dnaSeq, $dnaSeq = dna.getSequences ().iterator (); $dnaSeq.hasNext () && ((dnaSeq = $dnaSeq.next ()) || true);) {
-for (var mapping, $mapping = mappings.iterator (); $mapping.hasNext () && ((mapping = $mapping.next ()) || true);) {
-var seqMap = mapping.getMappingForSequence (dnaSeq);
-var prot = mapping.findAlignedSequence (dnaSeq.getDatasetSequence (), protein);
-if (prot != null) {
-jalview.analysis.AlignmentUtils.addCodonPositions (dnaSeq, prot, protein.getGapCharacter (), seqMap, alignedCodons);
-}}
-}
-return jalview.analysis.AlignmentUtils.alignProteinAs (protein, alignedCodons);
-}, "jalview.datamodel.AlignmentI,jalview.datamodel.AlignmentI");
-c$.alignProteinAs = Clazz.defineMethod (c$, "alignProteinAs", 
-function (protein, alignedCodons) {
-var alignedWidth = alignedCodons.size ();
-var gaps =  Clazz.newCharArray (alignedWidth, '\0');
-java.util.Arrays.fill (gaps, protein.getGapCharacter ());
-var allGaps = String.valueOf (gaps);
-for (var seq, $seq = protein.getSequences ().iterator (); $seq.hasNext () && ((seq = $seq.next ()) || true);) {
-seq.setSequence (allGaps);
-}
-var column = 0;
-for (var codon, $codon = alignedCodons.keySet ().iterator (); $codon.hasNext () && ((codon = $codon.next ()) || true);) {
-var columnResidues = alignedCodons.get (codon);
-for (var entry, $entry = columnResidues.entrySet ().iterator (); $entry.hasNext () && ((entry = $entry.next ()) || true);) {
-entry.getKey ().getSequence ()[column] = entry.getValue ().charAt (0);
-}
-column++;
-}
-return 0;
-}, "jalview.datamodel.AlignmentI,java.util.Map");
-c$.addCodonPositions = Clazz.defineMethod (c$, "addCodonPositions", 
-function (dna, protein, gapChar, seqMap, alignedCodons) {
-var codons = seqMap.getCodonIterator (dna, gapChar);
-while (codons.hasNext ()) {
-var codon = codons.next ();
-var seqProduct = alignedCodons.get (codon);
-if (seqProduct == null) {
-seqProduct =  new java.util.HashMap ();
-alignedCodons.put (codon, seqProduct);
-}seqProduct.put (protein, codon.product);
-}
-}, "jalview.datamodel.SequenceI,jalview.datamodel.SequenceI,~S,jalview.datamodel.Mapping,java.util.Map");
-c$.isMappable = Clazz.defineMethod (c$, "isMappable", 
-function (al1, al2) {
-if (al1.isNucleotide () == al2.isNucleotide ()) {
-return false;
-}var dna = al1.isNucleotide () ? al1 : al2;
-var protein = dna === al1 ? al2 : al1;
-var mappings = protein.getCodonFrames ();
-for (var dnaSeq, $dnaSeq = dna.getSequences ().iterator (); $dnaSeq.hasNext () && ((dnaSeq = $dnaSeq.next ()) || true);) {
-for (var proteinSeq, $proteinSeq = protein.getSequences ().iterator (); $proteinSeq.hasNext () && ((proteinSeq = $proteinSeq.next ()) || true);) {
-if (jalview.analysis.AlignmentUtils.isMappable (dnaSeq, proteinSeq, mappings)) {
-return true;
-}}
-}
-return false;
-}, "jalview.datamodel.AlignmentI,jalview.datamodel.AlignmentI");
-c$.isMappable = Clazz.defineMethod (c$, "isMappable", 
-function (dnaSeq, proteinSeq, mappings) {
-var dnaDs = dnaSeq.getDatasetSequence () == null ? dnaSeq : dnaSeq.getDatasetSequence ();
-var proteinDs = proteinSeq.getDatasetSequence () == null ? proteinSeq : proteinSeq.getDatasetSequence ();
-for (var mapping, $mapping = mappings.iterator (); $mapping.hasNext () && ((mapping = $mapping.next ()) || true);) {
-if (proteinDs === mapping.getAaForDnaSeq (dnaDs)) {
-return true;
-}}
-return jalview.analysis.AlignmentUtils.mapProteinToCdna (proteinDs, dnaDs) != null;
-}, "jalview.datamodel.SequenceI,jalview.datamodel.SequenceI,java.util.Set");
-c$.findAddableReferenceAnnotations = Clazz.defineMethod (c$, "findAddableReferenceAnnotations", 
-function (sequenceScope, labelForCalcId, candidates, al) {
-if (sequenceScope == null) {
-return;
-}for (var seq, $seq = sequenceScope.iterator (); $seq.hasNext () && ((seq = $seq.next ()) || true);) {
-var dataset = seq.getDatasetSequence ();
-if (dataset == null) {
-continue;
-}var datasetAnnotations = dataset.getAnnotation ();
-if (datasetAnnotations == null) {
-continue;
-}var result =  new java.util.ArrayList ();
-for (var dsann, $dsann = 0, $$dsann = datasetAnnotations; $dsann < $$dsann.length && ((dsann = $$dsann[$dsann]) || true); $dsann++) {
-var matchedAlignmentAnnotations = al.findAnnotations (seq, dsann.getCalcId (), dsann.label);
-if (!matchedAlignmentAnnotations.iterator ().hasNext ()) {
-result.add (dsann);
-if (labelForCalcId != null) {
-labelForCalcId.put (dsann.getCalcId (), dsann.label);
-}}}
-if (!result.isEmpty ()) {
-candidates.put (seq, result);
-}}
-}, "java.util.List,java.util.Map,java.util.Map,jalview.datamodel.AlignmentI");
-c$.addReferenceAnnotations = Clazz.defineMethod (c$, "addReferenceAnnotations", 
-function (annotations, alignment, selectionGroup) {
-for (var seq, $seq = annotations.keySet ().iterator (); $seq.hasNext () && ((seq = $seq.next ()) || true);) {
-for (var ann, $ann = annotations.get (seq).iterator (); $ann.hasNext () && ((ann = $ann.next ()) || true);) {
-var copyAnn =  new jalview.datamodel.AlignmentAnnotation (ann);
-var startRes = 0;
-var endRes = ann.annotations.length;
-if (selectionGroup != null) {
-startRes = selectionGroup.getStartRes ();
-endRes = selectionGroup.getEndRes ();
-}copyAnn.restrict (startRes, endRes);
-if (!seq.hasAnnotation (ann)) {
-seq.addAlignmentAnnotation (copyAnn);
-}copyAnn.adjustForAlignment ();
-alignment.addAnnotation (copyAnn);
-copyAnn.visible = true;
-}
-}
-}, "java.util.Map,jalview.datamodel.AlignmentI,jalview.datamodel.SequenceGroup");
-c$.showOrHideSequenceAnnotations = Clazz.defineMethod (c$, "showOrHideSequenceAnnotations", 
-function (al, types, forSequences, anyType, doShow) {
-for (var aa, $aa = 0, $$aa = al.getAlignmentAnnotation (); $aa < $$aa.length && ((aa = $$aa[$aa]) || true); $aa++) {
-if (anyType || types.contains (aa.label)) {
-if ((aa.sequenceRef != null) && (forSequences == null || forSequences.contains (aa.sequenceRef))) {
-aa.visible = doShow;
-}}}
-}, "jalview.datamodel.AlignmentI,java.util.Collection,java.util.List,~B,~B");
-c$.haveCrossRef = Clazz.defineMethod (c$, "haveCrossRef", 
-function (seq1, seq2) {
-return jalview.analysis.AlignmentUtils.hasCrossRef (seq1, seq2) || jalview.analysis.AlignmentUtils.hasCrossRef (seq2, seq1);
-}, "jalview.datamodel.SequenceI,jalview.datamodel.SequenceI");
-c$.hasCrossRef = Clazz.defineMethod (c$, "hasCrossRef", 
-function (seq1, seq2) {
-if (seq1 == null || seq2 == null) {
-return false;
-}var name = seq2.getName ();
-var xrefs = seq1.getDBRef ();
-if (xrefs != null) {
-for (var xref, $xref = 0, $$xref = xrefs; $xref < $$xref.length && ((xref = $$xref[$xref]) || true); $xref++) {
-var xrefName = xref.getSource () + "|" + xref.getAccessionId ();
-if (xrefName.equalsIgnoreCase (name)) {
-return true;
-}}
-}return false;
-}, "jalview.datamodel.SequenceI,jalview.datamodel.SequenceI");
-c$.makeExonAlignment = Clazz.defineMethod (c$, "makeExonAlignment", 
-function (dna, mappings) {
-var newMappings =  new java.util.LinkedHashSet ();
-var exonSequences =  new java.util.ArrayList ();
-for (var dnaSeq, $dnaSeq = 0, $$dnaSeq = dna; $dnaSeq < $$dnaSeq.length && ((dnaSeq = $$dnaSeq[$dnaSeq]) || true); $dnaSeq++) {
-var ds = dnaSeq.getDatasetSequence ();
-var seqMappings = jalview.util.MappingUtils.findMappingsForSequence (ds, mappings);
-for (var acf, $acf = seqMappings.iterator (); $acf.hasNext () && ((acf = $acf.next ()) || true);) {
-var newMapping =  new jalview.datamodel.AlignedCodonFrame ();
-var mappedExons = jalview.analysis.AlignmentUtils.makeExonSequences (ds, acf, newMapping);
-if (!mappedExons.isEmpty ()) {
-exonSequences.addAll (mappedExons);
-newMappings.add (newMapping);
-}}
-}
-var al =  new jalview.datamodel.Alignment (exonSequences.toArray ( new Array (exonSequences.size ())));
-al.setDataset (null);
-mappings.clear ();
-mappings.addAll (newMappings);
-return al;
-}, "~A,java.util.Set");
-c$.makeExonSequences = Clazz.defineMethod (c$, "makeExonSequences", 
-function (dnaSeq, mapping, newMapping) {
-var exonSequences =  new java.util.ArrayList ();
-var seqMappings = mapping.getMappingsForSequence (dnaSeq);
-var dna = dnaSeq.getSequence ();
-for (var seqMapping, $seqMapping = seqMappings.iterator (); $seqMapping.hasNext () && ((seqMapping = $seqMapping.next ()) || true);) {
-var newSequence =  new StringBuilder (dnaSeq.getLength ());
-var dnaExonRanges = seqMapping.getMap ().getFromRanges ();
-for (var range, $range = dnaExonRanges.iterator (); $range.hasNext () && ((range = $range.next ()) || true);) {
-for (var pos = range[0]; pos <= range[1]; pos++) {
-newSequence.append (dna[pos - 1]);
-}
-}
-var exon =  new jalview.datamodel.Sequence (dnaSeq.getName (), newSequence.toString ());
-var cdsAccId = jalview.datamodel.FeatureProperties.getCodingFeature (jalview.datamodel.DBRefSource.EMBL);
-var cdsRefs = jalview.util.DBRefUtils.selectRefs (seqMapping.getTo ().getDBRef (), jalview.datamodel.DBRefSource.CODINGDBS);
-if (cdsRefs != null) {
-for (var cdsRef, $cdsRef = 0, $$cdsRef = cdsRefs; $cdsRef < $$cdsRef.length && ((cdsRef = $$cdsRef[$cdsRef]) || true); $cdsRef++) {
-exon.addDBRef ( new jalview.datamodel.DBRefEntry (cdsRef));
-cdsAccId = cdsRef.getAccessionId ();
-}
-}exon.setName (exon.getName () + "|" + cdsAccId);
-exon.createDatasetSequence ();
-var exonRange =  new java.util.ArrayList ();
-exonRange.add ( Clazz.newIntArray (-1, [1, newSequence.length ()]));
-var map =  new jalview.util.MapList (exonRange, seqMapping.getMap ().getToRanges (), 3, 1);
-newMapping.addMap (exon.getDatasetSequence (), seqMapping.getTo (), map);
-var cdsToDnaMap =  new jalview.util.MapList (dnaExonRanges, exonRange, 1, 1);
-newMapping.addMap (dnaSeq, exon.getDatasetSequence (), cdsToDnaMap);
-exonSequences.add (exon);
-}
-return exonSequences;
-}, "jalview.datamodel.SequenceI,jalview.datamodel.AlignedCodonFrame,jalview.datamodel.AlignedCodonFrame");
-});
+Clazz.declarePackage ("jalview.analysis");\r
+Clazz.load (null, "jalview.analysis.AlignmentUtils", ["jalview.analysis.CodonComparator", "jalview.datamodel.AlignedCodonFrame", "$.Alignment", "$.AlignmentAnnotation", "$.DBRefEntry", "$.DBRefSource", "$.FeatureProperties", "$.SearchResults", "$.Sequence", "jalview.schemes.ResidueProperties", "jalview.util.DBRefUtils", "$.MapList", "$.MappingUtils", "java.lang.StringBuilder", "java.util.ArrayList", "$.Arrays", "$.HashMap", "$.HashSet", "$.LinkedHashMap", "$.LinkedHashSet", "$.TreeMap"], function () {\r
+c$ = Clazz.declareType (jalview.analysis, "AlignmentUtils");\r
+c$.expandContext = Clazz.defineMethod (c$, "expandContext", \r
+function (core, flankSize) {\r
+var sq =  new java.util.ArrayList ();\r
+var maxoffset = 0;\r
+for (var s, $s = core.getSequences ().iterator (); $s.hasNext () && ((s = $s.next ()) || true);) {\r
+var newSeq = s.deriveSequence ();\r
+var newSeqStart = newSeq.getStart () - 1;\r
+if (newSeqStart > maxoffset && newSeq.getDatasetSequence ().getStart () < s.getStart ()) {\r
+maxoffset = newSeqStart;\r
+}sq.add (newSeq);\r
+}\r
+if (flankSize > -1) {\r
+maxoffset = Math.min (maxoffset, flankSize);\r
+}for (var s, $s = sq.iterator (); $s.hasNext () && ((s = $s.next ()) || true);) {\r
+var ds = s;\r
+while (ds.getDatasetSequence () != null) {\r
+ds = ds.getDatasetSequence ();\r
+}\r
+var s_end = s.findPosition (s.getStart () + s.getLength ());\r
+var ustream_ds = s.getStart () - ds.getStart ();\r
+var dstream_ds = ds.getEnd () - s_end;\r
+var offset = maxoffset - ustream_ds;\r
+if (flankSize >= 0) {\r
+if (flankSize < ustream_ds) {\r
+offset = maxoffset - flankSize;\r
+ustream_ds = flankSize;\r
+}if (flankSize <= dstream_ds) {\r
+dstream_ds = flankSize - 1;\r
+}}var upstream =  String.instantialize (ds.getSequence (s.getStart () - 1 - ustream_ds, s.getStart () - 1)).toLowerCase ().toCharArray ();\r
+var downstream =  String.instantialize (ds.getSequence (s_end - 1, s_end + dstream_ds)).toLowerCase ().toCharArray ();\r
+var coreseq = s.getSequence ();\r
+var nseq =  Clazz.newCharArray (offset + upstream.length + downstream.length + coreseq.length, '\0');\r
+var c = core.getGapCharacter ();\r
+var p = 0;\r
+for (; p < offset; p++) {\r
+nseq[p] = c;\r
+}\r
+System.arraycopy (upstream, 0, nseq, p, upstream.length);\r
+System.arraycopy (coreseq, 0, nseq, p + upstream.length, coreseq.length);\r
+System.arraycopy (downstream, 0, nseq, p + coreseq.length + upstream.length, downstream.length);\r
+s.setSequence ( String.instantialize (nseq));\r
+s.setStart (s.getStart () - ustream_ds);\r
+s.setEnd (s_end + downstream.length);\r
+}\r
+var newAl =  new jalview.datamodel.Alignment (sq.toArray ( new Array (0)));\r
+for (var s, $s = sq.iterator (); $s.hasNext () && ((s = $s.next ()) || true);) {\r
+if (s.getAnnotation () != null) {\r
+for (var aa, $aa = 0, $$aa = s.getAnnotation (); $aa < $$aa.length && ((aa = $$aa[$aa]) || true); $aa++) {\r
+aa.adjustForAlignment ();\r
+newAl.addAnnotation (aa);\r
+}\r
+}}\r
+newAl.setDataset (core.getDataset ());\r
+return newAl;\r
+}, "jalview.datamodel.AlignmentI,~N");\r
+c$.getSequenceIndex = Clazz.defineMethod (c$, "getSequenceIndex", \r
+function (al, seq) {\r
+var result = -1;\r
+var pos = 0;\r
+for (var alSeq, $alSeq = al.getSequences ().iterator (); $alSeq.hasNext () && ((alSeq = $alSeq.next ()) || true);) {\r
+if (alSeq === seq) {\r
+result = pos;\r
+break;\r
+}pos++;\r
+}\r
+return result;\r
+}, "jalview.datamodel.AlignmentI,jalview.datamodel.SequenceI");\r
+c$.getSequencesByName = Clazz.defineMethod (c$, "getSequencesByName", \r
+function (al) {\r
+var theMap =  new java.util.LinkedHashMap ();\r
+for (var seq, $seq = al.getSequences ().iterator (); $seq.hasNext () && ((seq = $seq.next ()) || true);) {\r
+var name = seq.getName ();\r
+if (name != null) {\r
+var seqs = theMap.get (name);\r
+if (seqs == null) {\r
+seqs =  new java.util.ArrayList ();\r
+theMap.put (name, seqs);\r
+}seqs.add (seq);\r
+}}\r
+return theMap;\r
+}, "jalview.datamodel.AlignmentI");\r
+c$.mapProteinToCdna = Clazz.defineMethod (c$, "mapProteinToCdna", \r
+function (proteinAlignment, cdnaAlignment) {\r
+if (proteinAlignment == null || cdnaAlignment == null) {\r
+return false;\r
+}var mappedDna =  new java.util.HashSet ();\r
+var mappedProtein =  new java.util.HashSet ();\r
+var mappingPerformed = jalview.analysis.AlignmentUtils.mapProteinToCdna (proteinAlignment, cdnaAlignment, mappedDna, mappedProtein, true);\r
+mappingPerformed = new Boolean (mappingPerformed | jalview.analysis.AlignmentUtils.mapProteinToCdna (proteinAlignment, cdnaAlignment, mappedDna, mappedProtein, false)).valueOf ();\r
+return mappingPerformed;\r
+}, "jalview.datamodel.AlignmentI,jalview.datamodel.AlignmentI");\r
+c$.mapProteinToCdna = Clazz.defineMethod (c$, "mapProteinToCdna", \r
+function (proteinAlignment, cdnaAlignment, mappedDna, mappedProtein, xrefsOnly) {\r
+var mappingPerformed = false;\r
+var thisSeqs = proteinAlignment.getSequences ();\r
+for (var aaSeq, $aaSeq = thisSeqs.iterator (); $aaSeq.hasNext () && ((aaSeq = $aaSeq.next ()) || true);) {\r
+var proteinMapped = false;\r
+var acf =  new jalview.datamodel.AlignedCodonFrame ();\r
+for (var cdnaSeq, $cdnaSeq = cdnaAlignment.getSequences ().iterator (); $cdnaSeq.hasNext () && ((cdnaSeq = $cdnaSeq.next ()) || true);) {\r
+if (xrefsOnly && !jalview.analysis.AlignmentUtils.haveCrossRef (aaSeq, cdnaSeq)) {\r
+continue;\r
+}if (!xrefsOnly && (mappedProtein.contains (aaSeq) || mappedDna.contains (cdnaSeq))) {\r
+continue;\r
+}if (!jalview.analysis.AlignmentUtils.mappingExists (proteinAlignment.getCodonFrames (), aaSeq.getDatasetSequence (), cdnaSeq.getDatasetSequence ())) {\r
+var map = jalview.analysis.AlignmentUtils.mapProteinToCdna (aaSeq, cdnaSeq);\r
+if (map != null) {\r
+acf.addMap (cdnaSeq, aaSeq, map);\r
+mappingPerformed = true;\r
+proteinMapped = true;\r
+mappedDna.add (cdnaSeq);\r
+mappedProtein.add (aaSeq);\r
+}}}\r
+if (proteinMapped) {\r
+proteinAlignment.addCodonFrame (acf);\r
+}}\r
+return mappingPerformed;\r
+}, "jalview.datamodel.AlignmentI,jalview.datamodel.AlignmentI,java.util.Set,java.util.Set,~B");\r
+c$.mappingExists = Clazz.defineMethod (c$, "mappingExists", \r
+function (set, aaSeq, cdnaSeq) {\r
+if (set != null) {\r
+for (var acf, $acf = set.iterator (); $acf.hasNext () && ((acf = $acf.next ()) || true);) {\r
+if (cdnaSeq === acf.getDnaForAaSeq (aaSeq)) {\r
+return true;\r
+}}\r
+}return false;\r
+}, "java.util.Set,jalview.datamodel.SequenceI,jalview.datamodel.SequenceI");\r
+c$.mapProteinToCdna = Clazz.defineMethod (c$, "mapProteinToCdna", \r
+function (proteinSeq, cdnaSeq) {\r
+var proteinDataset = proteinSeq.getDatasetSequence ();\r
+var aaSeqChars = proteinDataset != null ? proteinDataset.getSequence () : proteinSeq.getSequence ();\r
+var cdnaDataset = cdnaSeq.getDatasetSequence ();\r
+var cdnaSeqChars = cdnaDataset != null ? cdnaDataset.getSequence () : cdnaSeq.getSequence ();\r
+if (aaSeqChars == null || cdnaSeqChars == null) {\r
+return null;\r
+}var mappedLength = 3 * aaSeqChars.length;\r
+var cdnaLength = cdnaSeqChars.length;\r
+var cdnaStart = 1;\r
+var cdnaEnd = cdnaLength;\r
+var proteinStart = 1;\r
+var proteinEnd = aaSeqChars.length;\r
+if (cdnaLength != mappedLength && cdnaLength > 2) {\r
+var lastCodon = String.valueOf (cdnaSeqChars, cdnaLength - 3, 3).toUpperCase ();\r
+for (var stop, $stop = jalview.schemes.ResidueProperties.STOP.iterator (); $stop.hasNext () && ((stop = $stop.next ()) || true);) {\r
+if (lastCodon.equals (stop)) {\r
+cdnaEnd -= 3;\r
+cdnaLength -= 3;\r
+break;\r
+}}\r
+}if (cdnaLength != mappedLength && cdnaLength > 2 && String.valueOf (cdnaSeqChars, 0, 3).toUpperCase ().equals (jalview.schemes.ResidueProperties.START)) {\r
+cdnaStart += 3;\r
+cdnaLength -= 3;\r
+}if (cdnaLength != mappedLength) {\r
+return null;\r
+}if (!jalview.analysis.AlignmentUtils.translatesAs (cdnaSeqChars, cdnaStart - 1, aaSeqChars)) {\r
+return null;\r
+}var map =  new jalview.util.MapList ( Clazz.newIntArray (-1, [cdnaStart, cdnaEnd]),  Clazz.newIntArray (-1, [1, proteinEnd]), 3, 1);\r
+return map;\r
+}, "jalview.datamodel.SequenceI,jalview.datamodel.SequenceI");\r
+c$.translatesAs = Clazz.defineMethod (c$, "translatesAs", \r
+function (cdnaSeqChars, cdnaStart, aaSeqChars) {\r
+var aaResidue = 0;\r
+for (var i = cdnaStart; i < cdnaSeqChars.length - 2 && aaResidue < aaSeqChars.length; i += 3, aaResidue++) {\r
+var codon = String.valueOf (cdnaSeqChars, i, 3);\r
+var translated = jalview.schemes.ResidueProperties.codonTranslate (codon);\r
+var aaRes = aaSeqChars[aaResidue];\r
+if ((translated == null || "STOP".equals (translated)) && aaRes == 'X') {\r
+continue;\r
+}if (translated == null || !(aaRes == translated.charAt (0))) {\r
+return false;\r
+}}\r
+return (aaResidue == aaSeqChars.length);\r
+}, "~A,~N,~A");\r
+c$.alignSequenceAs = Clazz.defineMethod (c$, "alignSequenceAs", \r
+function (seq, al, gap, preserveMappedGaps, preserveUnmappedGaps) {\r
+var mappings = al.getCodonFrame (seq);\r
+if (mappings == null || mappings.isEmpty ()) {\r
+return false;\r
+}var alignFrom = null;\r
+var mapping = null;\r
+for (var mp, $mp = mappings.iterator (); $mp.hasNext () && ((mp = $mp.next ()) || true);) {\r
+alignFrom = mp.findAlignedSequence (seq.getDatasetSequence (), al);\r
+if (alignFrom != null) {\r
+mapping = mp;\r
+break;\r
+}}\r
+if (alignFrom == null) {\r
+return false;\r
+}jalview.analysis.AlignmentUtils.alignSequenceAs (seq, alignFrom, mapping, gap, al.getGapCharacter (), preserveMappedGaps, preserveUnmappedGaps);\r
+return true;\r
+}, "jalview.datamodel.SequenceI,jalview.datamodel.AlignmentI,~S,~B,~B");\r
+c$.alignSequenceAs = Clazz.defineMethod (c$, "alignSequenceAs", \r
+function (alignTo, alignFrom, mapping, myGap, sourceGap, preserveMappedGaps, preserveUnmappedGaps) {\r
+var thisSeq = alignTo.getSequence ();\r
+var thatAligned = alignFrom.getSequence ();\r
+var thisAligned =  new StringBuilder (2 * thisSeq.length);\r
+var thisSeqPos = 0;\r
+var sourceDsPos = 0;\r
+var basesWritten = 0;\r
+var myGapChar = myGap.charAt (0);\r
+var ratio = myGap.length;\r
+var sourceGapMappedLength = 0;\r
+var inExon = false;\r
+for (var sourceChar, $sourceChar = 0, $$sourceChar = thatAligned; $sourceChar < $$sourceChar.length && ((sourceChar = $$sourceChar[$sourceChar]) || true); $sourceChar++) {\r
+if (sourceChar == sourceGap) {\r
+sourceGapMappedLength += ratio;\r
+continue;\r
+}sourceDsPos++;\r
+var mappedPos = mapping.getMappedRegion (alignTo, alignFrom, sourceDsPos);\r
+if (mappedPos == null) {\r
+System.err.println ("Can't align: no codon mapping to residue " + sourceDsPos + "(" + sourceChar + ")");\r
+return;\r
+}var mappedCodonStart = mappedPos[0];\r
+var mappedCodonEnd = mappedPos[mappedPos.length - 1];\r
+var trailingCopiedGap =  new StringBuilder ();\r
+var intronLength = 0;\r
+while (basesWritten < mappedCodonEnd && thisSeqPos < thisSeq.length) {\r
+var c = thisSeq[thisSeqPos++];\r
+if (c != myGapChar) {\r
+basesWritten++;\r
+if (basesWritten < mappedCodonStart) {\r
+if (preserveUnmappedGaps && trailingCopiedGap.length () > 0) {\r
+thisAligned.append (trailingCopiedGap.toString ());\r
+intronLength += trailingCopiedGap.length ();\r
+trailingCopiedGap =  new StringBuilder ();\r
+}intronLength++;\r
+inExon = false;\r
+} else {\r
+var startOfCodon = basesWritten == mappedCodonStart;\r
+var gapsToAdd = jalview.analysis.AlignmentUtils.calculateGapsToInsert (preserveMappedGaps, preserveUnmappedGaps, sourceGapMappedLength, inExon, trailingCopiedGap.length (), intronLength, startOfCodon);\r
+for (var i = 0; i < gapsToAdd; i++) {\r
+thisAligned.append (myGapChar);\r
+}\r
+sourceGapMappedLength = 0;\r
+inExon = true;\r
+}thisAligned.append (c);\r
+trailingCopiedGap =  new StringBuilder ();\r
+} else {\r
+if (inExon && preserveMappedGaps) {\r
+trailingCopiedGap.append (myGapChar);\r
+} else if (!inExon && preserveUnmappedGaps) {\r
+trailingCopiedGap.append (myGapChar);\r
+}}}\r
+}\r
+while (thisSeqPos < thisSeq.length) {\r
+var c = thisSeq[thisSeqPos++];\r
+if (c != myGapChar || preserveUnmappedGaps) {\r
+thisAligned.append (c);\r
+}}\r
+alignTo.setSequence ( String.instantialize (thisAligned));\r
+}, "jalview.datamodel.SequenceI,jalview.datamodel.SequenceI,jalview.datamodel.AlignedCodonFrame,~S,~S,~B,~B");\r
+c$.calculateGapsToInsert = Clazz.defineMethod (c$, "calculateGapsToInsert", \r
+function (preserveMappedGaps, preserveUnmappedGaps, sourceGapMappedLength, inExon, trailingGapLength, intronLength, startOfCodon) {\r
+var gapsToAdd = 0;\r
+if (startOfCodon) {\r
+if (inExon && !preserveMappedGaps) {\r
+trailingGapLength = 0;\r
+}if (!inExon && !(preserveMappedGaps && preserveUnmappedGaps)) {\r
+trailingGapLength = 0;\r
+}if (inExon) {\r
+gapsToAdd = Math.max (sourceGapMappedLength, trailingGapLength);\r
+} else {\r
+if (intronLength + trailingGapLength <= sourceGapMappedLength) {\r
+gapsToAdd = sourceGapMappedLength - intronLength;\r
+} else {\r
+gapsToAdd = Math.min (intronLength + trailingGapLength - sourceGapMappedLength, trailingGapLength);\r
+}}} else {\r
+if (!preserveMappedGaps) {\r
+trailingGapLength = 0;\r
+}gapsToAdd = Math.max (sourceGapMappedLength, trailingGapLength);\r
+}return gapsToAdd;\r
+}, "~B,~B,~N,~B,~N,~N,~B");\r
+c$.getAlignedTranslation = Clazz.defineMethod (c$, "getAlignedTranslation", \r
+function (sequences, gapCharacter, mappings) {\r
+var alignedSeqs =  new java.util.ArrayList ();\r
+for (var seq, $seq = sequences.iterator (); $seq.hasNext () && ((seq = $seq.next ()) || true);) {\r
+var mapped = jalview.analysis.AlignmentUtils.getAlignedTranslation (seq, gapCharacter, mappings);\r
+alignedSeqs.addAll (mapped);\r
+}\r
+return alignedSeqs;\r
+}, "java.util.List,~S,java.util.Set");\r
+c$.getAlignedTranslation = Clazz.defineMethod (c$, "getAlignedTranslation", \r
+function (seq, gapCharacter, mappings) {\r
+var result =  new java.util.ArrayList ();\r
+for (var mapping, $mapping = mappings.iterator (); $mapping.hasNext () && ((mapping = $mapping.next ()) || true);) {\r
+if (mapping.involvesSequence (seq)) {\r
+var mapped = jalview.analysis.AlignmentUtils.getAlignedTranslation (seq, gapCharacter, mapping);\r
+if (mapped != null) {\r
+result.add (mapped);\r
+}}}\r
+return result;\r
+}, "jalview.datamodel.SequenceI,~S,java.util.Set");\r
+c$.getAlignedTranslation = Clazz.defineMethod (c$, "getAlignedTranslation", \r
+function (seq, gapCharacter, mapping) {\r
+var gap = String.valueOf (gapCharacter);\r
+var toDna = false;\r
+var fromRatio = 1;\r
+var mapTo = mapping.getDnaForAaSeq (seq);\r
+if (mapTo != null) {\r
+toDna = true;\r
+gap = String.valueOf ( Clazz.newCharArray (-1, [gapCharacter, gapCharacter, gapCharacter]));\r
+} else {\r
+mapTo = mapping.getAaForDnaSeq (seq);\r
+fromRatio = 3;\r
+}var newseq =  new StringBuilder (seq.getLength () * (toDna ? 3 : 1));\r
+var residueNo = 0;\r
+var phrase =  Clazz.newIntArray (fromRatio, 0);\r
+var phraseOffset = 0;\r
+var gapWidth = 0;\r
+var first = true;\r
+var alignedSeq =  new jalview.datamodel.Sequence ("", "");\r
+for (var c, $c = 0, $$c = seq.getSequence (); $c < $$c.length && ((c = $$c[$c]) || true); $c++) {\r
+if (c == gapCharacter) {\r
+gapWidth++;\r
+if (gapWidth >= fromRatio) {\r
+newseq.append (gap);\r
+gapWidth = 0;\r
+}} else {\r
+phrase[phraseOffset++] = residueNo + 1;\r
+if (phraseOffset == fromRatio) {\r
+var sr =  new jalview.datamodel.SearchResults ();\r
+for (var pos, $pos = 0, $$pos = phrase; $pos < $$pos.length && ((pos = $$pos[$pos]) || true); $pos++) {\r
+mapping.markMappedRegion (seq, pos, sr);\r
+}\r
+newseq.append (sr.toString ());\r
+if (first) {\r
+first = false;\r
+var mappedTo = sr.getResultSequence (0);\r
+alignedSeq.setName (mappedTo.getName ());\r
+alignedSeq.setDescription (mappedTo.getDescription ());\r
+alignedSeq.setDatasetSequence (mappedTo);\r
+}phraseOffset = 0;\r
+}residueNo++;\r
+}}\r
+alignedSeq.setSequence (newseq.toString ());\r
+return alignedSeq;\r
+}, "jalview.datamodel.SequenceI,~S,jalview.datamodel.AlignedCodonFrame");\r
+c$.alignProteinAsDna = Clazz.defineMethod (c$, "alignProteinAsDna", \r
+function (protein, dna) {\r
+var mappings = protein.getCodonFrames ();\r
+var alignedCodons =  new java.util.TreeMap ( new jalview.analysis.CodonComparator ());\r
+for (var dnaSeq, $dnaSeq = dna.getSequences ().iterator (); $dnaSeq.hasNext () && ((dnaSeq = $dnaSeq.next ()) || true);) {\r
+for (var mapping, $mapping = mappings.iterator (); $mapping.hasNext () && ((mapping = $mapping.next ()) || true);) {\r
+var seqMap = mapping.getMappingForSequence (dnaSeq);\r
+var prot = mapping.findAlignedSequence (dnaSeq.getDatasetSequence (), protein);\r
+if (prot != null) {\r
+jalview.analysis.AlignmentUtils.addCodonPositions (dnaSeq, prot, protein.getGapCharacter (), seqMap, alignedCodons);\r
+}}\r
+}\r
+return jalview.analysis.AlignmentUtils.alignProteinAs (protein, alignedCodons);\r
+}, "jalview.datamodel.AlignmentI,jalview.datamodel.AlignmentI");\r
+c$.alignProteinAs = Clazz.defineMethod (c$, "alignProteinAs", \r
+function (protein, alignedCodons) {\r
+var alignedWidth = alignedCodons.size ();\r
+var gaps =  Clazz.newCharArray (alignedWidth, '\0');\r
+java.util.Arrays.fill (gaps, protein.getGapCharacter ());\r
+var allGaps = String.valueOf (gaps);\r
+for (var seq, $seq = protein.getSequences ().iterator (); $seq.hasNext () && ((seq = $seq.next ()) || true);) {\r
+seq.setSequence (allGaps);\r
+}\r
+var column = 0;\r
+for (var codon, $codon = alignedCodons.keySet ().iterator (); $codon.hasNext () && ((codon = $codon.next ()) || true);) {\r
+var columnResidues = alignedCodons.get (codon);\r
+for (var entry, $entry = columnResidues.entrySet ().iterator (); $entry.hasNext () && ((entry = $entry.next ()) || true);) {\r
+entry.getKey ().getSequence ()[column] = entry.getValue ().charAt (0);\r
+}\r
+column++;\r
+}\r
+return 0;\r
+}, "jalview.datamodel.AlignmentI,java.util.Map");\r
+c$.addCodonPositions = Clazz.defineMethod (c$, "addCodonPositions", \r
+function (dna, protein, gapChar, seqMap, alignedCodons) {\r
+var codons = seqMap.getCodonIterator (dna, gapChar);\r
+while (codons.hasNext ()) {\r
+var codon = codons.next ();\r
+var seqProduct = alignedCodons.get (codon);\r
+if (seqProduct == null) {\r
+seqProduct =  new java.util.HashMap ();\r
+alignedCodons.put (codon, seqProduct);\r
+}seqProduct.put (protein, codon.product);\r
+}\r
+}, "jalview.datamodel.SequenceI,jalview.datamodel.SequenceI,~S,jalview.datamodel.Mapping,java.util.Map");\r
+c$.isMappable = Clazz.defineMethod (c$, "isMappable", \r
+function (al1, al2) {\r
+if (al1.isNucleotide () == al2.isNucleotide ()) {\r
+return false;\r
+}var dna = al1.isNucleotide () ? al1 : al2;\r
+var protein = dna === al1 ? al2 : al1;\r
+var mappings = protein.getCodonFrames ();\r
+for (var dnaSeq, $dnaSeq = dna.getSequences ().iterator (); $dnaSeq.hasNext () && ((dnaSeq = $dnaSeq.next ()) || true);) {\r
+for (var proteinSeq, $proteinSeq = protein.getSequences ().iterator (); $proteinSeq.hasNext () && ((proteinSeq = $proteinSeq.next ()) || true);) {\r
+if (jalview.analysis.AlignmentUtils.isMappable (dnaSeq, proteinSeq, mappings)) {\r
+return true;\r
+}}\r
+}\r
+return false;\r
+}, "jalview.datamodel.AlignmentI,jalview.datamodel.AlignmentI");\r
+c$.isMappable = Clazz.defineMethod (c$, "isMappable", \r
+function (dnaSeq, proteinSeq, mappings) {\r
+var dnaDs = dnaSeq.getDatasetSequence () == null ? dnaSeq : dnaSeq.getDatasetSequence ();\r
+var proteinDs = proteinSeq.getDatasetSequence () == null ? proteinSeq : proteinSeq.getDatasetSequence ();\r
+for (var mapping, $mapping = mappings.iterator (); $mapping.hasNext () && ((mapping = $mapping.next ()) || true);) {\r
+if (proteinDs === mapping.getAaForDnaSeq (dnaDs)) {\r
+return true;\r
+}}\r
+return jalview.analysis.AlignmentUtils.mapProteinToCdna (proteinDs, dnaDs) != null;\r
+}, "jalview.datamodel.SequenceI,jalview.datamodel.SequenceI,java.util.Set");\r
+c$.findAddableReferenceAnnotations = Clazz.defineMethod (c$, "findAddableReferenceAnnotations", \r
+function (sequenceScope, labelForCalcId, candidates, al) {\r
+if (sequenceScope == null) {\r
+return;\r
+}for (var seq, $seq = sequenceScope.iterator (); $seq.hasNext () && ((seq = $seq.next ()) || true);) {\r
+var dataset = seq.getDatasetSequence ();\r
+if (dataset == null) {\r
+continue;\r
+}var datasetAnnotations = dataset.getAnnotation ();\r
+if (datasetAnnotations == null) {\r
+continue;\r
+}var result =  new java.util.ArrayList ();\r
+for (var dsann, $dsann = 0, $$dsann = datasetAnnotations; $dsann < $$dsann.length && ((dsann = $$dsann[$dsann]) || true); $dsann++) {\r
+var matchedAlignmentAnnotations = al.findAnnotations (seq, dsann.getCalcId (), dsann.label);\r
+if (!matchedAlignmentAnnotations.iterator ().hasNext ()) {\r
+result.add (dsann);\r
+if (labelForCalcId != null) {\r
+labelForCalcId.put (dsann.getCalcId (), dsann.label);\r
+}}}\r
+if (!result.isEmpty ()) {\r
+candidates.put (seq, result);\r
+}}\r
+}, "java.util.List,java.util.Map,java.util.Map,jalview.datamodel.AlignmentI");\r
+c$.addReferenceAnnotations = Clazz.defineMethod (c$, "addReferenceAnnotations", \r
+function (annotations, alignment, selectionGroup) {\r
+for (var seq, $seq = annotations.keySet ().iterator (); $seq.hasNext () && ((seq = $seq.next ()) || true);) {\r
+for (var ann, $ann = annotations.get (seq).iterator (); $ann.hasNext () && ((ann = $ann.next ()) || true);) {\r
+var copyAnn =  new jalview.datamodel.AlignmentAnnotation (ann);\r
+var startRes = 0;\r
+var endRes = ann.annotations.length;\r
+if (selectionGroup != null) {\r
+startRes = selectionGroup.getStartRes ();\r
+endRes = selectionGroup.getEndRes ();\r
+}copyAnn.restrict (startRes, endRes);\r
+if (!seq.hasAnnotation (ann)) {\r
+seq.addAlignmentAnnotation (copyAnn);\r
+}copyAnn.adjustForAlignment ();\r
+alignment.addAnnotation (copyAnn);\r
+copyAnn.visible = true;\r
+}\r
+}\r
+}, "java.util.Map,jalview.datamodel.AlignmentI,jalview.datamodel.SequenceGroup");\r
+c$.showOrHideSequenceAnnotations = Clazz.defineMethod (c$, "showOrHideSequenceAnnotations", \r
+function (al, types, forSequences, anyType, doShow) {\r
+for (var aa, $aa = 0, $$aa = al.getAlignmentAnnotation (); $aa < $$aa.length && ((aa = $$aa[$aa]) || true); $aa++) {\r
+if (anyType || types.contains (aa.label)) {\r
+if ((aa.sequenceRef != null) && (forSequences == null || forSequences.contains (aa.sequenceRef))) {\r
+aa.visible = doShow;\r
+}}}\r
+}, "jalview.datamodel.AlignmentI,java.util.Collection,java.util.List,~B,~B");\r
+c$.haveCrossRef = Clazz.defineMethod (c$, "haveCrossRef", \r
+function (seq1, seq2) {\r
+return jalview.analysis.AlignmentUtils.hasCrossRef (seq1, seq2) || jalview.analysis.AlignmentUtils.hasCrossRef (seq2, seq1);\r
+}, "jalview.datamodel.SequenceI,jalview.datamodel.SequenceI");\r
+c$.hasCrossRef = Clazz.defineMethod (c$, "hasCrossRef", \r
+function (seq1, seq2) {\r
+if (seq1 == null || seq2 == null) {\r
+return false;\r
+}var name = seq2.getName ();\r
+var xrefs = seq1.getDBRef ();\r
+if (xrefs != null) {\r
+for (var xref, $xref = 0, $$xref = xrefs; $xref < $$xref.length && ((xref = $$xref[$xref]) || true); $xref++) {\r
+var xrefName = xref.getSource () + "|" + xref.getAccessionId ();\r
+if (xrefName.equalsIgnoreCase (name)) {\r
+return true;\r
+}}\r
+}return false;\r
+}, "jalview.datamodel.SequenceI,jalview.datamodel.SequenceI");\r
+c$.makeExonAlignment = Clazz.defineMethod (c$, "makeExonAlignment", \r
+function (dna, mappings) {\r
+var newMappings =  new java.util.LinkedHashSet ();\r
+var exonSequences =  new java.util.ArrayList ();\r
+for (var dnaSeq, $dnaSeq = 0, $$dnaSeq = dna; $dnaSeq < $$dnaSeq.length && ((dnaSeq = $$dnaSeq[$dnaSeq]) || true); $dnaSeq++) {\r
+var ds = dnaSeq.getDatasetSequence ();\r
+var seqMappings = jalview.util.MappingUtils.findMappingsForSequence (ds, mappings);\r
+for (var acf, $acf = seqMappings.iterator (); $acf.hasNext () && ((acf = $acf.next ()) || true);) {\r
+var newMapping =  new jalview.datamodel.AlignedCodonFrame ();\r
+var mappedExons = jalview.analysis.AlignmentUtils.makeExonSequences (ds, acf, newMapping);\r
+if (!mappedExons.isEmpty ()) {\r
+exonSequences.addAll (mappedExons);\r
+newMappings.add (newMapping);\r
+}}\r
+}\r
+var al =  new jalview.datamodel.Alignment (exonSequences.toArray ( new Array (exonSequences.size ())));\r
+al.setDataset (null);\r
+mappings.clear ();\r
+mappings.addAll (newMappings);\r
+return al;\r
+}, "~A,java.util.Set");\r
+c$.makeExonSequences = Clazz.defineMethod (c$, "makeExonSequences", \r
+function (dnaSeq, mapping, newMapping) {\r
+var exonSequences =  new java.util.ArrayList ();\r
+var seqMappings = mapping.getMappingsForSequence (dnaSeq);\r
+var dna = dnaSeq.getSequence ();\r
+for (var seqMapping, $seqMapping = seqMappings.iterator (); $seqMapping.hasNext () && ((seqMapping = $seqMapping.next ()) || true);) {\r
+var newSequence =  new StringBuilder (dnaSeq.getLength ());\r
+var dnaExonRanges = seqMapping.getMap ().getFromRanges ();\r
+for (var range, $range = dnaExonRanges.iterator (); $range.hasNext () && ((range = $range.next ()) || true);) {\r
+for (var pos = range[0]; pos <= range[1]; pos++) {\r
+newSequence.append (dna[pos - 1]);\r
+}\r
+}\r
+var exon =  new jalview.datamodel.Sequence (dnaSeq.getName (), newSequence.toString ());\r
+var cdsAccId = jalview.datamodel.FeatureProperties.getCodingFeature (jalview.datamodel.DBRefSource.EMBL);\r
+var cdsRefs = jalview.util.DBRefUtils.selectRefs (seqMapping.getTo ().getDBRef (), jalview.datamodel.DBRefSource.CODINGDBS);\r
+if (cdsRefs != null) {\r
+for (var cdsRef, $cdsRef = 0, $$cdsRef = cdsRefs; $cdsRef < $$cdsRef.length && ((cdsRef = $$cdsRef[$cdsRef]) || true); $cdsRef++) {\r
+exon.addDBRef ( new jalview.datamodel.DBRefEntry (cdsRef));\r
+cdsAccId = cdsRef.getAccessionId ();\r
+}\r
+}exon.setName (exon.getName () + "|" + cdsAccId);\r
+exon.createDatasetSequence ();\r
+var exonRange =  new java.util.ArrayList ();\r
+exonRange.add ( Clazz.newIntArray (-1, [1, newSequence.length ()]));\r
+var map =  new jalview.util.MapList (exonRange, seqMapping.getMap ().getToRanges (), 3, 1);\r
+newMapping.addMap (exon.getDatasetSequence (), seqMapping.getTo (), map);\r
+var cdsToDnaMap =  new jalview.util.MapList (dnaExonRanges, exonRange, 1, 1);\r
+newMapping.addMap (dnaSeq, exon.getDatasetSequence (), cdsToDnaMap);\r
+exonSequences.add (exon);\r
+}\r
+return exonSequences;\r
+}, "jalview.datamodel.SequenceI,jalview.datamodel.AlignedCodonFrame,jalview.datamodel.AlignedCodonFrame");\r
+});\r