private Pair<Region, Region> findProbePair( String primerName, Map<String, Set<Region>> primerHits) { String leftName = String.format("%s_left", primerName); String rightName = String.format("%s_right", primerName); if (!primerHits.containsKey(leftName) || !primerHits.containsKey(rightName)) { return null; } if (primerHits.get(leftName).size() != 1 || primerHits.get(rightName).size() != 1) { return null; } Iterator<Region> leftitr = primerHits.get(leftName).iterator(); Iterator<Region> rightitr = primerHits.get(rightName).iterator(); Region left = leftitr.next(); Region right = rightitr.next(); if (!left.getChrom().equals(right.getChrom())) { return null; } return new Pair<Region, Region>(left, right); }
public Collection<NamedRegion> parseProbes() throws IOException { double ethreshold = 1.0e-3; Parser<BlastTabEntry> parser = new Parser<BlastTabEntry>(blasttab, new BlastTabEntry.ParsingMapper()); Iterator<BlastTabEntry> itr = new FilterIterator<BlastTabEntry, BlastTabEntry>( new BlastTabEntry.ExpectedScoreFilter(ethreshold), parser); Map<String, Set<Region>> primerHits = new TreeMap<String, Set<Region>>(); Set<String> primerNames = new TreeSet<String>(); while (itr.hasNext()) { BlastTabEntry entry = itr.next(); NamedRegion r = createNamedRegion(entry); if (!primerHits.containsKey(entry.getQuery())) { primerHits.put(entry.getQuery(), new HashSet<Region>()); } primerHits.get(entry.getQuery()).add(r); primerNames.add(removePrimerLR(entry.getQuery())); } LinkedList<NamedRegion> probes = new LinkedList<NamedRegion>(); for (String primerName : primerNames) { Pair<Region, Region> hits = findProbePair(primerName, primerHits); if (hits != null) { Region left = hits.getFirst(), right = hits.getLast(); int start = Math.min(left.getStart(), right.getStart()); int end = Math.max(left.getEnd(), right.getEnd()); NamedRegion probe = new NamedRegion(genome, left.getChrom(), start, end, primerName); probes.addLast(probe); } } return probes; }