/* * Jalview - A Sequence Alignment Editor and Viewer (Version 2.4) * Copyright (C) 2008 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle * * This program 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 2 * of the License, or (at your option) any later version. * * This program 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 this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ package jalview.datamodel; import java.util.Enumeration; import java.util.Vector; import jalview.util.MapList; /** * Stores mapping between the columns of a protein alignment and a DNA alignment * and a list of individual codon to amino acid mappings between sequences. */ public class AlignedCodonFrame { /** * array of nucleotide positions for aligned codons at column of aligned proteins. */ public int[][] codons = null; /** * width of protein sequence alignement * implicit assertion that codons.length >= aaWidth */ public int aaWidth=0; /** * initialise codon frame with a nominal alignment width * @param aWidth */ public AlignedCodonFrame(int aWidth) { if (aWidth<=0) { codons=null; return; } codons = new int[aWidth][]; for (int res = 0; res < aWidth; res++) codons[res] = null; } /** * ensure that codons array is at least as wide as aslen residues * @param aslen * @return (possibly newly expanded) codon array */ public int[][] checkCodonFrameWidth(int aslen) { if (codons.length <= aslen + 1) { // probably never have to do this ? int[][] c = new int[codons.length + 10][]; for (int i = 0; i < codons.length; i++) { c[i] = codons[i]; codons[i] = null; } codons = c; } return codons; } /** * @return width of aligned translated amino acid residues */ public int getaaWidth() { return aaWidth; } /** * TODO: not an ideal solution - we reference the aligned amino acid sequences in order to make insertions on them * Better would be dnaAlignment and aaAlignment reference.... */ Vector a_aaSeqs=new Vector(); /** * increase aaWidth by one and insert a new aligned codon position space at aspos. * @param aspos */ public void insertAAGap(int aspos, char gapCharacter) { // this aa appears before the aligned codons at aspos - so shift them in each pair of mapped sequences aaWidth++; if (a_aaSeqs!=null) { // we actually have to modify the aligned sequences here, so use the a_aaSeqs vector Enumeration sq = a_aaSeqs.elements(); while (sq.hasMoreElements()) { ((SequenceI) sq.nextElement()).insertCharAt(aspos, gapCharacter); } } checkCodonFrameWidth(aspos); if (aspos