X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fdatamodel%2Fxdb%2Fembl%2FEmblFeatureLocations.java;h=977400497f9fbd8367ebd7caf4bcaf10c86cdf35;hb=f8e603128476ca6e093ea2fc65435d1294978c53;hp=6a6997091a68a959ac9a2c1be74f4309f9bd8d8b;hpb=59d682209891099d46b960509907c79e3fb276fe;p=jalview.git diff --git a/src/jalview/datamodel/xdb/embl/EmblFeatureLocations.java b/src/jalview/datamodel/xdb/embl/EmblFeatureLocations.java index 6a69970..9774004 100644 --- a/src/jalview/datamodel/xdb/embl/EmblFeatureLocations.java +++ b/src/jalview/datamodel/xdb/embl/EmblFeatureLocations.java @@ -1,29 +1,41 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8) - * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, G Barton, M Clamp, S Searle + * 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. + * 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 . + * 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 java.util.Enumeration; -import java.util.Iterator; +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; + Vector locElements; String locationType; @@ -66,7 +78,7 @@ public class EmblFeatureLocations /** * @return the locElements */ - public Vector getLocElements() + public Vector getLocElements() { return locElements; } @@ -75,7 +87,7 @@ public class EmblFeatureLocations * @param locElements * the locElements to set */ - public void setLocElements(Vector locElements) + public void setLocElements(Vector locElements) { this.locElements = locElements; } @@ -94,74 +106,85 @@ public class EmblFeatureLocations } /** - * Return all location elements concerning given accession as start-end pairs - * TODO: pass back complement and 'less than or more than' range information - * TODO: deal with multiple accessions + * 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 null or int[] { start1, end1, ... } + * @return int[] { start1, end1, ... } */ - - public int[] getElementRanges(String accession) + int[] getElementRanges(String accession) { int sepos = 0; int[] se = new int[locElements.size() * 2]; - if (locationType.equalsIgnoreCase("single")) + if ("single".equalsIgnoreCase(locationType) + || "join".equalsIgnoreCase(locationType)) { - for (Enumeration le = locElements.elements(); le.hasMoreElements();) + for (EmblFeatureLocElement loce : locElements) { - EmblFeatureLocElement loce = (EmblFeatureLocElement) le - .nextElement(); if (accession == null || loce.accession != null && accession.equals(loce.accession)) { BasePosition bp[] = loce.getBasePositions(); if (bp.length == 2) { - se[sepos++] = Integer.parseInt(bp[0].getPos()); - se[sepos++] = Integer.parseInt(bp[1].getPos()); + 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 if (locationType.equalsIgnoreCase("join")) - { - for (Enumeration le = locElements.elements(); le.hasMoreElements();) - { - EmblFeatureLocElement loce = (EmblFeatureLocElement) le - .nextElement(); - if (accession == null || loce.accession != null - && accession.equals(loce.accession)) - { - BasePosition bp[] = loce.getBasePositions(); - if (bp.length == 2) + else { - se[sepos++] = Integer.parseInt(bp[0].getPos()); - se[sepos++] = Integer.parseInt(bp[1].getPos()); + System.err + .println("format error in EMBL CDS location, basePosition count = " + + bp.length); } } } - return se; } else if (locationType != null) { - if (jalview.bin.Cache.log != null) - jalview.bin.Cache.log - .error("EmbleFeatureLocations.getElementRanges cannot deal with locationType=='" + if (Cache.log != null) + { + Cache.log + .error("EmblFeatureLocations.getElementRanges cannot deal with locationType=='" + locationType + "'"); + } else + { System.err - .println("EmbleFeatureLocations.getElementRanges cannot deal with locationType=='" + .println("EmblFeatureLocations.getElementRanges cannot deal with locationType=='" + locationType + "'"); + } } - // trim range if necessary. - if (se != null && sepos != se.length) + + 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) { - int[] trimmed = new int[sepos]; - System.arraycopy(se, 0, trimmed, 0, sepos); - se = trimmed; + ArrayUtils.reverseIntArray(se); } return se; }