jpayne@68: package icecream; jpayne@68: jpayne@68: import stream.Read; jpayne@68: import structures.ByteBuilder; jpayne@68: jpayne@68: class ReadBuilder { jpayne@68: jpayne@68: public ReadBuilder(byte[] bases_, float passes_, int movieStart_, long zmw_) { jpayne@68: this(new ByteBuilder(bases_), passes_, movieStart_, zmw_); jpayne@68: } jpayne@68: jpayne@68: public ReadBuilder(ByteBuilder bases_, float passes_, int movieStart_, long zmw_) { jpayne@68: bases=bases_; jpayne@68: passes=passes_; jpayne@68: movieStart=movieStart_; jpayne@68: movieStop=movieStart+bases.length(); jpayne@68: zmw=zmw_; jpayne@68: jpayne@68: fullPasses=passes<1 ? 0 : 1; jpayne@68: } jpayne@68: jpayne@68: public static boolean isIceCream(String id){ jpayne@68: String[] terms=id.split("\t"); jpayne@68: int subreads=Integer.parseInt(terms[3].split("=")[1]); jpayne@68: return subreads>1; jpayne@68: } jpayne@68: jpayne@68: public static ReadBuilder parse(Read r) { jpayne@68: ByteBuilder bases=new ByteBuilder(r.bases); jpayne@68: String[] terms=r.id.split("\t"); jpayne@68: String[] name=terms[0].split("/"); jpayne@68: String[] position=name[2].split("_"); jpayne@68: jpayne@68: int movieStart=Integer.parseInt(position[0]); jpayne@68: int movieStop=Integer.parseInt(position[1]); jpayne@68: long zmw=Long.parseLong(name[1]); jpayne@68: jpayne@68: float passes=Float.parseFloat(terms[1].split("=")[1]); jpayne@68: int fullPasses=Integer.parseInt(terms[2].split("=")[1]); jpayne@68: int subreads=Integer.parseInt(terms[3].split("=")[1]); jpayne@68: int missing=Integer.parseInt(terms[4].split("=")[1]); jpayne@68: int adapters=Integer.parseInt(terms[5].split("=")[1]); jpayne@68: float errorRate=(terms.length<7 ? 0 : Float.parseFloat(terms[6].split("=")[1])); jpayne@68: jpayne@68: ReadBuilder rb=new ReadBuilder(bases, passes, movieStart, zmw); jpayne@68: rb.movieStop=movieStop; jpayne@68: rb.passes=passes; jpayne@68: rb.fullPasses=fullPasses; jpayne@68: rb.subreads=subreads; jpayne@68: rb.missing=missing; jpayne@68: rb.adapters=adapters; jpayne@68: rb.errorRate=errorRate; jpayne@68: return rb; jpayne@68: } jpayne@68: jpayne@68: @Override jpayne@68: public String toString(){ jpayne@68: return toHeader().toString(); jpayne@68: } jpayne@68: jpayne@68: public ByteBuilder toHeader(){ jpayne@68: ByteBuilder id=new ByteBuilder(200); jpayne@68: id.append("m1_2_3/"); jpayne@68: id.append(zmw).append('/').append(movieStart).append('_').append(movieStop); jpayne@68: id.tab().append("passes=").append(passes, 2); jpayne@68: id.tab().append("fullPasses=").append(fullPasses); jpayne@68: id.tab().append("subreads=").append(subreads); jpayne@68: id.tab().append("missing=").append(missing); jpayne@68: id.tab().append("adapters=").append(adapters); jpayne@68: id.tab().append("errorRate=").append(errorRate, 3); jpayne@68: return id; jpayne@68: } jpayne@68: jpayne@68: public int length() { jpayne@68: return bases.length(); jpayne@68: } jpayne@68: jpayne@68: void add(ReadBuilder rb){ jpayne@68: bases.append(rb.bases); jpayne@68: jpayne@68: movieStop+=rb.length(); jpayne@68: missing+=rb.missing; jpayne@68: adapters+=rb.adapters; jpayne@68: fullPasses+=rb.fullPasses; jpayne@68: subreads+=rb.subreads; jpayne@68: passes+=rb.passes; jpayne@68: } jpayne@68: jpayne@68: Read toRead() { jpayne@68: //Example: m54283_190403_183820/4194374/919_2614 jpayne@68: //Run ID is m54283_190403_183820 jpayne@68: //zmw ID is 4194374. jpayne@68: //Read start/stop coordinates are 919_2614 jpayne@68: jpayne@68: ByteBuilder id=toHeader(); jpayne@68: Read r=new Read(bases.toBytes(), null, id.toString(), 0); jpayne@68: return r; jpayne@68: } jpayne@68: jpayne@68: ByteBuilder bases; jpayne@68: jpayne@68: final long zmw; jpayne@68: final int movieStart; jpayne@68: int movieStop; jpayne@68: jpayne@68: float passes; jpayne@68: int fullPasses=0; jpayne@68: int subreads=1; jpayne@68: int missing=0; jpayne@68: int adapters=0; jpayne@68: float errorRate=0; jpayne@68: }