Skip to content

Commit 6c49a42

Browse files
committed
samtools: Make IndexBam a scheduled task and add BamToFastq
1 parent ae4c183 commit 6c49a42

File tree

1 file changed

+42
-3
lines changed

1 file changed

+42
-3
lines changed

bioluigi/tasks/samtools.py

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,55 @@
11
import luigi
2-
from luigi.contrib.external_program import ExternalProgramTask
32

3+
from scheduled_external_program import ScheduledExternalProgramTask
44
from ..config import BioluigiConfig
55
from ..local_target import LocalTarget
66

77
cfg = BioluigiConfig()
88

9-
class IndexBam(ExternalProgramTask):
9+
class IndexBam(ScheduledExternalProgramTask):
1010
bam_file = luigi.Parameter()
1111

12+
_tmp_bam_file = None
13+
1214
def program_args(self):
13-
return [cfg.samtools_bin, 'index', self.bam_file]
15+
return [cfg.samtools_bin, 'index', self._tmp_bam_file if self._tmp_bam_file else self.bam_file]
16+
17+
def run(self):
18+
with self.output().temporary_path() as self._tmp_bam_file:
19+
super().run()
1420

1521
def output(self):
1622
return LocalTarget('{}.bai'.format(self.bam_file))
23+
24+
class BamToFastq(ScheduledExternalProgramTask):
25+
bam_file = luigi.Parameter()
26+
r1_file = luigi.Parameter()
27+
r2_file = luigi.OptionalParameter(default=None)
28+
29+
_tmp_r1_file = None
30+
_tmp_r2_file = None
31+
32+
def program_args(self):
33+
args = [cfg.samtools_bin, 'fastq', '--threads', str(self.cpus), '-o', self.r1_file]
34+
if self.r2_file:
35+
args.extend(['-1', self._tmp_r1_file if self._tmp_r1_file else self.r1_file, '-2',
36+
self._tmp_r2_file if self._tmp_r2_file else self.r2_file])
37+
else:
38+
args.extend(['-0', self._tmp_r1_file if self._tmp_r1_file else self.r1_file])
39+
args.append(self.bam_file)
40+
return args
41+
42+
def run(self):
43+
if self.r2_file:
44+
with (self.output()[0].temporary_path() as self._tmp_r1_file,
45+
self.output()[1].temporary_path() as self._tmp_r2_file):
46+
super().run()
47+
else:
48+
with self.output()[0].temporary_path() as self._tmp_bam_file:
49+
super().run()
50+
51+
def output(self):
52+
outputs = [LocalTarget(self.r1_file)]
53+
if self.r2_file:
54+
outputs.append(LocalTarget(self.r2_file))
55+
return outputs

0 commit comments

Comments
 (0)