/*
* BioJava development code
*
* This code may be freely distributed and modified under the
* terms of the GNU Lesser General Public Licence. This should
* be distributed with the code. If you do not have a copy,
* see:
*
* http://www.gnu.org/copyleft/lesser.html
*
* Copyright for this code is held jointly by the individual
* authors. These should be listed in @author doc comments.
*
* For more information on the BioJava project and its aims,
* or to join the biojava-l mailing list, visit the home page
* at:
*
* http://www.biojava.org/
*
* Created on 11.05.2004
*/
package org.biojava.bio.program.das.dasalignment;
import java.util.ArrayList;
import java.util.List;
import org.biojava.bio.Annotation;
import org.biojava.bio.AnnotationType;
import org.biojava.bio.CardinalityConstraint;
import org.biojava.bio.CollectionConstraint;
import org.biojava.bio.PropertyConstraint;
import org.biojava.bio.structure.Atom;
/**
* Alignment object to contain/manage a DAS alignment.
* see also DAS specification at http://www.sanger.ac.uk/xml/das/documentation/new_spec.html
*
* supports also structure alignments
* (optional shift vector and rotation matrix for objects)
*
* @author Andreas Prlic
* @since 1.4
*/
public class Alignment {
private List objects;
private List scores;
private List blocks;
private List vectors;
private List matrices ;
private static final AnnotationType objectType;
private static final AnnotationType scoreType;
private static final AnnotationType blockType;
private static final AnnotationType segmentType;
private static final AnnotationType vectorType;
private static final AnnotationType matrixType;
static {
objectType = getObjectAnnotationType() ;
scoreType = getScoreAnnotationType() ;
segmentType = getSegmentAnnotationType();
blockType = getBlockAnnotationType() ;
vectorType = getVectorAnnotationType() ;
matrixType = getMatrixAnnotationType() ;
}
/**
* Construct a new empty Alignment object.
*/
public Alignment() {
objects = new ArrayList() ;
scores = new ArrayList() ;
blocks = new ArrayList() ;
vectors = new ArrayList() ;
matrices = new ArrayList() ;
}
/** define the shift vector annotation type
* @return an AnnotationType object representing the shift vector for an object
*/
public static AnnotationType getVectorAnnotationType() {
AnnotationType annType ;
annType = new AnnotationType.Impl();
annType.setConstraints("intObjectId",
new PropertyConstraint.ByClass(String.class),
CardinalityConstraint.ONE ) ;
annType.setConstraints("vector",
new PropertyConstraint.ByClass(Atom.class),
CardinalityConstraint.ONE ) ;
return annType;
}
/** define the rotation matrix annotation type
* @return an AnnotationType object representing the rotation matrix for an object in a structure alignment.
*/
public static AnnotationType getMatrixAnnotationType() {
AnnotationType annType ;
annType = new AnnotationType.Impl();
annType.setConstraints("intObjectId",
new PropertyConstraint.ByClass(String.class),
CardinalityConstraint.ONE ) ;
for ( int x=1; x<=3; x++){
for ( int y=1; y<=3; y++){
String mat = "mat"+x+y;
//System.out.println(mat);
annType.setConstraints(mat,
new PropertyConstraint.ByClass(String.class),
CardinalityConstraint.ONE ) ;
}
}
return annType;
}
/** define the alignment Score Annotation Type.
*
* @return an AnnotationType object representing the score annotation type
*/
public static AnnotationType getScoreAnnotationType() {
AnnotationType annType ;
annType = new AnnotationType.Impl();
annType.setConstraints("methodName",
new PropertyConstraint.ByClass(String.class),
CardinalityConstraint.ONE ) ;
annType.setConstraints("value",
new PropertyConstraint.ByClass(String.class),
CardinalityConstraint.ONE ) ;
return annType ;
}
/** define the alignment Block Annotation Type.
*
*
* @return an AnnotationType object representing the block annotation type
*/
public static AnnotationType getBlockAnnotationType() {
AnnotationType annType ;
annType = new AnnotationType.Impl();
annType.setConstraints("blockOrder",
new PropertyConstraint.ByClass(String.class),
CardinalityConstraint.ONE ) ;
annType.setConstraints("blockScore",
new PropertyConstraint.ByClass(String.class),
CardinalityConstraint.ANY ) ;
PropertyConstraint prop = new PropertyConstraint.ByAnnotationType(segmentType) ;
annType.setConstraint("segments",
new CollectionConstraint.AllValuesIn(prop,CardinalityConstraint.ANY)) ;
return annType ;
}
/** define the alignment Segment Annotation Type.
*
*
* @return an AnnotationType object representing the segment annotation type
*/
public static AnnotationType getSegmentAnnotationType() {
AnnotationType annType ;
annType = new AnnotationType.Impl();
annType.setConstraints("intObjectId",
new PropertyConstraint.ByClass(String.class),
CardinalityConstraint.ONE ) ;
annType.setConstraints("start",
new PropertyConstraint.ByClass(String.class),
CardinalityConstraint.ANY ) ;
annType.setConstraints("end",
new PropertyConstraint.ByClass(String.class),
CardinalityConstraint.ANY) ;
annType.setConstraints("strand",
new PropertyConstraint.ByClass(String.class),
CardinalityConstraint.ANY ) ;
annType.setConstraints("cigar",
new PropertyConstraint.ByClass(String.class),
CardinalityConstraint.ANY ) ;
return annType ;
}
/** define the alignment object Annotation Type.
*
*
* @return an AnnotationType object representing the object annotation type
*/
public static AnnotationType getObjectAnnotationType() {
AnnotationType annType;
annType = new AnnotationType.Impl();
//annType.setDefaultConstraints(PropertyConstraint.ANY, CardinalityConstraint.ANY) ;
annType.setConstraints("dbAccessionId",
new PropertyConstraint.ByClass(String.class),
CardinalityConstraint.ONE );
annType.setConstraints("intObjectId",
new PropertyConstraint.ByClass(String.class),
CardinalityConstraint.ONE );
annType.setConstraints("objectVersion",
new PropertyConstraint.ByClass(String.class),
CardinalityConstraint.ONE );
// type is an enumeration ... Hm.
annType.setConstraints("type",
new PropertyConstraint.Enumeration(new Object[] {"DNA","PROTEIN","STRUCTURE"}),
CardinalityConstraint.ANY );
annType.setConstraints("dbSource",
new PropertyConstraint.ByClass(String.class),
CardinalityConstraint.ONE );
annType.setConstraints("dbVersion",
new PropertyConstraint.ByClass(String.class),
CardinalityConstraint.ONE );
// optional
annType.setConstraints("dbCoordSys",
new PropertyConstraint.ByClass(String.class),
CardinalityConstraint.ANY );
annType.setConstraints("sequence",
new PropertyConstraint.ByClass(String.class),
CardinalityConstraint.ANY );
annType.setConstraints("seqStart",
new PropertyConstraint.ByClass(String.class),
CardinalityConstraint.ANY );
annType.setConstraints("seqEnd",
new PropertyConstraint.ByClass(String.class),
CardinalityConstraint.ANY );
return annType ;
}
/** add Annotation of DAS alignment "vector" type.
*
@see #getVectorAnnotationType
*
* @param vector a vector
* @throws DASException ...
*/
public void addVector(Annotation vector)
throws DASException
{
if(vectorType.instanceOf(vector)) {
vectors.add(vector);
} else {
throw new
IllegalArgumentException(
"Expecting an annotation conforming to: " +
vectorType + " but got: " + vector
);
}
}
/** add Annotation of DAS alignment "matrix" type.
*
@see #getMatrixAnnotationType
*
* @param matrix a matrix
* @throws DASException ...
*/
public void addMatrix(Annotation matrix)
throws DASException
{
if(matrixType.instanceOf(matrix)) {
matrices.add(matrix);
} else {
throw new
IllegalArgumentException(
"Expecting an annotation conforming to: " +
matrixType + " but got: " + matrix
);
}
}
/** add Annotation of DAS alignment "object" type.
*
@see #getObjectAnnotationType
*
* @param object an Annotation object
* @throws DASException ...
*/
public void addObject(Annotation object)
throws DASException
{
// check if object is valid, throws DASException ...
//checkObjectHash(object);
if(objectType.instanceOf(object)) {
objects.add(object) ;
} else {
throw new
IllegalArgumentException(
"Expecting an annotation conforming to: " +
objectType + " but got: " + object
);
}
}
/**
* Returns the Annotation of all objects in this Alignment.
*
* @return an array of Annotation objects
*/
public Annotation[] getObjects(){
return (Annotation[]) objects.toArray(new Annotation[objects.size()]) ;
}
/**
* Returns the shift vectors.
*
* @return an array of shift vectors
*/
public Annotation[] getVectors(){
return (Annotation[]) vectors.toArray(new Annotation[vectors.size()]) ;
}
/**
* Returns the matrices.
*
* @return an array of the matrices
*/
public Annotation[] getMatrices(){
return (Annotation[]) matrices.toArray(new Annotation[matrices.size()]) ;
}
/** adds a "Score" Annotation.
* @see #getScoreAnnotationType
* @param score an Annotation object
*
* @throws DASException ...
*/
public void addScore(Annotation score)
throws DASException
{
//checkScoreHash(score) ;
if(scoreType.instanceOf(score)) {
scores.add(score) ;
} else {
throw new
IllegalArgumentException(
"Expecting an annotation conforming to: " +
scoreType + " but got: " + score
);
}
}
/** get all "Score" Annotations.
*
* @throws DASException ...
*
* @return an array of Annotation objects representing the scores value
*/
public Annotation[] getScores(){
return (Annotation[])scores.toArray(new Annotation[scores.size()]) ;
}
/** Add a "Block" Annotation.
* @see #getBlockAnnotationType
*
* @param block an Annotation object
* @throws DASException ...
*/
public void addBlock(Annotation block)
throws DASException
{
//checkBlockList(segment);
//blocks.add(segment);
if(blockType.instanceOf(block)) {
blocks.add(block) ;
} else {
throw new
IllegalArgumentException(
"Expecting an annotation conforming to: " +
blockType + " but got: " + block
);
}
}
/** get all Annotations of type "Block".
* @return an array of Annotation objects representing the Aligmnent blocks
*/
public Annotation[] getBlocks() {
return (Annotation[])blocks.toArray(new Annotation[blocks.size()]);
}
/** convert to String. */
public String toString() {
String str = "" ;
for ( int i=0;i