From 27f32d061ac34b58c30c726d52028b87f525f0b9 Mon Sep 17 00:00:00 2001 From: Alex Tate <0xalextate@gmail.com> Date: Fri, 26 May 2023 12:17:24 -0700 Subject: [PATCH 01/17] Adding config directory creation as the first step of the workflow --- START_HERE/run_config.yml | 7 ++++++- tiny/cwl/workflows/tinyrna_wf.cwl | 14 ++++++++++++++ .../compatibility/run_config_compatibility.yml | 9 ++++++++- 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/START_HERE/run_config.yml b/START_HERE/run_config.yml index c905184f..cba7a2c6 100644 --- a/START_HERE/run_config.yml +++ b/START_HERE/run_config.yml @@ -310,6 +310,7 @@ dir_name_tiny-count: tiny-count dir_name_tiny-deseq: tiny-deseq dir_name_tiny-plot: tiny-plot dir_name_logs: logs +dir_name_config: config ######################### AUTOMATICALLY GENERATED CONFIGURATIONS ######################### @@ -383,4 +384,8 @@ run_deseq: True ##-- Utilized by tiny-plot --## # Filters for class scatter plots plot_class_scatter_filter_include: [] -plot_class_scatter_filter_exclude: [] \ No newline at end of file +plot_class_scatter_filter_exclude: [] + +##-- Used to populate the directory defined in dir_name_config --## +##-- CWL spec doesn't provide a way to get this info from within the workflow --## +processed_run_config: {} \ No newline at end of file diff --git a/tiny/cwl/workflows/tinyrna_wf.cwl b/tiny/cwl/workflows/tinyrna_wf.cwl index 0380bae8..f62b62e8 100644 --- a/tiny/cwl/workflows/tinyrna_wf.cwl +++ b/tiny/cwl/workflows/tinyrna_wf.cwl @@ -15,6 +15,7 @@ inputs: # multi input threads: int? run_name: string + processed_run_config: File sample_basenames: string[] # bowtie build @@ -117,9 +118,18 @@ inputs: dir_name_tiny-count: string dir_name_tiny-deseq: string dir_name_tiny-plot: string + dir_name_config: string steps: + organize_config: + run: ../tools/make-subdir.cwl + in: + dir_files: + source: [ processed_run_config, paths_file, samples_csv, features_csv, plot_style_sheet ] + dir_name: dir_name_config + out: [ subdir ] + preprocessing: run: preprocessing.cwl scatter: [in_fq, sample_basename, fastp_report_title] @@ -353,6 +363,10 @@ steps: outputs: # Subdirectory outputs + config_out_dir: + type: Directory + outputSource: organize_config/subdir + bt_build_out_dir: type: Directory? outputSource: organize_bt_indexes/subdir diff --git a/tiny/templates/compatibility/run_config_compatibility.yml b/tiny/templates/compatibility/run_config_compatibility.yml index 8b13fb8d..e1d9a070 100644 --- a/tiny/templates/compatibility/run_config_compatibility.yml +++ b/tiny/templates/compatibility/run_config_compatibility.yml @@ -5,7 +5,14 @@ # - Adding mappings requires noting the key that should precede the new key # - Renames are evaluated before additions; preceding_key should use the new name if version renames it - +1.5.0: + remove: [] + rename: [] + add: + - preceding_key: dir_name_logs + dir_name_config: config + - preceding_key: plot_class_scatter_filter_exclude + processed_run_config: {} 1.4.0: remove: - counter_all_features From a6cdcf2d882a15a0284bf4a6f73238e58fb992be Mon Sep 17 00:00:00 2001 From: Alex Tate <0xalextate@gmail.com> Date: Fri, 26 May 2023 12:19:47 -0700 Subject: [PATCH 02/17] Extending write_processed_config() to update the `processed_run_config` key in the config object before writing (but only if it is a run config based instance) --- tiny/rna/configuration.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tiny/rna/configuration.py b/tiny/rna/configuration.py index b317fcb4..6a8de9ff 100644 --- a/tiny/rna/configuration.py +++ b/tiny/rna/configuration.py @@ -196,7 +196,13 @@ def get_outfile_path(self, infile: str = None) -> str: def write_processed_config(self, filename: str = None) -> str: """Writes the current configuration to disk""" - if filename is None: filename = self.get_outfile_path(self.inf) + if filename is None: + filename = self.get_outfile_path(self.inf) + + if "processed_run_config" in self: + # The CWL specification doesn't provide a way to get this info, + # but it's needed for run_directory/config, so we store it here + self['processed_run_config'] = self.cwl_file(filename, verify=False) with open(filename, 'w') as outconf: self.yaml.dump(self.config, outconf) From 49dbb62f578eee4f9c85bc0843f2ccbe9b4f2115 Mon Sep 17 00:00:00 2001 From: Alex Tate <0xalextate@gmail.com> Date: Fri, 26 May 2023 12:20:31 -0700 Subject: [PATCH 03/17] Updating ResumeConfig._add_timestamps() to create a timestamped config directory on resume runs --- tiny/rna/resume.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tiny/rna/resume.py b/tiny/rna/resume.py index 24858947..6cd3c22b 100644 --- a/tiny/rna/resume.py +++ b/tiny/rna/resume.py @@ -115,8 +115,9 @@ def _add_timestamps(self, steps): step_dir = "dir_name_" + subdir self[step_dir] = self[step_dir] + "_" + self.dt - # The logs dir isn't a workflow step but still needs a timestamp + # These dirs aren't from a workflow step but still need a timestamp self['dir_name_logs'] = self['dir_name_logs'] + "_" + self.dt + self['dir_name_config'] = self['dir_name_config'] + "_" + self.dt # Update run_name output prefix variable for the current date and time self['run_name'] = re.sub(timestamp_format, self.dt, self['run_name']) From 3a4c38e5a7f2964dc40f2ab5902b9bb78cefeafc Mon Sep 17 00:00:00 2001 From: Alex Tate <0xalextate@gmail.com> Date: Fri, 26 May 2023 13:59:31 -0700 Subject: [PATCH 04/17] A processed and timestamped resume run config is now written to disk during resume runs when run_native=True. Previously this only happened when run_native=False. Also cleaning up the code in resume() --- tiny/entry.py | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/tiny/entry.py b/tiny/entry.py index 1b25e45b..b418eb35 100644 --- a/tiny/entry.py +++ b/tiny/entry.py @@ -189,32 +189,32 @@ def resume(tinyrna_cwl_path: str, config_file: str, step: str) -> None: """ - # Maps step to Configuration class - entry_config = { + # Map step to Configuration class + resume_config_class = { "tiny-count": ResumeCounterConfig, "tiny-plot": ResumePlotterConfig - } + }[step] print(f"Resuming pipeline execution at the {step} step...") - # Make appropriate config and workflow for this step; write modified workflow to disk - config = entry_config[step](config_file, f"{tinyrna_cwl_path}/workflows/tinyrna_wf.cwl") - resume_wf = f"{tinyrna_cwl_path}/workflows/tiny-resume.cwl" - config.write_workflow(resume_wf) + # The resume workflow is dynamically generated from the run workflow + base_workflow = f"{tinyrna_cwl_path}/workflows/tinyrna_wf.cwl" # The workflow to derive from + workflow_dyna = f"{tinyrna_cwl_path}/workflows/tiny-resume.cwl" # The dynamically generated workflow to write + + config_object = resume_config_class(config_file, base_workflow) + config_object.write_workflow(workflow_dyna) + config_object.write_processed_config() - if config['run_native']: - # We can pass our config object directly without writing to disk first - run_cwltool_native(config, resume_wf) + if config_object['run_native']: + # Can pass the config object directly but still write to disk for autodocumentation + run_cwltool_native(config_object, workflow_dyna) else: # Processed Run Config must be written to disk first - resume_conf_file = config.get_outfile_path() - config.write_processed_config(resume_conf_file) - run_cwltool_subprocess(config, resume_wf) + run_cwltool_subprocess(config_object, workflow_dyna) - if os.path.isfile(resume_wf): + if os.path.isfile(workflow_dyna): # We don't want the generated workflow to be returned by a call to setup-cwl - os.remove(resume_wf) - + os.remove(workflow_dyna) def run_cwltool_subprocess(config_object: 'ConfigBase', workflow: str, run_directory='.') -> int: """Executes the workflow using a command line invocation of cwltool From c122ccdd3aefa5f21f42ba0ae1ba36612d6808f8 Mon Sep 17 00:00:00 2001 From: Alex Tate <0xalextate@gmail.com> Date: Fri, 26 May 2023 14:01:23 -0700 Subject: [PATCH 05/17] Adding "config" to the step listing in ResumeConfig classes so that the organize_config step and config_out_dir output are preserved. --- tiny/cwl/workflows/tinyrna_wf.cwl | 16 ++++++++-------- tiny/rna/resume.py | 9 ++++----- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/tiny/cwl/workflows/tinyrna_wf.cwl b/tiny/cwl/workflows/tinyrna_wf.cwl index f62b62e8..9f6d332d 100644 --- a/tiny/cwl/workflows/tinyrna_wf.cwl +++ b/tiny/cwl/workflows/tinyrna_wf.cwl @@ -122,14 +122,6 @@ inputs: steps: - organize_config: - run: ../tools/make-subdir.cwl - in: - dir_files: - source: [ processed_run_config, paths_file, samples_csv, features_csv, plot_style_sheet ] - dir_name: dir_name_config - out: [ subdir ] - preprocessing: run: preprocessing.cwl scatter: [in_fq, sample_basename, fastp_report_title] @@ -291,6 +283,14 @@ steps: - sample_avg_scatter_by_dge - sample_avg_scatter_by_dge_class + organize_config: + run: ../tools/make-subdir.cwl + in: + dir_files: + source: [ processed_run_config, paths_file, samples_csv, features_csv, plot_style_sheet ] + dir_name: dir_name_config + out: [ subdir ] + organize_bt_indexes: run: ../tools/make-subdir.cwl when: $(inputs.run_bowtie_build) diff --git a/tiny/rna/resume.py b/tiny/rna/resume.py index 6cd3c22b..19d5b8b8 100644 --- a/tiny/rna/resume.py +++ b/tiny/rna/resume.py @@ -115,9 +115,8 @@ def _add_timestamps(self, steps): step_dir = "dir_name_" + subdir self[step_dir] = self[step_dir] + "_" + self.dt - # These dirs aren't from a workflow step but still need a timestamp - self['dir_name_logs'] = self['dir_name_logs'] + "_" + self.dt - self['dir_name_config'] = self['dir_name_config'] + "_" + self.dt + # The logs dir isn't from a workflow step but still needs a timestamp + self['dir_name_logs'] = self.append_or_replace_ts(self['dir_name_logs']) # Update run_name output prefix variable for the current date and time self['run_name'] = re.sub(timestamp_format, self.dt, self['run_name']) @@ -137,7 +136,7 @@ class ResumeCounterConfig(ResumeConfig): """A class for modifying the workflow and config to resume a run at tiny-count""" def __init__(self, processed_config, workflow): - steps = ["tiny-count", "tiny-deseq", "tiny-plot"] + steps = ["tiny-count", "tiny-deseq", "tiny-plot", "config"] inputs = { 'aligned_seqs': {'var': "resume_sams", 'type': "File[]"}, @@ -175,7 +174,7 @@ class ResumePlotterConfig(ResumeConfig): """A class for modifying the workflow and config to resume a run at tiny-plot""" def __init__(self, processed_config, workflow): - steps = ["tiny-plot"] + steps = ["tiny-plot", "config"] inputs = { 'raw_counts': {'var': "resume_raw", 'type': "File"}, From 51207c3b6eeb76a0972731a3ebcd3c429b681186 Mon Sep 17 00:00:00 2001 From: Alex Tate <0xalextate@gmail.com> Date: Mon, 29 May 2023 15:05:45 -0700 Subject: [PATCH 06/17] After further consideration, I'm updating tiny resume commands to write the updated Run Config back to the same location in the root directory of the Run Directory. This allows configurations to carry over from prior resume runs. Prior versions are already preserved in the timestamped config directories. --- tiny/entry.py | 2 +- tiny/rna/resume.py | 17 ++++++++--------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/tiny/entry.py b/tiny/entry.py index b418eb35..5180993d 100644 --- a/tiny/entry.py +++ b/tiny/entry.py @@ -202,8 +202,8 @@ def resume(tinyrna_cwl_path: str, config_file: str, step: str) -> None: workflow_dyna = f"{tinyrna_cwl_path}/workflows/tiny-resume.cwl" # The dynamically generated workflow to write config_object = resume_config_class(config_file, base_workflow) + config_object.write_processed_config(config_file) config_object.write_workflow(workflow_dyna) - config_object.write_processed_config() if config_object['run_native']: # Can pass the config object directly but still write to disk for autodocumentation diff --git a/tiny/rna/resume.py b/tiny/rna/resume.py index 19d5b8b8..7b87154d 100644 --- a/tiny/rna/resume.py +++ b/tiny/rna/resume.py @@ -108,24 +108,23 @@ def assimilate_paths_file(self): self[key] = self.paths[key] def _add_timestamps(self, steps): - """Differentiates resume-run output subdirs by adding a timestamp to them""" + """Differentiates resume-run output subdirs by appending a timestamp to their names""" # Rename output directories with timestamp for subdir in steps: step_dir = "dir_name_" + subdir - self[step_dir] = self[step_dir] + "_" + self.dt + self[step_dir] = self.append_or_replace_ts(self[step_dir]) # The logs dir isn't from a workflow step but still needs a timestamp self['dir_name_logs'] = self.append_or_replace_ts(self['dir_name_logs']) - # Update run_name output prefix variable for the current date and time - self['run_name'] = re.sub(timestamp_format, self.dt, self['run_name']) + # Update run_name output prefix with the current date and time + self['run_name'] = self.append_or_replace_ts(self['run_name']) - # Override - def get_outfile_path(self, infile: str = None) -> str: - if infile is None: infile = self.inf - root, ext = os.path.splitext(os.path.basename(infile)) - return '_'.join(["resume", root, self.dt]) + ext + def append_or_replace_ts(self, s): + """Appends (or replaces) a timestamp at the end of the string""" + optional_timestamp = rf"(_{timestamp_format})|$" + return re.sub(optional_timestamp, "_" + self.dt, s, count=1) def write_workflow(self, workflow_outfile: str) -> None: with open(workflow_outfile, "w") as wf: From b7eec86b8ba2a158a2237745fc9266b4703801af Mon Sep 17 00:00:00 2001 From: Alex Tate <0xalextate@gmail.com> Date: Mon, 29 May 2023 15:27:09 -0700 Subject: [PATCH 07/17] Each configuration class has a new function: save_run_profile(). This function saves a copy of the file in the root of the Run Directory with amended paths. The idea is that these files should represent a working, portable configuration. Paths in these files are modified to achieve this goal: - SamplesSheet: input file paths are converted to absolute paths for portability. - PathsFile: samples_csv and features_csv are converted to their basename since they will be adjacent to the Run Config. All other paths are made absolute for portability. - FeaturesSheet: no modifications, simply copies itself. Features Sheet parsing has been moved into the FeaturesSheet class. In addition to its original functionality, read_csv() now omits duplicate rules that differ only in hierarchy value. --- tiny/rna/configuration.py | 111 +++++++++++++++++++++++++++++++++--- tiny/rna/counter/counter.py | 24 ++------ 2 files changed, 106 insertions(+), 29 deletions(-) diff --git a/tiny/rna/configuration.py b/tiny/rna/configuration.py index 6a8de9ff..26f9efca 100644 --- a/tiny/rna/configuration.py +++ b/tiny/rna/configuration.py @@ -3,6 +3,7 @@ import shutil import errno import time +import copy import sys import csv import re @@ -253,9 +254,9 @@ def load_paths_config(self): """Returns a PathsFile object and updates keys related to the Paths File path""" # paths_config: user-specified - # Resolve the absolute path so that it remains valid when - # the processed Run Config is copied to the Run Directory - self['paths_config'] = self.from_here(self['paths_config']) + # Paths File will be copied to the Run Directory in save_run_profile() + orig_path = self.from_here(self['paths_config']) + self['paths_config'] = os.path.basename(orig_path) # paths_file: automatically generated # CWL file dictionary is used as a workflow input @@ -387,7 +388,7 @@ def validate_inputs(self): if gff_files: GFFValidator( gff_files, - self.process_features_sheet(), + self.features_sheet.get_source_type_filters(), self.paths['ebwt'] if not self['run_bowtie_build'] else None, self.paths['reference_genome_files'] ).validate() @@ -417,11 +418,10 @@ def verify_bowtie_build_outputs(self): def save_run_profile(self, config_file_name=None) -> str: """Saves Samples Sheet and processed run config to the Run Directory for record keeping""" - from importlib.metadata import version - self['version'] = version('tinyrna') - - samples_sheet_name = os.path.basename(self['samples_csv']['path']) - shutil.copyfile(self['samples_csv']['path'], f"{self['run_directory']}/{samples_sheet_name}") + run_dir = self['run_directory'] + self.paths.save_run_profile(run_dir) + self.samples_sheet.save_run_profile(run_dir) + self.features_sheet.save_run_profile(run_dir) return self.write_processed_config(config_file_name) """========== COMMAND LINE ==========""" @@ -645,6 +645,35 @@ def append_to(self, key: str, val: Any): target.append(val) return target + def save_run_profile(self, run_directory): + """Saves a copy of the Paths File to the Run Directory with amended paths. + Note the distinction between out_obj[key] and self[key]. The latter performs + automatic path resolution, whereas out_obj is essentially just a dict.""" + + out_obj = copy.deepcopy(self.config) + out_file = os.path.join(run_directory, self.basename) + + adjacent_paths = self.required + absolute_paths = [path for path in (*self.single, *self.prefix) + if path not in ("run_directory", *self.required)] + + for adjacent in adjacent_paths: + out_obj[adjacent] = os.path.basename(self[adjacent]) + + for key in absolute_paths: + if not self.is_path_str(self[key]): continue + out_obj[key] = os.path.abspath(self[key]) + + for key in self.groups: + for i, entry in enumerate(self[key]): + if self.is_path_dict(entry): + out_obj[key][i]['path'] = os.path.abspath(entry['path']) + elif self.is_path_str(entry): + out_obj[key][i] = os.path.abspath(entry) + + with open(out_file, 'w') as f: + self.yaml.dump(out_obj, f) + class SamplesSheet: def __init__(self, file, context): @@ -808,12 +837,76 @@ def validate_r_safe_sample_groups(sample_groups: Counter): "The following group names are too similar and will cause a namespace collision in R:\n" \ + '\n'.join(collisions) + def save_run_profile(self, run_directory): + """Writes a copy of the CSV with absolute paths""" + + outfile = os.path.join(run_directory, self.basename) + header = CSVReader.tinyrna_sheet_fields['Samples Sheet'].keys() + coldata = zip(self.hts_samples, self.groups_reps, self.normalizations) + + with open(outfile, 'w', newline='') as out_csv: + csv_writer = csv.writer(out_csv) + csv_writer.writerow(header) + for sample, (group, rep), norm in coldata: + control = (group == self.control_condition) or "" + sample = os.path.abspath(sample) + csv_writer.writerow([sample, group, rep, control, norm]) + @staticmethod def get_sample_basename(filename): root, _ = os.path.splitext(filename) return os.path.basename(root) +class FeaturesSheet: + def __init__(self, file, context): + self.csv = CSVReader(file, "Features Sheet") + self.basename = os.path.basename(file) + self.dir = os.path.dirname(file) + self.context = context + self.file = file + + self.rules = [] + self.read_csv() + + def read_csv(self): + try: + rules, hierarchies = [], [] + for rule in self.csv.rows(): + rule['nt5end'] = rule['nt5end'].upper().translate({ord('U'): 'T'}) # Convert RNA base to cDNA base + rule['Identity'] = (rule.pop('Key'), rule.pop('Value')) # Create identity tuple + rule['Overlap'] = rule['Overlap'].lower() # Built later in reference parsers + hierarchy = int(rule.pop('Hierarchy')) # Convert hierarchy to number + + # Duplicate rules are screened out here + # Equality check omits hierarchy value + if rule not in rules: + rules.append(rule) + hierarchies.append(hierarchy) + except Exception as e: + msg = f"Error occurred on line {self.csv.row_num} of {self.basename}" + append_to_exception(e, msg) + raise + + # Reunite hierarchy values with their rules + self.rules = [ + dict(rule, Hierarchy=hierarchy) + for rule, hierarchy in zip(rules, hierarchies) + ] + + def get_source_type_filters(self): + """Returns only the Source Filter and Type Filter columns""" + + interests = ("Filter_s", "Filter_t") + return [{selector: rule[selector] for selector in interests} + for rule in self.rules] + + def save_run_profile(self, run_directory): + """Copies the Features Sheet to the run directory""" + + outfile = os.path.join(run_directory, self.basename) + shutil.copyfile(self.file, outfile) + class CSVReader(csv.DictReader): """A simple wrapper class for csv.DictReader diff --git a/tiny/rna/counter/counter.py b/tiny/rna/counter/counter.py index e451941c..be4c30f4 100644 --- a/tiny/rna/counter/counter.py +++ b/tiny/rna/counter/counter.py @@ -4,7 +4,6 @@ import traceback import argparse import sys -import os from typing import List, Dict @@ -12,11 +11,10 @@ from tiny.rna.counter.features import Features, FeatureCounter from tiny.rna.counter.statistics import MergedStatsManager from tiny.rna.counter.hts_parsing import ReferenceFeatures, ReferenceSeqs, ReferenceBase -from tiny.rna.configuration import PathsFile, SamplesSheet, CSVReader, get_templates +from tiny.rna.configuration import PathsFile, SamplesSheet, FeaturesSheet, get_templates from tiny.rna.util import ( report_execution_time, add_transparent_help, - append_to_exception, get_timestamp, ReadOnlyDict ) @@ -131,24 +129,10 @@ def load_config(features_csv: str, in_pipeline: bool) -> List[dict]: further digest to produce its rules table. """ - sheet = CSVReader(features_csv, "Features Sheet") - rules = list() - - try: - for rule in sheet.rows(): - rule['nt5end'] = rule['nt5end'].upper().translate({ord('U'): 'T'}) # Convert RNA base to cDNA base - rule['Identity'] = (rule.pop('Key'), rule.pop('Value')) # Create identity tuple - rule['Hierarchy'] = int(rule['Hierarchy']) # Convert hierarchy to number - rule['Overlap'] = rule['Overlap'].lower() # Built later in reference parsers - - # Duplicate rule entries are not allowed - if rule not in rules: rules.append(rule) - except Exception as e: - msg = f"Error occurred on line {sheet.row_num} of {os.path.basename(features_csv)}" - append_to_exception(e, msg) - raise + context = "Pipeline Step" if in_pipeline else "Standalone Run" + features = FeaturesSheet(features_csv, context=context) - return rules + return features.rules def load_references(paths: PathsFile, libraries: List[dict], rules: List[dict], prefs) -> ReferenceBase: From 756725c40bbae3116c83fa24752f669334eedd45 Mon Sep 17 00:00:00 2001 From: Alex Tate <0xalextate@gmail.com> Date: Mon, 29 May 2023 17:55:00 -0700 Subject: [PATCH 08/17] Refactoring the functions that load config files to be more consistent. The function setup_file_groups() has been removed because it has been unnecessary since the introduction of the SampleSheet class. The function absorbe_paths_file() has been absorbed into load_paths_config() Additionally, load_paths_config() doesn't change the paths_* keys anymore. This is done in Configuration.save_run_profile() for consistency --- tiny/rna/configuration.py | 48 +++++++++++++-------------------------- 1 file changed, 16 insertions(+), 32 deletions(-) diff --git a/tiny/rna/configuration.py b/tiny/rna/configuration.py index 26f9efca..1cf33150 100644 --- a/tiny/rna/configuration.py +++ b/tiny/rna/configuration.py @@ -239,38 +239,30 @@ def __init__(self, config_file: str, validate_gffs=False, skip_setup=False): super().__init__(config_file, RunConfigCompatibility) self.paths = self.load_paths_config() - self.absorb_paths_file() + self.samples_sheet = self.load_samples_config() + self.features_sheet = self.load_features_config() if skip_setup: return self.setup_pipeline() - self.setup_file_groups() self.setup_ebwt_idx() - self.process_samples_sheet() - self.process_features_sheet() self.setup_step_inputs() if validate_gffs: self.validate_inputs() - def load_paths_config(self): + def load_paths_config(self) -> 'PathsFile': """Returns a PathsFile object and updates keys related to the Paths File path""" - # paths_config: user-specified - # Paths File will be copied to the Run Directory in save_run_profile() - orig_path = self.from_here(self['paths_config']) - self['paths_config'] = os.path.basename(orig_path) + # Resolve relative path to the Paths File and construct + resolved = self.from_here(self['paths_config']) + paths = PathsFile(resolved) - # paths_file: automatically generated - # CWL file dictionary is used as a workflow input - self['paths_file'] = self.cwl_file(self['paths_config']) - - return PathsFile(self['paths_config']) - - def absorb_paths_file(self): + # Absorb PathsFile object keys into the configuration for key in [*PathsFile.single, *PathsFile.groups]: - self[key] = self.paths.as_cwl_file_obj(key) + self[key] = paths.as_cwl_file_obj(key) for key in PathsFile.prefix: - self[key] = self.paths[key] + self[key] = paths[key] + return paths - def process_samples_sheet(self): + def load_samples_config(self) -> 'SamplesSheet': samples_sheet_path = self.paths['samples_csv'] samples_sheet = SamplesSheet(samples_sheet_path, context="Pipeline Start") @@ -281,21 +273,13 @@ def process_samples_sheet(self): self['in_fq'] = [self.cwl_file(fq, verify=False) for fq in samples_sheet.hts_samples] self['fastp_report_titles'] = [f"{g}_rep_{r}" for g, r in samples_sheet.groups_reps] - def process_features_sheet(self) -> List[dict]: - """Retrieves GFF Source and Type Filter definitions for use in GFFValidator""" - features_sheet_path = self.paths['features_csv'] - reader = CSVReader(features_sheet_path, "Features Sheet").rows() - - interests = ("Filter_s", "Filter_t") - return [{selector: rule[selector] for selector in interests} - for rule in reader] + return samples_sheet - def setup_file_groups(self): - """Configuration keys that represent lists of files""" + def load_features_config(self) -> 'FeaturesSheet': + """Retrieves GFF Source and Type Filter definitions for use in GFFValidator""" - self.set_default_dict({per_file_setting_key: [] for per_file_setting_key in - ['in_fq', 'sample_basenames', 'gff_files', 'fastp_report_titles'] - }) + features_sheet_path = self.paths['features_csv'] + return FeaturesSheet(features_sheet_path, context="Pipeline Start") def setup_pipeline(self): """Overall settings for the whole pipeline""" From 71449d26367887a81516602bf6b31f1895b9e4a1 Mon Sep 17 00:00:00 2001 From: Alex Tate <0xalextate@gmail.com> Date: Mon, 29 May 2023 18:18:37 -0700 Subject: [PATCH 09/17] Updating ResumeConfig.load_paths_config() for backward compatibility with older Run Directories. These directories are upgraded to follow the new auto-documentation approach so that multiple resume runs can be performed on them. --- tiny/rna/configuration.py | 5 +++++ tiny/rna/resume.py | 44 +++++++++++++++++++++++++++++++-------- 2 files changed, 40 insertions(+), 9 deletions(-) diff --git a/tiny/rna/configuration.py b/tiny/rna/configuration.py index 1cf33150..9703256c 100644 --- a/tiny/rna/configuration.py +++ b/tiny/rna/configuration.py @@ -406,6 +406,11 @@ def save_run_profile(self, config_file_name=None) -> str: self.paths.save_run_profile(run_dir) self.samples_sheet.save_run_profile(run_dir) self.features_sheet.save_run_profile(run_dir) + + # The paths_* keys should now point to the copy produced above + self['paths_file'] = self.cwl_file(os.path.join(run_dir, self.paths.basename)) # CWL file object + self['paths_config'] = self.paths.basename # User-facing value + return self.write_processed_config(config_file_name) """========== COMMAND LINE ==========""" diff --git a/tiny/rna/resume.py b/tiny/rna/resume.py index 7b87154d..764d2a43 100644 --- a/tiny/rna/resume.py +++ b/tiny/rna/resume.py @@ -1,14 +1,13 @@ +import shutil +import sys import os import re -import sys -import ruamel.yaml from ruamel.yaml.comments import CommentedOrderedMap -from pkg_resources import resource_filename from abc import ABC, abstractmethod from glob import glob -from tiny.rna.configuration import ConfigBase, PathsFile +from tiny.rna.configuration import ConfigBase, PathsFile, SamplesSheet, FeaturesSheet from tiny.rna.compatibility import RunConfigCompatibility from tiny.rna.util import timestamp_format, get_timestamp @@ -92,11 +91,38 @@ def _create_truncated_workflow(self): wf_steps[self.steps[0]]['in'][param] = new_input['var'] def load_paths_config(self): - """Returns a PathsFile object and updates keys related to the Paths File path""" - - self['paths_config'] = self.from_here(self['paths_config']) - self['paths_file'] = self.cwl_file(self['paths_config']) - return PathsFile(self['paths_config']) + """Returns a PathsFile object and updates keys if necessary + + If paths_config is an absolute path then we assume this Run Directory was + created under the old auto-documentation approach (in the new approach, it + would be adjacent and therefore a basename). In order to allow for multiple + resumes on this old Run Directory, we upgrade it to use the new auto-doc + approach and safe the existing Run Config to the /config subdir.""" + + paths = PathsFile(self['paths_config']) + if os.path.isabs(self['paths_config']): + run_dir = os.getcwd() + conf_dir = self['dir_name_config'] + + # Handle existing Run Config + if os.path.exists(conf_dir): + msg = "Could not resume old-style Run Directory (/config exists)." + raise FileExistsError(msg) + try: + os.mkdir(conf_dir) + shutil.copyfile(self.inf, os.path.join(conf_dir, self.basename)) + except FileExistsError: + msg = "Could not resume old-style Run Directory (/config exists)." + raise FileExistsError(msg) + + # Handle remaining config files + paths.save_run_profile(run_dir) + self['paths_config'] = paths.basename + self['paths_file'] = self.cwl_file(paths.basename) + SamplesSheet(paths['samples_csv'], "Pipeline Start").save_run_profile(run_dir) + FeaturesSheet(paths['features_csv'], "Pipeline Start").save_run_profile(run_dir) + + return paths def assimilate_paths_file(self): """Updates the processed workflow with resume-safe Paths File parameters""" From 22af457aa01610c1f424a0f667caf9efea08cc5b Mon Sep 17 00:00:00 2001 From: Alex Tate <0xalextate@gmail.com> Date: Mon, 29 May 2023 18:24:13 -0700 Subject: [PATCH 10/17] Updating Run Configs for new v1.5 spec. Also noticed that the Samples Sheet in START_HERE had sentence case in the Replicate Number column --- START_HERE/run_config.yml | 15 +++++++-------- START_HERE/samples.csv | 2 +- .../config_files/run_config_template.yml | 18 +++++++++++------- tiny/templates/run_config_template.yml | 18 +++++++++++------- 4 files changed, 30 insertions(+), 23 deletions(-) diff --git a/START_HERE/run_config.yml b/START_HERE/run_config.yml index cba7a2c6..206ce8e0 100644 --- a/START_HERE/run_config.yml +++ b/START_HERE/run_config.yml @@ -20,7 +20,7 @@ user: run_date: ~ run_time: ~ -paths_config: ./paths.yml +paths_config: paths.yml ##-- The label for final outputs --## ##-- If none provided, the default of user_tinyrna will be used --## @@ -321,7 +321,7 @@ dir_name_config: config # ########################################################################################### -version: 1.4.0 +version: 1.5.0 ######--------------------------- DERIVED FROM PATHS FILE ---------------------------###### # @@ -333,10 +333,10 @@ run_directory: ~ tmp_directory: ~ features_csv: { } samples_csv: { } -paths_file: { } gff_files: [ ] run_bowtie_build: false reference_genome_files: [ ] +bt_index_files: [ ] plot_style_sheet: ~ adapter_fasta: ~ ebwt: ~ @@ -357,10 +357,6 @@ in_fq: [ ] # output reports fastp_report_titles: [ ] -###-- Utilized by bowtie --### -# bowtie index files -bt_index_files: [ ] - ##-- Utilized by tiny-deseq.r --## # The control for comparison. If unspecified, all comparisons are made control_condition: @@ -388,4 +384,7 @@ plot_class_scatter_filter_exclude: [] ##-- Used to populate the directory defined in dir_name_config --## ##-- CWL spec doesn't provide a way to get this info from within the workflow --## -processed_run_config: {} \ No newline at end of file +processed_run_config: {} + +##-- This is the paths_config key converted to a CWL file object for handling --## +paths_file: {} \ No newline at end of file diff --git a/START_HERE/samples.csv b/START_HERE/samples.csv index 47caddd8..ee799e65 100755 --- a/START_HERE/samples.csv +++ b/START_HERE/samples.csv @@ -1,4 +1,4 @@ -Input Files,Sample/Group Name,Replicate number,Control,Normalization +Input Files,Sample/Group Name,Replicate Number,Control,Normalization ./fastq_files/cond1_rep1.fastq.gz,condition1,1,TRUE, ./fastq_files/cond1_rep2.fastq.gz,condition1,2,, ./fastq_files/cond1_rep3.fastq.gz,condition1,3,, diff --git a/tests/testdata/config_files/run_config_template.yml b/tests/testdata/config_files/run_config_template.yml index 74cdd0b8..da96c76c 100644 --- a/tests/testdata/config_files/run_config_template.yml +++ b/tests/testdata/config_files/run_config_template.yml @@ -310,6 +310,7 @@ dir_name_tiny-count: tiny-count dir_name_tiny-deseq: tiny-deseq dir_name_tiny-plot: tiny-plot dir_name_logs: logs +dir_name_config: config ######################### AUTOMATICALLY GENERATED CONFIGURATIONS ######################### @@ -320,7 +321,7 @@ dir_name_logs: logs # ########################################################################################### -version: 1.4.0 +version: 1.5.0 ######--------------------------- DERIVED FROM PATHS FILE ---------------------------###### # @@ -332,10 +333,10 @@ run_directory: ~ tmp_directory: ~ features_csv: { } samples_csv: { } -paths_file: { } gff_files: [ ] run_bowtie_build: false reference_genome_files: [ ] +bt_index_files: [ ] plot_style_sheet: ~ adapter_fasta: ~ ebwt: ~ @@ -356,10 +357,6 @@ in_fq: [ ] # output reports fastp_report_titles: [ ] -###-- Utilized by bowtie --### -# bowtie index files -bt_index_files: [ ] - ##-- Utilized by tiny-deseq.r --## # The control for comparison. If unspecified, all comparisons are made control_condition: @@ -383,4 +380,11 @@ run_deseq: True ##-- Utilized by tiny-plot --## # Filters for class scatter plots plot_class_scatter_filter_include: [] -plot_class_scatter_filter_exclude: [] \ No newline at end of file +plot_class_scatter_filter_exclude: [] + +##-- Used to populate the directory defined in dir_name_config --## +##-- CWL spec doesn't provide a way to get this info from within the workflow --## +processed_run_config: {} + +##-- This is the paths_config key converted to a CWL file object for handling --## +paths_file: {} \ No newline at end of file diff --git a/tiny/templates/run_config_template.yml b/tiny/templates/run_config_template.yml index 782378fd..90079425 100644 --- a/tiny/templates/run_config_template.yml +++ b/tiny/templates/run_config_template.yml @@ -310,6 +310,7 @@ dir_name_tiny-count: tiny-count dir_name_tiny-deseq: tiny-deseq dir_name_tiny-plot: tiny-plot dir_name_logs: logs +dir_name_config: config ######################### AUTOMATICALLY GENERATED CONFIGURATIONS ######################### @@ -320,7 +321,7 @@ dir_name_logs: logs # ########################################################################################### -version: 1.4.0 +version: 1.5.0 ######--------------------------- DERIVED FROM PATHS FILE ---------------------------###### # @@ -332,10 +333,10 @@ run_directory: ~ tmp_directory: ~ features_csv: { } samples_csv: { } -paths_file: { } gff_files: [ ] run_bowtie_build: false reference_genome_files: [ ] +bt_index_files: [ ] plot_style_sheet: ~ adapter_fasta: ~ ebwt: ~ @@ -356,10 +357,6 @@ in_fq: [ ] # output reports fastp_report_titles: [ ] -###-- Utilized by bowtie --### -# bowtie index files -bt_index_files: [ ] - ##-- Utilized by tiny-deseq.r --## # The control for comparison. If unspecified, all comparisons are made control_condition: @@ -383,4 +380,11 @@ run_deseq: True ##-- Utilized by tiny-plot --## # Filters for class scatter plots plot_class_scatter_filter_include: [] -plot_class_scatter_filter_exclude: [] \ No newline at end of file +plot_class_scatter_filter_exclude: [] + +##-- Used to populate the directory defined in dir_name_config --## +##-- CWL spec doesn't provide a way to get this info from within the workflow --## +processed_run_config: {} + +##-- This is the paths_config key converted to a CWL file object for handling --## +paths_file: {} \ No newline at end of file From 409dbdb32a92ff494773328693fa915995c1453f Mon Sep 17 00:00:00 2001 From: Alex Tate <0xalextate@gmail.com> Date: Mon, 29 May 2023 18:25:45 -0700 Subject: [PATCH 11/17] Bugfix for YamlShop.add_mapping(). Keys aren't listed in doc.ca.items under some circumstances. --- tiny/rna/compatibility.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tiny/rna/compatibility.py b/tiny/rna/compatibility.py index c1fa9d7b..c3ee2142 100644 --- a/tiny/rna/compatibility.py +++ b/tiny/rna/compatibility.py @@ -68,9 +68,10 @@ def add_mapping(doc: CommentedMap, prec_key, key_obj): # Comments & linebreaks are often (but not always!) attached to # the preceding key. Move them down to the new key. - inherit_prev = doc.ca.items[prec_key][2] - doc.ca.items[key] = [None, None, inherit_prev, None] - doc.ca.items[prec_key][2] = None + if prec_key in doc.ca.items: + inherit_prev = doc.ca.items[prec_key][2] + doc.ca.items[key] = [None, None, inherit_prev, None] + doc.ca.items[prec_key][2] = None class RunConfigCompatibility: From c533310f881175cbfb20a6e8ae91858c0c508ec3 Mon Sep 17 00:00:00 2001 From: Alex Tate <0xalextate@gmail.com> Date: Mon, 29 May 2023 18:31:12 -0700 Subject: [PATCH 12/17] Updating ResumeCounterConfig._rebuild_entry_inputs(). These file lists need to be reset each time a resume run is performed. Also refactoring for cleaner code that's more consistent with the newer ResumePlotterConfig. --- tiny/rna/resume.py | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/tiny/rna/resume.py b/tiny/rna/resume.py index 764d2a43..2b0a4925 100644 --- a/tiny/rna/resume.py +++ b/tiny/rna/resume.py @@ -180,19 +180,16 @@ def _rebuild_entry_inputs(self): File[] arrays with their corresponding pipeline outputs on disk. """ - def cwl_file_resume(subdir, file): - try: - return self.cwl_file('/'.join([subdir, file])) - except FileNotFoundError as e: - sys.exit("The following pipeline output could not be found:\n%s" % (e.filename,)) - - resume_file_lists = ['resume_sams', 'resume_fastp_logs', 'resume_collapsed_fas'] - self.set_default_dict({key: [] for key in resume_file_lists}) + bowtie = self['dir_name_bowtie'] + fastp = self['dir_name_fastp'] + collapser = self['dir_name_tiny-collapse'] - for sample in self['sample_basenames']: - self['resume_sams'].append(cwl_file_resume(self['dir_name_bowtie'], sample + '_aligned_seqs.sam')) - self['resume_fastp_logs'].append(cwl_file_resume(self['dir_name_fastp'], sample + '_qc.json')) - self['resume_collapsed_fas'].append(cwl_file_resume(self['dir_name_tiny-collapse'], sample + '_collapsed.fa')) + try: + self['resume_sams'] = list(map(self.cwl_file, glob(bowtie + "/*_aligned_seqs.sam"))) + self['resume_fastp_logs'] = list(map(self.cwl_file, glob(fastp + "/*_qc.json"))) + self['resume_collapsed_fas'] = list(map(self.cwl_file, glob(collapser + "/*_collapsed.fa"))) + except FileNotFoundError as e: + sys.exit("The following pipeline output could not be found:\n%s" % (e.filename,)) class ResumePlotterConfig(ResumeConfig): From 32955961bb9cff27c543985198683459ed51a4c4 Mon Sep 17 00:00:00 2001 From: Alex Tate <0xalextate@gmail.com> Date: Mon, 29 May 2023 18:35:12 -0700 Subject: [PATCH 13/17] Minor update to follow recommended usage of the csv module when passing in file objects. --- tiny/rna/configuration.py | 2 +- tiny/rna/counter/statistics.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tiny/rna/configuration.py b/tiny/rna/configuration.py index 9703256c..f2fa0e2f 100644 --- a/tiny/rna/configuration.py +++ b/tiny/rna/configuration.py @@ -940,7 +940,7 @@ def __init__(self, filename: str, doctype: str = None): def rows(self): self.replace_excel_ellipses() - with open(os.path.expanduser(self.tinyrna_file), 'r', encoding='utf-8-sig') as f: + with open(os.path.expanduser(self.tinyrna_file), 'r', encoding='utf-8-sig', newline='') as f: super().__init__(f, fieldnames=self.tinyrna_fields, delimiter=',') header = next(self) diff --git a/tiny/rna/counter/statistics.py b/tiny/rna/counter/statistics.py index a3afd0fd..8f0d7dd9 100644 --- a/tiny/rna/counter/statistics.py +++ b/tiny/rna/counter/statistics.py @@ -692,7 +692,7 @@ def write_alignment_tables(self): header = Diagnostics.alignment_columns for library_name, table in self.alignment_tables.items(): outfile = make_filename([self.prefix, library_name, 'alignment_table'], ext='.csv') - with open(outfile, 'w') as ao: + with open(outfile, 'w', newline='') as ao: csv_writer = csv.writer(ao) csv_writer.writerow(header) csv_writer.writerows(table) From 3a04b4d7b43ffe4f406264e9d19f5c9103661960 Mon Sep 17 00:00:00 2001 From: Alex Tate <0xalextate@gmail.com> Date: Mon, 29 May 2023 18:35:33 -0700 Subject: [PATCH 14/17] Minor consistency update for the FeatureSelector class and the timestamp_format regex --- tiny/rna/counter/features.py | 3 ++- tiny/rna/util.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/tiny/rna/counter/features.py b/tiny/rna/counter/features.py index 8eca57dc..a853b34d 100644 --- a/tiny/rna/counter/features.py +++ b/tiny/rna/counter/features.py @@ -102,11 +102,12 @@ class FeatureSelector: rules_table: List[dict] inv_ident: Dict[tuple, List[int]] - def __init__(self, rules: List[dict], **kwargs): + def __init__(self, rules: List[dict], **prefs): FeatureSelector.rules_table = self.build_selectors(rules) FeatureSelector.inv_ident = self.build_inverted_identities(FeatureSelector.rules_table) self.warnings = defaultdict(set) self.overlap_cache = {} + self.prefs = prefs @classmethod def choose(cls, candidates: Set[feature_record_tuple], alignment: dict) -> Mapping[str, set]: diff --git a/tiny/rna/util.py b/tiny/rna/util.py index 1670ef3b..96b296f5 100644 --- a/tiny/rna/util.py +++ b/tiny/rna/util.py @@ -213,7 +213,7 @@ def sorted_natural(lines, key=None, reverse=False): # For timestamp matching and creation -timestamp_format = re.compile(r"\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}") +timestamp_format = r"\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}" def get_timestamp(): return datetime.now().strftime('%Y-%m-%d_%H-%M-%S') From 49752ba3104d6f29b617b24dd55c380659d98c3a Mon Sep 17 00:00:00 2001 From: Alex Tate <0xalextate@gmail.com> Date: Tue, 30 May 2023 13:27:22 -0700 Subject: [PATCH 15/17] Updating PathsSheet to remove the Samples Sheet from inputs that are forbidden to change from run to run. This allows users to change normalization settings if they wish. Nothing is stopping the user from changing the Input Files column but unless the changes preserve the file's basename, this will result in a general error (file not found) --- tiny/rna/configuration.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tiny/rna/configuration.py b/tiny/rna/configuration.py index f2fa0e2f..826ee1dc 100644 --- a/tiny/rna/configuration.py +++ b/tiny/rna/configuration.py @@ -489,8 +489,8 @@ class PathsFile(ConfigBase): groups = ('reference_genome_files', 'gff_files') prefix = ('ebwt', 'run_directory', 'tmp_directory') - # Parameters that need to be held constant between resume runs for analysis integrity - resume_forbidden = ('samples_csv', 'run_directory', 'ebwt', 'reference_genome_files') + # Parameters that should be held constant between resume runs + resume_forbidden = ('run_directory', 'ebwt', 'reference_genome_files') def __init__(self, file: str, in_pipeline=False): super().__init__(file) From f6af9635b51bc5fb00267769029b6de89db49a77 Mon Sep 17 00:00:00 2001 From: Alex Tate <0xalextate@gmail.com> Date: Tue, 30 May 2023 13:28:52 -0700 Subject: [PATCH 16/17] Removing a redundant code block that snuck into a previous commit --- tiny/rna/resume.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/tiny/rna/resume.py b/tiny/rna/resume.py index 2b0a4925..68cb47a1 100644 --- a/tiny/rna/resume.py +++ b/tiny/rna/resume.py @@ -104,15 +104,12 @@ def load_paths_config(self): run_dir = os.getcwd() conf_dir = self['dir_name_config'] - # Handle existing Run Config - if os.path.exists(conf_dir): - msg = "Could not resume old-style Run Directory (/config exists)." - raise FileExistsError(msg) try: + # Handle existing Run Config os.mkdir(conf_dir) shutil.copyfile(self.inf, os.path.join(conf_dir, self.basename)) except FileExistsError: - msg = "Could not resume old-style Run Directory (/config exists)." + msg = f"Could not resume old-style Run Directory (/{conf_dir} exists)." raise FileExistsError(msg) # Handle remaining config files From b12568afd0feb2e443f657ce7487cc8cad710ac7 Mon Sep 17 00:00:00 2001 From: Alex Tate <0xalextate@gmail.com> Date: Tue, 30 May 2023 13:31:52 -0700 Subject: [PATCH 17/17] Updating documentation for the new auto-doc approach --- START_HERE/tinyRNA_TUTORIAL.md | 2 +- doc/Pipeline.md | 25 ++++++++++--------------- images/recount.png | Bin 35999 -> 47754 bytes images/replot.png | Bin 23748 -> 32862 bytes tiny/rna/configuration.py | 2 +- tiny/rna/resume.py | 2 +- 6 files changed, 13 insertions(+), 18 deletions(-) diff --git a/START_HERE/tinyRNA_TUTORIAL.md b/START_HERE/tinyRNA_TUTORIAL.md index 3ca92a08..523836b6 100644 --- a/START_HERE/tinyRNA_TUTORIAL.md +++ b/START_HERE/tinyRNA_TUTORIAL.md @@ -32,7 +32,7 @@ And when you're done, you can close your terminal or use `conda deactivate` to r The output you see on your terminal is from `cwltool`, which coordinates the execution of the workflow CWL. The terminal output from individual steps is redirected to a logfile for later reference. ### File outputs -When the analysis is complete you'll notice a new folder has appeared whose name contains the date and time of the run. Inside you'll find subdirectories containing the file and terminal outputs for each step, and the processed Run Config file for auto-documentation of the run. +When the analysis is complete you'll notice a new timestamped folder has appeared. Inside you'll find subdirectories containing the file outputs for each step, and processed copies of your configuration files which serve as auto-documentation of the run. These configuration copies also allow for repeat analyses using the existing file outputs. ### Bowtie indexes Bowtie indexes were built during this run because `paths.yml` didn't define an `ebwt` prefix. Now, you'll see the `ebwt` points to the freshly built indexes in your run directory. This means that indexes won't be rebuilt during any subsequent runs that use this `paths.yml` file. If you need to rebuild your indexes, simply delete the value to the right of `ebwt` in paths.yml diff --git a/doc/Pipeline.md b/doc/Pipeline.md index 1fcdf495..1b5f7ab3 100644 --- a/doc/Pipeline.md +++ b/doc/Pipeline.md @@ -18,9 +18,10 @@ tiny replot --config processed_run_config.yml The `tiny run` command performs a comprehensive analysis of your [input files](../README.md#requirements-for-user-provided-input-files) according to the preferences defined in your [configuration files](Configuration.md). ## Resuming a Prior Analysis -The tiny-count and tiny-plot steps offer a wide variety of options for refining your analysis. You might find that repeat analyses are required while tuning these options to your goals. However, the earlier pipeline steps (fastp, tiny-collapse, and bowtie) handle the largest volume of data and are resource intensive, so you can save time by reusing their outputs for subsequent analyses. One could do so by running the later steps individually (e.g. using commands `tiny-count`, `tiny-deseq.r`, and `tiny-plot`), but assembling their commandline inputs by hand is labor-intensive and prone to spelling mistakes. +The tiny-count and tiny-plot steps offer many options for refining your analysis. You might find that repeat analyses are required while tuning these options to your goals. However, the earlier pipeline steps (fastp, tiny-collapse, and bowtie) handle the largest volume of data and are resource intensive, so you can save time by reusing their outputs for subsequent analyses. + +The commands `tiny recount` and `tiny replot` allow the workflow to be resumed using outputs from a prior run. The Run Directory for each end-to-end analysis will contain the run's four primary configuration files, and these files can be freely edited to change the resume run's behavior without sacrificing auto-documentation. -The commands `tiny recount` and `tiny replot` seek to solve this problem. As discussed in the [Run Config documentation](Configuration.md#the-processed-run-config), the Run Directory for each end-to-end analysis will contain a processed Run Config, and this is the file that determines the behavior of a resume run.
tiny recount
@@ -29,25 +30,19 @@ The commands `tiny recount` and `tiny replot` seek to solve this problem. As dis replot
- -You can modify the behavior of a resume run by changing settings in: -- The **processed** Run Config -- The **original** Features Sheet that was used for the end-to-end run (as indicated by `features_csv` in the processed Run Config) -- The **original** Paths File (as indicated by `paths_config` in the processed Run Config) - ### The Steps -1. Make and save the desired changes in the files above -2. In your terminal, `cd` to the Run Directory of the end-to-end run you wish to resume +1. Make and save changes to the configuration files within the target Run Directory +2. In your terminal, `cd` to the target Run Directory 3. Run the desired resume command -### A Note on File Inputs -File inputs are sourced from the **original** output subdirectories of prior steps in the target Run Directory. For `tiny replot`, this means that files from previous executions of `tiny recount` will **not** be used as inputs; only the original end-to-end outputs are used. +### Auto-Documentation +Among the subdirectories produced in your Run Directory after an end-to-end run, you'll find a directory named "config" which holds a copy of the run's four primary configuration files. These files serve as documentation for the run and, unlike those found at the root of the Run Directory, they should not be modified. A timestamped "config" directory is created after each resume run to similarly document the configurations that were used. -### Where to Find Outputs from Resume Runs +### Resume Run Outputs Output subdirectories for resume runs can be found alongside the originals, and will have a timestamp appended to their name to differentiate them. -### Auto-Documentation of Resume Runs -A new processed Run Config will be saved in the Run Directory at the beginning of each resume run. It will be labelled with the same timestamp used in the resume run's other outputs to differentiate it. It includes the changes to your Paths File and Run Config. A copy of your Features Sheet is saved to the timestamped tiny-count output directory during `tiny recount` runs. +### Repeated Analyses +If a `recount` run is performed and a `replot` is performed later in the same Run Directory, then only the outputs of the `recount` run are used for generating the plots. If multiple `recount` runs precede the `replot` then the most recent outputs are used. ## Parallelization Most steps in the pipeline run in parallel to minimize runtimes. This is particularly advantageous for multiprocessor systems like server environments. However, parallelization isn't always beneficial. If your computer doesn't have enough free memory, or if you have a large sample file set and/or reference genome, parallel execution might push your machine to its limits. When this happens you might see memory errors or your computer may become unresponsive. In these cases it makes more sense to run resource intensive steps one at a time, in serial, rather than in parallel. To do so, set `run_parallel: false` in your Run Config. This will affect fastp, tiny-collapse, and bowtie since these steps typically handle the largest volumes of data. diff --git a/images/recount.png b/images/recount.png index e5811d115dd7ec49e48f2e13be38b91f2ca8e2bc..f81f791079591adb89dd037abe626c2f5310e9ee 100644 GIT binary patch literal 47754 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�ROtw$1)$bYa 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%0A6kUH^(!}>I=+hx z5PMW>WUadziPw@jjy+w4W7r_b;(m(1Cc%llts_l{2f`M@(%pb1y$R}CO1cTX(tzM} zBOGvv%Is^}{7XWwk+5c^zc(kn6EXN~4QGTrV)~th(%Luj;ZOK8%tjSq9bqZwkDpV; z_`Iyz6m~0p9nY7oIX^^Y+DuaB7z)#Q_^m=Z7S``SOyacAG<|MtMxDv}#Lz$8B=D;P z6bFzvdT5Tm_7*nPg1`M6n8E}wQCNzmLoxF#DBLS2HpqCLo2^(HOIi)LZl8lW3RhC~z`30x%tR6X`9p@=ni_dOWAFj@KC9xz_LUnLbRb1^ zQ<2fX&(6?i!d4HgpMh4;=?E{&uDuVQ@9~-msW?g;6UeZn-NHeI<$h7t#)|70ZrfYi zeo@KQzH>NudOZRod@U^9O-A>gp;xfD=Q{?V#=z0m05Iv@jj$6|5SH#4a#UMiLP`IE zL?+Ki5aEMKn}u(MWhn%v??8>vTo-E;+%AE#_Xn#qsSK1R;0utcairc62k@~cx@4v2BdKIR3kqY=~YM?bk zTE%HAOVuny+8|7k^KH8-RjV w3IMn{PyQ`H{=W#y|Azh_2L6YEZ!vH~GkZP1*zQi@5y3mNLr0BsjZWYEKc-b@zW@LL literal 35999 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
jXqA zm8GMl?9l2E&_%N%2Ls196%VnM6&|@~K0p3Psd7##>EO)S+AF4-^E;yiNvAUmW`TQD z*hrXQ8#lK72jLyU_NN;<5iq~g9s2;z=@JjvkgmV{&g$wLJArZkuKu0nspv^a|E^VY ziMgGjub(5B92B&C>_UB)ncUvPc6(4C26kw9_6@Mxb13=w(}>`935q-d*2;y*<+FexEGcME&EC>A}{<6im~8{hJAAWQHH zNcQ*+Qej?dQFD`BEnSP1;J(8#2{~N222e{o7k{tcIh;;qo(j)z7f>gALN2)Z3OV^4 z=wiWCbm7GjN~IY?1Xddvuc6W|!n$%iVg#(~7>cn)sBI|4e~+Nn)G6h}yYBl7#n&n~ z{~mt&`U2?WoA-_4CQ8*hhpgWh@Ss}3(Wl<;_xa~p+}>ntfVdb6#j4*F^Q0j zsItp1HiykoMIVQb-#KW>oS1J|)dCM`li@Q1K(OQXm| zB8l(O`xTb$ut^^Ow#e*TYKuQls2%b3y&wgb$ODR7vw(rI)g+PCZYJMt;s3F==r))~ zMUN0Y;}#{4)RR?jgP{{iq#hO9ufFMN;a`~0CM6;d43s(#*gX3xZ!67QgXVb0MK&(%e#Ztm+=GSM!)`V5)y!UDhn6k6n#ork2&w=Y=8K7&D}rs0~E0kKlD zf3sKx8JqX`Kec7ZXmB*v*udoLD+YM4S$)c1Z_Pn*&Aqy0{>=*pyMv+{T@ld3i7u!}@lYhd+NhwvR+%TM57?=MY-toA zwXJ+J_zX`XOW2acHYY$2(zO0sxp1|!h`Qk% z@;io+e0!Mnd+gs>3f>NHT19E4K*>#W#H6pic=j4`qOE3g&9xt|{k>i|z}4s~Iqj$4 z3KCw>*Q`GAOxIW5-uwdoc?AM(Z?%@X>-Blpt>OXeHY+(mLMHgXmQa+D9sWe2(Tvb4 z|6tGBZf*ZY=gf%PAjReOal)&&zV;Z#4u7fY&FPe}`=#D(KTF^6zBIZ`8bB%fpP zS)(BRZ}`Xe2UKz9?O&^6x3CTfhoY|iwRTJ+hSn&p`Amlk>v`x+7b3Hz0BKWy`v{}mUM#k?X zHmbV5$Hy;;cF1N{^o781 z4s>g4g5PwEnD`WFKM8CjfyDxk($ls4=^ns+a*H0oJyJ>BYqyx4KJCmS&@YMx8By;V z`0i`#(Sh}LF*`roGNzj@oyo`++_pe?qk&_%8Khq|8u*+*D8Fku#6pPG5yV`#9V&w+ zEW~k-_p_I3`>R;}nn@GaN|=uaBIdE*WoX9%;14Lr4!hB9)s+0J;w*SVQ|3XfYW}~z zG30UGK4y-<1h^cY%uEOuHlH;r6Kq45tF9L3!GnyV7Kix4(KmV<-=+l;N-`fZv@M(Ij2qhvmOMb;dRWc{OjZt24wOqXdXF@6EGBKo)W5Jn5d zhOJxh@Xx^Ibxo#F#4^xaPK>AI`s#{P#=@h$r4+&Tmh(Bvee&Hdh-#Zr zjS)6O(v0k(W3~L7!1Fh03m$s#*{eV(W6L zv5*(2Dd_a|_)L;vSqF6&EFhpq)C>~5RHtVdoKPj3_eEJ-Pg;sS*0#S>jhhu}Ji}a2 z`JW#>rFthOgqXKYwl@>Yz%E_yAn#)~tf5tfJ2WCzU?K+0muFv55>IVnb)=5mY8sEM z+p$R#fTeBTy6SPWHkS_CgkIbC&!oAfS{=6;?xTdp3XsGrRE<#T(=w~xgpV_av*U%w zslx9R&57H#HxFz|mM&VhJ!xao>$O*|sY2=(;99Vc4~JiV8Qw)w?tQ957Cazg!~;2S zQ{th{BVaquB4)*zi_1#s_fAM%zeVuZsSr=n5@OT_Eqb#J+(RGJ@^9Gty!FQMrm~26 zlaAkR?KJvcHcdrgl~Xjm2fUC^Qf6c%=9}(K?q^gWCm`hI^&1jz)atQ_Ne8wZ@b}_9UJ%p^ggQ%?eO*E+%rxWMRkl96oS~ z&)T27dcfFqnCL;rmh@BD60?|xEcEnyOZBuJ$tV281;}|4W{$LV>iSXOwi)0mt5)TrQvbwWTRsBnBpb?L^)gsRKk}_65G%uk!6L{jwp%fw(QE(3TA9Mtuj9G z1gasX-)e)BuooQJJG&F!6qLs429d%S>(zL(YxgQ{+9cDpMk5*;W$V&i+drD)d1?Kh z!@4&tluk=nJ{?+4D18-T0cSH~*^~Vn*J&0g5-{;&XAq%hM*pQfb6(e)w9>IXw6hwt z{_93L7@`#$|4H}MDXT~=H5Fsz;QR>eE1xN9(%)t+5gY0ppuiLzl8_uI$7H2m zj^^fyp;yTx@D2L(F3pwkv z(?Wf{7XJ2*<;HDR8e0A5Wt-E7J^BNLj=};HLP@&!LEI@l z^zJ(ikoEun`~Qpt{=Ncs?>$Av{=+kYAppO=AMZ}8-Av9I!2S;?_f z^3XTFDaUYf=;Nh`i9p+TrhkUD1+L?YH(&d2jBJjswGHXBKYD(0=1Iir*IMNOG9jlx z_fe!26cw`d2=n`Q)bu(Vv>e>~LP~dO<^6x(dNzFG@jI;#)Go32Bk<^3)F(f8iK#D$ zw$#s%b`&kQtHg=k(4U?EZGvn+r!xMgC>?CKhzG2RGaXL49RzV(#v}C`7n?H|>v4w*$x2G^ zOT)BjPAD)tqiUz2yVrX5<|nS&gv{M7oB4Kh1A((lmwoy-CBoUIb5vb)9S6$`2Fk%5`t6%ewuY31@3|9JpU{OX zeAThjkm8e#6_spQLsE1zu6y?60iBhv#W(PA9NdMLqXm`%8FlO(U*ypZddV zg>KU|vwK^ms9w9uwzMS7ixru%YaL6q)XQ*9_j;M*tE(3om1(mzWrMkZc5tm! zy9te-n=9IWB~|WF{76CP}L@UF5JvM8m+cKMgKPxHt!8YXEjHWVLrNV+^m z7CEtb%Gr>mexHq9@45D9ra+{(M?Wvt1r7?@NSi3pJihQBOIi?j2oCeXOeESgk;CR7 zNy~j;VUN($XY4mjx^yf-pL0hyJ=iEz*a)vBLc%*rjQxI8e@Z?6_1xKzFe*~nw`Pt7 zXs`zZsa$6}FWK5=@C)Vle`Cn0Y-$*A66w!7$Z%TFl*FCe9Jd;54od(pEN)&w6acyO z)C1W-tb35wXvf9Bt8UjS2P)rvcIrAE60MUQ6 z!-<^V5bn{s@>3{zvxRf{^pho8E^y2x(8l*7D<26o%n#N4(*?NtX8W?XvDd3Y{8}qS zxGR4Ce&2_3o(Q(9JjB4jGUPVSjh0hZ-st!>D-LiSwnp27POz4>!vc6l*TQFxF21hp zl6X5;ZN}E6kR_dF97iYfDJmMerq8FwoX$u!sY;1Aelc+P^VF#)?NQKCE7AMwO*GK# z$nj?so0T_i0?xMs<3uAA^wd)Pfr3VJ5@3wB>+V|i-!Z7L8iJ`Ump{Q*Vu zm#gnY)jL})>i%&gLMk-fVhT;W%A>y{Z?nykglNv6I+ZfXtZv6dujpp{_*hWE5iLmj z3jKh^m$zDyt?LGFa4meNPgQL=7%5zw7__MNUS59S09e=)LbQRk-@tff8~r}DxI+5z z*G+J(0fX9fyTwDY?d*M~*OIGhSzj+Em*$(jxc5Zkl?uSPiR8TqKJ`sku)C;GcaW7e z`JThoQxr2(L0-}oxeulDZLRH3K)ASCC;Mds6apMeRyJR_xXbQ+@AQ$Oh2Wn2NG^L( zaD^$g{F|>XAsc7kVF`#Huy-SEL_pvm%bzD=IzvA@TQC>HkqDZ6r3G9?MH8FP>ql>L zJL@;Oe;ZXyxxKLon=`aQvud{hw*Y6_vs*8B3LPmWcxft@Is9zb=g*-za}V>8A_(t~ z!1bp9fu`OqaIZ=KKzTOgJgMuJ!2q4wK+#2=fy$iXg3ZQrzkmlr!rIQdb;?f^{no(g zoN|W-@;gHxaVD|G4Z7R2Q9$wlxYFeU?7E(H#QZnuq15dX_j){IvAG8<{}fRy29QId z(;BOr&w~>&XsFn-2m_|4SZQDE`p5*J9dNAN7^c9j!P^rL9Il;66`+sx58xHxzn(UM zrkphY&!2x-B)fN}{(d?nEc_`YX#o#*1Z-ROtu0rN4*dH|P2$s#)`?^0cvreRN?#g9 z->y9oXz&tkS2Yj|De|#z*xz#|Cy+bEPDI)N&k}M=8x-VIR=qa%M+%Qa>G)dW@Y|5% z^X9&`VAxB@E7*xd%eYAHzZ7`SW8#d2?f}mLit*-a?M)&chno=GxlkMfvDWAL?W7AY zB!?ef+W+UGNvhV^2fBz&PsGUZ3x!vxDZ%1+}L&D~q5;b1VzD@*= zNL(Osm5(Wb+Li!uOo0_9DLm06(hOA89Y zy$B6^K2bi4eY9PP{^ah!2c(IpyMQQ=!|q>F&ryOPT~jb{otjA;E|Y)*iZ8%Y%n_hk zuW#ih=U*XC0lx*JJ;nmr{N$aR*dg$`-N38uPU$n~o^oTodHp!{0p&)Pw$qdc+t`wO z6vtf701s2r6rl-j4iIF(N@Z&$wy2**%XwtjCYPd}>%pBC2aNxfk%`3uvS>n2CRqN+{9i**B0-^^ zrYjE|IG<322q*^-7fZc67T+|pU{@&W<~=M67!B}Di4J;jeR*OZpTQPUo5}fXduNjE$imcew%PnfUk@E#nwdXM3*ygKKfbuDIzTK@%Cx$x3OLro2k0#(#Q;%tNN~*nio^<-}%53-& zEvEqjM5c53vn%Ex+>P-#ZmJ-|UFzK5knfudpE~6OLpG26Dl1A1FXAtI1?`dcG!AO^ z_B0Mu`?H2DjaIX_dhS^;1bhNW5|HRS_w6M9b8d_cfK#TFEPem1s%D3DOQMBR7bqUv zBSmMU#uH@L^Da%Z)SeVBhTfGD?=gsG{Sl%?H~y0r;8^E<)Qz3iX{awBkS_*YD6m=Mh| zk6myNnS&rrz&7{n_DsbuA6jV*JifuYIiGpHaEemXk+`_a=b<3qEezL*hfL9eIsm_^ zBXM6%Cl4pSip~u*_4rr?FiIf|Bl6b8T=-uB7QAJb!B6Z*FpU8Y)dWZZv%OMP!ZP{Z z^~TA46xonhU}i%yof=GH;@89vx6)33GVeY)uVZrcCi)&=pp;Yw$oHXDgU;hE?TjtZ zZ}K=IJZF_OP~>A@Q=uGnMp%Ie=b~}HR<}O%8T-Flp)`j8D|eBAPoKECUjhqGt(GkD z66`abrj2Gp1s{ut76h2eaa9!C)H>0n(X^bRNAbIElLnO|uLF!5c;nbdVq5ilC1;hbL7S>f#?LtA!La{&oN6^^@=nq z!^jf#6RlF>=P6+a_!!U>rSJeA`ZMByBdIdYXVrtqeQYKFy&qR@BGJB(qPyt5EDEI3 z|AWa39@8y_nds!8Iy3MbQkOsE*nX%;rvVy{U1>TthMh~{Sqx`3;0;F?9Mj))2JqE6 z|9fi6G~K~VN70auj`G8!kL{8k?+x@R3yaqm<^8{W7nP$?SqGJ-rVYv)`#(Oue^Y{s zw7kA(J(3Y#CqbB;=pb5%0Qq?Aan^bnCroz~6DN8sgYcL;ukl|0~~v&aBAuhdbS4U5!Dmiz3_0;?}%iDs)bWh7>$n z+?wt&yhbSusE7V&E*lJBy{!@O-_O%*_I?npZpEttV)p|)r7pwFLgd3vbOiT@7q6j3st%4q9`tI4wwPPt!ls9)H>9XI-08`|($mmS}pN)b3 zZtYwQtH%a7-~wuh(Ah8&!#uvyV-qST{lKSE`We7#j|_7+TM^7HL1Nc25B+&v@%WHr{f`2$>xL*` zdnX1`eRl|dFzlvSenZKlUQzeQ#UqQb^Q5H5o>6n+-GAS^LNb^r32Ts>+B~rsI&(;8 zz+_q}{!Bx}ul7dpwo#Z3_R*BAjbhN!*Rgz6{YH<2CA6Ad!rsp>4zrEw*7eAxl|m+( zpiS)zj)aS0cyTdMV1T$jY`e%BytXZz*%x+hV(+cOHKw4QDeDIJsn*HP{pR#n)YQkS z$EAg882gPUHGSE45%GnJMlinY>p+m@}Qt^3c{MqD;!%xnQwYsZo z6hrVIdWp&pN8mEynQn(`eU_V|^vVpobd3y+meSs6B8}XS^U| zA*c@=K#C6cR_$iU*|v2ptq7dUVCHRW zz9FjREvwNw8P!)ALE|o_Rdi!`u*tj+iKYY2GkzQKVw^X z`tnD4P7I`w9wc#pR7UXiXbw@@QOTcVwC_otZHzH_7mjtc7fzy+75C$Wm)C z4zY49oS9l3){geKIZcVffW3#Sv|`Gtj0u0nsj8iuTp8^)Z3faAx2?z@P4ECxmp40Ue1W8BS=CBm_i&4UF?va>xxpKc%X8I z|D1zg)EFM?6h2IUe|d|rq8A%OOOPQS>SUO@@C0H8@41xH3nQSy*!_~E$%2h6ygMH8 z;lR&iF^vB{#b=L68&(f7qX6pDd%OyfUrm&aM%_A)^OfnTlJ>}&`wu8D`g(#SEU z(8}x{GTV1Y7HVEW9scUQ=8e%Tp|@^5^RJp8T6PK+*R_cf6P1Wukp7+*@mxbx1K%B3 zN{oMuXB#gdz1x`~K=P(sc^$q%4A$q^%cVA_GuNra5gX@=J8LLxmr+rnLBM0haC-Ur z-A2S+zo~3*SI1n;g{WNW!{KZ{p=)Ucmv(epC(qvNBj@68FiIfyrM3MFF42Le1HB@0 zhu!h(XQn@lGyluj!GZrCu?`9i3olYup0CqC5oH@SI^|VqUg2Z!o)sO{8^t|DXNxZd zgxPyZ`oksZjDN78Z;uHJ@HKuvHfofVLIs5^KKse z{DARCsoz0f;vH8R3fcOuHOqDPty)6%%TMrkftN^hjG%m8ZKLvGVhyL|ZKLNqSs3&U}9pms^pN8M*{RW``SEpBz=yk0yTH=Cwrr1)OT>)>&_{ab8@ zoI|YKhGXoHzFl^2+)q?IEvXy$@PXcm@TSytJv8|4Sh|JT^B0H75cLXq4d2Et;A2{U zLJZ%EW3>*qYIB{^wsvXH!*u*x%AAJofhT1i$89`dA!BoJg|n!C4PC4)I;AbD-GHH! zyGN5M@_p}=uwps9hj{QMquK19U!9E1PV?k>&8tBArlpg(cADh=ZQMf)<$w3m>x$?G zI#qvziuGOr^A#spQRmp3t8N0@uJM=J46aJkKtX%;8S6dhHuWJ_| zD7*7rT$1x4MN>x0baC14R;v;CO^XE~q544~gLm9T6|vi%lYwK9&hNi%^Lg%ss$_4R zNlu4E&bQ85A+R>9M>19F`?`m5YN`_knvt|@5Jo1x4)+$Bv9j)oia{YOL%FWa$Life z30~<*6_j{OM;9Dbywfn-^=6M86wpX*ADhaXl)$QLJSVzpX*N%HmnTHWl2NtB zZb|))NPjf(oW(IKg1f2rOZZBkZ!8JGJe*U>De>1}9hNybsj8P1gSM$NX%c9re{FxO z#DC_etj-MyvYuOf8~3VqfU8b{(3nGw-;!GBz4mSHq|%we(v^wwz(L>BzhCNU;@Ph^ zl!%qVbt+odR2VtlT9V2WU>H5pe=?){eIx|Ies?wGkRP z_Sx7X+v+^lelSI5YYcUppmH?Y%YAdYKX;q_mgD7%=nDF*?C$IQt33}!utcroa8}9K z45iYyV|D{Lh<`#97iV`6jY|2Pr%p1faK7Gg8A=HqGj)`-+;$~)B!5jH_9CLgVBK6u z*l+);XqD9u=kf1~o&EoN%PbXw$w~t^Wn!>_)QK!FX*FEYe2pSK`#Co^>p`AoAUESL&vZt8lZX zFXQ3ByP0^-fOUkM`>)@g>GBs4p~1Fs;NnZ+TB{X{YNqO%C3MK1hL#Q0xNLN~QkB!; zAV@X|?d0?kba<^pqY|nF$N{D;9H@*T^3xlp##)vOCEg{J+d_6tII=L48HFoU13%Uj zj;ri&W;@+fQ*rjdO6O+=_$#sVIuY*$=w9=^dsp!#t7u0p@qZ~StBHr6VMorkTZ#Xt z=h(aKNew-d?4gow{=d2l;=DKuer$elB+j52l{tf=Cppn{hnZr1iL;HdN_sUf*&zf` zh%)DH*V=GRfmNC{ehoR1A^bnPGJ2cstI=+8z%7Xn1i?`UIy;XO)>Z`OC*LMhp6|gk zW%$`Ir#9{{M$+t0D~q@u);CH6o?C`!;^|YXjZEnt zB2U$t5el1|>lAM&_}9*^!P7W}Xw(K5Ce|dZf@9Zxd=ufSlgAEh{NMDp7 z)b#l}+@9#hG?e_|h4%sELZpkE_IT4g%_~sxmn`EqJ|>TW^x4buYUyEzTflPn*w5EA zVu2eO%9a5$WlZc0!1rcnR~bPP`7pfM(B-#(5nU~VUc6f&=?5U(-YN0#6;7np_-U*S z;A2?JzV-Wn?`0R>xR*KarFgitKeMfV_qtkva#SL40iHK6{Hv_Nr!GFG z7s>7i` zA{n&`glM>OOOM~%S#)F!kJ`0pn9Z{Bu=;Ng3V4UhQY|7|p+?>A;PKB7jY?k(jr|ol zI8k_k72c#Dv$yqOGWWQ^9t`<5$eG0Y0}g&NH4PV-l2ZX%D9s0u8J`3_Udg+HuAGYs z|EdflT(#MXRJb9i?^BP)4TosxK512ZY-u}Ir=-F<_HNdf8=@mNJ)(l7NbC;^P(f)< z0EQ;&JV@W&Fc9w6kepee*b%KhL*uTf0FlStdCGs8s;;-R1Zz;Cx2b3trmb(BkZ{r~ z-$gRpMNw+*499e}C~BQPD0gjQ3@cp3vyV@I$2i7&W4V916#&POuS1q@0*-ZpeE}uy zIZ_uFIB=OE(-+294v(-eY?T-Hl2#EP(OcVn$OzKs@CyfktybN&!|;f~wmgvkeYc>o z#^uSasyMAtBZr2nsNtq+snm$V+YT*t<;qMV*Rbw#ltzppxzw?2@-f5*$nqa z>;fjWmLY;hE%-GoS3~v*lu!nGQV-QOjw)HksXh6<$FF^DVQ+<;u&| zRfnTQF}{kL4P`%a^TDN9PWJ$^FPsfBgbu>jYaFTmKXNY$G413$Fc{*s711KsIBoAy z+RLpL{rzuaWShF`>e;t$^8Aw1YPXg#t9Pkl1x+F;97r~0EjFW2joR5NiV_hp`A_W1 zOv*Mj^ZjW0X}V``5%1)`!Dy7QhNLcEg|bB$-t%>-V}w*&J*SRMk72%H5V3hx02LL( zjmp-bs#d~<{RdZ}MEtwR>Rbz@!@bXk*!QbbMCHlqwrmD^TM<%OrxOJT>JM3BPK#mY zi|^%w(!dBe9N*c#S(Hh~$UX?wAfjHtKU^S5NWm7n-Zo_&1n4A>vU2li+naNq*7y&S z1Xw;5T2u#srjH_rt_@P{PZfglyBRIo!)J)qaubU3g4HY)Jr6p<34hHU7 z50yI*oJ~bX)c+5nfu7y_SoR4k|JD6MC@N*17KI~v>SRSd*tljUiv8h}21@VE8VYj9%Z(FQ$&{*ew zg~ywU8ldwl#NCxId*y#cqKxS92TB_-8TZ9nH>`c-PD3stQ5qGh5g+d8Pt3miuCPke zb)bTuE?Hp%!6>7u6h=v4YWF(3C@JF9-p8Q*4d>t?=Bo@RA&Ux~s{hj(n`@b*gFpOx zQNFBnFC~5{e9}bPG>8H!%sX50pt(}V`dc=n5ERI=3C!%Pn3^X`I? z9unl8Zzx+3ERCEe~7aGD|53SD3N|d@@}S0Y~+krLe%fY|E1NUnT|XH_guF0 z8ms-q5&Wsgn2awYlH=n4(>9(T@ix9RM_h?@ea;^!C8NMd%WdC3L1Cc&U* zlGl_`GP?$V;{fRS^uY4?2XUV(4`+kBt3Ma-yx!WiPm-k|{6~Fe@KQ?N64h8*3=r~; zivNBXDORs8S@%@3ZuDfDC61WLn|Ko&v1~2=6K z+gaR0jwcCstY6T|bZblR-h}jdG8^tw*kyh@ULzE%XC$hB)&56E0^Dt1eg42b3T{&B z6Mk6Qdoy}vRZxEk&8JYXsi$5SRzQrb-Jbbz`0|Jvpbfax1XpUxs_Fceqn|@Tg^!Y< z3NlJgF2l0v;X{wztMPrr#|5Va)mSPc8?r)s=X zSho-@fZ*Y%m~62Zr{WaKY{wcZ&Z34GaPP9ea4A0bTtFBoE+!27HE|(l;%@Z1W^_DB zq>ML?khX74S+nvbGs<-EXv~CuZT5dCSu;Q9OlZoAyEuK27lE3ui3}1U(Iv8@)Nw)~ z8aoO`K-293#r~Rtl}<|HyfjsPDO9kAYV1dsz)H5>`HGU_FJ$XsgV67;ow z8%7JlZc0+h5>ZBw`zFdFI%708QyYyif0w^#_%{T~;a+EZ(^T}#wZoUneL+gmL&L&$ z-Jh&7CmG_hEXH(tJdTPtiiKiqkQGqs^X>@E-!i8K71DxGeiGRc+R@z;*<~ z>t=aN@BLVwKZ%g|i}#>zuKWYwD+G!6(OSl%&6%d|A57NG9FOc67#A9l%1X!}hLPnh z>_m6iZ%I^K!q-2ZQDe2>H)TDmbLV-c4{=~V$a*)XhGRg zYv?bJWDZi-*YgWt_nrO2<>^}(A{@}2*D zy5sq3l{s>WxpQ}Pv(OFb<@BO&hM)l&eB~4*B zkKIZq1Cw$Z3Rr!a8f`_M?moC&sA&Z@^*z(_C(_%uS14)l1)`)j8=Rq2Db-uh|YvTsgwQaS6!9^ZLX8 zxEkmqqr|};Lr%33PEoj*&Mmoojzd%a#YE$J!=`>kCLLGpNavY`H99)?;aasX-ydv* z;CwEind9pg7Z@g$9`!{i^a?6dq37u-u?_zCop}lcN*nFo(`}l5`}q(z*aLbK z>y$pcTW_p=>2a}kawRuV8x?6Gn_C?E(rTygcO9MNA@ru|RPy^+G1 z7P_%q#GPwswq3)OerRJ){>epH`UqGB|`f2E}(e} zV>l^2uu7{TkndsAr?-LCk6LPn*G=%Y>_B3U^CUlbY`a1_mQ&}RRC_VK%wr=CQkgl) zK%Y<91eI|EjL}Dqvp&W(Z}Qs&SASOCPqp_`7ze~B-N!<7?i58y1L6CUqU@Ae;u5n*7dykYYDejikY#JhLike+A?P60>F>~in|9wB z8+-UJ_40woyxBZV`oSb#5TM%3{M{NcL>1j&|SxR}bcO9GyBXvy<);NO= zxD|hKgKJ!QUrY|ITWRlXiSmGd)wxKLBr=xF`W|O2^(&F+7zQ0VUv7D}!X${q!?5Doc9DK$$|7EIL@>RLyc%b4mj@R%#mTH4y} zx2|*}jH6HD~yod&3uzt&eM@<)rteq}hB(UuF90V8lgptq)->4!?A?f0+; zgX2j+!>tSmW!bk3Pw;#{ssUN#gVWK1oTo^!mN;(!c&qt|hY94x{hfMovf`>z^rsZ2 z7VJ|S_TU}Q$jLT=BS`Mk)lvuf+XXvu*}MA4 zA`4`lL102jnGOYKv@5bg78wKrgIZHasWwt-WUEJ-KYVh~>w`hxWn(PP>Q{}_jT=e% zl4$42Vb91$=R$V3o%#}qu9QVKAk>>p7}gzmX|BSIPItv2HjtJtf_gbOV#6wU6_Y*2 zTNPlM`4xst;LpD6m~*d0GMjhV!V95n-S}#4ih;r&&qefbbHGAphBq}DGyjYKTbRk? zY@E~F#dWWreKNEiqN_hD>`djSEHJVi<&X}YP>mWQ7j#g_>G|3@E^sS7$ju5~1pye~ z209PMJ~6 zUIlf00ZKLhPz^r8=ejqOP2eIt3eV@@u7--Hz>-daI2&QjYNx?XTiKyZyrb>`rAoX< z4{|R{t9{~TQR{u7i6>5m%r@A;qi6z8GN;K0X>I0B`|ePotKN;TG9M|VzK_Md4fh?X^LXk) znFuw2%ye4NdUHyiouG9Syf##Wfag+EaZSy#;+f8!$g_P{l@ zWGktkD#cGNe^^FBxc|Na=^$^()L(P217OLdRH4U^nr4kY=N|qVTTUIK{xUOU5kgUh zX#6kt(-!)ci{V?_xfc)esn8XlcD|p!E2P)zVwPcIlHgKnthYu7!cJnTNwF8+&|}q* zy86iMl`IRrkmGprVu@K5(8jm@TVuXstfEz3Gm`aW?Gi=LwfaCj%*~hjncziq?uD01 zj7yM?C3>K(GY-{o-;G0X zG5Z2?COH#Js=Z8N9A4Rt$?^I?8?XaT59t*O)$p4%YrpQ!&;*B-{|z+{?jS|@z=H+y zxdPyBg%8iI|1K>L)38v#Rgn#rO|dXRN?rbLA_&%217@m8`Nqf}i@AmX=24DSX&tuT z=kMlI_Ay6_=vb{LYKAv3{DSMw$pX6<2wa+_@Q##` zu1zCQJ`VxOs3toR1p1tG>PY_L;9qMfMxr3W@CHul(b%C`-gx+^QBnn~1~Ozk-09g= zY1P-tmA^<5UUC+cHeH=mR<8(7!!IUP&~pKO;>T!e^ps$%SnUst4`N{qlfAq~QPMwz z$<7K)^QlMSnp%BVN0a!9e|3Kb`p(|*#A8dg?O8GF9zWyzx;jhEgBDb(6ICH!mr-p3 zBB!}rB1st2OG%4SifTxQ126ajuM9=9z;Mk+7pXSpT9i zBJ(B6VjoO;UIk6#6WS!3;4ho9Wd0UN1a@;Mb;MO50?8HRR;u>f17&B#tVD=L-#3d| z3lbeU!iv1zKq={f)@^2Qw1S=Mwx>Dec>1I#m6@wFy3j`LzT*`bb3<1VL3~&9T@7L&-AjQpg1Dp;JdEb9paTEqKVeVXal-(Eg(JJ6FLW0?d4uz zrSe+W)Y{CNeoT3JLt#P5xgda=MKXI4*ew+UKNp*)z?=ZqqK|xad-an7n&>sxUp9*y zz0m~s1N=&JhDWe9;fB#Q(Dc@Qj#4h5Un{bv9DQn|wCt9gcrtbHF-A(kDr8{Ic|&Ne zS&YK^sw)cSqBzbmBg=qG=KZPZAa-j_5+MhQNnLa$S!Y4*F$6c5$R zZYskX)K+bV2WpCs77u;_DM+~yfWf(2x%=;vy7H3MjRmv6b&~PRx80XPOdn%YKI(1S z7c}uyorUgWTgoC(1sRso5}b`jrO{e{s`s1?+Ba))|8luzFzI7j;nKsJtm3OpS?DEZ zU&oU%u2B;?*f(?QbZueH?fLh^JBN z|B#z_Hfs?~qpIT{e}q!De_X%+b+_l^jfH=N0I2|kWtWs`xKbC`pH=T!b(=xRRygsMclaQ2QimTHmZmRXn-dsybat#_-PsH`}Q|wzl zb9?Bp;kNfL|KmB%g5OemORdsQj>{O4Jb5tArfe~L&;mCp&(fY-EitWacBiKEBKs?^ zKPNNDAt!_VJp=-ysepN>d+M{F*TKEY?yqY<36#_WbyV}Z_mK2MBXl*rdl#?8n3?pv zo42QaPvc}##k}7YLR>W}(`K5PC$Pkhol*+jV$GuX1z^eNNM-HKf9@A(=gFqhDy$!H zz>Qg(Wm@Ua45jUqo5C-@1H=VSq>hM97g_v*A6<2DPS-3o^)-&zABA?&(Pu5rG8*zm z4u?ct z-BP!(m^^vZxYJTB9pFUx{XbfZTRcG6L@h9^vn+c1y0O^6krH}+m4I*fnd4& zRvf{|U@$*oQrxX(sgAO8pivadsXvBGW9(bG3_=xJoGaG`gZh&987b3yu5Qm5=HS`_ zQ%z_&XHe(moz{W{3h?8tk7;cQ@O#V7czW5FP_B?32dYi8qKWtOhAg<2RIiE%!EK-P zuK6KqfJK1o-~a|X5Rk2)=vsD&jz!|e+Cv7~4iSAe$v67;_xikD2&(RL`^}ex+2&K_D<;q2TsmbI7z_rG=U^ZeJU20-`JHZ11gpv$*p*ML=JC zudo^kYHU<3vE^wt&i@D4SE{%SB=MU7fb`1@WjTU0%&Ew05!%R_38ItzxE4zfWpob@ z9{zTV0Fi-1FX1X3U4%E}Kp*I@Lo=fa!Zb6T`(vmaX<}y1z1^yf6PnK5FWT|SewRB) z)XbdMpEzELz_H;N-HTcKl!3)Oi2d|?1TAQq{*wWVYY`vNU;~W!NJ*H@^2pmRN#)K_ z@K-l_cAc$zd!r!6vo9CRXGwOD z6;#HkAepPaRVhbO7K>=j2fF_xaJUmj9zY8en#YK^YaGD$65ga(XZ}&?Q{jb|48hkvqtL0WA0;~#>(en`&|Rh$tYG!1M)xGZ1pikN{JHWLo=R+;9SKxteD(t z`-S5GTo~Zlg_lA-ltibMto>y_FtfHgZAa%)@mT@H7tk(Dh~9P#eC{&r+oxnv7W_KV zY=awIb=4f4NzY}lGb+Gw^;d|7Y1+9*Ii>1}w=p@To8K=)b*tD<`&W#6hpSjlm-YX+ z-UkcrX^g4^9_MCsu zcu=y`Lmk~Vn#YKDxK=X)2LdW5v90U?l!@Qj&(z0h9m-LmX+x%W?F-`19nH)rBc=tQ z37u`IHYq8n%VL!-dD)$w^W0jW0n}$LZo=5OBL?&a0^Qt=qv4Rmx|L8K3xQ^x#M-k0T8`%uI%NJiZ-RyG-Sx{SDP#akg zNXNzIaVAZviAQ#ujiIh=9)Mnubxw{24JgTO75zQAc?p9>sN}fb&Z|qzg`bdm{krPN zOVdEPMg%ez!C!bIEC0f~V)53RP+SZMl>akw(|cigtln(BoPys1>Yw5fT-e#yM`Mc5 zA9g5);I2@khhKs{Eet6c{eL6jG9F-=Oi!nP_PO3G8aj|1HADO`f?-fjrQ4^hHd;l$ zAFw?D@+gr|&zS)3&e)i6A;IPMUNwu|JkAP=}6(zL_ZM6mvT_JIO|P>OXP z>OZVLr&Ab4#+McMA4sAk$7+;8H$XhFB&m(Ona>7(R&f6ue3kWO&RtsNOv|{U!Q?nZ z%R%eDYLxKC8*xAqo z-@~wgd;eP|{{VpV%h#A1uop)$L|EREW{{ZJR;%@0C!;3#NN^|O8c3qQUG$8!1}T>9 zJ!D%0@SYLGYQDUUU?A69)3!?r)qI3$0yg^k_yvL8KHFuC#jdXv z*dukRzae)5uImawJ!_EZN|>&TEU@R~`_4agcBg^<&2;YD;T0TTcUDC~eg3;FbP9_O z@)BxZJKJo*qEQ%yL-A!6<~kt(2r}$wLOu@of!D~}N-Y2imC(NNQPi=LqbX}`IZq61 zTmHuJ3FDbhWuvm^Sb8RHGWPO6BjUsLm3BbD-he`q1Ye7C(5i!F6}09x@~a7H`N!KZ z0I6mG$vM*YiNlR^Tn&-Uyna@0Ew|qxnrdfv#7t3EnO93eSvn0xhR7euG6lq|$^Nd8 z_%%YD4uRejJ85MY`kmjX0HvEu{sKKfS7t+dEkQJ1Zm+lnBXK?c^#5 z+P&QjUgXaDdsQFq)5If|tG%#hmb|2ysYA3rmvbf);bM`IewC;Wn1l;}fh8o=;2iD` zRK{MGe6TX&v%FM@V2DuOv~+-3M$G*sFC_S)YPAzs^_lgd>_$dbF?P&WF800kKjI4E zn~$?wlI+7$U@0YPz7EzFZ;K&svxOZne@D8jRm5z~Fz+rfzltcDE_mfOsMkYpjY$0B zKHM`qS~BzNb~F}#tJNE+*U)@0Ze5$pmN=Mne?j4aHZgg6S(Jr`W_nfY_xw5K_0oGH zfu6}5wa_}4ur#%MTdw^dK~ik(KOD{x?}pzXzV;!+nzD?wzp5aOgVRg8515(J1H3=3 z!=DimOjneZO@eLdQhjZ)1(;P8?Xlh^O*WR(QPdordLyeAe*RWE(f*plb zEeT*vI$jE=1&W)F7}SjST@BG__gwUY8Bu?)&^1|bNFQ&C+58lvJv;2&Cu0&#Y=4PM z%lKRl&mEral1|d!bo-hC?2sM*Ne5a>T9ngyB@k%-OuOp@Npwt2)1IJ011ovWhcz8H zP$Pq^^qoMP9K8&5UHjECqI7=+i6aUIfyJjvFKMwpoT{Dg%3Ec>H&78Zh83XNzyd2+ z%Vs%4FPvg9i2a|1ZvGcZWv`pED%!oQJX_B?Pgi~cFa)CytKAo#zC~RF`lRkJ@o^I7 zx*wBuzu;#6fRA3q%z1vR_u<=(_iup2ISfb`xqj{8yJ=EcA^F>OfWH-$i_u!N7BoNf zF3_=zLGoA``?6(p?+z<#k3^ zL8u#j>3)#$KyjE@k#qh(P+)hlre^J2*|4Dzq*0+YMG#el=?j{Ixc!zc(11W79lKVi z@`7LHzIXw|mWJ7ZE3nQ2$8@X$8UyTbFVM2B-U52~gbRrczL^vJj56+3Nh+=K*&6gxT9t&wr6&CM)W5~v61 zW*+tr+2k#SJ9jj6+*p_E%pq3-&)Sc&<-p%cwCZBr^?MwI6#3I@w7yW9f#Z@e1ozQn z1k=8sd$E@i|DN1WRdDgZmlZnMwVi!Dz1&`J4It3d9OjV4j<>#YiC6CQ)E=4;u0Cq> z`*M!u)_$P>%=aDy!;7OxW6EurAy)Q1FGyo=j#+0S(fGxj-(fV20W|IHHWc>?5nlrI z^n8*$BZqMXN%=s{3IJ#E{@-+P&cNuiqs|9gX6{-f-3zgub|`dYk7;n&1>g7`{eZgs znb!Q;-4ZVk`98HWM~@(2;*ie`Z-dEjF?smnz32V?z&Z=>W;_F)kDkWNU6+;pIQ5~z zG-8WI{uB&4fGo)$6C&20V`1A1RM@=5Ial+c)@z%EZlH4}x?8)nWF}f^G9LK2;lwJ3uLgL#{24;bVOE>7CbbGF-O zUoVp!zt9&0AMgb>@Hby+I>n1l?`GKzA1lfaM{B@?kUiq*2U7(aHWBrDoP4#ipyd)tYrs$CX49ya7!; zRVB2QIlfa8b4vGw$$%xP5En^T7D*FVAZ|4lYXGQ zd9r5qgH6p@sET^)7_b{16ni@&XH7oz_zwgC-b|Hihbuc`oQDC>Swta1*_%Yy2MncD zaVAD3O9InR<3{H&hz@fWN@H_WbHOo9Sz5NnXb!xb*snCTJAEU&v)4e7 zGYwuh>2?{Jim@}H_I|Qb2yy;tvKbW3(%znnA;()<6r?SoC)tP4^CqQG*S~r;z=d%7 zAx8_)TRXvGD{r-Z30oT;f_vM(%h0L!T22I;o|^ahi*EbAWQQ?q@A*iA#N1G0%XRoD z*mt2u)>~Q}-3;q1sZ{fE5G?F|Fu|u|o@nwSAw0gtC=BEQtPpFLFnIPooA&NY0Af46 z?zFU1rq&*Ss}A3GN$l8ntqH?P{=t7k(nHqhr69Pw?*<3Wk4(Ibn1lWC;vuCS9JqkC z??u0CCrKo`u-?Kdtc7K}Wz7u7*>ogjB~vB7b>8040+)6xlnts`Xbpn$An(2EpQECQ zxok;nc16jicusJSbUSlLSAwqDi?%g;4PVuz@)uE4?FQU>+B;90$%!trSWo3;eg{NT zR`vxM)5LV^i;2UD4Od993^Lf+PhPvIB)T-!o)!D#*G{$6MRutJN{hh_I=4kv2NS=% zl?c_aTwU23cG>kX`L~Hksa%?J^6Sr|8#4~k@D>TvdxU%Px2DmO(_JM|caRRU8B;4{ zHn<@5WnZ@)v$LkcvXe1$t3R?Y*Rg&E!&m)WGXv6oB{=G`Ci>zC6jb)((ll53etA|l zcUE?Jmb_b(;Q*an(9{(N=cX*d=}Lo$C4toUu&|{z7%|CYC&~JQJ_LY-9lu7b+DAj% zAs#4PK6c`<4vq=ShXA%w(nfcuJqKFL|Rf>55 zr^iRQkEliGGxS@3N4D%NHp079mg(9WjZBm zcE;dDAu*Pavb2#9$I#f9EHg?G8e`WWV+&(q7~6Y4GtzecfcJ;@`NhXPb3e~@U-$Q3 z=DM!$_nu$VOhkLZRK2m+VHFK0^-?1tU9jb&n#_#F8^p3=KF(N?_7tj0le3y8Bjk`5 zWTUXS(Sh{sAr50cAdSV{M8*TB+9@wu(-An+JknLm3={Jq{U^m~7@mK^hPr#{>vzP? zS3uiDTFa?3Ai1>raW!x1(#!?5=C%wZab`G?wapon(w}{lG3y@q~~Z)8E?e9PZvF-`5NXAk1D%cHRu6TF=xu+ZLRS1V4ZGzu2jU9mJBJ zo%OC|%6-(MYC3rE#YvJ8RAkxYg3IOHnizWNMq2Z1v8?j)4;HMHdod7w6leA6%(>98 zX7_3%R9mb7z9zWZxWhosQ1l_3jq{`JpBOJsHu9{U-!+I{?1^%WhLs|au5p`iLX|cI zF%wnsM@#$5{^u7}{#ziMiNdB8|M8 ziBxP(ZTXBxPS|2Q=A1yT<~YGi)T)%PaV+UvTH&PX2eSKl3cd&A52Cr>ow>6Pq> zx`4%|fPbiT+oC%~cf)N|O6KsDE5Be!F zvXq#=h1P8JAk+fYQH{N!VvZvm7`VM8QIDrEE&zKP0nI?oE3iWXqZrh_-5Y zfR(j54c>A%X7-TXl_~4algXdMbx@PtKKtdW1FH7bRMl*u!f)>JhC{^vfpHIb-W)Xp4%7Y1YdOSyPUR<; zArCBBK333Z8EU`4W+Orp%P#RSh>b3hx8GK zj%OSd?ek0k41K7e_8X@$VMg6%xB(Ti+GOv8e+IecfT;f~u$nVCrOe`%!vyKNaDoe=VAniDhx4Y`BFox|ye4-^-(+ivZD z`|a3Nfugg@g?dpvt?=xll~~rL4S1i;`jJL`Nk9^0^l@*^S0hbelugx8NpK}LspC9H zpV02!<%r`=P+P@R>SZcNfaO+s6rlZPk&W+q?^C%jC1a0uXTAKT8(EB0XPv1cla{`OI0+ zu2v~EZecFjl5?EzU0&+UTi}=-z(PwPkVCkTHvWaQk?2-!PSgm@K-^{k+20?jcRvRY zI0|WJkR%gut?x@9twGB!%-Hc0o{;k2O`+6WVpE?&VG43g_Q=?a%@BgXYLtN&ob~0c z_(T|6FBqLCL^m1`C?lnH>8G?5Sz;7?fG(o5h@rJV%pcDNc(N+XI{zV2|?p0HN3m0qp_VbR;sM!Gk5QA+X2XK4FPW@k@_jFo{-5yx6%8B zz{2ur`+l(uG=7&1qksK1ty@wk)ZmpPnvU59^eqHl^AsOei1Tmp3zxP6QT=J8^+ z<_aOdMCwFBqkg_bRZ^t0jr1s-uIG3_6Q(^SU;z_hj*6Fslr2`|7Dr9zn2ygt(ERA3p_0yOx;ju{SA0|L% zkB6sS3}3cX`*)6ZJJ8b%V7N)F?2B!Kqh&A7cvXI4=+hVw`n*i;sxH`1%gfqJ!%L$w z{_3J9IYW(ksz@VOti{7L8f0=#vk@3tg40UyXe7)w&n)R?N9E<5i|R%w;*qU3rAcwi zKoklr>Tlehzj{=jpgD*`EO-Aztlx;y^jq$C8+IsAF>0`QIxP?lvopyl0h=BW0fg!J z`b3Gtv!Y-uIS!nZH#tfe$7z0=KFWj%KY|mUqs`?G3j)OvplBF*$w|eBh;f~r7)Vum zAlK4-zwGfP%|S?g({r{%e-`VLl=T;H<+7FVWB8#JAP^W{w@J0&Hl!`bbFQBwWt)bv z%gTHbqA>(_&K{lXDOEMxeQXv33C-r;rg-M>S7|iKzqY>|=-e!iQ#>a1l5W;p0yQYB zIAYlF1}D#SFo%F4@n#lJ+zGSxIQ(Rfc4gfCDVITP(0K``a$H}vPkgn|6YI1GixP?FMQ9!Y2bMqN@%Qvm6 zE9cRH>$<;} zZa{m-Qg}$<6_Y296Tt7UJCw6F!5}E z`OYxbw95-MPv}0lsz~N0zM=L0LDRsq%RozPA`0j-L06!jVEOv~Mt1<9nrVDt5B6Om zXK27JnUk_LOh^FsZrL^i3fM_GS3Zy=(n=imo`xZuTu7@Q2J$f>LElhm-_WhmpbU6W zT<_&-gL5~K%!#di-jGhPu4lu<(BRVyzm0;!K-h|VDIjF9r~EmJ!xxk#V&4M|O%)5h_l#UuzgHD0AY9!{-ZkNmm;NU+_}8Z^=9o;rJi*EHt{mije%}B8{*QQ| c>el?qx;t?<#_&jszaX2mPwS&{)X!b}FM1%2QUCw| diff --git a/tiny/rna/configuration.py b/tiny/rna/configuration.py index 826ee1dc..fba50804 100644 --- a/tiny/rna/configuration.py +++ b/tiny/rna/configuration.py @@ -473,7 +473,7 @@ class PathsFile(ConfigBase): Relative paths are automatically resolved on lookup and list types are enforced. While this is convenient, developers should be aware of the following caveats: - Lookups that return list values do not return the original object; don't - append to them. Instead, use the append_to() helper function. + expect modifications to stick. If appending, use append_to(). - Chained assignments can produce unexpected results. Args: diff --git a/tiny/rna/resume.py b/tiny/rna/resume.py index 68cb47a1..1046edb2 100644 --- a/tiny/rna/resume.py +++ b/tiny/rna/resume.py @@ -97,7 +97,7 @@ def load_paths_config(self): created under the old auto-documentation approach (in the new approach, it would be adjacent and therefore a basename). In order to allow for multiple resumes on this old Run Directory, we upgrade it to use the new auto-doc - approach and safe the existing Run Config to the /config subdir.""" + approach and save the existing processed Run Config to the /config subdir.""" paths = PathsFile(self['paths_config']) if os.path.isabs(self['paths_config']):