787bbf7122c1c5690af479fdd5639464ec7d5875 angie Thu Mar 4 11:26:44 2021 -0800 Show usage message if given -h or --help. Would be nice for optionInit to take a usage function as arg so an errCatch wasn't necessary. diff --git src/hg/utils/faToVcf/faToVcf.c src/hg/utils/faToVcf/faToVcf.c index ed9e691..f947a86 100644 --- src/hg/utils/faToVcf/faToVcf.c +++ src/hg/utils/faToVcf/faToVcf.c @@ -1,65 +1,70 @@ /* faToVcf - Convert a FASTA alignment file to VCF. */ #include "common.h" +#include "errCatch.h" #include "fa.h" #include "linefile.h" #include "hash.h" #include "iupac.h" #include "options.h" -void usage() +void usage(int exitCode) /* Explain usage and exit. */ { -errAbort( +fputs( "faToVcf - Convert a FASTA alignment file to Variant Call Format (VCF) single-nucleotide diffs\n" "usage:\n" " faToVcf in.fa out.vcf\n" "options:\n" " -ambiguousToN Treat all IUPAC ambiguous bases (N, R, V etc) as N (no call).\n" " -excludeFile=file Exclude sequences named in file which has one sequence name per line\n" " -includeRef Include the reference in the genotype columns\n" " (default: omitted as redundant)\n" " -maskSites=file Exclude variants in positions recommended for masking in file\n" " (typically https://github.com/W-L/ProblematicSites_SARS-CoV2/raw/master/problematic_sites_sarsCov2.vcf)\n" " -minAc=N Ignore alternate alleles observed fewer than N times\n" " -noGenotypes Output 8-column VCF, without the sample genotype columns\n" " -ref=seqName Use seqName as the reference sequence; must be present in faFile\n" " (default: first sequence in faFile)\n" " -resolveAmbiguous For IUPAC ambiguous characters like R (A or G), if the character\n" " represents two bases and one is the reference base, convert it to the\n" " non-reference base. Otherwise convert it to N.\n" " -startOffset=N Add N bases to each position (for trimmed alignments)\n" " -vcfChrom=seqName Use seqName for the CHROM column in VCF (default: ref sequence)\n" "in.fa must contain a series of sequences with different names and the same length.\n" "Both N and - are treated as missing information.\n" + , stderr ); +exit(exitCode); } #define MAX_ALTS 256 /* Command line validation table. */ static struct optionSpec options[] = { { "ambiguousToN", OPTION_BOOLEAN }, { "excludeFile", OPTION_STRING }, { "includeRef", OPTION_BOOLEAN }, { "maskSites", OPTION_STRING }, { "minAc", OPTION_INT }, { "noGenotypes", OPTION_BOOLEAN }, { "ref", OPTION_STRING }, { "resolveAmbiguous", OPTION_BOOLEAN }, { "startOffset", OPTION_INT}, { "vcfChrom", OPTION_STRING }, + { "h", OPTION_BOOLEAN }, + { "-help", OPTION_BOOLEAN }, { NULL, 0 }, }; static struct dnaSeq *removeExcludedSequences(struct dnaSeq *sequences) /* If -excludeFile was passed in, remove any sequences whose names are found in the file and * return the modified list. */ { char *excludeFile = optionVal("excludeFile", NULL); if (excludeFile) { struct lineFile *lf = lineFileOpen(excludeFile, TRUE); struct hash *excludedSeqs = hashNew(0); char *line; while (lineFileNextReal(lf, &line)) { @@ -369,24 +374,36 @@ if (missing[gtIx]) fprintf(outF, "\t."); else fprintf(outF, "\t%d", genotypes[gtIx]); } } fprintf(outF, "\n"); } } carefulClose(&outF); } int main(int argc, char *argv[]) /* Process command line. */ { +struct errCatch *errCatch = errCatchNew(); +if (errCatchStart(errCatch)) optionInit(&argc, argv, options); +errCatchEnd(errCatch); +if (errCatch->gotError) + { + warn("%s", errCatch->message->string); + usage(1); + } +errCatchFree(&errCatch); + if (optionExists("ambiguousToN") && optionExists("resolveAmbiguous")) errAbort("-ambiguousToN and -resolveAmbiguous conflict with each other; " "please use only one."); +if (optionExists("h") || optionExists("-help")) + usage(0); if (argc != 3) - usage(); + usage(1); faToVcf(argv[1], argv[2]); return 0; }