/*
* Genoogle: Similar DNA Sequences Searching Engine and Tools. (http://genoogle.pih.bio.br)
* Copyright (C) 2008,2009 Felipe Fernandes Albrecht (felipe.albrecht@gmail.com)
*
* For further information check the LICENSE file.
*/
package bio.pih.genoogle.search.results;
import java.util.Comparator;
import java.util.List;
import com.google.common.collect.Lists;
/**
* The class stores a Hit from a search.
*
* @author albrecht
*
*/
public class Hit {
private final String id;
private final String gi;
private final String accession;
private final String description;
private final int length;
private final String databankName;
List<HSP> hsps;
/**
* @param id
* @param gi
* @param description
* @param accession
* @param hitLength
* @param databankName
*/
public Hit(String id, String gi, String description, String accession, int hitLength, String databankName) {
this.id = id;
this.gi = gi;
this.accession = accession;
this.description = description;
this.length = hitLength;
this.databankName = databankName;
this.hsps = Lists.newLinkedList();
}
/**
* @return id of the sequence target.
*/
public String getId() {
return id;
}
/**
* @return gi of the sequence target.
*/
public String getGi() {
return gi;
}
/**
* @return description of the sequence target.
*/
public String getDescription() {
return description;
}
/**
* @return accession of the sequence target.
*/
public String getAccession() {
return accession;
}
/**
* @return length of the sequence target.
*/
public int getLength() {
return length;
}
/**
* @return {@link List} of HSP related with this Hit.
*/
public List<HSP> getHSPs() {
return this.hsps;
}
/**
* Add a new HSP to this Hit.
* @param hsp
*/
public void addHSP(HSP hsp) {
this.hsps.add(hsp);
}
/**
* Add a list of HSPs to this Hit.
* @param hsps : {@link List} of {@link HSP}.
*/
public void addAllHSP(List<HSP> hsps) {
this.hsps.addAll(hsps);
}
/**
* @return data bank name where the Hit happened.
*/
public String getDatabankName() {
return databankName;
}
private int totalScore = 0;
private int getTotalScore() {
if (totalScore == 0) {
for (HSP hsp: hsps) {
totalScore += hsp.getScore();
}
}
return totalScore;
}
private double biggestScore = Double.MIN_VALUE;
private double getBiggestScore() {
if (biggestScore == Double.MIN_VALUE) {
for (HSP hsp: hsps) {
if (hsp.getScore() > biggestScore) {
biggestScore = hsp.getScore();
}
}
}
return biggestScore;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(getId());
sb.append(" ");
sb.append(getDescription());
sb.append(" ");
sb.append(getDatabankName());
return sb.toString();
}
/**
* Verify if the other Hit object is from the same Gi.
*/
@Override
public boolean equals(Object obj) {
if (super.equals(obj) == true) {
return true;
}
if (!(obj instanceof Hit)) {
return false;
}
Hit other = (Hit) obj;
return other.gi.equals(gi);
}
@Override
public int hashCode() {
int hashCode = id.hashCode();
hashCode *= gi.hashCode();
hashCode *= accession.hashCode();
hashCode *= description.hashCode();
hashCode *= length;
hashCode *= databankName.hashCode();
hashCode *= hsps.hashCode();
return hashCode;
}
/**
* Comparator of two hits by them total score.
*/
public static final Comparator<Hit> COMPARATOR = new Comparator<Hit>() {
@Override
public int compare(Hit o1, Hit o2) {
int compare = Double.compare(o2.getBiggestScore(), o1.getBiggestScore());
if (compare != 0) {
return compare;
}
return o2.getTotalScore() - o1.getTotalScore();
}
};
}