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[])