package org.seqcode.genome.location; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import org.seqcode.data.io.parsing.TranscriptFileExpander; import org.seqcode.genome.Genome; import org.seqcode.gsebricks.verbs.Expander; import org.seqcode.gsebricks.verbs.location.NamedGeneratorFactory; import org.seqcode.gsebricks.verbs.location.NamedStrandedGeneratorFactory; import org.seqcode.gsebricks.verbs.location.NamedTypedGeneratorFactory; import org.seqcode.gsebricks.verbs.location.RefGeneGeneratorFactory; import org.seqcode.gsebricks.verbs.location.RepeatMaskedGenerator; public class AnnotationLoader { protected Expander<Region, ? extends Region> annotExpander; protected String sourceName; protected int maxAnnotDist=50000; protected boolean overlapOnly=false; public AnnotationLoader(Genome gen, String name, String type, int maxAnnotDist, boolean overlapOnly){ sourceName = name; this.maxAnnotDist=maxAnnotDist; this.overlapOnly=overlapOnly; if(type.equals("refGene")){ annotExpander = (new RefGeneGeneratorFactory()).getExpander(gen); }else if(type.equals("namedRegion")){ annotExpander = (new NamedGeneratorFactory(sourceName)).getExpander(gen); }else if (type.equals("namedStrandedRegions")){ annotExpander = (new NamedStrandedGeneratorFactory(sourceName)).getExpander(gen); }else if (type.equals("namedTypedRegions")){ annotExpander = (new NamedTypedGeneratorFactory(sourceName)).getExpander(gen); }else if (type.equals("repeatMasker")){ annotExpander = new RepeatMaskedGenerator(gen); }else if (type.equals("file")){ annotExpander = new TranscriptFileExpander(gen, name); } } public Collection<Region> getAnnotations(Region coords){ ArrayList<Region> results = new ArrayList<Region>(); Region query; if (overlapOnly) { query = coords; } else { query = coords.expand(maxAnnotDist, maxAnnotDist); } Iterator<? extends Region> iter = annotExpander.execute(query); while (iter.hasNext()) { results.add(iter.next()); } return(results); } /** Return genes if the expander is over genes. * There is probably a better way of doing this that doesn't rely on instanceof */ public Collection<Gene> getGenes(Region coords){ ArrayList<Gene> results = new ArrayList<Gene>(); Region query; if (overlapOnly) { query = coords; } else { query = coords.expand(maxAnnotDist, maxAnnotDist); } Iterator<? extends Region> iter = annotExpander.execute(query); while (iter.hasNext()) { Region r = iter.next(); if(r instanceof Gene) results.add((Gene)r); } return(results); } /** Return genes if the expander is over genes. * There is probably a better way of doing this that doesn't rely on instanceof */ public Collection<Gene> getGenes(Point point){ ArrayList<Gene> results = new ArrayList<Gene>(); Region query; if (overlapOnly) { query = point.expand(2); } else { query = point.expand(maxAnnotDist); } Iterator<? extends Region> iter = annotExpander.execute(query); while (iter.hasNext()) { Region r = iter.next(); if(r instanceof Gene) results.add((Gene)r); } return(results); } }