1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
|
package hiseq;
import dna.AminoAcid;
import shared.Tools;
import stream.Read;
import structures.ByteBuilder;
public class MicroTile {
public MicroTile(){}
public MicroTile(int lane_, int tile_, int x1_, int x2_, int y1_, int y2_){
lane=lane_;
tile=tile_;
x1=x1_;
x2=x2_;
y1=y1_;
y2=y2_;
}
void process(){
if(tracker!=null){tracker.process();}
}
public boolean contains(int x, int y){
return x>=x1 && x<=x2 && y>=y1 && y<=y2;
}
@Override
public String toString(){
return lane+", "+tile+", "+x1+", "+x2+", "+y1+", "+y2;
}
public double averageQuality(){
return readCount==0 ? 0 : qualitySum/readCount;
}
public double percentErrorFree(){
return readCount==0 ? 0 : errorFreeSum/readCount;
}
public double hitPercent(){
long count=kmerCount();
return count==0 ? 0 : hits*100.0/count;
}
public double uniquePercent(){
long count=kmerCount();
return count==0 ? 0 : misses*100.0/count;
}
public double avgG(){
return tracker==null ? 0 : tracker.avg('G');
}
public double maxG(){
return tracker==null ? 0 : tracker.max('G');
}
public long kmerCount(){return hits+misses;}
public void add(MicroTile mt) {
hits+=mt.hits;
misses+=mt.misses;
readCount+=mt.readCount;
qualitySum+=mt.qualitySum;
errorFreeSum+=mt.errorFreeSum;
for(int i=0; i<acgtn.length; i++){
acgtn[i]+=mt.acgtn[i];
}
homoPolyGCount+=mt.homoPolyGCount;
homoPolyGSum+=mt.homoPolyGSum;
if(TRACK_CYCLES){
tracker.add(mt.tracker);
}
}
public void add(Read r){
if(r==null){return;}
final int len=r.length();
if(len<1){return;}
readCount++;
qualitySum+=r.avgQualityByProbabilityDouble(true, len);
errorFreeSum+=100*r.probabilityErrorFree(true, len);
final byte[] bases=r.bases;
int maxPolyG=0, currentPolyG=0;
for(int i=0; i<len; i++){
byte b=bases[i];
byte x=AminoAcid.baseToNumberACGTN[b];
acgtn[x]++;
if(b=='G'){
currentPolyG++;
maxPolyG=Tools.max(currentPolyG, maxPolyG);
}else{
currentPolyG=0;
}
}
homoPolyGCount+=(maxPolyG>=MIN_POLY_G ? 1 : 0);
homoPolyGSum+=maxPolyG;
if(TRACK_CYCLES){
tracker.add(r);
}
}
public void toText(ByteBuilder bb){
bb.append(lane).append('\t');
bb.append(tile).append('\t');
bb.append(x1).append('\t');
bb.append(x2).append('\t');
bb.append(y1).append('\t');
bb.append(y2).append('\t');
bb.append(readCount).append('\t');
bb.append(uniquePercent(), 3).append('\t');
bb.append(averageQuality(), 3).append('\t');
bb.append(percentErrorFree(), 3).append('\t');
bb.append(discard);
for(int i=0; i<5; i++){
bb.tab().append(acgtn[i]);
}
bb.tab().append(homoPolyGCount);
bb.tab().append(homoPolyGSum);
bb.nl();
}
public long hits;
public long misses;
public long readCount;
public double qualitySum;
public double errorFreeSum;
public int discard=0;
public int lane;
public int tile;
public int x1, x2;
public int y1, y2;
//TODO: These fields are not currently parsed.
public long[] acgtn=new long[5];
public long homoPolyGCount;
public long homoPolyGSum;
public final CycleTracker tracker=TRACK_CYCLES ? new CycleTracker() : null;
public static int MIN_POLY_G=25;
public static boolean TRACK_CYCLES=false;
}
|