/* * Author: tdanford * Date: Jun 9, 2008 */ /** * */ package org.seqcode.gsebricks.verbs.assignment; import org.seqcode.genome.location.Region; import org.seqcode.genome.location.StrandedRegion; import org.seqcode.gsebricks.verbs.Mapper; /** * @author tdanford * */ public class StandardAssignmentPredicate<X extends Region> implements AssignmentPredicate<X> { private int upstream, downstream, nonstranded; public StandardAssignmentPredicate(int up, int down, int ns) { upstream = up; downstream = down; nonstranded = ns; } public Mapper assignmentZoneMapper() { return new StandardAssignmentZoneMapper(upstream, downstream, nonstranded); } private boolean contains(Region r, int pt) { return r.getStart() <= pt && r.getEnd() >= pt; } public boolean isValidAssignment(Region item, X event) { if(!item.getChrom().equals(event.getChrom())) { return false; } if(item instanceof StrandedRegion) { StrandedRegion sitem = (StrandedRegion)item; boolean strand = sitem.getStrand() == '+'; if(strand) { if(contains(event, sitem.getStart())) { return true; } if(event.getEnd() < item.getStart()) { int dist = item.getStart()-event.getEnd(); return dist <= upstream; } else { int dist = event.getStart()-item.getStart(); return dist <= downstream; } } else { if(contains(event, sitem.getEnd())) { return true; } if(event.getEnd() < item.getEnd()) { int dist = item.getEnd()-event.getEnd(); return dist <= downstream; } else { int dist = event.getStart()-item.getEnd(); return dist <= upstream; } } } else { int dist = item.distance(event); return dist <= nonstranded; } } }