/*\r
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.4)\r
- * Copyright (C) 2008 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7)\r
+ * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, G Barton, M Clamp, S Searle\r
* \r
- * This program is free software; you can redistribute it and/or\r
- * modify it under the terms of the GNU General Public License\r
- * as published by the Free Software Foundation; either version 2\r
- * of the License, or (at your option) any later version.\r
+ * This file is part of Jalview.\r
* \r
- * This program is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
- * GNU General Public License for more details.\r
+ * Jalview is free software: you can redistribute it and/or\r
+ * modify it under the terms of the GNU General Public License \r
+ * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\r
* \r
- * You should have received a copy of the GNU General Public License\r
- * along with this program; if not, write to the Free Software\r
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA\r
+ * Jalview is distributed in the hope that it will be useful, but \r
+ * WITHOUT ANY WARRANTY; without even the implied warranty \r
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR \r
+ * PURPOSE. See the GNU General Public License for more details.\r
+ * \r
+ * You should have received a copy of the GNU General Public License along with Jalview. If not, see <http://www.gnu.org/licenses/>.\r
*/\r
package jalview.datamodel;\r
\r
+import java.util.Vector;\r
+\r
public class CigarArray extends CigarBase\r
{\r
/**\r
* any of cigar are actually CigarArrays.\r
* \r
* @param cigar\r
- * Cigar[]\r
+ * Cigar[]\r
*/\r
public CigarArray(CigarSimple[] cigars)\r
{\r
}\r
\r
/**\r
+ * construct a cigar array from the current alignment, or just the subset of\r
+ * the current alignment specified by selectionGroup. Any columns marked as\r
+ * hidden in columnSelection will be marked as deleted in the array.\r
+ * \r
+ * @param alignment\r
+ * @param columnSelection\r
+ * @param selectionGroup\r
+ */\r
+ public CigarArray(AlignmentI alignment, ColumnSelection columnSelection,\r
+ SequenceGroup selectionGroup)\r
+ {\r
+ this(constructSeqCigarArray(alignment, selectionGroup));\r
+ constructFromAlignment(alignment,\r
+ columnSelection != null ? columnSelection.getHiddenColumns()\r
+ : null, selectionGroup);\r
+ }\r
+\r
+ private static int[] _calcStartEndBounds(AlignmentI alignment,\r
+ SequenceGroup selectionGroup)\r
+ {\r
+ int[] startend = new int[]\r
+ { 0, 0, 0 };\r
+ if (selectionGroup != null)\r
+ {\r
+ startend[0] = selectionGroup.getSize();\r
+ startend[1] = selectionGroup.getStartRes();\r
+ startend[2] = selectionGroup.getEndRes(); // inclusive for start and end\r
+ // in\r
+ // SeqCigar constructor\r
+ }\r
+ else\r
+ {\r
+ startend[0] = alignment.getHeight();\r
+ startend[2] = alignment.getWidth() - 1;\r
+ }\r
+ return startend;\r
+ }\r
+\r
+ public static SeqCigar[] constructSeqCigarArray(AlignmentI alignment,\r
+ SequenceGroup selectionGroup)\r
+ {\r
+ SequenceI[] seqs = null;\r
+ int i, iSize;\r
+ int _startend[] = _calcStartEndBounds(alignment, selectionGroup);\r
+ int start = _startend[1], end = _startend[2];\r
+ if (selectionGroup != null)\r
+ {\r
+ iSize = selectionGroup.getSize();\r
+ seqs = selectionGroup.getSequencesInOrder(alignment);\r
+ start = selectionGroup.getStartRes();\r
+ end = selectionGroup.getEndRes(); // inclusive for start and end in\r
+ // SeqCigar constructor\r
+ }\r
+ else\r
+ {\r
+ iSize = alignment.getHeight();\r
+ seqs = alignment.getSequencesArray();\r
+ end = alignment.getWidth() - 1;\r
+ }\r
+ SeqCigar[] selseqs = new SeqCigar[iSize];\r
+ for (i = 0; i < iSize; i++)\r
+ {\r
+ selseqs[i] = new SeqCigar(seqs[i], start, end);\r
+ }\r
+ return selseqs;\r
+ }\r
+\r
+ /**\r
+ * internal constructor function - called by CigarArray(AlignmentI, ...);\r
+ * \r
+ * @param alignment\r
+ * @param columnSelection\r
+ * - vector of visible regions as returned from\r
+ * columnSelection.getHiddenColumns()\r
+ * @param selectionGroup\r
+ */\r
+ private void constructFromAlignment(AlignmentI alignment,\r
+ Vector columnSelection, SequenceGroup selectionGroup)\r
+ {\r
+ int[] _startend = _calcStartEndBounds(alignment, selectionGroup);\r
+ int start = _startend[1], end = _startend[2];\r
+ // now construct the CigarArray operations\r
+ if (columnSelection != null)\r
+ {\r
+ int[] region;\r
+ int hideStart, hideEnd;\r
+ int last = start;\r
+ for (int j = 0; last < end & j < columnSelection.size(); j++)\r
+ {\r
+ region = (int[]) columnSelection.elementAt(j);\r
+ hideStart = region[0];\r
+ hideEnd = region[1];\r
+ // edit hidden regions to selection range\r
+ if (hideStart < last)\r
+ {\r
+ if (hideEnd > last)\r
+ {\r
+ hideStart = last;\r
+ }\r
+ else\r
+ {\r
+ continue;\r
+ }\r
+ }\r
+\r
+ if (hideStart > end)\r
+ {\r
+ break;\r
+ }\r
+\r
+ if (hideEnd > end)\r
+ {\r
+ hideEnd = end;\r
+ }\r
+\r
+ if (hideStart > hideEnd)\r
+ {\r
+ break;\r
+ }\r
+ /**\r
+ * form operations...\r
+ */\r
+ if (last < hideStart)\r
+ {\r
+ addOperation(CigarArray.M, hideStart - last);\r
+ }\r
+ addOperation(CigarArray.D, 1 + hideEnd - hideStart);\r
+ last = hideEnd + 1;\r
+ }\r
+ // Final match if necessary.\r
+ if (last < end)\r
+ {\r
+ addOperation(CigarArray.M, end - last + 1);\r
+ }\r
+ }\r
+ else\r
+ {\r
+ addOperation(CigarArray.M, end - start + 1);\r
+ }\r
+ }\r
+\r
+ /**\r
* @see Cigar.getSequenceAndDeletions\r
* @param GapChar\r
- * char\r
+ * char\r
* @return Object[][]\r
*/\r
protected Object[][] getArrayofSequenceAndDeletions(char GapChar)\r
* @return String formed by newline concatenated results of applying CIGAR\r
* operations to each reference object in turn.\r
* @param GapChar\r
- * char\r
+ * char\r
* @return '\n' separated strings (empty results included as \n\n)\r
*/\r
public String getSequenceString(char GapChar)\r
* return string results of applying cigar string to all reference cigars\r
* \r
* @param GapChar\r
- * char\r
+ * char\r
* @return String[]\r
*/\r
public String[] getSequenceStrings(char GapChar)\r
* \r
* @return Cigar[]\r
* \r
- * public CigarBase[] getEditedCigars() {\r
+ * public CigarBase[] getEditedCigars() {\r
* \r
- * return new CigarBase[] {}; }\r
+ * return new CigarBase[] {}; }\r
*/\r
/**\r
* applyDeletions edits underlying refCigars to propagate deleted regions, and\r
int delstart = cursor, delend = cursor + range[i] - 1; // inclusive\r
delpos.addElement(new int[]\r
{ vcursor + offset, range[i] }); // index of right hand column after\r
- // hidden region boundary\r
+ // hidden region boundary\r
offset += range[i] - 1; // shift in visible column coordinates\r
System.arraycopy(operation, i + 1, operation, i, length - i);\r
System.arraycopy(range, i + 1, range, i, length - i);\r