From b2b768929dfc1317af694ad166b6153f48e3422c Mon Sep 17 00:00:00 2001 From: Oberon Dixon-Luinenburg Date: Wed, 8 Jan 2025 09:18:09 -0800 Subject: [PATCH 01/23] DM-229 Consolidating parsing logic for load_processed functions. Still need to apply to export functions, and need to check that performance is unimpacted. --- dimelo/load_processed.py | 189 ++++++++++++++++++++------------------- 1 file changed, 95 insertions(+), 94 deletions(-) diff --git a/dimelo/load_processed.py b/dimelo/load_processed.py index 1c1e1a8..3e850eb 100644 --- a/dimelo/load_processed.py +++ b/dimelo/load_processed.py @@ -76,6 +76,60 @@ def regions_to_list( return results +def process_pileup_row( + row: str, + parsed_motif: utils.ParsedMotif, + region_start: int, + region_end: int, + region_strand: str, + single_strand: bool, + regions_5to3prime: bool, +) -> tuple[bool, int, int, int]: + """ + Returns: keep_basemod, pileup_coord_relative, modified_in_row, valid_in_row + """ + tabix_fields = row.split("\t") + pileup_basemod = tabix_fields[3] + pileup_strand = tabix_fields[5] + keep_basemod = False + if single_strand and pileup_strand.strip() != region_strand: + # We are on the wrong strand, skip the rest of the steps for this row + return keep_basemod, None, None, None + elif len(pileup_basemod.split(",")) == 3: + pileup_modname, pileup_motif, pileup_mod_coord = pileup_basemod.split(",") + if ( + pileup_motif == parsed_motif.motif_seq + and int(pileup_mod_coord) == parsed_motif.modified_pos + and pileup_modname in parsed_motif.mod_codes + ): + keep_basemod = True + elif len(pileup_basemod.split(",")) == 1: + if pileup_basemod in parsed_motif.mod_codes: + keep_basemod = True + else: + raise ValueError( + f"Unexpected format in bedmethyl file: {row} contains {pileup_basemod} which cannot be parsed." + ) + if keep_basemod: + pileup_info = tabix_fields[9].split(" ") + genomic_coord = int(tabix_fields[1]) + if regions_5to3prime and region_strand == "-": + # We want to flip the coordinates for this region so that it is recorded along the 5 prime to 3 prime direction + # This will enable analyses where the orientation of protein binding / transcriptional dynamics / etc is relevant for our pileup signal + pileup_coord_relative = region_end - genomic_coord - 1 + else: + # Normal coordinates are the default. This will be used both for the '+' case and the '.' (no strand specified) case + pileup_coord_relative = genomic_coord - region_start + + valid_in_row = int(pileup_info[0]) + modified_in_row = int(pileup_info[2]) + + return keep_basemod, pileup_coord_relative, modified_in_row, valid_in_row + + else: + return keep_basemod, None, None, None + + def pileup_counts_from_bedmethyl( bedmethyl_file: str | Path, motif: str, @@ -129,64 +183,35 @@ def pileup_counts_from_bedmethyl( # TODO: change to try-except if chromosome in source_tabix.contigs: for row in source_tabix.fetch(chromosome, start_coord, end_coord): - # TODO Consider using csv module - # TODO: probably this whole block should share logic with vectors_from_bedmethyl AND from export module functions - tabix_fields = row.split("\t") - pileup_basemod = tabix_fields[3] - pileup_strand = tabix_fields[5] - keep_basemod = False - if single_strand and pileup_strand != strand: - # This entry is on the wrong strand - skip it - continue - elif len(pileup_basemod.split(",")) == 3: - pileup_modname, pileup_motif, pileup_mod_coord = ( - pileup_basemod.split(",") - ) - if ( - pileup_motif == parsed_motif.motif_seq - and int(pileup_mod_coord) == parsed_motif.modified_pos - and pileup_modname in parsed_motif.mod_codes - ): - keep_basemod = True - elif len(pileup_basemod.split(",")) == 1: - if pileup_basemod in parsed_motif.mod_codes: - keep_basemod = True - else: - raise ValueError( - f"Unexpected format in bedmethyl file: {row} contains {pileup_basemod} which cannot be parsed." + keep_basemod, _, modified_in_row, valid_in_row = ( + process_pileup_row( + row=row, + parsed_motif=parsed_motif, + region_start=start_coord, + region_end=end_coord, + region_strand=strand, + single_strand=single_strand, + regions_5to3prime=False, ) - # TODO: consolidate the above into a function; just do adding outside + ) if keep_basemod: - pileup_info = tabix_fields[9].split(" ") - valid_base_count += int(pileup_info[0]) - modified_base_count += int(pileup_info[2]) + valid_base_count += valid_in_row + modified_base_count += modified_in_row else: # Get counts from the whole input file for row in source_tabix.fetch(): - tabix_fields = row.split("\t") - pileup_basemod = tabix_fields[3] - keep_basemod = False - if len(pileup_basemod.split(",")) == 3: - pileup_modname, pileup_motif, pileup_mod_coord = pileup_basemod.split( - "," - ) - if ( - pileup_motif == parsed_motif.motif_seq - and int(pileup_mod_coord) == parsed_motif.modified_pos - and pileup_modname in parsed_motif.mod_codes - ): - keep_basemod = True - elif len(pileup_basemod.split(",")) == 1: - if pileup_basemod in parsed_motif.mod_codes: - keep_basemod = True - else: - raise ValueError( - f"Unexpected format in bedmethyl file: {row} contains {pileup_basemod} which cannot be parsed." - ) + keep_basemod, _, modified_in_row, valid_in_row = process_pileup_row( + row=row, + parsed_motif=parsed_motif, + region_start=start_coord, + region_end=end_coord, + region_strand=strand, + single_strand=single_strand, + regions_5to3prime=False, + ) if keep_basemod: - pileup_info = tabix_fields[9].split(" ") - valid_base_count += int(pileup_info[0]) - modified_base_count += int(pileup_info[2]) + valid_base_count += valid_in_row + modified_base_count += modified_in_row return (modified_base_count, valid_base_count) @@ -267,55 +292,31 @@ def pileup_vectors_from_bedmethyl( # center_coord = (start_coord+end_coord)//2 if chromosome in source_tabix.contigs: for row in source_tabix.fetch(chromosome, start_coord, end_coord): - # TODO: can we consolidate this with pileup_counts_from_bedmethyl? - # Just the checks? - # TODO: probably this whole block should share logic with counts_from_bedmethyl AND from export functions - tabix_fields = row.split("\t") - pileup_basemod = tabix_fields[3] - pileup_strand = tabix_fields[5] - keep_basemod = False - if single_strand and pileup_strand.strip() != strand: - # We are on the wrong strand, skip the rest of the steps for this row - continue - elif len(pileup_basemod.split(",")) == 3: - pileup_modname, pileup_motif, pileup_mod_coord = ( - pileup_basemod.split(",") - ) - if ( - pileup_motif == parsed_motif.motif_seq - and int(pileup_mod_coord) == parsed_motif.modified_pos - and pileup_modname in parsed_motif.mod_codes - ): - keep_basemod = True - elif len(pileup_basemod.split(",")) == 1: - if pileup_basemod in parsed_motif.mod_codes: - keep_basemod = True - else: - raise ValueError( - f"Unexpected format in bedmethyl file: {row} contains {pileup_basemod} which cannot be parsed." - ) + ( + keep_basemod, + pileup_coord_relative, + modified_in_row, + valid_in_row, + ) = process_pileup_row( + row=row, + parsed_motif=parsed_motif, + region_start=start_coord, + region_end=end_coord, + region_strand=strand, + single_strand=single_strand, + regions_5to3prime=regions_5to3prime, + ) if keep_basemod: - pileup_info = tabix_fields[9].split(" ") - genomic_coord = int(tabix_fields[1]) - if regions_5to3prime and strand == "-": - # We want to flip the coordinates for this region so that it is recorded along the 5 prime to 3 prime direction - # This will enable analyses where the orientation of protein binding / transcriptional dynamics / etc is relevant for our pileup signal - pileup_coord_relative = end_coord - genomic_coord - 1 - else: - # Normal coordinates are the default. This will be used both for the '+' case and the '.' (no strand specified) case - pileup_coord_relative = genomic_coord - start_coord if pileup_coord_relative > region_len: print( f"WARNING: You have specified a region {chromosome}:{start_coord}-{end_coord} that is longer than the first region; the end of the region will be skipped. To make a profile plot with differently-sized region, consider using the window_size parameter to make a profile across centered windows." ) - break else: - valid_base_counts[pileup_coord_relative] += int( - pileup_info[0] - ) - modified_base_counts[pileup_coord_relative] += int( - pileup_info[2] + valid_base_counts[pileup_coord_relative] += valid_in_row + modified_base_counts[pileup_coord_relative] += ( + modified_in_row ) + return modified_base_counts, valid_base_counts From 3f3ec8549c1b66c99cfb8f46f92c7f0e36d03f15 Mon Sep 17 00:00:00 2001 From: Oberon Dixon-Luinenburg Date: Wed, 8 Jan 2025 09:30:39 -0800 Subject: [PATCH 02/23] DM-231 Removed regions=None case for pileup_counts_from_bedmethyl because it will complicate parallelization and is not clearly useful. --- dimelo/load_processed.py | 64 +++++++++++++++------------------------- 1 file changed, 23 insertions(+), 41 deletions(-) diff --git a/dimelo/load_processed.py b/dimelo/load_processed.py index 3e850eb..95ee18d 100644 --- a/dimelo/load_processed.py +++ b/dimelo/load_processed.py @@ -133,7 +133,7 @@ def process_pileup_row( def pileup_counts_from_bedmethyl( bedmethyl_file: str | Path, motif: str, - regions: str | Path | list[str | Path] | None = None, + regions: str | Path | list[str | Path], window_size: int | None = None, single_strand: bool = False, cores: int | None = None, # currently unused @@ -172,46 +172,28 @@ def pileup_counts_from_bedmethyl( parsed_motif = utils.ParsedMotif(motif) - if regions is not None: - # Get counts from the specified regions - regions_dict = utils.regions_dict_from_input( - regions, - window_size, - ) - for chromosome, region_list in regions_dict.items(): - for start_coord, end_coord, strand in region_list: - # TODO: change to try-except - if chromosome in source_tabix.contigs: - for row in source_tabix.fetch(chromosome, start_coord, end_coord): - keep_basemod, _, modified_in_row, valid_in_row = ( - process_pileup_row( - row=row, - parsed_motif=parsed_motif, - region_start=start_coord, - region_end=end_coord, - region_strand=strand, - single_strand=single_strand, - regions_5to3prime=False, - ) - ) - if keep_basemod: - valid_base_count += valid_in_row - modified_base_count += modified_in_row - else: - # Get counts from the whole input file - for row in source_tabix.fetch(): - keep_basemod, _, modified_in_row, valid_in_row = process_pileup_row( - row=row, - parsed_motif=parsed_motif, - region_start=start_coord, - region_end=end_coord, - region_strand=strand, - single_strand=single_strand, - regions_5to3prime=False, - ) - if keep_basemod: - valid_base_count += valid_in_row - modified_base_count += modified_in_row + # Get counts from the specified regions + regions_dict = utils.regions_dict_from_input( + regions, + window_size, + ) + for chromosome, region_list in regions_dict.items(): + for start_coord, end_coord, strand in region_list: + # TODO: change to try-except + if chromosome in source_tabix.contigs: + for row in source_tabix.fetch(chromosome, start_coord, end_coord): + keep_basemod, _, modified_in_row, valid_in_row = process_pileup_row( + row=row, + parsed_motif=parsed_motif, + region_start=start_coord, + region_end=end_coord, + region_strand=strand, + single_strand=single_strand, + regions_5to3prime=False, + ) + if keep_basemod: + valid_base_count += valid_in_row + modified_base_count += modified_in_row return (modified_base_count, valid_base_count) From 91fb5e4abc317debb1a03716ec47b7f4c483773a Mon Sep 17 00:00:00 2001 From: Oberon Dixon-Luinenburg Date: Wed, 8 Jan 2025 09:40:23 -0800 Subject: [PATCH 03/23] DM-229 Adjusted export.pileup_to_bigwig to use new load_processed.process_pileup_row and renamed/configured a few variables to support this. --- dimelo/export.py | 88 +++++++++++++++++++----------------------------- 1 file changed, 34 insertions(+), 54 deletions(-) diff --git a/dimelo/export.py b/dimelo/export.py index c55010b..d3dabab 100644 --- a/dimelo/export.py +++ b/dimelo/export.py @@ -6,7 +6,7 @@ import pysam from tqdm.auto import tqdm -from . import utils +from . import load_processed, utils """ This module contains code to export indexed and compressed parse output files to other formats that may be helpful for downstream analysis. @@ -57,8 +57,8 @@ def pileup_to_bigwig( # Because we need to set up the bigwig header for we start writing data to it, we need to pre-index the length of each contig tabix = pysam.TabixFile(str(bedmethyl_file)) - contig_lengths_tuples = [] - lines_by_contig = {} + contig_lengths = {} + contig_lines = {} parsed_motif = utils.ParsedMotif(motif) @@ -84,11 +84,11 @@ def pileup_to_bigwig( )[0] fields = last_row.split("\t") max_coord = int(fields[2]) - contig_lengths_tuples.append((contig, max_coord)) - lines_by_contig[contig] = rows_count + contig_lengths[contig] = max_coord + contig_lines[contig] = rows_count with pyBigWig.open(str(output_file_path), "w") as bw: - bw.addHeader(contig_lengths_tuples) + bw.addHeader([(contig, length) for contig, length in contig_lengths.items()]) for contig in tqdm( tabix.contigs, desc=f"Step 2: Writing {Path(bedmethyl_file).name} contents to {Path(output_file_path).name}", @@ -100,57 +100,37 @@ def pileup_to_bigwig( for row in tqdm( tabix.fetch(contig), desc=f"Writing {contig}.", - total=lines_by_contig[contig], + total=contig_lines[contig], leave=False, ): - # TODO: This code is copied from load_processed.pileup_counts_from_bedmethyl and should probably be consolidated at some point - tabix_fields = row.split("\t") - pileup_basemod = tabix_fields[3] - pileup_strand = tabix_fields[5] - keep_basemod = False - if (strand != ".") and (pileup_strand != strand): - # This entry is on the wrong strand - skip it - continue - elif len(pileup_basemod.split(",")) == 3: - pileup_modname, pileup_motif, pileup_mod_coord = ( - pileup_basemod.split(",") + keep_basemod, genomic_coord, modified_in_row, valid_in_row = ( + load_processed.process_pileup_row( + row=row, + parsed_motif=parsed_motif, + region_start=0, + region_end=contig_lengths[contig], + region_strand=strand, + single_strand=(strand != "."), + regions_5to3prime=False, ) - if ( - pileup_motif == parsed_motif.motif_seq - and int(pileup_mod_coord) == parsed_motif.modified_pos - and pileup_modname in parsed_motif.mod_codes - ): - keep_basemod = True - elif len(pileup_basemod.split(",")) == 1: - if pileup_basemod in parsed_motif.mod_codes: - keep_basemod = True - else: - raise ValueError( - f"Unexpected format in bedmethyl file: {row} contains {pileup_basemod} which cannot be parsed." - ) - # TODO: consolidate the above into a function; just do adding outside - if keep_basemod: - pileup_info = tabix_fields[9].split(" ") - valid_base_counts = int(pileup_info[0]) - modified_base_counts = int(pileup_info[2]) - if valid_base_counts > 0: - genomic_coord = int(tabix_fields[1]) - contig_list.append(contig) - start_list.append(genomic_coord) - end_list.append(genomic_coord + 1) - values_list.append(modified_base_counts / valid_base_counts) - - if len(values_list) > chunk_size: - bw.addEntries( - contig_list, # Contig names - start_list, # Start positions - ends=end_list, # End positions - values=values_list, # Corresponding values - ) - contig_list = [] - start_list = [] - end_list = [] - values_list = [] + ) + if keep_basemod and valid_in_row > 0: + contig_list.append(contig) + start_list.append(genomic_coord) + end_list.append(genomic_coord + 1) + values_list.append(modified_in_row / valid_in_row) + + if len(values_list) > chunk_size: + bw.addEntries( + contig_list, # Contig names + start_list, # Start positions + ends=end_list, # End positions + values=values_list, # Corresponding values + ) + contig_list = [] + start_list = [] + end_list = [] + values_list = [] bw.addEntries( contig_list, # Contig names start_list, # Start positions From 53d039bcebc71e0bbcfb7dee46f3d23b2cdf43d9 Mon Sep 17 00:00:00 2001 From: Oberon Dixon-Luinenburg Date: Thu, 9 Jan 2025 10:01:12 -0800 Subject: [PATCH 04/23] DM-192 Implemented parallelization core including shared memory and chunk generation, currently only for load_processed.pileup_vectors_from_bedmethyl. pileup_counts_from_bedmethyl is a simpler case. Passes pre-existing tests including when chunk_size 1: - with ProcessPoolExecutor(max_workers=cores_to_run) as executor: + with concurrent.futures.ProcessPoolExecutor( + max_workers=cores_to_run + ) as executor: # Use functools.partial to pre-fill arguments process_partial = partial( process_region, function_handle=function_handle, cores=1, **kwargs @@ -82,19 +86,25 @@ def process_pileup_row( region_start: int, region_end: int, region_strand: str, - single_strand: bool, - regions_5to3prime: bool, -) -> tuple[bool, int, int, int]: + subregion_start: int | None = None, + subregion_end: int | None = None, + single_strand: bool = False, + regions_5to3prime: bool = False, +) -> tuple[bool, int, int, int, int]: """ Returns: keep_basemod, pileup_coord_relative, modified_in_row, valid_in_row """ + if subregion_start is None: + subregion_start = region_start + if subregion_end is None: + subregion_end = region_end tabix_fields = row.split("\t") pileup_basemod = tabix_fields[3] pileup_strand = tabix_fields[5] keep_basemod = False if single_strand and pileup_strand.strip() != region_strand: # We are on the wrong strand, skip the rest of the steps for this row - return keep_basemod, None, None, None + return keep_basemod, 0, 0, 0, 0 elif len(pileup_basemod.split(",")) == 3: pileup_modname, pileup_motif, pileup_mod_coord = pileup_basemod.split(",") if ( @@ -110,24 +120,28 @@ def process_pileup_row( raise ValueError( f"Unexpected format in bedmethyl file: {row} contains {pileup_basemod} which cannot be parsed." ) - if keep_basemod: - pileup_info = tabix_fields[9].split(" ") - genomic_coord = int(tabix_fields[1]) - if regions_5to3prime and region_strand == "-": - # We want to flip the coordinates for this region so that it is recorded along the 5 prime to 3 prime direction - # This will enable analyses where the orientation of protein binding / transcriptional dynamics / etc is relevant for our pileup signal - pileup_coord_relative = region_end - genomic_coord - 1 - else: - # Normal coordinates are the default. This will be used both for the '+' case and the '.' (no strand specified) case - pileup_coord_relative = genomic_coord - region_start - - valid_in_row = int(pileup_info[0]) - modified_in_row = int(pileup_info[2]) - - return keep_basemod, pileup_coord_relative, modified_in_row, valid_in_row + pileup_info = tabix_fields[9].split(" ") + genomic_coord = int(tabix_fields[1]) + if regions_5to3prime and region_strand == "-": + # We want to flip the coordinates for this region so that it is recorded along the 5 prime to 3 prime direction + # This will enable analyses where the orientation of protein binding / transcriptional dynamics / etc is relevant for our pileup signal + pileup_coord_relative = subregion_end - genomic_coord - 1 + subregion_offset = region_end - subregion_end else: - return keep_basemod, None, None, None + # Normal coordinates are the default. This will be used both for the '+' case and the '.' (no strand specified) case + pileup_coord_relative = genomic_coord - subregion_start + subregion_offset = subregion_start - region_start + valid_in_row = int(pileup_info[0]) + modified_in_row = int(pileup_info[2]) + + return ( + keep_basemod, + pileup_coord_relative, + modified_in_row, + valid_in_row, + subregion_offset, + ) def pileup_counts_from_bedmethyl( @@ -177,19 +191,25 @@ def pileup_counts_from_bedmethyl( regions, window_size, ) + + cores_to_run = utils.cores_to_run(cores) + _ = cores_to_run + for chromosome, region_list in regions_dict.items(): for start_coord, end_coord, strand in region_list: # TODO: change to try-except if chromosome in source_tabix.contigs: for row in source_tabix.fetch(chromosome, start_coord, end_coord): - keep_basemod, _, modified_in_row, valid_in_row = process_pileup_row( - row=row, - parsed_motif=parsed_motif, - region_start=start_coord, - region_end=end_coord, - region_strand=strand, - single_strand=single_strand, - regions_5to3prime=False, + keep_basemod, _, modified_in_row, valid_in_row, _ = ( + process_pileup_row( + row=row, + parsed_motif=parsed_motif, + region_start=start_coord, + region_end=end_coord, + region_strand=strand, + single_strand=single_strand, + regions_5to3prime=False, + ) ) if keep_basemod: valid_base_count += valid_in_row @@ -209,6 +229,76 @@ def counts_from_fake(*args, **kwargs) -> tuple[int, int]: return test_data.fake_peak_enrichment(halfsize=window_halfsize, peak_height=0.15) +def pileup_vectors_process_chunk( + bedmethyl_file, + parsed_motif, + chunk, + region_len, + shm_name_modified, + shm_name_valid, + lock, + single_strand, + regions_5to3prime, +) -> None: + source_tabix = pysam.TabixFile(str(bedmethyl_file)) + existing_valid = shared_memory.SharedMemory(name=shm_name_valid) + existing_modified = shared_memory.SharedMemory(name=shm_name_modified) + valid_base_counts = np.ndarray( + (region_len,), dtype=np.int32, buffer=existing_valid.buf + ) + modified_base_counts = np.ndarray( + (region_len,), dtype=np.int32, buffer=existing_modified.buf + ) + + chromosome = chunk["chromosome"] + region_start = chunk["region_start"] + region_end = chunk["region_end"] + subregion_start = chunk["subregion_start"] + subregion_end = chunk["subregion_end"] + strand = chunk["strand"] + + subregion_offset = 0 + + valid_base_subregion = np.zeros(subregion_end - subregion_start, dtype=int) + modified_base_subregion = np.zeros(subregion_end - subregion_start, dtype=int) + + for row in source_tabix.fetch(chunk["chromosome"], subregion_start, subregion_end): + ( + keep_basemod, + pileup_coord_relative, + modified_in_row, + valid_in_row, + subregion_offset, + ) = process_pileup_row( + row=row, + parsed_motif=parsed_motif, + region_start=region_start, + region_end=region_end, + subregion_start=subregion_start, + subregion_end=subregion_end, + region_strand=strand, + single_strand=single_strand, + regions_5to3prime=regions_5to3prime, + ) + if keep_basemod: + if pileup_coord_relative > region_len: + print( + f"WARNING: You have specified a region starting at {chromosome}:{subregion_start - subregion_offset} that is longer than the first region; the end of the region will be skipped. To make a profile plot with differently-sized region, consider using the window_size parameter to make a profile across centered windows." + ) + else: + valid_base_subregion[pileup_coord_relative] += valid_in_row + modified_base_subregion[pileup_coord_relative] += modified_in_row + + with lock: + print(subregion_offset) + valid_base_counts[ + subregion_offset : subregion_offset + abs(subregion_end - subregion_start) + ] += valid_base_subregion + modified_base_counts[ + subregion_offset : subregion_offset + abs(subregion_end - subregion_start) + ] += modified_base_subregion + + def pileup_vectors_from_bedmethyl( bedmethyl_file: str | Path, motif: str, @@ -254,52 +344,65 @@ def pileup_vectors_from_bedmethyl( tuple containing (modified_base_counts, valid_base_counts) """ - source_tabix = pysam.TabixFile(str(bedmethyl_file)) + print(f"function call: {bedmethyl_file}, {regions}, {motif}") parsed_motif = utils.ParsedMotif(motif) regions_dict = utils.regions_dict_from_input(regions, window_size) + chunks_list = utils.process_chunks_from_regions_dict( + regions_dict, chunk_size=10_000 + ) + + print(regions_dict) + print(chunks_list) + + cores_to_run = utils.cores_to_run(cores) # Peek at a region to figure out what size the vectors should be first_key = next(iter(regions_dict)) first_tuple = regions_dict[first_key][0] region_len = first_tuple[1] - first_tuple[0] - valid_base_counts = np.zeros(region_len, dtype=int) - modified_base_counts = np.zeros(region_len, dtype=int) + shm_valid = shared_memory.SharedMemory( + create=True, size=(region_len) * np.dtype(np.int32).itemsize + ) + shm_modified = shared_memory.SharedMemory( + create=True, size=(region_len) * np.dtype(np.int32).itemsize + ) - for chromosome, region_list in regions_dict.items(): - for start_coord, end_coord, strand in region_list: - # TODO: This is not used anywhere; disabling for now - # center_coord = (start_coord+end_coord)//2 - if chromosome in source_tabix.contigs: - for row in source_tabix.fetch(chromosome, start_coord, end_coord): - ( - keep_basemod, - pileup_coord_relative, - modified_in_row, - valid_in_row, - ) = process_pileup_row( - row=row, - parsed_motif=parsed_motif, - region_start=start_coord, - region_end=end_coord, - region_strand=strand, - single_strand=single_strand, - regions_5to3prime=regions_5to3prime, - ) - if keep_basemod: - if pileup_coord_relative > region_len: - print( - f"WARNING: You have specified a region {chromosome}:{start_coord}-{end_coord} that is longer than the first region; the end of the region will be skipped. To make a profile plot with differently-sized region, consider using the window_size parameter to make a profile across centered windows." - ) - else: - valid_base_counts[pileup_coord_relative] += valid_in_row - modified_base_counts[pileup_coord_relative] += ( - modified_in_row - ) - - return modified_base_counts, valid_base_counts + manager = multiprocessing.Manager() + lock = manager.Lock() + + with concurrent.futures.ProcessPoolExecutor(max_workers=cores_to_run) as executor: + futures = [ + executor.submit( + pileup_vectors_process_chunk, + bedmethyl_file, + parsed_motif, + chunk, + region_len, + shm_modified.name, + shm_valid.name, + lock, + single_strand, + regions_5to3prime, + ) + for chunk in chunks_list + ] + for future in tqdm( + concurrent.futures.as_completed(futures), total=len(futures) + ): + try: + future.result() + except Exception as err: + raise RuntimeError("Subprocess failed.") from err + + modified_base_counts = np.ndarray( + (region_len,), dtype=np.int32, buffer=shm_modified.buf + ) + valid_base_counts = np.ndarray((region_len,), dtype=np.int32, buffer=shm_valid.buf) + + return np.copy(modified_base_counts), np.copy(valid_base_counts) def vector_from_fake(window_size: int, *args, **kwargs) -> np.ndarray: diff --git a/dimelo/test/dimelo_test.py b/dimelo/test/dimelo_test.py index 787aa83..87ff71e 100644 --- a/dimelo/test/dimelo_test.py +++ b/dimelo/test/dimelo_test.py @@ -317,7 +317,7 @@ class TestLoadProcessed: outputs section of dimelo/test/generate_test_targets.ipynb. """ - def test_unit__regions_list_list( + def test_unit__regions_to_list( self, test_case, kwargs, diff --git a/dimelo/utils.py b/dimelo/utils.py index aa85e55..83e9ce1 100644 --- a/dimelo/utils.py +++ b/dimelo/utils.py @@ -98,6 +98,28 @@ def adjust_threshold( return thresh +def process_chunks_from_regions_dict( + regions_dict: dict, + chunk_size: int = 10_000, +): + chunk_list = [] + for chromosome, region_list in regions_dict.items(): + for start_coord, end_coord, strand in region_list: + for subregion_start in range(start_coord, end_coord, chunk_size): + subregion_end = min(end_coord, subregion_start + chunk_size) + chunk_list.append( + { + "chromosome": chromosome, + "region_start": start_coord, + "region_end": end_coord, + "subregion_start": subregion_start, + "subregion_end": subregion_end, + "strand": strand, + } + ) + return chunk_list + + def regions_dict_from_input( regions: str | Path | list[str | Path] | None = None, window_size: int | None = None, From caf9dcdb988cce84333eef49acef03b5393e24b9 Mon Sep 17 00:00:00 2001 From: Oberon Dixon-Luinenburg Date: Thu, 9 Jan 2025 10:41:09 -0800 Subject: [PATCH 05/23] DM-232 Added strand information to regions .bed files. Re-generated read_vectors_from_hdf5 test targets to pass tests; other test targets are the same for now. --- dimelo/test/data/ctcf_demo_not_peak.bed | 400 +++++++++--------- dimelo/test/data/ctcf_demo_peak.bed | 200 ++++----- .../test/data/test_targets/test_matrix.pickle | Bin 3144815 -> 3144853 bytes 3 files changed, 300 insertions(+), 300 deletions(-) diff --git a/dimelo/test/data/ctcf_demo_not_peak.bed b/dimelo/test/data/ctcf_demo_not_peak.bed index 920b114..edfe622 100644 --- a/dimelo/test/data/ctcf_demo_not_peak.bed +++ b/dimelo/test/data/ctcf_demo_not_peak.bed @@ -1,200 +1,200 @@ -chr14 44123158 44123308 + 465.63275 . -chr14 44127026 44127176 + 465.63275 . -chr14 44123159 44123308 - 465.63275 . -chr14 44127026 44127175 - 465.63275 . -chr1 114356587 114356736 - 441.00102 . -chr1 114360454 114360603 - 441.00102 . -chr1 114356586 114356736 + 441.00102 . -chr1 114360454 114360604 + 441.00102 . -chrX 9700334 9700484 - 418.31102 . -chrX 9704202 9704352 - 418.31102 . -chr15 54632158 54632308 + 410.28758 . -chr15 54636060 54636176 + 410.28758 . -chr15 54632159 54632308 - 410.28758 . -chr15 54636060 54636175 - 410.28758 . -chr15 54632192 54632308 - 410.28758 . -chr15 54636060 54636210 - 410.28758 . -chr15 54632193 54632308 + 410.28758 . -chr15 54636060 54636209 + 410.28758 . -chr6 53009844 53009994 + 398.10126 . -chr6 53013712 53013862 + 398.10126 . -chr16 4279536 4279624 + 394.95247 . -chr16 4283404 4283554 + 394.95247 . -chr16 4279474 4279624 + 394.95247 . -chr16 4283404 4283490 + 394.95247 . -chr16 4279537 4279624 - 394.95247 . -chr16 4283404 4283553 - 394.95247 . -chr7 152343847 152343935 - 390.20159 . -chr7 152347715 152347865 - 390.20159 . -chr7 152343848 152343935 + 390.20159 . -chr7 152347715 152347864 + 390.20159 . -chr7 152343786 152343935 + 390.20159 . -chr7 152347715 152347802 + 390.20159 . -chr7 152343785 152343935 - 390.20159 . -chr7 152347715 152347803 - 390.20159 . -chr16 63442391 63442541 - 389.524 . -chr16 63446302 63446409 - 389.524 . -chr16 63442392 63442541 + 389.524 . -chr16 63446302 63446408 + 389.524 . -chr16 63442436 63442541 - 389.524 . -chr16 63446302 63446452 - 389.524 . -chr6 41196658 41196741 - 388.86052 . -chr6 41200525 41200674 - 388.86052 . -chr6 41196657 41196741 + 388.86052 . -chr6 41200525 41200675 + 388.86052 . -chr6 41196592 41196741 + 388.86052 . -chr6 41200525 41200608 + 388.86052 . -chr6 41196591 41196741 - 388.86052 . -chr6 41200525 41200609 - 388.86052 . -chr20 36033923 36034073 + 384.11318 . -chr20 36037791 36037941 + 384.11318 . -chr20 36033924 36034073 - 384.11318 . -chr20 36037791 36037940 - 384.11318 . -chr12 57871837 57871987 - 380.55342 . -chr12 57875753 57875855 - 380.55342 . -chr12 57871885 57871987 - 380.55342 . -chr12 57875753 57875903 - 380.55342 . -chr8 22846344 22846494 + 372.97972 . -chr8 22850296 22850362 + 372.97972 . -chr8 22846345 22846494 - 372.97972 . -chr8 22850296 22850361 - 372.97972 . -chr8 22846428 22846494 + 372.97972 . -chr8 22850296 22850446 + 372.97972 . -chr17 45987626 45987736 + 370.32321 . -chr17 45991494 45991644 + 370.32321 . -chr17 45987627 45987736 - 370.32321 . -chr17 45991494 45991643 - 370.32321 . -chr17 45987587 45987736 - 370.32321 . -chr17 45991494 45991603 - 370.32321 . -chr17 45987586 45987736 + 370.32321 . -chr17 45991494 45991604 + 370.32321 . -chr3 48462689 48462778 + 367.84554 . -chr3 48466556 48466705 + 367.84554 . -chr3 48462688 48462778 - 367.84554 . -chr3 48466556 48466706 - 367.84554 . -chr3 48462628 48462778 - 367.84554 . -chr3 48466556 48466646 - 367.84554 . -chr20 33335286 33335348 - 367.5176 . -chr20 33339154 33339304 - 367.5176 . -chr20 33335198 33335348 - 367.5176 . -chr20 33339154 33339216 - 367.5176 . -chr20 33335199 33335348 + 367.5176 . -chr20 33339154 33339215 + 367.5176 . -chr1 150101535 150101649 + 365.77314 . -chr1 150105402 150105551 + 365.77314 . -chr1 150101534 150101649 - 365.77314 . -chr1 150105402 150105552 - 365.77314 . -chr1 150101499 150101649 + 365.77314 . -chr1 150105402 150105517 + 365.77314 . -chr17 42517551 42517701 - 359.33549 . -chr17 42521481 42521569 - 359.33549 . -chr17 42517613 42517701 - 359.33549 . -chr17 42521481 42521631 - 359.33549 . -chr17 42517552 42517701 + 359.33549 . -chr17 42521481 42521568 + 359.33549 . -chr6 15561986 15562057 - 358.9469 . -chr6 15565853 15566002 - 358.9469 . -chr6 15561907 15562057 + 358.9469 . -chr6 15565853 15565925 + 358.9469 . -chr6 15561908 15562057 - 358.9469 . -chr6 15565853 15565924 - 358.9469 . -chr6 15561985 15562057 + 358.9469 . -chr6 15565853 15566003 + 358.9469 . -chrX 99209453 99209603 - 358.41391 . -chrX 99213321 99213471 - 358.41391 . -chrX 99209454 99209603 + 358.41391 . -chrX 99213321 99213470 + 358.41391 . -chr2 44482827 44482977 + 357.20939 . -chr2 44486695 44486845 + 357.20939 . -chr19 43453207 43453357 - 355.83581 . -chr19 43457120 43457225 - 355.83581 . -chr19 43453253 43453357 + 355.83581 . -chr19 43457120 43457269 + 355.83581 . -chr19 43453252 43453357 - 355.83581 . -chr19 43457120 43457270 - 355.83581 . -chr17 44334564 44334713 - 354.9178 . -chr17 44338431 44338580 - 354.9178 . -chr17 44334563 44334713 + 354.9178 . -chr17 44338431 44338581 + 354.9178 . -chr5 138876711 138876861 + 352.26403 . -chr5 138880579 138880729 + 352.26403 . -chr17 82008681 82008700 - 351.42341 . -chr17 82012549 82012699 - 351.42341 . -chr17 82008550 82008700 - 351.42341 . -chr17 82012549 82012568 - 351.42341 . -chr17 82008682 82008700 + 351.42341 . -chr17 82012549 82012698 + 351.42341 . -chr15 38664851 38665000 + 350.08504 . -chr15 38668760 38668867 + 350.08504 . -chr15 38664850 38665000 - 350.08504 . -chr15 38668760 38668868 - 350.08504 . -chr15 38664892 38665000 - 350.08504 . -chr15 38668760 38668910 - 350.08504 . -chr15 38664893 38665000 + 350.08504 . -chr15 38668760 38668909 + 350.08504 . -chr1 9168135 9168218 + 349.08889 . -chr1 9172003 9172153 + 349.08889 . -chr1 9168136 9168218 - 349.08889 . -chr1 9172003 9172152 - 349.08889 . -chr1 9168068 9168218 + 349.08889 . -chr1 9172003 9172086 + 349.08889 . -chr9 145234697 145234810 - 348.5771 . -chr9 145238565 145238715 - 348.5771 . -chr9 145234661 145234810 - 348.5771 . -chr9 145238565 145238677 - 348.5771 . -chr9 145234660 145234810 + 348.5771 . -chr9 145238565 145238678 + 348.5771 . -chr6 73588200 73588289 + 345.89289 . -chr6 73592068 73592218 + 345.89289 . -chr6 73588139 73588289 - 345.89289 . -chr6 73592068 73592157 - 345.89289 . -chr19 41732348 41732498 - 345.26706 . -chr19 41736216 41736366 - 345.26706 . -chr19 41732349 41732498 + 345.26706 . -chr19 41736216 41736365 + 345.26706 . -chr20 59989038 59989135 + 345.12156 . -chr20 59992905 59993054 + 345.12156 . -chr20 59988985 59989135 - 345.12156 . -chr20 59992905 59993003 - 345.12156 . -chr20 59989037 59989135 - 345.12156 . -chr20 59992905 59993055 - 345.12156 . -chr21 24894312 24894462 - 344.78198 . -chr21 24898180 24898330 - 344.78198 . -chr21 24894313 24894462 + 344.78198 . -chr21 24898180 24898329 + 344.78198 . -chr14 17377274 17377423 - 341.73484 . -chr14 17381209 17381290 - 341.73484 . -chr14 17377273 17377423 + 341.73484 . -chr14 17381209 17381291 + 341.73484 . -chr14 17377341 17377423 + 341.73484 . -chr14 17381209 17381359 + 341.73484 . -chr19 44926037 44926186 - 341.02209 . -chr19 44929904 44930053 - 341.02209 . -chr19 44926036 44926186 + 341.02209 . -chr19 44929904 44930054 + 341.02209 . -chr5 111666908 111667058 + 339.94407 . -chr5 111670776 111670926 + 339.94407 . -chr20 40161013 40161163 - 339.91828 . -chr20 40164881 40165031 - 339.91828 . -chr20 40161014 40161163 + 339.91828 . -chr20 40164881 40165030 + 339.91828 . -chr16 61261359 61261509 + 338.57132 . -chr16 61265306 61265377 + 338.57132 . -chr16 61261360 61261509 - 338.57132 . -chr16 61265306 61265376 - 338.57132 . -chr16 61261438 61261509 + 338.57132 . -chr16 61265306 61265456 + 338.57132 . -chr16 61261439 61261509 - 338.57132 . -chr16 61265306 61265455 - 338.57132 . -chr6 155876025 155876076 - 336.32967 . -chr6 155879892 155880041 - 336.32967 . -chr6 155876024 155876076 + 336.32967 . -chr6 155879892 155880042 + 336.32967 . -chr6 155875926 155876076 - 336.32967 . -chr6 155879892 155879942 - 336.32967 . -chr1 224661531 224661681 - 334.48922 . -chr1 224665451 224665547 - 334.48922 . -chr1 224661583 224661681 + 334.48922 . -chr1 224665451 224665601 + 334.48922 . -chr1 224661584 224661681 - 334.48922 . -chr1 224665451 224665600 - 334.48922 . \ No newline at end of file +chr14 44123158 44123308 + 465.63275 + +chr14 44127026 44127176 + 465.63275 + +chr14 44123159 44123308 - 465.63275 - +chr14 44127026 44127175 - 465.63275 - +chr1 114356587 114356736 - 441.00102 - +chr1 114360454 114360603 - 441.00102 - +chr1 114356586 114356736 + 441.00102 + +chr1 114360454 114360604 + 441.00102 + +chrX 9700334 9700484 - 418.31102 - +chrX 9704202 9704352 - 418.31102 - +chr15 54632158 54632308 + 410.28758 + +chr15 54636060 54636176 + 410.28758 + +chr15 54632159 54632308 - 410.28758 - +chr15 54636060 54636175 - 410.28758 - +chr15 54632192 54632308 - 410.28758 - +chr15 54636060 54636210 - 410.28758 - +chr15 54632193 54632308 + 410.28758 + +chr15 54636060 54636209 + 410.28758 + +chr6 53009844 53009994 + 398.10126 + +chr6 53013712 53013862 + 398.10126 + +chr16 4279536 4279624 + 394.95247 + +chr16 4283404 4283554 + 394.95247 + +chr16 4279474 4279624 + 394.95247 + +chr16 4283404 4283490 + 394.95247 + +chr16 4279537 4279624 - 394.95247 - +chr16 4283404 4283553 - 394.95247 - +chr7 152343847 152343935 - 390.20159 - +chr7 152347715 152347865 - 390.20159 - +chr7 152343848 152343935 + 390.20159 + +chr7 152347715 152347864 + 390.20159 + +chr7 152343786 152343935 + 390.20159 + +chr7 152347715 152347802 + 390.20159 + +chr7 152343785 152343935 - 390.20159 - +chr7 152347715 152347803 - 390.20159 - +chr16 63442391 63442541 - 389.524 - +chr16 63446302 63446409 - 389.524 - +chr16 63442392 63442541 + 389.524 + +chr16 63446302 63446408 + 389.524 + +chr16 63442436 63442541 - 389.524 - +chr16 63446302 63446452 - 389.524 - +chr6 41196658 41196741 - 388.86052 - +chr6 41200525 41200674 - 388.86052 - +chr6 41196657 41196741 + 388.86052 + +chr6 41200525 41200675 + 388.86052 + +chr6 41196592 41196741 + 388.86052 + +chr6 41200525 41200608 + 388.86052 + +chr6 41196591 41196741 - 388.86052 - +chr6 41200525 41200609 - 388.86052 - +chr20 36033923 36034073 + 384.11318 + +chr20 36037791 36037941 + 384.11318 + +chr20 36033924 36034073 - 384.11318 - +chr20 36037791 36037940 - 384.11318 - +chr12 57871837 57871987 - 380.55342 - +chr12 57875753 57875855 - 380.55342 - +chr12 57871885 57871987 - 380.55342 - +chr12 57875753 57875903 - 380.55342 - +chr8 22846344 22846494 + 372.97972 + +chr8 22850296 22850362 + 372.97972 + +chr8 22846345 22846494 - 372.97972 - +chr8 22850296 22850361 - 372.97972 - +chr8 22846428 22846494 + 372.97972 + +chr8 22850296 22850446 + 372.97972 + +chr17 45987626 45987736 + 370.32321 + +chr17 45991494 45991644 + 370.32321 + +chr17 45987627 45987736 - 370.32321 - +chr17 45991494 45991643 - 370.32321 - +chr17 45987587 45987736 - 370.32321 - +chr17 45991494 45991603 - 370.32321 - +chr17 45987586 45987736 + 370.32321 + +chr17 45991494 45991604 + 370.32321 + +chr3 48462689 48462778 + 367.84554 + +chr3 48466556 48466705 + 367.84554 + +chr3 48462688 48462778 - 367.84554 - +chr3 48466556 48466706 - 367.84554 - +chr3 48462628 48462778 - 367.84554 - +chr3 48466556 48466646 - 367.84554 - +chr20 33335286 33335348 - 367.5176 - +chr20 33339154 33339304 - 367.5176 - +chr20 33335198 33335348 - 367.5176 - +chr20 33339154 33339216 - 367.5176 - +chr20 33335199 33335348 + 367.5176 + +chr20 33339154 33339215 + 367.5176 + +chr1 150101535 150101649 + 365.77314 + +chr1 150105402 150105551 + 365.77314 + +chr1 150101534 150101649 - 365.77314 - +chr1 150105402 150105552 - 365.77314 - +chr1 150101499 150101649 + 365.77314 + +chr1 150105402 150105517 + 365.77314 + +chr17 42517551 42517701 - 359.33549 - +chr17 42521481 42521569 - 359.33549 - +chr17 42517613 42517701 - 359.33549 - +chr17 42521481 42521631 - 359.33549 - +chr17 42517552 42517701 + 359.33549 + +chr17 42521481 42521568 + 359.33549 + +chr6 15561986 15562057 - 358.9469 - +chr6 15565853 15566002 - 358.9469 - +chr6 15561907 15562057 + 358.9469 + +chr6 15565853 15565925 + 358.9469 + +chr6 15561908 15562057 - 358.9469 - +chr6 15565853 15565924 - 358.9469 - +chr6 15561985 15562057 + 358.9469 + +chr6 15565853 15566003 + 358.9469 + +chrX 99209453 99209603 - 358.41391 - +chrX 99213321 99213471 - 358.41391 - +chrX 99209454 99209603 + 358.41391 + +chrX 99213321 99213470 + 358.41391 + +chr2 44482827 44482977 + 357.20939 + +chr2 44486695 44486845 + 357.20939 + +chr19 43453207 43453357 - 355.83581 - +chr19 43457120 43457225 - 355.83581 - +chr19 43453253 43453357 + 355.83581 + +chr19 43457120 43457269 + 355.83581 + +chr19 43453252 43453357 - 355.83581 - +chr19 43457120 43457270 - 355.83581 - +chr17 44334564 44334713 - 354.9178 - +chr17 44338431 44338580 - 354.9178 - +chr17 44334563 44334713 + 354.9178 + +chr17 44338431 44338581 + 354.9178 + +chr5 138876711 138876861 + 352.26403 + +chr5 138880579 138880729 + 352.26403 + +chr17 82008681 82008700 - 351.42341 - +chr17 82012549 82012699 - 351.42341 - +chr17 82008550 82008700 - 351.42341 - +chr17 82012549 82012568 - 351.42341 - +chr17 82008682 82008700 + 351.42341 + +chr17 82012549 82012698 + 351.42341 + +chr15 38664851 38665000 + 350.08504 + +chr15 38668760 38668867 + 350.08504 + +chr15 38664850 38665000 - 350.08504 - +chr15 38668760 38668868 - 350.08504 - +chr15 38664892 38665000 - 350.08504 - +chr15 38668760 38668910 - 350.08504 - +chr15 38664893 38665000 + 350.08504 + +chr15 38668760 38668909 + 350.08504 + +chr1 9168135 9168218 + 349.08889 + +chr1 9172003 9172153 + 349.08889 + +chr1 9168136 9168218 - 349.08889 - +chr1 9172003 9172152 - 349.08889 - +chr1 9168068 9168218 + 349.08889 + +chr1 9172003 9172086 + 349.08889 + +chr9 145234697 145234810 - 348.5771 - +chr9 145238565 145238715 - 348.5771 - +chr9 145234661 145234810 - 348.5771 - +chr9 145238565 145238677 - 348.5771 - +chr9 145234660 145234810 + 348.5771 + +chr9 145238565 145238678 + 348.5771 + +chr6 73588200 73588289 + 345.89289 + +chr6 73592068 73592218 + 345.89289 + +chr6 73588139 73588289 - 345.89289 - +chr6 73592068 73592157 - 345.89289 - +chr19 41732348 41732498 - 345.26706 - +chr19 41736216 41736366 - 345.26706 - +chr19 41732349 41732498 + 345.26706 + +chr19 41736216 41736365 + 345.26706 + +chr20 59989038 59989135 + 345.12156 + +chr20 59992905 59993054 + 345.12156 + +chr20 59988985 59989135 - 345.12156 - +chr20 59992905 59993003 - 345.12156 - +chr20 59989037 59989135 - 345.12156 - +chr20 59992905 59993055 - 345.12156 - +chr21 24894312 24894462 - 344.78198 - +chr21 24898180 24898330 - 344.78198 - +chr21 24894313 24894462 + 344.78198 + +chr21 24898180 24898329 + 344.78198 + +chr14 17377274 17377423 - 341.73484 - +chr14 17381209 17381290 - 341.73484 - +chr14 17377273 17377423 + 341.73484 + +chr14 17381209 17381291 + 341.73484 + +chr14 17377341 17377423 + 341.73484 + +chr14 17381209 17381359 + 341.73484 + +chr19 44926037 44926186 - 341.02209 - +chr19 44929904 44930053 - 341.02209 - +chr19 44926036 44926186 + 341.02209 + +chr19 44929904 44930054 + 341.02209 + +chr5 111666908 111667058 + 339.94407 + +chr5 111670776 111670926 + 339.94407 + +chr20 40161013 40161163 - 339.91828 - +chr20 40164881 40165031 - 339.91828 - +chr20 40161014 40161163 + 339.91828 + +chr20 40164881 40165030 + 339.91828 + +chr16 61261359 61261509 + 338.57132 + +chr16 61265306 61265377 + 338.57132 + +chr16 61261360 61261509 - 338.57132 - +chr16 61265306 61265376 - 338.57132 - +chr16 61261438 61261509 + 338.57132 + +chr16 61265306 61265456 + 338.57132 + +chr16 61261439 61261509 - 338.57132 - +chr16 61265306 61265455 - 338.57132 - +chr6 155876025 155876076 - 336.32967 - +chr6 155879892 155880041 - 336.32967 - +chr6 155876024 155876076 + 336.32967 + +chr6 155879892 155880042 + 336.32967 + +chr6 155875926 155876076 - 336.32967 - +chr6 155879892 155879942 - 336.32967 - +chr1 224661531 224661681 - 334.48922 - +chr1 224665451 224665547 - 334.48922 - +chr1 224661583 224661681 + 334.48922 + +chr1 224665451 224665601 + 334.48922 + +chr1 224661584 224661681 - 334.48922 - +chr1 224665451 224665600 - 334.48922 - \ No newline at end of file diff --git a/dimelo/test/data/ctcf_demo_peak.bed b/dimelo/test/data/ctcf_demo_peak.bed index ef01c44..279cd25 100644 --- a/dimelo/test/data/ctcf_demo_peak.bed +++ b/dimelo/test/data/ctcf_demo_peak.bed @@ -1,100 +1,100 @@ -chr14 44125008 44125326 + 465.63275 . -chr14 44125009 44125325 - 465.63275 . -chr1 114358437 114358753 - 441.00102 . -chr1 114358436 114358754 + 441.00102 . -chrX 9702184 9702502 - 418.31102 . -chr15 54634008 54634326 + 410.28758 . -chr15 54634009 54634325 - 410.28758 . -chr15 54634042 54634360 - 410.28758 . -chr15 54634043 54634359 + 410.28758 . -chr6 53011694 53012012 + 398.10126 . -chr16 4281386 4281704 + 394.95247 . -chr16 4281324 4281640 + 394.95247 . -chr16 4281387 4281703 - 394.95247 . -chr7 152345697 152346015 - 390.20159 . -chr7 152345698 152346014 + 390.20159 . -chr7 152345636 152345952 + 390.20159 . -chr7 152345635 152345953 - 390.20159 . -chr16 63444241 63444559 - 389.524 . -chr16 63444242 63444558 + 389.524 . -chr16 63444286 63444602 - 389.524 . -chr6 41198508 41198824 - 388.86052 . -chr6 41198507 41198825 + 388.86052 . -chr6 41198442 41198758 + 388.86052 . -chr6 41198441 41198759 - 388.86052 . -chr20 36035773 36036091 + 384.11318 . -chr20 36035774 36036090 - 384.11318 . -chr12 57873687 57874005 - 380.55342 . -chr12 57873735 57874053 - 380.55342 . -chr8 22848194 22848512 + 372.97972 . -chr8 22848195 22848511 - 372.97972 . -chr8 22848278 22848596 + 372.97972 . -chr17 45989476 45989794 + 370.32321 . -chr17 45989477 45989793 - 370.32321 . -chr17 45989437 45989753 - 370.32321 . -chr17 45989436 45989754 + 370.32321 . -chr3 48464539 48464855 + 367.84554 . -chr3 48464538 48464856 - 367.84554 . -chr3 48464478 48464796 - 367.84554 . -chr20 33337136 33337454 - 367.5176 . -chr20 33337048 33337366 - 367.5176 . -chr20 33337049 33337365 + 367.5176 . -chr1 150103385 150103701 + 365.77314 . -chr1 150103384 150103702 - 365.77314 . -chr1 150103349 150103667 + 365.77314 . -chr17 42519401 42519719 - 359.33549 . -chr17 42519463 42519781 - 359.33549 . -chr17 42519402 42519718 + 359.33549 . -chr6 15563836 15564152 - 358.9469 . -chr6 15563757 15564075 + 358.9469 . -chr6 15563758 15564074 - 358.9469 . -chr6 15563835 15564153 + 358.9469 . -chrX 99211303 99211621 - 358.41391 . -chrX 99211304 99211620 + 358.41391 . -chr2 44484677 44484995 + 357.20939 . -chr19 43455057 43455375 - 355.83581 . -chr19 43455103 43455419 + 355.83581 . -chr19 43455102 43455420 - 355.83581 . -chr17 44336414 44336730 - 354.9178 . -chr17 44336413 44336731 + 354.9178 . -chr5 138878561 138878879 + 352.26403 . -chr17 82010531 82010849 - 351.42341 . -chr17 82010400 82010718 - 351.42341 . -chr17 82010532 82010848 + 351.42341 . -chr15 38666701 38667017 + 350.08504 . -chr15 38666700 38667018 - 350.08504 . -chr15 38666742 38667060 - 350.08504 . -chr15 38666743 38667059 + 350.08504 . -chr1 9169985 9170303 + 349.08889 . -chr1 9169986 9170302 - 349.08889 . -chr1 9169918 9170236 + 349.08889 . -chr9 145236547 145236865 - 348.5771 . -chr9 145236511 145236827 - 348.5771 . -chr9 145236510 145236828 + 348.5771 . -chr6 73590050 73590368 + 345.89289 . -chr6 73589989 73590307 - 345.89289 . -chr19 41734198 41734516 - 345.26706 . -chr19 41734199 41734515 + 345.26706 . -chr20 59990888 59991204 + 345.12156 . -chr20 59990835 59991153 - 345.12156 . -chr20 59990887 59991205 - 345.12156 . -chr21 24896162 24896480 - 344.78198 . -chr21 24896163 24896479 + 344.78198 . -chr14 17379124 17379440 - 341.73484 . -chr14 17379123 17379441 + 341.73484 . -chr14 17379191 17379509 + 341.73484 . -chr19 44927887 44928203 - 341.02209 . -chr19 44927886 44928204 + 341.02209 . -chr5 111668758 111669076 + 339.94407 . -chr20 40162863 40163181 - 339.91828 . -chr20 40162864 40163180 + 339.91828 . -chr16 61263209 61263527 + 338.57132 . -chr16 61263210 61263526 - 338.57132 . -chr16 61263288 61263606 + 338.57132 . -chr16 61263289 61263605 - 338.57132 . -chr6 155877875 155878191 - 336.32967 . -chr6 155877874 155878192 + 336.32967 . -chr6 155877776 155878092 - 336.32967 . -chr1 224663381 224663697 - 334.48922 . -chr1 224663433 224663751 + 334.48922 . -chr1 224663434 224663750 - 334.48922 . \ No newline at end of file +chr14 44125008 44125326 + 465.63275 + +chr14 44125009 44125325 - 465.63275 - +chr1 114358437 114358753 - 441.00102 - +chr1 114358436 114358754 + 441.00102 + +chrX 9702184 9702502 - 418.31102 - +chr15 54634008 54634326 + 410.28758 + +chr15 54634009 54634325 - 410.28758 - +chr15 54634042 54634360 - 410.28758 - +chr15 54634043 54634359 + 410.28758 + +chr6 53011694 53012012 + 398.10126 + +chr16 4281386 4281704 + 394.95247 + +chr16 4281324 4281640 + 394.95247 + +chr16 4281387 4281703 - 394.95247 - +chr7 152345697 152346015 - 390.20159 - +chr7 152345698 152346014 + 390.20159 + +chr7 152345636 152345952 + 390.20159 + +chr7 152345635 152345953 - 390.20159 - +chr16 63444241 63444559 - 389.524 - +chr16 63444242 63444558 + 389.524 + +chr16 63444286 63444602 - 389.524 - +chr6 41198508 41198824 - 388.86052 - +chr6 41198507 41198825 + 388.86052 + +chr6 41198442 41198758 + 388.86052 + +chr6 41198441 41198759 - 388.86052 - +chr20 36035773 36036091 + 384.11318 + +chr20 36035774 36036090 - 384.11318 - +chr12 57873687 57874005 - 380.55342 - +chr12 57873735 57874053 - 380.55342 - +chr8 22848194 22848512 + 372.97972 + +chr8 22848195 22848511 - 372.97972 - +chr8 22848278 22848596 + 372.97972 + +chr17 45989476 45989794 + 370.32321 + +chr17 45989477 45989793 - 370.32321 - +chr17 45989437 45989753 - 370.32321 - +chr17 45989436 45989754 + 370.32321 + +chr3 48464539 48464855 + 367.84554 + +chr3 48464538 48464856 - 367.84554 - +chr3 48464478 48464796 - 367.84554 - +chr20 33337136 33337454 - 367.5176 - +chr20 33337048 33337366 - 367.5176 - +chr20 33337049 33337365 + 367.5176 + +chr1 150103385 150103701 + 365.77314 + +chr1 150103384 150103702 - 365.77314 - +chr1 150103349 150103667 + 365.77314 + +chr17 42519401 42519719 - 359.33549 - +chr17 42519463 42519781 - 359.33549 - +chr17 42519402 42519718 + 359.33549 + +chr6 15563836 15564152 - 358.9469 - +chr6 15563757 15564075 + 358.9469 + +chr6 15563758 15564074 - 358.9469 - +chr6 15563835 15564153 + 358.9469 + +chrX 99211303 99211621 - 358.41391 - +chrX 99211304 99211620 + 358.41391 + +chr2 44484677 44484995 + 357.20939 + +chr19 43455057 43455375 - 355.83581 - +chr19 43455103 43455419 + 355.83581 + +chr19 43455102 43455420 - 355.83581 - +chr17 44336414 44336730 - 354.9178 - +chr17 44336413 44336731 + 354.9178 + +chr5 138878561 138878879 + 352.26403 + +chr17 82010531 82010849 - 351.42341 - +chr17 82010400 82010718 - 351.42341 - +chr17 82010532 82010848 + 351.42341 + +chr15 38666701 38667017 + 350.08504 + +chr15 38666700 38667018 - 350.08504 - +chr15 38666742 38667060 - 350.08504 - +chr15 38666743 38667059 + 350.08504 + +chr1 9169985 9170303 + 349.08889 + +chr1 9169986 9170302 - 349.08889 - +chr1 9169918 9170236 + 349.08889 + +chr9 145236547 145236865 - 348.5771 - +chr9 145236511 145236827 - 348.5771 - +chr9 145236510 145236828 + 348.5771 + +chr6 73590050 73590368 + 345.89289 + +chr6 73589989 73590307 - 345.89289 - +chr19 41734198 41734516 - 345.26706 - +chr19 41734199 41734515 + 345.26706 + +chr20 59990888 59991204 + 345.12156 + +chr20 59990835 59991153 - 345.12156 - +chr20 59990887 59991205 - 345.12156 - +chr21 24896162 24896480 - 344.78198 - +chr21 24896163 24896479 + 344.78198 + +chr14 17379124 17379440 - 341.73484 - +chr14 17379123 17379441 + 341.73484 + +chr14 17379191 17379509 + 341.73484 + +chr19 44927887 44928203 - 341.02209 - +chr19 44927886 44928204 + 341.02209 + +chr5 111668758 111669076 + 339.94407 + +chr20 40162863 40163181 - 339.91828 - +chr20 40162864 40163180 + 339.91828 + +chr16 61263209 61263527 + 338.57132 + +chr16 61263210 61263526 - 338.57132 - +chr16 61263288 61263606 + 338.57132 + +chr16 61263289 61263605 - 338.57132 - +chr6 155877875 155878191 - 336.32967 - +chr6 155877874 155878192 + 336.32967 + +chr6 155877776 155878092 - 336.32967 - +chr1 224663381 224663697 - 334.48922 - +chr1 224663433 224663751 + 334.48922 + +chr1 224663434 224663750 - 334.48922 - \ No newline at end of file diff --git a/dimelo/test/data/test_targets/test_matrix.pickle b/dimelo/test/data/test_targets/test_matrix.pickle index ba4d5d0caf66004da519f0367a40ede7b91d926d..a2c371aec59b27ab4ccb756bae3acccbf89ca8cd 100644 GIT binary patch delta 36666 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 delta 24517 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 From 64a9f65a706c8ece1d9d3e6b8383082f82b4eadb Mon Sep 17 00:00:00 2001 From: Oberon Dixon-Luinenburg Date: Thu, 9 Jan 2025 11:17:10 -0800 Subject: [PATCH 06/23] DM-232 Added single_strand and regions_5to3prime to cases.py. Adjusted generate_targets.py to properly handle copying over new kwargs from cases.py when re-running some but not all targets: if all targets are re-run, then the old test_matrix.pkl is discarded. If only some are re-run, we need the old test_matrix.pkl, but still need to copy over all the kwargs for all cases that won't be re-run and still need to copy over old results, which will be overridden for re-run targets. --- dimelo/test/cases.py | 10 ++++++++++ .../test/data/test_targets/test_matrix.pickle | Bin 3144853 -> 3144762 bytes dimelo/test/generate_targets.py | 18 ++++++++++++++++-- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/dimelo/test/cases.py b/dimelo/test/cases.py index 2a717ec..85366d9 100644 --- a/dimelo/test/cases.py +++ b/dimelo/test/cases.py @@ -31,6 +31,8 @@ "sort_by": ["read_start", "read_name", "motif"], "smooth_window": 1, "title": "megalodon_peaks_190", + "single_strand": False, + "regions_5to3prime": False, }, # outputs dict function:values {}, # populated in subsequent cells @@ -48,6 +50,8 @@ "sort_by": ["read_start", "read_name", "motif"], "smooth_window": 10, "title": "megalodon_single_190", + "single_strand": False, + "regions_5to3prime": False, }, # outputs dict function:values {}, # populated in subsequent cells @@ -65,6 +69,8 @@ "sort_by": ["read_start", "read_name", "motif"], "smooth_window": 100, "title": "megalodon_single_and_peaks_190", + "single_strand": True, + "regions_5to3prime": True, }, # outputs dict function:values {}, # populated in subsequent cells @@ -82,6 +88,8 @@ "sort_by": ["read_start", "read_name", "motif"], "smooth_window": 100, "title": "megalodon_peaks_nothresh", + "single_strand": True, + "regions_5to3prime": False, }, # outputs dict function:values {}, # populated in subsequent cells @@ -99,6 +107,8 @@ "sort_by": ["read_start", "read_name", "motif"], "smooth_window": 1, "title": "megalodon_single_nothresh", + "single_strand": False, + "regions_5to3prime": True, }, # outputs dict function:values {}, # populated in subsequent cells diff --git a/dimelo/test/data/test_targets/test_matrix.pickle b/dimelo/test/data/test_targets/test_matrix.pickle index a2c371aec59b27ab4ccb756bae3acccbf89ca8cd..f2cd6f3550a117c60cd672ee1a92dfb19c61ffec 100644 GIT binary patch literal 3144762 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­00~9{z|2@1_}L%kS>Mdo2L7k`SY9H5Y0P%XWjlW?Ps4|=S=^yFMm+p=~qW~=q2Zz z!g;c9pL^9hf6PaHg|DyFK|a-o-;f{90XyOp7k%UN&%Gx9^f@>3EM9u_xqRy<`}nJ0 z>}Q{U;-wdob5F}7f8W{XMUh=u|@qfQno~%3P;u-oO9(fz?XHOr}GgpTBslM_dZtM2zA92freie^+ z`9q!_$c}jRgZkQswobqNTK9gFC+|>t_+x#{pbwl!af*lCA(9{FNnG;HE`P+Yzxhv} zxcIFP(Dw6_escUIr@r#c-lzhE{1G>rU;4@X;-|i0M_;lxTt~A5`O6+TcJalh@8p}D zee8=DlGndOfBB=&(2#!qqSc3f>-glv!5_5z$?MRb_m}w98;XM+e&}=g;@41)J?rA< z54-l^>wo@3{y^t$WQOd+S1%}U>dG(ntY&kuQ^XSgn}^zdUy zvkTRSUU8wJK4piW_KORxF6iO9xXq2>oZ<&P?2^}q^1}|qx8J^DJ=oE|^2|TyLmtF! z{*c2b&kjCX-R$F^{)FmgUHta*M_$#FynLd?@BL%{5b5EE{0!yLle=_b`8l@u;tT{NoRM`0PM=aju;&ePNwGeIibJp?K8;AF7{x z(nGI$vr8X&enD~TSMlQWn|ePADb_VWj-&v2a{ z`sIgSXddY&eEC-&{?h9nA`j)4KjM-vdaUzHUg#mmFM9c9zdS(tMK4-4?pQ)cZmFh^zv)Sr`H^iFY&6&&<<*<)664OOH7C!C!IU(_@_-a`H#cK7LvExtAVjpLyo~(MSBHPaV*ZU)}-g z&W?C}zo>4*{OT+6^34x^(T}fg;unYg{I=gaaFj+3e)9PhIpYznmL!;EPY+s|)+|iksj3;y1hev2MRO z@!6FheMrANs6YGSvQ8hn>Msud(Qn;;{_$hB@=D%1zo2-;!7qKw4mo=C1^fJ`SDf-s zkA39faGgDITNj^mqaWzCk0168QU9s8IM}nUzw{eD^1vT)u!}Db>Zrc>?8~=!=wS!a zJ8uE=&v_jcpB?oVpYy@K`iPf5`hlE$i=Q9t4D%xn_T*I@^1;41M&|#}Z*^slKK`=9 z4|4i>p7f3m$+NG1^zuLP5#C$;;y=IHb%-5v z>S`Z(NI#lhar09@h+p31U0;)j^paNxbrJ8F0-ifmS16C{$Q%9i${S>t9eLt6J@Oz< z`|#CYULbu?zQ^VOJNWv-IaC*R*%1#uT796ntn)+OxbdGI*DI=?5Mwf)z|d+9)~^qhWS@-a`x*F z^6DvG?_~1)qi46O(#IY?e<419*|A@|lb?EkKC;3(Kqr!jy?JkA0ck_l{ct=#V0?`HNE7mi&KB{TOR3y z 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 z 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

E?rQTJxV@a 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


OI*6X%F7>r^4l-cFS?>UB>y$Ku&1zmLq1dhmna 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
Eb`SgKv=g|k!50cMNdBkAW z*UHcBpUYo5zjw~2yxxB9L-`tKJn~@HM;(L*YM!`-^eeXd=GM{IKJtq2G@r%rL3qT+ z9l0N{bwBVx_{1RjUYy$pAJjR$d3a#2PR7f0;AizLpY^r)^eMLbT6Of4r!l-*Z&A(htHT1~pHt2wzco8pGH8+!&q1Lfw}=G*8^B!&{1~--?&cS=y)j^yyZi^*q*E_IDH-&=2dQVMJYtYO zjWwUu;cbfOgP9(6a8n-r=z-*0sC?oUF4d(^^)=s$>4yhuep@j*irHMvYhM=A*TSX! z^r=31Q0rOT;%i-FbX)nXPCp0_BoAhJ>PxX#7arJ}*W&fom8WsG2Rsm-#^k}d^%fu9 z47c5{dKzbY9Cn^P4-2_}=4UZ^MfyPM8n^P)TbSv#`l!yoYYY#hu5l|*y%*63>C>2ehVT_L{@gse+DE>H^ug1Zd@s@u z(noyQsQYN#+7CWBm#=-qU`tQybNiG}tjL_XdF><4Fw@WYnx|j$S-fk0HkW)hKg-jX zq4u?6)lt6IH;vJ6A#*aG)_dcOM}8@?=hA-qdUcla=u>3AB0SA!F?_`qKdWym&pw;# zWja}2=P6HP_?p)ko}%)I!4{u7e2~1N)-_iCrm^a4oaw^@;Sq!6!7NW5gqI;a#f-0c z?bBHK#PEm}se@W4ral+7U*ndZ@`)8yr?;NRnO>IHdA&UCBc9u@e2urIt2#PIWB8!fi51~*3(;3S%@c!j`SgLUeytyL zobB1W2mN5Huf0jDMe}+qS z=>s!;&Cli2-|B1CGo9W(`W1Wox6RW%vRLP~Vsw<(%2RJ4x-CQp9`UwtQ{7g7tG=!K zK0Ro1`~>Ivp?$=l>TN5py1S0Ey?f{O_P2Oi*I4(_ zy2i>Uh6j>gimIdWrn=~5sQSG;?b8^YEKglg`Ez6R=JxgSGyN>z(p}ou(xtBY#2~y) zajxF3`FcNd=V^Zy?@G5dZ&!0$x|`Os`_epfz^tzM-ndsc<1L+|dK&lYF6ABcyw;w& zkH)S3UDbEJ$ENz5_GiAK3&PWw{8H@I>*eiwk4&Haz>K%;{6Wo|J7+F`Q(ttR#=ZJk zUzYFH-4-v~Bg-?FI!GSWyvFcaxU{dOyJ?-hz)Y`I&-&)(vpJe42D3S>de+y*L*L(mxq4F*SyB` zD=JUpjITV6>C?Q%%G3JXSoMfEMcrdly{tc*)5>dIW1ZKkD?f{Sb>Jzg?yl?1V@?*6 zpNpzHw|`T9YkpSG^6Ycib@ouyy;`yMA6Be;_U_T!2M_GkSKg-mOZAuws?Je~Tl=-@ z+q#c!&B=7Kd~5%#PxBh9ZmX_*;;b*r(>E8<1DE#q_GNQ4-y18hcaMy>Exm2&wDw#& zr?+q0yw?3>^=;+3AH}8mEgkCUYfQd{t-e+r{azmYO>tNA&{foZsgu{3e1;ic^BQM* zz4=U!yrSw-*F15n4zCw8J@Sg^k|$QAp5a_RI$0lic#70pNMDObJ>!#Cq))NMqpp2f zyp&I0hS|I`sN~Y zz^uPj&-&)(=g!IabMvh|d-XCN`mH)Va4x^q*Q+;|*UM)=#ku_%U-PY4_m~^2KK)sq zdM|EEN9UodsJvE8e=o1aZ`FI}w0N7=*;8>_x~jt*@*0zGA$_3o=jOG)6=(X|2M^SG zZ`|9T@ieb-?;gFpOh3!_>cZQW4tk2{gIaIJy?xu__3E_t-n7mhirdmv9p;eNn0yOc zeOW!rXY*Qo>Y(am`Ha`gZ}p>-A^p^|So81|;epgOCJ#~vvpn@}q0Z5`H7Da|`AiQ! zsJtu>uT_VaVXJ@B`a#WY?V0VNd33<6u6g3Dk9sen1Jb84`3&KMEuPlt1GS#TEk1QH z)5-F^eeg2O^vP>qmd|+bGo+8Y#^etg*#l(0#^g7}xw>=tz56ZIUE0^X*RFU=_offj z{jxl~te)lRQ_T2t^XO`y#u<;i;->wX9=f3Nh+B1dz1Y&D4x+0ud5}6t9?bGuhX+yz z=jQ3lFw@KUSson_p2p-A;bo}&O=ISuLkwnl>Y(y8hSx&+6zS9a(zsWz#cS2)?x%Vh zxAfqHy?o{M_G=$;Z$CVc{!KB{%knyJQ{LQu1{4@>_kGUY17>RG!8eua&0`q6?A-v;5q8O9wqLR9)oaD{E3cKO4rcw-LFH+zJnAjX`sU`dIp`>6e9hBGo>+0yy6Uy!*1X>SULEBT zgROa4eQtk?->T~#89&SS_V@DU&QZR`%+2!Ddl4OwK8?v|2wySdFU_N`{p4FnA3Tl8 zX9ypJM?4od?bmsm>dozM@mqEFSDwc3GHmgwgXj>0nkSx%=z&>(R@eO8n0eYq9^AB^ z>14WD9vyJkyk7lmAMKwTqq`|GR}o#!6H^E0=II0J2g$b(J_ujqR$l8_KfGOIHb2W} z`@jb?p5~QL48kV{v%J>ffvq|`Q281wFRQ~_imIz|OBX(v@muw*PxGpyF?{kM`3y5& zmRFsOm*wfFuBdfl5PlZ7^3>;|&YjzTRQbo{zIyk}c$(Lk=QB4?pQ7qyvF3NBgKjpD zJP5yq@H5Q%;m@tp2WmfgMdfJ>U-QISojeF1%<|OdB6=YG8k0XL-1dC*z=OJv<2EPr zhrA;9N1j-*RaZXo+&=hVOGkO|TR68*`B|Lhvwf7G@yPe`TRiHD%u$5bo6mTej`B6` z?SluRqj8p3UKVQ}J;fF;tCI&+cW$gYb7P&S{aQb)n7u&VBg-qV75C~WPvh1c>P!3R z-!}H{vy|8B%j%lfSbfksF{pfE>b=sj35x9Tn3tbcBvIawcdu$PzdwSQMJy4yzX3q)VzET8eB=zZJ6=yeuXU!dIjY zYP}WHw{2uDx^rXt6jf(#UHQFnYi_R&ylv~Do8dvv%l2sHH{DbFHEzvs)m2a9tiP9+ z^^@P04tn6ObkPTyqe#7l^kqD)YfN93*E+lml~0@@I@F0XR9+U72U~i|%VP41s;~7{ zto>Qs($P9PnkR16;bpjKf2Mof@=JZtK4LKQLF*dRm*uH%8(Z^w>n+~4_g1~bp0E4# z#+&Ya*!|q++&$*Q z>f}N7Bg@0nIxz@u*QoPaacdv#SAJI4d@EMnZN)lQbvLcg)yw$op$MORZwyZ{(;?qN z)$5HjUG0b0n_tS)K8f}Lmi5020Q2R7)_0O%()mMHNXM4cU>a9HeAbgFp ze8z*XIG3;e8mk_$VsGD49(~Lu2D5x`9Uj=ygO}m9`g?WYf$XI*`CjbphXuI8evsQYNWH%14fj~LWE zu_Am$I93>;A-w>`$J!g>(6;*XnQ8 zRgbv0ua}3eBK@G&HQp7kSC@U}@|X582Si7)RagGfcw2MO0og}m@-58zG_P?>SL<2- z+?g@Ka1z~!w1ow8`HNb>Rj})JoR4OmQFSgeK6x?`QAQw;8ML!`?I-o^X#EG zS4a8iXH}xay&+_=TX&oKKmag(Q zjhP2-s@Ljg4%p&ThYylhqz-CbV|bv}HSXoj?NeQ1Mb+JP%zT}b<&{SaA0!WME010; zW^=RtZS&{qu~*iod5!4@TlI{meZ(MrOEJ?S4`%w*L3kRI&#=YM>g2&pKg-hxDlf|` zZ__xNLtatmQP=#YF}jK^UHI@cCJ*-3dwIRO@HR#E0=K2NsgCw9PlvT_dA!L>Fhc`ch9-}-u=-9 zwJ*ynk9aPhzPYG#G@h&1;zMf<^I9=H#jH>B+SePaj>f$@@HXv7=df_s z`}gW+yexmve(h?HUfo{awtZnPh`z?;j~cQksQdNiGah=>LGrygx39(5Ix*P0*Fo{v ztA*RzhdC`hVzVEwFKJd^} zkDhyCfA877|Ku~T_y_NQ_OD+5|33Q3{a@~XW&iohKl8cuwEyOR`oI3g|Nh?pxzL_| z`j`99zvc0>k38_$xrfg^ao>*~ed3YF&ffRLxu^D?Jo}@){h#gMxcB0{m+!sqd;i_} zrS@LGclq8`d;enZo@GZYslQV_wK#-oZWlx=@;$YR2ts* z+}`_t{q&%6^WMwe{qz03%WmAeV($&5_@SrHFZ$qW{+1W=zue#Z{ngsXT0Nf`hFyE+ z-@W+E2mX)q64#yi{_mXm?CXEI|McGHUa0Jy-n;$uiD&os?)cUD={KH!(V5r(?)m8M z=RW<+tvrG32{~^EF6;m&2)r=+_*9ST{cL-$mfr6ipGW3R?SLJ)L>y>+w=NMIj{I%% zoWR3cnE4=k5QF56cEAqUfx~v-Qu{6~y0l4kvRL!*k1FcE8ZX@&9k8X-%WLV(t+(cCy%p5dpF1z(AC*0_{SG^SvHNqe-(T*GCI6C0(^l^M@^LL*6oagfAZ?xSG-B;smS}!l_cis-z z0Xtv^?0_Ax19rd;*n#;D`0wFU&(sf%r))=dpg7=j;*($p?0_BUbHLxrKA(;n%g^no zJrVC?2kgLcaUlD@H_`t+W5!#0pO@NqyLG>t)|Wm9_Z^M{`n)w}t8Kq`=x&O-ug06| zyZ^!tsNb#l!fLguIbvtkv4*0wthU-UnX771Wp2mlDhq{Nx z?DY~Z0yWnEJR|h2g}NUx*c#O0XkY}nC-81VnywzuKD90x9+P|-}e1y^T>nQ+^o+3dn%aqZ<^n={-*o6|Ke~!&v`38 zZg;KsvvhyeAqLUaxRs~AE6nz3&7%)gewK&l?-x$Y!fm`IN0aCEx)&=bFg=R@YB>MjSqgK-Av5xi#)iS=|^AnQosMB|Aa2?4dbP&21Ng3p z8hPSvq3UY9tvTqR50c+DX8Pna-1Z*mF)xeBgUTo0i>-d@`u$P;?0ZN*{Fidkz?Vr~ zW6J1f2yZTOKm6}oUXcjsUi2mO#cB0lWA48-Ame5Cr_bwEGT_w`YhB7|nC-=UFcoMN zE{pmr8@#NX?U(U2kH4HJt+!%5SJ^&#E?T;C>)HM<7a`68zDv0o>iuPNxnKBTbHD); zbT2*6d`C3T{blR6>e|=hXM3m)aZ3-LV)i_h*Bj#-h(4$~d?8)b#D!QF|hr?W50Aw!(Ub{=H7)^a_k|+g4o0P@gnjrn=g-E8W#e&KySv^n7T19Peq#&fGVM z1~Gr11gRV6IdD|{<2i$RSL8vhFO9dYw{(xA(q})8%9Gg59=!kHZl<(VTl4wv6~MOQ zZW)LDUg&&caOvH*p2Jezi=_{LLGDXq@<$bQUyToY@1wR)uOHdoS-w}dm#6Qq#;S8r zd+FR=$Ju>per~LL(+^VDnCAd$ojyf)pw?S)?>zLumTqqyJ&-i%hl}rr2l+8*LOQ&}pyw+T;XR+qdSA?giyty%YbNeneK0YaCKFsB*4*i-xE^%vr>flko zuj8_3%g2l5K3ezb`h^|vIk>Ptt{x8u^c-uvt-F}}pKF%R-PQiv+UKb6m)+-4+dJFy zpz`+Ppq%y`J8=9Q;QOF>{O;sdyl`g;cYbKRg1oZD}{9k2s-;9_y$sC@@@pH{r- zbJ(^1ru!ZBe*6QE+P+71ucPLZ?laf7xqO|sG(N1kOZRo39k2sO-vRxuXngeVU^^Rf z-yo{QAbF!5nB%~uc7C{DaE@2I;OZV4FP(`FxKzh|hvR@gH;vg!^BTj;a4tX7*>zs` z)c;+O);HZ}Q@w5XZ>qPcAMP&>^gajWwPO5L9{Ech?aT2z0e)`B^SOCzJ8&sFpx-Nv zFGWu_x#y++(Wl5RP%K?3U8t?jUmxU$4G-cEAqUfn7OpseZrozt`E7zt%k* z2lQNPd^lTqsvS694qU45jekEJuXE~crw$zV_x8B&KYbdPUUacOzu&w)p5^{i`w#A& z-n;$uiD&os?)cUISN3l_{h~9k|K0P^-OqjcnOj#4xJ*vLt0M*}!vi%>3@VR2sQTnV z`a#WSvFf(^(NUxiJw^ENKzPK8^nujr%kuC*_{1Q25Iv2R4^Q*-WqJDGf#m4}sS|_n zGi>p+uJNlv7-SAHdyxmTJarJAEN+r}cQfD3rPh1CKUlBfe zVnwa97d{bZh#orhfz-hkk2-viJg9k{r#$x8KJtn!9(9m@<|@J?4ci>*Gb6Du;0yvDtG`V{F0wN9*cjg?0oqz;l-%<5U5e(GSB*LsTwAB3-{ zbz%^H7Hb|pNF5{(k_X8vYMmH_PpqhQVh}!Yh8eGwrw*!qmWM}uF4C`v4tb5qD=JT8 z_~b$Ipyr9ejF;uj2fr85%lNH2eah1~<7vLt zM;+9DVo-VH!K_XmZ1G!lbU^qZc~JAjAUu%#wh&#grQ6HPbT;i*-EHf&^s{;7GgMt- z_{1RJBkHXf9*7QchRS133$>3JWFE2VX`L9PPh-uu>hMA3_r~xPxi9oVc+^4iAp90; zzw)VrT4!Dh>C1Rp*O)%dXK^d9b@Ve_%BQavnXi2E87iL`zQ*LiR$ZSzeTu51F*>03 z6KfqE5FSXLK4Ptt2dRVfYpi+ds66wxEEG5HKL zK6z04$!7>Zt82c+pIguP$m*rdatWWcs#_XXuS2yeL z)lnXLn%^{5UDczms636~YrYlJ2P(gnr>?lE4*g)JpVgI5to&A-^^wnzzrUfcNFRCl zAazCMQzzewm6y$fr>OeWHBSt-c+|mGAH3H<6wKf4H$-;2xz=_3YpPx383eadUa=+h5sUSoKm)|smaAEZx_I+)eTE00(a zK6??v(>$@(i8DkuL;9#QhnPBfVy$Zok3Q-kb+DC3r^VMgeJy?M%VO0d&iFc4WBSR1 zsz<)X*FN|lIvI~Vd`0>}_{1Q6#2|bS9te*Z)V%gsi0@RF6LL@X3Q(*Er*$*WzoP7|isk zgYa4iKiiKwI>hin^2*aZb&!6LJbfT_5S}7+kbZdNLGp@Oojj<0#5$KeNFAM}vFd4z zK6#LNS*&^Zis)-T>sS7!yjDN+K=z~$B(JFTOegEpet6r;xAd|)^Feru)D_{8CkC^8 zR-eo7)j=1e56tpfho=Zn&joq-#31~v4lk?I4^LzAU{*(;I!L~S=)+suuYJVm6NAj7 zo*}#zX8qYb)yw+HqeHBSp7O}U*BHKH#&6}RgROZj9{nJEFw1j4@Id$=c}41=)`^*; zNS%J_nkQC-Pd`W=zQ*K1>hx=#Sdl*R+CMk1dh~i|B#qC{hQtPRv|l zkUo$+d{FD~6ybweA9eb(m^?bf^nuhB;gct(PmwxEAEWc6|^oT+7bCG#19qNiY4?XhAr%oOod5}CvKI?1c=?Brx5MB$j zx%6qBdDMyFkq0#oAJn?WszV=njWw@zjp2jTdyzhnKJEjg4w8r8i}b@M2FWY7>dMzx z``KSn`-tfWHLp6#qfVX}9mT9pKYWeJXQ=#5<7`fr*ZX2VNM9>PM|t#v)Is{R-iql{ z9b)_LGO#s`v8HRXt+GOcx${AbI*g@*sSz6KkD3hz{{w zKK?U=k;w&>%M;q6A_f4l!|@bc93*kt?Fe zRXWGlc65SpE;u*oklffI(k&>qD?St<3TO~L1vJo5@KI5w;ZLAILWnc(dw%zw>)C6Z zG3WZ&d+oh{$GYd4;~CEw?>m2MpHE*Wsoi{+XPz8&rQ}d@`Spa~<+7hOd(iA>O^*9i zeR5qtb6vjcb1(LGHM!Jk4j<({C_ek}sZo3sAH`>1Dt(kW^i-d7x;^w$bH1yYCx_yr z`94`QhgSXcvt}OUe3X3lyPA2FJc^%Morj-!>fB2{m3%7mYuuYeOoop$(lX*RgGV1&XdDO@lkvfA5A~&t+`9hReQR7OA&jAHUKr-}Sq_ z*=HYqS7)xv(?@f@sym-P%6>F`YIJLkd@A!O{k=7Fsq8`NXN{klxva_W^_fF+zN?u_ zt>*IQ!OZ0z>MDnil1I1tnai4e52c)+%K7P6b(ODt_GG`SnM27}N-mXr=aWm#Icjp$ zm6AiNT;*4D_$c#LUHQzR=jND4&)v&BntSn6$)WVAQT$5DrB-?TDvwXD`uPhV>)>8X*ZX9sH?g3v(9_u zKJsYQXAe1Ql(|lsPtCcikDuqJpLOOrFLUWrGfy6+Unx119Q!&YkFp2FN7+X|Ykahu zV?J|L-TCy<+>f8y<#->I`JBs|9CP$hd~zuLPRX-}Jbu>XQ2MD=A0N#*>g;DtuDfUU znX5GOThC=*m8YNksZ-gL${u{`)T+-p<4?Q+?t&U@hV>luol=Vr}5lzvsSw^R0@ z>|+i;HFMPDvSuGjuF}0Z@~P~{r|y*d=NvxDo~-eir%#P$j+%TbeKh;*#V3cRpLLbP zM>z-W{OnVwR`=l?l)0?&Q`wtZ@K0m)wr)EC;S!bSe$yMi(L&>8#M~!wl_M+s`^s}zsEB$I;=DK^c z2W1{jpSsfOeehFr5B>DB&iiGbnq2P1&m1**awz?*$bGy3Q z%lVb&9J%zV^B(xAU9LNaedJJllykC=pE>GEbI-MN)p>dU>K^#j9{TJ<@pCTwRSrKj z_tCHR(!Z2;=VU+Yyhrsudvl!A?dx*gJol<{-G1g%*@tGIy6RUxbE(`j{Y%xkKkt|Q z?%d30y>*_s)SS=zW}W%mM_uL8Kew*V%e{MZneXa6ud0(LHOgF`hmU3+znde6vIoUS z@lkvfA5EVct?rlefEjvR_#DLM9$qo!XedHT$yW`A#8?PE{gBWrRfeH1^HbMeXJ zqx4hhGly1wHJ?6vDrG;)eCD%HjvueoX!`8SKDnw-K9xCq>eQ`$a@-^L;FGI(&_{DF zYjW(Xw3=hS(rRDkbAQ&EKef)i+>d?P$4{+txsSQ@bH1zD(`oJ@&-p0+USQgYQi{Z#hhSM%hupFTCp-mLM_?B_X|qt9F_d6aymBrl0fl@u_p3_d&^_ym#)&I&<{#(Np*4 zT-NMIIUmhDHJZ7s$*~{B-T+UOc<~((3H`n#qSLOKeMJ{W6=IK{; z=EqtGTT{Ih4Jr^wI2Row=;ZZ}rKc%%{>vv!8Y5vL?UPCx7(?sPCxrulTRgwR(*VOX!=`ga%k?W{3@6E%w=8W$)%D{%^Y==+v~Fr-8)a7 zc{Kg1PM>)+`(2%Liel%B5e; zWsbVar=KiQ($5;7b5Q(F$)_@x=aHkI zHGa-zy*0=FoKK%Vn)~sYL&>GmN0}#=b(bTLvWGde>XSz^hmX=n*-szENAW8qmzsI{ z=~HvBs>bj3?Cs~d-TdA>_eQIE&ZSSy97-R>uarIHQSw>ir&hW2v(7!-2cJBeK6&~m zKAJu?N{;>1^ih0rspL98b6GQ==VeW<(%j2DKK0i5Du-X~<2-Vy-CQ+~pUVF9sp;pr z^igtITaGK`?AK*J>)7s=Q2m1Jt(4}L1S%I7@#na{e*kwhv?u=aWXD;i^(a$}Z%X?9iqh=3#@yX#+r_%4{$fa(bBbUm3 z*h}3hd6axrb1r?9ITRmFKlfz6nj@E5uzZ&Ro{ya&B*3?cuyiyE*zOd-8txDEUq^&t8;yawtB!*JrLe zhkmt}el_3CRrC0r=DAfq?~!%RWq)hk-G@DBp1XBE=h)ZH(?{8pziw7O=g`l(^Xa2` z4{DTLrFnkNQKRh1xz4Abd+^a}Fa2sh{caEaRL()!i{e+BxvZH>pL@`+lw8hdo<4b$ z9DV9aGq-n7=Bsn?$>+J$DEX}MQ@7?gKj*2lpL?@rE;aYiuYCHspPzRspFYZ-t|o_8 z`{|>Z%Q|!PQTk}*(?`jrW}iB>o1Ze)?UVd$Z2@t$p4P%{hGbqvWzCkCH<(kKbuEmwuj0AI)>fqx7j!e3X6k zQTo*6I%N(ePo2ts{H!a#%H{taj2u2Sdr|J0NPowNF~|9-^ilRvr_%5C4)TvcI&!Hwy%|86p?B`tesnMB=L$gnv+U2v) zeEL~uuIs}g=crTJmvdQ@tLEvWIZsW$+JjGyIkf9nbLmre`{;8%ieD-F(acqQ(x*<{ zx;JywxsRHDDt+FAe&v(PepTbMH|Nu*k1|i4`K&Wn^{ZT!ukJxU`&pAiIloi#XztCL zT<*r?Q6}il53nxvpkD^US4^ z%el(W95u@RtnpF$m2y5>&CzF1m7|~etjXmb>aF?AQL`tNKAL^*m700__$YpA_PaXo zm3jJ{)Ah+`u9_#u97-O=N7LV0ljGd1@l!cB{c4_k_NnQ!51*Poil53Hxzy}avxhq8 zsL7==hfkez)buk?O|Gi(Q<-Cb)|F2#m3*E)msT&3jLlQll`)M(~2*VXJHhvMgcd^l9fp6uhZhq}_tRdt?|x!g}5 zWu6*kjyiMnQ_0~ok5>K6XO4d5v%gd3Gl!q&ki(}wRXK-wYWAb_sZ&qw=Xup0eDa-U zo*HGI_rT9O{i;tcm2=XkW*<4~?Bk>KQRb;rt2ul$=cucne{!z7NA|PkJT&)bUFGmo znMbpqHM!KxRdx4%%vCwgC6_gGmA`e4J(*9RK0ey{^wGR;)|tzGo=ZM8bGavL=F?{n zO0Lt~Q{{6nHS^TfeEQ7cXT8_wd^Gprqx4bEL&;^Gd2*Fzo_#2D)Mzz#Zhr54-iP_r z%u%Q2d$9)}WsW{|_Nl8Jedf{hbDkW2=Ce-@AH}ccE1x;E%5e@#o;tPqbu#_xJbX0w zSAO0rb6Hn=$)TCcbLjsN5257IXunD>^mAXRgItL;j@=Ib6IDexzwDa&wSM66br)bw+XK1v_OPoGuQc5jyaUQD1IvY&@NA(eD0&J`jyWd zTIKLlt2uJqn_Mb6l>Xj2&&m1hb58oyD0|Rq4xb!a`ME#qYMva*{;cs)_M!O9;iL3X za#@qle){xL_K>4Ss~mpn-Z}EA)qT>h&SxKe>YT?XM<1o1+V$C&bJWbIX1}W0kM7Np z&w2b*?wNiyU*#)5_hii+n)jg2xvVqCK9qiH)lZ-E(CqK6*^~FlnjA`>8tr`gD06vl z`Y5@q)2GkAuAh18RQ9D-`qBZr@L&XGeikDr>k+?##oGnaMd=vVv5qvWd^KegIl?W^*YpXcS?s-OF^&bg|e zKIf;;zVyk{N7Jur_MyyYo%7jeu2S-7<|;qWWiI`!t9_Nv-m0Jb$#=>=l>DjtPMza? zlzUXV^_<+7HGA+=^L+Z9&t8H?ewD9$_GO>_^wG-CdGcGen(zGTKAfBLfV)K?ZIa*&&fV@m7~u->eQ;wUi#EI zPfdX>&)#Yeee$VY zpM2)BCYSf7#j1aws_zKj-MDPo93(mEY~je(vF%{PBmM^Z2RNUgoo3 z)%eVzmCrpghtFKr)R%N%t#PakEDJ@_bnY7`%>=E%u|!Yr>2ijUG=M6`qiHFIR~YmdTO70F`spJ4ta9yLGd$( zPmVry_NmFC_{^dBRgOMN4$VE8qfTW$m3^t?*poGR`e^2;t9<(8QTC?h9DRHgf9t-? zQKRh3{pr(Z4z2v`lVdM^YBYUn=2MwN$y1Z3rk`5%@!6Ae)a1VZV{f1CKDzthdv~vY z{Pp{;O~*q=l;IF zp9CZz0SVj&0e{`OjnBbbNI(M5mjM6wES~Qh-qxG_iMQ9e74H5zds|;0-bMnqNZ<$F zUW%W;Zt;%ZNdgj(fCMBUf#*%YKes&Z&)2t;fCMBU0SUYW0{(vHC49=hqXZ-%0SWNy z9V(IABJd~QUdPYpwmuhcBLN9qo&Z1J@!xY_{scElKmyk$@R_#V7<)7omC(5tmm-?Lf^@hDq{p*IWlOK8N zFLI^(^XHo%K5;*PPI~CC7ykRnKXu~0`TNQf$FDxd-=lW-yGQTD5P zZ@${|*gjnO`i3`Oe~*1X&wt(osvrNA|Ga6;x8vuf={)VH$ND^<8^@>pRq$}P=hv}Q zPxR~NRC3Nq;Q14HtY6P=jcjtr`qu8d^*+AGA*tuWW{WyB*uhXYOmmg35y7g2( zG4CmX{RCdh?>qLBapEZwc}5|DrdBp`uXBf#IQ+}gdoj|3#} z{0aEyvFHC8uiwzmdriYVc>K+M5pd)bUpKsV#{XVw44}IoQeDyX7@HwHkc}s6~Dgi&& zQ^`3e0SR220DpeE_Brmq3;};VxeQ0QJPrZ=obx!Rd#VH^u!n%Z-t3|Ebh7;K0x$LX zvd`a7KAo=tZz_SOPT*2Me_flyQ@Q80IXsp9{yF8Td{W-?B@^(+=}Z3f@4x$Fe?2_* z`S*$FNMI81>vOX3Ndg@K{@jLkdHWK0NCN!()cpPHL!Rwf_X+&qTg%VmJ{z6eA@Kb_ z_x3J#AKiWM`u*3x`u?l$-o5^{-@p6H-RIwb@9+NTPrj*s{SSWWJHOyBe2@L1efI4I ze&n$);`tJI0R(>d?K}G8?FD?;zM=#qaFYc1`4_#(OM0nCC&1SSdg%+X7rpfUhu+6~ zpbve%=RI!%d|jc>`)z$Y2}nQ!61X-2emz02eV+Rtmw=u2z(W(@*LU=x z&wpy?!3lk8_xHX}n}EMhd)l9$x0iqfBp?9^NI(J-kbneU9)Umg_Lcp6gvb5t{Tv>b zzo$#!IS}CIar8O7lkf0+3Ha;Y^ZjgnGYLpQ0=G!OUw3ZtQ}Ip`kic^!;Lo=Y`>Eav z?_0UY!_t5Lr}?>F_cMN}d|&E&U-zrY?GliH1SB8<3G5-@???8~GAjWINI(J-xGn*H zUFLs>c-_;U&vv-^?}uIXGnMOQdAdyk5|F^T1pImVT!Pn~=kr0Ydz#xNaGU^Nf9Ua) zt_02_z}FXg-ZrNtAc4mqz>i<_q3*zW=tG_BIWL<4UvKEkrty5=p3fJ3zHjP4`g42#$9kW~I``qeQatGxfpb6iYQFN1-9hi+3B0t==cT>x!+%8`Kk=csKh!zL z-}2R~?)>a$UF}W()VbVq>H5<5y41eCd-molj=3l6YHqJz?XCRWzcrV0Szl^T?!8pK z_kNkr`cn7WyJzb?w&u2;pZl`jx~I!sYj1aM*T24kG)872`-@p@YiGW`pxAbXv7YRr}0=Gwi zUnl(k(|CKIjW?2j1SB8<2|N~om-hREm-fDo^>yXB4@xboCoz{I0UBB9^|1=5s zc|Xn1?OM0y?_tnuo#S2!>>(}SjT)uoa*Y$IswFI6r0sj4-y?_7ikCUhTsXv{&U;69p()*qcNpC6v z2|N}7e%|?^3tfO;x6j>o>3d!1^;}aB@bfCbJQLf`_nCZ&zApw7WdRiZzj8U|G=B# zi+3M?_FEr*hD#4+&tc6ZH(#fC3o?r? z)5kZgQ{#E&x~co8cN6o3W%k%j@81V!+-puTJ?{(OWny&cp}C9X(m%G3{95M?(p}ff z^Ej2WxzVgghI&rlcd8^a)x_u@d$W9t`x}OHe-?ibn{)GtTdj5J9wye+xD96=CYc=F z_0)Pl&!fNoestJ9b=-gHe(u$ez4_0dfAgQEJN`3#o^g-Yi@W|d>Y2^=p}(Fv{rT|p z!)ou=gu{QTi<)}Qv=J?=NZpPj>}v1`07>7j?YcU5D@Aj!U& zrwi$IZl-2;?JX|zi?V$@udDmX(Vg3yUZ;9aMt5aRvWpv5UEKl=H9PYo~z#Ug`9d5#=ale^aKON7k-7#IAwchnO&+EIcpU1sn zwbo;)dH1C|{>j|T%x%+~>G`zej*%Nvv$LL9dRebeVQQTj&&&6?)2a56T<@Oq>!+Eh zo(^|Wp*gkom*-<|v_5~GpXuDX?&QSG9(I20)3ayd)tle3FW<(^hCiN}MMv-O`(-2F z#?!3v7yaBPe==D9bTCdEJ+kN<_d7o^T5rE!SRGE0{jpDTI4CEK8h6AGtLfo0yL9kI z3QpF{B;T-z+Kk3zqH;;4XaBk_`cjoNj z+)U=vteM3@r=QOKPL&`zb^Muh*5hf+FW<9iI!j_y3$yiC#nM^6{rH(ug0f0h<7D>YEI#})L-yTzf9lY=U#%UU*LwIoD((w~#U;1g zZ`A3~S#)}}F7s|<$H-=P_WIp<<8kNp-1<51HhSyCa+g^zPvf8I zu>&V{^ry?yq{)WVB{|be_pn;mhn@SAxqHrzN#?1j$J|n_IUH_d=FpuLlT$f;?9FPK zp0!rZZ>mv5sxcCZOO?2i2So&aw>@rH9abH5r}@aHu1xnzzE0dvP1~4;{U^hneY+ zJ5=6$xO_jSk3G%Q(&eAUT|ZL~oww#GvrFzW-^K~+UCUYX+o%rDXJ*l3pW*PA&g{>p zW%p9e??*M9`TR-blN8>foXs?;PPr4gv6IcX>#cKwEa^pgUMAPiW7FDMKhs^4IW|9X z^ZWZdmZ`<%pP60nqkC+AJ(15NKTlZt>m5tyer9oSbK|;RZ<_vkCwqpH=gjHO6UUyJ zWbbhB*Y5ESiNk%%iMfNs+(RPuaOYvgH2ax7mg2ZWbLtG)smHSOO^$V6{oxnpcs!9`l;?;XbgE3{-`|yg zu6mpJ^l!-4o0jZ4KmMEewKJxd_aAfX>3Q~a*H6nc|IF-sIymPKe|k3F_4G$SRd$!Z zSvlDGHp!jP#eVbrhRE_~zh&xe=M!gnuHSaO<4y4Gd4K+se}`eI*WbpbmGehm_`@&! z;hX#a=+C@*_3z&N^D{sD>eX-jwZHJwpZ=ZQD*Nfouyu=F5mv= zk&VCc$yd*>AL)#lqu(FC*I=@ENhj+!k^lHtmrwd1y!os@_vNws^;=!4|Mtb-f@ zEOX1Z!#wvooSfB|;d^`(A07Vk{n&fBeNG+vV|vcAZ7TWc?0b6G?qi!~etqX9IqNZ3 z)pJAcX968tmp7cw;d5@de~bHxcRA~GIDNfy>5qTrJ?6~VJUdHvcA0(m`Rj>yB~R~h zk7GLDb>4e9slL@=Zr+OR$DFZ^$@|GUvpjYE!}R^?@b0;dTjbpE*WYJ?dYxIGM@<)< zo$<5dv7fU?b|%NBS+fhBosq;x@6S&s?>RTXYweJp-uet&l-|2^WSOAi>}B$>Hy!+U zZ9kS~jqZap^=P5!F~6R^`0d;ClBWibBEPol9LbJ!@c*b!znnA z9fzmQ-t_T?vsB{*>Sa6b;k}lM)Ul~CNoJ<;54Vj?cvS1Xi-$jQqnfwl34fhhp4o;! zH?H^2=lL{FUe{yC{qMJAmMQMK-oWfos&#^U%*1%7;U6ZCRm&XzSUEPvdO)1j){~Th4>sJUjcdGdE0c{X`#~z2U5VoN@kA9qZyAzvY}= zPFl~;lksOa&my}%W26uFliQ-~TK^pbUNt{&xZHW%5|8@$?8q*?!{4t@pSi<*i;F{I zD0dxQ_Mptonmqf~bK{x)GdUfe*gNXEW8I(6hkf?W)8-R1_nqS%c8zW|wWLOGXqDrP zdK;7I;l!+#ex0Fvm^iGs!*u7UPaomr-r&OCGUXKKvdcjxpxX>MWXn4WLWwz+>kWpBOh@QksY-N!1nu6MA1 zuslpqt#^`}XU`4!#N4unUFdlGQLT5)KGP^E5{vRYGBZIBWe2%gvtcSv^M*LfexB#1 z=`2sjs^RDCyu*w+B*52Q|&MaMObUMtA4*eg0``>p_kJS1`_cyTVP!Bh( zd+W~O=5=a5Pa@0YtVrODU56E!sq^%)ZFc6Hkr^A0CDvZ`%$B9kGkSbx-Q_(Ih5e&;VS z@M-#>|Eas)KX;AcSIAM0yCr+0QYc@-A`g87>H+jvSbAnAcBg3Bc z#QK@^)Wf;y&!=Pahu&c|C+8bX?|2sKOKwRVOC9s(-Z9B%lv(OU$Mf1*Z^6e~r)O{N zj%4T%OX4m=UdDIY}_3}i2&X6AaNK;Ln6L>kf_=hQ~N=Ke9d$;R&AM(qd!(E5flDqFL z9xl4hO>el=bL!ZJB{gZ!lbK$e`3-kWF*(i~so7zQnUS6q{V{#$Qw?3e!7|0KYwPpZ zzw+LnTAah3%br7L{%<6+GitUjlgk~Lp53*>Gdg#U`SJboX2%o5oxLTGw|4J8vyl$< zJhwje?XAB5Z{LRRKDzth<3I7O4?p^?-@NtB8U)pze+|Jv`rIrQ`IzxONu z`q%&9m;TA0{o(nRK1o0V5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb z1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ! z5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^ zNI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndv zAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnw zfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz z0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8< z2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|Drd zBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J- zkbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(T zKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU z0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb z1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ! z5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^ zNI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndv zAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnw zfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz z0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8< z2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|Drd zBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J- zkbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(T zKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU z0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb z1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ! z5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^ zNI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndv zAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnw zfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz z0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8< z2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|Drd zBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J- zkbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(T zKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU z0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb z1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ! z5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^ zNI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndv zAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnw zfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz z0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8< z2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|Drd zBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J- zkbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(T zKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU z0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb z1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ! z5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^ zNI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndv zAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnw zfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz z0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8< z2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|Drd zBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J- zkbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(T zKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU z0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb z1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ! z5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^ zNI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndv zAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnw zfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz z0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8< z2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|Drd zBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J- 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 R^q)uUcYpVLcfb47{~x9J_9OrR delta 191154 zcmeFaXP8t~)&^RqB@0?8f+(RdAu3Yp7*Ili2@r-d3la(iZ4{(N0TbAbiV>u=p*Jc> zn-fSYA_kB)C(v>n(+o%(aC8)@adb>D-gmv{UG#j;_x-zn?sKPq>~+@8d+n9>+UHb1 z{p0Fr-cPHeMwN}`oqltpJ8s^g?alWLigvzv^B&R8RXatCc1uo~K6l?)P4eR>jGL05 zTi&GGjJf44_ATGJyiL{LqpsT-+`a5~geR4CZwkCTDnGR9nzH?N+;h;DH_8%&R<8Im zan0QFy{cB19Te?Z_4l%qqZ6(=cDohFZWld&M7u%dLrzG{oLfHh+PNpq-S>oONU|%i z)35E+D_YU1S6THD?e{AGzv`@=T()BEhkOR4}EdP%@=q1JX%q6ahLc1oBn^E0@X)$?6KmWo=qkm7Oe<7<(u@0s=|r+CT(`U z+IZxgBmM`ET#|2c7wJ?A6{EEzFO}_8@pVA)pwqo$pO(qWL_`gW{zm0a{Gab)ck=d^4*5m(E0{^WVCUsUw z?$WebsF~NI*@}u$T}sD?^wUimg=edpwu%T($Ukdz}0{^AJ|7#S0GVB_KkN?`ND_x20zi2l282A)NH~Rj;x0=ko209&1$m9#h zTrhTSdDW~IQ^!mgJ$2mKlP6s`_dk^If3?;BYrFDaSM9$P`2QybppQwqG&j zkQP5T>%1UJ@Ne#9c$c>iTJ>GAN%?|7uWbcbI4e3ZWb;jSp@(~4uNHgpVQsG#y+eJk z7F{Z0$JQL!N6OomcN|y#8}D|=bvysYza3lN{k&!v@jqSM^O_+0fAMnT{QuR_o!BNW z{7+~1H;rOqQszI&uIhf|Mq+1bLsW{E02i6jOSW)3F)g^ zBtv0Xi)8f(Jk+1sqFKlvwS6+AM_6(k&}{SVn}x#Ncq;q>RkFt;N%gaWF-S^x0j+xm zN#P8%=y2%Ha9LAmQTL!#wkpNv@s#V2r1BzE$v%sx^rRNes%KdHxk&2XvE*_j^~WOL zIZinC-fw(JFh)_Nh=m2zlB2krdyuC+paz5c0<( z`FdYe&OPC1;e0&R88OnK2@0&!(k0gRXcT1kF!GJF(z9CZ8dAp~$#k(9SXcRxNQ$=d zTrHBcjazr7p&Rj(pM&L{V6C_%=ODkb+LDDx4(QfKt4%+Qx|vsyY#D%=<#z+ovjtSC z{Rm0nG8AO{AgQs5){e0xgCzF=@=9CLeZ6&Be>IZqjmWFr6I0GD!&Ch<VVado z@l?7M$>KvW_4Jp9eumETUs`ek+Sd+8Ug2k;Y>~BXsN4dy(&m+1g(Q0+l2RR#)X6B# z3`3ISa%{0=%;Hd#W^Bf#@t8s3SS0mdSl(LX)qR2_|D0{jEy%0C39Fcahtk)`&pwJ> zm<$fO3JBJKX})S@k63FPo-@qb471pBqB3QskcA}P#4QfnKSt+4)HK$15)v#WFw(@fh2rsjj)aDr@BZK9WMj3Mf5 z>yM}0xk%C{A*mT-l_C70begrWP0Zeagrc6h7*Cn|P*7u?rhh?_HG#<5 zx|4sk(ltPH^N_GbX(pbMrY0!E$wz_K%|}xCGRCOsgB5V!GxwlMzR~u{Wv?Z(WidmQ zE<=^N15qVwGR)}~XQ5t!!n7Q{WJ;(~d%bmUWJ#Ter1k_PX`>v+ty_swGANWT`s<6G zqav+0$twkvR_0MTGaR}oJrHQhh?q3-%Wpzbyco?YSKz7kSv(a$dWs~uH)C~cljw

pDl6NDixd=%sfvbuW|#DSiu^nr3OMY?nYM0 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 N04^+9qC}9X{~I)L-+%xB diff --git a/dimelo/test/generate_targets.py b/dimelo/test/generate_targets.py index f05ce90..8f4099b 100644 --- a/dimelo/test/generate_targets.py +++ b/dimelo/test/generate_targets.py @@ -160,9 +160,18 @@ def main(test_matrix): if Path(args.initial_target_pickle).exists(): with open(RelativePath(args.initial_target_pickle), "rb") as file: old_test_matrix = pickle.load(file) - for key, value in old_test_matrix.items(): + # loop through the old test matrix + for key, (old_kwargs, old_results) in old_test_matrix.items(): + # if the old test case is in the new test matrix, bring over the results + # either the test targets will be regenerated, and the results replaced, or they won't be regenerated, and we'll need the old results if key in test_matrix: - test_matrix[key] = value + new_kwargs = test_matrix[key][0] + # if case will be covered, bring in new kwargs + if args.case_subset is None or key in args.case_subset: + test_matrix[key] = (new_kwargs, old_results) + # if case will not be covered, keep old kwargs + else: + test_matrix[key] = (old_kwargs, old_results) print( f"Running {'all cases' if args.case_subset is None else args.case_subset} through {args.target_subset} to supplement test targets from {args.initial_target_pickle}. Any new tests in cases.py will be added to the test matrix." ) @@ -171,6 +180,11 @@ def main(test_matrix): f"Cannot run subset {args.target_subset} without a pre-existing complete set of generated targets, {args.initial_target_pickle} does not exist. Either specify an --initial-target-pickle that does exist or run without subsetting." ) + print("Generating targets for the following test matrix kwargs") + for test_name, (kwargs, _) in test_matrix.items(): + print(test_name) + print(kwargs) + for subset in args.target_subset: function_name = f"generate_{subset}" globals()[function_name](test_matrix, args.case_subset) From caa3e59a9863e9214f5d15333027dbd0b7a2e37f Mon Sep 17 00:00:00 2001 From: Oberon Dixon-Luinenburg Date: Thu, 9 Jan 2025 12:36:21 -0800 Subject: [PATCH 07/23] DM-192 Fixed logic to properly handle single_strand case within process_pileup_row. Passing all tests. --- dimelo/export.py | 2 +- dimelo/load_processed.py | 21 +++++++++------------ 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/dimelo/export.py b/dimelo/export.py index d3dabab..4256954 100644 --- a/dimelo/export.py +++ b/dimelo/export.py @@ -103,7 +103,7 @@ def pileup_to_bigwig( total=contig_lines[contig], leave=False, ): - keep_basemod, genomic_coord, modified_in_row, valid_in_row = ( + keep_basemod, genomic_coord, modified_in_row, valid_in_row, _ = ( load_processed.process_pileup_row( row=row, parsed_motif=parsed_motif, diff --git a/dimelo/load_processed.py b/dimelo/load_processed.py index 537345e..e951d10 100644 --- a/dimelo/load_processed.py +++ b/dimelo/load_processed.py @@ -101,10 +101,10 @@ def process_pileup_row( tabix_fields = row.split("\t") pileup_basemod = tabix_fields[3] pileup_strand = tabix_fields[5] - keep_basemod = False + if single_strand and pileup_strand.strip() != region_strand: - # We are on the wrong strand, skip the rest of the steps for this row - return keep_basemod, 0, 0, 0, 0 + # We are on the wrong strand, can't keep this position + keep_basemod = False elif len(pileup_basemod.split(",")) == 3: pileup_modname, pileup_motif, pileup_mod_coord = pileup_basemod.split(",") if ( @@ -113,9 +113,10 @@ def process_pileup_row( and pileup_modname in parsed_motif.mod_codes ): keep_basemod = True + else: + keep_basemod = False elif len(pileup_basemod.split(",")) == 1: - if pileup_basemod in parsed_motif.mod_codes: - keep_basemod = True + keep_basemod = pileup_basemod in parsed_motif.mod_codes else: raise ValueError( f"Unexpected format in bedmethyl file: {row} contains {pileup_basemod} which cannot be parsed." @@ -123,6 +124,8 @@ def process_pileup_row( pileup_info = tabix_fields[9].split(" ") genomic_coord = int(tabix_fields[1]) + # TODO: consider moving this logic back outside of process_pileup_row, to avoid unecessary operations for both pileup_counts + # and for long regions that only need the offset value once if regions_5to3prime and region_strand == "-": # We want to flip the coordinates for this region so that it is recorded along the 5 prime to 3 prime direction # This will enable analyses where the orientation of protein binding / transcriptional dynamics / etc is relevant for our pileup signal @@ -290,7 +293,6 @@ def pileup_vectors_process_chunk( modified_base_subregion[pileup_coord_relative] += modified_in_row with lock: - print(subregion_offset) valid_base_counts[ subregion_offset : subregion_offset + abs(subregion_end - subregion_start) ] += valid_base_subregion @@ -349,12 +351,7 @@ def pileup_vectors_from_bedmethyl( parsed_motif = utils.ParsedMotif(motif) regions_dict = utils.regions_dict_from_input(regions, window_size) - chunks_list = utils.process_chunks_from_regions_dict( - regions_dict, chunk_size=10_000 - ) - - print(regions_dict) - print(chunks_list) + chunks_list = utils.process_chunks_from_regions_dict(regions_dict, chunk_size=1_000) cores_to_run = utils.cores_to_run(cores) From ac3657e7aaf4abbe049931b9dbf67255dd8d9bb3 Mon Sep 17 00:00:00 2001 From: Oberon Dixon-Luinenburg Date: Thu, 9 Jan 2025 13:04:23 -0800 Subject: [PATCH 08/23] DM-192 Further refactor to simplify process_pileup_row and keep regions_5to3prime logic within the pileup_vectors_from_bedmethyl function, which is the only one that actually needs it. Runs faster, still passes all tests. --- dimelo/export.py | 3 +- dimelo/load_processed.py | 86 ++++++++++++++++++---------------------- 2 files changed, 39 insertions(+), 50 deletions(-) diff --git a/dimelo/export.py b/dimelo/export.py index 4256954..c3fd6c1 100644 --- a/dimelo/export.py +++ b/dimelo/export.py @@ -103,7 +103,7 @@ def pileup_to_bigwig( total=contig_lines[contig], leave=False, ): - keep_basemod, genomic_coord, modified_in_row, valid_in_row, _ = ( + keep_basemod, genomic_coord, modified_in_row, valid_in_row = ( load_processed.process_pileup_row( row=row, parsed_motif=parsed_motif, @@ -111,7 +111,6 @@ def pileup_to_bigwig( region_end=contig_lengths[contig], region_strand=strand, single_strand=(strand != "."), - regions_5to3prime=False, ) ) if keep_basemod and valid_in_row > 0: diff --git a/dimelo/load_processed.py b/dimelo/load_processed.py index e951d10..e9441c7 100644 --- a/dimelo/load_processed.py +++ b/dimelo/load_processed.py @@ -86,18 +86,11 @@ def process_pileup_row( region_start: int, region_end: int, region_strand: str, - subregion_start: int | None = None, - subregion_end: int | None = None, single_strand: bool = False, - regions_5to3prime: bool = False, -) -> tuple[bool, int, int, int, int]: +) -> tuple[bool, int, int, int]: """ - Returns: keep_basemod, pileup_coord_relative, modified_in_row, valid_in_row + Returns: keep_basemod, genomic_coord, modified_in_row, valid_in_row """ - if subregion_start is None: - subregion_start = region_start - if subregion_end is None: - subregion_end = region_end tabix_fields = row.split("\t") pileup_basemod = tabix_fields[3] pileup_strand = tabix_fields[5] @@ -124,26 +117,14 @@ def process_pileup_row( pileup_info = tabix_fields[9].split(" ") genomic_coord = int(tabix_fields[1]) - # TODO: consider moving this logic back outside of process_pileup_row, to avoid unecessary operations for both pileup_counts - # and for long regions that only need the offset value once - if regions_5to3prime and region_strand == "-": - # We want to flip the coordinates for this region so that it is recorded along the 5 prime to 3 prime direction - # This will enable analyses where the orientation of protein binding / transcriptional dynamics / etc is relevant for our pileup signal - pileup_coord_relative = subregion_end - genomic_coord - 1 - subregion_offset = region_end - subregion_end - else: - # Normal coordinates are the default. This will be used both for the '+' case and the '.' (no strand specified) case - pileup_coord_relative = genomic_coord - subregion_start - subregion_offset = subregion_start - region_start valid_in_row = int(pileup_info[0]) modified_in_row = int(pileup_info[2]) return ( keep_basemod, - pileup_coord_relative, + genomic_coord, modified_in_row, valid_in_row, - subregion_offset, ) @@ -203,16 +184,13 @@ def pileup_counts_from_bedmethyl( # TODO: change to try-except if chromosome in source_tabix.contigs: for row in source_tabix.fetch(chromosome, start_coord, end_coord): - keep_basemod, _, modified_in_row, valid_in_row, _ = ( - process_pileup_row( - row=row, - parsed_motif=parsed_motif, - region_start=start_coord, - region_end=end_coord, - region_strand=strand, - single_strand=single_strand, - regions_5to3prime=False, - ) + keep_basemod, _, modified_in_row, valid_in_row = process_pileup_row( + row=row, + parsed_motif=parsed_motif, + region_start=start_coord, + region_end=end_coord, + region_strand=strand, + single_strand=single_strand, ) if keep_basemod: valid_base_count += valid_in_row @@ -260,7 +238,17 @@ def pileup_vectors_process_chunk( subregion_end = chunk["subregion_end"] strand = chunk["strand"] - subregion_offset = 0 + flip_coords = regions_5to3prime and strand == "-" + + if flip_coords: + subregion_offset = region_end - subregion_end + else: + subregion_offset = subregion_start - region_start + + if region_end - region_start > region_len: + print( + f"WARNING: You have specified a region at {chromosome}:{region_start}-{region_end} that is longer than the first region; the end of the region will be skipped. To make a profile plot with differently-sized region, consider using the window_size parameter to make a profile across centered windows." + ) valid_base_subregion = np.zeros(subregion_end - subregion_start, dtype=int) modified_base_subregion = np.zeros(subregion_end - subregion_start, dtype=int) @@ -268,29 +256,28 @@ def pileup_vectors_process_chunk( for row in source_tabix.fetch(chunk["chromosome"], subregion_start, subregion_end): ( keep_basemod, - pileup_coord_relative, + genomic_coord, modified_in_row, valid_in_row, - subregion_offset, ) = process_pileup_row( row=row, parsed_motif=parsed_motif, - region_start=region_start, - region_end=region_end, - subregion_start=subregion_start, - subregion_end=subregion_end, + region_start=subregion_start, + region_end=subregion_end, region_strand=strand, single_strand=single_strand, - regions_5to3prime=regions_5to3prime, ) if keep_basemod: - if pileup_coord_relative > region_len: - print( - f"WARNING: You have specified a region starting at {chromosome}:{subregion_start - subregion_offset} that is longer than the first region; the end of the region will be skipped. To make a profile plot with differently-sized region, consider using the window_size parameter to make a profile across centered windows." - ) + if flip_coords: + # We want to flip the coordinates for this region so that it is recorded along the 5 prime to 3 prime direction + # This will enable analyses where the orientation of protein binding / transcriptional dynamics / etc is relevant for our pileup signal + pileup_coord_in_subregion = subregion_end - genomic_coord - 1 else: - valid_base_subregion[pileup_coord_relative] += valid_in_row - modified_base_subregion[pileup_coord_relative] += modified_in_row + # Normal coordinates are the default. This will be used both for the '+' case and the '.' (no strand specified) case + pileup_coord_in_subregion = genomic_coord - subregion_start + if pileup_coord_in_subregion < (subregion_end - subregion_start): + valid_base_subregion[pileup_coord_in_subregion] += valid_in_row + modified_base_subregion[pileup_coord_in_subregion] += modified_in_row with lock: valid_base_counts[ @@ -308,7 +295,8 @@ def pileup_vectors_from_bedmethyl( window_size: int | None = None, single_strand: bool = False, regions_5to3prime: bool = False, - cores: int | None = None, # currently unused + cores: int | None = None, + chunk_size: int = 100, ) -> tuple[np.ndarray, np.ndarray]: """ Extract per-position pileup counts at valid motifs across one or more superimposed regions. @@ -351,7 +339,9 @@ def pileup_vectors_from_bedmethyl( parsed_motif = utils.ParsedMotif(motif) regions_dict = utils.regions_dict_from_input(regions, window_size) - chunks_list = utils.process_chunks_from_regions_dict(regions_dict, chunk_size=1_000) + chunks_list = utils.process_chunks_from_regions_dict( + regions_dict, chunk_size=chunk_size + ) cores_to_run = utils.cores_to_run(cores) From a9648dfa8b1e88154db8c2a87b56c62f4e853460 Mon Sep 17 00:00:00 2001 From: Oberon Dixon-Luinenburg Date: Thu, 9 Jan 2025 13:08:56 -0800 Subject: [PATCH 09/23] DM-192 Added chunk_size for load_processes parallelization to cases.py, re-ran targets for pileup_counts_from_bedmethyl and pileup_vectors_from_bedmethyl. --- dimelo/test/cases.py | 5 +++++ .../test/data/test_targets/test_matrix.pickle | Bin 3144762 -> 3144835 bytes 2 files changed, 5 insertions(+) diff --git a/dimelo/test/cases.py b/dimelo/test/cases.py index 85366d9..001238c 100644 --- a/dimelo/test/cases.py +++ b/dimelo/test/cases.py @@ -33,6 +33,7 @@ "title": "megalodon_peaks_190", "single_strand": False, "regions_5to3prime": False, + "chunk_size": 1_000_000, }, # outputs dict function:values {}, # populated in subsequent cells @@ -52,6 +53,7 @@ "title": "megalodon_single_190", "single_strand": False, "regions_5to3prime": False, + "chunk_size": 100, }, # outputs dict function:values {}, # populated in subsequent cells @@ -71,6 +73,7 @@ "title": "megalodon_single_and_peaks_190", "single_strand": True, "regions_5to3prime": True, + "chunk_size": 10_000, }, # outputs dict function:values {}, # populated in subsequent cells @@ -90,6 +93,7 @@ "title": "megalodon_peaks_nothresh", "single_strand": True, "regions_5to3prime": False, + "chunk_size": 1000, }, # outputs dict function:values {}, # populated in subsequent cells @@ -109,6 +113,7 @@ "title": "megalodon_single_nothresh", "single_strand": False, "regions_5to3prime": True, + "chunk_size": 100, }, # outputs dict function:values {}, # populated in subsequent cells diff --git a/dimelo/test/data/test_targets/test_matrix.pickle b/dimelo/test/data/test_targets/test_matrix.pickle index f2cd6f3550a117c60cd672ee1a92dfb19c61ffec..b40735983ebb5f6b9f70d35e6d15f6ae2a655c08 100644 GIT binary patch delta 19922 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 delta 67945 zcmeI54|HW!eecZ-W>T2w1x5@^?s%nA)8gP=w#8@}OvMLz$k;rquhV6xMr&(S2BUz^ zQX{DfGoZmxGIOSu!HC*YVKjZOH53_1l_Et(f{GMnYHIz%Q=&nvC^Ghazn{I&+2`J5 zuam4r$yI%7bM|`p4%5Qh< z>p1nwJ*z(1an3t`YxV4Jt?u|#|C3)h@}d_$?&7JDp&e5%p6YvH$L8A8b+%T(%lw1>7MYigcAhGk*JK~~NNrtq&uC|(x0X!6@+9Ga(dRB>TG7UFV}~%+RN75;E%~{c%a^u?SI#* zuGya+vF4>`{!9UVv&~npnOqel3_a4>`1s4#+}}|MyupJEW^;FTHr#NhK=tZ1)8+g5 z(A#I{wyb&TuXVg3yJy3RCmr8Dzq9Z9%?{)AZ95uMYi1i$T|fOzF!9v;yUyWY^!~0V z^-aC!$Tz*>+?T)U_kZt#*S~RUnF*H(`NG-RInVDra`v)cKJq7Bz3=LH9RE#SASYjS z_WmEtcaH2m`|l3ve^+N8IPJ(D5OdRMM?Q^%e>&~R)1TO>J|ne}qeqV0Dt~@7Yi>I7 zJD0=gwcK2eq;P#@Fok=|@zmBQKlq2U=#xU(&vx&cRX%Q z_Pjspd~&wNFwY6;XKd$ZDeV=-5+pS9z*0KA3wMEk2?cKHP(9894;Jvyr{P$}2qCe8G zo8F&a8~Y0h*><6NjD1U)_Xqfb;nXWNG3|W7gbe35(1rLe5u|Ldh=pHgvErjpbxssX8QroN! zT1?Y2dmp5xVay|$1xA8nOE|imMsYPkV z2frmxvhXTt zzz6dI3H3c{g5A>HT&Tt{jAGW{`gBbIuLWCoe_95U zb0yE=b6}rF+qcdpS=HT>)i4JVf)I!sJNWBP2WN!R~)FV^~q@)1YNn^LcI02HQvE!uxb4eb<^gt7BkvD2Y zCP;2Lbp=CuGX zrh;kq{kD`{xJS54frCgws4dnvohEgXX|Nf#2*@&fg`hRw(JtxEkWd`~D~Ct+BH+_} z=)t(~UGU4e8Z$k_cfUcWm?7|lsjm5L8Iv)Rk_T>-8gP7~a;BvTDh9sj9-=Vg1gvn6 zrkg(}kq6$TVTk11#**d`+IFFCh(aSXBr||B<`d9m9t~zN6-_)xr;Bga$NsBzdf>x4 zI{0x(q4B`)$OrIka%=Jd0TD8l`Au_-bV)?v11t&vQ&hlyOP8(h3fAK^@g-QnKBCGR z5TQkG+L${yg&mUe1Z~PnD4GjNg76?PLoaNZ((S=HhwR<5be>gpbg!IJ3R2Tsd-`zT zCXWOzbf!(9#uS8?)1~#v|AoAfS|-XN?3orm&RHpf3g9kWv7VeN2Rc(R6WVS11$nW4 zm##tMo8B$&7_P;rM4oMcZSYTF7A_^br_>C%Q(M&9WR{0JK}mt@#C4-D6^;g+-HJh7 z4DQuUJ3)xJMgwE>v|;{#Vnxx9pl^jjF5at=vgIfZ1Y#4xH* z6{H{V>Da4;s>!Y=MD|UUoRUosZbNXwL25w`puFJ-n1MQwlhBJLVN|M>l(10+&n$jX zGn2|OYjcAL;Vvl#W0QmTJ}kW{EfS)z%E5O?0Ns)au|p!s#MNje*T#Yic-vb6c_}>c zY92VHd`q;0($tp0(!}?5N}uLVF%wI&#kc6x$toEAkn8V5N2!!J_;(sM84a$j?{Jzo zx#!h%nGm}FNsK}qLdU6H{RoYb$a?dsI)#I}A5@R}>wLE+$$$zZ2VlQI6q2WibdUH= zg)_^Gu?filV)zC#Qb+B-RU=@PTyD&x^@EyTUfIaapH;hp8BA81=#(a!av|;;J5HAB z_QGZFrK)9JxK8}3#-8-9$Ip1pu`#IBt$a682|0w+e&D%kLhzmQ;IR?xhu)$o z4!leeNa|6_l*?KdR8W{QXhaDfWV$)Y$7RdJhb2C*lw(l^;t42mZ7>)90dIj@3t9+K z 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

QUxQ?>fne#T>P&P8R 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 H;VJ(cBuLsC From 7301d3d98eba588edd316f9b9907588caaa67fea Mon Sep 17 00:00:00 2001 From: Oberon Dixon-Luinenburg Date: Thu, 9 Jan 2025 15:21:22 -0800 Subject: [PATCH 10/23] DM-192,DM-236,DM-233,DM-235 Parallelized pileup_counts_from_bedmethyl. Added progress bars and quiet toggles for pileup loaders. Set default chunk size to 1 MB after whole-chromosome speed testing. Added option to parallelize within rather than between regions with regions_to_list. --- dimelo/load_processed.py | 200 +++++++++++++++++++++++++---------- dimelo/plot_depth_profile.py | 1 + 2 files changed, 144 insertions(+), 57 deletions(-) diff --git a/dimelo/load_processed.py b/dimelo/load_processed.py index e9441c7..4da5f64 100644 --- a/dimelo/load_processed.py +++ b/dimelo/load_processed.py @@ -25,7 +25,9 @@ def regions_to_list( function_handle, regions, window_size: int | None = None, + quiet: bool = True, cores: int | None = None, + parallelize_within_regions: bool = False, **kwargs, ): """ @@ -53,29 +55,26 @@ def regions_to_list( cores_to_run = utils.cores_to_run(cores) - if cores_to_run > 1: - with concurrent.futures.ProcessPoolExecutor( - max_workers=cores_to_run - ) as executor: - # Use functools.partial to pre-fill arguments - process_partial = partial( - process_region, function_handle=function_handle, cores=1, **kwargs - ) + with concurrent.futures.ProcessPoolExecutor( + max_workers=1 if parallelize_within_regions else cores_to_run + ) as executor: + # Use functools.partial to pre-fill arguments + process_partial = partial( + process_region, + function_handle=function_handle, + quiet=quiet or not parallelize_within_regions, + cores=cores_to_run if parallelize_within_regions else 1, + **kwargs, + ) - # Use executor.map without lambda - results = list( - tqdm( - executor.map(process_partial, region_tuples), - total=len(region_tuples), - desc=f"Processing regions in parallel across {cores_to_run}", - ) + results = list( + tqdm( + executor.map(process_partial, region_tuples), + total=len(region_tuples), + desc=f"Processing regions in parallel across {cores_to_run}", + disable=quiet or parallelize_within_regions, ) - else: - # Single-threaded fallback - results = [ - process_region(region, function_handle, cores=1, **kwargs) - for region in tqdm(region_tuples, desc="Processing regions") - ] + ) return results @@ -128,13 +127,63 @@ def process_pileup_row( ) +def pileup_counts_process_chunk( + bedmethyl_file, + parsed_motif, + chunk, + shm_name_modified, + shm_name_valid, + lock, + single_strand, +) -> None: + source_tabix = pysam.TabixFile(str(bedmethyl_file)) + existing_valid = shared_memory.SharedMemory(name=shm_name_valid) + existing_modified = shared_memory.SharedMemory(name=shm_name_modified) + valid_base_counts = np.ndarray((1,), dtype=np.int32, buffer=existing_valid.buf) + modified_base_counts = np.ndarray( + (1,), dtype=np.int32, buffer=existing_modified.buf + ) + + chromosome = chunk["chromosome"] + subregion_start = chunk["subregion_start"] + subregion_end = chunk["subregion_end"] + strand = chunk["strand"] + + valid_base_subregion_counts = 0 + modified_base_subregion_counts = 0 + + for row in source_tabix.fetch(chromosome, subregion_start, subregion_end): + ( + keep_basemod, + _, + modified_in_row, + valid_in_row, + ) = process_pileup_row( + row=row, + parsed_motif=parsed_motif, + region_start=subregion_start, + region_end=subregion_end, + region_strand=strand, + single_strand=single_strand, + ) + if keep_basemod: + valid_base_subregion_counts += valid_in_row + modified_base_subregion_counts += modified_in_row + + with lock: + valid_base_counts[0] += valid_base_subregion_counts + modified_base_counts[0] += modified_base_subregion_counts + + def pileup_counts_from_bedmethyl( bedmethyl_file: str | Path, motif: str, regions: str | Path | list[str | Path], window_size: int | None = None, single_strand: bool = False, - cores: int | None = None, # currently unused + quiet: bool = True, + cores: int | None = None, + chunk_size: int = 1_000_000, ) -> tuple[int, int]: """ Extract number of modified bases and total number of bases from the given bedmethyl file. @@ -157,46 +206,74 @@ def pileup_counts_from_bedmethyl( window_size: (currently disabled) window around center of region, +-window_size single_strand: True means we only grab counts from reads from the same strand as the region of interest, False means we always grab both strands within the regions - cores: cores across which to parallelize processes (currently unused) + quiet: disables progress bars + cores: cores across which to parallelize processes + chunk_size: size of genomic subregions to assign out to each process Returns: tuple containing counts of (modified_bases, total_bases) """ - source_tabix = pysam.TabixFile(str(bedmethyl_file)) - # Don't need vectors, just need counts; also not guaranteed that windows are the same length - valid_base_count = 0 - modified_base_count = 0 - parsed_motif = utils.ParsedMotif(motif) - # Get counts from the specified regions - regions_dict = utils.regions_dict_from_input( - regions, - window_size, + regions_dict = utils.regions_dict_from_input(regions, window_size) + chunks_list = utils.process_chunks_from_regions_dict( + regions_dict, chunk_size=chunk_size ) cores_to_run = utils.cores_to_run(cores) - _ = cores_to_run - - for chromosome, region_list in regions_dict.items(): - for start_coord, end_coord, strand in region_list: - # TODO: change to try-except - if chromosome in source_tabix.contigs: - for row in source_tabix.fetch(chromosome, start_coord, end_coord): - keep_basemod, _, modified_in_row, valid_in_row = process_pileup_row( - row=row, - parsed_motif=parsed_motif, - region_start=start_coord, - region_end=end_coord, - region_strand=strand, - single_strand=single_strand, - ) - if keep_basemod: - valid_base_count += valid_in_row - modified_base_count += modified_in_row - return (modified_base_count, valid_base_count) + shm_valid = shared_memory.SharedMemory( + create=True, size=np.dtype(np.int32).itemsize + ) + shm_modified = shared_memory.SharedMemory( + create=True, size=np.dtype(np.int32).itemsize + ) + + manager = multiprocessing.Manager() + lock = manager.Lock() + + with concurrent.futures.ProcessPoolExecutor(max_workers=cores_to_run) as executor: + futures = [ + executor.submit( + pileup_counts_process_chunk, + bedmethyl_file, + parsed_motif, + chunk, + shm_modified.name, + shm_valid.name, + lock, + single_strand, + ) + for chunk in chunks_list + ] + for future in tqdm( + concurrent.futures.as_completed(futures), + total=len(futures), + disable=quiet, + desc=f"Loading genomic chunks, approx. {chunk_size/1000}kb per chunk", + ): + try: + future.result() + except Exception as err: + raise RuntimeError("Subprocess failed.") from err + + # Directly convert shared memory buffers to integers + modified_base_count = int.from_bytes( + shm_modified.buf[:4], byteorder="little", signed=True + ) + valid_base_count = int.from_bytes( + shm_valid.buf[:4], byteorder="little", signed=True + ) + + return modified_base_count, valid_base_count + + # We need to convert these shared memory buffers to ints that are no longer tied to the buffer, + # so they can be passed up without any seg fault type errors + modified_base_counts = np.ndarray((1,), dtype=np.int32, buffer=shm_modified.buf) + valid_base_counts = np.ndarray((1,), dtype=np.int32, buffer=shm_valid.buf) + + return int(np.copy(modified_base_counts[0])), int(np.copy(valid_base_counts[0])) def counts_from_fake(*args, **kwargs) -> tuple[int, int]: @@ -253,7 +330,7 @@ def pileup_vectors_process_chunk( valid_base_subregion = np.zeros(subregion_end - subregion_start, dtype=int) modified_base_subregion = np.zeros(subregion_end - subregion_start, dtype=int) - for row in source_tabix.fetch(chunk["chromosome"], subregion_start, subregion_end): + for row in source_tabix.fetch(chromosome, subregion_start, subregion_end): ( keep_basemod, genomic_coord, @@ -295,8 +372,9 @@ def pileup_vectors_from_bedmethyl( window_size: int | None = None, single_strand: bool = False, regions_5to3prime: bool = False, + quiet: bool = True, cores: int | None = None, - chunk_size: int = 100, + chunk_size: int = 1_000_000, ) -> tuple[np.ndarray, np.ndarray]: """ Extract per-position pileup counts at valid motifs across one or more superimposed regions. @@ -328,14 +406,14 @@ def pileup_vectors_from_bedmethyl( single_strand: True means we only grab counts from reads from the same strand as the region of interest, False means we always grab both strands within the regions regions_5to3prime: True means negative strand regions get flipped, False means no flipping - cores: cores across which to parallelize processes (currently unused) + quiet: disables progress bars + cores: cores across which to parallelize processes + chunk_size: size of genomic subregions to assign out to each process Returns: tuple containing (modified_base_counts, valid_base_counts) """ - print(f"function call: {bedmethyl_file}, {regions}, {motif}") - parsed_motif = utils.ParsedMotif(motif) regions_dict = utils.regions_dict_from_input(regions, window_size) @@ -377,13 +455,19 @@ def pileup_vectors_from_bedmethyl( for chunk in chunks_list ] for future in tqdm( - concurrent.futures.as_completed(futures), total=len(futures) + concurrent.futures.as_completed(futures), + total=len(futures), + disable=quiet, + desc=f"Loading genomic chunks, approx. {chunk_size/1000}kb per chunk", ): try: future.result() except Exception as err: raise RuntimeError("Subprocess failed.") from err + # We need to convert these shared memory buffers to numpy arrays which + # we then copy, so that they no longer reference the shared memory which + # will soon be de-allocated modified_base_counts = np.ndarray( (region_len,), dtype=np.int32, buffer=shm_modified.buf ) @@ -416,6 +500,7 @@ def read_vectors_from_hdf5( sort_by: str | list[str] = ["chromosome", "region_start", "read_start"], calculate_mod_fractions: bool = True, cores: int | None = None, # currently unused + quiet: bool = True, # currently unused ) -> tuple[list[tuple], list[str], dict | None]: """ Pulls a list of read data out of an .h5 file containing processed read vectors, formatted @@ -458,6 +543,7 @@ def read_vectors_from_hdf5( include chromosome, region_start, region_end, read_start, read_end, and motif. More to be added in future. cores: cores across which to parallelize processes (currently unused) + quiet: silences progress bars (currently unused) Returns: a list of tuples, each tuple containing all datasets corresponding to an individual read that diff --git a/dimelo/plot_depth_profile.py b/dimelo/plot_depth_profile.py index d2d9ef3..e4b3327 100644 --- a/dimelo/plot_depth_profile.py +++ b/dimelo/plot_depth_profile.py @@ -198,6 +198,7 @@ def get_depth_profiles( window_size=window_size, single_strand=single_strand, regions_5to3prime=regions_5to3prime, + quiet=False, ) trace = valid_base_counts.astype(float) trace[trace == 0] = np.nan From 56e6333d8c51b09496e9c13112af488a9e242039 Mon Sep 17 00:00:00 2001 From: Oberon Dixon-Luinenburg Date: Thu, 9 Jan 2025 20:25:59 -0800 Subject: [PATCH 11/23] DM-192,DM-236 Properly close and delink shared memory when appropriate to avoid intermittent crashes. Adjust tabix fetch to avoid negative start values. Tweak wording on progress bars. --- dimelo/load_processed.py | 41 +++++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/dimelo/load_processed.py b/dimelo/load_processed.py index 4da5f64..cb0b018 100644 --- a/dimelo/load_processed.py +++ b/dimelo/load_processed.py @@ -152,7 +152,7 @@ def pileup_counts_process_chunk( valid_base_subregion_counts = 0 modified_base_subregion_counts = 0 - for row in source_tabix.fetch(chromosome, subregion_start, subregion_end): + for row in source_tabix.fetch(chromosome, max(subregion_start, 0), subregion_end): ( keep_basemod, _, @@ -173,6 +173,9 @@ def pileup_counts_process_chunk( with lock: valid_base_counts[0] += valid_base_subregion_counts modified_base_counts[0] += modified_base_subregion_counts + # Close the file descriptor/handle to the shared memory + existing_valid.close() + existing_modified.close() def pileup_counts_from_bedmethyl( @@ -251,7 +254,7 @@ def pileup_counts_from_bedmethyl( concurrent.futures.as_completed(futures), total=len(futures), disable=quiet, - desc=f"Loading genomic chunks, approx. {chunk_size/1000}kb per chunk", + desc=f"Loading genomic chunks, up to {chunk_size/1000}kb per chunk", ): try: future.result() @@ -265,16 +268,14 @@ def pileup_counts_from_bedmethyl( valid_base_count = int.from_bytes( shm_valid.buf[:4], byteorder="little", signed=True ) + # Close and unlink shared memory - not fully handled by garbage collection otherwise + shm_modified.close() + shm_modified.unlink() + shm_valid.close() + shm_valid.unlink() return modified_base_count, valid_base_count - # We need to convert these shared memory buffers to ints that are no longer tied to the buffer, - # so they can be passed up without any seg fault type errors - modified_base_counts = np.ndarray((1,), dtype=np.int32, buffer=shm_modified.buf) - valid_base_counts = np.ndarray((1,), dtype=np.int32, buffer=shm_valid.buf) - - return int(np.copy(modified_base_counts[0])), int(np.copy(valid_base_counts[0])) - def counts_from_fake(*args, **kwargs) -> tuple[int, int]: """ @@ -330,7 +331,7 @@ def pileup_vectors_process_chunk( valid_base_subregion = np.zeros(subregion_end - subregion_start, dtype=int) modified_base_subregion = np.zeros(subregion_end - subregion_start, dtype=int) - for row in source_tabix.fetch(chromosome, subregion_start, subregion_end): + for row in source_tabix.fetch(chromosome, max(subregion_start, 0), subregion_end): ( keep_basemod, genomic_coord, @@ -363,6 +364,9 @@ def pileup_vectors_process_chunk( modified_base_counts[ subregion_offset : subregion_offset + abs(subregion_end - subregion_start) ] += modified_base_subregion + # Close the file descriptor/handle to the shared memory + existing_modified.close() + existing_valid.close() def pileup_vectors_from_bedmethyl( @@ -458,7 +462,7 @@ def pileup_vectors_from_bedmethyl( concurrent.futures.as_completed(futures), total=len(futures), disable=quiet, - desc=f"Loading genomic chunks, approx. {chunk_size/1000}kb per chunk", + desc=f"Loading genomic chunks, up to {chunk_size/1000}kb per chunk", ): try: future.result() @@ -468,12 +472,19 @@ def pileup_vectors_from_bedmethyl( # We need to convert these shared memory buffers to numpy arrays which # we then copy, so that they no longer reference the shared memory which # will soon be de-allocated - modified_base_counts = np.ndarray( - (region_len,), dtype=np.int32, buffer=shm_modified.buf + modified_base_counts = np.copy( + np.ndarray((region_len,), dtype=np.int32, buffer=shm_modified.buf) + ) + valid_base_counts = np.copy( + np.ndarray((region_len,), dtype=np.int32, buffer=shm_valid.buf) ) - valid_base_counts = np.ndarray((region_len,), dtype=np.int32, buffer=shm_valid.buf) + # Close and unlink shared memory - not fully handled by garbage collection otherwise + shm_modified.close() + shm_modified.unlink() + shm_valid.close() + shm_valid.unlink() - return np.copy(modified_base_counts), np.copy(valid_base_counts) + return modified_base_counts, valid_base_counts def vector_from_fake(window_size: int, *args, **kwargs) -> np.ndarray: From 97efec1bd44e5e0baac70e63f83191814f5c4be3 Mon Sep 17 00:00:00 2001 From: Oberon Dixon-Luinenburg Date: Thu, 9 Jan 2025 21:08:40 -0800 Subject: [PATCH 12/23] DM-191 Re-arrange contents of load_processed for better clarity. Added some comments. --- dimelo/export.py | 2 - dimelo/load_processed.py | 483 +++++++++++++++++++++++---------------- 2 files changed, 291 insertions(+), 194 deletions(-) diff --git a/dimelo/export.py b/dimelo/export.py index c3fd6c1..ce64027 100644 --- a/dimelo/export.py +++ b/dimelo/export.py @@ -107,8 +107,6 @@ def pileup_to_bigwig( load_processed.process_pileup_row( row=row, parsed_motif=parsed_motif, - region_start=0, - region_end=contig_lengths[contig], region_strand=strand, single_strand=(strand != "."), ) diff --git a/dimelo/load_processed.py b/dimelo/load_processed.py index cb0b018..509cc4b 100644 --- a/dimelo/load_processed.py +++ b/dimelo/load_processed.py @@ -14,11 +14,9 @@ from . import test_data, utils - -def process_region(region_tuple, function_handle, **kwargs): - chromosome, start_coord, end_coord, strand = region_tuple - single_region_str = f"{chromosome}:{start_coord}-{end_coord},{strand}" - return function_handle(regions=single_region_str, **kwargs) +################################################################################################################ +#### Loader wrappers #### +################################################################################################################ def regions_to_list( @@ -31,6 +29,8 @@ def regions_to_list( **kwargs, ): """ + User-facing function. + Run any standard load_processed pileup or extract loader loading each region from the region specifier into a new element of a list. @@ -40,6 +40,9 @@ def regions_to_list( window_size: window around centers of regions, defaults to None cores: process count across which to parallelize. Each individual region will only ever get one core. **kwargs: all necessary keyword arguments to pass down to the loader + + Returns: + list([function_handle returns for region in regions]) """ regions_dict = utils.regions_dict_from_input( regions, @@ -79,103 +82,26 @@ def regions_to_list( return results -def process_pileup_row( - row: str, - parsed_motif: utils.ParsedMotif, - region_start: int, - region_end: int, - region_strand: str, - single_strand: bool = False, -) -> tuple[bool, int, int, int]: - """ - Returns: keep_basemod, genomic_coord, modified_in_row, valid_in_row +def process_region(region_tuple, function_handle, **kwargs): """ - tabix_fields = row.split("\t") - pileup_basemod = tabix_fields[3] - pileup_strand = tabix_fields[5] - - if single_strand and pileup_strand.strip() != region_strand: - # We are on the wrong strand, can't keep this position - keep_basemod = False - elif len(pileup_basemod.split(",")) == 3: - pileup_modname, pileup_motif, pileup_mod_coord = pileup_basemod.split(",") - if ( - pileup_motif == parsed_motif.motif_seq - and int(pileup_mod_coord) == parsed_motif.modified_pos - and pileup_modname in parsed_motif.mod_codes - ): - keep_basemod = True - else: - keep_basemod = False - elif len(pileup_basemod.split(",")) == 1: - keep_basemod = pileup_basemod in parsed_motif.mod_codes - else: - raise ValueError( - f"Unexpected format in bedmethyl file: {row} contains {pileup_basemod} which cannot be parsed." - ) - - pileup_info = tabix_fields[9].split(" ") - genomic_coord = int(tabix_fields[1]) - valid_in_row = int(pileup_info[0]) - modified_in_row = int(pileup_info[2]) - - return ( - keep_basemod, - genomic_coord, - modified_in_row, - valid_in_row, - ) + Helper function for regions_to_list. Takes in the region tuple, creates a string, and runs the loader function. + Args: + region_tuple: chromosome, start, end, strand + function_handle: a function that takes a regions specifier and loads processed data + **kwargs: the remaining kwargs necessary to run the function in question -def pileup_counts_process_chunk( - bedmethyl_file, - parsed_motif, - chunk, - shm_name_modified, - shm_name_valid, - lock, - single_strand, -) -> None: - source_tabix = pysam.TabixFile(str(bedmethyl_file)) - existing_valid = shared_memory.SharedMemory(name=shm_name_valid) - existing_modified = shared_memory.SharedMemory(name=shm_name_modified) - valid_base_counts = np.ndarray((1,), dtype=np.int32, buffer=existing_valid.buf) - modified_base_counts = np.ndarray( - (1,), dtype=np.int32, buffer=existing_modified.buf - ) - - chromosome = chunk["chromosome"] - subregion_start = chunk["subregion_start"] - subregion_end = chunk["subregion_end"] - strand = chunk["strand"] - - valid_base_subregion_counts = 0 - modified_base_subregion_counts = 0 + Returns: + Whatever function_handle returns + """ + chromosome, start_coord, end_coord, strand = region_tuple + single_region_str = f"{chromosome}:{start_coord}-{end_coord},{strand}" + return function_handle(regions=single_region_str, **kwargs) - for row in source_tabix.fetch(chromosome, max(subregion_start, 0), subregion_end): - ( - keep_basemod, - _, - modified_in_row, - valid_in_row, - ) = process_pileup_row( - row=row, - parsed_motif=parsed_motif, - region_start=subregion_start, - region_end=subregion_end, - region_strand=strand, - single_strand=single_strand, - ) - if keep_basemod: - valid_base_subregion_counts += valid_in_row - modified_base_subregion_counts += modified_in_row - with lock: - valid_base_counts[0] += valid_base_subregion_counts - modified_base_counts[0] += modified_base_subregion_counts - # Close the file descriptor/handle to the shared memory - existing_valid.close() - existing_modified.close() +################################################################################################################ +#### Pileup loaders #### +################################################################################################################ def pileup_counts_from_bedmethyl( @@ -189,6 +115,8 @@ def pileup_counts_from_bedmethyl( chunk_size: int = 1_000_000, ) -> tuple[int, int]: """ + User-facing function. + Extract number of modified bases and total number of bases from the given bedmethyl file. Called by plotters or by the user. @@ -259,7 +187,7 @@ def pileup_counts_from_bedmethyl( try: future.result() except Exception as err: - raise RuntimeError("Subprocess failed.") from err + raise RuntimeError("pileup_counts_process_chunk failed.") from err # Directly convert shared memory buffers to integers modified_base_count = int.from_bytes( @@ -277,98 +205,6 @@ def pileup_counts_from_bedmethyl( return modified_base_count, valid_base_count -def counts_from_fake(*args, **kwargs) -> tuple[int, int]: - """ - Generates a fake set of enrichment counts. Ignores all arguments. - - Returns: - tuple containing counts of (modified_bases, total_bases) - """ - window_halfsize = 500 - return test_data.fake_peak_enrichment(halfsize=window_halfsize, peak_height=0.15) - - -def pileup_vectors_process_chunk( - bedmethyl_file, - parsed_motif, - chunk, - region_len, - shm_name_modified, - shm_name_valid, - lock, - single_strand, - regions_5to3prime, -) -> None: - source_tabix = pysam.TabixFile(str(bedmethyl_file)) - existing_valid = shared_memory.SharedMemory(name=shm_name_valid) - existing_modified = shared_memory.SharedMemory(name=shm_name_modified) - valid_base_counts = np.ndarray( - (region_len,), dtype=np.int32, buffer=existing_valid.buf - ) - modified_base_counts = np.ndarray( - (region_len,), dtype=np.int32, buffer=existing_modified.buf - ) - - chromosome = chunk["chromosome"] - region_start = chunk["region_start"] - region_end = chunk["region_end"] - subregion_start = chunk["subregion_start"] - subregion_end = chunk["subregion_end"] - strand = chunk["strand"] - - flip_coords = regions_5to3prime and strand == "-" - - if flip_coords: - subregion_offset = region_end - subregion_end - else: - subregion_offset = subregion_start - region_start - - if region_end - region_start > region_len: - print( - f"WARNING: You have specified a region at {chromosome}:{region_start}-{region_end} that is longer than the first region; the end of the region will be skipped. To make a profile plot with differently-sized region, consider using the window_size parameter to make a profile across centered windows." - ) - - valid_base_subregion = np.zeros(subregion_end - subregion_start, dtype=int) - modified_base_subregion = np.zeros(subregion_end - subregion_start, dtype=int) - - for row in source_tabix.fetch(chromosome, max(subregion_start, 0), subregion_end): - ( - keep_basemod, - genomic_coord, - modified_in_row, - valid_in_row, - ) = process_pileup_row( - row=row, - parsed_motif=parsed_motif, - region_start=subregion_start, - region_end=subregion_end, - region_strand=strand, - single_strand=single_strand, - ) - if keep_basemod: - if flip_coords: - # We want to flip the coordinates for this region so that it is recorded along the 5 prime to 3 prime direction - # This will enable analyses where the orientation of protein binding / transcriptional dynamics / etc is relevant for our pileup signal - pileup_coord_in_subregion = subregion_end - genomic_coord - 1 - else: - # Normal coordinates are the default. This will be used both for the '+' case and the '.' (no strand specified) case - pileup_coord_in_subregion = genomic_coord - subregion_start - if pileup_coord_in_subregion < (subregion_end - subregion_start): - valid_base_subregion[pileup_coord_in_subregion] += valid_in_row - modified_base_subregion[pileup_coord_in_subregion] += modified_in_row - - with lock: - valid_base_counts[ - subregion_offset : subregion_offset + abs(subregion_end - subregion_start) - ] += valid_base_subregion - modified_base_counts[ - subregion_offset : subregion_offset + abs(subregion_end - subregion_start) - ] += modified_base_subregion - # Close the file descriptor/handle to the shared memory - existing_modified.close() - existing_valid.close() - - def pileup_vectors_from_bedmethyl( bedmethyl_file: str | Path, motif: str, @@ -381,6 +217,8 @@ def pileup_vectors_from_bedmethyl( chunk_size: int = 1_000_000, ) -> tuple[np.ndarray, np.ndarray]: """ + User-facing function. + Extract per-position pileup counts at valid motifs across one or more superimposed regions. Called by profile plotters, can also be used by a user directly. @@ -467,7 +305,7 @@ def pileup_vectors_from_bedmethyl( try: future.result() except Exception as err: - raise RuntimeError("Subprocess failed.") from err + raise RuntimeError("pileup_vectors_process_chunk failed.") from err # We need to convert these shared memory buffers to numpy arrays which # we then copy, so that they no longer reference the shared memory which @@ -487,8 +325,23 @@ def pileup_vectors_from_bedmethyl( return modified_base_counts, valid_base_counts +def counts_from_fake(*args, **kwargs) -> tuple[int, int]: + """ + Test helper function. + + Generates a fake set of enrichment counts. Ignores all arguments. + + Returns: + tuple containing counts of (modified_bases, total_bases) + """ + window_halfsize = 500 + return test_data.fake_peak_enrichment(halfsize=window_halfsize, peak_height=0.15) + + def vector_from_fake(window_size: int, *args, **kwargs) -> np.ndarray: """ + Tes helper function. + Generates a fake peak trace. Ignores all arguments except window_size. Args: @@ -502,6 +355,233 @@ def vector_from_fake(window_size: int, *args, **kwargs) -> np.ndarray: ) +def pileup_vectors_process_chunk( + bedmethyl_file, + parsed_motif, + chunk, + region_len, + shm_name_modified, + shm_name_valid, + lock, + single_strand, + regions_5to3prime, +) -> None: + """ + Helper function to allow pileup_vectors_from_bedmethyl to operate in a parallized fashion. + + Sum up modified and valid counts for a subregion chunk in a bedmethyl file. + + Args: + bedmethyl_file: Path to bedmethyl file + parsed_motif: ParsedMotif object + chunk: a dict containing subregion chunk information + shm_name_modified: the name string for the shared memory location containing the modified counts array + shm_name_valid: the name string for the shared memory location containing the valid counts array + lock: a manager.Lock object to allow synchronization in accessing shared memory + single_strand: True if only single-strand mods are desired + + Returns: + None. Counts are added in-place to shared memory. + """ + source_tabix = pysam.TabixFile(str(bedmethyl_file)) + existing_valid = shared_memory.SharedMemory(name=shm_name_valid) + existing_modified = shared_memory.SharedMemory(name=shm_name_modified) + valid_base_counts = np.ndarray( + (region_len,), dtype=np.int32, buffer=existing_valid.buf + ) + modified_base_counts = np.ndarray( + (region_len,), dtype=np.int32, buffer=existing_modified.buf + ) + + chromosome = chunk["chromosome"] + region_start = chunk["region_start"] + region_end = chunk["region_end"] + subregion_start = chunk["subregion_start"] + subregion_end = chunk["subregion_end"] + strand = chunk["strand"] + + flip_coords = regions_5to3prime and strand == "-" + + if flip_coords: + subregion_offset = region_end - subregion_end + else: + subregion_offset = subregion_start - region_start + + if region_end - region_start > region_len: + print( + f"WARNING: You have specified a region at {chromosome}:{region_start}-{region_end} that is longer than the first region; the end of the region will be skipped. To make a profile plot with differently-sized region, consider using the window_size parameter to make a profile across centered windows." + ) + + valid_base_subregion = np.zeros(subregion_end - subregion_start, dtype=int) + modified_base_subregion = np.zeros(subregion_end - subregion_start, dtype=int) + + for row in source_tabix.fetch(chromosome, max(subregion_start, 0), subregion_end): + ( + keep_basemod, + genomic_coord, + modified_in_row, + valid_in_row, + ) = process_pileup_row( + row=row, + parsed_motif=parsed_motif, + region_strand=strand, + single_strand=single_strand, + ) + if keep_basemod: + if flip_coords: + # We want to flip the coordinates for this region so that it is recorded along the 5 prime to 3 prime direction + # This will enable analyses where the orientation of protein binding / transcriptional dynamics / etc is relevant for our pileup signal + pileup_coord_in_subregion = subregion_end - genomic_coord - 1 + else: + # Normal coordinates are the default. This will be used both for the '+' case and the '.' (no strand specified) case + pileup_coord_in_subregion = genomic_coord - subregion_start + if pileup_coord_in_subregion < (subregion_end - subregion_start): + valid_base_subregion[pileup_coord_in_subregion] += valid_in_row + modified_base_subregion[pileup_coord_in_subregion] += modified_in_row + + with lock: + valid_base_counts[ + subregion_offset : subregion_offset + abs(subregion_end - subregion_start) + ] += valid_base_subregion + modified_base_counts[ + subregion_offset : subregion_offset + abs(subregion_end - subregion_start) + ] += modified_base_subregion + # Close the file descriptor/handle to the shared memory + existing_modified.close() + existing_valid.close() + + +def pileup_counts_process_chunk( + bedmethyl_file, + parsed_motif, + chunk, + shm_name_modified, + shm_name_valid, + lock, + single_strand, +) -> None: + """ + Helper function to allow pileup_counts_from_bedmethyl to operate in a parallized fashion. + + Sum up modified and valid counts for a subregion chunk in a bedmethyl file. + + Args: + bedmethyl_file: Path to bedmethyl file + parsed_motif: ParsedMotif object + chunk: a dict containing subregion chunk information + shm_name_modified: the name string for the shared memory location containing the modified counts sum + shm_name_valid: the name string for the shared memory location containing the valid counts sum + lock: a manager.Lock object to allow synchronization in accessing shared memory + single_strand: True if only single-strand mods are desired + + Returns: + None. Counts are added in-place to shared memory. + """ + source_tabix = pysam.TabixFile(str(bedmethyl_file)) + existing_valid = shared_memory.SharedMemory(name=shm_name_valid) + existing_modified = shared_memory.SharedMemory(name=shm_name_modified) + valid_base_counts = np.ndarray((1,), dtype=np.int32, buffer=existing_valid.buf) + modified_base_counts = np.ndarray( + (1,), dtype=np.int32, buffer=existing_modified.buf + ) + + chromosome = chunk["chromosome"] + subregion_start = chunk["subregion_start"] + subregion_end = chunk["subregion_end"] + strand = chunk["strand"] + + valid_base_subregion_counts = 0 + modified_base_subregion_counts = 0 + + for row in source_tabix.fetch(chromosome, max(subregion_start, 0), subregion_end): + ( + keep_basemod, + _, + modified_in_row, + valid_in_row, + ) = process_pileup_row( + row=row, + parsed_motif=parsed_motif, + region_strand=strand, + single_strand=single_strand, + ) + if keep_basemod: + valid_base_subregion_counts += valid_in_row + modified_base_subregion_counts += modified_in_row + + with lock: + valid_base_counts[0] += valid_base_subregion_counts + modified_base_counts[0] += modified_base_subregion_counts + + # Close the file descriptor/handle to the shared memory + existing_valid.close() + existing_modified.close() + + +def process_pileup_row( + row: str, + parsed_motif: utils.ParsedMotif, + region_strand: str, + single_strand: bool = False, +) -> tuple[bool, int, int, int]: + """ + Helper function designed for pileup_counts_from_bedmethyl via pileup_counts_process_chunk, pileup_vectors_from_bedmethyl + via pileup_vectors_process_chunk, and export.pileup_to_bigwig; changed to logic here may impact some or all of + these. + + Process a row from a pileup, determining whether the basemod is relevant and passing back its coordinate, + modification count, and valid read count. + + Args: + row: a string row from a bedmethyl file + parsed_motif: a ParsedMotif object + region_strand: the strand from the query region + single_strand: True if only mods on the region_strand are to be kept + + Returns: keep_basemod, genomic_coord, modified_in_row, valid_in_row + """ + tabix_fields = row.split("\t") + pileup_basemod = tabix_fields[3] + pileup_strand = tabix_fields[5] + + if single_strand and pileup_strand.strip() != region_strand: + # We are on the wrong strand, can't keep this position + keep_basemod = False + elif len(pileup_basemod.split(",")) == 3: + pileup_modname, pileup_motif, pileup_mod_coord = pileup_basemod.split(",") + if ( + pileup_motif == parsed_motif.motif_seq + and int(pileup_mod_coord) == parsed_motif.modified_pos + and pileup_modname in parsed_motif.mod_codes + ): + keep_basemod = True + else: + keep_basemod = False + elif len(pileup_basemod.split(",")) == 1: + keep_basemod = pileup_basemod in parsed_motif.mod_codes + else: + raise ValueError( + f"Unexpected format in bedmethyl file: {row} contains {pileup_basemod} which cannot be parsed." + ) + + pileup_info = tabix_fields[9].split(" ") + genomic_coord = int(tabix_fields[1]) + valid_in_row = int(pileup_info[0]) + modified_in_row = int(pileup_info[2]) + + return ( + keep_basemod, + genomic_coord, + modified_in_row, + valid_in_row, + ) + + +################################################################################################################ +#### Single read loaders #### +################################################################################################################ + + def read_vectors_from_hdf5( file: str | Path, motifs: list[str], @@ -514,6 +594,8 @@ def read_vectors_from_hdf5( quiet: bool = True, # currently unused ) -> tuple[list[tuple], list[str], dict | None]: """ + User-facing function. + Pulls a list of read data out of an .h5 file containing processed read vectors, formatted for read-by-read vector processing downstream use cases. @@ -747,6 +829,8 @@ def readwise_binary_modification_arrays( cores: int | None = None, # currently unused ) -> tuple[list[np.ndarray], np.ndarray[int], np.ndarray[str], dict | None]: """ + Primarily designed as a helper function for single-read plotting, but can be used by a user. + Pulls a list of read data out of a file containing processed read vectors, formatted with seaborn plotting in mind. Currently we only support .h5 files. @@ -900,6 +984,8 @@ def reads_from_fake( file: Path, regions: Path, motifs: list[str] ) -> tuple[list[np.ndarray], np.ndarray[int], np.ndarray[str], dict]: """ + Helper function to support testing. + TODO: What does the bed file represent in this method? This one is breaking my brain a bit. TODO: Variable names in this method stink. TODO: Currently assumes mod calling (thresholding probabilities) was already performed elsewhere @@ -952,17 +1038,27 @@ def reads_from_fake( def convert_bytes_to_strings(tup): - """Convert all bytes elements in a tuple to strings.""" + """ + Helper function for single read loading. + Convert all bytes elements in a tuple to strings. + """ return tuple(item.decode() if isinstance(item, bytes) else item for item in tup) # tuple(convert_bytes(item) for item in tup) def adjust_mod_probs_in_arrays(mod_array, val_array): + """ + Helper function to correct for an idiosyncracy in modkit single-read parsing wherein 0-255 + "mod quality" values are parsed as floating-point values from 1/512 to 511/512. + """ mod_array[np.flatnonzero(val_array)] += 1 / 512 return mod_array def adjust_mod_probs_in_tuples(tup, mod_idx, val_idx): + """ + Helper function to apply mod prob adjustments + """ return tuple( item if index != mod_idx else adjust_mod_probs_in_arrays(item, tup[val_idx]) for index, item in enumerate(tup) @@ -970,6 +1066,9 @@ def adjust_mod_probs_in_tuples(tup, mod_idx, val_idx): def binary_to_np_array(compressed_bytes, dtype, decompressor, binarized, int8tofloat): + """ + Helper function to decompress binary data to boolean or floating point arrays + """ if binarized: return np.frombuffer(decompressor(compressed_bytes), dtype=dtype).astype(bool) elif int8tofloat: From a8ed1ae5b598dc4b6dad87d92549375109151204 Mon Sep 17 00:00:00 2001 From: Oberon Dixon-Luinenburg Date: Fri, 17 Jan 2025 12:09:33 -0800 Subject: [PATCH 13/23] DM-238 Add quiet and cores parameters and corresponding documentation to all pileup plotters. A few other small tweaks. --- dimelo/load_processed.py | 44 ++++++++++++++++++++++--------- dimelo/plot_depth_histogram.py | 12 +++++++-- dimelo/plot_depth_profile.py | 13 ++++++++- dimelo/plot_enrichment.py | 10 +++++++ dimelo/plot_enrichment_profile.py | 10 +++++++ 5 files changed, 73 insertions(+), 16 deletions(-) diff --git a/dimelo/load_processed.py b/dimelo/load_processed.py index 509cc4b..43ebef7 100644 --- a/dimelo/load_processed.py +++ b/dimelo/load_processed.py @@ -38,7 +38,11 @@ def regions_to_list( function_handle: the loader function you want to run. regions: the region specifier window_size: window around centers of regions, defaults to None - cores: process count across which to parallelize. Each individual region will only ever get one core. + quiet: disables progress bars + cores: CPU cores across which to parallelize processing + parallelize_within_regions: if True, regions will be run sequentially in parallelized chunks. If False, + each individual region's chunks will be run sequentially but there will be parallelization across + regions, i.e. each core will be assigned one region at a time by the executor **kwargs: all necessary keyword arguments to pass down to the loader Returns: @@ -57,7 +61,12 @@ def regions_to_list( ] cores_to_run = utils.cores_to_run(cores) - + # quiet and cores logic below is driven by the following: + # If the parallelization is within regions: + # (1) progress bars should happen within regions if at all, because we assume regions are + # large if they make sense to parallelize + # (2) the cores_to_run will be allocated to within-region parallelization, and the top-level + # jobs sequence is run sequentially with concurrent.futures.ProcessPoolExecutor( max_workers=1 if parallelize_within_regions else cores_to_run ) as executor: @@ -65,8 +74,10 @@ def regions_to_list( process_partial = partial( process_region, function_handle=function_handle, - quiet=quiet or not parallelize_within_regions, - cores=cores_to_run if parallelize_within_regions else 1, + quiet=quiet or not parallelize_within_regions, # + cores=cores_to_run + if parallelize_within_regions + else 1, # if parallelization is within region **kwargs, ) @@ -110,7 +121,7 @@ def pileup_counts_from_bedmethyl( regions: str | Path | list[str | Path], window_size: int | None = None, single_strand: bool = False, - quiet: bool = True, + quiet: bool = False, cores: int | None = None, chunk_size: int = 1_000_000, ) -> tuple[int, int]: @@ -138,7 +149,7 @@ def pileup_counts_from_bedmethyl( single_strand: True means we only grab counts from reads from the same strand as the region of interest, False means we always grab both strands within the regions quiet: disables progress bars - cores: cores across which to parallelize processes + cores: CPU cores across which to parallelize processing chunk_size: size of genomic subregions to assign out to each process Returns: @@ -212,7 +223,7 @@ def pileup_vectors_from_bedmethyl( window_size: int | None = None, single_strand: bool = False, regions_5to3prime: bool = False, - quiet: bool = True, + quiet: bool = False, cores: int | None = None, chunk_size: int = 1_000_000, ) -> tuple[np.ndarray, np.ndarray]: @@ -249,7 +260,7 @@ def pileup_vectors_from_bedmethyl( the region of interest, False means we always grab both strands within the regions regions_5to3prime: True means negative strand regions get flipped, False means no flipping quiet: disables progress bars - cores: cores across which to parallelize processes + cores: CPU cores across which to parallelize processing chunk_size: size of genomic subregions to assign out to each process Returns: @@ -379,9 +390,10 @@ def pileup_vectors_process_chunk( shm_name_valid: the name string for the shared memory location containing the valid counts array lock: a manager.Lock object to allow synchronization in accessing shared memory single_strand: True if only single-strand mods are desired + regions_5to3prime: True means negative strand regions get flipped, False means no flipping Returns: - None. Counts are added in-place to shared memory. + None. Counts are added to arrays in-place to shared memory. """ source_tabix = pysam.TabixFile(str(bedmethyl_file)) existing_valid = shared_memory.SharedMemory(name=shm_name_valid) @@ -526,7 +538,7 @@ def process_pileup_row( ) -> tuple[bool, int, int, int]: """ Helper function designed for pileup_counts_from_bedmethyl via pileup_counts_process_chunk, pileup_vectors_from_bedmethyl - via pileup_vectors_process_chunk, and export.pileup_to_bigwig; changed to logic here may impact some or all of + via pileup_vectors_process_chunk, and export.pileup_to_bigwig; changes to logic here may impact some or all of these. Process a row from a pileup, determining whether the basemod is relevant and passing back its coordinate, @@ -538,7 +550,7 @@ def process_pileup_row( region_strand: the strand from the query region single_strand: True if only mods on the region_strand are to be kept - Returns: keep_basemod, genomic_coord, modified_in_row, valid_in_row + Returns: keep_basemod, genomic_coord, modified_in_row, valid_in_row. Values are provided even if keep_basemod is False. """ tabix_fields = row.split("\t") pileup_basemod = tabix_fields[3] @@ -590,8 +602,8 @@ def read_vectors_from_hdf5( single_strand: bool = False, sort_by: str | list[str] = ["chromosome", "region_start", "read_start"], calculate_mod_fractions: bool = True, + quiet: bool = True, # currently unused; change to default False when pbars are implemented cores: int | None = None, # currently unused - quiet: bool = True, # currently unused ) -> tuple[list[tuple], list[str], dict | None]: """ User-facing function. @@ -613,6 +625,8 @@ def read_vectors_from_hdf5( After this processing, we calculate modification fractions, sort, and return. + TODO: Implement progress bars and parallelization as with pileup loaders + Args: file: Path to an hdf5 (.h5) file containing modification data for single reads, stored in datasets read_name, chromosome, read_start, @@ -635,8 +649,8 @@ def read_vectors_from_hdf5( sort_by: Read properties by which to sort, either one string or a list of strings. Options include chromosome, region_start, region_end, read_start, read_end, and motif. More to be added in future. - cores: cores across which to parallelize processes (currently unused) quiet: silences progress bars (currently unused) + cores: cores across which to parallelize processes (currently unused) Returns: a list of tuples, each tuple containing all datasets corresponding to an individual read that @@ -826,6 +840,7 @@ def readwise_binary_modification_arrays( sort_by: str | list[str] = ["chromosome", "region_start", "read_start"], thresh: float | None = None, relative: bool = True, + quiet: bool = True, # currently unused; change to default False when pbars are implemented cores: int | None = None, # currently unused ) -> tuple[list[np.ndarray], np.ndarray[int], np.ndarray[str], dict | None]: """ @@ -842,6 +857,8 @@ def readwise_binary_modification_arrays( coordinates. If positions are relative, regions_5to3prime can be used to show all regions as upstream-to-downstream along their respective strands. + TODO: Implement progress bars and parallelization as with pileup loaders + Args: file: Path to an hdf5 (.h5) file containing modification data for single reads, stored in datasets read_name, chromosome, read_start, @@ -870,6 +887,7 @@ def readwise_binary_modification_arrays( in the genomes, centered at the center of the region. If False, absolute coordinates are provided. There is not currently a check for all reads being on the same chromosome if relative=False, but this could create unexpected behaviour for a the standard visualizations. + quiet: silences progress bars (currently unused) cores: cores across which to parallelize processes (currently unused) Returns: diff --git a/dimelo/plot_depth_histogram.py b/dimelo/plot_depth_histogram.py index 655e163..949b4ec 100644 --- a/dimelo/plot_depth_histogram.py +++ b/dimelo/plot_depth_histogram.py @@ -14,7 +14,8 @@ def plot_depth_histogram( window_size: int, single_strand: bool = False, average_within_region: bool = False, - cores=None, + quiet: bool = False, + cores: int | None = None, **kwargs, ) -> Axes: """ @@ -40,6 +41,8 @@ def plot_depth_histogram( single_strand: True means we only grab counts from reads from the same strand as the region of interest, False means we always grab both strands within the regions average_within_region: if True, each region will only report a single depth value, averaging across all non-zero depths + quiet: disables progress bars + cores: CPU cores across which to parallelize processing kwargs: other keyword parameters passed through to utils.line_plot Returns: @@ -55,6 +58,7 @@ def plot_depth_histogram( window_size=window_size, single_strand=single_strand, average_within_region=average_within_region, + quiet=quiet, cores=cores, ) @@ -159,7 +163,8 @@ def get_depth_counts( window_size: int, single_strand: bool = False, average_within_region: bool = False, - cores=1, + quiet: bool = False, + cores: int | None = None, ) -> list[np.ndarray]: """ Get the depth counts, ready for plotting. @@ -180,6 +185,8 @@ def get_depth_counts( the region of interest, False means we always grab both strands within the regions regions_5to3prime: True means negative strand regions get flipped, False means no flipping smooth_window: size of the moving window to use for smoothing. If set to None, no smoothing is performed + quiet: disables progress bars + cores: CPU cores across which to parallelize processing Returns: List of depth histogram traces @@ -201,6 +208,7 @@ def get_depth_counts( motif=motif, window_size=window_size, single_strand=single_strand, + quiet=quiet, cores=cores, ) # places where read depth is zero are assumed to not have the motif present - this may not always be true, diff --git a/dimelo/plot_depth_profile.py b/dimelo/plot_depth_profile.py index e4b3327..0e59db1 100644 --- a/dimelo/plot_depth_profile.py +++ b/dimelo/plot_depth_profile.py @@ -15,6 +15,8 @@ def plot_depth_profile( single_strand: bool = False, regions_5to3prime: bool = False, smooth_window: int | None = None, + quiet: bool = False, + cores: int | None = None, **kwargs, ) -> Axes: """ @@ -41,6 +43,8 @@ def plot_depth_profile( the region of interest, False means we always grab both strands within the regions regions_5to3prime: True means negative strand regions get flipped, False means no flipping smooth_window: size of the moving window to use for smoothing. If set to None, no smoothing is performed + quiet: disables progress bars + cores: CPU cores across which to parallelize processing kwargs: other keyword parameters passed through to utils.line_plot Returns: @@ -57,6 +61,8 @@ def plot_depth_profile( single_strand=single_strand, regions_5to3prime=regions_5to3prime, smooth_window=smooth_window, + quiet=quiet, + cores=cores, ) axes = make_depth_profile_plot( @@ -157,6 +163,8 @@ def get_depth_profiles( single_strand: bool = False, regions_5to3prime: bool = False, smooth_window: int | None = None, + quiet: bool = False, + cores: int | None = None, ) -> list[np.ndarray]: """ Get the depth profile traces, ready for plotting. @@ -177,6 +185,8 @@ def get_depth_profiles( the region of interest, False means we always grab both strands within the regions regions_5to3prime: True means negative strand regions get flipped, False means no flipping smooth_window: size of the moving window to use for smoothing. If set to None, no smoothing is performed + quiet: disables progress bars + cores: CPU cores across which to parallelize processing Returns: List of depth profile traces @@ -198,7 +208,8 @@ def get_depth_profiles( window_size=window_size, single_strand=single_strand, regions_5to3prime=regions_5to3prime, - quiet=False, + quiet=quiet, + cores=cores, ) trace = valid_base_counts.astype(float) trace[trace == 0] = np.nan diff --git a/dimelo/plot_enrichment.py b/dimelo/plot_enrichment.py index 74c80d6..b30e8e4 100644 --- a/dimelo/plot_enrichment.py +++ b/dimelo/plot_enrichment.py @@ -12,6 +12,8 @@ def plot_enrichment( sample_names: list[str], window_size: int | None = None, single_strand: bool = False, + quiet: bool = False, + cores: int | None = None, **kwargs, ) -> Axes: """ @@ -31,6 +33,8 @@ def plot_enrichment( window_size: (currently disabled) window around center of region, +-window_size//2 single_strand: True means we only grab counts from reads from the same strand as the region of interest, False means we always grab both strands within the regions + quiet: disables progress bars + cores: CPU cores across which to parallelize processing kwargs: other keyword parameters passed through to utils.bar_plot Returns: @@ -143,6 +147,8 @@ def get_enrichments( motifs: list[str], window_size: int | None = None, single_strand: bool = False, + quiet: bool = False, + cores: int | None = None, ) -> list[float]: """ Get the enrichment values, ready for plotting. @@ -160,6 +166,8 @@ def get_enrichments( window_size: (currently disabled) window around center of region, +-window_size//2 single_strand: True means we only grab counts from reads from the same strand as the region of interest, False means we always grab both strands within the regions + quiet: disables progress bars + cores: CPU cores across which to parallelize processing Returns: List of modified fraction values. @@ -180,6 +188,8 @@ def get_enrichments( motif=motif, window_size=window_size, single_strand=single_strand, + quiet=quiet, + cores=cores, ) case ".fake": n_mod, n_total = load_processed.counts_from_fake( diff --git a/dimelo/plot_enrichment_profile.py b/dimelo/plot_enrichment_profile.py index 8a33cbf..0e339ec 100644 --- a/dimelo/plot_enrichment_profile.py +++ b/dimelo/plot_enrichment_profile.py @@ -15,6 +15,8 @@ def plot_enrichment_profile( single_strand: bool = False, regions_5to3prime: bool = False, smooth_window: int | None = None, + quiet: bool = False, + cores: int | None = None, **kwargs, ) -> Axes: """ @@ -41,6 +43,8 @@ def plot_enrichment_profile( the region of interest, False means we always grab both strands within the regions regions_5to3prime: True means negative strand regions get flipped, False means no flipping smooth_window: size of the moving window to use for smoothing. If set to None, no smoothing is performed + quiet: disables progress bars + cores: CPU cores across which to parallelize processing kwargs: other keyword parameters passed through to utils.line_plot Returns: @@ -157,6 +161,8 @@ def get_enrichment_profiles( single_strand: bool = False, regions_5to3prime: bool = False, smooth_window: int | None = None, + quiet: bool = False, + cores: int | None = None, ) -> list[np.ndarray]: """ Get the enrichment profile traces, ready for plotting. @@ -176,6 +182,8 @@ def get_enrichment_profiles( single_strand: True means we only grab counts from reads from the same strand as the region of interest, False means we always grab both strands within the regions regions_5to3prime: True means negative strand regions get flipped, False means no flipping + quiet: disables progress bars + cores: CPU cores across which to parallelize processing smooth_window: size of the moving window to use for smoothing. If set to None, no smoothing is performed Returns: @@ -199,6 +207,8 @@ def get_enrichment_profiles( window_size=window_size, single_strand=single_strand, regions_5to3prime=regions_5to3prime, + quiet=quiet, + cores=cores, ) ) # Default to nan so we can skip over unfilled values when plotting or doing a rolling average From f1b07586cb818cad0f586f7fbf8b20f7e10c15dd Mon Sep 17 00:00:00 2001 From: Oberon Dixon-Luinenburg Date: Fri, 17 Jan 2025 12:17:15 -0800 Subject: [PATCH 14/23] DM-239 Added test case coverage for 1-4 cores. GitHub jobs for Ubuntu and Macos ostensibly have 4 cores. This should not change any outputs because for extract the test is hardcoded to use 1 core, and that is the only one with any stochasticity in parallelization. --- dimelo/test/cases.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/dimelo/test/cases.py b/dimelo/test/cases.py index 001238c..ee02c90 100644 --- a/dimelo/test/cases.py +++ b/dimelo/test/cases.py @@ -34,6 +34,7 @@ "single_strand": False, "regions_5to3prime": False, "chunk_size": 1_000_000, + "cores": 2, }, # outputs dict function:values {}, # populated in subsequent cells @@ -54,6 +55,7 @@ "single_strand": False, "regions_5to3prime": False, "chunk_size": 100, + "cores": 4, }, # outputs dict function:values {}, # populated in subsequent cells @@ -74,6 +76,7 @@ "single_strand": True, "regions_5to3prime": True, "chunk_size": 10_000, + "cores": 1, }, # outputs dict function:values {}, # populated in subsequent cells @@ -94,6 +97,7 @@ "single_strand": True, "regions_5to3prime": False, "chunk_size": 1000, + "cores": 4, }, # outputs dict function:values {}, # populated in subsequent cells @@ -114,6 +118,7 @@ "single_strand": False, "regions_5to3prime": True, "chunk_size": 100, + "cores": 3, }, # outputs dict function:values {}, # populated in subsequent cells From 0b68892af60eb9fbd5664ece2a04bc15adcb7e5c Mon Sep 17 00:00:00 2001 From: Oberon Dixon-Luinenburg Date: Fri, 17 Jan 2025 12:30:13 -0800 Subject: [PATCH 15/23] DM-239 Added cases.py support for cores=None. Tweaked dimelo_test.py to avoid ever sending the cores arg twice, and added a comment to explain the reason why extract is tested unparallelized, unlike other functions. --- dimelo/test/cases.py | 8 ++++---- dimelo/test/dimelo_test.py | 7 +++++++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/dimelo/test/cases.py b/dimelo/test/cases.py index ee02c90..a269008 100644 --- a/dimelo/test/cases.py +++ b/dimelo/test/cases.py @@ -34,7 +34,7 @@ "single_strand": False, "regions_5to3prime": False, "chunk_size": 1_000_000, - "cores": 2, + "cores": 1, }, # outputs dict function:values {}, # populated in subsequent cells @@ -55,7 +55,7 @@ "single_strand": False, "regions_5to3prime": False, "chunk_size": 100, - "cores": 4, + "cores": 2, }, # outputs dict function:values {}, # populated in subsequent cells @@ -76,7 +76,7 @@ "single_strand": True, "regions_5to3prime": True, "chunk_size": 10_000, - "cores": 1, + "cores": 3, }, # outputs dict function:values {}, # populated in subsequent cells @@ -118,7 +118,7 @@ "single_strand": False, "regions_5to3prime": True, "chunk_size": 100, - "cores": 3, + "cores": None, }, # outputs dict function:values {}, # populated in subsequent cells diff --git a/dimelo/test/dimelo_test.py b/dimelo/test/dimelo_test.py index 787aa83..73310cc 100644 --- a/dimelo/test/dimelo_test.py +++ b/dimelo/test/dimelo_test.py @@ -77,6 +77,13 @@ def test_unit__extract( ): kwargs_extract = filter_kwargs_for_func(dm.parse_bam.extract, kwargs) kwargs_extract["output_directory"] = cls.outDir + # extract can behave non-deterministically in terms of read output order + # if run on multiple cores. This is not an issue for sorted read loads, + # but means the file itself changes even though the meaningful contents don't + # given that parallelization here is purely within modkit anyway, the design + # choice was made to always single-core for extract testing + if "cores" in kwargs_extract: + del kwargs_extract["cores"] extract_h5, regions_processed = dm.parse_bam.extract( **kwargs_extract, ref_genome=cls.reference_genome, From 1da3d3c59d66c8560efd23acc6a126a6153c91f7 Mon Sep 17 00:00:00 2001 From: Oberon Dixon-Luinenburg Date: Fri, 17 Jan 2025 16:27:54 -0800 Subject: [PATCH 16/23] DM-239 Adjusted generate_targets module to properly handle cores argument for extract. Updated test_matrix.pickle by re-running generate_targets. No changes to pileup or extract files, but should pass all tests. --- .../test/data/test_targets/test_matrix.pickle | Bin 3144835 -> 3144822 bytes dimelo/test/generate_targets.py | 3 ++- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/dimelo/test/data/test_targets/test_matrix.pickle b/dimelo/test/data/test_targets/test_matrix.pickle index b40735983ebb5f6b9f70d35e6d15f6ae2a655c08..26328727dd9eb12f24f6cbc126adab6a9818bbc4 100644 GIT binary patch delta 67989 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 Date: Fri, 17 Jan 2025 16:33:08 -0800 Subject: [PATCH 17/23] Ruff format fixes --- dimelo/parse_bam.py | 6 +++--- dimelo/run_modkit.py | 4 ++-- dimelo/test/dimelo_test.py | 12 ++++++------ dimelo/utils.py | 2 +- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/dimelo/parse_bam.py b/dimelo/parse_bam.py index 157ed59..2bb8a64 100644 --- a/dimelo/parse_bam.py +++ b/dimelo/parse_bam.py @@ -531,7 +531,7 @@ def verify_inputs( ) elif correct_bases / total_bases < 0.35: raise ValueError( - f"First {NUM_READS_TO_CHECK} reads have anomalously low alignment quality: only {100*correct_bases/total_bases}% of bases align.\nPlease verify that {input_file.name} is actually aligned to {ref_genome.name}." + f"First {NUM_READS_TO_CHECK} reads have anomalously low alignment quality: only {100 * correct_bases / total_bases}% of bases align.\nPlease verify that {input_file.name} is actually aligned to {ref_genome.name}." ) return @@ -621,7 +621,7 @@ def check_bam_format( print( f""" WARNING: no modified appropriately-coded values found for {missing_bases} in the first {counter} reads. -Do you expect this file to contain these modifications? parse_bam is looking for {motifs} but for {missing_bases} found only found {[f'{base}+{mod_codes}' for base, mod_codes in mod_codes_found_dict.items()]}. +Do you expect this file to contain these modifications? parse_bam is looking for {motifs} but for {missing_bases} found only found {[f"{base}+{mod_codes}" for base, mod_codes in mod_codes_found_dict.items()]}. Consider passing only the motifs and mod codes (e.g. m,h,a) that you expect to be present in your file. You can use modkit adjust-mods --convert [OPTIONS] to update or consolidate mod codes. @@ -956,7 +956,7 @@ def read_by_base_txt_to_hdf5( iterator = tqdm( iterator, total=num_lines, - desc=f"Transferring {num_reads} from {input_txt.name} into {output_h5.name}, new size {old_size+num_reads}", + desc=f"Transferring {num_reads} from {input_txt.name} into {output_h5.name}, new size {old_size + num_reads}", bar_format="{bar}| {desc} {percentage:3.0f}% | {elapsed}<{remaining}", ) diff --git a/dimelo/run_modkit.py b/dimelo/run_modkit.py index aa8e707..298f0e9 100644 --- a/dimelo/run_modkit.py +++ b/dimelo/run_modkit.py @@ -28,8 +28,8 @@ print( f"PATH does not include the conda environment /bin folder. Adding {env_bin_path}." ) - os.environ["PATH"] = f'{env_bin_path}:{os.environ["PATH"]}' - print(f'PATH is now {os.environ["PATH"]}') + os.environ["PATH"] = f"{env_bin_path}:{os.environ['PATH']}" + print(f"PATH is now {os.environ['PATH']}") # Check modkit on first import: does it run; does it have the right version try: diff --git a/dimelo/test/dimelo_test.py b/dimelo/test/dimelo_test.py index 73310cc..d11dae9 100644 --- a/dimelo/test/dimelo_test.py +++ b/dimelo/test/dimelo_test.py @@ -270,9 +270,9 @@ def test_integration__extract_load_plot( assert np.allclose( actual[key], expected[key], atol=1e-5 ), f"""{test_case}: Arrays for {key} are not equal -mismatch at {np.where(value!=actual[key])} -mismatch values expected {value[np.where(value!=actual[key])]} vs actual {actual[key][np.where(value!=actual[key])]} -{value[np.where(value!=actual[key])[0]]} vs {actual[key][np.where(value!=actual[key])[0]]}. +mismatch at {np.where(value != actual[key])} +mismatch values expected {value[np.where(value != actual[key])]} vs actual {actual[key][np.where(value != actual[key])]} +{value[np.where(value != actual[key])[0]]} vs {actual[key][np.where(value != actual[key])[0]]}. """ elif isinstance(value, (str, int, bool)): assert ( @@ -439,9 +439,9 @@ def test_unit__read_vectors_from_hdf5( assert np.allclose( actual[key], expected[key], atol=1e-5 ), f"""{test_case}: Arrays for {key} are not equal -mismatch at {np.where(value!=actual[key])} -mismatch values expected {value[np.where(value!=actual[key])]} vs actual {actual[key][np.where(value!=actual[key])]} -{value[np.where(value!=actual[key])[0]]} vs {actual[key][np.where(value!=actual[key])[0]]}. +mismatch at {np.where(value != actual[key])} +mismatch values expected {value[np.where(value != actual[key])]} vs actual {actual[key][np.where(value != actual[key])]} +{value[np.where(value != actual[key])[0]]} vs {actual[key][np.where(value != actual[key])[0]]}. """ elif isinstance(value, (str, int, bool)): assert ( diff --git a/dimelo/utils.py b/dimelo/utils.py index aa85e55..66ed83d 100644 --- a/dimelo/utils.py +++ b/dimelo/utils.py @@ -84,7 +84,7 @@ def adjust_threshold( if thresh > 1: if not quiet: print( - f"Modification threshold of {thresh} assumed to be for range 0-255. {thresh}/255={thresh/255} will be sent to modkit." + f"Modification threshold of {thresh} assumed to be for range 0-255. {thresh}/255={thresh / 255} will be sent to modkit." ) thresh_scaled = thresh / 255 else: From bd94e785673c52bcea041bf6ef167795db1d1c2a Mon Sep 17 00:00:00 2001 From: Oberon Dixon-Luinenburg Date: Fri, 21 Feb 2025 10:13:41 -0800 Subject: [PATCH 18/23] Fixed small mistakes from merge --- dimelo/export.py | 2 +- dimelo/load_processed.py | 23 ++++++++++++++--------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/dimelo/export.py b/dimelo/export.py index 8ccf34b..e2c973c 100644 --- a/dimelo/export.py +++ b/dimelo/export.py @@ -131,7 +131,7 @@ def pileup_to_bigwig( for row in tqdm( tabix.fetch(contig), desc=f"Writing {contig}.", - total=contig_lines[contig], + total=lines_by_contig[contig], leave=False, ): keep_basemod, genomic_coord, modified_in_row, valid_in_row = ( diff --git a/dimelo/load_processed.py b/dimelo/load_processed.py index 043a3f2..ad4c79b 100644 --- a/dimelo/load_processed.py +++ b/dimelo/load_processed.py @@ -18,6 +18,7 @@ #### Loader wrappers #### ################################################################################################################ + def regions_to_list( function_handle, regions, @@ -79,7 +80,7 @@ def regions_to_list( else 1, # if parallelization is within region **kwargs, ) - + if cores_to_run > 1: # Use executor.map without lambda results = list( tqdm( @@ -88,17 +89,21 @@ def regions_to_list( desc=f"Processing regions in parallel across {cores_to_run}", ) ) - else: - # Single-threaded fallback - results = [ - process_region( - region_string=region, function_handle=function_handle, cores=1, **kwargs - ) - for region in tqdm(region_strings, desc="Processing regions") - ] + else: + # Single-threaded fallback + results = [ + process_region( + region_string=region, + function_handle=function_handle, + cores=1, + **kwargs, + ) + for region in tqdm(region_strings, desc="Processing regions") + ] return results + def process_region(region_string, function_handle, **kwargs): """ process_region simply exists to convert position arguments into keyword arguments to make executor.map work From 4454f675ab6a6c0343b04e43a0f3ccc3bcb22a9e Mon Sep 17 00:00:00 2001 From: Oberon Dixon-Luinenburg Date: Tue, 18 Mar 2025 14:34:39 -0700 Subject: [PATCH 19/23] Added check for chrom in tabixfile. --- dimelo/load_processed.py | 84 ++++++++++++++++++++++------------------ 1 file changed, 46 insertions(+), 38 deletions(-) diff --git a/dimelo/load_processed.py b/dimelo/load_processed.py index 43ebef7..63b9684 100644 --- a/dimelo/load_processed.py +++ b/dimelo/load_processed.py @@ -427,29 +427,34 @@ def pileup_vectors_process_chunk( valid_base_subregion = np.zeros(subregion_end - subregion_start, dtype=int) modified_base_subregion = np.zeros(subregion_end - subregion_start, dtype=int) - for row in source_tabix.fetch(chromosome, max(subregion_start, 0), subregion_end): - ( - keep_basemod, - genomic_coord, - modified_in_row, - valid_in_row, - ) = process_pileup_row( - row=row, - parsed_motif=parsed_motif, - region_strand=strand, - single_strand=single_strand, - ) - if keep_basemod: - if flip_coords: - # We want to flip the coordinates for this region so that it is recorded along the 5 prime to 3 prime direction - # This will enable analyses where the orientation of protein binding / transcriptional dynamics / etc is relevant for our pileup signal - pileup_coord_in_subregion = subregion_end - genomic_coord - 1 - else: - # Normal coordinates are the default. This will be used both for the '+' case and the '.' (no strand specified) case - pileup_coord_in_subregion = genomic_coord - subregion_start - if pileup_coord_in_subregion < (subregion_end - subregion_start): - valid_base_subregion[pileup_coord_in_subregion] += valid_in_row - modified_base_subregion[pileup_coord_in_subregion] += modified_in_row + if chromosome in source_tabix.contigs: + for row in source_tabix.fetch( + chromosome, max(subregion_start, 0), subregion_end + ): + ( + keep_basemod, + genomic_coord, + modified_in_row, + valid_in_row, + ) = process_pileup_row( + row=row, + parsed_motif=parsed_motif, + region_strand=strand, + single_strand=single_strand, + ) + if keep_basemod: + if flip_coords: + # We want to flip the coordinates for this region so that it is recorded along the 5 prime to 3 prime direction + # This will enable analyses where the orientation of protein binding / transcriptional dynamics / etc is relevant for our pileup signal + pileup_coord_in_subregion = subregion_end - genomic_coord - 1 + else: + # Normal coordinates are the default. This will be used both for the '+' case and the '.' (no strand specified) case + pileup_coord_in_subregion = genomic_coord - subregion_start + if pileup_coord_in_subregion < (subregion_end - subregion_start): + valid_base_subregion[pileup_coord_in_subregion] += valid_in_row + modified_base_subregion[pileup_coord_in_subregion] += ( + modified_in_row + ) with lock: valid_base_counts[ @@ -505,21 +510,24 @@ def pileup_counts_process_chunk( valid_base_subregion_counts = 0 modified_base_subregion_counts = 0 - for row in source_tabix.fetch(chromosome, max(subregion_start, 0), subregion_end): - ( - keep_basemod, - _, - modified_in_row, - valid_in_row, - ) = process_pileup_row( - row=row, - parsed_motif=parsed_motif, - region_strand=strand, - single_strand=single_strand, - ) - if keep_basemod: - valid_base_subregion_counts += valid_in_row - modified_base_subregion_counts += modified_in_row + if chromosome in source_tabix.contigs: + for row in source_tabix.fetch( + chromosome, max(subregion_start, 0), subregion_end + ): + ( + keep_basemod, + _, + modified_in_row, + valid_in_row, + ) = process_pileup_row( + row=row, + parsed_motif=parsed_motif, + region_strand=strand, + single_strand=single_strand, + ) + if keep_basemod: + valid_base_subregion_counts += valid_in_row + modified_base_subregion_counts += modified_in_row with lock: valid_base_counts[0] += valid_base_subregion_counts From bfdbff64aeac1b3ab0a41c1a6f2da3e9831fb2f9 Mon Sep 17 00:00:00 2001 From: Oberon Dixon-Luinenburg Date: Sun, 23 Mar 2025 13:30:54 -0700 Subject: [PATCH 20/23] DM-191 Adjustments in response to PR comments from thekugelmeister --- dimelo/load_processed.py | 48 ++++++++++++++++++++++--------- dimelo/plot_depth_histogram.py | 7 ++++- dimelo/plot_depth_profile.py | 2 +- dimelo/plot_enrichment.py | 4 ++- dimelo/plot_enrichment_profile.py | 4 ++- dimelo/run_modkit.py | 3 +- dimelo/utils.py | 7 ++++- 7 files changed, 55 insertions(+), 20 deletions(-) diff --git a/dimelo/load_processed.py b/dimelo/load_processed.py index 63b9684..468f378 100644 --- a/dimelo/load_processed.py +++ b/dimelo/load_processed.py @@ -14,6 +14,14 @@ from . import test_data, utils +# the default chunk size is the number of bp to include per processing chunk in parallelization for loaders. +# 1e6 was empirically determined to be a good default: smaller than 1e5 we see slowdowns due to increased +# parallelization overhead, larger than 1e7 we see slowdowns due to worker utilization decreasing because even +# for whole chromosome processing there aren't always enough chunks to go around. In the 1e5-1e7 range, speed +# on 32 cores is fairly similar, but sitting in the middle of the range should support 10x more cores (beyond +# the reasonable upper bound) and 10x fewer cores (which is about the reasonable lower bound). +DEFAULT_CHUNK_SIZE = 1_000_000 + ################################################################################################################ #### Loader wrappers #### ################################################################################################################ @@ -36,13 +44,16 @@ def regions_to_list( Args: function_handle: the loader function you want to run. - regions: the region specifier + regions: the region specifier. Typically we expect to get many regions for this function, in the form of a list + of strings or bed file paths. regions_to_list will run across all of these one-by-one returning a separate + function return for each independent region. window_size: window around centers of regions, defaults to None quiet: disables progress bars - cores: CPU cores across which to parallelize processing + cores: CPU cores across which to parallelize processing. Default to None, which means all available. parallelize_within_regions: if True, regions will be run sequentially in parallelized chunks. If False, each individual region's chunks will be run sequentially but there will be parallelization across - regions, i.e. each core will be assigned one region at a time by the executor + regions, i.e. each core will be assigned one region at a time by the executor. Set to True if you + are running a small number of very large regions (e.g. one or two chromosomes), otherwise to to False (default). **kwargs: all necessary keyword arguments to pass down to the loader Returns: @@ -72,9 +83,9 @@ def regions_to_list( ) as executor: # Use functools.partial to pre-fill arguments process_partial = partial( - process_region, + apply_loader_function_to_region, function_handle=function_handle, - quiet=quiet or not parallelize_within_regions, # + quiet=quiet or not parallelize_within_regions, cores=cores_to_run if parallelize_within_regions else 1, # if parallelization is within region @@ -85,15 +96,16 @@ def regions_to_list( tqdm( executor.map(process_partial, region_tuples), total=len(region_tuples), - desc=f"Processing regions in parallel across {cores_to_run}", + desc="Loading data", disable=quiet or parallelize_within_regions, + leave=False, ) ) return results -def process_region(region_tuple, function_handle, **kwargs): +def apply_loader_function_to_region(region_tuple, function_handle, **kwargs): """ Helper function for regions_to_list. Takes in the region tuple, creates a string, and runs the loader function. @@ -123,7 +135,7 @@ def pileup_counts_from_bedmethyl( single_strand: bool = False, quiet: bool = False, cores: int | None = None, - chunk_size: int = 1_000_000, + chunk_size: int = DEFAULT_CHUNK_SIZE, ) -> tuple[int, int]: """ User-facing function. @@ -149,7 +161,7 @@ def pileup_counts_from_bedmethyl( single_strand: True means we only grab counts from reads from the same strand as the region of interest, False means we always grab both strands within the regions quiet: disables progress bars - cores: CPU cores across which to parallelize processing + cores: CPU cores across which to parallelize processing. Default to None, which means all available. chunk_size: size of genomic subregions to assign out to each process Returns: @@ -165,6 +177,7 @@ def pileup_counts_from_bedmethyl( cores_to_run = utils.cores_to_run(cores) + # Initialize shared memory as length-one numpy arrays to make it easy to map to buffer in subprocesses shm_valid = shared_memory.SharedMemory( create=True, size=np.dtype(np.int32).itemsize ) @@ -193,7 +206,8 @@ def pileup_counts_from_bedmethyl( concurrent.futures.as_completed(futures), total=len(futures), disable=quiet, - desc=f"Loading genomic chunks, up to {chunk_size/1000}kb per chunk", + desc="Loading data", + leave=False, ): try: future.result() @@ -225,7 +239,7 @@ def pileup_vectors_from_bedmethyl( regions_5to3prime: bool = False, quiet: bool = False, cores: int | None = None, - chunk_size: int = 1_000_000, + chunk_size: int = DEFAULT_CHUNK_SIZE, ) -> tuple[np.ndarray, np.ndarray]: """ User-facing function. @@ -260,7 +274,7 @@ def pileup_vectors_from_bedmethyl( the region of interest, False means we always grab both strands within the regions regions_5to3prime: True means negative strand regions get flipped, False means no flipping quiet: disables progress bars - cores: CPU cores across which to parallelize processing + cores: CPU cores across which to parallelize processing. Default to None, which means all available. chunk_size: size of genomic subregions to assign out to each process Returns: @@ -281,6 +295,7 @@ def pileup_vectors_from_bedmethyl( first_tuple = regions_dict[first_key][0] region_len = first_tuple[1] - first_tuple[0] + # Initialize shared memory as numpy arrays to make it easy to map to buffer in subprocesses shm_valid = shared_memory.SharedMemory( create=True, size=(region_len) * np.dtype(np.int32).itemsize ) @@ -311,7 +326,8 @@ def pileup_vectors_from_bedmethyl( concurrent.futures.as_completed(futures), total=len(futures), disable=quiet, - desc=f"Loading genomic chunks, up to {chunk_size/1000}kb per chunk", + desc="Loading data", + leave=False, ): try: future.result() @@ -351,7 +367,7 @@ def counts_from_fake(*args, **kwargs) -> tuple[int, int]: def vector_from_fake(window_size: int, *args, **kwargs) -> np.ndarray: """ - Tes helper function. + Test helper function. Generates a fake peak trace. Ignores all arguments except window_size. @@ -427,6 +443,8 @@ def pileup_vectors_process_chunk( valid_base_subregion = np.zeros(subregion_end - subregion_start, dtype=int) modified_base_subregion = np.zeros(subregion_end - subregion_start, dtype=int) + # tabix throws and error if the contig is not present + # by the current design, this should be silent if chromosome in source_tabix.contigs: for row in source_tabix.fetch( chromosome, max(subregion_start, 0), subregion_end @@ -510,6 +528,8 @@ def pileup_counts_process_chunk( valid_base_subregion_counts = 0 modified_base_subregion_counts = 0 + # tabix throws and error if the contig is not present + # by the current design, this should be silent if chromosome in source_tabix.contigs: for row in source_tabix.fetch( chromosome, max(subregion_start, 0), subregion_end diff --git a/dimelo/plot_depth_histogram.py b/dimelo/plot_depth_histogram.py index 949b4ec..a2527af 100644 --- a/dimelo/plot_depth_histogram.py +++ b/dimelo/plot_depth_histogram.py @@ -16,6 +16,7 @@ def plot_depth_histogram( average_within_region: bool = False, quiet: bool = False, cores: int | None = None, + parallelize_within_regions: bool = False, **kwargs, ) -> Axes: """ @@ -42,7 +43,11 @@ def plot_depth_histogram( the region of interest, False means we always grab both strands within the regions average_within_region: if True, each region will only report a single depth value, averaging across all non-zero depths quiet: disables progress bars - cores: CPU cores across which to parallelize processing + cores: CPU cores across which to parallelize processing. Default to None, which means all available. + parallelize_within_regions: if True, regions will be run sequentially in parallelized chunks. If False, + each individual region's chunks will be run sequentially but there will be parallelization across + regions, i.e. each core will be assigned one region at a time by the executor. Set to True if you + are running a small number of very large regions (e.g. one or two chromosomes), otherwise to to False (default). kwargs: other keyword parameters passed through to utils.line_plot Returns: diff --git a/dimelo/plot_depth_profile.py b/dimelo/plot_depth_profile.py index 0e59db1..52b8159 100644 --- a/dimelo/plot_depth_profile.py +++ b/dimelo/plot_depth_profile.py @@ -44,7 +44,7 @@ def plot_depth_profile( regions_5to3prime: True means negative strand regions get flipped, False means no flipping smooth_window: size of the moving window to use for smoothing. If set to None, no smoothing is performed quiet: disables progress bars - cores: CPU cores across which to parallelize processing + cores: CPU cores across which to parallelize processing. Default to None, which means all available. kwargs: other keyword parameters passed through to utils.line_plot Returns: diff --git a/dimelo/plot_enrichment.py b/dimelo/plot_enrichment.py index b30e8e4..d747b91 100644 --- a/dimelo/plot_enrichment.py +++ b/dimelo/plot_enrichment.py @@ -34,7 +34,7 @@ def plot_enrichment( single_strand: True means we only grab counts from reads from the same strand as the region of interest, False means we always grab both strands within the regions quiet: disables progress bars - cores: CPU cores across which to parallelize processing + cores: CPU cores across which to parallelize processing. Default to None, which means all available. kwargs: other keyword parameters passed through to utils.bar_plot Returns: @@ -49,6 +49,8 @@ def plot_enrichment( motifs=motifs, window_size=window_size, single_strand=single_strand, + quiet=quiet, + cores=cores, ) axes = make_enrichment_plot( diff --git a/dimelo/plot_enrichment_profile.py b/dimelo/plot_enrichment_profile.py index 0e339ec..97ec461 100644 --- a/dimelo/plot_enrichment_profile.py +++ b/dimelo/plot_enrichment_profile.py @@ -44,7 +44,7 @@ def plot_enrichment_profile( regions_5to3prime: True means negative strand regions get flipped, False means no flipping smooth_window: size of the moving window to use for smoothing. If set to None, no smoothing is performed quiet: disables progress bars - cores: CPU cores across which to parallelize processing + cores: CPU cores across which to parallelize processing. Default to None, which means all available. kwargs: other keyword parameters passed through to utils.line_plot Returns: @@ -61,6 +61,8 @@ def plot_enrichment_profile( single_strand=single_strand, regions_5to3prime=regions_5to3prime, smooth_window=smooth_window, + quiet=quiet, + cores=cores, ) axes = make_enrichment_profile_plot( diff --git a/dimelo/run_modkit.py b/dimelo/run_modkit.py index 298f0e9..c49106c 100644 --- a/dimelo/run_modkit.py +++ b/dimelo/run_modkit.py @@ -36,7 +36,8 @@ result = subprocess.run(["modkit", "--version"], stdout=subprocess.PIPE, text=True) modkit_version = result.stdout if modkit_version.split()[1] == EXPECTED_MODKIT_VERSION: - print(f"modkit found with expected version {EXPECTED_MODKIT_VERSION}") + pass + # print(f"modkit found with expected version {EXPECTED_MODKIT_VERSION}") else: print( f"modkit found with unexpected version {modkit_version.split()[1]}. Versions other than {EXPECTED_MODKIT_VERSION} may exhibit unexpected behavior. It is recommended that you use v{EXPECTED_MODKIT_VERSION}" diff --git a/dimelo/utils.py b/dimelo/utils.py index 29783c1..cfcd399 100644 --- a/dimelo/utils.py +++ b/dimelo/utils.py @@ -100,8 +100,13 @@ def adjust_threshold( def process_chunks_from_regions_dict( regions_dict: dict, - chunk_size: int = 10_000, + chunk_size: int, ): + """ + returns: a list of chunk specifier dictionaries, which contain region and subregion information. The subregion start and end + are always within the region. This information is sufficient for a downstream process to operate on the subregion chunk while + knowing where it lies within the larger region. + """ chunk_list = [] for chromosome, region_list in regions_dict.items(): for start_coord, end_coord, strand in region_list: From 7f5078202854f9376051f88a3ad0a644df8dd98d Mon Sep 17 00:00:00 2001 From: Oberon Dixon-Luinenburg Date: Thu, 29 May 2025 20:03:45 -0400 Subject: [PATCH 21/23] Adjust naming for regions_to_list region-splitting parallelization parameter. --- dimelo/load_processed.py | 12 ++++++------ dimelo/plot_depth_histogram.py | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/dimelo/load_processed.py b/dimelo/load_processed.py index 45f9e9c..62a4556 100644 --- a/dimelo/load_processed.py +++ b/dimelo/load_processed.py @@ -32,7 +32,7 @@ def regions_to_list( window_size: int | None = None, quiet: bool = True, cores: int | None = None, - parallelize_within_regions: bool = False, + split_large_regions: bool = False, **kwargs, ): """ @@ -49,7 +49,7 @@ def regions_to_list( window_size: window around centers of regions, defaults to None quiet: disables progress bars cores: CPU cores across which to parallelize processing. Default to None, which means all available. - parallelize_within_regions: if True, regions will be run sequentially in parallelized chunks. If False, + split_large_regions: if True, regions will be run sequentially in parallelized chunks. If False, each individual region's chunks will be run sequentially but there will be parallelization across regions, i.e. each core will be assigned one region at a time by the executor. Set to True if you are running a small number of very large regions (e.g. one or two chromosomes), otherwise to to False (default). @@ -78,15 +78,15 @@ def regions_to_list( # (2) the cores_to_run will be allocated to within-region parallelization, and the top-level # jobs sequence is run sequentially with concurrent.futures.ProcessPoolExecutor( - max_workers=1 if parallelize_within_regions else cores_to_run + max_workers=1 if split_large_regions else cores_to_run ) as executor: # Use functools.partial to pre-fill arguments process_partial = partial( apply_loader_function_to_region, function_handle=function_handle, - quiet=quiet or not parallelize_within_regions, + quiet=quiet or not split_large_regions, cores=cores_to_run - if parallelize_within_regions + if split_large_regions else 1, # if parallelization is within region **kwargs, ) @@ -95,7 +95,7 @@ def regions_to_list( executor.map(process_partial, region_strings), total=len(region_strings), desc="Loading data", - disable=quiet or parallelize_within_regions, + disable=quiet or split_large_regions, leave=False, ) ) diff --git a/dimelo/plot_depth_histogram.py b/dimelo/plot_depth_histogram.py index b09017d..95b1f09 100644 --- a/dimelo/plot_depth_histogram.py +++ b/dimelo/plot_depth_histogram.py @@ -16,7 +16,7 @@ def plot_depth_histogram( one_depth_per_region: bool = False, quiet: bool = False, cores: int | None = None, - parallelize_within_regions: bool = False, + split_large_regions: bool = False, **kwargs, ) -> Axes: """ @@ -40,7 +40,7 @@ def plot_depth_histogram( depths will be reported separately for all nonzero count positions in each region for a more granular view of depth distribution. quiet: disables progress bars cores: CPU cores across which to parallelize processing. Default to None, which means all available. - parallelize_within_regions: if True, regions will be run sequentially in parallelized chunks. If False, + split_large_regions: if True, regions will be run sequentially in parallelized chunks. If False, each individual region's chunks will be run sequentially but there will be parallelization across regions, i.e. each core will be assigned one region at a time by the executor. Set to True if you are running a small number of very large regions (e.g. one or two chromosomes), otherwise to to False (default). From 3ce0e8f546791c1762c14def39d1b3f107a5aad8 Mon Sep 17 00:00:00 2001 From: Jeremy Marcus Date: Fri, 30 May 2025 21:30:34 -0700 Subject: [PATCH 22/23] attempting to fix ruff versioning --- .github/workflows/formatting.yml | 4 ++-- .pre-commit-config.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/formatting.yml b/.github/workflows/formatting.yml index 5edc917..32d34ba 100644 --- a/.github/workflows/formatting.yml +++ b/.github/workflows/formatting.yml @@ -5,12 +5,12 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: chartboost/ruff-action@v1 + - uses: chartboost/ruff-action@v3 # TODO: Is it really necessary for these to be separate jobs? This seems redundant. ruff-format-check: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: chartboost/ruff-action@v1 + - uses: chartboost/ruff-action@v3 with: args: 'format --check' diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 5194a15..3a33fe9 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,6 @@ repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.6.8 + rev: v0.11.12 hooks: # Run the linter. - id: ruff From 2972c3496d4f35b95983dd2d4b5332b8078f5df9 Mon Sep 17 00:00:00 2001 From: Jeremy Marcus Date: Fri, 30 May 2025 21:33:20 -0700 Subject: [PATCH 23/23] ruff version fix attempt 2 --- .github/workflows/formatting.yml | 7 +++++-- .pre-commit-config.yaml | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/formatting.yml b/.github/workflows/formatting.yml index 32d34ba..5cac669 100644 --- a/.github/workflows/formatting.yml +++ b/.github/workflows/formatting.yml @@ -5,12 +5,15 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: chartboost/ruff-action@v3 + - uses: chartboost/ruff-action@v1 + with: + version: 0.6.8 # TODO: Is it really necessary for these to be separate jobs? This seems redundant. ruff-format-check: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: chartboost/ruff-action@v3 + - uses: chartboost/ruff-action@v1 with: + version: 0.6.8 args: 'format --check' diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3a33fe9..5194a15 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,6 @@ repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.11.12 + rev: v0.6.8 hooks: # Run the linter. - id: ruff