annotate Snakefile @ 16:d2770bc432e1 draft

Uploaded
author chrisw
date Wed, 13 Feb 2019 18:39:50 -0500
parents 3fa68a0d59c5
children de65ca585930
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
1 """
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
2 Parameters:
16
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
3 - fastq_dump_args: arguments to pass to fastq dumping tool
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
4 - fastq_dump_retries: number of retry attempts before dying
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
5 - fastq_dump_tool: name of tool to run, e.g. 'fastq-dump' or 'fasterq-dump'
10
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
6 - star: arguments to pass to STAR aligner
16
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
7 - salmon_args: arguments to pass to salmon quant
10
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
8 - unique_qual: minimum MAPQ needed to be counted in unique BW [default: 10]
16
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
9 - bw_bed: name of BED file to use with bwtool
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
10 - max_unalign: maximum number of unaligned reads to save per run accession
10
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
11 """
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
12
16
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
13 STEPS = ['download', 'fastq_check', 'align', 'sort',
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
14 'bamcount',
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
15 'salmon',
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
16 'align_unmapped',
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
17 'extract_jx']
10
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
18
16
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
19 FILES = ['sjout.zst', 'fastq_check.tsv.zst',
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
20 'unmapped.bam', 'unmapped.fastq.zst',
10
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
21 'bamcount_nonref.csv.zst',
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
22 'bamcount_auc.tsv',
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
23 'bamcount_frag.tsv',
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
24 'Chimeric.out.junction.zst',
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
25 'all.exon_bw_count.zst', 'unique.exon_bw_count.zst',
16
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
26 'all.bw.zst', 'unique.bw.zst',
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
27 'salmon.tsv.zst',
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
28 'jx_bed.zst',
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
29 'manifest'] + list(map(lambda x: x + '.log', STEPS))
10
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
30
14
f2258de365ee Uploaded
chrisw
parents: 13
diff changeset
31 #get rid of the pesky warnings about current paths
f2258de365ee Uploaded
chrisw
parents: 13
diff changeset
32 #and make sure we're not assuming any wrong relative paths
12
849ab444b4f1 Uploaded
chrisw
parents: 11
diff changeset
33 import os
849ab444b4f1 Uploaded
chrisw
parents: 11
diff changeset
34 config['output']=os.path.abspath(config['output'])
13
af1f49e5242d Uploaded
chrisw
parents: 12
diff changeset
35 config['temp']=os.path.abspath(config['temp'])
14
f2258de365ee Uploaded
chrisw
parents: 13
diff changeset
36 config['exon_bed']=os.path.abspath(config['exon_bed'])
f2258de365ee Uploaded
chrisw
parents: 13
diff changeset
37 config['ref']=os.path.abspath(config['ref'])
12
849ab444b4f1 Uploaded
chrisw
parents: 11
diff changeset
38
10
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
39 import subprocess
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
40 def run_command(cmd_args):
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
41 cmd_args = ' '.join(cmd_args)
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
42 try:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
43 subprocess.check_call(args=cmd_args, shell=True)
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
44 except subprocess.CalledProcessError as cpe:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
45 sys.stderr.write("error in run_command for command: %s\n" % cmd_args)
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
46 raise cpe
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
47
16
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
48 import re
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
49 STEPS_FILES_FILTER=re.compile(r'(unmapped)|(download)|(salmon)|(extract_jx)|(jx_bed)|(manifest)')
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
50 def remove_steps_files():
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
51 #modify STEP and FILES
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
52 #so we don't run download or unmapped steps
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
53 global FILES
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
54 global STEPS
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
55 for i in reversed(range(0,len(STEPS))):
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
56 f = STEPS[i]
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
57 if STEPS_FILES_FILTER.search(f):
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
58 del(STEPS[i])
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
59 for i in reversed(range(0,len(FILES))):
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
60 f = FILES[i]
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
61 if STEPS_FILES_FILTER.search(f):
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
62 del(FILES[i])
10
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
63
16
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
64
11
35ed7314038d Uploaded
chrisw
parents: 10
diff changeset
65 FASTQ_PATT=re.compile(r'([^_\.]+)(_(\d+))?\.((fastq)|fq)(\.gz)?$')
10
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
66 def prep_for_galaxy_run():
16
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
67 remove_steps_files()
10
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
68 try:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
69 os.mkdir(config['temp'])
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
70 except OSError as ose:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
71 pass
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
72 fastqs = config['inputs'].split(',')
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
73 m = FASTQ_PATT.search(fastqs[0])
11
35ed7314038d Uploaded
chrisw
parents: 10
diff changeset
74 run_acc = 'sample'
35ed7314038d Uploaded
chrisw
parents: 10
diff changeset
75 if m is not None:
35ed7314038d Uploaded
chrisw
parents: 10
diff changeset
76 run_acc = m.group(1)
12
849ab444b4f1 Uploaded
chrisw
parents: 11
diff changeset
77 study_acc = 'study'
10
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
78 if 'study' in config:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
79 study_acc = config['study']
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
80 genome = 'hg38'
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
81 if 'genome' in config:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
82 genome = config['genome']
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
83 method = 'sra'
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
84 # SRR,SRP,genome
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
85 # e.g. SRR1557855,SRP045778,ce10
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
86 #create links which will be used in the align step
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
87 i = 1
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
88 for f in fastqs:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
89 newf = '%s/%s_%s_%s_%s_%d.fastq' % (config['temp'], run_acc, study_acc, genome, method, i)
15
3fa68a0d59c5 Uploaded
chrisw
parents: 14
diff changeset
90 if 'compressed' in config:
3fa68a0d59c5 Uploaded
chrisw
parents: 14
diff changeset
91 run_command(['zcat',f,'>',newf])
3fa68a0d59c5 Uploaded
chrisw
parents: 14
diff changeset
92 else:
3fa68a0d59c5 Uploaded
chrisw
parents: 14
diff changeset
93 os.symlink(os.path.abspath(f), newf)
10
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
94 #create fastq 0
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
95 if i == 1:
15
3fa68a0d59c5 Uploaded
chrisw
parents: 14
diff changeset
96 os.symlink(os.path.abspath(newf), '%s/%s_%s_%s_%s_%d.fastq' % (config['temp'], run_acc, study_acc, genome, method, 0))
10
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
97 i += 1
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
98 #create fastq 2 if not paired
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
99 if i == 2:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
100 open('%s/%s_%s_%s_%s_%d.fastq' % (config['temp'], run_acc, study_acc, genome, method, 2), "w").close()
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
101 #create expected file structure for annotated exon bed file & reference index
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
102 ref = config['ref']
16
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
103 config['ref'] = os.path.abspath('.')
10
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
104 os.makedirs('%s/%s' % (config['ref'], genome))
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
105 os.symlink(ref, '%s/%s/star_idx' % (config['ref'], genome))
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
106 os.makedirs('%s/%s/gtf' % (config['ref'], genome))
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
107 os.symlink(config['exon_bed'], 'exons.tmp')
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
108 os.symlink('../../exons.tmp', '%s/%s/gtf/%s' % (config['ref'], genome, config.get('bw_bed', 'exons.bed')))
16
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
109 #TODO may need to add additional symlinking for HISAT2 unmapped alignments
10
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
110 return([run_acc, study_acc, genome, method])
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
111
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
112
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
113 def get_accessions(wildcards):
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
114 """
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
115 Grouping of SRRs with the same SRP could happen here
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
116 """
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
117 #if running under galaxy where the user will input the
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
118 #FASTQs, study, and genome directly
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
119 if 'inputs' in config:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
120 (run_acc, study_acc, genome, method) = prep_for_galaxy_run()
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
121 for ext in FILES:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
122 yield os.path.join(config['output'], '%s_%s_%s_%s.%s' % (run_acc, study_acc, genome, method, ext))
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
123 #here to get the make_galaxy_links rule to fire
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
124 yield os.path.join(config['output'], '%s_%s_%s_%s.done' % (run_acc, study_acc, genome, method))
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
125 #not running under galaxy, takes a list of accessions
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
126 else:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
127 for fn in config['input'].split():
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
128 with open(fn, 'r') as fh:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
129 for ln in fh:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
130 if ln.count(',') < 2:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
131 continue
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
132 toks = ln.rstrip().split(',')
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
133 assert 3 <= len(toks) <= 4
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
134 method = 'sra'
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
135 if len(toks) == 4:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
136 method = toks[3]
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
137 # SRR,SRP,genome
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
138 # e.g. SRR1557855,SRP045778,ce10
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
139 for ext in FILES:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
140 yield os.path.join(config['output'], '%s_%s_%s_%s.%s' % (toks[0], toks[1], toks[2], method, ext))
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
141
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
142 rule all:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
143 input:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
144 get_accessions
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
145
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
146 rule make_manifest:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
147 input:
16
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
148 config['output'] + '/{quad}.salmon.tsv.zst',
10
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
149 config['output'] + '/{quad}.sjout.zst',
16
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
150 config['output'] + '/{quad}.jx_bed.zst',
10
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
151 config['output'] + '/{quad}.Chimeric.out.junction.zst',
16
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
152 config['output'] + '/{quad}.unmapped.bam',
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
153 config['output'] + '/{quad}.unmapped.fastq.zst',
10
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
154 config['output'] + '/{quad}.bamcount_nonref.csv.zst',
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
155 config['output'] + '/{quad}.bamcount_auc.tsv',
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
156 config['output'] + '/{quad}.bamcount_frag.tsv',
16
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
157 config['output'] + '/{quad}.fastq_check.tsv.zst',
10
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
158 config['output'] + '/{quad}.all.exon_bw_count.zst',
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
159 config['output'] + '/{quad}.unique.exon_bw_count.zst',
16
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
160 config['output'] + '/{quad}.all.bw.zst',
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
161 config['output'] + '/{quad}.unique.bw.zst',
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
162 config['output'] + '/{quad}.align.log',
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
163 config['output'] + '/{quad}.extract_jx.log',
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
164 config['output'] + '/{quad}.bamcount.log',
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
165 config['output'] + '/{quad}.align_unmapped.log',
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
166 config['output'] + '/{quad}.download.log',
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
167 config['output'] + '/{quad}.fastq_check.log',
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
168 config['output'] + '/{quad}.sort.log',
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
169 config['output'] + '/{quad}.salmon.log'
10
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
170 output:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
171 config['output'] + '/{quad}.manifest'
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
172 params:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
173 quad=lambda wildcards: wildcards.quad
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
174 run:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
175 with open(output[0], 'wt') as fh:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
176 for fn in FILES:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
177 fh.write(params.quad + "." + fn + '\n')
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
178
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
179 def galaxy_link_files(op):
16
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
180 remove_steps_files()
10
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
181 a = [op + '/' + f for f in FILES]
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
182 return a
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
183
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
184 rule make_galaxy_links:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
185 input:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
186 config['output'] + '/{quad}.sjout.zst',
16
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
187 config['output'] + '/{quad}.fastq_check.tsv.zst',
10
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
188 config['output'] + '/{quad}.bamcount_nonref.csv.zst',
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
189 config['output'] + '/{quad}.bamcount_auc.tsv',
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
190 config['output'] + '/{quad}.bamcount_frag.tsv',
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
191 config['output'] + '/{quad}.Chimeric.out.junction.zst',
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
192 config['output'] + '/{quad}.all.exon_bw_count.zst',
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
193 config['output'] + '/{quad}.unique.exon_bw_count.zst',
16
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
194 config['output'] + '/{quad}.all.bw.zst',
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
195 config['output'] + '/{quad}.unique.bw.zst',
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
196 config['output'] + '/{quad}.fastq_check.log',
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
197 config['output'] + '/{quad}.align.log',
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
198 config['output'] + '/{quad}.sort.log',
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
199 config['output'] + '/{quad}.bamcount.log',
10
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
200 output:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
201 config['output'] + '/{quad}.done'
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
202 params:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
203 quad=lambda wildcards: wildcards.quad,
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
204 out=galaxy_link_files(config['output'])
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
205 run:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
206 for (i,fn) in enumerate(input):
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
207 os.symlink(os.path.abspath(fn), params.out[i])
16
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
208 os.symlink(os.path.abspath(input[-1]), output[0])
10
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
209
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
210
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
211 rule bamcount:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
212 input:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
213 bam=config['temp'] + '/{quad}-sorted.bam',
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
214 bamidx=config['temp'] + '/{quad}-sorted.bam.bai',
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
215 bed=lambda wildcards: '%s/%s/gtf/%s' % (config['ref'], wildcards.quad.split('_')[2], config.get('bw_bed', 'exons.bed'))
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
216 output:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
217 nonref=config['output'] + '/{quad}.bamcount_nonref.csv.zst',
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
218 auc=config['output'] + '/{quad}.bamcount_auc.tsv',
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
219 frag=config['output'] + '/{quad}.bamcount_frag.tsv',
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
220 all_bw=config['output'] + '/{quad}.all.bw.zst',
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
221 unique_bw=config['output'] + '/{quad}.unique.bw.zst',
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
222 all_bw_count=config['output'] + '/{quad}.all.exon_bw_count.zst',
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
223 unique_bw_count=config['output'] + '/{quad}.unique.exon_bw_count.zst'
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
224 log:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
225 config['output'] + '/{quad}.bamcount.log'
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
226 params:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
227 srr=lambda wildcards: wildcards.quad.split('_')[0],
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
228 uniq_qual=config.get('unique_qual', 10)
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
229 threads: 4
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
230 shell:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
231 """
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
232 TMP={config[temp]}/{params.srr}_bamcount
14
f2258de365ee Uploaded
chrisw
parents: 13
diff changeset
233 bamcount {input.bam} \
10
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
234 --threads {threads} \
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
235 --coverage \
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
236 --no-head \
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
237 --require-mdz \
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
238 --min-unique-qual {params.uniq_qual} \
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
239 --frag-dist ${{TMP}} \
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
240 --bigwig ${{TMP}} \
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
241 --annotation {input.bed} ${{TMP}} \
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
242 --auc ${{TMP}} \
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
243 --alts ${{TMP}} \
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
244 2>&1 | tee -a {log}
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
245
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
246 #
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
247 # --alts
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
248 #
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
249
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
250 (time zstd ${{TMP}}.alts.tsv -o {output.nonref}) 2>&1 | tee -a {log}
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
251 size=$(wc -c < {output.nonref})
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
252 echo "COUNT_NonrefSize ${{size}}"
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
253 rm -f ${{TMP}}.alts.tsv
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
254
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
255 #
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
256 # --auc
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
257 #
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
258 mv ${{TMP}}.auc.tsv {output.auc}
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
259 size=$(wc -c < {output.auc})
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
260 echo "COUNT_AucSize ${{size}}"
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
261 rm -f ${{TMP}}.auc.tsv
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
262
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
263 #
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
264 # --frag-dist
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
265 #
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
266 mv ${{TMP}}.frags.tsv {output.frag}
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
267 size=$(wc -c < {output.frag})
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
268 echo "COUNT_FragDistSize ${{size}}"
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
269 rm -f ${{TMP}}.frags.tsv
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
270
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
271 #
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
272 # --bigwig
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
273 #
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
274
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
275 (time zstd ${{TMP}}.all.bw -o {output.all_bw}) 2>&1 | tee -a {log}
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
276 size=$(wc -c < {output.all_bw})
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
277 echo "COUNT_BwSize ${{size}}"
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
278 rm -f ${{TMP}}.all.bw
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
279
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
280 (time zstd ${{TMP}}.unique.bw -o {output.unique_bw}) 2>&1 | tee -a {log}
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
281 size=$(wc -c < {output.unique_bw})
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
282 echo "COUNT_BwSize ${{size}}"
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
283 rm -f ${{TMP}}.unique.bw
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
284
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
285 #
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
286 # --annotation
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
287 #
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
288
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
289 (time zstd ${{TMP}}.all.tsv -o {output.all_bw_count}) 2>&1 | tee -a {log}
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
290 size=$(wc -c < {output.all_bw_count})
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
291 echo "COUNT_BwQuantSize ${{size}}"
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
292 rm -f ${{TMP}}.all.tsv
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
293
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
294 (time zstd ${{TMP}}.unique.tsv -o {output.unique_bw_count}) 2>&1 | tee -a {log}
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
295 size=$(wc -c < {output.unique_bw_count})
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
296 echo "COUNT_BwQuantSize ${{size}}"
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
297 rm -f ${{TMP}}.unique.tsv
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
298
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
299 # Check that all temporaries were properly purged
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
300 set +o pipefail ; num_files=$(ls -d ${{TMP}}* 2>/dev/null | wc -l)
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
301 if (( $num_files > 0 )) ; then
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
302 echo "Failed to purge files (ignore . and ..): $(ls -ad ${{TMP}}*)"
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
303 exit 1
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
304 fi
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
305
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
306 echo "COUNT_BamcountComplete 1"
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
307 """
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
308
16
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
309 rule bw_zstd:
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
310 input:
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
311 config['temp'] + '/{prefix}.bw'
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
312 output:
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
313 config['output'] + '/{prefix}.bw.zst'
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
314 shell:
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
315 """
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
316 zstd {input} -o {output}
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
317 size=$(wc -c < {output})
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
318 echo "COUNT_BwBytes ${{size}}"
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
319 echo "COUNT_BwZstdComplete 1"
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
320 """
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
321
10
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
322 rule sort:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
323 input:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
324 config['temp'] + '/{quad}.bam'
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
325 wildcard_constraints:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
326 quad="[^-]+"
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
327 output:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
328 bam=temp(config['temp'] + '/{quad}-sorted.bam'),
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
329 bai=temp(config['temp'] + '/{quad}-sorted.bam.bai')
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
330 log:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
331 config['output'] + '/{quad}.sort.log'
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
332 params:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
333 srr=lambda wildcards: wildcards.quad.split('_')[0]
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
334 threads: 8
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
335 shell:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
336 """
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
337 TMP="{config[temp]}/sort_temp.{params.srr}"
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
338 mkdir -p ${{TMP}}
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
339 time samtools sort \
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
340 -T ${{TMP}}/samtools_temp \
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
341 -@ {threads} \
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
342 -m 64M \
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
343 -o {output.bam} {input} 2>&1 | tee -a {log}
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
344 rm -rf ${{TMP}}
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
345 size=$(wc -c < {output.bam})
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
346 echo "COUNT_SortedBAMBytes ${{size}}"
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
347
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
348 time samtools index -@ {threads} {output.bam} 2>&1 | tee -a {log}
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
349 echo "COUNT_SortComplete 1"
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
350 """
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
351
16
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
352 rule salmon:
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
353 input:
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
354 reads0=config['temp'] + '/{quad}_0.fastq',
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
355 reads1=config['temp'] + '/{quad}_1.fastq',
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
356 reads2=config['temp'] + '/{quad}_2.fastq',
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
357 index1=lambda wildcards: '%s/%s/salmon_index/hash.bin' % (config['ref'], wildcards.quad.split('_')[2]),
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
358 index2=lambda wildcards: '%s/%s/salmon_index/sa.bin' % (config['ref'], wildcards.quad.split('_')[2])
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
359 output:
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
360 config['output'] + '/{quad}.salmon.tsv.zst'
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
361 log:
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
362 config['output'] + '/{quad}.salmon.log'
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
363 params:
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
364 index_base=lambda wildcards: '%s/%s/salmon_index' % (config['ref'], wildcards.quad.split('_')[2]),
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
365 salmon_args=config.get('salmon_args', '')
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
366 threads: 8
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
367 shell:
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
368 """
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
369 READ_FILES="-r {input.reads0}"
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
370 if [[ -s {input.reads2} ]] ; then
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
371 READ_FILES="-1 {input.reads1} -2 {input.reads2}"
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
372 fi
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
373 if set -o pipefail && time salmon quant \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
374 --libType U \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
375 --quiet \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
376 --validateMappings \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
377 -i {params.index_base} \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
378 -p {threads} \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
379 {params.salmon_args} \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
380 ${{READ_FILES}} \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
381 --output salmon_quant \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
382 --minAssignedFrags 1 \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
383 2>&1 | tee -a {log}
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
384 then
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
385 echo "COUNT_SalmonSuccess 1"
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
386
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
387 time zstd salmon_quant/quant.sf -o {output} 2>&1 | tee -a {log}
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
388 size=$(wc -c < {output})
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
389 echo "COUNT_SalmonQuantBytes ${{size}}"
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
390 else
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
391 touch {output}
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
392 echo "COUNT_SalmonFailure 1"
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
393 fi
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
394
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
395 rm -rf salmon_quant
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
396 echo "COUNT_SalmonComplete 1"
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
397 """
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
398
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
399 rule align_unmapped:
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
400 input:
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
401 unmapped1=config['temp'] + '/{quad}_1.unmappedfastq',
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
402 unmapped2=config['temp'] + '/{quad}_2.unmappedfastq',
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
403 index=lambda wildcards: '%s/%s/unmapped_hisat2_idx/genome.1.ht2' % (config['ref'], wildcards.quad.split('_')[2])
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
404 output:
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
405 bam=config['output'] + '/{quad}.unmapped.bam',
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
406 sample=config['output'] + '/{quad}.unmapped.fastq.zst'
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
407 log:
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
408 config['output'] + '/{quad}.align_unmapped.log'
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
409 params:
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
410 index_base=lambda wildcards: '%s/%s/unmapped_hisat2_idx/genome' % (config['ref'], wildcards.quad.split('_')[2]),
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
411 srr=lambda wildcards: wildcards.quad.split('_')[0],
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
412 hisat2_params=config.get('hisat2', ''),
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
413 max_unalign=config.get('max_unalign', 100000)
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
414 threads: 16
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
415 shell:
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
416 """
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
417 TMP="{config[temp]}/align_unmapped_temp.{params.srr}"
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
418 READ_FILES="-1 {input.unmapped1} -2 {input.unmapped2}"
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
419 if [[ ! -s {input.unmapped2} ]] ; then
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
420 READ_FILES="-U {input.unmapped1}"
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
421 fi
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
422 time hisat2 \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
423 $READ_FILES \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
424 -t --mm \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
425 -x {params.index_base} \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
426 --threads {threads} \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
427 {params.hisat2_params} \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
428 --un ${{TMP}}.un \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
429 --un-conc ${{TMP}}.un_conc \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
430 -S ${{TMP}}.sam \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
431 2>&1 | tee -a {log}
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
432
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
433 #
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
434 # Make BAM file out of aligned reads
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
435 #
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
436 time samtools view \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
437 -b -F 4 \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
438 -o {output.bam} \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
439 ${{TMP}}.sam \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
440 2>&1 | tee -a {log}
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
441 rm -f ${{TMP}}.sam
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
442
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
443 #
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
444 # Save a subset of the doubly unaligned reads
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
445 #
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
446 if [[ ! -s {input.unmapped2} ]] ; then
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
447 # unpaired
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
448 fastq-sample \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
449 -n {params.max_unalign} \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
450 -o ${{TMP}}.samp \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
451 ${{TMP}}.un
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
452 rm -f ${{TMP}}.un
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
453 else
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
454 # paired-end
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
455 fastq-sample \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
456 -n {params.max_unalign} \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
457 -o ${{TMP}}.samp \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
458 ${{TMP}}.1.un_conc ${{TMP}}.2.un_conc
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
459 rm -f ${{TMP}}.1.un_conc ${{TMP}}.2.un_conc
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
460
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
461 # interleave the two output fastqs into single file
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
462 paste ${{TMP}}.samp.1.fastq ${{TMP}}.samp.2.fastq \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
463 | paste - - - - \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
464 | awk -v OFS="\n" -v FS="\t" '{{print($1,$3,$5,$7,$2,$4,$6,$8)}}' \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
465 > ${{TMP}}.samp.fastq
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
466 rm -f ${{TMP}}.samp.1.fastq ${{TMP}}.samp.2.fastq
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
467 fi
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
468
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
469 test -f ${{TMP}}.samp.fastq
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
470 time zstd ${{TMP}}.samp.fastq -o {output.sample} 2>&1 | tee -a {log}
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
471 size=$(wc -c < {output.sample})
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
472 echo "COUNT_UnmappedSampleBytes ${{size}}"
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
473 rm -f ${{TMP}}.samp.fastq
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
474
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
475 size=$(wc -c < {output.bam})
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
476 echo "COUNT_UnmappedBamBytes ${{size}}"
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
477
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
478 echo "COUNT_AlignUnmappedComplete 1"
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
479 """
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
480
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
481 rule extract_jx:
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
482 input:
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
483 bam=config['temp'] + '/{quad}-sorted.bam',
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
484 bamidx=config['temp'] + '/{quad}-sorted.bam.bai',
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
485 fa=lambda wildcards: '%s/%s/fasta/genome.fa' % (config['ref'], wildcards.quad.split('_')[2]),
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
486 gtf=lambda wildcards: '%s/%s/gtf/genes.gtf' % (config['ref'], wildcards.quad.split('_')[2])
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
487 output:
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
488 config['output'] + '/{quad}.jx_bed.zst'
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
489 params:
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
490 srr=lambda wildcards: wildcards.quad.split('_')[0]
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
491 log:
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
492 config['output'] + '/{quad}.extract_jx.log'
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
493 shell:
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
494 """
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
495 TMP="{config[temp]}/extract_jx.{params.srr}"
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
496 time regtools junctions extract \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
497 -i 20 -a 1 \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
498 -o ${{TMP}}.jx_tmp \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
499 {input.bam} 2>&1 | tee -a {log}
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
500 time zstd ${{TMP}}.jx_tmp -o {output} 2>&1 | tee -a {log}
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
501 rm -f ${{TMP}}.jx_tmp
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
502
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
503 size=$(wc -c < {output})
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
504 echo "COUNT_ExtractJxBytes ${{size}}"
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
505
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
506 echo "COUNT_ExtractJxComplete 1"
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
507 """
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
508
10
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
509 rule align:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
510 input:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
511 reads0=config['temp'] + '/{quad}_0.fastq',
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
512 reads1=config['temp'] + '/{quad}_1.fastq',
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
513 reads2=config['temp'] + '/{quad}_2.fastq',
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
514 index1=lambda wildcards: '%s/%s/star_idx/SAindex' % (config['ref'], wildcards.quad.split('_')[2]),
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
515 index2=lambda wildcards: '%s/%s/star_idx/SA' % (config['ref'], wildcards.quad.split('_')[2])
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
516 wildcard_constraints:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
517 quad="[^-]+"
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
518 output:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
519 bam=temp(config['temp'] + '/{quad}.bam'),
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
520 jxs=config['output'] + '/{quad}.sjout.zst',
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
521 chimeric=config['output'] + '/{quad}.Chimeric.out.junction.zst',
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
522 unmapped1=config['temp'] + '/{quad}_1.unmappedfastq',
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
523 unmapped2=config['temp'] + '/{quad}_2.unmappedfastq'
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
524 log:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
525 config['output'] + '/{quad}.align.log'
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
526 params:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
527 index_base=lambda wildcards: '%s/%s/star_idx' % (config['ref'], wildcards.quad.split('_')[2]),
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
528 srr=lambda wildcards: wildcards.quad.split('_')[0],
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
529 star_params="%s %s" % (config.get('star', ''), '--genomeLoad LoadAndRemove' if 'inputs' not in config else '')
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
530 threads: 16
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
531 shell:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
532 """
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
533 READ_FILES="{input.reads0}"
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
534 if [[ -s {input.reads2} ]] ; then
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
535 READ_FILES="{input.reads1} {input.reads2}"
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
536 fi
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
537 TMP="{config[temp]}/align_temp.{params.srr}"
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
538 rm -rf ${{TMP}}
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
539 time STAR \
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
540 {params.star_params} \
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
541 --runMode alignReads \
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
542 --runThreadN {threads} \
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
543 --genomeDir {params.index_base} \
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
544 --readFilesIn ${{READ_FILES}} \
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
545 --twopassMode None \
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
546 --outTmpDir ${{TMP}} \
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
547 --outReadsUnmapped Fastx \
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
548 --outMultimapperOrder Random \
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
549 --outSAMreadID Number \
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
550 --outSAMtype BAM Unsorted \
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
551 --outSAMmode NoQS \
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
552 --outSAMattributes NH MD \
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
553 --chimOutType Junctions \
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
554 --chimOutJunctionFormat 1 \
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
555 --chimSegmentReadGapMax 3 \
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
556 --chimJunctionOverhangMin 12 \
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
557 --chimSegmentMin 12 2>&1 | tee -a {log}
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
558
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
559 # Full set of output files:
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
560 #
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
561 # Aligned.out.bam
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
562 # Chimeric.out.junction
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
563 # Log.final.out
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
564 # Log.out
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
565 # Log.progress.out
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
566 # SJ.out.tab
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
567 # Unmapped.out.mate1
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
568 # Unmapped.out.mate2 (if any reads were paired-end)
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
569
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
570 #
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
571 # Logs
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
572 #
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
573 rm -rf ${{TMP}}
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
574 cat Log.out >> {log}
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
575 cat Log.final.out >> {log}
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
576 rm -f Log*.out
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
577
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
578 #
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
579 # Junctions
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
580 #
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
581 test -f SJ.out.tab
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
582 time zstd SJ.out.tab -o {output.jxs} 2>&1 | tee -a {log}
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
583 rm -f SJ.out.tab
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
584 size=$(wc -c < {output.jxs})
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
585 echo "COUNT_CompressedJxBytes ${{size}}"
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
586
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
587 #
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
588 # Chimerics
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
589 #
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
590 test -f Chimeric.out.junction
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
591 test -s Chimeric.out.junction
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
592 sort -k1,1 -n -k2,2 Chimeric.out.junction > Chimeric.out.junction.sorted
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
593 time zstd Chimeric.out.junction.sorted -o {output.chimeric} 2>&1 | tee -a {log}
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
594 rm -f Chimeric.out.junction Chimeric.out.junction.sorted
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
595 size=$(wc -c < {output.chimeric})
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
596 echo "COUNT_ChimericBytes ${{size}}"
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
597
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
598 #
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
599 # Unmapped
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
600 #
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
601 touch {output.unmapped2}
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
602 test -f Unmapped.out.mate1
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
603 mv Unmapped.out.mate1 {output.unmapped1}
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
604 if [[ -f Unmapped.out.mate2 ]] ; then
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
605 mv Unmapped.out.mate2 {output.unmapped2}
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
606 fi
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
607
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
608 #
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
609 # Alignments
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
610 #
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
611 size=$(wc -c < Aligned.out.bam)
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
612 echo "COUNT_BAMBytes ${{size}}"
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
613 mv Aligned.out.bam {output.bam}
16
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
614
10
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
615 echo "COUNT_AlignComplete 1"
f43dd6f7c687 Uploaded
chrisw
parents:
diff changeset
616 """
16
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
617
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
618 rule fastq_check:
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
619 input:
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
620 reads0=config['temp'] + '/{quad}_0.fastq',
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
621 reads1=config['temp'] + '/{quad}_1.fastq',
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
622 reads2=config['temp'] + '/{quad}_2.fastq'
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
623 output:
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
624 config['output'] + '/{quad}.fastq_check.tsv.zst'
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
625 log:
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
626 config['output'] + '/{quad}.fastq_check.log'
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
627 params:
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
628 srr=lambda wildcards: wildcards.quad.split('_')[0]
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
629 shell:
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
630 """
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
631 TMP="{config[temp]}/fastq_check-{params.srr}.tsv"
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
632 touch ${{TMP}}
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
633 if [[ -s {input.reads0} ]] ; then
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
634 time seqtk fqchk -q0 {input.reads0} >>${{TMP}} 2>>{log}
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
635 fi
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
636 if [[ -s {input.reads1} ]] ; then
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
637 time seqtk fqchk -q0 {input.reads1} >>${{TMP}} 2>>{log}
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
638 fi
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
639 if [[ -s {input.reads2} ]] ; then
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
640 time seqtk fqchk -q0 {input.reads2} >>${{TMP}} 2>>{log}
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
641 fi
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
642 time zstd ${{TMP}} -o {output} 2>&1 | tee -a {log}
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
643 size=$(wc -c < {output})
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
644 echo "COUNT_FastqCheckBytes ${{size}}"
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
645
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
646 echo "COUNT_FastqCheckComplete 1"
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
647 """
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
648
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
649 rule download:
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
650 output:
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
651 temp(config['temp'] + '/{quad}_0.fastq'),
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
652 temp(config['temp'] + '/{quad}_1.fastq'),
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
653 temp(config['temp'] + '/{quad}_2.fastq')
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
654 log:
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
655 config['output'] + '/{quad}.download.log'
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
656 params:
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
657 srr=lambda wildcards: wildcards.quad.split('_')[0],
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
658 method=lambda wildcards: wildcards.quad.split('_')[3],
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
659 fd_params=config.get('fastq_dump_args', ''),
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
660 retries=config.get('fastq_dump_retries', '5')
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
661 threads: 4
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
662 shell:
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
663 """
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
664 set -x
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
665 SUCCESS=0
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
666 TIMEOUT=10
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
667 PARAMS=""
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
668 TMP="{config[temp]}/dl-{params.srr}"
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
669 ! test -d ${{TMP}}
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
670
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
671 if [[ {params.method} == "sra" ]] ; then
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
672 USE_FASTERQ=1
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
673 for i in {{ 1..{params.retries} }} ; do
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
674 if time prefetch -t fasp -O ${{TMP}} -L info {params.srr} 2>&1 >> {log} ; then
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
675 SUCCESS=1
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
676 break
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
677 else
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
678 echo "COUNT_SraRetries 1"
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
679 TIMEOUT=$((${{TIMEOUT}} * 2))
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
680 sleep ${{TIMEOUT}}
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
681 fi
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
682 done
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
683 if (( $SUCCESS == 0 )) ; then
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
684 echo "COUNT_SraFailures 1"
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
685 exit 1
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
686 fi
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
687 test -f ${{TMP}}/*.sra
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
688 size=$(cat ${{TMP}}/*.sra | wc -c)
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
689 echo "COUNT_SraBytesDownloaded ${{size}}"
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
690 if (( ${{USE_FASTERQ}} == 1 )) ; then
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
691 time fasterq-dump ${{TMP}}/*.sra \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
692 -e {threads} \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
693 -t ${{TMP}} \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
694 -L info \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
695 --split-files \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
696 --skip-technical \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
697 -o {params.srr}.fastq \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
698 2>&1 >> {log}
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
699 test -f {params.srr}_2.fastq || mv {params.srr}.fastq {params.srr}_0.fastq
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
700 else
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
701 time fastq-dump ${{TMP}}/*.sra \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
702 -L info \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
703 --split-files \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
704 --skip-technical \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
705 -O . \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
706 2>&1 >> {log}
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
707 test -f {params.srr}_2.fastq || mv {params.srr}_1.fastq {params.srr}_0.fastq
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
708 fi
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
709 rm -rf ${{TMP}}
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
710 elif [[ {params.method} == "gdc" ]] ; then
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
711 TOKEN=~/gdc/latest.txt
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
712 if [[ ! -f ${{TOKEN}} ]] ; then
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
713 echo "ERROR: no GDC token file found at ${{TOKEN}}"
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
714 exit 1
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
715 fi
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
716 for i in {{ 1..{params.retries} }} ; do
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
717 if time gdc-client download \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
718 -t ${{TOKEN}} \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
719 --log-file {{TMP}}/log.txt \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
720 -d {{TEMP}} \
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
721 {params.srr} 2>&1 >> {log}
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
722 then
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
723 SUCCESS=1
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
724 break
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
725 else
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
726 echo "COUNT_GdcRetries 1"
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
727 TIMEOUT=$((${{TIMEOUT}} * 2))
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
728 sleep ${{TIMEOUT}}
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
729 fi
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
730 done
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
731 if (( $SUCCESS == 0 )) ; then
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
732 echo "COUNT_GdcFailures 1"
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
733 exit 1
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
734 fi
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
735 test -d {{TEMP}}/{params.srr}
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
736 test -f {{TEMP}}/{params.srr}/*.tar.gz
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
737
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
738 echo "=== gdc-client log.txt begin ===" >> {log}
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
739 cat {{TMP}}/log.txt >> {log}
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
740 echo "=== gdc-client log.txt end===" >> {log}
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
741
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
742 size=$(cat {{TEMP}}/{params.srr}/*.tar.gz | wc -c)
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
743 echo "COUNT_GdcBytesDownloaded ${{size}}"
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
744
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
745 tar zxvf {{TEMP}}/{params.srr}/*.tar.gz
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
746 rm -rf {{TEMP}}
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
747
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
748 num_1s=$(ls -1 *_1.fastq | wc -l)
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
749 num_2s=$(ls -1 *_2.fastq | wc -l)
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
750 if (( ${{num_1s}} == 0 )) ; then
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
751 echo "ERROR: No _1.fastq files output"
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
752 exit 1
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
753 fi
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
754 if (( ${{num_1s}} > 1 )) ; then
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
755 echo "ERROR: More than one _1.fastq file found"
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
756 exit 1
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
757 fi
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
758 if (( ${{num_2s}} == 0 )) ; then
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
759 # unpaired
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
760 mv *_1.fastq {params.srr}_0.fastq
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
761 else
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
762 # paired-end
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
763 mv *_1.fastq {params.srr}_1.fastq
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
764 mv *_2.fastq {params.srr}_2.fastq
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
765 fi
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
766 fi
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
767
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
768 # Next chunk expects the FASTQ files to exist in the current directory
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
769 # named {{params.srr}}_{{0,1,2}}.fastq
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
770 size=0
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
771 for i in {{0..2}} ; do
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
772 fn={params.srr}_${{i}}.fastq
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
773 if [[ -f ${{fn}} ]] ; then
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
774 echo "COUNT_FilesDownloaded 1"
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
775 else
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
776 touch ${{fn}}
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
777 fi
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
778 size=$((${{size}} + $(wc -c < ${{fn}})))
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
779 mv ${{fn}} {config[temp]}/{wildcards.quad}_${{i}}.fastq
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
780 done
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
781 echo "COUNT_BytesDownloaded ${{size}}"
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
782 echo "COUNT_DownloadComplete 1"
d2770bc432e1 Uploaded
chrisw
parents: 15
diff changeset
783 """