1 package org.broadinstitute.hellbender.tools.walkers.contamination; 2 3 import java.nio.file.Path; 4 import org.broadinstitute.hellbender.exceptions.UserException; 5 import org.broadinstitute.hellbender.utils.Utils; 6 import org.broadinstitute.hellbender.utils.io.IOUtils; 7 import org.broadinstitute.hellbender.utils.tsv.DataLine; 8 import org.broadinstitute.hellbender.utils.tsv.TableColumnCollection; 9 import org.broadinstitute.hellbender.utils.tsv.TableReader; 10 import org.broadinstitute.hellbender.utils.tsv.TableWriter; 11 12 import java.io.File; 13 import java.io.IOException; 14 import java.util.List; 15 16 /** 17 * Created by David Benjamin on 2/13/17. 18 */ 19 public class ContaminationRecord { 20 private String sample; 21 private double contamination; 22 private double error; 23 ContaminationRecord(final String sample, final double contamination, final double error)24 public ContaminationRecord(final String sample, final double contamination, final double error) { 25 this.sample = sample; 26 this.contamination = contamination; 27 this.error = error; 28 } 29 getSample()30 public String getSample() { return sample; } 31 getContamination()32 public double getContamination() { 33 return contamination; 34 } 35 getError()36 public double getError() { 37 return error; 38 } 39 40 //----- The following two public static methods read and write contamination files writeToFile(final List<ContaminationRecord> records, final File outputTable)41 public static void writeToFile(final List<ContaminationRecord> records, final File outputTable) { 42 try ( ContaminationRecord.ContaminationTableWriter writer = new ContaminationRecord.ContaminationTableWriter(IOUtils.fileToPath(outputTable)) ) { 43 writer.writeAllRecords(records); 44 } catch (IOException e){ 45 throw new UserException(String.format("Encountered an IO exception while writing to %s.", outputTable)); 46 } 47 } 48 readFromFile(final File tableFile)49 public static List<ContaminationRecord> readFromFile(final File tableFile) { 50 try( ContaminationTableReader reader = new ContaminationTableReader(IOUtils.fileToPath(tableFile)) ) { 51 return reader.toList(); 52 } catch (IOException e){ 53 throw new UserException(String.format("Encountered an IO exception while reading from %s.", tableFile)); 54 } 55 } 56 57 //-------- The following methods are boilerplate for reading and writing contamination tables 58 private static class ContaminationTableWriter extends TableWriter<ContaminationRecord> { ContaminationTableWriter(final Path output)59 private ContaminationTableWriter(final Path output) throws IOException { 60 super(output, ContaminationTableColumn.COLUMNS); 61 } 62 63 @Override composeLine(final ContaminationRecord record, final DataLine dataLine)64 protected void composeLine(final ContaminationRecord record, final DataLine dataLine) { 65 dataLine.set(ContaminationTableColumn.SAMPLE.toString(), record.getSample()) 66 .set(ContaminationTableColumn.CONTAMINATION.toString(), record.getContamination()) 67 .set(ContaminationTableColumn.ERROR.toString(), record.getError()); 68 } 69 } 70 71 private static class ContaminationTableReader extends TableReader<ContaminationRecord> { ContaminationTableReader(final Path path)72 public ContaminationTableReader(final Path path) throws IOException { 73 super(path); 74 } 75 76 @Override createRecord(final DataLine dataLine)77 protected ContaminationRecord createRecord(final DataLine dataLine) { 78 final String sample = dataLine.get(ContaminationTableColumn.SAMPLE); 79 final double contamination = dataLine.getDouble(ContaminationTableColumn.CONTAMINATION); 80 final double error = dataLine.getDouble(ContaminationTableColumn.ERROR); 81 return new ContaminationRecord(sample, contamination, error); 82 } 83 } 84 85 private enum ContaminationTableColumn { 86 SAMPLE("sample"), 87 CONTAMINATION("contamination"), 88 ERROR("error"); 89 90 private final String columnName; 91 ContaminationTableColumn(final String columnName)92 ContaminationTableColumn(final String columnName) { 93 this.columnName = Utils.nonNull(columnName); 94 } 95 96 @Override toString()97 public String toString() { 98 return columnName; 99 } 100 101 public static final TableColumnCollection COLUMNS = new TableColumnCollection(SAMPLE, CONTAMINATION, ERROR); 102 } 103 } 104