jpayne@68: package prok; jpayne@68: jpayne@68: import java.util.Arrays; jpayne@68: jpayne@68: import dna.AminoAcid; jpayne@68: import shared.KillSwitch; jpayne@68: import shared.Parse; jpayne@68: import shared.Tools; jpayne@68: import structures.ByteBuilder; jpayne@68: jpayne@68: /** jpayne@68: * Stores frame-relative kmer counts for a type of genomic feature, such as a coding start site. jpayne@68: * @author Brian Bushnell jpayne@68: * @date Sep 24, 2018 jpayne@68: */ jpayne@68: public class FrameStats { jpayne@68: jpayne@68: /*--------------------------------------------------------------*/ jpayne@68: /*---------------- Initialization ----------------*/ jpayne@68: /*--------------------------------------------------------------*/ jpayne@68: jpayne@68: public FrameStats(String name_, int k_, int frames_, int leftOffset_){ jpayne@68: name=name_; jpayne@68: k=k_; jpayne@68: mask=~((-1)<<(2*k)); jpayne@68: frames=frames_; jpayne@68: kMax=1<<(2*k); jpayne@68: invFrames=1.0f/frames; jpayne@68: leftOffset=leftOffset_; jpayne@68: jpayne@68: probs=new float[frames][kMax]; jpayne@68: countsTrue=new long[frames][kMax]; jpayne@68: countsFalse=new long[frames][kMax]; jpayne@68: counts=new long[][][] {countsFalse, countsTrue}; jpayne@68: } jpayne@68: jpayne@68: /*--------------------------------------------------------------*/ jpayne@68: /*---------------- Methods ----------------*/ jpayne@68: /*--------------------------------------------------------------*/ jpayne@68: jpayne@68: public void add(int kmer, int frame, int valid){ jpayne@68: counts[valid][frame][kmer]++; jpayne@68: validSums[valid]++; jpayne@68: } jpayne@68: jpayne@68: public boolean compatibleWith(FrameStats fs) { jpayne@68: return fs.name.equals(name) && fs.leftOffset==leftOffset && fs.k==k && fs.frames==frames; jpayne@68: } jpayne@68: jpayne@68: public void clear() { jpayne@68: Tools.fill(counts, 0); jpayne@68: Arrays.fill(validSums, 0); jpayne@68: } jpayne@68: jpayne@68: public void setFrom(FrameStats fs) { jpayne@68: assert(compatibleWith(fs)) : name+", "+frames+", "+fs.name+", "+fs.frames; jpayne@68: clear(); jpayne@68: add(fs); jpayne@68: } jpayne@68: jpayne@68: public void add(FrameStats fs){ jpayne@68: assert(fs.name.equals(name)); jpayne@68: assert(fs.leftOffset==leftOffset); jpayne@68: assert(fs.k==k); jpayne@68: assert(fs.frames==frames) : name+", "+frames+", "+fs.name+", "+fs.frames; jpayne@68: // for(int x=0; x=0) : counts[x][y][z]+", "+fs.counts[x][y][z]+", "+fs.name; jpayne@68: // assert(counts[x][y][z]>=0) : counts[x][y][z]+", "+fs.counts[x][y][z]; jpayne@68: // } jpayne@68: // } jpayne@68: // } jpayne@68: jpayne@68: Tools.add(counts, fs.counts); jpayne@68: Tools.add(validSums, fs.validSums); jpayne@68: // for(int x=0; x=0) : counts[x][y][z]+", "+fs.counts[x][y][z]; jpayne@68: // assert(counts[x][y][z]>=0) : counts[x][y][z]+", "+fs.counts[x][y][z]; jpayne@68: // } jpayne@68: // } jpayne@68: // } jpayne@68: // calculate(); jpayne@68: } jpayne@68: jpayne@68: public void multiplyBy(double mult) { jpayne@68: Tools.multiplyBy(counts, mult); jpayne@68: Tools.multiplyBy(validSums, mult); jpayne@68: } jpayne@68: jpayne@68: void calculate(){ jpayne@68: average=(float)((validSums[1]+1.0)/(validSums[0]+validSums[1]+1.0)); jpayne@68: invAvg=1.0f/average; jpayne@68: jpayne@68: for(int a=0; aa) : "Missing field 1: "+new String(line); jpayne@68: frame=Parse.parseInt(line, a, b); jpayne@68: b++; jpayne@68: a=b; jpayne@68: jpayne@68: assert(valid==0 || valid==1); jpayne@68: assert(frame>=0 && framea) : "Missing field 1: "+new String(line); jpayne@68: long count=Parse.parseLong(line, a, b); jpayne@68: b++; jpayne@68: a=b; jpayne@68: row[kmer]=count; jpayne@68: sum+=count; jpayne@68: } jpayne@68: validSums[valid]+=sum; jpayne@68: } catch (Exception e) { jpayne@68: System.err.println(new String(line)+"\n"+name); jpayne@68: assert(false) : e; jpayne@68: } jpayne@68: } jpayne@68: jpayne@68: @Override jpayne@68: public String toString(){ jpayne@68: return appendTo(new ByteBuilder()).toString(); jpayne@68: } jpayne@68: jpayne@68: public ByteBuilder appendTo(ByteBuilder bb){ jpayne@68: bb.append("#name\t").append(name).nl(); jpayne@68: bb.append("#k\t").append(k).nl(); jpayne@68: bb.append("#frames\t").append(frames).nl(); jpayne@68: bb.append("#offset\t").append(leftOffset).nl(); jpayne@68: bb.append("#valid\tframe"); jpayne@68: for(int i=0; i