def pass1(self, reader, saver): """ The first pass across the read data. It does the following: 1. If do_normalize is set, discard all read pairs with coverage above DIGINORM_COVERAGE. 2. For each remaining read pair, check if the read pair is above the coverage necessary for trimming (TRIM_AT_COVERAGE). If so, k-mer trim the reads at CUTOFF, and yield them. 3. If the read pair is not at the coverage necessary for trimming, consume the read pair with the graph and save the read pair for the second pass. """ graph = self.graph TRIM_AT_COVERAGE = self.trim_at_coverage CUTOFF = self.cutoff DIGINORM_COVERAGE = self.diginorm_coverage K = graph.ksize() for n, is_pair, read1, read2 in reader: bundle = ReadBundle(read1, read2) # clean up the sequences for examination. self.n_reads += bundle.num_reads self.n_bp += bundle.total_length min_coverage = min(bundle.coverages(graph)) if self.do_normalize and min_coverage >= DIGINORM_COVERAGE: # skip reads if normalizing continue # trim? if min_coverage >= TRIM_AT_COVERAGE: for read in bundle.reads: record, did_trim = trim_record(graph, read, CUTOFF) if did_trim: self.trimmed_reads += 1 if record: yield record # no, too low coverage to trim; consume & set aside for 2nd pass. else: for read in bundle.reads: graph.consume(read.cleaned_seq) write_record(read, saver) self.n_saved += 1