6 #include "remove_reads_from_amplicon.h"     7 #include "call_consensus_pileup.h"     8 #include "call_variants.h"     9 #include "trim_primer_quality.h"    10 #include "get_masked_amplicons.h"    11 #include "suffix_tree.h"    13 const std::string VERSION = 
"1.0";
    22   uint8_t sliding_window;   
    32     "Usage: ivar [command <trim|callvariants|filtervariants|consensus|createbed|getmasked|removereads|version|help>]\n"    34     "        Command       Description\n"    35     "           trim       Trim reads in aligned BAMs\n"    36     "       variants       Call variants from aligned BAM file\n"    37     " filtervariants       Filter variants across replicates\n"    38     "      consensus       Call consensus from aligned BAM file\n"    39     "      getmasked       Get amplicons with primer mismatches\n"    40     "    removereads       Remove reads from trimmed BAM file\n"    41     "        version       Show version information\n"    42     "    trimadapter       (EXPERIMENTAL) Trim adapter sequences from reads\n"    44     "To view detailed usage for each command type `ivar <command>` \n";
    47 void print_trim_usage(){
    49     "Usage: ivar trim -i <input.bam> -b <primers.bed> -p <prefix> [-m <min-length>] [-q <min-quality>] [-s <sliding-window-width>]\n\n"    50     "Input Options    Description\n"    51     "           -i    (Required) Indexed aligned bam file to trim primers and quality\n"    52     "           -b    (Required) BED file with primer sequences and positions\n"    53     "           -m    Minimum length of read to retain after trimming (Default: 30)\n"    54     "           -q    Minimum quality threshold for sliding window to pass (Default: 20)\n"    55     "           -s    Width of sliding window (Default: 4)\n\n"    56     "Output Options   Description\n"    57     "           -p    (Required) Prefix for the output BAM file\n";
    60 void print_variants_usage(){
    62       "Usage: samtools mpileup -A -d 300000 --reference <reference-fasta> -Q 0 -F 0 <input.bam> | ivar variants -p <prefix> [-q <min-quality>] [-t <min-frequency-threshold>]\n\n"    63     "Note : samtools mpileup output must be piped into ivar variants\n\n"    64     "Input Options    Description\n"    65     "           -q    Minimum quality score threshold to count base (Default: 20)\n"    66     "           -t    Minimum frequency threshold(0 - 1) to call variants (Default: 0.03)\n\n"    67     "Output Options   Description\n"    68     "           -p    (Required) Prefix for the output tsv variant file\n\n";
    71 void print_filtervariants_usage(){
    73     "Usage: ivar filtervariants -p <prefix> replicate-one.tsv replicate-two.tsv ... \n\n"    74     "Input: Variant tsv files for each replicate\n\n"    75     "Output Options   Description\n"    76     "           -p    (Required) Prefix for the output filtered tsv file\n";
    79 void print_consensus_usage(){
    81     "Usage: samtools mpileup -A -d 300000 -Q 0 -F 0 <input.bam> | ivar consensus -p <prefix> \n\n"    82     "Note : samtools mpileup output must be piped into `ivar consensus`\n\n"    83     "Input Options    Description\n"    84     "           -q    Minimum quality score threshold to count base (Default: 20)\n"    85     "           -t    Minimum frequency threshold(0 - 1) to call consensus. (Default: 0)\n"    86     "                 Frequently used thresholds | Description\n"    87     "                 ---------------------------|------------\n"    88     "                                          0 | Majority or most common base\n"    89     "                                        0.2 | Bases that make up atleast 20% of the depth at a position\n"    90     "                                        0.5 | Strict or bases that make up atleast 50% of the depth at a position\n"    91     "                                        0.9 | Strict or bases that make up atleast 90% of the depth at a position\n"    92     "                                          1 | Identical or bases that make up 100% of the depth at a position. Will have highest ambiguities\n"    93     "Output Options   Description\n"    94     "           -p    (Required) Prefix for the output fasta file and quality file\n";
    97 void print_removereads_usage(){
    99     "Usage: ivar removereads -i <input.trimmed.bam> -p <prefix> primer-index-1 primer-index-2 primer-index-3 primer-index-4 ...  \n\n"   100     "Input Options    Description\n"   101     "           -i    (Required) Input BAM file  trimmed with ‘ivar trim’. Must be sorted and indexed, which can be done using sort_index_bam.sh\n"   102     "Output Options   Description\n"   103     "           -p    (Required) Prefix for the output filtered BAM file\n";
   106 void print_getmasked_usage(){
   108     "Usage: ivar getmasked -i <input-filtered.tsv> -b <primers.bed>\n\n"   109     "Input Options    Description\n"   110     "           -i    (Required) Input filtered variants tsv generated from `ivar filtervariants`\n"   111     "           -b    (Required) BED file with primer sequences and positions\n";
   114 void print_trimadapter_usage(){
   116     "Usage: ivar trimadapter [-f1 <input-fastq>] [-f2 <input-fastq-2>] [-p prefix] [-a <adapter-fasta-file>]\n\n"   117     "Input Options    Description\n"   118     "           -1    (Required) Input fastq file\n"   119     "           -2    Input fastq file 2 (for pair ended reads)\n"   120     "           -a    (Required) Adapter Fasta File\n"   121     "           -p    (Required) Prefix of output fastq files\n";
   124 void print_version_info(){
   125   std::cout << 
"iVar version " << VERSION << std::endl <<
   126     "\nPlease raise issues and bug reports at https://github.com/andersen-lab/ivar/\n";
   129 static const char *trim_opt_str = 
"i:b:p:m::q::s::h?";
   130 static const char *variants_opt_str = 
"p:t::q::h?";
   131 static const char *consensus_opt_str = 
"p:q::t::h?";
   132 static const char *removereads_opt_str = 
"i:p:h?";
   133 static const char *filtervariants_opt_str = 
"p:h?";
   134 static const char *getmasked_opt_str = 
"i:b:h?";
   135 static const char *trimadapter_opt_str = 
"1:2::p:a:h?";
   144 int main(
int argc, 
char* argv[]){
   149   std::string cmd(argv[1]);
   150   if(cmd.compare(
"-v") == 0){
   154   int opt = 0, res = 0;
   159   g_args.min_qual = 255;
   160   g_args.sliding_window = 255;
   161   g_args.min_threshold = -1;
   162   g_args.min_length = -1;
   163   if (cmd.compare(
"trim") == 0){
   164     opt = getopt( argc, argv, trim_opt_str);
   174     g_args.prefix = optarg;
   177     g_args.min_length = atoi(optarg);
   180     g_args.min_qual = atoi(optarg);
   183     g_args.sliding_window = atoi(optarg);
   191       opt = getopt( argc, argv, trim_opt_str);
   193     if(g_args.bam.empty() || g_args.bed.empty() || g_args.prefix.empty()){
   197     g_args.min_qual = (g_args.min_qual == 255) ? 20 : g_args.min_qual;
   198     g_args.sliding_window = (g_args.sliding_window == 255) ? 4 : g_args.sliding_window;
   199     g_args.min_length = (g_args.min_length == -1) ? 30 : g_args.min_length;
   200     res = trim_bam_qual_primer(g_args.bam, g_args.bed, g_args.prefix, g_args.region, g_args.min_qual, g_args.sliding_window, g_args.min_length);
   201   } 
else if (cmd.compare(
"variants") == 0){
   202     opt = getopt( argc, argv, variants_opt_str);
   206     g_args.prefix = optarg;
   209     g_args.min_threshold = atof(optarg);
   212     g_args.min_qual = atoi(optarg);
   216     print_variants_usage();
   220       opt = getopt( argc, argv, variants_opt_str);
   222     if(g_args.prefix.empty()){
   223       print_variants_usage();
   226     g_args.min_threshold = (g_args.min_threshold == -1 || g_args.min_threshold < 0 || g_args.min_threshold >= 1) ? 0.03: g_args.min_threshold;
   227     g_args.min_qual = (g_args.min_qual == 255) ? 20 : g_args.min_qual;
   228     res = call_variants_from_plup(std::cin, g_args.prefix, g_args.min_qual, g_args.min_threshold);
   229   } 
else if (cmd.compare(
"consensus") == 0){
   230     opt = getopt( argc, argv, consensus_opt_str);
   231     g_args.min_threshold = 0;
   235     g_args.min_threshold = atof(optarg);
   238     g_args.prefix = optarg;
   241     g_args.min_qual = atoi(optarg);
   245     print_consensus_usage();
   249       opt = getopt( argc, argv, consensus_opt_str);
   251     if(g_args.prefix.empty()){
   252       print_consensus_usage();
   255     g_args.min_qual = (g_args.min_qual == 255) ? 20 : g_args.min_qual;
   256     std::cout <<
"Min Quality" << g_args.min_qual << std::endl;
   257     std::cout << 
"Threshold: " << g_args.min_threshold << std::endl;
   258     res = call_consensus_from_plup(std::cin, g_args.prefix, g_args.min_qual, g_args.min_threshold);
   259   } 
else if (cmd.compare(
"removereads") == 0){
   260     opt = getopt( argc, argv, removereads_opt_str);
   267     g_args.prefix = optarg;
   271     print_removereads_usage();
   275       opt = getopt( argc, argv, removereads_opt_str);
   278       print_removereads_usage();
   282     for(
int i = optind; i<argc;i++){
   283       amp[i] = atoi(argv[i]);
   286     if(g_args.bam.empty() || g_args.prefix.empty()){
   287       print_removereads_usage();
   290     res = rmv_reads_from_amplicon(g_args.bam, g_args.region, g_args.prefix, amp, argc - optind);
   291   } 
else if(cmd.compare(
"filtervariants") == 0){
   292     opt = getopt( argc, argv, filtervariants_opt_str);
   296     g_args.prefix = optarg;
   300     print_filtervariants_usage();
   304       opt = getopt( argc, argv, filtervariants_opt_str);
   307       print_filtervariants_usage();
   310     if(g_args.prefix.empty()){
   311       print_filtervariants_usage();
   314     std::string rep = 
"get_common_variants.sh ";
   315     for(
int i = optind; i<argc;i++){
   319     rep += 
" | sort -s -n -k 2 > "+g_args.prefix+
".tsv";
   321   } 
else if(cmd.compare(
"getmasked") == 0){
   322     opt = getopt( argc, argv, getmasked_opt_str);
   333     print_getmasked_usage();
   337       opt = getopt( argc, argv, getmasked_opt_str);
   339     if(g_args.bed.empty() || g_args.bam.empty()){
   340       print_getmasked_usage();
   343     res = get_primers_with_mismatches(g_args.bed, g_args.bam);
   344   } 
else if (cmd.compare(
"trimadapter") == 0){
   345     opt = getopt( argc, argv, trimadapter_opt_str);
   355     g_args.prefix = optarg;
   358     g_args.adp_path = optarg;
   362     print_trimadapter_usage();
   366       opt = getopt( argc, argv, trimadapter_opt_str);
   368     if(g_args.f1.empty() || g_args.prefix.empty() || g_args.adp_path.empty()){
   369       print_trimadapter_usage();
   372     res = trim_adapter(g_args.f1, g_args.f2, g_args.adp_path, g_args.prefix);
 
int main(int argc, char *argv[])