From ded74c6bbc76a053ee680351208e934dde1cceb6 Mon Sep 17 00:00:00 2001 From: drjsanger Date: Fri, 23 Feb 2018 16:19:46 +0000 Subject: [PATCH 01/13] Add read overlap testing code --- CHANGES.md | 7 ++++ README.md | 6 +++- c/bam2bedgraph.c | 65 ++++++++++++++++++++++++++++++++++--- c/bam2bw.c | 82 ++++++++++++++++++++++++++++++++++++++++++++--- c/bam2bwbases.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++-- 5 files changed, 230 insertions(+), 13 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 6f9b252..2c25106 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,12 @@ # CHANGES +## NEXT + +- First full release +- Add overlapping reads support to `bam2bw`, `bam2bwbases` and `bam2bedgraph` via commandline flag `--overlap` `-a` + - If the same readname is encountered twice at a position it is considred an overlapping read pair. + - Where the same base [ACGT] was encountered on each of the reads it will only be counted once. If a different base was encountered then the coverage count is incremented once for each base. + ## 0.5.0 - Update to HTSlib 1.5 (for consistency across tools) diff --git a/README.md b/README.md index 10ac0fe..23a5344 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ Package of C scripts for generation of [BigWig][BigWig] coverage files - [cgpBigWig](#cgpbigwig) - [Contents](#contents) - [Installation](#installation) - - [Docker](#docker_and_singularity) + - [Docker](#docker-and-singularity) - [Programs](#programs) - [bwcat](#bwcat) - [bwjoin](#bwjoin) @@ -99,6 +99,7 @@ Optional: -c --region [file] A samtools style region (contig:start-stop) or a bed file of regions over which to produce the bigwig file -z --include-zeroes Include zero coverage regions as additional entries to the bw file -r --reference [file] Path to reference genome.fa file (required for cram if ref_path cannot be resolved) +-a --overlap Turn on overlaping reads check Other: -h --help Display this usage information. @@ -129,6 +130,7 @@ bam2bwbases can be used to generate four bw files of per base proportions. -i --input [file] Path to the input [b|cr]am file. -F --filter [int] SAM flags to filter. [default: 4] -o --outfile [file] Path to the output .bw file produced. Per base results wiillbe output as four bw files [ACGT].outputname.bw [default:'(null)'] +-a --overlap Turn on overlaping reads check Optional: -c --region [file] A samtools style region (contig:start-stop) or a bed file of regions over which to produce the bigwig file @@ -151,6 +153,8 @@ Create a BEDGraph file of genomic coverage. BAM file must be sorted. Optional: -r --region Region in bam to access. -f --filter Ignore reads with the filter flags [int]. +-a --overlap Turn on overlaping reads check + Other: -h --help Display this usage information. -v --version Prints the version number. diff --git a/c/bam2bedgraph.c b/c/bam2bedgraph.c index 9f68a44..1e21277 100644 --- a/c/bam2bedgraph.c +++ b/c/bam2bedgraph.c @@ -1,5 +1,5 @@ /** LICENSE -* Copyright (c) 2016 Genome Research Ltd. +* Copyright (c) 2016-2018 Genome Research Ltd. * * Author: Cancer Genome Project cgpit@sanger.ac.uk * @@ -41,6 +41,9 @@ static char *input_file = NULL; static char *output_file = NULL; static char *region = NULL; static int filter = 0; +uint8_t is_overlap = 0; + +KHASH_MAP_INIT_STR(strh,uint8_t) void print_usage (int exit_code){ @@ -51,6 +54,7 @@ void print_usage (int exit_code){ printf ("Optional:\n"); printf ("-r --region Region in bam to access.\n"); printf ("-f --filter Ignore reads with the filter flags [int].\n"); + printf ("-a --overlap Use overlapping read check.\n\n"); printf ("Other:\n"); printf ("-h --help Display this usage information.\n"); printf ("-v --version Prints the version number.\n\n"); @@ -66,6 +70,7 @@ void options(int argc, char *argv[]){ {"region",required_argument,0,'r'}, {"filter",required_argument,0,'f'}, {"output",required_argument,0,'o'}, + {"overlap", no_argument, 0, 'a'}, {"rna",no_argument,0, 'a'}, { NULL, 0, NULL, 0} @@ -75,7 +80,7 @@ void options(int argc, char *argv[]){ int iarg = 0; //Iterate through options - while((iarg = getopt_long(argc, argv, "i:o:r:f:vh", long_opts, &index)) != -1){ + while((iarg = getopt_long(argc, argv, "i:o:r:f:avh", long_opts, &index)) != -1){ switch(iarg){ case 'i': input_file = optarg; @@ -95,6 +100,11 @@ void options(int argc, char *argv[]){ print_usage(1); } break; + + case 'a': + is_overlap = 1; + break; + case 'h': print_usage(0); break; @@ -151,6 +161,47 @@ static int pileup_func(uint32_t tid, uint32_t position, int n, const bam_pileup1 return 0; } +// callback for bam_plbuf_init() +static int pileup_func_overlap(uint32_t tid, uint32_t position, int n, const bam_pileup1_t *pl, void *data){ + tmpstruct_t *tmp = (tmpstruct_t*)data; + int pos = (int)position; + int coverage = n; + int i; + khash_t(strh) *h; + khiter_t k; + h = kh_init(strh); + for (i=0;ib), &absent); + uint8_t cbase = bam_seqi(bam_get_seq(pl[i]->b),pl[i]->qpos); + uint8_t pre_b; + if(!absent){ //Read already processed to get base processed (we only increment if base is different between overlapping read pairs) + k = kh_get(strh, h, bam_get_qname(p->b)); + pre_b = kh_val(h,k); + }else{ + //Add the value to the hash + kh_value(h, k) = cbase; + } + if(!absent && pre_b == cbase) coverage--; //Remove one from the total coverage if this is an overlap site + } + + if (tmp->ltid != tid || tmp->lcoverage != coverage || pos > tmp->lpos+1) { + if (tmp->lpos > 0 && tmp->lcoverage > 0) + fprintf(tmp->out,"%s\t%d\t%d\t%d\n", tmp->head->target_name[tmp->ltid], tmp->lstart,tmp->lpos+1, tmp->lcoverage); + tmp->ltid = tid; + tmp->lstart = pos; + tmp->lcoverage = coverage; + } + tmp->lpos = pos; + kh_destroy(strh, h); + return 0; +} + int main(int argc, char *argv[]){ options(argc, argv); tmpstruct_t tmp; @@ -163,11 +214,16 @@ int main(int argc, char *argv[]){ check(out!=NULL,"Failed to open output file for %s writing.",output_file); tmp.out = out; int check = 0; + int (func*)(uint32_t tid, uint32_t position, int n, const bam_pileup1_t *pl, void *data); + func = &pileup_func + if(is_overlap == 1){ + func = &pileup_func_overlap; + } if(region == NULL){ - check = process_bam_file(input_file,pileup_func, &tmp,filter,NULL); + check = process_bam_file(input_file,func, &tmp,filter,NULL); check(check==1,"Error parsing bam file."); }else{ - check = process_bam_region(input_file, pileup_func, &tmp, filter, region,NULL); + check = process_bam_region(input_file, func, &tmp, filter, region,NULL); check(check==1,"Error parsing bam region."); } fprintf(out,"%s\t%d\t%d\t%d\n", tmp.head->target_name[tmp.ltid], tmp.lstart,tmp.lpos+1, tmp.lcoverage); @@ -183,4 +239,3 @@ int main(int argc, char *argv[]){ if(out) fclose(out); return -1; } - diff --git a/c/bam2bw.c b/c/bam2bw.c index d1b6dae..3417c54 100644 --- a/c/bam2bw.c +++ b/c/bam2bw.c @@ -1,5 +1,5 @@ /** LICENSE -* Copyright (c) 2016 Genome Research Ltd. +* Copyright (c) 2016-2018 Genome Research Ltd. * * Author: Cancer Genome Project cgpit@sanger.ac.uk * @@ -40,6 +40,8 @@ #include "bam_access.h" #include "utils.h" +KHASH_MAP_INIT_STR(strh,uint8_t) + char *out_file = "output.bam.bw"; char *input_file = NULL; char *region_store = NULL; @@ -50,6 +52,7 @@ int is_regions_file = 0; uint8_t is_base = 0; int filter = 4; char base = 0; +uint8_t is_overlap = 0; int include_zeroes = 0; uint32_t single = 1; char *last_contig = ""; @@ -63,7 +66,8 @@ void print_usage (int exit_code){ printf("Optional: \n"); printf("-c --region [file] A samtools style region (contig:start-stop) or a bed file of regions over which to produce the bigwig file\n"); printf("-z --include-zeroes Include zero coverage regions as additional entries to the bw file\n"); - printf("-r --reference [file] Path to reference genome.fa file (required for cram if ref_path cannot be resolved)\n\n"); + printf("-r --reference [file] Path to reference genome.fa file (required for cram if ref_path cannot be resolved)\n"); + printf("-a --overlap Use overlapping read check\n\n"); printf ("Other:\n"); printf("-h --help Display this usage information.\n"); printf("-v --version Prints the version number.\n\n"); @@ -98,6 +102,7 @@ void setup_options(int argc, char *argv[]){ {"region",required_argument, 0, 'c'}, {"reference",required_argument, 0, 'r'}, {"include-zeroes",no_argument, 0, 'z'}, + {"overlap", no_argument, 0, 'a'}, {"help", no_argument, 0, 'h'}, {"version", no_argument, 0, 'v'}, { NULL, 0, NULL, 0} @@ -108,7 +113,7 @@ void setup_options(int argc, char *argv[]){ int iarg = 0; //Iterate through options - while((iarg = getopt_long(argc, argv, "F:i:o:c:r:zhv",long_opts, &index)) != -1){ + while((iarg = getopt_long(argc, argv, "F:i:o:c:r:azhv",long_opts, &index)) != -1){ switch(iarg){ case 'F': if(sscanf(optarg, "%i", &filter) != 1){ @@ -147,6 +152,9 @@ void setup_options(int argc, char *argv[]){ case 'z': include_zeroes = 1; break; + case 'a': + is_overlap = 1; + break; case '?': print_usage (1); break; @@ -205,6 +213,67 @@ static int pileup_func(uint32_t tid, uint32_t position, int n, const bam_pileup1 return 1; } +// callback for bam_plbuf_init() for overlapping reads +static int pileup_func_overlap(uint32_t tid, uint32_t position, int n, const bam_pileup1_t *pl, void *data, uint32_t reg_start){ + tmpstruct_t *tmp = (tmpstruct_t*)data; + int pos = (int)position; + int coverage = n; + int i; + + khash_t(strh) *h; + khiter_t k; + h = kh_init(strh); + + for (i=0;ib), &absent); + uint8_t cbase = bam_seqi(bam_get_seq(pl[i]->b),pl[i]->qpos); + uint8_t pre_b; + if(!absent){ //Read already processed to get base processed (we only increment if base is different between overlapping read pairs) + k = kh_get(strh, h, bam_get_qname(p->b)); + pre_b = kh_val(h,k); + }else{ + //Add the value to the hash + kh_value(h, k) = cbase; + } + if(!absent && pre_b == cbase) coverage--; //Remove one from the total coverage if this is an overlap site + } + + if((uint32_t)pos == reg_start-1){ + tmp->ltid = tid; + tmp->lstart = pos; + tmp->lcoverage = coverage; + } + if (tmp->ltid != tid || tmp->lcoverage != coverage || pos > tmp->lpos+1) { + if (tmp->inczero == 1 || tmp->lcoverage > 0 ){ + uint32_t start = tmp->lstart; + uint32_t stop = pos; + float cvg = (float)tmp->lcoverage; + if(tmp->lcoverage == 0 && tmp->ltid != tid-1 && tmp->ltid != tid){ + tmp->ltid = tid; + } + int chck = bwAddIntervals(tmp->bwout, + &tmp->head->target_name[tmp->ltid],&start,&stop,&cvg,single); + check(chck==0,"Error adding bw interval %s:%"PRIu32"-%"PRIu32" = %f . Error code: %d",tmp->head->target_name[tmp->ltid],start,stop,cvg,chck); + } + //if(tmp->inczero == 1 && tmp->ltid != tid && pos != tmp->head->target_len[tmp->ltid]){ + tmp->ltid = tid; + tmp->lstart = pos; + tmp->lcoverage = coverage; + } + tmp->lpos = pos; + kh_destroy(strh, h); + return 0; +error: + kh_destroy(strh, h); + return 1; +} + bigWigFile_t *initialise_bw_output(char *out_file, chromList_t *chromList){ //Open output file bigWigFile_t *fp = bwOpen(out_file, NULL, "w"); @@ -360,9 +429,14 @@ int main(int argc, char *argv[]){ float cvg; //Now we generate the bw info int chck = 0; + int (func*)(uint32_t tid, uint32_t position, int n, const bam_pileup1_t *pl, void *data, uint32_t reg_start); + func = &pileup_func; + if(is_overlap==1){ + func = &pileup_func_overlap; + } int i=0; for(i=0;ib), &absent); + uint8_t cbase = bam_seqi(bam_get_seq(pl[i]->b),pl[i]->qpos); + uint8_t pre_b; + + if(!absent){ //Read already processed to get base processed (we only increment if base is different between overlapping read pairs) + k = kh_get(strh, h, bam_get_qname(p->b)); + pre_b = kh_val(h,k); + }else{ + //Add the value to the hash + kh_value(h, k) = cbase; + } + if(!absent && pre_b == cbase) continue; //Skip as we've already counted this base once in the overlapping reads + if(cbase == tmp->base_bit) base_coverage++; + } + } + float result = 0; + if(base_coverage>0) result = (float)base_coverage / (float) coverage; + if((uint32_t)pos == reg_start-1){ + tmp->ltid = tid; + tmp->lstart = pos; + tmp->lcoverage = coverage; + tmp->lbaseprop = result; + } + if(tmp->ltid != tid || tmp->lbaseprop != result || pos > tmp->lpos+1){ + //if(tmp->lpos > 0){ + uint32_t start = tmp->lstart; + uint32_t stop = pos; + float res = tmp->lbaseprop; + if(start >= tmp->reg_start-1 && stop <= tmp->reg_stop){ + int chck = bwAddIntervals(tmp->bwout,&tmp->head->target_name[tmp->ltid],&start,&stop,&res,single); + if(chck!=0){ + fprintf(stderr,"Error adding region to bw '%s:%"PRIu32"-%"PRIu32"\t%f'. Error code: %d.\n",tmp->head->target_name[tmp->ltid],start,stop,res,chck); + exit(1); + } + } + //} + tmp->ltid = tid; + tmp->lstart = pos; + tmp->lbaseprop = result; + } + tmp->lpos = pos; + return 0; +} + bigWigFile_t *initialise_bw_output(char *out_file, chromList_t *chromList){ //Open output file bigWigFile_t *fp = bwOpen(out_file, NULL, "w"); @@ -347,6 +417,13 @@ int main(int argc, char *argv[]){ uint32_t sta; uint32_t sto; char *contig; + + int (func*)(uint32_t tid, uint32_t position, int n, const bam_pileup1_t *pl, void *data, uint32_t reg_start); + func = &perbase_pileup_func; + if(is_overlap == 1){ + func = &perbase_pileup_func_overlap; + } + int i=0; for(i=0;i Date: Fri, 23 Feb 2018 16:20:30 +0000 Subject: [PATCH 02/13] Ensure hash is destroyed in pileup func --- c/bam2bwbases.c | 1 + 1 file changed, 1 insertion(+) diff --git a/c/bam2bwbases.c b/c/bam2bwbases.c index 1c97c06..3d8c435 100644 --- a/c/bam2bwbases.c +++ b/c/bam2bwbases.c @@ -270,6 +270,7 @@ static int perbase_pileup_func_overlap(uint32_t tid, uint32_t position, int n, c tmp->lbaseprop = result; } tmp->lpos = pos; + kh_destroy(strh, h); return 0; } From 9e607505f110c1188248964f5739ea3428d43c1c Mon Sep 17 00:00:00 2001 From: drjsanger Date: Fri, 23 Feb 2018 17:24:00 +0000 Subject: [PATCH 03/13] Changes to function pointer syntax --- c/bam2bedgraph.c | 3 +-- c/bam2bw.c | 3 +-- c/bam2bwbases.c | 3 +-- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/c/bam2bedgraph.c b/c/bam2bedgraph.c index 1e21277..28cf2e6 100644 --- a/c/bam2bedgraph.c +++ b/c/bam2bedgraph.c @@ -214,8 +214,7 @@ int main(int argc, char *argv[]){ check(out!=NULL,"Failed to open output file for %s writing.",output_file); tmp.out = out; int check = 0; - int (func*)(uint32_t tid, uint32_t position, int n, const bam_pileup1_t *pl, void *data); - func = &pileup_func + bw_func func = &pileup_func if(is_overlap == 1){ func = &pileup_func_overlap; } diff --git a/c/bam2bw.c b/c/bam2bw.c index 3417c54..c1686ed 100644 --- a/c/bam2bw.c +++ b/c/bam2bw.c @@ -429,8 +429,7 @@ int main(int argc, char *argv[]){ float cvg; //Now we generate the bw info int chck = 0; - int (func*)(uint32_t tid, uint32_t position, int n, const bam_pileup1_t *pl, void *data, uint32_t reg_start); - func = &pileup_func; + bw_func func = &pileup_func; if(is_overlap==1){ func = &pileup_func_overlap; } diff --git a/c/bam2bwbases.c b/c/bam2bwbases.c index 3d8c435..4d02b12 100644 --- a/c/bam2bwbases.c +++ b/c/bam2bwbases.c @@ -419,8 +419,7 @@ int main(int argc, char *argv[]){ uint32_t sto; char *contig; - int (func*)(uint32_t tid, uint32_t position, int n, const bam_pileup1_t *pl, void *data, uint32_t reg_start); - func = &perbase_pileup_func; + bw_func func = &perbase_pileup_func; if(is_overlap == 1){ func = &perbase_pileup_func_overlap; } From ac917809f5ad2a1fdcbd2eaa538da429dbf59c1c Mon Sep 17 00:00:00 2001 From: drjsanger Date: Fri, 23 Feb 2018 17:34:18 +0000 Subject: [PATCH 04/13] Missing semicolon --- c/bam2bedgraph.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/c/bam2bedgraph.c b/c/bam2bedgraph.c index 28cf2e6..edf8d65 100644 --- a/c/bam2bedgraph.c +++ b/c/bam2bedgraph.c @@ -214,7 +214,7 @@ int main(int argc, char *argv[]){ check(out!=NULL,"Failed to open output file for %s writing.",output_file); tmp.out = out; int check = 0; - bw_func func = &pileup_func + bw_func func = &pileup_func; if(is_overlap == 1){ func = &pileup_func_overlap; } From ab97587b27e332bc93ca16a602dc530a56e03344 Mon Sep 17 00:00:00 2001 From: drjsanger Date: Fri, 23 Feb 2018 18:24:56 +0000 Subject: [PATCH 05/13] Correct function types --- c/bam2bedgraph.c | 6 ++++-- c/bam2bw.c | 4 +++- c/bam2bwbases.c | 6 ++++-- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/c/bam2bedgraph.c b/c/bam2bedgraph.c index edf8d65..8d6e003 100644 --- a/c/bam2bedgraph.c +++ b/c/bam2bedgraph.c @@ -215,14 +215,16 @@ int main(int argc, char *argv[]){ tmp.out = out; int check = 0; bw_func func = &pileup_func; + bw_func_reg func_reg = &pileup_func; if(is_overlap == 1){ func = &pileup_func_overlap; + func_reg = &pileup_func_overlap; } if(region == NULL){ - check = process_bam_file(input_file,func, &tmp,filter,NULL); + check = process_bam_file(input_file, func, &tmp, filter, NULL); check(check==1,"Error parsing bam file."); }else{ - check = process_bam_region(input_file, func, &tmp, filter, region,NULL); + check = process_bam_region(input_file, func_reg, &tmp, filter, region, NULL); check(check==1,"Error parsing bam region."); } fprintf(out,"%s\t%d\t%d\t%d\n", tmp.head->target_name[tmp.ltid], tmp.lstart,tmp.lpos+1, tmp.lcoverage); diff --git a/c/bam2bw.c b/c/bam2bw.c index c1686ed..a5f9d09 100644 --- a/c/bam2bw.c +++ b/c/bam2bw.c @@ -430,12 +430,14 @@ int main(int argc, char *argv[]){ //Now we generate the bw info int chck = 0; bw_func func = &pileup_func; + bw_func_reg func_reg = &pileup_func; if(is_overlap==1){ func = &pileup_func_overlap; + func_reg = &pileup_func_overlap; } int i=0; for(i=0;i Date: Sat, 24 Feb 2018 08:36:49 +0000 Subject: [PATCH 06/13] Fix types of function in bam2bw* --- c/bam2bw.c | 2 -- c/bam2bwbases.c | 2 -- 2 files changed, 4 deletions(-) diff --git a/c/bam2bw.c b/c/bam2bw.c index a5f9d09..de55f4c 100644 --- a/c/bam2bw.c +++ b/c/bam2bw.c @@ -429,10 +429,8 @@ int main(int argc, char *argv[]){ float cvg; //Now we generate the bw info int chck = 0; - bw_func func = &pileup_func; bw_func_reg func_reg = &pileup_func; if(is_overlap==1){ - func = &pileup_func_overlap; func_reg = &pileup_func_overlap; } int i=0; diff --git a/c/bam2bwbases.c b/c/bam2bwbases.c index a3b0416..216adb5 100644 --- a/c/bam2bwbases.c +++ b/c/bam2bwbases.c @@ -419,10 +419,8 @@ int main(int argc, char *argv[]){ uint32_t sto; char *contig; - bw_func func = &perbase_pileup_func; bw_func_reg func_reg = &perbase_pileup_func; if(is_overlap==1){ - func = &perbase_pileup_func_overlap; func_reg = &perbase_pileup_func_overlap; } From 0ea29aff9954c6d1b5bda2d3907251b17850a619 Mon Sep 17 00:00:00 2001 From: David Jones Date: Sun, 25 Feb 2018 15:29:01 +0000 Subject: [PATCH 07/13] Correcting -> to . for object type. --- c/bam2bedgraph.c | 6 +++--- c/bam2bw.c | 6 +++--- c/bam2bwbases.c | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/c/bam2bedgraph.c b/c/bam2bedgraph.c index 8d6e003..e617991 100644 --- a/c/bam2bedgraph.c +++ b/c/bam2bedgraph.c @@ -177,11 +177,11 @@ static int pileup_func_overlap(uint32_t tid, uint32_t position, int n, const bam } int absent; //Testing overlapping reads - k = kh_put(strh, h, bam_get_qname(pl[i]->b), &absent); - uint8_t cbase = bam_seqi(bam_get_seq(pl[i]->b),pl[i]->qpos); + k = kh_put(strh, h, bam_get_qname(pl[i].b), &absent); + uint8_t cbase = bam_seqi(bam_get_seq(pl[i].b),pl[i].qpos); uint8_t pre_b; if(!absent){ //Read already processed to get base processed (we only increment if base is different between overlapping read pairs) - k = kh_get(strh, h, bam_get_qname(p->b)); + k = kh_get(strh, h, bam_get_qname(pl[i].b)); pre_b = kh_val(h,k); }else{ //Add the value to the hash diff --git a/c/bam2bw.c b/c/bam2bw.c index de55f4c..0e1249a 100644 --- a/c/bam2bw.c +++ b/c/bam2bw.c @@ -231,11 +231,11 @@ static int pileup_func_overlap(uint32_t tid, uint32_t position, int n, const bam } int absent; //Testing overlapping reads - k = kh_put(strh, h, bam_get_qname(pl[i]->b), &absent); - uint8_t cbase = bam_seqi(bam_get_seq(pl[i]->b),pl[i]->qpos); + k = kh_put(strh, h, bam_get_qname(pl[i].b), &absent); + uint8_t cbase = bam_seqi(bam_get_seq(pl[i].b),pl[i].qpos); uint8_t pre_b; if(!absent){ //Read already processed to get base processed (we only increment if base is different between overlapping read pairs) - k = kh_get(strh, h, bam_get_qname(p->b)); + k = kh_get(strh, h, bam_get_qname(pl[i].b)); pre_b = kh_val(h,k); }else{ //Add the value to the hash diff --git a/c/bam2bwbases.c b/c/bam2bwbases.c index 216adb5..9e1012c 100644 --- a/c/bam2bwbases.c +++ b/c/bam2bwbases.c @@ -229,12 +229,12 @@ static int perbase_pileup_func_overlap(uint32_t tid, uint32_t position, int n, c }else{ int absent; //Testing overlapping reads - k = kh_put(strh, h, bam_get_qname(pl[i]->b), &absent); - uint8_t cbase = bam_seqi(bam_get_seq(pl[i]->b),pl[i]->qpos); + k = kh_put(strh, h, bam_get_qname(pl[i].b), &absent); + uint8_t cbase = bam_seqi(bam_get_seq(pl[i].b),pl[i].qpos); uint8_t pre_b; if(!absent){ //Read already processed to get base processed (we only increment if base is different between overlapping read pairs) - k = kh_get(strh, h, bam_get_qname(p->b)); + k = kh_get(strh, h, bam_get_qname(pl[i].b)); pre_b = kh_val(h,k); }else{ //Add the value to the hash From ee08b3f61ba6cdbf3938296cf9f4d422bb1829a3 Mon Sep 17 00:00:00 2001 From: David Jones Date: Mon, 26 Feb 2018 12:08:22 +0000 Subject: [PATCH 08/13] Email and license date updated --- c/bam2bedgraph.c | 2 +- c/bam2bw.c | 2 +- c/bam2bwbases.c | 7 +++++-- c/bam_access.c | 4 ++-- c/bam_access.h | 4 ++-- c/bg2bw.c | 4 ++-- c/bwjoin.c | 4 ++-- c/catbw.c | 4 ++-- c/detectExtremeDepth.c | 2 +- c/utils.c | 4 ++-- c/utils.h | 4 ++-- 11 files changed, 22 insertions(+), 19 deletions(-) diff --git a/c/bam2bedgraph.c b/c/bam2bedgraph.c index e617991..b6eef25 100644 --- a/c/bam2bedgraph.c +++ b/c/bam2bedgraph.c @@ -1,7 +1,7 @@ /** LICENSE * Copyright (c) 2016-2018 Genome Research Ltd. * -* Author: Cancer Genome Project cgpit@sanger.ac.uk +* Author: Cancer Genome Project cgphelp@sanger.ac.uk * * This file is part of cgpBigWig. * diff --git a/c/bam2bw.c b/c/bam2bw.c index 0e1249a..4074bfc 100644 --- a/c/bam2bw.c +++ b/c/bam2bw.c @@ -1,7 +1,7 @@ /** LICENSE * Copyright (c) 2016-2018 Genome Research Ltd. * -* Author: Cancer Genome Project cgpit@sanger.ac.uk +* Author: Cancer Genome Project cgphelp@sanger.ac.uk * * This file is part of cgpBigWig. * diff --git a/c/bam2bwbases.c b/c/bam2bwbases.c index 9e1012c..1c7e61a 100644 --- a/c/bam2bwbases.c +++ b/c/bam2bwbases.c @@ -1,7 +1,7 @@ /** LICENSE * Copyright (c) 2016-2018 Genome Research Ltd. * -* Author: Cancer Genome Project cgpit@sanger.ac.uk +* Author: Cancer Genome Project cgphelp@sanger.ac.uk * * This file is part of cgpBigWig. * @@ -240,7 +240,10 @@ static int perbase_pileup_func_overlap(uint32_t tid, uint32_t position, int n, c //Add the value to the hash kh_value(h, k) = cbase; } - if(!absent && pre_b == cbase) continue; //Skip as we've already counted this base once in the overlapping reads + if(!absent && pre_b == cbase){ + coverage--; + continue; + } if(cbase == tmp->base_bit) base_coverage++; } } diff --git a/c/bam_access.c b/c/bam_access.c index 74c6a9c..3ce0a04 100644 --- a/c/bam_access.c +++ b/c/bam_access.c @@ -1,7 +1,7 @@ /** LICENSE -* Copyright (c) 2016 Genome Research Ltd. +* Copyright (c) 2016-2018 Genome Research Ltd. * -* Author: Cancer Genome Project cgpit@sanger.ac.uk +* Author: Cancer Genome Project cgphelp@sanger.ac.uk * * This file is part of cgpBigWig. * diff --git a/c/bam_access.h b/c/bam_access.h index c8b0aeb..a08556b 100644 --- a/c/bam_access.h +++ b/c/bam_access.h @@ -1,7 +1,7 @@ /** LICENSE -* Copyright (c) 2016 Genome Research Ltd. +* Copyright (c) 2016-2018 Genome Research Ltd. * -* Author: Cancer Genome Project cgpit@sanger.ac.uk +* Author: Cancer Genome Project cgphelp@sanger.ac.uk * * This file is part of cgpBigWig. * diff --git a/c/bg2bw.c b/c/bg2bw.c index 8458a49..f1ce3f0 100644 --- a/c/bg2bw.c +++ b/c/bg2bw.c @@ -1,7 +1,7 @@ /** LICENSE -* Copyright (c) 2016 Genome Research Ltd. +* Copyright (c) 2016-2018 Genome Research Ltd. * -* Author: Cancer Genome Project cgpit@sanger.ac.uk +* Author: Cancer Genome Project cgphelp@sanger.ac.uk * * This file is part of cgpBigWig. * diff --git a/c/bwjoin.c b/c/bwjoin.c index bb37520..6a7463a 100644 --- a/c/bwjoin.c +++ b/c/bwjoin.c @@ -1,7 +1,7 @@ /** LICENSE -* Copyright (c) 2016 Genome Research Ltd. +* Copyright (c) 2016-2018 Genome Research Ltd. * -* Author: Cancer Genome Project cgpit@sanger.ac.uk +* Author: Cancer Genome Project cgphelp@sanger.ac.uk * * This file is part of cgpBigWig. * diff --git a/c/catbw.c b/c/catbw.c index 4d77aa4..acf002e 100644 --- a/c/catbw.c +++ b/c/catbw.c @@ -1,7 +1,7 @@ /** LICENSE -* Copyright (c) 2016 Genome Research Ltd. +* Copyright (c) 2016-2018 Genome Research Ltd. * -* Author: Cancer Genome Project cgpit@sanger.ac.uk +* Author: Cancer Genome Project cgphelp@sanger.ac.uk * * This file is part of cgpBigWig. * diff --git a/c/detectExtremeDepth.c b/c/detectExtremeDepth.c index e9bd1d8..455e8ff 100644 --- a/c/detectExtremeDepth.c +++ b/c/detectExtremeDepth.c @@ -1,7 +1,7 @@ /** LICENSE * Copyright (c) 2017 Genome Research Ltd. * -* Author: Cancer Genome Project cgpit@sanger.ac.uk +* Author: Cancer Genome Project cgphelp@sanger.ac.uk * * This file is part of cgpBigWig. * diff --git a/c/utils.c b/c/utils.c index 657eba3..8e0aa33 100644 --- a/c/utils.c +++ b/c/utils.c @@ -1,7 +1,7 @@ /** LICENSE -* Copyright (c) 2016 Genome Research Ltd. +* Copyright (c) 2016-2018 Genome Research Ltd. * -* Author: Cancer Genome Project cgpit@sanger.ac.uk +* Author: Cancer Genome Project cgphelp@sanger.ac.uk * * This file is part of cgpBigWig. * diff --git a/c/utils.h b/c/utils.h index 2a6a0dd..250a7cf 100644 --- a/c/utils.h +++ b/c/utils.h @@ -1,7 +1,7 @@ /** LICENSE -* Copyright (c) 2016 Genome Research Ltd. +* Copyright (c) 2016-2018 Genome Research Ltd. * -* Author: Cancer Genome Project cgpit@sanger.ac.uk +* Author: Cancer Genome Project cgphelp@sanger.ac.uk * * This file is part of cgpBigWig. * From c8efa1722656081cd9c9e6cb086080fb24119491 Mon Sep 17 00:00:00 2001 From: David Jones Date: Mon, 26 Feb 2018 12:08:59 +0000 Subject: [PATCH 09/13] Email and license date updated. TOC used for table in README --- CHANGES.md | 1 + README.md | 32 ++++++++++++++++---------------- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 2c25106..650ce3d 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -6,6 +6,7 @@ - Add overlapping reads support to `bam2bw`, `bam2bwbases` and `bam2bedgraph` via commandline flag `--overlap` `-a` - If the same readname is encountered twice at a position it is considred an overlapping read pair. - Where the same base [ACGT] was encountered on each of the reads it will only be counted once. If a different base was encountered then the coverage count is incremented once for each base. +- Updated License headers with new email address ## 0.5.0 diff --git a/README.md b/README.md index 23a5344..72799f8 100644 --- a/README.md +++ b/README.md @@ -6,20 +6,20 @@ Package of C scripts for generation of [BigWig][BigWig] coverage files |-----------------------------------------------|----------------------------------------------| | [![Master Badge][travis-master]][travis-base] | [![Dev Badge][travis-develop]][travis-base] | -## Contents - -- [cgpBigWig](#cgpbigwig) - - [Contents](#contents) - - [Installation](#installation) - - [Docker](#docker-and-singularity) - - [Programs](#programs) - - [bwcat](#bwcat) - - [bwjoin](#bwjoin) - - [bam2bw](#bam2bw) - - [bg2bw](#bg2bw) - - [bam2bwbases](#bam2bwbases) - - [bam2bedgraph](#bam2bedgraph) - - [License](#license) + + +- [Installation](#installation) +- [Docker and Singularity](#docker-and-singularity) +- [Programs](#programs) + - [bwcat](#bwcat) + - [bwjoin](#bwjoin) + - [bam2bw](#bam2bw) + - [bg2bw](#bg2bw) + - [bam2bwbases](#bam2bwbases) + - [bam2bedgraph](#bam2bedgraph) +- [License](#license) + + ## Installation @@ -85,7 +85,7 @@ Other: -v --version Prints the version number. ``` -##### bam2bw +### bam2bw Generate bw coverage file from bam ``` Usage: bam2bw -i input.[b|cr]am -o output.bw @@ -164,7 +164,7 @@ Other: ``` Copyright (c) 2017-2018 Genome Research Ltd. -Author: David Jones +Author: David Jones This file is part of cgpBigWig. From b2b72bdf2568b17e23c0c93b8f65e322966b8799 Mon Sep 17 00:00:00 2001 From: David Jones Date: Mon, 26 Feb 2018 12:10:55 +0000 Subject: [PATCH 10/13] Test files for overlapping reads tests added. Test bam generated using 'wgsim -d 250 -1 150 -2 150 -N 5 MT.fasta read1.fq read2.fq' --- ...ig_overlap_bam2bwbases_no_overlap_expected.bw | Bin 0 -> 4394 bytes ..._overlap_bam2bwbases_with_overlap_expected.bw | Bin 0 -> 4394 bytes ...ig_overlap_bam2bwbases_no_overlap_expected.bw | Bin 0 -> 4363 bytes ..._overlap_bam2bwbases_with_overlap_expected.bw | Bin 0 -> 4363 bytes ...ig_overlap_bam2bwbases_no_overlap_expected.bw | Bin 0 -> 3541 bytes ..._overlap_bam2bwbases_with_overlap_expected.bw | Bin 0 -> 3541 bytes ...ig_overlap_bam2bwbases_no_overlap_expected.bw | Bin 0 -> 4140 bytes ..._overlap_bam2bwbases_with_overlap_expected.bw | Bin 0 -> 4140 bytes test_data/TEST_wsig_overlap.bam | Bin 0 -> 5181 bytes test_data/TEST_wsig_overlap.bam.bai | Bin 0 -> 1112 bytes ...T_wsig_overlap_bam2bg_no_overlap_expected.bed | 12 ++++++++++++ ...wsig_overlap_bam2bg_with_overlap_expected.bed | 14 ++++++++++++++ ...ST_wsig_overlap_bam2bw_no_overlap_expected.bw | Bin 0 -> 2373 bytes ..._wsig_overlap_bam2bw_with_overlap_expected.bw | Bin 0 -> 2385 bytes 14 files changed, 26 insertions(+) create mode 100644 test_data/A.TEST_wsig_overlap_bam2bwbases_no_overlap_expected.bw create mode 100644 test_data/A.TEST_wsig_overlap_bam2bwbases_with_overlap_expected.bw create mode 100644 test_data/C.TEST_wsig_overlap_bam2bwbases_no_overlap_expected.bw create mode 100644 test_data/C.TEST_wsig_overlap_bam2bwbases_with_overlap_expected.bw create mode 100644 test_data/G.TEST_wsig_overlap_bam2bwbases_no_overlap_expected.bw create mode 100644 test_data/G.TEST_wsig_overlap_bam2bwbases_with_overlap_expected.bw create mode 100644 test_data/T.TEST_wsig_overlap_bam2bwbases_no_overlap_expected.bw create mode 100644 test_data/T.TEST_wsig_overlap_bam2bwbases_with_overlap_expected.bw create mode 100644 test_data/TEST_wsig_overlap.bam create mode 100644 test_data/TEST_wsig_overlap.bam.bai create mode 100644 test_data/TEST_wsig_overlap_bam2bg_no_overlap_expected.bed create mode 100644 test_data/TEST_wsig_overlap_bam2bg_with_overlap_expected.bed create mode 100644 test_data/TEST_wsig_overlap_bam2bw_no_overlap_expected.bw create mode 100644 test_data/TEST_wsig_overlap_bam2bw_with_overlap_expected.bw diff --git a/test_data/A.TEST_wsig_overlap_bam2bwbases_no_overlap_expected.bw b/test_data/A.TEST_wsig_overlap_bam2bwbases_no_overlap_expected.bw new file mode 100644 index 0000000000000000000000000000000000000000..e463ee2b44899efb49cb25bcad17757bb9792120 GIT binary patch literal 4394 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 literal 0 HcmV?d00001 diff --git a/test_data/T.TEST_wsig_overlap_bam2bwbases_with_overlap_expected.bw b/test_data/T.TEST_wsig_overlap_bam2bwbases_with_overlap_expected.bw new file mode 100644 index 0000000000000000000000000000000000000000..a679744ca044811d7c2335b2160946e324e74dcd GIT binary patch literal 4140 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 literal 0 HcmV?d00001 diff --git a/test_data/TEST_wsig_overlap.bam b/test_data/TEST_wsig_overlap.bam new file mode 100644 index 0000000000000000000000000000000000000000..88f80dce8236be76d6727f97f01a7ef5b4f6189b GIT binary patch literal 5181 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 literal 0 HcmV?d00001 diff --git a/test_data/TEST_wsig_overlap_bam2bg_no_overlap_expected.bed b/test_data/TEST_wsig_overlap_bam2bg_no_overlap_expected.bed new file mode 100644 index 0000000..7262502 --- /dev/null +++ b/test_data/TEST_wsig_overlap_bam2bg_no_overlap_expected.bed @@ -0,0 +1,12 @@ +1 566396 566546 1 +MT 801 861 1 +MT 861 951 2 +MT 951 1011 1 +MT 3797 3947 1 +MT 3977 4127 1 +MT 6009 6159 1 +MT 11468 11577 1 +MT 11577 11618 2 +MT 11618 11727 1 +MT 14050 14200 1 +MT 14210 14360 1 diff --git a/test_data/TEST_wsig_overlap_bam2bg_with_overlap_expected.bed b/test_data/TEST_wsig_overlap_bam2bg_with_overlap_expected.bed new file mode 100644 index 0000000..9238a34 --- /dev/null +++ b/test_data/TEST_wsig_overlap_bam2bg_with_overlap_expected.bed @@ -0,0 +1,14 @@ +1 566396 566546 1 +MT 801 885 1 +MT 885 886 2 +MT 886 943 1 +MT 943 944 2 +MT 944 1011 1 +MT 3797 3947 1 +MT 3977 4127 1 +MT 6009 6159 1 +MT 11468 11612 1 +MT 11612 11613 2 +MT 11613 11727 1 +MT 14050 14200 1 +MT 14210 14360 1 diff --git a/test_data/TEST_wsig_overlap_bam2bw_no_overlap_expected.bw b/test_data/TEST_wsig_overlap_bam2bw_no_overlap_expected.bw new file mode 100644 index 0000000000000000000000000000000000000000..1e8f9741a4b6721d02a18d45dbd5e1ce8cf93055 GIT binary patch literal 2373 zcmdVc|5Fro7zgmZ+hf^-<3PhYOyn@66kPYSyL`C>Ji3HZFiK>=8HcMF(Cf?4Bn%bf zz`!`vprB;fz$g(4nm^Fwj5$qTuwRH#e>AP3=@+cYXmpx1h_v^IyU)Wl(?8J8zwbD^ipA=#vAo3waz#fHx=HGGc#tw&;{wk7pO;@cwev;VPgDf<7vs)>p2 z;nwEJU;f2&V}JPEHQ+zoJ=IbLjKdGVC43!y*dQz#q{6`WZi9s1>VvcU-6n}0tJOy@ z$6F*aR&|qg@i`<8tO~j(<8n!Oxtr`}Tpo#nRYRcFnNPwWVRO|5)knfBzWYT;Wx60I z76YDSl~K{WGt22x85JGRcZKF-85QkWJOar(EMjz1V;PV)j|j2Q#ac+*Q4-XX38{aN@*w6>i2WGF z(%3r49EpjT^$>Yb#OQ{`vLK@*CU#{*b{rQmCSo=~E|KWCx&~P{Bw{Sw!;O&39||!M z!$;x@iG@4HM`CP5#8~K^k3{)t5?qUqv3y2|iOhVAKUxypLq5h?pHK|)@G)*8(a{AT zM4Kjf_@AqF}vhQzf9Vd(1#NKZQnG6x{1-iZkFA@h@v zBmESEnzuljhDh)%N+8MyB$&)nh;3Mi4tWZ)a9RjM=BFX|J`-Y~)2)!%&q+|>Hpow3 zMTGf~rwr0KC1Mz!DgOPWU#<%=AlrE!5*@ui0~z>^@*r~sWcLgSuKq0Fb(8YoTF*gd z@@4Uqk$DGXY?mr+57g>t-IL)*4WbraPwR*(@wc4^Bg?0sAL46(EfUFN__6$?D)mOb5AZh| zKlt8sIeg|h&PF~D@(*$FT>tL*`IWM2T?>pKGu3UxPd*}8B=N7y4%KdW<`#hd2Hw|4khX=k)%f3I^-ClgrKHZA?%uvd2 jqCwFBFCe->QMBaXpYY{&p8J!Hv#YUDq4b3CV~sN6$2yM*c^-% zGwyJNP6DhOIG7@uqPa!OEzH@VFG~^I`o*wTYi`WVbfc|Q9HZV3_dE}`t$(0rgY)pZ zpXYNvpK~6b-HiF}PMcs6$}Pg;=!^_qm&>7R_;1yW5!#m2E`{a?%=o$gShp1Y|DRPv zg!eGJ!Tig!cx?=ZuAMgJiSVN1AfCWViSVN1 zA>Q+^Mi5@K9Wpt4-9~uP33OHEX&d21Cqnx2J4B7wybRL#>4d29nv)=Pb-!9QUh{HD z^K_h8j%#Q!ex@EB$b_Ya6AFEMgpa={}ATZ&ax)l`>4oRCu}GbCEBLRLVA zp5fwFNHXL~2@{2!9pr*~G9a}d@;r!n5@PM=F?kAk z3Q|A7#ZX8lWR8oDm@J4m$YNAYA=!}ATy(5j3)yj$#psB68ZyO2#oZN1<`9c9@C?^M zuAN|_BZh8?@3|OwVsuN4oMbTudZ$~W={Ej&N$?EmHqQQx#~=^g z#!XyQbV0ZA(E>|oZxAqT&tGLu=wqCIoprkhhzdXz0`niEd#+(AP#tcYq5r`yi(d znnK*jya{r+kH?_q&5))cE_fG35a~D|OeAKnMFi zU@;?U3>}Fd$wH6$MS>o2bkMbFV(3b9oHIXveeu&!u75ZG$_i07rhTLRy1Y%;oOHzL zC=~x#GnU^jiaxot(7N`WV0XY<)fVu+n^5t$QD>K~>^i8cv!ZisYQu@I#~Z8q0)Zn5 zH|8^jTJ`dUUZ>c;KjMoy9MWT-IKE*$vL0v|;XSgt1zV^OjoE~0q6DN$iSDW Fe*kjgd=mfw literal 0 HcmV?d00001 From e0db9e12ca404620024c84c6147a0733e215f032 Mon Sep 17 00:00:00 2001 From: David Jones Date: Mon, 26 Feb 2018 13:08:34 +0000 Subject: [PATCH 11/13] Email address and license dating updated. --- CODE_OF_CONDUCT.md | 2 +- c/c_tests/runtests.sh | 4 ++-- c/c_tests/test_1bwcat.sh | 4 ++-- c/c_tests/test_5bg2bw.sh | 4 ++-- c/c_tests/utils_tests.c | 4 ++-- setup.sh | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 05dbb46..580f629 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -34,7 +34,7 @@ This Code of Conduct applies both within project spaces and in public spaces whe ## Enforcement -Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at cgpit@sanger.ac.uk. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at cgphelp@sanger.ac.uk. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. diff --git a/c/c_tests/runtests.sh b/c/c_tests/runtests.sh index 10d1edf..77369e2 100755 --- a/c/c_tests/runtests.sh +++ b/c/c_tests/runtests.sh @@ -1,7 +1,7 @@ ########## LICENSE ########## -# Copyright (c) 2016 Genome Research Ltd. +# Copyright (c) 2016-2018 Genome Research Ltd. # -# Author: Cancer Genome Project cgpit@sanger.ac.uk +# Author: Cancer Genome Project cgphelp@sanger.ac.uk # # This file is part of cgpBigWig. # diff --git a/c/c_tests/test_1bwcat.sh b/c/c_tests/test_1bwcat.sh index 637a3b0..892393a 100755 --- a/c/c_tests/test_1bwcat.sh +++ b/c/c_tests/test_1bwcat.sh @@ -1,9 +1,9 @@ #!/bin/bash ########## LICENSE ########## -# Copyright (c) 2016 Genome Research Ltd. +# Copyright (c) 2016-2018 Genome Research Ltd. # -# Author: Cancer Genome Project cgpit@sanger.ac.uk +# Author: Cancer Genome Project cgphelp@sanger.ac.uk # # This file is part of cgpBigWig. # diff --git a/c/c_tests/test_5bg2bw.sh b/c/c_tests/test_5bg2bw.sh index 23dc60c..dde6ff8 100755 --- a/c/c_tests/test_5bg2bw.sh +++ b/c/c_tests/test_5bg2bw.sh @@ -1,9 +1,9 @@ #!/bin/bash ########## LICENSE ########## -# Copyright (c) 2016 Genome Research Ltd. +# Copyright (c) 2016-2018 Genome Research Ltd. # -# Author: Cancer Genome Project cgpit@sanger.ac.uk +# Author: Cancer Genome Project cgphelp@sanger.ac.uk # # This file is part of cgpBigWig. # diff --git a/c/c_tests/utils_tests.c b/c/c_tests/utils_tests.c index cbfe1db..0448580 100644 --- a/c/c_tests/utils_tests.c +++ b/c/c_tests/utils_tests.c @@ -1,7 +1,7 @@ /** LICENSE -* Copyright (c) 2016 Genome Research Ltd. +* Copyright (c) 2016-2018 Genome Research Ltd. * -* Author: Cancer Genome Project cgpit@sanger.ac.uk +* Author: Cancer Genome Project cgphelp@sanger.ac.uk * * This file is part of cgpBigWig. * diff --git a/setup.sh b/setup.sh index 398c832..b9ed89f 100755 --- a/setup.sh +++ b/setup.sh @@ -3,7 +3,7 @@ ########## LICENSE ########## # Copyright (c) 2016 Genome Research Ltd. # -# Author: Cancer Genome Project cgpit@sanger.ac.uk +# Author: Cancer Genome Project cgphelp@sanger.ac.uk # # This file is part of cgpBigWig. # From d74a6547520228de2d2932a0409560d13a63734b Mon Sep 17 00:00:00 2001 From: David Jones Date: Mon, 26 Feb 2018 13:08:54 +0000 Subject: [PATCH 12/13] Tests added for overlapping reads. --- c/c_tests/test_2bam2bw.sh | 72 ++++++++++++++++++++++++++++- c/c_tests/test_3bam2bedgraph.sh | 40 +++++++++++++++-- c/c_tests/test_4bam2bwbases.sh | 80 +++++++++++++++++++++++++++++++-- 3 files changed, 184 insertions(+), 8 deletions(-) diff --git a/c/c_tests/test_2bam2bw.sh b/c/c_tests/test_2bam2bw.sh index 8e3a7c0..aefbd0e 100755 --- a/c/c_tests/test_2bam2bw.sh +++ b/c/c_tests/test_2bam2bw.sh @@ -1,9 +1,9 @@ #!/bin/bash ########## LICENSE ########## -# Copyright (c) 2016 Genome Research Ltd. +# Copyright (c) 2016-2018 Genome Research Ltd. # -# Author: Cancer Genome Project cgpit@sanger.ac.uk +# Author: Cancer Genome Project cgphelp@sanger.ac.uk # # This file is part of cgpBigWig. # @@ -143,3 +143,71 @@ then fi rm -f ../test_data/tmp.out ../test_data/expected.tmp.out ../test_data/tmp.bw + +# Test without overlap +../bin/bam2bw -i ../test_data/TEST_wsig_overlap.bam -o ../test_data/tmp.bw; +if [ "$?" != "0" ]; +then + echo "ERROR in "$0": Running bam2bw overlap (no overlap)" + echo "------" + rm -f ../test_data/tmp.bw + exit 1 +fi + +../bin/bwcat -i ../test_data/tmp.bw > ../test_data/tmp.out +if [ "$?" != "0" ]; +then + echo "ERROR running ../bin/bwcat -i ../test_data/tmp.bw > ../test_data/tmp.out" + exit 1; +fi +../bin/bwcat -i ../test_data/TEST_wsig_overlap_bam2bw_no_overlap_expected.bw > ../test_data/expected.tmp.out +if [ "$?" != "0" ]; +then + echo "ERROR running ../bin/bwcat -i ../test_data/TEST_wsig_overlap_bam2bw_no_overlap_expected.bw > ../test_data/expected.tmp.out" + exit 1; +fi + +diff ../test_data/tmp.out ../test_data/expected.tmp.out +if [ "$?" != "0" ]; +then + echo "ERROR in "$0": Total file comparisons don't match" + echo "------" + rm -f ../test_data/tmp.out ../test_data/expected.tmp.out + exit 1 +fi + +rm -f ../test_data/tmp.out ../test_data/expected.tmp.out ../test_data/tmp.bw + +#Test with overlap +../bin/bam2bw -i ../test_data/TEST_wsig_overlap.bam -a -o ../test_data/tmp.bw; +if [ "$?" != "0" ]; +then + echo "ERROR in "$0": Running bam2bw overlap (no overlap)" + echo "------" + rm -f ../test_data/tmp.bw + exit 1 +fi + +../bin/bwcat -i ../test_data/tmp.bw > ../test_data/tmp.out +if [ "$?" != "0" ]; +then + echo "ERROR running ../bin/bwcat -i ../test_data/tmp.bw > ../test_data/tmp.out" + exit 1; +fi +../bin/bwcat -i ../test_data/TEST_wsig_overlap_bam2bw_with_overlap_expected.bw > ../test_data/expected.tmp.out +if [ "$?" != "0" ]; +then + echo "ERROR running ../bin/bwcat -i ../test_data/TEST_wsig_overlap_bam2bw_with_overlap_expected.bw > ../test_data/expected.tmp.out" + exit 1; +fi + +diff ../test_data/tmp.out ../test_data/expected.tmp.out +if [ "$?" != "0" ]; +then + echo "ERROR in "$0": Total file comparisons don't match" + echo "------" + rm -f ../test_data/tmp.out ../test_data/expected.tmp.out + exit 1 +fi + +rm -f ../test_data/tmp.out ../test_data/expected.tmp.out ../test_data/tmp.bw diff --git a/c/c_tests/test_3bam2bedgraph.sh b/c/c_tests/test_3bam2bedgraph.sh index fafde7c..ab37bde 100755 --- a/c/c_tests/test_3bam2bedgraph.sh +++ b/c/c_tests/test_3bam2bedgraph.sh @@ -1,9 +1,9 @@ #!/bin/bash ########## LICENSE ########## -# Copyright (c) 2016 Genome Research Ltd. +# Copyright (c) 2016-2018 Genome Research Ltd. # -# Author: Cancer Genome Project cgpit@sanger.ac.uk +# Author: Cancer Genome Project cgphelp@sanger.ac.uk # # This file is part of cgpBigWig. # @@ -53,4 +53,38 @@ then error_exit "ERROR in "$0" running ../test_data/tmp.bed ../test_data/volvox-sorted.coverage.expected.bed: Total bed file comparisons don't match"; fi -rm -f ../test_data/tmp.bed \ No newline at end of file +rm -f ../test_data/tmp.bed + +#Test without overlap +../bin/bam2bedgraph -i ../test_data/TEST_wsig_overlap.bam -o ../test_data/tmp.bed; +if [ "$?" != "0" ]; +then + rm -f ../test_data/tmp.bed + error_exit "ERROR in "$0": Running bam2bedgraph" +fi + +diff ../test_data/tmp.bed ../test_data/TEST_wsig_overlap_bam2bg_no_overlap_expected.bed; +if [ "$?" != "0" ]; +then + rm -f ../test_data/tmp.bed; + error_exit "ERROR in "$0" running ../test_data/tmp.bed ../test_data/TEST_wsig_overlap_bam2bg_no_overlap.bed: Total bed file comparisons don't match"; +fi + +rm -f ../test_data/tmp.bed + +#Test with overlap +../bin/bam2bedgraph -i ../test_data/TEST_wsig_overlap.bam -a -o ../test_data/tmp.bed; +if [ "$?" != "0" ]; +then + rm -f ../test_data/tmp.bed + error_exit "ERROR in "$0": Running bam2bedgraph" +fi + +diff ../test_data/tmp.bed ../test_data/TEST_wsig_overlap_bam2bg_with_overlap_expected.bed; +if [ "$?" != "0" ]; +then + rm -f ../test_data/tmp.bed; + error_exit "ERROR in "$0" running ../test_data/tmp.bed ../test_data/TEST_wsig_overlap_bam2bg_with_overlap.bed: Total bed file comparisons don't match"; +fi + +rm -f ../test_data/tmp.bed diff --git a/c/c_tests/test_4bam2bwbases.sh b/c/c_tests/test_4bam2bwbases.sh index 62034da..82fbdae 100755 --- a/c/c_tests/test_4bam2bwbases.sh +++ b/c/c_tests/test_4bam2bwbases.sh @@ -1,9 +1,9 @@ #!/bin/bash ########## LICENSE ########## -# Copyright (c) 2016 Genome Research Ltd. +# Copyright (c) 2016-2018 Genome Research Ltd. # -# Author: Cancer Genome Project cgpit@sanger.ac.uk +# Author: Cancer Genome Project cgphelp@sanger.ac.uk # # This file is part of cgpBigWig. # @@ -84,4 +84,78 @@ done rm -f ../test_data/*tmp.bases.bw; rm -f ../test_data/*.bases.got.bed; -rm -f ../test_data/*.bases.exp.bed; \ No newline at end of file +rm -f ../test_data/*.bases.exp.bed; + +#Test without overlap +../bin/bam2bwbases -i ../test_data/TEST_wsig_overlap.bam -o ../test_data/tmp.bases.bw -F3844; +if [ "$?" != "0" ]; +then + rm -f ../test_data/*tmp.bases.bw; + error_exit "ERROR in "$0": Running bam2bwbases" +fi + +for b in ${bases[@]} +do + ../bin/bwcat -i ../test_data/$b.TEST_wsig_overlap_bam2bwbases_no_overlap_expected.bw > ../test_data/$b.bases.exp.bed; + if [ "$?" != "0" ]; + then + error_exit "ERROR running ../bin/bwcat -i ../test_data/$b.TEST_wsig_overlap_bam2bwbases_no_overlap_expected.bw > ../test_data/$b.bases.exp.bed"; + fi + + ../bin/bwcat -i ../test_data/$b.tmp.bases.bw > ../test_data/$b.bases.got.bed; + if [ "$?" != "0" ]; + then + error_exit "ERROR running ../bin/bwcat -i ../test_data/$b.tmp.bases.bw > ../test_data/$b.bases.got.bed"; + fi + + diff ../test_data/$b.bases.exp.bed ../test_data/$b.bases.got.bed; + if [ "$?" != "0" ]; + then + rm -f ../test_data/*tmp.bases.bw; + rm -f ../test_data/*.bases.got.bed; + rm -f ../test_data/*.bases.exp.bed; + error_exit "ERROR in "$0" running diff for bases ../test_data/$b.bases.exp.bed ../test_data/$b.bases.got.bed : Region bed file comparisons don't match"; + fi +done + + +rm -f ../test_data/*tmp.bases.bw; +rm -f ../test_data/*.bases.got.bed; +rm -f ../test_data/*.bases.exp.bed; + + +#Test with overlap +../bin/bam2bwbases -i ../test_data/TEST_wsig_overlap.bam -a -o ../test_data/tmp.bases.bw -F3844; +if [ "$?" != "0" ]; +then + rm -f ../test_data/*tmp.bases.bw; + error_exit "ERROR in "$0": Running bam2bwbases" +fi + +for b in ${bases[@]} +do + ../bin/bwcat -i ../test_data/$b.TEST_wsig_overlap_bam2bwbases_with_overlap_expected.bw > ../test_data/$b.bases.exp.bed; + if [ "$?" != "0" ]; + then + error_exit "ERROR running ../bin/bwcat -i ../test_data/$b.TEST_wsig_overlap_bam2bwbases_with_overlap_expected.bw > ../test_data/$b.bases.exp.bed"; + fi + + ../bin/bwcat -i ../test_data/$b.tmp.bases.bw > ../test_data/$b.bases.got.bed; + if [ "$?" != "0" ]; + then + error_exit "ERROR running ../bin/bwcat -i ../test_data/$b.tmp.bases.bw > ../test_data/$b.bases.got.bed"; + fi + + diff ../test_data/$b.bases.exp.bed ../test_data/$b.bases.got.bed; + if [ "$?" != "0" ]; + then + rm -f ../test_data/*tmp.bases.bw; + rm -f ../test_data/*.bases.got.bed; + rm -f ../test_data/*.bases.exp.bed; + error_exit "ERROR in "$0" running diff for bases ../test_data/$b.bases.exp.bed ../test_data/$b.bases.got.bed : Region bed file comparisons don't match"; + fi +done + +rm -f ../test_data/*tmp.bases.bw; +rm -f ../test_data/*.bases.got.bed; +rm -f ../test_data/*.bases.exp.bed; From a907f0b340f212ebb6c7344ac543b3b7b3100aa7 Mon Sep 17 00:00:00 2001 From: David Jones Date: Mon, 26 Feb 2018 15:45:23 +0000 Subject: [PATCH 13/13] Version and CHANGES.md updated for release --- CHANGES.md | 4 ++-- VERSION.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 650ce3d..91f394d 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,12 +1,12 @@ # CHANGES -## NEXT +## 1.0.0 - First full release - Add overlapping reads support to `bam2bw`, `bam2bwbases` and `bam2bedgraph` via commandline flag `--overlap` `-a` - If the same readname is encountered twice at a position it is considred an overlapping read pair. - Where the same base [ACGT] was encountered on each of the reads it will only be counted once. If a different base was encountered then the coverage count is incremented once for each base. -- Updated License headers with new email address +- Updated License headers with new email address ## 0.5.0 diff --git a/VERSION.txt b/VERSION.txt index 8f0916f..3eefcb9 100644 --- a/VERSION.txt +++ b/VERSION.txt @@ -1 +1 @@ -0.5.0 +1.0.0