MCPcopy Create free account
hub / github.com/RealTimeGenomics/rtg-tools / mainExec

Method mainExec

src/main/java/com/rtg/vcf/VcfSplitCli.java:99–154  ·  view source on GitHub ↗
(OutputStream out, LogStream log)

Source from the content-addressed store, hash-verified

97 }
98
99 @Override
100 protected int mainExec(OutputStream out, LogStream log) throws IOException {
101 final boolean gzip = !mFlags.isSet(CommonFlags.NO_GZIP);
102 final boolean keepRef = mFlags.isSet(KEEP_REF);
103 final boolean asyncOutput = (Boolean) mFlags.getValue(ASYNC);
104 final VcfSubset.VcfSampleStripperFactory sampleStripperFact = new VcfSubset.VcfSampleStripperFactory(mFlags);
105 try (final VcfReader reader = new VcfReaderFactory(mFlags).parser(new VcfSubsetParser(sampleStripperFact)).make(mFlags)) {
106 final int numberSamples = reader.getHeader().getNumberOfSamples();
107 if (numberSamples == 0) {
108 throw new NoTalkbackSlimException("No samples to be output.");
109 }
110 final VcfWriter[] writers = new VcfWriter[numberSamples];
111 final ArrayList<String> samples = new ArrayList<>(reader.getHeader().getSampleNames());
112 try {
113 final VcfWriterFactory f = new VcfWriterFactory(mFlags).addRunInfo(true).async(asyncOutput);
114 for (int i = 0; i < numberSamples; ++i) {
115 final String sample = samples.get(i);
116 final File of = new File(outputDirectory(), sample);
117 final File vcfFile = VcfUtils.getZippedVcfFileName(gzip, of);
118 Diagnostic.userLog("Outputting sample '" + sample + "' to: " + vcfFile);
119 final VcfHeader header = reader.getHeader().copy();
120 header.removeAllSamples();
121 header.addSampleName(sample);
122 writers[i] = f.make(header, vcfFile);
123 }
124 while (reader.hasNext()) {
125 final VcfRecord rec = reader.next();
126 if (rec.hasFormat(VcfUtils.FORMAT_GENOTYPE)) {
127 final List<String> gts = rec.getFormat(VcfUtils.FORMAT_GENOTYPE);
128 final VcfRecord template = new VcfRecord(rec); // Work on a copy
129 for (int i = 0; i < numberSamples; ++i) {
130 final String gt = gts.get(i);
131 final int[] gtArr = VcfUtils.splitGt(gt);
132 if (VcfUtils.isValidGt(rec, gtArr) && VcfUtils.isNonMissingGt(gt)
133 && (keepRef || hasAlt(gtArr))) {
134 template.removeSamples();
135 template.setNumberOfSamples(1);
136 // Copy sample field values from original
137 for (Map.Entry<String, ArrayList<String>> e : rec.getFormatAndSample().entrySet()) {
138 template.setFormatAndSample(e.getKey(), e.getValue().get(i), 0);
139 }
140 writers[i].write(asyncOutput ? new VcfRecord(template) : template);
141 }
142 }
143 }
144 }
145 } finally {
146 for (VcfWriter w : writers) {
147 if (w != null) {
148 w.close();
149 }
150 }
151 }
152 }
153 return 0;
154 }
155
156 private boolean hasAlt(int[] gt) {

Callers

nothing calls this directly

Calls 15

outputDirectoryMethod · 0.95
getZippedVcfFileNameMethod · 0.95
userLogMethod · 0.95
removeAllSamplesMethod · 0.95
addSampleNameMethod · 0.95
makeMethod · 0.95
hasFormatMethod · 0.95
getFormatMethod · 0.95
splitGtMethod · 0.95
isValidGtMethod · 0.95
isNonMissingGtMethod · 0.95
hasAltMethod · 0.95

Tested by

no test coverage detected