private void outputMissingInterval(final IntervalStratification stats) { final GenomeLoc interval = stats.getInterval(); final boolean missing[] = new boolean[interval.size()]; Arrays.fill(missing, true); for (AbstractStratification sample : stats.getElements()) { if (hasMissingStatuses(sample)) { int pos = 0; for (AbstractStratification locus : sample.getElements()) { if (locus.callableStatuses().isEmpty()) { missing[pos] = false; } pos++; } } } int start = -1; boolean insideMissing = false; for (int i = 0; i < missing.length; i++) { if (missing[i] && !insideMissing) { start = interval.getStart() + i; insideMissing = true; } else if (!missing[i] && insideMissing) { final int stop = interval.getStart() + i - 1; outputMissingInterval(interval.getContig(), start, stop); insideMissing = false; } } if (insideMissing) { outputMissingInterval(interval.getContig(), start, interval.getStop()); } }
/** Prepare the output file and the list of available features. */ public void initialize() { if (LIST) { AnnotationHelpUtils.listAnnotations(); System.exit(0); } // get the list of all sample names from the variant VCF input rod, if applicable final List<String> rodName = Arrays.asList(variantCollection.variants.getName()); final Set<String> samples = SampleUtils.getUniqueSamplesFromRods(getToolkit(), rodName); if (USE_ALL_ANNOTATIONS) engine = new VariantAnnotatorEngine(annotationsToExclude, this, getToolkit()); else engine = new VariantAnnotatorEngine( annotationGroupsToUse, annotationsToUse, annotationsToExclude, this, getToolkit()); engine.initializeExpressions(expressionsToUse); engine.setExpressionAlleleConcordance(expressionAlleleConcordance); // setup the header fields // note that if any of the definitions conflict with our new ones, then we want to overwrite the // old ones final Set<VCFHeaderLine> hInfo = new HashSet<>(); hInfo.addAll(engine.getVCFAnnotationDescriptions()); for (final VCFHeaderLine line : GATKVCFUtils.getHeaderFields(getToolkit(), rodName)) { if (isUniqueHeaderLine(line, hInfo)) hInfo.add(line); } // for the expressions, pull the info header line from the header of the resource rod for (final VariantAnnotatorEngine.VAExpression expression : engine.getRequestedExpressions()) { // special case the ID field if (expression.fieldName.equals("ID")) { hInfo.add( new VCFInfoHeaderLine( expression.fullName, 1, VCFHeaderLineType.String, "ID field transferred from external VCF resource")); continue; } VCFInfoHeaderLine targetHeaderLine = null; for (final VCFHeaderLine line : GATKVCFUtils.getHeaderFields(getToolkit(), Arrays.asList(expression.binding.getName()))) { if (line instanceof VCFInfoHeaderLine) { final VCFInfoHeaderLine infoline = (VCFInfoHeaderLine) line; if (infoline.getID().equals(expression.fieldName)) { targetHeaderLine = infoline; break; } } } if (targetHeaderLine != null) { if (targetHeaderLine.getCountType() == VCFHeaderLineCount.INTEGER) hInfo.add( new VCFInfoHeaderLine( expression.fullName, targetHeaderLine.getCount(), targetHeaderLine.getType(), targetHeaderLine.getDescription())); else hInfo.add( new VCFInfoHeaderLine( expression.fullName, targetHeaderLine.getCountType(), targetHeaderLine.getType(), targetHeaderLine.getDescription())); } else { hInfo.add( new VCFInfoHeaderLine( expression.fullName, VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.String, "Value transferred from another external VCF resource")); } } engine.makeHeaderInfoMap(hInfo); engine.invokeAnnotationInitializationMethods(hInfo); VCFHeader vcfHeader = new VCFHeader(hInfo, samples); vcfWriter.writeHeader(vcfHeader); }