/* * $Id: Pair.java,v 1.1 2005/05/25 19:56:30 ahmed Exp $ * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ package jaligner.formats; import jaligner.Alignment; import jaligner.util.Commons; /** * <a href="http://www.hgmp.mrc.ac.uk/Software/EMBOSS/Themes/AlignExamples/align.pair">Pair</a> format. * * @author Ahmed Moustafa (ahmed@users.sf.net) */ public class Pair extends Format { /** * Name width */ private static final int NAME_WIDTH = 13; /** * Position width */ private static final int POSITION_WIDTH = 6; /** * Sequence width */ private static final int SEQUENCE_WIDTH = 50; /** * Space */ private static final String BLANK = " "; /** * Constructor * */ public Pair( ) { super(); setId("Pair"); } /** * Formats an alignment object to the Pair_FORMAT format * @param alignment alignment object to be formated * @return string of the alignment pair-formatted */ public String format(Alignment alignment) { char[] sequence1 = alignment.getSequence1(); char[] sequence2 = alignment.getSequence2(); char[] markup = alignment.getMarkupLine(); int length = sequence1.length > sequence2.length ? sequence2.length : sequence1.length; String name1 = adjustName(alignment.getName1()); String name2 = adjustName(alignment.getName2()); StringBuffer buffer = new StringBuffer ( ); StringBuffer preMarkup = new StringBuffer ( ); for (int j = 0; j < NAME_WIDTH + 1 + POSITION_WIDTH + 1; j++) { preMarkup.append(BLANK); } int oldPosition1, position1 = 1 + alignment.getStart1(); int oldPosition2, position2 = 1 + alignment.getStart2(); char[] subsequence1; char[] subsequence2; char[] submarkup; int line; char c1, c2; for (int i = 0; i * SEQUENCE_WIDTH < length; i++) { oldPosition1 = position1; oldPosition2 = position2; line = ((i + 1) * SEQUENCE_WIDTH) < length ? (i + 1) * SEQUENCE_WIDTH: length; subsequence1 = new char[line - i * SEQUENCE_WIDTH]; subsequence2 = new char[line - i * SEQUENCE_WIDTH]; submarkup = new char[line - i * SEQUENCE_WIDTH]; for (int j = i * SEQUENCE_WIDTH, k = 0; j < line; j++, k++) { subsequence1[k] = sequence1[j]; subsequence2[k] = sequence2[j]; submarkup[k] = markup[j]; c1 = subsequence1[k]; c2 = subsequence2[k]; if (c1 == c2) { position1++; position2++; } else if (c1 == Alignment.GAP) { position2++; } else if (c2 == Alignment.GAP) { position1++; } else { position1++; position2++; } } buffer.append(name1); buffer.append(BLANK); buffer.append(adjustPosition(new Integer(oldPosition1).toString())); buffer.append(BLANK); buffer.append(subsequence1); buffer.append(BLANK); buffer.append(adjustPosition(new Integer(position1 - 1).toString())); buffer.append(Commons.getLineSeparator()); buffer.append(preMarkup); buffer.append(submarkup); buffer.append(Commons.getLineSeparator()); buffer.append(name2); buffer.append(BLANK); buffer.append(adjustPosition(new Integer(oldPosition2).toString())); buffer.append(BLANK); buffer.append(subsequence2); buffer.append(BLANK); buffer.append(adjustPosition(new Integer(position2 - 1).toString())); buffer.append(Commons.getLineSeparator()); buffer.append(Commons.getLineSeparator()); } return buffer.toString(); } /** * * @param name name to adjusted * @return adjusted name */ private String adjustName(String name) { StringBuffer buffer = new StringBuffer ( ); if (name.length() > NAME_WIDTH) { buffer.append(name.substring(0, NAME_WIDTH)); } else { buffer.append(name); for (int j = buffer.length(); j < NAME_WIDTH; j++) { buffer.append (BLANK); } } return buffer.toString(); } /** * * @param position * @return string */ private String adjustPosition(String position) { StringBuffer buffer1 = new StringBuffer( ); StringBuffer buffer2 = new StringBuffer( ); if (position.length() > POSITION_WIDTH) { buffer1.append(position.substring(position.length() - POSITION_WIDTH, position.length())); } else { buffer1.append(position); } for (int j = 0, n = POSITION_WIDTH - buffer1.length(); j < n; j++) { buffer2.append(BLANK); } buffer2.append(buffer1.toString()); return buffer2.toString(); } }