com.hfg.bio.seq.alignment.AlignedSeq Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of com_hfg Show documentation
Show all versions of com_hfg Show documentation
com.hfg xml, html, svg, and bioinformatics utility library
package com.hfg.bio.seq.alignment;
import com.hfg.bio.HfgBioXML;
import com.hfg.bio.seq.BioSequence;
import com.hfg.bio.seq.SeqLocation;
import com.hfg.exception.ProgrammingException;
import com.hfg.util.StringUtil;
import com.hfg.xml.XMLNode;
import com.hfg.xml.XMLTag;
//------------------------------------------------------------------------------
/**
Base class for the aligned sequences that compose a pairwise sequence alignment.
@author J. Alex Taylor, hairyfatguy.com
*/
//------------------------------------------------------------------------------
// com.hfg XML/HTML Coding Library
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library 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
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// J. Alex Taylor, President, Founder, CEO, COO, CFO, OOPS hairyfatguy.com
// [email protected]
//------------------------------------------------------------------------------
public abstract class AlignedSeq implements Cloneable
{
private BioSequence mSeq;
private String mAlignedSeq;
private SeqLocation mLocation;
//###########################################################################
// CONSTRUCTORS
//###########################################################################
//---------------------------------------------------------------------------
public AlignedSeq(BioSequence inSeq, CharSequence inAlignedSeq, int inStart)
{
init(inSeq, inAlignedSeq, inStart);
}
//--------------------------------------------------------------------------
public AlignedSeq(XMLNode inXMLNode)
{
int start = Integer.parseInt(inXMLNode.getAttributeValue(HfgBioXML.START_ATT));
XMLNode seqTag = inXMLNode.getOptionalSubtagByName(HfgBioXML.QUERY);
if (null == seqTag)
{
seqTag = inXMLNode.getOptionalSubtagByName(HfgBioXML.SUBJECT);
}
BioSequence seq = (seqTag != null ? BioSequence.instantiate((XMLNode) seqTag.getSubtags().get(0)) : null);
init(seq, inXMLNode.getUnescapedContent(), start);
}
//---------------------------------------------------------------------------
private void init(BioSequence inSeq, CharSequence inAlignedSeq, int inStart)
{
mSeq = inSeq;
mAlignedSeq = inAlignedSeq.toString();
mLocation = new SeqLocation().setStart(inStart);
mLocation.setEnd(mAlignedSeq.length() - StringUtil.getCharCount(mAlignedSeq, '-') + mLocation.getStart() - 1);
}
//###########################################################################
// PUBLIC METHODS
//###########################################################################
//---------------------------------------------------------------------------
@Override
public String toString()
{
StringBuilder buffer = new StringBuilder();
if (mLocation != null)
{
buffer.append(mLocation);
}
return buffer.toString();
}
//--------------------------------------------------------------------------
public XMLNode toXMLNode()
{
XMLTag tag = new XMLTag(this instanceof AlignedQuery ? HfgBioXML.ALIGNED_QUERY : HfgBioXML.ALIGNED_SUBJECT);
tag.setAttribute(HfgBioXML.START_ATT, mLocation.getStart());
tag.setContent(mAlignedSeq);
if (mSeq != null)
{
XMLTag seqTag = new XMLTag(this instanceof AlignedQuery ? HfgBioXML.QUERY : HfgBioXML.SUBJECT);
seqTag.addSubtag(mSeq.toXMLNode());
tag.addSubtag(seqTag);
}
return tag;
}
//---------------------------------------------------------------------------
@Override
public AlignedSeq clone()
{
AlignedSeq cloneObj;
try
{
cloneObj = (AlignedSeq) super.clone();
}
catch (CloneNotSupportedException e)
{
throw new ProgrammingException(e);
}
if (mSeq != null)
{
cloneObj.mSeq = mSeq.clone();
}
if (mLocation != null)
{
cloneObj.mLocation = mLocation.clone();
}
return cloneObj;
}
//---------------------------------------------------------------------------
public BioSequence getSeq()
{
return mSeq;
}
//---------------------------------------------------------------------------
public AlignedSeq setAlignedSeq(CharSequence inValue)
{
mAlignedSeq = inValue.toString();
return this;
}
//---------------------------------------------------------------------------
public String getAlignedSeq()
{
return mAlignedSeq;
}
//---------------------------------------------------------------------------
public SeqLocation getSeqLocation()
{
return mLocation;
}
//---------------------------------------------------------------------------
public int getIndexedPosition(int inLinearPosition)
{
int indexedPosition = 0;
int linearPosition = 0;
int residueCount = 0;
int index = 0;
for (char residue : mAlignedSeq.toCharArray())
{
if (residue != '-')
{
residueCount++;
}
linearPosition = mLocation.getStart() + residueCount - 1 + (residue != '-' ? 0 : 1);
if (linearPosition == inLinearPosition)
{
indexedPosition = index;
break;
}
index++;
}
return indexedPosition;
}
//---------------------------------------------------------------------------
public int getLinearPosition(int inIndexedPosition)
{
int linearPosition = 0;
int residueCount = 0;
int index = 0;
for (char residue : mAlignedSeq.toCharArray())
{
if (residue != '-')
{
residueCount++;
}
if (index == inIndexedPosition)
{
linearPosition = mLocation.getStart() + residueCount - 1 + (residue != '-' ? 0 : 1);
break;
}
index++;
}
return linearPosition;
}
//---------------------------------------------------------------------------
public int getNTerminalGapLength()
{
int gapLength = 0;
for (int i = 0; i < mAlignedSeq.length(); i++)
{
if ('-' == mAlignedSeq.charAt(i))
{
gapLength++;
}
else
{
break;
}
}
return gapLength;
}
//---------------------------------------------------------------------------
public int getCTerminalGapLength()
{
int gapLength = 0;
for (int i = mAlignedSeq.length() - 1; i > 0; i--)
{
if ('-' == mAlignedSeq.charAt(i))
{
gapLength++;
}
else
{
break;
}
}
return gapLength;
}
}