/* * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) * Copyright (C) $$Year-Rel$$ The Jalview Authors * * This file is part of Jalview. * * Jalview 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 3 * of the License, or (at your option) any later version. * * Jalview 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 Jalview. If not, see . * The Jalview Authors are detailed in the 'AUTHORS' file. */ package jalview.datamodel.xdb.embl; import jalview.bin.Cache; import jalview.util.ArrayUtils; import java.util.Arrays; import java.util.Vector; /** * Data model for a <location> child element of a <feature> read * from an EMBL query reply * * @see embl_mapping.xml * @see http://www.insdc.org/files/feature_table.html#3.4.2 */ public class EmblFeatureLocations { Vector locElements; String locationType; boolean locationComplement; /** * @return the locationComplement */ public boolean isLocationComplement() { return locationComplement; } /** * @param locationComplement * the locationComplement to set */ public void setLocationComplement(boolean locationComplement) { this.locationComplement = locationComplement; } /** * @return the locationType */ public String getLocationType() { return locationType; } /** * @param locationType * the locationType to set */ public void setLocationType(String locationType) { this.locationType = locationType; } /** * @return the locElements */ public Vector getLocElements() { return locElements; } /** * @param locElements * the locElements to set */ public void setLocElements(Vector locElements) { this.locElements = locElements; } /** * Return all location elements as start-end pairs (without accessions) TODO: * pass back complement and 'less than or more than' range information Note: * do not use this since it throws away any accessionIds associated with each * location! * * @return int[] { start1, end1, ... } */ public int[] getElementRanges() { return getElementRanges(null); } /** * Return all location elements concerning given accession as start-end pairs. * If the CDS feature is on the forward strand, then start <= end, if on the * reverse strand then start > end. * * @param accession * the accession string for which locations are requested, or null * for all locations * @return int[] { start1, end1, ... } */ int[] getElementRanges(String accession) { int sepos = 0; int[] se = new int[locElements.size() * 2]; if ("single".equalsIgnoreCase(locationType) || "join".equalsIgnoreCase(locationType)) { for (EmblFeatureLocElement loce : locElements) { if (accession == null || loce.accession != null && accession.equals(loce.accession)) { BasePosition bp[] = loce.getBasePositions(); if (bp.length == 2) { try { int start = Integer.parseInt(bp[0].getPos()); int end = Integer.parseInt(bp[1].getPos()); se[sepos++] = start; se[sepos++] = end; } catch (NumberFormatException e) { System.err .println("format error in EMBL CDS location basePosition: " + e.getMessage()); } } else { System.err .println("format error in EMBL CDS location, basePosition count = " + bp.length); } } } } else if (locationType != null) { if (Cache.log != null) { Cache.log .error("EmblFeatureLocations.getElementRanges cannot deal with locationType=='" + locationType + "'"); } else { System.err .println("EmblFeatureLocations.getElementRanges cannot deal with locationType=='" + locationType + "'"); } } if (sepos != se.length) { /* * we failed to parse something - trim off null values */ se = Arrays.copyOf(se, sepos); } /* * If on the complement, reverse the ranges to [end, start, ...end1, start1]. * For an example of a joined complement, see (tRNA feature) CAGL0B00165r on * http://www.ebi.ac.uk/ena/data/view/CR380948&display=xml * http://www.ebi.ac.uk/Tools/dbfetch/dbfetch/embl/CR380948/emblxml */ if (locationComplement) { ArrayUtils.reverseIntArray(se); } return se; } }