def METHOD_NAME(self, f):
    s_name = f["s_name"]
    parsed_data = {}
    regexes = {
        "reads_processed": r"# reads processed:\s+(\d+)",
        "reads_aligned": r"# reads with at least one(?: reported)? alignment:\s+(\d+)",
        "reads_aligned_percentage": r"# reads with at least one(?: reported)? alignment:\s+\d+\s+\(([\d\.]+)%\)",
        "not_aligned": r"# reads that failed to align:\s+(\d+)",
        "not_aligned_percentage": r"# reads that failed to align:\s+\d+\s+\(([\d\.]+)%\)",
        "multimapped": r"# reads with alignments suppressed due to -m:\s+(\d+)",
        "multimapped_percentage": r"# reads with alignments suppressed due to -m:\s+\d+\s+\(([\d\.]+)%\)",
    }
    for l in f["f"].splitlines():
        # Attempt in vain to find original bowtie1 command, logged by another program
        if "bowtie" in l and "q.gz" in l:
            fqmatch = re.search(r"([^\s,]+\.f(ast)?q.gz)", l)
            if fqmatch:
                s_name = self.clean_s_name(fqmatch.group(1), f)
                log.debug("Found a bowtie command, updating sample name to '{}'".format(s_name))
        # End of log, reset in case there is another in this file
        if "Overall time:" in l:
            if len(parsed_data) > 0:
                if s_name in self.bowtie_data:
                    log.debug("Duplicate sample name found! Overwriting: {}".format(s_name))
                self.add_data_source(f, s_name)
                self.bowtie_data[s_name] = parsed_data
            s_name = f["s_name"]
            parsed_data = {}
        for k, r in regexes.items():
            match = re.search(r, l)
            if match:
                parsed_data[k] = float(match.group(1).replace(",", ""))
    if len(parsed_data) > 0:
        if s_name in self.bowtie_data:
            log.debug("Duplicate sample name found! Overwriting: {}".format(s_name))
        self.add_data_source(f, s_name)
        self.bowtie_data[s_name] = parsed_data