X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/2c7b8f8bee023c438c47aff2f35848bbf6c1ae5f..d25db7c02aa07e9d4812a029753c2b8606cf35b1:/crunch_scripts/split-fastq.py diff --git a/crunch_scripts/split-fastq.py b/crunch_scripts/split-fastq.py index a4444d0dd2..1c7a36871d 100755 --- a/crunch_scripts/split-fastq.py +++ b/crunch_scripts/split-fastq.py @@ -3,76 +3,65 @@ import arvados import re import hashlib +import string api = arvados.api('v1') piece = 0 manifest_text = "" -def put_manifest(manifest_text, sources=[]): - crm = arvados.CollectionReader(manifest_text) - - combined = crm.manifest_text(strip=True) - - m = hashlib.new('md5') - m.update(combined) - - uuid = "{}+{}".format(m.hexdigest(), len(combined)) - - collection = arvados.api().collections().create( - body={ - 'uuid': uuid, - 'manifest_text': crm.manifest_text(), - }).execute() - - for s in sources: - l = arvados.api().links().create(body={ - "link": { - "tail_uuid": s, - "head_uuid": uuid, - "link_class": "provenance", - "name": "provided" - }}).execute() - - return uuid - # Look for paired reads -inp = arvados.CollectionReader(arvados.getjobparam('input')) +inp = arvados.CollectionReader(arvados.getjobparam('reads')) -with open("/home/peter/manifest") as f: - inp = arvados.CollectionReader(f.read()) +manifest_list = [] -prog = re.compile("(.*?)_1.fastq(.gz)?$") +def nextline(reader, start): + n = -1 + while True: + r = reader.readfrom(start, 128) + if r == '': + break + n = string.find(r, "\n") + if n > -1: + break + else: + start += 128 + return n -manifest_text = "" +prog = re.compile(r'(.*?)(_[12])?\.fastq(\.gz)?$') +# Look for fastq files for s in inp.all_streams(): - if s.name() == ".": - for f in s.all_files(): - result = prog.match(f.name()) - if result != None: - p = [{}, {}] - p[0]["reader"] = s.files()[result.group(0)] - p[1]["reader"] = s.files()[result.group(1) + "_2.fastq" + result.group(2)] - m0 = p[0]["reader"].as_manifest()[1:] - m1 = p[1]["reader"].as_manifest()[1:] - manifest_text += "_" + str(piece) + m0 - manifest_text += "_" + str(piece) + m1 + for f in s.all_files(): + name_pieces = prog.match(f.name()) + if name_pieces is not None: + if s.name() != ".": + # The downstream tool (run-command) only iterates over the top + # level of directories so if there are fastq files in + # directories in the input, the choice is either to forget + # there are directories (which might lead to name conflicts) or + # just fail. + print >>sys.stderr, "fastq must be at the root of the collection" + sys.exit(1) + + p = None + if name_pieces.group(2) is not None: + if name_pieces.group(2) == "_1": + p = [{}, {}] + p[0]["reader"] = s.files()[name_pieces.group(0)] + p[1]["reader"] = s.files()[name_pieces.group(1) + "_2.fastq" + (name_pieces.group(3) if name_pieces.group(3) else '')] + else: + p = [{}] + p[0]["reader"] = s.files()[name_pieces.group(0)] + + if p is not None: + for i in xrange(0, len(p)): + m = p[i]["reader"].as_manifest().split() + m[0] = "./_" + str(piece) + manifest_list.append(m) piece += 1 -# No pairs found so just put each fastq file into a separate directory -if manifest_text == "": - for s in inp.all_streams(): - prog = re.compile("(.*?).fastq(.gz)?$") - if s.name() == ".": - for f in s.all_files(): - result = prog.match(f.name()) - if result != None: - p = [{}] - p[0]["reader"] = s.files()[result.group(0)] - m0 = p[0]["reader"].as_manifest()[1:] - manifest_text += "_" + str(piece) + m0 - piece += 1 +manifest_text = "\n".join(" ".join(m) for m in manifest_list) + "\n" -arvados.current_task().set_output(put_manifest(manifest_text, [arvados.get_job_param('input')])) +arvados.current_task().set_output(manifest_text)