8 api = arvados.api('v1')
13 # Look for paired reads
15 inp = arvados.CollectionReader(arvados.getjobparam('reads'))
17 prog = re.compile(r'(.*?)_1.fastq(.gz)?$')
21 chunking = False #arvados.getjobparam('chunking')
23 def nextline(reader, start):
26 r = reader.readfrom(start, 128)
29 n = string.find(r, "\n")
37 for i in xrange(0, len(p)):
47 for i in xrange(0, len(p)):
51 for i in xrange(0, len(p)):
52 for ln in xrange(0, 4):
53 r = nextline(p[i]["reader"], p[i]["end"]+recordsize[i])
57 recordsize[i] += (r+1)
60 for i in xrange(0, len(p)):
61 if ((p[i]["end"] - p[i]["start"]) + recordsize[i]) >= (64*1024*1024):
65 for i in xrange(0, len(p)):
67 print "Finish piece ./_%s/%s (%s %s)" % (piece, p[i]["reader"].name(), p[i]["start"], p[i]["end"])
69 manifest.extend(["./_" + str(piece)])
70 manifest.extend([d[arvados.LOCATOR] for d in p[i]["reader"]._stream._data_locators])
73 print arvados.locators_and_ranges(p[i]["reader"].segments, p[i]["start"], p[i]["end"] - p[i]["start"])
75 manifest.extend(["{}:{}:{}".format(seg[arvados.LOCATOR]+seg[arvados.OFFSET], seg[arvados.SEGMENTSIZE], p[i]["reader"].name().replace(' ', '\\040')) for seg in arvados.locators_and_ranges(p[i]["reader"].segments, p[i]["start"], p[i]["end"] - p[i]["start"])])
76 manifest_list.append(manifest)
77 print "Finish piece %s" % (" ".join(manifest))
78 p[i]["start"] = p[i]["end"]
81 for i in xrange(0, len(p)):
82 p[i]["end"] += recordsize[i]
84 if count % 10000 == 0:
85 print "Record %s at %s" % (count, p[i]["end"])
87 for s in inp.all_streams():
89 for f in s.all_files():
90 result = prog.match(f.name())
93 p[0]["reader"] = s.files()[result.group(0)]
94 if result.group(2) != None:
95 p[1]["reader"] = s.files()[result.group(1) + "_2.fastq" + result.group(2)]
97 p[1]["reader"] = s.files()[result.group(1) + "_2.fastq"]
101 m0 = p[0]["reader"].as_manifest()[1:]
102 m1 = p[1]["reader"].as_manifest()[1:]
103 manifest_list.append(["./_" + str(piece), m0[:-1]])
104 manifest_list.append(["./_" + str(piece), m1[:-1]])
107 # No pairs found so just put each fastq file into a separate directory
108 if len(manifest_list) == 0:
109 for s in inp.all_streams():
110 prog = re.compile("(.*?).fastq(.gz)?$")
112 for f in s.all_files():
113 result = prog.match(f.name())
116 p[0]["reader"] = s.files()[result.group(0)]
120 m0 = p[0]["reader"].as_manifest()[1:]
121 manifest_list.append(["./_" + str(piece), m0])
124 manifest_text = "\n".join(" ".join(m) for m in manifest_list)
126 arvados.current_task().set_output(manifest_text)