1 package var2; 2 3 import java.util.HashSet; 4 5 import fileIO.ReadWrite; 6 import shared.Parse; 7 import shared.Tools; 8 import stream.SamLine; 9 10 public class SamFilter { 11 parse(String arg, String a, String b)12 public boolean parse(String arg, String a, String b){ 13 14 if(a.equals("min") || a.equals("minpos")){ 15 minPos=Parse.parseIntKMG(b); 16 assert(minPos<=maxPos) : "minPos>maxPos"; 17 }else if(a.equals("max") || a.equals("maxpos")){ 18 maxPos=Parse.parseIntKMG(b); 19 assert(minPos<=maxPos) : "minPos>maxPos"; 20 }else if(a.equals("minreadmapq") || a.equals("minsammapq") || a.equals("minmapq")){ 21 minMapq=Parse.parseIntKMG(b); 22 }else if(a.equals("maxreadmapq") || a.equals("maxsammapq") || a.equals("maxmapq")){ 23 maxMapq=Parse.parseIntKMG(b); 24 }else if(a.equals("mapped")){ 25 includeMapped=Parse.parseBoolean(b); 26 }else if(a.equals("unmapped")){ 27 includeUnmapped=Parse.parseBoolean(b); 28 }else if(a.equals("secondary") || a.equals("nonprimary")){ 29 includeNonPrimary=Parse.parseBoolean(b); 30 }else if(a.equals("supplimentary")){ 31 includeSupplimentary=Parse.parseBoolean(b); 32 }else if(a.equals("duplicate") || a.equals("duplicates")){ 33 includeDuplicate=Parse.parseBoolean(b); 34 }else if(a.equals("qfail") || a.equals("samqfail")){ 35 includeQfail=Parse.parseBoolean(b); 36 }else if(a.equals("lengthzero")){ 37 includeLengthZero=Parse.parseBoolean(b); 38 }else if(a.equals("invert")){ 39 invert=Parse.parseBoolean(b); 40 }else if(a.equals("minid")){ 41 minId=Float.parseFloat(b); 42 if(minId>1f){minId/=100;} 43 assert(minId<=1f) : "minid should be between 0 and 1."; 44 }else if(a.equals("maxid")){ 45 maxId=Float.parseFloat(b); 46 if(maxId>1f){maxId/=100;} 47 assert(maxId<=1f) : "maxid should be between 0 and 1."; 48 }else if(a.equals("contigs")){ 49 addContig(b); 50 }else{ 51 return false; 52 } 53 return true; 54 } 55 56 /*--------------------------------------------------------------*/ 57 /*---------------- Filters ----------------*/ 58 /*--------------------------------------------------------------*/ 59 addContig(String s)60 void addContig(String s){ 61 if(s==null){return;} 62 if(s.indexOf(',')>=0){ 63 for(String s2 : s.split(",")){ 64 addContig(s2); 65 } 66 } 67 if(contigs==null){contigs=new HashSet<String>();} 68 contigs.add(s); 69 if(s.indexOf('_')>=0){addContig(s.replace('_', ' '));} 70 String[] split=s.split("\\s+"); 71 if(split.length>0 && !split[0].equals(s)){contigs.add(split[0]);} 72 } 73 passesFilter(SamLine sl)74 public boolean passesFilter(SamLine sl){ 75 if(sl==null){return false;} 76 return invert^matchesFilter(sl); 77 } 78 matchesFilter(SamLine sl)79 boolean matchesFilter(SamLine sl){ 80 if(sl==null){return false;} 81 if(!includeLengthZero && sl.length()<1){return false;} 82 83 if(!sl.mapped()){return includeUnmapped;} 84 else if(!includeMapped){return false;} 85 86 if(!includeNonPrimary && !sl.primary()){return false;} 87 if(!includeSupplimentary && sl.supplementary()){return false;} 88 if(!includeDuplicate && sl.duplicate()){return false;} 89 90 if(minPos>Integer.MIN_VALUE || maxPos<Integer.MAX_VALUE){ 91 final int start=sl.start(true, false); 92 final int stop=sl.stop(start, true, false); 93 if(!Tools.overlap(start, stop, minPos, maxPos)){return false;} 94 } 95 96 if(minMapq>Integer.MIN_VALUE || maxMapq<Integer.MAX_VALUE){ 97 if(sl.mapq>maxMapq || sl.mapq<minMapq){return false;} 98 } 99 100 if(sl.cigar!=null && (minId>0 || maxId<1)){ 101 float identity=sl.calcIdentity(); 102 if(identity<minId || identity>maxId){return false;} 103 } 104 105 if(contigs!=null){ 106 String rname=sl.rnameS(); 107 if(rname==null){return false;} 108 return contigs.contains(rname); 109 } 110 111 return true; 112 } 113 passesFilter(VCFLine vl)114 public boolean passesFilter(VCFLine vl){ 115 if(vl==null){return false;} 116 return invert^matchesFilter(vl); 117 } 118 matchesFilter(VCFLine vl)119 boolean matchesFilter(VCFLine vl){ 120 if(vl==null){return false;} 121 122 if(minPos>Integer.MIN_VALUE || maxPos<Integer.MAX_VALUE){ 123 final int start=vl.pos-1; 124 final int stop=start+(Tools.max(0, vl.reflen-1)); 125 if(!Tools.overlap(start, stop, minPos, maxPos)){return false;} 126 } 127 128 if(contigs!=null){ 129 String rname=vl.scaf; 130 if(rname==null){return false;} 131 return contigs.contains(rname); 132 } 133 134 return true; 135 } 136 passesFilter(Var v, ScafMap map)137 public boolean passesFilter(Var v, ScafMap map){ 138 if(v==null){return false;} 139 return invert^matchesFilter(v, map); 140 } 141 matchesFilter(Var v, ScafMap map)142 boolean matchesFilter(Var v, ScafMap map){ 143 if(v==null){return false;} 144 145 if(minPos>Integer.MIN_VALUE || maxPos<Integer.MAX_VALUE){ 146 final int start=v.start; 147 final int stop=v.stop; 148 if(!Tools.overlap(start, stop, minPos, maxPos)){return false;} 149 } 150 151 if(contigs!=null){ 152 String rname=map.getName(v.scafnum); 153 if(rname==null){return false;} 154 return contigs.contains(rname); 155 } 156 157 return true; 158 } 159 passesFilter(String name)160 public boolean passesFilter(String name){ 161 if(name==null){return false;} 162 return invert^matchesFilter(name); 163 } 164 matchesFilter(String name)165 boolean matchesFilter(String name){ 166 if(name==null){return false;} 167 if(contigs!=null){ 168 return contigs.contains(name); 169 } 170 return true; 171 } 172 clear()173 public void clear() { 174 minMapq=Integer.MIN_VALUE; 175 maxMapq=Integer.MAX_VALUE; 176 } 177 178 public int minPos=Integer.MIN_VALUE; 179 public int maxPos=Integer.MAX_VALUE; 180 public int minMapq=Integer.MIN_VALUE; 181 public int maxMapq=Integer.MAX_VALUE; 182 public float minId=Integer.MIN_VALUE; 183 public float maxId=Integer.MAX_VALUE; 184 public boolean includeUnmapped=true; 185 public boolean includeMapped=true; 186 public boolean includeSupplimentary=true; 187 public boolean includeQfail=false; 188 public boolean includeDuplicate=true; 189 public boolean includeNonPrimary=false; 190 public boolean includeLengthZero=false; 191 public HashSet<String> contigs=null; 192 public boolean invert=false; 193 setSamtoolsFilter()194 public void setSamtoolsFilter(){ 195 ReadWrite.SAMTOOLS_IGNORE_FLAG=0; 196 if(!includeUnmapped){ReadWrite.SAMTOOLS_IGNORE_FLAG|=ReadWrite.SAM_UNMAPPED;} 197 if(!includeNonPrimary){ReadWrite.SAMTOOLS_IGNORE_FLAG|=ReadWrite.SAM_SECONDARY;} 198 if(!includeSupplimentary){ReadWrite.SAMTOOLS_IGNORE_FLAG|=ReadWrite.SAM_SUPPLIMENTARY;} 199 if(!includeQfail){ReadWrite.SAMTOOLS_IGNORE_FLAG|=ReadWrite.SAM_QFAIL;} 200 if(!includeDuplicate){ReadWrite.SAMTOOLS_IGNORE_FLAG|=ReadWrite.SAM_QFAIL;} 201 } 202 203 /*--------------------------------------------------------------*/ 204 205 } 206