From 76cfd15694915c08f834020390fc2c319249e5d8 Mon Sep 17 00:00:00 2001 From: LaraFuhrmann <55209716+LaraFuhrmann@users.noreply.github.com> Date: Wed, 6 Sep 2023 17:05:37 +0200 Subject: [PATCH 01/25] working multiprocessing --- shorah/b2w.py | 374 ++++++++++++++++++++++++++++------------------ shorah/shotgun.py | 3 +- 2 files changed, 231 insertions(+), 146 deletions(-) diff --git a/shorah/b2w.py b/shorah/b2w.py index ce7d571..92076ea 100644 --- a/shorah/b2w.py +++ b/shorah/b2w.py @@ -4,6 +4,8 @@ import numpy as np import math import logging +from multiprocessing import Process, Pool, cpu_count +import os def _write_to_file(lines, file_name): with open(file_name, "w") as f: @@ -154,7 +156,6 @@ def _run_one_window(samfile, window_start, reference_name, window_length, base_pair_distr_in_window = np.zeros((window_length, len(alphabet)), dtype=int) for read in iter: - if (read.reference_start is None) or (read.reference_end is None): continue first_aligned_pos = read.reference_start # this is 0-based @@ -279,12 +280,189 @@ def _run_one_window(samfile, window_start, reference_name, window_length, return convert_to_printed_fmt(arr), arr_read_qualities_summary, arr_read_summary, counter, window_length, pos_filter +def parallel_run_one_window( + reference_filename, + minimum_reads, + tiling, + region_end, + idx, + window_start, + window_length, + alignment_file, + reference_name, + win_min_ext, + permitted_reads_per_location, + counter, + exact_conformance_fix_0_1_basing_in_reads, + indel_map, + max_ins_at_pos, + extended_window_mode, + exclude_non_var_pos_threshold +): + """ + build one window. + """ + reffile = pysam.FastaFile(reference_filename) + + samfile = pysam.AlignmentFile( + alignment_file, + "r", # auto-detect bam/cram (rc) + reference_filename=reference_filename, + threads=1 + ) + + reads = open(f"reads_{idx}.fas", "w") + + logging.info(f"Working on window (1-based) @ {window_start+1}") + + (arr, arr_read_qualities_summary, arr_read_summary, + counter, control_window_length, pos_filter) = _run_one_window( + samfile, + window_start - 1, # make 0 based + reference_name, + window_length, + math.floor(win_min_ext * window_length), + dict(permitted_reads_per_location), # copys dict ("pass by value") + counter, + exact_conformance_fix_0_1_basing_in_reads, + indel_map, + max_ins_at_pos, + extended_window_mode, + exclude_non_var_pos_threshold + ) + + logging.debug(f"Window length: {control_window_length}") + + window_end = window_start + window_length - 1 + file_name = f'w-{reference_name}-{window_start}-{window_end}' + + # TODO solution for backward conformance + if len(tiling) > 1: + end_extended_by_a_window = region_end + (tiling[1][0]-tiling[0][0])*3 + else: + end_extended_by_a_window = region_end + window_length*3 + + for read in arr_read_summary: + if idx == len(tiling) - 1 and read[1] > end_extended_by_a_window: + continue + # TODO reads.fas not FASTA conform, +-0/1 mixed + # TODO global end does not really make sense, only for conformance + # read name, global start, global end, read start, read end, read + reads.write( + f'{read[0]}\t{tiling[0][0]-1}\t{end_extended_by_a_window}\t{read[1]}\t{read[2]}\t{read[3]}\n' + ) + + reads.close() + + if (idx != len(tiling) - 1 # except last + and len(arr) > 0) or len(tiling) == 1: # suppress output if window empty + + _write_to_file(arr, file_name + '.reads.fas') + if arr_read_qualities_summary is not None: + with open(file_name + '.qualities.npy', 'wb') as f: + np.save(f, np.asarray(arr_read_qualities_summary, dtype=np.int64), allow_pickle=True) + + ref = reffile.fetch(reference=reference_name, start=window_start-1, end=window_end) + + if extended_window_mode: + for file_name_comp, char in [("extended-ref", "X"), ("ref", "-")]: + res_ref = _build_one_full_read( + list(ref), list(ref), None, None, + window_start-1, window_end-1, + indel_map, max_ins_at_pos, extended_window_mode, char + )[0] + + k = max(0, control_window_length - len(res_ref)) + res_ref += k * "N" + assert_condition = control_window_length == len(res_ref) + + if exclude_non_var_pos_threshold > 0 and file_name_comp == "ref": + _write_to_file([ + f'>{reference_name} {window_start}\n' + res_ref + ], file_name + '.envp-full-ref.fas') + + envp_ref = np.array(list(res_ref)) + envp_ref[~pos_filter] = "=" + _write_to_file([ + f'>{reference_name} {window_start}\n' + "".join(envp_ref) + ], file_name + '.envp-ref.fas') + + reduced_ref = np.array(list(res_ref))[pos_filter] + res_ref = "".join(reduced_ref) + assert_condition = (control_window_length == + len(reduced_ref) + len(pos_filter) - pos_filter.sum()) + + _write_to_file([ + f'>{reference_name} {window_start}\n' + res_ref + ], f'{file_name}.{file_name_comp}.fas') + + assert assert_condition, ( + f""" + Reference ({file_name_comp}) does not have same length as the window. + Location: {file_name} + Ref: {len(res_ref)} + Win: {control_window_length} + """ + ) + + else: + k = max(0, control_window_length - len(ref)) + ref += k * "N" + + if exclude_non_var_pos_threshold > 0: + full_file_name = file_name + '.envp-full-ref.fas' + else: + full_file_name = file_name + '.ref.fas' + + _write_to_file([ + f'>{reference_name} {window_start}\n' + ref + ], full_file_name) + + assert control_window_length == len(ref), ( + f""" + Reference does not have same length as the window. + Location: {file_name} + Ref: {len(ref)} + Win: {control_window_length} + """ + ) + + if exclude_non_var_pos_threshold > 0: + envp_ref = np.array(list(ref)) + envp_ref[~pos_filter] = "=" + _write_to_file([ + f'>{reference_name} {window_start}\n' + "".join(envp_ref) + ], file_name + '.envp-ref.fas') + reduced_ref = np.array(list(ref))[pos_filter] + _write_to_file([ + f'>{reference_name} {window_start}\n' + "".join(reduced_ref) + ], file_name + '.ref.fas') + + assert (control_window_length == len(envp_ref) and + control_window_length == len(reduced_ref) + len(pos_filter) - pos_filter.sum()), ( + f""" + Reference does not have same length as the window. + Location: {file_name} + Envp Ref: {len(envp_ref)} + Ref: {len(reduced_ref)} + Win: {control_window_length} + """ + ) + + if len(arr) > minimum_reads: + line = ( + f'{file_name}.reads.fas\t{reference_name}\t{window_start}\t' + f'{window_end}\t{len(arr)}' + ) + _write_to_file([line], f"coverage_{idx}.txt") + def build_windows(alignment_file: str, tiling_strategy: TilingStrategy, win_min_ext: float, maximum_reads: int, minimum_reads: int, reference_filename: str, exact_conformance_fix_0_1_basing_in_reads: Optional[bool] = False, extended_window_mode: Optional[bool] = False, - exclude_non_var_pos_threshold: Optional[float] = -1) -> None: + exclude_non_var_pos_threshold: Optional[float] = -1, + maxthreads: Optional[int] = 1) -> None: """Summarizes reads aligned to reference into windows. Three products are created: #. Multiple FASTA files (one for each window position) @@ -314,6 +492,10 @@ def build_windows(alignment_file: str, tiling_strategy: TilingStrategy, positions are excluded. Set to -1 if no position should be excluded (the default). """ + max_proc = min(max(cpu_count() - 1, 1), maxthreads) + logging.info('CPU(s) count %u, will run %u build_windows', cpu_count(), max_proc) + + assert 0 <= win_min_ext <= 1 assert (0 <= exclude_non_var_pos_threshold <= 1 or exclude_non_var_pos_threshold == -1) @@ -323,12 +505,9 @@ def build_windows(alignment_file: str, tiling_strategy: TilingStrategy, alignment_file, "r", # auto-detect bam/cram (rc) reference_filename=reference_filename, - threads=1 + threads=max_proc #1 ) - reffile = pysam.FastaFile(reference_filename) - - cov_arr = [] - reads = open("reads.fas", "w") + #reffile = pysam.FastaFile(reference_filename) --> we need to read it in each child process counter = 0 reference_name = tiling_strategy.get_reference_name() tiling = tiling_strategy.get_window_tilings() @@ -340,151 +519,56 @@ def build_windows(alignment_file: str, tiling_strategy: TilingStrategy, maximum_reads ) + all_processes = [] for idx, (window_start, window_length) in enumerate(tiling): - logging.info(f"Working on window (1-based) @ {window_start+1}") - (arr, arr_read_qualities_summary, arr_read_summary, - counter, control_window_length, pos_filter) = _run_one_window( - samfile, - window_start - 1, # make 0 based - reference_name, - window_length, - math.floor(win_min_ext * window_length), - dict(permitted_reads_per_location), # copys dict ("pass by value") - counter, - exact_conformance_fix_0_1_basing_in_reads, - indel_map, - max_ins_at_pos, - extended_window_mode, - exclude_non_var_pos_threshold - ) - logging.debug(f"Window length: {control_window_length}") - - window_end = window_start + window_length - 1 - file_name = f'w-{reference_name}-{window_start}-{window_end}' - - # TODO solution for backward conformance - if len(tiling) > 1: - end_extended_by_a_window = region_end + (tiling[1][0]-tiling[0][0])*3 - else: - end_extended_by_a_window = region_end + window_length*3 - - for read in arr_read_summary: - if idx == len(tiling) - 1 and read[1] > end_extended_by_a_window: - continue - # TODO reads.fas not FASTA conform, +-0/1 mixed - # TODO global end does not really make sense, only for conformance - # read name, global start, global end, read start, read end, read - reads.write( - f'{read[0]}\t{tiling[0][0]-1}\t{end_extended_by_a_window}\t{read[1]}\t{read[2]}\t{read[3]}\n' - ) - - if (idx != len(tiling) - 1 # except last - and len(arr) > 0) or len(tiling) == 1: # suppress output if window empty - - _write_to_file(arr, file_name + '.reads.fas') - if arr_read_qualities_summary is not None: - with open(file_name + '.qualities.npy', 'wb') as f: - np.save(f, np.asarray(arr_read_qualities_summary, dtype=np.int64), allow_pickle=True) - - ref = reffile.fetch(reference=reference_name, start=window_start-1, end=window_end) - - if extended_window_mode: - for file_name_comp, char in [("extended-ref", "X"), ("ref", "-")]: - res_ref = _build_one_full_read( - list(ref), list(ref), None, None, - window_start-1, window_end-1, - indel_map, max_ins_at_pos, extended_window_mode, char - )[0] - - k = max(0, control_window_length - len(res_ref)) - res_ref += k * "N" - assert_condition = control_window_length == len(res_ref) - - if exclude_non_var_pos_threshold > 0 and file_name_comp == "ref": - _write_to_file([ - f'>{reference_name} {window_start}\n' + res_ref - ], file_name + '.envp-full-ref.fas') - - envp_ref = np.array(list(res_ref)) - envp_ref[~pos_filter] = "=" - _write_to_file([ - f'>{reference_name} {window_start}\n' + "".join(envp_ref) - ], file_name + '.envp-ref.fas') - - reduced_ref = np.array(list(res_ref))[pos_filter] - res_ref = "".join(reduced_ref) - assert_condition = (control_window_length == - len(reduced_ref) + len(pos_filter) - pos_filter.sum()) - - _write_to_file([ - f'>{reference_name} {window_start}\n' + res_ref - ], f'{file_name}.{file_name_comp}.fas') - - assert assert_condition, ( - f""" - Reference ({file_name_comp}) does not have same length as the window. - Location: {file_name} - Ref: {len(res_ref)} - Win: {control_window_length} - """ - ) - - else: - k = max(0, control_window_length - len(ref)) - ref += k * "N" - - if exclude_non_var_pos_threshold > 0: - full_file_name = file_name + '.envp-full-ref.fas' - else: - full_file_name = file_name + '.ref.fas' - - _write_to_file([ - f'>{reference_name} {window_start}\n' + ref - ], full_file_name) - - assert control_window_length == len(ref), ( - f""" - Reference does not have same length as the window. - Location: {file_name} - Ref: {len(ref)} - Win: {control_window_length} - """ + p = Process( + target=parallel_run_one_window, + args=( + reference_filename, + minimum_reads, + tiling, + region_end, + idx, + window_start, + window_length, + alignment_file, + reference_name, + win_min_ext, + permitted_reads_per_location, + counter, + exact_conformance_fix_0_1_basing_in_reads, + indel_map, + max_ins_at_pos, + extended_window_mode, + exclude_non_var_pos_threshold, ) + ) + p.start() + all_processes.append(p) - if exclude_non_var_pos_threshold > 0: - envp_ref = np.array(list(ref)) - envp_ref[~pos_filter] = "=" - _write_to_file([ - f'>{reference_name} {window_start}\n' + "".join(envp_ref) - ], file_name + '.envp-ref.fas') - reduced_ref = np.array(list(ref))[pos_filter] - _write_to_file([ - f'>{reference_name} {window_start}\n' + "".join(reduced_ref) - ], file_name + '.ref.fas') - - assert (control_window_length == len(envp_ref) and - control_window_length == len(reduced_ref) + len(pos_filter) - pos_filter.sum()), ( - f""" - Reference does not have same length as the window. - Location: {file_name} - Envp Ref: {len(envp_ref)} - Ref: {len(reduced_ref)} - Win: {control_window_length} - """ - ) - - if len(arr) > minimum_reads: - line = ( - f'{file_name}.reads.fas\t{reference_name}\t{window_start}\t' - f'{window_end}\t{len(arr)}' - ) - cov_arr.append(line) + for p in all_processes: + p.join() + print("here after join") samfile.close() - reads.close() - _write_to_file(cov_arr, "coverage.txt") + with open('reads.fas', 'w') as output_file: + for file_path in [f"reads_{idx}.fas" for idx in range(len(tiling))]: + with open(file_path, 'r') as input_file: + for line in input_file: + output_file.write(line) + os.remove(file_path) + cov_arr = [] + with open("coverage.txt", 'w') as output_file: + for file_path in [f"coverage_{idx}.txt" for idx in range(len(tiling))]: + try: + with open(file_path, 'r') as input_file: + for line in input_file: + output_file.write(line) + os.remove(file_path) + except Exception: + pass if __name__ == "__main__": import argparse diff --git a/shorah/shotgun.py b/shorah/shotgun.py index 127d85b..81d5698 100644 --- a/shorah/shotgun.py +++ b/shorah/shotgun.py @@ -469,7 +469,8 @@ def main(args): cov_thrd, in_fasta, extended_window_mode=extended_window_mode, - exclude_non_var_pos_threshold=exclude_non_var_pos_threshold + exclude_non_var_pos_threshold=exclude_non_var_pos_threshold, + maxthreads=maxthreads ) logging.info('finished b2w') From b2f8e52bc1ffaeebf0bceab904748f8a23022186 Mon Sep 17 00:00:00 2001 From: LaraFuhrmann <55209716+LaraFuhrmann@users.noreply.github.com> Date: Fri, 8 Sep 2023 16:02:18 +0200 Subject: [PATCH 02/25] counter and control_window_length are now computed in advance of _run_one_window() --- shorah/b2w.py | 67 ++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 56 insertions(+), 11 deletions(-) diff --git a/shorah/b2w.py b/shorah/b2w.py index 92076ea..8a71874 100644 --- a/shorah/b2w.py +++ b/shorah/b2w.py @@ -129,7 +129,7 @@ def _build_one_full_read(full_read: list[str], full_qualities: list[int]|list[st return full_read, full_qualities # TODO return same data type twice -def _run_one_window(samfile, window_start, reference_name, window_length, +def _run_one_window(samfile, window_start, reference_name, window_length,control_window_length, minimum_overlap, permitted_reads_per_location, counter, exact_conformance_fix_0_1_basing_in_reads, indel_map, max_ins_at_pos, extended_window_mode, exclude_non_var_pos_threshold): @@ -144,11 +144,16 @@ def _run_one_window(samfile, window_start, reference_name, window_length, window_start + window_length # arg exclusive as per pysam convention ) + # TODO: minimum_overlap + # TODO: original_window_length + # TODO: window_length original_window_length = window_length + window_length = control_window_length if extended_window_mode: - for pos, val in max_ins_at_pos.items(): - if window_start <= pos < window_start + original_window_length: - window_length += val + # this is now done intilaly for all windows + #for pos, val in max_ins_at_pos.items(): + # if window_start <= pos < window_start + original_window_length: + # window_length += val minimum_overlap *= window_length/original_window_length if exclude_non_var_pos_threshold > 0: @@ -277,7 +282,8 @@ def _run_one_window(samfile, window_start, reference_name, window_length, # TODO move out of this function convert_to_printed_fmt = lambda x: [f'>{k[0]} {k[1]}\n{"".join(k[2])}' for k in x] - return convert_to_printed_fmt(arr), arr_read_qualities_summary, arr_read_summary, counter, window_length, pos_filter +# return convert_to_printed_fmt(arr), arr_read_qualities_summary, arr_read_summary, counter, window_length, pos_filter + return convert_to_printed_fmt(arr), arr_read_qualities_summary, arr_read_summary, pos_filter def parallel_run_one_window( @@ -288,6 +294,7 @@ def parallel_run_one_window( idx, window_start, window_length, + control_window_length, alignment_file, reference_name, win_min_ext, @@ -315,12 +322,15 @@ def parallel_run_one_window( logging.info(f"Working on window (1-based) @ {window_start+1}") +# (arr, arr_read_qualities_summary, arr_read_summary, +# counter, control_window_length, pos_filter) = _run_one_window( (arr, arr_read_qualities_summary, arr_read_summary, - counter, control_window_length, pos_filter) = _run_one_window( + pos_filter) = _run_one_window( samfile, window_start - 1, # make 0 based reference_name, window_length, + control_window_length, math.floor(win_min_ext * window_length), dict(permitted_reads_per_location), # copys dict ("pass by value") counter, @@ -456,6 +466,32 @@ def parallel_run_one_window( ) _write_to_file([line], f"coverage_{idx}.txt") + + +def update_tiling(tiling, extended_window_mode, max_ins_at_pos): + """ + input tiling: + + return: tiling = [ + (window_start, original_window_length, control_window_length, counter) + for each window + ] + """ + update_tiling = [] + + for idx, (window_start, window_length) in enumerate(tiling): + original_window_length = window_length + if extended_window_mode: + for pos, val in max_ins_at_pos.items(): + if window_start <= pos < window_start + original_window_length: + window_length += val + update_tiling.append((window_start,original_window_length, window_length)) + else: + update_tiling.append((window_start,original_window_length, window_length)) + + return update_tiling + + def build_windows(alignment_file: str, tiling_strategy: TilingStrategy, win_min_ext: float, maximum_reads: int, minimum_reads: int, reference_filename: str, @@ -508,7 +544,7 @@ def build_windows(alignment_file: str, tiling_strategy: TilingStrategy, threads=max_proc #1 ) #reffile = pysam.FastaFile(reference_filename) --> we need to read it in each child process - counter = 0 + #counter = 0 #--> counter is now coputed initially for all windows reference_name = tiling_strategy.get_reference_name() tiling = tiling_strategy.get_window_tilings() region_end = tiling_strategy.get_region_end() @@ -519,8 +555,15 @@ def build_windows(alignment_file: str, tiling_strategy: TilingStrategy, maximum_reads ) + tiling = update_tiling(tiling, extended_window_mode, max_ins_at_pos) + + # generate counter for each window + # counter = window_start - 1 + control_window_length, # make 0 based + counter_list = [0] + [window_start- 1 + control_window_length for (window_start, window_length, control_window_length) in tiling] + all_processes = [] - for idx, (window_start, window_length) in enumerate(tiling): + for idx, (window_start, window_length, control_window_length) in enumerate(tiling): + counter = counter_list[idx] p = Process( target=parallel_run_one_window, args=( @@ -531,6 +574,7 @@ def build_windows(alignment_file: str, tiling_strategy: TilingStrategy, idx, window_start, window_length, + control_window_length, alignment_file, reference_name, win_min_ext, @@ -543,12 +587,13 @@ def build_windows(alignment_file: str, tiling_strategy: TilingStrategy, exclude_non_var_pos_threshold, ) ) - p.start() all_processes.append(p) for p in all_processes: - p.join() - print("here after join") + p.run() + + #for p in all_processes: + # p.join() samfile.close() From 17bfca76c8fdf09d3c11da30f9969360148a9bd4 Mon Sep 17 00:00:00 2001 From: LaraFuhrmann <55209716+LaraFuhrmann@users.noreply.github.com> Date: Fri, 8 Sep 2023 16:38:27 +0200 Subject: [PATCH 03/25] [test] test_run_one_window had to be adapted as it has now also the control_window_length as input --- tests/test_b2w_mapping.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tests/test_b2w_mapping.py b/tests/test_b2w_mapping.py index 0fc3b9c..6eab3f7 100644 --- a/tests/test_b2w_mapping.py +++ b/tests/test_b2w_mapping.py @@ -326,11 +326,19 @@ def test_run_one_window(mArr, spec, window_length, window_start, extended_window mock_dict = mocker.MagicMock() mock_dict.__getitem__.return_value = 42 + # added by Lara + original_window_length = window_length + control_window_length = window_length + for pos, val in max_ins_at_pos.items(): + if window_start <= pos < window_start + original_window_length: + control_window_length += val + arr, _, _, _, _, _ = b2w._run_one_window( mock_samfile, window_start, "HXB2-does-not-matter", window_length, + control_window_length, 0, mock_dict, 0, @@ -343,4 +351,4 @@ def test_run_one_window(mArr, spec, window_length, window_start, extended_window print(arr) for idx, el in enumerate(arr): - assert el.split("\n")[1] == spec[idx] \ No newline at end of file + assert el.split("\n")[1] == spec[idx] From b8b2450231670df19b091af2def223926b7a0dd9 Mon Sep 17 00:00:00 2001 From: LaraFuhrmann <55209716+LaraFuhrmann@users.noreply.github.com> Date: Fri, 8 Sep 2023 16:45:53 +0200 Subject: [PATCH 04/25] [test] test_run_one_window had to be adapted as it has now also the control_window_length as input --- tests/test_b2w_mapping.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_b2w_mapping.py b/tests/test_b2w_mapping.py index 6eab3f7..06fc4b5 100644 --- a/tests/test_b2w_mapping.py +++ b/tests/test_b2w_mapping.py @@ -329,7 +329,7 @@ def test_run_one_window(mArr, spec, window_length, window_start, extended_window # added by Lara original_window_length = window_length control_window_length = window_length - for pos, val in max_ins_at_pos.items(): + for pos, val in max_indel_at_pos.items(): if window_start <= pos < window_start + original_window_length: control_window_length += val From 9005626fd87fbc88d74a3d259ccb0ad617ef780a Mon Sep 17 00:00:00 2001 From: LaraFuhrmann <55209716+LaraFuhrmann@users.noreply.github.com> Date: Fri, 8 Sep 2023 17:25:19 +0200 Subject: [PATCH 05/25] [test] correct expected output --- tests/test_b2w_mapping.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_b2w_mapping.py b/tests/test_b2w_mapping.py index 06fc4b5..b432897 100644 --- a/tests/test_b2w_mapping.py +++ b/tests/test_b2w_mapping.py @@ -333,9 +333,9 @@ def test_run_one_window(mArr, spec, window_length, window_start, extended_window if window_start <= pos < window_start + original_window_length: control_window_length += val - arr, _, _, _, _, _ = b2w._run_one_window( + arr, _, _, _, = b2w._run_one_window( mock_samfile, - window_start, + window_start, # 0 based "HXB2-does-not-matter", window_length, control_window_length, From d863bb540a6cd4181046498ed0eed7984e0d0ae4 Mon Sep 17 00:00:00 2001 From: LaraFuhrmann <55209716+LaraFuhrmann@users.noreply.github.com> Date: Fri, 8 Sep 2023 17:48:04 +0200 Subject: [PATCH 06/25] [test] computation control_window_length --- tests/test_b2w_mapping.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tests/test_b2w_mapping.py b/tests/test_b2w_mapping.py index b432897..a2da540 100644 --- a/tests/test_b2w_mapping.py +++ b/tests/test_b2w_mapping.py @@ -329,9 +329,12 @@ def test_run_one_window(mArr, spec, window_length, window_start, extended_window # added by Lara original_window_length = window_length control_window_length = window_length - for pos, val in max_indel_at_pos.items(): - if window_start <= pos < window_start + original_window_length: - control_window_length += val + + if extended_window_mode: + for pos, val in max_indel_at_pos.items(): + if window_start <= pos < window_start + original_window_length: + control_window_length += val + arr, _, _, _, = b2w._run_one_window( mock_samfile, From 9b5c349f36908988e41cd628a52f85bfde4e3e8c Mon Sep 17 00:00:00 2001 From: LaraFuhrmann <55209716+LaraFuhrmann@users.noreply.github.com> Date: Mon, 6 Nov 2023 14:53:53 +0100 Subject: [PATCH 07/25] fixed: problem with hash not being deterministic which caused problems in the multi-threading, now using a determinisitc version --- shorah/b2w.py | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/shorah/b2w.py b/shorah/b2w.py index 8a71874..78a826d 100644 --- a/shorah/b2w.py +++ b/shorah/b2w.py @@ -6,6 +6,7 @@ import logging from multiprocessing import Process, Pool, cpu_count import os +import hashlib def _write_to_file(lines, file_name): with open(file_name, "w") as f: @@ -40,7 +41,8 @@ def _calc_via_pileup(samfile, reference_name, maximum_reads): indel_map.add(( pileupread.alignment.query_name, # TODO is unique? pileupread.alignment.reference_start, # TODO is unique? - hash(pileupread.alignment.cigarstring), # TODO is unique? + hashlib.sha1(pileupread.alignment.cigarstring.encode()).hexdigest(), + #hash(pileupread.alignment.cigarstring), # TODO is unique? pileupcolumn.reference_pos, pileupread.indel, pileupread.is_del @@ -69,6 +71,12 @@ def _build_one_full_read(full_read: list[str], full_qualities: list[int]|list[st change_in_reference_space_ins = 0 for name, start, cigar_hash, ref_pos, indel_len, is_del in indel_map: + #, "89.6-2108", "89.6-4066", "89.6-2922" + if (read_query_name in ["NL43-2382"]) & (name ==read_query_name) & (start==2357): + print("name, start, cigar_hash, ref_pos, indel_len, is_del", name, start, cigar_hash, ref_pos, indel_len, is_del) + print("full_read_cigar_hash", full_read_cigar_hash, "cigar_hash", cigar_hash) + print("first_aligned_pos", first_aligned_pos, "start", start) + #print("extended_window_mode", extended_window_mode) if name == read_query_name and start == first_aligned_pos and cigar_hash == full_read_cigar_hash: if indel_len > 0 and is_del == 1: @@ -195,9 +203,14 @@ def _run_one_window(samfile, window_start, reference_name, window_length,control raise NotImplementedError("CIGAR op code found that is not implemented:", ct[0]) full_read, full_qualities = _build_one_full_read(full_read, full_qualities, - read.query_name, hash(read.cigarstring), first_aligned_pos, last_aligned_pos, + read.query_name, hashlib.sha1(read.cigarstring.encode()).hexdigest(), first_aligned_pos, last_aligned_pos, indel_map, max_ins_at_pos, extended_window_mode, "-") + #if (read.query_name == "NL43-1884"): + # print("oooooooooooooooooooooooooo") + # print(read.query_name, hash(read.cigarstring), first_aligned_pos, last_aligned_pos, + # indel_map, max_ins_at_pos, extended_window_mode) + if (first_aligned_pos + minimum_overlap < window_start + 1 + window_length and last_aligned_pos >= window_start + minimum_overlap - 2 # TODO justify 2 and len(full_read) >= minimum_overlap): @@ -238,12 +251,16 @@ def _run_one_window(samfile, window_start, reference_name, window_length,control cut_out_read = (-start_cut_out + num_inserts_left_of_read) * "N" + cut_out_read if full_qualities is not None: cut_out_qualities = (-start_cut_out + num_inserts_left_of_read) * [2] + cut_out_qualities - if len(cut_out_read) != window_length: - breakpoint() + + #if (read.query_name in ["NL43-2382", "89.6-2108", "89.6-4066", "89.6-2922"]): + # print( + # "read unequal window size", + # read.query_name, first_aligned_pos, cut_out_read, window_start, window_length, read.reference_end, len(cut_out_read) + # ) assert len(cut_out_read) == window_length, ( "read unequal window size", - read.query_name, first_aligned_pos, cut_out_read, window_start, window_length, read.reference_end + read.query_name, first_aligned_pos, cut_out_read, window_start, window_length, read.reference_end, len(cut_out_read) ) if cut_out_qualities is not None: assert len(cut_out_qualities) == window_length, ( @@ -556,6 +573,8 @@ def build_windows(alignment_file: str, tiling_strategy: TilingStrategy, ) tiling = update_tiling(tiling, extended_window_mode, max_ins_at_pos) + print("indel_map", indel_map) + # generate counter for each window # counter = window_start - 1 + control_window_length, # make 0 based @@ -590,10 +609,10 @@ def build_windows(alignment_file: str, tiling_strategy: TilingStrategy, all_processes.append(p) for p in all_processes: - p.run() + p.start() - #for p in all_processes: - # p.join() + for p in all_processes: + p.join() samfile.close() From 5214a898cbbbf852e778971f9cdfa079eaa4460c Mon Sep 17 00:00:00 2001 From: LaraFuhrmann <55209716+LaraFuhrmann@users.noreply.github.com> Date: Mon, 6 Nov 2023 14:57:35 +0100 Subject: [PATCH 08/25] clean up --- shorah/b2w.py | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/shorah/b2w.py b/shorah/b2w.py index 78a826d..e4b66ff 100644 --- a/shorah/b2w.py +++ b/shorah/b2w.py @@ -71,12 +71,6 @@ def _build_one_full_read(full_read: list[str], full_qualities: list[int]|list[st change_in_reference_space_ins = 0 for name, start, cigar_hash, ref_pos, indel_len, is_del in indel_map: - #, "89.6-2108", "89.6-4066", "89.6-2922" - if (read_query_name in ["NL43-2382"]) & (name ==read_query_name) & (start==2357): - print("name, start, cigar_hash, ref_pos, indel_len, is_del", name, start, cigar_hash, ref_pos, indel_len, is_del) - print("full_read_cigar_hash", full_read_cigar_hash, "cigar_hash", cigar_hash) - print("first_aligned_pos", first_aligned_pos, "start", start) - #print("extended_window_mode", extended_window_mode) if name == read_query_name and start == first_aligned_pos and cigar_hash == full_read_cigar_hash: if indel_len > 0 and is_del == 1: @@ -197,7 +191,7 @@ def _run_one_window(samfile, window_start, reference_name, window_length,control if ct_idx != 0 and ct_idx != len(read.cigartuples)-1: raise ValueError("Soft clipping only possible on the edges of a read.") elif ct[0] == 5: # 5 = BAM_CHARD_CLIP - #logging.debug(f"[b2w] Hard clipping detected in {read.query_name}") + #logging.debug(f"[b2w] Hard clipping detected in {read.query_name}") # commented out because this happens too often pass else: raise NotImplementedError("CIGAR op code found that is not implemented:", ct[0]) @@ -206,10 +200,6 @@ def _run_one_window(samfile, window_start, reference_name, window_length,control read.query_name, hashlib.sha1(read.cigarstring.encode()).hexdigest(), first_aligned_pos, last_aligned_pos, indel_map, max_ins_at_pos, extended_window_mode, "-") - #if (read.query_name == "NL43-1884"): - # print("oooooooooooooooooooooooooo") - # print(read.query_name, hash(read.cigarstring), first_aligned_pos, last_aligned_pos, - # indel_map, max_ins_at_pos, extended_window_mode) if (first_aligned_pos + minimum_overlap < window_start + 1 + window_length and last_aligned_pos >= window_start + minimum_overlap - 2 # TODO justify 2 @@ -252,11 +242,6 @@ def _run_one_window(samfile, window_start, reference_name, window_length,control if full_qualities is not None: cut_out_qualities = (-start_cut_out + num_inserts_left_of_read) * [2] + cut_out_qualities - #if (read.query_name in ["NL43-2382", "89.6-2108", "89.6-4066", "89.6-2922"]): - # print( - # "read unequal window size", - # read.query_name, first_aligned_pos, cut_out_read, window_start, window_length, read.reference_end, len(cut_out_read) - # ) assert len(cut_out_read) == window_length, ( "read unequal window size", @@ -573,8 +558,6 @@ def build_windows(alignment_file: str, tiling_strategy: TilingStrategy, ) tiling = update_tiling(tiling, extended_window_mode, max_ins_at_pos) - print("indel_map", indel_map) - # generate counter for each window # counter = window_start - 1 + control_window_length, # make 0 based From a96928fda4227abd6552ab40e91c2693289c17eb Mon Sep 17 00:00:00 2001 From: LaraFuhrmann <55209716+LaraFuhrmann@users.noreply.github.com> Date: Mon, 6 Nov 2023 16:06:06 +0100 Subject: [PATCH 09/25] correct indent --- shorah/b2w.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shorah/b2w.py b/shorah/b2w.py index e4b66ff..f33b16a 100644 --- a/shorah/b2w.py +++ b/shorah/b2w.py @@ -41,7 +41,7 @@ def _calc_via_pileup(samfile, reference_name, maximum_reads): indel_map.add(( pileupread.alignment.query_name, # TODO is unique? pileupread.alignment.reference_start, # TODO is unique? - hashlib.sha1(pileupread.alignment.cigarstring.encode()).hexdigest(), + hashlib.sha1(pileupread.alignment.cigarstring.encode()).hexdigest(), #hash(pileupread.alignment.cigarstring), # TODO is unique? pileupcolumn.reference_pos, pileupread.indel, From b344ae1f0d0e9b0fcfca33a339ced75499c30c8d Mon Sep 17 00:00:00 2001 From: LaraFuhrmann <55209716+LaraFuhrmann@users.noreply.github.com> Date: Mon, 6 Nov 2023 16:06:55 +0100 Subject: [PATCH 10/25] random hash to deterministic hash --- tests/test_b2w_mapping.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/test_b2w_mapping.py b/tests/test_b2w_mapping.py index a2da540..ad5767c 100644 --- a/tests/test_b2w_mapping.py +++ b/tests/test_b2w_mapping.py @@ -2,6 +2,7 @@ import pytest from cigar import Cigar from shorah import b2w +import hashlib class MockAlignedSegment: def __init__(self, query_name: str, reference_start: int, query_sequence: str, cigarstring: str): @@ -35,10 +36,10 @@ def add_indels(self, indels_map): cnt = self.reference_start for i in self.cigartuples: if i[0] == 1: # insert TODO Justify -1 - indels_map.append((self.query_name, self.reference_start, hash(self.cigarstring), cnt-1, i[1], 0)) # cnt-1 + indels_map.append((self.query_name, self.reference_start, hashlib.sha1(self.cigarstring.encode()).hexdigest(), cnt-1, i[1], 0)) # cnt-1 elif i[0] == 2: # del for k in range(i[1]): - indels_map.append((self.query_name, self.reference_start, hash(self.cigarstring), cnt+k, 0, 1)) + indels_map.append((self.query_name, self.reference_start, hashlib.sha1(self.cigarstring.encode()).hexdigest(), cnt+k, 0, 1)) cnt += i[1] else: cnt += i[1] @@ -334,7 +335,7 @@ def test_run_one_window(mArr, spec, window_length, window_start, extended_window for pos, val in max_indel_at_pos.items(): if window_start <= pos < window_start + original_window_length: control_window_length += val - + arr, _, _, _, = b2w._run_one_window( mock_samfile, From 6c2f9e56999b63d3d92c3be079ee049e7092217a Mon Sep 17 00:00:00 2001 From: LaraFuhrmann <55209716+LaraFuhrmann@users.noreply.github.com> Date: Mon, 6 Nov 2023 16:55:09 +0100 Subject: [PATCH 11/25] update multiprocessing modules that are needed --- shorah/b2w.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shorah/b2w.py b/shorah/b2w.py index f33b16a..a5dc4e4 100644 --- a/shorah/b2w.py +++ b/shorah/b2w.py @@ -4,7 +4,7 @@ import numpy as np import math import logging -from multiprocessing import Process, Pool, cpu_count +from multiprocessing import Process, cpu_count import os import hashlib From e6c5e52502e7ae48e54004778e1582d35f77b573 Mon Sep 17 00:00:00 2001 From: LaraFuhrmann <55209716+LaraFuhrmann@users.noreply.github.com> Date: Thu, 9 Nov 2023 10:52:02 +0100 Subject: [PATCH 12/25] fix: computation control window length --- shorah/b2w.py | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/shorah/b2w.py b/shorah/b2w.py index a5dc4e4..10fac02 100644 --- a/shorah/b2w.py +++ b/shorah/b2w.py @@ -473,25 +473,27 @@ def parallel_run_one_window( def update_tiling(tiling, extended_window_mode, max_ins_at_pos): """ input tiling: + window_start is 1-based + max_ins_at_pos is 0-based return: tiling = [ - (window_start, original_window_length, control_window_length, counter) + (window_start, original_window_length, control_window_length) for each window ] """ - update_tiling = [] + updated_tiling = [] for idx, (window_start, window_length) in enumerate(tiling): original_window_length = window_length if extended_window_mode: for pos, val in max_ins_at_pos.items(): - if window_start <= pos < window_start + original_window_length: + if window_start - 1 <= pos < window_start - 1 + original_window_length: window_length += val - update_tiling.append((window_start,original_window_length, window_length)) + updated_tiling.append((window_start,original_window_length, window_length)) else: - update_tiling.append((window_start,original_window_length, window_length)) + updated_tiling.append((window_start,original_window_length, window_length)) - return update_tiling + return updated_tiling def build_windows(alignment_file: str, tiling_strategy: TilingStrategy, @@ -558,10 +560,10 @@ def build_windows(alignment_file: str, tiling_strategy: TilingStrategy, ) tiling = update_tiling(tiling, extended_window_mode, max_ins_at_pos) - + # generate counter for each window # counter = window_start - 1 + control_window_length, # make 0 based - counter_list = [0] + [window_start- 1 + control_window_length for (window_start, window_length, control_window_length) in tiling] + counter_list = [0] + [window_start - 1 + control_window_length for (window_start, window_length, control_window_length) in tiling] all_processes = [] for idx, (window_start, window_length, control_window_length) in enumerate(tiling): @@ -574,17 +576,17 @@ def build_windows(alignment_file: str, tiling_strategy: TilingStrategy, tiling, region_end, idx, - window_start, + window_start, # 1-based window_length, control_window_length, alignment_file, reference_name, win_min_ext, permitted_reads_per_location, - counter, + counter, # 0-based exact_conformance_fix_0_1_basing_in_reads, indel_map, - max_ins_at_pos, + max_ins_at_pos, # 0-based extended_window_mode, exclude_non_var_pos_threshold, ) From 44b66e42b1b22cf25931c78ab16ae5e291b5b43a Mon Sep 17 00:00:00 2001 From: LaraFuhrmann <55209716+LaraFuhrmann@users.noreply.github.com> Date: Wed, 22 Nov 2023 17:18:59 +0100 Subject: [PATCH 13/25] delete empty log file --- .../learn_error_params/run_dpm_mfa.py | 6 +----- .../use_quality_scores/run_dpm_mfa.py | 6 +----- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/shorah/local_haplotype_inference/learn_error_params/run_dpm_mfa.py b/shorah/local_haplotype_inference/learn_error_params/run_dpm_mfa.py index 29332f4..d8dfaac 100644 --- a/shorah/local_haplotype_inference/learn_error_params/run_dpm_mfa.py +++ b/shorah/local_haplotype_inference/learn_error_params/run_dpm_mfa.py @@ -10,10 +10,6 @@ from . import analyze_results from . import cavi -logging.basicConfig( - filename="shorah_inference.log", encoding="utf-8", level=logging.INFO -) - def gzip_file(f_name): """Gzip a file and return the name of the gzipped, removing the original""" @@ -69,7 +65,7 @@ def main(freads_in, fref_in, output_dir, n_starts, K, alpha0, alphabet="ACGT-", 0, output_name, )] - + logging.info("len(result_list) " + str(len(result_list))) logging.info("reference " + fref_in) logging.info("reads " + freads_in) diff --git a/shorah/local_haplotype_inference/use_quality_scores/run_dpm_mfa.py b/shorah/local_haplotype_inference/use_quality_scores/run_dpm_mfa.py index 552f228..bffaea5 100644 --- a/shorah/local_haplotype_inference/use_quality_scores/run_dpm_mfa.py +++ b/shorah/local_haplotype_inference/use_quality_scores/run_dpm_mfa.py @@ -12,10 +12,6 @@ from . import analyze_results from . import cavi -logging.basicConfig( - filename="shorah_inference.log", encoding="utf-8", level=logging.INFO -) - # class NumpyEncoder(json.JSONEncoder): # def default(self, obj): @@ -96,7 +92,7 @@ def main( ] # sort list of tuple by ELBO value sort_elbo.sort(key=lambda x: x[1], reverse=True) - + best_run_idx = sort_elbo[0][0] best_run_elbo = sort_elbo[0][1] logging.info("Maximal ELBO " + str(best_run_elbo) + "in run " + str(best_run_idx)) From 1ad89510e51e8fd88f45bae43e9c7d2d58689a68 Mon Sep 17 00:00:00 2001 From: LaraFuhrmann <55209716+LaraFuhrmann@users.noreply.github.com> Date: Wed, 22 Nov 2023 17:21:40 +0100 Subject: [PATCH 14/25] delete empty log file --- .../learn_error_params/run_dpm_mfa.py | 4 ++++ .../use_quality_scores/run_dpm_mfa.py | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/shorah/local_haplotype_inference/learn_error_params/run_dpm_mfa.py b/shorah/local_haplotype_inference/learn_error_params/run_dpm_mfa.py index d8dfaac..62e9952 100644 --- a/shorah/local_haplotype_inference/learn_error_params/run_dpm_mfa.py +++ b/shorah/local_haplotype_inference/learn_error_params/run_dpm_mfa.py @@ -10,6 +10,10 @@ from . import analyze_results from . import cavi +logging.basicConfig( + filename="viloca.log", encoding="utf-8", level=logging.INFO +) + def gzip_file(f_name): """Gzip a file and return the name of the gzipped, removing the original""" diff --git a/shorah/local_haplotype_inference/use_quality_scores/run_dpm_mfa.py b/shorah/local_haplotype_inference/use_quality_scores/run_dpm_mfa.py index bffaea5..562f871 100644 --- a/shorah/local_haplotype_inference/use_quality_scores/run_dpm_mfa.py +++ b/shorah/local_haplotype_inference/use_quality_scores/run_dpm_mfa.py @@ -12,6 +12,10 @@ from . import analyze_results from . import cavi +logging.basicConfig( + filename="viloca.log", encoding="utf-8", level=logging.INFO +) + # class NumpyEncoder(json.JSONEncoder): # def default(self, obj): From caeded9c20ba5907055e187aa1c6c2924eb6e21b Mon Sep 17 00:00:00 2001 From: LaraFuhrmann <55209716+LaraFuhrmann@users.noreply.github.com> Date: Wed, 22 Nov 2023 17:29:32 +0100 Subject: [PATCH 15/25] shotgun command to run command --- shorah/cli.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/shorah/cli.py b/shorah/cli.py index de7caf1..bcfedc1 100644 --- a/shorah/cli.py +++ b/shorah/cli.py @@ -89,13 +89,13 @@ def snv_run(args): def main(): """Parse command line, run default functions.""" # logging configuration - logging.basicConfig(filename='shorah.log', level=logging.DEBUG, + logging.basicConfig(filename='viloca.log', level=logging.DEBUG, format='%(levelname)s %(asctime)s %(filename)s: %(funcName)s() %(lineno)d: \t%(message)s', datefmt='%Y/%m/%d %H:%M:%S', force=True) logging.info(' '.join(sys.argv)) - logging.info('shorah version:%s', __version__) + logging.info('viloca version:%s', __version__) # parse command line # create the top-level parser @@ -151,7 +151,7 @@ def main(): parser = argparse.ArgumentParser( usage='%(prog)s [options]', - epilog="Run `shorah subcommand -h` for more help", + epilog="Run `viloca subcommand -h` for more help", parents=[version_parser]) subparsers = parser.add_subparsers( @@ -159,7 +159,7 @@ def main(): # create the parser for command "shotgun" parser_shotgun = subparsers.add_parser( - 'shotgun', help='run local analysis in shotgun mode', parents=[version_parser, parent_parser, coverage_parser]) + 'run', help='run viloca', parents=[version_parser, parent_parser, coverage_parser]) parser_shotgun.add_argument("-w", "--windowsize", metavar='INT', required=False, type=int, dest="w", default=201, help="window size") From f15d199c41a2f26fed8d06577b2f7c8671f7999c Mon Sep 17 00:00:00 2001 From: LaraFuhrmann <55209716+LaraFuhrmann@users.noreply.github.com> Date: Wed, 22 Nov 2023 17:29:57 +0100 Subject: [PATCH 16/25] update log file naming --- .../local_haplotype_inference/learn_error_params/run_dpm_mfa.py | 2 +- .../local_haplotype_inference/use_quality_scores/run_dpm_mfa.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/shorah/local_haplotype_inference/learn_error_params/run_dpm_mfa.py b/shorah/local_haplotype_inference/learn_error_params/run_dpm_mfa.py index 62e9952..a66e988 100644 --- a/shorah/local_haplotype_inference/learn_error_params/run_dpm_mfa.py +++ b/shorah/local_haplotype_inference/learn_error_params/run_dpm_mfa.py @@ -11,7 +11,7 @@ from . import cavi logging.basicConfig( - filename="viloca.log", encoding="utf-8", level=logging.INFO + filename="viloca_inference.log", encoding="utf-8", level=logging.INFO ) diff --git a/shorah/local_haplotype_inference/use_quality_scores/run_dpm_mfa.py b/shorah/local_haplotype_inference/use_quality_scores/run_dpm_mfa.py index 562f871..27285ab 100644 --- a/shorah/local_haplotype_inference/use_quality_scores/run_dpm_mfa.py +++ b/shorah/local_haplotype_inference/use_quality_scores/run_dpm_mfa.py @@ -13,7 +13,7 @@ from . import cavi logging.basicConfig( - filename="viloca.log", encoding="utf-8", level=logging.INFO + filename="viloca_inference.log", encoding="utf-8", level=logging.INFO ) From 211461c871aefbfb007b8f9f4307f4cc3f2ef123 Mon Sep 17 00:00:00 2001 From: LaraFuhrmann <55209716+LaraFuhrmann@users.noreply.github.com> Date: Thu, 23 Nov 2023 11:51:41 +0100 Subject: [PATCH 17/25] [README] add channels to conda enviroment installation] --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 3c25d77..dcb9af7 100755 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ VILOCA: VIral LOcal haplotype reconstruction and mutation CAlling for short and long read data =============== -[![Build Status](https://travis-ci.org/cbg-ethz/shorah.svg?branch=master)](https://travis-ci.org/cbg-ethz/shorah) -[![Bioconda package](https://img.shields.io/conda/dn/bioconda/shorah.svg?label=Bioconda)](https://bioconda.github.io/recipes/shorah/README.html) -[![Docker container](https://quay.io/repository/biocontainers/shorah/status)](https://quay.io/repository/biocontainers/shorah) +[![Build Status](https://travis-ci.org/cbg-ethz/shorah.svg?branch=master)](https://travis-ci.org/cbg-ethz/viloca) +[![Bioconda package](https://img.shields.io/conda/dn/bioconda/shorah.svg?label=Bioconda)](https://bioconda.github.io/recipes/viloca/README.html) +[![Docker container](https://quay.io/repository/biocontainers/shorah/status)](https://quay.io/repository/biocontainers/viloca) VILOCA is an open source project for the analysis of next generation sequencing @@ -17,7 +17,7 @@ genetic variants present in a mixed sample. For installation miniconda is recommended: https://docs.conda.io/en/latest/miniconda.html. We recommend to install VILOCA in a clean conda environment: ``` -conda create --name env_viloca libshorah +conda create --name env_viloca --channel conda-forge --channel bioconda libshorah conda activate env_viloca pip install git+https://github.com/LaraFuhrmann/VILOCA@master ``` From 956af67047b7ae1c8ba01f34d0fa98d92d613f8d Mon Sep 17 00:00:00 2001 From: LaraFuhrmann <55209716+LaraFuhrmann@users.noreply.github.com> Date: Thu, 23 Nov 2023 14:40:58 +0100 Subject: [PATCH 18/25] updated readme with new commands --- README.md | 8 ++++---- {shorah => viloca}/__init__.py | 0 {shorah => viloca}/__main__.py | 0 {shorah => viloca}/b2w.py | 0 {shorah => viloca}/cli.py | 0 {shorah => viloca}/envp_post.py | 0 .../learn_error_params/__init__.py | 0 .../learn_error_params/analyze_results.py | 0 .../local_haplotype_inference/learn_error_params/cavi.py | 0 .../learn_error_params/elbo_eqs.py | 0 .../learn_error_params/initialization.py | 0 .../learn_error_params/preparation.py | 0 .../learn_error_params/run_dpm_mfa.py | 0 .../learn_error_params/update_eqs.py | 0 .../use_quality_scores/__init__.py | 0 .../use_quality_scores/analyze_results.py | 0 .../local_haplotype_inference/use_quality_scores/cavi.py | 0 .../use_quality_scores/elbo_eqs.py | 0 .../use_quality_scores/initialization.py | 0 .../use_quality_scores/preparation.py | 0 .../use_quality_scores/run_dpm_mfa.py | 0 .../use_quality_scores/update_eqs.py | 0 {shorah => viloca}/pooled_post.py | 0 {shorah => viloca}/pooled_pre.py | 0 {shorah => viloca}/shorah_snv.py | 0 {shorah => viloca}/shotgun.py | 0 {shorah => viloca}/tiling.py | 0 27 files changed, 4 insertions(+), 4 deletions(-) rename {shorah => viloca}/__init__.py (100%) rename {shorah => viloca}/__main__.py (100%) rename {shorah => viloca}/b2w.py (100%) rename {shorah => viloca}/cli.py (100%) rename {shorah => viloca}/envp_post.py (100%) rename {shorah => viloca}/local_haplotype_inference/learn_error_params/__init__.py (100%) rename {shorah => viloca}/local_haplotype_inference/learn_error_params/analyze_results.py (100%) rename {shorah => viloca}/local_haplotype_inference/learn_error_params/cavi.py (100%) rename {shorah => viloca}/local_haplotype_inference/learn_error_params/elbo_eqs.py (100%) rename {shorah => viloca}/local_haplotype_inference/learn_error_params/initialization.py (100%) rename {shorah => viloca}/local_haplotype_inference/learn_error_params/preparation.py (100%) rename {shorah => viloca}/local_haplotype_inference/learn_error_params/run_dpm_mfa.py (100%) rename {shorah => viloca}/local_haplotype_inference/learn_error_params/update_eqs.py (100%) rename {shorah => viloca}/local_haplotype_inference/use_quality_scores/__init__.py (100%) rename {shorah => viloca}/local_haplotype_inference/use_quality_scores/analyze_results.py (100%) rename {shorah => viloca}/local_haplotype_inference/use_quality_scores/cavi.py (100%) rename {shorah => viloca}/local_haplotype_inference/use_quality_scores/elbo_eqs.py (100%) rename {shorah => viloca}/local_haplotype_inference/use_quality_scores/initialization.py (100%) rename {shorah => viloca}/local_haplotype_inference/use_quality_scores/preparation.py (100%) rename {shorah => viloca}/local_haplotype_inference/use_quality_scores/run_dpm_mfa.py (100%) rename {shorah => viloca}/local_haplotype_inference/use_quality_scores/update_eqs.py (100%) rename {shorah => viloca}/pooled_post.py (100%) rename {shorah => viloca}/pooled_pre.py (100%) rename {shorah => viloca}/shorah_snv.py (100%) rename {shorah => viloca}/shotgun.py (100%) rename {shorah => viloca}/tiling.py (100%) diff --git a/README.md b/README.md index dcb9af7..7ffafbe 100755 --- a/README.md +++ b/README.md @@ -19,20 +19,20 @@ We recommend to install VILOCA in a clean conda environment: ``` conda create --name env_viloca --channel conda-forge --channel bioconda libshorah conda activate env_viloca -pip install git+https://github.com/LaraFuhrmann/VILOCA@master +pip install git+https://github.com/cbg-ethz/VILOCA@master ``` ### Example To test your installation, we recommend running the program on `tests/data_1`. If the sequencing amplicon strategy is known, we recommend using the amplicon-mode of the program, which takes as input the `.insert.bed` - file: -`shorah shotgun -b test_aln.cram -f test_ref.fasta -z scheme.insert.bed --mode use_quality_scores` +`viloca run -b test_aln.cram -f test_ref.fasta -z scheme.insert.bed --mode use_quality_scores` If the sequencing quality scores are not trustable, the sequencing error parameters can also be learned: -`shorah shotgun -b test_aln.cram -f test_ref.fasta -z scheme.insert.bed --mode learn_error_params`. +`viloca run -b test_aln.cram -f test_ref.fasta -z scheme.insert.bed --mode learn_error_params`. If there is no information on the sequencing amplicon strategy available, run: -`shorah shotgun -b test_aln.cram -f test_ref.fasta --mode use_quality_scores` +`viloca run -b test_aln.cram -f test_ref.fasta --mode use_quality_scores` ### Parameters There are several parameters available: diff --git a/shorah/__init__.py b/viloca/__init__.py similarity index 100% rename from shorah/__init__.py rename to viloca/__init__.py diff --git a/shorah/__main__.py b/viloca/__main__.py similarity index 100% rename from shorah/__main__.py rename to viloca/__main__.py diff --git a/shorah/b2w.py b/viloca/b2w.py similarity index 100% rename from shorah/b2w.py rename to viloca/b2w.py diff --git a/shorah/cli.py b/viloca/cli.py similarity index 100% rename from shorah/cli.py rename to viloca/cli.py diff --git a/shorah/envp_post.py b/viloca/envp_post.py similarity index 100% rename from shorah/envp_post.py rename to viloca/envp_post.py diff --git a/shorah/local_haplotype_inference/learn_error_params/__init__.py b/viloca/local_haplotype_inference/learn_error_params/__init__.py similarity index 100% rename from shorah/local_haplotype_inference/learn_error_params/__init__.py rename to viloca/local_haplotype_inference/learn_error_params/__init__.py diff --git a/shorah/local_haplotype_inference/learn_error_params/analyze_results.py b/viloca/local_haplotype_inference/learn_error_params/analyze_results.py similarity index 100% rename from shorah/local_haplotype_inference/learn_error_params/analyze_results.py rename to viloca/local_haplotype_inference/learn_error_params/analyze_results.py diff --git a/shorah/local_haplotype_inference/learn_error_params/cavi.py b/viloca/local_haplotype_inference/learn_error_params/cavi.py similarity index 100% rename from shorah/local_haplotype_inference/learn_error_params/cavi.py rename to viloca/local_haplotype_inference/learn_error_params/cavi.py diff --git a/shorah/local_haplotype_inference/learn_error_params/elbo_eqs.py b/viloca/local_haplotype_inference/learn_error_params/elbo_eqs.py similarity index 100% rename from shorah/local_haplotype_inference/learn_error_params/elbo_eqs.py rename to viloca/local_haplotype_inference/learn_error_params/elbo_eqs.py diff --git a/shorah/local_haplotype_inference/learn_error_params/initialization.py b/viloca/local_haplotype_inference/learn_error_params/initialization.py similarity index 100% rename from shorah/local_haplotype_inference/learn_error_params/initialization.py rename to viloca/local_haplotype_inference/learn_error_params/initialization.py diff --git a/shorah/local_haplotype_inference/learn_error_params/preparation.py b/viloca/local_haplotype_inference/learn_error_params/preparation.py similarity index 100% rename from shorah/local_haplotype_inference/learn_error_params/preparation.py rename to viloca/local_haplotype_inference/learn_error_params/preparation.py diff --git a/shorah/local_haplotype_inference/learn_error_params/run_dpm_mfa.py b/viloca/local_haplotype_inference/learn_error_params/run_dpm_mfa.py similarity index 100% rename from shorah/local_haplotype_inference/learn_error_params/run_dpm_mfa.py rename to viloca/local_haplotype_inference/learn_error_params/run_dpm_mfa.py diff --git a/shorah/local_haplotype_inference/learn_error_params/update_eqs.py b/viloca/local_haplotype_inference/learn_error_params/update_eqs.py similarity index 100% rename from shorah/local_haplotype_inference/learn_error_params/update_eqs.py rename to viloca/local_haplotype_inference/learn_error_params/update_eqs.py diff --git a/shorah/local_haplotype_inference/use_quality_scores/__init__.py b/viloca/local_haplotype_inference/use_quality_scores/__init__.py similarity index 100% rename from shorah/local_haplotype_inference/use_quality_scores/__init__.py rename to viloca/local_haplotype_inference/use_quality_scores/__init__.py diff --git a/shorah/local_haplotype_inference/use_quality_scores/analyze_results.py b/viloca/local_haplotype_inference/use_quality_scores/analyze_results.py similarity index 100% rename from shorah/local_haplotype_inference/use_quality_scores/analyze_results.py rename to viloca/local_haplotype_inference/use_quality_scores/analyze_results.py diff --git a/shorah/local_haplotype_inference/use_quality_scores/cavi.py b/viloca/local_haplotype_inference/use_quality_scores/cavi.py similarity index 100% rename from shorah/local_haplotype_inference/use_quality_scores/cavi.py rename to viloca/local_haplotype_inference/use_quality_scores/cavi.py diff --git a/shorah/local_haplotype_inference/use_quality_scores/elbo_eqs.py b/viloca/local_haplotype_inference/use_quality_scores/elbo_eqs.py similarity index 100% rename from shorah/local_haplotype_inference/use_quality_scores/elbo_eqs.py rename to viloca/local_haplotype_inference/use_quality_scores/elbo_eqs.py diff --git a/shorah/local_haplotype_inference/use_quality_scores/initialization.py b/viloca/local_haplotype_inference/use_quality_scores/initialization.py similarity index 100% rename from shorah/local_haplotype_inference/use_quality_scores/initialization.py rename to viloca/local_haplotype_inference/use_quality_scores/initialization.py diff --git a/shorah/local_haplotype_inference/use_quality_scores/preparation.py b/viloca/local_haplotype_inference/use_quality_scores/preparation.py similarity index 100% rename from shorah/local_haplotype_inference/use_quality_scores/preparation.py rename to viloca/local_haplotype_inference/use_quality_scores/preparation.py diff --git a/shorah/local_haplotype_inference/use_quality_scores/run_dpm_mfa.py b/viloca/local_haplotype_inference/use_quality_scores/run_dpm_mfa.py similarity index 100% rename from shorah/local_haplotype_inference/use_quality_scores/run_dpm_mfa.py rename to viloca/local_haplotype_inference/use_quality_scores/run_dpm_mfa.py diff --git a/shorah/local_haplotype_inference/use_quality_scores/update_eqs.py b/viloca/local_haplotype_inference/use_quality_scores/update_eqs.py similarity index 100% rename from shorah/local_haplotype_inference/use_quality_scores/update_eqs.py rename to viloca/local_haplotype_inference/use_quality_scores/update_eqs.py diff --git a/shorah/pooled_post.py b/viloca/pooled_post.py similarity index 100% rename from shorah/pooled_post.py rename to viloca/pooled_post.py diff --git a/shorah/pooled_pre.py b/viloca/pooled_pre.py similarity index 100% rename from shorah/pooled_pre.py rename to viloca/pooled_pre.py diff --git a/shorah/shorah_snv.py b/viloca/shorah_snv.py similarity index 100% rename from shorah/shorah_snv.py rename to viloca/shorah_snv.py diff --git a/shorah/shotgun.py b/viloca/shotgun.py similarity index 100% rename from shorah/shotgun.py rename to viloca/shotgun.py diff --git a/shorah/tiling.py b/viloca/tiling.py similarity index 100% rename from shorah/tiling.py rename to viloca/tiling.py From f9e7cb4f45eaaae35d0304751afd3c9434a2a058 Mon Sep 17 00:00:00 2001 From: LaraFuhrmann <55209716+LaraFuhrmann@users.noreply.github.com> Date: Thu, 23 Nov 2023 14:42:00 +0100 Subject: [PATCH 19/25] update imported packages to viloca, and other naming --- viloca/__main__.py | 2 +- viloca/b2w.py | 4 ++-- viloca/cli.py | 10 +++++----- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/viloca/__main__.py b/viloca/__main__.py index 42e6c65..50ed2a3 100644 --- a/viloca/__main__.py +++ b/viloca/__main__.py @@ -8,7 +8,7 @@ - https://docs.python.org/2/using/cmdline.html#cmdoption-m - https://docs.python.org/3/using/cmdline.html#cmdoption-m """ -from shorah.cli import main +from viloca.cli import main if __name__ == "__main__": main() diff --git a/viloca/b2w.py b/viloca/b2w.py index 10fac02..505dd9a 100644 --- a/viloca/b2w.py +++ b/viloca/b2w.py @@ -1,6 +1,6 @@ import pysam from typing import Optional -from shorah.tiling import TilingStrategy, EquispacedTilingStrategy +from viloca.tiling import TilingStrategy, EquispacedTilingStrategy import numpy as np import math import logging @@ -560,7 +560,7 @@ def build_windows(alignment_file: str, tiling_strategy: TilingStrategy, ) tiling = update_tiling(tiling, extended_window_mode, max_ins_at_pos) - + # generate counter for each window # counter = window_start - 1 + control_window_length, # make 0 based counter_list = [0] + [window_start - 1 + control_window_length for (window_start, window_length, control_window_length) in tiling] diff --git a/viloca/cli.py b/viloca/cli.py index bcfedc1..902ebd9 100644 --- a/viloca/cli.py +++ b/viloca/cli.py @@ -39,12 +39,12 @@ import argparse import logging import logging.handlers -from shorah import shotgun, shorah_snv +from viloca import shotgun, shorah_snv # FIXME can we remove this? @Ivan -> version tag (get through poetry in the future) use_pkg_resources = False all_dirs = os.path.abspath(__file__).split(os.sep) -base_dir = os.sep.join(all_dirs[:-all_dirs[::-1].index('shorah')]) +base_dir = os.sep.join(all_dirs[:-all_dirs[::-1].index('viloca')]) version_fname = os.path.join(base_dir, '.version') if os.path.exists(version_fname): # probably installed using Autotools, e.g: bioconda package - the current recommended way @@ -54,7 +54,7 @@ # probably installed using setup.py from pkg_resources import (get_distribution, DistributionNotFound) try: - __version__ = get_distribution('shorah').version + __version__ = get_distribution('viloca').version except DistributionNotFound: __version__ = 'unknown' print("cannot find version", file=sys.stderr) @@ -66,8 +66,8 @@ if __name__ == '__main__': if __package__ is None: os.sys.path.insert(1, parent_dir) - mod = __import__('shorah') - sys.modules["shorah"] = mod + mod = __import__('viloca') + sys.modules["viloca"] = mod #from common import hcv_map, hiv_map, org_dict, wobbles #from stats import (genome_coverage, start_stop_coverage) # else: From 9be8f5b780217d49a861c367ea7d9a3ea4d633c1 Mon Sep 17 00:00:00 2001 From: LaraFuhrmann <55209716+LaraFuhrmann@users.noreply.github.com> Date: Thu, 23 Nov 2023 14:43:18 +0100 Subject: [PATCH 20/25] update viloca naming here --- poetry.lock | 631 +++++++++++++++++++++++++++++++++++++------------ pyproject.toml | 10 +- 2 files changed, 485 insertions(+), 156 deletions(-) diff --git a/poetry.lock b/poetry.lock index c304ed1..5aa4b8b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,153 +1,383 @@ +# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. + [[package]] name = "atomicwrites" version = "1.4.1" description = "Atomic file writes." -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "atomicwrites-1.4.1.tar.gz", hash = "sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11"}, +] [[package]] name = "attrs" -version = "22.2.0" +version = "23.1.0" description = "Classes Without Boilerplate" -category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, + {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, +] [package.extras] -cov = ["attrs", "coverage-enable-subprocess", "coverage[toml] (>=5.3)"] -dev = ["attrs"] -docs = ["furo", "sphinx", "myst-parser", "zope.interface", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier"] -tests = ["attrs", "zope.interface"] -tests-no-zope = ["hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist", "cloudpickle", "mypy (>=0.971,<0.990)", "pytest-mypy-plugins"] -tests_no_zope = ["hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist", "cloudpickle", "mypy (>=0.971,<0.990)", "pytest-mypy-plugins"] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] [[package]] name = "bio" -version = "1.5.3" +version = "1.6.0" description = "bio" -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "bio-1.6.0-py3-none-any.whl", hash = "sha256:38b14e11625ef233e1a3878c8b13253695e863bd997f94715c248b71612605d5"}, +] [package.dependencies] biopython = ">=1.80" +gprofiler-official = "*" mygene = "*" +pandas = "*" +pooch = "*" requests = "*" tqdm = "*" [[package]] name = "biopython" -version = "1.80" +version = "1.81" description = "Freely available tools for computational molecular biology." -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "biopython-1.81-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ef7c79b65b0b3f3c7dc59e20a7f8ae5758d8e852cb8b9cace590dc5617e348ba"}, + {file = "biopython-1.81-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ebfbce0d91796c7aef422ee9dffe8827e07e5abaa94545e006f1f20e965c80b"}, + {file = "biopython-1.81-cp310-cp310-win32.whl", hash = "sha256:919a2c583cabf9c96d2ae4e1245a6b0376932fb342aca302a0fc198b71ab3275"}, + {file = "biopython-1.81-cp310-cp310-win_amd64.whl", hash = "sha256:b37c0d24191e5c96ca02415a5188551980c83a0d518bbc4ffe3c9a5d1fe0ee81"}, + {file = "biopython-1.81-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7a168709694e10b338718c18d967edd5b56c237dc88642c22275796007a70000"}, + {file = "biopython-1.81-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a51d9c1d1b4b634447535da74a644fae59bc234fbbf9001e2dc6b6fbabb98019"}, + {file = "biopython-1.81-cp311-cp311-win32.whl", hash = "sha256:2f9cfaf16d55ab80d514e7aebe5710dabe4e4ff47ede851031202e33b3249da3"}, + {file = "biopython-1.81-cp311-cp311-win_amd64.whl", hash = "sha256:e41b55edcfd448630e77bf4de66a7235324a8a149621499891da6bd1d5085b9a"}, + {file = "biopython-1.81-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:175fcddc9f22a070aa6db54755d60c4b31090cc39f5f5f4b0a9a5d1ae3b45cd7"}, + {file = "biopython-1.81-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ec149487f3d1e0cf2b52b6071641c161ed545b0855ff51a71506152e14fc5bb"}, + {file = "biopython-1.81-cp312-cp312-win32.whl", hash = "sha256:daeab15274bbcc0455cbd378636e14f53bc7c5b1f383e77021d7222e72cc3418"}, + {file = "biopython-1.81-cp312-cp312-win_amd64.whl", hash = "sha256:22f5741aca91af0a76c0d5617e58e554fd3374bbd16e0c0ac1facf45b107313b"}, + {file = "biopython-1.81-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3b36ba1bf6395c09a365c53530c9d71f3617763fa2c1d452b3d8948368c0f1de"}, + {file = "biopython-1.81-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c5c07123ff5f44c9e6b5369df854a38afd3c0c50ef58498a0ae8f7eb799f3e8"}, + {file = "biopython-1.81-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:97cbdbed01b2512471f36c74b91658d1dfbdcbf39bc038f6ce5a41c3e60a8fc6"}, + {file = "biopython-1.81-cp37-cp37m-win32.whl", hash = "sha256:35506e39822c52d11cf09a3951e82375ca1bb9303960b4286acf02c9a6f6c4cc"}, + {file = "biopython-1.81-cp37-cp37m-win_amd64.whl", hash = "sha256:793c42a376cd63f62f8a088ce39b7dc6b5c55e4e9031d887c434de1595bfa4b8"}, + {file = "biopython-1.81-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:11d673698b3d0d6589292ea951fb62cb24ea27d273eca0d08dbbd956690f97f5"}, + {file = "biopython-1.81-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:655df416936662c0c8a06a549cb25e1560e1fea5067d850f34fb714b8a3fae6c"}, + {file = "biopython-1.81-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:762c6c43a8486b5fcd07f136a3217b87d24755618b9ea9da1f17124ff44c2ad6"}, + {file = "biopython-1.81-cp38-cp38-win32.whl", hash = "sha256:ee51bb1cd7decffd24da6b76d5e01b7e2fd818ab85cf0c180226cbb5793a3abd"}, + {file = "biopython-1.81-cp38-cp38-win_amd64.whl", hash = "sha256:ccd729249fd5f586dd4c2a3507c2ea2456825d7e615e97c07c409c850eaf4594"}, + {file = "biopython-1.81-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9ba33244f0eff830beaa7240065bdb5095d96fded6599b76bbb9ddab45cd2bbd"}, + {file = "biopython-1.81-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8bb0c690c7368f255ed45236bf0f5464b476b8c083c8f634533921af78278261"}, + {file = "biopython-1.81-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65b93b513ce9dd7b2ce058720eadf42cd03f312db3409356efeb93123d1320aa"}, + {file = "biopython-1.81-cp39-cp39-win32.whl", hash = "sha256:811796f8d222aa3869a50e31e54ce62b69106b47cd8bb06934867c0d843297b5"}, + {file = "biopython-1.81-cp39-cp39-win_amd64.whl", hash = "sha256:b09efcb4733c8770f25eab5fe555a96a08f5ab9e1bc36939e08ebf2ffbf3e0f1"}, + {file = "biopython-1.81.tar.gz", hash = "sha256:2cf38112b6d8415ad39d6a611988cd11fb5f33eb09346666a87263beba9614e0"}, +] [package.dependencies] numpy = "*" [[package]] name = "biothings-client" -version = "0.2.6" +version = "0.3.1" description = "Python Client for BioThings API services." -category = "main" optional = false -python-versions = "*" +python-versions = ">=2.7" +files = [ + {file = "biothings_client-0.3.1-py2.py3-none-any.whl", hash = "sha256:c08437f652d9282da785e098288ef7cf3aa2a79f5d90c480eadfce96b846013e"}, + {file = "biothings_client-0.3.1.tar.gz", hash = "sha256:c972bf2e02b6f9cc78f7f2fbc5ef02cc56fe4f8a2adcb8801ec902f4ab7011e6"}, +] [package.dependencies] requests = ">=2.3.0" [package.extras] -jsonld = ["PyLD (>=0.7.2)"] -dataframe = ["pandas (>=0.18.0)"] caching = ["requests-cache (>=0.4.13)"] +dataframe = ["pandas (>=0.18.0)"] +jsonld = ["PyLD (>=0.7.2)"] [[package]] name = "certifi" -version = "2022.12.7" +version = "2023.11.17" description = "Python package for providing Mozilla's CA Bundle." -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "certifi-2023.11.17-py3-none-any.whl", hash = "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474"}, + {file = "certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1"}, +] [[package]] name = "charset-normalizer" -version = "2.1.1" +version = "3.3.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "main" optional = false -python-versions = ">=3.6.0" - -[package.extras] -unicode_backport = ["unicodedata2"] +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, +] [[package]] name = "cigar" version = "0.1.3" description = "manipulate SAM cigar strings" -category = "dev" optional = false python-versions = "*" +files = [ + {file = "cigar-0.1.3.tar.gz", hash = "sha256:5847f5e8968035b3a5b04dcfa879fb6c14dd3a42dce8994864806dcda8a4fcf2"}, +] [[package]] name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "gprofiler-official" +version = "1.0.0" +description = "Functional enrichment analysis and more via the g:Profiler toolkit" +optional = false +python-versions = "*" +files = [ + {file = "gprofiler-official-1.0.0.tar.gz", hash = "sha256:5015b47f10fbdcb59c57e342e815c9c07afbe57cd3984154f75b845ddef2445d"}, + {file = "gprofiler_official-1.0.0-py3-none-any.whl", hash = "sha256:c582baf728e5a6cddac964e4085ca385e082c4ef0279e3af1a16a9af07ab5395"}, +] + +[package.dependencies] +requests = "*" [[package]] name = "idna" version = "3.4" description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] [[package]] name = "iniconfig" version = "2.0.0" description = "brain-dead simple config-ini parsing" -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] [[package]] name = "mygene" version = "3.2.2" description = "Python Client for MyGene.Info services." -category = "main" optional = false python-versions = "*" +files = [ + {file = "mygene-3.2.2-py2.py3-none-any.whl", hash = "sha256:18d85d1b28ecee2be31d844607fb0c5f7d7c58573278432df819ee2a5e88fe46"}, + {file = "mygene-3.2.2.tar.gz", hash = "sha256:e729cabbc28cf5afb221bca1ab637883b375cb1a3e2f067587ec79f71affdaea"}, +] [package.dependencies] biothings-client = ">=0.2.6" [[package]] name = "numpy" -version = "1.24.1" +version = "1.26.2" description = "Fundamental package for array computing in Python" -category = "main" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" +files = [ + {file = "numpy-1.26.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3703fc9258a4a122d17043e57b35e5ef1c5a5837c3db8be396c82e04c1cf9b0f"}, + {file = "numpy-1.26.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cc392fdcbd21d4be6ae1bb4475a03ce3b025cd49a9be5345d76d7585aea69440"}, + {file = "numpy-1.26.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36340109af8da8805d8851ef1d74761b3b88e81a9bd80b290bbfed61bd2b4f75"}, + {file = "numpy-1.26.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bcc008217145b3d77abd3e4d5ef586e3bdfba8fe17940769f8aa09b99e856c00"}, + {file = "numpy-1.26.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3ced40d4e9e18242f70dd02d739e44698df3dcb010d31f495ff00a31ef6014fe"}, + {file = "numpy-1.26.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b272d4cecc32c9e19911891446b72e986157e6a1809b7b56518b4f3755267523"}, + {file = "numpy-1.26.2-cp310-cp310-win32.whl", hash = "sha256:22f8fc02fdbc829e7a8c578dd8d2e15a9074b630d4da29cda483337e300e3ee9"}, + {file = "numpy-1.26.2-cp310-cp310-win_amd64.whl", hash = "sha256:26c9d33f8e8b846d5a65dd068c14e04018d05533b348d9eaeef6c1bd787f9919"}, + {file = "numpy-1.26.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b96e7b9c624ef3ae2ae0e04fa9b460f6b9f17ad8b4bec6d7756510f1f6c0c841"}, + {file = "numpy-1.26.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:aa18428111fb9a591d7a9cc1b48150097ba6a7e8299fb56bdf574df650e7d1f1"}, + {file = "numpy-1.26.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06fa1ed84aa60ea6ef9f91ba57b5ed963c3729534e6e54055fc151fad0423f0a"}, + {file = "numpy-1.26.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96ca5482c3dbdd051bcd1fce8034603d6ebfc125a7bd59f55b40d8f5d246832b"}, + {file = "numpy-1.26.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:854ab91a2906ef29dc3925a064fcd365c7b4da743f84b123002f6139bcb3f8a7"}, + {file = "numpy-1.26.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f43740ab089277d403aa07567be138fc2a89d4d9892d113b76153e0e412409f8"}, + {file = "numpy-1.26.2-cp311-cp311-win32.whl", hash = "sha256:a2bbc29fcb1771cd7b7425f98b05307776a6baf43035d3b80c4b0f29e9545186"}, + {file = "numpy-1.26.2-cp311-cp311-win_amd64.whl", hash = "sha256:2b3fca8a5b00184828d12b073af4d0fc5fdd94b1632c2477526f6bd7842d700d"}, + {file = "numpy-1.26.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a4cd6ed4a339c21f1d1b0fdf13426cb3b284555c27ac2f156dfdaaa7e16bfab0"}, + {file = "numpy-1.26.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5d5244aabd6ed7f312268b9247be47343a654ebea52a60f002dc70c769048e75"}, + {file = "numpy-1.26.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a3cdb4d9c70e6b8c0814239ead47da00934666f668426fc6e94cce869e13fd7"}, + {file = "numpy-1.26.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa317b2325f7aa0a9471663e6093c210cb2ae9c0ad824732b307d2c51983d5b6"}, + {file = "numpy-1.26.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:174a8880739c16c925799c018f3f55b8130c1f7c8e75ab0a6fa9d41cab092fd6"}, + {file = "numpy-1.26.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f79b231bf5c16b1f39c7f4875e1ded36abee1591e98742b05d8a0fb55d8a3eec"}, + {file = "numpy-1.26.2-cp312-cp312-win32.whl", hash = "sha256:4a06263321dfd3598cacb252f51e521a8cb4b6df471bb12a7ee5cbab20ea9167"}, + {file = "numpy-1.26.2-cp312-cp312-win_amd64.whl", hash = "sha256:b04f5dc6b3efdaab541f7857351aac359e6ae3c126e2edb376929bd3b7f92d7e"}, + {file = "numpy-1.26.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4eb8df4bf8d3d90d091e0146f6c28492b0be84da3e409ebef54349f71ed271ef"}, + {file = "numpy-1.26.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1a13860fdcd95de7cf58bd6f8bc5a5ef81c0b0625eb2c9a783948847abbef2c2"}, + {file = "numpy-1.26.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64308ebc366a8ed63fd0bf426b6a9468060962f1a4339ab1074c228fa6ade8e3"}, + {file = "numpy-1.26.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baf8aab04a2c0e859da118f0b38617e5ee65d75b83795055fb66c0d5e9e9b818"}, + {file = "numpy-1.26.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d73a3abcac238250091b11caef9ad12413dab01669511779bc9b29261dd50210"}, + {file = "numpy-1.26.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b361d369fc7e5e1714cf827b731ca32bff8d411212fccd29ad98ad622449cc36"}, + {file = "numpy-1.26.2-cp39-cp39-win32.whl", hash = "sha256:bd3f0091e845164a20bd5a326860c840fe2af79fa12e0469a12768a3ec578d80"}, + {file = "numpy-1.26.2-cp39-cp39-win_amd64.whl", hash = "sha256:2beef57fb031dcc0dc8fa4fe297a742027b954949cabb52a2a376c144e5e6060"}, + {file = "numpy-1.26.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1cc3d5029a30fb5f06704ad6b23b35e11309491c999838c31f124fee32107c79"}, + {file = "numpy-1.26.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94cc3c222bb9fb5a12e334d0479b97bb2df446fbe622b470928f5284ffca3f8d"}, + {file = "numpy-1.26.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fe6b44fb8fcdf7eda4ef4461b97b3f63c466b27ab151bec2366db8b197387841"}, + {file = "numpy-1.26.2.tar.gz", hash = "sha256:f65738447676ab5777f11e6bbbdb8ce11b785e105f690bc45966574816b6d3ea"}, +] [[package]] name = "packaging" -version = "23.0" +version = "23.2" description = "Core utilities for Python packages" -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, +] [[package]] name = "pandas" -version = "1.5.2" +version = "1.5.3" description = "Powerful data structures for data analysis, time series, and statistics" -category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "pandas-1.5.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3749077d86e3a2f0ed51367f30bf5b82e131cc0f14260c4d3e499186fccc4406"}, + {file = "pandas-1.5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:972d8a45395f2a2d26733eb8d0f629b2f90bebe8e8eddbb8829b180c09639572"}, + {file = "pandas-1.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:50869a35cbb0f2e0cd5ec04b191e7b12ed688874bd05dd777c19b28cbea90996"}, + {file = "pandas-1.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3ac844a0fe00bfaeb2c9b51ab1424e5c8744f89860b138434a363b1f620f354"}, + {file = "pandas-1.5.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a0a56cef15fd1586726dace5616db75ebcfec9179a3a55e78f72c5639fa2a23"}, + {file = "pandas-1.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:478ff646ca42b20376e4ed3fa2e8d7341e8a63105586efe54fa2508ee087f328"}, + {file = "pandas-1.5.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6973549c01ca91ec96199e940495219c887ea815b2083722821f1d7abfa2b4dc"}, + {file = "pandas-1.5.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c39a8da13cede5adcd3be1182883aea1c925476f4e84b2807a46e2775306305d"}, + {file = "pandas-1.5.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f76d097d12c82a535fda9dfe5e8dd4127952b45fea9b0276cb30cca5ea313fbc"}, + {file = "pandas-1.5.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e474390e60ed609cec869b0da796ad94f420bb057d86784191eefc62b65819ae"}, + {file = "pandas-1.5.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f2b952406a1588ad4cad5b3f55f520e82e902388a6d5a4a91baa8d38d23c7f6"}, + {file = "pandas-1.5.3-cp311-cp311-win_amd64.whl", hash = "sha256:bc4c368f42b551bf72fac35c5128963a171b40dce866fb066540eeaf46faa003"}, + {file = "pandas-1.5.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:14e45300521902689a81f3f41386dc86f19b8ba8dd5ac5a3c7010ef8d2932813"}, + {file = "pandas-1.5.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9842b6f4b8479e41968eced654487258ed81df7d1c9b7b870ceea24ed9459b31"}, + {file = "pandas-1.5.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:26d9c71772c7afb9d5046e6e9cf42d83dd147b5cf5bcb9d97252077118543792"}, + {file = "pandas-1.5.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fbcb19d6fceb9e946b3e23258757c7b225ba450990d9ed63ccceeb8cae609f7"}, + {file = "pandas-1.5.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:565fa34a5434d38e9d250af3c12ff931abaf88050551d9fbcdfafca50d62babf"}, + {file = "pandas-1.5.3-cp38-cp38-win32.whl", hash = "sha256:87bd9c03da1ac870a6d2c8902a0e1fd4267ca00f13bc494c9e5a9020920e1d51"}, + {file = "pandas-1.5.3-cp38-cp38-win_amd64.whl", hash = "sha256:41179ce559943d83a9b4bbacb736b04c928b095b5f25dd2b7389eda08f46f373"}, + {file = "pandas-1.5.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c74a62747864ed568f5a82a49a23a8d7fe171d0c69038b38cedf0976831296fa"}, + {file = "pandas-1.5.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c4c00e0b0597c8e4f59e8d461f797e5d70b4d025880516a8261b2817c47759ee"}, + {file = "pandas-1.5.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a50d9a4336a9621cab7b8eb3fb11adb82de58f9b91d84c2cd526576b881a0c5a"}, + {file = "pandas-1.5.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd05f7783b3274aa206a1af06f0ceed3f9b412cf665b7247eacd83be41cf7bf0"}, + {file = "pandas-1.5.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f69c4029613de47816b1bb30ff5ac778686688751a5e9c99ad8c7031f6508e5"}, + {file = "pandas-1.5.3-cp39-cp39-win32.whl", hash = "sha256:7cec0bee9f294e5de5bbfc14d0573f65526071029d036b753ee6507d2a21480a"}, + {file = "pandas-1.5.3-cp39-cp39-win_amd64.whl", hash = "sha256:dfd681c5dc216037e0b0a2c821f5ed99ba9f03ebcf119c7dac0e9a7b960b9ec9"}, + {file = "pandas-1.5.3.tar.gz", hash = "sha256:74a3fd7e5a7ec052f183273dc7b0acd3a863edf7520f5d3a1765c04ffdb3b0b1"}, +] [package.dependencies] numpy = [ @@ -160,52 +390,117 @@ pytz = ">=2020.1" [package.extras] test = ["hypothesis (>=5.5.3)", "pytest (>=6.0)", "pytest-xdist (>=1.31)"] +[[package]] +name = "platformdirs" +version = "4.0.0" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +optional = false +python-versions = ">=3.7" +files = [ + {file = "platformdirs-4.0.0-py3-none-any.whl", hash = "sha256:118c954d7e949b35437270383a3f2531e99dd93cf7ce4dc8340d3356d30f173b"}, + {file = "platformdirs-4.0.0.tar.gz", hash = "sha256:cb633b2bcf10c51af60beb0ab06d2f1d69064b43abf4c185ca6b28865f3f9731"}, +] + +[package.extras] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] + [[package]] name = "pluggy" -version = "1.0.0" +version = "1.3.0" description = "plugin and hook calling mechanisms for python" -category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" +files = [ + {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, + {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, +] [package.extras] dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] +[[package]] +name = "pooch" +version = "1.8.0" +description = "\"Pooch manages your Python library's sample data files: it automatically downloads and stores them in a local directory, with support for versioning and corruption checks.\"" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pooch-1.8.0-py3-none-any.whl", hash = "sha256:1bfba436d9e2ad5199ccad3583cca8c241b8736b5bb23fe67c213d52650dbb66"}, + {file = "pooch-1.8.0.tar.gz", hash = "sha256:f59981fd5b9b5d032dcde8f4a11eaa492c2ac6343fae3596a2fdae35fc54b0a0"}, +] + +[package.dependencies] +packaging = ">=20.0" +platformdirs = ">=2.5.0" +requests = ">=2.19.0" + +[package.extras] +progress = ["tqdm (>=4.41.0,<5.0.0)"] +sftp = ["paramiko (>=2.7.0)"] +xxhash = ["xxhash (>=1.4.3)"] + [[package]] name = "py" version = "1.11.0" description = "library with cross-python path, ini-parsing, io, code, log facilities" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, + {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, +] [[package]] name = "pybind11" -version = "2.10.3" +version = "2.11.1" description = "Seamless operability between C++11 and Python" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "pybind11-2.11.1-py3-none-any.whl", hash = "sha256:33cdd02a6453380dd71cc70357ce388ad1ee8d32bd0e38fc22b273d050aa29b3"}, + {file = "pybind11-2.11.1.tar.gz", hash = "sha256:00cd59116a6e8155aecd9174f37ba299d1d397ed4a6b86ac1dfe01b3e40f2cc4"}, +] [package.extras] -global = ["pybind11-global (==2.10.3)"] +global = ["pybind11-global (==2.11.1)"] [[package]] name = "pysam" version = "0.18.0" description = "pysam" -category = "main" optional = false python-versions = "*" +files = [ + {file = "pysam-0.18.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ef5d8ad01cac8974cd09832c226cbb63a3f7c5bd63727d8e59447021ee16a186"}, + {file = "pysam-0.18.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ca0c9289dfdc5e1a81bccdb8305192cd14cf9730bd21320ceca949fde071a572"}, + {file = "pysam-0.18.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e13e496da3a432db24f424439834b0ab5f40700a3db6e610d06f8bd639d9fd2d"}, + {file = "pysam-0.18.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c90341434e7a99439174aa64ca5406f63528be4217d4401fb30ec4ea4629c559"}, + {file = "pysam-0.18.0-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a88f875114bd3d8efb7fade80e0640094383ec5043861aa575175fa9a56edf90"}, + {file = "pysam-0.18.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7ea2e019294e4bf25e4892b5de69c43f54fb6ac42b681265268aa322e1f36f5b"}, + {file = "pysam-0.18.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cfb162358c5284b31b2b88b10947e0f1013da2d85ba0fd0b5723dd142c15329e"}, + {file = "pysam-0.18.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9422c2d0b581c3d24f247c15bb8981569e636003c4d6cad39ccd1bf205a79f2c"}, + {file = "pysam-0.18.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cfffad99cf3968cf85aadb70a8a02303f9172ea21abe02d587c44f808c504f52"}, + {file = "pysam-0.18.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7a8a25fceaaa96e5b4c8b0a7fd6bb0b20b6c262dc4cc867c6d1467ac990f1d77"}, + {file = "pysam-0.18.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:493988420db16e6ee03393518e4d272df05f0a35780248c08c61da7411e520e7"}, + {file = "pysam-0.18.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7f6a4ec58ad7995b791a71bf35f673ea794e734c587ea7329fca5cce9c53a7af"}, + {file = "pysam-0.18.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0cfa16f76ed3c3119c7b3c8dfdcba9e010fbcdcf87eaa165351bb369da5a6bf1"}, + {file = "pysam-0.18.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2717509556fecddf7c73966fa62066c6a59a7d39b755d8972afa8d143a1d5aa5"}, + {file = "pysam-0.18.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f5a23a5dcf32f01c66d44e89113fa8f7522997ea43fbc0f98e5250a907911a5f"}, + {file = "pysam-0.18.0.tar.gz", hash = "sha256:1d6d49a0b3c626fae410a93d4c80583a8b5ddaacc9b46a080b250dbcebd30a59"}, +] [[package]] name = "pytest" version = "6.2.5" description = "pytest: simple powerful testing with Python" -category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, + {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, +] [package.dependencies] atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} @@ -222,193 +517,227 @@ testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xm [[package]] name = "pytest-mock" -version = "3.10.0" +version = "3.12.0" description = "Thin-wrapper around the mock package for easier use with pytest" -category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "pytest-mock-3.12.0.tar.gz", hash = "sha256:31a40f038c22cad32287bb43932054451ff5583ff094bca6f675df2f8bc1a6e9"}, + {file = "pytest_mock-3.12.0-py3-none-any.whl", hash = "sha256:0972719a7263072da3a21c7f4773069bcc7486027d7e8e1f81d98a47e701bc4f"}, +] [package.dependencies] pytest = ">=5.0" [package.extras] -dev = ["pre-commit", "tox", "pytest-asyncio"] +dev = ["pre-commit", "pytest-asyncio", "tox"] [[package]] name = "python-dateutil" version = "2.8.2" description = "Extensions to the standard Python datetime module" -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] [package.dependencies] six = ">=1.5" [[package]] name = "pytz" -version = "2022.7" +version = "2023.3.post1" description = "World timezone definitions, modern and historical" -category = "main" optional = false python-versions = "*" +files = [ + {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"}, + {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, +] [[package]] name = "pyyaml" -version = "6.0" +version = "6.0.1" description = "YAML parser and emitter for Python" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, + {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, +] [[package]] name = "requests" -version = "2.28.1" +version = "2.31.0" description = "Python HTTP for Humans." -category = "main" optional = false -python-versions = ">=3.7, <4" +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] [package.dependencies] certifi = ">=2017.4.17" -charset-normalizer = ">=2,<3" +charset-normalizer = ">=2,<4" idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<1.27" +urllib3 = ">=1.21.1,<3" [package.extras] socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "scipy" -version = "1.10.0" +version = "1.11.4" description = "Fundamental algorithms for scientific computing in Python" -category = "main" optional = false -python-versions = "<3.12,>=3.8" +python-versions = ">=3.9" +files = [ + {file = "scipy-1.11.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc9a714581f561af0848e6b69947fda0614915f072dfd14142ed1bfe1b806710"}, + {file = "scipy-1.11.4-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:cf00bd2b1b0211888d4dc75656c0412213a8b25e80d73898083f402b50f47e41"}, + {file = "scipy-1.11.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9999c008ccf00e8fbcce1236f85ade5c569d13144f77a1946bef8863e8f6eb4"}, + {file = "scipy-1.11.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:933baf588daa8dc9a92c20a0be32f56d43faf3d1a60ab11b3f08c356430f6e56"}, + {file = "scipy-1.11.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8fce70f39076a5aa62e92e69a7f62349f9574d8405c0a5de6ed3ef72de07f446"}, + {file = "scipy-1.11.4-cp310-cp310-win_amd64.whl", hash = "sha256:6550466fbeec7453d7465e74d4f4b19f905642c89a7525571ee91dd7adabb5a3"}, + {file = "scipy-1.11.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f313b39a7e94f296025e3cffc2c567618174c0b1dde173960cf23808f9fae4be"}, + {file = "scipy-1.11.4-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:1b7c3dca977f30a739e0409fb001056484661cb2541a01aba0bb0029f7b68db8"}, + {file = "scipy-1.11.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00150c5eae7b610c32589dda259eacc7c4f1665aedf25d921907f4d08a951b1c"}, + {file = "scipy-1.11.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:530f9ad26440e85766509dbf78edcfe13ffd0ab7fec2560ee5c36ff74d6269ff"}, + {file = "scipy-1.11.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5e347b14fe01003d3b78e196e84bd3f48ffe4c8a7b8a1afbcb8f5505cb710993"}, + {file = "scipy-1.11.4-cp311-cp311-win_amd64.whl", hash = "sha256:acf8ed278cc03f5aff035e69cb511741e0418681d25fbbb86ca65429c4f4d9cd"}, + {file = "scipy-1.11.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:028eccd22e654b3ea01ee63705681ee79933652b2d8f873e7949898dda6d11b6"}, + {file = "scipy-1.11.4-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2c6ff6ef9cc27f9b3db93a6f8b38f97387e6e0591600369a297a50a8e96e835d"}, + {file = "scipy-1.11.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b030c6674b9230d37c5c60ab456e2cf12f6784596d15ce8da9365e70896effc4"}, + {file = "scipy-1.11.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad669df80528aeca5f557712102538f4f37e503f0c5b9541655016dd0932ca79"}, + {file = "scipy-1.11.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ce7fff2e23ab2cc81ff452a9444c215c28e6305f396b2ba88343a567feec9660"}, + {file = "scipy-1.11.4-cp312-cp312-win_amd64.whl", hash = "sha256:36750b7733d960d7994888f0d148d31ea3017ac15eef664194b4ef68d36a4a97"}, + {file = "scipy-1.11.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6e619aba2df228a9b34718efb023966da781e89dd3d21637b27f2e54db0410d7"}, + {file = "scipy-1.11.4-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:f3cd9e7b3c2c1ec26364856f9fbe78695fe631150f94cd1c22228456404cf1ec"}, + {file = "scipy-1.11.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d10e45a6c50211fe256da61a11c34927c68f277e03138777bdebedd933712fea"}, + {file = "scipy-1.11.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91af76a68eeae0064887a48e25c4e616fa519fa0d38602eda7e0f97d65d57937"}, + {file = "scipy-1.11.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6df1468153a31cf55ed5ed39647279beb9cfb5d3f84369453b49e4b8502394fd"}, + {file = "scipy-1.11.4-cp39-cp39-win_amd64.whl", hash = "sha256:ee410e6de8f88fd5cf6eadd73c135020bfbbbdfcd0f6162c36a7638a1ea8cc65"}, + {file = "scipy-1.11.4.tar.gz", hash = "sha256:90a2b78e7f5733b9de748f589f09225013685f9b218275257f8a8168ededaeaa"}, +] [package.dependencies] -numpy = ">=1.19.5,<1.27.0" +numpy = ">=1.21.6,<1.28.0" [package.extras] -test = ["pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "asv", "mpmath", "gmpy2", "threadpoolctl", "scikit-umfpack", "pooch"] -doc = ["sphinx (!=4.1.0)", "pydata-sphinx-theme (==0.9.0)", "sphinx-design (>=0.2.0)", "matplotlib (>2)", "numpydoc"] -dev = ["mypy", "typing-extensions", "pycodestyle", "flake8", "rich-click", "click", "doit (>=0.36.0)", "pydevtool"] +dev = ["click", "cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"] +doc = ["jupytext", "matplotlib (>2)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] +test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] [[package]] name = "toml" version = "0.10.2" description = "Python Library for Tom's Obvious, Minimal Language" -category = "dev" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] [[package]] name = "tqdm" -version = "4.64.1" +version = "4.66.1" description = "Fast, Extensible Progress Meter" -category = "main" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +python-versions = ">=3.7" +files = [ + {file = "tqdm-4.66.1-py3-none-any.whl", hash = "sha256:d302b3c5b53d47bce91fea46679d9c3c6508cf6332229aa1e7d8653723793386"}, + {file = "tqdm-4.66.1.tar.gz", hash = "sha256:d88e651f9db8d8551a62556d3cff9e3034274ca5d66e93197cf2490e2dcb69c7"}, +] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} [package.extras] -dev = ["py-make (>=0.1.0)", "twine", "wheel"] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] notebook = ["ipywidgets (>=6)"] slack = ["slack-sdk"] telegram = ["requests"] [[package]] name = "urllib3" -version = "1.26.13" +version = "2.1.0" description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.8" +files = [ + {file = "urllib3-2.1.0-py3-none-any.whl", hash = "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3"}, + {file = "urllib3-2.1.0.tar.gz", hash = "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54"}, +] [package.extras] -brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] -secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "urllib3-secure-extra", "ipaddress"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] [metadata] -lock-version = "1.1" +lock-version = "2.0" python-versions = ">=3.9.9,<3.11" content-hash = "97bd296adc5a4e0c9d69f5be058b42eb938c22c8194b35a9ad7aaba90c019c46" - -[metadata.files] -atomicwrites = [] -attrs = [] -bio = [] -biopython = [] -biothings-client = [] -certifi = [] -charset-normalizer = [] -cigar = [] -colorama = [] -idna = [] -iniconfig = [] -mygene = [] -numpy = [] -packaging = [] -pandas = [] -pluggy = [ - {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, - {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, -] -py = [ - {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, - {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, -] -pybind11 = [] -pysam = [ - {file = "pysam-0.18.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ef5d8ad01cac8974cd09832c226cbb63a3f7c5bd63727d8e59447021ee16a186"}, - {file = "pysam-0.18.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ca0c9289dfdc5e1a81bccdb8305192cd14cf9730bd21320ceca949fde071a572"}, - {file = "pysam-0.18.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e13e496da3a432db24f424439834b0ab5f40700a3db6e610d06f8bd639d9fd2d"}, - {file = "pysam-0.18.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c90341434e7a99439174aa64ca5406f63528be4217d4401fb30ec4ea4629c559"}, - {file = "pysam-0.18.0-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a88f875114bd3d8efb7fade80e0640094383ec5043861aa575175fa9a56edf90"}, - {file = "pysam-0.18.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7ea2e019294e4bf25e4892b5de69c43f54fb6ac42b681265268aa322e1f36f5b"}, - {file = "pysam-0.18.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cfb162358c5284b31b2b88b10947e0f1013da2d85ba0fd0b5723dd142c15329e"}, - {file = "pysam-0.18.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9422c2d0b581c3d24f247c15bb8981569e636003c4d6cad39ccd1bf205a79f2c"}, - {file = "pysam-0.18.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cfffad99cf3968cf85aadb70a8a02303f9172ea21abe02d587c44f808c504f52"}, - {file = "pysam-0.18.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7a8a25fceaaa96e5b4c8b0a7fd6bb0b20b6c262dc4cc867c6d1467ac990f1d77"}, - {file = "pysam-0.18.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:493988420db16e6ee03393518e4d272df05f0a35780248c08c61da7411e520e7"}, - {file = "pysam-0.18.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7f6a4ec58ad7995b791a71bf35f673ea794e734c587ea7329fca5cce9c53a7af"}, - {file = "pysam-0.18.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0cfa16f76ed3c3119c7b3c8dfdcba9e010fbcdcf87eaa165351bb369da5a6bf1"}, - {file = "pysam-0.18.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2717509556fecddf7c73966fa62066c6a59a7d39b755d8972afa8d143a1d5aa5"}, - {file = "pysam-0.18.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f5a23a5dcf32f01c66d44e89113fa8f7522997ea43fbc0f98e5250a907911a5f"}, - {file = "pysam-0.18.0.tar.gz", hash = "sha256:1d6d49a0b3c626fae410a93d4c80583a8b5ddaacc9b46a080b250dbcebd30a59"}, -] -pytest = [ - {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, - {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, -] -pytest-mock = [] -python-dateutil = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, -] -pytz = [] -pyyaml = [] -requests = [] -scipy = [] -six = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] -toml = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] -tqdm = [] -urllib3 = [] diff --git a/pyproject.toml b/pyproject.toml index 57fe425..2f7004f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,16 +1,16 @@ [tool.poetry] -name = "ShoRAH" +name = "VILOCA" version = "0.1.0" description = "SHOrt Reads Assembly into Haplotypes" license = "GPL-3.0-only" -authors = ["Benjamin Langer "] -build = "build.py" +authors = ["Benjamin Langer , Lara Fuhrmann] +#build = "build.py" # Lara: I am not sure if we need this or not. packages = [ - { include = "shorah" } + { include = "viloca" } ] [tool.poetry.scripts] -shorah = 'shorah.cli:main' +viloca = 'viloca.cli:main' [tool.poetry.dependencies] python = ">=3.9.9,<3.11" From 4fe78c8a11c2aba8df4749c587c937c99a460e8f Mon Sep 17 00:00:00 2001 From: LaraFuhrmann <55209716+LaraFuhrmann@users.noreply.github.com> Date: Thu, 23 Nov 2023 14:43:37 +0100 Subject: [PATCH 21/25] update viloca naming here --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 2f7004f..7a50826 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ name = "VILOCA" version = "0.1.0" description = "SHOrt Reads Assembly into Haplotypes" license = "GPL-3.0-only" -authors = ["Benjamin Langer , Lara Fuhrmann] +authors = ["Benjamin Langer , Lara Fuhrmann"] #build = "build.py" # Lara: I am not sure if we need this or not. packages = [ { include = "viloca" } From 1d4185fbc0ed9c7c35a13906ab0328ae56c73497 Mon Sep 17 00:00:00 2001 From: LaraFuhrmann <55209716+LaraFuhrmann@users.noreply.github.com> Date: Thu, 23 Nov 2023 14:51:03 +0100 Subject: [PATCH 22/25] [unit tests] update commands --- tests/data_1/shotgun_test.sh | 2 +- tests/data_5/shotgun_prepare.sh | 2 +- tests/test_b2w.py | 2 +- tests/test_b2w_mapping.py | 2 +- tests/test_envp_post.py | 2 +- tests/test_pooled_post.py | 4 ++-- tests/test_pooled_pre.py | 4 ++-- tests/test_shorah_snv.py | 4 ++-- tests/test_tiling.py | 2 +- 9 files changed, 12 insertions(+), 12 deletions(-) diff --git a/tests/data_1/shotgun_test.sh b/tests/data_1/shotgun_test.sh index 0ac3749..77925d3 100755 --- a/tests/data_1/shotgun_test.sh +++ b/tests/data_1/shotgun_test.sh @@ -1,4 +1,4 @@ #!/bin/bash -shorah shotgun -a 0.1 -w 201 -x 100000 -p 0.9 -c 0 \ +viloca run -a 0.1 -w 201 -x 100000 -p 0.9 -c 0 \ -r HXB2:2469-3713 -R 42 -f test_ref.fasta -b test_aln.cram --out_format csv "$@" diff --git a/tests/data_5/shotgun_prepare.sh b/tests/data_5/shotgun_prepare.sh index 81564db..0ce7749 100755 --- a/tests/data_5/shotgun_prepare.sh +++ b/tests/data_5/shotgun_prepare.sh @@ -1,3 +1,3 @@ #!/bin/bash -shorah shotgun -a 0.1 -w 42 -x 100000 -p 0.9 -c 0 -r REF:43-273 -R 42 -b test_aln.cram -f ref.fasta +viloca run -a 0.1 -w 42 -x 100000 -p 0.9 -c 0 -r REF:43-273 -R 42 -b test_aln.cram -f ref.fasta diff --git a/tests/test_b2w.py b/tests/test_b2w.py index c41609a..7a3dd8e 100644 --- a/tests/test_b2w.py +++ b/tests/test_b2w.py @@ -2,7 +2,7 @@ import filecmp import os import glob -from shorah import b2w, tiling +from viloca import b2w, tiling import math import libshorah diff --git a/tests/test_b2w_mapping.py b/tests/test_b2w_mapping.py index ad5767c..6a0fb84 100644 --- a/tests/test_b2w_mapping.py +++ b/tests/test_b2w_mapping.py @@ -1,7 +1,7 @@ from array import array import pytest from cigar import Cigar -from shorah import b2w +from viloca import b2w import hashlib class MockAlignedSegment: diff --git a/tests/test_envp_post.py b/tests/test_envp_post.py index 205ed05..d4b4fb3 100644 --- a/tests/test_envp_post.py +++ b/tests/test_envp_post.py @@ -1,5 +1,5 @@ from unittest.mock import patch, mock_open -from shorah import envp_post +from viloca import envp_post DEFAULT_MOCK_DATA = "default mock data" diff --git a/tests/test_pooled_post.py b/tests/test_pooled_post.py index f491ba5..7baf31c 100644 --- a/tests/test_pooled_post.py +++ b/tests/test_pooled_post.py @@ -1,5 +1,5 @@ from unittest.mock import patch, mock_open -from shorah import pooled_post +from viloca import pooled_post import numpy as np DEFAULT_MOCK_DATA = "default mock data" @@ -48,4 +48,4 @@ def open_side_effect(name): # open("debug/w-HXB2-2938-3138.dbg"), # open("support/w-HXB2-2938-3138.reads-support.fas"), # open("corrected/w-HXB2-2938-3138.reads-cor.fas"), -# "shorah") # TODO \ No newline at end of file +# "shorah") # TODO diff --git a/tests/test_pooled_pre.py b/tests/test_pooled_pre.py index ce36024..dbe59ab 100644 --- a/tests/test_pooled_pre.py +++ b/tests/test_pooled_pre.py @@ -1,6 +1,6 @@ import pysam import os -from shorah import pooled_pre +from viloca import pooled_pre def test__annotate_alignment_file(): out = "out.bam" @@ -48,4 +48,4 @@ def test_pre_process_pooled(): os.remove(out + ".bai") assert a[0] == a[1] != 0 - assert a[2] == 0 \ No newline at end of file + assert a[2] == 0 diff --git a/tests/test_shorah_snv.py b/tests/test_shorah_snv.py index 56b0166..4967b55 100644 --- a/tests/test_shorah_snv.py +++ b/tests/test_shorah_snv.py @@ -1,5 +1,5 @@ import pytest -from shorah.shorah_snv import _compare_ref_to_read, SNP_id, SNV +from viloca.shorah_snv import _compare_ref_to_read, SNP_id, SNV @pytest.mark.parametrize("ref, seq, spec", [ @@ -39,4 +39,4 @@ def test_compare_ref_to_read(ref, seq, spec): assert snp == spec - assert tot_snv == len(snp) \ No newline at end of file + assert tot_snv == len(snp) diff --git a/tests/test_tiling.py b/tests/test_tiling.py index f44d66f..89e38fc 100644 --- a/tests/test_tiling.py +++ b/tests/test_tiling.py @@ -1,4 +1,4 @@ -from shorah import tiling +from viloca import tiling import pytest def test_equispaced(): From a7ae55968ed51bcbd3ec1a419a27df42b7d3d997 Mon Sep 17 00:00:00 2001 From: LaraFuhrmann <55209716+LaraFuhrmann@users.noreply.github.com> Date: Thu, 23 Nov 2023 14:54:50 +0100 Subject: [PATCH 23/25] update author --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 7a50826..af80064 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ name = "VILOCA" version = "0.1.0" description = "SHOrt Reads Assembly into Haplotypes" license = "GPL-3.0-only" -authors = ["Benjamin Langer , Lara Fuhrmann"] +authors = ["Benjamin Langer , Lara Fuhrmann "] #build = "build.py" # Lara: I am not sure if we need this or not. packages = [ { include = "viloca" } From da27b766a92f451476167f5618d9dd6c49320f61 Mon Sep 17 00:00:00 2001 From: LaraFuhrmann <55209716+LaraFuhrmann@users.noreply.github.com> Date: Thu, 23 Nov 2023 15:00:10 +0100 Subject: [PATCH 24/25] build is needed for libshorah --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index af80064..42da0bd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ version = "0.1.0" description = "SHOrt Reads Assembly into Haplotypes" license = "GPL-3.0-only" authors = ["Benjamin Langer , Lara Fuhrmann "] -#build = "build.py" # Lara: I am not sure if we need this or not. +build = "build.py" packages = [ { include = "viloca" } ] From 98a8e981264052b18a5c15c9cc10dc198d538732 Mon Sep 17 00:00:00 2001 From: LaraFuhrmann <55209716+LaraFuhrmann@users.noreply.github.com> Date: Mon, 27 Nov 2023 14:19:10 +0100 Subject: [PATCH 25/25] updated readme --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 7ffafbe..412dd01 100755 --- a/README.md +++ b/README.md @@ -1,9 +1,5 @@ VILOCA: VIral LOcal haplotype reconstruction and mutation CAlling for short and long read data =============== -[![Build Status](https://travis-ci.org/cbg-ethz/shorah.svg?branch=master)](https://travis-ci.org/cbg-ethz/viloca) -[![Bioconda package](https://img.shields.io/conda/dn/bioconda/shorah.svg?label=Bioconda)](https://bioconda.github.io/recipes/viloca/README.html) -[![Docker container](https://quay.io/repository/biocontainers/shorah/status)](https://quay.io/repository/biocontainers/viloca) - VILOCA is an open source project for the analysis of next generation sequencing data. It is designed to analyse genetically heterogeneous samples. Its tools @@ -23,7 +19,11 @@ pip install git+https://github.com/cbg-ethz/VILOCA@master ``` ### Example -To test your installation, we recommend running the program on `tests/data_1`. +To test your installation run VILOCA `tests/data_1`: +``` +viloca run -b test_aln.cram -f test_ref.fasta -z scheme.insert.bed --mode use_quality_scores +``` + If the sequencing amplicon strategy is known, we recommend using the amplicon-mode of the program, which takes as input the `.insert.bed` - file: `viloca run -b test_aln.cram -f test_ref.fasta -z scheme.insert.bed --mode use_quality_scores`