/* * The MIT License (MIT) * * Copyright (c) 2007-2015 Broad Institute * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ package org.broad.igv.tools.sort; import htsjdk.samtools.util.CloseableIterator; import htsjdk.samtools.util.SortingCollection; import org.apache.log4j.Logger; import org.broad.igv.feature.genome.ChromosomeNameComparator; import org.broad.igv.feature.tribble.MUTCodec; import org.broad.igv.gwas.GWASParser; import org.broad.igv.track.GFFFeatureSource; import org.broad.igv.util.ResourceLocator; import htsjdk.tribble.readers.AsciiLineReader; import java.io.*; import java.util.Comparator; /** * Created by IntelliJ IDEA. * User: nazaire * Date: Jun 2, 2009 */ public abstract class AsciiSorter implements Sorter { static private Logger log = Logger.getLogger(AsciiSorter.class); static int MAX_RECORDS_IN_RAM = 500000; protected File inputFile; private File outputFile; private boolean writeStdOut = false; private int maxRecords = MAX_RECORDS_IN_RAM; /** * Directory used for storing temporary data files */ private File tmpDir; static final String usageString = "igvtools sort <inputFile> [outputFile]"; protected Comparator<SortableRecord> comparator = getDefaultComparator(); /** * @param inputFile * @param outputFile If null, we write to stdout */ public AsciiSorter(File inputFile, File outputFile) { this.inputFile = inputFile; this.outputFile = outputFile; this.writeStdOut = outputFile == null; this.tmpDir = new File(System.getProperty("java.io.tmpdir"), System.getProperty("user.name")); System.setProperty("snappy.disable", "true"); if (!tmpDir.exists()) { tmpDir.mkdir(); } } public void run() throws IOException { FileInputStream fis = null; PrintWriter writer = null; try { fis = new FileInputStream(inputFile); Writer rawWriter; if (writeStdOut) { rawWriter = new OutputStreamWriter(System.out); } else { rawWriter = new FileWriter(this.outputFile); } writer = new PrintWriter(new BufferedWriter(rawWriter)); SortableRecordCodec codec = new SortableRecordCodec(); SortingCollection cltn = SortingCollection.newInstance(SortableRecord.class, codec, comparator, maxRecords, tmpDir); Parser parser = getParser(); AsciiLineReader reader = new AsciiLineReader(fis); String firstDataRow = writeHeader(reader, writer); if (firstDataRow != null) { cltn.add(parser.createRecord(firstDataRow)); } SortableRecord next = null; while ((next = parser.readNextRecord(reader)) != null) { cltn.add(next); } CloseableIterator<SortableRecord> iter = cltn.iterator(); while (iter.hasNext()) { SortableRecord al = iter.next(); writer.println(al.getText()); } iter.close(); } finally { if (fis != null) fis.close(); if (writer != null) writer.close(); } } public void setComparator(Comparator<SortableRecord> comparator) { this.comparator = comparator; } public static Comparator<SortableRecord> getDefaultComparator() { Comparator<SortableRecord> comp = new Comparator<SortableRecord>() { private Comparator<String> nameComparator = ChromosomeNameComparator.get(); public int compare(SortableRecord o1, SortableRecord o2) { int nameComp = nameComparator.compare(o1.getChromosome(), o2.getChromosome()); if (nameComp == 0) { return o1.getStart() - o2.getStart(); } else { return nameComp; } } }; return comp; } abstract Parser getParser() throws IOException; /** * Write the header to the output file. Since many readers can't help but read * one feature line, that line should be returned and will then be treated as a record * * @param reader * @param writer * @return * @throws IOException */ abstract String writeHeader(AsciiLineReader reader, PrintWriter writer) throws IOException; public void setTmpDir(File tmpDir) { this.tmpDir = tmpDir; } public void setMaxRecords(int maxRecords) { this.maxRecords = maxRecords; } public void setWriteStdOut(boolean writeStdOut) { this.writeStdOut = writeStdOut; } }