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