package com.github.lindenb.jvarkit.tools.vcfvcf; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import com.beust.jcommander.Parameter; import com.github.lindenb.jvarkit.util.jcommander.Launcher; import com.github.lindenb.jvarkit.util.jcommander.Program; import com.github.lindenb.jvarkit.util.log.Logger; import htsjdk.samtools.util.CloseableIterator; import htsjdk.samtools.util.CloserUtil; import com.github.lindenb.jvarkit.util.vcf.VcfIterator; import htsjdk.variant.variantcontext.VariantContext; import htsjdk.variant.variantcontext.VariantContextBuilder; import htsjdk.variant.variantcontext.writer.VariantContextWriter; import htsjdk.variant.vcf.VCFHeader; import htsjdk.variant.vcf.VCFHeaderLineType; import htsjdk.variant.vcf.VCFInfoHeaderLine; import com.github.lindenb.jvarkit.util.vcf.IndexedVcfFileReader; @Deprecated @Program(name="vcfvcf", description="Get the INFO from a VCF and use it for another VCF", deprecatedMsg="obsolete. use GATK" ) public class VcfVcf extends Launcher { private static Logger LOG=Logger.build(VcfVcf.class).make(); @Parameter(names={"-o","--output"},description="Output file. Optional . Default: stdout") private File outputFile = null; @Parameter(names="-TBX",description="The VCF file indexed with TABIX. Source of the annotations") public String TABIX; @Parameter(names="-INFO",description="The INFO keys to grab.") public Set<String> INFO_IDS=new LinkedHashSet<String>(); @Parameter(names="-RIF",description="Replace the INFO field if it exists.") public boolean REPLACE_INFO_FIELD=true; @Parameter(names="-RID",description="Replace the ID field if it exists.") public boolean REPLACE_ID=true; @Parameter(names="-RAM",description="REF allele matters.") public boolean REF_ALLELE_MATTERS=true; @Parameter(names="-AAM",description="ALT alleles matters.") public boolean ALT_ALLELES_MATTERS=false; @Parameter(names="-ACF",description="Flag to set if alternate alleles conflict.") public String ALT_CONFLICT_FLAG=null; @Override protected int doVcfToVcf(String inputName, VcfIterator r, VariantContextWriter w) { try { CloseableIterator<VariantContext> iter=null; LOG.info("opening file: "+this.TABIX); IndexedVcfFileReader tabix= new IndexedVcfFileReader(this.TABIX); VCFHeader header3=tabix.getHeader(); VCFHeader header1=r.getHeader(); VCFHeader h2=new VCFHeader(header1.getMetaDataInInputOrder(),header1.getSampleNamesInOrder()); for(String infoId:this.INFO_IDS) { VCFInfoHeaderLine vihl=header3.getInfoHeaderLine(infoId); if(vihl==null) { LOG.warn("Not INFO="+infoId+" in "+TABIX); continue; } if(h2.getInfoHeaderLine(infoId)!=null) { LOG.warn("Input already contains INFO="+vihl); } h2.addMetaDataLine(vihl); } if(ALT_CONFLICT_FLAG!=null) { h2.addMetaDataLine(new VCFInfoHeaderLine(ALT_CONFLICT_FLAG,1,VCFHeaderLineType.Flag,"conflict ALT allele with "+this.TABIX)); } w.writeHeader(h2); while(r.hasNext()) { VariantContext ctx1=r.next(); VariantContextBuilder vcb=new VariantContextBuilder(ctx1); String BEST_ID=null; boolean best_id_match_alt=false; List<VariantContext> variantsList=new ArrayList<VariantContext>(); iter=tabix.iterator(ctx1.getChr(), Math.max(0,ctx1.getStart()-1), (ctx1.getEnd()+1) ); while(iter.hasNext()) { VariantContext ctx3=iter.next(); if(!ctx3.getChr().equals(ctx1.getStart())) continue; if(ctx3.getStart()!=ctx1.getStart()) continue; if(ctx3.getEnd()!=ctx1.getEnd()) continue; if( ctx1.getReference().equals(ctx3.getReference()) && ctx1.getAlternateAlleles().equals(ctx3.getAlternateAlleles()) ) { variantsList.clear(); variantsList.add(ctx3); break; } else { variantsList.add(ctx3); } } CloserUtil.close(iter);iter=null; for(VariantContext ctx3:variantsList) { if(this.REF_ALLELE_MATTERS && !ctx1.getReference().equals(ctx3.getReference())) { continue; } if(this.ALT_ALLELES_MATTERS && !ctx1.getAlternateAlleles().equals(ctx3.getAlternateAlleles())) { continue; } if(ctx3.getID()!=null && this.REPLACE_ID) { if(BEST_ID!=null && best_id_match_alt) { //nothing } else { BEST_ID=ctx3.getID(); best_id_match_alt=ctx1.getAlternateAlleles().equals(ctx3.getAlternateAlleles()); } } for(String id:this.INFO_IDS) { Object info3=ctx3.getAttribute(id); if(info3==null) { continue; } Object info1=ctx1.getAttribute(id); if(info1!=null && !this.REPLACE_INFO_FIELD) { continue; } vcb.attribute(id, info3); } if(ALT_CONFLICT_FLAG!=null && !ctx1.getAlternateAlleles().equals(ctx3.getAlternateAlleles())) { vcb.attribute(ALT_CONFLICT_FLAG, true); } } if(BEST_ID!=null) { vcb.id(BEST_ID); } w.add(vcb.make()); } tabix.close(); return 0; } catch(Exception err) { LOG.error(err); return -1; } } @Override public int doWork(List<String> args) { return doVcfToVcf(args, outputFile); } public static void main(String[] args) throws IOException { new VcfVcf().instanceMainWithExit(args); } }