001 /*
002 * AlignmentBlock.java
003 *
004 * Copyright 2003 Sergio Anibal de Carvalho Junior
005 *
006 * This file is part of NeoBio.
007 *
008 * NeoBio is free software; you can redistribute it and/or modify it under the terms of
009 * the GNU General Public License as published by the Free Software Foundation; either
010 * version 2 of the License, or (at your option) any later version.
011 *
012 * NeoBio is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
013 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
014 * PURPOSE. See the GNU General Public License for more details.
015 *
016 * You should have received a copy of the GNU General Public License along with NeoBio;
017 * if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
018 * Boston, MA 02111-1307, USA.
019 *
020 * Proper attribution of the author as the source of the software would be appreciated.
021 *
022 * Sergio Anibal de Carvalho Junior mailto:sergioanibaljr@users.sourceforge.net
023 * Department of Computer Science http://www.dcs.kcl.ac.uk
024 * King's College London, UK http://www.kcl.ac.uk
025 *
026 * Please visit http://neobio.sourceforge.net
027 *
028 * This project was supervised by Professor Maxime Crochemore.
029 *
030 */
031
032 package neobio.alignment;
033
034 /**
035 * This class is used by the {@linkplain CrochemoreLandauZivUkelson} algorithm to store
036 * the information of an alignment block. All fields are public (but final) in order to
037 * simplify the access to the data.
038 *
039 * <P>For more information on how this class is used, please refer to the specification
040 * of the <CODE>CrochemoreLandauZivUkelson</CODE> class and it subclasses.</P>
041 *
042 * @author Sergio A. de Carvalho Jr.
043 * @see CrochemoreLandauZivUkelson
044 */
045 public class AlignmentBlock
046 {
047 /**
048 * A pointer to the factor of the first sequence being aligned.
049 */
050 public final Factor factor1;
051
052 /**
053 * A pointer to the factor of the second sequence being aligned.
054 */
055 public final Factor factor2;
056
057 /**
058 * The DIST column of this block.
059 */
060 public final int[] dist_column;
061
062 /**
063 * An array of pointers to prefix blocks of this block.
064 */
065 public final AlignmentBlock[] ancestor;
066
067 /**
068 * This block's output border.
069 */
070 public final int[] output_border;
071
072 /**
073 * An array of indexes to the source of the highest scoring path for each entry in
074 * the output border.
075 */
076 public final int[] source_path;
077
078 /**
079 * An array of directions that must be followed to reach the source of the highest
080 * scoring path for each entry in the output border.
081 *
082 * @see CrochemoreLandauZivUkelson#STOP_DIRECTION
083 * @see CrochemoreLandauZivUkelson#LEFT_DIRECTION
084 * @see CrochemoreLandauZivUkelson#DIAGONAL_DIRECTION
085 * @see CrochemoreLandauZivUkelson#TOP_DIRECTION
086 */
087 public final byte[] direction;
088
089 /**
090 * Creates a new root block. A root block does not have <CODE>source_path</CODE> and
091 * <CODE>ancestor</CODE> arrays. Moreover, its <CODE>dist_column</CODE> and
092 * <CODE>output_border</CODE> arrays are set to zero, and the <CODE>direction</CODE>
093 * array is set to contain an <CODE>STOP_DIRECTION</CODE>.
094 *
095 * @param factor1 factor of the first sequence being aligned
096 * @param factor2 factor of the second sequence being aligned
097 */
098 public AlignmentBlock (Factor factor1, Factor factor2)
099 {
100 this.factor1 = factor1;
101 this.factor2 = factor2;
102
103 dist_column = output_border = new int[] {0};
104 direction = new byte [] {0}; // STOP_DIRECTION
105 source_path = null;
106 ancestor = null;
107 }
108
109 /**
110 * Creates a new alignment block, with all arrays created with the specified size.
111 *
112 * @param factor1 factor of the first sequence being aligned
113 * @param factor2 factor of the second sequence being aligned
114 * @param size size of the arrays to be created
115 */
116 public AlignmentBlock (Factor factor1, Factor factor2, int size)
117 {
118 this.factor1 = factor1;
119 this.factor2 = factor2;
120
121 dist_column = new int[size];
122 output_border = new int[size];
123 direction = new byte[size];
124 source_path = new int[size];
125 ancestor = new AlignmentBlock[size];
126 }
127 }