annotate bigwig2summary.sh @ 11:58033d0a952b draft

Uploaded
author nikos
date Wed, 03 Sep 2014 08:30:01 -0400
parents ad32956798e3
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8
ad32956798e3 Uploaded
nikos
parents:
diff changeset
1 #!/bin/bash
ad32956798e3 Uploaded
nikos
parents:
diff changeset
2 # $Id: bigwig2summary_stdout 34 2014-02-20 08:31:20Z jens $
ad32956798e3 Uploaded
nikos
parents:
diff changeset
3
ad32956798e3 Uploaded
nikos
parents:
diff changeset
4 #USE IN GALAXY
ad32956798e3 Uploaded
nikos
parents:
diff changeset
5 #This script extract summary values (mean, min, max, std or coverage) from a bigwig file for a number of equal sized bins across genomic regions given in bed file.
ad32956798e3 Uploaded
nikos
parents:
diff changeset
6 #If the bed file contains 6 columns (or more), column 6 is expected to contain strand information. Summary values from a negative strand will be reversed.
ad32956798e3 Uploaded
nikos
parents:
diff changeset
7
ad32956798e3 Uploaded
nikos
parents:
diff changeset
8 ########################################
ad32956798e3 Uploaded
nikos
parents:
diff changeset
9 #bigwigSummary has 3 non-standard outputs:
ad32956798e3 Uploaded
nikos
parents:
diff changeset
10 #1) n/a #(no data in bin)
ad32956798e3 Uploaded
nikos
parents:
diff changeset
11 #2) no data #(no data in entire region)
ad32956798e3 Uploaded
nikos
parents:
diff changeset
12 #3) <number> is not a valid option (typically if negative coordinate)
ad32956798e3 Uploaded
nikos
parents:
diff changeset
13
ad32956798e3 Uploaded
nikos
parents:
diff changeset
14 #Default settings & input parsing. "" indicates required user input.
ad32956798e3 Uploaded
nikos
parents:
diff changeset
15 nbins=1
ad32956798e3 Uploaded
nikos
parents:
diff changeset
16 rm_header_line=0
ad32956798e3 Uploaded
nikos
parents:
diff changeset
17 summary_type=mean
ad32956798e3 Uploaded
nikos
parents:
diff changeset
18
ad32956798e3 Uploaded
nikos
parents:
diff changeset
19 #parse input
ad32956798e3 Uploaded
nikos
parents:
diff changeset
20 while getopts hef:b:o:n:t: myarg
ad32956798e3 Uploaded
nikos
parents:
diff changeset
21 do case "$myarg" in
ad32956798e3 Uploaded
nikos
parents:
diff changeset
22 h) echo "Usage: bigwig2summary_stdout -f <BIGWIG_FILE> -b <BED_FILE> -o <ASSEMBLY> -n <NUMBER OF BINS> -t <SUMMARY TYPE> -e"
ad32956798e3 Uploaded
nikos
parents:
diff changeset
23 echo "Corrects for strand if bed-file has 6 columns or more. Col 6 assumed to contain strand infomation"
ad32956798e3 Uploaded
nikos
parents:
diff changeset
24 exit ;;
ad32956798e3 Uploaded
nikos
parents:
diff changeset
25 f) bigwig_file="$OPTARG" ;;
ad32956798e3 Uploaded
nikos
parents:
diff changeset
26 b) bed_file="$OPTARG" ;; #must be tab separated without header
ad32956798e3 Uploaded
nikos
parents:
diff changeset
27 o) org_assembly="$OPTARG" ;;
ad32956798e3 Uploaded
nikos
parents:
diff changeset
28 n) nbins="$OPTARG" ;;
ad32956798e3 Uploaded
nikos
parents:
diff changeset
29 t) summary_type="$OPTARG" ;;
ad32956798e3 Uploaded
nikos
parents:
diff changeset
30 e) rm_header_line=2 ;; #flag. if -e then first line is removed
ad32956798e3 Uploaded
nikos
parents:
diff changeset
31 [?]) echo "Usage: bigwig2summary_stdout -f <BIGWIG_FILE> -b <BED_FILE> -o <ASSEMBLY> -n <NUMBER OF BINS> -t <SUMMARY TYPE> -e"
ad32956798e3 Uploaded
nikos
parents:
diff changeset
32 echo "Corrects for strand if bed-file has 6 columns or more. Col 6 assumed to contain strand infomation"
ad32956798e3 Uploaded
nikos
parents:
diff changeset
33 exit 1 ;;
ad32956798e3 Uploaded
nikos
parents:
diff changeset
34 esac
ad32956798e3 Uploaded
nikos
parents:
diff changeset
35 done
ad32956798e3 Uploaded
nikos
parents:
diff changeset
36
ad32956798e3 Uploaded
nikos
parents:
diff changeset
37 ###################################################
ad32956798e3 Uploaded
nikos
parents:
diff changeset
38 ###VALIDATE INPUT
ad32956798e3 Uploaded
nikos
parents:
diff changeset
39 ###################################################
ad32956798e3 Uploaded
nikos
parents:
diff changeset
40
ad32956798e3 Uploaded
nikos
parents:
diff changeset
41 #get chromosome sizes from bigwig file. bigwig file does not contain name of genome assembly.
ad32956798e3 Uploaded
nikos
parents:
diff changeset
42 org_assembly_file=`mktemp -u`
ad32956798e3 Uploaded
nikos
parents:
diff changeset
43 fetchChromSizes $org_assembly 2>/dev/null > $org_assembly_file
ad32956798e3 Uploaded
nikos
parents:
diff changeset
44 if [ $? -ne 0 ]; then
ad32956798e3 Uploaded
nikos
parents:
diff changeset
45 echo "ERROR: Organism genome assembly does not exist"
ad32956798e3 Uploaded
nikos
parents:
diff changeset
46 rm $org_assembly_file
ad32956798e3 Uploaded
nikos
parents:
diff changeset
47 exit
ad32956798e3 Uploaded
nikos
parents:
diff changeset
48 fi
ad32956798e3 Uploaded
nikos
parents:
diff changeset
49
ad32956798e3 Uploaded
nikos
parents:
diff changeset
50 #check input bed_file. bedClip only checks first 3 columns!
ad32956798e3 Uploaded
nikos
parents:
diff changeset
51 if [ `bedClip -verbose=2 <(tail -n +${rm_header_line} $bed_file) $org_assembly_file /dev/null 2>&1 | wc -l` -gt 0 ]; then
ad32956798e3 Uploaded
nikos
parents:
diff changeset
52 echo -e "ERROR: Input bed file is not in proper format!\nTry 'bedClip' to find lines causing error"
ad32956798e3 Uploaded
nikos
parents:
diff changeset
53 echo "Make sure that bigwig and bed files are using the same genome assembly"
ad32956798e3 Uploaded
nikos
parents:
diff changeset
54 exit 1
ad32956798e3 Uploaded
nikos
parents:
diff changeset
55 fi
ad32956798e3 Uploaded
nikos
parents:
diff changeset
56
ad32956798e3 Uploaded
nikos
parents:
diff changeset
57 #make string of "nbins" 0's to insert in regions, where no reads are found
ad32956798e3 Uploaded
nikos
parents:
diff changeset
58 if [ $nbins -gt 1 ]; then
ad32956798e3 Uploaded
nikos
parents:
diff changeset
59 seq_string=`seq 1 $nbins`
ad32956798e3 Uploaded
nikos
parents:
diff changeset
60 zero_string=`printf "0\t%.s" {$seq_string} | perl -pe "s/\t$//"`
ad32956798e3 Uploaded
nikos
parents:
diff changeset
61 fi
ad32956798e3 Uploaded
nikos
parents:
diff changeset
62
ad32956798e3 Uploaded
nikos
parents:
diff changeset
63 #make sure the given summary type exists
ad32956798e3 Uploaded
nikos
parents:
diff changeset
64 if [ `echo $summary_type | egrep "(mean|max|min|std|coverage)" | wc -l` -ne 1 ]; then
ad32956798e3 Uploaded
nikos
parents:
diff changeset
65 echo "ERROR: Summary type must be: mean, max, min, std or coverage. Default is 'mean'"
ad32956798e3 Uploaded
nikos
parents:
diff changeset
66 exit 1
ad32956798e3 Uploaded
nikos
parents:
diff changeset
67 fi
ad32956798e3 Uploaded
nikos
parents:
diff changeset
68
ad32956798e3 Uploaded
nikos
parents:
diff changeset
69 #determine number of fields in bed_file
ad32956798e3 Uploaded
nikos
parents:
diff changeset
70 if [ `tail -n +${rm_header_line} $bed_file | awk '{print NF}' | uniq | wc -l` -eq 1 ]; then
ad32956798e3 Uploaded
nikos
parents:
diff changeset
71 nfields_bed=`tail -n +${rm_header_line} $bed_file | awk '{print NF}' | uniq`
ad32956798e3 Uploaded
nikos
parents:
diff changeset
72 else
ad32956798e3 Uploaded
nikos
parents:
diff changeset
73 echo "ERROR: Bed file does not have constant number of line columns"
ad32956798e3 Uploaded
nikos
parents:
diff changeset
74 exit 1
ad32956798e3 Uploaded
nikos
parents:
diff changeset
75 fi
ad32956798e3 Uploaded
nikos
parents:
diff changeset
76
ad32956798e3 Uploaded
nikos
parents:
diff changeset
77 if [[ $nbins -gt 1 && $nfields_bed -ge 6 ]]; then
ad32956798e3 Uploaded
nikos
parents:
diff changeset
78 strand_uniq_chars=`tail -n +${rm_header_line} $bed_file | cut -f6 | sort -u | perl -pe "s/\n//"`
ad32956798e3 Uploaded
nikos
parents:
diff changeset
79 if [[ $strand_uniq_chars != "+-" && $strand_uniq_chars != "-+" ]] ; then
ad32956798e3 Uploaded
nikos
parents:
diff changeset
80 echo "ERROR: Column 6 in bed file must only contain '+' or '-' characters"
ad32956798e3 Uploaded
nikos
parents:
diff changeset
81 exit 1
ad32956798e3 Uploaded
nikos
parents:
diff changeset
82 fi
ad32956798e3 Uploaded
nikos
parents:
diff changeset
83 fi
ad32956798e3 Uploaded
nikos
parents:
diff changeset
84
ad32956798e3 Uploaded
nikos
parents:
diff changeset
85 ###################################################
ad32956798e3 Uploaded
nikos
parents:
diff changeset
86 ###EXTRACT DENSITIES FROM NORMALIZED BIGWIG FILE
ad32956798e3 Uploaded
nikos
parents:
diff changeset
87 ###################################################
ad32956798e3 Uploaded
nikos
parents:
diff changeset
88
ad32956798e3 Uploaded
nikos
parents:
diff changeset
89
ad32956798e3 Uploaded
nikos
parents:
diff changeset
90 #if more than 1 bin AND >= 6 fields (i.e. has strand column)
ad32956798e3 Uploaded
nikos
parents:
diff changeset
91 if [[ $nbins -gt 1 && $nfields_bed -ge 6 ]]; then
ad32956798e3 Uploaded
nikos
parents:
diff changeset
92
ad32956798e3 Uploaded
nikos
parents:
diff changeset
93 #cut columns 1-3+6 | rm header if flag set
ad32956798e3 Uploaded
nikos
parents:
diff changeset
94 cut -f1-3,6 $bed_file | tail -n +${rm_header_line} | while read -r line; do
ad32956798e3 Uploaded
nikos
parents:
diff changeset
95
ad32956798e3 Uploaded
nikos
parents:
diff changeset
96 #read 4 fields into variables
ad32956798e3 Uploaded
nikos
parents:
diff changeset
97 read -r cur_chr cur_start cur_end cur_strand <<<"$line"
ad32956798e3 Uploaded
nikos
parents:
diff changeset
98 #run bigWigSummary. Combine stdout and stderr | treat exceptions and errors after 'done'
ad32956798e3 Uploaded
nikos
parents:
diff changeset
99 bigWigSummary $bigwig_file $cur_chr $cur_start $cur_end $nbins -type=${summary_type} 2>&1 | perl -pe "s/no data.+$/${zero_string}/" | awk 'BEGIN{OFS="\t"}{ if("'"$cur_strand"'"=="-") { for (i=NF; i>0; i--) { printf("%s\t",$i) } printf("\n") } else { print $0 } }'
ad32956798e3 Uploaded
nikos
parents:
diff changeset
100 done | perl -pe "s/n\/a/0/g" | perl -pe "s/^\t?0\t?$/${zero_string}/" | perl -pe "s/ +/\t/g" | perl -pe "s/\t$//" | sed '/^$/d'
ad32956798e3 Uploaded
nikos
parents:
diff changeset
101
ad32956798e3 Uploaded
nikos
parents:
diff changeset
102 #if more than 1 bin AND less than 6 fields (i.e. no strand column)
ad32956798e3 Uploaded
nikos
parents:
diff changeset
103 elif [[ $nbins -gt 1 && $nfields_bed -lt 6 ]]; then
ad32956798e3 Uploaded
nikos
parents:
diff changeset
104
ad32956798e3 Uploaded
nikos
parents:
diff changeset
105 #cut columns 1-3 | rm header if flag set
ad32956798e3 Uploaded
nikos
parents:
diff changeset
106 cut -f1-3 $bed_file | tail -n +${rm_header_line} | while read -r line; do
ad32956798e3 Uploaded
nikos
parents:
diff changeset
107
ad32956798e3 Uploaded
nikos
parents:
diff changeset
108 #read 3 fields into variables
ad32956798e3 Uploaded
nikos
parents:
diff changeset
109 read -r cur_chr cur_start cur_end <<<"$line"
ad32956798e3 Uploaded
nikos
parents:
diff changeset
110 #run bigWigSummary. Combine stdout and stderr | treat exceptions and errors after 'done'
ad32956798e3 Uploaded
nikos
parents:
diff changeset
111 bigWigSummary $bigwig_file $cur_chr $cur_start $cur_end $nbins -type=${summary_type} 2>&1
ad32956798e3 Uploaded
nikos
parents:
diff changeset
112
ad32956798e3 Uploaded
nikos
parents:
diff changeset
113 done | perl -pe "s/n\/a/0/g" | perl -pe "s/no data.+$/${zero_string}/" | perl -pe "s/^\t?0\t?$/${zero_string}/" | perl -pe "s/ +/\t/g" | sed '/^$/d'
ad32956798e3 Uploaded
nikos
parents:
diff changeset
114
ad32956798e3 Uploaded
nikos
parents:
diff changeset
115
ad32956798e3 Uploaded
nikos
parents:
diff changeset
116 #if 1 bin. Strand column irrelevant
ad32956798e3 Uploaded
nikos
parents:
diff changeset
117 else
ad32956798e3 Uploaded
nikos
parents:
diff changeset
118
ad32956798e3 Uploaded
nikos
parents:
diff changeset
119 cut -f1-3 $bed_file | tail -n +${rm_header_line} | while read -r line; do
ad32956798e3 Uploaded
nikos
parents:
diff changeset
120
ad32956798e3 Uploaded
nikos
parents:
diff changeset
121 read -r cur_chr cur_start cur_end <<<"$line"
ad32956798e3 Uploaded
nikos
parents:
diff changeset
122 bigWigSummary $bigwig_file $cur_chr $cur_start $cur_end 1 -type=${summary_type} 2>&1
ad32956798e3 Uploaded
nikos
parents:
diff changeset
123
ad32956798e3 Uploaded
nikos
parents:
diff changeset
124 done | perl -pe "s/no data.+$/0/" | perl -pe "s/n\/a/0/g" | sed '/^$/d'
ad32956798e3 Uploaded
nikos
parents:
diff changeset
125
ad32956798e3 Uploaded
nikos
parents:
diff changeset
126 fi
ad32956798e3 Uploaded
nikos
parents:
diff changeset
127
ad32956798e3 Uploaded
nikos
parents:
diff changeset
128
ad32956798e3 Uploaded
nikos
parents:
diff changeset
129
ad32956798e3 Uploaded
nikos
parents:
diff changeset
130
ad32956798e3 Uploaded
nikos
parents:
diff changeset
131