(OutputStream out, LogStream log)
| 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) { |
nothing calls this directly
no test coverage detected