/* * 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/ * */ package org.biojava.bio.search; import org.biojava.bio.Annotatable; import org.biojava.bio.Annotation; import org.biojava.bio.seq.StrandedFeature.Strand; import org.biojava.bio.symbol.Alignment; import org.biojava.utils.AbstractChangeable; import org.biojava.utils.ChangeForwarder; import org.biojava.utils.ChangeListener; import org.biojava.utils.ChangeSupport; import org.biojava.utils.ChangeType; import org.biojava.utils.ObjectUtil; /** *
SequenceDBSearchSubHit
objects represent sub-hits
* which make up a hit. In the case of Blast these correspond to
* HSPs.
SequenceDBSearchSubHit
object.
*
* @param queryStart an int
value indicating the
* start coordinate of the hit on the query sequence.
* @param queryEnd an int
value indicating the end
* coordinate of the hit on the query sequence.
* @param queryStrand a Strand
object indicating the
* strand of the hit with respect to the query sequence, which may
* be null for protein similarities.
* @param subjectStart an int
value indicating the
* start coordinate of the hit on the subject sequence.
* @param subjectEnd an int
value indicating the end
* coordinate of the hit on the query sequence.
* @param subjectStrand a Strand
object indicating
* the strand of the hit with respect to the query sequence, which
* may be null for protein similarities.
* @param score a double
value; the score of the
* subhit, which may not be NaN.
* @param eValue a double
the E-value of the
* subhit, which may be NaN.
* @param pValue a double
value; the P-value of the
* hit, which may be NaN.
* @param alignment an Alignment
object containing
* the alignment described by the subhit region, which may not be
* null.
* @param annotation an Annotation
object, which may
* not be null.
*/
public SequenceDBSearchSubHit(double score,
double eValue,
double pValue,
int queryStart,
int queryEnd,
Strand queryStrand,
int subjectStart,
int subjectEnd,
Strand subjectStrand,
Alignment alignment,
Annotation annotation)
{
if (Double.isNaN(score))
{
throw new IllegalArgumentException("score was NaN");
}
// pValue may be NaN
// eValue may be NaN
if (alignment == null)
{
throw new IllegalArgumentException("alignment was null");
}
if (annotation == null)
{
throw new IllegalArgumentException("annotation was null");
}
this.score = score;
this.eValue = eValue;
this.pValue = pValue;
this.queryStart = queryStart;
this.queryEnd = queryEnd;
this.queryStrand = queryStrand;
this.subjectStart = subjectStart;
this.subjectEnd = subjectEnd;
this.subjectStrand = subjectStrand;
this.alignment = alignment;
this.annotation = annotation;
// Lock alignment by vetoing all changes
this.alignment.addChangeListener(ChangeListener.ALWAYS_VETO);
// Lock the annotation by vetoing all changes to properties
annotation.addChangeListener(ChangeListener.ALWAYS_VETO);
hcCalc = false;
}
public double getScore()
{
return score;
}
public double getPValue()
{
return pValue;
}
public double getEValue()
{
return eValue;
}
public int getQueryStart()
{
return queryStart;
}
public int getQueryEnd()
{
return queryEnd;
}
public Strand getQueryStrand()
{
return queryStrand;
}
public int getSubjectStart()
{
return subjectStart;
}
public int getSubjectEnd()
{
return subjectEnd;
}
public Strand getSubjectStrand()
{
return subjectStrand;
}
public Alignment getAlignment()
{
return alignment;
}
public Annotation getAnnotation()
{
return annotation;
}
public boolean equals(Object other)
{
if (other == this) return true;
if (other == null) return false;
if (! other.getClass().equals(this.getClass())) return false;
SequenceDBSearchSubHit that = (SequenceDBSearchSubHit) other;
if (! ObjectUtil.equals(this.score, that.score))
return false;
if (! ObjectUtil.equals(this.pValue, that.pValue))
return false;
if (! ObjectUtil.equals(this.eValue, that.eValue))
return false;
if (! ObjectUtil.equals(this.queryStart, that.queryStart))
return false;
if (! ObjectUtil.equals(this.queryEnd, that.queryEnd))
return false;
if (! ObjectUtil.equals(this.queryStrand, that.queryStrand))
return false;
if (! ObjectUtil.equals(this.subjectStart, that.subjectStart))
return false;
if (! ObjectUtil.equals(this.subjectEnd, that.subjectEnd))
return false;
if (! ObjectUtil.equals(this.subjectStrand, that.subjectStrand))
return false;
if (! ObjectUtil.equals(this.annotation, that.annotation))
return false;
return true;
}
public int hashCode()
{
if (! hcCalc)
{
hc = ObjectUtil.hashCode(hc, score);
hc = ObjectUtil.hashCode(hc, pValue);
hc = ObjectUtil.hashCode(hc, eValue);
hc = ObjectUtil.hashCode(hc, queryStart);
hc = ObjectUtil.hashCode(hc, queryEnd);
hc = ObjectUtil.hashCode(hc, queryStrand);
hc = ObjectUtil.hashCode(hc, subjectStart);
hc = ObjectUtil.hashCode(hc, subjectEnd);
hc = ObjectUtil.hashCode(hc, subjectStrand);
hc = ObjectUtil.hashCode(hc, annotation);
hcCalc = true;
}
return hc;
}
public String toString()
{
return "SequenceDBSearchSubHit with score " + getScore();
}
protected ChangeSupport getChangeSupport(ChangeType ct)
{
ChangeSupport cs = super.getChangeSupport(ct);
if (annotationForwarder == null &&
(ct.isMatchingType(Annotatable.ANNOTATION) || Annotatable.ANNOTATION.isMatchingType(ct)))
{
annotationForwarder =
new ChangeForwarder.Retyper(this, cs, Annotation.PROPERTY);
getAnnotation().addChangeListener(annotationForwarder,
Annotatable.ANNOTATION);
}
return cs;
}
}