From 23a576c7d1a89ec5c635fe901ce416bdde307a86 Mon Sep 17 00:00:00 2001 From: nsohail19 Date: Tue, 31 May 2022 13:16:55 -0400 Subject: [PATCH 01/16] Functional SeqcAda notebook --- notebooks/Run_SeqcAda_WIP.ipynb | 1782 +++++++++++++++++++++++++++---- 1 file changed, 1574 insertions(+), 208 deletions(-) diff --git a/notebooks/Run_SeqcAda_WIP.ipynb b/notebooks/Run_SeqcAda_WIP.ipynb index 3e8022e..0993f49 100644 --- a/notebooks/Run_SeqcAda_WIP.ipynb +++ b/notebooks/Run_SeqcAda_WIP.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 8, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -18,16 +18,374 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "from utils.utils import *" ] }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import glob" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "# Functions" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "## List FASTQs" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# FASTQ reads/indices required for each workflow\n", + "fastq_map = {\n", + " 'genomic': ['R2'],\n", + " 'barcode': ['R1']\n", + "}\n", + "\n", + "# Get fastq file paths on S3 for each file id\n", + "# Returns dictionary from id to s3 path\n", + "# Throws exception if FASTQs don't exist for any id\n", + "def get_fastqs(\n", + " path: str, # path to directory containing FASTQ files\n", + " fastq_file_ids: list, # FASTQ file ids needed for this run type (e.g. I1, R1, R2, etc.)\n", + "\n", + "):\n", + " fastq_map = dict()\n", + " _, bucket, key, _, _ = urllib.parse.urlsplit(path)\n", + " for fid in fastq_file_ids:\n", + " files = get_s3_objects(\n", + " bucket, key.lstrip(\"/\"),\n", + " re.compile(f\"_{fid}_\\d{{3}}.fastq.gz$\")\n", + " )\n", + " try:\n", + " assert files, f\"AssertionError: Missing `{fid}` archives!\"\n", + " fastq_map[fid] = [os.path.join(\"s3://\", bucket, str(f)) for f in files]\n", + " except AssertionError as err:\n", + " logging.warning(\"%s\\n\\t %s\", err, path)\n", + " return\n", + " return fastq_map" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "def get_barcode_genomic_fastqs(samples):\n", + " \n", + " samples['fastqBarcode'] = np.empty((len(samples), 0)).tolist()\n", + " samples['fastqGenomic'] = np.empty((len(samples), 0)).tolist()\n", + " \n", + " for sample, row in samples.iterrows():\n", + " S3_path = row['S3_path']\n", + " \n", + " # Barcode FASTQ files\n", + " fastq_file_ids = fastq_map['barcode'] \n", + " barcode_path = f\"{S3_path}/barcode/\"\n", + " fastqBarcode = get_fastqs(barcode_path, fastq_file_ids)['R1']\n", + " \n", + " # Genomic FASTQ files\n", + " fastq_file_ids = fastq_map['genomic'] \n", + " genomic_path = f\"{S3_path}/genomic/\"\n", + " fastqGenomic = get_fastqs(genomic_path, fastq_file_ids)['R2']\n", + " \n", + " samples.loc[sample, 'fastqBarcode'] += fastqBarcode\n", + " samples.loc[sample, 'fastqGenomic'] += fastqGenomic\n", + " \n", + " return samples" + ] + }, { "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "## DB queries" + ] + }, + { + "cell_type": "code", + "execution_count": 6, "metadata": {}, + "outputs": [], + "source": [ + "# Common query col: id, request_id, Sample\n", + "def get_sample_name(query, query_col, creds):\n", + " \n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.sample_data\"\n", + " query = f\"\"\"\n", + " SELECT {table_sample_data}.Sample\n", + " FROM {table_sample_data}\n", + " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", + " \"\"\"\n", + " sample_names = []\n", + " results = execute_query(query, user, password)\n", + " for result in results:\n", + " sample_names.append(result[0])\n", + " return sample_names\n", + " except Error as e:\n", + " print(f\"Error: {e}\")\n", + " \n", + " \n", + "def get_aws_path(query, query_col, creds):\n", + " \n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.sample_data\"\n", + " query = f\"\"\"\n", + " SELECT {table_sample_data}.AWS_storage\n", + " FROM {table_sample_data}\n", + " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", + " \"\"\"\n", + " sample_paths = []\n", + " results = execute_query(query, user, password)\n", + " for result in results:\n", + " sample_paths.append(result[0])\n", + " return sample_paths\n", + " except Error as e:\n", + " print(f\"Error: {e}\")\n", + " \n", + " \n", + "def get_sample_id(query, query_col, creds):\n", + " \n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.sample_data\"\n", + " query = f\"\"\"\n", + " SELECT {table_sample_data}.id\n", + " FROM {table_sample_data}\n", + " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", + " \"\"\"\n", + " sample_ids = []\n", + " results = execute_query(query, user, password)\n", + " for result in results:\n", + " sample_ids.append(result[0])\n", + " return sample_ids\n", + " except Error as e:\n", + " print(f\"Error: {e}\")\n", + " \n", + "def format_sample_aws(querys, query_col, creds):\n", + " sample_names = []\n", + " sample_paths = []\n", + " sample_ids = []\n", + " \n", + " for query in querys:\n", + " sample_names += get_sample_name(query, query_col, creds)\n", + " sample_paths += get_aws_path(query, query_col, creds)\n", + " sample_ids += get_sample_id(query, query_col, creds)\n", + " \n", + " sample_paths = [s.strip('/') for s in sample_paths] # remove trailing slash if exists\n", + " \n", + " samples = pd.DataFrame(\n", + " dict(S3_path=sample_paths, Sample_ID=sample_ids),\n", + " index=sample_names,\n", + " dtype=str,\n", + " )\n", + " return samples" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "def get_genomeIndex_id(query, query_col, creds):\n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.sample_data\"\n", + " query = f\"\"\"\n", + " SELECT {table_sample_data}.genomeIndex_id\n", + " FROM {table_sample_data}\n", + " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", + " \"\"\"\n", + " \n", + " results = execute_query(query, user, password)\n", + " for result in results:\n", + " genomeIndex_id = result[0]\n", + " \n", + " return genomeIndex_id\n", + " \n", + " except Error as e:\n", + " print(f\"Error: {e}\")\n", + " \n", + "def get_scTech_id(query, query_col, creds):\n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.genome_index\"\n", + " query = f\"\"\"\n", + " SELECT {table_sample_data}.scTech_id\n", + " FROM {table_sample_data}\n", + " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", + " \"\"\"\n", + " \n", + " results = execute_query(query, user, password)\n", + " for result in results:\n", + " scTech_id = result[0]\n", + " \n", + " return scTech_id\n", + " \n", + " except Error as e:\n", + " print(f\"Error: {e}\")\n", + " \n", + "def get_index(query, query_col, creds):\n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.genome_index\"\n", + " query = f\"\"\"\n", + " SELECT {table_sample_data}.gIndex\n", + " FROM {table_sample_data}\n", + " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", + " \"\"\"\n", + " \n", + " results = execute_query(query, user, password)\n", + " for result in results:\n", + " index = result[0]\n", + " \n", + " return index\n", + " \n", + " except Error as e:\n", + " print(f\"Error: {e}\")\n", + " \n", + "def get_assay(query, query_col, creds):\n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.sc_tech\"\n", + " query = f\"\"\"\n", + " SELECT {table_sample_data}.Run_name\n", + " FROM {table_sample_data}\n", + " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", + " \"\"\"\n", + " \n", + " results = execute_query(query, user, password)\n", + " for result in results:\n", + " assay = result[0]\n", + " \n", + " return assay\n", + " \n", + " except Error as e:\n", + " print(f\"Error: {e}\")\n", + " \n", + "def get_barcode(query, query_col, creds):\n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.sc_tech\"\n", + " query = f\"\"\"\n", + " SELECT {table_sample_data}.barcodes\n", + " FROM {table_sample_data}\n", + " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", + " \"\"\"\n", + " \n", + " results = execute_query(query, user, password)\n", + " for result in results:\n", + " barcode = result[0]\n", + " \n", + " return barcode\n", + " \n", + " except Error as e:\n", + " print(f\"Error: {e}\")\n", + " \n", + " \n", + "def format_assay_barcode(samples, creds):\n", + " \n", + " # samples['genomeIndex_id'] = np.nan\n", + " samples['index'] = np.nan\n", + " # samples['scTech_id'] = np.nan\n", + " samples['assay'] = np.nan\n", + " samples['barcode'] = np.nan\n", + " \n", + " for sample, row in samples.iterrows():\n", + " sample_id = row['Sample_ID']\n", + " \n", + " genomeIndex_id = get_genomeIndex_id(sample_id, 'id', creds)\n", + " index = get_index(genomeIndex_id, 'id', creds)\n", + " scTech_id = get_scTech_id(genomeIndex_id, 'id', creds)\n", + " assay = get_assay(scTech_id, 'id', creds)\n", + " barcode = get_barcode(scTech_id, 'id', creds)\n", + " \n", + " # samples.loc[sample, 'genomeIndex_id'] = genomeIndex_id\n", + " samples.loc[sample, 'index'] = index\n", + " # samples.loc[sample, 'scTech_id'] = scTech_id\n", + " samples.loc[sample, 'assay'] = assay\n", + " samples.loc[sample, 'barcode'] = barcode\n", + "\n", + " return samples" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def get_project_id(sample_id, creds):\n", + " \n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.sample_data\"\n", + " table_project_data = \"peer_lab_db.project_data\"\n", + " query = f\"\"\"\n", + " SELECT {table_project_data}.projectName\n", + " FROM {table_project_data}\n", + " LEFT JOIN {table_sample_data}\n", + " ON {table_project_data}.id = {table_sample_data}.projectData_id\n", + " WHERE {table_sample_data}.id = {sample_id}\n", + " \"\"\"\n", + " result = execute_query(query, user, password)[0][0]\n", + " return result\n", + " except Error as e:\n", + " print(f\"Error: {e}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, "source": [ "# Process Samples" ] @@ -41,91 +399,921 @@ "## Setup" ] }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "# Maps from .wdl name (prefix) to results dirname\n", + "results_dirs = {\n", + " \"SeqcAda\": \"seqc-ada-results\",\n", + "}\n", + "\n", + "# Maps from .wdl name (prefix) to shell script\n", + "sh_files = {\n", + " \"SeqcAda\": \"submit.sh\",\n", + "}" + ] + }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ - "# Location of docker files\n", - "common_docker_registry = \"quay.io/hisplan\"\n", - "\n", - "prefix = \"SeqcAda\" # Workflow to run; also .wdl filename prefix\n", - "pipeline_type = prefix # field in *.labels.json\n", - "output_dirname = \"\"\n", + "# Location of docker files\n", + "common_docker_registry = \"quay.io/hisplan\"\n", + "\n", + "prefix = \"SeqcAda\" # Workflow to run; also .wdl filename prefix\n", + "pipeline_type = prefix # field in *.labels.json\n", + "output_dirname = results_dirs[prefix]\n", + "\n", + "# If need to add comment, put here\n", + "email = '20noor.sohail@gmail.com'\n", + "comment = \"sohailn\"" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "# Locations of workflow-related directories and files\n", + "path_to_cromwell_secrets = f\"{Path.home()}/.cromwell/cromwell-secrets.json\" # CHANGE THIS\n", + "workflow_dir = glob.glob(f\"{Path.home()}/scing/bin/*ada*\")[0]\n", + "path_to_exec = sh_files[prefix]\n", + "config_dir = f\"{workflow_dir}/configs\"\n", + "path_to_options = glob.glob(f\"{workflow_dir}/*.options.aws.json\")[0]\n", + "\n", + "# Other file locations\n", + "db_credentials_path = f\"{Path.home()}/.config.json\" # CHANGE THIS" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "# Set credentials based on SCRIdb CLI config file\n", + "with open(db_credentials_path) as f:\n", + " creds = json.load(f)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Excution" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "## Sample information" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
S3_pathSample_ID
ARN-1167_M-4T1s3://dp-lab-data/collaborators/aboir...3249
ARN-1167_Normals3://dp-lab-data/collaborators/aboir...3250
ARN-1167_PM-4T1s3://dp-lab-data/collaborators/aboir...3251
\n", + "
" + ], + "text/plain": [ + " S3_path Sample_ID\n", + "ARN-1167_M-4T1 s3://dp-lab-data/collaborators/aboir... 3249\n", + "ARN-1167_Normal s3://dp-lab-data/collaborators/aboir... 3250\n", + "ARN-1167_PM-4T1 s3://dp-lab-data/collaborators/aboir... 3251" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Common query col: id, request_id, Sample\n", + "request_ids = ['ARN-1167']\n", + "\n", + "samples = format_sample_aws(request_ids, 'request_id', creds)\n", + "samples.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
S3_pathSample_IDindexassaybarcode
ARN-1167_M-4T1s3://dp-lab-data/collaborators/aboir...3249s3://seqc-public/genomes/mm38_long_p...ten_x_v3s3://seqc-public/barcodes/ten_x_v3/f...
ARN-1167_Normals3://dp-lab-data/collaborators/aboir...3250s3://seqc-public/genomes/mm38_long_p...ten_x_v3s3://seqc-public/barcodes/ten_x_v3/f...
ARN-1167_PM-4T1s3://dp-lab-data/collaborators/aboir...3251s3://seqc-public/genomes/mm38_long_p...ten_x_v3s3://seqc-public/barcodes/ten_x_v3/f...
\n", + "
" + ], + "text/plain": [ + " S3_path Sample_ID \\\n", + "ARN-1167_M-4T1 s3://dp-lab-data/collaborators/aboir... 3249 \n", + "ARN-1167_Normal s3://dp-lab-data/collaborators/aboir... 3250 \n", + "ARN-1167_PM-4T1 s3://dp-lab-data/collaborators/aboir... 3251 \n", + "\n", + " index assay \\\n", + "ARN-1167_M-4T1 s3://seqc-public/genomes/mm38_long_p... ten_x_v3 \n", + "ARN-1167_Normal s3://seqc-public/genomes/mm38_long_p... ten_x_v3 \n", + "ARN-1167_PM-4T1 s3://seqc-public/genomes/mm38_long_p... ten_x_v3 \n", + "\n", + " barcode \n", + "ARN-1167_M-4T1 s3://seqc-public/barcodes/ten_x_v3/f... \n", + "ARN-1167_Normal s3://seqc-public/barcodes/ten_x_v3/f... \n", + "ARN-1167_PM-4T1 s3://seqc-public/barcodes/ten_x_v3/f... " + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples = format_assay_barcode(samples, creds)\n", + "samples.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
S3_pathSample_IDindexassaybarcodefastqBarcodefastqGenomic
ARN-1167_M-4T1s3://dp-lab-data/collaborators/aboir...3249s3://seqc-public/genomes/mm38_long_p...ten_x_v3s3://seqc-public/barcodes/ten_x_v3/f...[s3://dp-lab-data/collaborators/aboi...[s3://dp-lab-data/collaborators/aboi...
ARN-1167_Normals3://dp-lab-data/collaborators/aboir...3250s3://seqc-public/genomes/mm38_long_p...ten_x_v3s3://seqc-public/barcodes/ten_x_v3/f...[s3://dp-lab-data/collaborators/aboi...[s3://dp-lab-data/collaborators/aboi...
ARN-1167_PM-4T1s3://dp-lab-data/collaborators/aboir...3251s3://seqc-public/genomes/mm38_long_p...ten_x_v3s3://seqc-public/barcodes/ten_x_v3/f...[s3://dp-lab-data/collaborators/aboi...[s3://dp-lab-data/collaborators/aboi...
\n", + "
" + ], + "text/plain": [ + " S3_path Sample_ID \\\n", + "ARN-1167_M-4T1 s3://dp-lab-data/collaborators/aboir... 3249 \n", + "ARN-1167_Normal s3://dp-lab-data/collaborators/aboir... 3250 \n", + "ARN-1167_PM-4T1 s3://dp-lab-data/collaborators/aboir... 3251 \n", + "\n", + " index assay \\\n", + "ARN-1167_M-4T1 s3://seqc-public/genomes/mm38_long_p... ten_x_v3 \n", + "ARN-1167_Normal s3://seqc-public/genomes/mm38_long_p... ten_x_v3 \n", + "ARN-1167_PM-4T1 s3://seqc-public/genomes/mm38_long_p... ten_x_v3 \n", + "\n", + " barcode \\\n", + "ARN-1167_M-4T1 s3://seqc-public/barcodes/ten_x_v3/f... \n", + "ARN-1167_Normal s3://seqc-public/barcodes/ten_x_v3/f... \n", + "ARN-1167_PM-4T1 s3://seqc-public/barcodes/ten_x_v3/f... \n", + "\n", + " fastqBarcode \\\n", + "ARN-1167_M-4T1 [s3://dp-lab-data/collaborators/aboi... \n", + "ARN-1167_Normal [s3://dp-lab-data/collaborators/aboi... \n", + "ARN-1167_PM-4T1 [s3://dp-lab-data/collaborators/aboi... \n", + "\n", + " fastqGenomic \n", + "ARN-1167_M-4T1 [s3://dp-lab-data/collaborators/aboi... \n", + "ARN-1167_Normal [s3://dp-lab-data/collaborators/aboi... \n", + "ARN-1167_PM-4T1 [s3://dp-lab-data/collaborators/aboi... " + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples = get_barcode_genomic_fastqs(samples)\n", + "samples.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "## Make input file" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
SeqcAda.versionSeqcAda.assaySeqcAda.indexSeqcAda.barcodeFilesSeqcAda.fastqBarcodeSeqcAda.fastqGenomicSeqcAda.filterModeSeqcAda.outputPrefixSeqcAda.starArgumentsSeqcAda.emailSeqcAda.dockerRegistry
ARN-1167_M-4T1NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
ARN-1167_NormalNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
ARN-1167_PM-4T1NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " SeqcAda.version SeqcAda.assay SeqcAda.index \\\n", + "ARN-1167_M-4T1 NaN NaN NaN \n", + "ARN-1167_Normal NaN NaN NaN \n", + "ARN-1167_PM-4T1 NaN NaN NaN \n", + "\n", + " SeqcAda.barcodeFiles SeqcAda.fastqBarcode \\\n", + "ARN-1167_M-4T1 NaN NaN \n", + "ARN-1167_Normal NaN NaN \n", + "ARN-1167_PM-4T1 NaN NaN \n", + "\n", + " SeqcAda.fastqGenomic SeqcAda.filterMode SeqcAda.outputPrefix \\\n", + "ARN-1167_M-4T1 NaN NaN NaN \n", + "ARN-1167_Normal NaN NaN NaN \n", + "ARN-1167_PM-4T1 NaN NaN NaN \n", + "\n", + " SeqcAda.starArguments SeqcAda.email SeqcAda.dockerRegistry \n", + "ARN-1167_M-4T1 NaN NaN NaN \n", + "ARN-1167_Normal NaN NaN NaN \n", + "ARN-1167_PM-4T1 NaN NaN NaN " + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "template_prefix = 'template'\n", + "# Load minimum inputs and labels fields from input template\n", + "with open(f\"{config_dir}/{template_prefix}.inputs.json\") as f:\n", + " std_inputs_fields = list(json.load(f).keys())\n", + " \n", + "# Annotate all samples with workflow inputs and labels\n", + "inputs = pd.DataFrame(index=samples.index, columns=std_inputs_fields,)\n", + "inputs" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
SeqcAda.versionSeqcAda.assaySeqcAda.indexSeqcAda.barcodeFilesSeqcAda.fastqBarcodeSeqcAda.fastqGenomicSeqcAda.filterModeSeqcAda.outputPrefixSeqcAda.starArgumentsSeqcAda.emailSeqcAda.dockerRegistry
ARN-1167_M-4T10.2.11NaNNaNNaNNaNNaNscRNA-seqNaNrunRNGseed=020noor.sohail@gmail.comquay.io/hisplan
ARN-1167_Normal0.2.11NaNNaNNaNNaNNaNscRNA-seqNaNrunRNGseed=020noor.sohail@gmail.comquay.io/hisplan
ARN-1167_PM-4T10.2.11NaNNaNNaNNaNNaNscRNA-seqNaNrunRNGseed=020noor.sohail@gmail.comquay.io/hisplan
\n", + "
" + ], + "text/plain": [ + " SeqcAda.version SeqcAda.assay SeqcAda.index \\\n", + "ARN-1167_M-4T1 0.2.11 NaN NaN \n", + "ARN-1167_Normal 0.2.11 NaN NaN \n", + "ARN-1167_PM-4T1 0.2.11 NaN NaN \n", + "\n", + " SeqcAda.barcodeFiles SeqcAda.fastqBarcode \\\n", + "ARN-1167_M-4T1 NaN NaN \n", + "ARN-1167_Normal NaN NaN \n", + "ARN-1167_PM-4T1 NaN NaN \n", + "\n", + " SeqcAda.fastqGenomic SeqcAda.filterMode SeqcAda.outputPrefix \\\n", + "ARN-1167_M-4T1 NaN scRNA-seq NaN \n", + "ARN-1167_Normal NaN scRNA-seq NaN \n", + "ARN-1167_PM-4T1 NaN scRNA-seq NaN \n", + "\n", + " SeqcAda.starArguments SeqcAda.email \\\n", + "ARN-1167_M-4T1 runRNGseed=0 20noor.sohail@gmail.com \n", + "ARN-1167_Normal runRNGseed=0 20noor.sohail@gmail.com \n", + "ARN-1167_PM-4T1 runRNGseed=0 20noor.sohail@gmail.com \n", + "\n", + " SeqcAda.dockerRegistry \n", + "ARN-1167_M-4T1 quay.io/hisplan \n", + "ARN-1167_Normal quay.io/hisplan \n", + "ARN-1167_PM-4T1 quay.io/hisplan " + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Default inputs\n", + "inputs[f\"{prefix}.version\"] = \"0.2.11\"\n", + "inputs[f\"{prefix}.filterMode\"] = \"scRNA-seq\"\n", + "inputs[f\"{prefix}.starArguments\"] = \"runRNGseed=0\"\n", + "inputs[f\"{prefix}.email\"] = email\n", + "inputs[f\"{prefix}.dockerRegistry\"] = common_docker_registry\n", + "\n", + "inputs" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
SeqcAda.versionSeqcAda.assaySeqcAda.indexSeqcAda.barcodeFilesSeqcAda.fastqBarcodeSeqcAda.fastqGenomicSeqcAda.filterModeSeqcAda.outputPrefixSeqcAda.starArgumentsSeqcAda.emailSeqcAda.dockerRegistry
ARN-1167_M-4T10.2.11ten_x_v3s3://seqc-public/genomes/mm38_long_p...s3://seqc-public/barcodes/ten_x_v3/f...[s3://dp-lab-data/collaborators/aboi...[s3://dp-lab-data/collaborators/aboi...scRNA-seqARN-1167_M-4T1runRNGseed=020noor.sohail@gmail.comquay.io/hisplan
ARN-1167_Normal0.2.11ten_x_v3s3://seqc-public/genomes/mm38_long_p...s3://seqc-public/barcodes/ten_x_v3/f...[s3://dp-lab-data/collaborators/aboi...[s3://dp-lab-data/collaborators/aboi...scRNA-seqARN-1167_NormalrunRNGseed=020noor.sohail@gmail.comquay.io/hisplan
ARN-1167_PM-4T10.2.11ten_x_v3s3://seqc-public/genomes/mm38_long_p...s3://seqc-public/barcodes/ten_x_v3/f...[s3://dp-lab-data/collaborators/aboi...[s3://dp-lab-data/collaborators/aboi...scRNA-seqARN-1167_PM-4T1runRNGseed=020noor.sohail@gmail.comquay.io/hisplan
\n", + "
" + ], + "text/plain": [ + " SeqcAda.version SeqcAda.assay \\\n", + "ARN-1167_M-4T1 0.2.11 ten_x_v3 \n", + "ARN-1167_Normal 0.2.11 ten_x_v3 \n", + "ARN-1167_PM-4T1 0.2.11 ten_x_v3 \n", + "\n", + " SeqcAda.index \\\n", + "ARN-1167_M-4T1 s3://seqc-public/genomes/mm38_long_p... \n", + "ARN-1167_Normal s3://seqc-public/genomes/mm38_long_p... \n", + "ARN-1167_PM-4T1 s3://seqc-public/genomes/mm38_long_p... \n", + "\n", + " SeqcAda.barcodeFiles \\\n", + "ARN-1167_M-4T1 s3://seqc-public/barcodes/ten_x_v3/f... \n", + "ARN-1167_Normal s3://seqc-public/barcodes/ten_x_v3/f... \n", + "ARN-1167_PM-4T1 s3://seqc-public/barcodes/ten_x_v3/f... \n", + "\n", + " SeqcAda.fastqBarcode \\\n", + "ARN-1167_M-4T1 [s3://dp-lab-data/collaborators/aboi... \n", + "ARN-1167_Normal [s3://dp-lab-data/collaborators/aboi... \n", + "ARN-1167_PM-4T1 [s3://dp-lab-data/collaborators/aboi... \n", + "\n", + " SeqcAda.fastqGenomic SeqcAda.filterMode \\\n", + "ARN-1167_M-4T1 [s3://dp-lab-data/collaborators/aboi... scRNA-seq \n", + "ARN-1167_Normal [s3://dp-lab-data/collaborators/aboi... scRNA-seq \n", + "ARN-1167_PM-4T1 [s3://dp-lab-data/collaborators/aboi... scRNA-seq \n", + "\n", + " SeqcAda.outputPrefix SeqcAda.starArguments \\\n", + "ARN-1167_M-4T1 ARN-1167_M-4T1 runRNGseed=0 \n", + "ARN-1167_Normal ARN-1167_Normal runRNGseed=0 \n", + "ARN-1167_PM-4T1 ARN-1167_PM-4T1 runRNGseed=0 \n", + "\n", + " SeqcAda.email SeqcAda.dockerRegistry \n", + "ARN-1167_M-4T1 20noor.sohail@gmail.com quay.io/hisplan \n", + "ARN-1167_Normal 20noor.sohail@gmail.com quay.io/hisplan \n", + "ARN-1167_PM-4T1 20noor.sohail@gmail.com quay.io/hisplan " + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Sample inputs\n", + "inputs[f\"{prefix}.assay\"] = samples[\"assay\"]\n", + "inputs[f\"{prefix}.index\"] = samples[\"index\"]\n", + "inputs[f\"{prefix}.barcodeFiles\"] = samples[\"barcode\"]\n", + "inputs[f\"{prefix}.fastqBarcode\"] = samples[\"fastqBarcode\"]\n", + "inputs[f\"{prefix}.fastqGenomic\"] = samples[\"fastqGenomic\"]\n", "\n", - "# If need to add comment, put here\n", - "comment = \"\"" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "# Locations of workflow-related directories and files\n", - "path_to_cromwell_secrets = f\"{Path.home()}/.cromwell/cromwell-secrets.json\" # CHANGE THIS\n", - "workflow_dir = f\"{Path.home()}/scing/bin/seqc-ada-0.0.3\" # CHANGE THIS\n", - "path_to_exec = f\"{workflow_dir}/submit.sh\" # CHANGE THIS FOR SHARP\n", - "config_dir = f\"{workflow_dir}/configs\"\n", - "path_to_options = f\"{workflow_dir}/{prefix}.options.aws.json\"\n", + "inputs[f\"{prefix}.outputPrefix\"] = samples.index.tolist()\n", "\n", - "# Other file locations\n", - "db_credentials_path = f\"{Path.home()}/.config.json\" # CHANGE THIS" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "# Set credentials based on SCRIdb CLI config file\n", - "with open(db_credentials_path) as f:\n", - " creds = json.load(f)" + "inputs" ] }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 21, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
SeqcAda.versionSeqcAda.assaySeqcAda.indexSeqcAda.barcodeFilesSeqcAda.fastqBarcodeSeqcAda.fastqGenomicSeqcAda.filterModeSeqcAda.outputPrefixSeqcAda.starArgumentsSeqcAda.emailSeqcAda.dockerRegistry
ARN-1167_M-4T10.2.11ten_x_v3s3://dp-lab-data/collaborators/aboir...s3://seqc-public/barcodes/ten_x_v3/f...[s3://dp-lab-data/collaborators/aboi...[s3://dp-lab-data/collaborators/aboi...scRNA-seqARN-1167_M-4T1runRNGseed=020noor.sohail@gmail.comquay.io/hisplan
ARN-1167_Normal0.2.11ten_x_v3s3://dp-lab-data/collaborators/aboir...s3://seqc-public/barcodes/ten_x_v3/f...[s3://dp-lab-data/collaborators/aboi...[s3://dp-lab-data/collaborators/aboi...scRNA-seqARN-1167_NormalrunRNGseed=020noor.sohail@gmail.comquay.io/hisplan
ARN-1167_PM-4T10.2.11ten_x_v3s3://dp-lab-data/collaborators/aboir...s3://seqc-public/barcodes/ten_x_v3/f...[s3://dp-lab-data/collaborators/aboi...[s3://dp-lab-data/collaborators/aboi...scRNA-seqARN-1167_PM-4T1runRNGseed=020noor.sohail@gmail.comquay.io/hisplan
\n", + "
" + ], + "text/plain": [ + " SeqcAda.version SeqcAda.assay \\\n", + "ARN-1167_M-4T1 0.2.11 ten_x_v3 \n", + "ARN-1167_Normal 0.2.11 ten_x_v3 \n", + "ARN-1167_PM-4T1 0.2.11 ten_x_v3 \n", + "\n", + " SeqcAda.index \\\n", + "ARN-1167_M-4T1 s3://dp-lab-data/collaborators/aboir... \n", + "ARN-1167_Normal s3://dp-lab-data/collaborators/aboir... \n", + "ARN-1167_PM-4T1 s3://dp-lab-data/collaborators/aboir... \n", + "\n", + " SeqcAda.barcodeFiles \\\n", + "ARN-1167_M-4T1 s3://seqc-public/barcodes/ten_x_v3/f... \n", + "ARN-1167_Normal s3://seqc-public/barcodes/ten_x_v3/f... \n", + "ARN-1167_PM-4T1 s3://seqc-public/barcodes/ten_x_v3/f... \n", + "\n", + " SeqcAda.fastqBarcode \\\n", + "ARN-1167_M-4T1 [s3://dp-lab-data/collaborators/aboi... \n", + "ARN-1167_Normal [s3://dp-lab-data/collaborators/aboi... \n", + "ARN-1167_PM-4T1 [s3://dp-lab-data/collaborators/aboi... \n", + "\n", + " SeqcAda.fastqGenomic SeqcAda.filterMode \\\n", + "ARN-1167_M-4T1 [s3://dp-lab-data/collaborators/aboi... scRNA-seq \n", + "ARN-1167_Normal [s3://dp-lab-data/collaborators/aboi... scRNA-seq \n", + "ARN-1167_PM-4T1 [s3://dp-lab-data/collaborators/aboi... scRNA-seq \n", + "\n", + " SeqcAda.outputPrefix SeqcAda.starArguments \\\n", + "ARN-1167_M-4T1 ARN-1167_M-4T1 runRNGseed=0 \n", + "ARN-1167_Normal ARN-1167_Normal runRNGseed=0 \n", + "ARN-1167_PM-4T1 ARN-1167_PM-4T1 runRNGseed=0 \n", + "\n", + " SeqcAda.email SeqcAda.dockerRegistry \n", + "ARN-1167_M-4T1 20noor.sohail@gmail.com quay.io/hisplan \n", + "ARN-1167_Normal 20noor.sohail@gmail.com quay.io/hisplan \n", + "ARN-1167_PM-4T1 20noor.sohail@gmail.com quay.io/hisplan " + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "# Samples on which to run CellRangerATAC\n", - "# Note: Assumes data is transferred to AWS S3 (this should be an s3 location)\n", - "# Note: Assumes directory name is name of sample\n", - "common_dir = \"s3://dp-lab-data/collaborators/VanDenBrink\"\n", - "samples = [\n", - " 'Thymic_regeneration/231_no_XRT_rep',\n", - "]\n", - "sample_paths = [\n", - " f\"{common_dir}/{sample}\" for sample in samples\n", - "]" + "# Additional changes\n", + "inputs[f\"{prefix}.index\"] = \"s3://dp-lab-data/collaborators/aboire/LeptomeningealMetHeterogeneity/transgene_reference/refdata-seqc/STAR-index/\"\n", + "inputs" ] }, { "cell_type": "code", - "execution_count": 26, + "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "# Set path to transgene reference S3\n", - "# Note: This is an exceptional case\n", - "# path_to_reference = f\"{common_dir}/transgene_reference/refdata-cellranger/3PS19_SNSEQ-GRCm38-Ensembl-87-transgenes.tar.gz\"\n", - "path_to_reference = \"https://cf.10xgenomics.com/supp/cell-exp/refdata-gex-mm10-2020-A.tar.gz\"" - ] + "source": [] }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "tags": [] + }, "source": [ - "## Execution" + "## Make label file" ] }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 22, "metadata": {}, "outputs": [ { @@ -149,121 +1337,194 @@ " \n", " \n", " \n", - " S3_Path\n", - " Sample_ID\n", - " FASTQs\n", + " pipelineType\n", + " project\n", + " sample\n", + " owner\n", + " destination\n", + " transfer\n", + " comment\n", " \n", " \n", " \n", " \n", - " 231_no_XRT_rep\n", - " s3://dp-lab-data/collaborators/VanDe...\n", - " 2070\n", - " {'All': ['s3://dp-lab-data/collabora...\n", + " ARN-1167_M-4T1\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " \n", + " \n", + " ARN-1167_Normal\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " \n", + " \n", + " ARN-1167_PM-4T1\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", " \n", " \n", "\n", "" ], "text/plain": [ - " S3_Path Sample_ID \\\n", - "231_no_XRT_rep s3://dp-lab-data/collaborators/VanDe... 2070 \n", - "\n", - " FASTQs \n", - "231_no_XRT_rep {'All': ['s3://dp-lab-data/collabora... " + " pipelineType project sample owner destination transfer comment\n", + "ARN-1167_M-4T1 NaN NaN NaN NaN NaN NaN NaN\n", + "ARN-1167_Normal NaN NaN NaN NaN NaN NaN NaN\n", + "ARN-1167_PM-4T1 NaN NaN NaN NaN NaN NaN NaN" ] }, - "execution_count": 30, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "samples" + "# Load minimum inputs and labels fields from labels template\n", + "with open(f\"{config_dir}/{template_prefix}.labels.json\") as f:\n", + " std_labels_fields = list(json.load(f).keys())\n", + " \n", + "# Annotate all samples with workflow labels\n", + "labels = pd.DataFrame(index=samples.index, columns=std_labels_fields,)\n", + "labels" ] }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 23, "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "['231_no_XRT_rep']\n" - ] + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
pipelineTypeprojectsampleownerdestinationtransfercomment
ARN-1167_M-4T1SeqcAdaLeptomeningeal metastasis heterogeneityARN-1167_M-4T1sohailns3://dp-lab-data/collaborators/aboir...-sohailn
ARN-1167_NormalSeqcAdaLeptomeningeal metastasis heterogeneityARN-1167_Normalsohailns3://dp-lab-data/collaborators/aboir...-sohailn
ARN-1167_PM-4T1SeqcAdaLeptomeningeal metastasis heterogeneityARN-1167_PM-4T1sohailns3://dp-lab-data/collaborators/aboir...-sohailn
\n", + "
" + ], + "text/plain": [ + " pipelineType project \\\n", + "ARN-1167_M-4T1 SeqcAda Leptomeningeal metastasis heterogeneity \n", + "ARN-1167_Normal SeqcAda Leptomeningeal metastasis heterogeneity \n", + "ARN-1167_PM-4T1 SeqcAda Leptomeningeal metastasis heterogeneity \n", + "\n", + " sample owner \\\n", + "ARN-1167_M-4T1 ARN-1167_M-4T1 sohailn \n", + "ARN-1167_Normal ARN-1167_Normal sohailn \n", + "ARN-1167_PM-4T1 ARN-1167_PM-4T1 sohailn \n", + "\n", + " destination transfer comment \n", + "ARN-1167_M-4T1 s3://dp-lab-data/collaborators/aboir... - sohailn \n", + "ARN-1167_Normal s3://dp-lab-data/collaborators/aboir... - sohailn \n", + "ARN-1167_PM-4T1 s3://dp-lab-data/collaborators/aboir... - sohailn " + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "# Get information for all samples\n", - "sample_paths = [s.strip('/') for s in sample_paths] # remove trailing slash if exists\n", - "sample_names = [os.path.basename(s) for s in sample_paths]\n", - "\n", - "print(sample_names)\n", - "samples = pd.DataFrame(\n", - " sample_paths,\n", - " index=sample_names,\n", - " columns=[\"S3_Path\"],\n", - " dtype=str,\n", - ")\n", - "samples[\"Sample_ID\"] = pd.Series(samples.index).apply(\n", - " lambda x: get_sample_id(x, creds['user'], creds['password'])\n", - ").values\n", - "\n", - "# Get FASTQ paths from S3\n", - "# Note: Uses same FASTQ file ids for all samples\n", - "#fastq_file_ids = fastq_map[prefix]\n", - "samples[\"FASTQs\"] = samples[\"S3_Path\"].apply(lambda x: get_fastqs(x, folder=\"barcode\"))\n", + "# Annotate labels\n", + "labels[\"pipelineType\"] = pipeline_type\n", + "labels[\"project\"] = samples[\"Sample_ID\"].apply(lambda x: get_project_id(x, creds))\n", + "labels[\"sample\"] = labels.index\n", + "labels[\"owner\"] = creds[\"user\"]\n", + "labels[\"destination\"] = samples['S3_path'] + \"/\" + output_dirname\n", + "labels[\"transfer\"] = \"-\"\n", + "labels[\"comment\"] = creds[\"user\"]\n", "\n", - "# Get reference genome location\n", - "#samples[\"Reference\"] = samples[\"Sample_ID\"].apply(lambda x: get_cr_reference(x, prefix, creds[\"user\"], creds[\"password\"]))\n", - "#samples[\"Reference\"] = path_to_reference" + "labels" ] }, { "cell_type": "code", - "execution_count": 145, + "execution_count": null, "metadata": {}, "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, "source": [ - "# Load minimum inputs and labels fields from templates\n", - "with open(f\"{config_dir}/template.inputs.json\") as f:\n", - " std_inputs_fields = list(json.load(f).keys())\n", - " \n", - "with open(f\"{config_dir}/template.labels.json\") as f:\n", - " std_labels_fields = list(json.load(f).keys())\n", - " \n", - "# Annotate all samples with workflow inputs and labels\n", - "inputs = pd.DataFrame(index=samples.index, columns=std_inputs_fields,)\n", - "labels = pd.DataFrame(index=samples.index, columns=std_labels_fields,)\n", - "\n", - "# Annotate inputs\n", - "inputs[f\"{prefix}.sampleName\"] = inputs.index # may need to change\n", - "inputs[f\"{prefix}.inputFastq\"] = samples[\"FASTQs\"].apply(lambda x: np.ravel(list(x.values())))\n", - "inputs[f\"{prefix}.fastqName\"] = inputs[f\"{prefix}.inputFastq\"].apply(lambda x: get_fastqs_name(x))\n", - "inputs[f\"{prefix}.referenceUrl\"] = samples[\"Reference\"] \n", - "inputs[f\"{prefix}.includeIntrons\"] = False\n", - "inputs[f\"{prefix}.expectCells\"] = 5000\n", - "inputs[f\"{prefix}.memory\"] = 256\n", - "inputs[f\"{prefix}.dockerRegistry\"] = common_docker_registry\n", - "\n", - "# Annotate labels\n", - "labels[\"pipelineType\"] = pipeline_type\n", - "labels[\"project\"] = samples[\"Sample_ID\"].apply(lambda x: get_project_id(x, creds[\"user\"], creds[\"password\"]))\n", - "labels[\"sample\"] = labels.index\n", - "labels[\"owner\"] = creds[\"user\"]\n", - "labels[\"destination\"] = samples['S3_Path'] + \"/\" + output_dirname\n", - "labels[\"transfer\"] = \"-\"\n", - "labels[\"comment\"] = creds[\"user\"]\n", - "\n", - "assert (std_inputs_fields == list(inputs.columns)) & (inputs.notna().values.all())\n", - "assert (std_labels_fields == list(labels.columns)) & (labels.notna().values.all())" + "# Submit job" ] }, { "cell_type": "code", - "execution_count": 146, + "execution_count": 24, "metadata": {}, "outputs": [ { @@ -287,26 +1548,60 @@ " \n", " \n", " \n", - " CellRangerGex.sampleName\n", - " CellRangerGex.fastqName\n", - " CellRangerGex.inputFastq\n", - " CellRangerGex.referenceUrl\n", - " CellRangerGex.includeIntrons\n", - " CellRangerGex.expectCells\n", - " CellRangerGex.memory\n", - " CellRangerGex.dockerRegistry\n", + " SeqcAda.version\n", + " SeqcAda.assay\n", + " SeqcAda.index\n", + " SeqcAda.barcodeFiles\n", + " SeqcAda.fastqBarcode\n", + " SeqcAda.fastqGenomic\n", + " SeqcAda.filterMode\n", + " SeqcAda.outputPrefix\n", + " SeqcAda.starArguments\n", + " SeqcAda.email\n", + " SeqcAda.dockerRegistry\n", " \n", " \n", " \n", " \n", - " SU-1358_C10_T2_on_treatment\n", - " SU-1358_C10_T2_on_treatment\n", - " 3447_SU-1358_C10_T2_on_treatment_IGO...\n", - " [s3://dp-lab-data/sc-seq/Project_124...\n", - " https://cf.10xgenomics.com/supp/cell...\n", - " False\n", - " 5000\n", - " 256\n", + " ARN-1167_M-4T1\n", + " 0.2.11\n", + " ten_x_v3\n", + " s3://dp-lab-data/collaborators/aboir...\n", + " s3://seqc-public/barcodes/ten_x_v3/f...\n", + " [s3://dp-lab-data/collaborators/aboi...\n", + " [s3://dp-lab-data/collaborators/aboi...\n", + " scRNA-seq\n", + " ARN-1167_M-4T1\n", + " runRNGseed=0\n", + " 20noor.sohail@gmail.com\n", + " quay.io/hisplan\n", + " \n", + " \n", + " ARN-1167_Normal\n", + " 0.2.11\n", + " ten_x_v3\n", + " s3://dp-lab-data/collaborators/aboir...\n", + " s3://seqc-public/barcodes/ten_x_v3/f...\n", + " [s3://dp-lab-data/collaborators/aboi...\n", + " [s3://dp-lab-data/collaborators/aboi...\n", + " scRNA-seq\n", + " ARN-1167_Normal\n", + " runRNGseed=0\n", + " 20noor.sohail@gmail.com\n", + " quay.io/hisplan\n", + " \n", + " \n", + " ARN-1167_PM-4T1\n", + " 0.2.11\n", + " ten_x_v3\n", + " s3://dp-lab-data/collaborators/aboir...\n", + " s3://seqc-public/barcodes/ten_x_v3/f...\n", + " [s3://dp-lab-data/collaborators/aboi...\n", + " [s3://dp-lab-data/collaborators/aboi...\n", + " scRNA-seq\n", + " ARN-1167_PM-4T1\n", + " runRNGseed=0\n", + " 20noor.sohail@gmail.com\n", " quay.io/hisplan\n", " \n", " \n", @@ -314,29 +1609,43 @@ "" ], "text/plain": [ - " CellRangerGex.sampleName \\\n", - "SU-1358_C10_T2_on_treatment SU-1358_C10_T2_on_treatment \n", + " SeqcAda.version SeqcAda.assay \\\n", + "ARN-1167_M-4T1 0.2.11 ten_x_v3 \n", + "ARN-1167_Normal 0.2.11 ten_x_v3 \n", + "ARN-1167_PM-4T1 0.2.11 ten_x_v3 \n", "\n", - " CellRangerGex.fastqName \\\n", - "SU-1358_C10_T2_on_treatment 3447_SU-1358_C10_T2_on_treatment_IGO... \n", + " SeqcAda.index \\\n", + "ARN-1167_M-4T1 s3://dp-lab-data/collaborators/aboir... \n", + "ARN-1167_Normal s3://dp-lab-data/collaborators/aboir... \n", + "ARN-1167_PM-4T1 s3://dp-lab-data/collaborators/aboir... \n", "\n", - " CellRangerGex.inputFastq \\\n", - "SU-1358_C10_T2_on_treatment [s3://dp-lab-data/sc-seq/Project_124... \n", + " SeqcAda.barcodeFiles \\\n", + "ARN-1167_M-4T1 s3://seqc-public/barcodes/ten_x_v3/f... \n", + "ARN-1167_Normal s3://seqc-public/barcodes/ten_x_v3/f... \n", + "ARN-1167_PM-4T1 s3://seqc-public/barcodes/ten_x_v3/f... \n", "\n", - " CellRangerGex.referenceUrl \\\n", - "SU-1358_C10_T2_on_treatment https://cf.10xgenomics.com/supp/cell... \n", + " SeqcAda.fastqBarcode \\\n", + "ARN-1167_M-4T1 [s3://dp-lab-data/collaborators/aboi... \n", + "ARN-1167_Normal [s3://dp-lab-data/collaborators/aboi... \n", + "ARN-1167_PM-4T1 [s3://dp-lab-data/collaborators/aboi... \n", "\n", - " CellRangerGex.includeIntrons \\\n", - "SU-1358_C10_T2_on_treatment False \n", + " SeqcAda.fastqGenomic SeqcAda.filterMode \\\n", + "ARN-1167_M-4T1 [s3://dp-lab-data/collaborators/aboi... scRNA-seq \n", + "ARN-1167_Normal [s3://dp-lab-data/collaborators/aboi... scRNA-seq \n", + "ARN-1167_PM-4T1 [s3://dp-lab-data/collaborators/aboi... scRNA-seq \n", "\n", - " CellRangerGex.expectCells CellRangerGex.memory \\\n", - "SU-1358_C10_T2_on_treatment 5000 256 \n", + " SeqcAda.outputPrefix SeqcAda.starArguments \\\n", + "ARN-1167_M-4T1 ARN-1167_M-4T1 runRNGseed=0 \n", + "ARN-1167_Normal ARN-1167_Normal runRNGseed=0 \n", + "ARN-1167_PM-4T1 ARN-1167_PM-4T1 runRNGseed=0 \n", "\n", - " CellRangerGex.dockerRegistry \n", - "SU-1358_C10_T2_on_treatment quay.io/hisplan " + " SeqcAda.email SeqcAda.dockerRegistry \n", + "ARN-1167_M-4T1 20noor.sohail@gmail.com quay.io/hisplan \n", + "ARN-1167_Normal 20noor.sohail@gmail.com quay.io/hisplan \n", + "ARN-1167_PM-4T1 20noor.sohail@gmail.com quay.io/hisplan " ] }, - "execution_count": 146, + "execution_count": 24, "metadata": {}, "output_type": "execute_result" } @@ -347,7 +1656,7 @@ }, { "cell_type": "code", - "execution_count": 149, + "execution_count": 25, "metadata": {}, "outputs": [ { @@ -382,34 +1691,57 @@ " \n", " \n", " \n", - " SU-1358_C10_T2_on_treatment\n", - " CellRangerGex\n", - " POLAR\n", - " SU-1358_C10_T2_on_treatment\n", - " moormana\n", - " s3://dp-lab-data/sc-seq/Project_1243...\n", + " ARN-1167_M-4T1\n", + " SeqcAda\n", + " Leptomeningeal metastasis heterogeneity\n", + " ARN-1167_M-4T1\n", + " sohailn\n", + " s3://dp-lab-data/collaborators/aboir...\n", + " -\n", + " sohailn\n", + " \n", + " \n", + " ARN-1167_Normal\n", + " SeqcAda\n", + " Leptomeningeal metastasis heterogeneity\n", + " ARN-1167_Normal\n", + " sohailn\n", + " s3://dp-lab-data/collaborators/aboir...\n", + " -\n", + " sohailn\n", + " \n", + " \n", + " ARN-1167_PM-4T1\n", + " SeqcAda\n", + " Leptomeningeal metastasis heterogeneity\n", + " ARN-1167_PM-4T1\n", + " sohailn\n", + " s3://dp-lab-data/collaborators/aboir...\n", " -\n", - " moormana\n", + " sohailn\n", " \n", " \n", "\n", "" ], "text/plain": [ - " pipelineType project \\\n", - "SU-1358_C10_T2_on_treatment CellRangerGex POLAR \n", + " pipelineType project \\\n", + "ARN-1167_M-4T1 SeqcAda Leptomeningeal metastasis heterogeneity \n", + "ARN-1167_Normal SeqcAda Leptomeningeal metastasis heterogeneity \n", + "ARN-1167_PM-4T1 SeqcAda Leptomeningeal metastasis heterogeneity \n", "\n", - " sample owner \\\n", - "SU-1358_C10_T2_on_treatment SU-1358_C10_T2_on_treatment moormana \n", + " sample owner \\\n", + "ARN-1167_M-4T1 ARN-1167_M-4T1 sohailn \n", + "ARN-1167_Normal ARN-1167_Normal sohailn \n", + "ARN-1167_PM-4T1 ARN-1167_PM-4T1 sohailn \n", "\n", - " destination transfer \\\n", - "SU-1358_C10_T2_on_treatment s3://dp-lab-data/sc-seq/Project_1243... - \n", - "\n", - " comment \n", - "SU-1358_C10_T2_on_treatment moormana " + " destination transfer comment \n", + "ARN-1167_M-4T1 s3://dp-lab-data/collaborators/aboir... - sohailn \n", + "ARN-1167_Normal s3://dp-lab-data/collaborators/aboir... - sohailn \n", + "ARN-1167_PM-4T1 s3://dp-lab-data/collaborators/aboir... - sohailn " ] }, - "execution_count": 149, + "execution_count": 25, "metadata": {}, "output_type": "execute_result" } @@ -420,20 +1752,18 @@ }, { "cell_type": "code", - "execution_count": 150, - "metadata": { - "tags": [] - }, + "execution_count": 26, + "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "c261084afa9f437daabaecb8054fea46", + "model_id": "6bb353be8e5b4ac58269f7bc81977ab9", "version_major": 2, "version_minor": 0 }, "text/plain": [ - " 0%| | 0/1 [00:00 Date: Tue, 31 May 2022 17:50:45 -0400 Subject: [PATCH 02/16] First MitoTracing notebook --- notebooks/Run_MitoTracing.ipynb | 2070 +++++++++++++++++++++++++++++++ 1 file changed, 2070 insertions(+) create mode 100644 notebooks/Run_MitoTracing.ipynb diff --git a/notebooks/Run_MitoTracing.ipynb b/notebooks/Run_MitoTracing.ipynb new file mode 100644 index 0000000..9884cfc --- /dev/null +++ b/notebooks/Run_MitoTracing.ipynb @@ -0,0 +1,2070 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "f92e2e4f-6704-4b3d-b8ec-c51427a7ca0c", + "metadata": {}, + "outputs": [], + "source": [ + "import re, subprocess, boto3, json, shlex, mysql, os, urllib, logging\n", + "import pandas as pd\n", + "import numpy as np\n", + "from s3path import S3Path\n", + "from pathlib import Path\n", + "from tqdm.notebook import tqdm\n", + "from packaging import version\n", + "pd.set_option(\"display.max_colwidth\", 40)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "474b1723-a2e0-4556-bd36-146ed07c1bf9", + "metadata": {}, + "outputs": [], + "source": [ + "from utils.utils import *" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "3c09f4af-4524-4a93-995f-a268efba3ca5", + "metadata": {}, + "outputs": [], + "source": [ + "import glob" + ] + }, + { + "cell_type": "markdown", + "id": "1b571064-b110-4a4d-b182-bbcb19af6fc8", + "metadata": { + "jp-MarkdownHeadingCollapsed": true, + "tags": [] + }, + "source": [ + "# Functions" + ] + }, + { + "cell_type": "markdown", + "id": "47b3a514-cc78-40a4-87ff-0dfd817282e0", + "metadata": { + "jp-MarkdownHeadingCollapsed": true, + "tags": [] + }, + "source": [ + "## List FASTQs" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "022a6910-115b-4d46-b4bd-511b7a890893", + "metadata": {}, + "outputs": [], + "source": [ + "# FASTQ reads/indices required for each workflow\n", + "fastq_map = {\n", + " 'MitoTracing': ['R1', 'R2'],\n", + "}\n", + "\n", + "# Get fastq file paths on S3 for each file id\n", + "# Returns dictionary from id to s3 path\n", + "# Throws exception if FASTQs don't exist for any id\n", + "def get_fastqs(\n", + " path: str, # path to directory containing FASTQ files\n", + " fastq_file_ids: list, # FASTQ file ids needed for this run type (e.g. I1, R1, R2, etc.)\n", + "\n", + "):\n", + " fastq_map = dict()\n", + " _, bucket, key, _, _ = urllib.parse.urlsplit(path)\n", + " for fid in fastq_file_ids:\n", + " files = get_s3_objects(\n", + " bucket, key.lstrip(\"/\"),\n", + " re.compile(f\"_{fid}_\\d{{3}}.fastq.gz$\")\n", + " )\n", + " try:\n", + " assert files, f\"AssertionError: Missing `{fid}` archives!\"\n", + " fastq_map[fid] = [os.path.join(\"s3://\", bucket, str(f)) for f in files]\n", + " except AssertionError as err:\n", + " logging.warning(\"%s\\n\\t %s\", err, path)\n", + " return\n", + " return fastq_map" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "ae81c97b-0e5b-4aae-ae8a-977ca6384b21", + "metadata": {}, + "outputs": [], + "source": [ + "def get_barcode_genomic_fastqs(samples):\n", + " \n", + " samples['fastq'] = np.empty((len(samples), 0)).tolist()\n", + " fastqs = []\n", + " for sample, row in samples.iterrows():\n", + " S3_path = row['S3_path']\n", + " \n", + " # List FASTQ files\n", + " fastq_file_ids = fastq_map['MitoTracing'] \n", + " path_fastq = f\"{S3_path}/FASTQ/\"\n", + " fastq = get_fastqs(path_fastq, fastq_file_ids)\n", + " \n", + " fastqs.append(fastq)\n", + " \n", + " samples['fastq'] = fastqs\n", + " return samples" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "dd638296-c86e-4bdb-87ea-37983cdfbf89", + "metadata": {}, + "outputs": [], + "source": [ + "# Extract FASTQ sample name from list of files\n", + "# Note: FASTQ name is file name up to lane id (e.g. L001, L002, etc.)\n", + "def get_fastqs_name(fastqs):\n", + " fastq_name_re = r\".*/(.*)_S\\d+_L\\d{3}_[A-Za-z]\\d_\\d{3}.fastq.gz$\"\n", + " fastq_names = [re.match(fastq_name_re, x)[1] for x in fastqs]\n", + " assert len(set(fastq_names)) == 1 # make sure all names are same\n", + " return fastq_names[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a6613242-152c-4b54-86c1-b245f3897c23", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "5543869f-37e4-4d3b-a8d6-877973abb6ee", + "metadata": { + "jp-MarkdownHeadingCollapsed": true, + "tags": [] + }, + "source": [ + "## DB queries" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "3ca3bfa5-69fd-4d5f-9d45-3d5ac61c76c8", + "metadata": {}, + "outputs": [], + "source": [ + "# Common query col: id, request_id, Sample\n", + "def get_sample_name(query, query_col, creds):\n", + " \n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.sample_data\"\n", + " query = f\"\"\"\n", + " SELECT {table_sample_data}.Sample\n", + " FROM {table_sample_data}\n", + " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", + " \"\"\"\n", + " sample_names = []\n", + " results = execute_query(query, user, password)\n", + " for result in results:\n", + " sample_names.append(result[0])\n", + " return sample_names\n", + " except Error as e:\n", + " print(f\"Error: {e}\")\n", + " \n", + " \n", + "def get_aws_path(query, query_col, creds):\n", + " \n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.sample_data\"\n", + " query = f\"\"\"\n", + " SELECT {table_sample_data}.AWS_storage\n", + " FROM {table_sample_data}\n", + " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", + " \"\"\"\n", + " sample_paths = []\n", + " results = execute_query(query, user, password)\n", + " for result in results:\n", + " sample_paths.append(result[0])\n", + " return sample_paths\n", + " except Error as e:\n", + " print(f\"Error: {e}\")\n", + " \n", + " \n", + "def get_sample_id(query, query_col, creds):\n", + " \n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.sample_data\"\n", + " query = f\"\"\"\n", + " SELECT {table_sample_data}.id\n", + " FROM {table_sample_data}\n", + " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", + " \"\"\"\n", + " sample_ids = []\n", + " results = execute_query(query, user, password)\n", + " for result in results:\n", + " sample_ids.append(result[0])\n", + " return sample_ids\n", + " except Error as e:\n", + " print(f\"Error: {e}\")\n", + " \n", + "def format_sample_aws(querys, query_col, creds):\n", + " sample_names = []\n", + " sample_paths = []\n", + " sample_ids = []\n", + " \n", + " for query in querys:\n", + " sample_names += get_sample_name(query, query_col, creds)\n", + " sample_paths += get_aws_path(query, query_col, creds)\n", + " sample_ids += get_sample_id(query, query_col, creds)\n", + " \n", + " sample_paths = [s.strip('/') for s in sample_paths] # remove trailing slash if exists\n", + " \n", + " samples = pd.DataFrame(\n", + " dict(S3_path=sample_paths, Sample_ID=sample_ids),\n", + " index=sample_names,\n", + " dtype=str,\n", + " )\n", + " return samples" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "25c817f6-9a33-4fcf-84b8-1d4ebbcb66ad", + "metadata": {}, + "outputs": [], + "source": [ + "def get_genomeIndex_id(query, query_col, creds):\n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.sample_data\"\n", + " query = f\"\"\"\n", + " SELECT {table_sample_data}.genomeIndex_id\n", + " FROM {table_sample_data}\n", + " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", + " \"\"\"\n", + " \n", + " results = execute_query(query, user, password)\n", + " for result in results:\n", + " genomeIndex_id = result[0]\n", + " \n", + " return genomeIndex_id\n", + " \n", + " except Error as e:\n", + " print(f\"Error: {e}\")\n", + " \n", + "def get_scTech_id(query, query_col, creds):\n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.genome_index\"\n", + " query = f\"\"\"\n", + " SELECT {table_sample_data}.scTech_id\n", + " FROM {table_sample_data}\n", + " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", + " \"\"\"\n", + " \n", + " results = execute_query(query, user, password)\n", + " for result in results:\n", + " scTech_id = result[0]\n", + " \n", + " return scTech_id\n", + " \n", + " except Error as e:\n", + " print(f\"Error: {e}\")\n", + " \n", + "def get_index(query, query_col, creds):\n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.genome_index\"\n", + " query = f\"\"\"\n", + " SELECT {table_sample_data}.gIndex\n", + " FROM {table_sample_data}\n", + " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", + " \"\"\"\n", + " \n", + " results = execute_query(query, user, password)\n", + " for result in results:\n", + " index = result[0]\n", + " \n", + " return index\n", + " \n", + " except Error as e:\n", + " print(f\"Error: {e}\")\n", + " \n", + "def get_assay(query, query_col, creds):\n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.sc_tech\"\n", + " query = f\"\"\"\n", + " SELECT {table_sample_data}.Run_name\n", + " FROM {table_sample_data}\n", + " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", + " \"\"\"\n", + " \n", + " results = execute_query(query, user, password)\n", + " for result in results:\n", + " assay = result[0]\n", + " \n", + " return assay\n", + " \n", + " except Error as e:\n", + " print(f\"Error: {e}\")\n", + " \n", + "def get_barcode(query, query_col, creds):\n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.sc_tech\"\n", + " query = f\"\"\"\n", + " SELECT {table_sample_data}.barcodes\n", + " FROM {table_sample_data}\n", + " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", + " \"\"\"\n", + " \n", + " results = execute_query(query, user, password)\n", + " for result in results:\n", + " barcode = result[0]\n", + " \n", + " return barcode\n", + " \n", + " except Error as e:\n", + " print(f\"Error: {e}\")\n", + " \n", + " \n", + "def format_assay_barcode(samples, creds):\n", + " \n", + " # samples['genomeIndex_id'] = np.nan\n", + " samples['index'] = np.nan\n", + " # samples['scTech_id'] = np.nan\n", + " samples['assay'] = np.nan\n", + " samples['barcode'] = np.nan\n", + " \n", + " for sample, row in samples.iterrows():\n", + " sample_id = row['Sample_ID']\n", + " \n", + " genomeIndex_id = get_genomeIndex_id(sample_id, 'id', creds)\n", + " index = get_index(genomeIndex_id, 'id', creds)\n", + " scTech_id = get_scTech_id(genomeIndex_id, 'id', creds)\n", + " assay = get_assay(scTech_id, 'id', creds)\n", + " barcode = get_barcode(scTech_id, 'id', creds)\n", + " \n", + " # samples.loc[sample, 'genomeIndex_id'] = genomeIndex_id\n", + " samples.loc[sample, 'index'] = index\n", + " # samples.loc[sample, 'scTech_id'] = scTech_id\n", + " samples.loc[sample, 'assay'] = assay\n", + " samples.loc[sample, 'barcode'] = barcode\n", + "\n", + " return samples" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "eb122238-79ee-4ecb-90d1-b2ea32e2b74d", + "metadata": {}, + "outputs": [], + "source": [ + "def get_project_id(sample_id, creds):\n", + " \n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.sample_data\"\n", + " table_project_data = \"peer_lab_db.project_data\"\n", + " query = f\"\"\"\n", + " SELECT {table_project_data}.projectName\n", + " FROM {table_project_data}\n", + " LEFT JOIN {table_sample_data}\n", + " ON {table_project_data}.id = {table_sample_data}.projectData_id\n", + " WHERE {table_sample_data}.id = {sample_id}\n", + " \"\"\"\n", + " result = execute_query(query, user, password)[0][0]\n", + " return result\n", + " except Error as e:\n", + " print(f\"Error: {e}\")" + ] + }, + { + "cell_type": "markdown", + "id": "4fd74425-41d0-402c-9998-c3ed2c9f6aec", + "metadata": { + "tags": [] + }, + "source": [ + "# Process Samples" + ] + }, + { + "cell_type": "markdown", + "id": "4c513b25-1067-4dfd-9ddc-092166012f7c", + "metadata": { + "tags": [] + }, + "source": [ + "## Setup" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "e1c96c14-0cf1-4ab2-9beb-417bc02f1154", + "metadata": {}, + "outputs": [], + "source": [ + "# Maps from .wdl name (prefix) to results dirname\n", + "results_dirs = {\n", + " \"MitoTracing\": \"mito-tracing-outs\",\n", + "}\n", + "\n", + "# Maps from .wdl name (prefix) to shell script\n", + "sh_files = {\n", + " \"MitoTracing\": \"submit-processing.sh\",\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "8ae3c158-3666-426f-94be-f9165e30c82a", + "metadata": {}, + "outputs": [], + "source": [ + "# Location of docker files\n", + "common_docker_registry = \"quay.io/hisplan\"\n", + "\n", + "prefix = \"MitoTracing\" # Workflow to run; also .wdl filename prefix\n", + "pipeline_type = prefix # field in *.labels.json\n", + "output_dirname = results_dirs[prefix]\n", + "template_prefix = 'template'\n", + "\n", + "# If need to add comment, put here\n", + "comment = \"sohailn\"" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "61658425-6370-44c2-92c2-a3a977345bd6", + "metadata": {}, + "outputs": [], + "source": [ + "# Locations of workflow-related directories and files\n", + "path_to_cromwell_secrets = f\"{Path.home()}/.cromwell/cromwell-secrets.json\" # CHANGE THIS\n", + "workflow_dir = glob.glob(f\"{Path.home()}/scing/bin/*mito*\")[0]\n", + "path_to_exec = sh_files[prefix]\n", + "config_dir = f\"{workflow_dir}/configs\"\n", + "path_to_options = glob.glob(f\"{workflow_dir}/*.options.aws.json\")[0]\n", + "\n", + "# Other file locations\n", + "db_credentials_path = f\"{Path.home()}/.config.json\" # CHANGE THIS" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "bb4d448a-5310-4b63-a073-66cf094e4467", + "metadata": {}, + "outputs": [], + "source": [ + "# Set credentials based on SCRIdb CLI config file\n", + "with open(db_credentials_path) as f:\n", + " creds = json.load(f)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c2e2bc63-cf1f-4cf5-899b-f1e73c56f5aa", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "2b28002d-85c9-4b9b-b0fc-5b86948c245c", + "metadata": {}, + "source": [ + "# Excution" + ] + }, + { + "cell_type": "markdown", + "id": "e0b988b1-df2f-4b32-a11b-786a188ba7b3", + "metadata": { + "tags": [] + }, + "source": [ + "## Sample information" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "2149bf16-9464-4654-bafd-a5b409f15321", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
S3_pathSample_ID
Ru581b_T1_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...3005
Ru581c-LN1_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...3006
Ru581D_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...3007
\n", + "
" + ], + "text/plain": [ + " S3_path Sample_ID\n", + "Ru581b_T1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3005\n", + "Ru581c-LN1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3006\n", + "Ru581D_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3007" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Common query col: id, request_id, Sample\n", + "request_ids = ['BM-1194', ]\n", + "\n", + "samples = format_sample_aws(request_ids, 'request_id', creds)\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "40640f5a-1e75-4947-98ba-05aec427e5e0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
S3_pathSample_ID
Ru581b_T1_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...3005
Ru581c-LN1_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...3006
Ru581D_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...3007
\n", + "
" + ], + "text/plain": [ + " S3_path Sample_ID\n", + "Ru581b_T1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3005\n", + "Ru581c-LN1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3006\n", + "Ru581D_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3007" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Modification for Joe's samples\n", + "samples.loc['Ru581b_T1_MITO', 'S3_path'] = 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/barcodes_rna/Ru581b_T1_MITO'\n", + "samples.loc['Ru581c-LN1_MITO', 'S3_path'] = 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/barcodes_rna/Ru581c-LN1_MITO'\n", + "\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "359fbd22-702d-4763-85c2-0410b0611bb6", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
S3_pathSample_IDindexassaybarcode
Ru581b_T1_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...3005GRCh38-3.0.0CRNaN
Ru581c-LN1_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...3006GRCh38-3.0.0CRNaN
Ru581D_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...3007GRCh38-3.0.0CRNaN
\n", + "
" + ], + "text/plain": [ + " S3_path Sample_ID \\\n", + "Ru581b_T1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3005 \n", + "Ru581c-LN1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3006 \n", + "Ru581D_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3007 \n", + "\n", + " index assay barcode \n", + "Ru581b_T1_MITO GRCh38-3.0.0 CR NaN \n", + "Ru581c-LN1_MITO GRCh38-3.0.0 CR NaN \n", + "Ru581D_MITO GRCh38-3.0.0 CR NaN " + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples = format_assay_barcode(samples, creds)\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "a14b9418-dab4-4aaf-8abb-14f9e0534152", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
S3_pathSample_IDindexassaybarcodefastq
Ru581b_T1_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...3005GRCh38-3.0.0CRNaN{'R1': ['s3://dp-lab-data/SCRI_Proje...
Ru581c-LN1_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...3006GRCh38-3.0.0CRNaN{'R1': ['s3://dp-lab-data/SCRI_Proje...
Ru581D_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...3007GRCh38-3.0.0CRNaN{'R1': ['s3://dp-lab-data/SCRI_Proje...
\n", + "
" + ], + "text/plain": [ + " S3_path Sample_ID \\\n", + "Ru581b_T1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3005 \n", + "Ru581c-LN1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3006 \n", + "Ru581D_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3007 \n", + "\n", + " index assay barcode \\\n", + "Ru581b_T1_MITO GRCh38-3.0.0 CR NaN \n", + "Ru581c-LN1_MITO GRCh38-3.0.0 CR NaN \n", + "Ru581D_MITO GRCh38-3.0.0 CR NaN \n", + "\n", + " fastq \n", + "Ru581b_T1_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "Ru581c-LN1_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "Ru581D_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... " + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples = get_barcode_genomic_fastqs(samples)\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9992a85d-6af9-449c-9eec-1ad4fc8aa2b5", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "85065328-a68e-46a7-9304-88953148416e", + "metadata": { + "tags": [] + }, + "source": [ + "## Make input file" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "ce68536f-7029-4689-83a7-239421284398", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
MitoTracing.sampleNameMitoTracing.fastqNameMitoTracing.fastqR1MitoTracing.fastqR2MitoTracing.referenceMitoTracing.includeIntronsMitoTracing.expectCellsMitoTracing.numCoresMitoTracing.memoryMitoTracing.whitelistMitoTracing.dockerRegistry
Ru581b_T1_MITONaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
Ru581c-LN1_MITONaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
Ru581D_MITONaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " MitoTracing.sampleName MitoTracing.fastqName \\\n", + "Ru581b_T1_MITO NaN NaN \n", + "Ru581c-LN1_MITO NaN NaN \n", + "Ru581D_MITO NaN NaN \n", + "\n", + " MitoTracing.fastqR1 MitoTracing.fastqR2 MitoTracing.reference \\\n", + "Ru581b_T1_MITO NaN NaN NaN \n", + "Ru581c-LN1_MITO NaN NaN NaN \n", + "Ru581D_MITO NaN NaN NaN \n", + "\n", + " MitoTracing.includeIntrons MitoTracing.expectCells \\\n", + "Ru581b_T1_MITO NaN NaN \n", + "Ru581c-LN1_MITO NaN NaN \n", + "Ru581D_MITO NaN NaN \n", + "\n", + " MitoTracing.numCores MitoTracing.memory MitoTracing.whitelist \\\n", + "Ru581b_T1_MITO NaN NaN NaN \n", + "Ru581c-LN1_MITO NaN NaN NaN \n", + "Ru581D_MITO NaN NaN NaN \n", + "\n", + " MitoTracing.dockerRegistry \n", + "Ru581b_T1_MITO NaN \n", + "Ru581c-LN1_MITO NaN \n", + "Ru581D_MITO NaN " + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Load minimum inputs and labels fields from input template\n", + "with open(f\"{config_dir}/{template_prefix}.inputs.json\") as f:\n", + " std_inputs_fields = list(json.load(f).keys())\n", + " \n", + "# Annotate all samples with workflow inputs and labels\n", + "inputs = pd.DataFrame(index=samples.index, columns=std_inputs_fields,)\n", + "inputs" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "bd8a0e97-49ad-4295-a4ff-ca83e90732c8", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
MitoTracing.sampleNameMitoTracing.fastqNameMitoTracing.fastqR1MitoTracing.fastqR2MitoTracing.referenceMitoTracing.includeIntronsMitoTracing.expectCellsMitoTracing.numCoresMitoTracing.memoryMitoTracing.whitelistMitoTracing.dockerRegistry
Ru581b_T1_MITONaNNaNNaNNaNNaNFalse500016128NaNquay.io/hisplan
Ru581c-LN1_MITONaNNaNNaNNaNNaNFalse500016128NaNquay.io/hisplan
Ru581D_MITONaNNaNNaNNaNNaNFalse500016128NaNquay.io/hisplan
\n", + "
" + ], + "text/plain": [ + " MitoTracing.sampleName MitoTracing.fastqName \\\n", + "Ru581b_T1_MITO NaN NaN \n", + "Ru581c-LN1_MITO NaN NaN \n", + "Ru581D_MITO NaN NaN \n", + "\n", + " MitoTracing.fastqR1 MitoTracing.fastqR2 MitoTracing.reference \\\n", + "Ru581b_T1_MITO NaN NaN NaN \n", + "Ru581c-LN1_MITO NaN NaN NaN \n", + "Ru581D_MITO NaN NaN NaN \n", + "\n", + " MitoTracing.includeIntrons MitoTracing.expectCells \\\n", + "Ru581b_T1_MITO False 5000 \n", + "Ru581c-LN1_MITO False 5000 \n", + "Ru581D_MITO False 5000 \n", + "\n", + " MitoTracing.numCores MitoTracing.memory \\\n", + "Ru581b_T1_MITO 16 128 \n", + "Ru581c-LN1_MITO 16 128 \n", + "Ru581D_MITO 16 128 \n", + "\n", + " MitoTracing.whitelist MitoTracing.dockerRegistry \n", + "Ru581b_T1_MITO NaN quay.io/hisplan \n", + "Ru581c-LN1_MITO NaN quay.io/hisplan \n", + "Ru581D_MITO NaN quay.io/hisplan " + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Default inputs\n", + "inputs[f\"{prefix}.includeIntrons\"] = False\n", + "inputs[f\"{prefix}.expectCells\"] = 5000\n", + "inputs[f\"{prefix}.numCores\"] = 16\n", + "inputs[f\"{prefix}.memory\"] = 128\n", + "\n", + "inputs[f\"{prefix}.dockerRegistry\"] = common_docker_registry\n", + "\n", + "inputs" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "db50eb55-40dc-4840-bc61-63525c2afb2b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
MitoTracing.sampleNameMitoTracing.fastqNameMitoTracing.fastqR1MitoTracing.fastqR2MitoTracing.referenceMitoTracing.includeIntronsMitoTracing.expectCellsMitoTracing.numCoresMitoTracing.memoryMitoTracing.whitelistMitoTracing.dockerRegistry
Ru581b_T1_MITORu581b_T1_MITO3005_Ru581b_T1_MITO_IGO_12411_1[s3://dp-lab-data/SCRI_Projects/HTA/...[s3://dp-lab-data/SCRI_Projects/HTA/...NaNFalse500016128NaNquay.io/hisplan
Ru581c-LN1_MITORu581c-LN1_MITO3006_Ru581c-LN1_MITO_IGO_12411_2[s3://dp-lab-data/SCRI_Projects/HTA/...[s3://dp-lab-data/SCRI_Projects/HTA/...NaNFalse500016128NaNquay.io/hisplan
Ru581D_MITORu581D_MITO3007_Ru581D_MITO_IGO_12411_3[s3://dp-lab-data/SCRI_Projects/HTA/...[s3://dp-lab-data/SCRI_Projects/HTA/...NaNFalse500016128NaNquay.io/hisplan
\n", + "
" + ], + "text/plain": [ + " MitoTracing.sampleName MitoTracing.fastqName \\\n", + "Ru581b_T1_MITO Ru581b_T1_MITO 3005_Ru581b_T1_MITO_IGO_12411_1 \n", + "Ru581c-LN1_MITO Ru581c-LN1_MITO 3006_Ru581c-LN1_MITO_IGO_12411_2 \n", + "Ru581D_MITO Ru581D_MITO 3007_Ru581D_MITO_IGO_12411_3 \n", + "\n", + " MitoTracing.fastqR1 \\\n", + "Ru581b_T1_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "Ru581c-LN1_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "Ru581D_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "\n", + " MitoTracing.fastqR2 \\\n", + "Ru581b_T1_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "Ru581c-LN1_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "Ru581D_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "\n", + " MitoTracing.reference MitoTracing.includeIntrons \\\n", + "Ru581b_T1_MITO NaN False \n", + "Ru581c-LN1_MITO NaN False \n", + "Ru581D_MITO NaN False \n", + "\n", + " MitoTracing.expectCells MitoTracing.numCores \\\n", + "Ru581b_T1_MITO 5000 16 \n", + "Ru581c-LN1_MITO 5000 16 \n", + "Ru581D_MITO 5000 16 \n", + "\n", + " MitoTracing.memory MitoTracing.whitelist \\\n", + "Ru581b_T1_MITO 128 NaN \n", + "Ru581c-LN1_MITO 128 NaN \n", + "Ru581D_MITO 128 NaN \n", + "\n", + " MitoTracing.dockerRegistry \n", + "Ru581b_T1_MITO quay.io/hisplan \n", + "Ru581c-LN1_MITO quay.io/hisplan \n", + "Ru581D_MITO quay.io/hisplan " + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Sample information\n", + "inputs[f\"{prefix}.sampleName\"] = samples.index.tolist()\n", + "\n", + "inputs[f\"{prefix}.fastqR1\"] = samples['fastq'].str['R1']\n", + "inputs[f\"{prefix}.fastqR2\"] = samples['fastq'].str['R2']\n", + "\n", + "for sample in inputs.index:\n", + " fastqR1_name = get_fastqs_name(inputs.loc[sample, 'MitoTracing.fastqR1'])\n", + " fastqR2_name = get_fastqs_name(inputs.loc[sample, 'MitoTracing.fastqR2'])\n", + " \n", + " assert(fastqR1_name == fastqR1_name)\n", + " inputs.loc[sample, f\"{prefix}.fastqName\"] = fastqR1_name\n", + "\n", + "inputs" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "101eb0d4-4ca6-4639-bb67-afe47109a251", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
MitoTracing.sampleNameMitoTracing.fastqNameMitoTracing.fastqR1MitoTracing.fastqR2MitoTracing.referenceMitoTracing.includeIntronsMitoTracing.expectCellsMitoTracing.numCoresMitoTracing.memoryMitoTracing.whitelistMitoTracing.dockerRegistry
Ru581b_T1_MITOnon_epi_Ru581b_T1_MITO3005_Ru581b_T1_MITO_IGO_12411_1[s3://dp-lab-data/SCRI_Projects/HTA/...[s3://dp-lab-data/SCRI_Projects/HTA/...{'cellRangerRefPkg': 's3://dp-lab-da...False500016128s3://dp-lab-data/SCRI_Projects/HTA/M...quay.io/hisplan
Ru581c-LN1_MITOnon_epi_Ru581c-LN1_MITO3006_Ru581c-LN1_MITO_IGO_12411_2[s3://dp-lab-data/SCRI_Projects/HTA/...[s3://dp-lab-data/SCRI_Projects/HTA/...{'cellRangerRefPkg': 's3://dp-lab-da...False500016128s3://dp-lab-data/SCRI_Projects/HTA/M...quay.io/hisplan
Ru581D_MITOnon_epi_Ru581D_MITO3007_Ru581D_MITO_IGO_12411_3[s3://dp-lab-data/SCRI_Projects/HTA/...[s3://dp-lab-data/SCRI_Projects/HTA/...{'cellRangerRefPkg': 's3://dp-lab-da...False500016128s3://dp-lab-data/SCRI_Projects/HTA/M...quay.io/hisplan
\n", + "
" + ], + "text/plain": [ + " MitoTracing.sampleName MitoTracing.fastqName \\\n", + "Ru581b_T1_MITO non_epi_Ru581b_T1_MITO 3005_Ru581b_T1_MITO_IGO_12411_1 \n", + "Ru581c-LN1_MITO non_epi_Ru581c-LN1_MITO 3006_Ru581c-LN1_MITO_IGO_12411_2 \n", + "Ru581D_MITO non_epi_Ru581D_MITO 3007_Ru581D_MITO_IGO_12411_3 \n", + "\n", + " MitoTracing.fastqR1 \\\n", + "Ru581b_T1_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "Ru581c-LN1_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "Ru581D_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "\n", + " MitoTracing.fastqR2 \\\n", + "Ru581b_T1_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "Ru581c-LN1_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "Ru581D_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "\n", + " MitoTracing.reference \\\n", + "Ru581b_T1_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "Ru581c-LN1_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "Ru581D_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "\n", + " MitoTracing.includeIntrons MitoTracing.expectCells \\\n", + "Ru581b_T1_MITO False 5000 \n", + "Ru581c-LN1_MITO False 5000 \n", + "Ru581D_MITO False 5000 \n", + "\n", + " MitoTracing.numCores MitoTracing.memory \\\n", + "Ru581b_T1_MITO 16 128 \n", + "Ru581c-LN1_MITO 16 128 \n", + "Ru581D_MITO 16 128 \n", + "\n", + " MitoTracing.whitelist \\\n", + "Ru581b_T1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "Ru581c-LN1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "Ru581D_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "\n", + " MitoTracing.dockerRegistry \n", + "Ru581b_T1_MITO quay.io/hisplan \n", + "Ru581c-LN1_MITO quay.io/hisplan \n", + "Ru581D_MITO quay.io/hisplan " + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Manually adding (for this sample)\n", + "\n", + "cellRangerRefPkg=\"s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/reference-packages/refdata-gex-mito-GRCh38-ensemble98.tar.gz\"\n", + "mitoFastaRefPkg=\"s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/reference-packages/mito-fasta-GRCh38.tar.gz\"\n", + "\n", + "reference = [dict(cellRangerRefPkg=cellRangerRefPkg,\n", + " mitoFastaRefPkg=mitoFastaRefPkg)] * len(inputs)\n", + "inputs[f\"{prefix}.reference\"] = reference\n", + "\n", + "non_epithelial = ['s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/barcodes_rna/Ru581b_T1_MITO/barcodes_in_RNA.non-epithelial.RU581_Ta.txt',\n", + " 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/barcodes_rna/Ru581c-LN1_MITO/barcodes_in_RNA.non-epithelial.RU581_LNa.txt',\n", + " 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/barcodes_rna/Ru581D_MITO/barcodes_in_RNA.non-epithelial.RU581_LIV.txt']\n", + "\n", + "epithelial = ['s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/barcodes_rna/Ru581b_T1_MITO/barcodes_in_RNA.RU581_Ta.txt',\n", + " 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/barcodes_rna/Ru581c-LN1_MITO/barcodes_in_RNA.RU581_LNa.txt',\n", + " 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/barcodes_rna/Ru581D_MITO/barcodes_in_RNA.RU581_LIV.txt']\n", + "\n", + "# inputs[f\"{prefix}.whitelist\"] = epithelial\n", + "inputs[f\"{prefix}.whitelist\"] = non_epithelial\n", + "\n", + "# inputs[f\"{prefix}.sampleName\"] = 'epi_' + inputs[f\"{prefix}.sampleName\"] \n", + "inputs[f\"{prefix}.sampleName\"] = 'non_epi_' + inputs[f\"{prefix}.sampleName\"]\n", + "\n", + "inputs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1ae5805b-8806-4846-a9ed-3b7400e99e2d", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "0f737133-5115-4ee6-bf93-5443e5c652d1", + "metadata": { + "tags": [] + }, + "source": [ + "## Make label file" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "6ca8c556-8254-4051-93ee-5447d43abfbb", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
pipelineTypeprojectsampleownerdestinationtransfercomment
Ru581b_T1_MITONaNNaNNaNNaNNaNNaNNaN
Ru581c-LN1_MITONaNNaNNaNNaNNaNNaNNaN
Ru581D_MITONaNNaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " pipelineType project sample owner destination transfer comment\n", + "Ru581b_T1_MITO NaN NaN NaN NaN NaN NaN NaN\n", + "Ru581c-LN1_MITO NaN NaN NaN NaN NaN NaN NaN\n", + "Ru581D_MITO NaN NaN NaN NaN NaN NaN NaN" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Load minimum inputs and labels fields from labels template\n", + "with open(f\"{config_dir}/{template_prefix}.labels.json\") as f:\n", + " std_labels_fields = list(json.load(f).keys())\n", + " \n", + "# Annotate all samples with workflow labels\n", + "labels = pd.DataFrame(index=samples.index, columns=std_labels_fields,)\n", + "labels" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "0731efde-30bb-419b-b5a4-b8420911f309", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
pipelineTypeprojectsampleownerdestinationtransfercomment
Ru581b_T1_MITOMitoTracingHTAN_CITEseqRu581b_T1_MITOsohailns3://dp-lab-data/SCRI_Projects/HTA/M...-sohailn
Ru581c-LN1_MITOMitoTracingHTAN_CITEseqRu581c-LN1_MITOsohailns3://dp-lab-data/SCRI_Projects/HTA/M...-sohailn
Ru581D_MITOMitoTracingHTAN_CITEseqRu581D_MITOsohailns3://dp-lab-data/SCRI_Projects/HTA/M...-sohailn
\n", + "
" + ], + "text/plain": [ + " pipelineType project sample owner \\\n", + "Ru581b_T1_MITO MitoTracing HTAN_CITEseq Ru581b_T1_MITO sohailn \n", + "Ru581c-LN1_MITO MitoTracing HTAN_CITEseq Ru581c-LN1_MITO sohailn \n", + "Ru581D_MITO MitoTracing HTAN_CITEseq Ru581D_MITO sohailn \n", + "\n", + " destination transfer comment \n", + "Ru581b_T1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... - sohailn \n", + "Ru581c-LN1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... - sohailn \n", + "Ru581D_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... - sohailn " + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Annotate labels\n", + "labels[\"pipelineType\"] = pipeline_type\n", + "labels[\"project\"] = samples[\"Sample_ID\"].apply(lambda x: get_project_id(x, creds))\n", + "labels[\"sample\"] = labels.index\n", + "labels[\"owner\"] = creds[\"user\"]\n", + "# labels[\"destination\"] = samples['S3_path'] + \"/\" + output_dirname\n", + "# labels[\"destination\"] = samples['S3_path'] + \"/\" + 'epi_' + output_dirname\n", + "labels[\"destination\"] = samples['S3_path'] + \"/\" + 'non_epi_' + output_dirname\n", + "\n", + "labels[\"transfer\"] = \"-\"\n", + "labels[\"comment\"] = creds[\"user\"]\n", + "\n", + "labels" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "82ab0b61-8acf-43d3-97ae-3e53c528e890", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array(['s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/barcodes_rna/Ru581b_T1_MITO/non_epi_mito-tracing-outs',\n", + " 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/barcodes_rna/Ru581c-LN1_MITO/non_epi_mito-tracing-outs',\n", + " 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/barcodes_rna/Ru581D_MITO/non_epi_mito-tracing-outs'],\n", + " dtype=object)" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "labels.loc['Ru581D_MITO', 'destination'] = 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/barcodes_rna/Ru581D_MITO/non_epi_mito-tracing-outs'\n", + "labels['destination'].values" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d5973e09-e9bf-4415-acee-9e1809afdf5b", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "84007e1e-ae11-4665-ba47-aab5b803af27", + "metadata": {}, + "source": [ + "# Submit job" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "ca0f8bc8-c862-4398-89b2-152ad55bdec9", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
MitoTracing.sampleNameMitoTracing.fastqNameMitoTracing.fastqR1MitoTracing.fastqR2MitoTracing.referenceMitoTracing.includeIntronsMitoTracing.expectCellsMitoTracing.numCoresMitoTracing.memoryMitoTracing.whitelistMitoTracing.dockerRegistry
Ru581b_T1_MITOnon_epi_Ru581b_T1_MITO3005_Ru581b_T1_MITO_IGO_12411_1[s3://dp-lab-data/SCRI_Projects/HTA/...[s3://dp-lab-data/SCRI_Projects/HTA/...{'cellRangerRefPkg': 's3://dp-lab-da...False500016128s3://dp-lab-data/SCRI_Projects/HTA/M...quay.io/hisplan
Ru581c-LN1_MITOnon_epi_Ru581c-LN1_MITO3006_Ru581c-LN1_MITO_IGO_12411_2[s3://dp-lab-data/SCRI_Projects/HTA/...[s3://dp-lab-data/SCRI_Projects/HTA/...{'cellRangerRefPkg': 's3://dp-lab-da...False500016128s3://dp-lab-data/SCRI_Projects/HTA/M...quay.io/hisplan
Ru581D_MITOnon_epi_Ru581D_MITO3007_Ru581D_MITO_IGO_12411_3[s3://dp-lab-data/SCRI_Projects/HTA/...[s3://dp-lab-data/SCRI_Projects/HTA/...{'cellRangerRefPkg': 's3://dp-lab-da...False500016128s3://dp-lab-data/SCRI_Projects/HTA/M...quay.io/hisplan
\n", + "
" + ], + "text/plain": [ + " MitoTracing.sampleName MitoTracing.fastqName \\\n", + "Ru581b_T1_MITO non_epi_Ru581b_T1_MITO 3005_Ru581b_T1_MITO_IGO_12411_1 \n", + "Ru581c-LN1_MITO non_epi_Ru581c-LN1_MITO 3006_Ru581c-LN1_MITO_IGO_12411_2 \n", + "Ru581D_MITO non_epi_Ru581D_MITO 3007_Ru581D_MITO_IGO_12411_3 \n", + "\n", + " MitoTracing.fastqR1 \\\n", + "Ru581b_T1_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "Ru581c-LN1_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "Ru581D_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "\n", + " MitoTracing.fastqR2 \\\n", + "Ru581b_T1_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "Ru581c-LN1_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "Ru581D_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "\n", + " MitoTracing.reference \\\n", + "Ru581b_T1_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "Ru581c-LN1_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "Ru581D_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "\n", + " MitoTracing.includeIntrons MitoTracing.expectCells \\\n", + "Ru581b_T1_MITO False 5000 \n", + "Ru581c-LN1_MITO False 5000 \n", + "Ru581D_MITO False 5000 \n", + "\n", + " MitoTracing.numCores MitoTracing.memory \\\n", + "Ru581b_T1_MITO 16 128 \n", + "Ru581c-LN1_MITO 16 128 \n", + "Ru581D_MITO 16 128 \n", + "\n", + " MitoTracing.whitelist \\\n", + "Ru581b_T1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "Ru581c-LN1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "Ru581D_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "\n", + " MitoTracing.dockerRegistry \n", + "Ru581b_T1_MITO quay.io/hisplan \n", + "Ru581c-LN1_MITO quay.io/hisplan \n", + "Ru581D_MITO quay.io/hisplan " + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "inputs" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "a9ee54c6-1a2c-46f5-a450-75bcf2a7cfb5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
pipelineTypeprojectsampleownerdestinationtransfercomment
Ru581b_T1_MITOMitoTracingHTAN_CITEseqRu581b_T1_MITOsohailns3://dp-lab-data/SCRI_Projects/HTA/M...-sohailn
Ru581c-LN1_MITOMitoTracingHTAN_CITEseqRu581c-LN1_MITOsohailns3://dp-lab-data/SCRI_Projects/HTA/M...-sohailn
Ru581D_MITOMitoTracingHTAN_CITEseqRu581D_MITOsohailns3://dp-lab-data/SCRI_Projects/HTA/M...-sohailn
\n", + "
" + ], + "text/plain": [ + " pipelineType project sample owner \\\n", + "Ru581b_T1_MITO MitoTracing HTAN_CITEseq Ru581b_T1_MITO sohailn \n", + "Ru581c-LN1_MITO MitoTracing HTAN_CITEseq Ru581c-LN1_MITO sohailn \n", + "Ru581D_MITO MitoTracing HTAN_CITEseq Ru581D_MITO sohailn \n", + "\n", + " destination transfer comment \n", + "Ru581b_T1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... - sohailn \n", + "Ru581c-LN1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... - sohailn \n", + "Ru581D_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... - sohailn " + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "labels" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "3bd30985-9d8f-4a6a-afb4-0f93357ad25b", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d7604a2ce3c1415facaa058ae23ffa68", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/3 [00:00 Date: Mon, 6 Jun 2022 11:28:15 -0400 Subject: [PATCH 03/16] Auto search for reference path and request id --- notebooks/Run_CellRangerGex.ipynb | 1301 ++++++++++++++++++++++++----- 1 file changed, 1085 insertions(+), 216 deletions(-) diff --git a/notebooks/Run_CellRangerGex.ipynb b/notebooks/Run_CellRangerGex.ipynb index 41e1ee5..d65279e 100644 --- a/notebooks/Run_CellRangerGex.ipynb +++ b/notebooks/Run_CellRangerGex.ipynb @@ -19,6 +19,7 @@ { "cell_type": "markdown", "metadata": { + "jp-MarkdownHeadingCollapsed": true, "tags": [], "toc-hr-collapsed": true }, @@ -28,7 +29,7 @@ }, { "cell_type": "code", - "execution_count": 141, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -44,7 +45,7 @@ }, { "cell_type": "code", - "execution_count": 131, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -74,7 +75,7 @@ }, { "cell_type": "code", - "execution_count": 132, + "execution_count": 4, "metadata": { "tags": [] }, @@ -97,7 +98,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -112,7 +113,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -304,7 +305,7 @@ }, { "cell_type": "code", - "execution_count": 56, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ @@ -390,10 +391,19 @@ ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": null, "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, "source": [ - "# Process Samples" + "## Additional functions" ] }, { @@ -402,7 +412,7 @@ "tags": [] }, "source": [ - "## Setup" + "### DB query" ] }, { @@ -411,15 +421,87 @@ "metadata": {}, "outputs": [], "source": [ - "# Location of docker files\n", - "common_docker_registry = \"quay.io/hisplan\"\n", - "\n", - "prefix = \"CellRangerGex\" # Workflow to run; also .wdl filename prefix\n", - "pipeline_type = prefix # field in *.labels.json\n", - "output_dirname = \"cr-gex-results\"\n", - "\n", - "# If need to add comment, put here\n", - "comment = \"\"" + "# Common query col: id, request_id, Sample\n", + "def get_sample_name(query, query_col, creds):\n", + " \n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.sample_data\"\n", + " query = f\"\"\"\n", + " SELECT {table_sample_data}.Sample\n", + " FROM {table_sample_data}\n", + " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", + " \"\"\"\n", + " sample_names = []\n", + " results = execute_query(query, user, password)\n", + " for result in results:\n", + " sample_names.append(result[0])\n", + " return sample_names\n", + " except Error as e:\n", + " print(f\"Error: {e}\")\n", + " \n", + " \n", + "def get_aws_path(query, query_col, creds):\n", + " \n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.sample_data\"\n", + " query = f\"\"\"\n", + " SELECT {table_sample_data}.AWS_storage\n", + " FROM {table_sample_data}\n", + " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", + " \"\"\"\n", + " sample_paths = []\n", + " results = execute_query(query, user, password)\n", + " for result in results:\n", + " sample_paths.append(result[0])\n", + " return sample_paths\n", + " except Error as e:\n", + " print(f\"Error: {e}\")\n", + " \n", + " \n", + "def get_sample_id(query, query_col, creds):\n", + " \n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.sample_data\"\n", + " query = f\"\"\"\n", + " SELECT {table_sample_data}.id\n", + " FROM {table_sample_data}\n", + " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", + " \"\"\"\n", + " sample_ids = []\n", + " results = execute_query(query, user, password)\n", + " for result in results:\n", + " sample_ids.append(result[0])\n", + " return sample_ids\n", + " except Error as e:\n", + " print(f\"Error: {e}\")\n", + " \n", + "def format_sample_aws(querys, query_col, creds):\n", + " sample_names = []\n", + " sample_paths = []\n", + " sample_ids = []\n", + " \n", + " for query in querys:\n", + " sample_names += get_sample_name(query, query_col, creds)\n", + " sample_paths += get_aws_path(query, query_col, creds)\n", + " sample_ids += get_sample_id(query, query_col, creds)\n", + " \n", + " sample_paths = [s.strip('/') for s in sample_paths] # remove trailing slash if exists\n", + " \n", + " samples = pd.DataFrame(\n", + " dict(S3_Path=sample_paths, Sample_ID=sample_ids),\n", + " index=sample_names,\n", + " dtype=str,\n", + " )\n", + " return samples" ] }, { @@ -428,15 +510,136 @@ "metadata": {}, "outputs": [], "source": [ - "# Locations of workflow-related directories and files\n", - "path_to_cromwell_secrets = f\"{Path.home()}/.cromwell/cromwell-secrets.json\" # CHANGE THIS\n", - "workflow_dir = f\"{Path.home()}/scing/bin/cellranger-gex-6.1.2\" # CHANGE THIS\n", - "path_to_exec = f\"{workflow_dir}/submit.sh\" # CHANGE THIS FOR SHARP\n", - "config_dir = f\"{workflow_dir}/configs\"\n", - "path_to_options = f\"{workflow_dir}/{prefix}.options.aws.json\"\n", + "def get_genomeIndex_id(query, query_col, creds):\n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.sample_data\"\n", + " query = f\"\"\"\n", + " SELECT {table_sample_data}.genomeIndex_id\n", + " FROM {table_sample_data}\n", + " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", + " \"\"\"\n", + " \n", + " results = execute_query(query, user, password)\n", + " for result in results:\n", + " genomeIndex_id = result[0]\n", + " \n", + " return genomeIndex_id\n", + " \n", + " except Error as e:\n", + " print(f\"Error: {e}\")\n", + " \n", + "def get_scTech_id(query, query_col, creds):\n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.genome_index\"\n", + " query = f\"\"\"\n", + " SELECT {table_sample_data}.scTech_id\n", + " FROM {table_sample_data}\n", + " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", + " \"\"\"\n", + " \n", + " results = execute_query(query, user, password)\n", + " for result in results:\n", + " scTech_id = result[0]\n", + " \n", + " return scTech_id\n", + " \n", + " except Error as e:\n", + " print(f\"Error: {e}\")\n", + " \n", + "def get_index(query, query_col, creds):\n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.genome_index\"\n", + " query = f\"\"\"\n", + " SELECT {table_sample_data}.gIndex\n", + " FROM {table_sample_data}\n", + " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", + " \"\"\"\n", + " \n", + " results = execute_query(query, user, password)\n", + " for result in results:\n", + " index = result[0]\n", + " \n", + " return index\n", + " \n", + " except Error as e:\n", + " print(f\"Error: {e}\")\n", + " \n", + "def get_assay(query, query_col, creds):\n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.sc_tech\"\n", + " query = f\"\"\"\n", + " SELECT {table_sample_data}.Run_name\n", + " FROM {table_sample_data}\n", + " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", + " \"\"\"\n", + " \n", + " results = execute_query(query, user, password)\n", + " for result in results:\n", + " assay = result[0]\n", + " \n", + " return assay\n", + " \n", + " except Error as e:\n", + " print(f\"Error: {e}\")\n", + " \n", + "def get_barcode(query, query_col, creds):\n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.sc_tech\"\n", + " query = f\"\"\"\n", + " SELECT {table_sample_data}.barcodes\n", + " FROM {table_sample_data}\n", + " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", + " \"\"\"\n", + " \n", + " results = execute_query(query, user, password)\n", + " for result in results:\n", + " barcode = result[0]\n", + " \n", + " return barcode\n", + " \n", + " except Error as e:\n", + " print(f\"Error: {e}\")\n", + " \n", + " \n", + "def format_assay_barcode(samples, creds):\n", + " \n", + " # samples['genomeIndex_id'] = np.nan\n", + " samples['Reference'] = np.nan\n", + " # samples['scTech_id'] = np.nan\n", + " samples['assay'] = np.nan\n", + " # samples['barcode'] = np.nan\n", + " \n", + " for sample, row in samples.iterrows():\n", + " sample_id = row['Sample_ID']\n", + " \n", + " genomeIndex_id = get_genomeIndex_id(sample_id, 'id', creds)\n", + " index = get_index(genomeIndex_id, 'id', creds)\n", + " scTech_id = get_scTech_id(genomeIndex_id, 'id', creds)\n", + " assay = get_assay(scTech_id, 'id', creds)\n", + " barcode = get_barcode(scTech_id, 'id', creds)\n", + " \n", + " # samples.loc[sample, 'genomeIndex_id'] = genomeIndex_id\n", + " samples.loc[sample, 'Reference'] = index.strip()\n", + " # samples.loc[sample, 'scTech_id'] = scTech_id\n", + " samples.loc[sample, 'assay'] = assay.strip()\n", + " # samples.loc[sample, 'barcode'] = barcode.strip()\n", "\n", - "# Other file locations\n", - "db_credentials_path = f\"{Path.home()}/.config.json\" # CHANGE THIS" + " return samples" ] }, { @@ -445,159 +648,112 @@ "metadata": {}, "outputs": [], "source": [ - "# Set credentials based on SCRIdb CLI config file\n", - "with open(db_credentials_path) as f:\n", - " creds = json.load(f)" + "def get_project_id(sample_id, creds):\n", + " \n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.sample_data\"\n", + " table_project_data = \"peer_lab_db.project_data\"\n", + " query = f\"\"\"\n", + " SELECT {table_project_data}.projectName\n", + " FROM {table_project_data}\n", + " LEFT JOIN {table_sample_data}\n", + " ON {table_project_data}.id = {table_sample_data}.projectData_id\n", + " WHERE {table_sample_data}.id = {sample_id}\n", + " \"\"\"\n", + " result = execute_query(query, user, password)[0][0]\n", + " return result\n", + " except Error as e:\n", + " print(f\"Error: {e}\")" ] }, { - "cell_type": "code", - "execution_count": 129, + "cell_type": "markdown", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['SU-1358_C10_T2_on_treatment',\n", - " 'SU-1377_C11_screening_pancreas',\n", - " 'SU-1400_B06_screening_pancreas',\n", - " 'SU-1410_B07_liver_screening',\n", - " 'SU-1419_C12_liver_screening']" - ] - }, - "execution_count": 129, - "metadata": {}, - "output_type": "execute_result" - } - ], "source": [ - "l = !aws s3 ls $common_dir/\n", - "[s.strip()[4:-1] for s in l]" + "# Process Samples" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "## Setup" ] }, { "cell_type": "code", - "execution_count": 142, + "execution_count": 20, "metadata": {}, "outputs": [], "source": [ - "# Samples on which to run CellRangerATAC\n", - "# Note: Assumes data is transferred to AWS S3 (this should be an s3 location)\n", - "# Note: Assumes directory name is name of sample\n", - "common_dir = \"s3://dp-lab-data/sc-seq/Project_12437_S\"\n", - "samples = [\n", - " 'SU-1358_C10_T2_on_treatment',\n", - " #'SU-1377_C11_screening_pancreas',\n", - " #'SU-1400_B06_screening_pancreas',\n", - " #'SU-1410_B07_liver_screening',\n", - " #'SU-1419_C12_liver_screening'\n", - "]\n", - "sample_paths = [\n", - " f\"{common_dir}/{sample}\" for sample in samples\n", - "]" + "# Location of docker files\n", + "common_docker_registry = \"quay.io/hisplan\"\n", + "\n", + "prefix = \"CellRangerGex\" # Workflow to run; also .wdl filename prefix\n", + "pipeline_type = prefix # field in *.labels.json\n", + "output_dirname = \"cr-gex-results\"\n", + "\n", + "# If need to add comment, put here\n", + "comment = \"sohailn\"" ] }, { "cell_type": "code", - "execution_count": 112, + "execution_count": 21, "metadata": {}, "outputs": [], "source": [ - "# Set path to transgene reference S3\n", - "# Note: This is an exceptional case\n", - "# path_to_reference = f\"{common_dir}/transgene_reference/refdata-cellranger/3PS19_SNSEQ-GRCm38-Ensembl-87-transgenes.tar.gz\"\n", - "path_to_reference = \"https://cf.10xgenomics.com/supp/cell-exp/refdata-gex-mm10-2020-A.tar.gz\"" + "# Locations of workflow-related directories and files\n", + "path_to_cromwell_secrets = f\"{Path.home()}/.cromwell/cromwell-secrets.json\" # CHANGE THIS\n", + "workflow_dir = f\"{Path.home()}/scing/bin/cellranger-gex-6.1.2\" # CHANGE THIS\n", + "path_to_exec = f\"{workflow_dir}/submit.sh\" # CHANGE THIS FOR SHARP\n", + "config_dir = f\"{workflow_dir}/configs\"\n", + "path_to_options = f\"{workflow_dir}/{prefix}.options.aws.json\"\n", + "\n", + "# Other file locations\n", + "db_credentials_path = f\"{Path.home()}/.config.json\" # CHANGE THIS" ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": 22, "metadata": {}, + "outputs": [], "source": [ - "## Execution" + "# Set credentials based on SCRIdb CLI config file\n", + "with open(db_credentials_path) as f:\n", + " creds = json.load(f)" ] }, { "cell_type": "code", - "execution_count": 143, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['SU-1358_C10_T2_on_treatment']\n" - ] - } - ], - "source": [ - "# Get information for all samples\n", - "sample_paths = [s.strip('/') for s in sample_paths] # remove trailing slash if exists\n", - "sample_names = [os.path.basename(s) for s in sample_paths]\n", - "\n", - "print(sample_names)\n", - "samples = pd.DataFrame(\n", - " sample_paths,\n", - " index=sample_names,\n", - " columns=[\"S3_Path\"],\n", - " dtype=str,\n", - ")\n", - "samples[\"Sample_ID\"] = pd.Series(samples.index).apply(\n", - " lambda x: get_sample_id(x, creds['user'], creds['password'])\n", - ").values\n", - "\n", - "# Get FASTQ paths from S3\n", - "# Note: Uses same FASTQ file ids for all samples\n", - "fastq_file_ids = fastq_map[prefix]\n", - "samples[\"FASTQs\"] = samples[\"S3_Path\"].apply(lambda x: get_fastqs(x, fastq_file_ids, \"FASTQ\"))\n", - "\n", - "# Get reference genome location\n", - "samples[\"Reference\"] = samples[\"Sample_ID\"].apply(lambda x: get_cr_reference(x, prefix, creds[\"user\"], creds[\"password\"]))\n", - "#samples[\"Reference\"] = path_to_reference" - ] + "outputs": [], + "source": [] }, { "cell_type": "code", - "execution_count": 145, + "execution_count": null, "metadata": {}, "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, "source": [ - "# Load minimum inputs and labels fields from templates\n", - "with open(f\"{config_dir}/template.inputs.json\") as f:\n", - " std_inputs_fields = list(json.load(f).keys())\n", - " \n", - "with open(f\"{config_dir}/template.labels.json\") as f:\n", - " std_labels_fields = list(json.load(f).keys())\n", - " \n", - "# Annotate all samples with workflow inputs and labels\n", - "inputs = pd.DataFrame(index=samples.index, columns=std_inputs_fields,)\n", - "labels = pd.DataFrame(index=samples.index, columns=std_labels_fields,)\n", - "\n", - "# Annotate inputs\n", - "inputs[f\"{prefix}.sampleName\"] = inputs.index # may need to change\n", - "inputs[f\"{prefix}.inputFastq\"] = samples[\"FASTQs\"].apply(lambda x: np.ravel(list(x.values())))\n", - "inputs[f\"{prefix}.fastqName\"] = inputs[f\"{prefix}.inputFastq\"].apply(lambda x: get_fastqs_name(x))\n", - "inputs[f\"{prefix}.referenceUrl\"] = samples[\"Reference\"] \n", - "inputs[f\"{prefix}.includeIntrons\"] = False\n", - "inputs[f\"{prefix}.expectCells\"] = 5000\n", - "inputs[f\"{prefix}.memory\"] = 256\n", - "inputs[f\"{prefix}.dockerRegistry\"] = common_docker_registry\n", - "\n", - "# Annotate labels\n", - "labels[\"pipelineType\"] = pipeline_type\n", - "labels[\"project\"] = samples[\"Sample_ID\"].apply(lambda x: get_project_id(x, creds[\"user\"], creds[\"password\"]))\n", - "labels[\"sample\"] = labels.index\n", - "labels[\"owner\"] = creds[\"user\"]\n", - "labels[\"destination\"] = samples['S3_Path'] + \"/\" + output_dirname\n", - "labels[\"transfer\"] = \"-\"\n", - "labels[\"comment\"] = creds[\"user\"]\n", - "\n", - "assert (std_inputs_fields == list(inputs.columns)) & (inputs.notna().values.all())\n", - "assert (std_labels_fields == list(labels.columns)) & (labels.notna().values.all())" + "## Get sample Information" ] }, { "cell_type": "code", - "execution_count": 146, + "execution_count": 25, "metadata": {}, "outputs": [ { @@ -621,67 +777,550 @@ " \n", " \n", " \n", - " CellRangerGex.sampleName\n", - " CellRangerGex.fastqName\n", - " CellRangerGex.inputFastq\n", - " CellRangerGex.referenceUrl\n", - " CellRangerGex.includeIntrons\n", - " CellRangerGex.expectCells\n", - " CellRangerGex.memory\n", - " CellRangerGex.dockerRegistry\n", + " S3_Path\n", + " Sample_ID\n", " \n", " \n", " \n", " \n", - " SU-1358_C10_T2_on_treatment\n", - " SU-1358_C10_T2_on_treatment\n", - " 3447_SU-1358_C10_T2_on_treatment_IGO...\n", - " [s3://dp-lab-data/sc-seq/Project_124...\n", - " https://cf.10xgenomics.com/supp/cell...\n", - " False\n", - " 5000\n", - " 256\n", - " quay.io/hisplan\n", + " YM-1704_Krt4eGFP\n", + " s3://dp-lab-data/collaborators/white...\n", + " 3845\n", + " \n", + " \n", + " YM-1704_Krt4TWIST\n", + " s3://dp-lab-data/collaborators/white...\n", + " 3846\n", " \n", " \n", "\n", "" ], "text/plain": [ - " CellRangerGex.sampleName \\\n", - "SU-1358_C10_T2_on_treatment SU-1358_C10_T2_on_treatment \n", - "\n", - " CellRangerGex.fastqName \\\n", - "SU-1358_C10_T2_on_treatment 3447_SU-1358_C10_T2_on_treatment_IGO... \n", - "\n", - " CellRangerGex.inputFastq \\\n", - "SU-1358_C10_T2_on_treatment [s3://dp-lab-data/sc-seq/Project_124... \n", - "\n", - " CellRangerGex.referenceUrl \\\n", - "SU-1358_C10_T2_on_treatment https://cf.10xgenomics.com/supp/cell... \n", - "\n", - " CellRangerGex.includeIntrons \\\n", - "SU-1358_C10_T2_on_treatment False \n", - "\n", - " CellRangerGex.expectCells CellRangerGex.memory \\\n", - "SU-1358_C10_T2_on_treatment 5000 256 \n", - "\n", - " CellRangerGex.dockerRegistry \n", - "SU-1358_C10_T2_on_treatment quay.io/hisplan " + " S3_Path Sample_ID\n", + "YM-1704_Krt4eGFP s3://dp-lab-data/collaborators/white... 3845\n", + "YM-1704_Krt4TWIST s3://dp-lab-data/collaborators/white... 3846" ] }, - "execution_count": 146, + "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "inputs" + "# Common query col: id, request_id, Sample\n", + "request_ids = ['YM-1704', ]\n", + "\n", + "samples = format_sample_aws(request_ids, 'request_id', creds)\n", + "samples" ] }, { "cell_type": "code", - "execution_count": 149, + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
S3_PathSample_IDReferenceassay
YM-1704_Krt4eGFPs3://dp-lab-data/collaborators/white...3845s3://dp-lab-data/collaborators/white...CR
YM-1704_Krt4TWISTs3://dp-lab-data/collaborators/white...3846s3://dp-lab-data/collaborators/white...CR
\n", + "
" + ], + "text/plain": [ + " S3_Path Sample_ID \\\n", + "YM-1704_Krt4eGFP s3://dp-lab-data/collaborators/white... 3845 \n", + "YM-1704_Krt4TWIST s3://dp-lab-data/collaborators/white... 3846 \n", + "\n", + " Reference assay \n", + "YM-1704_Krt4eGFP s3://dp-lab-data/collaborators/white... CR \n", + "YM-1704_Krt4TWIST s3://dp-lab-data/collaborators/white... CR " + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples = format_assay_barcode(samples, creds)\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
S3_PathSample_IDReferenceassayFASTQs
YM-1704_Krt4eGFPs3://dp-lab-data/collaborators/white...3845s3://dp-lab-data/collaborators/white...CR{'I1': ['s3://dp-lab-data/collaborat...
YM-1704_Krt4TWISTs3://dp-lab-data/collaborators/white...3846s3://dp-lab-data/collaborators/white...CR{'I1': ['s3://dp-lab-data/collaborat...
\n", + "
" + ], + "text/plain": [ + " S3_Path Sample_ID \\\n", + "YM-1704_Krt4eGFP s3://dp-lab-data/collaborators/white... 3845 \n", + "YM-1704_Krt4TWIST s3://dp-lab-data/collaborators/white... 3846 \n", + "\n", + " Reference assay \\\n", + "YM-1704_Krt4eGFP s3://dp-lab-data/collaborators/white... CR \n", + "YM-1704_Krt4TWIST s3://dp-lab-data/collaborators/white... CR \n", + "\n", + " FASTQs \n", + "YM-1704_Krt4eGFP {'I1': ['s3://dp-lab-data/collaborat... \n", + "YM-1704_Krt4TWIST {'I1': ['s3://dp-lab-data/collaborat... " + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Get FASTQ paths from S3\n", + "# Note: Uses same FASTQ file ids for all samples\n", + "fastq_file_ids = fastq_map[prefix]\n", + "samples[\"FASTQs\"] = samples[\"S3_Path\"].apply(lambda x: get_fastqs(x, fastq_file_ids, \"FASTQ\"))\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array(['s3://dp-lab-data/collaborators/whiter/YM-1704_transgene_reference/refdata-cellranger/',\n", + " 's3://dp-lab-data/collaborators/whiter/YM-1704_transgene_reference/refdata-cellranger/'],\n", + " dtype=object)" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples['Reference'].values" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "# Set path to transgene reference S3\n", + "# Note: This is an exceptional case\n", + "# path_to_reference = f\"{common_dir}/transgene_reference/refdata-cellranger/3PS19_SNSEQ-GRCm38-Ensembl-87-transgenes.tar.gz\"\n", + "# path_to_reference = \"https://cf.10xgenomics.com/supp/cell-exp/refdata-gex-mm10-2020-A.tar.gz\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Inputs" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
CellRangerGex.sampleNameCellRangerGex.fastqNameCellRangerGex.inputFastqCellRangerGex.referenceUrlCellRangerGex.includeIntronsCellRangerGex.expectCellsCellRangerGex.memoryCellRangerGex.dockerRegistry
YM-1704_Krt4eGFPNaNNaNNaNNaNNaNNaNNaNNaN
YM-1704_Krt4TWISTNaNNaNNaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " CellRangerGex.sampleName CellRangerGex.fastqName \\\n", + "YM-1704_Krt4eGFP NaN NaN \n", + "YM-1704_Krt4TWIST NaN NaN \n", + "\n", + " CellRangerGex.inputFastq CellRangerGex.referenceUrl \\\n", + "YM-1704_Krt4eGFP NaN NaN \n", + "YM-1704_Krt4TWIST NaN NaN \n", + "\n", + " CellRangerGex.includeIntrons CellRangerGex.expectCells \\\n", + "YM-1704_Krt4eGFP NaN NaN \n", + "YM-1704_Krt4TWIST NaN NaN \n", + "\n", + " CellRangerGex.memory CellRangerGex.dockerRegistry \n", + "YM-1704_Krt4eGFP NaN NaN \n", + "YM-1704_Krt4TWIST NaN NaN " + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Load minimum inputs and labels fields from templates\n", + "with open(f\"{config_dir}/template.inputs.json\") as f:\n", + " std_inputs_fields = list(json.load(f).keys())\n", + " \n", + "# Annotate all samples with workflow inputs and labels\n", + "inputs = pd.DataFrame(index=samples.index, columns=std_inputs_fields,)\n", + "\n", + "inputs" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
CellRangerGex.sampleNameCellRangerGex.fastqNameCellRangerGex.inputFastqCellRangerGex.referenceUrlCellRangerGex.includeIntronsCellRangerGex.expectCellsCellRangerGex.memoryCellRangerGex.dockerRegistry
YM-1704_Krt4eGFPYM-1704_Krt4eGFP3845_YM-1704_Krt4eGFP_IGO_12437_AO_37[s3://dp-lab-data/collaborators/whit...s3://dp-lab-data/collaborators/white...False5000256quay.io/hisplan
YM-1704_Krt4TWISTYM-1704_Krt4TWIST3846_YM-1704_Krt4TWIST_IGO_12437_AO_38[s3://dp-lab-data/collaborators/whit...s3://dp-lab-data/collaborators/white...False5000256quay.io/hisplan
\n", + "
" + ], + "text/plain": [ + " CellRangerGex.sampleName \\\n", + "YM-1704_Krt4eGFP YM-1704_Krt4eGFP \n", + "YM-1704_Krt4TWIST YM-1704_Krt4TWIST \n", + "\n", + " CellRangerGex.fastqName \\\n", + "YM-1704_Krt4eGFP 3845_YM-1704_Krt4eGFP_IGO_12437_AO_37 \n", + "YM-1704_Krt4TWIST 3846_YM-1704_Krt4TWIST_IGO_12437_AO_38 \n", + "\n", + " CellRangerGex.inputFastq \\\n", + "YM-1704_Krt4eGFP [s3://dp-lab-data/collaborators/whit... \n", + "YM-1704_Krt4TWIST [s3://dp-lab-data/collaborators/whit... \n", + "\n", + " CellRangerGex.referenceUrl \\\n", + "YM-1704_Krt4eGFP s3://dp-lab-data/collaborators/white... \n", + "YM-1704_Krt4TWIST s3://dp-lab-data/collaborators/white... \n", + "\n", + " CellRangerGex.includeIntrons CellRangerGex.expectCells \\\n", + "YM-1704_Krt4eGFP False 5000 \n", + "YM-1704_Krt4TWIST False 5000 \n", + "\n", + " CellRangerGex.memory CellRangerGex.dockerRegistry \n", + "YM-1704_Krt4eGFP 256 quay.io/hisplan \n", + "YM-1704_Krt4TWIST 256 quay.io/hisplan " + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Annotate inputs\n", + "inputs[f\"{prefix}.sampleName\"] = inputs.index # may need to change\n", + "inputs[f\"{prefix}.inputFastq\"] = samples[\"FASTQs\"].apply(lambda x: np.ravel(list(x.values())))\n", + "inputs[f\"{prefix}.fastqName\"] = inputs[f\"{prefix}.inputFastq\"].apply(lambda x: get_fastqs_name(x))\n", + "inputs[f\"{prefix}.referenceUrl\"] = samples[\"Reference\"] \n", + "inputs[f\"{prefix}.includeIntrons\"] = False\n", + "inputs[f\"{prefix}.expectCells\"] = 5000\n", + "inputs[f\"{prefix}.memory\"] = 256\n", + "inputs[f\"{prefix}.dockerRegistry\"] = common_docker_registry\n", + "\n", + "inputs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Labels" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
pipelineTypeprojectsampleownerdestinationtransfercomment
YM-1704_Krt4eGFPNaNNaNNaNNaNNaNNaNNaN
YM-1704_Krt4TWISTNaNNaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " pipelineType project sample owner destination transfer \\\n", + "YM-1704_Krt4eGFP NaN NaN NaN NaN NaN NaN \n", + "YM-1704_Krt4TWIST NaN NaN NaN NaN NaN NaN \n", + "\n", + " comment \n", + "YM-1704_Krt4eGFP NaN \n", + "YM-1704_Krt4TWIST NaN " + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "with open(f\"{config_dir}/template.labels.json\") as f:\n", + " std_labels_fields = list(json.load(f).keys())\n", + " \n", + "# Annotate all samples with workflow inputs and labels\n", + "labels = pd.DataFrame(index=samples.index, columns=std_labels_fields,)\n", + "labels" + ] + }, + { + "cell_type": "code", + "execution_count": 33, "metadata": {}, "outputs": [ { @@ -716,34 +1355,239 @@ " \n", " \n", " \n", - " SU-1358_C10_T2_on_treatment\n", + " YM-1704_Krt4eGFP\n", + " CellRangerGex\n", + " Zebrafish KC-MC\n", + " YM-1704_Krt4eGFP\n", + " sohailn\n", + " s3://dp-lab-data/collaborators/white...\n", + " -\n", + " sohailn\n", + " \n", + " \n", + " YM-1704_Krt4TWIST\n", " CellRangerGex\n", - " POLAR\n", - " SU-1358_C10_T2_on_treatment\n", - " moormana\n", - " s3://dp-lab-data/sc-seq/Project_1243...\n", + " Zebrafish KC-MC\n", + " YM-1704_Krt4TWIST\n", + " sohailn\n", + " s3://dp-lab-data/collaborators/white...\n", " -\n", - " moormana\n", + " sohailn\n", + " \n", + " \n", + "\n", + "" + ], + "text/plain": [ + " pipelineType project sample owner \\\n", + "YM-1704_Krt4eGFP CellRangerGex Zebrafish KC-MC YM-1704_Krt4eGFP sohailn \n", + "YM-1704_Krt4TWIST CellRangerGex Zebrafish KC-MC YM-1704_Krt4TWIST sohailn \n", + "\n", + " destination transfer comment \n", + "YM-1704_Krt4eGFP s3://dp-lab-data/collaborators/white... - sohailn \n", + "YM-1704_Krt4TWIST s3://dp-lab-data/collaborators/white... - sohailn " + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "labels[\"pipelineType\"] = pipeline_type\n", + "labels[\"project\"] = samples[\"Sample_ID\"].apply(lambda x: get_project_id(x, creds))\n", + "labels[\"sample\"] = labels.index\n", + "labels[\"owner\"] = creds[\"user\"]\n", + "labels[\"destination\"] = samples['S3_Path'] + \"/\" + output_dirname\n", + "labels[\"transfer\"] = \"-\"\n", + "labels[\"comment\"] = creds[\"user\"]\n", + "\n", + "labels" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Execution" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
CellRangerGex.sampleNameCellRangerGex.fastqNameCellRangerGex.inputFastqCellRangerGex.referenceUrlCellRangerGex.includeIntronsCellRangerGex.expectCellsCellRangerGex.memoryCellRangerGex.dockerRegistry
YM-1704_Krt4eGFPYM-1704_Krt4eGFP3845_YM-1704_Krt4eGFP_IGO_12437_AO_37[s3://dp-lab-data/collaborators/whit...s3://dp-lab-data/collaborators/white...False5000256quay.io/hisplan
YM-1704_Krt4TWISTYM-1704_Krt4TWIST3846_YM-1704_Krt4TWIST_IGO_12437_AO_38[s3://dp-lab-data/collaborators/whit...s3://dp-lab-data/collaborators/white...False5000256quay.io/hisplan
\n", "
" ], "text/plain": [ - " pipelineType project \\\n", - "SU-1358_C10_T2_on_treatment CellRangerGex POLAR \n", + " CellRangerGex.sampleName \\\n", + "YM-1704_Krt4eGFP YM-1704_Krt4eGFP \n", + "YM-1704_Krt4TWIST YM-1704_Krt4TWIST \n", + "\n", + " CellRangerGex.fastqName \\\n", + "YM-1704_Krt4eGFP 3845_YM-1704_Krt4eGFP_IGO_12437_AO_37 \n", + "YM-1704_Krt4TWIST 3846_YM-1704_Krt4TWIST_IGO_12437_AO_38 \n", + "\n", + " CellRangerGex.inputFastq \\\n", + "YM-1704_Krt4eGFP [s3://dp-lab-data/collaborators/whit... \n", + "YM-1704_Krt4TWIST [s3://dp-lab-data/collaborators/whit... \n", + "\n", + " CellRangerGex.referenceUrl \\\n", + "YM-1704_Krt4eGFP s3://dp-lab-data/collaborators/white... \n", + "YM-1704_Krt4TWIST s3://dp-lab-data/collaborators/white... \n", + "\n", + " CellRangerGex.includeIntrons CellRangerGex.expectCells \\\n", + "YM-1704_Krt4eGFP False 5000 \n", + "YM-1704_Krt4TWIST False 5000 \n", + "\n", + " CellRangerGex.memory CellRangerGex.dockerRegistry \n", + "YM-1704_Krt4eGFP 256 quay.io/hisplan \n", + "YM-1704_Krt4TWIST 256 quay.io/hisplan " + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "inputs" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
pipelineTypeprojectsampleownerdestinationtransfercomment
YM-1704_Krt4eGFPCellRangerGexZebrafish KC-MCYM-1704_Krt4eGFPsohailns3://dp-lab-data/collaborators/white...-sohailn
YM-1704_Krt4TWISTCellRangerGexZebrafish KC-MCYM-1704_Krt4TWISTsohailns3://dp-lab-data/collaborators/white...-sohailn
\n", + "
" + ], + "text/plain": [ + " pipelineType project sample owner \\\n", + "YM-1704_Krt4eGFP CellRangerGex Zebrafish KC-MC YM-1704_Krt4eGFP sohailn \n", + "YM-1704_Krt4TWIST CellRangerGex Zebrafish KC-MC YM-1704_Krt4TWIST sohailn \n", "\n", - " comment \n", - "SU-1358_C10_T2_on_treatment moormana " + " destination transfer comment \n", + "YM-1704_Krt4eGFP s3://dp-lab-data/collaborators/white... - sohailn \n", + "YM-1704_Krt4TWIST s3://dp-lab-data/collaborators/white... - sohailn " ] }, - "execution_count": 149, + "execution_count": 35, "metadata": {}, "output_type": "execute_result" } @@ -754,20 +1598,18 @@ }, { "cell_type": "code", - "execution_count": 150, - "metadata": { - "tags": [] - }, + "execution_count": 36, + "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "c261084afa9f437daabaecb8054fea46", + "model_id": "f962aaaf40e844d7af60fae27922c2cc", "version_major": 2, "version_minor": 0 }, "text/plain": [ - " 0%| | 0/1 [00:00 Date: Tue, 7 Jun 2022 14:44:10 -0400 Subject: [PATCH 04/16] auto search for whitelist --- notebooks/Run_MitoTracing.ipynb | 1392 ++++++++++++++++++++++--------- 1 file changed, 1005 insertions(+), 387 deletions(-) diff --git a/notebooks/Run_MitoTracing.ipynb b/notebooks/Run_MitoTracing.ipynb index 9884cfc..f4ecf05 100644 --- a/notebooks/Run_MitoTracing.ipynb +++ b/notebooks/Run_MitoTracing.ipynb @@ -144,6 +144,52 @@ "outputs": [], "source": [] }, + { + "cell_type": "markdown", + "id": "9773e79d-dfd6-4b33-9bd8-05781df1f038", + "metadata": { + "jp-MarkdownHeadingCollapsed": true, + "tags": [] + }, + "source": [ + "## Get whitelist" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "0b6e2570-8fae-4100-8741-ce5c8988ba64", + "metadata": {}, + "outputs": [], + "source": [ + "# Get fastq file paths on S3 for each file id\n", + "# Returns dictionary from id to s3 path\n", + "# Throws exception if FASTQs don't exist for any id\n", + "def get_whitelist(\n", + " path: str, # path to directory containing FASTQ files\n", + "):\n", + " _, bucket, key, _, _ = urllib.parse.urlsplit(path)\n", + " whitelist = get_s3_objects(\n", + " bucket, key.lstrip(\"/\"),\n", + " re.compile(f\".txt$\")\n", + " )\n", + " whitelist = whitelist[0]\n", + " try:\n", + " whitelist = os.path.join(\"s3://\", bucket, whitelist)\n", + " except AssertionError as err:\n", + " logging.warning(\"%s\\n\\t %s\", err, path)\n", + " return\n", + " return whitelist" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "73b4978d-827f-45b7-8c39-ef8e5ecdb57a", + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "markdown", "id": "5543869f-37e4-4d3b-a8d6-877973abb6ee", @@ -157,7 +203,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "id": "3ca3bfa5-69fd-4d5f-9d45-3d5ac61c76c8", "metadata": {}, "outputs": [], @@ -247,7 +293,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "id": "25c817f6-9a33-4fcf-84b8-1d4ebbcb66ad", "metadata": {}, "outputs": [], @@ -386,7 +432,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "id": "eb122238-79ee-4ecb-90d1-b2ea32e2b74d", "metadata": {}, "outputs": [], @@ -434,7 +480,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "id": "e1c96c14-0cf1-4ab2-9beb-417bc02f1154", "metadata": {}, "outputs": [], @@ -452,7 +498,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 12, "id": "8ae3c158-3666-426f-94be-f9165e30c82a", "metadata": {}, "outputs": [], @@ -466,12 +512,12 @@ "template_prefix = 'template'\n", "\n", "# If need to add comment, put here\n", - "comment = \"sohailn\"" + "comment = \"\"" ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 13, "id": "61658425-6370-44c2-92c2-a3a977345bd6", "metadata": {}, "outputs": [], @@ -489,7 +535,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 14, "id": "bb4d448a-5310-4b63-a073-66cf094e4467", "metadata": {}, "outputs": [], @@ -507,6 +553,67 @@ "outputs": [], "source": [] }, + { + "cell_type": "code", + "execution_count": 15, + "id": "7c4de0dd-3c84-48b0-8e38-38b83d2abef8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "env: AWS_ACCESS_KEY_ID=ASIAYPY66CWMEJKK4YFV\n", + "env: AWS_SECRET_ACCESS_KEY=oO0/tFrAqh8tAfzGU8mtLq+BmIAoyrRWuEO4L8zh\n", + "env: AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEN///////////wEaCXVzLWVhc3QtMSJHMEUCIDHc9iEKNRxhk+aEBbFXL5atlgE2TaVcIoBC90++y1vbAiEA2EP69firZKK1A1TMK5Urs0TeJxOi+Kg6aTorsUGWwswq+AEI2P//////////ARADGgw1ODM2NDM1Njc1MTIiDKfaop6ZajoVlsLYdSrMAWnUjUOcAGuE5oLwQ5G++xzTfNJw4lU1awlQ/GlbTj7CZlaUh47IayOmliV/QM1OeTAkVI+tKMnfnIUYP+gjW/EMl4S1tjFmccaODbnWuKMGf60P72iolq5ZHaOwZAG7c0aaS/CuEEw228M+Ts5yhTHp3bZTFETfkwOQgwxufcmFLu253DHBDSIMl2BghW1sHtV8HVz+qxg6tOrM93w62Wz6OXIsa2Ay7GD5PeycLy0FGSuADjwtswu+MBr8AonWK/CDBEGgoXy2QgCh2DCDyP2UBjqYARC84xVlD9jF+COH/3HvBQUFIUYeN+tvQQn8yvoxpfMlPgT72nFxVOD98JgpWe3NVuZCIzn9COjFHDN5azPmRTKSpH52aWu96LYGZNEzqKzO0rqBMQHdue4jVkHbaMjAPwhjqLw/3fa8N+4ljezvXM6f+7z4VGDIigx/tKS/3BBsfrPMKCHmgGVNg9M4DtCM5Ho66BL2hZgA\n" + ] + } + ], + "source": [ + "%env AWS_ACCESS_KEY_ID=ASIAYPY66CWMEJKK4YFV\n", + "%env AWS_SECRET_ACCESS_KEY=oO0/tFrAqh8tAfzGU8mtLq+BmIAoyrRWuEO4L8zh\n", + "%env AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEN///////////wEaCXVzLWVhc3QtMSJHMEUCIDHc9iEKNRxhk+aEBbFXL5atlgE2TaVcIoBC90++y1vbAiEA2EP69firZKK1A1TMK5Urs0TeJxOi+Kg6aTorsUGWwswq+AEI2P//////////ARADGgw1ODM2NDM1Njc1MTIiDKfaop6ZajoVlsLYdSrMAWnUjUOcAGuE5oLwQ5G++xzTfNJw4lU1awlQ/GlbTj7CZlaUh47IayOmliV/QM1OeTAkVI+tKMnfnIUYP+gjW/EMl4S1tjFmccaODbnWuKMGf60P72iolq5ZHaOwZAG7c0aaS/CuEEw228M+Ts5yhTHp3bZTFETfkwOQgwxufcmFLu253DHBDSIMl2BghW1sHtV8HVz+qxg6tOrM93w62Wz6OXIsa2Ay7GD5PeycLy0FGSuADjwtswu+MBr8AonWK/CDBEGgoXy2QgCh2DCDyP2UBjqYARC84xVlD9jF+COH/3HvBQUFIUYeN+tvQQn8yvoxpfMlPgT72nFxVOD98JgpWe3NVuZCIzn9COjFHDN5azPmRTKSpH52aWu96LYGZNEzqKzO0rqBMQHdue4jVkHbaMjAPwhjqLw/3fa8N+4ljezvXM6f+7z4VGDIigx/tKS/3BBsfrPMKCHmgGVNg9M4DtCM5Ho66BL2hZgA" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "40c906ae-dfc5-4415-8011-05d59cc6e216", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2021-10-07 15:31:32 agc-583643567512-us-east-1\n", + "2021-10-07 15:28:07 cdktoolkit-stagingbucket-d49u1xfb0sc4\n", + "2019-10-09 13:04:06 cf-templates-umiwbnq3566w-us-east-1\n", + "2019-10-10 12:46:54 dp-daily-reports\n", + "2017-09-26 10:15:15 dp-lab-data\n", + "2019-05-23 12:34:58 dp-lab-data-public\n", + "2018-03-01 13:29:07 dp-lab-glacier\n", + "2020-11-06 23:02:27 dp-lab-gwf-core\n", + "2021-07-15 18:14:01 dp-lab-gwf-core2\n", + "2017-09-26 10:17:18 dp-lab-home\n", + "2019-08-14 16:42:43 dp-lab-test\n", + "2019-04-25 12:35:35 elasticbeanstalk-us-east-1-583643567512\n", + "2019-12-13 15:53:57 scri-computational\n", + "2017-09-26 10:23:50 seqc-public\n" + ] + } + ], + "source": [ + "!aws s3 ls" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b0f6c614-d304-433c-a318-81182ba675b1", + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "markdown", "id": "2b28002d-85c9-4b9b-b0fc-5b86948c245c", @@ -527,7 +634,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 17, "id": "2149bf16-9464-4654-bafd-a5b409f15321", "metadata": {}, "outputs": [ @@ -558,39 +665,57 @@ " \n", " \n", " \n", - " Ru581b_T1_MITO\n", + " RA19_10_13_FACs_MITO\n", " s3://dp-lab-data/SCRI_Projects/HTA/M...\n", - " 3005\n", + " 3008\n", " \n", " \n", - " Ru581c-LN1_MITO\n", + " RA19_10_14_FACs_MITO\n", " s3://dp-lab-data/SCRI_Projects/HTA/M...\n", - " 3006\n", + " 3009\n", " \n", " \n", - " Ru581D_MITO\n", + " RA19_10_17_FACs_MITO\n", " s3://dp-lab-data/SCRI_Projects/HTA/M...\n", - " 3007\n", + " 3010\n", + " \n", + " \n", + " RA19_10_18_FACs_MITO\n", + " s3://dp-lab-data/SCRI_Projects/HTA/M...\n", + " 3011\n", + " \n", + " \n", + " RA19_10_23_FACs_MITO\n", + " s3://dp-lab-data/SCRI_Projects/HTA/M...\n", + " 3012\n", + " \n", + " \n", + " RA19_10_14_FACS_citric_MITO\n", + " s3://dp-lab-data/SCRI_Projects/HTA/M...\n", + " 3013\n", " \n", " \n", "\n", "" ], "text/plain": [ - " S3_path Sample_ID\n", - "Ru581b_T1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3005\n", - "Ru581c-LN1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3006\n", - "Ru581D_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3007" + " S3_path Sample_ID\n", + "RA19_10_13_FACs_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3008\n", + "RA19_10_14_FACs_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3009\n", + "RA19_10_17_FACs_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3010\n", + "RA19_10_18_FACs_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3011\n", + "RA19_10_23_FACs_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3012\n", + "RA19_10_14_FACS_citric_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3013" ] }, - "execution_count": 16, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Common query col: id, request_id, Sample\n", - "request_ids = ['BM-1194', ]\n", + "request_ids = ['BM-1244', ]\n", "\n", "samples = format_sample_aws(request_ids, 'request_id', creds)\n", "samples" @@ -598,8 +723,8 @@ }, { "cell_type": "code", - "execution_count": 17, - "id": "40640f5a-1e75-4947-98ba-05aec427e5e0", + "execution_count": 18, + "id": "359fbd22-702d-4763-85c2-0410b0611bb6", "metadata": {}, "outputs": [ { @@ -625,52 +750,96 @@ " \n", " S3_path\n", " Sample_ID\n", + " index\n", + " assay\n", + " barcode\n", " \n", " \n", " \n", " \n", - " Ru581b_T1_MITO\n", + " RA19_10_13_FACs_MITO\n", + " s3://dp-lab-data/SCRI_Projects/HTA/M...\n", + " 3008\n", + " GRCh38-3.0.0\n", + " CR\n", + " NaN\n", + " \n", + " \n", + " RA19_10_14_FACs_MITO\n", + " s3://dp-lab-data/SCRI_Projects/HTA/M...\n", + " 3009\n", + " GRCh38-3.0.0\n", + " CR\n", + " NaN\n", + " \n", + " \n", + " RA19_10_17_FACs_MITO\n", " s3://dp-lab-data/SCRI_Projects/HTA/M...\n", - " 3005\n", + " 3010\n", + " GRCh38-3.0.0\n", + " CR\n", + " NaN\n", " \n", " \n", - " Ru581c-LN1_MITO\n", + " RA19_10_18_FACs_MITO\n", " s3://dp-lab-data/SCRI_Projects/HTA/M...\n", - " 3006\n", + " 3011\n", + " GRCh38-3.0.0\n", + " CR\n", + " NaN\n", " \n", " \n", - " Ru581D_MITO\n", + " RA19_10_23_FACs_MITO\n", " s3://dp-lab-data/SCRI_Projects/HTA/M...\n", - " 3007\n", + " 3012\n", + " GRCh38-3.0.0\n", + " CR\n", + " NaN\n", + " \n", + " \n", + " RA19_10_14_FACS_citric_MITO\n", + " s3://dp-lab-data/SCRI_Projects/HTA/M...\n", + " 3013\n", + " GRCh38-3.0.0\n", + " CR\n", + " NaN\n", " \n", " \n", "\n", "" ], "text/plain": [ - " S3_path Sample_ID\n", - "Ru581b_T1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3005\n", - "Ru581c-LN1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3006\n", - "Ru581D_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3007" + " S3_path \\\n", + "RA19_10_13_FACs_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "RA19_10_14_FACs_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "RA19_10_17_FACs_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "RA19_10_18_FACs_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "RA19_10_23_FACs_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "RA19_10_14_FACS_citric_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "\n", + " Sample_ID index assay barcode \n", + "RA19_10_13_FACs_MITO 3008 GRCh38-3.0.0 CR NaN \n", + "RA19_10_14_FACs_MITO 3009 GRCh38-3.0.0 CR NaN \n", + "RA19_10_17_FACs_MITO 3010 GRCh38-3.0.0 CR NaN \n", + "RA19_10_18_FACs_MITO 3011 GRCh38-3.0.0 CR NaN \n", + "RA19_10_23_FACs_MITO 3012 GRCh38-3.0.0 CR NaN \n", + "RA19_10_14_FACS_citric_MITO 3013 GRCh38-3.0.0 CR NaN " ] }, - "execution_count": 17, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "# Modification for Joe's samples\n", - "samples.loc['Ru581b_T1_MITO', 'S3_path'] = 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/barcodes_rna/Ru581b_T1_MITO'\n", - "samples.loc['Ru581c-LN1_MITO', 'S3_path'] = 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/barcodes_rna/Ru581c-LN1_MITO'\n", - "\n", + "samples = format_assay_barcode(samples, creds)\n", "samples" ] }, { "cell_type": "code", - "execution_count": 18, - "id": "359fbd22-702d-4763-85c2-0410b0611bb6", + "execution_count": 19, + "id": "a14b9418-dab4-4aaf-8abb-14f9e0534152", "metadata": {}, "outputs": [ { @@ -699,63 +868,108 @@ " index\n", " assay\n", " barcode\n", + " fastq\n", " \n", " \n", " \n", " \n", - " Ru581b_T1_MITO\n", + " RA19_10_13_FACs_MITO\n", " s3://dp-lab-data/SCRI_Projects/HTA/M...\n", - " 3005\n", + " 3008\n", " GRCh38-3.0.0\n", " CR\n", " NaN\n", + " {'R1': ['s3://dp-lab-data/SCRI_Proje...\n", " \n", " \n", - " Ru581c-LN1_MITO\n", + " RA19_10_14_FACs_MITO\n", " s3://dp-lab-data/SCRI_Projects/HTA/M...\n", - " 3006\n", + " 3009\n", " GRCh38-3.0.0\n", " CR\n", " NaN\n", + " {'R1': ['s3://dp-lab-data/SCRI_Proje...\n", " \n", " \n", - " Ru581D_MITO\n", + " RA19_10_17_FACs_MITO\n", " s3://dp-lab-data/SCRI_Projects/HTA/M...\n", - " 3007\n", + " 3010\n", " GRCh38-3.0.0\n", " CR\n", " NaN\n", + " {'R1': ['s3://dp-lab-data/SCRI_Proje...\n", + " \n", + " \n", + " RA19_10_18_FACs_MITO\n", + " s3://dp-lab-data/SCRI_Projects/HTA/M...\n", + " 3011\n", + " GRCh38-3.0.0\n", + " CR\n", + " NaN\n", + " {'R1': ['s3://dp-lab-data/SCRI_Proje...\n", + " \n", + " \n", + " RA19_10_23_FACs_MITO\n", + " s3://dp-lab-data/SCRI_Projects/HTA/M...\n", + " 3012\n", + " GRCh38-3.0.0\n", + " CR\n", + " NaN\n", + " {'R1': ['s3://dp-lab-data/SCRI_Proje...\n", + " \n", + " \n", + " RA19_10_14_FACS_citric_MITO\n", + " s3://dp-lab-data/SCRI_Projects/HTA/M...\n", + " 3013\n", + " GRCh38-3.0.0\n", + " CR\n", + " NaN\n", + " {'R1': ['s3://dp-lab-data/SCRI_Proje...\n", " \n", " \n", "\n", "" ], "text/plain": [ - " S3_path Sample_ID \\\n", - "Ru581b_T1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3005 \n", - "Ru581c-LN1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3006 \n", - "Ru581D_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3007 \n", - "\n", - " index assay barcode \n", - "Ru581b_T1_MITO GRCh38-3.0.0 CR NaN \n", - "Ru581c-LN1_MITO GRCh38-3.0.0 CR NaN \n", - "Ru581D_MITO GRCh38-3.0.0 CR NaN " + " S3_path \\\n", + "RA19_10_13_FACs_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "RA19_10_14_FACs_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "RA19_10_17_FACs_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "RA19_10_18_FACs_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "RA19_10_23_FACs_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "RA19_10_14_FACS_citric_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "\n", + " Sample_ID index assay barcode \\\n", + "RA19_10_13_FACs_MITO 3008 GRCh38-3.0.0 CR NaN \n", + "RA19_10_14_FACs_MITO 3009 GRCh38-3.0.0 CR NaN \n", + "RA19_10_17_FACs_MITO 3010 GRCh38-3.0.0 CR NaN \n", + "RA19_10_18_FACs_MITO 3011 GRCh38-3.0.0 CR NaN \n", + "RA19_10_23_FACs_MITO 3012 GRCh38-3.0.0 CR NaN \n", + "RA19_10_14_FACS_citric_MITO 3013 GRCh38-3.0.0 CR NaN \n", + "\n", + " fastq \n", + "RA19_10_13_FACs_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "RA19_10_14_FACs_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "RA19_10_17_FACs_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "RA19_10_18_FACs_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "RA19_10_23_FACs_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "RA19_10_14_FACS_citric_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... " ] }, - "execution_count": 18, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "samples = format_assay_barcode(samples, creds)\n", + "samples = get_barcode_genomic_fastqs(samples)\n", "samples" ] }, { "cell_type": "code", - "execution_count": 19, - "id": "a14b9418-dab4-4aaf-8abb-14f9e0534152", + "execution_count": 20, + "id": "7fd5ce73-8d7f-4d23-9784-4774c7da80a8", "metadata": {}, "outputs": [ { @@ -789,27 +1003,45 @@ " \n", " \n", " \n", - " Ru581b_T1_MITO\n", + " RA19_10_14_FACs_MITO\n", " s3://dp-lab-data/SCRI_Projects/HTA/M...\n", - " 3005\n", + " 3009\n", " GRCh38-3.0.0\n", " CR\n", " NaN\n", " {'R1': ['s3://dp-lab-data/SCRI_Proje...\n", " \n", " \n", - " Ru581c-LN1_MITO\n", + " RA19_10_17_FACs_MITO\n", " s3://dp-lab-data/SCRI_Projects/HTA/M...\n", - " 3006\n", + " 3010\n", " GRCh38-3.0.0\n", " CR\n", " NaN\n", " {'R1': ['s3://dp-lab-data/SCRI_Proje...\n", " \n", " \n", - " Ru581D_MITO\n", + " RA19_10_18_FACs_MITO\n", " s3://dp-lab-data/SCRI_Projects/HTA/M...\n", - " 3007\n", + " 3011\n", + " GRCh38-3.0.0\n", + " CR\n", + " NaN\n", + " {'R1': ['s3://dp-lab-data/SCRI_Proje...\n", + " \n", + " \n", + " RA19_10_23_FACs_MITO\n", + " s3://dp-lab-data/SCRI_Projects/HTA/M...\n", + " 3012\n", + " GRCh38-3.0.0\n", + " CR\n", + " NaN\n", + " {'R1': ['s3://dp-lab-data/SCRI_Proje...\n", + " \n", + " \n", + " RA19_10_14_FACS_citric_MITO\n", + " s3://dp-lab-data/SCRI_Projects/HTA/M...\n", + " 3013\n", " GRCh38-3.0.0\n", " CR\n", " NaN\n", @@ -820,29 +1052,36 @@ "" ], "text/plain": [ - " S3_path Sample_ID \\\n", - "Ru581b_T1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3005 \n", - "Ru581c-LN1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3006 \n", - "Ru581D_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3007 \n", - "\n", - " index assay barcode \\\n", - "Ru581b_T1_MITO GRCh38-3.0.0 CR NaN \n", - "Ru581c-LN1_MITO GRCh38-3.0.0 CR NaN \n", - "Ru581D_MITO GRCh38-3.0.0 CR NaN \n", - "\n", - " fastq \n", - "Ru581b_T1_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", - "Ru581c-LN1_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", - "Ru581D_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... " + " S3_path \\\n", + "RA19_10_14_FACs_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "RA19_10_17_FACs_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "RA19_10_18_FACs_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "RA19_10_23_FACs_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "RA19_10_14_FACS_citric_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "\n", + " Sample_ID index assay barcode \\\n", + "RA19_10_14_FACs_MITO 3009 GRCh38-3.0.0 CR NaN \n", + "RA19_10_17_FACs_MITO 3010 GRCh38-3.0.0 CR NaN \n", + "RA19_10_18_FACs_MITO 3011 GRCh38-3.0.0 CR NaN \n", + "RA19_10_23_FACs_MITO 3012 GRCh38-3.0.0 CR NaN \n", + "RA19_10_14_FACS_citric_MITO 3013 GRCh38-3.0.0 CR NaN \n", + "\n", + " fastq \n", + "RA19_10_14_FACs_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "RA19_10_17_FACs_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "RA19_10_18_FACs_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "RA19_10_23_FACs_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "RA19_10_14_FACS_citric_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... " ] }, - "execution_count": 19, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "samples = get_barcode_genomic_fastqs(samples)\n", + "# This sample has already been processed\n", + "samples = samples[samples.index != 'RA19_10_13_FACs_MITO']\n", "samples" ] }, @@ -866,7 +1105,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 21, "id": "ce68536f-7029-4689-83a7-239421284398", "metadata": {}, "outputs": [ @@ -906,7 +1145,35 @@ " \n", " \n", " \n", - " Ru581b_T1_MITO\n", + " RA19_10_14_FACs_MITO\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " \n", + " \n", + " RA19_10_17_FACs_MITO\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " \n", + " \n", + " RA19_10_18_FACs_MITO\n", " NaN\n", " NaN\n", " NaN\n", @@ -920,7 +1187,7 @@ " NaN\n", " \n", " \n", - " Ru581c-LN1_MITO\n", + " RA19_10_23_FACs_MITO\n", " NaN\n", " NaN\n", " NaN\n", @@ -934,7 +1201,7 @@ " NaN\n", " \n", " \n", - " Ru581D_MITO\n", + " RA19_10_14_FACS_citric_MITO\n", " NaN\n", " NaN\n", " NaN\n", @@ -952,33 +1219,50 @@ "" ], "text/plain": [ - " MitoTracing.sampleName MitoTracing.fastqName \\\n", - "Ru581b_T1_MITO NaN NaN \n", - "Ru581c-LN1_MITO NaN NaN \n", - "Ru581D_MITO NaN NaN \n", - "\n", - " MitoTracing.fastqR1 MitoTracing.fastqR2 MitoTracing.reference \\\n", - "Ru581b_T1_MITO NaN NaN NaN \n", - "Ru581c-LN1_MITO NaN NaN NaN \n", - "Ru581D_MITO NaN NaN NaN \n", - "\n", - " MitoTracing.includeIntrons MitoTracing.expectCells \\\n", - "Ru581b_T1_MITO NaN NaN \n", - "Ru581c-LN1_MITO NaN NaN \n", - "Ru581D_MITO NaN NaN \n", - "\n", - " MitoTracing.numCores MitoTracing.memory MitoTracing.whitelist \\\n", - "Ru581b_T1_MITO NaN NaN NaN \n", - "Ru581c-LN1_MITO NaN NaN NaN \n", - "Ru581D_MITO NaN NaN NaN \n", - "\n", - " MitoTracing.dockerRegistry \n", - "Ru581b_T1_MITO NaN \n", - "Ru581c-LN1_MITO NaN \n", - "Ru581D_MITO NaN " + " MitoTracing.sampleName MitoTracing.fastqName \\\n", + "RA19_10_14_FACs_MITO NaN NaN \n", + "RA19_10_17_FACs_MITO NaN NaN \n", + "RA19_10_18_FACs_MITO NaN NaN \n", + "RA19_10_23_FACs_MITO NaN NaN \n", + "RA19_10_14_FACS_citric_MITO NaN NaN \n", + "\n", + " MitoTracing.fastqR1 MitoTracing.fastqR2 \\\n", + "RA19_10_14_FACs_MITO NaN NaN \n", + "RA19_10_17_FACs_MITO NaN NaN \n", + "RA19_10_18_FACs_MITO NaN NaN \n", + "RA19_10_23_FACs_MITO NaN NaN \n", + "RA19_10_14_FACS_citric_MITO NaN NaN \n", + "\n", + " MitoTracing.reference MitoTracing.includeIntrons \\\n", + "RA19_10_14_FACs_MITO NaN NaN \n", + "RA19_10_17_FACs_MITO NaN NaN \n", + "RA19_10_18_FACs_MITO NaN NaN \n", + "RA19_10_23_FACs_MITO NaN NaN \n", + "RA19_10_14_FACS_citric_MITO NaN NaN \n", + "\n", + " MitoTracing.expectCells MitoTracing.numCores \\\n", + "RA19_10_14_FACs_MITO NaN NaN \n", + "RA19_10_17_FACs_MITO NaN NaN \n", + "RA19_10_18_FACs_MITO NaN NaN \n", + "RA19_10_23_FACs_MITO NaN NaN \n", + "RA19_10_14_FACS_citric_MITO NaN NaN \n", + "\n", + " MitoTracing.memory MitoTracing.whitelist \\\n", + "RA19_10_14_FACs_MITO NaN NaN \n", + "RA19_10_17_FACs_MITO NaN NaN \n", + "RA19_10_18_FACs_MITO NaN NaN \n", + "RA19_10_23_FACs_MITO NaN NaN \n", + "RA19_10_14_FACS_citric_MITO NaN NaN \n", + "\n", + " MitoTracing.dockerRegistry \n", + "RA19_10_14_FACs_MITO NaN \n", + "RA19_10_17_FACs_MITO NaN \n", + "RA19_10_18_FACs_MITO NaN \n", + "RA19_10_23_FACs_MITO NaN \n", + "RA19_10_14_FACS_citric_MITO NaN " ] }, - "execution_count": 20, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } @@ -995,7 +1279,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 22, "id": "bd8a0e97-49ad-4295-a4ff-ca83e90732c8", "metadata": {}, "outputs": [ @@ -1035,7 +1319,35 @@ " \n", " \n", " \n", - " Ru581b_T1_MITO\n", + " RA19_10_14_FACs_MITO\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " False\n", + " 5000\n", + " 16\n", + " 128\n", + " NaN\n", + " quay.io/hisplan\n", + " \n", + " \n", + " RA19_10_17_FACs_MITO\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " False\n", + " 5000\n", + " 16\n", + " 128\n", + " NaN\n", + " quay.io/hisplan\n", + " \n", + " \n", + " RA19_10_18_FACs_MITO\n", " NaN\n", " NaN\n", " NaN\n", @@ -1049,7 +1361,7 @@ " quay.io/hisplan\n", " \n", " \n", - " Ru581c-LN1_MITO\n", + " RA19_10_23_FACs_MITO\n", " NaN\n", " NaN\n", " NaN\n", @@ -1063,7 +1375,7 @@ " quay.io/hisplan\n", " \n", " \n", - " Ru581D_MITO\n", + " RA19_10_14_FACS_citric_MITO\n", " NaN\n", " NaN\n", " NaN\n", @@ -1081,33 +1393,50 @@ "" ], "text/plain": [ - " MitoTracing.sampleName MitoTracing.fastqName \\\n", - "Ru581b_T1_MITO NaN NaN \n", - "Ru581c-LN1_MITO NaN NaN \n", - "Ru581D_MITO NaN NaN \n", - "\n", - " MitoTracing.fastqR1 MitoTracing.fastqR2 MitoTracing.reference \\\n", - "Ru581b_T1_MITO NaN NaN NaN \n", - "Ru581c-LN1_MITO NaN NaN NaN \n", - "Ru581D_MITO NaN NaN NaN \n", - "\n", - " MitoTracing.includeIntrons MitoTracing.expectCells \\\n", - "Ru581b_T1_MITO False 5000 \n", - "Ru581c-LN1_MITO False 5000 \n", - "Ru581D_MITO False 5000 \n", - "\n", - " MitoTracing.numCores MitoTracing.memory \\\n", - "Ru581b_T1_MITO 16 128 \n", - "Ru581c-LN1_MITO 16 128 \n", - "Ru581D_MITO 16 128 \n", - "\n", - " MitoTracing.whitelist MitoTracing.dockerRegistry \n", - "Ru581b_T1_MITO NaN quay.io/hisplan \n", - "Ru581c-LN1_MITO NaN quay.io/hisplan \n", - "Ru581D_MITO NaN quay.io/hisplan " + " MitoTracing.sampleName MitoTracing.fastqName \\\n", + "RA19_10_14_FACs_MITO NaN NaN \n", + "RA19_10_17_FACs_MITO NaN NaN \n", + "RA19_10_18_FACs_MITO NaN NaN \n", + "RA19_10_23_FACs_MITO NaN NaN \n", + "RA19_10_14_FACS_citric_MITO NaN NaN \n", + "\n", + " MitoTracing.fastqR1 MitoTracing.fastqR2 \\\n", + "RA19_10_14_FACs_MITO NaN NaN \n", + "RA19_10_17_FACs_MITO NaN NaN \n", + "RA19_10_18_FACs_MITO NaN NaN \n", + "RA19_10_23_FACs_MITO NaN NaN \n", + "RA19_10_14_FACS_citric_MITO NaN NaN \n", + "\n", + " MitoTracing.reference MitoTracing.includeIntrons \\\n", + "RA19_10_14_FACs_MITO NaN False \n", + "RA19_10_17_FACs_MITO NaN False \n", + "RA19_10_18_FACs_MITO NaN False \n", + "RA19_10_23_FACs_MITO NaN False \n", + "RA19_10_14_FACS_citric_MITO NaN False \n", + "\n", + " MitoTracing.expectCells MitoTracing.numCores \\\n", + "RA19_10_14_FACs_MITO 5000 16 \n", + "RA19_10_17_FACs_MITO 5000 16 \n", + "RA19_10_18_FACs_MITO 5000 16 \n", + "RA19_10_23_FACs_MITO 5000 16 \n", + "RA19_10_14_FACS_citric_MITO 5000 16 \n", + "\n", + " MitoTracing.memory MitoTracing.whitelist \\\n", + "RA19_10_14_FACs_MITO 128 NaN \n", + "RA19_10_17_FACs_MITO 128 NaN \n", + "RA19_10_18_FACs_MITO 128 NaN \n", + "RA19_10_23_FACs_MITO 128 NaN \n", + "RA19_10_14_FACS_citric_MITO 128 NaN \n", + "\n", + " MitoTracing.dockerRegistry \n", + "RA19_10_14_FACs_MITO quay.io/hisplan \n", + "RA19_10_17_FACs_MITO quay.io/hisplan \n", + "RA19_10_18_FACs_MITO quay.io/hisplan \n", + "RA19_10_23_FACs_MITO quay.io/hisplan \n", + "RA19_10_14_FACS_citric_MITO quay.io/hisplan " ] }, - "execution_count": 21, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" } @@ -1126,7 +1455,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 23, "id": "db50eb55-40dc-4840-bc61-63525c2afb2b", "metadata": {}, "outputs": [ @@ -1166,9 +1495,9 @@ " \n", " \n", " \n", - " Ru581b_T1_MITO\n", - " Ru581b_T1_MITO\n", - " 3005_Ru581b_T1_MITO_IGO_12411_1\n", + " RA19_10_14_FACs_MITO\n", + " RA19_10_14_FACs_MITO\n", + " 3009_RA19_10_14_FACs_MITO_IGO_12411_5\n", " [s3://dp-lab-data/SCRI_Projects/HTA/...\n", " [s3://dp-lab-data/SCRI_Projects/HTA/...\n", " NaN\n", @@ -1176,13 +1505,13 @@ " 5000\n", " 16\n", " 128\n", - " NaN\n", + " s3://dp-lab-data/SCRI_Projects/HTA/M...\n", " quay.io/hisplan\n", " \n", " \n", - " Ru581c-LN1_MITO\n", - " Ru581c-LN1_MITO\n", - " 3006_Ru581c-LN1_MITO_IGO_12411_2\n", + " RA19_10_17_FACs_MITO\n", + " RA19_10_17_FACs_MITO\n", + " 3010_RA19_10_17_FACs_MITO_IGO_12411_6\n", " [s3://dp-lab-data/SCRI_Projects/HTA/...\n", " [s3://dp-lab-data/SCRI_Projects/HTA/...\n", " NaN\n", @@ -1190,13 +1519,27 @@ " 5000\n", " 16\n", " 128\n", + " s3://dp-lab-data/SCRI_Projects/HTA/M...\n", + " quay.io/hisplan\n", + " \n", + " \n", + " RA19_10_18_FACs_MITO\n", + " RA19_10_18_FACs_MITO\n", + " 3011_RA19_10_18_FACs_MITO_IGO_12411_7\n", + " [s3://dp-lab-data/SCRI_Projects/HTA/...\n", + " [s3://dp-lab-data/SCRI_Projects/HTA/...\n", " NaN\n", + " False\n", + " 5000\n", + " 16\n", + " 128\n", + " s3://dp-lab-data/SCRI_Projects/HTA/M...\n", " quay.io/hisplan\n", " \n", " \n", - " Ru581D_MITO\n", - " Ru581D_MITO\n", - " 3007_Ru581D_MITO_IGO_12411_3\n", + " RA19_10_23_FACs_MITO\n", + " RA19_10_23_FACs_MITO\n", + " 3012_RA19_10_23_FACs_MITO_IGO_12411_8\n", " [s3://dp-lab-data/SCRI_Projects/HTA/...\n", " [s3://dp-lab-data/SCRI_Projects/HTA/...\n", " NaN\n", @@ -1204,7 +1547,21 @@ " 5000\n", " 16\n", " 128\n", + " s3://dp-lab-data/SCRI_Projects/HTA/M...\n", + " quay.io/hisplan\n", + " \n", + " \n", + " RA19_10_14_FACS_citric_MITO\n", + " RA19_10_14_FACS_citric_MITO\n", + " 3013_RA19_10_14_FACS_citric_MITO_IGO...\n", + " [s3://dp-lab-data/SCRI_Projects/HTA/...\n", + " [s3://dp-lab-data/SCRI_Projects/HTA/...\n", " NaN\n", + " False\n", + " 5000\n", + " 16\n", + " 128\n", + " s3://dp-lab-data/SCRI_Projects/HTA/M...\n", " quay.io/hisplan\n", " \n", " \n", @@ -1212,43 +1569,71 @@ "" ], "text/plain": [ - " MitoTracing.sampleName MitoTracing.fastqName \\\n", - "Ru581b_T1_MITO Ru581b_T1_MITO 3005_Ru581b_T1_MITO_IGO_12411_1 \n", - "Ru581c-LN1_MITO Ru581c-LN1_MITO 3006_Ru581c-LN1_MITO_IGO_12411_2 \n", - "Ru581D_MITO Ru581D_MITO 3007_Ru581D_MITO_IGO_12411_3 \n", - "\n", - " MitoTracing.fastqR1 \\\n", - "Ru581b_T1_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", - "Ru581c-LN1_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", - "Ru581D_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", - "\n", - " MitoTracing.fastqR2 \\\n", - "Ru581b_T1_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", - "Ru581c-LN1_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", - "Ru581D_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", - "\n", - " MitoTracing.reference MitoTracing.includeIntrons \\\n", - "Ru581b_T1_MITO NaN False \n", - "Ru581c-LN1_MITO NaN False \n", - "Ru581D_MITO NaN False \n", - "\n", - " MitoTracing.expectCells MitoTracing.numCores \\\n", - "Ru581b_T1_MITO 5000 16 \n", - "Ru581c-LN1_MITO 5000 16 \n", - "Ru581D_MITO 5000 16 \n", - "\n", - " MitoTracing.memory MitoTracing.whitelist \\\n", - "Ru581b_T1_MITO 128 NaN \n", - "Ru581c-LN1_MITO 128 NaN \n", - "Ru581D_MITO 128 NaN \n", - "\n", - " MitoTracing.dockerRegistry \n", - "Ru581b_T1_MITO quay.io/hisplan \n", - "Ru581c-LN1_MITO quay.io/hisplan \n", - "Ru581D_MITO quay.io/hisplan " + " MitoTracing.sampleName \\\n", + "RA19_10_14_FACs_MITO RA19_10_14_FACs_MITO \n", + "RA19_10_17_FACs_MITO RA19_10_17_FACs_MITO \n", + "RA19_10_18_FACs_MITO RA19_10_18_FACs_MITO \n", + "RA19_10_23_FACs_MITO RA19_10_23_FACs_MITO \n", + "RA19_10_14_FACS_citric_MITO RA19_10_14_FACS_citric_MITO \n", + "\n", + " MitoTracing.fastqName \\\n", + "RA19_10_14_FACs_MITO 3009_RA19_10_14_FACs_MITO_IGO_12411_5 \n", + "RA19_10_17_FACs_MITO 3010_RA19_10_17_FACs_MITO_IGO_12411_6 \n", + "RA19_10_18_FACs_MITO 3011_RA19_10_18_FACs_MITO_IGO_12411_7 \n", + "RA19_10_23_FACs_MITO 3012_RA19_10_23_FACs_MITO_IGO_12411_8 \n", + "RA19_10_14_FACS_citric_MITO 3013_RA19_10_14_FACS_citric_MITO_IGO... \n", + "\n", + " MitoTracing.fastqR1 \\\n", + "RA19_10_14_FACs_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "RA19_10_17_FACs_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "RA19_10_18_FACs_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "RA19_10_23_FACs_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "RA19_10_14_FACS_citric_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "\n", + " MitoTracing.fastqR2 \\\n", + "RA19_10_14_FACs_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "RA19_10_17_FACs_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "RA19_10_18_FACs_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "RA19_10_23_FACs_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "RA19_10_14_FACS_citric_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "\n", + " MitoTracing.reference MitoTracing.includeIntrons \\\n", + "RA19_10_14_FACs_MITO NaN False \n", + "RA19_10_17_FACs_MITO NaN False \n", + "RA19_10_18_FACs_MITO NaN False \n", + "RA19_10_23_FACs_MITO NaN False \n", + "RA19_10_14_FACS_citric_MITO NaN False \n", + "\n", + " MitoTracing.expectCells MitoTracing.numCores \\\n", + "RA19_10_14_FACs_MITO 5000 16 \n", + "RA19_10_17_FACs_MITO 5000 16 \n", + "RA19_10_18_FACs_MITO 5000 16 \n", + "RA19_10_23_FACs_MITO 5000 16 \n", + "RA19_10_14_FACS_citric_MITO 5000 16 \n", + "\n", + " MitoTracing.memory \\\n", + "RA19_10_14_FACs_MITO 128 \n", + "RA19_10_17_FACs_MITO 128 \n", + "RA19_10_18_FACs_MITO 128 \n", + "RA19_10_23_FACs_MITO 128 \n", + "RA19_10_14_FACS_citric_MITO 128 \n", + "\n", + " MitoTracing.whitelist \\\n", + "RA19_10_14_FACs_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "RA19_10_17_FACs_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "RA19_10_18_FACs_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "RA19_10_23_FACs_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "RA19_10_14_FACS_citric_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "\n", + " MitoTracing.dockerRegistry \n", + "RA19_10_14_FACs_MITO quay.io/hisplan \n", + "RA19_10_17_FACs_MITO quay.io/hisplan \n", + "RA19_10_18_FACs_MITO quay.io/hisplan \n", + "RA19_10_23_FACs_MITO quay.io/hisplan \n", + "RA19_10_14_FACS_citric_MITO quay.io/hisplan " ] }, - "execution_count": 22, + "execution_count": 23, "metadata": {}, "output_type": "execute_result" } @@ -1266,13 +1651,17 @@ " \n", " assert(fastqR1_name == fastqR1_name)\n", " inputs.loc[sample, f\"{prefix}.fastqName\"] = fastqR1_name\n", + " \n", + " # Check the whitelist to make sure that barcodes are in nucleotide format\n", + " inputs.loc[sample, f\"{prefix}.whitelist\"] = get_whitelist(samples.loc[sample, 'S3_path'])\n", + "\n", "\n", "inputs" ] }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 24, "id": "101eb0d4-4ca6-4639-bb67-afe47109a251", "metadata": {}, "outputs": [ @@ -1312,9 +1701,23 @@ " \n", " \n", " \n", - " Ru581b_T1_MITO\n", - " non_epi_Ru581b_T1_MITO\n", - " 3005_Ru581b_T1_MITO_IGO_12411_1\n", + " RA19_10_14_FACs_MITO\n", + " RA19_10_14_FACs_MITO\n", + " 3009_RA19_10_14_FACs_MITO_IGO_12411_5\n", + " [s3://dp-lab-data/SCRI_Projects/HTA/...\n", + " [s3://dp-lab-data/SCRI_Projects/HTA/...\n", + " {'cellRangerRefPkg': 's3://dp-lab-da...\n", + " False\n", + " 5000\n", + " 16\n", + " 128\n", + " s3://dp-lab-data/SCRI_Projects/HTA/M...\n", + " quay.io/hisplan\n", + " \n", + " \n", + " RA19_10_17_FACs_MITO\n", + " RA19_10_17_FACs_MITO\n", + " 3010_RA19_10_17_FACs_MITO_IGO_12411_6\n", " [s3://dp-lab-data/SCRI_Projects/HTA/...\n", " [s3://dp-lab-data/SCRI_Projects/HTA/...\n", " {'cellRangerRefPkg': 's3://dp-lab-da...\n", @@ -1326,9 +1729,9 @@ " quay.io/hisplan\n", " \n", " \n", - " Ru581c-LN1_MITO\n", - " non_epi_Ru581c-LN1_MITO\n", - " 3006_Ru581c-LN1_MITO_IGO_12411_2\n", + " RA19_10_18_FACs_MITO\n", + " RA19_10_18_FACs_MITO\n", + " 3011_RA19_10_18_FACs_MITO_IGO_12411_7\n", " [s3://dp-lab-data/SCRI_Projects/HTA/...\n", " [s3://dp-lab-data/SCRI_Projects/HTA/...\n", " {'cellRangerRefPkg': 's3://dp-lab-da...\n", @@ -1340,9 +1743,23 @@ " quay.io/hisplan\n", " \n", " \n", - " Ru581D_MITO\n", - " non_epi_Ru581D_MITO\n", - " 3007_Ru581D_MITO_IGO_12411_3\n", + " RA19_10_23_FACs_MITO\n", + " RA19_10_23_FACs_MITO\n", + " 3012_RA19_10_23_FACs_MITO_IGO_12411_8\n", + " [s3://dp-lab-data/SCRI_Projects/HTA/...\n", + " [s3://dp-lab-data/SCRI_Projects/HTA/...\n", + " {'cellRangerRefPkg': 's3://dp-lab-da...\n", + " False\n", + " 5000\n", + " 16\n", + " 128\n", + " s3://dp-lab-data/SCRI_Projects/HTA/M...\n", + " quay.io/hisplan\n", + " \n", + " \n", + " RA19_10_14_FACS_citric_MITO\n", + " RA19_10_14_FACS_citric_MITO\n", + " 3013_RA19_10_14_FACS_citric_MITO_IGO...\n", " [s3://dp-lab-data/SCRI_Projects/HTA/...\n", " [s3://dp-lab-data/SCRI_Projects/HTA/...\n", " {'cellRangerRefPkg': 's3://dp-lab-da...\n", @@ -1358,55 +1775,84 @@ "" ], "text/plain": [ - " MitoTracing.sampleName MitoTracing.fastqName \\\n", - "Ru581b_T1_MITO non_epi_Ru581b_T1_MITO 3005_Ru581b_T1_MITO_IGO_12411_1 \n", - "Ru581c-LN1_MITO non_epi_Ru581c-LN1_MITO 3006_Ru581c-LN1_MITO_IGO_12411_2 \n", - "Ru581D_MITO non_epi_Ru581D_MITO 3007_Ru581D_MITO_IGO_12411_3 \n", - "\n", - " MitoTracing.fastqR1 \\\n", - "Ru581b_T1_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", - "Ru581c-LN1_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", - "Ru581D_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", - "\n", - " MitoTracing.fastqR2 \\\n", - "Ru581b_T1_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", - "Ru581c-LN1_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", - "Ru581D_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", - "\n", - " MitoTracing.reference \\\n", - "Ru581b_T1_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", - "Ru581c-LN1_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", - "Ru581D_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", - "\n", - " MitoTracing.includeIntrons MitoTracing.expectCells \\\n", - "Ru581b_T1_MITO False 5000 \n", - "Ru581c-LN1_MITO False 5000 \n", - "Ru581D_MITO False 5000 \n", - "\n", - " MitoTracing.numCores MitoTracing.memory \\\n", - "Ru581b_T1_MITO 16 128 \n", - "Ru581c-LN1_MITO 16 128 \n", - "Ru581D_MITO 16 128 \n", - "\n", - " MitoTracing.whitelist \\\n", - "Ru581b_T1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", - "Ru581c-LN1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", - "Ru581D_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", - "\n", - " MitoTracing.dockerRegistry \n", - "Ru581b_T1_MITO quay.io/hisplan \n", - "Ru581c-LN1_MITO quay.io/hisplan \n", - "Ru581D_MITO quay.io/hisplan " + " MitoTracing.sampleName \\\n", + "RA19_10_14_FACs_MITO RA19_10_14_FACs_MITO \n", + "RA19_10_17_FACs_MITO RA19_10_17_FACs_MITO \n", + "RA19_10_18_FACs_MITO RA19_10_18_FACs_MITO \n", + "RA19_10_23_FACs_MITO RA19_10_23_FACs_MITO \n", + "RA19_10_14_FACS_citric_MITO RA19_10_14_FACS_citric_MITO \n", + "\n", + " MitoTracing.fastqName \\\n", + "RA19_10_14_FACs_MITO 3009_RA19_10_14_FACs_MITO_IGO_12411_5 \n", + "RA19_10_17_FACs_MITO 3010_RA19_10_17_FACs_MITO_IGO_12411_6 \n", + "RA19_10_18_FACs_MITO 3011_RA19_10_18_FACs_MITO_IGO_12411_7 \n", + "RA19_10_23_FACs_MITO 3012_RA19_10_23_FACs_MITO_IGO_12411_8 \n", + "RA19_10_14_FACS_citric_MITO 3013_RA19_10_14_FACS_citric_MITO_IGO... \n", + "\n", + " MitoTracing.fastqR1 \\\n", + "RA19_10_14_FACs_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "RA19_10_17_FACs_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "RA19_10_18_FACs_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "RA19_10_23_FACs_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "RA19_10_14_FACS_citric_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "\n", + " MitoTracing.fastqR2 \\\n", + "RA19_10_14_FACs_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "RA19_10_17_FACs_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "RA19_10_18_FACs_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "RA19_10_23_FACs_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "RA19_10_14_FACS_citric_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "\n", + " MitoTracing.reference \\\n", + "RA19_10_14_FACs_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "RA19_10_17_FACs_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "RA19_10_18_FACs_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "RA19_10_23_FACs_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "RA19_10_14_FACS_citric_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "\n", + " MitoTracing.includeIntrons \\\n", + "RA19_10_14_FACs_MITO False \n", + "RA19_10_17_FACs_MITO False \n", + "RA19_10_18_FACs_MITO False \n", + "RA19_10_23_FACs_MITO False \n", + "RA19_10_14_FACS_citric_MITO False \n", + "\n", + " MitoTracing.expectCells MitoTracing.numCores \\\n", + "RA19_10_14_FACs_MITO 5000 16 \n", + "RA19_10_17_FACs_MITO 5000 16 \n", + "RA19_10_18_FACs_MITO 5000 16 \n", + "RA19_10_23_FACs_MITO 5000 16 \n", + "RA19_10_14_FACS_citric_MITO 5000 16 \n", + "\n", + " MitoTracing.memory \\\n", + "RA19_10_14_FACs_MITO 128 \n", + "RA19_10_17_FACs_MITO 128 \n", + "RA19_10_18_FACs_MITO 128 \n", + "RA19_10_23_FACs_MITO 128 \n", + "RA19_10_14_FACS_citric_MITO 128 \n", + "\n", + " MitoTracing.whitelist \\\n", + "RA19_10_14_FACs_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "RA19_10_17_FACs_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "RA19_10_18_FACs_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "RA19_10_23_FACs_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "RA19_10_14_FACS_citric_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "\n", + " MitoTracing.dockerRegistry \n", + "RA19_10_14_FACs_MITO quay.io/hisplan \n", + "RA19_10_17_FACs_MITO quay.io/hisplan \n", + "RA19_10_18_FACs_MITO quay.io/hisplan \n", + "RA19_10_23_FACs_MITO quay.io/hisplan \n", + "RA19_10_14_FACS_citric_MITO quay.io/hisplan " ] }, - "execution_count": 23, + "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "# Manually adding (for this sample)\n", - "\n", + "# Reference created by Jaeyoung\n", "cellRangerRefPkg=\"s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/reference-packages/refdata-gex-mito-GRCh38-ensemble98.tar.gz\"\n", "mitoFastaRefPkg=\"s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/reference-packages/mito-fasta-GRCh38.tar.gz\"\n", "\n", @@ -1414,27 +1860,13 @@ " mitoFastaRefPkg=mitoFastaRefPkg)] * len(inputs)\n", "inputs[f\"{prefix}.reference\"] = reference\n", "\n", - "non_epithelial = ['s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/barcodes_rna/Ru581b_T1_MITO/barcodes_in_RNA.non-epithelial.RU581_Ta.txt',\n", - " 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/barcodes_rna/Ru581c-LN1_MITO/barcodes_in_RNA.non-epithelial.RU581_LNa.txt',\n", - " 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/barcodes_rna/Ru581D_MITO/barcodes_in_RNA.non-epithelial.RU581_LIV.txt']\n", - "\n", - "epithelial = ['s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/barcodes_rna/Ru581b_T1_MITO/barcodes_in_RNA.RU581_Ta.txt',\n", - " 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/barcodes_rna/Ru581c-LN1_MITO/barcodes_in_RNA.RU581_LNa.txt',\n", - " 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/barcodes_rna/Ru581D_MITO/barcodes_in_RNA.RU581_LIV.txt']\n", - "\n", - "# inputs[f\"{prefix}.whitelist\"] = epithelial\n", - "inputs[f\"{prefix}.whitelist\"] = non_epithelial\n", - "\n", - "# inputs[f\"{prefix}.sampleName\"] = 'epi_' + inputs[f\"{prefix}.sampleName\"] \n", - "inputs[f\"{prefix}.sampleName\"] = 'non_epi_' + inputs[f\"{prefix}.sampleName\"]\n", - "\n", "inputs" ] }, { "cell_type": "code", "execution_count": null, - "id": "1ae5805b-8806-4846-a9ed-3b7400e99e2d", + "id": "a8f12841-72fe-49c6-b91c-2381f7fc62be", "metadata": {}, "outputs": [], "source": [] @@ -1451,7 +1883,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 25, "id": "6ca8c556-8254-4051-93ee-5447d43abfbb", "metadata": {}, "outputs": [ @@ -1487,7 +1919,27 @@ " \n", " \n", " \n", - " Ru581b_T1_MITO\n", + " RA19_10_14_FACs_MITO\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " \n", + " \n", + " RA19_10_17_FACs_MITO\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " \n", + " \n", + " RA19_10_18_FACs_MITO\n", " NaN\n", " NaN\n", " NaN\n", @@ -1497,7 +1949,7 @@ " NaN\n", " \n", " \n", - " Ru581c-LN1_MITO\n", + " RA19_10_23_FACs_MITO\n", " NaN\n", " NaN\n", " NaN\n", @@ -1507,7 +1959,7 @@ " NaN\n", " \n", " \n", - " Ru581D_MITO\n", + " RA19_10_14_FACS_citric_MITO\n", " NaN\n", " NaN\n", " NaN\n", @@ -1521,13 +1973,22 @@ "" ], "text/plain": [ - " pipelineType project sample owner destination transfer comment\n", - "Ru581b_T1_MITO NaN NaN NaN NaN NaN NaN NaN\n", - "Ru581c-LN1_MITO NaN NaN NaN NaN NaN NaN NaN\n", - "Ru581D_MITO NaN NaN NaN NaN NaN NaN NaN" + " pipelineType project sample owner destination \\\n", + "RA19_10_14_FACs_MITO NaN NaN NaN NaN NaN \n", + "RA19_10_17_FACs_MITO NaN NaN NaN NaN NaN \n", + "RA19_10_18_FACs_MITO NaN NaN NaN NaN NaN \n", + "RA19_10_23_FACs_MITO NaN NaN NaN NaN NaN \n", + "RA19_10_14_FACS_citric_MITO NaN NaN NaN NaN NaN \n", + "\n", + " transfer comment \n", + "RA19_10_14_FACs_MITO NaN NaN \n", + "RA19_10_17_FACs_MITO NaN NaN \n", + "RA19_10_18_FACs_MITO NaN NaN \n", + "RA19_10_23_FACs_MITO NaN NaN \n", + "RA19_10_14_FACS_citric_MITO NaN NaN " ] }, - "execution_count": 24, + "execution_count": 25, "metadata": {}, "output_type": "execute_result" } @@ -1544,7 +2005,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 26, "id": "0731efde-30bb-419b-b5a4-b8420911f309", "metadata": {}, "outputs": [ @@ -1580,30 +2041,50 @@ " \n", " \n", " \n", - " Ru581b_T1_MITO\n", + " RA19_10_14_FACs_MITO\n", " MitoTracing\n", " HTAN_CITEseq\n", - " Ru581b_T1_MITO\n", + " RA19_10_14_FACs_MITO\n", " sohailn\n", " s3://dp-lab-data/SCRI_Projects/HTA/M...\n", " -\n", " sohailn\n", " \n", " \n", - " Ru581c-LN1_MITO\n", + " RA19_10_17_FACs_MITO\n", " MitoTracing\n", " HTAN_CITEseq\n", - " Ru581c-LN1_MITO\n", + " RA19_10_17_FACs_MITO\n", " sohailn\n", " s3://dp-lab-data/SCRI_Projects/HTA/M...\n", " -\n", " sohailn\n", " \n", " \n", - " Ru581D_MITO\n", + " RA19_10_18_FACs_MITO\n", " MitoTracing\n", " HTAN_CITEseq\n", - " Ru581D_MITO\n", + " RA19_10_18_FACs_MITO\n", + " sohailn\n", + " s3://dp-lab-data/SCRI_Projects/HTA/M...\n", + " -\n", + " sohailn\n", + " \n", + " \n", + " RA19_10_23_FACs_MITO\n", + " MitoTracing\n", + " HTAN_CITEseq\n", + " RA19_10_23_FACs_MITO\n", + " sohailn\n", + " s3://dp-lab-data/SCRI_Projects/HTA/M...\n", + " -\n", + " sohailn\n", + " \n", + " \n", + " RA19_10_14_FACS_citric_MITO\n", + " MitoTracing\n", + " HTAN_CITEseq\n", + " RA19_10_14_FACS_citric_MITO\n", " sohailn\n", " s3://dp-lab-data/SCRI_Projects/HTA/M...\n", " -\n", @@ -1614,18 +2095,36 @@ "" ], "text/plain": [ - " pipelineType project sample owner \\\n", - "Ru581b_T1_MITO MitoTracing HTAN_CITEseq Ru581b_T1_MITO sohailn \n", - "Ru581c-LN1_MITO MitoTracing HTAN_CITEseq Ru581c-LN1_MITO sohailn \n", - "Ru581D_MITO MitoTracing HTAN_CITEseq Ru581D_MITO sohailn \n", - "\n", - " destination transfer comment \n", - "Ru581b_T1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... - sohailn \n", - "Ru581c-LN1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... - sohailn \n", - "Ru581D_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... - sohailn " + " pipelineType project \\\n", + "RA19_10_14_FACs_MITO MitoTracing HTAN_CITEseq \n", + "RA19_10_17_FACs_MITO MitoTracing HTAN_CITEseq \n", + "RA19_10_18_FACs_MITO MitoTracing HTAN_CITEseq \n", + "RA19_10_23_FACs_MITO MitoTracing HTAN_CITEseq \n", + "RA19_10_14_FACS_citric_MITO MitoTracing HTAN_CITEseq \n", + "\n", + " sample owner \\\n", + "RA19_10_14_FACs_MITO RA19_10_14_FACs_MITO sohailn \n", + "RA19_10_17_FACs_MITO RA19_10_17_FACs_MITO sohailn \n", + "RA19_10_18_FACs_MITO RA19_10_18_FACs_MITO sohailn \n", + "RA19_10_23_FACs_MITO RA19_10_23_FACs_MITO sohailn \n", + "RA19_10_14_FACS_citric_MITO RA19_10_14_FACS_citric_MITO sohailn \n", + "\n", + " destination transfer \\\n", + "RA19_10_14_FACs_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... - \n", + "RA19_10_17_FACs_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... - \n", + "RA19_10_18_FACs_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... - \n", + "RA19_10_23_FACs_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... - \n", + "RA19_10_14_FACS_citric_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... - \n", + "\n", + " comment \n", + "RA19_10_14_FACs_MITO sohailn \n", + "RA19_10_17_FACs_MITO sohailn \n", + "RA19_10_18_FACs_MITO sohailn \n", + "RA19_10_23_FACs_MITO sohailn \n", + "RA19_10_14_FACS_citric_MITO sohailn " ] }, - "execution_count": 25, + "execution_count": 26, "metadata": {}, "output_type": "execute_result" } @@ -1636,41 +2135,13 @@ "labels[\"project\"] = samples[\"Sample_ID\"].apply(lambda x: get_project_id(x, creds))\n", "labels[\"sample\"] = labels.index\n", "labels[\"owner\"] = creds[\"user\"]\n", - "# labels[\"destination\"] = samples['S3_path'] + \"/\" + output_dirname\n", - "# labels[\"destination\"] = samples['S3_path'] + \"/\" + 'epi_' + output_dirname\n", - "labels[\"destination\"] = samples['S3_path'] + \"/\" + 'non_epi_' + output_dirname\n", - "\n", + "labels[\"destination\"] = samples['S3_path'] + \"/\" + output_dirname\n", "labels[\"transfer\"] = \"-\"\n", "labels[\"comment\"] = creds[\"user\"]\n", "\n", "labels" ] }, - { - "cell_type": "code", - "execution_count": 26, - "id": "82ab0b61-8acf-43d3-97ae-3e53c528e890", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array(['s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/barcodes_rna/Ru581b_T1_MITO/non_epi_mito-tracing-outs',\n", - " 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/barcodes_rna/Ru581c-LN1_MITO/non_epi_mito-tracing-outs',\n", - " 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/barcodes_rna/Ru581D_MITO/non_epi_mito-tracing-outs'],\n", - " dtype=object)" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "labels.loc['Ru581D_MITO', 'destination'] = 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/barcodes_rna/Ru581D_MITO/non_epi_mito-tracing-outs'\n", - "labels['destination'].values" - ] - }, { "cell_type": "code", "execution_count": null, @@ -1690,7 +2161,7 @@ { "cell_type": "code", "execution_count": 27, - "id": "ca0f8bc8-c862-4398-89b2-152ad55bdec9", + "id": "68d260a1-cca0-41d6-9c84-d5f1aef94128", "metadata": {}, "outputs": [ { @@ -1729,9 +2200,23 @@ " \n", " \n", " \n", - " Ru581b_T1_MITO\n", - " non_epi_Ru581b_T1_MITO\n", - " 3005_Ru581b_T1_MITO_IGO_12411_1\n", + " RA19_10_14_FACs_MITO\n", + " RA19_10_14_FACs_MITO\n", + " 3009_RA19_10_14_FACs_MITO_IGO_12411_5\n", + " [s3://dp-lab-data/SCRI_Projects/HTA/...\n", + " [s3://dp-lab-data/SCRI_Projects/HTA/...\n", + " {'cellRangerRefPkg': 's3://dp-lab-da...\n", + " False\n", + " 5000\n", + " 16\n", + " 128\n", + " s3://dp-lab-data/SCRI_Projects/HTA/M...\n", + " quay.io/hisplan\n", + " \n", + " \n", + " RA19_10_17_FACs_MITO\n", + " RA19_10_17_FACs_MITO\n", + " 3010_RA19_10_17_FACs_MITO_IGO_12411_6\n", " [s3://dp-lab-data/SCRI_Projects/HTA/...\n", " [s3://dp-lab-data/SCRI_Projects/HTA/...\n", " {'cellRangerRefPkg': 's3://dp-lab-da...\n", @@ -1743,9 +2228,9 @@ " quay.io/hisplan\n", " \n", " \n", - " Ru581c-LN1_MITO\n", - " non_epi_Ru581c-LN1_MITO\n", - " 3006_Ru581c-LN1_MITO_IGO_12411_2\n", + " RA19_10_18_FACs_MITO\n", + " RA19_10_18_FACs_MITO\n", + " 3011_RA19_10_18_FACs_MITO_IGO_12411_7\n", " [s3://dp-lab-data/SCRI_Projects/HTA/...\n", " [s3://dp-lab-data/SCRI_Projects/HTA/...\n", " {'cellRangerRefPkg': 's3://dp-lab-da...\n", @@ -1757,9 +2242,23 @@ " quay.io/hisplan\n", " \n", " \n", - " Ru581D_MITO\n", - " non_epi_Ru581D_MITO\n", - " 3007_Ru581D_MITO_IGO_12411_3\n", + " RA19_10_23_FACs_MITO\n", + " RA19_10_23_FACs_MITO\n", + " 3012_RA19_10_23_FACs_MITO_IGO_12411_8\n", + " [s3://dp-lab-data/SCRI_Projects/HTA/...\n", + " [s3://dp-lab-data/SCRI_Projects/HTA/...\n", + " {'cellRangerRefPkg': 's3://dp-lab-da...\n", + " False\n", + " 5000\n", + " 16\n", + " 128\n", + " s3://dp-lab-data/SCRI_Projects/HTA/M...\n", + " quay.io/hisplan\n", + " \n", + " \n", + " RA19_10_14_FACS_citric_MITO\n", + " RA19_10_14_FACS_citric_MITO\n", + " 3013_RA19_10_14_FACS_citric_MITO_IGO...\n", " [s3://dp-lab-data/SCRI_Projects/HTA/...\n", " [s3://dp-lab-data/SCRI_Projects/HTA/...\n", " {'cellRangerRefPkg': 's3://dp-lab-da...\n", @@ -1775,45 +2274,75 @@ "" ], "text/plain": [ - " MitoTracing.sampleName MitoTracing.fastqName \\\n", - "Ru581b_T1_MITO non_epi_Ru581b_T1_MITO 3005_Ru581b_T1_MITO_IGO_12411_1 \n", - "Ru581c-LN1_MITO non_epi_Ru581c-LN1_MITO 3006_Ru581c-LN1_MITO_IGO_12411_2 \n", - "Ru581D_MITO non_epi_Ru581D_MITO 3007_Ru581D_MITO_IGO_12411_3 \n", - "\n", - " MitoTracing.fastqR1 \\\n", - "Ru581b_T1_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", - "Ru581c-LN1_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", - "Ru581D_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", - "\n", - " MitoTracing.fastqR2 \\\n", - "Ru581b_T1_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", - "Ru581c-LN1_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", - "Ru581D_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", - "\n", - " MitoTracing.reference \\\n", - "Ru581b_T1_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", - "Ru581c-LN1_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", - "Ru581D_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", - "\n", - " MitoTracing.includeIntrons MitoTracing.expectCells \\\n", - "Ru581b_T1_MITO False 5000 \n", - "Ru581c-LN1_MITO False 5000 \n", - "Ru581D_MITO False 5000 \n", - "\n", - " MitoTracing.numCores MitoTracing.memory \\\n", - "Ru581b_T1_MITO 16 128 \n", - "Ru581c-LN1_MITO 16 128 \n", - "Ru581D_MITO 16 128 \n", - "\n", - " MitoTracing.whitelist \\\n", - "Ru581b_T1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", - "Ru581c-LN1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", - "Ru581D_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", - "\n", - " MitoTracing.dockerRegistry \n", - "Ru581b_T1_MITO quay.io/hisplan \n", - "Ru581c-LN1_MITO quay.io/hisplan \n", - "Ru581D_MITO quay.io/hisplan " + " MitoTracing.sampleName \\\n", + "RA19_10_14_FACs_MITO RA19_10_14_FACs_MITO \n", + "RA19_10_17_FACs_MITO RA19_10_17_FACs_MITO \n", + "RA19_10_18_FACs_MITO RA19_10_18_FACs_MITO \n", + "RA19_10_23_FACs_MITO RA19_10_23_FACs_MITO \n", + "RA19_10_14_FACS_citric_MITO RA19_10_14_FACS_citric_MITO \n", + "\n", + " MitoTracing.fastqName \\\n", + "RA19_10_14_FACs_MITO 3009_RA19_10_14_FACs_MITO_IGO_12411_5 \n", + "RA19_10_17_FACs_MITO 3010_RA19_10_17_FACs_MITO_IGO_12411_6 \n", + "RA19_10_18_FACs_MITO 3011_RA19_10_18_FACs_MITO_IGO_12411_7 \n", + "RA19_10_23_FACs_MITO 3012_RA19_10_23_FACs_MITO_IGO_12411_8 \n", + "RA19_10_14_FACS_citric_MITO 3013_RA19_10_14_FACS_citric_MITO_IGO... \n", + "\n", + " MitoTracing.fastqR1 \\\n", + "RA19_10_14_FACs_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "RA19_10_17_FACs_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "RA19_10_18_FACs_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "RA19_10_23_FACs_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "RA19_10_14_FACS_citric_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "\n", + " MitoTracing.fastqR2 \\\n", + "RA19_10_14_FACs_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "RA19_10_17_FACs_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "RA19_10_18_FACs_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "RA19_10_23_FACs_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "RA19_10_14_FACS_citric_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "\n", + " MitoTracing.reference \\\n", + "RA19_10_14_FACs_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "RA19_10_17_FACs_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "RA19_10_18_FACs_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "RA19_10_23_FACs_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "RA19_10_14_FACS_citric_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "\n", + " MitoTracing.includeIntrons \\\n", + "RA19_10_14_FACs_MITO False \n", + "RA19_10_17_FACs_MITO False \n", + "RA19_10_18_FACs_MITO False \n", + "RA19_10_23_FACs_MITO False \n", + "RA19_10_14_FACS_citric_MITO False \n", + "\n", + " MitoTracing.expectCells MitoTracing.numCores \\\n", + "RA19_10_14_FACs_MITO 5000 16 \n", + "RA19_10_17_FACs_MITO 5000 16 \n", + "RA19_10_18_FACs_MITO 5000 16 \n", + "RA19_10_23_FACs_MITO 5000 16 \n", + "RA19_10_14_FACS_citric_MITO 5000 16 \n", + "\n", + " MitoTracing.memory \\\n", + "RA19_10_14_FACs_MITO 128 \n", + "RA19_10_17_FACs_MITO 128 \n", + "RA19_10_18_FACs_MITO 128 \n", + "RA19_10_23_FACs_MITO 128 \n", + "RA19_10_14_FACS_citric_MITO 128 \n", + "\n", + " MitoTracing.whitelist \\\n", + "RA19_10_14_FACs_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "RA19_10_17_FACs_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "RA19_10_18_FACs_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "RA19_10_23_FACs_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "RA19_10_14_FACS_citric_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "\n", + " MitoTracing.dockerRegistry \n", + "RA19_10_14_FACs_MITO quay.io/hisplan \n", + "RA19_10_17_FACs_MITO quay.io/hisplan \n", + "RA19_10_18_FACs_MITO quay.io/hisplan \n", + "RA19_10_23_FACs_MITO quay.io/hisplan \n", + "RA19_10_14_FACS_citric_MITO quay.io/hisplan " ] }, "execution_count": 27, @@ -1828,7 +2357,7 @@ { "cell_type": "code", "execution_count": 28, - "id": "a9ee54c6-1a2c-46f5-a450-75bcf2a7cfb5", + "id": "c5713d9e-a923-446e-9df8-fb9619590923", "metadata": {}, "outputs": [ { @@ -1863,30 +2392,50 @@ " \n", " \n", " \n", - " Ru581b_T1_MITO\n", + " RA19_10_14_FACs_MITO\n", + " MitoTracing\n", + " HTAN_CITEseq\n", + " RA19_10_14_FACs_MITO\n", + " sohailn\n", + " s3://dp-lab-data/SCRI_Projects/HTA/M...\n", + " -\n", + " sohailn\n", + " \n", + " \n", + " RA19_10_17_FACs_MITO\n", " MitoTracing\n", " HTAN_CITEseq\n", - " Ru581b_T1_MITO\n", + " RA19_10_17_FACs_MITO\n", " sohailn\n", " s3://dp-lab-data/SCRI_Projects/HTA/M...\n", " -\n", " sohailn\n", " \n", " \n", - " Ru581c-LN1_MITO\n", + " RA19_10_18_FACs_MITO\n", " MitoTracing\n", " HTAN_CITEseq\n", - " Ru581c-LN1_MITO\n", + " RA19_10_18_FACs_MITO\n", " sohailn\n", " s3://dp-lab-data/SCRI_Projects/HTA/M...\n", " -\n", " sohailn\n", " \n", " \n", - " Ru581D_MITO\n", + " RA19_10_23_FACs_MITO\n", " MitoTracing\n", " HTAN_CITEseq\n", - " Ru581D_MITO\n", + " RA19_10_23_FACs_MITO\n", + " sohailn\n", + " s3://dp-lab-data/SCRI_Projects/HTA/M...\n", + " -\n", + " sohailn\n", + " \n", + " \n", + " RA19_10_14_FACS_citric_MITO\n", + " MitoTracing\n", + " HTAN_CITEseq\n", + " RA19_10_14_FACS_citric_MITO\n", " sohailn\n", " s3://dp-lab-data/SCRI_Projects/HTA/M...\n", " -\n", @@ -1897,15 +2446,33 @@ "" ], "text/plain": [ - " pipelineType project sample owner \\\n", - "Ru581b_T1_MITO MitoTracing HTAN_CITEseq Ru581b_T1_MITO sohailn \n", - "Ru581c-LN1_MITO MitoTracing HTAN_CITEseq Ru581c-LN1_MITO sohailn \n", - "Ru581D_MITO MitoTracing HTAN_CITEseq Ru581D_MITO sohailn \n", - "\n", - " destination transfer comment \n", - "Ru581b_T1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... - sohailn \n", - "Ru581c-LN1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... - sohailn \n", - "Ru581D_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... - sohailn " + " pipelineType project \\\n", + "RA19_10_14_FACs_MITO MitoTracing HTAN_CITEseq \n", + "RA19_10_17_FACs_MITO MitoTracing HTAN_CITEseq \n", + "RA19_10_18_FACs_MITO MitoTracing HTAN_CITEseq \n", + "RA19_10_23_FACs_MITO MitoTracing HTAN_CITEseq \n", + "RA19_10_14_FACS_citric_MITO MitoTracing HTAN_CITEseq \n", + "\n", + " sample owner \\\n", + "RA19_10_14_FACs_MITO RA19_10_14_FACs_MITO sohailn \n", + "RA19_10_17_FACs_MITO RA19_10_17_FACs_MITO sohailn \n", + "RA19_10_18_FACs_MITO RA19_10_18_FACs_MITO sohailn \n", + "RA19_10_23_FACs_MITO RA19_10_23_FACs_MITO sohailn \n", + "RA19_10_14_FACS_citric_MITO RA19_10_14_FACS_citric_MITO sohailn \n", + "\n", + " destination transfer \\\n", + "RA19_10_14_FACs_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... - \n", + "RA19_10_17_FACs_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... - \n", + "RA19_10_18_FACs_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... - \n", + "RA19_10_23_FACs_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... - \n", + "RA19_10_14_FACS_citric_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... - \n", + "\n", + " comment \n", + "RA19_10_14_FACs_MITO sohailn \n", + "RA19_10_17_FACs_MITO sohailn \n", + "RA19_10_18_FACs_MITO sohailn \n", + "RA19_10_23_FACs_MITO sohailn \n", + "RA19_10_14_FACS_citric_MITO sohailn " ] }, "execution_count": 28, @@ -1926,12 +2493,12 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "d7604a2ce3c1415facaa058ae23ffa68", + "model_id": "f68dbeab6b234b3c9f22a064e7cfb506", "version_major": 2, "version_minor": 0 }, "text/plain": [ - " 0%| | 0/3 [00:00 Date: Tue, 7 Jun 2022 14:45:14 -0400 Subject: [PATCH 05/16] Automatically search for whitelist --- notebooks/Run_MitoTracing.ipynb | 61 --------------------------------- 1 file changed, 61 deletions(-) diff --git a/notebooks/Run_MitoTracing.ipynb b/notebooks/Run_MitoTracing.ipynb index f4ecf05..9ec639f 100644 --- a/notebooks/Run_MitoTracing.ipynb +++ b/notebooks/Run_MitoTracing.ipynb @@ -553,67 +553,6 @@ "outputs": [], "source": [] }, - { - "cell_type": "code", - "execution_count": 15, - "id": "7c4de0dd-3c84-48b0-8e38-38b83d2abef8", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "env: AWS_ACCESS_KEY_ID=ASIAYPY66CWMEJKK4YFV\n", - "env: AWS_SECRET_ACCESS_KEY=oO0/tFrAqh8tAfzGU8mtLq+BmIAoyrRWuEO4L8zh\n", - "env: AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEN///////////wEaCXVzLWVhc3QtMSJHMEUCIDHc9iEKNRxhk+aEBbFXL5atlgE2TaVcIoBC90++y1vbAiEA2EP69firZKK1A1TMK5Urs0TeJxOi+Kg6aTorsUGWwswq+AEI2P//////////ARADGgw1ODM2NDM1Njc1MTIiDKfaop6ZajoVlsLYdSrMAWnUjUOcAGuE5oLwQ5G++xzTfNJw4lU1awlQ/GlbTj7CZlaUh47IayOmliV/QM1OeTAkVI+tKMnfnIUYP+gjW/EMl4S1tjFmccaODbnWuKMGf60P72iolq5ZHaOwZAG7c0aaS/CuEEw228M+Ts5yhTHp3bZTFETfkwOQgwxufcmFLu253DHBDSIMl2BghW1sHtV8HVz+qxg6tOrM93w62Wz6OXIsa2Ay7GD5PeycLy0FGSuADjwtswu+MBr8AonWK/CDBEGgoXy2QgCh2DCDyP2UBjqYARC84xVlD9jF+COH/3HvBQUFIUYeN+tvQQn8yvoxpfMlPgT72nFxVOD98JgpWe3NVuZCIzn9COjFHDN5azPmRTKSpH52aWu96LYGZNEzqKzO0rqBMQHdue4jVkHbaMjAPwhjqLw/3fa8N+4ljezvXM6f+7z4VGDIigx/tKS/3BBsfrPMKCHmgGVNg9M4DtCM5Ho66BL2hZgA\n" - ] - } - ], - "source": [ - "%env AWS_ACCESS_KEY_ID=ASIAYPY66CWMEJKK4YFV\n", - "%env AWS_SECRET_ACCESS_KEY=oO0/tFrAqh8tAfzGU8mtLq+BmIAoyrRWuEO4L8zh\n", - "%env AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEN///////////wEaCXVzLWVhc3QtMSJHMEUCIDHc9iEKNRxhk+aEBbFXL5atlgE2TaVcIoBC90++y1vbAiEA2EP69firZKK1A1TMK5Urs0TeJxOi+Kg6aTorsUGWwswq+AEI2P//////////ARADGgw1ODM2NDM1Njc1MTIiDKfaop6ZajoVlsLYdSrMAWnUjUOcAGuE5oLwQ5G++xzTfNJw4lU1awlQ/GlbTj7CZlaUh47IayOmliV/QM1OeTAkVI+tKMnfnIUYP+gjW/EMl4S1tjFmccaODbnWuKMGf60P72iolq5ZHaOwZAG7c0aaS/CuEEw228M+Ts5yhTHp3bZTFETfkwOQgwxufcmFLu253DHBDSIMl2BghW1sHtV8HVz+qxg6tOrM93w62Wz6OXIsa2Ay7GD5PeycLy0FGSuADjwtswu+MBr8AonWK/CDBEGgoXy2QgCh2DCDyP2UBjqYARC84xVlD9jF+COH/3HvBQUFIUYeN+tvQQn8yvoxpfMlPgT72nFxVOD98JgpWe3NVuZCIzn9COjFHDN5azPmRTKSpH52aWu96LYGZNEzqKzO0rqBMQHdue4jVkHbaMjAPwhjqLw/3fa8N+4ljezvXM6f+7z4VGDIigx/tKS/3BBsfrPMKCHmgGVNg9M4DtCM5Ho66BL2hZgA" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "40c906ae-dfc5-4415-8011-05d59cc6e216", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2021-10-07 15:31:32 agc-583643567512-us-east-1\n", - "2021-10-07 15:28:07 cdktoolkit-stagingbucket-d49u1xfb0sc4\n", - "2019-10-09 13:04:06 cf-templates-umiwbnq3566w-us-east-1\n", - "2019-10-10 12:46:54 dp-daily-reports\n", - "2017-09-26 10:15:15 dp-lab-data\n", - "2019-05-23 12:34:58 dp-lab-data-public\n", - "2018-03-01 13:29:07 dp-lab-glacier\n", - "2020-11-06 23:02:27 dp-lab-gwf-core\n", - "2021-07-15 18:14:01 dp-lab-gwf-core2\n", - "2017-09-26 10:17:18 dp-lab-home\n", - "2019-08-14 16:42:43 dp-lab-test\n", - "2019-04-25 12:35:35 elasticbeanstalk-us-east-1-583643567512\n", - "2019-12-13 15:53:57 scri-computational\n", - "2017-09-26 10:23:50 seqc-public\n" - ] - } - ], - "source": [ - "!aws s3 ls" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b0f6c614-d304-433c-a318-81182ba675b1", - "metadata": {}, - "outputs": [], - "source": [] - }, { "cell_type": "markdown", "id": "2b28002d-85c9-4b9b-b0fc-5b86948c245c", From 2779ee8c01de35c47535de735d6a58f224a9f70c Mon Sep 17 00:00:00 2001 From: nsohail19 Date: Tue, 7 Jun 2022 14:47:27 -0400 Subject: [PATCH 06/16] Commented some reminders that could cause your job to fail --- notebooks/Run_CellRangerGex.ipynb | 618 ++++++++++++++++++++---------- 1 file changed, 411 insertions(+), 207 deletions(-) diff --git a/notebooks/Run_CellRangerGex.ipynb b/notebooks/Run_CellRangerGex.ipynb index d65279e..e5538ea 100644 --- a/notebooks/Run_CellRangerGex.ipynb +++ b/notebooks/Run_CellRangerGex.ipynb @@ -19,7 +19,6 @@ { "cell_type": "markdown", "metadata": { - "jp-MarkdownHeadingCollapsed": true, "tags": [], "toc-hr-collapsed": true }, @@ -409,6 +408,7 @@ { "cell_type": "markdown", "metadata": { + "jp-MarkdownHeadingCollapsed": true, "tags": [] }, "source": [ @@ -669,6 +669,40 @@ " print(f\"Error: {e}\")" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Get tar gz file for reference" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "# Get fastq file paths on S3 for each file id\n", + "# Returns dictionary from id to s3 path\n", + "# Throws exception if FASTQs don't exist for any id\n", + "def get_reference(\n", + " path: str, # path to directory containing FASTQ files\n", + "):\n", + " print(path)\n", + " _, bucket, key, _, _ = urllib.parse.urlsplit(path)\n", + " reference = get_s3_objects(\n", + " bucket, key.lstrip(\"/\"),\n", + " re.compile(f\".tar.gz$\")\n", + " )\n", + " try:\n", + " reference = reference[0]\n", + " reference = os.path.join(\"s3://\", bucket, reference)\n", + " except AssertionError as err:\n", + " logging.warning(\"%s\\n\\t %s\", err, path)\n", + " return\n", + " return reference" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -687,7 +721,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 21, "metadata": {}, "outputs": [], "source": [ @@ -704,7 +738,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 22, "metadata": {}, "outputs": [], "source": [ @@ -721,7 +755,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 23, "metadata": {}, "outputs": [], "source": [ @@ -737,13 +771,6 @@ "outputs": [], "source": [] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, { "cell_type": "markdown", "metadata": {}, @@ -753,7 +780,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 26, "metadata": {}, "outputs": [ { @@ -783,33 +810,40 @@ " \n", " \n", " \n", - " YM-1704_Krt4eGFP\n", - " s3://dp-lab-data/collaborators/white...\n", - " 3845\n", + " PB-1709_EL3_Male\n", + " s3://dp-lab-data/collaborators/bayli...\n", + " 3842\n", " \n", " \n", - " YM-1704_Krt4TWIST\n", - " s3://dp-lab-data/collaborators/white...\n", - " 3846\n", + " PB-1709_EL3_Female\n", + " s3://dp-lab-data/collaborators/bayli...\n", + " 3843\n", + " \n", + " \n", + " PB-1709_Bsg25D\n", + " s3://dp-lab-data/collaborators/bayli...\n", + " 3844\n", " \n", " \n", "\n", "" ], "text/plain": [ - " S3_Path Sample_ID\n", - "YM-1704_Krt4eGFP s3://dp-lab-data/collaborators/white... 3845\n", - "YM-1704_Krt4TWIST s3://dp-lab-data/collaborators/white... 3846" + " S3_Path Sample_ID\n", + "PB-1709_EL3_Male s3://dp-lab-data/collaborators/bayli... 3842\n", + "PB-1709_EL3_Female s3://dp-lab-data/collaborators/bayli... 3843\n", + "PB-1709_Bsg25D s3://dp-lab-data/collaborators/bayli... 3844" ] }, - "execution_count": 25, + "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Common query col: id, request_id, Sample\n", - "request_ids = ['YM-1704', ]\n", + "# request_ids = ['YM-1704', ]\n", + "request_ids = ['PB-1709', ]\n", "\n", "samples = format_sample_aws(request_ids, 'request_id', creds)\n", "samples" @@ -817,7 +851,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 27, "metadata": {}, "outputs": [ { @@ -849,17 +883,24 @@ " \n", " \n", " \n", - " YM-1704_Krt4eGFP\n", - " s3://dp-lab-data/collaborators/white...\n", - " 3845\n", - " s3://dp-lab-data/collaborators/white...\n", + " PB-1709_EL3_Male\n", + " s3://dp-lab-data/collaborators/bayli...\n", + " 3842\n", + " s3://seqc-public/genomes/drosophila_...\n", + " CR\n", + " \n", + " \n", + " PB-1709_EL3_Female\n", + " s3://dp-lab-data/collaborators/bayli...\n", + " 3843\n", + " s3://seqc-public/genomes/drosophila_...\n", " CR\n", " \n", " \n", - " YM-1704_Krt4TWIST\n", - " s3://dp-lab-data/collaborators/white...\n", - " 3846\n", - " s3://dp-lab-data/collaborators/white...\n", + " PB-1709_Bsg25D\n", + " s3://dp-lab-data/collaborators/bayli...\n", + " 3844\n", + " s3://seqc-public/genomes/drosophila_...\n", " CR\n", " \n", " \n", @@ -867,16 +908,18 @@ "" ], "text/plain": [ - " S3_Path Sample_ID \\\n", - "YM-1704_Krt4eGFP s3://dp-lab-data/collaborators/white... 3845 \n", - "YM-1704_Krt4TWIST s3://dp-lab-data/collaborators/white... 3846 \n", + " S3_Path Sample_ID \\\n", + "PB-1709_EL3_Male s3://dp-lab-data/collaborators/bayli... 3842 \n", + "PB-1709_EL3_Female s3://dp-lab-data/collaborators/bayli... 3843 \n", + "PB-1709_Bsg25D s3://dp-lab-data/collaborators/bayli... 3844 \n", "\n", - " Reference assay \n", - "YM-1704_Krt4eGFP s3://dp-lab-data/collaborators/white... CR \n", - "YM-1704_Krt4TWIST s3://dp-lab-data/collaborators/white... CR " + " Reference assay \n", + "PB-1709_EL3_Male s3://seqc-public/genomes/drosophila_... CR \n", + "PB-1709_EL3_Female s3://seqc-public/genomes/drosophila_... CR \n", + "PB-1709_Bsg25D s3://seqc-public/genomes/drosophila_... CR " ] }, - "execution_count": 26, + "execution_count": 27, "metadata": {}, "output_type": "execute_result" } @@ -888,7 +931,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 28, "metadata": {}, "outputs": [ { @@ -921,18 +964,26 @@ " \n", " \n", " \n", - " YM-1704_Krt4eGFP\n", - " s3://dp-lab-data/collaborators/white...\n", - " 3845\n", - " s3://dp-lab-data/collaborators/white...\n", + " PB-1709_EL3_Male\n", + " s3://dp-lab-data/collaborators/bayli...\n", + " 3842\n", + " s3://seqc-public/genomes/drosophila_...\n", " CR\n", " {'I1': ['s3://dp-lab-data/collaborat...\n", " \n", " \n", - " YM-1704_Krt4TWIST\n", - " s3://dp-lab-data/collaborators/white...\n", - " 3846\n", - " s3://dp-lab-data/collaborators/white...\n", + " PB-1709_EL3_Female\n", + " s3://dp-lab-data/collaborators/bayli...\n", + " 3843\n", + " s3://seqc-public/genomes/drosophila_...\n", + " CR\n", + " {'I1': ['s3://dp-lab-data/collaborat...\n", + " \n", + " \n", + " PB-1709_Bsg25D\n", + " s3://dp-lab-data/collaborators/bayli...\n", + " 3844\n", + " s3://seqc-public/genomes/drosophila_...\n", " CR\n", " {'I1': ['s3://dp-lab-data/collaborat...\n", " \n", @@ -941,20 +992,23 @@ "" ], "text/plain": [ - " S3_Path Sample_ID \\\n", - "YM-1704_Krt4eGFP s3://dp-lab-data/collaborators/white... 3845 \n", - "YM-1704_Krt4TWIST s3://dp-lab-data/collaborators/white... 3846 \n", + " S3_Path Sample_ID \\\n", + "PB-1709_EL3_Male s3://dp-lab-data/collaborators/bayli... 3842 \n", + "PB-1709_EL3_Female s3://dp-lab-data/collaborators/bayli... 3843 \n", + "PB-1709_Bsg25D s3://dp-lab-data/collaborators/bayli... 3844 \n", "\n", - " Reference assay \\\n", - "YM-1704_Krt4eGFP s3://dp-lab-data/collaborators/white... CR \n", - "YM-1704_Krt4TWIST s3://dp-lab-data/collaborators/white... CR \n", + " Reference assay \\\n", + "PB-1709_EL3_Male s3://seqc-public/genomes/drosophila_... CR \n", + "PB-1709_EL3_Female s3://seqc-public/genomes/drosophila_... CR \n", + "PB-1709_Bsg25D s3://seqc-public/genomes/drosophila_... CR \n", "\n", - " FASTQs \n", - "YM-1704_Krt4eGFP {'I1': ['s3://dp-lab-data/collaborat... \n", - "YM-1704_Krt4TWIST {'I1': ['s3://dp-lab-data/collaborat... " + " FASTQs \n", + "PB-1709_EL3_Male {'I1': ['s3://dp-lab-data/collaborat... \n", + "PB-1709_EL3_Female {'I1': ['s3://dp-lab-data/collaborat... \n", + "PB-1709_Bsg25D {'I1': ['s3://dp-lab-data/collaborat... " ] }, - "execution_count": 27, + "execution_count": 28, "metadata": {}, "output_type": "execute_result" } @@ -967,40 +1021,53 @@ "samples" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "MAKE SURE THAT THE REFERENCE IS PUBLIC OTHERWISE THE JOB WILL FAIL\n", + "\n", + "ALSO MAKE SURE THAT YOU ARE PROVIDING THE `HTTPS` PATH, NOT S3" + ] + }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "# Set path to transgene reference S3\n", + "# Note: This is an exceptional case\n", + "# path_to_reference = f\"{common_dir}/transgene_reference/refdata-cellranger/3PS19_SNSEQ-GRCm38-Ensembl-87-transgenes.tar.gz\"\n", + "# path_to_reference = \"https://cf.10xgenomics.com/supp/cell-exp/refdata-gex-mm10-2020-A.tar.gz\"\n", + "# path_to_reference = 'https://dp-lab-data.s3.amazonaws.com/collaborators/whiter/YM-1704_transgene_reference/refdata-cellranger/Zebrafish_with_3_transgenes-GRCz11-Ensembl-106-transgenes.tar.gz'\n", + "path_to_reference = 'https://dp-lab-data.s3.amazonaws.com/genomes/drosophila_BDGP6-32-cellranger/BDGP6.32.genome.tar.gz'" + ] + }, + { + "cell_type": "code", + "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "array(['s3://dp-lab-data/collaborators/whiter/YM-1704_transgene_reference/refdata-cellranger/',\n", - " 's3://dp-lab-data/collaborators/whiter/YM-1704_transgene_reference/refdata-cellranger/'],\n", + "array(['https://dp-lab-data.s3.amazonaws.com/genomes/drosophila_BDGP6-32-cellranger/BDGP6.32.genome.tar.gz',\n", + " 'https://dp-lab-data.s3.amazonaws.com/genomes/drosophila_BDGP6-32-cellranger/BDGP6.32.genome.tar.gz',\n", + " 'https://dp-lab-data.s3.amazonaws.com/genomes/drosophila_BDGP6-32-cellranger/BDGP6.32.genome.tar.gz'],\n", " dtype=object)" ] }, - "execution_count": 28, + "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ + "samples['Reference'] = path_to_reference\n", "samples['Reference'].values" ] }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "# Set path to transgene reference S3\n", - "# Note: This is an exceptional case\n", - "# path_to_reference = f\"{common_dir}/transgene_reference/refdata-cellranger/3PS19_SNSEQ-GRCm38-Ensembl-87-transgenes.tar.gz\"\n", - "# path_to_reference = \"https://cf.10xgenomics.com/supp/cell-exp/refdata-gex-mm10-2020-A.tar.gz\"" - ] - }, { "cell_type": "code", "execution_count": null, @@ -1017,7 +1084,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 31, "metadata": {}, "outputs": [ { @@ -1053,7 +1120,18 @@ " \n", " \n", " \n", - " YM-1704_Krt4eGFP\n", + " PB-1709_EL3_Male\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " \n", + " \n", + " PB-1709_EL3_Female\n", " NaN\n", " NaN\n", " NaN\n", @@ -1064,7 +1142,7 @@ " NaN\n", " \n", " \n", - " YM-1704_Krt4TWIST\n", + " PB-1709_Bsg25D\n", " NaN\n", " NaN\n", " NaN\n", @@ -1079,24 +1157,28 @@ "" ], "text/plain": [ - " CellRangerGex.sampleName CellRangerGex.fastqName \\\n", - "YM-1704_Krt4eGFP NaN NaN \n", - "YM-1704_Krt4TWIST NaN NaN \n", + " CellRangerGex.sampleName CellRangerGex.fastqName \\\n", + "PB-1709_EL3_Male NaN NaN \n", + "PB-1709_EL3_Female NaN NaN \n", + "PB-1709_Bsg25D NaN NaN \n", "\n", - " CellRangerGex.inputFastq CellRangerGex.referenceUrl \\\n", - "YM-1704_Krt4eGFP NaN NaN \n", - "YM-1704_Krt4TWIST NaN NaN \n", + " CellRangerGex.inputFastq CellRangerGex.referenceUrl \\\n", + "PB-1709_EL3_Male NaN NaN \n", + "PB-1709_EL3_Female NaN NaN \n", + "PB-1709_Bsg25D NaN NaN \n", "\n", - " CellRangerGex.includeIntrons CellRangerGex.expectCells \\\n", - "YM-1704_Krt4eGFP NaN NaN \n", - "YM-1704_Krt4TWIST NaN NaN \n", + " CellRangerGex.includeIntrons CellRangerGex.expectCells \\\n", + "PB-1709_EL3_Male NaN NaN \n", + "PB-1709_EL3_Female NaN NaN \n", + "PB-1709_Bsg25D NaN NaN \n", "\n", - " CellRangerGex.memory CellRangerGex.dockerRegistry \n", - "YM-1704_Krt4eGFP NaN NaN \n", - "YM-1704_Krt4TWIST NaN NaN " + " CellRangerGex.memory CellRangerGex.dockerRegistry \n", + "PB-1709_EL3_Male NaN NaN \n", + "PB-1709_EL3_Female NaN NaN \n", + "PB-1709_Bsg25D NaN NaN " ] }, - "execution_count": 30, + "execution_count": 31, "metadata": {}, "output_type": "execute_result" } @@ -1114,7 +1196,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 32, "metadata": {}, "outputs": [ { @@ -1150,22 +1232,33 @@ " \n", " \n", " \n", - " YM-1704_Krt4eGFP\n", - " YM-1704_Krt4eGFP\n", - " 3845_YM-1704_Krt4eGFP_IGO_12437_AO_37\n", - " [s3://dp-lab-data/collaborators/whit...\n", - " s3://dp-lab-data/collaborators/white...\n", + " PB-1709_EL3_Male\n", + " PB-1709_EL3_Male\n", + " 3842_PB-1709_EL3_Male_IGO_12437_AO_42\n", + " [s3://dp-lab-data/collaborators/bayl...\n", + " https://dp-lab-data.s3.amazonaws.com...\n", + " False\n", + " 5000\n", + " 256\n", + " quay.io/hisplan\n", + " \n", + " \n", + " PB-1709_EL3_Female\n", + " PB-1709_EL3_Female\n", + " 3843_PB-1709_EL3_Female_IGO_12437_AO_41\n", + " [s3://dp-lab-data/collaborators/bayl...\n", + " https://dp-lab-data.s3.amazonaws.com...\n", " False\n", " 5000\n", " 256\n", " quay.io/hisplan\n", " \n", " \n", - " YM-1704_Krt4TWIST\n", - " YM-1704_Krt4TWIST\n", - " 3846_YM-1704_Krt4TWIST_IGO_12437_AO_38\n", - " [s3://dp-lab-data/collaborators/whit...\n", - " s3://dp-lab-data/collaborators/white...\n", + " PB-1709_Bsg25D\n", + " PB-1709_Bsg25D\n", + " 3844_PB-1709_Bsg25D_IGO_12437_AO_43\n", + " [s3://dp-lab-data/collaborators/bayl...\n", + " https://dp-lab-data.s3.amazonaws.com...\n", " False\n", " 5000\n", " 256\n", @@ -1176,32 +1269,38 @@ "" ], "text/plain": [ - " CellRangerGex.sampleName \\\n", - "YM-1704_Krt4eGFP YM-1704_Krt4eGFP \n", - "YM-1704_Krt4TWIST YM-1704_Krt4TWIST \n", + " CellRangerGex.sampleName \\\n", + "PB-1709_EL3_Male PB-1709_EL3_Male \n", + "PB-1709_EL3_Female PB-1709_EL3_Female \n", + "PB-1709_Bsg25D PB-1709_Bsg25D \n", "\n", - " CellRangerGex.fastqName \\\n", - "YM-1704_Krt4eGFP 3845_YM-1704_Krt4eGFP_IGO_12437_AO_37 \n", - "YM-1704_Krt4TWIST 3846_YM-1704_Krt4TWIST_IGO_12437_AO_38 \n", + " CellRangerGex.fastqName \\\n", + "PB-1709_EL3_Male 3842_PB-1709_EL3_Male_IGO_12437_AO_42 \n", + "PB-1709_EL3_Female 3843_PB-1709_EL3_Female_IGO_12437_AO_41 \n", + "PB-1709_Bsg25D 3844_PB-1709_Bsg25D_IGO_12437_AO_43 \n", "\n", - " CellRangerGex.inputFastq \\\n", - "YM-1704_Krt4eGFP [s3://dp-lab-data/collaborators/whit... \n", - "YM-1704_Krt4TWIST [s3://dp-lab-data/collaborators/whit... \n", + " CellRangerGex.inputFastq \\\n", + "PB-1709_EL3_Male [s3://dp-lab-data/collaborators/bayl... \n", + "PB-1709_EL3_Female [s3://dp-lab-data/collaborators/bayl... \n", + "PB-1709_Bsg25D [s3://dp-lab-data/collaborators/bayl... \n", "\n", - " CellRangerGex.referenceUrl \\\n", - "YM-1704_Krt4eGFP s3://dp-lab-data/collaborators/white... \n", - "YM-1704_Krt4TWIST s3://dp-lab-data/collaborators/white... \n", + " CellRangerGex.referenceUrl \\\n", + "PB-1709_EL3_Male https://dp-lab-data.s3.amazonaws.com... \n", + "PB-1709_EL3_Female https://dp-lab-data.s3.amazonaws.com... \n", + "PB-1709_Bsg25D https://dp-lab-data.s3.amazonaws.com... \n", "\n", - " CellRangerGex.includeIntrons CellRangerGex.expectCells \\\n", - "YM-1704_Krt4eGFP False 5000 \n", - "YM-1704_Krt4TWIST False 5000 \n", + " CellRangerGex.includeIntrons CellRangerGex.expectCells \\\n", + "PB-1709_EL3_Male False 5000 \n", + "PB-1709_EL3_Female False 5000 \n", + "PB-1709_Bsg25D False 5000 \n", "\n", - " CellRangerGex.memory CellRangerGex.dockerRegistry \n", - "YM-1704_Krt4eGFP 256 quay.io/hisplan \n", - "YM-1704_Krt4TWIST 256 quay.io/hisplan " + " CellRangerGex.memory CellRangerGex.dockerRegistry \n", + "PB-1709_EL3_Male 256 quay.io/hisplan \n", + "PB-1709_EL3_Female 256 quay.io/hisplan \n", + "PB-1709_Bsg25D 256 quay.io/hisplan " ] }, - "execution_count": 31, + "execution_count": 32, "metadata": {}, "output_type": "execute_result" } @@ -1220,6 +1319,29 @@ "inputs" ] }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array(['https://dp-lab-data.s3.amazonaws.com/genomes/drosophila_BDGP6-32-cellranger/BDGP6.32.genome.tar.gz',\n", + " 'https://dp-lab-data.s3.amazonaws.com/genomes/drosophila_BDGP6-32-cellranger/BDGP6.32.genome.tar.gz',\n", + " 'https://dp-lab-data.s3.amazonaws.com/genomes/drosophila_BDGP6-32-cellranger/BDGP6.32.genome.tar.gz'],\n", + " dtype=object)" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "inputs[f\"{prefix}.referenceUrl\"].values" + ] + }, { "cell_type": "code", "execution_count": null, @@ -1236,7 +1358,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 34, "metadata": {}, "outputs": [ { @@ -1271,7 +1393,7 @@ " \n", " \n", " \n", - " YM-1704_Krt4eGFP\n", + " PB-1709_EL3_Male\n", " NaN\n", " NaN\n", " NaN\n", @@ -1281,7 +1403,17 @@ " NaN\n", " \n", " \n", - " YM-1704_Krt4TWIST\n", + " PB-1709_EL3_Female\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " NaN\n", + " \n", + " \n", + " PB-1709_Bsg25D\n", " NaN\n", " NaN\n", " NaN\n", @@ -1295,16 +1427,18 @@ "" ], "text/plain": [ - " pipelineType project sample owner destination transfer \\\n", - "YM-1704_Krt4eGFP NaN NaN NaN NaN NaN NaN \n", - "YM-1704_Krt4TWIST NaN NaN NaN NaN NaN NaN \n", + " pipelineType project sample owner destination transfer \\\n", + "PB-1709_EL3_Male NaN NaN NaN NaN NaN NaN \n", + "PB-1709_EL3_Female NaN NaN NaN NaN NaN NaN \n", + "PB-1709_Bsg25D NaN NaN NaN NaN NaN NaN \n", "\n", - " comment \n", - "YM-1704_Krt4eGFP NaN \n", - "YM-1704_Krt4TWIST NaN " + " comment \n", + "PB-1709_EL3_Male NaN \n", + "PB-1709_EL3_Female NaN \n", + "PB-1709_Bsg25D NaN " ] }, - "execution_count": 32, + "execution_count": 34, "metadata": {}, "output_type": "execute_result" } @@ -1320,7 +1454,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 35, "metadata": {}, "outputs": [ { @@ -1355,22 +1489,32 @@ " \n", " \n", " \n", - " YM-1704_Krt4eGFP\n", + " PB-1709_EL3_Male\n", + " CellRangerGex\n", + " Single myonucleus RNAseq\n", + " PB-1709_EL3_Male\n", + " sohailn\n", + " s3://dp-lab-data/collaborators/bayli...\n", + " -\n", + " sohailn\n", + " \n", + " \n", + " PB-1709_EL3_Female\n", " CellRangerGex\n", - " Zebrafish KC-MC\n", - " YM-1704_Krt4eGFP\n", + " Single myonucleus RNAseq\n", + " PB-1709_EL3_Female\n", " sohailn\n", - " s3://dp-lab-data/collaborators/white...\n", + " s3://dp-lab-data/collaborators/bayli...\n", " -\n", " sohailn\n", " \n", " \n", - " YM-1704_Krt4TWIST\n", + " PB-1709_Bsg25D\n", " CellRangerGex\n", - " Zebrafish KC-MC\n", - " YM-1704_Krt4TWIST\n", + " Single myonucleus RNAseq\n", + " PB-1709_Bsg25D\n", " sohailn\n", - " s3://dp-lab-data/collaborators/white...\n", + " s3://dp-lab-data/collaborators/bayli...\n", " -\n", " sohailn\n", " \n", @@ -1379,16 +1523,23 @@ "" ], "text/plain": [ - " pipelineType project sample owner \\\n", - "YM-1704_Krt4eGFP CellRangerGex Zebrafish KC-MC YM-1704_Krt4eGFP sohailn \n", - "YM-1704_Krt4TWIST CellRangerGex Zebrafish KC-MC YM-1704_Krt4TWIST sohailn \n", + " pipelineType project \\\n", + "PB-1709_EL3_Male CellRangerGex Single myonucleus RNAseq \n", + "PB-1709_EL3_Female CellRangerGex Single myonucleus RNAseq \n", + "PB-1709_Bsg25D CellRangerGex Single myonucleus RNAseq \n", "\n", - " destination transfer comment \n", - "YM-1704_Krt4eGFP s3://dp-lab-data/collaborators/white... - sohailn \n", - "YM-1704_Krt4TWIST s3://dp-lab-data/collaborators/white... - sohailn " + " sample owner \\\n", + "PB-1709_EL3_Male PB-1709_EL3_Male sohailn \n", + "PB-1709_EL3_Female PB-1709_EL3_Female sohailn \n", + "PB-1709_Bsg25D PB-1709_Bsg25D sohailn \n", + "\n", + " destination transfer comment \n", + "PB-1709_EL3_Male s3://dp-lab-data/collaborators/bayli... - sohailn \n", + "PB-1709_EL3_Female s3://dp-lab-data/collaborators/bayli... - sohailn \n", + "PB-1709_Bsg25D s3://dp-lab-data/collaborators/bayli... - sohailn " ] }, - "execution_count": 33, + "execution_count": 35, "metadata": {}, "output_type": "execute_result" } @@ -1419,9 +1570,16 @@ "## Execution" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Make sure to check that your FASTQ files aren't archived, otherwise your job will fail" + ] + }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 36, "metadata": {}, "outputs": [ { @@ -1457,22 +1615,33 @@ " \n", " \n", " \n", - " YM-1704_Krt4eGFP\n", - " YM-1704_Krt4eGFP\n", - " 3845_YM-1704_Krt4eGFP_IGO_12437_AO_37\n", - " [s3://dp-lab-data/collaborators/whit...\n", - " s3://dp-lab-data/collaborators/white...\n", + " PB-1709_EL3_Male\n", + " PB-1709_EL3_Male\n", + " 3842_PB-1709_EL3_Male_IGO_12437_AO_42\n", + " [s3://dp-lab-data/collaborators/bayl...\n", + " https://dp-lab-data.s3.amazonaws.com...\n", + " False\n", + " 5000\n", + " 256\n", + " quay.io/hisplan\n", + " \n", + " \n", + " PB-1709_EL3_Female\n", + " PB-1709_EL3_Female\n", + " 3843_PB-1709_EL3_Female_IGO_12437_AO_41\n", + " [s3://dp-lab-data/collaborators/bayl...\n", + " https://dp-lab-data.s3.amazonaws.com...\n", " False\n", " 5000\n", " 256\n", " quay.io/hisplan\n", " \n", " \n", - " YM-1704_Krt4TWIST\n", - " YM-1704_Krt4TWIST\n", - " 3846_YM-1704_Krt4TWIST_IGO_12437_AO_38\n", - " [s3://dp-lab-data/collaborators/whit...\n", - " s3://dp-lab-data/collaborators/white...\n", + " PB-1709_Bsg25D\n", + " PB-1709_Bsg25D\n", + " 3844_PB-1709_Bsg25D_IGO_12437_AO_43\n", + " [s3://dp-lab-data/collaborators/bayl...\n", + " https://dp-lab-data.s3.amazonaws.com...\n", " False\n", " 5000\n", " 256\n", @@ -1483,32 +1652,38 @@ "" ], "text/plain": [ - " CellRangerGex.sampleName \\\n", - "YM-1704_Krt4eGFP YM-1704_Krt4eGFP \n", - "YM-1704_Krt4TWIST YM-1704_Krt4TWIST \n", + " CellRangerGex.sampleName \\\n", + "PB-1709_EL3_Male PB-1709_EL3_Male \n", + "PB-1709_EL3_Female PB-1709_EL3_Female \n", + "PB-1709_Bsg25D PB-1709_Bsg25D \n", "\n", - " CellRangerGex.fastqName \\\n", - "YM-1704_Krt4eGFP 3845_YM-1704_Krt4eGFP_IGO_12437_AO_37 \n", - "YM-1704_Krt4TWIST 3846_YM-1704_Krt4TWIST_IGO_12437_AO_38 \n", + " CellRangerGex.fastqName \\\n", + "PB-1709_EL3_Male 3842_PB-1709_EL3_Male_IGO_12437_AO_42 \n", + "PB-1709_EL3_Female 3843_PB-1709_EL3_Female_IGO_12437_AO_41 \n", + "PB-1709_Bsg25D 3844_PB-1709_Bsg25D_IGO_12437_AO_43 \n", "\n", - " CellRangerGex.inputFastq \\\n", - "YM-1704_Krt4eGFP [s3://dp-lab-data/collaborators/whit... \n", - "YM-1704_Krt4TWIST [s3://dp-lab-data/collaborators/whit... \n", + " CellRangerGex.inputFastq \\\n", + "PB-1709_EL3_Male [s3://dp-lab-data/collaborators/bayl... \n", + "PB-1709_EL3_Female [s3://dp-lab-data/collaborators/bayl... \n", + "PB-1709_Bsg25D [s3://dp-lab-data/collaborators/bayl... \n", "\n", - " CellRangerGex.referenceUrl \\\n", - "YM-1704_Krt4eGFP s3://dp-lab-data/collaborators/white... \n", - "YM-1704_Krt4TWIST s3://dp-lab-data/collaborators/white... \n", + " CellRangerGex.referenceUrl \\\n", + "PB-1709_EL3_Male https://dp-lab-data.s3.amazonaws.com... \n", + "PB-1709_EL3_Female https://dp-lab-data.s3.amazonaws.com... \n", + "PB-1709_Bsg25D https://dp-lab-data.s3.amazonaws.com... \n", "\n", - " CellRangerGex.includeIntrons CellRangerGex.expectCells \\\n", - "YM-1704_Krt4eGFP False 5000 \n", - "YM-1704_Krt4TWIST False 5000 \n", + " CellRangerGex.includeIntrons CellRangerGex.expectCells \\\n", + "PB-1709_EL3_Male False 5000 \n", + "PB-1709_EL3_Female False 5000 \n", + "PB-1709_Bsg25D False 5000 \n", "\n", - " CellRangerGex.memory CellRangerGex.dockerRegistry \n", - "YM-1704_Krt4eGFP 256 quay.io/hisplan \n", - "YM-1704_Krt4TWIST 256 quay.io/hisplan " + " CellRangerGex.memory CellRangerGex.dockerRegistry \n", + "PB-1709_EL3_Male 256 quay.io/hisplan \n", + "PB-1709_EL3_Female 256 quay.io/hisplan \n", + "PB-1709_Bsg25D 256 quay.io/hisplan " ] }, - "execution_count": 34, + "execution_count": 36, "metadata": {}, "output_type": "execute_result" } @@ -1519,7 +1694,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 37, "metadata": {}, "outputs": [ { @@ -1554,22 +1729,32 @@ " \n", " \n", " \n", - " YM-1704_Krt4eGFP\n", + " PB-1709_EL3_Male\n", + " CellRangerGex\n", + " Single myonucleus RNAseq\n", + " PB-1709_EL3_Male\n", + " sohailn\n", + " s3://dp-lab-data/collaborators/bayli...\n", + " -\n", + " sohailn\n", + " \n", + " \n", + " PB-1709_EL3_Female\n", " CellRangerGex\n", - " Zebrafish KC-MC\n", - " YM-1704_Krt4eGFP\n", + " Single myonucleus RNAseq\n", + " PB-1709_EL3_Female\n", " sohailn\n", - " s3://dp-lab-data/collaborators/white...\n", + " s3://dp-lab-data/collaborators/bayli...\n", " -\n", " sohailn\n", " \n", " \n", - " YM-1704_Krt4TWIST\n", + " PB-1709_Bsg25D\n", " CellRangerGex\n", - " Zebrafish KC-MC\n", - " YM-1704_Krt4TWIST\n", + " Single myonucleus RNAseq\n", + " PB-1709_Bsg25D\n", " sohailn\n", - " s3://dp-lab-data/collaborators/white...\n", + " s3://dp-lab-data/collaborators/bayli...\n", " -\n", " sohailn\n", " \n", @@ -1578,16 +1763,23 @@ "" ], "text/plain": [ - " pipelineType project sample owner \\\n", - "YM-1704_Krt4eGFP CellRangerGex Zebrafish KC-MC YM-1704_Krt4eGFP sohailn \n", - "YM-1704_Krt4TWIST CellRangerGex Zebrafish KC-MC YM-1704_Krt4TWIST sohailn \n", + " pipelineType project \\\n", + "PB-1709_EL3_Male CellRangerGex Single myonucleus RNAseq \n", + "PB-1709_EL3_Female CellRangerGex Single myonucleus RNAseq \n", + "PB-1709_Bsg25D CellRangerGex Single myonucleus RNAseq \n", "\n", - " destination transfer comment \n", - "YM-1704_Krt4eGFP s3://dp-lab-data/collaborators/white... - sohailn \n", - "YM-1704_Krt4TWIST s3://dp-lab-data/collaborators/white... - sohailn " + " sample owner \\\n", + "PB-1709_EL3_Male PB-1709_EL3_Male sohailn \n", + "PB-1709_EL3_Female PB-1709_EL3_Female sohailn \n", + "PB-1709_Bsg25D PB-1709_Bsg25D sohailn \n", + "\n", + " destination transfer comment \n", + "PB-1709_EL3_Male s3://dp-lab-data/collaborators/bayli... - sohailn \n", + "PB-1709_EL3_Female s3://dp-lab-data/collaborators/bayli... - sohailn \n", + "PB-1709_Bsg25D s3://dp-lab-data/collaborators/bayli... - sohailn " ] }, - "execution_count": 35, + "execution_count": 37, "metadata": {}, "output_type": "execute_result" } @@ -1598,18 +1790,18 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "f962aaaf40e844d7af60fae27922c2cc", + "model_id": "f4050c0bd3114cbfa42bdcb5f25ea41f", "version_major": 2, "version_minor": 0 }, "text/plain": [ - " 0%| | 0/2 [00:00 Date: Thu, 9 Jun 2022 21:26:15 -0400 Subject: [PATCH 07/16] Initial rough CR VDJ notebook --- notebooks/Run_CellRangerVdj.ipynb | 2401 +++++++++++++++++++++++++++++ 1 file changed, 2401 insertions(+) create mode 100644 notebooks/Run_CellRangerVdj.ipynb diff --git a/notebooks/Run_CellRangerVdj.ipynb b/notebooks/Run_CellRangerVdj.ipynb new file mode 100644 index 0000000..ad418e9 --- /dev/null +++ b/notebooks/Run_CellRangerVdj.ipynb @@ -0,0 +1,2401 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "e799a381-2d5f-4497-bbc4-99df4f1c0370", + "metadata": {}, + "outputs": [], + "source": [ + "import re, subprocess, boto3, json, shlex, mysql, os, urllib, logging\n", + "import pandas as pd\n", + "import numpy as np\n", + "from s3path import S3Path\n", + "from pathlib import Path\n", + "from tqdm.notebook import tqdm\n", + "from packaging import version\n", + "pd.set_option(\"display.max_colwidth\", 40)" + ] + }, + { + "cell_type": "markdown", + "id": "f82a05bc-cc8a-4d55-b7fe-9513f475077c", + "metadata": { + "tags": [], + "toc-hr-collapsed": true + }, + "source": [ + "# Define Helper Functions" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "c8f9ae8c-dc67-4a8e-a3f7-dc21eddb54e2", + "metadata": {}, + "outputs": [], + "source": [ + "# FASTQ reads/indices required for each workflow\n", + "fastq_map = {\n", + " 'CellRangerVdj': ['I1','R1','R2'],\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "c8ab0226-5393-411a-88c0-3f8b154b6c8f", + "metadata": {}, + "outputs": [], + "source": [ + "# Get fastq file paths on S3 for each file id\n", + "# Returns dictionary from id to s3 path\n", + "# Throws exception if FASTQs don't exist for any id\n", + "def get_fastqs(\n", + " path: str, # path to directory containing FASTQ files\n", + " fastq_file_ids: list, # FASTQ file ids needed for this run type (e.g. I1, R1, R2, etc.)\n", + " folder: str = \"\",\n", + "):\n", + " fastq_map = dict()\n", + " _, bucket, key, _, _ = urllib.parse.urlsplit(f\"{path}/{folder}\")\n", + " for fid in fastq_file_ids:\n", + " files = get_s3_objects(\n", + " bucket, key.lstrip(\"/\"),\n", + " re.compile(f\"_{fid}_\\d{{3}}.fastq.gz$\")\n", + " )\n", + " try:\n", + " assert files, f\"AssertionError: Missing `{fid}` archives!\"\n", + " fastq_map[fid] = [os.path.join(\"s3://\", bucket, str(f)) for f in files]\n", + " except AssertionError as err:\n", + " logging.warning(\"%s\\n\\t %s\", err, path)\n", + " return\n", + " return fastq_map" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "e555cf05-fde7-4875-b4c5-46436c9a42ec", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# from SCRIdb\n", + "def get_s3_objects(bucket, key, pattern, full_uri=False):\n", + " \n", + " s3r = boto3.resource(\"s3\")\n", + " bucket_s3 = s3r.Bucket(bucket)\n", + " objects = []\n", + " for obj in bucket_s3.objects.filter(Prefix=key):\n", + " hit = pattern.search(obj.key)\n", + " if hit:\n", + " objects.append(obj.key)\n", + " if full_uri:\n", + " objects = [f\"s3://{bucket}/{o}\" for o in objects]\n", + " return objects" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "18e8874c-f137-4afb-8b40-68fe9fb896d1", + "metadata": {}, + "outputs": [], + "source": [ + "# Extract FASTQ sample name from list of files\n", + "# Note: FASTQ name is file name up to lane id (e.g. L001, L002, etc.)\n", + "def get_fastqs_name(fastqs):\n", + " fastq_name_re = r\".*/(.*)_S\\d+_L\\d{3}_[A-Za-z]\\d_\\d{3}.fastq.gz$\"\n", + " fastq_names = [re.match(fastq_name_re, x)[1] for x in fastqs]\n", + " assert len(set(fastq_names)) == 1 # make sure all names are same\n", + " return fastq_names[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "2e8688b7-ec81-4414-88dc-34d91ecb411a", + "metadata": {}, + "outputs": [], + "source": [ + "# Numpy encoder for JSON from pandas series\n", + "class NpEncoder(json.JSONEncoder):\n", + " def default(self, obj):\n", + " if isinstance(obj, np.integer):\n", + " return int(obj)\n", + " elif isinstance(obj, np.floating):\n", + " return float(obj)\n", + " elif isinstance(obj, np.ndarray):\n", + " return obj.tolist()\n", + " else:\n", + " return super(NpEncoder, self).default(obj)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "33af155b-7eab-4a73-ae3f-e818a412a316", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def execute_query(query, user, password):\n", + " with connect(\n", + " host=\"peer-lab-db.cggxmlwgzzpw.us-east-1.rds.amazonaws.com\",\n", + " database=\"peer_lab_db\",\n", + " user=user,\n", + " password=password,\n", + " ) as connection:\n", + " with connection.cursor(buffered=True) as cursor:\n", + " cursor.execute(query)\n", + " result = cursor.fetchall()\n", + " return result" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "3040e204-9470-465a-863d-6f4a297a1637", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# Get species from database for given sample\n", + "from mysql.connector import connect, Error\n", + "\n", + "def get_species(sample_id, user, password):\n", + " try:\n", + " table_sample_data = \"peer_lab_db.sample_data\"\n", + " table_species = \"peer_lab_db.species\"\n", + " table_genome_idx = \"peer_lab_db.genome_index\"\n", + " query = f\"\"\"\n", + " SELECT {table_species}.Species\n", + " FROM {table_species}\n", + " LEFT JOIN {table_genome_idx}\n", + " ON {table_species}.id = {table_genome_idx}.species_id\n", + " LEFT JOIN {table_sample_data}\n", + " ON {table_genome_idx}.id = {table_sample_data}.genomeIndex_id\n", + " WHERE {table_sample_data}.id = {sample_id}\n", + " \"\"\"\n", + " result = execute_query(query, user, password)[0][0]\n", + " return result\n", + " except Error as e:\n", + " print(f\"Error: {e}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "f214cb46-2889-483b-bb00-ed65b9b96125", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# Get species from database for given sample\n", + "from mysql.connector import connect, Error\n", + "\n", + "def get_sc_tech(sample_id, user, password):\n", + " try:\n", + " table_sample_data = \"peer_lab_db.sample_data\"\n", + " table_sc_tech = \"peer_lab_db.sc_tech\"\n", + " table_genome_idx = \"peer_lab_db.genome_index\"\n", + " query = f\"\"\"\n", + " SELECT {table_sc_tech}.sc_Tech\n", + " FROM {table_sc_tech}\n", + " LEFT JOIN {table_genome_idx}\n", + " ON {table_sc_tech}.id = {table_genome_idx}.scTech_id\n", + " LEFT JOIN {table_sample_data}\n", + " ON {table_genome_idx}.id = {table_sample_data}.genomeIndex_id\n", + " WHERE {table_sample_data}.id = {sample_id}\n", + " \"\"\"\n", + " result = execute_query(query, user, password)[0][0]\n", + " return result\n", + " except Error as e:\n", + " print(f\"Error: {e}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "9be132ae-a9c7-46fd-bb1c-04358f4b7d34", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# Get species from database for given sample\n", + "from mysql.connector import connect, Error\n", + "\n", + "def get_sample_id(sample_name, user, password):\n", + " try:\n", + " table_sample_data = \"peer_lab_db.sample_data\"\n", + " query = f\"\"\"\n", + " SELECT {table_sample_data}.id\n", + " FROM {table_sample_data}\n", + " WHERE {table_sample_data}.Sample=\"{sample_name}\"\n", + " \"\"\"\n", + " result = execute_query(query, user, password)[0][0]\n", + " return result\n", + " except Error as e:\n", + " print(f\"Error: {e}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "ef099bfd-ee43-4dce-bc55-3045e9f4e9b7", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# Get species from database for given sample\n", + "from mysql.connector import connect, Error\n", + "\n", + "def get_project_id(sample_id, user, password):\n", + " try:\n", + " table_sample_data = \"peer_lab_db.sample_data\"\n", + " table_project_data = \"peer_lab_db.project_data\"\n", + " query = f\"\"\"\n", + " SELECT {table_project_data}.projectName\n", + " FROM {table_project_data}\n", + " LEFT JOIN {table_sample_data}\n", + " ON {table_project_data}.id = {table_sample_data}.projectData_id\n", + " WHERE {table_sample_data}.id = {sample_id}\n", + " \"\"\"\n", + " result = execute_query(query, user, password)[0][0]\n", + " return result\n", + " except Error as e:\n", + " print(f\"Error: {e}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "865f4379-343e-4010-9d76-eb7357f9beae", + "metadata": {}, + "outputs": [], + "source": [ + "def get_SEQC_version(loc):\n", + " try:\n", + " cmd = f\"aws s3 cp {loc}/seqc-results/seqc_log.txt -\"\n", + " out = subprocess.run(shlex.split(cmd), universal_newlines=True, capture_output=True).__dict__[\"stdout\"]\n", + " version = re.match(r\".*SEQC=v(\\d+\\.\\d+\\.\\d+).*\", out)[1]\n", + " return version\n", + " except:\n", + " return \"N/A\"" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "0511ae48-826d-463d-b3a3-b080b6fd2d51", + "metadata": {}, + "outputs": [], + "source": [ + "def get_file_prefix(loc):\n", + " try:\n", + " cmd = f\"aws s3 ls {loc}/seqc-results/\"\n", + " out = subprocess.run(shlex.split(cmd), universal_newlines=True, capture_output=True).__dict__[\"stdout\"]\n", + " \n", + " # Note: I'm expecting the aligned bam file to be in loc\n", + " bam_pattern = re.compile(r\"(.*)_Aligned\\.out\\.bam$\")\n", + " filename = list(filter(bam_pattern.match, out.split()))[0]\n", + " file_prefix = re.match(bam_pattern, filename)[1]\n", + " return file_prefix\n", + " except:\n", + " raise ValueError(f\"BAM file not found in {loc}\")\n", + " return \"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "0c0c8d18-97f8-4ca9-8de8-7d5f0d837b1d", + "metadata": {}, + "outputs": [], + "source": [ + "# FASTQ reads/indices required for each workflow\n", + "# Shoudl replace with JSON file\n", + "cr_reference_map = {\n", + " 'CellRangerArc':\n", + " {\n", + " 'Human': \"https://cf.10xgenomics.com/supp/cell-arc/refdata-cellranger-arc-GRCh38-2020-A.tar.gz\",\n", + " 'Mouse': \"https://cf.10xgenomics.com/supp/cell-arc/refdata-cellranger-arc-mm10-2020-A-2.0.0.tar.gz\",\n", + " },\n", + " 'CellRangerATAC':\n", + " {\n", + " 'Human': \"https://cf.10xgenomics.com/supp/cell-atac/refdata-cellranger-arc-GRCh38-2020-A-2.0.0.tar.gz\",\n", + " 'Mouse': \"https://cf.10xgenomics.com/supp/cell-atac/refdata-cellranger-arc-mm10-2020-A-2.0.0.tar.gz\",\n", + " },\n", + " 'CellRangerGex':\n", + " {\n", + " 'Human': \"https://cf.10xgenomics.com/supp/cell-exp/refdata-gex-GRCh38-2020-A.tar.gz\",\n", + " 'Mouse': \"https://cf.10xgenomics.com/supp/cell-exp/refdata-gex-mm10-2020-A.tar.gz\",\n", + " },\n", + " 'CellRangerVdj':\n", + " {\n", + " 'Human': \"GRCh38\"\n", + " },\n", + "}\n", + "\n", + "def get_cr_reference(sample_id, prefix, user, password):\n", + " # Get species from database to decide reference\n", + " species = get_species(sample_id, user, password)\n", + " \n", + " # Map to reference locations\n", + " try:\n", + " return cr_reference_map[prefix][species]\n", + " except:\n", + " raise ValueError(f\"Unknown Species: {species}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "bf3f9f33-b976-4d11-897b-79199a7e1068", + "metadata": {}, + "outputs": [], + "source": [ + "def get_bc_whitelist(sample_id):\n", + " # Get version from database to decide whitelist\n", + " sc_tech = get_sc_tech(sample_id, creds[\"user\"], creds[\"password\"])\n", + " \n", + " # Map to reference locations\n", + " if \"V3\" in sc_tech:\n", + " return \"s3://seqc-public/barcodes/ten_x_v3/flat/3M-february-2018.txt\"\n", + " elif \"V2\" in sc_tech:\n", + " return \"s3://seqc-public/barcodes/ten_x_v2/flat/737K-august-2016.txt\"\n", + " else:\n", + " raise ValueError(f\"Unknown Technology: {sc_tech}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "c53b08e4-73fb-4fc6-85f6-cb7e6292d000", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def run(\n", + " workflow_path: str,\n", + " execp: str,\n", + " secrets: str,\n", + " inputs: str,\n", + " labels: str,\n", + " options: str,\n", + "):\n", + " # change working directory to the pipeline package\n", + " oldwd = os.getcwd()\n", + " os.chdir(workflow_path)\n", + " \n", + " # execute the pipeline command\n", + " cmd = f\"{workflow_path}/{execp} -k {secrets} -i {inputs} -l {labels} -o {options}\"\n", + " var = subprocess.run(shlex.split(cmd), universal_newlines=True, capture_output=True)\n", + " out = var.__dict__\n", + " \n", + " # change working directory back\n", + " os.chdir(oldwd)\n", + " \n", + " return out" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "80414572-8a8e-44a8-ada1-3b636086da98", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "3c47d694-4856-42e3-8458-68708048ca30", + "metadata": { + "tags": [] + }, + "source": [ + "## Additional functions" + ] + }, + { + "cell_type": "markdown", + "id": "6b389052-37ff-49b0-90e7-473c3725f0d6", + "metadata": { + "tags": [] + }, + "source": [ + "### DB query" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "68bd2fa1-53e2-41aa-8f8e-da549db23f97", + "metadata": {}, + "outputs": [], + "source": [ + "# Common query col: id, request_id, Sample\n", + "def get_sample_name(query, query_col, creds):\n", + " \n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.sample_data\"\n", + " query = f\"\"\"\n", + " SELECT {table_sample_data}.Sample\n", + " FROM {table_sample_data}\n", + " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", + " \"\"\"\n", + " sample_names = []\n", + " results = execute_query(query, user, password)\n", + " for result in results:\n", + " sample_names.append(result[0])\n", + " return sample_names\n", + " except Error as e:\n", + " print(f\"Error: {e}\")\n", + " \n", + " \n", + "def get_aws_path(query, query_col, creds):\n", + " \n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.sample_data\"\n", + " query = f\"\"\"\n", + " SELECT {table_sample_data}.AWS_storage\n", + " FROM {table_sample_data}\n", + " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", + " \"\"\"\n", + " sample_paths = []\n", + " results = execute_query(query, user, password)\n", + " for result in results:\n", + " sample_paths.append(result[0])\n", + " return sample_paths\n", + " except Error as e:\n", + " print(f\"Error: {e}\")\n", + " \n", + " \n", + "def get_sample_id(query, query_col, creds):\n", + " \n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.sample_data\"\n", + " query = f\"\"\"\n", + " SELECT {table_sample_data}.id\n", + " FROM {table_sample_data}\n", + " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", + " \"\"\"\n", + " sample_ids = []\n", + " results = execute_query(query, user, password)\n", + " for result in results:\n", + " sample_ids.append(result[0])\n", + " return sample_ids\n", + " except Error as e:\n", + " print(f\"Error: {e}\")\n", + " \n", + "def format_sample_aws(querys, query_col, creds):\n", + " sample_names = []\n", + " sample_paths = []\n", + " sample_ids = []\n", + " \n", + " for query in querys:\n", + " sample_names += get_sample_name(query, query_col, creds)\n", + " sample_paths += get_aws_path(query, query_col, creds)\n", + " sample_ids += get_sample_id(query, query_col, creds)\n", + " \n", + " sample_paths = [s.strip('/') for s in sample_paths] # remove trailing slash if exists\n", + " \n", + " samples = pd.DataFrame(\n", + " dict(S3_Path=sample_paths, Sample_ID=sample_ids),\n", + " index=sample_names,\n", + " dtype=str,\n", + " )\n", + " return samples" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "fa96390b-c1e5-48f6-af5b-6eed769f5020", + "metadata": {}, + "outputs": [], + "source": [ + "def get_genomeIndex_id(query, query_col, creds):\n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.sample_data\"\n", + " query = f\"\"\"\n", + " SELECT {table_sample_data}.genomeIndex_id\n", + " FROM {table_sample_data}\n", + " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", + " \"\"\"\n", + " \n", + " results = execute_query(query, user, password)\n", + " for result in results:\n", + " genomeIndex_id = result[0]\n", + " \n", + " return genomeIndex_id\n", + " \n", + " except Error as e:\n", + " print(f\"Error: {e}\")\n", + " \n", + "def get_scTech_id(query, query_col, creds):\n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.genome_index\"\n", + " query = f\"\"\"\n", + " SELECT {table_sample_data}.scTech_id\n", + " FROM {table_sample_data}\n", + " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", + " \"\"\"\n", + " \n", + " results = execute_query(query, user, password)\n", + " for result in results:\n", + " scTech_id = result[0]\n", + " \n", + " return scTech_id\n", + " \n", + " except Error as e:\n", + " print(f\"Error: {e}\")\n", + " \n", + "def get_index(query, query_col, creds):\n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.genome_index\"\n", + " query = f\"\"\"\n", + " SELECT {table_sample_data}.gIndex\n", + " FROM {table_sample_data}\n", + " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", + " \"\"\"\n", + " \n", + " results = execute_query(query, user, password)\n", + " for result in results:\n", + " index = result[0]\n", + " \n", + " return index\n", + " \n", + " except Error as e:\n", + " print(f\"Error: {e}\")\n", + " \n", + "def get_assay(query, query_col, creds):\n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.sc_tech\"\n", + " query = f\"\"\"\n", + " SELECT {table_sample_data}.Run_name\n", + " FROM {table_sample_data}\n", + " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", + " \"\"\"\n", + " \n", + " results = execute_query(query, user, password)\n", + " for result in results:\n", + " assay = result[0]\n", + " \n", + " return assay\n", + " \n", + " except Error as e:\n", + " print(f\"Error: {e}\")\n", + " \n", + "def get_barcode(query, query_col, creds):\n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.sc_tech\"\n", + " query = f\"\"\"\n", + " SELECT {table_sample_data}.barcodes\n", + " FROM {table_sample_data}\n", + " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", + " \"\"\"\n", + " \n", + " results = execute_query(query, user, password)\n", + " for result in results:\n", + " barcode = result[0]\n", + " \n", + " return barcode\n", + " \n", + " except Error as e:\n", + " print(f\"Error: {e}\")\n", + " \n", + "def get_species_id(query, query_col, creds):\n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.genome_index\"\n", + " query = f\"\"\"\n", + " SELECT {table_sample_data}.species_id\n", + " FROM {table_sample_data}\n", + " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", + " \"\"\"\n", + " \n", + " results = execute_query(query, user, password)\n", + " for result in results:\n", + " species_id = result[0]\n", + " \n", + " return species_id\n", + " \n", + " except Error as e:\n", + " print(f\"Error: {e}\")\n", + " \n", + "def get_species(query, query_col, creds):\n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.species\"\n", + " query = f\"\"\"\n", + " SELECT {table_sample_data}.Species\n", + " FROM {table_sample_data}\n", + " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", + " \"\"\"\n", + " \n", + " results = execute_query(query, user, password)\n", + " for result in results:\n", + " barcode = result[0]\n", + " \n", + " return barcode\n", + " \n", + " except Error as e:\n", + " print(f\"Error: {e}\")\n", + "\n", + " \n", + "def format_assay_barcode(samples, creds):\n", + " \n", + " # samples['genomeIndex_id'] = np.nan\n", + " samples['Reference'] = np.nan\n", + " # samples['scTech_id'] = np.nan\n", + " samples['assay'] = np.nan\n", + " # samples['barcode'] = np.nan\n", + " samples['species'] = np.nan\n", + " \n", + " for sample, row in samples.iterrows():\n", + " sample_id = row['Sample_ID']\n", + " \n", + " genomeIndex_id = get_genomeIndex_id(sample_id, 'id', creds)\n", + " index = get_index(genomeIndex_id, 'id', creds)\n", + " scTech_id = get_scTech_id(genomeIndex_id, 'id', creds)\n", + " assay = get_assay(scTech_id, 'id', creds)\n", + " barcode = get_barcode(scTech_id, 'id', creds)\n", + " species_id = get_species_id(genomeIndex_id, 'id', creds)\n", + " species = get_species(species_id, 'id', creds)\n", + " \n", + "\n", + " samples.loc[sample, 'species'] = species\n", + " # samples.loc[sample, 'genomeIndex_id'] = genomeIndex_id\n", + " if index:\n", + " samples.loc[sample, 'Reference'] = index.strip()\n", + " else:\n", + " samples.loc[sample, 'Reference'] = cr_reference_map[prefix][species]\n", + " # samples.loc[sample, 'scTech_id'] = scTech_id\n", + " if assay:\n", + " samples.loc[sample, 'assay'] = assay.strip()\n", + " # samples.loc[sample, 'barcode'] = barcode.strip()\n", + " \n", + "\n", + " return samples" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "9d4a59dc-fb1a-4e84-8fc9-95238eb22291", + "metadata": {}, + "outputs": [], + "source": [ + "def get_project_id(sample_id, creds):\n", + " \n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.sample_data\"\n", + " table_project_data = \"peer_lab_db.project_data\"\n", + " query = f\"\"\"\n", + " SELECT {table_project_data}.projectName\n", + " FROM {table_project_data}\n", + " LEFT JOIN {table_sample_data}\n", + " ON {table_project_data}.id = {table_sample_data}.projectData_id\n", + " WHERE {table_sample_data}.id = {sample_id}\n", + " \"\"\"\n", + " result = execute_query(query, user, password)[0][0]\n", + " return result\n", + " except Error as e:\n", + " print(f\"Error: {e}\")" + ] + }, + { + "cell_type": "markdown", + "id": "01a8da79-682e-4ba6-861d-b9e4b54af6fe", + "metadata": { + "tags": [] + }, + "source": [ + "## Get tar gz file for reference" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "539e3ea7-b40a-4a70-a840-ffbaf32baab0", + "metadata": {}, + "outputs": [], + "source": [ + "# Get fastq file paths on S3 for each file id\n", + "# Returns dictionary from id to s3 path\n", + "# Throws exception if FASTQs don't exist for any id\n", + "def get_reference(\n", + " path: str, # path to directory containing FASTQ files\n", + "):\n", + " print(path)\n", + " _, bucket, key, _, _ = urllib.parse.urlsplit(path)\n", + " reference = get_s3_objects(\n", + " bucket, key.lstrip(\"/\"),\n", + " re.compile(f\".tar.gz$\")\n", + " )\n", + " try:\n", + " reference = reference[0]\n", + " reference = os.path.join(\"s3://\", bucket, reference)\n", + " except AssertionError as err:\n", + " logging.warning(\"%s\\n\\t %s\", err, path)\n", + " return\n", + " return reference" + ] + }, + { + "cell_type": "markdown", + "id": "98cd9e7f-2171-4710-b329-b4812aeafd67", + "metadata": {}, + "source": [ + "# Process Samples" + ] + }, + { + "cell_type": "markdown", + "id": "28995755-3d1b-45f9-8fac-0c13bac4f9c9", + "metadata": { + "tags": [] + }, + "source": [ + "## Setup" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "9db6a119-0ad5-4965-b988-9c85de2591b6", + "metadata": {}, + "outputs": [], + "source": [ + "# Location of docker files\n", + "common_docker_registry = \"quay.io/hisplan\"\n", + "\n", + "prefix = \"CellRangerVdj\" # Workflow to run; also .wdl filename prefix\n", + "pipeline_type = prefix # field in *.labels.json\n", + "output_dirname = \"cr-vdj-results\"\n", + "\n", + "# If need to add comment, put here\n", + "comment = \"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "a067d6c1-49da-4901-ba59-bd21c5a69871", + "metadata": {}, + "outputs": [], + "source": [ + "# Locations of workflow-related directories and files\n", + "path_to_cromwell_secrets = f\"{Path.home()}/.cromwell/cromwell-secrets.json\" # CHANGE THIS\n", + "workflow_dir = f\"{Path.home()}/scing/bin/cellranger-vdj-6.1.2\" # CHANGE THIS\n", + "path_to_exec = f\"{workflow_dir}/submit.sh\" # CHANGE THIS FOR SHARP\n", + "config_dir = f\"{workflow_dir}/configs\"\n", + "path_to_options = f\"{workflow_dir}/{prefix}.options.aws.json\"\n", + "\n", + "# Other file locations\n", + "db_credentials_path = f\"{Path.home()}/.config.json\" # CHANGE THIS" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "d3fa829f-dfab-4f1a-b943-1f8ef0106985", + "metadata": {}, + "outputs": [], + "source": [ + "# Set credentials based on SCRIdb CLI config file\n", + "with open(db_credentials_path) as f:\n", + " creds = json.load(f)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "e2aca850-d8df-4247-a961-9adc5dffa741", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "env: AWS_ACCESS_KEY_ID=ASIAYPY66CWMP62NDHHJ\n", + "env: AWS_SECRET_ACCESS_KEY=+vN4OePqnFaMmtmn8j+vX07vT/ytL6KXegHoWtXM\n", + "env: AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEBkaCXVzLWVhc3QtMSJHMEUCIQDnicGk6x51cqXMOOaoToeNBclj4YkWARak9yD1JUOdOwIgZVm9Bf97AxeXMiBYTta58H2UEK3hjr7HxQcG9VhgjQ4q7wEIIhADGgw1ODM2NDM1Njc1MTIiDKEqQMj0zJvIE5N8yirMAbmsr69d2hSRrXUDgOoQSs6uR71H4B4L/+IGd7k07ajoW0QlInUZEvWqwqEiCr41zB0b4+2ibcm5QdKAqZxowl/QRGfNltScM2RsGXAlIVzvAfHAGHU3lVOi9KYd/0MRLBDqyghKojzUvrxnHHF0ZuwuUTFcS/Bl36xjYfSuq78jgebZ8CFqQ9ii5/Z3af8eiFjpxSZIX7fRetUhwCk3/2E6SH38kX9Ijr6qufVNqugWVxQtNrqnYh3aRvOebt7o6n3hnyj+jjol+l74yzCMqIqVBjqYAeIl6o8n8l/YvF5E0ftbBoxB9+sxyOFpIuPGVA9xrtmTsiKVIT0asvr/IJ4t/isujGKQVVxSrIzINYuHUcs6Vtkf958uDeJwSSg7o2QsXV2fmCbWCM8zmRqYuOcTVwXEDrz9hQ0r3rdj1QJMjLNzh4LhN2uRS2rLuUNZ+g3Qgplw0IfiiKROEovxz8TnXt3SlHugXn0brEBA\n", + "2021-10-07 15:31:32 agc-583643567512-us-east-1\n", + "2021-10-07 15:28:07 cdktoolkit-stagingbucket-d49u1xfb0sc4\n", + "2019-10-09 13:04:06 cf-templates-umiwbnq3566w-us-east-1\n", + "2019-10-10 12:46:54 dp-daily-reports\n", + "2017-09-26 10:15:15 dp-lab-data\n", + "2019-05-23 12:34:58 dp-lab-data-public\n", + "2018-03-01 13:29:07 dp-lab-glacier\n", + "2020-11-06 23:02:27 dp-lab-gwf-core\n", + "2021-07-15 18:14:01 dp-lab-gwf-core2\n", + "2017-09-26 10:17:18 dp-lab-home\n", + "2019-08-14 16:42:43 dp-lab-test\n", + "2019-04-25 12:35:35 elasticbeanstalk-us-east-1-583643567512\n", + "2019-12-13 15:53:57 scri-computational\n", + "2017-09-26 10:23:50 seqc-public\n" + ] + } + ], + "source": [ + "%env AWS_ACCESS_KEY_ID=ASIAYPY66CWMP62NDHHJ\n", + "%env AWS_SECRET_ACCESS_KEY=+vN4OePqnFaMmtmn8j+vX07vT/ytL6KXegHoWtXM\n", + "%env AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEBkaCXVzLWVhc3QtMSJHMEUCIQDnicGk6x51cqXMOOaoToeNBclj4YkWARak9yD1JUOdOwIgZVm9Bf97AxeXMiBYTta58H2UEK3hjr7HxQcG9VhgjQ4q7wEIIhADGgw1ODM2NDM1Njc1MTIiDKEqQMj0zJvIE5N8yirMAbmsr69d2hSRrXUDgOoQSs6uR71H4B4L/+IGd7k07ajoW0QlInUZEvWqwqEiCr41zB0b4+2ibcm5QdKAqZxowl/QRGfNltScM2RsGXAlIVzvAfHAGHU3lVOi9KYd/0MRLBDqyghKojzUvrxnHHF0ZuwuUTFcS/Bl36xjYfSuq78jgebZ8CFqQ9ii5/Z3af8eiFjpxSZIX7fRetUhwCk3/2E6SH38kX9Ijr6qufVNqugWVxQtNrqnYh3aRvOebt7o6n3hnyj+jjol+l74yzCMqIqVBjqYAeIl6o8n8l/YvF5E0ftbBoxB9+sxyOFpIuPGVA9xrtmTsiKVIT0asvr/IJ4t/isujGKQVVxSrIzINYuHUcs6Vtkf958uDeJwSSg7o2QsXV2fmCbWCM8zmRqYuOcTVwXEDrz9hQ0r3rdj1QJMjLNzh4LhN2uRS2rLuUNZ+g3Qgplw0IfiiKROEovxz8TnXt3SlHugXn0brEBA\n", + "!aws s3 ls" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cc47d702-f319-42bf-8434-68f7d662159b", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "228b2db2-d5d5-4233-8ade-8ad84f459c40", + "metadata": {}, + "source": [ + "## Get sample Information" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "8e3c30d9-273e-4ffe-82a4-e23adb3d1ac0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
S3_PathSample_ID
SD-1680_Patient_D_nucseq_GEs3://dp-lab-data/collaborators/VanDe...3808
SD-1680_Patient_F_nucseq_GEs3://dp-lab-data/collaborators/VanDe...3809
SD-1680_Patient_I_nucseq_GEs3://dp-lab-data/collaborators/VanDe...3810
SD-1680_Patient_D_nucseq_2_GEs3://dp-lab-data/collaborators/VanDe...3811
SD-1680_Patient_F_nucseq_2_GEs3://dp-lab-data/collaborators/VanDe...3812
SD-1680_Patient_I_nucseq_2_GEs3://dp-lab-data/collaborators/VanDe...3813
\n", + "
" + ], + "text/plain": [ + " S3_Path \\\n", + "SD-1680_Patient_D_nucseq_GE s3://dp-lab-data/collaborators/VanDe... \n", + "SD-1680_Patient_F_nucseq_GE s3://dp-lab-data/collaborators/VanDe... \n", + "SD-1680_Patient_I_nucseq_GE s3://dp-lab-data/collaborators/VanDe... \n", + "SD-1680_Patient_D_nucseq_2_GE s3://dp-lab-data/collaborators/VanDe... \n", + "SD-1680_Patient_F_nucseq_2_GE s3://dp-lab-data/collaborators/VanDe... \n", + "SD-1680_Patient_I_nucseq_2_GE s3://dp-lab-data/collaborators/VanDe... \n", + "\n", + " Sample_ID \n", + "SD-1680_Patient_D_nucseq_GE 3808 \n", + "SD-1680_Patient_F_nucseq_GE 3809 \n", + "SD-1680_Patient_I_nucseq_GE 3810 \n", + "SD-1680_Patient_D_nucseq_2_GE 3811 \n", + "SD-1680_Patient_F_nucseq_2_GE 3812 \n", + "SD-1680_Patient_I_nucseq_2_GE 3813 " + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Common query col: id, request_id, Sample\n", + "sample_ids = list(range(3808, 3814))\n", + "samples = format_sample_aws(sample_ids, 'id', creds)\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "07074e44-a339-468d-81a2-d10005209528", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
S3_PathSample_IDReferenceassayspecies
SD-1680_Patient_D_nucseq_GEs3://dp-lab-data/collaborators/VanDe...3808GRCh38five_primeHuman
SD-1680_Patient_F_nucseq_GEs3://dp-lab-data/collaborators/VanDe...3809GRCh38five_primeHuman
SD-1680_Patient_I_nucseq_GEs3://dp-lab-data/collaborators/VanDe...3810GRCh38five_primeHuman
SD-1680_Patient_D_nucseq_2_GEs3://dp-lab-data/collaborators/VanDe...3811GRCh38five_primeHuman
SD-1680_Patient_F_nucseq_2_GEs3://dp-lab-data/collaborators/VanDe...3812GRCh38five_primeHuman
SD-1680_Patient_I_nucseq_2_GEs3://dp-lab-data/collaborators/VanDe...3813GRCh38five_primeHuman
\n", + "
" + ], + "text/plain": [ + " S3_Path \\\n", + "SD-1680_Patient_D_nucseq_GE s3://dp-lab-data/collaborators/VanDe... \n", + "SD-1680_Patient_F_nucseq_GE s3://dp-lab-data/collaborators/VanDe... \n", + "SD-1680_Patient_I_nucseq_GE s3://dp-lab-data/collaborators/VanDe... \n", + "SD-1680_Patient_D_nucseq_2_GE s3://dp-lab-data/collaborators/VanDe... \n", + "SD-1680_Patient_F_nucseq_2_GE s3://dp-lab-data/collaborators/VanDe... \n", + "SD-1680_Patient_I_nucseq_2_GE s3://dp-lab-data/collaborators/VanDe... \n", + "\n", + " Sample_ID Reference assay species \n", + "SD-1680_Patient_D_nucseq_GE 3808 GRCh38 five_prime Human \n", + "SD-1680_Patient_F_nucseq_GE 3809 GRCh38 five_prime Human \n", + "SD-1680_Patient_I_nucseq_GE 3810 GRCh38 five_prime Human \n", + "SD-1680_Patient_D_nucseq_2_GE 3811 GRCh38 five_prime Human \n", + "SD-1680_Patient_F_nucseq_2_GE 3812 GRCh38 five_prime Human \n", + "SD-1680_Patient_I_nucseq_2_GE 3813 GRCh38 five_prime Human " + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples = format_assay_barcode(samples, creds)\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "e2a13aa2-8568-44e8-8316-615b22e4ee2a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
S3_PathSample_IDReferenceassayspeciesFASTQs
SD-1680_Patient_D_nucseq_GEs3://dp-lab-data/collaborators/VanDe...3808GRCh38five_primeHuman{'I1': ['s3://dp-lab-data/collaborat...
SD-1680_Patient_F_nucseq_GEs3://dp-lab-data/collaborators/VanDe...3809GRCh38five_primeHuman{'I1': ['s3://dp-lab-data/collaborat...
SD-1680_Patient_I_nucseq_GEs3://dp-lab-data/collaborators/VanDe...3810GRCh38five_primeHuman{'I1': ['s3://dp-lab-data/collaborat...
SD-1680_Patient_D_nucseq_2_GEs3://dp-lab-data/collaborators/VanDe...3811GRCh38five_primeHuman{'I1': ['s3://dp-lab-data/collaborat...
SD-1680_Patient_F_nucseq_2_GEs3://dp-lab-data/collaborators/VanDe...3812GRCh38five_primeHuman{'I1': ['s3://dp-lab-data/collaborat...
SD-1680_Patient_I_nucseq_2_GEs3://dp-lab-data/collaborators/VanDe...3813GRCh38five_primeHuman{'I1': ['s3://dp-lab-data/collaborat...
\n", + "
" + ], + "text/plain": [ + " S3_Path \\\n", + "SD-1680_Patient_D_nucseq_GE s3://dp-lab-data/collaborators/VanDe... \n", + "SD-1680_Patient_F_nucseq_GE s3://dp-lab-data/collaborators/VanDe... \n", + "SD-1680_Patient_I_nucseq_GE s3://dp-lab-data/collaborators/VanDe... \n", + "SD-1680_Patient_D_nucseq_2_GE s3://dp-lab-data/collaborators/VanDe... \n", + "SD-1680_Patient_F_nucseq_2_GE s3://dp-lab-data/collaborators/VanDe... \n", + "SD-1680_Patient_I_nucseq_2_GE s3://dp-lab-data/collaborators/VanDe... \n", + "\n", + " Sample_ID Reference assay species \\\n", + "SD-1680_Patient_D_nucseq_GE 3808 GRCh38 five_prime Human \n", + "SD-1680_Patient_F_nucseq_GE 3809 GRCh38 five_prime Human \n", + "SD-1680_Patient_I_nucseq_GE 3810 GRCh38 five_prime Human \n", + "SD-1680_Patient_D_nucseq_2_GE 3811 GRCh38 five_prime Human \n", + "SD-1680_Patient_F_nucseq_2_GE 3812 GRCh38 five_prime Human \n", + "SD-1680_Patient_I_nucseq_2_GE 3813 GRCh38 five_prime Human \n", + "\n", + " FASTQs \n", + "SD-1680_Patient_D_nucseq_GE {'I1': ['s3://dp-lab-data/collaborat... \n", + "SD-1680_Patient_F_nucseq_GE {'I1': ['s3://dp-lab-data/collaborat... \n", + "SD-1680_Patient_I_nucseq_GE {'I1': ['s3://dp-lab-data/collaborat... \n", + "SD-1680_Patient_D_nucseq_2_GE {'I1': ['s3://dp-lab-data/collaborat... \n", + "SD-1680_Patient_F_nucseq_2_GE {'I1': ['s3://dp-lab-data/collaborat... \n", + "SD-1680_Patient_I_nucseq_2_GE {'I1': ['s3://dp-lab-data/collaborat... " + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Get FASTQ paths from S3\n", + "# Note: Uses same FASTQ file ids for all samples\n", + "fastq_file_ids = fastq_map[prefix]\n", + "samples[\"FASTQs\"] = samples[\"S3_Path\"].apply(lambda x: get_fastqs(x, fastq_file_ids, \"FASTQ\"))\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "db07203d-2a0f-4b0d-a49e-564d0aca90bd", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "d6be9b75-456e-49dd-bd33-a2766e84cc7c", + "metadata": {}, + "source": [ + "## Inputs" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "9ea75c1e-9110-47e1-a66d-09ff9a80b8b5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
CellRangerVdj.sampleNameCellRangerVdj.fastqNamesCellRangerVdj.referenceGenomeCellRangerVdj.inputFastqCellRangerVdj.chainCellRangerVdj.dockerRegistry
SD-1680_Patient_D_nucseq_GENaNNaNNaNNaNNaNNaN
SD-1680_Patient_F_nucseq_GENaNNaNNaNNaNNaNNaN
SD-1680_Patient_I_nucseq_GENaNNaNNaNNaNNaNNaN
SD-1680_Patient_D_nucseq_2_GENaNNaNNaNNaNNaNNaN
SD-1680_Patient_F_nucseq_2_GENaNNaNNaNNaNNaNNaN
SD-1680_Patient_I_nucseq_2_GENaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " CellRangerVdj.sampleName \\\n", + "SD-1680_Patient_D_nucseq_GE NaN \n", + "SD-1680_Patient_F_nucseq_GE NaN \n", + "SD-1680_Patient_I_nucseq_GE NaN \n", + "SD-1680_Patient_D_nucseq_2_GE NaN \n", + "SD-1680_Patient_F_nucseq_2_GE NaN \n", + "SD-1680_Patient_I_nucseq_2_GE NaN \n", + "\n", + " CellRangerVdj.fastqNames \\\n", + "SD-1680_Patient_D_nucseq_GE NaN \n", + "SD-1680_Patient_F_nucseq_GE NaN \n", + "SD-1680_Patient_I_nucseq_GE NaN \n", + "SD-1680_Patient_D_nucseq_2_GE NaN \n", + "SD-1680_Patient_F_nucseq_2_GE NaN \n", + "SD-1680_Patient_I_nucseq_2_GE NaN \n", + "\n", + " CellRangerVdj.referenceGenome \\\n", + "SD-1680_Patient_D_nucseq_GE NaN \n", + "SD-1680_Patient_F_nucseq_GE NaN \n", + "SD-1680_Patient_I_nucseq_GE NaN \n", + "SD-1680_Patient_D_nucseq_2_GE NaN \n", + "SD-1680_Patient_F_nucseq_2_GE NaN \n", + "SD-1680_Patient_I_nucseq_2_GE NaN \n", + "\n", + " CellRangerVdj.inputFastq CellRangerVdj.chain \\\n", + "SD-1680_Patient_D_nucseq_GE NaN NaN \n", + "SD-1680_Patient_F_nucseq_GE NaN NaN \n", + "SD-1680_Patient_I_nucseq_GE NaN NaN \n", + "SD-1680_Patient_D_nucseq_2_GE NaN NaN \n", + "SD-1680_Patient_F_nucseq_2_GE NaN NaN \n", + "SD-1680_Patient_I_nucseq_2_GE NaN NaN \n", + "\n", + " CellRangerVdj.dockerRegistry \n", + "SD-1680_Patient_D_nucseq_GE NaN \n", + "SD-1680_Patient_F_nucseq_GE NaN \n", + "SD-1680_Patient_I_nucseq_GE NaN \n", + "SD-1680_Patient_D_nucseq_2_GE NaN \n", + "SD-1680_Patient_F_nucseq_2_GE NaN \n", + "SD-1680_Patient_I_nucseq_2_GE NaN " + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Load minimum inputs and labels fields from templates\n", + "with open(f\"{config_dir}/template.inputs.json\") as f:\n", + " std_inputs_fields = list(json.load(f).keys())\n", + " \n", + "# Annotate all samples with workflow inputs and labels\n", + "inputs = pd.DataFrame(index=samples.index, columns=std_inputs_fields,)\n", + "\n", + "inputs" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "6bdf4037-df51-4f71-82a5-3187f7266f76", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
CellRangerVdj.sampleNameCellRangerVdj.fastqNamesCellRangerVdj.referenceGenomeCellRangerVdj.inputFastqCellRangerVdj.chainCellRangerVdj.dockerRegistry
SD-1680_Patient_D_nucseq_GESD-1680_Patient_D_nucseq_GE3808_SD-1680_Patient_D_nucseq_GE_IGO...GRCh38[s3://dp-lab-data/collaborators/VanD...autoquay.io/hisplan
SD-1680_Patient_F_nucseq_GESD-1680_Patient_F_nucseq_GE3809_SD-1680_Patient_F_nucseq_GE_IGO...GRCh38[s3://dp-lab-data/collaborators/VanD...autoquay.io/hisplan
SD-1680_Patient_I_nucseq_GESD-1680_Patient_I_nucseq_GE3810_SD-1680_Patient_I_nucseq_GE_IGO...GRCh38[s3://dp-lab-data/collaborators/VanD...autoquay.io/hisplan
SD-1680_Patient_D_nucseq_2_GESD-1680_Patient_D_nucseq_2_GE3811_SD-1680_Patient_D_nucseq_2_GE_I...GRCh38[s3://dp-lab-data/collaborators/VanD...autoquay.io/hisplan
SD-1680_Patient_F_nucseq_2_GESD-1680_Patient_F_nucseq_2_GE3812_SD-1680_Patient_F_nucseq_2_GE_I...GRCh38[s3://dp-lab-data/collaborators/VanD...autoquay.io/hisplan
SD-1680_Patient_I_nucseq_2_GESD-1680_Patient_I_nucseq_2_GE3813_SD-1680_Patient_I_nucseq_2_GE_I...GRCh38[s3://dp-lab-data/collaborators/VanD...autoquay.io/hisplan
\n", + "
" + ], + "text/plain": [ + " CellRangerVdj.sampleName \\\n", + "SD-1680_Patient_D_nucseq_GE SD-1680_Patient_D_nucseq_GE \n", + "SD-1680_Patient_F_nucseq_GE SD-1680_Patient_F_nucseq_GE \n", + "SD-1680_Patient_I_nucseq_GE SD-1680_Patient_I_nucseq_GE \n", + "SD-1680_Patient_D_nucseq_2_GE SD-1680_Patient_D_nucseq_2_GE \n", + "SD-1680_Patient_F_nucseq_2_GE SD-1680_Patient_F_nucseq_2_GE \n", + "SD-1680_Patient_I_nucseq_2_GE SD-1680_Patient_I_nucseq_2_GE \n", + "\n", + " CellRangerVdj.fastqNames \\\n", + "SD-1680_Patient_D_nucseq_GE 3808_SD-1680_Patient_D_nucseq_GE_IGO... \n", + "SD-1680_Patient_F_nucseq_GE 3809_SD-1680_Patient_F_nucseq_GE_IGO... \n", + "SD-1680_Patient_I_nucseq_GE 3810_SD-1680_Patient_I_nucseq_GE_IGO... \n", + "SD-1680_Patient_D_nucseq_2_GE 3811_SD-1680_Patient_D_nucseq_2_GE_I... \n", + "SD-1680_Patient_F_nucseq_2_GE 3812_SD-1680_Patient_F_nucseq_2_GE_I... \n", + "SD-1680_Patient_I_nucseq_2_GE 3813_SD-1680_Patient_I_nucseq_2_GE_I... \n", + "\n", + " CellRangerVdj.referenceGenome \\\n", + "SD-1680_Patient_D_nucseq_GE GRCh38 \n", + "SD-1680_Patient_F_nucseq_GE GRCh38 \n", + "SD-1680_Patient_I_nucseq_GE GRCh38 \n", + "SD-1680_Patient_D_nucseq_2_GE GRCh38 \n", + "SD-1680_Patient_F_nucseq_2_GE GRCh38 \n", + "SD-1680_Patient_I_nucseq_2_GE GRCh38 \n", + "\n", + " CellRangerVdj.inputFastq \\\n", + "SD-1680_Patient_D_nucseq_GE [s3://dp-lab-data/collaborators/VanD... \n", + "SD-1680_Patient_F_nucseq_GE [s3://dp-lab-data/collaborators/VanD... \n", + "SD-1680_Patient_I_nucseq_GE [s3://dp-lab-data/collaborators/VanD... \n", + "SD-1680_Patient_D_nucseq_2_GE [s3://dp-lab-data/collaborators/VanD... \n", + "SD-1680_Patient_F_nucseq_2_GE [s3://dp-lab-data/collaborators/VanD... \n", + "SD-1680_Patient_I_nucseq_2_GE [s3://dp-lab-data/collaborators/VanD... \n", + "\n", + " CellRangerVdj.chain CellRangerVdj.dockerRegistry \n", + "SD-1680_Patient_D_nucseq_GE auto quay.io/hisplan \n", + "SD-1680_Patient_F_nucseq_GE auto quay.io/hisplan \n", + "SD-1680_Patient_I_nucseq_GE auto quay.io/hisplan \n", + "SD-1680_Patient_D_nucseq_2_GE auto quay.io/hisplan \n", + "SD-1680_Patient_F_nucseq_2_GE auto quay.io/hisplan \n", + "SD-1680_Patient_I_nucseq_2_GE auto quay.io/hisplan " + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "inputs[f'{prefix}.sampleName'] = samples.index\n", + "inputs[f'{prefix}.inputFastq'] = samples[\"FASTQs\"].apply(lambda x: np.ravel(list(x.values())))\n", + "inputs[f'{prefix}.fastqNames'] = inputs[f\"{prefix}.inputFastq\"].apply(lambda x: get_fastqs_name(x))\n", + "inputs[f'{prefix}.referenceGenome'] = samples['Reference']\n", + "inputs[f'{prefix}.chain'] = 'auto'\n", + "inputs[f'{prefix}.dockerRegistry'] = common_docker_registry\n", + "\n", + "inputs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4f54b5e4-6ff1-4469-8c16-cc975d71766d", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "829ad858-65ca-49f8-9b96-2b428e2a25f9", + "metadata": {}, + "source": [ + "## Labels" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "ed61284c-ec00-4b2e-9522-f20ee0a8682c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
pipelineTypeprojectsampleownerdestinationtransfercomment
SD-1680_Patient_D_nucseq_GENaNNaNNaNNaNNaNNaNNaN
SD-1680_Patient_F_nucseq_GENaNNaNNaNNaNNaNNaNNaN
SD-1680_Patient_I_nucseq_GENaNNaNNaNNaNNaNNaNNaN
SD-1680_Patient_D_nucseq_2_GENaNNaNNaNNaNNaNNaNNaN
SD-1680_Patient_F_nucseq_2_GENaNNaNNaNNaNNaNNaNNaN
SD-1680_Patient_I_nucseq_2_GENaNNaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " pipelineType project sample owner destination \\\n", + "SD-1680_Patient_D_nucseq_GE NaN NaN NaN NaN NaN \n", + "SD-1680_Patient_F_nucseq_GE NaN NaN NaN NaN NaN \n", + "SD-1680_Patient_I_nucseq_GE NaN NaN NaN NaN NaN \n", + "SD-1680_Patient_D_nucseq_2_GE NaN NaN NaN NaN NaN \n", + "SD-1680_Patient_F_nucseq_2_GE NaN NaN NaN NaN NaN \n", + "SD-1680_Patient_I_nucseq_2_GE NaN NaN NaN NaN NaN \n", + "\n", + " transfer comment \n", + "SD-1680_Patient_D_nucseq_GE NaN NaN \n", + "SD-1680_Patient_F_nucseq_GE NaN NaN \n", + "SD-1680_Patient_I_nucseq_GE NaN NaN \n", + "SD-1680_Patient_D_nucseq_2_GE NaN NaN \n", + "SD-1680_Patient_F_nucseq_2_GE NaN NaN \n", + "SD-1680_Patient_I_nucseq_2_GE NaN NaN " + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "with open(f\"{config_dir}/template.labels.json\") as f:\n", + " std_labels_fields = list(json.load(f).keys())\n", + " \n", + "# Annotate all samples with workflow inputs and labels\n", + "labels = pd.DataFrame(index=samples.index, columns=std_labels_fields,)\n", + "labels" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "b9c33977-ad27-4c05-864f-08652d001f5f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
pipelineTypeprojectsampleownerdestinationtransfercomment
SD-1680_Patient_D_nucseq_GECellRangerVdjAML T cell pilotSD-1680_Patient_D_nucseq_GEsohailns3://dp-lab-data/collaborators/VanDe...-sohailn
SD-1680_Patient_F_nucseq_GECellRangerVdjAML T cell pilotSD-1680_Patient_F_nucseq_GEsohailns3://dp-lab-data/collaborators/VanDe...-sohailn
SD-1680_Patient_I_nucseq_GECellRangerVdjAML T cell pilotSD-1680_Patient_I_nucseq_GEsohailns3://dp-lab-data/collaborators/VanDe...-sohailn
SD-1680_Patient_D_nucseq_2_GECellRangerVdjAML T cell pilotSD-1680_Patient_D_nucseq_2_GEsohailns3://dp-lab-data/collaborators/VanDe...-sohailn
SD-1680_Patient_F_nucseq_2_GECellRangerVdjAML T cell pilotSD-1680_Patient_F_nucseq_2_GEsohailns3://dp-lab-data/collaborators/VanDe...-sohailn
SD-1680_Patient_I_nucseq_2_GECellRangerVdjAML T cell pilotSD-1680_Patient_I_nucseq_2_GEsohailns3://dp-lab-data/collaborators/VanDe...-sohailn
\n", + "
" + ], + "text/plain": [ + " pipelineType project \\\n", + "SD-1680_Patient_D_nucseq_GE CellRangerVdj AML T cell pilot \n", + "SD-1680_Patient_F_nucseq_GE CellRangerVdj AML T cell pilot \n", + "SD-1680_Patient_I_nucseq_GE CellRangerVdj AML T cell pilot \n", + "SD-1680_Patient_D_nucseq_2_GE CellRangerVdj AML T cell pilot \n", + "SD-1680_Patient_F_nucseq_2_GE CellRangerVdj AML T cell pilot \n", + "SD-1680_Patient_I_nucseq_2_GE CellRangerVdj AML T cell pilot \n", + "\n", + " sample owner \\\n", + "SD-1680_Patient_D_nucseq_GE SD-1680_Patient_D_nucseq_GE sohailn \n", + "SD-1680_Patient_F_nucseq_GE SD-1680_Patient_F_nucseq_GE sohailn \n", + "SD-1680_Patient_I_nucseq_GE SD-1680_Patient_I_nucseq_GE sohailn \n", + "SD-1680_Patient_D_nucseq_2_GE SD-1680_Patient_D_nucseq_2_GE sohailn \n", + "SD-1680_Patient_F_nucseq_2_GE SD-1680_Patient_F_nucseq_2_GE sohailn \n", + "SD-1680_Patient_I_nucseq_2_GE SD-1680_Patient_I_nucseq_2_GE sohailn \n", + "\n", + " destination \\\n", + "SD-1680_Patient_D_nucseq_GE s3://dp-lab-data/collaborators/VanDe... \n", + "SD-1680_Patient_F_nucseq_GE s3://dp-lab-data/collaborators/VanDe... \n", + "SD-1680_Patient_I_nucseq_GE s3://dp-lab-data/collaborators/VanDe... \n", + "SD-1680_Patient_D_nucseq_2_GE s3://dp-lab-data/collaborators/VanDe... \n", + "SD-1680_Patient_F_nucseq_2_GE s3://dp-lab-data/collaborators/VanDe... \n", + "SD-1680_Patient_I_nucseq_2_GE s3://dp-lab-data/collaborators/VanDe... \n", + "\n", + " transfer comment \n", + "SD-1680_Patient_D_nucseq_GE - sohailn \n", + "SD-1680_Patient_F_nucseq_GE - sohailn \n", + "SD-1680_Patient_I_nucseq_GE - sohailn \n", + "SD-1680_Patient_D_nucseq_2_GE - sohailn \n", + "SD-1680_Patient_F_nucseq_2_GE - sohailn \n", + "SD-1680_Patient_I_nucseq_2_GE - sohailn " + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "labels[\"pipelineType\"] = pipeline_type\n", + "labels[\"project\"] = samples[\"Sample_ID\"].apply(lambda x: get_project_id(x, creds))\n", + "labels[\"sample\"] = labels.index\n", + "labels[\"owner\"] = creds[\"user\"]\n", + "labels[\"destination\"] = samples['S3_Path'] + \"/\" + output_dirname\n", + "labels[\"transfer\"] = \"-\"\n", + "labels[\"comment\"] = creds[\"user\"]\n", + "\n", + "labels" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "88ad7ccd-f144-4696-bc2b-e7945059103f", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "524a26f6-fe12-4065-8c79-b665c99336a3", + "metadata": {}, + "source": [ + "## Execution" + ] + }, + { + "cell_type": "markdown", + "id": "403c3948-bcb5-45a1-b6f5-dfa8aefb4e86", + "metadata": {}, + "source": [ + "Make sure to check that your FASTQ files aren't archived, otherwise your job will fail" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "78242f27-c831-4d7f-b4e3-14dfdb470543", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
CellRangerVdj.sampleNameCellRangerVdj.fastqNamesCellRangerVdj.referenceGenomeCellRangerVdj.inputFastqCellRangerVdj.chainCellRangerVdj.dockerRegistry
SD-1680_Patient_D_nucseq_GESD-1680_Patient_D_nucseq_GE3808_SD-1680_Patient_D_nucseq_GE_IGO...GRCh38[s3://dp-lab-data/collaborators/VanD...autoquay.io/hisplan
SD-1680_Patient_F_nucseq_GESD-1680_Patient_F_nucseq_GE3809_SD-1680_Patient_F_nucseq_GE_IGO...GRCh38[s3://dp-lab-data/collaborators/VanD...autoquay.io/hisplan
SD-1680_Patient_I_nucseq_GESD-1680_Patient_I_nucseq_GE3810_SD-1680_Patient_I_nucseq_GE_IGO...GRCh38[s3://dp-lab-data/collaborators/VanD...autoquay.io/hisplan
SD-1680_Patient_D_nucseq_2_GESD-1680_Patient_D_nucseq_2_GE3811_SD-1680_Patient_D_nucseq_2_GE_I...GRCh38[s3://dp-lab-data/collaborators/VanD...autoquay.io/hisplan
SD-1680_Patient_F_nucseq_2_GESD-1680_Patient_F_nucseq_2_GE3812_SD-1680_Patient_F_nucseq_2_GE_I...GRCh38[s3://dp-lab-data/collaborators/VanD...autoquay.io/hisplan
SD-1680_Patient_I_nucseq_2_GESD-1680_Patient_I_nucseq_2_GE3813_SD-1680_Patient_I_nucseq_2_GE_I...GRCh38[s3://dp-lab-data/collaborators/VanD...autoquay.io/hisplan
\n", + "
" + ], + "text/plain": [ + " CellRangerVdj.sampleName \\\n", + "SD-1680_Patient_D_nucseq_GE SD-1680_Patient_D_nucseq_GE \n", + "SD-1680_Patient_F_nucseq_GE SD-1680_Patient_F_nucseq_GE \n", + "SD-1680_Patient_I_nucseq_GE SD-1680_Patient_I_nucseq_GE \n", + "SD-1680_Patient_D_nucseq_2_GE SD-1680_Patient_D_nucseq_2_GE \n", + "SD-1680_Patient_F_nucseq_2_GE SD-1680_Patient_F_nucseq_2_GE \n", + "SD-1680_Patient_I_nucseq_2_GE SD-1680_Patient_I_nucseq_2_GE \n", + "\n", + " CellRangerVdj.fastqNames \\\n", + "SD-1680_Patient_D_nucseq_GE 3808_SD-1680_Patient_D_nucseq_GE_IGO... \n", + "SD-1680_Patient_F_nucseq_GE 3809_SD-1680_Patient_F_nucseq_GE_IGO... \n", + "SD-1680_Patient_I_nucseq_GE 3810_SD-1680_Patient_I_nucseq_GE_IGO... \n", + "SD-1680_Patient_D_nucseq_2_GE 3811_SD-1680_Patient_D_nucseq_2_GE_I... \n", + "SD-1680_Patient_F_nucseq_2_GE 3812_SD-1680_Patient_F_nucseq_2_GE_I... \n", + "SD-1680_Patient_I_nucseq_2_GE 3813_SD-1680_Patient_I_nucseq_2_GE_I... \n", + "\n", + " CellRangerVdj.referenceGenome \\\n", + "SD-1680_Patient_D_nucseq_GE GRCh38 \n", + "SD-1680_Patient_F_nucseq_GE GRCh38 \n", + "SD-1680_Patient_I_nucseq_GE GRCh38 \n", + "SD-1680_Patient_D_nucseq_2_GE GRCh38 \n", + "SD-1680_Patient_F_nucseq_2_GE GRCh38 \n", + "SD-1680_Patient_I_nucseq_2_GE GRCh38 \n", + "\n", + " CellRangerVdj.inputFastq \\\n", + "SD-1680_Patient_D_nucseq_GE [s3://dp-lab-data/collaborators/VanD... \n", + "SD-1680_Patient_F_nucseq_GE [s3://dp-lab-data/collaborators/VanD... \n", + "SD-1680_Patient_I_nucseq_GE [s3://dp-lab-data/collaborators/VanD... \n", + "SD-1680_Patient_D_nucseq_2_GE [s3://dp-lab-data/collaborators/VanD... \n", + "SD-1680_Patient_F_nucseq_2_GE [s3://dp-lab-data/collaborators/VanD... \n", + "SD-1680_Patient_I_nucseq_2_GE [s3://dp-lab-data/collaborators/VanD... \n", + "\n", + " CellRangerVdj.chain CellRangerVdj.dockerRegistry \n", + "SD-1680_Patient_D_nucseq_GE auto quay.io/hisplan \n", + "SD-1680_Patient_F_nucseq_GE auto quay.io/hisplan \n", + "SD-1680_Patient_I_nucseq_GE auto quay.io/hisplan \n", + "SD-1680_Patient_D_nucseq_2_GE auto quay.io/hisplan \n", + "SD-1680_Patient_F_nucseq_2_GE auto quay.io/hisplan \n", + "SD-1680_Patient_I_nucseq_2_GE auto quay.io/hisplan " + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "inputs" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "bfe55491-699a-4db9-aca3-bf6cf337086c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
pipelineTypeprojectsampleownerdestinationtransfercomment
SD-1680_Patient_D_nucseq_GECellRangerVdjAML T cell pilotSD-1680_Patient_D_nucseq_GEsohailns3://dp-lab-data/collaborators/VanDe...-sohailn
SD-1680_Patient_F_nucseq_GECellRangerVdjAML T cell pilotSD-1680_Patient_F_nucseq_GEsohailns3://dp-lab-data/collaborators/VanDe...-sohailn
SD-1680_Patient_I_nucseq_GECellRangerVdjAML T cell pilotSD-1680_Patient_I_nucseq_GEsohailns3://dp-lab-data/collaborators/VanDe...-sohailn
SD-1680_Patient_D_nucseq_2_GECellRangerVdjAML T cell pilotSD-1680_Patient_D_nucseq_2_GEsohailns3://dp-lab-data/collaborators/VanDe...-sohailn
SD-1680_Patient_F_nucseq_2_GECellRangerVdjAML T cell pilotSD-1680_Patient_F_nucseq_2_GEsohailns3://dp-lab-data/collaborators/VanDe...-sohailn
SD-1680_Patient_I_nucseq_2_GECellRangerVdjAML T cell pilotSD-1680_Patient_I_nucseq_2_GEsohailns3://dp-lab-data/collaborators/VanDe...-sohailn
\n", + "
" + ], + "text/plain": [ + " pipelineType project \\\n", + "SD-1680_Patient_D_nucseq_GE CellRangerVdj AML T cell pilot \n", + "SD-1680_Patient_F_nucseq_GE CellRangerVdj AML T cell pilot \n", + "SD-1680_Patient_I_nucseq_GE CellRangerVdj AML T cell pilot \n", + "SD-1680_Patient_D_nucseq_2_GE CellRangerVdj AML T cell pilot \n", + "SD-1680_Patient_F_nucseq_2_GE CellRangerVdj AML T cell pilot \n", + "SD-1680_Patient_I_nucseq_2_GE CellRangerVdj AML T cell pilot \n", + "\n", + " sample owner \\\n", + "SD-1680_Patient_D_nucseq_GE SD-1680_Patient_D_nucseq_GE sohailn \n", + "SD-1680_Patient_F_nucseq_GE SD-1680_Patient_F_nucseq_GE sohailn \n", + "SD-1680_Patient_I_nucseq_GE SD-1680_Patient_I_nucseq_GE sohailn \n", + "SD-1680_Patient_D_nucseq_2_GE SD-1680_Patient_D_nucseq_2_GE sohailn \n", + "SD-1680_Patient_F_nucseq_2_GE SD-1680_Patient_F_nucseq_2_GE sohailn \n", + "SD-1680_Patient_I_nucseq_2_GE SD-1680_Patient_I_nucseq_2_GE sohailn \n", + "\n", + " destination \\\n", + "SD-1680_Patient_D_nucseq_GE s3://dp-lab-data/collaborators/VanDe... \n", + "SD-1680_Patient_F_nucseq_GE s3://dp-lab-data/collaborators/VanDe... \n", + "SD-1680_Patient_I_nucseq_GE s3://dp-lab-data/collaborators/VanDe... \n", + "SD-1680_Patient_D_nucseq_2_GE s3://dp-lab-data/collaborators/VanDe... \n", + "SD-1680_Patient_F_nucseq_2_GE s3://dp-lab-data/collaborators/VanDe... \n", + "SD-1680_Patient_I_nucseq_2_GE s3://dp-lab-data/collaborators/VanDe... \n", + "\n", + " transfer comment \n", + "SD-1680_Patient_D_nucseq_GE - sohailn \n", + "SD-1680_Patient_F_nucseq_GE - sohailn \n", + "SD-1680_Patient_I_nucseq_GE - sohailn \n", + "SD-1680_Patient_D_nucseq_2_GE - sohailn \n", + "SD-1680_Patient_F_nucseq_2_GE - sohailn \n", + "SD-1680_Patient_I_nucseq_2_GE - sohailn " + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "labels" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "a9a9d00a-9373-4cb9-bb37-102d148998cd", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "dd58a333e16b4889acceae3156685a1d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/6 [00:00 Date: Fri, 5 Aug 2022 16:25:42 -0400 Subject: [PATCH 08/16] update CR ARC --- notebooks/Run_CellRangerArc.ipynb | 944 ++++++++++++++++++++++++++---- 1 file changed, 836 insertions(+), 108 deletions(-) diff --git a/notebooks/Run_CellRangerArc.ipynb b/notebooks/Run_CellRangerArc.ipynb index 83ba3fc..b1c1801 100644 --- a/notebooks/Run_CellRangerArc.ipynb +++ b/notebooks/Run_CellRangerArc.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 137, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -18,13 +18,120 @@ }, { "cell_type": "code", - "execution_count": 138, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "from utils.utils import *" ] }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "# Functions" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "### DB query" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# Common query col: id, request_id, Sample\n", + "def get_sample_name(query, query_col, creds):\n", + " \n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.sample_data\"\n", + " query = f\"\"\"\n", + " SELECT {table_sample_data}.Sample\n", + " FROM {table_sample_data}\n", + " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", + " \"\"\"\n", + " sample_names = []\n", + " results = execute_query(query, user, password)\n", + " for result in results:\n", + " sample_names.append(result[0])\n", + " return sample_names\n", + " except Error as e:\n", + " print(f\"Error: {e}\")\n", + " \n", + " \n", + "def get_aws_path(query, query_col, creds):\n", + " \n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.sample_data\"\n", + " query = f\"\"\"\n", + " SELECT {table_sample_data}.AWS_storage\n", + " FROM {table_sample_data}\n", + " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", + " \"\"\"\n", + " sample_paths = []\n", + " results = execute_query(query, user, password)\n", + " for result in results:\n", + " sample_paths.append(result[0])\n", + " return sample_paths\n", + " except Error as e:\n", + " print(f\"Error: {e}\")\n", + " \n", + " \n", + "def get_sample_id(query, query_col, creds):\n", + " \n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.sample_data\"\n", + " query = f\"\"\"\n", + " SELECT {table_sample_data}.id\n", + " FROM {table_sample_data}\n", + " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", + " \"\"\"\n", + " sample_ids = []\n", + " results = execute_query(query, user, password)\n", + " for result in results:\n", + " sample_ids.append(result[0])\n", + " return sample_ids\n", + " except Error as e:\n", + " print(f\"Error: {e}\")\n", + " \n", + "def format_sample_aws(querys, query_col, creds):\n", + " sample_names = []\n", + " sample_paths = []\n", + " sample_ids = []\n", + " \n", + " for query in querys:\n", + " sample_names += get_sample_name(query, query_col, creds)\n", + " sample_paths += get_aws_path(query, query_col, creds)\n", + " sample_ids += get_sample_id(query, query_col, creds)\n", + " \n", + " sample_paths = [s.strip('/') for s in sample_paths] # remove trailing slash if exists\n", + " \n", + " samples = pd.DataFrame(\n", + " dict(S3_Path=sample_paths, Sample_ID=sample_ids),\n", + " index=sample_names,\n", + " dtype=str,\n", + " )\n", + " return samples" + ] + }, { "cell_type": "markdown", "metadata": { @@ -45,7 +152,7 @@ }, { "cell_type": "code", - "execution_count": 107, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -62,7 +169,7 @@ }, { "cell_type": "code", - "execution_count": 108, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -79,7 +186,7 @@ }, { "cell_type": "code", - "execution_count": 109, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -90,23 +197,292 @@ }, { "cell_type": "code", - "execution_count": 110, + "execution_count": null, "metadata": {}, "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "env: AWS_ACCESS_KEY_ID=ASIAYPY66CWMM475H4B4\n", + "env: AWS_SECRET_ACCESS_KEY=5s4fMZY42VqVqvVXchw8MoWWLoCHPePCT/iaobVn\n", + "env: AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEHQaCXVzLWVhc3QtMSJHMEUCIEmU/p6WjjzI7fCYC+diFIWv/XfWHDLEP+Q51F7oCSSxAiEA85U4OfdDL/0cNtyl4SfhJ/ll5yC0FdtY2Sqs24CslxQq7wEIfRADGgw1ODM2NDM1Njc1MTIiDGl5lBQDjdScIm9vwirMASko/yjqyG4oI8bRrXZ4f02tqdBqwbCM0Wh4UdVidGfVJbL1pw0g6qz9+GnjNgrBJa49P/CvVt4ITUKFqfNlmavSxZ62XMO0FSMcCL6T94v3dGXuqF1rTh76K3L824o5o51y6AHpQ7dq57aFQp+xUnZyJLiaUIzBANOqDTR8Z/aPwow59Fc6Kqpt3B9iY1wRORg5SqQiiRK+h5MhyQBkmxujkdJdkHvuvV3FShoqHOX+Bk/IcwoXiXKKRkOzCl46gC4dvlUEB1AmL/BdXzD4np6VBjqYASCRdo8/YHCKDG3HJeFN7tsbp22/myHH+OF68VEPq98RaZNX91hX4io8iXbZniEPTmi9fEHmTfEg70GLv/TBNqNKLhm0NL1cA8hx996G8qqEcx1m18oeqvV+7WsyGc/6d0feXzV741v4KBN/R3BxhaZYAWF0OsKbfKx0HBgmJ6jKqwu1f4FNwufRJ3ST+w+0txaUebY0R5nO\n", + "2021-10-07 15:31:32 agc-583643567512-us-east-1\n", + "2021-10-07 15:28:07 cdktoolkit-stagingbucket-d49u1xfb0sc4\n", + "2019-10-09 13:04:06 cf-templates-umiwbnq3566w-us-east-1\n", + "2019-10-10 12:46:54 dp-daily-reports\n", + "2017-09-26 10:15:15 dp-lab-data\n", + "2019-05-23 12:34:58 dp-lab-data-public\n", + "2018-03-01 13:29:07 dp-lab-glacier\n", + "2020-11-06 23:02:27 dp-lab-gwf-core\n", + "2021-07-15 18:14:01 dp-lab-gwf-core2\n", + "2017-09-26 10:17:18 dp-lab-home\n", + "2019-08-14 16:42:43 dp-lab-test\n", + "2019-04-25 12:35:35 elasticbeanstalk-us-east-1-583643567512\n", + "2019-12-13 15:53:57 scri-computational\n", + "2017-09-26 10:23:50 seqc-public\n" + ] + } + ], "source": [ - "# Samples on which to run CellRangerATAC\n", - "# Note: Assumes data is transferred to AWS S3 (this should be an s3 location)\n", - "# Note: Assumes directory name is name of sample\n", - "common_dir = \"s3://dp-lab-data/collaborators/VanDenBrink/AgingHematopoiesis\"\n", - "samples = [\n", - " \"HA-1536_Young_mice_multiome\",\n", - " \"HA-1536_Old_mice_multiome\"\n", - "]\n", - "sample_paths = [\n", - " f\"{common_dir}/{sample}\" for sample in samples\n", - "]" + "%env AWS_ACCESS_KEY_ID=ASIAYPY66CWMM475H4B4\n", + "%env AWS_SECRET_ACCESS_KEY=5s4fMZY42VqVqvVXchw8MoWWLoCHPePCT/iaobVn\n", + "%env AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEHQaCXVzLWVhc3QtMSJHMEUCIEmU/p6WjjzI7fCYC+diFIWv/XfWHDLEP+Q51F7oCSSxAiEA85U4OfdDL/0cNtyl4SfhJ/ll5yC0FdtY2Sqs24CslxQq7wEIfRADGgw1ODM2NDM1Njc1MTIiDGl5lBQDjdScIm9vwirMASko/yjqyG4oI8bRrXZ4f02tqdBqwbCM0Wh4UdVidGfVJbL1pw0g6qz9+GnjNgrBJa49P/CvVt4ITUKFqfNlmavSxZ62XMO0FSMcCL6T94v3dGXuqF1rTh76K3L824o5o51y6AHpQ7dq57aFQp+xUnZyJLiaUIzBANOqDTR8Z/aPwow59Fc6Kqpt3B9iY1wRORg5SqQiiRK+h5MhyQBkmxujkdJdkHvuvV3FShoqHOX+Bk/IcwoXiXKKRkOzCl46gC4dvlUEB1AmL/BdXzD4np6VBjqYASCRdo8/YHCKDG3HJeFN7tsbp22/myHH+OF68VEPq98RaZNX91hX4io8iXbZniEPTmi9fEHmTfEg70GLv/TBNqNKLhm0NL1cA8hx996G8qqEcx1m18oeqvV+7WsyGc/6d0feXzV741v4KBN/R3BxhaZYAWF0OsKbfKx0HBgmJ6jKqwu1f4FNwufRJ3ST+w+0txaUebY0R5nO\n", + "!aws s3 ls" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Sample Information" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
S3_PathSample_ID
JR-1603_Mm_veh_CSF_multiomes3://dp-lab-data/collaborators/aboir...3708
JR-1603_LM_CSF_multiomes3://dp-lab-data/collaborators/aboir...3709
JR-1603_LPS_CSF_multiomes3://dp-lab-data/collaborators/aboir...3710
JR-1603_LM_blood_multiomes3://dp-lab-data/collaborators/aboir...3711
JR-1603_LPS_blood_multiomes3://dp-lab-data/collaborators/aboir...3712
JR-1603_veh_blood_multiomes3://dp-lab-data/collaborators/aboir...3713
JR-1603_Mm_veh_CSF_multiome_ATACs3://dp-lab-data/collaborators/aboir...3714
JR-1603_LM_CSF_multiome_ATACs3://dp-lab-data/collaborators/aboir...3715
JR-1603_LPS_CSF_multiome_ATACs3://dp-lab-data/collaborators/aboir...3716
JR-1603_veh_blood_multiome_ATACs3://dp-lab-data/collaborators/aboir...3717
JR-1603_LM_blood_multiome_ATACs3://dp-lab-data/collaborators/aboir...3718
JR-1603_LPS_blood_multiome_ATACs3://dp-lab-data/collaborators/aboir...3719
\n", + "
" + ], + "text/plain": [ + " S3_Path \\\n", + "JR-1603_Mm_veh_CSF_multiome s3://dp-lab-data/collaborators/aboir... \n", + "JR-1603_LM_CSF_multiome s3://dp-lab-data/collaborators/aboir... \n", + "JR-1603_LPS_CSF_multiome s3://dp-lab-data/collaborators/aboir... \n", + "JR-1603_LM_blood_multiome s3://dp-lab-data/collaborators/aboir... \n", + "JR-1603_LPS_blood_multiome s3://dp-lab-data/collaborators/aboir... \n", + "JR-1603_veh_blood_multiome s3://dp-lab-data/collaborators/aboir... \n", + "JR-1603_Mm_veh_CSF_multiome_ATAC s3://dp-lab-data/collaborators/aboir... \n", + "JR-1603_LM_CSF_multiome_ATAC s3://dp-lab-data/collaborators/aboir... \n", + "JR-1603_LPS_CSF_multiome_ATAC s3://dp-lab-data/collaborators/aboir... \n", + "JR-1603_veh_blood_multiome_ATAC s3://dp-lab-data/collaborators/aboir... \n", + "JR-1603_LM_blood_multiome_ATAC s3://dp-lab-data/collaborators/aboir... \n", + "JR-1603_LPS_blood_multiome_ATAC s3://dp-lab-data/collaborators/aboir... \n", + "\n", + " Sample_ID \n", + "JR-1603_Mm_veh_CSF_multiome 3708 \n", + "JR-1603_LM_CSF_multiome 3709 \n", + "JR-1603_LPS_CSF_multiome 3710 \n", + "JR-1603_LM_blood_multiome 3711 \n", + "JR-1603_LPS_blood_multiome 3712 \n", + "JR-1603_veh_blood_multiome 3713 \n", + "JR-1603_Mm_veh_CSF_multiome_ATAC 3714 \n", + "JR-1603_LM_CSF_multiome_ATAC 3715 \n", + "JR-1603_LPS_CSF_multiome_ATAC 3716 \n", + "JR-1603_veh_blood_multiome_ATAC 3717 \n", + "JR-1603_LM_blood_multiome_ATAC 3718 \n", + "JR-1603_LPS_blood_multiome_ATAC 3719 " + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Common query col: id, request_id, Sample\n", + "\n", + "request_ids = ['JR-1603']\n", + "\n", + "samples = format_sample_aws(request_ids, 'request_id', creds)\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
S3_PathSample_ID
JR-1603_Mm_veh_CSF_multiomes3://dp-lab-data/collaborators/aboir...3708
JR-1603_LM_CSF_multiomes3://dp-lab-data/collaborators/aboir...3709
JR-1603_LPS_CSF_multiomes3://dp-lab-data/collaborators/aboir...3710
JR-1603_LM_blood_multiomes3://dp-lab-data/collaborators/aboir...3711
JR-1603_LPS_blood_multiomes3://dp-lab-data/collaborators/aboir...3712
JR-1603_veh_blood_multiomes3://dp-lab-data/collaborators/aboir...3713
\n", + "
" + ], + "text/plain": [ + " S3_Path Sample_ID\n", + "JR-1603_Mm_veh_CSF_multiome s3://dp-lab-data/collaborators/aboir... 3708\n", + "JR-1603_LM_CSF_multiome s3://dp-lab-data/collaborators/aboir... 3709\n", + "JR-1603_LPS_CSF_multiome s3://dp-lab-data/collaborators/aboir... 3710\n", + "JR-1603_LM_blood_multiome s3://dp-lab-data/collaborators/aboir... 3711\n", + "JR-1603_LPS_blood_multiome s3://dp-lab-data/collaborators/aboir... 3712\n", + "JR-1603_veh_blood_multiome s3://dp-lab-data/collaborators/aboir... 3713" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples = samples.iloc[:6, ]\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "markdown", "metadata": { @@ -118,33 +494,162 @@ }, { "cell_type": "code", - "execution_count": 130, + "execution_count": 15, "metadata": {}, "outputs": [ { - "name": "stdout", + "name": "stderr", "output_type": "stream", "text": [ - "['HA-1536_Young_mice_multiome', 'HA-1536_Old_mice_multiome']\n" + "/var/folders/9v/1lnyrkxd0yq8l2pgl002wh1s7c6fqv/T/ipykernel_4449/3639555678.py:4: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " samples[\"FASTQs_GEX\"] = samples[\"S3_Path\"].apply(lambda x: get_fastqs(x, folder=\"FASTQ\"))\n", + "/var/folders/9v/1lnyrkxd0yq8l2pgl002wh1s7c6fqv/T/ipykernel_4449/3639555678.py:5: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " samples[\"FASTQs_ATAC\"] = samples[\"S3_Path\"].apply(lambda x: get_fastqs(x + \"_ATAC\", folder=\"FASTQ\"))\n", + "/var/folders/9v/1lnyrkxd0yq8l2pgl002wh1s7c6fqv/T/ipykernel_4449/3639555678.py:8: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " samples[\"Reference\"] = samples[\"Sample_ID\"].apply(lambda x: get_cr_reference(x, prefix, creds[\"user\"], creds[\"password\"]))\n" ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
S3_PathSample_IDFASTQs_GEXFASTQs_ATACReference
JR-1603_Mm_veh_CSF_multiomes3://dp-lab-data/collaborators/aboir...3708{'All': ['s3://dp-lab-data/collabora...{'All': ['s3://dp-lab-data/collabora...https://cf.10xgenomics.com/supp/cell...
JR-1603_LM_CSF_multiomes3://dp-lab-data/collaborators/aboir...3709{'All': ['s3://dp-lab-data/collabora...{'All': ['s3://dp-lab-data/collabora...https://cf.10xgenomics.com/supp/cell...
JR-1603_LPS_CSF_multiomes3://dp-lab-data/collaborators/aboir...3710{'All': ['s3://dp-lab-data/collabora...{'All': ['s3://dp-lab-data/collabora...https://cf.10xgenomics.com/supp/cell...
JR-1603_LM_blood_multiomes3://dp-lab-data/collaborators/aboir...3711{'All': ['s3://dp-lab-data/collabora...{'All': ['s3://dp-lab-data/collabora...https://cf.10xgenomics.com/supp/cell...
JR-1603_LPS_blood_multiomes3://dp-lab-data/collaborators/aboir...3712{'All': ['s3://dp-lab-data/collabora...{'All': ['s3://dp-lab-data/collabora...https://cf.10xgenomics.com/supp/cell...
JR-1603_veh_blood_multiomes3://dp-lab-data/collaborators/aboir...3713{'All': ['s3://dp-lab-data/collabora...{'All': ['s3://dp-lab-data/collabora...https://cf.10xgenomics.com/supp/cell...
\n", + "
" + ], + "text/plain": [ + " S3_Path \\\n", + "JR-1603_Mm_veh_CSF_multiome s3://dp-lab-data/collaborators/aboir... \n", + "JR-1603_LM_CSF_multiome s3://dp-lab-data/collaborators/aboir... \n", + "JR-1603_LPS_CSF_multiome s3://dp-lab-data/collaborators/aboir... \n", + "JR-1603_LM_blood_multiome s3://dp-lab-data/collaborators/aboir... \n", + "JR-1603_LPS_blood_multiome s3://dp-lab-data/collaborators/aboir... \n", + "JR-1603_veh_blood_multiome s3://dp-lab-data/collaborators/aboir... \n", + "\n", + " Sample_ID \\\n", + "JR-1603_Mm_veh_CSF_multiome 3708 \n", + "JR-1603_LM_CSF_multiome 3709 \n", + "JR-1603_LPS_CSF_multiome 3710 \n", + "JR-1603_LM_blood_multiome 3711 \n", + "JR-1603_LPS_blood_multiome 3712 \n", + "JR-1603_veh_blood_multiome 3713 \n", + "\n", + " FASTQs_GEX \\\n", + "JR-1603_Mm_veh_CSF_multiome {'All': ['s3://dp-lab-data/collabora... \n", + "JR-1603_LM_CSF_multiome {'All': ['s3://dp-lab-data/collabora... \n", + "JR-1603_LPS_CSF_multiome {'All': ['s3://dp-lab-data/collabora... \n", + "JR-1603_LM_blood_multiome {'All': ['s3://dp-lab-data/collabora... \n", + "JR-1603_LPS_blood_multiome {'All': ['s3://dp-lab-data/collabora... \n", + "JR-1603_veh_blood_multiome {'All': ['s3://dp-lab-data/collabora... \n", + "\n", + " FASTQs_ATAC \\\n", + "JR-1603_Mm_veh_CSF_multiome {'All': ['s3://dp-lab-data/collabora... \n", + "JR-1603_LM_CSF_multiome {'All': ['s3://dp-lab-data/collabora... \n", + "JR-1603_LPS_CSF_multiome {'All': ['s3://dp-lab-data/collabora... \n", + "JR-1603_LM_blood_multiome {'All': ['s3://dp-lab-data/collabora... \n", + "JR-1603_LPS_blood_multiome {'All': ['s3://dp-lab-data/collabora... \n", + "JR-1603_veh_blood_multiome {'All': ['s3://dp-lab-data/collabora... \n", + "\n", + " Reference \n", + "JR-1603_Mm_veh_CSF_multiome https://cf.10xgenomics.com/supp/cell... \n", + "JR-1603_LM_CSF_multiome https://cf.10xgenomics.com/supp/cell... \n", + "JR-1603_LPS_CSF_multiome https://cf.10xgenomics.com/supp/cell... \n", + "JR-1603_LM_blood_multiome https://cf.10xgenomics.com/supp/cell... \n", + "JR-1603_LPS_blood_multiome https://cf.10xgenomics.com/supp/cell... \n", + "JR-1603_veh_blood_multiome https://cf.10xgenomics.com/supp/cell... " + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "# Get information for all samples\n", - "sample_paths = [s.strip('/') for s in sample_paths] # remove trailing slash if exists\n", - "sample_names = [os.path.basename(s) for s in sample_paths]\n", - "#sample_names = [s.replace(\"Redo_\", \"\") for s in sample_names]\n", - "print(sample_names)\n", - "samples = pd.DataFrame(\n", - " sample_paths,\n", - " index=sample_names,\n", - " columns=[\"S3_Path\"],\n", - " dtype=str,\n", - ")\n", - "samples[\"Sample_ID\"] = pd.Series(samples.index).apply(\n", - " lambda x: get_sample_id(x, creds['user'], creds['password'])\n", - ").values\n", - "\n", "# Get FASTQ paths from S3\n", "# Note: Uses same FASTQ file ids for all samples\n", "#fastq_file_ids = fastq_map[prefix]\n", @@ -152,12 +657,13 @@ "samples[\"FASTQs_ATAC\"] = samples[\"S3_Path\"].apply(lambda x: get_fastqs(x + \"_ATAC\", folder=\"FASTQ\"))\n", "\n", "# Get reference genome location\n", - "samples[\"Reference\"] = samples[\"Sample_ID\"].apply(lambda x: get_cr_reference(x, prefix, creds[\"user\"], creds[\"password\"]))" + "samples[\"Reference\"] = samples[\"Sample_ID\"].apply(lambda x: get_cr_reference(x, prefix, creds[\"user\"], creds[\"password\"]))\n", + "samples" ] }, { "cell_type": "code", - "execution_count": 141, + "execution_count": 17, "metadata": {}, "outputs": [], "source": [ @@ -196,7 +702,14 @@ }, { "cell_type": "code", - "execution_count": 142, + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 18, "metadata": {}, "outputs": [ { @@ -231,22 +744,62 @@ " \n", " \n", " \n", - " HA-1536_Young_mice_multiome\n", - " HA-1536_Young_mice_multiome\n", - " 3573_HA-1536_Young_mice_multiome_IGO...\n", - " [s3://dp-lab-data/collaborators/VanD...\n", - " 3575_HA-1536_Young_mice_multiome_ATA...\n", - " [s3://dp-lab-data/collaborators/VanD...\n", + " JR-1603_Mm_veh_CSF_multiome\n", + " JR-1603_Mm_veh_CSF_multiome\n", + " 3708_JR-1603_Mm_veh_CSF_multiome_IGO...\n", + " [s3://dp-lab-data/collaborators/aboi...\n", + " 3714_JR-1603_Mm_veh_CSF_multiome_ATA...\n", + " [s3://dp-lab-data/collaborators/aboi...\n", " https://cf.10xgenomics.com/supp/cell...\n", " quay.io/hisplan\n", " \n", " \n", - " HA-1536_Old_mice_multiome\n", - " HA-1536_Old_mice_multiome\n", - " 3574_HA-1536_Old_mice_multiome_IGO_1...\n", - " [s3://dp-lab-data/collaborators/VanD...\n", - " 3576_HA-1536_Old_mice_multiome_ATAC_...\n", - " [s3://dp-lab-data/collaborators/VanD...\n", + " JR-1603_LM_CSF_multiome\n", + " JR-1603_LM_CSF_multiome\n", + " 3709_JR-1603_LM_CSF_multiome_IGO_124...\n", + " [s3://dp-lab-data/collaborators/aboi...\n", + " 3715_JR-1603_LM_CSF_multiome_ATAC_IG...\n", + " [s3://dp-lab-data/collaborators/aboi...\n", + " https://cf.10xgenomics.com/supp/cell...\n", + " quay.io/hisplan\n", + " \n", + " \n", + " JR-1603_LPS_CSF_multiome\n", + " JR-1603_LPS_CSF_multiome\n", + " 3710_JR-1603_LPS_CSF_multiome_IGO_12...\n", + " [s3://dp-lab-data/collaborators/aboi...\n", + " 3716_JR-1603_LPS_CSF_multiome_ATAC_I...\n", + " [s3://dp-lab-data/collaborators/aboi...\n", + " https://cf.10xgenomics.com/supp/cell...\n", + " quay.io/hisplan\n", + " \n", + " \n", + " JR-1603_LM_blood_multiome\n", + " JR-1603_LM_blood_multiome\n", + " 3711_JR-1603_LM_blood_multiome_IGO_1...\n", + " [s3://dp-lab-data/collaborators/aboi...\n", + " 3718_JR-1603_LM_blood_multiome_ATAC_...\n", + " [s3://dp-lab-data/collaborators/aboi...\n", + " https://cf.10xgenomics.com/supp/cell...\n", + " quay.io/hisplan\n", + " \n", + " \n", + " JR-1603_LPS_blood_multiome\n", + " JR-1603_LPS_blood_multiome\n", + " 3712_JR-1603_LPS_blood_multiome_IGO_...\n", + " [s3://dp-lab-data/collaborators/aboi...\n", + " 3719_JR-1603_LPS_blood_multiome_ATAC...\n", + " [s3://dp-lab-data/collaborators/aboi...\n", + " https://cf.10xgenomics.com/supp/cell...\n", + " quay.io/hisplan\n", + " \n", + " \n", + " JR-1603_veh_blood_multiome\n", + " JR-1603_veh_blood_multiome\n", + " 3713_JR-1603_veh_blood_multiome_IGO_...\n", + " [s3://dp-lab-data/collaborators/aboi...\n", + " 3717_JR-1603_veh_blood_multiome_ATAC...\n", + " [s3://dp-lab-data/collaborators/aboi...\n", " https://cf.10xgenomics.com/supp/cell...\n", " quay.io/hisplan\n", " \n", @@ -256,35 +809,63 @@ ], "text/plain": [ " CellRangerArc.runID \\\n", - "HA-1536_Young_mice_multiome HA-1536_Young_mice_multiome \n", - "HA-1536_Old_mice_multiome HA-1536_Old_mice_multiome \n", + "JR-1603_Mm_veh_CSF_multiome JR-1603_Mm_veh_CSF_multiome \n", + "JR-1603_LM_CSF_multiome JR-1603_LM_CSF_multiome \n", + "JR-1603_LPS_CSF_multiome JR-1603_LPS_CSF_multiome \n", + "JR-1603_LM_blood_multiome JR-1603_LM_blood_multiome \n", + "JR-1603_LPS_blood_multiome JR-1603_LPS_blood_multiome \n", + "JR-1603_veh_blood_multiome JR-1603_veh_blood_multiome \n", "\n", " CellRangerArc.gexFastqName \\\n", - "HA-1536_Young_mice_multiome 3573_HA-1536_Young_mice_multiome_IGO... \n", - "HA-1536_Old_mice_multiome 3574_HA-1536_Old_mice_multiome_IGO_1... \n", + "JR-1603_Mm_veh_CSF_multiome 3708_JR-1603_Mm_veh_CSF_multiome_IGO... \n", + "JR-1603_LM_CSF_multiome 3709_JR-1603_LM_CSF_multiome_IGO_124... \n", + "JR-1603_LPS_CSF_multiome 3710_JR-1603_LPS_CSF_multiome_IGO_12... \n", + "JR-1603_LM_blood_multiome 3711_JR-1603_LM_blood_multiome_IGO_1... \n", + "JR-1603_LPS_blood_multiome 3712_JR-1603_LPS_blood_multiome_IGO_... \n", + "JR-1603_veh_blood_multiome 3713_JR-1603_veh_blood_multiome_IGO_... \n", "\n", " CellRangerArc.gexFastqFiles \\\n", - "HA-1536_Young_mice_multiome [s3://dp-lab-data/collaborators/VanD... \n", - "HA-1536_Old_mice_multiome [s3://dp-lab-data/collaborators/VanD... \n", + "JR-1603_Mm_veh_CSF_multiome [s3://dp-lab-data/collaborators/aboi... \n", + "JR-1603_LM_CSF_multiome [s3://dp-lab-data/collaborators/aboi... \n", + "JR-1603_LPS_CSF_multiome [s3://dp-lab-data/collaborators/aboi... \n", + "JR-1603_LM_blood_multiome [s3://dp-lab-data/collaborators/aboi... \n", + "JR-1603_LPS_blood_multiome [s3://dp-lab-data/collaborators/aboi... \n", + "JR-1603_veh_blood_multiome [s3://dp-lab-data/collaborators/aboi... \n", "\n", " CellRangerArc.atacFastqName \\\n", - "HA-1536_Young_mice_multiome 3575_HA-1536_Young_mice_multiome_ATA... \n", - "HA-1536_Old_mice_multiome 3576_HA-1536_Old_mice_multiome_ATAC_... \n", + "JR-1603_Mm_veh_CSF_multiome 3714_JR-1603_Mm_veh_CSF_multiome_ATA... \n", + "JR-1603_LM_CSF_multiome 3715_JR-1603_LM_CSF_multiome_ATAC_IG... \n", + "JR-1603_LPS_CSF_multiome 3716_JR-1603_LPS_CSF_multiome_ATAC_I... \n", + "JR-1603_LM_blood_multiome 3718_JR-1603_LM_blood_multiome_ATAC_... \n", + "JR-1603_LPS_blood_multiome 3719_JR-1603_LPS_blood_multiome_ATAC... \n", + "JR-1603_veh_blood_multiome 3717_JR-1603_veh_blood_multiome_ATAC... \n", "\n", " CellRangerArc.atacFastqFiles \\\n", - "HA-1536_Young_mice_multiome [s3://dp-lab-data/collaborators/VanD... \n", - "HA-1536_Old_mice_multiome [s3://dp-lab-data/collaborators/VanD... \n", + "JR-1603_Mm_veh_CSF_multiome [s3://dp-lab-data/collaborators/aboi... \n", + "JR-1603_LM_CSF_multiome [s3://dp-lab-data/collaborators/aboi... \n", + "JR-1603_LPS_CSF_multiome [s3://dp-lab-data/collaborators/aboi... \n", + "JR-1603_LM_blood_multiome [s3://dp-lab-data/collaborators/aboi... \n", + "JR-1603_LPS_blood_multiome [s3://dp-lab-data/collaborators/aboi... \n", + "JR-1603_veh_blood_multiome [s3://dp-lab-data/collaborators/aboi... \n", "\n", " CellRangerArc.reference \\\n", - "HA-1536_Young_mice_multiome https://cf.10xgenomics.com/supp/cell... \n", - "HA-1536_Old_mice_multiome https://cf.10xgenomics.com/supp/cell... \n", + "JR-1603_Mm_veh_CSF_multiome https://cf.10xgenomics.com/supp/cell... \n", + "JR-1603_LM_CSF_multiome https://cf.10xgenomics.com/supp/cell... \n", + "JR-1603_LPS_CSF_multiome https://cf.10xgenomics.com/supp/cell... \n", + "JR-1603_LM_blood_multiome https://cf.10xgenomics.com/supp/cell... \n", + "JR-1603_LPS_blood_multiome https://cf.10xgenomics.com/supp/cell... \n", + "JR-1603_veh_blood_multiome https://cf.10xgenomics.com/supp/cell... \n", "\n", " CellRangerArc.dockerRegistry \n", - "HA-1536_Young_mice_multiome quay.io/hisplan \n", - "HA-1536_Old_mice_multiome quay.io/hisplan " + "JR-1603_Mm_veh_CSF_multiome quay.io/hisplan \n", + "JR-1603_LM_CSF_multiome quay.io/hisplan \n", + "JR-1603_LPS_CSF_multiome quay.io/hisplan \n", + "JR-1603_LM_blood_multiome quay.io/hisplan \n", + "JR-1603_LPS_blood_multiome quay.io/hisplan \n", + "JR-1603_veh_blood_multiome quay.io/hisplan " ] }, - "execution_count": 142, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -295,7 +876,40 @@ }, { "cell_type": "code", - "execution_count": 143, + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array(['https://cf.10xgenomics.com/supp/cell-arc/refdata-cellranger-arc-mm10-2020-A-2.0.0.tar.gz',\n", + " 'https://cf.10xgenomics.com/supp/cell-arc/refdata-cellranger-arc-mm10-2020-A-2.0.0.tar.gz',\n", + " 'https://cf.10xgenomics.com/supp/cell-arc/refdata-cellranger-arc-mm10-2020-A-2.0.0.tar.gz',\n", + " 'https://cf.10xgenomics.com/supp/cell-arc/refdata-cellranger-arc-mm10-2020-A-2.0.0.tar.gz',\n", + " 'https://cf.10xgenomics.com/supp/cell-arc/refdata-cellranger-arc-mm10-2020-A-2.0.0.tar.gz',\n", + " 'https://cf.10xgenomics.com/supp/cell-arc/refdata-cellranger-arc-mm10-2020-A-2.0.0.tar.gz'],\n", + " dtype=object)" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "inputs[f'{prefix}.reference'].values" + ] + }, + { + "cell_type": "code", + "execution_count": 19, "metadata": {}, "outputs": [ { @@ -330,48 +944,104 @@ " \n", " \n", " \n", - " HA-1536_Young_mice_multiome\n", + " JR-1603_Mm_veh_CSF_multiome\n", + " CellRangerARC\n", + " mouse CSF multiome\n", + " JR-1603_Mm_veh_CSF_multiome\n", + " sohailn\n", + " s3://dp-lab-data/collaborators/aboir...\n", + " -\n", + " sohailn\n", + " \n", + " \n", + " JR-1603_LM_CSF_multiome\n", + " CellRangerARC\n", + " mouse CSF multiome\n", + " JR-1603_LM_CSF_multiome\n", + " sohailn\n", + " s3://dp-lab-data/collaborators/aboir...\n", + " -\n", + " sohailn\n", + " \n", + " \n", + " JR-1603_LPS_CSF_multiome\n", + " CellRangerARC\n", + " mouse CSF multiome\n", + " JR-1603_LPS_CSF_multiome\n", + " sohailn\n", + " s3://dp-lab-data/collaborators/aboir...\n", + " -\n", + " sohailn\n", + " \n", + " \n", + " JR-1603_LM_blood_multiome\n", " CellRangerARC\n", - " Aging hematopoiesis\n", - " HA-1536_Young_mice_multiome\n", - " moormana\n", - " s3://dp-lab-data/collaborators/VanDe...\n", + " mouse CSF multiome\n", + " JR-1603_LM_blood_multiome\n", + " sohailn\n", + " s3://dp-lab-data/collaborators/aboir...\n", " -\n", - " moormana\n", + " sohailn\n", " \n", " \n", - " HA-1536_Old_mice_multiome\n", + " JR-1603_LPS_blood_multiome\n", " CellRangerARC\n", - " Aging hematopoiesis\n", - " HA-1536_Old_mice_multiome\n", - " moormana\n", - " s3://dp-lab-data/collaborators/VanDe...\n", + " mouse CSF multiome\n", + " JR-1603_LPS_blood_multiome\n", + " sohailn\n", + " s3://dp-lab-data/collaborators/aboir...\n", " -\n", - " moormana\n", + " sohailn\n", + " \n", + " \n", + " JR-1603_veh_blood_multiome\n", + " CellRangerARC\n", + " mouse CSF multiome\n", + " JR-1603_veh_blood_multiome\n", + " sohailn\n", + " s3://dp-lab-data/collaborators/aboir...\n", + " -\n", + " sohailn\n", " \n", " \n", "\n", "" ], "text/plain": [ - " pipelineType project \\\n", - "HA-1536_Young_mice_multiome CellRangerARC Aging hematopoiesis \n", - "HA-1536_Old_mice_multiome CellRangerARC Aging hematopoiesis \n", + " pipelineType project \\\n", + "JR-1603_Mm_veh_CSF_multiome CellRangerARC mouse CSF multiome \n", + "JR-1603_LM_CSF_multiome CellRangerARC mouse CSF multiome \n", + "JR-1603_LPS_CSF_multiome CellRangerARC mouse CSF multiome \n", + "JR-1603_LM_blood_multiome CellRangerARC mouse CSF multiome \n", + "JR-1603_LPS_blood_multiome CellRangerARC mouse CSF multiome \n", + "JR-1603_veh_blood_multiome CellRangerARC mouse CSF multiome \n", "\n", - " sample owner \\\n", - "HA-1536_Young_mice_multiome HA-1536_Young_mice_multiome moormana \n", - "HA-1536_Old_mice_multiome HA-1536_Old_mice_multiome moormana \n", + " sample owner \\\n", + "JR-1603_Mm_veh_CSF_multiome JR-1603_Mm_veh_CSF_multiome sohailn \n", + "JR-1603_LM_CSF_multiome JR-1603_LM_CSF_multiome sohailn \n", + "JR-1603_LPS_CSF_multiome JR-1603_LPS_CSF_multiome sohailn \n", + "JR-1603_LM_blood_multiome JR-1603_LM_blood_multiome sohailn \n", + "JR-1603_LPS_blood_multiome JR-1603_LPS_blood_multiome sohailn \n", + "JR-1603_veh_blood_multiome JR-1603_veh_blood_multiome sohailn \n", "\n", " destination transfer \\\n", - "HA-1536_Young_mice_multiome s3://dp-lab-data/collaborators/VanDe... - \n", - "HA-1536_Old_mice_multiome s3://dp-lab-data/collaborators/VanDe... - \n", + "JR-1603_Mm_veh_CSF_multiome s3://dp-lab-data/collaborators/aboir... - \n", + "JR-1603_LM_CSF_multiome s3://dp-lab-data/collaborators/aboir... - \n", + "JR-1603_LPS_CSF_multiome s3://dp-lab-data/collaborators/aboir... - \n", + "JR-1603_LM_blood_multiome s3://dp-lab-data/collaborators/aboir... - \n", + "JR-1603_LPS_blood_multiome s3://dp-lab-data/collaborators/aboir... - \n", + "JR-1603_veh_blood_multiome s3://dp-lab-data/collaborators/aboir... - \n", "\n", - " comment \n", - "HA-1536_Young_mice_multiome moormana \n", - "HA-1536_Old_mice_multiome moormana " + " comment \n", + "JR-1603_Mm_veh_CSF_multiome sohailn \n", + "JR-1603_LM_CSF_multiome sohailn \n", + "JR-1603_LPS_CSF_multiome sohailn \n", + "JR-1603_LM_blood_multiome sohailn \n", + "JR-1603_LPS_blood_multiome sohailn \n", + "JR-1603_veh_blood_multiome sohailn " ] }, - "execution_count": 143, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } @@ -382,7 +1052,7 @@ }, { "cell_type": "code", - "execution_count": 139, + "execution_count": 32, "metadata": { "tags": [] }, @@ -390,12 +1060,12 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "b8a2a9c63f794d19a5ec5dfb07189768", + "model_id": "607945276fa64aadb7b02efee705038f", "version_major": 2, "version_minor": 0 }, "text/plain": [ - " 0%| | 0/2 [00:00 Date: Mon, 12 Sep 2022 11:38:07 -0400 Subject: [PATCH 09/16] Updated, cleaner version of notebooks with all sample information --- notebooks/Run_CellRangerGex.ipynb | 1757 ++++++++--------------------- notebooks/utils/utils.py | 448 ++++---- 2 files changed, 719 insertions(+), 1486 deletions(-) diff --git a/notebooks/Run_CellRangerGex.ipynb b/notebooks/Run_CellRangerGex.ipynb index e5538ea..86923cb 100644 --- a/notebooks/Run_CellRangerGex.ipynb +++ b/notebooks/Run_CellRangerGex.ipynb @@ -3,6 +3,7 @@ { "cell_type": "code", "execution_count": 1, + "id": "fbbdcd09-b369-493d-9402-ca18a45eee5d", "metadata": {}, "outputs": [], "source": [ @@ -13,749 +14,145 @@ "from pathlib import Path\n", "from tqdm.notebook import tqdm\n", "from packaging import version\n", + "\n", + "import glob\n", + "import os\n", + "\n", "pd.set_option(\"display.max_colwidth\", 40)" ] }, - { - "cell_type": "markdown", - "metadata": { - "tags": [], - "toc-hr-collapsed": true - }, - "source": [ - "# Define Helper Functions" - ] - }, { "cell_type": "code", "execution_count": 2, + "id": "ca66d7bc-a113-454a-b4d4-7e2a56203dc4", "metadata": {}, "outputs": [], "source": [ - "# FASTQ reads/indices required for each workflow\n", - "fastq_map = {\n", - " 'Hashtag': ['R1','R2'],\n", - " 'CiteSeq': ['R1','R2'],\n", - " 'AsapSeq': ['R1','R2','R3'],\n", - " 'CellRangerATAC': ['I1','R1','R2','R3'],\n", - " 'CellRangerGex': ['I1','R1','R2'],\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "# Get fastq file paths on S3 for each file id\n", - "# Returns dictionary from id to s3 path\n", - "# Throws exception if FASTQs don't exist for any id\n", - "def get_fastqs(\n", - " path: str, # path to directory containing FASTQ files\n", - " fastq_file_ids: list, # FASTQ file ids needed for this run type (e.g. I1, R1, R2, etc.)\n", - " folder: str = \"\",\n", - "):\n", - " fastq_map = dict()\n", - " _, bucket, key, _, _ = urllib.parse.urlsplit(f\"{path}/{folder}\")\n", - " for fid in fastq_file_ids:\n", - " files = get_s3_objects(\n", - " bucket, key.lstrip(\"/\"),\n", - " re.compile(f\"_{fid}_\\d{{3}}.fastq.gz$\")\n", - " )\n", - " try:\n", - " assert files, f\"AssertionError: Missing `{fid}` archives!\"\n", - " fastq_map[fid] = [os.path.join(\"s3://\", bucket, str(f)) for f in files]\n", - " except AssertionError as err:\n", - " logging.warning(\"%s\\n\\t %s\", err, path)\n", - " return\n", - " return fastq_map" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# from SCRIdb\n", - "def get_s3_objects(bucket, key, pattern, full_uri=False):\n", - " \n", - " s3r = boto3.resource(\"s3\")\n", - " bucket_s3 = s3r.Bucket(bucket)\n", - " objects = []\n", - " for obj in bucket_s3.objects.filter(Prefix=key):\n", - " hit = pattern.search(obj.key)\n", - " if hit:\n", - " objects.append(obj.key)\n", - " if full_uri:\n", - " objects = [f\"s3://{bucket}/{o}\" for o in objects]\n", - " return objects" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "# Extract FASTQ sample name from list of files\n", - "# Note: FASTQ name is file name up to lane id (e.g. L001, L002, etc.)\n", - "def get_fastqs_name(fastqs):\n", - " fastq_name_re = r\".*/(.*)_S\\d+_L\\d{3}_[A-Za-z]\\d_\\d{3}.fastq.gz$\"\n", - " fastq_names = [re.match(fastq_name_re, x)[1] for x in fastqs]\n", - " assert len(set(fastq_names)) == 1 # make sure all names are same\n", - " return fastq_names[0]" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "# Numpy encoder for JSON from pandas series\n", - "class NpEncoder(json.JSONEncoder):\n", - " def default(self, obj):\n", - " if isinstance(obj, np.integer):\n", - " return int(obj)\n", - " elif isinstance(obj, np.floating):\n", - " return float(obj)\n", - " elif isinstance(obj, np.ndarray):\n", - " return obj.tolist()\n", - " else:\n", - " return super(NpEncoder, self).default(obj)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "def execute_query(query, user, password):\n", - " with connect(\n", - " host=\"peer-lab-db.cggxmlwgzzpw.us-east-1.rds.amazonaws.com\",\n", - " database=\"peer_lab_db\",\n", - " user=user,\n", - " password=password,\n", - " ) as connection:\n", - " with connection.cursor(buffered=True) as cursor:\n", - " cursor.execute(query)\n", - " result = cursor.fetchall()\n", - " return result" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# Get species from database for given sample\n", - "from mysql.connector import connect, Error\n", - "\n", - "def get_species(sample_id, user, password):\n", - " try:\n", - " table_sample_data = \"peer_lab_db.sample_data\"\n", - " table_species = \"peer_lab_db.species\"\n", - " table_genome_idx = \"peer_lab_db.genome_index\"\n", - " query = f\"\"\"\n", - " SELECT {table_species}.Species\n", - " FROM {table_species}\n", - " LEFT JOIN {table_genome_idx}\n", - " ON {table_species}.id = {table_genome_idx}.species_id\n", - " LEFT JOIN {table_sample_data}\n", - " ON {table_genome_idx}.id = {table_sample_data}.genomeIndex_id\n", - " WHERE {table_sample_data}.id = {sample_id}\n", - " \"\"\"\n", - " result = execute_query(query, user, password)[0][0]\n", - " return result\n", - " except Error as e:\n", - " print(f\"Error: {e}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# Get species from database for given sample\n", - "from mysql.connector import connect, Error\n", - "\n", - "def get_sc_tech(sample_id, user, password):\n", - " try:\n", - " table_sample_data = \"peer_lab_db.sample_data\"\n", - " table_sc_tech = \"peer_lab_db.sc_tech\"\n", - " table_genome_idx = \"peer_lab_db.genome_index\"\n", - " query = f\"\"\"\n", - " SELECT {table_sc_tech}.sc_Tech\n", - " FROM {table_sc_tech}\n", - " LEFT JOIN {table_genome_idx}\n", - " ON {table_sc_tech}.id = {table_genome_idx}.scTech_id\n", - " LEFT JOIN {table_sample_data}\n", - " ON {table_genome_idx}.id = {table_sample_data}.genomeIndex_id\n", - " WHERE {table_sample_data}.id = {sample_id}\n", - " \"\"\"\n", - " result = execute_query(query, user, password)[0][0]\n", - " return result\n", - " except Error as e:\n", - " print(f\"Error: {e}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# Get species from database for given sample\n", - "from mysql.connector import connect, Error\n", - "\n", - "def get_sample_id(sample_name, user, password):\n", - " try:\n", - " table_sample_data = \"peer_lab_db.sample_data\"\n", - " query = f\"\"\"\n", - " SELECT {table_sample_data}.id\n", - " FROM {table_sample_data}\n", - " WHERE {table_sample_data}.Sample=\"{sample_name}\"\n", - " \"\"\"\n", - " result = execute_query(query, user, password)[0][0]\n", - " return result\n", - " except Error as e:\n", - " print(f\"Error: {e}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# Get species from database for given sample\n", - "from mysql.connector import connect, Error\n", - "\n", - "def get_project_id(sample_id, user, password):\n", - " try:\n", - " table_sample_data = \"peer_lab_db.sample_data\"\n", - " table_project_data = \"peer_lab_db.project_data\"\n", - " query = f\"\"\"\n", - " SELECT {table_project_data}.projectName\n", - " FROM {table_project_data}\n", - " LEFT JOIN {table_sample_data}\n", - " ON {table_project_data}.id = {table_sample_data}.projectData_id\n", - " WHERE {table_sample_data}.id = {sample_id}\n", - " \"\"\"\n", - " result = execute_query(query, user, password)[0][0]\n", - " return result\n", - " except Error as e:\n", - " print(f\"Error: {e}\")" + "from utils.utils import *" ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, + "id": "92d253e4-bb0c-410f-9608-0bb729af6649", "metadata": {}, "outputs": [], - "source": [ - "def get_SEQC_version(loc):\n", - " try:\n", - " cmd = f\"aws s3 cp {loc}/seqc-results/seqc_log.txt -\"\n", - " out = subprocess.run(shlex.split(cmd), universal_newlines=True, capture_output=True).__dict__[\"stdout\"]\n", - " version = re.match(r\".*SEQC=v(\\d+\\.\\d+\\.\\d+).*\", out)[1]\n", - " return version\n", - " except:\n", - " return \"N/A\"" - ] + "source": [] }, { - "cell_type": "code", - "execution_count": 13, + "cell_type": "markdown", + "id": "2de5f2a6-dba8-486d-bb07-92dbeff10150", "metadata": {}, - "outputs": [], "source": [ - "def get_file_prefix(loc):\n", - " try:\n", - " cmd = f\"aws s3 ls {loc}/seqc-results/\"\n", - " out = subprocess.run(shlex.split(cmd), universal_newlines=True, capture_output=True).__dict__[\"stdout\"]\n", - " \n", - " # Note: I'm expecting the aligned bam file to be in loc\n", - " bam_pattern = re.compile(r\"(.*)_Aligned\\.out\\.bam$\")\n", - " filename = list(filter(bam_pattern.match, out.split()))[0]\n", - " file_prefix = re.match(bam_pattern, filename)[1]\n", - " return file_prefix\n", - " except:\n", - " raise ValueError(f\"BAM file not found in {loc}\")\n", - " return \"\"" + "# AWS setup" ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 3, + "id": "1023bdd2-6db6-4274-bd1b-13f092fd11d9", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "env: AWS_ACCESS_KEY_ID=ASIAYPY66CWMGLBAIGO6\n", + "env: AWS_SECRET_ACCESS_KEY=i6fm87l+UNBLyxlwU4AXD2HEGTXYutOlj4lfB9bk\n", + "env: AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEK///////////wEaCXVzLWVhc3QtMSJHMEUCIQCAs8AyD3w8/luR3fB4wyOA0fC5vzw2nyzspQ7/+Pgf/AIgBhFvsspOJmLbACqO8/42UuRe7nu6vdi7DaJ5k/UFDxsq7wEISBADGgw1ODM2NDM1Njc1MTIiDP2ESPVfC1OK7pmq+SrMAQRwXr+RvcapTJP/skUqP4og+mqro7RYgBPQ8OQKWReZ0JLWYk2+/npsDqlMM5j7Zre4aQPkttvkyacSoDBo4B/SufvOD5eotZyXsKR5zEjrgn9HTQGxlylIakbUK/7pJSe4pJxAya79ZEC/1PrAUYnZR2ZGGgYgRF0oIwzbLblSoAmBYeNbbkbluJC3qbicERnH/BHlO4oHXPMesuS+QncRWn8rlRxGRySgTaW+gcH2tBwDBhB+RURyCtXC3AyJmQ7tp4MerTHhTToIaTCIqe2YBjqYAbdygCv6Qz2i+YqCafTb2npOoT7PPA6ooeWnXXzZXPc8POEASCBAq6bOIWvGWcKxwVwgode8mb8/R9oBnXQh0wdqm+ufpGuUAaVE8Y8rgNGXiKnCq/QywzTtjpgOTvJkYw8WPUWE6J8KhN10WqJtEdvif9E15Zqj7H69BL+Zy2wayYbu35OTPBuK3q4QlAVNk5fS+Uvkwxyz\n", + "2021-10-07 15:31:32 agc-583643567512-us-east-1\n", + "2021-10-07 15:28:07 cdktoolkit-stagingbucket-d49u1xfb0sc4\n", + "2019-10-09 13:04:06 cf-templates-umiwbnq3566w-us-east-1\n", + "2019-10-10 12:46:54 dp-daily-reports\n", + "2017-09-26 10:15:15 dp-lab-data\n", + "2019-05-23 12:34:58 dp-lab-data-public\n", + "2018-03-01 13:29:07 dp-lab-glacier\n", + "2020-11-06 23:02:27 dp-lab-gwf-core\n", + "2021-07-15 18:14:01 dp-lab-gwf-core2\n", + "2017-09-26 10:17:18 dp-lab-home\n", + "2019-08-14 16:42:43 dp-lab-test\n", + "2019-04-25 12:35:35 elasticbeanstalk-us-east-1-583643567512\n", + "2019-12-13 15:53:57 scri-computational\n", + "2017-09-26 10:23:50 seqc-public\n" + ] + } + ], "source": [ - "# FASTQ reads/indices required for each workflow\n", - "# Shoudl replace with JSON file\n", - "cr_reference_map = {\n", - " 'CellRangerArc':\n", - " {\n", - " 'Human': \"https://cf.10xgenomics.com/supp/cell-arc/refdata-cellranger-arc-GRCh38-2020-A.tar.gz\",\n", - " 'Mouse': \"https://cf.10xgenomics.com/supp/cell-arc/refdata-cellranger-arc-mm10-2020-A-2.0.0.tar.gz\",\n", - " },\n", - " 'CellRangerATAC':\n", - " {\n", - " 'Human': \"https://cf.10xgenomics.com/supp/cell-atac/refdata-cellranger-arc-GRCh38-2020-A-2.0.0.tar.gz\",\n", - " 'Mouse': \"https://cf.10xgenomics.com/supp/cell-atac/refdata-cellranger-arc-mm10-2020-A-2.0.0.tar.gz\",\n", - " },\n", - " 'CellRangerGex':\n", - " {\n", - " 'Human': \"https://cf.10xgenomics.com/supp/cell-exp/refdata-gex-GRCh38-2020-A.tar.gz\",\n", - " 'Mouse': \"https://cf.10xgenomics.com/supp/cell-exp/refdata-gex-mm10-2020-A.tar.gz\",\n", - " },\n", - "}\n", + "# Load aws\n", "\n", - "def get_cr_reference(sample_id, prefix, user, password):\n", - " # Get species from database to decide reference\n", - " species = get_species(sample_id, user, password)\n", - " \n", - " # Map to reference locations\n", - " try:\n", - " return cr_reference_map[prefix][species]\n", - " except:\n", - " raise ValueError(f\"Unknown Species: {species}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "def get_bc_whitelist(sample_id):\n", - " # Get version from database to decide whitelist\n", - " sc_tech = get_sc_tech(sample_id, creds[\"user\"], creds[\"password\"])\n", - " \n", - " # Map to reference locations\n", - " if \"V3\" in sc_tech:\n", - " return \"s3://seqc-public/barcodes/ten_x_v3/flat/3M-february-2018.txt\"\n", - " elif \"V2\" in sc_tech:\n", - " return \"s3://seqc-public/barcodes/ten_x_v2/flat/737K-august-2016.txt\"\n", - " else:\n", - " raise ValueError(f\"Unknown Technology: {sc_tech}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "def run(\n", - " workflow_path: str,\n", - " execp: str,\n", - " secrets: str,\n", - " inputs: str,\n", - " labels: str,\n", - " options: str,\n", - "):\n", - " # change working directory to the pipeline package\n", - " oldwd = os.getcwd()\n", - " os.chdir(workflow_path)\n", - " \n", - " # execute the pipeline command\n", - " cmd = f\"{workflow_path}/{execp} -k {secrets} -i {inputs} -l {labels} -o {options}\"\n", - " var = subprocess.run(shlex.split(cmd), universal_newlines=True, capture_output=True)\n", - " out = var.__dict__\n", - " \n", - " # change working directory back\n", - " os.chdir(oldwd)\n", - " \n", - " return out" + "%env AWS_ACCESS_KEY_ID=ASIAYPY66CWMGLBAIGO6\n", + "%env AWS_SECRET_ACCESS_KEY=i6fm87l+UNBLyxlwU4AXD2HEGTXYutOlj4lfB9bk\n", + "%env AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEK///////////wEaCXVzLWVhc3QtMSJHMEUCIQCAs8AyD3w8/luR3fB4wyOA0fC5vzw2nyzspQ7/+Pgf/AIgBhFvsspOJmLbACqO8/42UuRe7nu6vdi7DaJ5k/UFDxsq7wEISBADGgw1ODM2NDM1Njc1MTIiDP2ESPVfC1OK7pmq+SrMAQRwXr+RvcapTJP/skUqP4og+mqro7RYgBPQ8OQKWReZ0JLWYk2+/npsDqlMM5j7Zre4aQPkttvkyacSoDBo4B/SufvOD5eotZyXsKR5zEjrgn9HTQGxlylIakbUK/7pJSe4pJxAya79ZEC/1PrAUYnZR2ZGGgYgRF0oIwzbLblSoAmBYeNbbkbluJC3qbicERnH/BHlO4oHXPMesuS+QncRWn8rlRxGRySgTaW+gcH2tBwDBhB+RURyCtXC3AyJmQ7tp4MerTHhTToIaTCIqe2YBjqYAbdygCv6Qz2i+YqCafTb2npOoT7PPA6ooeWnXXzZXPc8POEASCBAq6bOIWvGWcKxwVwgode8mb8/R9oBnXQh0wdqm+ufpGuUAaVE8Y8rgNGXiKnCq/QywzTtjpgOTvJkYw8WPUWE6J8KhN10WqJtEdvif9E15Zqj7H69BL+Zy2wayYbu35OTPBuK3q4QlAVNk5fS+Uvkwxyz\n", + "!aws s3 ls" ] }, { "cell_type": "code", "execution_count": null, + "id": "ec0b1510-6658-48b8-a9ec-76e52d414357", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", + "id": "f3151feb-24bb-4ef2-89db-c6e2ef1ea6f1", "metadata": { "tags": [] }, "source": [ - "## Additional functions" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "jp-MarkdownHeadingCollapsed": true, - "tags": [] - }, - "source": [ - "### DB query" + "# Setup" ] }, { "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "# Common query col: id, request_id, Sample\n", - "def get_sample_name(query, query_col, creds):\n", - " \n", - " user = creds['user']\n", - " password = creds['password']\n", - " \n", - " try:\n", - " table_sample_data = \"peer_lab_db.sample_data\"\n", - " query = f\"\"\"\n", - " SELECT {table_sample_data}.Sample\n", - " FROM {table_sample_data}\n", - " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", - " \"\"\"\n", - " sample_names = []\n", - " results = execute_query(query, user, password)\n", - " for result in results:\n", - " sample_names.append(result[0])\n", - " return sample_names\n", - " except Error as e:\n", - " print(f\"Error: {e}\")\n", - " \n", - " \n", - "def get_aws_path(query, query_col, creds):\n", - " \n", - " user = creds['user']\n", - " password = creds['password']\n", - " \n", - " try:\n", - " table_sample_data = \"peer_lab_db.sample_data\"\n", - " query = f\"\"\"\n", - " SELECT {table_sample_data}.AWS_storage\n", - " FROM {table_sample_data}\n", - " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", - " \"\"\"\n", - " sample_paths = []\n", - " results = execute_query(query, user, password)\n", - " for result in results:\n", - " sample_paths.append(result[0])\n", - " return sample_paths\n", - " except Error as e:\n", - " print(f\"Error: {e}\")\n", - " \n", - " \n", - "def get_sample_id(query, query_col, creds):\n", - " \n", - " user = creds['user']\n", - " password = creds['password']\n", - " \n", - " try:\n", - " table_sample_data = \"peer_lab_db.sample_data\"\n", - " query = f\"\"\"\n", - " SELECT {table_sample_data}.id\n", - " FROM {table_sample_data}\n", - " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", - " \"\"\"\n", - " sample_ids = []\n", - " results = execute_query(query, user, password)\n", - " for result in results:\n", - " sample_ids.append(result[0])\n", - " return sample_ids\n", - " except Error as e:\n", - " print(f\"Error: {e}\")\n", - " \n", - "def format_sample_aws(querys, query_col, creds):\n", - " sample_names = []\n", - " sample_paths = []\n", - " sample_ids = []\n", - " \n", - " for query in querys:\n", - " sample_names += get_sample_name(query, query_col, creds)\n", - " sample_paths += get_aws_path(query, query_col, creds)\n", - " sample_ids += get_sample_id(query, query_col, creds)\n", - " \n", - " sample_paths = [s.strip('/') for s in sample_paths] # remove trailing slash if exists\n", - " \n", - " samples = pd.DataFrame(\n", - " dict(S3_Path=sample_paths, Sample_ID=sample_ids),\n", - " index=sample_names,\n", - " dtype=str,\n", - " )\n", - " return samples" - ] - }, - { - "cell_type": "code", - "execution_count": 18, + "execution_count": 4, + "id": "344f296d-dcda-4c92-9a18-57d587e6827e", "metadata": {}, "outputs": [], "source": [ - "def get_genomeIndex_id(query, query_col, creds):\n", - " user = creds['user']\n", - " password = creds['password']\n", - " \n", - " try:\n", - " table_sample_data = \"peer_lab_db.sample_data\"\n", - " query = f\"\"\"\n", - " SELECT {table_sample_data}.genomeIndex_id\n", - " FROM {table_sample_data}\n", - " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", - " \"\"\"\n", - " \n", - " results = execute_query(query, user, password)\n", - " for result in results:\n", - " genomeIndex_id = result[0]\n", - " \n", - " return genomeIndex_id\n", - " \n", - " except Error as e:\n", - " print(f\"Error: {e}\")\n", - " \n", - "def get_scTech_id(query, query_col, creds):\n", - " user = creds['user']\n", - " password = creds['password']\n", - " \n", - " try:\n", - " table_sample_data = \"peer_lab_db.genome_index\"\n", - " query = f\"\"\"\n", - " SELECT {table_sample_data}.scTech_id\n", - " FROM {table_sample_data}\n", - " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", - " \"\"\"\n", - " \n", - " results = execute_query(query, user, password)\n", - " for result in results:\n", - " scTech_id = result[0]\n", - " \n", - " return scTech_id\n", - " \n", - " except Error as e:\n", - " print(f\"Error: {e}\")\n", - " \n", - "def get_index(query, query_col, creds):\n", - " user = creds['user']\n", - " password = creds['password']\n", - " \n", - " try:\n", - " table_sample_data = \"peer_lab_db.genome_index\"\n", - " query = f\"\"\"\n", - " SELECT {table_sample_data}.gIndex\n", - " FROM {table_sample_data}\n", - " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", - " \"\"\"\n", - " \n", - " results = execute_query(query, user, password)\n", - " for result in results:\n", - " index = result[0]\n", - " \n", - " return index\n", - " \n", - " except Error as e:\n", - " print(f\"Error: {e}\")\n", - " \n", - "def get_assay(query, query_col, creds):\n", - " user = creds['user']\n", - " password = creds['password']\n", - " \n", - " try:\n", - " table_sample_data = \"peer_lab_db.sc_tech\"\n", - " query = f\"\"\"\n", - " SELECT {table_sample_data}.Run_name\n", - " FROM {table_sample_data}\n", - " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", - " \"\"\"\n", - " \n", - " results = execute_query(query, user, password)\n", - " for result in results:\n", - " assay = result[0]\n", - " \n", - " return assay\n", - " \n", - " except Error as e:\n", - " print(f\"Error: {e}\")\n", - " \n", - "def get_barcode(query, query_col, creds):\n", - " user = creds['user']\n", - " password = creds['password']\n", - " \n", - " try:\n", - " table_sample_data = \"peer_lab_db.sc_tech\"\n", - " query = f\"\"\"\n", - " SELECT {table_sample_data}.barcodes\n", - " FROM {table_sample_data}\n", - " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", - " \"\"\"\n", - " \n", - " results = execute_query(query, user, password)\n", - " for result in results:\n", - " barcode = result[0]\n", - " \n", - " return barcode\n", - " \n", - " except Error as e:\n", - " print(f\"Error: {e}\")\n", - " \n", - " \n", - "def format_assay_barcode(samples, creds):\n", - " \n", - " # samples['genomeIndex_id'] = np.nan\n", - " samples['Reference'] = np.nan\n", - " # samples['scTech_id'] = np.nan\n", - " samples['assay'] = np.nan\n", - " # samples['barcode'] = np.nan\n", - " \n", - " for sample, row in samples.iterrows():\n", - " sample_id = row['Sample_ID']\n", - " \n", - " genomeIndex_id = get_genomeIndex_id(sample_id, 'id', creds)\n", - " index = get_index(genomeIndex_id, 'id', creds)\n", - " scTech_id = get_scTech_id(genomeIndex_id, 'id', creds)\n", - " assay = get_assay(scTech_id, 'id', creds)\n", - " barcode = get_barcode(scTech_id, 'id', creds)\n", - " \n", - " # samples.loc[sample, 'genomeIndex_id'] = genomeIndex_id\n", - " samples.loc[sample, 'Reference'] = index.strip()\n", - " # samples.loc[sample, 'scTech_id'] = scTech_id\n", - " samples.loc[sample, 'assay'] = assay.strip()\n", - " # samples.loc[sample, 'barcode'] = barcode.strip()\n", + "# Which pipeline are you running\n", "\n", - " return samples" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "def get_project_id(sample_id, creds):\n", - " \n", - " user = creds['user']\n", - " password = creds['password']\n", - " \n", - " try:\n", - " table_sample_data = \"peer_lab_db.sample_data\"\n", - " table_project_data = \"peer_lab_db.project_data\"\n", - " query = f\"\"\"\n", - " SELECT {table_project_data}.projectName\n", - " FROM {table_project_data}\n", - " LEFT JOIN {table_sample_data}\n", - " ON {table_project_data}.id = {table_sample_data}.projectData_id\n", - " WHERE {table_sample_data}.id = {sample_id}\n", - " \"\"\"\n", - " result = execute_query(query, user, password)[0][0]\n", - " return result\n", - " except Error as e:\n", - " print(f\"Error: {e}\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Get tar gz file for reference" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "# Get fastq file paths on S3 for each file id\n", - "# Returns dictionary from id to s3 path\n", - "# Throws exception if FASTQs don't exist for any id\n", - "def get_reference(\n", - " path: str, # path to directory containing FASTQ files\n", - "):\n", - " print(path)\n", - " _, bucket, key, _, _ = urllib.parse.urlsplit(path)\n", - " reference = get_s3_objects(\n", - " bucket, key.lstrip(\"/\"),\n", - " re.compile(f\".tar.gz$\")\n", - " )\n", - " try:\n", - " reference = reference[0]\n", - " reference = os.path.join(\"s3://\", bucket, reference)\n", - " except AssertionError as err:\n", - " logging.warning(\"%s\\n\\t %s\", err, path)\n", - " return\n", - " return reference" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Process Samples" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "## Setup" + "prefix = \"CellRangerGex\" # Workflow to run; also .wdl filename prefix\n", + "output_dirname = \"cr-gex-results\"\n", + "\n", + "workflow_dir = glob.glob(f\"{Path.home()}/scing/bin/cellranger-gex-*\")[0]\n", + "path_to_exec = f\"{workflow_dir}/submit.sh\" # CHANGE THIS FOR SHARP\n", + "\n", + "# Locations of workflow-related directories and files\n", + "path_to_cromwell_secrets = f\"{Path.home()}/.cromwell/cromwell-secrets.json\"\n", + "db_credentials_path = f\"{Path.home()}/.config.json\"" ] }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 5, + "id": "9db6a119-0ad5-4965-b988-9c85de2591b6", "metadata": {}, "outputs": [], "source": [ "# Location of docker files\n", "common_docker_registry = \"quay.io/hisplan\"\n", - "\n", - "prefix = \"CellRangerGex\" # Workflow to run; also .wdl filename prefix\n", "pipeline_type = prefix # field in *.labels.json\n", - "output_dirname = \"cr-gex-results\"\n", - "\n", - "# If need to add comment, put here\n", - "comment = \"sohailn\"" + "comment = \"\"" ] }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 6, + "id": "66f7b9a1-9d9d-4afa-9dd9-91ac30b6cefb", "metadata": {}, "outputs": [], "source": [ - "# Locations of workflow-related directories and files\n", - "path_to_cromwell_secrets = f\"{Path.home()}/.cromwell/cromwell-secrets.json\" # CHANGE THIS\n", - "workflow_dir = f\"{Path.home()}/scing/bin/cellranger-gex-6.1.2\" # CHANGE THIS\n", - "path_to_exec = f\"{workflow_dir}/submit.sh\" # CHANGE THIS FOR SHARP\n", + "# Workflow file paths\n", "config_dir = f\"{workflow_dir}/configs\"\n", - "path_to_options = f\"{workflow_dir}/{prefix}.options.aws.json\"\n", - "\n", - "# Other file locations\n", - "db_credentials_path = f\"{Path.home()}/.config.json\" # CHANGE THIS" + "path_to_options = f\"{workflow_dir}/{prefix}.options.aws.json\"" ] }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 7, + "id": "a067d6c1-49da-4901-ba59-bd21c5a69871", "metadata": {}, "outputs": [], "source": [ @@ -767,22 +164,35 @@ { "cell_type": "code", "execution_count": null, + "id": "f5778d94-6cb3-474c-b4ad-e051ccd66602", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", + "id": "343fb1a2-db6a-4ada-a12f-a62493d55834", "metadata": {}, "source": [ - "## Get sample Information" + "# Sample information" ] }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 8, + "id": "3bad3986-1d7e-4194-928b-51b4e2debe35", "metadata": {}, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + " SELECT Sample, AWS_storage, id\n", + " FROM peer_lab_db.sample_data \n", + " WHERE peer_lab_db.sample_data.id = \"4006\"\n" + ] + }, { "data": { "text/html": [ @@ -804,134 +214,114 @@ " \n", " \n", " \n", - " S3_Path\n", - " Sample_ID\n", - " \n", - " \n", - " \n", - " \n", - " PB-1709_EL3_Male\n", - " s3://dp-lab-data/collaborators/bayli...\n", - " 3842\n", + " AWS_storage\n", + " id\n", + " species\n", + " sc_tech\n", + " project_id\n", + " reference\n", " \n", " \n", - " PB-1709_EL3_Female\n", - " s3://dp-lab-data/collaborators/bayli...\n", - " 3843\n", + " Sample\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", + " \n", + " \n", " \n", - " PB-1709_Bsg25D\n", - " s3://dp-lab-data/collaborators/bayli...\n", - " 3844\n", + " PM-1779_LC479A_5prime\n", + " s3://dp-lab-data/collaborators/rudin...\n", + " 4006\n", + " human\n", + " 10X_5prime\n", + " Pre-_post-IO NSCLC\n", + " GRCh38-3.0.0\n", " \n", " \n", "\n", "" ], "text/plain": [ - " S3_Path Sample_ID\n", - "PB-1709_EL3_Male s3://dp-lab-data/collaborators/bayli... 3842\n", - "PB-1709_EL3_Female s3://dp-lab-data/collaborators/bayli... 3843\n", - "PB-1709_Bsg25D s3://dp-lab-data/collaborators/bayli... 3844" + " AWS_storage id species \\\n", + "Sample \n", + "PM-1779_LC479A_5prime s3://dp-lab-data/collaborators/rudin... 4006 human \n", + "\n", + " sc_tech project_id reference \n", + "Sample \n", + "PM-1779_LC479A_5prime 10X_5prime Pre-_post-IO NSCLC GRCh38-3.0.0 " ] }, - "execution_count": 26, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "# Common query col: id, request_id, Sample\n", - "# request_ids = ['YM-1704', ]\n", - "request_ids = ['PB-1709', ]\n", + "# You can supply a list of IDs or request IDs\n", + "\n", + "# request_ids = ['PM-1779']\n", + "# samples = sample_scridb_info(request_ids, 'request_id', creds)\n", + "\n", + "sample_ids = [4006]\n", + "samples = sample_scridb_info(sample_ids, 'id', creds)\n", "\n", - "samples = format_sample_aws(request_ids, 'request_id', creds)\n", "samples" ] }, { "cell_type": "code", - "execution_count": 27, + "execution_count": null, + "id": "06cc685e-636e-4c95-8243-7bf03c497134", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "422c1151-9e53-4ff3-a178-7a37d69a586d", + "metadata": {}, + "source": [ + "IMPORTANT NOTE \n", + "\n", + "Check the name of the folder you are running. Typically the folder that is stored in the database is just the GEX. So if another library is generated (multiome ATAC, VDJ, hashtag, etc) then it needs to be manually changed." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "502590c9-15ac-40e1-8d78-1aba15cb02cd", "metadata": {}, "outputs": [ { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
S3_PathSample_IDReferenceassay
PB-1709_EL3_Males3://dp-lab-data/collaborators/bayli...3842s3://seqc-public/genomes/drosophila_...CR
PB-1709_EL3_Females3://dp-lab-data/collaborators/bayli...3843s3://seqc-public/genomes/drosophila_...CR
PB-1709_Bsg25Ds3://dp-lab-data/collaborators/bayli...3844s3://seqc-public/genomes/drosophila_...CR
\n", - "
" - ], - "text/plain": [ - " S3_Path Sample_ID \\\n", - "PB-1709_EL3_Male s3://dp-lab-data/collaborators/bayli... 3842 \n", - "PB-1709_EL3_Female s3://dp-lab-data/collaborators/bayli... 3843 \n", - "PB-1709_Bsg25D s3://dp-lab-data/collaborators/bayli... 3844 \n", - "\n", - " Reference assay \n", - "PB-1709_EL3_Male s3://seqc-public/genomes/drosophila_... CR \n", - "PB-1709_EL3_Female s3://seqc-public/genomes/drosophila_... CR \n", - "PB-1709_Bsg25D s3://seqc-public/genomes/drosophila_... CR " - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "PM-1779_LC479A_5prime\n", + " PRE PM-1779_LC479A_5prime/\n", + " PRE PM-1779_LC479A_5prime_TCR_VDJ/\n", + "\n" + ] } ], "source": [ - "samples = format_assay_barcode(samples, creds)\n", - "samples" + "# Check the name of the folder you are running\n", + "# Especially if there are multiple libraries (i.e ATAC, TCR_VDJ, etc.)\n", + "\n", + "for sample, row in samples.iterrows():\n", + " print(sample)\n", + " path = os.path.split(row['AWS_storage'])[0] + '/'\n", + " os.system(f'aws s3 ls {path} | grep {sample}')\n", + " print()" ] }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 10, + "id": "e85154ba-47ad-4f3a-b2c8-9c81f2d33e23", "metadata": {}, "outputs": [ { @@ -955,36 +345,34 @@ " \n", " \n", " \n", - " S3_Path\n", - " Sample_ID\n", - " Reference\n", - " assay\n", + " AWS_storage\n", + " id\n", + " species\n", + " sc_tech\n", + " project_id\n", + " reference\n", " FASTQs\n", " \n", - " \n", - " \n", " \n", - " PB-1709_EL3_Male\n", - " s3://dp-lab-data/collaborators/bayli...\n", - " 3842\n", - " s3://seqc-public/genomes/drosophila_...\n", - " CR\n", - " {'I1': ['s3://dp-lab-data/collaborat...\n", - " \n", - " \n", - " PB-1709_EL3_Female\n", - " s3://dp-lab-data/collaborators/bayli...\n", - " 3843\n", - " s3://seqc-public/genomes/drosophila_...\n", - " CR\n", - " {'I1': ['s3://dp-lab-data/collaborat...\n", + " Sample\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", + " \n", + " \n", " \n", - " PB-1709_Bsg25D\n", - " s3://dp-lab-data/collaborators/bayli...\n", - " 3844\n", - " s3://seqc-public/genomes/drosophila_...\n", - " CR\n", + " PM-1779_LC479A_5prime\n", + " s3://dp-lab-data/collaborators/rudin...\n", + " 4006\n", + " human\n", + " 10X_5prime\n", + " Pre-_post-IO NSCLC\n", + " GRCh38-3.0.0\n", " {'I1': ['s3://dp-lab-data/collaborat...\n", " \n", " \n", @@ -992,99 +380,51 @@ "" ], "text/plain": [ - " S3_Path Sample_ID \\\n", - "PB-1709_EL3_Male s3://dp-lab-data/collaborators/bayli... 3842 \n", - "PB-1709_EL3_Female s3://dp-lab-data/collaborators/bayli... 3843 \n", - "PB-1709_Bsg25D s3://dp-lab-data/collaborators/bayli... 3844 \n", + " AWS_storage id species \\\n", + "Sample \n", + "PM-1779_LC479A_5prime s3://dp-lab-data/collaborators/rudin... 4006 human \n", "\n", - " Reference assay \\\n", - "PB-1709_EL3_Male s3://seqc-public/genomes/drosophila_... CR \n", - "PB-1709_EL3_Female s3://seqc-public/genomes/drosophila_... CR \n", - "PB-1709_Bsg25D s3://seqc-public/genomes/drosophila_... CR \n", + " sc_tech project_id reference \\\n", + "Sample \n", + "PM-1779_LC479A_5prime 10X_5prime Pre-_post-IO NSCLC GRCh38-3.0.0 \n", "\n", - " FASTQs \n", - "PB-1709_EL3_Male {'I1': ['s3://dp-lab-data/collaborat... \n", - "PB-1709_EL3_Female {'I1': ['s3://dp-lab-data/collaborat... \n", - "PB-1709_Bsg25D {'I1': ['s3://dp-lab-data/collaborat... " + " FASTQs \n", + "Sample \n", + "PM-1779_LC479A_5prime {'I1': ['s3://dp-lab-data/collaborat... " ] }, - "execution_count": 28, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "# Get FASTQ paths from S3\n", - "# Note: Uses same FASTQ file ids for all samples\n", - "fastq_file_ids = fastq_map[prefix]\n", - "samples[\"FASTQs\"] = samples[\"S3_Path\"].apply(lambda x: get_fastqs(x, fastq_file_ids, \"FASTQ\"))\n", + "samples[\"FASTQs\"] = samples[\"AWS_storage\"].apply(lambda x: get_fastqs(x, fastq_map[prefix], \"FASTQ\"))\n", "samples" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "MAKE SURE THAT THE REFERENCE IS PUBLIC OTHERWISE THE JOB WILL FAIL\n", - "\n", - "ALSO MAKE SURE THAT YOU ARE PROVIDING THE `HTTPS` PATH, NOT S3" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "# Set path to transgene reference S3\n", - "# Note: This is an exceptional case\n", - "# path_to_reference = f\"{common_dir}/transgene_reference/refdata-cellranger/3PS19_SNSEQ-GRCm38-Ensembl-87-transgenes.tar.gz\"\n", - "# path_to_reference = \"https://cf.10xgenomics.com/supp/cell-exp/refdata-gex-mm10-2020-A.tar.gz\"\n", - "# path_to_reference = 'https://dp-lab-data.s3.amazonaws.com/collaborators/whiter/YM-1704_transgene_reference/refdata-cellranger/Zebrafish_with_3_transgenes-GRCz11-Ensembl-106-transgenes.tar.gz'\n", - "path_to_reference = 'https://dp-lab-data.s3.amazonaws.com/genomes/drosophila_BDGP6-32-cellranger/BDGP6.32.genome.tar.gz'" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array(['https://dp-lab-data.s3.amazonaws.com/genomes/drosophila_BDGP6-32-cellranger/BDGP6.32.genome.tar.gz',\n", - " 'https://dp-lab-data.s3.amazonaws.com/genomes/drosophila_BDGP6-32-cellranger/BDGP6.32.genome.tar.gz',\n", - " 'https://dp-lab-data.s3.amazonaws.com/genomes/drosophila_BDGP6-32-cellranger/BDGP6.32.genome.tar.gz'],\n", - " dtype=object)" - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "samples['Reference'] = path_to_reference\n", - "samples['Reference'].values" - ] - }, { "cell_type": "code", "execution_count": null, + "id": "a59060ca-b11f-4e74-9edf-5ce3e863a064", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", + "id": "45b907a9-53cc-4cf7-a678-5d2f4798e457", "metadata": {}, "source": [ - "## Inputs" + "IMPORTANT NOTE \n", + "\n", + "For CellRanger you need to supply an HTTPS path. So if you are using a custom genome stored on AWS, you must make the reference public !" ] }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 11, + "id": "16d0ca53-edc7-4e1b-9c9c-0d812a1ae1c7", "metadata": {}, "outputs": [ { @@ -1108,95 +448,88 @@ " \n", " \n", " \n", - " CellRangerGex.sampleName\n", - " CellRangerGex.fastqName\n", - " CellRangerGex.inputFastq\n", - " CellRangerGex.referenceUrl\n", - " CellRangerGex.includeIntrons\n", - " CellRangerGex.expectCells\n", - " CellRangerGex.memory\n", - " CellRangerGex.dockerRegistry\n", + " AWS_storage\n", + " id\n", + " species\n", + " sc_tech\n", + " project_id\n", + " reference\n", + " FASTQs\n", + " \n", + " \n", + " Sample\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " PB-1709_EL3_Male\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " \n", - " \n", - " PB-1709_EL3_Female\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " \n", - " \n", - " PB-1709_Bsg25D\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", + " PM-1779_LC479A_5prime\n", + " s3://dp-lab-data/collaborators/rudin...\n", + " 4006\n", + " human\n", + " 10X_5prime\n", + " Pre-_post-IO NSCLC\n", + " https://cf.10xgenomics.com/supp/cell...\n", + " {'I1': ['s3://dp-lab-data/collaborat...\n", " \n", " \n", "\n", "" ], "text/plain": [ - " CellRangerGex.sampleName CellRangerGex.fastqName \\\n", - "PB-1709_EL3_Male NaN NaN \n", - "PB-1709_EL3_Female NaN NaN \n", - "PB-1709_Bsg25D NaN NaN \n", + " AWS_storage id species \\\n", + "Sample \n", + "PM-1779_LC479A_5prime s3://dp-lab-data/collaborators/rudin... 4006 human \n", "\n", - " CellRangerGex.inputFastq CellRangerGex.referenceUrl \\\n", - "PB-1709_EL3_Male NaN NaN \n", - "PB-1709_EL3_Female NaN NaN \n", - "PB-1709_Bsg25D NaN NaN \n", + " sc_tech project_id \\\n", + "Sample \n", + "PM-1779_LC479A_5prime 10X_5prime Pre-_post-IO NSCLC \n", "\n", - " CellRangerGex.includeIntrons CellRangerGex.expectCells \\\n", - "PB-1709_EL3_Male NaN NaN \n", - "PB-1709_EL3_Female NaN NaN \n", - "PB-1709_Bsg25D NaN NaN \n", + " reference \\\n", + "Sample \n", + "PM-1779_LC479A_5prime https://cf.10xgenomics.com/supp/cell... \n", "\n", - " CellRangerGex.memory CellRangerGex.dockerRegistry \n", - "PB-1709_EL3_Male NaN NaN \n", - "PB-1709_EL3_Female NaN NaN \n", - "PB-1709_Bsg25D NaN NaN " + " FASTQs \n", + "Sample \n", + "PM-1779_LC479A_5prime {'I1': ['s3://dp-lab-data/collaborat... " ] }, - "execution_count": 31, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "# Load minimum inputs and labels fields from templates\n", - "with open(f\"{config_dir}/template.inputs.json\") as f:\n", - " std_inputs_fields = list(json.load(f).keys())\n", - " \n", - "# Annotate all samples with workflow inputs and labels\n", - "inputs = pd.DataFrame(index=samples.index, columns=std_inputs_fields,)\n", - "\n", - "inputs" + "samples = update_ref(samples, prefix)\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "56ea3b42-967e-49aa-8344-93420514c6e1", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "3fde96b2-f3d4-4c8c-b1c8-8cf5d67e4f73", + "metadata": {}, + "source": [ + "# Generate inputs" ] }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 12, + "id": "493bb219-4f15-4028-bc80-79b13a24b6f4", "metadata": {}, "outputs": [ { @@ -1229,36 +562,25 @@ " CellRangerGex.memory\n", " CellRangerGex.dockerRegistry\n", " \n", - " \n", - " \n", - " \n", - " PB-1709_EL3_Male\n", - " PB-1709_EL3_Male\n", - " 3842_PB-1709_EL3_Male_IGO_12437_AO_42\n", - " [s3://dp-lab-data/collaborators/bayl...\n", - " https://dp-lab-data.s3.amazonaws.com...\n", - " False\n", - " 5000\n", - " 256\n", - " quay.io/hisplan\n", - " \n", " \n", - " PB-1709_EL3_Female\n", - " PB-1709_EL3_Female\n", - " 3843_PB-1709_EL3_Female_IGO_12437_AO_41\n", - " [s3://dp-lab-data/collaborators/bayl...\n", - " https://dp-lab-data.s3.amazonaws.com...\n", - " False\n", - " 5000\n", - " 256\n", - " quay.io/hisplan\n", + " Sample\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", + " \n", + " \n", " \n", - " PB-1709_Bsg25D\n", - " PB-1709_Bsg25D\n", - " 3844_PB-1709_Bsg25D_IGO_12437_AO_43\n", - " [s3://dp-lab-data/collaborators/bayl...\n", - " https://dp-lab-data.s3.amazonaws.com...\n", + " PM-1779_LC479A_5prime\n", + " PM-1779_LC479A_5prime\n", + " 4006_PM-1779_LC479A_5prime_IGO_12437...\n", + " [s3://dp-lab-data/collaborators/rudi...\n", + " https://cf.10xgenomics.com/supp/cell...\n", " False\n", " 5000\n", " 256\n", @@ -1269,48 +591,55 @@ "" ], "text/plain": [ - " CellRangerGex.sampleName \\\n", - "PB-1709_EL3_Male PB-1709_EL3_Male \n", - "PB-1709_EL3_Female PB-1709_EL3_Female \n", - "PB-1709_Bsg25D PB-1709_Bsg25D \n", + " CellRangerGex.sampleName \\\n", + "Sample \n", + "PM-1779_LC479A_5prime PM-1779_LC479A_5prime \n", + "\n", + " CellRangerGex.fastqName \\\n", + "Sample \n", + "PM-1779_LC479A_5prime 4006_PM-1779_LC479A_5prime_IGO_12437... \n", "\n", - " CellRangerGex.fastqName \\\n", - "PB-1709_EL3_Male 3842_PB-1709_EL3_Male_IGO_12437_AO_42 \n", - "PB-1709_EL3_Female 3843_PB-1709_EL3_Female_IGO_12437_AO_41 \n", - "PB-1709_Bsg25D 3844_PB-1709_Bsg25D_IGO_12437_AO_43 \n", + " CellRangerGex.inputFastq \\\n", + "Sample \n", + "PM-1779_LC479A_5prime [s3://dp-lab-data/collaborators/rudi... \n", "\n", - " CellRangerGex.inputFastq \\\n", - "PB-1709_EL3_Male [s3://dp-lab-data/collaborators/bayl... \n", - "PB-1709_EL3_Female [s3://dp-lab-data/collaborators/bayl... \n", - "PB-1709_Bsg25D [s3://dp-lab-data/collaborators/bayl... \n", + " CellRangerGex.referenceUrl \\\n", + "Sample \n", + "PM-1779_LC479A_5prime https://cf.10xgenomics.com/supp/cell... \n", "\n", - " CellRangerGex.referenceUrl \\\n", - "PB-1709_EL3_Male https://dp-lab-data.s3.amazonaws.com... \n", - "PB-1709_EL3_Female https://dp-lab-data.s3.amazonaws.com... \n", - "PB-1709_Bsg25D https://dp-lab-data.s3.amazonaws.com... \n", + " CellRangerGex.includeIntrons \\\n", + "Sample \n", + "PM-1779_LC479A_5prime False \n", "\n", - " CellRangerGex.includeIntrons CellRangerGex.expectCells \\\n", - "PB-1709_EL3_Male False 5000 \n", - "PB-1709_EL3_Female False 5000 \n", - "PB-1709_Bsg25D False 5000 \n", + " CellRangerGex.expectCells CellRangerGex.memory \\\n", + "Sample \n", + "PM-1779_LC479A_5prime 5000 256 \n", "\n", - " CellRangerGex.memory CellRangerGex.dockerRegistry \n", - "PB-1709_EL3_Male 256 quay.io/hisplan \n", - "PB-1709_EL3_Female 256 quay.io/hisplan \n", - "PB-1709_Bsg25D 256 quay.io/hisplan " + " CellRangerGex.dockerRegistry \n", + "Sample \n", + "PM-1779_LC479A_5prime quay.io/hisplan " ] }, - "execution_count": 32, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ + "# Standard inputs, modify fields as need be\n", + "\n", + "# Load minimum inputs and labels fields from templates\n", + "with open(f\"{config_dir}/template.inputs.json\") as f:\n", + " std_inputs_fields = list(json.load(f).keys())\n", + " \n", + "# Annotate all samples with workflow inputs and labels\n", + "inputs = pd.DataFrame(index=samples.index, columns=std_inputs_fields,)\n", + "\n", "# Annotate inputs\n", "inputs[f\"{prefix}.sampleName\"] = inputs.index # may need to change\n", "inputs[f\"{prefix}.inputFastq\"] = samples[\"FASTQs\"].apply(lambda x: np.ravel(list(x.values())))\n", "inputs[f\"{prefix}.fastqName\"] = inputs[f\"{prefix}.inputFastq\"].apply(lambda x: get_fastqs_name(x))\n", - "inputs[f\"{prefix}.referenceUrl\"] = samples[\"Reference\"] \n", + "inputs[f\"{prefix}.referenceUrl\"] = samples[\"reference\"] \n", "inputs[f\"{prefix}.includeIntrons\"] = False\n", "inputs[f\"{prefix}.expectCells\"] = 5000\n", "inputs[f\"{prefix}.memory\"] = 256\n", @@ -1321,44 +650,54 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": null, + "id": "9785f91c-a79e-44ad-b7df-403b557c7d74", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array(['https://dp-lab-data.s3.amazonaws.com/genomes/drosophila_BDGP6-32-cellranger/BDGP6.32.genome.tar.gz',\n", - " 'https://dp-lab-data.s3.amazonaws.com/genomes/drosophila_BDGP6-32-cellranger/BDGP6.32.genome.tar.gz',\n", - " 'https://dp-lab-data.s3.amazonaws.com/genomes/drosophila_BDGP6-32-cellranger/BDGP6.32.genome.tar.gz'],\n", - " dtype=object)" - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "2c8fc170-74c6-4cc8-b9b0-a756701d5643", + "metadata": {}, + "source": [ + "IMPORTANT NOTE \n", + "\n", + "Check to see if these samples are single nuclei. If they are nuclei, then you must set includeIntrons to be TRUE" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "c30e1518-da11-4069-a501-32f9e04ef389", + "metadata": {}, + "outputs": [], "source": [ - "inputs[f\"{prefix}.referenceUrl\"].values" + "# Modification for specific samples\n", + "\n", + "inputs[f'{prefix}.includeIntrons'] = True" ] }, { "cell_type": "code", "execution_count": null, + "id": "9b9c2618-f4a5-45ce-aea5-cdeb671f88c5", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", + "id": "a8f190ac-c493-4bec-b64d-2b35d1e2d104", "metadata": {}, "source": [ - "## Labels" + "# Generate labels" ] }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 14, + "id": "03d5abbb-6bf0-4636-8bb7-edd2463439c7", "metadata": {}, "outputs": [ { @@ -1390,131 +729,25 @@ " transfer\n", " comment\n", " \n", - " \n", - " \n", - " \n", - " PB-1709_EL3_Male\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " \n", - " \n", - " PB-1709_EL3_Female\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " \n", " \n", - " PB-1709_Bsg25D\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " \n", - " \n", - "\n", - "" - ], - "text/plain": [ - " pipelineType project sample owner destination transfer \\\n", - "PB-1709_EL3_Male NaN NaN NaN NaN NaN NaN \n", - "PB-1709_EL3_Female NaN NaN NaN NaN NaN NaN \n", - "PB-1709_Bsg25D NaN NaN NaN NaN NaN NaN \n", - "\n", - " comment \n", - "PB-1709_EL3_Male NaN \n", - "PB-1709_EL3_Female NaN \n", - "PB-1709_Bsg25D NaN " - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "with open(f\"{config_dir}/template.labels.json\") as f:\n", - " std_labels_fields = list(json.load(f).keys())\n", - " \n", - "# Annotate all samples with workflow inputs and labels\n", - "labels = pd.DataFrame(index=samples.index, columns=std_labels_fields,)\n", - "labels" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1523,33 +756,42 @@ "" ], "text/plain": [ - " pipelineType project \\\n", - "PB-1709_EL3_Male CellRangerGex Single myonucleus RNAseq \n", - "PB-1709_EL3_Female CellRangerGex Single myonucleus RNAseq \n", - "PB-1709_Bsg25D CellRangerGex Single myonucleus RNAseq \n", + " pipelineType project \\\n", + "Sample \n", + "PM-1779_LC479A_5prime CellRangerGex Pre-_post-IO NSCLC \n", + "\n", + " sample owner \\\n", + "Sample \n", + "PM-1779_LC479A_5prime PM-1779_LC479A_5prime sohailn \n", "\n", - " sample owner \\\n", - "PB-1709_EL3_Male PB-1709_EL3_Male sohailn \n", - "PB-1709_EL3_Female PB-1709_EL3_Female sohailn \n", - "PB-1709_Bsg25D PB-1709_Bsg25D sohailn \n", + " destination transfer \\\n", + "Sample \n", + "PM-1779_LC479A_5prime s3://dp-lab-data/collaborators/rudin... - \n", "\n", - " destination transfer comment \n", - "PB-1709_EL3_Male s3://dp-lab-data/collaborators/bayli... - sohailn \n", - "PB-1709_EL3_Female s3://dp-lab-data/collaborators/bayli... - sohailn \n", - "PB-1709_Bsg25D s3://dp-lab-data/collaborators/bayli... - sohailn " + " comment \n", + "Sample \n", + "PM-1779_LC479A_5prime sohailn " ] }, - "execution_count": 35, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ + "# Standard labels, modify fields as need be\n", + "\n", + "with open(f\"{config_dir}/template.labels.json\") as f:\n", + " std_labels_fields = list(json.load(f).keys())\n", + " \n", + "# Annotate all samples with workflow inputs and labels\n", + "labels = pd.DataFrame(index=samples.index, columns=std_labels_fields,)\n", + "\n", "labels[\"pipelineType\"] = pipeline_type\n", - "labels[\"project\"] = samples[\"Sample_ID\"].apply(lambda x: get_project_id(x, creds))\n", + "labels[\"project\"] = samples['project_id']\n", "labels[\"sample\"] = labels.index\n", "labels[\"owner\"] = creds[\"user\"]\n", - "labels[\"destination\"] = samples['S3_Path'] + \"/\" + output_dirname\n", + "labels[\"destination\"] = samples['AWS_storage'] + \"/\" + output_dirname\n", "labels[\"transfer\"] = \"-\"\n", "labels[\"comment\"] = creds[\"user\"]\n", "\n", @@ -1559,27 +801,31 @@ { "cell_type": "code", "execution_count": null, + "id": "ee1ac339-1817-49d2-9e84-047087539e9e", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", + "id": "7a60e244-5f8b-4437-9274-ee7ce7e8135f", "metadata": {}, "source": [ - "## Execution" + "# Run samples" ] }, { "cell_type": "markdown", + "id": "60e68adf-8cdd-4421-97ba-202103e5e014", "metadata": {}, "source": [ - "Make sure to check that your FASTQ files aren't archived, otherwise your job will fail" + "Look over the samples before submitting one last time" ] }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 15, + "id": "ee601aed-3a19-4317-a918-4120db7ee7bf", "metadata": {}, "outputs": [ { @@ -1612,37 +858,26 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1652,38 +887,36 @@ "" ], "text/plain": [ - " CellRangerGex.sampleName \\\n", - "PB-1709_EL3_Male PB-1709_EL3_Male \n", - "PB-1709_EL3_Female PB-1709_EL3_Female \n", - "PB-1709_Bsg25D PB-1709_Bsg25D \n", + " CellRangerGex.sampleName \\\n", + "Sample \n", + "PM-1779_LC479A_5prime PM-1779_LC479A_5prime \n", + "\n", + " CellRangerGex.fastqName \\\n", + "Sample \n", + "PM-1779_LC479A_5prime 4006_PM-1779_LC479A_5prime_IGO_12437... \n", "\n", - " CellRangerGex.fastqName \\\n", - "PB-1709_EL3_Male 3842_PB-1709_EL3_Male_IGO_12437_AO_42 \n", - "PB-1709_EL3_Female 3843_PB-1709_EL3_Female_IGO_12437_AO_41 \n", - "PB-1709_Bsg25D 3844_PB-1709_Bsg25D_IGO_12437_AO_43 \n", + " CellRangerGex.inputFastq \\\n", + "Sample \n", + "PM-1779_LC479A_5prime [s3://dp-lab-data/collaborators/rudi... \n", "\n", - " CellRangerGex.inputFastq \\\n", - "PB-1709_EL3_Male [s3://dp-lab-data/collaborators/bayl... \n", - "PB-1709_EL3_Female [s3://dp-lab-data/collaborators/bayl... \n", - "PB-1709_Bsg25D [s3://dp-lab-data/collaborators/bayl... \n", + " CellRangerGex.referenceUrl \\\n", + "Sample \n", + "PM-1779_LC479A_5prime https://cf.10xgenomics.com/supp/cell... \n", "\n", - " CellRangerGex.referenceUrl \\\n", - "PB-1709_EL3_Male https://dp-lab-data.s3.amazonaws.com... \n", - "PB-1709_EL3_Female https://dp-lab-data.s3.amazonaws.com... \n", - "PB-1709_Bsg25D https://dp-lab-data.s3.amazonaws.com... \n", + " CellRangerGex.includeIntrons \\\n", + "Sample \n", + "PM-1779_LC479A_5prime True \n", "\n", - " CellRangerGex.includeIntrons CellRangerGex.expectCells \\\n", - "PB-1709_EL3_Male False 5000 \n", - "PB-1709_EL3_Female False 5000 \n", - "PB-1709_Bsg25D False 5000 \n", + " CellRangerGex.expectCells CellRangerGex.memory \\\n", + "Sample \n", + "PM-1779_LC479A_5prime 5000 256 \n", "\n", - " CellRangerGex.memory CellRangerGex.dockerRegistry \n", - "PB-1709_EL3_Male 256 quay.io/hisplan \n", - "PB-1709_EL3_Female 256 quay.io/hisplan \n", - "PB-1709_Bsg25D 256 quay.io/hisplan " + " CellRangerGex.dockerRegistry \n", + "Sample \n", + "PM-1779_LC479A_5prime quay.io/hisplan " ] }, - "execution_count": 36, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -1694,7 +927,8 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 16, + "id": "91318853-0886-4c2b-8b87-76fa8e5ab30d", "metadata": {}, "outputs": [ { @@ -1726,35 +960,25 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1763,23 +987,24 @@ "" ], "text/plain": [ - " pipelineType project \\\n", - "PB-1709_EL3_Male CellRangerGex Single myonucleus RNAseq \n", - "PB-1709_EL3_Female CellRangerGex Single myonucleus RNAseq \n", - "PB-1709_Bsg25D CellRangerGex Single myonucleus RNAseq \n", + " pipelineType project \\\n", + "Sample \n", + "PM-1779_LC479A_5prime CellRangerGex Pre-_post-IO NSCLC \n", "\n", - " sample owner \\\n", - "PB-1709_EL3_Male PB-1709_EL3_Male sohailn \n", - "PB-1709_EL3_Female PB-1709_EL3_Female sohailn \n", - "PB-1709_Bsg25D PB-1709_Bsg25D sohailn \n", + " sample owner \\\n", + "Sample \n", + "PM-1779_LC479A_5prime PM-1779_LC479A_5prime sohailn \n", "\n", - " destination transfer comment \n", - "PB-1709_EL3_Male s3://dp-lab-data/collaborators/bayli... - sohailn \n", - "PB-1709_EL3_Female s3://dp-lab-data/collaborators/bayli... - sohailn \n", - "PB-1709_Bsg25D s3://dp-lab-data/collaborators/bayli... - sohailn " + " destination transfer \\\n", + "Sample \n", + "PM-1779_LC479A_5prime s3://dp-lab-data/collaborators/rudin... - \n", + "\n", + " comment \n", + "Sample \n", + "PM-1779_LC479A_5prime sohailn " ] }, - "execution_count": 37, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -1790,18 +1015,27 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": null, + "id": "acd1c04b-d582-481b-b8d4-bd9a9a8f97c4", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "54ef3d9c-2361-4b8e-bcfe-bc9c3878876b", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "f4050c0bd3114cbfa42bdcb5f25ea41f", + "model_id": "a45711bb72c34906894e41c465e67bd9", "version_major": 2, "version_minor": 0 }, "text/plain": [ - " 0%| | 0/3 [00:00 Date: Mon, 12 Sep 2022 11:39:00 -0400 Subject: [PATCH 10/16] Updated, cleaner version of notebooks with all sample information --- notebooks/Run_CellRangerVdj.ipynb | 2235 ++++++----------------------- 1 file changed, 465 insertions(+), 1770 deletions(-) diff --git a/notebooks/Run_CellRangerVdj.ipynb b/notebooks/Run_CellRangerVdj.ipynb index ad418e9..f4fbdaf 100644 --- a/notebooks/Run_CellRangerVdj.ipynb +++ b/notebooks/Run_CellRangerVdj.ipynb @@ -3,7 +3,7 @@ { "cell_type": "code", "execution_count": 1, - "id": "e799a381-2d5f-4497-bbc4-99df4f1c0370", + "id": "fbbdcd09-b369-493d-9402-ca18a45eee5d", "metadata": {}, "outputs": [], "source": [ @@ -14,898 +14,188 @@ "from pathlib import Path\n", "from tqdm.notebook import tqdm\n", "from packaging import version\n", + "\n", + "import glob\n", + "import os\n", + "\n", "pd.set_option(\"display.max_colwidth\", 40)" ] }, - { - "cell_type": "markdown", - "id": "f82a05bc-cc8a-4d55-b7fe-9513f475077c", - "metadata": { - "tags": [], - "toc-hr-collapsed": true - }, - "source": [ - "# Define Helper Functions" - ] - }, { "cell_type": "code", "execution_count": 2, - "id": "c8f9ae8c-dc67-4a8e-a3f7-dc21eddb54e2", + "id": "ca66d7bc-a113-454a-b4d4-7e2a56203dc4", "metadata": {}, "outputs": [], "source": [ - "# FASTQ reads/indices required for each workflow\n", - "fastq_map = {\n", - " 'CellRangerVdj': ['I1','R1','R2'],\n", - "}" + "from utils.utils import *" ] }, { "cell_type": "code", - "execution_count": 3, - "id": "c8ab0226-5393-411a-88c0-3f8b154b6c8f", - "metadata": {}, - "outputs": [], - "source": [ - "# Get fastq file paths on S3 for each file id\n", - "# Returns dictionary from id to s3 path\n", - "# Throws exception if FASTQs don't exist for any id\n", - "def get_fastqs(\n", - " path: str, # path to directory containing FASTQ files\n", - " fastq_file_ids: list, # FASTQ file ids needed for this run type (e.g. I1, R1, R2, etc.)\n", - " folder: str = \"\",\n", - "):\n", - " fastq_map = dict()\n", - " _, bucket, key, _, _ = urllib.parse.urlsplit(f\"{path}/{folder}\")\n", - " for fid in fastq_file_ids:\n", - " files = get_s3_objects(\n", - " bucket, key.lstrip(\"/\"),\n", - " re.compile(f\"_{fid}_\\d{{3}}.fastq.gz$\")\n", - " )\n", - " try:\n", - " assert files, f\"AssertionError: Missing `{fid}` archives!\"\n", - " fastq_map[fid] = [os.path.join(\"s3://\", bucket, str(f)) for f in files]\n", - " except AssertionError as err:\n", - " logging.warning(\"%s\\n\\t %s\", err, path)\n", - " return\n", - " return fastq_map" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "e555cf05-fde7-4875-b4c5-46436c9a42ec", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# from SCRIdb\n", - "def get_s3_objects(bucket, key, pattern, full_uri=False):\n", - " \n", - " s3r = boto3.resource(\"s3\")\n", - " bucket_s3 = s3r.Bucket(bucket)\n", - " objects = []\n", - " for obj in bucket_s3.objects.filter(Prefix=key):\n", - " hit = pattern.search(obj.key)\n", - " if hit:\n", - " objects.append(obj.key)\n", - " if full_uri:\n", - " objects = [f\"s3://{bucket}/{o}\" for o in objects]\n", - " return objects" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "18e8874c-f137-4afb-8b40-68fe9fb896d1", - "metadata": {}, - "outputs": [], - "source": [ - "# Extract FASTQ sample name from list of files\n", - "# Note: FASTQ name is file name up to lane id (e.g. L001, L002, etc.)\n", - "def get_fastqs_name(fastqs):\n", - " fastq_name_re = r\".*/(.*)_S\\d+_L\\d{3}_[A-Za-z]\\d_\\d{3}.fastq.gz$\"\n", - " fastq_names = [re.match(fastq_name_re, x)[1] for x in fastqs]\n", - " assert len(set(fastq_names)) == 1 # make sure all names are same\n", - " return fastq_names[0]" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "2e8688b7-ec81-4414-88dc-34d91ecb411a", + "execution_count": null, + "id": "92d253e4-bb0c-410f-9608-0bb729af6649", "metadata": {}, "outputs": [], - "source": [ - "# Numpy encoder for JSON from pandas series\n", - "class NpEncoder(json.JSONEncoder):\n", - " def default(self, obj):\n", - " if isinstance(obj, np.integer):\n", - " return int(obj)\n", - " elif isinstance(obj, np.floating):\n", - " return float(obj)\n", - " elif isinstance(obj, np.ndarray):\n", - " return obj.tolist()\n", - " else:\n", - " return super(NpEncoder, self).default(obj)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "33af155b-7eab-4a73-ae3f-e818a412a316", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "def execute_query(query, user, password):\n", - " with connect(\n", - " host=\"peer-lab-db.cggxmlwgzzpw.us-east-1.rds.amazonaws.com\",\n", - " database=\"peer_lab_db\",\n", - " user=user,\n", - " password=password,\n", - " ) as connection:\n", - " with connection.cursor(buffered=True) as cursor:\n", - " cursor.execute(query)\n", - " result = cursor.fetchall()\n", - " return result" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "3040e204-9470-465a-863d-6f4a297a1637", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# Get species from database for given sample\n", - "from mysql.connector import connect, Error\n", - "\n", - "def get_species(sample_id, user, password):\n", - " try:\n", - " table_sample_data = \"peer_lab_db.sample_data\"\n", - " table_species = \"peer_lab_db.species\"\n", - " table_genome_idx = \"peer_lab_db.genome_index\"\n", - " query = f\"\"\"\n", - " SELECT {table_species}.Species\n", - " FROM {table_species}\n", - " LEFT JOIN {table_genome_idx}\n", - " ON {table_species}.id = {table_genome_idx}.species_id\n", - " LEFT JOIN {table_sample_data}\n", - " ON {table_genome_idx}.id = {table_sample_data}.genomeIndex_id\n", - " WHERE {table_sample_data}.id = {sample_id}\n", - " \"\"\"\n", - " result = execute_query(query, user, password)[0][0]\n", - " return result\n", - " except Error as e:\n", - " print(f\"Error: {e}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "f214cb46-2889-483b-bb00-ed65b9b96125", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# Get species from database for given sample\n", - "from mysql.connector import connect, Error\n", - "\n", - "def get_sc_tech(sample_id, user, password):\n", - " try:\n", - " table_sample_data = \"peer_lab_db.sample_data\"\n", - " table_sc_tech = \"peer_lab_db.sc_tech\"\n", - " table_genome_idx = \"peer_lab_db.genome_index\"\n", - " query = f\"\"\"\n", - " SELECT {table_sc_tech}.sc_Tech\n", - " FROM {table_sc_tech}\n", - " LEFT JOIN {table_genome_idx}\n", - " ON {table_sc_tech}.id = {table_genome_idx}.scTech_id\n", - " LEFT JOIN {table_sample_data}\n", - " ON {table_genome_idx}.id = {table_sample_data}.genomeIndex_id\n", - " WHERE {table_sample_data}.id = {sample_id}\n", - " \"\"\"\n", - " result = execute_query(query, user, password)[0][0]\n", - " return result\n", - " except Error as e:\n", - " print(f\"Error: {e}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "9be132ae-a9c7-46fd-bb1c-04358f4b7d34", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# Get species from database for given sample\n", - "from mysql.connector import connect, Error\n", - "\n", - "def get_sample_id(sample_name, user, password):\n", - " try:\n", - " table_sample_data = \"peer_lab_db.sample_data\"\n", - " query = f\"\"\"\n", - " SELECT {table_sample_data}.id\n", - " FROM {table_sample_data}\n", - " WHERE {table_sample_data}.Sample=\"{sample_name}\"\n", - " \"\"\"\n", - " result = execute_query(query, user, password)[0][0]\n", - " return result\n", - " except Error as e:\n", - " print(f\"Error: {e}\")" - ] + "source": [] }, { - "cell_type": "code", - "execution_count": 11, - "id": "ef099bfd-ee43-4dce-bc55-3045e9f4e9b7", + "cell_type": "markdown", + "id": "2de5f2a6-dba8-486d-bb07-92dbeff10150", "metadata": { + "jp-MarkdownHeadingCollapsed": true, "tags": [] }, - "outputs": [], "source": [ - "# Get species from database for given sample\n", - "from mysql.connector import connect, Error\n", - "\n", - "def get_project_id(sample_id, user, password):\n", - " try:\n", - " table_sample_data = \"peer_lab_db.sample_data\"\n", - " table_project_data = \"peer_lab_db.project_data\"\n", - " query = f\"\"\"\n", - " SELECT {table_project_data}.projectName\n", - " FROM {table_project_data}\n", - " LEFT JOIN {table_sample_data}\n", - " ON {table_project_data}.id = {table_sample_data}.projectData_id\n", - " WHERE {table_sample_data}.id = {sample_id}\n", - " \"\"\"\n", - " result = execute_query(query, user, password)[0][0]\n", - " return result\n", - " except Error as e:\n", - " print(f\"Error: {e}\")" + "# AWS setup" ] }, { "cell_type": "code", - "execution_count": 12, - "id": "865f4379-343e-4010-9d76-eb7357f9beae", - "metadata": {}, - "outputs": [], - "source": [ - "def get_SEQC_version(loc):\n", - " try:\n", - " cmd = f\"aws s3 cp {loc}/seqc-results/seqc_log.txt -\"\n", - " out = subprocess.run(shlex.split(cmd), universal_newlines=True, capture_output=True).__dict__[\"stdout\"]\n", - " version = re.match(r\".*SEQC=v(\\d+\\.\\d+\\.\\d+).*\", out)[1]\n", - " return version\n", - " except:\n", - " return \"N/A\"" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "0511ae48-826d-463d-b3a3-b080b6fd2d51", - "metadata": {}, - "outputs": [], - "source": [ - "def get_file_prefix(loc):\n", - " try:\n", - " cmd = f\"aws s3 ls {loc}/seqc-results/\"\n", - " out = subprocess.run(shlex.split(cmd), universal_newlines=True, capture_output=True).__dict__[\"stdout\"]\n", - " \n", - " # Note: I'm expecting the aligned bam file to be in loc\n", - " bam_pattern = re.compile(r\"(.*)_Aligned\\.out\\.bam$\")\n", - " filename = list(filter(bam_pattern.match, out.split()))[0]\n", - " file_prefix = re.match(bam_pattern, filename)[1]\n", - " return file_prefix\n", - " except:\n", - " raise ValueError(f\"BAM file not found in {loc}\")\n", - " return \"\"" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "0c0c8d18-97f8-4ca9-8de8-7d5f0d837b1d", + "execution_count": 3, + "id": "1023bdd2-6db6-4274-bd1b-13f092fd11d9", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "env: AWS_ACCESS_KEY_ID=ASIAYPY66CWMGLBAIGO6\n", + "env: AWS_SECRET_ACCESS_KEY=i6fm87l+UNBLyxlwU4AXD2HEGTXYutOlj4lfB9bk\n", + "env: AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEK///////////wEaCXVzLWVhc3QtMSJHMEUCIQCAs8AyD3w8/luR3fB4wyOA0fC5vzw2nyzspQ7/+Pgf/AIgBhFvsspOJmLbACqO8/42UuRe7nu6vdi7DaJ5k/UFDxsq7wEISBADGgw1ODM2NDM1Njc1MTIiDP2ESPVfC1OK7pmq+SrMAQRwXr+RvcapTJP/skUqP4og+mqro7RYgBPQ8OQKWReZ0JLWYk2+/npsDqlMM5j7Zre4aQPkttvkyacSoDBo4B/SufvOD5eotZyXsKR5zEjrgn9HTQGxlylIakbUK/7pJSe4pJxAya79ZEC/1PrAUYnZR2ZGGgYgRF0oIwzbLblSoAmBYeNbbkbluJC3qbicERnH/BHlO4oHXPMesuS+QncRWn8rlRxGRySgTaW+gcH2tBwDBhB+RURyCtXC3AyJmQ7tp4MerTHhTToIaTCIqe2YBjqYAbdygCv6Qz2i+YqCafTb2npOoT7PPA6ooeWnXXzZXPc8POEASCBAq6bOIWvGWcKxwVwgode8mb8/R9oBnXQh0wdqm+ufpGuUAaVE8Y8rgNGXiKnCq/QywzTtjpgOTvJkYw8WPUWE6J8KhN10WqJtEdvif9E15Zqj7H69BL+Zy2wayYbu35OTPBuK3q4QlAVNk5fS+Uvkwxyz\n", + "2021-10-07 15:31:32 agc-583643567512-us-east-1\n", + "2021-10-07 15:28:07 cdktoolkit-stagingbucket-d49u1xfb0sc4\n", + "2019-10-09 13:04:06 cf-templates-umiwbnq3566w-us-east-1\n", + "2019-10-10 12:46:54 dp-daily-reports\n", + "2017-09-26 10:15:15 dp-lab-data\n", + "2019-05-23 12:34:58 dp-lab-data-public\n", + "2018-03-01 13:29:07 dp-lab-glacier\n", + "2020-11-06 23:02:27 dp-lab-gwf-core\n", + "2021-07-15 18:14:01 dp-lab-gwf-core2\n", + "2017-09-26 10:17:18 dp-lab-home\n", + "2019-08-14 16:42:43 dp-lab-test\n", + "2019-04-25 12:35:35 elasticbeanstalk-us-east-1-583643567512\n", + "2019-12-13 15:53:57 scri-computational\n", + "2017-09-26 10:23:50 seqc-public\n" + ] + } + ], "source": [ - "# FASTQ reads/indices required for each workflow\n", - "# Shoudl replace with JSON file\n", - "cr_reference_map = {\n", - " 'CellRangerArc':\n", - " {\n", - " 'Human': \"https://cf.10xgenomics.com/supp/cell-arc/refdata-cellranger-arc-GRCh38-2020-A.tar.gz\",\n", - " 'Mouse': \"https://cf.10xgenomics.com/supp/cell-arc/refdata-cellranger-arc-mm10-2020-A-2.0.0.tar.gz\",\n", - " },\n", - " 'CellRangerATAC':\n", - " {\n", - " 'Human': \"https://cf.10xgenomics.com/supp/cell-atac/refdata-cellranger-arc-GRCh38-2020-A-2.0.0.tar.gz\",\n", - " 'Mouse': \"https://cf.10xgenomics.com/supp/cell-atac/refdata-cellranger-arc-mm10-2020-A-2.0.0.tar.gz\",\n", - " },\n", - " 'CellRangerGex':\n", - " {\n", - " 'Human': \"https://cf.10xgenomics.com/supp/cell-exp/refdata-gex-GRCh38-2020-A.tar.gz\",\n", - " 'Mouse': \"https://cf.10xgenomics.com/supp/cell-exp/refdata-gex-mm10-2020-A.tar.gz\",\n", - " },\n", - " 'CellRangerVdj':\n", - " {\n", - " 'Human': \"GRCh38\"\n", - " },\n", - "}\n", + "# Load aws\n", "\n", - "def get_cr_reference(sample_id, prefix, user, password):\n", - " # Get species from database to decide reference\n", - " species = get_species(sample_id, user, password)\n", - " \n", - " # Map to reference locations\n", - " try:\n", - " return cr_reference_map[prefix][species]\n", - " except:\n", - " raise ValueError(f\"Unknown Species: {species}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "bf3f9f33-b976-4d11-897b-79199a7e1068", - "metadata": {}, - "outputs": [], - "source": [ - "def get_bc_whitelist(sample_id):\n", - " # Get version from database to decide whitelist\n", - " sc_tech = get_sc_tech(sample_id, creds[\"user\"], creds[\"password\"])\n", - " \n", - " # Map to reference locations\n", - " if \"V3\" in sc_tech:\n", - " return \"s3://seqc-public/barcodes/ten_x_v3/flat/3M-february-2018.txt\"\n", - " elif \"V2\" in sc_tech:\n", - " return \"s3://seqc-public/barcodes/ten_x_v2/flat/737K-august-2016.txt\"\n", - " else:\n", - " raise ValueError(f\"Unknown Technology: {sc_tech}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "c53b08e4-73fb-4fc6-85f6-cb7e6292d000", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "def run(\n", - " workflow_path: str,\n", - " execp: str,\n", - " secrets: str,\n", - " inputs: str,\n", - " labels: str,\n", - " options: str,\n", - "):\n", - " # change working directory to the pipeline package\n", - " oldwd = os.getcwd()\n", - " os.chdir(workflow_path)\n", - " \n", - " # execute the pipeline command\n", - " cmd = f\"{workflow_path}/{execp} -k {secrets} -i {inputs} -l {labels} -o {options}\"\n", - " var = subprocess.run(shlex.split(cmd), universal_newlines=True, capture_output=True)\n", - " out = var.__dict__\n", - " \n", - " # change working directory back\n", - " os.chdir(oldwd)\n", - " \n", - " return out" + "%env AWS_ACCESS_KEY_ID=ASIAYPY66CWMGLBAIGO6\n", + "%env AWS_SECRET_ACCESS_KEY=i6fm87l+UNBLyxlwU4AXD2HEGTXYutOlj4lfB9bk\n", + "%env AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEK///////////wEaCXVzLWVhc3QtMSJHMEUCIQCAs8AyD3w8/luR3fB4wyOA0fC5vzw2nyzspQ7/+Pgf/AIgBhFvsspOJmLbACqO8/42UuRe7nu6vdi7DaJ5k/UFDxsq7wEISBADGgw1ODM2NDM1Njc1MTIiDP2ESPVfC1OK7pmq+SrMAQRwXr+RvcapTJP/skUqP4og+mqro7RYgBPQ8OQKWReZ0JLWYk2+/npsDqlMM5j7Zre4aQPkttvkyacSoDBo4B/SufvOD5eotZyXsKR5zEjrgn9HTQGxlylIakbUK/7pJSe4pJxAya79ZEC/1PrAUYnZR2ZGGgYgRF0oIwzbLblSoAmBYeNbbkbluJC3qbicERnH/BHlO4oHXPMesuS+QncRWn8rlRxGRySgTaW+gcH2tBwDBhB+RURyCtXC3AyJmQ7tp4MerTHhTToIaTCIqe2YBjqYAbdygCv6Qz2i+YqCafTb2npOoT7PPA6ooeWnXXzZXPc8POEASCBAq6bOIWvGWcKxwVwgode8mb8/R9oBnXQh0wdqm+ufpGuUAaVE8Y8rgNGXiKnCq/QywzTtjpgOTvJkYw8WPUWE6J8KhN10WqJtEdvif9E15Zqj7H69BL+Zy2wayYbu35OTPBuK3q4QlAVNk5fS+Uvkwxyz\n", + "!aws s3 ls" ] }, { "cell_type": "code", "execution_count": null, - "id": "80414572-8a8e-44a8-ada1-3b636086da98", + "id": "ec0b1510-6658-48b8-a9ec-76e52d414357", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", - "id": "3c47d694-4856-42e3-8458-68708048ca30", + "id": "f3151feb-24bb-4ef2-89db-c6e2ef1ea6f1", "metadata": { "tags": [] }, "source": [ - "## Additional functions" - ] - }, - { - "cell_type": "markdown", - "id": "6b389052-37ff-49b0-90e7-473c3725f0d6", - "metadata": { - "tags": [] - }, - "source": [ - "### DB query" + "# Setup" ] }, { "cell_type": "code", - "execution_count": 17, - "id": "68bd2fa1-53e2-41aa-8f8e-da549db23f97", - "metadata": {}, - "outputs": [], - "source": [ - "# Common query col: id, request_id, Sample\n", - "def get_sample_name(query, query_col, creds):\n", - " \n", - " user = creds['user']\n", - " password = creds['password']\n", - " \n", - " try:\n", - " table_sample_data = \"peer_lab_db.sample_data\"\n", - " query = f\"\"\"\n", - " SELECT {table_sample_data}.Sample\n", - " FROM {table_sample_data}\n", - " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", - " \"\"\"\n", - " sample_names = []\n", - " results = execute_query(query, user, password)\n", - " for result in results:\n", - " sample_names.append(result[0])\n", - " return sample_names\n", - " except Error as e:\n", - " print(f\"Error: {e}\")\n", - " \n", - " \n", - "def get_aws_path(query, query_col, creds):\n", - " \n", - " user = creds['user']\n", - " password = creds['password']\n", - " \n", - " try:\n", - " table_sample_data = \"peer_lab_db.sample_data\"\n", - " query = f\"\"\"\n", - " SELECT {table_sample_data}.AWS_storage\n", - " FROM {table_sample_data}\n", - " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", - " \"\"\"\n", - " sample_paths = []\n", - " results = execute_query(query, user, password)\n", - " for result in results:\n", - " sample_paths.append(result[0])\n", - " return sample_paths\n", - " except Error as e:\n", - " print(f\"Error: {e}\")\n", - " \n", - " \n", - "def get_sample_id(query, query_col, creds):\n", - " \n", - " user = creds['user']\n", - " password = creds['password']\n", - " \n", - " try:\n", - " table_sample_data = \"peer_lab_db.sample_data\"\n", - " query = f\"\"\"\n", - " SELECT {table_sample_data}.id\n", - " FROM {table_sample_data}\n", - " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", - " \"\"\"\n", - " sample_ids = []\n", - " results = execute_query(query, user, password)\n", - " for result in results:\n", - " sample_ids.append(result[0])\n", - " return sample_ids\n", - " except Error as e:\n", - " print(f\"Error: {e}\")\n", - " \n", - "def format_sample_aws(querys, query_col, creds):\n", - " sample_names = []\n", - " sample_paths = []\n", - " sample_ids = []\n", - " \n", - " for query in querys:\n", - " sample_names += get_sample_name(query, query_col, creds)\n", - " sample_paths += get_aws_path(query, query_col, creds)\n", - " sample_ids += get_sample_id(query, query_col, creds)\n", - " \n", - " sample_paths = [s.strip('/') for s in sample_paths] # remove trailing slash if exists\n", - " \n", - " samples = pd.DataFrame(\n", - " dict(S3_Path=sample_paths, Sample_ID=sample_ids),\n", - " index=sample_names,\n", - " dtype=str,\n", - " )\n", - " return samples" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "fa96390b-c1e5-48f6-af5b-6eed769f5020", + "execution_count": 4, + "id": "344f296d-dcda-4c92-9a18-57d587e6827e", "metadata": {}, "outputs": [], "source": [ - "def get_genomeIndex_id(query, query_col, creds):\n", - " user = creds['user']\n", - " password = creds['password']\n", - " \n", - " try:\n", - " table_sample_data = \"peer_lab_db.sample_data\"\n", - " query = f\"\"\"\n", - " SELECT {table_sample_data}.genomeIndex_id\n", - " FROM {table_sample_data}\n", - " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", - " \"\"\"\n", - " \n", - " results = execute_query(query, user, password)\n", - " for result in results:\n", - " genomeIndex_id = result[0]\n", - " \n", - " return genomeIndex_id\n", - " \n", - " except Error as e:\n", - " print(f\"Error: {e}\")\n", - " \n", - "def get_scTech_id(query, query_col, creds):\n", - " user = creds['user']\n", - " password = creds['password']\n", - " \n", - " try:\n", - " table_sample_data = \"peer_lab_db.genome_index\"\n", - " query = f\"\"\"\n", - " SELECT {table_sample_data}.scTech_id\n", - " FROM {table_sample_data}\n", - " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", - " \"\"\"\n", - " \n", - " results = execute_query(query, user, password)\n", - " for result in results:\n", - " scTech_id = result[0]\n", - " \n", - " return scTech_id\n", - " \n", - " except Error as e:\n", - " print(f\"Error: {e}\")\n", - " \n", - "def get_index(query, query_col, creds):\n", - " user = creds['user']\n", - " password = creds['password']\n", - " \n", - " try:\n", - " table_sample_data = \"peer_lab_db.genome_index\"\n", - " query = f\"\"\"\n", - " SELECT {table_sample_data}.gIndex\n", - " FROM {table_sample_data}\n", - " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", - " \"\"\"\n", - " \n", - " results = execute_query(query, user, password)\n", - " for result in results:\n", - " index = result[0]\n", - " \n", - " return index\n", - " \n", - " except Error as e:\n", - " print(f\"Error: {e}\")\n", - " \n", - "def get_assay(query, query_col, creds):\n", - " user = creds['user']\n", - " password = creds['password']\n", - " \n", - " try:\n", - " table_sample_data = \"peer_lab_db.sc_tech\"\n", - " query = f\"\"\"\n", - " SELECT {table_sample_data}.Run_name\n", - " FROM {table_sample_data}\n", - " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", - " \"\"\"\n", - " \n", - " results = execute_query(query, user, password)\n", - " for result in results:\n", - " assay = result[0]\n", - " \n", - " return assay\n", - " \n", - " except Error as e:\n", - " print(f\"Error: {e}\")\n", - " \n", - "def get_barcode(query, query_col, creds):\n", - " user = creds['user']\n", - " password = creds['password']\n", - " \n", - " try:\n", - " table_sample_data = \"peer_lab_db.sc_tech\"\n", - " query = f\"\"\"\n", - " SELECT {table_sample_data}.barcodes\n", - " FROM {table_sample_data}\n", - " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", - " \"\"\"\n", - " \n", - " results = execute_query(query, user, password)\n", - " for result in results:\n", - " barcode = result[0]\n", - " \n", - " return barcode\n", - " \n", - " except Error as e:\n", - " print(f\"Error: {e}\")\n", - " \n", - "def get_species_id(query, query_col, creds):\n", - " user = creds['user']\n", - " password = creds['password']\n", - " \n", - " try:\n", - " table_sample_data = \"peer_lab_db.genome_index\"\n", - " query = f\"\"\"\n", - " SELECT {table_sample_data}.species_id\n", - " FROM {table_sample_data}\n", - " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", - " \"\"\"\n", - " \n", - " results = execute_query(query, user, password)\n", - " for result in results:\n", - " species_id = result[0]\n", - " \n", - " return species_id\n", - " \n", - " except Error as e:\n", - " print(f\"Error: {e}\")\n", - " \n", - "def get_species(query, query_col, creds):\n", - " user = creds['user']\n", - " password = creds['password']\n", - " \n", - " try:\n", - " table_sample_data = \"peer_lab_db.species\"\n", - " query = f\"\"\"\n", - " SELECT {table_sample_data}.Species\n", - " FROM {table_sample_data}\n", - " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", - " \"\"\"\n", - " \n", - " results = execute_query(query, user, password)\n", - " for result in results:\n", - " barcode = result[0]\n", - " \n", - " return barcode\n", - " \n", - " except Error as e:\n", - " print(f\"Error: {e}\")\n", + "# Which pipeline are you running\n", "\n", - " \n", - "def format_assay_barcode(samples, creds):\n", - " \n", - " # samples['genomeIndex_id'] = np.nan\n", - " samples['Reference'] = np.nan\n", - " # samples['scTech_id'] = np.nan\n", - " samples['assay'] = np.nan\n", - " # samples['barcode'] = np.nan\n", - " samples['species'] = np.nan\n", - " \n", - " for sample, row in samples.iterrows():\n", - " sample_id = row['Sample_ID']\n", - " \n", - " genomeIndex_id = get_genomeIndex_id(sample_id, 'id', creds)\n", - " index = get_index(genomeIndex_id, 'id', creds)\n", - " scTech_id = get_scTech_id(genomeIndex_id, 'id', creds)\n", - " assay = get_assay(scTech_id, 'id', creds)\n", - " barcode = get_barcode(scTech_id, 'id', creds)\n", - " species_id = get_species_id(genomeIndex_id, 'id', creds)\n", - " species = get_species(species_id, 'id', creds)\n", - " \n", + "prefix = \"CellRangerVdj\" # Workflow to run; also .wdl filename prefix\n", + "output_dirname = \"cr-vdj-results\"\n", "\n", - " samples.loc[sample, 'species'] = species\n", - " # samples.loc[sample, 'genomeIndex_id'] = genomeIndex_id\n", - " if index:\n", - " samples.loc[sample, 'Reference'] = index.strip()\n", - " else:\n", - " samples.loc[sample, 'Reference'] = cr_reference_map[prefix][species]\n", - " # samples.loc[sample, 'scTech_id'] = scTech_id\n", - " if assay:\n", - " samples.loc[sample, 'assay'] = assay.strip()\n", - " # samples.loc[sample, 'barcode'] = barcode.strip()\n", - " \n", + "workflow_dir = glob.glob(f\"{Path.home()}/scing/bin/cellranger-vdj-*\")[0]\n", + "path_to_exec = f\"{workflow_dir}/submit.sh\" # CHANGE THIS FOR SHARP\n", "\n", - " return samples" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "9d4a59dc-fb1a-4e84-8fc9-95238eb22291", - "metadata": {}, - "outputs": [], - "source": [ - "def get_project_id(sample_id, creds):\n", - " \n", - " user = creds['user']\n", - " password = creds['password']\n", - " \n", - " try:\n", - " table_sample_data = \"peer_lab_db.sample_data\"\n", - " table_project_data = \"peer_lab_db.project_data\"\n", - " query = f\"\"\"\n", - " SELECT {table_project_data}.projectName\n", - " FROM {table_project_data}\n", - " LEFT JOIN {table_sample_data}\n", - " ON {table_project_data}.id = {table_sample_data}.projectData_id\n", - " WHERE {table_sample_data}.id = {sample_id}\n", - " \"\"\"\n", - " result = execute_query(query, user, password)[0][0]\n", - " return result\n", - " except Error as e:\n", - " print(f\"Error: {e}\")" - ] - }, - { - "cell_type": "markdown", - "id": "01a8da79-682e-4ba6-861d-b9e4b54af6fe", - "metadata": { - "tags": [] - }, - "source": [ - "## Get tar gz file for reference" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "539e3ea7-b40a-4a70-a840-ffbaf32baab0", - "metadata": {}, - "outputs": [], - "source": [ - "# Get fastq file paths on S3 for each file id\n", - "# Returns dictionary from id to s3 path\n", - "# Throws exception if FASTQs don't exist for any id\n", - "def get_reference(\n", - " path: str, # path to directory containing FASTQ files\n", - "):\n", - " print(path)\n", - " _, bucket, key, _, _ = urllib.parse.urlsplit(path)\n", - " reference = get_s3_objects(\n", - " bucket, key.lstrip(\"/\"),\n", - " re.compile(f\".tar.gz$\")\n", - " )\n", - " try:\n", - " reference = reference[0]\n", - " reference = os.path.join(\"s3://\", bucket, reference)\n", - " except AssertionError as err:\n", - " logging.warning(\"%s\\n\\t %s\", err, path)\n", - " return\n", - " return reference" - ] - }, - { - "cell_type": "markdown", - "id": "98cd9e7f-2171-4710-b329-b4812aeafd67", - "metadata": {}, - "source": [ - "# Process Samples" - ] - }, - { - "cell_type": "markdown", - "id": "28995755-3d1b-45f9-8fac-0c13bac4f9c9", - "metadata": { - "tags": [] - }, - "source": [ - "## Setup" + "# Locations of workflow-related directories and files\n", + "path_to_cromwell_secrets = f\"{Path.home()}/.cromwell/cromwell-secrets.json\"\n", + "db_credentials_path = f\"{Path.home()}/.config.json\"" ] }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 5, "id": "9db6a119-0ad5-4965-b988-9c85de2591b6", "metadata": {}, "outputs": [], "source": [ "# Location of docker files\n", "common_docker_registry = \"quay.io/hisplan\"\n", - "\n", - "prefix = \"CellRangerVdj\" # Workflow to run; also .wdl filename prefix\n", "pipeline_type = prefix # field in *.labels.json\n", - "output_dirname = \"cr-vdj-results\"\n", - "\n", - "# If need to add comment, put here\n", "comment = \"\"" ] }, { "cell_type": "code", - "execution_count": 22, - "id": "a067d6c1-49da-4901-ba59-bd21c5a69871", + "execution_count": 6, + "id": "66f7b9a1-9d9d-4afa-9dd9-91ac30b6cefb", "metadata": {}, "outputs": [], "source": [ - "# Locations of workflow-related directories and files\n", - "path_to_cromwell_secrets = f\"{Path.home()}/.cromwell/cromwell-secrets.json\" # CHANGE THIS\n", - "workflow_dir = f\"{Path.home()}/scing/bin/cellranger-vdj-6.1.2\" # CHANGE THIS\n", - "path_to_exec = f\"{workflow_dir}/submit.sh\" # CHANGE THIS FOR SHARP\n", + "# Workflow file paths\n", "config_dir = f\"{workflow_dir}/configs\"\n", - "path_to_options = f\"{workflow_dir}/{prefix}.options.aws.json\"\n", - "\n", - "# Other file locations\n", - "db_credentials_path = f\"{Path.home()}/.config.json\" # CHANGE THIS" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "d3fa829f-dfab-4f1a-b943-1f8ef0106985", - "metadata": {}, - "outputs": [], - "source": [ - "# Set credentials based on SCRIdb CLI config file\n", - "with open(db_credentials_path) as f:\n", - " creds = json.load(f)" + "path_to_options = f\"{workflow_dir}/{prefix}.options.aws.json\"" ] }, { "cell_type": "code", - "execution_count": 24, - "id": "e2aca850-d8df-4247-a961-9adc5dffa741", + "execution_count": 7, + "id": "a067d6c1-49da-4901-ba59-bd21c5a69871", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "env: AWS_ACCESS_KEY_ID=ASIAYPY66CWMP62NDHHJ\n", - "env: AWS_SECRET_ACCESS_KEY=+vN4OePqnFaMmtmn8j+vX07vT/ytL6KXegHoWtXM\n", - "env: AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEBkaCXVzLWVhc3QtMSJHMEUCIQDnicGk6x51cqXMOOaoToeNBclj4YkWARak9yD1JUOdOwIgZVm9Bf97AxeXMiBYTta58H2UEK3hjr7HxQcG9VhgjQ4q7wEIIhADGgw1ODM2NDM1Njc1MTIiDKEqQMj0zJvIE5N8yirMAbmsr69d2hSRrXUDgOoQSs6uR71H4B4L/+IGd7k07ajoW0QlInUZEvWqwqEiCr41zB0b4+2ibcm5QdKAqZxowl/QRGfNltScM2RsGXAlIVzvAfHAGHU3lVOi9KYd/0MRLBDqyghKojzUvrxnHHF0ZuwuUTFcS/Bl36xjYfSuq78jgebZ8CFqQ9ii5/Z3af8eiFjpxSZIX7fRetUhwCk3/2E6SH38kX9Ijr6qufVNqugWVxQtNrqnYh3aRvOebt7o6n3hnyj+jjol+l74yzCMqIqVBjqYAeIl6o8n8l/YvF5E0ftbBoxB9+sxyOFpIuPGVA9xrtmTsiKVIT0asvr/IJ4t/isujGKQVVxSrIzINYuHUcs6Vtkf958uDeJwSSg7o2QsXV2fmCbWCM8zmRqYuOcTVwXEDrz9hQ0r3rdj1QJMjLNzh4LhN2uRS2rLuUNZ+g3Qgplw0IfiiKROEovxz8TnXt3SlHugXn0brEBA\n", - "2021-10-07 15:31:32 agc-583643567512-us-east-1\n", - "2021-10-07 15:28:07 cdktoolkit-stagingbucket-d49u1xfb0sc4\n", - "2019-10-09 13:04:06 cf-templates-umiwbnq3566w-us-east-1\n", - "2019-10-10 12:46:54 dp-daily-reports\n", - "2017-09-26 10:15:15 dp-lab-data\n", - "2019-05-23 12:34:58 dp-lab-data-public\n", - "2018-03-01 13:29:07 dp-lab-glacier\n", - "2020-11-06 23:02:27 dp-lab-gwf-core\n", - "2021-07-15 18:14:01 dp-lab-gwf-core2\n", - "2017-09-26 10:17:18 dp-lab-home\n", - "2019-08-14 16:42:43 dp-lab-test\n", - "2019-04-25 12:35:35 elasticbeanstalk-us-east-1-583643567512\n", - "2019-12-13 15:53:57 scri-computational\n", - "2017-09-26 10:23:50 seqc-public\n" - ] - } - ], + "outputs": [], "source": [ - "%env AWS_ACCESS_KEY_ID=ASIAYPY66CWMP62NDHHJ\n", - "%env AWS_SECRET_ACCESS_KEY=+vN4OePqnFaMmtmn8j+vX07vT/ytL6KXegHoWtXM\n", - "%env AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEBkaCXVzLWVhc3QtMSJHMEUCIQDnicGk6x51cqXMOOaoToeNBclj4YkWARak9yD1JUOdOwIgZVm9Bf97AxeXMiBYTta58H2UEK3hjr7HxQcG9VhgjQ4q7wEIIhADGgw1ODM2NDM1Njc1MTIiDKEqQMj0zJvIE5N8yirMAbmsr69d2hSRrXUDgOoQSs6uR71H4B4L/+IGd7k07ajoW0QlInUZEvWqwqEiCr41zB0b4+2ibcm5QdKAqZxowl/QRGfNltScM2RsGXAlIVzvAfHAGHU3lVOi9KYd/0MRLBDqyghKojzUvrxnHHF0ZuwuUTFcS/Bl36xjYfSuq78jgebZ8CFqQ9ii5/Z3af8eiFjpxSZIX7fRetUhwCk3/2E6SH38kX9Ijr6qufVNqugWVxQtNrqnYh3aRvOebt7o6n3hnyj+jjol+l74yzCMqIqVBjqYAeIl6o8n8l/YvF5E0ftbBoxB9+sxyOFpIuPGVA9xrtmTsiKVIT0asvr/IJ4t/isujGKQVVxSrIzINYuHUcs6Vtkf958uDeJwSSg7o2QsXV2fmCbWCM8zmRqYuOcTVwXEDrz9hQ0r3rdj1QJMjLNzh4LhN2uRS2rLuUNZ+g3Qgplw0IfiiKROEovxz8TnXt3SlHugXn0brEBA\n", - "!aws s3 ls" + "# Set credentials based on SCRIdb CLI config file\n", + "with open(db_credentials_path) as f:\n", + " creds = json.load(f)" ] }, { "cell_type": "code", "execution_count": null, - "id": "cc47d702-f319-42bf-8434-68f7d662159b", + "id": "f5778d94-6cb3-474c-b4ad-e051ccd66602", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", - "id": "228b2db2-d5d5-4233-8ade-8ad84f459c40", + "id": "343fb1a2-db6a-4ada-a12f-a62493d55834", "metadata": {}, "source": [ - "## Get sample Information" + "# Sample information" ] }, { "cell_type": "code", - "execution_count": 25, - "id": "8e3c30d9-273e-4ffe-82a4-e23adb3d1ac0", + "execution_count": 8, + "id": "3bad3986-1d7e-4194-928b-51b4e2debe35", "metadata": {}, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + " SELECT Sample, AWS_storage, id\n", + " FROM peer_lab_db.sample_data \n", + " WHERE peer_lab_db.sample_data.id = \"4006\"\n" + ] + }, { "data": { "text/html": [ @@ -927,194 +217,138 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
SamplepipelineTypeprojectsampleownerdestinationtransfercomment
PB-1709_EL3_MaleCellRangerGexSingle myonucleus RNAseqPB-1709_EL3_Malesohailns3://dp-lab-data/collaborators/bayli...-sohailn
PB-1709_EL3_FemaleCellRangerGexSingle myonucleus RNAseqPB-1709_EL3_Femalesohailns3://dp-lab-data/collaborators/bayli...-sohailn
PB-1709_Bsg25DPM-1779_LC479A_5primeCellRangerGexSingle myonucleus RNAseqPB-1709_Bsg25DPre-_post-IO NSCLCPM-1779_LC479A_5primesohailns3://dp-lab-data/collaborators/bayli...s3://dp-lab-data/collaborators/rudin...-sohailn
CellRangerGex.memoryCellRangerGex.dockerRegistry
PB-1709_EL3_MalePB-1709_EL3_Male3842_PB-1709_EL3_Male_IGO_12437_AO_42[s3://dp-lab-data/collaborators/bayl...https://dp-lab-data.s3.amazonaws.com...False5000256quay.io/hisplan
PB-1709_EL3_FemalePB-1709_EL3_Female3843_PB-1709_EL3_Female_IGO_12437_AO_41[s3://dp-lab-data/collaborators/bayl...https://dp-lab-data.s3.amazonaws.com...False5000256quay.io/hisplanSample
PB-1709_Bsg25DPB-1709_Bsg25D3844_PB-1709_Bsg25D_IGO_12437_AO_43[s3://dp-lab-data/collaborators/bayl...https://dp-lab-data.s3.amazonaws.com...FalsePM-1779_LC479A_5primePM-1779_LC479A_5prime4006_PM-1779_LC479A_5prime_IGO_12437...[s3://dp-lab-data/collaborators/rudi...https://cf.10xgenomics.com/supp/cell...True5000256quay.io/hisplantransfercomment
PB-1709_EL3_MaleCellRangerGexSingle myonucleus RNAseqPB-1709_EL3_Malesohailns3://dp-lab-data/collaborators/bayli...-sohailn
PB-1709_EL3_FemaleCellRangerGexSingle myonucleus RNAseqPB-1709_EL3_Femalesohailns3://dp-lab-data/collaborators/bayli...-sohailnSample
PB-1709_Bsg25DPM-1779_LC479A_5primeCellRangerGexSingle myonucleus RNAseqPB-1709_Bsg25DPre-_post-IO NSCLCPM-1779_LC479A_5primesohailns3://dp-lab-data/collaborators/bayli...s3://dp-lab-data/collaborators/rudin...-sohailn
S3_PathSample_ID
SD-1680_Patient_D_nucseq_GEs3://dp-lab-data/collaborators/VanDe...3808
SD-1680_Patient_F_nucseq_GEs3://dp-lab-data/collaborators/VanDe...3809
SD-1680_Patient_I_nucseq_GEs3://dp-lab-data/collaborators/VanDe...3810
SD-1680_Patient_D_nucseq_2_GEs3://dp-lab-data/collaborators/VanDe...3811AWS_storageidspeciessc_techproject_idreference
SD-1680_Patient_F_nucseq_2_GEs3://dp-lab-data/collaborators/VanDe...3812Sample
SD-1680_Patient_I_nucseq_2_GEs3://dp-lab-data/collaborators/VanDe...3813PM-1779_LC479A_5primes3://dp-lab-data/collaborators/rudin...4006human10X_5primePre-_post-IO NSCLCGRCh38-3.0.0
\n", "
" ], "text/plain": [ - " S3_Path \\\n", - "SD-1680_Patient_D_nucseq_GE s3://dp-lab-data/collaborators/VanDe... \n", - "SD-1680_Patient_F_nucseq_GE s3://dp-lab-data/collaborators/VanDe... \n", - "SD-1680_Patient_I_nucseq_GE s3://dp-lab-data/collaborators/VanDe... \n", - "SD-1680_Patient_D_nucseq_2_GE s3://dp-lab-data/collaborators/VanDe... \n", - "SD-1680_Patient_F_nucseq_2_GE s3://dp-lab-data/collaborators/VanDe... \n", - "SD-1680_Patient_I_nucseq_2_GE s3://dp-lab-data/collaborators/VanDe... \n", + " AWS_storage id species \\\n", + "Sample \n", + "PM-1779_LC479A_5prime s3://dp-lab-data/collaborators/rudin... 4006 human \n", "\n", - " Sample_ID \n", - "SD-1680_Patient_D_nucseq_GE 3808 \n", - "SD-1680_Patient_F_nucseq_GE 3809 \n", - "SD-1680_Patient_I_nucseq_GE 3810 \n", - "SD-1680_Patient_D_nucseq_2_GE 3811 \n", - "SD-1680_Patient_F_nucseq_2_GE 3812 \n", - "SD-1680_Patient_I_nucseq_2_GE 3813 " + " sc_tech project_id reference \n", + "Sample \n", + "PM-1779_LC479A_5prime 10X_5prime Pre-_post-IO NSCLC GRCh38-3.0.0 " ] }, - "execution_count": 25, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "# Common query col: id, request_id, Sample\n", - "sample_ids = list(range(3808, 3814))\n", - "samples = format_sample_aws(sample_ids, 'id', creds)\n", + "# You can supply a list of IDs or request IDs\n", + "\n", + "# request_ids = ['PM-1779']\n", + "# samples = sample_scridb_info(request_ids, 'request_id', creds)\n", + "\n", + "sample_ids = [4006]\n", + "samples = sample_scridb_info(sample_ids, 'id', creds)\n", + "\n", "samples" ] }, { "cell_type": "code", - "execution_count": 26, - "id": "07074e44-a339-468d-81a2-d10005209528", + "execution_count": null, + "id": "6ea67344-a367-4906-9fa4-041c7f0b4d9c", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "422c1151-9e53-4ff3-a178-7a37d69a586d", + "metadata": {}, + "source": [ + "IMPORTANT NOTE \n", + "\n", + "Check the name of the folder you are running. Typically the folder that is stored in the database is just the GEX. So if another library is generated (multiome ATAC, VDJ, hashtag, etc) then it needs to be manually changed." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "502590c9-15ac-40e1-8d78-1aba15cb02cd", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "PM-1779_LC479A_5prime\n", + " PRE PM-1779_LC479A_5prime/\n", + " PRE PM-1779_LC479A_5prime_TCR_VDJ/\n", + "\n" + ] + } + ], + "source": [ + "# Check the name of the folder you are running\n", + "# Especially if there are multiple libraries (i.e ATAC, TCR_VDJ, etc.)\n", + "\n", + "for sample, row in samples.iterrows():\n", + " print(sample)\n", + " path = os.path.split(row['AWS_storage'])[0] + '/'\n", + " os.system(f'aws s3 ls {path} | grep {sample}')\n", + " print()" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "6b77de06-8a75-4131-a435-0aac440fdb80", "metadata": {}, "outputs": [ { "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
S3_PathSample_IDReferenceassayspecies
SD-1680_Patient_D_nucseq_GEs3://dp-lab-data/collaborators/VanDe...3808GRCh38five_primeHuman
SD-1680_Patient_F_nucseq_GEs3://dp-lab-data/collaborators/VanDe...3809GRCh38five_primeHuman
SD-1680_Patient_I_nucseq_GEs3://dp-lab-data/collaborators/VanDe...3810GRCh38five_primeHuman
SD-1680_Patient_D_nucseq_2_GEs3://dp-lab-data/collaborators/VanDe...3811GRCh38five_primeHuman
SD-1680_Patient_F_nucseq_2_GEs3://dp-lab-data/collaborators/VanDe...3812GRCh38five_primeHuman
SD-1680_Patient_I_nucseq_2_GEs3://dp-lab-data/collaborators/VanDe...3813GRCh38five_primeHuman
\n", - "
" - ], "text/plain": [ - " S3_Path \\\n", - "SD-1680_Patient_D_nucseq_GE s3://dp-lab-data/collaborators/VanDe... \n", - "SD-1680_Patient_F_nucseq_GE s3://dp-lab-data/collaborators/VanDe... \n", - "SD-1680_Patient_I_nucseq_GE s3://dp-lab-data/collaborators/VanDe... \n", - "SD-1680_Patient_D_nucseq_2_GE s3://dp-lab-data/collaborators/VanDe... \n", - "SD-1680_Patient_F_nucseq_2_GE s3://dp-lab-data/collaborators/VanDe... \n", - "SD-1680_Patient_I_nucseq_2_GE s3://dp-lab-data/collaborators/VanDe... \n", - "\n", - " Sample_ID Reference assay species \n", - "SD-1680_Patient_D_nucseq_GE 3808 GRCh38 five_prime Human \n", - "SD-1680_Patient_F_nucseq_GE 3809 GRCh38 five_prime Human \n", - "SD-1680_Patient_I_nucseq_GE 3810 GRCh38 five_prime Human \n", - "SD-1680_Patient_D_nucseq_2_GE 3811 GRCh38 five_prime Human \n", - "SD-1680_Patient_F_nucseq_2_GE 3812 GRCh38 five_prime Human \n", - "SD-1680_Patient_I_nucseq_2_GE 3813 GRCh38 five_prime Human " + "['s3://dp-lab-data/collaborators/rudin/PrePostIoNsclc/PM-1779_LC479A_5prime_TCR_VDJ']" ] }, - "execution_count": 26, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "samples = format_assay_barcode(samples, creds)\n", - "samples" + "# Modify the path to be the correct folder if necessary\n", + "\n", + "samples['AWS_storage'] += '_TCR_VDJ'\n", + "list(samples['AWS_storage'].values)" ] }, { "cell_type": "code", - "execution_count": 27, - "id": "e2a13aa2-8568-44e8-8316-615b22e4ee2a", + "execution_count": 11, + "id": "e85154ba-47ad-4f3a-b2c8-9c81f2d33e23", "metadata": {}, "outputs": [ { @@ -1138,67 +372,34 @@ " \n", " \n", " \n", - " S3_Path\n", - " Sample_ID\n", - " Reference\n", - " assay\n", + " AWS_storage\n", + " id\n", " species\n", + " sc_tech\n", + " project_id\n", + " reference\n", " FASTQs\n", " \n", - " \n", - " \n", - " \n", - " SD-1680_Patient_D_nucseq_GE\n", - " s3://dp-lab-data/collaborators/VanDe...\n", - " 3808\n", - " GRCh38\n", - " five_prime\n", - " Human\n", - " {'I1': ['s3://dp-lab-data/collaborat...\n", - " \n", - " \n", - " SD-1680_Patient_F_nucseq_GE\n", - " s3://dp-lab-data/collaborators/VanDe...\n", - " 3809\n", - " GRCh38\n", - " five_prime\n", - " Human\n", - " {'I1': ['s3://dp-lab-data/collaborat...\n", - " \n", - " \n", - " SD-1680_Patient_I_nucseq_GE\n", - " s3://dp-lab-data/collaborators/VanDe...\n", - " 3810\n", - " GRCh38\n", - " five_prime\n", - " Human\n", - " {'I1': ['s3://dp-lab-data/collaborat...\n", - " \n", - " \n", - " SD-1680_Patient_D_nucseq_2_GE\n", - " s3://dp-lab-data/collaborators/VanDe...\n", - " 3811\n", - " GRCh38\n", - " five_prime\n", - " Human\n", - " {'I1': ['s3://dp-lab-data/collaborat...\n", - " \n", " \n", - " SD-1680_Patient_F_nucseq_2_GE\n", - " s3://dp-lab-data/collaborators/VanDe...\n", - " 3812\n", - " GRCh38\n", - " five_prime\n", - " Human\n", - " {'I1': ['s3://dp-lab-data/collaborat...\n", + " Sample\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", + " \n", + " \n", " \n", - " SD-1680_Patient_I_nucseq_2_GE\n", - " s3://dp-lab-data/collaborators/VanDe...\n", - " 3813\n", - " GRCh38\n", - " five_prime\n", - " Human\n", + " PM-1779_LC479A_5prime\n", + " s3://dp-lab-data/collaborators/rudin...\n", + " 4006\n", + " human\n", + " 10X_5prime\n", + " Pre-_post-IO NSCLC\n", + " GRCh38-3.0.0\n", " {'I1': ['s3://dp-lab-data/collaborat...\n", " \n", " \n", @@ -1206,64 +407,51 @@ "" ], "text/plain": [ - " S3_Path \\\n", - "SD-1680_Patient_D_nucseq_GE s3://dp-lab-data/collaborators/VanDe... \n", - "SD-1680_Patient_F_nucseq_GE s3://dp-lab-data/collaborators/VanDe... \n", - "SD-1680_Patient_I_nucseq_GE s3://dp-lab-data/collaborators/VanDe... \n", - "SD-1680_Patient_D_nucseq_2_GE s3://dp-lab-data/collaborators/VanDe... \n", - "SD-1680_Patient_F_nucseq_2_GE s3://dp-lab-data/collaborators/VanDe... \n", - "SD-1680_Patient_I_nucseq_2_GE s3://dp-lab-data/collaborators/VanDe... \n", + " AWS_storage id species \\\n", + "Sample \n", + "PM-1779_LC479A_5prime s3://dp-lab-data/collaborators/rudin... 4006 human \n", "\n", - " Sample_ID Reference assay species \\\n", - "SD-1680_Patient_D_nucseq_GE 3808 GRCh38 five_prime Human \n", - "SD-1680_Patient_F_nucseq_GE 3809 GRCh38 five_prime Human \n", - "SD-1680_Patient_I_nucseq_GE 3810 GRCh38 five_prime Human \n", - "SD-1680_Patient_D_nucseq_2_GE 3811 GRCh38 five_prime Human \n", - "SD-1680_Patient_F_nucseq_2_GE 3812 GRCh38 five_prime Human \n", - "SD-1680_Patient_I_nucseq_2_GE 3813 GRCh38 five_prime Human \n", + " sc_tech project_id reference \\\n", + "Sample \n", + "PM-1779_LC479A_5prime 10X_5prime Pre-_post-IO NSCLC GRCh38-3.0.0 \n", "\n", - " FASTQs \n", - "SD-1680_Patient_D_nucseq_GE {'I1': ['s3://dp-lab-data/collaborat... \n", - "SD-1680_Patient_F_nucseq_GE {'I1': ['s3://dp-lab-data/collaborat... \n", - "SD-1680_Patient_I_nucseq_GE {'I1': ['s3://dp-lab-data/collaborat... \n", - "SD-1680_Patient_D_nucseq_2_GE {'I1': ['s3://dp-lab-data/collaborat... \n", - "SD-1680_Patient_F_nucseq_2_GE {'I1': ['s3://dp-lab-data/collaborat... \n", - "SD-1680_Patient_I_nucseq_2_GE {'I1': ['s3://dp-lab-data/collaborat... " + " FASTQs \n", + "Sample \n", + "PM-1779_LC479A_5prime {'I1': ['s3://dp-lab-data/collaborat... " ] }, - "execution_count": 27, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "# Get FASTQ paths from S3\n", - "# Note: Uses same FASTQ file ids for all samples\n", - "fastq_file_ids = fastq_map[prefix]\n", - "samples[\"FASTQs\"] = samples[\"S3_Path\"].apply(lambda x: get_fastqs(x, fastq_file_ids, \"FASTQ\"))\n", + "samples[\"FASTQs\"] = samples[\"AWS_storage\"].apply(lambda x: get_fastqs(x, fastq_map[prefix], \"FASTQ\"))\n", "samples" ] }, { "cell_type": "code", "execution_count": null, - "id": "db07203d-2a0f-4b0d-a49e-564d0aca90bd", + "id": "e2ac745a-92f1-4140-bb67-d904d7de581a", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", - "id": "d6be9b75-456e-49dd-bd33-a2766e84cc7c", + "id": "45b907a9-53cc-4cf7-a678-5d2f4798e457", "metadata": {}, "source": [ - "## Inputs" + "IMPORTANT NOTE \n", + "\n", + "For CellRanger you need to supply an HTTPS path. So if you are using a custom genome stored on AWS, you must make the reference public !" ] }, { "cell_type": "code", - "execution_count": 28, - "id": "9ea75c1e-9110-47e1-a66d-09ff9a80b8b5", + "execution_count": 12, + "id": "16d0ca53-edc7-4e1b-9c9c-0d812a1ae1c7", "metadata": {}, "outputs": [ { @@ -1287,303 +475,84 @@ " \n", " \n", " \n", - " CellRangerVdj.sampleName\n", - " CellRangerVdj.fastqNames\n", - " CellRangerVdj.referenceGenome\n", - " CellRangerVdj.inputFastq\n", - " CellRangerVdj.chain\n", - " CellRangerVdj.dockerRegistry\n", - " \n", - " \n", - " \n", - " \n", - " SD-1680_Patient_D_nucseq_GE\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " \n", - " \n", - " SD-1680_Patient_F_nucseq_GE\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " \n", - " \n", - " SD-1680_Patient_I_nucseq_GE\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " \n", - " \n", - " SD-1680_Patient_D_nucseq_2_GE\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " \n", - " \n", - " SD-1680_Patient_F_nucseq_2_GE\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", + " AWS_storage\n", + " id\n", + " species\n", + " sc_tech\n", + " project_id\n", + " reference\n", + " FASTQs\n", " \n", " \n", - " SD-1680_Patient_I_nucseq_2_GE\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " \n", - " \n", - "\n", - "" - ], - "text/plain": [ - " CellRangerVdj.sampleName \\\n", - "SD-1680_Patient_D_nucseq_GE NaN \n", - "SD-1680_Patient_F_nucseq_GE NaN \n", - "SD-1680_Patient_I_nucseq_GE NaN \n", - "SD-1680_Patient_D_nucseq_2_GE NaN \n", - "SD-1680_Patient_F_nucseq_2_GE NaN \n", - "SD-1680_Patient_I_nucseq_2_GE NaN \n", - "\n", - " CellRangerVdj.fastqNames \\\n", - "SD-1680_Patient_D_nucseq_GE NaN \n", - "SD-1680_Patient_F_nucseq_GE NaN \n", - "SD-1680_Patient_I_nucseq_GE NaN \n", - "SD-1680_Patient_D_nucseq_2_GE NaN \n", - "SD-1680_Patient_F_nucseq_2_GE NaN \n", - "SD-1680_Patient_I_nucseq_2_GE NaN \n", - "\n", - " CellRangerVdj.referenceGenome \\\n", - "SD-1680_Patient_D_nucseq_GE NaN \n", - "SD-1680_Patient_F_nucseq_GE NaN \n", - "SD-1680_Patient_I_nucseq_GE NaN \n", - "SD-1680_Patient_D_nucseq_2_GE NaN \n", - "SD-1680_Patient_F_nucseq_2_GE NaN \n", - "SD-1680_Patient_I_nucseq_2_GE NaN \n", - "\n", - " CellRangerVdj.inputFastq CellRangerVdj.chain \\\n", - "SD-1680_Patient_D_nucseq_GE NaN NaN \n", - "SD-1680_Patient_F_nucseq_GE NaN NaN \n", - "SD-1680_Patient_I_nucseq_GE NaN NaN \n", - "SD-1680_Patient_D_nucseq_2_GE NaN NaN \n", - "SD-1680_Patient_F_nucseq_2_GE NaN NaN \n", - "SD-1680_Patient_I_nucseq_2_GE NaN NaN \n", - "\n", - " CellRangerVdj.dockerRegistry \n", - "SD-1680_Patient_D_nucseq_GE NaN \n", - "SD-1680_Patient_F_nucseq_GE NaN \n", - "SD-1680_Patient_I_nucseq_GE NaN \n", - "SD-1680_Patient_D_nucseq_2_GE NaN \n", - "SD-1680_Patient_F_nucseq_2_GE NaN \n", - "SD-1680_Patient_I_nucseq_2_GE NaN " - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Load minimum inputs and labels fields from templates\n", - "with open(f\"{config_dir}/template.inputs.json\") as f:\n", - " std_inputs_fields = list(json.load(f).keys())\n", - " \n", - "# Annotate all samples with workflow inputs and labels\n", - "inputs = pd.DataFrame(index=samples.index, columns=std_inputs_fields,)\n", - "\n", - "inputs" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "id": "6bdf4037-df51-4f71-82a5-3187f7266f76", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", " \n", "
SampleCellRangerVdj.sampleNameCellRangerVdj.fastqNamesCellRangerVdj.referenceGenomeCellRangerVdj.inputFastqCellRangerVdj.chainCellRangerVdj.dockerRegistry
SD-1680_Patient_D_nucseq_GESD-1680_Patient_D_nucseq_GE3808_SD-1680_Patient_D_nucseq_GE_IGO...GRCh38[s3://dp-lab-data/collaborators/VanD...autoquay.io/hisplan
SD-1680_Patient_F_nucseq_GESD-1680_Patient_F_nucseq_GE3809_SD-1680_Patient_F_nucseq_GE_IGO...GRCh38[s3://dp-lab-data/collaborators/VanD...autoquay.io/hisplan
SD-1680_Patient_I_nucseq_GESD-1680_Patient_I_nucseq_GE3810_SD-1680_Patient_I_nucseq_GE_IGO...GRCh38[s3://dp-lab-data/collaborators/VanD...autoquay.io/hisplan
SD-1680_Patient_D_nucseq_2_GESD-1680_Patient_D_nucseq_2_GE3811_SD-1680_Patient_D_nucseq_2_GE_I...GRCh38[s3://dp-lab-data/collaborators/VanD...autoquay.io/hisplan
SD-1680_Patient_F_nucseq_2_GESD-1680_Patient_F_nucseq_2_GE3812_SD-1680_Patient_F_nucseq_2_GE_I...PM-1779_LC479A_5primes3://dp-lab-data/collaborators/rudin...4006human10X_5primePre-_post-IO NSCLCGRCh38[s3://dp-lab-data/collaborators/VanD...autoquay.io/hisplan
SD-1680_Patient_I_nucseq_2_GESD-1680_Patient_I_nucseq_2_GE3813_SD-1680_Patient_I_nucseq_2_GE_I...GRCh38[s3://dp-lab-data/collaborators/VanD...autoquay.io/hisplan{'I1': ['s3://dp-lab-data/collaborat...
\n", "
" ], "text/plain": [ - " CellRangerVdj.sampleName \\\n", - "SD-1680_Patient_D_nucseq_GE SD-1680_Patient_D_nucseq_GE \n", - "SD-1680_Patient_F_nucseq_GE SD-1680_Patient_F_nucseq_GE \n", - "SD-1680_Patient_I_nucseq_GE SD-1680_Patient_I_nucseq_GE \n", - "SD-1680_Patient_D_nucseq_2_GE SD-1680_Patient_D_nucseq_2_GE \n", - "SD-1680_Patient_F_nucseq_2_GE SD-1680_Patient_F_nucseq_2_GE \n", - "SD-1680_Patient_I_nucseq_2_GE SD-1680_Patient_I_nucseq_2_GE \n", + " AWS_storage id species \\\n", + "Sample \n", + "PM-1779_LC479A_5prime s3://dp-lab-data/collaborators/rudin... 4006 human \n", "\n", - " CellRangerVdj.fastqNames \\\n", - "SD-1680_Patient_D_nucseq_GE 3808_SD-1680_Patient_D_nucseq_GE_IGO... \n", - "SD-1680_Patient_F_nucseq_GE 3809_SD-1680_Patient_F_nucseq_GE_IGO... \n", - "SD-1680_Patient_I_nucseq_GE 3810_SD-1680_Patient_I_nucseq_GE_IGO... \n", - "SD-1680_Patient_D_nucseq_2_GE 3811_SD-1680_Patient_D_nucseq_2_GE_I... \n", - "SD-1680_Patient_F_nucseq_2_GE 3812_SD-1680_Patient_F_nucseq_2_GE_I... \n", - "SD-1680_Patient_I_nucseq_2_GE 3813_SD-1680_Patient_I_nucseq_2_GE_I... \n", + " sc_tech project_id reference \\\n", + "Sample \n", + "PM-1779_LC479A_5prime 10X_5prime Pre-_post-IO NSCLC GRCh38 \n", "\n", - " CellRangerVdj.referenceGenome \\\n", - "SD-1680_Patient_D_nucseq_GE GRCh38 \n", - "SD-1680_Patient_F_nucseq_GE GRCh38 \n", - "SD-1680_Patient_I_nucseq_GE GRCh38 \n", - "SD-1680_Patient_D_nucseq_2_GE GRCh38 \n", - "SD-1680_Patient_F_nucseq_2_GE GRCh38 \n", - "SD-1680_Patient_I_nucseq_2_GE GRCh38 \n", - "\n", - " CellRangerVdj.inputFastq \\\n", - "SD-1680_Patient_D_nucseq_GE [s3://dp-lab-data/collaborators/VanD... \n", - "SD-1680_Patient_F_nucseq_GE [s3://dp-lab-data/collaborators/VanD... \n", - "SD-1680_Patient_I_nucseq_GE [s3://dp-lab-data/collaborators/VanD... \n", - "SD-1680_Patient_D_nucseq_2_GE [s3://dp-lab-data/collaborators/VanD... \n", - "SD-1680_Patient_F_nucseq_2_GE [s3://dp-lab-data/collaborators/VanD... \n", - "SD-1680_Patient_I_nucseq_2_GE [s3://dp-lab-data/collaborators/VanD... \n", - "\n", - " CellRangerVdj.chain CellRangerVdj.dockerRegistry \n", - "SD-1680_Patient_D_nucseq_GE auto quay.io/hisplan \n", - "SD-1680_Patient_F_nucseq_GE auto quay.io/hisplan \n", - "SD-1680_Patient_I_nucseq_GE auto quay.io/hisplan \n", - "SD-1680_Patient_D_nucseq_2_GE auto quay.io/hisplan \n", - "SD-1680_Patient_F_nucseq_2_GE auto quay.io/hisplan \n", - "SD-1680_Patient_I_nucseq_2_GE auto quay.io/hisplan " + " FASTQs \n", + "Sample \n", + "PM-1779_LC479A_5prime {'I1': ['s3://dp-lab-data/collaborat... " ] }, - "execution_count": 29, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "inputs[f'{prefix}.sampleName'] = samples.index\n", - "inputs[f'{prefix}.inputFastq'] = samples[\"FASTQs\"].apply(lambda x: np.ravel(list(x.values())))\n", - "inputs[f'{prefix}.fastqNames'] = inputs[f\"{prefix}.inputFastq\"].apply(lambda x: get_fastqs_name(x))\n", - "inputs[f'{prefix}.referenceGenome'] = samples['Reference']\n", - "inputs[f'{prefix}.chain'] = 'auto'\n", - "inputs[f'{prefix}.dockerRegistry'] = common_docker_registry\n", - "\n", - "inputs" + "samples = update_ref(samples, prefix)\n", + "samples" ] }, { "cell_type": "code", "execution_count": null, - "id": "4f54b5e4-6ff1-4469-8c16-cc975d71766d", + "id": "d58e81b0-43b9-433f-a462-85e9d99ed00f", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", - "id": "829ad858-65ca-49f8-9b96-2b428e2a25f9", + "id": "9d999472-93a6-4a4c-ab82-48fd5ade8894", "metadata": {}, "source": [ - "## Labels" + "# Generate inputs" ] }, { "cell_type": "code", - "execution_count": 30, - "id": "ed61284c-ec00-4b2e-9522-f20ee0a8682c", + "execution_count": 13, + "id": "ddcab3aa-023e-41bb-8de5-0d9c7454d7c1", "metadata": {}, "outputs": [ { @@ -1607,116 +576,115 @@ " \n", " \n", " \n", - " pipelineType\n", - " project\n", - " sample\n", - " owner\n", - " destination\n", - " transfer\n", - " comment\n", - " \n", - " \n", - " \n", - " \n", - " SD-1680_Patient_D_nucseq_GE\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " \n", - " \n", - " SD-1680_Patient_F_nucseq_GE\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " \n", - " \n", - " SD-1680_Patient_I_nucseq_GE\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " \n", - " \n", - " SD-1680_Patient_D_nucseq_2_GE\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", + " CellRangerVdj.sampleName\n", + " CellRangerVdj.fastqNames\n", + " CellRangerVdj.referenceGenome\n", + " CellRangerVdj.inputFastq\n", + " CellRangerVdj.chain\n", + " CellRangerVdj.dockerRegistry\n", " \n", " \n", - " SD-1680_Patient_F_nucseq_2_GE\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", + " Sample\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", + " \n", + " \n", " \n", - " SD-1680_Patient_I_nucseq_2_GE\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", + " PM-1779_LC479A_5prime\n", + " PM-1779_LC479A_5prime\n", + " 4006_PM-1779_LC479A_5prime_TCR_VDJ_I...\n", + " GRCh38\n", + " [s3://dp-lab-data/collaborators/rudi...\n", + " auto\n", + " quay.io/hisplan\n", " \n", " \n", "\n", "" ], "text/plain": [ - " pipelineType project sample owner destination \\\n", - "SD-1680_Patient_D_nucseq_GE NaN NaN NaN NaN NaN \n", - "SD-1680_Patient_F_nucseq_GE NaN NaN NaN NaN NaN \n", - "SD-1680_Patient_I_nucseq_GE NaN NaN NaN NaN NaN \n", - "SD-1680_Patient_D_nucseq_2_GE NaN NaN NaN NaN NaN \n", - "SD-1680_Patient_F_nucseq_2_GE NaN NaN NaN NaN NaN \n", - "SD-1680_Patient_I_nucseq_2_GE NaN NaN NaN NaN NaN \n", + " CellRangerVdj.sampleName \\\n", + "Sample \n", + "PM-1779_LC479A_5prime PM-1779_LC479A_5prime \n", + "\n", + " CellRangerVdj.fastqNames \\\n", + "Sample \n", + "PM-1779_LC479A_5prime 4006_PM-1779_LC479A_5prime_TCR_VDJ_I... \n", + "\n", + " CellRangerVdj.referenceGenome \\\n", + "Sample \n", + "PM-1779_LC479A_5prime GRCh38 \n", + "\n", + " CellRangerVdj.inputFastq \\\n", + "Sample \n", + "PM-1779_LC479A_5prime [s3://dp-lab-data/collaborators/rudi... \n", "\n", - " transfer comment \n", - "SD-1680_Patient_D_nucseq_GE NaN NaN \n", - "SD-1680_Patient_F_nucseq_GE NaN NaN \n", - "SD-1680_Patient_I_nucseq_GE NaN NaN \n", - "SD-1680_Patient_D_nucseq_2_GE NaN NaN \n", - "SD-1680_Patient_F_nucseq_2_GE NaN NaN \n", - "SD-1680_Patient_I_nucseq_2_GE NaN NaN " + " CellRangerVdj.chain CellRangerVdj.dockerRegistry \n", + "Sample \n", + "PM-1779_LC479A_5prime auto quay.io/hisplan " ] }, - "execution_count": 30, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "with open(f\"{config_dir}/template.labels.json\") as f:\n", - " std_labels_fields = list(json.load(f).keys())\n", + "# Standard inputs, modify fields as need be\n", + "\n", + "# Load minimum inputs and labels fields from templates\n", + "with open(f\"{config_dir}/template.inputs.json\") as f:\n", + " std_inputs_fields = list(json.load(f).keys())\n", " \n", "# Annotate all samples with workflow inputs and labels\n", - "labels = pd.DataFrame(index=samples.index, columns=std_labels_fields,)\n", - "labels" + "inputs = pd.DataFrame(index=samples.index, columns=std_inputs_fields,)\n", + "inputs[f'{prefix}.sampleName'] = samples.index\n", + "inputs[f'{prefix}.inputFastq'] = samples[\"FASTQs\"].apply(lambda x: np.ravel(list(x.values())))\n", + "inputs[f'{prefix}.fastqNames'] = inputs[f\"{prefix}.inputFastq\"].apply(lambda x: get_fastqs_name(x))\n", + "inputs[f'{prefix}.referenceGenome'] = samples['reference']\n", + "inputs[f'{prefix}.chain'] = 'auto'\n", + "inputs[f'{prefix}.dockerRegistry'] = common_docker_registry\n", + "\n", + "inputs" ] }, { "cell_type": "code", - "execution_count": 31, - "id": "b9c33977-ad27-4c05-864f-08652d001f5f", + "execution_count": 14, + "id": "c30e1518-da11-4069-a501-32f9e04ef389", + "metadata": {}, + "outputs": [], + "source": [ + "# Modification for specific samples\n", + "\n", + "inputs[f'{prefix}.chain'] = 'TR'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5edf8be1-51c3-4163-a776-d673c6264fc3", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "133f5b48-cef9-480b-b824-7d96b253c909", + "metadata": {}, + "source": [ + "# Generate labels" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "59710506-35a6-487b-8e94-ca86513e29c1", "metadata": {}, "outputs": [ { @@ -1748,65 +716,25 @@ " transfer\n", " comment\n", " \n", - " \n", - " \n", - " \n", - " SD-1680_Patient_D_nucseq_GE\n", - " CellRangerVdj\n", - " AML T cell pilot\n", - " SD-1680_Patient_D_nucseq_GE\n", - " sohailn\n", - " s3://dp-lab-data/collaborators/VanDe...\n", - " -\n", - " sohailn\n", - " \n", - " \n", - " SD-1680_Patient_F_nucseq_GE\n", - " CellRangerVdj\n", - " AML T cell pilot\n", - " SD-1680_Patient_F_nucseq_GE\n", - " sohailn\n", - " s3://dp-lab-data/collaborators/VanDe...\n", - " -\n", - " sohailn\n", - " \n", - " \n", - " SD-1680_Patient_I_nucseq_GE\n", - " CellRangerVdj\n", - " AML T cell pilot\n", - " SD-1680_Patient_I_nucseq_GE\n", - " sohailn\n", - " s3://dp-lab-data/collaborators/VanDe...\n", - " -\n", - " sohailn\n", - " \n", - " \n", - " SD-1680_Patient_D_nucseq_2_GE\n", - " CellRangerVdj\n", - " AML T cell pilot\n", - " SD-1680_Patient_D_nucseq_2_GE\n", - " sohailn\n", - " s3://dp-lab-data/collaborators/VanDe...\n", - " -\n", - " sohailn\n", - " \n", " \n", - " SD-1680_Patient_F_nucseq_2_GE\n", - " CellRangerVdj\n", - " AML T cell pilot\n", - " SD-1680_Patient_F_nucseq_2_GE\n", - " sohailn\n", - " s3://dp-lab-data/collaborators/VanDe...\n", - " -\n", - " sohailn\n", + " Sample\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", + " \n", + " \n", " \n", - " SD-1680_Patient_I_nucseq_2_GE\n", + " PM-1779_LC479A_5prime\n", " CellRangerVdj\n", - " AML T cell pilot\n", - " SD-1680_Patient_I_nucseq_2_GE\n", + " Pre-_post-IO NSCLC\n", + " PM-1779_LC479A_5prime\n", " sohailn\n", - " s3://dp-lab-data/collaborators/VanDe...\n", + " s3://dp-lab-data/collaborators/rudin...\n", " -\n", " sohailn\n", " \n", @@ -1815,50 +743,42 @@ "" ], "text/plain": [ - " pipelineType project \\\n", - "SD-1680_Patient_D_nucseq_GE CellRangerVdj AML T cell pilot \n", - "SD-1680_Patient_F_nucseq_GE CellRangerVdj AML T cell pilot \n", - "SD-1680_Patient_I_nucseq_GE CellRangerVdj AML T cell pilot \n", - "SD-1680_Patient_D_nucseq_2_GE CellRangerVdj AML T cell pilot \n", - "SD-1680_Patient_F_nucseq_2_GE CellRangerVdj AML T cell pilot \n", - "SD-1680_Patient_I_nucseq_2_GE CellRangerVdj AML T cell pilot \n", + " pipelineType project \\\n", + "Sample \n", + "PM-1779_LC479A_5prime CellRangerVdj Pre-_post-IO NSCLC \n", "\n", - " sample owner \\\n", - "SD-1680_Patient_D_nucseq_GE SD-1680_Patient_D_nucseq_GE sohailn \n", - "SD-1680_Patient_F_nucseq_GE SD-1680_Patient_F_nucseq_GE sohailn \n", - "SD-1680_Patient_I_nucseq_GE SD-1680_Patient_I_nucseq_GE sohailn \n", - "SD-1680_Patient_D_nucseq_2_GE SD-1680_Patient_D_nucseq_2_GE sohailn \n", - "SD-1680_Patient_F_nucseq_2_GE SD-1680_Patient_F_nucseq_2_GE sohailn \n", - "SD-1680_Patient_I_nucseq_2_GE SD-1680_Patient_I_nucseq_2_GE sohailn \n", + " sample owner \\\n", + "Sample \n", + "PM-1779_LC479A_5prime PM-1779_LC479A_5prime sohailn \n", "\n", - " destination \\\n", - "SD-1680_Patient_D_nucseq_GE s3://dp-lab-data/collaborators/VanDe... \n", - "SD-1680_Patient_F_nucseq_GE s3://dp-lab-data/collaborators/VanDe... \n", - "SD-1680_Patient_I_nucseq_GE s3://dp-lab-data/collaborators/VanDe... \n", - "SD-1680_Patient_D_nucseq_2_GE s3://dp-lab-data/collaborators/VanDe... \n", - "SD-1680_Patient_F_nucseq_2_GE s3://dp-lab-data/collaborators/VanDe... \n", - "SD-1680_Patient_I_nucseq_2_GE s3://dp-lab-data/collaborators/VanDe... \n", + " destination transfer \\\n", + "Sample \n", + "PM-1779_LC479A_5prime s3://dp-lab-data/collaborators/rudin... - \n", "\n", - " transfer comment \n", - "SD-1680_Patient_D_nucseq_GE - sohailn \n", - "SD-1680_Patient_F_nucseq_GE - sohailn \n", - "SD-1680_Patient_I_nucseq_GE - sohailn \n", - "SD-1680_Patient_D_nucseq_2_GE - sohailn \n", - "SD-1680_Patient_F_nucseq_2_GE - sohailn \n", - "SD-1680_Patient_I_nucseq_2_GE - sohailn " + " comment \n", + "Sample \n", + "PM-1779_LC479A_5prime sohailn " ] }, - "execution_count": 31, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ + "# Standard labels, modify fields as need be\n", + "\n", + "with open(f\"{config_dir}/template.labels.json\") as f:\n", + " std_labels_fields = list(json.load(f).keys())\n", + " \n", + "# Annotate all samples with workflow inputs and labels\n", + "labels = pd.DataFrame(index=samples.index, columns=std_labels_fields,)\n", + "\n", "labels[\"pipelineType\"] = pipeline_type\n", - "labels[\"project\"] = samples[\"Sample_ID\"].apply(lambda x: get_project_id(x, creds))\n", + "labels[\"project\"] = samples['project_id']\n", "labels[\"sample\"] = labels.index\n", "labels[\"owner\"] = creds[\"user\"]\n", - "labels[\"destination\"] = samples['S3_Path'] + \"/\" + output_dirname\n", + "labels[\"destination\"] = samples['AWS_storage'] + \"/\" + output_dirname\n", "labels[\"transfer\"] = \"-\"\n", "labels[\"comment\"] = creds[\"user\"]\n", "\n", @@ -1868,31 +788,31 @@ { "cell_type": "code", "execution_count": null, - "id": "88ad7ccd-f144-4696-bc2b-e7945059103f", + "id": "1ac67f52-2cf2-42f6-9d19-11e164021e40", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", - "id": "524a26f6-fe12-4065-8c79-b665c99336a3", + "id": "51ea6068-d51b-494f-819b-4f9fda7a0ac6", "metadata": {}, "source": [ - "## Execution" + "# Run samples" ] }, { "cell_type": "markdown", - "id": "403c3948-bcb5-45a1-b6f5-dfa8aefb4e86", + "id": "3417414b-07c1-4bd3-886d-4751c6ec5693", "metadata": {}, "source": [ - "Make sure to check that your FASTQ files aren't archived, otherwise your job will fail" + "Look over the samples before submitting one last time" ] }, { "cell_type": "code", - "execution_count": 32, - "id": "78242f27-c831-4d7f-b4e3-14dfdb470543", + "execution_count": 16, + "id": "6a77a19c-37bf-4f6d-93ff-5b5d4f33fbc7", "metadata": {}, "outputs": [ { @@ -1923,60 +843,24 @@ " CellRangerVdj.chain\n", " CellRangerVdj.dockerRegistry\n", " \n", - " \n", - " \n", - " \n", - " SD-1680_Patient_D_nucseq_GE\n", - " SD-1680_Patient_D_nucseq_GE\n", - " 3808_SD-1680_Patient_D_nucseq_GE_IGO...\n", - " GRCh38\n", - " [s3://dp-lab-data/collaborators/VanD...\n", - " auto\n", - " quay.io/hisplan\n", - " \n", - " \n", - " SD-1680_Patient_F_nucseq_GE\n", - " SD-1680_Patient_F_nucseq_GE\n", - " 3809_SD-1680_Patient_F_nucseq_GE_IGO...\n", - " GRCh38\n", - " [s3://dp-lab-data/collaborators/VanD...\n", - " auto\n", - " quay.io/hisplan\n", - " \n", - " \n", - " SD-1680_Patient_I_nucseq_GE\n", - " SD-1680_Patient_I_nucseq_GE\n", - " 3810_SD-1680_Patient_I_nucseq_GE_IGO...\n", - " GRCh38\n", - " [s3://dp-lab-data/collaborators/VanD...\n", - " auto\n", - " quay.io/hisplan\n", - " \n", - " \n", - " SD-1680_Patient_D_nucseq_2_GE\n", - " SD-1680_Patient_D_nucseq_2_GE\n", - " 3811_SD-1680_Patient_D_nucseq_2_GE_I...\n", - " GRCh38\n", - " [s3://dp-lab-data/collaborators/VanD...\n", - " auto\n", - " quay.io/hisplan\n", - " \n", " \n", - " SD-1680_Patient_F_nucseq_2_GE\n", - " SD-1680_Patient_F_nucseq_2_GE\n", - " 3812_SD-1680_Patient_F_nucseq_2_GE_I...\n", - " GRCh38\n", - " [s3://dp-lab-data/collaborators/VanD...\n", - " auto\n", - " quay.io/hisplan\n", + " Sample\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", + " \n", + " \n", " \n", - " SD-1680_Patient_I_nucseq_2_GE\n", - " SD-1680_Patient_I_nucseq_2_GE\n", - " 3813_SD-1680_Patient_I_nucseq_2_GE_I...\n", + " PM-1779_LC479A_5prime\n", + " PM-1779_LC479A_5prime\n", + " 4006_PM-1779_LC479A_5prime_TCR_VDJ_I...\n", " GRCh38\n", - " [s3://dp-lab-data/collaborators/VanD...\n", - " auto\n", + " [s3://dp-lab-data/collaborators/rudi...\n", + " TR\n", " quay.io/hisplan\n", " \n", " \n", @@ -1984,48 +868,28 @@ "" ], "text/plain": [ - " CellRangerVdj.sampleName \\\n", - "SD-1680_Patient_D_nucseq_GE SD-1680_Patient_D_nucseq_GE \n", - "SD-1680_Patient_F_nucseq_GE SD-1680_Patient_F_nucseq_GE \n", - "SD-1680_Patient_I_nucseq_GE SD-1680_Patient_I_nucseq_GE \n", - "SD-1680_Patient_D_nucseq_2_GE SD-1680_Patient_D_nucseq_2_GE \n", - "SD-1680_Patient_F_nucseq_2_GE SD-1680_Patient_F_nucseq_2_GE \n", - "SD-1680_Patient_I_nucseq_2_GE SD-1680_Patient_I_nucseq_2_GE \n", + " CellRangerVdj.sampleName \\\n", + "Sample \n", + "PM-1779_LC479A_5prime PM-1779_LC479A_5prime \n", "\n", - " CellRangerVdj.fastqNames \\\n", - "SD-1680_Patient_D_nucseq_GE 3808_SD-1680_Patient_D_nucseq_GE_IGO... \n", - "SD-1680_Patient_F_nucseq_GE 3809_SD-1680_Patient_F_nucseq_GE_IGO... \n", - "SD-1680_Patient_I_nucseq_GE 3810_SD-1680_Patient_I_nucseq_GE_IGO... \n", - "SD-1680_Patient_D_nucseq_2_GE 3811_SD-1680_Patient_D_nucseq_2_GE_I... \n", - "SD-1680_Patient_F_nucseq_2_GE 3812_SD-1680_Patient_F_nucseq_2_GE_I... \n", - "SD-1680_Patient_I_nucseq_2_GE 3813_SD-1680_Patient_I_nucseq_2_GE_I... \n", + " CellRangerVdj.fastqNames \\\n", + "Sample \n", + "PM-1779_LC479A_5prime 4006_PM-1779_LC479A_5prime_TCR_VDJ_I... \n", "\n", - " CellRangerVdj.referenceGenome \\\n", - "SD-1680_Patient_D_nucseq_GE GRCh38 \n", - "SD-1680_Patient_F_nucseq_GE GRCh38 \n", - "SD-1680_Patient_I_nucseq_GE GRCh38 \n", - "SD-1680_Patient_D_nucseq_2_GE GRCh38 \n", - "SD-1680_Patient_F_nucseq_2_GE GRCh38 \n", - "SD-1680_Patient_I_nucseq_2_GE GRCh38 \n", + " CellRangerVdj.referenceGenome \\\n", + "Sample \n", + "PM-1779_LC479A_5prime GRCh38 \n", "\n", - " CellRangerVdj.inputFastq \\\n", - "SD-1680_Patient_D_nucseq_GE [s3://dp-lab-data/collaborators/VanD... \n", - "SD-1680_Patient_F_nucseq_GE [s3://dp-lab-data/collaborators/VanD... \n", - "SD-1680_Patient_I_nucseq_GE [s3://dp-lab-data/collaborators/VanD... \n", - "SD-1680_Patient_D_nucseq_2_GE [s3://dp-lab-data/collaborators/VanD... \n", - "SD-1680_Patient_F_nucseq_2_GE [s3://dp-lab-data/collaborators/VanD... \n", - "SD-1680_Patient_I_nucseq_2_GE [s3://dp-lab-data/collaborators/VanD... \n", + " CellRangerVdj.inputFastq \\\n", + "Sample \n", + "PM-1779_LC479A_5prime [s3://dp-lab-data/collaborators/rudi... \n", "\n", - " CellRangerVdj.chain CellRangerVdj.dockerRegistry \n", - "SD-1680_Patient_D_nucseq_GE auto quay.io/hisplan \n", - "SD-1680_Patient_F_nucseq_GE auto quay.io/hisplan \n", - "SD-1680_Patient_I_nucseq_GE auto quay.io/hisplan \n", - "SD-1680_Patient_D_nucseq_2_GE auto quay.io/hisplan \n", - "SD-1680_Patient_F_nucseq_2_GE auto quay.io/hisplan \n", - "SD-1680_Patient_I_nucseq_2_GE auto quay.io/hisplan " + " CellRangerVdj.chain CellRangerVdj.dockerRegistry \n", + "Sample \n", + "PM-1779_LC479A_5prime TR quay.io/hisplan " ] }, - "execution_count": 32, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -2036,8 +900,8 @@ }, { "cell_type": "code", - "execution_count": 33, - "id": "bfe55491-699a-4db9-aca3-bf6cf337086c", + "execution_count": 17, + "id": "58110f32-95b2-4446-8cee-843985fc273e", "metadata": {}, "outputs": [ { @@ -2069,65 +933,25 @@ " transfer\n", " comment\n", " \n", - " \n", - " \n", - " \n", - " SD-1680_Patient_D_nucseq_GE\n", - " CellRangerVdj\n", - " AML T cell pilot\n", - " SD-1680_Patient_D_nucseq_GE\n", - " sohailn\n", - " s3://dp-lab-data/collaborators/VanDe...\n", - " -\n", - " sohailn\n", - " \n", - " \n", - " SD-1680_Patient_F_nucseq_GE\n", - " CellRangerVdj\n", - " AML T cell pilot\n", - " SD-1680_Patient_F_nucseq_GE\n", - " sohailn\n", - " s3://dp-lab-data/collaborators/VanDe...\n", - " -\n", - " sohailn\n", - " \n", - " \n", - " SD-1680_Patient_I_nucseq_GE\n", - " CellRangerVdj\n", - " AML T cell pilot\n", - " SD-1680_Patient_I_nucseq_GE\n", - " sohailn\n", - " s3://dp-lab-data/collaborators/VanDe...\n", - " -\n", - " sohailn\n", - " \n", - " \n", - " SD-1680_Patient_D_nucseq_2_GE\n", - " CellRangerVdj\n", - " AML T cell pilot\n", - " SD-1680_Patient_D_nucseq_2_GE\n", - " sohailn\n", - " s3://dp-lab-data/collaborators/VanDe...\n", - " -\n", - " sohailn\n", - " \n", " \n", - " SD-1680_Patient_F_nucseq_2_GE\n", - " CellRangerVdj\n", - " AML T cell pilot\n", - " SD-1680_Patient_F_nucseq_2_GE\n", - " sohailn\n", - " s3://dp-lab-data/collaborators/VanDe...\n", - " -\n", - " sohailn\n", + " Sample\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", + " \n", + " \n", " \n", - " SD-1680_Patient_I_nucseq_2_GE\n", + " PM-1779_LC479A_5prime\n", " CellRangerVdj\n", - " AML T cell pilot\n", - " SD-1680_Patient_I_nucseq_2_GE\n", + " Pre-_post-IO NSCLC\n", + " PM-1779_LC479A_5prime\n", " sohailn\n", - " s3://dp-lab-data/collaborators/VanDe...\n", + " s3://dp-lab-data/collaborators/rudin...\n", " -\n", " sohailn\n", " \n", @@ -2136,40 +960,24 @@ "" ], "text/plain": [ - " pipelineType project \\\n", - "SD-1680_Patient_D_nucseq_GE CellRangerVdj AML T cell pilot \n", - "SD-1680_Patient_F_nucseq_GE CellRangerVdj AML T cell pilot \n", - "SD-1680_Patient_I_nucseq_GE CellRangerVdj AML T cell pilot \n", - "SD-1680_Patient_D_nucseq_2_GE CellRangerVdj AML T cell pilot \n", - "SD-1680_Patient_F_nucseq_2_GE CellRangerVdj AML T cell pilot \n", - "SD-1680_Patient_I_nucseq_2_GE CellRangerVdj AML T cell pilot \n", + " pipelineType project \\\n", + "Sample \n", + "PM-1779_LC479A_5prime CellRangerVdj Pre-_post-IO NSCLC \n", "\n", - " sample owner \\\n", - "SD-1680_Patient_D_nucseq_GE SD-1680_Patient_D_nucseq_GE sohailn \n", - "SD-1680_Patient_F_nucseq_GE SD-1680_Patient_F_nucseq_GE sohailn \n", - "SD-1680_Patient_I_nucseq_GE SD-1680_Patient_I_nucseq_GE sohailn \n", - "SD-1680_Patient_D_nucseq_2_GE SD-1680_Patient_D_nucseq_2_GE sohailn \n", - "SD-1680_Patient_F_nucseq_2_GE SD-1680_Patient_F_nucseq_2_GE sohailn \n", - "SD-1680_Patient_I_nucseq_2_GE SD-1680_Patient_I_nucseq_2_GE sohailn \n", + " sample owner \\\n", + "Sample \n", + "PM-1779_LC479A_5prime PM-1779_LC479A_5prime sohailn \n", "\n", - " destination \\\n", - "SD-1680_Patient_D_nucseq_GE s3://dp-lab-data/collaborators/VanDe... \n", - "SD-1680_Patient_F_nucseq_GE s3://dp-lab-data/collaborators/VanDe... \n", - "SD-1680_Patient_I_nucseq_GE s3://dp-lab-data/collaborators/VanDe... \n", - "SD-1680_Patient_D_nucseq_2_GE s3://dp-lab-data/collaborators/VanDe... \n", - "SD-1680_Patient_F_nucseq_2_GE s3://dp-lab-data/collaborators/VanDe... \n", - "SD-1680_Patient_I_nucseq_2_GE s3://dp-lab-data/collaborators/VanDe... \n", + " destination transfer \\\n", + "Sample \n", + "PM-1779_LC479A_5prime s3://dp-lab-data/collaborators/rudin... - \n", "\n", - " transfer comment \n", - "SD-1680_Patient_D_nucseq_GE - sohailn \n", - "SD-1680_Patient_F_nucseq_GE - sohailn \n", - "SD-1680_Patient_I_nucseq_GE - sohailn \n", - "SD-1680_Patient_D_nucseq_2_GE - sohailn \n", - "SD-1680_Patient_F_nucseq_2_GE - sohailn \n", - "SD-1680_Patient_I_nucseq_2_GE - sohailn " + " comment \n", + "Sample \n", + "PM-1779_LC479A_5prime sohailn " ] }, - "execution_count": 33, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -2180,19 +988,27 @@ }, { "cell_type": "code", - "execution_count": 35, - "id": "a9a9d00a-9373-4cb9-bb37-102d148998cd", + "execution_count": null, + "id": "5a0c8d8a-a6b8-4f03-b48d-9482d310d5ad", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "a58189c6-1fd1-4e6a-ae7b-7835530867f7", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "dd58a333e16b4889acceae3156685a1d", + "model_id": "2450bf742d3548c3a60eece5e6dfb53b", "version_major": 2, "version_minor": 0 }, "text/plain": [ - " 0%| | 0/6 [00:00 Date: Mon, 12 Sep 2022 11:39:34 -0400 Subject: [PATCH 11/16] Initial FastQC notebook --- notebooks/Run_FastQC.ipynb | 1347 ++++++++++++++++++++++++++++++++++++ 1 file changed, 1347 insertions(+) create mode 100644 notebooks/Run_FastQC.ipynb diff --git a/notebooks/Run_FastQC.ipynb b/notebooks/Run_FastQC.ipynb new file mode 100644 index 0000000..373c5bc --- /dev/null +++ b/notebooks/Run_FastQC.ipynb @@ -0,0 +1,1347 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "fbbdcd09-b369-493d-9402-ca18a45eee5d", + "metadata": {}, + "outputs": [], + "source": [ + "import re, subprocess, boto3, json, shlex, mysql, os, urllib, logging\n", + "import pandas as pd\n", + "import numpy as np\n", + "from s3path import S3Path\n", + "from pathlib import Path\n", + "from tqdm.notebook import tqdm\n", + "from packaging import version\n", + "\n", + "import glob\n", + "import os\n", + "\n", + "pd.set_option(\"display.max_colwidth\", 40)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "ca66d7bc-a113-454a-b4d4-7e2a56203dc4", + "metadata": {}, + "outputs": [], + "source": [ + "from utils.utils import *" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "92d253e4-bb0c-410f-9608-0bb729af6649", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "2de5f2a6-dba8-486d-bb07-92dbeff10150", + "metadata": { + "tags": [] + }, + "source": [ + "# AWS setup" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "1023bdd2-6db6-4274-bd1b-13f092fd11d9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "env: AWS_ACCESS_KEY_ID=ASIAYPY66CWMGLBAIGO6\n", + "env: AWS_SECRET_ACCESS_KEY=i6fm87l+UNBLyxlwU4AXD2HEGTXYutOlj4lfB9bk\n", + "env: AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEK///////////wEaCXVzLWVhc3QtMSJHMEUCIQCAs8AyD3w8/luR3fB4wyOA0fC5vzw2nyzspQ7/+Pgf/AIgBhFvsspOJmLbACqO8/42UuRe7nu6vdi7DaJ5k/UFDxsq7wEISBADGgw1ODM2NDM1Njc1MTIiDP2ESPVfC1OK7pmq+SrMAQRwXr+RvcapTJP/skUqP4og+mqro7RYgBPQ8OQKWReZ0JLWYk2+/npsDqlMM5j7Zre4aQPkttvkyacSoDBo4B/SufvOD5eotZyXsKR5zEjrgn9HTQGxlylIakbUK/7pJSe4pJxAya79ZEC/1PrAUYnZR2ZGGgYgRF0oIwzbLblSoAmBYeNbbkbluJC3qbicERnH/BHlO4oHXPMesuS+QncRWn8rlRxGRySgTaW+gcH2tBwDBhB+RURyCtXC3AyJmQ7tp4MerTHhTToIaTCIqe2YBjqYAbdygCv6Qz2i+YqCafTb2npOoT7PPA6ooeWnXXzZXPc8POEASCBAq6bOIWvGWcKxwVwgode8mb8/R9oBnXQh0wdqm+ufpGuUAaVE8Y8rgNGXiKnCq/QywzTtjpgOTvJkYw8WPUWE6J8KhN10WqJtEdvif9E15Zqj7H69BL+Zy2wayYbu35OTPBuK3q4QlAVNk5fS+Uvkwxyz\n", + "2021-10-07 15:31:32 agc-583643567512-us-east-1\n", + "2021-10-07 15:28:07 cdktoolkit-stagingbucket-d49u1xfb0sc4\n", + "2019-10-09 13:04:06 cf-templates-umiwbnq3566w-us-east-1\n", + "2019-10-10 12:46:54 dp-daily-reports\n", + "2017-09-26 10:15:15 dp-lab-data\n", + "2019-05-23 12:34:58 dp-lab-data-public\n", + "2018-03-01 13:29:07 dp-lab-glacier\n", + "2020-11-06 23:02:27 dp-lab-gwf-core\n", + "2021-07-15 18:14:01 dp-lab-gwf-core2\n", + "2017-09-26 10:17:18 dp-lab-home\n", + "2019-08-14 16:42:43 dp-lab-test\n", + "2019-04-25 12:35:35 elasticbeanstalk-us-east-1-583643567512\n", + "2019-12-13 15:53:57 scri-computational\n", + "2017-09-26 10:23:50 seqc-public\n" + ] + } + ], + "source": [ + "# Load aws\n", + "\n", + "%env AWS_ACCESS_KEY_ID=ASIAYPY66CWMGLBAIGO6\n", + "%env AWS_SECRET_ACCESS_KEY=i6fm87l+UNBLyxlwU4AXD2HEGTXYutOlj4lfB9bk\n", + "%env AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEK///////////wEaCXVzLWVhc3QtMSJHMEUCIQCAs8AyD3w8/luR3fB4wyOA0fC5vzw2nyzspQ7/+Pgf/AIgBhFvsspOJmLbACqO8/42UuRe7nu6vdi7DaJ5k/UFDxsq7wEISBADGgw1ODM2NDM1Njc1MTIiDP2ESPVfC1OK7pmq+SrMAQRwXr+RvcapTJP/skUqP4og+mqro7RYgBPQ8OQKWReZ0JLWYk2+/npsDqlMM5j7Zre4aQPkttvkyacSoDBo4B/SufvOD5eotZyXsKR5zEjrgn9HTQGxlylIakbUK/7pJSe4pJxAya79ZEC/1PrAUYnZR2ZGGgYgRF0oIwzbLblSoAmBYeNbbkbluJC3qbicERnH/BHlO4oHXPMesuS+QncRWn8rlRxGRySgTaW+gcH2tBwDBhB+RURyCtXC3AyJmQ7tp4MerTHhTToIaTCIqe2YBjqYAbdygCv6Qz2i+YqCafTb2npOoT7PPA6ooeWnXXzZXPc8POEASCBAq6bOIWvGWcKxwVwgode8mb8/R9oBnXQh0wdqm+ufpGuUAaVE8Y8rgNGXiKnCq/QywzTtjpgOTvJkYw8WPUWE6J8KhN10WqJtEdvif9E15Zqj7H69BL+Zy2wayYbu35OTPBuK3q4QlAVNk5fS+Uvkwxyz\n", + "!aws s3 ls" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ec0b1510-6658-48b8-a9ec-76e52d414357", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "f3151feb-24bb-4ef2-89db-c6e2ef1ea6f1", + "metadata": { + "tags": [] + }, + "source": [ + "# Setup" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "344f296d-dcda-4c92-9a18-57d587e6827e", + "metadata": {}, + "outputs": [], + "source": [ + "# Which pipeline are you running\n", + "\n", + "prefix = \"FastQC\" # Workflow to run; also .wdl filename prefix\n", + "output_dirname = \"fastqc\"\n", + "\n", + "workflow_dir = glob.glob(f\"{Path.home()}/scing/bin/fastqc-*\")[0]\n", + "path_to_exec = f\"{workflow_dir}/submit.sh\" # CHANGE THIS FOR SHARP\n", + "\n", + "# Locations of workflow-related directories and files\n", + "path_to_cromwell_secrets = f\"{Path.home()}/.cromwell/cromwell-secrets.json\"\n", + "db_credentials_path = f\"{Path.home()}/.config.json\"" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "9db6a119-0ad5-4965-b988-9c85de2591b6", + "metadata": {}, + "outputs": [], + "source": [ + "# Location of docker files\n", + "common_docker_registry = \"quay.io/hisplan\"\n", + "pipeline_type = prefix # field in *.labels.json\n", + "comment = \"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "66f7b9a1-9d9d-4afa-9dd9-91ac30b6cefb", + "metadata": {}, + "outputs": [], + "source": [ + "# Workflow file paths\n", + "config_dir = f\"{workflow_dir}/configs\"\n", + "path_to_options = f\"{workflow_dir}/{prefix}.options.aws.json\"" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "a067d6c1-49da-4901-ba59-bd21c5a69871", + "metadata": {}, + "outputs": [], + "source": [ + "# Set credentials based on SCRIdb CLI config file\n", + "with open(db_credentials_path) as f:\n", + " creds = json.load(f)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f5778d94-6cb3-474c-b4ad-e051ccd66602", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "343fb1a2-db6a-4ada-a12f-a62493d55834", + "metadata": {}, + "source": [ + "# Sample information" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "3bad3986-1d7e-4194-928b-51b4e2debe35", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
AWS_storageidspeciessc_techproject_idreference
Sample
ARN-1379_CP-18-21_multiomes3://dp-lab-data/collaborators/aboir...3358humanmultiomeHuman multiomeGRCh38
ARN-1379_CP-18-24_multiomes3://dp-lab-data/collaborators/aboir...3359humanmultiomeHuman multiomeGRCh38
ARN-1379_CP-18-21_multiome_ATACs3://dp-lab-data/collaborators/aboir...3360humanmultiomeHuman multiomeGRCh38
ARN-1379_CP-18-24_multiome_ATACs3://dp-lab-data/collaborators/aboir...3361humanmultiomeHuman multiomeGRCh38
ARN-1449_RA19-09_multiomes3://dp-lab-data/collaborators/aboir...3469humanmultiomeHuman multiomeGRCh38
ARN-1449_RA18-16_multiomes3://dp-lab-data/collaborators/aboir...3470humanmultiomeHuman multiomeGRCh38
ARN-1449_RA19-09_multiome_ATACs3://dp-lab-data/collaborators/aboir...3471humanmultiomeHuman multiomeGRCh38
ARN-1449_RA18-16_multiome_ATACs3://dp-lab-data/collaborators/aboir...3472humanmultiomeHuman multiomeGRCh38
\n", + "
" + ], + "text/plain": [ + " AWS_storage \\\n", + "Sample \n", + "ARN-1379_CP-18-21_multiome s3://dp-lab-data/collaborators/aboir... \n", + "ARN-1379_CP-18-24_multiome s3://dp-lab-data/collaborators/aboir... \n", + "ARN-1379_CP-18-21_multiome_ATAC s3://dp-lab-data/collaborators/aboir... \n", + "ARN-1379_CP-18-24_multiome_ATAC s3://dp-lab-data/collaborators/aboir... \n", + "ARN-1449_RA19-09_multiome s3://dp-lab-data/collaborators/aboir... \n", + "ARN-1449_RA18-16_multiome s3://dp-lab-data/collaborators/aboir... \n", + "ARN-1449_RA19-09_multiome_ATAC s3://dp-lab-data/collaborators/aboir... \n", + "ARN-1449_RA18-16_multiome_ATAC s3://dp-lab-data/collaborators/aboir... \n", + "\n", + " id species sc_tech project_id \\\n", + "Sample \n", + "ARN-1379_CP-18-21_multiome 3358 human multiome Human multiome \n", + "ARN-1379_CP-18-24_multiome 3359 human multiome Human multiome \n", + "ARN-1379_CP-18-21_multiome_ATAC 3360 human multiome Human multiome \n", + "ARN-1379_CP-18-24_multiome_ATAC 3361 human multiome Human multiome \n", + "ARN-1449_RA19-09_multiome 3469 human multiome Human multiome \n", + "ARN-1449_RA18-16_multiome 3470 human multiome Human multiome \n", + "ARN-1449_RA19-09_multiome_ATAC 3471 human multiome Human multiome \n", + "ARN-1449_RA18-16_multiome_ATAC 3472 human multiome Human multiome \n", + "\n", + " reference \n", + "Sample \n", + "ARN-1379_CP-18-21_multiome GRCh38 \n", + "ARN-1379_CP-18-24_multiome GRCh38 \n", + "ARN-1379_CP-18-21_multiome_ATAC GRCh38 \n", + "ARN-1379_CP-18-24_multiome_ATAC GRCh38 \n", + "ARN-1449_RA19-09_multiome GRCh38 \n", + "ARN-1449_RA18-16_multiome GRCh38 \n", + "ARN-1449_RA19-09_multiome_ATAC GRCh38 \n", + "ARN-1449_RA18-16_multiome_ATAC GRCh38 " + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# You can supply a list of IDs or request IDs\n", + "\n", + "request_ids = ['ARN-1449', 'ARN-1379']\n", + "samples = sample_scridb_info(request_ids, 'request_id', creds)\n", + "\n", + "# sample_ids = [4006]\n", + "# samples = sample_scridb_info(sample_ids, 'id', creds)\n", + "\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6ea67344-a367-4906-9fa4-041c7f0b4d9c", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "e85154ba-47ad-4f3a-b2c8-9c81f2d33e23", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
AWS_storageidspeciessc_techproject_idreferenceFASTQs
Sample
ARN-1379_CP-18-21_multiomes3://dp-lab-data/collaborators/aboir...3358humanmultiomeHuman multiomeGRCh38[s3://dp-lab-data/collaborators/aboi...
ARN-1379_CP-18-24_multiomes3://dp-lab-data/collaborators/aboir...3359humanmultiomeHuman multiomeGRCh38[s3://dp-lab-data/collaborators/aboi...
ARN-1379_CP-18-21_multiome_ATACs3://dp-lab-data/collaborators/aboir...3360humanmultiomeHuman multiomeGRCh38[s3://dp-lab-data/collaborators/aboi...
ARN-1379_CP-18-24_multiome_ATACs3://dp-lab-data/collaborators/aboir...3361humanmultiomeHuman multiomeGRCh38[s3://dp-lab-data/collaborators/aboi...
ARN-1449_RA19-09_multiomes3://dp-lab-data/collaborators/aboir...3469humanmultiomeHuman multiomeGRCh38[s3://dp-lab-data/collaborators/aboi...
ARN-1449_RA18-16_multiomes3://dp-lab-data/collaborators/aboir...3470humanmultiomeHuman multiomeGRCh38[s3://dp-lab-data/collaborators/aboi...
ARN-1449_RA19-09_multiome_ATACs3://dp-lab-data/collaborators/aboir...3471humanmultiomeHuman multiomeGRCh38[s3://dp-lab-data/collaborators/aboi...
ARN-1449_RA18-16_multiome_ATACs3://dp-lab-data/collaborators/aboir...3472humanmultiomeHuman multiomeGRCh38[s3://dp-lab-data/collaborators/aboi...
\n", + "
" + ], + "text/plain": [ + " AWS_storage \\\n", + "Sample \n", + "ARN-1379_CP-18-21_multiome s3://dp-lab-data/collaborators/aboir... \n", + "ARN-1379_CP-18-24_multiome s3://dp-lab-data/collaborators/aboir... \n", + "ARN-1379_CP-18-21_multiome_ATAC s3://dp-lab-data/collaborators/aboir... \n", + "ARN-1379_CP-18-24_multiome_ATAC s3://dp-lab-data/collaborators/aboir... \n", + "ARN-1449_RA19-09_multiome s3://dp-lab-data/collaborators/aboir... \n", + "ARN-1449_RA18-16_multiome s3://dp-lab-data/collaborators/aboir... \n", + "ARN-1449_RA19-09_multiome_ATAC s3://dp-lab-data/collaborators/aboir... \n", + "ARN-1449_RA18-16_multiome_ATAC s3://dp-lab-data/collaborators/aboir... \n", + "\n", + " id species sc_tech project_id \\\n", + "Sample \n", + "ARN-1379_CP-18-21_multiome 3358 human multiome Human multiome \n", + "ARN-1379_CP-18-24_multiome 3359 human multiome Human multiome \n", + "ARN-1379_CP-18-21_multiome_ATAC 3360 human multiome Human multiome \n", + "ARN-1379_CP-18-24_multiome_ATAC 3361 human multiome Human multiome \n", + "ARN-1449_RA19-09_multiome 3469 human multiome Human multiome \n", + "ARN-1449_RA18-16_multiome 3470 human multiome Human multiome \n", + "ARN-1449_RA19-09_multiome_ATAC 3471 human multiome Human multiome \n", + "ARN-1449_RA18-16_multiome_ATAC 3472 human multiome Human multiome \n", + "\n", + " reference \\\n", + "Sample \n", + "ARN-1379_CP-18-21_multiome GRCh38 \n", + "ARN-1379_CP-18-24_multiome GRCh38 \n", + "ARN-1379_CP-18-21_multiome_ATAC GRCh38 \n", + "ARN-1379_CP-18-24_multiome_ATAC GRCh38 \n", + "ARN-1449_RA19-09_multiome GRCh38 \n", + "ARN-1449_RA18-16_multiome GRCh38 \n", + "ARN-1449_RA19-09_multiome_ATAC GRCh38 \n", + "ARN-1449_RA18-16_multiome_ATAC GRCh38 \n", + "\n", + " FASTQs \n", + "Sample \n", + "ARN-1379_CP-18-21_multiome [s3://dp-lab-data/collaborators/aboi... \n", + "ARN-1379_CP-18-24_multiome [s3://dp-lab-data/collaborators/aboi... \n", + "ARN-1379_CP-18-21_multiome_ATAC [s3://dp-lab-data/collaborators/aboi... \n", + "ARN-1379_CP-18-24_multiome_ATAC [s3://dp-lab-data/collaborators/aboi... \n", + "ARN-1449_RA19-09_multiome [s3://dp-lab-data/collaborators/aboi... \n", + "ARN-1449_RA18-16_multiome [s3://dp-lab-data/collaborators/aboi... \n", + "ARN-1449_RA19-09_multiome_ATAC [s3://dp-lab-data/collaborators/aboi... \n", + "ARN-1449_RA18-16_multiome_ATAC [s3://dp-lab-data/collaborators/aboi... " + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples[\"FASTQs\"] = samples[\"AWS_storage\"].apply(lambda x: get_all_fastqs(x, \"FASTQ\"))\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d58e81b0-43b9-433f-a462-85e9d99ed00f", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "9d999472-93a6-4a4c-ab82-48fd5ade8894", + "metadata": {}, + "source": [ + "# Generate inputs" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "ddcab3aa-023e-41bb-8de5-0d9c7454d7c1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
FastQC.fastqFilesFastQC.dockerRegistry
Sample
ARN-1379_CP-18-21_multiome[s3://dp-lab-data/collaborators/aboi...quay.io/hisplan
ARN-1379_CP-18-24_multiome[s3://dp-lab-data/collaborators/aboi...quay.io/hisplan
ARN-1379_CP-18-21_multiome_ATAC[s3://dp-lab-data/collaborators/aboi...quay.io/hisplan
ARN-1379_CP-18-24_multiome_ATAC[s3://dp-lab-data/collaborators/aboi...quay.io/hisplan
ARN-1449_RA19-09_multiome[s3://dp-lab-data/collaborators/aboi...quay.io/hisplan
ARN-1449_RA18-16_multiome[s3://dp-lab-data/collaborators/aboi...quay.io/hisplan
ARN-1449_RA19-09_multiome_ATAC[s3://dp-lab-data/collaborators/aboi...quay.io/hisplan
ARN-1449_RA18-16_multiome_ATAC[s3://dp-lab-data/collaborators/aboi...quay.io/hisplan
\n", + "
" + ], + "text/plain": [ + " FastQC.fastqFiles \\\n", + "Sample \n", + "ARN-1379_CP-18-21_multiome [s3://dp-lab-data/collaborators/aboi... \n", + "ARN-1379_CP-18-24_multiome [s3://dp-lab-data/collaborators/aboi... \n", + "ARN-1379_CP-18-21_multiome_ATAC [s3://dp-lab-data/collaborators/aboi... \n", + "ARN-1379_CP-18-24_multiome_ATAC [s3://dp-lab-data/collaborators/aboi... \n", + "ARN-1449_RA19-09_multiome [s3://dp-lab-data/collaborators/aboi... \n", + "ARN-1449_RA18-16_multiome [s3://dp-lab-data/collaborators/aboi... \n", + "ARN-1449_RA19-09_multiome_ATAC [s3://dp-lab-data/collaborators/aboi... \n", + "ARN-1449_RA18-16_multiome_ATAC [s3://dp-lab-data/collaborators/aboi... \n", + "\n", + " FastQC.dockerRegistry \n", + "Sample \n", + "ARN-1379_CP-18-21_multiome quay.io/hisplan \n", + "ARN-1379_CP-18-24_multiome quay.io/hisplan \n", + "ARN-1379_CP-18-21_multiome_ATAC quay.io/hisplan \n", + "ARN-1379_CP-18-24_multiome_ATAC quay.io/hisplan \n", + "ARN-1449_RA19-09_multiome quay.io/hisplan \n", + "ARN-1449_RA18-16_multiome quay.io/hisplan \n", + "ARN-1449_RA19-09_multiome_ATAC quay.io/hisplan \n", + "ARN-1449_RA18-16_multiome_ATAC quay.io/hisplan " + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Standard inputs, modify fields as need be\n", + "\n", + "# Load minimum inputs and labels fields from templates\n", + "with open(f\"{config_dir}/template.inputs.json\") as f:\n", + " std_inputs_fields = list(json.load(f).keys())\n", + " \n", + "# Annotate all samples with workflow inputs and labels\n", + "inputs = pd.DataFrame(index=samples.index, columns=std_inputs_fields,)\n", + "inputs[f'{prefix}.fastqFiles'] = samples[\"FASTQs\"]\n", + "inputs[f'{prefix}.dockerRegistry'] = common_docker_registry\n", + "\n", + "inputs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5edf8be1-51c3-4163-a776-d673c6264fc3", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "133f5b48-cef9-480b-b824-7d96b253c909", + "metadata": {}, + "source": [ + "# Generate labels" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "59710506-35a6-487b-8e94-ca86513e29c1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
pipelineTypeprojectsampleownerdestinationtransfercomment
Sample
ARN-1379_CP-18-21_multiomeFastQCHuman multiomeARN-1379_CP-18-21_multiomesohailns3://dp-lab-data/collaborators/aboir...-sohailn
ARN-1379_CP-18-24_multiomeFastQCHuman multiomeARN-1379_CP-18-24_multiomesohailns3://dp-lab-data/collaborators/aboir...-sohailn
ARN-1379_CP-18-21_multiome_ATACFastQCHuman multiomeARN-1379_CP-18-21_multiome_ATACsohailns3://dp-lab-data/collaborators/aboir...-sohailn
ARN-1379_CP-18-24_multiome_ATACFastQCHuman multiomeARN-1379_CP-18-24_multiome_ATACsohailns3://dp-lab-data/collaborators/aboir...-sohailn
ARN-1449_RA19-09_multiomeFastQCHuman multiomeARN-1449_RA19-09_multiomesohailns3://dp-lab-data/collaborators/aboir...-sohailn
ARN-1449_RA18-16_multiomeFastQCHuman multiomeARN-1449_RA18-16_multiomesohailns3://dp-lab-data/collaborators/aboir...-sohailn
ARN-1449_RA19-09_multiome_ATACFastQCHuman multiomeARN-1449_RA19-09_multiome_ATACsohailns3://dp-lab-data/collaborators/aboir...-sohailn
ARN-1449_RA18-16_multiome_ATACFastQCHuman multiomeARN-1449_RA18-16_multiome_ATACsohailns3://dp-lab-data/collaborators/aboir...-sohailn
\n", + "
" + ], + "text/plain": [ + " pipelineType project \\\n", + "Sample \n", + "ARN-1379_CP-18-21_multiome FastQC Human multiome \n", + "ARN-1379_CP-18-24_multiome FastQC Human multiome \n", + "ARN-1379_CP-18-21_multiome_ATAC FastQC Human multiome \n", + "ARN-1379_CP-18-24_multiome_ATAC FastQC Human multiome \n", + "ARN-1449_RA19-09_multiome FastQC Human multiome \n", + "ARN-1449_RA18-16_multiome FastQC Human multiome \n", + "ARN-1449_RA19-09_multiome_ATAC FastQC Human multiome \n", + "ARN-1449_RA18-16_multiome_ATAC FastQC Human multiome \n", + "\n", + " sample owner \\\n", + "Sample \n", + "ARN-1379_CP-18-21_multiome ARN-1379_CP-18-21_multiome sohailn \n", + "ARN-1379_CP-18-24_multiome ARN-1379_CP-18-24_multiome sohailn \n", + "ARN-1379_CP-18-21_multiome_ATAC ARN-1379_CP-18-21_multiome_ATAC sohailn \n", + "ARN-1379_CP-18-24_multiome_ATAC ARN-1379_CP-18-24_multiome_ATAC sohailn \n", + "ARN-1449_RA19-09_multiome ARN-1449_RA19-09_multiome sohailn \n", + "ARN-1449_RA18-16_multiome ARN-1449_RA18-16_multiome sohailn \n", + "ARN-1449_RA19-09_multiome_ATAC ARN-1449_RA19-09_multiome_ATAC sohailn \n", + "ARN-1449_RA18-16_multiome_ATAC ARN-1449_RA18-16_multiome_ATAC sohailn \n", + "\n", + " destination \\\n", + "Sample \n", + "ARN-1379_CP-18-21_multiome s3://dp-lab-data/collaborators/aboir... \n", + "ARN-1379_CP-18-24_multiome s3://dp-lab-data/collaborators/aboir... \n", + "ARN-1379_CP-18-21_multiome_ATAC s3://dp-lab-data/collaborators/aboir... \n", + "ARN-1379_CP-18-24_multiome_ATAC s3://dp-lab-data/collaborators/aboir... \n", + "ARN-1449_RA19-09_multiome s3://dp-lab-data/collaborators/aboir... \n", + "ARN-1449_RA18-16_multiome s3://dp-lab-data/collaborators/aboir... \n", + "ARN-1449_RA19-09_multiome_ATAC s3://dp-lab-data/collaborators/aboir... \n", + "ARN-1449_RA18-16_multiome_ATAC s3://dp-lab-data/collaborators/aboir... \n", + "\n", + " transfer comment \n", + "Sample \n", + "ARN-1379_CP-18-21_multiome - sohailn \n", + "ARN-1379_CP-18-24_multiome - sohailn \n", + "ARN-1379_CP-18-21_multiome_ATAC - sohailn \n", + "ARN-1379_CP-18-24_multiome_ATAC - sohailn \n", + "ARN-1449_RA19-09_multiome - sohailn \n", + "ARN-1449_RA18-16_multiome - sohailn \n", + "ARN-1449_RA19-09_multiome_ATAC - sohailn \n", + "ARN-1449_RA18-16_multiome_ATAC - sohailn " + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Standard labels, modify fields as need be\n", + "\n", + "with open(f\"{config_dir}/template.labels.json\") as f:\n", + " std_labels_fields = list(json.load(f).keys())\n", + " \n", + "# Annotate all samples with workflow inputs and labels\n", + "labels = pd.DataFrame(index=samples.index, columns=std_labels_fields,)\n", + "\n", + "labels[\"pipelineType\"] = pipeline_type\n", + "labels[\"project\"] = samples['project_id']\n", + "labels[\"sample\"] = labels.index\n", + "labels[\"owner\"] = creds[\"user\"]\n", + "labels[\"destination\"] = samples['AWS_storage'] + \"/\" + output_dirname\n", + "labels[\"transfer\"] = \"-\"\n", + "labels[\"comment\"] = creds[\"user\"]\n", + "\n", + "labels" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1ac67f52-2cf2-42f6-9d19-11e164021e40", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "51ea6068-d51b-494f-819b-4f9fda7a0ac6", + "metadata": {}, + "source": [ + "# Run samples" + ] + }, + { + "cell_type": "markdown", + "id": "3417414b-07c1-4bd3-886d-4751c6ec5693", + "metadata": {}, + "source": [ + "Look over the samples before submitting one last time" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "6a77a19c-37bf-4f6d-93ff-5b5d4f33fbc7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
FastQC.fastqFilesFastQC.dockerRegistry
Sample
ARN-1379_CP-18-21_multiome[s3://dp-lab-data/collaborators/aboi...quay.io/hisplan
ARN-1379_CP-18-24_multiome[s3://dp-lab-data/collaborators/aboi...quay.io/hisplan
ARN-1379_CP-18-21_multiome_ATAC[s3://dp-lab-data/collaborators/aboi...quay.io/hisplan
ARN-1379_CP-18-24_multiome_ATAC[s3://dp-lab-data/collaborators/aboi...quay.io/hisplan
ARN-1449_RA19-09_multiome[s3://dp-lab-data/collaborators/aboi...quay.io/hisplan
ARN-1449_RA18-16_multiome[s3://dp-lab-data/collaborators/aboi...quay.io/hisplan
ARN-1449_RA19-09_multiome_ATAC[s3://dp-lab-data/collaborators/aboi...quay.io/hisplan
ARN-1449_RA18-16_multiome_ATAC[s3://dp-lab-data/collaborators/aboi...quay.io/hisplan
\n", + "
" + ], + "text/plain": [ + " FastQC.fastqFiles \\\n", + "Sample \n", + "ARN-1379_CP-18-21_multiome [s3://dp-lab-data/collaborators/aboi... \n", + "ARN-1379_CP-18-24_multiome [s3://dp-lab-data/collaborators/aboi... \n", + "ARN-1379_CP-18-21_multiome_ATAC [s3://dp-lab-data/collaborators/aboi... \n", + "ARN-1379_CP-18-24_multiome_ATAC [s3://dp-lab-data/collaborators/aboi... \n", + "ARN-1449_RA19-09_multiome [s3://dp-lab-data/collaborators/aboi... \n", + "ARN-1449_RA18-16_multiome [s3://dp-lab-data/collaborators/aboi... \n", + "ARN-1449_RA19-09_multiome_ATAC [s3://dp-lab-data/collaborators/aboi... \n", + "ARN-1449_RA18-16_multiome_ATAC [s3://dp-lab-data/collaborators/aboi... \n", + "\n", + " FastQC.dockerRegistry \n", + "Sample \n", + "ARN-1379_CP-18-21_multiome quay.io/hisplan \n", + "ARN-1379_CP-18-24_multiome quay.io/hisplan \n", + "ARN-1379_CP-18-21_multiome_ATAC quay.io/hisplan \n", + "ARN-1379_CP-18-24_multiome_ATAC quay.io/hisplan \n", + "ARN-1449_RA19-09_multiome quay.io/hisplan \n", + "ARN-1449_RA18-16_multiome quay.io/hisplan \n", + "ARN-1449_RA19-09_multiome_ATAC quay.io/hisplan \n", + "ARN-1449_RA18-16_multiome_ATAC quay.io/hisplan " + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "inputs" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "58110f32-95b2-4446-8cee-843985fc273e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
pipelineTypeprojectsampleownerdestinationtransfercomment
Sample
ARN-1379_CP-18-21_multiomeFastQCHuman multiomeARN-1379_CP-18-21_multiomesohailns3://dp-lab-data/collaborators/aboir...-sohailn
ARN-1379_CP-18-24_multiomeFastQCHuman multiomeARN-1379_CP-18-24_multiomesohailns3://dp-lab-data/collaborators/aboir...-sohailn
ARN-1379_CP-18-21_multiome_ATACFastQCHuman multiomeARN-1379_CP-18-21_multiome_ATACsohailns3://dp-lab-data/collaborators/aboir...-sohailn
ARN-1379_CP-18-24_multiome_ATACFastQCHuman multiomeARN-1379_CP-18-24_multiome_ATACsohailns3://dp-lab-data/collaborators/aboir...-sohailn
ARN-1449_RA19-09_multiomeFastQCHuman multiomeARN-1449_RA19-09_multiomesohailns3://dp-lab-data/collaborators/aboir...-sohailn
ARN-1449_RA18-16_multiomeFastQCHuman multiomeARN-1449_RA18-16_multiomesohailns3://dp-lab-data/collaborators/aboir...-sohailn
ARN-1449_RA19-09_multiome_ATACFastQCHuman multiomeARN-1449_RA19-09_multiome_ATACsohailns3://dp-lab-data/collaborators/aboir...-sohailn
ARN-1449_RA18-16_multiome_ATACFastQCHuman multiomeARN-1449_RA18-16_multiome_ATACsohailns3://dp-lab-data/collaborators/aboir...-sohailn
\n", + "
" + ], + "text/plain": [ + " pipelineType project \\\n", + "Sample \n", + "ARN-1379_CP-18-21_multiome FastQC Human multiome \n", + "ARN-1379_CP-18-24_multiome FastQC Human multiome \n", + "ARN-1379_CP-18-21_multiome_ATAC FastQC Human multiome \n", + "ARN-1379_CP-18-24_multiome_ATAC FastQC Human multiome \n", + "ARN-1449_RA19-09_multiome FastQC Human multiome \n", + "ARN-1449_RA18-16_multiome FastQC Human multiome \n", + "ARN-1449_RA19-09_multiome_ATAC FastQC Human multiome \n", + "ARN-1449_RA18-16_multiome_ATAC FastQC Human multiome \n", + "\n", + " sample owner \\\n", + "Sample \n", + "ARN-1379_CP-18-21_multiome ARN-1379_CP-18-21_multiome sohailn \n", + "ARN-1379_CP-18-24_multiome ARN-1379_CP-18-24_multiome sohailn \n", + "ARN-1379_CP-18-21_multiome_ATAC ARN-1379_CP-18-21_multiome_ATAC sohailn \n", + "ARN-1379_CP-18-24_multiome_ATAC ARN-1379_CP-18-24_multiome_ATAC sohailn \n", + "ARN-1449_RA19-09_multiome ARN-1449_RA19-09_multiome sohailn \n", + "ARN-1449_RA18-16_multiome ARN-1449_RA18-16_multiome sohailn \n", + "ARN-1449_RA19-09_multiome_ATAC ARN-1449_RA19-09_multiome_ATAC sohailn \n", + "ARN-1449_RA18-16_multiome_ATAC ARN-1449_RA18-16_multiome_ATAC sohailn \n", + "\n", + " destination \\\n", + "Sample \n", + "ARN-1379_CP-18-21_multiome s3://dp-lab-data/collaborators/aboir... \n", + "ARN-1379_CP-18-24_multiome s3://dp-lab-data/collaborators/aboir... \n", + "ARN-1379_CP-18-21_multiome_ATAC s3://dp-lab-data/collaborators/aboir... \n", + "ARN-1379_CP-18-24_multiome_ATAC s3://dp-lab-data/collaborators/aboir... \n", + "ARN-1449_RA19-09_multiome s3://dp-lab-data/collaborators/aboir... \n", + "ARN-1449_RA18-16_multiome s3://dp-lab-data/collaborators/aboir... \n", + "ARN-1449_RA19-09_multiome_ATAC s3://dp-lab-data/collaborators/aboir... \n", + "ARN-1449_RA18-16_multiome_ATAC s3://dp-lab-data/collaborators/aboir... \n", + "\n", + " transfer comment \n", + "Sample \n", + "ARN-1379_CP-18-21_multiome - sohailn \n", + "ARN-1379_CP-18-24_multiome - sohailn \n", + "ARN-1379_CP-18-21_multiome_ATAC - sohailn \n", + "ARN-1379_CP-18-24_multiome_ATAC - sohailn \n", + "ARN-1449_RA19-09_multiome - sohailn \n", + "ARN-1449_RA18-16_multiome - sohailn \n", + "ARN-1449_RA19-09_multiome_ATAC - sohailn \n", + "ARN-1449_RA18-16_multiome_ATAC - sohailn " + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "labels" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5a0c8d8a-a6b8-4f03-b48d-9482d310d5ad", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "a58189c6-1fd1-4e6a-ae7b-7835530867f7", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "58dc01dd19864fe8b228368cf811a994", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/8 [00:00 Date: Thu, 22 Sep 2022 15:48:55 -0400 Subject: [PATCH 12/16] Updated CR ATAC with checks for common errors --- notebooks/Run_CellRangerAtac.ipynb | 1180 +++++++++++++++++----------- notebooks/Run_CellRangerGex.ipynb | 591 +++++++++++--- notebooks/utils/utils.py | 7 +- 3 files changed, 1197 insertions(+), 581 deletions(-) diff --git a/notebooks/Run_CellRangerAtac.ipynb b/notebooks/Run_CellRangerAtac.ipynb index 6fed580..81133f0 100644 --- a/notebooks/Run_CellRangerAtac.ipynb +++ b/notebooks/Run_CellRangerAtac.ipynb @@ -2,87 +2,98 @@ "cells": [ { "cell_type": "code", - "execution_count": 28, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ - "import re, subprocess, boto3, json, shlex, mysql, os, urllib\n", + "import re, subprocess, boto3, json, shlex, mysql, os, urllib, logging\n", "import pandas as pd\n", "import numpy as np\n", "from s3path import S3Path\n", "from pathlib import Path\n", "from tqdm.notebook import tqdm\n", "from packaging import version\n", + "\n", + "import glob\n", + "import os\n", + "\n", "pd.set_option(\"display.max_colwidth\", 40)" ] }, { - "cell_type": "markdown", - "metadata": { - "tags": [], - "toc-hr-collapsed": true - }, + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], "source": [ - "# Define Helper Functions" + "from utils.utils import *" ] }, { "cell_type": "code", - "execution_count": 25, + "execution_count": null, "metadata": {}, "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, "source": [ - "# FASTQ reads/indices required for each workflow\n", - "fastq_map = {\n", - " 'Hashtag': ['R1', 'R2'],\n", - " 'CiteSeq': ['R1', 'R2'],\n", - " 'AsapSeq': ['R1', 'R2', 'R3'],\n", - " 'CellRangerATAC': ['I1', 'R1', 'R2', 'R3'],\n", - "}" + "# AWS setup" ] }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "env: AWS_ACCESS_KEY_ID=ASIAYPY66CWMMMXTDLMI\n", + "env: AWS_SECRET_ACCESS_KEY=dtxpw5ZMW4dwJb5jU6urF5F6eah1/p6FWlJsIu05\n", + "env: AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEOz//////////wEaCXVzLWVhc3QtMSJHMEUCIQCxxpd9cGE/wZs6a7MXeKbrPxFjSEort7eJ1oEd4kGRCgIgHxmA0BEpJfzbDfuhvcPZaAtTMqdAn8qgfF8gsk8VvM4q+AEIlf//////////ARADGgw1ODM2NDM1Njc1MTIiDBjMD2cB+KTY933bFSrMAYAvE0e5psCcZdfCF1uLTzT4bRWYfYydvOLjMwuOgU3uWECoMgurR5LeuBRT33H1wlVfjzWzRDwUSwbFQCTlYeC/a3U4Hl4/0YSi3hfz+Zq50akMKc6sD7VaicEHm9jElhyl9329jUrkspl4W42WvYMU51gD9grwVzyGNcojVyN04XaebunwYJ0PIqQf+lBRjHf/SiVQL/k1Mi8Q9Y8DLgg5Ta/Qyoz4uRANlgdeV7qoECddcd5JfG/Xj/X6kQhEthHzKeN1S6jHjyzmfTCZ8bKZBjqYAd7nRCYvDohSCND4p2hSoNxFyBfklj+PgIVVbu5HIrU+ibYrGBBu44Zu8v0I5c7z81iqpvsFg604eGUZOkpq+2sC1VrmQavkPAKEZj8yys6OtLSDC2+9vVbFJurGNlZKR6INM0YQU95Bm++PPu58MxWwMd9eSjQEB3H9GncAu1utk/cqFADkZjD+KLzA/5ohCkXGBAwCb9BQ\n", + "2021-10-07 15:31:32 agc-583643567512-us-east-1\n", + "2021-10-07 15:28:07 cdktoolkit-stagingbucket-d49u1xfb0sc4\n", + "2019-10-09 13:04:06 cf-templates-umiwbnq3566w-us-east-1\n", + "2019-10-10 12:46:54 dp-daily-reports\n", + "2017-09-26 10:15:15 dp-lab-data\n", + "2019-05-23 12:34:58 dp-lab-data-public\n", + "2018-03-01 13:29:07 dp-lab-glacier\n", + "2020-11-06 23:02:27 dp-lab-gwf-core\n", + "2021-07-15 18:14:01 dp-lab-gwf-core2\n", + "2017-09-26 10:17:18 dp-lab-home\n", + "2019-08-14 16:42:43 dp-lab-test\n", + "2019-04-25 12:35:35 elasticbeanstalk-us-east-1-583643567512\n", + "2019-12-13 15:53:57 scri-computational\n", + "2017-09-26 10:23:50 seqc-public\n" + ] + } + ], "source": [ - "# Get fastq file paths on S3 for each file id\n", - "# Returns dictionary from id to s3 path\n", - "# Throws exception if FASTQs don't exist for any id\n", - "def get_fastqs(\n", - " path: str, # path to directory containing FASTQ files\n", - " fastq_file_ids: list, # FASTQ file ids needed for this run type (e.g. I1, R1, R2, etc.)\n", - "):\n", - " fastq_map = dict()\n", - " _, bucket, key, _, _ = urllib.parse.urlsplit(path)\n", - " for fid in fastq_file_ids:\n", - " files = get_s3_objects(\n", - " bucket, key.lstrip(\"/\"),\n", - " re.compile(f\"_{fid}_\\d{{3}}.fastq.gz$\")\n", - " )\n", - " try:\n", - " assert files, f\"AssertionError: Missing `{fid}` archives!\"\n", - " fastq_map[fid] = [os.path.join(\"s3://\", bucket, str(f)) for f in files]\n", - " except AssertionError as err:\n", - " logging.warning(\"%s\\n\\t %s\", err, path)\n", - " return\n", - " return fastq_map" + "# Load aws\n", + "%env AWS_ACCESS_KEY_ID=ASIAYPY66CWMMMXTDLMI\n", + "%env AWS_SECRET_ACCESS_KEY=dtxpw5ZMW4dwJb5jU6urF5F6eah1/p6FWlJsIu05\n", + "%env AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEOz//////////wEaCXVzLWVhc3QtMSJHMEUCIQCxxpd9cGE/wZs6a7MXeKbrPxFjSEort7eJ1oEd4kGRCgIgHxmA0BEpJfzbDfuhvcPZaAtTMqdAn8qgfF8gsk8VvM4q+AEIlf//////////ARADGgw1ODM2NDM1Njc1MTIiDBjMD2cB+KTY933bFSrMAYAvE0e5psCcZdfCF1uLTzT4bRWYfYydvOLjMwuOgU3uWECoMgurR5LeuBRT33H1wlVfjzWzRDwUSwbFQCTlYeC/a3U4Hl4/0YSi3hfz+Zq50akMKc6sD7VaicEHm9jElhyl9329jUrkspl4W42WvYMU51gD9grwVzyGNcojVyN04XaebunwYJ0PIqQf+lBRjHf/SiVQL/k1Mi8Q9Y8DLgg5Ta/Qyoz4uRANlgdeV7qoECddcd5JfG/Xj/X6kQhEthHzKeN1S6jHjyzmfTCZ8bKZBjqYAd7nRCYvDohSCND4p2hSoNxFyBfklj+PgIVVbu5HIrU+ibYrGBBu44Zu8v0I5c7z81iqpvsFg604eGUZOkpq+2sC1VrmQavkPAKEZj8yys6OtLSDC2+9vVbFJurGNlZKR6INM0YQU95Bm++PPu58MxWwMd9eSjQEB3H9GncAu1utk/cqFADkZjD+KLzA/5ohCkXGBAwCb9BQ\n", + "!aws s3 ls" ] }, { "cell_type": "code", - "execution_count": 77, + "execution_count": null, "metadata": {}, "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, "source": [ - "# Extract FASTQ sample name from list of files\n", - "# Note: FASTQ name is file name up to lane id (e.g. L001, L002, etc.)\n", - "def get_fastqs_name(fastqs):\n", - " fastq_name_re = r\".*/(.*)_S\\d+_L\\d{3}_[A-Za-z]\\d_\\d{3}.fastq.gz$\"\n", - " fastq_names = [re.match(fastq_name_re, x)[1] for x in fastqs]\n", - " assert len(set(fastq_names)) == 1 # make sure all names are same\n", - " return fastq_names[0]" + "# Setup" ] }, { @@ -91,478 +102,696 @@ "metadata": {}, "outputs": [], "source": [ - "# Numpy encoder for JSON from pandas series\n", - "class NpEncoder(json.JSONEncoder):\n", - " def default(self, obj):\n", - " if isinstance(obj, np.integer):\n", - " return int(obj)\n", - " elif isinstance(obj, np.floating):\n", - " return float(obj)\n", - " elif isinstance(obj, np.ndarray):\n", - " return obj.tolist()\n", - " else:\n", - " return super(NpEncoder, self).default(obj)" + "# Which pipeline are you running\n", + "\n", + "prefix = \"CellRangerATAC\" # Workflow to run; also .wdl filename prefix\n", + "output_dirname = \"cr-atac-results\"\n", + "\n", + "workflow_dir = glob.glob(f\"{Path.home()}/scing/bin/cellranger-atac-*\")[0]\n", + "path_to_exec = f\"{workflow_dir}/submit.sh\" # CHANGE THIS FOR SHARP\n", + "\n", + "# Locations of workflow-related directories and files\n", + "path_to_cromwell_secrets = f\"{Path.home()}/.cromwell/cromwell-secrets.json\"\n", + "db_credentials_path = f\"{Path.home()}/.config.json\"" ] }, { "cell_type": "code", "execution_count": 5, - "metadata": { - "tags": [] - }, + "metadata": {}, "outputs": [], "source": [ - "# from SCRIdb\n", - "def get_s3_objects(bucket, key, pattern, full_uri=False):\n", - " \n", - " s3r = boto3.resource(\"s3\")\n", - " bucket_s3 = s3r.Bucket(bucket)\n", - " objects = []\n", - " for obj in bucket_s3.objects.filter(Prefix=key):\n", - " hit = pattern.search(obj.key)\n", - " if hit:\n", - " objects.append(obj.key)\n", - " if full_uri:\n", - " objects = [f\"s3://{bucket}/{o}\" for o in objects]\n", - " return objects" + "# Location of docker files\n", + "common_docker_registry = \"quay.io/hisplan\"\n", + "pipeline_type = prefix # field in *.labels.json\n", + "comment = \"\"" ] }, { "cell_type": "code", "execution_count": 6, - "metadata": { - "tags": [] - }, + "metadata": {}, "outputs": [], "source": [ - "def execute_query(query, user, password):\n", - " with connect(\n", - " host=\"peer-lab-db.cggxmlwgzzpw.us-east-1.rds.amazonaws.com\",\n", - " database=\"peer_lab_db\",\n", - " user=user,\n", - " password=password,\n", - " ) as connection:\n", - " with connection.cursor(buffered=True) as cursor:\n", - " cursor.execute(query)\n", - " result = cursor.fetchall()\n", - " return result" + "# Workflow file paths\n", + "config_dir = f\"{workflow_dir}/configs\"\n", + "path_to_options = f\"{workflow_dir}/{prefix}.options.aws.json\"" ] }, { "cell_type": "code", "execution_count": 7, - "metadata": { - "tags": [] - }, + "metadata": {}, "outputs": [], "source": [ - "# Get species from database for given sample\n", - "from mysql.connector import connect, Error\n", - "\n", - "def get_species(sample_id, user, password):\n", - " try:\n", - " table_sample_data = \"peer_lab_db.sample_data\"\n", - " table_species = \"peer_lab_db.species\"\n", - " table_genome_idx = \"peer_lab_db.genome_index\"\n", - " query = f\"\"\"\n", - " SELECT {table_species}.Species\n", - " FROM {table_species}\n", - " LEFT JOIN {table_genome_idx}\n", - " ON {table_species}.id = {table_genome_idx}.species_id\n", - " LEFT JOIN {table_sample_data}\n", - " ON {table_genome_idx}.id = {table_sample_data}.genomeIndex_id\n", - " WHERE {table_sample_data}.id = {sample_id}\n", - " \"\"\"\n", - " result = execute_query(query, user, password)[0][0]\n", - " return result\n", - " except Error as e:\n", - " print(f\"Error: {e}\")" + "# Set credentials based on SCRIdb CLI config file\n", + "with open(db_credentials_path) as f:\n", + " creds = json.load(f)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Sample information" ] }, { "cell_type": "code", "execution_count": 8, - "metadata": { - "tags": [] - }, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
AWS_storageidspeciessc_techproject_idreference
Sample
MH-1735_MC_GFP_multiome_mATACs3://dp-lab-data/collaborators/white...3970zebrafishmultiomezebrafish tumor multiomicsZebrafish
\n", + "
" + ], + "text/plain": [ + " AWS_storage id \\\n", + "Sample \n", + "MH-1735_MC_GFP_multiome_mATAC s3://dp-lab-data/collaborators/white... 3970 \n", + "\n", + " species sc_tech \\\n", + "Sample \n", + "MH-1735_MC_GFP_multiome_mATAC zebrafish multiome \n", + "\n", + " project_id reference \n", + "Sample \n", + "MH-1735_MC_GFP_multiome_mATAC zebrafish tumor multiomics Zebrafish " + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# You can supply a list of IDs or request IDs or even AWS paths\n", + "\n", + "# request_ids = ['PM-1779']\n", + "# samples = sample_scridb_info(request_ids, 'request_id', creds)\n", + "\n", + "sample_ids = [3970]\n", + "samples = sample_scridb_info(sample_ids, 'id', creds)\n", + "\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, "source": [ - "# Get species from database for given sample\n", - "from mysql.connector import connect, Error\n", + "IMPORTANT NOTE \n", "\n", - "def get_sc_tech(sample_id, user, password):\n", - " try:\n", - " table_sample_data = \"peer_lab_db.sample_data\"\n", - " table_sc_tech = \"peer_lab_db.sc_tech\"\n", - " table_genome_idx = \"peer_lab_db.genome_index\"\n", - " query = f\"\"\"\n", - " SELECT {table_sc_tech}.sc_Tech\n", - " FROM {table_sc_tech}\n", - " LEFT JOIN {table_genome_idx}\n", - " ON {table_sc_tech}.id = {table_genome_idx}.scTech_id\n", - " LEFT JOIN {table_sample_data}\n", - " ON {table_genome_idx}.id = {table_sample_data}.genomeIndex_id\n", - " WHERE {table_sample_data}.id = {sample_id}\n", - " \"\"\"\n", - " result = execute_query(query, user, password)[0][0]\n", - " return result\n", - " except Error as e:\n", - " print(f\"Error: {e}\")" + "Check the name of the folder you are running. Typically the folder that is stored in the database is just the GEX. So if another library is generated (multiome ATAC, VDJ, hashtag, etc) then it needs to be manually changed." ] }, { "cell_type": "code", "execution_count": 9, - "metadata": { - "tags": [] - }, - "outputs": [], + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MH-1735_MC_GFP_multiome_mATAC\n", + " PRE MH-1735_MC_GFP_multiome_mATAC/\n", + "\n" + ] + } + ], "source": [ - "# Get species from database for given sample\n", - "from mysql.connector import connect, Error\n", + "# Check the name of the folder you are running\n", + "# Especially if there are multiple libraries (i.e ATAC, TCR_VDJ, etc.)\n", "\n", - "def get_sample_id(sample_name, user, password):\n", - " try:\n", - " table_sample_data = \"peer_lab_db.sample_data\"\n", - " query = f\"\"\"\n", - " SELECT {table_sample_data}.id\n", - " FROM {table_sample_data}\n", - " WHERE {table_sample_data}.Sample=\"{sample_name}\"\n", - " \"\"\"\n", - " result = execute_query(query, user, password)[0][0]\n", - " return result\n", - " except Error as e:\n", - " print(f\"Error: {e}\")" + "for sample, row in samples.iterrows():\n", + " print(sample)\n", + " path = os.path.split(row['AWS_storage'])[0] + '/'\n", + " os.system(f'aws s3 ls {path} | grep {sample}')\n", + " print()" ] }, { "cell_type": "code", "execution_count": 10, - "metadata": { - "tags": [] - }, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
AWS_storageidspeciessc_techproject_idreferenceFASTQs
Sample
MH-1735_MC_GFP_multiome_mATACs3://dp-lab-data/collaborators/white...3970zebrafishmultiomezebrafish tumor multiomicsZebrafish{'I1': ['s3://dp-lab-data/collaborat...
\n", + "
" + ], + "text/plain": [ + " AWS_storage id \\\n", + "Sample \n", + "MH-1735_MC_GFP_multiome_mATAC s3://dp-lab-data/collaborators/white... 3970 \n", + "\n", + " species sc_tech \\\n", + "Sample \n", + "MH-1735_MC_GFP_multiome_mATAC zebrafish multiome \n", + "\n", + " project_id reference \\\n", + "Sample \n", + "MH-1735_MC_GFP_multiome_mATAC zebrafish tumor multiomics Zebrafish \n", + "\n", + " FASTQs \n", + "Sample \n", + "MH-1735_MC_GFP_multiome_mATAC {'I1': ['s3://dp-lab-data/collaborat... " + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples[\"FASTQs\"] = samples[\"AWS_storage\"].apply(lambda x: get_fastqs(x, fastq_map[prefix], \"FASTQ\"))\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, "source": [ - "# Get species from database for given sample\n", - "from mysql.connector import connect, Error\n", + "IMPORTANT NOTE\n", "\n", - "def get_project_id(sample_id, user, password):\n", - " try:\n", - " table_sample_data = \"peer_lab_db.sample_data\"\n", - " table_project_data = \"peer_lab_db.project_data\"\n", - " query = f\"\"\"\n", - " SELECT {table_project_data}.projectName\n", - " FROM {table_project_data}\n", - " LEFT JOIN {table_sample_data}\n", - " ON {table_project_data}.id = {table_sample_data}.projectData_id\n", - " WHERE {table_sample_data}.id = {sample_id}\n", - " \"\"\"\n", - " result = execute_query(query, user, password)[0][0]\n", - " return result\n", - " except Error as e:\n", - " print(f\"Error: {e}\")" + "Make sure that your files are not archived. The following command will print any FASTQ file that is archived. Unarchive the files and then come back to processing the sample." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MH-1735_MC_GFP_multiome_mATAC\n" + ] + } + ], "source": [ - "def get_SEQC_version(loc):\n", - " try:\n", - " cmd = f\"aws s3 cp {loc}/seqc-results/seqc_log.txt -\"\n", - " out = subprocess.run(shlex.split(cmd), universal_newlines=True, capture_output=True).__dict__[\"stdout\"]\n", - " version = re.match(r\".*SEQC=v(\\d+\\.\\d+\\.\\d+).*\", out)[1]\n", - " return version\n", - " except:\n", - " return \"N/A\"" + "for sample, row in samples.iterrows():\n", + " print(sample)\n", + " fastqs = np.ravel(list(row['FASTQs'].values()))\n", + " dirnames = set([os.path.dirname(x) for x in fastqs])\n", + " \n", + " for dirname in dirnames:\n", + " file = dirname.replace('s3://', '')\n", + " \n", + " bucket = file.split('/')[0]\n", + " pre = file.replace(f'{bucket}/', '')\n", + " \n", + " !aws s3api list-objects-v2 --bucket $bucket --prefix $pre --query \"Contents[?StorageClass!='STANDARD'].Key\" --output text " ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, "source": [ - "def get_file_prefix(loc):\n", - " try:\n", - " cmd = f\"aws s3 ls {loc}/seqc-results/\"\n", - " out = subprocess.run(shlex.split(cmd), universal_newlines=True, capture_output=True).__dict__[\"stdout\"]\n", - " \n", - " # Note: I'm expecting the aligned bam file to be in loc\n", - " bam_pattern = re.compile(r\"(.*)_Aligned\\.out\\.bam$\")\n", - " filename = list(filter(bam_pattern.match, out.split()))[0]\n", - " file_prefix = re.match(bam_pattern, filename)[1]\n", - " return file_prefix\n", - " except:\n", - " raise ValueError(f\"BAM file not found in {loc}\")\n", - " return \"\"" + "IMPORTANT NOTE \n", + "\n", + "For CellRanger you need to supply an HTTPS path. So if you are using a custom genome stored on AWS, you must make the reference public ! Be sure to manually change the \"reference\" argument if it has not been updated correctly!!!!" ] }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 12, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "zebrafish reference not in database. Manually change \"reference\" field\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
AWS_storageidspeciessc_techproject_idreferenceFASTQs
Sample
MH-1735_MC_GFP_multiome_mATACs3://dp-lab-data/collaborators/white...3970zebrafishmultiomezebrafish tumor multiomicsNaN{'I1': ['s3://dp-lab-data/collaborat...
\n", + "
" + ], + "text/plain": [ + " AWS_storage id \\\n", + "Sample \n", + "MH-1735_MC_GFP_multiome_mATAC s3://dp-lab-data/collaborators/white... 3970 \n", + "\n", + " species sc_tech \\\n", + "Sample \n", + "MH-1735_MC_GFP_multiome_mATAC zebrafish multiome \n", + "\n", + " project_id reference \\\n", + "Sample \n", + "MH-1735_MC_GFP_multiome_mATAC zebrafish tumor multiomics NaN \n", + "\n", + " FASTQs \n", + "Sample \n", + "MH-1735_MC_GFP_multiome_mATAC {'I1': ['s3://dp-lab-data/collaborat... " + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "# FASTQ reads/indices required for each workflow\n", - "# Shoudl replace with JSON file\n", - "cr_reference_map = {\n", - " 'CellRangerArc':\n", - " {\n", - " 'Human': \"https://cf.10xgenomics.com/supp/cell-arc/refdata-cellranger-arc-GRCh38-2020-A.tar.gz\",\n", - " 'Mouse': \"https://cf.10xgenomics.com/supp/cell-arc/refdata-cellranger-arc-mm10-2020-A-2.0.0.tar.gz\",\n", - " },\n", - " 'CellRangerATAC':\n", - " {\n", - " 'Human': \"https://cf.10xgenomics.com/supp/cell-atac/refdata-cellranger-arc-GRCh38-2020-A-2.0.0.tar.gz\",\n", - " 'Mouse': \"https://cf.10xgenomics.com/supp/cell-atac/refdata-cellranger-arc-mm10-2020-A-2.0.0.tar.gz\",\n", - " }\n", - "}\n", - "\n", - "def get_cr_reference(sample_id, prefix, user, password):\n", - " # Get species from database to decide reference\n", - " species = get_species(sample_id, user, password)\n", - " \n", - " # Map to reference locations\n", - " try:\n", - " return cr_reference_map[prefix][species]\n", - " except:\n", - " raise ValueError(f\"Unknown Species: {species}\")" + "samples = update_ref(samples, prefix)\n", + "samples" ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "def get_bc_whitelist(sample_id):\n", - " # Get version from database to decide whitelist\n", - " sc_tech = get_sc_tech(sample_id, creds[\"user\"], creds[\"password\"])\n", - " \n", - " # Map to reference locations\n", - " if \"V3\" in sc_tech:\n", - " return \"s3://seqc-public/barcodes/ten_x_v3/flat/3M-february-2018.txt\"\n", - " elif \"V2\" in sc_tech:\n", - " return \"s3://seqc-public/barcodes/ten_x_v2/flat/737K-august-2016.txt\"\n", - " else:\n", - " raise ValueError(f\"Unknown Technology: {sc_tech}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "def run(\n", - " workflow_path: str,\n", - " execp: str,\n", - " secrets: str,\n", - " inputs: str,\n", - " labels: str,\n", - " options: str,\n", - "):\n", - " # change working directory to the pipeline package\n", - " oldwd = os.getcwd()\n", - " os.chdir(workflow_path)\n", - " \n", - " # execute the pipeline command\n", - " cmd = f\"{workflow_path}/{execp} -k {secrets} -i {inputs} -l {labels} -o {options}\"\n", - " var = subprocess.run(shlex.split(cmd), universal_newlines=True, capture_output=True)\n", - " out = var.__dict__\n", - " \n", - " # change working directory back\n", - " os.chdir(oldwd)\n", - " \n", - " return out" - ] + "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "# Process Samples" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "## Setup" + "# Generate inputs" ] }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 13, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
CellRangerATAC.sampleNameCellRangerATAC.fastqNamesCellRangerATAC.fastqFilesCellRangerATAC.referenceGenomeCellRangerATAC.dockerRegistry
Sample
MH-1735_MC_GFP_multiome_mATACMH-1735_MC_GFP_multiome_mATAC3970_MH-1735_MC_GFP_multiome_mATAC_I...[s3://dp-lab-data/collaborators/whit...NaNquay.io/hisplan
\n", + "
" + ], + "text/plain": [ + " CellRangerATAC.sampleName \\\n", + "Sample \n", + "MH-1735_MC_GFP_multiome_mATAC MH-1735_MC_GFP_multiome_mATAC \n", + "\n", + " CellRangerATAC.fastqNames \\\n", + "Sample \n", + "MH-1735_MC_GFP_multiome_mATAC 3970_MH-1735_MC_GFP_multiome_mATAC_I... \n", + "\n", + " CellRangerATAC.fastqFiles \\\n", + "Sample \n", + "MH-1735_MC_GFP_multiome_mATAC [s3://dp-lab-data/collaborators/whit... \n", + "\n", + " CellRangerATAC.referenceGenome \\\n", + "Sample \n", + "MH-1735_MC_GFP_multiome_mATAC NaN \n", + "\n", + " CellRangerATAC.dockerRegistry \n", + "Sample \n", + "MH-1735_MC_GFP_multiome_mATAC quay.io/hisplan " + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "# Location of docker files\n", - "common_docker_registry = \"quay.io/hisplan\"\n", + "# Standard inputs, modify fields as need be\n", "\n", - "prefix = \"CellRangerATAC\" # Workflow to run; also .wdl filename prefix\n", - "pipeline_type = prefix # field in *.labels.json\n", - "output_dirname = \"cr-atac-results\"\n", + "# Load minimum inputs and labels fields from templates\n", + "with open(f\"{config_dir}/template.inputs.json\") as f:\n", + " std_inputs_fields = list(json.load(f).keys())\n", + " \n", + "# Annotate all samples with workflow inputs and labels\n", + "inputs = pd.DataFrame(index=samples.index, columns=std_inputs_fields,)\n", "\n", - "# If need to add comment, put here\n", - "comment = \"\"" - ] - }, - { - "cell_type": "code", - "execution_count": 59, - "metadata": {}, - "outputs": [], - "source": [ - "# Locations of workflow-related directories and files\n", - "path_to_cromwell_secrets = f\"{Path.home()}/.cromwell/cromwell-secrets.json\" # CHANGE THIS\n", - "workflow_dir = f\"{Path.home()}/scing/bin/cellranger-atac-2.0.0\" # CHANGE THIS\n", - "path_to_exec = f\"{workflow_dir}/submit.sh\" # CHANGE THIS FOR SHARP\n", - "config_dir = f\"{workflow_dir}/configs\"\n", - "path_to_options = f\"{workflow_dir}/{prefix}.options.aws.json\"\n", + "# Annotate inputs\n", + "inputs[f\"{prefix}.sampleName\"] = samples.index\n", + "inputs[f\"{prefix}.fastqFiles\"] = samples[\"FASTQs\"].apply(lambda x: np.ravel(list(x.values())))\n", + "inputs[f\"{prefix}.fastqNames\"] = inputs[f\"{prefix}.fastqFiles\"].apply(lambda x: get_fastqs_name(x))\n", + "inputs[f\"{prefix}.referenceGenome\"] = samples[\"reference\"] \n", + "inputs[f\"{prefix}.dockerRegistry\"] = common_docker_registry\n", "\n", - "# Other file locations\n", - "db_credentials_path = f\"{Path.home()}/.config.json\" # CHANGE THIS" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "# Set credentials based on SCRIdb CLI config file\n", - "with open(db_credentials_path) as f:\n", - " creds = json.load(f)" + "inputs" ] }, { "cell_type": "code", - "execution_count": 176, + "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "# Samples on which to run CellRangerATAC\n", - "# Note: Assumes data is transferred to AWS S3 (this should be an s3 location)\n", - "# Note: Assumes directory name is name of sample\n", - "common_dir = \"s3://dp-lab-data/collaborators/tabarv/IdhWtVersusMutantImmunome\"\n", - "samples = [\n", - " #\"KY-1178_20210308_ATAC\",\n", - " #\"KY-1178_20210218_ATAC\",\n", - " #\"KY-1178_20201117_ATAC\",\n", - " #\"KY-1178_20201119_ATAC\",\n", - " \"KY-1178_20210330_ATAC\",\n", - " #\"KY-1178_20210603_ATAC\",\n", - " #\"KY-1178_20210405_ATAC\",\n", - " #\"KY-1223_20210428_ATAC\",\n", - " #\"KY-1223_20210416_ATAC\",\n", - " #\"KY-1223_20210628_ATAC\",\n", - " #\"KY-1223_20210413_ATAC\",\n", - " #'20201012_Redo_ATAC',\n", - " #'20201013_Redo_ATAC',\n", - " #'20201116_Redo_ATAC',\n", - " #'20201117-PM_Redo_ATAC',\n", - "]\n", - "sample_paths = [\n", - " f\"{common_dir}/{sample}\" for sample in samples\n", - "]" - ] + "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Execution" + "# Generate labels" ] }, { "cell_type": "code", - "execution_count": 177, + "execution_count": 14, "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "['KY-1178_20210330_ATAC']\n" - ] + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
pipelineTypeprojectsampleownerdestinationtransfercomment
Sample
MH-1735_MC_GFP_multiome_mATACCellRangerATACzebrafish tumor multiomicsMH-1735_MC_GFP_multiome_mATACsohailns3://dp-lab-data/collaborators/white...-sohailn
\n", + "
" + ], + "text/plain": [ + " pipelineType project \\\n", + "Sample \n", + "MH-1735_MC_GFP_multiome_mATAC CellRangerATAC zebrafish tumor multiomics \n", + "\n", + " sample owner \\\n", + "Sample \n", + "MH-1735_MC_GFP_multiome_mATAC MH-1735_MC_GFP_multiome_mATAC sohailn \n", + "\n", + " destination \\\n", + "Sample \n", + "MH-1735_MC_GFP_multiome_mATAC s3://dp-lab-data/collaborators/white... \n", + "\n", + " transfer comment \n", + "Sample \n", + "MH-1735_MC_GFP_multiome_mATAC - sohailn " + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "# Get information for all samples\n", - "sample_paths = [s.strip('/') for s in sample_paths] # remove trailing slash if exists\n", - "sample_names = [os.path.basename(s) for s in sample_paths]\n", - "#sample_names = [s.replace(\"Redo_\", \"\") for s in sample_names]\n", - "print(sample_names)\n", - "samples = pd.DataFrame(\n", - " sample_paths,\n", - " index=sample_names,\n", - " columns=[\"S3_Path\"],\n", - " dtype=str,\n", - ")\n", - "samples[\"Sample_ID\"] = pd.Series(samples.index).apply(\n", - " lambda x: get_sample_id(x, creds['user'], creds['password'])\n", - ").values\n", - "\n", - "# Get FASTQ paths from S3\n", - "# Note: Uses same FASTQ file ids for all samples\n", - "fastq_file_ids = fastq_map[prefix]\n", - "samples[\"FASTQs\"] = samples[\"S3_Path\"].apply(lambda x: get_fastqs(x, fastq_file_ids))\n", + "# Standard labels, modify fields as need be\n", "\n", - "# Get reference genome location\n", - "samples[\"Reference\"] = samples[\"Sample_ID\"].apply(lambda x: get_cr_reference(x, prefix, creds[\"user\"], creds[\"password\"]))" - ] - }, - { - "cell_type": "code", - "execution_count": 178, - "metadata": {}, - "outputs": [], - "source": [ - "# Load minimum inputs and labels fields from templates\n", - "with open(f\"{config_dir}/template.inputs.json\") as f:\n", - " std_inputs_fields = list(json.load(f).keys())\n", - " \n", "with open(f\"{config_dir}/template.labels.json\") as f:\n", " std_labels_fields = list(json.load(f).keys())\n", " \n", "# Annotate all samples with workflow inputs and labels\n", - "inputs = pd.DataFrame(index=samples.index, columns=std_inputs_fields,)\n", "labels = pd.DataFrame(index=samples.index, columns=std_labels_fields,)\n", "\n", - "# Annotate inputs\n", - "inputs[f\"{prefix}.sampleName\"] = inputs.index # may need to change\n", - "inputs[f\"{prefix}.fastqFiles\"] = samples[\"FASTQs\"].apply(lambda x: np.ravel(list(x.values())))\n", - "inputs[f\"{prefix}.fastqNames\"] = inputs[f\"{prefix}.fastqFiles\"].apply(lambda x: get_fastqs_name(x))\n", - "inputs[f\"{prefix}.referenceGenome\"] = samples[\"Reference\"].apply(lambda x: {\n", - " \"name\": re.match(r'.*refdata-cellranger-arc-(.*).tar.gz', x)[1],\n", - " \"location\": x,\n", - "}) \n", - "inputs[f\"{prefix}.dockerRegistry\"] = common_docker_registry\n", - "\n", - "# Annotate labels\n", "labels[\"pipelineType\"] = pipeline_type\n", - "labels[\"project\"] = samples[\"Sample_ID\"].apply(lambda x: get_project_id(x, creds[\"user\"], creds[\"password\"]))\n", + "labels[\"project\"] = samples['project_id']\n", "labels[\"sample\"] = labels.index\n", "labels[\"owner\"] = creds[\"user\"]\n", - "labels[\"destination\"] = samples['S3_Path'] + \"/\" + output_dirname\n", + "labels[\"destination\"] = samples['AWS_storage'] + \"/\" + output_dirname\n", "labels[\"transfer\"] = \"-\"\n", "labels[\"comment\"] = creds[\"user\"]\n", "\n", - "assert (std_inputs_fields == list(inputs.columns)) & (inputs.notna().values.all())\n", - "assert (std_labels_fields == list(labels.columns)) & (labels.notna().values.all())" + "labels" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Run samples" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Look over the samples before submitting one last time" ] }, { "cell_type": "code", - "execution_count": 179, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -592,14 +821,22 @@ " CellRangerATAC.referenceGenome\n", " CellRangerATAC.dockerRegistry\n", " \n", + " \n", + " Sample\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " KY-1178_20210330_ATAC\n", - " KY-1178_20210330_ATAC\n", - " 3029_KY-1178_20210330_ATAC_IGO_12437...\n", - " [s3://dp-lab-data/collaborators/taba...\n", - " {'name': 'GRCh38-2020-A-2.0.0', 'loc...\n", + " MH-1735_MC_GFP_multiome_mATAC\n", + " MH-1735_MC_GFP_multiome_mATAC\n", + " 3970_MH-1735_MC_GFP_multiome_mATAC_I...\n", + " [s3://dp-lab-data/collaborators/whit...\n", + " NaN\n", " quay.io/hisplan\n", " \n", " \n", @@ -607,23 +844,28 @@ "" ], "text/plain": [ - " CellRangerATAC.sampleName \\\n", - "KY-1178_20210330_ATAC KY-1178_20210330_ATAC \n", + " CellRangerATAC.sampleName \\\n", + "Sample \n", + "MH-1735_MC_GFP_multiome_mATAC MH-1735_MC_GFP_multiome_mATAC \n", "\n", - " CellRangerATAC.fastqNames \\\n", - "KY-1178_20210330_ATAC 3029_KY-1178_20210330_ATAC_IGO_12437... \n", + " CellRangerATAC.fastqNames \\\n", + "Sample \n", + "MH-1735_MC_GFP_multiome_mATAC 3970_MH-1735_MC_GFP_multiome_mATAC_I... \n", "\n", - " CellRangerATAC.fastqFiles \\\n", - "KY-1178_20210330_ATAC [s3://dp-lab-data/collaborators/taba... \n", + " CellRangerATAC.fastqFiles \\\n", + "Sample \n", + "MH-1735_MC_GFP_multiome_mATAC [s3://dp-lab-data/collaborators/whit... \n", "\n", - " CellRangerATAC.referenceGenome \\\n", - "KY-1178_20210330_ATAC {'name': 'GRCh38-2020-A-2.0.0', 'loc... \n", + " CellRangerATAC.referenceGenome \\\n", + "Sample \n", + "MH-1735_MC_GFP_multiome_mATAC NaN \n", "\n", - " CellRangerATAC.dockerRegistry \n", - "KY-1178_20210330_ATAC quay.io/hisplan " + " CellRangerATAC.dockerRegistry \n", + "Sample \n", + "MH-1735_MC_GFP_multiome_mATAC quay.io/hisplan " ] }, - "execution_count": 179, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -634,7 +876,7 @@ }, { "cell_type": "code", - "execution_count": 180, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -666,37 +908,51 @@ " transfer\n", " comment\n", " \n", + " \n", + " Sample\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " KY-1178_20210330_ATAC\n", + " MH-1735_MC_GFP_multiome_mATAC\n", " CellRangerATAC\n", - " IDH wt versus mutant Immunome\n", - " KY-1178_20210330_ATAC\n", - " moormana\n", - " s3://dp-lab-data/collaborators/tabar...\n", + " zebrafish tumor multiomics\n", + " MH-1735_MC_GFP_multiome_mATAC\n", + " sohailn\n", + " s3://dp-lab-data/collaborators/white...\n", " -\n", - " moormana\n", + " sohailn\n", " \n", " \n", "\n", "" ], "text/plain": [ - " pipelineType project \\\n", - "KY-1178_20210330_ATAC CellRangerATAC IDH wt versus mutant Immunome \n", + " pipelineType project \\\n", + "Sample \n", + "MH-1735_MC_GFP_multiome_mATAC CellRangerATAC zebrafish tumor multiomics \n", "\n", - " sample owner \\\n", - "KY-1178_20210330_ATAC KY-1178_20210330_ATAC moormana \n", + " sample owner \\\n", + "Sample \n", + "MH-1735_MC_GFP_multiome_mATAC MH-1735_MC_GFP_multiome_mATAC sohailn \n", "\n", - " destination transfer \\\n", - "KY-1178_20210330_ATAC s3://dp-lab-data/collaborators/tabar... - \n", + " destination \\\n", + "Sample \n", + "MH-1735_MC_GFP_multiome_mATAC s3://dp-lab-data/collaborators/white... \n", "\n", - " comment \n", - "KY-1178_20210330_ATAC moormana " + " transfer comment \n", + "Sample \n", + "MH-1735_MC_GFP_multiome_mATAC - sohailn " ] }, - "execution_count": 180, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -707,31 +963,38 @@ }, { "cell_type": "code", - "execution_count": 181, - "metadata": { - "tags": [] - }, + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, "outputs": [ { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "bf400f8f2caf424fa398e48d8e832bbb", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - " 0%| | 0/1 [00:00\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mtime\u001b[39;00m\n\u001b[0;32m----> 3\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m (std_inputs_fields \u001b[38;5;241m==\u001b[39m \u001b[38;5;28mlist\u001b[39m(inputs\u001b[38;5;241m.\u001b[39mcolumns)) \u001b[38;5;241m&\u001b[39m (inputs\u001b[38;5;241m.\u001b[39mnotna()\u001b[38;5;241m.\u001b[39mvalues\u001b[38;5;241m.\u001b[39mall())\n\u001b[1;32m 4\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m (std_labels_fields \u001b[38;5;241m==\u001b[39m \u001b[38;5;28mlist\u001b[39m(labels\u001b[38;5;241m.\u001b[39mcolumns)) \u001b[38;5;241m&\u001b[39m (labels\u001b[38;5;241m.\u001b[39mnotna()\u001b[38;5;241m.\u001b[39mvalues\u001b[38;5;241m.\u001b[39mall())\n\u001b[1;32m 6\u001b[0m stdouts \u001b[38;5;241m=\u001b[39m [] \u001b[38;5;66;03m# to store all outputs\u001b[39;00m\n", + "\u001b[0;31mAssertionError\u001b[0m: " + ] } ], "source": [ + "import time\n", + "\n", + "assert (std_inputs_fields == list(inputs.columns)) & (inputs.notna().values.all())\n", + "assert (std_labels_fields == list(labels.columns)) & (labels.notna().values.all())\n", + "\n", "stdouts = [] # to store all outputs\n", - "process = True\n", + "process = False\n", "\n", - "with tqdm(samples.index) as t:\n", + "with tqdm(inputs.index) as t:\n", "\n", " for sample_name in t:\n", "\n", @@ -752,38 +1015,29 @@ " inputs = path_to_inputs,\n", " labels = path_to_labels,\n", " options = path_to_options,\n", - " ))" + " ))\n", + " \n", + " time.sleep(20)" ] }, { "cell_type": "code", - "execution_count": 182, + "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[{'args': ['/Users/moormana/scing/bin/cellranger-atac-2.0.0/submit.sh',\n", - " '-k',\n", - " '/Users/moormana/.cromwell/cromwell-secrets.json',\n", - " '-i',\n", - " '/Users/moormana/scing/bin/cellranger-atac-2.0.0/configs/KY-1178_20210330_ATAC.inputs.json',\n", - " '-l',\n", - " '/Users/moormana/scing/bin/cellranger-atac-2.0.0/configs/KY-1178_20210330_ATAC.labels.json',\n", - " '-o',\n", - " '/Users/moormana/scing/bin/cellranger-atac-2.0.0/CellRangerATAC.options.aws.json'],\n", - " 'returncode': 0,\n", - " 'stdout': '{\"id\":\"43e1a5be-af27-4ea3-a7b9-68bf449d42d0\",\"status\":\"Submitted\"}\\n',\n", - " 'stderr': ''}]" + "['s3://dp-lab-data/collaborators/whiter/ZebrafishTumorMultiomics/MH-1735_MC_GFP_multiome_mATAC/cr-atac-results']" ] }, - "execution_count": 182, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "stdouts" + "labels['destination'].values.tolist()" ] } ], diff --git a/notebooks/Run_CellRangerGex.ipynb b/notebooks/Run_CellRangerGex.ipynb index 86923cb..51587e3 100644 --- a/notebooks/Run_CellRangerGex.ipynb +++ b/notebooks/Run_CellRangerGex.ipynb @@ -49,7 +49,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 20, "id": "1023bdd2-6db6-4274-bd1b-13f092fd11d9", "metadata": {}, "outputs": [ @@ -57,9 +57,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "env: AWS_ACCESS_KEY_ID=ASIAYPY66CWMGLBAIGO6\n", - "env: AWS_SECRET_ACCESS_KEY=i6fm87l+UNBLyxlwU4AXD2HEGTXYutOlj4lfB9bk\n", - "env: AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEK///////////wEaCXVzLWVhc3QtMSJHMEUCIQCAs8AyD3w8/luR3fB4wyOA0fC5vzw2nyzspQ7/+Pgf/AIgBhFvsspOJmLbACqO8/42UuRe7nu6vdi7DaJ5k/UFDxsq7wEISBADGgw1ODM2NDM1Njc1MTIiDP2ESPVfC1OK7pmq+SrMAQRwXr+RvcapTJP/skUqP4og+mqro7RYgBPQ8OQKWReZ0JLWYk2+/npsDqlMM5j7Zre4aQPkttvkyacSoDBo4B/SufvOD5eotZyXsKR5zEjrgn9HTQGxlylIakbUK/7pJSe4pJxAya79ZEC/1PrAUYnZR2ZGGgYgRF0oIwzbLblSoAmBYeNbbkbluJC3qbicERnH/BHlO4oHXPMesuS+QncRWn8rlRxGRySgTaW+gcH2tBwDBhB+RURyCtXC3AyJmQ7tp4MerTHhTToIaTCIqe2YBjqYAbdygCv6Qz2i+YqCafTb2npOoT7PPA6ooeWnXXzZXPc8POEASCBAq6bOIWvGWcKxwVwgode8mb8/R9oBnXQh0wdqm+ufpGuUAaVE8Y8rgNGXiKnCq/QywzTtjpgOTvJkYw8WPUWE6J8KhN10WqJtEdvif9E15Zqj7H69BL+Zy2wayYbu35OTPBuK3q4QlAVNk5fS+Uvkwxyz\n", + "env: AWS_ACCESS_KEY_ID=ASIAYPY66CWMAGB4APZ5\n", + "env: AWS_SECRET_ACCESS_KEY=SlU2SwQG4/jc/Fxwctzkp3wr7bHyQujOeYuh1oit\n", + "env: AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEEAaCXVzLWVhc3QtMSJGMEQCICAZhZMHfer96SpsuiGsI4ku2a7B/1J1ykbBKMUOnvNgAiAtsDXa5Rahxnp4Gl0/J67rTR7OjQB6D5WxnOJCyt03Xyr4AQjZ//////////8BEAMaDDU4MzY0MzU2NzUxMiIMe9+FB47cMKpm3v8TKswBoMwwQAryHzgg02Mg7FDkW/KZfTJGlxHUVJeDgJIJMCzxjDwX6ppQ8lKvTmK7fwppb530JEXC1S7JRsM3pBidDt03MLzvEgaORmYCR4Ld2OI6VCDGmXzpQIk2kjKLbeHYG3+9X5X6WNnDGtbA86T0vh81O1K06RB7NejQeN/nWRDhC4zwQQ32eQ1FNiwlDN20e/3gfB/Bmly6wv6hJpEqjWVSCxgkBbTtUaD4MQ1zvtpPzvrn/55mZGm0SaC9KOR1FGD3POqy22447zS0MJSYjZkGOpkB06k0KR7NAd/HtDKfvjqncCwLCz7JJpteQ9UN68LtE4mbcnMmoekuxJMNMOiCmnijiLaGUHasdKDv8zlfZ0eTc5vAiC/j1Nu346SR9LyfmlkC89JtvhY+pbbXt2X7nspvXNsBvK7mlbvJflvIxj/nQvdf+ccIOgAnaL8OJXmZ2wXgePJ6uGB9K7vHbIfxc71FQQSwLYb8oPx/\n", "2021-10-07 15:31:32 agc-583643567512-us-east-1\n", "2021-10-07 15:28:07 cdktoolkit-stagingbucket-d49u1xfb0sc4\n", "2019-10-09 13:04:06 cf-templates-umiwbnq3566w-us-east-1\n", @@ -80,9 +80,9 @@ "source": [ "# Load aws\n", "\n", - "%env AWS_ACCESS_KEY_ID=ASIAYPY66CWMGLBAIGO6\n", - "%env AWS_SECRET_ACCESS_KEY=i6fm87l+UNBLyxlwU4AXD2HEGTXYutOlj4lfB9bk\n", - "%env AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEK///////////wEaCXVzLWVhc3QtMSJHMEUCIQCAs8AyD3w8/luR3fB4wyOA0fC5vzw2nyzspQ7/+Pgf/AIgBhFvsspOJmLbACqO8/42UuRe7nu6vdi7DaJ5k/UFDxsq7wEISBADGgw1ODM2NDM1Njc1MTIiDP2ESPVfC1OK7pmq+SrMAQRwXr+RvcapTJP/skUqP4og+mqro7RYgBPQ8OQKWReZ0JLWYk2+/npsDqlMM5j7Zre4aQPkttvkyacSoDBo4B/SufvOD5eotZyXsKR5zEjrgn9HTQGxlylIakbUK/7pJSe4pJxAya79ZEC/1PrAUYnZR2ZGGgYgRF0oIwzbLblSoAmBYeNbbkbluJC3qbicERnH/BHlO4oHXPMesuS+QncRWn8rlRxGRySgTaW+gcH2tBwDBhB+RURyCtXC3AyJmQ7tp4MerTHhTToIaTCIqe2YBjqYAbdygCv6Qz2i+YqCafTb2npOoT7PPA6ooeWnXXzZXPc8POEASCBAq6bOIWvGWcKxwVwgode8mb8/R9oBnXQh0wdqm+ufpGuUAaVE8Y8rgNGXiKnCq/QywzTtjpgOTvJkYw8WPUWE6J8KhN10WqJtEdvif9E15Zqj7H69BL+Zy2wayYbu35OTPBuK3q4QlAVNk5fS+Uvkwxyz\n", + "%env AWS_ACCESS_KEY_ID=ASIAYPY66CWMAGB4APZ5\n", + "%env AWS_SECRET_ACCESS_KEY=SlU2SwQG4/jc/Fxwctzkp3wr7bHyQujOeYuh1oit\n", + "%env AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEEAaCXVzLWVhc3QtMSJGMEQCICAZhZMHfer96SpsuiGsI4ku2a7B/1J1ykbBKMUOnvNgAiAtsDXa5Rahxnp4Gl0/J67rTR7OjQB6D5WxnOJCyt03Xyr4AQjZ//////////8BEAMaDDU4MzY0MzU2NzUxMiIMe9+FB47cMKpm3v8TKswBoMwwQAryHzgg02Mg7FDkW/KZfTJGlxHUVJeDgJIJMCzxjDwX6ppQ8lKvTmK7fwppb530JEXC1S7JRsM3pBidDt03MLzvEgaORmYCR4Ld2OI6VCDGmXzpQIk2kjKLbeHYG3+9X5X6WNnDGtbA86T0vh81O1K06RB7NejQeN/nWRDhC4zwQQ32eQ1FNiwlDN20e/3gfB/Bmly6wv6hJpEqjWVSCxgkBbTtUaD4MQ1zvtpPzvrn/55mZGm0SaC9KOR1FGD3POqy22447zS0MJSYjZkGOpkB06k0KR7NAd/HtDKfvjqncCwLCz7JJpteQ9UN68LtE4mbcnMmoekuxJMNMOiCmnijiLaGUHasdKDv8zlfZ0eTc5vAiC/j1Nu346SR9LyfmlkC89JtvhY+pbbXt2X7nspvXNsBvK7mlbvJflvIxj/nQvdf+ccIOgAnaL8OJXmZ2wXgePJ6uGB9K7vHbIfxc71FQQSwLYb8oPx/\n", "!aws s3 ls" ] }, @@ -183,16 +183,6 @@ "id": "3bad3986-1d7e-4194-928b-51b4e2debe35", "metadata": {}, "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - " SELECT Sample, AWS_storage, id\n", - " FROM peer_lab_db.sample_data \n", - " WHERE peer_lab_db.sample_data.id = \"4006\"\n" - ] - }, { "data": { "text/html": [ @@ -233,6 +223,24 @@ " \n", " \n", " \n", + " PM-1779_LC441_A_5prime\n", + " s3://dp-lab-data/collaborators/rudin...\n", + " 4004\n", + " human\n", + " 10X_5prime\n", + " Pre-_post-IO NSCLC\n", + " GRCh38-3.0.0\n", + " \n", + " \n", + " PM-1779_LC441_B_5prime\n", + " s3://dp-lab-data/collaborators/rudin...\n", + " 4005\n", + " human\n", + " 10X_5prime\n", + " Pre-_post-IO NSCLC\n", + " GRCh38-3.0.0\n", + " \n", + " \n", " PM-1779_LC479A_5prime\n", " s3://dp-lab-data/collaborators/rudin...\n", " 4006\n", @@ -241,18 +249,33 @@ " Pre-_post-IO NSCLC\n", " GRCh38-3.0.0\n", " \n", + " \n", + " PM-1779_LC479B_5prime\n", + " s3://dp-lab-data/collaborators/rudin...\n", + " 4007\n", + " human\n", + " 10X_5prime\n", + " Pre-_post-IO NSCLC\n", + " GRCh38-3.0.0\n", + " \n", " \n", "\n", "" ], "text/plain": [ - " AWS_storage id species \\\n", - "Sample \n", - "PM-1779_LC479A_5prime s3://dp-lab-data/collaborators/rudin... 4006 human \n", + " AWS_storage id species \\\n", + "Sample \n", + "PM-1779_LC441_A_5prime s3://dp-lab-data/collaborators/rudin... 4004 human \n", + "PM-1779_LC441_B_5prime s3://dp-lab-data/collaborators/rudin... 4005 human \n", + "PM-1779_LC479A_5prime s3://dp-lab-data/collaborators/rudin... 4006 human \n", + "PM-1779_LC479B_5prime s3://dp-lab-data/collaborators/rudin... 4007 human \n", "\n", - " sc_tech project_id reference \n", - "Sample \n", - "PM-1779_LC479A_5prime 10X_5prime Pre-_post-IO NSCLC GRCh38-3.0.0 " + " sc_tech project_id reference \n", + "Sample \n", + "PM-1779_LC441_A_5prime 10X_5prime Pre-_post-IO NSCLC GRCh38-3.0.0 \n", + "PM-1779_LC441_B_5prime 10X_5prime Pre-_post-IO NSCLC GRCh38-3.0.0 \n", + "PM-1779_LC479A_5prime 10X_5prime Pre-_post-IO NSCLC GRCh38-3.0.0 \n", + "PM-1779_LC479B_5prime 10X_5prime Pre-_post-IO NSCLC GRCh38-3.0.0 " ] }, "execution_count": 8, @@ -266,7 +289,7 @@ "# request_ids = ['PM-1779']\n", "# samples = sample_scridb_info(request_ids, 'request_id', creds)\n", "\n", - "sample_ids = [4006]\n", + "sample_ids = list(range(4004, 4008))\n", "samples = sample_scridb_info(sample_ids, 'id', creds)\n", "\n", "samples" @@ -300,9 +323,21 @@ "name": "stdout", "output_type": "stream", "text": [ + "PM-1779_LC441_A_5prime\n", + " PRE PM-1779_LC441_A_5prime/\n", + " PRE PM-1779_LC441_A_5prime_TCR_VDJ/\n", + "\n", + "PM-1779_LC441_B_5prime\n", + " PRE PM-1779_LC441_B_5prime/\n", + " PRE PM-1779_LC441_B_5prime_TCR_VDJ/\n", + "\n", "PM-1779_LC479A_5prime\n", " PRE PM-1779_LC479A_5prime/\n", " PRE PM-1779_LC479A_5prime_TCR_VDJ/\n", + "\n", + "PM-1779_LC479B_5prime\n", + " PRE PM-1779_LC479B_5prime/\n", + " PRE PM-1779_LC479B_5prime_TCR_VDJ/\n", "\n" ] } @@ -366,6 +401,26 @@ " \n", " \n", " \n", + " PM-1779_LC441_A_5prime\n", + " s3://dp-lab-data/collaborators/rudin...\n", + " 4004\n", + " human\n", + " 10X_5prime\n", + " Pre-_post-IO NSCLC\n", + " GRCh38-3.0.0\n", + " {'I1': ['s3://dp-lab-data/collaborat...\n", + " \n", + " \n", + " PM-1779_LC441_B_5prime\n", + " s3://dp-lab-data/collaborators/rudin...\n", + " 4005\n", + " human\n", + " 10X_5prime\n", + " Pre-_post-IO NSCLC\n", + " GRCh38-3.0.0\n", + " {'I1': ['s3://dp-lab-data/collaborat...\n", + " \n", + " \n", " PM-1779_LC479A_5prime\n", " s3://dp-lab-data/collaborators/rudin...\n", " 4006\n", @@ -375,22 +430,41 @@ " GRCh38-3.0.0\n", " {'I1': ['s3://dp-lab-data/collaborat...\n", " \n", + " \n", + " PM-1779_LC479B_5prime\n", + " s3://dp-lab-data/collaborators/rudin...\n", + " 4007\n", + " human\n", + " 10X_5prime\n", + " Pre-_post-IO NSCLC\n", + " GRCh38-3.0.0\n", + " {'I1': ['s3://dp-lab-data/collaborat...\n", + " \n", " \n", "\n", "" ], "text/plain": [ - " AWS_storage id species \\\n", - "Sample \n", - "PM-1779_LC479A_5prime s3://dp-lab-data/collaborators/rudin... 4006 human \n", + " AWS_storage id species \\\n", + "Sample \n", + "PM-1779_LC441_A_5prime s3://dp-lab-data/collaborators/rudin... 4004 human \n", + "PM-1779_LC441_B_5prime s3://dp-lab-data/collaborators/rudin... 4005 human \n", + "PM-1779_LC479A_5prime s3://dp-lab-data/collaborators/rudin... 4006 human \n", + "PM-1779_LC479B_5prime s3://dp-lab-data/collaborators/rudin... 4007 human \n", "\n", - " sc_tech project_id reference \\\n", - "Sample \n", - "PM-1779_LC479A_5prime 10X_5prime Pre-_post-IO NSCLC GRCh38-3.0.0 \n", + " sc_tech project_id reference \\\n", + "Sample \n", + "PM-1779_LC441_A_5prime 10X_5prime Pre-_post-IO NSCLC GRCh38-3.0.0 \n", + "PM-1779_LC441_B_5prime 10X_5prime Pre-_post-IO NSCLC GRCh38-3.0.0 \n", + "PM-1779_LC479A_5prime 10X_5prime Pre-_post-IO NSCLC GRCh38-3.0.0 \n", + "PM-1779_LC479B_5prime 10X_5prime Pre-_post-IO NSCLC GRCh38-3.0.0 \n", "\n", - " FASTQs \n", - "Sample \n", - "PM-1779_LC479A_5prime {'I1': ['s3://dp-lab-data/collaborat... " + " FASTQs \n", + "Sample \n", + "PM-1779_LC441_A_5prime {'I1': ['s3://dp-lab-data/collaborat... \n", + "PM-1779_LC441_B_5prime {'I1': ['s3://dp-lab-data/collaborat... \n", + "PM-1779_LC479A_5prime {'I1': ['s3://dp-lab-data/collaborat... \n", + "PM-1779_LC479B_5prime {'I1': ['s3://dp-lab-data/collaborat... " ] }, "execution_count": 10, @@ -403,6 +477,56 @@ "samples" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "b6a866f5-621b-442c-b7f3-fba3a405a3ba", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "5a520309-4ea8-444e-ab81-bd3586cbb02b", + "metadata": {}, + "source": [ + "IMPORTANT NOTE\n", + "\n", + "Make sure that your files are not archived. The following command will print any FASTQ file that is archived. Unarchive the files and then come back to processing the sample." + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "e8d952ba-cdad-4b93-80d2-7b0dba6f6a89", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "PM-1779_LC441_A_5prime\n", + "PM-1779_LC441_B_5prime\n", + "PM-1779_LC479A_5prime\n", + "PM-1779_LC479B_5prime\n" + ] + } + ], + "source": [ + "for sample, row in samples.iterrows():\n", + " print(sample)\n", + " fastqs = np.ravel(list(row['FASTQs'].values()))\n", + " dirnames = set([os.path.dirname(x) for x in fastqs])\n", + " \n", + " for dirname in dirnames:\n", + " file = dirname.replace('s3://', '')\n", + " \n", + " bucket = file.split('/')[0]\n", + " pre = file.replace(f'{bucket}/', '')\n", + " \n", + " !aws s3api list-objects-v2 --bucket $bucket --prefix $pre --query \"Contents[?StorageClass!='STANDARD'].Key\" --output text " + ] + }, { "cell_type": "code", "execution_count": null, @@ -469,6 +593,26 @@ " \n", " \n", " \n", + " PM-1779_LC441_A_5prime\n", + " s3://dp-lab-data/collaborators/rudin...\n", + " 4004\n", + " human\n", + " 10X_5prime\n", + " Pre-_post-IO NSCLC\n", + " https://cf.10xgenomics.com/supp/cell...\n", + " {'I1': ['s3://dp-lab-data/collaborat...\n", + " \n", + " \n", + " PM-1779_LC441_B_5prime\n", + " s3://dp-lab-data/collaborators/rudin...\n", + " 4005\n", + " human\n", + " 10X_5prime\n", + " Pre-_post-IO NSCLC\n", + " https://cf.10xgenomics.com/supp/cell...\n", + " {'I1': ['s3://dp-lab-data/collaborat...\n", + " \n", + " \n", " PM-1779_LC479A_5prime\n", " s3://dp-lab-data/collaborators/rudin...\n", " 4006\n", @@ -478,26 +622,48 @@ " https://cf.10xgenomics.com/supp/cell...\n", " {'I1': ['s3://dp-lab-data/collaborat...\n", " \n", + " \n", + " PM-1779_LC479B_5prime\n", + " s3://dp-lab-data/collaborators/rudin...\n", + " 4007\n", + " human\n", + " 10X_5prime\n", + " Pre-_post-IO NSCLC\n", + " https://cf.10xgenomics.com/supp/cell...\n", + " {'I1': ['s3://dp-lab-data/collaborat...\n", + " \n", " \n", "\n", "" ], "text/plain": [ - " AWS_storage id species \\\n", - "Sample \n", - "PM-1779_LC479A_5prime s3://dp-lab-data/collaborators/rudin... 4006 human \n", + " AWS_storage id species \\\n", + "Sample \n", + "PM-1779_LC441_A_5prime s3://dp-lab-data/collaborators/rudin... 4004 human \n", + "PM-1779_LC441_B_5prime s3://dp-lab-data/collaborators/rudin... 4005 human \n", + "PM-1779_LC479A_5prime s3://dp-lab-data/collaborators/rudin... 4006 human \n", + "PM-1779_LC479B_5prime s3://dp-lab-data/collaborators/rudin... 4007 human \n", "\n", - " sc_tech project_id \\\n", - "Sample \n", - "PM-1779_LC479A_5prime 10X_5prime Pre-_post-IO NSCLC \n", + " sc_tech project_id \\\n", + "Sample \n", + "PM-1779_LC441_A_5prime 10X_5prime Pre-_post-IO NSCLC \n", + "PM-1779_LC441_B_5prime 10X_5prime Pre-_post-IO NSCLC \n", + "PM-1779_LC479A_5prime 10X_5prime Pre-_post-IO NSCLC \n", + "PM-1779_LC479B_5prime 10X_5prime Pre-_post-IO NSCLC \n", "\n", - " reference \\\n", - "Sample \n", - "PM-1779_LC479A_5prime https://cf.10xgenomics.com/supp/cell... \n", + " reference \\\n", + "Sample \n", + "PM-1779_LC441_A_5prime https://cf.10xgenomics.com/supp/cell... \n", + "PM-1779_LC441_B_5prime https://cf.10xgenomics.com/supp/cell... \n", + "PM-1779_LC479A_5prime https://cf.10xgenomics.com/supp/cell... \n", + "PM-1779_LC479B_5prime https://cf.10xgenomics.com/supp/cell... \n", "\n", - " FASTQs \n", - "Sample \n", - "PM-1779_LC479A_5prime {'I1': ['s3://dp-lab-data/collaborat... " + " FASTQs \n", + "Sample \n", + "PM-1779_LC441_A_5prime {'I1': ['s3://dp-lab-data/collaborat... \n", + "PM-1779_LC441_B_5prime {'I1': ['s3://dp-lab-data/collaborat... \n", + "PM-1779_LC479A_5prime {'I1': ['s3://dp-lab-data/collaborat... \n", + "PM-1779_LC479B_5prime {'I1': ['s3://dp-lab-data/collaborat... " ] }, "execution_count": 11, @@ -576,6 +742,28 @@ " \n", " \n", " \n", + " PM-1779_LC441_A_5prime\n", + " PM-1779_LC441_A_5prime\n", + " 4004_PM-1779_LC441_A_5prime_IGO_1243...\n", + " [s3://dp-lab-data/collaborators/rudi...\n", + " https://cf.10xgenomics.com/supp/cell...\n", + " False\n", + " 5000\n", + " 256\n", + " quay.io/hisplan\n", + " \n", + " \n", + " PM-1779_LC441_B_5prime\n", + " PM-1779_LC441_B_5prime\n", + " 4005_PM-1779_LC441_B_5prime_IGO_1243...\n", + " [s3://dp-lab-data/collaborators/rudi...\n", + " https://cf.10xgenomics.com/supp/cell...\n", + " False\n", + " 5000\n", + " 256\n", + " quay.io/hisplan\n", + " \n", + " \n", " PM-1779_LC479A_5prime\n", " PM-1779_LC479A_5prime\n", " 4006_PM-1779_LC479A_5prime_IGO_12437...\n", @@ -586,38 +774,70 @@ " 256\n", " quay.io/hisplan\n", " \n", + " \n", + " PM-1779_LC479B_5prime\n", + " PM-1779_LC479B_5prime\n", + " 4007_PM-1779_LC479B_5prime_IGO_12437...\n", + " [s3://dp-lab-data/collaborators/rudi...\n", + " https://cf.10xgenomics.com/supp/cell...\n", + " False\n", + " 5000\n", + " 256\n", + " quay.io/hisplan\n", + " \n", " \n", "\n", "" ], "text/plain": [ - " CellRangerGex.sampleName \\\n", - "Sample \n", - "PM-1779_LC479A_5prime PM-1779_LC479A_5prime \n", + " CellRangerGex.sampleName \\\n", + "Sample \n", + "PM-1779_LC441_A_5prime PM-1779_LC441_A_5prime \n", + "PM-1779_LC441_B_5prime PM-1779_LC441_B_5prime \n", + "PM-1779_LC479A_5prime PM-1779_LC479A_5prime \n", + "PM-1779_LC479B_5prime PM-1779_LC479B_5prime \n", "\n", - " CellRangerGex.fastqName \\\n", - "Sample \n", - "PM-1779_LC479A_5prime 4006_PM-1779_LC479A_5prime_IGO_12437... \n", + " CellRangerGex.fastqName \\\n", + "Sample \n", + "PM-1779_LC441_A_5prime 4004_PM-1779_LC441_A_5prime_IGO_1243... \n", + "PM-1779_LC441_B_5prime 4005_PM-1779_LC441_B_5prime_IGO_1243... \n", + "PM-1779_LC479A_5prime 4006_PM-1779_LC479A_5prime_IGO_12437... \n", + "PM-1779_LC479B_5prime 4007_PM-1779_LC479B_5prime_IGO_12437... \n", "\n", - " CellRangerGex.inputFastq \\\n", - "Sample \n", - "PM-1779_LC479A_5prime [s3://dp-lab-data/collaborators/rudi... \n", + " CellRangerGex.inputFastq \\\n", + "Sample \n", + "PM-1779_LC441_A_5prime [s3://dp-lab-data/collaborators/rudi... \n", + "PM-1779_LC441_B_5prime [s3://dp-lab-data/collaborators/rudi... \n", + "PM-1779_LC479A_5prime [s3://dp-lab-data/collaborators/rudi... \n", + "PM-1779_LC479B_5prime [s3://dp-lab-data/collaborators/rudi... \n", "\n", - " CellRangerGex.referenceUrl \\\n", - "Sample \n", - "PM-1779_LC479A_5prime https://cf.10xgenomics.com/supp/cell... \n", + " CellRangerGex.referenceUrl \\\n", + "Sample \n", + "PM-1779_LC441_A_5prime https://cf.10xgenomics.com/supp/cell... \n", + "PM-1779_LC441_B_5prime https://cf.10xgenomics.com/supp/cell... \n", + "PM-1779_LC479A_5prime https://cf.10xgenomics.com/supp/cell... \n", + "PM-1779_LC479B_5prime https://cf.10xgenomics.com/supp/cell... \n", "\n", - " CellRangerGex.includeIntrons \\\n", - "Sample \n", - "PM-1779_LC479A_5prime False \n", + " CellRangerGex.includeIntrons \\\n", + "Sample \n", + "PM-1779_LC441_A_5prime False \n", + "PM-1779_LC441_B_5prime False \n", + "PM-1779_LC479A_5prime False \n", + "PM-1779_LC479B_5prime False \n", "\n", - " CellRangerGex.expectCells CellRangerGex.memory \\\n", - "Sample \n", - "PM-1779_LC479A_5prime 5000 256 \n", + " CellRangerGex.expectCells CellRangerGex.memory \\\n", + "Sample \n", + "PM-1779_LC441_A_5prime 5000 256 \n", + "PM-1779_LC441_B_5prime 5000 256 \n", + "PM-1779_LC479A_5prime 5000 256 \n", + "PM-1779_LC479B_5prime 5000 256 \n", "\n", - " CellRangerGex.dockerRegistry \n", - "Sample \n", - "PM-1779_LC479A_5prime quay.io/hisplan " + " CellRangerGex.dockerRegistry \n", + "Sample \n", + "PM-1779_LC441_A_5prime quay.io/hisplan \n", + "PM-1779_LC441_B_5prime quay.io/hisplan \n", + "PM-1779_LC479A_5prime quay.io/hisplan \n", + "PM-1779_LC479B_5prime quay.io/hisplan " ] }, "execution_count": 12, @@ -742,6 +962,26 @@ " \n", " \n", " \n", + " PM-1779_LC441_A_5prime\n", + " CellRangerGex\n", + " Pre-_post-IO NSCLC\n", + " PM-1779_LC441_A_5prime\n", + " sohailn\n", + " s3://dp-lab-data/collaborators/rudin...\n", + " -\n", + " sohailn\n", + " \n", + " \n", + " PM-1779_LC441_B_5prime\n", + " CellRangerGex\n", + " Pre-_post-IO NSCLC\n", + " PM-1779_LC441_B_5prime\n", + " sohailn\n", + " s3://dp-lab-data/collaborators/rudin...\n", + " -\n", + " sohailn\n", + " \n", + " \n", " PM-1779_LC479A_5prime\n", " CellRangerGex\n", " Pre-_post-IO NSCLC\n", @@ -751,26 +991,48 @@ " -\n", " sohailn\n", " \n", + " \n", + " PM-1779_LC479B_5prime\n", + " CellRangerGex\n", + " Pre-_post-IO NSCLC\n", + " PM-1779_LC479B_5prime\n", + " sohailn\n", + " s3://dp-lab-data/collaborators/rudin...\n", + " -\n", + " sohailn\n", + " \n", " \n", "\n", "" ], "text/plain": [ - " pipelineType project \\\n", - "Sample \n", - "PM-1779_LC479A_5prime CellRangerGex Pre-_post-IO NSCLC \n", + " pipelineType project \\\n", + "Sample \n", + "PM-1779_LC441_A_5prime CellRangerGex Pre-_post-IO NSCLC \n", + "PM-1779_LC441_B_5prime CellRangerGex Pre-_post-IO NSCLC \n", + "PM-1779_LC479A_5prime CellRangerGex Pre-_post-IO NSCLC \n", + "PM-1779_LC479B_5prime CellRangerGex Pre-_post-IO NSCLC \n", "\n", - " sample owner \\\n", - "Sample \n", - "PM-1779_LC479A_5prime PM-1779_LC479A_5prime sohailn \n", + " sample owner \\\n", + "Sample \n", + "PM-1779_LC441_A_5prime PM-1779_LC441_A_5prime sohailn \n", + "PM-1779_LC441_B_5prime PM-1779_LC441_B_5prime sohailn \n", + "PM-1779_LC479A_5prime PM-1779_LC479A_5prime sohailn \n", + "PM-1779_LC479B_5prime PM-1779_LC479B_5prime sohailn \n", "\n", - " destination transfer \\\n", - "Sample \n", - "PM-1779_LC479A_5prime s3://dp-lab-data/collaborators/rudin... - \n", + " destination transfer \\\n", + "Sample \n", + "PM-1779_LC441_A_5prime s3://dp-lab-data/collaborators/rudin... - \n", + "PM-1779_LC441_B_5prime s3://dp-lab-data/collaborators/rudin... - \n", + "PM-1779_LC479A_5prime s3://dp-lab-data/collaborators/rudin... - \n", + "PM-1779_LC479B_5prime s3://dp-lab-data/collaborators/rudin... - \n", "\n", - " comment \n", - "Sample \n", - "PM-1779_LC479A_5prime sohailn " + " comment \n", + "Sample \n", + "PM-1779_LC441_A_5prime sohailn \n", + "PM-1779_LC441_B_5prime sohailn \n", + "PM-1779_LC479A_5prime sohailn \n", + "PM-1779_LC479B_5prime sohailn " ] }, "execution_count": 14, @@ -872,6 +1134,28 @@ " \n", " \n", " \n", + " PM-1779_LC441_A_5prime\n", + " PM-1779_LC441_A_5prime\n", + " 4004_PM-1779_LC441_A_5prime_IGO_1243...\n", + " [s3://dp-lab-data/collaborators/rudi...\n", + " https://cf.10xgenomics.com/supp/cell...\n", + " True\n", + " 5000\n", + " 256\n", + " quay.io/hisplan\n", + " \n", + " \n", + " PM-1779_LC441_B_5prime\n", + " PM-1779_LC441_B_5prime\n", + " 4005_PM-1779_LC441_B_5prime_IGO_1243...\n", + " [s3://dp-lab-data/collaborators/rudi...\n", + " https://cf.10xgenomics.com/supp/cell...\n", + " True\n", + " 5000\n", + " 256\n", + " quay.io/hisplan\n", + " \n", + " \n", " PM-1779_LC479A_5prime\n", " PM-1779_LC479A_5prime\n", " 4006_PM-1779_LC479A_5prime_IGO_12437...\n", @@ -882,38 +1166,70 @@ " 256\n", " quay.io/hisplan\n", " \n", + " \n", + " PM-1779_LC479B_5prime\n", + " PM-1779_LC479B_5prime\n", + " 4007_PM-1779_LC479B_5prime_IGO_12437...\n", + " [s3://dp-lab-data/collaborators/rudi...\n", + " https://cf.10xgenomics.com/supp/cell...\n", + " True\n", + " 5000\n", + " 256\n", + " quay.io/hisplan\n", + " \n", " \n", "\n", "" ], "text/plain": [ - " CellRangerGex.sampleName \\\n", - "Sample \n", - "PM-1779_LC479A_5prime PM-1779_LC479A_5prime \n", + " CellRangerGex.sampleName \\\n", + "Sample \n", + "PM-1779_LC441_A_5prime PM-1779_LC441_A_5prime \n", + "PM-1779_LC441_B_5prime PM-1779_LC441_B_5prime \n", + "PM-1779_LC479A_5prime PM-1779_LC479A_5prime \n", + "PM-1779_LC479B_5prime PM-1779_LC479B_5prime \n", "\n", - " CellRangerGex.fastqName \\\n", - "Sample \n", - "PM-1779_LC479A_5prime 4006_PM-1779_LC479A_5prime_IGO_12437... \n", + " CellRangerGex.fastqName \\\n", + "Sample \n", + "PM-1779_LC441_A_5prime 4004_PM-1779_LC441_A_5prime_IGO_1243... \n", + "PM-1779_LC441_B_5prime 4005_PM-1779_LC441_B_5prime_IGO_1243... \n", + "PM-1779_LC479A_5prime 4006_PM-1779_LC479A_5prime_IGO_12437... \n", + "PM-1779_LC479B_5prime 4007_PM-1779_LC479B_5prime_IGO_12437... \n", "\n", - " CellRangerGex.inputFastq \\\n", - "Sample \n", - "PM-1779_LC479A_5prime [s3://dp-lab-data/collaborators/rudi... \n", + " CellRangerGex.inputFastq \\\n", + "Sample \n", + "PM-1779_LC441_A_5prime [s3://dp-lab-data/collaborators/rudi... \n", + "PM-1779_LC441_B_5prime [s3://dp-lab-data/collaborators/rudi... \n", + "PM-1779_LC479A_5prime [s3://dp-lab-data/collaborators/rudi... \n", + "PM-1779_LC479B_5prime [s3://dp-lab-data/collaborators/rudi... \n", "\n", - " CellRangerGex.referenceUrl \\\n", - "Sample \n", - "PM-1779_LC479A_5prime https://cf.10xgenomics.com/supp/cell... \n", + " CellRangerGex.referenceUrl \\\n", + "Sample \n", + "PM-1779_LC441_A_5prime https://cf.10xgenomics.com/supp/cell... \n", + "PM-1779_LC441_B_5prime https://cf.10xgenomics.com/supp/cell... \n", + "PM-1779_LC479A_5prime https://cf.10xgenomics.com/supp/cell... \n", + "PM-1779_LC479B_5prime https://cf.10xgenomics.com/supp/cell... \n", "\n", - " CellRangerGex.includeIntrons \\\n", - "Sample \n", - "PM-1779_LC479A_5prime True \n", + " CellRangerGex.includeIntrons \\\n", + "Sample \n", + "PM-1779_LC441_A_5prime True \n", + "PM-1779_LC441_B_5prime True \n", + "PM-1779_LC479A_5prime True \n", + "PM-1779_LC479B_5prime True \n", "\n", - " CellRangerGex.expectCells CellRangerGex.memory \\\n", - "Sample \n", - "PM-1779_LC479A_5prime 5000 256 \n", + " CellRangerGex.expectCells CellRangerGex.memory \\\n", + "Sample \n", + "PM-1779_LC441_A_5prime 5000 256 \n", + "PM-1779_LC441_B_5prime 5000 256 \n", + "PM-1779_LC479A_5prime 5000 256 \n", + "PM-1779_LC479B_5prime 5000 256 \n", "\n", - " CellRangerGex.dockerRegistry \n", - "Sample \n", - "PM-1779_LC479A_5prime quay.io/hisplan " + " CellRangerGex.dockerRegistry \n", + "Sample \n", + "PM-1779_LC441_A_5prime quay.io/hisplan \n", + "PM-1779_LC441_B_5prime quay.io/hisplan \n", + "PM-1779_LC479A_5prime quay.io/hisplan \n", + "PM-1779_LC479B_5prime quay.io/hisplan " ] }, "execution_count": 15, @@ -973,6 +1289,26 @@ " \n", " \n", " \n", + " PM-1779_LC441_A_5prime\n", + " CellRangerGex\n", + " Pre-_post-IO NSCLC\n", + " PM-1779_LC441_A_5prime\n", + " sohailn\n", + " s3://dp-lab-data/collaborators/rudin...\n", + " -\n", + " sohailn\n", + " \n", + " \n", + " PM-1779_LC441_B_5prime\n", + " CellRangerGex\n", + " Pre-_post-IO NSCLC\n", + " PM-1779_LC441_B_5prime\n", + " sohailn\n", + " s3://dp-lab-data/collaborators/rudin...\n", + " -\n", + " sohailn\n", + " \n", + " \n", " PM-1779_LC479A_5prime\n", " CellRangerGex\n", " Pre-_post-IO NSCLC\n", @@ -982,26 +1318,48 @@ " -\n", " sohailn\n", " \n", + " \n", + " PM-1779_LC479B_5prime\n", + " CellRangerGex\n", + " Pre-_post-IO NSCLC\n", + " PM-1779_LC479B_5prime\n", + " sohailn\n", + " s3://dp-lab-data/collaborators/rudin...\n", + " -\n", + " sohailn\n", + " \n", " \n", "\n", "" ], "text/plain": [ - " pipelineType project \\\n", - "Sample \n", - "PM-1779_LC479A_5prime CellRangerGex Pre-_post-IO NSCLC \n", + " pipelineType project \\\n", + "Sample \n", + "PM-1779_LC441_A_5prime CellRangerGex Pre-_post-IO NSCLC \n", + "PM-1779_LC441_B_5prime CellRangerGex Pre-_post-IO NSCLC \n", + "PM-1779_LC479A_5prime CellRangerGex Pre-_post-IO NSCLC \n", + "PM-1779_LC479B_5prime CellRangerGex Pre-_post-IO NSCLC \n", "\n", - " sample owner \\\n", - "Sample \n", - "PM-1779_LC479A_5prime PM-1779_LC479A_5prime sohailn \n", + " sample owner \\\n", + "Sample \n", + "PM-1779_LC441_A_5prime PM-1779_LC441_A_5prime sohailn \n", + "PM-1779_LC441_B_5prime PM-1779_LC441_B_5prime sohailn \n", + "PM-1779_LC479A_5prime PM-1779_LC479A_5prime sohailn \n", + "PM-1779_LC479B_5prime PM-1779_LC479B_5prime sohailn \n", "\n", - " destination transfer \\\n", - "Sample \n", - "PM-1779_LC479A_5prime s3://dp-lab-data/collaborators/rudin... - \n", + " destination transfer \\\n", + "Sample \n", + "PM-1779_LC441_A_5prime s3://dp-lab-data/collaborators/rudin... - \n", + "PM-1779_LC441_B_5prime s3://dp-lab-data/collaborators/rudin... - \n", + "PM-1779_LC479A_5prime s3://dp-lab-data/collaborators/rudin... - \n", + "PM-1779_LC479B_5prime s3://dp-lab-data/collaborators/rudin... - \n", "\n", - " comment \n", - "Sample \n", - "PM-1779_LC479A_5prime sohailn " + " comment \n", + "Sample \n", + "PM-1779_LC441_A_5prime sohailn \n", + "PM-1779_LC441_B_5prime sohailn \n", + "PM-1779_LC479A_5prime sohailn \n", + "PM-1779_LC479B_5prime sohailn " ] }, "execution_count": 16, @@ -1023,19 +1381,19 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 17, "id": "54ef3d9c-2361-4b8e-bcfe-bc9c3878876b", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "a45711bb72c34906894e41c465e67bd9", + "model_id": "c2f4d0529c0b4610a3670959cbaad187", "version_major": 2, "version_minor": 0 }, "text/plain": [ - " 0%| | 0/1 [00:00 Date: Thu, 22 Sep 2022 21:32:46 -0400 Subject: [PATCH 13/16] Fixed reference to be a dictionary --- notebooks/Run_CellRangerAtac.ipynb | 100 ++++++++++++++++++++--------- 1 file changed, 68 insertions(+), 32 deletions(-) diff --git a/notebooks/Run_CellRangerAtac.ipynb b/notebooks/Run_CellRangerAtac.ipynb index 81133f0..68852c8 100644 --- a/notebooks/Run_CellRangerAtac.ipynb +++ b/notebooks/Run_CellRangerAtac.ipynb @@ -441,6 +441,13 @@ "For CellRanger you need to supply an HTTPS path. So if you are using a custom genome stored on AWS, you must make the reference public ! Be sure to manually change the \"reference\" argument if it has not been updated correctly!!!!" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "code", "execution_count": 12, @@ -533,15 +540,41 @@ ], "source": [ "samples = update_ref(samples, prefix)\n", + "\n", + "if not samples['reference'].isna().any():\n", + " samples[\"reference\"].apply(lambda x: {\n", + " \"name\": re.match(r'.*refdata-cellranger-arc-(.*).tar.gz', x)[1],\n", + " \"location\": x,\n", + " }) \n", "samples" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 19, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "text/plain": [ + "Sample\n", + "MH-1735_MC_GFP_multiome_mATAC {'name': 'GRCz11_atac', 'location': ...\n", + "Name: reference, dtype: object" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples['reference'] = [\n", + " {\n", + " 'name' : 'GRCz11_atac',\n", + " 'location' : \"https://dp-lab-data.s3.amazonaws.com/collaborators/whiter/YM-1704_transgene_reference/refdata-cellranger/GRCz11_atac.tar.gz\"\n", + " }] * len(samples)\n", + "samples['reference']" + ] }, { "cell_type": "markdown", @@ -552,7 +585,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 20, "metadata": {}, "outputs": [ { @@ -597,7 +630,7 @@ " MH-1735_MC_GFP_multiome_mATAC\n", " 3970_MH-1735_MC_GFP_multiome_mATAC_I...\n", " [s3://dp-lab-data/collaborators/whit...\n", - " NaN\n", + " {'name': 'GRCz11_atac', 'location': ...\n", " quay.io/hisplan\n", " \n", " \n", @@ -617,16 +650,16 @@ "Sample \n", "MH-1735_MC_GFP_multiome_mATAC [s3://dp-lab-data/collaborators/whit... \n", "\n", - " CellRangerATAC.referenceGenome \\\n", - "Sample \n", - "MH-1735_MC_GFP_multiome_mATAC NaN \n", + " CellRangerATAC.referenceGenome \\\n", + "Sample \n", + "MH-1735_MC_GFP_multiome_mATAC {'name': 'GRCz11_atac', 'location': ... \n", "\n", " CellRangerATAC.dockerRegistry \n", "Sample \n", "MH-1735_MC_GFP_multiome_mATAC quay.io/hisplan " ] }, - "execution_count": 13, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } @@ -667,7 +700,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 21, "metadata": {}, "outputs": [ { @@ -743,7 +776,7 @@ "MH-1735_MC_GFP_multiome_mATAC - sohailn " ] }, - "execution_count": 14, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } @@ -791,7 +824,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 22, "metadata": {}, "outputs": [ { @@ -836,7 +869,7 @@ " MH-1735_MC_GFP_multiome_mATAC\n", " 3970_MH-1735_MC_GFP_multiome_mATAC_I...\n", " [s3://dp-lab-data/collaborators/whit...\n", - " NaN\n", + " {'name': 'GRCz11_atac', 'location': ...\n", " quay.io/hisplan\n", " \n", " \n", @@ -856,16 +889,16 @@ "Sample \n", "MH-1735_MC_GFP_multiome_mATAC [s3://dp-lab-data/collaborators/whit... \n", "\n", - " CellRangerATAC.referenceGenome \\\n", - "Sample \n", - "MH-1735_MC_GFP_multiome_mATAC NaN \n", + " CellRangerATAC.referenceGenome \\\n", + "Sample \n", + "MH-1735_MC_GFP_multiome_mATAC {'name': 'GRCz11_atac', 'location': ... \n", "\n", " CellRangerATAC.dockerRegistry \n", "Sample \n", "MH-1735_MC_GFP_multiome_mATAC quay.io/hisplan " ] }, - "execution_count": 15, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" } @@ -876,7 +909,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 23, "metadata": {}, "outputs": [ { @@ -952,7 +985,7 @@ "MH-1735_MC_GFP_multiome_mATAC - sohailn " ] }, - "execution_count": 16, + "execution_count": 23, "metadata": {}, "output_type": "execute_result" } @@ -970,19 +1003,22 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 24, "metadata": {}, "outputs": [ { - "ename": "AssertionError", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mAssertionError\u001b[0m Traceback (most recent call last)", - "Input \u001b[0;32mIn [17]\u001b[0m, in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mtime\u001b[39;00m\n\u001b[0;32m----> 3\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m (std_inputs_fields \u001b[38;5;241m==\u001b[39m \u001b[38;5;28mlist\u001b[39m(inputs\u001b[38;5;241m.\u001b[39mcolumns)) \u001b[38;5;241m&\u001b[39m (inputs\u001b[38;5;241m.\u001b[39mnotna()\u001b[38;5;241m.\u001b[39mvalues\u001b[38;5;241m.\u001b[39mall())\n\u001b[1;32m 4\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m (std_labels_fields \u001b[38;5;241m==\u001b[39m \u001b[38;5;28mlist\u001b[39m(labels\u001b[38;5;241m.\u001b[39mcolumns)) \u001b[38;5;241m&\u001b[39m (labels\u001b[38;5;241m.\u001b[39mnotna()\u001b[38;5;241m.\u001b[39mvalues\u001b[38;5;241m.\u001b[39mall())\n\u001b[1;32m 6\u001b[0m stdouts \u001b[38;5;241m=\u001b[39m [] \u001b[38;5;66;03m# to store all outputs\u001b[39;00m\n", - "\u001b[0;31mAssertionError\u001b[0m: " - ] + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c26c371d7aaf4698a245a88e2b6c96d2", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/1 [00:00 Date: Mon, 17 Oct 2022 17:53:29 -0400 Subject: [PATCH 14/16] Seperate notebook to demultiplex cellplex with sharp --- notebooks/Run_Sharp_CellRangerCellPlex.ipynb | 1473 ++++++++++++++++++ 1 file changed, 1473 insertions(+) create mode 100644 notebooks/Run_Sharp_CellRangerCellPlex.ipynb diff --git a/notebooks/Run_Sharp_CellRangerCellPlex.ipynb b/notebooks/Run_Sharp_CellRangerCellPlex.ipynb new file mode 100644 index 0000000..b297e64 --- /dev/null +++ b/notebooks/Run_Sharp_CellRangerCellPlex.ipynb @@ -0,0 +1,1473 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import re, subprocess, boto3, json, shlex, mysql, os, urllib, logging\n", + "import pandas as pd\n", + "import numpy as np\n", + "from s3path import S3Path\n", + "from pathlib import Path\n", + "from tqdm.notebook import tqdm\n", + "from packaging import version\n", + "\n", + "import glob\n", + "import os\n", + "\n", + "pd.set_option(\"display.max_colwidth\", 40)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "from utils.utils import *" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# AWS setup" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "env: AWS_ACCESS_KEY_ID=ASIAYPY66CWMA43XGNEJ\n", + "env: AWS_SECRET_ACCESS_KEY=aZaMEjhh3xSJkidskAJ0WV4s/O7ouBrK8yFcsf/l\n", + "env: AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEEQaCXVzLWVhc3QtMSJGMEQCID4Qg4UtEgPkl2WQvQ4UUGpMt431nkVKIym0DsVgBuGTAiAL4Npy2wqCKNQA9girQJS8FthBwSS+5IXbWJqhcCTISyrvAQgdEAMaDDU4MzY0MzU2NzUxMiIMgLRUFOh6CHjFSLqmKswB044GAT2uqzohaaofARUzyPikiWwSe+Jqan1trQoD5+iG6CU42fPvNjEkHdj9KEiVuNRSYBby810GizNg1EB+vStlYH8b5mSxpSqb1Ptseo1sgmRGuiCvV+saca1yqRbtGOkZ1h0bsjYyWslXqfXi6Taf6lOwiiFKGU7hMJ7Ofnf0Pa559LFnZQcZZrFTENrridhPvxK8bn4LSQSGdVbTfw6bCXaymSCFyPLFCl4Kz4D1LQyVZbUsm3O44PZ+PpIgdFGPB8g+RZPJfLoMMNbntpoGOpkB5ItVgeBBWQK3i+hbfk6s4QLcWr6pyMwu0aLfEX+de3TnkW3cPzTjY5ZPNResL60+vh2Jynf41kHtFkqJlYeZjQ+1ttpml7NQlzMP2GgpR7GvXLdYSViM+rVyVYVc3rwdHCUy6ndtKBNDvdAa8+CS11VKEIGML1eC2Ho/ZmFRdKnIu8uOKP3VzgNk97pOzYmDrGDzD2sVt5/Y\n", + "2021-10-07 15:31:32 agc-583643567512-us-east-1\n", + "2021-10-07 15:28:07 cdktoolkit-stagingbucket-d49u1xfb0sc4\n", + "2019-10-09 13:04:06 cf-templates-umiwbnq3566w-us-east-1\n", + "2019-10-10 12:46:54 dp-daily-reports\n", + "2017-09-26 10:15:15 dp-lab-data\n", + "2019-05-23 12:34:58 dp-lab-data-public\n", + "2018-03-01 13:29:07 dp-lab-glacier\n", + "2020-11-06 23:02:27 dp-lab-gwf-core\n", + "2021-07-15 18:14:01 dp-lab-gwf-core2\n", + "2017-09-26 10:17:18 dp-lab-home\n", + "2019-08-14 16:42:43 dp-lab-test\n", + "2019-04-25 12:35:35 elasticbeanstalk-us-east-1-583643567512\n", + "2019-12-13 15:53:57 scri-computational\n", + "2017-09-26 10:23:50 seqc-public\n" + ] + } + ], + "source": [ + "%env AWS_ACCESS_KEY_ID=ASIAYPY66CWMA43XGNEJ\n", + "%env AWS_SECRET_ACCESS_KEY=aZaMEjhh3xSJkidskAJ0WV4s/O7ouBrK8yFcsf/l\n", + "%env AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEEQaCXVzLWVhc3QtMSJGMEQCID4Qg4UtEgPkl2WQvQ4UUGpMt431nkVKIym0DsVgBuGTAiAL4Npy2wqCKNQA9girQJS8FthBwSS+5IXbWJqhcCTISyrvAQgdEAMaDDU4MzY0MzU2NzUxMiIMgLRUFOh6CHjFSLqmKswB044GAT2uqzohaaofARUzyPikiWwSe+Jqan1trQoD5+iG6CU42fPvNjEkHdj9KEiVuNRSYBby810GizNg1EB+vStlYH8b5mSxpSqb1Ptseo1sgmRGuiCvV+saca1yqRbtGOkZ1h0bsjYyWslXqfXi6Taf6lOwiiFKGU7hMJ7Ofnf0Pa559LFnZQcZZrFTENrridhPvxK8bn4LSQSGdVbTfw6bCXaymSCFyPLFCl4Kz4D1LQyVZbUsm3O44PZ+PpIgdFGPB8g+RZPJfLoMMNbntpoGOpkB5ItVgeBBWQK3i+hbfk6s4QLcWr6pyMwu0aLfEX+de3TnkW3cPzTjY5ZPNResL60+vh2Jynf41kHtFkqJlYeZjQ+1ttpml7NQlzMP2GgpR7GvXLdYSViM+rVyVYVc3rwdHCUy6ndtKBNDvdAa8+CS11VKEIGML1eC2Ho/ZmFRdKnIu8uOKP3VzgNk97pOzYmDrGDzD2sVt5/Y\n", + "\n", + "!aws s3 ls" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "# Setup" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# Which pipeline are you running\n", + "prefix = \"Hashtag\" # Workflow to run; also .wdl filename prefix\n", + "output_dirname = \"cellplex_results\"\n", + "\n", + "workflow_dir = glob.glob(f\"{Path.home()}/scing/bin/sharp*\")[0]\n", + "path_to_exec = f\"{workflow_dir}/submit.sh\" # CHANGE THIS FOR SHARP\n", + "\n", + "# Locations of workflow-related directories and files\n", + "path_to_cromwell_secrets = f\"{Path.home()}/.cromwell/cromwell-secrets.json\"\n", + "db_credentials_path = f\"{Path.home()}/.config.json\"" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# Location of docker files\n", + "common_docker_registry = \"quay.io/hisplan\"\n", + "pipeline_type = prefix # field in *.labels.json\n", + "comment = \"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "# Workflow file paths\n", + "config_dir = f\"{workflow_dir}/configs\"\n", + "path_to_options = f\"{workflow_dir}/{prefix}.options.aws.json\"" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "# Set credentials based on SCRIdb CLI config file\n", + "with open(db_credentials_path) as f:\n", + " creds = json.load(f)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Sample information" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
AWS_storageidspeciessc_techproject_idreference
Sample
AT-1716_retrieval_day1_reward2s3://dp-lab-data/collaborators/priya...3872mouse10X_V3.1Memory consolidation VRs3://seqc-public/genomes/mm38_long_p...
\n", + "
" + ], + "text/plain": [ + " AWS_storage id \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 s3://dp-lab-data/collaborators/priya... 3872 \n", + "\n", + " species sc_tech project_id \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 mouse 10X_V3.1 Memory consolidation VR \n", + "\n", + " reference \n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 s3://seqc-public/genomes/mm38_long_p... " + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# You can supply a list of IDs or request IDs\n", + "\n", + "# request_ids = ['AT-1727', 'AT-1734', 'AT-1756']\n", + "# samples = sample_scridb_info(request_ids, 'request_id', creds)\n", + "\n", + "sample_ids = [3872]\n", + "samples = sample_scridb_info(sample_ids, 'id', creds)\n", + "\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
AWS_storageidspeciessc_techproject_idreferencedenseCountMatrixWhitelist_ParamsBarcode_ParamsBarcodes
Sample
AT-1716_retrieval_day1_reward2s3://dp-lab-data/collaborators/priya...3872mouse10X_V3.1Memory consolidation VRs3://seqc-public/genomes/mm38_long_p...[s3://dp-lab-data/collaborators/priy...{'uri': 's3://dp-lab-data/collaborat...{'cb': 16, 'umi': 28, 'conjugation':...[(ATGAGGAATTCCTGC, A0301, sample 2 m...
\n", + "
" + ], + "text/plain": [ + " AWS_storage id \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 s3://dp-lab-data/collaborators/priya... 3872 \n", + "\n", + " species sc_tech project_id \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 mouse 10X_V3.1 Memory consolidation VR \n", + "\n", + " reference \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 s3://seqc-public/genomes/mm38_long_p... \n", + "\n", + " denseCountMatrix \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 [s3://dp-lab-data/collaborators/priy... \n", + "\n", + " Whitelist_Params \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 {'uri': 's3://dp-lab-data/collaborat... \n", + "\n", + " Barcode_Params \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 {'cb': 16, 'umi': 28, 'conjugation':... \n", + "\n", + " Barcodes \n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 [(ATGAGGAATTCCTGC, A0301, sample 2 m... " + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "wl_params = []\n", + "bc_params = []\n", + "bcs = []\n", + "\n", + "for sample, row in samples.iterrows():\n", + " idx = row['id']\n", + " \n", + " wl_params.append(get_wl_params(idx, creds, prefix, row['AWS_storage']))\n", + " bc_params.append(get_bc_params(idx, creds))\n", + " bcs.append(get_bcs(idx, creds))\n", + " samples.loc[sample, 'denseCountMatrix'] = get_denseCountMatrix(row['AWS_storage'])\n", + "\n", + "\n", + "samples[\"Whitelist_Params\"] = wl_params\n", + "samples[\"Barcode_Params\"] = bc_params\n", + "samples[\"Barcodes\"] = bcs\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "IMPORTANT NOTE \n", + "\n", + "Check the name of the folder you are running. Typically the folder that is stored in the database is just the GEX. So if another library is generated (multiome ATAC, VDJ, hashtag, etc) then it needs to be manually changed." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "AT-1716_retrieval_day1_reward2\n", + " PRE AT-1716_retrieval_day1_reward2/\n", + " PRE AT-1716_retrieval_day1_reward2_CPL/\n", + "\n" + ] + } + ], + "source": [ + "# Check the name of the folder you are running\n", + "# Especially if there are multiple libraries (i.e ATAC, TCR_VDJ, etc.)\n", + "\n", + "for sample, row in samples.iterrows():\n", + " print(sample)\n", + " path = os.path.split(row['AWS_storage'])[0] + '/'\n", + " os.system(f'aws s3 ls {path} | grep {sample}')\n", + " print()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['s3://dp-lab-data/collaborators/priya/MemConsolidationVr/AT-1716_retrieval_day1_reward2_CPL']" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples['AWS_storage'] = samples['AWS_storage'] + '_CPL'\n", + "samples['AWS_storage'].tolist()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
AWS_storageidspeciessc_techproject_idreferencedenseCountMatrixWhitelist_ParamsBarcode_ParamsBarcodesFASTQs
Sample
AT-1716_retrieval_day1_reward2s3://dp-lab-data/collaborators/priya...3872mouse10X_V3.1Memory consolidation VRs3://seqc-public/genomes/mm38_long_p...[s3://dp-lab-data/collaborators/priy...{'uri': 's3://dp-lab-data/collaborat...{'cb': 16, 'umi': 28, 'conjugation':...[(ATGAGGAATTCCTGC, A0301, sample 2 m...{'R1': ['s3://dp-lab-data/collaborat...
\n", + "
" + ], + "text/plain": [ + " AWS_storage id \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 s3://dp-lab-data/collaborators/priya... 3872 \n", + "\n", + " species sc_tech project_id \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 mouse 10X_V3.1 Memory consolidation VR \n", + "\n", + " reference \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 s3://seqc-public/genomes/mm38_long_p... \n", + "\n", + " denseCountMatrix \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 [s3://dp-lab-data/collaborators/priy... \n", + "\n", + " Whitelist_Params \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 {'uri': 's3://dp-lab-data/collaborat... \n", + "\n", + " Barcode_Params \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 {'cb': 16, 'umi': 28, 'conjugation':... \n", + "\n", + " Barcodes \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 [(ATGAGGAATTCCTGC, A0301, sample 2 m... \n", + "\n", + " FASTQs \n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 {'R1': ['s3://dp-lab-data/collaborat... " + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples[\"FASTQs\"] = samples[\"AWS_storage\"].apply(lambda x: get_fastqs(x, fastq_map[prefix], \"FASTQ\"))\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "IMPORTANT NOTE\n", + "\n", + "Make sure that your files are not archived. The following command will print any FASTQ file that is archived. Unarchive the files and then come back to processing the sample." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "AT-1716_retrieval_day1_reward2\n" + ] + } + ], + "source": [ + "for sample, row in samples.iterrows():\n", + " print(sample)\n", + " fastqs = np.ravel(list(row['FASTQs'].values()))\n", + " dirnames = set([os.path.dirname(x) for x in fastqs])\n", + " \n", + " for dirname in dirnames:\n", + " file = dirname.replace('s3://', '')\n", + " \n", + " bucket = file.split('/')[0]\n", + " pre = file.replace(f'{bucket}/', '')\n", + " \n", + " !aws s3api list-objects-v2 --bucket $bucket --prefix $pre --query \"Contents[?StorageClass!='STANDARD'].Key\" --output text " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Upload the barcodes to AWS" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "bbe001baf6b441a69314b161b51e6c35", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/1 [00:00IMPORTANT NOTE\n", + "\n", + "Check what version of 10x you are using if you are using the outputs of SEQC to generate your whitelist!" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['10X_V3.1']" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples['sc_tech'].unique().tolist()" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "platform = '10x_v3'" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Hashtag.uriFastqR1Hashtag.uriFastqR2Hashtag.sampleNameHashtag.scRnaSeqPlatformHashtag.lengthR1Hashtag.lengthR2Hashtag.cellBarcodeWhitelistUriHashtag.cellBarcodeWhiteListMethodHashtag.translate10XBarcodesHashtag.hashTagList...Hashtag.umiEndPosHashtag.slidingWindowSearchHashtag.cbCollapsingDistanceHashtag.umiCollapsingDistanceHashtag.numExpectedCellsHashtag.minCountHashtag.denseCountMatrixHashtag.resourceSpecHashtag.demuxModeHashtag.dockerRegistry
Sample
AT-1716_retrieval_day1_reward2[s3://dp-lab-data/collaborators/priy...[s3://dp-lab-data/collaborators/priy...AT-1716_retrieval_day1_reward210x_v32815s3://dp-lab-data/collaborators/priya...SeqcDenseCountsMatrixCsvTrues3://dp-lab-data/collaborators/priya......28False11010[s3://dp-lab-data/collaborators/priy...{'cpu': 32, 'memory': -1}1quay.io/hisplan
\n", + "

1 rows × 23 columns

\n", + "
" + ], + "text/plain": [ + " Hashtag.uriFastqR1 \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 [s3://dp-lab-data/collaborators/priy... \n", + "\n", + " Hashtag.uriFastqR2 \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 [s3://dp-lab-data/collaborators/priy... \n", + "\n", + " Hashtag.sampleName \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 AT-1716_retrieval_day1_reward2 \n", + "\n", + " Hashtag.scRnaSeqPlatform Hashtag.lengthR1 \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 10x_v3 28 \n", + "\n", + " Hashtag.lengthR2 \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 15 \n", + "\n", + " Hashtag.cellBarcodeWhitelistUri \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 s3://dp-lab-data/collaborators/priya... \n", + "\n", + " Hashtag.cellBarcodeWhiteListMethod \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 SeqcDenseCountsMatrixCsv \n", + "\n", + " Hashtag.translate10XBarcodes \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 True \n", + "\n", + " Hashtag.hashTagList ... \\\n", + "Sample ... \n", + "AT-1716_retrieval_day1_reward2 s3://dp-lab-data/collaborators/priya... ... \n", + "\n", + " Hashtag.umiEndPos \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 28 \n", + "\n", + " Hashtag.slidingWindowSearch \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 False \n", + "\n", + " Hashtag.cbCollapsingDistance \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 1 \n", + "\n", + " Hashtag.umiCollapsingDistance \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 1 \n", + "\n", + " Hashtag.numExpectedCells Hashtag.minCount \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 0 10 \n", + "\n", + " Hashtag.denseCountMatrix \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 [s3://dp-lab-data/collaborators/priy... \n", + "\n", + " Hashtag.resourceSpec Hashtag.demuxMode \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 {'cpu': 32, 'memory': -1} 1 \n", + "\n", + " Hashtag.dockerRegistry \n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 quay.io/hisplan \n", + "\n", + "[1 rows x 23 columns]" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Standard inputs, modify fields as need be\n", + "\n", + "# Load minimum inputs and labels fields from templates\n", + "with open(f\"{config_dir}/cellplex.inputs.json\") as f:\n", + " std_inputs_fields = list(json.load(f).keys())\n", + " \n", + "# Annotate all samples with workflow inputs and labels\n", + "inputs = pd.DataFrame(index=samples.index, columns=std_inputs_fields,)\n", + "fastq_file_ids = fastq_map[prefix]\n", + "\n", + "# Annotate inputs\n", + "inputs[f\"{prefix}.sampleName\"] = samples.index\n", + "inputs[f\"{prefix}.scRnaSeqPlatform\"] = platform \n", + "\n", + "inputs[f\"{prefix}.lengthR1\"] = samples[\"Barcode_Params\"].apply(lambda x: x[\"umi\"])\n", + "inputs[f\"{prefix}.lengthR2\"] = samples[\"Barcode_Params\"].apply(lambda x: x[\"seq_length\"])\n", + "\n", + "inputs[f\"{prefix}.cbStartPos\"] = 1\n", + "inputs[f\"{prefix}.cbEndPos\"] = samples[\"Barcode_Params\"].apply(lambda x: x[\"cb\"])\n", + "inputs[f\"{prefix}.umiEndPos\"] = samples[\"Barcode_Params\"].apply(lambda x: x[\"umi\"])\n", + "inputs[f\"{prefix}.umiStartPos\"] = inputs[f\"{prefix}.cbEndPos\"] + 1\n", + "\n", + "# inputs[f\"{prefix}.trimPos\"] = samples[\"Barcode_Params\"].apply(lambda x: x[\"bp_shift\"])\n", + "\n", + "inputs[f\"{prefix}.cellBarcodeWhitelistUri\"] = samples[\"Whitelist_Params\"].apply(lambda x: x[\"uri\"])\n", + "inputs[f\"{prefix}.cellBarcodeWhiteListMethod\"] = samples[\"Whitelist_Params\"].apply(lambda x: x[\"method\"])\n", + "\n", + "inputs[f\"{prefix}.translate10XBarcodes\"] = True\n", + "\n", + "inputs[f\"{prefix}.hashTagList\"] = samples[\"AWS_storage\"] + f\"/{output_dirname}/tag-list.csv\" \n", + "inputs[f\"{prefix}.denseCountMatrix\"] = samples[\"denseCountMatrix\"]\n", + "\n", + "\n", + "for file_id in fastq_file_ids: # Set FASTQs\n", + " inputs[f\"{prefix}.uriFastq{file_id}\"] = samples[\"FASTQs\"].apply(lambda x: x[file_id])\n", + "\n", + "# ********************\n", + "# Defaults\n", + "# Note: These may need to be changed on a per-sample or per-execution basis\n", + "\n", + "inputs[f\"{prefix}.slidingWindowSearch\"] = False\n", + "inputs[f\"{prefix}.cbCollapsingDistance\"] = 1\n", + "inputs[f\"{prefix}.umiCollapsingDistance\"] = 1\n", + "inputs[f\"{prefix}.numExpectedCells\"] = 0\n", + "# Need trick to set dictionary for each row\n", + "common_resource_spec = {\n", + " \"cpu\": 32,\n", + " \"memory\": -1,\n", + "}\n", + "inputs[f\"{prefix}.resourceSpec\"] = inputs.iloc[:, 0].apply(lambda x: common_resource_spec)\n", + "if prefix == \"Hashtag\":\n", + " inputs[f\"{prefix}.minCount\"] = 10\n", + "inputs[f\"{prefix}.demuxMode\"] = 1\n", + "inputs[f\"{prefix}.dockerRegistry\"] = common_docker_registry\n", + "\n", + "inputs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Generate labels" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
pipelineTypeprojectsampleownerdestinationtransfercomment
Sample
AT-1716_retrieval_day1_reward2HashtagMemory consolidation VRAT-1716_retrieval_day1_reward2sohailns3://dp-lab-data/collaborators/priya...-sohailn
\n", + "
" + ], + "text/plain": [ + " pipelineType project \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 Hashtag Memory consolidation VR \n", + "\n", + " sample owner \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 AT-1716_retrieval_day1_reward2 sohailn \n", + "\n", + " destination \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 s3://dp-lab-data/collaborators/priya... \n", + "\n", + " transfer comment \n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 - sohailn " + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Standard labels, modify fields as need be\n", + "\n", + "with open(f\"{config_dir}/cellplex.labels.json\") as f:\n", + " std_labels_fields = list(json.load(f).keys())\n", + " \n", + "# Annotate all samples with workflow inputs and labels\n", + "labels = pd.DataFrame(index=samples.index, columns=std_labels_fields,)\n", + "\n", + "labels[\"pipelineType\"] = pipeline_type\n", + "labels[\"project\"] = samples['project_id']\n", + "labels[\"sample\"] = labels.index\n", + "labels[\"owner\"] = creds[\"user\"]\n", + "labels[\"destination\"] = samples['AWS_storage'] + \"/\" + output_dirname\n", + "labels[\"transfer\"] = \"-\"\n", + "labels[\"comment\"] = creds[\"user\"]\n", + "\n", + "labels" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Run samples" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Look over the samples before submitting one last time" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Hashtag.uriFastqR1Hashtag.uriFastqR2Hashtag.sampleNameHashtag.scRnaSeqPlatformHashtag.lengthR1Hashtag.lengthR2Hashtag.cellBarcodeWhitelistUriHashtag.cellBarcodeWhiteListMethodHashtag.translate10XBarcodesHashtag.hashTagList...Hashtag.umiEndPosHashtag.slidingWindowSearchHashtag.cbCollapsingDistanceHashtag.umiCollapsingDistanceHashtag.numExpectedCellsHashtag.minCountHashtag.denseCountMatrixHashtag.resourceSpecHashtag.demuxModeHashtag.dockerRegistry
Sample
AT-1716_retrieval_day1_reward2[s3://dp-lab-data/collaborators/priy...[s3://dp-lab-data/collaborators/priy...AT-1716_retrieval_day1_reward210x_v32815s3://dp-lab-data/collaborators/priya...SeqcDenseCountsMatrixCsvTrues3://dp-lab-data/collaborators/priya......28False11010[s3://dp-lab-data/collaborators/priy...{'cpu': 32, 'memory': -1}1quay.io/hisplan
\n", + "

1 rows × 23 columns

\n", + "
" + ], + "text/plain": [ + " Hashtag.uriFastqR1 \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 [s3://dp-lab-data/collaborators/priy... \n", + "\n", + " Hashtag.uriFastqR2 \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 [s3://dp-lab-data/collaborators/priy... \n", + "\n", + " Hashtag.sampleName \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 AT-1716_retrieval_day1_reward2 \n", + "\n", + " Hashtag.scRnaSeqPlatform Hashtag.lengthR1 \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 10x_v3 28 \n", + "\n", + " Hashtag.lengthR2 \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 15 \n", + "\n", + " Hashtag.cellBarcodeWhitelistUri \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 s3://dp-lab-data/collaborators/priya... \n", + "\n", + " Hashtag.cellBarcodeWhiteListMethod \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 SeqcDenseCountsMatrixCsv \n", + "\n", + " Hashtag.translate10XBarcodes \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 True \n", + "\n", + " Hashtag.hashTagList ... \\\n", + "Sample ... \n", + "AT-1716_retrieval_day1_reward2 s3://dp-lab-data/collaborators/priya... ... \n", + "\n", + " Hashtag.umiEndPos \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 28 \n", + "\n", + " Hashtag.slidingWindowSearch \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 False \n", + "\n", + " Hashtag.cbCollapsingDistance \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 1 \n", + "\n", + " Hashtag.umiCollapsingDistance \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 1 \n", + "\n", + " Hashtag.numExpectedCells Hashtag.minCount \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 0 10 \n", + "\n", + " Hashtag.denseCountMatrix \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 [s3://dp-lab-data/collaborators/priy... \n", + "\n", + " Hashtag.resourceSpec Hashtag.demuxMode \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 {'cpu': 32, 'memory': -1} 1 \n", + "\n", + " Hashtag.dockerRegistry \n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 quay.io/hisplan \n", + "\n", + "[1 rows x 23 columns]" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "inputs" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
pipelineTypeprojectsampleownerdestinationtransfercomment
Sample
AT-1716_retrieval_day1_reward2HashtagMemory consolidation VRAT-1716_retrieval_day1_reward2sohailns3://dp-lab-data/collaborators/priya...-sohailn
\n", + "
" + ], + "text/plain": [ + " pipelineType project \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 Hashtag Memory consolidation VR \n", + "\n", + " sample owner \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 AT-1716_retrieval_day1_reward2 sohailn \n", + "\n", + " destination \\\n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 s3://dp-lab-data/collaborators/priya... \n", + "\n", + " transfer comment \n", + "Sample \n", + "AT-1716_retrieval_day1_reward2 - sohailn " + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "labels" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c05a538993d14466bfb6fc22d25bbbfa", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/1 [00:00 Date: Mon, 17 Oct 2022 17:55:22 -0400 Subject: [PATCH 15/16] typo --- notebooks/Run_Sharp_CellRangerCellPlex.ipynb | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/notebooks/Run_Sharp_CellRangerCellPlex.ipynb b/notebooks/Run_Sharp_CellRangerCellPlex.ipynb index b297e64..31865ac 100644 --- a/notebooks/Run_Sharp_CellRangerCellPlex.ipynb +++ b/notebooks/Run_Sharp_CellRangerCellPlex.ipynb @@ -45,16 +45,13 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 33, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "env: AWS_ACCESS_KEY_ID=ASIAYPY66CWMA43XGNEJ\n", - "env: AWS_SECRET_ACCESS_KEY=aZaMEjhh3xSJkidskAJ0WV4s/O7ouBrK8yFcsf/l\n", - "env: AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEEQaCXVzLWVhc3QtMSJGMEQCID4Qg4UtEgPkl2WQvQ4UUGpMt431nkVKIym0DsVgBuGTAiAL4Npy2wqCKNQA9girQJS8FthBwSS+5IXbWJqhcCTISyrvAQgdEAMaDDU4MzY0MzU2NzUxMiIMgLRUFOh6CHjFSLqmKswB044GAT2uqzohaaofARUzyPikiWwSe+Jqan1trQoD5+iG6CU42fPvNjEkHdj9KEiVuNRSYBby810GizNg1EB+vStlYH8b5mSxpSqb1Ptseo1sgmRGuiCvV+saca1yqRbtGOkZ1h0bsjYyWslXqfXi6Taf6lOwiiFKGU7hMJ7Ofnf0Pa559LFnZQcZZrFTENrridhPvxK8bn4LSQSGdVbTfw6bCXaymSCFyPLFCl4Kz4D1LQyVZbUsm3O44PZ+PpIgdFGPB8g+RZPJfLoMMNbntpoGOpkB5ItVgeBBWQK3i+hbfk6s4QLcWr6pyMwu0aLfEX+de3TnkW3cPzTjY5ZPNResL60+vh2Jynf41kHtFkqJlYeZjQ+1ttpml7NQlzMP2GgpR7GvXLdYSViM+rVyVYVc3rwdHCUy6ndtKBNDvdAa8+CS11VKEIGML1eC2Ho/ZmFRdKnIu8uOKP3VzgNk97pOzYmDrGDzD2sVt5/Y\n", "2021-10-07 15:31:32 agc-583643567512-us-east-1\n", "2021-10-07 15:28:07 cdktoolkit-stagingbucket-d49u1xfb0sc4\n", "2019-10-09 13:04:06 cf-templates-umiwbnq3566w-us-east-1\n", @@ -73,10 +70,6 @@ } ], "source": [ - "%env AWS_ACCESS_KEY_ID=ASIAYPY66CWMA43XGNEJ\n", - "%env AWS_SECRET_ACCESS_KEY=aZaMEjhh3xSJkidskAJ0WV4s/O7ouBrK8yFcsf/l\n", - "%env AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEEQaCXVzLWVhc3QtMSJGMEQCID4Qg4UtEgPkl2WQvQ4UUGpMt431nkVKIym0DsVgBuGTAiAL4Npy2wqCKNQA9girQJS8FthBwSS+5IXbWJqhcCTISyrvAQgdEAMaDDU4MzY0MzU2NzUxMiIMgLRUFOh6CHjFSLqmKswB044GAT2uqzohaaofARUzyPikiWwSe+Jqan1trQoD5+iG6CU42fPvNjEkHdj9KEiVuNRSYBby810GizNg1EB+vStlYH8b5mSxpSqb1Ptseo1sgmRGuiCvV+saca1yqRbtGOkZ1h0bsjYyWslXqfXi6Taf6lOwiiFKGU7hMJ7Ofnf0Pa559LFnZQcZZrFTENrridhPvxK8bn4LSQSGdVbTfw6bCXaymSCFyPLFCl4Kz4D1LQyVZbUsm3O44PZ+PpIgdFGPB8g+RZPJfLoMMNbntpoGOpkB5ItVgeBBWQK3i+hbfk6s4QLcWr6pyMwu0aLfEX+de3TnkW3cPzTjY5ZPNResL60+vh2Jynf41kHtFkqJlYeZjQ+1ttpml7NQlzMP2GgpR7GvXLdYSViM+rVyVYVc3rwdHCUy6ndtKBNDvdAa8+CS11VKEIGML1eC2Ho/ZmFRdKnIu8uOKP3VzgNk97pOzYmDrGDzD2sVt5/Y\n", - "\n", "!aws s3 ls" ] }, From 47eda164ca97db3861cb38e84917ab3aedacdab6 Mon Sep 17 00:00:00 2001 From: nsohail19 Date: Thu, 13 Apr 2023 08:52:15 -0400 Subject: [PATCH 16/16] Updated notebooks --- .gitignore | 1 + notebooks/Run_CellRangerArc.ipynb | 293 +- notebooks/Run_CellRangerArc_new.ipynb | 1070 +++++++ notebooks/Run_CellRangerAtac.ipynb | 495 +-- notebooks/Run_CellRangerGex.ipynb | 1106 ++++--- notebooks/Run_MitoTracing.ipynb | 178 +- notebooks/Run_MitoTracing_joe.ipynb | 2757 +++++++++++++++++ notebooks/Run_MitoTracing_joe_new.ipynb | 1896 ++++++++++++ notebooks/Run_MitoTracing_new.ipynb | 1374 ++++++++ notebooks/Run_SeqcAda.ipynb | 484 +++ notebooks/Run_SeqcAda_WIP.ipynb | 244 +- notebooks/Run_Sharp.ipynb | 1744 +++++++++-- notebooks/Run_Sharp_CellRangerCellPlex.ipynb | 803 +++-- notebooks/Run_Sharp_Hashtag.ipynb | 1655 ++++++++++ notebooks/Run_Transgenes_new.ipynb | 439 +++ notebooks/Run_Unarchive.ipynb | 2316 ++++++++++++++ notebooks/Untitled.ipynb | 1029 ++++++ notebooks/barcodes/AT-1447_Ret_R1.QC.h5ad | Bin 0 -> 4944016 bytes .../barcodes/AT-1447_Ret_R1_tag-list.csv | 3 + .../barcodes/AT-1447_Ret_R2_tag-list.csv | 3 + ...T-1716_retrieval_day1_reward2_tag-list.csv | 6 + ...1727_retrieval_day_8_reward_1_tag-list.csv | 3 + ...1727_retrieval_day_8_reward_2_tag-list.csv | 3 + ...734_retrieval_day_15_reward_1_tag-list.csv | 3 + ...734_retrieval_day_15_reward_2_tag-list.csv | 3 + ...756_retrieval_day_15_reward_1_tag-list.csv | 3 + ...756_retrieval_day_15_reward_2_tag-list.csv | 3 + notebooks/barcodes/check_sharp_quality.ipynb | 103 + notebooks/joe_samples.csv | 27 + notebooks/joe_samples_unarchive.txt | 14 + notebooks/updated.txt | 7 + notebooks/utils/utils.py | 274 +- 32 files changed, 16759 insertions(+), 1580 deletions(-) create mode 100644 notebooks/Run_CellRangerArc_new.ipynb create mode 100644 notebooks/Run_MitoTracing_joe.ipynb create mode 100644 notebooks/Run_MitoTracing_joe_new.ipynb create mode 100644 notebooks/Run_MitoTracing_new.ipynb create mode 100644 notebooks/Run_SeqcAda.ipynb create mode 100644 notebooks/Run_Sharp_Hashtag.ipynb create mode 100644 notebooks/Run_Transgenes_new.ipynb create mode 100644 notebooks/Run_Unarchive.ipynb create mode 100644 notebooks/Untitled.ipynb create mode 100644 notebooks/barcodes/AT-1447_Ret_R1.QC.h5ad create mode 100644 notebooks/barcodes/AT-1447_Ret_R1_tag-list.csv create mode 100644 notebooks/barcodes/AT-1447_Ret_R2_tag-list.csv create mode 100644 notebooks/barcodes/AT-1716_retrieval_day1_reward2_tag-list.csv create mode 100644 notebooks/barcodes/AT-1727_retrieval_day_8_reward_1_tag-list.csv create mode 100644 notebooks/barcodes/AT-1727_retrieval_day_8_reward_2_tag-list.csv create mode 100644 notebooks/barcodes/AT-1734_retrieval_day_15_reward_1_tag-list.csv create mode 100644 notebooks/barcodes/AT-1734_retrieval_day_15_reward_2_tag-list.csv create mode 100644 notebooks/barcodes/AT-1756_retrieval_day_15_reward_1_tag-list.csv create mode 100644 notebooks/barcodes/AT-1756_retrieval_day_15_reward_2_tag-list.csv create mode 100644 notebooks/barcodes/check_sharp_quality.ipynb create mode 100644 notebooks/joe_samples.csv create mode 100644 notebooks/joe_samples_unarchive.txt create mode 100644 notebooks/updated.txt diff --git a/.gitignore b/.gitignore index 0c04a67..5357979 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +notebooks/web_summary/ .DS_Store __pycache__ .ipynb_checkpoints diff --git a/notebooks/Run_CellRangerArc.ipynb b/notebooks/Run_CellRangerArc.ipynb index b1c1801..c0b2881 100644 --- a/notebooks/Run_CellRangerArc.ipynb +++ b/notebooks/Run_CellRangerArc.ipynb @@ -1,5 +1,110 @@ { "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# OLD" + ] + }, { "cell_type": "code", "execution_count": 1, @@ -16,6 +121,20 @@ "pd.set_option(\"display.max_colwidth\", 40)" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "code", "execution_count": 2, @@ -45,7 +164,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -152,7 +271,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -161,7 +280,7 @@ "\n", "prefix = \"CellRangerArc\" # Workflow to run; also .wdl filename prefix\n", "pipeline_type = prefix # field in *.labels.json\n", - "output_dirname = \"cr-arc-results\"\n", + "output_dirname = \"mito_cr-arc-results\"\n", "\n", "# If need to add comment, put here\n", "comment = \"\"" @@ -169,7 +288,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -186,7 +305,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ @@ -204,16 +323,16 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "env: AWS_ACCESS_KEY_ID=ASIAYPY66CWMM475H4B4\n", - "env: AWS_SECRET_ACCESS_KEY=5s4fMZY42VqVqvVXchw8MoWWLoCHPePCT/iaobVn\n", - "env: AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEHQaCXVzLWVhc3QtMSJHMEUCIEmU/p6WjjzI7fCYC+diFIWv/XfWHDLEP+Q51F7oCSSxAiEA85U4OfdDL/0cNtyl4SfhJ/ll5yC0FdtY2Sqs24CslxQq7wEIfRADGgw1ODM2NDM1Njc1MTIiDGl5lBQDjdScIm9vwirMASko/yjqyG4oI8bRrXZ4f02tqdBqwbCM0Wh4UdVidGfVJbL1pw0g6qz9+GnjNgrBJa49P/CvVt4ITUKFqfNlmavSxZ62XMO0FSMcCL6T94v3dGXuqF1rTh76K3L824o5o51y6AHpQ7dq57aFQp+xUnZyJLiaUIzBANOqDTR8Z/aPwow59Fc6Kqpt3B9iY1wRORg5SqQiiRK+h5MhyQBkmxujkdJdkHvuvV3FShoqHOX+Bk/IcwoXiXKKRkOzCl46gC4dvlUEB1AmL/BdXzD4np6VBjqYASCRdo8/YHCKDG3HJeFN7tsbp22/myHH+OF68VEPq98RaZNX91hX4io8iXbZniEPTmi9fEHmTfEg70GLv/TBNqNKLhm0NL1cA8hx996G8qqEcx1m18oeqvV+7WsyGc/6d0feXzV741v4KBN/R3BxhaZYAWF0OsKbfKx0HBgmJ6jKqwu1f4FNwufRJ3ST+w+0txaUebY0R5nO\n", + "env: AWS_ACCESS_KEY_ID=ASIAYPY66CWMIRDUREVH\n", + "env: AWS_SECRET_ACCESS_KEY=N85006UCgijp8CGqzDy0MqLiz/hI/oGV8uSdmpTc\n", + "env: AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEPv//////////wEaCXVzLWVhc3QtMSJHMEUCIQCqvxhWToi0KBwHNijvb9qersxDpPG+R9BY+2giQIgkWAIgSJHSQm8qENlVPnLIbJRoLh/P+0JY8vFmy89VKMIYmZYq+AEIxP//////////ARAEGgw1ODM2NDM1Njc1MTIiDGCfleiZCLh2Drd32irMAckv+DjF7GsRWDiNgxyfABRKUSrzNgSHdpkOKXZ3SE+1Ly0lob1mgtBH7eXLG73OO/SgG5CoxD74kTDoE/0Ofcr8tTuvwE64e5g6Jj4YR5ZR3YW7bWbn+C5OKr/CQu3oepGM6bBVDA43DsNXtDPmQhfpYj8LxT4uMocOUGyEDKZKyNh8T5+1ttt7BUv9zHz63zJcpsIMOB0+l+P2NV7xPWuPabuj3IOFpnCgzZxm4OSQytUTV1pLdIpsksl9hX2A0i2jCQohESGkbLb6RDDMvvKgBjqYAesAHvWnvogi9HG1gGztGKFkxIwhnqBc9Jcn+/lQDFRz6yQTOIsVaujBvMFSjoa8mFvp+eNCHWoXlbJrsAUgQjTuCnO5ZWjMotI+tJe/VzE5R3GynOGv4f7zNGfossJ0rqKi1Xku7KG61NF18BrhRNQk4QEcf8Uq6oaSjfnNm2GMwu2GfClpeb8C/UTFkTJXSQRIDddxn227\n", "2021-10-07 15:31:32 agc-583643567512-us-east-1\n", "2021-10-07 15:28:07 cdktoolkit-stagingbucket-d49u1xfb0sc4\n", "2019-10-09 13:04:06 cf-templates-umiwbnq3566w-us-east-1\n", @@ -232,9 +351,9 @@ } ], "source": [ - "%env AWS_ACCESS_KEY_ID=ASIAYPY66CWMM475H4B4\n", - "%env AWS_SECRET_ACCESS_KEY=5s4fMZY42VqVqvVXchw8MoWWLoCHPePCT/iaobVn\n", - "%env AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEHQaCXVzLWVhc3QtMSJHMEUCIEmU/p6WjjzI7fCYC+diFIWv/XfWHDLEP+Q51F7oCSSxAiEA85U4OfdDL/0cNtyl4SfhJ/ll5yC0FdtY2Sqs24CslxQq7wEIfRADGgw1ODM2NDM1Njc1MTIiDGl5lBQDjdScIm9vwirMASko/yjqyG4oI8bRrXZ4f02tqdBqwbCM0Wh4UdVidGfVJbL1pw0g6qz9+GnjNgrBJa49P/CvVt4ITUKFqfNlmavSxZ62XMO0FSMcCL6T94v3dGXuqF1rTh76K3L824o5o51y6AHpQ7dq57aFQp+xUnZyJLiaUIzBANOqDTR8Z/aPwow59Fc6Kqpt3B9iY1wRORg5SqQiiRK+h5MhyQBkmxujkdJdkHvuvV3FShoqHOX+Bk/IcwoXiXKKRkOzCl46gC4dvlUEB1AmL/BdXzD4np6VBjqYASCRdo8/YHCKDG3HJeFN7tsbp22/myHH+OF68VEPq98RaZNX91hX4io8iXbZniEPTmi9fEHmTfEg70GLv/TBNqNKLhm0NL1cA8hx996G8qqEcx1m18oeqvV+7WsyGc/6d0feXzV741v4KBN/R3BxhaZYAWF0OsKbfKx0HBgmJ6jKqwu1f4FNwufRJ3ST+w+0txaUebY0R5nO\n", + "%env AWS_ACCESS_KEY_ID=ASIAYPY66CWMIRDUREVH\n", + "%env AWS_SECRET_ACCESS_KEY=N85006UCgijp8CGqzDy0MqLiz/hI/oGV8uSdmpTc\n", + "%env AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEPv//////////wEaCXVzLWVhc3QtMSJHMEUCIQCqvxhWToi0KBwHNijvb9qersxDpPG+R9BY+2giQIgkWAIgSJHSQm8qENlVPnLIbJRoLh/P+0JY8vFmy89VKMIYmZYq+AEIxP//////////ARAEGgw1ODM2NDM1Njc1MTIiDGCfleiZCLh2Drd32irMAckv+DjF7GsRWDiNgxyfABRKUSrzNgSHdpkOKXZ3SE+1Ly0lob1mgtBH7eXLG73OO/SgG5CoxD74kTDoE/0Ofcr8tTuvwE64e5g6Jj4YR5ZR3YW7bWbn+C5OKr/CQu3oepGM6bBVDA43DsNXtDPmQhfpYj8LxT4uMocOUGyEDKZKyNh8T5+1ttt7BUv9zHz63zJcpsIMOB0+l+P2NV7xPWuPabuj3IOFpnCgzZxm4OSQytUTV1pLdIpsksl9hX2A0i2jCQohESGkbLb6RDDMvvKgBjqYAesAHvWnvogi9HG1gGztGKFkxIwhnqBc9Jcn+/lQDFRz6yQTOIsVaujBvMFSjoa8mFvp+eNCHWoXlbJrsAUgQjTuCnO5ZWjMotI+tJe/VzE5R3GynOGv4f7zNGfossJ0rqKi1Xku7KG61NF18BrhRNQk4QEcf8Uq6oaSjfnNm2GMwu2GfClpeb8C/UTFkTJXSQRIDddxn227\n", "!aws s3 ls" ] }, @@ -254,138 +373,27 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 15, "metadata": {}, "outputs": [ { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
S3_PathSample_ID
JR-1603_Mm_veh_CSF_multiomes3://dp-lab-data/collaborators/aboir...3708
JR-1603_LM_CSF_multiomes3://dp-lab-data/collaborators/aboir...3709
JR-1603_LPS_CSF_multiomes3://dp-lab-data/collaborators/aboir...3710
JR-1603_LM_blood_multiomes3://dp-lab-data/collaborators/aboir...3711
JR-1603_LPS_blood_multiomes3://dp-lab-data/collaborators/aboir...3712
JR-1603_veh_blood_multiomes3://dp-lab-data/collaborators/aboir...3713
JR-1603_Mm_veh_CSF_multiome_ATACs3://dp-lab-data/collaborators/aboir...3714
JR-1603_LM_CSF_multiome_ATACs3://dp-lab-data/collaborators/aboir...3715
JR-1603_LPS_CSF_multiome_ATACs3://dp-lab-data/collaborators/aboir...3716
JR-1603_veh_blood_multiome_ATACs3://dp-lab-data/collaborators/aboir...3717
JR-1603_LM_blood_multiome_ATACs3://dp-lab-data/collaborators/aboir...3718
JR-1603_LPS_blood_multiome_ATACs3://dp-lab-data/collaborators/aboir...3719
\n", - "
" - ], - "text/plain": [ - " S3_Path \\\n", - "JR-1603_Mm_veh_CSF_multiome s3://dp-lab-data/collaborators/aboir... \n", - "JR-1603_LM_CSF_multiome s3://dp-lab-data/collaborators/aboir... \n", - "JR-1603_LPS_CSF_multiome s3://dp-lab-data/collaborators/aboir... \n", - "JR-1603_LM_blood_multiome s3://dp-lab-data/collaborators/aboir... \n", - "JR-1603_LPS_blood_multiome s3://dp-lab-data/collaborators/aboir... \n", - "JR-1603_veh_blood_multiome s3://dp-lab-data/collaborators/aboir... \n", - "JR-1603_Mm_veh_CSF_multiome_ATAC s3://dp-lab-data/collaborators/aboir... \n", - "JR-1603_LM_CSF_multiome_ATAC s3://dp-lab-data/collaborators/aboir... \n", - "JR-1603_LPS_CSF_multiome_ATAC s3://dp-lab-data/collaborators/aboir... \n", - "JR-1603_veh_blood_multiome_ATAC s3://dp-lab-data/collaborators/aboir... \n", - "JR-1603_LM_blood_multiome_ATAC s3://dp-lab-data/collaborators/aboir... \n", - "JR-1603_LPS_blood_multiome_ATAC s3://dp-lab-data/collaborators/aboir... \n", - "\n", - " Sample_ID \n", - "JR-1603_Mm_veh_CSF_multiome 3708 \n", - "JR-1603_LM_CSF_multiome 3709 \n", - "JR-1603_LPS_CSF_multiome 3710 \n", - "JR-1603_LM_blood_multiome 3711 \n", - "JR-1603_LPS_blood_multiome 3712 \n", - "JR-1603_veh_blood_multiome 3713 \n", - "JR-1603_Mm_veh_CSF_multiome_ATAC 3714 \n", - "JR-1603_LM_CSF_multiome_ATAC 3715 \n", - "JR-1603_LPS_CSF_multiome_ATAC 3716 \n", - "JR-1603_veh_blood_multiome_ATAC 3717 \n", - "JR-1603_LM_blood_multiome_ATAC 3718 \n", - "JR-1603_LPS_blood_multiome_ATAC 3719 " - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" + "ename": "TypeError", + "evalue": "execute_query() takes 2 positional arguments but 3 were given", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "Input \u001b[0;32mIn [15]\u001b[0m, in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;66;03m# Common query col: id, request_id, Sample\u001b[39;00m\n\u001b[1;32m 3\u001b[0m request_ids \u001b[38;5;241m=\u001b[39m [\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mAE-2166\u001b[39m\u001b[38;5;124m'\u001b[39m]\n\u001b[0;32m----> 5\u001b[0m samples \u001b[38;5;241m=\u001b[39m \u001b[43mformat_sample_aws\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrequest_ids\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mrequest_id\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcreds\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 6\u001b[0m samples\n", + "Input \u001b[0;32mIn [10]\u001b[0m, in \u001b[0;36mformat_sample_aws\u001b[0;34m(querys, query_col, creds)\u001b[0m\n\u001b[1;32m 67\u001b[0m sample_ids \u001b[38;5;241m=\u001b[39m []\n\u001b[1;32m 69\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m query \u001b[38;5;129;01min\u001b[39;00m querys:\n\u001b[0;32m---> 70\u001b[0m sample_names \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[43mget_sample_name\u001b[49m\u001b[43m(\u001b[49m\u001b[43mquery\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mquery_col\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcreds\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 71\u001b[0m sample_paths \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m get_aws_path(query, query_col, creds)\n\u001b[1;32m 72\u001b[0m sample_ids \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m get_sample_id(query, query_col, creds)\n", + "Input \u001b[0;32mIn [10]\u001b[0m, in \u001b[0;36mget_sample_name\u001b[0;34m(query, query_col, creds)\u001b[0m\n\u001b[1;32m 9\u001b[0m query \u001b[38;5;241m=\u001b[39m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\"\"\u001b[39m\n\u001b[1;32m 10\u001b[0m \u001b[38;5;124mSELECT \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mtable_sample_data\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m.Sample\u001b[39m\n\u001b[1;32m 11\u001b[0m \u001b[38;5;124mFROM \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mtable_sample_data\u001b[38;5;132;01m}\u001b[39;00m\n\u001b[1;32m 12\u001b[0m \u001b[38;5;124mWHERE \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mtable_sample_data\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m.\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mquery_col\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mquery\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 13\u001b[0m \u001b[38;5;124m\u001b[39m\u001b[38;5;124m\"\"\"\u001b[39m\n\u001b[1;32m 14\u001b[0m sample_names \u001b[38;5;241m=\u001b[39m []\n\u001b[0;32m---> 15\u001b[0m results \u001b[38;5;241m=\u001b[39m \u001b[43mexecute_query\u001b[49m\u001b[43m(\u001b[49m\u001b[43mquery\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43muser\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpassword\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 16\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m result \u001b[38;5;129;01min\u001b[39;00m results:\n\u001b[1;32m 17\u001b[0m sample_names\u001b[38;5;241m.\u001b[39mappend(result[\u001b[38;5;241m0\u001b[39m])\n", + "\u001b[0;31mTypeError\u001b[0m: execute_query() takes 2 positional arguments but 3 were given" + ] } ], "source": [ "# Common query col: id, request_id, Sample\n", "\n", - "request_ids = ['JR-1603']\n", + "request_ids = ['AE-2166']\n", "\n", "samples = format_sample_aws(request_ids, 'request_id', creds)\n", "samples" @@ -1073,6 +1081,8 @@ } ], "source": [ + "import time\n", + "\n", "stdouts = [] # to store all outputs\n", "process = True\n", "\n", @@ -1097,7 +1107,9 @@ " inputs = path_to_inputs,\n", " labels = path_to_labels,\n", " options = path_to_options,\n", - " ))" + " ))\n", + " \n", + " time.sleep(20)" ] }, { @@ -1200,6 +1212,13 @@ "source": [ "print(labels['destination'].values)" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/notebooks/Run_CellRangerArc_new.ipynb b/notebooks/Run_CellRangerArc_new.ipynb new file mode 100644 index 0000000..fe08018 --- /dev/null +++ b/notebooks/Run_CellRangerArc_new.ipynb @@ -0,0 +1,1070 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import re, subprocess, boto3, json, shlex, mysql, os, urllib, logging\n", + "import pandas as pd\n", + "import numpy as np\n", + "from s3path import S3Path\n", + "from pathlib import Path\n", + "from tqdm.notebook import tqdm\n", + "from packaging import version\n", + "\n", + "import glob\n", + "import os\n", + "\n", + "pd.set_option(\"display.max_colwidth\", 40)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "from utils.utils import *" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# AWS setup" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "env: AWS_ACCESS_KEY_ID=ASIAYPY66CWMIRDUREVH\n", + "env: AWS_SECRET_ACCESS_KEY=N85006UCgijp8CGqzDy0MqLiz/hI/oGV8uSdmpTc\n", + "env: AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEPv//////////wEaCXVzLWVhc3QtMSJHMEUCIQCqvxhWToi0KBwHNijvb9qersxDpPG+R9BY+2giQIgkWAIgSJHSQm8qENlVPnLIbJRoLh/P+0JY8vFmy89VKMIYmZYq+AEIxP//////////ARAEGgw1ODM2NDM1Njc1MTIiDGCfleiZCLh2Drd32irMAckv+DjF7GsRWDiNgxyfABRKUSrzNgSHdpkOKXZ3SE+1Ly0lob1mgtBH7eXLG73OO/SgG5CoxD74kTDoE/0Ofcr8tTuvwE64e5g6Jj4YR5ZR3YW7bWbn+C5OKr/CQu3oepGM6bBVDA43DsNXtDPmQhfpYj8LxT4uMocOUGyEDKZKyNh8T5+1ttt7BUv9zHz63zJcpsIMOB0+l+P2NV7xPWuPabuj3IOFpnCgzZxm4OSQytUTV1pLdIpsksl9hX2A0i2jCQohESGkbLb6RDDMvvKgBjqYAesAHvWnvogi9HG1gGztGKFkxIwhnqBc9Jcn+/lQDFRz6yQTOIsVaujBvMFSjoa8mFvp+eNCHWoXlbJrsAUgQjTuCnO5ZWjMotI+tJe/VzE5R3GynOGv4f7zNGfossJ0rqKi1Xku7KG61NF18BrhRNQk4QEcf8Uq6oaSjfnNm2GMwu2GfClpeb8C/UTFkTJXSQRIDddxn227\n", + "2021-10-07 15:31:32 agc-583643567512-us-east-1\n", + "2021-10-07 15:28:07 cdktoolkit-stagingbucket-d49u1xfb0sc4\n", + "2019-10-09 13:04:06 cf-templates-umiwbnq3566w-us-east-1\n", + "2019-10-10 12:46:54 dp-daily-reports\n", + "2017-09-26 10:15:15 dp-lab-data\n", + "2019-05-23 12:34:58 dp-lab-data-public\n", + "2018-03-01 13:29:07 dp-lab-glacier\n", + "2020-11-06 23:02:27 dp-lab-gwf-core\n", + "2021-07-15 18:14:01 dp-lab-gwf-core2\n", + "2017-09-26 10:17:18 dp-lab-home\n", + "2019-08-14 16:42:43 dp-lab-test\n", + "2019-04-25 12:35:35 elasticbeanstalk-us-east-1-583643567512\n", + "2019-12-13 15:53:57 scri-computational\n", + "2017-09-26 10:23:50 seqc-public\n" + ] + } + ], + "source": [ + "%env AWS_ACCESS_KEY_ID=ASIAYPY66CWMIRDUREVH\n", + "%env AWS_SECRET_ACCESS_KEY=N85006UCgijp8CGqzDy0MqLiz/hI/oGV8uSdmpTc\n", + "%env AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEPv//////////wEaCXVzLWVhc3QtMSJHMEUCIQCqvxhWToi0KBwHNijvb9qersxDpPG+R9BY+2giQIgkWAIgSJHSQm8qENlVPnLIbJRoLh/P+0JY8vFmy89VKMIYmZYq+AEIxP//////////ARAEGgw1ODM2NDM1Njc1MTIiDGCfleiZCLh2Drd32irMAckv+DjF7GsRWDiNgxyfABRKUSrzNgSHdpkOKXZ3SE+1Ly0lob1mgtBH7eXLG73OO/SgG5CoxD74kTDoE/0Ofcr8tTuvwE64e5g6Jj4YR5ZR3YW7bWbn+C5OKr/CQu3oepGM6bBVDA43DsNXtDPmQhfpYj8LxT4uMocOUGyEDKZKyNh8T5+1ttt7BUv9zHz63zJcpsIMOB0+l+P2NV7xPWuPabuj3IOFpnCgzZxm4OSQytUTV1pLdIpsksl9hX2A0i2jCQohESGkbLb6RDDMvvKgBjqYAesAHvWnvogi9HG1gGztGKFkxIwhnqBc9Jcn+/lQDFRz6yQTOIsVaujBvMFSjoa8mFvp+eNCHWoXlbJrsAUgQjTuCnO5ZWjMotI+tJe/VzE5R3GynOGv4f7zNGfossJ0rqKi1Xku7KG61NF18BrhRNQk4QEcf8Uq6oaSjfnNm2GMwu2GfClpeb8C/UTFkTJXSQRIDddxn227\n", + "!aws s3 ls" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "# Setup" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# Location of docker files\n", + "common_docker_registry = \"quay.io/hisplan\"\n", + "\n", + "prefix = \"CellRangerArc\" # Workflow to run; also .wdl filename prefix\n", + "pipeline_type = prefix # field in *.labels.json\n", + "output_dirname = \"cr-arc-results\"\n", + "\n", + "# If need to add comment, put here\n", + "comment = \"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# Locations of workflow-related directories and files\n", + "path_to_cromwell_secrets = f\"{Path.home()}/.cromwell/cromwell-secrets.json\" # CHANGE THIS\n", + "workflow_dir = glob.glob(f\"{Path.home()}/scing/bin/cellranger-arc-*\")[0]\n", + "path_to_exec = f\"{workflow_dir}/submit.sh\" # CHANGE THIS FOR SHARP\n", + "config_dir = f\"{workflow_dir}/configs\"\n", + "path_to_options = f\"{workflow_dir}/{prefix}.options.aws.json\"\n", + "\n", + "# Other file locations\n", + "db_credentials_path = f\"{Path.home()}/.config.json\" # CHANGE THIS" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "# Set credentials based on SCRIdb CLI config file\n", + "with open(db_credentials_path) as f:\n", + " creds = json.load(f)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Sample information" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
AWS_storageidspeciessc_techproject_idreference
Sample
AE-2116_mDA_neurons_DOGMA-seq_multiomes3://dp-lab-data/collaborators/strud...4531humanmultiomeDOGMAseq sample plusGRCh38
\n", + "
" + ], + "text/plain": [ + " AWS_storage \\\n", + "Sample \n", + "AE-2116_mDA_neurons_DOGMA-seq_multiome s3://dp-lab-data/collaborators/strud... \n", + "\n", + " id species sc_tech \\\n", + "Sample \n", + "AE-2116_mDA_neurons_DOGMA-seq_multiome 4531 human multiome \n", + "\n", + " project_id reference \n", + "Sample \n", + "AE-2116_mDA_neurons_DOGMA-seq_multiome DOGMAseq sample plus GRCh38 " + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# You can supply a list of IDs or request IDs or even AWS paths\n", + "\n", + "request_ids = ['AE-2116']\n", + "samples = sample_scridb_info(request_ids, 'request_id', creds)\n", + "samples = samples.iloc[0:1]\n", + "\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "IMPORTANT NOTE \n", + "\n", + "Check the name of the folder you are running. Typically the folder that is stored in the database is just the GEX. So if another library is generated (multiome ATAC, VDJ, hashtag, etc) then it needs to be manually changed." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "AE-2116_mDA_neurons_DOGMA-seq_multiome\n", + " PRE AE-2116_mDA_neurons_DOGMA-seq_multiome/\n", + " PRE AE-2116_mDA_neurons_DOGMA-seq_multiome_HTO/\n", + " PRE AE-2116_mDA_neurons_DOGMA-seq_multiome_mATAC/\n", + "\n" + ] + } + ], + "source": [ + "# Check the name of the folder you are running\n", + "# Especially if there are multiple libraries (i.e ATAC, TCR_VDJ, etc.)\n", + "\n", + "for sample, row in samples.iterrows():\n", + " print(sample)\n", + " path = os.path.split(row['AWS_storage'])[0] + '/'\n", + " os.system(f'aws s3 ls {path} | grep {sample}')\n", + " print()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
AWS_storageidspeciessc_techproject_idreferenceFASTQ_gexFASTQ_atac
Sample
AE-2116_mDA_neurons_DOGMA-seq_multiomes3://dp-lab-data/collaborators/strud...4531humanmultiomeDOGMAseq sample plusGRCh38{'I1': ['s3://dp-lab-data/collaborat...{'I1': ['s3://dp-lab-data/collaborat...
\n", + "
" + ], + "text/plain": [ + " AWS_storage \\\n", + "Sample \n", + "AE-2116_mDA_neurons_DOGMA-seq_multiome s3://dp-lab-data/collaborators/strud... \n", + "\n", + " id species sc_tech \\\n", + "Sample \n", + "AE-2116_mDA_neurons_DOGMA-seq_multiome 4531 human multiome \n", + "\n", + " project_id reference \\\n", + "Sample \n", + "AE-2116_mDA_neurons_DOGMA-seq_multiome DOGMAseq sample plus GRCh38 \n", + "\n", + " FASTQ_gex \\\n", + "Sample \n", + "AE-2116_mDA_neurons_DOGMA-seq_multiome {'I1': ['s3://dp-lab-data/collaborat... \n", + "\n", + " FASTQ_atac \n", + "Sample \n", + "AE-2116_mDA_neurons_DOGMA-seq_multiome {'I1': ['s3://dp-lab-data/collaborat... " + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples[\"FASTQ_gex\"] = samples[\"AWS_storage\"].apply(lambda x: get_fastqs(x, fastq_map['CellRangerGex'], \"FASTQ\"))\n", + "samples[\"FASTQ_atac\"] = (samples[\"AWS_storage\"] + '_mATAC').apply(lambda x: get_fastqs(x, fastq_map['CellRangerATAC'], \"FASTQ\"))\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "IMPORTANT NOTE\n", + "\n", + "Make sure that your files are not archived. The following command will print any FASTQ file that is archived. Unarchive the files and then come back to processing the sample." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "AE-2116_mDA_neurons_DOGMA-seq_multiome\n", + "AE-2116_mDA_neurons_DOGMA-seq_multiome\n" + ] + } + ], + "source": [ + "for sample, row in samples.iterrows():\n", + " print(sample)\n", + " fastqs = np.ravel(list(row['FASTQ_gex'].values()))\n", + " dirnames = set([os.path.dirname(x) for x in fastqs])\n", + " \n", + " for dirname in dirnames:\n", + " file = dirname.replace('s3://', '')\n", + " \n", + " bucket = file.split('/')[0]\n", + " pre = file.replace(f'{bucket}/', '')\n", + " \n", + " !aws s3api list-objects-v2 --bucket $bucket --prefix $pre --query \"Contents[?StorageClass!='STANDARD'].Key\" --output text \n", + " \n", + "for sample, row in samples.iterrows():\n", + " print(sample)\n", + " fastqs = np.ravel(list(row['FASTQ_atac'].values()))\n", + " dirnames = set([os.path.dirname(x) for x in fastqs])\n", + " \n", + " for dirname in dirnames:\n", + " file = dirname.replace('s3://', '')\n", + " \n", + " bucket = file.split('/')[0]\n", + " pre = file.replace(f'{bucket}/', '')\n", + " \n", + " !aws s3api list-objects-v2 --bucket $bucket --prefix $pre --query \"Contents[?StorageClass!='STANDARD'].Key\" --output text " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "IMPORTANT NOTE \n", + "\n", + "For CellRanger you need to supply an HTTPS path. So if you are using a custom genome stored on AWS, you must make the reference public ! Be sure to manually change the \"reference\" argument if it has not been updated correctly!!!!" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['https://dp-lab-data.s3.amazonaws.com/collaborators/sfeira/YfDogmaSeqMtdna/references/cr-arc-GRCh38-atac-with-mito-2020.tar.gz']" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples['reference'] = 'https://dp-lab-data.s3.amazonaws.com/collaborators/sfeira/YfDogmaSeqMtdna/references/cr-arc-GRCh38-atac-with-mito-2020.tar.gz'\n", + "samples['reference'].tolist()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Generate inputs" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
CellRangerArc.runIDCellRangerArc.gexFastqNameCellRangerArc.gexFastqFilesCellRangerArc.atacFastqNameCellRangerArc.atacFastqFilesCellRangerArc.referenceCellRangerArc.dockerRegistry
Sample
AE-2116_mDA_neurons_DOGMA-seq_multiomeAE-2116_mDA_neurons_DOGMA-seq_multiome4531_AE-2116_mDA_neurons_DOGMA-seq_m...[s3://dp-lab-data/collaborators/stru...4532_AE-2116_mDA_neurons_DOGMA-seq_m...[s3://dp-lab-data/collaborators/stru...https://dp-lab-data.s3.amazonaws.com...quay.io/hisplan
\n", + "
" + ], + "text/plain": [ + " CellRangerArc.runID \\\n", + "Sample \n", + "AE-2116_mDA_neurons_DOGMA-seq_multiome AE-2116_mDA_neurons_DOGMA-seq_multiome \n", + "\n", + " CellRangerArc.gexFastqName \\\n", + "Sample \n", + "AE-2116_mDA_neurons_DOGMA-seq_multiome 4531_AE-2116_mDA_neurons_DOGMA-seq_m... \n", + "\n", + " CellRangerArc.gexFastqFiles \\\n", + "Sample \n", + "AE-2116_mDA_neurons_DOGMA-seq_multiome [s3://dp-lab-data/collaborators/stru... \n", + "\n", + " CellRangerArc.atacFastqName \\\n", + "Sample \n", + "AE-2116_mDA_neurons_DOGMA-seq_multiome 4532_AE-2116_mDA_neurons_DOGMA-seq_m... \n", + "\n", + " CellRangerArc.atacFastqFiles \\\n", + "Sample \n", + "AE-2116_mDA_neurons_DOGMA-seq_multiome [s3://dp-lab-data/collaborators/stru... \n", + "\n", + " CellRangerArc.reference \\\n", + "Sample \n", + "AE-2116_mDA_neurons_DOGMA-seq_multiome https://dp-lab-data.s3.amazonaws.com... \n", + "\n", + " CellRangerArc.dockerRegistry \n", + "Sample \n", + "AE-2116_mDA_neurons_DOGMA-seq_multiome quay.io/hisplan " + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Standard inputs, modify fields as need be\n", + "\n", + "# Load minimum inputs and labels fields from templates\n", + "with open(f\"{config_dir}/template.inputs.json\") as f:\n", + " std_inputs_fields = list(json.load(f).keys())\n", + " \n", + "# Annotate all samples with workflow inputs and labels\n", + "inputs = pd.DataFrame(index=samples.index, columns=std_inputs_fields,)\n", + "\n", + "# Annotate inputs\n", + "inputs[f\"{prefix}.runID\"] = inputs.index\n", + "inputs[f\"{prefix}.gexFastqFiles\"] = samples[\"FASTQ_gex\"].apply(lambda x: np.ravel(list(x.values())))\n", + "inputs[f\"{prefix}.gexFastqName\"] = inputs[f\"{prefix}.gexFastqFiles\"].apply(lambda x: get_fastqs_name(x))\n", + "\n", + "inputs[f\"{prefix}.atacFastqFiles\"] = samples[\"FASTQ_atac\"].apply(lambda x: np.ravel(list(x.values())))\n", + "inputs[f\"{prefix}.atacFastqName\"] = inputs[f\"{prefix}.atacFastqFiles\"].apply(lambda x: get_fastqs_name(x))\n", + "\n", + "inputs[f\"{prefix}.reference\"] = samples[\"reference\"] \n", + "inputs[f\"{prefix}.dockerRegistry\"] = common_docker_registry\n", + "\n", + "inputs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Generate labels" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
pipelineTypeprojectsampleownerdestinationtransfercomment
Sample
AE-2116_mDA_neurons_DOGMA-seq_multiomeCellRangerArcDOGMAseq sample plusAE-2116_mDA_neurons_DOGMA-seq_multiomesohailns3://dp-lab-data/collaborators/strud...-sohailn
\n", + "
" + ], + "text/plain": [ + " pipelineType project \\\n", + "Sample \n", + "AE-2116_mDA_neurons_DOGMA-seq_multiome CellRangerArc DOGMAseq sample plus \n", + "\n", + " sample \\\n", + "Sample \n", + "AE-2116_mDA_neurons_DOGMA-seq_multiome AE-2116_mDA_neurons_DOGMA-seq_multiome \n", + "\n", + " owner \\\n", + "Sample \n", + "AE-2116_mDA_neurons_DOGMA-seq_multiome sohailn \n", + "\n", + " destination \\\n", + "Sample \n", + "AE-2116_mDA_neurons_DOGMA-seq_multiome s3://dp-lab-data/collaborators/strud... \n", + "\n", + " transfer comment \n", + "Sample \n", + "AE-2116_mDA_neurons_DOGMA-seq_multiome - sohailn " + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Standard labels, modify fields as need be\n", + "\n", + "with open(f\"{config_dir}/template.labels.json\") as f:\n", + " std_labels_fields = list(json.load(f).keys())\n", + " \n", + "# Annotate all samples with workflow inputs and labels\n", + "labels = pd.DataFrame(index=samples.index, columns=std_labels_fields,)\n", + "\n", + "labels[\"pipelineType\"] = pipeline_type\n", + "labels[\"project\"] = samples['project_id']\n", + "labels[\"sample\"] = labels.index\n", + "labels[\"owner\"] = creds[\"user\"]\n", + "labels[\"destination\"] = samples['AWS_storage'] + \"/\" + output_dirname\n", + "labels[\"transfer\"] = \"-\"\n", + "labels[\"comment\"] = creds[\"user\"]\n", + "\n", + "labels" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['s3://dp-lab-data/collaborators/struder/DogmaseqSamplePlus/AE-2116_mDA_neurons_DOGMA-seq_multiome/mito_cr-arc-results']" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "labels['destination'] = labels['destination'].str.replace(output_dirname, 'mito_cr-arc-results')\n", + "labels['destination'].tolist()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Run samples" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Look over the samples before submitting one last time" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
CellRangerArc.runIDCellRangerArc.gexFastqNameCellRangerArc.gexFastqFilesCellRangerArc.atacFastqNameCellRangerArc.atacFastqFilesCellRangerArc.referenceCellRangerArc.dockerRegistry
Sample
AE-2116_mDA_neurons_DOGMA-seq_multiomeAE-2116_mDA_neurons_DOGMA-seq_multiome4531_AE-2116_mDA_neurons_DOGMA-seq_m...[s3://dp-lab-data/collaborators/stru...4532_AE-2116_mDA_neurons_DOGMA-seq_m...[s3://dp-lab-data/collaborators/stru...https://dp-lab-data.s3.amazonaws.com...quay.io/hisplan
\n", + "
" + ], + "text/plain": [ + " CellRangerArc.runID \\\n", + "Sample \n", + "AE-2116_mDA_neurons_DOGMA-seq_multiome AE-2116_mDA_neurons_DOGMA-seq_multiome \n", + "\n", + " CellRangerArc.gexFastqName \\\n", + "Sample \n", + "AE-2116_mDA_neurons_DOGMA-seq_multiome 4531_AE-2116_mDA_neurons_DOGMA-seq_m... \n", + "\n", + " CellRangerArc.gexFastqFiles \\\n", + "Sample \n", + "AE-2116_mDA_neurons_DOGMA-seq_multiome [s3://dp-lab-data/collaborators/stru... \n", + "\n", + " CellRangerArc.atacFastqName \\\n", + "Sample \n", + "AE-2116_mDA_neurons_DOGMA-seq_multiome 4532_AE-2116_mDA_neurons_DOGMA-seq_m... \n", + "\n", + " CellRangerArc.atacFastqFiles \\\n", + "Sample \n", + "AE-2116_mDA_neurons_DOGMA-seq_multiome [s3://dp-lab-data/collaborators/stru... \n", + "\n", + " CellRangerArc.reference \\\n", + "Sample \n", + "AE-2116_mDA_neurons_DOGMA-seq_multiome https://dp-lab-data.s3.amazonaws.com... \n", + "\n", + " CellRangerArc.dockerRegistry \n", + "Sample \n", + "AE-2116_mDA_neurons_DOGMA-seq_multiome quay.io/hisplan " + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "inputs" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
pipelineTypeprojectsampleownerdestinationtransfercomment
Sample
AE-2116_mDA_neurons_DOGMA-seq_multiomeCellRangerArcDOGMAseq sample plusAE-2116_mDA_neurons_DOGMA-seq_multiomesohailns3://dp-lab-data/collaborators/strud...-sohailn
\n", + "
" + ], + "text/plain": [ + " pipelineType project \\\n", + "Sample \n", + "AE-2116_mDA_neurons_DOGMA-seq_multiome CellRangerArc DOGMAseq sample plus \n", + "\n", + " sample \\\n", + "Sample \n", + "AE-2116_mDA_neurons_DOGMA-seq_multiome AE-2116_mDA_neurons_DOGMA-seq_multiome \n", + "\n", + " owner \\\n", + "Sample \n", + "AE-2116_mDA_neurons_DOGMA-seq_multiome sohailn \n", + "\n", + " destination \\\n", + "Sample \n", + "AE-2116_mDA_neurons_DOGMA-seq_multiome s3://dp-lab-data/collaborators/strud... \n", + "\n", + " transfer comment \n", + "Sample \n", + "AE-2116_mDA_neurons_DOGMA-seq_multiome - sohailn " + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "labels" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "dab6f042bbfd4a19b7c562305e480540", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/1 [00:00\n", " \n", " \n", - " MH-1735_MC_GFP_multiome_mATAC\n", - " s3://dp-lab-data/collaborators/white...\n", - " 3970\n", - " zebrafish\n", - " multiome\n", - " zebrafish tumor multiomics\n", - " Zebrafish\n", + " RB-2041_WildType_DOGMAseq\n", + " s3://dp-lab-data/collaborators/sfeir...\n", + " 4440\n", + " human\n", + " 10X_scATAC\n", + " scATAC-seq pilot\n", + " GRCh38-1.1.0\n", + " \n", + " \n", + " RB-2041_mRB54_1003_DOGMAseq\n", + " s3://dp-lab-data/collaborators/sfeir...\n", + " 4441\n", + " human\n", + " 10X_scATAC\n", + " scATAC-seq pilot\n", + " GRCh38-1.1.0\n", " \n", " \n", "\n", "" ], "text/plain": [ - " AWS_storage id \\\n", - "Sample \n", - "MH-1735_MC_GFP_multiome_mATAC s3://dp-lab-data/collaborators/white... 3970 \n", + " AWS_storage id \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq s3://dp-lab-data/collaborators/sfeir... 4440 \n", + "RB-2041_mRB54_1003_DOGMAseq s3://dp-lab-data/collaborators/sfeir... 4441 \n", "\n", - " species sc_tech \\\n", - "Sample \n", - "MH-1735_MC_GFP_multiome_mATAC zebrafish multiome \n", + " species sc_tech project_id \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq human 10X_scATAC scATAC-seq pilot \n", + "RB-2041_mRB54_1003_DOGMAseq human 10X_scATAC scATAC-seq pilot \n", "\n", - " project_id reference \n", - "Sample \n", - "MH-1735_MC_GFP_multiome_mATAC zebrafish tumor multiomics Zebrafish " + " reference \n", + "Sample \n", + "RB-2041_WildType_DOGMAseq GRCh38-1.1.0 \n", + "RB-2041_mRB54_1003_DOGMAseq GRCh38-1.1.0 " ] }, "execution_count": 8, @@ -245,8 +258,13 @@ "# request_ids = ['PM-1779']\n", "# samples = sample_scridb_info(request_ids, 'request_id', creds)\n", "\n", - "sample_ids = [3970]\n", - "samples = sample_scridb_info(sample_ids, 'id', creds)\n", + "# sample_ids = [3970]\n", + "# samples = sample_scridb_info(sample_ids, 'id', creds)\n", + "\n", + "aws_storage = ['s3://dp-lab-data/collaborators/sfeira/ScatacSeqPilot/RB-2041_mRB54_1003_DOGMAseq/',\n", + " 's3://dp-lab-data/collaborators/sfeira/ScatacSeqPilot/RB-2041_WildType_DOGMAseq/']\n", + "samples = sample_scridb_info(aws_storage, 'AWS_storage', creds)\n", + "\n", "\n", "samples" ] @@ -276,8 +294,11 @@ "name": "stdout", "output_type": "stream", "text": [ - "MH-1735_MC_GFP_multiome_mATAC\n", - " PRE MH-1735_MC_GFP_multiome_mATAC/\n", + "RB-2041_WildType_DOGMAseq\n", + " PRE RB-2041_WildType_DOGMAseq/\n", + "\n", + "RB-2041_mRB54_1003_DOGMAseq\n", + " PRE RB-2041_mRB54_1003_DOGMAseq/\n", "\n" ] } @@ -340,13 +361,23 @@ " \n", " \n", " \n", - " MH-1735_MC_GFP_multiome_mATAC\n", - " s3://dp-lab-data/collaborators/white...\n", - " 3970\n", - " zebrafish\n", - " multiome\n", - " zebrafish tumor multiomics\n", - " Zebrafish\n", + " RB-2041_WildType_DOGMAseq\n", + " s3://dp-lab-data/collaborators/sfeir...\n", + " 4440\n", + " human\n", + " 10X_scATAC\n", + " scATAC-seq pilot\n", + " GRCh38-1.1.0\n", + " {'I1': ['s3://dp-lab-data/collaborat...\n", + " \n", + " \n", + " RB-2041_mRB54_1003_DOGMAseq\n", + " s3://dp-lab-data/collaborators/sfeir...\n", + " 4441\n", + " human\n", + " 10X_scATAC\n", + " scATAC-seq pilot\n", + " GRCh38-1.1.0\n", " {'I1': ['s3://dp-lab-data/collaborat...\n", " \n", " \n", @@ -354,21 +385,25 @@ "" ], "text/plain": [ - " AWS_storage id \\\n", - "Sample \n", - "MH-1735_MC_GFP_multiome_mATAC s3://dp-lab-data/collaborators/white... 3970 \n", + " AWS_storage id \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq s3://dp-lab-data/collaborators/sfeir... 4440 \n", + "RB-2041_mRB54_1003_DOGMAseq s3://dp-lab-data/collaborators/sfeir... 4441 \n", "\n", - " species sc_tech \\\n", - "Sample \n", - "MH-1735_MC_GFP_multiome_mATAC zebrafish multiome \n", + " species sc_tech project_id \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq human 10X_scATAC scATAC-seq pilot \n", + "RB-2041_mRB54_1003_DOGMAseq human 10X_scATAC scATAC-seq pilot \n", "\n", - " project_id reference \\\n", - "Sample \n", - "MH-1735_MC_GFP_multiome_mATAC zebrafish tumor multiomics Zebrafish \n", + " reference \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq GRCh38-1.1.0 \n", + "RB-2041_mRB54_1003_DOGMAseq GRCh38-1.1.0 \n", "\n", - " FASTQs \n", - "Sample \n", - "MH-1735_MC_GFP_multiome_mATAC {'I1': ['s3://dp-lab-data/collaborat... " + " FASTQs \n", + "Sample \n", + "RB-2041_WildType_DOGMAseq {'I1': ['s3://dp-lab-data/collaborat... \n", + "RB-2041_mRB54_1003_DOGMAseq {'I1': ['s3://dp-lab-data/collaborat... " ] }, "execution_count": 10, @@ -406,7 +441,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "MH-1735_MC_GFP_multiome_mATAC\n" + "RB-2041_WildType_DOGMAseq\n", + "RB-2041_mRB54_1003_DOGMAseq\n" ] } ], @@ -446,91 +482,29 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "samples = update_ref(samples, prefix)\n", + "\n", + "if not samples['reference'].isna().any():\n", + " samples[\"reference\"].apply(lambda x: {\n", + " \"name\": re.match(r'.*refdata-cellranger-arc-(.*).tar.gz', x)[1],\n", + " \"location\": x,\n", + " }) \n", + "samples" + ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "zebrafish reference not in database. Manually change \"reference\" field\n" - ] - }, { "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
AWS_storageidspeciessc_techproject_idreferenceFASTQs
Sample
MH-1735_MC_GFP_multiome_mATACs3://dp-lab-data/collaborators/white...3970zebrafishmultiomezebrafish tumor multiomicsNaN{'I1': ['s3://dp-lab-data/collaborat...
\n", - "
" - ], "text/plain": [ - " AWS_storage id \\\n", - "Sample \n", - "MH-1735_MC_GFP_multiome_mATAC s3://dp-lab-data/collaborators/white... 3970 \n", - "\n", - " species sc_tech \\\n", - "Sample \n", - "MH-1735_MC_GFP_multiome_mATAC zebrafish multiome \n", - "\n", - " project_id reference \\\n", - "Sample \n", - "MH-1735_MC_GFP_multiome_mATAC zebrafish tumor multiomics NaN \n", - "\n", - " FASTQs \n", - "Sample \n", - "MH-1735_MC_GFP_multiome_mATAC {'I1': ['s3://dp-lab-data/collaborat... " + "Sample\n", + "RB-2041_WildType_DOGMAseq {'name': 'GRCh38_atac_mito_mask_refe...\n", + "RB-2041_mRB54_1003_DOGMAseq {'name': 'GRCh38_atac_mito_mask_refe...\n", + "Name: reference, dtype: object" ] }, "execution_count": 12, @@ -539,43 +513,42 @@ } ], "source": [ - "samples = update_ref(samples, prefix)\n", - "\n", - "if not samples['reference'].isna().any():\n", - " samples[\"reference\"].apply(lambda x: {\n", - " \"name\": re.match(r'.*refdata-cellranger-arc-(.*).tar.gz', x)[1],\n", - " \"location\": x,\n", - " }) \n", - "samples" + "samples['reference'] = [\n", + " {\n", + " 'name' : 'GRCh38_atac_mito_mask_reference',\n", + " 'location' : 'https://dp-lab-data.s3.amazonaws.com/collaborators/sfeira/ScatacSeqPilot/GRCh38_atac_mito_mask_reference/GRCh38_atac_mito_mask_reference.tar.gz'\n", + " }] * len(samples)\n", + "samples['reference']" ] }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "Sample\n", - "MH-1735_MC_GFP_multiome_mATAC {'name': 'GRCz11_atac', 'location': ...\n", - "Name: reference, dtype: object" + "['https://dp-lab-data.s3.amazonaws.com/collaborators/sfeira/ScatacSeqPilot/GRCh38_atac_mito_mask_reference/GRCh38_atac_mito_mask_reference.tar.gz',\n", + " 'https://dp-lab-data.s3.amazonaws.com/collaborators/sfeira/ScatacSeqPilot/GRCh38_atac_mito_mask_reference/GRCh38_atac_mito_mask_reference.tar.gz']" ] }, - "execution_count": 19, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "samples['reference'] = [\n", - " {\n", - " 'name' : 'GRCz11_atac',\n", - " 'location' : \"https://dp-lab-data.s3.amazonaws.com/collaborators/whiter/YM-1704_transgene_reference/refdata-cellranger/GRCz11_atac.tar.gz\"\n", - " }] * len(samples)\n", - "samples['reference']" + "samples['reference'].str['location'].tolist()" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "markdown", "metadata": {}, @@ -585,7 +558,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -626,11 +599,19 @@ " \n", " \n", " \n", - " MH-1735_MC_GFP_multiome_mATAC\n", - " MH-1735_MC_GFP_multiome_mATAC\n", - " 3970_MH-1735_MC_GFP_multiome_mATAC_I...\n", - " [s3://dp-lab-data/collaborators/whit...\n", - " {'name': 'GRCz11_atac', 'location': ...\n", + " RB-2041_WildType_DOGMAseq\n", + " RB-2041_WildType_DOGMAseq\n", + " 4440_RB-2041_WildType_DOGMAseq_IGO_1...\n", + " [s3://dp-lab-data/collaborators/sfei...\n", + " {'name': 'GRCh38_atac_mito_mask_refe...\n", + " quay.io/hisplan\n", + " \n", + " \n", + " RB-2041_mRB54_1003_DOGMAseq\n", + " RB-2041_mRB54_1003_DOGMAseq\n", + " 4441_RB-2041_mRB54_1003_DOGMAseq_IGO...\n", + " [s3://dp-lab-data/collaborators/sfei...\n", + " {'name': 'GRCh38_atac_mito_mask_refe...\n", " quay.io/hisplan\n", " \n", " \n", @@ -638,28 +619,33 @@ "" ], "text/plain": [ - " CellRangerATAC.sampleName \\\n", - "Sample \n", - "MH-1735_MC_GFP_multiome_mATAC MH-1735_MC_GFP_multiome_mATAC \n", + " CellRangerATAC.sampleName \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq RB-2041_WildType_DOGMAseq \n", + "RB-2041_mRB54_1003_DOGMAseq RB-2041_mRB54_1003_DOGMAseq \n", "\n", - " CellRangerATAC.fastqNames \\\n", - "Sample \n", - "MH-1735_MC_GFP_multiome_mATAC 3970_MH-1735_MC_GFP_multiome_mATAC_I... \n", + " CellRangerATAC.fastqNames \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq 4440_RB-2041_WildType_DOGMAseq_IGO_1... \n", + "RB-2041_mRB54_1003_DOGMAseq 4441_RB-2041_mRB54_1003_DOGMAseq_IGO... \n", "\n", - " CellRangerATAC.fastqFiles \\\n", - "Sample \n", - "MH-1735_MC_GFP_multiome_mATAC [s3://dp-lab-data/collaborators/whit... \n", + " CellRangerATAC.fastqFiles \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq [s3://dp-lab-data/collaborators/sfei... \n", + "RB-2041_mRB54_1003_DOGMAseq [s3://dp-lab-data/collaborators/sfei... \n", "\n", - " CellRangerATAC.referenceGenome \\\n", - "Sample \n", - "MH-1735_MC_GFP_multiome_mATAC {'name': 'GRCz11_atac', 'location': ... \n", + " CellRangerATAC.referenceGenome \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq {'name': 'GRCh38_atac_mito_mask_refe... \n", + "RB-2041_mRB54_1003_DOGMAseq {'name': 'GRCh38_atac_mito_mask_refe... \n", "\n", - " CellRangerATAC.dockerRegistry \n", - "Sample \n", - "MH-1735_MC_GFP_multiome_mATAC quay.io/hisplan " + " CellRangerATAC.dockerRegistry \n", + "Sample \n", + "RB-2041_WildType_DOGMAseq quay.io/hisplan \n", + "RB-2041_mRB54_1003_DOGMAseq quay.io/hisplan " ] }, - "execution_count": 20, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -700,7 +686,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -745,12 +731,22 @@ " \n", " \n", " \n", - " MH-1735_MC_GFP_multiome_mATAC\n", + " RB-2041_WildType_DOGMAseq\n", + " CellRangerATAC\n", + " scATAC-seq pilot\n", + " RB-2041_WildType_DOGMAseq\n", + " sohailn\n", + " s3://dp-lab-data/collaborators/sfeir...\n", + " -\n", + " sohailn\n", + " \n", + " \n", + " RB-2041_mRB54_1003_DOGMAseq\n", " CellRangerATAC\n", - " zebrafish tumor multiomics\n", - " MH-1735_MC_GFP_multiome_mATAC\n", + " scATAC-seq pilot\n", + " RB-2041_mRB54_1003_DOGMAseq\n", " sohailn\n", - " s3://dp-lab-data/collaborators/white...\n", + " s3://dp-lab-data/collaborators/sfeir...\n", " -\n", " sohailn\n", " \n", @@ -759,24 +755,28 @@ "" ], "text/plain": [ - " pipelineType project \\\n", - "Sample \n", - "MH-1735_MC_GFP_multiome_mATAC CellRangerATAC zebrafish tumor multiomics \n", + " pipelineType project \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq CellRangerATAC scATAC-seq pilot \n", + "RB-2041_mRB54_1003_DOGMAseq CellRangerATAC scATAC-seq pilot \n", "\n", - " sample owner \\\n", - "Sample \n", - "MH-1735_MC_GFP_multiome_mATAC MH-1735_MC_GFP_multiome_mATAC sohailn \n", + " sample owner \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq RB-2041_WildType_DOGMAseq sohailn \n", + "RB-2041_mRB54_1003_DOGMAseq RB-2041_mRB54_1003_DOGMAseq sohailn \n", "\n", - " destination \\\n", - "Sample \n", - "MH-1735_MC_GFP_multiome_mATAC s3://dp-lab-data/collaborators/white... \n", + " destination transfer \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq s3://dp-lab-data/collaborators/sfeir... - \n", + "RB-2041_mRB54_1003_DOGMAseq s3://dp-lab-data/collaborators/sfeir... - \n", "\n", - " transfer comment \n", - "Sample \n", - "MH-1735_MC_GFP_multiome_mATAC - sohailn " + " comment \n", + "Sample \n", + "RB-2041_WildType_DOGMAseq sohailn \n", + "RB-2041_mRB54_1003_DOGMAseq sohailn " ] }, - "execution_count": 21, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -801,6 +801,15 @@ "labels" ] }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "labels['destination'] = labels['destination'].str.replace(output_dirname, 'cr-atac-mito-results')" + ] + }, { "cell_type": "code", "execution_count": null, @@ -824,7 +833,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 17, "metadata": {}, "outputs": [ { @@ -865,11 +874,19 @@ " \n", " \n", " \n", - " MH-1735_MC_GFP_multiome_mATAC\n", - " MH-1735_MC_GFP_multiome_mATAC\n", - " 3970_MH-1735_MC_GFP_multiome_mATAC_I...\n", - " [s3://dp-lab-data/collaborators/whit...\n", - " {'name': 'GRCz11_atac', 'location': ...\n", + " RB-2041_WildType_DOGMAseq\n", + " RB-2041_WildType_DOGMAseq\n", + " 4440_RB-2041_WildType_DOGMAseq_IGO_1...\n", + " [s3://dp-lab-data/collaborators/sfei...\n", + " {'name': 'GRCh38_atac_mito_mask_refe...\n", + " quay.io/hisplan\n", + " \n", + " \n", + " RB-2041_mRB54_1003_DOGMAseq\n", + " RB-2041_mRB54_1003_DOGMAseq\n", + " 4441_RB-2041_mRB54_1003_DOGMAseq_IGO...\n", + " [s3://dp-lab-data/collaborators/sfei...\n", + " {'name': 'GRCh38_atac_mito_mask_refe...\n", " quay.io/hisplan\n", " \n", " \n", @@ -877,28 +894,33 @@ "" ], "text/plain": [ - " CellRangerATAC.sampleName \\\n", - "Sample \n", - "MH-1735_MC_GFP_multiome_mATAC MH-1735_MC_GFP_multiome_mATAC \n", + " CellRangerATAC.sampleName \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq RB-2041_WildType_DOGMAseq \n", + "RB-2041_mRB54_1003_DOGMAseq RB-2041_mRB54_1003_DOGMAseq \n", "\n", - " CellRangerATAC.fastqNames \\\n", - "Sample \n", - "MH-1735_MC_GFP_multiome_mATAC 3970_MH-1735_MC_GFP_multiome_mATAC_I... \n", + " CellRangerATAC.fastqNames \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq 4440_RB-2041_WildType_DOGMAseq_IGO_1... \n", + "RB-2041_mRB54_1003_DOGMAseq 4441_RB-2041_mRB54_1003_DOGMAseq_IGO... \n", "\n", - " CellRangerATAC.fastqFiles \\\n", - "Sample \n", - "MH-1735_MC_GFP_multiome_mATAC [s3://dp-lab-data/collaborators/whit... \n", + " CellRangerATAC.fastqFiles \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq [s3://dp-lab-data/collaborators/sfei... \n", + "RB-2041_mRB54_1003_DOGMAseq [s3://dp-lab-data/collaborators/sfei... \n", "\n", - " CellRangerATAC.referenceGenome \\\n", - "Sample \n", - "MH-1735_MC_GFP_multiome_mATAC {'name': 'GRCz11_atac', 'location': ... \n", + " CellRangerATAC.referenceGenome \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq {'name': 'GRCh38_atac_mito_mask_refe... \n", + "RB-2041_mRB54_1003_DOGMAseq {'name': 'GRCh38_atac_mito_mask_refe... \n", "\n", - " CellRangerATAC.dockerRegistry \n", - "Sample \n", - "MH-1735_MC_GFP_multiome_mATAC quay.io/hisplan " + " CellRangerATAC.dockerRegistry \n", + "Sample \n", + "RB-2041_WildType_DOGMAseq quay.io/hisplan \n", + "RB-2041_mRB54_1003_DOGMAseq quay.io/hisplan " ] }, - "execution_count": 22, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -909,7 +931,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 18, "metadata": {}, "outputs": [ { @@ -954,12 +976,22 @@ " \n", " \n", " \n", - " MH-1735_MC_GFP_multiome_mATAC\n", + " RB-2041_WildType_DOGMAseq\n", " CellRangerATAC\n", - " zebrafish tumor multiomics\n", - " MH-1735_MC_GFP_multiome_mATAC\n", + " scATAC-seq pilot\n", + " RB-2041_WildType_DOGMAseq\n", " sohailn\n", - " s3://dp-lab-data/collaborators/white...\n", + " s3://dp-lab-data/collaborators/sfeir...\n", + " -\n", + " sohailn\n", + " \n", + " \n", + " RB-2041_mRB54_1003_DOGMAseq\n", + " CellRangerATAC\n", + " scATAC-seq pilot\n", + " RB-2041_mRB54_1003_DOGMAseq\n", + " sohailn\n", + " s3://dp-lab-data/collaborators/sfeir...\n", " -\n", " sohailn\n", " \n", @@ -968,24 +1000,28 @@ "" ], "text/plain": [ - " pipelineType project \\\n", - "Sample \n", - "MH-1735_MC_GFP_multiome_mATAC CellRangerATAC zebrafish tumor multiomics \n", + " pipelineType project \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq CellRangerATAC scATAC-seq pilot \n", + "RB-2041_mRB54_1003_DOGMAseq CellRangerATAC scATAC-seq pilot \n", "\n", - " sample owner \\\n", - "Sample \n", - "MH-1735_MC_GFP_multiome_mATAC MH-1735_MC_GFP_multiome_mATAC sohailn \n", + " sample owner \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq RB-2041_WildType_DOGMAseq sohailn \n", + "RB-2041_mRB54_1003_DOGMAseq RB-2041_mRB54_1003_DOGMAseq sohailn \n", "\n", - " destination \\\n", - "Sample \n", - "MH-1735_MC_GFP_multiome_mATAC s3://dp-lab-data/collaborators/white... \n", + " destination transfer \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq s3://dp-lab-data/collaborators/sfeir... - \n", + "RB-2041_mRB54_1003_DOGMAseq s3://dp-lab-data/collaborators/sfeir... - \n", "\n", - " transfer comment \n", - "Sample \n", - "MH-1735_MC_GFP_multiome_mATAC - sohailn " + " comment \n", + "Sample \n", + "RB-2041_WildType_DOGMAseq sohailn \n", + "RB-2041_mRB54_1003_DOGMAseq sohailn " ] }, - "execution_count": 23, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -1003,18 +1039,18 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "c26c371d7aaf4698a245a88e2b6c96d2", + "model_id": "53694d4b522c4bf19dc886bfc779d946", "version_major": 2, "version_minor": 0 }, "text/plain": [ - " 0%| | 0/1 [00:00\n", " \n", " \n", - " PM-1779_LC441_A_5prime\n", - " s3://dp-lab-data/collaborators/rudin...\n", - " 4004\n", - " human\n", - " 10X_5prime\n", - " Pre-_post-IO NSCLC\n", - " GRCh38-3.0.0\n", + " IgG_A\n", + " s3://dp-lab-data/collaborators/lowe/...\n", + " 2638\n", + " mouse\n", + " 10X_V3.1\n", + " 9p\n", + " s3://seqc-public/genomes/mm38_long_p...\n", " \n", " \n", - " PM-1779_LC441_B_5prime\n", - " s3://dp-lab-data/collaborators/rudin...\n", - " 4005\n", - " human\n", - " 10X_5prime\n", - " Pre-_post-IO NSCLC\n", - " GRCh38-3.0.0\n", + " IgG_C\n", + " s3://dp-lab-data/collaborators/lowe/...\n", + " 2639\n", + " mouse\n", + " 10X_V3.1\n", + " 9p\n", + " s3://seqc-public/genomes/mm38_long_p...\n", " \n", " \n", - " PM-1779_LC479A_5prime\n", - " s3://dp-lab-data/collaborators/rudin...\n", - " 4006\n", - " human\n", - " 10X_5prime\n", - " Pre-_post-IO NSCLC\n", - " GRCh38-3.0.0\n", - " \n", - " \n", - " PM-1779_LC479B_5prime\n", - " s3://dp-lab-data/collaborators/rudin...\n", - " 4007\n", - " human\n", - " 10X_5prime\n", - " Pre-_post-IO NSCLC\n", - " GRCh38-3.0.0\n", + " IFNAR_A\n", + " s3://dp-lab-data/collaborators/lowe/...\n", + " 2640\n", + " mouse\n", + " 10X_V3.1\n", + " 9p\n", + " s3://seqc-public/genomes/mm38_long_p...\n", " \n", " \n", "\n", "" ], "text/plain": [ - " AWS_storage id species \\\n", - "Sample \n", - "PM-1779_LC441_A_5prime s3://dp-lab-data/collaborators/rudin... 4004 human \n", - "PM-1779_LC441_B_5prime s3://dp-lab-data/collaborators/rudin... 4005 human \n", - "PM-1779_LC479A_5prime s3://dp-lab-data/collaborators/rudin... 4006 human \n", - "PM-1779_LC479B_5prime s3://dp-lab-data/collaborators/rudin... 4007 human \n", + " AWS_storage id species sc_tech \\\n", + "Sample \n", + "IgG_A s3://dp-lab-data/collaborators/lowe/... 2638 mouse 10X_V3.1 \n", + "IgG_C s3://dp-lab-data/collaborators/lowe/... 2639 mouse 10X_V3.1 \n", + "IFNAR_A s3://dp-lab-data/collaborators/lowe/... 2640 mouse 10X_V3.1 \n", "\n", - " sc_tech project_id reference \n", - "Sample \n", - "PM-1779_LC441_A_5prime 10X_5prime Pre-_post-IO NSCLC GRCh38-3.0.0 \n", - "PM-1779_LC441_B_5prime 10X_5prime Pre-_post-IO NSCLC GRCh38-3.0.0 \n", - "PM-1779_LC479A_5prime 10X_5prime Pre-_post-IO NSCLC GRCh38-3.0.0 \n", - "PM-1779_LC479B_5prime 10X_5prime Pre-_post-IO NSCLC GRCh38-3.0.0 " + " project_id reference \n", + "Sample \n", + "IgG_A 9p s3://seqc-public/genomes/mm38_long_p... \n", + "IgG_C 9p s3://seqc-public/genomes/mm38_long_p... \n", + "IFNAR_A 9p s3://seqc-public/genomes/mm38_long_p... " ] }, "execution_count": 8, @@ -286,10 +273,10 @@ "source": [ "# You can supply a list of IDs or request IDs\n", "\n", - "# request_ids = ['PM-1779']\n", + "# request_ids = ['ARN-1167']\n", "# samples = sample_scridb_info(request_ids, 'request_id', creds)\n", "\n", - "sample_ids = list(range(4004, 4008))\n", + "sample_ids = list(range(2638, 2641))\n", "samples = sample_scridb_info(sample_ids, 'id', creds)\n", "\n", "samples" @@ -298,7 +285,7 @@ { "cell_type": "code", "execution_count": null, - "id": "06cc685e-636e-4c95-8243-7bf03c497134", + "id": "fd4c6943-69e1-4986-ae3b-2ec58e8f0d58", "metadata": {}, "outputs": [], "source": [] @@ -323,21 +310,21 @@ "name": "stdout", "output_type": "stream", "text": [ - "PM-1779_LC441_A_5prime\n", - " PRE PM-1779_LC441_A_5prime/\n", - " PRE PM-1779_LC441_A_5prime_TCR_VDJ/\n", + "IgG_A\n", + " PRE BM-1754_IgG_A_IFNpooled/\n", + " PRE IgG_A/\n", + " PRE IgG_A_HTO/\n", "\n", - "PM-1779_LC441_B_5prime\n", - " PRE PM-1779_LC441_B_5prime/\n", - " PRE PM-1779_LC441_B_5prime_TCR_VDJ/\n", + "IgG_C\n", + " PRE BM-1286_IgG_C_IFN_enriched/\n", + " PRE BM-1754_IgG_C_IFNpooled/\n", + " PRE IgG_C/\n", + " PRE IgG_C_HTO/\n", "\n", - "PM-1779_LC479A_5prime\n", - " PRE PM-1779_LC479A_5prime/\n", - " PRE PM-1779_LC479A_5prime_TCR_VDJ/\n", - "\n", - "PM-1779_LC479B_5prime\n", - " PRE PM-1779_LC479B_5prime/\n", - " PRE PM-1779_LC479B_5prime_TCR_VDJ/\n", + "IFNAR_A\n", + " PRE BM-1754_IFNAR_A_IFNpooled/\n", + " PRE IFNAR_A/\n", + " PRE IFNAR_A_HTO/\n", "\n" ] } @@ -353,12 +340,29 @@ " print()" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "175055cd-ebda-4485-a2bf-0f869cb4180b", + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "code", "execution_count": 10, "id": "e85154ba-47ad-4f3a-b2c8-9c81f2d33e23", "metadata": {}, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "IgG_A\n", + "IgG_C\n", + "IFNAR_A\n" + ] + }, { "data": { "text/html": [ @@ -401,86 +405,232 @@ " \n", " \n", " \n", - " PM-1779_LC441_A_5prime\n", - " s3://dp-lab-data/collaborators/rudin...\n", - " 4004\n", - " human\n", - " 10X_5prime\n", - " Pre-_post-IO NSCLC\n", - " GRCh38-3.0.0\n", - " {'I1': ['s3://dp-lab-data/collaborat...\n", + " IgG_A\n", + " s3://dp-lab-data/collaborators/lowe/...\n", + " 2638\n", + " mouse\n", + " 10X_V3.1\n", + " 9p\n", + " s3://seqc-public/genomes/mm38_long_p...\n", + " {'R1': ['s3://dp-lab-data/collaborat...\n", + " \n", + " \n", + " IgG_C\n", + " s3://dp-lab-data/collaborators/lowe/...\n", + " 2639\n", + " mouse\n", + " 10X_V3.1\n", + " 9p\n", + " s3://seqc-public/genomes/mm38_long_p...\n", + " {'R1': ['s3://dp-lab-data/collaborat...\n", + " \n", + " \n", + " IFNAR_A\n", + " s3://dp-lab-data/collaborators/lowe/...\n", + " 2640\n", + " mouse\n", + " 10X_V3.1\n", + " 9p\n", + " s3://seqc-public/genomes/mm38_long_p...\n", + " {'R1': ['s3://dp-lab-data/collaborat...\n", + " \n", + " \n", + "\n", + "" + ], + "text/plain": [ + " AWS_storage id species sc_tech \\\n", + "Sample \n", + "IgG_A s3://dp-lab-data/collaborators/lowe/... 2638 mouse 10X_V3.1 \n", + "IgG_C s3://dp-lab-data/collaborators/lowe/... 2639 mouse 10X_V3.1 \n", + "IFNAR_A s3://dp-lab-data/collaborators/lowe/... 2640 mouse 10X_V3.1 \n", + "\n", + " project_id reference \\\n", + "Sample \n", + "IgG_A 9p s3://seqc-public/genomes/mm38_long_p... \n", + "IgG_C 9p s3://seqc-public/genomes/mm38_long_p... \n", + "IFNAR_A 9p s3://seqc-public/genomes/mm38_long_p... \n", + "\n", + " FASTQs \n", + "Sample \n", + "IgG_A {'R1': ['s3://dp-lab-data/collaborat... \n", + "IgG_C {'R1': ['s3://dp-lab-data/collaborat... \n", + "IFNAR_A {'R1': ['s3://dp-lab-data/collaborat... " + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# If FASTQ files are in one folder\n", + "# fastq_map = ['R1','R2']\n", + "# samples[\"FASTQs\"] = samples[\"AWS_storage\"].apply(lambda x: get_fastqs(x, fastq_map, \"FASTQ\"))\n", + "\n", + "# samples[\"FASTQs\"] = samples[\"AWS_storage\"].apply(lambda x: get_fastqs(x, fastq_map[prefix], \"FASTQ\"))\n", + "\n", + "# If the sample has SEQC split FASTQ files into different folders\n", + "fastqs = []\n", + "for sample, row in samples.iterrows():\n", + " print(sample)\n", + " r1 = get_fastqs(row['AWS_storage'], ['R1'], \"barcode\")\n", + " r2 = get_fastqs(row['AWS_storage'], ['R2'], \"genomic\")\n", + " \n", + " fastqs.append({**r1, **r2})\n", + " \n", + "samples['FASTQs'] = fastqs\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f09b80a6-bed0-4eb0-80c6-45af8a88e35f", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "5cd3153e-5291-4d9b-b094-6e0704e594a7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
AWS_storageidspeciessc_techproject_idreferenceFASTQsFASTQ_list
Sample
PM-1779_LC441_B_5primes3://dp-lab-data/collaborators/rudin...4005human10X_5primePre-_post-IO NSCLCGRCh38-3.0.0{'I1': ['s3://dp-lab-data/collaborat...IgG_As3://dp-lab-data/collaborators/lowe/...2638mouse10X_V3.19ps3://seqc-public/genomes/mm38_long_p...{'R1': ['s3://dp-lab-data/collaborat...[s3://dp-lab-data/collaborators/lowe...
PM-1779_LC479A_5primes3://dp-lab-data/collaborators/rudin...4006human10X_5primePre-_post-IO NSCLCGRCh38-3.0.0{'I1': ['s3://dp-lab-data/collaborat...IgG_Cs3://dp-lab-data/collaborators/lowe/...2639mouse10X_V3.19ps3://seqc-public/genomes/mm38_long_p...{'R1': ['s3://dp-lab-data/collaborat...[s3://dp-lab-data/collaborators/lowe...
PM-1779_LC479B_5primes3://dp-lab-data/collaborators/rudin...4007human10X_5primePre-_post-IO NSCLCGRCh38-3.0.0{'I1': ['s3://dp-lab-data/collaborat...IFNAR_As3://dp-lab-data/collaborators/lowe/...2640mouse10X_V3.19ps3://seqc-public/genomes/mm38_long_p...{'R1': ['s3://dp-lab-data/collaborat...[s3://dp-lab-data/collaborators/lowe...
\n", "
" ], "text/plain": [ - " AWS_storage id species \\\n", - "Sample \n", - "PM-1779_LC441_A_5prime s3://dp-lab-data/collaborators/rudin... 4004 human \n", - "PM-1779_LC441_B_5prime s3://dp-lab-data/collaborators/rudin... 4005 human \n", - "PM-1779_LC479A_5prime s3://dp-lab-data/collaborators/rudin... 4006 human \n", - "PM-1779_LC479B_5prime s3://dp-lab-data/collaborators/rudin... 4007 human \n", + " AWS_storage id species sc_tech \\\n", + "Sample \n", + "IgG_A s3://dp-lab-data/collaborators/lowe/... 2638 mouse 10X_V3.1 \n", + "IgG_C s3://dp-lab-data/collaborators/lowe/... 2639 mouse 10X_V3.1 \n", + "IFNAR_A s3://dp-lab-data/collaborators/lowe/... 2640 mouse 10X_V3.1 \n", + "\n", + " project_id reference \\\n", + "Sample \n", + "IgG_A 9p s3://seqc-public/genomes/mm38_long_p... \n", + "IgG_C 9p s3://seqc-public/genomes/mm38_long_p... \n", + "IFNAR_A 9p s3://seqc-public/genomes/mm38_long_p... \n", "\n", - " sc_tech project_id reference \\\n", - "Sample \n", - "PM-1779_LC441_A_5prime 10X_5prime Pre-_post-IO NSCLC GRCh38-3.0.0 \n", - "PM-1779_LC441_B_5prime 10X_5prime Pre-_post-IO NSCLC GRCh38-3.0.0 \n", - "PM-1779_LC479A_5prime 10X_5prime Pre-_post-IO NSCLC GRCh38-3.0.0 \n", - "PM-1779_LC479B_5prime 10X_5prime Pre-_post-IO NSCLC GRCh38-3.0.0 \n", + " FASTQs \\\n", + "Sample \n", + "IgG_A {'R1': ['s3://dp-lab-data/collaborat... \n", + "IgG_C {'R1': ['s3://dp-lab-data/collaborat... \n", + "IFNAR_A {'R1': ['s3://dp-lab-data/collaborat... \n", "\n", - " FASTQs \n", - "Sample \n", - "PM-1779_LC441_A_5prime {'I1': ['s3://dp-lab-data/collaborat... \n", - "PM-1779_LC441_B_5prime {'I1': ['s3://dp-lab-data/collaborat... \n", - "PM-1779_LC479A_5prime {'I1': ['s3://dp-lab-data/collaborat... \n", - "PM-1779_LC479B_5prime {'I1': ['s3://dp-lab-data/collaborat... " + " FASTQ_list \n", + "Sample \n", + "IgG_A [s3://dp-lab-data/collaborators/lowe... \n", + "IgG_C [s3://dp-lab-data/collaborators/lowe... \n", + "IFNAR_A [s3://dp-lab-data/collaborators/lowe... " ] }, - "execution_count": 10, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "samples[\"FASTQs\"] = samples[\"AWS_storage\"].apply(lambda x: get_fastqs(x, fastq_map[prefix], \"FASTQ\"))\n", + "samples['FASTQ_list'] = [[]] * len(samples)\n", + "\n", + "fastqs = []\n", + "\n", + "for sample, row in samples.iterrows():\n", + " fastq_list = np.ravel(list(row['FASTQs'].values()))\n", + " \n", + " fastq_samp = []\n", + " for fastq in fastq_list:\n", + " filename = fastq.split('/')[-1]\n", + " if filename.startswith('26'):\n", + " fastq_samp.append(fastq)\n", + " fastqs.append(fastq_samp)\n", + "\n", + "samples['FASTQ_list'] = fastqs\n", "samples" ] }, { "cell_type": "code", "execution_count": null, - "id": "b6a866f5-621b-442c-b7f3-fba3a405a3ba", + "id": "d8f7b1bf-a605-4748-8858-978c2392c271", "metadata": {}, "outputs": [], "source": [] @@ -497,7 +647,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 12, "id": "e8d952ba-cdad-4b93-80d2-7b0dba6f6a89", "metadata": {}, "outputs": [ @@ -505,10 +655,15 @@ "name": "stdout", "output_type": "stream", "text": [ - "PM-1779_LC441_A_5prime\n", - "PM-1779_LC441_B_5prime\n", - "PM-1779_LC479A_5prime\n", - "PM-1779_LC479B_5prime\n" + "IgG_A\n", + "collaborators/lowe/9P/IgG_A/genomic/2638_IgG_A_IGO_12104_32_S20_L001_R2_001.fastq.gz\tcollaborators/lowe/9P/IgG_A/genomic/2638_IgG_A_IGO_12104_32_S20_L002_R2_001.fastq.gz\tcollaborators/lowe/9P/IgG_A/genomic/2638_IgG_A_IGO_12104_32_S20_L003_R2_001.fastq.gz\tcollaborators/lowe/9P/IgG_A/genomic/2638_IgG_A_IGO_12104_32_S20_L004_R2_001.fastq.gz\tcollaborators/lowe/9P/IgG_A/genomic/2917_IgG_A_IGO_12317_37_S35_L001_R2_001.fastq.gz\tcollaborators/lowe/9P/IgG_A/genomic/2917_IgG_A_IGO_12317_37_S35_L002_R2_001.fastq.gz\tcollaborators/lowe/9P/IgG_A/genomic/2917_IgG_A_IGO_12317_37_S35_L003_R2_001.fastq.gz\tcollaborators/lowe/9P/IgG_A/genomic/2917_IgG_A_IGO_12317_37_S35_L004_R2_001.fastq.gz\n", + "collaborators/lowe/9P/IgG_A/barcode/2638_IgG_A_IGO_12104_32_S20_L001_R1_001.fastq.gz\tcollaborators/lowe/9P/IgG_A/barcode/2638_IgG_A_IGO_12104_32_S20_L002_R1_001.fastq.gz\tcollaborators/lowe/9P/IgG_A/barcode/2638_IgG_A_IGO_12104_32_S20_L003_R1_001.fastq.gz\tcollaborators/lowe/9P/IgG_A/barcode/2638_IgG_A_IGO_12104_32_S20_L004_R1_001.fastq.gz\tcollaborators/lowe/9P/IgG_A/barcode/2917_IgG_A_IGO_12317_37_S35_L001_R1_001.fastq.gz\tcollaborators/lowe/9P/IgG_A/barcode/2917_IgG_A_IGO_12317_37_S35_L002_R1_001.fastq.gz\tcollaborators/lowe/9P/IgG_A/barcode/2917_IgG_A_IGO_12317_37_S35_L003_R1_001.fastq.gz\tcollaborators/lowe/9P/IgG_A/barcode/2917_IgG_A_IGO_12317_37_S35_L004_R1_001.fastq.gz\n", + "IgG_C\n", + "collaborators/lowe/9P/IgG_C/barcode/2639_IgG_C_IGO_12104_33_S19_L001_R1_001.fastq.gz\tcollaborators/lowe/9P/IgG_C/barcode/2639_IgG_C_IGO_12104_33_S19_L002_R1_001.fastq.gz\tcollaborators/lowe/9P/IgG_C/barcode/2639_IgG_C_IGO_12104_33_S19_L003_R1_001.fastq.gz\tcollaborators/lowe/9P/IgG_C/barcode/2639_IgG_C_IGO_12104_33_S19_L004_R1_001.fastq.gz\tcollaborators/lowe/9P/IgG_C/barcode/2918_IgG_C_IGO_12317_38_S36_L001_R1_001.fastq.gz\tcollaborators/lowe/9P/IgG_C/barcode/2918_IgG_C_IGO_12317_38_S36_L002_R1_001.fastq.gz\tcollaborators/lowe/9P/IgG_C/barcode/2918_IgG_C_IGO_12317_38_S36_L003_R1_001.fastq.gz\tcollaborators/lowe/9P/IgG_C/barcode/2918_IgG_C_IGO_12317_38_S36_L004_R1_001.fastq.gz\n", + "collaborators/lowe/9P/IgG_C/genomic/2639_IgG_C_IGO_12104_33_S19_L001_R2_001.fastq.gz\tcollaborators/lowe/9P/IgG_C/genomic/2639_IgG_C_IGO_12104_33_S19_L002_R2_001.fastq.gz\tcollaborators/lowe/9P/IgG_C/genomic/2639_IgG_C_IGO_12104_33_S19_L003_R2_001.fastq.gz\tcollaborators/lowe/9P/IgG_C/genomic/2639_IgG_C_IGO_12104_33_S19_L004_R2_001.fastq.gz\tcollaborators/lowe/9P/IgG_C/genomic/2918_IgG_C_IGO_12317_38_S36_L001_R2_001.fastq.gz\tcollaborators/lowe/9P/IgG_C/genomic/2918_IgG_C_IGO_12317_38_S36_L002_R2_001.fastq.gz\tcollaborators/lowe/9P/IgG_C/genomic/2918_IgG_C_IGO_12317_38_S36_L003_R2_001.fastq.gz\tcollaborators/lowe/9P/IgG_C/genomic/2918_IgG_C_IGO_12317_38_S36_L004_R2_001.fastq.gz\n", + "IFNAR_A\n", + "collaborators/lowe/9P/IFNAR_A/barcode/2640_IFNAR_A_IGO_12104_34_S21_L001_R1_001.fastq.gz\tcollaborators/lowe/9P/IFNAR_A/barcode/2640_IFNAR_A_IGO_12104_34_S21_L002_R1_001.fastq.gz\tcollaborators/lowe/9P/IFNAR_A/barcode/2640_IFNAR_A_IGO_12104_34_S21_L003_R1_001.fastq.gz\tcollaborators/lowe/9P/IFNAR_A/barcode/2640_IFNAR_A_IGO_12104_34_S21_L004_R1_001.fastq.gz\n", + "collaborators/lowe/9P/IFNAR_A/genomic/2640_IFNAR_A_IGO_12104_34_S21_L001_R2_001.fastq.gz\tcollaborators/lowe/9P/IFNAR_A/genomic/2640_IFNAR_A_IGO_12104_34_S21_L002_R2_001.fastq.gz\tcollaborators/lowe/9P/IFNAR_A/genomic/2640_IFNAR_A_IGO_12104_34_S21_L003_R2_001.fastq.gz\tcollaborators/lowe/9P/IFNAR_A/genomic/2640_IFNAR_A_IGO_12104_34_S21_L004_R2_001.fastq.gz\n" ] } ], @@ -547,7 +702,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 13, "id": "16d0ca53-edc7-4e1b-9c9c-0d812a1ae1c7", "metadata": {}, "outputs": [ @@ -579,6 +734,7 @@ " project_id\n", " reference\n", " FASTQs\n", + " FASTQ_list\n", " \n", " \n", " Sample\n", @@ -589,84 +745,74 @@ " \n", " \n", " \n", + " \n", " \n", " \n", " \n", " \n", - " PM-1779_LC441_A_5prime\n", - " s3://dp-lab-data/collaborators/rudin...\n", - " 4004\n", - " human\n", - " 10X_5prime\n", - " Pre-_post-IO NSCLC\n", - " https://cf.10xgenomics.com/supp/cell...\n", - " {'I1': ['s3://dp-lab-data/collaborat...\n", - " \n", - " \n", - " PM-1779_LC441_B_5prime\n", - " s3://dp-lab-data/collaborators/rudin...\n", - " 4005\n", - " human\n", - " 10X_5prime\n", - " Pre-_post-IO NSCLC\n", + " IgG_A\n", + " s3://dp-lab-data/collaborators/lowe/...\n", + " 2638\n", + " mouse\n", + " 10X_V3.1\n", + " 9p\n", " https://cf.10xgenomics.com/supp/cell...\n", - " {'I1': ['s3://dp-lab-data/collaborat...\n", + " {'R1': ['s3://dp-lab-data/collaborat...\n", + " [s3://dp-lab-data/collaborators/lowe...\n", " \n", " \n", - " PM-1779_LC479A_5prime\n", - " s3://dp-lab-data/collaborators/rudin...\n", - " 4006\n", - " human\n", - " 10X_5prime\n", - " Pre-_post-IO NSCLC\n", + " IgG_C\n", + " s3://dp-lab-data/collaborators/lowe/...\n", + " 2639\n", + " mouse\n", + " 10X_V3.1\n", + " 9p\n", " https://cf.10xgenomics.com/supp/cell...\n", - " {'I1': ['s3://dp-lab-data/collaborat...\n", + " {'R1': ['s3://dp-lab-data/collaborat...\n", + " [s3://dp-lab-data/collaborators/lowe...\n", " \n", " \n", - " PM-1779_LC479B_5prime\n", - " s3://dp-lab-data/collaborators/rudin...\n", - " 4007\n", - " human\n", - " 10X_5prime\n", - " Pre-_post-IO NSCLC\n", + " IFNAR_A\n", + " s3://dp-lab-data/collaborators/lowe/...\n", + " 2640\n", + " mouse\n", + " 10X_V3.1\n", + " 9p\n", " https://cf.10xgenomics.com/supp/cell...\n", - " {'I1': ['s3://dp-lab-data/collaborat...\n", + " {'R1': ['s3://dp-lab-data/collaborat...\n", + " [s3://dp-lab-data/collaborators/lowe...\n", " \n", " \n", "\n", "" ], "text/plain": [ - " AWS_storage id species \\\n", - "Sample \n", - "PM-1779_LC441_A_5prime s3://dp-lab-data/collaborators/rudin... 4004 human \n", - "PM-1779_LC441_B_5prime s3://dp-lab-data/collaborators/rudin... 4005 human \n", - "PM-1779_LC479A_5prime s3://dp-lab-data/collaborators/rudin... 4006 human \n", - "PM-1779_LC479B_5prime s3://dp-lab-data/collaborators/rudin... 4007 human \n", + " AWS_storage id species sc_tech \\\n", + "Sample \n", + "IgG_A s3://dp-lab-data/collaborators/lowe/... 2638 mouse 10X_V3.1 \n", + "IgG_C s3://dp-lab-data/collaborators/lowe/... 2639 mouse 10X_V3.1 \n", + "IFNAR_A s3://dp-lab-data/collaborators/lowe/... 2640 mouse 10X_V3.1 \n", "\n", - " sc_tech project_id \\\n", - "Sample \n", - "PM-1779_LC441_A_5prime 10X_5prime Pre-_post-IO NSCLC \n", - "PM-1779_LC441_B_5prime 10X_5prime Pre-_post-IO NSCLC \n", - "PM-1779_LC479A_5prime 10X_5prime Pre-_post-IO NSCLC \n", - "PM-1779_LC479B_5prime 10X_5prime Pre-_post-IO NSCLC \n", + " project_id reference \\\n", + "Sample \n", + "IgG_A 9p https://cf.10xgenomics.com/supp/cell... \n", + "IgG_C 9p https://cf.10xgenomics.com/supp/cell... \n", + "IFNAR_A 9p https://cf.10xgenomics.com/supp/cell... \n", "\n", - " reference \\\n", - "Sample \n", - "PM-1779_LC441_A_5prime https://cf.10xgenomics.com/supp/cell... \n", - "PM-1779_LC441_B_5prime https://cf.10xgenomics.com/supp/cell... \n", - "PM-1779_LC479A_5prime https://cf.10xgenomics.com/supp/cell... \n", - "PM-1779_LC479B_5prime https://cf.10xgenomics.com/supp/cell... \n", + " FASTQs \\\n", + "Sample \n", + "IgG_A {'R1': ['s3://dp-lab-data/collaborat... \n", + "IgG_C {'R1': ['s3://dp-lab-data/collaborat... \n", + "IFNAR_A {'R1': ['s3://dp-lab-data/collaborat... \n", "\n", - " FASTQs \n", - "Sample \n", - "PM-1779_LC441_A_5prime {'I1': ['s3://dp-lab-data/collaborat... \n", - "PM-1779_LC441_B_5prime {'I1': ['s3://dp-lab-data/collaborat... \n", - "PM-1779_LC479A_5prime {'I1': ['s3://dp-lab-data/collaborat... \n", - "PM-1779_LC479B_5prime {'I1': ['s3://dp-lab-data/collaborat... " + " FASTQ_list \n", + "Sample \n", + "IgG_A [s3://dp-lab-data/collaborators/lowe... \n", + "IgG_C [s3://dp-lab-data/collaborators/lowe... \n", + "IFNAR_A [s3://dp-lab-data/collaborators/lowe... " ] }, - "execution_count": 11, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -676,10 +822,34 @@ "samples" ] }, + { + "cell_type": "code", + "execution_count": 14, + "id": "e5dee5bc-3e06-4e62-a780-1a5b4aeff1f7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['https://cf.10xgenomics.com/supp/cell-exp/refdata-gex-mm10-2020-A.tar.gz',\n", + " 'https://cf.10xgenomics.com/supp/cell-exp/refdata-gex-mm10-2020-A.tar.gz',\n", + " 'https://cf.10xgenomics.com/supp/cell-exp/refdata-gex-mm10-2020-A.tar.gz']" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# samples['reference'] = 'https://dp-lab-data.s3.amazonaws.com/collaborators/aboire/LeptomeningealMetHeterogeneity/transgene_reference/refdata-cellranger/Leptomeningeal_metastasis_heterogeneity-GRCm38-Ensembl-87-transgenes.tar.gz'\n", + "list(samples['reference'])" + ] + }, { "cell_type": "code", "execution_count": null, - "id": "56ea3b42-967e-49aa-8344-93420514c6e1", + "id": "c17d2515-3139-4f9f-ac81-af33948c8d9d", "metadata": {}, "outputs": [], "source": [] @@ -694,7 +864,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 15, "id": "493bb219-4f15-4028-bc80-79b13a24b6f4", "metadata": {}, "outputs": [ @@ -742,21 +912,10 @@ " \n", " \n", " \n", - " PM-1779_LC441_A_5prime\n", - " PM-1779_LC441_A_5prime\n", - " 4004_PM-1779_LC441_A_5prime_IGO_1243...\n", - " [s3://dp-lab-data/collaborators/rudi...\n", - " https://cf.10xgenomics.com/supp/cell...\n", - " False\n", - " 5000\n", - " 256\n", - " quay.io/hisplan\n", - " \n", - " \n", - " PM-1779_LC441_B_5prime\n", - " PM-1779_LC441_B_5prime\n", - " 4005_PM-1779_LC441_B_5prime_IGO_1243...\n", - " [s3://dp-lab-data/collaborators/rudi...\n", + " IgG_A\n", + " IgG_A\n", + " 2638_IgG_A_IGO_12104_32\n", + " [s3://dp-lab-data/collaborators/lowe...\n", " https://cf.10xgenomics.com/supp/cell...\n", " False\n", " 5000\n", @@ -764,10 +923,10 @@ " quay.io/hisplan\n", " \n", " \n", - " PM-1779_LC479A_5prime\n", - " PM-1779_LC479A_5prime\n", - " 4006_PM-1779_LC479A_5prime_IGO_12437...\n", - " [s3://dp-lab-data/collaborators/rudi...\n", + " IgG_C\n", + " IgG_C\n", + " 2639_IgG_C_IGO_12104_33\n", + " [s3://dp-lab-data/collaborators/lowe...\n", " https://cf.10xgenomics.com/supp/cell...\n", " False\n", " 5000\n", @@ -775,10 +934,10 @@ " quay.io/hisplan\n", " \n", " \n", - " PM-1779_LC479B_5prime\n", - " PM-1779_LC479B_5prime\n", - " 4007_PM-1779_LC479B_5prime_IGO_12437...\n", - " [s3://dp-lab-data/collaborators/rudi...\n", + " IFNAR_A\n", + " IFNAR_A\n", + " 2640_IFNAR_A_IGO_12104_34\n", + " [s3://dp-lab-data/collaborators/lowe...\n", " https://cf.10xgenomics.com/supp/cell...\n", " False\n", " 5000\n", @@ -790,57 +949,38 @@ "" ], "text/plain": [ - " CellRangerGex.sampleName \\\n", - "Sample \n", - "PM-1779_LC441_A_5prime PM-1779_LC441_A_5prime \n", - "PM-1779_LC441_B_5prime PM-1779_LC441_B_5prime \n", - "PM-1779_LC479A_5prime PM-1779_LC479A_5prime \n", - "PM-1779_LC479B_5prime PM-1779_LC479B_5prime \n", - "\n", - " CellRangerGex.fastqName \\\n", - "Sample \n", - "PM-1779_LC441_A_5prime 4004_PM-1779_LC441_A_5prime_IGO_1243... \n", - "PM-1779_LC441_B_5prime 4005_PM-1779_LC441_B_5prime_IGO_1243... \n", - "PM-1779_LC479A_5prime 4006_PM-1779_LC479A_5prime_IGO_12437... \n", - "PM-1779_LC479B_5prime 4007_PM-1779_LC479B_5prime_IGO_12437... \n", - "\n", - " CellRangerGex.inputFastq \\\n", - "Sample \n", - "PM-1779_LC441_A_5prime [s3://dp-lab-data/collaborators/rudi... \n", - "PM-1779_LC441_B_5prime [s3://dp-lab-data/collaborators/rudi... \n", - "PM-1779_LC479A_5prime [s3://dp-lab-data/collaborators/rudi... \n", - "PM-1779_LC479B_5prime [s3://dp-lab-data/collaborators/rudi... \n", + " CellRangerGex.sampleName CellRangerGex.fastqName \\\n", + "Sample \n", + "IgG_A IgG_A 2638_IgG_A_IGO_12104_32 \n", + "IgG_C IgG_C 2639_IgG_C_IGO_12104_33 \n", + "IFNAR_A IFNAR_A 2640_IFNAR_A_IGO_12104_34 \n", "\n", - " CellRangerGex.referenceUrl \\\n", - "Sample \n", - "PM-1779_LC441_A_5prime https://cf.10xgenomics.com/supp/cell... \n", - "PM-1779_LC441_B_5prime https://cf.10xgenomics.com/supp/cell... \n", - "PM-1779_LC479A_5prime https://cf.10xgenomics.com/supp/cell... \n", - "PM-1779_LC479B_5prime https://cf.10xgenomics.com/supp/cell... \n", + " CellRangerGex.inputFastq \\\n", + "Sample \n", + "IgG_A [s3://dp-lab-data/collaborators/lowe... \n", + "IgG_C [s3://dp-lab-data/collaborators/lowe... \n", + "IFNAR_A [s3://dp-lab-data/collaborators/lowe... \n", "\n", - " CellRangerGex.includeIntrons \\\n", - "Sample \n", - "PM-1779_LC441_A_5prime False \n", - "PM-1779_LC441_B_5prime False \n", - "PM-1779_LC479A_5prime False \n", - "PM-1779_LC479B_5prime False \n", + " CellRangerGex.referenceUrl \\\n", + "Sample \n", + "IgG_A https://cf.10xgenomics.com/supp/cell... \n", + "IgG_C https://cf.10xgenomics.com/supp/cell... \n", + "IFNAR_A https://cf.10xgenomics.com/supp/cell... \n", "\n", - " CellRangerGex.expectCells CellRangerGex.memory \\\n", - "Sample \n", - "PM-1779_LC441_A_5prime 5000 256 \n", - "PM-1779_LC441_B_5prime 5000 256 \n", - "PM-1779_LC479A_5prime 5000 256 \n", - "PM-1779_LC479B_5prime 5000 256 \n", + " CellRangerGex.includeIntrons CellRangerGex.expectCells \\\n", + "Sample \n", + "IgG_A False 5000 \n", + "IgG_C False 5000 \n", + "IFNAR_A False 5000 \n", "\n", - " CellRangerGex.dockerRegistry \n", - "Sample \n", - "PM-1779_LC441_A_5prime quay.io/hisplan \n", - "PM-1779_LC441_B_5prime quay.io/hisplan \n", - "PM-1779_LC479A_5prime quay.io/hisplan \n", - "PM-1779_LC479B_5prime quay.io/hisplan " + " CellRangerGex.memory CellRangerGex.dockerRegistry \n", + "Sample \n", + "IgG_A 256 quay.io/hisplan \n", + "IgG_C 256 quay.io/hisplan \n", + "IFNAR_A 256 quay.io/hisplan " ] }, - "execution_count": 12, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -857,7 +997,8 @@ "\n", "# Annotate inputs\n", "inputs[f\"{prefix}.sampleName\"] = inputs.index # may need to change\n", - "inputs[f\"{prefix}.inputFastq\"] = samples[\"FASTQs\"].apply(lambda x: np.ravel(list(x.values())))\n", + "inputs[f\"{prefix}.inputFastq\"] = samples['FASTQ_list']\n", + "# inputs[f\"{prefix}.inputFastq\"] = samples[\"FASTQs\"].apply(lambda x: np.ravel(list(x.values())))\n", "inputs[f\"{prefix}.fastqName\"] = inputs[f\"{prefix}.inputFastq\"].apply(lambda x: get_fastqs_name(x))\n", "inputs[f\"{prefix}.referenceUrl\"] = samples[\"reference\"] \n", "inputs[f\"{prefix}.includeIntrons\"] = False\n", @@ -871,7 +1012,15 @@ { "cell_type": "code", "execution_count": null, - "id": "9785f91c-a79e-44ad-b7df-403b557c7d74", + "id": "5597cb90-97fd-434e-91b8-d45139e7f9b4", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "627d7281-9c1c-4644-8925-7d709cc6ae82", "metadata": {}, "outputs": [], "source": [] @@ -888,14 +1037,13 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 16, "id": "c30e1518-da11-4069-a501-32f9e04ef389", "metadata": {}, "outputs": [], "source": [ "# Modification for specific samples\n", - "\n", - "inputs[f'{prefix}.includeIntrons'] = True" + "inputs[f'{prefix}.includeIntrons'] = False" ] }, { @@ -916,7 +1064,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 17, "id": "03d5abbb-6bf0-4636-8bb7-edd2463439c7", "metadata": {}, "outputs": [ @@ -962,42 +1110,32 @@ " \n", " \n", " \n", - " PM-1779_LC441_A_5prime\n", - " CellRangerGex\n", - " Pre-_post-IO NSCLC\n", - " PM-1779_LC441_A_5prime\n", - " sohailn\n", - " s3://dp-lab-data/collaborators/rudin...\n", - " -\n", - " sohailn\n", - " \n", - " \n", - " PM-1779_LC441_B_5prime\n", + " IgG_A\n", " CellRangerGex\n", - " Pre-_post-IO NSCLC\n", - " PM-1779_LC441_B_5prime\n", + " 9p\n", + " IgG_A\n", " sohailn\n", - " s3://dp-lab-data/collaborators/rudin...\n", + " s3://dp-lab-data/collaborators/lowe/...\n", " -\n", " sohailn\n", " \n", " \n", - " PM-1779_LC479A_5prime\n", + " IgG_C\n", " CellRangerGex\n", - " Pre-_post-IO NSCLC\n", - " PM-1779_LC479A_5prime\n", + " 9p\n", + " IgG_C\n", " sohailn\n", - " s3://dp-lab-data/collaborators/rudin...\n", + " s3://dp-lab-data/collaborators/lowe/...\n", " -\n", " sohailn\n", " \n", " \n", - " PM-1779_LC479B_5prime\n", + " IFNAR_A\n", " CellRangerGex\n", - " Pre-_post-IO NSCLC\n", - " PM-1779_LC479B_5prime\n", + " 9p\n", + " IFNAR_A\n", " sohailn\n", - " s3://dp-lab-data/collaborators/rudin...\n", + " s3://dp-lab-data/collaborators/lowe/...\n", " -\n", " sohailn\n", " \n", @@ -1006,36 +1144,20 @@ "" ], "text/plain": [ - " pipelineType project \\\n", - "Sample \n", - "PM-1779_LC441_A_5prime CellRangerGex Pre-_post-IO NSCLC \n", - "PM-1779_LC441_B_5prime CellRangerGex Pre-_post-IO NSCLC \n", - "PM-1779_LC479A_5prime CellRangerGex Pre-_post-IO NSCLC \n", - "PM-1779_LC479B_5prime CellRangerGex Pre-_post-IO NSCLC \n", + " pipelineType project sample owner \\\n", + "Sample \n", + "IgG_A CellRangerGex 9p IgG_A sohailn \n", + "IgG_C CellRangerGex 9p IgG_C sohailn \n", + "IFNAR_A CellRangerGex 9p IFNAR_A sohailn \n", "\n", - " sample owner \\\n", - "Sample \n", - "PM-1779_LC441_A_5prime PM-1779_LC441_A_5prime sohailn \n", - "PM-1779_LC441_B_5prime PM-1779_LC441_B_5prime sohailn \n", - "PM-1779_LC479A_5prime PM-1779_LC479A_5prime sohailn \n", - "PM-1779_LC479B_5prime PM-1779_LC479B_5prime sohailn \n", - "\n", - " destination transfer \\\n", - "Sample \n", - "PM-1779_LC441_A_5prime s3://dp-lab-data/collaborators/rudin... - \n", - "PM-1779_LC441_B_5prime s3://dp-lab-data/collaborators/rudin... - \n", - "PM-1779_LC479A_5prime s3://dp-lab-data/collaborators/rudin... - \n", - "PM-1779_LC479B_5prime s3://dp-lab-data/collaborators/rudin... - \n", - "\n", - " comment \n", - "Sample \n", - "PM-1779_LC441_A_5prime sohailn \n", - "PM-1779_LC441_B_5prime sohailn \n", - "PM-1779_LC479A_5prime sohailn \n", - "PM-1779_LC479B_5prime sohailn " + " destination transfer comment \n", + "Sample \n", + "IgG_A s3://dp-lab-data/collaborators/lowe/... - sohailn \n", + "IgG_C s3://dp-lab-data/collaborators/lowe/... - sohailn \n", + "IFNAR_A s3://dp-lab-data/collaborators/lowe/... - sohailn " ] }, - "execution_count": 14, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -1086,7 +1208,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 18, "id": "ee601aed-3a19-4317-a918-4120db7ee7bf", "metadata": {}, "outputs": [ @@ -1134,47 +1256,163 @@ " \n", " \n", " \n", - " PM-1779_LC441_A_5prime\n", - " PM-1779_LC441_A_5prime\n", - " 4004_PM-1779_LC441_A_5prime_IGO_1243...\n", - " [s3://dp-lab-data/collaborators/rudi...\n", + " IgG_A\n", + " IgG_A\n", + " 2638_IgG_A_IGO_12104_32\n", + " [s3://dp-lab-data/collaborators/lowe...\n", " https://cf.10xgenomics.com/supp/cell...\n", - " True\n", + " False\n", " 5000\n", " 256\n", " quay.io/hisplan\n", " \n", " \n", - " PM-1779_LC441_B_5prime\n", - " PM-1779_LC441_B_5prime\n", - " 4005_PM-1779_LC441_B_5prime_IGO_1243...\n", - " [s3://dp-lab-data/collaborators/rudi...\n", + " IgG_C\n", + " IgG_C\n", + " 2639_IgG_C_IGO_12104_33\n", + " [s3://dp-lab-data/collaborators/lowe...\n", " https://cf.10xgenomics.com/supp/cell...\n", - " True\n", + " False\n", " 5000\n", " 256\n", " quay.io/hisplan\n", " \n", " \n", - " PM-1779_LC479A_5prime\n", - " PM-1779_LC479A_5prime\n", - " 4006_PM-1779_LC479A_5prime_IGO_12437...\n", - " [s3://dp-lab-data/collaborators/rudi...\n", + " IFNAR_A\n", + " IFNAR_A\n", + " 2640_IFNAR_A_IGO_12104_34\n", + " [s3://dp-lab-data/collaborators/lowe...\n", " https://cf.10xgenomics.com/supp/cell...\n", - " True\n", + " False\n", " 5000\n", " 256\n", " quay.io/hisplan\n", " \n", + " \n", + "\n", + "" + ], + "text/plain": [ + " CellRangerGex.sampleName CellRangerGex.fastqName \\\n", + "Sample \n", + "IgG_A IgG_A 2638_IgG_A_IGO_12104_32 \n", + "IgG_C IgG_C 2639_IgG_C_IGO_12104_33 \n", + "IFNAR_A IFNAR_A 2640_IFNAR_A_IGO_12104_34 \n", + "\n", + " CellRangerGex.inputFastq \\\n", + "Sample \n", + "IgG_A [s3://dp-lab-data/collaborators/lowe... \n", + "IgG_C [s3://dp-lab-data/collaborators/lowe... \n", + "IFNAR_A [s3://dp-lab-data/collaborators/lowe... \n", + "\n", + " CellRangerGex.referenceUrl \\\n", + "Sample \n", + "IgG_A https://cf.10xgenomics.com/supp/cell... \n", + "IgG_C https://cf.10xgenomics.com/supp/cell... \n", + "IFNAR_A https://cf.10xgenomics.com/supp/cell... \n", + "\n", + " CellRangerGex.includeIntrons CellRangerGex.expectCells \\\n", + "Sample \n", + "IgG_A False 5000 \n", + "IgG_C False 5000 \n", + "IFNAR_A False 5000 \n", + "\n", + " CellRangerGex.memory CellRangerGex.dockerRegistry \n", + "Sample \n", + "IgG_A 256 quay.io/hisplan \n", + "IgG_C 256 quay.io/hisplan \n", + "IFNAR_A 256 quay.io/hisplan " + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "inputs" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "22230ce9-a027-474f-90f5-c8d12c1096eb", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1182,68 +1420,51 @@ "" ], "text/plain": [ - " CellRangerGex.sampleName \\\n", - "Sample \n", - "PM-1779_LC441_A_5prime PM-1779_LC441_A_5prime \n", - "PM-1779_LC441_B_5prime PM-1779_LC441_B_5prime \n", - "PM-1779_LC479A_5prime PM-1779_LC479A_5prime \n", - "PM-1779_LC479B_5prime PM-1779_LC479B_5prime \n", - "\n", - " CellRangerGex.fastqName \\\n", - "Sample \n", - "PM-1779_LC441_A_5prime 4004_PM-1779_LC441_A_5prime_IGO_1243... \n", - "PM-1779_LC441_B_5prime 4005_PM-1779_LC441_B_5prime_IGO_1243... \n", - "PM-1779_LC479A_5prime 4006_PM-1779_LC479A_5prime_IGO_12437... \n", - "PM-1779_LC479B_5prime 4007_PM-1779_LC479B_5prime_IGO_12437... \n", - "\n", - " CellRangerGex.inputFastq \\\n", - "Sample \n", - "PM-1779_LC441_A_5prime [s3://dp-lab-data/collaborators/rudi... \n", - "PM-1779_LC441_B_5prime [s3://dp-lab-data/collaborators/rudi... \n", - "PM-1779_LC479A_5prime [s3://dp-lab-data/collaborators/rudi... \n", - "PM-1779_LC479B_5prime [s3://dp-lab-data/collaborators/rudi... \n", + " CellRangerGex.sampleName CellRangerGex.fastqName \\\n", + "Sample \n", + "IgG_A IgG_A 2638_IgG_A_IGO_12104_32 \n", + "IgG_C IgG_C 2639_IgG_C_IGO_12104_33 \n", + "IFNAR_A IFNAR_A 2640_IFNAR_A_IGO_12104_34 \n", "\n", - " CellRangerGex.referenceUrl \\\n", - "Sample \n", - "PM-1779_LC441_A_5prime https://cf.10xgenomics.com/supp/cell... \n", - "PM-1779_LC441_B_5prime https://cf.10xgenomics.com/supp/cell... \n", - "PM-1779_LC479A_5prime https://cf.10xgenomics.com/supp/cell... \n", - "PM-1779_LC479B_5prime https://cf.10xgenomics.com/supp/cell... \n", + " CellRangerGex.inputFastq \\\n", + "Sample \n", + "IgG_A [s3://dp-lab-data/collaborators/lowe... \n", + "IgG_C [s3://dp-lab-data/collaborators/lowe... \n", + "IFNAR_A [s3://dp-lab-data/collaborators/lowe... \n", "\n", - " CellRangerGex.includeIntrons \\\n", - "Sample \n", - "PM-1779_LC441_A_5prime True \n", - "PM-1779_LC441_B_5prime True \n", - "PM-1779_LC479A_5prime True \n", - "PM-1779_LC479B_5prime True \n", + " CellRangerGex.referenceUrl \\\n", + "Sample \n", + "IgG_A https://cf.10xgenomics.com/supp/cell... \n", + "IgG_C https://cf.10xgenomics.com/supp/cell... \n", + "IFNAR_A https://cf.10xgenomics.com/supp/cell... \n", "\n", - " CellRangerGex.expectCells CellRangerGex.memory \\\n", - "Sample \n", - "PM-1779_LC441_A_5prime 5000 256 \n", - "PM-1779_LC441_B_5prime 5000 256 \n", - "PM-1779_LC479A_5prime 5000 256 \n", - "PM-1779_LC479B_5prime 5000 256 \n", + " CellRangerGex.includeIntrons CellRangerGex.expectCells \\\n", + "Sample \n", + "IgG_A False 5000 \n", + "IgG_C False 5000 \n", + "IFNAR_A False 5000 \n", "\n", - " CellRangerGex.dockerRegistry \n", - "Sample \n", - "PM-1779_LC441_A_5prime quay.io/hisplan \n", - "PM-1779_LC441_B_5prime quay.io/hisplan \n", - "PM-1779_LC479A_5prime quay.io/hisplan \n", - "PM-1779_LC479B_5prime quay.io/hisplan " + " CellRangerGex.memory CellRangerGex.dockerRegistry \n", + "Sample \n", + "IgG_A 384 quay.io/hisplan \n", + "IgG_C 384 quay.io/hisplan \n", + "IFNAR_A 384 quay.io/hisplan " ] }, - "execution_count": 15, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ + "inputs[f'{prefix}.memory'] = inputs[f'{prefix}.memory'] * 1.5\n", + "inputs[f'{prefix}.memory'] = inputs[f'{prefix}.memory'].astype(int)\n", "inputs" ] }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 20, "id": "91318853-0886-4c2b-8b87-76fa8e5ab30d", "metadata": {}, "outputs": [ @@ -1289,42 +1510,32 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1333,36 +1544,20 @@ "" ], "text/plain": [ - " pipelineType project \\\n", - "Sample \n", - "PM-1779_LC441_A_5prime CellRangerGex Pre-_post-IO NSCLC \n", - "PM-1779_LC441_B_5prime CellRangerGex Pre-_post-IO NSCLC \n", - "PM-1779_LC479A_5prime CellRangerGex Pre-_post-IO NSCLC \n", - "PM-1779_LC479B_5prime CellRangerGex Pre-_post-IO NSCLC \n", - "\n", - " sample owner \\\n", - "Sample \n", - "PM-1779_LC441_A_5prime PM-1779_LC441_A_5prime sohailn \n", - "PM-1779_LC441_B_5prime PM-1779_LC441_B_5prime sohailn \n", - "PM-1779_LC479A_5prime PM-1779_LC479A_5prime sohailn \n", - "PM-1779_LC479B_5prime PM-1779_LC479B_5prime sohailn \n", + " pipelineType project sample owner \\\n", + "Sample \n", + "IgG_A CellRangerGex 9p IgG_A sohailn \n", + "IgG_C CellRangerGex 9p IgG_C sohailn \n", + "IFNAR_A CellRangerGex 9p IFNAR_A sohailn \n", "\n", - " destination transfer \\\n", - "Sample \n", - "PM-1779_LC441_A_5prime s3://dp-lab-data/collaborators/rudin... - \n", - "PM-1779_LC441_B_5prime s3://dp-lab-data/collaborators/rudin... - \n", - "PM-1779_LC479A_5prime s3://dp-lab-data/collaborators/rudin... - \n", - "PM-1779_LC479B_5prime s3://dp-lab-data/collaborators/rudin... - \n", - "\n", - " comment \n", - "Sample \n", - "PM-1779_LC441_A_5prime sohailn \n", - "PM-1779_LC441_B_5prime sohailn \n", - "PM-1779_LC479A_5prime sohailn \n", - "PM-1779_LC479B_5prime sohailn " + " destination transfer comment \n", + "Sample \n", + "IgG_A s3://dp-lab-data/collaborators/lowe/... - sohailn \n", + "IgG_C s3://dp-lab-data/collaborators/lowe/... - sohailn \n", + "IFNAR_A s3://dp-lab-data/collaborators/lowe/... - sohailn " ] }, - "execution_count": 16, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } @@ -1381,19 +1576,19 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 22, "id": "54ef3d9c-2361-4b8e-bcfe-bc9c3878876b", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "c2f4d0529c0b4610a3670959cbaad187", + "model_id": "62455c03a5c04c3abc1aee15d02ce014", "version_major": 2, "version_minor": 0 }, "text/plain": [ - " 0%| | 0/4 [00:00IMPORTANT NOTE \n", + "\n", + "You won't be able to see these outputs until the sample processing finishes succesfully :)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4e0a6894-0ce4-4041-be2f-49999c972503", + "metadata": {}, + "outputs": [], + "source": [ + "from IPython.display import IFrame\n", + "\n", + "for sample, row in labels.iterrows():\n", + " destination = row['destination']\n", + " html = f'{destination}/web_summary.html'\n", + " file_out = f'web_summary/{sample}.web_summary.html'\n", + " \n", + " !aws s3 cp $html $file_out\n", + " display(IFrame(src=file_out, width=980, height=600))" + ] } ], "metadata": { diff --git a/notebooks/Run_MitoTracing.ipynb b/notebooks/Run_MitoTracing.ipynb index 9ec639f..bed8633 100644 --- a/notebooks/Run_MitoTracing.ipynb +++ b/notebooks/Run_MitoTracing.ipynb @@ -41,7 +41,6 @@ "cell_type": "markdown", "id": "1b571064-b110-4a4d-b182-bbcb19af6fc8", "metadata": { - "jp-MarkdownHeadingCollapsed": true, "tags": [] }, "source": [ @@ -52,7 +51,6 @@ "cell_type": "markdown", "id": "47b3a514-cc78-40a4-87ff-0dfd817282e0", "metadata": { - "jp-MarkdownHeadingCollapsed": true, "tags": [] }, "source": [ @@ -148,7 +146,6 @@ "cell_type": "markdown", "id": "9773e79d-dfd6-4b33-9bd8-05781df1f038", "metadata": { - "jp-MarkdownHeadingCollapsed": true, "tags": [] }, "source": [ @@ -553,6 +550,31 @@ "outputs": [], "source": [] }, + { + "cell_type": "code", + "execution_count": 15, + "id": "0fe420cb-c03a-4870-b90a-4a95702e4c06", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "env: AWS_ACCESS_KEY_ID=ASIAYPY66CWMAZTZLBIZ\n", + "env: AWS_SECRET_ACCESS_KEY=RWPLXyEXmiXctvgQCJ9HSZHR5hRa45Rn+OZPFhkL\n", + "env: AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEEQaCXVzLWVhc3QtMSJGMEQCIBWB0eXrMdc1Lemh3nFZWCN3x1+AO4NfDshzkkW3Pgb8AiBrJn4f0xRlmQywOlTSK4SdnSFrtaqC0JC0ps4jaD5Z6yrvAQh9EAMaDDU4MzY0MzU2NzUxMiIMRYt+pCODMzjWPBYmKswBcHTPeT34M7NDeWwkhQap8X5P1Vzk+lTAdhxlPad+SG/FO8OzZlVftoiKsLBh4Gtdyj/3noNHMKNnLhUBgomY/Kfdu0cw991wBMzUq//ll/qz9yKL/B+tfax4bFmPR9Hx28uszeuDHA8UEJNYjhImWymlnoZXW5KFdsUTfwmGOnBeIUecJktJE1gnu2+XaS/YL47T8Y52GVc9OgT61gOkazyjekUFz917SsOPSZ2hsy6sNYrt3KVjz1ssdsE7sHufc+3zMmWjlgnuUmHVMM7CvJYGOpkB/5g/b4ykD9go6Ew12tdTc+ytpKdI9egsTvEKCmPfvLJTkpL+jaZokLWsGPGymMOD/DtmwvU+F/5cLMvNM4HaszkpIGWYFvXA6E2Cf7e6UihmHn4XQPmIFV84NxAvh5RDibxIEcP8+Cq03P/TV/kkXmiBzQZZx0G/UeBer4IFl8NncfliQo3K+jsuaklq8qUYN+d+zV8sAztt!aws s3 ls\n", + "\n", + "An error occurred (InvalidToken) when calling the ListBuckets operation: The provided token is malformed or otherwise invalid.\n" + ] + } + ], + "source": [ + "%env AWS_ACCESS_KEY_ID=ASIAYPY66CWMHAIEZY7R\n", + "%env AWS_SECRET_ACCESS_KEY=//xzl5ZNHGCBmDlozU5FA2td26q/F/JtS4TyOe1U\n", + "%env AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEP///////////wEaCXVzLWVhc3QtMSJHMEUCIQD7Fa4Y1B8mDaI0oCg+MDAtP2OEQVlZNPk26/41yWaC8gIgHdyQ/TXgj1yWaHJq/bJWdLnh1xrphPlbJSkGR7hqIboq7wEISBADGgw1ODM2NDM1Njc1MTIiDJ4r1nnSZ7sY9rkI/SrMAQDLEjg8Ln9YTrBEvOSKmDqKm5n8xmVkxyOovOnkW+1BZgYo9PYqYmmQ1v91+vjM05xI4jEMFW8zALcHLPeMU/Tbrho/kR9FXk9aEx4ocGtcGiKvwHzoK3UfEsfKHzPTSj/ntWx6bsTkiVFkz560Fy+ytqY+u640jOBOGTLn4oHZ7w+zYfZu+OcfMnYKCqGWPpnQ8d29r3y/QHXzhhoxcWpQLT4wfetwD/RUOvGHezufOo83/fFYNhvv7G3H5b+3b3tAohuK8XYso3nP+DDKzOWWBjqYAT+yt4iI52jkAqKSoS0B8lPsuIgeQrWC5aZrfGeKcvsw8HIc5fx/yxVRiO4zIvFaVkOhxUTWLuLusur0dObgqayALRthNEZ+Y9/13V1c1KPkpBZZ5eQmeQvQhRPjFhu7cubMX725/qcMrM5KfYs4ovUZPuYwvOWO7R2JTCbih0LwnERukgdfGZbSJxpuU3/fBSpPHqUEPRI/\n", + "!aws s3 ls" + ] + }, { "cell_type": "markdown", "id": "2b28002d-85c9-4b9b-b0fc-5b86948c245c", @@ -573,7 +595,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 23, "id": "2149bf16-9464-4654-bafd-a5b409f15321", "metadata": {}, "outputs": [ @@ -604,65 +626,101 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
CellRangerGex.sampleNameCellRangerGex.fastqNameCellRangerGex.inputFastqCellRangerGex.referenceUrlCellRangerGex.includeIntronsCellRangerGex.expectCellsCellRangerGex.memoryCellRangerGex.dockerRegistry
Sample
IgG_AIgG_A2638_IgG_A_IGO_12104_32[s3://dp-lab-data/collaborators/lowe...https://cf.10xgenomics.com/supp/cell...False5000384quay.io/hisplan
IgG_CIgG_C2639_IgG_C_IGO_12104_33[s3://dp-lab-data/collaborators/lowe...https://cf.10xgenomics.com/supp/cell...False5000384quay.io/hisplan
PM-1779_LC479B_5primePM-1779_LC479B_5prime4007_PM-1779_LC479B_5prime_IGO_12437...[s3://dp-lab-data/collaborators/rudi...IFNAR_AIFNAR_A2640_IFNAR_A_IGO_12104_34[s3://dp-lab-data/collaborators/lowe...https://cf.10xgenomics.com/supp/cell...TrueFalse5000256384quay.io/hisplan
PM-1779_LC441_A_5primeCellRangerGexPre-_post-IO NSCLCPM-1779_LC441_A_5primesohailns3://dp-lab-data/collaborators/rudin...-sohailn
PM-1779_LC441_B_5primeIgG_ACellRangerGexPre-_post-IO NSCLCPM-1779_LC441_B_5prime9pIgG_Asohailns3://dp-lab-data/collaborators/rudin...s3://dp-lab-data/collaborators/lowe/...-sohailn
PM-1779_LC479A_5primeIgG_CCellRangerGexPre-_post-IO NSCLCPM-1779_LC479A_5prime9pIgG_Csohailns3://dp-lab-data/collaborators/rudin...s3://dp-lab-data/collaborators/lowe/...-sohailn
PM-1779_LC479B_5primeIFNAR_ACellRangerGexPre-_post-IO NSCLCPM-1779_LC479B_5prime9pIFNAR_Asohailns3://dp-lab-data/collaborators/rudin...s3://dp-lab-data/collaborators/lowe/...-sohailn
RA19_10_13_FACs_MITOAV-1759_Ru1083_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...30083924
RA19_10_14_FACs_MITOAV-1760_MSK_LX_1083c_T_2_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...30093925
RA19_10_17_FACs_MITOAV-1761_POSIE_101920_T_1_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...30103926
RA19_10_18_FACs_MITOAV-1762_Ru1083d_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...30113927
RA19_10_23_FACs_MITOAV-1763_Ru1250C_T_1_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...30123928
RA19_10_14_FACS_citric_MITOAV-1764_MSK_LX_1250b_PM_1_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...30133929
AV-1764_Ru1250D_T_1_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...3930
AV-1765_Ru1250e_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...3931
AV-1766_MSK_LX_1250f_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...3932
AV-1760_Ru263_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...3933
\n", "
" ], "text/plain": [ - " S3_path Sample_ID\n", - "RA19_10_13_FACs_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3008\n", - "RA19_10_14_FACs_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3009\n", - "RA19_10_17_FACs_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3010\n", - "RA19_10_18_FACs_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3011\n", - "RA19_10_23_FACs_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3012\n", - "RA19_10_14_FACS_citric_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3013" + " S3_path \\\n", + "AV-1759_Ru1083_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "AV-1760_MSK_LX_1083c_T_2_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "AV-1761_POSIE_101920_T_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "AV-1762_Ru1083d_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "AV-1763_Ru1250C_T_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "AV-1764_MSK_LX_1250b_PM_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "AV-1764_Ru1250D_T_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "AV-1765_Ru1250e_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "AV-1766_MSK_LX_1250f_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "AV-1760_Ru263_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "\n", + " Sample_ID \n", + "AV-1759_Ru1083_MITO 3924 \n", + "AV-1760_MSK_LX_1083c_T_2_MITO 3925 \n", + "AV-1761_POSIE_101920_T_1_MITO 3926 \n", + "AV-1762_Ru1083d_MITO 3927 \n", + "AV-1763_Ru1250C_T_1_MITO 3928 \n", + "AV-1764_MSK_LX_1250b_PM_1_MITO 3929 \n", + "AV-1764_Ru1250D_T_1_MITO 3930 \n", + "AV-1765_Ru1250e_MITO 3931 \n", + "AV-1766_MSK_LX_1250f_MITO 3932 \n", + "AV-1760_Ru263_MITO 3933 " ] }, - "execution_count": 17, + "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Common query col: id, request_id, Sample\n", - "request_ids = ['BM-1244', ]\n", + "sample_id = list(range(3924, 3934))\n", "\n", - "samples = format_sample_aws(request_ids, 'request_id', creds)\n", + "samples = format_sample_aws(sample_id, 'id', creds)\n", "samples" ] }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 17, "id": "359fbd22-702d-4763-85c2-0410b0611bb6", "metadata": {}, "outputs": [ @@ -765,7 +823,7 @@ "RA19_10_14_FACS_citric_MITO 3013 GRCh38-3.0.0 CR NaN " ] }, - "execution_count": 18, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -777,7 +835,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 18, "id": "a14b9418-dab4-4aaf-8abb-14f9e0534152", "metadata": {}, "outputs": [ @@ -895,7 +953,7 @@ "RA19_10_14_FACS_citric_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... " ] }, - "execution_count": 19, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -907,7 +965,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 19, "id": "7fd5ce73-8d7f-4d23-9784-4774c7da80a8", "metadata": {}, "outputs": [ @@ -1013,7 +1071,7 @@ "RA19_10_14_FACS_citric_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... " ] }, - "execution_count": 20, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } @@ -1044,7 +1102,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 20, "id": "ce68536f-7029-4689-83a7-239421284398", "metadata": {}, "outputs": [ @@ -1201,7 +1259,7 @@ "RA19_10_14_FACS_citric_MITO NaN " ] }, - "execution_count": 21, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } @@ -1218,7 +1276,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 21, "id": "bd8a0e97-49ad-4295-a4ff-ca83e90732c8", "metadata": {}, "outputs": [ @@ -1375,7 +1433,7 @@ "RA19_10_14_FACS_citric_MITO quay.io/hisplan " ] }, - "execution_count": 22, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } @@ -1394,7 +1452,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 22, "id": "db50eb55-40dc-4840-bc61-63525c2afb2b", "metadata": {}, "outputs": [ @@ -1572,7 +1630,7 @@ "RA19_10_14_FACS_citric_MITO quay.io/hisplan " ] }, - "execution_count": 23, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" } @@ -1600,7 +1658,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 23, "id": "101eb0d4-4ca6-4639-bb67-afe47109a251", "metadata": {}, "outputs": [ @@ -1785,7 +1843,7 @@ "RA19_10_14_FACS_citric_MITO quay.io/hisplan " ] }, - "execution_count": 24, + "execution_count": 23, "metadata": {}, "output_type": "execute_result" } @@ -1822,7 +1880,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 24, "id": "6ca8c556-8254-4051-93ee-5447d43abfbb", "metadata": {}, "outputs": [ @@ -1927,7 +1985,7 @@ "RA19_10_14_FACS_citric_MITO NaN NaN " ] }, - "execution_count": 25, + "execution_count": 24, "metadata": {}, "output_type": "execute_result" } @@ -1944,7 +2002,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 25, "id": "0731efde-30bb-419b-b5a4-b8420911f309", "metadata": {}, "outputs": [ @@ -2063,7 +2121,7 @@ "RA19_10_14_FACS_citric_MITO sohailn " ] }, - "execution_count": 26, + "execution_count": 25, "metadata": {}, "output_type": "execute_result" } @@ -2099,7 +2157,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 26, "id": "68d260a1-cca0-41d6-9c84-d5f1aef94128", "metadata": {}, "outputs": [ @@ -2284,7 +2342,7 @@ "RA19_10_14_FACS_citric_MITO quay.io/hisplan " ] }, - "execution_count": 27, + "execution_count": 26, "metadata": {}, "output_type": "execute_result" } @@ -2295,7 +2353,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 27, "id": "c5713d9e-a923-446e-9df8-fb9619590923", "metadata": {}, "outputs": [ @@ -2414,7 +2472,7 @@ "RA19_10_14_FACS_citric_MITO sohailn " ] }, - "execution_count": 28, + "execution_count": 27, "metadata": {}, "output_type": "execute_result" } @@ -2425,14 +2483,14 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 28, "id": "3bd30985-9d8f-4a6a-afb4-0f93357ad25b", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "f68dbeab6b234b3c9f22a064e7cfb506", + "model_id": "1b6df2f77e1741a0bbb3b86940980c55", "version_major": 2, "version_minor": 0 }, @@ -2477,12 +2535,12 @@ " ))\n", " \n", " # Sometimes causes problems if too many samples are run at once\n", - " time.sleep(20) # Delay for 20 seconds." + " time.sleep(60) # Delay for 20 seconds." ] }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 29, "id": "25c94191-2218-4edc-b3cf-d705e0f36721", "metadata": {}, "outputs": [ @@ -2502,7 +2560,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 30, "id": "0a34cef8-6aef-46ea-a3ec-b5fe3e674213", "metadata": {}, "outputs": [ @@ -2519,7 +2577,7 @@ " '-o',\n", " '/Users/sohailn/scing/bin/wdl-mito-tracing/MitoTracing.options.aws.json'],\n", " 'returncode': 0,\n", - " 'stdout': '{\"id\":\"bea801a8-dd25-489e-87c6-bb07e87d3548\",\"status\":\"Submitted\"}\\n',\n", + " 'stdout': '{\"id\":\"ee0c9e6a-d2dd-4f1d-8a55-ac4eb7a0d0aa\",\"status\":\"Submitted\"}\\n',\n", " 'stderr': ''},\n", " {'args': ['/Users/sohailn/scing/bin/wdl-mito-tracing/submit-processing.sh',\n", " '-k',\n", @@ -2531,7 +2589,7 @@ " '-o',\n", " '/Users/sohailn/scing/bin/wdl-mito-tracing/MitoTracing.options.aws.json'],\n", " 'returncode': 0,\n", - " 'stdout': '{\"id\":\"174cec20-8e12-4ea3-9d49-eb022bf33fd6\",\"status\":\"Submitted\"}\\n',\n", + " 'stdout': '{\"id\":\"375f9e98-fcdc-4b9f-93b5-86d39d991370\",\"status\":\"Submitted\"}\\n',\n", " 'stderr': ''},\n", " {'args': ['/Users/sohailn/scing/bin/wdl-mito-tracing/submit-processing.sh',\n", " '-k',\n", @@ -2543,7 +2601,7 @@ " '-o',\n", " '/Users/sohailn/scing/bin/wdl-mito-tracing/MitoTracing.options.aws.json'],\n", " 'returncode': 0,\n", - " 'stdout': '{\"id\":\"910de209-1ff7-4b7e-822b-6233cb252fbd\",\"status\":\"Submitted\"}\\n',\n", + " 'stdout': '{\"id\":\"a3dca27b-87fd-4f50-b54c-e1de65db9372\",\"status\":\"Submitted\"}\\n',\n", " 'stderr': ''},\n", " {'args': ['/Users/sohailn/scing/bin/wdl-mito-tracing/submit-processing.sh',\n", " '-k',\n", @@ -2555,7 +2613,7 @@ " '-o',\n", " '/Users/sohailn/scing/bin/wdl-mito-tracing/MitoTracing.options.aws.json'],\n", " 'returncode': 0,\n", - " 'stdout': '{\"id\":\"9e8049a7-344d-44e4-a0ba-7d5e3795dcc0\",\"status\":\"Submitted\"}\\n',\n", + " 'stdout': '{\"id\":\"a2962d87-b2f5-401a-ba32-f44ff95ad2bb\",\"status\":\"Submitted\"}\\n',\n", " 'stderr': ''},\n", " {'args': ['/Users/sohailn/scing/bin/wdl-mito-tracing/submit-processing.sh',\n", " '-k',\n", @@ -2567,11 +2625,11 @@ " '-o',\n", " '/Users/sohailn/scing/bin/wdl-mito-tracing/MitoTracing.options.aws.json'],\n", " 'returncode': 0,\n", - " 'stdout': '{\"id\":\"c6eaa181-4425-44b3-94cd-89e34047d464\",\"status\":\"Submitted\"}\\n',\n", + " 'stdout': '{\"id\":\"ce1e52e7-d8fe-42ef-b15c-38ae50d99dde\",\"status\":\"Submitted\"}\\n',\n", " 'stderr': ''}]" ] }, - "execution_count": 31, + "execution_count": 30, "metadata": {}, "output_type": "execute_result" } @@ -2582,7 +2640,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 31, "id": "6c483fed-f39b-467b-a8e2-43a1b2fa5b9d", "metadata": {}, "outputs": [ diff --git a/notebooks/Run_MitoTracing_joe.ipynb b/notebooks/Run_MitoTracing_joe.ipynb new file mode 100644 index 0000000..0863923 --- /dev/null +++ b/notebooks/Run_MitoTracing_joe.ipynb @@ -0,0 +1,2757 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 14, + "id": "f92e2e4f-6704-4b3d-b8ec-c51427a7ca0c", + "metadata": {}, + "outputs": [], + "source": [ + "import re, subprocess, boto3, json, shlex, mysql, os, urllib, logging\n", + "import pandas as pd\n", + "import numpy as np\n", + "from s3path import S3Path\n", + "from pathlib import Path\n", + "from tqdm.notebook import tqdm\n", + "from packaging import version\n", + "pd.set_option(\"display.max_colwidth\", 40)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "474b1723-a2e0-4556-bd36-146ed07c1bf9", + "metadata": {}, + "outputs": [], + "source": [ + "from utils.utils import *" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "3c09f4af-4524-4a93-995f-a268efba3ca5", + "metadata": {}, + "outputs": [], + "source": [ + "import glob" + ] + }, + { + "cell_type": "markdown", + "id": "1b571064-b110-4a4d-b182-bbcb19af6fc8", + "metadata": { + "tags": [] + }, + "source": [ + "# Functions" + ] + }, + { + "cell_type": "markdown", + "id": "47b3a514-cc78-40a4-87ff-0dfd817282e0", + "metadata": { + "tags": [] + }, + "source": [ + "## List FASTQs" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "022a6910-115b-4d46-b4bd-511b7a890893", + "metadata": {}, + "outputs": [], + "source": [ + "# FASTQ reads/indices required for each workflow\n", + "fastq_map = {\n", + " 'MitoTracing': ['R1', 'R2'],\n", + "}\n", + "\n", + "# Get fastq file paths on S3 for each file id\n", + "# Returns dictionary from id to s3 path\n", + "# Throws exception if FASTQs don't exist for any id\n", + "def get_fastqs(\n", + " path: str, # path to directory containing FASTQ files\n", + " fastq_file_ids: list, # FASTQ file ids needed for this run type (e.g. I1, R1, R2, etc.)\n", + "\n", + "):\n", + " fastq_map = dict()\n", + " _, bucket, key, _, _ = urllib.parse.urlsplit(path)\n", + " for fid in fastq_file_ids:\n", + " files = get_s3_objects(\n", + " bucket, key.lstrip(\"/\"),\n", + " re.compile(f\"_{fid}_\\d{{3}}.fastq.gz$\")\n", + " )\n", + " try:\n", + " assert files, f\"AssertionError: Missing `{fid}` archives!\"\n", + " fastq_map[fid] = [os.path.join(\"s3://\", bucket, str(f)) for f in files]\n", + " except AssertionError as err:\n", + " logging.warning(\"%s\\n\\t %s\", err, path)\n", + " return\n", + " return fastq_map" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "ae81c97b-0e5b-4aae-ae8a-977ca6384b21", + "metadata": {}, + "outputs": [], + "source": [ + "def get_barcode_genomic_fastqs(samples):\n", + " \n", + " samples['fastq'] = np.empty((len(samples), 0)).tolist()\n", + " fastqs = []\n", + " for sample, row in samples.iterrows():\n", + " S3_path = row['S3_path']\n", + " \n", + " # List FASTQ files\n", + " fastq_file_ids = fastq_map['MitoTracing'] \n", + " path_fastq = f\"{S3_path}/FASTQ/\"\n", + " fastq = get_fastqs(path_fastq, fastq_file_ids)\n", + " \n", + " fastqs.append(fastq)\n", + " \n", + " samples['fastq'] = fastqs\n", + " return samples" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "dd638296-c86e-4bdb-87ea-37983cdfbf89", + "metadata": {}, + "outputs": [], + "source": [ + "# Extract FASTQ sample name from list of files\n", + "# Note: FASTQ name is file name up to lane id (e.g. L001, L002, etc.)\n", + "def get_fastqs_name(fastqs):\n", + " fastq_name_re = r\".*/(.*)_S\\d+_L\\d{3}_[A-Za-z]\\d_\\d{3}.fastq.gz$\"\n", + " fastq_names = [re.match(fastq_name_re, x)[1] for x in fastqs]\n", + " assert len(set(fastq_names)) == 1 # make sure all names are same\n", + " return fastq_names[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a6613242-152c-4b54-86c1-b245f3897c23", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "5543869f-37e4-4d3b-a8d6-877973abb6ee", + "metadata": { + "jp-MarkdownHeadingCollapsed": true, + "tags": [] + }, + "source": [ + "## DB queries" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "3ca3bfa5-69fd-4d5f-9d45-3d5ac61c76c8", + "metadata": {}, + "outputs": [], + "source": [ + "# Common query col: id, request_id, Sample\n", + "def get_sample_name(query, query_col, creds):\n", + " \n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.sample_data\"\n", + " query = f\"\"\"\n", + " SELECT {table_sample_data}.Sample\n", + " FROM {table_sample_data}\n", + " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", + " \"\"\"\n", + " sample_names = []\n", + " results = execute_query(query, user, password)\n", + " for result in results:\n", + " sample_names.append(result[0])\n", + " return sample_names\n", + " except Error as e:\n", + " print(f\"Error: {e}\")\n", + " \n", + " \n", + "def get_aws_path(query, query_col, creds):\n", + " \n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.sample_data\"\n", + " query = f\"\"\"\n", + " SELECT {table_sample_data}.AWS_storage\n", + " FROM {table_sample_data}\n", + " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", + " \"\"\"\n", + " sample_paths = []\n", + " results = execute_query(query, user, password)\n", + " for result in results:\n", + " sample_paths.append(result[0])\n", + " return sample_paths\n", + " except Error as e:\n", + " print(f\"Error: {e}\")\n", + " \n", + " \n", + "def get_sample_id(query, query_col, creds):\n", + " \n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.sample_data\"\n", + " query = f\"\"\"\n", + " SELECT {table_sample_data}.id\n", + " FROM {table_sample_data}\n", + " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", + " \"\"\"\n", + " sample_ids = []\n", + " results = execute_query(query, user, password)\n", + " for result in results:\n", + " sample_ids.append(result[0])\n", + " return sample_ids\n", + " except Error as e:\n", + " print(f\"Error: {e}\")\n", + " \n", + "def format_sample_aws(querys, query_col, creds):\n", + " sample_names = []\n", + " sample_paths = []\n", + " sample_ids = []\n", + " \n", + " for query in querys:\n", + " sample_names += get_sample_name(query, query_col, creds)\n", + " sample_paths += get_aws_path(query, query_col, creds)\n", + " sample_ids += get_sample_id(query, query_col, creds)\n", + " \n", + " sample_paths = [s.strip('/') for s in sample_paths] # remove trailing slash if exists\n", + " \n", + " samples = pd.DataFrame(\n", + " dict(S3_path=sample_paths, Sample_ID=sample_ids),\n", + " index=sample_names,\n", + " dtype=str,\n", + " )\n", + " return samples" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "25c817f6-9a33-4fcf-84b8-1d4ebbcb66ad", + "metadata": {}, + "outputs": [], + "source": [ + "def get_genomeIndex_id(query, query_col, creds):\n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.sample_data\"\n", + " query = f\"\"\"\n", + " SELECT {table_sample_data}.genomeIndex_id\n", + " FROM {table_sample_data}\n", + " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", + " \"\"\"\n", + " \n", + " results = execute_query(query, user, password)\n", + " for result in results:\n", + " genomeIndex_id = result[0]\n", + " \n", + " return genomeIndex_id\n", + " \n", + " except Error as e:\n", + " print(f\"Error: {e}\")\n", + " \n", + "def get_scTech_id(query, query_col, creds):\n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.genome_index\"\n", + " query = f\"\"\"\n", + " SELECT {table_sample_data}.scTech_id\n", + " FROM {table_sample_data}\n", + " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", + " \"\"\"\n", + " \n", + " results = execute_query(query, user, password)\n", + " for result in results:\n", + " scTech_id = result[0]\n", + " \n", + " return scTech_id\n", + " \n", + " except Error as e:\n", + " print(f\"Error: {e}\")\n", + " \n", + "def get_index(query, query_col, creds):\n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.genome_index\"\n", + " query = f\"\"\"\n", + " SELECT {table_sample_data}.gIndex\n", + " FROM {table_sample_data}\n", + " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", + " \"\"\"\n", + " \n", + " results = execute_query(query, user, password)\n", + " for result in results:\n", + " index = result[0]\n", + " \n", + " return index\n", + " \n", + " except Error as e:\n", + " print(f\"Error: {e}\")\n", + " \n", + "def get_assay(query, query_col, creds):\n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.sc_tech\"\n", + " query = f\"\"\"\n", + " SELECT {table_sample_data}.Run_name\n", + " FROM {table_sample_data}\n", + " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", + " \"\"\"\n", + " \n", + " results = execute_query(query, user, password)\n", + " for result in results:\n", + " assay = result[0]\n", + " \n", + " return assay\n", + " \n", + " except Error as e:\n", + " print(f\"Error: {e}\")\n", + " \n", + "def get_barcode(query, query_col, creds):\n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.sc_tech\"\n", + " query = f\"\"\"\n", + " SELECT {table_sample_data}.barcodes\n", + " FROM {table_sample_data}\n", + " WHERE {table_sample_data}.{query_col}=\"{query}\"\n", + " \"\"\"\n", + " \n", + " results = execute_query(query, user, password)\n", + " for result in results:\n", + " barcode = result[0]\n", + " \n", + " return barcode\n", + " \n", + " except Error as e:\n", + " print(f\"Error: {e}\")\n", + " \n", + " \n", + "def format_assay_barcode(samples, creds):\n", + " \n", + " # samples['genomeIndex_id'] = np.nan\n", + " samples['index'] = np.nan\n", + " # samples['scTech_id'] = np.nan\n", + " samples['assay'] = np.nan\n", + " samples['barcode'] = np.nan\n", + " \n", + " for sample, row in samples.iterrows():\n", + " sample_id = row['Sample_ID']\n", + " \n", + " genomeIndex_id = get_genomeIndex_id(sample_id, 'id', creds)\n", + " index = get_index(genomeIndex_id, 'id', creds)\n", + " scTech_id = get_scTech_id(genomeIndex_id, 'id', creds)\n", + " assay = get_assay(scTech_id, 'id', creds)\n", + " barcode = get_barcode(scTech_id, 'id', creds)\n", + " \n", + " # samples.loc[sample, 'genomeIndex_id'] = genomeIndex_id\n", + " samples.loc[sample, 'index'] = index\n", + " # samples.loc[sample, 'scTech_id'] = scTech_id\n", + " samples.loc[sample, 'assay'] = assay\n", + " samples.loc[sample, 'barcode'] = barcode\n", + "\n", + " return samples" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "eb122238-79ee-4ecb-90d1-b2ea32e2b74d", + "metadata": {}, + "outputs": [], + "source": [ + "def get_project_id(sample_id, creds):\n", + " \n", + " user = creds['user']\n", + " password = creds['password']\n", + " \n", + " try:\n", + " table_sample_data = \"peer_lab_db.sample_data\"\n", + " table_project_data = \"peer_lab_db.project_data\"\n", + " query = f\"\"\"\n", + " SELECT {table_project_data}.projectName\n", + " FROM {table_project_data}\n", + " LEFT JOIN {table_sample_data}\n", + " ON {table_project_data}.id = {table_sample_data}.projectData_id\n", + " WHERE {table_sample_data}.id = {sample_id}\n", + " \"\"\"\n", + " result = execute_query(query, user, password)[0][0]\n", + " return result\n", + " except Error as e:\n", + " print(f\"Error: {e}\")" + ] + }, + { + "cell_type": "markdown", + "id": "4fd74425-41d0-402c-9998-c3ed2c9f6aec", + "metadata": { + "tags": [] + }, + "source": [ + "# Process Samples" + ] + }, + { + "cell_type": "markdown", + "id": "4c513b25-1067-4dfd-9ddc-092166012f7c", + "metadata": { + "tags": [] + }, + "source": [ + "## Setup" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "e1c96c14-0cf1-4ab2-9beb-417bc02f1154", + "metadata": {}, + "outputs": [], + "source": [ + "# Maps from .wdl name (prefix) to results dirname\n", + "results_dirs = {\n", + " \"MitoTracing\": \"mito-tracing-outs\",\n", + "}\n", + "\n", + "# Maps from .wdl name (prefix) to shell script\n", + "sh_files = {\n", + " \"MitoTracing\": \"submit-processing.sh\",\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "8ae3c158-3666-426f-94be-f9165e30c82a", + "metadata": {}, + "outputs": [], + "source": [ + "# Location of docker files\n", + "common_docker_registry = \"quay.io/hisplan\"\n", + "\n", + "prefix = \"MitoTracing\" # Workflow to run; also .wdl filename prefix\n", + "pipeline_type = prefix # field in *.labels.json\n", + "output_dirname = results_dirs[prefix]\n", + "template_prefix = 'template'\n", + "\n", + "# If need to add comment, put here\n", + "comment = \"sohailn\"" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "61658425-6370-44c2-92c2-a3a977345bd6", + "metadata": {}, + "outputs": [], + "source": [ + "# Locations of workflow-related directories and files\n", + "path_to_cromwell_secrets = f\"{Path.home()}/.cromwell/cromwell-secrets.json\" # CHANGE THIS\n", + "workflow_dir = glob.glob(f\"{Path.home()}/scing/bin/*mito*\")[0]\n", + "path_to_exec = sh_files[prefix]\n", + "config_dir = f\"{workflow_dir}/configs\"\n", + "path_to_options = glob.glob(f\"{workflow_dir}/*.options.aws.json\")[0]\n", + "\n", + "# Other file locations\n", + "db_credentials_path = f\"{Path.home()}/.config.json\" # CHANGE THIS" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "bb4d448a-5310-4b63-a073-66cf094e4467", + "metadata": {}, + "outputs": [], + "source": [ + "# Set credentials based on SCRIdb CLI config file\n", + "with open(db_credentials_path) as f:\n", + " creds = json.load(f)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c2e2bc63-cf1f-4cf5-899b-f1e73c56f5aa", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "7c4de0dd-3c84-48b0-8e38-38b83d2abef8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "env: AWS_ACCESS_KEY_ID=ASIAYPY66CWMPLW5T6NP\n", + "env: AWS_SECRET_ACCESS_KEY=1SX9bRl+eDSWhPQZoE3veOnjWMS1q4pOi+H2h4CF\n", + "env: AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEKf//////////wEaCXVzLWVhc3QtMSJGMEQCIG8pw61xL0cjlnxgAmlhtJuGvjKrly9zppW9jmxWKct1AiBSCMeORMMiw34vMpf2Dy7lfNTer4K0ZYHjiIDezosCPSr4AQjw//////////8BEAMaDDU4MzY0MzU2NzUxMiIMcwOotqu75F46WP4sKswBtpwzuDdeano9gSn3VxI01yB4h7fxYVnQQiREf7FBGcmfYrMJ7B9DnL62fHTzdFdNRNsW9BETcVnuQrW5rIEtUJ50XQbsoWsRDBdF9DSXJL26qMr0l7ZOs4IkMn/MYfuGbN9OwRolOvPAh8ewB1N5NqOR+8QO29kRrshV11UBx5CfZwAL00os+sPJgweB+pWsniVheoPRaJLonnsTisSfQYRzoidAVL4ZkZv48eFzaodcAGD5M8VbZQpZ3njSQrmqKQ0jYP7fH0PytXxOMK3FipcGOpkB+HPz9ENB0ACPcyAAz9L3z3uWF/IqP8Q+UbU8Mov3FXhSQuTLEzdZQUxMtBiTT8MAFxyQKabxCrUKpctEWTFL6TeXIoexFp8BmqetPNFP0xwCNGEN/E6KaXs9PKQi5hak1EFX2TVvg3w8DJhsy9ApMktj/wNiU8+ZQvGXX2xIW/pakOBI4H9qoOwC9IIXofUbSFpino3BKg6w\n", + "2021-10-07 15:31:32 agc-583643567512-us-east-1\n", + "2021-10-07 15:28:07 cdktoolkit-stagingbucket-d49u1xfb0sc4\n", + "2019-10-09 13:04:06 cf-templates-umiwbnq3566w-us-east-1\n", + "2019-10-10 12:46:54 dp-daily-reports\n", + "2017-09-26 10:15:15 dp-lab-data\n", + "2019-05-23 12:34:58 dp-lab-data-public\n", + "2018-03-01 13:29:07 dp-lab-glacier\n", + "2020-11-06 23:02:27 dp-lab-gwf-core\n", + "2021-07-15 18:14:01 dp-lab-gwf-core2\n", + "2017-09-26 10:17:18 dp-lab-home\n", + "2019-08-14 16:42:43 dp-lab-test\n", + "2019-04-25 12:35:35 elasticbeanstalk-us-east-1-583643567512\n", + "2019-12-13 15:53:57 scri-computational\n", + "2017-09-26 10:23:50 seqc-public\n" + ] + } + ], + "source": [ + "%env AWS_ACCESS_KEY_ID=ASIAYPY66CWMPLW5T6NP\n", + "%env AWS_SECRET_ACCESS_KEY=1SX9bRl+eDSWhPQZoE3veOnjWMS1q4pOi+H2h4CF\n", + "%env AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEKf//////////wEaCXVzLWVhc3QtMSJGMEQCIG8pw61xL0cjlnxgAmlhtJuGvjKrly9zppW9jmxWKct1AiBSCMeORMMiw34vMpf2Dy7lfNTer4K0ZYHjiIDezosCPSr4AQjw//////////8BEAMaDDU4MzY0MzU2NzUxMiIMcwOotqu75F46WP4sKswBtpwzuDdeano9gSn3VxI01yB4h7fxYVnQQiREf7FBGcmfYrMJ7B9DnL62fHTzdFdNRNsW9BETcVnuQrW5rIEtUJ50XQbsoWsRDBdF9DSXJL26qMr0l7ZOs4IkMn/MYfuGbN9OwRolOvPAh8ewB1N5NqOR+8QO29kRrshV11UBx5CfZwAL00os+sPJgweB+pWsniVheoPRaJLonnsTisSfQYRzoidAVL4ZkZv48eFzaodcAGD5M8VbZQpZ3njSQrmqKQ0jYP7fH0PytXxOMK3FipcGOpkB+HPz9ENB0ACPcyAAz9L3z3uWF/IqP8Q+UbU8Mov3FXhSQuTLEzdZQUxMtBiTT8MAFxyQKabxCrUKpctEWTFL6TeXIoexFp8BmqetPNFP0xwCNGEN/E6KaXs9PKQi5hak1EFX2TVvg3w8DJhsy9ApMktj/wNiU8+ZQvGXX2xIW/pakOBI4H9qoOwC9IIXofUbSFpino3BKg6w\n", + "!aws s3 ls" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b0f6c614-d304-433c-a318-81182ba675b1", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "2b28002d-85c9-4b9b-b0fc-5b86948c245c", + "metadata": {}, + "source": [ + "# Excution" + ] + }, + { + "cell_type": "markdown", + "id": "e0b988b1-df2f-4b32-a11b-786a188ba7b3", + "metadata": { + "tags": [] + }, + "source": [ + "## Sample information" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "2149bf16-9464-4654-bafd-a5b409f15321", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
S3_pathSample_ID
AV-1759_Ru1083_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...3924
AV-1760_MSK_LX_1083c_T_2_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...3925
AV-1761_POSIE_101920_T_1_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...3926
AV-1762_Ru1083d_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...3927
AV-1763_Ru1250C_T_1_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...3928
AV-1764_MSK_LX_1250b_PM_1_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...3929
AV-1764_Ru1250D_T_1_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...3930
AV-1765_Ru1250e_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...3931
AV-1766_MSK_LX_1250f_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...3932
AV-1760_Ru263_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...3933
\n", + "
" + ], + "text/plain": [ + " S3_path \\\n", + "AV-1759_Ru1083_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "AV-1760_MSK_LX_1083c_T_2_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "AV-1761_POSIE_101920_T_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "AV-1762_Ru1083d_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "AV-1763_Ru1250C_T_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "AV-1764_MSK_LX_1250b_PM_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "AV-1764_Ru1250D_T_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "AV-1765_Ru1250e_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "AV-1766_MSK_LX_1250f_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "AV-1760_Ru263_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "\n", + " Sample_ID \n", + "AV-1759_Ru1083_MITO 3924 \n", + "AV-1760_MSK_LX_1083c_T_2_MITO 3925 \n", + "AV-1761_POSIE_101920_T_1_MITO 3926 \n", + "AV-1762_Ru1083d_MITO 3927 \n", + "AV-1763_Ru1250C_T_1_MITO 3928 \n", + "AV-1764_MSK_LX_1250b_PM_1_MITO 3929 \n", + "AV-1764_Ru1250D_T_1_MITO 3930 \n", + "AV-1765_Ru1250e_MITO 3931 \n", + "AV-1766_MSK_LX_1250f_MITO 3932 \n", + "AV-1760_Ru263_MITO 3933 " + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Common query col: id, request_id, Sample\n", + "sample_id = list(range(3924, 3934))\n", + "\n", + "samples = format_sample_aws(sample_id, 'id', creds)\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "40640f5a-1e75-4947-98ba-05aec427e5e0", + "metadata": {}, + "outputs": [], + "source": [ + "# # Modification for Joe's samples\n", + "# samples.loc['Ru581b_T1_MITO', 'S3_path'] = 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/barcodes_rna/Ru581b_T1_MITO'\n", + "# samples.loc['Ru581c-LN1_MITO', 'S3_path'] = 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/barcodes_rna/Ru581c-LN1_MITO'\n", + "\n", + "# samples" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "dc80d4e5-c699-4be7-96f4-0475e3f1f12d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
S3_pathSample_ID
AV-1765_Ru1250e_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...3931
\n", + "
" + ], + "text/plain": [ + " S3_path Sample_ID\n", + "AV-1765_Ru1250e_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3931" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Re-running some of the samples\n", + "# samples = samples.loc[samples.index.isin(['AV-1760_Ru263_MITO', 'AV-1762_Ru1083d_MITO'])]\n", + "\n", + "# barcodes_in_RNA.non-epithelial.RU1083_ST.txt\n", + "# samples = samples.loc[samples.index.isin(['AV-1762_Ru1083d_MITO'])]\n", + "\n", + "\n", + "# barcodes_in_RNA.epithelial.RU1250_ASC1.txt\n", + "samples = samples.loc[samples.index.isin(['AV-1765_Ru1250e_MITO'])]\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "359fbd22-702d-4763-85c2-0410b0611bb6", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/9v/1lnyrkxd0yq8l2pgl002wh1s7c6fqv/T/ipykernel_34982/2360911148.py:110: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " samples['index'] = np.nan\n", + "/var/folders/9v/1lnyrkxd0yq8l2pgl002wh1s7c6fqv/T/ipykernel_34982/2360911148.py:112: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " samples['assay'] = np.nan\n", + "/var/folders/9v/1lnyrkxd0yq8l2pgl002wh1s7c6fqv/T/ipykernel_34982/2360911148.py:113: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " samples['barcode'] = np.nan\n", + "/var/folders/9v/1lnyrkxd0yq8l2pgl002wh1s7c6fqv/T/ipykernel_34982/2360911148.py:125: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " samples.loc[sample, 'index'] = index\n", + "/var/folders/9v/1lnyrkxd0yq8l2pgl002wh1s7c6fqv/T/ipykernel_34982/2360911148.py:127: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " samples.loc[sample, 'assay'] = assay\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
S3_pathSample_IDindexassaybarcode
AV-1765_Ru1250e_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...3931GRCh38-3.0.0CRNaN
\n", + "
" + ], + "text/plain": [ + " S3_path Sample_ID \\\n", + "AV-1765_Ru1250e_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3931 \n", + "\n", + " index assay barcode \n", + "AV-1765_Ru1250e_MITO GRCh38-3.0.0 CR NaN " + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples = format_assay_barcode(samples, creds)\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "a14b9418-dab4-4aaf-8abb-14f9e0534152", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/9v/1lnyrkxd0yq8l2pgl002wh1s7c6fqv/T/ipykernel_34982/638862739.py:3: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " samples['fastq'] = np.empty((len(samples), 0)).tolist()\n", + "/var/folders/9v/1lnyrkxd0yq8l2pgl002wh1s7c6fqv/T/ipykernel_34982/638862739.py:15: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " samples['fastq'] = fastqs\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
S3_pathSample_IDindexassaybarcodefastq
AV-1765_Ru1250e_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...3931GRCh38-3.0.0CRNaN{'R1': ['s3://dp-lab-data/SCRI_Proje...
\n", + "
" + ], + "text/plain": [ + " S3_path Sample_ID \\\n", + "AV-1765_Ru1250e_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3931 \n", + "\n", + " index assay barcode \\\n", + "AV-1765_Ru1250e_MITO GRCh38-3.0.0 CR NaN \n", + "\n", + " fastq \n", + "AV-1765_Ru1250e_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... " + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples = get_barcode_genomic_fastqs(samples)\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "bc16e8ed-5503-421b-9ce9-b31496670188", + "metadata": {}, + "outputs": [], + "source": [ + "# samples = pd.DataFrame(samples.loc['Ru581b_T1_MITO']).T\n", + "# samples" + ] + }, + { + "cell_type": "markdown", + "id": "85065328-a68e-46a7-9304-88953148416e", + "metadata": { + "tags": [] + }, + "source": [ + "## Make input file" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "ce68536f-7029-4689-83a7-239421284398", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
MitoTracing.sampleNameMitoTracing.fastqNameMitoTracing.fastqR1MitoTracing.fastqR2MitoTracing.referenceMitoTracing.includeIntronsMitoTracing.expectCellsMitoTracing.numCoresMitoTracing.memoryMitoTracing.whitelistMitoTracing.dockerRegistry
AV-1765_Ru1250e_MITONaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " MitoTracing.sampleName MitoTracing.fastqName \\\n", + "AV-1765_Ru1250e_MITO NaN NaN \n", + "\n", + " MitoTracing.fastqR1 MitoTracing.fastqR2 \\\n", + "AV-1765_Ru1250e_MITO NaN NaN \n", + "\n", + " MitoTracing.reference MitoTracing.includeIntrons \\\n", + "AV-1765_Ru1250e_MITO NaN NaN \n", + "\n", + " MitoTracing.expectCells MitoTracing.numCores \\\n", + "AV-1765_Ru1250e_MITO NaN NaN \n", + "\n", + " MitoTracing.memory MitoTracing.whitelist \\\n", + "AV-1765_Ru1250e_MITO NaN NaN \n", + "\n", + " MitoTracing.dockerRegistry \n", + "AV-1765_Ru1250e_MITO NaN " + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Load minimum inputs and labels fields from input template\n", + "with open(f\"{config_dir}/{template_prefix}.inputs.json\") as f:\n", + " std_inputs_fields = list(json.load(f).keys())\n", + " \n", + "# Annotate all samples with workflow inputs and labels\n", + "inputs = pd.DataFrame(index=samples.index, columns=std_inputs_fields,)\n", + "inputs" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "bd8a0e97-49ad-4295-a4ff-ca83e90732c8", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
MitoTracing.sampleNameMitoTracing.fastqNameMitoTracing.fastqR1MitoTracing.fastqR2MitoTracing.referenceMitoTracing.includeIntronsMitoTracing.expectCellsMitoTracing.numCoresMitoTracing.memoryMitoTracing.whitelistMitoTracing.dockerRegistry
AV-1765_Ru1250e_MITONaNNaNNaNNaNNaNFalse500016256NaNquay.io/hisplan
\n", + "
" + ], + "text/plain": [ + " MitoTracing.sampleName MitoTracing.fastqName \\\n", + "AV-1765_Ru1250e_MITO NaN NaN \n", + "\n", + " MitoTracing.fastqR1 MitoTracing.fastqR2 \\\n", + "AV-1765_Ru1250e_MITO NaN NaN \n", + "\n", + " MitoTracing.reference MitoTracing.includeIntrons \\\n", + "AV-1765_Ru1250e_MITO NaN False \n", + "\n", + " MitoTracing.expectCells MitoTracing.numCores \\\n", + "AV-1765_Ru1250e_MITO 5000 16 \n", + "\n", + " MitoTracing.memory MitoTracing.whitelist \\\n", + "AV-1765_Ru1250e_MITO 256 NaN \n", + "\n", + " MitoTracing.dockerRegistry \n", + "AV-1765_Ru1250e_MITO quay.io/hisplan " + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Default inputs\n", + "inputs[f\"{prefix}.includeIntrons\"] = False\n", + "inputs[f\"{prefix}.expectCells\"] = 5000\n", + "inputs[f\"{prefix}.numCores\"] = 16\n", + "# inputs[f\"{prefix}.memory\"] = 128\n", + "inputs[f\"{prefix}.memory\"] = 256 \n", + "\n", + "inputs[f\"{prefix}.dockerRegistry\"] = common_docker_registry\n", + "\n", + "inputs" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "db50eb55-40dc-4840-bc61-63525c2afb2b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
MitoTracing.sampleNameMitoTracing.fastqNameMitoTracing.fastqR1MitoTracing.fastqR2MitoTracing.referenceMitoTracing.includeIntronsMitoTracing.expectCellsMitoTracing.numCoresMitoTracing.memoryMitoTracing.whitelistMitoTracing.dockerRegistry
AV-1765_Ru1250e_MITOAV-1765_Ru1250e_MITO3931_AV-1765_Ru1250e_MITO_IGO_13388_9[s3://dp-lab-data/SCRI_Projects/HTA/...[s3://dp-lab-data/SCRI_Projects/HTA/...NaNFalse500016256NaNquay.io/hisplan
\n", + "
" + ], + "text/plain": [ + " MitoTracing.sampleName \\\n", + "AV-1765_Ru1250e_MITO AV-1765_Ru1250e_MITO \n", + "\n", + " MitoTracing.fastqName \\\n", + "AV-1765_Ru1250e_MITO 3931_AV-1765_Ru1250e_MITO_IGO_13388_9 \n", + "\n", + " MitoTracing.fastqR1 \\\n", + "AV-1765_Ru1250e_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "\n", + " MitoTracing.fastqR2 \\\n", + "AV-1765_Ru1250e_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "\n", + " MitoTracing.reference MitoTracing.includeIntrons \\\n", + "AV-1765_Ru1250e_MITO NaN False \n", + "\n", + " MitoTracing.expectCells MitoTracing.numCores \\\n", + "AV-1765_Ru1250e_MITO 5000 16 \n", + "\n", + " MitoTracing.memory MitoTracing.whitelist \\\n", + "AV-1765_Ru1250e_MITO 256 NaN \n", + "\n", + " MitoTracing.dockerRegistry \n", + "AV-1765_Ru1250e_MITO quay.io/hisplan " + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Sample information\n", + "inputs[f\"{prefix}.sampleName\"] = samples.index.tolist()\n", + "\n", + "inputs[f\"{prefix}.fastqR1\"] = samples['fastq'].str['R1']\n", + "inputs[f\"{prefix}.fastqR2\"] = samples['fastq'].str['R2']\n", + "\n", + "for sample in inputs.index:\n", + " fastqR1_name = get_fastqs_name(inputs.loc[sample, 'MitoTracing.fastqR1'])\n", + " fastqR2_name = get_fastqs_name(inputs.loc[sample, 'MitoTracing.fastqR2'])\n", + " \n", + " assert(fastqR1_name == fastqR1_name)\n", + " inputs.loc[sample, f\"{prefix}.fastqName\"] = fastqR1_name\n", + "\n", + "inputs" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "101eb0d4-4ca6-4639-bb67-afe47109a251", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
MitoTracing.sampleNameMitoTracing.fastqNameMitoTracing.fastqR1MitoTracing.fastqR2MitoTracing.referenceMitoTracing.includeIntronsMitoTracing.expectCellsMitoTracing.numCoresMitoTracing.memoryMitoTracing.whitelistMitoTracing.dockerRegistry
AV-1765_Ru1250e_MITOAV-1765_Ru1250e_MITO3931_AV-1765_Ru1250e_MITO_IGO_13388_9[s3://dp-lab-data/SCRI_Projects/HTA/...[s3://dp-lab-data/SCRI_Projects/HTA/...{'cellRangerRefPkg': 's3://dp-lab-da...False500016256NaNquay.io/hisplan
\n", + "
" + ], + "text/plain": [ + " MitoTracing.sampleName \\\n", + "AV-1765_Ru1250e_MITO AV-1765_Ru1250e_MITO \n", + "\n", + " MitoTracing.fastqName \\\n", + "AV-1765_Ru1250e_MITO 3931_AV-1765_Ru1250e_MITO_IGO_13388_9 \n", + "\n", + " MitoTracing.fastqR1 \\\n", + "AV-1765_Ru1250e_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "\n", + " MitoTracing.fastqR2 \\\n", + "AV-1765_Ru1250e_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "\n", + " MitoTracing.reference \\\n", + "AV-1765_Ru1250e_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "\n", + " MitoTracing.includeIntrons MitoTracing.expectCells \\\n", + "AV-1765_Ru1250e_MITO False 5000 \n", + "\n", + " MitoTracing.numCores MitoTracing.memory \\\n", + "AV-1765_Ru1250e_MITO 16 256 \n", + "\n", + " MitoTracing.whitelist MitoTracing.dockerRegistry \n", + "AV-1765_Ru1250e_MITO NaN quay.io/hisplan " + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Reference package created by Jaeyoung\n", + "\n", + "cellRangerRefPkg=\"s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/reference-packages/refdata-gex-mito-GRCh38-ensemble98.tar.gz\"\n", + "mitoFastaRefPkg=\"s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/reference-packages/mito-fasta-GRCh38.tar.gz\"\n", + "\n", + "reference = [dict(cellRangerRefPkg=cellRangerRefPkg,\n", + " mitoFastaRefPkg=mitoFastaRefPkg)] * len(inputs)\n", + "inputs[f\"{prefix}.reference\"] = reference\n", + "\n", + "inputs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a8f12841-72fe-49c6-b91c-2381f7fc62be", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "6581c13e-4156-4082-b9a0-14bdfd420b1e", + "metadata": {}, + "source": [ + "## Check whitelist" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "03cf4850-3447-4f8a-acc0-87de499ac2f3", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "1084d07a-a0e7-4274-81eb-2c2d3de4ecdf", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "46cd6c61-b55a-4c3b-b00a-0f88df9a3b93", + "metadata": {}, + "outputs": [], + "source": [ + "epithelial = True\n", + "for sample in inputs.index:\n", + " for w in whitelist[sample]:\n", + " \n", + " if epithelial:\n", + " if '.epithelial.' in w:\n", + " sample_whitelist = w\n", + " else:\n", + " if '.non-epithelial.' in w:\n", + " sample_whitelist = w\n", + " \n", + " inputs.loc[sample, f\"{prefix}.whitelist\"] = sample_whitelist" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "5bd15e40-eeae-4b8f-80fa-1975f89ba0b2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
MitoTracing.sampleNameMitoTracing.fastqNameMitoTracing.fastqR1MitoTracing.fastqR2MitoTracing.referenceMitoTracing.includeIntronsMitoTracing.expectCellsMitoTracing.numCoresMitoTracing.memoryMitoTracing.whitelistMitoTracing.dockerRegistry
AV-1765_Ru1250e_MITOAV-1765_Ru1250e_MITO3931_AV-1765_Ru1250e_MITO_IGO_13388_9[s3://dp-lab-data/SCRI_Projects/HTA/...[s3://dp-lab-data/SCRI_Projects/HTA/...{'cellRangerRefPkg': 's3://dp-lab-da...False500016256s3://dp-lab-data/SCRI_Projects/HTA/M...quay.io/hisplan
\n", + "
" + ], + "text/plain": [ + " MitoTracing.sampleName \\\n", + "AV-1765_Ru1250e_MITO AV-1765_Ru1250e_MITO \n", + "\n", + " MitoTracing.fastqName \\\n", + "AV-1765_Ru1250e_MITO 3931_AV-1765_Ru1250e_MITO_IGO_13388_9 \n", + "\n", + " MitoTracing.fastqR1 \\\n", + "AV-1765_Ru1250e_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "\n", + " MitoTracing.fastqR2 \\\n", + "AV-1765_Ru1250e_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "\n", + " MitoTracing.reference \\\n", + "AV-1765_Ru1250e_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "\n", + " MitoTracing.includeIntrons MitoTracing.expectCells \\\n", + "AV-1765_Ru1250e_MITO False 5000 \n", + "\n", + " MitoTracing.numCores MitoTracing.memory \\\n", + "AV-1765_Ru1250e_MITO 16 256 \n", + "\n", + " MitoTracing.whitelist \\\n", + "AV-1765_Ru1250e_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "\n", + " MitoTracing.dockerRegistry \n", + "AV-1765_Ru1250e_MITO quay.io/hisplan " + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "inputs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3371ad80-d08d-4d2a-aeba-8442cd8a16e8", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "1ae5805b-8806-4846-a9ed-3b7400e99e2d", + "metadata": {}, + "outputs": [], + "source": [ + "# non_epithelial = ['s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/barcodes_rna/Ru581b_T1_MITO/barcodes_in_RNA.non-epithelial.RU581_Ta.txt',\n", + "# 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/barcodes_rna/Ru581c-LN1_MITO/barcodes_in_RNA.non-epithelial.RU581_LNa.txt',\n", + "# 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/barcodes_rna/Ru581D_MITO/barcodes_in_RNA.non-epithelial.RU581_LIV.txt']\n", + "\n", + "# epithelial = ['s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/barcodes_rna/Ru581b_T1_MITO/barcodes_in_RNA.RU581_Ta.txt',\n", + "# 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/barcodes_rna/Ru581c-LN1_MITO/barcodes_in_RNA.RU581_LNa.txt',\n", + "# 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/barcodes_rna/Ru581D_MITO/barcodes_in_RNA.RU581_LIV.txt']" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "b07e2dd7-8ed4-4dd1-9faa-a3fe7bfd99b2", + "metadata": {}, + "outputs": [], + "source": [ + "# # Whitelist needs to be in SEQC barcodes (nucleotide) format rather than CR format\n", + "# # Path to download the whitelist file\n", + "# path_whitelist = '/Users/sohailn/scing/bin/wdl-mito-tracing/whitelist/'\n", + "\n", + "# # for path_s3 in epithelial:\n", + "# for path_s3 in non_epithelial:\n", + "# path_s3_dirname = os.path.dirname(path_s3)\n", + "# sample_name = os.path.basename(path_s3_dirname)\n", + "\n", + "# filename_in = os.path.basename(path_s3)\n", + "# filename_out = filename_in.replace('.txt', '.seqc.txt')\n", + "\n", + "# # Download barcode file\n", + "# cmd = f'aws s3 cp {path_s3} {path_whitelist}{filename_in}'\n", + "# os.system(cmd)\n", + "\n", + "# barcodes = pd.read_csv(f'{path_whitelist}{filename_in}', header=None)[0].tolist()\n", + "\n", + "# from seqc.sequence.encodings import DNA3Bit\n", + "# dna3bit = DNA3Bit()\n", + "# barcodes = [dna3bit.decode(x) for x in barcodes]\n", + " \n", + "# with open(f'{path_whitelist}{filename_out}', \"w\") as output:\n", + "# for barcode in barcodes:\n", + "# output.write(f'{barcode.decode(\"utf-8\")}-1\\n')\n", + "\n", + "# cmd = f'aws s3 cp {path_whitelist}{filename_out} {path_s3_dirname}/{filename_out}'\n", + "# inputs.loc[sample_name, f\"{prefix}.whitelist\"] = f'{path_s3_dirname}/{filename_out}'\n", + " \n", + "# os.system(cmd)\n", + "# print()" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "3c3633c6-cc9a-43f0-a4fa-b5b2cfc2a76e", + "metadata": {}, + "outputs": [], + "source": [ + "# inputs.loc['Ru581b_T1_MITO', f\"{prefix}.whitelist\"] = 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/barcodes_rna/Ru581b_T1_MITO/barcodes_in_RNA.RU581_Ta.seqc.txt'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "46fa392b-d4f4-4c47-aa8f-d8c7d980f62f", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "b019afa4-15b1-4e1d-8eb1-9ba176088dee", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array(['s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1765_Ru1250e_MITO/barcodes_in_RNA.epithelial.RU1250_ASC1.txt'],\n", + " dtype=object)" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "inputs[f\"{prefix}.whitelist\"].values" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "eee5a4c1-8dce-4975-811c-57ed30da1994", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array(['epi_AV-1765_Ru1250e_MITO'], dtype=object)" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "if epithelial:\n", + " inputs[f\"{prefix}.sampleName\"] = 'epi_' + inputs[f\"{prefix}.sampleName\"] \n", + "else:\n", + " inputs[f\"{prefix}.sampleName\"] = 'non_epi_' + inputs[f\"{prefix}.sampleName\"]\n", + "inputs[f\"{prefix}.sampleName\"].values" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c9af5c62-35fe-4d20-a198-9819aeb2c680", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "0f737133-5115-4ee6-bf93-5443e5c652d1", + "metadata": { + "tags": [] + }, + "source": [ + "## Make label file" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "6ca8c556-8254-4051-93ee-5447d43abfbb", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
pipelineTypeprojectsampleownerdestinationtransfercomment
AV-1765_Ru1250e_MITONaNNaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " pipelineType project sample owner destination transfer \\\n", + "AV-1765_Ru1250e_MITO NaN NaN NaN NaN NaN NaN \n", + "\n", + " comment \n", + "AV-1765_Ru1250e_MITO NaN " + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Load minimum inputs and labels fields from labels template\n", + "with open(f\"{config_dir}/{template_prefix}.labels.json\") as f:\n", + " std_labels_fields = list(json.load(f).keys())\n", + " \n", + "# Annotate all samples with workflow labels\n", + "labels = pd.DataFrame(index=samples.index, columns=std_labels_fields,)\n", + "labels" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "0731efde-30bb-419b-b5a4-b8420911f309", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
pipelineTypeprojectsampleownerdestinationtransfercomment
AV-1765_Ru1250e_MITOMitoTracingLung Tumor AtlasAV-1765_Ru1250e_MITOsohailns3://dp-lab-data/SCRI_Projects/HTA/M...-sohailn
\n", + "
" + ], + "text/plain": [ + " pipelineType project sample \\\n", + "AV-1765_Ru1250e_MITO MitoTracing Lung Tumor Atlas AV-1765_Ru1250e_MITO \n", + "\n", + " owner destination \\\n", + "AV-1765_Ru1250e_MITO sohailn s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "\n", + " transfer comment \n", + "AV-1765_Ru1250e_MITO - sohailn " + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Annotate labels\n", + "labels[\"pipelineType\"] = pipeline_type\n", + "labels[\"project\"] = samples[\"Sample_ID\"].apply(lambda x: get_project_id(x, creds))\n", + "labels[\"sample\"] = labels.index\n", + "labels[\"owner\"] = creds[\"user\"]\n", + "# labels[\"destination\"] = samples['S3_path'] + \"/\" + output_dirname\n", + "\n", + "if epithelial:\n", + " labels[\"destination\"] = samples['S3_path'] + \"/\" + 'epi_' + output_dirname\n", + "else:\n", + " labels[\"destination\"] = samples['S3_path'] + \"/\" + 'non_epi_' + output_dirname\n", + "\n", + "labels[\"transfer\"] = \"-\"\n", + "labels[\"comment\"] = creds[\"user\"]\n", + "\n", + "labels" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "82ab0b61-8acf-43d3-97ae-3e53c528e890", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array(['s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1765_Ru1250e_MITO/epi_mito-tracing-outs'],\n", + " dtype=object)" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# labels.loc['Ru581D_MITO', 'destination'] = 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/barcodes_rna/Ru581D_MITO/non_epi_mito-tracing-outs'\n", + "# labels.loc['Ru581D_MITO', 'destination'] = 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/barcodes_rna/Ru581D_MITO/epi_mito-tracing-outs'\n", + "\n", + "labels['destination'].values" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d5973e09-e9bf-4415-acee-9e1809afdf5b", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "84007e1e-ae11-4665-ba47-aab5b803af27", + "metadata": {}, + "source": [ + "# Submit job" + ] + }, + { + "cell_type": "code", + "execution_count": 95, + "id": "eb40233f-7d95-4e66-91b8-933d77265ee7", + "metadata": {}, + "outputs": [], + "source": [ + "inputs_all = inputs.copy()\n", + "labels_all = labels.copy()" + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "id": "56fb192f-46d2-401d-bf8e-7bf65551364c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['AV-1759_Ru1083_MITO',\n", + " 'AV-1760_MSK_LX_1083c_T_2_MITO',\n", + " 'AV-1760_Ru263_MITO',\n", + " 'AV-1761_POSIE_101920_T_1_MITO',\n", + " 'AV-1762_Ru1083d_MITO',\n", + " 'AV-1763_Ru1250C_T_1_MITO',\n", + " 'AV-1764_MSK_LX_1250b_PM_1_MITO',\n", + " 'AV-1764_Ru1250D_T_1_MITO',\n", + " 'AV-1765_Ru1250e_MITO',\n", + " 'AV-1766_MSK_LX_1250f_MITO']" + ] + }, + "execution_count": 96, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sample_names = inputs.index.tolist()\n", + "sample_names.sort()\n", + "sample_names" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "id": "ca0f8bc8-c862-4398-89b2-152ad55bdec9", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
MitoTracing.sampleNameMitoTracing.fastqNameMitoTracing.fastqR1MitoTracing.fastqR2MitoTracing.referenceMitoTracing.includeIntronsMitoTracing.expectCellsMitoTracing.numCoresMitoTracing.memoryMitoTracing.whitelistMitoTracing.dockerRegistry
AV-1759_Ru1083_MITOnon_epi_AV-1759_Ru1083_MITO3924_AV-1759_Ru1083_MITO_IGO_13388_1[s3://dp-lab-data/SCRI_Projects/HTA/...[s3://dp-lab-data/SCRI_Projects/HTA/...{'cellRangerRefPkg': 's3://dp-lab-da...False500016128s3://dp-lab-data/SCRI_Projects/HTA/M...quay.io/hisplan
AV-1760_MSK_LX_1083c_T_2_MITOnon_epi_AV-1760_MSK_LX_1083c_T_2_MITO3925_AV-1760_MSK_LX_1083c_T_2_MITO_I...[s3://dp-lab-data/SCRI_Projects/HTA/...[s3://dp-lab-data/SCRI_Projects/HTA/...{'cellRangerRefPkg': 's3://dp-lab-da...False500016128s3://dp-lab-data/SCRI_Projects/HTA/M...quay.io/hisplan
AV-1760_Ru263_MITOnon_epi_AV-1760_Ru263_MITO3933_AV-1760_Ru263_MITO_IGO_13388_7[s3://dp-lab-data/SCRI_Projects/HTA/...[s3://dp-lab-data/SCRI_Projects/HTA/...{'cellRangerRefPkg': 's3://dp-lab-da...False500016128s3://dp-lab-data/SCRI_Projects/HTA/M...quay.io/hisplan
AV-1761_POSIE_101920_T_1_MITOnon_epi_AV-1761_POSIE_101920_T_1_MITO3926_AV-1761_POSIE_101920_T_1_MITO_I...[s3://dp-lab-data/SCRI_Projects/HTA/...[s3://dp-lab-data/SCRI_Projects/HTA/...{'cellRangerRefPkg': 's3://dp-lab-da...False500016128s3://dp-lab-data/SCRI_Projects/HTA/M...quay.io/hisplan
AV-1762_Ru1083d_MITOnon_epi_AV-1762_Ru1083d_MITO3927_AV-1762_Ru1083d_MITO_IGO_13388_4[s3://dp-lab-data/SCRI_Projects/HTA/...[s3://dp-lab-data/SCRI_Projects/HTA/...{'cellRangerRefPkg': 's3://dp-lab-da...False500016128s3://dp-lab-data/SCRI_Projects/HTA/M...quay.io/hisplan
AV-1763_Ru1250C_T_1_MITOnon_epi_AV-1763_Ru1250C_T_1_MITO3928_AV-1763_Ru1250C_T_1_MITO_IGO_13...[s3://dp-lab-data/SCRI_Projects/HTA/...[s3://dp-lab-data/SCRI_Projects/HTA/...{'cellRangerRefPkg': 's3://dp-lab-da...False500016128s3://dp-lab-data/SCRI_Projects/HTA/M...quay.io/hisplan
AV-1764_MSK_LX_1250b_PM_1_MITOnon_epi_AV-1764_MSK_LX_1250b_PM_1_MITO3929_AV-1764_MSK_LX_1250b_PM_1_MITO_...[s3://dp-lab-data/SCRI_Projects/HTA/...[s3://dp-lab-data/SCRI_Projects/HTA/...{'cellRangerRefPkg': 's3://dp-lab-da...False500016128s3://dp-lab-data/SCRI_Projects/HTA/M...quay.io/hisplan
AV-1764_Ru1250D_T_1_MITOnon_epi_AV-1764_Ru1250D_T_1_MITO3930_AV-1764_Ru1250D_T_1_MITO_IGO_13...[s3://dp-lab-data/SCRI_Projects/HTA/...[s3://dp-lab-data/SCRI_Projects/HTA/...{'cellRangerRefPkg': 's3://dp-lab-da...False500016128s3://dp-lab-data/SCRI_Projects/HTA/M...quay.io/hisplan
AV-1765_Ru1250e_MITOnon_epi_AV-1765_Ru1250e_MITO3931_AV-1765_Ru1250e_MITO_IGO_13388_9[s3://dp-lab-data/SCRI_Projects/HTA/...[s3://dp-lab-data/SCRI_Projects/HTA/...{'cellRangerRefPkg': 's3://dp-lab-da...False500016128s3://dp-lab-data/SCRI_Projects/HTA/M...quay.io/hisplan
AV-1766_MSK_LX_1250f_MITOnon_epi_AV-1766_MSK_LX_1250f_MITO3932_AV-1766_MSK_LX_1250f_MITO_IGO_1...[s3://dp-lab-data/SCRI_Projects/HTA/...[s3://dp-lab-data/SCRI_Projects/HTA/...{'cellRangerRefPkg': 's3://dp-lab-da...False500016128s3://dp-lab-data/SCRI_Projects/HTA/M...quay.io/hisplan
\n", + "
" + ], + "text/plain": [ + " MitoTracing.sampleName \\\n", + "AV-1759_Ru1083_MITO non_epi_AV-1759_Ru1083_MITO \n", + "AV-1760_MSK_LX_1083c_T_2_MITO non_epi_AV-1760_MSK_LX_1083c_T_2_MITO \n", + "AV-1760_Ru263_MITO non_epi_AV-1760_Ru263_MITO \n", + "AV-1761_POSIE_101920_T_1_MITO non_epi_AV-1761_POSIE_101920_T_1_MITO \n", + "AV-1762_Ru1083d_MITO non_epi_AV-1762_Ru1083d_MITO \n", + "AV-1763_Ru1250C_T_1_MITO non_epi_AV-1763_Ru1250C_T_1_MITO \n", + "AV-1764_MSK_LX_1250b_PM_1_MITO non_epi_AV-1764_MSK_LX_1250b_PM_1_MITO \n", + "AV-1764_Ru1250D_T_1_MITO non_epi_AV-1764_Ru1250D_T_1_MITO \n", + "AV-1765_Ru1250e_MITO non_epi_AV-1765_Ru1250e_MITO \n", + "AV-1766_MSK_LX_1250f_MITO non_epi_AV-1766_MSK_LX_1250f_MITO \n", + "\n", + " MitoTracing.fastqName \\\n", + "AV-1759_Ru1083_MITO 3924_AV-1759_Ru1083_MITO_IGO_13388_1 \n", + "AV-1760_MSK_LX_1083c_T_2_MITO 3925_AV-1760_MSK_LX_1083c_T_2_MITO_I... \n", + "AV-1760_Ru263_MITO 3933_AV-1760_Ru263_MITO_IGO_13388_7 \n", + "AV-1761_POSIE_101920_T_1_MITO 3926_AV-1761_POSIE_101920_T_1_MITO_I... \n", + "AV-1762_Ru1083d_MITO 3927_AV-1762_Ru1083d_MITO_IGO_13388_4 \n", + "AV-1763_Ru1250C_T_1_MITO 3928_AV-1763_Ru1250C_T_1_MITO_IGO_13... \n", + "AV-1764_MSK_LX_1250b_PM_1_MITO 3929_AV-1764_MSK_LX_1250b_PM_1_MITO_... \n", + "AV-1764_Ru1250D_T_1_MITO 3930_AV-1764_Ru1250D_T_1_MITO_IGO_13... \n", + "AV-1765_Ru1250e_MITO 3931_AV-1765_Ru1250e_MITO_IGO_13388_9 \n", + "AV-1766_MSK_LX_1250f_MITO 3932_AV-1766_MSK_LX_1250f_MITO_IGO_1... \n", + "\n", + " MitoTracing.fastqR1 \\\n", + "AV-1759_Ru1083_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "AV-1760_MSK_LX_1083c_T_2_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "AV-1760_Ru263_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "AV-1761_POSIE_101920_T_1_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "AV-1762_Ru1083d_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "AV-1763_Ru1250C_T_1_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "AV-1764_MSK_LX_1250b_PM_1_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "AV-1764_Ru1250D_T_1_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "AV-1765_Ru1250e_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "AV-1766_MSK_LX_1250f_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "\n", + " MitoTracing.fastqR2 \\\n", + "AV-1759_Ru1083_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "AV-1760_MSK_LX_1083c_T_2_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "AV-1760_Ru263_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "AV-1761_POSIE_101920_T_1_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "AV-1762_Ru1083d_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "AV-1763_Ru1250C_T_1_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "AV-1764_MSK_LX_1250b_PM_1_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "AV-1764_Ru1250D_T_1_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "AV-1765_Ru1250e_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "AV-1766_MSK_LX_1250f_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "\n", + " MitoTracing.reference \\\n", + "AV-1759_Ru1083_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "AV-1760_MSK_LX_1083c_T_2_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "AV-1760_Ru263_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "AV-1761_POSIE_101920_T_1_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "AV-1762_Ru1083d_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "AV-1763_Ru1250C_T_1_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "AV-1764_MSK_LX_1250b_PM_1_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "AV-1764_Ru1250D_T_1_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "AV-1765_Ru1250e_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "AV-1766_MSK_LX_1250f_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "\n", + " MitoTracing.includeIntrons \\\n", + "AV-1759_Ru1083_MITO False \n", + "AV-1760_MSK_LX_1083c_T_2_MITO False \n", + "AV-1760_Ru263_MITO False \n", + "AV-1761_POSIE_101920_T_1_MITO False \n", + "AV-1762_Ru1083d_MITO False \n", + "AV-1763_Ru1250C_T_1_MITO False \n", + "AV-1764_MSK_LX_1250b_PM_1_MITO False \n", + "AV-1764_Ru1250D_T_1_MITO False \n", + "AV-1765_Ru1250e_MITO False \n", + "AV-1766_MSK_LX_1250f_MITO False \n", + "\n", + " MitoTracing.expectCells MitoTracing.numCores \\\n", + "AV-1759_Ru1083_MITO 5000 16 \n", + "AV-1760_MSK_LX_1083c_T_2_MITO 5000 16 \n", + "AV-1760_Ru263_MITO 5000 16 \n", + "AV-1761_POSIE_101920_T_1_MITO 5000 16 \n", + "AV-1762_Ru1083d_MITO 5000 16 \n", + "AV-1763_Ru1250C_T_1_MITO 5000 16 \n", + "AV-1764_MSK_LX_1250b_PM_1_MITO 5000 16 \n", + "AV-1764_Ru1250D_T_1_MITO 5000 16 \n", + "AV-1765_Ru1250e_MITO 5000 16 \n", + "AV-1766_MSK_LX_1250f_MITO 5000 16 \n", + "\n", + " MitoTracing.memory \\\n", + "AV-1759_Ru1083_MITO 128 \n", + "AV-1760_MSK_LX_1083c_T_2_MITO 128 \n", + "AV-1760_Ru263_MITO 128 \n", + "AV-1761_POSIE_101920_T_1_MITO 128 \n", + "AV-1762_Ru1083d_MITO 128 \n", + "AV-1763_Ru1250C_T_1_MITO 128 \n", + "AV-1764_MSK_LX_1250b_PM_1_MITO 128 \n", + "AV-1764_Ru1250D_T_1_MITO 128 \n", + "AV-1765_Ru1250e_MITO 128 \n", + "AV-1766_MSK_LX_1250f_MITO 128 \n", + "\n", + " MitoTracing.whitelist \\\n", + "AV-1759_Ru1083_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "AV-1760_MSK_LX_1083c_T_2_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "AV-1760_Ru263_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "AV-1761_POSIE_101920_T_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "AV-1762_Ru1083d_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "AV-1763_Ru1250C_T_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "AV-1764_MSK_LX_1250b_PM_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "AV-1764_Ru1250D_T_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "AV-1765_Ru1250e_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "AV-1766_MSK_LX_1250f_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "\n", + " MitoTracing.dockerRegistry \n", + "AV-1759_Ru1083_MITO quay.io/hisplan \n", + "AV-1760_MSK_LX_1083c_T_2_MITO quay.io/hisplan \n", + "AV-1760_Ru263_MITO quay.io/hisplan \n", + "AV-1761_POSIE_101920_T_1_MITO quay.io/hisplan \n", + "AV-1762_Ru1083d_MITO quay.io/hisplan \n", + "AV-1763_Ru1250C_T_1_MITO quay.io/hisplan \n", + "AV-1764_MSK_LX_1250b_PM_1_MITO quay.io/hisplan \n", + "AV-1764_Ru1250D_T_1_MITO quay.io/hisplan \n", + "AV-1765_Ru1250e_MITO quay.io/hisplan \n", + "AV-1766_MSK_LX_1250f_MITO quay.io/hisplan " + ] + }, + "execution_count": 97, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "inputs = pd.DataFrame(inputs_all.loc[sample_names[0:]])\n", + "inputs" + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "id": "c25489ef-ec76-4e19-b6d3-fafb53e5fd23", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([list(['s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1759_Ru1083_MITO/FASTQ/3924_AV-1759_Ru1083_MITO_IGO_13388_1_S1_L001_R1_001.fastq.gz', 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1759_Ru1083_MITO/FASTQ/3924_AV-1759_Ru1083_MITO_IGO_13388_1_S1_L002_R1_001.fastq.gz']),\n", + " list(['s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1760_MSK_LX_1083c_T_2_MITO/FASTQ/3925_AV-1760_MSK_LX_1083c_T_2_MITO_IGO_13388_2_S2_L001_R1_001.fastq.gz', 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1760_MSK_LX_1083c_T_2_MITO/FASTQ/3925_AV-1760_MSK_LX_1083c_T_2_MITO_IGO_13388_2_S2_L002_R1_001.fastq.gz']),\n", + " list(['s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1760_Ru263_MITO/FASTQ/3933_AV-1760_Ru263_MITO_IGO_13388_7_S6_L001_R1_001.fastq.gz', 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1760_Ru263_MITO/FASTQ/3933_AV-1760_Ru263_MITO_IGO_13388_7_S6_L002_R1_001.fastq.gz']),\n", + " list(['s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1761_POSIE_101920_T_1_MITO/FASTQ/3926_AV-1761_POSIE_101920_T_1_MITO_IGO_13388_3_S8_L001_R1_001.fastq.gz', 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1761_POSIE_101920_T_1_MITO/FASTQ/3926_AV-1761_POSIE_101920_T_1_MITO_IGO_13388_3_S8_L002_R1_001.fastq.gz']),\n", + " list(['s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1762_Ru1083d_MITO/FASTQ/3927_AV-1762_Ru1083d_MITO_IGO_13388_4_S3_L001_R1_001.fastq.gz', 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1762_Ru1083d_MITO/FASTQ/3927_AV-1762_Ru1083d_MITO_IGO_13388_4_S3_L002_R1_001.fastq.gz']),\n", + " list(['s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1763_Ru1250C_T_1_MITO/FASTQ/3928_AV-1763_Ru1250C_T_1_MITO_IGO_13388_5_S4_L001_R1_001.fastq.gz', 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1763_Ru1250C_T_1_MITO/FASTQ/3928_AV-1763_Ru1250C_T_1_MITO_IGO_13388_5_S4_L002_R1_001.fastq.gz']),\n", + " list(['s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1764_MSK_LX_1250b_PM_1_MITO/FASTQ/3929_AV-1764_MSK_LX_1250b_PM_1_MITO_IGO_13388_6_S5_L001_R1_001.fastq.gz', 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1764_MSK_LX_1250b_PM_1_MITO/FASTQ/3929_AV-1764_MSK_LX_1250b_PM_1_MITO_IGO_13388_6_S5_L002_R1_001.fastq.gz']),\n", + " list(['s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1764_Ru1250D_T_1_MITO/FASTQ/3930_AV-1764_Ru1250D_T_1_MITO_IGO_13388_8_S9_L001_R1_001.fastq.gz', 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1764_Ru1250D_T_1_MITO/FASTQ/3930_AV-1764_Ru1250D_T_1_MITO_IGO_13388_8_S9_L002_R1_001.fastq.gz']),\n", + " list(['s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1765_Ru1250e_MITO/FASTQ/3931_AV-1765_Ru1250e_MITO_IGO_13388_9_S10_L001_R1_001.fastq.gz', 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1765_Ru1250e_MITO/FASTQ/3931_AV-1765_Ru1250e_MITO_IGO_13388_9_S10_L002_R1_001.fastq.gz']),\n", + " list(['s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1766_MSK_LX_1250f_MITO/FASTQ/3932_AV-1766_MSK_LX_1250f_MITO_IGO_13388_10_S7_L001_R1_001.fastq.gz', 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1766_MSK_LX_1250f_MITO/FASTQ/3932_AV-1766_MSK_LX_1250f_MITO_IGO_13388_10_S7_L002_R1_001.fastq.gz'])],\n", + " dtype=object)" + ] + }, + "execution_count": 98, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "inputs[f'{prefix}.fastqR1'].values" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "id": "248dbbb9-ee1d-4ae8-88e5-ecfecc7cbdd7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array(['s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1759_Ru1083_MITO/barcodes_in_RNA.non-epithelial.RU1083_LIV.txt',\n", + " 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1760_MSK_LX_1083c_T_2_MITO/barcodes_in_RNA.non-epithelial.RU1083_T2.txt',\n", + " 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1760_Ru263_MITO/barcodes_in_RNA.non-epithelial.RU263_PDX.txt',\n", + " 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1761_POSIE_101920_T_1_MITO/barcodes_in_RNA.non-epithelial.RU1083_T1.txt',\n", + " 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1762_Ru1083d_MITO/barcodes_in_RNA.non-epithelial.RU1083_ST.txt',\n", + " 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1763_Ru1250C_T_1_MITO/barcodes_in_RNA.non-epithelial.RU1250_T1.txt',\n", + " 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1764_MSK_LX_1250b_PM_1_MITO/barcodes_in_RNA.non-epithelial.RU1250_PL.txt',\n", + " 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1764_Ru1250D_T_1_MITO/barcodes_in_RNA.non-epithelial.RU1250_T2.txt',\n", + " 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1765_Ru1250e_MITO/barcodes_in_RNA.non-epithelial.RU1250_ASC1.txt',\n", + " 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1766_MSK_LX_1250f_MITO/barcodes_in_RNA.non-epithelial.RU1250_ASC2.txt'],\n", + " dtype=object)" + ] + }, + "execution_count": 99, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "inputs[f'{prefix}.whitelist'].values" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e0eafa67-d6cc-49c9-be93-50957248ded1", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "a9ee54c6-1a2c-46f5-a450-75bcf2a7cfb5", + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'labels_all' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "Input \u001b[0;32mIn [33]\u001b[0m, in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0m labels \u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mDataFrame(\u001b[43mlabels_all\u001b[49m\u001b[38;5;241m.\u001b[39mloc[sample_names[\u001b[38;5;241m0\u001b[39m:]])\n\u001b[1;32m 2\u001b[0m labels\n", + "\u001b[0;31mNameError\u001b[0m: name 'labels_all' is not defined" + ] + } + ], + "source": [ + "labels = pd.DataFrame(labels_all.loc[sample_names[0:]])\n", + "labels" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9008381e-ad79-4dab-8585-a59d20756c73", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "db50837c-9648-4400-af53-aa436bb93adc", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
MitoTracing.sampleNameMitoTracing.fastqNameMitoTracing.fastqR1MitoTracing.fastqR2MitoTracing.referenceMitoTracing.includeIntronsMitoTracing.expectCellsMitoTracing.numCoresMitoTracing.memoryMitoTracing.whitelistMitoTracing.dockerRegistry
AV-1765_Ru1250e_MITOepi_AV-1765_Ru1250e_MITO3931_AV-1765_Ru1250e_MITO_IGO_13388_9[s3://dp-lab-data/SCRI_Projects/HTA/...[s3://dp-lab-data/SCRI_Projects/HTA/...{'cellRangerRefPkg': 's3://dp-lab-da...False500016256s3://dp-lab-data/SCRI_Projects/HTA/M...quay.io/hisplan
\n", + "
" + ], + "text/plain": [ + " MitoTracing.sampleName \\\n", + "AV-1765_Ru1250e_MITO epi_AV-1765_Ru1250e_MITO \n", + "\n", + " MitoTracing.fastqName \\\n", + "AV-1765_Ru1250e_MITO 3931_AV-1765_Ru1250e_MITO_IGO_13388_9 \n", + "\n", + " MitoTracing.fastqR1 \\\n", + "AV-1765_Ru1250e_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "\n", + " MitoTracing.fastqR2 \\\n", + "AV-1765_Ru1250e_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "\n", + " MitoTracing.reference \\\n", + "AV-1765_Ru1250e_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "\n", + " MitoTracing.includeIntrons MitoTracing.expectCells \\\n", + "AV-1765_Ru1250e_MITO False 5000 \n", + "\n", + " MitoTracing.numCores MitoTracing.memory \\\n", + "AV-1765_Ru1250e_MITO 16 256 \n", + "\n", + " MitoTracing.whitelist \\\n", + "AV-1765_Ru1250e_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "\n", + " MitoTracing.dockerRegistry \n", + "AV-1765_Ru1250e_MITO quay.io/hisplan " + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "inputs" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "b7dff356-8581-4638-a8e2-9e93dde1a251", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
pipelineTypeprojectsampleownerdestinationtransfercomment
AV-1765_Ru1250e_MITOMitoTracingLung Tumor AtlasAV-1765_Ru1250e_MITOsohailns3://dp-lab-data/SCRI_Projects/HTA/M...-sohailn
\n", + "
" + ], + "text/plain": [ + " pipelineType project sample \\\n", + "AV-1765_Ru1250e_MITO MitoTracing Lung Tumor Atlas AV-1765_Ru1250e_MITO \n", + "\n", + " owner destination \\\n", + "AV-1765_Ru1250e_MITO sohailn s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "\n", + " transfer comment \n", + "AV-1765_Ru1250e_MITO - sohailn " + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "labels" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "bf7782ae-982a-45d9-bef1-5e6dede154cd", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array(['s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1765_Ru1250e_MITO/epi_mito-tracing-outs'],\n", + " dtype=object)" + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "labels['destination'].values" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "cb6579bc-ee47-41fb-b4a7-66435d46188f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'/Users/sohailn/scing/bin/wdl-mito-tracing/MitoTracing.options.aws.json'" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Setting cache to true to hopefully save some time\n", + "path_to_options" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "3bd30985-9d8f-4a6a-afb4-0f93357ad25b", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "918936fec41b4e9b94b952b0ef943203", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/1 [00:00\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Unnamed: 0joe_sample_nameAWS_storage
sample
Ru1083_MITO0RU1083_LIVs3://dp-lab-data/SCRI_Projects/HTA/M...
MSK_LX_1083c_T_2_MITO1RU1083_T2s3://dp-lab-data/SCRI_Projects/HTA/M...
Ru263_MITO2RU263_PDXs3://dp-lab-data/SCRI_Projects/HTA/M...
POSIE_101920_T_1_MITO3RU1083_T1s3://dp-lab-data/SCRI_Projects/HTA/M...
Ru1083d_MITO4RU1083_STs3://dp-lab-data/SCRI_Projects/HTA/M...
Ru1250C_T_1_MITO5RU1250_T1s3://dp-lab-data/SCRI_Projects/HTA/M...
MSK_LX_1250b_PM_1_MITO6RU1250_PLs3://dp-lab-data/SCRI_Projects/HTA/M...
Ru1250D_T_1_MITO7RU1250_T2s3://dp-lab-data/SCRI_Projects/HTA/M...
Ru1250e_MITO8RU1250_ASC1s3://dp-lab-data/SCRI_Projects/HTA/M...
MSK_LX_1250f_MITO9RU1250_ASC2s3://dp-lab-data/SCRI_Projects/HTA/M...
Ru581D_MITO10RU581_LIVs3://dp-lab-data/SCRI_Projects/HTA/M...
Ru581b_T1_MITO11RU581_Tas3://dp-lab-data/SCRI_Projects/HTA/M...
Ru581c-LN1_MITO13RU581_LNas3://dp-lab-data/SCRI_Projects/HTA/M...
\n", + "" + ], + "text/plain": [ + " Unnamed: 0 joe_sample_name \\\n", + "sample \n", + "Ru1083_MITO 0 RU1083_LIV \n", + "MSK_LX_1083c_T_2_MITO 1 RU1083_T2 \n", + "Ru263_MITO 2 RU263_PDX \n", + "POSIE_101920_T_1_MITO 3 RU1083_T1 \n", + "Ru1083d_MITO 4 RU1083_ST \n", + "Ru1250C_T_1_MITO 5 RU1250_T1 \n", + "MSK_LX_1250b_PM_1_MITO 6 RU1250_PL \n", + "Ru1250D_T_1_MITO 7 RU1250_T2 \n", + "Ru1250e_MITO 8 RU1250_ASC1 \n", + "MSK_LX_1250f_MITO 9 RU1250_ASC2 \n", + "Ru581D_MITO 10 RU581_LIV \n", + "Ru581b_T1_MITO 11 RU581_Ta \n", + "Ru581c-LN1_MITO 13 RU581_LNa \n", + "\n", + " AWS_storage \n", + "sample \n", + "Ru1083_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "MSK_LX_1083c_T_2_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "Ru263_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "POSIE_101920_T_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "Ru1083d_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "Ru1250C_T_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "MSK_LX_1250b_PM_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "Ru1250D_T_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "Ru1250e_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "MSK_LX_1250f_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "Ru581D_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "Ru581b_T1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "Ru581c-LN1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... " + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# You can supply a list of IDs or request IDs\n", + "\n", + "# sample_ids = list(range(3924, 3934))\n", + "\n", + "# epi = sample_scridb_info(sample_ids, 'id', creds)\n", + "# epi.index = 'epi_' + epi.index\n", + "\n", + "# non_epi = sample_scridb_info(sample_ids, 'id', creds)\n", + "# non_epi.index = 'non_epi_' + non_epi.index\n", + "\n", + "samples = pd.read_csv('joe_samples_unarchive.txt', index_col='sample')\n", + "samples['AWS_storage'] = samples['AWS_storage'].str.strip('/')\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "e85154ba-47ad-4f3a-b2c8-9c81f2d33e23", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Unnamed: 0joe_sample_nameAWS_storageFASTQs
sample
Ru1083_MITO0RU1083_LIVs3://dp-lab-data/SCRI_Projects/HTA/M...{'R1': ['s3://dp-lab-data/SCRI_Proje...
MSK_LX_1083c_T_2_MITO1RU1083_T2s3://dp-lab-data/SCRI_Projects/HTA/M...{'R1': ['s3://dp-lab-data/SCRI_Proje...
Ru263_MITO2RU263_PDXs3://dp-lab-data/SCRI_Projects/HTA/M...{'R1': ['s3://dp-lab-data/SCRI_Proje...
POSIE_101920_T_1_MITO3RU1083_T1s3://dp-lab-data/SCRI_Projects/HTA/M...{'R1': ['s3://dp-lab-data/SCRI_Proje...
Ru1083d_MITO4RU1083_STs3://dp-lab-data/SCRI_Projects/HTA/M...{'R1': ['s3://dp-lab-data/SCRI_Proje...
Ru1250C_T_1_MITO5RU1250_T1s3://dp-lab-data/SCRI_Projects/HTA/M...{'R1': ['s3://dp-lab-data/SCRI_Proje...
MSK_LX_1250b_PM_1_MITO6RU1250_PLs3://dp-lab-data/SCRI_Projects/HTA/M...{'R1': ['s3://dp-lab-data/SCRI_Proje...
Ru1250D_T_1_MITO7RU1250_T2s3://dp-lab-data/SCRI_Projects/HTA/M...{'R1': ['s3://dp-lab-data/SCRI_Proje...
Ru1250e_MITO8RU1250_ASC1s3://dp-lab-data/SCRI_Projects/HTA/M...{'R1': ['s3://dp-lab-data/SCRI_Proje...
MSK_LX_1250f_MITO9RU1250_ASC2s3://dp-lab-data/SCRI_Projects/HTA/M...{'R1': ['s3://dp-lab-data/SCRI_Proje...
Ru581D_MITO10RU581_LIVs3://dp-lab-data/SCRI_Projects/HTA/M...{'R1': ['s3://dp-lab-data/SCRI_Proje...
Ru581b_T1_MITO11RU581_Tas3://dp-lab-data/SCRI_Projects/HTA/M...{'R1': ['s3://dp-lab-data/SCRI_Proje...
Ru581c-LN1_MITO13RU581_LNas3://dp-lab-data/SCRI_Projects/HTA/M...{'R1': ['s3://dp-lab-data/SCRI_Proje...
\n", + "
" + ], + "text/plain": [ + " Unnamed: 0 joe_sample_name \\\n", + "sample \n", + "Ru1083_MITO 0 RU1083_LIV \n", + "MSK_LX_1083c_T_2_MITO 1 RU1083_T2 \n", + "Ru263_MITO 2 RU263_PDX \n", + "POSIE_101920_T_1_MITO 3 RU1083_T1 \n", + "Ru1083d_MITO 4 RU1083_ST \n", + "Ru1250C_T_1_MITO 5 RU1250_T1 \n", + "MSK_LX_1250b_PM_1_MITO 6 RU1250_PL \n", + "Ru1250D_T_1_MITO 7 RU1250_T2 \n", + "Ru1250e_MITO 8 RU1250_ASC1 \n", + "MSK_LX_1250f_MITO 9 RU1250_ASC2 \n", + "Ru581D_MITO 10 RU581_LIV \n", + "Ru581b_T1_MITO 11 RU581_Ta \n", + "Ru581c-LN1_MITO 13 RU581_LNa \n", + "\n", + " AWS_storage \\\n", + "sample \n", + "Ru1083_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "MSK_LX_1083c_T_2_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "Ru263_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "POSIE_101920_T_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "Ru1083d_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "Ru1250C_T_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "MSK_LX_1250b_PM_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "Ru1250D_T_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "Ru1250e_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "MSK_LX_1250f_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "Ru581D_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "Ru581b_T1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "Ru581c-LN1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "\n", + " FASTQs \n", + "sample \n", + "Ru1083_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "MSK_LX_1083c_T_2_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "Ru263_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "POSIE_101920_T_1_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "Ru1083d_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "Ru1250C_T_1_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "MSK_LX_1250b_PM_1_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "Ru1250D_T_1_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "Ru1250e_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "MSK_LX_1250f_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "Ru581D_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "Ru581b_T1_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "Ru581c-LN1_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... " + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples[\"FASTQs\"] = samples[\"AWS_storage\"].apply(lambda x: get_fastqs(x, ['R1', 'R2'], \"FASTQ\"))\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a59060ca-b11f-4e74-9edf-5ce3e863a064", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "16d0ca53-edc7-4e1b-9c9c-0d812a1ae1c7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Unnamed: 0joe_sample_nameAWS_storageFASTQsreference
sample
Ru1083_MITO0RU1083_LIVs3://dp-lab-data/SCRI_Projects/HTA/M...{'R1': ['s3://dp-lab-data/SCRI_Proje...{'cellRangerRefPkg': 's3://dp-lab-da...
MSK_LX_1083c_T_2_MITO1RU1083_T2s3://dp-lab-data/SCRI_Projects/HTA/M...{'R1': ['s3://dp-lab-data/SCRI_Proje...{'cellRangerRefPkg': 's3://dp-lab-da...
Ru263_MITO2RU263_PDXs3://dp-lab-data/SCRI_Projects/HTA/M...{'R1': ['s3://dp-lab-data/SCRI_Proje...{'cellRangerRefPkg': 's3://dp-lab-da...
POSIE_101920_T_1_MITO3RU1083_T1s3://dp-lab-data/SCRI_Projects/HTA/M...{'R1': ['s3://dp-lab-data/SCRI_Proje...{'cellRangerRefPkg': 's3://dp-lab-da...
Ru1083d_MITO4RU1083_STs3://dp-lab-data/SCRI_Projects/HTA/M...{'R1': ['s3://dp-lab-data/SCRI_Proje...{'cellRangerRefPkg': 's3://dp-lab-da...
Ru1250C_T_1_MITO5RU1250_T1s3://dp-lab-data/SCRI_Projects/HTA/M...{'R1': ['s3://dp-lab-data/SCRI_Proje...{'cellRangerRefPkg': 's3://dp-lab-da...
MSK_LX_1250b_PM_1_MITO6RU1250_PLs3://dp-lab-data/SCRI_Projects/HTA/M...{'R1': ['s3://dp-lab-data/SCRI_Proje...{'cellRangerRefPkg': 's3://dp-lab-da...
Ru1250D_T_1_MITO7RU1250_T2s3://dp-lab-data/SCRI_Projects/HTA/M...{'R1': ['s3://dp-lab-data/SCRI_Proje...{'cellRangerRefPkg': 's3://dp-lab-da...
Ru1250e_MITO8RU1250_ASC1s3://dp-lab-data/SCRI_Projects/HTA/M...{'R1': ['s3://dp-lab-data/SCRI_Proje...{'cellRangerRefPkg': 's3://dp-lab-da...
MSK_LX_1250f_MITO9RU1250_ASC2s3://dp-lab-data/SCRI_Projects/HTA/M...{'R1': ['s3://dp-lab-data/SCRI_Proje...{'cellRangerRefPkg': 's3://dp-lab-da...
Ru581D_MITO10RU581_LIVs3://dp-lab-data/SCRI_Projects/HTA/M...{'R1': ['s3://dp-lab-data/SCRI_Proje...{'cellRangerRefPkg': 's3://dp-lab-da...
Ru581b_T1_MITO11RU581_Tas3://dp-lab-data/SCRI_Projects/HTA/M...{'R1': ['s3://dp-lab-data/SCRI_Proje...{'cellRangerRefPkg': 's3://dp-lab-da...
Ru581c-LN1_MITO13RU581_LNas3://dp-lab-data/SCRI_Projects/HTA/M...{'R1': ['s3://dp-lab-data/SCRI_Proje...{'cellRangerRefPkg': 's3://dp-lab-da...
\n", + "
" + ], + "text/plain": [ + " Unnamed: 0 joe_sample_name \\\n", + "sample \n", + "Ru1083_MITO 0 RU1083_LIV \n", + "MSK_LX_1083c_T_2_MITO 1 RU1083_T2 \n", + "Ru263_MITO 2 RU263_PDX \n", + "POSIE_101920_T_1_MITO 3 RU1083_T1 \n", + "Ru1083d_MITO 4 RU1083_ST \n", + "Ru1250C_T_1_MITO 5 RU1250_T1 \n", + "MSK_LX_1250b_PM_1_MITO 6 RU1250_PL \n", + "Ru1250D_T_1_MITO 7 RU1250_T2 \n", + "Ru1250e_MITO 8 RU1250_ASC1 \n", + "MSK_LX_1250f_MITO 9 RU1250_ASC2 \n", + "Ru581D_MITO 10 RU581_LIV \n", + "Ru581b_T1_MITO 11 RU581_Ta \n", + "Ru581c-LN1_MITO 13 RU581_LNa \n", + "\n", + " AWS_storage \\\n", + "sample \n", + "Ru1083_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "MSK_LX_1083c_T_2_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "Ru263_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "POSIE_101920_T_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "Ru1083d_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "Ru1250C_T_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "MSK_LX_1250b_PM_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "Ru1250D_T_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "Ru1250e_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "MSK_LX_1250f_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "Ru581D_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "Ru581b_T1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "Ru581c-LN1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "\n", + " FASTQs \\\n", + "sample \n", + "Ru1083_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "MSK_LX_1083c_T_2_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "Ru263_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "POSIE_101920_T_1_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "Ru1083d_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "Ru1250C_T_1_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "MSK_LX_1250b_PM_1_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "Ru1250D_T_1_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "Ru1250e_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "MSK_LX_1250f_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "Ru581D_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "Ru581b_T1_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "Ru581c-LN1_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "\n", + " reference \n", + "sample \n", + "Ru1083_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "MSK_LX_1083c_T_2_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "Ru263_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "POSIE_101920_T_1_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "Ru1083d_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "Ru1250C_T_1_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "MSK_LX_1250b_PM_1_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "Ru1250D_T_1_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "Ru1250e_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "MSK_LX_1250f_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "Ru581D_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "Ru581b_T1_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "Ru581c-LN1_MITO {'cellRangerRefPkg': 's3://dp-lab-da... " + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Reference package created by Jaeyoung\n", + "\n", + "# cellRangerRefPkg=\"s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/reference-packages/refdata-gex-mito-GRCh38-ensemble98.tar.gz\"\n", + "cellRangerRefPkg=\"s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/reference-packages/GRCh38_gex_mito_mask.tar.gz\"\n", + "mitoFastaRefPkg=\"s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/reference-packages/chrM-fasta-GRCh38.tar.gz\"\n", + "# mitoFastaRefPkg=\"s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/reference-packages/mito-fasta-GRCh38.tar.gz\"\n", + "\n", + "reference = [dict(cellRangerRefPkg=cellRangerRefPkg,\n", + " mitoFastaRefPkg=mitoFastaRefPkg)] * len(samples)\n", + "samples[\"reference\"] = reference\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "56ea3b42-967e-49aa-8344-93420514c6e1", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "c5c4180c-0d82-415e-8516-4174947fd567", + "metadata": {}, + "source": [ + "# Get whitelist" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "69d70985-4fb6-42c6-a87f-a3ec6b9b6a85", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Unnamed: 0joe_sample_nameAWS_storageFASTQsreferencewhitelist
sample
Ru1083_MITO0RU1083_LIVs3://dp-lab-data/SCRI_Projects/HTA/M...{'R1': ['s3://dp-lab-data/SCRI_Proje...{'cellRangerRefPkg': 's3://dp-lab-da...s3://dp-lab-data/SCRI_Projects/HTA/M...
MSK_LX_1083c_T_2_MITO1RU1083_T2s3://dp-lab-data/SCRI_Projects/HTA/M...{'R1': ['s3://dp-lab-data/SCRI_Proje...{'cellRangerRefPkg': 's3://dp-lab-da...s3://dp-lab-data/SCRI_Projects/HTA/M...
Ru263_MITO2RU263_PDXs3://dp-lab-data/SCRI_Projects/HTA/M...{'R1': ['s3://dp-lab-data/SCRI_Proje...{'cellRangerRefPkg': 's3://dp-lab-da...s3://dp-lab-data/SCRI_Projects/HTA/M...
POSIE_101920_T_1_MITO3RU1083_T1s3://dp-lab-data/SCRI_Projects/HTA/M...{'R1': ['s3://dp-lab-data/SCRI_Proje...{'cellRangerRefPkg': 's3://dp-lab-da...s3://dp-lab-data/SCRI_Projects/HTA/M...
Ru1083d_MITO4RU1083_STs3://dp-lab-data/SCRI_Projects/HTA/M...{'R1': ['s3://dp-lab-data/SCRI_Proje...{'cellRangerRefPkg': 's3://dp-lab-da...s3://dp-lab-data/SCRI_Projects/HTA/M...
Ru1250C_T_1_MITO5RU1250_T1s3://dp-lab-data/SCRI_Projects/HTA/M...{'R1': ['s3://dp-lab-data/SCRI_Proje...{'cellRangerRefPkg': 's3://dp-lab-da...s3://dp-lab-data/SCRI_Projects/HTA/M...
MSK_LX_1250b_PM_1_MITO6RU1250_PLs3://dp-lab-data/SCRI_Projects/HTA/M...{'R1': ['s3://dp-lab-data/SCRI_Proje...{'cellRangerRefPkg': 's3://dp-lab-da...s3://dp-lab-data/SCRI_Projects/HTA/M...
Ru1250D_T_1_MITO7RU1250_T2s3://dp-lab-data/SCRI_Projects/HTA/M...{'R1': ['s3://dp-lab-data/SCRI_Proje...{'cellRangerRefPkg': 's3://dp-lab-da...s3://dp-lab-data/SCRI_Projects/HTA/M...
Ru1250e_MITO8RU1250_ASC1s3://dp-lab-data/SCRI_Projects/HTA/M...{'R1': ['s3://dp-lab-data/SCRI_Proje...{'cellRangerRefPkg': 's3://dp-lab-da...s3://dp-lab-data/SCRI_Projects/HTA/M...
MSK_LX_1250f_MITO9RU1250_ASC2s3://dp-lab-data/SCRI_Projects/HTA/M...{'R1': ['s3://dp-lab-data/SCRI_Proje...{'cellRangerRefPkg': 's3://dp-lab-da...s3://dp-lab-data/SCRI_Projects/HTA/M...
Ru581D_MITO10RU581_LIVs3://dp-lab-data/SCRI_Projects/HTA/M...{'R1': ['s3://dp-lab-data/SCRI_Proje...{'cellRangerRefPkg': 's3://dp-lab-da...s3://dp-lab-data/SCRI_Projects/HTA/M...
Ru581b_T1_MITO11RU581_Tas3://dp-lab-data/SCRI_Projects/HTA/M...{'R1': ['s3://dp-lab-data/SCRI_Proje...{'cellRangerRefPkg': 's3://dp-lab-da...s3://dp-lab-data/SCRI_Projects/HTA/M...
Ru581c-LN1_MITO13RU581_LNas3://dp-lab-data/SCRI_Projects/HTA/M...{'R1': ['s3://dp-lab-data/SCRI_Proje...{'cellRangerRefPkg': 's3://dp-lab-da...s3://dp-lab-data/SCRI_Projects/HTA/M...
\n", + "
" + ], + "text/plain": [ + " Unnamed: 0 joe_sample_name \\\n", + "sample \n", + "Ru1083_MITO 0 RU1083_LIV \n", + "MSK_LX_1083c_T_2_MITO 1 RU1083_T2 \n", + "Ru263_MITO 2 RU263_PDX \n", + "POSIE_101920_T_1_MITO 3 RU1083_T1 \n", + "Ru1083d_MITO 4 RU1083_ST \n", + "Ru1250C_T_1_MITO 5 RU1250_T1 \n", + "MSK_LX_1250b_PM_1_MITO 6 RU1250_PL \n", + "Ru1250D_T_1_MITO 7 RU1250_T2 \n", + "Ru1250e_MITO 8 RU1250_ASC1 \n", + "MSK_LX_1250f_MITO 9 RU1250_ASC2 \n", + "Ru581D_MITO 10 RU581_LIV \n", + "Ru581b_T1_MITO 11 RU581_Ta \n", + "Ru581c-LN1_MITO 13 RU581_LNa \n", + "\n", + " AWS_storage \\\n", + "sample \n", + "Ru1083_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "MSK_LX_1083c_T_2_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "Ru263_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "POSIE_101920_T_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "Ru1083d_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "Ru1250C_T_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "MSK_LX_1250b_PM_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "Ru1250D_T_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "Ru1250e_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "MSK_LX_1250f_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "Ru581D_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "Ru581b_T1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "Ru581c-LN1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "\n", + " FASTQs \\\n", + "sample \n", + "Ru1083_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "MSK_LX_1083c_T_2_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "Ru263_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "POSIE_101920_T_1_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "Ru1083d_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "Ru1250C_T_1_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "MSK_LX_1250b_PM_1_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "Ru1250D_T_1_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "Ru1250e_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "MSK_LX_1250f_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "Ru581D_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "Ru581b_T1_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "Ru581c-LN1_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "\n", + " reference \\\n", + "sample \n", + "Ru1083_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "MSK_LX_1083c_T_2_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "Ru263_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "POSIE_101920_T_1_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "Ru1083d_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "Ru1250C_T_1_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "MSK_LX_1250b_PM_1_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "Ru1250D_T_1_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "Ru1250e_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "MSK_LX_1250f_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "Ru581D_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "Ru581b_T1_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "Ru581c-LN1_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "\n", + " whitelist \n", + "sample \n", + "Ru1083_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "MSK_LX_1083c_T_2_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "Ru263_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "POSIE_101920_T_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "Ru1083d_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "Ru1250C_T_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "MSK_LX_1250b_PM_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "Ru1250D_T_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "Ru1250e_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "MSK_LX_1250f_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "Ru581D_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "Ru581b_T1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "Ru581c-LN1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... " + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples['whitelist'] = np.nan\n", + "for sample, row in samples.iterrows():\n", + " samples.loc[sample, 'whitelist'] = f's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/masked_mito_reference/{sample}/{sample}.txt'\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e845f640-0716-49ca-8e27-8d987b2cf586", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "6e7dacea-ff91-416b-9558-6200b5d5cae2", + "metadata": {}, + "source": [ + "# Subset" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "805eab1f-e70a-4e7e-8a54-dd679a30a5f3", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Unnamed: 0joe_sample_nameAWS_storageFASTQsreferencewhitelist
sample
Ru1083_MITO0RU1083_LIVs3://dp-lab-data/SCRI_Projects/HTA/M...{'R1': ['s3://dp-lab-data/SCRI_Proje...{'cellRangerRefPkg': 's3://dp-lab-da...s3://dp-lab-data/SCRI_Projects/HTA/M...
\n", + "
" + ], + "text/plain": [ + " Unnamed: 0 joe_sample_name \\\n", + "sample \n", + "Ru1083_MITO 0 RU1083_LIV \n", + "\n", + " AWS_storage \\\n", + "sample \n", + "Ru1083_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "\n", + " FASTQs \\\n", + "sample \n", + "Ru1083_MITO {'R1': ['s3://dp-lab-data/SCRI_Proje... \n", + "\n", + " reference \\\n", + "sample \n", + "Ru1083_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "\n", + " whitelist \n", + "sample \n", + "Ru1083_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... " + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples_ = samples.copy()\n", + "\n", + "samples = samples.iloc[0:1]\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3c41c631-45c8-4239-87a3-fd88ed67e3f1", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "c8852971-6bdd-403b-8ea4-b4ebfa3639f0", + "metadata": {}, + "source": [ + "# Generate inputs" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "157fd6b4-859d-4b48-8812-04691f9b097e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
MitoTracing.sampleNameMitoTracing.fastqNameMitoTracing.fastqR1MitoTracing.fastqR2MitoTracing.referenceMitoTracing.includeIntronsMitoTracing.expectCellsMitoTracing.numCoresMitoTracing.memoryMitoTracing.whitelistMitoTracing.dockerRegistry
sample
Ru1083_MITORu1083_MITO3924_AV-1759_Ru1083_MITO_IGO_13388_1[s3://dp-lab-data/SCRI_Projects/HTA/...[s3://dp-lab-data/SCRI_Projects/HTA/...{'cellRangerRefPkg': 's3://dp-lab-da...False500016128s3://dp-lab-data/SCRI_Projects/HTA/M...quay.io/hisplan
\n", + "
" + ], + "text/plain": [ + " MitoTracing.sampleName MitoTracing.fastqName \\\n", + "sample \n", + "Ru1083_MITO Ru1083_MITO 3924_AV-1759_Ru1083_MITO_IGO_13388_1 \n", + "\n", + " MitoTracing.fastqR1 \\\n", + "sample \n", + "Ru1083_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "\n", + " MitoTracing.fastqR2 \\\n", + "sample \n", + "Ru1083_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "\n", + " MitoTracing.reference \\\n", + "sample \n", + "Ru1083_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "\n", + " MitoTracing.includeIntrons MitoTracing.expectCells \\\n", + "sample \n", + "Ru1083_MITO False 5000 \n", + "\n", + " MitoTracing.numCores MitoTracing.memory \\\n", + "sample \n", + "Ru1083_MITO 16 128 \n", + "\n", + " MitoTracing.whitelist \\\n", + "sample \n", + "Ru1083_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "\n", + " MitoTracing.dockerRegistry \n", + "sample \n", + "Ru1083_MITO quay.io/hisplan " + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Standard inputs, modify fields as need be\n", + "\n", + "# Load minimum inputs and labels fields from templates\n", + "with open(f\"{config_dir}/template.inputs.json\") as f:\n", + " std_inputs_fields = list(json.load(f).keys())\n", + " \n", + "# Annotate all samples with workflow inputs and labels\n", + "inputs = pd.DataFrame(index=samples.index, columns=std_inputs_fields,)\n", + "\n", + "# Default inputs\n", + "inputs[f\"{prefix}.includeIntrons\"] = False\n", + "inputs[f\"{prefix}.expectCells\"] = 5000\n", + "inputs[f\"{prefix}.numCores\"] = 16\n", + "inputs[f\"{prefix}.memory\"] = 128\n", + "# inputs[f\"{prefix}.dockerRegistry\"] = \"docker.io/sailmskcc\"\n", + "inputs[f\"{prefix}.dockerRegistry\"] = common_docker_registry\n", + "\n", + "\n", + "# Sample information\n", + "inputs[f\"{prefix}.sampleName\"] = samples.index.tolist()\n", + "inputs[f\"{prefix}.fastqR1\"] = samples['FASTQs'].str['R1']\n", + "inputs[f\"{prefix}.fastqR2\"] = samples['FASTQs'].str['R2']\n", + "\n", + "for sample in inputs.index:\n", + " fastqR1_name = get_fastqs_name(inputs.loc[sample, 'MitoTracing.fastqR1'])\n", + " fastqR2_name = get_fastqs_name(inputs.loc[sample, 'MitoTracing.fastqR2'])\n", + " \n", + " assert(fastqR1_name == fastqR2_name)\n", + " inputs.loc[sample, f\"{prefix}.fastqName\"] = fastqR1_name\n", + "\n", + "inputs[f\"{prefix}.whitelist\"] = samples['whitelist']\n", + "inputs[f\"{prefix}.reference\"] = samples['reference']\n", + "\n", + "inputs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9785f91c-a79e-44ad-b7df-403b557c7d74", + "metadata": {}, + "outputs": [], + "source": [ + "# Modification for specific samples\n", + "\n", + "# inputs[f\"{prefix}.memory\"] = 256 " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1db167f4-30fa-4b6c-b254-f8ca24448786", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "130c8072-b98e-4e5c-819b-5fd18cfb27b0", + "metadata": {}, + "source": [ + "# Generate labels" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "03d5abbb-6bf0-4636-8bb7-edd2463439c7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
pipelineTypeprojectsampleownerdestinationtransfercomment
sample
Ru1083_MITOMitoTracingLung Tumor AtlasRu1083_MITOsohailnNaN-sohailn
\n", + "
" + ], + "text/plain": [ + " pipelineType project sample owner destination \\\n", + "sample \n", + "Ru1083_MITO MitoTracing Lung Tumor Atlas Ru1083_MITO sohailn NaN \n", + "\n", + " transfer comment \n", + "sample \n", + "Ru1083_MITO - sohailn " + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Standard labels, modify fields as need be\n", + "\n", + "with open(f\"{config_dir}/template.labels.json\") as f:\n", + " std_labels_fields = list(json.load(f).keys())\n", + " \n", + "# Annotate all samples with workflow inputs and labels\n", + "labels = pd.DataFrame(index=samples.index, columns=std_labels_fields,)\n", + "\n", + "labels[\"pipelineType\"] = pipeline_type\n", + "labels[\"project\"] = 'Lung Tumor Atlas'\n", + "labels[\"sample\"] = labels.index\n", + "labels[\"owner\"] = creds[\"user\"]\n", + "# labels[\"destination\"] = samples['AWS_storage'] + \"/\" + output_dirname\n", + "labels[\"transfer\"] = \"-\"\n", + "labels[\"comment\"] = creds[\"user\"]\n", + "\n", + "labels" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "bce9baca-918f-4264-9afd-809ef64e9d9e", + "metadata": {}, + "outputs": [], + "source": [ + "labels[\"destination\"] = 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/masked_mito_reference/' + labels.index + '/' + output_dirname" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d99c1d72-d584-4a2b-97c6-c80de3d66b5c", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "dce78f39-c948-4ab2-a62d-bee0a08c1564", + "metadata": {}, + "source": [ + "# Run samples" + ] + }, + { + "cell_type": "markdown", + "id": "bd2bf1b2-4b5f-48c0-8909-354fe6b313e3", + "metadata": {}, + "source": [ + "Look over the samples before submitting one last time" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "ee601aed-3a19-4317-a918-4120db7ee7bf", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
MitoTracing.sampleNameMitoTracing.fastqNameMitoTracing.fastqR1MitoTracing.fastqR2MitoTracing.referenceMitoTracing.includeIntronsMitoTracing.expectCellsMitoTracing.numCoresMitoTracing.memoryMitoTracing.whitelistMitoTracing.dockerRegistry
sample
Ru1083_MITORu1083_MITO3924_AV-1759_Ru1083_MITO_IGO_13388_1[s3://dp-lab-data/SCRI_Projects/HTA/...[s3://dp-lab-data/SCRI_Projects/HTA/...{'cellRangerRefPkg': 's3://dp-lab-da...False500016128s3://dp-lab-data/SCRI_Projects/HTA/M...quay.io/hisplan
\n", + "
" + ], + "text/plain": [ + " MitoTracing.sampleName MitoTracing.fastqName \\\n", + "sample \n", + "Ru1083_MITO Ru1083_MITO 3924_AV-1759_Ru1083_MITO_IGO_13388_1 \n", + "\n", + " MitoTracing.fastqR1 \\\n", + "sample \n", + "Ru1083_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "\n", + " MitoTracing.fastqR2 \\\n", + "sample \n", + "Ru1083_MITO [s3://dp-lab-data/SCRI_Projects/HTA/... \n", + "\n", + " MitoTracing.reference \\\n", + "sample \n", + "Ru1083_MITO {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "\n", + " MitoTracing.includeIntrons MitoTracing.expectCells \\\n", + "sample \n", + "Ru1083_MITO False 5000 \n", + "\n", + " MitoTracing.numCores MitoTracing.memory \\\n", + "sample \n", + "Ru1083_MITO 16 128 \n", + "\n", + " MitoTracing.whitelist \\\n", + "sample \n", + "Ru1083_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "\n", + " MitoTracing.dockerRegistry \n", + "sample \n", + "Ru1083_MITO quay.io/hisplan " + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "inputs" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "id": "91318853-0886-4c2b-8b87-76fa8e5ab30d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
pipelineTypeprojectsampleownerdestinationtransfercomment
sample
Ru1083_MITOMitoTracingLung Tumor AtlasRu1083_MITOsohailns3://dp-lab-data/SCRI_Projects/HTA/M...-sohailn
\n", + "
" + ], + "text/plain": [ + " pipelineType project sample owner \\\n", + "sample \n", + "Ru1083_MITO MitoTracing Lung Tumor Atlas Ru1083_MITO sohailn \n", + "\n", + " destination transfer comment \n", + "sample \n", + "Ru1083_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... - sohailn " + ] + }, + "execution_count": 51, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "labels" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "acd1c04b-d582-481b-b8d4-bd9a9a8f97c4", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 52, + "id": "54ef3d9c-2361-4b8e-bcfe-bc9c3878876b", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c0008f7bacfb48a2ac0978f4ff894f57", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/1 [00:00\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
AWS_storageidspeciessc_techproject_idreference
Sample
RB-2041_WildType_DOGMAseqs3://dp-lab-data/collaborators/sfeir...4440human10X_scATACscATAC-seq pilotGRCh38-1.1.0
RB-2041_mRB54_1003_DOGMAseqs3://dp-lab-data/collaborators/sfeir...4441human10X_scATACscATAC-seq pilotGRCh38-1.1.0
\n", + "" + ], + "text/plain": [ + " AWS_storage id \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq s3://dp-lab-data/collaborators/sfeir... 4440 \n", + "RB-2041_mRB54_1003_DOGMAseq s3://dp-lab-data/collaborators/sfeir... 4441 \n", + "\n", + " species sc_tech project_id \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq human 10X_scATAC scATAC-seq pilot \n", + "RB-2041_mRB54_1003_DOGMAseq human 10X_scATAC scATAC-seq pilot \n", + "\n", + " reference \n", + "Sample \n", + "RB-2041_WildType_DOGMAseq GRCh38-1.1.0 \n", + "RB-2041_mRB54_1003_DOGMAseq GRCh38-1.1.0 " + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# You can supply a list of IDs or request IDs\n", + "\n", + "sample_ids = [4440, 4441]\n", + "\n", + "samples = sample_scridb_info(sample_ids, 'id', creds)\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "e85154ba-47ad-4f3a-b2c8-9c81f2d33e23", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
AWS_storageidspeciessc_techproject_idreferenceFASTQs
Sample
RB-2041_WildType_DOGMAseqs3://dp-lab-data/collaborators/sfeir...4440human10X_scATACscATAC-seq pilotGRCh38-1.1.0{'R1': ['s3://dp-lab-data/collaborat...
RB-2041_mRB54_1003_DOGMAseqs3://dp-lab-data/collaborators/sfeir...4441human10X_scATACscATAC-seq pilotGRCh38-1.1.0{'R1': ['s3://dp-lab-data/collaborat...
\n", + "
" + ], + "text/plain": [ + " AWS_storage id \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq s3://dp-lab-data/collaborators/sfeir... 4440 \n", + "RB-2041_mRB54_1003_DOGMAseq s3://dp-lab-data/collaborators/sfeir... 4441 \n", + "\n", + " species sc_tech project_id \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq human 10X_scATAC scATAC-seq pilot \n", + "RB-2041_mRB54_1003_DOGMAseq human 10X_scATAC scATAC-seq pilot \n", + "\n", + " reference \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq GRCh38-1.1.0 \n", + "RB-2041_mRB54_1003_DOGMAseq GRCh38-1.1.0 \n", + "\n", + " FASTQs \n", + "Sample \n", + "RB-2041_WildType_DOGMAseq {'R1': ['s3://dp-lab-data/collaborat... \n", + "RB-2041_mRB54_1003_DOGMAseq {'R1': ['s3://dp-lab-data/collaborat... " + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples[\"FASTQs\"] = samples[\"AWS_storage\"].apply(lambda x: get_fastqs(x, fastq_map[prefix], \"FASTQ\"))\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a59060ca-b11f-4e74-9edf-5ce3e863a064", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "16d0ca53-edc7-4e1b-9c9c-0d812a1ae1c7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
AWS_storageidspeciessc_techproject_idreferenceFASTQs
Sample
RB-2041_WildType_DOGMAseqs3://dp-lab-data/collaborators/sfeir...4440human10X_scATACscATAC-seq pilot{'cellRangerRefPkg': 's3://dp-lab-da...{'R1': ['s3://dp-lab-data/collaborat...
RB-2041_mRB54_1003_DOGMAseqs3://dp-lab-data/collaborators/sfeir...4441human10X_scATACscATAC-seq pilot{'cellRangerRefPkg': 's3://dp-lab-da...{'R1': ['s3://dp-lab-data/collaborat...
\n", + "
" + ], + "text/plain": [ + " AWS_storage id \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq s3://dp-lab-data/collaborators/sfeir... 4440 \n", + "RB-2041_mRB54_1003_DOGMAseq s3://dp-lab-data/collaborators/sfeir... 4441 \n", + "\n", + " species sc_tech project_id \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq human 10X_scATAC scATAC-seq pilot \n", + "RB-2041_mRB54_1003_DOGMAseq human 10X_scATAC scATAC-seq pilot \n", + "\n", + " reference \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "RB-2041_mRB54_1003_DOGMAseq {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "\n", + " FASTQs \n", + "Sample \n", + "RB-2041_WildType_DOGMAseq {'R1': ['s3://dp-lab-data/collaborat... \n", + "RB-2041_mRB54_1003_DOGMAseq {'R1': ['s3://dp-lab-data/collaborat... " + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Reference package created by Jaeyoung\n", + "\n", + "# cellRangerRefPkg=\"s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/reference-packages/refdata-gex-mito-GRCh38-ensemble98.tar.gz\"\n", + "cellRangerRefPkg=\"s3://dp-lab-data/collaborators/sfeira/ScatacSeqPilot/GRCh38_atac_mito_mask_reference/GRCh38_atac_mito_mask_reference.tar.gz\"\n", + "mitoFastaRefPkg=\"s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/reference-packages/mito-fasta-GRCh38.tar.gz\"\n", + "\n", + "reference = [dict(cellRangerRefPkg=cellRangerRefPkg,\n", + " mitoFastaRefPkg=mitoFastaRefPkg)] * len(samples)\n", + "samples[\"reference\"] = reference\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "56ea3b42-967e-49aa-8344-93420514c6e1", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "c5c4180c-0d82-415e-8516-4174947fd567", + "metadata": {}, + "source": [ + "# Get whitelist" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "600f5e5b-228c-42f4-9297-a6a2b4035d60", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
AWS_storageidspeciessc_techproject_idreferenceFASTQswhitelist
Sample
RB-2041_WildType_DOGMAseqs3://dp-lab-data/collaborators/sfeir...4440human10X_scATACscATAC-seq pilot{'cellRangerRefPkg': 's3://dp-lab-da...{'R1': ['s3://dp-lab-data/collaborat...s3://dp-lab-data/collaborators/sfeir...
RB-2041_mRB54_1003_DOGMAseqs3://dp-lab-data/collaborators/sfeir...4441human10X_scATACscATAC-seq pilot{'cellRangerRefPkg': 's3://dp-lab-da...{'R1': ['s3://dp-lab-data/collaborat...s3://dp-lab-data/collaborators/sfeir...
\n", + "
" + ], + "text/plain": [ + " AWS_storage id \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq s3://dp-lab-data/collaborators/sfeir... 4440 \n", + "RB-2041_mRB54_1003_DOGMAseq s3://dp-lab-data/collaborators/sfeir... 4441 \n", + "\n", + " species sc_tech project_id \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq human 10X_scATAC scATAC-seq pilot \n", + "RB-2041_mRB54_1003_DOGMAseq human 10X_scATAC scATAC-seq pilot \n", + "\n", + " reference \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "RB-2041_mRB54_1003_DOGMAseq {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "\n", + " FASTQs \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq {'R1': ['s3://dp-lab-data/collaborat... \n", + "RB-2041_mRB54_1003_DOGMAseq {'R1': ['s3://dp-lab-data/collaborat... \n", + "\n", + " whitelist \n", + "Sample \n", + "RB-2041_WildType_DOGMAseq s3://dp-lab-data/collaborators/sfeir... \n", + "RB-2041_mRB54_1003_DOGMAseq s3://dp-lab-data/collaborators/sfeir... " + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples['whitelist'] = np.nan\n", + "for sample, row in samples.iterrows(): \n", + " samples.loc[sample, 'whitelist'] = f\"{row['AWS_storage']}/cr-atac-mito-results/filtered_peak_bc_matrix/barcodes.tsv\"\n", + " \n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3c41c631-45c8-4239-87a3-fd88ed67e3f1", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "c8852971-6bdd-403b-8ea4-b4ebfa3639f0", + "metadata": {}, + "source": [ + "# Generate inputs" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "157fd6b4-859d-4b48-8812-04691f9b097e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
MitoTracing.sampleNameMitoTracing.fastqNameMitoTracing.fastqR1MitoTracing.fastqR2MitoTracing.referenceMitoTracing.includeIntronsMitoTracing.expectCellsMitoTracing.numCoresMitoTracing.memoryMitoTracing.whitelistMitoTracing.dockerRegistry
Sample
RB-2041_WildType_DOGMAseqRB-2041_WildType_DOGMAseq4440_RB-2041_WildType_DOGMAseq_IGO_1...[s3://dp-lab-data/collaborators/sfei...[s3://dp-lab-data/collaborators/sfei...{'cellRangerRefPkg': 's3://dp-lab-da...False500016128s3://dp-lab-data/collaborators/sfeir...quay.io/hisplan
RB-2041_mRB54_1003_DOGMAseqRB-2041_mRB54_1003_DOGMAseq4441_RB-2041_mRB54_1003_DOGMAseq_IGO...[s3://dp-lab-data/collaborators/sfei...[s3://dp-lab-data/collaborators/sfei...{'cellRangerRefPkg': 's3://dp-lab-da...False500016128s3://dp-lab-data/collaborators/sfeir...quay.io/hisplan
\n", + "
" + ], + "text/plain": [ + " MitoTracing.sampleName \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq RB-2041_WildType_DOGMAseq \n", + "RB-2041_mRB54_1003_DOGMAseq RB-2041_mRB54_1003_DOGMAseq \n", + "\n", + " MitoTracing.fastqName \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq 4440_RB-2041_WildType_DOGMAseq_IGO_1... \n", + "RB-2041_mRB54_1003_DOGMAseq 4441_RB-2041_mRB54_1003_DOGMAseq_IGO... \n", + "\n", + " MitoTracing.fastqR1 \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq [s3://dp-lab-data/collaborators/sfei... \n", + "RB-2041_mRB54_1003_DOGMAseq [s3://dp-lab-data/collaborators/sfei... \n", + "\n", + " MitoTracing.fastqR2 \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq [s3://dp-lab-data/collaborators/sfei... \n", + "RB-2041_mRB54_1003_DOGMAseq [s3://dp-lab-data/collaborators/sfei... \n", + "\n", + " MitoTracing.reference \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "RB-2041_mRB54_1003_DOGMAseq {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "\n", + " MitoTracing.includeIntrons \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq False \n", + "RB-2041_mRB54_1003_DOGMAseq False \n", + "\n", + " MitoTracing.expectCells MitoTracing.numCores \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq 5000 16 \n", + "RB-2041_mRB54_1003_DOGMAseq 5000 16 \n", + "\n", + " MitoTracing.memory \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq 128 \n", + "RB-2041_mRB54_1003_DOGMAseq 128 \n", + "\n", + " MitoTracing.whitelist \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq s3://dp-lab-data/collaborators/sfeir... \n", + "RB-2041_mRB54_1003_DOGMAseq s3://dp-lab-data/collaborators/sfeir... \n", + "\n", + " MitoTracing.dockerRegistry \n", + "Sample \n", + "RB-2041_WildType_DOGMAseq quay.io/hisplan \n", + "RB-2041_mRB54_1003_DOGMAseq quay.io/hisplan " + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Standard inputs, modify fields as need be\n", + "\n", + "# Load minimum inputs and labels fields from templates\n", + "with open(f\"{config_dir}/template.inputs.json\") as f:\n", + " std_inputs_fields = list(json.load(f).keys())\n", + " \n", + "# Annotate all samples with workflow inputs and labels\n", + "inputs = pd.DataFrame(index=samples.index, columns=std_inputs_fields,)\n", + "\n", + "# Default inputs\n", + "inputs[f\"{prefix}.includeIntrons\"] = False\n", + "inputs[f\"{prefix}.expectCells\"] = 5000\n", + "inputs[f\"{prefix}.numCores\"] = 16\n", + "inputs[f\"{prefix}.memory\"] = 128\n", + "inputs[f\"{prefix}.dockerRegistry\"] = common_docker_registry\n", + "\n", + "# Sample information\n", + "inputs[f\"{prefix}.sampleName\"] = samples.index.tolist()\n", + "inputs[f\"{prefix}.fastqR1\"] = samples['FASTQs'].str['R1']\n", + "inputs[f\"{prefix}.fastqR2\"] = samples['FASTQs'].str['R2']\n", + "\n", + "for sample in inputs.index:\n", + " fastqR1_name = get_fastqs_name(inputs.loc[sample, 'MitoTracing.fastqR1'])\n", + " fastqR2_name = get_fastqs_name(inputs.loc[sample, 'MitoTracing.fastqR2'])\n", + " \n", + " assert(fastqR1_name == fastqR2_name)\n", + " inputs.loc[sample, f\"{prefix}.fastqName\"] = fastqR1_name\n", + "\n", + "inputs[f\"{prefix}.whitelist\"] = samples['whitelist']\n", + "inputs[f\"{prefix}.reference\"] = samples['reference']\n", + "\n", + "inputs" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "9785f91c-a79e-44ad-b7df-403b557c7d74", + "metadata": {}, + "outputs": [], + "source": [ + "# Modification for specific samples\n", + "inputs[f\"{prefix}.memory\"] = 256 " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1db167f4-30fa-4b6c-b254-f8ca24448786", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "130c8072-b98e-4e5c-819b-5fd18cfb27b0", + "metadata": {}, + "source": [ + "# Generate labels" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "03d5abbb-6bf0-4636-8bb7-edd2463439c7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
pipelineTypeprojectsampleownerdestinationtransfercomment
Sample
RB-2041_WildType_DOGMAseqMitoTracingscATAC-seq pilotRB-2041_WildType_DOGMAseqsohailns3://dp-lab-data/collaborators/sfeir...-sohailn
RB-2041_mRB54_1003_DOGMAseqMitoTracingscATAC-seq pilotRB-2041_mRB54_1003_DOGMAseqsohailns3://dp-lab-data/collaborators/sfeir...-sohailn
\n", + "
" + ], + "text/plain": [ + " pipelineType project \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq MitoTracing scATAC-seq pilot \n", + "RB-2041_mRB54_1003_DOGMAseq MitoTracing scATAC-seq pilot \n", + "\n", + " sample owner \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq RB-2041_WildType_DOGMAseq sohailn \n", + "RB-2041_mRB54_1003_DOGMAseq RB-2041_mRB54_1003_DOGMAseq sohailn \n", + "\n", + " destination transfer \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq s3://dp-lab-data/collaborators/sfeir... - \n", + "RB-2041_mRB54_1003_DOGMAseq s3://dp-lab-data/collaborators/sfeir... - \n", + "\n", + " comment \n", + "Sample \n", + "RB-2041_WildType_DOGMAseq sohailn \n", + "RB-2041_mRB54_1003_DOGMAseq sohailn " + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Standard labels, modify fields as need be\n", + "\n", + "with open(f\"{config_dir}/template.labels.json\") as f:\n", + " std_labels_fields = list(json.load(f).keys())\n", + " \n", + "# Annotate all samples with workflow inputs and labels\n", + "labels = pd.DataFrame(index=samples.index, columns=std_labels_fields,)\n", + "\n", + "labels[\"pipelineType\"] = pipeline_type\n", + "labels[\"project\"] = samples['project_id']\n", + "labels[\"sample\"] = labels.index\n", + "labels[\"owner\"] = creds[\"user\"]\n", + "labels[\"destination\"] = samples['AWS_storage'] + \"/\" + output_dirname\n", + "labels[\"transfer\"] = \"-\"\n", + "labels[\"comment\"] = creds[\"user\"]\n", + "\n", + "labels" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d99c1d72-d584-4a2b-97c6-c80de3d66b5c", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "dce78f39-c948-4ab2-a62d-bee0a08c1564", + "metadata": {}, + "source": [ + "# Run samples" + ] + }, + { + "cell_type": "markdown", + "id": "bd2bf1b2-4b5f-48c0-8909-354fe6b313e3", + "metadata": {}, + "source": [ + "Look over the samples before submitting one last time" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "ee601aed-3a19-4317-a918-4120db7ee7bf", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
MitoTracing.sampleNameMitoTracing.fastqNameMitoTracing.fastqR1MitoTracing.fastqR2MitoTracing.referenceMitoTracing.includeIntronsMitoTracing.expectCellsMitoTracing.numCoresMitoTracing.memoryMitoTracing.whitelistMitoTracing.dockerRegistry
Sample
RB-2041_WildType_DOGMAseqRB-2041_WildType_DOGMAseq4440_RB-2041_WildType_DOGMAseq_IGO_1...[s3://dp-lab-data/collaborators/sfei...[s3://dp-lab-data/collaborators/sfei...{'cellRangerRefPkg': 's3://dp-lab-da...False500016256s3://dp-lab-data/collaborators/sfeir...quay.io/hisplan
RB-2041_mRB54_1003_DOGMAseqRB-2041_mRB54_1003_DOGMAseq4441_RB-2041_mRB54_1003_DOGMAseq_IGO...[s3://dp-lab-data/collaborators/sfei...[s3://dp-lab-data/collaborators/sfei...{'cellRangerRefPkg': 's3://dp-lab-da...False500016256s3://dp-lab-data/collaborators/sfeir...quay.io/hisplan
\n", + "
" + ], + "text/plain": [ + " MitoTracing.sampleName \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq RB-2041_WildType_DOGMAseq \n", + "RB-2041_mRB54_1003_DOGMAseq RB-2041_mRB54_1003_DOGMAseq \n", + "\n", + " MitoTracing.fastqName \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq 4440_RB-2041_WildType_DOGMAseq_IGO_1... \n", + "RB-2041_mRB54_1003_DOGMAseq 4441_RB-2041_mRB54_1003_DOGMAseq_IGO... \n", + "\n", + " MitoTracing.fastqR1 \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq [s3://dp-lab-data/collaborators/sfei... \n", + "RB-2041_mRB54_1003_DOGMAseq [s3://dp-lab-data/collaborators/sfei... \n", + "\n", + " MitoTracing.fastqR2 \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq [s3://dp-lab-data/collaborators/sfei... \n", + "RB-2041_mRB54_1003_DOGMAseq [s3://dp-lab-data/collaborators/sfei... \n", + "\n", + " MitoTracing.reference \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "RB-2041_mRB54_1003_DOGMAseq {'cellRangerRefPkg': 's3://dp-lab-da... \n", + "\n", + " MitoTracing.includeIntrons \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq False \n", + "RB-2041_mRB54_1003_DOGMAseq False \n", + "\n", + " MitoTracing.expectCells MitoTracing.numCores \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq 5000 16 \n", + "RB-2041_mRB54_1003_DOGMAseq 5000 16 \n", + "\n", + " MitoTracing.memory \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq 256 \n", + "RB-2041_mRB54_1003_DOGMAseq 256 \n", + "\n", + " MitoTracing.whitelist \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq s3://dp-lab-data/collaborators/sfeir... \n", + "RB-2041_mRB54_1003_DOGMAseq s3://dp-lab-data/collaborators/sfeir... \n", + "\n", + " MitoTracing.dockerRegistry \n", + "Sample \n", + "RB-2041_WildType_DOGMAseq quay.io/hisplan \n", + "RB-2041_mRB54_1003_DOGMAseq quay.io/hisplan " + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "inputs" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "91318853-0886-4c2b-8b87-76fa8e5ab30d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
pipelineTypeprojectsampleownerdestinationtransfercomment
Sample
RB-2041_WildType_DOGMAseqMitoTracingscATAC-seq pilotRB-2041_WildType_DOGMAseqsohailns3://dp-lab-data/collaborators/sfeir...-sohailn
RB-2041_mRB54_1003_DOGMAseqMitoTracingscATAC-seq pilotRB-2041_mRB54_1003_DOGMAseqsohailns3://dp-lab-data/collaborators/sfeir...-sohailn
\n", + "
" + ], + "text/plain": [ + " pipelineType project \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq MitoTracing scATAC-seq pilot \n", + "RB-2041_mRB54_1003_DOGMAseq MitoTracing scATAC-seq pilot \n", + "\n", + " sample owner \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq RB-2041_WildType_DOGMAseq sohailn \n", + "RB-2041_mRB54_1003_DOGMAseq RB-2041_mRB54_1003_DOGMAseq sohailn \n", + "\n", + " destination transfer \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq s3://dp-lab-data/collaborators/sfeir... - \n", + "RB-2041_mRB54_1003_DOGMAseq s3://dp-lab-data/collaborators/sfeir... - \n", + "\n", + " comment \n", + "Sample \n", + "RB-2041_WildType_DOGMAseq sohailn \n", + "RB-2041_mRB54_1003_DOGMAseq sohailn " + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "labels" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "acd1c04b-d582-481b-b8d4-bd9a9a8f97c4", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "54ef3d9c-2361-4b8e-bcfe-bc9c3878876b", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "0d10068356bb4441b4ddbf1fa0b95419", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/2 [00:00\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
AWS_storageidspeciessc_techproject_idreference
Sample
ARN-1167_M-4T1s3://dp-lab-data/collaborators/aboir...3249mouse10X_V3.1Leptomeningeal metastasis heterogeneitys3://seqc-public/genomes/mm38_long_p...
ARN-1167_Normals3://dp-lab-data/collaborators/aboir...3250mouse10X_V3.1Leptomeningeal metastasis heterogeneitys3://seqc-public/genomes/mm38_long_p...
ARN-1167_PM-4T1s3://dp-lab-data/collaborators/aboir...3251mouse10X_V3.1Leptomeningeal metastasis heterogeneitys3://seqc-public/genomes/mm38_long_p...
\n", + "" + ], + "text/plain": [ + " AWS_storage id species \\\n", + "Sample \n", + "ARN-1167_M-4T1 s3://dp-lab-data/collaborators/aboir... 3249 mouse \n", + "ARN-1167_Normal s3://dp-lab-data/collaborators/aboir... 3250 mouse \n", + "ARN-1167_PM-4T1 s3://dp-lab-data/collaborators/aboir... 3251 mouse \n", + "\n", + " sc_tech project_id \\\n", + "Sample \n", + "ARN-1167_M-4T1 10X_V3.1 Leptomeningeal metastasis heterogeneity \n", + "ARN-1167_Normal 10X_V3.1 Leptomeningeal metastasis heterogeneity \n", + "ARN-1167_PM-4T1 10X_V3.1 Leptomeningeal metastasis heterogeneity \n", + "\n", + " reference \n", + "Sample \n", + "ARN-1167_M-4T1 s3://seqc-public/genomes/mm38_long_p... \n", + "ARN-1167_Normal s3://seqc-public/genomes/mm38_long_p... \n", + "ARN-1167_PM-4T1 s3://seqc-public/genomes/mm38_long_p... " + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# You can supply a list of IDs or request IDs or even AWS paths\n", + "\n", + "request_ids = ['ARN-1167']\n", + "samples = sample_scridb_info(request_ids, 'request_id', creds)\n", + "\n", + "# sample_ids = [3970]\n", + "# samples = sample_scridb_info(sample_ids, 'id', creds)\n", + "\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "IMPORTANT NOTE \n", + "\n", + "Check the name of the folder you are running. Typically the folder that is stored in the database is just the GEX. So if another library is generated (multiome ATAC, VDJ, hashtag, etc) then it needs to be manually changed." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ARN-1167_M-4T1\n", + " PRE ARN-1167_M-4T1/\n", + " PRE ARN-1167_M-4T1_HTO/\n", + "\n", + "ARN-1167_Normal\n", + " PRE ARN-1167_Normal/\n", + " PRE ARN-1167_Normal_HTO/\n", + "\n", + "ARN-1167_PM-4T1\n", + " PRE ARN-1167_PM-4T1/\n", + " PRE ARN-1167_PM-4T1_HTO/\n", + "\n" + ] + } + ], + "source": [ + "# Check the name of the folder you are running\n", + "# Especially if there are multiple libraries (i.e ATAC, TCR_VDJ, etc.)\n", + "\n", + "for sample, row in samples.iterrows():\n", + " print(sample)\n", + " path = os.path.split(row['AWS_storage'])[0] + '/'\n", + " os.system(f'aws s3 ls {path} | grep {sample}')\n", + " print()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "samples[\"FASTQs\"] = samples[\"AWS_storage\"].apply(lambda x: get_fastqs(x, fastq_map[prefix], \"FASTQ\"))\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "IMPORTANT NOTE\n", + "\n", + "Make sure that your files are not archived. The following command will print any FASTQ file that is archived. Unarchive the files and then come back to processing the sample." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "for sample, row in samples.iterrows():\n", + " print(sample)\n", + " fastqs = np.ravel(list(row['FASTQs'].values()))\n", + " dirnames = set([os.path.dirname(x) for x in fastqs])\n", + " \n", + " for dirname in dirnames:\n", + " file = dirname.replace('s3://', '')\n", + " \n", + " bucket = file.split('/')[0]\n", + " pre = file.replace(f'{bucket}/', '')\n", + " \n", + " !aws s3api list-objects-v2 --bucket $bucket --prefix $pre --query \"Contents[?StorageClass!='STANDARD'].Key\" --output text " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "IMPORTANT NOTE \n", + "\n", + "For CellRanger you need to supply an HTTPS path. So if you are using a custom genome stored on AWS, you must make the reference public ! Be sure to manually change the \"reference\" argument if it has not been updated correctly!!!!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "samples = update_ref(samples, prefix)\n", + "\n", + "if not samples['reference'].isna().any():\n", + " samples[\"reference\"].apply(lambda x: {\n", + " \"name\": re.match(r'.*refdata-cellranger-arc-(.*).tar.gz', x)[1],\n", + " \"location\": x,\n", + " }) \n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "samples['reference'] = [\n", + " {\n", + " 'name' : 'GRCz11_atac',\n", + " 'location' : \"https://dp-lab-data.s3.amazonaws.com/collaborators/whiter/YM-1704_transgene_reference/refdata-cellranger/GRCz11_atac.tar.gz\"\n", + " }] * len(samples)\n", + "samples['reference']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Generate inputs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Standard inputs, modify fields as need be\n", + "\n", + "# Load minimum inputs and labels fields from templates\n", + "with open(f\"{config_dir}/template.inputs.json\") as f:\n", + " std_inputs_fields = list(json.load(f).keys())\n", + " \n", + "# Annotate all samples with workflow inputs and labels\n", + "inputs = pd.DataFrame(index=samples.index, columns=std_inputs_fields,)\n", + "\n", + "# Annotate inputs\n", + "inputs[f\"{prefix}.sampleName\"] = samples.index\n", + "inputs[f\"{prefix}.fastqFiles\"] = samples[\"FASTQs\"].apply(lambda x: np.ravel(list(x.values())))\n", + "inputs[f\"{prefix}.fastqNames\"] = inputs[f\"{prefix}.fastqFiles\"].apply(lambda x: get_fastqs_name(x))\n", + "inputs[f\"{prefix}.referenceGenome\"] = samples[\"reference\"] \n", + "inputs[f\"{prefix}.dockerRegistry\"] = common_docker_registry\n", + "\n", + "inputs" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.12" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/notebooks/Run_SeqcAda_WIP.ipynb b/notebooks/Run_SeqcAda_WIP.ipynb index 0993f49..0a1891e 100644 --- a/notebooks/Run_SeqcAda_WIP.ipynb +++ b/notebooks/Run_SeqcAda_WIP.ipynb @@ -464,10 +464,54 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "env: AWS_ACCESS_KEY_ID=ASIAYPY66CWMIDDZ3PPV\n", + "env: AWS_SECRET_ACCESS_KEY=uhvOE6Kdnl/ThtSguHWeJjtbQW4rQzt1o+bIzeNM\n", + "env: AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEIH//////////wEaCXVzLWVhc3QtMSJHMEUCIEeCdu3sOyxjT3+hs8k2Ion/GZbxj94S8aDUlOBT1vGdAiEAu5gaGCZtCwZQEVdEbBiel2i6RKBx/sU5Lf3IBR1CEjkq7wEIehADGgw1ODM2NDM1Njc1MTIiDN6EiN42czmycbSfdirMAY7lrzMUFFrxPNsu/5mT5z0tpi+KEB9JYZIJa0tGg7ZDhlT/t07LpL/Er+45A4/m5g65jxzNRNHnoEUdQVh4A5xVSeWiorFYkJN3bjnplO3FZ0EzzMEaDqyqQakuOT0TBv9v/7zQ7MJMDayLKc83fOf4N7ISJCtn1IVQTO2eenBL+669Enp4kc7mNlwQ0HQaVrYFn9RCxdbtT18692pET+LjcfyKzAkcJK7pdaH8ZxOjMjUKE+UHCFjty2GmEDiKEAE7NnOsDdjJIoBMMzC6+uiUBjqYAX9ZfBDDdsPNSNTHOsGuY+0pXrT6xdLn+n5F5s/JFGfulywUfyefg6VArCxjlnYWN55U/kuimwcbdTivUqrF5gXoa4ZnnxY5IR7IldWIsmBSTMPt3yiWUvKDR/RE5w43dzH8J1483gDSKjbzdSsxxB7kdL+BbYmoS4GkvXAa/YX+QJWXXdvGuQNhYRGB1ur5+n+sQoRvpxz2\n" + ] + } + ], + "source": [ + "%env AWS_ACCESS_KEY_ID=ASIAYPY66CWMIDDZ3PPV\n", + "%env AWS_SECRET_ACCESS_KEY=uhvOE6Kdnl/ThtSguHWeJjtbQW4rQzt1o+bIzeNM\n", + "%env AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEIH//////////wEaCXVzLWVhc3QtMSJHMEUCIEeCdu3sOyxjT3+hs8k2Ion/GZbxj94S8aDUlOBT1vGdAiEAu5gaGCZtCwZQEVdEbBiel2i6RKBx/sU5Lf3IBR1CEjkq7wEIehADGgw1ODM2NDM1Njc1MTIiDN6EiN42czmycbSfdirMAY7lrzMUFFrxPNsu/5mT5z0tpi+KEB9JYZIJa0tGg7ZDhlT/t07LpL/Er+45A4/m5g65jxzNRNHnoEUdQVh4A5xVSeWiorFYkJN3bjnplO3FZ0EzzMEaDqyqQakuOT0TBv9v/7zQ7MJMDayLKc83fOf4N7ISJCtn1IVQTO2eenBL+669Enp4kc7mNlwQ0HQaVrYFn9RCxdbtT18692pET+LjcfyKzAkcJK7pdaH8ZxOjMjUKE+UHCFjty2GmEDiKEAE7NnOsDdjJIoBMMzC6+uiUBjqYAX9ZfBDDdsPNSNTHOsGuY+0pXrT6xdLn+n5F5s/JFGfulywUfyefg6VArCxjlnYWN55U/kuimwcbdTivUqrF5gXoa4ZnnxY5IR7IldWIsmBSTMPt3yiWUvKDR/RE5w43dzH8J1483gDSKjbzdSsxxB7kdL+BbYmoS4GkvXAa/YX+QJWXXdvGuQNhYRGB1ur5+n+sQoRvpxz2" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2021-10-07 15:31:32 agc-583643567512-us-east-1\n", + "2021-10-07 15:28:07 cdktoolkit-stagingbucket-d49u1xfb0sc4\n", + "2019-10-09 13:04:06 cf-templates-umiwbnq3566w-us-east-1\n", + "2019-10-10 12:46:54 dp-daily-reports\n", + "2017-09-26 10:15:15 dp-lab-data\n", + "2019-05-23 12:34:58 dp-lab-data-public\n", + "2018-03-01 13:29:07 dp-lab-glacier\n", + "2020-11-06 23:02:27 dp-lab-gwf-core\n", + "2021-07-15 18:14:01 dp-lab-gwf-core2\n", + "2017-09-26 10:17:18 dp-lab-home\n", + "2019-08-14 16:42:43 dp-lab-test\n", + "2019-04-25 12:35:35 elasticbeanstalk-us-east-1-583643567512\n", + "2019-12-13 15:53:57 scri-computational\n", + "2017-09-26 10:23:50 seqc-public\n" + ] + } + ], + "source": [ + "!aws s3 ls" + ] }, { "cell_type": "markdown", @@ -1526,6 +1570,37 @@ "cell_type": "code", "execution_count": 24, "metadata": {}, + "outputs": [], + "source": [ + "inputs_all = inputs.copy()\n", + "labels_all = labels.copy()" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['ARN-1167_M-4T1', 'ARN-1167_Normal', 'ARN-1167_PM-4T1']" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sample_names = inputs.index.tolist()\n", + "sample_names" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, "outputs": [ { "data": { @@ -1576,87 +1651,46 @@ " 20noor.sohail@gmail.com\n", " quay.io/hisplan\n", " \n", - " \n", - " ARN-1167_Normal\n", - " 0.2.11\n", - " ten_x_v3\n", - " s3://dp-lab-data/collaborators/aboir...\n", - " s3://seqc-public/barcodes/ten_x_v3/f...\n", - " [s3://dp-lab-data/collaborators/aboi...\n", - " [s3://dp-lab-data/collaborators/aboi...\n", - " scRNA-seq\n", - " ARN-1167_Normal\n", - " runRNGseed=0\n", - " 20noor.sohail@gmail.com\n", - " quay.io/hisplan\n", - " \n", - " \n", - " ARN-1167_PM-4T1\n", - " 0.2.11\n", - " ten_x_v3\n", - " s3://dp-lab-data/collaborators/aboir...\n", - " s3://seqc-public/barcodes/ten_x_v3/f...\n", - " [s3://dp-lab-data/collaborators/aboi...\n", - " [s3://dp-lab-data/collaborators/aboi...\n", - " scRNA-seq\n", - " ARN-1167_PM-4T1\n", - " runRNGseed=0\n", - " 20noor.sohail@gmail.com\n", - " quay.io/hisplan\n", - " \n", " \n", "\n", "" ], "text/plain": [ - " SeqcAda.version SeqcAda.assay \\\n", - "ARN-1167_M-4T1 0.2.11 ten_x_v3 \n", - "ARN-1167_Normal 0.2.11 ten_x_v3 \n", - "ARN-1167_PM-4T1 0.2.11 ten_x_v3 \n", + " SeqcAda.version SeqcAda.assay \\\n", + "ARN-1167_M-4T1 0.2.11 ten_x_v3 \n", "\n", - " SeqcAda.index \\\n", - "ARN-1167_M-4T1 s3://dp-lab-data/collaborators/aboir... \n", - "ARN-1167_Normal s3://dp-lab-data/collaborators/aboir... \n", - "ARN-1167_PM-4T1 s3://dp-lab-data/collaborators/aboir... \n", + " SeqcAda.index \\\n", + "ARN-1167_M-4T1 s3://dp-lab-data/collaborators/aboir... \n", "\n", - " SeqcAda.barcodeFiles \\\n", - "ARN-1167_M-4T1 s3://seqc-public/barcodes/ten_x_v3/f... \n", - "ARN-1167_Normal s3://seqc-public/barcodes/ten_x_v3/f... \n", - "ARN-1167_PM-4T1 s3://seqc-public/barcodes/ten_x_v3/f... \n", + " SeqcAda.barcodeFiles \\\n", + "ARN-1167_M-4T1 s3://seqc-public/barcodes/ten_x_v3/f... \n", "\n", - " SeqcAda.fastqBarcode \\\n", - "ARN-1167_M-4T1 [s3://dp-lab-data/collaborators/aboi... \n", - "ARN-1167_Normal [s3://dp-lab-data/collaborators/aboi... \n", - "ARN-1167_PM-4T1 [s3://dp-lab-data/collaborators/aboi... \n", + " SeqcAda.fastqBarcode \\\n", + "ARN-1167_M-4T1 [s3://dp-lab-data/collaborators/aboi... \n", "\n", - " SeqcAda.fastqGenomic SeqcAda.filterMode \\\n", - "ARN-1167_M-4T1 [s3://dp-lab-data/collaborators/aboi... scRNA-seq \n", - "ARN-1167_Normal [s3://dp-lab-data/collaborators/aboi... scRNA-seq \n", - "ARN-1167_PM-4T1 [s3://dp-lab-data/collaborators/aboi... scRNA-seq \n", + " SeqcAda.fastqGenomic SeqcAda.filterMode \\\n", + "ARN-1167_M-4T1 [s3://dp-lab-data/collaborators/aboi... scRNA-seq \n", "\n", - " SeqcAda.outputPrefix SeqcAda.starArguments \\\n", - "ARN-1167_M-4T1 ARN-1167_M-4T1 runRNGseed=0 \n", - "ARN-1167_Normal ARN-1167_Normal runRNGseed=0 \n", - "ARN-1167_PM-4T1 ARN-1167_PM-4T1 runRNGseed=0 \n", + " SeqcAda.outputPrefix SeqcAda.starArguments \\\n", + "ARN-1167_M-4T1 ARN-1167_M-4T1 runRNGseed=0 \n", "\n", - " SeqcAda.email SeqcAda.dockerRegistry \n", - "ARN-1167_M-4T1 20noor.sohail@gmail.com quay.io/hisplan \n", - "ARN-1167_Normal 20noor.sohail@gmail.com quay.io/hisplan \n", - "ARN-1167_PM-4T1 20noor.sohail@gmail.com quay.io/hisplan " + " SeqcAda.email SeqcAda.dockerRegistry \n", + "ARN-1167_M-4T1 20noor.sohail@gmail.com quay.io/hisplan " ] }, - "execution_count": 24, + "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ + "inputs = pd.DataFrame(inputs_all.loc[sample_names[0]]).T\n", "inputs" ] }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 27, "metadata": {}, "outputs": [ { @@ -1700,70 +1734,45 @@ " -\n", " sohailn\n", " \n", - " \n", - " ARN-1167_Normal\n", - " SeqcAda\n", - " Leptomeningeal metastasis heterogeneity\n", - " ARN-1167_Normal\n", - " sohailn\n", - " s3://dp-lab-data/collaborators/aboir...\n", - " -\n", - " sohailn\n", - " \n", - " \n", - " ARN-1167_PM-4T1\n", - " SeqcAda\n", - " Leptomeningeal metastasis heterogeneity\n", - " ARN-1167_PM-4T1\n", - " sohailn\n", - " s3://dp-lab-data/collaborators/aboir...\n", - " -\n", - " sohailn\n", - " \n", " \n", "\n", "" ], "text/plain": [ - " pipelineType project \\\n", - "ARN-1167_M-4T1 SeqcAda Leptomeningeal metastasis heterogeneity \n", - "ARN-1167_Normal SeqcAda Leptomeningeal metastasis heterogeneity \n", - "ARN-1167_PM-4T1 SeqcAda Leptomeningeal metastasis heterogeneity \n", + " pipelineType project \\\n", + "ARN-1167_M-4T1 SeqcAda Leptomeningeal metastasis heterogeneity \n", "\n", - " sample owner \\\n", - "ARN-1167_M-4T1 ARN-1167_M-4T1 sohailn \n", - "ARN-1167_Normal ARN-1167_Normal sohailn \n", - "ARN-1167_PM-4T1 ARN-1167_PM-4T1 sohailn \n", + " sample owner \\\n", + "ARN-1167_M-4T1 ARN-1167_M-4T1 sohailn \n", "\n", - " destination transfer comment \n", - "ARN-1167_M-4T1 s3://dp-lab-data/collaborators/aboir... - sohailn \n", - "ARN-1167_Normal s3://dp-lab-data/collaborators/aboir... - sohailn \n", - "ARN-1167_PM-4T1 s3://dp-lab-data/collaborators/aboir... - sohailn " + " destination transfer comment \n", + "ARN-1167_M-4T1 s3://dp-lab-data/collaborators/aboir... - sohailn " ] }, - "execution_count": 25, + "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ + "labels = pd.DataFrame(labels_all.loc[sample_names[0]]).T\n", "labels" ] }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "6bb353be8e5b4ac58269f7bc81977ab9", + "model_id": "919e1efd3ca045b1a50f15ecc4b5432e", "version_major": 2, "version_minor": 0 }, "text/plain": [ - " 0%| | 0/3 [00:00\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
S3_pathSample_ID
SV-1721_SV_LN11s3://dp-lab-data/collaborators/vardh...3947
SV-1721_SV_LN12s3://dp-lab-data/collaborators/vardh...3948
SV-1723_SV_LN1s3://dp-lab-data/collaborators/vardh...3949
SV-1723_SV_LN2s3://dp-lab-data/collaborators/vardh...3950
SV-1723_SV_LN3s3://dp-lab-data/collaborators/vardh...3951
\n", + "" + ], + "text/plain": [ + " S3_path Sample_ID\n", + "SV-1721_SV_LN11 s3://dp-lab-data/collaborators/vardh... 3947\n", + "SV-1721_SV_LN12 s3://dp-lab-data/collaborators/vardh... 3948\n", + "SV-1723_SV_LN1 s3://dp-lab-data/collaborators/vardh... 3949\n", + "SV-1723_SV_LN2 s3://dp-lab-data/collaborators/vardh... 3950\n", + "SV-1723_SV_LN3 s3://dp-lab-data/collaborators/vardh... 3951" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Common query col: id, request_id, Sample\n", + "sample_id = list(range(3947, 3952))\n", + "\n", + "samples = format_sample_aws(sample_id, 'id', creds)\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [], + "source": [ + "samples = samples.rename(columns={'S3_path': 'S3_Path'})\n", + "if prefix == 'Hashtag':\n", + " samples['S3_Path'] += '_HTO'" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
S3_PathSample_IDFASTQsWhitelist_ParamsBarcode_ParamsBarcodes
SV-1721_SV_LN11s3://dp-lab-data/collaborators/vardh...3947{'R1': ['s3://dp-lab-data/collaborat...{'uri': 's3://dp-lab-data/collaborat...{'cb': 16, 'umi': 28, 'conjugation':...[(GTCAACTCTTTAGCG, C0251, Pt19_Tumor...
SV-1721_SV_LN12s3://dp-lab-data/collaborators/vardh...3948{'R1': ['s3://dp-lab-data/collaborat...{'uri': 's3://dp-lab-data/collaborat...{'cb': 16, 'umi': 28, 'conjugation':...[(GTCAACTCTTTAGCG, C0251, Pt60_LN, 1...
SV-1723_SV_LN1s3://dp-lab-data/collaborators/vardh...3949{'R1': ['s3://dp-lab-data/collaborat...{'uri': 's3://dp-lab-data/collaborat...{'cb': 16, 'umi': 28, 'conjugation':...[(GTCAACTCTTTAGCG, C0251, Pt37_A, 10...
SV-1723_SV_LN2s3://dp-lab-data/collaborators/vardh...3950{'R1': ['s3://dp-lab-data/collaborat...{'uri': 's3://dp-lab-data/collaborat...{'cb': 16, 'umi': 28, 'conjugation':...[(GTCAACTCTTTAGCG, C0251, Pt33_B, 10...
SV-1723_SV_LN3s3://dp-lab-data/collaborators/vardh...3951{'R1': ['s3://dp-lab-data/collaborat...{'uri': 's3://dp-lab-data/collaborat...{'cb': 16, 'umi': 28, 'conjugation':...[(GTCAACTCTTTAGCG, C0251, Pt42_A, 10...
\n", + "
" + ], + "text/plain": [ + " S3_Path Sample_ID \\\n", + "SV-1721_SV_LN11 s3://dp-lab-data/collaborators/vardh... 3947 \n", + "SV-1721_SV_LN12 s3://dp-lab-data/collaborators/vardh... 3948 \n", + "SV-1723_SV_LN1 s3://dp-lab-data/collaborators/vardh... 3949 \n", + "SV-1723_SV_LN2 s3://dp-lab-data/collaborators/vardh... 3950 \n", + "SV-1723_SV_LN3 s3://dp-lab-data/collaborators/vardh... 3951 \n", + "\n", + " FASTQs \\\n", + "SV-1721_SV_LN11 {'R1': ['s3://dp-lab-data/collaborat... \n", + "SV-1721_SV_LN12 {'R1': ['s3://dp-lab-data/collaborat... \n", + "SV-1723_SV_LN1 {'R1': ['s3://dp-lab-data/collaborat... \n", + "SV-1723_SV_LN2 {'R1': ['s3://dp-lab-data/collaborat... \n", + "SV-1723_SV_LN3 {'R1': ['s3://dp-lab-data/collaborat... \n", + "\n", + " Whitelist_Params \\\n", + "SV-1721_SV_LN11 {'uri': 's3://dp-lab-data/collaborat... \n", + "SV-1721_SV_LN12 {'uri': 's3://dp-lab-data/collaborat... \n", + "SV-1723_SV_LN1 {'uri': 's3://dp-lab-data/collaborat... \n", + "SV-1723_SV_LN2 {'uri': 's3://dp-lab-data/collaborat... \n", + "SV-1723_SV_LN3 {'uri': 's3://dp-lab-data/collaborat... \n", + "\n", + " Barcode_Params \\\n", + "SV-1721_SV_LN11 {'cb': 16, 'umi': 28, 'conjugation':... \n", + "SV-1721_SV_LN12 {'cb': 16, 'umi': 28, 'conjugation':... \n", + "SV-1723_SV_LN1 {'cb': 16, 'umi': 28, 'conjugation':... \n", + "SV-1723_SV_LN2 {'cb': 16, 'umi': 28, 'conjugation':... \n", + "SV-1723_SV_LN3 {'cb': 16, 'umi': 28, 'conjugation':... \n", + "\n", + " Barcodes \n", + "SV-1721_SV_LN11 [(GTCAACTCTTTAGCG, C0251, Pt19_Tumor... \n", + "SV-1721_SV_LN12 [(GTCAACTCTTTAGCG, C0251, Pt60_LN, 1... \n", + "SV-1723_SV_LN1 [(GTCAACTCTTTAGCG, C0251, Pt37_A, 10... \n", + "SV-1723_SV_LN2 [(GTCAACTCTTTAGCG, C0251, Pt33_B, 10... \n", + "SV-1723_SV_LN3 [(GTCAACTCTTTAGCG, C0251, Pt42_A, 10... " + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# # Get information for all samples\n", + "# sample_paths = [s.strip('/') for s in sample_paths] # remove trailing slash if exists\n", + "# sample_names = [os.path.basename(s) for s in sample_paths]\n", + "# sample_names = [re.match(r'(.*)_.+$', s)[1] for s in sample_names] # remove library suffix (e.g. _CITE, _HTO, etc.)\n", + "# # TODO: assert basename is in peer_lab_db.sample_data.Sample\n", + "# # assert(all(check_sample_name(s) for s in sample_names))\n", + "# samples = pd.DataFrame(\n", + "# sample_paths,\n", + "# index=sample_names,\n", + "# columns=[\"S3_Path\"],\n", + "# dtype=str,\n", + "# )\n", "# Get FASTQ paths from S3\n", "# Note: Uses same FASTQ file ids for all samples\n", "fastq_file_ids = fastq_map[prefix]\n", "samples[\"FASTQs\"] = samples[\"S3_Path\"].apply(lambda x: get_fastqs(x, fastq_file_ids))\n", "\n", - "samples[\"Sample_ID\"] = pd.Series(samples.index).apply(\n", - " lambda x: get_sample_id(x, creds['user'], creds['password'])\n", - ").values\n", + "# samples[\"Sample_ID\"] = pd.Series(samples.index).apply(\n", + "# lambda x: get_sample_id(x, creds['user'], creds['password'])\n", + "# ).values\n", "samples[\"Whitelist_Params\"] = samples['Sample_ID'].apply(\n", " lambda x: get_wl_params(x, creds['user'], creds['password'])\n", ")\n", @@ -870,23 +1215,32 @@ ")\n", "samples[\"Barcodes\"] = samples['Sample_ID'].apply(\n", " lambda x: get_bcs(x, creds['user'], creds['password'])\n", - ")" + ")\n", + "\n", + "samples" ] }, { "cell_type": "code", - "execution_count": 64, + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "45fece038e5d4f05b3c125dfea249457", + "model_id": "fa6d1f8820a443d7b22bfecedb97f2e1", "version_major": 2, "version_minor": 0 }, "text/plain": [ - " 0%| | 0/1 [00:00\n", " \n", " \n", - " CiteSeq.uriFastqR1\n", - " CiteSeq.uriFastqR2\n", - " CiteSeq.sampleName\n", - " CiteSeq.scRnaSeqPlatform\n", - " CiteSeq.lengthR1\n", - " CiteSeq.lengthR2\n", - " CiteSeq.cellBarcodeWhitelistUri\n", - " CiteSeq.cellBarcodeWhiteListMethod\n", - " CiteSeq.tagList\n", - " CiteSeq.cbStartPos\n", + " Hashtag.uriFastqR1\n", + " Hashtag.uriFastqR2\n", + " Hashtag.sampleName\n", + " Hashtag.scRnaSeqPlatform\n", + " Hashtag.lengthR1\n", + " Hashtag.lengthR2\n", + " Hashtag.cellBarcodeWhitelistUri\n", + " Hashtag.cellBarcodeWhiteListMethod\n", + " Hashtag.hashTagList\n", + " Hashtag.cbStartPos\n", " ...\n", - " CiteSeq.umiStartPos\n", - " CiteSeq.umiEndPos\n", - " CiteSeq.trimPos\n", - " CiteSeq.slidingWindowSearch\n", - " CiteSeq.translate10XBarcodes\n", - " CiteSeq.cbCollapsingDistance\n", - " CiteSeq.umiCollapsingDistance\n", - " CiteSeq.numExpectedCells\n", - " CiteSeq.resourceSpec\n", - " CiteSeq.dockerRegistry\n", + " Hashtag.umiEndPos\n", + " Hashtag.trimPos\n", + " Hashtag.slidingWindowSearch\n", + " Hashtag.translate10XBarcodes\n", + " Hashtag.cbCollapsingDistance\n", + " Hashtag.umiCollapsingDistance\n", + " Hashtag.numExpectedCells\n", + " Hashtag.minCount\n", + " Hashtag.resourceSpec\n", + " Hashtag.dockerRegistry\n", " \n", " \n", " \n", " \n", - " CI210127_CD45pos_citeseq\n", - " [s3://dp-lab-data/SCRI_Projects/HTAN...\n", - " [s3://dp-lab-data/SCRI_Projects/HTAN...\n", - " CI210127_CD45pos_citeseq\n", + " SV-1721_SV_LN11\n", + " [s3://dp-lab-data/collaborators/vard...\n", + " [s3://dp-lab-data/collaborators/vard...\n", + " SV-1721_SV_LN11\n", " 10x\n", " 28\n", - " 15\n", - " s3://dp-lab-data/SCRI_Projects/HTAN_...\n", - " SeqcDenseCountsMatrixCsv\n", - " s3://dp-lab-data/SCRI_Projects/HTAN_...\n", + " 25\n", + " s3://dp-lab-data/collaborators/vardh...\n", + " 10x\n", + " s3://dp-lab-data/collaborators/vardh...\n", " 1\n", " ...\n", - " 17\n", " 28\n", + " 10\n", + " False\n", + " False\n", + " 1\n", + " 1\n", " 0\n", + " 10\n", + " {'cpu': 32, 'memory': -1}\n", + " quay.io/hisplan\n", + " \n", + " \n", + " SV-1721_SV_LN12\n", + " [s3://dp-lab-data/collaborators/vard...\n", + " [s3://dp-lab-data/collaborators/vard...\n", + " SV-1721_SV_LN12\n", + " 10x\n", + " 28\n", + " 25\n", + " s3://dp-lab-data/collaborators/vardh...\n", + " 10x\n", + " s3://dp-lab-data/collaborators/vardh...\n", + " 1\n", + " ...\n", + " 28\n", + " 10\n", " False\n", " False\n", " 1\n", " 1\n", " 0\n", + " 10\n", " {'cpu': 32, 'memory': -1}\n", " quay.io/hisplan\n", " \n", - " \n", - "\n", - "

1 rows × 21 columns

\n", - "" - ], - "text/plain": [ - " CiteSeq.uriFastqR1 \\\n", - "CI210127_CD45pos_citeseq [s3://dp-lab-data/SCRI_Projects/HTAN... \n", - "\n", - " CiteSeq.uriFastqR2 \\\n", - "CI210127_CD45pos_citeseq [s3://dp-lab-data/SCRI_Projects/HTAN... \n", - "\n", - " CiteSeq.sampleName CiteSeq.scRnaSeqPlatform \\\n", - "CI210127_CD45pos_citeseq CI210127_CD45pos_citeseq 10x \n", - "\n", - " CiteSeq.lengthR1 CiteSeq.lengthR2 \\\n", - "CI210127_CD45pos_citeseq 28 15 \n", - "\n", - " CiteSeq.cellBarcodeWhitelistUri \\\n", - "CI210127_CD45pos_citeseq s3://dp-lab-data/SCRI_Projects/HTAN_... \n", - "\n", - " CiteSeq.cellBarcodeWhiteListMethod \\\n", - "CI210127_CD45pos_citeseq SeqcDenseCountsMatrixCsv \n", - "\n", - " CiteSeq.tagList \\\n", - "CI210127_CD45pos_citeseq s3://dp-lab-data/SCRI_Projects/HTAN_... \n", - "\n", - " CiteSeq.cbStartPos ... CiteSeq.umiStartPos \\\n", - "CI210127_CD45pos_citeseq 1 ... 17 \n", - "\n", - " CiteSeq.umiEndPos CiteSeq.trimPos \\\n", - "CI210127_CD45pos_citeseq 28 0 \n", - "\n", - " CiteSeq.slidingWindowSearch \\\n", - "CI210127_CD45pos_citeseq False \n", - "\n", - " CiteSeq.translate10XBarcodes \\\n", - "CI210127_CD45pos_citeseq False \n", - "\n", - " CiteSeq.cbCollapsingDistance \\\n", - "CI210127_CD45pos_citeseq 1 \n", - "\n", - " CiteSeq.umiCollapsingDistance \\\n", - "CI210127_CD45pos_citeseq 1 \n", - "\n", - " CiteSeq.numExpectedCells CiteSeq.resourceSpec \\\n", - "CI210127_CD45pos_citeseq 0 {'cpu': 32, 'memory': -1} \n", - "\n", - " CiteSeq.dockerRegistry \n", - "CI210127_CD45pos_citeseq quay.io/hisplan \n", - "\n", - "[1 rows x 21 columns]" - ] - }, - "execution_count": 68, - "metadata": {}, - "output_type": "execute_result" - } + " \n", + " SV-1723_SV_LN1\n", + " [s3://dp-lab-data/collaborators/vard...\n", + " [s3://dp-lab-data/collaborators/vard...\n", + " SV-1723_SV_LN1\n", + " 10x\n", + " 28\n", + " 25\n", + " s3://dp-lab-data/collaborators/vardh...\n", + " 10x\n", + " s3://dp-lab-data/collaborators/vardh...\n", + " 1\n", + " ...\n", + " 28\n", + " 10\n", + " False\n", + " False\n", + " 1\n", + " 1\n", + " 0\n", + " 10\n", + " {'cpu': 32, 'memory': -1}\n", + " quay.io/hisplan\n", + " \n", + " \n", + " SV-1723_SV_LN2\n", + " [s3://dp-lab-data/collaborators/vard...\n", + " [s3://dp-lab-data/collaborators/vard...\n", + " SV-1723_SV_LN2\n", + " 10x\n", + " 28\n", + " 25\n", + " s3://dp-lab-data/collaborators/vardh...\n", + " 10x\n", + " s3://dp-lab-data/collaborators/vardh...\n", + " 1\n", + " ...\n", + " 28\n", + " 10\n", + " False\n", + " False\n", + " 1\n", + " 1\n", + " 0\n", + " 10\n", + " {'cpu': 32, 'memory': -1}\n", + " quay.io/hisplan\n", + " \n", + " \n", + " SV-1723_SV_LN3\n", + " [s3://dp-lab-data/collaborators/vard...\n", + " [s3://dp-lab-data/collaborators/vard...\n", + " SV-1723_SV_LN3\n", + " 10x\n", + " 28\n", + " 25\n", + " s3://dp-lab-data/collaborators/vardh...\n", + " 10x\n", + " s3://dp-lab-data/collaborators/vardh...\n", + " 1\n", + " ...\n", + " 28\n", + " 10\n", + " False\n", + " False\n", + " 1\n", + " 1\n", + " 0\n", + " 10\n", + " {'cpu': 32, 'memory': -1}\n", + " quay.io/hisplan\n", + " \n", + " \n", + "\n", + "

5 rows × 22 columns

\n", + "" + ], + "text/plain": [ + " Hashtag.uriFastqR1 \\\n", + "SV-1721_SV_LN11 [s3://dp-lab-data/collaborators/vard... \n", + "SV-1721_SV_LN12 [s3://dp-lab-data/collaborators/vard... \n", + "SV-1723_SV_LN1 [s3://dp-lab-data/collaborators/vard... \n", + "SV-1723_SV_LN2 [s3://dp-lab-data/collaborators/vard... \n", + "SV-1723_SV_LN3 [s3://dp-lab-data/collaborators/vard... \n", + "\n", + " Hashtag.uriFastqR2 Hashtag.sampleName \\\n", + "SV-1721_SV_LN11 [s3://dp-lab-data/collaborators/vard... SV-1721_SV_LN11 \n", + "SV-1721_SV_LN12 [s3://dp-lab-data/collaborators/vard... SV-1721_SV_LN12 \n", + "SV-1723_SV_LN1 [s3://dp-lab-data/collaborators/vard... SV-1723_SV_LN1 \n", + "SV-1723_SV_LN2 [s3://dp-lab-data/collaborators/vard... SV-1723_SV_LN2 \n", + "SV-1723_SV_LN3 [s3://dp-lab-data/collaborators/vard... SV-1723_SV_LN3 \n", + "\n", + " Hashtag.scRnaSeqPlatform Hashtag.lengthR1 Hashtag.lengthR2 \\\n", + "SV-1721_SV_LN11 10x 28 25 \n", + "SV-1721_SV_LN12 10x 28 25 \n", + "SV-1723_SV_LN1 10x 28 25 \n", + "SV-1723_SV_LN2 10x 28 25 \n", + "SV-1723_SV_LN3 10x 28 25 \n", + "\n", + " Hashtag.cellBarcodeWhitelistUri \\\n", + "SV-1721_SV_LN11 s3://dp-lab-data/collaborators/vardh... \n", + "SV-1721_SV_LN12 s3://dp-lab-data/collaborators/vardh... \n", + "SV-1723_SV_LN1 s3://dp-lab-data/collaborators/vardh... \n", + "SV-1723_SV_LN2 s3://dp-lab-data/collaborators/vardh... \n", + "SV-1723_SV_LN3 s3://dp-lab-data/collaborators/vardh... \n", + "\n", + " Hashtag.cellBarcodeWhiteListMethod \\\n", + "SV-1721_SV_LN11 10x \n", + "SV-1721_SV_LN12 10x \n", + "SV-1723_SV_LN1 10x \n", + "SV-1723_SV_LN2 10x \n", + "SV-1723_SV_LN3 10x \n", + "\n", + " Hashtag.hashTagList Hashtag.cbStartPos \\\n", + "SV-1721_SV_LN11 s3://dp-lab-data/collaborators/vardh... 1 \n", + "SV-1721_SV_LN12 s3://dp-lab-data/collaborators/vardh... 1 \n", + "SV-1723_SV_LN1 s3://dp-lab-data/collaborators/vardh... 1 \n", + "SV-1723_SV_LN2 s3://dp-lab-data/collaborators/vardh... 1 \n", + "SV-1723_SV_LN3 s3://dp-lab-data/collaborators/vardh... 1 \n", + "\n", + " ... Hashtag.umiEndPos Hashtag.trimPos \\\n", + "SV-1721_SV_LN11 ... 28 10 \n", + "SV-1721_SV_LN12 ... 28 10 \n", + "SV-1723_SV_LN1 ... 28 10 \n", + "SV-1723_SV_LN2 ... 28 10 \n", + "SV-1723_SV_LN3 ... 28 10 \n", + "\n", + " Hashtag.slidingWindowSearch Hashtag.translate10XBarcodes \\\n", + "SV-1721_SV_LN11 False False \n", + "SV-1721_SV_LN12 False False \n", + "SV-1723_SV_LN1 False False \n", + "SV-1723_SV_LN2 False False \n", + "SV-1723_SV_LN3 False False \n", + "\n", + " Hashtag.cbCollapsingDistance Hashtag.umiCollapsingDistance \\\n", + "SV-1721_SV_LN11 1 1 \n", + "SV-1721_SV_LN12 1 1 \n", + "SV-1723_SV_LN1 1 1 \n", + "SV-1723_SV_LN2 1 1 \n", + "SV-1723_SV_LN3 1 1 \n", + "\n", + " Hashtag.numExpectedCells Hashtag.minCount \\\n", + "SV-1721_SV_LN11 0 10 \n", + "SV-1721_SV_LN12 0 10 \n", + "SV-1723_SV_LN1 0 10 \n", + "SV-1723_SV_LN2 0 10 \n", + "SV-1723_SV_LN3 0 10 \n", + "\n", + " Hashtag.resourceSpec Hashtag.dockerRegistry \n", + "SV-1721_SV_LN11 {'cpu': 32, 'memory': -1} quay.io/hisplan \n", + "SV-1721_SV_LN12 {'cpu': 32, 'memory': -1} quay.io/hisplan \n", + "SV-1723_SV_LN1 {'cpu': 32, 'memory': -1} quay.io/hisplan \n", + "SV-1723_SV_LN2 {'cpu': 32, 'memory': -1} quay.io/hisplan \n", + "SV-1723_SV_LN3 {'cpu': 32, 'memory': -1} quay.io/hisplan \n", + "\n", + "[5 rows x 22 columns]" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } ], "source": [ "inputs" @@ -1138,7 +1620,7 @@ }, { "cell_type": "code", - "execution_count": 67, + "execution_count": 41, "metadata": {}, "outputs": [ { @@ -1173,31 +1655,83 @@ " \n", " \n", " \n", - " CI210127_CD45pos_citeseq\n", - " CITE-seq\n", - " HTAN_CITEseq\n", - " CI210127_CD45pos_citeseq\n", - " moormana\n", - " s3://dp-lab-data/SCRI_Projects/HTAN_...\n", + " SV-1721_SV_LN11\n", + " Hashtag\n", + " Locally advanced gastric cancer\n", + " SV-1721_SV_LN11\n", + " sohailn\n", + " s3://dp-lab-data/collaborators/vardh...\n", + " -\n", + " sohailn\n", + " \n", + " \n", + " SV-1721_SV_LN12\n", + " Hashtag\n", + " Locally advanced gastric cancer\n", + " SV-1721_SV_LN12\n", + " sohailn\n", + " s3://dp-lab-data/collaborators/vardh...\n", " -\n", - " moormana\n", + " sohailn\n", + " \n", + " \n", + " SV-1723_SV_LN1\n", + " Hashtag\n", + " single cell immune profiling of PBMC...\n", + " SV-1723_SV_LN1\n", + " sohailn\n", + " s3://dp-lab-data/collaborators/vardh...\n", + " -\n", + " sohailn\n", + " \n", + " \n", + " SV-1723_SV_LN2\n", + " Hashtag\n", + " single cell immune profiling of PBMC...\n", + " SV-1723_SV_LN2\n", + " sohailn\n", + " s3://dp-lab-data/collaborators/vardh...\n", + " -\n", + " sohailn\n", + " \n", + " \n", + " SV-1723_SV_LN3\n", + " Hashtag\n", + " single cell immune profiling of PBMC...\n", + " SV-1723_SV_LN3\n", + " sohailn\n", + " s3://dp-lab-data/collaborators/vardh...\n", + " -\n", + " sohailn\n", " \n", " \n", "\n", "" ], "text/plain": [ - " pipelineType project sample \\\n", - "CI210127_CD45pos_citeseq CITE-seq HTAN_CITEseq CI210127_CD45pos_citeseq \n", + " pipelineType project \\\n", + "SV-1721_SV_LN11 Hashtag Locally advanced gastric cancer \n", + "SV-1721_SV_LN12 Hashtag Locally advanced gastric cancer \n", + "SV-1723_SV_LN1 Hashtag single cell immune profiling of PBMC... \n", + "SV-1723_SV_LN2 Hashtag single cell immune profiling of PBMC... \n", + "SV-1723_SV_LN3 Hashtag single cell immune profiling of PBMC... \n", "\n", - " owner destination \\\n", - "CI210127_CD45pos_citeseq moormana s3://dp-lab-data/SCRI_Projects/HTAN_... \n", + " sample owner \\\n", + "SV-1721_SV_LN11 SV-1721_SV_LN11 sohailn \n", + "SV-1721_SV_LN12 SV-1721_SV_LN12 sohailn \n", + "SV-1723_SV_LN1 SV-1723_SV_LN1 sohailn \n", + "SV-1723_SV_LN2 SV-1723_SV_LN2 sohailn \n", + "SV-1723_SV_LN3 SV-1723_SV_LN3 sohailn \n", "\n", - " transfer comment \n", - "CI210127_CD45pos_citeseq - moormana " + " destination transfer comment \n", + "SV-1721_SV_LN11 s3://dp-lab-data/collaborators/vardh... - sohailn \n", + "SV-1721_SV_LN12 s3://dp-lab-data/collaborators/vardh... - sohailn \n", + "SV-1723_SV_LN1 s3://dp-lab-data/collaborators/vardh... - sohailn \n", + "SV-1723_SV_LN2 s3://dp-lab-data/collaborators/vardh... - sohailn \n", + "SV-1723_SV_LN3 s3://dp-lab-data/collaborators/vardh... - sohailn " ] }, - "execution_count": 67, + "execution_count": 41, "metadata": {}, "output_type": "execute_result" } @@ -1208,7 +1742,45 @@ }, { "cell_type": "code", - "execution_count": 69, + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['s3://dp-lab-data/collaborators/vardhans/LocallyAdvancedGastricCancer/SV-1721_SV_LN11_HTO/Hashtag-results',\n", + " 's3://dp-lab-data/collaborators/vardhans/LocallyAdvancedGastricCancer/SV-1721_SV_LN12_HTO/Hashtag-results',\n", + " 's3://dp-lab-data/collaborators/vardhans/scImmuneProfilingPbmcsNAcTreatedCovidPts/SV-1723_SV_LN1_HTO/Hashtag-results',\n", + " 's3://dp-lab-data/collaborators/vardhans/scImmuneProfilingPbmcsNAcTreatedCovidPts/SV-1723_SV_LN2_HTO/Hashtag-results',\n", + " 's3://dp-lab-data/collaborators/vardhans/scImmuneProfilingPbmcsNAcTreatedCovidPts/SV-1723_SV_LN3_HTO/Hashtag-results']" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "labels['destination'].tolist()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 58, "metadata": { "tags": [] }, @@ -1216,12 +1788,12 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "559a5c48486540ad9aa62559bd608099", + "model_id": "c623c42539d348d5a97720b9a4d7315f", "version_major": 2, "version_minor": 0 }, "text/plain": [ - " 0%| | 0/1 [00:00\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
S3_pathSample_ID
SV-1721_SV_LN11s3://dp-lab-data/collaborators/vardh...3947
SV-1721_SV_LN12s3://dp-lab-data/collaborators/vardh...3948
SV-1723_SV_LN1s3://dp-lab-data/collaborators/vardh...3949
SV-1723_SV_LN2s3://dp-lab-data/collaborators/vardh...3950
SV-1723_SV_LN3s3://dp-lab-data/collaborators/vardh...3951
\n", + "" + ], + "text/plain": [ + " S3_path Sample_ID\n", + "SV-1721_SV_LN11 s3://dp-lab-data/collaborators/vardh... 3947\n", + "SV-1721_SV_LN12 s3://dp-lab-data/collaborators/vardh... 3948\n", + "SV-1723_SV_LN1 s3://dp-lab-data/collaborators/vardh... 3949\n", + "SV-1723_SV_LN2 s3://dp-lab-data/collaborators/vardh... 3950\n", + "SV-1723_SV_LN3 s3://dp-lab-data/collaborators/vardh... 3951" + ] + }, + "execution_count": 101, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Common query col: id, request_id, Sample\n", + "sample_id = list(range(3947, 3952))\n", + "\n", + "samples = format_sample_aws(sample_id, 'id', creds)\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": 102, "metadata": {}, "outputs": [], "source": [ - "# Get information for all samples\n", - "sample_paths = [s.strip('/') for s in sample_paths] # remove trailing slash if exists\n", - "sample_names = [os.path.basename(s) for s in sample_paths]\n", - "sample_names = [re.match(r'(.*)_.+$', s)[1] for s in sample_names] # remove library suffix (e.g. _CITE, _HTO, etc.)\n", - "# TODO: assert basename is in peer_lab_db.sample_data.Sample\n", - "# assert(all(check_sample_name(s) for s in sample_names))\n", - "samples = pd.DataFrame(\n", - " sample_paths,\n", - " index=sample_names,\n", - " columns=[\"S3_Path\"],\n", - " dtype=str,\n", - ")\n", - "samples[\"Sample_ID\"] = pd.Series(samples.index).apply(\n", - " lambda x: get_sample_id(x, creds['user'], creds['password'])\n", - ").values" + "samples = samples.rename(columns={'S3_path': 'S3_Path'})\n", + "samples['S3_Path'] += '_HTO'\n", + "# if prefix == 'Hashtag':\n", + "# samples['S3_Path'] += '_HTO'\n", + " \n", + "# elif prefix == 'CiteSEq':\n", + "# samples['S3_Path'] += '_CITE'" ] }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 103, "metadata": {}, "outputs": [ { @@ -1365,49 +2062,76 @@ " \n", " \n", " \n", - " BF-1402_SI\n", - " s3://dp-lab-data/collaborators/arude...\n", - " 3555\n", + " SV-1721_SV_LN11\n", + " s3://dp-lab-data/collaborators/vardh...\n", + " 3947\n", " \n", " \n", - " BF-1472_LI\n", - " s3://dp-lab-data/collaborators/arude...\n", - " 3571\n", - " \n", - " \n", - " BD-1495_1\n", - " s3://dp-lab-data/collaborators/arude...\n", - " 3557\n", + " SV-1721_SV_LN12\n", + " s3://dp-lab-data/collaborators/vardh...\n", + " 3948\n", " \n", " \n", "\n", "" ], "text/plain": [ - " S3_Path Sample_ID\n", - "BF-1402_SI s3://dp-lab-data/collaborators/arude... 3555\n", - "BF-1472_LI s3://dp-lab-data/collaborators/arude... 3571\n", - "BD-1495_1 s3://dp-lab-data/collaborators/arude... 3557" + " S3_Path Sample_ID\n", + "SV-1721_SV_LN11 s3://dp-lab-data/collaborators/vardh... 3947\n", + "SV-1721_SV_LN12 s3://dp-lab-data/collaborators/vardh... 3948" ] }, - "execution_count": 35, + "execution_count": 103, "metadata": {}, "output_type": "execute_result" } ], "source": [ + "samples = samples.loc[samples.index.str.startswith('SV-1721')]\n", + "# samples = samples.loc[samples.index.str.startswith('SV-1723')]\n", + "\n", "samples" ] }, { "cell_type": "code", - "execution_count": 103, + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [], + "source": [ + "# # Get information for all samples\n", + "# # sample_paths = [s.strip('/') for s in sample_paths] # remove trailing slash if exists\n", + "# # sample_names = [os.path.basename(s) for s in sample_paths]\n", + "# # sample_names = [re.match(r'(.*)_.+$', s)[1] for s in sample_names] # remove library suffix (e.g. _CITE, _HTO, etc.)\n", + "# # TODO: assert basename is in peer_lab_db.sample_data.Sample\n", + "# # assert(all(check_sample_name(s) for s in sample_names))\n", + "# samples = pd.DataFrame(\n", + "# sample_paths,\n", + "# index=sample_names,\n", + "# columns=[\"S3_Path\"],\n", + "# dtype=str,\n", + "# )\n", + "# samples[\"Sample_ID\"] = pd.Series(samples.index).apply(\n", + "# lambda x: get_sample_id(x, creds['user'], creds['password'])\n", + "# ).values" + ] + }, + { + "cell_type": "code", + "execution_count": 82, "metadata": {}, "outputs": [], "source": [ "# Read barcodes from file\n", "# Note: Must be subset to HTO or CITE barcodes before next step!\n", - "barcodes = get_bcs_manual(path_to_excel)\n", + "# barcodes = get_bcs_manual(path_to_excel)\n", "# barcodes = barcodes[\n", "# barcodes[\"Description\"].str.contains(\"SS1\") |\n", "# barcodes[\"Description\"].str.contains(\"SS2\")\n", @@ -1419,6 +2143,13 @@ "execution_count": 104, "metadata": {}, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "~/Downloads/SV-1721 CITEseq.xlsx\n" + ] + }, { "data": { "text/html": [ @@ -1450,35 +2181,35 @@ " \n", " 0\n", " GTCTTTGTCAGTGCA\n", - " A0006\n", + " C0006\n", " anti-human CD86\n", " 0\n", " \n", " \n", " 1\n", " GTTGTCCGACAATAC\n", - " A0007\n", + " C0007\n", " anti-human CD274 (B7-H1, PD-L1)\n", " 0\n", " \n", " \n", " 2\n", " TGATAGAAACAGACC\n", - " A0020\n", + " C0020\n", " anti-human CD270 (HVEM, TR2)\n", " 0\n", " \n", " \n", " 3\n", " ATCACATCGTTGCCA\n", - " A0023\n", + " C0023\n", " anti-human CD155 (PVR)\n", " 0\n", " \n", " \n", " 4\n", " AACCTTCCGTCTAAG\n", - " A0024\n", + " C0024\n", " anti-human CD112 (Nectin-2)\n", " 0\n", " \n", @@ -1490,60 +2221,60 @@ " ...\n", " \n", " \n", - " 165\n", - " AACTTCTGTGGTAGC\n", - " A0584\n", - " anti-human TCR V{LATIN CAPITAL LIGAT...\n", + " 132\n", + " GAGTCGAGAAATCAT\n", + " C0918\n", + " anti-human HLA-E\n", " 0\n", " \n", " \n", - " 166\n", - " CTTCCGATTCATTCA\n", - " A0139\n", - " anti-human TCR {LATIN CAPITAL LIGATU...\n", + " 133\n", + " TCCCACTTCCGCTTT\n", + " C0920\n", + " anti-human CD82\n", " 0\n", " \n", " \n", - " 167\n", - " AGCTGTAAGTTTCGG\n", - " A0166\n", - " anti-human CD66b\n", + " 134\n", + " CTACTTCCCTGTCAA\n", + " C0944\n", + " anti-human CD101 (BB27)\n", " 0\n", " \n", " \n", - " 168\n", - " AAGTGATGGTATCTG\n", - " A0583\n", - " anti-human TCR V{LATIN CAPITAL LIGAT...\n", + " 135\n", + " GCCGCATGAGAAACA\n", + " C1046\n", + " anti-human CD88 (C5aR)\n", " 0\n", " \n", " \n", - " 169\n", - " TCACCAGTACCTAGT\n", - " A0392\n", - " anti-human CD15 (SSEA-1)\n", + " 136\n", + " CTGATGAGATGTCAG\n", + " C1052\n", + " anti-human CD224\n", " 0\n", " \n", " \n", "\n", - "

170 rows × 4 columns

\n", + "

137 rows × 4 columns

\n", "" ], "text/plain": [ - " Barcode DNA_ID Description BP Shift\n", - "0 GTCTTTGTCAGTGCA A0006 anti-human CD86 0\n", - "1 GTTGTCCGACAATAC A0007 anti-human CD274 (B7-H1, PD-L1) 0\n", - "2 TGATAGAAACAGACC A0020 anti-human CD270 (HVEM, TR2) 0\n", - "3 ATCACATCGTTGCCA A0023 anti-human CD155 (PVR) 0\n", - "4 AACCTTCCGTCTAAG A0024 anti-human CD112 (Nectin-2) 0\n", - ".. ... ... ... ...\n", - "165 AACTTCTGTGGTAGC A0584 anti-human TCR V{LATIN CAPITAL LIGAT... 0\n", - "166 CTTCCGATTCATTCA A0139 anti-human TCR {LATIN CAPITAL LIGATU... 0\n", - "167 AGCTGTAAGTTTCGG A0166 anti-human CD66b 0\n", - "168 AAGTGATGGTATCTG A0583 anti-human TCR V{LATIN CAPITAL LIGAT... 0\n", - "169 TCACCAGTACCTAGT A0392 anti-human CD15 (SSEA-1) 0\n", + " Barcode DNA_ID Description BP Shift\n", + "0 GTCTTTGTCAGTGCA C0006 anti-human CD86 0\n", + "1 GTTGTCCGACAATAC C0007 anti-human CD274 (B7-H1, PD-L1) 0\n", + "2 TGATAGAAACAGACC C0020 anti-human CD270 (HVEM, TR2) 0\n", + "3 ATCACATCGTTGCCA C0023 anti-human CD155 (PVR) 0\n", + "4 AACCTTCCGTCTAAG C0024 anti-human CD112 (Nectin-2) 0\n", + ".. ... ... ... ...\n", + "132 GAGTCGAGAAATCAT C0918 anti-human HLA-E 0\n", + "133 TCCCACTTCCGCTTT C0920 anti-human CD82 0\n", + "134 CTACTTCCCTGTCAA C0944 anti-human CD101 (BB27) 0\n", + "135 GCCGCATGAGAAACA C1046 anti-human CD88 (C5aR) 0\n", + "136 CTGATGAGATGTCAG C1052 anti-human CD224 0\n", "\n", - "[170 rows x 4 columns]" + "[137 rows x 4 columns]" ] }, "execution_count": 104, @@ -1552,6 +2283,13 @@ } ], "source": [ + "barcodes = pd.read_excel(path_to_excel, header=None) \n", + "print(path_to_excel)\n", + "barcodes.columns = ['Description', 'Barcode', 'DNA_ID', 'description', 'citeseq']\n", + "replace = lambda x: x.encode('ascii', 'namereplace').decode().replace(\"\\\\N\", \"\")\n", + "barcodes[\"Description\"] = barcodes[\"Description\"].apply(replace)\n", + "barcodes[\"BP Shift\"] = 0\n", + "barcodes = barcodes[[\"Barcode\", \"DNA_ID\", \"Description\", \"BP Shift\"]]\n", "barcodes" ] }, @@ -1565,25 +2303,35 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "dd85b56be9894e31b2f4214b4f9058b6", + "model_id": "39230bb1a70941beb108a2e3ee0d331e", "version_major": 2, "version_minor": 0 }, "text/plain": [ - " 0%| | 0/1 [00:00\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
S3_PathSample_IDWhitelist_Params
SV-1721_SV_LN11s3://dp-lab-data/collaborators/vardh...3947{'uri': 's3://dp-lab-data/collaborat...
SV-1721_SV_LN12s3://dp-lab-data/collaborators/vardh...3948{'uri': 's3://dp-lab-data/collaborat...
\n", + "" + ], + "text/plain": [ + " S3_Path Sample_ID \\\n", + "SV-1721_SV_LN11 s3://dp-lab-data/collaborators/vardh... 3947 \n", + "SV-1721_SV_LN12 s3://dp-lab-data/collaborators/vardh... 3948 \n", + "\n", + " Whitelist_Params \n", + "SV-1721_SV_LN11 {'uri': 's3://dp-lab-data/collaborat... \n", + "SV-1721_SV_LN12 {'uri': 's3://dp-lab-data/collaborat... " + ] + }, + "execution_count": 106, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Note: Assumes GEX data is recorded in database\n", "samples[\"Whitelist_Params\"] = samples[\"Sample_ID\"].apply(\n", - " lambda x: get_wl_params(x, creds)\n", + " lambda x: get_wl_params(x, creds['user'], creds['password'])\n", ")\n", - "assert ~samples[\"Whitelist_Params\"].isna().any()" + "assert ~samples[\"Whitelist_Params\"].isna().any()\n", + "samples" ] }, { "cell_type": "code", "execution_count": 107, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
S3_PathSample_IDWhitelist_ParamsBC_Params
SV-1721_SV_LN11s3://dp-lab-data/collaborators/vardh...3947{'uri': 's3://dp-lab-data/collaborat...{'conjugation': 'C', 'bp_shift': 10,...
SV-1721_SV_LN12s3://dp-lab-data/collaborators/vardh...3948{'uri': 's3://dp-lab-data/collaborat...{'conjugation': 'C', 'bp_shift': 10,...
\n", + "
" + ], + "text/plain": [ + " S3_Path Sample_ID \\\n", + "SV-1721_SV_LN11 s3://dp-lab-data/collaborators/vardh... 3947 \n", + "SV-1721_SV_LN12 s3://dp-lab-data/collaborators/vardh... 3948 \n", + "\n", + " Whitelist_Params \\\n", + "SV-1721_SV_LN11 {'uri': 's3://dp-lab-data/collaborat... \n", + "SV-1721_SV_LN12 {'uri': 's3://dp-lab-data/collaborat... \n", + "\n", + " BC_Params \n", + "SV-1721_SV_LN11 {'conjugation': 'C', 'bp_shift': 10,... \n", + "SV-1721_SV_LN12 {'conjugation': 'C', 'bp_shift': 10,... " + ] + }, + "execution_count": 107, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Note: Adds same barcode parameters for all samples\n", "samples[\"BC_Params\"] = samples[\"Sample_ID\"].apply(\n", " lambda x: get_bc_params_manual(barcodes, prefix, platform, creds)\n", ")\n", - "assert ~samples[\"BC_Params\"].isna().any()" + "assert ~samples[\"BC_Params\"].isna().any()\n", + "samples" ] }, { "cell_type": "code", "execution_count": 108, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
S3_PathSample_IDWhitelist_ParamsBC_ParamsFASTQs
SV-1721_SV_LN11s3://dp-lab-data/collaborators/vardh...3947{'uri': 's3://dp-lab-data/collaborat...{'conjugation': 'C', 'bp_shift': 10,...{'R1': ['s3://dp-lab-data/collaborat...
SV-1721_SV_LN12s3://dp-lab-data/collaborators/vardh...3948{'uri': 's3://dp-lab-data/collaborat...{'conjugation': 'C', 'bp_shift': 10,...{'R1': ['s3://dp-lab-data/collaborat...
\n", + "
" + ], + "text/plain": [ + " S3_Path Sample_ID \\\n", + "SV-1721_SV_LN11 s3://dp-lab-data/collaborators/vardh... 3947 \n", + "SV-1721_SV_LN12 s3://dp-lab-data/collaborators/vardh... 3948 \n", + "\n", + " Whitelist_Params \\\n", + "SV-1721_SV_LN11 {'uri': 's3://dp-lab-data/collaborat... \n", + "SV-1721_SV_LN12 {'uri': 's3://dp-lab-data/collaborat... \n", + "\n", + " BC_Params \\\n", + "SV-1721_SV_LN11 {'conjugation': 'C', 'bp_shift': 10,... \n", + "SV-1721_SV_LN12 {'conjugation': 'C', 'bp_shift': 10,... \n", + "\n", + " FASTQs \n", + "SV-1721_SV_LN11 {'R1': ['s3://dp-lab-data/collaborat... \n", + "SV-1721_SV_LN12 {'R1': ['s3://dp-lab-data/collaborat... " + ] + }, + "execution_count": 108, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Get FASTQ paths from S3\n", "# Note: Uses same FASTQ file ids for all samples\n", "fastq_file_ids = fastq_map[prefix]\n", - "samples[\"FASTQs\"] = samples[\"S3_Path\"].apply(lambda x: get_fastqs(x, fastq_file_ids))" + "samples[\"FASTQs\"] = samples[\"S3_Path\"].apply(lambda x: get_fastqs(x, fastq_file_ids))\n", + "samples" ] }, { "cell_type": "code", "execution_count": 109, "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'R1': ['s3://dp-lab-data/collaborators/vardhans/LocallyAdvancedGastricCancer/SV-1721_SV_LN11_HTO/FASTQ/3947_SV-1721_SV_LN11_HTO_IGO_12437_AS_7_S25_L001_R1_001.fastq.gz',\n", + " 's3://dp-lab-data/collaborators/vardhans/LocallyAdvancedGastricCancer/SV-1721_SV_LN11_HTO/FASTQ/3947_SV-1721_SV_LN11_HTO_IGO_12437_AS_7_S25_L002_R1_001.fastq.gz',\n", + " 's3://dp-lab-data/collaborators/vardhans/LocallyAdvancedGastricCancer/SV-1721_SV_LN11_HTO/FASTQ/3947_SV-1721_SV_LN11_HTO_IGO_12437_AS_7_S25_L003_R1_001.fastq.gz',\n", + " 's3://dp-lab-data/collaborators/vardhans/LocallyAdvancedGastricCancer/SV-1721_SV_LN11_HTO/FASTQ/3947_SV-1721_SV_LN11_HTO_IGO_12437_AS_7_S25_L004_R1_001.fastq.gz'],\n", + " 'R2': ['s3://dp-lab-data/collaborators/vardhans/LocallyAdvancedGastricCancer/SV-1721_SV_LN11_HTO/FASTQ/3947_SV-1721_SV_LN11_HTO_IGO_12437_AS_7_S25_L001_R2_001.fastq.gz',\n", + " 's3://dp-lab-data/collaborators/vardhans/LocallyAdvancedGastricCancer/SV-1721_SV_LN11_HTO/FASTQ/3947_SV-1721_SV_LN11_HTO_IGO_12437_AS_7_S25_L002_R2_001.fastq.gz',\n", + " 's3://dp-lab-data/collaborators/vardhans/LocallyAdvancedGastricCancer/SV-1721_SV_LN11_HTO/FASTQ/3947_SV-1721_SV_LN11_HTO_IGO_12437_AS_7_S25_L003_R2_001.fastq.gz',\n", + " 's3://dp-lab-data/collaborators/vardhans/LocallyAdvancedGastricCancer/SV-1721_SV_LN11_HTO/FASTQ/3947_SV-1721_SV_LN11_HTO_IGO_12437_AS_7_S25_L004_R2_001.fastq.gz']}" + ] + }, + "execution_count": 109, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples.iloc[0]['FASTQs']" + ] + }, + { + "cell_type": "code", + "execution_count": 110, + "metadata": {}, "outputs": [], "source": [ "# Load minimum inputs and labels fields from templates\n", @@ -1647,7 +2620,7 @@ }, { "cell_type": "code", - "execution_count": 110, + "execution_count": 111, "metadata": {}, "outputs": [], "source": [ @@ -1706,7 +2679,7 @@ }, { "cell_type": "code", - "execution_count": 111, + "execution_count": 112, "metadata": {}, "outputs": [ { @@ -1755,21 +2728,45 @@ " \n", " \n", " \n", - " IM-1356_Ru553B_1\n", - " [s3://dp-lab-data/SCRI_Projects/HTAN...\n", - " [s3://dp-lab-data/SCRI_Projects/HTAN...\n", - " IM-1356_Ru553B_1\n", + " SV-1721_SV_LN11\n", + " [s3://dp-lab-data/collaborators/vard...\n", + " [s3://dp-lab-data/collaborators/vard...\n", + " SV-1721_SV_LN11\n", " 10x_v3\n", " 28\n", - " 15\n", - " s3://dp-lab-data/SCRI_Projects/HTAN_...\n", - " SeqcDenseCountsMatrixCsv\n", - " s3://dp-lab-data/SCRI_Projects/HTAN_...\n", + " 25\n", + " s3://dp-lab-data/collaborators/vardh...\n", + " 10x\n", + " s3://dp-lab-data/collaborators/vardh...\n", " 1\n", " ...\n", " 17\n", " 28\n", + " 10\n", + " False\n", + " False\n", + " 1\n", + " 1\n", " 0\n", + " {'cpu': 32, 'memory': -1}\n", + " quay.io/hisplan\n", + " \n", + " \n", + " SV-1721_SV_LN12\n", + " [s3://dp-lab-data/collaborators/vard...\n", + " [s3://dp-lab-data/collaborators/vard...\n", + " SV-1721_SV_LN12\n", + " 10x_v3\n", + " 28\n", + " 25\n", + " s3://dp-lab-data/collaborators/vardh...\n", + " 10x\n", + " s3://dp-lab-data/collaborators/vardh...\n", + " 1\n", + " ...\n", + " 17\n", + " 28\n", + " 10\n", " False\n", " False\n", " 1\n", @@ -1780,47 +2777,58 @@ " \n", " \n", "\n", - "

1 rows × 21 columns

\n", + "

2 rows × 21 columns

\n", "" ], "text/plain": [ - " CiteSeq.uriFastqR1 \\\n", - "IM-1356_Ru553B_1 [s3://dp-lab-data/SCRI_Projects/HTAN... \n", + " CiteSeq.uriFastqR1 \\\n", + "SV-1721_SV_LN11 [s3://dp-lab-data/collaborators/vard... \n", + "SV-1721_SV_LN12 [s3://dp-lab-data/collaborators/vard... \n", "\n", - " CiteSeq.uriFastqR2 CiteSeq.sampleName \\\n", - "IM-1356_Ru553B_1 [s3://dp-lab-data/SCRI_Projects/HTAN... IM-1356_Ru553B_1 \n", + " CiteSeq.uriFastqR2 CiteSeq.sampleName \\\n", + "SV-1721_SV_LN11 [s3://dp-lab-data/collaborators/vard... SV-1721_SV_LN11 \n", + "SV-1721_SV_LN12 [s3://dp-lab-data/collaborators/vard... SV-1721_SV_LN12 \n", "\n", - " CiteSeq.scRnaSeqPlatform CiteSeq.lengthR1 CiteSeq.lengthR2 \\\n", - "IM-1356_Ru553B_1 10x_v3 28 15 \n", + " CiteSeq.scRnaSeqPlatform CiteSeq.lengthR1 CiteSeq.lengthR2 \\\n", + "SV-1721_SV_LN11 10x_v3 28 25 \n", + "SV-1721_SV_LN12 10x_v3 28 25 \n", "\n", - " CiteSeq.cellBarcodeWhitelistUri \\\n", - "IM-1356_Ru553B_1 s3://dp-lab-data/SCRI_Projects/HTAN_... \n", + " CiteSeq.cellBarcodeWhitelistUri \\\n", + "SV-1721_SV_LN11 s3://dp-lab-data/collaborators/vardh... \n", + "SV-1721_SV_LN12 s3://dp-lab-data/collaborators/vardh... \n", "\n", - " CiteSeq.cellBarcodeWhiteListMethod \\\n", - "IM-1356_Ru553B_1 SeqcDenseCountsMatrixCsv \n", + " CiteSeq.cellBarcodeWhiteListMethod \\\n", + "SV-1721_SV_LN11 10x \n", + "SV-1721_SV_LN12 10x \n", "\n", - " CiteSeq.tagList CiteSeq.cbStartPos \\\n", - "IM-1356_Ru553B_1 s3://dp-lab-data/SCRI_Projects/HTAN_... 1 \n", + " CiteSeq.tagList CiteSeq.cbStartPos \\\n", + "SV-1721_SV_LN11 s3://dp-lab-data/collaborators/vardh... 1 \n", + "SV-1721_SV_LN12 s3://dp-lab-data/collaborators/vardh... 1 \n", "\n", - " ... CiteSeq.umiStartPos CiteSeq.umiEndPos \\\n", - "IM-1356_Ru553B_1 ... 17 28 \n", + " ... CiteSeq.umiStartPos CiteSeq.umiEndPos CiteSeq.trimPos \\\n", + "SV-1721_SV_LN11 ... 17 28 10 \n", + "SV-1721_SV_LN12 ... 17 28 10 \n", "\n", - " CiteSeq.trimPos CiteSeq.slidingWindowSearch \\\n", - "IM-1356_Ru553B_1 0 False \n", + " CiteSeq.slidingWindowSearch CiteSeq.translate10XBarcodes \\\n", + "SV-1721_SV_LN11 False False \n", + "SV-1721_SV_LN12 False False \n", "\n", - " CiteSeq.translate10XBarcodes CiteSeq.cbCollapsingDistance \\\n", - "IM-1356_Ru553B_1 False 1 \n", + " CiteSeq.cbCollapsingDistance CiteSeq.umiCollapsingDistance \\\n", + "SV-1721_SV_LN11 1 1 \n", + "SV-1721_SV_LN12 1 1 \n", "\n", - " CiteSeq.umiCollapsingDistance CiteSeq.numExpectedCells \\\n", - "IM-1356_Ru553B_1 1 0 \n", + " CiteSeq.numExpectedCells CiteSeq.resourceSpec \\\n", + "SV-1721_SV_LN11 0 {'cpu': 32, 'memory': -1} \n", + "SV-1721_SV_LN12 0 {'cpu': 32, 'memory': -1} \n", "\n", - " CiteSeq.resourceSpec CiteSeq.dockerRegistry \n", - "IM-1356_Ru553B_1 {'cpu': 32, 'memory': -1} quay.io/hisplan \n", + " CiteSeq.dockerRegistry \n", + "SV-1721_SV_LN11 quay.io/hisplan \n", + "SV-1721_SV_LN12 quay.io/hisplan \n", "\n", - "[1 rows x 21 columns]" + "[2 rows x 21 columns]" ] }, - "execution_count": 111, + "execution_count": 112, "metadata": {}, "output_type": "execute_result" } @@ -1831,7 +2839,7 @@ }, { "cell_type": "code", - "execution_count": 112, + "execution_count": 113, "metadata": {}, "outputs": [ { @@ -1866,28 +2874,44 @@ " \n", " \n", " \n", - " IM-1356_Ru553B_1\n", + " SV-1721_SV_LN11\n", + " CITE-seq\n", + " Locally advanced gastric cancer\n", + " SV-1721_SV_LN11\n", + " sohailn\n", + " s3://dp-lab-data/collaborators/vardh...\n", + " -\n", + " sohailn\n", + " \n", + " \n", + " SV-1721_SV_LN12\n", " CITE-seq\n", - " HTAN_CITEseq\n", - " IM-1356_Ru553B_1\n", - " moormana\n", - " s3://dp-lab-data/SCRI_Projects/HTAN_...\n", + " Locally advanced gastric cancer\n", + " SV-1721_SV_LN12\n", + " sohailn\n", + " s3://dp-lab-data/collaborators/vardh...\n", " -\n", - " moormana\n", + " sohailn\n", " \n", " \n", "\n", "" ], "text/plain": [ - " pipelineType project sample owner \\\n", - "IM-1356_Ru553B_1 CITE-seq HTAN_CITEseq IM-1356_Ru553B_1 moormana \n", + " pipelineType project \\\n", + "SV-1721_SV_LN11 CITE-seq Locally advanced gastric cancer \n", + "SV-1721_SV_LN12 CITE-seq Locally advanced gastric cancer \n", "\n", - " destination transfer comment \n", - "IM-1356_Ru553B_1 s3://dp-lab-data/SCRI_Projects/HTAN_... - moormana " + " sample owner \\\n", + "SV-1721_SV_LN11 SV-1721_SV_LN11 sohailn \n", + "SV-1721_SV_LN12 SV-1721_SV_LN12 sohailn \n", + "\n", + " destination transfer comment \n", + "SV-1721_SV_LN11 s3://dp-lab-data/collaborators/vardh... - sohailn \n", + "SV-1721_SV_LN12 s3://dp-lab-data/collaborators/vardh... - sohailn " ] }, - "execution_count": 112, + "execution_count": 113, "metadata": {}, "output_type": "execute_result" } @@ -1898,7 +2922,7 @@ }, { "cell_type": "code", - "execution_count": 113, + "execution_count": 115, "metadata": { "tags": [] }, @@ -1906,12 +2930,12 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "8ecadb35db68428887f127dc03248d55", + "model_id": "f2653ca7da3a4aa8b6d437310e123962", "version_major": 2, "version_minor": 0 }, "text/plain": [ - " 0%| | 0/1 [00:00\n", " \n", " \n", - " AT-1716_retrieval_day1_reward2\n", + " AT-1447_Ret_R1\n", " s3://dp-lab-data/collaborators/priya...\n", - " 3872\n", + " 3409\n", + " mouse\n", + " 10X_V3.1\n", + " Memory consolidation VR\n", + " s3://seqc-public/genomes/mm38_long_p...\n", + " \n", + " \n", + " AT-1447_Ret_R2\n", + " s3://dp-lab-data/collaborators/priya...\n", + " 3410\n", " mouse\n", " 10X_V3.1\n", " Memory consolidation VR\n", @@ -213,20 +229,23 @@ "" ], "text/plain": [ - " AWS_storage id \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 s3://dp-lab-data/collaborators/priya... 3872 \n", + " AWS_storage id species \\\n", + "Sample \n", + "AT-1447_Ret_R1 s3://dp-lab-data/collaborators/priya... 3409 mouse \n", + "AT-1447_Ret_R2 s3://dp-lab-data/collaborators/priya... 3410 mouse \n", "\n", - " species sc_tech project_id \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 mouse 10X_V3.1 Memory consolidation VR \n", + " sc_tech project_id \\\n", + "Sample \n", + "AT-1447_Ret_R1 10X_V3.1 Memory consolidation VR \n", + "AT-1447_Ret_R2 10X_V3.1 Memory consolidation VR \n", "\n", - " reference \n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 s3://seqc-public/genomes/mm38_long_p... " + " reference \n", + "Sample \n", + "AT-1447_Ret_R1 s3://seqc-public/genomes/mm38_long_p... \n", + "AT-1447_Ret_R2 s3://seqc-public/genomes/mm38_long_p... " ] }, - "execution_count": 9, + "execution_count": 47, "metadata": {}, "output_type": "execute_result" } @@ -234,27 +253,131 @@ "source": [ "# You can supply a list of IDs or request IDs\n", "\n", - "# request_ids = ['AT-1727', 'AT-1734', 'AT-1756']\n", - "# samples = sample_scridb_info(request_ids, 'request_id', creds)\n", + "request_ids = ['AT-1447']\n", + "samples = sample_scridb_info(request_ids, 'request_id', creds)\n", "\n", - "sample_ids = [3872]\n", - "samples = sample_scridb_info(sample_ids, 'id', creds)\n", + "# sample_ids = [3872]\n", + "# samples = sample_scridb_info(sample_ids, 'id', creds)\n", "\n", "samples" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 31, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
AWS_storageidspeciessc_techproject_idreference
Sample
AT-1447_Ret_R1s3://dp-lab-data/collaborators/priya...3409mouse10X_V3.1Memory consolidation VRs3://seqc-public/genomes/mm38_long_p...
\n", + "
" + ], + "text/plain": [ + " AWS_storage id species \\\n", + "Sample \n", + "AT-1447_Ret_R1 s3://dp-lab-data/collaborators/priya... 3409 mouse \n", + "\n", + " sc_tech project_id \\\n", + "Sample \n", + "AT-1447_Ret_R1 10X_V3.1 Memory consolidation VR \n", + "\n", + " reference \n", + "Sample \n", + "AT-1447_Ret_R1 s3://seqc-public/genomes/mm38_long_p... " + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples = samples.loc[samples.index == 'AT-1447_Ret_R1']\n", + "samples" + ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 32, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/9v/1lnyrkxd0yq8l2pgl002wh1s7c6fqv/T/ipykernel_96156/3820246244.py:11: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " samples.loc[sample, 'denseCountMatrix'] = get_denseCountMatrix(row['AWS_storage'])[0]\n", + "/var/folders/9v/1lnyrkxd0yq8l2pgl002wh1s7c6fqv/T/ipykernel_96156/3820246244.py:14: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " samples[\"Whitelist_Params\"] = wl_params\n", + "/var/folders/9v/1lnyrkxd0yq8l2pgl002wh1s7c6fqv/T/ipykernel_96156/3820246244.py:15: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " samples[\"Barcode_Params\"] = bc_params\n", + "/var/folders/9v/1lnyrkxd0yq8l2pgl002wh1s7c6fqv/T/ipykernel_96156/3820246244.py:16: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " samples[\"Barcodes\"] = bcs\n" + ] + }, { "data": { "text/html": [ @@ -303,53 +426,53 @@ " \n", " \n", " \n", - " AT-1716_retrieval_day1_reward2\n", + " AT-1447_Ret_R1\n", " s3://dp-lab-data/collaborators/priya...\n", - " 3872\n", + " 3409\n", " mouse\n", " 10X_V3.1\n", " Memory consolidation VR\n", " s3://seqc-public/genomes/mm38_long_p...\n", - " [s3://dp-lab-data/collaborators/priy...\n", + " s3://dp-lab-data/collaborators/priya...\n", " {'uri': 's3://dp-lab-data/collaborat...\n", " {'cb': 16, 'umi': 28, 'conjugation':...\n", - " [(ATGAGGAATTCCTGC, A0301, sample 2 m...\n", + " [(ATGAGGAATTCCTGC, A0301, m16, 0), (...\n", " \n", " \n", "\n", "" ], "text/plain": [ - " AWS_storage id \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 s3://dp-lab-data/collaborators/priya... 3872 \n", + " AWS_storage id species \\\n", + "Sample \n", + "AT-1447_Ret_R1 s3://dp-lab-data/collaborators/priya... 3409 mouse \n", "\n", - " species sc_tech project_id \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 mouse 10X_V3.1 Memory consolidation VR \n", + " sc_tech project_id \\\n", + "Sample \n", + "AT-1447_Ret_R1 10X_V3.1 Memory consolidation VR \n", "\n", - " reference \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 s3://seqc-public/genomes/mm38_long_p... \n", + " reference \\\n", + "Sample \n", + "AT-1447_Ret_R1 s3://seqc-public/genomes/mm38_long_p... \n", "\n", - " denseCountMatrix \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 [s3://dp-lab-data/collaborators/priy... \n", + " denseCountMatrix \\\n", + "Sample \n", + "AT-1447_Ret_R1 s3://dp-lab-data/collaborators/priya... \n", "\n", - " Whitelist_Params \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 {'uri': 's3://dp-lab-data/collaborat... \n", + " Whitelist_Params \\\n", + "Sample \n", + "AT-1447_Ret_R1 {'uri': 's3://dp-lab-data/collaborat... \n", "\n", - " Barcode_Params \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 {'cb': 16, 'umi': 28, 'conjugation':... \n", + " Barcode_Params \\\n", + "Sample \n", + "AT-1447_Ret_R1 {'cb': 16, 'umi': 28, 'conjugation':... \n", "\n", - " Barcodes \n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 [(ATGAGGAATTCCTGC, A0301, sample 2 m... " + " Barcodes \n", + "Sample \n", + "AT-1447_Ret_R1 [(ATGAGGAATTCCTGC, A0301, m16, 0), (... " ] }, - "execution_count": 10, + "execution_count": 32, "metadata": {}, "output_type": "execute_result" } @@ -365,7 +488,7 @@ " wl_params.append(get_wl_params(idx, creds, prefix, row['AWS_storage']))\n", " bc_params.append(get_bc_params(idx, creds))\n", " bcs.append(get_bcs(idx, creds))\n", - " samples.loc[sample, 'denseCountMatrix'] = get_denseCountMatrix(row['AWS_storage'])\n", + " samples.loc[sample, 'denseCountMatrix'] = get_denseCountMatrix(row['AWS_storage'])[0]\n", "\n", "\n", "samples[\"Whitelist_Params\"] = wl_params\n", @@ -392,16 +515,20 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "AT-1716_retrieval_day1_reward2\n", - " PRE AT-1716_retrieval_day1_reward2/\n", - " PRE AT-1716_retrieval_day1_reward2_CPL/\n", + "AT-1447_Ret_R1\n", + " PRE AT-1447_Ret_R1/\n", + " PRE AT-1447_Ret_R1_CPL/\n", + "\n", + "AT-1447_Ret_R2\n", + " PRE AT-1447_Ret_R2/\n", + " PRE AT-1447_Ret_R2_CPL/\n", "\n" ] } @@ -419,16 +546,17 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "['s3://dp-lab-data/collaborators/priya/MemConsolidationVr/AT-1716_retrieval_day1_reward2_CPL']" + "['s3://dp-lab-data/collaborators/priya/MemConsolidationVr/AT-1447_Ret_R1_CPL',\n", + " 's3://dp-lab-data/collaborators/priya/MemConsolidationVr/AT-1447_Ret_R2_CPL']" ] }, - "execution_count": 12, + "execution_count": 48, "metadata": {}, "output_type": "execute_result" } @@ -440,9 +568,21 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 34, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/9v/1lnyrkxd0yq8l2pgl002wh1s7c6fqv/T/ipykernel_96156/4168958876.py:1: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " samples[\"FASTQs\"] = samples[\"AWS_storage\"].apply(lambda x: get_fastqs(x, fastq_map[prefix], \"FASTQ\"))\n" + ] + }, { "data": { "text/html": [ @@ -493,17 +633,17 @@ " \n", " \n", " \n", - " AT-1716_retrieval_day1_reward2\n", + " AT-1447_Ret_R1\n", " s3://dp-lab-data/collaborators/priya...\n", - " 3872\n", + " 3409\n", " mouse\n", " 10X_V3.1\n", " Memory consolidation VR\n", " s3://seqc-public/genomes/mm38_long_p...\n", - " [s3://dp-lab-data/collaborators/priy...\n", + " s3://dp-lab-data/collaborators/priya...\n", " {'uri': 's3://dp-lab-data/collaborat...\n", " {'cb': 16, 'umi': 28, 'conjugation':...\n", - " [(ATGAGGAATTCCTGC, A0301, sample 2 m...\n", + " [(ATGAGGAATTCCTGC, A0301, m16, 0), (...\n", " {'R1': ['s3://dp-lab-data/collaborat...\n", " \n", " \n", @@ -511,40 +651,40 @@ "" ], "text/plain": [ - " AWS_storage id \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 s3://dp-lab-data/collaborators/priya... 3872 \n", + " AWS_storage id species \\\n", + "Sample \n", + "AT-1447_Ret_R1 s3://dp-lab-data/collaborators/priya... 3409 mouse \n", "\n", - " species sc_tech project_id \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 mouse 10X_V3.1 Memory consolidation VR \n", + " sc_tech project_id \\\n", + "Sample \n", + "AT-1447_Ret_R1 10X_V3.1 Memory consolidation VR \n", "\n", - " reference \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 s3://seqc-public/genomes/mm38_long_p... \n", + " reference \\\n", + "Sample \n", + "AT-1447_Ret_R1 s3://seqc-public/genomes/mm38_long_p... \n", "\n", - " denseCountMatrix \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 [s3://dp-lab-data/collaborators/priy... \n", + " denseCountMatrix \\\n", + "Sample \n", + "AT-1447_Ret_R1 s3://dp-lab-data/collaborators/priya... \n", "\n", - " Whitelist_Params \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 {'uri': 's3://dp-lab-data/collaborat... \n", + " Whitelist_Params \\\n", + "Sample \n", + "AT-1447_Ret_R1 {'uri': 's3://dp-lab-data/collaborat... \n", "\n", - " Barcode_Params \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 {'cb': 16, 'umi': 28, 'conjugation':... \n", + " Barcode_Params \\\n", + "Sample \n", + "AT-1447_Ret_R1 {'cb': 16, 'umi': 28, 'conjugation':... \n", "\n", - " Barcodes \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 [(ATGAGGAATTCCTGC, A0301, sample 2 m... \n", + " Barcodes \\\n", + "Sample \n", + "AT-1447_Ret_R1 [(ATGAGGAATTCCTGC, A0301, m16, 0), (... \n", "\n", - " FASTQs \n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 {'R1': ['s3://dp-lab-data/collaborat... " + " FASTQs \n", + "Sample \n", + "AT-1447_Ret_R1 {'R1': ['s3://dp-lab-data/collaborat... " ] }, - "execution_count": 13, + "execution_count": 34, "metadata": {}, "output_type": "execute_result" } @@ -572,14 +712,19 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 115, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "AT-1716_retrieval_day1_reward2\n" + "AT-1447_Ret_R1\n", + "collaborators/priya/MemConsolidationVr/AT-1447_Ret_R1_CPL/FASTQ/3409_AT-1447_Ret_R1_CPL_IGO_12437_Q_3_S32_L003_I1_001.fastq.gz\tcollaborators/priya/MemConsolidationVr/AT-1447_Ret_R1_CPL/FASTQ/3409_AT-1447_Ret_R1_CPL_IGO_12437_Q_3_S32_L003_I2_001.fastq.gz\tcollaborators/priya/MemConsolidationVr/AT-1447_Ret_R1_CPL/FASTQ/3409_AT-1447_Ret_R1_CPL_IGO_12437_Q_3_S32_L003_R1_001.fastq.gz\tcollaborators/priya/MemConsolidationVr/AT-1447_Ret_R1_CPL/FASTQ/3409_AT-1447_Ret_R1_CPL_IGO_12437_Q_3_S32_L003_R2_001.fastq.gz\tcollaborators/priya/MemConsolidationVr/AT-1447_Ret_R1_CPL/FASTQ/3409_AT-1447_Ret_R1_CPL_IGO_12437_Q_3_S32_L004_I1_001.fastq.gz\tcollaborators/priya/MemConsolidationVr/AT-1447_Ret_R1_CPL/FASTQ/3409_AT-1447_Ret_R1_CPL_IGO_12437_Q_3_S32_L004_I2_001.fastq.gz\tcollaborators/priya/MemConsolidationVr/AT-1447_Ret_R1_CPL/FASTQ/3409_AT-1447_Ret_R1_CPL_IGO_12437_Q_3_S32_L004_R1_001.fastq.gz\tcollaborators/priya/MemConsolidationVr/AT-1447_Ret_R1_CPL/FASTQ/3409_AT-1447_Ret_R1_CPL_IGO_12437_Q_3_S32_L004_R2_001.fastq.gz\n", + "\n", + "AT-1447_Ret_R2\n", + "collaborators/priya/MemConsolidationVr/AT-1447_Ret_R2_CPL/FASTQ/3410_AT-1447_Ret_R2_CPL_IGO_12437_Q_4_S33_L003_I1_001.fastq.gz\tcollaborators/priya/MemConsolidationVr/AT-1447_Ret_R2_CPL/FASTQ/3410_AT-1447_Ret_R2_CPL_IGO_12437_Q_4_S33_L003_I2_001.fastq.gz\tcollaborators/priya/MemConsolidationVr/AT-1447_Ret_R2_CPL/FASTQ/3410_AT-1447_Ret_R2_CPL_IGO_12437_Q_4_S33_L003_R1_001.fastq.gz\tcollaborators/priya/MemConsolidationVr/AT-1447_Ret_R2_CPL/FASTQ/3410_AT-1447_Ret_R2_CPL_IGO_12437_Q_4_S33_L003_R2_001.fastq.gz\tcollaborators/priya/MemConsolidationVr/AT-1447_Ret_R2_CPL/FASTQ/3410_AT-1447_Ret_R2_CPL_IGO_12437_Q_4_S33_L004_I1_001.fastq.gz\tcollaborators/priya/MemConsolidationVr/AT-1447_Ret_R2_CPL/FASTQ/3410_AT-1447_Ret_R2_CPL_IGO_12437_Q_4_S33_L004_I2_001.fastq.gz\tcollaborators/priya/MemConsolidationVr/AT-1447_Ret_R2_CPL/FASTQ/3410_AT-1447_Ret_R2_CPL_IGO_12437_Q_4_S33_L004_R1_001.fastq.gz\tcollaborators/priya/MemConsolidationVr/AT-1447_Ret_R2_CPL/FASTQ/3410_AT-1447_Ret_R2_CPL_IGO_12437_Q_4_S33_L004_R2_001.fastq.gz\n", + "\n" ] } ], @@ -595,7 +740,28 @@ " bucket = file.split('/')[0]\n", " pre = file.replace(f'{bucket}/', '')\n", " \n", - " !aws s3api list-objects-v2 --bucket $bucket --prefix $pre --query \"Contents[?StorageClass!='STANDARD'].Key\" --output text " + " !aws s3api list-objects-v2 --bucket $bucket --prefix $pre --query \"Contents[?StorageClass!='STANDARD'].Key\" --output text\n", + " print()" + ] + }, + { + "cell_type": "code", + "execution_count": 116, + "metadata": {}, + "outputs": [], + "source": [ + "for sample, row in samples.iterrows():\n", + " fastqs = row['FASTQs']\n", + " fastqs = list(np.ravel(list(fastqs.values())))\n", + " \n", + " for fastq in fastqs:\n", + " file = fastq.replace('s3://', '')\n", + " bucket = file.split('/')[0]\n", + " key = file.replace(f'{bucket}/', '')\n", + "\n", + " cmd = f'aws s3api restore-object --bucket {bucket} --key {key} --restore-request '\n", + " cmd += '\\'{\"Days\":25, \"GlacierJobParameters\":{\"Tier\":\"Standard\"}}\\''\n", + " os.system(cmd)" ] }, { @@ -614,13 +780,13 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "bbe001baf6b441a69314b161b51e6c35", + "model_id": "045b7fc884bc488f950b3464c6dfa532", "version_major": 2, "version_minor": 0 }, @@ -645,19 +811,39 @@ " \n", " # Save to CSV\n", " path_to_csv = f\"{barcodes_path}/{sample}_tag-list.csv\"\n", - " barcodes.to_csv(path_to_csv, header=False, index=False)\n", - " \n", - " # Upload tag-list to AWS\n", - " cmd = f\"aws s3 cp {path_to_csv} {row['AWS_storage']}/{output_dirname}/tag-list.csv\"\n", - " var = subprocess.run(shlex.split(cmd), universal_newlines=True, capture_output=True)" + " barcodes.to_csv(path_to_csv, header=False, index=False)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3f704017008c43019d3e995f06197c4d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/1 [00:00\n", " \n", " \n", - " AT-1716_retrieval_day1_reward2\n", + " AT-1447_Ret_R1\n", " [s3://dp-lab-data/collaborators/priy...\n", " [s3://dp-lab-data/collaborators/priy...\n", - " AT-1716_retrieval_day1_reward2\n", + " AT-1447_Ret_R1\n", " 10x_v3\n", " 28\n", " 15\n", @@ -797,7 +983,7 @@ " 1\n", " 0\n", " 10\n", - " [s3://dp-lab-data/collaborators/priy...\n", + " s3://dp-lab-data/collaborators/priya...\n", " {'cpu': 32, 'memory': -1}\n", " 1\n", " quay.io/hisplan\n", @@ -808,78 +994,62 @@ "" ], "text/plain": [ - " Hashtag.uriFastqR1 \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 [s3://dp-lab-data/collaborators/priy... \n", + " Hashtag.uriFastqR1 \\\n", + "Sample \n", + "AT-1447_Ret_R1 [s3://dp-lab-data/collaborators/priy... \n", "\n", - " Hashtag.uriFastqR2 \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 [s3://dp-lab-data/collaborators/priy... \n", + " Hashtag.uriFastqR2 Hashtag.sampleName \\\n", + "Sample \n", + "AT-1447_Ret_R1 [s3://dp-lab-data/collaborators/priy... AT-1447_Ret_R1 \n", "\n", - " Hashtag.sampleName \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 AT-1716_retrieval_day1_reward2 \n", + " Hashtag.scRnaSeqPlatform Hashtag.lengthR1 Hashtag.lengthR2 \\\n", + "Sample \n", + "AT-1447_Ret_R1 10x_v3 28 15 \n", "\n", - " Hashtag.scRnaSeqPlatform Hashtag.lengthR1 \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 10x_v3 28 \n", + " Hashtag.cellBarcodeWhitelistUri \\\n", + "Sample \n", + "AT-1447_Ret_R1 s3://dp-lab-data/collaborators/priya... \n", "\n", - " Hashtag.lengthR2 \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 15 \n", + " Hashtag.cellBarcodeWhiteListMethod \\\n", + "Sample \n", + "AT-1447_Ret_R1 SeqcDenseCountsMatrixCsv \n", "\n", - " Hashtag.cellBarcodeWhitelistUri \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 s3://dp-lab-data/collaborators/priya... \n", + " Hashtag.translate10XBarcodes \\\n", + "Sample \n", + "AT-1447_Ret_R1 True \n", "\n", - " Hashtag.cellBarcodeWhiteListMethod \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 SeqcDenseCountsMatrixCsv \n", + " Hashtag.hashTagList ... \\\n", + "Sample ... \n", + "AT-1447_Ret_R1 s3://dp-lab-data/collaborators/priya... ... \n", "\n", - " Hashtag.translate10XBarcodes \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 True \n", + " Hashtag.umiEndPos Hashtag.slidingWindowSearch \\\n", + "Sample \n", + "AT-1447_Ret_R1 28 False \n", "\n", - " Hashtag.hashTagList ... \\\n", - "Sample ... \n", - "AT-1716_retrieval_day1_reward2 s3://dp-lab-data/collaborators/priya... ... \n", + " Hashtag.cbCollapsingDistance Hashtag.umiCollapsingDistance \\\n", + "Sample \n", + "AT-1447_Ret_R1 1 1 \n", "\n", - " Hashtag.umiEndPos \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 28 \n", + " Hashtag.numExpectedCells Hashtag.minCount \\\n", + "Sample \n", + "AT-1447_Ret_R1 0 10 \n", "\n", - " Hashtag.slidingWindowSearch \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 False \n", + " Hashtag.denseCountMatrix \\\n", + "Sample \n", + "AT-1447_Ret_R1 s3://dp-lab-data/collaborators/priya... \n", "\n", - " Hashtag.cbCollapsingDistance \\\n", + " Hashtag.resourceSpec Hashtag.demuxMode \\\n", "Sample \n", - "AT-1716_retrieval_day1_reward2 1 \n", - "\n", - " Hashtag.umiCollapsingDistance \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 1 \n", + "AT-1447_Ret_R1 {'cpu': 32, 'memory': -1} 1 \n", "\n", - " Hashtag.numExpectedCells Hashtag.minCount \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 0 10 \n", - "\n", - " Hashtag.denseCountMatrix \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 [s3://dp-lab-data/collaborators/priy... \n", - "\n", - " Hashtag.resourceSpec Hashtag.demuxMode \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 {'cpu': 32, 'memory': -1} 1 \n", - "\n", - " Hashtag.dockerRegistry \n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 quay.io/hisplan \n", + " Hashtag.dockerRegistry \n", + "Sample \n", + "AT-1447_Ret_R1 quay.io/hisplan \n", "\n", "[1 rows x 23 columns]" ] }, - "execution_count": 25, + "execution_count": 37, "metadata": {}, "output_type": "execute_result" } @@ -950,6 +1120,33 @@ "outputs": [], "source": [] }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['s3://dp-lab-data/collaborators/priya/MemConsolidationVr/AT-1447_Ret_R1/seqc-results/3409_AT-1447_Ret_R1_IGO_12437_P_10_dense.csv']" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "list(inputs[f'{prefix}.denseCountMatrix'])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "markdown", "metadata": {}, @@ -959,7 +1156,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 49, "metadata": {}, "outputs": [ { @@ -1004,10 +1201,20 @@ " \n", " \n", " \n", - " AT-1716_retrieval_day1_reward2\n", + " AT-1447_Ret_R1\n", + " Hashtag\n", + " Memory consolidation VR\n", + " AT-1447_Ret_R1\n", + " sohailn\n", + " s3://dp-lab-data/collaborators/priya...\n", + " -\n", + " sohailn\n", + " \n", + " \n", + " AT-1447_Ret_R2\n", " Hashtag\n", " Memory consolidation VR\n", - " AT-1716_retrieval_day1_reward2\n", + " AT-1447_Ret_R2\n", " sohailn\n", " s3://dp-lab-data/collaborators/priya...\n", " -\n", @@ -1018,24 +1225,18 @@ "" ], "text/plain": [ - " pipelineType project \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 Hashtag Memory consolidation VR \n", - "\n", - " sample owner \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 AT-1716_retrieval_day1_reward2 sohailn \n", - "\n", - " destination \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 s3://dp-lab-data/collaborators/priya... \n", + " pipelineType project sample owner \\\n", + "Sample \n", + "AT-1447_Ret_R1 Hashtag Memory consolidation VR AT-1447_Ret_R1 sohailn \n", + "AT-1447_Ret_R2 Hashtag Memory consolidation VR AT-1447_Ret_R2 sohailn \n", "\n", - " transfer comment \n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 - sohailn " + " destination transfer comment \n", + "Sample \n", + "AT-1447_Ret_R1 s3://dp-lab-data/collaborators/priya... - sohailn \n", + "AT-1447_Ret_R2 s3://dp-lab-data/collaborators/priya... - sohailn " ] }, - "execution_count": 26, + "execution_count": 49, "metadata": {}, "output_type": "execute_result" } @@ -1083,7 +1284,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 40, "metadata": {}, "outputs": [ { @@ -1156,10 +1357,10 @@ " \n", " \n", " \n", - " AT-1716_retrieval_day1_reward2\n", + " AT-1447_Ret_R1\n", " [s3://dp-lab-data/collaborators/priy...\n", " [s3://dp-lab-data/collaborators/priy...\n", - " AT-1716_retrieval_day1_reward2\n", + " AT-1447_Ret_R1\n", " 10x_v3\n", " 28\n", " 15\n", @@ -1174,7 +1375,7 @@ " 1\n", " 0\n", " 10\n", - " [s3://dp-lab-data/collaborators/priy...\n", + " s3://dp-lab-data/collaborators/priya...\n", " {'cpu': 32, 'memory': -1}\n", " 1\n", " quay.io/hisplan\n", @@ -1185,78 +1386,62 @@ "" ], "text/plain": [ - " Hashtag.uriFastqR1 \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 [s3://dp-lab-data/collaborators/priy... \n", + " Hashtag.uriFastqR1 \\\n", + "Sample \n", + "AT-1447_Ret_R1 [s3://dp-lab-data/collaborators/priy... \n", "\n", - " Hashtag.uriFastqR2 \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 [s3://dp-lab-data/collaborators/priy... \n", + " Hashtag.uriFastqR2 Hashtag.sampleName \\\n", + "Sample \n", + "AT-1447_Ret_R1 [s3://dp-lab-data/collaborators/priy... AT-1447_Ret_R1 \n", "\n", - " Hashtag.sampleName \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 AT-1716_retrieval_day1_reward2 \n", + " Hashtag.scRnaSeqPlatform Hashtag.lengthR1 Hashtag.lengthR2 \\\n", + "Sample \n", + "AT-1447_Ret_R1 10x_v3 28 15 \n", "\n", - " Hashtag.scRnaSeqPlatform Hashtag.lengthR1 \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 10x_v3 28 \n", + " Hashtag.cellBarcodeWhitelistUri \\\n", + "Sample \n", + "AT-1447_Ret_R1 s3://dp-lab-data/collaborators/priya... \n", "\n", - " Hashtag.lengthR2 \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 15 \n", + " Hashtag.cellBarcodeWhiteListMethod \\\n", + "Sample \n", + "AT-1447_Ret_R1 SeqcDenseCountsMatrixCsv \n", "\n", - " Hashtag.cellBarcodeWhitelistUri \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 s3://dp-lab-data/collaborators/priya... \n", + " Hashtag.translate10XBarcodes \\\n", + "Sample \n", + "AT-1447_Ret_R1 True \n", "\n", - " Hashtag.cellBarcodeWhiteListMethod \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 SeqcDenseCountsMatrixCsv \n", + " Hashtag.hashTagList ... \\\n", + "Sample ... \n", + "AT-1447_Ret_R1 s3://dp-lab-data/collaborators/priya... ... \n", "\n", - " Hashtag.translate10XBarcodes \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 True \n", + " Hashtag.umiEndPos Hashtag.slidingWindowSearch \\\n", + "Sample \n", + "AT-1447_Ret_R1 28 False \n", "\n", - " Hashtag.hashTagList ... \\\n", - "Sample ... \n", - "AT-1716_retrieval_day1_reward2 s3://dp-lab-data/collaborators/priya... ... \n", + " Hashtag.cbCollapsingDistance Hashtag.umiCollapsingDistance \\\n", + "Sample \n", + "AT-1447_Ret_R1 1 1 \n", "\n", - " Hashtag.umiEndPos \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 28 \n", + " Hashtag.numExpectedCells Hashtag.minCount \\\n", + "Sample \n", + "AT-1447_Ret_R1 0 10 \n", "\n", - " Hashtag.slidingWindowSearch \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 False \n", + " Hashtag.denseCountMatrix \\\n", + "Sample \n", + "AT-1447_Ret_R1 s3://dp-lab-data/collaborators/priya... \n", "\n", - " Hashtag.cbCollapsingDistance \\\n", + " Hashtag.resourceSpec Hashtag.demuxMode \\\n", "Sample \n", - "AT-1716_retrieval_day1_reward2 1 \n", - "\n", - " Hashtag.umiCollapsingDistance \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 1 \n", - "\n", - " Hashtag.numExpectedCells Hashtag.minCount \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 0 10 \n", - "\n", - " Hashtag.denseCountMatrix \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 [s3://dp-lab-data/collaborators/priy... \n", - "\n", - " Hashtag.resourceSpec Hashtag.demuxMode \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 {'cpu': 32, 'memory': -1} 1 \n", + "AT-1447_Ret_R1 {'cpu': 32, 'memory': -1} 1 \n", "\n", - " Hashtag.dockerRegistry \n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 quay.io/hisplan \n", + " Hashtag.dockerRegistry \n", + "Sample \n", + "AT-1447_Ret_R1 quay.io/hisplan \n", "\n", "[1 rows x 23 columns]" ] }, - "execution_count": 27, + "execution_count": 40, "metadata": {}, "output_type": "execute_result" } @@ -1267,7 +1452,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 41, "metadata": {}, "outputs": [ { @@ -1312,10 +1497,10 @@ " \n", " \n", " \n", - " AT-1716_retrieval_day1_reward2\n", + " AT-1447_Ret_R1\n", " Hashtag\n", " Memory consolidation VR\n", - " AT-1716_retrieval_day1_reward2\n", + " AT-1447_Ret_R1\n", " sohailn\n", " s3://dp-lab-data/collaborators/priya...\n", " -\n", @@ -1326,24 +1511,16 @@ "" ], "text/plain": [ - " pipelineType project \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 Hashtag Memory consolidation VR \n", - "\n", - " sample owner \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 AT-1716_retrieval_day1_reward2 sohailn \n", - "\n", - " destination \\\n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 s3://dp-lab-data/collaborators/priya... \n", + " pipelineType project sample owner \\\n", + "Sample \n", + "AT-1447_Ret_R1 Hashtag Memory consolidation VR AT-1447_Ret_R1 sohailn \n", "\n", - " transfer comment \n", - "Sample \n", - "AT-1716_retrieval_day1_reward2 - sohailn " + " destination transfer comment \n", + "Sample \n", + "AT-1447_Ret_R1 s3://dp-lab-data/collaborators/priya... - sohailn " ] }, - "execution_count": 28, + "execution_count": 41, "metadata": {}, "output_type": "execute_result" } @@ -1361,13 +1538,13 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "c05a538993d14466bfb6fc22d25bbbfa", + "model_id": "28519fe475714697b8af5b257dac468d", "version_major": 2, "version_minor": 0 }, @@ -1386,7 +1563,7 @@ "assert (std_labels_fields == list(labels.columns)) & (labels.notna().values.all())\n", "\n", "stdouts = [] # to store all outputs\n", - "process = False\n", + "process = True\n", "\n", "with tqdm(inputs.index) as t:\n", "\n", @@ -1411,28 +1588,22 @@ " options = path_to_options,\n", " ))\n", " \n", - " time.sleep(20)" + " time.sleep(5)" ] }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 32, + "execution_count": 50, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "['s3://dp-lab-data/collaborators/priya/MemConsolidationVr/AT-1716_retrieval_day1_reward2_CPL/cellplex_results']" + "['s3://dp-lab-data/collaborators/priya/MemConsolidationVr/AT-1447_Ret_R1_CPL/cellplex_results',\n", + " 's3://dp-lab-data/collaborators/priya/MemConsolidationVr/AT-1447_Ret_R2_CPL/cellplex_results']" ] }, - "execution_count": 32, + "execution_count": 50, "metadata": {}, "output_type": "execute_result" } @@ -1440,6 +1611,96 @@ "source": [ "labels['destination'].values.tolist()" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Get the final output" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "download: s3://dp-lab-data/collaborators/priya/MemConsolidationVr/AT-1447_Ret_R1_CPL/cellplex_results/counts/run_report.yaml to web_summary/run_report.yaml\n" + ] + } + ], + "source": [ + "for sample, row in labels.iterrows():\n", + " destination = row['destination']\n", + " yaml = f'{destination}/counts/run_report.yaml'\n", + " yaml_out = f'web_summary/run_report.yaml'\n", + " file_out = f'web_summary/{sample}.run_report.yaml'\n", + " \n", + " !aws s3 cp $yaml $yaml_out\n", + " !expand $yaml_out > $file_out" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "AT-1447_Ret_R1\n", + "CITE-seq-Count Version: 1.4.3\n", + "Correction:\n", + " Cell barcodes collapsing threshold: 1\n", + " Cell barcodes corrected: 209632\n", + " UMI collapsing threshold: 1\n", + " UMIs corrected: 269339\n", + "Date: 2022-11-04\n", + "Percentage mapped: 98\n", + "Percentage unmapped: 2\n", + "Reads processed: 99797110\n", + "Running time: 2.0 hours, 10.0 minutes, 33.55 seconds\n", + "Uncorrected cells: 0\n", + "\n", + "\n" + ] + } + ], + "source": [ + "import yaml\n", + "\n", + "for sample, row in labels.iterrows():\n", + " file_out = f'web_summary/{sample}.run_report.yaml'\n", + " \n", + " with open(file_out, 'r') as stream:\n", + " try:\n", + " parsed_yaml = yaml.safe_load(stream)\n", + " except yaml.YAMLError as exc:\n", + " print(exc)\n", + " \n", + " print(sample)\n", + " del parsed_yaml['Run parameters']\n", + " print(yaml.dump(parsed_yaml, default_flow_style=False))\n", + " print()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/notebooks/Run_Sharp_Hashtag.ipynb b/notebooks/Run_Sharp_Hashtag.ipynb new file mode 100644 index 0000000..3c6fad7 --- /dev/null +++ b/notebooks/Run_Sharp_Hashtag.ipynb @@ -0,0 +1,1655 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import re, subprocess, boto3, json, shlex, mysql, os, urllib, logging\n", + "import pandas as pd\n", + "import numpy as np\n", + "from s3path import S3Path\n", + "from pathlib import Path\n", + "from tqdm.notebook import tqdm\n", + "from packaging import version\n", + "\n", + "import glob\n", + "import os\n", + "\n", + "pd.set_option(\"display.max_colwidth\", 40)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "from utils.utils import *" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# AWS setup" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "env: AWS_ACCESS_KEY_ID=ASIAYPY66CWMCCBMO5FL\n", + "env: AWS_SECRET_ACCESS_KEY=DG9oLl+A09X6+uLmnXevErupT/HEQad4zG/y5TTR\n", + "env: AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjECIaCXVzLWVhc3QtMSJIMEYCIQCpTwuT8/TR5SFwS2ZpI9wHgMePNQiGB9baiXqhz2SAbwIhAKmdXEC38Ab1PXRjmANETp0MZtr5FEAuzMK0OZ9ae/+8KvgBCNv//////////wEQBBoMNTgzNjQzNTY3NTEyIgw5HxnmXcMH0+MIrwQqzAGiga/yHEbRDYb135G/x96XUChjUvHSZHTH9jmq5M4inysP5wrGBk+8UWrGb7ruczmRHJOB9dIfpKeGo639AGiYHpycHW6w8S4+4wCVEzXId2j+lt887h31Qp6qoJoLwTKA3FhWL6moZmR7vdIApGoWmqG9HaaP+J1RPqM2eTFsqM2yefMQC/xPLzNxVQVIjqMG633ZYaETSLxmtOobSdHJpq/6KKhSmpNxZXyC2v8MRPmmbwr1RtoJHFAxBvjspxjITTTi2GTvqJNJcj4w9+XCoAY6lwEEdKTD9DinLSSszZ2XW9H0Yhk8ygREAdVYIErlav1UR+SV7MzA1jWAby2mlEx7xWLj7XjQYC3hYWCdo5f+5do633bae9UIOAoYrjxxOyOnS6+/Tc89lJEBETX9qMLtQ7p5zQqT3XQa6eEduIVFa5SS3dSOMNORPtf4HkNxuBvcfFRP5viWvQi8ISHlY0QyhtKC3ROcEcSJ\n", + "2021-10-07 15:31:32 agc-583643567512-us-east-1\n", + "2021-10-07 15:28:07 cdktoolkit-stagingbucket-d49u1xfb0sc4\n", + "2019-10-09 13:04:06 cf-templates-umiwbnq3566w-us-east-1\n", + "2019-10-10 12:46:54 dp-daily-reports\n", + "2017-09-26 10:15:15 dp-lab-data\n", + "2019-05-23 12:34:58 dp-lab-data-public\n", + "2018-03-01 13:29:07 dp-lab-glacier\n", + "2020-11-06 23:02:27 dp-lab-gwf-core\n", + "2021-07-15 18:14:01 dp-lab-gwf-core2\n", + "2017-09-26 10:17:18 dp-lab-home\n", + "2019-08-14 16:42:43 dp-lab-test\n", + "2019-04-25 12:35:35 elasticbeanstalk-us-east-1-583643567512\n", + "2019-12-13 15:53:57 scri-computational\n", + "2017-09-26 10:23:50 seqc-public\n" + ] + } + ], + "source": [ + "%env AWS_ACCESS_KEY_ID=ASIAYPY66CWMCCBMO5FL\n", + "%env AWS_SECRET_ACCESS_KEY=DG9oLl+A09X6+uLmnXevErupT/HEQad4zG/y5TTR\n", + "%env AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjECIaCXVzLWVhc3QtMSJIMEYCIQCpTwuT8/TR5SFwS2ZpI9wHgMePNQiGB9baiXqhz2SAbwIhAKmdXEC38Ab1PXRjmANETp0MZtr5FEAuzMK0OZ9ae/+8KvgBCNv//////////wEQBBoMNTgzNjQzNTY3NTEyIgw5HxnmXcMH0+MIrwQqzAGiga/yHEbRDYb135G/x96XUChjUvHSZHTH9jmq5M4inysP5wrGBk+8UWrGb7ruczmRHJOB9dIfpKeGo639AGiYHpycHW6w8S4+4wCVEzXId2j+lt887h31Qp6qoJoLwTKA3FhWL6moZmR7vdIApGoWmqG9HaaP+J1RPqM2eTFsqM2yefMQC/xPLzNxVQVIjqMG633ZYaETSLxmtOobSdHJpq/6KKhSmpNxZXyC2v8MRPmmbwr1RtoJHFAxBvjspxjITTTi2GTvqJNJcj4w9+XCoAY6lwEEdKTD9DinLSSszZ2XW9H0Yhk8ygREAdVYIErlav1UR+SV7MzA1jWAby2mlEx7xWLj7XjQYC3hYWCdo5f+5do633bae9UIOAoYrjxxOyOnS6+/Tc89lJEBETX9qMLtQ7p5zQqT3XQa6eEduIVFa5SS3dSOMNORPtf4HkNxuBvcfFRP5viWvQi8ISHlY0QyhtKC3ROcEcSJ\n", + "\n", + "!aws s3 ls" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "# Setup" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# Which pipeline are you running\n", + "prefix = \"Hashtag\" # Workflow to run; also .wdl filename prefix\n", + "output_dirname = \"Hashtag-results\"\n", + "\n", + "workflow_dir = glob.glob(f\"{Path.home()}/scing/bin/sharp*\")[0]\n", + "path_to_exec = f\"{workflow_dir}/submit.sh\" # CHANGE THIS FOR SHARP\n", + "\n", + "# Locations of workflow-related directories and files\n", + "path_to_cromwell_secrets = f\"{Path.home()}/.cromwell/cromwell-secrets.json\"\n", + "db_credentials_path = f\"{Path.home()}/.config.json\"" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# Location of docker files\n", + "common_docker_registry = \"quay.io/hisplan\"\n", + "pipeline_type = prefix # field in *.labels.json\n", + "comment = \"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "# Workflow file paths\n", + "config_dir = f\"{workflow_dir}/configs\"\n", + "path_to_options = f\"{workflow_dir}/Sharp.options.aws.json\"" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "# Set credentials based on SCRIdb CLI config file\n", + "with open(db_credentials_path) as f:\n", + " creds = json.load(f)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Sample information" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
AWS_storageidspeciessc_techproject_idreference
Sample
AE-2116_mDA_neurons_DOGMA-seq_multiomes3://dp-lab-data/collaborators/strud...4531humanmultiomeDOGMAseq sample plusGRCh38
AE-2116_mDA_neurons_DOGMA-seq_multiome_mATACs3://dp-lab-data/collaborators/strud...4532humanmultiomeDOGMAseq sample plusGRCh38
\n", + "
" + ], + "text/plain": [ + " AWS_storage \\\n", + "Sample \n", + "AE-2116_mDA_neurons_DOGMA-seq_multiome s3://dp-lab-data/collaborators/strud... \n", + "AE-2116_mDA_neurons_DOGMA-seq_multiom... s3://dp-lab-data/collaborators/strud... \n", + "\n", + " id species sc_tech \\\n", + "Sample \n", + "AE-2116_mDA_neurons_DOGMA-seq_multiome 4531 human multiome \n", + "AE-2116_mDA_neurons_DOGMA-seq_multiom... 4532 human multiome \n", + "\n", + " project_id reference \n", + "Sample \n", + "AE-2116_mDA_neurons_DOGMA-seq_multiome DOGMAseq sample plus GRCh38 \n", + "AE-2116_mDA_neurons_DOGMA-seq_multiom... DOGMAseq sample plus GRCh38 " + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# You can supply a list of IDs or request IDs\n", + "\n", + "request_ids = ['AE-2116']\n", + "samples = sample_scridb_info(request_ids, 'request_id', creds)\n", + "\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
AWS_storageidspeciessc_techproject_idreference
Sample
AE-2116_mDA_neurons_DOGMA-seq_multiomes3://dp-lab-data/collaborators/strud...4531humanmultiomeDOGMAseq sample plusGRCh38
\n", + "
" + ], + "text/plain": [ + " AWS_storage \\\n", + "Sample \n", + "AE-2116_mDA_neurons_DOGMA-seq_multiome s3://dp-lab-data/collaborators/strud... \n", + "\n", + " id species sc_tech \\\n", + "Sample \n", + "AE-2116_mDA_neurons_DOGMA-seq_multiome 4531 human multiome \n", + "\n", + " project_id reference \n", + "Sample \n", + "AE-2116_mDA_neurons_DOGMA-seq_multiome DOGMAseq sample plus GRCh38 " + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples = samples.iloc[0:1]\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "ERROR:root:Path to barcodes or counts matrix of GEX data is missing!\n" + ] + }, + { + "ename": "IndexError", + "evalue": "list index out of range", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", + "Input \u001b[0;32mIn [17]\u001b[0m, in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 9\u001b[0m bc_params\u001b[38;5;241m.\u001b[39mappend(get_bc_params(idx, creds))\n\u001b[1;32m 10\u001b[0m bcs\u001b[38;5;241m.\u001b[39mappend(get_bcs(idx, creds))\n\u001b[0;32m---> 11\u001b[0m samples\u001b[38;5;241m.\u001b[39mloc[sample, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mdenseCountMatrix\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[43mget_denseCountMatrix\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrow\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mAWS_storage\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m\n\u001b[1;32m 13\u001b[0m samples[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mWhitelist_Params\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m wl_params\n\u001b[1;32m 14\u001b[0m samples[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mBarcode_Params\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m bc_params\n", + "\u001b[0;31mIndexError\u001b[0m: list index out of range" + ] + } + ], + "source": [ + "wl_params = []\n", + "bc_params = []\n", + "bcs = []\n", + "\n", + "for sample, row in samples.iterrows():\n", + " idx = row['id']\n", + " \n", + " wl_params.append(get_wl_params(idx, creds, prefix, row['AWS_storage']))\n", + " bc_params.append(get_bc_params(idx, creds))\n", + " bcs.append(get_bcs(idx, creds))\n", + " samples.loc[sample, 'denseCountMatrix'] = get_denseCountMatrix(row['AWS_storage'])[0]\n", + "\n", + "samples[\"Whitelist_Params\"] = wl_params\n", + "samples[\"Barcode_Params\"] = bc_params\n", + "samples[\"Barcodes\"] = bcs\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "get_denseCountMatrix(row['AWS_storage'])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "IMPORTANT NOTE \n", + "\n", + "Check the name of the folder you are running. Typically the folder that is stored in the database is just the GEX. So if another library is generated (multiome ATAC, VDJ, hashtag, etc) then it needs to be manually changed." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "AE-2116_mDA_neurons_DOGMA-seq_multiome\n", + " PRE AE-2116_mDA_neurons_DOGMA-seq_multiome/\n", + " PRE AE-2116_mDA_neurons_DOGMA-seq_multiome_HTO/\n", + " PRE AE-2116_mDA_neurons_DOGMA-seq_multiome_mATAC/\n", + "\n" + ] + } + ], + "source": [ + "# Check the name of the folder you are running\n", + "# Especially if there are multiple libraries (i.e ATAC, TCR_VDJ, etc.)\n", + "\n", + "for sample, row in samples.iterrows():\n", + " print(sample)\n", + " path = os.path.split(row['AWS_storage'])[0] + '/'\n", + " os.system(f'aws s3 ls {path} | grep {sample}')\n", + " print()" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/9v/1lnyrkxd0yq8l2pgl002wh1s7c6fqv/T/ipykernel_61990/2341054346.py:1: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " samples['AWS_storage'] = samples['AWS_storage'] + '_HTO'\n" + ] + }, + { + "data": { + "text/plain": [ + "['s3://dp-lab-data/collaborators/struder/DogmaseqSamplePlus/AE-2116_mDA_neurons_DOGMA-seq_multiome_HTO']" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples['AWS_storage'] = samples['AWS_storage'] + '_HTO'\n", + "samples['AWS_storage'].tolist()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/9v/1lnyrkxd0yq8l2pgl002wh1s7c6fqv/T/ipykernel_96156/4168958876.py:1: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " samples[\"FASTQs\"] = samples[\"AWS_storage\"].apply(lambda x: get_fastqs(x, fastq_map[prefix], \"FASTQ\"))\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
AWS_storageidspeciessc_techproject_idreferencedenseCountMatrixWhitelist_ParamsBarcode_ParamsBarcodesFASTQs
Sample
AT-1447_Ret_R1s3://dp-lab-data/collaborators/priya...3409mouse10X_V3.1Memory consolidation VRs3://seqc-public/genomes/mm38_long_p...s3://dp-lab-data/collaborators/priya...{'uri': 's3://dp-lab-data/collaborat...{'cb': 16, 'umi': 28, 'conjugation':...[(ATGAGGAATTCCTGC, A0301, m16, 0), (...{'R1': ['s3://dp-lab-data/collaborat...
\n", + "
" + ], + "text/plain": [ + " AWS_storage id species \\\n", + "Sample \n", + "AT-1447_Ret_R1 s3://dp-lab-data/collaborators/priya... 3409 mouse \n", + "\n", + " sc_tech project_id \\\n", + "Sample \n", + "AT-1447_Ret_R1 10X_V3.1 Memory consolidation VR \n", + "\n", + " reference \\\n", + "Sample \n", + "AT-1447_Ret_R1 s3://seqc-public/genomes/mm38_long_p... \n", + "\n", + " denseCountMatrix \\\n", + "Sample \n", + "AT-1447_Ret_R1 s3://dp-lab-data/collaborators/priya... \n", + "\n", + " Whitelist_Params \\\n", + "Sample \n", + "AT-1447_Ret_R1 {'uri': 's3://dp-lab-data/collaborat... \n", + "\n", + " Barcode_Params \\\n", + "Sample \n", + "AT-1447_Ret_R1 {'cb': 16, 'umi': 28, 'conjugation':... \n", + "\n", + " Barcodes \\\n", + "Sample \n", + "AT-1447_Ret_R1 [(ATGAGGAATTCCTGC, A0301, m16, 0), (... \n", + "\n", + " FASTQs \n", + "Sample \n", + "AT-1447_Ret_R1 {'R1': ['s3://dp-lab-data/collaborat... " + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples[\"FASTQs\"] = samples[\"AWS_storage\"].apply(lambda x: get_fastqs(x, fastq_map[prefix], \"FASTQ\"))\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "IMPORTANT NOTE\n", + "\n", + "Make sure that your files are not archived. The following command will print any FASTQ file that is archived. Unarchive the files and then come back to processing the sample." + ] + }, + { + "cell_type": "code", + "execution_count": 115, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "AT-1447_Ret_R1\n", + "collaborators/priya/MemConsolidationVr/AT-1447_Ret_R1_CPL/FASTQ/3409_AT-1447_Ret_R1_CPL_IGO_12437_Q_3_S32_L003_I1_001.fastq.gz\tcollaborators/priya/MemConsolidationVr/AT-1447_Ret_R1_CPL/FASTQ/3409_AT-1447_Ret_R1_CPL_IGO_12437_Q_3_S32_L003_I2_001.fastq.gz\tcollaborators/priya/MemConsolidationVr/AT-1447_Ret_R1_CPL/FASTQ/3409_AT-1447_Ret_R1_CPL_IGO_12437_Q_3_S32_L003_R1_001.fastq.gz\tcollaborators/priya/MemConsolidationVr/AT-1447_Ret_R1_CPL/FASTQ/3409_AT-1447_Ret_R1_CPL_IGO_12437_Q_3_S32_L003_R2_001.fastq.gz\tcollaborators/priya/MemConsolidationVr/AT-1447_Ret_R1_CPL/FASTQ/3409_AT-1447_Ret_R1_CPL_IGO_12437_Q_3_S32_L004_I1_001.fastq.gz\tcollaborators/priya/MemConsolidationVr/AT-1447_Ret_R1_CPL/FASTQ/3409_AT-1447_Ret_R1_CPL_IGO_12437_Q_3_S32_L004_I2_001.fastq.gz\tcollaborators/priya/MemConsolidationVr/AT-1447_Ret_R1_CPL/FASTQ/3409_AT-1447_Ret_R1_CPL_IGO_12437_Q_3_S32_L004_R1_001.fastq.gz\tcollaborators/priya/MemConsolidationVr/AT-1447_Ret_R1_CPL/FASTQ/3409_AT-1447_Ret_R1_CPL_IGO_12437_Q_3_S32_L004_R2_001.fastq.gz\n", + "\n", + "AT-1447_Ret_R2\n", + "collaborators/priya/MemConsolidationVr/AT-1447_Ret_R2_CPL/FASTQ/3410_AT-1447_Ret_R2_CPL_IGO_12437_Q_4_S33_L003_I1_001.fastq.gz\tcollaborators/priya/MemConsolidationVr/AT-1447_Ret_R2_CPL/FASTQ/3410_AT-1447_Ret_R2_CPL_IGO_12437_Q_4_S33_L003_I2_001.fastq.gz\tcollaborators/priya/MemConsolidationVr/AT-1447_Ret_R2_CPL/FASTQ/3410_AT-1447_Ret_R2_CPL_IGO_12437_Q_4_S33_L003_R1_001.fastq.gz\tcollaborators/priya/MemConsolidationVr/AT-1447_Ret_R2_CPL/FASTQ/3410_AT-1447_Ret_R2_CPL_IGO_12437_Q_4_S33_L003_R2_001.fastq.gz\tcollaborators/priya/MemConsolidationVr/AT-1447_Ret_R2_CPL/FASTQ/3410_AT-1447_Ret_R2_CPL_IGO_12437_Q_4_S33_L004_I1_001.fastq.gz\tcollaborators/priya/MemConsolidationVr/AT-1447_Ret_R2_CPL/FASTQ/3410_AT-1447_Ret_R2_CPL_IGO_12437_Q_4_S33_L004_I2_001.fastq.gz\tcollaborators/priya/MemConsolidationVr/AT-1447_Ret_R2_CPL/FASTQ/3410_AT-1447_Ret_R2_CPL_IGO_12437_Q_4_S33_L004_R1_001.fastq.gz\tcollaborators/priya/MemConsolidationVr/AT-1447_Ret_R2_CPL/FASTQ/3410_AT-1447_Ret_R2_CPL_IGO_12437_Q_4_S33_L004_R2_001.fastq.gz\n", + "\n" + ] + } + ], + "source": [ + "for sample, row in samples.iterrows():\n", + " print(sample)\n", + " fastqs = np.ravel(list(row['FASTQs'].values()))\n", + " dirnames = set([os.path.dirname(x) for x in fastqs])\n", + " \n", + " for dirname in dirnames:\n", + " file = dirname.replace('s3://', '')\n", + " \n", + " bucket = file.split('/')[0]\n", + " pre = file.replace(f'{bucket}/', '')\n", + " \n", + " !aws s3api list-objects-v2 --bucket $bucket --prefix $pre --query \"Contents[?StorageClass!='STANDARD'].Key\" --output text\n", + " print()" + ] + }, + { + "cell_type": "code", + "execution_count": 116, + "metadata": {}, + "outputs": [], + "source": [ + "for sample, row in samples.iterrows():\n", + " fastqs = row['FASTQs']\n", + " fastqs = list(np.ravel(list(fastqs.values())))\n", + " \n", + " for fastq in fastqs:\n", + " file = fastq.replace('s3://', '')\n", + " bucket = file.split('/')[0]\n", + " key = file.replace(f'{bucket}/', '')\n", + "\n", + " cmd = f'aws s3api restore-object --bucket {bucket} --key {key} --restore-request '\n", + " cmd += '\\'{\"Days\":25, \"GlacierJobParameters\":{\"Tier\":\"Standard\"}}\\''\n", + " os.system(cmd)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Upload the barcodes to AWS" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "045b7fc884bc488f950b3464c6dfa532", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/1 [00:00IMPORTANT NOTE\n", + "\n", + "Check what version of 10x you are using if you are using the outputs of SEQC to generate your whitelist!" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['10X_V3.1']" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples['sc_tech'].unique().tolist()" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [], + "source": [ + "platform = '10x_v3'" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Hashtag.uriFastqR1Hashtag.uriFastqR2Hashtag.sampleNameHashtag.scRnaSeqPlatformHashtag.lengthR1Hashtag.lengthR2Hashtag.cellBarcodeWhitelistUriHashtag.cellBarcodeWhiteListMethodHashtag.translate10XBarcodesHashtag.hashTagList...Hashtag.umiEndPosHashtag.slidingWindowSearchHashtag.cbCollapsingDistanceHashtag.umiCollapsingDistanceHashtag.numExpectedCellsHashtag.minCountHashtag.denseCountMatrixHashtag.resourceSpecHashtag.demuxModeHashtag.dockerRegistry
Sample
AT-1447_Ret_R1[s3://dp-lab-data/collaborators/priy...[s3://dp-lab-data/collaborators/priy...AT-1447_Ret_R110x_v32815s3://dp-lab-data/collaborators/priya...SeqcDenseCountsMatrixCsvTrues3://dp-lab-data/collaborators/priya......28False11010s3://dp-lab-data/collaborators/priya...{'cpu': 32, 'memory': -1}1quay.io/hisplan
\n", + "

1 rows × 23 columns

\n", + "
" + ], + "text/plain": [ + " Hashtag.uriFastqR1 \\\n", + "Sample \n", + "AT-1447_Ret_R1 [s3://dp-lab-data/collaborators/priy... \n", + "\n", + " Hashtag.uriFastqR2 Hashtag.sampleName \\\n", + "Sample \n", + "AT-1447_Ret_R1 [s3://dp-lab-data/collaborators/priy... AT-1447_Ret_R1 \n", + "\n", + " Hashtag.scRnaSeqPlatform Hashtag.lengthR1 Hashtag.lengthR2 \\\n", + "Sample \n", + "AT-1447_Ret_R1 10x_v3 28 15 \n", + "\n", + " Hashtag.cellBarcodeWhitelistUri \\\n", + "Sample \n", + "AT-1447_Ret_R1 s3://dp-lab-data/collaborators/priya... \n", + "\n", + " Hashtag.cellBarcodeWhiteListMethod \\\n", + "Sample \n", + "AT-1447_Ret_R1 SeqcDenseCountsMatrixCsv \n", + "\n", + " Hashtag.translate10XBarcodes \\\n", + "Sample \n", + "AT-1447_Ret_R1 True \n", + "\n", + " Hashtag.hashTagList ... \\\n", + "Sample ... \n", + "AT-1447_Ret_R1 s3://dp-lab-data/collaborators/priya... ... \n", + "\n", + " Hashtag.umiEndPos Hashtag.slidingWindowSearch \\\n", + "Sample \n", + "AT-1447_Ret_R1 28 False \n", + "\n", + " Hashtag.cbCollapsingDistance Hashtag.umiCollapsingDistance \\\n", + "Sample \n", + "AT-1447_Ret_R1 1 1 \n", + "\n", + " Hashtag.numExpectedCells Hashtag.minCount \\\n", + "Sample \n", + "AT-1447_Ret_R1 0 10 \n", + "\n", + " Hashtag.denseCountMatrix \\\n", + "Sample \n", + "AT-1447_Ret_R1 s3://dp-lab-data/collaborators/priya... \n", + "\n", + " Hashtag.resourceSpec Hashtag.demuxMode \\\n", + "Sample \n", + "AT-1447_Ret_R1 {'cpu': 32, 'memory': -1} 1 \n", + "\n", + " Hashtag.dockerRegistry \n", + "Sample \n", + "AT-1447_Ret_R1 quay.io/hisplan \n", + "\n", + "[1 rows x 23 columns]" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Standard inputs, modify fields as need be\n", + "\n", + "# Load minimum inputs and labels fields from templates\n", + "with open(f\"{config_dir}/cellplex.inputs.json\") as f:\n", + " std_inputs_fields = list(json.load(f).keys())\n", + " \n", + "# Annotate all samples with workflow inputs and labels\n", + "inputs = pd.DataFrame(index=samples.index, columns=std_inputs_fields,)\n", + "fastq_file_ids = fastq_map[prefix]\n", + "\n", + "# Annotate inputs\n", + "inputs[f\"{prefix}.sampleName\"] = samples.index\n", + "inputs[f\"{prefix}.scRnaSeqPlatform\"] = platform \n", + "\n", + "inputs[f\"{prefix}.lengthR1\"] = samples[\"Barcode_Params\"].apply(lambda x: x[\"umi\"])\n", + "inputs[f\"{prefix}.lengthR2\"] = samples[\"Barcode_Params\"].apply(lambda x: x[\"seq_length\"])\n", + "\n", + "inputs[f\"{prefix}.cbStartPos\"] = 1\n", + "inputs[f\"{prefix}.cbEndPos\"] = samples[\"Barcode_Params\"].apply(lambda x: x[\"cb\"])\n", + "inputs[f\"{prefix}.umiEndPos\"] = samples[\"Barcode_Params\"].apply(lambda x: x[\"umi\"])\n", + "inputs[f\"{prefix}.umiStartPos\"] = inputs[f\"{prefix}.cbEndPos\"] + 1\n", + "\n", + "# inputs[f\"{prefix}.trimPos\"] = samples[\"Barcode_Params\"].apply(lambda x: x[\"bp_shift\"])\n", + "\n", + "inputs[f\"{prefix}.cellBarcodeWhitelistUri\"] = samples[\"Whitelist_Params\"].apply(lambda x: x[\"uri\"])\n", + "inputs[f\"{prefix}.cellBarcodeWhiteListMethod\"] = samples[\"Whitelist_Params\"].apply(lambda x: x[\"method\"])\n", + "\n", + "inputs[f\"{prefix}.translate10XBarcodes\"] = True\n", + "\n", + "inputs[f\"{prefix}.hashTagList\"] = samples[\"AWS_storage\"] + f\"/{output_dirname}/tag-list.csv\" \n", + "inputs[f\"{prefix}.denseCountMatrix\"] = samples[\"denseCountMatrix\"]\n", + "\n", + "\n", + "for file_id in fastq_file_ids: # Set FASTQs\n", + " inputs[f\"{prefix}.uriFastq{file_id}\"] = samples[\"FASTQs\"].apply(lambda x: x[file_id])\n", + "\n", + "# ********************\n", + "# Defaults\n", + "# Note: These may need to be changed on a per-sample or per-execution basis\n", + "\n", + "inputs[f\"{prefix}.slidingWindowSearch\"] = False\n", + "inputs[f\"{prefix}.cbCollapsingDistance\"] = 1\n", + "inputs[f\"{prefix}.umiCollapsingDistance\"] = 1\n", + "inputs[f\"{prefix}.numExpectedCells\"] = 0\n", + "# Need trick to set dictionary for each row\n", + "common_resource_spec = {\n", + " \"cpu\": 32,\n", + " \"memory\": -1,\n", + "}\n", + "inputs[f\"{prefix}.resourceSpec\"] = inputs.iloc[:, 0].apply(lambda x: common_resource_spec)\n", + "if prefix == \"Hashtag\":\n", + " inputs[f\"{prefix}.minCount\"] = 10\n", + "inputs[f\"{prefix}.demuxMode\"] = 1\n", + "inputs[f\"{prefix}.dockerRegistry\"] = common_docker_registry\n", + "\n", + "inputs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['s3://dp-lab-data/collaborators/priya/MemConsolidationVr/AT-1447_Ret_R1/seqc-results/3409_AT-1447_Ret_R1_IGO_12437_P_10_dense.csv']" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "list(inputs[f'{prefix}.denseCountMatrix'])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Generate labels" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
pipelineTypeprojectsampleownerdestinationtransfercomment
Sample
AT-1447_Ret_R1HashtagMemory consolidation VRAT-1447_Ret_R1sohailns3://dp-lab-data/collaborators/priya...-sohailn
AT-1447_Ret_R2HashtagMemory consolidation VRAT-1447_Ret_R2sohailns3://dp-lab-data/collaborators/priya...-sohailn
\n", + "
" + ], + "text/plain": [ + " pipelineType project sample owner \\\n", + "Sample \n", + "AT-1447_Ret_R1 Hashtag Memory consolidation VR AT-1447_Ret_R1 sohailn \n", + "AT-1447_Ret_R2 Hashtag Memory consolidation VR AT-1447_Ret_R2 sohailn \n", + "\n", + " destination transfer comment \n", + "Sample \n", + "AT-1447_Ret_R1 s3://dp-lab-data/collaborators/priya... - sohailn \n", + "AT-1447_Ret_R2 s3://dp-lab-data/collaborators/priya... - sohailn " + ] + }, + "execution_count": 49, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Standard labels, modify fields as need be\n", + "\n", + "with open(f\"{config_dir}/cellplex.labels.json\") as f:\n", + " std_labels_fields = list(json.load(f).keys())\n", + " \n", + "# Annotate all samples with workflow inputs and labels\n", + "labels = pd.DataFrame(index=samples.index, columns=std_labels_fields,)\n", + "\n", + "labels[\"pipelineType\"] = pipeline_type\n", + "labels[\"project\"] = samples['project_id']\n", + "labels[\"sample\"] = labels.index\n", + "labels[\"owner\"] = creds[\"user\"]\n", + "labels[\"destination\"] = samples['AWS_storage'] + \"/\" + output_dirname\n", + "labels[\"transfer\"] = \"-\"\n", + "labels[\"comment\"] = creds[\"user\"]\n", + "\n", + "labels" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Run samples" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Look over the samples before submitting one last time" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Hashtag.uriFastqR1Hashtag.uriFastqR2Hashtag.sampleNameHashtag.scRnaSeqPlatformHashtag.lengthR1Hashtag.lengthR2Hashtag.cellBarcodeWhitelistUriHashtag.cellBarcodeWhiteListMethodHashtag.translate10XBarcodesHashtag.hashTagList...Hashtag.umiEndPosHashtag.slidingWindowSearchHashtag.cbCollapsingDistanceHashtag.umiCollapsingDistanceHashtag.numExpectedCellsHashtag.minCountHashtag.denseCountMatrixHashtag.resourceSpecHashtag.demuxModeHashtag.dockerRegistry
Sample
AT-1447_Ret_R1[s3://dp-lab-data/collaborators/priy...[s3://dp-lab-data/collaborators/priy...AT-1447_Ret_R110x_v32815s3://dp-lab-data/collaborators/priya...SeqcDenseCountsMatrixCsvTrues3://dp-lab-data/collaborators/priya......28False11010s3://dp-lab-data/collaborators/priya...{'cpu': 32, 'memory': -1}1quay.io/hisplan
\n", + "

1 rows × 23 columns

\n", + "
" + ], + "text/plain": [ + " Hashtag.uriFastqR1 \\\n", + "Sample \n", + "AT-1447_Ret_R1 [s3://dp-lab-data/collaborators/priy... \n", + "\n", + " Hashtag.uriFastqR2 Hashtag.sampleName \\\n", + "Sample \n", + "AT-1447_Ret_R1 [s3://dp-lab-data/collaborators/priy... AT-1447_Ret_R1 \n", + "\n", + " Hashtag.scRnaSeqPlatform Hashtag.lengthR1 Hashtag.lengthR2 \\\n", + "Sample \n", + "AT-1447_Ret_R1 10x_v3 28 15 \n", + "\n", + " Hashtag.cellBarcodeWhitelistUri \\\n", + "Sample \n", + "AT-1447_Ret_R1 s3://dp-lab-data/collaborators/priya... \n", + "\n", + " Hashtag.cellBarcodeWhiteListMethod \\\n", + "Sample \n", + "AT-1447_Ret_R1 SeqcDenseCountsMatrixCsv \n", + "\n", + " Hashtag.translate10XBarcodes \\\n", + "Sample \n", + "AT-1447_Ret_R1 True \n", + "\n", + " Hashtag.hashTagList ... \\\n", + "Sample ... \n", + "AT-1447_Ret_R1 s3://dp-lab-data/collaborators/priya... ... \n", + "\n", + " Hashtag.umiEndPos Hashtag.slidingWindowSearch \\\n", + "Sample \n", + "AT-1447_Ret_R1 28 False \n", + "\n", + " Hashtag.cbCollapsingDistance Hashtag.umiCollapsingDistance \\\n", + "Sample \n", + "AT-1447_Ret_R1 1 1 \n", + "\n", + " Hashtag.numExpectedCells Hashtag.minCount \\\n", + "Sample \n", + "AT-1447_Ret_R1 0 10 \n", + "\n", + " Hashtag.denseCountMatrix \\\n", + "Sample \n", + "AT-1447_Ret_R1 s3://dp-lab-data/collaborators/priya... \n", + "\n", + " Hashtag.resourceSpec Hashtag.demuxMode \\\n", + "Sample \n", + "AT-1447_Ret_R1 {'cpu': 32, 'memory': -1} 1 \n", + "\n", + " Hashtag.dockerRegistry \n", + "Sample \n", + "AT-1447_Ret_R1 quay.io/hisplan \n", + "\n", + "[1 rows x 23 columns]" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "inputs" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
pipelineTypeprojectsampleownerdestinationtransfercomment
Sample
AT-1447_Ret_R1HashtagMemory consolidation VRAT-1447_Ret_R1sohailns3://dp-lab-data/collaborators/priya...-sohailn
\n", + "
" + ], + "text/plain": [ + " pipelineType project sample owner \\\n", + "Sample \n", + "AT-1447_Ret_R1 Hashtag Memory consolidation VR AT-1447_Ret_R1 sohailn \n", + "\n", + " destination transfer comment \n", + "Sample \n", + "AT-1447_Ret_R1 s3://dp-lab-data/collaborators/priya... - sohailn " + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "labels" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "28519fe475714697b8af5b257dac468d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/1 [00:00 $file_out" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "AT-1447_Ret_R1\n", + "CITE-seq-Count Version: 1.4.3\n", + "Correction:\n", + " Cell barcodes collapsing threshold: 1\n", + " Cell barcodes corrected: 209632\n", + " UMI collapsing threshold: 1\n", + " UMIs corrected: 269339\n", + "Date: 2022-11-04\n", + "Percentage mapped: 98\n", + "Percentage unmapped: 2\n", + "Reads processed: 99797110\n", + "Running time: 2.0 hours, 10.0 minutes, 33.55 seconds\n", + "Uncorrected cells: 0\n", + "\n", + "\n" + ] + } + ], + "source": [ + "import yaml\n", + "\n", + "for sample, row in labels.iterrows():\n", + " file_out = f'web_summary/{sample}.run_report.yaml'\n", + " \n", + " with open(file_out, 'r') as stream:\n", + " try:\n", + " parsed_yaml = yaml.safe_load(stream)\n", + " except yaml.YAMLError as exc:\n", + " print(exc)\n", + " \n", + " print(sample)\n", + " del parsed_yaml['Run parameters']\n", + " print(yaml.dump(parsed_yaml, default_flow_style=False))\n", + " print()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.12" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/notebooks/Run_Transgenes_new.ipynb b/notebooks/Run_Transgenes_new.ipynb new file mode 100644 index 0000000..426b428 --- /dev/null +++ b/notebooks/Run_Transgenes_new.ipynb @@ -0,0 +1,439 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "a480ca5b-5dad-4673-9cd4-b9fb5137f40c", + "metadata": {}, + "outputs": [], + "source": [ + "import re, subprocess, boto3, json, shlex, mysql, os, urllib, logging\n", + "import pandas as pd\n", + "import numpy as np\n", + "from s3path import S3Path\n", + "from pathlib import Path\n", + "from tqdm.notebook import tqdm\n", + "from packaging import version\n", + "\n", + "import glob\n", + "import os\n", + "\n", + "pd.set_option(\"display.max_colwidth\", 40)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "7b1b09b4-7cde-45a8-8ae4-a401972d0acd", + "metadata": {}, + "outputs": [], + "source": [ + "from utils.utils import *" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6cb85f7c-d187-4a57-b795-e07c002eddc6", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "10b1a35a-406c-4f66-882d-10eeaabce91b", + "metadata": {}, + "source": [ + "# AWS setup" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "4370e93d-2565-48cf-92e1-3bd6eac525d2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "env: AWS_ACCESS_KEY_ID=ASIAYPY66CWMGNQHAG7V\n", + "env: AWS_SECRET_ACCESS_KEY=Zt6lmgFmhx1Qn1/mTajuJHxORPKjMd7zHo9yxCv3\n", + "env: AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEL///////////wEaCXVzLWVhc3QtMSJHMEUCIBOn2n7FYhkwDrJArswLQBQzsB8bEcfdUZp6ZJWuQkNlAiEA/ZQVvnqwuRjHE0/2cTzrTEwF8bS0pfOp5sd5XU9QANMq+AEIqP//////////ARADGgw1ODM2NDM1Njc1MTIiDMFsXq9WBJoyLEdVQyrMAdIJg0FT0qo+cpTVLPKnFLvyQCjzH/7ZlWLd5w1NkTkMDIR4W/d+02fgfncbF3cGwglqlO18saOqvMTOjEUvvvhihRLRzuSajiF3sqG6wsdwu6IgCyk6xdYap84Wt0uo5LshyJAma2fK31yVPTip6n6nxoCcTmsJjhvFtMRGlgiC4bIAeW2lC8lqGHPmyz//tutqj9fZeUR0qmGtr1ium7Gg39WX5IzOgHAWTbb/HSspeP0+xDVfdzOHZyA47RVNc2EIwIXoHCntzPmUEjCNjYqbBjqYAcTJn0OZLrzdFL5RsIVXPaoQMedyiuxr27Bmz4QZoB32whcGu/0osFhwL4la0v+BUXuz2zGPB+byyrGkMB249QQitouR1DIZ/mCUnEz6HvCEQwdH/yIFkeNcY6p+rV/1sOa7op3p43reWd7s9ui3mlQ4QDi63ZJG/aBmGMwmPrCMQVgW9vJR5vr+LjV4YWxqVJ1PqOiZnGf+\n", + "2021-10-07 15:31:32 agc-583643567512-us-east-1\n", + "2021-10-07 15:28:07 cdktoolkit-stagingbucket-d49u1xfb0sc4\n", + "2019-10-09 13:04:06 cf-templates-umiwbnq3566w-us-east-1\n", + "2019-10-10 12:46:54 dp-daily-reports\n", + "2017-09-26 10:15:15 dp-lab-data\n", + "2019-05-23 12:34:58 dp-lab-data-public\n", + "2018-03-01 13:29:07 dp-lab-glacier\n", + "2020-11-06 23:02:27 dp-lab-gwf-core\n", + "2021-07-15 18:14:01 dp-lab-gwf-core2\n", + "2017-09-26 10:17:18 dp-lab-home\n", + "2019-08-14 16:42:43 dp-lab-test\n", + "2019-04-25 12:35:35 elasticbeanstalk-us-east-1-583643567512\n", + "2019-12-13 15:53:57 scri-computational\n", + "2017-09-26 10:23:50 seqc-public\n" + ] + } + ], + "source": [ + "%env AWS_ACCESS_KEY_ID=ASIAYPY66CWMGNQHAG7V\n", + "%env AWS_SECRET_ACCESS_KEY=Zt6lmgFmhx1Qn1/mTajuJHxORPKjMd7zHo9yxCv3\n", + "%env AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEL///////////wEaCXVzLWVhc3QtMSJHMEUCIBOn2n7FYhkwDrJArswLQBQzsB8bEcfdUZp6ZJWuQkNlAiEA/ZQVvnqwuRjHE0/2cTzrTEwF8bS0pfOp5sd5XU9QANMq+AEIqP//////////ARADGgw1ODM2NDM1Njc1MTIiDMFsXq9WBJoyLEdVQyrMAdIJg0FT0qo+cpTVLPKnFLvyQCjzH/7ZlWLd5w1NkTkMDIR4W/d+02fgfncbF3cGwglqlO18saOqvMTOjEUvvvhihRLRzuSajiF3sqG6wsdwu6IgCyk6xdYap84Wt0uo5LshyJAma2fK31yVPTip6n6nxoCcTmsJjhvFtMRGlgiC4bIAeW2lC8lqGHPmyz//tutqj9fZeUR0qmGtr1ium7Gg39WX5IzOgHAWTbb/HSspeP0+xDVfdzOHZyA47RVNc2EIwIXoHCntzPmUEjCNjYqbBjqYAcTJn0OZLrzdFL5RsIVXPaoQMedyiuxr27Bmz4QZoB32whcGu/0osFhwL4la0v+BUXuz2zGPB+byyrGkMB249QQitouR1DIZ/mCUnEz6HvCEQwdH/yIFkeNcY6p+rV/1sOa7op3p43reWd7s9ui3mlQ4QDi63ZJG/aBmGMwmPrCMQVgW9vJR5vr+LjV4YWxqVJ1PqOiZnGf+\n", + "\n", + "!aws s3 ls" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1be9e8c4-2c18-4cb5-85cc-ee33b510f23c", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "7091dcda-0a18-43a2-9c3f-077662f3bbc3", + "metadata": { + "tags": [] + }, + "source": [ + "# Setup" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "66d94c6b-ca49-4e15-be39-13ee21ec94e3", + "metadata": {}, + "outputs": [], + "source": [ + "# Maps from .wdl name (prefix) to results dirname\n", + "results_dirs = {\n", + " \"TransgenesSeqc\": \"refdata-seqc\",\n", + " \"TransgenesCellRanger\": \"refdata-cellranger\",\n", + "}\n", + "\n", + "# Maps from .wdl name (prefix) to shell script\n", + "sh_files = {\n", + " \"TransgenesSeqc\": \"submit-seqc.sh\",\n", + " \"TransgenesCellRanger\": \"submit-cellranger.sh\",\n", + "}\n", + "\n", + "# Version (CellRanger or Star) to use; Should be in database\n", + "latest_STAR = \"2.5.3a\"\n", + "latest_CellRanger = \"6.1.1\"" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "f3d482b7-cc91-44f8-9b80-93847138c22c", + "metadata": {}, + "outputs": [], + "source": [ + "# Which pipeline are you running\n", + "prefix = \"TransgenesCellRanger\" # Workflow to run; also .wdl filename prefix\n", + "output_dirname = \"refdata-cellranger\"\n", + "\n", + "workflow_dir = glob.glob(f\"{Path.home()}/scing/bin/transgenes*\")[0]\n", + "path_to_exec = f\"{workflow_dir}/submit.sh\" # CHANGE THIS FOR SHARP\n", + "\n", + "# Locations of workflow-related directories and files\n", + "path_to_cromwell_secrets = f\"{Path.home()}/.cromwell/cromwell-secrets.json\"\n", + "db_credentials_path = f\"{Path.home()}/.config.json\"" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "cca545a8-ccc3-4e15-8813-ae10e2d07ba6", + "metadata": {}, + "outputs": [], + "source": [ + "# Location of docker files\n", + "common_docker_registry = \"quay.io/hisplan\"\n", + "pipeline_type = prefix # field in *.labels.json\n", + "comment = \"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "bdb9c13b-3129-4069-81a6-19919996f094", + "metadata": {}, + "outputs": [], + "source": [ + "# Workflow file paths\n", + "config_dir = f\"{workflow_dir}/configs\"\n", + "path_to_options = f\"{workflow_dir}/Sharp.options.aws.json\"" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "48f3391c-cd0e-48da-b05c-4adcc4e44f87", + "metadata": {}, + "outputs": [], + "source": [ + "# Set credentials based on SCRIdb CLI config file\n", + "with open(db_credentials_path) as f:\n", + " creds = json.load(f)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6670e0cc-8731-41cc-8d31-761deb3f3a1b", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "e88c91c2-6044-463e-9bd9-14e1631963b4", + "metadata": {}, + "source": [ + "# Sample information" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "328b93a1-447a-4f30-9d5c-8cf82497fa43", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
AWS_storageidspeciessc_techproject_idreference
Sample
ARN-1167_M-4T1s3://dp-lab-data/collaborators/aboir...3249mouse10X_V3.1Leptomeningeal metastasis heterogeneitys3://seqc-public/genomes/mm38_long_p...
ARN-1167_Normals3://dp-lab-data/collaborators/aboir...3250mouse10X_V3.1Leptomeningeal metastasis heterogeneitys3://seqc-public/genomes/mm38_long_p...
ARN-1167_PM-4T1s3://dp-lab-data/collaborators/aboir...3251mouse10X_V3.1Leptomeningeal metastasis heterogeneitys3://seqc-public/genomes/mm38_long_p...
\n", + "
" + ], + "text/plain": [ + " AWS_storage id species \\\n", + "Sample \n", + "ARN-1167_M-4T1 s3://dp-lab-data/collaborators/aboir... 3249 mouse \n", + "ARN-1167_Normal s3://dp-lab-data/collaborators/aboir... 3250 mouse \n", + "ARN-1167_PM-4T1 s3://dp-lab-data/collaborators/aboir... 3251 mouse \n", + "\n", + " sc_tech project_id \\\n", + "Sample \n", + "ARN-1167_M-4T1 10X_V3.1 Leptomeningeal metastasis heterogeneity \n", + "ARN-1167_Normal 10X_V3.1 Leptomeningeal metastasis heterogeneity \n", + "ARN-1167_PM-4T1 10X_V3.1 Leptomeningeal metastasis heterogeneity \n", + "\n", + " reference \n", + "Sample \n", + "ARN-1167_M-4T1 s3://seqc-public/genomes/mm38_long_p... \n", + "ARN-1167_Normal s3://seqc-public/genomes/mm38_long_p... \n", + "ARN-1167_PM-4T1 s3://seqc-public/genomes/mm38_long_p... " + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# You can supply a list of IDs or request IDs\n", + "\n", + "request_ids = ['ARN-1167']\n", + "samples = sample_scridb_info(request_ids, 'request_id', creds)\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b837d999-a7e3-431b-ab24-1076ed1876ae", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "aa4f0df0-2405-4d1a-aaf2-d2f10246690e", + "metadata": {}, + "source": [ + "# Manually add AWS path to fasta files" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6d229087-fb55-479e-aa12-9a98f323e41d", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2529ec18-37f3-42e9-a91a-8f0be5b0c2e4", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "5b371e6a-d0c1-4d6e-bf7e-0af3a3317e53", + "metadata": {}, + "source": [ + "# Make labels" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7c6cfd3b-c96e-4605-8961-00f210584517", + "metadata": {}, + "outputs": [], + "source": [ + "# Load minimum inputs and labels fields from templates\n", + "pipeline_type = prefix.split('Transgenes')[-1].lower()\n", + "with open(f\"{config_dir}/template.{pipeline_type}.inputs.json\") as f:\n", + " std_inputs_fields = list(json.load(f).keys())\n", + " \n", + "with open(f\"{config_dir}/template.{pipeline_type}.labels.json\") as f:\n", + " std_labels_fields = list(json.load(f).keys())\n", + " \n", + "# Annotate all samples with workflow inputs and labels\n", + "inputs = pd.DataFrame(index=submissions.index, columns=std_inputs_fields,)\n", + "labels = pd.DataFrame(index=submissions.index, columns=std_labels_fields,)\n", + "\n", + "# Annotate inputs\n", + "inputs[f\"{prefix}.referenceName\"] = \\\n", + " submissions[\"Project_Name\"] + \"-\" + \\\n", + " submissions[\"Parsed_Species\"].apply(lambda x: f\"{x[1]}-Ensembl-{x[2]}\") + \"-\" \\\n", + " \"transgenes\"\n", + "inputs[f\"{prefix}.genomeReferenceFasta\"] = \\\n", + " submissions[\"Parsed_Species\"].apply(lambda x: ref_map[x[1:]][1])\n", + "inputs[f\"{prefix}.annotationGtf\"] = \\\n", + " submissions[\"Parsed_Species\"].apply(lambda x: ref_map[x[1:]][0])\n", + "inputs[f\"{prefix}.customFastaFiles\"] = \\\n", + " submissions[\"AWS S3 location(s) of the FASTA sequence of your reporter genes\"].apply(lambda x: x.split(\"\\n\"))\n", + "inputs[f\"{prefix}.ensembleIdPrefix\"] = \\\n", + " submissions[\"Parsed_Species\"].apply(lambda x: ensembl_map[x[0]])\n", + "inputs[f\"{prefix}.ensembleIds\"] = submissions[\"Ensembl ID of transgene\"].apply(lambda x: x.split(\"\\n\"))\n", + "if pipeline_type == \"TransgenesSEQC\":\n", + " inputs[f\"{prefix}.starVersion\"] = latest_STAR\n", + "else:\n", + " inputs[f\"{prefix}.cellRangerVersion\"] = latest_CellRanger\n", + "standard_biotypes = [\n", + " \"protein_coding\", \"lincRNA\", \"antisense\",\n", + " \"IG_V_gene\", \"IG_D_gene\", \"IG_J_gene\", \"IG_C_gene\",\n", + " \"TR_V_gene\", \"TR_D_gene\", \"TR_J_gene\", \"TR_C_gene\",\n", + "]\n", + "inputs[f\"{prefix}.biotypes\"] = inputs.iloc[:, 0].apply(lambda x: standard_biotypes)\n", + "inputs[f\"{prefix}.dockerRegistry\"] = common_docker_registry" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "be14a08e-71f3-41ea-b716-e9e69ee7c44c", + "metadata": {}, + "outputs": [], + "source": [ + "# Annotate labels\n", + "labels[\"pipelineType\"] = prefix\n", + "labels[\"project\"] = submissions[\"Project_Name\"]\n", + "labels[\"sample\"] = labels.index\n", + "labels[\"owner\"] = creds[\"user\"]\n", + "labels[\"destination\"] = \\\n", + " submissions[\"AWS S3 location where you want the newly built genome to be stored\"].str.strip(\"/\") + \\\n", + " \"/\" + output_dirname\n", + " \n", + "labels[\"transfer\"] = \"-\"\n", + "labels[\"comment\"] = creds[\"user\"]" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/Run_Unarchive.ipynb b/notebooks/Run_Unarchive.ipynb new file mode 100644 index 0000000..46928cb --- /dev/null +++ b/notebooks/Run_Unarchive.ipynb @@ -0,0 +1,2316 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 33, + "id": "786ff4b8-3736-4713-ae19-bc6ff2a064b0", + "metadata": {}, + "outputs": [], + "source": [ + "import re, subprocess, boto3, json, shlex, mysql, os, urllib, logging\n", + "import pandas as pd\n", + "import numpy as np\n", + "from s3path import S3Path\n", + "from pathlib import Path\n", + "from tqdm.notebook import tqdm\n", + "from packaging import version\n", + "\n", + "import glob\n", + "import os\n", + "\n", + "pd.set_option(\"display.max_colwidth\", 40)" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "b376274a-736f-4b6f-8f00-1d59b50aa2d7", + "metadata": {}, + "outputs": [], + "source": [ + "from utils.utils import *" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c190d0ba-29b5-4ec3-a184-f4baa20de020", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "bc22f78b-0a39-44a1-8e73-adf0193aa2ae", + "metadata": {}, + "source": [ + "# AWS setup" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "fe926571-9c8b-4b9e-a18b-1dbf3d2f2b65", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "env: AWS_ACCESS_KEY_ID=ASIAYPY66CWMLCBOSPXR\n", + "env: AWS_SECRET_ACCESS_KEY=8d1QIWmMHqKC+EJogVNghypTHwJdYkh2ouE0AsfF\n", + "env: AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEAwaCXVzLWVhc3QtMSJHMEUCIBKpQZUyEbGT/3d6MIci71Fmxb2kagr4rj2i31pSLgDmAiEAlOyH+ApwWLSYLHEEjVbGLUbJgjaVUE8DhuHq7C1ojmoq+AEI5f//////////ARAEGgw1ODM2NDM1Njc1MTIiDHuVIB+ajNumPYXAFSrMARZ+1iEQSZSyhpvFWsVgmKG0eEbXmXU9HcTqVpIZ7ZFJjoGlsDx/TA7KIR+jX0KY52BL5zUnBaZNHSLu46y2VoSQ90qQdOpf3+d6rd8yQ0suuJ09Ywpg6BINBkw5oHByT++xcd0+7thePo+26U3oZOH6H1OYM1YiHYEQ6syKw5SZ/mNh/soIFO9UOiy5Yq0ZVFq185bppVxKC7AQEbQWoSAF2n+PnOVHlBQK7ARVmJxyvUhRCG0A+TyQWp6NJ90kZdObIr/mxXlR7FMEmDDRvq6hBjqYAesJGkceqUfrzrYzZ1Mt9CQvTaAl7H6fDeVe1nn87E/Fy1PA32nbtaRcbk/5kvO5dIi0TMLAMJsH46yNsNdrtN/6wZqbLIwawkMiiYbCdqphmeVGe3Ks1B3iXN1OluG6OC+hhvwiKoAO+SnfvpsdodaN4/0J3y7fUi8M4O7MCOwFWwCl1lo/oSMw4i0w25ZWK55SRL/EbOmH\n", + "2021-10-07 15:31:32 agc-583643567512-us-east-1\n", + "2021-10-07 15:28:07 cdktoolkit-stagingbucket-d49u1xfb0sc4\n", + "2019-10-09 13:04:06 cf-templates-umiwbnq3566w-us-east-1\n", + "2019-10-10 12:46:54 dp-daily-reports\n", + "2017-09-26 10:15:15 dp-lab-data\n", + "2019-05-23 12:34:58 dp-lab-data-public\n", + "2018-03-01 13:29:07 dp-lab-glacier\n", + "2020-11-06 23:02:27 dp-lab-gwf-core\n", + "2021-07-15 18:14:01 dp-lab-gwf-core2\n", + "2017-09-26 10:17:18 dp-lab-home\n", + "2019-08-14 16:42:43 dp-lab-test\n", + "2019-04-25 12:35:35 elasticbeanstalk-us-east-1-583643567512\n", + "2019-12-13 15:53:57 scri-computational\n", + "2017-09-26 10:23:50 seqc-public\n" + ] + } + ], + "source": [ + "# Load aws\n", + "\n", + "%env AWS_ACCESS_KEY_ID=ASIAYPY66CWMLCBOSPXR\n", + "%env AWS_SECRET_ACCESS_KEY=8d1QIWmMHqKC+EJogVNghypTHwJdYkh2ouE0AsfF\n", + "%env AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEAwaCXVzLWVhc3QtMSJHMEUCIBKpQZUyEbGT/3d6MIci71Fmxb2kagr4rj2i31pSLgDmAiEAlOyH+ApwWLSYLHEEjVbGLUbJgjaVUE8DhuHq7C1ojmoq+AEI5f//////////ARAEGgw1ODM2NDM1Njc1MTIiDHuVIB+ajNumPYXAFSrMARZ+1iEQSZSyhpvFWsVgmKG0eEbXmXU9HcTqVpIZ7ZFJjoGlsDx/TA7KIR+jX0KY52BL5zUnBaZNHSLu46y2VoSQ90qQdOpf3+d6rd8yQ0suuJ09Ywpg6BINBkw5oHByT++xcd0+7thePo+26U3oZOH6H1OYM1YiHYEQ6syKw5SZ/mNh/soIFO9UOiy5Yq0ZVFq185bppVxKC7AQEbQWoSAF2n+PnOVHlBQK7ARVmJxyvUhRCG0A+TyQWp6NJ90kZdObIr/mxXlR7FMEmDDRvq6hBjqYAesJGkceqUfrzrYzZ1Mt9CQvTaAl7H6fDeVe1nn87E/Fy1PA32nbtaRcbk/5kvO5dIi0TMLAMJsH46yNsNdrtN/6wZqbLIwawkMiiYbCdqphmeVGe3Ks1B3iXN1OluG6OC+hhvwiKoAO+SnfvpsdodaN4/0J3y7fUi8M4O7MCOwFWwCl1lo/oSMw4i0w25ZWK55SRL/EbOmH\n", + "!aws s3 ls" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fa9818c3-5a2e-40eb-ac23-aed04f3d8835", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "f0b6b1b0-1ad6-4a09-aae9-1b297293198a", + "metadata": { + "tags": [] + }, + "source": [ + "# Setup" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "f3d482b7-cc91-44f8-9b80-93847138c22c", + "metadata": {}, + "outputs": [], + "source": [ + "# Locations of workflow-related directories and files\n", + "path_to_cromwell_secrets = f\"{Path.home()}/.cromwell/cromwell-secrets.json\"\n", + "db_credentials_path = f\"{Path.home()}/.config.json\"" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "0b774596-c7ee-45b4-b3db-82df63451034", + "metadata": {}, + "outputs": [], + "source": [ + "# Set credentials based on SCRIdb CLI config file\n", + "with open(db_credentials_path) as f:\n", + " creds = json.load(f)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "167bd533-363f-4110-b163-b27664fb6f17", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "73d1fe27-747d-4bde-a37b-8a1b5c3bdd5c", + "metadata": {}, + "source": [ + "# Sample information" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "5a213cdc-45cc-4204-9060-b39dbf3b5c12", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
AWS_storageidspeciessc_techproject_idreference
Sample
AV-1759_Ru1083_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...3924humanCell_RangerLung Tumor AtlasGRCh38-3.0.0
AV-1760_MSK_LX_1083c_T_2_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...3925humanCell_RangerLung Tumor AtlasGRCh38-3.0.0
AV-1761_POSIE_101920_T_1_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...3926humanCell_RangerLung Tumor AtlasGRCh38-3.0.0
AV-1762_Ru1083d_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...3927humanCell_RangerLung Tumor AtlasGRCh38-3.0.0
AV-1763_Ru1250C_T_1_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...3928humanCell_RangerLung Tumor AtlasGRCh38-3.0.0
AV-1764_MSK_LX_1250b_PM_1_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...3929humanCell_RangerLung Tumor AtlasGRCh38-3.0.0
AV-1764_Ru1250D_T_1_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...3930humanCell_RangerLung Tumor AtlasGRCh38-3.0.0
AV-1765_Ru1250e_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...3931humanCell_RangerLung Tumor AtlasGRCh38-3.0.0
AV-1766_MSK_LX_1250f_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...3932humanCell_RangerLung Tumor AtlasGRCh38-3.0.0
AV-1760_Ru263_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...3933humanCell_RangerLung Tumor AtlasGRCh38-3.0.0
\n", + "
" + ], + "text/plain": [ + " AWS_storage id \\\n", + "Sample \n", + "AV-1759_Ru1083_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3924 \n", + "AV-1760_MSK_LX_1083c_T_2_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3925 \n", + "AV-1761_POSIE_101920_T_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3926 \n", + "AV-1762_Ru1083d_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3927 \n", + "AV-1763_Ru1250C_T_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3928 \n", + "AV-1764_MSK_LX_1250b_PM_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3929 \n", + "AV-1764_Ru1250D_T_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3930 \n", + "AV-1765_Ru1250e_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3931 \n", + "AV-1766_MSK_LX_1250f_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3932 \n", + "AV-1760_Ru263_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... 3933 \n", + "\n", + " species sc_tech project_id \\\n", + "Sample \n", + "AV-1759_Ru1083_MITO human Cell_Ranger Lung Tumor Atlas \n", + "AV-1760_MSK_LX_1083c_T_2_MITO human Cell_Ranger Lung Tumor Atlas \n", + "AV-1761_POSIE_101920_T_1_MITO human Cell_Ranger Lung Tumor Atlas \n", + "AV-1762_Ru1083d_MITO human Cell_Ranger Lung Tumor Atlas \n", + "AV-1763_Ru1250C_T_1_MITO human Cell_Ranger Lung Tumor Atlas \n", + "AV-1764_MSK_LX_1250b_PM_1_MITO human Cell_Ranger Lung Tumor Atlas \n", + "AV-1764_Ru1250D_T_1_MITO human Cell_Ranger Lung Tumor Atlas \n", + "AV-1765_Ru1250e_MITO human Cell_Ranger Lung Tumor Atlas \n", + "AV-1766_MSK_LX_1250f_MITO human Cell_Ranger Lung Tumor Atlas \n", + "AV-1760_Ru263_MITO human Cell_Ranger Lung Tumor Atlas \n", + "\n", + " reference \n", + "Sample \n", + "AV-1759_Ru1083_MITO GRCh38-3.0.0 \n", + "AV-1760_MSK_LX_1083c_T_2_MITO GRCh38-3.0.0 \n", + "AV-1761_POSIE_101920_T_1_MITO GRCh38-3.0.0 \n", + "AV-1762_Ru1083d_MITO GRCh38-3.0.0 \n", + "AV-1763_Ru1250C_T_1_MITO GRCh38-3.0.0 \n", + "AV-1764_MSK_LX_1250b_PM_1_MITO GRCh38-3.0.0 \n", + "AV-1764_Ru1250D_T_1_MITO GRCh38-3.0.0 \n", + "AV-1765_Ru1250e_MITO GRCh38-3.0.0 \n", + "AV-1766_MSK_LX_1250f_MITO GRCh38-3.0.0 \n", + "AV-1760_Ru263_MITO GRCh38-3.0.0 " + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# You can supply a list of IDs or request IDs\n", + "\n", + "# request_ids = ['BM-1408', 'BM-1286', ]\n", + "# request_ids = ['s3://dp-lab-data/collaborators/lowe/9P/IgG_A/', \n", + "# 's3://dp-lab-data/collaborators/lowe/9P/IgG_C/', \n", + "# 's3://dp-lab-data/collaborators/lowe/9P/IFNAR1_A/',\n", + "# 's3://dp-lab-data/collaborators/lowe/9P/IFNAR_A/'\n", + "# ]\n", + "# samples = sample_scridb_info(request_ids, 'AWS_storage', creds)\n", + "\n", + "sample_ids = list(range(3924, 3934))\n", + "samples = sample_scridb_info(sample_ids, 'id', creds)\n", + "\n", + "\n", + "# Specify the type of pipeline you are going to be running\n", + "# prefix = ''\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3c966b3d-a2cf-4200-909b-9d485112ae4a", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "5e2023cd-a58a-4b1c-8424-dbc30f5c8f88", + "metadata": {}, + "source": [ + "# FASTQs" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "3e8e1456-a502-4c35-a614-f1bc6e458d18", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
joe_sample_nameAWS_storagesample
0RU1083_LIVs3://dp-lab-data/SCRI_Projects/HTA/M...Ru1083_MITO
1RU1083_T2s3://dp-lab-data/SCRI_Projects/HTA/M...MSK_LX_1083c_T_2_MITO
2RU263_PDXs3://dp-lab-data/SCRI_Projects/HTA/M...Ru263_MITO
3RU1083_T1s3://dp-lab-data/SCRI_Projects/HTA/M...POSIE_101920_T_1_MITO
4RU1083_STs3://dp-lab-data/SCRI_Projects/HTA/M...Ru1083d_MITO
5RU1250_T1s3://dp-lab-data/SCRI_Projects/HTA/M...Ru1250C_T_1_MITO
6RU1250_PLs3://dp-lab-data/SCRI_Projects/HTA/M...MSK_LX_1250b_PM_1_MITO
7RU1250_T2s3://dp-lab-data/SCRI_Projects/HTA/M...Ru1250D_T_1_MITO
8RU1250_ASC1s3://dp-lab-data/SCRI_Projects/HTA/M...Ru1250e_MITO
9RU1250_ASC2s3://dp-lab-data/SCRI_Projects/HTA/M...MSK_LX_1250f_MITO
10RU581_LIVs3://dp-lab-data/SCRI_Projects/HTA/M...Ru581D_MITO
11RU581_Tas3://dp-lab-data/SCRI_Projects/HTA/M...Ru581b_T1_MITO
13RU581_LNas3://dp-lab-data/SCRI_Projects/HTA/M...Ru581c-LN1_MITO
\n", + "
" + ], + "text/plain": [ + " joe_sample_name AWS_storage \\\n", + "0 RU1083_LIV s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "1 RU1083_T2 s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "2 RU263_PDX s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "3 RU1083_T1 s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "4 RU1083_ST s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "5 RU1250_T1 s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "6 RU1250_PL s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "7 RU1250_T2 s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "8 RU1250_ASC1 s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "9 RU1250_ASC2 s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "10 RU581_LIV s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "11 RU581_Ta s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "13 RU581_LNa s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "\n", + " sample \n", + "0 Ru1083_MITO \n", + "1 MSK_LX_1083c_T_2_MITO \n", + "2 Ru263_MITO \n", + "3 POSIE_101920_T_1_MITO \n", + "4 Ru1083d_MITO \n", + "5 Ru1250C_T_1_MITO \n", + "6 MSK_LX_1250b_PM_1_MITO \n", + "7 Ru1250D_T_1_MITO \n", + "8 Ru1250e_MITO \n", + "9 MSK_LX_1250f_MITO \n", + "10 Ru581D_MITO \n", + "11 Ru581b_T1_MITO \n", + "13 Ru581c-LN1_MITO " + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples = pd.read_csv('joe_samples_unarchive.txt', index_col=0)\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "d89a8acf-4360-4b75-af0c-51af9be396a0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
joe_sample_nameAWS_storagesampleaws_pathFASTQs
0RU1083_LIVs3://dp-lab-data/SCRI_Projects/HTA/M...Ru1083_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...None
1RU1083_T2s3://dp-lab-data/SCRI_Projects/HTA/M...MSK_LX_1083c_T_2_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...None
2RU263_PDXs3://dp-lab-data/SCRI_Projects/HTA/M...Ru263_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...None
3RU1083_T1s3://dp-lab-data/SCRI_Projects/HTA/M...POSIE_101920_T_1_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...None
4RU1083_STs3://dp-lab-data/SCRI_Projects/HTA/M...Ru1083d_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...None
5RU1250_T1s3://dp-lab-data/SCRI_Projects/HTA/M...Ru1250C_T_1_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...None
6RU1250_PLs3://dp-lab-data/SCRI_Projects/HTA/M...MSK_LX_1250b_PM_1_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...None
7RU1250_T2s3://dp-lab-data/SCRI_Projects/HTA/M...Ru1250D_T_1_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...None
8RU1250_ASC1s3://dp-lab-data/SCRI_Projects/HTA/M...Ru1250e_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...None
9RU1250_ASC2s3://dp-lab-data/SCRI_Projects/HTA/M...MSK_LX_1250f_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...None
10RU581_LIVs3://dp-lab-data/SCRI_Projects/HTA/M...Ru581D_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...None
11RU581_Tas3://dp-lab-data/SCRI_Projects/HTA/M...Ru581b_T1_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...None
13RU581_LNas3://dp-lab-data/SCRI_Projects/HTA/M...Ru581c-LN1_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...None
\n", + "
" + ], + "text/plain": [ + " joe_sample_name AWS_storage \\\n", + "0 RU1083_LIV s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "1 RU1083_T2 s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "2 RU263_PDX s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "3 RU1083_T1 s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "4 RU1083_ST s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "5 RU1250_T1 s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "6 RU1250_PL s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "7 RU1250_T2 s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "8 RU1250_ASC1 s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "9 RU1250_ASC2 s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "10 RU581_LIV s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "11 RU581_Ta s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "13 RU581_LNa s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "\n", + " sample aws_path FASTQs \n", + "0 Ru1083_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... None \n", + "1 MSK_LX_1083c_T_2_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... None \n", + "2 Ru263_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... None \n", + "3 POSIE_101920_T_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... None \n", + "4 Ru1083d_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... None \n", + "5 Ru1250C_T_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... None \n", + "6 MSK_LX_1250b_PM_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... None \n", + "7 Ru1250D_T_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... None \n", + "8 Ru1250e_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... None \n", + "9 MSK_LX_1250f_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... None \n", + "10 Ru581D_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... None \n", + "11 Ru581b_T1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... None \n", + "13 Ru581c-LN1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... None " + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples['AWS_storage'] = samples['AWS_storage'].str.strip('/')\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "fec4f19e-a9c7-432a-b2ca-78b94c251eaf", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
joe_sample_nameAWS_storagesampleaws_pathFASTQs
0RU1083_LIVs3://dp-lab-data/SCRI_Projects/HTA/M...Ru1083_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...{'R2': ['s3://dp-lab-data/SCRI_Proje...
1RU1083_T2s3://dp-lab-data/SCRI_Projects/HTA/M...MSK_LX_1083c_T_2_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...{'R2': ['s3://dp-lab-data/SCRI_Proje...
2RU263_PDXs3://dp-lab-data/SCRI_Projects/HTA/M...Ru263_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...{'R2': ['s3://dp-lab-data/SCRI_Proje...
3RU1083_T1s3://dp-lab-data/SCRI_Projects/HTA/M...POSIE_101920_T_1_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...{'R2': ['s3://dp-lab-data/SCRI_Proje...
4RU1083_STs3://dp-lab-data/SCRI_Projects/HTA/M...Ru1083d_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...{'R2': ['s3://dp-lab-data/SCRI_Proje...
5RU1250_T1s3://dp-lab-data/SCRI_Projects/HTA/M...Ru1250C_T_1_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...{'R2': ['s3://dp-lab-data/SCRI_Proje...
6RU1250_PLs3://dp-lab-data/SCRI_Projects/HTA/M...MSK_LX_1250b_PM_1_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...{'R2': ['s3://dp-lab-data/SCRI_Proje...
7RU1250_T2s3://dp-lab-data/SCRI_Projects/HTA/M...Ru1250D_T_1_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...{'R2': ['s3://dp-lab-data/SCRI_Proje...
8RU1250_ASC1s3://dp-lab-data/SCRI_Projects/HTA/M...Ru1250e_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...{'R2': ['s3://dp-lab-data/SCRI_Proje...
9RU1250_ASC2s3://dp-lab-data/SCRI_Projects/HTA/M...MSK_LX_1250f_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...{'R2': ['s3://dp-lab-data/SCRI_Proje...
10RU581_LIVs3://dp-lab-data/SCRI_Projects/HTA/M...Ru581D_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...{'R2': ['s3://dp-lab-data/SCRI_Proje...
11RU581_Tas3://dp-lab-data/SCRI_Projects/HTA/M...Ru581b_T1_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...{'R2': ['s3://dp-lab-data/SCRI_Proje...
13RU581_LNas3://dp-lab-data/SCRI_Projects/HTA/M...Ru581c-LN1_MITOs3://dp-lab-data/SCRI_Projects/HTA/M...{'R2': ['s3://dp-lab-data/SCRI_Proje...
\n", + "
" + ], + "text/plain": [ + " joe_sample_name AWS_storage \\\n", + "0 RU1083_LIV s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "1 RU1083_T2 s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "2 RU263_PDX s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "3 RU1083_T1 s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "4 RU1083_ST s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "5 RU1250_T1 s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "6 RU1250_PL s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "7 RU1250_T2 s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "8 RU1250_ASC1 s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "9 RU1250_ASC2 s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "10 RU581_LIV s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "11 RU581_Ta s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "13 RU581_LNa s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "\n", + " sample aws_path \\\n", + "0 Ru1083_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "1 MSK_LX_1083c_T_2_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "2 Ru263_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "3 POSIE_101920_T_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "4 Ru1083d_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "5 Ru1250C_T_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "6 MSK_LX_1250b_PM_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "7 Ru1250D_T_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "8 Ru1250e_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "9 MSK_LX_1250f_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "10 Ru581D_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "11 Ru581b_T1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "13 Ru581c-LN1_MITO s3://dp-lab-data/SCRI_Projects/HTA/M... \n", + "\n", + " FASTQs \n", + "0 {'R2': ['s3://dp-lab-data/SCRI_Proje... \n", + "1 {'R2': ['s3://dp-lab-data/SCRI_Proje... \n", + "2 {'R2': ['s3://dp-lab-data/SCRI_Proje... \n", + "3 {'R2': ['s3://dp-lab-data/SCRI_Proje... \n", + "4 {'R2': ['s3://dp-lab-data/SCRI_Proje... \n", + "5 {'R2': ['s3://dp-lab-data/SCRI_Proje... \n", + "6 {'R2': ['s3://dp-lab-data/SCRI_Proje... \n", + "7 {'R2': ['s3://dp-lab-data/SCRI_Proje... \n", + "8 {'R2': ['s3://dp-lab-data/SCRI_Proje... \n", + "9 {'R2': ['s3://dp-lab-data/SCRI_Proje... \n", + "10 {'R2': ['s3://dp-lab-data/SCRI_Proje... \n", + "11 {'R2': ['s3://dp-lab-data/SCRI_Proje... \n", + "13 {'R2': ['s3://dp-lab-data/SCRI_Proje... " + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples[\"FASTQs\"] = samples[\"AWS_storage\"].apply(lambda x: get_fastqs(x, ['R2'], \"FASTQ\"))\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "929d6279-ddaf-4855-a3fa-1d8440af5d48", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Ru1083_MITO\n", + "MSK_LX_1083c_T_2_MITO\n", + "Ru263_MITO\n", + "POSIE_101920_T_1_MITO\n", + "Ru1083d_MITO\n", + "Ru1250C_T_1_MITO\n", + "MSK_LX_1250b_PM_1_MITO\n", + "Ru1250D_T_1_MITO\n", + "Ru1250e_MITO\n", + "MSK_LX_1250f_MITO\n", + "Ru581D_MITO\n", + "Ru581b_T1_MITO\n", + "Ru581c-LN1_MITO\n" + ] + } + ], + "source": [ + "for sample, row in samples.iterrows():\n", + " sample = row['sample']\n", + " print(sample)\n", + " \n", + " fastqs = row['FASTQs']\n", + " fastqs = list(np.ravel(list(fastqs.values())))\n", + " \n", + " for fastq in fastqs:\n", + " file = fastq.replace('s3://', '')\n", + " bucket = file.split('/')[0]\n", + " key = file.replace(f'{bucket}/', '')\n", + "\n", + " cmd = f'aws s3api restore-object --bucket {bucket} --key {key} --restore-request '\n", + " cmd += '\\'{\"Days\":25, \"GlacierJobParameters\":{\"Tier\":\"Standard\"}}\\''\n", + " os.system(cmd)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "97a8d236-7723-445c-bf9c-e83c5580946e", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "df01855a-c372-42cd-b23a-ebf5a7085af8", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "234696ce-4a50-4518-837b-e4bb0f37023c", + "metadata": {}, + "source": [ + "# SEQC" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "96d1e728-dba4-42b3-8599-2a1c479d4a33", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
AWS_storageidspeciessc_techproject_idreferenceFASTQs
Sample
IgG_As3://dp-lab-data/collaborators/lowe/...2638mouse10X_V3.19ps3://seqc-public/genomes/mm38_long_p...{'R1': ['s3://dp-lab-data/collaborat...
IgG_Cs3://dp-lab-data/collaborators/lowe/...2639mouse10X_V3.19ps3://seqc-public/genomes/mm38_long_p...{'R1': ['s3://dp-lab-data/collaborat...
IFNAR_As3://dp-lab-data/collaborators/lowe/...2640mouse10X_V3.19ps3://seqc-public/genomes/mm38_long_p...{'R1': ['s3://dp-lab-data/collaborat...
IgG_As3://dp-lab-data/collaborators/lowe/...2917mouse10X_V3.19ps3://seqc-public/genomes/mm38_long_p...{'R1': ['s3://dp-lab-data/collaborat...
IgG_Cs3://dp-lab-data/collaborators/lowe/...2918mouse10X_V3.19ps3://seqc-public/genomes/mm38_long_p...{'R1': ['s3://dp-lab-data/collaborat...
IFNAR1_As3://dp-lab-data/collaborators/lowe/...2919mouse10X_V3.19ps3://seqc-public/genomes/mm38_long_p...{'R1': ['s3://dp-lab-data/collaborat...
\n", + "
" + ], + "text/plain": [ + " AWS_storage id species sc_tech \\\n", + "Sample \n", + "IgG_A s3://dp-lab-data/collaborators/lowe/... 2638 mouse 10X_V3.1 \n", + "IgG_C s3://dp-lab-data/collaborators/lowe/... 2639 mouse 10X_V3.1 \n", + "IFNAR_A s3://dp-lab-data/collaborators/lowe/... 2640 mouse 10X_V3.1 \n", + "IgG_A s3://dp-lab-data/collaborators/lowe/... 2917 mouse 10X_V3.1 \n", + "IgG_C s3://dp-lab-data/collaborators/lowe/... 2918 mouse 10X_V3.1 \n", + "IFNAR1_A s3://dp-lab-data/collaborators/lowe/... 2919 mouse 10X_V3.1 \n", + "\n", + " project_id reference \\\n", + "Sample \n", + "IgG_A 9p s3://seqc-public/genomes/mm38_long_p... \n", + "IgG_C 9p s3://seqc-public/genomes/mm38_long_p... \n", + "IFNAR_A 9p s3://seqc-public/genomes/mm38_long_p... \n", + "IgG_A 9p s3://seqc-public/genomes/mm38_long_p... \n", + "IgG_C 9p s3://seqc-public/genomes/mm38_long_p... \n", + "IFNAR1_A 9p s3://seqc-public/genomes/mm38_long_p... \n", + "\n", + " FASTQs \n", + "Sample \n", + "IgG_A {'R1': ['s3://dp-lab-data/collaborat... \n", + "IgG_C {'R1': ['s3://dp-lab-data/collaborat... \n", + "IFNAR_A {'R1': ['s3://dp-lab-data/collaborat... \n", + "IgG_A {'R1': ['s3://dp-lab-data/collaborat... \n", + "IgG_C {'R1': ['s3://dp-lab-data/collaborat... \n", + "IFNAR1_A {'R1': ['s3://dp-lab-data/collaborat... " + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples[\"FASTQs\"] = samples[\"AWS_storage\"].apply(lambda x: get_fastqs(x, ['R1'], \"barcode\"))\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "032216a0-eeb7-41cd-8d35-6a8953b38a0f", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "An error occurred (RestoreAlreadyInProgress) when calling the RestoreObject operation: Object restore is already in progress\n", + "\n", + "An error occurred (RestoreAlreadyInProgress) when calling the RestoreObject operation: Object restore is already in progress\n", + "\n", + "An error occurred (RestoreAlreadyInProgress) when calling the RestoreObject operation: Object restore is already in progress\n", + "\n", + "An error occurred (RestoreAlreadyInProgress) when calling the RestoreObject operation: Object restore is already in progress\n", + "\n", + "An error occurred (RestoreAlreadyInProgress) when calling the RestoreObject operation: Object restore is already in progress\n", + "\n", + "An error occurred (RestoreAlreadyInProgress) when calling the RestoreObject operation: Object restore is already in progress\n", + "\n", + "An error occurred (RestoreAlreadyInProgress) when calling the RestoreObject operation: Object restore is already in progress\n", + "\n", + "An error occurred (RestoreAlreadyInProgress) when calling the RestoreObject operation: Object restore is already in progress\n", + "\n", + "An error occurred (RestoreAlreadyInProgress) when calling the RestoreObject operation: Object restore is already in progress\n", + "\n", + "An error occurred (RestoreAlreadyInProgress) when calling the RestoreObject operation: Object restore is already in progress\n", + "\n", + "An error occurred (RestoreAlreadyInProgress) when calling the RestoreObject operation: Object restore is already in progress\n", + "\n", + "An error occurred (RestoreAlreadyInProgress) when calling the RestoreObject operation: Object restore is already in progress\n", + "\n", + "An error occurred (RestoreAlreadyInProgress) when calling the RestoreObject operation: Object restore is already in progress\n", + "\n", + "An error occurred (RestoreAlreadyInProgress) when calling the RestoreObject operation: Object restore is already in progress\n", + "\n", + "An error occurred (RestoreAlreadyInProgress) when calling the RestoreObject operation: Object restore is already in progress\n", + "\n", + "An error occurred (RestoreAlreadyInProgress) when calling the RestoreObject operation: Object restore is already in progress\n" + ] + } + ], + "source": [ + "for sample, row in samples.iterrows():\n", + " fastqs = row['FASTQs']\n", + " fastqs = list(np.ravel(list(fastqs.values())))\n", + " \n", + " for fastq in fastqs:\n", + " file = fastq.replace('s3://', '')\n", + " bucket = file.split('/')[0]\n", + " key = file.replace(f'{bucket}/', '')\n", + "\n", + " cmd = f'aws s3api restore-object --bucket {bucket} --key {key} --restore-request '\n", + " cmd += '\\'{\"Days\":25, \"GlacierJobParameters\":{\"Tier\":\"Standard\"}}\\''\n", + " os.system(cmd)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "532ea79c-9ce1-416e-b6c8-fece3af49346", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "0c2ebf81-4ad0-48aa-a917-e6ecea929b6c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
AWS_storageidspeciessc_techproject_idreferenceFASTQs
Sample
IgG_As3://dp-lab-data/collaborators/lowe/...2638mouse10X_V3.19ps3://seqc-public/genomes/mm38_long_p...{'R2': ['s3://dp-lab-data/collaborat...
IgG_Cs3://dp-lab-data/collaborators/lowe/...2639mouse10X_V3.19ps3://seqc-public/genomes/mm38_long_p...{'R2': ['s3://dp-lab-data/collaborat...
IFNAR_As3://dp-lab-data/collaborators/lowe/...2640mouse10X_V3.19ps3://seqc-public/genomes/mm38_long_p...{'R2': ['s3://dp-lab-data/collaborat...
IgG_As3://dp-lab-data/collaborators/lowe/...2917mouse10X_V3.19ps3://seqc-public/genomes/mm38_long_p...{'R2': ['s3://dp-lab-data/collaborat...
IgG_Cs3://dp-lab-data/collaborators/lowe/...2918mouse10X_V3.19ps3://seqc-public/genomes/mm38_long_p...{'R2': ['s3://dp-lab-data/collaborat...
IFNAR1_As3://dp-lab-data/collaborators/lowe/...2919mouse10X_V3.19ps3://seqc-public/genomes/mm38_long_p...{'R2': ['s3://dp-lab-data/collaborat...
\n", + "
" + ], + "text/plain": [ + " AWS_storage id species sc_tech \\\n", + "Sample \n", + "IgG_A s3://dp-lab-data/collaborators/lowe/... 2638 mouse 10X_V3.1 \n", + "IgG_C s3://dp-lab-data/collaborators/lowe/... 2639 mouse 10X_V3.1 \n", + "IFNAR_A s3://dp-lab-data/collaborators/lowe/... 2640 mouse 10X_V3.1 \n", + "IgG_A s3://dp-lab-data/collaborators/lowe/... 2917 mouse 10X_V3.1 \n", + "IgG_C s3://dp-lab-data/collaborators/lowe/... 2918 mouse 10X_V3.1 \n", + "IFNAR1_A s3://dp-lab-data/collaborators/lowe/... 2919 mouse 10X_V3.1 \n", + "\n", + " project_id reference \\\n", + "Sample \n", + "IgG_A 9p s3://seqc-public/genomes/mm38_long_p... \n", + "IgG_C 9p s3://seqc-public/genomes/mm38_long_p... \n", + "IFNAR_A 9p s3://seqc-public/genomes/mm38_long_p... \n", + "IgG_A 9p s3://seqc-public/genomes/mm38_long_p... \n", + "IgG_C 9p s3://seqc-public/genomes/mm38_long_p... \n", + "IFNAR1_A 9p s3://seqc-public/genomes/mm38_long_p... \n", + "\n", + " FASTQs \n", + "Sample \n", + "IgG_A {'R2': ['s3://dp-lab-data/collaborat... \n", + "IgG_C {'R2': ['s3://dp-lab-data/collaborat... \n", + "IFNAR_A {'R2': ['s3://dp-lab-data/collaborat... \n", + "IgG_A {'R2': ['s3://dp-lab-data/collaborat... \n", + "IgG_C {'R2': ['s3://dp-lab-data/collaborat... \n", + "IFNAR1_A {'R2': ['s3://dp-lab-data/collaborat... " + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples[\"FASTQs\"] = samples[\"AWS_storage\"].apply(lambda x: get_fastqs(x, ['R2'], \"genomic\"))\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "fb9a6253-e6c4-4ab4-9c71-3c9e5938b05e", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "An error occurred (RestoreAlreadyInProgress) when calling the RestoreObject operation: Object restore is already in progress\n", + "\n", + "An error occurred (RestoreAlreadyInProgress) when calling the RestoreObject operation: Object restore is already in progress\n", + "\n", + "An error occurred (RestoreAlreadyInProgress) when calling the RestoreObject operation: Object restore is already in progress\n", + "\n", + "An error occurred (RestoreAlreadyInProgress) when calling the RestoreObject operation: Object restore is already in progress\n", + "\n", + "An error occurred (RestoreAlreadyInProgress) when calling the RestoreObject operation: Object restore is already in progress\n", + "\n", + "An error occurred (RestoreAlreadyInProgress) when calling the RestoreObject operation: Object restore is already in progress\n", + "\n", + "An error occurred (RestoreAlreadyInProgress) when calling the RestoreObject operation: Object restore is already in progress\n", + "\n", + "An error occurred (RestoreAlreadyInProgress) when calling the RestoreObject operation: Object restore is already in progress\n", + "\n", + "An error occurred (RestoreAlreadyInProgress) when calling the RestoreObject operation: Object restore is already in progress\n", + "\n", + "An error occurred (RestoreAlreadyInProgress) when calling the RestoreObject operation: Object restore is already in progress\n", + "\n", + "An error occurred (RestoreAlreadyInProgress) when calling the RestoreObject operation: Object restore is already in progress\n", + "\n", + "An error occurred (RestoreAlreadyInProgress) when calling the RestoreObject operation: Object restore is already in progress\n", + "\n", + "An error occurred (RestoreAlreadyInProgress) when calling the RestoreObject operation: Object restore is already in progress\n", + "\n", + "An error occurred (RestoreAlreadyInProgress) when calling the RestoreObject operation: Object restore is already in progress\n", + "\n", + "An error occurred (RestoreAlreadyInProgress) when calling the RestoreObject operation: Object restore is already in progress\n", + "\n", + "An error occurred (RestoreAlreadyInProgress) when calling the RestoreObject operation: Object restore is already in progress\n" + ] + } + ], + "source": [ + "for sample, row in samples.iterrows():\n", + " fastqs = row['FASTQs']\n", + " fastqs = list(np.ravel(list(fastqs.values())))\n", + " \n", + " for fastq in fastqs:\n", + " file = fastq.replace('s3://', '')\n", + " bucket = file.split('/')[0]\n", + " key = file.replace(f'{bucket}/', '')\n", + "\n", + " cmd = f'aws s3api restore-object --bucket {bucket} --key {key} --restore-request '\n", + " cmd += '\\'{\"Days\":25, \"GlacierJobParameters\":{\"Tier\":\"Standard\"}}\\''\n", + " os.system(cmd)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "57a9c7e1-3a88-42e7-8f28-06f48a4e3f97", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "2fd9753e-6c19-496c-a265-123121826222", + "metadata": {}, + "source": [ + "# Joe mito" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "id": "871dd670-8c1f-4e2b-a368-98302c5c0208", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
sample_nameaws_path
0epi_Ru581D_MITOs3://dp-lab-data/SCRI_Projects/HTA/...
2epi_Ru581b_T1_MITOs3://dp-lab-data/SCRI_Projects/HTA/...
4epi_Ru581c-LN1_MITOs3://dp-lab-data/SCRI_Projects/HTA/...
6epi_Ru1083_MITOs3://dp-lab-data/SCRI_Projects/HTA/...
8epi_MSK_LX_1083c_T_2_MITOs3://dp-lab-data/SCRI_Projects/HTA/...
10epi_POSIE_101920_T_1_MITOs3://dp-lab-data/SCRI_Projects/HTA/...
12epi_Ru1083d_MITOs3://dp-lab-data/SCRI_Projects/HTA/...
14epi_Ru1250C_T_1_MITOs3://dp-lab-data/SCRI_Projects/HTA/...
16epi_MSK_LX_1250b_PM_1_MITOs3://dp-lab-data/SCRI_Projects/HTA/...
18epi_Ru1250D_T_1_MITOs3://dp-lab-data/SCRI_Projects/HTA/...
20epi_Ru1250e_MITOs3://dp-lab-data/SCRI_Projects/HTA/...
22epi_MSK_LX_1250f_MITOs3://dp-lab-data/SCRI_Projects/HTA/...
24epi_Ru263_MITOs3://dp-lab-data/SCRI_Projects/HTA/...
\n", + "
" + ], + "text/plain": [ + " sample_name aws_path\n", + "0 epi_Ru581D_MITO s3://dp-lab-data/SCRI_Projects/HTA/...\n", + "2 epi_Ru581b_T1_MITO s3://dp-lab-data/SCRI_Projects/HTA/...\n", + "4 epi_Ru581c-LN1_MITO s3://dp-lab-data/SCRI_Projects/HTA/...\n", + "6 epi_Ru1083_MITO s3://dp-lab-data/SCRI_Projects/HTA/...\n", + "8 epi_MSK_LX_1083c_T_2_MITO s3://dp-lab-data/SCRI_Projects/HTA/...\n", + "10 epi_POSIE_101920_T_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/...\n", + "12 epi_Ru1083d_MITO s3://dp-lab-data/SCRI_Projects/HTA/...\n", + "14 epi_Ru1250C_T_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/...\n", + "16 epi_MSK_LX_1250b_PM_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/...\n", + "18 epi_Ru1250D_T_1_MITO s3://dp-lab-data/SCRI_Projects/HTA/...\n", + "20 epi_Ru1250e_MITO s3://dp-lab-data/SCRI_Projects/HTA/...\n", + "22 epi_MSK_LX_1250f_MITO s3://dp-lab-data/SCRI_Projects/HTA/...\n", + "24 epi_Ru263_MITO s3://dp-lab-data/SCRI_Projects/HTA/..." + ] + }, + "execution_count": 58, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples = pd.read_csv('joe_samples.csv')\n", + "samples = samples.loc[samples['sample_name'].str.startswith('epi')]\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "dd2e640a-9647-4726-b44d-55ac1db70447", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['sample_name', ' aws_path']" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "list(samples)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "e9cf5684-8c83-4a76-8046-b2b86a8e23cc", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/barcodes_rna/Ru581D_MITO/epi_mito-tracing-outs\n", + "0\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "An error occurred (InvalidToken) when calling the RestoreObject operation: The provided token is malformed or otherwise invalid.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/barcodes_rna/Ru581b_T1_MITO/epi_mito-tracing-outs\n", + "2\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "An error occurred (InvalidToken) when calling the RestoreObject operation: The provided token is malformed or otherwise invalid.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/barcodes_rna/Ru581c-LN1_MITO/epi_mito-tracing-outs\n", + "4\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "An error occurred (InvalidToken) when calling the RestoreObject operation: The provided token is malformed or otherwise invalid.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1759_Ru1083_MITO/epi_mito-tracing-outs\n", + "6\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "An error occurred (InvalidToken) when calling the RestoreObject operation: The provided token is malformed or otherwise invalid.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1760_MSK_LX_1083c_T_2_MITO/epi_mito-tracing-outs\n", + "8\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "An error occurred (InvalidToken) when calling the RestoreObject operation: The provided token is malformed or otherwise invalid.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1761_POSIE_101920_T_1_MITO/epi_mito-tracing-outs\n", + "10\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "An error occurred (InvalidToken) when calling the RestoreObject operation: The provided token is malformed or otherwise invalid.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1762_Ru1083d_MITO/epi_mito-tracing-outs\n", + "12\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "An error occurred (InvalidToken) when calling the RestoreObject operation: The provided token is malformed or otherwise invalid.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1763_Ru1250C_T_1_MITO/epi_mito-tracing-outs\n", + "14\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "An error occurred (InvalidToken) when calling the RestoreObject operation: The provided token is malformed or otherwise invalid.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1764_MSK_LX_1250b_PM_1_MITO/epi_mito-tracing-outs\n", + "16\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "An error occurred (InvalidToken) when calling the RestoreObject operation: The provided token is malformed or otherwise invalid.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1764_Ru1250D_T_1_MITO/epi_mito-tracing-outs\n", + "18\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "An error occurred (InvalidToken) when calling the RestoreObject operation: The provided token is malformed or otherwise invalid.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1765_Ru1250e_MITO/epi_mito-tracing-outs\n", + "20\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "An error occurred (InvalidToken) when calling the RestoreObject operation: The provided token is malformed or otherwise invalid.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1766_MSK_LX_1250f_MITO/epi_mito-tracing-outs\n", + "22\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "An error occurred (InvalidToken) when calling the RestoreObject operation: The provided token is malformed or otherwise invalid.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1760_Ru263_MITO/epi_mito-tracing-outs\n", + "24\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "An error occurred (InvalidToken) when calling the RestoreObject operation: The provided token is malformed or otherwise invalid.\n" + ] + } + ], + "source": [ + "for sample, row in samples.iterrows():\n", + " path = row[' aws_path']\n", + " path = os.path.join(path, )\n", + " print(path)\n", + " \n", + " print(sample)\n", + " file = path.replace('s3://', '')\n", + " bucket = file.split('/')[0]\n", + " key = file.replace(f'{bucket}/', '')\n", + "\n", + " cmd = f'aws s3api restore-object --bucket {bucket} --key {key} --restore-request '\n", + " cmd += '\\'{\"Days\":25, \"GlacierJobParameters\":{\"Tier\":\"Standard\"}}\\''\n", + " os.system(cmd)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e63e9ce1-af7f-4e71-be8c-3ccef391c17b", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "be0a9e07-127e-4797-90ec-6d6b0eb8560d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "An error occurred (InvalidToken) when calling the ListObjectsV2 operation: The provided token is malformed or otherwise invalid.\n" + ] + } + ], + "source": [ + "!aws s3 ls s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/barcodes_rna/Ru581D_MITO/epi_mito-tracing-outs/\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d1246359-b8c2-4b57-be86-5fe97daf5846", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "8d3862bb-1e0b-4aff-99ef-6d54f155316d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "' s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1760_Ru263_MITO/epi_mito-tracing-outs'" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "path" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "42939eaa-b8a1-471b-993a-15a8f54c202f", + "metadata": {}, + "outputs": [ + { + "ename": "ClientError", + "evalue": "An error occurred (InvalidToken) when calling the ListObjects operation: The provided token is malformed or otherwise invalid.", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mClientError\u001b[0m Traceback (most recent call last)", + "Input \u001b[0;32mIn [15]\u001b[0m, in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mget_s3_objects\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mdp-lab-data\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mSCRI_Projects/HTA/Mito_tracing/AV-1760_Ru263_MITO/epi_mito-tracing-outs/\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m \u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mper-barcode.G.vcf.tar\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/scing/scing-notebooks/notebooks/utils/utils.py:200\u001b[0m, in \u001b[0;36mget_s3_objects\u001b[0;34m(bucket, key, pattern, full_uri)\u001b[0m\n\u001b[1;32m 198\u001b[0m bucket_s3 \u001b[38;5;241m=\u001b[39m s3r\u001b[38;5;241m.\u001b[39mBucket(bucket)\n\u001b[1;32m 199\u001b[0m objects \u001b[38;5;241m=\u001b[39m []\n\u001b[0;32m--> 200\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m obj \u001b[38;5;129;01min\u001b[39;00m bucket_s3\u001b[38;5;241m.\u001b[39mobjects\u001b[38;5;241m.\u001b[39mfilter(Prefix\u001b[38;5;241m=\u001b[39mkey):\n\u001b[1;32m 201\u001b[0m hit \u001b[38;5;241m=\u001b[39m pattern\u001b[38;5;241m.\u001b[39msearch(obj\u001b[38;5;241m.\u001b[39mkey)\n\u001b[1;32m 202\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m hit:\n", + "File \u001b[0;32m~/miniconda3/envs/scing/lib/python3.8/site-packages/boto3/resources/collection.py:81\u001b[0m, in \u001b[0;36mResourceCollection.__iter__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 78\u001b[0m limit \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_params\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlimit\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m)\n\u001b[1;32m 80\u001b[0m count \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m0\u001b[39m\n\u001b[0;32m---> 81\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m page \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpages():\n\u001b[1;32m 82\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m item \u001b[38;5;129;01min\u001b[39;00m page:\n\u001b[1;32m 83\u001b[0m \u001b[38;5;28;01myield\u001b[39;00m item\n", + "File \u001b[0;32m~/miniconda3/envs/scing/lib/python3.8/site-packages/boto3/resources/collection.py:171\u001b[0m, in \u001b[0;36mResourceCollection.pages\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 168\u001b[0m \u001b[38;5;66;03m# Now that we have a page iterator or single page of results\u001b[39;00m\n\u001b[1;32m 169\u001b[0m \u001b[38;5;66;03m# we start processing and yielding individual items.\u001b[39;00m\n\u001b[1;32m 170\u001b[0m count \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m0\u001b[39m\n\u001b[0;32m--> 171\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m page \u001b[38;5;129;01min\u001b[39;00m pages:\n\u001b[1;32m 172\u001b[0m page_items \u001b[38;5;241m=\u001b[39m []\n\u001b[1;32m 173\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m item \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_handler(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_parent, params, page):\n", + "File \u001b[0;32m~/miniconda3/envs/scing/lib/python3.8/site-packages/botocore/paginate.py:264\u001b[0m, in \u001b[0;36mPageIterator.__iter__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 262\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_inject_starting_params(current_kwargs)\n\u001b[1;32m 263\u001b[0m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[0;32m--> 264\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_make_request\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcurrent_kwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 265\u001b[0m parsed \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_extract_parsed_response(response)\n\u001b[1;32m 266\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m first_request:\n\u001b[1;32m 267\u001b[0m \u001b[38;5;66;03m# The first request is handled differently. We could\u001b[39;00m\n\u001b[1;32m 268\u001b[0m \u001b[38;5;66;03m# possibly have a resume/starting token that tells us where\u001b[39;00m\n\u001b[1;32m 269\u001b[0m \u001b[38;5;66;03m# to index into the retrieved page.\u001b[39;00m\n", + "File \u001b[0;32m~/miniconda3/envs/scing/lib/python3.8/site-packages/botocore/paginate.py:352\u001b[0m, in \u001b[0;36mPageIterator._make_request\u001b[0;34m(self, current_kwargs)\u001b[0m\n\u001b[1;32m 351\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_make_request\u001b[39m(\u001b[38;5;28mself\u001b[39m, current_kwargs):\n\u001b[0;32m--> 352\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_method\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mcurrent_kwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniconda3/envs/scing/lib/python3.8/site-packages/botocore/client.py:508\u001b[0m, in \u001b[0;36mClientCreator._create_api_method.._api_call\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 504\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m(\n\u001b[1;32m 505\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mpy_operation_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m() only accepts keyword arguments.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 506\u001b[0m )\n\u001b[1;32m 507\u001b[0m \u001b[38;5;66;03m# The \"self\" in this scope is referring to the BaseClient.\u001b[39;00m\n\u001b[0;32m--> 508\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_make_api_call\u001b[49m\u001b[43m(\u001b[49m\u001b[43moperation_name\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniconda3/envs/scing/lib/python3.8/site-packages/botocore/client.py:911\u001b[0m, in \u001b[0;36mBaseClient._make_api_call\u001b[0;34m(self, operation_name, api_params)\u001b[0m\n\u001b[1;32m 909\u001b[0m error_code \u001b[38;5;241m=\u001b[39m parsed_response\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mError\u001b[39m\u001b[38;5;124m\"\u001b[39m, {})\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mCode\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 910\u001b[0m error_class \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mexceptions\u001b[38;5;241m.\u001b[39mfrom_code(error_code)\n\u001b[0;32m--> 911\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m error_class(parsed_response, operation_name)\n\u001b[1;32m 912\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 913\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m parsed_response\n", + "\u001b[0;31mClientError\u001b[0m: An error occurred (InvalidToken) when calling the ListObjects operation: The provided token is malformed or otherwise invalid." + ] + } + ], + "source": [ + "get_s3_objects('dp-lab-data', 'SCRI_Projects/HTA/Mito_tracing/AV-1760_Ru263_MITO/epi_mito-tracing-outs/' , 'per-barcode.G.vcf.tar')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "12f89ef7-8a16-48f8-9c20-8f29b2d22645", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "80d11971-f5a9-4ee4-b88f-aade34db7b12", + "metadata": {}, + "outputs": [], + "source": [ + "# Get every FASTQ in a folder\n", + "def get_all_files(\n", + " path: str, # path to directory containing FASTQ files\n", + " # folder: str = \"\",\n", + "):\n", + " _, bucket, key, _, _ = urllib.parse.urlsplit(path)\n", + " files = get_s3_objects(\n", + " bucket, key.lstrip(\"/\"),\n", + " re.compile(f\"tar\")\n", + " )\n", + " \n", + " try:\n", + " fastqs = [os.path.join(\"s3://\", bucket, str(f)) for f in files]\n", + " except AssertionError as err:\n", + " logging.warning(\"%s\\n\\t %s\", err, path)\n", + " return\n", + " return fastqs" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "909f2351-ad6a-4322-8945-c67c5756df08", + "metadata": {}, + "outputs": [ + { + "ename": "ClientError", + "evalue": "An error occurred (InvalidToken) when calling the ListObjects operation: The provided token is malformed or otherwise invalid.", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mClientError\u001b[0m Traceback (most recent call last)", + "Input \u001b[0;32mIn [25]\u001b[0m, in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mget_all_files\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpath\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstrip\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n", + "Input \u001b[0;32mIn [24]\u001b[0m, in \u001b[0;36mget_all_files\u001b[0;34m(path)\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mget_all_files\u001b[39m(\n\u001b[1;32m 3\u001b[0m path: \u001b[38;5;28mstr\u001b[39m, \u001b[38;5;66;03m# path to directory containing FASTQ files\u001b[39;00m\n\u001b[1;32m 4\u001b[0m \u001b[38;5;66;03m# folder: str = \"\",\u001b[39;00m\n\u001b[1;32m 5\u001b[0m ):\n\u001b[1;32m 6\u001b[0m _, bucket, key, _, _ \u001b[38;5;241m=\u001b[39m urllib\u001b[38;5;241m.\u001b[39mparse\u001b[38;5;241m.\u001b[39murlsplit(path)\n\u001b[0;32m----> 7\u001b[0m files \u001b[38;5;241m=\u001b[39m \u001b[43mget_s3_objects\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 8\u001b[0m \u001b[43m \u001b[49m\u001b[43mbucket\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkey\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mlstrip\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m/\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 9\u001b[0m \u001b[43m \u001b[49m\u001b[43mre\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcompile\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43mf\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mtar\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 10\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 12\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 13\u001b[0m fastqs \u001b[38;5;241m=\u001b[39m [os\u001b[38;5;241m.\u001b[39mpath\u001b[38;5;241m.\u001b[39mjoin(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124ms3://\u001b[39m\u001b[38;5;124m\"\u001b[39m, bucket, \u001b[38;5;28mstr\u001b[39m(f)) \u001b[38;5;28;01mfor\u001b[39;00m f \u001b[38;5;129;01min\u001b[39;00m files]\n", + "File \u001b[0;32m~/scing/scing-notebooks/notebooks/utils/utils.py:200\u001b[0m, in \u001b[0;36mget_s3_objects\u001b[0;34m(bucket, key, pattern, full_uri)\u001b[0m\n\u001b[1;32m 198\u001b[0m bucket_s3 \u001b[38;5;241m=\u001b[39m s3r\u001b[38;5;241m.\u001b[39mBucket(bucket)\n\u001b[1;32m 199\u001b[0m objects \u001b[38;5;241m=\u001b[39m []\n\u001b[0;32m--> 200\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m obj \u001b[38;5;129;01min\u001b[39;00m bucket_s3\u001b[38;5;241m.\u001b[39mobjects\u001b[38;5;241m.\u001b[39mfilter(Prefix\u001b[38;5;241m=\u001b[39mkey):\n\u001b[1;32m 201\u001b[0m hit \u001b[38;5;241m=\u001b[39m pattern\u001b[38;5;241m.\u001b[39msearch(obj\u001b[38;5;241m.\u001b[39mkey)\n\u001b[1;32m 202\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m hit:\n", + "File \u001b[0;32m~/miniconda3/envs/scing/lib/python3.8/site-packages/boto3/resources/collection.py:81\u001b[0m, in \u001b[0;36mResourceCollection.__iter__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 78\u001b[0m limit \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_params\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlimit\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m)\n\u001b[1;32m 80\u001b[0m count \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m0\u001b[39m\n\u001b[0;32m---> 81\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m page \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpages():\n\u001b[1;32m 82\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m item \u001b[38;5;129;01min\u001b[39;00m page:\n\u001b[1;32m 83\u001b[0m \u001b[38;5;28;01myield\u001b[39;00m item\n", + "File \u001b[0;32m~/miniconda3/envs/scing/lib/python3.8/site-packages/boto3/resources/collection.py:171\u001b[0m, in \u001b[0;36mResourceCollection.pages\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 168\u001b[0m \u001b[38;5;66;03m# Now that we have a page iterator or single page of results\u001b[39;00m\n\u001b[1;32m 169\u001b[0m \u001b[38;5;66;03m# we start processing and yielding individual items.\u001b[39;00m\n\u001b[1;32m 170\u001b[0m count \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m0\u001b[39m\n\u001b[0;32m--> 171\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m page \u001b[38;5;129;01min\u001b[39;00m pages:\n\u001b[1;32m 172\u001b[0m page_items \u001b[38;5;241m=\u001b[39m []\n\u001b[1;32m 173\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m item \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_handler(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_parent, params, page):\n", + "File \u001b[0;32m~/miniconda3/envs/scing/lib/python3.8/site-packages/botocore/paginate.py:264\u001b[0m, in \u001b[0;36mPageIterator.__iter__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 262\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_inject_starting_params(current_kwargs)\n\u001b[1;32m 263\u001b[0m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[0;32m--> 264\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_make_request\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcurrent_kwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 265\u001b[0m parsed \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_extract_parsed_response(response)\n\u001b[1;32m 266\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m first_request:\n\u001b[1;32m 267\u001b[0m \u001b[38;5;66;03m# The first request is handled differently. We could\u001b[39;00m\n\u001b[1;32m 268\u001b[0m \u001b[38;5;66;03m# possibly have a resume/starting token that tells us where\u001b[39;00m\n\u001b[1;32m 269\u001b[0m \u001b[38;5;66;03m# to index into the retrieved page.\u001b[39;00m\n", + "File \u001b[0;32m~/miniconda3/envs/scing/lib/python3.8/site-packages/botocore/paginate.py:352\u001b[0m, in \u001b[0;36mPageIterator._make_request\u001b[0;34m(self, current_kwargs)\u001b[0m\n\u001b[1;32m 351\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_make_request\u001b[39m(\u001b[38;5;28mself\u001b[39m, current_kwargs):\n\u001b[0;32m--> 352\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_method\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mcurrent_kwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniconda3/envs/scing/lib/python3.8/site-packages/botocore/client.py:508\u001b[0m, in \u001b[0;36mClientCreator._create_api_method.._api_call\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 504\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m(\n\u001b[1;32m 505\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mpy_operation_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m() only accepts keyword arguments.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 506\u001b[0m )\n\u001b[1;32m 507\u001b[0m \u001b[38;5;66;03m# The \"self\" in this scope is referring to the BaseClient.\u001b[39;00m\n\u001b[0;32m--> 508\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_make_api_call\u001b[49m\u001b[43m(\u001b[49m\u001b[43moperation_name\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniconda3/envs/scing/lib/python3.8/site-packages/botocore/client.py:911\u001b[0m, in \u001b[0;36mBaseClient._make_api_call\u001b[0;34m(self, operation_name, api_params)\u001b[0m\n\u001b[1;32m 909\u001b[0m error_code \u001b[38;5;241m=\u001b[39m parsed_response\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mError\u001b[39m\u001b[38;5;124m\"\u001b[39m, {})\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mCode\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 910\u001b[0m error_class \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mexceptions\u001b[38;5;241m.\u001b[39mfrom_code(error_code)\n\u001b[0;32m--> 911\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m error_class(parsed_response, operation_name)\n\u001b[1;32m 912\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 913\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m parsed_response\n", + "\u001b[0;31mClientError\u001b[0m: An error occurred (InvalidToken) when calling the ListObjects operation: The provided token is malformed or otherwise invalid." + ] + } + ], + "source": [ + "get_all_files(path.strip())" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "f4227628-ba8e-4d98-8338-42bc54d909e1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "' s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1760_Ru263_MITO/epi_mito-tracing-outs'" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "path" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "0ad9c23e-83ca-458e-b967-43208c2044b9", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8ef8fe52-0ed3-4d87-8d61-027d7b9d41b5", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 57, + "id": "47469f8b-1ce6-49bf-bd95-72f60669954a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "An error occurred (InvalidToken) when calling the ListObjectsV2 operation: The provided token is malformed or otherwise invalid.\n" + ] + } + ], + "source": [ + "!aws s3 ls s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1760_Ru263_MITO/epi_mito-tracing-outs/" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ae5870f8-11d2-44b1-9d82-9d89c02a55a9", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "70f8fa5a-5501-4251-bd41-113a7f5b2184", + "metadata": {}, + "outputs": [], + "source": [ + "path" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "id": "aad5fa26-5bad-4c73-849f-4e2d4fe019f1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'SCRI_Projects/HTA/Mito_tracing/AV-1760_Ru263_MITO/epi_mito-tracing-outs'" + ] + }, + "execution_count": 56, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "key" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "89a4bcf0-c39f-4a58-929d-783fc619e7a7", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "e53f5671-5225-4f51-bfda-11d71eae41b2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "dp-lab-data SCRI_Projects/HTA/Mito_tracing/AV-1760_Ru263_MITO/epi_mito-tracing-outs\n" + ] + } + ], + "source": [ + "path = 's3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1760_Ru263_MITO'\n", + "folder = 'epi_mito-tracing-outs'\n", + "\n", + "_, bucket, key, _, _ = urllib.parse.urlsplit(f\"{path}/{folder}\")\n", + "key = key.lstrip('/')\n", + "print(bucket, key)" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "77b0a60a-430c-483a-ac11-f7870079911f", + "metadata": {}, + "outputs": [], + "source": [ + "s3r = boto3.resource(\"s3\")\n", + "bucket_s3 = s3r.Bucket(bucket)\n", + "objects = []" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "id": "9a1c681b-2c18-4ae4-940d-1c6bb0fa17e9", + "metadata": {}, + "outputs": [ + { + "ename": "ClientError", + "evalue": "An error occurred (InvalidToken) when calling the ListObjects operation: The provided token is malformed or otherwise invalid.", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mClientError\u001b[0m Traceback (most recent call last)", + "Input \u001b[0;32mIn [55]\u001b[0m, in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m obj \u001b[38;5;129;01min\u001b[39;00m bucket_s3\u001b[38;5;241m.\u001b[39mobjects\u001b[38;5;241m.\u001b[39mfilter(Prefix\u001b[38;5;241m=\u001b[39mkey):\n\u001b[1;32m 2\u001b[0m \u001b[38;5;28mprint\u001b[39m(obj\u001b[38;5;241m.\u001b[39mkey)\n", + "File \u001b[0;32m~/miniconda3/envs/scing/lib/python3.8/site-packages/boto3/resources/collection.py:81\u001b[0m, in \u001b[0;36mResourceCollection.__iter__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 78\u001b[0m limit \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_params\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlimit\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m)\n\u001b[1;32m 80\u001b[0m count \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m0\u001b[39m\n\u001b[0;32m---> 81\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m page \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpages():\n\u001b[1;32m 82\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m item \u001b[38;5;129;01min\u001b[39;00m page:\n\u001b[1;32m 83\u001b[0m \u001b[38;5;28;01myield\u001b[39;00m item\n", + "File \u001b[0;32m~/miniconda3/envs/scing/lib/python3.8/site-packages/boto3/resources/collection.py:171\u001b[0m, in \u001b[0;36mResourceCollection.pages\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 168\u001b[0m \u001b[38;5;66;03m# Now that we have a page iterator or single page of results\u001b[39;00m\n\u001b[1;32m 169\u001b[0m \u001b[38;5;66;03m# we start processing and yielding individual items.\u001b[39;00m\n\u001b[1;32m 170\u001b[0m count \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m0\u001b[39m\n\u001b[0;32m--> 171\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m page \u001b[38;5;129;01min\u001b[39;00m pages:\n\u001b[1;32m 172\u001b[0m page_items \u001b[38;5;241m=\u001b[39m []\n\u001b[1;32m 173\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m item \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_handler(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_parent, params, page):\n", + "File \u001b[0;32m~/miniconda3/envs/scing/lib/python3.8/site-packages/botocore/paginate.py:264\u001b[0m, in \u001b[0;36mPageIterator.__iter__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 262\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_inject_starting_params(current_kwargs)\n\u001b[1;32m 263\u001b[0m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[0;32m--> 264\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_make_request\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcurrent_kwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 265\u001b[0m parsed \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_extract_parsed_response(response)\n\u001b[1;32m 266\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m first_request:\n\u001b[1;32m 267\u001b[0m \u001b[38;5;66;03m# The first request is handled differently. We could\u001b[39;00m\n\u001b[1;32m 268\u001b[0m \u001b[38;5;66;03m# possibly have a resume/starting token that tells us where\u001b[39;00m\n\u001b[1;32m 269\u001b[0m \u001b[38;5;66;03m# to index into the retrieved page.\u001b[39;00m\n", + "File \u001b[0;32m~/miniconda3/envs/scing/lib/python3.8/site-packages/botocore/paginate.py:352\u001b[0m, in \u001b[0;36mPageIterator._make_request\u001b[0;34m(self, current_kwargs)\u001b[0m\n\u001b[1;32m 351\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_make_request\u001b[39m(\u001b[38;5;28mself\u001b[39m, current_kwargs):\n\u001b[0;32m--> 352\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_method\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mcurrent_kwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniconda3/envs/scing/lib/python3.8/site-packages/botocore/client.py:508\u001b[0m, in \u001b[0;36mClientCreator._create_api_method.._api_call\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 504\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m(\n\u001b[1;32m 505\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mpy_operation_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m() only accepts keyword arguments.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 506\u001b[0m )\n\u001b[1;32m 507\u001b[0m \u001b[38;5;66;03m# The \"self\" in this scope is referring to the BaseClient.\u001b[39;00m\n\u001b[0;32m--> 508\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_make_api_call\u001b[49m\u001b[43m(\u001b[49m\u001b[43moperation_name\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniconda3/envs/scing/lib/python3.8/site-packages/botocore/client.py:911\u001b[0m, in \u001b[0;36mBaseClient._make_api_call\u001b[0;34m(self, operation_name, api_params)\u001b[0m\n\u001b[1;32m 909\u001b[0m error_code \u001b[38;5;241m=\u001b[39m parsed_response\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mError\u001b[39m\u001b[38;5;124m\"\u001b[39m, {})\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mCode\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 910\u001b[0m error_class \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mexceptions\u001b[38;5;241m.\u001b[39mfrom_code(error_code)\n\u001b[0;32m--> 911\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m error_class(parsed_response, operation_name)\n\u001b[1;32m 912\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 913\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m parsed_response\n", + "\u001b[0;31mClientError\u001b[0m: An error occurred (InvalidToken) when calling the ListObjects operation: The provided token is malformed or otherwise invalid." + ] + } + ], + "source": [ + "for obj in bucket_s3.objects.filter(Prefix=key):\n", + " print(obj.key)" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "id": "1765730e-613b-4bd2-a1e0-956222aa9e16", + "metadata": {}, + "outputs": [], + "source": [ + "pattern = 'tar'" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "id": "623e503e-7115-4d59-a003-5a7e65797b5a", + "metadata": {}, + "outputs": [ + { + "ename": "ClientError", + "evalue": "An error occurred (InvalidToken) when calling the ListObjects operation: The provided token is malformed or otherwise invalid.", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mClientError\u001b[0m Traceback (most recent call last)", + "Input \u001b[0;32mIn [54]\u001b[0m, in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 2\u001b[0m bucket_s3 \u001b[38;5;241m=\u001b[39m s3r\u001b[38;5;241m.\u001b[39mBucket(bucket)\n\u001b[1;32m 3\u001b[0m objects \u001b[38;5;241m=\u001b[39m []\n\u001b[0;32m----> 4\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m obj \u001b[38;5;129;01min\u001b[39;00m bucket_s3\u001b[38;5;241m.\u001b[39mobjects\u001b[38;5;241m.\u001b[39mfilter(Prefix\u001b[38;5;241m=\u001b[39mkey):\n\u001b[1;32m 5\u001b[0m hit \u001b[38;5;241m=\u001b[39m pattern\u001b[38;5;241m.\u001b[39msearch(obj\u001b[38;5;241m.\u001b[39mkey)\n", + "File \u001b[0;32m~/miniconda3/envs/scing/lib/python3.8/site-packages/boto3/resources/collection.py:81\u001b[0m, in \u001b[0;36mResourceCollection.__iter__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 78\u001b[0m limit \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_params\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlimit\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m)\n\u001b[1;32m 80\u001b[0m count \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m0\u001b[39m\n\u001b[0;32m---> 81\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m page \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpages():\n\u001b[1;32m 82\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m item \u001b[38;5;129;01min\u001b[39;00m page:\n\u001b[1;32m 83\u001b[0m \u001b[38;5;28;01myield\u001b[39;00m item\n", + "File \u001b[0;32m~/miniconda3/envs/scing/lib/python3.8/site-packages/boto3/resources/collection.py:171\u001b[0m, in \u001b[0;36mResourceCollection.pages\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 168\u001b[0m \u001b[38;5;66;03m# Now that we have a page iterator or single page of results\u001b[39;00m\n\u001b[1;32m 169\u001b[0m \u001b[38;5;66;03m# we start processing and yielding individual items.\u001b[39;00m\n\u001b[1;32m 170\u001b[0m count \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m0\u001b[39m\n\u001b[0;32m--> 171\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m page \u001b[38;5;129;01min\u001b[39;00m pages:\n\u001b[1;32m 172\u001b[0m page_items \u001b[38;5;241m=\u001b[39m []\n\u001b[1;32m 173\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m item \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_handler(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_parent, params, page):\n", + "File \u001b[0;32m~/miniconda3/envs/scing/lib/python3.8/site-packages/botocore/paginate.py:264\u001b[0m, in \u001b[0;36mPageIterator.__iter__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 262\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_inject_starting_params(current_kwargs)\n\u001b[1;32m 263\u001b[0m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[0;32m--> 264\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_make_request\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcurrent_kwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 265\u001b[0m parsed \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_extract_parsed_response(response)\n\u001b[1;32m 266\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m first_request:\n\u001b[1;32m 267\u001b[0m \u001b[38;5;66;03m# The first request is handled differently. We could\u001b[39;00m\n\u001b[1;32m 268\u001b[0m \u001b[38;5;66;03m# possibly have a resume/starting token that tells us where\u001b[39;00m\n\u001b[1;32m 269\u001b[0m \u001b[38;5;66;03m# to index into the retrieved page.\u001b[39;00m\n", + "File \u001b[0;32m~/miniconda3/envs/scing/lib/python3.8/site-packages/botocore/paginate.py:352\u001b[0m, in \u001b[0;36mPageIterator._make_request\u001b[0;34m(self, current_kwargs)\u001b[0m\n\u001b[1;32m 351\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_make_request\u001b[39m(\u001b[38;5;28mself\u001b[39m, current_kwargs):\n\u001b[0;32m--> 352\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_method\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mcurrent_kwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniconda3/envs/scing/lib/python3.8/site-packages/botocore/client.py:508\u001b[0m, in \u001b[0;36mClientCreator._create_api_method.._api_call\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 504\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m(\n\u001b[1;32m 505\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mpy_operation_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m() only accepts keyword arguments.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 506\u001b[0m )\n\u001b[1;32m 507\u001b[0m \u001b[38;5;66;03m# The \"self\" in this scope is referring to the BaseClient.\u001b[39;00m\n\u001b[0;32m--> 508\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_make_api_call\u001b[49m\u001b[43m(\u001b[49m\u001b[43moperation_name\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniconda3/envs/scing/lib/python3.8/site-packages/botocore/client.py:911\u001b[0m, in \u001b[0;36mBaseClient._make_api_call\u001b[0;34m(self, operation_name, api_params)\u001b[0m\n\u001b[1;32m 909\u001b[0m error_code \u001b[38;5;241m=\u001b[39m parsed_response\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mError\u001b[39m\u001b[38;5;124m\"\u001b[39m, {})\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mCode\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 910\u001b[0m error_class \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mexceptions\u001b[38;5;241m.\u001b[39mfrom_code(error_code)\n\u001b[0;32m--> 911\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m error_class(parsed_response, operation_name)\n\u001b[1;32m 912\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 913\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m parsed_response\n", + "\u001b[0;31mClientError\u001b[0m: An error occurred (InvalidToken) when calling the ListObjects operation: The provided token is malformed or otherwise invalid." + ] + } + ], + "source": [ + "s3r = boto3.resource(\"s3\")\n", + "bucket_s3 = s3r.Bucket(bucket)\n", + "objects = []\n", + "for obj in bucket_s3.objects.filter(Prefix=key):\n", + " hit = pattern.search(obj.key)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "298bf7db-0464-47f0-bb13-caaa3666b124", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4d7c18f8-7b9e-44e5-b263-349ee1fc9e3f", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a58acc1f-3d89-4190-a6ca-f5767f795aeb", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "6f8ad661-caaf-4b97-8f26-29ef0341c361", + "metadata": {}, + "outputs": [], + "source": [ + "def get_s3_objects(bucket, key, pattern, full_uri=False):\n", + " s3r = boto3.resource(\"s3\")\n", + " bucket_s3 = s3r.Bucket(bucket)\n", + " objects = []\n", + " for obj in bucket_s3.objects.filter(Prefix=key):\n", + " hit = pattern.search(obj.key)\n", + " if hit:\n", + " objects.append(obj.key)\n", + " if full_uri:\n", + " objects = [f\"s3://{bucket}/{o}\" for o in objects]\n", + " return objects\n" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "e0b4a008-6286-4b6a-a094-54f88767a72e", + "metadata": {}, + "outputs": [ + { + "ename": "ClientError", + "evalue": "An error occurred (InvalidToken) when calling the ListObjects operation: The provided token is malformed or otherwise invalid.", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mClientError\u001b[0m Traceback (most recent call last)", + "Input \u001b[0;32mIn [38]\u001b[0m, in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m obj \u001b[38;5;129;01min\u001b[39;00m bucket_s3\u001b[38;5;241m.\u001b[39mobjects\u001b[38;5;241m.\u001b[39mfilter(Prefix\u001b[38;5;241m=\u001b[39mkey):\n\u001b[1;32m 2\u001b[0m \u001b[38;5;28mprint\u001b[39m(obj)\n", + "File \u001b[0;32m~/miniconda3/envs/scing/lib/python3.8/site-packages/boto3/resources/collection.py:81\u001b[0m, in \u001b[0;36mResourceCollection.__iter__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 78\u001b[0m limit \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_params\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlimit\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m)\n\u001b[1;32m 80\u001b[0m count \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m0\u001b[39m\n\u001b[0;32m---> 81\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m page \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpages():\n\u001b[1;32m 82\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m item \u001b[38;5;129;01min\u001b[39;00m page:\n\u001b[1;32m 83\u001b[0m \u001b[38;5;28;01myield\u001b[39;00m item\n", + "File \u001b[0;32m~/miniconda3/envs/scing/lib/python3.8/site-packages/boto3/resources/collection.py:171\u001b[0m, in \u001b[0;36mResourceCollection.pages\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 168\u001b[0m \u001b[38;5;66;03m# Now that we have a page iterator or single page of results\u001b[39;00m\n\u001b[1;32m 169\u001b[0m \u001b[38;5;66;03m# we start processing and yielding individual items.\u001b[39;00m\n\u001b[1;32m 170\u001b[0m count \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m0\u001b[39m\n\u001b[0;32m--> 171\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m page \u001b[38;5;129;01min\u001b[39;00m pages:\n\u001b[1;32m 172\u001b[0m page_items \u001b[38;5;241m=\u001b[39m []\n\u001b[1;32m 173\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m item \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_handler(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_parent, params, page):\n", + "File \u001b[0;32m~/miniconda3/envs/scing/lib/python3.8/site-packages/botocore/paginate.py:264\u001b[0m, in \u001b[0;36mPageIterator.__iter__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 262\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_inject_starting_params(current_kwargs)\n\u001b[1;32m 263\u001b[0m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[0;32m--> 264\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_make_request\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcurrent_kwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 265\u001b[0m parsed \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_extract_parsed_response(response)\n\u001b[1;32m 266\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m first_request:\n\u001b[1;32m 267\u001b[0m \u001b[38;5;66;03m# The first request is handled differently. We could\u001b[39;00m\n\u001b[1;32m 268\u001b[0m \u001b[38;5;66;03m# possibly have a resume/starting token that tells us where\u001b[39;00m\n\u001b[1;32m 269\u001b[0m \u001b[38;5;66;03m# to index into the retrieved page.\u001b[39;00m\n", + "File \u001b[0;32m~/miniconda3/envs/scing/lib/python3.8/site-packages/botocore/paginate.py:352\u001b[0m, in \u001b[0;36mPageIterator._make_request\u001b[0;34m(self, current_kwargs)\u001b[0m\n\u001b[1;32m 351\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_make_request\u001b[39m(\u001b[38;5;28mself\u001b[39m, current_kwargs):\n\u001b[0;32m--> 352\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_method\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mcurrent_kwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniconda3/envs/scing/lib/python3.8/site-packages/botocore/client.py:508\u001b[0m, in \u001b[0;36mClientCreator._create_api_method.._api_call\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 504\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m(\n\u001b[1;32m 505\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mpy_operation_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m() only accepts keyword arguments.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 506\u001b[0m )\n\u001b[1;32m 507\u001b[0m \u001b[38;5;66;03m# The \"self\" in this scope is referring to the BaseClient.\u001b[39;00m\n\u001b[0;32m--> 508\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_make_api_call\u001b[49m\u001b[43m(\u001b[49m\u001b[43moperation_name\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniconda3/envs/scing/lib/python3.8/site-packages/botocore/client.py:911\u001b[0m, in \u001b[0;36mBaseClient._make_api_call\u001b[0;34m(self, operation_name, api_params)\u001b[0m\n\u001b[1;32m 909\u001b[0m error_code \u001b[38;5;241m=\u001b[39m parsed_response\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mError\u001b[39m\u001b[38;5;124m\"\u001b[39m, {})\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mCode\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 910\u001b[0m error_class \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mexceptions\u001b[38;5;241m.\u001b[39mfrom_code(error_code)\n\u001b[0;32m--> 911\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m error_class(parsed_response, operation_name)\n\u001b[1;32m 912\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 913\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m parsed_response\n", + "\u001b[0;31mClientError\u001b[0m: An error occurred (InvalidToken) when calling the ListObjects operation: The provided token is malformed or otherwise invalid." + ] + } + ], + "source": [ + "for obj in bucket_s3.objects.filter(Prefix=key):\n", + " print(obj)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "100624da-1ad0-43e6-9fd4-56ccc0578978", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 89, + "id": "f0026000-9b6d-4ae9-8896-f06c286b119d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/Ru581D_MITO epi_mito-tracing-outs\n", + "dp-lab-data SCRI_Projects/HTA/Mito_tracing/Ru581D_MITO/epi_mito-tracing-outs\n" + ] + } + ], + "source": [ + "path = samples[' aws_path'][0].replace('barcodes_rna/', '')\n", + "path = path.strip()\n", + "\n", + "folder = 'epi_mito-tracing-outs'\n", + "path = path.replace(f'{folder}', '')\n", + "path = path.strip('/')\n", + "print(path, folder)\n", + "\n", + "_, bucket, key, _, _ = urllib.parse.urlsplit(f\"{path}/{folder}\")\n", + "key = key.lstrip('/')\n", + "print(bucket, key)" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "id": "6eb6d355-8c50-40f2-a4ef-3928b8bb68a5", + "metadata": {}, + "outputs": [], + "source": [ + "s3r = boto3.resource(\"s3\")\n", + "bucket_s3 = s3r.Bucket(bucket)\n", + "objects = []" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a433bac9-c493-4926-ab6b-254572415a51", + "metadata": {}, + "outputs": [], + "source": [ + "for obj in bucket_s3.objects.filter(Prefix=key):\n", + " print(obj.key)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/Untitled.ipynb b/notebooks/Untitled.ipynb new file mode 100644 index 0000000..dbce721 --- /dev/null +++ b/notebooks/Untitled.ipynb @@ -0,0 +1,1029 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "d13e6985-95f3-45eb-8162-0e24a2a049d4", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import re, subprocess, boto3, json, shlex, mysql, os, urllib, logging\n", + "import pandas as pd\n", + "import numpy as np\n", + "from s3path import S3Path\n", + "from pathlib import Path\n", + "from tqdm.notebook import tqdm\n", + "from packaging import version\n", + "\n", + "import glob\n", + "import os\n", + "\n", + "pd.set_option(\"display.max_colwidth\", 40)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "6547d881-c5e0-494d-9189-0059c14e126e", + "metadata": {}, + "outputs": [], + "source": [ + "from utils.utils import *" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e6fb891f-0934-4489-98fb-4713ab904a5d", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "bf6e1460-34e1-4654-9fa5-2e82eb23902b", + "metadata": {}, + "source": [ + "# AWS setup" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "7052097b-da4a-444c-aebb-1b585266c353", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "env: AWS_ACCESS_KEY_ID=ASIAYPY66CWMAGM24WHE\n", + "env: AWS_SECRET_ACCESS_KEY=jWUmwaWT+IQhV+71PWwfi1We6vSusB78GBwNw15e\n", + "env: AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEHIaCXVzLWVhc3QtMSJIMEYCIQC5kbf1i5ib760fqEmYsdjvX/g7ogw0RaGEz2BUIy+R/wIhAOi31VVCUdy7zmAZddGoXvKRm7JtoJzwErPPPRahY4l/KvgBCNv//////////wEQAxoMNTgzNjQzNTY3NTEyIgx4r2eNH51B/0SJBpAqzAEM95AVY9oz0nVlU4hjvRWFYWEUuXzOkPwo6RagXIByGUj0SP4HWQX0kvraLFqa34JYyijiRhgoPu7xHiGOjdHuS93qSG4mSQhLDgMTa+K7ze+8I407NeMlNxiiS5KvKCVaTt6U76rBe4kGauNcMSqT7sIbpO4btLXtwI41CnqbbXKTgeJc87BwxcvWUqW8WE9D61uZ0Sv2qmvGoL+jkFOfOGw/bMSnMOtNtWtcYHOEFI0WW3i1DeTamyOoiJ6ZfYObSQ1V+SNEZNYhW64wwo+7ngY6lwEZ//N+c9HWTzOSb9crQjpV+hRMjDy1O+FLXll70i5dHZe5RxsmFfm8PYjYaz4AZQ6Tl716sEm25s1CCbTiYx3x2OeGIuj7XLbeE8lNDqDemhlAdkhXjuCUDFk/wAz+z4rwqu3PvsA0YB+Ut2jG/l+1RYzfaXBgSWxbl6c1oJuDz5ngUewaTQGDRFomu7/u8dCN6j89zovp\n", + "2021-10-07 15:31:32 agc-583643567512-us-east-1\n", + "2021-10-07 15:28:07 cdktoolkit-stagingbucket-d49u1xfb0sc4\n", + "2019-10-09 13:04:06 cf-templates-umiwbnq3566w-us-east-1\n", + "2019-10-10 12:46:54 dp-daily-reports\n", + "2017-09-26 10:15:15 dp-lab-data\n", + "2019-05-23 12:34:58 dp-lab-data-public\n", + "2018-03-01 13:29:07 dp-lab-glacier\n", + "2020-11-06 23:02:27 dp-lab-gwf-core\n", + "2021-07-15 18:14:01 dp-lab-gwf-core2\n", + "2017-09-26 10:17:18 dp-lab-home\n", + "2019-08-14 16:42:43 dp-lab-test\n", + "2019-04-25 12:35:35 elasticbeanstalk-us-east-1-583643567512\n", + "2019-12-13 15:53:57 scri-computational\n", + "2017-09-26 10:23:50 seqc-public\n" + ] + } + ], + "source": [ + "# Load aws\n", + "\n", + "%env AWS_ACCESS_KEY_ID=ASIAYPY66CWMAGM24WHE\n", + "%env AWS_SECRET_ACCESS_KEY=jWUmwaWT+IQhV+71PWwfi1We6vSusB78GBwNw15e\n", + "%env AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEHIaCXVzLWVhc3QtMSJIMEYCIQC5kbf1i5ib760fqEmYsdjvX/g7ogw0RaGEz2BUIy+R/wIhAOi31VVCUdy7zmAZddGoXvKRm7JtoJzwErPPPRahY4l/KvgBCNv//////////wEQAxoMNTgzNjQzNTY3NTEyIgx4r2eNH51B/0SJBpAqzAEM95AVY9oz0nVlU4hjvRWFYWEUuXzOkPwo6RagXIByGUj0SP4HWQX0kvraLFqa34JYyijiRhgoPu7xHiGOjdHuS93qSG4mSQhLDgMTa+K7ze+8I407NeMlNxiiS5KvKCVaTt6U76rBe4kGauNcMSqT7sIbpO4btLXtwI41CnqbbXKTgeJc87BwxcvWUqW8WE9D61uZ0Sv2qmvGoL+jkFOfOGw/bMSnMOtNtWtcYHOEFI0WW3i1DeTamyOoiJ6ZfYObSQ1V+SNEZNYhW64wwo+7ngY6lwEZ//N+c9HWTzOSb9crQjpV+hRMjDy1O+FLXll70i5dHZe5RxsmFfm8PYjYaz4AZQ6Tl716sEm25s1CCbTiYx3x2OeGIuj7XLbeE8lNDqDemhlAdkhXjuCUDFk/wAz+z4rwqu3PvsA0YB+Ut2jG/l+1RYzfaXBgSWxbl6c1oJuDz5ngUewaTQGDRFomu7/u8dCN6j89zovp\n", + "!aws s3 ls" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "131f63b2-9e4c-4b36-b9b2-e6a6693dd4a5", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "087ae658-2d9d-4b3f-b159-ccb06f4c5626", + "metadata": { + "tags": [] + }, + "source": [ + "# Setup" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "931b1af4-a619-4308-848b-6a55bc65072e", + "metadata": {}, + "outputs": [], + "source": [ + "# Which pipeline are you running\n", + "\n", + "prefix = \"CellRangerArc\" # Workflow to run; also .wdl filename prefix\n", + "output_dirname = \"cr-arc-results\"\n", + "\n", + "workflow_dir = glob.glob(f\"{Path.home()}/scing/bin/cellranger-arc-*\")[0]\n", + "path_to_exec = f\"{workflow_dir}/submit.sh\" # CHANGE THIS FOR SHARP\n", + "\n", + "# Locations of workflow-related directories and files\n", + "path_to_cromwell_secrets = f\"{Path.home()}/.cromwell/cromwell-secrets.json\"\n", + "db_credentials_path = f\"{Path.home()}/.config.json\"" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "aaee197b-c610-46a0-b786-9bfc6aafa07d", + "metadata": {}, + "outputs": [], + "source": [ + "# Location of docker files\n", + "common_docker_registry = \"quay.io/hisplan\"\n", + "pipeline_type = prefix # field in *.labels.json\n", + "comment = \"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "963b6641-1c6d-430f-99f4-4077b24fa1b5", + "metadata": {}, + "outputs": [], + "source": [ + "# Workflow file paths\n", + "config_dir = f\"{workflow_dir}/configs\"\n", + "path_to_options = f\"{workflow_dir}/{prefix}.options.aws.json\"" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "809159de-a318-434b-8d3d-f660573a3990", + "metadata": {}, + "outputs": [], + "source": [ + "# Set credentials based on SCRIdb CLI config file\n", + "with open(db_credentials_path) as f:\n", + " creds = json.load(f)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4f359259-186e-4beb-92c8-bce6b6b03fd7", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "e652e114-578e-4a34-8624-bf001533af26", + "metadata": {}, + "source": [ + "# Sample information" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "b47a3ba3-ee28-4a98-afff-2b90cd10822c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
AWS_storageidspeciessc_techproject_idreference
Sample
RB-2041_WildType_DOGMAseqs3://dp-lab-data/collaborators/sfeir...4440human10X_scATACscATAC-seq pilotGRCh38-1.1.0
RB-2041_mRB54_1003_DOGMAseqs3://dp-lab-data/collaborators/sfeir...4441human10X_scATACscATAC-seq pilotGRCh38-1.1.0
\n", + "
" + ], + "text/plain": [ + " AWS_storage id \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq s3://dp-lab-data/collaborators/sfeir... 4440 \n", + "RB-2041_mRB54_1003_DOGMAseq s3://dp-lab-data/collaborators/sfeir... 4441 \n", + "\n", + " species sc_tech project_id \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq human 10X_scATAC scATAC-seq pilot \n", + "RB-2041_mRB54_1003_DOGMAseq human 10X_scATAC scATAC-seq pilot \n", + "\n", + " reference \n", + "Sample \n", + "RB-2041_WildType_DOGMAseq GRCh38-1.1.0 \n", + "RB-2041_mRB54_1003_DOGMAseq GRCh38-1.1.0 " + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# You can supply a list of IDs or request IDs or even AWS paths\n", + "\n", + "# request_ids = ['PM-1779']\n", + "# samples = sample_scridb_info(request_ids, 'request_id', creds)\n", + "\n", + "# sample_ids = [4138]\n", + "# samples = sample_scridb_info(sample_ids, 'id', creds)\n", + "\n", + "aws_storage = ['s3://dp-lab-data/collaborators/sfeira/ScatacSeqPilot/RB-2041_mRB54_1003_DOGMAseq/',\n", + " 's3://dp-lab-data/collaborators/sfeira/ScatacSeqPilot/RB-2041_WildType_DOGMAseq/']\n", + "samples = sample_scridb_info(aws_storage, 'AWS_storage', creds)\n", + "\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "91a0a018-06ff-4b7e-92a9-46be980ca402", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['s3://dp-lab-data/SCRI_Projects/10XFixedScrnaseqPilot/TX-1886_D34M_FAfixed_scRNA']" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples['AWS_storage'].tolist()" + ] + }, + { + "cell_type": "markdown", + "id": "66be82d8-2707-44ae-b7ac-7c14e7525a0f", + "metadata": {}, + "source": [ + "IMPORTANT NOTE \n", + "\n", + "Check the name of the folder you are running. Typically the folder that is stored in the database is just the GEX. So if another library is generated (multiome ATAC, VDJ, hashtag, etc) then it needs to be manually changed." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "b851f925-3a5a-4cec-9ef3-4bdc53eb295b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "RB-2041_WildType_DOGMAseq\n", + " PRE RB-2041_WildType_DOGMAseq/\n", + "\n", + "RB-2041_mRB54_1003_DOGMAseq\n", + " PRE RB-2041_mRB54_1003_DOGMAseq/\n", + "\n" + ] + } + ], + "source": [ + "# Check the name of the folder you are running\n", + "# Especially if there are multiple libraries (i.e ATAC, TCR_VDJ, etc.)\n", + "\n", + "for sample, row in samples.iterrows():\n", + " print(sample)\n", + " path = os.path.split(row['AWS_storage'])[0] + '/'\n", + " os.system(f'aws s3 ls {path} | grep {sample}')\n", + " print()" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "5b09d8d6-46ef-403f-816b-13f34a603e9c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
AWS_storageidspeciessc_techproject_idreferenceFASTQs
Sample
RB-2041_WildType_DOGMAseqs3://dp-lab-data/collaborators/sfeir...4440human10X_scATACscATAC-seq pilotGRCh38-1.1.0{'I1': ['s3://dp-lab-data/collaborat...
RB-2041_mRB54_1003_DOGMAseqs3://dp-lab-data/collaborators/sfeir...4441human10X_scATACscATAC-seq pilotGRCh38-1.1.0{'I1': ['s3://dp-lab-data/collaborat...
\n", + "
" + ], + "text/plain": [ + " AWS_storage id \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq s3://dp-lab-data/collaborators/sfeir... 4440 \n", + "RB-2041_mRB54_1003_DOGMAseq s3://dp-lab-data/collaborators/sfeir... 4441 \n", + "\n", + " species sc_tech project_id \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq human 10X_scATAC scATAC-seq pilot \n", + "RB-2041_mRB54_1003_DOGMAseq human 10X_scATAC scATAC-seq pilot \n", + "\n", + " reference \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq GRCh38-1.1.0 \n", + "RB-2041_mRB54_1003_DOGMAseq GRCh38-1.1.0 \n", + "\n", + " FASTQs \n", + "Sample \n", + "RB-2041_WildType_DOGMAseq {'I1': ['s3://dp-lab-data/collaborat... \n", + "RB-2041_mRB54_1003_DOGMAseq {'I1': ['s3://dp-lab-data/collaborat... " + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples[\"FASTQs\"] = samples[\"AWS_storage\"].apply(lambda x: get_fastqs(x, fastq_map[prefix], \"FASTQ\"))\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2861ee5a-1a3c-4774-9eda-28ac92cb3df7", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "563dd74c-53ef-4595-8400-b28c23f52085", + "metadata": {}, + "source": [ + "IMPORTANT NOTE\n", + "\n", + "Make sure that your files are not archived. The following command will print any FASTQ file that is archived. Unarchive the files and then come back to processing the sample." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "569312fd-750c-4356-8a73-1feff86601e2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "RB-2041_WildType_DOGMAseq\n", + "RB-2041_mRB54_1003_DOGMAseq\n" + ] + } + ], + "source": [ + "for sample, row in samples.iterrows():\n", + " print(sample)\n", + " fastqs = np.ravel(list(row['FASTQs'].values()))\n", + " dirnames = set([os.path.dirname(x) for x in fastqs])\n", + " \n", + " for dirname in dirnames:\n", + " file = dirname.replace('s3://', '')\n", + " \n", + " bucket = file.split('/')[0]\n", + " pre = file.replace(f'{bucket}/', '')\n", + " \n", + " !aws s3api list-objects-v2 --bucket $bucket --prefix $pre --query \"Contents[?StorageClass!='STANDARD'].Key\" --output text " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "534b90a7-ab25-462c-9ae4-40c4294a9fd5", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "3f0f3377-1c19-4545-868f-5da05f0ea295", + "metadata": {}, + "source": [ + "IMPORTANT NOTE \n", + "\n", + "For CellRanger you need to supply an HTTPS path. So if you are using a custom genome stored on AWS, you must make the reference public ! Be sure to manually change the \"reference\" argument if it has not been updated correctly!!!!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d5586ef8-e219-4388-b5f1-646e8d652e1e", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "b8007050-06f2-4325-ad13-68bb986b626c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
AWS_storageidspeciessc_techproject_idreferenceFASTQs
Sample
RB-2041_WildType_DOGMAseqs3://dp-lab-data/collaborators/sfeir...4440human10X_scATACscATAC-seq pilothttps://cf.10xgenomics.com/supp/cell...{'I1': ['s3://dp-lab-data/collaborat...
RB-2041_mRB54_1003_DOGMAseqs3://dp-lab-data/collaborators/sfeir...4441human10X_scATACscATAC-seq pilothttps://cf.10xgenomics.com/supp/cell...{'I1': ['s3://dp-lab-data/collaborat...
\n", + "
" + ], + "text/plain": [ + " AWS_storage id \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq s3://dp-lab-data/collaborators/sfeir... 4440 \n", + "RB-2041_mRB54_1003_DOGMAseq s3://dp-lab-data/collaborators/sfeir... 4441 \n", + "\n", + " species sc_tech project_id \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq human 10X_scATAC scATAC-seq pilot \n", + "RB-2041_mRB54_1003_DOGMAseq human 10X_scATAC scATAC-seq pilot \n", + "\n", + " reference \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq https://cf.10xgenomics.com/supp/cell... \n", + "RB-2041_mRB54_1003_DOGMAseq https://cf.10xgenomics.com/supp/cell... \n", + "\n", + " FASTQs \n", + "Sample \n", + "RB-2041_WildType_DOGMAseq {'I1': ['s3://dp-lab-data/collaborat... \n", + "RB-2041_mRB54_1003_DOGMAseq {'I1': ['s3://dp-lab-data/collaborat... " + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples = update_ref(samples, prefix)\n", + "\n", + "if not samples['reference'].isna().any():\n", + " samples[\"reference\"].apply(lambda x: {\n", + " \"name\": re.match(r'.*refdata-cellranger-arc-(.*).tar.gz', x)[1],\n", + " \"location\": x,\n", + " }) \n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "6b56024e-a4c1-488f-861a-17bf9c191223", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Sample\n", + "RB-2041_WildType_DOGMAseq {'name': 'human-rna-mitoblacklist', ...\n", + "RB-2041_mRB54_1003_DOGMAseq {'name': 'human-rna-mitoblacklist', ...\n", + "Name: reference, dtype: object" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples['reference'] = [\n", + " {\n", + " 'name' : 'human-rna-mitoblacklist',\n", + " 'location' : 's3://dp-lab-data/collaborators/sfeira/ScatacSeqPilot/human-rna-mitoblacklist/human-rna-mitoblacklist.tar.gz'\n", + " }] * len(samples)\n", + "samples['reference']" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "83ed197c-562c-459e-b113-83fee86388ff", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "5e6b5cd2-ca13-4ce8-808a-5404ede8e528", + "metadata": {}, + "source": [ + "# Generate inputs" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "0561da32-5979-4b0e-a40e-35af26218060", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
CellRangerArc.runIDCellRangerArc.gexFastqNameCellRangerArc.gexFastqFilesCellRangerArc.atacFastqNameCellRangerArc.atacFastqFilesCellRangerArc.referenceCellRangerArc.dockerRegistryCellRangerArc.sampleNameCellRangerArc.fastqFilesCellRangerArc.fastqNamesCellRangerArc.referenceGenome
Sample
RB-2041_WildType_DOGMAseqNaNNaNNaNNaNNaNNaNquay.io/hisplanRB-2041_WildType_DOGMAseq[s3://dp-lab-data/collaborators/sfei...4440_RB-2041_WildType_DOGMAseq_IGO_1...{'name': 'human-rna-mitoblacklist', ...
RB-2041_mRB54_1003_DOGMAseqNaNNaNNaNNaNNaNNaNquay.io/hisplanRB-2041_mRB54_1003_DOGMAseq[s3://dp-lab-data/collaborators/sfei...4441_RB-2041_mRB54_1003_DOGMAseq_IGO...{'name': 'human-rna-mitoblacklist', ...
\n", + "
" + ], + "text/plain": [ + " CellRangerArc.runID CellRangerArc.gexFastqName \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq NaN NaN \n", + "RB-2041_mRB54_1003_DOGMAseq NaN NaN \n", + "\n", + " CellRangerArc.gexFastqFiles \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq NaN \n", + "RB-2041_mRB54_1003_DOGMAseq NaN \n", + "\n", + " CellRangerArc.atacFastqName \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq NaN \n", + "RB-2041_mRB54_1003_DOGMAseq NaN \n", + "\n", + " CellRangerArc.atacFastqFiles \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq NaN \n", + "RB-2041_mRB54_1003_DOGMAseq NaN \n", + "\n", + " CellRangerArc.reference \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq NaN \n", + "RB-2041_mRB54_1003_DOGMAseq NaN \n", + "\n", + " CellRangerArc.dockerRegistry \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq quay.io/hisplan \n", + "RB-2041_mRB54_1003_DOGMAseq quay.io/hisplan \n", + "\n", + " CellRangerArc.sampleName \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq RB-2041_WildType_DOGMAseq \n", + "RB-2041_mRB54_1003_DOGMAseq RB-2041_mRB54_1003_DOGMAseq \n", + "\n", + " CellRangerArc.fastqFiles \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq [s3://dp-lab-data/collaborators/sfei... \n", + "RB-2041_mRB54_1003_DOGMAseq [s3://dp-lab-data/collaborators/sfei... \n", + "\n", + " CellRangerArc.fastqNames \\\n", + "Sample \n", + "RB-2041_WildType_DOGMAseq 4440_RB-2041_WildType_DOGMAseq_IGO_1... \n", + "RB-2041_mRB54_1003_DOGMAseq 4441_RB-2041_mRB54_1003_DOGMAseq_IGO... \n", + "\n", + " CellRangerArc.referenceGenome \n", + "Sample \n", + "RB-2041_WildType_DOGMAseq {'name': 'human-rna-mitoblacklist', ... \n", + "RB-2041_mRB54_1003_DOGMAseq {'name': 'human-rna-mitoblacklist', ... " + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Standard inputs, modify fields as need be\n", + "\n", + "# Load minimum inputs and labels fields from templates\n", + "with open(f\"{config_dir}/template.inputs.json\") as f:\n", + " std_inputs_fields = list(json.load(f).keys())\n", + " \n", + "# Annotate all samples with workflow inputs and labels\n", + "inputs = pd.DataFrame(index=samples.index, columns=std_inputs_fields,)\n", + "\n", + "# Annotate inputs\n", + "inputs[f\"{prefix}.sampleName\"] = samples.index\n", + "inputs[f\"{prefix}.fastqFiles\"] = samples[\"FASTQs\"].apply(lambda x: np.ravel(list(x.values())))\n", + "inputs[f\"{prefix}.fastqNames\"] = inputs[f\"{prefix}.fastqFiles\"].apply(lambda x: get_fastqs_name(x))\n", + "inputs[f\"{prefix}.referenceGenome\"] = samples[\"reference\"] \n", + "inputs[f\"{prefix}.dockerRegistry\"] = common_docker_registry\n", + "\n", + "inputs" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "4700f244-fe4b-44a5-9d1b-fbc1b2b35afb", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['CellRangerArc.runID',\n", + " 'CellRangerArc.gexFastqName',\n", + " 'CellRangerArc.gexFastqFiles',\n", + " 'CellRangerArc.atacFastqName',\n", + " 'CellRangerArc.atacFastqFiles',\n", + " 'CellRangerArc.reference',\n", + " 'CellRangerArc.dockerRegistry']" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "std_inputs_fields" + ] + }, + { + "cell_type": "markdown", + "id": "2f37043a-c883-4da4-9c87-f1912b102e91", + "metadata": {}, + "source": [ + "# Generate labels" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "81500471-4a2e-4eae-8b69-174608902709", + "metadata": {}, + "outputs": [], + "source": [ + "# Standard labels, modify fields as need be\n", + "\n", + "with open(f\"{config_dir}/template.labels.json\") as f:\n", + " std_labels_fields = list(json.load(f).keys())\n", + " \n", + "# Annotate all samples with workflow inputs and labels\n", + "labels = pd.DataFrame(index=samples.index, columns=std_labels_fields,)\n", + "\n", + "labels[\"pipelineType\"] = pipeline_type\n", + "labels[\"project\"] = samples['project_id']\n", + "labels[\"sample\"] = labels.index\n", + "labels[\"owner\"] = creds[\"user\"]\n", + "labels[\"destination\"] = samples['AWS_storage'] + \"/\" + output_dirname\n", + "labels[\"transfer\"] = \"-\"\n", + "labels[\"comment\"] = creds[\"user\"]\n", + "\n", + "labels" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "688fe090-52a7-493e-bf52-617b91809c5b", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "d7e3422e-a130-4b5b-ba68-f1d59921388c", + "metadata": {}, + "source": [ + "# Run samples" + ] + }, + { + "cell_type": "markdown", + "id": "2b231634-b533-4b48-afc3-f6c201bf3df7", + "metadata": {}, + "source": [ + "Look over the samples before submitting one last time" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e71f5101-edb7-4c9d-ad07-408e756bd197", + "metadata": {}, + "outputs": [], + "source": [ + "inputs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "61801e60-ab82-4012-afcc-22ee288b22d1", + "metadata": {}, + "outputs": [], + "source": [ + "labels" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8057ea75-3c2f-40c9-b6fe-d957dd401504", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5cf7b481-ec81-46ff-9452-d7d831972764", + "metadata": {}, + "outputs": [], + "source": [ + "import time\n", + "\n", + "assert (std_inputs_fields == list(inputs.columns)) & (inputs.notna().values.all())\n", + "assert (std_labels_fields == list(labels.columns)) & (labels.notna().values.all())\n", + "\n", + "stdouts = [] # to store all outputs\n", + "process = True\n", + "\n", + "with tqdm(inputs.index) as t:\n", + "\n", + " for sample_name in t:\n", + "\n", + " # Write inputs and labels to file\n", + " path_to_inputs = f\"{config_dir}/{sample_name}.inputs.json\"\n", + " with open(path_to_inputs, \"w\") as f_inputs:\n", + " json.dump(inputs.loc[sample_name].to_dict(), f_inputs, indent=4, cls=NpEncoder)\n", + "\n", + " path_to_labels = f\"{config_dir}/{sample_name}.labels.json\"\n", + " with open(path_to_labels, \"w\") as f_labels:\n", + " json.dump(labels.loc[sample_name].to_dict(), f_labels, indent=4, cls=NpEncoder)\n", + "\n", + " if process:\n", + " stdouts.append(run(\n", + " workflow_path = workflow_dir,\n", + " execp = \"submit.sh\",\n", + " secrets = path_to_cromwell_secrets,\n", + " inputs = path_to_inputs,\n", + " labels = path_to_labels,\n", + " options = path_to_options,\n", + " ))\n", + " \n", + " time.sleep(20)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1efc63e0-a3bf-42d5-83d2-3392dc6abb20", + "metadata": {}, + "outputs": [], + "source": [ + "labels['destination'].values.tolist()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/barcodes/AT-1447_Ret_R1.QC.h5ad b/notebooks/barcodes/AT-1447_Ret_R1.QC.h5ad new file mode 100644 index 0000000000000000000000000000000000000000..b1b2614c699358ecdb7e8dca9cf53b1376b3d6f2 GIT binary patch literal 4944016 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

xy~RnjcGmqSQ~S-Jwd&fb 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

G@gMk4d;{OaxA1Lz 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

VNm#@ELsXLNC7oCkA*^F&~x2KB^)Y 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ɲ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

d*VzijwPHyB%QATXv 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%0DRXn3@kU+Prme8+SzO9+>?$8(vs{aLVSq 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 _O>9#(ab1P9KwKUnhOT-~_Its|iToZxkG9 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�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]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 z00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H z24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaN zU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS z00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H z24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaN zU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS z00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H z24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaN zU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS z00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H z24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaN zU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS z00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H z24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaN zU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS z00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H z24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaN zU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS z00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H z24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaN zU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS z00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H z24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaN zU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS z00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H z24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaN zU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS z00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H z24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaN zU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS z00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H z24DaNU;qYS00v+H24DaNU;qYS00v+H24DaN{ttWi8Er+mZT)_dbH)IQf`AATRY1k8 zDCR6C3>d%wf{HnTS&SIBq9O_yFe~N&Dk5Oc88b$VY{m5c9y#k?*J=0T+uHrocRPIt zYgK>x7~@|x=d7wZPZ$UTVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+0P z7zhJlAPj_oFc1d9Ko|%EVIT~IfiMsT!ax`Z17RQxgn=*+2EsrX2m@gt41|F&5C+1) z|7`{;|5yH1qf)n0qd5KZZ{&00&H>i>^Vt(rB5&s+PSKiRo?)h_;LOMhSfRaO}@Yv=*^DF5^S_kZoO z)4+i>DjQX*>aF_EZ8rY@j&{|nON*=8UW)wpzdmif&OiUNYWvjo|K3`u^xm!d_TPF} z-+t1S)wfsqRQ=VQx2kWye#fdUOaHTV+jal>FID^fxPSHS`|VYI`@kcsZ=XJ~`u3~F zRp0*W`_;F9J)!#c%~l@p&p)VIe}fyVZ@+lI>f0~5xBB+?Zm7Qf)2FI$U+t6X+xx#( zef!a!*8ArlRIPvBr`5MVc~JH3@BdtVd*f-f6_wUVZyXn^)g{&bQUKzqniV?XUIRpxXMY46DAq{iy2O#~fRI z`{8$2-#+K;>f0auvHJEEuByJh_F5ZOTYu!u)wl03ruz1o4_4nkaYps+t)HvDec^wr zZy)w{_3dk|vr)D6AO5oX_R~(NzP-tk>f7f(Qhob=4Qu}6SM_hp|5<(ey=|*+KX8MM z|M}A@{_3t?efwRfR^PtIfa=@-c(VHT>04LdKB(p<)%^e7tNQlKHm$yWr^BmnUvNhC z?Nd&wzPf3)kzxwv$>TOzW{jIO9zWwPz)wf@Fd-d(j&#S)uhsUaK-+Ny5?VG(& zef!OgH>v~%_C{d!m5KI*dS+t1yo`u0a(ufF}g9jb4yzue~4*6+1{_3gXtUVZzx(bcz4 z`cL)kuaB+1{hN2HZ(nUf_3dk~xJ9+~Pn=wR`x!&3Z-3#Q>f2wsuKM;4PgUQ(;)3ei zkAAiK_Te1{Ra^hrPpWUfZ)o-HZGW!5y>e6a?IUW}{>QKC-?sT|>GrDsUA4XHuL><) z>r^T?(_RfKmA&clMwQCSO)8byO)Hgw%_@~2TY8_kpZN~QAf zs+G!9T`HA5R)p zyXYI*Y{g2Y{YutsU#YCup;GD5u~NC9bEUG2_Y-^2=4(_cYGmrE*K<`dL8r(316CyyigR4RA(tyH@7uT;*q|GS#GmA?H%9UE3EuQ#q#wzYr#cGjX! zYB`u5lcm#YmC8eWHsW!tnqFSZ-^lV={Ys^weXg?Rk!>rLmGol``%a{u`qE_ON~J&b z(3`q^p3{>L?0=S8hRRa6U!`)dJkQbF{Km*}nmOKTj?3xIjdX(koMe`hX%jta(56xu z$A2;1$-52TzI2+5OU(1n9+gUKImcONq24Sn<4Cn_*UAiO7LNnu-CmCd^LkItb>-Vm ztq)*h8y>gPQ9Ub__vQVN&n5DXk?~_0uQtC4W>8+Tj;M_T{`F+;ZjF=WK2hdhXrg&s zt2Y-cx3o76R;X0grVI4w3hSL_&I_rZb+@I{tzElorSgtGH^%08>z<)UldbbJb;IJy z*1C)~wcbc;&9}zE`Z9^`Fz=cCzvJImZ#L7LC-`0`^S%QrmG8~`>{^w|h4$?wUswBn zN3Y4aL|?Aamsa}HjnB2Ti29i6TRdOjH(#G_*XI{7HC4WSF?FCmPp7H+^O;%hEa!oA zj=s;qPwYqhgH@c<;=+A@2sfck5ubdhvy0=LhK{)h$aWaEZ=!Ye`iymF^_1-qy!Dao8~ctmxAp9MihU2$>(1qPr_0s5tvqAs z34X`6cii(FB2%RsUetVCPcx*adpj=IaK7x12|1sr%|pK0*80g>Gp+TVwdUyarPdfE z<6!D-ja~JyfovDh2*=@WYHT5AAKX4btMb~3*Jf(n-8?q3&q*?EBU699I#i}zS9QFo zbw|0rlclwO4a7pz0czwmna6WHmXoImpWn=8ygYxI$2L6oR(nlzoI{ugmpo4oy?{dpK=qwrBI|BI6WZ_wjjv&p5}_>H0N+mcz-uw5A?Bst28{(VG8H zRD;iE_CHmYuhqCfmcsD`^ch{R)<5YN^-Z>aKl=}{|8zAzXb$ydYNBuFnc@1p4xszY zV@=t%(#P6rU0234=*N=L8k_3l9F0tMn*4tZOf2Y&T z?OAJYj?WwPXdUZ+Oi$_QZ`Pe=W|yetcI!N2jkT@O)*27dGWs%4JvGd&v)*h-lju_G z^jF*ZSbedB<3L>(@t@h#`HR*!zd?F`q1m<5cYjiON^RR&<1{_1VV$$-L%zf0-Pa%d zhOr%bICkh;`k9K)=Cp=+K1*GBo}+gg^L?1E;Qe1UbRXb-g*7^3<;8#{K@^8y{@d~i1XM%}HylC@`cmP?;{nD4=~y!9`lEv(tXoI2A4Ydvp`O?jV8 zkI}={*iv2JV&DnhADT;N{n=XYuh;wUs0rU|^k=T1E-A9uPIPr94m zDvhv3=g=H8Sj=ys`TnHuGx7MMzAw_Rr)2JEjiJ2%q`|A{qxpVowxibax3Vs>M!CGw zR>s3+yk773(TlD1y%w(nc%9GZNIo~Je=wgi%aO9KV~)Ksawc8Nqob^!*20ed-XP~d z{an3?b1lvnhRo7wnur6;4wv>pXfvVTuI#%&Fnnc2J593Rd)X$F8b@iaK2T1 z+^F{1{0k#T>T3^coJ#M~`F1SKRB=)m`8O8_@h?m~ujb3_zd#QsV)!qrsqTripW|ay zIk%CsqTVxP+*!s6YQ9a*#kd;4V}QDkqao^^s&~)uSmJm)YY10vUQ^k={mYeeYN!R>^6>dy*!t0pfT;8 z56ot`8DGTzRQ|i+a;n*s_d0d;b2VDq8aK;(n|}Umo%_vcH*1Zw)@}Ouiu`ls-&_7~ zsik#(reoInh zxjk#W9`@ZwZ_dz{=ja-}nL-U5Q`hkOn$|9U`n0F)AJRhO=qdXaSZG-fC)B2q^Ao=o z`g0E*qK;AOxKQ31bcf!ogWq0qcH;jl{twmjk-V;@dS=&MFWTwFKsrRm*Z7>w=K;r7 zOZ~V*t;d+*k^0+QuE}~kRIbzMA~jyk=N0=L>iB-mj2^eosrLC;jbG9#cp9eGF+2{$ zQoCMQrWWdZo5vPv+eClbt8Eu5mk6$*qvbkOrm5;|Dc1+)ob=Q+G=lPgeV}YVRt`?RtK=+W#ZV!?M&+b1iz1u3Qy2Jl>M& z6mz&#j)$l|PUotB39n%?{Y7u7^+dI9$@5AYio<*8Wd0pwdWEhq&nx&$kmpV_>8YkC z*L8j#;B|}N33~W7{mJhWb?&Lgr|1Q`MczJocook%vM%KJntc7`TW>WzlW_$9#k>zN z^H+IK@2}syuTl4keAkqB7M~IF?ab#jKFjbKtzU!HyAQvE_3Ij5JDI^my3?`ou6 zJ%XXV&F}=-KBX_{X0;A=?pWIzPt#%6IMy1qIyx5A`=^Zc`LD-+KF`g}Et@f^hO06kd7Jl>|isg1eR;5pVj_EYmX*-HZ(-I_b@ zW&4tTGLLa;f1B4zJYF!9!}PEwpX2Chn%vzvLcMp&JW@Z0@+=JQ$#Yd1r_}SeYJakk zzRB4|Z!c5#SM;XZ8_WB#`Zu*kFZDOn%l>o>-x+-0*Mq_OxUv1uq}6#eYvS0V1N8Db z^ZA`eBRP+z8`SDlRO-rtO;(-6l@`Aq$*e8-#5Rk97j;m@>wf7d(Y+)O`Trp?rU5H(W!ch+vN zuk-b^hjoY1*VgH1jZ>^~t3KA}xs!Sa>*GdzkEHGKzP&m9Nn7*ZXl=(O77iJ}vxa|W zoxA9D>TIpX>Z+-yn@}A+*~mH_9RK&}?<&^1O#buumiID`^ZbC;lKmXH2lKm*Zl|{V zmf^R*e(#~*!{`oLLT6dyb>26~zo$OkK=tHrpf5krvKaW2{&pVt$vXGReZ0(f@%;-I z2l8D36VI62v2q@*{yRH+&9`rx?#}nvyi_0h@wivkaq`_q3!Fy=%2}?z%#d$7wmvD+ z*QqV7&ua@aJVLHMxc`N3Iqo-U5L zV(QB8^JUej*2na*pFSQ#%j;z?{%_LDYM*C~Y4YEIkA1B(-~2}KE!X6R$UM8I+GSo& z)*Y$7bxzU8a!sVO?8iF}ezeXQYkb=QAN;Q2(@oC*(8l`lF5SWRZn;;~lgD^}tfv?9 z?bT3SJa^=|I=)Zk`97~-WIaR1Mf^6?gA?gDK7aD*W8c%vqo?!75c@x2-_zxpPLIg4 zlKsndu>JM$02$x(0OJ~V6gzrqfJW!2q z()N0{2H(Xr(5!Zo?=HT->)$W(J%)krSNC@^_EPKB_&EWi<#Yc7{5LnJRqA=4BJ;I; zH&$y)v!9No4l+-mx#s_pxg4#RgXKPo=a(|yuJ%`Gf7##QUtUv|r>WNXh5rU>_%~Na z=uLZTEVM@9sxY;uUfgLmg`-b-zKo&QX@*`5;j`-6nBi5J+E~`XJhqqh7P-pn@Dk^l zgJoJ@&27}&l-Ct9b&=;qx>KH&u=56O&F5B`+|;iet*^W4>0vY*LqF=l*Y$0b?I^XE z&qZ69TP?MJtnOc_yR7%pBi34v_a(evlye>ZEVsr_l&!pP`;N{ws}=Nd0*{C39Lx_> zZw)@jnfbM5^Q){6b;T3yug;TcSsC}^HA$4^YU`<*Kf}lF?nsskEE>QP% z`nHoC6*=zGul;3NZ2uGVYnIwxp+<78rLG6*b-e7S_g~7f43C%f>?}FXr#^BFr&syC z!EdDV&Afiz6Uy~9eNs~fe!b<|oCfIIb^6w?h1`zq6=Z8BTY25tUXM06hfnnBEM6z` zT1eOOIZ%z4%6L7M&%MogU8l~q_?>J9JM#Ng?=CRkj`Ci_b3%Ks%krM6=09jA|AS;c zM&9SUnW4Dp{EDo%$=F+O58&6A z-?@767oR?S{-XQU{)T)5^m98Z=kXQvU|ap1$-keRjbvQb+?S)idUC9_E~P8zdp+LN zI{nPCuz9E6jMbAz^<-^5?=Jfy{Ww(5_cFudXpwavS3^hsFVod(*wGqOX(PSpV~q#& zV_$PTMNjTm&ob)ylQy%)2iEwJZc*DO*6NGBTdh^DtMy*X>$ctxr^~HVUwxA>xOq*l zGuAvy-+r@Z4Rigijr|0)>G2S2Ua+dq0eJp`Ua;mV*1FOfcVVZK z9xTSmj`~pEZ;e&^T>6>Es`|MT&E;{Z8J$Xd^QyO+x@c2%{7UQd-Kcou`%v|i&)To) z&CWcR$iAW;9Y7b$-&Ni{G5!)J>RYE=M_wN1^J%tT72dDbt1qxIL*GBr_cqq(+1+`A zYWBc{HMY=~g=DG92Ask%l~ zt_|I0|D9wk*M=U|ld9`Ovt%yUh`#4jt`og(uH~34*M#=wQ*K?4mE$NL=bOnV_&?j< zpRR|4{cTeVt*)k>Iy>g6t6tu&j}6VFe3m#`UC+}WcxaBVbI7j$Tz7ncZ@K1Jb-i(* zHU53Qv0Q7sTc)b(jWu|`w7S<^{c2&>lQe3+nT%}UwMtFpGk>|Jwygy^<7AW>Ut_+1 z*zY<$?{44iaq_1=U1tB?^y)b^UL((ke5T9O6_a1dah6(J>hsOkFZcP{+y6W>YpRy< zw20p4bC7+@HG`oz_znlh+V3%%hJ%SX=*;76nl0B}`ZZdnMf`q}=?8gM=W{wO(4R)K zeJ<0>j^%6Qx|!~$$$ECBb=JUjb2%5#I?b1UhJDC7C(8JjdQas29`D`dET7Mp*Z+ZZ zI`0Q~Z@}vo`!-YOmNJ+7Tf=33n5O98wK9H7fiqTtiS*>EYAzPsJD%*Q}wJs4}G0Y%QFHU^ZfCtc zzBab3aU$=rbT5yQdU~~e2dT4v53dU~g zJmT6x<{ixOD(l=>&-~2nVqQPdU(1^dpWd`*XWP~MI-Wk2`$uZb=Vgzk|%rTMJB_x}hhcP*HJ+q8db<&R9=FCoYb?@->DGB#4~~%k3v=r!Z~e}; zS?dH%>}0Kd_27LPXLdJQZ?UzGvDU{_hwm=5of;;a=h~P!NRK|j#3oJkms*?K_WJS} zEn|(z`m)t3W@N1n*xJ}S<7v3sI`N;vw}D4x8`{; z?Jjc*nalf|b9n#MbLnU2@@&_e)Ki}yQ2QBbKL~3p>GLPFSnaj=4d(ThS-#HedS3n2 zej`1n*GK5Vj&i?9>+v2$+nVh=^q`)N=m{u$}BT%id7#b1+># zOE)#ky=jELlzRk+I7Y@|@*x~;Y35cfG#|J0q=i8y%qe zJ@o1zJ-?OCx86)OJuY6W+I|<*dRb{h)70@NLR-0CnSg5dBP_^WU9sFa2Acce$6_TrHQ< z-uiYT|1IV3%YTF#R?@Ez=%V`0S@Z{uwN`nKVZ2@qQ_lnX^a{Pf`zYRZc@EQ~`+2Uy zvt0jQp4UY*O-a9Cv8JAM;&Y0;H|xiy_U|k6=`xn_V=A`m53{QJHlhpUd*4i6;d>gMR+H;`$8UMvx>2rkWcop#gKK$xqzQaC*8kyZZEVh~ z;Iur$bVF!|N*;;mIpO!7E`hVyuq-j!(%kCp6yts0N!F;|Y7`o0e> zpu_oWC(l&#{8EidtenTA++R7y{#Ex^%Dt6M)m3$W<fFS;3xX6Cid{Ki5i~d zyN%30;Ot4BXXtxhzFYD)G1kM(%l(m^sp|enxi9h{9i+yN>YIn3o6Po59y{yX*>bIi|6TYrmTxO+!>inb z+rn(_k@sO*$n$UYmixHJsr4x=jn>mw&FDP6`$fIG@oq2U^=7hCPAkxfgOiHpZIuO?o!n zak8Z>w@`Vu_XZx{;Ou_;m(S4UzVzGr^^Pp}@cEOL<271+)77@Cemz4gt?hMGj`Q{W zAwJFI_>^ws(~ZXi>RDSYAL-lP`Zbd_=TolRjHY>N8lrFa_i{Y)?QD(}zNb(-C{B zy^hg8X#@SbmbzJE6a6aB1&*rp80u(=KynfmfEQO6*^xnJK}A4O~)0jsGo<@Wa}+sy$`K7 z)q1Px>-uUbpN((Smk#E%wwgLy`+CRoCDwb4?pMQc);v@8kM-sxy=iAwzp0~~^Cs!< z?R*ZF{{s1Y@Oz41XMNs;Ry3dId32O_4ZSYh>?P-TIfr8UFj)ud^*(yNh}ze{9?$wR zPL%N|zU3K=s_R!L>GzCsoXK=49nP~{zxwyJs~^q3QVVnHev3~NnflQ{46NuFX`-*2 zP`Rga2E9eU$XD)d{Y~X{bszPX>-^8tIx@be-Y>Crke;r_w}D>Hpe|}3Xl9dX2LEl< z{v-XRpEs!gRa$J#v-P$-_xgaI{^j`Y)y;byYi=cbc^-Ec>-E>)r}bo*^**rPS?aJv zMVbG67omIyq3Zhw<+}$}&rMyh93H9ad8sS(ynOGVJTtYkDU#^|y+Eb1u`gyV%uQC7CWEn~2v-c!E&(hci zOFx6ZRdVt9n9B2HO?j028|A*lk#;PfzpFlbUm;V++Kv%E*U;8@AFsCN`chg+Gb+A>K^3xvXpy}rRUG!%?`Gar=ecrzdxXk4Zs+dS zbS#$VVaj>#FWMew!)3k7Osg@wYFxy^^<_KV{wJupd|n)F z29xdo@6U~U^SMZ_#XPou=4pJcsv~ne5|O+G`cZAO5bCYYVl#O656$@@&8<>MPF&G}4>$j6e$>E_s_P58dGhV$@R-rK1C78+ni=MGS_K9uJi zj#5WW*-w-E4Y`+!zq}98M{`sMy=Lm8f-2DNZNpUKg?p1C*l{(KbVl_t6^q zSFSboO5>=Zkciz8xp~ zdvZUa?!C-rn7)mqyREaa`CMa-gVk{VntWuxjOyvbC^KKbv13pFZfxfK%zq92D6hrk z8H%;|pCEIY`L4Xnwb7MVS3j?EZS-e(XPI@?_0ebfmusZudz5!O-)?7}s_UbFnA>;O zEAOXjt7)NrZEM{n>e*U7XIk%Sb9j}OQ_p4X%}gzas^MzA+QHiI(}vdkg6|xD702QW z`u~IelzVIg_2_V3y?B)8VZSxU3wgY%2j$t4z3gAUyH)O^H^XNud7q}qGLMyaQOV2q zd3uEXAT#JCYq=-1D_w4l)%EBgv)$SnZ|Kjvbg8^=Q8#n`iGIY<4tn+--KmZl^b6f3 z(?Mo&i?vGcf5u^ZeJIzY&*wMVe&u@f-+EqkJ-S?reyJz^_4GLWO`>w`xm<7VYKA>! z+=5P#uep3L>cK2MeT!bui;r9DCq^!ju?JwVn^s0>4^6aITi)j~L7t*8r=E-`6Ikh(X zA84_9Ysk75@2_b$na{-ELVbPEI*X`UWV@nvC-FTuQ$(0 z^k@&~W4#!vuOqCpf;AfRE!S<2(vM4Je%<~Z?Y|R!kBzCA7>cP+^kEN7?7XI#QA0CY z83z~A!}`$|2S>R?D-3-cW&}-IO?7VW99{pgxHLbNV&7!;1Reu@h4s(9k+IQ;t$Nct_e^>oE znnvo;5_6rzZvelO>GOti+ILGmIn&H;q-$i`(2UMk_Y?NHPfyG9|Fy7j6ZPRSf?8sE zWxd#h-)z19Nl#YfIZ$7g==C=|k8fo?I!3?m)awuR;!XbL+T|)#p3mM%wr_Zp`+;xL zRs)v4rv1ogu$mj{?W#1Skz=^{(vH~Z#&da|XVZ@AE#C>BOuO>EPu-izUx)u`w1Zv_ zR?Fk^|4m=%>&CKwWWBd#9;UD5zQH^CaRm0h(9?1sWqBIFe*?NnUwi4#nP$~hZ+mv~ z+Go8U*m$U?^MM|f&-3r|>n{7R{FcSWUUaAIuhJ*hJ{D#uQG*$LvG4O((uP65l za<9PiZYt;K`P7-$CDeu2i)LSb58zS#JyZ`$zNz~9w{uW4y`6@uw`JT<-FMJgvUPBr z946mQW>&sqT)u0+hm6nZ?+yGW$W;6e;8*T#&yr^fkLgsN**;rO%V(;UWGnX(M)19! z=Py(|8>o8@ukwA}$MkS2pO5&=)31Hh_n>U+@hsm*@2Jl4)I@#TQ62ftp|<975U!^5 z_g+z*y=Vg6%Ws3mYHETRbDv7B+tAq|Nhj5#|Lzqeea|rWqX>Q(8mMR-^M(iq~3BGN#%zc>hWJb zrSjdwTITaHHIns3>hE|RPvv(N?$*=tn+oMKK)K>n|^Rwe)qRzj<_1bGasZg?@cQ z-_z~-wyM4@(zngk++WtItMK75ln&Oz56oagYyV}v^4#ET8ezY^?N`n-9n?7ra~<^Q zc(u)>@*Z+mTpVeZOM2;FALnj;+DER*{k$%#?+)2+lj%Xa*)csrwq?!X8!FG#4W;R{ zg8Is}tGU)F&n!(+XE!sLDBHQ#8RnR{j{nYl*W){y`kV3LG|w6{%%j}Hti|g^J`LLF z4K;Rr)RXxZJ-f&(ZsS+J8+{91!FPoo7^SCZ3jgw)%qwPmh8cfmE@$$7T3?@~t<-R& z9+i7a<$G#-nE%T9GC*I;d%7_)*VdOm_4W?yl=m{5TH_Hj|B?TL{P*JhBy}?XF0$9R zPRZY}shoQM0hQ-kLv9%v+P#-sa z@UjNaZK$Ey4x|?9Xv+6Ien;_}+syl-7OtnzrLELnyxKYsIo5ucaRkq4vK=MUdGw^3 zS1x(%Td8ONCXQ1z&bIF__U&rlx2dL{&RmtZ{STw^eVoVivzaXO<#<<)TUq=nOZgo4 zC6#kf`RulV8C89LyGg&wXSnj&t$c1L}N?rpoZEUfn9g zJ=8^i*5F${gM7{Nzj`yq{x9mqVfNiwFZQ?p4^+M*T|S4br61)xU_Z$>RDD0mcbZ;5 zZKgZw^_lXO_d{pNw7O&9Bys!6Q=ZlQk;;AM@_fTS{66GY?lteor)3AcQ@Q8-C^gWl zX?)9l=Oz5QtM`7Yy8rwY-$t??!n<1o>rhYLwe|iq+Kc~WnoxR3?X1z&CR$s|If{46#sHx>9^7sGp=imZsxR;{N*0n+xk1w zI`69CD?Rx}_Eq%uHvK5im2G6sd(g-F@(q=rh-$|3ZO6-_`f^)i=U4f+)$4}(Gk$rq zMhqOw^8ed)P-01otP(h_0Z3!F|{wR zb!D4M?^1b2Vb`+HBB)p&ip zm#&wuy!Mvo62H;29(82o^NL;_66=yDYtyTCSlkW2WUg z>Ylvr)yGa|^D@6d_;q2qTfmEV;)ik`Cn$@rM6-W$x~A^P|4%k1HN_KJC2srH`g{D8#$=lkyEIf!!I zzI@+(U)j#HR{6gBnra_q9v|vw3-fr1mbbd3dcSw4u_8D_DAT2G*Pa(&j@x!XDWXI>-adsn{l9;BSd$~o*i zD(A8Nc>eobwiWO7^x$~@UHG@v$MPI#IiHpD*zQ=ojCVPY-Av_NR?cCEQD^>d(H^{? z;oY8hc^-U`x;v@&5`DZJKjkyxI{J4L-NEa7KEKn&<~*C`Q9pgC6sD-$b9fJrWAyMl zUgft&`sm~N=JYa6bsU%bTvzcf&((Y&>mSzGQPwB*V=}+9u{lgH{$YsUJSwlt+wlE^ z%5}o|<}`=@nYf?Nx17Uv=e?(1JcrNnJ(uz<>l7*sOw*4O)bO|(o-n)ex%^i>zen`d z^toKGyMSjCJ*c`)*F$ed>uWQ;7$9r8PFJhT(rb0)I$c+O4P`E`l}FL-`dhBsb<^J~ z`L@SIMUQW!a?kQos=9Ak-VdCN<9_lFFvnx9RdxUJLTi@$m!qulsNCf~=FfUQTjsj@ zQtn}HfVHov{OsVL`cu2U;|;@ySmQjpT^~;8Gfv*ic~y8F#%G$m4^x@rWPXEWK0+T( zpi}(W-#p9nR#nehRXt->z5`gEvHG0Kb5@Npaz2%7WUuH=xlXarIz6p1o6gXW^1DgB z^?HWP<7%t7ju>Y5hPm}z#``+8@6NX$pYnTd-OcULj%w$3F|S8tewC*4D$hAwBkLoy zwjS@tv#vfoE_1n-vc390a_L$U{9jLY5)X@{Y#NWR~BZKwX>ygn|R z@miPHLKBVYgEjgR5 zr3O8$@YtS4*#C0--euoA^zm+e>}+{XJ?-tG8y-@g(14ZmH~ z`yG|v2c5!mO}!h=^8oC%$HdKY{_o!jUE2cld6)YJCp*@Tw8ljKb7kE~)(ag6<$2x> zR^h4sXXy_aC*$lDp3j);j%Io@ov#O%$^NeFC(2$?|D{yEe?FUjvBt0bTd83YwbR>n z{O_VG)&HZs<+;rM@;2ptF#e7-uZwt>?^*TL+Y9x!8AhJc(|h!Eb-vAbmFuL}VelRr zg`1aT|C2iD$Cl=|qcsNU%Z6%soyvRYx@!1n4Rhu{L+H#GQE-@9)K%L}wViv-I@@4wac9{(r!ucd#hspVb$-vV6 zc==Gq!_4(4IlrclONin zrs>^_^ocb_n9C~qc9*XNk7bv$6D}earQ{^8832nVywtg>KHP`d3^3zcItUa=f9|G5D;ne}BvJ z4!>D)l-}1-+nxIMt^G^y8#zu(@2^qI)^fbgqiPP9@OWAI?c^%g@AlQNd-SVZyL;OV z%C);M)bu;QRn^o0A2-pjRIcT{DBo6Ue1;}kqobbvDBm`GPf_nYnyP2zHRpW!n)01Y ze=fW9wY%_kV`u!>cdC4y^||o%gN)1AxBQk@6SHhehf#Sp@hd)G+JCLWh-~F|?aH;m zSM;eoJK2OsIhH@H=$C!UYks+YP`(#ebq!&EecIf-*4C?XE#XUE!`nKhuMP<)4{x^(6P8*MLoOFA3Sez4mgL`5MKMsRL;LE@#)%W>GPNO zuIfCBujRV>8$EkV-rjoFn*WJ%UTv1;8J#WExP%VmIfUOhYK)0C)RpJPa(%(8-19!q z{)g+`XzDKOb-ZqK9Mt92iOMr;|CP0^jAxXbyvnmM&(o*8ZdLO@8RyEl8s9}Sz0K!L zJ$%6&zU#05bsXC?lh%>*9hxU+xn5j;!=QYRwtSA+O;5{rkbX6vW6Y+GKJ?(<`EI-x#`NHJdY_Kc-&@RY7riLoo7~i~eITDh_}rqO zZ>slD`z1%Dwe+U3^7ZM`Lw_jCJ+k6B(c6*`4Qa z&VzmVUdH!zzQ6Dt$!`g@G_NmZoS^pRyx%sr(d#-tLf|L5L$5!gveujOeqf!$tnu&r z)yMIFP3`5gRryVc^4Y5DGgWW(j>T7ME4bAxIR?aWhAFaj{?f-*1ui){0*%ybC?E9t}lxw+HsC65e z)>Y4N{VLxFU&3!AHFRm=*pgvSe$#O>6K{7oHomt17T74?TkNGT7wXBbdNPa0mHM%W z2CL_A^_*me<#l^5t;Dl@*01`UzqxE3%(m*YefeBpKF^n9x_pi=p8twx))c%Idf5}>2H#^|^1Z&)@x93`;d=F|@xfkN`2ke|?F1PB-uGV-?{>Ijr z$o~$W z_j**mYhBN5%Wri2YW?zCHbc##{65DadRBg;V?FC1Yo>E)J!@^RM}4ic5=MSgOAUS5 zj@nwUv3e%*Uzh*a{BPnjm%gBBd`j*%e3sFZ73Dk$2QO3kjps*bP5U218_P8s@At_x zpu08ge;5ta<6(}+*=9IiKh~?^m^HhB`g{*oof0|KG)Up zdD#p`^4V2=<$Y~OeL5V2_0%<*o|ADu8PC)Esd`nHXE!z0D!KHgA)kX9Ii{#w`#D38 z8<^ppdQ`p(`xK9Ve;0ORb(ZhKmhZuq@4lArz3#?qu1v3}>qtF*pU-=IF4m{H^cC&7 zocEe$Hd2qe*#AKLU#G?`?LXb@%X5V%sHI#3-dvUkX(e7Qd0kC|G4LDDyY*@Yzv2AW zkmWFQ`kMyxSY3{Cy|$emeXXun_$}nIh5gF8y&skHdpW1yX#J1PyXxG&te%wXgysCc zOkeLk^t*;k$IuQ1C(Bd%{j+`@pkL4G_knVKt=9)ShHCfr zH}ajpw-evp%&G2$P>rxy{p*3YK&z1F2Z~1NTrm~GQ%USgA-v>WUA1>p)PIq6` zsZzflt{~g7GR-vC^1DE{^ITV*ZFrU6Ejkuc3+a7zmTOk!{|`q$b7*P5-v0g$vwU2i zc30CCG{-S^n%*qb|2Oo$xqT0_b`KnkwEuzDpQNszseyjgbL>4q`|#XUo#W_i8qfb_ zI>mesGLMgFQ|laRja$|Fuo`!^ev50*O~gX{W|=q{5DKYy)MtGv^BQ_slRo~HJ7`o5AL6(Ev;3qy>xMGmg_Gy z)U>8vmg_I&+Dp0KQtn%n>n#uRFV|VN<6W+`Y|s07{VLzHt*>Win#}?}pYu5oALaSq zYxJy!o?XCqpzJ&HoTM+q^ko*`MKnq+f9c6`YWSAQy}R=4%dPwy;^ZgC>||LVpd0jM zyfyB!#!R|YU&?bw+tE8T)f%7Bv1YKMbtYJ+lNx@e)vfh}waRk@$J0jYnW~P*{G;8i zRn86X@}H0I^891@eb(~q<6JD2-(-E?zFm8&*M8-B$JzGnV!x`_tMXd4d*h|ASN-+4 zykq!TC==|Dyfnyp`u7EWEP%j*NbQ`LBZj4R03k*4!& zCg;3m?5pni=C!wZEyh~k_C6=+f6V>Hsw>U zgI%b9&+>WCaj>lZb)|Kv+{6C?x8=OGfX`fgY@z;sdO3tn5lKy76zzrQ)KD<0JN6_4B0xiVJD@1krX)2VvaQmy5+t3AI~JRVoyTXJpN)_VrM zJCe^He9ANY<@)&7MY7FQ+gtR2JauqrT>t#O_R;(gHJ5+?o_6^@^=RJz{GPUc-N9>& z9onm}JSSV;mk#1_mQ1JV&$ral-!IUo2J$?j-}7?cuf7{yo(8fZoia z!LpQR?>FRiL#b1a9%@|?ID61@^f^5wPcLiCrgEKdsI?Y4xBhIMVb=LV|86qdO`NaJ zFw-4neFW3b^iiaBw(uYOnCsDW7-sIlV)>rOkM$s|pKbK>Ve7P!eGA%M%~$H>9rP=8 z*VCKT(p(=dq!-mOQSP<)wddE3_K?3HueOb4;&&W%GWWBo+;izI^FD3-y`0;~Snf4! z%d4@Bv)AI^&+BUq>&mvSY%B6<=iE?3&9Ah@rdrE+`XD(*+V>;%?c3X&WGT-pZ($}2 z)Oxd8%Xfhuq!na(kKcysEcX{arSf`Qo`IXI&hq`BZ+TXIN2q-7>kE2Uu5){Mt?jk+ z{q?~zo-E%2D&H3>&-Krc@l{%6UT5NRS9xFKy^~p$-_)qjyFA-vt~HE#(FK(bR#Cl@*c3>iD> z|CZE<=eBeDybm&u-yJ7|DExy$*ad=6=0jhpqeslI&7cQD^i_3|^>2bj|-{Lj~uEA^zenN`%Vk=~54 z)>eA_+y7zgzT1fvWiX;VgqM z)?!~t`%J!EtLYf%Omi<-!k6<9XJ-t=dq{c zX&S$xE#9jJX_tkjY})P&@FCu>-her3=}npv?^!QZ5-TL$w@UCf)`P{n@)6$dk*6b2 zT+FflKi1cOKu216YLDktTArz(fBwyYSVM4;uKH@A8w_uzGr&BF5T1Gr<2%?4PDGaqf=(H84$;vFW3+$yz~j7EiUA&mJanhk#}qiJpU3r)S|4}Ny&nqVUJ2>wFM>awtB>>e zBgmOvo#-d_wvW_Td;ZMkc~$+r4;}S&LM~$s<5=y`?>bT@_XLPVM+Bgn9ey6YfFy7L0-(N=zqh0e&mwBE#Y$(`Jo~9 zFx12o&%FD1yAnF%DW?C@+CR_7ZdE-$;Hp}3AkNrB^$i@y6KmRTq-#3FIOkFLP%Y#U zYkz&5)yEb-wh-f9F+M0~7x1SQ>pODx7sNY81^xUCudBC(V%|&VR{oCA=Q+9aC#g2; zD?RSJoV!YTzR1yAILm3U0P=|;e%q$I_%q|5h5rYrE1vdvk3bjP zUFlB7`w8r(InL#52)$^n#LqaJH689`HT)8;IG6JW97pJEMQ3}yEapj^KNPphnTPVUi-Lr$2~i7 z{%PF1>p|lF9qV7>9$t;kxQ~A<{x}CU?&lvt;$9y2@m%7Kvre0ccM0x~@HUeBixA&| z@!eKY`flG@b10k4|M z%RO)cPX_tD;2LZwKh?yTCcU~BV>L0h!?jmj2jL7|>+r?*QT)c~@APcM^%p$GyG}S> zOy;ZhA8B8XmQUf9Y@Sha+(&#bs^!>2@B)sJbd{j1r+jXNZSXUnV$INZFdKgrdT+zM zO{~v|^#=9$2EASRcAwhLppIf~!YleLo53@R52^4c)+78a2mie$;c?u(@s{RetVxKq zkg+DAG~S|km*b87>&ZAj$M<+9-y~v~!H@a;$S+54LmqyVgf>N zO8Y1Hw&Ht^F9m6@3s=$NIHhu7`}`h_QlIG;dL3-$Qfv zfJHEZ?pAciI{N&y#+rsWFL587WA7=xB-XAa)~wx4XRKL!2IufR?tL^jD<~)U8_9JJ z+Sfy3-P&?}lql~WqjqM>L5xSlxAfb5FU*@ep#`lyvhaiN@8-kL@Af$N;Tx)Meu0PR z&WbnYG4J8Yd$?xt;B~cp2?o;KKdpB$^|v2K4!TxA5j^>MI#k>Cau)M;CFN*0PvbrH zK5@UHZE89$i}xBDD)X%l-~JHeDIDF!Hck!4x|*qKYAvk5@dV#CY9D*SZl$3Ep2A}L zL~KRy#s1W7@T@$qp=&1IlQ^%Ur95nf7A5>M-ka3XU2q8M@azrv7%u5+81EK94Sf!U zBVw<@$5Q&cHI-`*Vm>q{osV6muK5+`w=Bk+5nqfArQ8>E8RtNJu{UTq{ZG~AE&Z`S zs5Z_OYANQMFRP`A8GT=5as7!QvpQV^hj_FxuiDecd$@1JHHM!Hab3WX2S+^TPXlZI z`7NXt{1}RBoA!s{3@FjigV$z(vd}uHfy&u$v2mnPifmvY=tX&2Y?($roa#~K?Eb{lQ zSTfL420o+dQ5p)1p)thTzt?Gq=k-ST4Bt=CIft5oSy$i}-=}adZQFQt0{0y_pDX|G zywsyOKj%}onx1vMKMp(jAMb{-7onlLn1ORKR2AoFp2zyjkq~p11;o1?QsIuXwrlgS zH+&?HF8YZ*k1=kQ3(v<8=fWJPtBSTOpc-v&K&**b=o(q2_CBQXMr~`-cnLmJA7|wu z9S`HZeYZmTaG!^0NpL|`1Bjq0S z7|(eSR>F4N#rS(3uII&5FkU}z>LYQ^$Yc8Xf1NcF=ZxIR(+{+bGe(Z^^KSY&YPX&T zbNLv*4fcY(6s7YC@uyRRvs@2L%7|TF#?jK9ma;gm*LP+9wSl|EHzK>7KoQ;*!*O2i z3{?Mji|-d4cZl&%8iuI3KWp%q{-rczq~Qs9t(-%Rsk>X~xJDkX(|`QN#6=#({OmV0 zG?jz5**Lm$8v}y$m0#g^J?JC$7rk8cNq9c^br{ z130h78Ryj{^C{L$oX2;S*j~mN^9Pf7e5=@EzVVFO%8hT480X=sD85;60Z$(}o03*7 z;M&Hs9z1J@vyYtJsz!&F^F6G6Np0VP`RXZy_~JJXdO`4fN|!%P)dCvhshPpE%yl#d z+KBZWu2XdVT8J*5ZJ_T7F080C&NvqGs*U!Eahj828=)p+jAjhPI+2uPG~Wo~UB1Ow zO{_nN{rYj9Ry_Y=T&6j$m*5_Ho`6a4W`6J61^lg=8UmTM?Fsk0j?dFDua;|{N13&Y zwUn`ja5$_x+*HNC6|Fe9)Nv?hu z({a4-@Mt!^rF7I4O96FN55~gZ(3saZ@#`Y)26(TNzsj_&f;7B}^Hg>9&+qcZbEqQz z9qRU-ENVj^iRaO6>i8&>;9)$M&ZxV1F0IgSJd?hOeA0f4T((M9t74D&`gz&CH_6?2 z+N#iVE!+;V);H$uEAlOBE#~gqXd83)rR1^})DeHo-^bkjB-;AZmPS5H(bf^~Vp`tJ ztM+-?2Ipk4mZN1lu6A-U2WsHlfOE5aRubq8@gEj@MtsTiU4)!?-^Dpm?bZ@=F5F#t z8*7JO7Hdl}_M|l{tqa6h2wy8+o}n?uY2!UBz6r-_+dr4ulap+;HGyOtGkEni%#rgq zA?ocBdTZjF3d7_l_KZyDVGr6LP=mkH{TKdw=sTu{F4A}%eb?fD9RJVx|Vt<=e2 zu_V@aY~WF>>)4DVx7cEBM^3svr76~T#JY}Wc(aB#F_$%jKRx+#Uv56qQ%-HXDu0!5 z#yHYwzP|vmXJorLYw@}R&Pn1;FTT9+tN2FHSE8=>WpUok|B3LMej4cGE8Mr`@hrvN zoNr(8zZL%HAd)pw7#b5=MCC-^1BfIZRw6No6lXN-Ss<8zpePPUf%A}&tLRcl&{M8`#^erjDb1P zM@H{Nau;h}EM(Am_i=@JBe-(le@r zdze`Nd6(C=n4H8J&>bMgih9aTKRAKoxc-~qX(PVR;dMDbPQz$%^e^r?MaMc`?U&~l zXxRndLSuR=@~)ja%7%Y74@aw|*xTKbzF0$19d{3P6=T!e`FIj)(EF%<>dM<2yo~kA zr+C?m?rHKiRDNEQpR4eef|p@D{)%+RZ<_U|yCCkjaV^1h0=~iZAg8wlvik%5Z-&46$*vX(!3@YJo?LPj z-|#))61>N+SZ{Oya;b}$uiQ^Vd-+c<2O0HyR-X^4gYEkJTP(loZ?1ZKTz@g|730_O zT#RR8JP#{EJQGig<6b=RY`h-Ni}Dc9$0NLtXJjKam3U4*hNq%>8U^v)alayo?~Vs} z6W^)v%`t?>AH!BYub1N|a94A!P2x-C3jcnC#Jqk@T(Nd0_CUqDnT52i66a(wrp~K& z#24#mW%vf2ESOC&E{po*O<}e7 zfWG?hIrc`b7sE<@RFMCN;bpm-tdCE`uu$!Nr;ib|7r=dw_&dW`?e6E}6YBPB+VW{L zLF_v!`L5#SNp;hfpIP}C=eWNLsX`;Xz=LkM+S2(M#C;)q)_?B}x#^n*agT_5!vS^G zR6ou58~2Id=!|VNent_=cuN zym$~^#1nH$9m?@h%=NYXRDE`(VS(%L3K~X1yk9*c*Cl9)xubXB5pmy6Qz3eO#r3*e ztf%QAdALHZKjdXS9$tV)(yCWpmK5uJv87xKv;l7g{>56L@bMtdqv9Nh^HKU@?N2$^ zXRQBe&%f9M6>ESRiuX?*?o#`6@ZXI8G>p{8Br#l1|Fhzc-zGRI{@(I3lhzpfdk*&x zxIa+~H_@F{A4mB(n(n21i1V8^@N%@Sexg4c{@Jh@_X7H#=f^VWa)oD=`j6l3E}@SG zP?g7jL#!YB6z?=S+6M>d{tF7@jeFr7ym1eV`(NDqy5os`1#zDnhUWsb$8&XY@zWgl zygO-)`(7zp6ZgD3)zgm<_r2I>9Bbe!;Ei?gpJws=fmm}N>){8giC8Q40MBDg?R)wb z@v*h`%Xm2q$5?*es{IJ%C*-AVt61-& z?+G{o537e53ytU6IenzjM}6_fTv7vZ$JpJYbfp#dTXe2TI#JY*Znu)}EiI238Gst7T#4tE7*D2RYyn#2dP9oMw>=17kT(QSvgP3A2 zY>7B7(cV_SgZQ%x=BbP4)Ws4wqFtV3nzdb{?Q?S2mS4BI?rw*e+Z!OZuf$e|#-Zw@ zE#K>kv85P`7UBbqx2gB?^3WBM%Xn7lbB!8YqrQ*vs*^s}iuYAs71Yn+sO!x7lb6Gg zQy+Kf<9qxy@c$yOx9B6@n`5nRS+O+G$2)vDqmLn_)G$A4h_9Z$2Jke_^NO`wef3im zXN>8Vl=B$ZT_xX7xw?4 zyQV&x$m`8&XD7t(v^0~`Cn3iCuFAzX*VtV6n&#K^@h;u#`IOf^U>?m;habWpv`)}| zv$l=3{Rl3IJMP(~X>6(eYVF&~|1o+Nh&2~4FT*ANmD7HlSU=3a{MvGbF-&B6wx-f92D38!`d&0eKZ{5e>(lY1`qM+8u^a1LqFhs zjFZfy<^0url;d`l^w*c4Cetas9-#lZM8)b`Iz-uA8`C;=F*kW)j!R1^jV7 zK>S8;ytlQ;jYqqk{yx@tU-b98<)&eH45uparn+Y=pNiHL7i6R9C3!zaPhLFD;5}HZ ze*23%#s>RBaXFYSe{p{I0JT-Lv>JiOVF>Pz_&!{0bH&zMyEx})BRyMq^(dd;fOvn5 z^Vo;;={HzhLhg8c9*WE3)i|0!4fU9rrtffdqATXoV;@0pe#Kn+*7WXk{EG8pVlF)~ zhn_eu=H2qHTYksfd7KxMa{fHdijneE#i0V87ob%p?~V9I^ZgyZ^`J2opJQBbJoMt> z0-Ve7#X8FRRooxxZN$e<`Tr-*&UD5+e9HOvc)nMcgLuC0f|!R-%)w8>mrsqv9QtQ;|$>{>P2zSvmTV9{4txB|N|5NzMBKJTH~a zH4I;AUqbs>t2Y3a;F%-GJ@AZ&h4C!m<4Tx7_gr|E@$-1mOdlP^yau|{{0W@aPceDE zp4NDdW>bUN^cQEHCCSYg`r{p^15Zlow^4pIP{4Jq-vj!+PM;^>fPU`L#}(?bCy&R# zUp#(8?%szZVu>|XaZbWhVw$V3y-)sAM@OQ(V0pF&&>Xruw)&Amat`jveldp$hop^hT_j7m%&o|m`=Vu>YuGT)r z0*cWW&!^Zc7ki?%zW~cn8W;tjVYq*B9>l zD*QXXole}b<}%JQxPYUOS|}*yabm8B>wCGGA~%<5eGTUaIOA;m)38AP`{A5{uP?rF za0qU#>VHE4+GD=;ty(6Un=iz=&4ISm@c=67lGvyiD{c(MXXTJ9Fo0#2sRo`_Td(wZ@ zzMb~*yO_DPFE74zFow4Ho+~J(0T6TT`Q&sBPhxL(8f|0zJDs+TdGj^DQ|{-E_nk8Q zi8=S!za8`L5!-rNZW33VTU}F3*TPruKF@bRYW(SFd>xW;zbvjQ`2SSbPbbkw<8J;{ z!e2^0zmkU!`In@hjC7uaL-=yzswsz$(H!ITagN7$_pdfMmKXP)i03g!{dJWJd7u&x_Cyr7#p6(ryQ<}yznHR9@=-*zL)lomzN8ge&g5uxW>{H^XSR= zp1ejai+On(@6F;q3!~L-SsG{4cur0_)3;JT!+AIre*ye)X6^@Kj&G*CuC;o2Q{&oz z>)?O1o#SDg)BUX&L+8bmT6G$FUx7HMJM_kSjnH~+3axQgcS@~$@K>dAF5buKOPqf@ zNIqhotA|{yr7dS!_fK50?tc)D)nbnGZ%^teUGAhhyJeSM{Qob4zKYd=KeeDZz{Z|zxaKpmEu^UZtqgF zZ^O3`V-B(RKE@kjtRco3&dT2oamF}9L$PIc9o>pQ#vHPXDaIW7(p^>i(=>-4D|2~| zRZmsL{|4;#_m8N{_O9KPH0_5`Wn8b&lpo3RKaIwZd3*|27_Ktno2vhK z&c?o`=j1;2Q(VR!a|uPXk1^{<#J3C@iE%DnvA%4*c;dbMYx#asJc;-6)^r}m`-_+o z@8^kk^YJ)hzCQMw?ouyxal~(8Z+5+W1UIJ_C%%;X`IgDaa$cp}&zD_}%If1TUL?y; zoIRbI4>2GAGF;+cWBF+#_ILHyK@G&2)3L8_mOjhqE9M_!?x89#u9NGSe`w2xchyqN zJ=Ei2%s(XN9!l^bG53&|cW93@<{shdSF_KPB!VasS95zinuYdq~_n z;=U30i+GRirrkU0a3CMsiM5~D*3hyOV&BzE(EdMpnXL|cy!WcB)ckmY z?jLEK$CH)(T!23duCL`gr`lY^gT;8N@o)f+!#Hk{<9V%00u%|F?_6#b+pI({A9KJHDB8B|6blt;(H!`zs>8$`u&>Uo%CJ4EK_;@ ztNt?UE7ll3PJd7Roq>$%YBio~>E3~(srbi375W#twvy$nGB29LU|cU;?Kwt&?0Mb= zzrkZTAEWy-AS)HQsrJ)bTHW5uo7k(=knXYi$)=zCX-?0h2VkXsD&n2SqaHk(fqN~j zik_Nf9GiYF}qsB`MkJmtN$htzbW*a{Qu(miZkMy%hjZ6`lMxBZSR(KXoszI z^~W;|jzI@;r=#&SBz_;DlGul?YkjNb`JpU*X>pSK`>zqzlzVohl_+HQqU zVLI7EMrsDnQt);z2d!yx%zEpM5`-(0?K z(#K%ADujO|{R`-hXHBKFz9IQhLw_y!@t#}_l%tV_+^6^%>mxtq!?(~}&X;IUQmSTR zzM9UR5aU);>Dwv3?s791;`?@k_Dg81MOSrtV!hm8T3X|Yalkp(xYzJ(5W-u;H52xT zZK8JRwOORDAC|{DG<+kLvGN%E%+_donU43=#>3kG4d2mmk=LWeP>+s%^vC%7YW-h> z>m^)5n)$Eyt%g|L}Pp?bgT7(GQ=F z(EA6yaVGg>{5f&n0CBdGB+BDS` zSDc%(iieqM@DtyDK$WVG_)78dG|r58V%{|`j;8P;%ogum_#PB3k2jnRm{V_iu@32M1{<=KH{88*}i}|ApkX|is(>_`Im^(^2Z!|%^W8Ua-nm@uB zb4QJ7PRt$Upgrb|_R}5b>Ay(tjdId~&THKhV*UHuQ0GeX&icq-!n>vGY%0F<_y?wk9x9++Fd%N#Ctve@yJp%Fmnn zTSsF>_k=6d_*;CuEbhK-^)Q~(CDk9Eec~L2s{@|6clUz7aqX1r znqtT!H}l2uGYk_;jN|su$1don4rb}+XZ>7GkB=vDU+e)%{QX00v4$zueBYO(wp|Yo z>o?`v?^yTU2zRXg9;F7(tKZls9(%H5zTzHUH{i=zd8%5-wMBody}t$D3Rp;gW4Z6H zeMfDtqwhY*kE0=UfVb#OIVTizL9b+W50HlibPlDnu0FQ%KIVg(!Q*`Ygx=D;`ikbA z>i0AF3t~PfF&Ffd_&15aGM&%hi?Q|HP^O^w272d+J$^IbFm%KcGicNh4EaCr!{ngRi)Jm4|2&{>_hFSUSker zJ5O)oM=f4d;pI7X7xMuz7tsdqjbeNTveDTaLf?J(*6}jVHft}&M_`v4h-fILyBlv#-cI6ed-{*SGoYqG_ z=){}7xbNc0^}alLote;)lz)X%GUugvl9 zw@eNHy$+7+C(ej&4NvCLpFY#*Z=>Abhdd@d~WQAHVw*Yr-Fvn^TZK$u$Azc{ofwX~h!v&BNlE zP5b9?w|>scTNQDP(O>M($;-nI`dZDydg9om2JY0~Ky{GAH5lt@KBqlXdD^ruEC*l1 z3Uzr8t=0MPHJ(`aa8jFVc>a{w6K4<|Qv1i{GuEHP*+W&eo9ud>Cx1fu=Q}iy7;oU? z?b;`c^G>;{tM768jx)vvtM58^dWr2eTE0?$J@J*5pS)tprk>*+pcwyJ;;co}i;!6V zwnS{P?k&y{O00K#s<`^6Yc5}6o!f7aS$rA!6KmZ@<9Z5L?DdVg*Ms!c=F4`P($Lad z+g7w3pye>XU#X-vAQesVJ3q(pyhvM&5!B|-PY~-c-^%Duvg!v{%;j|z?;CJgyg%_R zo=b1T0y%w@#y7?M4%FlS)oQd1o%3*a!kw7oo5jmq`e`VSdwJPS9-oKw`guCH=TAO* zTx;q180VVqf?`SP1pgMXv@Yp>0}tRYPWueVf^#AdHqac;l1jL;@^BcPze8t+J&)AJk$P6YCVG(i&?MAH(xIo;18T3LW?{L>}*<^&D*C$0>;G z<_7)_hiTB9&oMuK2R{z+AtQ|w>AMKo@h&9wJ-pL-@F~Pzl+nCMt!{JiV~T#Bz<+-( ze?xElUh`2t)Zy&}IeUb@v+$g2D=W@F#a#pMAc*yZ^B~p|X2W$8-LZbK3@>-l)rzh; zxMJ;Kc3hpr9cu?;zB0}g>Z@(sCz9xiy?j^VsHFy$!V>wpM_skY7vDmO{d}>H?^?0O zUcSq)vaBHlFTNmu-n@y0mY6llZOb*`}~1zbDYKCQOOtBv)1D5f^P zg1?|JFP`8-{0_j~v_2sIFU0yPuJ@s?`&#Tv??>N4`fgAkm(^@_+NQzHxL=38a0C7d zaSx*FZr8&C=%_wg;LOH@^YuJO==>ID>!U24wQ>FT?+NYHzOi=w#Z{=bdk-Aeumt}m z@vJ=^F$N#!gT@&AQFsf_%i_J}O0`H!;#|;Alic^@Kh6eih&LO*;%v}37xau=%op1# zvBf&=?|EKYZi~w4y)X(_aq-kD?tKknfA4_cDI-R{<-}L6g6{#o#c#@%gUM>>272EU z?-Kr1#a)HoKjB$@T<==H4`S_aT6*LCe<)7%U}+To9LKI*8O&f*vcx8tqJiXTyj1ev;OIwhX!)>C%@~+Q;c0C#wl|-=_6` zh$CvM4nGp>|5xD5$(vbn*dvENX->HhAhGuUMLxv(|G{Eks-7OJs&2(ywyyg-{#_9B z-?9HJ=D%a_Sz_)x_MoMl|BgLqi8=6Dw8k9xJT(^c-?8^B_6x4h;F?$SF+Vd`ej4d} z0N;LxZl!$3@NFTU8|D9b9GhVxU90I4>OXT)x6o9|KWv8|@O6~;TJrL?oQ#)~m9FD6 zP*(rT#Zpe+Nn(gG!N+*gRUYG=I_?7xXt$e=KI&tWzEWwk8sbdSTWH@vyT?VUQ}Dcg zpAbX*UQ~<~^c6#lx6g(p@}Kx^sM!0Eo{zn>e@pw?{(dR{e}{Xui9Px~<+(EdVxRc$ z`tGA<>X(#59y|n%`A}cSwbcH0D6b}~sL8%Cq=tJW?p$IUEGIw6Z++aYp?h9A!grjW zJiLwd_!HF9Gf*(e_dVWg_#0!##l?A)w|VIO25)@pEL4~ATPF+oQ;$Ed@@FRALp0w` z^Cf!gtIwP89V+ggPj{Rx`6}LXkPr7#dSg%53Y;x)&gMbkYkVj3{}Wik!*X;F)XyWl ziG2xi&SjjDP(weLp_jhu>nrxe{3V7_Jc+Y;j>u8rtKE~KCGF{Ge;P*VC&o7J)z<`w z{d4!oSDdF3bG>ijpU$WForrvL5a+5agjg&2-{-50(^u@%jdNBG@+j8Z#`!80#FH6s zaj|USQ&x4=R3BHX!#KAs*2sJ&o>&K0RUUSVA>}!3>2Sp}>q9zUqp^Xu{j_aFUz|Hw zlGlrA%c-7ns^uN<6MYr39% zAMelg;3r-@#fx~49;;sB9eO$Lcwc^*&Xn)VEohB3xze5LPPkw0UdFdTjr3C+mFSIe zuP@*r92a|4oY&)=;5wYCVPkcYN9?gD`(YmT!_!Ud?RnOWX9Z}wo~BKZ7soLize2ok zehsa8FiOphr1554F;6$X91=On0+Z>q-kbIfgQ(B>i?hw1nYI=d#KZu`+Q z3GT+RiSL-H2GPA%{<~CGe>`YJ?`9|}H-+e&3pF!)R}*(WanIG}7v2>T_g9dY&e&V< zdjMCAO-$rxD|$z$_19@$SzS(fv5oe_JQ#%gH#nD(_xMkXA@+&BM(ZLuI|DKPQH+2H!Nu{;J-B1l&k2BsqE>1`eF?AD8w4NbG*3;S5w}^v;Gh5pH(Lh^SrqF7?bS2PvaPf`Gl+KydoQ| zG{!#cl>4tYxb_O-Ii>%TIBt@=_u+ep{nu+*{5p>3XgaU`gY^6;XOH8F_l9}$_Bo%9 z(Ui5EYYg&L^6bG^rw$$3S9dRn=grqVOFVDl857Tw=6rY+Qa)1(Rd8KGJXhj*@{PRR zjVqodqi9+$u2@t2J|v}A!>-@>o}C`r@J^%eI)2BR#aN3GYwBW6aYh`SwA~0Jv`wu4 zZG$7`NMa3e%&FhX?-jg`b-?Lx#NN!N;(H3_LrYwV^}w+f_!umtvl;*YIa7KUr%L#DH134qxccCVdBRw4H{7*aL`|aoXOH^?I$y*2 zHsr;*4dUL_mM`rg&R&VV7cb(D{q3Ksk-a=9j`yE)V${}F+%@jx#6LKo)J! ziF=3k8RY49b#<|VcT0cYm3R5887GB;boGJ8G#!OFuP&ALnfW#fHqfy`ZeneIbsGMF zCTd_AzBqI9XPkosbdrV#uTh`8+DAuQ-oFO7Xun1K^72|7N33D4sg7b_b$xgr-bnHt z&9_*$7r$Bfa(R8@jy3qP1~M(3OL-ULA~z*_uG80two|-nA_p;-(O0d;yI`EpaX)>@ zd>RbX@!g2$H5~iI*~NW0)|K}Z=W#q^Xv~l6cDNbe7Fa;%oxIzKFF(Dd=skt=K|WrB z;&iTo;<)qDI*kW)=^O)h@%G!Q>PLU+_|lIr)8Qw$hd&cwvKsh~%@yT8uD_)`i*@%8 zW%3-Mqp6s-@g=e5z7v09-F*iA#G3o#_+zd8A8FKwI3{S@Df7Q`6(49noaZ_DQIPN5 zT|cX?^bL$J*3?deV|<8Z6Fm#X{D^D)Iq|&-8MU8J*Gx5ih`)8|DyaSMe9bGahH_P#wvM!oy+Y3As~pZf za0PGU?3nYkmB5`$SAG01in*1Thtk-C#=d;LPCtwI6=$_f!M|3_1MrT=8RxvTptUpK z3gW9SPb1~Nr*3YKb3BCPkoyCVZ&vu#`jj^_zd?*YtE+6A>2x;-{a--St!Ey z_u)p@cv^kj3FY-s3F5q`V)9UfU)9u1j5{5~R|3ahe9fm_QE`0)FY|S$|Gz8^u~+Sk zSklPb)p9-q-k|3TF@3511s=t31>c9~UA~S{TN7wG0DJhA^0zDZ=kvGFUmv&7G)>IS zY03Sc`YNoiWc@Trt^Qq0u~zFaROEkY8e^RGO8jw-cC1Z`z3H)M>P~URS=uka5-7{V z*I>KrBbPYN()%U8t$e!@*AlU|qwPs;HKe;(mPJz|(5#Gj$*Lt4p&Dbbf^=&K`S>zOSGGj{N2H3pdi&0$$=|9@ji1Eo`p31tv=e}3G<)#Uw_dPXSm1O#xKQL?+W)6H9sF((iUS- z#d#TH1@rj14@T?f1u?%0v7ULaJ}%4eRptM^f1aQ>`shgChxkX}u7>+vF^|LFD)OUk zM%Pa>m@g;Gw9hWaVR3!9=ZvNAXTDVu??Y;B3!Kz8_PBj3))*iC6Dr~9%lnwqDMH6B z@HVbnXz7G6&UzX_%Usw2N8vi$`|%#)tM)#>M0Fh{}5A4F@0Fgb4MS;@R!EjKs9;TakH8183+`7Zck1Ilv0TBgk8z&C8Q(D1 z<7+L3T7tca}Vx2 zNKGqh*@2foR?~nbb%`$D8$;Z?5RHbKxc&-yq>_>YOPn@lH zGmSAuwvNVlMz*Nx9)@=r^rvkR98^=WhNh&NdOo!=N}i2@9BTL?y{E;VL*K{cB$Ga4 zy?CrM{8oRlPUU+@obxh~f3c1%&Uk4f7dP`@8??jyoH)|p?JSmRxUa=sSZ>baU!FsK zi>s(U?$by7Hhg7qErK7Q6mJgcZ;;r2h5F(vEoUuYyZH8~yKltOMc&Kmr?h@@@;fmu zAN&8#(H!IPy|hh?#osS)Z$W*U<9jp4mhBd~y z^Ux4`ysjO6kXX<93vVm&b$C{}R3FXgjJ2!h zXsk$MtYO_P&cyoF7v(4ohE8uAhn{XA7kFLBw!=sD*Pp@WT%18U-XxXyiLjks>${cxBDi8t8jc$Ljy2e&=(~a6F;q@-)@SWi4W`1_9>Yj+}32`2V+G0J8>lyd3c=y~PKO<=Vnck-I z6Ken`z)z43UrD*T0N3N}4;Aso`pqxl46P;kQI^IDsp!H#0{2yX{0sM6G~SFq-r1Y- zG#9OR;$0Foz=Q0xzJxQ@0Ow4tExdwbn>ahDxp*HPqJ7Hq7SpKT++sZl3*;to#$st& z;%vqD=@`bZlj8gZmeMmVvwrZ!+($#+&6k&$KmQBX^RT4)*^GA`AFre>?%_Ycue7}+ z-Z^}{6L-2aYLLFfI>L)Qi*(uDIS~E<46V z_R^M4ZTF)uv4%ZKyeZeNUyc7d+G72BF7fsiZ_L9NtVo;dbsX>GjE&pyZi8`nr@&J* z*5*O%8;)x+=Er02@C9*yA>P<0ocKM4#9rYd#sB@ri20~xkQ@Iph&{tSaK}FP#MoAD zdCej(lk@)1_*R_jopN03MOx!s@P4?OkMHyGL3}Z;wUy>c__EX1AC5vvKD-N=<>{h4 z)y4lSov}{)JZ(qR;E^(NitjggP)_(jWbl6MtcUqJ8LaxeDme4GKX1}ztj_d_e5UZV58D`>`f z0CKtR%HrIc zQn;hOV^4h4bSZJfdj3lKY9WTG>B$BEr=H`tLZg=FK;+?Pe(mB>7yb3bpQ!C?^-&w| zne^^4@_J7uHN~56vhxh@k9a$|u47#CE1dDW0&$;Bb{!6cBM|c}J>+5<&)VTX0%P^@ zn;cvtuM25zf%{6lOXM*tzfbZz&MSJG=3mrbY8qEVtSRlxpWvC!gINDjfX~nKI5Qve z;!8#EARfg1E%sWq;=^k>-Q(5ZSw6>oBE~k-<12#iX4=})wj1vvobB*+g&0eZ_1Ed} zJ+#gh|9*ZRz!~F~pWw@&HqMImf|`zf@T2j?JLseE z4BnAquRveS;s1=Uf_s0QQ*}R%6>6ZA_Ft&i_tIoIh z4$OCz?`JwLi|s9OZJ{B?TjKXrPw*<6xZ>Jh%dgeA{$^L)6Qge8ei-+{f9`?unYai3 zL{sAa*G)dRh;b+0opO*zY@>Mg&;5|bxDUQc-zdBrao&pa9iENgS;NrDuh=i}H@{Me zv55HA!T}iW8X65r_*(Nm)=C}FHooyks*QKVI5@w0*Y-joI>h=GZFR+a4_(tC-q$k7 z<#GB-;QR|$n(z&75_@jiPOITwndMVWoTsT1J&)j940&+IdB;6*J`F9@$w)e%l+Q6cn>)zM{`)zmxm?g6bO3 zuWKCN8_*F~H9XnWauxnpkk^al)JA#l8EP*-eX+k|Ub5?(zL&+7SNkX7f;xFoT(MUC zIeypUb!vG_qfKL4+QR}loJUh?9>?B~B(cR>uO2idskQI%#J-RF#1Zd%vFGC#8e*M% zeCsr!VL!yak5PCMdp@$Mg`;wIv$!_E3q0CD&&_<9%imagT}@0M;hKZ1JzeQ={D@;f zJ+WvTJ}>9-t2_#yi{Xjq@h%*xaeSryw>)`C`#*RR^8@2yFg?q}m|AQt;jG$hDZZGm zjX9e#>hiwq+KKZyF{a~rV*Vx@zssumn8W#nUonp}1=s&JkMm}A?<;bN=AUc5zL@9g z<6gOq+Ft^n;V(@01o5{L|D$r6ME@XoRX<7mj5GA_5%)VZzNq~kb+JXfCH?(n`TL!w zI72>}|AT3Ijc1p{*@Cv%V;koJHs@atI_Jan_=ds~v2Wn%D|Ngt(Ah6pz0mlYJkR89 zdVO8bkJvQ0JV5J@YGsuEj>AP7x5)h-eedCQep>hI`x|vrN9?!JdkwB>xMB|C*3g~R zvs=Cr^A9oa5aI(_|hnRCXO!IljC0|+Tj(LYNe7KIrU!exh#BXT+%;fkT&F^S@ zf-i4DJa6K6G}Ecg7@OP)6Y;(dv5zr+Lo?mZG#5v_#VJV&=auRC_TH^?w z_zlQ9JU$`L9`avXtgouA19)fR94_Wq4>CdAiD&iu>L{Mq{lxh=P4TR*g6kog;yGPY z`=$`j>nX4n*OS$ZXVLb*J+~j1qnM-W&C7mtp5W!{IgAnEzlx8ys{gV2Xd^e7<)x@T z;<|3YzX|k>q%V`0f0x$cJZz2U7r0d|Zp3vE*UdQMx8&>K>4Ikyz1?tS7yCUBYeQ0( zcdbD;aqqw#XRcJEIc+WP2y*m@eyZu`qJCD>d#@UZvsbg}YnHxZ++(_&#lF+eU=D9$ zjw05}TmxBneJA8}ABc7Izw%{(Iw-0J;`eCco^&tn``|JB>+lzlzmxb|PI3-EbXD>t2gzmUgi&{0_Qee4v)Uufd0BwdqAi z8!Oey&kR#qjN+ z<4L}4hd2u_*6K`FWBM?CY@$a%^(i11_@7L|k2B^yAAml5jkSg~ z`LLI_SMoN-aN=D0SXa}np8ub>pWwerj^DyRU7ns5ON{9}jK85cD&jxL@4xtSgLs<4 z3(#MGF?Jtgb4_{mwZ5nFtBsh>!+8A{(Dzf~`WE7xuGISeI`zNzn>gbm&i5!F)^^Zb zys@5sMrhD)OJ2pg`7?O);2Q)}@lAtRHy``rS)S?;zO&lT*7p6Zt`qI!%#{atbBONg z{BOyh7(*CHbF3M<8)rJ#??HOT<9L{_aR$(%uKD`nEaY!{_}jzKRgBN6(|BjBz}NS* zyIH$KkdB8>i=mqSV^2#RF|?;)Z_a<;Gw$NyDzU_S#Tv2fDxm&#+T?O)5&cxR3E{SVSniH0~ctO}mI{5T-5 zkJA(9c9!5pSJ+BRoI%)zFJmFjO4-1ZZTR22+TT`?Tl|@MyhI=4^zjFe=F%C@%VT)Q z@pmZBt?DG6m)-Eiv-1DvIr)c}hteC*#{qap^Xd=2r_JmA4ek(s%t!B`sgv6J1g_;- zS{}5aaW`b8GuA%rhL-B=0KCi3ujD4yjpd~IUD(5$;c9)FzWigV{5;yk>q-2%Q5;S6 z{U8+A|2O%?qu-D9_kdW^lyxtJ%}`7~^Wmg^9-=?)QN8&Qa~MzYHynfz!hZ=cW@Yxi~W4^L8hxyAJwt}d>J&GbDWUys5nIjf5&EqxF1 zc0T`lh;5IYkLBCVJZh$0e9!OJ_c8IktN&Gariw4-{$js=jMHD%@9o-6Ve-XmTrcvg zgj1F0^>Q_no=-Q>v6a_twf}>TgE-F65#yPg)Okrdy2$fsT(Q@*8$EG`@dkXI;4)$1{Pp*yD2)?^pCap`QEdIDV@)<{x%Jf8IQUEABx*^LIj8HA~mtES@Pi zHt@3tEnUUZAHLK+ul!%uZZa>o)9}8U`hl0dXqXCdZJp!Eo#IF@&#^XcE)VBb_;>uZ znf%@bQ=o-BzXA8^GwyF6M_c{gM)zPGF>n5y`WvhEoADzf4Ie_xRk!2GCR$=G$|+oT z^I`!EPxg+(->GWlXS|hZi~CRFTekte_})!}C%$S*JC2sr@^lFn;#meO-19d>thw4KUt7w!XW_lT+c+npIFBB}5zojOe9lGFBVvtv za*J%*|4lf5gsqCils5QdAxb;oQcPt$pOmbdYnrKRbPx&NOb8;|F}BtBdz_u1&4NOvx}W8CdZ zeZ>6d3A~%sQaAqY2;IDmwGZuReg|hAerA!QD%xyI@7ksD3|-~?%_t~C$3QyP(Xl~2 z*B5hL`6#3PVP4MWV+oWUzRvUclD^vN>lN6gU7X)`R=+W}zJwPY_^=ws zaPd6EgAL+of@dNRe!#U^OfAKeLya|t()^9zA*e;m7jO|`-ei-0=JMx~e74ZfbGYM7 z;%#sZ{x=}z+_var1)rZ4(@fqpDWxAAZTS;(MaOZZp)GOdIxABB$eS^|siJKS{*=j1 zuR4hLw-fwXjccfwPrw>l<2`mLo$L92M!fy--H#{c#A2;dD}EIeZ=5}tQ3v7Mvb_9) zukf|N(~+hp;cJ?1;AKB~i?ayJ&=-4=)7Fy@h;uwU;VMSs47iTQ#9EpMaK8=vA+e?= z*3%p*?)?qsia)W2roOyR(NCaor~08~OSeKjX~lUh=aK&WQg4&A-w48J!*J%z*0*UkAw3L-Zb`Hz3-K18n%leFjJUl#RI5QfUZO?A|V8a%80?|f;e z?J?M)eHwXfto@oi+R<`Ae2GS(rEPu1uF2rvHIhqwk3UPSGO7g77+N7Q}Pd-##4`HraX zlKb*v8bwd66HNI#>>nh#$H`Z$Sx>_8Oa;F4HF6X+RG%-^K9_%bTUmbZaSSeE7adTyp1vU-rB|7QEQ$K=V`oepTludZsV+pynJn;UJB!T zRZWlO@fBj+k8=UeTWA?nhb~x-ySezP;%^Fb#24R&kJ49K?bO!CbiA={u>j7J@EG1$ z3({IGjHER!-lmn*taxLe#*<<`ppPB+@5BERA7}7!tA1i0y?GkfE5zP{m`9H}ycv*~ zOOL$;Dd*B-kHISb#2i^)IUfdzy#;%4#=R|`cdx@*+GD@jF4}+P$wh7dd%xKvIciSx zQ7FuhOgyeecNUtPz&glHd&>Q0Z{z-+#!TkAy$(<7 zr>=UfsE-Wp2d(t8O5BOL_-Qm>mY0=Do>}^7QpVql`+8p9SWBJY`dLVwar`RRmuOBW zKMz987p1223;Ef@zop{rN#k(Zo^?Gxpq}2NYX$%2g$_PuES&MPpPE%F!wSY_7uI72%U)Is{ z8^oCyu?C|8Ek8m*JXdRfQ2T=X&n3)@Ew%Bup3o z{qj5pVtsNii1i~W*D1%^k>YA-xqf4fa>_L%b=A>-uOW%GBe7mN)+cwz-xhc5y%~W! z_TJpcml!MA2Ve0$r~H2fM{@gn{w#!J;!5nhsUeQ>e2MS(*n86*ckI6@B#srliSgNF zD2?N={Ew%15WOqtjeYYi)lU{4h0Ywj*+bv!c;daUF^xCi=?+U^yz8$Zz18Sl2V0@5 z9LBkqpWsV*ZqAjs?{_UN#d(R}BgOii_HoYcC2h`XQ<D)il`)4|H!u#?V@4CN<^SONPTXe>H_SiRb&OLUIcsKI@M>s3)SSOGP z$HzG0z512_ju_X7HOy=Hb^?yj)mAOcz|}|&`-^!jE#<^{hL#(3LYn}k_xF+I#`x?G|f^RX6u@Aj7jg@Kq5aL^7q<%KbO;!E0qW33S z-@%_jUS{g!Cs?4~9^%Whe8{eLYC|=?Hlh1THC{|#sH ze~AAhwRj3*55@qo$JsZf@V10F_hJps*mE)f3gdnWmWZvrm@eb)Ev9GHLo43Tq zf6=b7+})K!U24~ir)*@sl`f@bWNC+v>PRr=?!GJDAK)o95#wcv_4YTbt5|Daf_I}K1HQa8et_o- zv3(~$7vKY$x6}H9oQ%OygT8|_T}#t6de%eQWY>c@oA4-}(J|*U6Q1Hz{2t4buA|sT zu|p1$frfKeDiTNa2@V|JGF_ipV<4>!r$cKPt3>08MF)4K^>j6t?=)AOind0 zjE3`kNlU{~zAU9-DL+c#8Us~n`2%Mg@$`goFg~|?2VZjIY=d(p#JSKD)j@au#9aFo z>fjc-;+*QQ@mAu^5y;1jF>*JO##n>71(xz<5xz|jzX{L?&qvU^)W3BaYw~ZRGuAKO zu9o6Fk!5h4R~KkoM$=`yH{om}?$4n*&ME4@3vK_*r{g-NCT8*L7{r|NImm@KSq>ND zn=S5vVtxVdX81wu&&%KQc$Yz}1=)#vA>I~MIF+m?QE4eQR#D5$9 z!fGSFBV%vr9GI(?f229)Jht-kf_$FB8|U)fqCUpRQM?b{!Nb&Y)C148V!tn$4*7{O z&5aQ2mfjL~2{pTpwv)WfF6Z6pdko?^&_Ub};cP@-PP}_?y-m|Lcvjr$~S?ePygKjI|!IuJ9vTV_o4k`Hppkv8J#IzF1dS!?iUCXIvAH z;_ZfaE8ey^Z>04MED?JnIf{J-y?8la-Vg9I6EDZ(UO;bkygT?=oexh`_wEQ^*3z#& zGT@Hqdh8*a2$>m-@4Z$rG_CKck58jW=`U-DuL?r%!EN0s{bJ+J`o@1b)A{X>k^ zditVGC-h0K@0@pWcw6uJ`OIOOd)Z%&g4VCcRpw27uG3Hd4^D^dD zV_t0&?wCUz$p63bo#IifmHkp4x2u;Je~YyZ52?X%aE;caU-USAgED#-7GI2$jh5>Ja$OHs>?0YV9#^ZA0b)(;B{?nL+Vnkv z^Lp3NXmMx79eYbo(i(e9%E;$bxy*-iB+Y~QzZc%8tp@)dg_d%VOkZm}u@1Hejs@@` zeKlxmn$PzT9rwB}KBc3$wogJI9*vgE#WcmdUy^*LqbX|lJ?+oZ5aSDt#r6Qi{=55l z7W?mp@GYJlt#QXbyt?>fA70`dk*d6py?9N<9Q*O&Jdrp{B=+OQc_LDhN|>o;L3`Km zLOM6{Ynptw#b#!JQa0d2Xp?V!e%%WF;g`qH!>o>3b! zwePHbtfigdnw_b}rto{B8oQH@opgMj&cE09-P-SwyBhLVPybW&|9rF)(+vF&*8d>> zY{Bs(f4;_Z6h~`11_9gtx$gGh>!{xM;W~vYJDweM{Lb%qPCu{h&0>i54~Q%DRQwCe$n!75&t<@IPdB&Imucr!gMd67-7yK6g}{+KJO#J~1pZ{zRc8tVX+ z^ZxF^QFHW%@?!;LhZG<)_99J5R1!)`Mth(T5-n*-iw2_cf1G^Z_ucV5 ze)sV|j{AAsUwp3T`8=QJ`P$cYz2Q+jeQ8UhAMY;cxT32m&Mv$zE6>k(mJNTbYq%Mf z;+}vvi{pcBNm}!uto|J1A3lZHH?FjLz70)jjrZSg@g(+;YsQNgU<)5MiS-r!ZTR1j zZ$@=IfiLz0%uH)R$6LIUJ!5>VJ&ZZXvHq~Taq+#sEq$@(u$H_Rz+3W;^@p)n(L@?I z!xg-P`B;$`+i*9guZA8e&DZ?&-Jf1R(fBJY6=yAtEgh$M=zCZ1730N1sH6Y7=$|p_ z)ljTUe7+g~?5duR@y9!W7WyEb4Y%RViZ||S8_ByfkH3ZoaOaap{8sN_i1}>4igPdD zpV1GGiBqbG-VtYUY1c#NlS^_r$Cox@#Cwd3e4oajC*-gOW{Mg2(9i0>pT%q{<_f+Y zhTeSsQC$o3t0~@GJUhv=#GLSJ=Yy9~!`13mAJ<#BI?{WdzT*7;fVOYocOFbLen%O# z42w2Oh++RF%Hivuzcgig?n{aa_Iy`FV+s7V?|U$LmU|k@08M=nXk; zO76cKmsD-y8{H1MWK)++>e7vOv3Ge&waHA=D4q?(ca^T(INyN#ai&(APO!R?=T-VD ztNUEq%F#BDwvl3V!}}fl=s1Y)p6}w#o!dE;#&{PHbEXE1u@HJ+w;e&uDnlZ*Fp-{6Y(a4~-+-n+#&=^Jt6peNqBHH3KYcG}<1P2u_7 zn1^6D_ftFrv^(X$ly zK4>hzCvnF2rQ&${z%(_wS#A&N=~ydu9N&C87peDm{OX3YpuSm6<3_kqt~aQSl>XTd z`F*@?XnmB<#Cx51j}vPo67OsKR?>4 z_s#UTQLk=t=!~lX4Z~p&pMOlJulQWqd3zwF&~GjD@?@CHt5dv>bIegbwHI$Lw4gEW zCx(gjF`et71)pLKSs%R5!$Nvj^C;FQ7s;f@c>gHQ8PFJSZ+Q%r$6$5Xf_tHS(%>!z z-PNKq{;VaP|C~E>;$Ne0hN23yf#fdcs zg~b^lj}l@{79*b+9pNg^+KUnI9OHM`Hi?sxU-$Cs(KuqiSZ9((4)gIR z#~pL@Pt)H9e`1dQ-lz%goVa)7^8A$t#OT4FNAT|B%U_U~pWj`**W->k`iuB-)v-1Q z_lI~7;jM!2X@10BkR$jp4)4?Y`cs+<@ctGU$CJYN`@>THw-M*LQqK7>qk?NR{#Ljr z;NC@heDlxDm-z0#N-vG$O?>-*K&|83e|+u|Q>@p&GM!rMgt zXJH178=$8+Q`0yOGN>c|SYyzSx4U61oh5j@7H;H8nxZs{)kmE8Zl6vsKA=C^$zeRy z6Q?OOP{(dOxtkwfKw`elB(ZvmmDn3-KL2CRO(}gJb8c?XC$Se$V(v{Pv10yBV$My> zw>ip-^2Tg|AC3D3uIhpK&9aQf4}gXG>;_{m)7hKGcqZA%mwG(uR6!m1vXI_Kc`_bi zFN^0LLlgPZQs0H|tJN)ZF4G@Z9V25Mk8>O+8~7gQ-Vf-yU+%MURaLVs#+5N{n=vu( z2e@-7XT)M5jig#477XKId~1D`=J|TIT{ZXEyxU$=kIFqGu9&+$ST8-K zPBACtNnHCNi~5d&cD(!oTBy@iG4_iQbAIBRLR0#;;_l4T*n=)D{^ht2(jIdHioor( z#=L+A_$%=@1#h0yr+?|uTlo`f*|x(}F@93B+5CQoU!BBCswb+^Ure0E;#B0(Sssn8 z#WRTSv3rxysSZc=>IdSL(D69qt%ZW*ERXi*4 zY=h#-|M%WF?u)bV=GuGXxc_}o{&C;7O5RugllK6*$35^095L_hGH=@&AL|QRs8t!d zy2`(~+_%H0`u{XsDCj;?kMyG@=HJy(@5J*?JnO_W&NuXLqdl#^ZNZzwv(7AI;&~^Y zb7Eb=5I*eCCou=}R%46t{2+YAhedpdJrCMIUtF;^xj4QN{751GBA)b<)03s;1hJpf z#j^U3_f`0FtDcNKwina)1^)eVTa?i?2Y+YzRpR*}aW06{iRPAiD86A#5---_#Jhsm z9gk0o^&Ss%iFFCey-O#UwbGu%ti}xOA73tx=6L)p`^5f4%U(A(^H3A>0bw7TTq_sYb74I;; z@vL*RxYg-i#*2)+$O|#g;zNB^RQ$4Vw?6L=*Nb^ctVQY@zeAT)pKlT~6JM6e<*GQv zd4EQ~H*-w&6Jr4n#+RcVPiKA(h9tP+cOEL?YYz*79ZB}e;WJz*@La@Gp4KjKklxX> z#(K4V(2mwQMO{Di#J#+F5T1fD5PJa~<53=*KjF(yW0}m(RXCH;wVe-H)P69WgSq;C z0uQd@`$g{M)F8fp_op}J(2bxs8@>hj{)G6A_>r{6-0#FX=X^Ylwa)9|s5r65_ADt#2?=UVh+qcUS?#(54rxm&KKZc?8`SA*8#cq;$u7c z#ry8(U?g2T`8Zn-#Qeb6Z~Zs8np55R_FL3hj*aCO@%}J=l5zKl`5MG`l}$ME%IkT^ zCb!AB8q04noS^3pbxk6#9eAJ2?pT24IrJBeJBsCyM80dpDf~eA9`%+eznfd2Yd#2UlrmLR)IRH>=6Eat-(dqF)%Tg*?4 zcSIlaZ>73tlXHBdi{C!zg)inA#JjO~petSRO)LeT_#Tl*j{9iJP0t1#k7oYg{Ni^w zchUE~JS*V*8D~5b#qV6VpszlCYjL-hdpGC@sf)SabFRq*QellFY;+bUpD4xbXBeA#0 z06ag*c@mA=a3%H`iTy?5op73x&Ji@dh;JRlv3WDjU-i=gew@J_&xhUd4^X36=PIXF8Z_FY41j^{q#5}Up_VFQV;5wr(Ytgm~ zM&oUccLrqR#Ug&Tr0pJ9B=_ukzC2`d9KG!r-NV-|>QzyUo%nm;z6=er%1!xS`kJ0=?ihrMV-{a#V^)H0yK|MMESA87uyDe$d zYY-pH^Kl=nr+1}V#rM6l&>K%pUdD4k9e&0IE!L%`#@7%wKs7oyLJmHx%i+4M7n-Th z5q!_c{e_aA)8zS_;lIITIo^aTd|Z%L?l=l(a|{{Z4R+BN_x2anJiW2$=@}r;K0L}y zM{{VC-dOmRo+4S)f=^YA9V-64^8CU%yagRG$7&kivhyu|D|ec_7)^QdP#xz*tP8pt5G_$|(O_K$bhaU4&h?+Uc3=6o*Sc-|{2 z&L?y>rt=m(*oW55VxAQXnS`5T_W*2WbvFHd($0Po1f%x5^~AodNDqr{R`T2 z@NpK-g7`YadT4^T9sJ~Y&yKTdI``;MKu$4FD)tQiO08ng^w?`O_WdXmx?!>U#6Ia? z(ViaHdw619YRo(S1xKt!ZOxZ2)jY8tHL(_TRw2ibW2FX-dvK&xpSR>cQr_oq^v>wK zZ|nq!b@iX&_)}d=(2|voH{^PtxMK##Vt&4b;{+Xt@iftsKfqGCmc;eGT&}`SoPF>N z!}CyFpYhyX(0K#Tn^1{&pFt+x{R(|)+XbWLS&)ZQalfNB_3^fcGtfdm_I2!}l5-pA zCeGLT|4*^LkbfC{kW9>#P*UIDM1N~2DF4QKZYm!S;(vkuxK4Zz`_#O=I%igo@A>#4 z&LucE;B27gFW_30&;O=>kN!G^tC6}))LTEoi?sfRuRDG9)TNrb+(g?r9GQ*JOj8*g z)#N^zhX3pLP8J*cH}sHS5k5wauh8;&HphhV|NR@r$?)~%V{e|7RFjT041zy+R!Z;n z!u5wfOCyimP#RkCsJ}j|it~D$F~>C4vh0%EAbcGQ`R}k;y{nYtX$8;UIMe8r8|C*a zJ(u8PT<_xfJ%{t4o(-<_{QjBO2c2WC;A)K{DW8_WRC(v+Rm`KSS<>^FJ{k_|peq03 z8E75N4dlKM|9CpD*Ndh3*MWaK@&2iYKE?ABbi#89_TcJGV^PO-5gPZ%y+BR(XL674 zV|CTE6~6fWylV6okas4W7a`_R=c7CB`)1MFyNGiJKg*SIje`R6U!YfFUCUY;U)L*N zt8IR@iEk#?u50S2){U~N89!nz)0enn{nBmtex~y~IC!PA|1^QikAI-ll2>`he!j}S>t$UVMA9>UiV z-wuf1QCmb~e8c_&Uwku;JsKC{{8`Ow;2TKeWSmRjxO|`DXUiJyq2Nsz%iFGE45T%_ zO}wgJ4~p|M#P_Ut_B{{r{(U@5ffvPTO?&LMnAm5r9sPepJc~Be1AU-9{oh0Eol!)r zScmwmI5Wi=l)}9Zd@oLZ{EgIdIW&_`cm2^9V!y?=3i}(rXOzoaoE_!!6MxF9-<|sR zAU`&QM&3SR>;_}9=6AmfL-^2A-%h1-IG*-+9)zsL{Wpkr7cp0-Cr|p)SCtowpf8F(B@(llq@spgu2;({}(zN_F3n z+5e~SZAk6>^CEqpJO6B^u`a%@wA@<8xtWGf@N7dglwXq|_Wqi~tK0B=s@H#@=`4JQ zXE$6&TVfxu+4#28_O4u8@a-a0;Md!Z``81lmpg2mU^bzfH%l@8!9MSDB2tS*|b0 zHJ%G=>5=Uab2$${TK-p}Wi5{1| zU4!OVVVk@k=jC!Wsw@9*%X@zTKZ*M{A3hN87IoV$)^auLEzW5JvP3>-om55 zcog4bpW{>FTWoxXeMUd*kV`qS;=5}G@t&Z2y;$-6H9g%*m!uxVH`B!0g+q8_{lY@r zGu1UM{5uVvcD>$7_DLndYD19^SO1y{;Pf;Crn3TgUg? zXfH#1{B}tWzEl<`@%tr{#EaiA`HL6v`z3j3TmdQYKBkVB@s`B928zt|46Epf_^0KxP~7;Y{c^s4kBhUoV*c0~9M$C(?_`hTnkdIF z;3rz*89WERSO;?k&f`q27H!pG1e&AMqC|n zrN9$=HdUst8SkbU_bcDxdrDrqQmI3n_qszf8YjUwkgksVBc5KtomcL|a8FR1n`lkO z!`M$UzJaC39q%FDgJtU5LC)XOw2$xc9k`S+x6%{$Ms@VuGKf7mVt#I0cq%yLcRQS> z@u!mdgU(HIyn)u3tGq;>U(&INSAFUD7|!ymHLjS4cM3-pV+R^H({b8ZZUdpW{L0Ja z51#K)!|n1oiX+zJ#`niYa=8=F8M(w-+|Tsd5WUv8h<6z9i<~CX&>2_E%ZxR-ajky> z$IUo?)@Rq@nGOw&kGV%#<#t}(O5;k8Ya+a(KPKRNna29+H(9U68jbkwGaN@oJ#`UB zQ94Q*f5Oo&kKm}qi@r3>!m}L5N`2T$F1_%qmd9gq$Uy&c zh<$uY(=-X%s`*m<$@#Mw`s0pkL`R&D>w~2*gT8h6W3QmT_%7i43f~MK_rekPuZM9A zRI>-=S6Xhd2X^BAY$2|=H;Z==iTkpy^wq-G7OF=N6!g!9c*XCyS1XPrai2Dj2S?~E z!Gow_2i$eDdKS=^@h){Ej?Q#V#uM*U<9%v3oX>RyVov&1+K$i^^U=S?TTzY^)gk7fzXD6}WyIAig?@&4 z>M|Vf1bN4t^oIH)=A}2m9dpxTUiybL_mFGMO`i@;<(pp5B<85cdzVo>T}JbKe%?Xv z@30MLtP>lak;j?bpFsRZS7nIxVQ;8S+*8K-ur+WWFXH!^?ojiUIG@LPg(tB_tQGE9 zBi5~so)F`2s4kE8^xvJ1XLNrE|1;-=7cti)zNa+fb<8!1IVQ39Ld-4s1y{^3xd6HO z67x(>@FsfvOFDm)d#tJINMj|nt_hQPdOJ^J54lk=N1f{PcOHMo;Ol~;EqzbHT>7%( z8tM2wBHuY`|8XwIKg7I%0R@evDb8#4VK!gq^WY{L<33}%F3~_9OK)@UwAX&x&(P~49cS} zc*?>Z`P2%}Dm;0M>kk@N@Ny+|#2NFXYC~?kz3GiTV4l-MYiNF5jACL$oyTTYE1F|Z z`SR+zN4{U{+O2#dl&o(uh5y2&Y$Rv{X3(7F2g(cPRc#I z+($y(%P02nJb`mJZ@=V8?C1Fh^p{5#IeZOi=x?R&H|Xz}ca!**IaK|t<4%0fjPIDa zXv`?@ui+BJySA(J#dpm*@ZaAxCHRJ}L^I|ZqYxwXUo>zIh1xnC-FHBau^Z5RRnfmM? z#2UD5`Q1zDwLNe*9~SU9S8<+0eZAI=7ftckz`qjrY&ze;+l0S$)vG-Zj;mE;HM)V+9zH8?y zUN25!p5k;oF;DSyRkfn;vm|PTXNkJ4f>^8m3C(ezn2QJ3>9sEKCPW{Xmcv3h%;m$U z@`yc&o})STTgzUZzxdMPYmmaTDpbTZ5w2a2wOXw{%x&zMOd>&_FzpDXyE#4od!}l(aW6!Jo zke=Rmpb$@=r29Vg8pMy=c^kh&8t(-giBl$G&>Fu(8g;KD-z;>-`tWtQ^AvH6I}T!A z{fnmg5TuHwNR@~=SK7TSj4nXI4Ud9%A?_5&PE_0L5M&AZFD)*vl6whXLU>(F9h1gSbJ^tQ&oe6u?kL@=Gy=oyVJ84fB9_Aak$@c>_JVV;)3*IAxR^~^8)Jclpl*UyD7_1~*>JSD-Hk8(dBWB%ek7=`~$h`l{3r*O`Z z|0(>f@IR#1_0;-r$KuywH0EoSoce;N1;lv|cIwM}3OWu-=o$LIQNQ2iP(;lh6z4}Z z%BQct!QBb>DETLK?u+-e)98)4u3LFp!}xek%WYg&i1{+3VLDyy_!sXas>na~-588( z9*&rU`m+3E-|fo!s|VzvGv=e-m&@_Qhq6mR`)_S;k=KJTL2jAk_NW;5%WbjT&f#y0e~~gywA%; z^9FpA@NI?)IA^KXpHPnW+w^cUebH79aWLK?&LcSc!2SB;xSHKV`$)BlZ?PksBgVq- z&_R8&iqVia%?uxa|0KUx^Z9OCf8s-DJTv&viO0twC%&)njpf5B^%^bjD*QbG$?;{! zcQ3vabcgoAu#W!FIv(#a2)#XNEza-w9iGsc_${7mwN6&cgx11(;a13?o}u?US}UvH zuaE-g41E3cMRR>ofxq!vOQ~p0EzdW2x)~NaSESb$KjTP4Z|sHClio7)y#+~mo49Vr zcapev$NG}EUdI}fYp>a{w&W^5R`4LM+i}f~btJKdWF~D{aP6Y2ynfBDx8BVE?=`Oy zKhGPxm#4Ar?sq-)o7(g!t55Yoayh>Teds-@pGM)koRrsm{2uQDe5YuM_tme+HTIW@ zy=A)NdRkp}|6HI2pO)jdv8+?vD|B4yJSt z%O%H;a9+k4?>N@TE46b*>^t@&EaXwVgSKi|O;YsTW8WIs5eHxu8*65qt)d)RyG{sJ!&-^CK& zzT&%AtQjk*#-HQd0o~|b2^%3DFH_U{h4DG~n3mQG5bIqss8eblG~~geqWn^$PI^AS z8WpIZU*UP0KNBNcEyoT#saB7R5yxpW-rS&fZiFXc08A9`J3jyFSRG9FRdF{t2G)zU zTb#~(`2l_w?;Ot;@@P2>Dkn#nB4!RTx5FS_H5V)Pf{S-fF~1|;ImP>?{JeaUb^HG!mf znyE=aHTlLh=6&N&LaYtV!pq9^yso|*p*;;TpT8SVm*Xp~4!z_xPV9Nm()e`hncw)> zKQFFL=V^#J`%~yBUR>>XRF{Toy!ny->v{h+G!y?$TruDIH{KM}cL(9W=Q$VWdCX&u zIn0wQIG5o{%wx`muL_=rqNnsktbH0yN2h$erQ>Ef#BU$GFNfT6Sj5kYIC9|V&y!g9 zl!TTma3^0M;_Fy>ZH13VeOpDxZGE z{{ZgT*X0=A?DFdmi_|IR$34O0_u!CvH|JG1IX0v^7oGWn6$ z*J-#Ux7%^;gsHU6gKr?ddwo<+AIPg3PGOQPPUbqu`yb?UH{ST|g<6i2CiKPcE_}o9 zgZ#Pnw-;_UFy?%(rm+Hz$8g2HYV_84h;NJS^u}W}#-6_AXnYD+M&1v@H>-qyN6S97 zJB=gOV#l1DpCO*T<6C?@e?J3Dp$g7eD>zx?w%EVs7T%qMn!Ib}7|6h{!mvwSj>GFXcdBn{ z$8;u0O>1#=SxaAW{niCyeoBA2r&FK#a1!c^(@<^3=;K}btP`FxcpAw0IdvFfTn5@= zuh(~Z_ljQGM&AV9{StMcFO~7{!K?I@R+DV>41^bPUC+Zg^u*pxUFjKyZ*&$ti0dBp z91M@)nhdRQ<-t=J&)ax5lyZLOSIplnpe9{mG|Y1TsIIP^)nq-yT(2JL5%awMl<$3F zye!x6)FkG5#XPTLw8mVomw9>ZJg?2T6LYSDjplfMD#2Ij{WGsV=8WdY+ZbmV zdUN4S%io7^ZsbQwny-Tg_2px{I8cTU`f^qk#|EwWaE;^bMp(s%ST9-&&$kfY;0}-dp(mnA(2{-@pJlCsniU zu%EX0U6u}V-wu26G;kcX!SOm=k0;LQyP>f>bEnrQIO2WH{rYgI{)_K33kvyn#;4VT zcb9bzkYgSBjS;)FyvD(HUY*xNJ$Usoo(JVtf%c=u#xq_k9u0s)rIRqz^Pt#Y@x339 z#^RaHo6l&7_xv-V8IBL-QXfxzs~W-cHb!1Wc%7cc%FtYI6rt}f{ZLx{;$G$(IliYS{Hr7t<@mH7 z-YL)jo=@~MzZ%oJh}PJjE9Mi$JffJN70>H2mnavKc)t;Ih7RJ3`{k|p;$FENja_Mr zd**oWR$ouN264}vxL>}Cr#;_dzlNXX82b#~jOR|e>fq``L;Fnbg`hv42aW$3UX|x1 zXr;d@;=9Z772k~Fw`VTkY^4qr@V$($0zG3P<`>00)40aQ8t(XR9&5O-{dOMrw2$MA z@8((gm-udeT(0rGymB@9JEn%>i}@}0sApo1%kz5k+Bq(Hal{;#yLtAcKAQnC*JT4; zm-R<{(@rYKnNW|WEVMi<$AbJ`suz|T`ydUYjL%?fuOhB-#;?^Iv8M4Rxs9adFI?~A z`T)mI`r&P!zY8&sBG#RL%%3^9-p3K&J*)9&37%9q;yX>LN_s+GwfNJLFAMqdjJ#ql zNpZdxr6<T(S9S=R!ubUoQ2RV&B&bR73%bQGJ!SnKd4$o6~ev|I<$j&qd&6GZ{!-sqm-3zCBBNZ}CZQGoC%AXeIE1z# z@;y)AZ|d9~#~>Jp=VN(}=3#2}Sq-1aH};&FOaGTV-NDnZp}QED_*z_?KFR;R#>V{5 zH2lm1ajeXNs`SSkom(L0fque^xnjnA(8Xe&gxH7Sv>3I-h_$IPFEr+M*W^#k3H?N^ zlIe*XX&;9Bd%TD7UX@3@Psk#Vn7`7AKZkkp7{0&MDhBJbYvNj8>EC;p$MnRva2blx*oekS>bFCW zoloYv$A>X|$U^5l$3W~$`YKJ2t6Oine!!a<=Zldu-q@G4jXLGV{|v-FxMy%T#vAL# z8>jvEo}n7ujp=?s&c$iJjo!Eye*}`yoF0EB{CRM<3e9-y^7K`>q8IXskq-YXUVJD< zPs6Ilu?*>HenOm=dHgorSJW`M`pt(SS)Dh<+yJd}@mv31!Tll5LOAb*%y{pu>e7a{ zx}J!6f;ZxC1-p1sM-6Y&+p*R?w;W=R`ziS1ywjaWH>%&C@)&}98SmfY%@q7+XpOb+ zL;2B`7qJGi1B|D450B^49N);|JK;`RFW~(ko1l7bnA*m^(toLG9D{9n6z^KE@aP8o z@on!a-EYwRtKP_@mdVAqo(C7`yhX0p=W~qctGDs&#B-L%E9v_YzTxXbIO3hy1RC$g zQ%&xbaKw7*Kj_RU*MoGmqvxKSYKJe@4OCF~m3%ubeo^DTF)j(u?$SpCp}(AB9>#j( z=gTJrpW+?DWnN{YV@N^QD)^L!H)u$Kt1ADG;7X0F7QavP`yo8}c@y`u3-IKmVK$!F zAK_(OY3Uijmmc!!Qi?`(?T#`8*e9Vo&ILGQ{Y4Jm7r{M{zPOKlpT4@d zm&xrbh&33o{^BC!!CwPn9mc(UyWp6LH5iSc3hr^dYlA=5T`Xe5b9~Dx_irJ+p3k1~ z-*ZWJ`YS`x@It>7qJ5*_|faX%Y-#2kS%V)W-p;@)bGt>F|uzUD{7_~<`z zBE|t|#*^TEp1&pO{*1o~?xJ)*!Qa?7YcYJzleh4UlmD$eeVg8;>bC*USv=)=FhWmM zaICb$SqNX};G}hgdX0g?YF3`++Pqi{6X~9h?-jaYzFB2G_X6H^eE1q?PPK~PF`fcf z@b}|!;?J08mDy<7BK65K~|XP|kA8t(D0Zsv3BNl=;xu`faFNpMz-`TDq?<9ssC z!w~PkvpCtbtE;GeC=d&JlW z53570GaHXL)|e&Mm1V+z?b@=3d2>?l3@F7{{4uwwn;3m@*TEZW%btbA`mz?n&*9Ot z{OOwBxkn9N660mPGmaNUcrlswC6J#NUFq+OyN;f02*;qO7@O&@C`J?LDb5P|<9%cs z{QKb-Io!{q!)j4jtS;#s&*E+4*AwC;%ciH)BHleLCce*xe)zWGi#2#d)OIPZ6?~e3YYnVY&#h|lsXRWe;T#9c)Ug3= z`RSU*=P7g@=5tv+anbm?#`h_Rn~o92y};Yte2w$R;Og#OASs>{b<`eLdzj7Fo%r6s z7i%8w=WShlM%$%It=E)YwDZ^XIh;1(|$@l4&aRI_S&2(Uc$L2Rp3zAUuA`@){wS~Crs9wJxxt;2uFbGlu3g1AFUC?as;GBP z_oe+HeqSqx7%$?_!rQKJRGd8G^n-@HtShZJ?<|F!Vtp=;kJP<`SP#Pn`FxAJV?p-_ z#{XvgRUVwpHIHE4KJ9bzxn(qdnR>NF1$ z`vKm}a1Qu{AMwuVYaE?upRez~#W7agc$d0c{;_^K_5wSW%6ZQCSbsE`?o-A$H1;Sh z?e%DnV)~s2@6r7+4HawnXCB@p{_SGNb>>bO#J^^ISOM|8on0TyQKy)LxEtp(nxYR5 z;k}<1cgbxKtdide`qs&7H^g)IFMRnP_pcCpgU5L%2i}-3SBS4MKQu7`I5zvtkZp3J=)jal?%PuR@c_@+Ny?)(0ee>ORP zMO$&>?}y38$NSazmMe6Uju7*@Myq*IT(QS?JmWWnlziO*UFClfvKmm9*4S%%9IXZT znv~AOKHERyJd7{q^j?r-`qa)z_~JcWVYPXlwmWc4D#%~HjpNTiTCU^G73j!!DI__n zhqB78k+Bu!RbT(L*TZ-CkA?M412q^(L);U0=hrHzO-EaJ5DN2uI=sR#pf>+f`a zV*CZ?#xuMwqK;kgG}IHP)bSTQQ}D!E&kyN~-ydCwa~;nnsNK&nj_=cWwwI=wG?mm7 zW1u{3P4Ffyh)1uD$9JP#Z^JVX$6N9oP183xuA{3TO(kf0iRi7yjG*BcJ=uykE8%T5 ze2bnT#w%-*EXF_0r$^;h6whvWlxM%-$tAA`l+ZK#X{wxDeu9 zOCNZEzV{(HZMDStK#acl>+vfajYXi9ny!H@kXNiX;Ro@)Q;XQ+e}s6yId6O{Mt9sB z@TOAJZLmNcdhzded`*lW53$DO+TX5xu&_EoOP67jO5F+G(U(d z@%vbh@ce#yE9vVyaaEB2SFi_;(S91v$Uhn0_h^o1(0Jz*`yI5_3(w-uPji2`Kyzn$ zXX0;A%e@D^tMSJ@_Uh!G=lLG*9v%`e=DB^Ub}_##8Q!?AwAAM@w{0QLnBTS;2iZxU zHh!wy&e8N3J%=IQJAI>QS~u~%^Elxm6Nq`VS)1P{X%=iU=|;+)w9*Hr$*JHAt}Uv8Ue zd59;KQ+bxpBxmE-K~gz=q4pE`5qpKa3;lUgQGMb)?>^ont*B?kj(6JeK0EOq`<3jj zyE*9L&$n`l_u0b=>jAj-UG@}w@u4K%V<+BW$G6UAG`$10<@Xd#@qMZ}zaPQ#BA=7; zXSTfJeD=NEuIKF=^qo=njPi;(D(iUtyyNqd9BNpQ!S$VoW2(A-5&Y`}NzI>;tSWepFHN0KSJX;_)tBX-Nr^4_#g)iW`F{0_ZaP0sDa=uB%5$S+1x zdh5YJG2)$a%qyShSU3cy(z>rAd>jwogHC+xE6xIOhURwN(LbL-yesHd-1P+aSG?Fw z|GPLVsK@PUu@!Ehd!gKq>YohiGBBs}Hg6BmdXx`8sB305?Mve$dSx`k-h45qGTvDh z!Fe0bQLqu>USK5N>^KYK8x4hMJ*#g{;{6Tp&pbGnPcQTMK{}u2!>6>i6XQPonQ=bB zDhy?9!>dax+>=+G;N@%x&Im0tctY6^(wAa zW#kw4bD4~U-eAP z>1s^RTR0Cwa+=0M7Ii%imFbH$BP+xhh`*qGTj`&LbS}q#qn=Fc-&#G5zJu%aNhZGa zgZTb9mgXDPI-Uhm6m&g-nA5XNU1Hr#+)Kv(tu^3s_$r6-uveVe$2A>aXQlMFYW}qx zii&Ye4zbRyDDH~tU0V)i@Ro;|OVdOS#qqrlFVXxfuCX;}qxmJrdaS9NLwhkE$C|o0 zMq@qQHva5Q=iU*29UjGZ#<`F!k7EsDO|zK}-){DtHadnFa-Pg`-~o}ntQUx(Ni>DiS2 zJG7_wEF`0MB)yk$H==nk#Bb4mFU~q~&f)Hh`!s*5;>%IO|K@pLyzlbm2Z(pf_qh}KP@BXMqidUeu+Q0V}vHxxxV~6tK zL>l*WbiNAltT9IZ(`YP7ZO3&rI&KyK%aZ!4#CdMVZtnq0ZqB<= z@}34)=&PB|vnUU4$61L74$Yi=*B%yJqF8rE{!SZ%Z4{+b@#y1`wIr* z{Z!8Ba2AK!I6DQeTCc}9N`Ku>>k{?8Uf#dSr*!^o&Chn~75gMyk@G>i zo6~(5YSR9q7?0@P8FDYh!xA|6se949jwM=C(%AuqKz22YwHvQP%sZ&Yms0o};h)2o zn9F*ro~nwww3?lvJ$|PlexD%=ZSlUOm$9E4_ko-T8C%u3l2zRg%Db+@m(&=H(nm1?Fqa|c-WVR^>F2s>k-K5+_l7iIuF0m)(7_~ zIS=LISb3*Xqu10ZB|kSh&X(i;5_aLON$;IeBZzy9479}>_crhiJdgV!e6c=c9KD~w z=9G>ln(N@-2r;L94E~n%f9W{-9``}qF}Loi67IRn=u>_S;YTuF{7QdH`pfa+Dfxeb zYbc#}(fJOJH{?H6ZPMq{|Md3Y!$mdkjq4^J+y|w~IhVrERox@uS*!MWX+1*U2z-Y# zIWFkxpfA(vpK5gdgr^`syFw1NO=0{5_4$gXQ+RUIHI;|!gJWD%< z;`~35&Um*y758*_p5}PIdL93r@;(L|)N7`^V;)3aF?PaOwfmXJL+N}#j6HlTkF#S& z{_FQNxW?o9RFh;JPa ztHS`XuUpf8pA;dTQ=jAg|+_xa^8}1N$CXVfVdWF|- z;TeV}gYo0VAIGCoy!iyK$JGj+mCr?dIn{E#TE=_z0VV(aw!5A;Bh{du8m#0|%sm*6 ze>z-&Th!vT7`w%&p%#b5n3PUE@ZXfxeJ9>!`eZY$<@Lx6xI>ML>XXv?@Rf5c~i90Jq{w>;ZHMXAL!d70yEkd2Cag$Hl2D zhm+zgP?tV5$8U&yAl5CkZx*Yj`g{PB#7e2o_lWTxzvpGqXYzO}hl8b@?`W*Xi$=V7 zg%3B-RtW!6-j<+ahk8B4(>M7U?+n%zyRC8VPzzI!~ampkyYGOo|`;vn9=iSK$jJ`XQKW15z#`6ige$F2G_)(kxk z4>(q0Ki=VV*3<)oU;|Ia@Z=M5=kg`q&s`^nNA=qte%#8B$06SJt`$Glk&Kehbn(lG zzd+r3@}(c76#q4OB@_1nzQ){&8*s!sr{;2a1GYj&o_v9)f;=+uOjqdFm>U;=4o4r%a;O5AZcRzEZ{=QIjW)N#(e@B6d5zepFS@8TTiIuk8#=$=iEj z2v6_E5#Q|k;^<0CPnb(fMs?mMm)%evUuAj3ePJhji>kX9r=ttLScCI2uABJv9KKcf zuFCac-kio0bLJnDSKNQcGf7?gp2ZjIg_q#GS>KdXqxj9fZ0eDQzQ5F@gxc>^mnLeF z8h2XxKBE@1aL=YU&bu{XoH$!(tuFuB5Pg|Kj330vAjYFSII8xq;ok|*Ip$B|FPYpu zlw)V67(1XT?W6IpfQfSWQJmY={66)Xkjp=d6Z69ht987C$;Fpa5HEwzsnGzwboY-3 zcoFaZQmIi%m;`4ahdg3EUL)GuKx(}(31a@^UdKfbUZs;q?1fYt-wB90tWV-y569pt zPqHxR0-lESPJ_KLg3h8e{)H{C z)^v^Jf4ql^=l}QQP!M+?K5W4;S^g&>_JJ4zt9boaG1p;wm*D#X56hD@G`1RVyVDx) z53Wk=nfn%+RNs@XeOndo-1z=~sA5@5FDIexVMr z7H_N^U&0ylfWOwCZD~$Q^KuwQZzbG|T>qA;Lvfr{Aind*x7NdO8vh1*&x>(HeYW6! z5bs*&juR#QZ*_T^&WHK7p2m|j*4Bs5sKIJnJ@v}ndEK|rHiM>EYx;6=$D47n#)smQIo{<}m$;w)5$59C&$H5Mx&~s6>vhfz-|#(pB=#1$PA@w$tSuYvI?xH$3aFSC+ykdVhz% z;ZEnp{$f&P z>fJzXe&Fv~oJG`jBi--dUJrTke^EmHO8Hyf%)#5fmh&&Zv*_YCR!Y-WjMwT5mMq>pl43dm0kXm@eHS{G)*h@N*jF7>5+J!ksr^O&_<4D zSJXA30e6l~Q$1!$U0Q_L^uBgdl!o%iMSBg8y| zm}3z03ywp~FF45it#sto_a7Pmh_SK$ry>nwVKaaG@Zmj(cZj>?5#OL<&Fv<6T#`p7 z{|NX} z@5Z%wCO_gkaGcXR;QAEm^0=yeO5v4`Iaa>+tde0wj7E1vP<+k0I-dxfrer`ifv zd~?qO+abQYZ&mmB_MVJ4@!kDi^~#2`4$k=gegfheQzVn)Ud`io)+%Om9)t06u1ebn zeC{ph&+#q9RSehXMfHLD=ipyXxvs%CB#CPwu1tFH+VwAY;K@Z}tbvI&vWays3+O0q zT&#I%X>6?7+^b%@<@H(y_kE7V!t`9CC8hpZ0ON7wkmvpKdK_MZCG?cS8^>iunwG0a zr!vl?wC#qND^N*I&3X4|6AY}dOwx_E?(Xw#vM2_<9JnHXOY_#s7hlz zTi=sH-@+#l&(;6!f5Q8Cz7Fr>8T%DA4gcdAJN%F5?C?LHt*6oRk(}dPU4@Q^<@$Q= zfA2M7{$P9`iTP^PoNFdH9~{$Plj%umd|HV0)Wh)PmgADtyye?$=q8sZ;b&ON!&~s~ zf*t&ed1$eo_a6NH>5O#_@eOPR4CdFK3eM4Tk9Dx|y}pXRy9^EF-xXd;t5{F)I zCH8?RL1X-u()WCfXM^K#JwKMg2wG!L^$uzqdqKoCrx_nk(3svaHjK_{xbLI$4OpqC zhKmz>7sb5hT96a}1NhGt(hKxfq&N0lxSrQT>8?O`X8!hsn6Lhf{%KD0X8eE3J3G$f zj**=-U(eIjxL&07IUcM~^LVG9NzIQ!Z=4^{TdfXHalMb{CK^}MxEWreF$2ESYF3`k zOY~KsFV+^o)}n>$_ZF)z0O-qv#cf6dRGj_;g$$9&v< zbjP=nxPRPU-f>Y`40?aZH#n7ZB+eGJmBQ5xisy2i>ZQ&!7Nartawtz{Hk|Pr{Dqar-{AaQO$Ny`))F0%U(5@Am8SJDqL%YEZAIjJ zoW8^w%M$XePG3Xby&%64YLi%7xt~|>;QAb{(v=TiZDYIeXg6=F$f>P*#=Y>Tygsgm zh2_#84#2I(KL;mahI}&9&srd z_js|!Fz)dx^F8+ZUTka?V~5Kn_UxQ${1!QtqOTFm(-+^-n1V;|>#@&hx|^nAyovp7 z%hZ-5G{TjPN6FRiD4q&9Hp3yc>%yOUIrXD_E7Efw-^0!=$Mi&N+TMkR@*b`RYt%5_ z$=riKzIEP>+t4H{<$5ul-r(IO{~{T#tq}VdPc%MhA^(iySv@uh{wj%Eu8Z`>Q2AD% z`B%t|`^GAKfmdNO#Ba!S5O1hB_2`f9ybIuQ-nlB)8$Z__BCQ&DC%4( zUNi9)@g}}|#{Q9y>&wP?2jG209-qPiNX4f|;etMxi029Y*B@@dHJQg-;az!rkFOYx z!ZiP&pNr7_Ev@xyh>hn99PxW9D+9>7V>Vg+;@&WxPx9w=F5ykg(=Nc<7u4?- z8qf3O6Ffcfe45PpQI3Q0^vBbT$7|GW1MK2&>?JUn&e)4<7p}Cp2GbYk?bh<%gfrGi z#IxZ+c_-oZbB?_%_+N$Y@;CgSy%Z{maWSnia^C_qX5*?iIn;&k;e^;bev^Sr1gwZ+a8Iq~f)JW1shwRp_AJgNA9!x%Z8!C6lZ_f-Ga_sTq9 z0$cfY5}u^zVRc;!vF^JHzAJEoKZ$kUBa1o?TJZvhjI1bmnzc+$(Xm z=67qNYVdc9`t`#f@4r7+w?}DfiTg{uugm*xyrb~NZ#ys7^Sf#6QO&u(rei6oYnJg( z&=$|}iF=J+#>O%JnEI!}k+|Q8dySZ9821@dX^MM|3l;yp&&XEUxd(6DZ+wrtSM7g$ zGOc{?fq8IBFHfbX9q%8))r!-SOJppe(ayh5f5B(e`BOM>H*5Cq)bK2%C*Q#RCLiK> z&yd#njm}rp{&Th81#`qGrY(Vt|PtE)#VPgj_>PB;3@tM!d+8srqg)s zclDUt72nklS9cD;72nijE_-Vw{>s>|>CHn^d49!Slk0JO%eR|o97f+|eKU-{xQ_kL z`?gY^J!veXUt%s~H`plm(zP8gxRv04p8ey!OFZ|lqcP^%Ui%$A@eRGLeu*`<@qGUn zjqTNCzZ}mQvklp9$Mdfc`?lqxtqr_STm0_jn`)7szH+>KsTdBuSQ6%__ZVIlP@Cd< zuNK|~{2MFZnE$ttUv=dh_lTQ~uWroiYWah4b9pvYZas_}Wn8RxZpr^u`XsBdbLg4} z$06o>b)oAhEq@sMEpHl^bKfBDMm_N@uDX0#C3Y@(ErSL;iTRil_}_${)i`2KW+A!8 zoXmrC73Y6^pNn~!F(>mF&d2d==j{<%;{4f+N2Bq)O-JvH&NVp7XQhch@tcwHTL?{! zjky++X)DE#n_;8cZNj&V=Xa}JQMH?fyNsS{f#)neW91azhK}WPU!!ivAUQ3kAoep% zhqG!C$Auir$T8kid=9a1WxT71y`7rL@7nhjiT&^f%Q5lZBJs{5u_xYfys;nN!m@fE z2GJSsEVk2{cxSQwKOQU>Ya^V1@S+d>2|qgUFs>otMfeaN+@;2m|DAYmz&Q=#9zEf~ zM!c8s#N3s1JcxbkK2w8&JV?&ZBE`J(Gxh-(t-f7(ca(1#^v4EcJ0#PS`eU*h%++5X zLU9}|c^B`KAJ=Dh@vH#sQ>l&VzTbOwF9PiiuU+alqD@-sgt>5+IBJphm7wj|LFbc)oG${ z9v(I)IUW6ls~Dc5`l6BX8R$zz-$A;@Ip5rcX9aY2ytR;fSGmVpkTE#pJ@g(JBlnN- z?}zGQ#2Wedb{K2p<&^H4H^6BZ~o_X-ZJKTlppGLm#$oD0h3d=R#!_|=Q8aM@+ z9KWyOYotEg=&Ou#6wb+xsb)AA!&mT~J}9FPTFCJtY@z3CV_WiUfw4asdkRMK?iK$3 z!u$AE)`6bga0^YT=~)4dcox0Vmsf)w@7v))d>^Z0E_{pdwa|YL)AAs$`H+EMzu_F9 z4*%D0=w>UX2cWU~#G0s;j@ur5JX@7#Vm!pgq4{~iL_BM6A0`Yx1<^WC- zf4^EZl=)6jRHrdL$+9uH$`4xn9ZZpB)1a(69=6;GIxjKjW){EAIVTK`DCP z))#Re>WOP3UC-p8n`fIKFRp@dt-uxUi(Zu18_=2F{f?<=v^K#zU%%W;XS|Dv_u<|7 zwT9lm=$%vB^-2GfNv6jb7{}c`^e4WF&*NQu3y<&MDfGx&;RT)XEqn|-gsTLe_%41s z|A)e@xbDRDf6XI~Im8ds{yME0<(`ku4-SXUrdtxx*vF3w-ryx`PLAKx;j; ziLOF)Rh56NonKN=pB7eE^*zti!ljLcOpdwz^d5u;xJ%-0it{cx&%)adZ_MpG!sB)N zGVXU8N^Yy=XFlV=R8AKQ~f%X zUy0v4SS5a3t8d3MN&HJ<|Ba)*9+?Xh)wiy5N$k!0z4*W8b{@gCT7EkUIeu`hmRqbj zTdR)G$YmMH_wsrV9sTK#_mVyReati6?C-1dH`YmHHzo(9)(?vz=Hi{w4>9Mop7Ar( z{Vc7?a z1w5|g@1Kxk%xP;?**OL7GOh`4p5^aMSOOpMxgj0haa?cw`*x6&%KOwyZm>DeZ?qcBeWeyi=+$2DKweuF0R8-Vu>oZF!#&c7g~8s>uk zkFYxd|G8S*hHswddCEM`^O%s3Ig$*eA`wYSNXc9>G?0vyQkkMMM24u4NJNN4A{3b_ zrGfWz<^Da7qvL+x_dfP{@4egqb*}R|uWNmW^<8WIj_|V??$x}TqE=_A)28a<9~f9l z{XwkB`vh*}>D!h01kdR28-2xlL_9Y~tu)|4%nil;^hKD4t2&-z5YNuBSL46W&bRXM zN%8-vZ9Hcs7yn^8*NeXoFDKww4!;_cg>bx2&qK5n7JEkdtphj6?~8nRiNB4Eq0x}o zYZH6j$I$m2pHuK9_Sh`In=gm^l>AoYZTv1yFY(7Zzt~svyn3uD#@Jso9cS!M>B8GQ zxMJ;Lb9_(G{0Hw2XrEi#6_iebhtHj{o`80;Z{5pM>~5ol^SU0I`QWv41=bqJjGDp}&rD(_CL~sl(d(Xb3;?A?AiwKtDdj z99+!5Wzkp6!6oI#*Z5){Zl^fr^Y$IJb-((IdABLNP0YFV!?z9mPyhZdT|R^GJATVGe!FsHQ6A#DT-N`t23GNSx>&!J`@(#!CU4h%k4=1wor!N1 z#5dU-IRE`7i#MD27pRN;f}F3mepeftaL2dV_$FJWw);GdQ5Uhd;i5iXQ=f_7oo$Ts z@c-yLXACsOwSmS*e4G-_elU4oqf-fNhPZz3*3>mM^6=vhZ zNj|LQ?|QgSJrsw!ypG>7&Y{o4{B6aT*Yx|UI4;3@ecvUYP4pXkKo;undD=(No>BXU z=xwKcN*;U!{qfYr5x;3U9iE`SJdXIi(K{j56wX#}gXHa?e8v31F`Pn6vNfq|TQc_|DLFO8chTrW3~v)jiX|=i0^l^WXHe)i%7| z!|R**(GFt0dpq$J$s!gQm0iwhT?r*{XT$vftyO6)iF=HghvL~5eyWFl+Q(V)IcRCF z&3kh8uvp5=&18u0;Ww9(H@@9xT>T`b*>sJe>k3q^rT==a^K!I`?=c^JfcG&c9lzx> zinhyi#oY81dSZTh08KGR{S-}Y)I=lo5Z=XHb<9yepdQZaZvee9R~_@zvHv9IsbhXR z_QXeSHbHlB^wHlJ`pTw{c2HctzU0FYasLQU%h46}(jI?n@tlVJa+03*SnD6Z4-#iT zY{d1kdTC7aEi|vs>+kvTx4$o^PJf|oi?RDfC4JHp_ru{lI4(c4alDTs86RHb!x!qN zFD_hjrIFuw2$@s zFN^C&?PCr9bUGg6^#mL_QoHZ+q^rJ1!kv8S2fgKP49t+bsWh#Zx1918-y-9k_b{Xu zTSa_j=&1aG(#)WRuTN5s~YwiU+FVjOXv#sr#@@ws^t zV;NfG$}PUF>95Yw{K2P6bjCSdu@80~#H83gHC%7?9p|fLRx_`rblp%h!_|KuI^sO0 zCgPf{R$A)+Q^==n+yj?GjK?NoScs<@PlobjBptcYr=;N^JT0bDIDe&Oxw!U-E7m+5 z&E*~2ACAhWcJmukklR?l3)b@P8{XyM(@6d77vpex>*{9$y-D@eOa52lOe?0rcuvxI zk@tmpb(~KJ>AYX=uh%B>ei>Sea|gs)v~k+M3om5U7nGxEt5|=B^tAng>p|MO;5$H1 z>>q1`w?k0N$qWC7d0Mxp-cS^$hv& z4VKTgV(bW&@%|&$9=Jci`3)?hHz)3oXugTwf3G3NVx09lQ(ha={T%+hbnntf++Wrg zmOHs>PV0Cms{Y!*WvHVD;|#UGc^kj;{11$-q>aAfJ>@RByHkIA;4$$mRY%u;L#?bX z9)S3M8sARiyJ;@|6cW$1-%KlrA@SYxH{O4$Ha6mmHB7T`J|c!S@)zrvV*OGh*ej02 z8m5|jin;n&!xZb69)VaJ5NnuD(;I7;*3x(#zU;htFP*xetArXW4>zf&3MGtJF?SMg ztf?BPUCdET(soMqtJkGhG8%Jy?5Xd8+KhsBVv65I_<@J7$k88A4$o%ZmBzIcM{XRi zKxz3ZUClKHR`M_Q-esld8M&GVztJ^MoO$(88LB}i_<`0b`rO6GWa?s^e*37kn6HTW zgukGh+#S;IkNO-h{xo6;{l{Tp9oM`x#w`9`Vu)w%fodS9v2YI8TwHNB@{MX?E%X*k zTpPdEc4pL9ZGFH!^74E=H7oD2W-rdS%O^kC@phJ*SVzz~o98C^S*4FX_+##E4Uf9u zZAWjMcXyG#IPWequ5xlaS-aKZjB}YTY1c}-SF|}nQxEMX!C`n*``;n%C8@29;QLwqrx5GAd~KPUKX?n_t-!xmamT%L4?U;FoB@ApbvPW(;L5JXhr)|uUN7dD zuk3)YcM|tqh`sqgKeXn{EPspHSZQknL)ylJDaE6`bgaURpFX^lOosV;J5R@XdAq9z9G zJI;bWr_VSGy0Lz0^8Yq*#CaEM^;aHuSKbVPb82p?roF}U8^m)_3cQQqFz&bb)d~MH zHCKdB<#5M&OR+xhPc?BJj!a372kq_>|5Cnop(XZL+z9LVupdsiHkB0j%aE3)KVYHw zcgSOL_4*oJEyQ1m$F0PCJuPoT6LoN_cz?iov)JMcldkeJ2hRl@&x`GRG1}oGp44S{ zrCt}h7R3IQPt`)qi6p7xo!wa21RDE57(Xw;TS3 zL1H}zSLj=Z`y+_?q|e1)3-A5VjNbU&f;F&=XV2686U{I1Y?XXO&M%1f13K>&YZH8X z;2k<&qw7UJ_7-pKH;sL!)A$!_sba5b%=yIr?8JW4jd-&1EHgb{(Ghzh(`#Q;`*-E; zUU6m7e>OF72G<$>KZ$D>-*OeDMgMQ>H|9y=45xiOYEAdwkWT-ZA?BmHtARC;PCQld z{faLYj-6upn1;Uke-BR!?T?FL8DC>h_$;2rnZ*OMsbOt;izS}L9udcG{U3p}+J7e3 z@iD}|{{0>@NdJ4pP$`w`sW{%zcYG5`CWdlyv|N5Zf!sWa?;w$z0X$4uNe$8w-$I7b z64#beYO*{nk3jZ}{<9cr;i`fs-v18Jvj9(=tCUl|7Zi6bEaiS%g=Xy+$?dJR#Kzkt zbd|&x``CgnzWwik;QJiDr!RQ>{||S9uVQJ}Y8tci=}R?pEq6uSGsImLcg#ocg2CcW zi@y}DP5Ab{`ibYLmGm7JZzZ+e8ea?XevhwKHTQ8bSE02RzE}f%2;%<^@iF#C$NYR( zS|8+P6TC_BUOPws7cUm;Bfjs)9DU5s$J~5pH4^jlt!R(=`IwiFIr-0Umz3vbP)i^8 zq&GewH;=c&X?~o8#d3d(x-VT=9hLC>f+Nl@JAva9wHo_vOVRYWHpA7+RDYjKyzkSK zM2+38-RUB7LeGydLA~^$Yc3yJ@!(mQB2Qn@)f8tRoOknZA3RH2ele%P{|uC-FXngq z(=}WCGu6<17(-uu+Rou#hkLYqRl*;8MMjGIGnyCiw}*bdgva%DufA?p6GzC5^?mos z*W>!?$=g_S(LfAuLJxIyNem;z@CRQj7C?fm=`0etBs?#|thbv+GHW=Kq+<9S`LQ8e7^ORgZy+9 zhY5TuPsc!9TXB6$N9>o0xtYW8zJ7BX=dl(fo)O3M<$fF$Xh=&#VQo*tB5fzr5bx=m zX}+LcGrsm#*FDu)T(>{hrcHU*M7iI_iyr#FTic@A&X$UA`EZs8ZE;l5_gFqG5X-Ol z#*3#u&Z;;M($WEMRk3vvQ_S0C!ut^{rfD62Gs@Ew_ZP{pUP66ZJ$_e8Y|Jw_o!l@$GgapBKw>e7lWrCGp+%M>Sd6xQcJK zAFBUd@SQ$#sG;n14Z|DXaBt^tCtR^!KJ zv7Ye`^|@9)rs3KRH{tsR-wu4_B>4lX@uCGUF4LVse%_Ry*xyu*2l4$s?gfXSiU!-^ zEKln3q?f*5fF-VPafaOpUbo@LC;WH-=UnK`kH_$SM|V8)Pcug2y0`+0;c6#WW$6Er z{-kvGRztCm@(?^gce9#uO!FJK;#+TLD30%KI-6%Uu4p{0UXH*{T(N#X6CDHK6Sx4+ z8>hSYI|=8H^tHx257yyc5IX6)o35f_%_`2Ua`gyp7jSkI->@Q{S8x}?Jq{M)+kmgL z{I7)vamL(i5;{lux05h81X_?->aGvuC+QBu`LbMpKN=TBc%3p6h~Z&)7d97G`*1z}Kcg;q zkp*AuDV>jVJ-(dD-23p%p!FCpQi{EhHk-sA>rC%}t@0Fg_BZt9Lvi&w4GQ8&SC_{$ zHKnILVQum3l;<*Xv_Pz#)NA~vbPIf$uj!&(qeGG4tQA1kY?O?*l@$q87@m%+Hw`Uf9E zTVtq!I7h+@a?Ee-`1#23Y_zKcO?!UiBnU|Iq@Z2x1lInIKOvU$XKGz3Wg6nnh^~P0PY#VXZ zr)!^jKMBv$@sBpE`Fb~BFY5n0ZBFv#b2%%j&2fnD3Gv+DNL&YCzgVjC^LjW0+l=+3 zxMH8c2wL*0fz~*G=SgvSIHc`nx%i%^J@vnx{#XkdYaru0?l;CoV*TT3o|F) z46%+m)q)V_277Q-!!b^Lf8dGrYz=vKFFkP< zR(v0MT>FN}ufCsrK+^;q6Sa%;Z(fnJl(e)K-@S6ZK;Bl1?;bI2=X>neKb6e8q4o#F zm0PZ&e&b!OIot_V_+3<7#UMSNs_?tm-oqE`yIa!M3Fg8++_}a2CcH)G$!ff-ZVbxf zD)FV#$FK~>aYp{}t|#v%iuVXyd&Xeme8HP(8x5UPxvpt@BAs!ieQzZsRh&n4GsHT?K74we_la|<(%_oFr(f0AHolzZ zeSAB31K(m8sHWP>!@D$ohxa=1#+=qy_z%JsI=hMaFt7U2c|h$yCFTmazLmq}{Ee}5 zQhR@%q_zLopQfYQj1yl&@omZKTFI}?+IEnqp=xQK_FJHfJiP#?Y55I$@#`mbb-g(6 zfRFh#OkHKgvy_H=)Ol$hr5EGB^SeC1L5v;5IJ_86o^|0_%p)BW>t8fxr?FJ%#M=TV z`AJg9#Rqb_P<%0Ww*Y^3I-l0ZHo173*6pww??*Vlq_qOh`2E8BAoe>y2cN^(%KCz4 z`dUwaR$jzD%gOrNp|2@?t;v@;u#q=w^*3D&rPbG?&|FL{ovzCmKmtVTLzy!y;LSS;(b>+bL0 zV(tcbL>x7=+o#>*+NCMu+E!KH)zuj^rm4J`VqPnrcUIDqUoPH<{^B`;Gxl%R5>xEq zTm>=bmDs~MP<(9)du|Y8BUmCQ%_^xmp4H}AT-y#qtd~oyQ~gRmhauL?Jq@v5HP)%d zy17`VT1E~M>*mJO7wc4G&0MTijdgRk^X_|b$2Yn&@PPQ^ysi1Ll4sYRxiy{#Ipp&h z@$V7)T>2iMEza5+it_{Ljx*MT{*8A&-jVV#71y@hw9%4TZ5I~f2kI{;4}XDmSjQP_IO9C#12n}N&RD-0Yd34iMeJ2P1Ql_v zG!|kGdo^u?@Z6BY+zf4>!rS-`$ZHoqwk~d*^6@!{ch&gr*$2+^G4Wdn_2r=hjrqlU zAHE#;TESk}l-+$pj@Qw*QOpBr%uCl{Q zUhbjqGd!1Qi*@3)O1ig|QXe$c#rG=2efDM7vG-3wVt+~crI(dftJ47$8TP5hbeM#03MRt{uy{r-wDXW&$eo1 zMfl0bb+lH*n+xv;w51hm^=h=yqlA)lf?DdXo?Ohu74K^gYhQuJ;qVPiq%-lp7Vl~O ztI#2z@s4&>yG?ZcMngsYKMJd%wj9Kqdpv_q6XOQC+rp>6)x|lnW#`dT;`;*bpl2!_ zY3PXg`&Il-g0}#~{C%u%*eRaG{C#5IUCiM(lFP(ehQ#`XSi2B&`muiDZC(|@@dA!d z>G@P_JH&K9|8Hf$6z$u&-nEAoe5yp}wvxsqzhbU(6n(>Z)`P|kcn`uld2NsT5!d2W z__L+;_xR`WKHdXj{nP_I8wC5|Y+=_%eWk+va5-a!hh=fL$JMzWox;6>XE~0~_*j8| zeL^e5_s4I<-jL?=xzxLSW>hcj@hydq@cpeursIg4_%5-gz>|@Vn$RQ%AGPTKW3_8$ zJjDXGF;KRG`>{O4H_Uhky8`FsHWO{<#T(B9x5>e7HG4>mkKxWtU*h>-yLfM(cX7aN^^i$e1oSKStN%{4+8|NIHeQ~zIxt||NXw9Gb>bPiwcWpk; z)Y`txzfZJ{HA*o)W{W*tDt&8vr?&IqZE;_KSkD#r>L0{=iLOHQRDzL(alqR=?Lbox zdVUrAIouccIJ7p6Fq5WV@H7)+%ssp%&N1>6d!S?O*5CZAE4IvH%Z_JbDfhZEo~Q8i zqVYrZk`vEqIf?m&G_)lVTT-#bJz^hiwbaQ*`hJIqu@hYz=qiS17)?#Y82dA0PjeM~ z6Kl|{etv^at}`eQs*4n~;@>Og<+!gH$JNx(rx3p}^qjaC^DoXYyn?%dIP2k{Mo^e+bYwbZR~+w2pP3&5ATOR+CB-J>5skr`}op~*Aukwr0+PpYopk& zXxCTVE*D95i+hFs-^0;Iem1C=vSN=l!0+ilu}AzMUt^#6opi)L@z^7N7+$XGp2mav z$=pA2{2|}5?)+yt?~d;sT=Qv(`G!Jbxr}3)oUDR7iUeVi2Q5q;cd%$$JTbgmZjvtqtSt}63x8Q-?T z6Ev68*KaULAC+nE&V#}F>aCwsc;n2K`grfc`wRSu`)4&!M-5DbmbmNSULb}eIPbtY z1Qy_|$m4g#5Oa@j^7#UvTk&S99Cb=XBmOvNe{VK_%j257Jp-%p!tW-N!l97f&Vhp)<>*uzMEg4K`Q;ldr?aLWfw~!ex>Kvetqp1M{)JAQ6Azq z*2;?GesL^>sEvF)ny-%~_&eiS0Y~8gZ|32Pb2SFyykv}gs>VJRM@gK^#Smv|%*uB) z$8n}cU0%Id+;szY2KtXfGW_f0JI>OmLF@B)FX6q6BQ0Ic;a6O-&NJ3{#-8g~*BNU% z=fbzH6W6Zm{0C>O>-+@%UE9g$7C7Tw@B~bxu>_4r;Awq)iGKn9k01+;?O`| zNG5$8q&J%AOo+h{FAo>0P{wgMKbi7bn?x3j}dyR)1;d}hs z<>XQT-;`A1qTy~_mBbUjYcq|Ge{`A^*Cw%@| zSZ8q^j>H;^SYHuqE53yj+Wy6l|E{t4idW3%LL7{1tpF$->$ z!^t?;GINw#h?`{|$RPiPV~oR59I-bfzL)QWG1bLG*A)4fDIdc$`;rIo{yvX~*U|PY z43LKwxH`(gbY8?dj*@aa3Fo)QeeAU!fwwem@%x=O;Z9bWHah3(V;t_7^SNJ+3#yUV zaNdsZ1)f&G^{80meC~M98;xtWI*YTpo8gFi=nG;!16$-d*6H31{h^1rV~(-4oZZID zhiQ)7KPLCvc^dPMU1)v{M(gYM!p0+=#UakDI)yvt8cX8oA@(9XY(!(cH^ejfBsyOZ z?^ycEgg&trQagvBH;%7q>dU`4+ak_akGZ!~`j35sKf?M z`_W=e!6e?q`4&&=|2*8sr$(vV)5H_^xHrU7G@E+`^j6C=)$#^hd)3Khh-c6E)|H<3 zeR)5N_pvr-2d-Q+{VtZpcqY@E@t0!eFDd?_;(r70`}pGCJB;4A_m<>c+D7e-t_0oaHz+RIHM!h zHdiZV4Ct>t?dx#PtZrV8_FwSc&5vd{>*6YnryDN{;EMfaIp|-+>!kQ*@ur3t^5^$V ztDbJ)^-3NMpfBF-bK!W6t{ZuJ98VIy#-8@A+TFv`g0vjb_HTGx`-#S0tWVy#L79)?mdMcpr#2)|5Pm zvz#0?66Y%MUBMgA&S&U}H6{JTH9`BtI+6-FMrs>tNap&J>0(@#N^Zq@gSJ)p(*_=p z=ili1Qk-$7Nd|E)rXfuw;|#~IJkJ?^%VS?W&FR?8=MxZfAFpfwjJBT|4{@!`sm30p zI~6}F@Z%&u2J<4_;JF^h4-jXB$9#8g9zRlCtYXTm2EHxh z*@B){xJSTI{9S09TF*bDt2~cpKo%FBPArxw@b!oIuW>seau;@ga` zGM@N7>sXhbmcKvBePUgDV;Y7-JH zZv$+Rs|T|BcSy^tyWu2sq~{;;-C|rV72kU_jaBDy9zp~0ya4fRdJB#>;G%e5&fuYG&%~T^oCz53 zxc7=7@!dQ(-dT8)ilH68-(Xis*Jr#7!UvYc)uAz zf6NEWQEjx+4xY$C1fODE?W^LsqOZqr$KLdhAh#HHi($RKzJwC`DyX0L zjLD*MQXA(koDb8VR-T8zWpTv(e^b0S@jQM%DGlC2yuPzMKOqawJD{C$nvC8I@TWY- z|Mf~CPyFtR^E9oozHVd|d4*VKR}A;<@D~1S*V!GRH`dj~9_O9nf03_)==%_2pY$O} zsWxIy*hO5i)@yT4V;0YFi1(tOX^nT8$HX1KpHrE>hs9h`ygO-&wbXfN`%ui=aeb@Z zFKXf?Z6DGux7=L2e!42peuFCV6zivJKw=GbJb!J&xrEMDI8UUP3Y^`InYW=_R`&uq zsjMDaLrGpX=i`IwU?ard#~bO)NM|p2nbyDL<_?^*;3s^kab%-$zB=u}pYf1cn+ANE zpv|}1ysFJ}w5$|k6~4u~%pr0RYdsTdGE34mg{IeecMLwq`#tYs9c=v8K&;XH)wuqY z5BJh|${4s;U-8_TSf@FZ2f6eYYcxyh z(x@)!3jv5HJOy|)(~gmpMdlFEU3>f`LL4DrTBX*T!Hd9 zhvEE=_LyhBtAw!$aos7%^HyT{N(?<+KNs;O8()s`A-<_*$Js=FyNRI$-FfA+wLaoJ zzDfM)O7k+@op>@$4wt~IG-tt?4&R$E2qv=(e8fX)1gkt_O)(7p?_ZffNOe|~k8S8`c={MF0P0}uX3D=YmVo{9T0PKLuiP( zxmV!_`Af{nHI|=>`rYa8K2x{X&dtR>+b^Mu_~W}#4;)RzF^8Z3f8USZlfU?OG!uV( zFDi*Yz8Pf|S0C7hGp+}*&fpfjiy*EE1#l;>3yJjxvCbf_4~gG1jB7+GN0FjwR;NIY1@sShT1*D_ngK3cNos6uC#qD?qjq~qpK)Au|D8kJ{^HK zaqfn_^8AwaA8Vgoy_AE&a=l%Q&&$~jbexy3xL158uCMWY7wzRL&ZmiI{)(_l-m20U z-v?TRE?5X(LYz_482{(+HvY}(yNw#Um9|#2UB+K7wd*@9#r?FHm%wvkjd{{b#(M0Z zKBDdIw9SA;@PL{)E)V^U{be}oiMblSUJz@bKQv}`*10+d9A{z1ciy%7*h%k)SzK#r zj``r23ogrpwXV-AY0RLXm=k^+?>;q@j}H$+VtzOq-7!CW5C6{Lx`Lw)jyNx(yD{@D z{6=qo9B;x5I(y4WNgCHxcU_}tK{EG9da9|7i#UdB|D#;|AfNSVNk&V2`*=m1-Q_gq z+*`@X<8Yd$n&BO;EI9hXF*v}pv;6-QR~uYo=t#}~3iwjt*$(BkuPLtZsvDjoYGetX zTjXFhU1RHBotMcg&zX1@d-*EjeUZ+@e!ic?n=`xo=<8Q8$9}%-xMMG0V((teNe;%J z*t2&dzvd^sI=8osZ?}p$<|6OYwxO6W@oOmWPr?zgHllNON%y+a@}*Wj6K@I{cj4(m zW31cGK;JlV#~#Vp9~tNM#~#U8EBgx0*cTaRiN)T?Gq4}`OLVruAA2OPqwyUmLT6eY zB=$;9p|cb28^m5Wo%;r@u|8ux-tIWRgHx~oR|j0NM&kzgtyM`rX&g!40qwt6Ylkz@ z8g<5}@nW6r@81+#S#4gX;j?nar(C2BuZ*?1VvT)Hb>$_mm>;0)FPvlR@hX{XskncK z(X_=`12OIrzo8iC4J6JPh;I__>f`^MHGqF4eaUd1tD#yVH{OBT!+y0C>mn+u&AxEAe%i`W9dRVbp9AlW@EW~8CUITiWqbUw zX7Wee6KR|UpW#R;AN!4uRlJM+Nkd^JFK(gr*QiBpKht)rcx&^sLt5|a+CBv(c{w;V z$?tIe7t=1z=lh9=v&8in?`Od&b=y~5)#R_W+PDvP!g{f-6I&BJhvo7##93WG!$2{u zFP zmebdnzPL7=mE-I9P=#-k@%_&G!Qzhn0ZX-w^(dp{?_yD7SIkS`G~~q7n4d8(b(r=a za5lnuKu#{h9yyMA=#;qsp*?A;tM3rEr1M-WhPC=SPV=pDG>Ny<$rg1J>tmMS z>5$FytNw@a<7a#)@nyny1XhWyEUvM1U5{%XZF?cE<^MqJ$NLBB;oZceg<@~vJBfQv+;1Kg*LM*2oF??eedYk3xYuOG)q}>ndDa4FtaW~tN2SCYYn|hF zW@Ei`{MKwmx?;Wa&0>x9&TVl1iSIgmvFo{gR>3Vi%#XVP4~}KL`c9fc z9%B9DCFo9fd~g0)AK!|<6^-|)s}u4tjJ`Xxzo>m-?Q@H_8Xx=0WhMGf=8|hQwF+|3 z+6l7p^kInoR$tKE0B4-*vq7$U^JOrk=5c;_sT9qyyfi<>^fgqe?Ov)TV|;GVZzFZQ zKYY$4c6vwYcOj(FXM1R3+{d}c3Dc={yaFCPZrdK*g1RpNIf$B1RG zSYE&z^K<{_w%lk*S6SCyX7^#pJ4!tDP2b(zU}5I|9TTgT6LER7HeOHKV^8F zN<2ex)Rnif@Ez=;>k(Y(X(<9d#T4)G{w&EXIXVvQ_*&cFE|imh^!u%n4)mI0;4ObHv_!awRFO{3Jp5Y&3M;knA?0*?3?lJp=$t5ZScHK(=n({*NfusM^8Q8#xrK@ zU5K>^aufR_FV;|NavI|=lh|_LdJ@kCJSp)^7F!WqJz+SWKcK0aeVmtn z@b41;zT)3IwD#xU@JgSU;brk2l<#tCco?pM@=zaFtgVW5RY_=!byX|ri}h6Jp_4fKh%?^te#d+5 zTB_yZjrCMp;ZK|+=$s(O51>lyJ&gIAcrUM|uVs*lH;KK6F^@A@Ux~S#*ngOq!-@Td z6SSS|@9*VfKR&Lf?+Wx+i;rs?XQ#~7CIxN#_?L%&`^8+goaam)*3e&KKW5C~kCl_y zlNtLl&*6ygRnt)=H5V{`FCi zztGu?&Z-9ILp+Q+E+w`G@~{W)rKgdY;y(KlzY6i`pd7p>#+PaPL%Z=}i*H9wwLhCz zZsfHL@8g?&A-b~B)l~mC;dn>iF_un<@oO3i;CK{bOf8}##?^W_EzZPv8Ymp;}YntNQ(Wol!&)WV|-E#%c z9)Q$hE(%}sZm9a22PM>1GO-rtT@`#WKNxfOA3|e%aVAXs21LwZ=ZCtG68D|BC*b}R z3Wztp7q7*)S3cr>{XCto(AWrX7o6|P$s2rFoyYZnf0+yONZi+n`)>7?q@wv3y!+uP zTyZ~+x$dO&<$@{vJc1*>ljk;G6W_^u$VcKEdE)!{865F_yttSX-^e=}`%l0*oIl9P zQMxvWcLv{TimwS&rE4Yp%D*LYQHQSL6|O#;#5w129^KzKm-DZud{hwQe)ZA<->dlg z&{j8_`vHALa?u47_%{>gL9AD(BkyD7y_`JdQj7WFxIRY7%X@e`vZ4V0dcgDeug4wp zDLr`DMf}P25%0HYZ#Y%ZI!14u-}&Evkl^!(;e= z#D89n&hsHR-YzgCr}3FveL*aedLI6etEu$vldrmbxrjg3)9fkl-mjmX`j|xjBgP|{ zNjAbB*dlNFwvgQ(t14)f7M4P zyyw*SH-%l-`1L5xLcGdG<5ZlF;3$lv1T>`WXF142UqSwN(6)3=&oJ8O6>C8p{nSZ% zJY(c`3GeISD^K6w@_LGl;*9t7X1t4c z^~8JnV{|3n(eu(5@8~6P#yk20;<_GBE*#I(_Az9ayF;`c#&IugufcrU7DB8wdP}T# z^X+CD+wg8W&WmcJh?o!Hov20@%kh(Z9Lt0HyllpYi!{e~nj82L-)Z96t%JNbq`fJ` zx0({Pj)Xh$x0LI6|CGWcTi`stcwavTxAWrzekA9|_Yix&cKlBbOi%-{-z$Ej_#v7< zg4pYI?LMz&xUb#U6>C7|CwD!?^`4x+XPlho!&7wq0Go)2-(^|M+t^#4izm0rRm_zx zB z=J=}fwJr3Pvyr@bPR^dk*^d`r)7+g0zrf9O7ot1%>ApgHtZi(a+k6i6hv(>TO!Gl_ zsFZ$7yKeJjL}h)~Rr@d#cYJT}hi@#tiS&L4$LXC^*!6_YCSsqX{bucZ(fKi*pTI-L zQdY6&uF5ZUFpl1Tl89`ux=XBn=B@?DdjV{l09@onfFzNWOKtEM*iwn6*R+V6zN z=z2J%zr%AOoiUE98N{0V4LIiIaec)RYal+M@ogUdcfEaUy5gR83MyB@qn|$^u?9cp zW&e@;nfTx3U-t~Ihw^n9YN)B?Sv(uSzvn;j@w~pW>#LQ%YSTVN4P53yIr%E0k8Y4z zKe_eMO+4k)!DDimR{na6XA6%n=w}@MSSvRpxZyc5b#@+W&Oit5^uL1lmzUugY!5!yq z9~MWP+rF!;al)(8_#T3cIRAos!&Q&p3!sqPuEIHqAEW51$&(%sH<>r^<}&8uysE$93V-99Q=Hqe z5Kk?6i#_ujaKv}E?0E9wsHfJB(bk8y#P^fi#F_YhvR47S<8jHk>FbCm;=KT; z@zgdR&O_{19IEYBHFH1TO3{}YN6ab486q)%U68&){JULVV|{c!+GgPVng28J&Qp&~ zao$B&X|W%{Rfd-S>aVN(7M9zX@5@_BjX_rN7p3ueJbCau0yD*T3lBfS^MQP>7gxN0 z#hl7lJj{o0yldVaIKRgkbJa<4mNjm+!vuPh@G}>krTLhRck!(*6~0CIve1^%I9Uq& zaL$pNxHebAn*!H+bakVv4qbWh-30f;Cg`Fb_u@{&hxGUx>S{A@-<7j=JXsCt_!94? zan8VFa6!Kd^i`g}jl}Y^7>>|Cx}5*ckAC{9tFKA;pN&4$=09{N_T|=5r-#9a*oPAP4#z`#{l`3G zZk&(9GT!y%UF<^~g10Ho9_c)f@am?lo`uBIl0W&y63-*^Xx%9M&e;=*c@Slfs zw8mLC7u07qb@?&99p$1(3fCuk6VJ(ys>ygJPA>L%E`F9*^WiqU@obzLS58{%!q0MW zjK=t8sjDOp!pl%DJq{km_nEKo&Ca4vb#w?{1OC@n=S%3mzp#5M-Gk)zVFa1gXL7z~ zp|v~i(QpVJ!Ght$flG_F&S18)Po%lR-cyZWSgfNRJE=q1oYw$kI?-FXFtML@yByZr$9X$Dr=GQZdQ6FpgGf*El;Lj(2d-;4F&U#Qx zy_SLjsl`s$7;Ogl`@;VI0iJD!y)-q`?swje;N2J)rtKP<-WO{!?F)>JW-|-sy|E@dv6K8QA z{>;N%wB87@hodQ^l$$T0Gu{1o*+Z;7)oskzmDg86;~}X&*6Ab8EQxFJ$9P{z$o#S`lkk3(Xe;+ypBf>^KkB;GTc_m_(+G{s(#jQpw~CvWhjt9S-LX8zPu zYsuyH9F2qM+Y4pHnU2nQmwZI5i}5zVc^1m5xmK{A-rbq>f&1EZ8BN5VSeMa`_Rh4w zqMz>c$NG$~AhA9p_AA61jc@f4-(q8(#$meK%TMgJ{)-Ra@FCX7MV?z3+n*bYrSj=t zEb+VO8^uu<=Uec&7-CP~mtyFGHxtg-Kl6fdbAuSt@Fr^XJ-%#8adjT_aXg>F38*LM z@!NtEaXnU=_i|T`$BpGGxF%}bQGT}3_C9U1czXnL@t`1$x54*NG`o1<058s{smJJj z1@BUbnmmI07BQ#BS)aBx^?VmoNB!ukgged}ti{{WxRR^wm!PY-dq7cKTc8H6cJK`R zz}poxkHGsG&6Ri%^)?&Q^0Xs71WWYQk`LV!ZVLUS;lYj^=3QvahP%rD=*+4{hNy`* z)LGPfNgjN}gDdYhpJ+oVU4@7v;qL39gu%xD`)4SEdy24={{| zWb$xOp6}%6r#NEI&=_%d!SN8pSxRffeg|#Ga~e~)K7(iQ{Upx*Q8##ph<6cfm1uho z8shE@r}4-6OeJtuh70_R-w62-eo{xb%S}u1K8Y`hSYwUar!>YIwb%!`5$6H;oo8Kf z&8{OBIvdMRZJw=!r^LDf-&%ZG<>x#4hST*-8GjE;A)Z%;;H_*teFWd~GQKAz)yM1f zZpS?rZ>)_Lrd|t#QTGMOry0ueJ|tx5^r1|`r^z%V<8^4rtNyZ_2Ju4+KS+tFWw%s z{fr}1W!DFYy*ATQ^6wg51#rZEo7iU)x)OVA652vf?6V0C-|4?)68AuL8sE+4;wr8E zhftVT`FS3{=aGYsx^PmiUZ#5rUl+((c{RP$-(}^)EpSAiYvd}%NLKlN7~=auarxN< zgL&|ln*L1;Q{-rxYePqT@jWN@%C`_ld-arpAMN<@f;igXjBh#v@_8UOjc+=MZ#f@|ExzZJqcfg)&WW!G{&?=mf;*mj63;vFZ7`mB7V|no(f|A0 z6W^*g(0xPs|N9KIRd`3_?6UmV5OY8J?ogv?)O-;-V?O31sEH@mD#bf|QTlEZ`@=N0 zt#b9c^Sby;i+>HB((&(}uh@$ad#~bsVh{eF>R>$1EAklMm)@dpCf;#;?JxF`YJZD5 zcvAcG5c}mO^YIWQzN5!}x&MAkkG*o&eoIeJV|+s&rvEPbzsQ>r;+bFAy$@ooM6BC< zT0MUQu_pW>o;1*RY3*k4So#0^`(o>Oyc*9SV|YD(^7G~gI1Yz%c_t7~%uB4$AoiQo z#vk)n8SzfX*_9cMtGRy3Wvr9Th--m-y_nAPIL?RgEP=#t9>m#T?QyNgGoBws#nJ{Y z!{5eTRlZ+>(Q0lL?uEF=(tL^c#nj#J5B@>3f}@@vQwZZEa|Kg|Er^c?;wc`|lZDUuoEfJC~R*@NJ>Iya&IkhuZQIYlUL2 z_Ey@y7S}KI-$_q?K2@XPEk3Q2&p)(TO2+|cLq{oXw`!N4mNnYmrR^DY9=`$k5C40M z?|@j6Yda5O{cSb=j@Bj>?Z5MN6y4M6@KoFQHv7Mg<*9s(v0Oqu=cDH`3=&6TOeeqy^D`eF^*|F-t*D_+GKrdX@r9bc@+ir*DUtUJr5 z#wJ0mIh%;@O^7+o_zsd+ycOXHEKvt}aIN5b9ljT*y|ei5;oH;rZs%F7x6X|x2W_R{ zjpXVfy?WRFclcHA9#U6L)W}hM3)M+yUi@J^9OcJ!`S}sf!Wf!&&|FdZv^|;a`q7)?HTBzAwB?<8Zm24zd3se2h7lm*i`FANtM_00L1*x+hRJQ?az>uzD6)Zj0MCu zi!LRfq>3D@gtGYl`)&~L1+Byv_xr?qz!@65F-=WM5Kmi_}O?zQwh= zqrAo**&=fJEW|$99C_rNmw%R&AN(uesN7{TPR2s)n~inCC3*Q4RMt=IogG8#z4)in z8`q#~&&L|8X5x&j8ghIIrs^YcPSz~Big(35;y(c~@AsE6lQ<*m6<)lgw!epB#>`Uq zT;0U)(>(}n@s1Kh)Zz)ge4C#)IOnOoZ0c?@Ut%5m*`)HVR{n-9^3s&a6=;cZR!rM( z#r(duA89+5xAhA1O0J@YrmNvBYIn0(AE{$L5<24ho|YWqjk(Ta@B?3CzB4h`*^s9( z*ZJRh&Y0s&%x~tc>mDh_#GdJ?JUj>6@FvbJd5K?h>5IM7FVJ#aZerhb6LoY32FX!r zHMEp(L+Ffs((!v|iM`V8@YTQ<&%E)xdm^3K=}bKL#(9YBqzrh&aVLI|~39k6o z`;u$TR<$@nK0o1E;x|De=J>|`lkpe73sRew6KW;C5q*Jgfm-=o%$x94=HqZVIZWG~ zI3J|#R@xrI8}s9HXuCn36p`att6oEHUxX#R{2nskeGF%O_lUFoVjkc=KIXz*iq=i) zuaKDIetroK(>#yfg?zh+dy^V!RM@von20a#*E4Xn$MqzRWZEC)|8%~8mB+KQc;eap zC%6J{@~RB4?vu-yZ~LW+|Ez5TediKeLy)F_fBT_6o_A=8^+OHCSWkS<(9t`)>n9yi zw;R<-d7Qn(H4Wc~Vrzl(IKJ|Hx=hauV|JMKO~n%53X*|&Jp0$@Md6~_z*c&OmT}J$U;M6F6P!2m z=Q}=+5ZedQJ#R7yG98Z2w7f6xHE~UWJ-FKAX{LRAFaA(W@x7p<8t4v(@WooI2gMg_ ze4d3jVGVS|-JIT-`;B!HTlp93Bx3IH8U4i^aAsKKS`cSD#9Z*_e7G2O%!7jRd0s8V zUgfwq#=AyhpYj~u9i{tMNP(*!KOTpnYAyCDuZ8q#IQA*u&V!`1CiW$_pgHy>51}pA z={!$YN_mZyMl?a~1F9O)q&~j(3oHsioFpu6Hja=6VZ> zIWO)C5NnJ_$y*OKvzy*S_!D!!v*j!+pJTone|6T)TtD$Uk zr{~49_%FlP>1d$)aokPSVso`P4NgKIx`*Y%iTkB;d{j@J)zUrm^puAYYN)I@NBFz1 z#r6p;IcWJw&MVW=TORhyLs@O_D(@PhZoZ-AC%8X_wH;!LvjM+>LHOQ>6f}&0uDpx) z`Js5L>VG)CCvm;49&_P)2ByI#ng*+(lenwY(--a=#aURK8(^S*PKh_0+KF|5{lvRo ze*@G`0e!^Uzm^r%D2}Mb_{LdYn_k*nd#2(;>E&9xpZMRF|0~44j=mo9nO3_vJ8`GJ z@6i4kdAuG+C4bjCo99P;!f#`aC8l2lSO$KWVi; zt8HQ*SnU6r!i(A3XX8irQnad}C35l!#69yvNJm2pTHl2mc-jKuz40f$rpI?Ir+;qD z{3*Bdai+#uinl-T;tK}G{?KVW`5K{U-Lre*8FVE}F*s(-IB56@q` zi}hIZ=}2=2e_zPoPld8_Sq}Qk<+u9(E`xas zUL4h5d=G5I)1y3HqJ2j-@{BlQuXC610%C9ddLBgGK1*{e@z2ob8>v03%g=ON-{b17 z-3{V@Mw^3hnupER*YooKwcH=%Lm7FhN_SKE5OzUnIf`|fv&GO~{D+`BUlZ${V-M-G z{J3_F^I@E=#rUlFV!hD_dcMLD@3D#fF7bZwr+600?*^WXq9xv46MJ0J@NtfK66@yv z(mt_nE`Iwfv2JbyJ^x>8=MwAYB1ap=xR2L~b#oWwI`UPC#xH2>oYpm%XRFlo?etwz zhll0hJvn$^4*JW%yF85jFazm*1LorFTScA0?Q(Du-)wbrC(f9wobupiXnA1B-Z=5X>bM5)$JLcFEXN)A~+7suD zB<9=`XN<&rdz>@!CEYRau8Slip)K9*^>Ye$>d*}b_0fkHQ~8iWzIN!VH~sgjhpK!@ zoO}NmAI{?&OY<&>Gw)+x+B^Jhk9Rkur~3n(b#R{GaVm8X>z-%gE`a+5G0ei7l{dL~ zGeIs7!E41mPxB>(7ZV+LA2hxmTH2;$t!y9%o@Jg?wcOjCSk zd6l2@;V=)1GBeh--$P$J+J2$y5&Xl z724u|5dQ$^U;gU-t}*Uw&qa@Ss&%kdtVz>)#?#ME_)uT5XMU7B z*Bty0s;NxcyawBO8RwP7xkEpRw~E|v;$^&RwiIvdQGc0t2P^AaKAO<58}8v1(|8`| z2=V<*-)(&9R@&Hw47g|GZO{L$yiXzCDexP;Z{seZo+snZDTlG=Vi~UZeppM5yo+xH zzFUg878oyo;eA|APZ=W>)yLa-KgRQdSWAd?2b~*f>Y~nKjYSGPZ{bO-uh@@kinv$O zb?y3!c$T`8kLU2^6@S{A{D2m8z5waeN4$Sbl%FV+A@cfjPS<9d;+ZVw>iXhLD#k@( z9D`#X9D|a)+y|}k#doVXpJ*(exVPUOe&VZ?OOEo=Kx>>eIv=h*w{oU_9us?=@cH$k(WU^yx)oaH|UEme)A;ef~$*r2TY~47XJ>2`Efk!U;*6^ zw ziL>y3&4?Q;4o#G2_O;>&<{Fy2%Ak9o~a{8@$b6FHtG zzMt^KdZ(CgU(TzExEjzm9p7#|FY@X(`d&d7&uGKwi|4bJ;+;TaJfD4x^ACvUw0K6l zooBW1b{2O$t5v{X+qj8mwNCVY#e)~|$FtgYn8UyK;XJbjg-*9B%^%J~aq0K+g zO1r+W0b0`7OS~~3c_S}}L!1Zoa6Ru2Vx64Ua}K`R@)2{Ju})#Vn2*B^{EW3kQ*qZ; z6Dw(XSNja|Fc;Ndp0KZ;{39Kdk__R*N1Z`7zJe~W)VeX+MY?m=(CCET@fOxA84 zD2*gfK`!H(OE_D;*IMzAETzy+wKa=Bm{Eu~1^W-2K-jjG|@-5bL90dP3$vt8` z2H&UTE1uBw60W@v`+aANccXYy%4bLT9dc^8!k9=;-+J+u6K`VQZ)!fCgt*7$`689_ZC-Qo^zk86^uR$SN28wA9ElKqI z7Yx()D(J3#6?u#~%0JXdX8DUV1LHfwEV)xdQlu9&O(KrSlaOpCLxvC$0Q6EKR_5%T(} z7}M}7Gym^~LG0JoC!MYN~T*9v{bx{}P9JOe-% z$gehM^W-bMU((){?zdnIt{U_po7^P&NGYY z8#+qxE!OhPlbggfFy2#VsJ$I>Q=87X4o-wpYB0|4iR)lFILX7f26hb(BTpr--rMiT zcLPmLU<2M`@IHM<@y2)BBJy&DM{yo=GdZY2V^!YAJ^YdwZ{qU^e;@N2@!d1d@Yuww zy4uFPMq*B5F;D)td5x3m>P>B8PB6Q^?xp)ds7PlHeVvf+ytMuZx2UNFFj2mjsH>vt zss)@ALq9s&(B31pYd#-3(U6^nnK--gIL;T^3$eDg4NSsa4)! zGW@!U#yEd9)=3OgM;GO2kUtnn%M`IT#&HHViFY5a_`VzCwT^f@LRWkrsq-9Sk8h@f zaBqP9^zOnRbAQ+IAO#Q7@iTw6tIv^d&{|18yTjPR>Q^6s>*IB?SJ1~#G$&VYh2bxK z#P{tU`j{p5@-$zB+<0TJTov`Tn*I!YT}b-|c)5t{2QOd6n}&}o#h*B*_bg8f;yOiR zH$LQ{u^nA2a2(~qa@UjN^bHVyVeO~UwMDFZTr;-UbWNoN^}pl#S250)i;n58j_bsj z-i0rIU-u3?KSQj~j4>YTniAu@KK>Z%G0yv`qZs2K)N!AsYd6lbX}kmDJs`%jVvM!% z+i_*ZGZa3BG-9qM=lgg#NzB*F+a-7n_Z4`N_S<+`Ue4C&XRbKL>gOi?oD+M+U(c?LAW_joI32y;)A&gy zW8XN)OXmW-iM=cFn=MBqy8$n2$kig;u`cv!`mWu_@|D_n3+Eqvj5V0Cb~P)#8Pcgq zp2lzBoP}=mpQJyYy*}YZ4*D;Ne?4z^7v~%P@;sPQK^|yt!sj(K=j3rqx<|rHyiegw zfv+LN@4d#}!RPsVDz_Nuf6aB}V|-_6uSWZQ@HXDK=f4VHsJDWANiBz^`0^kqqa;(4 zdR`Vo%ss}lZLA%OxyD}jW3F)?{#aWXbB$YhTtm*D!<&Q7(YOw1lT7TlKz%xo()T%i zG1oR;%&T#frtcfq@jG~Xlen|+^Hv-+jnNHaj&HJsaQy_g(6tX@Kki46wl0tPd`^9p z!o8oL{|{aF9slLnzYqM=-r8Gx@4YwD5Jiag7DWSTX{VHEQMsvXkqV`qhK5R{%+OL2 zQIb-r-}A-&{(gIS{Jwu25BJUIJkH}dUa#wVU+?QW&+C1gtA^8w7c?KEt~v%Zw`iMnpb@f-ZY?{hT8I^_&B)#hiZ zV<*E{!>TmJJE#)hm*&zF-)|4wu@^JmV-WZE z;yKwX^cBT@h1bsdVh_K2E9f5{=i<8&Pdv}LR$lk=IYeGXXe@{8dgJRDpUU{>d5q`c zO=w()>x}HD;X2LpGM@9$8GSoIZprn;dB~y`&64PZrnJ5U52`zW;vJe#(luJI z#QKFL=07dx4`q`~FSIfCM&mw!zQ)G=rQ@{xPDiYj?8nz@3a}n}^40=RtcR$p-%jg; z9Q2HZxMw^R;$1gM_+yX94ft9?!yJt3S%|eJaqS%U zG8gg}pFK21(l6!{g})*8Ro_(Af{OGmsv`hBQw z{6NRlM!Hft4pQQJ8~#IId%ZRXZ~T7cK^nW#xD4XH_BH1D#2kOQD7;8Bu;A*Hp8qu2^*GIU<;L3;N9l9Q; zCHB#^RFB`)qH;35rXI2HV!xVHr7P}j9G71+b*;&JJsjl=`z+@92Rymx7|&-c#*XWu z7RJ8ES8-$Gx+t!N;x_{7@)OrU17%;%_==FY4q70?=J?_|C~*yRinh4^i9ObHoWnoF zRhh5wR#z>?tLJJt#rqNC+Gmu0{Rrn+HHr7z%+nv$BCE2lNz`L2jZJ7gf-8C>?s2~h z|Gv+C2yg7`KZUz3zPR6g4CmwWPu%l9inpP>va4Zwxjz8sWz@^D6yN1vhNW_Eg=+$R zm3bcL_-rJ*!ZqlG{dB~$oep}T7@p?p)>76_;;GKxFk?%|t&BcfjiamV;`*^MJ;&i) z9(O?pTK4I!>v?-pW?w@KHC-#WSc~%;-rllHyelY${8F3eO?cm2AM25y%{5Gh3(S#* z&+K?3!+1x~QTWari^}<|kmE7+&SkD<)tz5t@P(R>FwYNom*M-A@1Nzj1XsMfy^ieO z#}W67bq&c`PNvc)!vk@EecQ`FRWPa3p1;rnqi_Df;+J zn&R^$m3*G0CDx}l=PT;jUoGF1Rb?EH^LE+TD(ZO|?xZQcuT*sm-3sOLtfs4l%sb$F zO@F)&8EI>lO<&S>UX91#j*H{+@~x1{FB>J8c)NG^_>4`e1pb#m-1eMvpPp|!Aj z?xc5|9E%HPsk+`x=Lfj{ggLS+W$cacgA6n2iCOe~0=Mv-+TSPc$M-Jma~nGH7Wd@i zd=~fRhd|=q{GO8TGdNy*L*o8?+?$`k=XQE-Ehcb*OCIRz4o0XE|KU zOAWYUY-zQKH6>>t-uV#gP+x#}e?+`HqPV(_Q`f_MoxvI3^&iD~fzJH2CEh3T0N(ii zclA3Z;$CYvb)NtY)TE)BG=<9$_e2(%Z>u?$>bu0fkhll3vAla)`gx7K;yox!X^i_K zQ;d5t8J)ClNacHr@v(*~)=tIyv%jMA9DGdYUix+v_5DU2pM-ug+lhN6?s%pVYp61) z<8Fxe%zmx^;yYdo`Q_Cg@m{Z@xT?Z*`nv0loA}Ozw=>_1p)lSmFcI(Xc#EoYV~Bf+ z^=Lm!>oC0euW>%dIY*CtLT4%&o+#|Q1dc;=Ws=)#G<^YC=~@Tz&ZB}d>Z=y({;#Y@V?AV?Gvm8#PdPQ>@#?jZf6)_bAluOL z2X6=IX-7{y$2bPh@RL{z*#vK_g&d9JaTqG6$9UR@qr9BP({%`9UuZMg$7fgrTm#`h z@|i(jUzxq z?}re3kMq%17f>a&k$HK%#r>Zh@PXb~j(3XOJK?TL;}?*;m>R$}CDnn(VLZQ0-vJz1 zacnYnXi9Q2_#A>&YH$Eg2V)P@HdkJqiumlL>!k7f9AA^vuUc(7XvwZ;JM$UuF^cQ> z4!DxkA@2E(#g|8hx9f*gIIn(B)VsXik23>ppF`q3Q9tRYj5u$DeeeU$k#Z}g9`XKx z7I-SCLF6}_zA5xw#xn-TH*k`_x@!8GUK=gHcKEWXMSqBOC1Ys2dQHhPI^&%qb!bei zDS26zUCi^kEJv6tv9{#?(vDdf}3!3NSy9DvBhl;pXKu#IQy8q-f#~$0);V-&x zz&#o^%6tO;SYvqx2Itmmj-&h3FV5RDOSy)D_+GFSGRysI{V^4H8JRp8FvkNaoNsWK zfS>e4YMj&QeMud6!X-IORL3Ry^Z<;J^9ERqt2vJ4NqP=PVdLXD;>-CRcf4MqC9lk0 zrX`ub-&|JB%ln+A;}f_`mYH}SqW;lSW#m^%e)XZLzG}($BtD0#e{p)Q!TC5HalqE!jc5!*HX2 z{VhKo__>*m18_tQckuNcEY&0B)bSEsBlwKHSl5{IO&BisSIzqfUAuYS10&RNAJjMJ zcJpnb_dLCw%~376o}u|L6v8v#*v>M`p$^5M3XH@xA4c#p56;T*1Ru-r?dRb$`p4nh z16$Oj5Z-+d-&q>deKTaExjn57<#LTIV!vHRd1Qyhv{ll>r;M*-%;vQCdA=h5SfkN} z=TG>Jy%w?FrX+nW>54sF*WtMV7Vy~(&$aw@gxY##tv;EJw~t(>(=(0N@71Ug&Un5# z+i_eUZ$F-6KS;bYEv~;;;kgyZdU{szgDR<53g=pg?@_VmqCJhf;T$YfhkknPMTor; zbMpRkEngL1Ejh*SRg93;B08SJm!+QX6kv*^hw1tfVqHtDbzjHp@J!BqkXY;fsLT>; z++X46BA#t{{xEJ3KR?owg^sg4UH9Ly6J%XnRu|~mYy3qXSII3CpRs2zep@-#49|fJ z^mQ$#AIr-Dju2KtO)JVTlYSgzu1{&bMSfr4k9Pyby9{&7?j7F${v5!0haS03f9$}O zPH07F{ejljGFzzrao&8}m{=>f3<^7*o`Yrbiu>Dr^g>U1CP1uR8D7)5hR5P^iQk8d z_XsXBF5czUh@WZxz69-0%l06|I^ub-(bx~FI#-*&qI_EEsf{wqCXZs!+W5TYtd8SF znY5w#3wd0G{ye9zp$B<3RZ?kSfiGp*jh_$TBmEuc&UDWnQ zTuI}q(fDjlJdmlDYkkbrSon&AA`0yZ=p5T>7`e@Ya!Nx#=92oltC66 zKXnY zwJ=>KKbvQXdE!1+csOC6*l)3z?`gbj#{Fp>{i*g>Wu0T;MmfGw!8Iz>q_GN~y1XucC9;is_BYTpi=OD;*n_?R7DHnHdEEa$i}Ojn z@CvWZ)o3c-*nj?i?K_`KV}IPKL%uWp%v_QLCuaa7d3g&YAI?Bx-gPhUkwB<~Ytr)bEhK_(9!1 z;bS%4s99y)@8XSG4OXXlG{>6FOzJcn%He$iW~*1!Y&_n-@UG70ehH+*`!!_I%XdIt z{c%JO)-qRoKT4%`56CF)*Dk$e_zv|%;bEXRi8o}Z?DNX-nSFaN=xxR z6TZPYr7Sqs^2wpAu`jAoyr<-G<7*pRn7+fboTjA_FWvp^`;l2i-preZm)_9U+#TyW z{$VAa)M|2CZpmbIry9hXum&=@A7cIUPKe*z9S_Y5JAdGhcO>R4qpr~2JoDiItmQWi zpA{WTH>*iE-0#UQK3`*R-T~N}Meb0Y=5_FmOy8Dg?0@?We=dGo@w);~KQ%Z*^F4KN zKzW*b!$!K7WN?haG`f@Hy&hM0TyYOGzPEMDCvVyhsO?d_yXkvd9t-5L7Ixt;OXrR9 z&<=k;V|a$2uOt=Fyh&%MQ8)O0=#vB$4B#QLV#-}j~(59YBq zZ;AbVS$S#-chE8idg81~Q|#}XDzn(*SAn-z;5V5mUs6As=Hu(E9{q7<=j|r?QphOQ z_cYdXUzF6(_+C}px-y#w&#G%3dXwng0juy&z~2gYD|Kn$Kix`uPxU?w@!V+(WX1hR zPRAVHtA7{bAw5*VJip?tjJKv*ysJki;Eg?R=kXrI8^00ZKmC30=Pd1y>G2z65YOEn z$N70-*A9CAFpX#N#5&49)Z-mIm*6)V)8L4F@5`Vs`K_!^M!;_R_CjqM>%dI4T?u>X z>c;yXd|9eEuR|YP_37#f4QLyQZ--hhPp((^t*=fw^ z)IQdxO~)Jel44!jwY0{Xv_JIIw>Yceir-O*`;PnI**yG0{Dw+4TDQYOe0v~&3D;73 zU<_hV)5@R=RN=pg+AM`n@u$a`8~QsApMfW@F|R!1{a20D>j`}ozm@wS&Q7wd zN!wengTB!?ZcyKN=hclg7Lecb#+O!~xZW&6-wtEzs&l(y&P9C2Go@#soBI4JyH{yi ziZAY+$9>7TCmH+WxDA8 zPLbi-Y(5*|HQpA{msyV8a8IRiFT}ff7Sq=k-_0_d0$XtA;;|CWch$QgzOV4TiZ8pm zXTTTVr~m!#*5~jRDCN3R52VB!?+~ejH{RL01rqOT-9>kXdd}JAIY9ekxbKuhdEDpp z<8l7qRqH&s3d4Dxui^PuD2uO%o)&%5A^2TiUatn9;@E|wH*E`Gv6>8)t*7d zc3t^TqU#;K_&5#oU~MWs`26>E$zq&wO%m53Z^PBsA&K9@Y)9vt&`+J-4PN>Z*Cf@< zaSzOdS5i3FtIJ||UY@Vxet_N!j-$J2zQp%NzEkGq8QRi4Qy2IsSwe+0}vf2i3m@&iMZIsyqi6f7DnOlLpfF zGd*L}x4wVT*qD(yd}h+Jl9u?)c^LM~@1*{Tbq@z230J(&W(dBc|LvQ2$8Yq^CUgJ) z`sV5$d6uVh@Jc1ucl6}O5xw!2`Yu7Aj;r0>|Jn z^j2#sjfBG1^vEF9&f8p zPxHiDh=sD~ppVYrEg^%WxR3FlT;2Ou(~J1Naa?!j;ajzcXJGOC>*{A;U#oR1eB*Me zT`ql%voF1gXJAX{ep@e#2AS_A}gRp0czbg6o*`|&+nx~9;ZgZ?I;Nc5%6~^C9=BshUXZJ0%rsB5f*jz zot8&_eD1*cCU2GTRKl@{k5#b5xFmmHk?v-2i!uEjYw>*L0Vr(TS5T&sb1YQC5o>Qo z%4iOaL+a>5d_8f+?=OB&({#1nevSUZ9rqBH$Ym?;ijI%DP@K;W`X!a@-^V$NzoIx^ zGk!NDlhvnq;+>Rh@yybDQ|XF*qx)zZ!_${M#U86p`r;*chQ|1f_Vcu5lvy&I7vw&Q z-?l7vRl5^-+si-h9mF$}7vy!3_rx=ks_GEWOcKvaQkf^#OXtFycwX|Insnj$WBt$v z=PP_KQ;T?>+lbcNUnR8{PcD z<1*-@7vo-JV*hW{?W%P@2}}^sR*aIKPp@0bJk9A*WpLhZpHwB-8lqy-T!hlI6*g z&hdKaQJ&lAp&4qFm9DkwlpRk!b!lO28>nym_dFJ(sR>Q>amD_>^75NN%P;ySeO2|P zB_)n-P>!B>-(g%U?w8RZHR);mF5{;ezXmSGF;ZC1&{Kt;jQE`3H|{ zjCo&9yZIYqT)g+Drm?4GRNB}Pa$Zl@BpmP4G@qtV^!4`;-zWFNrE2bX(UymVQTTqs zSC-!zj<>yPc$SVA)h~Y$z}E@aBFD%3(2KvcbREHwNeu=<5BiqTmw3ifP8Y^{z~F(%k|YRd>#Y+Un6>J>vI&BHQnAo`D{6 zI0%L18{au&P3Cwt|H~ZlPP`s;CPkh3KgRoBwXKZfGOVNV&y3CmbQaV*&15;z*mq$B zos;Qnh9id@Q>(+1s21|~q;W5(>vDBi<9LeuB+X$8j@-pvE2?J)xhyj7ecEGv>=x)O zr=vJ#m^<#XbiwgDyr+LhJCDXX!T8=d0#DqB&Ph)Xeu~iY8{90b4Ql)PfAbkjQzg7h zWs^IV?{~ap#J2#~8t8;;CSC7npdol}#!*x*4>}H>gkN9|t=Y>tC&2SCOa2pS{tkC3 zef$fZqxD@Hyff*11#Y0TEAAe=Z>05mc$e0G<``~{GHUxWl$1qH8D3+K{J781dO`;8 zszYlzd`@>gb6kcDYLGj#-lls5?q^`Jx)xB^SYMh2*BCg5uTe$E3;ZhI`}D{>dVj;w zR0hK{n3vY#csd)Oo%i@Gj^BLl3h^$jsP753S!{ul7YdcNJpk2F5+^(>`3`Z=!SVm(vh zI_^C=6j86IAl5V8L+c7CfiJG*syZJfuH{PNjqA6#c8lw^VRG=V{(jeGOS~y*i}n4# zLK}I+J8TcpIo%w$(70R917$E-t$L|_yuuDXk$s__{qgp~xs#sZILh<#pA0gBcDQn7c8Pj8-nhWJg7WVi;xWqPioiIX=IGd~&;< z&s+7~O?By2$Cqh73T2Z0qqzzG+3HXXUptry@ysiJAL}WY4s98YXI&HJ@F%@pQ#>Bu5zBQKJW1Q5`7QzdKS9T8T%3!!TWHK z*52wK>#gIuZS^(&i6gb~Q}}%sf+sz{_tEqr^u@79J-Qj&i_h0-iTlN=c#H2=kMZ*s zG~%VavDKlBTGpoJE|^Bot@>{@FF!#p$K!LbDzzNU-%hW@UZGKHx+9m*ELuj(DX~xJ z5n4{;iG4z8c}VOJ`jeK}$8!%ad*Bj3TV-DcXEr^u5ARyu3g9db_ozYKUvEY0eA#zV z+uLYcA*bPvhq$ioL(^3LKEN|V#_`!1+Ljp??}Zy=+(F~wop5{U>Y-lAaFnJi@jGV8 zQaSGMoWWCwu3K>w$FWDfhUkI#{jylIbX#$sn|OYPuV~1i-X--@+^2k2-!H+D*qfM* zr`VU+l8+a0B=#o8zQj9ex_Vz?ep&s1uZWtZ#&aVbwfRY0JKcmUt{rpXdkC(+eu`_S ztq|8vne=5P_z5cWIumbPN5wT%Tsy@*il*?mzBsNH#dwY1`i$Rq-zE3@eBLhW*e`O> zG2fET-MHVucU)gx(IdCv+bqAMFtD25g1WL?EratoC)0id-np;?y5O(Le^1DYwsL~L0L?|c}1!Ex;|L|>s&P92Ll>GjP zZ;Im}-hDYluf`g*I{I|5K7G%)){f)a#>D!I-n_+i@w;%8o@{(o;cE#@r)>)#r}WvG zwERFb^&Ozk%B$xiu#K0`cqwDf%`$zamcOIF5dA;stI@nqH+QVNY~=6%qCX4$u?Dkl z9>*sQu?F)t_1cXm)?m&x_abw5#2ITbr^_|gV^+YK4d)g)+)l?GxVu6J+?^oKt@rAO z_Bwk|O+!M47Ro|^NY?eXRO3v;6b_t~C z=_pL%>z?G!W5)ib9uMh}PtE&-@zsnU$=jE_mEvmy)RA*qb1#?eLwMWBw+C-sdCQ4E z_64=z?K9lpIA8q?jd?t7j_!JJ7YwGamaG;)0lrG{bcLtGc*{AS?}T`t!T|Wv9LMp; zciwv)JNM#yLl2$fcfC5kfNu)TBd#$YB&Yjry1$m$-S}hQ%2#sBCx>gzk(S`} zz54sG{(QKW>uw+!LE;)}1#O?fX#U5;qcpBjgTi<|frh*` zfie8x(?JY~t-Fh_zH_){vl3T6KI0vE zmDT7iSgcOB(|QlzZ$UNum*IMS_Y*v3j)ms==oUv z<6Q{5A&s1Rz(#%3SuWS{uq}gQ!PxI)^9O9<<5Bhc#<&Y|dE4K&lFk02{y)qv=6~}x zL~lP2TOpoXH{5obPHu3iVd0Poj$;#%Ua{{^^ULC*na94o~A=fqR;ICgXb${yF$B(VWa2@q9kBW8ptV9mD$MjCmf$Ur>H0A)Zx#Rt+cq zJ&@ipCW53I^iRUSU8e2*i>DyHc@98f^K3UqJmVN|ju+t`HH$r;fAVspIbxq@JhN|$ z?+JX5(z_mJs8e0JEOG8ROnV&j?eS!h?{N8Er1dUb55sfviSKwv=&EJheKfrb@6)mi z`s$cxS8sfN}o&)mRWBfYfzk^qKJX_s(952Z!Z<>F;E4-}UJGA|{cA_e0!8MMRxW779ZD+_lH;rB3V{@#f zGY3uap4E8IQJz}r1j*z-0{2I7l+JSU`vA58v_D#pg(QJ*>Cm+37O9x0jxHU(H@8BWF*-#1IDO}s08kiLn%*;i;Dtlw(k z>(8TBNa{dWL);Ij?OTu!&lH#man37)ql7%#LUoMrL#$%+GJ;q0mZ&eN5ezvleCM&EyMErD(LKGiQz;2crS|Ht_VPX9A04bJvF z_uzM!UWxrjqv$+=H!Z$=&{l5oyOwbe>TcX?=srPnHr!(&r#fGOy!;=9MTqm^|4prb z!22`3eeuS+{hRQ<@n6js=}9ol(~v#y=;+ z_-=R9-%cy3HuCELua(zB@GH-Scz#2MX&o1F|2&JHepGFCL7ZpenmVy&s*wJR^-_an zFrL<*<=gBUy3LnZKXs>L@g{SYlF1{mP}Z@AD()A>=jpZhV@+VZU$H0dzVsH9?H6hm zYkx}V)lT?7!CzNDCFODrjOPlDVLZeh`hGn8EYtU^{Byo2NcY>ce&)|F;cKp5o?@xSH|%61<9Q zin_$-d;y$Sa5c(9Z&4bG=_x!v;!_Pai_%-??XBQqwt-eGX<`TxZ>UD@lK?(&_j)S%d`l+>G1EuyCt2^16teT zT#B=%3_3sqIb@?b1I+`}EAG912<^g{PF?JK(N7O2wLEQ+?;@_iY zHT7@oJ^4Vc*W+tlT+P(xM!t`zOKsjCgGXtuM{iGD^J$IGjrz34{qs3=7S>BoLN&)# zU0UOsy$k=T>D;4U+am}5<2`}D3$7#dG>hf^p$ZJr2W5&K-$;ybFrC zX6N@e{IP#G_Uukji`cLGw7lMdx%^$>>jJ*WJ)VE&=Ibuw+LU!pr{^7LZ2U^Tw#(*T z<9_064qY$6L3+*@pV`>Uv^1t6_IgxNyVxT%(b(VkiF52c`82{)Og@uo>5lIXdLD+9 zv<&7mhuX#cv<><$-bFux=Xei&?D2aXXC8TXc5Jjz$FmUEM{%zw_GnDyaTlOZx|X)~ zGM@^0(&%GcEoqJQ8Ykcj*_Gk-FjV5V7|yrV;Rbb#XG-yXtqI*?Ncs=1>*;w^?e0+j zvBvk}w+_E|z>~6nn7*2PCl#gz>d^W;t#9a!l1N5Wavb5@0!N_~z0axf0N&%hOtBVn z4V2)&a~3(9qb7|%n0#mc#VCEIHB#`z)63!U`VQ~D{^Ar-^fM-M#+O|$uY zgL(LO=k!^EKZ^{WhmPvk67M*?ci=k@oADi_dyP89HFJNS=g`?*j_<+4ax8|gFP?UE zeoN<9#ngrG<+Sah?VKLEMNf9;b%K6>0mskKhrS|uGtQ~KX^HP$PsI5IUiI1ki~Q>0 znuF^Y&+)#V{IZWV_8*x0jGUJ1-JEhMqR-aB1%Kbf-_Pe^jJ}vuLH*4C0^BX{HRjEq z%(*(b|8D;HU5){It{T30PuDyzrc2DEa zA^#VlNNBGuOBlt&*)(e89C2I*MQN^#^8>invC^F8*iW!Xj`6P7bA@@5#1!qdA5TkbjR9_bTa8pb3AX#nA!O-i)+#Ba-q8mo&!(@*9<-K7@pZUZsGSNJvof6 zoWZfl=Orjg*Df4y(l&vnI4|y^XEML>JC^ZV123uDV7fkp*LZ&m-h;Bd-wm(vAJ-=L z(--T*V@+4A=c-HJw`vvZxn|J#kvXoXb3gy_j3w4}jm2M3tzuo*R6Mb!>-L(?Eqd@n z8T!+t1@hYnpVHmMzgX(;Gw`;@xuvnczo&xFKiS_zLpP|Z&fATDjpu^&JceTi-?ycZ zHH^dcwpur)sd-kPpETX27K7BcKpCF{IOCeJuH05Y+|P{l%kdtXc|82$?=Qm|d4EXH z5jA{FW+~-$mY+vuANLRn(fJ^qNjOLFRuN}cTt{dujc>kV^%j|Jr7_l-Z<1M79^<)T z?7!)r)BneLO#ZR&I`(+{2A|<;#`FF9V*tc+?ay$Ikym|Oq$IV|A1PBClTnY!|0R4A zWqz8^YX0C9eHURPjRSC2pszRN!5hzJn&W(e)@FG7Kvvu(V1`Ud`k!~&tux1=wCa!l z92}HOOS)f@%K?b{@9XF!->Del7+IzV67JE>r2fO)mex-zX@rW^rHhNA-$5XxH(7AKmHAu>uC*d`eHG z#uwKB)%cw*+rBcbukIfjAMd9=tyWjxj~?uJ*{}9-KY9bL4P+Phq0bomh_M?g;p1}z zpK(vRC7z1BF6MI!?BFvk9s6)3Q}g(2F3WGMD~f#&^Br%y)j!tvU4)TzHPVx>s&@gp zve$IqOl=>-HGr=X8C(M-W(JWI$+M`F+JuXx(XJ@&C2hx?6B?A@(N(`H#$F!oV7|G-N!I^tPa ztP_rVQ#aD{4n*FYXz8dg;`ZCo!n zV{BIa^cifYE7tGahiev|Q8gUne8%&!ezYZ?&Bb%MxVAdN<2kjfKvO)Q8$eSQKI8dZ z0dus0#51~awC#k$5YK<(nZ=}f&O3ZJ!v8dsGDl+X#Y4Qu{)^aq5&JG$smn!vQ^@k) z`!C)zPwc_?6QYM=FGlRah`m*#^-Vly?SuOS#C@Aq`Y?km|NY#x4emVpCh^?09KHu- zG2SuJg}%7|^;Igzern&xa4eST?X*2Ahm-stSC{8-9MUs6WiUa$!({roKK@INJ=CQh z&o9z6AJ<5_*76z8+~WD&3aH9&37n(l`Z~VsJjeTvM&MebM)3~K_w?{(Ii|+fn#Wih zdI4wrR$x1vJ?I+&bsZ-QaK?Vb_?^H_Jin>_ne+H3?)a^u#P0>h_ndD07Bo+st4`u; zuQpfk-H+pTy|bOJc!uzdI=44=5T9|KHp;jWa(@Me@f!C?*URlZo?B^)y(RhZG=n?n znxe;>{7t>Rfzb}j(VQg#t_o~c_(y^7VH~sCbOwQxHd`8P(il?6XMeaY-5#RN{(Fd#XO$uN5ra@P=JO~A|(+pkkJ|(L^ za{CNWgJI?iOz=3eP?JLT3wIQ75BF%;CUIY!E+6L>+zh1-(jQvy*9tkcsKwB z=)IrTc-HYOz81232xt0A`jr2o^q;EcI$eFAfae@9t>|wji>GCHtqkM-dM>s9nfWW~9czs~g^~QWz}r8SYg+n-;?9is2lz8~zw?+a^ix90V8h;_EHk2Dv5*E$cJhYM=kpbT9+ zzQf;NHO$B3oI3Ky_mW4@s~Voh zF;hlLu&ng6BNbqCoRYMNlwolun*$hhFRc4B}b)XAsYj?$<~4_&EgSasGg7F+B(IB{`o&4?Kmd7oIz4+O1}_)A`&mKF%p; zWfkX?nsSPBN}NyP9Fh%RoI~RLaY62J{-`JW25S18{70$lJ$M`Oyi7gw&=~z*US7lS zoNzvwox?d3+TdG~NB!vi2};SLmn`D@?nrelM{io(b@47z*K2W)hUl9f^6aE0Yw*XO zy?6MJ`~I6@qWZ-B|MKQrt%rVBlN|Dx4Hso`2>;xo&I#stfsfdC)Zbk7cvxqydFEPA z|BrA)Ts349_YabpW20Ox-HC(!CY{m(mrI_ufL zpuIeI!yK8!z1e+v{BQc>x0z!ddA#GZ7QJQg_ojCQoWULM28zB-lIsbWs(-WUgQB>) zr&nt^e<+uql*5^_hGUt|&T94ql*Qkc<^}K#={L%EEX@`8 zj&-ta&6C$XU6@MkimKaB`XM{rllUJ;?<8Xf8e30x zhhQbYxoNA(Z&~@py8$jk3f{BQS`e1P>w12N8f~Zd7M#D}?168c-j4I|Qrbq+Hc7AE zjz8A!d<_4gFYXt{egC-TehBwSMUMAN~8OYzR7c;8Y*bG%OH`*Iy5*I0Xa_4V*ubmpM( zUVL#adq9(8Dw)YYVOLi7 zW9eO$M=j(qN(Sp>@EHE5V6;6 z=_w$uSTEg;hItU{qz~|y2}i7P%4%!_SjNls#>X1zCu`5p`d@EylDT;?Mn-na364jzp!P2*U{dc5 z@{R|+F`$67U_f0Y7ox{+u}M+%Qo}hAfr;a7Re|jFGJO_r0nlE zW|ev4-4EIQeVkVwmvL|UuYT`Cyz`+DJW9h^%u@8{7Ua2 zTE~|1IVpqd)uAuMJ1z&)S%HR|czoU1-o~uuF|H$a88@HLsj~Z)$F6E$mA7x85giL) zDSzKVJ~b$;uU_P%Hyy=!`B4os;c5|c!@k1$Lcg!kQ+FEs28=ScjZEf2yi>db4e!ah zgmKryL-fB21r&@GM$N(4m#VxT>9q9<2Ci@h%cT;=2F8$ zGAQHxFa;k>|L#{4w9LhI2ek z%W)pUS&+7^P!Z=woU!M-760$jI47BT@qOu>z8`AQdJ;O)_aRI);S9We`Hs(&`yt*{ zbRGT!5Nq20#4`{_30{At>EG93JJmj}#Xg3(9y`zPeQF=qWbe`y*JKUK`y5j1(dt`S zedAhe5Iyluz?~4+@0oF*&ERu`=j(X>1~ND%Cg6{~dBvSqF3=k92aNZr#ybMzJ*r*t zpTJ*2j`5u#6YfUz#=Y~cuwCz5ecyZz&nIv#!Zilhzwe#Lee>9_*Bo!+zWE<@oby<^ zPM(Eve+}P3{5Io#wBMiJbu+wA^K89zMD0tc*+AHDo=dcTtZpC3B-WOFO#JZPieD9ZGV%ka=uH)kR zEkDka&{AG;9T(SdiR-qsc%!G|+#Ks5WBf&k>$fi<2d;(c(UJGR-*?7qUs@~Cc$~&T zxQ;^XBa8J>jnrWSeSM1iJ^&jajSQYqn{)7`Vw0A1JeB7r^qu1U7QWN}*K>Stt&8Ip z9Ig0!10GbLZ`J02x=iOc_7KH0lC?DLQ`erxyaGk#-b!tI$Sr=8W(4$+T~qU>H@=l| zpYv4T*adobiuw&O_k81GziUoe=QH&{yL|tBh_i+u>d+`o}F7oS_+7sWltZfX_xwc?)E_juFu zdG&p*GjjVd`#<-$QmR9&8IEV{Ppd)P?~3o@aeNG<`-=JEURNq}CGL0Sr$6p_wUI|$ zlf0e5byg?8PU;CVxzR*rhmcekX*Gvg0HIle2xK;sucbA2(5rcZIjJAI$vJMOQ)imM8aSoiiC&y{7lp3iv3euAbX zwMwjcD=)ik5Nq8&kl#;w^c+ncc#5@dcPBSDz9BMdrp|HvzX&(!(;d9T8uD-9w0z>e zcrP`rK}Tcbi_)^Vu3k0eH$0~2E%qKwq^S`tv0o$Zug}1h*rO4@#SowGQ~12Be{%44 z66(_UT1Dr5K4Y)OY+S?m8Vj8>_)Lak8T~z<|Dp9G8f)P0Dff8CQ$re8;A>J$hI*$8 zzr%5L=Ql6E`5+mM@g1lPu0P=juDH)Wg3frp@B!RT>o1Ua@7pW1R>N5X`pBS%dK50F z2DHA8|ET`BL52m?HaV?-K{h(e>yhMoWNu#l#PdeljvEu#2y1AH^~g^cn@(Om%wH;- z&vx_I6z2Ev9bYTVeOgX08hfggn(#Eq_)pbwgBpxegHK?n8g!*Mhg~<}c4* zM%+#CeND$gzFv{lv$86szvB0TPOE2ITrFjOgM517`4dkqJYVV2YjNBStMJsN@m?B> z!A|(i`6j`lNR~Bad3fH-kLJZlLEiG^Jq_FSLadK?9O8as{KmjnMO{bg zg%q@X2(`?SP9H4h`D@wl-D4eOlV29JRmRm3u2YY<`1@Gyo%m@k>;3xvRvHSZ-!-}P0z7KWlMwG>NGX@U zAXO39g?c0QnAVc@UlpB`X!(Ygo9pOZTJC^_Fi0Kmr>hCiZOw5Vui4DA2XZ+cZqDa# zaIK*yo*&#TubOy&l36W2x@l z&a&z*r|z^3gE!Q%8?Kq~v3l&o^&zebp@pw@#wT|?4u<)>9fDW~a*KK%)nkij+69ST zYw!51F2CrvUNXG8=hn+{7;VvO1NrO4U$uYrS)38PJn_e}J>DdOjns;}C1E-pBVjq~Z5g z_2`cCAp8{n#Jx}*ZkIuP-_9w&YjM?rSQoodj^*SRzl}T`Uc%p#_v3Jc_TM3;dD_!H zJFoe0w!`%Y#IwcS^xaj-yto#_HhFz1uSPuoVB9JCPV)Yl@#Se8PT!w=--IWv3_swx zMoF4+<>L7%*sV6rc`iX~arNm;>i}56|020Iq_>9t8AR_Q+?n-c=A3E-znWuL9J}VI zA=4T1%!2Qv-kVv?IVPo^|HUE?!!#Tvre=BW#ry+T&Xqw~8mF0Whz!Ql`L;QqlEt(1 zHZu2D@|dBgX5-G0T@BN`I#$*D<4yd$S3uhSqczmKcIXON$_ z9ysFt&*xciQ49uV>6gW%WF^y&uKa4mD{8A{8m-}dB;)UO1q4r^#jo#QlSKPLr3PxKDJmW8nel4?oK#-g7aE zh9<_x`voiE*r{JhO?uhbk7T>u*ppe*H>>Mxb9OPdgnV1`v<+&R|0Xp$2Jvj=7np-@ z0Y63gSxwVgT)X($imw?D(|Gs-XRI$A%}eZ${!)#O8~dt$dKX5i^G9->Zu}*hp5ZIr z_cIem>`97i$ZP3|dn-TYpTrt2VGqoeoeN^Smo)TTGCRnXBN#kz$(v}EQf z))l;s^CZMR(lYw5iJZ>iJ%cZvv9^)T82+}va-QOSar@|sYx2cqT!+gg7e8fTuY5kE zFYb}WefPLO)_|6{KNk1HCi8cQx6(4+uikM#Eb-go(f@HTY#)vjviX9?jrup8j9T(l zNJeFG-3}>uTL$ktF6Pk`nJvMYUl4D=THHtY?N-#^)A}pK{edeG-#=rI-b$VyFwX!U zQ>S&DK~>zJK-}L>jX!aZ`!BUk+~bb>+h?J$EYsrsj_bPB3eMnqzAoRqe?;GdJdcMd zd{?IJYeks1#8UMB{f8)2h^GI6RH8g$zZ?U&-mHgs8VYkr|`^;M9(t8kV z@1Ah%#P_Sv)U7zp>hi7rSz4YZT2iR-;aZN>BpPHloWB#iRp)IIO|kcSto)PH(?eEI z$!R%Fx$#V(X%0~^ zD5mF1K_7Z=l95=D*yruWT0n)i^Kf(H?5~C%vQjJx_CG`Nj9F z`26li`xO`^yLfltD!LosJVf(7IQy#6M|3w-qnR*3&rGAgwc1XC<>raCKkM?kX5^)) zc{V$K<60{n&9P>u60R@t#Ix{t|Ha4texNKD(D!07eNvJ~_|CY)w6v`tN8@ThGc`E^ zu_oXJ9LIQk2G8d(1y?UU6Kmv`ng32+;~H>9^q5}BNlSdce-7T~w;cY*@TaMwCtxT3 zCVFRNk{-j~8{!>P@!jbW^_qvjrYvLsV3+KUaY(#lDue9){f?=``=$J+q=M?c4AS6i zte2Y7K2?s7%4`Mil^wIQ)S@kIpVL;upmy|irRzn=Pg^qQlM!ligL>@6RSwq>*aFFD z+>7rQd0eD(x0+fg8w-FZ2I#v^@w{2`J-Q;3Z8*@zB0arUXL{{ zx6rj#9pgULWHmWS*U-pKO;$xO()Ju4|2Zk2jOLravs%=_5uX_caK!HreG4h*D6SU6 z`Fx6oI>t}n=^WhaToh|Po}%GQ9J9t}QOjhG*LX+zmyl9_d;;tFIEiCPG2{4|>9{|~ z&s<*0*Ky4!pPf)XnPUuR>>)_JKV&+MQ`B%K#Ji^By&)gUrjXv~3W;}y#B+t)=oloA zA@Ck_;_Y=<#9t%&GRipi)yKW#qs~z;(e@`462=%@Q{V&MuJG2Eo^$5DStf&_DQ}5& zNU>&psEp$`P-9I}>|HEv>{uTEueC|BCh0Mn8sW*IhZ^H3ZR{5L9*}K2naqY2{_YwY zVr@oc_y9hk<<)w|8NW`?wB{uRP51DVMJ_4ybxFCeR{J9SoPzE=t);0CP1lxCk4o;3 zsr^v3e-?`Kco7yQ$wBUMKeiOaTDQ3WnH=Y6IejjtD!2#Wjy*#wVPSFSB%HI#>M6XP z@K&bzOa~!tnXtnsk>fJynC#q>__Xlmgyaf zYMh$i&HR4O=X848(00J_9MA6J9b@rsvDjM?^{XfE#c&EoW#cy*f4A|o^~fPLco0vn z9K1p?n&;7bkNkg>RWh9M`||Nw^#|Sk=pF>msKW*#cLUph-&@>iuCz3kR*!hz@v^xR z&pXb_wUb=pc}J`jOFZvr5;ZYb8v6gQ=N-fO+04)F=E-i3_-+=@MB_UB>UVmVk##59 zr{d~W-Z@VH#h$=^bPt4hxA#&!g>ht(?Jw%S4NqzQ&&x3Oa^}V{)A%J&L9IS8evUEE ztIK?KX+=W?wa#MfJeh8y7t?byXo&riasO^`8P`r_9XsZaJ(HDbh<%d} zsCVq0{25Q2leVhGkI+t-2eSCCkyQ=xE|bsixb9MmxTb#s-Yeyp!5O}`NBNBVv)AK`>xE);u9jKcm;J@DdWPR0Q>!1I zg8F4BZI9upm)W^k4aeh&XBJ1{n*8bkalTCEoE6Xg4#L;`H^w`I*10&R(pXsTaW8Ns z?k4HviTg$9LE8w~Rl!llao3u@JaTMm>=wEf()B#QHRN{_zhA*2h+d25Yl%LK_dG<8 zMSn$a{a-!Rn~sih+Dglm^z_JQvOc&ahrFSe`PV=JK95M<#8~Z)3D?Hq-XAZ(Kd{gCjI5Nc33*s63 zJ@VYdM@qdt0G{F@H@-bQj7w4r{WBcrlTZ_H_B75p5buasYK|_nH7f3VtsH*Pdozqp zXY8H+{u5c=WXxs$UX$tbJjQy(D%ohEsV7avd0eSB@ja#(Uw@TzUZW?T3#7!i5wgiK zr+#UzUv|s!F`B-{TM6%28rI|30KdX9eRzzfQEIh8R(aHAtFasE{!@cTXo@}_tw-h= z{{T(5W&GcMj_)!X^vu;g9cvR#D2E(>hKfP#(AAO{8iog4(FHpqrLOX0Z2yM5%stLtNBl^ zCh=R*bKplhr{i4;abLByKKVqBv7SDD&m}Le$@y zg^|1US>l>^AB}O{8`r$6XuJBlcOlQ8%dZE%cz5}9x?X}m)iss#!3%1elkX|ToV$6R zO;=|*HpF=u=hJk>nxdh2R?01xI&8)jdqR)kE28JVfJ3;p<4K|Ks;g@T`hLK%PX2cq z8~f;Afc!Wv$o^V+#XjWrw0vTGTKU)Ibt{hd==fGPdwA($uHyc_hAe*bxAB}W?g3Ob zrjI%A_xJIP2dm%pC&KO(3{HNhIV_O?L(%cfc|FLx+&_CCI|M=~__bhvl>=oIC7P693*%Xo_4SQvzA|oMXCLxLjDj_?gp@>Kt zRw*<8+oP`c`8(h9yUw|v>$>uJ-k-!JPckJIr!qt@Tq7JLRP=>3`(572s?7d83tzx$12uW{@%j=G(WEA|?X!4vz9V;$5R!kR)? zoXHg5rgg=8nuiy}TU?ID(z=Ge)nXi4%zX+^8#;T@Gh5qOf0&P7F-JO#j<0!jlsDI} zKg`6N#2UnZTBzT9*Z$20pk+TNfom3qAa9)O{)t=RkaH=hdg zshT(&>8HM2=EPq`9=hqHlzhHGZwY<8&Zjnb-{Vy>oOQ!1yv1pab=-UL?ZEdTzl!46 z03~tUA?B^LRpj->biS|Xim|};{yxSpH^KoL>W0@mi+fLr;;tL`Ufd06`Gk&3V(sO6 zn1o{w4Kapzi}*UxQdvxwp${FAvjx0*j#t}gXsWJG%71Th4440Wc&^sqA+B@D`A64E z$Sl4dIDf*|LTnGJgYEJ$2=5v>$xClMQzp^(xEN>gY9xJ~^;MO=BjQ}6#_rb7Vg2l^ zrk>?^p*{v@61(~uhkKPHd>MIu0e;}!SBs^AJY=^7|ZmXN1Mvp^wM9| zO1y*JFj5>b2K+wl-}2=?{T_g3IQGM4`AeKPu!HVJe3^r1Af6wfiS`fj;9Fkbr~jCf zNlrt|KTgBfI+ef0u?xQ7OIN-;M^jDp)Qs1$Cn>v{IKk(^c$3QGM|8Er8EaLK;VsCU z&T?2AZ*QE1#a4$W_rMewhPw}cHsjwVpLg=8wRmG(BGzZLgjh$r4S#B$&4VI*i!&F# zgI4%ilw=pYgg?fqpyH^tamI#<}S;>1{}FY5lIzXRI~&8)C0T5B;Xqb~U~G)ZrZM zOD9wF`kg8MI8We^_%ri#jQD3kcf7-K#_vHL;bEK~@HD=k=;@1dc{#f9K8d#^zBoT% zu>6d{cLOgDLF}Q;g>yHZ@2ackT_4?DYwyw6ogYQCk2&OdG{x^OhnBBsiTRVx+V1B? z4?1GqQDV*{F<%n%BvZ8SsC}&2pRKN^YZLDoN9cY;e~I^vxTYJZ;ez5QD2|_t|NrkA zb+oT67oVxIlsugwhM#f88p@>n8N`dn)a>i<5gq5mP(TcGU|t^Y$!cQ^{3E7VAKOP? zck1IGUcE`&+pgq zyu|Z7;w_+dC(v~Y9>mjB?jM3v+Ag4JCN1aO$GhwQ10Gk`F7^fwRyULRe6%_ZV*QSm zYB*wV$eXZ$=jG+;7hJv7-mT*N2u{LqaSg>ew2*5UVh+4BT}|-kR|k#Mz=*2uovx{S z#Q7-xrntw*WqcQwmybRC+fL)-YIGB?wu>$5^N5(LXx|g!Te>P;7vvzuHe+AIKslWt zr{m?JF|M1Uj^GCzaTZdHZ{7G$Xiu$-HS61e;%XdPe_b2C&rjtitGAu=5O&=5Ze-Y zdjd~ld^yIJcZ=<~+RB4-2^7S4{XT=l9)s9l5ckBR^i`m*0DXzQ1!?57DBeo+rIXJl zkd^nH2fYJXXOzo>(2`rNI3J?$&y;Js@ke%E=6_VInNPx}I5uc_g~uvZ*0 zN3DGR-G>(MaDVuJmeH{TE~>p_I8M@DijFU7Xe8f1Kn`(a7e`#@cd7rya9JFgaJ(E^ zv@JnLtPdC@j@_k=P3toy{X^;RQcb6F`GNi`@o^|DfUEvshSbYVbTTgCM?Eq99TRyCeP9nL7jYq^R!xSseMZ`xG@b9}bjfpje@g5y( z3}by^yiX6wBX<1pE*)zN<2^do7RI{5>(>%qzo#uL-oI$vrWWHoxX0w7Ki)HV-;;~f z?k$J$m&N=4+TRxY+N#Sw=tIA6`sYn0=D2=M`v5!?uKdn&05I4 zMPA|=T#nBu!ffAuDdp3jP(IW;TD`l@Wp)0DgJGxYbCya|}a}(h){=I{%KCVeP>dC|AV&3ITc+Sd2oUObK7FD5*Uq#f? z%Qg5b$1&eshQ^rl?kXq$JKue~cw?Tsq?p&M>+)*oGv3w4zX0~Q_uR|BnD@?vKjyxV zga4Fd5xr0G;a5nkTZwaS;v4&BF;B-E^PRC)CC*KY^(h_29&1!$ZAw=$e}bnKp5pXP zfmpX#i=Pc(7aWD0a?@F@)DizVl7K6?L=|N1(dfgR7I;oDcWOeeAh7EH4@OdM||Lm|u^%^>1kI zB`=A2^*ddYv35Picw%n-7deXg_1}t$N1i%}{eS1zhvJMm_BZ%Y0q1$~|1S3K^6`~C z&!uUU98AYix0w4Oj_zXKLT8N6=BMXT?FY~ldmj?#cg>TB*kcrDcpc%{1b_cFkK*jE z_-^_VCQIJ0`hUIVe>GEtPk%&gYNLzxg~b#5#KwtbKiouDo7`fET+s9YO_^!hihCsP zdHjDA|Jyio;p`=zM|ttMc6ZP)9C~ZlmKR;bQBxfKwaX-DbLd$@PYroHDQ|c3qlfm- zr|@2t%5@{QR=i0`$0YS}2y*Z!K4SXf9ZkzpxCwU#xf`cm@1x@%Ix4vj`~!t>9g_cF zpaIStQLi}Hs?}J#y95f0FAd)3SH(`|H;C0`s4SWQ_?*ef2@O!Z<5@!H^be>wGr#NV?1z`e)_vk zKIG~8YIMU;U1XP|YrLr}p8Wdh0I{}WHJn#}>%^0U?_bDM{C0dY{B7{}DgNK{YXRM7 z_>!95Zy~;&tEQ7T`bufvO#3=CehIC$Jy}fs$?Z(|m4+jHZLR-yP*dNf`Iu3?r1$r6 z2GMx_O;)?H7BTkAjiuv|I1ckH)>Oxyk~Z@FER4qYCB9hymw~3)e2l#fRm9i~cU9L{ z?5EjAV^V#rf~ovm0^iX3rv8pX>~R=RXO{}b_~cNRyS*}O#woaN&%J|2TOTO&Ci3&ZtiYs9|N zI9H<|j@VZ^h_2M)jrZ2rPkNGf57zcvplKM6(@>1IX6hwBFJsK7D2*|<9A_OpE$)Rd zN8C%~J;rKdP0q&BYFrIm#lJ_)ZE5SGevd+&pHKtmael@a&KCKJHIz@ma`Aqyo+`Ko zXFxGr@vM89uDo=SmE>{lnrb&vyZ51se8f2RbnX9uVK^S6=LUKz<9HPgKn2<|ioFJu z$D2yt|ArX1tp^=w9$m%rqne!a;t@Vh*Wqj!rO(Y7wUO`K@P*i8&H96KbVR;mKj$Ct zx_)B)>t=ZxfIF|cius;=mFWuLUyVQBoz6jJ+*5h+8~!T%?G3Mpr>1(nq>qPq@v>N+ z!}Ao4i(sw1<>zUvLw+7#xvD%-2XFKBO+1z9T*a5{c*@b*jwd4_-fd45(l>3Fiqlp? zzTs}1i(wMp?ZK_Cn$voe=f~XZim3m~bPmSfnD1vZ@IW1GfbV&oMBS&wTbstu)Y4bl zpVM}Le7!5431WH0-)^C0933z6Co}&))92s{_{H&v80zsQGvB*uds@G3)b)J0RToR3 z4IOu>pH{RCrzN#m=R+^?#$jnwVF1r!jag;7TJSBozIxKOO3XJ`RByD65?d{ORn}J; zO=rT3auMf#mlNAF_~Ndx4dc`EcrMUA64%SgXy?sfo}bYF z0By3Xiyjbj47Y1vLHm*JHv{-I8s@n+vS?pktY>P=367Ft{6T!Tr>2pX#^Q;wxZUtD zJu#NQ5spC#u?@jl8s`U)j;`wPCfvl^+@RY9#(gK<=`$n<@xs&G{-jthU45!<6pRv%1x@M8~BjEnA`n}7Y%S7=4%}_lnH07 zL5tta{6zdYady`JHz==`lF4x!^^{AzpV8GG7psz_NbXq&Bk?uD*9M<&F*Z^{9%2n%jD)n<6g&~`2DZkyl=_-$HW)4QI$v6@SdkF8(p8``~iyMjPIG1yjiLy zUgFC>=p(+@;X~+6TYh{uLH?>yhD{EEFYn|L4d zd@;Wl^Lm-+j5DDV^LsJ3cc8p`jJRV??=7)E==!}=oh0V>YT|E+Vl>T3>Aa|L;+Yob zdByqb@mmC~#haAQkBjlvbrx$-=0bKJ^rw3(y_NAVuF5N1&*Pd8JK-rhKZ6*{9mU(& zLq3GoJNSCLei|2Yjp9#_y9BN{PyA*1P0z=S@)GM~j^pWz;~%j$!?6=bOV`8zJToBX zj^f*WgxZ+`57C_w=lwXF(OX~K7oeBeW53#17))ndeI&-5PpP3*d`%;O7;_%Si|fao zzkiOV?DRZG!wecmi7WQ}r-d|Pn<1vs>f;@K#-9HnwLA;qg8p;r zzqa@?h;5Br{sL>nS4C`x#I*z8X?%6mO6<+rCKugsb`;y4{N9Z7fogoj8}F;d3F-E_Iwjr6- z5zaVwG3GqF;mqzjh`GWBc+${P2uE%@8sfPf$7wjH{b;om=d#4O?ohZ{oEvea6=%E) zJwfNoumFDLS5h<6g+Jb3TIRZaVK+Fs#J)Xpe6Vm@y=ulKutJ}u!HRmQc+ zmsn5PSMK&`zmi9%pn$mI-V@hhdojhl<0$uznfi|TwU_n(O>sHFGgB>mkLyx-V?6SA z0^ejDABk_Rc#hMO8OJ+t3|fojy*%;pq%V;oF8QE1s?u)f0@VB>!?4C zhxq#Qs~BxlpgjH$@c#{s`P2$hXLF6vc?FuN?NWGa zdu^Ahtqt<^88ojXHtj3L^`oxt!SjNCa;#zbE@<6N2kc-r8J^JL;InY-0;JNg^clt1w|$FmzpVjQU|58sCvOWIFcVl3(U zair1sD)BPLllI~}fbUVc*+yd>yccjTiW;IX?kE4?pOwz_E7x&9*$xLF?klhHChjfe z`4RV*T6D)fCLQf@pJ@+?d(BLf8Q8SB|%Zn80rF)#T;$^XVV+TQfvoa8HV zf0pKw_+dIhHBke{ zdE0~5oVgguZNZ=A8WlD_(CwQPCb!4kZ0;`?{K zEUoc<73aEafM02jGv;pajQN%igXL=gt~eKNBYktlxsH#wYTp4K7xUe9^egY#_!sLC z+KM-mnw$+WZ&z5I-w!c{HcY+87~0=z>s`FDKKW7!&nNkb`MV$K%p~Roa`Q2K12@qa z^U*KT6!Y8hUJ&munRuH8VtnpHydTPW%tNQ7YaU%0T#wbXjXCMN#I=h@*?8XxD$!Cz z{{z(C+r0llfCaSOg@1}%^yYhvZ|uN#o`weEiZet1 z!WU}`j%t@nn}R%Fr;aykcONZrX6REq`+#R#cwSv>FKE93@@W4L#BV5l8Q#zp`;*qt z6la*kevOz%LG|zZ%64r>@Z!r%|2=0L^K~N3CtpW}Q{CeF!g)Vm-WJy|Uf)X7SYFrU^$@sCY$Ijmde?|Nb)oS$F)rYJPux%8en4!gi>f=wj=vtX7i&+5nBUUR-g0V`Z$)aW z1Gq=+|Dg`P$DLHI<&@VrcRJ=G+wm-M?(})wm9&pJkGOua(idw8-=#6Wc^1P!K8~dK zJLt;GNp$~+w;jINlTtpPzi}OXEhqc=Fh@RW&^jMR(7F}+s+F5*Jf)A@=v)U)^pQ9t z`zpWF;EppG;;ih@9^bgX^W-Di59iiDzHz)QC0E-wvF}1csgm{6RPoiAUp$&wY>^w#WPFY z&QiCV#I=dGaePm~ldimovm>|RjWdew5mTHK*_?)*G{kw4EBSIBe&)?J@wKAkQ+#o5 zWPi0c5#s%-7>wt2D&C$HcX=9b=Wo1Ey&%R|Q!^9yYdkAKU%X?Tah=3_)(+ec(b*Gs z;$7=zdZ*C&2mjCDjPL9IVo!Wq&%W9JKkvzr&NbDpN1Uak$&FN&lI|Ixz_veX)nYX$gyrCjqCa+ytQ%uOyfGf z4B*R3yvy(%!&fPdf5(xB&ZK$eC!hbV{Z6qbrSCGt8C_k)d=O5HIp*Q&;fiy*4$_t$ z*NxBzTH?EhzBqd##)MuMdz?EFXHL9GTS44eX!{ZWgYq~HckD%rIpb_}#+eg$@?#UOJAI=oH!r(99{Xv-MF-G5_}Qsn(z&08=TkFP)~YF(X$s$s{M9y za03r};u`_I#r+yT%Zj@Y?!NGk*gNB{DEAN3{UrWar?gD|OYkzAcpLI_DE?UYxR~be zpcCCOc0MAbd_!U#WUPVg6m^6v)_cPxcKY@EVou4;dA`0wXY7$Ffuo|nJ80iUyW~83PMg_cn<%y(;@U2+@lJJ%Hs8>a zQ@iH$w2{+IupJuG_G%?HM_=5(bMkXFY~*P-eN>a<({NX6In&=_TF2|JGL4nxr<=ZR z#s9i^+sn=0yvu}lBP^@v{*H4TzIYb267OU+xEu1(JssCBNX5IW;*LG`y~Wsy?_X-W zg|7bEPlJAPod-_^7*vhF^0EYeuW1ZS?hDlc8q?~d7%%ogetvAhSx$b7;@!iG!E{#O z!`Jl1dr7<#CeFz2sh>3XAAklpzm%_7m;D3I8^j*-O^Latm}iPPrfRsKfS7Aa%rnIt zQ_L-`lk2nEkD_Zg6u=YX1o5uABb#>y^>_l}4A(fjwV$|emyb9Ha38-?rN9l(z({Rl z-`NWI6B2vR3g9W1LoVnUExwv!I}deByEgfErQ2uP=tW1I?-XZkJSvv2wGzdCu3-oJnc#T@JIs)_SExIs-_6l+p?^Xa=16qASVXn#t-b@ls&K6mTy4gGup z@gBU8mmlN0TU}g$7<(Nr?o!&um}{I-bRUk!G{=~0jI~y$FUDKHv36E#qv1xmeFb`p zb2aRT7`Hx*uZ4WvQBr*JI0au5UKXGy#`XKl=MdiQ(Ke;nZjzhR@Rs%?d9@Jwx^7m; zS1&rN^QaG0kmu8QWAD=g^j-hE0EOs^J*#mqd!KK^@ZQd|Gd#O~-|7IqCHAi7#kU(@ z6Z+!Yr`iAI`rJ+Qi@BNlsVL?Kw7v@;Lsk96`urOBr=_C-;*7=)8NK(=-9vuwpt)Y$ zo8|X0o_G#&*$GmbPv@91ke2sV+zvXeXpZmj9rBeIf9zR2!iU(econwLeFD!xJn@^A&(rg5O3yEC zWA8)UKWFnS&P~Y8`yFr%7SYp;o-2I2ejmgwe2aY$$;8OEe}DV@W}N3!sa2Ya(lZw4 zU^>$9ZZQ;-ha_}lz}FmK%wNYjE{kzofz_GZlwBgCC>T4=Zf4Ux0MlSik2Y#X} z7oMuH09Wi|UkAJ8qo?>L$;V?=JV(Tt9&c$m=to-twbCA9E@nSuqp<*ejpgB9Io_+k z=k#+9TI=IZIr)R;&ia|GpZnF}I^40(W)R*BIJ)!hFvR|!LvR6NoyiSy5bshW;Aws2 zk&BryB(G~y47K>$5BJkF?}IITI48fcH)gLoIRtU;%3NOV!k-`CRM*LIIX{hZ||`FF%)P?#j3Ikof(U_i2p1lYh(k$NVc>$Gf1| zYw_@99;U|^?!ER_*t*Cdu2I&Ko%O)?jYVwe3Mmj73j}1LB;dURu<2&!TOVSmS%>3)o6qd=r(S zE%8m1_#SE{FF(p}d^YP}3>vPCYXY6^ctfu4pueR%DImEp54RoI7VR8JE;4F`(;rW=JRN}k~ zzEUUkX_f`IJ>oAkHc2AZJ~nZ4Pw==ft{R9{P#*9(9mCwcn-tvrhVxt+##VlAE0 z{T8O;k9YMZVo!=c_5d!!9q&}l=zI%?@~}6~FL6GuHsYN<_L9c=FY!Odc z=AXsUfqwSFWzTA<=qeR8E3bxpzSeQ`lfL&R$q($ug2n>qo}hO zmp_gtoqCI!yC~ko8AmvsI+@tMh>S~Xe zp4V=l+IUr5FR812blt+M`GSkRvaivW*dzNbJ(=Y5O{j@C&O=S?m(9haB|MM)vOnO8 z{jyncO^4RF{(?EYiZ$r7`87+di^Z53S3`b{;#D`=8sR*~_qX`f3+ExZY)b12xW>0} zY9|BkM)+>WH7vZM>m@vG)o2fok6^&^gwMdS}|!!rxY(%2R@;e1qH`@wKE@-^;WcxR~T zO*K6~@t2U3HjrDarR60D?#A#c{sDAW%j-}^wUtB!Yqcn>(B{j1u4uk9g-xrzAA zrq%NBkUX@L<2>S;F9*f-|2ZU6+r_K7PF!dCT_=x20d>4VKPz}rPG1+beM=wrYTr=~ zpMXJPDuHJ|e;(EMB{+#Iy*y@t8{p++{<|1D^CcM_@ohE=@B4V4!8H@duRM-1l7mo# zA6xi)4SwTsIo`zHj<{}H&~zh@@4%Of7dNY~3%C~16=MdmPd=0Szbcl!`upd={`KI)A@Hiv!F><{owhGKZWJ$4tXxl z_iFfFhFNOqXbJDTP!8{4ysPkDg=N+Gp)R-5*aUxKt}&Jfgn1I>2w* zF4T60oV^RP)#B@7yifnz@Jz<@S5CR-^{sRqfO=v*D%NK5*o~%q% zajc&iMoX+6Zi?e*q5sB~-_bUO_!4V|+w!tBZ4c7+qmZ&_R0UEDJ zVFo-SH@VbyUA5R54&wU-deT-Qqa5-j1ua7%B|ROXD1U3j{h^R&s@Nvd6m!+H)njXU zpUJO5^kt^+XDEgLQ>awuzwv~re2=xPKhwE}Z}atYjCU#Z(MY__)Yd_{{}t}SJ4U<> ztYA|9PCx%4h7i9GBXA6EDuu-z}S(rZ?u1?p9mR;D3yl zlW~v6JsIyooCB)x4PRH9l~R%(P!(rqXpHX%e7{0&x}T;y&i$RE{^DKqb-9i;g`N2E z7N67Li}Bx#xE`kMUEZ=Si8TIurtqg~;7xhEQ{EQh8R;M5+4c|oPE%=`PQ#Zt8qk%Q zu8rcnBxir)n~f(2j=9>$xhMIu;()~2C&%0`mK1Ugh&T3Wp2oS8mQ&hy=6^*ooq{>M zx>2sXL0&QT5MQjx9FfcaotMw*I4ho{;yPKzcM1)o^*s$<#M27L8tvxtWErpPXTb%< z8Q2gCh-*hF?+mW|(zq>dx^E1|U?1EU=_!AFO(-8X_9;AJizN^rm*xL|$8sc}ezYxpKG*#uxW@x9b z{&#Of7Tk?^I};YbDZC$wE%w4@%i+0>ceJ*-sfKcjIp*mu74`1J@8Wo$7WY=Xu~%?4@4kjKIKRa8 zp_t=*+N*r)MO$KzdlPZST{`MiZCjtd$QQSp*IRSelIg^P45$sfu>(zyIfS}*BR|!)qXMGzNRnU zFKXh7If;dGa}091CbNjUCY`m#eLp1U=P?@JrSTM;rmLWOd6S3vXgiw0JBu8*$*p#A z6jLt?Aja9#X?t0WcWXBeCO}5{=;Zn-f@d+FfwT^<<(&!N+sSyt$C5NJgAee>nBq;e z#_!V~6>net{D42s8CcHO3ivzYjk5-_%gY}5NRPh)?hN=I#+Oe{GKxRO1PhA!E_jCK zqYSdyIU?JI7!s?pj&R+fSgQe%8p*NVPu=nuy~hoDxGL5M-_@)>^_aV72%##-&@s079|2y%G5p$1Y zQ^~1*uAg`8?K;X@oCX+=Zyx*x*Uvx3++$+iaiD%;?lA?QV&3r%di$u8nlyh$bASFE zQXA9o{>GDOcwdKY%)X+}ST|dbPnGo7gg>!vwhZ6DDery+GxZnyGGhJgE~Ovm&&=k@ zvNYnu`^f*r5#Jeq%k>elRLFr-{XD5%20BN>2>GkR^Eh)RF+VvHM|B!woG&?^#N6b3 zTroGfEsr?W%o#P)j>ed$Ow3W;~7|m&Q17ZoHv>4b~udZ zZBIUy*KRk&*#l{5jB^L#tbu0Q7NKJZtcM3P;mFKi^^{p`8N`+qj=~$_YsJ4fJEmdf^S{mHu?P(p1>KuBXBc)_2C6x&cR&>ZxuS1{VP_ z-5|axI_RTZW#1qANlkyr8osMxDK8RZOr7aJqrVtm%7OQ0h;gQtau(xEF=rCvOcVGK z<4lP$rpvfrl9t!uL!QQX+(+V%Yrn0$q@ZsxkBZ|t0~zQV1h2t>GM?dZkD}_lupmVi$vCgNST1ihsO?}lZt2SH{ zv6kmYHP^y*@gT&So-J~=kdD8#kG0w{w;JoT`{Bu?-}qgZWPFPE&TsYmjX3{zt@dTH z#5qB+K0DTCSLazO{=5nEwBJMbxV*HgtDSMT3li(u-c^^eo-MxR zV@=yhd5rmtt8y6Y*@oBlje)DaSP#C)RT!QB>^^h0WmozoNGY{6ocw9wzbtn7-SJdrAc^Dz5GsId?Y;k6HJDk7J zS6hsW@ny$1Mt#Oy$pd2Dfw!KV#yM`KaPFb6GOq2oj`3|huC%zS%HQwWr;c`TuX?y2 z=DF|1@7a6~1$jOQ#|9h|aD1cvD|{=)_qO7V`~MrRnGSS)m_q!t6%%Jyy!mK)RGhcd zbeNuZT|0Yu-(Q^`h8J*V!uchf6ypKhfAO(^`@wpA1#q3ml|rmF(s_5Iw=2&0-j98b zDa9FkjdJm>48A7C>4WEKj=j^D#5)*gd3w{<5EGr*#9bQqTKSkpMFONg5qV89C z<9(zxKi?K}e5)65T|7WzQ8kmEz9K2zzj0nsySwmak=rb|V?BMWB|d`xSuw|&^*>=I zz4dVoz_kP3qV-{UDI?x=ae?l&Ki8++l@a&e8{q(#e7pY47UZCeP-(sy_ocr-T zJ=JTA8=l}{%+Jq~-=D?W7snC))feM*ID_jan&OOsPw4mw#?ewzZja-Rb7A95*m^j# z<2sat*SM~Tt5|xxVjIP?ra0sL*A@AFOQ^px^!32=BA$(qL!Bhfe=Ue-shHyYjl^?k zD2*S;b3BLU;GQqu&2YaQy(mBNJo*#=R{S0D=E6Bdes7V}9`xP8^ZVp9CyxBu_to}m z7^iLQbB;X#pNai*_z`OGG4=x__5$SMebh><|9=l>AATnG0d%kB87mhtX8sw(xm(4> zoj7yr2DS146jmoOHrokpi^YZ;9-_!B^P8jXlx}seHo}a6x z7Wo}#|GgrIx%rh@|9izaf=}tin0UX8^N8Zza;exGLjn2^}+f_VVQdO~ZKn5&W)Q2EL?IU$IuIEN^;25B?OXsy^r( zfh*QbHHPkV##i#7r zMcW(sd=g@w^F#Wki}4G5v7T@yzvt5$^Q~2QRz&+Tv{j((plfJoW%p9rlGBu)ceUU+ zq~=u-zO2&r3VhF>xHtVyV>%9*Y6Yos9X@K)v zdAXgg?&>r42gX|L4D{86vv?oE8+)Qw;m(Hh?~>xj`+?a1g8uZz7|j{H-Q_(s9}3{S zmeRlBc%8llG#ykUMdWdy+A5{})N*QDy8*O)t6eU!P8HvuuFFnx*^{ObVvO|*tF@0a zj6T9qx(F}e3HA0Dt~ej3DxT76V}%%7)6o~sciN5|~ z-o&@oRyax1Y+P-46wjVX>Y%Y4OvX33x^X6)1@XND8{vTz#xdk_C+{xkqm4eE=Giow z$I<(_dcQ{>pBDG*!1XSk;c6)MgEZH+gm&MF^CfNTXj@FYbKnH;ve8+Z*IS?_ZHYZ0 z8FB4|?;!Ss#JJ|S>NC!ax_~#nW9zy{JOIhm<{k7L!a0|om>)_n_Bb=+KH9R%$H~Ip z1Nb&sE@NF%b66}db;Td!uC?T3AKXAU%75=^cguCNl&+IB-o4-uB=wI=#85%4jKv%0 zC)L2+u84Z0zZlN@p$iOz@sK!ADG&a{T7-vq@&jQG34NNciF|L-N91~ncoX@K@0-Z^%KyvzLVcx|zsUcaym$|PoOz$9h1koLg3tff z1np51i=hQyV}0J8`iQZC#Jaqgm}rmZ1Bmr`3-SFCbwTe_uv#tTDlI>9SOIUW)yu}; zIG1^DGV#mL!w_SHsno`CZX#q%FFYTrrS$6kckvpHFw z9^-fHM@Xzmh;@ofc>cZIXUpu_l*2O%Z>&ey3-9qE)+5ZJH`XC^(8uHOFui%zZ*VWC z@d0tK;%g(?a?loMP)^YHpd6J@uZ`uYDa?e_Vs0wt2Cml!;D=JKSA21fdP{j*9bdZ$bw7&H*iPE`+aXjBlCm<)|@jtN2_7XN++t#_lPz0#odR;(X}7CCBfyoiv8Wk)4OM?ojqdhEH`=atP*oa ze!j)ep>mW;Zd&85L~C}u@AL3148$F0JVxBHe!F!o^-pJg8e?v3I_}sbIEs{ZF;Jrdkfxv@E#wYqWu;4DEg7Ft~|czepOyy z1H@7re>~T6(_a{W5&4>#U!I^m{rTnnRop+xRjI1H;KT3Gg0BzZx`HdtNm;?)v-o0; zv>?69;otkJd=C@zhxBaMCdN{y`P=9_F_s$Rs7v5G8e+XxjHkwajxXfm`Z3kDG{l%wyei zV$3|T<~hdBW6V6(Jb&w2&Bv1%6aQ6yUUJQ6ljl?Vy`oNAif1k__CZr#k8#gf#^>HV zY0i(qFg!d-;d+C{YV|3YEUp;C-UD%tO&M6NuD;>@i~4wsXK$#{jI^9Dr+(yb3*JWf z?xt%Uul7TX+uf=zcR_r=G=L2dW6*J?YK*tU@4@H99h^=&#p_SpX%d!KLM<5M`E12BZ;QOd8CUl~SN`_K^$2~B(e{@bdqM2u>3fd8wzM79 zww)Xw6ZeZalF(G2rdW^qdNH23Zyc463(!#eSU()kqPO%P=kz@&t~uJzgYGzDKgxlC zyu6Al@q4T}`IKJ0uE$qaE>g?G&rnmIU&PZz*NesS7Cm=qf1BK<7f%DYP2I$p&vKd$ zEx;{ zzsABaagO8J6mcfT@hT7ov|4!%eT%M=;h;h6)f4eb#F_u?=u9|f9 zsNp&h=P+@;$glL;kD%`%UTw;%)^L;*>s!zqPwe;pMQllF`k0=A^u%upJ_>Qqnwpw^ zT6*(5&Lq4-M_cuI30|hzn;g_nx04LDIwliuk%zX_p37ABXA$a{ir;|+;Plf zUBcafzG7nCLEmaIcB1hKedN$bQ+NY9(EEtKVh*O5YoI>xf0I?3I`5;(ro)(Y_Zh)883?Ds|Uft=ufvaZc}GoF&y?KAP`^#P8v@$DfVn_*U63 z*Sl!XkH0tc(nn(7b&OHRp6fXG>LUKwa~=DwW9`6Pe6{6eBaWZp2(4N9SzMd`{{AQ4 zb@jK2ee7w~&15wb<3;g~8*9ANinW%yJ4jFLVV{jJ&fL8NUqRQ$+jPbArZ!)z@Sq;F z66-nq%XvAIcQKC|-}Mc}J5Y`a;4TOwVLFXp>7y?09u;WE{T|-L9+JCgP3$3wcl7Te zv6m#R{P&ZWtx!WO$N9QaUB=#$TKb9e4DR7=>@A7?B*|&trjOWD5_?J3sCgxz_{1w` zA0=1I{=-2Sn3C@q#F^DKfIrruY=)0<#vX!YyeX!>_J}{`t>=q7F&`XzK1M=}XSRaa zw;FT8iM=27-T==# z@)7U0ca{0?y|y^shU%}qI8(^;WW2F<d5HE1WtyWn=de+}F59>Uj_ zS7~rI!?%UT&gy3*ovFk(S}aNBFUElK%ilO2e-FjQR!E!1YGXY_{#MFecJ+~tp0{8f zO}l7{wL}ZW`JBAPoJJ*eewgQ*#T@7EY~s}+{2ggKF2UDAFWS9C7cy`*AX7YT~@pe+!Nc=yPe+E^ro)! zUmo`1eUiRqFh*Tm!V~L-Voq=a4ChmPOC;5%j~WfH=W2V1w!XBzt4-{2$|SDi@|cFE zPxzl0NB)s-W$^t1F`m2;=S20?Qk*e16>BP*>3avny7O-MV%_;dUNxiTbM;W$J>e|x zhl?k%?!2)$?!Xai&D-*M7VH*F3p``gdW+2Z;MEM8D)DO~UBz;GS5{j$yY_~PDb5i| zfhQZkV{R*BQvWxPW8G#-f4iKIAN%{?X}_ZH^gLX}kB{YQmU@Z3#rw6ZDp&Em$|sh3 zVyH&{Wcp)HBG&lV#9wV|aT z&e@!-k4EYty?B3t&Ema{|EKtWPP~`&l`A(L`g;lgEW9z_bDZ`Ow5Ou|Q}~Dn4b{W@ z;%F!Sw)hW(qjID-h1hN zht~G#-K)fYn#Sz7$B8}0Z?B4ZFz$5fU?qLY#D0i(S=3K@oYkN(-lwW~x98<%7=Zr) z{LkS&naurCZKmNtIrTjka_cAN-sAokXNn}w*N8Jk2GE~4VF)tr;@hkD( z!GiR7g3XTn{nt`KLMjm6x<}v2e0AIh`R~iq3Y@qeQ}msJnQboHx%Fd5a%4Opld*0 z&nj5T&vzl#!G9?J9ct3%pA zs^V_}FN*tJ9uL7AXE;8GC)U(wrR^lNr*D(kw~PIEHGhIvU1_PH|2X6M9jGG*H;8Lq zIqyqykl1$_dmhi!R(o}fNy%}X5jqvm>2&{%U$#?wJs^H-=nsD7;L}kaeS|N@)F$Bk zqB0*`CudJw%CHeGi*t!M3)9|4KdpIp znD$5XGh5u>!2SA5PyZ@?{R3lpco5F&^LcrXx!d>D(CzYnN}c}$vB!FAE?$Tsg&11P zdF-zq2sg@2?6DporpZu&KR?RP9Nc%}{ag$=WMk^ zm`~rJeI9?m5YE9J{93Q0$HaFP3W#xkA@>zp@2I5iDy!)#?)Q9uguXmc~4%q!ysDn;*R}%BgNfW%$LGDd8i`~b!mIGf@?=Vu~+GC{dDKU zzh|-N;}2TneQ^%nt**UPyp8w1DPoxPqxyNY`Gf2|)bj(@eBx70_+=!ec&FMKCYV;sDM{AB0J zRDErb|8lwgTjT?O9=@*R!Q=Rg(>q8#)KL%d?(sb2Rs&a{5$&__4t4$i2ub-}SDp65 zpA3H?{P7NbCJi6;6KAQf5K9+vEapYb5B;H^ct^hr%ImASzJ|bX9&P4(oTr|urgtqE z0F9G)hv(IMkOY5IIW3}(^SEc@ehYVDaTLV;PFw?Os~x@{)JLq(d$5B0C`_h3#yMBx z=}2!?-q+#%YPceYF~_u7Z6wYn+Dlu!m(9Sl0UlN#Q%LwjZ1FApp7aXq@fVnwLYwcmgWmdO=;4mZR$Gvyq&v#ue*K|5QV<#&kN)SYx^Y*95uguP(2N zCFYJ|jcEZneI0g-55zUsLp(8_@mXc#VB(3h4YJ^h z^9|w}jyb+hVIM5w;SSuTX^Q#2SQGdPUGe*_PeEdyuZ!3tHxKYF&WniiVyEb1f;xMR zPqD5b*6yXnc{9(t&^ia#pD-;e59FpjoT0s>nyDzxbG*9|Pd56eh<6#igG z=UZ94LvY2|=v1|rOMZ9C?@2rrc$Y`bbf)b$-krjEk{|2T-tByt1h?UQNj|1RQ=G9M zqAZ@+kGd957uV4=&xPZ-GSQU}SL`b-A;#F3H!wh7Q~Cz-avzM8+w1-NoQE-A+5%3C zy`Y#Uia9*I{1#4 z(tjRzbNXYw)k4>KLreU7Xy2;7ORCBGe8@=mSctV?ljSU8h-cOr`F;`a zO1%B>#$J=M{AdO(@x?ldTljkf#~Qhbwe2^j5{sPNt=$jW9f1$zW|6;(J!i%Ay$J@D zcOT;26Z(A#T8gVJ#Bbm{PD3@ZJ)Xkf;QJlc@^ZL3?2RwJcW;H^bi{9Ru5vAJ7F(L4 z>KfvAIrGc$2syb2XUu!Ff_=~n_s@8f%SF`T7WsYyPhRaS(KuAwoP6&`;{a$vXPp1q zMT}qJi+zI)q^1O(`2M<!D>aE#K%XvDE-pI>pd8sMp5pwbk4}Z#~FFf%ZMfVg@gZyhI{sAyr?Jb2k<0gKm z=_lx~k8=8W6(-@2d)a4vNFn|iI9uS$LDRcDEl*b}oUhW>NQE`^YsDJ1p)|jJRn}?@rFMcC@vYLzg;VJDOliOIoR0zI>IEy3BbpDQC zU*NfcUnz7@3P)3ZwWcNR1Jmh9{4Q2)_r4ehN#gIHg{e?TyBYc}t6gm##aS6KCKBTy zF$U5D65}A*#TH{A)p!)+AV(|xH~!I`?{}fSlb%%&YY#K&rw%+O54rFU;@3f5ol(PU zaL1aCMm(#Ie;}>Pp}$)BP%bjyEe9Q4D^EfX@y2@EW$Ld7yY@)%N{#C)Uzl#u@8r>%$Gn+=C&;s;2U?BmNlA%|r7+eq`oH7P_B< zTWQ=_)U`+Fz>@AYWn5Pk)gi6bas9&I>(>&-JltBEk3!7F#T;B>Jz>nj#d@S!`iS*} zkBK4H6vlkqJb8;Xg)t`=^Kr4JFf)yx@wFb#o9N5JgZ0`)y_8lf4~hE+_!U0KQIx;G z^LH`L_3*{BI>w9dki#MJ7w7ZDdc`Xcb7(io)eZDLD_;|`dj8RO6MYAvwcMSAfw_&} z&=}|c#54OM&ZN932Nmg^1ZVmEG45L`iwT~^UxNPWb<`C7QTMO%_|=SR1s>*ea{YZP zmM`RQH0`UPzq*(qf2W`%-9!0MkJtO4RTcL=eh-4tu8T(aPl#c@dq~uGj8~3^7_+>e9a)*En1~=YK;ialBIQKd%d@KQ#Z&`$nzB+;3veH>-SR)IKSH zqsG33AL+V9okXqOCa$Qnhw*(QZ&7dYj_*(Y{m$#H?h@a4u~s?@e-ht!*MHlc#8sov z|No5_XOJ~?-->skcjWhRerA^6IKM5FQ`y33Y zE#3TnNKO9Dv)gd(g|A_l+K;)4bM(es#n&{({6v17)wCT6F;9D(j>okf$>aB-K232J z!!UXt*Y+~3r|Wl!a~TS&fxqDy*Gr81y(H!oa#;_4h7RIi18eDwJ=6Ed!7=r4HxKjc zYX}Thqq+2Tna&(^o`r7uD8yumG@g=W=-_Wk{??|sG|h3pnS=X4ZSkv#JT$+M z*0Z1H*moU!>e6|J?9x|aFKtSkiT$&cwNLDojX9l(Jk2dnPx18|F@K?!7U3vB@54NO z6vo3@oJ)8+K-?*5ZBA=zymQsSH#9C5b8z1S4@2zHY|7Uz5NjYB$k_=xuU`YPSe~w5 z|8R*HN5!5=o~F50V;w|ESdKf^Ld5xfJMp9tYwX*bMB`7;8qX`dY(Q7cd7Pr@37UFW z*53W1A1!afF1|e==HcQ!4Zq{aD&}X@PkbZqg>U5N3_L17Bk76px%dWpUamhV=H4Xk zTJ*(S!Z3(;*0s=CoH6&@1s2j7^UvpCxcq;jk9ul7=AS#jHHdesn0t;n=lH#rm}{qI`p-1GJG&UfKGlEOE5D*A9Q!X0P$+%0FD#1QK&3ga$}vubE}UtL;=R@^Vc zQU1gjY`oiM;_qNs<+{qnmu7s)M|;d0-^80`@I4GjE%&gESB>-&*K8x)U1;vflg0e_ ziq<&WVLZP(RP{{4^Mp1BVZZu}aome)sx^JxwI830FZ_LkzE~^&Ha#2Utc;w!fG576 zV_o#8uAfD`)kTs&#l2eG6=^7n>q}e>aebjC@8e^vz0M|Y3-RW|`zt(xYZR=-(^7nG z=*cb@C3!XwKFz{+zQx#7Grq+cc=^P(TWrI$-yyEA=xU}0`$AV-6~y?Inu>jc@tz&~ z?oZ&EOwaq!P5-g)zI9RcCzpvm_ig1exA;oHIvoGI|NbvI_#Ef;>(Ucz()-F`tjFEP zh-qqXCx8BdSc|@xmSx(m;!`oX+d|J#9?jxW{2taDVq3eO9{x?h{RG}*;>-fgB;VQ> zr|%cKa?=%aN_lCitIe$tzvdq4&$yp7q-7{A zH_-4EzUgvVfnU4T6xh(|JHX&e#APpD(Yx0#Cy$QwV0KT z-B1tTJ{$$LjWMu8?n67(;|Q8|s-FRJwI6cwG=9^#yF6{-O;dS!iiQ|d$|{c8JlQVa z+i+}$C-J1@?}hk9_RYaA+J@jN zuV(V|sHyfdweL$uocGj%mi+4OR#-^Sr{X)S?$(AT9OrOk(>^gi-U&~fsS)GjF@H9e zj{hAak9zzTVyt{WZI6pRX(2h$M^?VYczBHC*TEfQ;xQhc6Yn1SVyq#?7;e%>N;*f$ z;Vn3>A7h9)xna0sjG-`%u@`BrI;_m6BYbMlr^mHTN<)A6M;;r>{dwr(T8rOXxsm_P z#Q7>MMfn|LJ}v0zmsDP$wpz?5wqEMzef>W#cmJNluJ80>c~t*j@w$EFipNXje;W-~ z^?$n;&s*-=Ob4Vo$5@ z&ahwGw(9Vz>nPrDR;ru(OYt7&tDF41s7=R79(*MJhWf89_V?g>JTYcAS^GS4+(+9g zVxOY_CgPu6$u%#It=dmib7%SB5=in0Y~#glab*)z8oY1FOBwoR(U(hH=b;nsob*kB z32N#yc!keDiS>Z~Qj0aUTz|^rinxEqw*%jw_~KmA*z4Ve#(j9kXmgaWImCGvor59H z|LQyS33dH)VAb+j2G-#3fn4cG*u^2jAkaen@bVi`f#A~;0XRJsehg0|%Yg-D_ z_JKZTit|3)_u`Iq0Bc|w|6<%Mu@CbJIXTa(#D2^@Vvn^3i9MOeaK?Vjr(GvC@pgeN zVqB`OZdcc}_!j#ME2zs^h13R(S+#GdE*@pjE9H3&{pfm8oqfowRJ^Jv?!xpOmgp4O z!~`wH{wUn0)?@u?AF=PJFXq9!1TSsp#Ck7H1E4-ld(?eSvBrIBa?~*Iw}~;ngNpDy z&NsMMUN^xAe5>F?_3<~Yjrf>PZ4`r;7k-@1j`H&>?xeU&&>QPdFTyvp9)yAFE6!>V zW6ne6r3DXjh;caXSMbGn(f>!+oq+#Xt!?8s6Ee?J=2_-h11TwUgp>?rtP~M4Rpt_v znIv-*N~XvdN>ywe5*f%{~4zl1Wgr_J}gk=zGO`kAE;@P%-3cA%w>>Y^ntul%`_6^)eUiR; z%NSF~tEgMPr{Pm&9!=pV3szI^Fi(X~Qg zGk71*5*<>hcQGYbuf@eQ8&=RYg06Vi{|MUiD0krcqgf=TI%3idHg{QRG~5EkQ+hFAveSsbI5h%tZs}YxQSmw(y56|YKFeJZfE6N zN!UQ+m-x!z8zpzsp(NgR`0l6kZ=64S{=xT;Hkxy~m{HUz~Y7 zA3o({%sD=WZ=Se|%V`F=s1A8?e~&w!x4VkBqg=*0$t%Pd=OhmoknO zr7V&>pdPY|C)V=hq3H*8)s^-bx6=at{(NcmL{9-VIiJ@>_z}3K+|kH2ZG zub)_3wNhW3_4PZw{ls2{&Y{NA7=6ryc+Q-wk2(4{0^{`YvOW^~*$(21clE@6w#dT* z@kcJg|Jc)($U%4?``QxzC-$^8r*#pHu~s(+ZQJN-BKEoR_$*xy^C0#HzJP17`ubaa z6_V4uycmlw)FGsF?CI`6OZ+}XTREwRdmb$pAdNgM#CZg&(6k57 z3poDJwwbmi=zmnZ_#MtwV)z~MYyZ2p-<6T$vc5mSH2NOmdsFqY3gFa8|+do7}}WgkHwa44%Y$$*!!PDd@T#epjn+ z%Gc+(;@eLrs0MaTDI=_!^yyvajLbDl2{Pn^wF8rNn#({FIiWc3ioYlw6JiA4Vv-q@x@A+_bfL&s(Mq7W^h>Nt966=k8n+Iih_n5khxuieEJC|qM z=(|ac$8RbfrmvSc?@vYpebvSK7S7lo74Oiomh5AAk-mZWmf_ki_IM7R2Dxw+g-Z0b zE9n|X-$edTODRrq#n|r8^YA&=U~l$!|3GQAke|=>;4-go;oC{I`VUQ&dDT_>o~i!* z*76xGPx7m>I46j+Dc<;A`yt*8a`3#^ChB_*p3HdS9Gfa)tgroz;)!({F}Jf`9D~L2 zB#)Lt3b|_`h9?S&878Xp58(qI9h1-4e^dzu-t1Wg=VF|H%IgSuy-a5jabD)#CO*Zz zExwb+H_|^KzL9pzJ4ECJR`h|ZxD`nMu=R+ zTzftFEyd4Oe7OD@;s5r0aDX2%-~2X@JJAtyZ-3$GEA}E{Z!JIh!%ry7(+$vyuW!LL zvB&*yzM8II-n9_dEZ%nF>l!sVR(;2N`0eVT0ewHhO8UNmr)V4}Zz)|5ZW7}*o;KCT zgV3|IoZ_6K4k{TZY2{}euD_G>f`_m0ZaJ=NYN0T_$?1)=ALqan+;QGxBRVVc>`tDQ z#&r!2%TwaK$9T_g4;kgHy*|p&-AzA>=*_I3`2M^$g)ywJxM#eXUaa^J!YqB1<4Zwx zTa(W*uN}Y3y-gh3^_!FabFhIY2jMI6Z3)f|e^{zbZ#J8PB=!y$|=%(*W-p8s^E*bTPj#=2dVb z&fa4DQH-OK=wDsN??Frx<5l|l@pUiGuld;xPdqChE9CEsxZam^-7KSajiLC?6yJZ6 z$VZ$-nN8cX5NC?lqH9?;&krIY`Pwl@7Oau9@f)$0UF?M$mbu$ z73ayH_c)uWnB1)>@1CVrv*PZCdoXmzoxHYZT0ryv&#lBWZ|EPWPI~HV7{v2#VqPWY zRN^eIWpW$yDDli2&$~-;#(av<{&VdvEVuW-mvU4~Zr4G59aW<92^mJfF~Y99L@EX3(~cu93#oeZ0sl{w7dT?grzGGto2A*O{+t z;4vCc^B|Y_hgRl&b$>_a=W2KyU9r#TbzCpsC~xxh2#xp4(^MLF<1Eh8H8{u7cbv8o zxQmE=7?i~Sx7@Ad!Djq(tC%0b-;}S3?=kT_dLO-s?=T~>c#hM@H~L6?hxrJ158O-S zF22LWx89?0C;sJ-_$HI_X7$GB_#SgF?HBlwgZ}FDcY&q2V?RP0+Go=J3fo|4sDsM02YJ}%=wRK#63X1=J?caj!G-j2n{ji!3Epfy%Zd{|0<#;#_D#_FC zD%z>j3}Rg`|JR>YIFsH*aE6C*MrfQ<_?-Ci@Gj=+n&aEczd<-35$AZi;(XAU151{I zR=Rr0Nj&e)5o`(*{8twF2)@MpS9dvxxv!Y_I)g9fy_8&%k#LJTiaDK$@;nQwVvlwywQEdE z%z6DIwyR=_Z@!<=6TcVn11+)cG4^u~fmr)kT5O4Rk1z8+o^|fYVcbKk8&0fw{HBN) zR#=7{JkIS$9+mM;2ReXxI4t2C|BaYrQOy$Kw8eUODwdhz4<6K{E(DtI(zY{~u z2foJF1F)V4u@61=pyw4&9r46I^lAFeiR(fA#~$=0kOS{{NbE%)!lP|G{uOTJRY`iv z!>#zo!eL`}K}PR~IA7q=Oq}^ks4bi^A-m9c`Bh!s&7*-lk97tyf7G8pg|x3Ju6gu5 zOy45j4B~xa9x3*R#2iu``?Y_m+_aMIEyrn*ti2otlPeER~V~%=^KAO~aO~QK`Z$-JSM)${JUrO`K z^7@m%uO`+Pv>D5{Pk441T8sI%TAn%S8n1nA?K9H#IUnzq>v3xRGkNIj`jJ~M=HdIB zuA?}bi1BBAeEU%v=`#rEbZQf+S(40?@zROTfAxX9p80lW;T9l|5*P2q+yu2v&zG@ zBJ{|`AY2=u6TWz6sLRh(eE5i$dGOVvWf#t^d^m-py?R-rUSf>Y63^dwUM$8(al|ui zN<4Y0h!bMX!c%ze z9Ch)dyk6kV9klGGCBEbRMn_ipxPz9jc+-KNLG*0EJ6cQ|dHe?My?ow}`v%-O6@u`3TT^n9!^c?_0Pj`jg05v>z{+ui?gH{(`q*tdgym4)Rx1oa#(?+)vBzE{JQvDsd;n-2>{=y+EE5<3GlJ z7ic3#iEBWN{onNwYh?P#$sxFz?s$$`fU7*MGjT2EM?6Et^HVQ~=cntRoxYamSSzuJ zp4eyen)WNzZENjT@bHqhS?TF2&ivX=5$AF`_VBK{I5Y5Wby>9xt;HH^uxs(~PBB)+ zd87Kc{yBG$I*Di9xirSJZsPei_Nc})ZsOUtocQ9oHlAtk#`gxUy|fifWgbTRwc5wE zrI1|2y6(8X#BbilHRcuhD5Q>;$?+~6+i-lS&f+@L4o?Z1O7J{0kM0m>to>Q4PCN2v zEL_N=F7UMHc@^0bIi~t0~^cUbh`MkHE#e-m!T0H{VB;c29-I_^QZ3F^*cJ_oc&ny8uR3_<~4D~{wT4|#kT_A707{aAbbQP#ND0F zXKAd@|8s@>f8vX^OK-~Mi}Z9!;@Zjk3lM86@1`TxQZAw8`n8msam=UXX3Ap=?Pq~L#%&WBo7^Fi8J`mKuh@?A(jT}K4)P9%(&X zHNrUzGT=Q8ztQ^u{z+;jG$-`_Cic)AYe3iPCp5z7TV8wfG%#aNSCZRUhN&9?JJP7b@m$;%unc z*H{wbTAPn2;mav_lIJJ*a+SwD^--VZ*bC7gYT{0Y^A>tX!&tZ`uS4*6#Q#C6&tsPJw?-V}7JpSAA znL-YGz$SgHG+ts(xPX4L>0^LCdgvfi#pFLZW;&EI23A$_X#+z9<~?fbty698zAz#FhfACKVAB5yV5i?dYY9Mu7MeiQFL@wPDzj=*%DCgy)% z<7>?Q#++}|Sx=f{zPB>HZRm`7-de_VUuZ5rG0(e))+M}all0$MN6>Wix_Bejv}!0l zJrVORNW{G)`2HvES+0BU@G)Y3qul?-TUfvytGO1vF+C|Kkwf zJ>Qm-V#Y$O<=aBvPyEcUeKR!~=b&}NQ$>s&V5m5A%4>0`gl7;;R+EkJeX*yuZ$Kx$AJXn`u{PH(zR?X4TZ@9OE%JJTmf^JgB*wUo zT!hEU8jJ8QY=BtTxr4sAcf@@oaZcVIe#V}h4ssCpi<;t#dqs8Jx#eLat~eiTlNgio ze=59$Bi2%Fm%nGUoeGV$UoM_+w2w7!v7YpzK08+Sz6H6f@=iU(y4!EnSA0|Xla3-{ zo57DvYQBmwRb6bi=s(t4#yR;@#CJrUjpI?`{HEIKY%Sm89H)12UBVUbK(pwok=`>b zU8iBS_ObV*rnd3kFqNJz+V+G|mE8aN(Ohi}hI)7!ienIe=eozlx}=Q!>{rrt#rP=V z?>EBxV)+r0tDTBsY7CFVM{pB8@!Zv%p0<2C4CUy#8QzC(^1n~4%lNcIjPX131Ldv| zjg4pu@ClcaV9P3dZLC#;ApJv zer=12>k^FRc~M@MQ^&Ek=~lU#AlLJ>pDxZ>h14l6zw-GeT0Y~~2lC#%tZM*t;$3(8 z>WDcVzWCnyxEdd;c4FQsz9GlA*1b3r-&tqkOnhs-z{jJ!`|oe9{yfPmys9t07%y|7 zY8LgHo%jCF#BUBJqwAsK#vh&&bfm#`qx{EjrF7=^`{M1&r$xA8jp83-EJ9CfSRmGT zpLm!@Eok~xK2M49gt+3`mxo_>@Vi89btkTYI4l-V<*Tn*>-N7}{n&oyX9L;SA# z)4X^UVogsz8txWLVflVa+h@h`IB!PrX1F?hia+t)ayvAjCC2JtJg>tgde-r}AfCkf zxp=;=3$c!FN*ZGWS0}magQvCFM$#4gv${j#%#jcA{3fmzv^7-+L&O$mjr;{Q=!^ZE zv7R`d9TMk^#2F)-`TY#PW8F&mJl?H&eUh%2Gm7&>(&1ZFfscGzA>PD!B57(EdwB0n zN*mwCi2aDT^W#|tXZZfS9PYsRpgPOUyC>9GoavehXPiw_1K;|p`i6^i#=K}+JTZ^( zC;v~;b`noK*UZIHUJkda^S5biS?u3;yFW_HDbDl8%|MzKLhN_%gKHJ8I6G;0HZ_eS zb8deFJ0SKZ^}<w64^w!6nQ_L;JoRz2P zdHR4HRpMnidRyvii@s*zjq7K8kM9nd@Lr-h1>RS2-o}G_U_OjhJ6Y)s4;Mlkxqc1L zKCw5Vbu^vv`+VO+54>ODdW;8Cpgq15bf&@ct(-5WZw@%V*TM{F)xQLbneA9k-n<<(&L*=<74ukyV}2XSzNraXZbbPpmR`9yytnlTFjI1 zE|>ELxKq>nB(&mb>}lMGH|EtNPq9Zhu5+8@>USv4&t7tWyFTX0|1|afB<(AqgZ{qe z@55r4PX8hL&#L!0k1^Ii#k0%-sAn9- ze~tD=bSILwGzlGkp(4)3`kpH*`CgVX}ZR0$GSG4b~ zU21+d)i$}f^TA&2A2yC&fV;Hc4QF9x4dX?OC!n;Pw}4n*d-Q+2oq~Heji>orOf4MM z&n~`RrEiaZ_Q}&4p570DW#V7<2nGxbGT08xkc@F1nQR?ic4X zYH?i!8u&g?T))%uoc>Q{m2Vp2?2_%g{R5uXW*(Fl%Utco@OmA5rxs%F=r8T(h-WKr z&bhu+R0~hz+6%D{D6TW}=}4Tlnu6c4r>r-=d1~YOb5~<->S;CH3+GDhtJ4!}0OPFj zW;j+C=ean(fg(5ti=Q|b*;|J>brs38K~_-$Sv=G($Y?jii&9nwCC{UH2nWP<7QT_^k8w{?Kk?4p zEUmhNc*p)79+IcTyLP-VCf>2*y*l=s#d~#P&)LIbi!~09@;3GxOpvojaZRGFSkxhH zvFG53oaLu+0Bw(`zr>z{el%1UTg*Y0=WU$R7xR#DPG537TOsBnV@+zzMaDd2%s-xy zvlC*9dB~W9Y`~|;bJUKe|2fCDR|@xHh_ziK`1P!u&7|jbTr+r8S*$nEQv=5Fd}l$| zeb>Y)@>orczMzj3`Z%JG^kv+Gjg?IJZ^vH@&!^()izhFh*g)J^T=CsD_W1NtOEXH! zkM^*LQSu#kC1m;Cq^m?Yx@E z^FlnT3-SIq8D7@@C{2&hGC@2q;V3Gen0v1%j<~khrDXse8PxSda4Q|v_`kE7`#H`Y z{J)8oq3W<2u6leLnVnDg^5CmXQ!f7BPFF9yaeiBj|9Gak18*krO;Q`NcdG=>o)CMP z>*4-bes2`JiDvhcza+-~ zV!Wz-oM-f#_TOs1x2Ai8+{bSN=E~`w3O{PsPrsX?ytd1=YpDPD-K+S$qg;G>5PlcW zNO|8w!&Y@#hA)SbxDL|tmw0|x*R%0;(!Q6r-^lk7?J~;OaBbJZP;Fx__7@mY-S}4r z4d^)x#~|iDg#60g8xEt^%=6YX-FYw2lZ_M?^ zJ4jt#SLbuQx8KL#M{$(K(HPRLKW(z#!ptJGIpUd0?kALHZ)dY{LAtGpkgE1o@n zh5oJyS0M5H8PA?ytAluMIL*I%>FdV7CHUf5^fsJ{=h1g?#xrT`dyVJOAyxl^Bm`(fy$-&jNWqrT#tkxOuwz7l)8F6k$(i`Vb*iv3+NhtY=qTzvQv zVvld-^u~{|kxagR#g{_P?x6iEo{YeI2I4%cM|j+q-r~l=dijcVvki=^X0QcD({z!h zxp+G9b_kv=aEKQcT zUd25+JsmI5Q8~sr4HKY&zEf*|H_upkmsnGpi%+-F^FG|hqfs;+(YBzrwP@)rroQ5d_r#y+i0e{cd_R?TJ;L)K zpPq$!JQ}4=(y5b7Fh?%V(#GB-BgNfNPVR91m?W>G^|KK=(z=b-+WN~Z{;#2hn*2_m zzvub)x?f0tt;PMY{wkDL*ZNqXRz}oxt;W9+_q#Y&aM=L7Sy&} z1^qzG^~U;|GunTs{Xn|DplhalyiZ$w@z21Oik7?Z#BU{@;^8c@!U#VV(v5MJ=@_ZqU}I! zU#Fv*wy`E85A9v_wTt%SP(y7DmeT?HzJ*t@HvKrC;`hq-LF^}J=DN`hdhzIIn5pmK za&`m1r_(ST@2~p*(D;sXILhOXvjSr8dbRTI6?m73tFsz;gsz5iP|o-)l}2AMSzTO) z^0*t~ZjY~zxF(CMs#=Keiwkg_p>3_$_KGPBPh+kt)*~kNdB*cJ&_Tu*F*9?qb{t->Q{o|ZYYlYlZmGhWiyj2`aXsN2rHHbAA z&9xn?4pzck*Ta4^yu;^J5bw9W#a3BdHF-9JS99P39Wf^}0LO8dEKl!2VooNW*N^Zf z_Qo})CFW%2i6=2Hvw_dM#59)21;uj>W~zlRX}puh8Z^#U4^{Y73ogiG4mvZ@ScAsc zNAZptd%vvbzR06`&tKiOsfIBp?wLuo;eRE49EXBDIII3+Os}CgoBEmv@q0jT;mTXg z^-Mk&1!&(U?!5HI{qsd}m(|D9YIu1~*JNHk!v9nBj*^3;^u}Jwb#hyTC+~+JcrVa; zn${oiKTm4`ewNZteTZ)`tMrqTKht>AS|3~KPldlQtbjvuS3zGZd6URpJN>*1+w>DT zOyutdK17~gQa6#SUvS>VgMxg{qkUI;pMw4{iU-GNZJ%46K?=3^2`r;=8EuW_E#7A~ z;f(upIkAuB?|1aYn%8COuroj3QUhJ+YlA=5y|%}BP~2t2Jx<(-HLnZsu7Ftk`V;=% zcoXYi6Kew=!53=-;=9hhe7$~6K|$zR;1T!g86Cmb>&FKE*r8?=-X*Q*!+`gb(!ll6I;1J3wtE zR|6?vg|-EFa~s6j51;ZUB|W+2algK6^5_?FHc4$i{7iFv`*c!!B; zH9Z}9bWv=v_Twel?K8Z`Ex9v95%ZVttTj zzlbxdTyBK}`iQx!M{u9!{a5t9g8Li1KfqNvcoTmw{uSaw)JYxu@jMmh@x_>qXQ?T? zs6z8Muomx4IBpj6744s-?RmIEoA?%6Q~WDnslWS2|3`TC2ehxG#>Cm2Z!uR%PLd~R zn2u+JzRU1$jrji2|4{M$CAM@tjPIlI8)J|2FP~bEXQSuj?*V^5M4uh?75m^`RW~{P z%?!AW-ibwxGk<@zocozJ@$IgM{wL`89zM_GMV;E71?c!dJb%DT^pxhu4tjRc(FK33 zeOrouGaXgc`h9$kHHVq-&B8-kk`L8DDQ(~7$0>vZwf|TwE496#p058Lvp;DHAMT)I zv-Tg*@c@n^u$mXuaGcjZc{ZMD8^2kSMNIi%y|`|WgN1T@MNTvGu`DlELV5bH(a}Ns z0=&s0CoyNK**#hiO_`Is)I&!B{SH-Vk}nN{4o zTWMpAKfl2hJl`8nhj7ID<0^8qUVd-GGf-T`)KDqKJC8lHCQcd}f619$N2 zWqE7J>-G5Jo5FnYPQ}|(yv2CE5$9%H7lV(!*uN6bws9uGOfh{WrkG>f2(6NeQ(VtO zHMKLB_iN~Tj=sA1I?H{GfkAw#h^IC5qOFu1H09Nuc;jr0<#L&swtI2McG_it;x{q&ml2otAIkl&Vu|mJBWd{pzNcj@t}1wH<7uJq7vw0u z50B)_Kz@9$-&y?Vq~CZ(J|?EvlQ6e7FU0l?Uv@%o@q7q%#FSiJ#@eE)d`hmSE<#~RTw#?<#k z@Z+dxYz-}?#-NQc+z#%dHTdGb8t*2Li97D6wdsrdX*>Cfd+N9N4UeB#BIlCWkH5%f#{$iceL+WQ7?y6#p`dLj|;;f0Ecog5fuR;SlE@>b4@dnz)_wUYP zEUtY|^&a2C>uH}v`wZ$kS1I=fs3Es?=)0!Qx0e?a&+e1k_&(lN%+DnA90YIhKb`@L z^Zcq@9>z0MjB$-$04pMgcsGb^t+-+is*dhP!za)>skWgLs`IY2n3t;WD=;#%Ib?WK z4m;twLH=^^>Th_Th7%C;LyffAB*xf75%cn~cVZ|^<@u}f82cz<4@JC7zJ=pOu_g9W zv{X}z@a&}TEm{t!(=1{c317pf`tQT9>UdY>6g%FIa3}5`poJRAgFE;q;;zWAEW8>B zTX1j3{WE>9%Hu!0?}h7G^>tC+;x}W$@59=aHl~uRfjrv8Z&f^{-9I!v!=rL^W#Y|Z zwK{{QsWeT;6SuW!?~HM#K*|{35WfRa4BteEwFilF z1romjkvLx5ss z$Nf0&!%?gG#rPZzxsAb^au9nUGHd@DE$R86k~f+BeVjGcjfU74Ii$AdQ*9H!vHByA zPKhbjWKQAtA$(WxbrM&s$!viqu@-YJzL@`y^_Q{sax^0piI7~He)#(IDjxX;PqCYtXPXPiGf zNp1b6k2r(27`?HkE`2F&;Aioc;Q1c9bL%HP{${v`^1nUa*yHs!t|w_-!n;^+c}s4d z^Y4=QC#!+n#^NG+_g7NemHA8e0T_$#OYwK5@%r;LUZXS4(unUStul*0hx*5PoYuuS zE75ct4}QS4M~st<$xm@ipdsGk|xjXTkeXCgFSv$2{#`AU>9Pzx}Rvf44tt^VbCU7j zqL}A=ny1U%JG3m}X;JNCef4J*e6QilRfzQmo77YTT0Vf>soXPp+=Unauk#t>Y{mlk zhv03fE@twjIZgNC+JP%6Z=QoV7p@PUI1jF<{5OXA{QX3XvA(Y_#C!2;G{0HI^Db?1 zK3o_6?t`H?<9=`lO*yrTJ(Y20*S8Sg%Uj7!Gx?5r(s-XKS@4&q92kj&+eS2lBPp;#>5K>OAp1x;cH_Aihb*_vmjSzD37(=rd|1zC(Az z8Q-B-(wSJ>e}s=c)cZ7gUljW@xMOX9d@tL~zb5kWs$9n!|M=!J4_C}1?9#42J+YT5 z<`U|OGclKtp0?Q26#JRx(G%YqVs0Vk6^291E1VZk6ZH_^v5Kp+SiheUPkKD__ZOrWTPnGoMpp*Bqw&5Cu?Fr#o{iMUCViZj-#c-i#(M?k z;Cz@@yTw;dZ0W`JC4I&D-WHz3y9IALoKM$O`?&5`FHQLrze97J#`9vliAOEvZ)g$E zn{++E^W=1WgX2Z*v+^qDFuuld4^69*h!@vT-t7@{Mc&2t=SRf81@D(oQmuRqIq@gX zQ;R)xv8M10ET_AqKHKT%HRCLCmfBbPX)5+x@sCSy%!|1Qyp8i0US80)s#f5zbi`Uc^tjOTnV*Ad#{tizi45@#It;NxK!#)IMF z&qmwxmHa)N(#N;-eI*~IXiJ8_JI?nY&SDxbAMyJSE1?5@yVT5SJV$7pjcbs6ywA@m zp%?FN$bmP%nm&y8H!(j=dpp<7p9E4)4A1DNw)iLG-z;B;Af?r{IT0Jh4XX!_qW~Ak6OY&Q+=p+yI8M;>9zBUQ<#G1vcz&JI zHr{Ju4f(ea>&ScIsx6;`1+xKi;E8*UF#q#ydme4^ZF@5m7TsGy~yzSPDhN^cgJ!T}R@a^h!FaTg1FqNzYbtRgsow<*E~Z zbK{Er-pgpY1ij=b@oe{w*`FNNA6<55^C*I+&|6S+?yo-1G9*~yK zdXRXxzf&K(Al~oe-F|#+@v5=xss6oxy{E6~xMLsgMn2}D?`Ie*7m0niXN;rRhntj- ziM_a``550sK7-hkn*(oWKE(aMr&^f+F;7)UJUjTYM<1{7bc8V-zlCuht$COFWTWK!h`C(jP-l($n|I(@!jJu*daf$o^2?trPcHV zJpGNaq_p)(>iHjE%pJs@xutZ)nJH&^n>aTm&P*xA%a5TUJ;z`--sei=6#EgJ=jD7J z&H?J@r1*-f$K`U~pSDHtwipYE@s!%xqkXKKUR}!dgRWV0#dGFBJbNm5My%|bEZzrj z#hTn$j~nNHC)VP|I^0)rUcVN%2W{~z@jI?z+V&G;tjS%<`*t`=X+Mmf%lx`UPPf8k zXvwp=5a*)AS!U;;7=8cX+Ctmz;G^vzOUA$`g3`0c91{84;AS^)Rrxq>J5IeiW>pA_%fi8-a8 z`4sa>v1eooe5ih7ZYc%c*xxjrZ*jIx>~VSr&Oz^Np0mW5*yGezebf_Y>~H!8R~qrf z_q;)3jJ*g)Al@UZ;EZt*XT^8MGfK_fCf4x~dnx10_yu?$r*SR5t#Z1Sckj{|zu{g= zyVLYc=TliR-%nTE6Jn3*DY18zljn_t0sNYYqd;LAio4eGzQ0;XP17y3lo00^ti8(j zX*hm_I`rIqqjt~^M;$Rv;@e6%0@Z2T2}jlH6}mpc8M%CtwgWH{=O|hh;u#~Z1~?vo zNAR@GC4Xw+kh&TzhdcR|i>@Nj8cvjU4;JT2oYU!ybs9D3>>?Mjj%bj0PeM2RHN@IY zoL}KRA;yuo`tW@!O|b?p#^gt?Md`KACy()+^Dptm`+83vO`t8__u`%XaCX-`^|h8? z@!q}`Uke)Jc{TC=9`Ek`>5BLF_~sSw@Xs2bllhliF6O}_sa&(@dMBf6KJJ*md=>`k zqnOz1!Ft}MliSaX)ucG?sXz~&*5d1fmdB_07W2Tb z<9VB&SpRug&Bk}PG5qsqN!mblb=Qr)!_XUVIrTaejzYX^y+l_AylXTljdvlRp2PV! zJc?^cHMJ?m`2O)Mju!H82tK3rr;O?VX9tMy9{J(n zXe=YydQ`rP z@bW0m^f+UG*Jrf;tzL5Dt^k$cjQAVMQ!;tp4z=+9hWB|MEXDH|d{1|L&#q5vV_M6q z>v;Z(=gB7^*4A~Ru{?b#a6BaEuhA6GDX-A+J-jT|lG?`lho@`sgr@sojoc)mtp{|V zZLfIW7vp6ycA=}T_~LA>qV)WMuLrKX=$XUEQ5Dn+O|h=!(VG7|=lKcFN9FmAEbd`) z67!w${pk8R&--yE<~;wrSr&#y#gxF~|L8pm;an zO5Afg(O8jTl`0MV#--XJ?u&8yCOgX1TS9lGQ(Yl$|9C-KRJq+pOIO=5+jHb7fK0bgiA@)zaOKUcLY}dyD*rT7_ zW&XVuek{+i*0Md#>5{8wNSDg>o3C*WY4S{J0}j#Nh=;>x=xY zO7CJdpHv_5ov#94exp0?!!OXh34YU8%(KL~G41ikbLvUCJA=0~-T}s9Jg+96RoA(` z#j|QWr^a5Rht)$or^Ykt53mgPKAP_k|5LQCi()U@7J%=MhsS7~id zYpkaq!J90!j+D2b)Y)J3J}P&Q^Wz*pVjgJ++>Un)ts8K^D)x`?6s9F(bz@e&|Ds)d zi@z*Kv0iE;+^PLR+D3_Y1{@b}L2+K8C+>mU)M%WCSPfTBIXed%XgUaEaK1`MoV)%4 z&#vJ*$FmkVs;Sc<5PQG7;E3;T=W)b)c{cTU1$OZ0VKK$oSEpz!Mq8ZM*$ZDfvF(%J zr?tNzo)>6}-#(~_<5S2$$1x~~Zz7(1@f5-HF6_Y-`|-+)vo^GW-SiDqk8Q=;n!d|& z@h*M4av1k`cjEjJ-*I^?C693yKxKysNH0f=sma!Bx?isH+BgX6FshCeapq&f$<6&Bs;MvOi=lPT?v-=c|f-n&hXPR`tvlpiD={J0FhRI%hCwN^H z=iRA|6MRi@U52jojG|!$3=&&LW3mCiqZS&4H~yp9|M6Qj4{HAyJ=^Jsxw`XNaOQOX zEux*8{Ghn!K|EU_iLufUK@WKzuJ4%NjJb?A^u0~466^Di%6Y8OFN|jke?rsb!md9! zpWx3kkP=s{)lWv-2wt=5KYQ6e>S!lVbM)KQc)tL>c{`amd*yr#5xb$g_{xj# zgufp|`$F2M(;H`d%-1%xb~E*v)7WeYuhAcCTHb-@#qkCt=JMk_o0!k<%cuGD#5tz1 zXEo;YW8S`mzGKdQKyA+eVt5u}jb%se#%ni7oA|Bg1>&ttdvAKmlyX0Tx68U#(sEA! zbF{0e#wPOMlK5|tn-(yde?7CBM=_3O;5n|%6^MO;2O*uh??^}SYP_K#u3J-ZbR)a8|rnzE@dvhC@N6QGDr{uMvxR&v6h_UxDE#2XByiM`$ zfa*BE#Z{rWaV}RYX)7rwq$K$qPazz!uVMtu7FV2oyiRPL`BQ+dg1kM5<2Q9Rl}FuZ z8N`|GoENt&-M{%v zJWEc~E}j|lYI_gFd-Sdfa--c2e}8*=`H=U2#8ZzKdG!Cg{1sDo+0{y6_=Fd+2R3r| zJ#5S*YZ{;lJ7$@T!j4wOBBDBT( z?`?Ab0$So`f`Ns)B27{8mkTe{RC7yg0Vd zb{d+|7iY=DoZc-ss?qomG#6(_xg0}V{7&Ft*or4*p?}BAL0+xL6W``rsm-?_OKmj_ zb9r?VUlIBHg5S&OxXkNLyjlV4paPzgyq_wj_$IlkqOk{Oao#A0H_^7<`1@O3y-3SN zc!-{u^ZAtj7qS>nxT}b@MQ-;v-o zsp3wYk9RN4PtttIb>eRI+>?*}aXrPe3~K8wnzCwtyZDCs+lTz^$JuGmRZ`xdYv`up@shAEb7>MT3g;?ekZZZ>^1Gi zqu6U2`%D|q5PMCh(BGJj#JuDTJUR3o=Vn$5&-rqXnu@u}n3qht=UFZg+hFYUyY zmX52z$%mbI7vL?Xe&Y8}WBxtPbyx~@@J$lq7I~T=z6bEdTCQn$-r?zBF?GfBgP1al zsTHp7P)=O;&{R!qe-_76Lhaz`%d4?ClJKaDe_Rpc7xWyGt3P@4Ib9v_?S$O&v_hWK z(NeI2BiXYrTFxAhrGz^8vAECFTTT9$*YhZ@NRhGW@0Ibu|>{HC+)WJcIIP5ncNs_8;6GoJIUSP5UeIO&$IXy&^8St%h9Eb6NX4wf~zJpYiyI zY`oQe6U-7{c6wsH-2pl><5>>NX!x8jf5C%1o&oWW`Zm6JM_t9Ict6cT%Oc)(;cdL1 zjup>~Vu^2d|F?J3d_1~0y?oQLQJX5-{4Bq9#jyzD_v%i=dG!}_o-gA%2A|-oE~Xo4 zm<6-xh`kiCALL^`f5)4cSAR-O@tveuG5NqT0!N%FQc2sBV#q8{Kgv&YZ8Os`Slj*L zIH~=wa`i+W&m{8oFinZy>aME)=OEU9#Cpx?I2OPNI!4M*3I499BjyYS>U$fE)IPo$ zo|ET$c{`MbxbM{D?L;~1&EL2u#&xBGwy{6w`ukuV*SWa=_2o&-|HeIV4xYI8rLX?) z{qI}XxV|)O6wg&WC2phv-ow>`zZb;yVB}bSVo%y3ah-w*^wq_ml)fb}5&v-fv5&h7 zeV6I$%I|*qYDMP?zOAP9fWBf*e5U^PLA+}}XPmCWor%tsIEK-f21lG39&;r}wEbAy z^!`5f;M_^)H2UJ3U~>A3K4=Op&#oa6(VB(?Bg zlg~H@X*s?^Vrv3NU;z(L!*+c6jQ!Xv`YIGH!#8|m%DaAwb%DIbxi%?rrBz#-OymGKK{dx zOvcg~p45}KV-VM^xMqzISX{S?>i3F%Zchu%|mNBM= z;=O+VcmqGg@C=79 z#JdMy6}iYO?(z_0zJOSNr7bbu<6C`<_Za6f#`mlF8RETuj8D_oCg`l681FIG8_CCc z`PiG<_@FTvja6YJ{`!0z_CGoQJ-h1x-A#?DDm?5(=aXfOG5W^Iar_QqVKo@@Ry9+q z3!Hz!!`cs&;}!Dp4vocW`%NtmbKhx2%WUX~E7rr!q-Q-$Q9p6^PRwDJ3=Zw)s*l|? z%+r56HIcWtdlCFvnl3sH!e|_Yw5Qpgd>Y?J^z`6YS8eKxd9X3C0Af!<;@ti-#_A!O ze!tn6)cy(RC*DJFGtV9rV{iR`2u;;T>P<2&(B@>fus{F&tqUKHDS zh_gE9%hf(@7x25b{s)Qg2bf;k^$*uNT(M?2_TY{aW2{#>2(kZl3SGZILHsk-S06Es z!#@b;R-CKUKzuiTjbD$cgACfoI`s3}_SL4B+AP7RaeUebck^j0q!QZ}d1$Wf4tSmK zAE<@9X^L+q-|~EZcmrAS#rE2g5j%F5kG{H`ayk02AjHqzDI*lvoew>lWY zkFRLyK*L$>zo+9(ZJXti3vJHPaey~-3mTiWlvbO)_>)Dx3X3fVj#=VqT$|Up?!$Fl zea7DTSW9sg3gl6vxJKj3z@OR>^M!3_DNjqRzdK1!D{&2hXK}{&pnYl~z6U*y|8@L1 z)I?6a&qGQY*W=!e`wFyD1MA^_o~Kkt>G@Mw`>H(J2yrHNERv)l z#kEEqUX%Z&;)?xX1E3Hs<>`oL-JjG>cfQYp#53=9aXp6T`sd!nGw(K@C!Tw6;?v{w z#GZ+G{;jVTO7s3zoXPMd)_BFbuFa5G+ZE3QL)FoDVv02+XK7p~wsSCnz8EvH#%npQ z)-=Zcn7+o#`q0R$N7P6|e(hBk&++LA@xBEUdG#Sg?dQWk5Pw7bH{*?Uo_|6k8f&Wi zMX(a?!x?K;XNouGFc07xs6Gne`y5w0K6WncxdhiNIxCB{IRA3<{sZlPgaI@y%&EQH z#s1;X;eOiIK|eghTo=wmQygE*#csaEx8m(;> zcUGLq)czpeWyF;MSA5G@DYn(P=J6|@?NafoY`TA+@hlHOe2eG2c*cvf zW#Tz6zT?LJ%|2p|XT7GyJcsEg@vOI+-c|Hof8NYr^v!A=8tOr2vHgKFFaKkWQcHMByLaI$wa|~2eXbMlY1cBfx`cbh5_2kfweO^D z8hy{vcbpw~4r=H-x$)gep8kSl{8=KdL-;z=6W?m@;z<@fv9~ei_wEy8c3NV-V5{2d zK~J1laJL$0RnBv=_M_kwjyNYRtFgGAzcuB0s`f4EmF;7QC4R-z@&%z1%^qG~d6R!-~}ynyQ?T!}MsO5nH)u8M01J#juxtf$V3 z=NEWizT?|vO+53md8RW~VlL!Ih~Hz2b3q2mS3HZK$CHts(X_-|;4FM!K6=mlX(W_X{=i#-J0<=}P%4xADc!Ml zb&@Ji?4%G+4OIz_H3(%PRN@9?)XzSnp>hX>!l&*I;TuMZFY zfU0gFE=D`M@7Nj-S!e-OH7911n(|Arn6?*Q% zwbr;RqU~E^z2De9z{7Z+iSI|x(e<8d$ZNF3cfwsT-dLLou{UHooE6_G<2kq3K2=MD zaNaF9u`eWaen;Cxyzzegn!HSuhi*7;kc)|Gem}(CnpX5Jl=Hc`l9usa12f=tdEX)5 zRq*YDms~5l@~;NYIKRIxjU(U%d}VM|k&k$0OYFZGNo&jtpERyx|3&OsR~kvC!>jz- z4L|xH2J`CA46aA?y@Kl+P4RrxUM>Cvlf^lVfAMa3493#(A|1oU*hMazr*!?~`&s#n z@6Rz-_TxH^;}#k^itqZfv$qsc2l7yeZyR{F71va`xCAkWrfHH6;){Dra6UlaJ@j>i zVYnwi8u1o~&+$y=(R!LX)si#$i|49UY9NJJUKPttJc+e=agVPoj-}dc7e{HmZOY5I6YEnNsMlDd66;gytNAVv>r}eo zin-4!V(u%CU(ucuXZ-F(M;+b8pBmZS>)?AHbd!s=^uES}3UcrUyuyp3c$4slU%IQubhK~f z_m$GdjsElKf4%lwYseptra1D`Uy=URw8uL4STpc39UJu-YcU?uc8>gfq3vP0IcvPe zoI(w4&%nJjOi_b*w0{KNy%C?dc0fb5Q3Bs;TuFIanWpCIX$>En;CNTxv-ogEyK&l0 zgEsmeCjKA9UtcV@h^4=_$Kggk{s^P#Dx-#`(ltt6x>Xh<9bbtf?&Uw@yh(od;)?tD zXjlZ--^*j2Xj*x#fG_UrIdRq!Yuw+*;!E7q*U&lGwXY)np>S3ov5s_*nBSm#A^xsqPOS9htLgf!-FkVtowkO2sl%7!@;y+#-cxgp3;U-!NvmB3I`;DV zXISi7_PKoB!S@Vmc`0jD2T5Zyqm;*=>{>2CC)CJi?gwqX7jI-anTs^(pp6y>G+sMKM$(yfod|I zH*b=QSZ{L=yd~y8;1>Plk((X*dRHF@)ZA5GZqwKDq@Eq5t_9|?JGw_4jsi}ROA9$9x zg?X`*)_io{hVN~fj;X;;{5)XXrleyS{NL6N?3Sa%x`9|TP@11daK$==YvP?rW2_yB z>+^TKJt6NCac2|X1{%}z^OE>(rZvvFn@4MXUY4hGC!MwV7|#JO;*K?B_2Ip8{KK0{ z+)H>C-+%7G`4bFRf8%+v1J1!Z_1=i~baEAEU**DA245fTN6|H$o(2AHFfE;FsY^#I zb@MU}eT}mvkc8ihOYlaW%!EVYN~`@gm?@@MZ@FJBF2MDqI=rMwFS-(Qsj=5C=22q~ z^>2Ru_Z(`>pB~|RV%}7DNs4G+iT}H3xj=hbwbg|7IDe}#E%WJ!-<5xqA7g1~EoVE` zQ8WGD!;js3h;s$r7yny)U8qj`iDf#Bz>`AW-je%gpj}Av-PcT_|Z<`4(^NQ_hjoGda8#!D$^mk%hPS-^3-c%zgiDvWtq9KemihC|o>O>TS&R?y z>nFBMN$UDTXPkXnn6|aBDT99C zw(8?6eQXp*O8wlbJ`(Q{Px7I!IEu<|Ke$tW*S}9p7gMYyi1VZN!k_wycZ=uc{Z0KO z-Xr$Xo}Knsr#dF3YYX03r}`8>AUKRT#IgdT%Pl>y?+%2r` z`Hi--@?Vy|a>hnUx?a#vFMTA}$7GmEV>{Xki*-6wRR_aiCC*=sl{mk67|rGJ$C<_V zS25lpadz>&)!gfOT$dj+^!F{q_oy@ajBinKhH>IM)MEX`x2GBEV!C?x4B|V~9r6|5 zq0;l@b-G8@bdRkiXZ%T=74ih0b8@wbS2^gffa{#vh_gc8lcP8m$9|7@(h{kc;k5Aof)cgc)+WKnx@Go!D2snpfZRDU*H*iX&G= z&jNJ6f-~N+w!yt(AEEtv?LVROvOLBftF*MAMwQATa>VgU~>RZ?^O zZOF%XhddzO7UIo`r<7b}6LWo-nZxxCXUx;Qq6XIC`yNknJeS~Yz8;b{r$#J!2Gg7VN_tnqEMCaz?3)xoz+jdtc+b$(aJ z8Ryilq3IyLIIDJqJjZ#p3>ue!^Ez+!y4sj+h?9F$?CxJCG-ZF)A0a4k^}4Pr;c( zoGalAyhUhzfWGhXq{fr9BoAmi0guV+KVq#%(_otF(R4xkcl~|hEYNtqnkcTLYOQ~1 zp7N>)k9ugAI14n^AYD;Y$+RC5G4cBnEay+`V{I*_6#8GS4&uAhIC;7X#l%EHlCs)Y z)o!2~_y*3xBKqSz+xPkMGdzRiZ~d2$|1|PcN5frJ)CqqNLSDQjYa3_yTJq&5dVY|% zxbAdNSC8O}J$+5p^$@z^Ot-&i`jaQI=I}7YyV(+GDsScWaZ#Mp_3;(H{4~b=L`yyo zl@{Ui_;SXVIO98MO@0*+Uow5A7uS{ye1iDCQbb&d?<-GhAKz8tn@VAE zq@W?bseB3P==c#n=X-o#=?UlQI!4Qb{2zg5ZVs`l@f+xx192vMoPibdHc5@cvba~P zhZ%gUp^sK{eyX2)^%Kut4dr4y9H{P{;s2xSPQZSu+V|n#=6Rk~y3O-U<}oBiLMRjx z4aP`HsYFz!NTdjnh$zWerlLZF%B(UaQ=(Lc^8Z|q=lj0i=lH+B<2aA!SKaGe=XGA! zT6^!c*Ir+m9~W~bF<%sO?6F>)-TgC&T8U`_hVD!b_H~nhq7|85?4NPuZBJF z7~LaqW}rRJsHj2rFE}6I`}H`7$#F~mkA@e-uu^`H(i>~5gYd`i#9g5C6hHgX_XfVD zxH931_t{10++qAI;YDFy#P|Iy@2-5@iwG4&IyQTm6F=_ z);7*jdS0xtpWtO)4iRsh!|{+DAL8RHJUpOXW!^ob?JS7*KyR8Oa?@f^=`@eM`_p5>P3y2e1v5mnS|%n$GWca9jyuSII7 zs(Ai|m>*8yy9?iQavJ-WQuBT!#Jn&Y*FAi?2j6ylH_KyOU#p5Meh**-jtn^F(y@+? zs$#nO{QtjjOyTj(;`$B8WgO*s^sStAkgtcdpTX0z{7I(cU;f-n$8b3tBBn|7EW(*n z`$5`&tNk+GJSJE14n3t<;{EwsJl@Bf#Jlq@^d#P!|Hzl={7t+&U(V-ve;)hpC&5zQ z#J>Ce__m5IvG2YkZL#ORwp=HEPxmXDcELO9CnYatYExcra*5#|fBU1H)HQbFTek(! zTO6hM(v_dh=@_Q=7DHVBVt>IHaUB%bi}Lg{Ex(HEG4ZVB%>cERf`)N8w?P{|3|BAr zsN>r!xla-U*-0I=n@-0Fe;@CRuczl;=s?p4aFe>*$Jga0JcH35_ap~vnFsW}PWxW^ zjNiG5GnO)n{}rAdRloVO>Kp3IZ+y2^L0(BUB;dx)I&BR(k?Zi9w{bD-?TWI=%rntYl zON=AbPhagz7B$!5xLy8c&^3qeHyZ~F#TxI&&f>^VM>Xve@5qkvIo^?7{eG;lSZc|0 zZtW89%KoCGo_tM)ZE!Xoa1#iLUl=Tn+}QseAEH zP*Yv?(Mg;Qakm5in6y-^@eTHe`uIp6ujr#8?QP*5d3s8H)fDq({BNo6(ci! z6SWZcux=QfrF&=FZUkf_&&=KGKG?K5;eE14ViK{tpZ`OXR+$FvR zT3f@qOih0;XOBR95A+v(iE}A`p{pm}ShqbwUs{^3K9e#}8S#p-5RXREbiWv5&9^HA zPvUp0f+yC0tKb<5w~8^=e&3h(SnEx+Z_S^y+C3^yW6UE5;75N~hL_7=a$$45c)E+F zmRL%ZGNvKc*`}$Pm&LO}JfA^BS~jKh-)K3GH(y%g39{01R^HNxC-$aH#D7-ah8jDk z@Sn%^6pwS@%BF1wZQpoZyOn^>cXy>79$@jX5y_PSkt25+p{#M!%*%9`)^8tXT)&mysgQ(IhF)Xzew!`JxT zgx=!$il+EJe+^9|XsXQHWpDsr+;>+H+X|ews>vditkKYTz1Xtxr3TF8`whI=L|a~d zOu@5(Cp&nYMV`NfOAz}tCadWhYHzgK`wk`=<45K0gjh3)b%fYPtHlBQJ%DQkuH!t) zq5nc~ow%~eQ(uVhG-EGS?9J?y!<+$gwcia-$j$$LtGU#em?^%*H=8+VsY-h<9>n)J zL*(cuxRxKWH|GWM7v$#;5Wi_~Egxozp%4vov|S_i4s=h0)OaT7^Mv*VwExmLnuR02 zQ|ZCWF1R*8Rk8GhJJtS8ysRqs>C|A!8e)Pccri^(iSuEmtDSEk&WU*o=U32)FL74P zz2aGkGtP-wk0Z{CDaq4#R-4V6_!cwX7sU6N=V)z;y9KRn;8T4(B<9B;zROG!V`jRp z{x-9%e8*aG3EY>|=LEddwY!PmamGs%KF4{2cWS?guATJ6IWH5%`vv637w5b@1HH=d z5q_sN&U#6l^YWXn>(kmSt+`+Rx8bdWvz?g71uqYu#d{-;*xPm%s+U$rkc4j@eY5fX zR>iXfFPqc)I3H*5Vz#*Zi}?w)8Q-=Xgm}JtFEq>34fx-NmTLb^`a9_7IVdQGYeT=B zr`JzInkT{o^8N_!TE^+4x<3qa=#Fc`w!HF@9MmHSRS9^`_*R-X47XjHL(Rw>$|MJw~C{) zIIcd6aIk*kJi^cTm)#gV#jmT+B}|R~Y1pWb=KR_zp1!;0Se6@D7#FW;M+lG(W-bg1nflk1uJ?PV@b^EAsk%h%*D{ zx^G*K?;tS_ZRm7f8g5B!#s2zEviOodz4oLw0lXr#=QD~ zoW(T7dH=b@SW#@(&~yi`*i%s!-+f{&hbzweKQ9+?&i^2K&cTu*uB-Gs&HqD?0&nb5 z>MypqpT9A^`y!liPv0-III@}t=!@SBnLtOUr4jk#xd4mCh0Ja}alY7xgW)7W-;kvEQx=@7h6c z7=mND95syJ4(8S@%e3SpVr?VUhIX^c!uyc-W$bQ zaw~b;fagy-X3EtusKb}L@W!|2FY_ZC4bQ8I>q;1BIFl-PUdI*R$~;F;{BGHUIO4f` ztr)6{KhBycB8F`|i0_uJK5rtveM_7-(T2D2zAz`mnG-Wg_TehiT|3H^un!GV~GKRBdnO_i(t4N8iC1vBjG47rgpYEOE{K z3Dcvn}1jvTn+on73ww#OCk>lW~3ow(v%U3@DrQQLar7%w+5H$}c5 zHvXsaxg9@N!#Z4@@T8~fh?*-dt`<-Y=eztWK~v|F>Qbx=Dyf5N{8j_8M)e|}Vjq55 zx*iQ(_%Gp~gFoJ1^~cc-$6Sc9HXWAY>q29B8h5F&*qc9DtoQT%99&EDk34^ZU)SJ! z4VL08jxXMEzJqh8vGzEg#qziT$CGL+_6uF7)|W!;7nqJK#%{b9T!J(4oz%DVmdj+` zgBa8K>5j9IVjpdMw|@@4;cdf$>X0Xiy|iD-Q;hLAA1U_J#u-T$;ZGV~+?XkvKc)58j;?Z=9bL-&&P{!nC%9+;mQ-bGz7A)76cxx^x_Y`eM(g z-xXqxJ;J@^_B#Aa;8y%k!=Wnf8TE0OKK84jBe*By9nFX8cu&J^>0IZ;KT;nV^)X5x zFF+MBcY-QnzFi+3#r2n%;ydZ}&{Thm;3Iv+?+$ho!@ctVH_fZlszsccab{NQr{NcV zu2lmY)#fS4&BycnYt6s4;#kYS`FOv9-166y?vHWi;mdxtFhJh^Qn&qaz7K2UY9roB zcw^tg8r;{Yg}UnMRb!`#y84Ocd~(s5?swEzUfknh3U7uPn{nRGR+_uUIoHP%ztL$A!{M;^wS zYOJTmZw|$J>M!`-p)1x^`_PkETTQI1))nt)=n&e(c>zx;`pUt>*>KSL4sEk&JITWi z;ynnd@NR&i;?98kMYx;Zy!8G98P!1SFZ+P6@6cQt|4($rv*9v`?_gSqeWKV`6K`CU~!YPuCrPyr+u*vOos9;vHSQpPK`1@Kx15zUR7A`^m<~ zZXV4Q(?NK=08g~Pzwnjk*=lN}qIP9zSwcewwehkV+nv_^9)FwBv7Ls*{*1+9jQy{* zikPdli~GnYv>hftu_vQ0^dYZDD(&GWI;yLOSdab^S2tW!i*=SBFq(!j*=U0A=^cb4>i7d#!-s9W zJWKz2V7!DDLcBtOraB~Ki=W*QlkgqRa&~>$Y(w|MaxD! zZ{WBDqw#d7D}MJQmHNoV-@EImK^`xKS84qc|J)qvhEEmwG@Z6nkY1eQ=!$*ipWrx+ zW3~3X)Ogwq?%jDj00ya%QsSGhePTU&mA0`S{XD<_fLM=?wdb$&d4rf{LPz5zC!Pj8 z>X?&%@G*{?#nwWdJSMgxc+wU%KH+j1*AG6&eRNOt|0zvr#B?`a6#w~-Y*z~ZUQGY; zYG3?Ix>AT`Hg7gTl6G^o`w1?pxy{;U)@B=YqG<=z(YBPhlC{q%XNf)1@9Fi6Szy8YsK;iyrXvFT*=jPT`0dXqyP2d>BfU};)uOO_2IS>;)aFtl`QYE zt`+Y{)6;br|5G&0;dQ)E=nc=yeMY*b(NsvDhT?tz_cL-7YyH*m?2_~E#FUG!t$bK3 zx5Mch>tCFprvn{X<>f}GuJ2tC?=3g-HP)iWimeY%<2$N(+Aj@1Xt+&WXQ2%Z56gE8 z@m+=*H0-6JJKp$B`MV4AK%Do{vIS>ndcL|r8gO-lC-KEKKGwKCk?%O0BT0^5)-Kix zJMtygcVgdGU+o6d@`Jx`=I=+U(E|QH-jBs~FZLNv5qDRA+gx9-!HxP`2E(ek*75Oz z_VEo}VsF%x{-C}jR; z4gFvL`#N6_;X5iP-FPt@*AiZ|^Y?veSWUyD`hNyuO?!pdJM(e}ERfG@{C(L1h_vYn zZ|F1LmAt8KH*Ft+=U^rD(sv3TG^e?!c_}r`E8seH(1iCrc~YDgxk}-ISSxKLuZ`6E zi}>!XexGWU*gZ-yqKeXOFDmq^L(Dg=O6IJx#RI1AI~89=^iTXc|702@7O#46HJ!- z_y+7d_?ylL#r!;tf6#Rw&x+!F2hW1st`p*Ir+tfL^A{bv;C=0WDI*4Pw~>S4;@$`Y z)O20J7P-NHQ%hZGoIu+UT%~c%i9FEso*bMLSM0Bf`Q^B_vG+0d@n44P#aIq1!Pj&h z;aMYm3+OvV+cKVY!8w?3bHqA4pJyKNHKc7;=_}8ochHxQ1?|JyowNEbM+Lw`c@2j030;c&*J`jFt?_L^;+ulH;*R|)ZE+;NB^aT;d&tje$U#?Ad0MVMZ_!6*+*8H#tn_xlJpMHc(F<{+8of^nC?o)y-*0NmqPZ+?uvz`AGaO zb2pj}Kzs`l-h8bl{?%`MoAHTu74#kZ8aM0z49{!vVrZ!=-pBW4@2QQa)C1{Bqv$yc zd;P=jYOSU?@{6M-zP-4z4_ajz24_F|pjB29C?mCjGyrZFcdz!H1u5Dq_48o#UH{25;su@>UjhrBupeQ4YWz4Ow=v)=SH5#wTQ<9f3NVqS$=2S37; zJaU$wuVT1X&XyN7zDl^piDexaN!g8GPgf2X@rtM)+r z?fv6_zOiaUPey)KfYZ<#=lx=h>sT$d6yI*WfMc?;H%g<{yz2lr@Gkb@6$uTnfsSHy z#5;!AL$wx)@w1e42hQb|u?+0%}53&6M4e0qJ^Ofg} z2E3ZWr}!IPm(TH=<(*-ZI1}r2vvI{5-9p~4&S{?G zRjk)N!LRs+@t%U_Y>4%{+miXCk65pZ=g7C|E+Otk@)2`Jtl`CdOZeCdzK0xX&8@sx zqK~oqh_n6To5BA0w&SbF$2fbUImAG#!CdNwQTh6bzce}3Um3y~J zDfp@X6F7R~*iL`Eue^bV_+5Yt`mLkSgZi7yhvszWt)O3if2;qr+Q*t~TJ2-4IJbPo zx5lw98*9cFVU4%cDY1aqsF`O(TE%4DTk3zdyb4{w(&0 z6`=bMc%9j?$7>z`e}~~}@H!s83SWr-HSu@RXJRjCPdr~kD_%C0hu9DLW6Y1m+}q(z z><67&&YUQ>ah-h!j_D)zgdWmI?5W%$w^MMxEw;Fh_sPU3{$9hYcxUq{?)iBC_qQZx zh_Q?qTS8l?t1bsX4SIV(Z|EoXe;_^ouE!ta?-FF?#Ygy$aBV7RjPj!s-Rq&A+B}VS zKVQ!9Iqt7F@S9;&!(Mc zE-Imx;(Xd&^4dy0-K4Jy`kJMWCTcQqK5Z}cl#L&+@geqK-H6{jxK<7?@?j#*o?_Tm(Q^^rJ(cx~cO5T2p?f($&eQoho?Uo;gRf{l zET4J#vs@k*(wa#wAB6Jid@8SJl%h)?C2CxmYyWqS?IwqZ6fBh_@^;C5=i$6EbQM<9e6E%BU%u%nG6h?luNS;!4zL{O-{X zTydY!3kuN}-=oB{QQUJ(qw#xreuc(Z5A2U;C|zg8n@mrvf9=FEC6#$qoLT7k2uf*p zvpkOC*;0se;V;2We5=T_={$>Pzc?elZjw0_VqLjEu9UbcI`7@HwzpIPHcTX4Sh;N;Kgg;7o?!gz&OXbyADfQnU;=8AAau@rY zp9}8PJcI0bm%t=iSLM`)823PS@LI?E~6_>MN#!!yy4 z_D>r(ac{>N>uRyr>~uQ5<9nXgSdV*--e>taF{gQ*&e(gFiq_bFwi{yqSuBA4 z@4mCE_nU2{x2O15LE`(`m(qCF$Gwd1nSA{N_XOI%vZa{SU0da}NIH!yIw1FXf&A&j9}QSBG81x&R*L;Y!FYKQ}=i<5aqQwe^}!ZA<{x2)~?*5CgKf5Ezp?in)CF26&>R1MEb zHCIMn)i()DN^b1>W{)$zUK4t>-S@4t{$9@j%lb+bo4rs*@z3>&YmUx76G z%|&;tN8hZ!TKZe6zteIN-$<=hd&eQ(mp+Uq-kJ8p6YovCK)gF$klEjhC-Ls|2v6hv z>3`mx^5q%1IS=vvv?T`Y0@wd0C*$;T~x_(k=bKY2pd$_oNtEj)ca@S1#7vjM*FMgD329?HqzZeuAIt}3uV46$BQn6CLe znJb<<#6O*%cb8F*-SQE~Ybn=W`?er^Vg~ zcf8{timQUy7xJz>o;|eH=Ghm<%`olf%2S*#)eGX=ns2quCAKNhO}kisj(3VZ>ZlvB z#r#u-XUoMl7|%AoFH2Z|8F}swUisdmeq?hZX`c9(z6y!8^Z_{@>+Dqv_ zE$#DYFF?clIO2@BK77f~$TBw}SnR*VX%2 z+p=s6WEJDPe2=s1Uf^F|Jl%r_;+yJ~ypQwis_`x_O%Ik83*V>9U6(4xzx-9CX|$Nf z;+V_-7W}WxpC)owTHDv5nD(i7UzC>j__P_C(6m$?q{Np8S88#^eO;_c#~S-9>R>(3 z%F+_=ms``5&b;wEUoICj2g=#EYGIqXC$s+J|2Du@@x-&kJKC(#<{2@}i?LNktmSb* zw0Vg37kOAx{e8yAf%;Co8~vCMgXAflIBr%uiFc&+*@FE?+LrmuprsIUiiv0>SA^Fp&Z7yna8z1ul>#pt{dWw^_xz42l^;?w>FKfG1yCL+y4RHq3 zQ#2ID@ez#2Ge-?9S5IHjvJ=m*cpjFUwe;VCrvsiiS9v4yyK%L_)0vLD@WeUl1@Xi= z>aiEG5x#9D{j=KaOjo~()===CSD%A%-=Rh))0juD@bzx!H0agTRIp5p%QQ`id|coO@i`oR|5t>}J&?zs0OE9o%qgKA)w92C;W z3g{w+#%ehYuPghb$Bl(HxK}_Q`Fj>`1Ag40j-IBq43Gc(ug|epDm>l-1?hcM9!sm| zX6hmQ?k11XZGCvk`G3BND@*Y9&;h`m$c_eOn$&xv=!@vfjg?!^1xFK}J`E;v1o zb~MKO;Ah1Clen|siTA>L#d{oL9pnM=K9Rw7jowwz5oc;~KMk?>ZVKLEa+Md)Z))sO zJaNxkS-iu|1FvX*tC(-ncCogxpYsN7$IE+3?PqE~U3~R;R?9qaNbaw}*B4(lx`xR0 z8u?f(4}U|frF@4g3yzh!%~AZCBnQ{<8?K5nr~n5EeGGe z$Fqd@%L|K{_b=nDZmyWg`|WT$&b@RErK=p@$3uLt6~AMW7jId396HnZ1N_Fv4{-hp zWyM|+N4!tTrCnC-;vN29`p?3j-u!t}pL_JTpEtkCRqXY-84m0Bb+N>Eiv9FmS1bc@ zbks*TK6j^oh4wkc&{+M%xf5-~@gDt+@okl(?s!hg`vN?F;+d`vC#d6zkUx{>O*#%h zeOi8y_u1NhtnSj#vR3=K6gNax2;SAYBD@qK-6&__J)SEIKn-{QG9zKzO_JNDHr zp#2~mhj^Ynt?oXj{T^P_*T;K!OW~Zu_gmG~kG#7_-0A)Oa4|p1zgK8lFYcYNSlcta z>#p59h0VS4v62TZ#QQT1`NY;(|EI;35=YEc8Pw3r`g;pT^Z$glH){KtwionUf?pFO zZ%Oh%_ZxH%#Lxs!e8X@7o+)Qu=4D5@T0=+dQ9hwvW~* zI87&^ct!sWXC5*BTEpMeq@S+Ta#|8b&~+C7=jt#A{yTBsMq7HEE3a`~5^p@0T;%0u z+|9&1ill7w_ZZ{GR4wcuvvT3D*!@@vf*CAJfuY9uA0kEWNKld}G&D zuHrW;j+yJ5>*qJMf2*9e)YpBGMjh>iI3Mr^=m!JD5bp<{lBbVp@2Ag&`ufB;J&N;w zUZj_!$MFp3!JG2(Hh=%5x4ZV=K|7jftE)D6#=&F!7>2JtzJhqJhq$iop{Zvv{)>M* zZD;Tm*0!j&acx|qZB}`TYh(*v#&xoy_=kx+$rB_;4JT!(22T z4jwt&MOV7QV&%^fJRg*$gQhYSj9Hw|@_ruPuV8&Oe-G_w8p7x6#GD`JtZc>uWX2a~ z-jCC^rg*yh+mzMa3#zeL#Mw#Pr?hO=KF;8ay|8Ds&qT`@*r$Eu|CGGN-kQX@eAVQz zEZ=g|6KBN4*?jM#T+gSM@NI&M#=`4-ir+j=O|1Kk zg9i9ULNOZSdH+tlIrty@!FS{Q7FP!v--m;|e~x!o?+ZU}jK#k2JMksLNw-_&IANvA#(RCM|?)>jr&bXuN5wX6{!zwt((KZzt z2y2#DuNU7e-u(%?=qk;>Oyax?>hSR+$j{3*Fe%x+72H$G*umSzILfF-TH|WU!=kjt zH!TfuRTk$k9Lu!(Qk&_tHKnUMUGY8I0`23wluC3J;L{lGE{O4C?J`Ec1=NPN&p>7V zY!hb&F*X$6O6@yVFyDx4zj|tfBknOu8iNDi4qD=V@Ky2TmAA2U%)}9A=U37GQ%F(^ zu_w8Zv2&{&#vb6epg8V&;>uTpZ+tpj+kGK@-}34{`Pj3DwPc?)r!!SR*$N5t|r zEwyi;P1`SFmA1XL`4qZ}?LTLQ-fnCHZ_la}CC%MZ?oDE2qA3T;xv`c}t_+ zH!zx>ZQ93s#x?MRSnlCNG7bBATm{eV&>2?Iv|bM9sjIi)7knA`^EXY;$lpg0_kBlb zX^3Z>SdP%&jgCeBZlwIA(En_H+%C^O_?m(*agUcc!>TGRTOj79@_5F>6kOl&cR#Ge z7yBdT8YA(&Kr@_8gjoOJ}^tNLCAD@W=CE?CYq6GtTom0K;gE`T0)Bit{?P z5PKTV@F3Q@8{^-dk8k4t8y4U#hI1Cq*t1YtZGH+B`55cn@!er!{M;e##JGv)oftDu z@~}D&uQy&|%#4P_c)63lH4wiI@vQ%e81to8V>o|P6Sa7EPK^DunF~Luhga2T32lz* zyDfh{f|v)kXdmm4iQmy!n9dw37qK3BEnTrcu&5gApcZ01vYfcKilY^t?%Kz94L$kr z6nv&_r%c*IoIll*@3Bv>BhTa9?$;sKYxB?)-xfYDhrQ(PVf8)3_}Yu3gubh3|AzLj z=)0D_SLf26w;%APq+0kBhT|wLt|o96^2ygrynR(YERwel^p%mTv}(Qx+`yy0`iQmV z9s0Qu|47=F;2tTqc;6SlD^Usev-CEgwWL03!vy@_$mMK$->GQa>LWHl#xrLp+T%Xy zve;vf+d?RYJHCILmD~J=E53V+?@_-?77MQU1}^Ra;ybv+H*opnBfd**MrVxC+-dld zo^Dl%>Vd#i^ zCC$TlI|XWF5NlTB6kqJ+U9NUMg1d3&!MB0Ncz!OW-EGiD+u_=spf8=aZ^C3cJJLBu z4OEf;2jLbR@ytF-o*tm_dAS&gE3W^O#T;j-$9}ZO_|e!h5xpin#8C*ptzRrtWy&psT+8%_{D1wL1;ZsNwVcjo$`X2inBa^rD>8}y;MqDD1{@9INq;q4pmpHaI6wjK^*DjC9`(9 zU;!Nu=i{w-8miIEG{yDoE%8iM@3rZ=5oSQ_vreM#3%Hf8TgBE{Tzv^_Yuq-ZXE?83 zgZg-HgqVw#LScE2Z*dOdzKr`ZvF@ql9u{Kn_3hPZhrD=;EWuol|9(<~f z$I*C^k9~~GKD-=B*LrbJqwO|v$NFfj#plW_URo0Cqp>&XX1uXB8t*Qj5qDhsZm#I> z@I21Haq`en+oN=}@b?p8i@$r+xS0?8^qq-6=imwTF2?IfIp#& z81IADG{sq1u|M)jx_*VY{*R&O0K`7YGUAQBlCe+nw0KMCEA~ew_C-!p-!J1&?2Sy! zoryWK7ru{pn3y;3!<(GP9DzIL(7HHd&ioM4ihC90m5-Q1_u}sN-+UfZ<4@BWX9!0= zW1T3@&n|~6@;V})JmhzO_TRh?kds(1x;nRq#k&Dddo?{$+gKNxW_;{}G4yO#cSFSa zLGqPniu=l_DIh1QthRAJTzq?2QZ9DEQ`%3~Hm{g&*8dcEl2=`|-%iI#I7Y`S{2C{& zN!49j_&+qIIiK&D#L^~%@duyKG*wLHc=7=qsp&WX596xOn{VM>^`%MDSeOPAQ|QCL zC?{|68zv+8e3Lqj{KYfLEBb$$zw!O_GZn1$X}_?VzoVl74Sm&kO8s`yeyzUm*8XpZ z{R(kC%TN1R{f?l0a}AudUxGLE{f~Z6(|umQx%~Z8ydP=o#(Apglf|a(%;N3^v@fmi z_4+;_r%Uud)OdJE{NL$2_726~jyS`rG2I2_@*l`9AHR#CHs0cR^QiYW#@b=LUx=qy zDclkh-w3>pdjsyjtK!06-aPOajeW$IM&4rVZpRVtrLvg2cHkL^=W{%}AT6$Ca#RIZ z7wxBt^)VX9PLVdgEU0 zcYVYjfC4ne9)NiN-(P+*$xWVut_OTgrZ=a0i#-5)c$nA+(3!>`ag?TQNqTdQm|w>6 zq#WOg4Ie5jB5`uI~_ z9Om~uVu-owGxb|le?RIYhrE3a_wnja9)BtRr*H`EKYPy}(e`u5M`xS^_)~a5Z{i!9 z&h#GQb$eWiZ)^(5+j?Fsr7ORD-HGcR_yal_N6*ldmWFp|h_m-bsiSArWe4^13B>!> ztYY6+oG*NBhwEt=MBgrP*P(ATJg)}g+sq004na-YUR9eNX?mKT6UI*yd{_U*Oh=qq zN{J2Pxx6fI@0b54Y5PVU#r}TMsL)vEGYR`Ssr=hHvUgFWaJU>*OzdY&yN5qp&pNTzfi*Upqw%ETm zoBsHo;h@*U2z`Rgu!c%jk0%t%KEBoJnx?eaRE@9rq-ULEMwX`dHkTJWv14_~PDVAMK_27~^oPzh9i| z%2@oBUla2Ezhg34yP6PVvo0U59-sd^Hiz@?MTjwaninT|k&VWRVm~PMzm0=t#=$*M zNWVGtyHotJNAaj}HBCNZpW>#9a-;2?+Lq|EuQOiDx;F&TC(Q{uc0~ z7(VCcgXWd#v<(x-i+D@ZRtxV)yk%+2i)%(X*GQU%)3h8%4c@LzZ>-@M&WF2b+Qf@D z@wCGcXCwYY-v&J2(KStMai+niJSidPlW~m|(*x>z9KNRfyHmd}YE#$PX%F9PyM=~w zG_;`MIcz?JC|4 z5%<3kdoQ0+-{+wS|5j-~khVwUVk3M@-{)d`MGiLbu`Hf#a!_B}7Cd{3Kdtq9fG_dR zB^^)Ji!Yzpra_zu81K^Oi|s;wV^GZ=6ki_kHNh3{VdDMzdvJ)h6k;Au-!~BF1x}Es zv+5*I4P&g9T*Ev_Pxlb$nZmU~-;cn2`k#=O+WMWE-I|7c#P6|H!Tk%Qr2B8kBQJ}M zsmTAexCYa|TKo0l9j$(|(%TvOXg`?V2l%%f;=J*ibjNQf+>G~UJU7rc8&5BOq~*ug z)zt#M&(qtNH$!mWlFAwcZIk3V-fMNuMzj1J;_Es6v??HXxSNRol3bU-cS3AJN%|_C zI+u@%w7o8_+1kZ(Pd{G9n(AU&;#|WE<%|(A^`YZ!^-w^&=OEf=$`|zT$a)u^kp$FTO7kSG+U&fyVMQw&3v%MfgI?!{QqTFYq?b z2G7aU3_Okfev5dxPP>iTo#o3N+J4BJhm6At+K-g`)N<8Md|!(#);$X2>7S|dSc#Ip_<0aAXo^JYVIOyNK^gI;QYu7raYLkt#f);l=yA6tt~?s)hZpe&QWoytj+90pi`=3R+w7vSpIEB0gGU zFH^I0#<70J;$BPZ&oEh?bmQNvP*c2{a4Z+^Y?_y-kv#mn8Cv4(u14aWe^$P2NW&wD z>)gFGrjq9@a@DecT9l`ya&(>#189u*9lt_0{3ZEWAMe+6w!!;3#GdD_#?_;6BmTQ+ zk39hK9aNbN@(VN6!dm>vYGE<{1@iPZ{zH7|#)Fq2mwM>0pJC8JKTnBeg;>r(eerbQ z|1kdFr@yiKh-ZgUJUNAbTW0mlmw}K@JXfFZGFP8j#nl7864%w|y?i5<*z@&1-u(2( zZ!X69F8z4liBItk=N$gnQ~EJHB!*`A;=XaeTG>tWvNGlpWAZPaT*v2;w9V#iN^Rfd z!5zlYquLhNt{M~OH5$ zqt6U08$f7I#A{EF`qVsGG7+`r2C1{&gB(scgEeB70u zee`_I`}}yDz_qyl;(0msb7M;5i!ZSb+Kn%<1{(WBJJLDHI65f4-r|dO&^GcIYoL?( zJDP^M+U|#~+V0kWTYoAWcK zUugd=oWU_oULNCZWwDIr&2LauE&agTct3tG#J8TG@n@Wv) zMQ>jdj#`f0|fJ{h9xXcc+Q<)JJHK{o9w|eKG%O?EXUM z0shB5*pu`wgcSUL2S(5w*Ntkl-X@1Jzw0WgF&~n7I7luZOlyv$w@*gng4O{zuch(- zw&pjJ=MVV1RnS}BGw`Y_)a6%uI^sN$_vJm#)qSs&v8(?N#gtzEU#qEjx4i;7>8BO1 z6YsUx8BV84I-mIra}W^;P7;frq#*6{Tmyf2EU5KXa07T4_; zaK(9>Q^b)L*Sp$$>hEGd;qMUpPU2j#*h3iSh~47vZilk^zLW06Jx<)y_|v2l5bq@B ziRDgx*Tk_>?dQqiy33cD{wSVV>m^^A()Deb32W%2!t<2-Ho=&7M5 ze&9(b9KXYCvBsL|5qt&c+K=z&GV+0QpE|os->->hl^X4u%iIr({+ zHN7YExX;vAoGD$>IO}a(e2Kpg{^N4gLm&6xAF3|euy8vR6niKBEr2I-8mG8s<0(aZ zNA=JYUkx>p5??-gAA*`VkK&xq%dPmbRW&!zT8Y*l@q9+(!+aPZ4>7+ir|lxdp15yl z`-F$F9@#|ukF?EL&ApDcb;b9XHe=x_e_x-5!|LJ<8rJE53*SoeZ4kuSi+$zwu2TAj znrf~;45ec?#Mv)Di!Z(@`v!0G48|1C2J zE}jp?67>}O_ZQMVMxU+ZJD!D4N58d&SX4uY2T<_7j3HKR}*yqqg`)#d`p}7Zf#*1-ogRxPis3| zKK`KT9~^PNc0hOicu__i%lQ!BamI7RvrtYfJ$cwwek$YJ0ELDW1y~(3|J#FJ zmyXzb{u0i_p7ThkhSdkx$2X`(sh}2sAte&9py8$3xl|l%rVt`;?4QbX0_;+SfO~M9o#EC-FPh z-FY3qU%djyKwh_^VMRq=<3N|xfX8pj^IkE%jVJb3#y;g*bTp@9v-Yv>aX=h-`MQ9P zVH&P9m;6LaMRDYy*`zOfk%vCsQs+=KCc2xW754#A(XfcrfBckycv zzhVunRWb2GiIQra=I8Yn-{TjiyB7Z^!y`1udS|@fybRg-cP^9pN&JoFG_e=_f}H&C z9`NE~pG)^ex?}J6W_4Zx-v{(QxGRWE2;*L3|h5Sbi?9xXC{PpmzQA-cujrr#- znxDg2LoQSZlgZO-$hPX1Pq_OFI13amU*2ZMpHldT67c7}Kfc zu!4S$=wqlpZqr9&oPWYBoUy0sMZB@+=Rq|(-JopF--louH0JRFzNEu*4b64nN4Sp< z=b#s_U&h-;Z4}2H`&HZV9eR9&cG^tE}{D}9HV(Kz3Juh zW9X!h26(IE?T+^yD2F?z@zT(|cq1(0_uqW@7|$L^nO>a6+*Y2{z`2~}T5^<~pYfiu z7)?F3dkEq_;d&mlRul1DAM@HZeBFnyf%<4Gf5mXcHv*gG?J{)4my(yIaosPr;MyU! zTWY$G5Z}#7?g3yAY!lDeynNu_(1P+QAC=_#0iKP8@?weoIBksEc&B{>j;Zh`kJ@Sf z4;`s8`S0)?o_Md(QyyZ!@fuulc6vkJd?&u6a1*X;aTTR0)|V$hTK-I_E>?V_`5o_q z_K2yUx{3Ylb9uB#?ZG29oE)rvYPUfjGAzKiogo~^8KWqrOo&ipvD@a!6BD3>ky zc0KN|d6yo4XTE(w^WXR@;?JUnuED(p&Z+ysw0;CX;hn+%Z}GfP%Qa5iCvn7mXpHv` z+W)8?AEa*!j1cz+e0z<)Kj3y6uU8)*(%Bzhe20`pPU?&Q6@E6N?R9Y%SKGhB7~C(? zH&mV6sgIrd*g@auoaPVOo`X1_a+w@G65Q%78{RmdGWJY0q4h}`U&FfsZ+!3eJFfWV zt(qEH3Gv-qtOq5&cZ+A-B|MF1+?R1iEziUk&$#h?n|QV*A?Y_hR!AqmIO_Tr!_-f4 znjSG0ZWV9rkBkSgI6E-D`5gkE(=?BNx=v~cah6Ja!{5ZeI1Ghz@SL7`YUfoo^MUv# z;fe2O3)1ke_WpCyjq;aCJe$R{4^oKfEbk}DU40swYa4qin`-+kUp^8;2X)n6-|cy_ zLfgM#wYG`hIf%15GSl#jSYpj6aZX3P3ptBdxVR8M6XRaI_;O8H_*rJXqh^3)8Caa;x z^`C*K4WNxNlttSu>gr={Yv}VV#C>?2zi~#tPh>J5GwG0iXKNq%xQG5Pw2R;E8UZ`$ z-=*IY<<%DSuIL^Q&l5ZuEhlwx)Z@o)`U}ul(k8xbX~EYm`j4}) za zZFAr{zFvoO0t|_I<75&z}bJ+g$r=XnB#2nyJiN+P8*3d7YO}-Q{+tyym6jERPr9iFW~i z;HrtIEe-qVe=j9Y?a!p4M~$?B={UZnA8g2b<8!bKTB+;KwC2Nkx}==r-3Z^&dj{6f+k?)ZYV)1G0lY|! zKcyUw;$3ar#c?<0U+mevq%Mx)jOU8iVHnwa2e zPkbhPTVM^&-B1nhX1d?!@6Wurp0}%T_LSpscx$MYp^z2dpLDk4=aVoF;u-Z&4P5%k z#G7Au8+)OSz(sw=`-PkJmDme)yT0PNE%rpcq_6J!$|8oli(PrnYFNp91MwRX-NgTg z`WeK7ayUlNxCGK^bGKG zH6?@EgZMqVy=rYBUH8(JPMr^flDJoiKMUTCVm~GJ)OefY9gMfNTKZnTUdKNO=Shg? zx%l4pJ2CIX8_#oV#2C+W9p!(W7_WYw8%1knd}H|7j)zT*p)#~RBTqTS{Q!<0v~?BZ zde|x#hf1kCdSKLDyf|0GZW?EaJFbhd=Vu`Qdg1EK_d4{%*`cxi zP>^?Z)Xi?3kKh`p?JeRgPSY{*4aBhycBfDua+-p+thwE9$wM8rI7f^XaaO`PGFh$j zE56x@-%3ixa}$3wP3jI$sgDMHI!4b!V!MXtX|!DeW3=C-eO;OwYdcj;5Afs^ye*a# zwd4%e!eWGN#Puva*YWFP*g@A(XpA>6zT@~_HufHq%NBf3N!J7LWZ5fgv_M+v-%`}nN5;~st~&sL#{ec{*9 zSC*!J_+p(q_J_X?3*;g8hyOrl13K%`8GFPZ5Px&=XTvpBPGXOE-0S?n$9a4kf}MWqv_fr51;XGzF6ZON$lnA zgf}-$k;}$-Z!cjEQx8pHKg4e+#n~9$@Z_w;SLlInKE9!}W#eBwV;;@m8H10_#XSUn z?3ao);>CCmzz*@Aqy1n>^?~;Q&iHMIk|Fd=<4qB94lE^B zn98F*Jetml=>psfbu+Xx~8F-fHz#SO}^4@;0t( z#5FXhduR0%?|LeU= z`vXsNF~$3l-C{ZkbHp{se9(rz6!cx7<6b$t%%hg_T%WHW^CYXbe?w;8=7LMGRE%*i z_nUf&->7Xx%VO=P$xADJmZkkUZT`^b6gh25|Ld@vFAIo|``VoPjCpP5_>yNiXrxOtWq12LpyzG*E~tGfzQjAsPk=2+`^5Ihf3>}dD+Qk(hgi$bAm_t*w!k zr(9~K7LVpZC0eS&tMD8>M~taUVoXU>NnWjh-{D<67ok0_V`a>Va`1v2RKweiwgGBr z1i#`wp=nyVgUN6`&ps04T)OtqRb4*L!)tOn3fEFRsrg?I&-ZW?#^8(hC|Pl)!uKG)O|>cA2?=tJKeoKx}Kq)v~~G=+z?@jVHz!8>rR+8vKG1&t|b zjI%-GJGmzyTL~V~@>4B&kb@|SWd7&(w`2MJDsPTzQ%Fq7`W*oi)M-EM%JC@|4VP$$ z_jQ}`tWXPa&CD0M#Ptw=%FA7xbNU7ib;b03LG?gGyw`cEu-X*cDIBq1do7N*H)%@B z2`Dai{czOM{uek+S26A5{m&gdILzN#;RD28iErrm5XWyY!MNE3UDW=+#&rqW66yOqaVwOy<2Q8g83 z^~QaE;;h~{Utu2f3^ZqUVtf3>`*FUK3 z!!TOgYT_QCuHyZB8gaiT?l=eTHMk4!YDm2EEG@1LkP>&Ci52fWuRa4S=E4VXepy~z z_>%cGnpbh=RSVj_gV=lh3XTKn^c!_CpSJAs*9KxwY6*TdqcQfPX2i9ew#0ta*oPW> zP@CcF2WRoM;@i+naw*pH{EB^Pchl91XI=5V1fPn13a_f*%SPLWkOFUJcvXB^amMce zDVL;?IDf_W7ryuKtjmApS^rb>*KwL|F*n3FZ$HBhe%0dF%e;!ckB!xR?0u|h-kKrC zgE&snbToXr#@xgIF=AT=u@`cV9F$diiG7gESrEo46>v^2_rWS`7$KkwWe%(ad zcf3C@&R%%)7ze{}-Az}0akbI*-)K+MuG%~j({LQk<*XAuU7;II@tsiItHiuqjz13; z^-P2()^+BH>s1`F&%XqozhEt%Kj5qwKUH5tXevz8$*jgWt{ZXH;(44I@D)tr`$x&{ z@x&MB12=)E>Fba4V|8&Evh)2P+V!tW1MTBlyH9MFwEt60#5sU*#&cHfHrL<@4CnnQ zHKqHc-?Sg4eS7~c@1bX;e8l;lx8wVn zp18)9pe3$zag8e=2XT#yYg+>`w#6COw-w^5O<&^L7T2>PbWW%5uA1r;SM2{fho>NI zi9KL(enag4O6>jWfG>r3W4~AI@ybHaHIRm;7sZ^|?`3-b&$&md#Tt7w=Rt2g`RQsU z-XXA2%x~hm#~;TUO*8Sv{)Hyujo)`(2c6w_tfTv)`1i_7J+)I)ZsI(RB~V-ppF=Gg zn#)sfHPBz~%kVsL{l81@6W+uNEWM z9Ow7^KE|V1?`_5Jj5y+1G^Mujek8sfxmOJ1`IAq*kJLV%gC3_Z&VJ~?>uYf&8#kTl zSPZA2H$A_@e!jdbZ{NuO3Ah$_BfRl@=4o*bDWWFn`4 zERV0E*zbUN-xcq-tx$!6e+23)5u20p~|L!&U z#~&P#^LpxQk9v*0ChzdBFda3;nn8`lzLPYxR8aE;@Z1ZrzdL>_E7s{&iEl6u>#M8N z;#)1hn_(f1d+^`JzmdhYfivpoWBMMXZ4ti1covCocRD(tviM4?orU=FE!HLwwb`YDexW|z`2F#y!+2h3fqw&hj&GmwHG|ff5Z9`>hsh}iHH-0` zuK3pI6Jvdkd`_#SwrI*LUlYW$0p9bsDQSo^Fn-|GtfJ~jo40uNih7tTp2FI0*LDy5 zEpPE2YrOipEMKpRCA(PSUG`_VUc+%%&gzNhMm&8=xc?B>zEb88oGsh*ne6M;ko+YzOv#=ocYySy)_kk zQ9R#3oYT{S=eOgl%=2ORV$W3U53eqFaX!y7bylg`m34vmZYtIWCgQkyO<;V)mzAe9 z#hO53Js^|(#hO5TCzV(ic$kJbOZh$=uhLLW{~NXaC#SgO;%**|lZ)HLH40Y%I;aH^=W$cN`>?qf_XXLq8ZP!;|Rni>(mZ#-GI15kVE+eKHFh@+O z)XpeqouJK-_-WNlbt8Au24w-zsgNt{TIdapc{p0^dn_9Dy_+ZJ)96<0c( zRn&5vEwUHy9NL!fYYomHa5j>&hIH=6U5C!r`0L_d$@Ag*SODp1ZK{vaJd8cPzpB9+ z^ktbmT`H-$uzQD&vcD3mB9Bc!C1 zD2f!aGEzz^TPibAvMZ5FqD4Xxzvo%^=e|99{QvjkJ|5ru{<>br>o|||e6QE~i1j!m z&LPX7elI_RY)WO%Ash>;`B9V8tSN<9W=zAqCv2aS0_uk@01ZAoPa9o=bZQ^ zi)*pC4v4F%n0CMzdHX%`CcbOMw_e+Q!rUA#u#N`+OD8&HNML7_!e!ih;J&d z>e7`flRAXVYT_H5x6qUo*L{$Qze{nYFU}k2Cg#`SV{x97$5wPc&$qjAzlis0-uJ=z z0KJ3gd=^(xc}k{blv=or=R+XIeQp!)T=9OY{T}VVqwNYD&7qArqZYmqXVgJE+7?3d zY@UHMrsNU7SXa}w81E7FHI}Aq75}Y+=JnlQGpa3lyHX9blmFNY_7R_=KI06Tk7!Cq z%MCo*%bzv+ZN-pppaahr!2mpy#M7IW$7qRr?0&rO;f;CWuhrpa;){p$DLy|bhCF!w zg4=m9S^Jh^iLtI<{RYq4Z8ovxkBwV zQ@62qa0gAXPGJ~Lu~y+$npV*CBYzX?6_(QUj&`w5;qo;KiS-Gw{v_5Ybix_y6zYrj z=QRI*7mUNZ0RG7A-WeW?b27eTFqhXC;Bz(gB%N{IODTDrMDJ96brJX1;?Bt1_|AQe zr@~4)M0Z;JV|aOr<|Z^Zp|=em)8+E_`F-oiVa)Z%`4dYa&ee?bG-GY#=7_(ndpbXl z$YB=Tg?U;Y|DSMqttIyDMa|99M>{dZzP+fq#NNHAz1Y7OwU?;7s5O`4|E_t9H4I`V;#>9+b03aVPeGjL?3z z_OTD7oWNrr$idL59>&r4n0&2=lQ`d2UlZw^ru`v$zL%dK@)L7Sv7TskMfHH^IyH5o zo_f%xh5BBo&3xXy2lIJXS`F2OzVMbhx>4QqfKl*+dOwxozEZ;bwj9Tp{z52)vkyE< zUuF7Y&fvH_)uQcj^)y+$zlgW8_*&2wYl35aLW9tUw=~{DVvYOmEqG&%a7nz+Lzn8t z2gN%~yvn(K3~9BOw92doh*ipY9J^5yXkJLpRIgI5qBrKPF00wKNb%+{4F)4`P2ETHwj00U<%Ro~H$Skg#VW2(^!ne?Y z)+LZbZcEa6Ngr8g%T&`lop{H{Wm$Rr7I&--ew)_p_+O?swOl@$!~MmzbuZ1+UH{*U zH|E72rt?ku`tf{-cuUv$w|!!5@l5Swk<%XNFOTE-9<`94k85a5{DxO%nx2z`7}H6S zv+HSy^HO`#kW>FLulAd^PiVVIjD5v)y?A0TOd7F_ha9y02=CyC{lv*UyGs2pqbc_2 z#{S&7@FT9uwDhLoU5I_UoB0xZb<>M2_Um?&kNBQ?K~D0|y=v6mvU%b(5Eq@IBp?#acr@%V>^u48Qa45xmdCkMN+H*#K2}`8fU|a*`O+ zsYY*mh-Y@}y-hryW6Y+FxKqR&&*;Q>O+1q?@h|4Cwn5BaN~f$RAf^NU+}cvU6$BL0sM z!^be4o`Tvmf)e!X;r(6Ocje1d;@QWKEPNhBOEzANhVNhtudDImdF|J$iSJ;Z`fP>g zbx6U}6wkNfdJWgDVmpWL5?v3fi!t)|Dc)*=7z%sU!WMBoEvB#FZSkDOR|3Zv*UuDn zwJhS`OAqaOtH)JpsD&6}pG#V8_iMLIn{48!54Ct(RKDX}jt|vo2U=#~`I0B$$7`kZ zFQ;*i?}_T_SDQPviRVkqr~h}K;V^NpmxG+;-IuhBeTLg=dQaDX>@!@gk4xHCpgG2{ z;@vyex!j+h@8V6YbIDrVJ3F2{+7}c2arJPVo(1^k(6W$++hH6Z<9EGV`{&_u3 z@2mG!eEeHY4#N97-f?0qCLdoz33XY8#)axLpT-P$Vok{m+TNfklNjs3Gc?6HPMP>r3m#LmY5D(! z{9aMsb)XJs(^plzbMU^BM!nG$XHGrMzcF&UoQGdQoIABNw`)!%0m&pl@(u{k+(ry*V2)LXYn2VKE5_M;{5bo;u^rKcG~ZN@#1+BPh~N! zp{W3lSfhAU`zzFKGCU9Q-npKpJMqMt=wCC43$kk)<2&QDPs@w1VG@tii06QKl2Z6f z!%%g#N57xQdqMT|y*7iiX~xGD^v8JJ@3fEB_g)^HrMZ>Z)0UBYh;xYNs>v8j?nvhu z$S?L``a7(BtV4}6{f=lG^Ba4$ze_#GcWXwz{mAo2LMQCewz;-LwcY+do{iCOjJL;g zt&99UpnXn#PQp<@EhW}oUeG4iT*muR8hysP=2&kzTbs+*T>dWRSa(@d|ED0g8hELy zYel`@B#r~M)D7OB;Qq9{rf&y7V;t%*?wi$Uah`OAiE1SFg1;-SE_loGC5b1wU~xsh zLG0T&R9jv0G|r34B(9M-Hi_$b8o!l?DcZIYR{=4-0I>%y-aod(XmxR%wzuf2i)XHS zZ9~^~XpHMhT)Ai|BS&#IQa^eY(Nj^4wS#YQSH+oymJYPc!1FGiHQLA8(z9~(hS;)* z?Tq?p%j-<)Va2viE{C^GNUX%gv+gV)~ z^mNm18pOE?bL4UxO~vFeaaO|MG&F0MS^x84Kg7O`DNt0*<#-qGD&y7WIXL1vihZ1S zh^siBTJW*>;tb6Ao}8y$m+(s*19;V5+tm=?l%3@=qqx3T>m_m35Ls1n`-0+(eclhq;RJXOmbeb?qUU|6D8_bbVg=9E$zA#S@-4pY_)frC-aJIh z*AVCXR)tu*{T4i`9+uE{hPFdEzNfD-ZE?=-3^9Jit90rszDI8qYkZHsCf@iaT_kVa z_!noj#J9({@CX0mTeP*hi}PCIdo<2#x%`{-dwlUdnphJT>*2bKb1c4`_%1)kFxJC; z#J|(xjPb!Z%P`i%?XPUCM_yxHT&#(^{4B%j>h^2;mdS6d&p05z$#lJ%PdmP46Z021 zpTZYsgq6n=XM-i<$y7%i5a)trke46j zX1tfLUt5bW4V{1Ei+$_4#T;i!tl{NVVqYotI9FmWt#PizHX0z#e&GiuDyrp@#0)B@Y@)7II;&*Ffo!RAU%wmn|ok_lt z=<5mDc=!Rtn*B#JyGPL%YX{S*=iGdZbzIGH)#YXIy1q9#f1T7ztQ8w5#%^@Zr!l_GSP z*Z3Zf^{$Kb{kMLLXcz0|Ccw}6@#sI+%}s=6;>sYVSTlD8zpsUx#nzGUF*gxw=VI(B z1y>LFSS)c?={WVU8nW|#v3kgk^OF?s0B}Z3-FOtwm6N=gz?RVAXj7(p0GPr&QAeuc#P&iwddZD-^^vA**f^%QG~swBG(=!!L- zvA#30wsW%@JV4LSyuC?oV~#kkkBy;2Oyg4AoA|Mx7pr*Ml&0&&_6|MQ(K1E-3>M#Z zJ`EEiE0Si@^git6dwcw|>522Fs;ie0cs?!dU7d#CaovaGVflVV+r&8eE#io?Ph)I6 z#>Fqt(vFrG2mg|u2HJPhHr5=qf{L#HNA=&Ar*|+X=AQn9IHPVOL4EZ-7!JU%e0UE> z%z2lSo3{GCRo{s*)vo%E@zfkNSArNfMo)2m!N*i; zq$j3id87Oz)IHmvL{EPh%^ZE5Aj^^U1kx`rw_x^2S zxzcqI^BG5B952q|z7lUed?n=LYx#)vtD9gKj?*||KSLIJR%%~Y`)%45k>}^c^qQDn zmg}6fKJ8lGk83u4jd=Sgt_Jd2jIN*E_sVELALinC0LNAy-7Y_0@pG5j>MGU_e9b7X zqZPax$j368a^o36&nh|YgXe8X!>gFTs!d;K*dV^Ov~;K8M||^L)A2japW{2syMc5? z&E^s3@G>~@H=(UUy?>uQW%w53c2jAJ=TCjPOFV<(`4i8cn49?T^XC>^@f`o>IfOHp zJd9IA@f?aZLGiwr%)iI@SC7V+M>v8%)&q6HIh@AxauDl(w)1RWIrnaS6~z55-x6zo zhNkiUhG#5}L(qzkhv0d&`7tlQhVnEQ!1=mb{f3vHiuYmq;ylL!w8gmdFueEElp0@p zd{yZxBJNAt_mt1kJp2k4iFF1qN745?eX*xx6>az6>0QS?llR$pR+RTo!EHRcR^JEo zeGq<7Tcxy{0h#1r9-M>M@O&!2iQh{pE7lgU5vJ2uxsqp%ytI^;W8&OITeYmNQ>ehR zPHJroERf%~wp4p- zXv;_2UYt*gd7>H`fG@RtT$1C8#l45aNAhvFifdL*`>T;_aOO+r9*8F|o>;FsRGs{Z zrzMUBaF1G?Dc+9w;(PfSoEPM3L0Qi*-kpLYYGp?aKJalRzS{D<5MLku#qUy#g|%Yr zA_wt%b9qas|4N<-^c1D%Lw-Fe*6-k;c)zD@2cA@NTZgviGrQ;D8$sJMcrw!RGA;dR z*)6{3#kLk!;T=ue{?h7C&BXii6gWp;oIR3C+@r)iS$ZPh1Nr$m6y@o3nqTB&VVo^- z7RDFz(zoJVjB~DhRL50WoF&BBQJY0-I?i6qL*H}In8tIi<)`V4J#^QJ`(ru_xF$y8 zs3yO$eks=bzD?g4abJNa)-lJm@eCBzwhfHPO_NwZgctah&OK=-uA}q~#qlAIKJ>iD z!wEbbBgQGvRGh!iSGJySN3q4(4b$kT#rHTTsTz)0lWz7jqhLJ z7)8&ZjB1l#ck-)vUVXvK;=D?ngXnsmt}Afw=XLz9)K9PzSIlD$peM0@tPtN;sgY0U zT8pnYZ9CQ6wb|UOTo19HEY^|5+OhEc8EuF1xR!rUto_Wu>-}&7E?@t7oSs+%x|r{= z4s;$(iM62P`IL#bPr-B=Vmxm&&fWh06Me-zO^n$c;z^9#%~f|F!sB8nCWf0J{)esq zyr(~b=XtoDwsm4SMayXz>iYYxpcvK7NAmOw&KOJa|NgT+xtliM!_)dNB>v0SD91UK z&DC>h9;8ZEyD8eLnOLKoiT;;yoq$+Jx`NNK=J^n`mMcw?dWx$yU%$g0wfzM>ZT!P9 zxq6eXO$C5Qm0XL{palNhG-5F@OZ-kjyu&1Z zpP&P+FVcAVyGv#<$Gc0Mn;Y*f`PI>Q`aYzsHQod2C?C!uavtyTPr++64y0?7d}L?X zESv|#TSHxc!?RceeNvn1blgNkvcGS{>!%>G?m5mdNSt4gT}~5gpR3TZ6)ry$PO)_m&kmZJ@Oqc)WP-T5m35E7_i#1uFxB1X;0%A7;EFYF@8h{qjIp+DG@MkU z4{N)Qt|zsRwQcXiE9E?I)kmyx+XWZ!l&b04rSUys-H$VI2Ea&~Vr}s`F@MPGxPFf0 z(Z9IkEP(txyh%>K=fPX@nN06DIG?8RFuo`7JtPOSaV~_JG{ziI9e?*+Y251P7{vT! zFBqxa=lq%_cS-X9sQ-9JyY_0}FvOnk4m^r$J|q8!iSun}!K;BdW50JP*eAX!>L4A? zzL1BO*zdg;Um+X?wLJ~*h^MOdgVn@!h5mi!{G2RS9PzF+TMpyHlUPEYLQWI_zHDJwi>y*j*vs=b_~#Iu2I${z}VNP*DD_%f}yx@ugw~ zJdbeopkt0$a>!d#9!;X<7%efM(vmOT)X`qC#QkL~#N6c$$V<}%zAS+l2kM1uOJUb0 zJulNSTl-JM68lB2!!ra9@gt|WW@~$kcB^=DR9s(ce@Kq2is^djiemyjjl>Y|XN{|> z`&!=r#PJ4>kvOiFpIFzHhCea(e~p^i05MM<>)B!*Tg;D-=0&U(Kc)Q|vBVm+A@C-S z7^kTqma6bBEeB{=tIa}w3{)puTW6=rtLS{e&zQr+U^l&GJSvOY60%Man4hRm3jRq-j8^5ml}$*6!H|u zL(5#q!mFV)Ri!D7ybYAIILBfMj+pNo1Toir7-HTp-eC{QW!xWQ&abb!x;4M=Aeu)c z|KGe{%=z7myFcz4w8p$&K{<`Nzq{!CQ!bjS&z&^xg(u|WwaAHna^u_u%M0M<+aRbV z{vJ3B^58Z37)N6-^{`vp#P|K(_+w!5_L zz}vr}zkIENr{(NDv7AirKjr968tQ2`4w}%>ME{j|@R{~owX4L7<&c+#!LSn=(lMO} zF^3!b;|`1e53%o(=c6zbSA0)ih3jvzY~X8teDmqK23HUDSeCEx9<>3|Wl(o~jrY<$ zIFrTmBizK>XT`G}-lVMz&bg46r+2$v;@qBAct$0;zHq$Emt}nEpToc5sp7hL5suQg zpRW7l`$IJyYt*}Ge@y$Y#8|w#*yOf~{&&JX>L%7d-3nLYNvwlPrsr1q>L$L#+NUSz zDu%B=&)VTjtbdy3{;(Tj?Gu`$v9MVVyV5ugX42VD{@Utqy+4Tc{R`ycB>s{-`wgxr z>+hgoUH>`@ zCaYZ>vEQLuCD$3RW3R)FI2x&^*y~VBT-WpV2yfTRXFd0itHo9fN1U;_6h}u|+KX!* z#Qg0kIcizU^OcZUbR2?s27dq_y0$jv{rA~>K}@sh*+R={Jn;-}CYHY-h0o>aXbPF? z8ylm4AdgP+_+z=vk0-{LUQoyNTodQTut$E1iy@8ne`+7&N0Y>mEY|~R*~o|Ec(RFO zB%YRHNr!7ZJ(J+_-&r3Xn&3~hk_YD~$VtmhGz@_yu8ny1Ulcu0?6(!VkDKUwyqq@C= zj%K*OP%{hh&B3=&TvC(t63l~1{N3%p_z5bAZv=fm>tmmKo+XyY@lKJeN9gT^cMHzK zeCfyEhT6~O%~h_Sn2%TlWqEQNeQW6}AkNCP?Sq|ouA{FjU9o<+fjV20Rz9?ST8+gV z`1-Mr2d?{}+*Iq;owGn50AGQ)xoD-OZ=W$M8 zcX1t~E$$^{TnBM&=ccC)zWA-1#Cd_`)pLG4LwS`rH!u^vuf+K*y-jhpfnPJZFXA1A z^KW`9iZ{k|X3-eGA(&JC;+j7%&UM;0mBUxHuaH3u8I5bIr3*QEuI*4codpH>y-zM< zUv3t$6@$DLy^BNaNzaOJfZAM#XG7GJnEnz^>|3oZU)5>2hUZ=6|4FrUQJWFsnO05i z#MDgN_0W%=^n9Nwj&!uVC6@T!+C@_|`_+GgL6KII{ zjg{JcPD5_Fewh9^N9JsC`o!@zT%;$)SFTcrm*}}9j*K)d#F>q^f8&Zgy@cm2o~FSy z2kxWeYB5d3)e=v94_y>jQyeK(#0lAPb&>P(xVqBUo8R})*qPs(#k3n=QCzFx1|Gk_ zr!+Wkfr?@*roK1OyA^+|ZJnWy;bq0Ck1ug$<<&-9ebe%kUq3;t&tA*>4{*jiUn+6W z;ngNcqUkWNzo6$9-h4&F-QpTVN6d>oz~777U8~I>&{Hj5MZ;@qyg7g3jF{Q_j`#LB z@8m`r^5H3l=UIIofjDEK1g<9hxubx4Mew*E9>Vo~G9Se;3&$ELMNc`k+zeMczWgMP zO7y%!N9-ecA4frL9?>SR*ptiiSKY+-UERvQO~kT~zoTlKgK)jqkgMTvC7v-bmmfX( zaSR$}bnl~YlA4~%+n*uM?LLbC7CG!xLLT*V3*K1c*^;L7G%dv!_t)|`68G3s;){Fh zR&muASKL>}Yrk1;;@+CLuP)H0pje9QbDf;VdX8_j>F4iz>9_&(h?iZ#wr|4BVuSIT`} ztZ}yN6YxHymX}R*k5*rq^^ul`cR?Ncv+%GuKOUm-7``R=;m*(r{=^BgH+Nw2%F9_rhr&YMQhK zTKfCla6)Vy#1(rFn#;*ZxrlRJR?5LOYGACmN{i=n?FVaLk8fq^s0b_ZbQj0lG!)i% zPCPf_i8CYi;3>|Vw(uLi`8fLF=+6I-)%vaKD%O==#gF;Hlh*a1E?^Qk9&@xIm`cVqs%%-FJ{PDY5CfUr;GM6RyrET5~z)*jhc9e z=P|yt8sB61UJ>udVm-v`bv!-*1LZ63dlPZrC(d-ZSGqrZhd&eF;`{L%Z70)myEv!w zJC|7FyQDksw&ANF-gluS?>-Xmx?1iD_y&k|E$o$pHaOGpuOZ$vxm^qDVioQb8gHfX zL4DLK<(^rF79Nh`--BWw%EJ;gmVt%!#fzvUZL@BKIFpN z6~^FvU))Rh7V~>iqYe4~wl>?e`N7{8XGB37Zt}N_U&lX-_s<@pQs*yY`8(r-NdP@u$k}x9{;i#-3u_X*a}+cpLxGI*t0LsRB(Mc^B*V zzoF|PT87f_8;&O8twqb5xYmfZg8XHu?)j%4hCuM_r789mU4&M6vZ;w!C-f-)YpUld z_;%p?3r6#m@$_%Bx~Dy{{JHTP5yebs{bt8MTjl*q7pp`&SO_;~sYT{p&$o ziF?=?+Txy73y$;sC~Z6Gxj_zNzteV_(&LQ1U2*@u{N5e+?by?mxNl#6&(>|yb9mm6 zx5KzniRT1Olk>Yi{9~L&_$iMj%26{pI*sRQu|2`3H)^_nXBSYn@|_b8KFYwV9jnl;zEh5bHC4#W?|IVqIpelgUk6tj%12 zYd>8_pfz3B^ZrXU5#yV&Rx{RU{)MxuxMKc4uElfs9+Sh+x5IV(yE=U-pPIl`m#+JZ z%e%aNp#4SdlK8Ptp7Lw612+5nRr-(LJt)VY4*LC=AI-!Ob1X5wl)~qwVp_rDr%;UM z(N0_ga6Kiyjx@X?XXW(Ug)cF79_RMu;B)MykF^Ie{_#7+o`~6Mu{N*QL+rDO{WXJV zx}Ps~cpc|L{DJQ#Jc<1^`|)k$abkbXePX%~-{W+}*+3iVnncfYJc;+v;W#pjZ7NOI z(R7X2MyLEcrWs?;%gWMA*8wrc^C!lzQ>&?JFbMDDdU8!$M_eyLW!lc;j5B=}sK@w@ zUd7vWalPSM1k?ETD$eV0#F;)bdA@?S*xU3JJW1mpX~jh6oGaWH#at?v_ZfU!VYC>V z<9!r%^KP{KtuCn+9ar+`3D-z7KE*S-ubii7mzk!zVjM!x7JBOP zsEcZpbYLzxKncCruRMkXK$ses@x5DF zKP`B81ou$9wefC{=NoXJhF*O5S`AgqME@1u`*ZOBfBcxQk3M2}3@V7BzkXKnHO{I% z4VCp#3de!e>XZki<)bbS+d~7ozI09Z_V-&L_DpZprV$@n@ZmMuYN?a7w5@}e`59}Q z&eHRspm)^!_Zhxi-BiST3aYB@Q#3YHKQnn8&yg7KOhey|`g;OK>htomFuoA;eBAL) z*qDzu(>VbutHVFtLvF@5O3Y*Vx?Q}F(D^Hk$7%dio%~H(tcS~mV;-NX;wei@Dfzfo z?NyMI+-mO(9bf2wk^bKo@2hzJP($s+b6mR?VwwzVw2$?HPt(v*JQu{VMcZcjo-K}w z`P3`Chi4PNAIGs+PWSMx7F|E6y&Uq_80P>yQG1EHD}`%C)CaD+X^FaPq9#6pFN^P$l!X6-%%V%Ls_}$1~2kuW31artk;RN3}emCP1R}Pb8oR_7F&$b+>G}XvArm^WHoe+_~IUNhVSe7en`G{ z(zyk1Zk%&yyjKmywe|$Rzr~j+wdV$p7UO84eFp7@K}q>9OIsHnR2TbfvDd`cNbE($ z{1DF0uA2k=YC_)x`kLcigE!94d6u>qJLpbVlDa<3&kSPTKwr%D##*Ij_L8c?Zx!1W zJXr?MRiXuE!fvtL!_(Ne`3w&q%||mteg332KP~RNgP%V@UpblyP33)t+MG&9>{q&y zkCViZUjOs-`8{Nlhd&_|o^;wChA-4iBRS5`i$8g~hW01Z>K7V`p}xE}=i^2C=Z1d% z#aS@%8`N9GkeZe*+W*3f`ucuBKJx0n3=f;p-#)jvVXpRdTxVZs*FgWTKz8k)(|#=s zqvc&%y3%p4Tpz(Tw}$$tNtZm&=j|xhTdaMoi2H8bALE#>ZAR_d(=bNcP5c{8OLJZv z#uLxY*z<8e4qg23Z$8C0+I~DacywM&|NSN#g|C^qOMILCi1S{WqV^KsW*yY=9C%T_ zn&HcXZ=75Y;`MoWU%W^7U53ujAccS@R`;_akvhN!<=dH!amf8Xs= z@hsj4hv6vBw|EcUD&C1W+TnOYyv4;EYYFaFk6m$f$MdNg{*kOx{%fe42eiNZjM10*7Uzq`*`T#(iuE(8ac-dPE-~Je!*iLY_Vm=F=UJSw zCa=6Y{++HlxVOM!ns&fFbS;Az&q|VyQE-%x_0xLa;@jlhYCvu6=GRs}wZ!=juCq8| zU1?%&;4|%GZr~Ke+(7(KS-KWNXPy;Pt8el@6~4&n8*(tgy=)OQ7k`X1787qv@fM`v zBGge=q$I5nV>fzMsNMV2#10zn6;m%dQj2K_Y>3#j?$a z4e!G|#|wyY?&OseyJS=&Y*#+RN7q{OF7020pxq=M2QYlCrrxd*FRuZihSR zDv7TWzF0e%iw_UU$xQ7F%f%)fZ}ahj*zVK!GyLl8ZjD#q+HYx63P-hdeU z-w5$+ZxZy1$aHGy7y;( zG^eF2E&lnR@36G^#?W;N*9bgKaNJ5`ocr@Pobrc>^L{q-x0!mIUC#Z9N9F1I6IYg0 zV#4z%EwQ%ZIGm;9GoCEfemWhqV4pZMiSZ6?zvN3(`G22|n4{^$*Nd=+mdx^03htmM z7Y*^fbF-Xx&^8@^ZW2=`?c?3@8?_Vr$PV)+){iU{$K%>f6~hu3nL|8segI-Ue+N9% zX!-A&{#eT&>-QJp`jCcC(t8&2^ky7+wfjh}8fhDIs>9^=7{orjZy>J8>Ad+o^zh>a z@oa~qcw&$3SFnmFgYZpKduPNGXGx8g`(d@08X#dx3i zV(r*6oI4{f_lQ_GwgLXTZtQbDmy)Odt{Zzre6e=yTb}2{ms^ZAX*&cLAQkUEqp`l+ z)sefW=<8F-wZ`u&w7XJlSJihdX+KJ?_Ci+u&*W`kHNB2UAByW)_p5tc1K03o26Qc_ zHpNs|-ao)s7FQ8*#5+@3d42;DzuCM>{jGIvyvw86G?Z6A@w?3jN~%*Fzv1{x4aB%j zV$5bRZ>!K9YY*akpa^fy!%Dhh{XsIG7`utJ2QhY&SaT3#H~r~}bqCvdomg`aAG2p@ zn~858j<0dV?}9w9ZTuE=cDXMCpUK@gy5gPpTe{}Zm4xp=Rre8m@vb=**IUrZKi$W# zE_ieCy)VDpXHg@#2dl5U@b`o1VvRj94dpPN`+enqk?XcQj=AFeoTk^s82e~mq%GE< zcA%xCzL$w3v2SJ!k7Mm=n#dPKe;Xm@ZQ~o}PWT(P$zS~LP9OQJ!S@UJVs5Lcdc0d~ z@051W;QI*oq5J8G-`6Rqc49qGYFwS^i8VbVaUG%Q9N!b`dM;nj6Ki>59nUj#U4U56 z(^(F)@g(Y~4o?o@$u6dvaV4q#rZ3JF}FRLu1n&q%In15+}6B~eYp+v@t|1Ci8bCot`OhR;Gk_3O;_{m4%bCi zH5zC4WyN(6*SP%u)@bY}f05Sgc;?F4J~}H@Fs4G=-*O&%j8?-_uHEtQ3&guZj1m6A z^ZEHat8m1(MZBY}cHP#ZV~!d+BBnm{oa1*@?f&9<12wQrOmQYa8eT2aZ$UNLn@118 zG`08(l*aQWJcjEUezoP(owy!?CgLkfQ(>In(@`B~E_rLhpBURujOE7|evIA6`4lmJ zAA7OVYWt12`f2+URHSJDJrlKmN*y)Sz6HDr=fsthzJ+|bq>dWmxkV0dki%p0cLLvc zHT)ZVA$M=6iG6hS#Mz$r>*&fO#+I-buEzf$-#4m{wd!<({H2Jm1ip5a+;g-qsn#D? zN7ZSnt4%>M)qx?}9fnw2Q&FzJh9dMd(Y`I*12JwsQQh3E|2Y4DvE2WV+50fQiqI6# zUfAI}`5speI)>p%!Sj)LUKG!Ju9Ns4?BVZUlcQFASg+4}6x{Y=m??X+iss z@E3o7t}5R+^2z%ph&6P3;4XfDit|R=?n~z#QXRenn|VHso<@9mnw}UhSXa>d6z)m5 z=kfJ+IXb9KetB-glXNtFPE%zu98-G(__&Ub4O6_Iz<&DH7gtZ}_#w!E>o)Z?1>b%i z#k#Szv{tL_9htUzYO{wvUdLabrnsk#7W?0{ZPiC>{Bdq)R(({(n*mRZ!xj>AF`fzY zpLgglv}vZzM-b~g6YtTNze8WA7UMnoO}UPD>23U)CFi?w#F-%bam2c(!8|z+u}5Qv zzGH3Jt?KYws4Tv0Vwy!q`ttPP`-omZH(8(*h`Gr#@I_;@g&A< zWBet?ZHv(pYZ4xSyVc?^5bF|B;k_uAeQDYR|6Q99zcoKb-bUyn)+nsjN32swW_YYq zXw0`*r;wW7Pk6V4ck%6A0Y->B&cj)(ZsRPRpXiPAa5{-M=8-qk{vqxQxSz(|MeLWK zjgz^iXJu{e>5uCvuA@iwF%^ELKdz_l`WVaG#2I^SE2>XCBl!^L>YY?qS=H@0dglAv zy!=}PiT%8(X`= zZ8yMg^u>9Z*YGlNR^|wL3edA3o~P+&In7H;YFxkN^?VR#6ZfEjYUeQIcK!8+$Keux zTk^IijKMz;|AT6>6i;KUcnz%;)r>SHt>)w9d(-FA9%DDLH$AVsWzt9NO&@|Mu{Zsl z68<|rJi^n&9`)FRpN5x(XniP+XBh0};~ji_LPx3ODjN^m;v9f$we}Tx_z+wv?)7q> z*5A*gCy!X?%WGjeUWUQ?kM+N?*J@vi>%e_wnD!rP7i+lIL3O!!MtsY}){S?|4e#bJj2vc7VVCUWh@=lwTWkcAsS-8eIsp; z^Rz!LmmuyXv9|3J6r|_c`ravc^R)hp<7>vBY&a|ND85BAitilWvvfR*YbTD?v0bxc4CfvthnO0FZ0WBTz7rxh;uz-&OEdv=F8)Z{X_DTjH?9wr=Tev zx55qLxPvzvU@(sOE{Zj*1>_|K7VzU4a<;lQX7Q!ExME%A2lR}l=XtoE*PF#RUVLTg znB@Jzw+DULHdt%2tR%)^yU`(Nog4LP+hqWvB?1aBqtgxAmW ztR~LpVw|OxkK-*?)%~Q7=K#-!;IAw9S;ZM=oJ@l_-y|E4>O*NfE8urH%ClS4L1mmB zadzU}r}qK%eIMTC@>v6K>>v12tUGYVeu4N_Istd$`Wza#PJV_oxMJ@>7J2xz zg7-3c-GwhZz7_D9>o?wm;+*0mkXe3WoySJ8R}pW_V=abxa`LHu2GYA(Key?lFU@;s zZic^pd79K+cRuXkL-XpcN8HWnZN=vva-NshamL4c?g{&OK8q)tV|vkeGM)Zti}CAW5c|qzsheM6ej(cFj4`V?`y|eKKMk=KCD!@plBbxji2F@5 z9$Y8(7`uu!k=Ka15wyl1YbN?-^jy==WVKKhcbxMy6X#W8uP*nCXse1d&fMr$k$%42 zfoCMl$J1GCF^;!F?w?dsU*Oq8>!5t@BY3{VGZ#lr`KV7zNiqJC#2-B4Xeh(0*4oCm z|2b_2tHFw5dqBJF`oEg*^|en!!z|vHrQtket|UKl@P^pR)pswaXE;3vp)SuOo*Qs3 zhWzroNIskKXgvH1=kc!M`L*I21P5>x=Y4#O#Q0=+aW-1wT(sZC zHiecr6YXAYv(oVhe4qyY$faNH4#M9&{^$2Pw6Djrh4Pjb&nJ9qTbu@-O~ds%pPs`t z$2}#!1Ez{`2AvgYTrAc{_#e;5cX<|L0-K==z4gT&^ERhxjJcbw;_r+%AI}+kN?cBZ{q!xX#Mk z$NJBrw%>+tDyT17>ZtRZ=s6?C3wRdN)D_ogaV?e0cln-*{+R2D^A+N3h2PcE2j#@U zqX*$iJlErR7xq;59>uF`v^~s^Qm&6F zpIf`;KH&2ywQxaPFVOP?&YyUFFU}%#b(Gh?a1O%P9p62?UdHEj5N9{NMdwQV_t7}7 zvYN*=89s-i;=Dzi8(=N2Ou4*I@Tn!A3u_P1CFK@JbsF!2%IcxI_)5^1hptX= z1zk18Iuep;o5ueIv~{KD8(d}a^jGtp@#N-xO?t-QIzm&db#G12n|K}(V{Tfe@aPSm zx0bu|G>w$=-7pnL2^`Ns%ooP*VXo7@KTV@(+6K9JcT-yT-OT22vbyH@{sw=4Nkh+(G~ABM`^p4Pl^3ff8ykmlm znaWhkYk;p)`-=m@%E?Pq`W5NkjGl!IY>YrwY!_#TwU zSO?lZ;>8{7Kz{)L{J(2GVvR>R-1F2!tnYY&_lb2Kao)f#K5h~7tGK4|uCkb`^R6TO z!M|AZF^qpt;*GT*8(^jy`BMC)cv%U0@*s^qrsQW*hAMT7>+B} zl}xLzO(yScH0>38VxR3!+K$rpHU7GIW8N{b-}W(my@w8=$aS8Uk;)PQHSMYN3?+o~++kbNdUgKa#`KV%h8-+LOm8c-&LI?#4MxO)ZtD z55&I}uGY2*z13)}rfn-ItbGmbhiSiwz79BIpUf$^%Jp)Z&JDP-(6a{KxxPyo<$q*c86j6L-9arIP>D;=fG|B;Lp7;!V7hJ*n=0 zhq3hjAkJ8?_Xh5RJiV2tvF{-p&XV|IjdGjPo_%<`9r;Xyjm6wO; zEkkc*Sf&=P;l*e84?xVhrSN5q_@fRchuuU+);@hY_Yt0rhC9SKOP9`M*Z(ux9f4u;7~|fp_1#y0J$SYp&q;_mhB%8coxWqeRl8EI zAJ`+VxwI_eReO9rpf=87uo9Nm)i#s&Cwvdme~ecz<)jUFC%IT4uirtOD_swF7f3_z zcjeR$tp#a~`+ouX?JCxXAkLD0Rm=@(eo_uf^J^32bf4VC=xa3$r_eZ>pTEH#J}k!9fyOWB z+fLu@;w(+m5be{^braN9Bctf*@0xCk@1**OHE*$ot(-XTg7R__XE#iS+i@)vXLla% zhUWCt#5)CN?B#llu35NZZXot_orSw;JR{DM^j!;W>C2=ByNUTX{M%h?pV4p@!ebF_*sc+7GYh8N{dfy{`lCUigLQBu(+2 zUl~U&K220BCkxXl#u;k$Y8s02s;-=V%lE=+rk_}^=6iOUhKP5$oUXzBrfYVOSWnUw z=dQ%s{qN;6?qNq@9Ze0jkME^55c{W|pe^>Fe!{Q8G$qw>PopO>Ki$H$zh7)|{>oeCkG=F*hA^($~=#^U^UNoh+v(@T{dp7fIVwyB_EXO_gcdNK;(vv95cj+KP4R zu~s9!c)oWZDl4AUG!)}+?5BPilGE`;+lzD!le6R6UVeV}DKV|Y(UULneAok5h%3(W zjx)T|WsooZPJmaTr0a7wEXnEHOe|UQ`+GRTpRZ|}MN_O9%ZcMX?YBZ%c^@mLSVP}L zEO)D?<**8#qpuo$V{xYA^DH%$lV7KC$Jo%gva~>)VEl} zsGc^+QvoqmFGnvO4b;q5e9wsMB%U(5rzU&veVqf&E;=UV7 zcy{o-B3+}^jS&C&ox~r+6W;|Jc~D25@@l({4@u&i<&UO|@m?Axmd2r0hSG9_xYpBh zmX@Y+-i5!F=;%SmawthhoJms`-(Y;#$o*=3o8k4i&hSp9YY9AF(lyDmlRR68^B$Zj zG>UHi$r-p!wvQh9%YIM=HYZHcqJ z#^U`2?@GKe9}#DIjTPS|$j_rul{|M~0FV0f_!w`7h~+JD+$D}=zP5*0WBMt?8B1ev zG|)cQKgBh%3P$2s#;0BCW^@hQ_@+RtnXgG#tivrS-&G*qQ(~NJ3$K%+p5!ZsT;0p> ziel`CZ!`4dQ9SeC5AShy!PQw!HBn0~aQ?#koAITgcQv01tD#t_ci{Q&UiL%s5My7<<)EM( z#J=_+IA=kOJH3Q=mR!Wx)0pi4jyc76Q;aorqBq8yw(&E@oPOh9XM9<;ORdciIxayv z-oNJW-=t%_>+NU0$GHj%{e4xiqIoSmU3#&li~M=>?{K6KOmG?byKz8c7>*4t_yd$Ln_9PbgGhI{CbdAeAq9@j*C z@5gxBA$*T&JA$7*=wDmspYlvvD~7E6mbZz|xenh?uthA#@SPFIO}HNC zYbRPhpgq<{G}g9YW_|eESNJ$Y{4;pCQ~qPjtg-wqg_+_Qp$_`fv4V!3v=7wRNjW$v z_Sko|-tXCidy`KHi^q{Ur9|FTj(m|5#`D6y&GlTCw~phBLIs{89rb zM9V{Xqb_5uZ#R1KtCIoh{sjIlyuPGXV!h!<>g#8kmZ|BUIO6QU3y>a9G5Vgz^Ehp> zwlIEE{UY4rT3mo*9(^C+>093a55K@l`ufo|k*DLu8NY!$TfGe6)ixN4`!>ElM%PAq zj>B1+ZWQw(D5PFWKwLW~s=B7}m8$Q)#_xC@zr(AZ+UF5lthLL)vpdB$m8MT{9e^S! zYDDgzfil`}5#LFgM)T@BNQ);8T}L4Hde`RH(-3FNcEtM)ZA>NFBbzVdarH+2v0kv!dxJN68hrh7g7$kSqUKZt)2&Ym>)zv1;1*@Lf_U@y+Qc~Oy{eQ@^3>U!bly*OtU^v+Cga?}sbyv6-H?L!C}hI2B!!HZn@ zbd%H%WDUMFZeC$3nN`jWQGwJWAw1ISNL zCwgiZb1#OTa#|NhjDv21wl&pSZTDZA?xm+N&NgDZ15Q9kzTXM0aTVhKNWQO=$0|5$ z;5$dt2!0=c#k@O9Tb!fNlCBYAihWGC@NG~=&k@=>@T{qN_(eQ*XnQhQzr4!Br`QK_ z4S(iCY2II?E5^eUW8hb6ALHQTv%8Pc6XW1>#>8L75o>71 zzz?_{=T&_^$GB@Mv3y6vMD4$T*h`s{hP7f@qhd$P3RcA_j!lr7CwI}agO=cmGqRrH!M*(KDwf&s6iuC64`s^ohL-roY6m6dq&!Wh zU28Fq5_2dgnO67whV%+1Ev-{|?tHSr;D^3qhXl0G2z;Ke*jKJjh9bqlVTPtj#k z1$DC>=kxLtdl)a~QhWK0d*QkSx%pcP*L8gQ3_dI^C%j%Pu0Lq|5nudQ( zrNTFq#=_zZomKeWA3oq;ZTtgah4=^2*_wY##CtuBXT%%ly-tBTwC=#YP7YeqI8E$> zaX*GTzFlVGds8lYtH;E7&tK8`le})H@muXvrE=fWrmVj|?3#F5e8c$lFuykB{`WfV zCmbt|&2fmOZoO%`?^6I$rIAn2Q?9uZFbEz%!?e z80d@fsgdd{-buFbYc{WL!BLsdAHgQLOT6DgcYNF6lpMbw+Qi*U&HNx2*W%5o2FKuD zt!_4|;T-s8(A9{p&9EPDLq7hDvjR=Sam4zL@3pDPuYC0Epr?!4xF4$UY&pblQp~0? z)~m!E!VIxZ;Zw{XydfWZaV6#thR_mo2=~atLLNO*(K{iZE}u&nf;;9Cs^k0s{)SlZ zxFwx&6#9OoFZM5vr|)Hmx%V1yK#Ui~IFsJ?^tPtA6T~xUxqgn(ngdTys6gwhaIYF# zNprW%?lF0BLl2%kA{Y5-Y)a$%;_F9GTkTrW5br)$Xczk^CyMX$LhkF@yrIqg{yvkM ziaFED`i$|1+-iTB8h8aq?0KBZ_xP@kGx0X5g;+lr>*1=YfjIj&e)nq*pJHF&f)xKQ zu9(MIR?YiH9rrMGIt%jCpOKc~Fb_|h8@ktgmlJ*Znd0PH} z*iYwwlLm`xJjCzKZk4-(P@fO4sH1wcl%V4;Ui85=SWGbnJwr@4^78@h_vt?!4`VN2 zL2X~xe{;U{$MKuo*A+`8T83!FJ6bYhPFU;o2{Q z*k_qG87H1s;gd4%vpg<^tBqLJ;@H5ChiQnp%u3p))2=xEwbk%eD5-tyNtvW=SvBzt zY``%C$3}6r6W2@Pig(J7;03w*j4#ipaSh@=4~u9V>^`*)M(S%8-ibKIYCo~6TITOS zdV0`vS1r$1aTVjuUWm2%L)6*U+@6)L(^&75QNCZ0tFB_oUV@+eiFG;;O0tOOQ$bF~`w>-&c$E7Mx$Dyw#I#n~(+A*-0;-Db1)D|pmS zt=z%mw0x?n_Tr4_*b`Esq#A-W`j0(Iv6g-kTv^jQftWhuYJlf`JhA34#ym&i`4P|6 z{75aHTk*`~b(~|>U0iXNRZAES)!f4qXIjO1RzInMFU47eZ?&K$@7ln2{F87$B(@)L z$5{8Xa`-6jB{-|gQdwFckx0y7@eAW>0J}QT4*qeCg@gfHNb`IFD)z#JLM&aki4nmFlXTn0CT<}44~%;!I8>7gF_;)`{w zJM^Dew>n?{?Qm`7ZDQ?eAv~%1`>T3-fX5|x^f8Z%;aMQ(4e9$lqa27Y&g;03M{y3^ z^K@p!pTeV|w0!_~@MbP_pl<-)+xgxG_ncaMq;0jB|H5CKz8HU+gtw>s$Jlj$d_O|m zV+PA#M)#@Cbav-g1vPa*+~xR|3x6Y=P2df&Ur+06(3_VX@Sea~JG1{E?|NDX(t0D_ zWIn8d*Ljcz_cC6d$J+&8gUY@+XsyeG^RzaiH79*B=5YyM+=pY&Wl8Z@fLIT7oxEhl z(^lMXL#)NVg~ktP9E5Lj4d3>7;@p}^bdAUJ7hMzaG*)xVc=w}PeGX3>TC%u?KEu(K zrZ;gcrsZAv_*>hGu9etl{F3%@M%hK}kbr-Nzum zI(Zek&{P<2oL5#2ddtNisDU@mT>gsp-FP40(7!`@x^}7go8%zs_C#j>{A8W5)lD}#^YN;+Jz+#e5 zLuc`h#~JHDCc&$;#d%5bO%iL?K2yVW@U`dnBd}j=^~Eu+zGsg1F(&e9YBj{WD!87| zelc{Q)4fRMjUf^y#yNY=LLB? zPTRAzr4j3SoVVe8fcJ~V-2?Y>+;Kg|UYeLYTjRRfOy}D;V{gb&n2dWBt+8G#r92Ph zayYD_^Bknde+GAZbuj@x)5jY8t8lO4?enxZrnkR7GU_AdAYX%6uQwpS=cKy1LLc>c z^CI2p^w9*0(!NH^AZfg`5I&v_hFv?2IIw=Qyr(p z+YavpI0MVkLO*X&?AfMS&heY z?+CON>pZ|Gp>0J3=A+@tzPh6MM4a z-QXT*gkvgwv0gm!o)GKXXF`&kd<^m45a;~G{UzQV{-SrRxJ#&;2gLp}&CTe%mCpO* zya%0)!Uvvi)W;$DUaP*p#&Z?_;u|aW4z|a0I}eL$e-Kj9cBQuSw2QgDKZ?2a(s7%* z{e_NlVwwsEfx*+?pMV9H%&2Dco;{l6I(6L4`_;Yjia=0OH*RJeVe#Gl&=_XKMI$R zxp(1N%=0A1-dm-Jn|HDP>`FRc)JI|*KITW;<4+@>F($uF$*h!@>&3kg?#tpmSp2i- zn3HJ(Yi3o~x3&%FdjM*Su`k3pR(^V8EGyQCB*wB1;QE-CF{X7;4E^G| z;Nu86jTM_&c1Xs=2lxzDwHFq!0SI7GmG^ z&2+uTtJr@vkzX-?*Nd)Lr&E%)vrw%tzxbbqwwTL{-=T`RyqL#}-=bO}hsEjnQfxEu z#QM5ePk5XcvBvK5^>x3~lvrc;8ID+ESAm{`@Pt@non0?{vF9z7+G@-17$4YzyOtV$ zRIH!MVZ2Y?t$tt7M+cm_>1xcg##Qj+$%rSJX(j5rXQ|bxI8Vb9{2PP!0WnVz+cG>S zV7QoK9yr#R{yU8vUR0JAR9Jyf|j_r97@<;)vfNjH8f=KJ6ccPRU}2 zE5)~tXC3%;Z6&qO^Ecrg&Evd=bF@|FQ7bqE9YQ00AH&!17M*wLarZK-*qZU_X#DV`6dOqRVofl)6Uh)E-VYD`+^Pe@IG_5P=`9oI&hF?ufZ8<#!?D^-s z;TT)&%e(QsPZDoC9IwZ-<6Ypp0vlX%vQraQFX14C1LhZ9@u z366K84FBWP9C0kHp#Q3JrrjTOR20v9v~1Qs=8WHlkp#sW#Sg^MoewK$AE;ex+E?gz z7(a_@JB9W`+U4fy6>@ePFB9)prxj~1_p*v&iTA3+JJp8;{_mZtUL`$Db-NMonZ=N9CZnICsj|A~mpHE!|jNOf)x!<8-H| z`!kqP(^wweuR#k|pMm@NwO&56sJRt%7p1vBtx*px-?{g|8-!rNS4D~Wd=Z68B-IoS>i=!<90AMz6C z6~(;ZRchiZ+Unpdz}GA||KP>7yohtDt`P5EwAGiRCJ=LF({YZ%_X2$vp%>l~I2+Qr zg`5F&#=LhbeT;^f`@YD7%jduAs)0|lyXVp$bKWu6JxO2d;BEY$^Km+kYTEsf(Q}Ee z>Ts*SAIG=n;W71JG}*hK+8d?aLOKi6RRW%-s{&nv#2agUy3ln3s^N_Jg~L!%{K?te z!}wPM-$goxPbcPs>9pnp)5_j_=Rm`T~A{?_4Xf$04VDHpDpup4RSWaV<^pZm0cG_?|bt`BFt3 z5A*o#4E)i5Ds}Xi{todr@%tHNwXIA4Bsik)_!f^d^@s2y=0o!F^+h~0;ALF1^qpQz z1@gG(xQ_Oy$;LRZ5W@gk2J+`y*HRXIDUgRRZOVDCfJXQq=KEX!kFGzD`>|ZVfdAV( zEAz~4p68h)B1A$Fk$EmfQKm?QD4{YYlqo7HLy{6I$y}5Ml4dDNh6bMZk^R{}zx{ll zKi1x_>OR-G);f-BKCkN|r%(Ai4kLIh%v*dD_!lUh-WXXAr8SE=hL|J12RsV*R9a8T z`yk#$cu$sheuXnT&gD2CqFwAs6JaL3aZcTy=Jou?n%P)?^B%n;^;03^^FWm1vBtFtu*V>-VRK$BSGe*zb_1Vx z>$$jot!aE*!(O5#u3xL@s}uAbFn$3&kMi^b+>WD`+&l60iJDHPV`p)mc*|SL`3fAN zDK~%dY^IJH^u-rzyXw-BOGZ!OSpt=_IH$bI`5n$YJbsBY-h=xdU%dM^#Ml|?m&w>~ z>G(^3Uo@tz9IE--w_rQ0P`erSQ$6LJg`N-O(p3*!Xa4h0UoLU~YNR=HnP({+G$z)B zP4>5uV{`g{gcj!ArQWBE*(A%Z=8xxzsf-^6*QxVG+r%E3#5WQK;^<+n$DzCasK9%* z3ig%IP@apR4Ij1Y*q6$5N=pAPhrx3A5h|*4e7j>hAM^Cw6do$c;8{LO(RB)MHhLQC zzumZd>YV}lX0UDK8XD`$u9c%`ohEuZpQlAgKr^uZDLjE~h-CmF@Q zvtJrxY3rkAyWvS*r_(kTS6{j|)ATLBIq=1GMP9vhO8%pHjr)cx4Jfn{9=@q0c-g!%WQ!n<-@tpd&ZMXxk`^?jl z)|%!z3MtGt2`|KL}T4y;dWi+Nk47 zxy3bQl3tB>qPCZ@J*vYav<*<+Unm= z@gIXPX=|e-)hnoKw?% z6xlW9aXH>0`r$eG&zJubdf_a-W_V8V*g`Eb*|xvI)2Xy<;AVV9^yqpR$m>lt^hqs! z!*5%)P0jBXocH2cr-wH4cfX8A=!=3hEyZ=lzTs|qn#sQgj)~qU%bzJy=-oW)%?Ug()g{%X2#qId-YmFS#^W(7HdBCm^-d1-Z1x->pxEFy|a0o zzu^3c-&g~(p|pJf?rZstwIEln1NlNdbJ~s;;5-cn@U5^9Iv=&g^DUIM{l$8i*Kxg4 z#rY79hu}D0x6A!$zS`huWBlt-Q$C%bIDLcEU=Xf&SFTTX+njtJhobiX@f+2@(m7vk z?==2;^EUD~OQ48sVn4IP-wyLPtDrI+S$WzZ--hyi20qbCKhqKGTDs|}kK}bpUdv?l z?>QeGRcNTp*DG|~t?%PIAF1RY=al_v*o8axGwbmm#+|FA+_x)x`wJ^cvhQJmw{Al4SddegJ`;=A0l^wwBB zaZcP>U(A8HMv3*cFX2nPLl$eY<5^3*lM?Tb^)voXTJF^g@$Oh$1I~w2`g6DO$=PHG zFY(q}-%m1bh}=Gg=V{r_+x)VQRkCZOeiLQ(r|o6~zNIwf$F&kZ$M-a^v2UEAHiht2 zhp&x)O!fmS>PH#fhvPJyGoH<)r&H)%eK6LzeDuWqh~D&+QPXMpFYjL~;+e$LyzoV1 znPM_1Z@;UC#b~)1S1mkK>4@i98SpKHG4dKq%P|?P)EnuHuW$TO_=CTGB^{^fyOp-1 z5Z}s-`@ePNv z%;3ME++LMW+^ean2fDyX_}%zj#y?=+x*twJ!ThqulZ)?o?mxV-dE%KRBjzA=uL?CLuTRnTaG*Vj^B=n zzVA&_X8qa5_~`Y%#;t@Ivg&L8X8K_%M88L`modHtM8D5Z?|5qNA9#CO4d?Lo9Sw2K z`>Ec1f{(2*QvPu-xirqiZ(Qc(B@Z2K_*l!wSXtkrAGYDz5AF5&|9*$_|M~{!3O)a^ zymRV}2gR{Jh5d-!m+P?~@J-{fW-d9v3i>{R{=CkCQgUx@dwiVMFL{56zA`+Y*B{U8 zk9dbX?yHF7-}A8AwD!jx@2)w$lh({y8hg!_!Y#9Oklao)90{p#~H zTQ7YD&&qx&ypHF-WXCVrr!MIjs-K?b?Oy$Pr@mN%|AHFisOxxxw*zmV^7b+9H_*`v zNBpKq4;+6}gztu*qXVV(@xZ?g+{Ju+7*)`QG@$BU=uk-LF z?svT-yKcPhz_$m^N$Y#2jC1XHEG!Z-S~T-hVb@WRr^w7<9mW1@-)x*G%~xMmI63tn>+5^wd1Q34Ts@o zT($7j(R=ax0xk6K4RjRJ!<*qG#I^4GGCRxXX4`q3_cx+zHtuP7!TKOx&!AR9KXU=I^V&S-8OqcUjNAcO?*}HU5Beh8X9DhPag4Z&`q*FZ(K@$-;B3k z;0SMD+n)O9`IXRv&*R39;&FxX7isxDvZkYyY-i${MbCRYm6Oq<=6nSj$?2qd^BP;$ z*yDW6OD#Y7UZr01arBc_+%HW<%Qx_hn*WYxv|d^*iyXGY;jl)n;-13cTK3yCRaC2Z z?$Zz2$mBc}rY99|vtXXQJM&gdMm6nIXUV8;G5ZDF>-hbR&klSJhFBw9k;aVl<+AOS zg%UJn;BA|pdDz(IYSyTz?EuFa+6JiA9{FbFGZ{w*n%e1wyZL;cwnOkIpCjqp4*O)* z2k$F5AEB!XO>s@s5cf}bN84ar~p#j}pM4vqCAu`i4I z#X8FTe8pO{ST7RmMB-WKWLlDWs%30``Md!AXc!I|`TK&F&T{ICqb*N2m9-7XD~@+yE1s8V+N?)+&=k)o63-`6(^Lym@%}Z$ zvx#^=?-v+F%vulirA=X{BtpNyF;rycq*?zxpx=XA2Uil=m?96u`A zUz&GN4f{Af{k-wZpF-@-~N;GUh&j>nEP#I}$Z{nFetm zW1aaM8n=t~HpU%P<6`o7NET<+W4=63%W<(fv@v%)yS@Ro!=3ae)(JE)F4hVZ<@d@p z0`XqX4qUNLU_K4;jfU&#_@az?X^Hg$8)0cxP@`BguvZVobBMp>GK7zXFrAmKvRN(5 zxR-J`U>|u3fAn&EgLRLrUc)<_w=}dqAfr)qwvy2c@;Rhlv372nj27T~p4Mc1v7UZ0 zo~iss-4CgI20Wjsby>b^8@CtYy^4A?t%aeshlb%-o$J6K^t8fJK<(PVyK*axYbvfY z^bC^q&Ai1vKi&;$g`JW0!I>NT04 z59nD$PrTDzj+fZ4z5^L#6z_J&^WLv%ig&u>yGZeEjTCZj2n+P_7UP@I5_#N=r(GJ` zh#rVFzv<|D9tP4?jh>eD3{bo9Ge$12RkH2y6YEXm{!n%tFZ=u0FFjP$@s8d@{`O_Q z4`D9J-68a{`=?f>?g;{Y$W z*aoT^JDTQt{4b}qa5kChwWIzn-m8jxQt{k2m+UIiJs0BKWi|h8E8~RzbQM&W7x~x$ znbjuV9m{xQ$$nb0<6VXGBPggob7eW+*fl)Or zs|(H<_#%t=PR3%Mc4f4E;#(r?#&pGZe=_U!c$e+0ydRZyYhy3+6z8Qa)pMOW)9cH; z(B9w2`u77LK4;)sWABE= zG{rYa?lyjuKItpxSu(DtM^-}IkIslE?n!?tlejPa9IqSxlk+WlCUH;tN%_RR=m&7d zz3B3`i%xixc)JT%tV_?7*0#!9oa4TNFV>}}!jVJI%#-nR@Dbc5=V~SBg;=Lvg~nK? z{soPRwd%1>eHrdpqaN$iV{Q5iri=Yw?E9WnmsIAMfj_bD`%qol%JGyOZ?o@7>;bajp{2%XZuL;yfzxUE}*@*-BmFeUEs*>bl6%`1p?TtF-Kf_528iu^+ryhKC^bg-_B}2Twt{{fQ^`gKy&)Rs|1VbM!;(3-6QvJUq>4cpkbL zTiUq0pdn8!jU5Z$C#zjCy(P1L71Rl4;u?VKOJ1tsi1lu7(9)TP@63OP9$U%BSv==u zAK#b%K>nYp*LC>5 zQNLgDZQ^k+kFjl!=CdZ=Za5!-O8TG`zIfj*1Dz{)Ek$cL++V^=JlCN)-o2YkXMBgC zY8uDzbdJ&HiT70F+emSp^@DkKn#jfdK%5`t zqVZN^A5_DBw4LPj2Q@qK6DXPn#g4V^_Qf9p9?>hpvMBCDZl{{KjAO%3SzK4Z`E~GRsHbu>bT% ztS=g-Ur)*RZ+Od`HO(38i(+ljS%|eoDfn9jvBqeE%xjptC&U_~#QLHKWfkiN3drcj zY>tO|;X%kL?;GGL`>2=Ym8G;XIKH4Gm-<)25$Aq}{QGU-Vf?q|KlUq|dAgI2cn5!M zvfZz-g?YGSd_!5z3e?r3=5C+*@;%g{#@}Q7mG@GUc)OFYxR+X6R*8G3#qm6-W{LZ! zu}R=F%ls^!SSOPwGJ+zwK2fVek&$gBh4HagW)&2bRU?_dBJQ~<@5x< z)7AY(I;+V$9j)nMIIXeXtOk#FH#?~pI`TT0 zu8(oF!|@^1;`2jw_yiuKubeu>Hr*0>guV*SMR1O)?sy>gR5aYq;|}$kZ@Y`{hsGL) z#P>rVQO~(};v1szPG90XqKR*aHk4JYJ?yNe??V-wqhJDUm*iiFwpa)L9bH$h0Z(g= zSOb1fDSyvvtoQy=J|$(-&DeO(8^3?qP^0}w)1xx~04~Zm)>!S6Z``Yneeh_t+9KzF z%pchn;i(OrluZ-9I@2+nw-UCKxDR_2-z;_f(frNj@+iKz&Mu>FA69hV1z!oc2i~hA zW7^pG?>kbP^;&%2e;cm!*HW{5s>iTON({OeLHx zajwJhmA*@7e>GlR-lB1Yzh4Ji^n5{@D$taco;c>e$@d;(Q|gN`y#FrGSc6ju&saQL zWpJ$wUVzVNYbD>`cuz^!#Ei~EY5ND7$oe7J0C7X%clCZ)9`~EK2A$hze4qC+G=9eG zF#M0#RwumE@IGr;JD%s`j^FT}iZi}fbROdUiQD*%_t-k=$He;+75S;d&rSTSgLsFc zuzBMBiH>|F-kaF1H`>eLHoT?f*cD$bT(?6KzWgu^YUuNE>K5Nji~Z+rT!m%xiEQps zqu(Lcn8YNGQxs;%IF2KGbGY8~_fOLP5ww-#e3)ze7Wj~sUb5Ii z$61lB=b<$Zx8nMS_5wJjn18JP+$`HNd^Cj5;IVxEM(z5@`dRhLf-fIDiZ8zHQHZCp z>Yt6CQ;-AKpU{V=yKu%@op)@vf9a>2jlWYqx2Vlg;}`3r$@V`JWz!{vb2!-?k8M5j;(nO^R~%8RhArWoT8$Bsty2=RxR=w~(5}+O;of ziuVogkZ-()by#LKXo|IKMR3RZwZ3@cnR!+`u?@u4OY#Ta`OH@f`=v*PcjkK0i z!#GyW=lgp6i+MhTyDz_s;N`rIU2=N|GV&1jOrNDE&V6s7Db9PR7!&8cD~!7}=l}2A zcbc(r{(I%Q@Ab6B`R@t%4QiIXd@fv^*Ek=3w!R)r!w-+~PDy%*k8(o=zAE|~h_!@kaJ|lJPhNZS`X;aS)gup|nbhMxSyfEt4N|Mcopg+r|5vaO z*D+{~V+Op)>tB3sGyW&zYw4=U z+h4Rbllhl4eV51m3%Uxce|%Rc-ghoR!ySZ>y$f<#sQvU*W$% zYj^x{o)B}qXO1{uC`u8q3fY=WGwlqGV}#Ks@`7Z*py=HO}9P%d`uv1!>JAkHj{S*dAhA z*oE^&oX^r%F`qin6ZbGn%dm@D+-2WU&Df{Zc9$&QOYNM2rl&&}ztj2rnVwJO^=dKw zpg*Ro(N8qA*KhC2tbS$td7N$W#l40p{8W?EGsZU6Bk?L=D<@8R@yF$s%v|i7SNI&PgjUFaOdz` zgwwp0<}I$9575y{t;VZW3p(zFJN3hAz0gdbt$}hf9*^r?s9MGG3hK%0XV_8Avk)Fn zLRH-5=*-RUX1UeZBaO_Fk>}nrj^`lLahFiThUzyJs^ZVAc8ze4;5GJd*Wz4)D|;=+ zYo06N8LUTU!A|JGd%Ob?_Y9}gU6tqgxMLmv7j%!5UjuXORF8dpXYsdLWZuJmrzWq1 zb6!4YS?TZNo$g#T-7Nd~-M=cvd;$;BQ-Pkgw)MUA#9FDwd^Lr>yq%>ZzCSl!UHj70 zJfmxP_z2=%q*yC+l)k03?V)ER9o6wo)fYeOi?}D1AJ;9s{j8p2^wp2X+(u_AI^Q;S zAgycl)fsw<$Z5Sg491hi__}bdtY*onk&MQJss8_d^I|ft>9`)x&IhiA@DFt3|Nr{U zixIe{=#2(?qbgksAO&sbcw9%{Aewr~>unh~;;B$kDCYWE9qaQI&l0QQD4_?o<499a zZ_qUw9>W#SxMH1UJmZRU@K|RV&$+VO7TZI-FCFVG6VJMSVJOyH#u~jg{3f1t#Tv_N zd7UKxIA^)?eC0hH%lOTpFYci;-a(!$zlO5Ai081n#`BwaZnxju&HUXFp6)TvTAp6g zH~;Vz&+%`R{X}DLm;Kvt!1z{Gc&P3?8iwL|0rJW$KfjrA=8)BLyuhKr* zsTQ?!`{z8)arJ9_H*vC_NPI^nt}*r)-$pLW`AFQux z?q$XP>&kmsdugkWcbaXWBi=XRMf&d7Yw6ALjG89C=kQ@{JN&*yS0*|2tYmvu)A78< zGvY?P7R5Im&O%c)xCd{%M>7mw;BOwj(0v=9dFj1fj^EIi&vumfKKp*0v8JdS-Ur|g z+#k_h3TNEAuZXh@t`qPCzQQ@(&r+uY>U51dy`)B!WiXh=4CVQQ9O@F^vnoa79(}h* zuRXwPh0L}UdS<}uc;Y?HH)%_je-f?>&{f?}LUM58iu(~|Xr6+zFTQKkHj@m~;cEpS zLnhja;due#Hv(GFmeD?B3~iHa4;$fHJvWiY(&cEEW$@MGwJfh?@m7RsWIVz1Ew+bP zv$`GMc>Qr0=V$VJRZaeZzwvg}f9GKcZSCY&SYG5O?Y0fHFn*QXZa1!^aqsaH*X0Y< z^B34c!()6cq9N8%&4v=RbfDo4VCmmypwlwhM_ui>oI}4t4!Kw5EuMjX3Pt%@hNrh0 z#(nB5pM}OZjpF{|)2aM>_!(ZNZ6R&vaZRS}30~IolG`>G*HsVEwpqVDVcd28t~?<% z_2xlYl$U2q2ICtz+j;59`xAUL=b@zeL;s61m_U1Xb8m%MqtqPN1-Q%n@$Jhkcyq|6 zChX^75YF=Y@f567m-r^keqNgCo9q33CYnpw4&PUo8OEld=@*)YX16`_(O-?O>o!U zdOoM;2&BP%JI+n;UM|N~dd9*Mc$}`$bk$Sei{|@Mmgn)0z@INXS9dJrvxyokvc26! zUt?n?!eTx7j9PxlQ)|5*zjg5;ou8MmEz{Y9wgWgm#gRj1Wg&k1WK0iQq}8spl3F@1++H$y#I;g5R&mDPE9D*GMv7^!cT)7&Y8 zeU5tkst$3V>ki}Zqp<^RkL$ZTWp`UG$8+P)!(N)w<9Uj%CuR5&j)6F4LVSy%JOAgP z622Gte}tw7`JE@T;q(lqHw-{4gZr2zy#F%pa{tfg02yYozRZi{s83!-G zT)sNe)&$oLw7pK#6kI=>{}X&2a?mE9Ch~76_o?`9;j30r$5Wi8^hjO!%J!Vn_RxT? z$q>i4G5q#WkE3w6TGXd=7(8c=PUe`-^UPHCL-IQSlg-)HoYnO5N9K!jv?AtfYQ6{5 z`=WZUqyJra#9U)(|Ay|SbbqH0Gs|@x{v{w+=`DPd^||Ut#}K_>2JIXa9*tjFVOKpWCVHe=9c?AxVFLb zGOEZ+d;QWtt#iwKx6I>xs4jF(q^USBnPhQOWgg%xG*-Vq`ME~EuhG#<4zUKJlle>N zjV>?*I?*zhj$a^t&-&r=_EpB`tLAv7cWd(4oxca*dKndvGl@y#pbdRrm?PFXd|{rr zZn^;ddG2k$(ld{JTR!^(^Nhe5=V_;T{2pgVd?HD@9eO|swJU+AtL#=lZhVblPd4{< z^x6f8-zRtpD)3R5?i4ha)({>JeH zj)(Qb26&ja4syDczpvmITz{+Su?+rBk0fPv%z=0(%+sa7e`O?Z-L45eo99#*;J%uP0`Eu zd2*`Fd$Rr*_L?JcpC|6|?0_#pi~hR~t!qkNWmA&Sc*a{nJ}u0XG8gT*8^K!n$2ZtZ z^SP7mr)Zu+=M;52BKOnqEsc-jsUpWGVH$lk^63j>cgeJy@w<#KNK;PrKc^?-oT;yz zuQK*SI+m){b87JqU-`^CR{vDM(Xp6+=IKx4ZZ|Hza~;>)vAv#%`Q;Vgp3Q3hLr{m0 zZdYAC&Od?UC)jA)?I@?|uu&g>Bd_mhsz}ckD4+)MO|h2dXlaf)_`l_`ojzJ1ug3(I z$sEPx^om}H6T~Ov)LS2A=k*lCdkFRLKM#+ZBc4k%Gfzg^8^d+@o8o*CcEJ-kufzEj zTto9d{dFInHBbyk{Eo+9_zJSg?x0#WmHlF#XV-SlCa-rP1x@>5pxW)h5o;2AKzu)D zlCkd^TcV_E6XS29A#Pj$v>1>yi`QvwFHsYFs=ez9A(PaA-98$9Ji^;8x9LA+P~?cNl;O(|G~GPo?^V!*H3@p9l_s^@;!|^8-3m2 zG>toHyq(4^@T9s8H{WKte+fzSPKSQXeV`wfBs;HxzhwDzapw>v>8GO}KZD>bPk+hg zU$>haqQeeUmiXACjSr9wVa;Jd?!OZUoOah zXY+N(y$_yN|Gc~&B6AO)-x`0wxHHDBm0i{7LG^2C+)0{W)ATceHcG0=vjvE zDw;;ics{=PJ?g}7QIC|{GMU9X)(0zHz9(Cgmg{i520irD61oPe-$xK@*fOQFPf^2- zwAPi?D%>;poUdltayx%hr^S3;hxepxzVi3U{x*}pO-IXWXr0qG;P0PM*8}t{i+)ne zxX(Xc?KaA0k-mPsruo$;ai1=6k8X~9zJRz#7wh}t9^Jod{M6{m`*evlesRApv9_-% z5BX`{tUmER`)72-y_z_``AxPdX_-Vv8)H(-rGZ=?Q|Ezl$tsi4&`2g%zK2#sHe>ng zM^g^o{`Xz96Z$XSJ^K`58%ex>CZ441@;RBsaY23lpeOFh^rPigUY=0rc>g1ZUVl>G z-Jx%$(v`o0ZKK6Vy)sgynK;KO^rVYHRMxUof^<|qm0f#Puey`AJR9QzQ^g>%4dDL z;yu+OYPXTL-)t8*;%&|62l^n+vqs@Ar3Uq3p`PqYS9ZQzo2R=u>XdN(!tWOl>y19s z&spm@ehO@$o-Ap5%|_>Q{BFRRg5P*2x-gDz5a0VMN@GphuGd!;@m$AqM;iO`8qaix z(mEaYlWJ0h#%B0l&>ICq6AZ=ow9L}0#dG|nqp3dh$1#Vm?a+XxBC_w#Usm$c=z{hTH;(U-usR7y{@uOFPm7W67TrpdO9O`+N1sQpNcJFMrVyb&dDjqoy68q`A(?Giv&p zaZ$^>r7zd=ybPm`@veK+G2VA6O8>*D^)imi#(2EobSNDuWBSVvX0; zJamBOw4C5&w=8q0$@bup!M$0W+sO2^JmdT7KdDCx<7cWxS>v|z5$}Cvq309(iflNZ zrscl+m$h`JCG=#JNm+SRr0Y5eO+V38QJ;ja2{H;z@$4yd#X79`u0Uui`X5c@^hqIH zoAk$H>QYHY@ov>ee8&37_@38SvRZ|&2aW@3yq~U2GP(v&^lTfoZYrnwvVM)f;<(n( z)t1le_#8viI@@Bb7g`{zn*6x<+1IccpgPlCbdWzvNhVP$YF0Fg;^e{H==ikIzJn#S5*e_s>@mb`RS61=en&0^SO>Ms| zq26k+sR|u@&X(J!cq-Jpe6D>nT|40r?-%K7NY_pH^IYYhVUTSuzT-VhJ<`jgsJRl~ z@g9e}AZ_i{HooJ1Gyl)w--N#<&f_@y;jF^*4bT#v#obPQip%$UI&a1i@1EX(<2a8K z_1uH%+Z)G18sj^LrFbq48ELDezV|^h-mB8G1qSoJ917S^=91Y9`0DX{0`8!xikhsV z>k(Yt>6$=S4mw_kN9CWKTlTbkt*)ol^=K*C$*iZkzOCm5@irLJ(3Vbyec_fma-pvq z3|7Z}vTDUsJlBrrmN{@HzT*W4d;2P#8dqK+i96Rok8Eo_FYT6Zc|9jx65>@o~oQ*ZhCSl#Cw+YWi-09V;B#cl(j}ujh>IZr)hiRs%<3U0bZ@dJ{*iZHsknC2ccvY%euw zh&67BwQaGkEv~hD86W$-12T^NUhIn#`?}cA4K#L4^5uP9ecMCy-BB81e;50@+adOK zy=jPN5mOYra1LJ8`feG-J;E0t?s3Jljk*h;TcFv5!*o_THb<8 z>U{{(;;hBfPiplP&JlFoSi-pyz6bSjF4!w})c8?ZPphxy^bO&$0F7z!#=EU?&+GyG z@mpc(Y#VWow2#-DY-gX~tcNo@&nNgjh4XuUx5}%tzS*UIyY$W7c&0#NeZZ%@#&))y z##k3{6T~;oV{O2EJ@q&43Uub=Io1jM!*8q+_yF%|d<}S=0=KHediXV;^A#NN{Hy_7 zh3Aa@L45l$p7|A#W4uG!jm8`F=$+7n_htB2!&v?wr#G>WdN7Oq4F1|YKc>#HpGxeb zM&TOAXY8YvK=jLtJZIKxFUqecee2bwsa{(HAK~~E#_@X%t-sM4@66oGX92k_=dWI6 z=Z{cREe_FB0?!oq1Xnp6uR#3HORPbUcaL7ib7O9K!~6Wk@4XC{*?t~Z(3V)E9PjEc zr6txX7vkwPxyKsivgVI9%Ee3CPWg#-%4?trEh+h_R8^lDx03Eh&Gi)AXRa>#Dw~|I zgQ+q;rLU@+w=s^mC%#m^70iE6b^l$xV*l~BToU&b;(kI-oN+&47p^mqxS#MhAJ60X zLEQ_fPi8qJ?k8x;q%UETe)`-${GP#i9#0w7roA37Y3u-g;vJd35bq(Ez_k)rQ+oER z&-2DVV*HN~=NpIl`xYwTnk?UHS)H%I8@&F(>wYyKkN0c%6X#26)t#TOjenJf_G$H$ z@piI!`av$~=!knoqe2G_Wz^>w zu1$R1%fpHAp)RpDA&~NW&E+4HBqm`w!a5oZ1b_bA6Dns-j~*w zzg+I2<0Bg4n;DHdINqx&3%!z>pLj<*t|1Sm@;s29 z4{`N1c96QXa6FtW<2z#8NwyE>sRBP^dD)=Wd1x99RVwQ-n%dIzseIzu=-^Do;8>)t z@$HD^@Fk?9C)PKuRGYY;7vFtrX#5Gj#?$hR9_(TKI3D79Y&H*b=@?4KguMDwy*uK` zQ`ELa&s$KHrmx`@ns(tF#N!g27oa1r`S|;SziF~6jQb(Ao`EYBuFO!8zhQJ`(L>kJ zHlDvPWYu5oe^IaIbd`}!X4wqP!jD?#r)MCg7^7*8}DX(`(>RKS0Ox8Anvo> zrzhiHTij=RRepJJHO6%~kG|o#6rBqoEu9(QJjDI9mGaxGCM8PK3yWnL_tVOn??!kR z;=bBGb;_-GTGcZb#P<@)nWytC;w1LXRAL;~tEAZdJz=C?(HxkPT0KH#YVy zS<~BQGU1JSL%efbm&V4%9)%_HjCD?HARmrYb@e^pOO4yF9@Et0VRNnLvl)-2)wGeC z-lb2n^0x)nl(a4LRE(z&@tuG`L^Nl z0h}lCjnXUU;C}s5iN_alizw+f$bhT7x?P25CY0vq+3*9k@O=YEWcG%A);%~+;oDOC z^1fjok`Z*pcb9&!J@3YKhOWElihFQl91I`P^bH*^$*7z9wUJM} zqY%9n`>Rbf+$f*uty*+MKTW|AJ@gb$xlUyUNDPE;x?sGc{kt*IIRd z64xHcT}?0WR)ep2H{&qa43p-;1=?;@yM=rnkkuF--;(uIbClHwiQn&i#9ZZNH_Uv! zH4k8%D~&DhYCSohe1o}cr|Pyc01mL;5li!h0X_?}Tq zn4pf!WqwCZb+N6)+Qxx2R7>eR6b?WI{vNRHlu^?*dg2**&681Fo1Id}&3t@AOFU~n z3h``p6+OLh_NM7b67JM`2TtJ{s6T$^v03zp{#Zt5+&7+uFP=TdbGKPCE<(?0^T+q5 z65kV!Z%$n=mwO>yF2{p>&V6`Hd{a2_J>jo#%%r6)fAJlv_?~bJW8YVo7+1u&YmKX~ zCTV1{6}lT!#otepN307x0}G9vpvK2xsB8-Ga2q{S=`JpZwCYn&ZR7djP}pTVIm^R7 znZ)^ea~w0w{f`_H_l`@^@RPA|&v=vZGidpT_k1*LfVhVo_l^h4F>&ws=Op_@xy8Dg z_!eqUUW(IjG^d`D-)%TH=!-btIuhF#AFa*ZQ;w6&{ev7U(cVk`8{i&XyD~U#>a#a& zN7v$6L`&#-A6~@wnVOWQrF=>K3y;8HzD`%P&EX!XzBZAhJ0UynvvR3G*N6Dx{id?H z)rGc~@br*T;x}R9Jmi@4pr9f+p%!lE2T5 zsYAznXl&c*s7_Dg7_3g|_029izA^7YHJK~hE#~Z#?3!AA!qZTAh=#jy-9^V(d^?$m zXVLTJK3L7-`yW~%sS6EpE&GkSeGe;SRbK7t5WGlE%ghtMXYc@RJ0YDp;yd8~;7pI} z8YEj_7mZD1b_fdKAE+i#mrrmO)DN*f`cGWzXiiV>I{g#xue-*ZH|d*>GtN`9 z<2#7!7k*RNX5(IOSv5FLYuxJ{2~}{%x3sRj=bQMJ)|KDU>P2g^Iac70`@S{RAl4VO z&1l=nWc!starw{Hb06^^-`%~N)(N!6Gr3JA_>t$AP?NrKkV{=Q(l(y9F?@bNTRmL4 z)n*M{JMeVClTBSdg6ep3@EX^r!}Qlkwd`%1D?~>lP3NbN5f{xFMe&P>zRK_xCsL+vHr-y#48p`z2fSLN0TcQJ=ew z9cFBNVYQAjx_4CU45F%w;`VQ_}MMraq^w7rbTgF!`5WD&HQbR?_tc# z#{3E8^=-UU|B!Ku;U^w4m_N61|G*%bW|zfU`j_a@Q8>;)8G35rn#<2oeKFP8>E^wv zxa|$%I^Z;nt8w{!HQouhpN5Ul-?%|)xy-PInEkLm zTW4%%wVp~-PxZ=5R|`C!)Al7?CDVWK#BaZlle7(xQ&zg3pz8*F{qV)T*|uf) zlG6w{gTFuiP5AGpuRiVvasP-j*8M*Su^zV&?h{w}_g6bV!5{1XN8?Sb{l7{d{9kMT zW8MEoy_hWXhh&@!Pj%yeqb-i{uk%_r*?kNcNZVnEbNbb^{07JL(|2`TI~)IXI{P_U z9Sxs!#P)gR`i?0y#Tt+QUE8r#Emp$^>X4z*<#is<%kmSbXO4X4i03rh)FZV#JJI_A z|J%$LYu{hZ?id4uWm`g?EzA-7w5>9Y>#M?e7s~J$uJ!u%MV`OXTQxGczA^4EIHF&g z8b5;fDQZ)S_p9hl#uvXiKN{a=b*WZPpF}NaTVKn56i-^cu}k)GjlK%UyAbb$pOfJm z#$PnPxEz?An=snE89j{alI5$EbA1{$l<& zqHnYDsr1+l5Z`VaWIKrO zwsn-zetezjDnifIy!O#&2l(tl&wTvxy{A<;>+^Qycb+B~w-ze%)6uy3P)AM|<2St3mq%r#A7}Gijsvh88q49z?`0KGm&7--+Uei; zZdPIVOsz7Tub+(L9k~0=)7U&unr9IGpVB{8z0#$1-DEqxO)hWc=UcwhZA$~?doA4y zpst+XkwsZ~-e^o7HBPLhDMDkcqp3(|3Atv^tKabajAtzGSFWYGRsVkmv5sae4M%a^ zfvXD*EosP%XA_P)EEcyKt2b^s=urf>st59>srUL zIA65Gqz zi*Jy}chCwMyB+4!mt_25V<*b)73k()y7__YJ<7| zGQO>CE){>9>d~84UuMu(5a-l=d27jAI^NpDpOBHqSOarBpMQt{WynTrNjiU#S0;=T>GKxP|CtdX2c?_7TKW}^|`F&t%ijrEcD(Ak;J34DHyHyhqq zC)q&uBjt5o{&(UziKjBHzvS?@IASfrMVU`2<-f@}j_=p0<+sKU)f?!NMy66v_=lEQ z7jYcox7_Bz9+-pY2OPCaJMX|TnvObhs$a{#g130~-v@T3aBXR9JTGazq=isRN}YI{gt z`_1)^y2N_ws^;j;V>Wzoyo+aJ>HK{MnbcFiyn1OHT|cP*Li>b6@}27MOWGfNVE$N- zQ;oNOzuRNGh;LXffhUap!Cd!dr_o%SAbkNjnlGN&)xb48_Az?9l&rhRY6aeh=!kWa z!+9EB)3%_m7D24#eN63^LMxv7@G}jT!eTXyXQXS*msxLpjrWK;#y$URG`7OCUN#>< zSv@cjS57%C!PQ+xd-1j4c?Zwa=^aCBH#|$_6Yo#I54C0go&L&KUVY(hNG~ez=Cfow)iKUsXMxgz0+!)2#ZN-p$6|S4L*W z_U7?B7^3GY@S3uozsFM@#}*#rxl$fuM$?g!=+5vLJ@3*|M?F)Pl(qUL^Yk;UGJYK` zYm6^${C>Ugh@QF#mvAgJzJjr1c_?99DojT!+4P~MqWSB?(CUsswe^#J{g$`B^n9RZ zUF5$BZye*s^A_jFmGDo&9qXC9()CIy_nP?`$4_fnr^FT4l&942qCTpKw+Vf<)W(YrtBg(Y%oTh1{AU-ZB*IAZ*G9)HJ?`2C%ZSIbZ@95LmtFj($Torl017FgWg03!d zZY|@)I=%Q#Pkf_i2aX!FHRLO?UN7$d{kv9=u6+E(cX?usULk(2T%&h89oOKAeO0?G z`kbfDw2U);ByU6L=~G6p(GmOe3v@gq<9NPA?tj0ba6O*5hTIHq*gjJ6c9gE8`YB5( zy(f#hmF>h(sU~8 zF9hEXBM2Jl3Y*Y83bw4=zX5Y!9xCCF*eTK zGwHoJ|BCy$A3*eBHGT6Jo$-$U99-|fJf27Bqnqg)N8d4=C)EBH8dpFY-g`n(JzhGO za{;(9kN&bR*d&Kl^nPuwiRI)>XV!|&$ITJX(st6BTMchCX0Y6f`umh>Kbn?X{e8Sk zmzAbJWq4mT`ylA5A2#s1#Q0a~IZn?l`sZFbjaScjRuRuBTBu(6F zN=I#DPeMF%?m|ysTE|_4{aCwL%N7UbrHc+UAe-Rh{J16z2(O zXFnA8gr~q$d{vNFRlY{bYpc9|0W$vmjrct{W8LdZ@H5`W_&W&IGdkDNTVLbfD5tS_ zH>-VoJ0RZY*-z^)eBMi2Z(OnNzJ;1688cDelrzCP`f?k48=qZaF1%GtJxV&);k%-o zQ6}9ECFC6MgO-DKka!>TFFHQQn?~k+a9x01yk7ZEX!<&~Uv>V}xV~zX%9xRmmZsCP zSwwq$2e5l7nZprt$8ofooD0i$5TuvG>og?EVIb_o^@8zhjlYmbpW3z>(H_UaGo>%@ zo1c^GTs)IxQ4v=kHGfWaR~ffhpRJ-fud%;ET|H8q*~+%n@#^ymIW z-@`8TDPPNZ1fJ}?e0j`%iEJsj~(pv3op zrmIt|lTA@yU+BqL`?n67%BVSwpTfWE{?t0w{e4K&3ETzBIhODk?_X5sb0Gf2+P_o0 z8vftkEdNnnmDRm0t@Cs0WuD8aRpK|whw$A%c6)e@Yq~q>TxfjUmv|3$>%9xmTYjq$ zZ{s~Ho@~a%y0pi6DlM04FoF;9CQXC}{46xSH$QP7ei3xj1Bo?!@m^qJ?OtM?UVM}E zXGm|Z6f}?WH*cy>Ja_7ttQO{s=T7mwDeB5NU&|pfy~uaunaD5JGgYVih;gr}@zZqt@4BW=IATrHQYb{z6xa+Wp>Y{=(pSE! ze@9OS^^IdrUfV%Y*-f$?#&M>e`G@KMje2I7adB)pNk=XHGD=Mw8$XG!Onk+0=KFfK z2iaVr>p^v>fvXFAKx0Lm$LO3S{CM9ai+#ayecZ07?Ey}}$x^Og%<&Fwf8%>ipPYrd zbRC0KsqHt^InH+{?~CkIyZLgO zYa9JouQul6XFT!l*eRLxRqwOLj+f0{{=PXK`{5&~E1&q@)DeEZ)U$CdRsu(?U#f0= ztiwutZ|WQ$`Qc?p3^0l|frInq=&=#x$fqz6;fpmiWzzVIbC| z_K=Z=*76u<&Hgm)4cvkQn z&!Feg5zn5leBPXR*4#mUiRaDt@bn@SR>xa-`kSu!j%-%m($f_8S-0Xlj%&Ia{6yDj znWdA_56>GRe2@B%?~b&E_q>r`73cB>kB1Fv znaClL!Rz?0JU2b9@8Z0)gZga4|2pk)ZrXtMwD_AO|G&>s6X&LJUi!Q|tE=%PJf}4E zD7s#QSVxrF*kAbF#pC1ps{>6d;pXc45!x8<|B|X2|CI41LIuH^;a(2#wEz7XSU-zC%5=L(^Ts5yn1v|-wiky<9r=Q4YgQJ(=7Xl_{QZXT#M-1 zgYP$W$SAv=>UtDDFkSq%M=4y*pfCZ2OCNN9w@2}-}i0eQKHHD{eZIDT< zJ?gJlH|n!FxU1{43HUR}`5F7+YWTbJ^F?XLFnQ;dPagaQE892PhF+m-y-d=`_IK!r zZx6m$JHK1Kv#Iw;cps|UZ;X&rM*c3~T}=0@@D$!7cr)p-qI&CjxR2g$^fr;*Scv?( z(fz;qwWjxH`Smte58Op?{eS(o^I;sZ7BjJy>=t8t7<(7Qy3DbVSetp}nzAd`XC~H_ zJtE)4+OitzxLr@gJ=t?`6YsC+jb?IuTRrdPJJul`Om>XoHye#N86RtJ<9(=<>J#sK zf3GHS-Ca~4#C|A??J=$ey7QJ*ey`}WosbS!{C-teHF>z4W2Cyjs_wCVaXP*}>T-zJ z1H9(rE%6@wZ*-+HHb2BScTUpNO>OVR6Ys<4$FpBuJE%huJPYWGbxxPmxB!ox;9iJ# zMLwrZW*CohFb0aH}l;j>m|lDk#k(z?=*glu~W@^y=6Z)U|5(oPUDNIUW!#V40dL572afm6AJ3mgm2oafM`gY$(a`|U z^KdgyFF;pZkI?fjWTodDeoDzH@_#_quhI53U8(ta!uT|5{*c_0YT3uvc3jcJ%b=B< z;(k$Tx@yY%Rfu~< z^7R=#-8%`*V6PLO>1BnJQ z0<@KP)NUXRl;L@%W^{|HFD zGq|0WCPc=2gYnK_yxSPx`&dFpyg&4qzKVBFvdF$~h*UCkfs zQQ~)sp5tXQ4Fzx{(NS5(op3x!$LKo#UmhLtY=>B1KIbaORXnjiF@AF_es3&}J?r54 z(t5`DxDJos9jh+WntVL0H*U|Q=i#V2%rlh=6L!QwQr}TmwH^lb%Sg# z@^#!cm$#DbTFu9*^)2#!7FLq{E_?)uZ}i0X2@>DviSM*OZJv7O`40aH+%<5vqOV02 z`xO56q*5n-R_cp3GVM#lN*G>J?mYGN_swWn3afa^rp6=bC__gJ2#<5jpANSZ zxs)>Zs}S!{6g2C* zJ|g=ia3+WC8+RJsu996rI12F%x)!+Zpz|kO#c*welX|i;uM6us_p0Z=;hcgq-j9y& zb^8iuL?6aqLTW?Lx!1@Gg$!>iJ*=>%`zCnhwAr zJSp+yg)NYVo;c^s1_vQW7TXWL_*V81oGYQIZRa2Tl=xyA5W+2l{;u&$MZq`-;m#0{KYY}t8sA;=7OyD z+Mj$a_qz0b4Mk)Yze7=6&0d1hIG%;IG<~ku57PCnn%%-%O5aG z+urUgVc&;u6MV_fkMyLH|9N;({`sQM<1YLk9#iOzIZR<{9P^M zS|}OsO=>zF?x8sct`}(iwU)n4at?wg?qSC}R`D%@c)zNyoV!CEwT$1jD1s1HRLo7Uc^(|_&&zx<@Ih_itB;3wEPC=^?BCvt`p3EwyNG&`-1wrIiCCB z0IpZ@Jd@6GR%RLT%;aUVTKCl7{ftk+)9_NxS7h{@j5flr5Nln2vhAh9`Imm`A*WT) zOD#Xv4{6?f`{75t@eK3=&ipu&A-?xGsf7I$@AvSz1a`tLc$f1#7w5;YfW{RxZk6L2^<0iG z1#h|O+6_U;EU+-qzILu7Ku-=C99Mt-i7bzCQ| zH!h`l*FZ7j_n9-<_#5Q1gO}g4$&voJeu`_SxNeGTrp7RXm$-H+D(BVen7DS@MNeEm zy({z0yu>wBXZ@_-3;HEH*Oqa0x^}7Cbos`6CJP|0!FtgW?>fhO&P{N2 zHt%qJoAp3joE2$Ey!Skd=fv+6#k(2hT%v4xlq0$mXE)qFRhDB|r734{32s_Ma2y)_>qioL85i?-FfsPCXqyfN^-n z$^Xi8>eq2xd0rjwCcX*f<$E2kt$6K)=QX;nd^how`n@RYg|gbCeueeJ|GuM`MNjUe zX*8}_k00Mp%8#?K+~OSX{anWLcupOv@K;8E{Db$Aax$$bGbkymh4P<+=Pa~}IzoTj zUVOvs0=zA+=(Uo#D)HG{uQ$eZ5VEW7VVRArY=1BRKkyacc__|!e_|talYhKJaT{F^ z@wy&IyhHK6yyG2;`(^!r`c1?U?@-J&zG)pjPfr=Xit!QGWR=YuYmBnWIlpH;3x3910PoV8_76C}#`#TM`yM@#nbue*c81<+d_K-+tX1DCw|usnzW4^f z)jY?yS#E^?UAKNgJ=fU|+Uf-uBEiG{_6YD+} z8~2^Rf6w0@*H1nDeI^=SptYS2!On|ORzZtp|9%hQgI zEWG4~X*hqv7x$6gkXd}QF}@qxgP!04?@%_+=GK%jt#`><7e09JV@1pEW z-r>lFYo?60LYyQ0@A**i%ozt1BIFBpt^HR|83&eB57d-z-eog4eOh-H; z#B)L1|L0QoEARhfKKMFgt%e7TcYvS*Jb9ZJ4~ogpj~+0XhWIAr54bf+jrq};&u{3@ zCgt^}+C5cSU-PCqefg^M2=|ry#>BnR9-89bs1f9)t)_8e51IdUe-!Vu;yqh;p8hOu zUFeca5w#Crljw_c`Z@Ru;@;yiC{@gH0wwi8Zhp_?_Z_sQ<5^+2S6}@_TdbYhEAKh@ zpQWW2{zCM`JCoRB;xoFA;a!dM7T#Yc=Og&y9dw^s`VvnzUSA8<@LWr8KEAh;XLb6X z7T?zK(u?OMXvoBqjc`2;1;raOMLG43z0iN9VYIjl@*E(?kr3zM*cW{W&yUeik%oA7 zzk`PM(3t1R;tPpA;T-aY_&dcE7IR(?w=?!eXro3KXo$U#mnFNGRHOJlqXi9}X}5>YBh_~sUFjyu(&zmI`U#nYCR?PoIEBPZ?2ehIWIqB#&z~3$gbbsbL_-#sb-eL z8gUQm{mJ}`Z-t8)uOPh*c;AiQZ*dF}w*bC)VNdlKbn_C zje8&bE|({0ewOAXJdAtm5p)#6)su#=HQDEQ&O^35{F=g{4IpD3w(&TAl~?P>}h$jIYk=0 zOJToWTd6*maP8r10etcOdjU0`9$Liwmh3!P#l2QF_t|3NTf&p_8hed;=5z1q@24C8 zCUw1=uTLBAC$a0qoHy7<;zslIpqjpG?2f#B1kT{ur(cd_@LbQ+S^6W^4{lVCm300J zsg0czD&p!3$M6;8OMQG*@x|JP*^c}82Cx|&^Bfl!c^cpD&n@D5sy1zS(eVcTOj8$L~~JaoyNNV_ZA( z;OZ&2WI26oW>T+Hv_7PNVn6ll>J{@$=WzFt`$>HF z$uah>7>6$pz8j&BTFs=b46c{(=ELS-q0wnn!LcAq|e~JgP0G8MIQbG`zl@ zu1)%AGM@Lu$MZrv@%PfP5f)njSZZ$6VHw5{X+qM z#dBjF+Tyt}esA=hqI|`dcy^qD>wi5vmgC<-b(|s3>2&s?b0F`or}a9Vt>m1Z&fjtF zr*Rj~n`rwCuBNS!*p>1eDkj!*#k$u+Vpj6}2*0b+^Pc<$h)r_5X|Ee=xKwaEbme| zrq9TA2_574HU!^Cj>{)XI3LmQ6IA1Q{GLOsIT}jSSr{+B&Q;vQ;kydobfxno5ci&O-Vyh#E108uNrlO6L?<3vw$a)Q0$=ParwkIYnkxf40&<3 zz}F8RfLwfz{UjcB+)Re|p&oDJT)9Y1UX}Y1_z7O%=jS}QLmrF8o|8*_U$|8s-|+Nl zJRQX5)sOLwVdD4565kodH-;yx>d|UAVLN>{(lY>l=hGx(EW8H&bR1EtxoZq z;LXGj75|BPH|KeIKDEJdR$N@?deKz7i2DX{wP|^hH&tla29qm0R&Z>EY=yIR!^GxipqX ze5-bhrtEy`iK~^mb%3db9UpW~rt?!gT`TB0Tq$Tf4vT4f(*O5$yeHsjT6wGCY&Dq= zui@T>`zGF3z&8>0>&4pmZsu1GT4KM2XW#@ptRHXH%U99$n*2_QOmi!U@+>`_ zDE|H3+gRsb`YP8}80kL_!P|iDPjSz49KC^i6VKxP<0#k#E$M$mE#}scKc1`Q{2WZA z@m-#$mh-D>7=7@LzyG9=^PJwQQrdYIhLl%(I^sKxF?`!C$7A~Q5U#`=P!)QxHY9M1K6^eLPR^g?Sq&*F(Wl_&XqrT>bMJ66<+Uz!89)9(-lrJwv}h>^E?CgK~ z++P%5i>{vPP?=8yyT-)4W8&M!eo4+hG$rG1 z46z=4GHg)Sb>$tOJX>#^_|7rDZ;bWV@5nj!4S9oqC+Y5cmH#g93Tm<`7Vnj^lG2u}(Cn9J3SyJo|8@6qkx06XbD-A8Yxs zM*Q<)ll6NYam%5JniiA858~o?cYBD7Ih?TO7yL?*_+XKjVE=+;sr% zFDXa;xkmi8;;X1tN<9(pc@D#FTrKqKWM16Ghn#X*>p1xpPU4I6YHyqeVKP0jSARR6 zB;g*VW}DzNe2=?D_tqjkV{);n8ayYdQQI zzhX|Ikz?x_^=n0YN_v~=iyP=%BHuXoyaQS3>%*(wG{*U7m$(W%zVh4?&*6!4&tW`q z{%Jy2oPX-+tHe3zeYGSl#TT&H{}_UQ6n)#&Be!wldj4=$=S2D*lY1)q@;b*=f!u0y zKa4U~4!J+Z+pO}RhT~dZu7LI857RhQY(E+o!8AR!1=iyDk$*9d6z}XGF6SIV>ut0? zLg!g||HQL(JgZMrH+%(o_7uP3S>=7WUA<$E_a;1xcbS9L`vGyW4(Toar*{0b<9|-Q z@-D>rthGFsTrF38+4vvNj@8wAHf;>mPAZ-MgJM#w4-7bY5EC$m!fj z&uN}#qA6`@$0#Jejkt2};@iY-;=`Z*zPLUu1xLljJz?x!{HlDi(-hBwE$Q#C_SLI9 z&Qj<-I=b*@2QOlcei?q0F@7?>5Aeme$FaBPaDIGm{8fU^%VE6Oco+Pp*eN`X@8UAb zWsLX%>b;-lZtC%KapxiVuhkd(jGNWC{UE-nJ*@_>i78^-HFAh=Y7fi%MdQZzv>(tO zdsa-P{aa|H$Cg7@J#yu@wWaX=Si|{|?zwp!FZ7lYJA;Pqa*rOZC@$s#^2lMBK8tnq zhoP_f?p33H^gX1$736Y9e@k zYs=%8A$s_EeDQ6_-#ByNsGHT_(09=BRZ_ioK;pOZVh!T0^u+yM5AktN&{=*T(KSYV z;@%+c3*N@jPmb~3aoiKccgJy0keNquPcT|;spJ*k9mhAv?eN7l;|@HFpq$($t7WV~ z9fT{f-(l=^m`8r+3iAo)ic9b*6E-ts8V=l0@aab$1xZ>@$I0(919aReW*R)^ z?_>U9wf=8{xP%(jqb2qd%97+>1y;~eSRTL7@;rZIpM|t)6~9{@?+JA>AG zCEgp{ufFl_pq;wJn)Bii$3?tD=p~0P>Jobw+{VLYw8S?uNwjw~UhGq_5$3DOSH_F? zV}~J=_~&^r&G@}>#P3PR8ouvwmE^|>h~JiucP1CrcD=m%$R+Vx(*1G9??~4y>l})= z2Q4v=cs-8C;RIi^s_!^FY2-GBwlsP!HD8XyUU?qjNecC8FURKc+dxxuwfPkO5c?)y zme3II6u;!ndOEJ7;YPXLEpDc`{Ni$#)SspNEj_v9`7HdQ@4Cx#B(5IvY@+WThRU?X zI{Dw_b6CH`cLvMh8$C7}*B5v`5jQKDZxG)e{4Tx>UrNw3TrQ8wWP2#)JP>Rp7e)O@7&ZTl13bn!){-&1OCjGM;;ya2?{3*vrn3?kXHKjijZAoF+ir)5TtDv47ey{`@8G27ORoZWCc3k5kiA zyoUPI6!%lJ;mZ4|Q#1~xX>^|d_g*UAMaOr0aW9p)kBaA{c<=j=zb`^VZ+<*N!+7Hl z6+7@c&rj-9Ozf>R^oA)k@(gp$Ik@$?-V~w?m5+Y5Y#nhtdYsd z%UCDVmi7x>>G`83 z-_sO(2yf-dY&A*FK?_foKxZ0bzm@W8Q-;R5IOAR1r}*BMXBv53go*gF(zE6&8u4b8 z<2pP$aywV?_N+V~(Hmd!csZ^Va!dy!=1;`3L%dI@UCc>LqbcSS;=AjtbCsZop?VH=Ow-`q3;ZI!W(;$ zOrS3v-VxC08a38eAINWq+^XxTHl^KL!yfV1@TwM{$MNVU9DnioNwsSv->+$WQqG6) z#D3Bb$nPvoPtg^F1yq#*1ca;=R)FQ?R%_wPm`Tz{P|KYpXO6jzQ=o$Ve~JD?;szJBt5vB z{`gMl9~?1XUz#7QVFQllI2!Y~GM-g@u20h*s42bx9cy_o%lPrmd2K57m&@%ueL(!x zbi^8(f#NgCXO{Xt&&LL8{DRuV?*SK3>jvr*a~<&x`bqi3yky)1zC}+3{S)_qPttOc zhNsnK70k!?ARTcJ_yjEF&uWPK!P3Tv`@mW1bQ4`w@YPeFM{zwv+jX>My_TPH>#PsY z;i{5E8?UE`&qmjAx?Zf{Z{@gEj>UP@1mc}^HQM4kyZ+Ds?@xT6jyJA_rTHAcqq_pv zvvj?HuMXd*ly!Zj;}$VVYQ2ch)#&K~Rrs_F?xN>8TH4a`jo2H-UM#~udY%y^LLH-*yko${8XC1<3(|` zO`<*aY>Yi0GvLUE<6S*liJt@U#P|6-V0Bg6qHpBW5Lafo#5;&s=Rb;`*rTkIdd2&Q zL3sB=Hr(+JBJutqJ)Sr>x8p}*Kg&nNPobx%zb(jzHavWkjxBuXNJna39OlEdY7*-u z4$7rjE%RdP^BnY~=PcyM8G9p)rt5o%{Rv|oNin&V7k>eM)F0^_PX*+1zg%X+*Erti zOMK&&M$g4}ZfBq(f7a`{I%?7}4jQP> z!|D?2{EyI3jwfp%C!UvZ6z4_EdyU2s-w;maLw$Kol26JU`Z=_~^YmP$Ms3yo3HTjm z$@2^R&G~fP81XE>lg@Z&l!5Q-aVNeljC<~~^d08a?-1V?#P4`%c z@BF{!b9!Ek(ueWQYIAi-}QK)76NkeEf*Dpappu?*L*g=qr(rTw)FAUyxV_8f!q~cWvXl zvfBKK^`H~vn1xTVCN$QAPNrcqf8w0J2v_2KK38o@&=bFTu~(kcvX(Bu5r1k==}l>F)x^W4OXSfA1!$0YH`;9=HCWy~&+_;{`yQ-W#ZNt+n#+?Iq z>4(wA?j)y`uny-8{;`fHu__D=e%8UHQgKQ50?<$k}~WHf#?cn8lOXvxQz*N!=! zJ@n+KWwUY5`P)kV?g3-glk<}b^Msz*Sk(0hTKW5b_?}b#?e)c~%6e1|aqh`YgR=a) z*8Gg|SK(_Xk0UtC;mm8?Z8*2dqcbm#Lv}i@PrAGoudm*HM?ch7v*@MxU6c!S#QXJ! zuJgB!A~gNEhZhtV@pO*YdL@9ttwXPH{YyiOfDVs2-uWBGo( ziMgF0)idUI;$2?M@BFX1o$x2-b<(QuJ@5f!&|_(h5$}?ZX3=AEjB~^xIqsI@y)=J@ z?^{^LyOPEA59Cz49yh3USvAzVHTgH5=F_~3^^lL?U4l2(K{lebocuqBSO*#FvnHw6 zIvl&;bvY;2LC(Ul4r0E%3m?<*;9LFhTx!oUd^o^^`)Pd<8qzzBm#ujD9St`OW zpz8sg8R)8kXEjZ6EvV}6|47^ua}WqCHPLMIli{mv&-qZ zN?d&Fb%TEWLOpY+XC*xr?`Y~9Gwv70sbxm}e^yTMo+=feZd8MaISnnZaV&`Wo==O7 zIbSXV9fL*r@gWSQd0{!{0$#LJ!)(T`LwkHX+JFxe`4D@Y?K4&>W7U9Da-3|4vIR~o`&rDsWctSA@;nRA&;gs6{D#cP2Z~7$N1y-N4N9#3;ns1 zuGZ@FI}iTE(LcRsZ=U@r|G8ow7gJ6ybN&4YK1>iZP7XKIG>-R!>G01fM#v+Z*k{DX zJB5nITmpUlW2~RJSzNNQ{(-Mc%S#QXicc+<%s8_1prc;y18wwkC%uuA_P7rl$d?~r zHr-#VUmbjf`1;@9?HEMEef;Q$qc|;FVJfc5^wbbvN)K&;regO&d>h}Ap3(Glk<+7) zli%~``iic7HJnS}&ot^v-#NUwczg}sO#F>`g2j%HOqqEGOZmM~&h2@&*?2kBKi0jJ z;oV=x-AH$%%ErK{j43+Ny8`zw@Q~h1kK>rUOXG=o`^R`!S$r~FFYlOVnyUtJ9j;I7 zGFn&S$Rj>4Y{Idh#&UAbO4l?vO;1aD&cHH!C2;+QYb35CcxvJq3Pa?4r#d9gxry^_ z+=mzDUz}@4&=l`|;+%T`Uz~S;lV_ZF4!7Yv^bOTOjV4CgENz$Jh1O9*Fz$d(_|=nsz~dx?*il z3qG}>C)QcE#4}uc6TO@G#ytmZTljxUEf32p){Xr^Q|DxTC3YOd|05?wgEX#dyy?v2 z4f?DQ9Usy0D~}%v4nB9M942wGZ$AcJkQf|GoIM5F7`l<`NQk@ z8sC#uhIi!>@2cWk!)@}oj-GYSIj3PTt|!$z)PTyrFSB zNmFqwRkta8e~jLk%kGP_C7xL8x&l|M)!vOKeMz3meOP(Nni`JO)6H=_K~sD`Kg!?7 zH^ljQ9>1A9Tuy((CUyT4Qk8O#0Zn-Q8+?Z&-u>J|OG|Z&HBd1J63+=S2NK`Jc2)ZW zH2ilCWIs(Y4-#`9&E<4dPKmjXH)(oV4gcaxUGcjhH$P$z+U>mFDRwzs?P(fGPs`Gd zCwk6@E}Ev(w1%cFj+HNQ#X75gbj7^sgEU?F+d1*OIkDC%-h;+^t5|FGAfA1WkL-LI zuTH1n6&yqPQy9nd{OK$1E&BKKG}c9|fIaZ5Tr$z{l6rp#)97f#mzipGOkH9grM^1< z1$X6eZP!a>I2l=d_CH7QLg(tE0 z<8fY;rJ)uqspOcDM=ctDgbj4$Qs?aA<31*xv2z)_tFb4-Jl^KwYh`2ip&duLIs-2JBDtPPinQwMqhXO zit}kLjfM0|6W zYm_>4;#UcLr*VzMm8*ocL~oee}hefX2AL!X4kX6vf*RXKQ_R0Piz$j_+F9 zK^J+)w=K;}dgd`sysJp7zrKa4w60d0)avrN9FuU|FTaCwi@h3SAFSFX92;U*&~v@~ zVom8naZgv%lk&V99-yZSEq}|gocz9o#PaL%yW) z_ubTOw3ufhp4G?F@D{{7vr6UpD9^Yq-66NBdhG(P;q=Aa$c^%x!SB~$2Q635iNrM~ z1>dfm8|liwRyVkImc2YjvPM1QckSZ4$LIJJdjpM=UshZVp^@HNpoTMXUAaHdXgzix zed*|nZy%qc>vd4ZfA1~osb2*iT_e{o+!@lkMH41yaODF zE8YXfJHR41U&ogf*C!C~0?Xk1R2|}-V3j22?xOVJ-h%tecY;$T7w-iV>lx!7=}}yd z@aPwqEjHd0eMnoZVJwDYo;p6m@4<8(gEF*TTgkPgiu-2R&9kQJ_zjKW{|``D4K~6( z_&=0?%u{El?>CLZ$FrNM*uAO3xf^HKgi%CGdiss$C*@(f*9 z)74nsGja8i@5gd2RnB=G20NaX^KH2E@4yu1bL4w3?szVa>)2*UN9zx~yac!5Z$?`@ zACFhtcqWeL;ly)DTqho;C7wZ=IR@*|5&M~KhntJ>Q%;}i^LX~ysGm~vIKKIe@15dV zu)E{%e*IY*Pj#3jr(0;q$>#}t`T%C&JR-NRaaNGiR9si_B=*TDk1OUR|DeA{dglv> zZ$69Tny6mW;byv)z#@Lfy=pn$#y3xS=o!m{z2f73X*5*x_xa?#Cx^aJtN5NT_8Uru z$LUDyIdqto?tHC*C-#UspdVu`>sU34b*!Z}%vjQxtZ(|o+a*fB2~b48=zuyOO#z7=-xH1>QMgd;Uy^W(Wt#xbJKJ@Czk&-BbC z*s4~~;jbspg{fRqj1k{-#=au)U1v)gTN&pa`nu=im7a|6JB#Cu?>fIszI>n1TkKCT zUi??k9LI1y66*>ZickFhZfm*Ss-L^i_bh$uOVI*7X=_hQ{QmB5>NT6+H;S)j{15mV zdn$A>c4A+J#GVRMs3|sq59{8&v^d1KH3Ls<@R(IIpdFK z!gDDY^B{sVa9dA}vD|334_@1Vze zu|qho(_4f1|0@6EcfMmk%RT(xpf^5+9di6fPu#4Illkg2swCKZd4wheFCExfgOhk>lI)x)s-G z$itUd6BOsRcz!D8Z!@WTO?Wai@Mi#=$R|f0mzUcX91ZyNAfIkilU?%YCO*CKW8b*k z>YRf&4Pkclkk}&n`WuLS;ue&0edJAQJh4w)>>C<;#iiy`?3Hl}@>X*W=GTMzGN+m^ z#63|y1?c;QKOJ!2hWk&wQ%`QoabM#9LC4LvG?vF%q>BGtRo=Mn)IXW%jCbTu$$2@H z$>iVVJcizkxUO7_-x2ROj>lUai*de+HTi|g@rkzQU{!#&-n_d+-%xcM#jmLl-;{hT zE)OlG)NQlcUy@7gNxK`)gHohu57kmRf6+8wesLe2*q>{lUU(OZ()K9sZ()LdNbJvb zukjy{TU|X6`y<7BsxSO)i5$G+O{@!x_f>I^Usc@oJjzE`+(*sg&(C6)@FnJ3d&pyf z`h5+?JF&F&5=7I0SkyXu3;~6Bklh8bm z-o&x&st57#G)q47eB%g--^^~nP`c_;Sji*;qU7V+iFHP^AszqYcQ{fzmZtIPW4XOmUVUiTPD2{Cy`ATcjlTk( zHg+5Fk3h_|JSc9od>V+I3Jv7+3;YJB;X`_M%Wb=Q*1*{giX_Voa;U*vIliv%R$qmm zzW5HRSa$d3ynjMYxsB1D&R!7fR0i^|5YE`E?^S(Llh!q`n@{tv)<-yc=!e)#q6v-~ z;&bV>&&2-iyjg^n0^(YTiM^nHqNfY$d!Rdx_Z>?o`BjeRJLTI7U(83wGjcxOyeVd! zW3U8Yn(_AxfA6RL1%2}*Z$|Mq=2@RLcC0V>2ePS8O*$6xx-Y+4@#`J6n#q&b^-#=D zP3A{ge&plFy|fJANfsLVLOJ{^@%P62F>KIJv4?tHT(PIo@j|ZCy#4_`pg*3Kn)70i zeq1Lm=K5l<)Wz^MWTNRd-gZ*23}Q;~au82i((=3bcJlocV*OzGEIc#j9Q~HbxUU*_ zI4^%O_PAntxr}>%p4?9NXu4ya$AiX>bsnFoV`7cRdijqM6YD%yCFu`XNq4OISPOsi zVyE%naD3L*cd`DX4=pA5&>ZJ)IN#)N7y7%=zloN^(3O_qcuMiKDm^LWlo=M3=X0`r z)ahqjGyPM{FO=j>dR!&s6mtui)M+)&bGX*vh&hGwrPWq^%qbj{TQ&9m0M~tZzEkfO zxMDwr*>GPv*ARS_XnPRu!C9TYpZFX5D)i)62f1FkpTYt;7S(sLIHd!;Bgf-%jNZM8 z=NEXli{G_rJA&hSy|)UYe>>wkp=PoF_m}!HdbvA}AM{QqeqBTT>xJ*S?yc@cow%B)nnVjOg)D`$j(>I1kHzD~t2)9L|q&T!rTxp7FGmqALYm+0?Kd+$`VU z;URU5-+9?6zxKR2ssH+Ca{Ti89eiIxRbF?dGuD*urf-ru*27&|-uK9PIsZD#_b(cU z^X);LZL7M@(fKruZSl5)n4A3$s?nPZXNx?JJszgQ*%oIvTF>KKfGgHSrJ(6JQ7EQEXPnU0-=-RMUrXyurI##d%Ry-_Z37O?RomLdW2vJe*G3 zGdzqnUkiEIK+ccQwUT$Y;EuHv-{HR%{}B9#a6PL}k3t4L@*&K|xlND7I<}nn#_6wL z)%R9hfAejc8vF@$aE!;%nrHp!D^A-F_~xlctXKaYS3g`s=zE#IHMnx8^6W-iMfu0v zO-}ijhR$-og|?Bj?Z;VOZ>$#or5eU!Lh}FJE3vrPOZ23dTkNS3?-Opsa|Xvr`PGeB zT6*)UEiDE0S$2JqgeR^IiQl}4b+Cu|vX%GeA@=8OXORBtmY#-#df;BZSJGdxPWf3{ zX7c-jJYrp8T;~_Td3nSh0^dPhJ(iZ1b3FP;K5F1 z?IKTNPmsRZJ^#~FNU#3}L-_P9pHk?p^72gV5t4~#U&*(fF%o-)#2z8BKgi3*SSR>`KqjWZ*ZI#?Uhtf3OOk;e%75ltD#>WM? z`s0bUP5(gbD;9e(y~dMeuop7=+xKXBN^kAS?fOhhH&`JyM{)mMZXdyyuw5-<55aiG z-6E&`u#?vX(&&9$Rq4npzp=2Do=0(Sl;8F8O5*h{$ItWfc^Su7a*FRLrpsp+^v9D* zP8F|mFTkfe;97j=VF(k>njJ4=-@4gvslvjK& zANTOFEgN}WnEMFdyJMtm7TYf)daGr(}OtM1}A@R!5e$s#rwdg`JK$;-_*LE{(BAH!*v?2 z+~>}prx*#R;J1{Q=Obbb-QD`LHtxE($La0DIPaI^4RqaC#yt$44Rj^;mYwhKV}IH6 z@Gze~fW5Fod`+>1=!tJtUWK3Ox~>#2#s8|d3yoLQSR=*89Ai^4$JFEwHTmAy@A7H{ zpI_wFTS=}Dayi4Ng8FAQJ^f4bo~F#|brYYa^QIne7Rcvib*rK7y^S-?IMwmDqU%F` zJ;kr|>a{@pe)+^Vmf2{^SWYiHkG#c`&&93vcX!hBE;QEn<@xZXT1}+k2C+HC#oCw; z)aD4(H~vvLp^wkgu+R9hrZKUfT@E?LUUqSucH>J~9Pi@TPy2UpP`}0Rs8sB~3 z;F=(xO1#WW$J=lxj>RyRmcOdGX2|a`$LC*;%>in4kiJQH`_fmP&l|JzLZ0#6%gc0a zQ0ugGJ%%^#CpOae3Vrb{Of7sH@D;%I6Tf2*rj)!J&bQU{4yAJro$uyw?Bje9I_jm1 zG`~S_AIJKw#<|xRuNdPk8Yki#fv*W&i=i&wwm5&m7vI)gbB%Kb&RcNCJb274#QNhO z;4NH@^!JVQO{TAg8oUJ8^$2eT-D@e8$%^@#DI zL1HaptU+uIf9u2cI9Ad!7ROF;ZROHmO=2!K1D|6)VTt%=JRT&sx$3i&$HnQ|&EpF4 zdl6S!HR=O}X}pEU_vob@wBC;YDQHON3gc8Y&UpO4#Tc|@!~HpI!k-6sA-ql1Y>W6F z;xDOH%%lG)?rJ%RllEkHjb`0=$eG*3pr*ob~|I|{Cw;s^)0@iA=Y1hB;Q`Vi?x@rwkOv0#JYks zIATptti60!Z;UMN7?W$P>4|lhv92f9^qj-dfR3*G-UxBrR?#Dk^SE~E(Gl|7ApR-w z8%ya0Iqtx-tK8+DEl$q^@|uL_A}wFZEB0fVD3|~4!;*z(@4*Uug>n6YEB0WC{Z~ft zBp+H^no>UJE+zJjeUui*?2h{R^mCUHuZVB4{pX&6vuge zkXcWcrYF{iJr6nb(hu_K!keGYSC= zy`TfGQ@n{i`EJ8862~Y#bOAcZaWrpQ;EBBl;yk%do&J#17_oQI6#boru6;aePsda| z8F0kXVlK_B@Gu z=UZq$0fTsw_$}2p>91eHF>Bn6YFkLZJs^I(8V#!I8YhoOaUGD$GJL;6UH-&-;<9p! zZ&>c-OC7nr0+(>Lrz7SRe!_Pt8J}Eg%4IQR5ch(Zm*q1_J_RC%o~gX}O0Nv%L+l@L zjHhv)@5Iy6c>0G1nq~L2$To2HYn>Xv#`W^l>=4(8oeE{)|`$y`% z8DDCA*YM~^c|E1ppT@a}rpM&618%|lq4y_<@imHm+1Sns6OP=ejdFlc7QSC zJeru_?riKj;$m+595fLh^V&^$6?5A$uO0P|IqleEDdw|Z;&FTj9v-hT?s)O>4S2%m zf&7WJsPWx*_?_@N;q&n;ypHd{$zS^EEuX9mdN$=FwlGxo!#nUCzhxcH~!l{}gkWZPc(gUxxbked=|#l;=LZbP{5I zY6Q=7%5#+1Tj<)!vsyGYH1;*(8;aisxs5+pp6|kbxX-v>!dAYe!@mG7$iKP#cNcSP zIR^R~^N-SwN8=RX=c|yK7k?RVhn}0FSCZ%*RMR~wOf&Y~#-4f={ZLx3#PPKlI`j7$ zb*c;F9j7Oamr6dfzQFr6zCY-mkWpWYjo%;dufCJ@>$~*C^Jrdr&V(j$haeqo zAJg+5J-@>yy&D=@>Dw*p5btjP#Mf3GM(CY!Y7lc+A30yOk?Ty}Z{+^)76Xo>Hf9uk+1p5d?)ZkEd#o^`|Xy4Z_qbBMO1j)miplD7Ob#cwyxl3VOm z6LXv!)%OVAcos|S?Rzi&9eN@ypVF#HF8-9Jts2B$z6bC=#G|sb#hUnc^*nJAF{K*z(I2IgU7H~n?~bH#%}|G#Q1WW`ycx`!;f#Cg zB6=cO|5d|X8+S835x<>y6U{T|T?5b1T1#!;k!x?h#X6T8aGj^EB%YR;oa6A!;a#%Y zEa6@3iSz=*zDSSbE>G)8{=KVr%G26j&RhAogvM^_(p_ERnIspj@k|om0mPcNo_GiH zv^3t@JdJ0Ok+fYy*F9=|vpy-PwoBFYJ3y1-4p^e^|Awr58wpb&ers#8+6<;|4y={$ z1Gr+n^BB6?^6gLfL0$cGip09Fn6HlYUh&OWep(Xiz5f5!cWn?`MlNx`9nXV_d+hiQ zDDJOgPWo(;`IB=N4c#B8%T#~A z6H=)Ac-p_@>1=*Xt>%C8<0^eL(?7=?L_FsWSNpd3S~&lmhFD_|`=VFJm!Fn$e3(kd zqqwK=whb@h8ZcOmE~)hjwZ5AlXJH#Z;@jC_a(PBS#`ow~i790KiZE786Ft)mw$l@9 zmF@Gdb`>2rxU0*pQ98$g zxLA8xP>tdnjo72&E3wD;`=oqgzBl%zm>`#va>+tZe9Ld-j4-Zr5*oLc_dToTO zX}TNlYj79t)leFL4c@(oyPIQVBrUI1aE_woT72c9NJ<_<;@&at8y{EqxL=HW#lh-d zRUUnyYT?W8J4(>@U3KRx{T_R#C!Xq@`~RMc#J3GA+5Yl zz^`%}s;9Ej7r!CUPhHci>(^>DhcAoaQ=Z>zjIqWT%j*jG#^9?X_t-nTFph6|+li(k zIO_7Yzqs-GVFXY2LCn((iW<|@!nq*kY7+A_`3haW-dydR9rHDH%X_xqU(D6S+N_ul zNUY1ca!#N;zK0>!XC>wXuAB!*%mKu6f2`9=FQ+nciF0%bUd7s}!|;%EUHtaPcM$vQ zcPZf*hIrmfQ-(JFH0RHIFb3BSh_yiv$@e=r!n0>_$9>^Acosg_A1nBkgnKsZlJi(z zjly5w@*6W3X-;+S6vNWP|t<5ZZ<~jyLd65>jl1*_!{Cnjc*aYLq*k*&RC~gALn!UuIAI* zxL%NN4*r~il=#}|ji2PbS&G8w$C-gzG*zUZD_jWb1JFoG)h+c|se^$Z>dBom<7kTp-o>F)k z!k>C7H@{;&(3QUp_X=;;Kswr{sOLYpGvY4J>yL52iSH5|;rUv8v7UJtzG}P~4o%hX z9BpmnJQ0%ReH*N=?)Z~?%R9iS>cKjhC3?e_Fn=W@Nj+ z&Caj&d|Ev?_E zS$v{b5F4=49=h6MP7FPKgVSphws67Ud9^w z<$Qd}cyV0zq4y}HbdH^DtjT&K*4`YV`(a~^FjhzWY3OdF#=pTUcq^;XRQdPB+f99v z@II&3ufa*&>2bz)I+GzoE#vazdt=0RW!?2*e1G_qF^1B=2y7~*hfBx zF=o)5P0ez{y>LI|Dd)V1e;AGNeQ|BaLqYoL!RLHPiSq@V57W99Uuk?>c@S#_8mnJ= zdW+!bLGucAe4ECu@;-s@-}`$y+tFDLZ&{pwLu2(Ti}OoZ9UkBvOXCt6zv9Cn_3AF~ zZ1~<2Uszp!*Q39S-6QrSY^N)(5o`GOdXn>n*s}b4USGv^Vy@%pY4s^i&nVtMFSmGK zaRk>`o_&Mk9^>!k(*YWW(=b799~=KO`Mrs!Ie+reF*?Ab0rae@q8Dnq562n%HII_l z0vJeNyf2KkG7r%f>kuEu-2m_HxT?u%fnGVrGjjjEk9|g5BXP4}tJpL&#avJ93lRIH z-72S7)Oq-plPCQ_L}W@AdZwA?A?3g!ramx!zn0 z%c|-HJ+zvJ0#~^{;Cc+#S?HO;xhA_~i7$8JJ7oNnyxaxn)Hv2-?hsox6&?J1UFs#kLcByJI%i%MYe~82>+1*H+?VuB}Be_j}N* z0)Nyqy<9Ttjd&K`t1phqVT>GB;&}_tY;{T~wvXLX574M+p`;hqE z*JChN&dVU)N2S#7r}S&Ak*I?&-bsz5^$(nl=}S`MBRH$dIiKFWPu{~|IzOM3dr5qE z@iLVf#69L*`dVnzTVYmd=Xf>06?ad4m`N`k#`y@YEBC-SE8qAw`81xy9vGjh$x_;0 z=3(r2F+;zVk?S0Y{{4lfAM{4-T^sLoV;_d)c#7jll2?3(8vEBShjVz|m1AQ6+LH2I zjdNe*iK`^va`XRT$9U|iaFKUU;(LIm<#;CPt*k}dZ^2+Z@w`7@PPN6yyXhJ@;(fzf zzK<1u0R9kvgg4FfMKwM5jC>mL=WAN#@u(DU;(O`$og@0=y2PK{bXCSP2d2m?51(R< zK{{MF;Tb2ln77O1Z^u-04T`_7>>NbH8Hn$O)ona~VlC6P(c5yW%b(snJx0@w;(PHV-T{8gm$7tw!;4rG@`Rky)N(wEsm#j} z>hYj_?pNm{`uK#r+R7*Pf4)sV)&GyT)A)J}hLlu)T(QQg6TSxchUuT+3!bm>yd=N& z`gbjFf5iEn{1UtsaW;XdSIiFvPhEMX=X*W51!qdReWDkar*Quy$FdObh~AguBQ(dn zY+>VUG)60WhdJIlIet4sKb-aGET;Y)@U5aR&d*u#T_x|~c(UT@4Ds%=B@D|XUN6LN zwr0c|^E(H4aFhqJcU$b^QkSMIa?Ip!yFh&7`H$RM@;m(c$aQ6sIyE%*dSiE#*CD-E z*!k`n^{NjO_|$@i40@p-u4cxIZx09a>98JLCzqS>O~&_+vGel&Dm5%ooR558sh9fm zX$-t7ukA1s&tbmDd+bN}9`Ek2!POQ|FDS$3m>as0u9$m`Z{y>e(PJ<~Uh#c=tXJI) zOY~AR{(KAZZ9^WMC2+-kZ5JN@AjfjF{0;Busbn1Sz0%`i>pMPHiT@p9eN}pWH4jSS zi1)Tf<#q>-*W@%oomRmDx`xVW6KMt>nzbLP*`uhnQ((q;o zUoJvH9PzDmx$s-P2dnjqaBCGcq3dnw{SCM2p&_(QhjTcSGdoYiFEEyG*YK(teC60# zPUAGZRd_a!z9wS2>$w!-p5=8fImP$>PwJBO|$S1FzV)O8+5X5~#SG9bVro{Tx#M;#B@x|KIQaC@)j)%rr zqk0QHu_m>%d=?o$)}wBM#G2H<)v}2EGN@%7bMY*{j)&p*0?2}E1JCpGd^3CxJNQ>X z&%V#Irh4pWy!B2R!Uv#i@$-E)cn4KmUstsR&KW&dpq1L=9{wmsJwHK*q>o)4aYbw zYsF78W>sTmHeRfq?xSX(Va*usGw!w`!Zqt*+8B+z<^|(^fFxj>FLp(D| z@Ja4j<**u3;)!+r+ko^Gr*XwQ)T8von)&;2O@tXdiFHZW%B!nhlh+g=*ei zO%|$o5B1HLj;HWLCO-3Gx|q}cwjVG1tL4>lc?J&Aa<|xxYMRIS^j`fI-%(VS$5)Wr z_*HPk-fYkFq5=Jz<-f?7=ONz34&!00!H#zuQOgEA*@=V1f6veHE-T(+{RqeOY2w`c z-}Ca7=j2gxh;vSyZ+;WgR4<&7!hl{-GjYdva7O(HHMtj?p$2PY1qSgC{Q->i@1ym`u}B@%hv@)+od}kXV;c%pcW(?KC}G zO8)wzHlA3AP=MF54gqzFJap}W&+z2bClBGdi0337Y49}2s}JyuRsTzRF!qoe;uu;| zNnZM8J-#7$zJWLftMaK4p7@sF94&Y8CXU1GbmWKiMO;f92e0zze;t$OlO4Y}S3w+~ zsrVGn^-Ce~T>mnCpW^<9zQnVA>`6E}$+0TepLzdd71s=!#*5!a(;gn>;&B%JI8kov z>B>RZ1M*oyQw5sV(=<+O72{rniafdq@lC@pwM*=$(HmE+XZj7_1$j2q1O4=PYvacp z!`-+NdusfIGrQyCD}HU4+jWlj^!Pqe`z7L&`5oUCmF9C3i06Zs)>AgZTbLKIj&dlj3H*rrr{((prYw#j^*yRSU#ahDz4w|tQsR0C z{=oM+FJiy$8F==DeZOoqPG8Ss9Nk7pVu4v$~|8y;)uOo+KMY%#W7&qRdh%1*5O4xJO%Njr+vD5KT1d3 zdne(G_hYxvpASbj94p}$Ix^6|2j60Rqj9_@j~DoG2~X^abhSKE(D8_V`Aa^r$J~|s z=QW5PQ^%KRIVCQ$vB$~dI~Zr|!Q#t{T?Att2d~r7&e#?B@Q=86jGKx6pP>)^^Pvom zTJVq@O30yunhwV`10LnibG%uFuZVL(mn7E$JsWETQkHZM(;tIze+PZ=$9EZna15j4 zDZM&N4u!>y&gZ-%m$Ht>8aN8-i`l%niMEo-^5w-+9#o{E6pnN_Y8v|{94W=8bS{eD zK+C9)3PH*edKaFi;a)r^jDHhvJM*QfTypD;wU7bdC>$+tETZ8C8e(nH0s6-{Hu};W zzlZb;4F`EMk*5#o$K$k&)LUujXv~MJ#h269x#+l$j`)qANpe4>rZK1gy!hX%t5prp zs$z2)_YNLpHuiDeU4mxLBUkH*yXoy{?B;U6A12UnLF^ti$-#%>Y7*;jFG5W`Yas4# zw}~&#yX-jPJAhwlm?G~&G|a8!c$3E{v9V6@b{@t$!MF|=)CaL1^F00kT^|^0TT9b_ zulQJt`3H_z7g$z&G5TZeLw`6Xk6w8C$h{B^<&B*|AJkBTVRESZK{utgmolT&{l zj>Peuo=&fZ^?A^zBwzU1mJgZa@+18h#m4?M2WV(b!)p-dh?e^4!)x3p>4W$#Dp@bA zQ_uJ|YKfc<;(J|RJW-ktYMX_g_%JycV^#J=RG=*fj^27Cn*<<}W+JiE-2%lLAh zE8r!*<`v&iPO0S--#Fe!(`#~yZykT7Deh06!Z8!a8R(>5cgS<0JeR6>eES&RJ02)S zBRy5*m=;H@yBUcmzDxLuH@R><3>h7}ABY(zmtJz&t2Xid?j^N3pvPMA<{RF`zTnyQ zRjie|Ant;=8OA@PPVvoV>;-=1KH#wj_*P>sruRjEGhYpEHO@?Er;cwMYb>27>1A9I^=t{q8B%xU(*)t&$Q@Re25nAdy~-wRL@U(9hP<~BRgm6+T7T~390avNRk z#uK zc~`E(-&wBXQhOG|(MO$I@cmV_d0zadki)SQYoqRz@8l%c zVcOQoDV~AiyXkm9voA zab8<(=aGN>ye+uUy^Hm_05cDpdPyk&z(4i!Ts``2rtqy zu7-0zzQlDgr}(%Q-k004N6$2UabuCo&q(p^VF0d2a6K=#P5L2meT=#EWHl^JR|npW zfH)uhp4o9t*NZrla5d-8^zfdJkJRurI#B()&S$e+vdJT!8<)`0*Z5n+e55D86mv6Q zlll4&d`-tGI=Ts-%G+I)`7WQ>|GqFCdyK!%_^;^ChFP2+Y4`zeGrlZ_oe+D;*Qci? z?r|k)=ace@-&m`L zXE?+<);!KRF<&~z__NjfAGx)WTL(z2W3A!b5bIdun}}5SV=Zf}Uu}&)7yg?1aw>mb z%;X%9)wvB%W_A7yKBh7DHku^1sahrWH)=&+>~GYDw%FTfp8R6nQV+GtsZNDp4s9RO zwpwrh3>|6gL|^S(&UrX9;_RV^I_bs!u$5P*@a4pHH;jSiaz4QOVl>X-UF-)F@0dSU z`@+r%xpCH`cQM|0=7{}Ze#bpXj-Bvj;ALJYp$7Zawxyg4(6tBV;<=l?+i-mi@ow=I zNW5Fzg*VnyXW z;biEEBi34WhmrESo>#kZJ&)&3J+%YZ&2owFx|8`5?`R*E%ZGCKwTx>xzZ>wRsUGMK z@veM2Z@!mLcJ=EHFVgS;Z(6JUOn&sFp$D#5UooJB^AE08dSIja|BmY`$I0I*^;$ZA zPe*H9vqJ}8I^p^io>R9~Fows~rm# zf$s=(6Q53Q!DQSpG86jzD zC`kjQfl4VEg(OWhR7lZ4d0yww@B2LW;rKt#a~%Ko|M=lP-`D$mpXX;^*Y%wxx9@1` ziX$_QSM=6X{Mw0Q8n06Gs4{RM^hSF9 zAg_2IF@{f<;Q^kXb?nWdWf%04-&M5qgP7mbLw@PxS6|(pl2g1_E29S!@78wH5p!fN z&@h(QJ>*qZ55;@7Gd#*Hm-2F%3}^W>QXVLhzT|5Y$L}Z_7DK!fDXfRiivOLCQap)X z{6Q~m$8!gsOE_Y$u8n%~0&jYz)_ZUrJ)QAAz~_Q^`q2^34skzo*|Bg|PP6qms+SV!A|zf<^|a-XiWcwUf8lA3ITf$9?H z*+UuKZ}X%wWTU4xTtUwwcw9cqZyB6!!Vs6Z>ylAgR@h$x=cpFO7axb*z#glT_&Wm`bwjYkEZC`$DhFba~*1q;v z=QrSWTt&tI=eQCd>*+$*4E=iq#?tjPj$iqj(2)V(R$NKEE!g0ncQlDT4esY{A2IRW zB;I9y&ewQ{IhwbLcbKiJ@T|IX2aaN?+_TUykgsixeFoaA(MCNp7+3WF6o}`e0qR{x z5BHK|E_~hTT2$P90X=;ycvr=ruDm{3LqGB9Gj-c5*QN4wnn`K_iy_vP6n1YK)R z;`bQ;f?mAI$mgSKRGOZ|yo;*Y)j)i#`~8teW91a{Emo^>Dm?XRiuo4BamAdAm~SzY zp4;dtfU6@-dGuX#x_+Z+B0Zm|eFJ>4&tDmSzoG}O!IM_sorG8?G9TwFJQkkx5j-q5 zi@upFF0sBOnTCI_F^RR(iS;D|#a%LXP5Imiv6sl`T+U_i2i%G)<|5yuX7|ady0K#q zpW5`tJmSPN>F;V2&!p9O5znF}#Ke2ccovQG@C3aQ&!O=Qnyo6YAstWa%5{?7iaGle z#f_5hNq=9#Sl7zAk-iw7OfO95Wj3`v1ru;p;K4>7+*!jlM;?868Rv(`AOoHT#(YgZ zyQ}9QJdf(FE_x*PsvRkA9}Tl>%1tg6#9qb7a=iFd9j?ykoS-*e=D`|ye1IqB9i8Ln zr^d}M{$+9Pc#tGE?jcj&KgNAyZE-2@8{_w16Zedt@iB4V8260%>+4Tc-SBLs;}le- z<6($*!UZzOou+sOdy-d2{qgq&oS*T0P~P#6qou!V?eAhf@oc)+!dW_2@FITyCVu;7 zIIJ(GCVbdiTFu43z{{C(+Rm56Z{ftem?JP$KQ!lOO?7I9_iZ{pqHB0>dNaM2dkWVJLB=#eV?*;MB;%R*v-^JSLuMB*ef+xNk#J*(l-Jl#@@y#F! z$5~#-cY_Dj>NEeUj2gwWUhGX6&wH^y;k9^r)AIq2*qborzJ&3Nceb|sdG+cm?q%2_ zpJUL8m$9G2Hn=D*&OIfJJI}cF`7sLy>eG|;=y9yYoS7l=iFq@1q7L$?!i$(U^F0l@ z`H*t1O#5WMmEfD+jkz*AAm;GKoSC2G6Yp|2$>}D%f5~f(Tw3txcD>gEcWJtssaJgH z%1+yOx(cdSTj- zIDeP#CH0Rv4{do>g}!)C{1Sa_<(!*eF$ZitJ<0UMy~t3H znYJDf^9KK->$(!|L->@Qo>kBWS1Vk@d9%^@TZ~;_UU$fAr}1ay{pURPx!4@?smPOo za{3xi)ch84k2`N%q1JD}VYm-RXX7u!^EI9WbX<+=OL_dxp9{Qs8P^dQj;kK7E9CJS z6H4fpOXAP#nZ$dxGBm_o{n%qE<-4|c&zABX+Y~x-HgNu+VU_x<&@-WB87*z(Kgjr# z^iCHwUP;3&JyT0)e+~%r(Zo9nOm_!~ZuOA8R0o^X8+xFF?mc$dSx5JbC2uB|paDxiabr z_rn34V|X0ry0m!OLVWKjjB6^yvuss*?hRgf#=aVraaL8^Uho<2&tV#!+2z~8ID@Lv zWt@7nZs7Y_h~wf}p1(o!Gc?au|7Cdl<2(p+X^r>H@p}jD#h#(-Rp*14ch*+?jcN2V zziNxmFSe}Om(**gdH%Y5uc4_n&z8{?>#|DdgIMpg4l3e{_q&DV+r{}|IGn;A?`UJ4 zV%#@xX4}?HeA{a}__9Cxc(n&=&fYx8QyN^iXT zliiE9c?{#DW)xMo0W9>w0NCG>P(xy4@KG5@o+UapbspXE9e=gl}v3w(s8BXTXn zr;@m~&{Zw7^RD<65a!pF+fkanlvk@F?s3Fdme;y6{+X^NczW^b6PU%T-+478oxhjc zSzPyudDOY&FZKC^hR4L`;7wy3n{m{TS1ue4_2lhxYf4LeSNXmkZ|I4ApVrAK_I!Gj zR}azjC{1x)`&5qOKMA+J0&oaf~h&(_M6lpSZBPg?N1Fz&f>jd`IlAM`YB3ycx- zL1P~1alB3B{Rhue&IgUTprh$qrIs-tH0FWk#(7+>@h;*j{y%20k@AiEw23ecq7Hp| zmqgpoFq*FLeO`UnV19i-TkJ=&JELbVnm&bi56}l^G5Oz2W9&=vJe^hX-OR%+yjx6T zM|IhRJFy?hCR`ij7IUK;;d#^FmX+6Ld3_6A`F3q_$FW>$^XVn{QZBI;C%*rEtrz0^ zOeWgmz0`Sp@y>rHeeu1!Csd=W6g}zX8RwI@2W`QZvbf^+H{)AuKbR!tn|Pg`KO@8p zlgkKr+&Q2HpAPdp=0ZKJr%H<-&DU3}I%a8kiI&&I7nOT`fB%@g&p=CkP}^~~ULM_z zdx{6~tQyz4P3m>WD4lK%lQzsS9%ez^giVBGJH_08mQn-0+zI9JtaZGVqVpcu0`VSdyByD| zccILVRhYu(!Za2AZ+*(^ zep9Ekp1Vq3&%@m~-k@m<9R=i*_-&oV>UF)?wtTuQHV=QEplKoePSY*C*`;>zZsTsX z8yz)*?#4eLw~WRO-{G#n6YsGWLfs6m@vw{MgZXutUnlg=*Yf&~-|@}s z0ea>^SN)R}$scN0o;Syhf3H0D>9e~2b|MXx^}&uW?{U2x^IZo*PF_z_t44VHI(NMq`sDcnf8NJ=y}G|a*AjmB=T8Ir zn!zzxjISlFt7y#3^O&m9Tl)i2K@-3^`ObsqB3kVVXUWq3_X26Z|PG0!#0*q329o{n;Q1kY12UOqeZ zT+FY^B#+)W>fwm*^gG1X6nmN{AJlffpk=Q3$@=7odN;}KoJ{xEP);At;YDuo55mNys6fZtj_d0y>rePtUXA4Sv>yDj?msmiiR+NO zVjWHNUq5`Qayb@x@}-bsbq63@+V z%Be0r)r-6K@#KJ<3e)g}*ca$XJUh2jpRq6#Ca7zE{Z<{(Oz$UR^}TBXrz@a}S;~IKG$1SNuH8%f$D|c&>|YG%26$ z;#=j_e7PTb(HPgac#cbavyAVR@ho>7{^rkSe2IIUkLZefoWCIMb7Fqkcsw8THitUJ zJKmJ{I3;+Ujn@<88Q-|N;mRd0o*^2^tq6Zh(DSmKO35kln{k79xPgaf`4;brVr|nQ z^*YL@8TI53{xN9{9q}yRRh|#&mmlC5EW%e8U+nibOnsif_bBf#m3K{-Uq*Zl5$urP zwRBB~-B1L7VqRu*oU0%)FEi$$EX0{|PGPBGWuV{uFLP0Tfjc?NaF zCgvIJ;df$=K^gVCi8qhY($M(DjsJ-HC+3_~6Blz%vN(>i$YYCo#hjBJ;{HAFB<7q< zmQTz%ISMiFWTaziE5CQ=bZ-;=isw5VF(=~?FHReGehv5h#vTG)#SPFy)%iP_j+dZo zHpim8W6zIvd@O7H8uGqMTsGsy^VvsGN&IyB_v5&vPj>O*Cbfy{Q^f-APt~G=98MZL zwYoM{gYU%MD(*Sh0q=^>WBk9MEe)sfnA9vtd zBd({spLQJ8r~NDVEVVwOW2rof8UIGu3k&%0J={gl6>_?kAJd>@1@{6Kc?a+5l?UaS z2Im5(g0CA*pTa|Yz2Eu!J=$({9$amV*q8j-LTbh9SW|U7UE6T<=ksy;#_HK`(&!^G z`}D|z{yz5OctW2{m)nax{$6ZZ$I%tE#T<*AeCQ|cYhxTS#_zCGOb;=Iod2uwA?CF$ z)Zg(eSck9Q@bY}rk>-@YrO}?3EyUccC*z*KbwTGsJrTd75qlAST*~;k;(VR>J&oJ0G_#L9Y^t_`cvA(s6dR(v9zLQfOb=b_qSm$~NUt;gDyLp*bEl#S#NBBOb z<7=FQ`ICX44WWQqcP=KLpKGC>dSu4a9?yIH$wx~by)_I@h>N{*ZiOCnCDW7morL)P zt&5OMS36$C?<3^kOLsXSGYwUvZ8N-Wrsyn~X zaSM*;;W4@V0*mERjFxuLn!jW8L}5CmSrIX2X*v6iVK&YS3aMSh3jd-{Io&j=iY<&;EYN%#;R!845B1!~s=SA0Ww z#_`z+=LMekz!&eS@5rPdVFm6b^u}DGXK=^+?jm$Hr13?b6`(KnY+QmjKkuf%NL;Zm zdn$Q%QHQtj4a?$K%}x*huaNsJxXm%q3*sI$_FGNt%RU6}!+7VzHR>6AvsaYwBM{$1 zlkvqGj;!ht^K$=xYdCI^Ut--xu*$ee%+G zk(cl3v**;LE?w{NFrH`f@$Wil1^MdnMa~c5odxl{_5vj1ufe~?a*p4L-iha3@i)v2V*m z`sgv^&(oW+r(Q=o;ykrlF1PaKWjF#EcvBDOSCAT4%tgwa?AU@|p}%|@;@pRGE1p>U zS`$}GIbDaZg!miu(qh_@bIL`%57PC#S~thlktef@>3jON;401A_`Q>td3#E&VqR zlF!Sb6J5FR)}SZ$wf%;MtHoXt_mjBMv}}coFhuPAbj8}C`Mgd$^$?H8R&w5z z!=sL;o0Iq^zAm)mMXZsIZ}O%6?RI0mW32h|p3A>R@@N9PD)?Ldbx?fFIsM4kooSA_ z4U6F@FJ9wi9z5gu*;kL8F@8L6egg0EWhb8Mcy`e8LskC`Uz{tN(>@+oU;X+n4?5CQ z3D-=uh~HSao~HBq^RT!h)!Yk;tIvm;bi50#5K0i zlS-%+FJ7Ucz47nC^JdL|zE7OP6YCUf7=JvDYxy3}*q`&FhqztPkcKq+DvLZmQ``4( z9N_5}IC9Xl8tzfw&mq3ARo4GMsO9VQtmVlge5i#t*4W+-Vm#>GjoMU(bu3OYBe%F01eVOG}mA(S%R-eWp^1MU;O~kWM zeybtY^<1CExg190i)Yq&UM=O^au{an=htxO#M>U?8MZY4dqZY?@6Z;{tnhl45G82oQJ`BI-iyEaQjT}JucF0ajy zgPvYxY2*DI`3$6|lzuI#Kk_?nUWe&4ZN`_Ap7=e>8|1Zyj{NxIxnctEr_hv|-<5D4 zfg$|agzpf(bT}IG{Te<09UO!8IB&!mYZG#)!H^>Uo2`DfG4r{*DLazh%@Hv)#iC=UUkJ8@6F?y z6W`zx-`-~H{rLX28-^R>2Abl#TkK(!_~sV-7R8=L@$KzZI4`da@*0IN_7l4=gFN_^ z8rOC_XYj;3tZ(Ev6W=E#^qF3`K`sB}*C3vMr%$Kixm%u(i$AM=rEpwDU+nENOYTka z6_@WuJn`G3<8eJN&w=y}gQp>#zDO;{+Pu4l#(2LL-*&#m^*4_Az7urOX34d!TnCnO9LhKDmCi%#)!Bir-89V+pV*(}D98YkaHtLVt<#>^vxW7Mu>n8dA2F>;B zR-EI-SCm_<)i?;(sY6}*UXfpa`AmQVa>_~5hwutbW%<1tTFL7OuJ|tS6<^}pz)G=+ z?*mWqyGee1E3f!AaFmWG=!owFNBGj%*m;coHtn%CsXYCk@#R^b#(rTNVGqRo{&+tY zdxjmMVIE&o8UJdCeZvmnX{|Pk>0d?1YuWxecl6+I>@WG2_*IUZ*hh6LjzN4##_>^g zeaXkDN!`@Wed1fl;XK@@#$VBKRt_-_{t)C9JI?rJ_2A=hNj{J9qZF>2V6eP4%Buul z;$=x!J=7R~9o(<-Whz~JXlY7I?9H_nn(3SFaGu9)a3=QXYD{AVd{gn|k>em56MHbl zJ#yS1kEJp0i4Wm?kIqTrV?Up`51vg=+za2~9I%m|*ncT;UtB=mac}&Ee4DA=Pk3@T z=3*^zPCPZ_8sFh!E%7)!bHpds6vukv)AgOJA0SxEaJo)_v@td^Q z%ke&*Jpj|-1DxsTig$;JxuoC8A?B&XT+-OT>j6H;dAo~zQu+HhXIJDyZaSLq^%}TZ z4ohi?d8KvOJ%gV3&X6ph_|_2L7*^tZ7GKJ53upMcMoxY7PJCy$jxS$9J~<@z5iC!~ zC(t&(bFdtm((xu=|1RNt#?LRsRuTIq9m|YggMe=O_>6J)sLd5>eLuvz+9g@kCad$4 z9OGT>YJv!^_XPV16S3bqJpJBBzdhsmg zuijM9bqe=Oa85nmpmVJnyePCDo z($|fT@%-3{wn;c{5}S>d3lP`3UvM<#SzPntdbdZeiTy2y(2(+4R|rqyTK75M64$#! z{A-0j-p|H0uL|zr`XinGs6*%L(PzB7hWGd4JWW@5zV(Ggcq-_P%J8{7bK-giy5eia zw_3Pb^KBK+;<{Im=D7C7ccC0KpHQFJPxB`H%lH@9zcR-8*|9WIT@u&7`f|Tt|8~Rm zHEk)+JvsUI1CGQwC(bvI^DWLbu_okky%Fb@IIlbnW99e^ZQtP92TSN0MblcE#;C(v z{Cv`}JrA}*cRHu>U>jY1aj%6gyv#56v+_QKKc0!M=3iU5lg_stXT#LHj=T%v8=B4g z5*&45ni@Bi>rI8!OCO%2^+P&iop?Okb*1egeRe-xzl%LBzrSDujum1XiQNFXcy*kn z_-3C<{1SN9G4Xgg_X9Nj$g`R_Ysx9sT`ka8g~U~X^-xA!Lzu^>lj44pOMKV-LG60d zpS`YkFaPx?*720#LsLG_z;hVJ>d{!k6YEuC-f*ntiG8uU@#TM7&(n(Ub@W55>&c%^ zJij~Qd^fw}4o_wruLSse3>x!g5*)<&7sR{6op7LnT=@MvfA3V<$9Y^nwZ4bOJd641 zG54mRG3Mr?O|CcasXbj?VFVn)QyRw{9C>T0g*>a{$tFJL*vC7%FZAY4^-0a2&BmWl zmd|3Yg**7Vo<|Mkv`K6q^?KHragWnfPKD(3B8C?0H7vxb}IIItQ$)zU$+wnfuLB`t0Sob&*?=TuutN%~<&f|;o zbjmf5pUUkkJQZmxO;5Z-oJv!yqiO^z)iU;pi8%#7K@A-D!9JKs*CTT6M^j?0&2G8= zd#%lX&a?C-*4M<^nv`p5J`aSLmzs^4iF!Z6(~l zsDBBb_fyM1p%)(imsE=9S@}GIzawFZ-abWJaT=Z#bDLx1X?Q|xKECYJ2NUU;sE@|z zg-UfD#}NB2lK#JcM`MKgHP;V`-_UrK#@Y0Z$G?)k#P4W)t8U%#cfz}%mh&mkVqRrk zd`t0-loOj$jQ-%^ZoFCW&fr07`G18s)-+FrFCpgl zj-hiEuJe$X<9kkx;(Kt+^F1i<(X_sguU7brFXr`TQ`>iV81s4`fOu!#N{(?%#yj&t z>N6PL(QA!qN|#I@^l*IEuH;w{AMeg%KGsl0UB|cWu$!i<<<%5V%%O<63-{2`RV|9? zlLw2r*MggI4CYt-9`nsGS8i)@HO3L&8~yVUuI_R>h^L^uN<$l5r*RFZV=j)*^6P80tj?QB@B~e%oU>My=bhNC zJUju-9LqO|i**I@?Rc`WV@<(J#=l9O3X02C!u6TAOO4;&_(RldtDGK}&n>B(gZUBP z0uRtoTpsbf9(x>Rj^h{>L##WFeU0L|DzjXcLVOdP#i#f#*i%kd$>(!*?y6^EZ-d%& z9f$L{28fSuufNM>9#1CFb4ct&8oq&h)p&W-n!mr&vPj%P^=UxQ1nA0>dw3GRU2qys z;n^t1SnHNgjz{UL?YvNlmeh{r^m-^iO;cdAWAYZB4TM^HdoZ0%jWLOLIcWPBcLm<< zz}ry=#%VNugg2+-@h7~q`1VWe-=@hv2qyr)A>HMxZMUG>O>doL8C zJHCm;_mFgWN%M_(Li<+qs5bKuL8v8IWe#Dc8#~0vr`NaC=LU=OJ5$l-i(Vd33n|K@Z(SL?T>Q{=$ za`>4Ws4NPcFM)o!U3&^UMA=qw!bx+g<#KedZ4E zc9XwP>@`=kwtiBd{4{h{qoOp7GJa=c$DGlb#*Xh)SK?VEhu9-2eqW)5y1%N%FI9A1 zSC8|?JtaQYP(2UN@pHYN>nkqSQXPZ};`SInyYXYr_FhQ2o@y|^Pw*p|rdUVyJzWjx zx<^_1(9?mx`Dog~i?GHUzv%FY-WT)#Hd<)d8Dz2g{|*A;u2eG9LuNftSsf}L{e&*ylL-HDdZ)vC4JzJodXdc1Ki%d?%H zu14b|eRLzgN8$U3rnL0b;CF7E`S6XUE!H*65*KS58u2C8H9VBpd4@NMbqz(-E7mpK z%%8;ChFI4SYa0IIZ^|`!v7W!T_~@OL{29pKo8*%2ti9L_k;7cX%ntEe{ zT2!Mq)*ZzhxwgDZl6TziCGoAGykoz*j<^ox_n+imNWWI1u>;%#S=1-y!8V}zq`F)! zG`{J?_nbL!75{F+a}Lkv^1qFqc-|~XQ+(UmnM@;|n0J!+o)h14_Th=|W=H9$p>7@c z7w^}r%Beh#*pt76*qtSv`}9X^{ZU+AP1W;+K21-{=P*-E7vsARS9v!f>ROIC-&c%H28I8N=l#E((po`5W39~3)U>^QhWd^z!(X=)}mr(6cn z^d7XOXD|&5JnX?g8F$QUABwj#o~X~`p-p|_w;kel{h~%G z>vKk2)F@G(ntJcwHEK)OXS^<;k4x~j8Ev_7c7yXYt&{IMdIr<;wY=x!oPe_?p9iT| zya)II(&1jt!x=oht%m>2!$bNg_B4pOpY!luNpBlEi^#pE8a(7UyxAE2@W=iJSK<8) z*KF}ygG0W5@$UkzH9V}I*6kI&hv700veNuE9}dVn_7nPrpADR2cEKIEKX!cIh_3{$ zG~(mDw4eW%^inr^R>Q~QPtx^G9^;Fdtp=ac(@(yW9bfV8^*;4HE^d&&jX9NHz@5gd zY|M1VY-zms-jI~+-c3GVi2q0~7xct)Jh_V}*VB+zUyiROPG8jG`9gYbk;i@fS%dpa zXirDX(>;YhGyd{8d*Yi})_oQK-{ku`xU#ByQk-=gsF~av@+8&@wu+qObF0|HdiFZ{ zPC|QLe6E%g<+lQ|Hm}_=gZ^V4FxHo*BKXFfZ z5og>JUZgAT3p?`p9_NgBHZ7%oaX=3%+ThtMM8{eSf`_nf(PJDxk^#bwz>7_F6iPS2-K`nujJV_-d68^K+?M)ie@;2^) z{=!#^57qh5#Q4SV{>9hgxE9gy6;H1fTa%7G{J2^Uu?8a6Kg8OH@AS(H^h_2vou0(n zhkbOEqamI(m%y()*^Z;OJo580@r;&uKD(cWN_g_BZ#<{PUV3qV8_#O-oc8Z$wAfQ` zp8CeVdWmPX*k7-W+%l=rGivfDZ4cs_D7PH6WtZ0~{*I?-3&i<0zSle;zX@_HOjixQ zbmPf-7(i2dv0sWwmQO{0-;*Et)a9tUHmm9R7v7~|AU|q}A8Pys>boYReE9o=-tAAv zW5yn(S7ZF8>bn&>$t`0Ey^gzw9Cy)F1osVkup<69VGRDEe0vQ#(s-DznR2VotNy(D z1e(!U1Yb>l^~Kj7S1DXEM$u-?aWr>qt3&4ELyKN8FY0CFzC1 zIQQYJSkg0=KI%+MZaVITcADv3F^A=uKPx}Qorn0QIWNEWHaOz>EA`g{SdKkz(F$4|JLXaYwd)@Gfn(d~v?H%Qw^4fkP zt#@u&fEL*4=TxY z7e_7}@xE#}E#s@X=J6=jpuVbpQ+O25%uD4J`wk4ovzDfKr#b^y?AJaHYRa=TONr;7s7TA>^3055Ax$wa|7GaF`#u z$8|mb^7E*q_~SI>)lbjr>AL)$!=JRZ)X(_c#l<&-2lUpf&?ddS#otHAWVn+5*U9O7 z{>Qw4#c%=NcXWI!mlAm5-NZ-yeUvY?9D`H%a4Tf-dKJfc z$H!4Th51qvy2$4wZKd^kdK|Iee5^tE21jw;EW|OIFR$a-%bRY6c#12%96R89PEY-+ zURx`>*7D_b+S1bX09^%mlZv)@ADs_Ryo>HEm+bfw@1x^)6XQK}yo0X7t9TFnHlBC~ z{UxvBy>q;iWy^ow!F;R-n(}Nbtr=;3NY4FfeHFU%@OR__KqSeX*4{R-ZflZ zU!r3?u20n`tvq9|psR6CfmkPSk7Ip}{Fck>7V(AUvNET024C|U>kD|+-|V1&3jJ49 zzzbt4x^6>0dF+M4Jc+r710dd&&7onbdfzFhVrsTjUJKM`wAwrle?s|U&gXc`8vmB^ z|J<+MBK8y%spmQ&ww<`x!})DZT#T+M@D6RU7Opyu8|1K9Y-yU>$f1oIKP0w78ub!? zx40jniu~hulim`WPMvdz?V0QtRObRTbW@W|>ahlX!Z8cSs0Qjsd+Ze->-e_9kH#;m z7GvNE(?L>kh`sR@o>aLmFHbHyvlX8^A! ziLI<&u?N9&93}Pd{>uIxpVR8qAL&?+Bfj@E!&8ATcf&ilrseYYJedLopp36M=6JzPKzYImBhujrbsk8B)2;cIyFbx%H7^Rnb^Y{lIW#I8hC{xV!4{u_R^m+JVz4bPpr&#QdU0YmL9i_zU>662~gu zXXMRtIu5~~;vdutzv_bmdTBjB_QTWicupSmY4{4)W?Y~1car!aG~AXN4-FsF@Ud|R z%72=eWiW}C8`NqkKg;Wb4r-r+j?v=(sO5TrqXdpVV$;!H2jbnsCwd^hVNQjQ^g`@6 zwFPfwTrWaNzH}+8=jdM~Htx}4t@nqt?^BE0)!{Aq$2Y?wbT5Z(`Xi&UE66?8Xm^0w z&`v#@;fQDB?#4cf=iV&;d|PWIhYR{PhxiAK_q^N-;fZ^g5_sYrUmJOBhWK9Ji|%pR z=%P8UQGM0$R$AgZ73=ikI<-knTJqvUym6h1>(d^(?pBw$KE24359PIhwpV%Eh_`3x z8z{$C^nFCzP za~Q4XaK-o0AEA-h)I7db{42EfqBZu{e;7{DT3gOH&>8y(G{ccNMu*5Xj?YDoo7H0P zF?QnE93t28kcN+OoW?O)R(xDTUX*adIgm&W`3Sc4e% zq?h?$nTB#Wj`8P!xTdtU;LkS@-|jwzR(RIvho1U!F`kV4xlV2q)ZsID6=xkB)%lRP zhVC`y4gUTve?K_C>#Mpg^S8_CFHirNa{9ygr{vIy7v*d5RUWD2kT}1@^GC{OkIuMa z-E*90;`t-aFY)}5^4TMvI}+!c#Pdhu_Y-=`CDw4q`t>R>7e^o3Q{k9FQ(c;3PllMk zGKHSFw~qNnCm@S{d6btU<+Ro@QA0lQyOA|$nCE&^SiL6WYJ#gEfA3Z2zhMO4*0`Ff z&kK?(ms+psonugk-#Ek;bts#~scCPvcwxu{Ju^ zVE&A65pR0wh4nOb(#vDucD&`~x?Qe!;CfImw326BTi=E+-~gf0uUcly61cPs%ao;?AP!LwbhN6Z4tQ=;5h+a;-;%l%*krY&xatVF*l2w zZrs@8GS)qu5T9L*MmkobM(N~~k%r;w)Q~TA)aO_EJ&dLF!4J;7j^D z;3|jXXTB6Hs1M-<@h!zy6(950j?r_NABAvyT+x5y$8mao6kk^^yZHK&+}}YQ`<`4D zzsi^gczPW#;~LluTJj*~J;ofzi^i`iwuL;d=V8oWEuBl>!5iXB8MiP$F2e(O=E9wP zjN|+kHA#an&ZV275r6)oWt?34;VX3H_WWI;|2jJ#CiYvnuaxTvT*Q%zrn5L={{=FV za_QS6a6(O9SLe~R43=9_@iCw9WvEO~HaXUTN_gr}*~rzI+FQlMBxk za(z;+F&BLfo|uc?1Xs*C{|UPB=V5%Yx62s$tQ5aX{6g{ZEW1E_>_s&w*|pSp;vSx4 z)_aGlIgT8MGjPP7E}7&s49{trj?=V)rnl%XC-yYF!Qant6y?q9FiI|;Rd)V|>FSjV z*Gd?J>nc3$)ax{q$JG(C(bi9ntKz&NpT&IcjrU%h-$PG*`87OB+iE_i(nohD@r++R z;1Qhh8$yrbIz(FmeDS^X5s2RxD5R%u;C)qj$31h*6Wky!=B`xtx5@tQG8FN5HTiPR z_`l2JePb>yq3>zms{i{n;J3JVcbCsNmDF?=AGXjM^LX<3+u9|a8)6JNCifflRa3F& zpgqko4>lLQFXJf9gDu8A2HWX8Kx52_?MY|me2yn|i21L>`1YLG2C3Cme5^w%>+fSd zRU;aX`}?|lo2A#M(y$)hDys+e_9J@xB90zno|A9PRee~_JB&G8d=6t~HRg-*zDpe& z(tl1LrKkTY+9%XkQ;6r7IpXpgH{K)M!K3>6H=bwWS!Q}U_b(M`7k7g0l+QHjXpZ$x zpNsEf%=7f#WxUrQ)@Q_AnR)y>N%z~1r&yB_YcYx&x3|1k@@p8sVxPncV&lE>4#*i`n_5iJs1SzPQt^n|~U_x-W|&?e)>{zHdoKLTfJ z$_LN&bSKtW_c3-U+7Cm$960&56JKJDb!mLDwt8k|=V)kd?0X?`A3NVM827PH@jr17 z`xqbpeg7JJa6Ze6CuyrmOPqi2l}|_hKkN9t*|?M8H+WM1_sf5ax*wNA9pkPOGtBX^ z4}OOy<YV?~^?2EM^^6nGaxu>% z_Z?1u7 zXjtkPi1&3l)cAfieiF9BURY=B?;zgoc9&1Q-yNV|;{EQT9D0>E@s9Tn8WQh#C-Oco zz9-Z!-k-<2-g&Tw-|?>f4S(=+ zt-KD%X%k;6$|K%8{ziLVy*M5IH1_xWT&_;Jan6Ble5#9kJ?>ZZ6%ZUDW=xBmtAWYQR;wi0e zF?JE-R_E=F1;Dti3maF=3LeB9%~En{Aifzd{}O+V_?bL?tFC(+S{ga#aZ<9REdwVoEY zM18NM=Kyc#lyEH4^Y7=a=kdG&U2w!as!`%68MhLSd2)(<22RLpqk4X7{I`tXMNdDe zw!P#t(Q!1C_Am9sWpO)=`zs%>qKwUjE1cGtGv2g2bp-<9_MTHbm!%_IAgs~ zI@-?V^nO&0OXc;hg1$$gKHmNGJ*d}KR@RF+tE$s>zP^v+9-e$6KGr)=!4c<*qIk;k zW-6XvAfEjb`}JNbqsPnZB^qNM$S7JK$91RL#9F90&#dN8Q86?1P2yZLRE}}J=}yZb zi1STvJ<*qjc&;Cy7cN2EUtZ+NJ^nVEy3{G{-KR0<@ph&DNc_G_VdJ0FW5f6n&*E9} z>@xmfImFzs{cwVg=&jr6IE!;24Fio`MxPvmKD>T~jyL$*s;2W$E%%dhYK$+|C#77Q zlmkx%^{S;t|F88(v5xEY&?C2*FqXfYA!_s@U*Ckxa-2^~aXJ2tFV=I#IBry+^(i5@e}C`lqi?ILaZ?=eovSjRs^N%lT@OPqxfPOIVMu)QnxbAy zc=h*xIq&5A?Q~tIcDrGo9?B`#O;z=uUa1Ce^QHw|vA6PP`tWw%?@;@X<@i3nx8;{| z-TP@d#vU(O>5Fym8EAZ6u33sX?)d&1yike`niFf^i_jfw-bdiQlm9K%tpcB#@To1F z6?;aW9mM`3_9gvr9gT5(9EBb<&Vq(C#xc8D%@W6Htdmb1t7F9XGj2&)nvi z@o}=QK31=<`E!upSMjBX-q{ba?kc`7Wf!-?@$^(hIf8jjJWZ^GQ?M<66*$_C4YU@HDg9+)qPuW54To7|+YM z#DB+!{5Zzq=&6Tq72k%IFKPG<2H}Wncpn_A`4dOv@&Kf~Ct0Ju9rzjd zC5d~I-s<`@j<_$$$j@cQjyak?q{XAA)%Y>X*n89@_78f?c{uiWS!4WIKepbrWQckU zH}*$*q7R;U@T-y5hge>bj~fIcX@T&V7rixwv6`jBmP+*5nh^HufUE#y8bM@>v4I zTmz=4Z9y8g7&q3P^i|iTj=dWAVr^4)dF919ot~U{`$9olYKz$nF<<3+i2dfu$RYNu zISFsz`57kQYRls?xW?$cQ@F~i_bgb>tL*gjmdl;$TR($%zI5hsd))c)CDE~nuZ_j! z4{zaX$4{(T?JB2A;t%?>m|K2|udyH32%hW~AJ@ybjQyP0OvRmdpqFv$$)z@))%=J# zYuAWP;&~=|r}1zt?9iLBetoLgIM?TrcdT9CY3xJl`;+nCG4@7i(ZI1Qhj`ER6<Y`c)NPs zCVo3#_Q)yrcZ<0M@8Os%r_AC9ia!I3^xE|}uIK4k^*tf4#&XIaz6?K~;m@~loqXPe zBe05BIdF}kWue?YgTZoH1@~rjT*_w=ypB67?%i@4O;ZbeYs)D;EtBMuMgLCYOZ?tc zH=4Hcr7BGiLoq$`IIi39%%p8?PJO}e8F00Hf8o&(-i+esui|R?yW+;{tUjN}<8x!4 zGiJ(v8Nk5_LO)9TB-4DImEY;lEyy8-;ebFM`}}_w-xYJ zhS~U9;=2jP%B3^Tr}XR#w2Z)!xYv*S{Pp_pA%1Rxe1&*V_cDDy3eS8fsYcE4ROd_F z|F5d*LW-nfTZfv=}p{R)Zun8ZCy+`o*+6ZbEd z>boAx@j3Y&;#FbVO2acaF41x-;zJ-FWq0in~7# z;~qBgj_?Osi}S6QI=l~g`PU0F(!C9u(OO3C14_7;(?h%QcEi~RZkPANb@c=9hs*Cr z_3P0eE$wT{7IJU2mHC8 zKiBB3()>OM>u^t^>mm6y;`5C>UMIJBC(s*r?1%Cou5|QN$9OSj?PP2oHzM53LfX-YWN_h`v87Cz>m=ozd2b`A2wEtz4+q! zbuuqU(K8I+2!DT>rdDEV(G~9uZs*rLnzlMe#qUzA5EpAvKd$Fquz}}FJ%0-RyN2tb9FpnSqaNe>q_w4~xiT!&inBc2uV z)AS6(KIOvM zo~EOK9Jk0ZkN8`~Z{l-*xow0|YBV*+Kl4FT@hYc&nJ>rsw4~g#CgwQCo;7jrAMcQ- z@~e`(j^dg?!z4K2xM+xLp7>Zp(iRHJB?`+Y_A3%+Z5 zJMw=AG@@+?JP0lLb31&9vxgk_!dZEam*-oRoQrYHr)e9+_w+~g^)$yv|5Wa=XnL4K)$X1+K0+Iw zrFk7!y#EAG?EBwdy=ve{x!3=X{25{V8L$Lyq9NY7Ua59da`A^pf6$Vnv>xN}SH?UF zF`sZNPn!GtKG0Cl`~j`hDdtGW9vu~p{jS&p@Dy(!#IXbh%Vjg9rDdi5xmqrTFSS06ClehTpdWu1@b_kU#oB~+P*>f*FXZ19 zb`FAGw5`;irSP9G<9L+cAlO*Pxm*ujkXw0v#oUD-#SQoOvGyf&#rNy};{Jjw%BdSY zXVm|U+7;n-+@qfn*IqvR;Si7SqhT8y!IijYujkr02s+}7d-k|jPgCii`}Hk&68G$H z^LrT1$LNXs&{*qvjkwK@t7T$8q~jBHxg{jzo}sQltSBJLqN;f?!<=WxgKY!}Dm8QlN3dx%*y#{I(u zImWp+wYWI2g&cE>+P%q{+Hl8^D{vg*l@230>s5t*_#TDn@(sGP*@bftTr+Erj zWThQ{%u{Hl_hPQX4BRnCA&VZK!^4=Luv{%;enQtI{~apJ?RB}Oq4R{iO7N?#el4UH ziyX^e)AT1y)bCHK-F_ZzqGN!#o$9`rAM53|-`Ghx^n&qY&Ge1FLT|B!c)hol zzvs&dW5xP}rSx5EtoVlcje4I}m-vP`$=}CyC%#?gQ0us7jB`ge<9;sx-1;uov6QE` zsJv%H?-;)W&iwLziuTR03Gdx~=1x7Ms!4xiv`Aiu<#%Ib8q zftvaz)@r0&Px+f(*jmGV55ztR&+t6Gmf{Fd=?xu(K*H@>*nAEplRTgHR=zTPo5 zOFy>O54RO|4~RSVRgd4mypiVlW%Y`lm`vLvI4`JUUpzhZ#M6-YEsu0KpMz3-$jygx z&M|v=5zi=n@I4^cIygqr)Rk{3zZvB7xAAQ__$U$2+v*>w1Z zj(De71J7UdT%_kMwa;g~k~lg;ckv~Rdk`K;R&RJ0_QFegYZY_8t>7Gpd$;^Prf-$L z{}6YNB>6%f`Nem}*I=^Tp5WOWJylolzGbZM)b&>$tx(rqxQ43hdyo!a20Hse2RV1e zc{@CZGoHKR-S+Qrh4aeYa1ko0%Qt$sKHimZm)g9oImS6I_LhA^e|;dQ*nen>yy84J7)SKP-~a82obvdcSIu~}526>w%Hgk8j|K@82;mEWUxi4DUd7`3*{T?!yyv z!s5I4B6vakDDh8v{#V=sevR*c`CUR7LA zI-XvFDwXtmWn+oCR=*ThlT*fCDu->xpDm9X8NAmrenn$H&c_enV<@av!*V(1^+|L5 zJ$X^U7=vm08~5*O9dn^KMV(kMTCI1=XE45}c#@1`p4htbxLRCJK7K%3bNLLCPdA$%BKKL8n zq47BGUuf(^<8YiY|7|_|1s~yUj<+u)=Tk2=e4D7?X(^F0CSiV0)Q%_#?;LkDf zzlgmAxoC*B4{sU!Cb1**L=iplEtJwv-PLdgu9z3_s5%yx-*Q@Z^R7=;$A&zQ<1Eg* zC**cB?&CaLte*GCEADwq;21^6m2`Xwoz&|b6cGQlJg%hUI~v|st4s3Ptp^foS8DnD z7vUF(_3G7lFjgMZ;5G3R)%qobIFk+@)?; z%5^>b1kK7C1NS`n7Uto)TK-!d^~DwQ)#AQ;IKDq|HN*7>9KlyZp2=e4Tri;`AHn9B=yb z^(DP|kuM*lb*(e@z|4BYm}AAo`mY(VrI>q&;`)de3&gxu**z>TW?}zT0rs=4ltmO-B}d_u<>dkBMrs0-E6al{fi#ItISrX*_4gZ;uz#e~qE5 zyndu@E?UU6j*W zKK;a-IFC()+xf6UkKLwc*VAzfPiY)8ArqbpuozEC-prBDIr^^0RfX3#$Y}syex_+9 zu2@@imH4Zi7vlYBdHMVZt;NUMmaEnIw6VwP_nBg6r^PLgFO5Hpe{EojDsZc55R1-*v0q8#u^B7#J>&kjPWI8F!saHue$y*el5q% z-QpI~o7eb-`Iw1@;qVib=3?0utL*?B+jbi~%eAnNs zH_iljc|mMNx%4gV`oy=-jQuk0tNeZ33$N8PF}E((Ts}r~VlG|G=Z^OuF{kcBh<7YC zjT!Un{{6mgZ{%&PG`x#Lu+AycI1y>dSP$G_Kk&g)#K^XvCr*L|&Pt-bfX_rCZ2 ziT8zr;S0XSGrCH&$8);cypJ`T$MILf8_(@xt>##`pPqQezZja}`&mCN%BCJ_`K9Bm zy&m`i;+k4W9a8cBb8(gZeG2`TA+sE_UwO_DzcZam-m#uGd|zkm^$_nZe}NCK1u z_VfbWpbl|uk3HK8<9gHB*>YVu=e(w-U%>CiUMQy;eB7t^`sw3#a!Ia_;yKaOR5a7F zPA|6*n}(nzqaX6q5o@-d zSEnx_zS)XzwF(x|N4W06!M3C$Vq>j-ZiszBTEbCr^=YoHCX0E|Qp`UPd!#joh43g% z`}p#MJSNgqMIQa(Zkl@I{hK#cdD9X$!*g_vP@DF+*Fp)te1Q8j9O21CoYQcQ;cZs2 z@jG94iWw>9FNo(f4~ZKMFY1@=Jo+fF{w!uNJ$?eNt!fN;&BM_onLfl3zrj?PAD_a9 z8F-jUP1HN~vHpxl*W%5`n|b=At(;5gyO{H5_4g%=^Pq7`8z(W>U(Sb;MX${FzcqHu z`Qx2JV&4A_Il~-V_2isfJ)WiEYye;E3m@M^4Kmj1;#cO0cdA7SJ++i~pVZQy{F^N{ z@w|4In8fqi)bu2t*Ixas_E)-#(e(qwbK1l++PDTUhRyQLBG+nqYqDH-!2yV8tA9FA zOjqYvxAQPODwl7d5?wdLSx8q?&G|WlfBpIQCcYzC#PRTMyghi7TW`gh^nLhh&@qWe zdGK6P)6+EFt49XHw{jhaZ#BMH8^2F|df+{eFD0Ixyoql%`onE>Z7$_}SjL=)j)|4^ zAC9+he8cBMeEyPGqcw7T1HBke;ydUk^!(5CtkqwQY59WRyKuz!&T$T%rcb`0<8^*d zq+_C5eXbWy@hAmvLVujcD;mGL@f*tJCGnl~{2w@CEnPf2Zi-_fq{Gt%zNhOq7%jhU zIOExW%#q7y^f$bFR-P%0GaQD|loR(Ycn8Yu2);@<4$zZMP7TGzH|g110f|74r+PV?V=K zM?R{A+?}WHmUpAlj$?lB5jRHM8_-CP#{Kmxj5blNVGsdEAXZrCe6yo%}z3Oijr{@uO&+gJV68iZ~YG$dyk$;S>yY zPJbR(FI->ZiFd`N)g~`pBLci$M%zBxMkRACM^#0|TDTsR>%|&s41S4p#PkVFYWan!m=w+P8 z@mHd|6wR&h--0vdyv@{Y7mf$iYL8k~Q>#2U-lXqFe_P1k#@ypcddfSF_Q7X#{h}rx zsL6U9@%>W8I!Ixrs5uvpNv_3KW%l9}@mim$&&B`xA7_fM5T8 zo0*sN$9F$vXU-MF;^R9 z%qnt9uP1Zlb?nHeqA}y#`6MrfiOXl~I1k5fC&b#2zVdj;c;}3Fi?RNpbyq<>t(WE+ zFTUmYN&an(mswq_!O!BK=0QngS2p(hypK6}b2?++ro^5Th4CyAUs{j+zxJKjMfW{) zZx!E6O~&BpLi@w~YR#+H;C-lqCl#KXA)Z70q2Kz@@|+wFI3EpDmsr!gQ!fA88s*-2 zyM}7HL&MWi4-g;srp0|12Qx0#6t0Jz8UZ}^@ zc&|E*hPbz#ET6b9Y$*15dg`f9+#klAVxeOsog99I4*GjM#C>wyA13Y%N8*b2m%pUe z4?Hf%;|lO1FY3yx2EGsUNqpPih^7m8Q{p{JQ#P7jYLzOS+8Yy1{K zZ!uMQ*$5`WDxSo8?I++9xeczPw{X;PjOH|cyr(ZCKE4533OjMM;6pm~%@3K3y@i(x z#cx%Q26Q}7!?6Ro=$VJ>1W&8*=EbNrZ~x%!KkzG^eX={p@+t*g8)?anZ#RERtJ64W zMbji4tHnJX=OZz(Ho36=_&{7TnhwATHM+>3FZffFHyexi?|5@aj^~|E?#J^GZ6Cnz zN&ZLO=0SW%^WSf1D&darXx8!WNn_N(JrHkvOEaF%#P>9x(3eN<6>-P9f^BrhyPT%! zTwfd`-Dxc-zrOIC_)>J$(hH;bSBAcx^35sVcJz&;YlXW1Z+b$@x&P4<-}P+D?YLHl z&~p>M&~p)2eB<*ou7swCXiCf}V=j50d^(9w>}Sg|%w>CBFWAe;HcqvxTX7NJk;w$9v#rI5+WZ z1+Kj6myBNxoe#$1s-Z8k>#-vIx{sbJYIrw}ZO#GloW3MY4~zd3{!zy&be*6ptv-wI zSSlKSwed5R)8qVp0LKzKn#gA!Lo`j_WYQ`G0BEE6=mz zTk+a;1kU=*Iaqd z68kPKyCFSqy6}26?2_XVe#agO*Wo$=OK8h3=XG-44x4dbkMp>EAHlo1lKUF|eGXsY z-v_@tHWTYrIvFF@tYp#;dGKAmPNgI6N9m3ITVlORtW}BcmSU~S-+UavwhYRemQ+3hnMxky}0K!Z}XDj~PtFrQDPB=v&W>opDDx8M@QcXhEwWCf{gcr+KjBdt5mOE8VL zFLBS*6R{rhA0~D*PF;B~lXnd{f6f2zasSGzS#iW5c>0N*F1MoM z-=QylUvZe2I1dz6w~0`mu7_cj`t_kL)~jxS*yFJfuO`wmU7ZT!8H%T+@nel>H96h@ zmFW0fj^7W7}drfU?h7T}8Kj6-=e7}ppz$gDRqs6*@#G#~GO_beIhSd0Bi2FWYd zEXCTH^XgwfUiINAdcG7NYmeiZ?G(LGi;lkP_%*~@ym*FtN>1_2Dc(2r*Hdpg{uZdy zARM`j{T6>}6?C2xQyF3&G>|Vh@Z?K)LTnMSQ`F~v8rspYp8mvd5M(!gLnvbGk9iu; zMt{|VSN}HL^%WhHjx^LwVFfU4&EHZ^*cO`FV-tRF0beDH5NZc{A0XLtaaM0 z-XEyZK=qjiiM3Ao)%xmnPO*1jtaB=jE7m$K;Liw}{)V^II$7CUsyq{k7@U`q2S*7n98LS5B917A+!8tnLZ(RtuHy_`iK zWtHC)`TYR5^8ajU|BlAieCr8+;O?r1wRqSRPU(*oYI%T%d+~QxgLAYtm2VCHS1?Xm zW87nmb5NG{4~sgl>5C@xK8|ZYeWlc4F`js@8sDdXtiOlS`Gq<>u1_!P(--;whS>dT zd7iG=S7I)nLUR5XPptEb=S=(IJv!pI*y0{5-k1M`r!XzeaowNSH4jgm2hxcz!@uV8 zN{eHMoSx_Z3Fu1K8+3hy?-*TOGCN<d)`H2^U#pk@B4^8DkQ$2acl8pK8|WQ?uA$% z8owzNYue-Ygksf|#Ag-Yu8H z{Ol-)#J=$HJz?w(ALqc6a`=*tH|S_cM>#s)uI8LU$4z)TI5tx7cnm$Sz)%_{(@;SC zFgO6`Xh@4Iy&hW%2g*90aMjc+aV*TiR|!{txx_t9d=I;io}ZzH9O66JF}#g$FHh3; z6p!x08Q;PtzPX&o%T6gB4>(5hVxT(Lk=IdNQ+T^Zy?4SCJf-!@N$3)_;>UV9`~Y!p z`h)nr;^Q9VF}cM4DHr5$z3~RX9A3Vnrc-&ciuS{hQC;%Gt$JkWHRfzMw(>XjfIg3_ zqMV*K_5x_FHW}rVk&f7_syYolVHMP%CDx3;3T0`D?|>erqX!M~Tqfq?!+5a?z7o5d zAF(bY){PDoAJ?i_HyZ24W6gLx2Z(0?-_a8H|M6Q!asPjrhP?Rd!BCtj#Kv=gDr%Fs z|4$>fjPXC>YZ6~$&E%VM*+kD492auAe)6JdQOB_!nJe~LH7&=72aWxmu*AG(njVXJ z%`u3%O=4d2lCk^YiMdVumQu`ZVouXWf5f~d<}{V@_2I|e#*BTg63-z<^73)<@f_k- zewM%y&m-#dC6jzsM@~iD6W}b2^QdDmo=Hrl@#^OiDeL?@Elzq*zNzIK-=7Q z?2+*fY~@|7L+XTkCBARe=_1UnbfxF=sq+WWN6c6HE^<5|rUtz!XpHY!9@B3vX-a&@ zvWQ=|R&bueFj)%eNvaxpT;a8E=>)+p-wsZkV$M=_>E^1d63fB(Q}F4 zR{w#EomLBUt|BA_r=Gv+So(qQ`&pTIrh+bl8>=YE1tU+koOe+ zP2pXASDoUw5r5)UAMwZGlA0Z-DHBbH9A|Nl zo`&Z?)AK%`o}p(h#5WL=={SO;f#aqUjzPwc@9Y!b0mpNaxqLqeC+PT-hKG1RLY|55 zf#aKx#P`6rIu43B2I3otAus__si%LHG#=vjEMooTF}=_Q-)>wzaP85L@oo0skX#*l z^D5SQ6p-70=Rh&%i}_D$@$>aU{C3coLjV6c&z*_f(_0(FbWyw;`TgABLG~I1kRywoRTx z^yn(ucEAOQH7=zYTwibAfFrx!{7`OLan+{l1WoZB@D21lVkSU->-ETOj5PDbywQp4cxoo!C1I>mkTZ zLtoenH_0Ih=Ylfg`Es4QkE5+wEx!1#YT=Cgv=jU&LDycj$-#rPc+2CB^#mv6wSuPZ zv^3T;FY&aW-izmGv0kW!xIfe;)>khUpHBSkFe7S2SK>FEMyN+Feog_FBwgeGY=$%N z3txvg)~CwrF|kj>G5MtwAN!Tpkjnv{+)4Wa8dl=yCN9=g_kc>qznz!&L)>FtpWQV( zC+&`dukchTW(*ArAl8hYkyCs-JPA)7JfrnQcUoSi z;~swQ$CE~VV!h}uu#lfy>0c-==JN4sPN?FNY_wRy~`XV!iq+Y98y=yWrUj+0{DMtBj`Gb?zq1LB$!_kB}nIRdTam0B*h z$tAvf2pt2BpTjYiUu?XGJ1LizJXwP$u6uWg@2hX)x);aJc8Kd=^&F0WImI=wbix07 z9qi2K|6T_d(;3&nc*ph*oRVAoF2Q4Xx8aTNpoig$IZX-LRzrJryAJP^3VMMjBc*z~ zxF6vFPtxeu?f&LxdEBEvP8xS7Pqy(f$#|zLx+aP1u1Ct&X_i!y=`{K)mr?S|!VylUL z1g6Vx0)K1DE{z;O}Zi?4)uCh?UzoTBwpwLD;~_@*QFc35bvdFqgnzAWNfsrht&`w~rKGx_(K zUC-rK(%-j&n8U{J{oO9F`g*#Y+}c88<9=@3kCM55sQp?zFW_k`zm>)f))5<2kvtRR6;~j{E-C*N#1)kS(9md`o3k;kzg*KoC|DUYY*QJtp) zAfBt=j%Nc;qJQV8X_J!9e{^lsEANTFyO#RNset%%YMWmCcYHWS#{~IYBYru=d;fRg zk5bM-VqcQiAhD0|vQu)$A5U`0D}IZ+LJt3)kE_)5M)h1RkB4a(2&w6Kv4rCRR>3Y> zmdb6LoU-7G-#N*|qf&4dSIjM{(i6vIeCKl~zS;D2!POksP&g(&V-1o27mtiWNxABbNNjrL0%O#y$c0ueDpGE9h`E2CH02)TZ8g-q^m)>eKj<>OPssY5e zRPlUqt#M!F#SV4JAbzKD8>DbJPpWI|Q!|9_^~U~G>|`~~T-o_fU(ME6 z^VKn><8nLAv2L*#&0Y298RNgthr;ylr2SRnk5ZQhaCGJ0SM=x8U%mC$w2VCP_n$*z zFS1?6k9+KQ>5peH6L=7Nk;Oh_1^F58`Rn35#@CX(jJ?Q4s_k=dtQw6q^rpP3@ufa( zPtr6_Uipkw1m4D-8TUr@?u7HKJgd<+Rj#qeW0tb6wYc)B%i}nz^K~a2munt8zss%3 zwR#ku!V~)zJWERkJ{3{pco!7U%}(%lEFHbX4&lvafB(6BVjt0~_YiF??mjUM_}hv8 z0`&KSoA|rV_=}V4(^SrrFwFSz&OF|g$Gf%v?LB$C8&{%#_cg1cwo70z4W+ZFq1=Ck zgFKC6cd`5n(7wm`Bh+S_+T2Y0yLx1U9+|;|PvNwBwZmCdK4(DuBc9ikHg+NT=P=$Fnq&Rw2K8)7_c&bf4(@xs z6#HjvEhxr#uZn-Etn(g@R5+T-VW*-z&AY_+W#ws&@5_?JXP0|5xxb_)57Qm*mE&8p zZuGB*_xKmzn61Hcv9dhn8{bh5rei9e*x#d>zM3F@E5z>wZ-nl}91CJkRL~DRco|ag zFuo^fYv}3xtHqPMc-B%b^I?wun5hQwJ@J$x`VGf5a!F?VyDF*^KlaPzUVaW2A9JGD zF_mup5&^`@* zGk$}p2adnQzHa=Zj*<9&KIWd^(J)OOmGL|XiEj%N-xXHj>9ej2@jYRDOV~_5y@)IE z4dLy)oJ&u9M;PA$Oy@;BYx|Iv=hS5aT&Fhi-1j?LX7D1O_cV8${0eFCJxEta-jt^8 zL43c#LHQlw^;>+7=dpFw>#+Xpf&b<7SMHUU8z(*fTr~cOe`e%eSWn^~jCU>G)x16@ z-`M-07@ptcI8YC*htoKFrNONavhe=`u3fy}g6mycyU`kR{`s`U8r)ubcti9tzb4_C zEB=E1xq6M&WqCKp6VEljQj4qCR;|$AU*V1Sim|?`LIvj!nmXc&cPsI}IM!=?42^Nz zA-)_vu`kO|Ud1I^la4T zpyMn*D&cuF>Yr8b^YSsVQwqADEabmepDjgktI-l1J#plr;|aCyuO@L1b@lzz4nD^H zQ~Joo_^rj~G5&2(6UPu7Yanq?_3yn@tt;*mJxNpJJ`kANn}<7V3uMAv)sR(}B;aakPtkar{htVsD}Rv=yVREyOda z^p$v7!!bqA(+U`Kh^yxht>rfdZ_FWHrf-*Cs>8!JdG)P2#64CUbxS7}&A-39P@JX* zX&Mi&!5no=CBNWUMBh)&rTh8+DlONRH?I)?ftq~{rRaD@UNK*fx%xl!#9Te*>G7^2 z=IZgjF`kbk=IION5cBjW_2E3eB$mXYd`A?-Bl<;LjfYU5%DQPy$EnEp!S7 z($i8eU5{@Qt`2m)3H5l^U2gMe8X>pXV`!0nD9p1*^+D`KkwM)S;!EsBp}qe7Zfur+ z#-2x)`Scy0>v(mWytcz4=bHg?dc+@Rkw+I^KLtIF8Qo}70<0s9t$@m*^&EUZw^v5?lsf}G%4_Cl(8{DiuvEJY! z4F$ySgAIJhTFdzcUZy8I?XU3gNjlzj{)%T?4fq+?ox8=~EdO3~e1>O@e6p(1C&pjS z$Ij|8K`r7OwhGTRcpB3Z`+xm~r%P^q4U=%pD59r$66fECairpD?6>!ke%VAzoLA$$ z-A>0)J-PfSm-rotuf)gm&R92|jh-2}8sKSI-1!Vb*Iv4A#PymwpHbsq>HCyFf5It! zl39(*;5-If^<8Os{vJN5(_)-WaCXA8S^O≷QDfw7e^)kN6wc_=)m)l9sZ3jeSyE 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
8*0w747Pb&#i-_1-ge zcxvqZYH}H-=$$um@?2fE%44SZZ}d%k54Owr<&52fzh`m0L;Nog-&PdGGlzyL#{by( z)8({HKG)HaUmg!ZWt{6BudyFmX1t~F&7^55{07gK6HDJud|K|o z^@Npbw1dwR>H7(`^C*62yA_S2V0lq}#+PL{;y1S1*Y_L(H_5XVvcR(uzHgRu`7 z_aGlr@i4RTcj7pN<1;=M;lmBMVm|2)JojewHwGAmqq;gZ(m!!e^)(#i$IpDYA6Kl= zy?}2OPh!41F$bBLcYKAPi8;r6#5@k+LGn4r+~R+yrs2T#Qb}9-rUOH=*zVE90&6IkWbTi{I?wY^5}7TzJMh-U*K29Iy{qSr_}D_AQ#>N z!HugApI?&G=Xmz3S9A61MQ2f-FNTKtdR+zAH#!^ZpMJ2L#;5Qez?*oM%g*--Fa}~h zP(0TShs3koyS#{Jxp;<4{_K{YuEhMvb8?M2lK6f;wZC5giMf$j)0TXGB)+3>MZ|=mcsc+74xpKhQ1`9<~hG)&=Xl< znI4Gm@K52mok#KA>3+SmjPKoXWxzEK*Mo9-6pG?|71wNaY>Df$B>vM?k3aWA@;$@e zm174zb%XkSMBjGU1&O`GV!zMx{QnAXNxbEFpV-?f_VbKA#A5I97WEtxyo=x2sZDPs z$4~~|#XgaD!AfKF#~Z&zaImC2^y>X;*g))M+Tyo%V!gl^ab?u$BBbK`uX4ScXVDY4 z$#DmKt*`Dar|-p&IZ{>+UPw_d#cXu&2 zo|qG#ET8Wn=EUQ9=vAoA=Pz-+DVL&z?>6>7#?GK;8`E4GS%b{_K(C$C3u)YEM6Yjt=pewcj1$JhsTD2~_*H4iQ0<7ZmofeVF|m%jn7EF7 zTEw58a$HNp=kT*ykK#{9I_{!lp!i|5%!HfqoPu*OM;#BsXuQeqIbO!QT@B-YBXOVc z-|jKuSdIIP6MTA7FULL6V*2hC-xH?ccuybY(+iX6IxVM|_uo*(F{xI!s6W{$IzZf? z#9GY6?+TRESBdqQGkF$kGGjevcbv)BV&0fq->cC8fBz;_qvH}C^VO@3UP_}*aUa^0 zj<~OTm5!zSP062U)hg~kn^$u!tEqo^a*`io7`*^a!vOsd|0!pTHz2-4yc_>mntn1y zL;2naDIGUY<7&$97HW2wHxKH`f;i(FrT+4Z@04cJ*jfGG5>r|Y8_DNqHQ%l$XYgmF z+RcXxrPYVV_+}}-SNe#KYB-kTm_$cu@kiygGp}=v`d=mfe(?*$u7gjhLnY-LQZ^1@Kmd>Tp0ENAdqHyqDm9 zoUw;v2D%EU{Yjo?qvr*&X?QVAOso-@K-W;ZGSjuaAmMyzfG74B=vCRXm}8{Be_T=g zTjJj^ZoJd$jpHt3uG4d0ME%9aIc;JId8$hvNFleE=r{}qdG(^YmsOy&a%!%x$x6`` z)~3?8JZ~t!!^TNV+j-pW@xDXXk7~cMC|$J8=1&X0yg}C*9BIWC5O=#;#Wf%!ZQI}# zx(3SYr2ZU?Bkm7kzpy2=#G1I{kW%dm;hK)CG@h0;yoIa3Jparn7d$u65%1J*QuD;` zp--dbTlux%ZC7)3b%euBBRU7zqBPs3*%1!-t0kCx)&nJll`_tbwE`8%G5IJef~ z%aj^=n=fa@c97Rg&P&rlS}C@|7TTV`7uTqK{Fwu>Z^@IiW#&(O_mLiV0lI3!V%`sx zYi|0U<@x>e)I@ea#D0N0)UO|oOeGNf${Bs><1J3 z2iBqM33@i`rT7jx6|Rk`+Wm?Mb&0@KrTnU-Aq7+DRE9*k$j zp|sSZ<=uK$o)7Y>Rs0S~JR`*O!D7f_>~|ra6XG{X;yEFWoD$Cmo$%Gg*Mz1|p#$E; z?~}ybTFk4(d|G1t*$ep{zmS+yyC}cpznv5FYl(GevrAu@XPZp-C^d-rwU}FD?Z5Y- z@x5W(izdGh%^~-=?;9ZBxpbDMZ=JYrwCq_o>9a4iD+4o$_l~)c=P(^4kr^ z>39RrGkU3n0u8hW~kjk)x(`ku9+wujKRTKgnweUlQ~4!|3@< zf2YG4T=Sd@vgplt-;oMO%*W@}PlIXtRz9P|E{9QcJS8r^5Bf@Md?U18PO;uFz7yI9 zo$wvd3+eegL~P>wpgnbr!;d(3C*gTj?Jwf^OZ{8(ctuIR@nISL%OUolIslJ~`w1%Z zA?DIsrS-Rv8c$cAb~kp;yy^hA>B(a9s0FbGJJwJAs8*NY6CRW?{vvV3jGaRs&E@eS z&BMf|64NA(3-ze2wvm4cdeZSA-uqN{Y~7(I9clSWZHK0k4?Xqp#k%pU@EyvcSL8H- zuK1?#Bww$=HM)$R{ox;ZybS#G6@+d{8)-QY)AdHIH5|^9STFDooL1A? z`umRz&QbV_IKRXkUEIelraSKAis{WpV%{<4ZS=?WyA=JC=pH9_JP)?f-j4S8*6(Jz zd#gpPw~XH;7$xp$TKB8}39;9xL%N!d@mkJlVy_i*j^@!~cG3Nq+HHasG%uEGeH?!q zKjy8+(tCqr{~W~rkPqSciH_lP^rE4*8uW)=e2bTzM-uR!ucpQ7^ufdCnYWj}YUvlxC2TzLo zNDfJSc#Qt#yn94HJR<*CL+8yw{MM%o7I?WA--FW^{&O$@hGk- zxY8r;(vfeG^F9>o3IIAtUK$>i|xjpiRYqYYmPpMH70Rh z%;fLy@VDpSNn=le_}-v^+@F?v8hyAI+S6Y^{B`AAPpdfp;D~Pw!h<(prCQd+l^M_U zjP6m5{g1vb?D$#*KS2DpN@~3AVS{tWU|c)oAN$j!qNOI!)AIQjbx*;wjK!QcN~(q9 zI_7`wr@5J9D2;KSb4*m0|5|_gCB*u)xIc_FYOyvgBczvmZe!hGtV+DThVESu>(RF0 z$SHmx)HePt^l#(eT>5{b{U=%v@V{il^KS|*jf*>fsX;Ct7Uq9kBMKP1y0M$#Xk`4@ zpMDd}tZ=$ z($xn~A^ByOTdc)OtiyVTjzx0$m6x&h>i#l()fb7iS8vH7vG%H@zUT?Dw^#?`?!)sN zPpk9vZ(e?f<9*uW{qprV;(jiVacA)&zT=4BvpxokcJ`I_?L=q|je;AkO#kOjphLL*!daUE_O_Dr(vhrm9b|68@dM-j&x2v}|;&ZI?qC zJyKWvgX&#G9_6xKdFI(6{xj!@H^g199?ir~ms1+CAH#9TO3Ml|a?^bpIyqN7q6R5x zX^SiN7+p-$3V6~nlMZJyTF&E{tj`MYWho41Ap&uF3Lj7Zr&ED z<@gGSjrX?ih}|ZSm@oSg;{9#nz3unvo3eoOD_t++i+7>V(iQhxZ$iAgy`H{-^u)W{ zYjAdxQ&pT5XjuUrc^ltqJ%g)SQO`U4y@Qq&FicJjd3&e$q4nLj$mJ)9@2qC4S026$ zxMJQC(a9_)hE^t$GYLQJbsv-7wMQy|1jg9k;Bd6MvH48hqmy&JSytFemrf)liT%M zN#oaq{AyGTYV%})ypH1Ur^?O) z3-oVXt7C25>w4uLapT0q_4*HFR6A-B#n9g@=_UNpehho*io5X$hopgMJc zb&yuQVvXH{^u>Oc59;G;j>j`JmFI0c{uI)4Z}29*o%xEkoMKk0ZLB$LsWvlc8AV3{ z}~m>ac|+p2HM}_=_TV1<>^Q$ zAder_W+k5Ev{$G3SL5$9Zg<|kEVjA)7tvh|$3pS(8)KbuRO9C>bUdl1HTByDHO(P5 zTV)z)pDOPD^v-Smwl4HDUKw@RWxThc_su zErz2G#BB7URY}PXp+#UQZTN zU!HY@X~vGd3@?f8SH-o32bILHhFy;D(OJ#;!J9OsreTs?{-7fR@8VmyF1SuPF8-=Y zxcu`aIfif~!8|qWs}^WeG==FT#3&K39)f<@H)6$1kp|H2u3S4_8;nn$EQW z`r$di%YzVm3jGZyd9+boVy(hz933jUzT(LtpBrFIZRZ^IiT8|8!AgkVy^QyaPswR1 ze5N-4?wL|lPslIU2gE&E;yt4@QY`UbQ{>WH4qeqb_FOE%*Wom*7vC+9TF9rO8hxNf z@qOv7)%~sU3-V$<+%1P^;3Sm9cMHDFxXQ|5rrO*nkJ>ou@b)+H3wg1X7jbRbEvB3N ziyA-9p<9e!(%7|)dm}%OLR^*-i5-{bn>xUu4QQ8xP9-s*VR zSZn=#C*zHQSBzJ(hI2CCAAtC6l=XUGp#G{v!!c+@!^+TsZ!!;x)Bc9 z@TwNC3(B!4t^rU3*K;)PgQA|6i;Jb&_QG(A7!iTkYGIEonmTY1DB_b$g#^54dZ zZ${$Vs3myL@qG}VN6V!xPu7c%-pL_;jrg--%kno9EqUc|otnkok+;xt$=GH1Qc2JE zgKyR8BE&P<3|b1)5$iOs=4&y2UM22zag&XG#Mr6zT4lI|W3e2%(b0pyF<%mE2BU`# zLlv5a!V6G4tMfd3M$_#yy#Sx%tgRn2;CZX2=Q3l*ymm%;B<8hu&=GUlS>-cc|CN-- zXgyu6H1Erb!7-4onA^@Ouj}{{^V`koX(zXb<<*HlIdR^tKCSc08G7R@Ps>VmDyv4@ za6ZeBhvc zpbHH*>ywsr_k{c+f4P&U+>EGe1IHV(l`TmPPOkz*H|coKlV9_ z@ALcSb1miB$54&WE$Mm(_rtuNi!=7R7$9~LbQe3FH;rj)$L}L*RFkfT&N=bz%S7=# z#m62Gv9|I>T8bIFiu!KlMGmp|8~ZibC_bIP&#A7T8YjLZ`~-^dcDLG=l|!6MN8t9CT9W5M@;-|mi}~8pj=^^!dhI

tgL$ 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 F7%MU$%$ozqOM4aop#? z%lhjDKY5#vGmwS-Tg)UMYH+BO{-E1UxHqKThC1#?*nXGJbwcegKv{hh zbEP}u@V-16$>B+{+o;_NcvjtRtZJ-@{V=ireNWn%kGLOwn_V1l8RUI{el6&~k8O+z zB<@KI%l|Pxq?D`#?)l_D4dVH4xY$Ye)~G>)+IURIp#*~={3Q0)_{=d;l73&N|K}b% z?q|EwZWP3Qc6uDnLl3rRXdm}Hv8G`RyWu$0r$gLl$Jj`9e){6jP%V>=lf)QF7I|gi z`)i2tlCu0K#!N2a7h@&^JV*F$<{}0G5=1^~i26S%%Q=n27y!c-L z@9|xO@9yxB-gyM~CTjONonkJ+`;Pxcayw#=cJZ=o9bK*U9fbJ-SNlM%7(& zYdIgWZS44(1~ES_&Kobm27P`BVtx2sV%1c$4*ZqZckTK5mOd-R9Okz%MiFDSV;mQG z)Tb(*)8IEeuP=&gN%t~PU!9+WW8ywV*SOF6Roo(SKFUWa_RHzHM2r{Z)|h5r%Wq;C zy3#7vE>zH8A3`p*i9IA=!XefmJPmPA@(|98^w`JpPDA_s{9M3cGG9HM_r{lSj>lm? ze1=Et8yUx0%oB_;m)U&8yuhY>#N5D__*uYDJAQgYVvgV~G>AEZiSKg8TtPDZpLIP8 z`0I*Otn2xd&sy^P_u8IV*Av&}#G0OV>KE_8Ht4ao&KKF_665cQee2TGKLc&{%VVqf zKdR?^{T}Z+-xP0-c;)Dq1NT_Bybqxh5bKub;GRn#o~Fe!G%YIs_u(DA80(nh{yDK0 zt`HvKE9#jTzmI#(7`tBqF@7Iw;$r-MNfqY=zs-en?6L8td}F<1yiY2lcYeaZwO*Jl zevC0+6+iaKouZyq)v+`EC(|v~<|dPS%zugJ$tCRiJDy^lb0)T}#fs<2c$SQ3$i%bb zN;QmU$9Qgx^=V`HYt2=wl#Y8S!0&2^@yFbHv;qv|`>Z@_I4+jpw1yt#)UuNr4uX8N z7z7vC&z0LB^7=$xTlhGn-#5zb1Z2+ZJb~MIXu;PhxE9BK@=HV0Ot{1taXi;O4>3mk zmR=Zu!vpd*l$t%W;x2KX2y9f19FScpvoA^%CSQ-tYZ+xq%o?6Fo zx>CK<7uBn3`?mPg@lS^PtGLJe_Ot3zC(aEtXjHpi1kYCAl57mmqV;qI?qqiwMvO~N{O-EmxsU*pgghxk4~Jvp>x8{d!LB;Td-I3bU#__wL3PL-Wk zppQJ_o$dcL_7dYR4b(BlUcQDS^o#MA^o8UMG4>MgYGVAQA#I9Q(g(D8nZLwXOcNU4 z4Zq_T`&`V*{?9$|_k6#=-(7fahDpWs1D)FOR~^SD>T@%Efotr$9qY2*&@-*{YwW}O znmmv45qoDR_RZdmTYT#*zVFL?`fffBs#yV?mP0T8&hvLr|HQuB zEA&i%e&XBnH;F%zMz!QLpr-R8%}=tA_knZheFVm{i@9PkKVq_+V!qhNIGm(WjJw91 zv9EB6Ib!i1ZnmCH$wx{Y;yqG*IsD4D5{;{|okNeMY62r0tcrVi_LFe`LF|5FAC&9E>}Enuwq51>9du)#U9HE{ z@Wt+&bX5My; z#dF}@e8u{ieRP|^W{+O)i*u}(c^~f_G<>Rx8qlF94dZ%tAI;-hc8i#E@QmwOT+8aw ze5aV@_=sy*0sVJ7ABpQ&VRg8sE*pGal6RbU4&iVQ4rSEf+ib3tbcp+qSQ|7~EuQBy zuUd@dr?y<0ihqwf^ygzK{0wR7Qd~Wf^YtAcYvdnma@IRvX2s(L{43M{WjVA}$83DO zpoccY<8-ZpOVqKM*tO_+l7`d7e~_QA#2@Eas3fP?ipzzsWPH{0pBelthWz~G!s7tE zPU8;z^?;rHte{OA{q$=Y`N-jFRUGM1)N#}cO6iBIxW~8NuF~P8`VWwIT6(?#-Q-?Q z4!iVH_HvFTnl@0A#;};L8)?##rYre6tu8V5;!nQf-Eh3qiS?-m!vfYWWx50CTLU0w(HYb&>yqkJ2Gv6tflxJh15$mue_IcaqU&nfuzE9#t6USHsq zNq<~|n7jEPj8mtWPdyrT;&n6o=hZ0c+>>oK9O~1h86L;@h-dVf>^_1KbQ!|tH@O^E zlR0V;`-{a|!QATc6}--VH`@|y_sgT9`j%rGa}CR?MU0n}#CtFwL&cqdcW%7DnUcV8t!u-o7`g_ z`#u<$(Q}=+@&0w9xbar~<=$A22cT8Gs9e9KR98uXAyA$}Ii;RP}K zs9QsNKhO3L{rI7}H%hL@*=D1C%=?XR2Tq~+8owV_+2NARnHUkltu zRPkqd^ueJx4jmy2+X-yO`rT$6E{XqsN%@F*PW_J4aF{v_V^>M+N7djvHdVxW74ox< z_n4a@?uTOScAK)s9_ar?Wg3V%QxD|jqXNWQiPQYVb6;n9B%b+(;~dX>?Ql-|%olTi z;(4!z`ZT0PX`JHO?XbhRs61j`SXcFnJ^SCmKM(%DLF^Ho51-f{`kWdzmPdc_yQ<|p zcH`OQz&X|i_EpEH;0b;zvK!B)8V#DkYp_<_C+Yu`eAdY2iMsli1|9gwB>xBanUTx! z%C=S!`oP!fK9OB=abtgrzu`@}$KF%#*U@YEC!V|FnJf0ojAyQR-iqr~;#n)^2*tBj zYdVf+AM>c=d8;$~Um%W!I7h!iyG*oOkkfewm*R3M&tDc?>f(};pU^J7Jo>540X`S= zv(PbFMm~dSa#cOLrokOzFVZ1u67S#JW^-=jbD8|g>FJ^THRo?gY3Fe`K;Qf1c{@L` zrsELAx{jE~8*4i1;*wa;5%YLsO-Fo_D%Nv!gqX`ahrbE*dRXsVrq#Rbm*A8Gr&zyJ zpT;qdXB4avovh3H>Cf=uH#pOmwtT))#%^rY+}qM>G~R>{_~9f z9v=7Tm!xYOe&(l(eoeZ@;UUNTI=&O@9L~#SZ%sWV_IvP(+^4_=n$FFEk6I6-Lt;

`dOhebQ@E~nR&?nwq&Vgg(yos zo&JJ`YW)d6-OACNR`d1I)B1U#dd2*cJNR0wE)CS>1TNVMJ15e*AwRFvy8$0Z*{8(g zK00rMQ|vFoJ@ktC6|*2Q$D$mL&%=ZAt}X9}A@&)F{o9kyuegUzRXWEy*bN!fi}>+P zwjc4hN4<;Eb_PBRis)lG?8RYcMdwX9#5|x+#eau=f3^M)uH)kX?4!>Qa=KRB8GNp$ z(*?eUu#dF~y~^u5e)7@bem**}ZK>aOKn8X{v1_1j-oz#L7P&dUYYi>x)AV^gR}z

6ZM0s4G;XKF8 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%0D~NqB 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

3I6Q>987%Goa;>Pz{ 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 z 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 literal 0 HcmV?d00001 diff --git a/notebooks/barcodes/AT-1447_Ret_R1_tag-list.csv b/notebooks/barcodes/AT-1447_Ret_R1_tag-list.csv new file mode 100644 index 0000000..ada9478 --- /dev/null +++ b/notebooks/barcodes/AT-1447_Ret_R1_tag-list.csv @@ -0,0 +1,3 @@ +AACGTTAATCACTCA,A0304,m19,0 +CGCGATATGGTCGGA,A0305,m20,0 +AAGATGAGGTCTGTG,A0306,m21,0 \ No newline at end of file diff --git a/notebooks/barcodes/AT-1447_Ret_R2_tag-list.csv b/notebooks/barcodes/AT-1447_Ret_R2_tag-list.csv new file mode 100644 index 0000000..6e3fab8 --- /dev/null +++ b/notebooks/barcodes/AT-1447_Ret_R2_tag-list.csv @@ -0,0 +1,3 @@ +CATGCCAATAGAGCG,A0302,m5,0 +ATGAGGAATTCCTGC,A0301,m16,0 +CCGTCGTCCAAGCAT,A0303,m17,0 \ No newline at end of file diff --git a/notebooks/barcodes/AT-1716_retrieval_day1_reward2_tag-list.csv b/notebooks/barcodes/AT-1716_retrieval_day1_reward2_tag-list.csv new file mode 100644 index 0000000..f36807a --- /dev/null +++ b/notebooks/barcodes/AT-1716_retrieval_day1_reward2_tag-list.csv @@ -0,0 +1,6 @@ +ATGAGGAATTCCTGC,A0301,sample_2_m1,0 +CATGCCAATAGAGCG,A0302,sample_2_m2,0 +CCGTCGTCCAAGCAT,A0303,sample_2_m22,0 +AACGTTAATCACTCA,A0304,sample_1_m6,0 +CGCGATATGGTCGGA,A0305,sample_1_m17,0 +AAGATGAGGTCTGTG,A0306,sample_1_m13,0 diff --git a/notebooks/barcodes/AT-1727_retrieval_day_8_reward_1_tag-list.csv b/notebooks/barcodes/AT-1727_retrieval_day_8_reward_1_tag-list.csv new file mode 100644 index 0000000..c5e7dc1 --- /dev/null +++ b/notebooks/barcodes/AT-1727_retrieval_day_8_reward_1_tag-list.csv @@ -0,0 +1,3 @@ +GCAGGAGGTATCAAT,A0310,sample_1_m4,0 +GAATCGTGATTCTTC,A0311,sample_1_m7,0 +ACATGGTCAACGCTG,A0312,sample_1_m24,0 diff --git a/notebooks/barcodes/AT-1727_retrieval_day_8_reward_2_tag-list.csv b/notebooks/barcodes/AT-1727_retrieval_day_8_reward_2_tag-list.csv new file mode 100644 index 0000000..4352f28 --- /dev/null +++ b/notebooks/barcodes/AT-1727_retrieval_day_8_reward_2_tag-list.csv @@ -0,0 +1,3 @@ +AAGCTCGTTGGAAGA,A0307,sample_2_m10,0 +CGGATTCCACATCAT,A0308,sample_2_m14,0 +GTTGATCTATAACAG,A0309,sample_2_m23,0 diff --git a/notebooks/barcodes/AT-1734_retrieval_day_15_reward_1_tag-list.csv b/notebooks/barcodes/AT-1734_retrieval_day_15_reward_1_tag-list.csv new file mode 100644 index 0000000..ac42087 --- /dev/null +++ b/notebooks/barcodes/AT-1734_retrieval_day_15_reward_1_tag-list.csv @@ -0,0 +1,3 @@ +AAGATGAGGTCTGTG,A0306,sample_1_m20,0 +CATGCCAATAGAGCG,A0302,sample_1_m19,0 +CCGTCGTCCAAGCAT,A0303,sample_1_m25,0 diff --git a/notebooks/barcodes/AT-1734_retrieval_day_15_reward_2_tag-list.csv b/notebooks/barcodes/AT-1734_retrieval_day_15_reward_2_tag-list.csv new file mode 100644 index 0000000..7becab8 --- /dev/null +++ b/notebooks/barcodes/AT-1734_retrieval_day_15_reward_2_tag-list.csv @@ -0,0 +1,3 @@ +AACGTTAATCACTCA,A0304,sample_2_m9,0 +CGCGATATGGTCGGA,A0305,sample_2_m11,0 +ATGAGGAATTCCTGC,A0301,sample_2_m18,0 diff --git a/notebooks/barcodes/AT-1756_retrieval_day_15_reward_1_tag-list.csv b/notebooks/barcodes/AT-1756_retrieval_day_15_reward_1_tag-list.csv new file mode 100644 index 0000000..ff4a672 --- /dev/null +++ b/notebooks/barcodes/AT-1756_retrieval_day_15_reward_1_tag-list.csv @@ -0,0 +1,3 @@ +GCAGGAGGTATCAAT,A0310,reward_1_m5,0 +GAATCGTGATTCTTC,A0311,reward_1_m8,0 +ACATGGTCAACGCTG,A0312,reward_1_m15,0 diff --git a/notebooks/barcodes/AT-1756_retrieval_day_15_reward_2_tag-list.csv b/notebooks/barcodes/AT-1756_retrieval_day_15_reward_2_tag-list.csv new file mode 100644 index 0000000..465adf9 --- /dev/null +++ b/notebooks/barcodes/AT-1756_retrieval_day_15_reward_2_tag-list.csv @@ -0,0 +1,3 @@ +AAGCTCGTTGGAAGA,A0307,reward_2_m3,0 +CGGATTCCACATCAT,A0308,reward_2_m12,0 +GTTGATCTATAACAG,A0309,reward_2_m16,0 diff --git a/notebooks/barcodes/check_sharp_quality.ipynb b/notebooks/barcodes/check_sharp_quality.ipynb new file mode 100644 index 0000000..2af1f85 --- /dev/null +++ b/notebooks/barcodes/check_sharp_quality.ipynb @@ -0,0 +1,103 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "d3bf717e-1a40-4f81-a1b0-b727fb8004b0", + "metadata": {}, + "outputs": [ + { + "ename": "ModuleNotFoundError", + "evalue": "No module named 'scanpy'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", + "Input \u001b[0;32mIn [1]\u001b[0m, in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mscanpy\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01msc\u001b[39;00m\n", + "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'scanpy'" + ] + } + ], + "source": [ + "import scanpy as sc" + ] + }, + { + "cell_type": "code", + "execution_count": 112, + "id": "bb9dda65-cb30-4a62-87fd-2739eb66e72a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "env: AWS_ACCESS_KEY_ID=ASIAYPY66CWMGNQHAG7V\n", + "env: AWS_SECRET_ACCESS_KEY=Zt6lmgFmhx1Qn1/mTajuJHxORPKjMd7zHo9yxCv3\n", + "env: AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEL///////////wEaCXVzLWVhc3QtMSJHMEUCIBOn2n7FYhkwDrJArswLQBQzsB8bEcfdUZp6ZJWuQkNlAiEA/ZQVvnqwuRjHE0/2cTzrTEwF8bS0pfOp5sd5XU9QANMq+AEIqP//////////ARADGgw1ODM2NDM1Njc1MTIiDMFsXq9WBJoyLEdVQyrMAdIJg0FT0qo+cpTVLPKnFLvyQCjzH/7ZlWLd5w1NkTkMDIR4W/d+02fgfncbF3cGwglqlO18saOqvMTOjEUvvvhihRLRzuSajiF3sqG6wsdwu6IgCyk6xdYap84Wt0uo5LshyJAma2fK31yVPTip6n6nxoCcTmsJjhvFtMRGlgiC4bIAeW2lC8lqGHPmyz//tutqj9fZeUR0qmGtr1ium7Gg39WX5IzOgHAWTbb/HSspeP0+xDVfdzOHZyA47RVNc2EIwIXoHCntzPmUEjCNjYqbBjqYAcTJn0OZLrzdFL5RsIVXPaoQMedyiuxr27Bmz4QZoB32whcGu/0osFhwL4la0v+BUXuz2zGPB+byyrGkMB249QQitouR1DIZ/mCUnEz6HvCEQwdH/yIFkeNcY6p+rV/1sOa7op3p43reWd7s9ui3mlQ4QDi63ZJG/aBmGMwmPrCMQVgW9vJR5vr+LjV4YWxqVJ1PqOiZnGf+\n", + "2021-10-07 15:31:32 agc-583643567512-us-east-1\n", + "2021-10-07 15:28:07 cdktoolkit-stagingbucket-d49u1xfb0sc4\n", + "2019-10-09 13:04:06 cf-templates-umiwbnq3566w-us-east-1\n", + "2019-10-10 12:46:54 dp-daily-reports\n", + "2017-09-26 10:15:15 dp-lab-data\n", + "2019-05-23 12:34:58 dp-lab-data-public\n", + "2018-03-01 13:29:07 dp-lab-glacier\n", + "2020-11-06 23:02:27 dp-lab-gwf-core\n", + "2021-07-15 18:14:01 dp-lab-gwf-core2\n", + "2017-09-26 10:17:18 dp-lab-home\n", + "2019-08-14 16:42:43 dp-lab-test\n", + "2019-04-25 12:35:35 elasticbeanstalk-us-east-1-583643567512\n", + "2019-12-13 15:53:57 scri-computational\n", + "2017-09-26 10:23:50 seqc-public\n" + ] + } + ], + "source": [ + "%env AWS_ACCESS_KEY_ID=ASIAYPY66CWMGNQHAG7V\n", + "%env AWS_SECRET_ACCESS_KEY=Zt6lmgFmhx1Qn1/mTajuJHxORPKjMd7zHo9yxCv3\n", + "%env AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEL///////////wEaCXVzLWVhc3QtMSJHMEUCIBOn2n7FYhkwDrJArswLQBQzsB8bEcfdUZp6ZJWuQkNlAiEA/ZQVvnqwuRjHE0/2cTzrTEwF8bS0pfOp5sd5XU9QANMq+AEIqP//////////ARADGgw1ODM2NDM1Njc1MTIiDMFsXq9WBJoyLEdVQyrMAdIJg0FT0qo+cpTVLPKnFLvyQCjzH/7ZlWLd5w1NkTkMDIR4W/d+02fgfncbF3cGwglqlO18saOqvMTOjEUvvvhihRLRzuSajiF3sqG6wsdwu6IgCyk6xdYap84Wt0uo5LshyJAma2fK31yVPTip6n6nxoCcTmsJjhvFtMRGlgiC4bIAeW2lC8lqGHPmyz//tutqj9fZeUR0qmGtr1ium7Gg39WX5IzOgHAWTbb/HSspeP0+xDVfdzOHZyA47RVNc2EIwIXoHCntzPmUEjCNjYqbBjqYAcTJn0OZLrzdFL5RsIVXPaoQMedyiuxr27Bmz4QZoB32whcGu/0osFhwL4la0v+BUXuz2zGPB+byyrGkMB249QQitouR1DIZ/mCUnEz6HvCEQwdH/yIFkeNcY6p+rV/1sOa7op3p43reWd7s9ui3mlQ4QDi63ZJG/aBmGMwmPrCMQVgW9vJR5vr+LjV4YWxqVJ1PqOiZnGf+\n", + "\n", + "!aws s3 ls" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e770af7a-d1ea-429d-aea8-79be0d4d47d0", + "metadata": {}, + "outputs": [], + "source": [ + "!aws s3 cp s3://dp-lab-data/collaborators/priya/MemConsolidationVr/AT-1447_Ret_R1_CPL/cellplex_results/QC/AT-1447_Ret_R1.QC.h5ad AT-1447_Ret_R1.QC.h5ad " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0f001dec-1aa7-4a01-9cac-49252bb559e4", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/joe_samples.csv b/notebooks/joe_samples.csv new file mode 100644 index 0000000..3511c61 --- /dev/null +++ b/notebooks/joe_samples.csv @@ -0,0 +1,27 @@ +sample_name, aws_path +epi_Ru581D_MITO, s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/barcodes_rna/Ru581D_MITO/epi_mito-tracing-outs +non_epi_Ru581D_MITO, s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/barcodes_rna/Ru581D_MITO/non_epi_mito-tracing-outs +epi_Ru581b_T1_MITO, s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/barcodes_rna/Ru581b_T1_MITO/epi_mito-tracing-outs +non_epi_Ru581b_T1_MITO, s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/barcodes_rna/Ru581b_T1_MITO/non_epi_mito-tracing-outs +epi_Ru581c-LN1_MITO, s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/barcodes_rna/Ru581c-LN1_MITO/epi_mito-tracing-outs +non_epi_Ru581c-LN1_MITO, s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/barcodes_rna/Ru581c-LN1_MITO/non_epi_mito-tracing-outs +epi_Ru1083_MITO, s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1759_Ru1083_MITO/epi_mito-tracing-outs +non_epi_Ru1083_MITO, s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1759_Ru1083_MITO/non_epi_mito-tracing-outs +epi_MSK_LX_1083c_T_2_MITO, s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1760_MSK_LX_1083c_T_2_MITO/epi_mito-tracing-outs +non_epi_MSK_LX_1083c_T_2_MITO, s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1760_MSK_LX_1083c_T_2_MITO/non_epi_mito-tracing-outs +epi_POSIE_101920_T_1_MITO, s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1761_POSIE_101920_T_1_MITO/epi_mito-tracing-outs +non_epi_POSIE_101920_T_1_MITO, s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1761_POSIE_101920_T_1_MITO/non_epi_mito-tracing-outs +epi_Ru1083d_MITO, s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1762_Ru1083d_MITO/epi_mito-tracing-outs +non_epi_Ru1083d_MITO, s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1762_Ru1083d_MITO/non_epi_mito-tracing-outs +epi_Ru1250C_T_1_MITO, s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1763_Ru1250C_T_1_MITO/epi_mito-tracing-outs +non_epi_Ru1250C_T_1_MITO, s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1763_Ru1250C_T_1_MITO/non_epi_mito-tracing-outs +epi_MSK_LX_1250b_PM_1_MITO, s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1764_MSK_LX_1250b_PM_1_MITO/epi_mito-tracing-outs +non_epi_MSK_LX_1250b_PM_1_MITO, s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1764_MSK_LX_1250b_PM_1_MITO/non_epi_mito-tracing-outs +epi_Ru1250D_T_1_MITO, s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1764_Ru1250D_T_1_MITO/epi_mito-tracing-outs +non_epi_Ru1250D_T_1_MITO, s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1764_Ru1250D_T_1_MITO/non_epi_mito-tracing-outs +epi_Ru1250e_MITO, s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1765_Ru1250e_MITO/epi_mito-tracing-outs +non_epi_Ru1250e_MITO, s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1765_Ru1250e_MITO/non_epi_mito-tracing-outs +epi_MSK_LX_1250f_MITO, s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1766_MSK_LX_1250f_MITO/epi_mito-tracing-outs +non_epi_MSK_LX_1250f_MITO, s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1766_MSK_LX_1250f_MITO/non_epi_mito-tracing-outs +epi_Ru263_MITO, s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1760_Ru263_MITO/epi_mito-tracing-outs +non_epi_Ru263_MITO, s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1760_Ru263_MITO/non_epi_mito-tracing-outs \ No newline at end of file diff --git a/notebooks/joe_samples_unarchive.txt b/notebooks/joe_samples_unarchive.txt new file mode 100644 index 0000000..1243e83 --- /dev/null +++ b/notebooks/joe_samples_unarchive.txt @@ -0,0 +1,14 @@ +,joe_sample_name,AWS_storage,sample +0,RU1083_LIV,s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1759_Ru1083_MITO/,Ru1083_MITO +1,RU1083_T2,s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1760_MSK_LX_1083c_T_2_MITO/,MSK_LX_1083c_T_2_MITO +2,RU263_PDX,s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1760_Ru263_MITO/,Ru263_MITO +3,RU1083_T1,s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1761_POSIE_101920_T_1_MITO/,POSIE_101920_T_1_MITO +4,RU1083_ST,s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1762_Ru1083d_MITO/,Ru1083d_MITO +5,RU1250_T1,s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1763_Ru1250C_T_1_MITO/,Ru1250C_T_1_MITO +6,RU1250_PL,s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1764_MSK_LX_1250b_PM_1_MITO/,MSK_LX_1250b_PM_1_MITO +7,RU1250_T2,s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1764_Ru1250D_T_1_MITO/,Ru1250D_T_1_MITO +8,RU1250_ASC1,s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1765_Ru1250e_MITO/,Ru1250e_MITO +9,RU1250_ASC2,s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/AV-1766_MSK_LX_1250f_MITO/,MSK_LX_1250f_MITO +10,RU581_LIV,s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/Ru581D_MITO/,Ru581D_MITO +11,RU581_Ta,s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/barcodes_rna/Ru581b_T1_MITO/,Ru581b_T1_MITO +13,RU581_LNa,s3://dp-lab-data/SCRI_Projects/HTA/Mito_tracing/barcodes_rna/Ru581c-LN1_MITO/,Ru581c-LN1_MITO \ No newline at end of file diff --git a/notebooks/updated.txt b/notebooks/updated.txt new file mode 100644 index 0000000..a67d564 --- /dev/null +++ b/notebooks/updated.txt @@ -0,0 +1,7 @@ +Updated notebooks: + +Run_CellRangerVdj.ipynb +Run_CellRangerGex.ipynv +Run_CellRangerAtac.ipynb +Run_FastQC.ipynb +utils/utils.py \ No newline at end of file diff --git a/notebooks/utils/utils.py b/notebooks/utils/utils.py index 9b4d345..72ae677 100644 --- a/notebooks/utils/utils.py +++ b/notebooks/utils/utils.py @@ -185,8 +185,9 @@ def get_reference(query, query_col, creds): 'CiteSeq': ['R1','R2'], 'AsapSeq': ['R1','R2','R3'], 'CellRangerATAC': ['I1','R1','R2','R3'], + 'CellRangerArc': ['I1','R1','R2','R3'], 'CellRangerGex': ['I1','R1','R2'], - 'MitoTracing': ['R1', 'R2'] + 'MitoTracing': ['R1', 'R2'], } @@ -276,18 +277,264 @@ def get_all_fastqs( def update_ref(samples, prefix): for sample, row in samples.iterrows(): - if prefix.startswith('CellRanger'): + species = row['species'] + + if not row['reference']: + if species in ['human', 'mouse']: + samples.loc[sample, 'reference'] = reference_map[prefix][row['species']] + + elif prefix.startswith('CellRanger'): if not row['reference'].startswith('https'): - species = row['species'] + if not species in ['human', 'mouse']: print(f'{species} reference not in database. Manually change "reference" field') samples.loc[sample, 'reference'] = np.nan else: samples.loc[sample, 'reference'] = reference_map[prefix][row['species']] + return samples + +########## SHARP functions ########## + +# Priority of GEX data if multiple outputs are found in db +sharp_wl_priority_map = { + m: ["SEQC", "CR_GEX"] for m in ["Hashtag", "CiteSeq"] + } +# File patterns to search for in S3 for each accompanying pipeline +sharp_wl_pattern_map = { + "SEQC": "_dense.csv$", + "CR_GEX": "/filtered_feature_bc_matrix/barcodes.tsv.gz$", + "CR_ATAC": "/filtered_peak_bc_matrix/barcodes.tsv" +} +sharp_wl_method_map = { + "SEQC": "SeqcDenseCountsMatrixCsv", + "CR_GEX": "10x", + "CR_ATAC": "10x", +} +# Names of FASTQ inputs in WDL; order is same as fastq_file_ids +# TODO: Ask to change all inputs to "fastq{file_id}" or "uriFastq{file_id}" +sharp_fastq_inputs_map = { + m: ["uriFastqR1", "uriFastqR2"] for m in ["Hashtag", "CiteSeq"] +} + +# Get s3 path of existing GEX analysis files +from mysql.connector import connect, Error + +def get_wl_dir(sample_id, creds): + + user = creds['user'] + password = creds['password'] + + try: + table_sample_data = "peer_lab_db.sample_data" + table_stats_data = "peer_lab_db.stats_data" + table_stats_data = "peer_lab_db.stats_data" + table_hashtag_lib = "peer_lab_db.hashtag_lib" + table_genome_index = "peer_lab_db.genome_index" + table_sc_tech = "peer_lab_db.sc_tech" + query = f""" + SELECT {table_stats_data}.analysis_storage + FROM {table_sample_data} + LEFT JOIN {table_stats_data} + ON {table_stats_data}.sampleData_id = {table_sample_data}.id + LEFT JOIN {table_hashtag_lib} + ON {table_hashtag_lib}.sampleData_id = {table_sample_data}.id + LEFT JOIN {table_genome_index} + ON {table_genome_index}.id = {table_hashtag_lib}.genomeIndex_id + LEFT JOIN {table_sc_tech} + ON {table_sc_tech}.id = {table_genome_index}.scTech_id + WHERE {table_sample_data}.id = {sample_id} + """ + result = execute_query(query, creds)[0][0] + if result: + return result + # As backup, get AWS storage location directly from sample_data + else: + query = f""" + SELECT AWS_storage + FROM {table_sample_data} + WHERE {table_sample_data}.id = {sample_id} + """ + result = execute_query(query, creds)[0][0] + return result + except Error as e: + print(f"Error: {e}") + +# Get white list method and associated file +# Throws exception if no white list exists +def get_wl_params( + sample_id: str, + creds, + prefix, + wl_dir +): + + user = creds['user'] + password = creds['password'] + + wl_params = dict() + + # wl_dir = get_wl_dir(sample_id, creds) + wl_patterns = [sharp_wl_pattern_map[p] for p in sharp_wl_priority_map[prefix]] + + try: + # Check white list file exists before loading info from database + assert wl_dir, f"Empty analysis storage for sample id {sample_id}" + _, bucket, key, _, _ = urllib.parse.urlsplit(wl_dir) + # White list file and method is first entry found on S3 + wl = pd.DataFrame( + [get_s3_objects(bucket, key.strip("/"), re.compile(p)) for p in wl_patterns], + index = sharp_wl_priority_map[prefix], + ).dropna(how="all") + try: + wl_key = wl.iloc[0,0] # if empty, missing white list file + wl_params["uri"] = os.path.join("s3://", bucket, wl_key) + wl_params["method"] = sharp_wl_method_map[wl.index[0]] + except IndexError: + logging.error( + "Path to barcodes or counts matrix of GEX data is missing!" + ) + return + + except AssertionError: + logging.warning(f"Path to GEX output results is missing for {sample_id}!") + return + + return wl_params + + +def get_bc_params( + sample_id, + creds, +): + user = creds['user'] + password = creds['password'] + + bc_params = dict() + + # JSON of bc and UMI positions are stored in database + # First check dense matrix exists before loading JSON from database + bc_json = get_bc_json(sample_id, creds) + bc_pos = json.loads(bc_json) + bc_params["cb"] = bc_pos["cellbarcode"] + bc_params["umi"] = bc_params["cb"] + bc_pos["UMIs"] + + # Get bc sequence data from database + bcs = get_bcs(sample_id, creds) + if not bcs: + logging.warning(f"Barcodes data Empty:\n\t {db_connect.cur.statement}") + return + for bc in bcs: + try: + assert bc[0], "AssertionError: Missing sequence barcodes!" + assert bc[1], "AssertionError: Missing barcode IDs" + except AssertionError as err: + logging.warning(f"{err}:\n\t {db_connect.cur.statement}") + return + + barcodes = pd.DataFrame(bcs, columns=["sequence", "code", "label", "bp_shift"]) + conjugation = barcodes["code"].str.get(0) + if conjugation.nunique() != 1: + logging.warning( + f"Sample has multiple hashtag barcode categories and will not be processed!" + ) + return + else: + bc_params["conjugation"] = conjugation.values[0] + + if barcodes["bp_shift"].nunique() != 1: + logging.warning( + f"Sample {sample_id} has hashtag barcode categories, with bp-shift length/s " + f"{barcodes['bp_shift'].unique()}, and will not be processed!" + ) + return + else: + bc_params["bp_shift"] = int(barcodes["bp_shift"][0]) + bc_params["seq_length"] = bc_params["bp_shift"] + barcodes["sequence"].apply(len).max() + + return bc_params + + +# Get bc sequence data from database +def get_bcs(sample_id, creds): + user = creds['user'] + password = creds['password'] + + try: + table_sample_data = "peer_lab_db.sample_data" + table_hashtag_barcodes = "peer_lab_db.hashtag_barcodes" + table_hashtags = "peer_lab_db.hashtags" + query = f""" + SELECT barcode_sequence, concat(substring(category, -1), barcode), + demultiplex_label, bp_shift FROM {table_hashtags} + LEFT JOIN {table_hashtag_barcodes} + ON {table_hashtag_barcodes}.id = {table_hashtags}.hashtagBarcodes_id + WHERE {table_hashtags}.sampleData_id = {sample_id} + """ + result = execute_query(query, creds) + return result + except Error as e: + print(f"Error: {e}") + +# Get bc and UMI positions from database stored in JSON format +def get_bc_json(sample_id, creds): + + user = creds['user'] + password = creds['password'] + + try: + table_sample_data = "peer_lab_db.sample_data" + table_stats_data = "peer_lab_db.stats_data" + table_stats_data = "peer_lab_db.stats_data" + table_hashtag_lib = "peer_lab_db.hashtag_lib" + table_genome_index = "peer_lab_db.genome_index" + table_sc_tech = "peer_lab_db.sc_tech" + query = f""" + SELECT barcodes + FROM {table_sample_data} + LEFT JOIN {table_stats_data} + ON {table_stats_data}.sampleData_id = {table_sample_data}.id + LEFT JOIN {table_hashtag_lib} + ON {table_hashtag_lib}.sampleData_id = {table_sample_data}.id + LEFT JOIN {table_genome_index} + ON {table_genome_index}.id = {table_hashtag_lib}.genomeIndex_id + LEFT JOIN {table_sc_tech} + ON {table_sc_tech}.id = {table_genome_index}.scTech_id + WHERE {table_sample_data}.id = {sample_id} + """ + result = execute_query(query, creds)[0][0] + return result + except Error as e: + print(f"Error: {e}") + +# Get fastq file paths on S3 for each file id +# Returns dictionary from id to s3 path +# Throws exception if FASTQs don't exist for any id +def get_denseCountMatrix( + path: str, # path to directory containing FASTQ files +): + _, bucket, key, _, _ = urllib.parse.urlsplit(path) + results = get_s3_objects( + bucket, key.lstrip("/"), + re.compile(f"_dense.csv$") + ) + whitelist = [] + for result in results: + whitelist.append(os.path.join("s3://", bucket, result)) + whitelist.sort() + return whitelist + + +# Function to reformat barcode labels for Sharp +def reformat_bc_label(label): + label = label.encode('ascii', 'namereplace').decode() + label = label.replace("\\N", "").replace(" ", "_") + return label + + ########## Misc functions ########## # Extract FASTQ sample name from list of files @@ -351,4 +598,23 @@ def get_mito_whitelist( for result in results: whitelist.append(os.path.join("s3://", bucket, result)) whitelist.sort() - return whitelist \ No newline at end of file + return whitelist + + +# Get fastq file paths on S3 for each file id +# Returns dictionary from id to s3 path +# Throws exception if FASTQs don't exist for any id +def get_aws_file( + path: str, # path to directory containing FASTQ files + file_end: str # Extension of the file +): + _, bucket, key, _, _ = urllib.parse.urlsplit(path) + results = get_s3_objects( + bucket, key.lstrip("/"), + re.compile(f".{file_end}$") + ) + whitelist = [] + for result in results: + whitelist.append(os.path.join("s3://", bucket, result)) + whitelist.sort() + return whitelist