package org.broad.igv.feature.basepair; import org.apache.log4j.Logger; import org.broad.igv.Globals; import org.broad.igv.exceptions.ParserException; import org.broad.igv.feature.genome.Genome; import org.broad.igv.util.ParsingUtils; import org.broad.igv.util.ResourceLocator; import htsjdk.tribble.readers.AsciiLineReader; import java.awt.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; public class BasePairFileParser { static Logger log = Logger.getLogger(BasePairFileParser.class); public static BasePairData loadData(ResourceLocator locator, Genome genome) { AsciiLineReader reader = null; List<Color> colors = new ArrayList(); HashMap<Color, List<Object>> rowsByColor = new HashMap<Color, List<Object>>(); BasePairData basePairData = new BasePairData(); String nextLine = null; int rowCounter = 0; try { reader = ParsingUtils.openAsciiReader(locator); // read lines specifying arc colors nextLine = reader.readLine(); rowCounter++; while (nextLine.substring(0, 6).equals("color:")) { String[] tokens = Globals.whitespacePattern.split(nextLine, -1); int r = Integer.parseInt(tokens[1]); int g = Integer.parseInt(tokens[2]); int b = Integer.parseInt(tokens[3]); Color color = new Color(r, g, b, 255); colors.add(color); nextLine = reader.readLine(); rowCounter++; } for (Color color : colors) { rowsByColor.put(color, new ArrayList()); } while (nextLine != null) { String[] tokens = Globals.whitespacePattern.split(nextLine, -1); String chr = (genome == null ? tokens[0] : genome.getCanonicalChrName(tokens[0])); // TODO Future use int startLeftNuc = Integer.parseInt(tokens[1]) - 1; // stick to IGV's 0-based coordinate convention int startRightNuc = Integer.parseInt(tokens[2]) - 1; int endLeftNuc = Integer.parseInt(tokens[3]) - 1; int endRightNuc = Integer.parseInt(tokens[4]) - 1; Color color = colors.get(Integer.parseInt(tokens[5])); BasePairFeature feature; if (startLeftNuc <= endRightNuc) { feature = new BasePairFeature(chr, Math.min(startLeftNuc, startRightNuc), Math.max(startLeftNuc, startRightNuc), Math.min(endLeftNuc, endRightNuc), Math.max(endLeftNuc, endRightNuc), color); } else { feature = new BasePairFeature(chr, Math.min(endLeftNuc, endRightNuc), Math.max(endLeftNuc, endRightNuc), Math.min(startLeftNuc, startRightNuc), Math.max(startLeftNuc, startRightNuc), color); } basePairData.addFeature(feature); nextLine = reader.readLine(); rowCounter++; } basePairData.finish(); // ensure features are sorted by start position, important for rendering optimization } catch (Exception e) { log.error("Error parsing base pair file", e); if (nextLine != null && rowCounter != 0) { throw new ParserException(e.getMessage(), e, rowCounter, nextLine); } else { throw new RuntimeException(e); } } finally { if (reader != null) { reader.close(); } } //for (Object row : rows){ // System.out.println(row); //} return basePairData; } }