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/21] 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/21] 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/21] 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/21] 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/21] 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 zcmeHQO{`s4bTFG`L1eR*JR@J6S2bD#OWhAPHlmP*%R_>r;&_M?a? zdtcN_ogm#v@8q1b_g+8W`qtX}oPFN&kAM1|jj#UfI~#ZH-SyRveDkhEgQ&9zV8tYWMI5 zH(ppgzkB#A@BPLzpTBx~{=oe3d%k#ee&qE0E%Ud||7QMczkl_^SAVO&xw!K1k$dk& z<3lSNFJ1b~Vf@^UpV9uM&%FNM{%PaS7w6x9 zQ78`>cG?QSdEB)sj7+L;E!X!TEK2vAv z!Ad7}@^QP3HX)6HJX?yZ3M4yg=o2<{D`_!HA+)NgkBg|)BvRJ2rvjg*)B{S9v@8n9 zBoRtwB^%6`M!^8GY9${cG)prAv}uAs-b1`49levUo_S>*<$76t7G)J(Cw2gnbf63p ztDShzN^qtPTciGO+Sqx+BNA2m&jwbE<(75LtbVK+(>T~#qqGU*cHK^9b8t8A|dh(gO zpHF@=Hdm})=?{l*9A4otyLqu&bcy}A38|qlg)#*l_25vZsGy&W7&1>K*i(arb}&CP zEt{ppMY(wE=w%Ohw<_YaOH65Y>8E3Rq55K#9gz9sE11JMxKgdEK4 zMX<^lYg+J|#+6;0uDeP@Wpm|KWphUZEg%Zwz8^f})HKT=NG*kQp+q5wRhGs0Y{Qn) z7#^qwRzqal-5sj;`<16b@iXUEV3LCEu(0f2Ck@4y z-JE6^oSG%WNso&|NaN)Jl;tc-%RJ9<-1vv#Ae5_hLw(;98 zgyTEiK2+tQ@`olXf95t;$=0lct#cS~)Tvms!w9go4cMkhnYgFrMl5U4IUgYgDEo|V z+PY-eF2*zqK_XY~H=;Pnw76uLYFW}|RK>NH6ph`4N_Y|BtW6M?a8+*FP*S2yqJ|(% ztPTu#cS6-%<)7fCkRb7@+Ip&q1*KDCZ%H#9lsys5WD`AcznTFItt?TGF!)?kk-{Q@A7WICWo6$|Ma zwLNA87O`_qaWvx6`kGAi$Ti;C?7*%X6v+t%mh7%dxM_Vwd-Mu4EmY zkwx7wC^wa~r4DkSoquTn);|{-1G)-C4-|nSZzv z5YPaQyqYF@Y|z_+=*%u!cTm(IHRP?oTJhATXGE*>vD7k#r1K=gjU|GJ0`Ig$<5`W0 zD68M5V_C(>hgI@r z;6Yr16QZxjvUO)RG`--hApdXg(b-jFKUD&V7*|DaN?a0~C`gp9?q!HlS@G{ghQwOTR~X0A#@ zqCvSSNvjJ+%r%=3T2u7|_A(L*8yo1&froHn~@+F{QTz7^Mq0BKTf_7Bk9Y-m7E}j>N*z zwh+Y!PPPD$?kNDg#AMmcjzEmhnY_;)2Rb$L5H~5Lr}UOy1M3i;&&dky@$R{la*885 zSI+Ij##w%+&@8qY--r|g$~YAIG2bLzASpTbSi{kQ{>-I*hSrN8nixDFQaeds23;jW z;Dg&rJaV4aZQH#J&r^vBA$PjCbIb)s%+3h5BQE@|q!V-o=S(+WYXr_-$SSokiWppTLbGl}{2ur5M7J8if{(bzjXz=~t+;8edv*X= zYM9w28e3D}yYH^~zXw=Tx(d2q0i^gu}>T4gs`fYF%1OlfMj;T-M{c7j}C(h$x-1;e`8S z!cA9jSq0I;+*qd%W*U&7i;tDFvIe*QIzNG7Xkn@x0Yp5L1_)Av*AEP3Wfh2}S>7dz8{Omkc1m z5GO8Y8$mTAIYP;h;#r2zYgw>$o|p<^gs4|Y8zvSKS>v(F%ZSOe0Zom5tDl4P@Zwb{ zUjD&3@+UPbmC4Pn#5&(yWO+@a!w?}%N)utsH=i*3w?(sCN5Ac7iY9S|a|OE2M(%ZB zO2TbsKaWJhi3TmQ-3zx7IQJ>4#;Piz7Sj8bVz6WN4o$_AjusZxP*o*pFisn(jRBoC z3=klLCs}tCF+$B1GISO)@{*B?Dnd1{5&SOg?lzl9zV;0_fonGE$WF9Q7TYd?!G;SEOA=Ky#5PH~g)|!!2hEnJP58h)-0OGV%J1@wp()_%vgnsd;K{#PdrJ-! zrvhO5Ha5wfP(?YMw$S+q(>9P24ejJeXPR6}d4gG6d|e(Vb-s{km$%wCj~q0JJ_Ap9 z!m-F0+hh(4wP5LH=~HSovWCHMI}MIAe;QE{)ZVJme7kU?GznCgnX|87RURC7L@jBf&-`(hig#+ zSiYuaP0^fAT=9Ed1M-9xn(18}&-kt%fg13?`Yq2$^F|6=gUh!~xtFQoGNj~n(R;Ls zD1%Y4i2$#f%c)!88Rs%};1x;N-Nxa5d>fgIFsX2!&?e0R_>peUYjw0!RQG^bybRPvU^dexGto4{Pu`?bB!IoVLSDan()-Vs{HRr{+chkDOYzGRc zc^ewrflM@%jhw;3Z z`CL2>DZs%hOX)RjaOerY6(EhRTlsR@F5%=7glym;IHvcl07Jpq&0(2>+Pgpx@K!Q8 zAbW6GET24F>b7HYr@=MWxvVTzaZ=8CH@qNiaG=C4u+7R9S_l<`s)bBRiCk$nEJJc* zTn+Fv(;L=_myiPryC_^^8SDlGGdWOWoDdjc?UGs6IG!rPSUvGAH*oQXAoh<$p&|mS z0EmWeysaZcd{Z}Q0LH(@wrz}JQP>grjANMsE`-i17W7lTn-}Q8l~hxD!swA8kX!-ttx;QyS_y3hn3_vMu^;-pV9D|X%U$m1rcbv_(LWRxLLC>#lEFI^9?^sY!j?rQ z4UynN0;7>yFxA9~tU`!|B#qHo`^QB^f)lhb>@VX zA4vtyXHT0n97Ct3nAybx4Ft-q(V7cV1%y0iJ?a^6>_O{Fj#eLCKaWl1?%ah$eIx|! zgMB!m>Jk7cGndz(j|VWYE|*0()0BrZWdc1ZaX3qIlF}0!-!9WKz{CX)sxNyFa+vWh z(j(}|s}|zEu=yeq7%+Uq8_27F6@zV$%Rob?rYH#LB!EE-d1BPeL>1LWc1i3{XWjpS z-D}okFt2-U!j}+jHR6PlsBvLNS7>%j8#Xi10miCZQ-4C4n=DF*861yLfLXSh>NN4`mHlp>Kk=I-+lPVTQ2?Nq2u^D zfuH;Ea}q!A#Lv6%^DFy5dFb6QUf=kp{h6}AT|E7xcOO3T$-jfLKl$}5$L`sG;l+1; zfBo0V)(ET-SR=4TV2!{Ufi(ha1l9j9JE^oPMKZ%yrrV4g9ATRfN ziGy{i%^nWG_7pcdfCWFM;C6ulQsR8yUK>q&O+z6d!Q2`Z3LMYyg`?wsZ-RRnxdHWY z)4y$plhiOUlYWIhZm$k@I!2Biw>!%87=i6V`-6)?6{_B9Jc)f+hFcp~2ZS4+?j}YM z>QdUxnC3T>^Y+S5CIXihYu+pS>syKgzpnu0mPx;~XW4$SQyZz+jQV+??R%cE_&H;- z@6q9E`2(q>RDjEHIO7N3ZtO$BcbLw()x-_0W>?th9Z>8v6e;`%ln1lF;zaRyDjZ}m z$Y%_SK!YU4Dgs)Y=9vqL2lu1o4^ZpkQC;)b%AfgKQe+|bm)3h#STzC zKFB834Y~#CSVF@pV&;=g#+q`TI zpYFF`(H%F@>M}L5qXdWoBbQ`+)&EwRDQ$>q$_^%K5X?EOWPR|>#h#jQBZbp#kD3)Ur zKeI#OL~S?i9@ClGBzIf$mUi;xPW>UE`orh^IuQCzB!fCgtuib%^nW|@$;iH<;k1#& zX(jT52J^6_vHQG%b13`K;~IuD!NZ1@wD5pJC*})B5F@WktVS`EJ@Wo%y}uxGwxK&0 z3DZ`cBD9^c%85paM)^bu7SKK%WNyVPM=eDoKN9h54c44Wh2{M?@68-*@N7vQrU*tC zUKk=3-I|rzMXq18ZkjH`>^8F-vRXfitGNM^>T&v+eb}fI~ldYY~0Kf zTw=;l()*>xpOASU?;&{g^)rd^vI!>&G_h8}Bn-Pmr81zB=#)fv0PoqX5yD8;@Y_$y z5T~I_sZ=#9MS5r}A0z|}GNQ2C;E+z&eP~$fOApo8C*I~$YrCH_jbP=yt~_~|JXI10 z$ZfIVCG`)+BS4=n_~A``88j;X5z!zQ?wiwGRnR#Xt~?`}yW)BLVtJn#`eKn|<@#gE zBZj1*Wcan0ab)Af27q%}=W(_tAjPa<=V0lk_3Q2}J@*oJHBK@g@on=c~Rf)Uu`hCBk~hsL}=#4$bgFr7= zQjBS=3$%WyIAbgkqAlWPWoLN#sOcbmpSQDlR>hfJwtAa9$|7Hocp~a8+|Qb?q_6a*Oxzx}_ zSo+yO2V$6ow1O6yq%s0gfLl?=nWPv`-BJ9+?xLi&2)XMn{k-2sBr$V9f)l@JedFVXew9Z~EG88`ikQ`4Dt(}$qyV>v60QOAYB2J14KxN!7Bx0lNx2-cl`G0Si zW{@f%)OOB6R%jXW;Ej}pdt%VdG!LMd%dFl}3b_7(iX;OFawSJFNMV2ql;<>1&3C~_ zl}xeBL;n~tm=CA}^6e7C91Nr4y;j?1IiH`yZ z41q4<(lfbN1fQg}GaEsWF4);D8-g<#cOoEs&-kbcNLZ22neZ{GRC7+o*d2|UDlBTP zSu4OAK^~MILL+lH3$&3g&O|KHn)XmSZEvPEF^V9!u7u6@uUTWe3>`;i7)c?+ty0YE~l{- zU!P3-h>X+NQPnsIaoujG46DMp6`n@R@NaNFq>coAzl*Cukf{C9~pPBTKlUpqEg3|UHcT5K)D2z7Z44u8&u&g?)U@1@ssKkGo41nzhm4~QZ0*GRD z&iMvRqqSb6BQpYnW<9DmOg`f*RVPmM74~GY-VF~zUv`wyVQNq_>BYDVMj-hv_4zS& zx>i4*;nPs3riBr6Hglk-+fO5Czu9QzzHO&jI#k(>?t|S-n9{1ja(-y^=p2f zr%>kBWw$s4+|E|iOexX|G%kJK>#OlBhfSlvJmp4(;Jvu-5oExloIt`bnGlpa-E|oYp8}aeJcWkXM zHw}@@qsBi(y%vI$#{Ac{4|(BR<(eC&SuE5Eez+8PpbBjqQ9fChLR%E#V>a z6IP3gVI~!dyxjugfg~l(hIcJ_R}p$t9(R2!wt@&&NL;gKQp_SNl7+HeR4%g%k0xYM z5t}>)xri)CQ^9Lpp;2tDmkT53kaR!N@V8So^}pZnU;pvIiH-kUeD}fQ$Bw-4fzf|| p@Hbxk+2g;r_~C=cj~~PJ9roYte|Yrj#j78_`ph#IuRe3;e*h9^aC86w 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/21] 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 zcma&u2h`tHwdV2AyYwy^dJj!HLTI8iX;MTC2?-<^5=?@C$VHK=5l~*SA}R`s*b5+v zz4wk_x!8NT_C8U*pF3-vHCb!!S~Jh=eRg^FKKq>C`M>1OvzLGIoaH9{=YKAp*lzK< z=gm52`rP?5=g*sV{;cUwTR3gEeRrMs_rj`k=AD1RqG@N(nLBG@@oF>YoHuLk{3(lO zEnGCQc=Z!z&7Hnz&NF5mH+|9Ui5n-jf6m0>mCj%C|DHQ%#>C=Pj+?)5&P6RPUUB{f zi zV)62a9*c(n`X%$qs?!f6ZVJag8>G1siSc%_B&7c81Kg++4~E$RJ| zZmh9z&b)Kx&RXKXVEVk76W1 zX0N*>zr~I4Jzx%%A|D5y8iADczeO+L=evzk~zhM4ZvlcFV*!p49tCsBYtc#X# zIBU_EV3U8Bv~bE<^Us?xXWp!t(`HOxxMZW3XlC#E|4K7^um9v;67Z1^Gn;nS{0rtS zS~%_O1@q6FwuIh!vlh+1c<#UFaP}5Q{{1t{PCD{^cl~tIRTHzfJo1JImYHyOl@qg%UcAE0MHinx z>)$@h&e><;+G`$OUT*O+2TUA$?6F7wYsvro=l?ot(xQnO*BijhjS8KF+CJ#ne_aYO|~x23hCDg=|}rjTVEQlHCo4GwPb$Q#b0;G$KE>L^vh?D zKOEQP!;>uDdd1-f^#OnULdF{lt&-P z)}eT0{h}8iA9=|7!fsrr7hga0M;>*r74K1RKFztjkiYyRIzRd#{#XYY>a%$CWck^N zi;r`lE_H|l`H73CzKwa*!=9Zu`n-PqB;z&unG^mSaG!O>5D@sSU@Kk?)*59F^-`zQ{XKfc!aTgP9#5uGc2vw!A5 z+%X<|`S8+5dUeSwAKs(Ae2|?w#yq2Jf8@hk9K6|yizmJOWO>+=t+Q8;eRhud=?i;# z@uX*mH#>3V#Y0`}#TjLGc(KDvdHJz(-uPSR&yH+e z{p!^RdDuIz_(SVsUiEYhPLdz8=Pw^#WOGYDo=17uyD!z_9#*Hk?D^xNE_!_z7k|9u z!B1TKVO?H4*oiMcJNeBQdwR%T9w;8f2TyjRp1pesUwS^r@B<--gypo@0Enb#*{-7J-z(m(UaY0>ci7HWv?IduqVq4<+U!Kb^c>Lqy0D^`ZvZAkH6nb z>cF4O4llB}@{a4`;7!I0(%U!j^aaW{##@@KPKckn?AOwGct5Fkj6*gDc(NaPv4i;F zG2&P+8DIB{`$9hJ_H~Rq@+PyxpNyw{f#bUR@f1gVb&u=furm)(es=Pk7j=*8@`%eG zPkh8@KgMIPo{^Wh@{`$<`MJO3wT_Sckexc@!FP-|u9M}#3m>vN*~`aIKJ$f_-=+9k z7nk075+9mh_TpOSkI%@HJR*B>Av<{>Jv;Zky77eO&^kZ(|I1$-exqzIAina_^B>no zy}s~Q_sEx@b#dim&u)yX4s&LX#Nj8N`wB1nF28uHysJN{(ocj!2e?o;zCK0RLI zh(Ge9XD^>P`k{Z$uYC04(5sJLUMP?F`iqA=;;{2hR`-bbK=H(p$9Gj+`-(q1@%f9# zZj%Oq9p380L*3?XjAx(l(KmW=#AOHNH(&hRcVu&fzdGepAK5y4dhyh&fBeb(>D^QM zuP$+*eEI~{XPv$Hke$A>GuQmZRge9_pFLzRu6{uCDW3fqdD$;<@ncWMQ$GFDS9Ovh zp8UuB_{uLYf5@M`{9}Fm)z8oTS;tp>*2lQ|gExP?=tmhZb&>5WKeD{~t8eV^P>=J+ z4}baS#lcVi_KXO!vjQ5V_0zz$l+ zYpj3N<2Uw)oxaLPmPdSX>f=Yoi@$Y#=D<4MBQJUR>k~im@S>NWzjeq?Jaa+Dhn+a~O`W5?yyB^ozx>w4 zcMsFcFCOI2j|}w>zcHTu#z$ZI%jAJlj2W53Cxy?js}vO4tb zQT@J9mw49ADL*oFzRd?-@-0oTE^*n*uYO3ce`9`epm_MGN1SmU_(6TMZ}j}#8)WwM z>a#ANdtV*wMxJEr{MAKo&g2!>ewtJ9@U*TzXddvUmtS7}un+9@86WvZe?09kSseb} zPxAQwT345P$nxR~<KtBA$uqf znVop*(_ej8Cmi=*etP`HA=@8z?gug+^58?}FQ0Y({=2QZ*g^Y9mXEA2WckE5kLsdV zAD)|auj==v$=2!dkq5FH`Qc?Q=%1>V|~`~7l)nok&k%R<>iMj z{>}@%dij&BkNYP+JN2`pUm7oZJn(cs(BtF0m=pH+=?5PAM&^%~K9EOy{2)H;@iK4p zWPa`~eZfOMe)#Z%>SM=$?7uvto%->TM_lp9{2{$K>aea4?8Kv&m!G=uwcqNojwd}? z9P!!9ix*j+A)ex~mxnCAbEpn+%%3FuX}k)gh_ zSBE(GjOT$LJO7>)4}Ri8yv38xJmWx6Yq_^tY~0{G1cA-wWnNKk$+t^0N-{ z#RKwVH}WN07l)rX^!5P{{?^&^cfRz4KRf%$&it{HXY8Z7WG6m5^Fgn#P=4$3h^rs? zLF;7x_75L<*yF`sK7HfIPCR|V*F6XIAMz8Qo@`(6SEqHn-4oV*5BP6B+>iK7PA{JN z#8p3g_cc3w<)w%6i_h+n+2Mz; z{U=-JFW-pxu;V9>yrZ3c8U4i9SKmo8dwmoiZ~pZ9&)+)PeV~ul@e|iNKd9gGK>q3` zv)3Qz4`2HL#e?ENyv#pd_CY>*tm~ui1)05g5I^;Zj~5>L1=TUG>$CntJjVNgEI*#= zG4JZcOFa4T#>YO0Gs^7LV_o0y5LX;L>=PXA*o(tY9(ppwi_8w{le!_jy!`c7e(U_$ zks-Z4>$`m?<4gAMmgq-&{Z@~4_oa3H6bIs`Uj3I}TWlqj58bC@e0l7@`h0KkH7DxSNAcvxhre}t`NSR9_0>L-@#BYw zdfBU&AA5Z!izh#1rw>pb{$za_?bL~v`pNc#Y#pyr#*3cp9N+<+Gx6|dFOIs+m3`Dd z>!ZCq`oLa%am)#Sb?cA#qn&v4@`$f*>Jy)zIbcWTuU_`{4F{_4B_S!cg>?{Im= zgX&PXxZ^ochrX(Zy?FHI7|K7^J@%jf$jcnbqfYgUkN2ain;)Ly%S*4Vy5*%;uX*5SKiGS>$fK|F(L=n%5f_ei@UxDOIP&nr-#qfO|Kj1VU*giU6Bp_~ zS$^^56NeqNu219<)n}f>$CHc?d%u^&(+~O8YaLJZipNhp@%42?>--@-#Dgq9SzqvB zZ(j6U9r~e9;@~e1J9S%^UmpHrefps9`0x|Qc@ke@54_#`S4(`A7uXOP?x&R%_yta zcW<0${bPrR{Nh^o?=7s`Z*?rKALd>}h!149&9E*W#Cvjf+lE_(@|ZvM;D@()({z)K!}Wc8`TI)8l-pC1`NJgnpIoQSJ_y!eSn7RS9J-guvx z8}a1RM{%u-kB>PJ$2*X}`ox7JFLC+vV<(gZd$^ zJovN2Pd<6XHIL@g9F6DWfX>U*(7HL>K0RL0`SG20{?uvRoU(JS?XN!ZbDvq?q5M0C zJB9M?lZ>Z(WzY0GhU$V-(w`je8{*@h-aY-nq4;|wKQ4SsxPOT6;mIe2hlTv)KR*5A z!y`g|hbFUEH@$k{W3xX!oEjby?iKDGs_WR~sUeLI5pHS`SoA@^5~2D56T~(Ba``ydro@iL>_&y@A_aq&5ycg7w5##{))@b zeBeoDhoAk!+nnk5G37Bo>M^(CADG=Pp}ORyXJ_ur%hdejGsn&i-kWFV9wMt-U!8aP z?H_w_-4Bl(;yUl{LGisW#GyCGaO{u19$lU%h59!w*?yX1^EJx!>NP+5YEJcmp1t`I z$9YU0!k*pct#1{Q z`E8M2oz9DS$CtnT;kQTr&XIHOd~DJ>KH{vA-gj6&=X0IbHwZTjolCgsV7E~+^j=dp zS^aSJ{8k>&ycyjphRSzkZBxcZ47-t6&{U)}WL zjc6U;70auB`^ydweDSj`KRZ12-~O}L2l4O_M;-j}XOG|Hcw5JRj4vXZKAix0iJ#fR+GH|81ZWaquTd;P?BMDgVx*WD}Xu`hVA zXQ!?y<#pd#$4lMfxHt40st-SNVqevZm$>}M;<2~StHx7)a|X??d4T-M;_`#?;%gp8 ze=_9no^uXYi7#I4^o0!ZQzt&|-7((s#b+SHGl9?pq59_t(TRh{MlANRVt?Z15N z_=zJvSsZ?3_lNk_^;LiLLA^_}SHF7k9q$Q!cD^UKU(SzuoHupsn4P-CC#%~WL42&M zhrjOw86Wxav@V{!>e)Vi{LO)TRvqdSk3D|SKB+^0`jr&kk?#%olroz)L><{LHQR<`Hl5*avak2j*a$YxQi`e)1dn^M~pov&R=7 z^~!4A+EU-kDb1$gWbrB{TPot){CG0;}7}aW8dYs z?)!%)e|1A~_~8%LXW!)!m%n)SlRa5I^yW&Qk)OEw!ye-09Jo*HpYM`<*5%``9{Kr^ zeLwMm=1t%5kYC;M;=xW{{`|}%J3QcMCyzM#B`==l1P}SGk9{GlA20FsNnH1p`0Vje z51x3B>*CRihp+tn@r3rrI(bC)cc2pZFth`#kE&>au_1{&*j-lg~cTjGgS$)G}j50yrFwj z{E^?t8y`HxCEG_ltdsRszr>Swtjj)$t3T@VdjNm&$@r7;(KmVVP>21tzw~hA;~o%4 z9r*LJPtKD(>JgWoEDqlE{OILpZ(ZHi?FT;m)yr<|r?~2MF4e2w{OuQ{7l(|e{jjh4 zU|k(}Th~u@m@l&avm5z{2gPOQp0sYB^idt+kA1UW{MFB1T_ay{AbQ)as`%i}S>Ve|mEgt^PD?7Z^p)dAHTzU0N{q~K_US2%aiwAo$ zJKrbv>R{*Gd9UGvFFx)O_2Ms{x}9(SP<(wNi-$kn<6PjY59WctenbBHr+z#kJG{u| zOFns=Lw(|hH=goYHwUB44o`j64}SDyJnYZ-9idkzKX&x`2-Qhuryt_tXTRC0hs<6d zt&{c5J)^Jw&dA@KsY71#rGHQz@`$Vd?5vYVe)$7!wXwJxxAHGn3 zAYSa9Yxd&VPkkEuYM-o&uRrXqt4DtQke446k3GG9@iSlccbiEM{|`U;)eEhwQ+)NC zfBs`W{^oG3NB#Jz$Nj^f-noGE_=+#CIS>y&^G=5J_Cdes#aA~w{l-^+@EGHp3+E3{ zecZbJQP)<<;;P$z$cvwNBR~6y50pn;>ah;}9ZOz(*sE8+@YF~AoPU1$pbqiXfuDB( zKl!YS>wY(P;;2La&?Gsra)QOM!eV54W#aD;A^+}y$e(UyEUU9`Ei-Whk z<2ru$%cJk?<%RV8@#QZs9{kAWl5E`^S=S%&#=7yq-?=dtc$o|S@`|f}?8Q|dUi_@{ zH*e~|M_e+0b%`sEb^8VR>#zLgOr9|gKlWsEEFb>rm1oR9o+EbZkzb$5^2n=C*7?(m zix>31!ppr$#$P^jpilN!JofDP;W@6mXXv-t;!{auk$aS``SM7m*4weO%NXxm8-{||fpkx%{RUViUW{KU2Y(7OG_8_FvmzWPFM zF6@iC@fr8e+~BW2W1sPp54soi$9a%nTzymrSsd~8)jr_M&VJ*mU;Ok-f7I_@VUHKP zF%LU^V7Iiq;;F-as6$`W56w5kV~6HVUiT+Hc-TLG|FX~K%KVvkeX?)*Dvx~;M_l=! zy4Z_jf6O7??92&&eb6s+V;}9Gc0!9s4PdzKI9%Q4hVo;G^H{ z^%EcS$PX{?BJ-zT`eMHDmXBV4#912R1I>}T#I+A&Kc>__^{ZDs=EfZAzkZlEvcAi= zUGd5Ci%&ivJMr~l$MpJP?!}W&-<>ygi-V^)V?FZHkN)~L=&OK!A#N{V1GzaP%W%cO0zRJ&!oqeX)Uval@fBECBulk|y`X(%PnCbne^}$CS^!vD+oR`1;{~!q+@Q{`l*wxi#PFG#~onUY%V2$AseVl+2%=Y~4BD zIeW6Y^=0qY)j2sCU;g{1SJz(2dxram&YOCkkX{}7zgzmph4x|hLC;TJN4GA&eE90e z;o0GLRPsq7UZ*A>8O{#XLw`hi^QC|KZhr7QD0}%In|w&f?)YSLeM0gn;jHl3P#yZh z&ibL*>CcJD>K*&CPwV=xj)T)r3-#B&u{Rg`bXfM}Gm>Y77l-yipY`RU*2O<9Ss(Nj z>eq4E?H4{i)c2{$_5)9T_IG-Aj}Gnk9?AAi|DTxN-0Gh>U#0ccLw#8-`ONU_aMeMt zp7qj`oiF^>Z{0m>zqU^AKEoS7=f%G6kiGtyn`fmzFm!J0CqMT3YoE;B=|g<;NxyUJ z?uC<+#haJReqpk6B%Zl2M`vYc?#vs${d1npwK>%n^N*jr^jnorzo#Z!SI@fXeb1dc{c*lF&Tg~NyGQ@=+@y8; zqrdWs>pN~gH(E+u`K`Mj%mx2ZmRCO?S^RavEkbpP<9<`$n%S)tiuZ_QcKWtndVRv5 zjF)`kk=cuDf7B20#E+~#eAKsMy!4NszSuYU6n9&ydL{gY?c>ND5slE=RAgXTnD_4{tpyGNk9^ao$( zot^!{TOIl@j{d7h-BA279-ihE%0GFS6ZNUvK9lv0pK}3sDW3RaU)3}2=UA6|)GaUm z`lJ8)V1DTBqrO@f7Y}?_iNCt>;3uwgx_0*Zqdq*XLp;RcNADauKVV`B%63r56tmeORfy^!lj3_QAS%>XHYJ`SnMA{N)iBKm8Dgo?q&I% zL-zD=oEyCC7e4B6|M}k7Z~WZ@c=LCEh_CVsH{^rU4*k66cLqEv+&0ZXO@#Mvy zoqeD;f8xte&rf~w&_nk2O~3GwZ<+R69Ch#?<2euPtcy4HQ{CdJ*L*;A+9&%q#?=>k z^~s|z?8xHL;~}s5<<~F%W4-*vQy+W0#K#Znll@??E`4R^ys$IBc#A8)dgT`vU-9u4 zPaJ;s2ikvmolExmLQhtQ{^CI|ueki!;VHj-qo02IzVq`v;3toJR)6%ty7>I?)n9(z z749Lt#Sz!~*njqTvX@8QWc?v~XX2x7yv4@{5A`h9Js__>@;CqN@h4k{;^U)_^2^6x z9{YwbG&k}(2jW5T*x@0+eu=A(?9I9J&ksNLkiGqvU;o+RFTeAlU;NbJ-6g(y*^PYh z)Ngk7(Z2c~v%_cPsc-6bugIf+;*;@WPcOc_;)qYS|Mcwfv@i7P(r@|Mi=)rhp*VQ5 zmq#4$9`@|SrHAT=c*={fy6NSUU*F8vcn_El=U+ba=KbmWfronrfBx3JbIhH%_~5Nx z{`l}`hqrk2`e5$m5m!F-=!YWDxN;`$H%_3`JoY~MY6AbWipQ6BvC+kDES-chzM`YDdQ`pFJ2^^AJ+Baiy<;s@EOL%-!0 z4-avmePS=3`6aVgpE|@R>jNHS@%f9(pUmDIi3`2+)FYnyA-(?EclW1!&YisaN-qw3 z@zf`-I`E`7zgrLQGW)78WO3DJ?nWN&WxVW{`tcCQ{;_AL9(u@+ojGwX=*f7icdTE3 z^nc7d)~_$>cfZJsCt1Dj5Ao^8_mcSR@#kk9nh){hr)Q_n`as50AJqlzpZM&p<7M6c z=-VjE&ksNE4?NUuU3`A(q{oN7IOfy&;jeyt#&vf5#UAfrPRKNbpk1v_uC~w!j3a#_UOME==G6(eLou7F8_0RfvuiGE{r~m4O z;)d~+ecxMXNf)T=Ii&@X)0kL&Im z>tjB3h%c^r#D}ae>VfR!f%-SbAM@xJv=8F4Hy`4f4|=kFQLnh_6<>cL-uRCFRj)Yw z@DZ1+|Ln!bPhI*t`r{#vb^iR+57jN-m}l%0e)6c3AA9-i3wyGB`oiD*Sf_XIy07@D z)4gOL=+$Z7ckG<;#}_ZW?Tfy8x8kF2>+Ws-*7b`WJv({Tg(rLY?4x@@eIrlt@nP?K zq(Al@Kk?+pPyg8A0qqkW%hzA)`X;`(?A2)>oIiT+D)*)OtV4aohm1EFkFgKp;K$CK z@Rwg6b&h&}H_=b|_}N$cAP*Fm9a$W*K0-X4BX;7bPagfYu1@RX*<9kG*{|$MpE> zC;gbuKGDnL-oQg$^0VX5-nxFPlWbl8@#HTbzV!N_ukx!~-_(JxIP#MD)8m1!Jb2?F zECA-A7rn8{P47{ zKKby*)8Do6U=P{LBffc1pYNBr^ibd3x9)HD-ox&5`yd~G=Rh2K{Pl;QI^0)y^Vc_i z>eVm&%_n(>z60{RzttnYb#?8LpZa%8##erM%p0Ee0Y7=X57bF7FJ5Hp`s3al=Vs)g z|LVdAe|r6b>hN~}D6jo?PUYbz4?p{@UwDhhU!U38C;9m4%P6zgCw-G&ee`7U@n)|c zdGrf!`$TrG%qPA2#3kdw9v^6q^l{nd4=;LX|M438qz>rbl1Kdz4|e9&xim-Wu}+Vt zy6uZ~e989Rc@xq;t$P(KB z{QVB!JH7gR2h2M^b-JJJlRVb-2kMi$^+$aE_^2Ciakq)*jv+nNZ~c=`T<1r9>ekmO z#U<~WEH9K#AJ~)CYrf1o-umwxvD1&q<<%$gAU}E4XCCxV{r1URurpWsX5GHwgTH-p ze)I!>`P|#?9emk|Z=JpT_~6M-{qm@DJh$eUKN*@2ebxu-&eNFBen33cg(p7r>e4^` zFpuJx3;n@MT(Wrh$_K?8`|2JxH}Z*tm%7R3UBCIsWA54S*Zl4kiZ|B3W9$15XkJG@ zvc8GuJnveZ$)P^t@z`N~-{jpxbxa-fJ0&}3yCfeRJ|X14Tk_$d`kbdd((e=Ep>OV` zb6VdsJS~)09Q{(~)a<5&r-sLbj}MOs@t4>9tMlmW)T7V%!{f74uX^|$*7^zIk)eI@ zcbk*ao3CS&4+$R^imMOe%X?II?yDyz)9cIh^y1((H~o3x)bQ!yfdk5KfAmv7>>ru^ z?BYB%v_Er_%?Cg8F!sSd>hHAt?T>lbJUxEyGx6{m=gR!EHy@i8Z|hJV_r^i#`P&cY z#62L+R@v(#GzTZQZlB2dOIEkOjrp8==f-}TN9W!-F+cdsh=+MI|MKqKy7OdyPfYJT zI$!eI7xwyxzxbyVM;&PbD44VF6v}T?BAm7)pt?y)X@H`M}7KbzsUGHU-F7?-M(y69&_P-&<8xk(|>iHoxk{JCgaV| zxjmzGy!F+-%x>LW=(ls|+&Mqcx!fp!=a;-$di%0nviaq2UYw_?**PbZll4^}^v$|^ z#XR%hBL8(m{`ld&#!}YRtFA|6H#sDGH*Ao8!*KJ^cLyK$mcE#4yx`>g?YHx@YI^*{ z#Z#U7f`@af?zIMf`h>4}RVVwE^IIjfzD_bb_wSnN@fqdSTh~AR6qk$_y?XU)1q6yLt-ll^^6JoLpJ$g6+$ zQC;T5e5p(S@D&#yam}@Poe~e{!u<2IU*hSXb-eKvhh98=P=|i97hhfYLHCk%_X$67 z<+1N0Pj>dpKGEx^In;mqr+)nHzdH2UTbXFzAcRhd-3ovcji;S#DV&1zr|rM4w;?4>npu}$cvA9?6ap)}j9B3qNt)L)P7Y zc;e4bp0Q5n&AK_@XMem)c4)pQ59ii*M_uZ6Z<>F4^NX*%+ZWfpYd^%bA7pi!zp+04 z`eU8H{nBsz^mnw^FMY?GpSdHePd|T>ftXRp8AcyKJaJne253-Ba0`#xi*jX z%ROh_>BZv@`Rj){z;E;?L-#3rD4z3x58n1cesicl<^oTC`i&=~*DpN8hxm}8{Sk*9 zSv>LaQ>XK(FZ{*lrw)2{>SkwMpP;#vhhAKK#WfG&(yPZ@$Unwq&) zcH){l=fHg`qjfvo#qG+@$liNKkUR&pS=9l zfrt4~hxq)&<*%>o@DR^@sY6_-Z`S1(k3Uo&-uTFir|-PJ+DG~HMILeRAhX9;eEVVD z{K4gV4~UP4yyjG0;>Zv6Szhtz$zxu8^@W{0`Y4Wiz1weRfJtzYb{yD#Kn zhZp|(M2|l|_3?M^jV`^R5j?4vr!P(5S) zWc=h4pI#h#vOegGb$!Q&oxZD2U1J^cio<^7%g(y}msj1^`RgM)>-_b>{)l5;o#N<+ zc^~f`b%;xb>JWF#!w>40zB-5M(^q=)#UDR)*45WFH;F7hRJZ(i zS?6aT$n52Z{OpUq(5r_Y>Zg9F1D_Gqix;$iV?OhuUh(iA>v68|z#HO??-*~)uW$VM z$uAy1b;wVT7khoC7oVQ2zxu>qeEsAn-^d#;IP!OH#fADKzdU$Zcdz5){HVkJ;fIH~ z>Kf7ghp+f#`T3cbab2I;FD;@5N=iP@P}vqb!~}#=6AE zkN?Pz9bWA14|{qz=BFR|y7%mlbD=NhL;uu)7vAjU!O#BU$=~`I*Zm=$cbt92kBqlE z=<(AxdNOn#^-DZ5e)y<|ojm#~E<1B54!^O^F}^tZhChG2^#{5?$GIE%*(Y_%FTT9; z*e`XF)h`~N_DS9Hu(MzCuvfP^VTT794}96HQ~mhhIm+zhHP3jf6MuaoLwVIFAA5P_ zW3PVs@F24nM_l{t@4o6Mi^G1*=N=P(w9{Yf>SQOMezC(7;z8y|PqvTZ>ldE(!Fdu- z|L~<3NBnVLtkaKt$l}Ta$GG}qKJkF+(I@Zwv47U_;}7+LY`?|F4-a*SHzGgw=1LrM zqds{dzGU_2kN(+TcKqn&W3Nv9@ni?pGuq*SH#_<1*_kVO><>PWzj*4De_U55WUsI4 z#E0y=>)yjl9`<8g_SW%chqrj@bPgapaqtyytiw8c_m_Cf^lsuWzWii7M}K}}UNV%Q zjF)|(H}CSY!^gUQ)2oNxyO18bxAfVZiGzo{;^D~-KgfG|ms6kk4mc<8rzkykv3hjn%8zqsu9xo04I{_^tE$B{3Yoqman z*BGBYe|3*~{^H_~pFZiQb#<%9I&`0ii-$Vd;UkW`*45>_(A#JH$@qyoqID=QJN)!Z z{!uTl{-{sfF&;fTan&=f)3YCW>IY;G?T@(nLqGDfZolN?kB4)oKi0)Fm*TM-Wq$bR zFTH&Ht(z--S1)`1@`zjD^@RuJS`Snjc=ZP#XKk@NYFH{GAe)2)~-Vyj(#~X^v4o`Kd1LDmOZ}yNLU%c=( z7xd#kj6BGAlcD{xzhr#ymrtMR@#3!^?8o!R9%ewfZULO0ZPI`Iqh3b@Vte33+;^S>ye5ek2=*7Vgs!M$K>NXeb z%qv+Oe8#%;!9KE+M?dNH!@4}q)yPMFb0MF2>JSgo^J7nz2g;*9dFY`yP(JJWytH+8 zkiFl7@kge;R`pNS8E{=7`uP*hAix)m*_k(!y zm@j%f)$2Ubizl!78~w@n;>TY8ktch+_~9ciJv)8W7xBs773}m|T)g1u?_8@}AH>H? ze5fA%b57-<=MTllLtb&&(T{!PCl7nFyyl(E4sY|V&-$kSzNhlhll50zb%}4C9v}JG zsaw75oO}BqFMoFSkDYqO9s42<#GgHXeDI`)>axxs4>EiCAb+wr_=>}B?7z5BADjpN z;+Z3Q=ifTnT*$}Xez4QGaX-|<4?pqr#l0mzv~GUH;m=NfcF?}D)7P<&;^N0o9{nV< z7uULTj}KWN<<%D`9zXfX&Li1(V{(5VwJsl?;^PU`3Hj>}KK$(~dpy*`o@|}HdhCn& zv%kKd^myv4xZ?P|DV{h`etzmAk9p|zO@GKbw6 zDGz`4`U&N;j+gqxWe>&mZW`n8w=Rx4Mt;`q)5t@7-$6X+#gk7x?4W(LE-${Loq6KN zj=VIU`lDVvN5n&3_0fw%W=D_5xUP@Rg}C@w=LglpUVp5Uog4Ah<^ItpcJ%D*mpaH$ zKK5id_Q5@?A7egx{_aQl*yAHUdwTWiAAb7APChus(MP=T5T89e{e<}O$A^puJN5A& zQ66^qKy`@AUi>k?Ia3EecKk*j`lzq`Ab;!X6^|ajF~50aFD@SRzH8z^{UNi*Lwxz| zr+Y*`bwc^AkN225yr1|%{`$jz+`n<|@yFXf^Rq7AxQ;J=_~^&@USf|YzY+QCvwrf2 z_~7X~O6Cvg)u(Ur%WGYH>v)fG%nP34vM1~F()jD&*f;#ekw+Z-$awR^18>M)-mz|Z z~FF$(chrf92 z_}K^i)r+4xt&1bRzQ{wyW3(rWPlocDM||+sPkMFmw=O?F{P^L?UtV$8=?}i6eLs&U zvF8uRxcFK3-6G?OpT3Jv57kG;my9<%@yP7-OMbk^y!OSsngjOYiep_K{MeD@5r@oQ zfB4BSEJ!JlddKqDe?0M0hwr0$#kD@hm!DqTF&}xXn_gb? zU|;1IU;oviK6%wW@{*UIdg$3(hvMQv#*-iZ*2N$7>Q#@p^!)T+JnMMr13P}=;zchG z#NYbpXD&wm?Cp;@BOkoz#lwqUJoeV1{_wY7`rv$sBQ9Rzs+*sB$9WN-pLIOM(HD8i zBkxh~ein~CKJ1qk*E+;g9DZbTBOmnLC+nB`#2x!JuJf}$W4`fxvcu1PCXTt1f3(*p zJk(2OFCJ7UWT!rHpgd&p>G4ztJ>K?*A3Zy~%qu?fji|4qULH8+lZU^37iX-4UL3si ziC!J_-smwXFt{>p8H)q{U@6n zGL%PtD6YEX9Z_EM!e0I2$fFLjbB+(5?8tbL+3UA>?CAY>5Y=f(cR;KZVd8MBX?ee6+_uAG>C z+|?5&Ol)`5GRLg7?GowKYY%z$KFdtnuh=_;KWz4=g?|fw7Tyq^nf(uv&raSm+$H>H z>z9Y04^L_R^zgFqt*!qudH?Va>Gw{)D|u@2t;v@pKal)_xMJJFX#XHS5gKTV#NoxZ&!`J`~g(0uHk-=*o#4gV|rYxtGy)=S`PmQa3tInbxMBFE?2k`=RkD5jW%7gJ*4eF}{KDkb!ovrAZ+2e{XSM$6 zWPRQ|{qNG__s8V#w*LO)_kkuOa5!*@1AwPE*$unznimnk2x<}q}SJXC;z25 z-wOGudwzBYhDU{WX1`_fJHkhXcz-l`o$!|MzWm)=&q)8uaNE$n$g6Mqe{FHBe>mB_ z?A~!ce0S7!ReA2n@22Fd!&5`?Kbd@G=p3k5A70n`o5M>&`{aI`oBm(nlfw%_efxAW zUgr7Y^!DMg$>wsi%R#f2=@G z)j4@hac|9T_i%Ffxz_E+tJ9wry61h5-JiY-E5_HpFUaqJP~Gy0t1s?x_mcOL@3VT` zV>cI99_R3>>2I%|rzF22d|P;DxMRG(lzd(2-S@KMxUbZAZ+iFCZTUSebpAe>-J0o7 z2p=1s*Sh=R?&N)2*RR{s+XwwrCw}_6O8%>bkIR2{^0d(R-8pg|_H5mKH8uI2;n|`3 z?n+jd_t@d-e_Vd&&v)a**4@(^CbRQi_Q} z@7~te3(GS*`wxb{437!z%TCGoxo@1aJ6c~Zd{5|o?3_4PFD?H+vwKu{Za61=Fgy2| z{FkQxKz82=XN2Bk3zPp4UK841b0xlccV5i*i}F*i@75{l{q8y|Sv_Bm=Yi=r3*D3Q zempzp-@ST$_Ra~teQ}@sD1W~f-A7N$-#zleWWV3`OZNLvKmJ_2C%1lPczbB>m+9WT zBKu2PzaV*sREggMoZOIyDx{Cj`<@h%kqS;c*BcINQbeInWY{zIYf{s)TV zzP2BJcbP+dGB>};Z?EF1*Zuyz*8OhzTz1!n-U<5Weq1iU{|U|UPWi1Ey03kIFHC=9 zxK-!H-$9(0^I9Lz-TTtByC>Os(XW4|_q$-7B>(7W$q4*ks?e zyOQ<)?Bwa8{eOS*XG7n~)$4<~{!zSqFYWiq`OOcVcXR!Q{JtFOx4wKl{qFfYH=jzs zd_2}mUL!ldhy7jYkk+?oeQvl%cx1RGk8dWZ(BsC3`1(*P5RnG_Sj6_v%nz+@sF@{jK|ba9=!bOaJ;%|J^gQ(#v~n z@`L%WlC1wvO!mFLCi%Caeta(Z!s6_lyhU~SyZKq^eLo*aK0UlVd`F0&RW~ZO-uVdr4e(P_H z_m7f48ZHiX6uJ3}Q7l{_(eD`PZ#(=gQo_JG)FhK_g}uvT35IIHedUQ<8TI-48EI{z<&vUBB(`RjoT;S0+23&cQ+X>DQyP!+UP>rr{Cc za{2k*T#{^G56Dhjb&2m@a<1HK{x0|F{GS}Edz<9%hR&CK&aZR!((Igb_1ll@T8I9A z@!I`=q+rU7Ouu;ql>h^-z2nnA zKmFRt-jVkGE3IGKI==ex;q;%(&b_!!dUNbvaX$8k!)^#SN@pZJepIy zUeo&J;r!4%*@r);KeYTmN^cVO>cd_(7f2s>x*M9Hpp+C?A^x?Cf^$RyV@Pe&b{9?FHLWL z4leEw)61uR^S*5B3&P_=_lUpO=>OiWpIvvin|mMR-B@rqJ)%(~`}p{qTFhefF>H+yjqF{&gs?{a2TJ_}=#2 z_rmY}8Tp&Phm!r>;ilx>!j0<7?C{0u|0`T2{mYWgllypK`W>=cDOB&i$*;}Md>@?r z)6l)(y!iW+bMTGq%<1Ek-7lMz$K0EDbKrYquI<~(#qqn(-+lK?KM_8&_$!D0o@tH` z%Fg%5cj3wD{}PgqPChU+$KEY}N`Gi*J}*jsd_10#yngtW=HmIu_RaV7x#>^HUtgWK zFSc%O)=2(E_`&d3<#}~+PEUV8_?*yr`e^p@xWC!mlKrybh2d{PbMC*F`d#n*yeJ-T z&;A+7XNKO>`tCm6Jo|maIpG2MxhG~OyMMeB?#{A-~tA zKPUN;(7m!K**nU6$347%{ySxNMDhy;z3=5?(?6K~<3jHO-;G<-Uz+{DlBXr_9h#Tj zlCKY)`~S{wL3;O#`}Py9yUz|uRv-QI@;^EB{@F13%lUmbG;j9DJ>%~x2j;g-_BV%5 zPwyUZ|M-3PKz8!#=Nb9=``Ve=dFQ*IUYh=O*?%+njPQNorJ;Lh*JSTw=XO&1n~Udn zjQdsI8#+IK$=*G+fAaUkcZB|4azXO0#rJ!8_v9N}$J;%ysCDn3H)l6DyrOk;Wd8lm zaQ|JOy>n;I&&%I=Gq2tuTefcAZYa)_^xsatERnF5+Vd&hSlzdA#skrVNdEe9e z%y@4rzKyM?04E7$v20$hu;g`8-GpStT?_WzW1MNU3};I zuxF zD!t#seqY*e=lZnl*#A1&{Le`Kap?Q{jAZA+{qB7IVTj{CyE6Uq@$^14ch37)vin`= zyP|*2iSNG#avJ>t{g4n(_p|f;(&{-YJHIEK!}qr?->b6QFuXhT{ZhvZ(%Wa}$@|FMyg$3ghAW0& zEw6bxBK>~hmqPxVB;OM{S7#^tp1mts9OusaXphz(2(NA)ywhi;pBDNZW!~Jw{yp0k z`9CK7bbijI^Yqg67l*!w?!8m;e^TowB>S%YF#W#i@i`{hd^<1rIFIg+4;Sb2`FTey zOz%7K!q&Y*UX=XkP+#RS&-WGw-#;dsy91NG6Zw6yxX%BJvh#N+_^tF$&i*sW)05TX zUOTaM`}^7K{P&z^weGv{m}K|-Wy!t^=I^-lHx=(I$?l_%C%+|JJG(b0>yz(*dyBvQ zqBqy(NI%_QUmNo2yYI36a&El$oVy$IpAp^`-}{s8$K~m-P47N1xBlLsPx|OQy(ho> z!cT<${-Msr<(V9QHoMuOIdPuwJUV-SFTro;^rwaD^`82BahGlV+2LW`Q(N}GBkDV2 z|9+I8cmHpay(jKWKB{>8C;u}%J=`c%+3a<~}8tS`!dqRBF zvud*6BM0WEAMV-Phj@O6y*~Yep?!Ts@@~cV-vi&Be&oG=`upqqv-0!a_)hDK!nvXI zxm_||$0q+H^!vbEU6=lr(0fF@N0k5d@o~TV&c8Fi^Tt|Io1R9eQ7O-c8~;KmHEs_vX~%d~1licX7^1|GZEieNXWD zMRV|~{63kzbNGj3b-KU3`wkl7iJ{+J zw?`w>bX_ z`R$aQ?}L6FlHTvm>+<_>`oAap``>-ZPYbun4*!>>msj7PliqjV{j+)gPYhojI{)~( zH@7U#?Ci|dS;^+kf3Nsj_7}E(K=NOcuS(uFl=sBeAD!MkZeQGgi(9`xJU6sYHzhlF z=E(VZUU}RLlajrQPfs=n@|r*IcfY58R=%HyzB3ml`)<7@*?ISO3jKde8-=c{-W^K{N3l~<+$|j&2@TD z-ksmGTlfCmsP%8Q?i{nj^Q!#Jvv-#J*!}Xq@3`#U?=LLAzPNuj$nMn8``I~tLVlB4 z_xH~`(%T>N@`m(lXYXC%-1%K;?yY-&IoJ2*|NZbQp?dEv&t~<{d2qh;@&5cC9C$sD z?Ed&vcIueYy8ie+I#=EU{AT9=^!%KQbJKf&o3}4!XP))#!0gWnednD^^YDxO&4qjZ zpZVE$eBHOc@A~zt;y8bY=ITnb3WBWwQ5|-|riw->3NR4?mLL@1}R8 z_g--RoIB_61Nr?qe0gZ!H%-RR`|rc)&7XO8{{GbZtay0Wd_O(;+Sc7CHza!xT#+oV z`S*R$C->TKi+@dcQU2!e@yQl`-}&x&zv;^XCuwbEan zUcCM5)5)!`7P?1I&Hnz-?=ts-`)sTH@cL@@%cOsG@~eh;_R)FSD|`F)tnA$r*C(GF zK0kCWewpkZaX-yY|CZ2q>Xu~Z>DXlZ>-z>j+4|>0eY_*yzT4_NCp+(pS7i6=^#1pn z?nrj;xzBFO-hFU>^7+}D-~URl5BmSM?3Qoc9K0s|)b!3jy?fJl&%5BA`I%Su&Ozy& zlbe!X63#8pJ;@&rS4qDxyfyviq3@#KBR|Z}clr2a^XvTlEC0>Hm9l$kxH!H0>=VhK z3U|%U{&_Fl)w=s@|Lk5UZm9p_+?HOy#8t<<;=14P{Xu$u-Y;7h@8W^))6;vG`>vUL z=lkvKLi>41@fN4IpL5eYkMC^VclOh*KO_Ckq4|4H>*kid?~vaY-l^_|@8(2cb^D`&<>z(xC*44pZyu<6O z-$^enzI}1dob$IA?_;5L{_dL%i{m}Ma(Ubb^IHE+==ZpO*?04&&!=a9UHM;>Y~KHp z-u<*m>nDcuS~t)7=3aAtlis|$pPyb_?=$Zi?_Ix#ew^KD#oa1gF1_#X{^{MT?$1-x|6Cp6Z$jUnpCtcx z_}j5Gg|+6$X?&|=_#!r6xx6Hf%Eu_;+k`Fae00> zbRNz1g7m&yzQ0$bcYZcYeyI3|CEpS{htB=+>3^F2r<476P5CxR@B6u2vhS|GIPdo9 z@x@)fdM?P%cgpWN`+I5Y?kD%5`|dP-}mOc z^ycgCWPImj?>sM`{Os&*4u9JHvQz8w?cDmEp?kpjc3*AZ`j_&b72cBm_VCN0_wnpx z`}c+9--hPg??m;f$366i?DfI@>Af?zb^W$a?gf3Bk)7}LDb?Y7{=3$F{~q1Cd+xN> z*}L!7Xuj<4&$8Pkf8TH4-P_aSr(aj5H}_j6`%b(q+1%b%p8L}OGuinvm&e5Kwb`wZ z{N3cQh5Gr_;;fzC_hp6TxuN&n`?F`~o^wz9qxHAv=X`kYc(=d0_4UIU?87ZWe|Nki z`M~hE;nm@D!}G$MLhony(`xm@{q&vqdI!Ed`RWi4^Xb0uJ-MemzOOIJ&;58@>n{zR zKY1Tae`x5t=3KaMS8d&Xte*VV@ZR$3_rl~!tskB2dvtz!@$XLlYIb*o@_JwE+s)aV zTlbgm^p9G%ALiOQ#li|76@kM6twY5k%6UlZ#8 zk6PEi543)9_=k{wTC%@8nG5{&be=o0d;`g8Liu>xF+41u(^p4oLxbF3Jlbz$& zCI32nM(8_wX0mzPbg+9x`9GTem&rd!me2V*GQI!*O6Mkf=bGO)r(Y}Fr?_8DcAj@j z-YPsS{A2c?Pxju}H+hHf$Js3o{eJS^HV1dM{-pfe_s;!Ut^cF-UnJZA$;s|@zdwEd zyhq&k`eLqqcg=2F6T^9O1=sZ0&d*{UO zGIP6jeox6xzr3Hlv&`k@+1rQL=C^G6m-Q}lANk$N?_Jq@f83Oe@AH$*iFelI;=9*= zn%x^h=k)&M3$x!gye2gF-%9qq@;mCNFYlV4ZdiR$}Z@s&ns z6yLAq@_SSGz3`0CegBK%JTiQ8s9%?5Z{FPN=4WB{`-L}m4}LH|-y8SH;pyL*{fWum zfh(u?-JFs9vh0>m_MQAddgprA)?b<4_w2az&kwH;y+>9|)>rf7?=1S`cdvWmlKf_e zi^{uOczSyG)X$R5&jrceJ-$ynrT4w@o_cwD=i;#PxPM;N`Yxe9-kL0rbMC&qqV+?< z--WLYj|knbCnoEUb#w69crBBiIT6o0=HspVE~@_r`QOs|-r={?yEkU0|9$%RCI2J& z>SX);*yQ=)_p^IR=sdoqb-$kowwhDV3$^}X0O{Y~Kkp}yLeS?PVh%5W^L}A^`=|jlKnfc1M0_D(ytRfE4(v)MMj4_%bJcXp?T zcZWX@y|;XCPe|_`u%G4%zsF^FNqOw|Bh&kyv3q6ur-l0O?>DbY@4I_j@~6XRhWCZ| zyrMoXmwr*Q`{?cIZwkK@+IM~NuD`wYH-)~(ze?UW+^al0B%d1|8{+SK@RRhuyY|m_ z;+WRGtFBMpJ={LjhbxnBjK|r@r-tsmyV{>s)4LbdcU*dXGH>rne|qt)d$+u(^#$R} zvio@Qw#jGU7rKxBp4~q~_t+KjeSP|!@|zQWJ^f$8dEt!KACv4o^W0?LBlqwn>0cFY z5uOr0KXmVJQGD}xPwURf%aacee-WB@@0gv^>(e`vy;DAt?C%Bio0s4HW6tn?Uwykf z^sZd1cz1=~9Usch{_R)%v$DH5bnjf9%>Eh4b3^yg2FdJSnEbPFR_NU8tM7?>?1k}r zUiNQEc2B%C{p-_zF2qB9>fS4R-i4_ssqLS6_*VW0WbgOi`v?8YTE8K5FL)1G-=O&F z$Lq!U?GpO^E8fNVIal{4e=U3G^R?+8jGy_of6j?{o0Gr4C;9Kge@nk!xOZ`#WAo)Z z@|4yO%KppY8^b5IzD)S$Q2igy&fod%i}P_u>qq4GgJgdHVGUhspBl+lJ{MSs%Wc{El#T zxO(Wk>Cc1d@i-&-i=jFAXYrlCm$YubF@cUp8aj%+|YOS`s5FUFUs%d;pOS=n>lvgohR?ir)U4vP(ShTo$|X`KYW)C%kQf2 z@!>7;@%xPbbJF`h$g@)W;a+wx;qULF+ZX@Mp?ko0%MqW^?o$JheGG|yU7QJzK0)7UO5!^)%EpN=}!#Z zulTqx?`z%P<-AkP$GNTV8a@#29)6^J_WjWG&kE%=kGH4y`)pzU+obn9;E?*_-dLk` z{TT17EnCOWcWi_7Uk}$S?z_b+|Id^4%RZix-aLEXPAQIayh^hE9hQ7|{=Rc(m(O?6 z-*@iH&iCLw*?puq>R%_jT|#|-Z?ZaXN&Y{C-FN)=V;TSd3z3o{B1G4|?7gzdma_LK zJ2QJ^?~%Q-_a-v32_a>R$SO%`p_CN*{cgYCWU@lNaBZ|<*oif{99tMJdsdzZ?y z&+F=BzTe+I`CO&_{C2MF^S$k&$vqX`8{S!beoyjVK0Z4KC+GVc@4{>2drur2y;S?2 zjJ_mXH~ePn=%2=4I+TykMmztTMPD77Z{ySF9$Ke$=WM;`JwtQuplE%dpASi&y!m}$ z>g46?!|2oe!UIbEZ5-zWV(dY1e#C!CMt zTVE*jJ=Rce&enGh#pRqFm41C{PPjkC&CiR|gLZ$b-yE$wU(SJd!X&L<7j73mSN|@V zKi5P**ZR@nLGj%m-V5$&_TEbVGvO4WbM}1nRH6BU_I)J%_a(P#cz;N4?fl**zW=Vt zv(Y}+E*1SkaeN_~eSP75qkgBQ-}hep&}W;c$9rv==m~>;-X+en@8Rc7{@MKcUi8S& z-`y`B{bo3K_?2*?aHj0~KG59PFJqD$o7@@E-V6K39~J+A@S*&>B0MhsN#PTr{OEUc z!aVt0a=v#kANb{bx$n{X%X{tI^mxzdw+G{ISR50g_0v_+-pA`ko9n($Su4JIxmWbe z>D>n%`hDQ0^0PtwlSBI4m+tXPTmLBBA{3wg_jj7-weCKm=jHgT<)3^l65l+1Cfess zpPP1%|90qi4fon%@y+S&qn(o*i`(3H@3^ncIrY>R>ft@_p7Q&}irJC>E2HIiz2bHL zeJ^6({4#m<_wIL|-plWalbbtw_w=3^-}h$DyL~pj`lt|BHH%>+ofmM_zQ&p4VPZOV54D ziO)UcTwh!soSP%sCx7#{-+R$M^X3=r|6_8OM4Kn`$M-qPTr!U?Yu%jqQ}pBMVgJSW ze+i!rom<~)OdJ1=@HgS3;SS;claKiS{-D!IwSMazqNpB{go(ECN);_!X` zHOc)ebpMItiuiAaQ-tQ!CDAv8zsld+qCXL?5jsbEM!Sd4Zr^V4CxqjQPdzS*@Aud9 zTKBuEcb3ns-bc5#@3`>$q3;2Gj`A+y=NFT6PUYF}`u<*k{C>$V5xTe5i9Ryi*n0jS z9jz~xjdniF=`E7?K7A!Q=gd4?EB@snd+K#_{HH>B5WhJ;N%s8x#UaU?gXdMZed7Ba zeeY=JWxeR1Cr`ipuHO1$p?sN(*Tz31JT>J1M$!89>}d7ABibC=Hu|Tbybb4oc?&m9 z{-ef5+ndSM<~3jy@}VDn9=fj6X|wW2he%j`lguynQ16{h|5e`}ob`FB)DD zUKbt^vNt|jUBo+8{A0p{LUU%)X#ITHpuhbNVovy8@V)k_?;Yi3`S|d#=;cE8){gc& z*6Z0-5A(tIwBEJ<&W<_c`@S*hGk3gKoD=@cnB2I~zOAGG8jc7L4gV0jpC-%S|HeN! zGA5P!CtwQfY zbv(2D?p$6jO77Osed^uy)#SVvzYzVO^q4>H?Mu`1iSXp)mX21}Ridv9y%{+0L_ zgd1enz5lcL>S}JT8K0kfMC+sNqs+*G-wUbl^vSvZ@^9|wMZ&Lzz6bGs*)jg;(ENKn+MIK)W{U4VTs_)+a8BlpzjXfS6ZiJw zt;_EM(SHfm`Q2#u_7u_ghrbGs2=5O67RrNr@}u~_$uIf(V*Hikn-gD+&wq89B)+*a zb@V-e@aRvq?sqM9o-;olNzOSkuhwYa`QbI8cZlynrcICjzco4M(C2vX{la7+9m#pVBL4Q_w&Bj9?*q)U>(lq=(C0Xx2mBtfcKiK1^+Tg4 zgjH)9{(rZx3gQ@0^$$l{rh8b$7FZ1_`61%M~lbj=VsCBuv+o@9)SP)=eya} zC&xv9BJ_PJ{B`_ALf@;qm)%Ftx2|8z+sERsAF_W`^w0Cx?x4w0_TR3t+s86Q7rh(*6#tI!rSQG*Q|0%?=%0n&Ddyw@_T}%l zqx~NJyXZfJ>xJ&W?`7w(P##WCZghBRXzuwP+P^=2rgeROV)Spqr9$`Jj`{oP_}+P! z$M?MiKg>Jln4h<_f35JC(0Nk-pW_#&JpD61yFUN>+_FdVCxzz63+olH;d$;4$f4v~{1a?#sV1@x^m)^dq77&BD?5ga=v=7YhAOB~O>e zKO($6^nJp2qRo|cqJ4h-Fh5@?j!RlMSI&>-=LXS!FVr{s!aR1bte*ZW(l3whL7#v4 zug*7R$9r<$X!n`E^4>OY{9VkG$zL1pnIG;QpX2}5`ds0@$$5vr5&yh!mGJ7&{pa7g zvUfr2-hY#)ca!)(4sQ;vZX(*n)#{k<@>SL&kN0EewpVRw>~00=85}SebnE%SiXI4)+gRO&hPcDJFonmExymO z-lgs{_tdTFT|U3&Yu~R!ea2t&WX0Be2Y_fj>vb3*rwJpU)YbNX`hKIPAOxikLa**z-Sz2N(u z4dQRues=Vc{F@u@FY&9Ve45Yn>xXmmW8Un&5N;Xn5WXLtl|QFPJICt0YJ8tdy+e17 ze_VK4ctN;wC{E|=w)o<>H`;t&JNni9x;y&y@Rs=EnJT_>udnxu|AoQ&F46kM=aS9J zoAWhea?bl)(f&Tc=UR5{)5pI^-g%IZ$>P5mej>Ym*M2y@?;G}wHW%f|_hLTpe?C16 zC2zi+5bb@md$jW;U*1XPu6Lz#d{6r(38x8f49$CgZ#8B7b*k47qn{4H8@>|W6zY$Y zqTdP^3}*?q56$maqi+fC2sa3QkGXoZdR!UpJntAS&tuE0b8}qrpnYE1vwhzS`K3Sb z#pPY-oGslxb9A0)?<{qZr!!lBF!XuV-^Yp5x%_5w(}m)5&z%+juc7a+_K4oRJm|YW z$G;@L_xcs_7m2SA_3_#9&q!{k@PbfZx(`2$|E2JlP~7USPo8Lfx6tP--+w$Bf1}WS z@Juv+H;X<#^gW{aE-zQN{zkZQ_-rUo3zCte!r6ZlHp#V&snEOzf^wI zSN`<*Z<9ML)MvgAQQu=*Up1UJKPHX#`S*nE`5b+7^iRTfllON#cSifZbei<)`|q~C zTKHai4vp5Aw?^*}?j1TGo2K`l@x34PyK}r-aubJ#Cx2!re&^3UvtsN22z_q6KiWAo zSLpLQ#DdAKon3vfMSS_?&yMjQwjO>vTs$4@F*TU06f4|^e@Lqi9=@fMcor8;#^F4!mZt~>Z8?z<1 zedzaW?~n82uMo}?`o7=&zD)exL-S#p=%vD$vu{pa72o~x%V_tt`*TeD^xulf{W&zp z?4LKj-|41})+bX$e>uJSWn6sy@<6oDf8M3eyLy=a?z|C3@FT-R6#VuQ}KE)W1F-(0hCGJBIo}f9)Axp0A0XJv=3J9`}#_ zW9Xdt9N|39+4`m7!r>=F_pZKuG5+M?HlaSzKQqRc$MuVQy7=bi_o96sS0{COuJtp* zQ6YPeMY}H#jozsGqPLIFt~i}1ame4&$)6rhl)gKoe-e%ieSdU+wD-nt#qC|CpSDcy zp76@#w#|&c%T&Jvy+zMGy+qNg0J-`4uSLie5iG)K%a=gU2KVEXj+?DZ+xEAJKa;r7p9*(Lzjv^E;j-4f z$Hqo~80z~;qE`uD4UY}QKXvr4L;7}#zBv3$==ZcmqR-0D#iH?VjXtsX^|y1X&wWmC z?z|7a(SCj7z2rRpt@Uq(cVAK&*V z>qV~`em1`jkEZX((aVIs*VPB=ws`9&h5nwyd>7Bj+41|&>e2db-u7=D^5=)q@Ada1 z?rWbjeXcq&xvfHd=05k|q4J(lmm88lDSwuYcK^zgIyj$OCGWiZert{P%ZtBo=dj{?xiUyGJ&O ze`d(vb))(7iD>8EeBLZRKg}I!5|BsUMJ~=pA-Tx3x?(pczLg(GN zS|YtWw0>%MNVr#cXZS>TSg1}fq(|P!pB8_|)G=?lJBj|d+#xMH~%(lzxhdC|LmJybIk8JtK`?Yt@}Lxsr20# zUKjGy=SJTH^5?GPoSS>1FHHXn(T7Dp9qn9h9RGv(i-$hH+?P+is8IXSoWg~OY} zCBsd_6SDW2{<{ft#osRU`!fC8$9Eq1t?r*`{rqr~aJq1(P#*Uy|F6cEA9DOw-^=W8 z-?PyVhVrCeFO0uUICnUI==0Z;>3bu-b9Q93Ik8D{N5t2Et48k~?pj{eY5Vp$$Gapa z9`!QUZ*6_K_W3@^`CY8_uZF)=$K?Hv>KrZ3b+}wWW z%f9Q{w?Oz<=p4@(y=D9TKKY~gmxSJ<`r5ti+`f{W^LS|b^ufHXyDyiIejvHyqve0& z_}))nZ~f{}-u(TXe)acQ`f~Q<)oZ=zv%}p&^|>j#OUA!1^p1Kr`smPHoGN<7>Z9Mj z65qN$;^!=_>(|Mm-wFBc{^7TIU_SZ#RsH?R_P-yl6nfYBd!e23_t4gz#}%UeovV7? z6o1bU{h#!l7vDWgpE`IqzLy-mQ$~Lf`W(1sw9nDL*U*RN?iZ3X55&Dh{4a*?S?6Sd z{Jy>Q>!Qu4>*LGoUeWv(_mAqEomxLUJ-0iGUWuX{#*Pi+0k(7$_g-`^7dx^V7rz8+!%dC`~DPe6B& z7nYxSlh;Syv)?T*&dCbN!7aFk2OHQ7h(^vA-=cYBn8;2{k&$*ls?f1;pqW>1&5IP@=rpJ5W zt=8F{CHniJ`82wH{=41oiMx{9JzOxkJ)_N2dDlO_k9AI$O5S;%wDa(d_|C`r(Z6f` zi0FTWJH|gCKlI1k@%gc3^w#ZrXrSj?(e9twqxHSti`I)jK3qHeWcF{2R=?fiKNkPE z@SX6$(E6s))3?v>XX?6b>*n(I#l?@w+qXt??!CVzC$0xuH*aQ)_O9lq^DRG*Ca13M zk>%rm7_OWj@_lgpAH-iM+V|k*ranBf_2a{B+NaJ}$A2LHccMSO_u~IN{>!0ydOsZy z-~Bm%`^0%(>*_gU>)(w3jp&o3*N%1`{T+h2_tWI$b(?7Sm~-^i^r+Jj(cZ;>Y@hSE zLbSQOMDotbvC-RwzexVhXx}Ry6uob_Ye+{Py?+>2~eSVoW z+B|(fz0SqDt(!OI=a1uGk-Youu=tCG-ecyL^TfW--^(P=o_C`A{Jz%pu{hP;_tG;b zXP%p<8^l+~v+{f5_;ZJU57!C({`XGw_riPHe?_$Tr;c_%t`+^&?rHCWE#tFubnEiu zch3!zlNW!#b8&p1AN@VrEAjUUcMi7*{hs9Wws+3at$T;99(`l@iE#h${cv2U-s?qs zKYS_L+(i-c$PO z*7lpD`uL9WM*j)zUn0Ku{6_J;zsv)_qo0}nX_7mj{eGAIcKmHa=WLhgrNVo|Wy49r zJJWxDxLEAN?{^-f0-D~c{J>xsSZzn%hD3AK!kofMi`P+}L53h>v9DC1r4=mEU`g_kG zlm5M1|8=zcLZ7_Q`l6xy%eT3(OZ$&Xj=yV1`&{&^XmjRk?fZSWe(T;jey`m${sp1_ znJoIV;ftYqjg2;+#9^O)F^7*!{%fJW_+s>P`KkWAd92bB05UuY2itjyZ9xRrgPqltQ^djM3Lg(_j z=p&Q=L%4Kk9;?sN$=@3u6&@X$Ll3wAhvAB?`yE_Ad5>P19Qvu`{r9HKQ}0vXpZZ+y zbH`fkTOob==Ywc{rB2Sbdu^-seqy6q>ad`)<(YpJ>eC4+};`7xn^ZVxZ>Dz^)&66J|_gXkt>-yCE znmPXWL+2TP-uABnqk%ELL)<^?;u#y2;ems8`jC(pOU-!hyx`}$nnc8D*pn?1Bbbib^=lJ^8e-%2< z`rAA+f4`C32q%6ef{*fzno+Js!sZ0k@URYzNf+&;=7mi|I_8?+T=dj=gyO&&DE!)-Dl>C zcjK(B-w=K&dzXffg@12-u~7e*AM#}`9-Z9l?bqLL#P>P)fY#rPKU=hW#JkLSxih(U z!&O4>f9G)9_};;1rgyFI+pX^${ZRA?A^Vp_^H+Z_65l*KG}?P?we)@}{??)Qz=f@w zyXMby@#WQhLGM|u&zZhCqSp=ek$Uc(-2L^-cF9c@>W8J1yE?vm*7_W+pA(A1yf;7O zX^QmB8BQFE!~8HG%$wbl8yW5$>c8J-|HI;O&d-j&Rr1F~n=9Xq?{kIUgLaAUo#1}- z`O-VXoVp}=dDjoVpU_`ub3wn*E05mE=DRt!W_BJAuPI*lf@*K5snP z`ueTk6YU(}U71y`V{We!} z`-bkXKSldIs!(4uxqsV^_~0fgW~#aa!VJtIk;bZb6USUXWk#jCijc* z)X?{f2d8(z@Zr{-kE5dh9PX6d8qupoUmoop@qDy-_vPfg>(6U_=J;cx#dB!1IXZuG z=8d|lpU;`zedfG4-$|dkJ{j$N>#G^Fvt0OUa_fZNk>WLf&G~Dqn>sDizDd$&?yVHx zJ^5xdd@DV7#UC9W7MjEEx6i~kKi%8r$q}u~llx1ZpUs}WJuvxY!~cfwhI@qO!%W3D zYbYN+pKO!7y1y4aPskqo>gOFhS#pns3x&?drP1zzPv(bvWQW$@5C0e*Sls5I^SxI4 zy?1s={)ABc`pLZJ@4u7t{n0(qYlr)$|3BH6XZ!V?`&Yfl>7OsB?~!nx^d1~-E;x^; z#eX^UPQEKYKGlBbz+6|aYg+$S`zMWdj(-{dAECZqAh|EaKQi>LHQ${_=f?dd&dt)} z{Oz3{{ihD!j?bUx+c!=82SVpZoi~mDaHwzfkN38?K9}4V(?2SDMD!9NKg=!l_(k$- zhUzTN1>)=b2db0%YK!#0o!pe6bA3ScaiO?>7QJE~wOMLGd{W7j~eeQdMz2dLZzP-W;@qZre z{QA7He|+!o zUD4Nv=JT@Yk@p|9{#1Bx=)N~M+{4b9`~6$#LyvF&5#i~fczh1{T>GX8KT6KK>A&U2 zJewss{@tCtIMm-8`y%fh_mg=rTlzQ=J3biw8?vKnqT@!pLqYe51jkg(=$)V4n32^ ze=tjqhm*w@*E8{dUflad>vw+W!*92LgXE43>C@l(!Ta5Pymj)vpL9ON zy=3d_h3f8e<3;hk+kO!Jz3{;NJ1BbBXmfqr_)~>jhJOzy4bA`EqraLSe-HM0`SN#l zA0{_YaxaDI{n*nhqG9VJ<$s;%`9i-7$=`-Us*pXWar-@ALRX!BK^ z-cjz&AEy7<@b~G}AA80(7n~#c_qlDmPNsl_aKh1Z2<$XiX$M2W?UoCtfy|0Cv zgy)9dBl_su@iz;%NslW%ct zuXn}h`0gv8KmHM4-*}(tm(5$hKXjiuhwoRP--b&i=bV2(+V`V7M=ul36uQUUw_C;k zP58%f-|&d=gK(wr%y8v!*KnWk%5Z_uyGH)pJ7ZdB_v+|>7w7)b?}Ykx>*(F9oB80r z*r|2*f;qhOfIoiFXIEy|d3O%|eq>HQk=#E+^*68e&nDS(ue(Q2jIUp3j-Doe-cIkU zq5Phg+(+?!KXiEf)x(EdKOx$DyEfXp(i~kk{(Yf&=Dh3~|6k#9;l9}s?_KfTGnYm$ zSX}o+-x}T&>hs@6FB^^u>3t%4p-_MN_j2wVpYP>e9_itid+5XT$qzjT#sAE}?yJ!! zhtAoN(Hn$slpp8ir_uAazD0Odcv%=QS$Cx`~~A*5Z)ag8*U!5yLKCm))%tq%v2!(9G~6h8=k=B7^}}DKXVT~g!wcfS7JY8GO8D#S zyb*1mzT?;Vt&2+@Uy8qBXucmG?L4!$V)po9?md}2JNomW_~L#i`iyY<@R9J4@S;#X z{C7^>3*T(r_aDEDUNuyod7{s`>bgC^ug`%UmmPa9sRe^|DW+K(Tj%en>nNJ4!twZ ziI%^)qL&W!gM3{R-@DQK_ABv!QXY?q_P$y^`l@hjczq~NejO0sdHE=Ml5ljmZTMoy zANSg~;`8U|Xuq$y$Mm;(c1&?>nEc0m67BEd{hjtB$#2oR?=8pIN9LyfT_id8)=|;U zk9Xgz@mCMMKOT*qFVs&rM4ugw3!QU*n7cn~-S2-tE)Mg4z1E+P&(9U(dxu^d{p0W( zq0cY!uv&cYmvy3-4duuEu8;3;{k>3p>iNU?n}^>Hk1zkHMVmYNeed}05&OOu|AX+U zP~RRK&7OH-9-Udf4o%K|vT(Hd?p*CKkn@fZ*JoPy-j%lt;(tCA=Y`Sgq7UAR|9E(F z=>4aD{E?4aliMd$UwwIAeEm9g^fBQz;rGK!L%)w*9KB}sl7I1-w`(LfA~f&Bc~g9G zY!-cT_}B1-(7f|G{)gG0sdaf=I$HfEk2ZJor|-MI-n!2NuSeezo)aDt>PzR%_sizs zZ<13l_k=oZ)cVum4?=u-@qNi2t#47h>TjOT(7OL_h5m95R%-pt(0!#(+=C~zZhrDl zJ}znf^l;N~_WV-sb>bfu%DZ{uobK5ADWUoAo*kLqZ?=9}sJ`Bb2gYAJ`4>9R=H_hi zeNS>$^4>S+NAD8qW8bqZ8DHP}o@uN2UkQ&3)o=ai*TTc{%lUfPdVGI((|9pc{=J{aB|UKDN; z`a6Y%qJJ9xqB^VNLGhmtopYZf501Zb@xBwic(gfSZjEexpYZYUl~8;WMb8_K4Hpkb zht8$Bsz2N_>iAyr%ZB$A=akVu5B2AdTE8*=_d|WZQ?&VYZ1L_D|E2c(9{0TX{{7}B zqxo;H^4B}(h2(s{b5FE6;NRU{l>HT3cYfXbOT=eaziktLj&QZ`bh?0YlI($;#KcM<9`(L_nGKv!@KkM(&*{Jlfu`+W0N~RT0cJ* z-+5c4b^m=JeXw=>>qGgG&jsSI8Gbh0FFY~)Wq3yD-Ee(=kl&~Eap70OHFDHk8VDy&;`^}HD;!gGr4|Eu9{;rZbY!_S4jw|phq`QiV&gFNk(+%ci|)JoC2hqr`RhUTL02X~17 zMmQ$)cR-(v=H~(V@w@o^{C%|dnR;#&|Hbxg676$8`#!H&H~-85_q1~*U*_Az={-GM zGCVSzxVolTKZ$>D`nHIECYrzF<4+g*d)s@W^}(N_{k_7}(SC0~BKpkGJ#|2|b9+%R@p4(0WVXy<0f=rcn38XNsm$Z!5m8vot!gHZhb4)YiBzZu>V-W7Uhsn1^V z&7otXYDU;TV;GY`*6?(fxG|GgH?{(8x=e`WL> z;riiq;jSS$|E_g~_y>hshPQ=2?_3rAVSdQhEb+bDop0YK>Wg)fa}H*XJ|lhdc3gb^ z`@GGLcg6O}`94>k<mj@DQ}5Y*TK_?KVkmFo z_;vcducu8;J@n^G$?2<2ljFB~kyodWl6$oMmqwG$7WY71e_rw>s-{<}of18kB z?o0ioZ+%{SGW}DuZ%lYyxO(VayixMbxxWkWei=8|XHM4@lGh4b}Zz9Ktk#aAEioV(&XXXc0Rd%n^7)}ecTn)FT{-{&&- z)x)i?+xkw?`is1|^Tp)MiJhX~Y~N?1rw&&N zO`n|nx_{JVuk5O~`T2wR-Ye$8?(yBb*+)P6;;&H?E(Y&)wp?AI0y!ckaHHoco_2=8to?cXIlIU+y*Z-}Co?TCV%JYSH!emywa z`RB(q@y)T7qsg03cV*A_F8ec0 ze%dkmrq<0Bw0td=obMgQ>3sZS;GgeRc4*&xt&5MJ;&eaVoSgY>u9{o?T0FVS(tk$u z;h{M6o%y97Paien|Nq}*ZKBnun(+Tp z8yvIT!HZ5bqW{;y5wo=GQ(@Lez)9l6DWg9dekQbk+Gu*e5dFDu;sJL0KlTGn-xP!W zGepzN4@myg$(6kkUmVz-D4IMR8J~UeK>FlEJZ<|pui~A#g|Q(&`&V)!$f*Z?{QrFW zhV`(I-}5A=9{jaV5C6r_4*T{)`}rmA|Ap#D@6`D<%^-eq^ve^!)r+0Bf83YyC@=iy z=g_`-(lhKIeoU7Dzu6(LucuE=9>pWS{IQ>1@$lPz_SKa=dZtQ&x`>k>`iVXHb6)A; zALKVVdiiCYfApZ)gX%2b{8A75XDS|Y|I04>_Q@mv?57_s9`k}9^sy)3!+NkYMEm(e zkGkRy{m|FWp?Z>&Pkz$J9-5!z*y9KN^ywq=`1)uVA9;G61A6%_|N4mD8B<8!I(=yI z@S7j%IP_P4iC=x?2l9hGde~tfUmo~lA3k|#eJDTFCl5n^?1$LOkY{b#c+7?;t*VWNS9Ft2F&L(7Z&sXIU1 zqvoFY>9G&m$6tQRC%$<3O&@=Tbu+KjdsK0?K{^E<)}emj zKYi-Uu6)sBpFUGZddTZX@yWBi*pHT%krkMI`^3$Ee#*CVCg1$BkDcK@`o(2l;fvdT z=Vi8mpX{@zU*to7qSZ%!(B$ZoS9;}%9{J*@eqf)xxY@B^ob=N}o}9jvZ~5gPJ@Uj4 z@eJ4T&0TrGR}X!lU%p)4=@$>X{Ikw)cF_D5w|MD+{N|T@vO`Ya=@0hQK|TMMeRBMk zcY5eGFP$&`S*M48X!(>c^|K$Jefi*r_~lDH`h^~R^Tg*Cb%evbjj68uwqKowcGwe# z_{XJ3J;Wmq>L)&S#K$lDhNyn##2nc}%d>s@mOXLs!#;h@PkQ);=AXO_=b^mNLq0c0 z@JrtKfsdwFJ@D0!Kl*{3b^bZmYzo^TmF7{a{qiPm{emyP z+46g?P(H1XiLdYF&pe?QCO*P^=JzmP>Q0Y5iHCju%a3*OvO|tN{c2r*vco>V@a1o~ zPL3Y-odbT^M<0LW)joBE^w>uad2x{E&#*uE&mO(T%1_RAZ4?DJ=Idh8RgedA)dKluse+kSOHTj%d= z>61Tt^$Y);H-5;A^`X3Y^uKlS$Rj<&{*W(uVplvPQ)Hj`#mO&xdaR?>OZ@y1@33$9 zWj^YE{>iWYkWcefU!wU3*`r6E#I0WZgyImN^JTw!h?AWC`0S{cciVt zKs!I|vZD^_%O1V@5)R|V=O2A&`tZr~iyT_M)Wf+Hk9Gd3xB8Qp4|OKT4nO!uKRJA; z9_;83ev)HXKj_bST2N<4v`5B`cD-#+om z>o7m!V_#kPX+OV)@#2$*>_c|hV+T!-^C*63zkJE3eeyydWMBQ3FYnIF=;)yx>+;Dj z`PM)DAvZF8-Z}CG3A{wI&mp7`w72l8Vdn*6XI#KAv#Eu4?v+4%Z`9%v4# z2YvE~uO9UAlOOb{BmaF)9+hME@e|^USHH=VJjyq{?C}%wN8IA#mpJIvAM|?{@QWS$ z*-=0KnnTv*N1WmjC*&{taOgKZ_USAAFD`MDXV*Qc?&2p8?UM&_@k?IV<3FT_ynM)$ z{lmVJXL_Aqamqja<~zMm-q|59pW+_okv;p_BR{6Z4Eu#${owqFUtZ+XoPhGnAIM+( zAb;eGeQ3Y@iboyzL;uL)k}vD}2CXjapskD7IzQ>fR}XdNr~UMaPrl`sK62_NKJnYn zPj;aAA%DE{=yN~l2XUy!&<_9DK|}T6zw-v=o!{bNcj&LYk++{;<^zAk<@1pJ>IKOS z?eUZUke}?TGaTm6K5;?%`D<>`%P;o;d1&2y5YKR(eR{3SpLKrx-|8m5VIA1FE>BQj z$g}e)3yh@zq_RDXV<`GpoATHfg+FJAV>l`s3`6Oxz5 zVV=}aK89#N4oOEIpo};#V2lkqYt3`>SKQB^N|H=u34v_96#laJ$V%u|MAsX zp77Dm#Sr;Tull3e5f^{>OU^#}`C}blyw)N8^x(6jj^feZ&V}`%9(k4z=T%(tEf4I{ z#~;WZIsE^H?DH40tIzBw?_7)DzF{7nAO6et5XFzro_&x$_R#FYp+5PPpP@c9yTdy2 zi+(gz59>pHXmU^-*7e7bPp@@#5Ep;>&oAd+KbT+YCr`sX(oc^%n@9SC9Dm(c;vr`r ze;__R;uMGY@WsJze#whCC#&0Y5J`Ax6;P#o${zq!sY_Sw_7 z!+rMCYkoob5*L5?Y2K@syxI@VRes4EJ^T{4eUKdc^oUn{`1}@^`-WY7a`^lZ55M&> z|DgOj7v${cH~scObr&c5{Gxvtx4vP|K6=$vUpTMi%;kA&aC+oXUfC6o`qC>tdd1<~ z(4&9ZvCdC+t&0OqzkVCWFTbNw>>gBSd1OyN$g{ZUwVz%7kmvs}UiOCi@#Tvj@=A~X zCC4xPp&#-?pFGGrf1O|P(94c^?V|@@zwj5WZt^zlGyc*;jvjN``B5i+>OcF%Nsc}7 z@!LN3p*o=Hkzab$kDU4p&#O4-gH9r|IN zpU#hZsGt4nC-2UK{v$7beEmePe9NHQ{2s)eFiOdG7^z;6FL~)P;ZY zATIHe!gBwZQMicJYUD^vJ)s z^}ls>l?VA0w|YT-@=rYW$+vpaV;fD z$g@MF-|X1OU;E^l9p_j6OP^2_;@2Y!l2{)cr@M}FJK4*#t4 ziyeB={9%{>{Np#iKI8}g$f+a!*40y<`Ntpj)QLX%N2{;6<(XZ2*k_j?>So=3`oxKr zKXTB1`sI;*ddw~U+eZ$~9zW@W?DC%+z2xW_`pq6W>+-9AhIwR1oYv_<^NT<9TX%k} z>o;-n&$@HPK0oyjd-T(zudG9S`s7_)_R~iW&Az%?mv1O9;)mjwXZGpm=a8>|+%IsL zKlvJ&LVmJ0)GuChj(_<4MyroJ;1Aoe>8rBB@QhR;9x#e?RTJPy}~`t0KeyZn^r4-f z#j2lm`q1K%FY&1tyY%X3a^fQo^~dmhsJr*&g#2R%TBn~r>+H*?dWzeA@$p+<@q@g) zsJA&Yv~NGY_~_xM{?`Y?ew9yl;JEVP+>uis=UV;bn|=MvkD-6`Smz(T?9tB;?+E+t zBX7RRqx$ei9nj>|jX&bi=lqgC^`^%@G&}5z-{(DY^wTF!{^+y0s|UaI4ZF@SJM_yB zfApWZDjw+k)6YKt_|H%E(XY8Vf?fRy#mk=a!7sGBh?l?o(`WXH5B@K|XUjoy;!!7k z#g06RlON>lldqvaXh^TP=n*e{P+!XzJ@Taf;^7}!9@Inr*;6m_`dlBWGrRn^kA8N= zBVWThIiKQ#?2CuL;?`g0o_vdkKm2Exzw}raKR?mz(~DLw=fJvs`b6H?nJCB5>M3q< z4dbVWJY=7|e6uevX!7­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 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 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/21] 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/21] 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/21] 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/21] 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/21] 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/21] 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/21] 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/21] 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/21] 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/21] 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 zcmeI54S1zhb??c{m`P!x2N*DroNz#>sW@;R+hWuS#xKYPg1J_&)6!`VXv?uO7=^*P z+Q9JxW`jYp2 z;6s0O&gjWaSNy1HXH)kT+m@ZR@}RRfZW#RU$6T>$`AJQue&XHBC*Qri>8sr@@2?J= zyw8QB)pu+jeaC3m$xZ!*SL*EdHka2nO_tX#+qU->-#vHPMA;k1=E+s8;!=`FS-yFR(BW%7j;E8lg(FBH%^$PALmKCI(!Iaa zWOzM)b7^$tWNEbJh2H@ihwpAVg@eJ}EeCatUApgir=RtQ=l#)p&i%lLMi-fIk&thl zl$`SB=6xqG`OSTQ-qJDLv=9G{o+~F`ebTO{W}2(lob(TS^uO`s+O_+(ft*{{?t3H$ z|FU-9<6qXIKGi~X|LVc(<dp@gs0_;@$@IOS_~<7eQ8v= zdy9cp-)C9%ZOK3O?0eWzdqa|o^^4zJ>u%a-W%9;9Ykqk$|GwodN&kb(T9Q45R()Kk zqtx78;;Q3&e3L_?yx2!`k3EjP3~HyyHDr?0V59-3rT4~A72?$_z(6^HE8j{c|0~Cc{_j+OB_IRY>~(c~#fgBkHwbOqYgD z$JX6yi=^$FS_{dZKh($cr*)(9k7{@7pJ~{hYr?gmFG|RUjp{Mb|a%Wjhj@c%~8Jy8D=?jUjF+mJjJW@K# zESiE1iM*kY1shrqnX2F-c<3z2jAkkHs{_|s-=rIz`%5z<^?XkKnLXOZ9&4^#)-q-m zE!!NgHrJa=$G)Sp;x03ujf@NBq(W?wneprorR$pS=f3EMzl zOaU{aq-H5kSWHID;Jf*EE(h0OTQ)B^crg`Bv-5YQ?A(LGT?`yV5<(5J-m_NfMAKk1 zY~he)?B#;i@Q!v-cZP)O2v|AXvljs$=R*(1h3}kSYHG~%5a0Sioni*Z6GnCAAIX@E z5tW?2MQXtDk;<8tCa4(rw)GH&8BV|o_h{PxO^KZTq=q4qgN-H4LTJNA-4KO(W{740 zXUxZ;%Xrk8!Ki5Xbvm8@us(KOt<&kx>1g&#l0xI&-I+vwKl0|LTjD&sfJ(bFXn zg%7YO0E|%q`z>73-r}ssY2-_=f_+4l1t3C;U|OF$IE5Xe@&s+nN+=qHL_v5En4uT8 zjOliE%0l*jSvq7@9X%wcWP;S_tucLA;6{%)F0@P=L5(R0FH4uEPx$BZMr;`=hp=Z_ z_&BhV2Nl4byS$y8DhFDoVkWff`E_}*c(1NO<2|2}cMPuSs6?LG0Ndc7)GS*OBW6-z6ONT6RkZwPK*nS(RQ6p=Mg>2K1C3DYiKa0z?>rxlLQ$ zG(4`4H5P@S2UP$uqyZW!Oro~^_oxThVl-w|2Zy$#4lmX-Od@M!m>^a!Ff3kB80o77>rF0-u|@ornHEN!YZ>L zmjJp&6Jm!*l98*?O0M+<7w|T3IpoFg#H%52GWnKh2c@wsgT;yOY?eOdEn+5CW%D1= zsU<6C^gUL8@7YhK#Oyz4*l0Akwz%2SypemTrn7|5`Y&P>;t)EH?TRZjMkMS0<8%rK zwLY#M#rNCYf+PbfknDi{R#8Yu5%C`J8w+Qa7em960mSePW~7eVb%#d4DnYK#qs3WG zFH|;i^EcEkWd|Tfjkyr_4IL~?wc5gE`^Bndt#BRw3yn=NhB(6>*SGIh?585R zglCX5`>@7CO-7kF)T`!D+WU+?A|!X3t>}i!XYV%mz`53gb{ig(DEy0wsgGa%z5{(w zsay7Lq!MxnseStOYC`ax^7w%s?0Y_H|A@_yMe z{5gpam9j6YKs*5@u65?ZKj6)AYf1|)ifma&wT3>?x7cu(EwVOz*qZc6@Aa?HhpRBt zsvo|@K(IS?AT&X^Vpo=6l-5|7D1d~bJK`!Ll5o^H;!Jk%v!^c*amyMbbrRP6S~JT- zI*qj^H%tu(nR<$1B^JtrH8TJdyMCbl>o3p;=3{=u`|P|df{SC`P*%~1RvNMB!&lT> zyY6U(Rl(?0uNQQNtPFeP!#bKhLG58Ux3Yefw4S#G#(al9PCZaH(cSCRZu)3(2HM57 z1@-`4QSDgzAcbYmp4|cwe(kg+AygWVumA}y7R6Btz{drea+_PP?b=^Tl1OAEUwAv5 zSow!!;?-5C*O);b)eV9s%40Nk2V#L9aT{3`H<7W)1{6&(I|IYn&njiQLT*6{F+t@X zC3RbKBMO|fUN1wyba)r50g*Ltm6EZ-N7T-eW(kM0hJ(nF45Qdm+f@(K_vvWf;)0oj z@}9rdwO!w`8&JP3yBo|tZ!1POeRGOpj|C*vjaH1n$kG8xxc__!VD-w;c6MT{!gf$C z>nIwG9gU$jDa4wUq+(_V^wfJ4-MUmrX1*yav0K3A3S1WxaYm-m1;HAtLEy(iAE8v^ zp~4oX&DKmq9H#lDONJ;OrjDf)z=nBn44KAdQ(FQ#u-l#ySsN+Fj?5}b$IsD|(0y2( z6UAbGa~-9G+IbzZBik2o2?NrGEO8P1ENIDwWL_ATq!H&#I6&i?i$cWKyhui&085wC z)65ILg;t+Xu(?LiKALeE^XYlDrY#y$@?hV}D%@Bhz~{stVFAA5x}K_c!RirGEuoAQ zK;H9!L;(k`#b98w0bQKK(~Taig1R6x?(AWZC?MSng7qRAa4WSp43f$2q<;2Wt`MFZ zdaxQInBXQ?Cs^ZHTM>h6-le`AMMnZLm%b*o8v_M3Ag0Ia7~&vZdARM%5GtY(i$RD2 zcij4y%H|CX=Z_KB* z_k%m|6S%{l4d@~B#Hb@ruHPh~xJ@Pr5HbzO#iX5RL=~uQeuLPWU@I^ai|DXPrywG- z*=nK?_@**MOivM#YktEVWeLqq-?pB?WrM||iR11B1dj(}Xk&3jm#;9>WvQd^;+3)= z2o2h+gt8rQ2o%E(KPz{)TA>Y4>Y zC$yH_HYnAA#Ul7`Sf~jZ^0?K72zD`VyE5b@PGxT~h;60dI>ni&DqV?F18)CwUBfEu z!0dWX^C8WnSq!w{GbGsp)rF#MCKDWP8N5x_g8Ug9&DL8&!MVVT@~^=R02cu)0kP#y z+eL$ZBCNH~tmXGBRlHpFlLOn5xLQL!xH7KWxE3MeaBO6U|N9@1R{fXilvR5K-=5#q zxaqE!t4!z5^2-GL1=!d-;FQvgarkgrgj~|V^9*f30v6n~Xfab_PG>7q5>DE1v#=dg zA?}Tq#9(aV5JW>FI_DFTr3Df~@HjvPXc5Z{uL{Gb!{`L2uzk;}x;-I8N8}CLH!*0? z5W#Y?Uu589ARRYtK_je4y}Rqx@&aT4Xvh<+iHI(?aoDonVBhCN*RFZJN;CwZhH5B3 zhv<+E#wHPFjN5?t$aaJ_r!fOzJ2oEaizrq%WKyaCGm-lej3iEmmTJ;8dcd~hsWzAg ztH!YZA|^K~bNDl#I|25sPzn*i6|0rFUqrs_G_I!-pptu8@gN_w6g~t%tZzV1q@D&H zBki%qA{_t_mRD%Nmt`1SUktZcwdX6bh)dKpIsxBQa&(w~gZb}V&6b=_W`f(dZ?Sos zuUc&tH4L@AsjDZ0yd1ZF3$kxW?ROxq^GysfbC3KeLK2Taaa z3up>sU_~mRAYR}%46u*z)3Mbm$zN;v$G$Yf(BvA_UH{j*7Pm-ZIR`k%){qa-A*^EJ zXR`!$2%Aj45M%K5)0zk3ANi0hNo6?ueO*IcNR`oWI*b8H#f2k2!uA`k6^M{W?LqnXl6Ugz98beXJ9}!rAdUrW8abqcAh1Lc5PPU$jOnt7>z~4+HM&Q{)NIcq-tg3 z)JPQJ$nSZ8C^kdD8!jhw@uI7o_=fU6OAYDwlEeSQPG_}V2=d@8_)}2y=9LbDY zM`c)8UF@iCwt>UairRbn%jz-pkd!1x7C$F5J%5t~82>>KtPh$Sx=n2v z0-2O}3`-rv5s`(*utGAx;bj0#^;K7|biRq5iRt&dqVGqcNmHka8ES%m#0@vS1z)_Y<=e?)-~Y9oPR zYoO8l8$wF&k7cFesp9QdpntNiJ|k(J;#roorvaSwxTY_YN9M%If_ zuv1`im36w>Vcyy)lmaKpK3LQ(_N{J-M&J32;D&wTh7DXetcjDwQ9JI(vxa~Q@n-ZA z@k0h<Q+H5+P?DCGbW1 z0MYS*9Ll+Cep_6_<3xluj=`od0=dKOxY^@LRL!S+LXerhQ-iPB91sZ(iH3#=q8c$3 zGkd16HV4F5iE4!9hlhDA!D1fch?r;Vi5dyyl8-4)U^~JAG!I`T3~u;=<`IpkDnp?2 zD+=#M{0s5`r<<=mSVRTx2*RFBp?Jb-G58P#Bd{R7%$}f$Wm)(JNu+DvX45WKRdM$e zovChOq{0Dlp^lFtA)>CSVZrBWUt9Yd{}DRrhDf#~RvB*Jy8%qpzf9=er)FG+*hU1m=EYA2@L**=8^*Z>xB zaCYn;IakP@{TFo`K40?$)P=809ylOf51*iMnGt?-*X*%_RtuaxKi0?4TQmjICaKCL z)&Hd%q#F_~^7h=TG44K0L*8?bO6TFn)g&egeBNrAi~K@Zk&q!XxQPmZ6f`v@CAWW2 z&rr1bwtlioffBksIIr>5lCb7Jk{M=lK;aLe_3=9s#!jdtLIR#aaYXkrTx#g8*=HjQ!npUz7A10yH%X~l0 z7%mo5qKC2o3g7AV{HY=LQ+bw->XdFWgtC^MQf9PTZPxQ~^`u^78m^5!qm>8dWZBUoDPAr4rB z6emZC!7MLP=8<@TuG^;=w+OPTbowJEs!O8Ko|2fdj3RaZAqilWN7>=3w7-(NV4phS z#(NGd5S9H`NYbCqN}pjXO5;j_G`DJ*m2XxJWLU>mI2dE_%Ze<*A%6Em5#f^2OQkLD zU{_&-?S-KpM1uIJ_l56LZPoJaHTMyIS3;vsqR=q+_IqOVy8#+Xd`%MjiJ@j9fw@jXV<-ULL z$l^cS@PFPjb>4oHQ|GOEkw5SGz!z3ce&7qOFY@O-hwg5jJaqRn}D@Jzo?lXGP=sQOBw?F58==8JSJ6in(f3(rR_z!&!t@*#y z&|hh6eBGP&(O+p?SkeE+tL{&K`16db2AkdAY3NUVx|>c<9{zmcxC>6VKi9Co%+MeD z^zUA-zsy*%#9wC6YKgzh;QC(vGJ|_d{AEU6AN$LU;T?s;J74@SGdAD7qcC~*j{RT6 z2_OFc{*xd6{sG&%I~)H}#{VUk`|FP81U)53TtJGu8zHp?{k8ww1SaG{Oig5p93S1hq5kdqKJ9~OsTQ+xe9yr<2 zx%%qY?iG;tzH9a5z3)0G1=A}RO~?JonEsOMHFbZdkjucF^QqmmPflmZlq% zvtR!5qf)TF<^Kq5zjyJQHyzQOG@Z8c>zTh~3V*4@UrOa4{!hkoL*$0YgT(#$WF8B7 zEab6}$3k8y-_e&;o^J0==0-cZlZB)7F>^(GS5iBq zqnyla?O2!8R;%5}nZ+&1)ctB#xS_odAtTF+gJV~=SCYbh#qP|<#Kw*RlhK_FzO!>% z(tBKIUs8U&z3hZbhmy(dO~%L6t@pJZwPa?qPNxpg(1T;9&RzN#IKhoC6`z*I<4@Y% zSt%yT1=GEnlrOg%W5tR)q8-;X#y~Q1oy3pNbaW-<=h}7pJqh50$)X7rwS977YsbBx?c7-ZZqTKkI$5Rn%D$!L%406Pyzuk)B?HeN+s<<+ z#WxgRx9ThDYeK6N$&Wu@IQ)X9>Z|{RtM=Miy(iROJA3L9&!W&~iDyx`zL#fFxVOZ! zD49NQ&^u@SD`+2C-hb>*boz?^_b=;zYvILSLF=9(ntbD4g6>eKRH%7E5ozk`E+1VC6vnn!PwJ5%v|q5U zsf~C|DBWo*x&G-*W-)VrvE=?@gHxUml|kBUDtZXd21Mxv{gq?FGpcIGl>EGqmmN&K zY>4comaQ`@OZInBZCpkpH4=8rkUTOOr25|B8iqHMYHIfIs$}pHd+E(Bf>J63JYr*q zUJMt8kNx9OIhlH*xfjnhG@CPhv4C_HL772PJF0EGL^HX}I-nt4gSo}pc7s#;r$Wq9 z8lO1{w5~}FObSS02>mthLmFS#yVChb{ryoKLiq5I1V;>}ak`!K@qj>wBlCi+nMj;TIyPq z^5S8h?e8a4l}`cZO&V@0FAnU zFbDczbdXD7h`|UYg*l_d(Dwl~=bHQnUt97?4rjUO+^_O-gSiFR5VHMD1wJ;!E9&@1WVWydsuqNgsQHonGL}> zrf_DmH6Jbo8>cG`|JWp@wvy=H#a(nC!cb;B4ZEnDj(m8azCNN3F6JbuTmJ?e0W_$F zLP0-MLxq$XM3R$SW~=e?2`t68`Ho-b6nuPZ5hOPT;3p~W3y`^poNyWk@a_m|Rkdb0fqxw`VSUW{K}CL zAmJIgjz4S+y=cEHDZL=lT=;6UQ(O8=l?!##W>R+@#d@6$3g3{%8r7$ZIV&$vyY`?M zyzo>yS#M!aPIH8aDLbc{%TbTn2#ev`!nY);Z06ML6i$W|xkUY+mf-PcrSRZWs#(m$ zXoz(ypA-P6BzDUFmViqOx2vbD?lmkdNG_9;>Jly)$)I!%g2WsTHh1YvOPQvXS{*#D z1~oH3qevOA2X`eGZ+hoQ%N7L5`fW++NqsmSZVN{!UNb*n0uAqV#fE-p59g78b*g&g z)V>l;MBcBY-t)l7j_W|-KjmJ*t5>MIzd zpU?uLGpXH9mfC0GjpvXr1=QXAVyYyy1q&;KcEj|rhd!_X6ZP3cqP#nM?*e!p2=E}i z=B$?kso)0?m>&k4K=AQ7&7|60m_4vcmK_{xF-v_4X@d>bu?A(4zI`r;qLUxO`W7im#?V}( z#fz)LU0Fn)x9i|Tk&3bO@<&Uc7GDBb*`5IL##T=D;VNwVpAUqv2S)b@_ z?owSyvka&ydCuTejNP}_R~Sp49JkT+r&hE zJh&0ed9hYBig-N~soS!uA=TxJ`{aqt-24P%HfX5UV-EHuf%^K!0XDip9pdwDi{*8N zpiP7+p_PCpmaR{3?yiS{LDrSHuE4>cVRle+oPIPiL4YD~ew2txa+OCMJ@8yGop54w zK4CdkE-{|=wHPzRSR9#j-HZtJ(+@6`IUkn0tTu6qm>uv#uf>bO&omUTZFcL-BwGv4M$k8 zx!ekwX|fQFA9lf#g;XY%)3t|R#AqCEkCcV*&Kyn;{6p%BnLZfIvjfJW7$o~oSOsN1 zAU^o0+@;yT=bWm8@2YwArj(02=my0wbx+&{;|X-K!6cozVf8NOeo<7fucmCU!GAXI z+@@<&&)9-wRHx?Mv1iO-&*{VQzPXOBCH88}^drW<=_&x%o7XjHm&>`1A@7ufOIBx0 z%}a(xiKi&%#&R@HO#NI( z=M{uVR?eU47YM>kS5vA5M*BGTy?1zC@V1U+siP2I@@~?sKYX zmaKQQ{zwWhIO8cvnFd;+cu?U{^-#A@uheLtUTNi(ih5FI*x&K*v`Kd$WAsF&IMRYi z(^w`U7N7VBCAi6yml|Kiv(#CTo`ZXu*I8MG?jBp@Z^1=s8{TwRNM9ypG5^3brn^<& z#?dyjKCr<}TL3w~VpZWNrV-tMY8x2P*PbF>YWs9?Lh{g`juK@`ZnsJ0g0aSgMSkV) zbz|awotCVg8TqncuF*81U3Pk_#x3b%vi9ZXz7riOkmyz5c2U4u23SOBDR?z;R}2Zo ziX_XaA_5%dIiy&iE)(jo@Jq85~3Ffbyr-KNvsj~-ZZ zTd?1f97|q0({yY|QkfdGC7~6Yk9OjsnwRdYV6$%-+&;MO6|8l^WU@aMwsze&5&Euz zdPck?oFguLeGzt5{q9zJvtYrRp84HcsygW>F#B(abi?*J!!^BrASj-GM?+se+DyG< z?&ks+lRV`Vy?8+MFH4$`xD#hPz_e}HM3w2|ez4L~n)x5QO9rTz<4v%)LL9i@Aegy_ zCEQyS7>HSbp-iJFARb{CLDjxIlQGlpA^dg8F%Jtpe)~5waTu-6Z@~$!bMOmh3MXm* z)EAnle@<=Y3KCk-v!&ixB!|SSjW)98(?J*^ z6J!e(HtW(i*d#@m*~d$zx~i+r*oiW8sbH{pvMJSly=a7{GWa>A%wSJ#*BHUXQ}rb6 zm?6YI3Sk{+O<)d!9pzOQbOE!`NScl{BM;RN4mACwz5dpeF$VAT0M6n}45Tk6xsO@# zkqL12)(|2?9?M-?*Ox-? zN|$(|IVE0{XgYGueG5WKDjiLb{y75%sTiKC>P8lhF{%t<-{V-W2+i$48O27JvwOiS zEos$iL&R@S&PIJ ziG^0)f&r<%Jx!%x>W?VLWtRGop*bQJb##%ELHL42Tx=UXDQo(~EK zX2>v|26~6$(g<+78KG$=YMpw)olckyX-{dS@Dl~4=3sk?&~kAguPXk+qYZk7f#*RS zoa_ma^p<-GTJ}Mf^l2G=H5vpoJjuc{5#v@=WgnbSaIfvQc`8?$sRXJ4m3C^ExqK0Fa1=EGRwT|;h)rrx|m(;me*xUUnbt$g%w#OYR0a4&iF<;?%)&g~vphDTXu&Xe!=(nxW={9=bPNM{VI?%hAhH~` zN^d*II!!EYyw}}BEg7%VV(~npnm9W=9Tmj~$=Mkj?rj`686%on>@9M=lEDYsI!goA z#rJBKIV6s*2+Fo`MeQQ7Brq@(`+7m?gJJbR%}ij*yVHhDTW8{^(K{JDDD>@NuOPu6 z)inqRsGrk#*cea8bdt)!Y0{nuVXDra#@k-B!!Las6tD&v5X@O3x9+j6hHz(Iv(#b? zRmnQbM@e>IYZPT6UM}~0kWxBG%SNURlrdt)B3V_vUKy6EkE|(kQ=DFq;s_;#b0g5b zh>XzG&Ok9v1<4q*evD{L=xbb#qZ5+~O6ZDt%l>s`mO@ z%&3Hi+S0L{GWLv{uS7AobMOyc%t%O#om3)ruv&mUwrI+T9-DP)@cIFR5lu8TTPhZP zbUP(vfay3l8ZM%CCZv`iG7?Th^B~zhDiNKN+E1YFw%!?!FIN8-T}l02*U(NfhN4yv zAy~)xKFw!n!|j(~pQUAod0{b^1Jm&IXtKob{A#Hw&E8nww`E{!lk$~`%EX+e;J0p2 zJQJ9iP+*=8hrus((GehP93sdlQ9CH_1z&DG!+0Ta1nTkpta~Y7Az1G`2Y2(OS|EMV zWQo?gQlllFMWd#GXz-y&x38!T$8~mbXX$#vYtg{&>9pN}hRX0!YD@eOCR9hXbfbXq z+IXv^f+QmyBQrZ)c56j&;ln&wHU&VYXV&_5xgHlTR^3baMjlY;TFN%j=_M`9?A_e% zra#i6+$ukGm4G|hlFH%=na57GHFpPX4Q6R42~E>75EFR&4Jgn^3zHY zmMTv5(w6p+U(8I>-Ve^HY!$~~9$s?A>>NgmecJ>n_CxF-6sNYmFk^CE`!qxAS~QJF zE_<52!7PFk;|(2|C^P{Dv$x8Bp`Cc&er2-Gr<#iOz>c(=t9L9nkRrIDkY;95^zvhk zX4hn8FJP}tkkW7$H7t^`k6O4wD0N0waMUa~EuxK_sjrVb0zm>6X^@virBrdlA}(r| zIkLsZUhX2@I~a3WyD$rHZlQ#*ik9&pWTIiVSxMzAt^k~$fIt9FC_>6E@kN-~R2o5@ znTDY~x+>i8q4bLy)LtQ1I7yUZ?LGQ97l+B z$2GV4V?fIu1;O!JoO1REWYk4toL)Tgsj99WbICHDl#GnT)HIM+ym68SL3z#dMwU&P zc|efYz)mU6<(6_9-BG=0krFXP&;`t+lW!YXD0YP+e3+_7ybwoYclOIucNx)nxktb*5C`N@BlMKdIluS=Z#m#2-UL4D$KaaDHiO z<~yn>bWPtQ+Xf=P&BHINhQ>}{V!ySfJ)QCry7Zd%S&vGbz92Ml+qdgyLZbGJ&D{9W zE3q>2M*P_NjaNObSFB}v1T8#|x7rVEnzjbMT2nH9bFtdkx^B3>GT?F;XNdG`zf;aD{EUuRzs(Iq4}Nx*Uk}wc+hwPI&mH=S3Ei!@kZAo= z{pQiv?3EFxt=z(XR)6A^cfVT8FV$cIb<#su=JE~pgI2*MN(-r7DPZ_noA@hUOF@Gd zM-adg+GRp#^p=WEX0B(N99!x}o1K?dxIhwt_1e*$?qlxu_K}Q9d9Q@-PDso;>(;Wu zsm~Abj#rAi0bIh*3d(s~61^2c0v>8a1TNdQA{DJR*_a~E^c*WQ_MtLZ9~N>zz0?2> zeT#RqhT}Kc0)7Ua7iP~1o{q4HM>2)T;Njvxs@2WzNH^A{xn*0%53%pBdQ?m0G1b1* z8N&Rcl)3Gf=D2|!9Rn{yLNBhRrs*QdLxI-1*pTFEjoPTmK*}?PWsTMggKkURDJxr= z;P=`Vu9dGACxQ_ND}DlLDP#ws-a|TFgrLPuV&j{6#mnUQVVx~6*_*!E*2vO4d!1VP zRqsM$Hwn$a(Rp1)Dn~9V%=_7g1s~)gLoX*qHJ>F?9Q9BM&`Cc zalj$R-d$r8yFq!VKBQhelS|B^0!sWbu+%&)@+X#OaG=h8&Wrl#bbrKeJcj^WWXxbu z3XB`-MU_nc4a@CQaMEYZ4#$_-XL)(!w1OlV-cU7YJM1yNO0#wP?Qn=Us{~e?I=Azs zdn;f!>-8)uVh`s>c^>RM;;6$Lf0XB>`_5?E=fcrH*{;{xT>R$G{{6E2w{r5gnJtd& zEb8*Rxi$XXtGC>Ax#=3SaZV_CROC^SM@3$Eb1M-JXE-*?GD|DOQ#d4A6GbDp1bs>-P< zXTqEbb0*B0FlWM?33DdQnJ{OIXTqEbb0*B0FlWM?33DdQ znJ{OIXTqEbb0*B0FlWM?33DdQnJ{OIXTqEbb0*B0FlWM?33DdQnJ{O&Oa@P$M4T3=3UQ#zgaX1iW0e0%%4Wa2b? zP4|gvJl} zOmA54-B&k8I`yV=z3y0ZIa)6X9=Wky@36j8eFyiKJ~XLZsHv%2cQWu@b(?xxrwf;9 zNXF&e!s@0M4Bw!^QKNK(8V?pFuXI&ME#dX$C3^?)_>6|MzGGif|A~LngnHkqOXK(H zEz6ur+jU8Aiz#Y$963TCddDw=bvyRcsRpz6GKUuGQre#DP*rjPe!gQ_E{6Dae@R)JSAVrBGsg@zpmlQ z%3U30O#?0TLi**_;hmj&$G7#8F*Oa0ZZBdtM>-Iw-4G4&n4 zOE8iadTaiE!k2u%$&LiA%@T^$?QNa}8N$=z?n{)}eMKa63*108hovvA22)*9CK%sP4=U~!%T&M8*QX&bKP)e zE;G4u-et0pP$+S)(VPq{m|PlG%@Q)g@0%-3>+<6=hv1?3|EaXmFay?KKWKpQ4RO+6 zKjmQTQo3G8G||Ll_Z!+r>_){6%fzItc!m&sM5F>n#XWt=+!4iEvam)WBvWiLFvwF| zr4Vr>q4?2R0RkfO=`WsiSr6-QPu9@iE| zEuhZU4GE~asDdM*Ta7&~=_Ly^{f>jtp1mgBfG508>SqenqH3vOa3Gnx+oZ#%hiVoC0w5D@5;U@tVU9ooE%KfqXqpL7qT%0{ zDK+`B#frRlo5mr1pe-C=^MQah<1S_=+J;NyiQA;Q4BHD+K%oLk*%F9e6K}LA(}UP9 zH;N2XvkrX*@2WR~UBg9uNE;utL?0LliZHw^B5&G<+6(6vamr#E@N$7&*zY#s8evRo zG8wTKp(JO^Y7*kF%jm-Mn&OBf325D=p7TWrSibkwvX^+bbR&$eOP{i>8t1#Hi9%a1JkJJs1V_8jQ z5KLGPZ%^VI$ho91&zOCnv_AX6hJhxWALzN{SOR2_hZPL6Xs5aG7VCC`j-2zYbdYUi z#|I@8!Vs9Zm|F$BLqq~8zGPs{#iyA8M~(ui>}VmttY|A8HJB-{YT{1glrCd+ne{m_ zX4FDPlfCxWhX}}sRT*TpdDIw2Ln~fy5|fEFg{b|C)6N~Mw0Rm)Il;TPA7~9 zK*XF7M>%CvpH;?RBEia^y$MYmP3=#uQ%h7KDe#m(Ck3mPCJnYOm{TfUSKQ{Lk;%(v z6vts%h|dBA2g0ZVYAq>$Q1ieJ@|x!1eoprtS=ZuGc9i+7#!?=rI;JkzPf|HZ ztSOGWv4Xz_G)+0lDn+G*vdf_^f8QwI3{1#qa3pr&NG?&HwpvvrjWC<=M4~B5Tg!UrC>M{o{D&D`W;b$DH>LdRJ4ReVBl8GFN68q2 z2a7bth#nNQ6EcM$<4X$jVd?goQL6 zu;O=}aU@3?99vt_E&+pPTw&!1bEG9n90}X%)Kjzu2mT}Gu?a^qDpbY$R>PAYrSm4E zAZM58cBvw(ua%i)s$QdOdF(b9d2*Ijov!e$%b&dPfy z+9+5^Ia(%F0_>DpKw9zJ>k3m&qgeu^6;to*9Cv_H#1Ew2EujhF8@N>_SuMdVTM$fK z^GitxCKbrTH<&lJxOA&!9-%{N(3{lGls+^j&Vpb1TCE)cr_lT@CF;Cv>{9R)mRMZ4i*xarfK!#P>V=E%;;k2#EY>vfj zMFw)Iq|{`@AU&8aO*F2BCj2P(ti#4ZDFRP;GkPRHR%YaZx%1>j#sQZW%b}O>wc2oF zMJPV9n1y7}8pMdR#Bw$hWGK=rt|nf%L~|E)%9NJ4G`md}>9U8V4=N#m%b?ASdIXTm`+|4|Jw?P06-FJ7ui`zwVFlNg*{n56O3xC zwfWd{svZnVZhXupXO|2&(#gtODIqAlrYIgW1lcmq1%%d|YH~*L1~+W*fRMqG*7C1X z(K-_^1lfW}0+c@v6_MisX-4@ZnzVf(B|{Gbw}`cEB20s12g`$tJ{n64X6i#Ek2J=f z5^0elgEa>sDofqqsv0GF>0&8Wei2#kwz=6dY2wEksPt{CzpXMPsDlj!9R&fw8puV8 z8qG*j)rExGve?`rV@{YlV8AE*fgO^IrBwQhoNVQYGek-2oFu6u^7KEixy6i*S!WF9 z!lexcpRl2(#(3^#a+%2^T~)!8V{UZEwv>OMgEflddb61ZAGf`$P0sE3R31__WM#2* zQPQ)W2QmTjpdhML;oJK_OH+tYWwzDOFpufC9!pFeiBUef&8w5{w|?c0 z-T!R&@O%5V)ZVJQe{sjv*YilF^s;NFJJC+yMK*^hb^$} zp1bQaVZQFh+*NloW4T#$Z1eq;XY6SoI=*fyOCvbz(c$*7AE-I>$WYDAu!WoL#zeh# z&#%`9+x0ir``ZmSl0DF#xmtZdzW$+e`rG?2(!j&-=<9Fq`_b9D9nXXG;H-qiQzpB^TXWzM@W>p$B8Jb(qkOu>@ox5aLGwN<8 z0;+xIog?An>jn*NEDT_GVq7L~`u#9kYlHOgmuj-{`uc?BhO?nDUlFc)xRQced+K-U zW9^maYyIs*uNMz@%XV!+Xp!B&vEDMg!7txkA1&e82H~StzX$XkK|8WGSQ5Y;M%grh zHGADG%yw*Z9fC4d1Gy(Z-e)~fG1<}Nmk2$9G^U+axFhIy%$#l~3Z5pHaMLmrbLa>N>ky|sRb)ao32sD5Nkd*c5{X6{Rh)6B1g z1+=5DqlwLRA?;qdbFD&neBGgNJN@i={hx2Vt={K}Kz}@#x%=KV{q5@q&Z(L9{yqmu z%V}50*|GMLEgZY5ek7wHS^C@W|9P!}+FO)VBCo%F-GPvDbz^+I*ld%KJFl7tYP|3L6`rCO&4f0+Hl(qAK7}_zrOL7>6>?-l%^*s`HRi%fonIM`T76&&JC~n z**p8r;D2!Vsm+i4@W}esr#C;LuqpJ^X+HDCUMl41F)YMy$H7Sqa~>gvclHL&m(DyS6$g%HPo%^yJtaDabo3u z&ob(Xcd3R`nU3w!D1a9q)WF5x&=yI_fKT9HM>8S|7oWGb)_&L^K zd|YO?Dj=9;f9m!+Ofo{3y7tJDW`Rjto6NY%Ui^Z9LCnF!;*{H|t2Bz1 z5(QW&ECzaiSEOpoS8?`M>5vmFB}J``*%0j<&zB^ESaE%>BVdQWqh|Xd&6-=#6(m>$ zSCZ+@j^2Rg5lwMSTZ%>vazFVuer)}u)b85DFF(?l?yI?X#6p~B4=NxY*bFhJL&Py`o;~Sh+nRl-=l0Rfn zPQJ`G$u{DYC3%*f78NCzuX~+VI;P~T{IrW|YHgBSK8XdT;61Mqn6P9_Og2xRWy?L8 zoHDW2KKiVzWDiQLbRr0ONnV`WC(pF)38{hw@^ST)*PLWu+QmWme*VtAs z@&RWTw#an}$J&Z8I>8Pr*ilj{4$q165*w}5u;vS^p&+FCa`aVlQcqTr9gGZj;hnp}l1D zp+6B=8axi9I7SG6`YkfC{Xgp#jLa?Tr$BM^SvrJ<{;+>!0t>Ss>sbRiHQP%Mi>**N zy}JUGk_Hz%?sgl)4r{1Xkp)M9ePT%4Mk*27j?5=}Dzvf1QYUbB>oY3Shac9|uutX1 z9*UX^Zb{s-ri-JTTf*tf09agIc~on^@*C$2Rw@{C<=$W@8D*_h!uPZYu^V9rbLxcs z+55!upK7pjwlUo~4@xYw+ebcKoW8>GJYQ7x`=!drM) zMRDATbMYRPn2lGcG#?z1NQEvA1Kv{T1ARJ_SBpIBv}f5C;gGsMcX#i2dJClYGA?h| z{TH1x-+$Bx_;lJ1Ip>XMjtcGr&GE`>u%sP0v(F*^rt{-5Jp|Q9 zg>d+KUZDs@-80z%%T`v-Lg@q}fIj3f!v{R}v$E%g1LBj?Iel0tN!G2O6uEOIH><-V zYG^3JJREe_E8>Sb9uC-i@&>x^uXQXBCr#_+d`SX3A}D7%RbT)beZVI)u*&+u&9D?4 zTaMcEejHn6XYMUa<%Gncjhtcy4|!LvU2f{VjHe&fnH9IoTINheRiV~#j>xeNu_Kp> zA_r7f9{W9KZw^JEXI*g;g=rcxfE+D{6Xd8>i+(m;_F-_@kq_(tN!7bxgkZ|704~n27aj<*X z)qEh=;ZTgdZOuE{%ikA_k-8jQ$-qgqC9m7-@6tl$ecJe5uLz*o5XK>*BvX1XP-`=H z<#UeMpX-oIZc#3{8saqr2j6&Jk03L;=-MZS2A$|2L1_gjG%N+va|5w@wg z)V`ya3d)j?AruTKM}!5ymXe+$c;u6UOZ=$fWkmXw_>{eH+^&t7i?Uh44+NJ}80XWc ze6Dv0Vm0tK7#0ezVH^WOLcK1hu>3|SY&zbMR9p2V;g=67;g#XtPtkZ)v~yUR{4dOo1uW!Nfbhpj*J3t%L;-cMk#4I)C7*hIV&q|<%7J>1827= z+c^tn@nO|(uEy>E_J`EW^CHWUAV(;s;blrbS3zY7KC}s3e7q~qPATF0+hhP`0D8x5 zW5iW)&QuJX&=roc62wBx9{H&=sNbr7`VaLCP|gNW!GfN15hsUL5@WpsT6y;q3X~0% zCyq+^%Qlj002>O&2c7g>5@jPKwzaVCu)%K43&KPqhf|#m{gailwL@5`!VD0Fm0U2W zBxM_>Y>~_5@Ei(%K3K9$sctv-q&DXsh%L{pteo*L zC#Ms7RTpP3TMC92P2I-pRQMLZseF;XSb%z}1Nj~{OD|_(iEl>OTsV!bP&+tNcoQnC z7(dveyw1qxu%VYnHrKtfDN{W;%$L%w!`NVW7vt&@QjKMj-YjUX*fv}4fYUGYUltde zAUh_h`pRDACOHQ>DiDXhQvATq37(YET-hPveS$5X<$YgVh7FXlvd@t^ARMAj`FuFf zyXN$K7Yd-yc&08L7UEVwpdEakGFA?1c6p2^Gx$Mxd3RQl5w2-Cpi$;V-{!YieiC4h z$VZp3Fo-=(DcdAoDZmV{V$ckeb3SZr@|zU4)3BrYM>g8CR3`EpmvUOjPbDQORObfU z<9=VOB#ku{vsesUPJV*v<{$7yQ}LTC>QXsX5%Hb{3`CiYKessiq)_k-tv9%O?Rmhl zcaE{E@Eo)3!zJ%?!jDJ1n!4i{3LEK0g5Uk2_%K&_&6l4gLv?g|u>{JAfeng+2NxxU zRsQ3X1m}rTC&T*yHgOewSb+hSRjEnID9Jt){m(V#FRSbyQ-|$tmiv_dzyd;1REqBHnjczShP?VBhCsk*p;4(F>Jz zAJPYOF2G(XFzkus76y1-$rbYl9J8fo)g1mKfm>KoqbHg8idq|wsviEkFqSIJLMs&$ z+j>Bd0xvXzuDsMIQ{^4AA55rFl#g)ya^(4uyy`_Qe6ZqN4X<)5CvT?&rJ1Ep;pPOy z(VtUxsD1HaOfY;B-sIOK<0PdG&8?^z@$-031te0Ty5vW04CzcREY343GM^l<)@k&n zK%;(?T=MQV-%&$I7aSOJDx63DTq0ZjHn!{Sh8`{a0&?VtXrf#$xxg+QmE64F2C(Oj zA5|Zt6t4jvk+H_J35VM`SG7&YHSMrRjeuhUC2Qk?s>aA?wGc;qa9Z^0LGjW)DPA^ygi-k?DoYeX7hRBBq9NPCuJ(Ic5p(o`;<>^Q=LRwk|p3@BmkSbSZ}^nN`Fsyx@orxOC4u$)+!n zs_jqdYUPXWd%JG6hf2K*5)Lh7Ra(sBMG$P3FR@)`vDVp2{e67 z-jRy=6*Ff`>Mnc5oYAlf%EKA7O|vqb#hd)|5sqsVn$_O?a^ekD#PK142fWN1{&uF+ zY`?bRyiiVXIv2!3MIX5p&f+e~;U`EABeuyL6&pd$dmOL4Sevfo+FENJeOtKif1mti zbNm$h>Dyl2dHS}qPxC4Ej)k*3I~LA4&8OIxoj9j+*@<)8WBQ8i<9ATpCs#g6<``-2+-d78svwiWt+F0LI`}_CRuG~K5uiE?pn?B6ma$@Z& zAFv^@$_H%ppW*{H##Z@&t$U6>V0*Vd)8732Gi%P+e9P`z&+w<(n-6}j?~KhK9oe9} zQ-7`&|hF)v-iih2R;_QNaj;veXiXk0#^eSOs_Tuei(9mbJxcu&i5rX=L=M!lUSdM9>T^Gr?}sQk(%gY@lyXrWw2F zt9NF8sjhF&c_|UY!3?6?2)xQIuBLp8^UcHn{XOIooJgW3AX~D-OfdnmK@|0vPejca zaKS$s{7fVhirB}DM4l}~j>So2EX_h)VKIWxXv^9GHWADw+c7j6o#+8uVE?37AnSq> zfhO$rj3S!tiK^xjh2fAi_?M7Hj&+NFc-jiSNRG51@La`P?DjO^ONL?sOF=V3gC!7@ zB#bF4xf#nfL$2uxRMA?}T%0Zgq{*b`5);r93F3@#R8?J&Fm+-ou#rfNa=K-1yiHiD z8Bjb=3`Iaa0~&Q!#cWBkwcw;~Sq2fjZdXZpkRV2gY2Yz(QFMY+4N7v2M7Cu=<1DPI z84Hv#OSj}GBBLHC#^4g)>6;0oNkNr)rW%B!<-Z}t)S7pn&?9x zCW%}$lr-~uG@&qva{|)SMBS)g7-ldaEx0>s4y%ckrZGwb4}e79tY+YF3EZwh>_hop`LMoV~T1*pF{bJY?`FdM0)WvZ(g>sjSu+aNupFsoZkhofF^x4X z#{kA)JvPkB5(#IVnY2yVevEQLJQfghi(Jx#X%LTE1UY;htE}Cmxi~P9W0}F$9cYIU zsc^Si?KyoPNg*J`RL|n5*$mp@WM{HUf6hd*F60zm6`yfjeK9QQcEWn_KH8H=q#qHQ z%)C&RutHZe1YNV@!mr9A5mQ(F#A`Gdv=~0qpRIHmATs1!jH<-YQR0S3w46q91i4|` zBGsd5M7od|L`k!F;Rf4DfqVa$YL=5nq2(EQ!5kV>`S61_w>4T<1e`HMqB^hGg zfv3v};@1mXpfb5X(M6YgfbE)Aa;DH4@%EaU2o5En=*lYuR!~urg>3G2fUYRkL#WO5 zfXy)?Vi8Y7S71m_(=n--OY&9ORrITiIK=71tLW8eBiDq8IV+KcI8|K?jyhq?E&Y+# zEZ^l>Zza(rRK%IW!7?aI1FoCqpNu4B$_%`W7!rJLWA>edu(B!=Q{B`v`$$*;%vJ*= zoGgnHT*XQOa{6U}Dx75*vwEtTVb&6n3|7z;B7dr@L@{8e@)E9@(;aTc0=w|1+n6~* zQgsh5QWTiM=vYWU4X{S=EIO6+6+$LVD;YpT#bNb8W{jH|z&~(fHfbWWm;hy!TuQR! z$c+7|W{_@61{K7OfF140Jw~GmrfC#l(YE>~17{g$PcQ_9`OznfC3F?Pq^D?%$pet& zE38F^61d+A4kJDr-uPSBg=W z1H)X|DNpul=uhUC{khSIJLw zMgTZe%*qbY1sPCEu;W#lfr1h|9FIImU(=A$lG&RGS=;SO!PMPf9Fqikc7_5V-Du2e zYqnH{YDK8kMO<#01l%Zw4mA;xu3~bfAk@wJR1fP(XHZ@Oln9ydB$jI|lZZq#Xv~SC6dT#+>qtp?z~LNU}EfG);D3S~Iz zY8vKLPA!Px7V7Z{W@!LIACymdF3!?mnX5+72X_+Tmh`Q82F&aX9_tntQPuD$%W2S8 z6K-HCjtciS_qE&rXeMiku4!O4J45c(DV?DS<2cn%xR& zA#J54@}(<8GVu|kprEAT`8k3yagu2qExC#!k}h6>I0;YXq+@iobb+MVlmaIi6Ov*K zk4t8aO$EO33c`6EW6stwNfNQa?&~p`_eGSiDWXHVveRaEp3W4d)b& zb0v&YoX82wT_tM;nCt}IY|gRC09H7;LgfMX#pv{~mSQq!k+>M?(`^Kn=6ZqQ#6*x4 z%s8ufr>n3IlMd_`hr3;x4C#j=&+G|M?kXYdf!{lAIpggNj9G72+KyRl zG|WoA#=hht;P4X@WJ|Oi)kP4vuC7KPL08fBqKPXF#FWFLZYOd8B0Exru{}n{RWmb7 z+JJFq=)*3WnTFD?TRb3{0;wl2`J8u%`VJ3U0hchi3mnI6lO;~BroHmV|q1YMC z>CB9VZ%~#~_Wq@hAVn)-W%pjI#2kNLXK&tp$kU$7J(3W8)qH0zf zSX37grHeo|dKi$zSdiDGhCdM=)F;CFuNCLG#w*zZ4SrD`Ffr@N2iy>U8vMeOiJX8t zgGln9pp|3;-+qfc>jnkQJQqG<@@X{EBfqx=k)#xpQJB6o(6Z8qSy#xBpS>k5O(@>4 zk^zCjL@lHY2h_=EF*9nB9_kpNiR4JQm7OLi zGhrI;%TSTSB-SE-8f|v_Q*v=83`nGqi27(;1KTXp%`Tygq-d}N5ZACh7SJZj^4jfI zH0kWEbR|yViMaF-1In0%np!D9iNspPFxWt^2Di|OK~P3lrHR`JA61$G2gM};V@BwJa`hMoL`rKyl3;MB~hL$|Pi2yR1jWL-)ajWr-SADt==pf5F%%i@`? znnp}?m|Lfu2yFB{gDvH%=L*Mu3b7;~%?ZL-_Ww}0vNpsti06cNM=!4(Z5 zMy{1J9E%u>Bx-IWtfE2~`lPCvvpxz#qDCjf3|%2IWx~KmC@=|9npUC{Sq6bu4P`<> z7R5j(6sDmW49ZMQMP0c+0?{3bS%s;-v1B<;!bA0k0H^#bgIF)XUka;8I3iT8QiBgO zwm^d|+=q62C~npgl5Lqe#0m!l28NhQ1C+5Gom$2NWL6=HCo1d+52~Vqn9t~#!3$zw3Q7JQ$$o|a8u#N9^GnKEZ`ItsW zJxWf%0k=2}Qsy#%K1K^epfA)na{!s!vSxU$g#q271$`4Nl2a^8A|82V7Cgw)iR@p) z+7G#zas!(Lde*mq!q~PzsrvT%stR6xb@!pFxQ16ehxZqZ3Ft&NhL6l5*n{Qd$;b{1 z*4>PSDY}Ye0HbRF5mp?4nt4W~R5M7rLP<%3=s65YX~USA)_>(EZtnh*6F=ea?Ea5; zT@-$2w|31%SD*c8{u31X`x8I9uXf4yzSi46Ot1g8lKuw8YJXcP2(0oOyi7dBZ}2j< z%5U&?&l!t$WY43-jL}>Tf^y zw_1(-IihL*!ut$=pdkKrA|-Xa8f^dFy%#GWzCBs4Kg;#EKlE`WsgQf{dbt2CBk-^IPOc4qv1!i#y#?EJ=ggU%SO2g+yygxO*Lm)5 zFZsb`r~G>>-~NFA-pYsn_>NZ(y;1)z?Yw&EP5Zvl_h9*T<*q-ya@mjhW%bQb-$TmQ zJ8pX6P5Sp{{d Date: Fri, 17 Jan 2025 16:33:08 -0800 Subject: [PATCH 17/21] 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/21] 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 060c4bf265f34225c740040456c2d7e1a26d5647 Mon Sep 17 00:00:00 2001 From: Oberon Dixon-Luinenburg Date: Fri, 21 Feb 2025 10:57:16 -0800 Subject: [PATCH 19/21] DM-242 environment spec loosening. Python and modkit can both be newer versions but must meet minimum requirements. --- environment.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/environment.yml b/environment.yml index 5837208..5e17ccf 100644 --- a/environment.yml +++ b/environment.yml @@ -4,5 +4,5 @@ channels: - nanoporetech - defaults dependencies: - - python=3.11 - - nanoporetech::modkit==0.2.4 \ No newline at end of file + - python>=3.11 + - nanoporetech::modkit>=0.2.4 \ No newline at end of file From f0d638737cd709d5818dbe8c0ac4b066264c98b2 Mon Sep 17 00:00:00 2001 From: Oberon Dixon-Luinenburg Date: Fri, 21 Feb 2025 12:45:39 -0800 Subject: [PATCH 20/21] DM-243 Version checking changed to min rather than exact; minor logic changes. Fixed import order --- dimelo/load_processed.py | 4 +-- dimelo/run_modkit.py | 60 ++++++++++++++++++++++++++-------------- 2 files changed, 41 insertions(+), 23 deletions(-) diff --git a/dimelo/load_processed.py b/dimelo/load_processed.py index ad4c79b..bc59a82 100644 --- a/dimelo/load_processed.py +++ b/dimelo/load_processed.py @@ -202,7 +202,7 @@ 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=f"Loading genomic chunks, up to {chunk_size / 1000}kb per chunk", ): try: future.result() @@ -320,7 +320,7 @@ 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=f"Loading genomic chunks, up to {chunk_size / 1000}kb per chunk", ): try: future.result() diff --git a/dimelo/run_modkit.py b/dimelo/run_modkit.py index 298f0e9..4b96254 100644 --- a/dimelo/run_modkit.py +++ b/dimelo/run_modkit.py @@ -11,40 +11,58 @@ from pathlib import Path from typing import Optional, cast +from packaging import version from tqdm.auto import tqdm # This should be updated in tandem with the environment.yml nanoporetech::modkit version -EXPECTED_MODKIT_VERSION = "0.2.4" +MIN_MODKIT_VERSION = "0.2.4" """ Import checks """ -# Add conda env bin folder to path if it is not already present -# On some systems, the directory containing executables for the active environment isn't automatically on the path -# If this is the case, add that directory to the path so modkit can run -current_interpreter = sys.executable -env_bin_path = os.path.dirname(current_interpreter) -if env_bin_path not in os.environ["PATH"]: - 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']}") - # Check modkit on first import: does it run; does it have the right version try: 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}") + modkit_version = result.stdout.strip().split()[-1] + if version.parse(modkit_version) >= version.parse(MIN_MODKIT_VERSION): + print( + f"modkit found with version {modkit_version}, which meets the minimum requirement ({MIN_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}" + f"WARNING: modkit found with version {modkit_version}, but version {MIN_MODKIT_VERSION} or later is required. " + f"Consider updating modkit to avoid unexpected behavior." ) -except subprocess.CalledProcessError: - print( - 'Executable not found for modkit. Install dimelo using "conda env create -f environment.yml" or install modkit manually to your conda environment using "conda install nanoporetech::modkit==0.2.4". Without modkit you cannot run parse_bam functions.' - ) +except (FileNotFoundError, subprocess.CalledProcessError): + # Add conda env bin folder to path if it is not already present + # On some systems, the directory containing executables for the active environment isn't automatically on the path + # If this is the case, add that directory to the path so modkit can run + current_interpreter = sys.executable + env_bin_path = os.path.dirname(current_interpreter) + if env_bin_path not in os.environ["PATH"]: + 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']}") + try: + result = subprocess.run( + ["modkit", "--version"], stdout=subprocess.PIPE, text=True + ) + modkit_version = result.stdout.strip().split()[-1] + if version.parse(modkit_version) >= version.parse(MIN_MODKIT_VERSION): + print( + f"modkit found with version {modkit_version}, which meets the minimum requirement ({MIN_MODKIT_VERSION})." + ) + else: + print( + f"WARNING: modkit found with version {modkit_version}, but version {MIN_MODKIT_VERSION} or later is required. " + f"Consider updating modkit to avoid unexpected behavior." + ) + except (FileNotFoundError, subprocess.CalledProcessError) as e: + raise RuntimeError( + 'Unable to execute modkit. Install dimelo using "conda env create -f environment.yml" or install modkit manually to your conda environment using "conda install nanoporetech::modkit==0.2.4". Without modkit you cannot run parse_bam functions.' + ) from e def run_with_progress_bars( From ec1c3f60817915a47d0e747f8b82806fe3389317 Mon Sep 17 00:00:00 2001 From: Oberon Dixon-Luinenburg Date: Mon, 24 Feb 2025 14:22:06 -0800 Subject: [PATCH 21/21] Adjusted version range. Something seems to have changed too much as of 0.4.0 and needs to be examined. For now, pin it to a tight range. --- dimelo/run_modkit.py | 36 +++++++++++++++++------------------- environment.yml | 2 +- 2 files changed, 18 insertions(+), 20 deletions(-) diff --git a/dimelo/run_modkit.py b/dimelo/run_modkit.py index 4b96254..df36d57 100644 --- a/dimelo/run_modkit.py +++ b/dimelo/run_modkit.py @@ -16,24 +16,17 @@ # This should be updated in tandem with the environment.yml nanoporetech::modkit version MIN_MODKIT_VERSION = "0.2.4" +MAX_MODKIT_VERSION = "0.2.6" """ Import checks """ # Check modkit on first import: does it run; does it have the right version +modkit_version = "NA" try: result = subprocess.run(["modkit", "--version"], stdout=subprocess.PIPE, text=True) modkit_version = result.stdout.strip().split()[-1] - if version.parse(modkit_version) >= version.parse(MIN_MODKIT_VERSION): - print( - f"modkit found with version {modkit_version}, which meets the minimum requirement ({MIN_MODKIT_VERSION})." - ) - else: - print( - f"WARNING: modkit found with version {modkit_version}, but version {MIN_MODKIT_VERSION} or later is required. " - f"Consider updating modkit to avoid unexpected behavior." - ) -except (FileNotFoundError, subprocess.CalledProcessError): +except Exception: # Add conda env bin folder to path if it is not already present # On some systems, the directory containing executables for the active environment isn't automatically on the path # If this is the case, add that directory to the path so modkit can run @@ -50,19 +43,24 @@ ["modkit", "--version"], stdout=subprocess.PIPE, text=True ) modkit_version = result.stdout.strip().split()[-1] - if version.parse(modkit_version) >= version.parse(MIN_MODKIT_VERSION): - print( - f"modkit found with version {modkit_version}, which meets the minimum requirement ({MIN_MODKIT_VERSION})." - ) - else: - print( - f"WARNING: modkit found with version {modkit_version}, but version {MIN_MODKIT_VERSION} or later is required. " - f"Consider updating modkit to avoid unexpected behavior." - ) except (FileNotFoundError, subprocess.CalledProcessError) as e: raise RuntimeError( 'Unable to execute modkit. Install dimelo using "conda env create -f environment.yml" or install modkit manually to your conda environment using "conda install nanoporetech::modkit==0.2.4". Without modkit you cannot run parse_bam functions.' ) from e +finally: + if ( + version.parse(MAX_MODKIT_VERSION) + >= version.parse(modkit_version) + >= version.parse(MIN_MODKIT_VERSION) + ): + print( + f"modkit found with version {modkit_version}, which meets the requirement ({MIN_MODKIT_VERSION}-{MAX_MODKIT_VERSION})." + ) + else: + print( + f"WARNING: modkit found with version {modkit_version}, but version {MIN_MODKIT_VERSION} or later is required. " + f"Consider updating modkit to avoid unexpected behavior." + ) def run_with_progress_bars( diff --git a/environment.yml b/environment.yml index 5e17ccf..296354b 100644 --- a/environment.yml +++ b/environment.yml @@ -5,4 +5,4 @@ channels: - defaults dependencies: - python>=3.11 - - nanoporetech::modkit>=0.2.4 \ No newline at end of file + - "nanoporetech::modkit>=0.2.4,<=0.2.6" \ No newline at end of file