/*
* 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;
}
}