package com.github.lindenb.jvarkit.tools.misc;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import htsjdk.samtools.util.Log;
import htsjdk.samtools.util.BufferedLineReader;
import com.beust.jcommander.Parameter;
import com.github.lindenb.jvarkit.io.IOUtils;
import com.github.lindenb.jvarkit.util.jcommander.Launcher;
import com.github.lindenb.jvarkit.util.jcommander.Program;
@Program(name="fixvarscanmissingheader ",description="Fix the sample name in the #CHROM header and fix VCF header missingh in varscan2. Sometimes, but not always, it happends. See http://seqanswers.com/forums/showthread.php?t=33235 ")
public class FixVarScanMissingVCFHeader extends Launcher {
private static Log LOG=Log.getInstance(FixVarScanMissingVCFHeader.class);
@Parameter(names="-S",description="add this sample")
public List<String> SAMPLES=new ArrayList<String>();
private void header()
{
stdout().print("#CHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO");
if(!this.SAMPLES.isEmpty())
{
stdout().print("\tFORMAT");
for(String S:this.SAMPLES)
{
stdout().print("\t");
stdout().print(S);
}
}
stdout().println();
}
@Override
public int doWork(List<String> args) {
LOG.info("reading from stdin ... ");
try
{
int c=stdin().read();
if(c==-1 || c!='#')
{
LOG.info("VCF header missing (Sample are "+this.SAMPLES+") . Fixing.");
stdout().println("##fileformat=VCFv4.1");
stdout().println("##source=VarScan2");
stdout().println("##varscan2header=missing");
stdout().println("##INFO=<ID=ADP,Number=1,Type=Integer,Description=\"Average per-sample depth of bases with Phred score >= 15\">");
stdout().println("##INFO=<ID=WT,Number=1,Type=Integer,Description=\"Number of samples called reference (wild-type)\">");
stdout().println("##INFO=<ID=HET,Number=1,Type=Integer,Description=\"Number of samples called heterozygous-variant\">");
stdout().println("##INFO=<ID=HOM,Number=1,Type=Integer,Description=\"Number of samples called homozygous-variant\">");
stdout().println("##INFO=<ID=NC,Number=1,Type=Integer,Description=\"Number of samples not called\">");
stdout().println("##FILTER=<ID=str10,Description=\"Less than 10% or more than 90% of variant supporting reads on one strand\">");
stdout().println("##FILTER=<ID=indelError,Description=\"Likely artifact due to indel reads at this position\">");
stdout().println("##FORMAT=<ID=GT,Number=1,Type=String,Description=\"Genotype\">");
stdout().println("##FORMAT=<ID=GQ,Number=1,Type=Integer,Description=\"Genotype Quality\">");
stdout().println("##FORMAT=<ID=SDP,Number=1,Type=Integer,Description=\"Raw Read Depth as reported by SAMtools\">");
stdout().println("##FORMAT=<ID=DP,Number=1,Type=Integer,Description=\"Quality Read Depth of bases with Phred score >= 15\">");
stdout().println("##FORMAT=<ID=RD,Number=1,Type=Integer,Description=\"Depth of reference-supporting bases (reads1)\">");
stdout().println("##FORMAT=<ID=AD,Number=1,Type=Integer,Description=\"Depth of variant-supporting bases (reads2)\">");
stdout().println("##FORMAT=<ID=FREQ,Number=1,Type=String,Description=\"Variant allele frequency\">");
stdout().println("##FORMAT=<ID=PVAL,Number=1,Type=String,Description=\"P-value from Fisher's Exact Test\">");
stdout().println("##FORMAT=<ID=RBQ,Number=1,Type=Integer,Description=\"Average quality of reference-supporting bases (qual1)\">");
stdout().println("##FORMAT=<ID=ABQ,Number=1,Type=Integer,Description=\"Average quality of variant-supporting bases (qual2)\">");
stdout().println("##FORMAT=<ID=RDF,Number=1,Type=Integer,Description=\"Depth of reference-supporting bases on forward strand (reads1plus)\">");
stdout().println("##FORMAT=<ID=RDR,Number=1,Type=Integer,Description=\"Depth of reference-supporting bases on reverse strand (reads1minus)\">");
stdout().println("##FORMAT=<ID=ADF,Number=1,Type=Integer,Description=\"Depth of variant-supporting bases on forward strand (reads2plus)\">");
stdout().println("##FORMAT=<ID=ADR,Number=1,Type=Integer,Description=\"Depth of variant-supporting bases on reverse strand (reads2minus)\">");
header();
IOUtils.copyTo(System.in, stdout());
}
else if(c=='#')
{
String line;
BufferedLineReader r=new BufferedLineReader(System.in);
while((line=r.readLine())!=null)
{
if(c!=-1)
{
line="#"+line;
c=-1;
}
if(line.startsWith("#CHROM\t"))
{
stdout().println("##varscan2samples=replace");
header();//problem with varscan:it doesn't know the sample names :-) !!
}
else
{
stdout().println(line);
}
}
r.close();
}
else
{
throw new IOException("BAD varscan input: first letter is ascii("+c+")");
}
}
catch(IOException err)
{
LOG.error(err,"Boum");
return -1;
}
return 0;
}
/**
* @param args
*/
public static void main(String[] args) {
new FixVarScanMissingVCFHeader().instanceMainWithExit(args);
}
}