1 package stream; 2 3 4 import java.util.ArrayList; 5 import java.util.Arrays; 6 import java.util.Collections; 7 import java.util.Comparator; 8 import java.util.List; 9 10 import shared.Shared; 11 12 13 14 /** 15 * @author Brian Bushnell 16 * @date Jul 16, 2012 17 * 18 */ 19 public final class SiteScoreR implements Comparable<SiteScoreR>{ 20 SiteScoreR(SiteScore ss, int readlen_, long numericID_, byte pairnum_)21 public SiteScoreR(SiteScore ss, int readlen_, long numericID_, byte pairnum_){ 22 this(ss.chrom, ss.strand, ss.start, ss.stop, readlen_, numericID_, pairnum_, ss.score, ss.pairedScore, ss.perfect, ss.semiperfect); 23 } 24 SiteScoreR(int chrom_, byte strand_, int start_, int stop_, int readlen_, long numericID_, byte pairnum_, int score_, int pscore_, boolean perfect_, boolean semiperfect_)25 public SiteScoreR(int chrom_, byte strand_, int start_, int stop_, int readlen_, long numericID_, byte pairnum_, int score_, int pscore_, boolean perfect_, boolean semiperfect_){ 26 chrom=chrom_; 27 strand=strand_; 28 start=start_; 29 stop=stop_; 30 readlen=readlen_; 31 numericID=numericID_; 32 pairnum=pairnum_; 33 score=score_; 34 pairedScore=pscore_; 35 perfect=perfect_; 36 semiperfect=semiperfect_|perfect_; 37 assert(start_<=stop_) : this.toText(); 38 } 39 40 @Override compareTo(SiteScoreR other)41 public int compareTo(SiteScoreR other) { 42 int x=other.score-score; 43 if(x!=0){return x;} 44 45 x=other.pairedScore-pairedScore; 46 if(x!=0){return x;} 47 48 x=chrom-other.chrom; 49 if(x!=0){return x;} 50 51 x=strand-other.strand; 52 if(x!=0){return x;} 53 54 x=start-other.start; 55 return x; 56 } 57 58 @Override equals(Object other)59 public boolean equals(Object other){ 60 return compareTo((SiteScoreR)other)==0; 61 } 62 63 @Override hashCode()64 public int hashCode() { 65 assert(false) : "This class should not be hashed."; 66 return super.hashCode(); 67 } 68 equals(SiteScore other)69 public boolean equals(SiteScore other){ 70 if(other.start!=start){return false;} 71 if(other.stop!=stop){return false;} 72 if(other.chrom!=chrom){return false;} 73 if(other.strand!=strand){return false;} 74 return true; 75 } 76 equals(SiteScoreR other)77 public boolean equals(SiteScoreR other){ 78 return compareTo(other)==0; 79 } 80 81 @Override toString()82 public String toString(){ 83 // StringBuilder sb=new StringBuilder(); 84 // sb.append('\t'); 85 // sb.append(start); 86 // int spaces=10-sb.length(); 87 // for(int i=0; i<spaces; i++){ 88 // sb.append(" "); 89 // } 90 // sb.append('\t'); 91 // sb.append(quickScore); 92 // sb.append('\t'); 93 // sb.append(score); 94 // 95 // return "chr"+chrom+"\t"+Gene.strandCodes[strand]+sb; 96 return toText().toString(); 97 } 98 99 // 9+2+1+9+9+1+1+4+4+4+4+gaps toText()100 public StringBuilder toText(){ 101 StringBuilder sb=new StringBuilder(50); 102 if(correct){sb.append('*');} 103 sb.append(chrom); 104 sb.append(','); 105 sb.append(strand); 106 sb.append(','); 107 sb.append(start); 108 sb.append(','); 109 sb.append(stop); 110 sb.append(','); 111 sb.append(readlen); 112 sb.append(','); 113 sb.append(numericID); 114 sb.append(','); 115 sb.append(pairnum); 116 sb.append(','); 117 sb.append((semiperfect ? 1 : 0)); 118 sb.append((perfect ? 1 : 0)); 119 sb.append(','); 120 sb.append(pairedScore); 121 sb.append(','); 122 sb.append(score); 123 // sb.append(','); 124 // sb.append((long)normalizedScore); 125 return sb; 126 // chrom+","+strand+","+start+","+stop+","+(rescued ? 1 : 0)+","+ 127 // (perfect ? 1 : 0)+","+quickScore+","+slowScore+","+pairedScore+","+score; 128 } 129 overlaps(SiteScoreR ss)130 public final boolean overlaps(SiteScoreR ss){ 131 return chrom==ss.chrom && strand==ss.strand && overlap(start, stop, ss.start, ss.stop); 132 } overlap(int a1, int b1, int a2, int b2)133 private static boolean overlap(int a1, int b1, int a2, int b2){ 134 assert(a1<=b1 && a2<=b2) : a1+", "+b1+", "+a2+", "+b2; 135 return a2<=b1 && b2>=a1; 136 } 137 header()138 public static String header() { 139 return "chrom,strand,start,stop,readlen,numericID,pairnum,semiperfect+perfect,quickScore,slowScore,pairedScore,score"; 140 } 141 fromText(String s)142 public static SiteScoreR fromText(String s){ 143 // System.err.println("Trying to make a SS from "+s); 144 String line[]=s.split(","); 145 146 SiteScoreR ss; 147 148 assert(line.length==10 || line.length==11) : "\n"+line.length+"\n"+s+"\n"+Arrays.toString(line)+"\n"; 149 boolean correct=false; 150 if(line[0].charAt(0)=='*'){ 151 correct=true; 152 line[0]=line[0].substring(1); 153 } 154 int chrom=Byte.parseByte(line[0]); 155 byte strand=Byte.parseByte(line[1]); 156 int start=Integer.parseInt(line[2]); 157 int stop=Integer.parseInt(line[3]); 158 int readlen=Integer.parseInt(line[4]); 159 long numericID=Long.parseLong(line[5]); 160 byte pairnum=Byte.parseByte(line[6]); 161 int p=Integer.parseInt(line[7], 2); 162 boolean perfect=(p&1)==1; 163 boolean semiperfect=(p&2)==2; 164 int pairedScore=Integer.parseInt(line[8]); 165 int score=Integer.parseInt(line[9]); 166 ss=new SiteScoreR(chrom, strand, start, stop, readlen, numericID, pairnum, score, pairedScore, perfect, semiperfect); 167 ss.correct=correct; 168 169 return ss; 170 } 171 fromTextArray(String s)172 public static SiteScoreR[] fromTextArray(String s){ 173 String[] split=s.split("\t"); 174 SiteScoreR[] out=new SiteScoreR[split.length]; 175 for(int i=0; i<split.length; i++){out[i]=fromText(split[i]);} 176 return out; 177 } 178 positionalMatch(SiteScoreR b)179 public boolean positionalMatch(SiteScoreR b){ 180 // return chrom==b.chrom && strand==b.strand && start==b.start && stop==b.stop; 181 if(chrom!=b.chrom || strand!=b.strand || start!=b.start || stop!=b.stop){ 182 return false; 183 } 184 return true; 185 } 186 187 public static class PositionComparator implements Comparator<SiteScoreR>{ 188 PositionComparator()189 private PositionComparator(){} 190 191 @Override compare(SiteScoreR a, SiteScoreR b)192 public int compare(SiteScoreR a, SiteScoreR b) { 193 if(a.chrom!=b.chrom){return a.chrom-b.chrom;} 194 if(a.start!=b.start){return a.start-b.start;} 195 if(a.stop!=b.stop){return a.stop-b.stop;} 196 if(a.strand!=b.strand){return a.strand-b.strand;} 197 if(a.score!=b.score){return b.score-a.score;} 198 if(a.perfect!=b.perfect){return a.perfect ? -1 : 1;} 199 return 0; 200 } 201 sort(List<SiteScoreR> list)202 public void sort(List<SiteScoreR> list){ 203 if(list==null || list.size()<2){return;} 204 Collections.sort(list, this); 205 } 206 sort(SiteScoreR[] list)207 public void sort(SiteScoreR[] list){ 208 if(list==null || list.length<2){return;} 209 Arrays.sort(list, this); 210 } 211 212 } 213 214 public static class NormalizedComparator implements Comparator<SiteScoreR>{ 215 NormalizedComparator()216 private NormalizedComparator(){} 217 218 @Override compare(SiteScoreR a, SiteScoreR b)219 public int compare(SiteScoreR a, SiteScoreR b) { 220 if((int)a.normalizedScore!=(int)b.normalizedScore){return (int)b.normalizedScore-(int)a.normalizedScore;} 221 if(a.score!=b.score){return b.score-a.score;} 222 if(a.pairedScore!=b.pairedScore){return b.pairedScore-a.pairedScore;} 223 if(a.retainVotes!=b.retainVotes){return b.retainVotes-a.retainVotes;} 224 if(a.perfect!=b.perfect){return a.perfect ? -1 : 1;} 225 if(a.chrom!=b.chrom){return a.chrom-b.chrom;} 226 if(a.start!=b.start){return a.start-b.start;} 227 if(a.stop!=b.stop){return a.stop-b.stop;} 228 if(a.strand!=b.strand){return a.strand-b.strand;} 229 return 0; 230 } 231 sort(List<SiteScoreR> list)232 public void sort(List<SiteScoreR> list){ 233 if(list==null || list.size()<2){return;} 234 Collections.sort(list, this); 235 } 236 sort(SiteScoreR[] list)237 public void sort(SiteScoreR[] list){ 238 if(list==null || list.length<2){return;} 239 Arrays.sort(list, this); 240 } 241 242 } 243 244 public static class IDComparator implements Comparator<SiteScoreR>{ 245 IDComparator()246 private IDComparator(){} 247 248 @Override compare(SiteScoreR a, SiteScoreR b)249 public int compare(SiteScoreR a, SiteScoreR b) { 250 if(a.numericID!=b.numericID){return a.numericID>b.numericID ? 1 : -1;} 251 if(a.pairnum!=b.pairnum){return a.pairnum-b.pairnum;} 252 253 if(a.chrom!=b.chrom){return a.chrom-b.chrom;} 254 if(a.start!=b.start){return a.start-b.start;} 255 if(a.stop!=b.stop){return a.stop-b.stop;} 256 if(a.strand!=b.strand){return a.strand-b.strand;} 257 if(a.score!=b.score){return b.score-a.score;} 258 if(a.perfect!=b.perfect){return a.perfect ? -1 : 1;} 259 return 0; 260 } 261 sort(ArrayList<SiteScoreR> list)262 public void sort(ArrayList<SiteScoreR> list){ 263 if(list==null || list.size()<2){return;} 264 Shared.sort(list, this); 265 } 266 sort(SiteScoreR[] list)267 public void sort(SiteScoreR[] list){ 268 if(list==null || list.length<2){return;} 269 Arrays.sort(list, this); 270 } 271 272 } 273 274 public static final PositionComparator PCOMP=new PositionComparator(); 275 public static final NormalizedComparator NCOMP=new NormalizedComparator(); 276 public static final IDComparator IDCOMP=new IDComparator(); 277 reflen()278 public int reflen(){return stop-start+1;} 279 280 public int start; 281 public int stop; 282 public int readlen; 283 public int score; 284 public int pairedScore; 285 public final int chrom; 286 public final byte strand; 287 public boolean perfect; 288 public boolean semiperfect; 289 public final long numericID; 290 public final byte pairnum; 291 public float normalizedScore; 292 // public int weight=0; //Temp variable, for calculating normalized score 293 public boolean correct=false; 294 public int retainVotes=0; 295 296 } 297