jpayne@68: package prok; jpayne@68: jpayne@68: import dna.AminoAcid; jpayne@68: import shared.Shared; jpayne@68: import shared.Tools; jpayne@68: import structures.ByteBuilder; jpayne@68: jpayne@68: /** jpayne@68: * ORF means Open Reading Frame. jpayne@68: * It starts at the first base of a start codon and ends at the last base of a stop codon. jpayne@68: * The length is divisible by 3. jpayne@68: * @author Brian Bushnell jpayne@68: * @date Sep 20, 2018 jpayne@68: * jpayne@68: */ jpayne@68: public class Orf extends Feature { jpayne@68: jpayne@68: /*--------------------------------------------------------------*/ jpayne@68: /*---------------- Initialization ----------------*/ jpayne@68: /*--------------------------------------------------------------*/ jpayne@68: jpayne@68: /** jpayne@68: * Bases and coordinates are assumed to be the correct strand. jpayne@68: * Minus-strand ORFs can be flipped at the end of the constructor. jpayne@68: * @param scafName_ jpayne@68: * @param start_ jpayne@68: * @param stop_ jpayne@68: * @param strand_ jpayne@68: * @param frame_ jpayne@68: * @param bases jpayne@68: * @param flip jpayne@68: */ jpayne@68: public Orf(String scafName_, int start_, int stop_, int strand_, int frame_, byte[] bases, boolean flip, int type_) { jpayne@68: super(scafName_, start_, stop_, strand_, bases.length); jpayne@68: frame=frame_; jpayne@68: startCodon=getCodon(start, bases); jpayne@68: stopCodon=getCodon(stop-2, bases); jpayne@68: type=type_; jpayne@68: jpayne@68: if(flip && strand==Shared.MINUS){flip();} jpayne@68: } jpayne@68: jpayne@68: /*--------------------------------------------------------------*/ jpayne@68: /*---------------- Init Helpers ----------------*/ jpayne@68: /*--------------------------------------------------------------*/ jpayne@68: jpayne@68: /** jpayne@68: * Grab the codon starting at from. jpayne@68: * Assumes bases are in the correct strand jpayne@68: * @param from jpayne@68: * @param bases jpayne@68: * @return jpayne@68: */ jpayne@68: private static int getCodon(int from, byte[] bases){ jpayne@68: int codon=0; jpayne@68: for(int i=0; i<3; i++){ jpayne@68: // assert(i+from0){d=Math.sqrt(d);} jpayne@68: assert(d!=Double.NaN); jpayne@68: return (float)d; jpayne@68: } jpayne@68: jpayne@68: public float averageKmerScore(){ jpayne@68: return kmerScore/(length()-GeneModel.kInnerCDS-2); //This slightly affects score if kInnerCDS is changed jpayne@68: } jpayne@68: jpayne@68: /*--------------------------------------------------------------*/ jpayne@68: /*---------------- Public Methods ----------------*/ jpayne@68: /*--------------------------------------------------------------*/ jpayne@68: jpayne@68: public boolean isValidPrev(Orf prev, int maxOverlap){ jpayne@68: if(prev.stop>=stop || prev.stop>=start+maxOverlap || prev.start>=start){return false;} jpayne@68: if(prev.frame==frame && prev.strand==strand && prev.stop>=start){return false;} jpayne@68: return true; jpayne@68: } jpayne@68: jpayne@68: public float pathScore() {return Tools.max(pathScorePlus, pathScoreMinus);} jpayne@68: public float pathScore(int prevStrand) {return prevStrand==0 ? pathScorePlus : pathScoreMinus;} jpayne@68: jpayne@68: public Orf prev(){return pathScorePlus>=pathScoreMinus ? prevPlus : prevMinus;} jpayne@68: public Orf prev(int prevStrand){return prevStrand==0 ? prevPlus : prevMinus;} jpayne@68: jpayne@68: public int pathLength(int prevStrand){return prevStrand==0 ? pathLengthPlus : pathLengthMinus;} jpayne@68: public int pathLength(){return pathScorePlus>=pathScoreMinus ? pathLengthPlus : pathLengthMinus;} jpayne@68: jpayne@68: /*--------------------------------------------------------------*/ jpayne@68: /*---------------- ToString ----------------*/ jpayne@68: /*--------------------------------------------------------------*/ jpayne@68: jpayne@68: public String toStringFlipped(){ jpayne@68: if(strand==flipped()){ jpayne@68: return toString(); jpayne@68: } jpayne@68: flip(); jpayne@68: String s=toString(); jpayne@68: flip(); jpayne@68: return s; jpayne@68: } jpayne@68: jpayne@68: @Override jpayne@68: public String toString(){ jpayne@68: return toGff(); jpayne@68: } jpayne@68: jpayne@68: public String toGff(){ jpayne@68: ByteBuilder bb=new ByteBuilder(); jpayne@68: appendGff(bb); jpayne@68: return bb.toString(); jpayne@68: } jpayne@68: jpayne@68: public ByteBuilder appendGff(ByteBuilder bb){ jpayne@68: if(scafName==null){ jpayne@68: bb.append('.').tab(); jpayne@68: }else{ jpayne@68: for(int i=0, max=scafName.length(); i